aboutsummaryrefslogtreecommitdiff
path: root/src/ext
diff options
context:
space:
mode:
Diffstat (limited to 'src/ext')
-rw-r--r--src/ext/Bal/Bal.wixext.sln319
-rw-r--r--src/ext/Bal/CSharp.Build.props13
-rw-r--r--src/ext/Bal/Cpp.Build.props94
-rw-r--r--src/ext/Bal/Custom.Build.props11
-rw-r--r--src/ext/Bal/CustomizedNativeRecommendedRules.ruleset8
-rw-r--r--src/ext/Bal/Directory.Build.props29
-rw-r--r--src/ext/Bal/Directory.Build.targets56
-rw-r--r--src/ext/Bal/README.md2
-rw-r--r--src/ext/Bal/Samples/bafunctions/Readme.txt85
-rw-r--r--src/ext/Bal/Samples/bafunctions/WixSampleBAFunctions.cpp95
-rw-r--r--src/ext/Bal/Samples/bafunctions/bafunctions.cpp46
-rw-r--r--src/ext/Bal/Samples/bafunctions/bafunctions.def6
-rw-r--r--src/ext/Bal/Samples/bafunctions/bafunctions.vcxproj81
-rw-r--r--src/ext/Bal/Samples/bafunctions/packages.config7
-rw-r--r--src/ext/Bal/Samples/bafunctions/precomp.h52
-rw-r--r--src/ext/Bal/Samples/bafunctions/resource.h15
-rw-r--r--src/ext/Bal/WixToolset.Dnc.Host/BootstrapperApplicationFactory.cs89
-rw-r--r--src/ext/Bal/WixToolset.Dnc.Host/DnchostAssemblyLoadContext.cs58
-rw-r--r--src/ext/Bal/WixToolset.Dnc.Host/Exceptions.cs145
-rw-r--r--src/ext/Bal/WixToolset.Dnc.Host/IBootstrapperApplicationFactory.cs16
-rw-r--r--src/ext/Bal/WixToolset.Dnc.Host/NativeMethods.cs18
-rw-r--r--src/ext/Bal/WixToolset.Dnc.Host/WixToolset.Dnc.Host.csproj44
-rw-r--r--src/ext/Bal/WixToolset.Mba.Host/BootstrapperApplicationFactory.cs86
-rw-r--r--src/ext/Bal/WixToolset.Mba.Host/BootstrapperSectionGroup.cs29
-rw-r--r--src/ext/Bal/WixToolset.Mba.Host/Exceptions.cs145
-rw-r--r--src/ext/Bal/WixToolset.Mba.Host/HostSection.cs47
-rw-r--r--src/ext/Bal/WixToolset.Mba.Host/NativeMethods.cs18
-rw-r--r--src/ext/Bal/WixToolset.Mba.Host/SupportedFrameworkElement.cs47
-rw-r--r--src/ext/Bal/WixToolset.Mba.Host/SupportedFrameworkElementCollection.cs36
-rw-r--r--src/ext/Bal/WixToolset.Mba.Host/WixToolset.Mba.Host.config26
-rw-r--r--src/ext/Bal/WixToolset.Mba.Host/WixToolset.Mba.Host.csproj54
-rw-r--r--src/ext/Bal/WixToolset.Mba.Host/WixToolset.Mba.Host.nuspec23
-rw-r--r--src/ext/Bal/appveyor.cmd17
-rw-r--r--src/ext/Bal/appveyor.yml40
-rw-r--r--src/ext/Bal/dnchost/coreclrhost.h137
-rw-r--r--src/ext/Bal/dnchost/dnchost.cpp309
-rw-r--r--src/ext/Bal/dnchost/dnchost.def6
-rw-r--r--src/ext/Bal/dnchost/dnchost.h35
-rw-r--r--src/ext/Bal/dnchost/dnchost.vcxproj106
-rw-r--r--src/ext/Bal/dnchost/dncutil.cpp411
-rw-r--r--src/ext/Bal/dnchost/dncutil.h38
-rw-r--r--src/ext/Bal/dnchost/packages.config13
-rw-r--r--src/ext/Bal/dnchost/precomp.cpp3
-rw-r--r--src/ext/Bal/dnchost/precomp.h31
-rw-r--r--src/ext/Bal/mbahost/mbahost.cpp649
-rw-r--r--src/ext/Bal/mbahost/mbahost.def6
-rw-r--r--src/ext/Bal/mbahost/mbahost.vcxproj106
-rw-r--r--src/ext/Bal/mbahost/packages.config10
-rw-r--r--src/ext/Bal/mbahost/precomp.cpp3
-rw-r--r--src/ext/Bal/mbahost/precomp.h25
-rw-r--r--src/ext/Bal/nuget.config19
-rw-r--r--src/ext/Bal/test/WixToolsetTest.Bal/BalExtensionFixture.cs133
-rw-r--r--src/ext/Bal/test/WixToolsetTest.Bal/TestData/MBA/Bundle.wxs12
-rw-r--r--src/ext/Bal/test/WixToolsetTest.Bal/TestData/Overridable/Bundle.wxs13
-rw-r--r--src/ext/Bal/test/WixToolsetTest.Bal/TestData/WixStdBa/Bundle.wxs12
-rw-r--r--src/ext/Bal/test/WixToolsetTest.Bal/TestData/WixStdBa/Data/test.msibin0 -> 32768 bytes
-rw-r--r--src/ext/Bal/test/WixToolsetTest.Bal/TestData/WixStdBa/DisplayInternalUIConditionBundle.wxs12
-rw-r--r--src/ext/Bal/test/WixToolsetTest.Bal/WixToolsetTest.Bal.csproj43
-rw-r--r--src/ext/Bal/test/WixToolsetTest.Bal/WixToolsetTest.Bal.v3.ncrunchproject5
-rw-r--r--src/ext/Bal/test/WixToolsetTest.ManagedHost/DncHostFixture.cs209
-rw-r--r--src/ext/Bal/test/WixToolsetTest.ManagedHost/MbaHostFixture.cs94
-rw-r--r--src/ext/Bal/test/WixToolsetTest.ManagedHost/README.md5
-rw-r--r--src/ext/Bal/test/WixToolsetTest.ManagedHost/TestEngine.cs74
-rw-r--r--src/ext/Bal/test/WixToolsetTest.ManagedHost/TestEngineResult.cs12
-rw-r--r--src/ext/Bal/test/WixToolsetTest.ManagedHost/WixToolsetTest.ManagedHost.csproj25
-rw-r--r--src/ext/Bal/test/examples/Directory.Build.props6
-rw-r--r--src/ext/Bal/test/examples/Directory.Build.targets6
-rw-r--r--src/ext/Bal/test/examples/EarliestCoreBundleFDD/EarliestCoreBundleFDD.wixproj2
-rw-r--r--src/ext/Bal/test/examples/EarliestCoreBundleFDD/FrameworkDependentBundle.wxs16
-rw-r--r--src/ext/Bal/test/examples/EarliestCoreBundleSCD/EarliestCoreBundleSCD.wixproj10
-rw-r--r--src/ext/Bal/test/examples/EarliestCoreBundleSCD/SelfContainedBundle.wxs11
-rw-r--r--src/ext/Bal/test/examples/EarliestCoreBundleSCD/ba.xslt20
-rw-r--r--src/ext/Bal/test/examples/EarliestCoreBundleTrimmedSCD/EarliestCoreBundleTrimmedSCD.wixproj10
-rw-r--r--src/ext/Bal/test/examples/EarliestCoreBundleTrimmedSCD/TrimmedSelfContainedBundle.wxs11
-rw-r--r--src/ext/Bal/test/examples/EarliestCoreBundleTrimmedSCD/ba.xslt20
-rw-r--r--src/ext/Bal/test/examples/EarliestCoreMBA/EarliestCoreBA.cs34
-rw-r--r--src/ext/Bal/test/examples/EarliestCoreMBA/EarliestCoreBAFactory.cs22
-rw-r--r--src/ext/Bal/test/examples/EarliestCoreMBA/Example.EarliestCoreMBA.csproj18
-rw-r--r--src/ext/Bal/test/examples/FullFramework2Bundle/Bundle.wxs14
-rw-r--r--src/ext/Bal/test/examples/FullFramework2Bundle/FullFramework2Bundle.wixproj2
-rw-r--r--src/ext/Bal/test/examples/FullFramework2MBA/Example.FullFramework2MBA.csproj20
-rw-r--r--src/ext/Bal/test/examples/FullFramework2MBA/FullFramework2BA.cs34
-rw-r--r--src/ext/Bal/test/examples/FullFramework2MBA/FullFramework2BAFactory.cs22
-rw-r--r--src/ext/Bal/test/examples/FullFramework2MBA/WixToolset.Mba.Host.config20
-rw-r--r--src/ext/Bal/test/examples/FullFramework4Bundle/Bundle.wxs14
-rw-r--r--src/ext/Bal/test/examples/FullFramework4Bundle/FullFramework4Bundle.wixproj2
-rw-r--r--src/ext/Bal/test/examples/FullFramework4MBA/Example.FullFramework4MBA.csproj19
-rw-r--r--src/ext/Bal/test/examples/FullFramework4MBA/FullFramework4BA.cs34
-rw-r--r--src/ext/Bal/test/examples/FullFramework4MBA/FullFramework4BAFactory.cs22
-rw-r--r--src/ext/Bal/test/examples/FullFramework4MBA/WixToolset.Mba.Host.config17
-rw-r--r--src/ext/Bal/test/examples/LatestCoreBundleFDD/FrameworkDependentBundle.wxs16
-rw-r--r--src/ext/Bal/test/examples/LatestCoreBundleFDD/LatestCoreBundleFDD.wixproj2
-rw-r--r--src/ext/Bal/test/examples/LatestCoreBundleSCD/LatestCoreBundleSCD.wixproj10
-rw-r--r--src/ext/Bal/test/examples/LatestCoreBundleSCD/SelfContainedBundle.wxs11
-rw-r--r--src/ext/Bal/test/examples/LatestCoreBundleSCD/ba.xslt20
-rw-r--r--src/ext/Bal/test/examples/LatestCoreBundleTrimmedSCD/LatestCoreBundleTrimmedSCD.wixproj10
-rw-r--r--src/ext/Bal/test/examples/LatestCoreBundleTrimmedSCD/TrimmedSelfContainedBundle.wxs11
-rw-r--r--src/ext/Bal/test/examples/LatestCoreBundleTrimmedSCD/ba.xslt20
-rw-r--r--src/ext/Bal/test/examples/LatestCoreMBA/Example.LatestCoreMBA.csproj21
-rw-r--r--src/ext/Bal/test/examples/LatestCoreMBA/LatestCoreBA.cs33
-rw-r--r--src/ext/Bal/test/examples/LatestCoreMBA/LatestCoreBAFactory.cs22
-rw-r--r--src/ext/Bal/test/examples/TestEngine/Example.TestEngine.vcxproj83
-rw-r--r--src/ext/Bal/test/examples/TestEngine/ExampleTestEngine.cpp53
-rw-r--r--src/ext/Bal/test/examples/TestEngine/ReloadEngine.cpp55
-rw-r--r--src/ext/Bal/test/examples/TestEngine/ReloadEngine.h8
-rw-r--r--src/ext/Bal/test/examples/TestEngine/ShutdownEngine.cpp38
-rw-r--r--src/ext/Bal/test/examples/TestEngine/ShutdownEngine.h8
-rw-r--r--src/ext/Bal/test/examples/TestEngine/TestEngine.cpp256
-rw-r--r--src/ext/Bal/test/examples/TestEngine/TestEngine.h80
-rw-r--r--src/ext/Bal/test/examples/TestEngine/WaitForQuitEngine.cpp35
-rw-r--r--src/ext/Bal/test/examples/TestEngine/WaitForQuitEngine.h8
-rw-r--r--src/ext/Bal/test/examples/TestEngine/packages.config7
-rw-r--r--src/ext/Bal/test/examples/TestEngine/precomp.cpp3
-rw-r--r--src/ext/Bal/test/examples/TestEngine/precomp.h20
-rw-r--r--src/ext/Bal/test/examples/WPFCoreBundleFDD/FrameworkDependentBundle.wxs16
-rw-r--r--src/ext/Bal/test/examples/WPFCoreBundleFDD/WPFCoreBundleFDD.wixproj2
-rw-r--r--src/ext/Bal/test/examples/WPFCoreMBA/AssemblyInfo.cs12
-rw-r--r--src/ext/Bal/test/examples/WPFCoreMBA/Example.WPFCoreMBA.csproj16
-rw-r--r--src/ext/Bal/test/examples/WPFCoreMBA/MainWindow.xaml16
-rw-r--r--src/ext/Bal/test/examples/WPFCoreMBA/MainWindow.xaml.cs17
-rw-r--r--src/ext/Bal/test/examples/WPFCoreMBA/WPFCoreBA.cs42
-rw-r--r--src/ext/Bal/test/examples/WPFCoreMBA/WPFCoreBAFactory.cs22
-rw-r--r--src/ext/Bal/test/examples/Wix.Build.props10
-rw-r--r--src/ext/Bal/test/examples/Wix.Build.targets8
-rw-r--r--src/ext/Bal/test/examples/examples.proj50
-rw-r--r--src/ext/Bal/wix.snkbin0 -> 596 bytes
-rw-r--r--src/ext/Bal/wixext/BalBurnBackendExtension.cs171
-rw-r--r--src/ext/Bal/wixext/BalCompiler.cs923
-rw-r--r--src/ext/Bal/wixext/BalErrors.cs61
-rw-r--r--src/ext/Bal/wixext/BalExtensionData.cs30
-rw-r--r--src/ext/Bal/wixext/BalExtensionFactory.cs18
-rw-r--r--src/ext/Bal/wixext/BalWarnings.cs31
-rw-r--r--src/ext/Bal/wixext/Symbols/BalSymbolDefinitions.cs80
-rw-r--r--src/ext/Bal/wixext/Symbols/WixBalBAFactoryAssemblySymbol.cs55
-rw-r--r--src/ext/Bal/wixext/Symbols/WixBalBAFunctionsSymbol.cs47
-rw-r--r--src/ext/Bal/wixext/Symbols/WixBalConditionSymbol.cs55
-rw-r--r--src/ext/Bal/wixext/Symbols/WixBalPackageInfoSymbol.cs55
-rw-r--r--src/ext/Bal/wixext/Symbols/WixDncOptionsSymbol.cs47
-rw-r--r--src/ext/Bal/wixext/Symbols/WixMbaPrereqInformationSymbol.cs63
-rw-r--r--src/ext/Bal/wixext/Symbols/WixStdbaOptionsSymbol.cs79
-rw-r--r--src/ext/Bal/wixext/Symbols/WixStdbaOverridableVariableSymbol.cs47
-rw-r--r--src/ext/Bal/wixext/WixToolset.Bal.wixext.csproj39
-rw-r--r--src/ext/Bal/wixext/WixToolset.Bal.wixext.nuspec26
-rw-r--r--src/ext/Bal/wixext/WixToolset.Bal.wixext.targets11
-rw-r--r--src/ext/Bal/wixlib/BalExtension_arm64.wxs7
-rw-r--r--src/ext/Bal/wixlib/BalExtension_platform.wxi69
-rw-r--r--src/ext/Bal/wixlib/BalExtension_x64.wxs7
-rw-r--r--src/ext/Bal/wixlib/BalExtension_x86.wxs7
-rw-r--r--src/ext/Bal/wixlib/Dnc.wxs20
-rw-r--r--src/ext/Bal/wixlib/Mba.wxs43
-rw-r--r--src/ext/Bal/wixlib/bal.wixproj36
-rw-r--r--src/ext/Bal/wixlib/caDecor.wxi39
-rw-r--r--src/ext/Bal/wixlib/wixstdba.wxs92
-rw-r--r--src/ext/Bal/wixstdba/Resources/1028/mbapreq.wxl27
-rw-r--r--src/ext/Bal/wixstdba/Resources/1029/mbapreq.wxl30
-rw-r--r--src/ext/Bal/wixstdba/Resources/1030/mbapreq.wxl30
-rw-r--r--src/ext/Bal/wixstdba/Resources/1031/mbapreq.wxl33
-rw-r--r--src/ext/Bal/wixstdba/Resources/1032/mbapreq.wxl32
-rw-r--r--src/ext/Bal/wixstdba/Resources/1035/mbapreq.wxl30
-rw-r--r--src/ext/Bal/wixstdba/Resources/1036/mbapreq.wxl30
-rw-r--r--src/ext/Bal/wixstdba/Resources/1038/mbapreq.wxl30
-rw-r--r--src/ext/Bal/wixstdba/Resources/1040/mbapreq.wxl31
-rw-r--r--src/ext/Bal/wixstdba/Resources/1041/mbapreq.wxl27
-rw-r--r--src/ext/Bal/wixstdba/Resources/1042/mbapreq.wxl27
-rw-r--r--src/ext/Bal/wixstdba/Resources/1043/mbapreq.wxl30
-rw-r--r--src/ext/Bal/wixstdba/Resources/1044/mbapreq.wxl30
-rw-r--r--src/ext/Bal/wixstdba/Resources/1045/mbapreq.wxl30
-rw-r--r--src/ext/Bal/wixstdba/Resources/1046/mbapreq.wxl29
-rw-r--r--src/ext/Bal/wixstdba/Resources/1049/mbapreq.wxl29
-rw-r--r--src/ext/Bal/wixstdba/Resources/1051/mbapreq.wxl30
-rw-r--r--src/ext/Bal/wixstdba/Resources/1053/mbapreq.wxl30
-rw-r--r--src/ext/Bal/wixstdba/Resources/1055/mbapreq.wxl30
-rw-r--r--src/ext/Bal/wixstdba/Resources/1060/mbapreq.wxl30
-rw-r--r--src/ext/Bal/wixstdba/Resources/2052/mbapreq.wxl27
-rw-r--r--src/ext/Bal/wixstdba/Resources/2070/mbapreq.wxl29
-rw-r--r--src/ext/Bal/wixstdba/Resources/3082/mbapreq.wxl31
-rw-r--r--src/ext/Bal/wixstdba/Resources/HyperlinkLargeTheme.xml109
-rw-r--r--src/ext/Bal/wixstdba/Resources/HyperlinkSidebarTheme.xml120
-rw-r--r--src/ext/Bal/wixstdba/Resources/HyperlinkTheme.wxl61
-rw-r--r--src/ext/Bal/wixstdba/Resources/HyperlinkTheme.xml106
-rw-r--r--src/ext/Bal/wixstdba/Resources/LoremIpsumLicense.rtfbin0 -> 4908 bytes
-rw-r--r--src/ext/Bal/wixstdba/Resources/RtfLargeTheme.xml108
-rw-r--r--src/ext/Bal/wixstdba/Resources/RtfTheme.wxl58
-rw-r--r--src/ext/Bal/wixstdba/Resources/RtfTheme.xml106
-rw-r--r--src/ext/Bal/wixstdba/Resources/dncpreq.thm47
-rw-r--r--src/ext/Bal/wixstdba/Resources/dncpreq.wxl29
-rw-r--r--src/ext/Bal/wixstdba/Resources/logo.pngbin0 -> 852 bytes
-rw-r--r--src/ext/Bal/wixstdba/Resources/logoSide.pngbin0 -> 3477 bytes
-rw-r--r--src/ext/Bal/wixstdba/Resources/mbapreq.pngbin0 -> 797 bytes
-rw-r--r--src/ext/Bal/wixstdba/Resources/mbapreq.thm47
-rw-r--r--src/ext/Bal/wixstdba/Resources/mbapreq.wxl29
-rw-r--r--src/ext/Bal/wixstdba/WixStandardBootstrapperApplication.cpp4264
-rw-r--r--src/ext/Bal/wixstdba/packages.config10
-rw-r--r--src/ext/Bal/wixstdba/precomp.cpp3
-rw-r--r--src/ext/Bal/wixstdba/precomp.h58
-rw-r--r--src/ext/Bal/wixstdba/resource.h15
-rw-r--r--src/ext/Bal/wixstdba/wixstdba.cpp144
-rw-r--r--src/ext/Bal/wixstdba/wixstdba.def10
-rw-r--r--src/ext/Bal/wixstdba/wixstdba.mc73
-rw-r--r--src/ext/Bal/wixstdba/wixstdba.vcxproj101
-rw-r--r--src/ext/ComPlus/CSharp.Build.props11
-rw-r--r--src/ext/ComPlus/ComPlus.wixext.sln64
-rw-r--r--src/ext/ComPlus/Cpp.Build.props88
-rw-r--r--src/ext/ComPlus/Directory.Build.props27
-rw-r--r--src/ext/ComPlus/Directory.Build.targets51
-rw-r--r--src/ext/ComPlus/Directory.csproj.props13
-rw-r--r--src/ext/ComPlus/Directory.csproj.targets26
-rw-r--r--src/ext/ComPlus/Directory.vcxproj.props93
-rw-r--r--src/ext/ComPlus/README.md2
-rw-r--r--src/ext/ComPlus/Wix.Build.props31
-rw-r--r--src/ext/ComPlus/appveyor.cmd22
-rw-r--r--src/ext/ComPlus/appveyor.yml42
-rw-r--r--src/ext/ComPlus/ca/complusca.def15
-rw-r--r--src/ext/ComPlus/ca/complusca.vcxproj95
-rw-r--r--src/ext/ComPlus/ca/cpappexec.cpp344
-rw-r--r--src/ext/ComPlus/ca/cpappexec.h12
-rw-r--r--src/ext/ComPlus/ca/cpapproleexec.cpp720
-rw-r--r--src/ext/ComPlus/ca/cpapproleexec.h20
-rw-r--r--src/ext/ComPlus/ca/cpapprolesched.cpp843
-rw-r--r--src/ext/ComPlus/ca/cpapprolesched.h112
-rw-r--r--src/ext/ComPlus/ca/cpappsched.cpp752
-rw-r--r--src/ext/ComPlus/ca/cpappsched.h83
-rw-r--r--src/ext/ComPlus/ca/cpasmexec.cpp1877
-rw-r--r--src/ext/ComPlus/ca/cpasmexec.h20
-rw-r--r--src/ext/ComPlus/ca/cpasmsched.cpp2135
-rw-r--r--src/ext/ComPlus/ca/cpasmsched.h168
-rw-r--r--src/ext/ComPlus/ca/cpcost.h30
-rw-r--r--src/ext/ComPlus/ca/cpexec.cpp681
-rw-r--r--src/ext/ComPlus/ca/cppartexec.cpp690
-rw-r--r--src/ext/ComPlus/ca/cppartexec.h20
-rw-r--r--src/ext/ComPlus/ca/cppartroleexec.cpp397
-rw-r--r--src/ext/ComPlus/ca/cppartroleexec.h12
-rw-r--r--src/ext/ComPlus/ca/cppartrolesched.cpp421
-rw-r--r--src/ext/ComPlus/ca/cppartrolesched.h76
-rw-r--r--src/ext/ComPlus/ca/cppartsched.cpp912
-rw-r--r--src/ext/ComPlus/ca/cppartsched.h125
-rw-r--r--src/ext/ComPlus/ca/cpsched.cpp566
-rw-r--r--src/ext/ComPlus/ca/cpsubsexec.cpp411
-rw-r--r--src/ext/ComPlus/ca/cpsubsexec.h12
-rw-r--r--src/ext/ComPlus/ca/cpsubssched.cpp606
-rw-r--r--src/ext/ComPlus/ca/cpsubssched.h62
-rw-r--r--src/ext/ComPlus/ca/cputilexec.cpp1881
-rw-r--r--src/ext/ComPlus/ca/cputilexec.h193
-rw-r--r--src/ext/ComPlus/ca/cputilsched.cpp885
-rw-r--r--src/ext/ComPlus/ca/cputilsched.h132
-rw-r--r--src/ext/ComPlus/ca/custommsierrors.h29
-rw-r--r--src/ext/ComPlus/ca/dllmain.cpp27
-rw-r--r--src/ext/ComPlus/ca/packages.config5
-rw-r--r--src/ext/ComPlus/ca/precomp.h33
-rw-r--r--src/ext/ComPlus/nuget.config17
-rw-r--r--src/ext/ComPlus/test/WixToolsetTest.ComPlus/ComPlusExtensionFixture.cs32
-rw-r--r--src/ext/ComPlus/test/WixToolsetTest.ComPlus/TestData/UsingComPlusPartition/Package.en-us.wxl11
-rw-r--r--src/ext/ComPlus/test/WixToolsetTest.ComPlus/TestData/UsingComPlusPartition/Package.wxs15
-rw-r--r--src/ext/ComPlus/test/WixToolsetTest.ComPlus/TestData/UsingComPlusPartition/PackageComponents.wxs12
-rw-r--r--src/ext/ComPlus/test/WixToolsetTest.ComPlus/TestData/UsingComPlusPartition/example.txt1
-rw-r--r--src/ext/ComPlus/test/WixToolsetTest.ComPlus/WixToolsetTest.ComPlus.csproj38
-rw-r--r--src/ext/ComPlus/wix.snkbin0 -> 596 bytes
-rw-r--r--src/ext/ComPlus/wixext/ComPlusCompiler.cs2164
-rw-r--r--src/ext/ComPlus/wixext/ComPlusDecompiler.cs1845
-rw-r--r--src/ext/ComPlus/wixext/ComPlusErrors.cs72
-rw-r--r--src/ext/ComPlus/wixext/ComPlusExtensionData.cs30
-rw-r--r--src/ext/ComPlus/wixext/ComPlusExtensionFactory.cs18
-rw-r--r--src/ext/ComPlus/wixext/ComPlusTableDefinitions.cs360
-rw-r--r--src/ext/ComPlus/wixext/ComPlusWarnings.cs31
-rw-r--r--src/ext/ComPlus/wixext/ComPlusWindowsInstallerBackendBinderExtension.cs13
-rw-r--r--src/ext/ComPlus/wixext/Symbols/ComPlusApplicationPropertySymbol.cs63
-rw-r--r--src/ext/ComPlus/wixext/Symbols/ComPlusApplicationRolePropertySymbol.cs63
-rw-r--r--src/ext/ComPlus/wixext/Symbols/ComPlusApplicationRoleSymbol.cs63
-rw-r--r--src/ext/ComPlus/wixext/Symbols/ComPlusApplicationSymbol.cs71
-rw-r--r--src/ext/ComPlus/wixext/Symbols/ComPlusAssemblyDependencySymbol.cs55
-rw-r--r--src/ext/ComPlus/wixext/Symbols/ComPlusAssemblySymbol.cs95
-rw-r--r--src/ext/ComPlus/wixext/Symbols/ComPlusComponentPropertySymbol.cs63
-rw-r--r--src/ext/ComPlus/wixext/Symbols/ComPlusComponentSymbol.cs55
-rw-r--r--src/ext/ComPlus/wixext/Symbols/ComPlusGroupInApplicationRoleSymbol.cs63
-rw-r--r--src/ext/ComPlus/wixext/Symbols/ComPlusGroupInPartitionRoleSymbol.cs63
-rw-r--r--src/ext/ComPlus/wixext/Symbols/ComPlusInterfacePropertySymbol.cs63
-rw-r--r--src/ext/ComPlus/wixext/Symbols/ComPlusInterfaceSymbol.cs55
-rw-r--r--src/ext/ComPlus/wixext/Symbols/ComPlusMethodPropertySymbol.cs63
-rw-r--r--src/ext/ComPlus/wixext/Symbols/ComPlusMethodSymbol.cs63
-rw-r--r--src/ext/ComPlus/wixext/Symbols/ComPlusPartitionPropertySymbol.cs63
-rw-r--r--src/ext/ComPlus/wixext/Symbols/ComPlusPartitionRoleSymbol.cs63
-rw-r--r--src/ext/ComPlus/wixext/Symbols/ComPlusPartitionSymbol.cs63
-rw-r--r--src/ext/ComPlus/wixext/Symbols/ComPlusPartitionUserSymbol.cs63
-rw-r--r--src/ext/ComPlus/wixext/Symbols/ComPlusRoleForComponentSymbol.cs63
-rw-r--r--src/ext/ComPlus/wixext/Symbols/ComPlusRoleForInterfaceSymbol.cs63
-rw-r--r--src/ext/ComPlus/wixext/Symbols/ComPlusRoleForMethodSymbol.cs63
-rw-r--r--src/ext/ComPlus/wixext/Symbols/ComPlusSubscriptionPropertySymbol.cs63
-rw-r--r--src/ext/ComPlus/wixext/Symbols/ComPlusSubscriptionSymbol.cs95
-rw-r--r--src/ext/ComPlus/wixext/Symbols/ComPlusSymbolDefinitions.cs135
-rw-r--r--src/ext/ComPlus/wixext/Symbols/ComPlusUserInApplicationRoleSymbol.cs63
-rw-r--r--src/ext/ComPlus/wixext/Symbols/ComPlusUserInPartitionRoleSymbol.cs63
-rw-r--r--src/ext/ComPlus/wixext/WixToolset.ComPlus.wixext.csproj32
-rw-r--r--src/ext/ComPlus/wixext/WixToolset.ComPlus.wixext.nuspec24
-rw-r--r--src/ext/ComPlus/wixext/WixToolset.ComPlus.wixext.targets11
-rw-r--r--src/ext/ComPlus/wixlib/ComPlusExtension.wxs135
-rw-r--r--src/ext/ComPlus/wixlib/caerr.wxi96
-rw-r--r--src/ext/ComPlus/wixlib/complus.wixproj26
-rw-r--r--src/ext/ComPlus/wixlib/en-us.wxl71
-rw-r--r--src/ext/ComPlus/wixlib/es-es.wxl72
-rw-r--r--src/ext/ComPlus/wixlib/ja-jp.wxl71
-rw-r--r--src/ext/Dependency/Dependency.wixext.sln61
-rw-r--r--src/ext/Dependency/Directory.Build.props27
-rw-r--r--src/ext/Dependency/Directory.Build.targets51
-rw-r--r--src/ext/Dependency/Directory.csproj.props13
-rw-r--r--src/ext/Dependency/Directory.csproj.targets26
-rw-r--r--src/ext/Dependency/Directory.vcxproj.props93
-rw-r--r--src/ext/Dependency/README.md2
-rw-r--r--src/ext/Dependency/appveyor.cmd19
-rw-r--r--src/ext/Dependency/appveyor.yml42
-rw-r--r--src/ext/Dependency/ca/custommsierrors.h5
-rw-r--r--src/ext/Dependency/ca/dependencyca.vcxproj73
-rw-r--r--src/ext/Dependency/ca/dependencyca.vcxproj.filters36
-rw-r--r--src/ext/Dependency/ca/dllmain.cpp27
-rw-r--r--src/ext/Dependency/ca/precomp.h18
-rw-r--r--src/ext/Dependency/ca/wixdepca.cpp516
-rw-r--r--src/ext/Dependency/ca/wixdepca.def8
-rw-r--r--src/ext/Dependency/nuget.config18
-rw-r--r--src/ext/Dependency/test/WixToolsetTest.Dependency/DependencyExtensionFixture.cs38
-rw-r--r--src/ext/Dependency/test/WixToolsetTest.Dependency/TestData/UsingProvides/Package.en-us.wxl11
-rw-r--r--src/ext/Dependency/test/WixToolsetTest.Dependency/TestData/UsingProvides/Package.wxs21
-rw-r--r--src/ext/Dependency/test/WixToolsetTest.Dependency/WixToolsetTest.Dependency.csproj39
-rw-r--r--src/ext/Dependency/wix.snkbin0 -> 596 bytes
-rw-r--r--src/ext/Dependency/wixext/DependencyCompiler.cs61
-rw-r--r--src/ext/Dependency/wixext/DependencyDecompiler.cs347
-rw-r--r--src/ext/Dependency/wixext/DependencyExtensionData.cs29
-rw-r--r--src/ext/Dependency/wixext/DependencyExtensionFactory.cs17
-rw-r--r--src/ext/Dependency/wixext/WixToolset.Dependency.wixext.csproj32
-rw-r--r--src/ext/Dependency/wixext/WixToolset.Dependency.wixext.nuspec25
-rw-r--r--src/ext/Dependency/wixext/WixToolset.Dependency.wixext.targets11
-rw-r--r--src/ext/Dependency/wixlib/DependencyExtension.wxs21
-rw-r--r--src/ext/Dependency/wixlib/DependencyExtension_Platform.wxi28
-rw-r--r--src/ext/Dependency/wixlib/DependencyExtension_arm64.wxs7
-rw-r--r--src/ext/Dependency/wixlib/DependencyExtension_x64.wxs7
-rw-r--r--src/ext/Dependency/wixlib/DependencyExtension_x86.wxs7
-rw-r--r--src/ext/Dependency/wixlib/caDecor.wxi39
-rw-r--r--src/ext/Dependency/wixlib/caerr.wxi96
-rw-r--r--src/ext/Dependency/wixlib/dependency.wixproj30
-rw-r--r--src/ext/Dependency/wixlib/en-us.wxl7
-rw-r--r--src/ext/DifxApp/CSharp.Build.props11
-rw-r--r--src/ext/DifxApp/DifxApp.wixext.sln63
-rw-r--r--src/ext/DifxApp/Directory.Build.props29
-rw-r--r--src/ext/DifxApp/Directory.Build.targets48
-rw-r--r--src/ext/DifxApp/README.md2
-rw-r--r--src/ext/DifxApp/appveyor.cmd14
-rw-r--r--src/ext/DifxApp/appveyor.yml40
-rw-r--r--src/ext/DifxApp/nuget.config17
-rw-r--r--src/ext/DifxApp/test/WixToolsetTest.DifxApp/DifxAppExtensionFixture.cs36
-rw-r--r--src/ext/DifxApp/test/WixToolsetTest.DifxApp/TestData/UsingDriver/Package.en-us.wxl11
-rw-r--r--src/ext/DifxApp/test/WixToolsetTest.DifxApp/TestData/UsingDriver/Package.wxs15
-rw-r--r--src/ext/DifxApp/test/WixToolsetTest.DifxApp/TestData/UsingDriver/PackageComponents.wxs12
-rw-r--r--src/ext/DifxApp/test/WixToolsetTest.DifxApp/TestData/UsingDriver/example.txt1
-rw-r--r--src/ext/DifxApp/test/WixToolsetTest.DifxApp/WixToolsetTest.DifxApp.csproj41
-rw-r--r--src/ext/DifxApp/wix.snkbin0 -> 596 bytes
-rw-r--r--src/ext/DifxApp/wixext/DifxAppCompiler.cs161
-rw-r--r--src/ext/DifxApp/wixext/DifxAppDecompiler.cs98
-rw-r--r--src/ext/DifxApp/wixext/DifxAppExtensionData.cs23
-rw-r--r--src/ext/DifxApp/wixext/DifxAppExtensionFactory.cs18
-rw-r--r--src/ext/DifxApp/wixext/DifxAppTableDefinitions.cs26
-rw-r--r--src/ext/DifxApp/wixext/DifxAppWindowsInstallerBackendBinderExtension.cs13
-rw-r--r--src/ext/DifxApp/wixext/Symbols/DifxAppSymbolDefinitions.cs39
-rw-r--r--src/ext/DifxApp/wixext/Symbols/MsiDriverPackagesSymbol.cs63
-rw-r--r--src/ext/DifxApp/wixext/WixToolset.DifxApp.wixext.csproj28
-rw-r--r--src/ext/DifxApp/wixext/WixToolset.DifxApp.wixext.targets11
-rw-r--r--src/ext/DifxApp/wixlib/DifxAppExtension_Platform.wxi22
-rw-r--r--src/ext/DifxApp/wixlib/DifxAppExtension_x64.wxs8
-rw-r--r--src/ext/DifxApp/wixlib/DifxAppExtension_x86.wxs8
-rw-r--r--src/ext/DifxApp/wixlib/caSuffix.wxi28
-rw-r--r--src/ext/DifxApp/wixlib/difxapp.wixproj14
-rw-r--r--src/ext/DifxApp/wixlib/x64/DIFxApp.dllbin0 -> 153080 bytes
-rw-r--r--src/ext/DifxApp/wixlib/x64/DIFxAppA.dllbin0 -> 707464 bytes
-rw-r--r--src/ext/DifxApp/wixlib/x86/DIFxApp.dllbin0 -> 122248 bytes
-rw-r--r--src/ext/DifxApp/wixlib/x86/DIFxAppA.dllbin0 -> 364424 bytes
-rw-r--r--src/ext/DirectX/CSharp.Build.props11
-rw-r--r--src/ext/DirectX/Cpp.Build.props86
-rw-r--r--src/ext/DirectX/DirectX.wixext.sln61
-rw-r--r--src/ext/DirectX/Directory.Build.props29
-rw-r--r--src/ext/DirectX/Directory.Build.targets48
-rw-r--r--src/ext/DirectX/README.md2
-rw-r--r--src/ext/DirectX/appveyor.cmd14
-rw-r--r--src/ext/DirectX/appveyor.yml40
-rw-r--r--src/ext/DirectX/ca/directx.cpp49
-rw-r--r--src/ext/DirectX/ca/directx.def7
-rw-r--r--src/ext/DirectX/ca/directxca.vcxproj70
-rw-r--r--src/ext/DirectX/ca/dllmain.cpp26
-rw-r--r--src/ext/DirectX/ca/packages.config5
-rw-r--r--src/ext/DirectX/ca/precomp.h11
-rw-r--r--src/ext/DirectX/nuget.config17
-rw-r--r--src/ext/DirectX/test/WixToolsetTest.DirectX/DirectXExtensionFixture.cs32
-rw-r--r--src/ext/DirectX/test/WixToolsetTest.DirectX/TestData/UsingPixelShaderVersion/Package.en-us.wxl11
-rw-r--r--src/ext/DirectX/test/WixToolsetTest.DirectX/TestData/UsingPixelShaderVersion/Package.wxs15
-rw-r--r--src/ext/DirectX/test/WixToolsetTest.DirectX/TestData/UsingPixelShaderVersion/PackageComponents.wxs11
-rw-r--r--src/ext/DirectX/test/WixToolsetTest.DirectX/TestData/UsingPixelShaderVersion/example.txt1
-rw-r--r--src/ext/DirectX/test/WixToolsetTest.DirectX/WixToolsetTest.DirectX.csproj41
-rw-r--r--src/ext/DirectX/wix.snkbin0 -> 596 bytes
-rw-r--r--src/ext/DirectX/wixext/DirectXDecompiler.cs72
-rw-r--r--src/ext/DirectX/wixext/DirectXExtensionData.cs24
-rw-r--r--src/ext/DirectX/wixext/DirectXExtensionFactory.cs16
-rw-r--r--src/ext/DirectX/wixext/WixToolset.DirectX.wixext.csproj31
-rw-r--r--src/ext/DirectX/wixext/WixToolset.DirectX.wixext.targets11
-rw-r--r--src/ext/DirectX/wixlib/DirectXExtension.wxs33
-rw-r--r--src/ext/DirectX/wixlib/caerr.wxi96
-rw-r--r--src/ext/DirectX/wixlib/directx.wixproj13
-rw-r--r--src/ext/Firewall/CSharp.Build.props11
-rw-r--r--src/ext/Firewall/Cpp.Build.props86
-rw-r--r--src/ext/Firewall/Directory.Build.props29
-rw-r--r--src/ext/Firewall/Directory.Build.targets48
-rw-r--r--src/ext/Firewall/Firewall.wixext.sln73
-rw-r--r--src/ext/Firewall/Firewall.wixext.v3.ncrunchsolution6
-rw-r--r--src/ext/Firewall/README.md2
-rw-r--r--src/ext/Firewall/appveyor.cmd14
-rw-r--r--src/ext/Firewall/appveyor.yml40
-rw-r--r--src/ext/Firewall/ca/CustomMsiErrors.h130
-rw-r--r--src/ext/Firewall/ca/caDecor.h13
-rw-r--r--src/ext/Firewall/ca/cost.h5
-rw-r--r--src/ext/Firewall/ca/dllmain.cpp26
-rw-r--r--src/ext/Firewall/ca/firewall.cpp1085
-rw-r--r--src/ext/Firewall/ca/fwca.def9
-rw-r--r--src/ext/Firewall/ca/fwca.v3.ncrunchproject5
-rw-r--r--src/ext/Firewall/ca/fwca.vcxproj81
-rw-r--r--src/ext/Firewall/ca/packages.config5
-rw-r--r--src/ext/Firewall/ca/precomp.h19
-rw-r--r--src/ext/Firewall/nuget.config18
-rw-r--r--src/ext/Firewall/test/WixToolsetTest.Firewall/FirewallExtensionFixture.cs80
-rw-r--r--src/ext/Firewall/test/WixToolsetTest.Firewall/TestData/UsingFirewall/Package.en-us.wxl11
-rw-r--r--src/ext/Firewall/test/WixToolsetTest.Firewall/TestData/UsingFirewall/Package.wxs15
-rw-r--r--src/ext/Firewall/test/WixToolsetTest.Firewall/TestData/UsingFirewall/PackageComponents.wxs14
-rw-r--r--src/ext/Firewall/test/WixToolsetTest.Firewall/TestData/UsingFirewall/example.txt1
-rw-r--r--src/ext/Firewall/test/WixToolsetTest.Firewall/TestData/UsingOutboundFirewall/Package.en-us.wxl11
-rw-r--r--src/ext/Firewall/test/WixToolsetTest.Firewall/TestData/UsingOutboundFirewall/Package.wxs15
-rw-r--r--src/ext/Firewall/test/WixToolsetTest.Firewall/TestData/UsingOutboundFirewall/PackageComponents.wxs14
-rw-r--r--src/ext/Firewall/test/WixToolsetTest.Firewall/TestData/UsingOutboundFirewall/example.txt1
-rw-r--r--src/ext/Firewall/test/WixToolsetTest.Firewall/WixToolsetTest.Firewall.csproj45
-rw-r--r--src/ext/Firewall/test/WixToolsetTest.Firewall/WixToolsetTest.Firewall.v3.ncrunchproject5
-rw-r--r--src/ext/Firewall/wix.snkbin0 -> 596 bytes
-rw-r--r--src/ext/Firewall/wixext/FirewallCompiler.cs354
-rw-r--r--src/ext/Firewall/wixext/FirewallConstants.cs23
-rw-r--r--src/ext/Firewall/wixext/FirewallDecompiler.cs182
-rw-r--r--src/ext/Firewall/wixext/FirewallErrors.cs36
-rw-r--r--src/ext/Firewall/wixext/FirewallExtensionData.cs23
-rw-r--r--src/ext/Firewall/wixext/FirewallExtensionFactory.cs18
-rw-r--r--src/ext/Firewall/wixext/FirewallTableDefinitions.cs34
-rw-r--r--src/ext/Firewall/wixext/FirewallWindowsInstallerBackendExtension.cs13
-rw-r--r--src/ext/Firewall/wixext/Symbols/FirewallSymbolDefinitions.cs39
-rw-r--r--src/ext/Firewall/wixext/Symbols/WixFirewallExceptionSymbol.cs119
-rw-r--r--src/ext/Firewall/wixext/WixToolset.Firewall.wixext.csproj31
-rw-r--r--src/ext/Firewall/wixext/WixToolset.Firewall.wixext.targets11
-rw-r--r--src/ext/Firewall/wixlib/FirewallExtension.wxs11
-rw-r--r--src/ext/Firewall/wixlib/FirewallExtension_Platform.wxi36
-rw-r--r--src/ext/Firewall/wixlib/FirewallExtension_arm64.wxs7
-rw-r--r--src/ext/Firewall/wixlib/FirewallExtension_x64.wxs7
-rw-r--r--src/ext/Firewall/wixlib/FirewallExtension_x86.wxs7
-rw-r--r--src/ext/Firewall/wixlib/caDecor.wxi39
-rw-r--r--src/ext/Firewall/wixlib/caerr.wxi96
-rw-r--r--src/ext/Firewall/wixlib/en-us.wxl13
-rw-r--r--src/ext/Firewall/wixlib/es-es.wxl12
-rw-r--r--src/ext/Firewall/wixlib/firewall.v3.ncrunchproject5
-rw-r--r--src/ext/Firewall/wixlib/firewall.wixproj26
-rw-r--r--src/ext/Firewall/wixlib/ja-jp.wxl13
-rw-r--r--src/ext/Firewall/wixlib/pl-pl.wxl13
-rw-r--r--src/ext/Http/CSharp.Build.props11
-rw-r--r--src/ext/Http/Cpp.Build.props86
-rw-r--r--src/ext/Http/Directory.Build.props29
-rw-r--r--src/ext/Http/Directory.Build.targets48
-rw-r--r--src/ext/Http/FindLocalWix.props8
-rw-r--r--src/ext/Http/Http.wixext.sln61
-rw-r--r--src/ext/Http/README.md2
-rw-r--r--src/ext/Http/appveyor.cmd14
-rw-r--r--src/ext/Http/appveyor.yml40
-rw-r--r--src/ext/Http/ca/caDecor.h13
-rw-r--r--src/ext/Http/ca/cost.h6
-rw-r--r--src/ext/Http/ca/dllmain.cpp26
-rw-r--r--src/ext/Http/ca/httpca.vcxproj72
-rw-r--r--src/ext/Http/ca/httpca.vcxproj.filters42
-rw-r--r--src/ext/Http/ca/packages.config5
-rw-r--r--src/ext/Http/ca/precomp.h25
-rw-r--r--src/ext/Http/ca/snisslcert.cpp704
-rw-r--r--src/ext/Http/ca/wixhttpca.cpp530
-rw-r--r--src/ext/Http/ca/wixhttpca.def12
-rw-r--r--src/ext/Http/nuget.config17
-rw-r--r--src/ext/Http/test/WixToolsetTest.Http/HttpExtensionFixture.cs57
-rw-r--r--src/ext/Http/test/WixToolsetTest.Http/TestData/SniSsl/Package.en-us.wxl11
-rw-r--r--src/ext/Http/test/WixToolsetTest.Http/TestData/SniSsl/Package.wxs15
-rw-r--r--src/ext/Http/test/WixToolsetTest.Http/TestData/SniSsl/PackageComponents.wxs12
-rw-r--r--src/ext/Http/test/WixToolsetTest.Http/TestData/SniSsl/example.txt1
-rw-r--r--src/ext/Http/test/WixToolsetTest.Http/TestData/UsingUrlReservation/Package.en-us.wxl11
-rw-r--r--src/ext/Http/test/WixToolsetTest.Http/TestData/UsingUrlReservation/Package.wxs15
-rw-r--r--src/ext/Http/test/WixToolsetTest.Http/TestData/UsingUrlReservation/PackageComponents.wxs16
-rw-r--r--src/ext/Http/test/WixToolsetTest.Http/TestData/UsingUrlReservation/example.txt1
-rw-r--r--src/ext/Http/test/WixToolsetTest.Http/WixToolsetTest.Http.csproj38
-rw-r--r--src/ext/Http/wix.snkbin0 -> 596 bytes
-rw-r--r--src/ext/Http/wixext/HttpCompiler.cs383
-rw-r--r--src/ext/Http/wixext/HttpConstants.cs15
-rw-r--r--src/ext/Http/wixext/HttpDecompiler.cs137
-rw-r--r--src/ext/Http/wixext/HttpErrors.cs31
-rw-r--r--src/ext/Http/wixext/HttpExtensionData.cs30
-rw-r--r--src/ext/Http/wixext/HttpExtensionFactory.cs18
-rw-r--r--src/ext/Http/wixext/HttpTableDefinitions.cs60
-rw-r--r--src/ext/Http/wixext/HttpWindowsInstallerBackendBinderExtension.cs13
-rw-r--r--src/ext/Http/wixext/Symbols/HandleExisting.cs14
-rw-r--r--src/ext/Http/wixext/Symbols/HttpSymbolDefinitions.cs47
-rw-r--r--src/ext/Http/wixext/Symbols/WixHttpSniSslCertSymbol.cs95
-rw-r--r--src/ext/Http/wixext/Symbols/WixHttpUrlAceSymbol.cs63
-rw-r--r--src/ext/Http/wixext/Symbols/WixHttpUrlReservationSymbol.cs71
-rw-r--r--src/ext/Http/wixext/WixToolset.Http.wixext.csproj31
-rw-r--r--src/ext/Http/wixext/WixToolset.Http.wixext.targets11
-rw-r--r--src/ext/Http/wixlib/HttpExtension.wxs10
-rw-r--r--src/ext/Http/wixlib/HttpExtension_Platform.wxi64
-rw-r--r--src/ext/Http/wixlib/HttpExtension_arm64.wxs7
-rw-r--r--src/ext/Http/wixlib/HttpExtension_x64.wxs7
-rw-r--r--src/ext/Http/wixlib/HttpExtension_x86.wxs7
-rw-r--r--src/ext/Http/wixlib/caDecor.wxi39
-rw-r--r--src/ext/Http/wixlib/caerr.wxi96
-rw-r--r--src/ext/Http/wixlib/en-us.wxl17
-rw-r--r--src/ext/Http/wixlib/http.wixproj24
-rw-r--r--src/ext/Iis/CSharp.Build.props11
-rw-r--r--src/ext/Iis/Cpp.Build.props86
-rw-r--r--src/ext/Iis/Directory.Build.props29
-rw-r--r--src/ext/Iis/Directory.Build.targets48
-rw-r--r--src/ext/Iis/Iis.wixext.sln58
-rw-r--r--src/ext/Iis/README.md2
-rw-r--r--src/ext/Iis/appveyor.cmd14
-rw-r--r--src/ext/Iis/appveyor.yml40
-rw-r--r--src/ext/Iis/ca/CustomMsiErrors.h48
-rw-r--r--src/ext/Iis/ca/caDecor.h13
-rw-r--r--src/ext/Iis/ca/dllmain.cpp26
-rw-r--r--src/ext/Iis/ca/iisca.cpp3
-rw-r--r--src/ext/Iis/ca/iisca.def30
-rw-r--r--src/ext/Iis/ca/iisca.vcxproj147
-rw-r--r--src/ext/Iis/ca/packages.config5
-rw-r--r--src/ext/Iis/ca/precomp.h66
-rw-r--r--src/ext/Iis/ca/sca.h124
-rw-r--r--src/ext/Iis/ca/scaapppool.cpp594
-rw-r--r--src/ext/Iis/ca/scaapppool.h88
-rw-r--r--src/ext/Iis/ca/scaapppool7.cpp401
-rw-r--r--src/ext/Iis/ca/scaapppool7.h36
-rw-r--r--src/ext/Iis/ca/scacert.cpp1482
-rw-r--r--src/ext/Iis/ca/scacert.h23
-rw-r--r--src/ext/Iis/ca/scacertexec.cpp431
-rw-r--r--src/ext/Iis/ca/scacost.h15
-rw-r--r--src/ext/Iis/ca/scaexec.cpp1184
-rw-r--r--src/ext/Iis/ca/scaexecIIS7.cpp4205
-rw-r--r--src/ext/Iis/ca/scaexecIIS7.h5
-rw-r--r--src/ext/Iis/ca/scafilter.cpp510
-rw-r--r--src/ext/Iis/ca/scafilter.h46
-rw-r--r--src/ext/Iis/ca/scafilter7.cpp284
-rw-r--r--src/ext/Iis/ca/scafilter7.h21
-rw-r--r--src/ext/Iis/ca/scahttpheader.cpp323
-rw-r--r--src/ext/Iis/ca/scahttpheader.h40
-rw-r--r--src/ext/Iis/ca/scahttpheader7.cpp130
-rw-r--r--src/ext/Iis/ca/scahttpheader7.h15
-rw-r--r--src/ext/Iis/ca/scaiis.cpp481
-rw-r--r--src/ext/Iis/ca/scaiis.h33
-rw-r--r--src/ext/Iis/ca/scaiis7.cpp74
-rw-r--r--src/ext/Iis/ca/scaiis7.h17
-rw-r--r--src/ext/Iis/ca/scamimemap.cpp200
-rw-r--r--src/ext/Iis/ca/scamimemap.h33
-rw-r--r--src/ext/Iis/ca/scamimemap7.cpp68
-rw-r--r--src/ext/Iis/ca/scamimemap7.h10
-rw-r--r--src/ext/Iis/ca/scaproperty.cpp252
-rw-r--r--src/ext/Iis/ca/scaproperty.h54
-rw-r--r--src/ext/Iis/ca/scaproperty7.cpp108
-rw-r--r--src/ext/Iis/ca/scaproperty7.h26
-rw-r--r--src/ext/Iis/ca/scasched.cpp823
-rw-r--r--src/ext/Iis/ca/scassl.cpp115
-rw-r--r--src/ext/Iis/ca/scassl.h36
-rw-r--r--src/ext/Iis/ca/scassl7.cpp34
-rw-r--r--src/ext/Iis/ca/scassl7.h8
-rw-r--r--src/ext/Iis/ca/scauser.cpp91
-rw-r--r--src/ext/Iis/ca/scauser.h39
-rw-r--r--src/ext/Iis/ca/scavdir.cpp331
-rw-r--r--src/ext/Iis/ca/scavdir.h71
-rw-r--r--src/ext/Iis/ca/scavdir7.cpp380
-rw-r--r--src/ext/Iis/ca/scavdir7.h66
-rw-r--r--src/ext/Iis/ca/scaweb.cpp1187
-rw-r--r--src/ext/Iis/ca/scaweb.h123
-rw-r--r--src/ext/Iis/ca/scaweb7.cpp953
-rw-r--r--src/ext/Iis/ca/scaweb7.h97
-rw-r--r--src/ext/Iis/ca/scawebapp.cpp194
-rw-r--r--src/ext/Iis/ca/scawebapp.h42
-rw-r--r--src/ext/Iis/ca/scawebapp7.cpp120
-rw-r--r--src/ext/Iis/ca/scawebapp7.h10
-rw-r--r--src/ext/Iis/ca/scawebappext.cpp207
-rw-r--r--src/ext/Iis/ca/scawebappext.h32
-rw-r--r--src/ext/Iis/ca/scawebappext7.cpp61
-rw-r--r--src/ext/Iis/ca/scawebappext7.h9
-rw-r--r--src/ext/Iis/ca/scawebdir.cpp241
-rw-r--r--src/ext/Iis/ca/scawebdir.h57
-rw-r--r--src/ext/Iis/ca/scawebdir7.cpp219
-rw-r--r--src/ext/Iis/ca/scawebdir7.h51
-rw-r--r--src/ext/Iis/ca/scaweberr.cpp371
-rw-r--r--src/ext/Iis/ca/scaweberr.h30
-rw-r--r--src/ext/Iis/ca/scaweberr7.cpp88
-rw-r--r--src/ext/Iis/ca/scaweberr7.h10
-rw-r--r--src/ext/Iis/ca/scaweblog.cpp177
-rw-r--r--src/ext/Iis/ca/scaweblog.h27
-rw-r--r--src/ext/Iis/ca/scaweblog7.cpp120
-rw-r--r--src/ext/Iis/ca/scaweblog7.h14
-rw-r--r--src/ext/Iis/ca/scawebprop.cpp301
-rw-r--r--src/ext/Iis/ca/scawebprop.h60
-rw-r--r--src/ext/Iis/ca/scawebprop7.cpp155
-rw-r--r--src/ext/Iis/ca/scawebprop7.h12
-rw-r--r--src/ext/Iis/ca/scawebsvcext.cpp343
-rw-r--r--src/ext/Iis/ca/scawebsvcext.h35
-rw-r--r--src/ext/Iis/ca/scawebsvcext7.cpp106
-rw-r--r--src/ext/Iis/ca/scawebsvcext7.h8
-rw-r--r--src/ext/Iis/nuget.config17
-rw-r--r--src/ext/Iis/test/WixToolsetTest.Iis/IisExtensionFixture.cs32
-rw-r--r--src/ext/Iis/test/WixToolsetTest.Iis/TestData/UsingIis/Package.en-us.wxl11
-rw-r--r--src/ext/Iis/test/WixToolsetTest.Iis/TestData/UsingIis/Package.wxs17
-rw-r--r--src/ext/Iis/test/WixToolsetTest.Iis/TestData/UsingIis/PackageComponents.wxs16
-rw-r--r--src/ext/Iis/test/WixToolsetTest.Iis/TestData/UsingIis/example.txt1
-rw-r--r--src/ext/Iis/test/WixToolsetTest.Iis/WixToolsetTest.Iis.csproj41
-rw-r--r--src/ext/Iis/test/WixToolsetTest.Iis/WixToolsetTest.Iis.v3.ncrunchproject5
-rw-r--r--src/ext/Iis/wix.snkbin0 -> 596 bytes
-rw-r--r--src/ext/Iis/wixext/IIsCompiler.cs2620
-rw-r--r--src/ext/Iis/wixext/IIsDecompiler.cs1549
-rw-r--r--src/ext/Iis/wixext/IIsExtensionData.cs30
-rw-r--r--src/ext/Iis/wixext/IisErrors.cs78
-rw-r--r--src/ext/Iis/wixext/IisExtensionFactory.cs18
-rw-r--r--src/ext/Iis/wixext/IisTableDefinitions.cs324
-rw-r--r--src/ext/Iis/wixext/IisWindowsInstallerBackendBinderExtension.cs13
-rw-r--r--src/ext/Iis/wixext/Symbols/CertificateHashSymbol.cs55
-rw-r--r--src/ext/Iis/wixext/Symbols/CertificateSymbol.cs103
-rw-r--r--src/ext/Iis/wixext/Symbols/IIsAppPoolSymbol.cs159
-rw-r--r--src/ext/Iis/wixext/Symbols/IIsFilterSymbol.cs95
-rw-r--r--src/ext/Iis/wixext/Symbols/IIsHttpHeaderSymbol.cs95
-rw-r--r--src/ext/Iis/wixext/Symbols/IIsMimeMapSymbol.cs71
-rw-r--r--src/ext/Iis/wixext/Symbols/IIsPropertySymbol.cs63
-rw-r--r--src/ext/Iis/wixext/Symbols/IIsWebAddressSymbol.cs79
-rw-r--r--src/ext/Iis/wixext/Symbols/IIsWebApplicationExtensionSymbol.cs79
-rw-r--r--src/ext/Iis/wixext/Symbols/IIsWebApplicationSymbol.cs127
-rw-r--r--src/ext/Iis/wixext/Symbols/IIsWebDirPropertiesSymbol.cs151
-rw-r--r--src/ext/Iis/wixext/Symbols/IIsWebDirSymbol.cs79
-rw-r--r--src/ext/Iis/wixext/Symbols/IIsWebErrorSymbol.cs87
-rw-r--r--src/ext/Iis/wixext/Symbols/IIsWebLogSymbol.cs47
-rw-r--r--src/ext/Iis/wixext/Symbols/IIsWebServiceExtensionSymbol.cs79
-rw-r--r--src/ext/Iis/wixext/Symbols/IIsWebSiteCertificatesSymbol.cs55
-rw-r--r--src/ext/Iis/wixext/Symbols/IIsWebSiteSymbol.cs135
-rw-r--r--src/ext/Iis/wixext/Symbols/IIsWebVirtualDirSymbol.cs87
-rw-r--r--src/ext/Iis/wixext/Symbols/IisSymbolDefinitions.cs107
-rw-r--r--src/ext/Iis/wixext/WixToolset.Iis.wixext.csproj31
-rw-r--r--src/ext/Iis/wixext/WixToolset.Iis.wixext.targets11
-rw-r--r--src/ext/Iis/wixlib/IIsExtension.wxs58
-rw-r--r--src/ext/Iis/wixlib/IIsExtension_Platform.wxi66
-rw-r--r--src/ext/Iis/wixlib/IIsExtension_arm64.wxs7
-rw-r--r--src/ext/Iis/wixlib/IIsExtension_x64.wxs7
-rw-r--r--src/ext/Iis/wixlib/IIsExtension_x86.wxs7
-rw-r--r--src/ext/Iis/wixlib/caDecor.wxi39
-rw-r--r--src/ext/Iis/wixlib/caerr.wxi96
-rw-r--r--src/ext/Iis/wixlib/de-de.wxl55
-rw-r--r--src/ext/Iis/wixlib/en-us.wxl55
-rw-r--r--src/ext/Iis/wixlib/iis.v3.ncrunchproject5
-rw-r--r--src/ext/Iis/wixlib/iis.wixproj26
-rw-r--r--src/ext/Iis/wixlib/ja-jp.wxl47
-rw-r--r--src/ext/Iis/wixlib/pt-br.wxl50
-rw-r--r--src/ext/NetFx/CustomizedNativeRecommendedRules.ruleset8
-rw-r--r--src/ext/NetFx/Directory.Build.props27
-rw-r--r--src/ext/NetFx/Directory.Build.targets51
-rw-r--r--src/ext/NetFx/Directory.csproj.props13
-rw-r--r--src/ext/NetFx/Directory.csproj.targets26
-rw-r--r--src/ext/NetFx/Directory.vcxproj.props115
-rw-r--r--src/ext/NetFx/NetFx.wixext.sln75
-rw-r--r--src/ext/NetFx/README.md2
-rw-r--r--src/ext/NetFx/appveyor.cmd19
-rw-r--r--src/ext/NetFx/appveyor.yml42
-rw-r--r--src/ext/NetFx/ca/caDecor.h13
-rw-r--r--src/ext/NetFx/ca/cost.h7
-rw-r--r--src/ext/NetFx/ca/dllmain.cpp26
-rw-r--r--src/ext/NetFx/ca/netfxca.cpp823
-rw-r--r--src/ext/NetFx/ca/netfxca.def8
-rw-r--r--src/ext/NetFx/ca/netfxca.vcxproj73
-rw-r--r--src/ext/NetFx/ca/precomp.h14
-rw-r--r--src/ext/NetFx/nuget.config19
-rw-r--r--src/ext/NetFx/test/WixToolsetTest.Netfx/NetfxExtensionFixture.cs147
-rw-r--r--src/ext/NetFx/test/WixToolsetTest.Netfx/TestData/UsingDotNetCorePackages/BundleLatest.wxs12
-rw-r--r--src/ext/NetFx/test/WixToolsetTest.Netfx/TestData/UsingDotNetCorePackages/BundleLatest_x64.wxs12
-rw-r--r--src/ext/NetFx/test/WixToolsetTest.Netfx/TestData/UsingNativeImage/Package.en-us.wxl9
-rw-r--r--src/ext/NetFx/test/WixToolsetTest.Netfx/TestData/UsingNativeImage/Package.wxs15
-rw-r--r--src/ext/NetFx/test/WixToolsetTest.Netfx/TestData/UsingNativeImage/PackageComponents.wxs11
-rw-r--r--src/ext/NetFx/test/WixToolsetTest.Netfx/TestData/UsingNativeImage/example.txt1
-rw-r--r--src/ext/NetFx/test/WixToolsetTest.Netfx/WixToolsetTest.Netfx.csproj40
-rw-r--r--src/ext/NetFx/test/WixToolsetTest.Netfx/WixToolsetTest.Netfx.v3.ncrunchproject5
-rw-r--r--src/ext/NetFx/wix.snkbin0 -> 596 bytes
-rw-r--r--src/ext/NetFx/wixext/NetFxCompiler.cs163
-rw-r--r--src/ext/NetFx/wixext/NetFxDecompiler.cs139
-rw-r--r--src/ext/NetFx/wixext/NetFxExtensionData.cs25
-rw-r--r--src/ext/NetFx/wixext/NetfxExtensionFactory.cs18
-rw-r--r--src/ext/NetFx/wixext/NetfxTableDefinitions.cs30
-rw-r--r--src/ext/NetFx/wixext/NetfxWindowsInstallerBackendExtension.cs13
-rw-r--r--src/ext/NetFx/wixext/Symbols/NetFxNativeImageSymbol.cs58
-rw-r--r--src/ext/NetFx/wixext/Symbols/NetfxSymbolDefinitions.cs26
-rw-r--r--src/ext/NetFx/wixext/WixToolset.Netfx.wixext.csproj31
-rw-r--r--src/ext/NetFx/wixext/WixToolset.Netfx.wixext.nuspec25
-rw-r--r--src/ext/NetFx/wixext/WixToolset.Netfx.wixext.targets11
-rw-r--r--src/ext/NetFx/wixext/WixToolset.Netfx.wixext.v3.ncrunchproject7
-rw-r--r--src/ext/NetFx/wixlib/NetCore3.1.12_x64.wxs58
-rw-r--r--src/ext/NetFx/wixlib/NetCore3.1.12_x86.wxs58
-rw-r--r--src/ext/NetFx/wixlib/NetCore3.1_x64.wxs22
-rw-r--r--src/ext/NetFx/wixlib/NetCore3.1_x86.wxs22
-rw-r--r--src/ext/NetFx/wixlib/NetCore3_Platform.wxi65
-rw-r--r--src/ext/NetFx/wixlib/NetCoreShared.wxs11
-rw-r--r--src/ext/NetFx/wixlib/NetFx1.1.wxs191
-rw-r--r--src/ext/NetFx/wixlib/NetFx1.wxs30
-rw-r--r--src/ext/NetFx/wixlib/NetFx2.wxs200
-rw-r--r--src/ext/NetFx/wixlib/NetFx3.5.wxs234
-rw-r--r--src/ext/NetFx/wixlib/NetFx3.wxs194
-rw-r--r--src/ext/NetFx/wixlib/NetFx4.5.wxs198
-rw-r--r--src/ext/NetFx/wixlib/NetFx4.wxs416
-rw-r--r--src/ext/NetFx/wixlib/NetFx451.wxs26
-rw-r--r--src/ext/NetFx/wixlib/NetFx452.wxs69
-rw-r--r--src/ext/NetFx/wixlib/NetFx46.wxs70
-rw-r--r--src/ext/NetFx/wixlib/NetFx461.wxs69
-rw-r--r--src/ext/NetFx/wixlib/NetFx462.wxs69
-rw-r--r--src/ext/NetFx/wixlib/NetFx47.wxs20
-rw-r--r--src/ext/NetFx/wixlib/NetFx471.wxs20
-rw-r--r--src/ext/NetFx/wixlib/NetFx472.wxs67
-rw-r--r--src/ext/NetFx/wixlib/NetFx48.wxs67
-rw-r--r--src/ext/NetFx/wixlib/NetFxExtension.wxs38
-rw-r--r--src/ext/NetFx/wixlib/NetFxExtension_Platform.wxi28
-rw-r--r--src/ext/NetFx/wixlib/NetFxExtension_arm64.wxs7
-rw-r--r--src/ext/NetFx/wixlib/NetFxExtension_x64.wxs7
-rw-r--r--src/ext/NetFx/wixlib/NetFxExtension_x86.wxs7
-rw-r--r--src/ext/NetFx/wixlib/caDecor.wxi39
-rw-r--r--src/ext/NetFx/wixlib/netfx.v3.ncrunchproject5
-rw-r--r--src/ext/NetFx/wixlib/netfx.wixproj32
-rw-r--r--src/ext/UI/Directory.Build.props27
-rw-r--r--src/ext/UI/Directory.Build.targets51
-rw-r--r--src/ext/UI/Directory.csproj.props13
-rw-r--r--src/ext/UI/Directory.csproj.targets26
-rw-r--r--src/ext/UI/Directory.vcxproj.props111
-rw-r--r--src/ext/UI/README.md2
-rw-r--r--src/ext/UI/UI.wixext.sln75
-rw-r--r--src/ext/UI/appveyor.cmd14
-rw-r--r--src/ext/UI/appveyor.yml40
-rw-r--r--src/ext/UI/ca/CustomMsiErrors.h10
-rw-r--r--src/ext/UI/ca/DriveCheck.cpp126
-rw-r--r--src/ext/UI/ca/PrintEula.cpp556
-rw-r--r--src/ext/UI/ca/cost.h9
-rw-r--r--src/ext/UI/ca/dllmain.cpp26
-rw-r--r--src/ext/UI/ca/precomp.h18
-rw-r--r--src/ext/UI/ca/uica.def8
-rw-r--r--src/ext/UI/ca/uica.v3.ncrunchproject5
-rw-r--r--src/ext/UI/ca/uica.vcxproj58
-rw-r--r--src/ext/UI/nuget.config17
-rw-r--r--src/ext/UI/test/WixToolsetTest.UI/TestData/WixUI_Advanced/Package.wxs27
-rw-r--r--src/ext/UI/test/WixToolsetTest.UI/TestData/WixUI_FeatureTree/Package.wxs23
-rw-r--r--src/ext/UI/test/WixToolsetTest.UI/TestData/WixUI_InstallDir/Package.wxs23
-rw-r--r--src/ext/UI/test/WixToolsetTest.UI/TestData/WixUI_Minimal/Package.wxs23
-rw-r--r--src/ext/UI/test/WixToolsetTest.UI/TestData/WixUI_Mondo/Package.wxs23
-rw-r--r--src/ext/UI/test/WixToolsetTest.UI/TestData/data/example.txt1
-rw-r--r--src/ext/UI/test/WixToolsetTest.UI/UIExtensionFixture.cs111
-rw-r--r--src/ext/UI/test/WixToolsetTest.UI/WixToolsetTest.UI.csproj43
-rw-r--r--src/ext/UI/wix.snkbin0 -> 596 bytes
-rw-r--r--src/ext/UI/wixext/UIDecompiler.cs59
-rw-r--r--src/ext/UI/wixext/UIExtensionData.cs23
-rw-r--r--src/ext/UI/wixext/UIExtensionFactory.cs16
-rw-r--r--src/ext/UI/wixext/WixToolset.UI.wixext.csproj30
-rw-r--r--src/ext/UI/wixext/WixToolset.UI.wixext.nuspec23
-rw-r--r--src/ext/UI/wixext/WixToolset.UI.wixext.targets11
-rw-r--r--src/ext/UI/wixlib/AdvancedWelcomeEulaDlg.wxs47
-rw-r--r--src/ext/UI/wixlib/Bitmaps/New.icobin0 -> 318 bytes
-rw-r--r--src/ext/UI/wixlib/Bitmaps/Up.icobin0 -> 318 bytes
-rw-r--r--src/ext/UI/wixlib/Bitmaps/bannrbmp.bmpbin0 -> 2746 bytes
-rw-r--r--src/ext/UI/wixlib/Bitmaps/dlgbmp.bmpbin0 -> 68468 bytes
-rw-r--r--src/ext/UI/wixlib/Bitmaps/exclamic.icobin0 -> 766 bytes
-rw-r--r--src/ext/UI/wixlib/Bitmaps/info.icobin0 -> 1078 bytes
-rw-r--r--src/ext/UI/wixlib/BrowseDlg.wxs37
-rw-r--r--src/ext/UI/wixlib/CancelDlg.wxs19
-rw-r--r--src/ext/UI/wixlib/Common.wxs69
-rw-r--r--src/ext/UI/wixlib/Common_Platform.wxi19
-rw-r--r--src/ext/UI/wixlib/Common_x86.wxs7
-rw-r--r--src/ext/UI/wixlib/CustomizeDlg.wxs50
-rw-r--r--src/ext/UI/wixlib/DiskCostDlg.wxs21
-rw-r--r--src/ext/UI/wixlib/ErrorDlg.wxs36
-rw-r--r--src/ext/UI/wixlib/ErrorProgressText.wxs244
-rw-r--r--src/ext/UI/wixlib/ExitDialog.wxs28
-rw-r--r--src/ext/UI/wixlib/FatalError.wxs28
-rw-r--r--src/ext/UI/wixlib/FeaturesDlg.wxs57
-rw-r--r--src/ext/UI/wixlib/FilesInUse.wxs27
-rw-r--r--src/ext/UI/wixlib/InstallDirDlg.wxs26
-rw-r--r--src/ext/UI/wixlib/InstallScopeDlg.wxs30
-rw-r--r--src/ext/UI/wixlib/InvalidDirDlg.wxs16
-rw-r--r--src/ext/UI/wixlib/License.rtfbin0 -> 652 bytes
-rw-r--r--src/ext/UI/wixlib/LicenseAgreementDlg.wxs30
-rw-r--r--src/ext/UI/wixlib/MaintenanceTypeDlg.wxs58
-rw-r--r--src/ext/UI/wixlib/MaintenanceWelcomeDlg.wxs26
-rw-r--r--src/ext/UI/wixlib/MsiRMFilesInUse.wxs34
-rw-r--r--src/ext/UI/wixlib/OutOfDiskDlg.wxs21
-rw-r--r--src/ext/UI/wixlib/OutOfRbDiskDlg.wxs25
-rw-r--r--src/ext/UI/wixlib/PrepareDlg.wxs30
-rw-r--r--src/ext/UI/wixlib/ProgressDlg.wxs41
-rw-r--r--src/ext/UI/wixlib/ResumeDlg.wxs39
-rw-r--r--src/ext/UI/wixlib/SetupTypeDlg.wxs35
-rw-r--r--src/ext/UI/wixlib/UserExit.wxs28
-rw-r--r--src/ext/UI/wixlib/VerifyReadyDlg.wxs97
-rw-r--r--src/ext/UI/wixlib/WaitForCostingDlg.wxs16
-rw-r--r--src/ext/UI/wixlib/WelcomeDlg.wxs27
-rw-r--r--src/ext/UI/wixlib/WelcomeEulaDlg.wxs45
-rw-r--r--src/ext/UI/wixlib/WixExt_de-de.wxl175
-rw-r--r--src/ext/UI/wixlib/WixUI_Advanced.wxs121
-rw-r--r--src/ext/UI/wixlib/WixUI_FeatureTree.wxs69
-rw-r--r--src/ext/UI/wixlib/WixUI_InstallDir.wxs78
-rw-r--r--src/ext/UI/wixlib/WixUI_Minimal.wxs63
-rw-r--r--src/ext/UI/wixlib/WixUI_Mondo.wxs78
-rw-r--r--src/ext/UI/wixlib/WixUI_ar-SA.wxl598
-rw-r--r--src/ext/UI/wixlib/WixUI_bg-BG.wxl598
-rw-r--r--src/ext/UI/wixlib/WixUI_ca-ES.wxl598
-rw-r--r--src/ext/UI/wixlib/WixUI_cs-CZ.wxl598
-rw-r--r--src/ext/UI/wixlib/WixUI_da-DK.wxl598
-rw-r--r--src/ext/UI/wixlib/WixUI_de-de.wxl598
-rw-r--r--src/ext/UI/wixlib/WixUI_el-GR.wxl598
-rw-r--r--src/ext/UI/wixlib/WixUI_en-us.wxl601
-rw-r--r--src/ext/UI/wixlib/WixUI_es-es.wxl598
-rw-r--r--src/ext/UI/wixlib/WixUI_et-EE.wxl598
-rw-r--r--src/ext/UI/wixlib/WixUI_fi-FI.wxl603
-rw-r--r--src/ext/UI/wixlib/WixUI_fr-fr.wxl598
-rw-r--r--src/ext/UI/wixlib/WixUI_he-IL.wxl598
-rw-r--r--src/ext/UI/wixlib/WixUI_hi-IN.wxl598
-rw-r--r--src/ext/UI/wixlib/WixUI_hr-HR.wxl598
-rw-r--r--src/ext/UI/wixlib/WixUI_hu-HU.wxl598
-rw-r--r--src/ext/UI/wixlib/WixUI_it-it.wxl598
-rw-r--r--src/ext/UI/wixlib/WixUI_ja-jp.wxl598
-rw-r--r--src/ext/UI/wixlib/WixUI_kk-KZ.wxl598
-rw-r--r--src/ext/UI/wixlib/WixUI_ko-KR.wxl602
-rw-r--r--src/ext/UI/wixlib/WixUI_lt-LT.wxl598
-rw-r--r--src/ext/UI/wixlib/WixUI_lv-LV.wxl598
-rw-r--r--src/ext/UI/wixlib/WixUI_nb-NO.wxl598
-rw-r--r--src/ext/UI/wixlib/WixUI_nl-NL.wxl598
-rw-r--r--src/ext/UI/wixlib/WixUI_pl-pl.wxl598
-rw-r--r--src/ext/UI/wixlib/WixUI_pt-BR.wxl603
-rw-r--r--src/ext/UI/wixlib/WixUI_pt-PT.wxl598
-rw-r--r--src/ext/UI/wixlib/WixUI_ro-RO.wxl598
-rw-r--r--src/ext/UI/wixlib/WixUI_ru-ru.wxl602
-rw-r--r--src/ext/UI/wixlib/WixUI_sk-SK.wxl598
-rw-r--r--src/ext/UI/wixlib/WixUI_sl-SI.wxl598
-rw-r--r--src/ext/UI/wixlib/WixUI_sq-AL.wxl601
-rw-r--r--src/ext/UI/wixlib/WixUI_sr-Latn-CS.wxl598
-rw-r--r--src/ext/UI/wixlib/WixUI_sv-SE.wxl598
-rw-r--r--src/ext/UI/wixlib/WixUI_th-TH.wxl598
-rw-r--r--src/ext/UI/wixlib/WixUI_tr-TR.wxl598
-rw-r--r--src/ext/UI/wixlib/WixUI_uk-UA.wxl598
-rw-r--r--src/ext/UI/wixlib/WixUI_zh-CN.wxl598
-rw-r--r--src/ext/UI/wixlib/WixUI_zh-HK.wxl598
-rw-r--r--src/ext/UI/wixlib/WixUI_zh-TW.wxl598
-rw-r--r--src/ext/UI/wixlib/caSuffix.wxi27
-rw-r--r--src/ext/UI/wixlib/ui.wixproj36
-rw-r--r--src/ext/Util/CustomizedNativeRecommendedRules.ruleset8
-rw-r--r--src/ext/Util/Directory.Build.props27
-rw-r--r--src/ext/Util/Directory.Build.targets51
-rw-r--r--src/ext/Util/Directory.csproj.props13
-rw-r--r--src/ext/Util/Directory.csproj.targets26
-rw-r--r--src/ext/Util/Directory.vcxproj.props97
-rw-r--r--src/ext/Util/README.md3
-rw-r--r--src/ext/Util/Util.wixext.sln87
-rw-r--r--src/ext/Util/Util.wixext.v3.ncrunchsolution6
-rw-r--r--src/ext/Util/appveyor.cmd19
-rw-r--r--src/ext/Util/appveyor.yml40
-rw-r--r--src/ext/Util/be/UtilBundleExtension.cpp87
-rw-r--r--src/ext/Util/be/UtilBundleExtension.h16
-rw-r--r--src/ext/Util/be/beDecor.h13
-rw-r--r--src/ext/Util/be/detectsha2support.cpp58
-rw-r--r--src/ext/Util/be/detectsha2support.h8
-rw-r--r--src/ext/Util/be/precomp.cpp3
-rw-r--r--src/ext/Util/be/precomp.h37
-rw-r--r--src/ext/Util/be/utilbe.cpp41
-rw-r--r--src/ext/Util/be/utilbe.def8
-rw-r--r--src/ext/Util/be/utilbe.vcxproj80
-rw-r--r--src/ext/Util/be/utilsearch.cpp160
-rw-r--r--src/ext/Util/be/utilsearch.h65
-rw-r--r--src/ext/Util/ca/BroadcastSettingChange.cpp45
-rw-r--r--src/ext/Util/ca/CheckReboot.cpp36
-rw-r--r--src/ext/Util/ca/CloseApps.cpp568
-rw-r--r--src/ext/Util/ca/CustomMsiErrors.h32
-rw-r--r--src/ext/Util/ca/FormatFiles.cpp221
-rw-r--r--src/ext/Util/ca/OsInfo.cpp487
-rw-r--r--src/ext/Util/ca/RemoveFoldersEx.cpp243
-rw-r--r--src/ext/Util/ca/RemoveRegistryKeysEx.cpp114
-rw-r--r--src/ext/Util/ca/RestartManager.cpp185
-rw-r--r--src/ext/Util/ca/TouchFile.cpp308
-rw-r--r--src/ext/Util/ca/XmlConfig.cpp1130
-rw-r--r--src/ext/Util/ca/XmlFile.cpp940
-rw-r--r--src/ext/Util/ca/caDecor.h13
-rw-r--r--src/ext/Util/ca/cost.h9
-rw-r--r--src/ext/Util/ca/dllmain.cpp26
-rw-r--r--src/ext/Util/ca/exitearlywithsuccess.cpp27
-rw-r--r--src/ext/Util/ca/netshortcuts.cpp437
-rw-r--r--src/ext/Util/ca/precomp.h54
-rw-r--r--src/ext/Util/ca/qtexecca.cpp316
-rw-r--r--src/ext/Util/ca/sca.h19
-rw-r--r--src/ext/Util/ca/scacost.h18
-rw-r--r--src/ext/Util/ca/scaexec.cpp1082
-rw-r--r--src/ext/Util/ca/scamanifest.cpp377
-rw-r--r--src/ext/Util/ca/scaperf.cpp310
-rw-r--r--src/ext/Util/ca/scaperfexec.cpp423
-rw-r--r--src/ext/Util/ca/scasched.cpp127
-rw-r--r--src/ext/Util/ca/scasmb.h46
-rw-r--r--src/ext/Util/ca/scasmbexec.cpp316
-rw-r--r--src/ext/Util/ca/scasmbexec.h27
-rw-r--r--src/ext/Util/ca/scasmbsched.cpp639
-rw-r--r--src/ext/Util/ca/scauser.cpp709
-rw-r--r--src/ext/Util/ca/scauser.h67
-rw-r--r--src/ext/Util/ca/secureobj.cpp915
-rw-r--r--src/ext/Util/ca/serviceconfig.cpp821
-rw-r--r--src/ext/Util/ca/shellexecca.cpp271
-rw-r--r--src/ext/Util/ca/test.cpp269
-rw-r--r--src/ext/Util/ca/utilca.cpp3
-rw-r--r--src/ext/Util/ca/utilca.def91
-rw-r--r--src/ext/Util/ca/utilca.vcxproj106
-rw-r--r--src/ext/Util/nuget.config18
-rw-r--r--src/ext/Util/test/WixToolsetTest.Util/TestData/.Data/burn.exebin0 -> 463360 bytes
-rw-r--r--src/ext/Util/test/WixToolsetTest.Util/TestData/BundleWithSearches/Bundle.en-us.wxl8
-rw-r--r--src/ext/Util/test/WixToolsetTest.Util/TestData/BundleWithSearches/Bundle.wxs52
-rw-r--r--src/ext/Util/test/WixToolsetTest.Util/TestData/BundleWithSearches/data/MsiPackage/Shared.dll1
-rw-r--r--src/ext/Util/test/WixToolsetTest.Util/TestData/BundleWithSearches/data/MsiPackage/test.txt1
-rw-r--r--src/ext/Util/test/WixToolsetTest.Util/TestData/BundleWithSearches/data/fakeba.dll1
-rw-r--r--src/ext/Util/test/WixToolsetTest.Util/TestData/BundleWithSearches/data/test.msibin0 -> 32768 bytes
-rw-r--r--src/ext/Util/test/WixToolsetTest.Util/TestData/CloseApplication/Package.en-us.wxl9
-rw-r--r--src/ext/Util/test/WixToolsetTest.Util/TestData/CloseApplication/Package.wxs17
-rw-r--r--src/ext/Util/test/WixToolsetTest.Util/TestData/CloseApplication/PackageComponents.wxs9
-rw-r--r--src/ext/Util/test/WixToolsetTest.Util/TestData/CloseApplication/example.txt1
-rw-r--r--src/ext/Util/test/WixToolsetTest.Util/TestData/EventManifest/Package.en-us.wxl9
-rw-r--r--src/ext/Util/test/WixToolsetTest.Util/TestData/EventManifest/Package.wxs15
-rw-r--r--src/ext/Util/test/WixToolsetTest.Util/TestData/EventManifest/PackageComponents.wxs11
-rw-r--r--src/ext/Util/test/WixToolsetTest.Util/TestData/EventManifest/example.txt1
-rw-r--r--src/ext/Util/test/WixToolsetTest.Util/TestData/InternetShortcut/Package.en-us.wxl9
-rw-r--r--src/ext/Util/test/WixToolsetTest.Util/TestData/InternetShortcut/Package.icobin0 -> 83899 bytes
-rw-r--r--src/ext/Util/test/WixToolsetTest.Util/TestData/InternetShortcut/Package.wxs15
-rw-r--r--src/ext/Util/test/WixToolsetTest.Util/TestData/InternetShortcut/PackageComponents.wxs11
-rw-r--r--src/ext/Util/test/WixToolsetTest.Util/TestData/InternetShortcut/example.txt1
-rw-r--r--src/ext/Util/test/WixToolsetTest.Util/TestData/InternetShortcutModule/Module.wxs13
-rw-r--r--src/ext/Util/test/WixToolsetTest.Util/TestData/InternetShortcutModule/ModuleComponents.wxs11
-rw-r--r--src/ext/Util/test/WixToolsetTest.Util/TestData/InternetShortcutModule/Package.icobin0 -> 83899 bytes
-rw-r--r--src/ext/Util/test/WixToolsetTest.Util/TestData/PermissionEx/Package.en-us.wxl9
-rw-r--r--src/ext/Util/test/WixToolsetTest.Util/TestData/PermissionEx/Package.wxs15
-rw-r--r--src/ext/Util/test/WixToolsetTest.Util/TestData/PermissionEx/PackageComponents.wxs23
-rw-r--r--src/ext/Util/test/WixToolsetTest.Util/TestData/PermissionEx/example.txt1
-rw-r--r--src/ext/Util/test/WixToolsetTest.Util/TestData/Queries/Package.en-us.wxl9
-rw-r--r--src/ext/Util/test/WixToolsetTest.Util/TestData/Queries/Package.wxs23
-rw-r--r--src/ext/Util/test/WixToolsetTest.Util/TestData/Queries/PackageComponents.wxs9
-rw-r--r--src/ext/Util/test/WixToolsetTest.Util/TestData/Queries/example.txt1
-rw-r--r--src/ext/Util/test/WixToolsetTest.Util/TestData/RemoveFolderEx/Module.wxs13
-rw-r--r--src/ext/Util/test/WixToolsetTest.Util/TestData/RemoveFolderEx/ModuleComponents.wxs10
-rw-r--r--src/ext/Util/test/WixToolsetTest.Util/TestData/RemoveRegistryKeyEx/Module.wxs13
-rw-r--r--src/ext/Util/test/WixToolsetTest.Util/TestData/RemoveRegistryKeyEx/ModuleComponents.wxs10
-rw-r--r--src/ext/Util/test/WixToolsetTest.Util/TestData/UsingFileShare/Package.en-us.wxl9
-rw-r--r--src/ext/Util/test/WixToolsetTest.Util/TestData/UsingFileShare/Package.wxs15
-rw-r--r--src/ext/Util/test/WixToolsetTest.Util/TestData/UsingFileShare/PackageComponents.wxs14
-rw-r--r--src/ext/Util/test/WixToolsetTest.Util/TestData/UsingFileShare/example.txt1
-rw-r--r--src/ext/Util/test/WixToolsetTest.Util/TestData/XmlConfig/Package.en-us.wxl9
-rw-r--r--src/ext/Util/test/WixToolsetTest.Util/TestData/XmlConfig/Package.wxs17
-rw-r--r--src/ext/Util/test/WixToolsetTest.Util/TestData/XmlConfigModule/Module.wxs19
-rw-r--r--src/ext/Util/test/WixToolsetTest.Util/TestData/XmlConfigModule/my.xml1
-rw-r--r--src/ext/Util/test/WixToolsetTest.Util/UtilExtensionFixture.cs317
-rw-r--r--src/ext/Util/test/WixToolsetTest.Util/WixToolsetTest.Util.csproj38
-rw-r--r--src/ext/Util/test/WixToolsetTest.Util/WixToolsetTest.Util.v3.ncrunchproject5
-rw-r--r--src/ext/Util/wix.snkbin0 -> 596 bytes
-rw-r--r--src/ext/Util/wixext/PerformanceCounterType.cs192
-rw-r--r--src/ext/Util/wixext/Symbols/EventManifestSymbol.cs55
-rw-r--r--src/ext/Util/wixext/Symbols/FileSharePermissionsSymbol.cs63
-rw-r--r--src/ext/Util/wixext/Symbols/FileShareSymbol.cs71
-rw-r--r--src/ext/Util/wixext/Symbols/GroupSymbol.cs63
-rw-r--r--src/ext/Util/wixext/Symbols/PerfmonManifestSymbol.cs63
-rw-r--r--src/ext/Util/wixext/Symbols/PerfmonSymbol.cs63
-rw-r--r--src/ext/Util/wixext/Symbols/PerformanceCategorySymbol.cs71
-rw-r--r--src/ext/Util/wixext/Symbols/SecureObjectsSymbol.cs103
-rw-r--r--src/ext/Util/wixext/Symbols/ServiceConfigSymbol.cs119
-rw-r--r--src/ext/Util/wixext/Symbols/UserGroupSymbol.cs55
-rw-r--r--src/ext/Util/wixext/Symbols/UserSymbol.cs79
-rw-r--r--src/ext/Util/wixext/Symbols/UtilSymbolDefinitions.cs125
-rw-r--r--src/ext/Util/wixext/Symbols/WixCloseApplicationSymbol.cs103
-rw-r--r--src/ext/Util/wixext/Symbols/WixFormatFilesSymbol.cs55
-rw-r--r--src/ext/Util/wixext/Symbols/WixInternetShortcutSymbol.cs95
-rw-r--r--src/ext/Util/wixext/Symbols/WixRemoveFolderExSymbol.cs78
-rw-r--r--src/ext/Util/wixext/Symbols/WixRemoveRegistryKeyExSymbol.cs86
-rw-r--r--src/ext/Util/wixext/Symbols/WixRestartResourceSymbol.cs71
-rw-r--r--src/ext/Util/wixext/Symbols/WixTouchFileSymbol.cs63
-rw-r--r--src/ext/Util/wixext/Symbols/WixWindowsFeatureSearchSymbol.cs47
-rw-r--r--src/ext/Util/wixext/Symbols/XmlConfigSymbol.cs111
-rw-r--r--src/ext/Util/wixext/Symbols/XmlFileSymbol.cs95
-rw-r--r--src/ext/Util/wixext/UtilCompiler.cs3889
-rw-r--r--src/ext/Util/wixext/UtilConstants.cs17
-rw-r--r--src/ext/Util/wixext/UtilDecompiler.cs1543
-rw-r--r--src/ext/Util/wixext/UtilErrors.cs49
-rw-r--r--src/ext/Util/wixext/UtilExtensionData.cs23
-rw-r--r--src/ext/Util/wixext/UtilExtensionFactory.cs18
-rw-r--r--src/ext/Util/wixext/UtilTableDefinitions.cs319
-rw-r--r--src/ext/Util/wixext/UtilWarnings.cs37
-rw-r--r--src/ext/Util/wixext/UtilWindowsInstallerBackendExtension.cs13
-rw-r--r--src/ext/Util/wixext/WixToolset.Util.wixext.csproj31
-rw-r--r--src/ext/Util/wixext/WixToolset.Util.wixext.nuspec25
-rw-r--r--src/ext/Util/wixext/WixToolset.Util.wixext.targets11
-rw-r--r--src/ext/Util/wixext/WixToolset.Util.wixext.v3.ncrunchproject7
-rw-r--r--src/ext/Util/wixlib/UtilBundleExtension_Platform.wxi10
-rw-r--r--src/ext/Util/wixlib/UtilBundleExtension_arm64.wxs7
-rw-r--r--src/ext/Util/wixlib/UtilBundleExtension_x64.wxs7
-rw-r--r--src/ext/Util/wixlib/UtilBundleExtension_x86.wxs7
-rw-r--r--src/ext/Util/wixlib/UtilExtension.wxs64
-rw-r--r--src/ext/Util/wixlib/UtilExtension_Platform.wxi360
-rw-r--r--src/ext/Util/wixlib/UtilExtension_arm64.wxs7
-rw-r--r--src/ext/Util/wixlib/UtilExtension_x64.wxs7
-rw-r--r--src/ext/Util/wixlib/UtilExtension_x86.wxs7
-rw-r--r--src/ext/Util/wixlib/caDecor.wxi39
-rw-r--r--src/ext/Util/wixlib/caerr.wxi96
-rw-r--r--src/ext/Util/wixlib/de-de.wxl32
-rw-r--r--src/ext/Util/wixlib/en-us.wxl32
-rw-r--r--src/ext/Util/wixlib/es-es.wxl31
-rw-r--r--src/ext/Util/wixlib/fr-fr.wxl31
-rw-r--r--src/ext/Util/wixlib/it-it.wxl32
-rw-r--r--src/ext/Util/wixlib/ja-jp.wxl32
-rw-r--r--src/ext/Util/wixlib/pt-br.wxl26
-rw-r--r--src/ext/Util/wixlib/util.v3.ncrunchproject5
-rw-r--r--src/ext/Util/wixlib/util.wixproj27
-rw-r--r--src/ext/global.json5
1013 files changed, 127872 insertions, 1 deletions
diff --git a/src/ext/Bal/Bal.wixext.sln b/src/ext/Bal/Bal.wixext.sln
new file mode 100644
index 00000000..0b4c5afa
--- /dev/null
+++ b/src/ext/Bal/Bal.wixext.sln
@@ -0,0 +1,319 @@
1
2Microsoft Visual Studio Solution File, Format Version 12.00
3# Visual Studio Version 16
4VisualStudioVersion = 16.0.29503.13
5MinimumVisualStudioVersion = 10.0.40219.1
6Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "examples", "examples", "{C70E3534-A018-4D0A-A340-916C9777EEF7}"
7EndProject
8Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "bafunctions", "src\Samples\bafunctions\bafunctions.vcxproj", "{EB0A7D51-2133-4EE7-B6CA-87DBEAC67E02}"
9EndProject
10Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mbahost", "src\mbahost\mbahost.vcxproj", "{12C87C77-3547-44F8-8134-29BC915CB19D}"
11EndProject
12Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "wixstdba", "src\wixstdba\wixstdba.vcxproj", "{41085A22-E6AA-4E8B-AB1B-DDEE0DC89DFA}"
13EndProject
14Project("{930C7802-8A8C-48F9-8165-68863BCCD9DD}") = "bal", "src\wixlib\bal.wixproj", "{3444D952-F21C-496F-AB6B-56435BFD0787}"
15EndProject
16Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WixToolset.Bal.wixext", "src\wixext\WixToolset.Bal.wixext.csproj", "{BF720A63-9D7B-456E-B60C-8122852D9FED}"
17EndProject
18Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WixToolset.Dnc.Host", "src\WixToolset.Dnc.Host\WixToolset.Dnc.Host.csproj", "{0D780900-C2FF-4FA2-8CB5-8A19768724C5}"
19EndProject
20Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WixToolset.Mba.Host", "src\WixToolset.Mba.Host\WixToolset.Mba.Host.csproj", "{F2BA1935-70FA-4156-B161-FD03850B4FAA}"
21EndProject
22Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Example.FullFramework2MBA", "src\test\examples\FullFramework2MBA\Example.FullFramework2MBA.csproj", "{CC4236FC-226E-4232-AB50-24CBEC4D314D}"
23EndProject
24Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Example.TestEngine", "src\test\examples\TestEngine\Example.TestEngine.vcxproj", "{3D44B67D-A475-49BA-8310-E39F6C117CC9}"
25EndProject
26Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WixToolsetTest.ManagedHost", "src\test\WixToolsetTest.ManagedHost\WixToolsetTest.ManagedHost.csproj", "{FED9D707-E5C3-4867-87B0-FABDB5EB0823}"
27EndProject
28Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Example.FullFramework4MBA", "src\test\examples\FullFramework4MBA\Example.FullFramework4MBA.csproj", "{44297646-706D-4508-8E96-1B35B109694C}"
29EndProject
30Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WixToolsetTest.Bal", "src\test\WixToolsetTest.Bal\WixToolsetTest.Bal.csproj", "{89D479FC-20DA-44D8-AE38-48F063223498}"
31EndProject
32Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Example.EarliestCoreMBA", "src\test\examples\EarliestCoreMBA\Example.EarliestCoreMBA.csproj", "{1E86D8DF-DABD-4B6E-A812-64CD2040C73A}"
33EndProject
34Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "dnchost", "src\dnchost\dnchost.vcxproj", "{B6F70281-6583-4138-BB7F-AABFEBBB3CA2}"
35EndProject
36Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Example.LatestCoreMBA", "src\test\examples\LatestCoreMBA\Example.LatestCoreMBA.csproj", "{A4247D9D-3CC9-4BE1-B23A-BEC166AF3618}"
37EndProject
38Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Example.WPFCoreMBA", "src\test\examples\WPFCoreMBA\Example.WPFCoreMBA.csproj", "{8E707BF2-FD72-4649-8727-BA5955D48D40}"
39EndProject
40Global
41 GlobalSection(SolutionConfigurationPlatforms) = preSolution
42 Debug|Any CPU = Debug|Any CPU
43 Debug|ARM64 = Debug|ARM64
44 Debug|x64 = Debug|x64
45 Debug|x86 = Debug|x86
46 Release|Any CPU = Release|Any CPU
47 Release|ARM64 = Release|ARM64
48 Release|x64 = Release|x64
49 Release|x86 = Release|x86
50 EndGlobalSection
51 GlobalSection(ProjectConfigurationPlatforms) = postSolution
52 {EB0A7D51-2133-4EE7-B6CA-87DBEAC67E02}.Debug|Any CPU.ActiveCfg = Debug|Win32
53 {EB0A7D51-2133-4EE7-B6CA-87DBEAC67E02}.Debug|Any CPU.Build.0 = Debug|Win32
54 {EB0A7D51-2133-4EE7-B6CA-87DBEAC67E02}.Debug|ARM64.ActiveCfg = Debug|ARM64
55 {EB0A7D51-2133-4EE7-B6CA-87DBEAC67E02}.Debug|ARM64.Build.0 = Debug|ARM64
56 {EB0A7D51-2133-4EE7-B6CA-87DBEAC67E02}.Debug|x64.ActiveCfg = Debug|x64
57 {EB0A7D51-2133-4EE7-B6CA-87DBEAC67E02}.Debug|x64.Build.0 = Debug|x64
58 {EB0A7D51-2133-4EE7-B6CA-87DBEAC67E02}.Debug|x86.ActiveCfg = Debug|Win32
59 {EB0A7D51-2133-4EE7-B6CA-87DBEAC67E02}.Debug|x86.Build.0 = Debug|Win32
60 {EB0A7D51-2133-4EE7-B6CA-87DBEAC67E02}.Release|Any CPU.ActiveCfg = Release|Win32
61 {EB0A7D51-2133-4EE7-B6CA-87DBEAC67E02}.Release|Any CPU.Build.0 = Release|Win32
62 {EB0A7D51-2133-4EE7-B6CA-87DBEAC67E02}.Release|ARM64.ActiveCfg = Release|ARM64
63 {EB0A7D51-2133-4EE7-B6CA-87DBEAC67E02}.Release|ARM64.Build.0 = Release|ARM64
64 {EB0A7D51-2133-4EE7-B6CA-87DBEAC67E02}.Release|x64.ActiveCfg = Release|x64
65 {EB0A7D51-2133-4EE7-B6CA-87DBEAC67E02}.Release|x64.Build.0 = Release|x64
66 {EB0A7D51-2133-4EE7-B6CA-87DBEAC67E02}.Release|x86.ActiveCfg = Release|Win32
67 {EB0A7D51-2133-4EE7-B6CA-87DBEAC67E02}.Release|x86.Build.0 = Release|Win32
68 {12C87C77-3547-44F8-8134-29BC915CB19D}.Debug|Any CPU.ActiveCfg = Debug|Win32
69 {12C87C77-3547-44F8-8134-29BC915CB19D}.Debug|Any CPU.Build.0 = Debug|Win32
70 {12C87C77-3547-44F8-8134-29BC915CB19D}.Debug|ARM64.ActiveCfg = Debug|ARM64
71 {12C87C77-3547-44F8-8134-29BC915CB19D}.Debug|ARM64.Build.0 = Debug|ARM64
72 {12C87C77-3547-44F8-8134-29BC915CB19D}.Debug|x64.ActiveCfg = Debug|x64
73 {12C87C77-3547-44F8-8134-29BC915CB19D}.Debug|x64.Build.0 = Debug|x64
74 {12C87C77-3547-44F8-8134-29BC915CB19D}.Debug|x86.ActiveCfg = Debug|Win32
75 {12C87C77-3547-44F8-8134-29BC915CB19D}.Debug|x86.Build.0 = Debug|Win32
76 {12C87C77-3547-44F8-8134-29BC915CB19D}.Release|Any CPU.ActiveCfg = Release|Win32
77 {12C87C77-3547-44F8-8134-29BC915CB19D}.Release|Any CPU.Build.0 = Release|Win32
78 {12C87C77-3547-44F8-8134-29BC915CB19D}.Release|ARM64.ActiveCfg = Release|ARM64
79 {12C87C77-3547-44F8-8134-29BC915CB19D}.Release|ARM64.Build.0 = Release|ARM64
80 {12C87C77-3547-44F8-8134-29BC915CB19D}.Release|x64.ActiveCfg = Release|x64
81 {12C87C77-3547-44F8-8134-29BC915CB19D}.Release|x64.Build.0 = Release|x64
82 {12C87C77-3547-44F8-8134-29BC915CB19D}.Release|x86.ActiveCfg = Release|Win32
83 {12C87C77-3547-44F8-8134-29BC915CB19D}.Release|x86.Build.0 = Release|Win32
84 {41085A22-E6AA-4E8B-AB1B-DDEE0DC89DFA}.Debug|Any CPU.ActiveCfg = Debug|Win32
85 {41085A22-E6AA-4E8B-AB1B-DDEE0DC89DFA}.Debug|Any CPU.Build.0 = Debug|Win32
86 {41085A22-E6AA-4E8B-AB1B-DDEE0DC89DFA}.Debug|ARM64.ActiveCfg = Debug|ARM64
87 {41085A22-E6AA-4E8B-AB1B-DDEE0DC89DFA}.Debug|ARM64.Build.0 = Debug|ARM64
88 {41085A22-E6AA-4E8B-AB1B-DDEE0DC89DFA}.Debug|x64.ActiveCfg = Debug|x64
89 {41085A22-E6AA-4E8B-AB1B-DDEE0DC89DFA}.Debug|x64.Build.0 = Debug|x64
90 {41085A22-E6AA-4E8B-AB1B-DDEE0DC89DFA}.Debug|x86.ActiveCfg = Debug|Win32
91 {41085A22-E6AA-4E8B-AB1B-DDEE0DC89DFA}.Debug|x86.Build.0 = Debug|Win32
92 {41085A22-E6AA-4E8B-AB1B-DDEE0DC89DFA}.Release|Any CPU.ActiveCfg = Release|Win32
93 {41085A22-E6AA-4E8B-AB1B-DDEE0DC89DFA}.Release|Any CPU.Build.0 = Release|Win32
94 {41085A22-E6AA-4E8B-AB1B-DDEE0DC89DFA}.Release|ARM64.ActiveCfg = Release|ARM64
95 {41085A22-E6AA-4E8B-AB1B-DDEE0DC89DFA}.Release|ARM64.Build.0 = Release|ARM64
96 {41085A22-E6AA-4E8B-AB1B-DDEE0DC89DFA}.Release|x64.ActiveCfg = Release|x64
97 {41085A22-E6AA-4E8B-AB1B-DDEE0DC89DFA}.Release|x64.Build.0 = Release|x64
98 {41085A22-E6AA-4E8B-AB1B-DDEE0DC89DFA}.Release|x86.ActiveCfg = Release|Win32
99 {41085A22-E6AA-4E8B-AB1B-DDEE0DC89DFA}.Release|x86.Build.0 = Release|Win32
100 {3444D952-F21C-496F-AB6B-56435BFD0787}.Debug|Any CPU.ActiveCfg = Debug|x86
101 {3444D952-F21C-496F-AB6B-56435BFD0787}.Debug|Any CPU.Build.0 = Debug|x86
102 {3444D952-F21C-496F-AB6B-56435BFD0787}.Debug|ARM64.ActiveCfg = Debug|x86
103 {3444D952-F21C-496F-AB6B-56435BFD0787}.Debug|x64.ActiveCfg = Debug|x86
104 {3444D952-F21C-496F-AB6B-56435BFD0787}.Debug|x86.ActiveCfg = Debug|x86
105 {3444D952-F21C-496F-AB6B-56435BFD0787}.Debug|x86.Build.0 = Debug|x86
106 {3444D952-F21C-496F-AB6B-56435BFD0787}.Release|Any CPU.ActiveCfg = Release|x86
107 {3444D952-F21C-496F-AB6B-56435BFD0787}.Release|Any CPU.Build.0 = Release|x86
108 {3444D952-F21C-496F-AB6B-56435BFD0787}.Release|ARM64.ActiveCfg = Release|x86
109 {3444D952-F21C-496F-AB6B-56435BFD0787}.Release|x64.ActiveCfg = Release|x86
110 {3444D952-F21C-496F-AB6B-56435BFD0787}.Release|x86.ActiveCfg = Release|x86
111 {3444D952-F21C-496F-AB6B-56435BFD0787}.Release|x86.Build.0 = Release|x86
112 {BF720A63-9D7B-456E-B60C-8122852D9FED}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
113 {BF720A63-9D7B-456E-B60C-8122852D9FED}.Debug|Any CPU.Build.0 = Debug|Any CPU
114 {BF720A63-9D7B-456E-B60C-8122852D9FED}.Debug|ARM64.ActiveCfg = Debug|Any CPU
115 {BF720A63-9D7B-456E-B60C-8122852D9FED}.Debug|ARM64.Build.0 = Debug|Any CPU
116 {BF720A63-9D7B-456E-B60C-8122852D9FED}.Debug|x64.ActiveCfg = Debug|Any CPU
117 {BF720A63-9D7B-456E-B60C-8122852D9FED}.Debug|x64.Build.0 = Debug|Any CPU
118 {BF720A63-9D7B-456E-B60C-8122852D9FED}.Debug|x86.ActiveCfg = Debug|Any CPU
119 {BF720A63-9D7B-456E-B60C-8122852D9FED}.Debug|x86.Build.0 = Debug|Any CPU
120 {BF720A63-9D7B-456E-B60C-8122852D9FED}.Release|Any CPU.ActiveCfg = Release|Any CPU
121 {BF720A63-9D7B-456E-B60C-8122852D9FED}.Release|Any CPU.Build.0 = Release|Any CPU
122 {BF720A63-9D7B-456E-B60C-8122852D9FED}.Release|ARM64.ActiveCfg = Release|Any CPU
123 {BF720A63-9D7B-456E-B60C-8122852D9FED}.Release|ARM64.Build.0 = Release|Any CPU
124 {BF720A63-9D7B-456E-B60C-8122852D9FED}.Release|x64.ActiveCfg = Release|Any CPU
125 {BF720A63-9D7B-456E-B60C-8122852D9FED}.Release|x64.Build.0 = Release|Any CPU
126 {BF720A63-9D7B-456E-B60C-8122852D9FED}.Release|x86.ActiveCfg = Release|Any CPU
127 {BF720A63-9D7B-456E-B60C-8122852D9FED}.Release|x86.Build.0 = Release|Any CPU
128 {0D780900-C2FF-4FA2-8CB5-8A19768724C5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
129 {0D780900-C2FF-4FA2-8CB5-8A19768724C5}.Debug|Any CPU.Build.0 = Debug|Any CPU
130 {0D780900-C2FF-4FA2-8CB5-8A19768724C5}.Debug|ARM64.ActiveCfg = Debug|Any CPU
131 {0D780900-C2FF-4FA2-8CB5-8A19768724C5}.Debug|ARM64.Build.0 = Debug|Any CPU
132 {0D780900-C2FF-4FA2-8CB5-8A19768724C5}.Debug|x64.ActiveCfg = Debug|Any CPU
133 {0D780900-C2FF-4FA2-8CB5-8A19768724C5}.Debug|x64.Build.0 = Debug|Any CPU
134 {0D780900-C2FF-4FA2-8CB5-8A19768724C5}.Debug|x86.ActiveCfg = Debug|Any CPU
135 {0D780900-C2FF-4FA2-8CB5-8A19768724C5}.Debug|x86.Build.0 = Debug|Any CPU
136 {0D780900-C2FF-4FA2-8CB5-8A19768724C5}.Release|Any CPU.ActiveCfg = Release|Any CPU
137 {0D780900-C2FF-4FA2-8CB5-8A19768724C5}.Release|Any CPU.Build.0 = Release|Any CPU
138 {0D780900-C2FF-4FA2-8CB5-8A19768724C5}.Release|ARM64.ActiveCfg = Release|Any CPU
139 {0D780900-C2FF-4FA2-8CB5-8A19768724C5}.Release|ARM64.Build.0 = Release|Any CPU
140 {0D780900-C2FF-4FA2-8CB5-8A19768724C5}.Release|x64.ActiveCfg = Release|Any CPU
141 {0D780900-C2FF-4FA2-8CB5-8A19768724C5}.Release|x64.Build.0 = Release|Any CPU
142 {0D780900-C2FF-4FA2-8CB5-8A19768724C5}.Release|x86.ActiveCfg = Release|Any CPU
143 {0D780900-C2FF-4FA2-8CB5-8A19768724C5}.Release|x86.Build.0 = Release|Any CPU
144 {F2BA1935-70FA-4156-B161-FD03850B4FAA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
145 {F2BA1935-70FA-4156-B161-FD03850B4FAA}.Debug|Any CPU.Build.0 = Debug|Any CPU
146 {F2BA1935-70FA-4156-B161-FD03850B4FAA}.Debug|ARM64.ActiveCfg = Debug|Any CPU
147 {F2BA1935-70FA-4156-B161-FD03850B4FAA}.Debug|ARM64.Build.0 = Debug|Any CPU
148 {F2BA1935-70FA-4156-B161-FD03850B4FAA}.Debug|x64.ActiveCfg = Debug|Any CPU
149 {F2BA1935-70FA-4156-B161-FD03850B4FAA}.Debug|x64.Build.0 = Debug|Any CPU
150 {F2BA1935-70FA-4156-B161-FD03850B4FAA}.Debug|x86.ActiveCfg = Debug|Any CPU
151 {F2BA1935-70FA-4156-B161-FD03850B4FAA}.Debug|x86.Build.0 = Debug|Any CPU
152 {F2BA1935-70FA-4156-B161-FD03850B4FAA}.Release|Any CPU.ActiveCfg = Release|Any CPU
153 {F2BA1935-70FA-4156-B161-FD03850B4FAA}.Release|Any CPU.Build.0 = Release|Any CPU
154 {F2BA1935-70FA-4156-B161-FD03850B4FAA}.Release|ARM64.ActiveCfg = Release|Any CPU
155 {F2BA1935-70FA-4156-B161-FD03850B4FAA}.Release|ARM64.Build.0 = Release|Any CPU
156 {F2BA1935-70FA-4156-B161-FD03850B4FAA}.Release|x64.ActiveCfg = Release|Any CPU
157 {F2BA1935-70FA-4156-B161-FD03850B4FAA}.Release|x64.Build.0 = Release|Any CPU
158 {F2BA1935-70FA-4156-B161-FD03850B4FAA}.Release|x86.ActiveCfg = Release|Any CPU
159 {F2BA1935-70FA-4156-B161-FD03850B4FAA}.Release|x86.Build.0 = Release|Any CPU
160 {CC4236FC-226E-4232-AB50-24CBEC4D314D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
161 {CC4236FC-226E-4232-AB50-24CBEC4D314D}.Debug|Any CPU.Build.0 = Debug|Any CPU
162 {CC4236FC-226E-4232-AB50-24CBEC4D314D}.Debug|ARM64.ActiveCfg = Debug|Any CPU
163 {CC4236FC-226E-4232-AB50-24CBEC4D314D}.Debug|ARM64.Build.0 = Debug|Any CPU
164 {CC4236FC-226E-4232-AB50-24CBEC4D314D}.Debug|x64.ActiveCfg = Debug|Any CPU
165 {CC4236FC-226E-4232-AB50-24CBEC4D314D}.Debug|x64.Build.0 = Debug|Any CPU
166 {CC4236FC-226E-4232-AB50-24CBEC4D314D}.Debug|x86.ActiveCfg = Debug|Any CPU
167 {CC4236FC-226E-4232-AB50-24CBEC4D314D}.Debug|x86.Build.0 = Debug|Any CPU
168 {CC4236FC-226E-4232-AB50-24CBEC4D314D}.Release|Any CPU.ActiveCfg = Release|Any CPU
169 {CC4236FC-226E-4232-AB50-24CBEC4D314D}.Release|Any CPU.Build.0 = Release|Any CPU
170 {CC4236FC-226E-4232-AB50-24CBEC4D314D}.Release|ARM64.ActiveCfg = Release|Any CPU
171 {CC4236FC-226E-4232-AB50-24CBEC4D314D}.Release|ARM64.Build.0 = Release|Any CPU
172 {CC4236FC-226E-4232-AB50-24CBEC4D314D}.Release|x64.ActiveCfg = Release|Any CPU
173 {CC4236FC-226E-4232-AB50-24CBEC4D314D}.Release|x64.Build.0 = Release|Any CPU
174 {CC4236FC-226E-4232-AB50-24CBEC4D314D}.Release|x86.ActiveCfg = Release|Any CPU
175 {CC4236FC-226E-4232-AB50-24CBEC4D314D}.Release|x86.Build.0 = Release|Any CPU
176 {3D44B67D-A475-49BA-8310-E39F6C117CC9}.Debug|Any CPU.ActiveCfg = Debug|Win32
177 {3D44B67D-A475-49BA-8310-E39F6C117CC9}.Debug|Any CPU.Build.0 = Debug|Win32
178 {3D44B67D-A475-49BA-8310-E39F6C117CC9}.Debug|ARM64.ActiveCfg = Debug|ARM64
179 {3D44B67D-A475-49BA-8310-E39F6C117CC9}.Debug|ARM64.Build.0 = Debug|ARM64
180 {3D44B67D-A475-49BA-8310-E39F6C117CC9}.Debug|x64.ActiveCfg = Debug|x64
181 {3D44B67D-A475-49BA-8310-E39F6C117CC9}.Debug|x64.Build.0 = Debug|x64
182 {3D44B67D-A475-49BA-8310-E39F6C117CC9}.Debug|x86.ActiveCfg = Debug|Win32
183 {3D44B67D-A475-49BA-8310-E39F6C117CC9}.Debug|x86.Build.0 = Debug|Win32
184 {3D44B67D-A475-49BA-8310-E39F6C117CC9}.Release|Any CPU.ActiveCfg = Release|Win32
185 {3D44B67D-A475-49BA-8310-E39F6C117CC9}.Release|Any CPU.Build.0 = Release|Win32
186 {3D44B67D-A475-49BA-8310-E39F6C117CC9}.Release|ARM64.ActiveCfg = Release|ARM64
187 {3D44B67D-A475-49BA-8310-E39F6C117CC9}.Release|ARM64.Build.0 = Release|ARM64
188 {3D44B67D-A475-49BA-8310-E39F6C117CC9}.Release|x64.ActiveCfg = Release|x64
189 {3D44B67D-A475-49BA-8310-E39F6C117CC9}.Release|x64.Build.0 = Release|x64
190 {3D44B67D-A475-49BA-8310-E39F6C117CC9}.Release|x86.ActiveCfg = Release|Win32
191 {3D44B67D-A475-49BA-8310-E39F6C117CC9}.Release|x86.Build.0 = Release|Win32
192 {FED9D707-E5C3-4867-87B0-FABDB5EB0823}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
193 {FED9D707-E5C3-4867-87B0-FABDB5EB0823}.Debug|Any CPU.Build.0 = Debug|Any CPU
194 {FED9D707-E5C3-4867-87B0-FABDB5EB0823}.Debug|ARM64.ActiveCfg = Debug|Any CPU
195 {FED9D707-E5C3-4867-87B0-FABDB5EB0823}.Debug|ARM64.Build.0 = Debug|Any CPU
196 {FED9D707-E5C3-4867-87B0-FABDB5EB0823}.Debug|x64.ActiveCfg = Debug|Any CPU
197 {FED9D707-E5C3-4867-87B0-FABDB5EB0823}.Debug|x64.Build.0 = Debug|Any CPU
198 {FED9D707-E5C3-4867-87B0-FABDB5EB0823}.Debug|x86.ActiveCfg = Debug|Any CPU
199 {FED9D707-E5C3-4867-87B0-FABDB5EB0823}.Debug|x86.Build.0 = Debug|Any CPU
200 {FED9D707-E5C3-4867-87B0-FABDB5EB0823}.Release|Any CPU.ActiveCfg = Release|Any CPU
201 {FED9D707-E5C3-4867-87B0-FABDB5EB0823}.Release|Any CPU.Build.0 = Release|Any CPU
202 {FED9D707-E5C3-4867-87B0-FABDB5EB0823}.Release|ARM64.ActiveCfg = Release|Any CPU
203 {FED9D707-E5C3-4867-87B0-FABDB5EB0823}.Release|ARM64.Build.0 = Release|Any CPU
204 {FED9D707-E5C3-4867-87B0-FABDB5EB0823}.Release|x64.ActiveCfg = Release|Any CPU
205 {FED9D707-E5C3-4867-87B0-FABDB5EB0823}.Release|x64.Build.0 = Release|Any CPU
206 {FED9D707-E5C3-4867-87B0-FABDB5EB0823}.Release|x86.ActiveCfg = Release|Any CPU
207 {FED9D707-E5C3-4867-87B0-FABDB5EB0823}.Release|x86.Build.0 = Release|Any CPU
208 {44297646-706D-4508-8E96-1B35B109694C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
209 {44297646-706D-4508-8E96-1B35B109694C}.Debug|Any CPU.Build.0 = Debug|Any CPU
210 {44297646-706D-4508-8E96-1B35B109694C}.Debug|ARM64.ActiveCfg = Debug|Any CPU
211 {44297646-706D-4508-8E96-1B35B109694C}.Debug|ARM64.Build.0 = Debug|Any CPU
212 {44297646-706D-4508-8E96-1B35B109694C}.Debug|x64.ActiveCfg = Debug|Any CPU
213 {44297646-706D-4508-8E96-1B35B109694C}.Debug|x64.Build.0 = Debug|Any CPU
214 {44297646-706D-4508-8E96-1B35B109694C}.Debug|x86.ActiveCfg = Debug|Any CPU
215 {44297646-706D-4508-8E96-1B35B109694C}.Debug|x86.Build.0 = Debug|Any CPU
216 {44297646-706D-4508-8E96-1B35B109694C}.Release|Any CPU.ActiveCfg = Release|Any CPU
217 {44297646-706D-4508-8E96-1B35B109694C}.Release|Any CPU.Build.0 = Release|Any CPU
218 {44297646-706D-4508-8E96-1B35B109694C}.Release|ARM64.ActiveCfg = Release|Any CPU
219 {44297646-706D-4508-8E96-1B35B109694C}.Release|ARM64.Build.0 = Release|Any CPU
220 {44297646-706D-4508-8E96-1B35B109694C}.Release|x64.ActiveCfg = Release|Any CPU
221 {44297646-706D-4508-8E96-1B35B109694C}.Release|x64.Build.0 = Release|Any CPU
222 {44297646-706D-4508-8E96-1B35B109694C}.Release|x86.ActiveCfg = Release|Any CPU
223 {44297646-706D-4508-8E96-1B35B109694C}.Release|x86.Build.0 = Release|Any CPU
224 {89D479FC-20DA-44D8-AE38-48F063223498}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
225 {89D479FC-20DA-44D8-AE38-48F063223498}.Debug|Any CPU.Build.0 = Debug|Any CPU
226 {89D479FC-20DA-44D8-AE38-48F063223498}.Debug|ARM64.ActiveCfg = Debug|Any CPU
227 {89D479FC-20DA-44D8-AE38-48F063223498}.Debug|ARM64.Build.0 = Debug|Any CPU
228 {89D479FC-20DA-44D8-AE38-48F063223498}.Debug|x64.ActiveCfg = Debug|Any CPU
229 {89D479FC-20DA-44D8-AE38-48F063223498}.Debug|x64.Build.0 = Debug|Any CPU
230 {89D479FC-20DA-44D8-AE38-48F063223498}.Debug|x86.ActiveCfg = Debug|Any CPU
231 {89D479FC-20DA-44D8-AE38-48F063223498}.Debug|x86.Build.0 = Debug|Any CPU
232 {89D479FC-20DA-44D8-AE38-48F063223498}.Release|Any CPU.ActiveCfg = Release|Any CPU
233 {89D479FC-20DA-44D8-AE38-48F063223498}.Release|Any CPU.Build.0 = Release|Any CPU
234 {89D479FC-20DA-44D8-AE38-48F063223498}.Release|ARM64.ActiveCfg = Release|Any CPU
235 {89D479FC-20DA-44D8-AE38-48F063223498}.Release|ARM64.Build.0 = Release|Any CPU
236 {89D479FC-20DA-44D8-AE38-48F063223498}.Release|x64.ActiveCfg = Release|Any CPU
237 {89D479FC-20DA-44D8-AE38-48F063223498}.Release|x64.Build.0 = Release|Any CPU
238 {89D479FC-20DA-44D8-AE38-48F063223498}.Release|x86.ActiveCfg = Release|Any CPU
239 {89D479FC-20DA-44D8-AE38-48F063223498}.Release|x86.Build.0 = Release|Any CPU
240 {1E86D8DF-DABD-4B6E-A812-64CD2040C73A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
241 {1E86D8DF-DABD-4B6E-A812-64CD2040C73A}.Debug|Any CPU.Build.0 = Debug|Any CPU
242 {1E86D8DF-DABD-4B6E-A812-64CD2040C73A}.Debug|ARM64.ActiveCfg = Debug|Any CPU
243 {1E86D8DF-DABD-4B6E-A812-64CD2040C73A}.Debug|ARM64.Build.0 = Debug|Any CPU
244 {1E86D8DF-DABD-4B6E-A812-64CD2040C73A}.Debug|x64.ActiveCfg = Debug|Any CPU
245 {1E86D8DF-DABD-4B6E-A812-64CD2040C73A}.Debug|x64.Build.0 = Debug|Any CPU
246 {1E86D8DF-DABD-4B6E-A812-64CD2040C73A}.Debug|x86.ActiveCfg = Debug|Any CPU
247 {1E86D8DF-DABD-4B6E-A812-64CD2040C73A}.Debug|x86.Build.0 = Debug|Any CPU
248 {1E86D8DF-DABD-4B6E-A812-64CD2040C73A}.Release|Any CPU.ActiveCfg = Release|Any CPU
249 {1E86D8DF-DABD-4B6E-A812-64CD2040C73A}.Release|Any CPU.Build.0 = Release|Any CPU
250 {1E86D8DF-DABD-4B6E-A812-64CD2040C73A}.Release|ARM64.ActiveCfg = Release|Any CPU
251 {1E86D8DF-DABD-4B6E-A812-64CD2040C73A}.Release|ARM64.Build.0 = Release|Any CPU
252 {1E86D8DF-DABD-4B6E-A812-64CD2040C73A}.Release|x64.ActiveCfg = Release|Any CPU
253 {1E86D8DF-DABD-4B6E-A812-64CD2040C73A}.Release|x64.Build.0 = Release|Any CPU
254 {1E86D8DF-DABD-4B6E-A812-64CD2040C73A}.Release|x86.ActiveCfg = Release|Any CPU
255 {1E86D8DF-DABD-4B6E-A812-64CD2040C73A}.Release|x86.Build.0 = Release|Any CPU
256 {B6F70281-6583-4138-BB7F-AABFEBBB3CA2}.Debug|Any CPU.ActiveCfg = Debug|Win32
257 {B6F70281-6583-4138-BB7F-AABFEBBB3CA2}.Debug|Any CPU.Build.0 = Debug|Win32
258 {B6F70281-6583-4138-BB7F-AABFEBBB3CA2}.Debug|ARM64.ActiveCfg = Debug|ARM64
259 {B6F70281-6583-4138-BB7F-AABFEBBB3CA2}.Debug|ARM64.Build.0 = Debug|ARM64
260 {B6F70281-6583-4138-BB7F-AABFEBBB3CA2}.Debug|x64.ActiveCfg = Debug|x64
261 {B6F70281-6583-4138-BB7F-AABFEBBB3CA2}.Debug|x64.Build.0 = Debug|x64
262 {B6F70281-6583-4138-BB7F-AABFEBBB3CA2}.Debug|x86.ActiveCfg = Debug|Win32
263 {B6F70281-6583-4138-BB7F-AABFEBBB3CA2}.Debug|x86.Build.0 = Debug|Win32
264 {B6F70281-6583-4138-BB7F-AABFEBBB3CA2}.Release|Any CPU.ActiveCfg = Release|Win32
265 {B6F70281-6583-4138-BB7F-AABFEBBB3CA2}.Release|Any CPU.Build.0 = Release|Win32
266 {B6F70281-6583-4138-BB7F-AABFEBBB3CA2}.Release|ARM64.ActiveCfg = Release|ARM64
267 {B6F70281-6583-4138-BB7F-AABFEBBB3CA2}.Release|ARM64.Build.0 = Release|ARM64
268 {B6F70281-6583-4138-BB7F-AABFEBBB3CA2}.Release|x64.ActiveCfg = Release|x64
269 {B6F70281-6583-4138-BB7F-AABFEBBB3CA2}.Release|x64.Build.0 = Release|x64
270 {B6F70281-6583-4138-BB7F-AABFEBBB3CA2}.Release|x86.ActiveCfg = Release|Win32
271 {B6F70281-6583-4138-BB7F-AABFEBBB3CA2}.Release|x86.Build.0 = Release|Win32
272 {A4247D9D-3CC9-4BE1-B23A-BEC166AF3618}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
273 {A4247D9D-3CC9-4BE1-B23A-BEC166AF3618}.Debug|Any CPU.Build.0 = Debug|Any CPU
274 {A4247D9D-3CC9-4BE1-B23A-BEC166AF3618}.Debug|ARM64.ActiveCfg = Debug|Any CPU
275 {A4247D9D-3CC9-4BE1-B23A-BEC166AF3618}.Debug|ARM64.Build.0 = Debug|Any CPU
276 {A4247D9D-3CC9-4BE1-B23A-BEC166AF3618}.Debug|x64.ActiveCfg = Debug|Any CPU
277 {A4247D9D-3CC9-4BE1-B23A-BEC166AF3618}.Debug|x64.Build.0 = Debug|Any CPU
278 {A4247D9D-3CC9-4BE1-B23A-BEC166AF3618}.Debug|x86.ActiveCfg = Debug|Any CPU
279 {A4247D9D-3CC9-4BE1-B23A-BEC166AF3618}.Debug|x86.Build.0 = Debug|Any CPU
280 {A4247D9D-3CC9-4BE1-B23A-BEC166AF3618}.Release|Any CPU.ActiveCfg = Release|Any CPU
281 {A4247D9D-3CC9-4BE1-B23A-BEC166AF3618}.Release|Any CPU.Build.0 = Release|Any CPU
282 {A4247D9D-3CC9-4BE1-B23A-BEC166AF3618}.Release|ARM64.ActiveCfg = Release|Any CPU
283 {A4247D9D-3CC9-4BE1-B23A-BEC166AF3618}.Release|ARM64.Build.0 = Release|Any CPU
284 {A4247D9D-3CC9-4BE1-B23A-BEC166AF3618}.Release|x64.ActiveCfg = Release|Any CPU
285 {A4247D9D-3CC9-4BE1-B23A-BEC166AF3618}.Release|x64.Build.0 = Release|Any CPU
286 {A4247D9D-3CC9-4BE1-B23A-BEC166AF3618}.Release|x86.ActiveCfg = Release|Any CPU
287 {A4247D9D-3CC9-4BE1-B23A-BEC166AF3618}.Release|x86.Build.0 = Release|Any CPU
288 {8E707BF2-FD72-4649-8727-BA5955D48D40}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
289 {8E707BF2-FD72-4649-8727-BA5955D48D40}.Debug|Any CPU.Build.0 = Debug|Any CPU
290 {8E707BF2-FD72-4649-8727-BA5955D48D40}.Debug|ARM64.ActiveCfg = Debug|Any CPU
291 {8E707BF2-FD72-4649-8727-BA5955D48D40}.Debug|ARM64.Build.0 = Debug|Any CPU
292 {8E707BF2-FD72-4649-8727-BA5955D48D40}.Debug|x64.ActiveCfg = Debug|Any CPU
293 {8E707BF2-FD72-4649-8727-BA5955D48D40}.Debug|x64.Build.0 = Debug|Any CPU
294 {8E707BF2-FD72-4649-8727-BA5955D48D40}.Debug|x86.ActiveCfg = Debug|Any CPU
295 {8E707BF2-FD72-4649-8727-BA5955D48D40}.Debug|x86.Build.0 = Debug|Any CPU
296 {8E707BF2-FD72-4649-8727-BA5955D48D40}.Release|Any CPU.ActiveCfg = Release|Any CPU
297 {8E707BF2-FD72-4649-8727-BA5955D48D40}.Release|Any CPU.Build.0 = Release|Any CPU
298 {8E707BF2-FD72-4649-8727-BA5955D48D40}.Release|ARM64.ActiveCfg = Release|Any CPU
299 {8E707BF2-FD72-4649-8727-BA5955D48D40}.Release|ARM64.Build.0 = Release|Any CPU
300 {8E707BF2-FD72-4649-8727-BA5955D48D40}.Release|x64.ActiveCfg = Release|Any CPU
301 {8E707BF2-FD72-4649-8727-BA5955D48D40}.Release|x64.Build.0 = Release|Any CPU
302 {8E707BF2-FD72-4649-8727-BA5955D48D40}.Release|x86.ActiveCfg = Release|Any CPU
303 {8E707BF2-FD72-4649-8727-BA5955D48D40}.Release|x86.Build.0 = Release|Any CPU
304 EndGlobalSection
305 GlobalSection(SolutionProperties) = preSolution
306 HideSolutionNode = FALSE
307 EndGlobalSection
308 GlobalSection(NestedProjects) = preSolution
309 {CC4236FC-226E-4232-AB50-24CBEC4D314D} = {C70E3534-A018-4D0A-A340-916C9777EEF7}
310 {3D44B67D-A475-49BA-8310-E39F6C117CC9} = {C70E3534-A018-4D0A-A340-916C9777EEF7}
311 {44297646-706D-4508-8E96-1B35B109694C} = {C70E3534-A018-4D0A-A340-916C9777EEF7}
312 {1E86D8DF-DABD-4B6E-A812-64CD2040C73A} = {C70E3534-A018-4D0A-A340-916C9777EEF7}
313 {A4247D9D-3CC9-4BE1-B23A-BEC166AF3618} = {C70E3534-A018-4D0A-A340-916C9777EEF7}
314 {8E707BF2-FD72-4649-8727-BA5955D48D40} = {C70E3534-A018-4D0A-A340-916C9777EEF7}
315 EndGlobalSection
316 GlobalSection(ExtensibilityGlobals) = postSolution
317 SolutionGuid = {74046961-48BF-467A-A6C2-F886C75CE0BE}
318 EndGlobalSection
319EndGlobal
diff --git a/src/ext/Bal/CSharp.Build.props b/src/ext/Bal/CSharp.Build.props
new file mode 100644
index 00000000..81d24ad1
--- /dev/null
+++ b/src/ext/Bal/CSharp.Build.props
@@ -0,0 +1,13 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2<!--
3 Do NOT modify this file. Update the canonical version in Home\repo-template\src\CSharp.Build.props
4 then update all of the repos.
5-->
6<Project>
7 <PropertyGroup>
8 <CheckForOverflowUnderflow>true</CheckForOverflowUnderflow>
9 <SignAssembly>true</SignAssembly>
10 <AssemblyOriginatorKeyFile>$([System.IO.Path]::GetFullPath($(MSBuildThisFileDirectory)wix.snk))</AssemblyOriginatorKeyFile>
11 <NBGV_EmitThisAssemblyClass>false</NBGV_EmitThisAssemblyClass>
12 </PropertyGroup>
13</Project>
diff --git a/src/ext/Bal/Cpp.Build.props b/src/ext/Bal/Cpp.Build.props
new file mode 100644
index 00000000..e7bba117
--- /dev/null
+++ b/src/ext/Bal/Cpp.Build.props
@@ -0,0 +1,94 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3
4<Project>
5 <PropertyGroup>
6 <Platform Condition=" '$(Platform)' == '' OR '$(Platform)' == 'AnyCPU' ">Win32</Platform>
7 <IntDir>$(BaseIntermediateOutputPath)$(Configuration)\$(Platform)\</IntDir>
8 <OutDir>$(OutputPath)$(Platform)\</OutDir>
9
10 <!-- NBGV properties -->
11 <AssemblyCompany>$(Company)</AssemblyCompany>
12 <AssemblyCopyright>$(Copyright)</AssemblyCopyright>
13 </PropertyGroup>
14
15 <PropertyGroup Condition="'$(WindowsTargetPlatformVersion)'=='' AND '$(VisualStudioVersion)'>='15.0'">
16 <WindowsTargetPlatformVersion>$([Microsoft.Build.Utilities.ToolLocationHelper]::GetLatestSDKTargetPlatformVersion('Windows', '10.0'))</WindowsTargetPlatformVersion>
17 </PropertyGroup>
18
19 <PropertyGroup>
20 <CodeAnalysisRuleSet>$(MSBuildThisFileDirectory)CustomizedNativeRecommendedRules.ruleset</CodeAnalysisRuleSet>
21 </PropertyGroup>
22
23 <ItemDefinitionGroup>
24 <ClCompile>
25 <DisableSpecificWarnings>$(DisableSpecificCompilerWarnings)</DisableSpecificWarnings>
26 <WarningLevel>Level4</WarningLevel>
27 <AdditionalIncludeDirectories>$(ProjectDir)inc;$(MSBuildProjectDirectory);$(IntDir);$(SqlCESdkIncludePath);$(ProjectAdditionalIncludeDirectories);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
28 <PreprocessorDefinitions>WIN32;_WINDOWS;_WIN32_MSI=500;_WIN32_WINNT=0x0501;$(ArmPreprocessorDefinitions);$(UnicodePreprocessorDefinitions);_CRT_STDIO_LEGACY_WIDE_SPECIFIERS;_WINSOCK_DEPRECATED_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
29 <PrecompiledHeader>Use</PrecompiledHeader>
30 <PrecompiledHeaderFile>precomp.h</PrecompiledHeaderFile>
31 <CallingConvention Condition="'$(Platform)'=='Win32'">StdCall</CallingConvention>
32 <TreatWarningAsError>true</TreatWarningAsError>
33 <ExceptionHandling>false</ExceptionHandling>
34 <AdditionalOptions>-YlprecompDefine</AdditionalOptions>
35 <AdditionalOptions Condition=" $(PlatformToolset.StartsWith('v14')) ">/Zc:threadSafeInit- %(AdditionalOptions)</AdditionalOptions>
36 <MultiProcessorCompilation Condition=" $(NUMBER_OF_PROCESSORS) &gt; 4 ">true</MultiProcessorCompilation>
37 </ClCompile>
38 <ResourceCompile>
39 <PreprocessorDefinitions>$(ArmPreprocessorDefinitions);%(PreprocessorDefinitions)</PreprocessorDefinitions>
40 <AdditionalIncludeDirectories>$(ProjectAdditionalResourceIncludeDirectories);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
41 </ResourceCompile>
42 <Lib>
43 <AdditionalLibraryDirectories>$(OutDir);$(AdditionalMultiTargetLibraryPath);$(ProjectAdditionalLibraryDirectories);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
44 </Lib>
45 <Link>
46 <SubSystem>$(ProjectSubSystem)</SubSystem>
47 <ModuleDefinitionFile>$(ProjectModuleDefinitionFile)</ModuleDefinitionFile>
48 <NoEntryPoint>$(ResourceOnlyDll)</NoEntryPoint>
49 <GenerateDebugInformation>true</GenerateDebugInformation>
50 <AdditionalDependencies>$(ProjectAdditionalLinkLibraries);advapi32.lib;comdlg32.lib;user32.lib;oleaut32.lib;gdi32.lib;shell32.lib;ole32.lib;version.lib;%(AdditionalDependencies)</AdditionalDependencies>
51 <AdditionalLibraryDirectories>$(OutDir);$(AdditionalMultiTargetLibraryPath);$(ArmLibraryDirectories);$(ProjectAdditionalLinkLibraryDirectories);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
52 <AdditionalOptions Condition=" $(PlatformToolset.StartsWith('v14')) ">/IGNORE:4099 %(AdditionalOptions)</AdditionalOptions>
53 </Link>
54 </ItemDefinitionGroup>
55
56 <ItemDefinitionGroup Condition=" '$(Platform)'=='Win32' and '$(PlatformToolset)'!='v100'">
57 <ClCompile>
58 <EnableEnhancedInstructionSet>NoExtensions</EnableEnhancedInstructionSet>
59 </ClCompile>
60 </ItemDefinitionGroup>
61 <ItemDefinitionGroup Condition=" '$(Platform)'=='arm' ">
62 <ClCompile>
63 <CallingConvention>CDecl</CallingConvention>
64 </ClCompile>
65 </ItemDefinitionGroup>
66 <ItemDefinitionGroup Condition=" '$(ConfigurationType)'=='StaticLibrary' ">
67 <ClCompile>
68 <DebugInformationFormat>OldStyle</DebugInformationFormat>
69 <OmitDefaultLibName>true</OmitDefaultLibName>
70 <IgnoreAllDefaultLibraries>true</IgnoreAllDefaultLibraries>
71 </ClCompile>
72 </ItemDefinitionGroup>
73 <ItemDefinitionGroup Condition=" '$(Configuration)'=='Debug' ">
74 <ClCompile>
75 <Optimization>Disabled</Optimization>
76 <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
77 <PreprocessorDefinitions>_DEBUG;DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
78 <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
79 </ClCompile>
80 </ItemDefinitionGroup>
81 <ItemDefinitionGroup Condition=" '$(Configuration)'=='Release' ">
82 <ClCompile>
83 <Optimization>MinSpace</Optimization>
84 <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
85 <FunctionLevelLinking>true</FunctionLevelLinking>
86 <IntrinsicFunctions>true</IntrinsicFunctions>
87 <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
88 </ClCompile>
89 <Link>
90 <EnableCOMDATFolding>true</EnableCOMDATFolding>
91 <OptimizeReferences>true</OptimizeReferences>
92 </Link>
93 </ItemDefinitionGroup>
94</Project>
diff --git a/src/ext/Bal/Custom.Build.props b/src/ext/Bal/Custom.Build.props
new file mode 100644
index 00000000..66e74d81
--- /dev/null
+++ b/src/ext/Bal/Custom.Build.props
@@ -0,0 +1,11 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3
4<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
5 <PropertyGroup Condition="$(ProjectName.StartsWith('Example.')) And '$(MSBuildProjectExtension)'=='.csproj' ">
6 <OutputPath>$(OutputPath)examples\$(ProjectName)\</OutputPath>
7 </PropertyGroup>
8 <PropertyGroup Condition="$(ProjectName.StartsWith('Example.')) And '$(MSBuildProjectExtension)'=='.vcxproj' ">
9 <OutDir>$(OutDir)examples\$(ProjectName)\</OutDir>
10 </PropertyGroup>
11</Project>
diff --git a/src/ext/Bal/CustomizedNativeRecommendedRules.ruleset b/src/ext/Bal/CustomizedNativeRecommendedRules.ruleset
new file mode 100644
index 00000000..142b141c
--- /dev/null
+++ b/src/ext/Bal/CustomizedNativeRecommendedRules.ruleset
@@ -0,0 +1,8 @@
1<?xml version="1.0" encoding="utf-8"?>
2<RuleSet Name="Customized Microsoft Native Recommended Rules" Description="Microsoft Native Recommended Rules, -C26812" ToolsVersion="16.0">
3 <Include Path="nativerecommendedrules.ruleset" Action="Default" />
4 <Rules AnalyzerId="Microsoft.Analyzers.NativeCodeAnalysis" RuleNamespace="Microsoft.Rules.Native">
5 <!-- We need C style enums since we support BAs written in C -->
6 <Rule Id="C26812" Action="None" />
7 </Rules>
8</RuleSet> \ No newline at end of file
diff --git a/src/ext/Bal/Directory.Build.props b/src/ext/Bal/Directory.Build.props
new file mode 100644
index 00000000..f83cc154
--- /dev/null
+++ b/src/ext/Bal/Directory.Build.props
@@ -0,0 +1,29 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3<!--
4 Do NOT modify this file. Update the canonical version in Home\repo-template\src\Directory.Build.props
5 then update all of the repos.
6-->
7<Project>
8 <PropertyGroup>
9 <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
10 <EnableSourceLink Condition=" '$(NCrunch)' == '1' ">false</EnableSourceLink>
11 <MSBuildWarningsAsMessages>MSB3246</MSBuildWarningsAsMessages>
12
13 <ProjectName Condition=" '$(ProjectName)' == '' ">$(MSBuildProjectName)</ProjectName>
14 <BaseOutputPath>$([System.IO.Path]::GetFullPath($(MSBuildThisFileDirectory)..\build\))</BaseOutputPath>
15 <BaseIntermediateOutputPath>$(BaseOutputPath)obj\$(ProjectName)\</BaseIntermediateOutputPath>
16 <OutputPath>$(BaseOutputPath)$(Configuration)\</OutputPath>
17
18 <Authors>WiX Toolset Team</Authors>
19 <Company>WiX Toolset</Company>
20 <Copyright>Copyright (c) .NET Foundation and contributors. All rights reserved.</Copyright>
21 <PackageLicenseExpression>MS-RL</PackageLicenseExpression>
22 <Product>WiX Toolset</Product>
23 </PropertyGroup>
24
25 <Import Project="CSharp.Build.props" Condition=" '$(MSBuildProjectExtension)'=='.csproj' and Exists('CSharp.Build.props') " />
26 <Import Project="Cpp.Build.props" Condition=" Exists('Cpp.Build.props') And '$(MSBuildProjectExtension)'=='.vcxproj' " />
27 <Import Project="Wix.Build.props" Condition=" Exists('Wix.Build.props') And '$(MSBuildProjectExtension)'=='.wixproj' " />
28 <Import Project="Custom.Build.props" Condition=" Exists('Custom.Build.props') " />
29</Project>
diff --git a/src/ext/Bal/Directory.Build.targets b/src/ext/Bal/Directory.Build.targets
new file mode 100644
index 00000000..cb988931
--- /dev/null
+++ b/src/ext/Bal/Directory.Build.targets
@@ -0,0 +1,56 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3<!--
4 Do NOT modify this file. Update the canonical version in Home\repo-template\src\Directory.Build.targets
5 then update all of the repos.
6-->
7<!--
8 Replace PackageReferences with ProjectReferences when the projects can be found in .sln.
9 See the original here: https://github.com/dotnet/sdk/issues/1151#issuecomment-385133284
10-->
11<Project>
12 <PropertyGroup>
13 <CreateDocumentation Condition=" '$(CreateDocumentationFile)'!='true' ">false</CreateDocumentation>
14 <DocumentationFile Condition=" '$(CreateDocumentationFile)'=='true' ">$(OutputPath)\$(AssemblyName).xml</DocumentationFile>
15 </PropertyGroup>
16
17 <PropertyGroup>
18 <ReplacePackageReferences>true</ReplacePackageReferences>
19 <TheSolutionPath Condition=" '$(NCrunch)'=='' ">$(SolutionPath)</TheSolutionPath>
20 <TheSolutionPath Condition=" '$(NCrunch)'=='1' ">$(NCrunchOriginalSolutionPath)</TheSolutionPath>
21 </PropertyGroup>
22
23 <Choose>
24 <When Condition="$(ReplacePackageReferences) AND '$(TheSolutionPath)' != '' AND '$(TheSolutionPath)' != '*undefined*' AND Exists('$(TheSolutionPath)')">
25
26 <PropertyGroup>
27 <SolutionFileContent>$([System.IO.File]::ReadAllText($(TheSolutionPath)))</SolutionFileContent>
28 <SmartSolutionDir>$([System.IO.Path]::GetDirectoryName( $(TheSolutionPath) ))</SmartSolutionDir>
29 <RegexPattern>(?&lt;="[PackageName]", ")(.*)(?=", ")</RegexPattern>
30 </PropertyGroup>
31
32 <ItemGroup>
33 <!-- Keep the identity of the PackageReference -->
34 <SmartPackageReference Include="@(PackageReference)">
35 <PackageName>%(Identity)</PackageName>
36 <InSolution>$(SolutionFileContent.Contains('\%(Identity).csproj'))</InSolution>
37 </SmartPackageReference>
38
39 <!-- Filter them by mapping them to another ItemGroup using the WithMetadataValue item function -->
40 <PackageInSolution Include="@(SmartPackageReference->WithMetadataValue('InSolution', True))">
41 <Pattern>$(RegexPattern.Replace('[PackageName]','%(PackageName)') )</Pattern>
42 <SmartPath>$([System.Text.RegularExpressions.Regex]::Match('$(SolutionFileContent)', '%(Pattern)'))</SmartPath>
43 </PackageInSolution>
44
45 <ProjectReference Include="@(PackageInSolution->'$(SmartSolutionDir)\%(SmartPath)' )"/>
46
47 <!-- Remove the package references that are now referenced as projects -->
48 <PackageReference Remove="@(PackageInSolution->'%(PackageName)' )"/>
49 </ItemGroup>
50
51 </When>
52 </Choose>
53
54 <Import Project="Wix.Build.targets" Condition=" Exists('Wix.Build.targets') And '$(MSBuildProjectExtension)'=='.wixproj' " />
55 <Import Project="Custom.Build.targets" Condition=" Exists('Custom.Build.targets') " />
56</Project>
diff --git a/src/ext/Bal/README.md b/src/ext/Bal/README.md
new file mode 100644
index 00000000..cc5d9b34
--- /dev/null
+++ b/src/ext/Bal/README.md
@@ -0,0 +1,2 @@
1# Bal.wixext
2WixToolset.Bal.wixext - Bootstrapper Application Layer WiX Toolset Extension
diff --git a/src/ext/Bal/Samples/bafunctions/Readme.txt b/src/ext/Bal/Samples/bafunctions/Readme.txt
new file mode 100644
index 00000000..517d0d4c
--- /dev/null
+++ b/src/ext/Bal/Samples/bafunctions/Readme.txt
@@ -0,0 +1,85 @@
1
2This is a sample project showing how to create a BA function assembly.
3
4The four interfaces are in the WixSampleBAFunctions.cpp file.
5
6
7Example code:
8~~~~~~~~~~~~~
9
10
11 HRESULT hr = S_OK;
12 HKEY hkKey = NULL;
13 LPWSTR sczValue = NULL;
14 LPWSTR sczFormatedValue = NULL;
15
16
17 //---------------------------------------------------------------------------------------------
18 // Example of BA function failure
19 hr = E_NOTIMPL;
20 BalExitOnFailure(hr, "Test failure.");
21 //---------------------------------------------------------------------------------------------
22
23 //---------------------------------------------------------------------------------------------
24 // Example of setting a variables
25 hr = m_pEngine->SetVariableString(L"Variable1", L"String value");
26 BalExitOnFailure(hr, "Failed to set variable.");
27 hr = m_pEngine->SetVariableNumeric(L"Variable2", 1234);
28 BalExitOnFailure(hr, "Failed to set variable.");
29 //---------------------------------------------------------------------------------------------
30
31 //---------------------------------------------------------------------------------------------
32 // Example of reading burn variable.
33 BalGetStringVariable(L"WixBundleName", &sczValue);
34 BalExitOnFailure(hr, "Failed to get variable.");
35
36 hr = m_pEngine->SetVariableString(L"Variable4", sczValue);
37 BalExitOnFailure(hr, "Failed to set variable.");
38 //---------------------------------------------------------------------------------------------
39
40 ReleaseNullStr(sczValue); // Release string so it can be re-used
41
42 //---------------------------------------------------------------------------------------------
43 // Examples of reading burn variable and formatting it.
44 BalGetStringVariable(L"InstallFolder", &sczValue);
45 BalExitOnFailure(hr, "Failed to get variable.");
46
47 hr = m_pEngine->SetVariableString(L"Variable5", sczValue);
48 BalExitOnFailure(hr, "Failed to set variable.");
49
50 BalFormatString(sczValue, &sczFormatedValue);
51 BalExitOnFailure(hr, "Failed to format variable.");
52
53 hr = m_pEngine->SetVariableString(L"Variable6", sczFormatedValue);
54 BalExitOnFailure(hr, "Failed to set variable.");
55 //---------------------------------------------------------------------------------------------
56
57 ReleaseNullStr(sczValue); // Release string so it can be re-used
58
59 //---------------------------------------------------------------------------------------------
60 // Example of reading 64 bit registry and setting the InstallFolder variable to the value read.
61 hr = RegOpen(HKEY_LOCAL_MACHINE, L"SOFTWARE\\Microsoft\\NET Framework Setup\\NDP\\v3.5", KEY_READ | KEY_WOW64_64KEY, &hkKey);
62 BalExitOnFailure(hr, "Failed to open registry key.");
63
64 hr = RegReadString(hkKey, L"InstallPath", &sczValue);
65 BalExitOnFailure(hr, "Failed to read registry value.");
66
67 // Example of function call
68 PathBackslashTerminate(&sczValue);
69
70 hr = m_pEngine->SetVariableString(L"InstallFolder", sczValue);
71 BalExitOnFailure(hr, "Failed to set variable.");
72 //---------------------------------------------------------------------------------------------
73
74 ReleaseNullStr(sczValue); // Release string so it can be re-used
75
76 //---------------------------------------------------------------------------------------------
77 // Example of calling a function that return HRESULT
78 hr = GetFileVersion();
79 BalExitOnFailure(hr, "Failed to get version.");
80 //---------------------------------------------------------------------------------------------
81
82 LExit:
83 ReleaseRegKey(hkKey);
84 ReleaseStr(sczValue);
85 ReleaseStr(sczFormatedValue);
diff --git a/src/ext/Bal/Samples/bafunctions/WixSampleBAFunctions.cpp b/src/ext/Bal/Samples/bafunctions/WixSampleBAFunctions.cpp
new file mode 100644
index 00000000..531b86a3
--- /dev/null
+++ b/src/ext/Bal/Samples/bafunctions/WixSampleBAFunctions.cpp
@@ -0,0 +1,95 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3#include "precomp.h"
4#include "BalBaseBAFunctions.h"
5#include "BalBaseBAFunctionsProc.h"
6
7class CWixSampleBAFunctions : public CBalBaseBAFunctions
8{
9public: // IBootstrapperApplication
10 virtual STDMETHODIMP OnDetectBegin(
11 __in BOOL fInstalled,
12 __in DWORD cPackages,
13 __inout BOOL* pfCancel
14 )
15 {
16 HRESULT hr = S_OK;
17
18 BalLog(BOOTSTRAPPER_LOG_LEVEL_STANDARD, "Running detect begin BA function. fInstalled=%d, cPackages=%u, fCancel=%d", fInstalled, cPackages, *pfCancel);
19
20 //-------------------------------------------------------------------------------------------------
21 // YOUR CODE GOES HERE
22 BalExitOnFailure(hr, "Change this message to represent real error handling.");
23 //-------------------------------------------------------------------------------------------------
24
25 LExit:
26 return hr;
27 }
28
29public: // IBAFunctions
30 virtual STDMETHODIMP OnPlanBegin(
31 __in DWORD cPackages,
32 __inout BOOL* pfCancel
33 )
34 {
35 HRESULT hr = S_OK;
36
37 BalLog(BOOTSTRAPPER_LOG_LEVEL_STANDARD, "Running plan begin BA function. cPackages=%u, fCancel=%d", cPackages, *pfCancel);
38
39 //-------------------------------------------------------------------------------------------------
40 // YOUR CODE GOES HERE
41 BalExitOnFailure(hr, "Change this message to represent real error handling.");
42 //-------------------------------------------------------------------------------------------------
43
44 LExit:
45 return hr;
46 }
47
48public:
49 //
50 // Constructor - initialize member variables.
51 //
52 CWixSampleBAFunctions(
53 __in HMODULE hModule,
54 __in IBootstrapperEngine* pEngine,
55 __in const BA_FUNCTIONS_CREATE_ARGS* pArgs
56 ) : CBalBaseBAFunctions(hModule, pEngine, pArgs)
57 {
58 }
59
60 //
61 // Destructor - release member variables.
62 //
63 ~CWixSampleBAFunctions()
64 {
65 }
66};
67
68
69HRESULT WINAPI CreateBAFunctions(
70 __in HMODULE hModule,
71 __in const BA_FUNCTIONS_CREATE_ARGS* pArgs,
72 __inout BA_FUNCTIONS_CREATE_RESULTS* pResults
73 )
74{
75 HRESULT hr = S_OK;
76 CWixSampleBAFunctions* pBAFunctions = NULL;
77 IBootstrapperEngine* pEngine = NULL;
78
79 // This is required to enable logging functions.
80 hr = BalInitializeFromCreateArgs(pArgs->pBootstrapperCreateArgs, &pEngine);
81 ExitOnFailure(hr, "Failed to initialize Bal.");
82
83 pBAFunctions = new CWixSampleBAFunctions(hModule, pEngine, pArgs);
84 ExitOnNull(pBAFunctions, hr, E_OUTOFMEMORY, "Failed to create new CWixSampleBAFunctions object.");
85
86 pResults->pfnBAFunctionsProc = BalBaseBAFunctionsProc;
87 pResults->pvBAFunctionsProcContext = pBAFunctions;
88 pBAFunctions = NULL;
89
90LExit:
91 ReleaseObject(pBAFunctions);
92 ReleaseObject(pEngine);
93
94 return hr;
95}
diff --git a/src/ext/Bal/Samples/bafunctions/bafunctions.cpp b/src/ext/Bal/Samples/bafunctions/bafunctions.cpp
new file mode 100644
index 00000000..b20f4230
--- /dev/null
+++ b/src/ext/Bal/Samples/bafunctions/bafunctions.cpp
@@ -0,0 +1,46 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3#include "precomp.h"
4
5static HINSTANCE vhInstance = NULL;
6
7extern "C" BOOL WINAPI DllMain(
8 IN HINSTANCE hInstance,
9 IN DWORD dwReason,
10 IN LPVOID /* pvReserved */
11 )
12{
13 switch (dwReason)
14 {
15 case DLL_PROCESS_ATTACH:
16 ::DisableThreadLibraryCalls(hInstance);
17 vhInstance = hInstance;
18 break;
19
20 case DLL_PROCESS_DETACH:
21 vhInstance = NULL;
22 break;
23 }
24
25 return TRUE;
26}
27
28extern "C" HRESULT WINAPI BAFunctionsCreate(
29 __in const BA_FUNCTIONS_CREATE_ARGS* pArgs,
30 __inout BA_FUNCTIONS_CREATE_RESULTS* pResults
31 )
32{
33 HRESULT hr = S_OK;
34
35 hr = CreateBAFunctions(vhInstance, pArgs, pResults);
36 BalExitOnFailure(hr, "Failed to create BAFunctions interface.");
37
38LExit:
39 return hr;
40}
41
42extern "C" void WINAPI BAFunctionsDestroy(
43 )
44{
45 BalUninitialize();
46}
diff --git a/src/ext/Bal/Samples/bafunctions/bafunctions.def b/src/ext/Bal/Samples/bafunctions/bafunctions.def
new file mode 100644
index 00000000..6e016dad
--- /dev/null
+++ b/src/ext/Bal/Samples/bafunctions/bafunctions.def
@@ -0,0 +1,6 @@
1; Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3
4EXPORTS
5 BAFunctionsCreate
6 BAFunctionsDestroy
diff --git a/src/ext/Bal/Samples/bafunctions/bafunctions.vcxproj b/src/ext/Bal/Samples/bafunctions/bafunctions.vcxproj
new file mode 100644
index 00000000..640c812d
--- /dev/null
+++ b/src/ext/Bal/Samples/bafunctions/bafunctions.vcxproj
@@ -0,0 +1,81 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3
4<Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
5 <Import Project="..\..\..\packages\WixToolset.BalUtil.4.0.58\build\WixToolset.BalUtil.props" Condition="Exists('..\..\..\packages\WixToolset.BalUtil.4.0.58\build\WixToolset.BalUtil.props')" />
6 <Import Project="..\..\..\packages\WixToolset.BootstrapperCore.Native.4.0.141\build\WixToolset.BootstrapperCore.Native.props" Condition="Exists('..\..\..\packages\WixToolset.BootstrapperCore.Native.4.0.141\build\WixToolset.BootstrapperCore.Native.props')" />
7 <Import Project="..\..\..\packages\WixToolset.DUtil.4.0.72\build\WixToolset.DUtil.props" Condition="Exists('..\..\..\packages\WixToolset.DUtil.4.0.72\build\WixToolset.DUtil.props')" />
8
9 <ItemGroup Label="ProjectConfigurations">
10 <ProjectConfiguration Include="Debug|ARM64">
11 <Configuration>Debug</Configuration>
12 <Platform>ARM64</Platform>
13 </ProjectConfiguration>
14 <ProjectConfiguration Include="Release|ARM64">
15 <Configuration>Release</Configuration>
16 <Platform>ARM64</Platform>
17 </ProjectConfiguration>
18 <ProjectConfiguration Include="Debug|Win32">
19 <Configuration>Debug</Configuration>
20 <Platform>Win32</Platform>
21 </ProjectConfiguration>
22 <ProjectConfiguration Include="Release|Win32">
23 <Configuration>Release</Configuration>
24 <Platform>Win32</Platform>
25 </ProjectConfiguration>
26 <ProjectConfiguration Include="Debug|x64">
27 <Configuration>Debug</Configuration>
28 <Platform>x64</Platform>
29 </ProjectConfiguration>
30 <ProjectConfiguration Include="Release|x64">
31 <Configuration>Release</Configuration>
32 <Platform>x64</Platform>
33 </ProjectConfiguration>
34 </ItemGroup>
35
36 <PropertyGroup Label="Globals">
37 <ProjectGuid>{EB0A7D51-2133-4EE7-B6CA-87DBEAC67E02}</ProjectGuid>
38 <ConfigurationType>DynamicLibrary</ConfigurationType>
39 <PlatformToolset>v142</PlatformToolset>
40 <CharacterSet>Unicode</CharacterSet>
41 <TargetName>BAFunctions</TargetName>
42 <ProjectModuleDefinitionFile>bafunctions.def</ProjectModuleDefinitionFile>
43 </PropertyGroup>
44
45 <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
46 <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
47
48 <PropertyGroup>
49 <ProjectAdditionalLinkLibraries>comctl32.lib;gdiplus.lib;msimg32.lib;shlwapi.lib;wininet.lib</ProjectAdditionalLinkLibraries>
50 </PropertyGroup>
51 <ItemGroup>
52 <ClCompile Include="WixSampleBAFunctions.cpp" />
53 <ClCompile Include="bafunctions.cpp">
54 <PrecompiledHeader>Create</PrecompiledHeader>
55 </ClCompile>
56 </ItemGroup>
57 <ItemGroup>
58 <ClInclude Include="precomp.h" />
59 <ClInclude Include="resource.h" />
60 </ItemGroup>
61 <ItemGroup>
62 <None Include="bafunctions.def" />
63 <None Include="Readme.txt" />
64 </ItemGroup>
65
66 <ItemGroup>
67 <None Include="packages.config" />
68 </ItemGroup>
69
70 <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
71 <Import Project="..\..\..\packages\Nerdbank.GitVersioning.3.3.37\build\Nerdbank.GitVersioning.targets" Condition="Exists('..\..\..\packages\Nerdbank.GitVersioning.3.3.37\build\Nerdbank.GitVersioning.targets')" />
72 <Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
73 <PropertyGroup>
74 <ErrorText>This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
75 </PropertyGroup>
76 <Error Condition="!Exists('..\..\..\packages\WixToolset.BalUtil.4.0.58\build\WixToolset.BalUtil.props')" Text="$([System.String]::Format('$(ErrorText)', '..\..\..\packages\WixToolset.BalUtil.4.0.58\build\WixToolset.BalUtil.props'))" />
77 <Error Condition="!Exists('..\..\..\packages\WixToolset.BootstrapperCore.Native.4.0.141\build\WixToolset.BootstrapperCore.Native.props')" Text="$([System.String]::Format('$(ErrorText)', '..\..\..\packages\WixToolset.BootstrapperCore.Native.4.0.141\build\WixToolset.BootstrapperCore.Native.props'))" />
78 <Error Condition="!Exists('..\..\..\packages\WixToolset.DUtil.4.0.72\build\WixToolset.DUtil.props')" Text="$([System.String]::Format('$(ErrorText)', '..\..\..\packages\WixToolset.DUtil.4.0.72\build\WixToolset.DUtil.props'))" />
79 <Error Condition="!Exists('..\..\..\packages\Nerdbank.GitVersioning.3.3.37\build\Nerdbank.GitVersioning.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\..\..\packages\Nerdbank.GitVersioning.3.3.37\build\Nerdbank.GitVersioning.targets'))" />
80 </Target>
81</Project>
diff --git a/src/ext/Bal/Samples/bafunctions/packages.config b/src/ext/Bal/Samples/bafunctions/packages.config
new file mode 100644
index 00000000..548ddb48
--- /dev/null
+++ b/src/ext/Bal/Samples/bafunctions/packages.config
@@ -0,0 +1,7 @@
1<?xml version="1.0" encoding="utf-8"?>
2<packages>
3 <package id="Nerdbank.GitVersioning" version="3.3.37" targetFramework="native" developmentDependency="true" />
4 <package id="WixToolset.BootstrapperCore.Native" version="4.0.141" targetFramework="native" />
5 <package id="WixToolset.BalUtil" version="4.0.58" targetFramework="native" />
6 <package id="WixToolset.DUtil" version="4.0.72" targetFramework="native" />
7</packages> \ No newline at end of file
diff --git a/src/ext/Bal/Samples/bafunctions/precomp.h b/src/ext/Bal/Samples/bafunctions/precomp.h
new file mode 100644
index 00000000..9d2fe726
--- /dev/null
+++ b/src/ext/Bal/Samples/bafunctions/precomp.h
@@ -0,0 +1,52 @@
1#pragma once
2// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
3
4
5#include <windows.h>
6
7#pragma warning(push)
8#pragma warning(disable:4458) // declaration of 'xxx' hides class member
9#include <gdiplus.h>
10#pragma warning(pop)
11
12#include <msiquery.h>
13#include <objbase.h>
14#include <shlobj.h>
15#include <shlwapi.h>
16#include <stdlib.h>
17#include <strsafe.h>
18#include <CommCtrl.h>
19
20// Standard WiX header files, include as required
21#include "dutil.h"
22//#include "memutil.h"
23//#include "dictutil.h"
24//#include "dirutil.h"
25#include "fileutil.h"
26#include "locutil.h"
27//#include "logutil.h"
28#include "pathutil.h"
29//#include "resrutil.h"
30//#include "shelutil.h"
31#include "strutil.h"
32#include "thmutil.h"
33//#include "uriutil.h"
34//#include "xmlutil.h"
35#include "regutil.h"
36
37//#include "IBootstrapperEngine.h"
38//#include "IBootstrapperApplication.h"
39
40#include "BalBaseBootstrapperApplication.h"
41//#include "balinfo.h"
42//#include "balcondition.h"
43#include "balutil.h"
44
45#include "BAFunctions.h"
46#include "IBAFunctions.h"
47
48HRESULT WINAPI CreateBAFunctions(
49 __in HMODULE hModule,
50 __in const BA_FUNCTIONS_CREATE_ARGS* pArgs,
51 __inout BA_FUNCTIONS_CREATE_RESULTS* pResults
52 );
diff --git a/src/ext/Bal/Samples/bafunctions/resource.h b/src/ext/Bal/Samples/bafunctions/resource.h
new file mode 100644
index 00000000..149a8ff4
--- /dev/null
+++ b/src/ext/Bal/Samples/bafunctions/resource.h
@@ -0,0 +1,15 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3#define IDC_STATIC -1
4
5
6// Next default values for new objects
7//
8#ifdef APSTUDIO_INVOKED
9#ifndef APSTUDIO_READONLY_SYMBOLS
10#define _APS_NEXT_RESOURCE_VALUE 102
11#define _APS_NEXT_COMMAND_VALUE 40001
12#define _APS_NEXT_CONTROL_VALUE 1003
13#define _APS_NEXT_SYMED_VALUE 101
14#endif
15#endif
diff --git a/src/ext/Bal/WixToolset.Dnc.Host/BootstrapperApplicationFactory.cs b/src/ext/Bal/WixToolset.Dnc.Host/BootstrapperApplicationFactory.cs
new file mode 100644
index 00000000..d38fd1a9
--- /dev/null
+++ b/src/ext/Bal/WixToolset.Dnc.Host/BootstrapperApplicationFactory.cs
@@ -0,0 +1,89 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Dnc.Host
4{
5 using System;
6 using System.Linq;
7 using System.Reflection;
8 using System.Runtime.InteropServices;
9
10 delegate IBootstrapperApplicationFactory StaticEntryDelegate([MarshalAs(UnmanagedType.LPWStr)] string baFactoryAssemblyName, [MarshalAs(UnmanagedType.LPWStr)] string baFactoryAssemblyPath);
11
12 /// <summary>
13 /// Entry point for the .NET Core host to create and return the BA to the engine.
14 /// Reflection is used instead of referencing WixToolset.Mba.Core directly to avoid requiring it in the AssemblyLoadContext.
15 /// </summary>
16 public sealed class BootstrapperApplicationFactory : IBootstrapperApplicationFactory
17 {
18 private string baFactoryAssemblyName;
19 private string baFactoryAssemblyPath;
20
21 public BootstrapperApplicationFactory(string baFactoryAssemblyName, string baFactoryAssemblyPath)
22 {
23 this.baFactoryAssemblyName = baFactoryAssemblyName;
24 this.baFactoryAssemblyPath = baFactoryAssemblyPath;
25 }
26
27 /// <summary>
28 /// Loads the bootstrapper application assembly and calls its IBootstrapperApplicationFactory.Create method.
29 /// </summary>
30 /// <param name="pArgs">Pointer to BOOTSTRAPPER_CREATE_ARGS struct.</param>
31 /// <param name="pResults">Pointer to BOOTSTRAPPER_CREATE_RESULTS struct.</param>
32 /// <exception cref="MissingAttributeException">The bootstrapper application assembly
33 /// does not define the <see cref="BootstrapperApplicationFactoryAttribute"/>.</exception>
34 public void Create(IntPtr pArgs, IntPtr pResults)
35 {
36 // Load the BA's IBootstrapperApplicationFactory.
37 var baFactoryType = BootstrapperApplicationFactory.GetBAFactoryTypeFromAssembly(this.baFactoryAssemblyName, this.baFactoryAssemblyPath);
38 var baFactory = Activator.CreateInstance(baFactoryType);
39 if (null == baFactory)
40 {
41 throw new InvalidBootstrapperApplicationFactoryException();
42 }
43
44 var createMethod = baFactoryType.GetMethod(nameof(Create), new[] { typeof(IntPtr), typeof(IntPtr) });
45 if (null == createMethod)
46 {
47 throw new InvalidBootstrapperApplicationFactoryException();
48 }
49 createMethod.Invoke(baFactory, new object[] { pArgs, pResults });
50 }
51
52 /// <summary>
53 /// Locates the <see cref="BootstrapperApplicationFactoryAttribute"/> and returns the specified type.
54 /// </summary>
55 /// <param name="assemblyName">The assembly that defines the IBootstrapperApplicationFactory implementation.</param>
56 /// <returns>The bootstrapper application factory <see cref="Type"/>.</returns>
57 private static Type GetBAFactoryTypeFromAssembly(string assemblyName, string assemblyPath)
58 {
59 // The default ALC shouldn't need help loading the assembly, since the host should have provided the deps.json
60 // when starting the runtime. But it doesn't hurt so keep this in case an isolated ALC is ever needed.
61 var alc = new DnchostAssemblyLoadContext(assemblyPath, false);
62 var asm = alc.LoadFromAssemblyName(new AssemblyName(assemblyName));
63
64 var attr = asm.GetCustomAttributes()
65 .Where(a => a.GetType().FullName == "WixToolset.Mba.Core.BootstrapperApplicationFactoryAttribute")
66 .SingleOrDefault();
67
68 if (null == attr)
69 {
70 throw new MissingAttributeException();
71 }
72
73 var baFactoryTypeProperty = attr.GetType().GetProperty("BootstrapperApplicationFactoryType", typeof(Type));
74 if (baFactoryTypeProperty == null || baFactoryTypeProperty.GetMethod == null)
75 {
76 throw new MissingAttributeException();
77 }
78
79 var baFactoryType = (Type)baFactoryTypeProperty.GetMethod.Invoke(attr, null);
80 return baFactoryType;
81 }
82
83 // Entry point for the DNC host.
84 public static IBootstrapperApplicationFactory CreateBAFactory([MarshalAs(UnmanagedType.LPWStr)] string baFactoryAssemblyName, [MarshalAs(UnmanagedType.LPWStr)] string baFactoryAssemblyPath)
85 {
86 return new BootstrapperApplicationFactory(baFactoryAssemblyName, baFactoryAssemblyPath);
87 }
88 }
89}
diff --git a/src/ext/Bal/WixToolset.Dnc.Host/DnchostAssemblyLoadContext.cs b/src/ext/Bal/WixToolset.Dnc.Host/DnchostAssemblyLoadContext.cs
new file mode 100644
index 00000000..1a383058
--- /dev/null
+++ b/src/ext/Bal/WixToolset.Dnc.Host/DnchostAssemblyLoadContext.cs
@@ -0,0 +1,58 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Dnc.Host
4{
5 using System;
6 using System.Reflection;
7 using System.Runtime.Loader;
8
9 public sealed class DnchostAssemblyLoadContext : AssemblyLoadContext
10 {
11 private readonly AssemblyDependencyResolver resolver;
12
13 public DnchostAssemblyLoadContext(string assemblyPath, bool isolateFromDefault)
14 : base(nameof(DnchostAssemblyLoadContext), isolateFromDefault)
15 {
16 this.resolver = new AssemblyDependencyResolver(assemblyPath);
17
18 if (!this.IsCollectible)
19 {
20 AssemblyLoadContext.Default.Resolving += this.ResolveAssembly;
21 AssemblyLoadContext.Default.ResolvingUnmanagedDll += this.ResolveUnmanagedDll;
22 }
23 }
24
25 private Assembly ResolveAssembly(AssemblyLoadContext defaultAlc, AssemblyName assemblyName)
26 {
27 var path = this.resolver.ResolveAssemblyToPath(assemblyName);
28 if (path != null)
29 {
30 var targetAlc = this.IsCollectible ? this : defaultAlc;
31 return targetAlc.LoadFromAssemblyPath(path);
32 }
33
34 return null;
35 }
36
37 private IntPtr ResolveUnmanagedDll(Assembly assembly, string unmanagedDllName)
38 {
39 var path = this.resolver.ResolveUnmanagedDllToPath(unmanagedDllName);
40 if (path != null)
41 {
42 return this.LoadUnmanagedDllFromPath(path);
43 }
44
45 return IntPtr.Zero;
46 }
47
48 protected override Assembly Load(AssemblyName assemblyName)
49 {
50 return this.ResolveAssembly(AssemblyLoadContext.Default, assemblyName);
51 }
52
53 protected override IntPtr LoadUnmanagedDll(string unmanagedDllName)
54 {
55 return this.ResolveUnmanagedDll(null, unmanagedDllName);
56 }
57 }
58}
diff --git a/src/ext/Bal/WixToolset.Dnc.Host/Exceptions.cs b/src/ext/Bal/WixToolset.Dnc.Host/Exceptions.cs
new file mode 100644
index 00000000..32d4d4c5
--- /dev/null
+++ b/src/ext/Bal/WixToolset.Dnc.Host/Exceptions.cs
@@ -0,0 +1,145 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Dnc.Host
4{
5 using System;
6 using System.Runtime.Serialization;
7
8 /// <summary>
9 /// Base class for exception returned to the bootstrapper application host.
10 /// </summary>
11 [Serializable]
12 public abstract class BootstrapperException : Exception
13 {
14 /// <summary>
15 /// Creates an instance of the <see cref="BootstrapperException"/> base class with the given HRESULT.
16 /// </summary>
17 /// <param name="hr">The HRESULT for the exception that is used by the bootstrapper application host.</param>
18 public BootstrapperException(int hr)
19 {
20 this.HResult = hr;
21 }
22
23 /// <summary>
24 /// Initializes a new instance of the <see cref="BootstrapperException"/> class.
25 /// </summary>
26 /// <param name="message">Exception message.</param>
27 public BootstrapperException(string message)
28 : base(message)
29 {
30 }
31
32 /// <summary>
33 /// Initializes a new instance of the <see cref="BootstrapperException"/> class.
34 /// </summary>
35 /// <param name="message">Exception message</param>
36 /// <param name="innerException">Inner exception associated with this one</param>
37 public BootstrapperException(string message, Exception innerException)
38 : base(message, innerException)
39 {
40 }
41
42 /// <summary>
43 /// Initializes a new instance of the <see cref="BootstrapperException"/> class.
44 /// </summary>
45 /// <param name="info">Serialization information for this exception</param>
46 /// <param name="context">Streaming context to serialize to</param>
47 protected BootstrapperException(SerializationInfo info, StreamingContext context)
48 : base(info, context)
49 {
50 }
51 }
52
53 /// <summary>
54 /// The bootstrapper application assembly loaded by the host does not contain exactly one instance of the
55 /// <see cref="Core.BootstrapperApplicationFactoryAttribute"/> class.
56 /// </summary>
57 /// <seealso cref="Core.BootstrapperApplicationFactoryAttribute"/>
58 [Serializable]
59 public class MissingAttributeException : BootstrapperException
60 {
61 /// <summary>
62 /// Creates a new instance of the <see cref="MissingAttributeException"/> class.
63 /// </summary>
64 public MissingAttributeException()
65 : base(NativeMethods.E_NOTFOUND)
66 {
67 }
68
69 /// <summary>
70 /// Initializes a new instance of the <see cref="MissingAttributeException"/> class.
71 /// </summary>
72 /// <param name="message">Exception message.</param>
73 public MissingAttributeException(string message)
74 : base(message)
75 {
76 }
77
78 /// <summary>
79 /// Initializes a new instance of the <see cref="MissingAttributeException"/> class.
80 /// </summary>
81 /// <param name="message">Exception message</param>
82 /// <param name="innerException">Inner exception associated with this one</param>
83 public MissingAttributeException(string message, Exception innerException)
84 : base(message, innerException)
85 {
86 }
87
88 /// <summary>
89 /// Initializes a new instance of the <see cref="MissingAttributeException"/> class.
90 /// </summary>
91 /// <param name="info">Serialization information for this exception</param>
92 /// <param name="context">Streaming context to serialize to</param>
93 protected MissingAttributeException(SerializationInfo info, StreamingContext context)
94 : base(info, context)
95 {
96 }
97 }
98
99 /// <summary>
100 /// The bootstrapper application factory specified by the <see cref="Core.BootstrapperApplicationFactoryAttribute"/>
101 /// does not extend the <see cref="Core.IBootstrapperApplicationFactory"/> base class.
102 /// </summary>
103 /// <seealso cref="Core.BaseBootstrapperApplicationFactory"/>
104 /// <seealso cref="Core.BootstrapperApplicationFactoryAttribute"/>
105 [Serializable]
106 public class InvalidBootstrapperApplicationFactoryException : BootstrapperException
107 {
108 /// <summary>
109 /// Creates a new instance of the <see cref="InvalidBootstrapperApplicationFactoryException"/> class.
110 /// </summary>
111 public InvalidBootstrapperApplicationFactoryException()
112 : base(NativeMethods.E_UNEXPECTED)
113 {
114 }
115
116 /// <summary>
117 /// Initializes a new instance of the <see cref="InvalidBootstrapperApplicationFactoryException"/> class.
118 /// </summary>
119 /// <param name="message">Exception message.</param>
120 public InvalidBootstrapperApplicationFactoryException(string message)
121 : base(message)
122 {
123 }
124
125 /// <summary>
126 /// Initializes a new instance of the <see cref="InvalidBootstrapperApplicationFactoryException"/> class.
127 /// </summary>
128 /// <param name="message">Exception message</param>
129 /// <param name="innerException">Inner exception associated with this one</param>
130 public InvalidBootstrapperApplicationFactoryException(string message, Exception innerException)
131 : base(message, innerException)
132 {
133 }
134
135 /// <summary>
136 /// Initializes a new instance of the <see cref="InvalidBootstrapperApplicationFactoryException"/> class.
137 /// </summary>
138 /// <param name="info">Serialization information for this exception</param>
139 /// <param name="context">Streaming context to serialize to</param>
140 protected InvalidBootstrapperApplicationFactoryException(SerializationInfo info, StreamingContext context)
141 : base(info, context)
142 {
143 }
144 }
145}
diff --git a/src/ext/Bal/WixToolset.Dnc.Host/IBootstrapperApplicationFactory.cs b/src/ext/Bal/WixToolset.Dnc.Host/IBootstrapperApplicationFactory.cs
new file mode 100644
index 00000000..96731192
--- /dev/null
+++ b/src/ext/Bal/WixToolset.Dnc.Host/IBootstrapperApplicationFactory.cs
@@ -0,0 +1,16 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Dnc.Host
4{
5 using System;
6 using System.Runtime.InteropServices;
7
8 [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
9 public interface IBootstrapperApplicationFactory
10 {
11 void Create(
12 IntPtr pArgs,
13 IntPtr pResults
14 );
15 }
16}
diff --git a/src/ext/Bal/WixToolset.Dnc.Host/NativeMethods.cs b/src/ext/Bal/WixToolset.Dnc.Host/NativeMethods.cs
new file mode 100644
index 00000000..6dc393c6
--- /dev/null
+++ b/src/ext/Bal/WixToolset.Dnc.Host/NativeMethods.cs
@@ -0,0 +1,18 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Dnc.Host
4{
5 using System;
6 using System.Runtime.InteropServices;
7
8 /// <summary>
9 /// Contains native constants, functions, and structures for this assembly.
10 /// </summary>
11 internal static class NativeMethods
12 {
13 #region Error Constants
14 internal const int E_NOTFOUND = unchecked((int)0x80070490);
15 internal const int E_UNEXPECTED = unchecked((int)0x8000ffff);
16 #endregion
17 }
18}
diff --git a/src/ext/Bal/WixToolset.Dnc.Host/WixToolset.Dnc.Host.csproj b/src/ext/Bal/WixToolset.Dnc.Host/WixToolset.Dnc.Host.csproj
new file mode 100644
index 00000000..f347ca0b
--- /dev/null
+++ b/src/ext/Bal/WixToolset.Dnc.Host/WixToolset.Dnc.Host.csproj
@@ -0,0 +1,44 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3
4<Project Sdk="Microsoft.NET.Sdk">
5 <PropertyGroup>
6 <TargetFramework>netcoreapp3.1</TargetFramework>
7 <RootNamespace>WixToolset.Dnc.Host</RootNamespace>
8 <Description>WiX Toolset .NET Core BA Host</Description>
9 <Title>WiX Toolset .NET Core BA Host</Title>
10 <DebugType>embedded</DebugType>
11 <PlatformTarget>AnyCPU</PlatformTarget>
12 </PropertyGroup>
13
14 <ItemGroup>
15 <HeaderPath Include="$(BaseOutputPath)obj\$(AssemblyName).h">
16 <Visible>False</Visible>
17 </HeaderPath>
18 </ItemGroup>
19
20 <Target Name="GenerateIdentityHeader" AfterTargets="Build" Inputs="$(TargetPath)" Outputs="@(HeaderPath)">
21 <GetAssemblyIdentity AssemblyFiles="$(TargetPath)">
22 <Output TaskParameter="Assemblies" ItemName="AssemblyIdentity" />
23 </GetAssemblyIdentity>
24 <ItemGroup>
25 <Line Include='#define DNC_ASSEMBLY_FILE_NAME L"$(AssemblyName).dll"' />
26 <Line Include='#define DNC_ASSEMBLY_FULL_NAME "%(AssemblyIdentity.Identity)"' />
27 <Line Include='#define DNC_ENTRY_TYPE "$(RootNamespace).BootstrapperApplicationFactory"' />
28 <Line Include='#define DNC_ENTRY_TYPEW L"$(RootNamespace).BootstrapperApplicationFactory,$(AssemblyName)"' />
29 <Line Include='#define DNC_STATIC_ENTRY_METHOD "CreateBAFactory"' />
30 <Line Include='#define DNC_STATIC_ENTRY_METHODW L"CreateBAFactory"' />
31 <Line Include='#define DNC_STATIC_ENTRY_DELEGATEW L"$(RootNamespace).StaticEntryDelegate,$(AssemblyName)"' />
32 </ItemGroup>
33 <Message Importance="normal" Text="Generating identity definitions into @(HeaderPath->'%(FullPath)')" />
34 <WriteLinesToFile File="@(HeaderPath)" Lines="@(Line)" Overwrite="True" />
35 <ItemGroup>
36 <FileWrites Include="@(HeaderPath)" />
37 </ItemGroup>
38 </Target>
39
40 <ItemGroup>
41 <PackageReference Include="Microsoft.SourceLink.GitHub" Version="1.0.0" PrivateAssets="all" />
42 <PackageReference Include="Nerdbank.GitVersioning" Version="3.3.37" PrivateAssets="all" />
43 </ItemGroup>
44</Project>
diff --git a/src/ext/Bal/WixToolset.Mba.Host/BootstrapperApplicationFactory.cs b/src/ext/Bal/WixToolset.Mba.Host/BootstrapperApplicationFactory.cs
new file mode 100644
index 00000000..78e68bd9
--- /dev/null
+++ b/src/ext/Bal/WixToolset.Mba.Host/BootstrapperApplicationFactory.cs
@@ -0,0 +1,86 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Mba.Host
4{
5 using System;
6 using System.Configuration;
7 using System.Reflection;
8 using System.Runtime.InteropServices;
9 using WixToolset.Mba.Core;
10
11 /// <summary>
12 /// Entry point for the managed host to create and return the BA to the engine.
13 /// </summary>
14 [ClassInterface(ClassInterfaceType.None)]
15 public sealed class BootstrapperApplicationFactory : MarshalByRefObject, IBootstrapperApplicationFactory
16 {
17 /// <summary>
18 /// Creates a new instance of the <see cref="BootstrapperApplicationFactory"/> class.
19 /// Entry point for the MBA host.
20 /// </summary>
21 public BootstrapperApplicationFactory()
22 {
23 }
24
25 /// <summary>
26 /// Loads the bootstrapper application assembly and calls its IBootstrapperApplicationFactory.Create method.
27 /// </summary>
28 /// <param name="pArgs">Pointer to BOOTSTRAPPER_CREATE_ARGS struct.</param>
29 /// <param name="pResults">Pointer to BOOTSTRAPPER_CREATE_RESULTS struct.</param>
30 /// <exception cref="MissingAttributeException">The bootstrapper application assembly
31 /// does not define the <see cref="BootstrapperApplicationFactoryAttribute"/>.</exception>
32 public void Create(IntPtr pArgs, IntPtr pResults)
33 {
34 // Get the wix.boostrapper section group to get the name of the bootstrapper application assembly to host.
35 var section = ConfigurationManager.GetSection("wix.bootstrapper/host") as HostSection;
36 if (null == section)
37 {
38 throw new MissingAttributeException(); // TODO: throw a more specific exception than this.
39 }
40
41 // Load the BA's IBootstrapperApplicationFactory.
42 var baFactoryType = BootstrapperApplicationFactory.GetBAFactoryTypeFromAssembly(section.AssemblyName);
43 var baFactory = (IBootstrapperApplicationFactory)Activator.CreateInstance(baFactoryType);
44 if (null == baFactory)
45 {
46 throw new InvalidBootstrapperApplicationFactoryException();
47 }
48
49 baFactory.Create(pArgs, pResults);
50 }
51
52 /// <summary>
53 /// Locates the <see cref="BootstrapperApplicationFactoryAttribute"/> and returns the specified type.
54 /// </summary>
55 /// <param name="assemblyName">The assembly that defines the IBootstrapperApplicationFactory implementation.</param>
56 /// <returns>The bootstrapper application factory <see cref="Type"/>.</returns>
57 private static Type GetBAFactoryTypeFromAssembly(string assemblyName)
58 {
59 Type baFactoryType = null;
60
61 // Load the requested assembly.
62 Assembly asm = AppDomain.CurrentDomain.Load(assemblyName);
63
64 // If an assembly was loaded and is not the current assembly, check for the required attribute.
65 // This is done to avoid using the BootstrapperApplicationFactoryAttribute which we use at build time
66 // to specify the BootstrapperApplicationFactory assembly in the manifest.
67 if (!Assembly.GetExecutingAssembly().Equals(asm))
68 {
69 // There must be one and only one BootstrapperApplicationFactoryAttribute.
70 // The attribute prevents multiple declarations already.
71 var attrs = (BootstrapperApplicationFactoryAttribute[])asm.GetCustomAttributes(typeof(BootstrapperApplicationFactoryAttribute), false);
72 if (null != attrs)
73 {
74 baFactoryType = attrs[0].BootstrapperApplicationFactoryType;
75 }
76 }
77
78 if (null == baFactoryType)
79 {
80 throw new MissingAttributeException();
81 }
82
83 return baFactoryType;
84 }
85 }
86}
diff --git a/src/ext/Bal/WixToolset.Mba.Host/BootstrapperSectionGroup.cs b/src/ext/Bal/WixToolset.Mba.Host/BootstrapperSectionGroup.cs
new file mode 100644
index 00000000..5cf1bc9c
--- /dev/null
+++ b/src/ext/Bal/WixToolset.Mba.Host/BootstrapperSectionGroup.cs
@@ -0,0 +1,29 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Mba.Host
4{
5 using System;
6 using System.Configuration;
7
8 /// <summary>
9 /// Handler for the wix.bootstrapper configuration section group.
10 /// </summary>
11 public class BootstrapperSectionGroup : ConfigurationSectionGroup
12 {
13 /// <summary>
14 /// Creates a new instance of the <see cref="BootstrapperSectionGroup"/> class.
15 /// </summary>
16 public BootstrapperSectionGroup()
17 {
18 }
19
20 /// <summary>
21 /// Gets the <see cref="HostSection"/> handler for the mba configuration section.
22 /// </summary>
23 [ConfigurationProperty("host")]
24 public HostSection Host
25 {
26 get { return (HostSection)base.Sections["host"]; }
27 }
28 }
29}
diff --git a/src/ext/Bal/WixToolset.Mba.Host/Exceptions.cs b/src/ext/Bal/WixToolset.Mba.Host/Exceptions.cs
new file mode 100644
index 00000000..c68951f0
--- /dev/null
+++ b/src/ext/Bal/WixToolset.Mba.Host/Exceptions.cs
@@ -0,0 +1,145 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Mba.Host
4{
5 using System;
6 using System.Runtime.Serialization;
7
8 /// <summary>
9 /// Base class for exception returned to the bootstrapper application host.
10 /// </summary>
11 [Serializable]
12 public abstract class BootstrapperException : Exception
13 {
14 /// <summary>
15 /// Creates an instance of the <see cref="BootstrapperException"/> base class with the given HRESULT.
16 /// </summary>
17 /// <param name="hr">The HRESULT for the exception that is used by the bootstrapper application host.</param>
18 public BootstrapperException(int hr)
19 {
20 this.HResult = hr;
21 }
22
23 /// <summary>
24 /// Initializes a new instance of the <see cref="BootstrapperException"/> class.
25 /// </summary>
26 /// <param name="message">Exception message.</param>
27 public BootstrapperException(string message)
28 : base(message)
29 {
30 }
31
32 /// <summary>
33 /// Initializes a new instance of the <see cref="BootstrapperException"/> class.
34 /// </summary>
35 /// <param name="message">Exception message</param>
36 /// <param name="innerException">Inner exception associated with this one</param>
37 public BootstrapperException(string message, Exception innerException)
38 : base(message, innerException)
39 {
40 }
41
42 /// <summary>
43 /// Initializes a new instance of the <see cref="BootstrapperException"/> class.
44 /// </summary>
45 /// <param name="info">Serialization information for this exception</param>
46 /// <param name="context">Streaming context to serialize to</param>
47 protected BootstrapperException(SerializationInfo info, StreamingContext context)
48 : base(info, context)
49 {
50 }
51 }
52
53 /// <summary>
54 /// The bootstrapper application assembly loaded by the host does not contain exactly one instance of the
55 /// <see cref="Core.BootstrapperApplicationFactoryAttribute"/> class.
56 /// </summary>
57 /// <seealso cref="Core.BootstrapperApplicationFactoryAttribute"/>
58 [Serializable]
59 public class MissingAttributeException : BootstrapperException
60 {
61 /// <summary>
62 /// Creates a new instance of the <see cref="MissingAttributeException"/> class.
63 /// </summary>
64 public MissingAttributeException()
65 : base(NativeMethods.E_NOTFOUND)
66 {
67 }
68
69 /// <summary>
70 /// Initializes a new instance of the <see cref="MissingAttributeException"/> class.
71 /// </summary>
72 /// <param name="message">Exception message.</param>
73 public MissingAttributeException(string message)
74 : base(message)
75 {
76 }
77
78 /// <summary>
79 /// Initializes a new instance of the <see cref="MissingAttributeException"/> class.
80 /// </summary>
81 /// <param name="message">Exception message</param>
82 /// <param name="innerException">Inner exception associated with this one</param>
83 public MissingAttributeException(string message, Exception innerException)
84 : base(message, innerException)
85 {
86 }
87
88 /// <summary>
89 /// Initializes a new instance of the <see cref="MissingAttributeException"/> class.
90 /// </summary>
91 /// <param name="info">Serialization information for this exception</param>
92 /// <param name="context">Streaming context to serialize to</param>
93 protected MissingAttributeException(SerializationInfo info, StreamingContext context)
94 : base(info, context)
95 {
96 }
97 }
98
99 /// <summary>
100 /// The bootstrapper application factory specified by the <see cref="Core.BootstrapperApplicationFactoryAttribute"/>
101 /// does not extend the <see cref="Core.IBootstrapperApplicationFactory"/> base class.
102 /// </summary>
103 /// <seealso cref="Core.BaseBootstrapperApplicationFactory"/>
104 /// <seealso cref="Core.BootstrapperApplicationFactoryAttribute"/>
105 [Serializable]
106 public class InvalidBootstrapperApplicationFactoryException : BootstrapperException
107 {
108 /// <summary>
109 /// Creates a new instance of the <see cref="InvalidBootstrapperApplicationFactoryException"/> class.
110 /// </summary>
111 public InvalidBootstrapperApplicationFactoryException()
112 : base(NativeMethods.E_UNEXPECTED)
113 {
114 }
115
116 /// <summary>
117 /// Initializes a new instance of the <see cref="InvalidBootstrapperApplicationFactoryException"/> class.
118 /// </summary>
119 /// <param name="message">Exception message.</param>
120 public InvalidBootstrapperApplicationFactoryException(string message)
121 : base(message)
122 {
123 }
124
125 /// <summary>
126 /// Initializes a new instance of the <see cref="InvalidBootstrapperApplicationFactoryException"/> class.
127 /// </summary>
128 /// <param name="message">Exception message</param>
129 /// <param name="innerException">Inner exception associated with this one</param>
130 public InvalidBootstrapperApplicationFactoryException(string message, Exception innerException)
131 : base(message, innerException)
132 {
133 }
134
135 /// <summary>
136 /// Initializes a new instance of the <see cref="InvalidBootstrapperApplicationFactoryException"/> class.
137 /// </summary>
138 /// <param name="info">Serialization information for this exception</param>
139 /// <param name="context">Streaming context to serialize to</param>
140 protected InvalidBootstrapperApplicationFactoryException(SerializationInfo info, StreamingContext context)
141 : base(info, context)
142 {
143 }
144 }
145}
diff --git a/src/ext/Bal/WixToolset.Mba.Host/HostSection.cs b/src/ext/Bal/WixToolset.Mba.Host/HostSection.cs
new file mode 100644
index 00000000..632025c7
--- /dev/null
+++ b/src/ext/Bal/WixToolset.Mba.Host/HostSection.cs
@@ -0,0 +1,47 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Mba.Host
4{
5 using System;
6 using System.Configuration;
7
8 /// <summary>
9 /// Handler for the Host configuration section.
10 /// </summary>
11 public sealed class HostSection : ConfigurationSection
12 {
13 private static readonly ConfigurationProperty assemblyNameProperty = new ConfigurationProperty("assemblyName", typeof(string), null, ConfigurationPropertyOptions.IsRequired);
14 private static readonly ConfigurationProperty supportedFrameworksProperty = new ConfigurationProperty("", typeof(SupportedFrameworkElementCollection), null, ConfigurationPropertyOptions.IsDefaultCollection);
15
16 /// <summary>
17 /// Creates a new instance of the <see cref="HostSection"/> class.
18 /// </summary>
19 public HostSection()
20 {
21 }
22
23 /// <summary>
24 /// Gets the name of the assembly that contians the <see cref="Core.IBootstrapperApplicationFactory"/> child class.
25 /// </summary>
26 /// <remarks>
27 /// The assembly specified by this name must contain the <see cref="Core.BootstrapperApplicationFactoryAttribute"/> to identify
28 /// the type of the <see cref="Core.IBootstrapperApplicationFactory"/> child class.
29 /// </remarks>
30 [ConfigurationProperty("assemblyName", IsRequired = true)]
31 public string AssemblyName
32 {
33 get { return (string)base[assemblyNameProperty]; }
34 set { base[assemblyNameProperty] = value; }
35 }
36
37 /// <summary>
38 /// Gets the <see cref="SupportedFrameworkElementCollection"/> of supported frameworks for the host configuration.
39 /// </summary>
40 [ConfigurationProperty("", IsDefaultCollection = true)]
41 [ConfigurationCollection(typeof(SupportedFrameworkElement))]
42 public SupportedFrameworkElementCollection SupportedFrameworks
43 {
44 get { return (SupportedFrameworkElementCollection)base[supportedFrameworksProperty]; }
45 }
46 }
47}
diff --git a/src/ext/Bal/WixToolset.Mba.Host/NativeMethods.cs b/src/ext/Bal/WixToolset.Mba.Host/NativeMethods.cs
new file mode 100644
index 00000000..b9fc85a0
--- /dev/null
+++ b/src/ext/Bal/WixToolset.Mba.Host/NativeMethods.cs
@@ -0,0 +1,18 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Mba.Host
4{
5 using System;
6 using System.Runtime.InteropServices;
7
8 /// <summary>
9 /// Contains native constants, functions, and structures for this assembly.
10 /// </summary>
11 internal static class NativeMethods
12 {
13 #region Error Constants
14 internal const int E_NOTFOUND = unchecked((int)0x80070490);
15 internal const int E_UNEXPECTED = unchecked((int)0x8000ffff);
16 #endregion
17 }
18}
diff --git a/src/ext/Bal/WixToolset.Mba.Host/SupportedFrameworkElement.cs b/src/ext/Bal/WixToolset.Mba.Host/SupportedFrameworkElement.cs
new file mode 100644
index 00000000..fe7fd2eb
--- /dev/null
+++ b/src/ext/Bal/WixToolset.Mba.Host/SupportedFrameworkElement.cs
@@ -0,0 +1,47 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Mba.Host
4{
5 using System;
6 using System.Configuration;
7
8 /// <summary>
9 /// Handler for the supportedFramework configuration section.
10 /// </summary>
11 public sealed class SupportedFrameworkElement : ConfigurationElement
12 {
13 private static readonly ConfigurationProperty versionProperty = new ConfigurationProperty("version", typeof(string), null, ConfigurationPropertyOptions.IsRequired);
14 private static readonly ConfigurationProperty runtimeVersionProperty = new ConfigurationProperty("runtimeVersion", typeof(string));
15
16 /// <summary>
17 /// Creates a new instance of the <see cref="SupportedFrameworkElement"/> class.
18 /// </summary>
19 public SupportedFrameworkElement()
20 {
21 }
22
23 /// <summary>
24 /// Gets the version of the supported framework.
25 /// </summary>
26 /// <remarks>
27 /// The assembly specified by this name must contain a value matching the NETFX version registry key under
28 /// "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP".
29 /// </remarks>
30 [ConfigurationProperty("version", IsRequired = true)]
31 public string Version
32 {
33 get { return (string)base[versionProperty]; }
34 set { base[versionProperty] = value; }
35 }
36
37 /// <summary>
38 /// Gets the runtime version required by this supported framework.
39 /// </summary>
40 [ConfigurationProperty("runtimeVersion", IsRequired = false)]
41 public string RuntimeVersion
42 {
43 get { return (string)base[runtimeVersionProperty]; }
44 set { base[runtimeVersionProperty] = value; }
45 }
46 }
47}
diff --git a/src/ext/Bal/WixToolset.Mba.Host/SupportedFrameworkElementCollection.cs b/src/ext/Bal/WixToolset.Mba.Host/SupportedFrameworkElementCollection.cs
new file mode 100644
index 00000000..12c7cf3e
--- /dev/null
+++ b/src/ext/Bal/WixToolset.Mba.Host/SupportedFrameworkElementCollection.cs
@@ -0,0 +1,36 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Mba.Host
4{
5 using System;
6 using System.Configuration;
7 using System.Diagnostics.CodeAnalysis;
8
9 /// <summary>
10 /// Handler for the supportedFramework collection.
11 /// </summary>
12 [SuppressMessage("Microsoft.Design", "CA1010:CollectionsShouldImplementGenericInterface")]
13 [ConfigurationCollection(typeof(SupportedFrameworkElement), AddItemName = "supportedFramework", CollectionType = ConfigurationElementCollectionType.BasicMap)]
14 public sealed class SupportedFrameworkElementCollection : ConfigurationElementCollection
15 {
16 public override ConfigurationElementCollectionType CollectionType
17 {
18 get { return ConfigurationElementCollectionType.BasicMap; }
19 }
20
21 protected override string ElementName
22 {
23 get { return "supportedFramework"; }
24 }
25
26 protected override ConfigurationElement CreateNewElement()
27 {
28 return new SupportedFrameworkElement();
29 }
30
31 protected override object GetElementKey(ConfigurationElement element)
32 {
33 return (element as SupportedFrameworkElement).Version;
34 }
35 }
36}
diff --git a/src/ext/Bal/WixToolset.Mba.Host/WixToolset.Mba.Host.config b/src/ext/Bal/WixToolset.Mba.Host/WixToolset.Mba.Host.config
new file mode 100644
index 00000000..a19b66f1
--- /dev/null
+++ b/src/ext/Bal/WixToolset.Mba.Host/WixToolset.Mba.Host.config
@@ -0,0 +1,26 @@
1<?xml version="1.0" encoding="utf-8" ?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3
4
5<configuration>
6 <configSections>
7 <sectionGroup name="wix.bootstrapper" type="WixToolset.Mba.Host.BootstrapperSectionGroup, WixToolset.Mba.Host">
8 <section name="host" type="WixToolset.Mba.Host.HostSection, WixToolset.Mba.Host" />
9 </sectionGroup>
10 </configSections>
11 <startup useLegacyV2RuntimeActivationPolicy="true">
12 <supportedRuntime version="v4.0" />
13 <supportedRuntime version="v2.0.50727" />
14 </startup>
15 <wix.bootstrapper>
16 <!-- Example only. Use only if the startup/supportedRuntime above cannot discern supported frameworks. -->
17 <!--
18 <supportedFramework version="v4\Client" />
19 <supportedFramework version="v3.5" />
20 <supportedFramework version="v3.0" />
21 -->
22
23 <!-- Example only. Replace the host/@assemblyName attribute with assembly that implements IBootstrapperApplicationFactory. -->
24 <host assemblyName="AssemblyWithClassThatInheritsFromBootstrapperApplicationFactory" />
25 </wix.bootstrapper>
26</configuration>
diff --git a/src/ext/Bal/WixToolset.Mba.Host/WixToolset.Mba.Host.csproj b/src/ext/Bal/WixToolset.Mba.Host/WixToolset.Mba.Host.csproj
new file mode 100644
index 00000000..3ee0ad1e
--- /dev/null
+++ b/src/ext/Bal/WixToolset.Mba.Host/WixToolset.Mba.Host.csproj
@@ -0,0 +1,54 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3
4<Project Sdk="Microsoft.NET.Sdk">
5 <PropertyGroup>
6 <AssemblyName>WixToolset.Mba.Host</AssemblyName>
7 <RootNamespace>WixToolset.Mba.Host</RootNamespace>
8 <TargetFrameworks>net20</TargetFrameworks>
9 <Description>Managed Bootstrapper Application entry point</Description>
10 <DebugType>embedded</DebugType>
11 <NuspecFile>$(MSBuildThisFileName).nuspec</NuspecFile>
12 <PlatformTarget>AnyCPU</PlatformTarget>
13 </PropertyGroup>
14
15 <ItemGroup>
16 <None Include="WixToolset.Mba.Host.config" CopyToOutputDirectory="PreserveNewest" />
17 </ItemGroup>
18 <ItemGroup>
19 <PackageReference Include="Microsoft.SourceLink.GitHub" Version="1.0.0" PrivateAssets="All" />
20 <PackageReference Include="Nerdbank.GitVersioning" Version="3.3.37" PrivateAssets="All" />
21 <PackageReference Include="WixToolset.Mba.Core" Version="4.0.*" />
22 </ItemGroup>
23 <ItemGroup>
24 <Reference Include="System.Configuration" />
25 </ItemGroup>
26 <ItemGroup>
27 <HeaderPath Include="$(BaseOutputPath)obj\$(AssemblyName).h">
28 <Visible>False</Visible>
29 </HeaderPath>
30 </ItemGroup>
31
32 <Target Name="GenerateIdentityHeader" AfterTargets="Build" Inputs="$(TargetPath)" Outputs="@(HeaderPath)">
33 <GetAssemblyIdentity AssemblyFiles="$(TargetPath)">
34 <Output TaskParameter="Assemblies" ItemName="AssemblyIdentity" />
35 </GetAssemblyIdentity>
36 <ItemGroup>
37 <Line Include='#define MBA_ASSEMBLY_FULL_NAME L"%(AssemblyIdentity.Identity)"' />
38 <Line Include='#define MBA_CONFIG_FILE_NAME L"$(AssemblyName).config"' />
39 <Line Include='#define MBA_ENTRY_TYPE L"$(RootNamespace).BootstrapperApplicationFactory"' />
40 </ItemGroup>
41 <Message Importance="normal" Text="Generating identity definitions into @(HeaderPath->'%(FullPath)')" />
42 <WriteLinesToFile File="@(HeaderPath)" Lines="@(Line)" Overwrite="True" />
43 <ItemGroup>
44 <FileWrites Include="@(HeaderPath)" />
45 </ItemGroup>
46 </Target>
47
48 <Target Name="SetNuspecProperties" DependsOnTargets="InitializeSourceControlInformation" AfterTargets="GetBuildVersion">
49 <PropertyGroup>
50 <NuspecBasePath>$(OutputPath)</NuspecBasePath>
51 <NuspecProperties>Id=$(AssemblyName);Version=$(BuildVersionSimple);Authors=$(Authors);Copyright=$(Copyright);Description=$(Description);RepositoryCommit=$(SourceRevisionId);RepositoryType=$(RepositoryType);RepositoryUrl=$(PrivateRepositoryUrl)</NuspecProperties>
52 </PropertyGroup>
53 </Target>
54</Project> \ No newline at end of file
diff --git a/src/ext/Bal/WixToolset.Mba.Host/WixToolset.Mba.Host.nuspec b/src/ext/Bal/WixToolset.Mba.Host/WixToolset.Mba.Host.nuspec
new file mode 100644
index 00000000..00fd21ac
--- /dev/null
+++ b/src/ext/Bal/WixToolset.Mba.Host/WixToolset.Mba.Host.nuspec
@@ -0,0 +1,23 @@
1<?xml version="1.0"?>
2<package >
3 <metadata>
4 <id>$id$</id>
5 <version>$version$</version>
6 <authors>WiX Toolset Team</authors>
7 <owners>WiX Toolset Team</owners>
8 <license type="expression">MS-RL</license>
9 <projectUrl>https://github.com/wixtoolset/Bal.wixext</projectUrl>
10 <requireLicenseAcceptance>false</requireLicenseAcceptance>
11 <description>$description$</description>
12 <copyright>$copyright$</copyright>
13 <repository type="$repositorytype$" url="$repositoryurl$" commit="$repositorycommit$" />
14 <dependencies>
15 <group targetFramework=".NETFramework2.0" />
16 </dependencies>
17 </metadata>
18
19 <files>
20 <file src="net20\$id$.config" target="samples" />
21 <file src="net20\$id$.dll" target="lib\net20" />
22 </files>
23</package>
diff --git a/src/ext/Bal/appveyor.cmd b/src/ext/Bal/appveyor.cmd
new file mode 100644
index 00000000..f4e9c26e
--- /dev/null
+++ b/src/ext/Bal/appveyor.cmd
@@ -0,0 +1,17 @@
1@setlocal
2@pushd %~dp0
3@set _C=Release
4
5nuget restore || exit /b
6
7msbuild -p:Configuration=%_C% -Restore || exit /b
8msbuild -p:Configuration=%_C% src\test\examples\examples.proj || exit /b
9
10dotnet test -c %_C% --no-build src\test\WixToolsetTest.Bal || exit /b
11dotnet test -c %_C% --no-build src\test\WixToolsetTest.ManagedHost || exit /b
12
13msbuild -p:Configuration=%_C% -p:NoBuild=true -t:Pack src\wixext\WixToolset.Bal.wixext.csproj || exit /b
14msbuild -p:Configuration=%_C% -p:NoBuild=true -t:Pack src\WixToolset.Mba.Host\WixToolset.Mba.Host.csproj || exit /b
15
16@popd
17@endlocal
diff --git a/src/ext/Bal/appveyor.yml b/src/ext/Bal/appveyor.yml
new file mode 100644
index 00000000..7c686b04
--- /dev/null
+++ b/src/ext/Bal/appveyor.yml
@@ -0,0 +1,40 @@
1# Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2#
3# Do NOT modify this file. Update the canonical version in Home\repo-template\src\appveyor.yml
4# then update all of the repos.
5
6branches:
7 only:
8 - master
9 - develop
10
11image: Visual Studio 2019
12
13version: 0.0.0.{build}
14configuration: Release
15
16environment:
17 DOTNET_SKIP_FIRST_TIME_EXPERIENCE: true
18 DOTNET_CLI_TELEMETRY_OPTOUT: 1
19 NUGET_XMLDOC_MODE: skip
20
21build_script:
22 - appveyor.cmd
23
24pull_requests:
25 do_not_increment_build_number: true
26
27nuget:
28 disable_publish_on_pr: true
29
30skip_branch_with_pr: true
31skip_tags: true
32
33artifacts:
34- path: build\Release\**\*.nupkg
35 name: nuget
36
37notifications:
38- provider: Slack
39 incoming_webhook:
40 secure: p5xuu+4x2JHfwGDMDe5KcG1k7gZxqYc4jWVwvyNZv5cvkubPD2waJs5yXMAXZNN7Z63/3PWHb7q4KoY/99AjauYa1nZ4c5qYqRPFRBKTHfA=
diff --git a/src/ext/Bal/dnchost/coreclrhost.h b/src/ext/Bal/dnchost/coreclrhost.h
new file mode 100644
index 00000000..07f28735
--- /dev/null
+++ b/src/ext/Bal/dnchost/coreclrhost.h
@@ -0,0 +1,137 @@
1// Licensed to the .NET Foundation under one or more agreements.
2// The .NET Foundation licenses this file to you under the MIT license.
3// See the LICENSE file in the project root for more information.
4
5
6
7// ***** ABOUT THIS HEADER *****
8// **************************************************************************************
9//
10// This is the version on 2019-12-22 from
11// https://github.com/dotnet/runtime/blob/master/src/coreclr/src/coreclr/hosts/inc/coreclrhost.h
12//
13// **************************************************************************************
14// ****************************
15
16
17//
18// APIs for hosting CoreCLR
19//
20
21#ifndef __CORECLR_HOST_H__
22#define __CORECLR_HOST_H__
23
24#if defined(_WIN32) && defined(_M_IX86)
25#define CORECLR_CALLING_CONVENTION __stdcall
26#else
27#define CORECLR_CALLING_CONVENTION
28#endif
29
30// For each hosting API, we define a function prototype and a function pointer
31// The prototype is useful for implicit linking against the dynamic coreclr
32// library and the pointer for explicit dynamic loading (dlopen, LoadLibrary)
33#define CORECLR_HOSTING_API(function, ...) \
34 extern "C" int CORECLR_CALLING_CONVENTION function(__VA_ARGS__); \
35 typedef int (CORECLR_CALLING_CONVENTION *function##_ptr)(__VA_ARGS__)
36
37//
38// Initialize the CoreCLR. Creates and starts CoreCLR host and creates an app domain
39//
40// Parameters:
41// exePath - Absolute path of the executable that invoked the ExecuteAssembly (the native host application)
42// appDomainFriendlyName - Friendly name of the app domain that will be created to execute the assembly
43// propertyCount - Number of properties (elements of the following two arguments)
44// propertyKeys - Keys of properties of the app domain
45// propertyValues - Values of properties of the app domain
46// hostHandle - Output parameter, handle of the created host
47// domainId - Output parameter, id of the created app domain
48//
49// Returns:
50// HRESULT indicating status of the operation. S_OK if the assembly was successfully executed
51//
52CORECLR_HOSTING_API(coreclr_initialize,
53 const char* exePath,
54 const char* appDomainFriendlyName,
55 int propertyCount,
56 const char** propertyKeys,
57 const char** propertyValues,
58 void** hostHandle,
59 unsigned int* domainId);
60
61//
62// Shutdown CoreCLR. It unloads the app domain and stops the CoreCLR host.
63//
64// Parameters:
65// hostHandle - Handle of the host
66// domainId - Id of the domain
67//
68// Returns:
69// HRESULT indicating status of the operation. S_OK if the assembly was successfully executed
70//
71CORECLR_HOSTING_API(coreclr_shutdown,
72 void* hostHandle,
73 unsigned int domainId);
74
75//
76// Shutdown CoreCLR. It unloads the app domain and stops the CoreCLR host.
77//
78// Parameters:
79// hostHandle - Handle of the host
80// domainId - Id of the domain
81// latchedExitCode - Latched exit code after domain unloaded
82//
83// Returns:
84// HRESULT indicating status of the operation. S_OK if the assembly was successfully executed
85//
86CORECLR_HOSTING_API(coreclr_shutdown_2,
87 void* hostHandle,
88 unsigned int domainId,
89 int* latchedExitCode);
90
91//
92// Create a native callable function pointer for a managed method.
93//
94// Parameters:
95// hostHandle - Handle of the host
96// domainId - Id of the domain
97// entryPointAssemblyName - Name of the assembly which holds the custom entry point
98// entryPointTypeName - Name of the type which holds the custom entry point
99// entryPointMethodName - Name of the method which is the custom entry point
100// delegate - Output parameter, the function stores a native callable function pointer to the delegate at the specified address
101//
102// Returns:
103// HRESULT indicating status of the operation. S_OK if the assembly was successfully executed
104//
105CORECLR_HOSTING_API(coreclr_create_delegate,
106 void* hostHandle,
107 unsigned int domainId,
108 const char* entryPointAssemblyName,
109 const char* entryPointTypeName,
110 const char* entryPointMethodName,
111 void** delegate);
112
113//
114// Execute a managed assembly with given arguments
115//
116// Parameters:
117// hostHandle - Handle of the host
118// domainId - Id of the domain
119// argc - Number of arguments passed to the executed assembly
120// argv - Array of arguments passed to the executed assembly
121// managedAssemblyPath - Path of the managed assembly to execute (or NULL if using a custom entrypoint).
122// exitCode - Exit code returned by the executed assembly
123//
124// Returns:
125// HRESULT indicating status of the operation. S_OK if the assembly was successfully executed
126//
127CORECLR_HOSTING_API(coreclr_execute_assembly,
128 void* hostHandle,
129 unsigned int domainId,
130 int argc,
131 const char** argv,
132 const char* managedAssemblyPath,
133 unsigned int* exitCode);
134
135#undef CORECLR_HOSTING_API
136
137#endif // __CORECLR_HOST_H__ \ No newline at end of file
diff --git a/src/ext/Bal/dnchost/dnchost.cpp b/src/ext/Bal/dnchost/dnchost.cpp
new file mode 100644
index 00000000..8ca326fc
--- /dev/null
+++ b/src/ext/Bal/dnchost/dnchost.cpp
@@ -0,0 +1,309 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3#include "precomp.h"
4
5static DNCSTATE vstate = { };
6
7
8// internal function declarations
9
10static HRESULT LoadModulePaths(
11 __in DNCSTATE* pState
12 );
13static HRESULT LoadDncConfiguration(
14 __in DNCSTATE* pState,
15 __in const BOOTSTRAPPER_CREATE_ARGS* pArgs
16 );
17static HRESULT LoadRuntime(
18 __in DNCSTATE* pState
19 );
20static HRESULT LoadManagedBootstrapperApplicationFactory(
21 __in DNCSTATE* pState
22 );
23static HRESULT CreatePrerequisiteBA(
24 __in HRESULT hrHostInitialization,
25 __in IBootstrapperEngine* pEngine,
26 __in LPCWSTR wzAppBase,
27 __in const BOOTSTRAPPER_CREATE_ARGS* pArgs,
28 __inout BOOTSTRAPPER_CREATE_RESULTS* pResults
29 );
30
31
32// function definitions
33
34extern "C" BOOL WINAPI DllMain(
35 IN HINSTANCE hInstance,
36 IN DWORD dwReason,
37 IN LPVOID /* pvReserved */
38 )
39{
40 switch (dwReason)
41 {
42 case DLL_PROCESS_ATTACH:
43 ::DisableThreadLibraryCalls(hInstance);
44 vstate.hInstance = hInstance;
45 break;
46
47 case DLL_PROCESS_DETACH:
48 vstate.hInstance = NULL;
49 break;
50 }
51
52 return TRUE;
53}
54
55extern "C" HRESULT WINAPI BootstrapperApplicationCreate(
56 __in const BOOTSTRAPPER_CREATE_ARGS* pArgs,
57 __inout BOOTSTRAPPER_CREATE_RESULTS* pResults
58 )
59{
60 HRESULT hr = S_OK;
61 HRESULT hrHostInitialization = S_OK;
62 IBootstrapperEngine* pEngine = NULL;
63
64 // coreclr.dll doesn't support unloading, so the rest of the .NET Core hosting stack doesn't support it either.
65 // This means we also can't unload.
66 pResults->fDisableUnloading = TRUE;
67
68 hr = BalInitializeFromCreateArgs(pArgs, &pEngine);
69 ExitOnFailure(hr, "Failed to initialize Bal.");
70
71 if (!vstate.fInitialized)
72 {
73 hr = XmlInitialize();
74 BalExitOnFailure(hr, "Failed to initialize XML.");
75
76 hr = LoadModulePaths(&vstate);
77 BalExitOnFailure(hr, "Failed to get the host base path.");
78
79 hr = LoadDncConfiguration(&vstate, pArgs);
80 BalExitOnFailure(hr, "Failed to get the dnc configuration.");
81
82 vstate.fInitialized = TRUE;
83 }
84
85 if (!vstate.fInitializedRuntime)
86 {
87 hr = LoadRuntime(&vstate);
88
89 vstate.fInitializedRuntime = SUCCEEDED(hr);
90 }
91
92 if (vstate.fInitializedRuntime)
93 {
94 if (!vstate.pAppFactory)
95 {
96 hr = LoadManagedBootstrapperApplicationFactory(&vstate);
97 BalExitOnFailure(hr, "Failed to create the .NET Core bootstrapper application factory.");
98 }
99
100 BalLog(BOOTSTRAPPER_LOG_LEVEL_STANDARD, "Loading .NET Core %ls bootstrapper application.", DNCHOSTTYPE_FDD == vstate.type ? L"FDD" : L"SCD");
101
102 hr = vstate.pAppFactory->Create(pArgs, pResults);
103 BalExitOnFailure(hr, "Failed to create the .NET Core bootstrapper application.");
104 }
105 else // fallback to the prerequisite BA.
106 {
107 if (DNCHOSTTYPE_SCD == vstate.type)
108 {
109 hrHostInitialization = E_DNCHOST_SCD_RUNTIME_FAILURE;
110 BalLogError(hr, "The self-contained .NET Core runtime failed to load. This is an unrecoverable error.");
111 }
112 else
113 {
114 hrHostInitialization = S_OK;
115 }
116 BalLog(BOOTSTRAPPER_LOG_LEVEL_STANDARD, "Loading prerequisite bootstrapper application because .NET Core host could not be loaded, error: 0x%08x.", hr);
117
118 hr = CreatePrerequisiteBA(hrHostInitialization, pEngine, vstate.sczAppBase, pArgs, pResults);
119 BalExitOnFailure(hr, "Failed to create the pre-requisite bootstrapper application.");
120 }
121
122LExit:
123 ReleaseNullObject(pEngine);
124
125 return hr;
126}
127
128extern "C" void WINAPI BootstrapperApplicationDestroy()
129{
130 if (vstate.hMbapreqModule)
131 {
132 PFN_BOOTSTRAPPER_APPLICATION_DESTROY pfnDestroy = reinterpret_cast<PFN_BOOTSTRAPPER_APPLICATION_DESTROY>(::GetProcAddress(vstate.hMbapreqModule, "DncPrereqBootstrapperApplicationDestroy"));
133 if (pfnDestroy)
134 {
135 (*pfnDestroy)();
136 }
137
138 ::FreeLibrary(vstate.hMbapreqModule);
139 vstate.hMbapreqModule = NULL;
140 }
141
142 BalUninitialize();
143}
144
145static HRESULT LoadModulePaths(
146 __in DNCSTATE* pState
147 )
148{
149 HRESULT hr = S_OK;
150
151 hr = PathForCurrentProcess(&pState->sczModuleFullPath, pState->hInstance);
152 BalExitOnFailure(hr, "Failed to get the full host path.");
153
154 hr = PathGetDirectory(pState->sczModuleFullPath, &pState->sczAppBase);
155 BalExitOnFailure(hr, "Failed to get the directory of the full process path.");
156
157 hr = PathConcat(pState->sczAppBase, DNC_ASSEMBLY_FILE_NAME, &pState->sczManagedHostPath);
158 BalExitOnFailure(hr, "Failed to create managed host path.");
159
160LExit:
161 return hr;
162}
163
164static HRESULT LoadDncConfiguration(
165 __in DNCSTATE* pState,
166 __in const BOOTSTRAPPER_CREATE_ARGS* pArgs
167 )
168{
169 HRESULT hr = S_OK;
170 IXMLDOMDocument* pixdManifest = NULL;
171 IXMLDOMNode* pixnHost = NULL;
172 LPWSTR sczPayloadName = NULL;
173 DWORD dwBool = 0;
174
175 hr = XmlLoadDocumentFromFile(pArgs->pCommand->wzBootstrapperApplicationDataPath, &pixdManifest);
176 BalExitOnFailure(hr, "Failed to load BalManifest '%ls'", pArgs->pCommand->wzBootstrapperApplicationDataPath);
177
178 hr = XmlSelectSingleNode(pixdManifest, L"/BootstrapperApplicationData/WixBalBAFactoryAssembly", &pixnHost);
179 BalExitOnFailure(hr, "Failed to get WixBalBAFactoryAssembly element.");
180
181 if (S_FALSE == hr)
182 {
183 hr = E_NOTFOUND;
184 BalExitOnRootFailure(hr, "Failed to find WixBalBAFactoryAssembly element in bootstrapper application config.");
185 }
186
187 hr = XmlGetAttributeEx(pixnHost, L"FilePath", &sczPayloadName);
188 BalExitOnFailure(hr, "Failed to get WixBalBAFactoryAssembly/@FilePath.");
189
190 hr = PathConcat(pArgs->pCommand->wzBootstrapperWorkingFolder, sczPayloadName, &pState->sczBaFactoryAssemblyPath);
191 BalExitOnFailure(hr, "Failed to create BaFactoryAssemblyPath.");
192
193 LPCWSTR wzFileName = PathFile(pState->sczBaFactoryAssemblyPath);
194 LPCWSTR wzExtension = PathExtension(pState->sczBaFactoryAssemblyPath);
195 if (!wzExtension)
196 {
197 BalExitOnFailure(hr = E_FAIL, "BaFactoryAssemblyPath has no extension.");
198 }
199
200 hr = StrAllocString(&pState->sczBaFactoryAssemblyName, wzFileName, wzExtension - wzFileName);
201 BalExitOnFailure(hr, "Failed to copy BAFactoryAssembly payload Name.");
202
203 hr = StrAllocString(&pState->sczBaFactoryDepsJsonPath, pState->sczBaFactoryAssemblyPath, wzExtension - pState->sczBaFactoryAssemblyPath);
204 BalExitOnFailure(hr, "Failed to initialize deps json path.");
205
206 hr = StrAllocString(&pState->sczBaFactoryRuntimeConfigPath, pState->sczBaFactoryDepsJsonPath, 0);
207 BalExitOnFailure(hr, "Failed to initialize runtime config path.");
208
209 hr = StrAllocConcat(&pState->sczBaFactoryDepsJsonPath, L".deps.json", 0);
210 BalExitOnFailure(hr, "Failed to concat extension to deps json path.");
211
212 hr = StrAllocConcat(&pState->sczBaFactoryRuntimeConfigPath, L".runtimeconfig.json", 0);
213 BalExitOnFailure(hr, "Failed to concat extension to runtime config path.");
214
215 pState->type = DNCHOSTTYPE_FDD;
216
217 hr = XmlSelectSingleNode(pixdManifest, L"/BootstrapperApplicationData/WixDncOptions", &pixnHost);
218 if (S_FALSE == hr)
219 {
220 ExitFunction1(hr = S_OK);
221 }
222 BalExitOnFailure(hr, "Failed to find WixDncOptions element in bootstrapper application config.");
223
224 hr = XmlGetAttributeNumber(pixnHost, L"SelfContainedDeployment", &dwBool);
225 if (S_FALSE == hr)
226 {
227 hr = S_OK;
228 }
229 else if (SUCCEEDED(hr) && dwBool)
230 {
231 pState->type = DNCHOSTTYPE_SCD;
232 }
233 BalExitOnFailure(hr, "Failed to get SelfContainedDeployment value.");
234
235LExit:
236 ReleaseStr(sczPayloadName);
237 ReleaseObject(pixnHost);
238 ReleaseObject(pixdManifest);
239
240 return hr;
241}
242
243static HRESULT LoadRuntime(
244 __in DNCSTATE* pState
245 )
246{
247 HRESULT hr = S_OK;
248
249 hr = DnchostLoadRuntime(
250 &pState->hostfxrState,
251 pState->sczModuleFullPath,
252 pState->sczManagedHostPath,
253 pState->sczBaFactoryDepsJsonPath,
254 pState->sczBaFactoryRuntimeConfigPath);
255
256 return hr;
257}
258
259static HRESULT LoadManagedBootstrapperApplicationFactory(
260 __in DNCSTATE* pState
261 )
262{
263 HRESULT hr = S_OK;
264
265 hr = DnchostCreateFactory(
266 &pState->hostfxrState,
267 pState->sczBaFactoryAssemblyName,
268 pState->sczBaFactoryAssemblyPath,
269 &pState->pAppFactory);
270
271 return hr;
272}
273
274static HRESULT CreatePrerequisiteBA(
275 __in HRESULT hrHostInitialization,
276 __in IBootstrapperEngine* pEngine,
277 __in LPCWSTR wzAppBase,
278 __in const BOOTSTRAPPER_CREATE_ARGS* pArgs,
279 __inout BOOTSTRAPPER_CREATE_RESULTS* pResults
280 )
281{
282 HRESULT hr = S_OK;
283 LPWSTR sczDncpreqPath = NULL;
284 HMODULE hModule = NULL;
285
286 hr = PathConcat(wzAppBase, L"dncpreq.dll", &sczDncpreqPath);
287 BalExitOnFailure(hr, "Failed to get path to pre-requisite BA.");
288
289 hModule = ::LoadLibraryW(sczDncpreqPath);
290 BalExitOnNullWithLastError(hModule, hr, "Failed to load pre-requisite BA DLL.");
291
292 PFN_DNCPREQ_BOOTSTRAPPER_APPLICATION_CREATE pfnCreate = reinterpret_cast<PFN_DNCPREQ_BOOTSTRAPPER_APPLICATION_CREATE>(::GetProcAddress(hModule, "DncPrereqBootstrapperApplicationCreate"));
293 BalExitOnNullWithLastError(pfnCreate, hr, "Failed to get DncPrereqBootstrapperApplicationCreate entry-point from: %ls", sczDncpreqPath);
294
295 hr = pfnCreate(hrHostInitialization, pEngine, pArgs, pResults);
296 BalExitOnFailure(hr, "Failed to create prequisite bootstrapper app.");
297
298 vstate.hMbapreqModule = hModule;
299 hModule = NULL;
300
301LExit:
302 if (hModule)
303 {
304 ::FreeLibrary(hModule);
305 }
306 ReleaseStr(sczDncpreqPath);
307
308 return hr;
309}
diff --git a/src/ext/Bal/dnchost/dnchost.def b/src/ext/Bal/dnchost/dnchost.def
new file mode 100644
index 00000000..4488df94
--- /dev/null
+++ b/src/ext/Bal/dnchost/dnchost.def
@@ -0,0 +1,6 @@
1; Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3
4EXPORTS
5 BootstrapperApplicationCreate
6 BootstrapperApplicationDestroy
diff --git a/src/ext/Bal/dnchost/dnchost.h b/src/ext/Bal/dnchost/dnchost.h
new file mode 100644
index 00000000..22fd8f5e
--- /dev/null
+++ b/src/ext/Bal/dnchost/dnchost.h
@@ -0,0 +1,35 @@
1#pragma once
2// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
3
4
5enum DNCHOSTTYPE
6{
7 DNCHOSTTYPE_UNKNOWN,
8 DNCHOSTTYPE_FDD,
9 DNCHOSTTYPE_SCD,
10};
11
12extern "C" typedef HRESULT(WINAPI* PFN_DNCPREQ_BOOTSTRAPPER_APPLICATION_CREATE)(
13 __in HRESULT hrHostInitialization,
14 __in IBootstrapperEngine* pEngine,
15 __in const BOOTSTRAPPER_CREATE_ARGS* pArgs,
16 __inout BOOTSTRAPPER_CREATE_RESULTS* pResults
17 );
18
19struct DNCSTATE
20{
21 BOOL fInitialized;
22 BOOL fInitializedRuntime;
23 HINSTANCE hInstance;
24 LPWSTR sczModuleFullPath;
25 LPWSTR sczAppBase;
26 LPWSTR sczManagedHostPath;
27 LPWSTR sczBaFactoryAssemblyName;
28 LPWSTR sczBaFactoryAssemblyPath;
29 LPWSTR sczBaFactoryDepsJsonPath;
30 LPWSTR sczBaFactoryRuntimeConfigPath;
31 DNCHOSTTYPE type;
32 HOSTFXR_STATE hostfxrState;
33 IBootstrapperApplicationFactory* pAppFactory;
34 HMODULE hMbapreqModule;
35};
diff --git a/src/ext/Bal/dnchost/dnchost.vcxproj b/src/ext/Bal/dnchost/dnchost.vcxproj
new file mode 100644
index 00000000..bef3f77e
--- /dev/null
+++ b/src/ext/Bal/dnchost/dnchost.vcxproj
@@ -0,0 +1,106 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3<Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
4 <Import Project="..\..\packages\Microsoft.SourceLink.GitHub.1.0.0\build\Microsoft.SourceLink.GitHub.props" Condition="Exists('..\..\packages\Microsoft.SourceLink.GitHub.1.0.0\build\Microsoft.SourceLink.GitHub.props')" />
5 <Import Project="..\..\packages\Microsoft.SourceLink.Common.1.0.0\build\Microsoft.SourceLink.Common.props" Condition="Exists('..\..\packages\Microsoft.SourceLink.Common.1.0.0\build\Microsoft.SourceLink.Common.props')" />
6 <Import Project="..\..\packages\Microsoft.Build.Tasks.Git.1.0.0\build\Microsoft.Build.Tasks.Git.props" Condition="Exists('..\..\packages\Microsoft.Build.Tasks.Git.1.0.0\build\Microsoft.Build.Tasks.Git.props')" />
7 <Import Project="..\..\packages\WixToolset.BalUtil.4.0.58\build\WixToolset.BalUtil.props" Condition="Exists('..\..\packages\WixToolset.BalUtil.4.0.58\build\WixToolset.BalUtil.props')" />
8 <Import Project="..\..\packages\WixToolset.BootstrapperCore.Native.4.0.141\build\WixToolset.BootstrapperCore.Native.props" Condition="Exists('..\..\packages\WixToolset.BootstrapperCore.Native.4.0.141\build\WixToolset.BootstrapperCore.Native.props')" />
9 <Import Project="..\..\packages\WixToolset.DUtil.4.0.72\build\WixToolset.DUtil.props" Condition="Exists('..\..\packages\WixToolset.DUtil.4.0.72\build\WixToolset.DUtil.props')" />
10 <ItemGroup Label="ProjectConfigurations">
11 <ProjectConfiguration Include="Debug|ARM64">
12 <Configuration>Debug</Configuration>
13 <Platform>ARM64</Platform>
14 </ProjectConfiguration>
15 <ProjectConfiguration Include="Release|ARM64">
16 <Configuration>Release</Configuration>
17 <Platform>ARM64</Platform>
18 </ProjectConfiguration>
19 <ProjectConfiguration Include="Debug|Win32">
20 <Configuration>Debug</Configuration>
21 <Platform>Win32</Platform>
22 </ProjectConfiguration>
23 <ProjectConfiguration Include="Release|Win32">
24 <Configuration>Release</Configuration>
25 <Platform>Win32</Platform>
26 </ProjectConfiguration>
27 <ProjectConfiguration Include="Debug|x64">
28 <Configuration>Debug</Configuration>
29 <Platform>x64</Platform>
30 </ProjectConfiguration>
31 <ProjectConfiguration Include="Release|x64">
32 <Configuration>Release</Configuration>
33 <Platform>x64</Platform>
34 </ProjectConfiguration>
35 </ItemGroup>
36 <PropertyGroup Label="Globals">
37 <ProjectGuid>{B6F70281-6583-4138-BB7F-AABFEBBB3CA2}</ProjectGuid>
38 <ConfigurationType>DynamicLibrary</ConfigurationType>
39 <PlatformToolset>v142</PlatformToolset>
40 <CharacterSet>Unicode</CharacterSet>
41 <TargetName>dnchost</TargetName>
42 <ProjectModuleDefinitionFile>dnchost.def</ProjectModuleDefinitionFile>
43 </PropertyGroup>
44 <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
45 <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
46 <PropertyGroup>
47 <NetHostPlatform>$(Platform)</NetHostPlatform>
48 <NetHostPlatform Condition=" '$(NetHostPlatform)'=='Win32' ">x86</NetHostPlatform>
49 <NetHostPath>..\..\packages\runtime.win-$(NetHostPlatform).Microsoft.NETCore.DotNetAppHost.5.0.0\runtimes\win-$(NetHostPlatform)\native\</NetHostPath>
50 <ProjectAdditionalLinkLibraries>shlwapi.lib;$(NetHostPath)libnethost.lib</ProjectAdditionalLinkLibraries>
51 </PropertyGroup>
52 <ItemGroup>
53 <ClCompile Include="dnchost.cpp" />
54 <ClCompile Include="dncutil.cpp" />
55 <ClCompile Include="precomp.cpp">
56 <PrecompiledHeader>Create</PrecompiledHeader>
57 </ClCompile>
58 </ItemGroup>
59 <ItemGroup>
60 <ClInclude Include="coreclrhost.h" />
61 <ClInclude Include="dnchost.h" />
62 <ClInclude Include="dncutil.h" />
63 <ClInclude Include="precomp.h" />
64 </ItemGroup>
65 <ItemGroup>
66 <None Include="dnchost.def" />
67 </ItemGroup>
68 <ItemGroup>
69 <None Include="packages.config" />
70 </ItemGroup>
71 <ItemDefinitionGroup>
72 <ClCompile>
73 <AdditionalIncludeDirectories>$(BaseOutputPath)obj;$(NetHostPath);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
74 </ClCompile>
75 <Link>
76 <AdditionalOptions>/LTCG %(AdditionalOptions)</AdditionalOptions>
77 </Link>
78 </ItemDefinitionGroup>
79 <ItemGroup>
80 <ProjectReference Include="..\WixToolset.Dnc.Host\WixToolset.Dnc.Host.csproj">
81 <Project>{0D780900-C2FF-4FA2-8CB5-8A19768724C5}</Project>
82 <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
83 <SkipGetTargetFrameworkProperties>true</SkipGetTargetFrameworkProperties>
84 </ProjectReference>
85 </ItemGroup>
86 <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
87 <Import Project="..\..\packages\Microsoft.Build.Tasks.Git.1.0.0\build\Microsoft.Build.Tasks.Git.targets" Condition="Exists('..\..\packages\Microsoft.Build.Tasks.Git.1.0.0\build\Microsoft.Build.Tasks.Git.targets')" />
88 <Import Project="..\..\packages\Microsoft.SourceLink.Common.1.0.0\build\Microsoft.SourceLink.Common.targets" Condition="Exists('..\..\packages\Microsoft.SourceLink.Common.1.0.0\build\Microsoft.SourceLink.Common.targets')" />
89 <Import Project="..\..\packages\Microsoft.SourceLink.GitHub.1.0.0\build\Microsoft.SourceLink.GitHub.targets" Condition="Exists('..\..\packages\Microsoft.SourceLink.GitHub.1.0.0\build\Microsoft.SourceLink.GitHub.targets')" />
90 <Import Project="..\..\packages\Nerdbank.GitVersioning.3.3.37\build\Nerdbank.GitVersioning.targets" Condition="Exists('..\..\packages\Nerdbank.GitVersioning.3.3.37\build\Nerdbank.GitVersioning.targets')" />
91 <Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
92 <PropertyGroup>
93 <ErrorText>This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
94 </PropertyGroup>
95 <Error Condition="!Exists('..\..\packages\Microsoft.Build.Tasks.Git.1.0.0\build\Microsoft.Build.Tasks.Git.props')" Text="$([System.String]::Format('$(ErrorText)', '..\..\packages\Microsoft.Build.Tasks.Git.1.0.0\build\Microsoft.Build.Tasks.Git.props'))" />
96 <Error Condition="!Exists('..\..\packages\Microsoft.Build.Tasks.Git.1.0.0\build\Microsoft.Build.Tasks.Git.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\..\packages\Microsoft.Build.Tasks.Git.1.0.0\build\Microsoft.Build.Tasks.Git.targets'))" />
97 <Error Condition="!Exists('..\..\packages\Microsoft.SourceLink.Common.1.0.0\build\Microsoft.SourceLink.Common.props')" Text="$([System.String]::Format('$(ErrorText)', '..\..\packages\Microsoft.SourceLink.Common.1.0.0\build\Microsoft.SourceLink.Common.props'))" />
98 <Error Condition="!Exists('..\..\packages\Microsoft.SourceLink.Common.1.0.0\build\Microsoft.SourceLink.Common.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\..\packages\Microsoft.SourceLink.Common.1.0.0\build\Microsoft.SourceLink.Common.targets'))" />
99 <Error Condition="!Exists('..\..\packages\Microsoft.SourceLink.GitHub.1.0.0\build\Microsoft.SourceLink.GitHub.props')" Text="$([System.String]::Format('$(ErrorText)', '..\..\packages\Microsoft.SourceLink.GitHub.1.0.0\build\Microsoft.SourceLink.GitHub.props'))" />
100 <Error Condition="!Exists('..\..\packages\Microsoft.SourceLink.GitHub.1.0.0\build\Microsoft.SourceLink.GitHub.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\..\packages\Microsoft.SourceLink.GitHub.1.0.0\build\Microsoft.SourceLink.GitHub.targets'))" />
101 <Error Condition="!Exists('..\..\packages\Nerdbank.GitVersioning.3.3.37\build\Nerdbank.GitVersioning.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\..\packages\Nerdbank.GitVersioning.3.3.37\build\Nerdbank.GitVersioning.targets'))" />
102 <Error Condition="!Exists('..\..\packages\WixToolset.BalUtil.4.0.58\build\WixToolset.BalUtil.props')" Text="$([System.String]::Format('$(ErrorText)', '..\..\packages\WixToolset.BalUtil.4.0.58\build\WixToolset.BalUtil.props'))" />
103 <Error Condition="!Exists('..\..\packages\WixToolset.BootstrapperCore.Native.4.0.141\build\WixToolset.BootstrapperCore.Native.props')" Text="$([System.String]::Format('$(ErrorText)', '..\..\packages\WixToolset.BootstrapperCore.Native.4.0.141\build\WixToolset.BootstrapperCore.Native.props'))" />
104 <Error Condition="!Exists('..\..\packages\WixToolset.DUtil.4.0.72\build\WixToolset.DUtil.props')" Text="$([System.String]::Format('$(ErrorText)', '..\..\packages\WixToolset.DUtil.4.0.72\build\WixToolset.DUtil.props'))" />
105 </Target>
106</Project> \ No newline at end of file
diff --git a/src/ext/Bal/dnchost/dncutil.cpp b/src/ext/Bal/dnchost/dncutil.cpp
new file mode 100644
index 00000000..34d14911
--- /dev/null
+++ b/src/ext/Bal/dnchost/dncutil.cpp
@@ -0,0 +1,411 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3#include "precomp.h"
4
5// https://github.com/dotnet/runtime/blob/master/src/installer/corehost/error_codes.h
6#define InvalidArgFailure 0x80008081
7#define HostApiBufferTooSmall 0x80008098
8#define HostApiUnsupportedVersion 0x800080a2
9
10// internal function declarations
11
12static HRESULT GetHostfxrPath(
13 __in HOSTFXR_STATE* pState,
14 __in LPCWSTR wzNativeHostPath
15 );
16static HRESULT LoadHostfxr(
17 __in HOSTFXR_STATE* pState
18 );
19static HRESULT InitializeHostfxr(
20 __in HOSTFXR_STATE* pState,
21 __in LPCWSTR wzManagedHostPath,
22 __in LPCWSTR wzDepsJsonPath,
23 __in LPCWSTR wzRuntimeConfigPath
24 );
25static HRESULT InitializeCoreClr(
26 __in HOSTFXR_STATE* pState,
27 __in LPCWSTR wzNativeHostPath
28 );
29static HRESULT InitializeCoreClrPre5(
30 __in HOSTFXR_STATE* pState,
31 __in LPCWSTR wzNativeHostPath
32 );
33static HRESULT LoadCoreClr(
34 __in HOSTFXR_STATE* pState,
35 __in LPCWSTR wzCoreClrPath
36 );
37static HRESULT StartCoreClr(
38 __in HOSTFXR_STATE* pState,
39 __in LPCWSTR wzNativeHostPath,
40 __in DWORD cProperties,
41 __in LPCWSTR* propertyKeys,
42 __in LPCWSTR* propertyValues
43 );
44
45
46// function definitions
47
48HRESULT DnchostLoadRuntime(
49 __in HOSTFXR_STATE* pState,
50 __in LPCWSTR wzNativeHostPath,
51 __in LPCWSTR wzManagedHostPath,
52 __in LPCWSTR wzDepsJsonPath,
53 __in LPCWSTR wzRuntimeConfigPath
54 )
55{
56 HRESULT hr = S_OK;
57
58 hr = GetHostfxrPath(pState, wzNativeHostPath);
59 BalExitOnFailure(hr, "Failed to find hostfxr.");
60
61 hr = LoadHostfxr(pState);
62 BalExitOnFailure(hr, "Failed to load hostfxr.");
63
64 hr = InitializeHostfxr(pState, wzManagedHostPath, wzDepsJsonPath, wzRuntimeConfigPath);
65 BalExitOnFailure(hr, "Failed to initialize hostfxr.");
66
67 hr = InitializeCoreClr(pState, wzNativeHostPath);
68 BalExitOnFailure(hr, "Failed to initialize coreclr.");
69
70LExit:
71 return hr;
72}
73
74HRESULT DnchostCreateFactory(
75 __in HOSTFXR_STATE* pState,
76 __in LPCWSTR wzBaFactoryAssemblyName,
77 __in LPCWSTR wzBaFactoryAssemblyPath,
78 __out IBootstrapperApplicationFactory** ppAppFactory
79 )
80{
81 HRESULT hr = S_OK;
82 PFNCREATEBAFACTORY pfnCreateBAFactory = NULL;
83
84 if (pState->pfnGetFunctionPointer)
85 {
86 hr = pState->pfnGetFunctionPointer(
87 DNC_ENTRY_TYPEW,
88 DNC_STATIC_ENTRY_METHODW,
89 DNC_STATIC_ENTRY_DELEGATEW,
90 NULL,
91 NULL,
92 reinterpret_cast<void**>(&pfnCreateBAFactory));
93 BalExitOnFailure(hr, "Failed to create delegate through GetFunctionPointer.");
94 }
95 else
96 {
97 hr = pState->pfnCoreclrCreateDelegate(
98 pState->pClrHandle,
99 pState->dwDomainId,
100 DNC_ASSEMBLY_FULL_NAME,
101 DNC_ENTRY_TYPE,
102 DNC_STATIC_ENTRY_METHOD,
103 reinterpret_cast<void**>(&pfnCreateBAFactory));
104 BalExitOnFailure(hr, "Failed to create delegate in app domain.");
105 }
106
107 *ppAppFactory = pfnCreateBAFactory(wzBaFactoryAssemblyName, wzBaFactoryAssemblyPath);
108
109LExit:
110 return hr;
111}
112
113static HRESULT GetHostfxrPath(
114 __in HOSTFXR_STATE* pState,
115 __in LPCWSTR wzNativeHostPath
116 )
117{
118 HRESULT hr = S_OK;
119 get_hostfxr_parameters getHostfxrParameters = { };
120 int nrc = 0;
121 size_t cchHostFxrPath = MAX_PATH;
122
123 getHostfxrParameters.size = sizeof(get_hostfxr_parameters);
124 getHostfxrParameters.assembly_path = wzNativeHostPath;
125
126 // get_hostfxr_path does a full search on every call, so
127 // minimize the number of calls
128 // need to loop
129 for (;;)
130 {
131 cchHostFxrPath *= 2;
132 hr = StrAlloc(&pState->sczHostfxrPath, cchHostFxrPath);
133 BalExitOnFailure(hr, "Failed to allocate hostFxrPath.");
134
135 nrc = get_hostfxr_path(pState->sczHostfxrPath, &cchHostFxrPath, &getHostfxrParameters);
136 if (HostApiBufferTooSmall != nrc)
137 {
138 break;
139 }
140 }
141 if (0 != nrc)
142 {
143 BalExitOnFailure(hr = nrc, "GetHostfxrPath failed");
144 }
145
146LExit:
147 return hr;
148}
149
150static HRESULT LoadHostfxr(
151 __in HOSTFXR_STATE* pState
152 )
153{
154 HRESULT hr = S_OK;
155 HMODULE hHostfxr;
156
157 hHostfxr = ::LoadLibraryExW(pState->sczHostfxrPath, NULL, LOAD_WITH_ALTERED_SEARCH_PATH);
158 BalExitOnNullWithLastError(hHostfxr, hr, "Failed to load hostfxr from '%ls'.", pState->sczHostfxrPath);
159
160 pState->pfnHostfxrInitializeForApp = reinterpret_cast<hostfxr_initialize_for_dotnet_command_line_fn>(::GetProcAddress(hHostfxr, "hostfxr_initialize_for_dotnet_command_line"));
161 BalExitOnNullWithLastError(pState->pfnHostfxrInitializeForApp, hr, "Failed to get procedure address for hostfxr_initialize_for_dotnet_command_line.");
162
163 pState->pfnHostfxrGetRuntimeProperties = reinterpret_cast<hostfxr_get_runtime_properties_fn>(::GetProcAddress(hHostfxr, "hostfxr_get_runtime_properties"));
164 BalExitOnNullWithLastError(pState->pfnHostfxrGetRuntimeProperties, hr, "Failed to get procedure address for hostfxr_get_runtime_properties.");
165
166 pState->pfnHostfxrSetErrorWriter = reinterpret_cast<hostfxr_set_error_writer_fn>(::GetProcAddress(hHostfxr, "hostfxr_set_error_writer"));
167 BalExitOnNullWithLastError(pState->pfnHostfxrSetErrorWriter, hr, "Failed to get procedure address for hostfxr_set_error_writer.");
168
169 pState->pfnHostfxrClose = reinterpret_cast<hostfxr_close_fn>(::GetProcAddress(hHostfxr, "hostfxr_close"));
170 BalExitOnNullWithLastError(pState->pfnHostfxrClose, hr, "Failed to get procedure address for hostfxr_close.");
171
172 pState->pfnHostfxrGetRuntimeDelegate = reinterpret_cast<hostfxr_get_runtime_delegate_fn>(::GetProcAddress(hHostfxr, "hostfxr_get_runtime_delegate"));
173 BalExitOnNullWithLastError(pState->pfnHostfxrGetRuntimeDelegate, hr, "Failed to get procedure address for hostfxr_get_runtime_delegate.");
174
175LExit:
176 // Never unload the module since it isn't meant to be unloaded.
177
178 return hr;
179}
180
181static void HOSTFXR_CALLTYPE DnchostErrorWriter(
182 __in LPCWSTR wzMessage
183 )
184{
185 BOOTSTRAPPER_LOG_LEVEL level = BOOTSTRAPPER_LOG_LEVEL_ERROR;
186
187 if (CSTR_EQUAL == ::CompareString(LOCALE_INVARIANT, 0, wzMessage, -1, L"The requested delegate type is not available in the target framework.", -1))
188 {
189 level = BOOTSTRAPPER_LOG_LEVEL_DEBUG;
190 }
191
192 BalLog(level, "error from hostfxr: %ls", wzMessage);
193}
194
195static HRESULT InitializeHostfxr(
196 __in HOSTFXR_STATE* pState,
197 __in LPCWSTR wzManagedHostPath,
198 __in LPCWSTR wzDepsJsonPath,
199 __in LPCWSTR wzRuntimeConfigPath
200 )
201{
202 HRESULT hr = S_OK;
203
204 pState->pfnHostfxrSetErrorWriter(static_cast<hostfxr_error_writer_fn>(&DnchostErrorWriter));
205
206 LPCWSTR argv[] = {
207 L"exec",
208 L"--depsfile",
209 wzDepsJsonPath,
210 L"--runtimeconfig",
211 wzRuntimeConfigPath,
212 wzManagedHostPath,
213 };
214 hr = pState->pfnHostfxrInitializeForApp(sizeof(argv)/sizeof(LPWSTR), argv, NULL, &pState->hostContextHandle);
215 BalExitOnFailure(hr, "HostfxrInitializeForApp failed");
216
217LExit:
218 return hr;
219}
220
221static HRESULT InitializeCoreClr(
222 __in HOSTFXR_STATE* pState,
223 __in LPCWSTR wzNativeHostPath
224 )
225{
226 HRESULT hr = S_OK;
227
228 hr = pState->pfnHostfxrGetRuntimeDelegate(pState->hostContextHandle, hdt_get_function_pointer, reinterpret_cast<void**>(&pState->pfnGetFunctionPointer));
229 if (InvalidArgFailure == hr || // old versions of hostfxr don't allow calling GetRuntimeDelegate from InitializeForApp.
230 HostApiUnsupportedVersion == hr) // hdt_get_function_pointer was added in .NET 5.
231 {
232 hr = InitializeCoreClrPre5(pState, wzNativeHostPath);
233 }
234 else
235 {
236 ExitOnFailure(hr, "HostfxrGetRuntimeDelegate failed");
237 }
238
239LExit:
240 return hr;
241}
242
243static HRESULT InitializeCoreClrPre5(
244 __in HOSTFXR_STATE* pState,
245 __in LPCWSTR wzNativeHostPath
246 )
247{
248 HRESULT hr = S_OK;
249 int32_t rc = 0;
250 LPCWSTR* rgPropertyKeys = NULL;
251 LPCWSTR* rgPropertyValues = NULL;
252 size_t cProperties = 0;
253 LPWSTR* rgDirectories = NULL;
254 UINT cDirectories = 0;
255 LPWSTR sczCoreClrPath = NULL;
256
257 // We are not using hostfxr as it was intended to be used. We need to initialize hostfxr so that it properly initializes hostpolicy -
258 // there are pieces of the framework such as AssemblyDependencyResolver that won't work without that. We also need hostfxr to find a
259 // compatible framework for framework-dependent deployed BAs. We had to use hostfxr_initialize_for_dotnet_command_line since
260 // hostfxr_initialize_for_runtime_config doesn't currently (3.x) support self-contained deployed BAs. That means we're supposed to
261 // start the runtime through hostfxr_run_app, but that method shuts down the runtime before returning. We actually want to call
262 // hostfxr_get_runtime_delegate, but that method currently requires hostfxr to be initialized through
263 // hostfxr_initialize_for_runtime_config. So we're forced to locate coreclr.dll and manually load the runtime ourselves.
264
265 // Unfortunately, that's not the only problem. hostfxr has global state that tracks whether it started the runtime. While we keep our
266 // hostfxr_handle open, everyone that calls the hostfxr_initialize_* methods will block until we have started the runtime through
267 // hostfxr or closed our handle. If we close the handle, then hostfxr could potentially try to load a second runtime into the
268 // process, which is not supported. We're going to just keep our handle open since no one else in the process should be trying to
269 // start the runtime anyway.
270
271 rc = pState->pfnHostfxrGetRuntimeProperties(pState->hostContextHandle, &cProperties, rgPropertyKeys, rgPropertyValues);
272 if (HostApiBufferTooSmall != rc)
273 {
274 BalExitOnFailure(hr = rc, "HostfxrGetRuntimeProperties failed to return required size.");
275 }
276
277 rgPropertyKeys = static_cast<LPCWSTR*>(MemAlloc(sizeof(LPWSTR) * cProperties, TRUE));
278 rgPropertyValues = static_cast<LPCWSTR*>(MemAlloc(sizeof(LPWSTR) * cProperties, TRUE));
279 if (!rgPropertyKeys || !rgPropertyValues)
280 {
281 BalExitOnFailure(hr = E_OUTOFMEMORY, "Failed to allocate buffers for runtime properties.");
282 }
283
284 hr = pState->pfnHostfxrGetRuntimeProperties(pState->hostContextHandle, &cProperties, rgPropertyKeys, rgPropertyValues);
285 BalExitOnFailure(hr, "HostfxrGetRuntimeProperties failed.");
286
287 for (DWORD i = 0; i < cProperties; ++i)
288 {
289 if (CSTR_EQUAL == ::CompareString(LOCALE_INVARIANT, 0, rgPropertyKeys[i], -1, L"NATIVE_DLL_SEARCH_DIRECTORIES", -1))
290 {
291 hr = StrSplitAllocArray(&rgDirectories, &cDirectories, rgPropertyValues[i], L";");
292 BalExitOnFailure(hr, "Failed to split NATIVE_DLL_SEARCH_DIRECTORIES '%ls'", rgPropertyValues[i]);
293 }
294 }
295
296 for (DWORD i = 0; i < cDirectories; ++i)
297 {
298 hr = PathConcat(rgDirectories[i], L"coreclr.dll", &sczCoreClrPath);
299 BalExitOnFailure(hr, "Failed to allocate path to coreclr.");
300
301 if (::PathFileExists(sczCoreClrPath))
302 {
303 break;
304 }
305 else
306 {
307 ReleaseNullStr(sczCoreClrPath);
308 }
309 }
310
311 if (!sczCoreClrPath)
312 {
313 for (DWORD i = 0; i < cProperties; ++i)
314 {
315 BalLog(BOOTSTRAPPER_LOG_LEVEL_ERROR, "%ls: %ls", rgPropertyKeys[i], rgPropertyValues[i]);
316 }
317 BalExitOnFailure(hr = E_FILENOTFOUND, "Failed to locate coreclr.dll.");
318 }
319
320 hr = LoadCoreClr(pState, sczCoreClrPath);
321 BalExitOnFailure(hr, "Failed to load coreclr.");
322
323 hr = StartCoreClr(pState, wzNativeHostPath, (DWORD)cProperties, rgPropertyKeys, rgPropertyValues);
324 BalExitOnFailure(hr, "Failed to start coreclr.");
325
326LExit:
327 MemFree(rgDirectories);
328 MemFree(rgPropertyValues);
329 MemFree(rgPropertyKeys);
330 ReleaseStr(sczCoreClrPath);
331
332 return hr;
333}
334
335static HRESULT LoadCoreClr(
336 __in HOSTFXR_STATE* pState,
337 __in LPCWSTR wzCoreClrPath
338 )
339{
340 HRESULT hr = S_OK;
341 HMODULE hModule = NULL;
342
343 hModule = ::LoadLibraryExW(wzCoreClrPath, NULL, LOAD_WITH_ALTERED_SEARCH_PATH);
344 BalExitOnNullWithLastError(hModule, hr, "Failed to load coreclr.dll from '%ls'.", wzCoreClrPath);
345
346 pState->pfnCoreclrInitialize = reinterpret_cast<coreclr_initialize_ptr>(::GetProcAddress(hModule, "coreclr_initialize"));
347 BalExitOnNullWithLastError(pState->pfnCoreclrInitialize, hr, "Failed to get procedure address for coreclr_initialize.");
348
349 pState->pfnCoreclrCreateDelegate = reinterpret_cast<coreclr_create_delegate_ptr>(::GetProcAddress(hModule, "coreclr_create_delegate"));
350 BalExitOnNullWithLastError(pState->pfnCoreclrCreateDelegate, hr, "Failed to get procedure address for coreclr_create_delegate.");
351
352LExit:
353 // Never unload the module since coreclr doesn't support it.
354
355 return hr;
356}
357
358static HRESULT StartCoreClr(
359 __in HOSTFXR_STATE* pState,
360 __in LPCWSTR wzNativeHostPath,
361 __in DWORD cProperties,
362 __in LPCWSTR* propertyKeys,
363 __in LPCWSTR* propertyValues
364 )
365{
366 HRESULT hr = S_OK;
367 LPSTR szNativeHostPath = NULL;
368 LPSTR* rgPropertyKeys = NULL;
369 LPSTR* rgPropertyValues = NULL;
370
371 rgPropertyKeys = static_cast<LPSTR*>(MemAlloc(sizeof(LPSTR) * cProperties, TRUE));
372 rgPropertyValues = static_cast<LPSTR*>(MemAlloc(sizeof(LPSTR) * cProperties, TRUE));
373 if (!rgPropertyKeys || !rgPropertyValues)
374 {
375 BalExitOnFailure(hr = E_OUTOFMEMORY, "Failed to allocate buffers for runtime properties.");
376 }
377
378 hr = StrAnsiAllocString(&szNativeHostPath, wzNativeHostPath, 0, CP_UTF8);
379 BalExitOnFailure(hr, "Failed to convert module path to UTF8: %ls", wzNativeHostPath);
380
381 for (DWORD i = 0; i < cProperties; ++i)
382 {
383 hr = StrAnsiAllocString(&rgPropertyKeys[i], propertyKeys[i], 0, CP_UTF8);
384 BalExitOnFailure(hr, "Failed to convert property key to UTF8: %ls", propertyKeys[i]);
385
386 hr = StrAnsiAllocString(&rgPropertyValues[i], propertyValues[i], 0, CP_UTF8);
387 BalExitOnFailure(hr, "Failed to convert property value to UTF8: %ls", propertyValues[i]);
388 }
389
390 hr = pState->pfnCoreclrInitialize(szNativeHostPath, "MBA", cProperties, (LPCSTR*)rgPropertyKeys, (LPCSTR*)rgPropertyValues, &pState->pClrHandle, &pState->dwDomainId);
391 BalExitOnFailure(hr, "CoreclrInitialize failed.");
392
393LExit:
394 for (DWORD i = 0; i < cProperties; ++i)
395 {
396 if (rgPropertyKeys)
397 {
398 ReleaseStr(rgPropertyKeys[i]);
399 }
400
401 if (rgPropertyValues)
402 {
403 ReleaseStr(rgPropertyValues[i]);
404 }
405 }
406 ReleaseMem(rgPropertyValues);
407 ReleaseMem(rgPropertyKeys);
408 ReleaseStr(szNativeHostPath);
409
410 return hr;
411}
diff --git a/src/ext/Bal/dnchost/dncutil.h b/src/ext/Bal/dnchost/dncutil.h
new file mode 100644
index 00000000..85eda3b2
--- /dev/null
+++ b/src/ext/Bal/dnchost/dncutil.h
@@ -0,0 +1,38 @@
1#pragma once
2// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
3
4typedef IBootstrapperApplicationFactory* (STDMETHODCALLTYPE* PFNCREATEBAFACTORY)(
5 __in LPCWSTR wzBaFactoryAssemblyName,
6 __in LPCWSTR wzBaFactoryAssemblyPath
7 );
8
9struct HOSTFXR_STATE
10{
11 LPWSTR sczHostfxrPath;
12 hostfxr_handle hostContextHandle;
13 hostfxr_initialize_for_dotnet_command_line_fn pfnHostfxrInitializeForApp;
14 hostfxr_get_runtime_properties_fn pfnHostfxrGetRuntimeProperties;
15 hostfxr_set_error_writer_fn pfnHostfxrSetErrorWriter;
16 hostfxr_close_fn pfnHostfxrClose;
17 hostfxr_get_runtime_delegate_fn pfnHostfxrGetRuntimeDelegate;
18 get_function_pointer_fn pfnGetFunctionPointer;
19 coreclr_initialize_ptr pfnCoreclrInitialize;
20 coreclr_create_delegate_ptr pfnCoreclrCreateDelegate;
21 void* pClrHandle;
22 UINT dwDomainId;
23};
24
25HRESULT DnchostLoadRuntime(
26 __in HOSTFXR_STATE* pState,
27 __in LPCWSTR wzNativeHostPath,
28 __in LPCWSTR wzManagedHostPath,
29 __in LPCWSTR wzDepsJsonPath,
30 __in LPCWSTR wzRuntimeConfigPath
31 );
32
33HRESULT DnchostCreateFactory(
34 __in HOSTFXR_STATE* pState,
35 __in LPCWSTR wzBaFactoryAssemblyName,
36 __in LPCWSTR wzBaFactoryAssemblyPath,
37 __out IBootstrapperApplicationFactory** ppAppFactory
38 );
diff --git a/src/ext/Bal/dnchost/packages.config b/src/ext/Bal/dnchost/packages.config
new file mode 100644
index 00000000..6c369364
--- /dev/null
+++ b/src/ext/Bal/dnchost/packages.config
@@ -0,0 +1,13 @@
1<?xml version="1.0" encoding="utf-8"?>
2<packages>
3 <package id="Microsoft.Build.Tasks.Git" version="1.0.0" targetFramework="native" developmentDependency="true" />
4 <package id="Microsoft.SourceLink.Common" version="1.0.0" targetFramework="native" developmentDependency="true" />
5 <package id="Microsoft.SourceLink.GitHub" version="1.0.0" targetFramework="native" developmentDependency="true" />
6 <package id="Nerdbank.GitVersioning" version="3.3.37" targetFramework="native" developmentDependency="true" />
7 <package id="runtime.win-arm64.Microsoft.NETCore.DotNetAppHost" version="5.0.0" targetFramework="native" />
8 <package id="runtime.win-x64.Microsoft.NETCore.DotNetAppHost" version="5.0.0" targetFramework="native" />
9 <package id="runtime.win-x86.Microsoft.NETCore.DotNetAppHost" version="5.0.0" targetFramework="native" />
10 <package id="WixToolset.BalUtil" version="4.0.58" targetFramework="native" />
11 <package id="WixToolset.BootstrapperCore.Native" version="4.0.141" targetFramework="native" />
12 <package id="WixToolset.DUtil" version="4.0.72" targetFramework="native" />
13</packages> \ No newline at end of file
diff --git a/src/ext/Bal/dnchost/precomp.cpp b/src/ext/Bal/dnchost/precomp.cpp
new file mode 100644
index 00000000..37664a1c
--- /dev/null
+++ b/src/ext/Bal/dnchost/precomp.cpp
@@ -0,0 +1,3 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3#include "precomp.h"
diff --git a/src/ext/Bal/dnchost/precomp.h b/src/ext/Bal/dnchost/precomp.h
new file mode 100644
index 00000000..84ff6424
--- /dev/null
+++ b/src/ext/Bal/dnchost/precomp.h
@@ -0,0 +1,31 @@
1#pragma once
2// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
3
4#include <windows.h>
5#include <msiquery.h>
6#include <corerror.h>
7#include <Shlwapi.h>
8
9#include <dutil.h>
10#include <memutil.h>
11#include <pathutil.h>
12#include <strutil.h>
13#include <xmlutil.h>
14
15#include <BootstrapperEngine.h>
16#include <BootstrapperApplication.h>
17
18#include <IBootstrapperEngine.h>
19#include <IBootstrapperApplication.h>
20#include <IBootstrapperApplicationFactory.h>
21#include <balutil.h>
22
23#include <WixToolset.Dnc.Host.h>
24#define NETHOST_USE_AS_STATIC
25#include <nethost.h>
26#include <hostfxr.h>
27#include <coreclr_delegates.h>
28
29#include "coreclrhost.h"
30#include "dncutil.h"
31#include "dnchost.h"
diff --git a/src/ext/Bal/mbahost/mbahost.cpp b/src/ext/Bal/mbahost/mbahost.cpp
new file mode 100644
index 00000000..735f9f21
--- /dev/null
+++ b/src/ext/Bal/mbahost/mbahost.cpp
@@ -0,0 +1,649 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3#include "precomp.h"
4#include <WixToolset.Mba.Host.h> // includes the generated assembly name macros.
5
6static const DWORD NET452_RELEASE = 379893;
7
8using namespace mscorlib;
9
10extern "C" typedef HRESULT (WINAPI *PFN_CORBINDTOCURRENTRUNTIME)(
11 __in LPCWSTR pwszFileName,
12 __in REFCLSID rclsid,
13 __in REFIID riid,
14 __out LPVOID *ppv
15 );
16
17extern "C" typedef HRESULT(WINAPI *PFN_MBAPREQ_BOOTSTRAPPER_APPLICATION_CREATE)(
18 __in HRESULT hrHostInitialization,
19 __in IBootstrapperEngine* pEngine,
20 __in const BOOTSTRAPPER_CREATE_ARGS* pArgs,
21 __inout BOOTSTRAPPER_CREATE_RESULTS* pResults
22 );
23
24static HINSTANCE vhInstance = NULL;
25static ICorRuntimeHost *vpCLRHost = NULL;
26static _AppDomain *vpAppDomain = NULL;
27static HMODULE vhMbapreqModule = NULL;
28
29
30// internal function declarations
31
32static HRESULT GetAppDomain(
33 __out _AppDomain** ppAppDomain
34 );
35static HRESULT GetAppBase(
36 __out LPWSTR* psczAppBase
37 );
38static HRESULT CheckSupportedFrameworks(
39 __in LPCWSTR wzConfigPath
40 );
41static HRESULT UpdateSupportedRuntime(
42 __in IXMLDOMDocument* pixdManifest,
43 __in IXMLDOMNode* pixnSupportedFramework,
44 __out BOOL* pfUpdatedManifest
45 );
46static HRESULT GetCLRHost(
47 __in LPCWSTR wzConfigPath,
48 __out ICorRuntimeHost** ppCLRHost
49 );
50static HRESULT CreateManagedBootstrapperApplication(
51 __in _AppDomain* pAppDomain,
52 __in const BOOTSTRAPPER_CREATE_ARGS* pArgs,
53 __inout BOOTSTRAPPER_CREATE_RESULTS* pResults
54 );
55static HRESULT CreateManagedBootstrapperApplicationFactory(
56 __in _AppDomain* pAppDomain,
57 __out IBootstrapperApplicationFactory** ppAppFactory
58 );
59static HRESULT CreatePrerequisiteBA(
60 __in HRESULT hrHostInitialization,
61 __in IBootstrapperEngine* pEngine,
62 __in const BOOTSTRAPPER_CREATE_ARGS* pArgs,
63 __inout BOOTSTRAPPER_CREATE_RESULTS* pResults
64 );
65static HRESULT VerifyNET4RuntimeIsSupported(
66 );
67
68
69// function definitions
70
71extern "C" BOOL WINAPI DllMain(
72 IN HINSTANCE hInstance,
73 IN DWORD dwReason,
74 IN LPVOID /* pvReserved */
75 )
76{
77 switch (dwReason)
78 {
79 case DLL_PROCESS_ATTACH:
80 ::DisableThreadLibraryCalls(hInstance);
81 vhInstance = hInstance;
82 break;
83
84 case DLL_PROCESS_DETACH:
85 vhInstance = NULL;
86 break;
87 }
88
89 return TRUE;
90}
91
92// Note: This function assumes that COM was already initialized on the thread.
93extern "C" HRESULT WINAPI BootstrapperApplicationCreate(
94 __in const BOOTSTRAPPER_CREATE_ARGS* pArgs,
95 __inout BOOTSTRAPPER_CREATE_RESULTS* pResults
96 )
97{
98 HRESULT hr = S_OK;
99 HRESULT hrHostInitialization = S_OK;
100 IBootstrapperEngine* pEngine = NULL;
101
102 hr = BalInitializeFromCreateArgs(pArgs, &pEngine);
103 ExitOnFailure(hr, "Failed to initialize Bal.");
104
105 hr = GetAppDomain(&vpAppDomain);
106 if (SUCCEEDED(hr))
107 {
108 BalLog(BOOTSTRAPPER_LOG_LEVEL_STANDARD, "Loading managed bootstrapper application.");
109
110 hr = CreateManagedBootstrapperApplication(vpAppDomain, pArgs, pResults);
111 BalExitOnFailure(hr, "Failed to create the managed bootstrapper application.");
112 }
113 else // fallback to the prerequisite BA.
114 {
115 if (E_MBAHOST_NET452_ON_WIN7RTM == hr)
116 {
117 BalLogError(hr, "The Burn engine cannot run with an MBA under the .NET 4 CLR on Windows 7 RTM with .NET 4.5.2 (or greater) installed.");
118 hrHostInitialization = hr;
119 }
120 else
121 {
122 hrHostInitialization = S_OK;
123 }
124
125 BalLog(BOOTSTRAPPER_LOG_LEVEL_STANDARD, "Loading prerequisite bootstrapper application because managed host could not be loaded, error: 0x%08x.", hr);
126
127 hr = CreatePrerequisiteBA(hrHostInitialization, pEngine, pArgs, pResults);
128 BalExitOnFailure(hr, "Failed to create the pre-requisite bootstrapper application.");
129 }
130
131LExit:
132 ReleaseNullObject(pEngine);
133
134 return hr;
135}
136
137extern "C" void WINAPI BootstrapperApplicationDestroy()
138{
139 if (vpAppDomain)
140 {
141 HRESULT hr = vpCLRHost->UnloadDomain(vpAppDomain);
142 if (FAILED(hr))
143 {
144 BalLogError(hr, "Failed to unload app domain.");
145 }
146
147 vpAppDomain->Release();
148 }
149
150 if (vpCLRHost)
151 {
152 vpCLRHost->Stop();
153 vpCLRHost->Release();
154 }
155
156 if (vhMbapreqModule)
157 {
158 PFN_BOOTSTRAPPER_APPLICATION_DESTROY pfnDestroy = reinterpret_cast<PFN_BOOTSTRAPPER_APPLICATION_DESTROY>(::GetProcAddress(vhMbapreqModule, "MbaPrereqBootstrapperApplicationDestroy"));
159 if (pfnDestroy)
160 {
161 (*pfnDestroy)();
162 }
163
164 ::FreeLibrary(vhMbapreqModule);
165 vhMbapreqModule = NULL;
166 }
167
168 BalUninitialize();
169}
170
171// Gets the custom AppDomain for loading managed BA.
172static HRESULT GetAppDomain(
173 __out _AppDomain **ppAppDomain
174 )
175{
176 HRESULT hr = S_OK;
177 ICorRuntimeHost *pCLRHost = NULL;
178 IUnknown *pUnk = NULL;
179 LPWSTR sczAppBase = NULL;
180 LPWSTR sczConfigPath = NULL;
181 IAppDomainSetup *pAppDomainSetup;
182 BSTR bstrAppBase = NULL;
183 BSTR bstrConfigPath = NULL;
184
185 hr = GetAppBase(&sczAppBase);
186 ExitOnFailure(hr, "Failed to get the host base path.");
187
188 hr = PathConcat(sczAppBase, MBA_CONFIG_FILE_NAME, &sczConfigPath);
189 ExitOnFailure(hr, "Failed to get the full path to the application configuration file.");
190
191 // Check that the supported framework is installed.
192 hr = CheckSupportedFrameworks(sczConfigPath);
193 ExitOnFailure(hr, "Failed to find supported framework.");
194
195 // Load the CLR.
196 hr = GetCLRHost(sczConfigPath, &pCLRHost);
197 ExitOnFailure(hr, "Failed to create the CLR host.");
198
199 hr = pCLRHost->Start();
200 ExitOnRootFailure(hr, "Failed to start the CLR host.");
201
202 // Create the setup information for a new AppDomain to set the app base and config.
203 hr = pCLRHost->CreateDomainSetup(&pUnk);
204 ExitOnRootFailure(hr, "Failed to create the AppDomainSetup object.");
205
206 hr = pUnk->QueryInterface(__uuidof(IAppDomainSetup), reinterpret_cast<LPVOID*>(&pAppDomainSetup));
207 ExitOnRootFailure(hr, "Failed to query for the IAppDomainSetup interface.");
208 ReleaseNullObject(pUnk);
209
210 // Set properties on the AppDomainSetup object.
211 bstrAppBase = ::SysAllocString(sczAppBase);
212 ExitOnNull(bstrAppBase, hr, E_OUTOFMEMORY, "Failed to allocate the application base path for the AppDomainSetup.");
213
214 hr = pAppDomainSetup->put_ApplicationBase(bstrAppBase);
215 ExitOnRootFailure(hr, "Failed to set the application base path for the AppDomainSetup.");
216
217 bstrConfigPath = ::SysAllocString(sczConfigPath);
218 ExitOnNull(bstrConfigPath, hr, E_OUTOFMEMORY, "Failed to allocate the application configuration file for the AppDomainSetup.");
219
220 hr = pAppDomainSetup->put_ConfigurationFile(bstrConfigPath);
221 ExitOnRootFailure(hr, "Failed to set the configuration file path for the AppDomainSetup.");
222
223 // Create the AppDomain to load the factory type.
224 hr = pCLRHost->CreateDomainEx(L"MBA", pAppDomainSetup, NULL, &pUnk);
225 ExitOnRootFailure(hr, "Failed to create the MBA AppDomain.");
226
227 hr = pUnk->QueryInterface(__uuidof(_AppDomain), reinterpret_cast<LPVOID*>(ppAppDomain));
228 ExitOnRootFailure(hr, "Failed to query for the _AppDomain interface.");
229
230LExit:
231 ReleaseBSTR(bstrConfigPath);
232 ReleaseBSTR(bstrAppBase);
233 ReleaseStr(sczConfigPath);
234 ReleaseStr(sczAppBase);
235 ReleaseNullObject(pUnk);
236 ReleaseNullObject(pCLRHost);
237
238 return hr;
239}
240
241static HRESULT GetAppBase(
242 __out LPWSTR *psczAppBase
243 )
244{
245 HRESULT hr = S_OK;
246 LPWSTR sczFullPath = NULL;
247
248 hr = PathForCurrentProcess(&sczFullPath, vhInstance);
249 ExitOnFailure(hr, "Failed to get the full host path.");
250
251 hr = PathGetDirectory(sczFullPath, psczAppBase);
252 ExitOnFailure(hr, "Failed to get the directory of the full process path.");
253
254LExit:
255 ReleaseStr(sczFullPath);
256
257 return hr;
258}
259
260// Checks whether at least one of required supported frameworks is installed via the NETFX registry keys.
261static HRESULT CheckSupportedFrameworks(
262 __in LPCWSTR wzConfigPath
263 )
264{
265 HRESULT hr = S_OK;
266 IXMLDOMDocument* pixdManifest = NULL;
267 IXMLDOMNodeList* pNodeList = NULL;
268 IXMLDOMNode* pNode = NULL;
269 DWORD cSupportedFrameworks = 0;
270 LPWSTR sczSupportedFrameworkVersion = NULL;
271 LPWSTR sczFrameworkRegistryKey = NULL;
272 HKEY hkFramework = NULL;
273 DWORD dwFrameworkInstalled = 0;
274 BOOL fUpdatedManifest = FALSE;
275
276 hr = XmlInitialize();
277 ExitOnFailure(hr, "Failed to initialize XML.");
278
279 hr = XmlLoadDocumentFromFile(wzConfigPath, &pixdManifest);
280 ExitOnFailure(hr, "Failed to load bootstrapper config file from path: %ls", wzConfigPath);
281
282 hr = XmlSelectNodes(pixdManifest, L"/configuration/wix.bootstrapper/host/supportedFramework", &pNodeList);
283 ExitOnFailure(hr, "Failed to select all supportedFramework elements.");
284
285 hr = pNodeList->get_length(reinterpret_cast<long*>(&cSupportedFrameworks));
286 ExitOnFailure(hr, "Failed to get the supported framework count.");
287
288 if (cSupportedFrameworks)
289 {
290 while (S_OK == (hr = XmlNextElement(pNodeList, &pNode, NULL)))
291 {
292 hr = XmlGetAttributeEx(pNode, L"version", &sczSupportedFrameworkVersion);
293 ExitOnFailure(hr, "Failed to get supportedFramework/@version.");
294
295 hr = StrAllocFormatted(&sczFrameworkRegistryKey, L"SOFTWARE\\Microsoft\\NET Framework Setup\\NDP\\%ls", sczSupportedFrameworkVersion);
296 ExitOnFailure(hr, "Failed to allocate path to supported framework Install registry key.");
297
298 hr = RegOpen(HKEY_LOCAL_MACHINE, sczFrameworkRegistryKey, KEY_READ, &hkFramework);
299 if (SUCCEEDED(hr))
300 {
301 hr = RegReadNumber(hkFramework, L"Install", &dwFrameworkInstalled);
302 if (dwFrameworkInstalled)
303 {
304 hr = S_OK;
305 break;
306 }
307 }
308
309 ReleaseNullObject(pNode);
310 }
311
312 // If we looped through all the supported frameworks but didn't find anything, ensure we return a failure.
313 if (S_FALSE == hr)
314 {
315 hr = E_NOTFOUND;
316 ExitOnRootFailure(hr, "Failed to find a supported framework.");
317 }
318
319 hr = UpdateSupportedRuntime(pixdManifest, pNode, &fUpdatedManifest);
320 ExitOnFailure(hr, "Failed to update supportedRuntime.");
321 }
322 // else no supported frameworks specified, so the startup/supportedRuntime must be enough.
323
324 if (fUpdatedManifest)
325 {
326 hr = XmlSaveDocument(pixdManifest, wzConfigPath);
327 ExitOnFailure(hr, "Failed to save updated manifest over config file: %ls", wzConfigPath);
328 }
329
330LExit:
331 ReleaseRegKey(hkFramework);
332 ReleaseStr(sczFrameworkRegistryKey);
333 ReleaseStr(sczSupportedFrameworkVersion);
334 ReleaseObject(pNode);
335 ReleaseObject(pNodeList);
336 ReleaseObject(pixdManifest);
337
338 XmlUninitialize();
339
340 return hr;
341}
342
343// Fixes the supportedRuntime element if necessary.
344static HRESULT UpdateSupportedRuntime(
345 __in IXMLDOMDocument* pixdManifest,
346 __in IXMLDOMNode* pixnSupportedFramework,
347 __out BOOL* pfUpdatedManifest
348 )
349{
350 HRESULT hr = S_OK;
351 LPWSTR sczSupportedRuntimeVersion = NULL;
352 IXMLDOMNode* pixnStartup = NULL;
353 IXMLDOMNode* pixnSupportedRuntime = NULL;
354
355 *pfUpdatedManifest = FALSE;
356
357 // If the runtime version attribute is not specified, don't update the manifest.
358 hr = XmlGetAttributeEx(pixnSupportedFramework, L"runtimeVersion", &sczSupportedRuntimeVersion);
359 if (E_NOTFOUND == hr)
360 {
361 ExitFunction1(hr = S_OK);
362 }
363 ExitOnFailure(hr, "Failed to get supportedFramework/@runtimeVersion.");
364
365 // Get the startup element. Fail if we can't find it since it'll be necessary to load the
366 // correct runtime.
367 hr = XmlSelectSingleNode(pixdManifest, L"/configuration/startup", &pixnStartup);
368 ExitOnFailure(hr, "Failed to get startup element.");
369
370 if (S_FALSE == hr)
371 {
372 hr = E_NOTFOUND;
373 ExitOnRootFailure(hr, "Failed to find startup element in bootstrapper application config.");
374 }
375
376 // Remove any pre-existing supported runtimes because they'll just get in the way and create our new one.
377 hr = XmlRemoveChildren(pixnStartup, L"supportedRuntime");
378 ExitOnFailure(hr, "Failed to remove pre-existing supportedRuntime elements.");
379
380 hr = XmlCreateChild(pixnStartup, L"supportedRuntime", &pixnSupportedRuntime);
381 ExitOnFailure(hr, "Failed to create supportedRuntime element.");
382
383 hr = XmlSetAttribute(pixnSupportedRuntime, L"version", sczSupportedRuntimeVersion);
384 ExitOnFailure(hr, "Failed to set supportedRuntime/@version to '%ls'.", sczSupportedRuntimeVersion);
385
386 *pfUpdatedManifest = TRUE;
387
388LExit:
389 ReleaseObject(pixnSupportedRuntime);
390 ReleaseObject(pixnStartup);
391 ReleaseStr(sczSupportedRuntimeVersion);
392
393 return hr;
394}
395
396// Gets the CLR host and caches it.
397static HRESULT GetCLRHost(
398 __in LPCWSTR wzConfigPath,
399 __out ICorRuntimeHost **ppCLRHost
400 )
401{
402 HRESULT hr = S_OK;
403 UINT uiMode = 0;
404 HMODULE hModule = NULL;
405 BOOL fFallbackToCorBindToCurrentRuntime = TRUE;
406 CLRCreateInstanceFnPtr pfnCLRCreateInstance = NULL;
407 ICLRMetaHostPolicy* pCLRMetaHostPolicy = NULL;
408 IStream* pCfgStream = NULL;
409 LPWSTR pwzVersion = NULL;
410 DWORD cchVersion = 0;
411 DWORD dwConfigFlags = 0;
412 ICLRRuntimeInfo* pCLRRuntimeInfo = NULL;
413 PFN_CORBINDTOCURRENTRUNTIME pfnCorBindToCurrentRuntime = NULL;
414
415 // Always set the error mode because we will always restore it below.
416 uiMode = ::SetErrorMode(0);
417
418 // Cache the CLR host to be shutdown later. This can occur on a different thread.
419 if (!vpCLRHost)
420 {
421 // Disable message boxes from being displayed on error and blocking execution.
422 ::SetErrorMode(uiMode | SEM_FAILCRITICALERRORS);
423
424 hr = LoadSystemLibrary(L"mscoree.dll", &hModule);
425 ExitOnFailure(hr, "Failed to load mscoree.dll");
426
427 pfnCLRCreateInstance = reinterpret_cast<CLRCreateInstanceFnPtr>(::GetProcAddress(hModule, "CLRCreateInstance"));
428
429 if (pfnCLRCreateInstance)
430 {
431 hr = pfnCLRCreateInstance(CLSID_CLRMetaHostPolicy, IID_ICLRMetaHostPolicy, reinterpret_cast<LPVOID*>(&pCLRMetaHostPolicy));
432 if (E_NOTIMPL != hr)
433 {
434 ExitOnRootFailure(hr, "Failed to create instance of ICLRMetaHostPolicy.");
435
436 fFallbackToCorBindToCurrentRuntime = FALSE;
437 }
438 }
439
440 if (fFallbackToCorBindToCurrentRuntime)
441 {
442 pfnCorBindToCurrentRuntime = reinterpret_cast<PFN_CORBINDTOCURRENTRUNTIME>(::GetProcAddress(hModule, "CorBindToCurrentRuntime"));
443 ExitOnNullWithLastError(pfnCorBindToCurrentRuntime, hr, "Failed to get procedure address for CorBindToCurrentRuntime.");
444
445 hr = pfnCorBindToCurrentRuntime(wzConfigPath, CLSID_CorRuntimeHost, IID_ICorRuntimeHost, reinterpret_cast<LPVOID*>(&vpCLRHost));
446 ExitOnRootFailure(hr, "Failed to create the CLR host using the application configuration file path.");
447 }
448 else
449 {
450
451 hr = SHCreateStreamOnFileEx(wzConfigPath, STGM_READ | STGM_SHARE_DENY_WRITE, 0, FALSE, NULL, &pCfgStream);
452 ExitOnFailure(hr, "Failed to load bootstrapper config file from path: %ls", wzConfigPath);
453
454 hr = pCLRMetaHostPolicy->GetRequestedRuntime(METAHOST_POLICY_HIGHCOMPAT, NULL, pCfgStream, NULL, &cchVersion, NULL, NULL, &dwConfigFlags, IID_ICLRRuntimeInfo, reinterpret_cast<LPVOID*>(&pCLRRuntimeInfo));
455 ExitOnRootFailure(hr, "Failed to get the CLR runtime info using the application configuration file path.");
456
457 // .NET 4 RTM had a bug where it wouldn't set pcchVersion if pwzVersion was NULL.
458 if (!cchVersion)
459 {
460 hr = pCLRRuntimeInfo->GetVersionString(NULL, &cchVersion);
461 if (HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER) != hr)
462 {
463 ExitOnFailure(hr, "Failed to get the length of the CLR version string.");
464 }
465 }
466
467 hr = StrAlloc(&pwzVersion, cchVersion);
468 ExitOnFailure(hr, "Failed to allocate the CLR version string.");
469
470 hr = pCLRRuntimeInfo->GetVersionString(pwzVersion, &cchVersion);
471 ExitOnFailure(hr, "Failed to get the CLR version string.");
472
473 if (CSTR_EQUAL == CompareString(LOCALE_NEUTRAL, 0, L"v4.0.30319", -1, pwzVersion, cchVersion))
474 {
475 hr = VerifyNET4RuntimeIsSupported();
476 ExitOnFailure(hr, "Found unsupported .NET 4 Runtime.");
477 }
478
479 if (METAHOST_CONFIG_FLAGS_LEGACY_V2_ACTIVATION_POLICY_TRUE == (METAHOST_CONFIG_FLAGS_LEGACY_V2_ACTIVATION_POLICY_MASK & dwConfigFlags))
480 {
481 hr = pCLRRuntimeInfo->BindAsLegacyV2Runtime();
482 ExitOnRootFailure(hr, "Failed to bind as legacy V2 runtime.");
483 }
484
485 hr = pCLRRuntimeInfo->GetInterface(CLSID_CorRuntimeHost, IID_ICorRuntimeHost, reinterpret_cast<LPVOID*>(&vpCLRHost));
486 ExitOnRootFailure(hr, "Failed to get instance of ICorRuntimeHost.");
487
488 // TODO: use ICLRRuntimeHost instead of ICorRuntimeHost on .NET 4 since the former is faster and the latter is deprecated
489 //hr = pCLRRuntimeInfo->GetInterface(CLSID_CLRRuntimeHost, IID_ICLRRuntimeHost, reinterpret_cast<LPVOID*>(&pCLRRuntimeHost));
490 //ExitOnRootFailure(hr, "Failed to get instance of ICLRRuntimeHost.");
491 }
492 }
493
494 vpCLRHost->AddRef();
495 *ppCLRHost = vpCLRHost;
496
497LExit:
498 ReleaseStr(pwzVersion);
499 ReleaseNullObject(pCLRRuntimeInfo);
500 ReleaseNullObject(pCfgStream);
501 ReleaseNullObject(pCLRMetaHostPolicy);
502
503 // Unload the module so it's not in use when we install .NET.
504 if (FAILED(hr))
505 {
506 ::FreeLibrary(hModule);
507 }
508
509 ::SetErrorMode(uiMode); // restore the previous error mode.
510
511 return hr;
512}
513
514// Creates the bootstrapper app and returns it for the engine.
515static HRESULT CreateManagedBootstrapperApplication(
516 __in _AppDomain* pAppDomain,
517 __in const BOOTSTRAPPER_CREATE_ARGS* pArgs,
518 __inout BOOTSTRAPPER_CREATE_RESULTS* pResults
519 )
520{
521 HRESULT hr = S_OK;
522 IBootstrapperApplicationFactory* pAppFactory = NULL;
523
524 hr = CreateManagedBootstrapperApplicationFactory(pAppDomain, &pAppFactory);
525 ExitOnFailure(hr, "Failed to create the factory to create the bootstrapper application.");
526
527 hr = pAppFactory->Create(pArgs, pResults);
528 ExitOnFailure(hr, "Failed to create the bootstrapper application.");
529
530LExit:
531 ReleaseNullObject(pAppFactory);
532
533 return hr;
534}
535
536// Creates the app factory to create the managed app in the default AppDomain.
537static HRESULT CreateManagedBootstrapperApplicationFactory(
538 __in _AppDomain* pAppDomain,
539 __out IBootstrapperApplicationFactory** ppAppFactory
540 )
541{
542 HRESULT hr = S_OK;
543 BSTR bstrAssemblyName = NULL;
544 BSTR bstrTypeName = NULL;
545 _ObjectHandle* pObj = NULL;
546 VARIANT vtBAFactory;
547
548 ::VariantInit(&vtBAFactory);
549
550 bstrAssemblyName = ::SysAllocString(MBA_ASSEMBLY_FULL_NAME);
551 ExitOnNull(bstrAssemblyName, hr, E_OUTOFMEMORY, "Failed to allocate the full assembly name for the bootstrapper application factory.");
552
553 bstrTypeName = ::SysAllocString(MBA_ENTRY_TYPE);
554 ExitOnNull(bstrTypeName, hr, E_OUTOFMEMORY, "Failed to allocate the full type name for the BA factory.");
555
556 hr = pAppDomain->CreateInstance(bstrAssemblyName, bstrTypeName, &pObj);
557 ExitOnRootFailure(hr, "Failed to create the BA factory object.");
558
559 hr = pObj->Unwrap(&vtBAFactory);
560 ExitOnRootFailure(hr, "Failed to unwrap the BA factory object into the host domain.");
561 ExitOnNull(vtBAFactory.punkVal, hr, E_UNEXPECTED, "The variant did not contain the expected IUnknown pointer.");
562
563 hr = vtBAFactory.punkVal->QueryInterface(__uuidof(IBootstrapperApplicationFactory), reinterpret_cast<LPVOID*>(ppAppFactory));
564 ExitOnRootFailure(hr, "Failed to query for the bootstrapper app factory interface.");
565
566LExit:
567 ReleaseVariant(vtBAFactory);
568 ReleaseNullObject(pObj);
569 ReleaseBSTR(bstrTypeName);
570 ReleaseBSTR(bstrAssemblyName);
571
572 return hr;
573}
574
575static HRESULT CreatePrerequisiteBA(
576 __in HRESULT hrHostInitialization,
577 __in IBootstrapperEngine* pEngine,
578 __in const BOOTSTRAPPER_CREATE_ARGS* pArgs,
579 __inout BOOTSTRAPPER_CREATE_RESULTS* pResults
580 )
581{
582 HRESULT hr = S_OK;
583 LPWSTR sczMbapreqPath = NULL;
584 HMODULE hModule = NULL;
585
586 hr = PathRelativeToModule(&sczMbapreqPath, L"mbapreq.dll", vhInstance);
587 ExitOnFailure(hr, "Failed to get path to pre-requisite BA.");
588
589 hModule = ::LoadLibraryW(sczMbapreqPath);
590 ExitOnNullWithLastError(hModule, hr, "Failed to load pre-requisite BA DLL.");
591
592 PFN_MBAPREQ_BOOTSTRAPPER_APPLICATION_CREATE pfnCreate = reinterpret_cast<PFN_MBAPREQ_BOOTSTRAPPER_APPLICATION_CREATE>(::GetProcAddress(hModule, "MbaPrereqBootstrapperApplicationCreate"));
593 ExitOnNullWithLastError(pfnCreate, hr, "Failed to get MbaPrereqBootstrapperApplicationCreate entry-point from: %ls", sczMbapreqPath);
594
595 hr = pfnCreate(hrHostInitialization, pEngine, pArgs, pResults);
596 ExitOnFailure(hr, "Failed to create prequisite bootstrapper app.");
597
598 vhMbapreqModule = hModule;
599 hModule = NULL;
600
601LExit:
602 if (hModule)
603 {
604 ::FreeLibrary(hModule);
605 }
606 ReleaseStr(sczMbapreqPath);
607
608 return hr;
609}
610
611static HRESULT VerifyNET4RuntimeIsSupported(
612 )
613{
614 HRESULT hr = S_OK;
615 OS_VERSION osv = OS_VERSION_UNKNOWN;
616 DWORD dwServicePack = 0;
617 HKEY hKey = NULL;
618 DWORD er = ERROR_SUCCESS;
619 DWORD dwRelease = 0;
620 DWORD cchRelease = sizeof(dwRelease);
621
622 OsGetVersion(&osv, &dwServicePack);
623 if (OS_VERSION_WIN7 == osv && 0 == dwServicePack)
624 {
625 hr = RegOpen(HKEY_LOCAL_MACHINE, L"SOFTWARE\\Microsoft\\NET Framework Setup\\NDP\\v4\\Full", KEY_QUERY_VALUE, &hKey);
626 if (E_FILENOTFOUND == hr)
627 {
628 ExitFunction1(hr = S_OK);
629 }
630 ExitOnFailure(hr, "Failed to open registry key for .NET 4.");
631
632 er = ::RegQueryValueExW(hKey, L"Release", NULL, NULL, reinterpret_cast<LPBYTE>(&dwRelease), &cchRelease);
633 if (ERROR_FILE_NOT_FOUND == er)
634 {
635 ExitFunction1(hr = S_OK);
636 }
637 ExitOnWin32Error(er, hr, "Failed to get Release value.");
638
639 if (NET452_RELEASE <= dwRelease)
640 {
641 hr = E_MBAHOST_NET452_ON_WIN7RTM;
642 }
643 }
644
645LExit:
646 ReleaseRegKey(hKey);
647
648 return hr;
649}
diff --git a/src/ext/Bal/mbahost/mbahost.def b/src/ext/Bal/mbahost/mbahost.def
new file mode 100644
index 00000000..4488df94
--- /dev/null
+++ b/src/ext/Bal/mbahost/mbahost.def
@@ -0,0 +1,6 @@
1; Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3
4EXPORTS
5 BootstrapperApplicationCreate
6 BootstrapperApplicationDestroy
diff --git a/src/ext/Bal/mbahost/mbahost.vcxproj b/src/ext/Bal/mbahost/mbahost.vcxproj
new file mode 100644
index 00000000..6457b4e0
--- /dev/null
+++ b/src/ext/Bal/mbahost/mbahost.vcxproj
@@ -0,0 +1,106 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3
4<Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
5 <Import Project="..\..\packages\Microsoft.SourceLink.GitHub.1.0.0\build\Microsoft.SourceLink.GitHub.props" Condition="Exists('..\..\packages\Microsoft.SourceLink.GitHub.1.0.0\build\Microsoft.SourceLink.GitHub.props')" />
6 <Import Project="..\..\packages\Microsoft.SourceLink.Common.1.0.0\build\Microsoft.SourceLink.Common.props" Condition="Exists('..\..\packages\Microsoft.SourceLink.Common.1.0.0\build\Microsoft.SourceLink.Common.props')" />
7 <Import Project="..\..\packages\Microsoft.Build.Tasks.Git.1.0.0\build\Microsoft.Build.Tasks.Git.props" Condition="Exists('..\..\packages\Microsoft.Build.Tasks.Git.1.0.0\build\Microsoft.Build.Tasks.Git.props')" />
8 <Import Project="..\..\packages\WixToolset.BalUtil.4.0.58\build\WixToolset.BalUtil.props" Condition="Exists('..\..\packages\WixToolset.BalUtil.4.0.58\build\WixToolset.BalUtil.props')" />
9 <Import Project="..\..\packages\WixToolset.BootstrapperCore.Native.4.0.141\build\WixToolset.BootstrapperCore.Native.props" Condition="Exists('..\..\packages\WixToolset.BootstrapperCore.Native.4.0.141\build\WixToolset.BootstrapperCore.Native.props')" />
10 <Import Project="..\..\packages\WixToolset.DUtil.4.0.72\build\WixToolset.DUtil.props" Condition="Exists('..\..\packages\WixToolset.DUtil.4.0.72\build\WixToolset.DUtil.props')" />
11
12 <ItemGroup Label="ProjectConfigurations">
13 <ProjectConfiguration Include="Debug|ARM64">
14 <Configuration>Debug</Configuration>
15 <Platform>ARM64</Platform>
16 </ProjectConfiguration>
17 <ProjectConfiguration Include="Release|ARM64">
18 <Configuration>Release</Configuration>
19 <Platform>ARM64</Platform>
20 </ProjectConfiguration>
21 <ProjectConfiguration Include="Debug|Win32">
22 <Configuration>Debug</Configuration>
23 <Platform>Win32</Platform>
24 </ProjectConfiguration>
25 <ProjectConfiguration Include="Release|Win32">
26 <Configuration>Release</Configuration>
27 <Platform>Win32</Platform>
28 </ProjectConfiguration>
29 <ProjectConfiguration Include="Debug|x64">
30 <Configuration>Debug</Configuration>
31 <Platform>x64</Platform>
32 </ProjectConfiguration>
33 <ProjectConfiguration Include="Release|x64">
34 <Configuration>Release</Configuration>
35 <Platform>x64</Platform>
36 </ProjectConfiguration>
37 </ItemGroup>
38
39 <PropertyGroup Label="Globals">
40 <ProjectGuid>{12C87C77-3547-44F8-8134-29BC915CB19D}</ProjectGuid>
41 <ConfigurationType>DynamicLibrary</ConfigurationType>
42 <PlatformToolset>v142</PlatformToolset>
43 <CharacterSet>Unicode</CharacterSet>
44 <TargetName>mbahost</TargetName>
45 <ProjectModuleDefinitionFile>mbahost.def</ProjectModuleDefinitionFile>
46 </PropertyGroup>
47
48 <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
49 <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
50
51 <PropertyGroup>
52 <ProjectAdditionalLinkLibraries>shlwapi.lib</ProjectAdditionalLinkLibraries>
53 </PropertyGroup>
54
55 <ItemGroup>
56 <ClCompile Include="mbahost.cpp" />
57 <ClCompile Include="precomp.cpp">
58 <PrecompiledHeader>Create</PrecompiledHeader>
59 </ClCompile>
60 </ItemGroup>
61 <ItemGroup>
62 <ClInclude Include="precomp.h" />
63 </ItemGroup>
64 <ItemGroup>
65 <None Include="mbahost.def" />
66 </ItemGroup>
67
68 <ItemGroup>
69 <None Include="packages.config" />
70 </ItemGroup>
71
72 <ItemDefinitionGroup>
73 <ClCompile>
74 <AdditionalIncludeDirectories>$(BaseOutputPath)obj;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
75 </ClCompile>
76 </ItemDefinitionGroup>
77
78 <ItemGroup>
79 <ProjectReference Include="..\WixToolset.Mba.Host\WixToolset.Mba.Host.csproj">
80 <Project>{f2ba1935-70fa-4156-b161-fd03850b4faa}</Project>
81 <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
82 <SkipGetTargetFrameworkProperties>true</SkipGetTargetFrameworkProperties>
83 </ProjectReference>
84 </ItemGroup>
85
86 <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
87 <Import Project="..\..\packages\Microsoft.Build.Tasks.Git.1.0.0\build\Microsoft.Build.Tasks.Git.targets" Condition="Exists('..\..\packages\Microsoft.Build.Tasks.Git.1.0.0\build\Microsoft.Build.Tasks.Git.targets')" />
88 <Import Project="..\..\packages\Microsoft.SourceLink.Common.1.0.0\build\Microsoft.SourceLink.Common.targets" Condition="Exists('..\..\packages\Microsoft.SourceLink.Common.1.0.0\build\Microsoft.SourceLink.Common.targets')" />
89 <Import Project="..\..\packages\Microsoft.SourceLink.GitHub.1.0.0\build\Microsoft.SourceLink.GitHub.targets" Condition="Exists('..\..\packages\Microsoft.SourceLink.GitHub.1.0.0\build\Microsoft.SourceLink.GitHub.targets')" />
90 <Import Project="..\..\packages\Nerdbank.GitVersioning.3.3.37\build\Nerdbank.GitVersioning.targets" Condition="Exists('..\..\packages\Nerdbank.GitVersioning.3.3.37\build\Nerdbank.GitVersioning.targets')" />
91 <Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
92 <PropertyGroup>
93 <ErrorText>This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
94 </PropertyGroup>
95 <Error Condition="!Exists('..\..\packages\Microsoft.Build.Tasks.Git.1.0.0\build\Microsoft.Build.Tasks.Git.props')" Text="$([System.String]::Format('$(ErrorText)', '..\..\packages\Microsoft.Build.Tasks.Git.1.0.0\build\Microsoft.Build.Tasks.Git.props'))" />
96 <Error Condition="!Exists('..\..\packages\Microsoft.Build.Tasks.Git.1.0.0\build\Microsoft.Build.Tasks.Git.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\..\packages\Microsoft.Build.Tasks.Git.1.0.0\build\Microsoft.Build.Tasks.Git.targets'))" />
97 <Error Condition="!Exists('..\..\packages\Microsoft.SourceLink.Common.1.0.0\build\Microsoft.SourceLink.Common.props')" Text="$([System.String]::Format('$(ErrorText)', '..\..\packages\Microsoft.SourceLink.Common.1.0.0\build\Microsoft.SourceLink.Common.props'))" />
98 <Error Condition="!Exists('..\..\packages\Microsoft.SourceLink.Common.1.0.0\build\Microsoft.SourceLink.Common.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\..\packages\Microsoft.SourceLink.Common.1.0.0\build\Microsoft.SourceLink.Common.targets'))" />
99 <Error Condition="!Exists('..\..\packages\Microsoft.SourceLink.GitHub.1.0.0\build\Microsoft.SourceLink.GitHub.props')" Text="$([System.String]::Format('$(ErrorText)', '..\..\packages\Microsoft.SourceLink.GitHub.1.0.0\build\Microsoft.SourceLink.GitHub.props'))" />
100 <Error Condition="!Exists('..\..\packages\Microsoft.SourceLink.GitHub.1.0.0\build\Microsoft.SourceLink.GitHub.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\..\packages\Microsoft.SourceLink.GitHub.1.0.0\build\Microsoft.SourceLink.GitHub.targets'))" />
101 <Error Condition="!Exists('..\..\packages\Nerdbank.GitVersioning.3.3.37\build\Nerdbank.GitVersioning.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\..\packages\Nerdbank.GitVersioning.3.3.37\build\Nerdbank.GitVersioning.targets'))" />
102 <Error Condition="!Exists('..\..\packages\WixToolset.BalUtil.4.0.58\build\WixToolset.BalUtil.props')" Text="$([System.String]::Format('$(ErrorText)', '..\..\packages\WixToolset.BalUtil.4.0.58\build\WixToolset.BalUtil.props'))" />
103 <Error Condition="!Exists('..\..\packages\WixToolset.BootstrapperCore.Native.4.0.141\build\WixToolset.BootstrapperCore.Native.props')" Text="$([System.String]::Format('$(ErrorText)', '..\..\packages\WixToolset.BootstrapperCore.Native.4.0.141\build\WixToolset.BootstrapperCore.Native.props'))" />
104 <Error Condition="!Exists('..\..\packages\WixToolset.DUtil.4.0.72\build\WixToolset.DUtil.props')" Text="$([System.String]::Format('$(ErrorText)', '..\..\packages\WixToolset.DUtil.4.0.72\build\WixToolset.DUtil.props'))" />
105 </Target>
106</Project> \ No newline at end of file
diff --git a/src/ext/Bal/mbahost/packages.config b/src/ext/Bal/mbahost/packages.config
new file mode 100644
index 00000000..071284ac
--- /dev/null
+++ b/src/ext/Bal/mbahost/packages.config
@@ -0,0 +1,10 @@
1<?xml version="1.0" encoding="utf-8"?>
2<packages>
3 <package id="Microsoft.Build.Tasks.Git" version="1.0.0" targetFramework="native" developmentDependency="true" />
4 <package id="Microsoft.SourceLink.Common" version="1.0.0" targetFramework="native" developmentDependency="true" />
5 <package id="Microsoft.SourceLink.GitHub" version="1.0.0" targetFramework="native" developmentDependency="true" />
6 <package id="Nerdbank.GitVersioning" version="3.3.37" targetFramework="native" developmentDependency="true" />
7 <package id="WixToolset.BalUtil" version="4.0.58" targetFramework="native" />
8 <package id="WixToolset.BootstrapperCore.Native" version="4.0.141" targetFramework="native" />
9 <package id="WixToolset.DUtil" version="4.0.72" targetFramework="native" />
10</packages> \ No newline at end of file
diff --git a/src/ext/Bal/mbahost/precomp.cpp b/src/ext/Bal/mbahost/precomp.cpp
new file mode 100644
index 00000000..37664a1c
--- /dev/null
+++ b/src/ext/Bal/mbahost/precomp.cpp
@@ -0,0 +1,3 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3#include "precomp.h"
diff --git a/src/ext/Bal/mbahost/precomp.h b/src/ext/Bal/mbahost/precomp.h
new file mode 100644
index 00000000..d29a23f3
--- /dev/null
+++ b/src/ext/Bal/mbahost/precomp.h
@@ -0,0 +1,25 @@
1#pragma once
2// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
3
4
5#include <windows.h>
6#include <msiquery.h>
7#include <metahost.h>
8#include <shlwapi.h>
9
10#import <mscorlib.tlb> raw_interfaces_only rename("ReportEvent", "mscorlib_ReportEvent")
11
12#include <dutil.h>
13#include <osutil.h>
14#include <pathutil.h>
15#include <regutil.h>
16#include <strutil.h>
17#include <xmlutil.h>
18
19#include "BootstrapperEngine.h"
20#include "BootstrapperApplication.h"
21#include "IBootstrapperEngine.h"
22#include "IBootstrapperApplication.h"
23#include "IBootstrapperApplicationFactory.h"
24
25#include "balutil.h"
diff --git a/src/ext/Bal/nuget.config b/src/ext/Bal/nuget.config
new file mode 100644
index 00000000..f3277bc4
--- /dev/null
+++ b/src/ext/Bal/nuget.config
@@ -0,0 +1,19 @@
1<?xml version="1.0" encoding="utf-8"?>
2<configuration>
3 <packageSources>
4 <clear />
5 <add key="wixtoolset-burn" value="https://ci.appveyor.com/nuget/wixtoolset-burn" />
6 <add key="wixtoolset-data" value="https://ci.appveyor.com/nuget/wixtoolset-data" />
7 <add key="wixtoolset-extensibility" value="https://ci.appveyor.com/nuget/wixtoolset-extensibility" />
8 <add key="wixtoolset-core" value="https://ci.appveyor.com/nuget/wixtoolset-core" />
9 <add key="wixtoolset-core-native" value="https://ci.appveyor.com/nuget/wixtoolset-core-native" />
10 <add key="wixtoolset-dtf" value="https://ci.appveyor.com/nuget/wixtoolset-dtf" />
11 <add key="wixtoolset-balutil" value="https://ci.appveyor.com/nuget/wixtoolset-balutil" />
12 <add key="wixtoolset-dutil" value="https://ci.appveyor.com/nuget/wixtoolset-dutil" />
13 <add key="wixtoolset-netfx-wixext" value="https://ci.appveyor.com/nuget/wixtoolset-netfx-wixext" />
14 <add key="wixtoolset-wcautil" value="https://ci.appveyor.com/nuget/wixtoolset-wcautil" />
15 <add key="wixtoolset-tools" value="https://ci.appveyor.com/nuget/wixtoolset-tools" />
16 <add key="wixbuildtools" value="https://ci.appveyor.com/nuget/wixbuildtools" />
17 <add key="api.nuget.org" value="https://api.nuget.org/v3/index.json" protocolVersion="3" />
18 </packageSources>
19</configuration> \ No newline at end of file
diff --git a/src/ext/Bal/test/WixToolsetTest.Bal/BalExtensionFixture.cs b/src/ext/Bal/test/WixToolsetTest.Bal/BalExtensionFixture.cs
new file mode 100644
index 00000000..2ff57c55
--- /dev/null
+++ b/src/ext/Bal/test/WixToolsetTest.Bal/BalExtensionFixture.cs
@@ -0,0 +1,133 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolsetTest.Bal
4{
5 using System.IO;
6 using System.Linq;
7 using System.Xml;
8 using WixBuildTools.TestSupport;
9 using WixToolset.Core.TestPackage;
10 using Xunit;
11
12 public class BalExtensionFixture
13 {
14 [Fact]
15 public void CanBuildUsingDisplayInternalUICondition()
16 {
17 using (var fs = new DisposableFileSystem())
18 {
19 var baseFolder = fs.GetFolder();
20 var bundleFile = Path.Combine(baseFolder, "bin", "test.exe");
21 var bundleSourceFolder = TestData.Get(@"TestData\WixStdBa");
22 var intermediateFolder = Path.Combine(baseFolder, "obj");
23 var baFolderPath = Path.Combine(baseFolder, "ba");
24 var extractFolderPath = Path.Combine(baseFolder, "extract");
25
26 var compileResult = WixRunner.Execute(new[]
27 {
28 "build",
29 Path.Combine(bundleSourceFolder, "DisplayInternalUIConditionBundle.wxs"),
30 "-ext", TestData.Get(@"WixToolset.Bal.wixext.dll"),
31 "-intermediateFolder", intermediateFolder,
32 "-bindpath", Path.Combine(bundleSourceFolder, "data"),
33 "-o", bundleFile,
34 });
35 compileResult.AssertSuccess();
36
37 Assert.True(File.Exists(bundleFile));
38
39 var extractResult = BundleExtractor.ExtractBAContainer(null, bundleFile, baFolderPath, extractFolderPath);
40 extractResult.AssertSuccess();
41
42 var balPackageInfos = extractResult.SelectBADataNodes("/ba:BootstrapperApplicationData/ba:WixBalPackageInfo");
43 var balPackageInfo = (XmlNode)Assert.Single(balPackageInfos);
44 Assert.Equal("<WixBalPackageInfo PackageId='test.msi' DisplayInternalUICondition='1' />", balPackageInfo.GetTestXml());
45
46 Assert.True(File.Exists(Path.Combine(baFolderPath, "thm.wxl")));
47 }
48 }
49
50 [Fact]
51 public void CanBuildUsingOverridable()
52 {
53 using (var fs = new DisposableFileSystem())
54 {
55 var baseFolder = fs.GetFolder();
56 var bundleFile = Path.Combine(baseFolder, "bin", "test.exe");
57 var bundleSourceFolder = TestData.Get(@"TestData\Overridable");
58 var intermediateFolder = Path.Combine(baseFolder, "obj");
59 var baFolderPath = Path.Combine(baseFolder, "ba");
60 var extractFolderPath = Path.Combine(baseFolder, "extract");
61
62 var compileResult = WixRunner.Execute(new[]
63 {
64 "build",
65 Path.Combine(bundleSourceFolder, "Bundle.wxs"),
66 "-ext", TestData.Get(@"WixToolset.Bal.wixext.dll"),
67 "-intermediateFolder", intermediateFolder,
68 "-o", bundleFile,
69 });
70 compileResult.AssertSuccess();
71
72 Assert.True(File.Exists(bundleFile));
73
74 var extractResult = BundleExtractor.ExtractBAContainer(null, bundleFile, baFolderPath, extractFolderPath);
75 extractResult.AssertSuccess();
76
77 var balOverridableVariables = extractResult.SelectBADataNodes("/ba:BootstrapperApplicationData/ba:WixStdbaOverridableVariable");
78 var balOverridableVariable = (XmlNode)Assert.Single(balOverridableVariables);
79 Assert.Equal("<WixStdbaOverridableVariable Name='Test1' />", balOverridableVariable.GetTestXml());
80 }
81 }
82
83 [Fact]
84 public void CanBuildUsingWixStdBa()
85 {
86 using (var fs = new DisposableFileSystem())
87 {
88 var baseFolder = fs.GetFolder();
89 var bundleFile = Path.Combine(baseFolder, "bin", "test.exe");
90 var bundleSourceFolder = TestData.Get(@"TestData\WixStdBa");
91 var intermediateFolder = Path.Combine(baseFolder, "obj");
92
93 var compileResult = WixRunner.Execute(new[]
94 {
95 "build",
96 Path.Combine(bundleSourceFolder, "Bundle.wxs"),
97 "-ext", TestData.Get(@"WixToolset.Bal.wixext.dll"),
98 "-intermediateFolder", intermediateFolder,
99 "-o", bundleFile,
100 });
101 compileResult.AssertSuccess();
102
103 Assert.True(File.Exists(bundleFile));
104 }
105 }
106
107 [Fact]
108 public void CantBuildUsingMBAWithNoPrereqs()
109 {
110 using (var fs = new DisposableFileSystem())
111 {
112 var baseFolder = fs.GetFolder();
113 var bundleFile = Path.Combine(baseFolder, "bin", "test.exe");
114 var bundleSourceFolder = TestData.Get(@"TestData\MBA");
115 var intermediateFolder = Path.Combine(baseFolder, "obj");
116
117 var compileResult = WixRunner.Execute(new[]
118 {
119 "build",
120 Path.Combine(bundleSourceFolder, "Bundle.wxs"),
121 "-ext", TestData.Get(@"WixToolset.Bal.wixext.dll"),
122 "-intermediateFolder", intermediateFolder,
123 "-o", bundleFile,
124 });
125 Assert.Equal(6802, compileResult.ExitCode);
126 Assert.Equal("There must be at least one PrereqPackage when using the ManagedBootstrapperApplicationHost.\nThis is typically done by using the WixNetFxExtension and referencing one of the NetFxAsPrereq package groups.", compileResult.Messages[0].ToString());
127
128 Assert.False(File.Exists(bundleFile));
129 Assert.False(File.Exists(Path.Combine(intermediateFolder, "test.exe")));
130 }
131 }
132 }
133}
diff --git a/src/ext/Bal/test/WixToolsetTest.Bal/TestData/MBA/Bundle.wxs b/src/ext/Bal/test/WixToolsetTest.Bal/TestData/MBA/Bundle.wxs
new file mode 100644
index 00000000..ba1aefba
--- /dev/null
+++ b/src/ext/Bal/test/WixToolsetTest.Bal/TestData/MBA/Bundle.wxs
@@ -0,0 +1,12 @@
1<?xml version="1.0" encoding="utf-8"?>
2<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs"
3 xmlns:bal="http://wixtoolset.org/schemas/v4/wxs/bal">
4 <Bundle Name="WixStdBa" Version="1.0.0.0" Manufacturer="Example Corporation" UpgradeCode="75D5D534-E177-4689-AAE9-CAC1C39002C2">
5 <BootstrapperApplication>
6 <bal:WixManagedBootstrapperApplicationHost />
7 </BootstrapperApplication>
8 <Chain>
9 <ExePackage Permanent="yes" DetectCondition="none" SourceFile="runtimes\win-x86\native\wixnative.exe" />
10 </Chain>
11 </Bundle>
12</Wix>
diff --git a/src/ext/Bal/test/WixToolsetTest.Bal/TestData/Overridable/Bundle.wxs b/src/ext/Bal/test/WixToolsetTest.Bal/TestData/Overridable/Bundle.wxs
new file mode 100644
index 00000000..91380c69
--- /dev/null
+++ b/src/ext/Bal/test/WixToolsetTest.Bal/TestData/Overridable/Bundle.wxs
@@ -0,0 +1,13 @@
1<?xml version="1.0" encoding="utf-8"?>
2<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs"
3 xmlns:bal="http://wixtoolset.org/schemas/v4/wxs/bal">
4 <Bundle Name="WixStdBa" Version="1.0.0.0" Manufacturer="Example Corporation" UpgradeCode="75D5D534-E177-4689-AAE9-CAC1C39002C2">
5 <BootstrapperApplication>
6 <bal:WixStandardBootstrapperApplication LicenseUrl="http://wixtoolset.org/about/license/" Theme="hyperlinkLicense" />
7 </BootstrapperApplication>
8 <Variable Name="Test1" bal:Overridable="yes" />
9 <Chain>
10 <ExePackage Permanent="yes" DetectCondition="none" SourceFile="runtimes\win-x86\native\wixnative.exe" />
11 </Chain>
12 </Bundle>
13</Wix>
diff --git a/src/ext/Bal/test/WixToolsetTest.Bal/TestData/WixStdBa/Bundle.wxs b/src/ext/Bal/test/WixToolsetTest.Bal/TestData/WixStdBa/Bundle.wxs
new file mode 100644
index 00000000..c17b53ff
--- /dev/null
+++ b/src/ext/Bal/test/WixToolsetTest.Bal/TestData/WixStdBa/Bundle.wxs
@@ -0,0 +1,12 @@
1<?xml version="1.0" encoding="utf-8"?>
2<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs"
3 xmlns:bal="http://wixtoolset.org/schemas/v4/wxs/bal">
4 <Bundle Name="WixStdBa" Version="1.0.0.0" Manufacturer="Example Corporation" UpgradeCode="75D5D534-E177-4689-AAE9-CAC1C39002C2">
5 <BootstrapperApplication>
6 <bal:WixStandardBootstrapperApplication LicenseUrl="http://wixtoolset.org/about/license/" Theme="hyperlinkLicense" />
7 </BootstrapperApplication>
8 <Chain>
9 <ExePackage Permanent="yes" DetectCondition="none" SourceFile="runtimes\win-x86\native\wixnative.exe" />
10 </Chain>
11 </Bundle>
12</Wix>
diff --git a/src/ext/Bal/test/WixToolsetTest.Bal/TestData/WixStdBa/Data/test.msi b/src/ext/Bal/test/WixToolsetTest.Bal/TestData/WixStdBa/Data/test.msi
new file mode 100644
index 00000000..94aacd1a
--- /dev/null
+++ b/src/ext/Bal/test/WixToolsetTest.Bal/TestData/WixStdBa/Data/test.msi
Binary files differ
diff --git a/src/ext/Bal/test/WixToolsetTest.Bal/TestData/WixStdBa/DisplayInternalUIConditionBundle.wxs b/src/ext/Bal/test/WixToolsetTest.Bal/TestData/WixStdBa/DisplayInternalUIConditionBundle.wxs
new file mode 100644
index 00000000..f08cfe6a
--- /dev/null
+++ b/src/ext/Bal/test/WixToolsetTest.Bal/TestData/WixStdBa/DisplayInternalUIConditionBundle.wxs
@@ -0,0 +1,12 @@
1<?xml version="1.0" encoding="utf-8"?>
2<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs"
3 xmlns:bal="http://wixtoolset.org/schemas/v4/wxs/bal">
4 <Bundle Name="WixStdBa" Version="1.0.0.0" Manufacturer="Example Corporation" UpgradeCode="75D5D534-E177-4689-AAE9-CAC1C39002C2">
5 <BootstrapperApplication>
6 <bal:WixStandardBootstrapperApplication LicenseUrl="http://wixtoolset.org/about/license/" Theme="hyperlinkLicense" />
7 </BootstrapperApplication>
8 <Chain>
9 <MsiPackage SourceFile="test.msi" bal:DisplayInternalUICondition="1" />
10 </Chain>
11 </Bundle>
12</Wix>
diff --git a/src/ext/Bal/test/WixToolsetTest.Bal/WixToolsetTest.Bal.csproj b/src/ext/Bal/test/WixToolsetTest.Bal/WixToolsetTest.Bal.csproj
new file mode 100644
index 00000000..c9ab4219
--- /dev/null
+++ b/src/ext/Bal/test/WixToolsetTest.Bal/WixToolsetTest.Bal.csproj
@@ -0,0 +1,43 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3
4<Project Sdk="Microsoft.NET.Sdk">
5 <PropertyGroup>
6 <TargetFramework>netcoreapp3.1</TargetFramework>
7 <IsPackable>false</IsPackable>
8 </PropertyGroup>
9
10 <ItemGroup>
11 <Content Include="TestData\MBA\Bundle.wxs" CopyToOutputDirectory="PreserveNewest" />
12 <Content Include="TestData\Overridable\Bundle.wxs" CopyToOutputDirectory="PreserveNewest" />
13 <Content Include="TestData\WixStdBa\Bundle.wxs" CopyToOutputDirectory="PreserveNewest" />
14 <Content Include="TestData\WixStdBa\Data\test.msi" CopyToOutputDirectory="PreserveNewest" />
15 <Content Include="TestData\WixStdBa\DisplayInternalUIConditionBundle.wxs" CopyToOutputDirectory="PreserveNewest" />
16 </ItemGroup>
17
18 <Target Name="CopyExtensions" AfterTargets="Build">
19 <Copy DestinationFolder="$(OutputPath)" SourceFiles="@(WixExtension)" />
20 </Target>
21
22 <ItemGroup>
23 <ProjectReference Include="..\..\wixext\WixToolset.Bal.wixext.csproj" />
24 </ItemGroup>
25
26 <ItemGroup>
27 <PackageReference Include="WixToolset.Core" Version="4.0.*" />
28 <PackageReference Include="WixToolset.Core.Burn" Version="4.0.*" />
29 <PackageReference Include="WixToolset.Core.WindowsInstaller" Version="4.0.*" />
30 <PackageReference Include="WixToolset.Core.TestPackage" Version="4.0.*" />
31 <PackageReference Include="WixToolset.Data" Version="4.0.*" />
32 </ItemGroup>
33
34 <ItemGroup>
35 <PackageReference Include="WixBuildTools.TestSupport" Version="4.0.*" />
36 </ItemGroup>
37
38 <ItemGroup>
39 <PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.3.0" />
40 <PackageReference Include="xunit" Version="2.4.1" />
41 <PackageReference Include="xunit.runner.visualstudio" Version="2.4.1" PrivateAssets="All" />
42 </ItemGroup>
43</Project>
diff --git a/src/ext/Bal/test/WixToolsetTest.Bal/WixToolsetTest.Bal.v3.ncrunchproject b/src/ext/Bal/test/WixToolsetTest.Bal/WixToolsetTest.Bal.v3.ncrunchproject
new file mode 100644
index 00000000..7b5b2139
--- /dev/null
+++ b/src/ext/Bal/test/WixToolsetTest.Bal/WixToolsetTest.Bal.v3.ncrunchproject
@@ -0,0 +1,5 @@
1<ProjectConfiguration>
2 <Settings>
3 <CopyReferencedAssembliesToWorkspace>True</CopyReferencedAssembliesToWorkspace>
4 </Settings>
5</ProjectConfiguration> \ No newline at end of file
diff --git a/src/ext/Bal/test/WixToolsetTest.ManagedHost/DncHostFixture.cs b/src/ext/Bal/test/WixToolsetTest.ManagedHost/DncHostFixture.cs
new file mode 100644
index 00000000..af5f2543
--- /dev/null
+++ b/src/ext/Bal/test/WixToolsetTest.ManagedHost/DncHostFixture.cs
@@ -0,0 +1,209 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolsetTest.ManagedHost
4{
5 using System.IO;
6 using WixBuildTools.TestSupport;
7 using WixToolset.Core.TestPackage;
8 using Xunit;
9
10 public class DncHostFixture
11 {
12 static readonly string bundleBasePath = TestData.Get("..", "examples");
13
14 [Fact]
15 public void CanLoadFDDEarliestCoreMBA()
16 {
17 using (var fs = new DisposableFileSystem())
18 {
19 var baseFolder = fs.GetFolder();
20 var bundleFile = TestData.Get(bundleBasePath, "EarliestCoreBundleFDD.exe");
21 var testEngine = new TestEngine();
22
23 var result = testEngine.RunShutdownEngine(bundleFile, baseFolder);
24 var logMessages = result.Output;
25 Assert.Equal("Loading .NET Core FDD bootstrapper application.", logMessages[0]);
26 Assert.Equal("Creating BA thread to run asynchronously.", logMessages[1]);
27 Assert.Equal("EarliestCoreBA", logMessages[2]);
28 Assert.Equal("Shutdown,ReloadBootstrapper,0", logMessages[3]);
29 }
30 }
31
32 [Fact]
33 public void CanLoadSCDEarliestCoreMBA()
34 {
35 using (var fs = new DisposableFileSystem())
36 {
37 var baseFolder = fs.GetFolder();
38 var bundleFile = TestData.Get(bundleBasePath, "EarliestCoreBundleSCD.exe");
39 var testEngine = new TestEngine();
40
41 var result = testEngine.RunShutdownEngine(bundleFile, baseFolder);
42 var logMessages = result.Output;
43 Assert.Equal("Loading .NET Core SCD bootstrapper application.", logMessages[0]);
44 Assert.Equal("Creating BA thread to run asynchronously.", logMessages[1]);
45 Assert.Equal("EarliestCoreBA", logMessages[2]);
46 Assert.Equal("Shutdown,ReloadBootstrapper,0", logMessages[3]);
47 }
48 }
49
50 [Fact]
51 public void CanLoadTrimmedSCDEarliestCoreMBA()
52 {
53 using (var fs = new DisposableFileSystem())
54 {
55 var baseFolder = fs.GetFolder();
56 var bundleFile = TestData.Get(bundleBasePath, "EarliestCoreBundleTrimmedSCD.exe");
57 var testEngine = new TestEngine();
58
59 var result = testEngine.RunShutdownEngine(bundleFile, baseFolder);
60 var logMessages = result.Output;
61 Assert.Equal("Loading .NET Core SCD bootstrapper application.", logMessages[0]);
62 Assert.Equal("Creating BA thread to run asynchronously.", logMessages[1]);
63 Assert.Equal("EarliestCoreBA", logMessages[2]);
64 Assert.Equal("Shutdown,ReloadBootstrapper,0", logMessages[3]);
65 }
66 }
67
68 [Fact]
69 public void CanReloadSCDEarliestCoreMBA()
70 {
71 using (var fs = new DisposableFileSystem())
72 {
73 var baseFolder = fs.GetFolder();
74 var bundleFile = TestData.Get(bundleBasePath, "EarliestCoreBundleSCD.exe");
75 var testEngine = new TestEngine();
76
77 var result = testEngine.RunReloadEngine(bundleFile, baseFolder);
78 var logMessages = result.Output;
79 Assert.Equal("Loading .NET Core SCD bootstrapper application.", logMessages[0]);
80 Assert.Equal("Creating BA thread to run asynchronously.", logMessages[1]);
81 Assert.Equal("EarliestCoreBA", logMessages[2]);
82 Assert.Equal("Shutdown,ReloadBootstrapper,0", logMessages[3]);
83 Assert.Equal("Loading .NET Core SCD bootstrapper application.", logMessages[4]);
84 Assert.Equal("Reloaded 1 time(s)", logMessages[5]); // dnchost doesn't currently support unloading
85 Assert.Equal("Creating BA thread to run asynchronously.", logMessages[6]);
86 Assert.Equal("EarliestCoreBA", logMessages[7]);
87 Assert.Equal("Shutdown,Restart,0", logMessages[8]);
88 }
89 }
90
91 [Fact]
92 public void CanLoadFDDLatestCoreMBA()
93 {
94 using (var fs = new DisposableFileSystem())
95 {
96 var baseFolder = fs.GetFolder();
97 var bundleFile = TestData.Get(bundleBasePath, "LatestCoreBundleFDD.exe");
98 var testEngine = new TestEngine();
99
100 var result = testEngine.RunShutdownEngine(bundleFile, baseFolder);
101 var logMessages = result.Output;
102 Assert.Equal("Loading .NET Core FDD bootstrapper application.", logMessages[0]);
103 Assert.Equal("Creating BA thread to run asynchronously.", logMessages[1]);
104 Assert.Equal("LatestCoreBA", logMessages[2]);
105 Assert.Equal("Shutdown,ReloadBootstrapper,0", logMessages[3]);
106 }
107 }
108
109 [Fact]
110 public void CanReloadFDDLatestCoreMBA()
111 {
112 using (var fs = new DisposableFileSystem())
113 {
114 var baseFolder = fs.GetFolder();
115 var bundleFile = TestData.Get(bundleBasePath, "LatestCoreBundleFDD.exe");
116 var testEngine = new TestEngine();
117
118 var result = testEngine.RunReloadEngine(bundleFile, baseFolder);
119 var logMessages = result.Output;
120 Assert.Equal("Loading .NET Core FDD bootstrapper application.", logMessages[0]);
121 Assert.Equal("Creating BA thread to run asynchronously.", logMessages[1]);
122 Assert.Equal("LatestCoreBA", logMessages[2]);
123 Assert.Equal("Shutdown,ReloadBootstrapper,0", logMessages[3]);
124 Assert.Equal("Loading .NET Core FDD bootstrapper application.", logMessages[4]);
125 Assert.Equal("Reloaded 1 time(s)", logMessages[5]); // dnchost doesn't currently support unloading
126 Assert.Equal("Creating BA thread to run asynchronously.", logMessages[6]);
127 Assert.Equal("LatestCoreBA", logMessages[7]);
128 Assert.Equal("Shutdown,Restart,0", logMessages[8]);
129 }
130 }
131
132 [Fact]
133 public void CanLoadSCDLatestCoreMBA()
134 {
135 using (var fs = new DisposableFileSystem())
136 {
137 var baseFolder = fs.GetFolder();
138 var bundleFile = TestData.Get(bundleBasePath, "LatestCoreBundleSCD.exe");
139 var testEngine = new TestEngine();
140
141 var result = testEngine.RunShutdownEngine(bundleFile, baseFolder);
142 var logMessages = result.Output;
143 Assert.Equal("Loading .NET Core SCD bootstrapper application.", logMessages[0]);
144 Assert.Equal("Creating BA thread to run asynchronously.", logMessages[1]);
145 Assert.Equal("LatestCoreBA", logMessages[2]);
146 Assert.Equal("Shutdown,ReloadBootstrapper,0", logMessages[3]);
147 }
148 }
149
150 [Fact]
151 public void CanLoadTrimmedSCDLatestCoreMBA()
152 {
153 using (var fs = new DisposableFileSystem())
154 {
155 var baseFolder = fs.GetFolder();
156 var bundleFile = TestData.Get(bundleBasePath, "LatestCoreBundleTrimmedSCD.exe");
157 var testEngine = new TestEngine();
158
159 var result = testEngine.RunShutdownEngine(bundleFile, baseFolder);
160 var logMessages = result.Output;
161 Assert.Equal("Loading .NET Core SCD bootstrapper application.", logMessages[0]);
162 Assert.Equal("Creating BA thread to run asynchronously.", logMessages[1]);
163 Assert.Equal("LatestCoreBA", logMessages[2]);
164 Assert.Equal("Shutdown,ReloadBootstrapper,0", logMessages[3]);
165 }
166 }
167
168 [Fact]
169 public void CanReloadSCDLatestCoreMBA()
170 {
171 using (var fs = new DisposableFileSystem())
172 {
173 var baseFolder = fs.GetFolder();
174 var bundleFile = TestData.Get(bundleBasePath, "LatestCoreBundleSCD.exe");
175 var testEngine = new TestEngine();
176
177 var result = testEngine.RunReloadEngine(bundleFile, baseFolder);
178 var logMessages = result.Output;
179 Assert.Equal("Loading .NET Core SCD bootstrapper application.", logMessages[0]);
180 Assert.Equal("Creating BA thread to run asynchronously.", logMessages[1]);
181 Assert.Equal("LatestCoreBA", logMessages[2]);
182 Assert.Equal("Shutdown,ReloadBootstrapper,0", logMessages[3]);
183 Assert.Equal("Loading .NET Core SCD bootstrapper application.", logMessages[4]);
184 Assert.Equal("Reloaded 1 time(s)", logMessages[5]); // dnchost doesn't currently support unloading
185 Assert.Equal("Creating BA thread to run asynchronously.", logMessages[6]);
186 Assert.Equal("LatestCoreBA", logMessages[7]);
187 Assert.Equal("Shutdown,Restart,0", logMessages[8]);
188 }
189 }
190
191 [Fact]
192 public void CanLoadFDDWPFCoreMBA()
193 {
194 using (var fs = new DisposableFileSystem())
195 {
196 var baseFolder = fs.GetFolder();
197 var bundleFile = TestData.Get(bundleBasePath, "WPFCoreBundleFDD.exe");
198 var testEngine = new TestEngine();
199
200 var result = testEngine.RunShutdownEngine(bundleFile, baseFolder);
201 var logMessages = result.Output;
202 Assert.Equal("Loading .NET Core FDD bootstrapper application.", logMessages[0]);
203 Assert.Equal("Creating BA thread to run asynchronously.", logMessages[1]);
204 Assert.Equal("WPFCoreBA", logMessages[2]);
205 Assert.Equal("Shutdown,ReloadBootstrapper,0", logMessages[3]);
206 }
207 }
208 }
209}
diff --git a/src/ext/Bal/test/WixToolsetTest.ManagedHost/MbaHostFixture.cs b/src/ext/Bal/test/WixToolsetTest.ManagedHost/MbaHostFixture.cs
new file mode 100644
index 00000000..dd37ee58
--- /dev/null
+++ b/src/ext/Bal/test/WixToolsetTest.ManagedHost/MbaHostFixture.cs
@@ -0,0 +1,94 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolsetTest.ManagedHost
4{
5 using System.IO;
6 using WixBuildTools.TestSupport;
7 using WixToolset.Core.TestPackage;
8 using Xunit;
9
10 public class MbaHostFixture
11 {
12 static readonly string bundleBasePath = TestData.Get("..", "examples");
13
14 [Fact]
15 public void CanLoadFullFramework2MBA()
16 {
17 using (var fs = new DisposableFileSystem())
18 {
19 var baseFolder = fs.GetFolder();
20 var bundleFile = TestData.Get(bundleBasePath, "FullFramework2Bundle.exe");
21 var testEngine = new TestEngine();
22
23 var result = testEngine.RunShutdownEngine(bundleFile, baseFolder);
24 var logMessages = result.Output;
25 Assert.Equal("Loading managed bootstrapper application.", logMessages[0]);
26 Assert.Equal("Creating BA thread to run asynchronously.", logMessages[1]);
27 Assert.Equal("FullFramework2BA", logMessages[2]);
28 Assert.Equal("Shutdown,ReloadBootstrapper,0", logMessages[3]);
29 }
30 }
31
32 [Fact]
33 public void CanLoadFullFramework4MBA()
34 {
35 using (var fs = new DisposableFileSystem())
36 {
37 var baseFolder = fs.GetFolder();
38 var bundleFile = TestData.Get(bundleBasePath, "FullFramework4Bundle.exe");
39 var testEngine = new TestEngine();
40
41 var result = testEngine.RunShutdownEngine(bundleFile, baseFolder);
42 var logMessages = result.Output;
43 Assert.Equal("Loading managed bootstrapper application.", logMessages[0]);
44 Assert.Equal("Creating BA thread to run asynchronously.", logMessages[1]);
45 Assert.Equal("FullFramework4BA", logMessages[2]);
46 Assert.Equal("Shutdown,ReloadBootstrapper,0", logMessages[3]);
47 }
48 }
49
50 [Fact]
51 public void CanReloadFullFramework2MBA()
52 {
53 using (var fs = new DisposableFileSystem())
54 {
55 var baseFolder = fs.GetFolder();
56 var bundleFile = TestData.Get(bundleBasePath, "FullFramework2Bundle.exe");
57 var testEngine = new TestEngine();
58
59 var result = testEngine.RunReloadEngine(bundleFile, baseFolder);
60 var logMessages = result.Output;
61 Assert.Equal("Loading managed bootstrapper application.", logMessages[0]);
62 Assert.Equal("Creating BA thread to run asynchronously.", logMessages[1]);
63 Assert.Equal("FullFramework2BA", logMessages[2]);
64 Assert.Equal("Shutdown,ReloadBootstrapper,0", logMessages[3]);
65 Assert.Equal("Loading managed bootstrapper application.", logMessages[4]);
66 Assert.Equal("Creating BA thread to run asynchronously.", logMessages[5]);
67 Assert.Equal("FullFramework2BA", logMessages[6]);
68 Assert.Equal("Shutdown,Restart,0", logMessages[7]);
69 }
70 }
71
72 [Fact]
73 public void CanReloadFullFramework4MBA()
74 {
75 using (var fs = new DisposableFileSystem())
76 {
77 var baseFolder = fs.GetFolder();
78 var bundleFile = TestData.Get(bundleBasePath, "FullFramework4Bundle.exe");
79 var testEngine = new TestEngine();
80
81 var result = testEngine.RunReloadEngine(bundleFile, baseFolder);
82 var logMessages = result.Output;
83 Assert.Equal("Loading managed bootstrapper application.", logMessages[0]);
84 Assert.Equal("Creating BA thread to run asynchronously.", logMessages[1]);
85 Assert.Equal("FullFramework4BA", logMessages[2]);
86 Assert.Equal("Shutdown,ReloadBootstrapper,0", logMessages[3]);
87 Assert.Equal("Loading managed bootstrapper application.", logMessages[4]);
88 Assert.Equal("Creating BA thread to run asynchronously.", logMessages[5]);
89 Assert.Equal("FullFramework4BA", logMessages[6]);
90 Assert.Equal("Shutdown,Restart,0", logMessages[7]);
91 }
92 }
93 }
94}
diff --git a/src/ext/Bal/test/WixToolsetTest.ManagedHost/README.md b/src/ext/Bal/test/WixToolsetTest.ManagedHost/README.md
new file mode 100644
index 00000000..d7e73df2
--- /dev/null
+++ b/src/ext/Bal/test/WixToolsetTest.ManagedHost/README.md
@@ -0,0 +1,5 @@
1In order to properly test dnchost and mbahost,
2the managed BAs need to be published and a bundle needs to be built for each scenario.
3Making this happen on every build for the solution takes too long,
4so this project relies on manually running appveyor.cmd to publish everything before the tests can be run.
5appveyor.cmd needs to be ran again every time changes are made in other projects. \ No newline at end of file
diff --git a/src/ext/Bal/test/WixToolsetTest.ManagedHost/TestEngine.cs b/src/ext/Bal/test/WixToolsetTest.ManagedHost/TestEngine.cs
new file mode 100644
index 00000000..44538227
--- /dev/null
+++ b/src/ext/Bal/test/WixToolsetTest.ManagedHost/TestEngine.cs
@@ -0,0 +1,74 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolsetTest.ManagedHost
4{
5 using System.Collections.Generic;
6 using System.Diagnostics;
7 using System.IO;
8 using WixBuildTools.TestSupport;
9 using WixToolset.Core.TestPackage;
10
11 public class TestEngine
12 {
13 private static readonly string TestEngineFile = TestData.Get(@"..\Win32\examples\Example.TestEngine\Example.TestEngine.exe");
14
15 public TestEngineResult RunReloadEngine(string bundleFilePath, string tempFolderPath)
16 {
17 return this.RunTestEngine("reload", bundleFilePath, tempFolderPath);
18 }
19
20 public TestEngineResult RunShutdownEngine(string bundleFilePath, string tempFolderPath)
21 {
22 return this.RunTestEngine("shutdown", bundleFilePath, tempFolderPath);
23 }
24
25 private TestEngineResult RunTestEngine(string engineMode, string bundleFilePath, string tempFolderPath)
26 {
27 var baFolderPath = Path.Combine(tempFolderPath, "ba");
28 var extractFolderPath = Path.Combine(tempFolderPath, "extract");
29 var extractResult = BundleExtractor.ExtractBAContainer(null, bundleFilePath, baFolderPath, extractFolderPath);
30 extractResult.AssertSuccess();
31
32 var args = new string[] {
33 engineMode,
34 '"' + bundleFilePath + '"',
35 '"' + extractResult.GetBAFilePath(baFolderPath) + '"',
36 };
37 return RunProcessCaptureOutput(TestEngineFile, args);
38 }
39
40 private static TestEngineResult RunProcessCaptureOutput(string executablePath, string[] arguments = null, string workingFolder = null)
41 {
42 var startInfo = new ProcessStartInfo(executablePath)
43 {
44 Arguments = string.Join(' ', arguments),
45 CreateNoWindow = true,
46 RedirectStandardError = true,
47 RedirectStandardOutput = true,
48 UseShellExecute = false,
49 WorkingDirectory = workingFolder,
50 };
51
52 var exitCode = 0;
53 var output = new List<string>();
54
55 using (var process = Process.Start(startInfo))
56 {
57 process.OutputDataReceived += (s, e) => { if (e.Data != null) { output.Add(e.Data); } };
58 process.ErrorDataReceived += (s, e) => { if (e.Data != null) { output.Add(e.Data); } };
59
60 process.BeginErrorReadLine();
61 process.BeginOutputReadLine();
62
63 process.WaitForExit();
64 exitCode = process.ExitCode;
65 }
66
67 return new TestEngineResult
68 {
69 ExitCode = exitCode,
70 Output = output,
71 };
72 }
73 }
74}
diff --git a/src/ext/Bal/test/WixToolsetTest.ManagedHost/TestEngineResult.cs b/src/ext/Bal/test/WixToolsetTest.ManagedHost/TestEngineResult.cs
new file mode 100644
index 00000000..63f6f7f5
--- /dev/null
+++ b/src/ext/Bal/test/WixToolsetTest.ManagedHost/TestEngineResult.cs
@@ -0,0 +1,12 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolsetTest.ManagedHost
4{
5 using System.Collections.Generic;
6
7 public class TestEngineResult
8 {
9 public int ExitCode { get; set; }
10 public List<string> Output { get; set; }
11 }
12}
diff --git a/src/ext/Bal/test/WixToolsetTest.ManagedHost/WixToolsetTest.ManagedHost.csproj b/src/ext/Bal/test/WixToolsetTest.ManagedHost/WixToolsetTest.ManagedHost.csproj
new file mode 100644
index 00000000..38c8926c
--- /dev/null
+++ b/src/ext/Bal/test/WixToolsetTest.ManagedHost/WixToolsetTest.ManagedHost.csproj
@@ -0,0 +1,25 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3
4<Project Sdk="Microsoft.NET.Sdk">
5 <PropertyGroup>
6 <TargetFramework>netcoreapp3.1</TargetFramework>
7 </PropertyGroup>
8
9 <ItemGroup>
10 <ProjectReference Include="..\examples\TestEngine\Example.TestEngine.vcxproj" />
11 </ItemGroup>
12
13 <ItemGroup>
14 <PackageReference Include="WixBuildTools.TestSupport" Version="4.0.*" />
15 <PackageReference Include="WixToolset.Core.Burn" Version="4.0.*" />
16 <PackageReference Include="WixToolset.Core.WindowsInstaller" Version="4.0.*" />
17 <PackageReference Include="WixToolset.Core.TestPackage" Version="4.0.*" />
18 </ItemGroup>
19
20 <ItemGroup>
21 <PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.3.0" />
22 <PackageReference Include="xunit" Version="2.4.1" />
23 <PackageReference Include="xunit.runner.visualstudio" Version="2.4.1" PrivateAssets="All" />
24 </ItemGroup>
25</Project>
diff --git a/src/ext/Bal/test/examples/Directory.Build.props b/src/ext/Bal/test/examples/Directory.Build.props
new file mode 100644
index 00000000..3d5870a5
--- /dev/null
+++ b/src/ext/Bal/test/examples/Directory.Build.props
@@ -0,0 +1,6 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3<Project>
4 <Import Project="..\..\Directory.Build.props" />
5 <Import Project="Wix.Build.props" Condition=" '$(MSBuildProjectExtension)'=='.wixproj' " />
6</Project>
diff --git a/src/ext/Bal/test/examples/Directory.Build.targets b/src/ext/Bal/test/examples/Directory.Build.targets
new file mode 100644
index 00000000..6dcf402b
--- /dev/null
+++ b/src/ext/Bal/test/examples/Directory.Build.targets
@@ -0,0 +1,6 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3<Project>
4 <Import Project="..\..\Directory.Build.targets" />
5 <Import Project="Wix.Build.targets" Condition=" '$(MSBuildProjectExtension)'=='.wixproj' " />
6</Project>
diff --git a/src/ext/Bal/test/examples/EarliestCoreBundleFDD/EarliestCoreBundleFDD.wixproj b/src/ext/Bal/test/examples/EarliestCoreBundleFDD/EarliestCoreBundleFDD.wixproj
new file mode 100644
index 00000000..ba75a9ff
--- /dev/null
+++ b/src/ext/Bal/test/examples/EarliestCoreBundleFDD/EarliestCoreBundleFDD.wixproj
@@ -0,0 +1,2 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2<Project Sdk="WixToolset.Sdk" />
diff --git a/src/ext/Bal/test/examples/EarliestCoreBundleFDD/FrameworkDependentBundle.wxs b/src/ext/Bal/test/examples/EarliestCoreBundleFDD/FrameworkDependentBundle.wxs
new file mode 100644
index 00000000..d146845c
--- /dev/null
+++ b/src/ext/Bal/test/examples/EarliestCoreBundleFDD/FrameworkDependentBundle.wxs
@@ -0,0 +1,16 @@
1<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs" xmlns:bal="http://wixtoolset.org/schemas/v4/wxs/bal">
2 <Bundle Name="FDDEarliestCoreMBA" Version="1.0.0.0" Manufacturer="Example Corporation" UpgradeCode="5CE5B5C7-4B6B-4B95-B297-731F1F956533">
3 <BootstrapperApplication>
4 <Payload SourceFile="publish\Example.EarliestCoreMBA\fdd\Example.EarliestCoreMBA.deps.json" Name="Example.EarliestCoreMBA.deps.json" />
5 <Payload SourceFile="publish\Example.EarliestCoreMBA\fdd\Example.EarliestCoreMBA.dll" Name="Example.EarliestCoreMBA.dll" bal:BAFactoryAssembly="yes" />
6 <Payload SourceFile="publish\Example.EarliestCoreMBA\fdd\Example.EarliestCoreMBA.pdb" Name="Example.EarliestCoreMBA.pdb" />
7 <Payload SourceFile="publish\Example.EarliestCoreMBA\fdd\Example.EarliestCoreMBA.runtimeconfig.json" Name="Example.EarliestCoreMBA.runtimeconfig.json" />
8 <Payload SourceFile="publish\Example.EarliestCoreMBA\fdd\mbanative.dll" Name="mbanative.dll" />
9 <Payload SourceFile="publish\Example.EarliestCoreMBA\fdd\WixToolset.Mba.Core.dll" Name="WixToolset.Mba.Core.dll" />
10 <bal:WixDotNetCoreBootstrapperApplicationHost />
11 </BootstrapperApplication>
12 <Chain>
13 <ExePackage DetectCondition="none" SourceFile="c:\windows\system32\kernel32.dll" bal:PrereqPackage="yes" />
14 </Chain>
15 </Bundle>
16</Wix>
diff --git a/src/ext/Bal/test/examples/EarliestCoreBundleSCD/EarliestCoreBundleSCD.wixproj b/src/ext/Bal/test/examples/EarliestCoreBundleSCD/EarliestCoreBundleSCD.wixproj
new file mode 100644
index 00000000..ebeebff2
--- /dev/null
+++ b/src/ext/Bal/test/examples/EarliestCoreBundleSCD/EarliestCoreBundleSCD.wixproj
@@ -0,0 +1,10 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2<Project Sdk="WixToolset.Sdk">
3 <ItemGroup>
4 <BindInputPaths Include="$(OutputPath)publish\Example.EarliestCoreMBA\scd" />
5 <HarvestDirectory Include="$(OutputPath)publish\Example.EarliestCoreMBA\scd">
6 <DirectoryRefId>publish.Example.EarliestCoreMBA.scd</DirectoryRefId>
7 <Transforms>ba.xslt</Transforms>
8 </HarvestDirectory>
9 </ItemGroup>
10</Project>
diff --git a/src/ext/Bal/test/examples/EarliestCoreBundleSCD/SelfContainedBundle.wxs b/src/ext/Bal/test/examples/EarliestCoreBundleSCD/SelfContainedBundle.wxs
new file mode 100644
index 00000000..4d872317
--- /dev/null
+++ b/src/ext/Bal/test/examples/EarliestCoreBundleSCD/SelfContainedBundle.wxs
@@ -0,0 +1,11 @@
1<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs" xmlns:bal="http://wixtoolset.org/schemas/v4/wxs/bal">
2 <Bundle Name="SCDEarliestCoreMBA" Version="1.0.0.0" Manufacturer="Example Corporation" UpgradeCode="5CE5B5C7-4B6B-4B95-B297-731F1F956533">
3 <BootstrapperApplication>
4 <bal:WixDotNetCoreBootstrapperApplicationHost SelfContainedDeployment="yes" />
5 <PayloadGroupRef Id="publish.Example.EarliestCoreMBA.scd" />
6 </BootstrapperApplication>
7 <Chain>
8 <ExePackage DetectCondition="none" SourceFile="c:\windows\system32\kernel32.dll" PerMachine="yes" />
9 </Chain>
10 </Bundle>
11</Wix>
diff --git a/src/ext/Bal/test/examples/EarliestCoreBundleSCD/ba.xslt b/src/ext/Bal/test/examples/EarliestCoreBundleSCD/ba.xslt
new file mode 100644
index 00000000..06b84256
--- /dev/null
+++ b/src/ext/Bal/test/examples/EarliestCoreBundleSCD/ba.xslt
@@ -0,0 +1,20 @@
1<?xml version="1.0" encoding="utf-8"?>
2<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
3 xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"
4 xmlns:wix="http://wixtoolset.org/schemas/v4/wxs"
5>
6 <xsl:output method="xml" indent="yes"/>
7
8 <xsl:template match="@* | node()">
9 <xsl:copy>
10 <xsl:apply-templates select="@* | node()"/>
11 </xsl:copy>
12 </xsl:template>
13
14 <xsl:template match="wix:Payload[@SourceFile='SourceDir\Example.EarliestCoreMBA.dll']" >
15 <xsl:copy>
16 <xsl:attribute name="BAFactoryAssembly" namespace="http://wixtoolset.org/schemas/v4/wxs/bal">yes</xsl:attribute>
17 <xsl:apply-templates select="@* | node()"/>
18 </xsl:copy>
19 </xsl:template>
20</xsl:stylesheet>
diff --git a/src/ext/Bal/test/examples/EarliestCoreBundleTrimmedSCD/EarliestCoreBundleTrimmedSCD.wixproj b/src/ext/Bal/test/examples/EarliestCoreBundleTrimmedSCD/EarliestCoreBundleTrimmedSCD.wixproj
new file mode 100644
index 00000000..a6b56460
--- /dev/null
+++ b/src/ext/Bal/test/examples/EarliestCoreBundleTrimmedSCD/EarliestCoreBundleTrimmedSCD.wixproj
@@ -0,0 +1,10 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2<Project Sdk="WixToolset.Sdk">
3 <ItemGroup>
4 <BindInputPaths Include="$(OutputPath)publish\Example.EarliestCoreMBA\trimmedscd" />
5 <HarvestDirectory Include="$(OutputPath)publish\Example.EarliestCoreMBA\trimmedscd">
6 <DirectoryRefId>publish.Example.EarliestCoreMBA.trimmedscd</DirectoryRefId>
7 <Transforms>ba.xslt</Transforms>
8 </HarvestDirectory>
9 </ItemGroup>
10</Project>
diff --git a/src/ext/Bal/test/examples/EarliestCoreBundleTrimmedSCD/TrimmedSelfContainedBundle.wxs b/src/ext/Bal/test/examples/EarliestCoreBundleTrimmedSCD/TrimmedSelfContainedBundle.wxs
new file mode 100644
index 00000000..ba7dce25
--- /dev/null
+++ b/src/ext/Bal/test/examples/EarliestCoreBundleTrimmedSCD/TrimmedSelfContainedBundle.wxs
@@ -0,0 +1,11 @@
1<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs" xmlns:bal="http://wixtoolset.org/schemas/v4/wxs/bal">
2 <Bundle Name="TrimmedSCDEarliestCoreMBA" Version="1.0.0.0" Manufacturer="Example Corporation" UpgradeCode="5CE5B5C7-4B6B-4B95-B297-731F1F956533">
3 <BootstrapperApplication>
4 <bal:WixDotNetCoreBootstrapperApplicationHost SelfContainedDeployment="yes" />
5 <PayloadGroupRef Id="publish.Example.EarliestCoreMBA.trimmedscd" />
6 </BootstrapperApplication>
7 <Chain>
8 <ExePackage DetectCondition="none" SourceFile="c:\windows\system32\kernel32.dll" PerMachine="yes" />
9 </Chain>
10 </Bundle>
11</Wix>
diff --git a/src/ext/Bal/test/examples/EarliestCoreBundleTrimmedSCD/ba.xslt b/src/ext/Bal/test/examples/EarliestCoreBundleTrimmedSCD/ba.xslt
new file mode 100644
index 00000000..06b84256
--- /dev/null
+++ b/src/ext/Bal/test/examples/EarliestCoreBundleTrimmedSCD/ba.xslt
@@ -0,0 +1,20 @@
1<?xml version="1.0" encoding="utf-8"?>
2<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
3 xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"
4 xmlns:wix="http://wixtoolset.org/schemas/v4/wxs"
5>
6 <xsl:output method="xml" indent="yes"/>
7
8 <xsl:template match="@* | node()">
9 <xsl:copy>
10 <xsl:apply-templates select="@* | node()"/>
11 </xsl:copy>
12 </xsl:template>
13
14 <xsl:template match="wix:Payload[@SourceFile='SourceDir\Example.EarliestCoreMBA.dll']" >
15 <xsl:copy>
16 <xsl:attribute name="BAFactoryAssembly" namespace="http://wixtoolset.org/schemas/v4/wxs/bal">yes</xsl:attribute>
17 <xsl:apply-templates select="@* | node()"/>
18 </xsl:copy>
19 </xsl:template>
20</xsl:stylesheet>
diff --git a/src/ext/Bal/test/examples/EarliestCoreMBA/EarliestCoreBA.cs b/src/ext/Bal/test/examples/EarliestCoreMBA/EarliestCoreBA.cs
new file mode 100644
index 00000000..c9291a7f
--- /dev/null
+++ b/src/ext/Bal/test/examples/EarliestCoreMBA/EarliestCoreBA.cs
@@ -0,0 +1,34 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace Example.EarliestCoreMBA
4{
5 using WixToolset.Mba.Core;
6
7 public class EarliestCoreBA : BootstrapperApplication
8 {
9 public EarliestCoreBA(IEngine engine)
10 : base(engine)
11 {
12
13 }
14
15 protected override void Run()
16 {
17 }
18
19 protected override void OnStartup(StartupEventArgs args)
20 {
21 base.OnStartup(args);
22
23 this.engine.Log(LogLevel.Standard, nameof(EarliestCoreBA));
24 }
25
26 protected override void OnShutdown(ShutdownEventArgs args)
27 {
28 base.OnShutdown(args);
29
30 var message = "Shutdown," + args.Action.ToString() + "," + args.HResult.ToString();
31 this.engine.Log(LogLevel.Standard, message);
32 }
33 }
34}
diff --git a/src/ext/Bal/test/examples/EarliestCoreMBA/EarliestCoreBAFactory.cs b/src/ext/Bal/test/examples/EarliestCoreMBA/EarliestCoreBAFactory.cs
new file mode 100644
index 00000000..672e17ee
--- /dev/null
+++ b/src/ext/Bal/test/examples/EarliestCoreMBA/EarliestCoreBAFactory.cs
@@ -0,0 +1,22 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3[assembly: WixToolset.Mba.Core.BootstrapperApplicationFactory(typeof(Example.EarliestCoreMBA.EarliestCoreBAFactory))]
4namespace Example.EarliestCoreMBA
5{
6 using WixToolset.Mba.Core;
7
8 public class EarliestCoreBAFactory : BaseBootstrapperApplicationFactory
9 {
10 private static int loadCount = 0;
11
12 protected override IBootstrapperApplication Create(IEngine engine, IBootstrapperCommand bootstrapperCommand)
13 {
14 if (loadCount > 0)
15 {
16 engine.Log(LogLevel.Standard, $"Reloaded {loadCount} time(s)");
17 }
18 ++loadCount;
19 return new EarliestCoreBA(engine);
20 }
21 }
22}
diff --git a/src/ext/Bal/test/examples/EarliestCoreMBA/Example.EarliestCoreMBA.csproj b/src/ext/Bal/test/examples/EarliestCoreMBA/Example.EarliestCoreMBA.csproj
new file mode 100644
index 00000000..cb66c138
--- /dev/null
+++ b/src/ext/Bal/test/examples/EarliestCoreMBA/Example.EarliestCoreMBA.csproj
@@ -0,0 +1,18 @@
1<Project Sdk="Microsoft.NET.Sdk">
2
3 <PropertyGroup>
4 <TargetFramework>netcoreapp3.1</TargetFramework>
5 <RuntimeIdentifiers>win-x86;win-x64</RuntimeIdentifiers>
6 <EnableDynamicLoading>true</EnableDynamicLoading>
7 <Description>Earliest .NET Core MBA</Description>
8 </PropertyGroup>
9
10 <ItemGroup>
11 <TrimmerRootAssembly Include="System.Runtime.Loader" />
12 </ItemGroup>
13
14 <ItemGroup>
15 <PackageReference Include="Nerdbank.GitVersioning" Version="3.3.37" PrivateAssets="all" />
16 <PackageReference Include="WixToolset.Mba.Core" Version="4.0.*" />
17 </ItemGroup>
18</Project> \ No newline at end of file
diff --git a/src/ext/Bal/test/examples/FullFramework2Bundle/Bundle.wxs b/src/ext/Bal/test/examples/FullFramework2Bundle/Bundle.wxs
new file mode 100644
index 00000000..f0af975c
--- /dev/null
+++ b/src/ext/Bal/test/examples/FullFramework2Bundle/Bundle.wxs
@@ -0,0 +1,14 @@
1<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs" xmlns:bal="http://wixtoolset.org/schemas/v4/wxs/bal">
2 <Bundle Name="FullFramework2MBA" Version="1.0.0.0" Manufacturer="Example Corporation" UpgradeCode="5CE5B5C7-4B6B-4B95-B297-731F1F956533">
3 <BootstrapperApplication>
4 <Payload SourceFile="Example.FullFramework2MBA\net20\win-x86\Example.FullFramework2MBA.dll" />
5 <Payload SourceFile="Example.FullFramework2MBA\net20\win-x86\mbanative.dll" />
6 <Payload SourceFile="Example.FullFramework2MBA\net20\win-x86\WixToolset.Mba.Core.dll" />
7 <Payload SourceFile="Example.FullFramework2MBA\net20\win-x86\WixToolset.Mba.Host.config" />
8 <bal:WixManagedBootstrapperApplicationHost />
9 </BootstrapperApplication>
10 <Chain>
11 <ExePackage DetectCondition="none" SourceFile="c:\windows\system32\kernel32.dll" bal:PrereqPackage="yes" />
12 </Chain>
13 </Bundle>
14</Wix>
diff --git a/src/ext/Bal/test/examples/FullFramework2Bundle/FullFramework2Bundle.wixproj b/src/ext/Bal/test/examples/FullFramework2Bundle/FullFramework2Bundle.wixproj
new file mode 100644
index 00000000..ba75a9ff
--- /dev/null
+++ b/src/ext/Bal/test/examples/FullFramework2Bundle/FullFramework2Bundle.wixproj
@@ -0,0 +1,2 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2<Project Sdk="WixToolset.Sdk" />
diff --git a/src/ext/Bal/test/examples/FullFramework2MBA/Example.FullFramework2MBA.csproj b/src/ext/Bal/test/examples/FullFramework2MBA/Example.FullFramework2MBA.csproj
new file mode 100644
index 00000000..21079ed1
--- /dev/null
+++ b/src/ext/Bal/test/examples/FullFramework2MBA/Example.FullFramework2MBA.csproj
@@ -0,0 +1,20 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3
4<Project Sdk="Microsoft.NET.Sdk">
5 <PropertyGroup>
6 <TargetFramework>net20</TargetFramework>
7 <AssemblyName>Example.FullFramework2MBA</AssemblyName>
8 <RootNamespace>Example.FullFramework2MBA</RootNamespace>
9 <DebugType>embedded</DebugType>
10 <RuntimeIdentifier>win-x86</RuntimeIdentifier>
11 </PropertyGroup>
12
13 <ItemGroup>
14 <Content Include="WixToolset.Mba.Host.config" CopyToOutputDirectory="PreserveNewest" />
15 </ItemGroup>
16
17 <ItemGroup>
18 <PackageReference Include="WixToolset.Mba.Core" Version="4.0.*" />
19 </ItemGroup>
20</Project> \ No newline at end of file
diff --git a/src/ext/Bal/test/examples/FullFramework2MBA/FullFramework2BA.cs b/src/ext/Bal/test/examples/FullFramework2MBA/FullFramework2BA.cs
new file mode 100644
index 00000000..32cd19c8
--- /dev/null
+++ b/src/ext/Bal/test/examples/FullFramework2MBA/FullFramework2BA.cs
@@ -0,0 +1,34 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace Example.FullFramework2MBA
4{
5 using WixToolset.Mba.Core;
6
7 public class FullFramework2BA : BootstrapperApplication
8 {
9 public FullFramework2BA(IEngine engine)
10 : base(engine)
11 {
12
13 }
14
15 protected override void Run()
16 {
17 }
18
19 protected override void OnStartup(StartupEventArgs args)
20 {
21 base.OnStartup(args);
22
23 this.engine.Log(LogLevel.Standard, nameof(FullFramework2BA));
24 }
25
26 protected override void OnShutdown(ShutdownEventArgs args)
27 {
28 base.OnShutdown(args);
29
30 var message = "Shutdown," + args.Action.ToString() + "," + args.HResult.ToString();
31 this.engine.Log(LogLevel.Standard, message);
32 }
33 }
34}
diff --git a/src/ext/Bal/test/examples/FullFramework2MBA/FullFramework2BAFactory.cs b/src/ext/Bal/test/examples/FullFramework2MBA/FullFramework2BAFactory.cs
new file mode 100644
index 00000000..647c2040
--- /dev/null
+++ b/src/ext/Bal/test/examples/FullFramework2MBA/FullFramework2BAFactory.cs
@@ -0,0 +1,22 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3[assembly: WixToolset.Mba.Core.BootstrapperApplicationFactory(typeof(Example.FullFramework2MBA.FullFramework2BAFactory))]
4namespace Example.FullFramework2MBA
5{
6 using WixToolset.Mba.Core;
7
8 public class FullFramework2BAFactory : BaseBootstrapperApplicationFactory
9 {
10 private static int loadCount = 0;
11
12 protected override IBootstrapperApplication Create(IEngine engine, IBootstrapperCommand bootstrapperCommand)
13 {
14 if (loadCount > 0)
15 {
16 engine.Log(LogLevel.Standard, $"Reloaded {loadCount} time(s)");
17 }
18 ++loadCount;
19 return new FullFramework2BA(engine);
20 }
21 }
22}
diff --git a/src/ext/Bal/test/examples/FullFramework2MBA/WixToolset.Mba.Host.config b/src/ext/Bal/test/examples/FullFramework2MBA/WixToolset.Mba.Host.config
new file mode 100644
index 00000000..be450a4f
--- /dev/null
+++ b/src/ext/Bal/test/examples/FullFramework2MBA/WixToolset.Mba.Host.config
@@ -0,0 +1,20 @@
1<?xml version="1.0" encoding="utf-8" ?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3
4
5<configuration>
6 <configSections>
7 <sectionGroup name="wix.bootstrapper" type="WixToolset.Mba.Host.BootstrapperSectionGroup, WixToolset.Mba.Host">
8 <section name="host" type="WixToolset.Mba.Host.HostSection, WixToolset.Mba.Host" />
9 </sectionGroup>
10 </configSections>
11 <startup>
12 <supportedRuntime version="v2.0.50727" />
13 </startup>
14 <wix.bootstrapper>
15
16 <host assemblyName="Example.FullFramework2MBA">
17 <supportedFramework version="v3.5" />
18 </host>
19 </wix.bootstrapper>
20</configuration>
diff --git a/src/ext/Bal/test/examples/FullFramework4Bundle/Bundle.wxs b/src/ext/Bal/test/examples/FullFramework4Bundle/Bundle.wxs
new file mode 100644
index 00000000..7b7cbf57
--- /dev/null
+++ b/src/ext/Bal/test/examples/FullFramework4Bundle/Bundle.wxs
@@ -0,0 +1,14 @@
1<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs" xmlns:bal="http://wixtoolset.org/schemas/v4/wxs/bal">
2 <Bundle Name="FullFramework4MBA" Version="1.0.0.0" Manufacturer="Example Corporation" UpgradeCode="E08068E0-4FBA-439D-A1C8-4CD1FE27093F">
3 <BootstrapperApplication>
4 <Payload SourceFile="Example.FullFramework4MBA\net48\win-x86\Example.FullFramework4MBA.dll" />
5 <Payload SourceFile="Example.FullFramework4MBA\net48\win-x86\mbanative.dll" />
6 <Payload SourceFile="Example.FullFramework4MBA\net48\win-x86\WixToolset.Mba.Core.dll" />
7 <Payload SourceFile="Example.FullFramework4MBA\net48\win-x86\WixToolset.Mba.Host.config" />
8 <bal:WixManagedBootstrapperApplicationHost />
9 </BootstrapperApplication>
10 <Chain>
11 <ExePackage DetectCondition="none" SourceFile="c:\windows\system32\kernel32.dll" bal:PrereqPackage="yes" />
12 </Chain>
13 </Bundle>
14</Wix>
diff --git a/src/ext/Bal/test/examples/FullFramework4Bundle/FullFramework4Bundle.wixproj b/src/ext/Bal/test/examples/FullFramework4Bundle/FullFramework4Bundle.wixproj
new file mode 100644
index 00000000..ba75a9ff
--- /dev/null
+++ b/src/ext/Bal/test/examples/FullFramework4Bundle/FullFramework4Bundle.wixproj
@@ -0,0 +1,2 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2<Project Sdk="WixToolset.Sdk" />
diff --git a/src/ext/Bal/test/examples/FullFramework4MBA/Example.FullFramework4MBA.csproj b/src/ext/Bal/test/examples/FullFramework4MBA/Example.FullFramework4MBA.csproj
new file mode 100644
index 00000000..a05e7888
--- /dev/null
+++ b/src/ext/Bal/test/examples/FullFramework4MBA/Example.FullFramework4MBA.csproj
@@ -0,0 +1,19 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3
4<Project Sdk="Microsoft.NET.Sdk">
5 <PropertyGroup>
6 <TargetFramework>net48</TargetFramework>
7 <Description>Full Framework v4 MBA</Description>
8 <RuntimeIdentifier>win-x86</RuntimeIdentifier>
9 </PropertyGroup>
10
11 <ItemGroup>
12 <PackageReference Include="Nerdbank.GitVersioning" Version="3.3.37" PrivateAssets="all" />
13 <PackageReference Include="WixToolset.Mba.Core" Version="4.0.*" PrivateAssets="All" />
14 </ItemGroup>
15
16 <ItemGroup>
17 <Content Include="WixToolset.Mba.Host.config" CopyToOutputDirectory="PreserveNewest" />
18 </ItemGroup>
19</Project> \ No newline at end of file
diff --git a/src/ext/Bal/test/examples/FullFramework4MBA/FullFramework4BA.cs b/src/ext/Bal/test/examples/FullFramework4MBA/FullFramework4BA.cs
new file mode 100644
index 00000000..8ee3bd19
--- /dev/null
+++ b/src/ext/Bal/test/examples/FullFramework4MBA/FullFramework4BA.cs
@@ -0,0 +1,34 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace Example.FullFramework4MBA
4{
5 using WixToolset.Mba.Core;
6
7 public class FullFramework4BA : BootstrapperApplication
8 {
9 public FullFramework4BA(IEngine engine)
10 : base(engine)
11 {
12
13 }
14
15 protected override void Run()
16 {
17 }
18
19 protected override void OnStartup(StartupEventArgs args)
20 {
21 base.OnStartup(args);
22
23 this.engine.Log(LogLevel.Standard, nameof(FullFramework4BA));
24 }
25
26 protected override void OnShutdown(ShutdownEventArgs args)
27 {
28 base.OnShutdown(args);
29
30 var message = "Shutdown," + args.Action.ToString() + "," + args.HResult.ToString();
31 this.engine.Log(LogLevel.Standard, message);
32 }
33 }
34}
diff --git a/src/ext/Bal/test/examples/FullFramework4MBA/FullFramework4BAFactory.cs b/src/ext/Bal/test/examples/FullFramework4MBA/FullFramework4BAFactory.cs
new file mode 100644
index 00000000..6a571a54
--- /dev/null
+++ b/src/ext/Bal/test/examples/FullFramework4MBA/FullFramework4BAFactory.cs
@@ -0,0 +1,22 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3[assembly: WixToolset.Mba.Core.BootstrapperApplicationFactory(typeof(Example.FullFramework4MBA.FullFramework4BAFactory))]
4namespace Example.FullFramework4MBA
5{
6 using WixToolset.Mba.Core;
7
8 public class FullFramework4BAFactory : BaseBootstrapperApplicationFactory
9 {
10 private static int loadCount = 0;
11
12 protected override IBootstrapperApplication Create(IEngine engine, IBootstrapperCommand bootstrapperCommand)
13 {
14 if (loadCount > 0)
15 {
16 engine.Log(LogLevel.Standard, $"Reloaded {loadCount} time(s)");
17 }
18 ++loadCount;
19 return new FullFramework4BA(engine);
20 }
21 }
22}
diff --git a/src/ext/Bal/test/examples/FullFramework4MBA/WixToolset.Mba.Host.config b/src/ext/Bal/test/examples/FullFramework4MBA/WixToolset.Mba.Host.config
new file mode 100644
index 00000000..96678cda
--- /dev/null
+++ b/src/ext/Bal/test/examples/FullFramework4MBA/WixToolset.Mba.Host.config
@@ -0,0 +1,17 @@
1<?xml version="1.0" encoding="utf-8" ?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3
4
5<configuration>
6 <configSections>
7 <sectionGroup name="wix.bootstrapper" type="WixToolset.Mba.Host.BootstrapperSectionGroup, WixToolset.Mba.Host">
8 <section name="host" type="WixToolset.Mba.Host.HostSection, WixToolset.Mba.Host" />
9 </sectionGroup>
10 </configSections>
11 <startup>
12 <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.8" />
13 </startup>
14 <wix.bootstrapper>
15 <host assemblyName="Example.FullFramework4MBA" />
16 </wix.bootstrapper>
17</configuration>
diff --git a/src/ext/Bal/test/examples/LatestCoreBundleFDD/FrameworkDependentBundle.wxs b/src/ext/Bal/test/examples/LatestCoreBundleFDD/FrameworkDependentBundle.wxs
new file mode 100644
index 00000000..d5b543e8
--- /dev/null
+++ b/src/ext/Bal/test/examples/LatestCoreBundleFDD/FrameworkDependentBundle.wxs
@@ -0,0 +1,16 @@
1<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs" xmlns:bal="http://wixtoolset.org/schemas/v4/wxs/bal">
2 <Bundle Name="FDDLatestCoreMBA" Version="1.0.0.0" Manufacturer="Example Corporation" UpgradeCode="5CE5B5C7-4B6B-4B95-B297-731F1F956533">
3 <BootstrapperApplication>
4 <Payload SourceFile="publish\Example.LatestCoreMBA\fdd\Example.LatestCoreMBA.deps.json" Name="Example.LatestCoreMBA.deps.json" />
5 <Payload SourceFile="publish\Example.LatestCoreMBA\fdd\Example.LatestCoreMBA.dll" Name="Example.LatestCoreMBA.dll" bal:BAFactoryAssembly="yes" />
6 <Payload SourceFile="publish\Example.LatestCoreMBA\fdd\Example.LatestCoreMBA.pdb" Name="Example.LatestCoreMBA.pdb" />
7 <Payload SourceFile="publish\Example.LatestCoreMBA\fdd\Example.LatestCoreMBA.runtimeconfig.json" Name="Example.LatestCoreMBA.runtimeconfig.json" />
8 <Payload SourceFile="publish\Example.LatestCoreMBA\fdd\mbanative.dll" Name="mbanative.dll" />
9 <Payload SourceFile="publish\Example.LatestCoreMBA\fdd\WixToolset.Mba.Core.dll" Name="WixToolset.Mba.Core.dll" />
10 <bal:WixDotNetCoreBootstrapperApplicationHost />
11 </BootstrapperApplication>
12 <Chain>
13 <ExePackage DetectCondition="none" SourceFile="c:\windows\system32\kernel32.dll" bal:PrereqPackage="yes" />
14 </Chain>
15 </Bundle>
16</Wix>
diff --git a/src/ext/Bal/test/examples/LatestCoreBundleFDD/LatestCoreBundleFDD.wixproj b/src/ext/Bal/test/examples/LatestCoreBundleFDD/LatestCoreBundleFDD.wixproj
new file mode 100644
index 00000000..ba75a9ff
--- /dev/null
+++ b/src/ext/Bal/test/examples/LatestCoreBundleFDD/LatestCoreBundleFDD.wixproj
@@ -0,0 +1,2 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2<Project Sdk="WixToolset.Sdk" />
diff --git a/src/ext/Bal/test/examples/LatestCoreBundleSCD/LatestCoreBundleSCD.wixproj b/src/ext/Bal/test/examples/LatestCoreBundleSCD/LatestCoreBundleSCD.wixproj
new file mode 100644
index 00000000..30a860ab
--- /dev/null
+++ b/src/ext/Bal/test/examples/LatestCoreBundleSCD/LatestCoreBundleSCD.wixproj
@@ -0,0 +1,10 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2<Project Sdk="WixToolset.Sdk">
3 <ItemGroup>
4 <BindInputPaths Include="$(OutputPath)publish\Example.LatestCoreMBA\scd" />
5 <HarvestDirectory Include="$(OutputPath)publish\Example.LatestCoreMBA\scd">
6 <DirectoryRefId>publish.Example.LatestCoreMBA.scd</DirectoryRefId>
7 <Transforms>ba.xslt</Transforms>
8 </HarvestDirectory>
9 </ItemGroup>
10</Project>
diff --git a/src/ext/Bal/test/examples/LatestCoreBundleSCD/SelfContainedBundle.wxs b/src/ext/Bal/test/examples/LatestCoreBundleSCD/SelfContainedBundle.wxs
new file mode 100644
index 00000000..bedf0326
--- /dev/null
+++ b/src/ext/Bal/test/examples/LatestCoreBundleSCD/SelfContainedBundle.wxs
@@ -0,0 +1,11 @@
1<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs" xmlns:bal="http://wixtoolset.org/schemas/v4/wxs/bal">
2 <Bundle Name="SCDLatestCoreMBA" Version="1.0.0.0" Manufacturer="Example Corporation" UpgradeCode="5CE5B5C7-4B6B-4B95-B297-731F1F956533">
3 <BootstrapperApplication>
4 <bal:WixDotNetCoreBootstrapperApplicationHost SelfContainedDeployment="yes" />
5 <PayloadGroupRef Id="publish.Example.LatestCoreMBA.scd" />
6 </BootstrapperApplication>
7 <Chain>
8 <ExePackage DetectCondition="none" SourceFile="c:\windows\system32\kernel32.dll" PerMachine="yes" />
9 </Chain>
10 </Bundle>
11</Wix>
diff --git a/src/ext/Bal/test/examples/LatestCoreBundleSCD/ba.xslt b/src/ext/Bal/test/examples/LatestCoreBundleSCD/ba.xslt
new file mode 100644
index 00000000..acc7474c
--- /dev/null
+++ b/src/ext/Bal/test/examples/LatestCoreBundleSCD/ba.xslt
@@ -0,0 +1,20 @@
1<?xml version="1.0" encoding="utf-8"?>
2<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
3 xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"
4 xmlns:wix="http://wixtoolset.org/schemas/v4/wxs"
5>
6 <xsl:output method="xml" indent="yes"/>
7
8 <xsl:template match="@* | node()">
9 <xsl:copy>
10 <xsl:apply-templates select="@* | node()"/>
11 </xsl:copy>
12 </xsl:template>
13
14 <xsl:template match="wix:Payload[@SourceFile='SourceDir\Example.LatestCoreMBA.dll']" >
15 <xsl:copy>
16 <xsl:attribute name="BAFactoryAssembly" namespace="http://wixtoolset.org/schemas/v4/wxs/bal">yes</xsl:attribute>
17 <xsl:apply-templates select="@* | node()"/>
18 </xsl:copy>
19 </xsl:template>
20</xsl:stylesheet>
diff --git a/src/ext/Bal/test/examples/LatestCoreBundleTrimmedSCD/LatestCoreBundleTrimmedSCD.wixproj b/src/ext/Bal/test/examples/LatestCoreBundleTrimmedSCD/LatestCoreBundleTrimmedSCD.wixproj
new file mode 100644
index 00000000..5ce89b64
--- /dev/null
+++ b/src/ext/Bal/test/examples/LatestCoreBundleTrimmedSCD/LatestCoreBundleTrimmedSCD.wixproj
@@ -0,0 +1,10 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2<Project Sdk="WixToolset.Sdk">
3 <ItemGroup>
4 <BindInputPaths Include="$(OutputPath)publish\Example.LatestCoreMBA\trimmedscd" />
5 <HarvestDirectory Include="$(OutputPath)publish\Example.LatestCoreMBA\trimmedscd">
6 <DirectoryRefId>publish.Example.LatestCoreMBA.trimmedscd</DirectoryRefId>
7 <Transforms>ba.xslt</Transforms>
8 </HarvestDirectory>
9 </ItemGroup>
10</Project>
diff --git a/src/ext/Bal/test/examples/LatestCoreBundleTrimmedSCD/TrimmedSelfContainedBundle.wxs b/src/ext/Bal/test/examples/LatestCoreBundleTrimmedSCD/TrimmedSelfContainedBundle.wxs
new file mode 100644
index 00000000..6059f8c1
--- /dev/null
+++ b/src/ext/Bal/test/examples/LatestCoreBundleTrimmedSCD/TrimmedSelfContainedBundle.wxs
@@ -0,0 +1,11 @@
1<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs" xmlns:bal="http://wixtoolset.org/schemas/v4/wxs/bal">
2 <Bundle Name="TrimmedSCDLatestCoreMBA" Version="1.0.0.0" Manufacturer="Example Corporation" UpgradeCode="5CE5B5C7-4B6B-4B95-B297-731F1F956533">
3 <BootstrapperApplication>
4 <bal:WixDotNetCoreBootstrapperApplicationHost SelfContainedDeployment="yes" />
5 <PayloadGroupRef Id="publish.Example.LatestCoreMBA.trimmedscd" />
6 </BootstrapperApplication>
7 <Chain>
8 <ExePackage DetectCondition="none" SourceFile="c:\windows\system32\kernel32.dll" PerMachine="yes" />
9 </Chain>
10 </Bundle>
11</Wix>
diff --git a/src/ext/Bal/test/examples/LatestCoreBundleTrimmedSCD/ba.xslt b/src/ext/Bal/test/examples/LatestCoreBundleTrimmedSCD/ba.xslt
new file mode 100644
index 00000000..acc7474c
--- /dev/null
+++ b/src/ext/Bal/test/examples/LatestCoreBundleTrimmedSCD/ba.xslt
@@ -0,0 +1,20 @@
1<?xml version="1.0" encoding="utf-8"?>
2<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
3 xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"
4 xmlns:wix="http://wixtoolset.org/schemas/v4/wxs"
5>
6 <xsl:output method="xml" indent="yes"/>
7
8 <xsl:template match="@* | node()">
9 <xsl:copy>
10 <xsl:apply-templates select="@* | node()"/>
11 </xsl:copy>
12 </xsl:template>
13
14 <xsl:template match="wix:Payload[@SourceFile='SourceDir\Example.LatestCoreMBA.dll']" >
15 <xsl:copy>
16 <xsl:attribute name="BAFactoryAssembly" namespace="http://wixtoolset.org/schemas/v4/wxs/bal">yes</xsl:attribute>
17 <xsl:apply-templates select="@* | node()"/>
18 </xsl:copy>
19 </xsl:template>
20</xsl:stylesheet>
diff --git a/src/ext/Bal/test/examples/LatestCoreMBA/Example.LatestCoreMBA.csproj b/src/ext/Bal/test/examples/LatestCoreMBA/Example.LatestCoreMBA.csproj
new file mode 100644
index 00000000..9f3f02d9
--- /dev/null
+++ b/src/ext/Bal/test/examples/LatestCoreMBA/Example.LatestCoreMBA.csproj
@@ -0,0 +1,21 @@
1<Project Sdk="Microsoft.NET.Sdk">
2
3 <PropertyGroup>
4 <TargetFramework>net5.0</TargetFramework>
5 <RuntimeIdentifiers>win-x86;win-x64</RuntimeIdentifiers>
6 <EnableDynamicLoading>true</EnableDynamicLoading>
7 <Description>Latest .NET Core MBA</Description>
8 </PropertyGroup>
9
10 <ItemGroup>
11 <TrimmerRootAssembly Include="System.Diagnostics.Tools" />
12 <TrimmerRootAssembly Include="System.Runtime" />
13 <TrimmerRootAssembly Include="System.Runtime.InteropServices" />
14 <TrimmerRootAssembly Include="System.Runtime.Loader" />
15 </ItemGroup>
16
17 <ItemGroup>
18 <PackageReference Include="Nerdbank.GitVersioning" Version="3.3.37" PrivateAssets="all" />
19 <PackageReference Include="WixToolset.Mba.Core" Version="4.0.*" />
20 </ItemGroup>
21</Project> \ No newline at end of file
diff --git a/src/ext/Bal/test/examples/LatestCoreMBA/LatestCoreBA.cs b/src/ext/Bal/test/examples/LatestCoreMBA/LatestCoreBA.cs
new file mode 100644
index 00000000..50386a87
--- /dev/null
+++ b/src/ext/Bal/test/examples/LatestCoreMBA/LatestCoreBA.cs
@@ -0,0 +1,33 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace Example.LatestCoreMBA
4{
5 using WixToolset.Mba.Core;
6
7 public class LatestCoreBA : BootstrapperApplication
8 {
9 public LatestCoreBA(IEngine engine)
10 : base(engine)
11 {
12 }
13
14 protected override void Run()
15 {
16 }
17
18 protected override void OnStartup(StartupEventArgs args)
19 {
20 base.OnStartup(args);
21
22 this.engine.Log(LogLevel.Standard, nameof(LatestCoreBA));
23 }
24
25 protected override void OnShutdown(ShutdownEventArgs args)
26 {
27 base.OnShutdown(args);
28
29 var message = "Shutdown," + args.Action.ToString() + "," + args.HResult.ToString();
30 this.engine.Log(LogLevel.Standard, message);
31 }
32 }
33}
diff --git a/src/ext/Bal/test/examples/LatestCoreMBA/LatestCoreBAFactory.cs b/src/ext/Bal/test/examples/LatestCoreMBA/LatestCoreBAFactory.cs
new file mode 100644
index 00000000..fff3b5c5
--- /dev/null
+++ b/src/ext/Bal/test/examples/LatestCoreMBA/LatestCoreBAFactory.cs
@@ -0,0 +1,22 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3[assembly: WixToolset.Mba.Core.BootstrapperApplicationFactory(typeof(Example.LatestCoreMBA.LatestCoreBAFactory))]
4namespace Example.LatestCoreMBA
5{
6 using WixToolset.Mba.Core;
7
8 public class LatestCoreBAFactory : BaseBootstrapperApplicationFactory
9 {
10 private static int loadCount = 0;
11
12 protected override IBootstrapperApplication Create(IEngine engine, IBootstrapperCommand bootstrapperCommand)
13 {
14 if (loadCount > 0)
15 {
16 engine.Log(LogLevel.Standard, $"Reloaded {loadCount} time(s)");
17 }
18 ++loadCount;
19 return new LatestCoreBA(engine);
20 }
21 }
22}
diff --git a/src/ext/Bal/test/examples/TestEngine/Example.TestEngine.vcxproj b/src/ext/Bal/test/examples/TestEngine/Example.TestEngine.vcxproj
new file mode 100644
index 00000000..99eb917e
--- /dev/null
+++ b/src/ext/Bal/test/examples/TestEngine/Example.TestEngine.vcxproj
@@ -0,0 +1,83 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3<Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
4 <Import Project="..\..\..\..\packages\WixToolset.BalUtil.4.0.58\build\WixToolset.BalUtil.props" Condition="Exists('..\..\..\..\packages\WixToolset.BalUtil.4.0.58\build\WixToolset.BalUtil.props')" />
5 <Import Project="..\..\..\..\packages\WixToolset.BootstrapperCore.Native.4.0.141\build\WixToolset.BootstrapperCore.Native.props" Condition="Exists('..\..\..\..\packages\WixToolset.BootstrapperCore.Native.4.0.141\build\WixToolset.BootstrapperCore.Native.props')" />
6 <Import Project="..\..\..\..\packages\WixToolset.DUtil.4.0.72\build\WixToolset.DUtil.props" Condition="Exists('..\..\..\..\packages\WixToolset.DUtil.4.0.72\build\WixToolset.DUtil.props')" />
7 <ItemGroup Label="ProjectConfigurations">
8 <ProjectConfiguration Include="Debug|ARM64">
9 <Configuration>Debug</Configuration>
10 <Platform>ARM64</Platform>
11 </ProjectConfiguration>
12 <ProjectConfiguration Include="Release|ARM64">
13 <Configuration>Release</Configuration>
14 <Platform>ARM64</Platform>
15 </ProjectConfiguration>
16 <ProjectConfiguration Include="Debug|Win32">
17 <Configuration>Debug</Configuration>
18 <Platform>Win32</Platform>
19 </ProjectConfiguration>
20 <ProjectConfiguration Include="Release|Win32">
21 <Configuration>Release</Configuration>
22 <Platform>Win32</Platform>
23 </ProjectConfiguration>
24 <ProjectConfiguration Include="Debug|x64">
25 <Configuration>Debug</Configuration>
26 <Platform>x64</Platform>
27 </ProjectConfiguration>
28 <ProjectConfiguration Include="Release|x64">
29 <Configuration>Release</Configuration>
30 <Platform>x64</Platform>
31 </ProjectConfiguration>
32 </ItemGroup>
33 <PropertyGroup Label="Globals">
34 <ProjectGuid>{3D44B67D-A475-49BA-8310-E39F6C117CC9}</ProjectGuid>
35 <ConfigurationType>Application</ConfigurationType>
36 <ProjectSubSystem>Console</ProjectSubSystem>
37 <TargetName>Example.TestEngine</TargetName>
38 <PlatformToolset>v142</PlatformToolset>
39 <CharacterSet>Unicode</CharacterSet>
40 <WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
41 </PropertyGroup>
42 <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
43 <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
44 <ImportGroup Label="ExtensionSettings">
45 </ImportGroup>
46 <ImportGroup Label="Shared">
47 <Import Project="..\..\..\..\packages\Nerdbank.GitVersioning.3.3.37\build\Nerdbank.GitVersioning.targets" Condition="Exists('..\..\..\..\packages\Nerdbank.GitVersioning.3.3.37\build\Nerdbank.GitVersioning.targets')" />
48 </ImportGroup>
49 <PropertyGroup>
50 <ProjectAdditionalLinkLibraries>
51 </ProjectAdditionalLinkLibraries>
52 </PropertyGroup>
53 <ItemGroup>
54 <ClCompile Include="precomp.cpp">
55 <PrecompiledHeader>Create</PrecompiledHeader>
56 </ClCompile>
57 <ClCompile Include="ReloadEngine.cpp" />
58 <ClCompile Include="ShutdownEngine.cpp" />
59 <ClCompile Include="ExampleTestEngine.cpp" />
60 <ClCompile Include="TestEngine.cpp" />
61 <ClCompile Include="WaitForQuitEngine.cpp" />
62 </ItemGroup>
63 <ItemGroup>
64 <ClInclude Include="precomp.h" />
65 <ClInclude Include="ReloadEngine.h" />
66 <ClInclude Include="ShutdownEngine.h" />
67 <ClInclude Include="TestEngine.h" />
68 <ClInclude Include="WaitForQuitEngine.h" />
69 </ItemGroup>
70 <ItemGroup>
71 <None Include="packages.config" />
72 </ItemGroup>
73 <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
74 <Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
75 <PropertyGroup>
76 <ErrorText>This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
77 </PropertyGroup>
78 <Error Condition="!Exists('..\..\..\..\packages\Nerdbank.GitVersioning.3.3.37\build\Nerdbank.GitVersioning.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\..\..\..\packages\Nerdbank.GitVersioning.3.3.37\build\Nerdbank.GitVersioning.targets'))" />
79 <Error Condition="!Exists('..\..\..\..\packages\WixToolset.BalUtil.4.0.58\build\WixToolset.BalUtil.props')" Text="$([System.String]::Format('$(ErrorText)', '..\..\..\..\packages\WixToolset.BalUtil.4.0.58\build\WixToolset.BalUtil.props'))" />
80 <Error Condition="!Exists('..\..\..\..\packages\WixToolset.BootstrapperCore.Native.4.0.141\build\WixToolset.BootstrapperCore.Native.props')" Text="$([System.String]::Format('$(ErrorText)', '..\..\..\..\packages\WixToolset.BootstrapperCore.Native.4.0.141\build\WixToolset.BootstrapperCore.Native.props'))" />
81 <Error Condition="!Exists('..\..\..\..\packages\WixToolset.DUtil.4.0.72\build\WixToolset.DUtil.props')" Text="$([System.String]::Format('$(ErrorText)', '..\..\..\..\packages\WixToolset.DUtil.4.0.72\build\WixToolset.DUtil.props'))" />
82 </Target>
83</Project> \ No newline at end of file
diff --git a/src/ext/Bal/test/examples/TestEngine/ExampleTestEngine.cpp b/src/ext/Bal/test/examples/TestEngine/ExampleTestEngine.cpp
new file mode 100644
index 00000000..fc1938fe
--- /dev/null
+++ b/src/ext/Bal/test/examples/TestEngine/ExampleTestEngine.cpp
@@ -0,0 +1,53 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3#include "precomp.h"
4
5int __cdecl wmain(int argc, LPWSTR argv[])
6{
7 HRESULT hr = S_OK;
8 BOOL fComInitialized = FALSE;
9 BOOL fShowUsage = FALSE;
10
11 // initialize COM
12 hr = ::CoInitializeEx(NULL, COINIT_MULTITHREADED);
13 ExitOnFailure(hr, "Failed to initialize COM.");
14 fComInitialized = TRUE;
15
16 ConsoleInitialize();
17
18 if (argc != 4)
19 {
20 fShowUsage = TRUE;
21 }
22 else if (CSTR_EQUAL == ::CompareString(LOCALE_INVARIANT, NORM_IGNORECASE, argv[1], -1, L"reload", -1))
23 {
24 hr = RunReloadEngine(argv[2], argv[3]);
25 }
26 else if (CSTR_EQUAL == ::CompareString(LOCALE_INVARIANT, NORM_IGNORECASE, argv[1], -1, L"shutdown", -1))
27 {
28 hr = RunShutdownEngine(argv[2], argv[3]);
29 }
30 else if (CSTR_EQUAL == ::CompareString(LOCALE_INVARIANT, NORM_IGNORECASE, argv[1], -1, L"waitforquit", -1))
31 {
32 hr = RunWaitForQuitEngine(argv[2], argv[3]);
33 }
34 else
35 {
36 fShowUsage = TRUE;
37 }
38
39 if (fShowUsage)
40 {
41 ConsoleWriteError(hr = E_INVALIDARG, CONSOLE_COLOR_RED, "Usage: Example.TestEngine.exe {reload|shutdown|waitforquit} Bundle.exe BA.dll");
42 }
43
44 ConsoleUninitialize();
45
46LExit:
47 if (fComInitialized)
48 {
49 ::CoUninitialize();
50 }
51
52 return hr;
53}
diff --git a/src/ext/Bal/test/examples/TestEngine/ReloadEngine.cpp b/src/ext/Bal/test/examples/TestEngine/ReloadEngine.cpp
new file mode 100644
index 00000000..46fd9afa
--- /dev/null
+++ b/src/ext/Bal/test/examples/TestEngine/ReloadEngine.cpp
@@ -0,0 +1,55 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3#include "precomp.h"
4
5HRESULT RunReloadEngine(
6 __in LPCWSTR wzBundleFilePath,
7 __in LPCWSTR wzBAFilePath
8 )
9{
10 HRESULT hr = S_OK;
11 TestEngine* pTestEngine = NULL;
12
13 pTestEngine = new TestEngine();
14 ConsoleExitOnNull(pTestEngine, hr, E_OUTOFMEMORY, CONSOLE_COLOR_RED, "Failed to create new test engine.");
15
16 hr = pTestEngine->Initialize(wzBundleFilePath);
17 ConsoleExitOnFailure(hr, CONSOLE_COLOR_RED, "Failed to initialize engine.");
18
19 hr = pTestEngine->LoadBA(wzBAFilePath);
20 ConsoleExitOnFailure(hr, CONSOLE_COLOR_RED, "Failed to load BA.");
21
22 hr = pTestEngine->SendStartupEvent();
23 ConsoleExitOnFailure(hr, CONSOLE_COLOR_RED, "BA returned failure for OnStartup.");
24
25 hr = pTestEngine->SimulateQuit(0);
26 ConsoleExitOnFailure(hr, CONSOLE_COLOR_RED, "Failed to simulate quit.");
27
28 hr = pTestEngine->RunApplication();
29 ConsoleExitOnFailure(hr, CONSOLE_COLOR_RED, "Failed to run engine.");
30
31 hr = pTestEngine->SendShutdownEvent(BOOTSTRAPPER_SHUTDOWN_ACTION_RELOAD_BOOTSTRAPPER);
32 ConsoleExitOnFailure(hr, CONSOLE_COLOR_RED, "BA returned failure for OnShutdown.");
33
34 pTestEngine->UnloadBA();
35
36 hr = pTestEngine->LoadBA(wzBAFilePath);
37 ConsoleExitOnFailure(hr, CONSOLE_COLOR_RED, "Failed to load BA.");
38
39 hr = pTestEngine->SendStartupEvent();
40 ConsoleExitOnFailure(hr, CONSOLE_COLOR_RED, "BA returned failure for OnStartup.");
41
42 hr = pTestEngine->SimulateQuit(0);
43 ConsoleExitOnFailure(hr, CONSOLE_COLOR_RED, "Failed to simulate quit.");
44
45 hr = pTestEngine->RunApplication();
46 ConsoleExitOnFailure(hr, CONSOLE_COLOR_RED, "Failed to run engine.");
47
48 hr = pTestEngine->SendShutdownEvent(BOOTSTRAPPER_SHUTDOWN_ACTION_RESTART);
49 ConsoleExitOnFailure(hr, CONSOLE_COLOR_RED, "BA returned failure for OnShutdown.");
50
51 pTestEngine->UnloadBA();
52
53LExit:
54 return hr;
55}
diff --git a/src/ext/Bal/test/examples/TestEngine/ReloadEngine.h b/src/ext/Bal/test/examples/TestEngine/ReloadEngine.h
new file mode 100644
index 00000000..0e8456af
--- /dev/null
+++ b/src/ext/Bal/test/examples/TestEngine/ReloadEngine.h
@@ -0,0 +1,8 @@
1#pragma once
2// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
3
4
5HRESULT RunReloadEngine(
6 __in LPCWSTR wzBundleFilePath,
7 __in LPCWSTR wzBAFilePath
8 );
diff --git a/src/ext/Bal/test/examples/TestEngine/ShutdownEngine.cpp b/src/ext/Bal/test/examples/TestEngine/ShutdownEngine.cpp
new file mode 100644
index 00000000..3b876e4e
--- /dev/null
+++ b/src/ext/Bal/test/examples/TestEngine/ShutdownEngine.cpp
@@ -0,0 +1,38 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3#include "precomp.h"
4
5HRESULT RunShutdownEngine(
6 __in LPCWSTR wzBundleFilePath,
7 __in LPCWSTR wzBAFilePath
8 )
9{
10 HRESULT hr = S_OK;
11 TestEngine* pTestEngine = NULL;
12
13 pTestEngine = new TestEngine();
14 ConsoleExitOnNull(pTestEngine, hr, E_OUTOFMEMORY, CONSOLE_COLOR_RED, "Failed to create new test engine.");
15
16 hr = pTestEngine->Initialize(wzBundleFilePath);
17 ConsoleExitOnFailure(hr, CONSOLE_COLOR_RED, "Failed to initialize engine.");
18
19 hr = pTestEngine->LoadBA(wzBAFilePath);
20 ConsoleExitOnFailure(hr, CONSOLE_COLOR_RED, "Failed to load BA.");
21
22 hr = pTestEngine->SendStartupEvent();
23 ConsoleExitOnFailure(hr, CONSOLE_COLOR_RED, "BA returned failure for OnStartup.");
24
25 hr = pTestEngine->SimulateQuit(0);
26 ConsoleExitOnFailure(hr, CONSOLE_COLOR_RED, "Failed to simulate quit.");
27
28 hr = pTestEngine->RunApplication();
29 ConsoleExitOnFailure(hr, CONSOLE_COLOR_RED, "Failed to run engine.");
30
31 hr = pTestEngine->SendShutdownEvent(BOOTSTRAPPER_SHUTDOWN_ACTION_RELOAD_BOOTSTRAPPER);
32 ConsoleExitOnFailure(hr, CONSOLE_COLOR_RED, "BA returned failure for OnShutdown.");
33
34 pTestEngine->UnloadBA();
35
36LExit:
37 return hr;
38}
diff --git a/src/ext/Bal/test/examples/TestEngine/ShutdownEngine.h b/src/ext/Bal/test/examples/TestEngine/ShutdownEngine.h
new file mode 100644
index 00000000..0cfa147a
--- /dev/null
+++ b/src/ext/Bal/test/examples/TestEngine/ShutdownEngine.h
@@ -0,0 +1,8 @@
1#pragma once
2// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
3
4
5HRESULT RunShutdownEngine(
6 __in LPCWSTR wzBundleFilePath,
7 __in LPCWSTR wzBAFilePath
8 );
diff --git a/src/ext/Bal/test/examples/TestEngine/TestEngine.cpp b/src/ext/Bal/test/examples/TestEngine/TestEngine.cpp
new file mode 100644
index 00000000..4c7ec1c3
--- /dev/null
+++ b/src/ext/Bal/test/examples/TestEngine/TestEngine.cpp
@@ -0,0 +1,256 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3#include "precomp.h"
4
5HRESULT TestEngine::Initialize(
6 __in LPCWSTR wzBundleFilePath
7 )
8{
9 HRESULT hr = S_OK;
10 MSG msg = { };
11
12 LogInitialize(::GetModuleHandleW(NULL));
13
14 hr = LogOpen(NULL, PathFile(wzBundleFilePath), NULL, L"txt", FALSE, FALSE, NULL);
15 ConsoleExitOnFailure(hr, CONSOLE_COLOR_RED, "Failed to open log.");
16
17 ::PeekMessageW(&msg, NULL, WM_USER, WM_USER, PM_NOREMOVE);
18
19LExit:
20 return hr;
21}
22
23HRESULT TestEngine::LoadBA(
24 __in LPCWSTR wzBAFilePath
25 )
26{
27 HRESULT hr = S_OK;
28 BOOTSTRAPPER_COMMAND command = { };
29 BOOTSTRAPPER_CREATE_ARGS args = { };
30 PFN_BOOTSTRAPPER_APPLICATION_CREATE pfnCreate = NULL;
31
32 if (m_pCreateResults || m_hBAModule)
33 {
34 ExitFunction1(hr = E_INVALIDSTATE);
35 }
36
37 m_pCreateResults = static_cast<BOOTSTRAPPER_CREATE_RESULTS*>(MemAlloc(sizeof(BOOTSTRAPPER_CREATE_RESULTS), TRUE));
38
39 command.cbSize = sizeof(BOOTSTRAPPER_COMMAND);
40
41 hr = PathGetDirectory(wzBAFilePath, &command.wzBootstrapperWorkingFolder);
42 ConsoleExitOnFailure(hr, CONSOLE_COLOR_RED, "Failed to allocate wzBootstrapperWorkingFolder");
43
44 hr = PathConcat(command.wzBootstrapperWorkingFolder, L"BootstrapperApplicationData.xml", &command.wzBootstrapperApplicationDataPath);
45 ConsoleExitOnFailure(hr, CONSOLE_COLOR_RED, "Failed to allocate wzBootstrapperApplicationDataPath");
46
47 args.cbSize = sizeof(BOOTSTRAPPER_CREATE_ARGS);
48 args.pCommand = &command;
49 args.pfnBootstrapperEngineProc = TestEngine::EngineProc;
50 args.pvBootstrapperEngineProcContext = this;
51 args.qwEngineAPIVersion = MAKEQWORDVERSION(0, 0, 0, 1);
52
53 m_pCreateResults->cbSize = sizeof(BOOTSTRAPPER_CREATE_RESULTS);
54
55 m_hBAModule = ::LoadLibraryExW(wzBAFilePath, NULL, LOAD_WITH_ALTERED_SEARCH_PATH);
56 ConsoleExitOnNullWithLastError(m_hBAModule, hr, CONSOLE_COLOR_RED, "Failed to load BA dll.");
57
58 pfnCreate = (PFN_BOOTSTRAPPER_APPLICATION_CREATE)::GetProcAddress(m_hBAModule, "BootstrapperApplicationCreate");
59 ConsoleExitOnNull(pfnCreate, hr, E_OUTOFMEMORY, CONSOLE_COLOR_RED, "Failed to get address for BootstrapperApplicationCreate.");
60
61 hr = pfnCreate(&args, m_pCreateResults);
62 ConsoleExitOnFailure(hr, CONSOLE_COLOR_RED, "BA returned failure on BootstrapperApplicationCreate.");
63
64LExit:
65 ReleaseStr(command.wzBootstrapperApplicationDataPath);
66 ReleaseStr(command.wzBootstrapperWorkingFolder);
67
68 return hr;
69}
70
71HRESULT TestEngine::Log(
72 __in BOOTSTRAPPER_LOG_LEVEL level,
73 __in LPCWSTR wzMessage
74 )
75{
76 switch (level)
77 {
78 case BOOTSTRAPPER_LOG_LEVEL_NONE:
79 case BOOTSTRAPPER_LOG_LEVEL_DEBUG:
80 return S_OK;
81 default:
82 LogStringLine(REPORT_STANDARD, "%ls", wzMessage);
83 return ConsoleWriteLine(CONSOLE_COLOR_NORMAL, "%ls", wzMessage);
84 }
85}
86
87HRESULT TestEngine::RunApplication()
88{
89 HRESULT hr = S_OK;
90 MSG msg = { };
91 BOOL fRet = FALSE;
92
93 // Enter the message pump.
94 while (0 != (fRet = ::GetMessageW(&msg, NULL, 0, 0)))
95 {
96 if (-1 == fRet)
97 {
98 ConsoleExitOnFailure(hr = E_UNEXPECTED, CONSOLE_COLOR_RED, "Unexpected return value from message pump.");
99 }
100 else
101 {
102 ProcessBAMessage(&msg);
103 }
104 }
105
106LExit:
107 return hr;
108}
109
110HRESULT TestEngine::SendShutdownEvent(
111 __in BOOTSTRAPPER_SHUTDOWN_ACTION defaultAction
112 )
113{
114 HRESULT hr = S_OK;
115 BA_ONSHUTDOWN_ARGS shutdownArgs = { };
116 BA_ONSHUTDOWN_RESULTS shutdownResults = { };
117 shutdownArgs.cbSize = sizeof(BA_ONSHUTDOWN_ARGS);
118 shutdownResults.action = defaultAction;
119 shutdownResults.cbSize = sizeof(BA_ONSHUTDOWN_RESULTS);
120 hr = m_pCreateResults->pfnBootstrapperApplicationProc(BOOTSTRAPPER_APPLICATION_MESSAGE_ONSHUTDOWN, &shutdownArgs, &shutdownResults, m_pCreateResults->pvBootstrapperApplicationProcContext);
121 return hr;
122}
123
124HRESULT TestEngine::SendStartupEvent()
125{
126 HRESULT hr = S_OK;
127 BA_ONSTARTUP_ARGS startupArgs = { };
128 BA_ONSTARTUP_RESULTS startupResults = { };
129 startupArgs.cbSize = sizeof(BA_ONSTARTUP_ARGS);
130 startupResults.cbSize = sizeof(BA_ONSTARTUP_RESULTS);
131 hr = m_pCreateResults->pfnBootstrapperApplicationProc(BOOTSTRAPPER_APPLICATION_MESSAGE_ONSTARTUP, &startupArgs, &startupResults, m_pCreateResults->pvBootstrapperApplicationProcContext);
132 return hr;
133}
134
135HRESULT TestEngine::SimulateQuit(
136 __in DWORD dwExitCode
137 )
138{
139 BAENGINE_QUIT_ARGS args = { };
140 BAENGINE_QUIT_RESULTS results = { };
141
142 args.cbSize = sizeof(BAENGINE_QUIT_ARGS);
143 args.dwExitCode = dwExitCode;
144
145 results.cbSize = sizeof(BAENGINE_QUIT_RESULTS);
146
147 return BAEngineQuit(&args, &results);
148}
149
150void TestEngine::UnloadBA()
151{
152 PFN_BOOTSTRAPPER_APPLICATION_DESTROY pfnDestroy = NULL;
153 BOOL fDisableUnloading = m_pCreateResults && m_pCreateResults->fDisableUnloading;
154
155 ReleaseNullMem(m_pCreateResults);
156
157 pfnDestroy = (PFN_BOOTSTRAPPER_APPLICATION_DESTROY)::GetProcAddress(m_hBAModule, "BootstrapperApplicationDestroy");
158
159 if (pfnDestroy)
160 {
161 pfnDestroy();
162 }
163
164 if (m_hBAModule)
165 {
166 if (!fDisableUnloading)
167 {
168 ::FreeLibrary(m_hBAModule);
169 }
170
171 m_hBAModule = NULL;
172 }
173}
174
175HRESULT TestEngine::BAEngineLog(
176 __in BAENGINE_LOG_ARGS* pArgs,
177 __in BAENGINE_LOG_RESULTS* /*pResults*/
178 )
179{
180 return Log(pArgs->level, pArgs->wzMessage);
181}
182
183HRESULT TestEngine::BAEngineQuit(
184 __in BAENGINE_QUIT_ARGS* pArgs,
185 __in BAENGINE_QUIT_RESULTS* /*pResults*/
186 )
187{
188 HRESULT hr = S_OK;
189
190 if (!::PostThreadMessageW(m_dwThreadId, WM_TESTENG_QUIT, static_cast<WPARAM>(pArgs->dwExitCode), 0))
191 {
192 ConsoleExitWithLastError(hr, CONSOLE_COLOR_RED, "Failed to post shutdown message.");
193 }
194
195LExit:
196 return hr;
197}
198
199HRESULT WINAPI TestEngine::EngineProc(
200 __in BOOTSTRAPPER_ENGINE_MESSAGE message,
201 __in const LPVOID pvArgs,
202 __inout LPVOID pvResults,
203 __in_opt LPVOID pvContext
204 )
205{
206 HRESULT hr = S_OK;
207 TestEngine* pContext = (TestEngine*)pvContext;
208
209 if (!pContext || !pvArgs || !pvResults)
210 {
211 ExitFunction1(hr = E_INVALIDARG);
212 }
213
214 switch (message)
215 {
216 case BOOTSTRAPPER_ENGINE_MESSAGE_LOG:
217 hr = pContext->BAEngineLog(reinterpret_cast<BAENGINE_LOG_ARGS*>(pvArgs), reinterpret_cast<BAENGINE_LOG_RESULTS*>(pvResults));
218 break;
219 case BOOTSTRAPPER_ENGINE_MESSAGE_QUIT:
220 hr = pContext->BAEngineQuit(reinterpret_cast<BAENGINE_QUIT_ARGS*>(pvArgs), reinterpret_cast<BAENGINE_QUIT_RESULTS*>(pvResults));
221 default:
222 hr = E_NOTIMPL;
223 break;
224 }
225
226LExit:
227 return hr;
228}
229
230HRESULT TestEngine::ProcessBAMessage(
231 __in const MSG* pmsg
232 )
233{
234 HRESULT hr = S_OK;
235
236 switch (pmsg->message)
237 {
238 case WM_TESTENG_QUIT:
239 ::PostQuitMessage(static_cast<int>(pmsg->wParam)); // go bye-bye.
240 break;
241 }
242
243 return hr;
244}
245
246TestEngine::TestEngine()
247{
248 m_hBAModule = NULL;
249 m_pCreateResults = NULL;
250 m_dwThreadId = ::GetCurrentThreadId();
251}
252
253TestEngine::~TestEngine()
254{
255 ReleaseMem(m_pCreateResults);
256}
diff --git a/src/ext/Bal/test/examples/TestEngine/TestEngine.h b/src/ext/Bal/test/examples/TestEngine/TestEngine.h
new file mode 100644
index 00000000..44e813bd
--- /dev/null
+++ b/src/ext/Bal/test/examples/TestEngine/TestEngine.h
@@ -0,0 +1,80 @@
1#pragma once
2// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
3
4
5enum WM_TESTENG
6{
7 WM_TESTENG_FIRST = WM_APP + 0xFFF, // this enum value must always be first.
8
9 WM_TESTENG_DETECT,
10 WM_TESTENG_PLAN,
11 WM_TESTENG_ELEVATE,
12 WM_TESTENG_APPLY,
13 WM_TESTENG_LAUNCH_APPROVED_EXE,
14 WM_TESTENG_QUIT,
15
16 WM_TESTENG_LAST, // this enum value must always be last.
17};
18
19class TestEngine
20{
21public:
22 HRESULT Initialize(
23 __in LPCWSTR wzBundleFilePath
24 );
25
26 HRESULT LoadBA(
27 __in LPCWSTR wzBAFilePath
28 );
29
30 HRESULT Log(
31 __in BOOTSTRAPPER_LOG_LEVEL level,
32 __in LPCWSTR wzMessage
33 );
34
35 HRESULT RunApplication();
36
37 HRESULT SendShutdownEvent(
38 __in BOOTSTRAPPER_SHUTDOWN_ACTION defaultAction
39 );
40
41 HRESULT SendStartupEvent();
42
43 HRESULT SimulateQuit(
44 __in DWORD dwExitCode
45 );
46
47 void UnloadBA();
48
49private:
50 HRESULT BAEngineLog(
51 __in BAENGINE_LOG_ARGS* pArgs,
52 __in BAENGINE_LOG_RESULTS* pResults
53 );
54
55 HRESULT BAEngineQuit(
56 __in BAENGINE_QUIT_ARGS* pArgs,
57 __in BAENGINE_QUIT_RESULTS* pResults
58 );
59
60 static HRESULT WINAPI EngineProc(
61 __in BOOTSTRAPPER_ENGINE_MESSAGE message,
62 __in const LPVOID pvArgs,
63 __inout LPVOID pvResults,
64 __in_opt LPVOID pvContext
65 );
66
67 HRESULT ProcessBAMessage(
68 __in const MSG* pmsg
69 );
70
71public:
72 TestEngine();
73
74 ~TestEngine();
75
76private:
77 HMODULE m_hBAModule;
78 BOOTSTRAPPER_CREATE_RESULTS* m_pCreateResults;
79 DWORD m_dwThreadId;
80}; \ No newline at end of file
diff --git a/src/ext/Bal/test/examples/TestEngine/WaitForQuitEngine.cpp b/src/ext/Bal/test/examples/TestEngine/WaitForQuitEngine.cpp
new file mode 100644
index 00000000..2f80ba75
--- /dev/null
+++ b/src/ext/Bal/test/examples/TestEngine/WaitForQuitEngine.cpp
@@ -0,0 +1,35 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3#include "precomp.h"
4
5HRESULT RunWaitForQuitEngine(
6 __in LPCWSTR wzBundleFilePath,
7 __in LPCWSTR wzBAFilePath
8 )
9{
10 HRESULT hr = S_OK;
11 TestEngine* pTestEngine = NULL;
12
13 pTestEngine = new TestEngine();
14 ConsoleExitOnNull(pTestEngine, hr, E_OUTOFMEMORY, CONSOLE_COLOR_RED, "Failed to create new test engine.");
15
16 hr = pTestEngine->Initialize(wzBundleFilePath);
17 ConsoleExitOnFailure(hr, CONSOLE_COLOR_RED, "Failed to initialize engine.");
18
19 hr = pTestEngine->LoadBA(wzBAFilePath);
20 ConsoleExitOnFailure(hr, CONSOLE_COLOR_RED, "Failed to load BA.");
21
22 hr = pTestEngine->SendStartupEvent();
23 ConsoleExitOnFailure(hr, CONSOLE_COLOR_RED, "BA returned failure for OnStartup.");
24
25 hr = pTestEngine->RunApplication();
26 ConsoleExitOnFailure(hr, CONSOLE_COLOR_RED, "Failed to run engine.");
27
28 hr = pTestEngine->SendShutdownEvent(BOOTSTRAPPER_SHUTDOWN_ACTION_RELOAD_BOOTSTRAPPER);
29 ConsoleExitOnFailure(hr, CONSOLE_COLOR_RED, "BA returned failure for OnShutdown.");
30
31 pTestEngine->UnloadBA();
32
33LExit:
34 return hr;
35}
diff --git a/src/ext/Bal/test/examples/TestEngine/WaitForQuitEngine.h b/src/ext/Bal/test/examples/TestEngine/WaitForQuitEngine.h
new file mode 100644
index 00000000..99e3f63c
--- /dev/null
+++ b/src/ext/Bal/test/examples/TestEngine/WaitForQuitEngine.h
@@ -0,0 +1,8 @@
1#pragma once
2// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
3
4
5HRESULT RunWaitForQuitEngine(
6 __in LPCWSTR wzBundleFilePath,
7 __in LPCWSTR wzBAFilePath
8 );
diff --git a/src/ext/Bal/test/examples/TestEngine/packages.config b/src/ext/Bal/test/examples/TestEngine/packages.config
new file mode 100644
index 00000000..548ddb48
--- /dev/null
+++ b/src/ext/Bal/test/examples/TestEngine/packages.config
@@ -0,0 +1,7 @@
1<?xml version="1.0" encoding="utf-8"?>
2<packages>
3 <package id="Nerdbank.GitVersioning" version="3.3.37" targetFramework="native" developmentDependency="true" />
4 <package id="WixToolset.BootstrapperCore.Native" version="4.0.141" targetFramework="native" />
5 <package id="WixToolset.BalUtil" version="4.0.58" targetFramework="native" />
6 <package id="WixToolset.DUtil" version="4.0.72" targetFramework="native" />
7</packages> \ No newline at end of file
diff --git a/src/ext/Bal/test/examples/TestEngine/precomp.cpp b/src/ext/Bal/test/examples/TestEngine/precomp.cpp
new file mode 100644
index 00000000..37664a1c
--- /dev/null
+++ b/src/ext/Bal/test/examples/TestEngine/precomp.cpp
@@ -0,0 +1,3 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3#include "precomp.h"
diff --git a/src/ext/Bal/test/examples/TestEngine/precomp.h b/src/ext/Bal/test/examples/TestEngine/precomp.h
new file mode 100644
index 00000000..f943f420
--- /dev/null
+++ b/src/ext/Bal/test/examples/TestEngine/precomp.h
@@ -0,0 +1,20 @@
1#pragma once
2// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
3
4#include <windows.h>
5#include <MsiQuery.h>
6
7#include "dutil.h"
8#include "conutil.h"
9#include "logutil.h"
10#include "memutil.h"
11#include "pathutil.h"
12#include "strutil.h"
13
14#include "BootstrapperEngine.h"
15#include "BootstrapperApplication.h"
16
17#include "TestEngine.h"
18#include "ReloadEngine.h"
19#include "ShutdownEngine.h"
20#include "WaitForQuitEngine.h"
diff --git a/src/ext/Bal/test/examples/WPFCoreBundleFDD/FrameworkDependentBundle.wxs b/src/ext/Bal/test/examples/WPFCoreBundleFDD/FrameworkDependentBundle.wxs
new file mode 100644
index 00000000..68d742b0
--- /dev/null
+++ b/src/ext/Bal/test/examples/WPFCoreBundleFDD/FrameworkDependentBundle.wxs
@@ -0,0 +1,16 @@
1<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs" xmlns:bal="http://wixtoolset.org/schemas/v4/wxs/bal">
2 <Bundle Name="FDDWPFCoreMBA" Version="1.0.0.0" Manufacturer="Example Corporation" UpgradeCode="5CE5B5C7-4B6B-4B95-B297-731F1F956533">
3 <BootstrapperApplication>
4 <Payload SourceFile="publish\Example.WPFCoreMBA\fdd\Example.WPFCoreMBA.deps.json" Name="Example.WPFCoreMBA.deps.json" />
5 <Payload SourceFile="publish\Example.WPFCoreMBA\fdd\Example.WPFCoreMBA.dll" Name="Example.WPFCoreMBA.dll" bal:BAFactoryAssembly="yes" />
6 <Payload SourceFile="publish\Example.WPFCoreMBA\fdd\Example.WPFCoreMBA.pdb" Name="Example.WPFCoreMBA.pdb" />
7 <Payload SourceFile="publish\Example.WPFCoreMBA\fdd\Example.WPFCoreMBA.runtimeconfig.json" Name="Example.WPFCoreMBA.runtimeconfig.json" />
8 <Payload SourceFile="publish\Example.WPFCoreMBA\fdd\mbanative.dll" Name="mbanative.dll" />
9 <Payload SourceFile="publish\Example.WPFCoreMBA\fdd\WixToolset.Mba.Core.dll" Name="WixToolset.Mba.Core.dll" />
10 <bal:WixDotNetCoreBootstrapperApplicationHost />
11 </BootstrapperApplication>
12 <Chain>
13 <ExePackage DetectCondition="none" SourceFile="c:\windows\system32\kernel32.dll" bal:PrereqPackage="yes" />
14 </Chain>
15 </Bundle>
16</Wix>
diff --git a/src/ext/Bal/test/examples/WPFCoreBundleFDD/WPFCoreBundleFDD.wixproj b/src/ext/Bal/test/examples/WPFCoreBundleFDD/WPFCoreBundleFDD.wixproj
new file mode 100644
index 00000000..ba75a9ff
--- /dev/null
+++ b/src/ext/Bal/test/examples/WPFCoreBundleFDD/WPFCoreBundleFDD.wixproj
@@ -0,0 +1,2 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2<Project Sdk="WixToolset.Sdk" />
diff --git a/src/ext/Bal/test/examples/WPFCoreMBA/AssemblyInfo.cs b/src/ext/Bal/test/examples/WPFCoreMBA/AssemblyInfo.cs
new file mode 100644
index 00000000..03a5c7fa
--- /dev/null
+++ b/src/ext/Bal/test/examples/WPFCoreMBA/AssemblyInfo.cs
@@ -0,0 +1,12 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3using System.Windows;
4
5[assembly:ThemeInfo(
6 ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located
7 //(used if a resource is not found in the page,
8 // or application resource dictionaries)
9 ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located
10 //(used if a resource is not found in the page,
11 // app, or any theme specific resource dictionaries)
12)]
diff --git a/src/ext/Bal/test/examples/WPFCoreMBA/Example.WPFCoreMBA.csproj b/src/ext/Bal/test/examples/WPFCoreMBA/Example.WPFCoreMBA.csproj
new file mode 100644
index 00000000..296e5be9
--- /dev/null
+++ b/src/ext/Bal/test/examples/WPFCoreMBA/Example.WPFCoreMBA.csproj
@@ -0,0 +1,16 @@
1<Project Sdk="Microsoft.NET.Sdk">
2
3 <PropertyGroup>
4 <TargetFramework>net5.0-windows</TargetFramework>
5 <RuntimeIdentifiers>win-x86;win-x64</RuntimeIdentifiers>
6 <EnableDynamicLoading>true</EnableDynamicLoading>
7 <Description>WPF .NET Core MBA</Description>
8 <UseWPF>true</UseWPF>
9 </PropertyGroup>
10
11
12 <ItemGroup>
13 <PackageReference Include="Nerdbank.GitVersioning" Version="3.3.37" PrivateAssets="all" />
14 <PackageReference Include="WixToolset.Mba.Core" Version="4.0.*" />
15 </ItemGroup>
16</Project> \ No newline at end of file
diff --git a/src/ext/Bal/test/examples/WPFCoreMBA/MainWindow.xaml b/src/ext/Bal/test/examples/WPFCoreMBA/MainWindow.xaml
new file mode 100644
index 00000000..40a27a06
--- /dev/null
+++ b/src/ext/Bal/test/examples/WPFCoreMBA/MainWindow.xaml
@@ -0,0 +1,16 @@
1<?xml version="1.0" encoding="utf-8" ?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3
4
5<Window x:Class="Example.WPFCoreMBA.MainWindow"
6 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
7 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
8 xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
9 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
10 xmlns:local="clr-namespace:Example.WPFCoreMBA"
11 mc:Ignorable="d"
12 Title="MainWindow" Height="450" Width="800">
13 <Grid>
14
15 </Grid>
16</Window>
diff --git a/src/ext/Bal/test/examples/WPFCoreMBA/MainWindow.xaml.cs b/src/ext/Bal/test/examples/WPFCoreMBA/MainWindow.xaml.cs
new file mode 100644
index 00000000..4f61b807
--- /dev/null
+++ b/src/ext/Bal/test/examples/WPFCoreMBA/MainWindow.xaml.cs
@@ -0,0 +1,17 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace Example.WPFCoreMBA
4{
5 using System.Windows;
6
7 /// <summary>
8 /// Interaction logic for MainWindow.xaml
9 /// </summary>
10 public partial class MainWindow : Window
11 {
12 public MainWindow()
13 {
14 this.InitializeComponent();
15 }
16 }
17}
diff --git a/src/ext/Bal/test/examples/WPFCoreMBA/WPFCoreBA.cs b/src/ext/Bal/test/examples/WPFCoreMBA/WPFCoreBA.cs
new file mode 100644
index 00000000..d50be813
--- /dev/null
+++ b/src/ext/Bal/test/examples/WPFCoreMBA/WPFCoreBA.cs
@@ -0,0 +1,42 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace Example.WPFCoreMBA
4{
5 using System.Windows.Threading;
6 using WixToolset.Mba.Core;
7
8 public class WPFCoreBA : BootstrapperApplication
9 {
10 public WPFCoreBA(IEngine engine)
11 : base(engine)
12 {
13 }
14
15 public Dispatcher BADispatcher { get; private set; }
16
17 protected override void Run()
18 {
19 this.BADispatcher = Dispatcher.CurrentDispatcher;
20 var window = new MainWindow();
21 window.Closed += (s, e) => this.BADispatcher.InvokeShutdown();
22 //window.Show();
23 //Dispatcher.Run();
24 //this.engine.Quit(0);
25 }
26
27 protected override void OnStartup(StartupEventArgs args)
28 {
29 base.OnStartup(args);
30
31 this.engine.Log(LogLevel.Standard, nameof(WPFCoreBA));
32 }
33
34 protected override void OnShutdown(ShutdownEventArgs args)
35 {
36 base.OnShutdown(args);
37
38 var message = "Shutdown," + args.Action.ToString() + "," + args.HResult.ToString();
39 this.engine.Log(LogLevel.Standard, message);
40 }
41 }
42}
diff --git a/src/ext/Bal/test/examples/WPFCoreMBA/WPFCoreBAFactory.cs b/src/ext/Bal/test/examples/WPFCoreMBA/WPFCoreBAFactory.cs
new file mode 100644
index 00000000..a3ccdf9f
--- /dev/null
+++ b/src/ext/Bal/test/examples/WPFCoreMBA/WPFCoreBAFactory.cs
@@ -0,0 +1,22 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3[assembly: WixToolset.Mba.Core.BootstrapperApplicationFactory(typeof(Example.WPFCoreMBA.WPFCoreBAFactory))]
4namespace Example.WPFCoreMBA
5{
6 using WixToolset.Mba.Core;
7
8 public class WPFCoreBAFactory : BaseBootstrapperApplicationFactory
9 {
10 private static int loadCount = 0;
11
12 protected override IBootstrapperApplication Create(IEngine engine, IBootstrapperCommand bootstrapperCommand)
13 {
14 if (loadCount > 0)
15 {
16 engine.Log(LogLevel.Standard, $"Reloaded {loadCount} time(s)");
17 }
18 ++loadCount;
19 return new WPFCoreBA(engine);
20 }
21 }
22}
diff --git a/src/ext/Bal/test/examples/Wix.Build.props b/src/ext/Bal/test/examples/Wix.Build.props
new file mode 100644
index 00000000..aad94bb6
--- /dev/null
+++ b/src/ext/Bal/test/examples/Wix.Build.props
@@ -0,0 +1,10 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3<Project>
4 <PropertyGroup>
5 <OutputType>Bundle</OutputType>
6 <TargetExt>.exe</TargetExt>
7 <HarvestDirectoryAdditionalOptions>-generate payloadgroup</HarvestDirectoryAdditionalOptions>
8 <OutputPath>$(OutputPath)examples\</OutputPath>
9 </PropertyGroup>
10</Project>
diff --git a/src/ext/Bal/test/examples/Wix.Build.targets b/src/ext/Bal/test/examples/Wix.Build.targets
new file mode 100644
index 00000000..7e6fe9f2
--- /dev/null
+++ b/src/ext/Bal/test/examples/Wix.Build.targets
@@ -0,0 +1,8 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3<Project>
4 <ItemGroup>
5 <BindInputPaths Include="$(OutputPath)" />
6 <WixExtension Include="$(OutputPath)..\netstandard2.0\WixToolset.Bal.wixext.dll" />
7 </ItemGroup>
8</Project>
diff --git a/src/ext/Bal/test/examples/examples.proj b/src/ext/Bal/test/examples/examples.proj
new file mode 100644
index 00000000..08cb7511
--- /dev/null
+++ b/src/ext/Bal/test/examples/examples.proj
@@ -0,0 +1,50 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3
4
5<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
6 <Import Project="..\..\Directory.Build.props" />
7
8 <PropertyGroup>
9 <EarliestCoreMBAProjectPath>EarliestCoreMBA\Example.EarliestCoreMBA.csproj</EarliestCoreMBAProjectPath>
10 <FullFramework2MBAProjectPath>FullFramework2MBA\Example.FullFramework2MBA.csproj</FullFramework2MBAProjectPath>
11 <FullFramework4MBAProjectPath>FullFramework4MBA\Example.FullFramework4MBA.csproj</FullFramework4MBAProjectPath>
12 <LatestCoreMBAProjectPath>LatestCoreMBA\Example.LatestCoreMBA.csproj</LatestCoreMBAProjectPath>
13 <WPFCoreMBAProjectPath>WPFCoreMBA\Example.WPFCoreMBA.csproj</WPFCoreMBAProjectPath>
14 <MBAPublishPath>$(OutputPath)examples\publish\</MBAPublishPath>
15 </PropertyGroup>
16
17 <ItemGroup>
18 <CoreMBAProject Include="$(EarliestCoreMBAProjectPath)">
19 <PublishPath>$(MBAPublishPath)Example.EarliestCoreMBA</PublishPath>
20 </CoreMBAProject>
21 <CoreMBAProject Include="$(LatestCoreMBAProjectPath)">
22 <PublishPath>$(MBAPublishPath)Example.LatestCoreMBA</PublishPath>
23 </CoreMBAProject>
24 <CoreMBAProject Include="$(WPFCoreMBAProjectPath)">
25 <PublishPath>$(MBAPublishPath)Example.WPFCoreMBA</PublishPath>
26 <SkipSCD>true</SkipSCD>
27 <SkipTrimmedSCD>true</SkipTrimmedSCD>
28 </CoreMBAProject>
29
30 <FullMBAProject Include="$(FullFramework2MBAProjectPath)" />
31 <FullMBAProject Include="$(FullFramework4MBAProjectPath)" />
32
33 <ExampleBundleProject Include="**\*.wixproj" />
34 </ItemGroup>
35
36 <Target Name="PublishCoreExamples">
37 <Exec Command='dotnet publish -o "%(CoreMBAProject.PublishPath)\fdd" -r win-x86 -c $(Configuration) --self-contained false "%(CoreMBAProject.Identity)"'
38 Condition="'%(CoreMBAProject.SkipFDD)'==''" />
39 <Exec Command='dotnet publish -o "%(CoreMBAProject.PublishPath)\scd" -r win-x86 -c $(Configuration) --self-contained true "%(CoreMBAProject.Identity)"'
40 Condition="'%(CoreMBAProject.SkipSCD)'==''" />
41 <Exec Command='dotnet publish -o "%(CoreMBAProject.PublishPath)\trimmedscd" -r win-x86 -c $(Configuration) --self-contained true -p:PublishTrimmed=true "%(CoreMBAProject.Identity)"'
42 Condition="'%(CoreMBAProject.SkipTrimmedSCD)'==''" />
43 </Target>
44
45 <Target Name="Build" DependsOnTargets="PublishCoreExamples">
46 <MSBuild Projects="%(ExampleBundleProject.Identity)" />
47 </Target>
48
49 <Import Project="..\..\Directory.Build.targets" />
50</Project> \ No newline at end of file
diff --git a/src/ext/Bal/wix.snk b/src/ext/Bal/wix.snk
new file mode 100644
index 00000000..3908a66a
--- /dev/null
+++ b/src/ext/Bal/wix.snk
Binary files differ
diff --git a/src/ext/Bal/wixext/BalBurnBackendExtension.cs b/src/ext/Bal/wixext/BalBurnBackendExtension.cs
new file mode 100644
index 00000000..e8dc7a3e
--- /dev/null
+++ b/src/ext/Bal/wixext/BalBurnBackendExtension.cs
@@ -0,0 +1,171 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Bal
4{
5 using System;
6 using System.Collections.Generic;
7 using System.Linq;
8 using WixToolset.Bal.Symbols;
9 using WixToolset.Data;
10 using WixToolset.Data.Burn;
11 using WixToolset.Data.Symbols;
12 using WixToolset.Extensibility;
13
14 public class BalBurnBackendExtension : BaseBurnBackendBinderExtension
15 {
16 private static readonly IntermediateSymbolDefinition[] BurnSymbolDefinitions =
17 {
18 BalSymbolDefinitions.WixBalBAFactoryAssembly,
19 BalSymbolDefinitions.WixBalBAFunctions,
20 BalSymbolDefinitions.WixBalCondition,
21 BalSymbolDefinitions.WixBalPackageInfo,
22 BalSymbolDefinitions.WixDncOptions,
23 BalSymbolDefinitions.WixMbaPrereqInformation,
24 BalSymbolDefinitions.WixStdbaOptions,
25 BalSymbolDefinitions.WixStdbaOverridableVariable,
26 };
27
28 protected override IReadOnlyCollection<IntermediateSymbolDefinition> SymbolDefinitions => BurnSymbolDefinitions;
29
30 public override void SymbolsFinalized(IntermediateSection section)
31 {
32 base.SymbolsFinalized(section);
33
34 var baSymbol = section.Symbols.OfType<WixBootstrapperApplicationDllSymbol>().SingleOrDefault();
35 var baId = baSymbol?.Id?.Id;
36 if (null == baId)
37 {
38 return;
39 }
40
41 var isStdBA = baId.StartsWith("WixStandardBootstrapperApplication");
42 var isMBA = baId.StartsWith("WixManagedBootstrapperApplicationHost");
43 var isDNC = baId.StartsWith("WixDotNetCoreBootstrapperApplicationHost");
44 var isSCD = isDNC && this.VerifySCD(section);
45
46 if (isDNC)
47 {
48 this.FinalizeBAFactorySymbol(section);
49 }
50
51 if (isStdBA || isMBA || isDNC)
52 {
53 this.VerifyBAFunctions(section);
54 }
55
56 if (isMBA || (isDNC && !isSCD))
57 {
58 this.VerifyPrereqPackages(section, isDNC);
59 }
60 }
61
62 private void FinalizeBAFactorySymbol(IntermediateSection section)
63 {
64 var factorySymbol = section.Symbols.OfType<WixBalBAFactoryAssemblySymbol>().SingleOrDefault();
65 if (null == factorySymbol)
66 {
67 return;
68 }
69
70 var factoryPayloadSymbol = section.Symbols.OfType<WixBundlePayloadSymbol>()
71 .Where(p => p.Id.Id == factorySymbol.PayloadId)
72 .SingleOrDefault();
73 if (null == factoryPayloadSymbol)
74 {
75 return;
76 }
77
78 factorySymbol.FilePath = factoryPayloadSymbol.Name;
79 }
80
81 private void VerifyBAFunctions(IntermediateSection section)
82 {
83 WixBalBAFunctionsSymbol baFunctionsSymbol = null;
84 foreach (var symbol in section.Symbols.OfType<WixBalBAFunctionsSymbol>())
85 {
86 if (null == baFunctionsSymbol)
87 {
88 baFunctionsSymbol = symbol;
89 }
90 else
91 {
92 this.Messaging.Write(BalErrors.MultipleBAFunctions(symbol.SourceLineNumbers));
93 }
94 }
95
96 var payloadPropertiesSymbols = section.Symbols.OfType<WixBundlePayloadSymbol>().ToList();
97 if (null == baFunctionsSymbol)
98 {
99 foreach (var payloadPropertiesSymbol in payloadPropertiesSymbols)
100 {
101 if (string.Equals(payloadPropertiesSymbol.Name, "bafunctions.dll", StringComparison.OrdinalIgnoreCase) &&
102 BurnConstants.BurnUXContainerName == payloadPropertiesSymbol.ContainerRef)
103 {
104 this.Messaging.Write(BalWarnings.UnmarkedBAFunctionsDLL(payloadPropertiesSymbol.SourceLineNumbers));
105 }
106 }
107 }
108 else
109 {
110 var payloadId = baFunctionsSymbol.Id;
111 var bundlePayloadSymbol = payloadPropertiesSymbols.Single(x => payloadId == x.Id);
112 if (BurnConstants.BurnUXContainerName != bundlePayloadSymbol.ContainerRef)
113 {
114 this.Messaging.Write(BalErrors.BAFunctionsPayloadRequiredInUXContainer(baFunctionsSymbol.SourceLineNumbers));
115 }
116 }
117 }
118
119 private void VerifyPrereqPackages(IntermediateSection section, bool isDNC)
120 {
121 var prereqInfoSymbols = section.Symbols.OfType<WixMbaPrereqInformationSymbol>().ToList();
122 if (prereqInfoSymbols.Count == 0)
123 {
124 var message = isDNC ? BalErrors.MissingDNCPrereq() : BalErrors.MissingMBAPrereq();
125 this.Messaging.Write(message);
126 return;
127 }
128
129 var foundLicenseFile = false;
130 var foundLicenseUrl = false;
131
132 foreach (var prereqInfoSymbol in prereqInfoSymbols)
133 {
134 if (null != prereqInfoSymbol.LicenseFile)
135 {
136 if (foundLicenseFile || foundLicenseUrl)
137 {
138 this.Messaging.Write(BalErrors.MultiplePrereqLicenses(prereqInfoSymbol.SourceLineNumbers));
139 return;
140 }
141
142 foundLicenseFile = true;
143 }
144
145 if (null != prereqInfoSymbol.LicenseUrl)
146 {
147 if (foundLicenseFile || foundLicenseUrl)
148 {
149 this.Messaging.Write(BalErrors.MultiplePrereqLicenses(prereqInfoSymbol.SourceLineNumbers));
150 return;
151 }
152
153 foundLicenseUrl = true;
154 }
155 }
156 }
157
158 private bool VerifySCD(IntermediateSection section)
159 {
160 var isSCD = false;
161
162 var dncOptions = section.Symbols.OfType<WixDncOptionsSymbol>().SingleOrDefault();
163 if (dncOptions != null)
164 {
165 isSCD = dncOptions.SelfContainedDeployment != 0;
166 }
167
168 return isSCD;
169 }
170 }
171}
diff --git a/src/ext/Bal/wixext/BalCompiler.cs b/src/ext/Bal/wixext/BalCompiler.cs
new file mode 100644
index 00000000..267345e7
--- /dev/null
+++ b/src/ext/Bal/wixext/BalCompiler.cs
@@ -0,0 +1,923 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Bal
4{
5 using System;
6 using System.Collections.Generic;
7 using System.Xml.Linq;
8 using WixToolset.Bal.Symbols;
9 using WixToolset.Data;
10 using WixToolset.Data.Symbols;
11 using WixToolset.Extensibility;
12 using WixToolset.Extensibility.Data;
13
14 /// <summary>
15 /// The compiler for the WiX Toolset Bal Extension.
16 /// </summary>
17 public sealed class BalCompiler : BaseCompilerExtension
18 {
19 private readonly Dictionary<string, WixMbaPrereqInformationSymbol> prereqInfoSymbolsByPackageId;
20
21 private enum WixDotNetCoreBootstrapperApplicationHostTheme
22 {
23 Unknown,
24 None,
25 Standard,
26 }
27
28 private enum WixManagedBootstrapperApplicationHostTheme
29 {
30 Unknown,
31 None,
32 Standard,
33 }
34
35 private enum WixStandardBootstrapperApplicationTheme
36 {
37 Unknown,
38 HyperlinkLargeLicense,
39 HyperlinkLicense,
40 HyperlinkSidebarLicense,
41 None,
42 RtfLargeLicense,
43 RtfLicense,
44 }
45
46 /// <summary>
47 /// Instantiate a new BalCompiler.
48 /// </summary>
49 public BalCompiler()
50 {
51 this.prereqInfoSymbolsByPackageId = new Dictionary<string, WixMbaPrereqInformationSymbol>();
52 }
53
54 public override XNamespace Namespace => "http://wixtoolset.org/schemas/v4/wxs/bal";
55
56 /// <summary>
57 /// Processes an element for the Compiler.
58 /// </summary>
59 /// <param name="intermediate"></param>
60 /// <param name="section"></param>
61 /// <param name="parentElement">Parent element of element to process.</param>
62 /// <param name="element">Element to process.</param>
63 /// <param name="context">Extra information about the context in which this element is being parsed.</param>
64 public override void ParseElement(Intermediate intermediate, IntermediateSection section, XElement parentElement, XElement element, IDictionary<string, string> context)
65 {
66 switch (parentElement.Name.LocalName)
67 {
68 case "Bundle":
69 case "Fragment":
70 switch (element.Name.LocalName)
71 {
72 case "Condition":
73 this.ParseConditionElement(intermediate, section, element);
74 break;
75 case "ManagedBootstrapperApplicationPrereqInformation":
76 this.ParseMbaPrereqInfoElement(intermediate, section, element);
77 break;
78 default:
79 this.ParseHelper.UnexpectedElement(parentElement, element);
80 break;
81 }
82 break;
83 case "BootstrapperApplication":
84 switch (element.Name.LocalName)
85 {
86 case "WixStandardBootstrapperApplication":
87 this.ParseWixStandardBootstrapperApplicationElement(intermediate, section, element);
88 break;
89 case "WixManagedBootstrapperApplicationHost":
90 this.ParseWixManagedBootstrapperApplicationHostElement(intermediate, section, element);
91 break;
92 case "WixDotNetCoreBootstrapperApplicationHost":
93 this.ParseWixDotNetCoreBootstrapperApplicationHostElement(intermediate, section, element);
94 break;
95 default:
96 this.ParseHelper.UnexpectedElement(parentElement, element);
97 break;
98 }
99 break;
100 default:
101 this.ParseHelper.UnexpectedElement(parentElement, element);
102 break;
103 }
104 }
105
106 /// <summary>
107 /// Processes an attribute for the Compiler.
108 /// </summary>
109 /// <param name="sourceLineNumbers">Source line number for the parent element.</param>
110 /// <param name="parentElement">Parent element of element to process.</param>
111 /// <param name="attribute">Attribute to process.</param>
112 /// <param name="context">Extra information about the context in which this element is being parsed.</param>
113 public override void ParseAttribute(Intermediate intermediate, IntermediateSection section, XElement parentElement, XAttribute attribute, IDictionary<string, string> context)
114 {
115 var sourceLineNumbers = this.ParseHelper.GetSourceLineNumbers(parentElement);
116 WixMbaPrereqInformationSymbol prereqInfo;
117
118 switch (parentElement.Name.LocalName)
119 {
120 case "ExePackage":
121 case "MsiPackage":
122 case "MspPackage":
123 case "MsuPackage":
124 string packageId;
125 if (!context.TryGetValue("PackageId", out packageId) || String.IsNullOrEmpty(packageId))
126 {
127 this.Messaging.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, parentElement.Name.LocalName, "Id", attribute.Name.LocalName));
128 }
129 else
130 {
131 switch (attribute.Name.LocalName)
132 {
133 case "DisplayInternalUICondition":
134 switch (parentElement.Name.LocalName)
135 {
136 case "MsiPackage":
137 case "MspPackage":
138 var displayInternalUICondition = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attribute);
139 section.AddSymbol(new WixBalPackageInfoSymbol(sourceLineNumbers, new Identifier(AccessModifier.Global, packageId))
140 {
141 PackageId = packageId,
142 DisplayInternalUICondition = displayInternalUICondition,
143 });
144 break;
145 default:
146 this.ParseHelper.UnexpectedAttribute(parentElement, attribute);
147 break;
148 }
149 break;
150 case "PrereqLicenseFile":
151
152 if (!this.prereqInfoSymbolsByPackageId.TryGetValue(packageId, out prereqInfo))
153 {
154 // at the time the extension attribute is parsed, the compiler might not yet have
155 // parsed the PrereqPackage attribute, so we need to get it directly from the parent element.
156 var prereqPackage = parentElement.Attribute(this.Namespace + "PrereqPackage");
157
158 if (null != prereqPackage && YesNoType.Yes == this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, prereqPackage))
159 {
160 prereqInfo = section.AddSymbol(new WixMbaPrereqInformationSymbol(sourceLineNumbers)
161 {
162 PackageId = packageId,
163 });
164
165 this.prereqInfoSymbolsByPackageId.Add(packageId, prereqInfo);
166 }
167 else
168 {
169 this.Messaging.Write(BalErrors.AttributeRequiresPrereqPackage(sourceLineNumbers, parentElement.Name.LocalName, "PrereqLicenseFile"));
170 break;
171 }
172 }
173
174 if (null != prereqInfo.LicenseUrl)
175 {
176 this.Messaging.Write(ErrorMessages.IllegalAttributeWithOtherAttribute(sourceLineNumbers, parentElement.Name.LocalName, "PrereqLicenseFile", "PrereqLicenseUrl"));
177 }
178 else
179 {
180 prereqInfo.LicenseFile = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attribute);
181 }
182 break;
183 case "PrereqLicenseUrl":
184
185 if (!this.prereqInfoSymbolsByPackageId.TryGetValue(packageId, out prereqInfo))
186 {
187 // at the time the extension attribute is parsed, the compiler might not yet have
188 // parsed the PrereqPackage attribute, so we need to get it directly from the parent element.
189 var prereqPackage = parentElement.Attribute(this.Namespace + "PrereqPackage");
190
191 if (null != prereqPackage && YesNoType.Yes == this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, prereqPackage))
192 {
193 prereqInfo = section.AddSymbol(new WixMbaPrereqInformationSymbol(sourceLineNumbers)
194 {
195 PackageId = packageId,
196 });
197
198 this.prereqInfoSymbolsByPackageId.Add(packageId, prereqInfo);
199 }
200 else
201 {
202 this.Messaging.Write(BalErrors.AttributeRequiresPrereqPackage(sourceLineNumbers, parentElement.Name.LocalName, "PrereqLicenseUrl"));
203 break;
204 }
205 }
206
207 if (null != prereqInfo.LicenseFile)
208 {
209 this.Messaging.Write(ErrorMessages.IllegalAttributeWithOtherAttribute(sourceLineNumbers, parentElement.Name.LocalName, "PrereqLicenseUrl", "PrereqLicenseFile"));
210 }
211 else
212 {
213 prereqInfo.LicenseUrl = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attribute);
214 }
215 break;
216 case "PrereqPackage":
217 if (YesNoType.Yes == this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attribute))
218 {
219 if (!this.prereqInfoSymbolsByPackageId.TryGetValue(packageId, out prereqInfo))
220 {
221 prereqInfo = section.AddSymbol(new WixMbaPrereqInformationSymbol(sourceLineNumbers)
222 {
223 PackageId = packageId,
224 });
225
226 this.prereqInfoSymbolsByPackageId.Add(packageId, prereqInfo);
227 }
228 }
229 break;
230 default:
231 this.ParseHelper.UnexpectedAttribute(parentElement, attribute);
232 break;
233 }
234 }
235 break;
236 case "Payload":
237 string payloadId;
238 if (!context.TryGetValue("Id", out payloadId) || String.IsNullOrEmpty(payloadId))
239 {
240 this.Messaging.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, parentElement.Name.LocalName, "Id", attribute.Name.LocalName));
241 }
242 else
243 {
244 switch (attribute.Name.LocalName)
245 {
246 case "BAFactoryAssembly":
247 if (YesNoType.Yes == this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attribute))
248 {
249 // There can only be one.
250 var id = new Identifier(AccessModifier.Global, "TheBAFactoryAssembly");
251 section.AddSymbol(new WixBalBAFactoryAssemblySymbol(sourceLineNumbers, id)
252 {
253 PayloadId = payloadId,
254 });
255 }
256 break;
257 case "BAFunctions":
258 if (YesNoType.Yes == this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attribute))
259 {
260 section.AddSymbol(new WixBalBAFunctionsSymbol(sourceLineNumbers)
261 {
262 PayloadId = payloadId,
263 });
264 }
265 break;
266 default:
267 this.ParseHelper.UnexpectedAttribute(parentElement, attribute);
268 break;
269 }
270 }
271 break;
272 case "Variable":
273 // at the time the extension attribute is parsed, the compiler might not yet have
274 // parsed the Name attribute, so we need to get it directly from the parent element.
275 var variableName = parentElement.Attribute("Name");
276 if (null == variableName)
277 {
278 this.Messaging.Write(ErrorMessages.ExpectedParentWithAttribute(sourceLineNumbers, "Variable", "Overridable", "Name"));
279 }
280 else
281 {
282 switch (attribute.Name.LocalName)
283 {
284 case "Overridable":
285 if (YesNoType.Yes == this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attribute))
286 {
287 section.AddSymbol(new WixStdbaOverridableVariableSymbol(sourceLineNumbers)
288 {
289 Name = variableName.Value,
290 });
291 }
292 break;
293 default:
294 this.ParseHelper.UnexpectedAttribute(parentElement, attribute);
295 break;
296 }
297 }
298 break;
299 }
300 }
301
302 /// <summary>
303 /// Parses a Condition element for Bundles.
304 /// </summary>
305 /// <param name="node">The element to parse.</param>
306 private void ParseConditionElement(Intermediate intermediate, IntermediateSection section, XElement node)
307 {
308 var sourceLineNumbers = this.ParseHelper.GetSourceLineNumbers(node);
309 string condition = null;
310 string message = null;
311
312 foreach (var attrib in node.Attributes())
313 {
314 if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || this.Namespace == attrib.Name.Namespace)
315 {
316 switch (attrib.Name.LocalName)
317 {
318 case "Message":
319 message = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
320 break;
321 case "Condition":
322 condition = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
323 break;
324 default:
325 this.ParseHelper.UnexpectedAttribute(node, attrib);
326 break;
327 }
328 }
329 else
330 {
331 this.ParseHelper.ParseExtensionAttribute(this.Context.Extensions, intermediate, section, node, attrib);
332 }
333 }
334
335 this.ParseHelper.ParseForExtensionElements(this.Context.Extensions, intermediate, section, node);
336
337 // Error check the values.
338 if (String.IsNullOrEmpty(condition))
339 {
340 this.Messaging.Write(ErrorMessages.ConditionExpected(sourceLineNumbers, node.Name.LocalName));
341 }
342
343 if (null == message)
344 {
345 this.Messaging.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, node.Name.LocalName, "Message"));
346 }
347
348 if (!this.Messaging.EncounteredError)
349 {
350 section.AddSymbol(new WixBalConditionSymbol(sourceLineNumbers)
351 {
352 Condition = condition,
353 Message = message,
354 });
355 }
356 }
357
358 /// <summary>
359 /// Parses a Condition element for Bundles.
360 /// </summary>
361 /// <param name="node">The element to parse.</param>
362 private void ParseMbaPrereqInfoElement(Intermediate intermediate, IntermediateSection section, XElement node)
363 {
364 var sourceLineNumbers = this.ParseHelper.GetSourceLineNumbers(node);
365 string packageId = null;
366 string licenseFile = null;
367 string licenseUrl = null;
368
369 foreach (var attrib in node.Attributes())
370 {
371 if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || this.Namespace == attrib.Name.Namespace)
372 {
373 switch (attrib.Name.LocalName)
374 {
375 case "LicenseFile":
376 licenseFile = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
377 break;
378 case "LicenseUrl":
379 licenseUrl = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
380 break;
381 case "PackageId":
382 packageId = this.ParseHelper.GetAttributeIdentifierValue(sourceLineNumbers, attrib);
383 break;
384 default:
385 this.ParseHelper.UnexpectedAttribute(node, attrib);
386 break;
387 }
388 }
389 else
390 {
391 this.ParseHelper.ParseExtensionAttribute(this.Context.Extensions, intermediate, section, node, attrib);
392 }
393 }
394
395 this.ParseHelper.ParseForExtensionElements(this.Context.Extensions, intermediate, section, node);
396
397 if (null == packageId)
398 {
399 this.Messaging.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, node.Name.LocalName, "PackageId"));
400 }
401
402 if (null == licenseFile && null == licenseUrl ||
403 null != licenseFile && null != licenseUrl)
404 {
405 this.Messaging.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, node.Name.LocalName, "LicenseFile", "LicenseUrl", true));
406 }
407
408 if (!this.Messaging.EncounteredError)
409 {
410 section.AddSymbol(new WixMbaPrereqInformationSymbol(sourceLineNumbers)
411 {
412 PackageId = packageId,
413 LicenseFile = licenseFile,
414 LicenseUrl = licenseUrl,
415 });
416 this.ParseHelper.CreateSimpleReference(section, sourceLineNumbers, SymbolDefinitions.WixBundlePackage, packageId);
417 }
418 }
419
420 /// <summary>
421 /// Parses a WixStandardBootstrapperApplication element for Bundles.
422 /// </summary>
423 /// <param name="node">The element to parse.</param>
424 private void ParseWixStandardBootstrapperApplicationElement(Intermediate intermediate, IntermediateSection section, XElement node)
425 {
426 var sourceLineNumbers = this.ParseHelper.GetSourceLineNumbers(node);
427 string launchTarget = null;
428 string launchTargetElevatedId = null;
429 string launchArguments = null;
430 var launchHidden = YesNoType.NotSet;
431 string launchWorkingDir = null;
432 string licenseFile = null;
433 string licenseUrl = null;
434 string logoFile = null;
435 string logoSideFile = null;
436 WixStandardBootstrapperApplicationTheme? theme = null;
437 string themeFile = null;
438 string localizationFile = null;
439 var suppressOptionsUI = YesNoType.NotSet;
440 var suppressDowngradeFailure = YesNoType.NotSet;
441 var suppressRepair = YesNoType.NotSet;
442 var showVersion = YesNoType.NotSet;
443 var supportCacheOnly = YesNoType.NotSet;
444
445 foreach (var attrib in node.Attributes())
446 {
447 if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || this.Namespace == attrib.Name.Namespace)
448 {
449 switch (attrib.Name.LocalName)
450 {
451 case "LaunchTarget":
452 launchTarget = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
453 break;
454 case "LaunchTargetElevatedId":
455 launchTargetElevatedId = this.ParseHelper.GetAttributeIdentifierValue(sourceLineNumbers, attrib);
456 break;
457 case "LaunchArguments":
458 launchArguments = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
459 break;
460 case "LaunchHidden":
461 launchHidden = this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib);
462 break;
463 case "LaunchWorkingFolder":
464 launchWorkingDir = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
465 break;
466 case "LicenseFile":
467 licenseFile = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
468 break;
469 case "LicenseUrl":
470 licenseUrl = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib, EmptyRule.CanBeEmpty);
471 break;
472 case "LogoFile":
473 logoFile = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
474 break;
475 case "LogoSideFile":
476 logoSideFile = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
477 break;
478 case "ThemeFile":
479 themeFile = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
480 break;
481 case "LocalizationFile":
482 localizationFile = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
483 break;
484 case "SuppressOptionsUI":
485 suppressOptionsUI = this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib);
486 break;
487 case "SuppressDowngradeFailure":
488 suppressDowngradeFailure = this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib);
489 break;
490 case "SuppressRepair":
491 suppressRepair = this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib);
492 break;
493 case "ShowVersion":
494 showVersion = this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib);
495 break;
496 case "SupportCacheOnly":
497 supportCacheOnly = this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib);
498 break;
499 case "Theme":
500 var themeValue = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
501 switch (themeValue)
502 {
503 case "hyperlinkLargeLicense":
504 theme = WixStandardBootstrapperApplicationTheme.HyperlinkLargeLicense;
505 break;
506 case "hyperlinkLicense":
507 theme = WixStandardBootstrapperApplicationTheme.HyperlinkLicense;
508 break;
509 case "hyperlinkSidebarLicense":
510 theme = WixStandardBootstrapperApplicationTheme.HyperlinkSidebarLicense;
511 break;
512 case "none":
513 theme = WixStandardBootstrapperApplicationTheme.None;
514 break;
515 case "rtfLargeLicense":
516 theme = WixStandardBootstrapperApplicationTheme.RtfLargeLicense;
517 break;
518 case "rtfLicense":
519 theme = WixStandardBootstrapperApplicationTheme.RtfLicense;
520 break;
521 default:
522 this.Messaging.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, node.Name.LocalName, "Theme", themeValue, "hyperlinkLargeLicense", "hyperlinkLicense", "hyperlinkSidebarLicense", "none", "rtfLargeLicense", "rtfLicense"));
523 theme = WixStandardBootstrapperApplicationTheme.Unknown; // set a value to prevent expected attribute error below.
524 break;
525 }
526 break;
527 default:
528 this.ParseHelper.UnexpectedAttribute(node, attrib);
529 break;
530 }
531 }
532 else
533 {
534 this.ParseHelper.ParseExtensionAttribute(this.Context.Extensions, intermediate, section, node, attrib);
535 }
536 }
537
538 this.ParseHelper.ParseForExtensionElements(this.Context.Extensions, intermediate, section, node);
539
540 if (!theme.HasValue)
541 {
542 this.Messaging.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, node.Name.LocalName, "Theme"));
543 }
544
545 if (theme != WixStandardBootstrapperApplicationTheme.None && String.IsNullOrEmpty(licenseFile) && null == licenseUrl)
546 {
547 this.Messaging.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, node.Name.LocalName, "LicenseFile", "LicenseUrl", true));
548 }
549
550 if (!this.Messaging.EncounteredError)
551 {
552 if (!String.IsNullOrEmpty(launchTarget))
553 {
554 section.AddSymbol(new WixBundleVariableSymbol(sourceLineNumbers, new Identifier(AccessModifier.Global, "LaunchTarget"))
555 {
556 Value = launchTarget,
557 Type = WixBundleVariableType.Formatted,
558 });
559 }
560
561 if (!String.IsNullOrEmpty(launchTargetElevatedId))
562 {
563 section.AddSymbol(new WixBundleVariableSymbol(sourceLineNumbers, new Identifier(AccessModifier.Global, "LaunchTargetElevatedId"))
564 {
565 Value = launchTargetElevatedId,
566 Type = WixBundleVariableType.Formatted,
567 });
568 }
569
570 if (!String.IsNullOrEmpty(launchArguments))
571 {
572 section.AddSymbol(new WixBundleVariableSymbol(sourceLineNumbers, new Identifier(AccessModifier.Global, "LaunchArguments"))
573 {
574 Value = launchArguments,
575 Type = WixBundleVariableType.Formatted,
576 });
577 }
578
579 if (YesNoType.Yes == launchHidden)
580 {
581 section.AddSymbol(new WixBundleVariableSymbol(sourceLineNumbers, new Identifier(AccessModifier.Global, "LaunchHidden"))
582 {
583 Value = "yes",
584 Type = WixBundleVariableType.Formatted,
585 });
586 }
587
588
589 if (!String.IsNullOrEmpty(launchWorkingDir))
590 {
591 section.AddSymbol(new WixBundleVariableSymbol(sourceLineNumbers, new Identifier(AccessModifier.Global, "LaunchWorkingFolder"))
592 {
593 Value = launchWorkingDir,
594 Type = WixBundleVariableType.Formatted,
595 });
596 }
597
598 if (!String.IsNullOrEmpty(licenseFile))
599 {
600 section.AddSymbol(new WixVariableSymbol(sourceLineNumbers, new Identifier(AccessModifier.Global, "WixStdbaLicenseRtf"))
601 {
602 Value = licenseFile,
603 });
604 }
605
606 if (null != licenseUrl)
607 {
608 section.AddSymbol(new WixVariableSymbol(sourceLineNumbers, new Identifier(AccessModifier.Global, "WixStdbaLicenseUrl"))
609 {
610 Value = licenseUrl,
611 });
612 }
613
614 if (!String.IsNullOrEmpty(logoFile))
615 {
616 section.AddSymbol(new WixVariableSymbol(sourceLineNumbers, new Identifier(AccessModifier.Global, "WixStdbaLogo"))
617 {
618 Value = logoFile,
619 });
620 }
621
622 if (!String.IsNullOrEmpty(logoSideFile))
623 {
624 section.AddSymbol(new WixVariableSymbol(sourceLineNumbers, new Identifier(AccessModifier.Global, "WixStdbaLogoSide"))
625 {
626 Value = logoSideFile,
627 });
628 }
629
630 if (!String.IsNullOrEmpty(themeFile))
631 {
632 section.AddSymbol(new WixVariableSymbol(sourceLineNumbers, new Identifier(AccessModifier.Global, "WixStdbaThemeXml"))
633 {
634 Value = themeFile,
635 });
636 }
637
638 if (!String.IsNullOrEmpty(localizationFile))
639 {
640 section.AddSymbol(new WixVariableSymbol(sourceLineNumbers, new Identifier(AccessModifier.Global, "WixStdbaThemeWxl"))
641 {
642 Value = localizationFile,
643 });
644 }
645
646 if (YesNoType.Yes == suppressOptionsUI || YesNoType.Yes == suppressDowngradeFailure || YesNoType.Yes == suppressRepair || YesNoType.Yes == showVersion || YesNoType.Yes == supportCacheOnly)
647 {
648 var symbol = section.AddSymbol(new WixStdbaOptionsSymbol(sourceLineNumbers));
649 if (YesNoType.Yes == suppressOptionsUI)
650 {
651 symbol.SuppressOptionsUI = 1;
652 }
653
654 if (YesNoType.Yes == suppressDowngradeFailure)
655 {
656 symbol.SuppressDowngradeFailure = 1;
657 }
658
659 if (YesNoType.Yes == suppressRepair)
660 {
661 symbol.SuppressRepair = 1;
662 }
663
664 if (YesNoType.Yes == showVersion)
665 {
666 symbol.ShowVersion = 1;
667 }
668
669 if (YesNoType.Yes == supportCacheOnly)
670 {
671 symbol.SupportCacheOnly = 1;
672 }
673 }
674
675 var baId = "WixStandardBootstrapperApplication";
676 switch (theme)
677 {
678 case WixStandardBootstrapperApplicationTheme.HyperlinkLargeLicense:
679 baId = "WixStandardBootstrapperApplication.HyperlinkLargeLicense";
680 break;
681 case WixStandardBootstrapperApplicationTheme.HyperlinkLicense:
682 baId = "WixStandardBootstrapperApplication.HyperlinkLicense";
683 break;
684 case WixStandardBootstrapperApplicationTheme.HyperlinkSidebarLicense:
685 baId = "WixStandardBootstrapperApplication.HyperlinkSidebarLicense";
686 break;
687 case WixStandardBootstrapperApplicationTheme.RtfLargeLicense:
688 baId = "WixStandardBootstrapperApplication.RtfLargeLicense";
689 break;
690 case WixStandardBootstrapperApplicationTheme.RtfLicense:
691 baId = "WixStandardBootstrapperApplication.RtfLicense";
692 break;
693 }
694
695 this.CreateBARef(section, sourceLineNumbers, node, baId);
696 }
697 }
698
699 /// <summary>
700 /// Parses a WixManagedBootstrapperApplicationHost element for Bundles.
701 /// </summary>
702 /// <param name="node">The element to parse.</param>
703 private void ParseWixManagedBootstrapperApplicationHostElement(Intermediate intermediate, IntermediateSection section, XElement node)
704 {
705 var sourceLineNumbers = this.ParseHelper.GetSourceLineNumbers(node);
706 string logoFile = null;
707 string themeFile = null;
708 string localizationFile = null;
709 WixManagedBootstrapperApplicationHostTheme? theme = null;
710
711 foreach (var attrib in node.Attributes())
712 {
713 if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || this.Namespace == attrib.Name.Namespace)
714 {
715 switch (attrib.Name.LocalName)
716 {
717 case "LogoFile":
718 logoFile = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
719 break;
720 case "ThemeFile":
721 themeFile = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
722 break;
723 case "LocalizationFile":
724 localizationFile = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
725 break;
726 case "Theme":
727 var themeValue = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
728 switch (themeValue)
729 {
730 case "none":
731 theme = WixManagedBootstrapperApplicationHostTheme.None;
732 break;
733 case "standard":
734 theme = WixManagedBootstrapperApplicationHostTheme.Standard;
735 break;
736 default:
737 this.Messaging.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, node.Name.LocalName, "Theme", themeValue, "none", "standard"));
738 theme = WixManagedBootstrapperApplicationHostTheme.Unknown;
739 break;
740 }
741 break;
742 default:
743 this.ParseHelper.UnexpectedAttribute(node, attrib);
744 break;
745 }
746 }
747 else
748 {
749 this.ParseHelper.ParseExtensionAttribute(this.Context.Extensions, intermediate, section, node, attrib);
750 }
751 }
752
753 if (!theme.HasValue)
754 {
755 theme = WixManagedBootstrapperApplicationHostTheme.Standard;
756 }
757
758 this.ParseHelper.ParseForExtensionElements(this.Context.Extensions, intermediate, section, node);
759
760 if (!this.Messaging.EncounteredError)
761 {
762 if (!String.IsNullOrEmpty(logoFile))
763 {
764 section.AddSymbol(new WixVariableSymbol(sourceLineNumbers, new Identifier(AccessModifier.Global, "PreqbaLogo"))
765 {
766 Value = logoFile,
767 });
768 }
769
770 if (!String.IsNullOrEmpty(themeFile))
771 {
772 section.AddSymbol(new WixVariableSymbol(sourceLineNumbers, new Identifier(AccessModifier.Global, "PreqbaThemeXml"))
773 {
774 Value = themeFile,
775 });
776 }
777
778 if (!String.IsNullOrEmpty(localizationFile))
779 {
780 section.AddSymbol(new WixVariableSymbol(sourceLineNumbers, new Identifier(AccessModifier.Global, "PreqbaThemeWxl"))
781 {
782 Value = localizationFile,
783 });
784 }
785
786 var baId = "WixManagedBootstrapperApplicationHost";
787 switch (theme)
788 {
789 case WixManagedBootstrapperApplicationHostTheme.Standard:
790 baId = "WixManagedBootstrapperApplicationHost.Standard";
791 break;
792 }
793
794 this.CreateBARef(section, sourceLineNumbers, node, baId);
795 }
796 }
797
798 /// <summary>
799 /// Parses a WixDotNetCoreBootstrapperApplication element for Bundles.
800 /// </summary>
801 /// <param name="node">The element to parse.</param>
802 private void ParseWixDotNetCoreBootstrapperApplicationHostElement(Intermediate intermediate, IntermediateSection section, XElement node)
803 {
804 var sourceLineNumbers = this.ParseHelper.GetSourceLineNumbers(node);
805 string logoFile = null;
806 string themeFile = null;
807 string localizationFile = null;
808 var selfContainedDeployment = YesNoType.NotSet;
809 WixDotNetCoreBootstrapperApplicationHostTheme? theme = null;
810
811 foreach (var attrib in node.Attributes())
812 {
813 if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || this.Namespace == attrib.Name.Namespace)
814 {
815 switch (attrib.Name.LocalName)
816 {
817 case "LogoFile":
818 logoFile = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
819 break;
820 case "ThemeFile":
821 themeFile = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
822 break;
823 case "LocalizationFile":
824 localizationFile = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
825 break;
826 case "SelfContainedDeployment":
827 selfContainedDeployment = this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib);
828 break;
829 case "Theme":
830 var themeValue = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
831 switch (themeValue)
832 {
833 case "none":
834 theme = WixDotNetCoreBootstrapperApplicationHostTheme.None;
835 break;
836 case "standard":
837 theme = WixDotNetCoreBootstrapperApplicationHostTheme.Standard;
838 break;
839 default:
840 this.Messaging.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, node.Name.LocalName, "Theme", themeValue, "none", "standard"));
841 theme = WixDotNetCoreBootstrapperApplicationHostTheme.Unknown;
842 break;
843 }
844 break;
845 default:
846 this.ParseHelper.UnexpectedAttribute(node, attrib);
847 break;
848 }
849 }
850 else
851 {
852 this.ParseHelper.ParseExtensionAttribute(this.Context.Extensions, intermediate, section, node, attrib);
853 }
854 }
855
856 if (!theme.HasValue)
857 {
858 theme = WixDotNetCoreBootstrapperApplicationHostTheme.Standard;
859 }
860
861 this.ParseHelper.ParseForExtensionElements(this.Context.Extensions, intermediate, section, node);
862
863 if (!this.Messaging.EncounteredError)
864 {
865 if (!String.IsNullOrEmpty(logoFile))
866 {
867 section.AddSymbol(new WixVariableSymbol(sourceLineNumbers, new Identifier(AccessModifier.Global, "DncPreqbaLogo"))
868 {
869 Value = logoFile,
870 });
871 }
872
873 if (!String.IsNullOrEmpty(themeFile))
874 {
875 section.AddSymbol(new WixVariableSymbol(sourceLineNumbers, new Identifier(AccessModifier.Global, "DncPreqbaThemeXml"))
876 {
877 Value = themeFile,
878 });
879 }
880
881 if (!String.IsNullOrEmpty(localizationFile))
882 {
883 section.AddSymbol(new WixVariableSymbol(sourceLineNumbers, new Identifier(AccessModifier.Global, "DncPreqbaThemeWxl"))
884 {
885 Value = localizationFile,
886 });
887 }
888
889 if (YesNoType.Yes == selfContainedDeployment)
890 {
891 section.AddSymbol(new WixDncOptionsSymbol(sourceLineNumbers)
892 {
893 SelfContainedDeployment = 1,
894 });
895 }
896
897 var baId = "WixDotNetCoreBootstrapperApplicationHost";
898 switch (theme)
899 {
900 case WixDotNetCoreBootstrapperApplicationHostTheme.Standard:
901 baId = "WixDotNetCoreBootstrapperApplicationHost.Standard";
902 break;
903 }
904
905 this.CreateBARef(section, sourceLineNumbers, node, baId);
906 }
907 }
908
909 private void CreateBARef(IntermediateSection section, SourceLineNumber sourceLineNumbers, XElement node, string name)
910 {
911 var id = this.ParseHelper.CreateIdentifierValueFromPlatform(name, this.Context.Platform, BurnPlatforms.X86 | BurnPlatforms.X64 | BurnPlatforms.ARM64);
912 if (id == null)
913 {
914 this.Messaging.Write(ErrorMessages.UnsupportedPlatformForElement(sourceLineNumbers, this.Context.Platform.ToString(), node.Name.LocalName));
915 }
916
917 if (!this.Messaging.EncounteredError)
918 {
919 this.ParseHelper.CreateSimpleReference(section, sourceLineNumbers, SymbolDefinitions.WixBootstrapperApplication, id);
920 }
921 }
922 }
923}
diff --git a/src/ext/Bal/wixext/BalErrors.cs b/src/ext/Bal/wixext/BalErrors.cs
new file mode 100644
index 00000000..bc0186c1
--- /dev/null
+++ b/src/ext/Bal/wixext/BalErrors.cs
@@ -0,0 +1,61 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Bal
4{
5 using System;
6 using System.Resources;
7 using WixToolset.Data;
8
9 public static class BalErrors
10 {
11 public static Message AttributeRequiresPrereqPackage(SourceLineNumber sourceLineNumbers, string elementName, string attributeName)
12 {
13 return Message(sourceLineNumbers, Ids.AttributeRequiresPrereqPackage, "When the {0}/@{1} attribute is specified, the {0}/@PrereqPackage attribute must be set to \"yes\".", elementName, attributeName);
14 }
15
16 public static Message BAFunctionsPayloadRequiredInUXContainer(SourceLineNumber sourceLineNumbers)
17 {
18 return Message(sourceLineNumbers, Ids.BAFunctionsPayloadRequiredInUXContainer, "The BAFunctions DLL Payload element must be located inside the BootstrapperApplication container.");
19 }
20
21 public static Message MissingDNCPrereq()
22 {
23 return Message(null, Ids.MissingDNCPrereq, "There must be at least one PrereqPackage when using the DotNetCoreBootstrapperApplicationHost with SelfContainedDeployment set to \"no\".");
24 }
25
26 public static Message MissingMBAPrereq()
27 {
28 return Message(null, Ids.MissingMBAPrereq, "There must be at least one PrereqPackage when using the ManagedBootstrapperApplicationHost.\nThis is typically done by using the WixNetFxExtension and referencing one of the NetFxAsPrereq package groups.");
29 }
30
31 public static Message MultipleBAFunctions(SourceLineNumber sourceLineNumbers)
32 {
33 return Message(sourceLineNumbers, Ids.MultipleBAFunctions, "WixStandardBootstrapperApplication doesn't support multiple BAFunctions DLLs.");
34 }
35
36 public static Message MultiplePrereqLicenses(SourceLineNumber sourceLineNumbers)
37 {
38 return Message(sourceLineNumbers, Ids.MultiplePrereqLicenses, "There may only be one package in the bundle that has either the PrereqLicenseFile attribute or the PrereqLicenseUrl attribute.");
39 }
40
41 private static Message Message(SourceLineNumber sourceLineNumber, Ids id, string format, params object[] args)
42 {
43 return new Message(sourceLineNumber, MessageLevel.Error, (int)id, format, args);
44 }
45
46 private static Message Message(SourceLineNumber sourceLineNumber, Ids id, ResourceManager resourceManager, string resourceName, params object[] args)
47 {
48 return new Message(sourceLineNumber, MessageLevel.Error, (int)id, resourceManager, resourceName, args);
49 }
50
51 public enum Ids
52 {
53 AttributeRequiresPrereqPackage = 6801,
54 MissingMBAPrereq = 6802,
55 MultiplePrereqLicenses = 6803,
56 MultipleBAFunctions = 6804,
57 BAFunctionsPayloadRequiredInUXContainer = 6805,
58 MissingDNCPrereq = 6806,
59 }
60 }
61}
diff --git a/src/ext/Bal/wixext/BalExtensionData.cs b/src/ext/Bal/wixext/BalExtensionData.cs
new file mode 100644
index 00000000..55daf005
--- /dev/null
+++ b/src/ext/Bal/wixext/BalExtensionData.cs
@@ -0,0 +1,30 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Bal
4{
5 using WixToolset.Data;
6 using WixToolset.Extensibility;
7
8 /// <summary>
9 /// The WiX Toolset Bal Extension.
10 /// </summary>
11 public sealed class BalExtensionData : BaseExtensionData
12 {
13 /// <summary>
14 /// Gets the default culture.
15 /// </summary>
16 /// <value>The default culture.</value>
17 public override string DefaultCulture => "en-US";
18
19 public override bool TryGetSymbolDefinitionByName(string name, out IntermediateSymbolDefinition symbolDefinition)
20 {
21 symbolDefinition = BalSymbolDefinitions.ByName(name);
22 return symbolDefinition != null;
23 }
24
25 public override Intermediate GetLibrary(ISymbolDefinitionCreator symbolDefinitions)
26 {
27 return Intermediate.Load(typeof(BalExtensionData).Assembly, "WixToolset.Bal.bal.wixlib", symbolDefinitions);
28 }
29 }
30}
diff --git a/src/ext/Bal/wixext/BalExtensionFactory.cs b/src/ext/Bal/wixext/BalExtensionFactory.cs
new file mode 100644
index 00000000..0bfb6c5f
--- /dev/null
+++ b/src/ext/Bal/wixext/BalExtensionFactory.cs
@@ -0,0 +1,18 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Bal
4{
5 using System;
6 using System.Collections.Generic;
7 using WixToolset.Extensibility;
8
9 public class BalExtensionFactory : BaseExtensionFactory
10 {
11 protected override IReadOnlyCollection<Type> ExtensionTypes => new[]
12 {
13 typeof(BalCompiler),
14 typeof(BalExtensionData),
15 typeof(BalBurnBackendExtension),
16 };
17 }
18}
diff --git a/src/ext/Bal/wixext/BalWarnings.cs b/src/ext/Bal/wixext/BalWarnings.cs
new file mode 100644
index 00000000..18b25062
--- /dev/null
+++ b/src/ext/Bal/wixext/BalWarnings.cs
@@ -0,0 +1,31 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Bal
4{
5 using System;
6 using System.Resources;
7 using WixToolset.Data;
8
9 public static class BalWarnings
10 {
11 public static Message UnmarkedBAFunctionsDLL(SourceLineNumber sourceLineNumbers)
12 {
13 return Message(sourceLineNumbers, Ids.UnmarkedBAFunctionsDLL, "WixStandardBootstrapperApplication doesn't automatically load BAFunctions.dll. Use the bal:BAFunctions attribute to indicate that it should be loaded.");
14 }
15
16 private static Message Message(SourceLineNumber sourceLineNumber, Ids id, string format, params object[] args)
17 {
18 return new Message(sourceLineNumber, MessageLevel.Warning, (int)id, format, args);
19 }
20
21 private static Message Message(SourceLineNumber sourceLineNumber, Ids id, ResourceManager resourceManager, string resourceName, params object[] args)
22 {
23 return new Message(sourceLineNumber, MessageLevel.Warning, (int)id, resourceManager, resourceName, args);
24 }
25
26 public enum Ids
27 {
28 UnmarkedBAFunctionsDLL = 6501,
29 }
30 }
31}
diff --git a/src/ext/Bal/wixext/Symbols/BalSymbolDefinitions.cs b/src/ext/Bal/wixext/Symbols/BalSymbolDefinitions.cs
new file mode 100644
index 00000000..90865621
--- /dev/null
+++ b/src/ext/Bal/wixext/Symbols/BalSymbolDefinitions.cs
@@ -0,0 +1,80 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Bal
4{
5 using System;
6 using WixToolset.Data;
7 using WixToolset.Data.Burn;
8
9 public enum BalSymbolDefinitionType
10 {
11 WixBalBAFactoryAssembly,
12 WixBalBAFunctions,
13 WixBalCondition,
14 WixBalPackageInfo,
15 WixDncOptions,
16 WixMbaPrereqInformation,
17 WixStdbaOptions,
18 WixStdbaOverridableVariable,
19 }
20
21 public static partial class BalSymbolDefinitions
22 {
23 public static readonly Version Version = new Version("4.0.0");
24
25 public static IntermediateSymbolDefinition ByName(string name)
26 {
27 if (!Enum.TryParse(name, out BalSymbolDefinitionType type))
28 {
29 return null;
30 }
31
32 return ByType(type);
33 }
34
35 public static IntermediateSymbolDefinition ByType(BalSymbolDefinitionType type)
36 {
37 switch (type)
38 {
39 case BalSymbolDefinitionType.WixBalBAFactoryAssembly:
40 return BalSymbolDefinitions.WixBalBAFactoryAssembly;
41
42 case BalSymbolDefinitionType.WixBalBAFunctions:
43 return BalSymbolDefinitions.WixBalBAFunctions;
44
45 case BalSymbolDefinitionType.WixBalCondition:
46 return BalSymbolDefinitions.WixBalCondition;
47
48 case BalSymbolDefinitionType.WixBalPackageInfo:
49 return BalSymbolDefinitions.WixBalPackageInfo;
50
51 case BalSymbolDefinitionType.WixDncOptions:
52 return BalSymbolDefinitions.WixDncOptions;
53
54 case BalSymbolDefinitionType.WixMbaPrereqInformation:
55 return BalSymbolDefinitions.WixMbaPrereqInformation;
56
57 case BalSymbolDefinitionType.WixStdbaOptions:
58 return BalSymbolDefinitions.WixStdbaOptions;
59
60 case BalSymbolDefinitionType.WixStdbaOverridableVariable:
61 return BalSymbolDefinitions.WixStdbaOverridableVariable;
62
63 default:
64 throw new ArgumentOutOfRangeException(nameof(type));
65 }
66 }
67
68 static BalSymbolDefinitions()
69 {
70 WixBalBAFactoryAssembly.AddTag(BurnConstants.BootstrapperApplicationDataSymbolDefinitionTag);
71 WixBalBAFunctions.AddTag(BurnConstants.BootstrapperApplicationDataSymbolDefinitionTag);
72 WixBalCondition.AddTag(BurnConstants.BootstrapperApplicationDataSymbolDefinitionTag);
73 WixBalPackageInfo.AddTag(BurnConstants.BootstrapperApplicationDataSymbolDefinitionTag);
74 WixDncOptions.AddTag(BurnConstants.BootstrapperApplicationDataSymbolDefinitionTag);
75 WixMbaPrereqInformation.AddTag(BurnConstants.BootstrapperApplicationDataSymbolDefinitionTag);
76 WixStdbaOptions.AddTag(BurnConstants.BootstrapperApplicationDataSymbolDefinitionTag);
77 WixStdbaOverridableVariable.AddTag(BurnConstants.BootstrapperApplicationDataSymbolDefinitionTag);
78 }
79 }
80}
diff --git a/src/ext/Bal/wixext/Symbols/WixBalBAFactoryAssemblySymbol.cs b/src/ext/Bal/wixext/Symbols/WixBalBAFactoryAssemblySymbol.cs
new file mode 100644
index 00000000..52042e4c
--- /dev/null
+++ b/src/ext/Bal/wixext/Symbols/WixBalBAFactoryAssemblySymbol.cs
@@ -0,0 +1,55 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Bal
4{
5 using WixToolset.Data;
6 using WixToolset.Bal.Symbols;
7
8 public static partial class BalSymbolDefinitions
9 {
10 public static readonly IntermediateSymbolDefinition WixBalBAFactoryAssembly = new IntermediateSymbolDefinition(
11 BalSymbolDefinitionType.WixBalBAFactoryAssembly.ToString(),
12 new[]
13 {
14 new IntermediateFieldDefinition(nameof(WixBalBAFactorySymbolFields.PayloadId), IntermediateFieldType.String),
15 new IntermediateFieldDefinition(nameof(WixBalBAFactorySymbolFields.FilePath), IntermediateFieldType.String),
16 },
17 typeof(WixBalBAFactoryAssemblySymbol));
18 }
19}
20
21namespace WixToolset.Bal.Symbols
22{
23 using WixToolset.Data;
24
25 public enum WixBalBAFactorySymbolFields
26 {
27 PayloadId,
28 FilePath,
29 }
30
31 public class WixBalBAFactoryAssemblySymbol : IntermediateSymbol
32 {
33 public WixBalBAFactoryAssemblySymbol() : base(BalSymbolDefinitions.WixBalBAFactoryAssembly, null, null)
34 {
35 }
36
37 public WixBalBAFactoryAssemblySymbol(SourceLineNumber sourceLineNumber, Identifier id = null) : base(BalSymbolDefinitions.WixBalBAFactoryAssembly, sourceLineNumber, id)
38 {
39 }
40
41 public IntermediateField this[WixBalBAFactorySymbolFields index] => this.Fields[(int)index];
42
43 public string PayloadId
44 {
45 get => this.Fields[(int)WixBalBAFactorySymbolFields.PayloadId].AsString();
46 set => this.Set((int)WixBalBAFactorySymbolFields.PayloadId, value);
47 }
48
49 public string FilePath
50 {
51 get => this.Fields[(int)WixBalBAFactorySymbolFields.FilePath].AsString();
52 set => this.Set((int)WixBalBAFactorySymbolFields.FilePath, value);
53 }
54 }
55} \ No newline at end of file
diff --git a/src/ext/Bal/wixext/Symbols/WixBalBAFunctionsSymbol.cs b/src/ext/Bal/wixext/Symbols/WixBalBAFunctionsSymbol.cs
new file mode 100644
index 00000000..19c7602d
--- /dev/null
+++ b/src/ext/Bal/wixext/Symbols/WixBalBAFunctionsSymbol.cs
@@ -0,0 +1,47 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Bal
4{
5 using WixToolset.Data;
6 using WixToolset.Bal.Symbols;
7
8 public static partial class BalSymbolDefinitions
9 {
10 public static readonly IntermediateSymbolDefinition WixBalBAFunctions = new IntermediateSymbolDefinition(
11 BalSymbolDefinitionType.WixBalBAFunctions.ToString(),
12 new[]
13 {
14 new IntermediateFieldDefinition(nameof(WixBalBAFunctionsSymbolFields.PayloadId), IntermediateFieldType.String),
15 },
16 typeof(WixBalBAFunctionsSymbol));
17 }
18}
19
20namespace WixToolset.Bal.Symbols
21{
22 using WixToolset.Data;
23
24 public enum WixBalBAFunctionsSymbolFields
25 {
26 PayloadId,
27 }
28
29 public class WixBalBAFunctionsSymbol : IntermediateSymbol
30 {
31 public WixBalBAFunctionsSymbol() : base(BalSymbolDefinitions.WixBalBAFunctions, null, null)
32 {
33 }
34
35 public WixBalBAFunctionsSymbol(SourceLineNumber sourceLineNumber, Identifier id = null) : base(BalSymbolDefinitions.WixBalBAFunctions, sourceLineNumber, id)
36 {
37 }
38
39 public IntermediateField this[WixBalBAFunctionsSymbolFields index] => this.Fields[(int)index];
40
41 public string PayloadId
42 {
43 get => this.Fields[(int)WixBalBAFunctionsSymbolFields.PayloadId].AsString();
44 set => this.Set((int)WixBalBAFunctionsSymbolFields.PayloadId, value);
45 }
46 }
47} \ No newline at end of file
diff --git a/src/ext/Bal/wixext/Symbols/WixBalConditionSymbol.cs b/src/ext/Bal/wixext/Symbols/WixBalConditionSymbol.cs
new file mode 100644
index 00000000..c2527fbc
--- /dev/null
+++ b/src/ext/Bal/wixext/Symbols/WixBalConditionSymbol.cs
@@ -0,0 +1,55 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Bal
4{
5 using WixToolset.Data;
6 using WixToolset.Bal.Symbols;
7
8 public static partial class BalSymbolDefinitions
9 {
10 public static readonly IntermediateSymbolDefinition WixBalCondition = new IntermediateSymbolDefinition(
11 BalSymbolDefinitionType.WixBalCondition.ToString(),
12 new[]
13 {
14 new IntermediateFieldDefinition(nameof(WixBalConditionSymbolFields.Condition), IntermediateFieldType.String),
15 new IntermediateFieldDefinition(nameof(WixBalConditionSymbolFields.Message), IntermediateFieldType.String),
16 },
17 typeof(WixBalConditionSymbol));
18 }
19}
20
21namespace WixToolset.Bal.Symbols
22{
23 using WixToolset.Data;
24
25 public enum WixBalConditionSymbolFields
26 {
27 Condition,
28 Message,
29 }
30
31 public class WixBalConditionSymbol : IntermediateSymbol
32 {
33 public WixBalConditionSymbol() : base(BalSymbolDefinitions.WixBalCondition, null, null)
34 {
35 }
36
37 public WixBalConditionSymbol(SourceLineNumber sourceLineNumber, Identifier id = null) : base(BalSymbolDefinitions.WixBalCondition, sourceLineNumber, id)
38 {
39 }
40
41 public IntermediateField this[WixBalConditionSymbolFields index] => this.Fields[(int)index];
42
43 public string Condition
44 {
45 get => this.Fields[(int)WixBalConditionSymbolFields.Condition].AsString();
46 set => this.Set((int)WixBalConditionSymbolFields.Condition, value);
47 }
48
49 public string Message
50 {
51 get => this.Fields[(int)WixBalConditionSymbolFields.Message].AsString();
52 set => this.Set((int)WixBalConditionSymbolFields.Message, value);
53 }
54 }
55} \ No newline at end of file
diff --git a/src/ext/Bal/wixext/Symbols/WixBalPackageInfoSymbol.cs b/src/ext/Bal/wixext/Symbols/WixBalPackageInfoSymbol.cs
new file mode 100644
index 00000000..b09cb191
--- /dev/null
+++ b/src/ext/Bal/wixext/Symbols/WixBalPackageInfoSymbol.cs
@@ -0,0 +1,55 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Bal
4{
5 using WixToolset.Data;
6 using WixToolset.Bal.Symbols;
7
8 public static partial class BalSymbolDefinitions
9 {
10 public static readonly IntermediateSymbolDefinition WixBalPackageInfo = new IntermediateSymbolDefinition(
11 BalSymbolDefinitionType.WixBalPackageInfo.ToString(),
12 new[]
13 {
14 new IntermediateFieldDefinition(nameof(WixBalPackageInfoSymbolFields.PackageId), IntermediateFieldType.String),
15 new IntermediateFieldDefinition(nameof(WixBalPackageInfoSymbolFields.DisplayInternalUICondition), IntermediateFieldType.String),
16 },
17 typeof(WixBalPackageInfoSymbol));
18 }
19}
20
21namespace WixToolset.Bal.Symbols
22{
23 using WixToolset.Data;
24
25 public enum WixBalPackageInfoSymbolFields
26 {
27 PackageId,
28 DisplayInternalUICondition,
29 }
30
31 public class WixBalPackageInfoSymbol : IntermediateSymbol
32 {
33 public WixBalPackageInfoSymbol() : base(BalSymbolDefinitions.WixBalPackageInfo, null, null)
34 {
35 }
36
37 public WixBalPackageInfoSymbol(SourceLineNumber sourceLineNumber, Identifier id = null) : base(BalSymbolDefinitions.WixBalPackageInfo, sourceLineNumber, id)
38 {
39 }
40
41 public IntermediateField this[WixBalPackageInfoSymbolFields index] => this.Fields[(int)index];
42
43 public string PackageId
44 {
45 get => this.Fields[(int)WixBalPackageInfoSymbolFields.PackageId].AsString();
46 set => this.Set((int)WixBalPackageInfoSymbolFields.PackageId, value);
47 }
48
49 public string DisplayInternalUICondition
50 {
51 get => this.Fields[(int)WixBalPackageInfoSymbolFields.DisplayInternalUICondition].AsString();
52 set => this.Set((int)WixBalPackageInfoSymbolFields.DisplayInternalUICondition, value);
53 }
54 }
55}
diff --git a/src/ext/Bal/wixext/Symbols/WixDncOptionsSymbol.cs b/src/ext/Bal/wixext/Symbols/WixDncOptionsSymbol.cs
new file mode 100644
index 00000000..b9a41c21
--- /dev/null
+++ b/src/ext/Bal/wixext/Symbols/WixDncOptionsSymbol.cs
@@ -0,0 +1,47 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Bal
4{
5 using WixToolset.Data;
6 using WixToolset.Bal.Symbols;
7
8 public static partial class BalSymbolDefinitions
9 {
10 public static readonly IntermediateSymbolDefinition WixDncOptions = new IntermediateSymbolDefinition(
11 BalSymbolDefinitionType.WixDncOptions.ToString(),
12 new[]
13 {
14 new IntermediateFieldDefinition(nameof(WixDncOptionsSymbolFields.SelfContainedDeployment), IntermediateFieldType.Number),
15 },
16 typeof(WixDncOptionsSymbol));
17 }
18}
19
20namespace WixToolset.Bal.Symbols
21{
22 using WixToolset.Data;
23
24 public enum WixDncOptionsSymbolFields
25 {
26 SelfContainedDeployment,
27 }
28
29 public class WixDncOptionsSymbol : IntermediateSymbol
30 {
31 public WixDncOptionsSymbol() : base(BalSymbolDefinitions.WixDncOptions, null, null)
32 {
33 }
34
35 public WixDncOptionsSymbol(SourceLineNumber sourceLineNumber, Identifier id = null) : base(BalSymbolDefinitions.WixDncOptions, sourceLineNumber, id)
36 {
37 }
38
39 public IntermediateField this[WixDncOptionsSymbolFields index] => this.Fields[(int)index];
40
41 public int SelfContainedDeployment
42 {
43 get => this.Fields[(int)WixDncOptionsSymbolFields.SelfContainedDeployment].AsNumber();
44 set => this.Set((int)WixDncOptionsSymbolFields.SelfContainedDeployment, value);
45 }
46 }
47} \ No newline at end of file
diff --git a/src/ext/Bal/wixext/Symbols/WixMbaPrereqInformationSymbol.cs b/src/ext/Bal/wixext/Symbols/WixMbaPrereqInformationSymbol.cs
new file mode 100644
index 00000000..e4d78da0
--- /dev/null
+++ b/src/ext/Bal/wixext/Symbols/WixMbaPrereqInformationSymbol.cs
@@ -0,0 +1,63 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Bal
4{
5 using WixToolset.Data;
6 using WixToolset.Bal.Symbols;
7
8 public static partial class BalSymbolDefinitions
9 {
10 public static readonly IntermediateSymbolDefinition WixMbaPrereqInformation = new IntermediateSymbolDefinition(
11 BalSymbolDefinitionType.WixMbaPrereqInformation.ToString(),
12 new[]
13 {
14 new IntermediateFieldDefinition(nameof(WixMbaPrereqInformationSymbolFields.PackageId), IntermediateFieldType.String),
15 new IntermediateFieldDefinition(nameof(WixMbaPrereqInformationSymbolFields.LicenseFile), IntermediateFieldType.String),
16 new IntermediateFieldDefinition(nameof(WixMbaPrereqInformationSymbolFields.LicenseUrl), IntermediateFieldType.String),
17 },
18 typeof(WixMbaPrereqInformationSymbol));
19 }
20}
21
22namespace WixToolset.Bal.Symbols
23{
24 using WixToolset.Data;
25
26 public enum WixMbaPrereqInformationSymbolFields
27 {
28 PackageId,
29 LicenseFile,
30 LicenseUrl,
31 }
32
33 public class WixMbaPrereqInformationSymbol : IntermediateSymbol
34 {
35 public WixMbaPrereqInformationSymbol() : base(BalSymbolDefinitions.WixMbaPrereqInformation, null, null)
36 {
37 }
38
39 public WixMbaPrereqInformationSymbol(SourceLineNumber sourceLineNumber, Identifier id = null) : base(BalSymbolDefinitions.WixMbaPrereqInformation, sourceLineNumber, id)
40 {
41 }
42
43 public IntermediateField this[WixMbaPrereqInformationSymbolFields index] => this.Fields[(int)index];
44
45 public string PackageId
46 {
47 get => this.Fields[(int)WixMbaPrereqInformationSymbolFields.PackageId].AsString();
48 set => this.Set((int)WixMbaPrereqInformationSymbolFields.PackageId, value);
49 }
50
51 public string LicenseFile
52 {
53 get => this.Fields[(int)WixMbaPrereqInformationSymbolFields.LicenseFile].AsString();
54 set => this.Set((int)WixMbaPrereqInformationSymbolFields.LicenseFile, value);
55 }
56
57 public string LicenseUrl
58 {
59 get => this.Fields[(int)WixMbaPrereqInformationSymbolFields.LicenseUrl].AsString();
60 set => this.Set((int)WixMbaPrereqInformationSymbolFields.LicenseUrl, value);
61 }
62 }
63} \ No newline at end of file
diff --git a/src/ext/Bal/wixext/Symbols/WixStdbaOptionsSymbol.cs b/src/ext/Bal/wixext/Symbols/WixStdbaOptionsSymbol.cs
new file mode 100644
index 00000000..cb2694da
--- /dev/null
+++ b/src/ext/Bal/wixext/Symbols/WixStdbaOptionsSymbol.cs
@@ -0,0 +1,79 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Bal
4{
5 using WixToolset.Data;
6 using WixToolset.Bal.Symbols;
7
8 public static partial class BalSymbolDefinitions
9 {
10 public static readonly IntermediateSymbolDefinition WixStdbaOptions = new IntermediateSymbolDefinition(
11 BalSymbolDefinitionType.WixStdbaOptions.ToString(),
12 new[]
13 {
14 new IntermediateFieldDefinition(nameof(WixStdbaOptionsSymbolFields.SuppressOptionsUI), IntermediateFieldType.Number),
15 new IntermediateFieldDefinition(nameof(WixStdbaOptionsSymbolFields.SuppressDowngradeFailure), IntermediateFieldType.Number),
16 new IntermediateFieldDefinition(nameof(WixStdbaOptionsSymbolFields.SuppressRepair), IntermediateFieldType.Number),
17 new IntermediateFieldDefinition(nameof(WixStdbaOptionsSymbolFields.ShowVersion), IntermediateFieldType.Number),
18 new IntermediateFieldDefinition(nameof(WixStdbaOptionsSymbolFields.SupportCacheOnly), IntermediateFieldType.Number),
19 },
20 typeof(WixStdbaOptionsSymbol));
21 }
22}
23
24namespace WixToolset.Bal.Symbols
25{
26 using WixToolset.Data;
27
28 public enum WixStdbaOptionsSymbolFields
29 {
30 SuppressOptionsUI,
31 SuppressDowngradeFailure,
32 SuppressRepair,
33 ShowVersion,
34 SupportCacheOnly,
35 }
36
37 public class WixStdbaOptionsSymbol : IntermediateSymbol
38 {
39 public WixStdbaOptionsSymbol() : base(BalSymbolDefinitions.WixStdbaOptions, null, null)
40 {
41 }
42
43 public WixStdbaOptionsSymbol(SourceLineNumber sourceLineNumber, Identifier id = null) : base(BalSymbolDefinitions.WixStdbaOptions, sourceLineNumber, id)
44 {
45 }
46
47 public IntermediateField this[WixStdbaOptionsSymbolFields index] => this.Fields[(int)index];
48
49 public int SuppressOptionsUI
50 {
51 get => this.Fields[(int)WixStdbaOptionsSymbolFields.SuppressOptionsUI].AsNumber();
52 set => this.Set((int)WixStdbaOptionsSymbolFields.SuppressOptionsUI, value);
53 }
54
55 public int SuppressDowngradeFailure
56 {
57 get => this.Fields[(int)WixStdbaOptionsSymbolFields.SuppressDowngradeFailure].AsNumber();
58 set => this.Set((int)WixStdbaOptionsSymbolFields.SuppressDowngradeFailure, value);
59 }
60
61 public int SuppressRepair
62 {
63 get => this.Fields[(int)WixStdbaOptionsSymbolFields.SuppressRepair].AsNumber();
64 set => this.Set((int)WixStdbaOptionsSymbolFields.SuppressRepair, value);
65 }
66
67 public int ShowVersion
68 {
69 get => this.Fields[(int)WixStdbaOptionsSymbolFields.ShowVersion].AsNumber();
70 set => this.Set((int)WixStdbaOptionsSymbolFields.ShowVersion, value);
71 }
72
73 public int SupportCacheOnly
74 {
75 get => this.Fields[(int)WixStdbaOptionsSymbolFields.SupportCacheOnly].AsNumber();
76 set => this.Set((int)WixStdbaOptionsSymbolFields.SupportCacheOnly, value);
77 }
78 }
79} \ No newline at end of file
diff --git a/src/ext/Bal/wixext/Symbols/WixStdbaOverridableVariableSymbol.cs b/src/ext/Bal/wixext/Symbols/WixStdbaOverridableVariableSymbol.cs
new file mode 100644
index 00000000..1d84d1aa
--- /dev/null
+++ b/src/ext/Bal/wixext/Symbols/WixStdbaOverridableVariableSymbol.cs
@@ -0,0 +1,47 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Bal
4{
5 using WixToolset.Data;
6 using WixToolset.Bal.Symbols;
7
8 public static partial class BalSymbolDefinitions
9 {
10 public static readonly IntermediateSymbolDefinition WixStdbaOverridableVariable = new IntermediateSymbolDefinition(
11 BalSymbolDefinitionType.WixStdbaOverridableVariable.ToString(),
12 new[]
13 {
14 new IntermediateFieldDefinition(nameof(WixStdbaOverridableVariableSymbolFields.Name), IntermediateFieldType.String),
15 },
16 typeof(WixStdbaOverridableVariableSymbol));
17 }
18}
19
20namespace WixToolset.Bal.Symbols
21{
22 using WixToolset.Data;
23
24 public enum WixStdbaOverridableVariableSymbolFields
25 {
26 Name,
27 }
28
29 public class WixStdbaOverridableVariableSymbol : IntermediateSymbol
30 {
31 public WixStdbaOverridableVariableSymbol() : base(BalSymbolDefinitions.WixStdbaOverridableVariable, null, null)
32 {
33 }
34
35 public WixStdbaOverridableVariableSymbol(SourceLineNumber sourceLineNumber, Identifier id = null) : base(BalSymbolDefinitions.WixStdbaOverridableVariable, sourceLineNumber, id)
36 {
37 }
38
39 public IntermediateField this[WixStdbaOverridableVariableSymbolFields index] => this.Fields[(int)index];
40
41 public string Name
42 {
43 get => this.Fields[(int)WixStdbaOverridableVariableSymbolFields.Name].AsString();
44 set => this.Set((int)WixStdbaOverridableVariableSymbolFields.Name, value);
45 }
46 }
47} \ No newline at end of file
diff --git a/src/ext/Bal/wixext/WixToolset.Bal.wixext.csproj b/src/ext/Bal/wixext/WixToolset.Bal.wixext.csproj
new file mode 100644
index 00000000..00451403
--- /dev/null
+++ b/src/ext/Bal/wixext/WixToolset.Bal.wixext.csproj
@@ -0,0 +1,39 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3
4<Project Sdk="Microsoft.NET.Sdk">
5 <PropertyGroup>
6 <TargetFramework>netstandard2.0</TargetFramework>
7 <RootNamespace>WixToolset.Bal</RootNamespace>
8 <Description>WiX Toolset Bal Extension</Description>
9 <Title>WiX Toolset Bal Extension</Title>
10 <DebugType>embedded</DebugType>
11 <NuspecFile>$(MSBuildThisFileName).nuspec</NuspecFile>
12 <IncludeSymbols>true</IncludeSymbols>
13 <NuspecProperties>Id=$(MSBuildThisFileName);Authors=$(Authors);Copyright=$(Copyright);Description=$(Description);Title=$(Title)</NuspecProperties>
14 </PropertyGroup>
15 <ItemGroup>
16 <Content Include="$(MSBuildThisFileName).targets" />
17 <EmbeddedResource Include="$(OutputPath)..\bal.wixlib" />
18 </ItemGroup>
19 <ItemGroup>
20 <PackageReference Include="Microsoft.SourceLink.GitHub" Version="1.0.0" PrivateAssets="all" />
21 <PackageReference Include="WixToolset.Data" Version="4.0.*" PrivateAssets="all" />
22 <PackageReference Include="WixToolset.Extensibility" Version="4.0.*" PrivateAssets="all" />
23 </ItemGroup>
24
25 <ItemGroup>
26 <ProjectReference Include="..\wixlib\bal.wixproj" ReferenceOutputAssembly="false" Condition=" '$(NCrunch)'=='' " />
27 </ItemGroup>
28
29 <ItemGroup>
30 <PackageReference Include="Nerdbank.GitVersioning" Version="3.3.37" PrivateAssets="all" />
31 </ItemGroup>
32
33 <Target Name="SetNuspecProperties" DependsOnTargets="InitializeSourceControlInformation" AfterTargets="GetBuildVersion">
34 <PropertyGroup>
35 <NuspecBasePath>$(OutputPath)..\</NuspecBasePath>
36 <NuspecProperties>$(NuspecProperties);Version=$(BuildVersionSimple);RepositoryCommit=$(SourceRevisionId);RepositoryType=$(RepositoryType);RepositoryUrl=$(PrivateRepositoryUrl);ProjectFolder=$(MSBuildThisFileDirectory)</NuspecProperties>
37 </PropertyGroup>
38 </Target>
39</Project>
diff --git a/src/ext/Bal/wixext/WixToolset.Bal.wixext.nuspec b/src/ext/Bal/wixext/WixToolset.Bal.wixext.nuspec
new file mode 100644
index 00000000..d9e704ae
--- /dev/null
+++ b/src/ext/Bal/wixext/WixToolset.Bal.wixext.nuspec
@@ -0,0 +1,26 @@
1<?xml version="1.0"?>
2<package xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd">
3 <metadata minClientVersion="4.0">
4 <id>$id$</id>
5 <version>$version$</version>
6 <authors>$authors$</authors>
7 <owners>$authors$</owners>
8 <license type="expression">MS-RL</license>
9 <projectUrl>https://github.com/wixtoolset/Bal.wixext</projectUrl>
10 <requireLicenseAcceptance>false</requireLicenseAcceptance>
11 <title>$title$</title>
12 <description>$description$</description>
13 <copyright>$copyright$</copyright>
14 <repository type="$repositorytype$" url="$repositoryurl$" commit="$repositorycommit$" />
15 </metadata>
16
17 <files>
18 <file src="$projectFolder$$id$.targets" target="build" />
19
20 <file src="netstandard2.0\$id$.dll" target="tools" />
21
22 <file src="x86\*.pdb" target="pdbs\x86" />
23 <file src="x64\*.pdb" target="pdbs\x64" />
24 <file src="ARM64\*.pdb" target="pdbs\ARM64" />
25 </files>
26</package>
diff --git a/src/ext/Bal/wixext/WixToolset.Bal.wixext.targets b/src/ext/Bal/wixext/WixToolset.Bal.wixext.targets
new file mode 100644
index 00000000..70c5a19c
--- /dev/null
+++ b/src/ext/Bal/wixext/WixToolset.Bal.wixext.targets
@@ -0,0 +1,11 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3
4<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0">
5 <PropertyGroup>
6 <WixToolsetBalWixextPath Condition=" '$(WixToolsetBalWixextPath)' == '' ">$(MSBuildThisFileDirectory)..\tools\WixToolset.Bal.wixext.dll</WixToolsetBalWixextPath>
7 </PropertyGroup>
8 <ItemGroup>
9 <WixExtension Include="$(WixToolsetBalWixextPath)" />
10 </ItemGroup>
11</Project>
diff --git a/src/ext/Bal/wixlib/BalExtension_arm64.wxs b/src/ext/Bal/wixlib/BalExtension_arm64.wxs
new file mode 100644
index 00000000..1b9e11d2
--- /dev/null
+++ b/src/ext/Bal/wixlib/BalExtension_arm64.wxs
@@ -0,0 +1,7 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2
3
4<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
5 <?define platform=arm64 ?>
6 <?include BalExtension_platform.wxi ?>
7</Wix>
diff --git a/src/ext/Bal/wixlib/BalExtension_platform.wxi b/src/ext/Bal/wixlib/BalExtension_platform.wxi
new file mode 100644
index 00000000..33122fb2
--- /dev/null
+++ b/src/ext/Bal/wixlib/BalExtension_platform.wxi
@@ -0,0 +1,69 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2
3
4<Include xmlns="http://wixtoolset.org/schemas/v4/wxs">
5 <?include caDecor.wxi ?>
6 <Fragment>
7 <BootstrapperApplication Id="WixDotNetCoreBootstrapperApplicationHost$(var.Suffix)">
8 <BootstrapperApplicationDll Id="WixDotNetCoreBootstrapperApplicationHost" SourceFile="!(bindpath.$(var.platform))\dnchost.dll" />
9 <Payload SourceFile="!(bindpath.$(var.platform))\wixstdba.dll" Name="dncpreq.dll" />
10 <PayloadGroupRef Id="WixDotNetCoreBootstrapperApplicationHostManagedPayloads" />
11 </BootstrapperApplication>
12 </Fragment>
13 <Fragment>
14 <BootstrapperApplication Id="WixDotNetCoreBootstrapperApplicationHost.Standard$(var.Suffix)">
15 <PayloadGroupRef Id="DncPreqStandardPayloads" />
16 </BootstrapperApplication>
17 <BootstrapperApplicationRef Id="WixDotNetCoreBootstrapperApplicationHost$(var.Suffix)" />
18 </Fragment>
19
20 <Fragment>
21 <BootstrapperApplication Id="WixManagedBootstrapperApplicationHost$(var.Suffix)">
22 <BootstrapperApplicationDll Id="WixManagedBootstrapperApplicationHost" SourceFile="!(bindpath.$(var.platform))\mbahost.dll" />
23 <Payload SourceFile="!(bindpath.$(var.platform))\wixstdba.dll" Name="mbapreq.dll" />
24 <PayloadGroupRef Id="WixManagedBootstrapperApplicationHostManagedPayloads" />
25 </BootstrapperApplication>
26 </Fragment>
27 <Fragment>
28 <BootstrapperApplication Id="WixManagedBootstrapperApplicationHost.Standard$(var.Suffix)">
29 <PayloadGroupRef Id="MbaPreqStandardPayloads" />
30 </BootstrapperApplication>
31 <BootstrapperApplicationRef Id="WixManagedBootstrapperApplicationHost$(var.Suffix)" />
32 </Fragment>
33
34 <Fragment>
35 <BootstrapperApplication Id="WixStandardBootstrapperApplication$(var.Suffix)">
36 <BootstrapperApplicationDll Id="WixStandardBootstrapperApplication" SourceFile="!(bindpath.$(var.platform))\wixstdba.dll" />
37 </BootstrapperApplication>
38 </Fragment>
39 <Fragment>
40 <BootstrapperApplication Id="WixStandardBootstrapperApplication.RtfLicense$(var.Suffix)">
41 <PayloadGroupRef Id="WixStdbaRtfLicensePayloads" />
42 </BootstrapperApplication>
43 <BootstrapperApplicationRef Id="WixStandardBootstrapperApplication$(var.Suffix)" />
44 </Fragment>
45 <Fragment>
46 <BootstrapperApplication Id="WixStandardBootstrapperApplication.RtfLargeLicense$(var.Suffix)">
47 <PayloadGroupRef Id="WixStdbaRtfLargeLicensePayloads" />
48 </BootstrapperApplication>
49 <BootstrapperApplicationRef Id="WixStandardBootstrapperApplication$(var.Suffix)" />
50 </Fragment>
51 <Fragment>
52 <BootstrapperApplication Id="WixStandardBootstrapperApplication.HyperlinkLicense$(var.Suffix)">
53 <PayloadGroupRef Id="WixStdbaHyperlinkLicensePayloads" />
54 </BootstrapperApplication>
55 <BootstrapperApplicationRef Id="WixStandardBootstrapperApplication$(var.Suffix)" />
56 </Fragment>
57 <Fragment>
58 <BootstrapperApplication Id="WixStandardBootstrapperApplication.HyperlinkLargeLicense$(var.Suffix)">
59 <PayloadGroupRef Id="WixStdbaHyperlinkLargeLicensePayloads" />
60 </BootstrapperApplication>
61 <BootstrapperApplicationRef Id="WixStandardBootstrapperApplication$(var.Suffix)" />
62 </Fragment>
63 <Fragment>
64 <BootstrapperApplication Id="WixStandardBootstrapperApplication.HyperlinkSidebarLicense$(var.Suffix)">
65 <PayloadGroupRef Id="WixStdbaHyperlinkSidebarLicensePayloads" />
66 </BootstrapperApplication>
67 <BootstrapperApplicationRef Id="WixStandardBootstrapperApplication$(var.Suffix)" />
68 </Fragment>
69</Include>
diff --git a/src/ext/Bal/wixlib/BalExtension_x64.wxs b/src/ext/Bal/wixlib/BalExtension_x64.wxs
new file mode 100644
index 00000000..69a597ae
--- /dev/null
+++ b/src/ext/Bal/wixlib/BalExtension_x64.wxs
@@ -0,0 +1,7 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2
3
4<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
5 <?define platform=x64 ?>
6 <?include BalExtension_platform.wxi ?>
7</Wix>
diff --git a/src/ext/Bal/wixlib/BalExtension_x86.wxs b/src/ext/Bal/wixlib/BalExtension_x86.wxs
new file mode 100644
index 00000000..3cdd4015
--- /dev/null
+++ b/src/ext/Bal/wixlib/BalExtension_x86.wxs
@@ -0,0 +1,7 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2
3
4<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
5 <?define platform=x86 ?>
6 <?include BalExtension_platform.wxi ?>
7</Wix>
diff --git a/src/ext/Bal/wixlib/Dnc.wxs b/src/ext/Bal/wixlib/Dnc.wxs
new file mode 100644
index 00000000..d777c473
--- /dev/null
+++ b/src/ext/Bal/wixlib/Dnc.wxs
@@ -0,0 +1,20 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2
3
4<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
5 <!--
6 Dnc.wxs - .NET Core BA resources.
7 -->
8 <Fragment>
9 <PayloadGroup Id="WixDotNetCoreBootstrapperApplicationHostManagedPayloads">
10 <Payload SourceFile="WixToolset.Dnc.Host.dll" />
11 </PayloadGroup>
12 </Fragment>
13 <Fragment>
14 <PayloadGroup Id="DncPreqStandardPayloads">
15 <Payload Name="mbapreq.thm" SourceFile="!(wix.DncPreqbaThemeXml=SourceDir\dncpreq.thm)" />
16 <Payload Name="mbapreq.png" SourceFile="!(wix.DncPreqbaLogo=SourceDir\mbapreq.png)" />
17 <Payload Name="mbapreq.wxl" SourceFile="!(wix.DncPreqbaThemeWxl=SourceDir\dncpreq.wxl)" />
18 </PayloadGroup>
19 </Fragment>
20</Wix>
diff --git a/src/ext/Bal/wixlib/Mba.wxs b/src/ext/Bal/wixlib/Mba.wxs
new file mode 100644
index 00000000..2d407c88
--- /dev/null
+++ b/src/ext/Bal/wixlib/Mba.wxs
@@ -0,0 +1,43 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2
3
4<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
5 <!--
6 Mba.wxs - Managed BA resources.
7 -->
8 <Fragment>
9 <PayloadGroup Id="WixManagedBootstrapperApplicationHostManagedPayloads">
10 <Payload SourceFile="WixToolset.Mba.Host.dll" />
11 </PayloadGroup>
12 </Fragment>
13 <Fragment>
14 <PayloadGroup Id="MbaPreqStandardPayloads">
15 <Payload Name="mbapreq.thm" SourceFile="!(wix.PreqbaThemeXml=SourceDir\mbapreq.thm)" />
16 <Payload Name="mbapreq.png" SourceFile="!(wix.PreqbaLogo=SourceDir\mbapreq.png)" />
17 <Payload Name="mbapreq.wxl" SourceFile="!(wix.PreqbaThemeWxl=SourceDir\mbapreq.wxl)" />
18 <Payload Name="1028\mbapreq.wxl" SourceFile="!(wix.PreqbaThemeWxl1028=SourceDir\1028\mbapreq.wxl)" />
19 <Payload Name="1029\mbapreq.wxl" SourceFile="!(wix.PreqbaThemeWxl1029=SourceDir\1029\mbapreq.wxl)" />
20 <Payload Name="1030\mbapreq.wxl" SourceFile="!(wix.PreqbaThemeWxl1030=SourceDir\1030\mbapreq.wxl)" />
21 <Payload Name="1031\mbapreq.wxl" SourceFile="!(wix.PreqbaThemeWxl1031=SourceDir\1031\mbapreq.wxl)" />
22 <Payload Name="1032\mbapreq.wxl" SourceFile="!(wix.PreqbaThemeWxl1032=SourceDir\1032\mbapreq.wxl)" />
23 <Payload Name="1035\mbapreq.wxl" SourceFile="!(wix.PreqbaThemeWxl1035=SourceDir\1035\mbapreq.wxl)" />
24 <Payload Name="1036\mbapreq.wxl" SourceFile="!(wix.PreqbaThemeWxl1036=SourceDir\1036\mbapreq.wxl)" />
25 <Payload Name="1038\mbapreq.wxl" SourceFile="!(wix.PreqbaThemeWxl1038=SourceDir\1038\mbapreq.wxl)" />
26 <Payload Name="1040\mbapreq.wxl" SourceFile="!(wix.PreqbaThemeWxl1040=SourceDir\1040\mbapreq.wxl)" />
27 <Payload Name="1041\mbapreq.wxl" SourceFile="!(wix.PreqbaThemeWxl1041=SourceDir\1041\mbapreq.wxl)" />
28 <Payload Name="1042\mbapreq.wxl" SourceFile="!(wix.PreqbaThemeWxl1042=SourceDir\1042\mbapreq.wxl)" />
29 <Payload Name="1043\mbapreq.wxl" SourceFile="!(wix.PreqbaThemeWxl1043=SourceDir\1043\mbapreq.wxl)" />
30 <Payload Name="1044\mbapreq.wxl" SourceFile="!(wix.PreqbaThemeWxl1044=SourceDir\1044\mbapreq.wxl)" />
31 <Payload Name="1045\mbapreq.wxl" SourceFile="!(wix.PreqbaThemeWxl1045=SourceDir\1045\mbapreq.wxl)" />
32 <Payload Name="1046\mbapreq.wxl" SourceFile="!(wix.PreqbaThemeWxl1046=SourceDir\1046\mbapreq.wxl)" />
33 <Payload Name="1049\mbapreq.wxl" SourceFile="!(wix.PreqbaThemeWxl1049=SourceDir\1049\mbapreq.wxl)" />
34 <Payload Name="1051\mbapreq.wxl" SourceFile="!(wix.PreqbaThemeWxl1051=SourceDir\1051\mbapreq.wxl)" />
35 <Payload Name="1053\mbapreq.wxl" SourceFile="!(wix.PreqbaThemeWxl1053=SourceDir\1053\mbapreq.wxl)" />
36 <Payload Name="1055\mbapreq.wxl" SourceFile="!(wix.PreqbaThemeWxl1055=SourceDir\1055\mbapreq.wxl)" />
37 <Payload Name="1060\mbapreq.wxl" SourceFile="!(wix.PreqbaThemeWxl1060=SourceDir\1060\mbapreq.wxl)" />
38 <Payload Name="2052\mbapreq.wxl" SourceFile="!(wix.PreqbaThemeWxl2052=SourceDir\2052\mbapreq.wxl)" />
39 <Payload Name="2070\mbapreq.wxl" SourceFile="!(wix.PreqbaThemeWxl2070=SourceDir\2070\mbapreq.wxl)" />
40 <Payload Name="3082\mbapreq.wxl" SourceFile="!(wix.PreqbaThemeWxl3082=SourceDir\3082\mbapreq.wxl)" />
41 </PayloadGroup>
42 </Fragment>
43</Wix>
diff --git a/src/ext/Bal/wixlib/bal.wixproj b/src/ext/Bal/wixlib/bal.wixproj
new file mode 100644
index 00000000..fdcc7475
--- /dev/null
+++ b/src/ext/Bal/wixlib/bal.wixproj
@@ -0,0 +1,36 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2<Project Sdk="WixToolset.Sdk" ToolsVersion="4.0">
3 <PropertyGroup>
4 <OutputType>Library</OutputType>
5 <BindFiles>true</BindFiles>
6 <Cultures>en-us</Cultures>
7 </PropertyGroup>
8 <ItemGroup>
9 <BindInputPaths Include="..\wixstdba\Resources\" />
10 <BindInputPaths Include="$(OutputPath)netcoreapp3.1" />
11 <BindInputPaths Include="$(OutputPath)net20" />
12 <BindInputPaths Include="$(OutputPath)x86" BindName="x86" />
13 <BindInputPaths Include="$(OutputPath)x64" BindName="x64" />
14 <BindInputPaths Include="$(OutputPath)arm64" BindName="arm64" />
15 </ItemGroup>
16 <ItemGroup>
17 <ProjectReference Include="..\dnchost\dnchost.vcxproj" Properties="Platform=ARM64" />
18 <ProjectReference Include="..\mbahost\mbahost.vcxproj" Properties="Platform=ARM64" />
19 <ProjectReference Include="..\wixstdba\wixstdba.vcxproj" Properties="Platform=ARM64" />
20 <ProjectReference Include="..\dnchost\dnchost.vcxproj" Properties="Platform=x86" />
21 <ProjectReference Include="..\mbahost\mbahost.vcxproj" Properties="Platform=x86" />
22 <ProjectReference Include="..\wixstdba\wixstdba.vcxproj" Properties="Platform=x86" />
23 <ProjectReference Include="..\dnchost\dnchost.vcxproj" Properties="Platform=x64" />
24 <ProjectReference Include="..\mbahost\mbahost.vcxproj" Properties="Platform=x64" />
25 <ProjectReference Include="..\wixstdba\wixstdba.vcxproj" Properties="Platform=x64" />
26 </ItemGroup>
27 <ItemGroup>
28 <PackageReference Include="Nerdbank.GitVersioning" Version="3.3.37" PrivateAssets="All" />
29 </ItemGroup>
30 <!-- Workaround for bug in ProjectReferenceDefineConstants, they're not needed for this project anyway -->
31 <Target Name="ClearProjectReferenceDefineConstants" AfterTargets="CalculateDefineConstants">
32 <PropertyGroup>
33 <ProjectReferenceDefineConstants></ProjectReferenceDefineConstants>
34 </PropertyGroup>
35 </Target>
36</Project> \ No newline at end of file
diff --git a/src/ext/Bal/wixlib/caDecor.wxi b/src/ext/Bal/wixlib/caDecor.wxi
new file mode 100644
index 00000000..b1711518
--- /dev/null
+++ b/src/ext/Bal/wixlib/caDecor.wxi
@@ -0,0 +1,39 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2
3
4<Include xmlns="http://wixtoolset.org/schemas/v4/wxs">
5 <?ifdef Prefix ?>
6 <?undef Prefix ?>
7 <?endif?>
8
9 <?define Prefix="Wix4" ?>
10
11 <?ifndef platform ?>
12 <?define platform="x86" ?>
13 <?endif?>
14
15 <?if $(var.platform)="" ?>
16 <?undef platform ?>
17 <?define platform="x86" ?>
18 <?endif?>
19
20 <?ifdef Suffix ?>
21 <?undef Suffix ?>
22 <?endif?>
23
24 <?if $(var.platform)~="x86" ?>
25 <?define Suffix="_X86" ?>
26 <?endif?>
27
28 <?if $(var.platform)~="x64" ?>
29 <?define Suffix="_X64" ?>
30 <?endif?>
31
32 <?if $(var.platform)~="arm" ?>
33 <?define Suffix="_A32" ?>
34 <?endif?>
35
36 <?if $(var.platform)~="arm64" ?>
37 <?define Suffix="_A64" ?>
38 <?endif?>
39</Include>
diff --git a/src/ext/Bal/wixlib/wixstdba.wxs b/src/ext/Bal/wixlib/wixstdba.wxs
new file mode 100644
index 00000000..8181b9b4
--- /dev/null
+++ b/src/ext/Bal/wixlib/wixstdba.wxs
@@ -0,0 +1,92 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2
3
4<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
5 <!-- RTF License Payload Group -->
6 <Fragment>
7 <PayloadGroup Id="WixStdbaRtfLicensePayloads">
8 <Payload Name="thm.xml" Compressed="yes" SourceFile="!(wix.WixStdbaThemeXml=RtfTheme.xml)" />
9 <Payload Name="thm.wxl" Compressed="yes" SourceFile="!(wix.WixStdbaThemeWxl=RtfTheme.wxl)" />
10 <Payload Name="logo.png" Compressed="yes" SourceFile="!(wix.WixStdbaLogo=logo.png)" />
11
12 <Payload Name="!(wix.WixStdbaLicenseRtfName=license.rtf)" Compressed="yes" SourceFile="!(wix.WixStdbaLicenseRtf=LoremIpsumLicense.rtf)" />
13 </PayloadGroup>
14
15 <BundleCustomDataRef Id="WixStdbaInformation">
16 <BundleElement>
17 <BundleAttribute Id="LicenseFile" Value="!(wix.WixStdbaLicenseRtfName=license.rtf)" />
18 </BundleElement>
19 </BundleCustomDataRef>
20 </Fragment>
21
22 <!-- RTF Large License Payload Group -->
23 <Fragment>
24 <PayloadGroup Id="WixStdbaRtfLargeLicensePayloads">
25 <Payload Name="thm.xml" Compressed="yes" SourceFile="!(wix.WixStdbaThemeXml=RtfLargeTheme.xml)" />
26 <Payload Name="thm.wxl" Compressed="yes" SourceFile="!(wix.WixStdbaThemeWxl=RtfTheme.wxl)" />
27 <Payload Name="logo.png" Compressed="yes" SourceFile="!(wix.WixStdbaLogo=logo.png)" />
28
29 <Payload Name="!(wix.WixStdbaLicenseRtfName=license.rtf)" Compressed="yes" SourceFile="!(wix.WixStdbaLicenseRtf=LoremIpsumLicense.rtf)" />
30 </PayloadGroup>
31
32 <BundleCustomDataRef Id="WixStdbaInformation">
33 <BundleElement>
34 <BundleAttribute Id="LicenseFile" Value="!(wix.WixStdbaLicenseRtfName=license.rtf)" />
35 </BundleElement>
36 </BundleCustomDataRef>
37 </Fragment>
38
39 <!-- Hyperlink License Payload Group -->
40 <Fragment>
41 <PayloadGroup Id="WixStdbaHyperlinkLicensePayloads">
42 <Payload Name="thm.xml" Compressed="yes" SourceFile="!(wix.WixStdbaThemeXml=HyperlinkTheme.xml)" />
43 <Payload Name="thm.wxl" Compressed="yes" SourceFile="!(wix.WixStdbaThemeWxl=HyperlinkTheme.wxl)" />
44 <Payload Name="logo.png" Compressed="yes" SourceFile="!(wix.WixStdbaLogo=logo.png)" />
45 </PayloadGroup>
46
47 <BundleCustomDataRef Id="WixStdbaInformation">
48 <BundleElement>
49 <BundleAttribute Id="LicenseUrl" Value="!(wix.WixStdbaLicenseUrl)" />
50 </BundleElement>
51 </BundleCustomDataRef>
52 </Fragment>
53
54 <!-- Hyperlink Large License Payload Group -->
55 <Fragment>
56 <PayloadGroup Id="WixStdbaHyperlinkLargeLicensePayloads">
57 <Payload Name="thm.xml" Compressed="yes" SourceFile="!(wix.WixStdbaThemeXml=HyperlinkLargeTheme.xml)" />
58 <Payload Name="thm.wxl" Compressed="yes" SourceFile="!(wix.WixStdbaThemeWxl=HyperlinkTheme.wxl)" />
59 <Payload Name="logo.png" Compressed="yes" SourceFile="!(wix.WixStdbaLogo=logo.png)" />
60 </PayloadGroup>
61
62 <BundleCustomDataRef Id="WixStdbaInformation">
63 <BundleElement>
64 <BundleAttribute Id="LicenseUrl" Value="!(wix.WixStdbaLicenseUrl)" />
65 </BundleElement>
66 </BundleCustomDataRef>
67 </Fragment>
68
69 <!-- HyperlinkSidebar License Payload Group -->
70 <Fragment>
71 <PayloadGroup Id="WixStdbaHyperlinkSidebarLicensePayloads">
72 <Payload Name="thm.xml" Compressed="yes" SourceFile="!(wix.WixStdbaThemeXml=HyperlinkSidebarTheme.xml)" />
73 <Payload Name="thm.wxl" Compressed="yes" SourceFile="!(wix.WixStdbaThemeWxl=HyperlinkTheme.wxl)" />
74 <Payload Name="logo.png" Compressed="yes" SourceFile="!(wix.WixStdbaLogo=logo.png)" />
75 <Payload Name="logoside.png" Compressed="yes" SourceFile="!(wix.WixStdbaLogoSide=logoside.png)" />
76 </PayloadGroup>
77
78 <BundleCustomDataRef Id="WixStdbaInformation">
79 <BundleElement>
80 <BundleAttribute Id="LicenseUrl" Value="!(wix.WixStdbaLicenseUrl)" />
81 </BundleElement>
82 </BundleCustomDataRef>
83 </Fragment>
84
85 <!-- BootstrapperApplicationData tables definition -->
86 <Fragment>
87 <BundleCustomData Id="WixStdbaInformation">
88 <BundleAttributeDefinition Id="LicenseFile" />
89 <BundleAttributeDefinition Id="LicenseUrl" />
90 </BundleCustomData>
91 </Fragment>
92</Wix>
diff --git a/src/ext/Bal/wixstdba/Resources/1028/mbapreq.wxl b/src/ext/Bal/wixstdba/Resources/1028/mbapreq.wxl
new file mode 100644
index 00000000..abd35ac7
--- /dev/null
+++ b/src/ext/Bal/wixstdba/Resources/1028/mbapreq.wxl
@@ -0,0 +1,27 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3
4
5<WixLocalization Culture="zh-tw" Language="1028" xmlns="http://schemas.microsoft.com/wix/2006/localization">
6 <String Id="Caption">[WixBundleName] 安裝程式</String>
7 <String Id="Title">[WixBundleName] 安裝程式需要 Microsoft .NET Framework</String>
8 <String Id="ConfirmCancelMessage">您確定要取消嗎?</String>
9 <String Id="HelpHeader">安裝程式說明</String>
10 <String Id="HelpText">/passive | /quiet - 顯示最基本的 UI 但不顯示提示,或者不顯示 UI 也
11 不顯示提示。預設會顯示 UI 和所有提示。
12
13/norestart - 隱藏任何重新啟動嘗試。根據預設,UI 會在重新啟動之前提示。
14/log log.txt - 記錄至特定檔案。預設會在 %TEMP% 建立記錄檔。</String>
15 <String Id="HelpCloseButton">關閉(&amp;C)</String>
16 <String Id="InstallLicenseTerms">請按一下 「接受並安裝」5D; 按鈕,接受 Microsoft .NET Framework &lt;a href="#"&gt;授權合約&lt;/a&gt;。</String>
17 <String Id="InstallAcceptAndInstallButton">接受並安裝(&amp;A)</String>
18 <String Id="InstallDeclineButton">拒絕(&amp;D)</String>
19 <String Id="ProgressHeader">安裝進度</String>
20 <String Id="ProgressLabel">正在處理:</String>
21 <String Id="ProgressCancelButton">取消(&amp;)</String>
22 <String Id="FailureHeader">安裝失敗</String>
23 <String Id="FailureLogLinkText">一或多個問題導致安裝失敗。請修正這些問題,然後再重試安裝。如需詳細資訊,請查看&lt;a href="#"&gt;記錄檔&lt;/a&gt;。</String>
24 <String Id="FailureRestartText">必須重新啟動電腦,才能完成軟體的復原。</String>
25 <String Id="FailureRestartButton">重新啟動(&amp;R)</String>
26 <String Id="FailureCloseButton">關閉(&amp;C)</String>
27</WixLocalization>
diff --git a/src/ext/Bal/wixstdba/Resources/1029/mbapreq.wxl b/src/ext/Bal/wixstdba/Resources/1029/mbapreq.wxl
new file mode 100644
index 00000000..e28b4f74
--- /dev/null
+++ b/src/ext/Bal/wixstdba/Resources/1029/mbapreq.wxl
@@ -0,0 +1,30 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3
4
5<WixLocalization Culture="cs-cz" Language="1029" xmlns="http://schemas.microsoft.com/wix/2006/localization">
6 <String Id="Caption">Instalace produktu [WixBundleName]</String>
7 <String Id="Title">Pro instalaci produktu [WixBundleName] je vyžadováno rozhraní Microsoft .NET Framework.</String>
8 <String Id="ConfirmCancelMessage">Opravdu chcete akci zrušit?</String>
9 <String Id="HelpHeader">Nápověda k instalaci</String>
10 <String Id="HelpText">/passive | /quiet - Zobrazí minimální uživatelské rozhraní bez jakýchkoli
11 výzev, nebo nezobrazí žádné uživatelské rozhraní ani žádné výzvy. Ve výchozím
12 nastavení se jak uživatelské rozhraní, tak i všechny výzvy zobrazují.
13
14/norestart - Potlačí jakékoli pokusy o restartování. Ve výchozím nastavení
15 se v uživatelském rozhraní před restartováním zobrazí výzva.
16/log log.txt - Nastaví, že se má zapisovat do konkrétního souboru protokolu.
17 Ve výchozím nastavení je soubor protokolu vytvořen v umístění %TEMP%.</String>
18 <String Id="HelpCloseButton">&amp;Zavřít</String>
19 <String Id="InstallLicenseTerms">Kliknutím na tlačítko Přijmout a nainstalovat přijmete &lt;a href="#"&gt;licenční podmínky&lt;/a&gt; rozhraní Microsoft .NET Framework.</String>
20 <String Id="InstallAcceptAndInstallButton">&amp;Přijmout a instalovat</String>
21 <String Id="InstallDeclineButton">&amp;Odmítnout</String>
22 <String Id="ProgressHeader">Průběh instalace</String>
23 <String Id="ProgressLabel">Probíhá zpracování:</String>
24 <String Id="ProgressCancelButton">&amp;Storno</String>
25 <String Id="FailureHeader">Instalace se nezdařila</String>
26 <String Id="FailureLogLinkText">Byly zjištěny problémy, kvůli kterým se instalaci nepodařilo dokončit. Odstraňte tyto problémy a potom instalaci opakujte. Další informace naleznete v &lt;a href="#"&gt;souboru protokolu&lt;/a&gt;.</String>
27 <String Id="FailureRestartText">Aby bylo možné zrušení instalace softwaru dokončit, je nutné počítač restartovat.</String>
28 <String Id="FailureRestartButton">&amp;Restartovat</String>
29 <String Id="FailureCloseButton">&amp;Zavřít</String>
30</WixLocalization>
diff --git a/src/ext/Bal/wixstdba/Resources/1030/mbapreq.wxl b/src/ext/Bal/wixstdba/Resources/1030/mbapreq.wxl
new file mode 100644
index 00000000..a531467a
--- /dev/null
+++ b/src/ext/Bal/wixstdba/Resources/1030/mbapreq.wxl
@@ -0,0 +1,30 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3
4
5<WixLocalization Culture="da-dk" Language="1030" xmlns="http://schemas.microsoft.com/wix/2006/localization">
6 <String Id="Caption">Installation af [WixBundleName]</String>
7 <String Id="Title">Microsoft .NET Framework skal være installeret i forbindelse med Installationen af [WixBundleName]</String>
8 <String Id="ConfirmCancelMessage">Er du sikker på, at du vil annullere?</String>
9 <String Id="HelpHeader">Hjælp til installation</String>
10 <String Id="HelpText">/passive | /quiet - viser en minimal brugergrænseflade uden prompter eller
11 viser ingen brugergrænseflade og ingen prompter.
12 Brugergrænsefladen og alle prompter vises som standard.
13
14/norestart - skjuler forsøg på genstart. Der vises som standard en
15 forespørgsel i brugergrænsefladen, før der genstartes.
16/log log.txt - logfører til en bestemt fil. Der oprettes som standard en
17 logfil i %TEMP%.</String>
18 <String Id="HelpCloseButton">&amp;Luk</String>
19 <String Id="InstallLicenseTerms">Klik på knappen "Acceptér og installér" for at acceptere &lt;a href="#"&gt;licensvilkårene&lt;/a&gt; for Microsoft .NET Framework.</String>
20 <String Id="InstallAcceptAndInstallButton">&amp;Acceptér og installér</String>
21 <String Id="InstallDeclineButton">&amp;Afvis</String>
22 <String Id="ProgressHeader">Status for installation</String>
23 <String Id="ProgressLabel">Behandler:</String>
24 <String Id="ProgressCancelButton">&amp;Annuller</String>
25 <String Id="FailureHeader">Installationen blev ikke gennemført</String>
26 <String Id="FailureLogLinkText">Installationen blev ikke gennemført på grund af et eller flere problemer. Løs problemerne, og prøv derefter at installere igen. Se &lt;a href="#"&gt;logfilen&lt;/a&gt; for at få flere oplysninger.</String>
27 <String Id="FailureRestartText">Du skal genstarte computeren for at fuldføre annulleringen af opdateringen af softwaren.</String>
28 <String Id="FailureRestartButton">&amp;Genstart</String>
29 <String Id="FailureCloseButton">&amp;Luk</String>
30</WixLocalization>
diff --git a/src/ext/Bal/wixstdba/Resources/1031/mbapreq.wxl b/src/ext/Bal/wixstdba/Resources/1031/mbapreq.wxl
new file mode 100644
index 00000000..ff8111f9
--- /dev/null
+++ b/src/ext/Bal/wixstdba/Resources/1031/mbapreq.wxl
@@ -0,0 +1,33 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3
4
5<WixLocalization Culture="de-de" Language="1031" xmlns="http://schemas.microsoft.com/wix/2006/localization">
6 <UI Control="InstallButton" Width="180" />
7
8 <String Id="Caption">[WixBundleName]-Setup</String>
9 <String Id="Title">Für das [WixBundleName]-Setup ist Microsoft .NET Framework erforderlich.</String>
10 <String Id="ConfirmCancelMessage">Sind Sie sicher, dass Sie den Vorgang abbrechen möchten?</String>
11 <String Id="HelpHeader">Setup-Hilfe</String>
12 <String Id="HelpText">/passive | /quiet - zeigt eine minimale Benutzeroberfläche ohne
13 Eingabeaufforderungen oder keine Benutzeroberfläche und keine
14 Eingabeaufforderungen an. Standardmäßig werden die Benutzeroberfläche und
15 alle Eingabeaufforderungen angezeigt.
16
17/norestart - unterdrückt alle Neustartversuche. Standardmäßig fordert die
18 Benutzeroberfläche zum Bestätigen eines Neustarts auf.
19/log log.txt - erstellt das Protokoll in einer bestimmten Datei.
20 Standardmäßig wird die Protokolldatei in "%TEMP%" erstellt.</String>
21 <String Id="HelpCloseButton">&amp;Schließen</String>
22 <String Id="InstallLicenseTerms">Klicken Sie auf die Schaltfläche "Akzeptieren und installieren", um den Microsoft .NET Framework &lt;a href="#"&gt;-Lizenzbedingungen&lt;/a&gt; zuzustimmen.</String>
23 <String Id="InstallAcceptAndInstallButton">&amp;Akzeptieren und installieren</String>
24 <String Id="InstallDeclineButton">&amp;Ablehnen</String>
25 <String Id="ProgressHeader">Setup-Status</String>
26 <String Id="ProgressLabel">Verarbeitung:</String>
27 <String Id="ProgressCancelButton">&amp;Abbrechen</String>
28 <String Id="FailureHeader">Setup-Fehler</String>
29 <String Id="FailureLogLinkText">Beim Setup ist aufgrund mindestens eines Problems ein Fehler aufgetreten. Beheben Sie die Probleme, und wiederholen Sie das Setup. Weitere Informationen finden Sie in der &lt;a href="#"&gt;Protokolldatei&lt;/a&gt;.</String>
30 <String Id="FailureRestartText">Sie müssen den Computer neu starten, um das Zurücksetzen der Software abzuschließen.</String>
31 <String Id="FailureRestartButton">&amp;Neu starten</String>
32 <String Id="FailureCloseButton">&amp;Schließen</String>
33</WixLocalization>
diff --git a/src/ext/Bal/wixstdba/Resources/1032/mbapreq.wxl b/src/ext/Bal/wixstdba/Resources/1032/mbapreq.wxl
new file mode 100644
index 00000000..bc3703a3
--- /dev/null
+++ b/src/ext/Bal/wixstdba/Resources/1032/mbapreq.wxl
@@ -0,0 +1,32 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3
4
5<WixLocalization Culture="el-gr" Language="1032" xmlns="http://schemas.microsoft.com/wix/2006/localization">
6 <String Id="Caption">Εγκατάσταση του [WixBundleName]</String>
7 <String Id="Title">Για την εγκατάσταση του [WixBundleName] απαιτείται το Microsoft .NET Framework</String>
8 <String Id="ConfirmCancelMessage">Είστε βέβαιοι ότι θέλετε να γίνει ακύρωση;</String>
9 <String Id="HelpHeader">Βοήθεια για την εγκατάσταση</String>
10 <String Id="HelpText">/passive | /quiet - εμφανίζει ελάχιστο περιεχόμενο του περιβάλλοντος εργασίας
11 χρήστη χωρίς μηνύματα ή δεν εμφανίζει περιβάλλον εργασίας χρήστη και
12 μηνύματα. Από προεπιλογή, εμφανίζονται όλα τα μηνύματα και το περιβάλλον
13 εργασίας χρήστη.
14
15/norestart - αποκρύπτει οποιεσδήποτε προσπάθειες για επανεκκίνηση. Από
16 προεπιλογή, το περιβάλλον εργασίας χρήστη θα εμφανίσει μήνυμα πριν από την
17 επανεκκίνηση.
18/log log.txt - πραγματοποιεί καταγραφή σε ένα συγκεκριμένο αρχείο. Από
19 προεπιλογή, δημιουργείται ένα αρχείο καταγραφής στο %TEMP%.</String>
20 <String Id="HelpCloseButton">&amp;Κλείσιμο</String>
21 <String Id="InstallLicenseTerms">Κάντε κλικ στο κουμπί "Αποδοχή και εγκατάσταση" για να αποδεχτείτε τους &lt;a href="#"&gt;όρους της άδειας χρήσης&lt;/a&gt; του Microsoft .NET Framework.</String>
22 <String Id="InstallAcceptAndInstallButton">&amp;Αποδοχή και εγκατάσταση</String>
23 <String Id="InstallDeclineButton">&amp;Απόρριψη</String>
24 <String Id="ProgressHeader">Πρόοδος εγκατάστασης</String>
25 <String Id="ProgressLabel">Επεξεργασία:</String>
26 <String Id="ProgressCancelButton">&amp;Άκυρο</String>
27 <String Id="FailureHeader">Αποτυχία εγκατάστασης</String>
28 <String Id="FailureLogLinkText">Ένα ή περισσότερα προβλήματα προκάλεσαν την αποτυχία της εγκατάστασης. Διορθώστε τα προβλήματα και μετά επαναλάβετε την εγκατάσταση. Για περισσότερες πληροφορίες, ανατρέξτε στο &lt;a href="#"&gt;αρχείο καταγραφής&lt;/a&gt;.</String>
29 <String Id="FailureRestartText">Για να ολοκληρωθεί η επαναφορά του λογισμικού, πρέπει να κάνετε επανεκκίνηση του υπολογιστή.</String>
30 <String Id="FailureRestartButton">&amp;Επανεκκίνηση</String>
31 <String Id="FailureCloseButton">&amp;Κλείσιμο</String>
32</WixLocalization>
diff --git a/src/ext/Bal/wixstdba/Resources/1035/mbapreq.wxl b/src/ext/Bal/wixstdba/Resources/1035/mbapreq.wxl
new file mode 100644
index 00000000..859e5b23
--- /dev/null
+++ b/src/ext/Bal/wixstdba/Resources/1035/mbapreq.wxl
@@ -0,0 +1,30 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3
4
5<WixLocalization Culture="fi-fi" Language="1035" xmlns="http://schemas.microsoft.com/wix/2006/localization">
6 <String Id="Caption">[WixBundleName] -asennus</String>
7 <String Id="Title">Microsoft .NET Framework tarvitaan [WixBundleName] -asennusta varten</String>
8 <String Id="ConfirmCancelMessage">Haluatko varmasti peruuttaa?</String>
9 <String Id="HelpHeader">Asennusohjelman ohje</String>
10 <String Id="HelpText">/passive | /quiet - näyttää mahdollisimman vähän käyttöliittymästä; ei
11 kehotteita tai ei käyttöliittymää ja kehotteita. Oletusarvoisesti
12 käyttöliittymä ja kaikki kehotteet näytetään.
13
14/norestart - estää uudelleenkäynnistysyritykset. Oletusarvoisesti
15 käyttöliittymä kysyy ennen uudelleenkäynnistystä.
16/log loki.txt - kirjaa lokitiedot erityiseen tiedostoon. Oletusarvoisesti
17 lokitiedosto luodaan %TEMP%-kansioon.</String>
18 <String Id="HelpCloseButton">&amp;Sulje</String>
19 <String Id="InstallLicenseTerms">Hyväksy Microsoft .NET Framework -ohjelman &lt;a href="#"&gt;käyttöoikeusehdot&lt;/a&gt; valitsemalla Hyväksy ja asenna.</String>
20 <String Id="InstallAcceptAndInstallButton">&amp;Hyväksy ja asenna</String>
21 <String Id="InstallDeclineButton">&amp;Hylkää</String>
22 <String Id="ProgressHeader">Asennuksen edistyminen</String>
23 <String Id="ProgressLabel">Käsitellään:</String>
24 <String Id="ProgressCancelButton">&amp;Peruuta</String>
25 <String Id="FailureHeader">Asennus epäonnistui</String>
26 <String Id="FailureLogLinkText">Asennus epäonnistui yhdestä tai useammasta syystä. Korjaa ongelmat ja yritä suorittaa asennus sitten uudelleen. Lisätietoja on &lt;a href="#"&gt;lokitiedostossa&lt;/a&gt;.</String>
27 <String Id="FailureRestartText">Tietokone täytyy käynnistää uudelleen ohjelmiston palautuksen viimeistelemiseksi.</String>
28 <String Id="FailureRestartButton">&amp;Käynnistä uudelleen</String>
29 <String Id="FailureCloseButton">&amp;Sulje</String>
30</WixLocalization>
diff --git a/src/ext/Bal/wixstdba/Resources/1036/mbapreq.wxl b/src/ext/Bal/wixstdba/Resources/1036/mbapreq.wxl
new file mode 100644
index 00000000..f67dfa8e
--- /dev/null
+++ b/src/ext/Bal/wixstdba/Resources/1036/mbapreq.wxl
@@ -0,0 +1,30 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3
4
5<WixLocalization Culture="fr-fr" Language="1036" xmlns="http://schemas.microsoft.com/wix/2006/localization">
6 <String Id="Caption">Installation de [WixBundleName]</String>
7 <String Id="Title">Microsoft .NET Framework requis pour l'installation de [WixBundleName]</String>
8 <String Id="ConfirmCancelMessage">Êtes-vous sûr de vouloir annuler ?</String>
9 <String Id="HelpHeader">Aide de l'installation</String>
10 <String Id="HelpText">/passive | /quiet - affiche une interface minimale sans invites ou n'affiche
11 aucune interface ni aucune invite. Par défaut, l'interface et toutes les
12 invites sont affichées.
13
14/norestart - annule toute tentative de redémarrage. Par défaut, l'interface
15 affiche une invite avant de redémarrer.
16/log journal.txt - consigne les entrées de journal dans un fichier spécifique.
17 Par défaut, un fichier journal est créé dans %TEMP%.</String>
18 <String Id="HelpCloseButton">&amp;Fermer</String>
19 <String Id="InstallLicenseTerms">Cliquez sur le bouton « Accepter et installer » pour accepter les &lt;a href="#"&gt;termes du contrat de licence&lt;/a&gt; Microsoft .NET Framework.</String>
20 <String Id="InstallAcceptAndInstallButton">&amp;Accepter et installer</String>
21 <String Id="InstallDeclineButton">&amp;Refuser</String>
22 <String Id="ProgressHeader">Progression de l'installation</String>
23 <String Id="ProgressLabel">Traitement en cours :</String>
24 <String Id="ProgressCancelButton">&amp;Annuler</String>
25 <String Id="FailureHeader">L'installation a échoué</String>
26 <String Id="FailureLogLinkText">L'installation a échoué pour une ou plusieurs raisons. Corrigez les problèmes et recommencez l'installation. Pour plus d'informations, consultez le &lt;a href="#"&gt;fichier journal&lt;/a&gt;.</String>
27 <String Id="FailureRestartText">Vous devez redémarrer votre ordinateur pour effectuer la restauration du logiciel.</String>
28 <String Id="FailureRestartButton">&amp;Redémarrer</String>
29 <String Id="FailureCloseButton">&amp;Fermer</String>
30</WixLocalization>
diff --git a/src/ext/Bal/wixstdba/Resources/1038/mbapreq.wxl b/src/ext/Bal/wixstdba/Resources/1038/mbapreq.wxl
new file mode 100644
index 00000000..6a4b109d
--- /dev/null
+++ b/src/ext/Bal/wixstdba/Resources/1038/mbapreq.wxl
@@ -0,0 +1,30 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3
4
5<WixLocalization Culture="hu-hu" Language="1038" xmlns="http://schemas.microsoft.com/wix/2006/localization">
6 <String Id="Caption">[WixBundleName] telepítő</String>
7 <String Id="Title">A(z) [WixBundleName] telepítéséhez Microsoft .NET-keretrendszer szükséges</String>
8 <String Id="ConfirmCancelMessage">Biztosan megszakítja?</String>
9 <String Id="HelpHeader">A telepítő súgója</String>
10 <String Id="HelpText">/passive | /quiet - Minimális felhasználói felület megjelenítése kérdések
11 nélkül, illetve felhasználói felület és kérdések megjelenítése nélküli
12 telepítés. Alapesetben a felhasználói felület és minden kérdés megjelenik.
13
14/norestart - Az újraindítási kérések elrejtése. Alapesetben a felhasználói
15 felületen megjelennek az újraindítási kérések.
16/log naplo.txt - Naplózás a megadott fájlba. Alapesetben a naplófájl a %TEMP%
17 könyvtárban jön létre.</String>
18 <String Id="HelpCloseButton">&amp;Bezárás</String>
19 <String Id="InstallLicenseTerms">A Microsoft .NET-keretrendszer &lt;a href="#"&gt;licencszerződésének&lt;/a&gt; elfogadásához kattintson az „Elfogadás és telepítés” gombra.</String>
20 <String Id="InstallAcceptAndInstallButton">&amp;Elfogadás és telepítés</String>
21 <String Id="InstallDeclineButton">&amp;Elutasítás</String>
22 <String Id="ProgressHeader">Telepítési folyamat</String>
23 <String Id="ProgressLabel">Feldolgozás:</String>
24 <String Id="ProgressCancelButton">&amp;Mégse</String>
25 <String Id="FailureHeader">A telepítés nem sikerült</String>
26 <String Id="FailureLogLinkText">Legalább egy olyan hiba lépett fel, amely a telepítés meghiúsulását okozta. Hárítsa el a hibákat, majd futtassa újra a telepítőt. További információt a &lt;a href="#"&gt;naplófájlban &lt;/a&gt; talál.</String>
27 <String Id="FailureRestartText">A szoftver visszaállításának befejezéséhez újra kell indítania a számítógépet.</String>
28 <String Id="FailureRestartButton">&amp;Újraindítás</String>
29 <String Id="FailureCloseButton">&amp;Bezárás</String>
30</WixLocalization>
diff --git a/src/ext/Bal/wixstdba/Resources/1040/mbapreq.wxl b/src/ext/Bal/wixstdba/Resources/1040/mbapreq.wxl
new file mode 100644
index 00000000..f57d58e5
--- /dev/null
+++ b/src/ext/Bal/wixstdba/Resources/1040/mbapreq.wxl
@@ -0,0 +1,31 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3
4
5<WixLocalization Culture="it-it" Language="1040" xmlns="http://schemas.microsoft.com/wix/2006/localization">
6 <String Id="Caption">Installazione di [WixBundleName]</String>
7 <String Id="Title">Microsoft .NET Framework necessario per l'installazione di [WixBundleName]</String>
8 <String Id="ConfirmCancelMessage">Annullare?</String>
9 <String Id="HelpHeader">Guida dell'installazione</String>
10 <String Id="HelpText">/passive | /quiet - visualizza l'interfaccia utente minima senza istruzioni
11 oppure non visualizza né l'interfaccia utente né le istruzioni. Per
12 impostazione predefinita vengono visualizzate interfaccia utente e
13 istruzioni.
14
15/norestart - elimina eventuali tentativi di riavvio. Per impostazione
16 predefinita l'interfaccia utente chiede istruzioni prima del riavvio.
17/log log.txt - registra in un file specifico. Per impostazione predefinita un
18 file di log viene creato in %TEMP%.</String>
19 <String Id="HelpCloseButton">&amp;Chiudi</String>
20 <String Id="InstallLicenseTerms">Fare clic sul pulsante "Accetta e installa" per accettare le &lt;a href="#"&gt;condizioni di licenza&lt;/a&gt; di Microsoft .NET Framework.</String>
21 <String Id="InstallAcceptAndInstallButton">&amp;Accetta e installa</String>
22 <String Id="InstallDeclineButton">&amp;Rifiuta</String>
23 <String Id="ProgressHeader">Stato installazione</String>
24 <String Id="ProgressLabel">Elaborazione in corso:</String>
25 <String Id="ProgressCancelButton">&amp;Annulla</String>
26 <String Id="FailureHeader">Installazione non riuscita</String>
27 <String Id="FailureLogLinkText">L'installazione non è riuscita a causa di uno o più problemi. Risolvere i problemi e provare di nuovo l'installazione. Per ulteriori informazioni vedere il &lt;a href="#"&gt;file di log&lt;/a&gt;.</String>
28 <String Id="FailureRestartText">È necessario riavviare il computer per completare il rollback del software.</String>
29 <String Id="FailureRestartButton">&amp;Riavvia</String>
30 <String Id="FailureCloseButton">&amp;Chiudi</String>
31</WixLocalization>
diff --git a/src/ext/Bal/wixstdba/Resources/1041/mbapreq.wxl b/src/ext/Bal/wixstdba/Resources/1041/mbapreq.wxl
new file mode 100644
index 00000000..3fe7b9b3
--- /dev/null
+++ b/src/ext/Bal/wixstdba/Resources/1041/mbapreq.wxl
@@ -0,0 +1,27 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3
4
5<WixLocalization Culture="ja-jp" Language="1041" xmlns="http://schemas.microsoft.com/wix/2006/localization">
6 <String Id="Caption">[WixBundleName] セットアップ</String>
7 <String Id="Title">[WixBundleName] セットアップには Microsoft .NET Framework が必要です</String>
8 <String Id="ConfirmCancelMessage">取り消しますか?</String>
9 <String Id="HelpHeader">セットアップのヘルプ</String>
10 <String Id="HelpText">/passive | /quiet - 最小の UI だけを表示してプロンプトは表示しないか、UI
11 もプロンプトも表示しません。 既定では、UI とすべてのプロンプトが表示されます。
12
13/norestart - 再起動の試みをすべて抑制します。既定では、再起動の前に UI によりプロンプトが表示されます。
14/log log.txt - 特定のファイルにログを記録します。既定では、%TEMP% にログ ファイルが作成されます。</String>
15 <String Id="HelpCloseButton">閉じる(&amp;C)</String>
16 <String Id="InstallLicenseTerms">Microsoft .NET Framework の&lt;a href="#"&gt;ライセンス条項&lt;/a&gt;に同意する場合は、[同意してインストール]5D; ボタンをクリックします。</String>
17 <String Id="InstallAcceptAndInstallButton">同意してインストール(&amp;A)</String>
18 <String Id="InstallDeclineButton">同意しない(&amp;)</String>
19 <String Id="ProgressHeader">セットアップの進行状況</String>
20 <String Id="ProgressLabel">処理中:</String>
21 <String Id="ProgressCancelButton">キャンセル(&amp;C)</String>
22 <String Id="FailureHeader">セットアップに失敗しました</String>
23 <String Id="FailureLogLinkText">1 つ以上の問題が原因でセットアップに失敗しました。問題を解決してからセットアップをやり直してください。詳細については、&lt;a href="#"&gt;ログ ファイル&lt;/a&gt;を参照してください。</String>
24 <String Id="FailureRestartText">ソフトウェアのロールバックを完了するには、コンピューターを再起動する必要があります。</String>
25 <String Id="FailureRestartButton">再起動(&amp;R)</String>
26 <String Id="FailureCloseButton">閉じる(&amp;C)</String>
27</WixLocalization>
diff --git a/src/ext/Bal/wixstdba/Resources/1042/mbapreq.wxl b/src/ext/Bal/wixstdba/Resources/1042/mbapreq.wxl
new file mode 100644
index 00000000..0f53dcc3
--- /dev/null
+++ b/src/ext/Bal/wixstdba/Resources/1042/mbapreq.wxl
@@ -0,0 +1,27 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3
4
5<WixLocalization Culture="ko-kr" Language="1042" xmlns="http://schemas.microsoft.com/wix/2006/localization">
6 <String Id="Caption">[WixBundleName] 설치</String>
7 <String Id="Title">[WixBundleName] 설치에 필요한 Microsoft .NET Framework</String>
8 <String Id="ConfirmCancelMessage">취소하시겠습니까?</String>
9 <String Id="HelpHeader">설치 도움말</String>
10 <String Id="HelpText">/passive | /quiet - 메시지 없이 최소 UI를 표시하거나 UI와 메시지를 전혀
11 표시하지 않습니다. 기본적으로 UI 및 모든 메시지는 표시됩니다.
12
13/norestart - 다시 시작하려는 시도를 무시합니다. 기본적으로 UI는 다시 시작하기 전에 메시지를 표시합니다.
14/log log.txt - 특정 파일에 기록합니다. 기본적으로 로그 파일이 %TEMP%에 생성됩니다.</String>
15 <String Id="HelpCloseButton">닫기(&amp;C)</String>
16 <String Id="InstallLicenseTerms">Microsoft .NET Framework &lt;a href="#"&gt;사용 조건&lt;/a&gt;에 동의하려면 "동의 및 설치"를 클릭하십시오.</String>
17 <String Id="InstallAcceptAndInstallButton">동의 및 설치(&amp;A)</String>
18 <String Id="InstallDeclineButton">동의 안 함(&amp;D)</String>
19 <String Id="ProgressHeader">설치 진행률</String>
20 <String Id="ProgressLabel">처리 중:</String>
21 <String Id="ProgressCancelButton">취소(&amp;C)</String>
22 <String Id="FailureHeader">설치 실패</String>
23 <String Id="FailureLogLinkText">하나 이상의 문제로 인해 설치에 실패했습니다. 문제를 수정하고 설치를 다시 시도하십시오. 자세한 내용은 &lt;a href="#"&gt;로그 파일&lt;/a&gt;을 참조하십시오.</String>
24 <String Id="FailureRestartText">소프트웨어의 롤백을 완료하려면 컴퓨터를 다시 시작해야 합니다.</String>
25 <String Id="FailureRestartButton">다시 시작(&amp;R)</String>
26 <String Id="FailureCloseButton">닫기(&amp;C)</String>
27</WixLocalization>
diff --git a/src/ext/Bal/wixstdba/Resources/1043/mbapreq.wxl b/src/ext/Bal/wixstdba/Resources/1043/mbapreq.wxl
new file mode 100644
index 00000000..f4a2c78c
--- /dev/null
+++ b/src/ext/Bal/wixstdba/Resources/1043/mbapreq.wxl
@@ -0,0 +1,30 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3
4
5<WixLocalization Culture="nl-nl" Language="1043" xmlns="http://schemas.microsoft.com/wix/2006/localization">
6 <String Id="Caption">[WixBundleName] Installatie</String>
7 <String Id="Title">Microsoft .NET Framework is vereist voor installatie [WixBundleName]</String>
8 <String Id="ConfirmCancelMessage">Weet u zeker dat u de installatie wilt annuleren?</String>
9 <String Id="HelpHeader">Help bij Setup</String>
10 <String Id="HelpText">/passive | /quiet - geeft een minimale gebruikersinterface weer zonder prompts
11 of geeft geen gebruikersinterface en geen prompts weer. Gebruikersinterface
12 en alle prompts worden standaard weergegeven.
13
14/norestart - pogingen tot opnieuw opstarten onderdrukken.
15 Gebruikersinterface vraagt standaard alvorens opnieuw op te starten.
16/log log.txt - registreert gegevens in een specifiek bestand. Een logbestand
17 wordt standaard in %TEMP% gemaakt.</String>
18 <String Id="HelpCloseButton">&amp;Sluiten</String>
19 <String Id="InstallLicenseTerms">Klik op de knop 'Accepteren en installeren' om de &lt;a href="#"&gt;licentievoorwaarden&lt;/a&gt; van het Microsoft .NET Framework te accepteren.</String>
20 <String Id="InstallAcceptAndInstallButton">&amp;Accepteren en installeren</String>
21 <String Id="InstallDeclineButton">&amp;Weigeren</String>
22 <String Id="ProgressHeader">Voortgang van de installatie</String>
23 <String Id="ProgressLabel">Verwerken:</String>
24 <String Id="ProgressCancelButton">&amp;Annuleren</String>
25 <String Id="FailureHeader">Installatie mislukt</String>
26 <String Id="FailureLogLinkText">Er zijn een of meer fouten opgetreden waardoor de installatie is mislukt. Corrigeer de problemen en voer Setup opnieuw uit. Raadpleeg het &lt;a href="#"&gt;log boekbestand&lt;/a&gt; voor meer informatie.</String>
27 <String Id="FailureRestartText">U moet uw computer opnieuw opstarten om het terugdraaien van de software te voltooien.</String>
28 <String Id="FailureRestartButton">&amp;Opnieuw opstarten</String>
29 <String Id="FailureCloseButton">&amp;Sluiten</String>
30</WixLocalization>
diff --git a/src/ext/Bal/wixstdba/Resources/1044/mbapreq.wxl b/src/ext/Bal/wixstdba/Resources/1044/mbapreq.wxl
new file mode 100644
index 00000000..da5c8283
--- /dev/null
+++ b/src/ext/Bal/wixstdba/Resources/1044/mbapreq.wxl
@@ -0,0 +1,30 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3
4
5<WixLocalization Culture="nb-no" Language="1044" xmlns="http://schemas.microsoft.com/wix/2006/localization">
6 <String Id="Caption">[WixBundleName] Installasjonsprogram</String>
7 <String Id="Title">Microsoft .NET Framework kreves for [WixBundleName]-installasjon</String>
8 <String Id="ConfirmCancelMessage">Er du sikker på at du vil avbryte?</String>
9 <String Id="HelpHeader">Installasjonshjelp</String>
10 <String Id="HelpText">/passive | /quiet - viser minimalt brukergrensesnitt uten ledetekster, eller
11 ikke noe brukergrensesnitt og ingen ledetekster. Som standard vises
12 brukergrensesnitt og alle ledetekster.
13
14/norestart - undertrykker alle forsøk på omstart. Som standard spør
15 brukergrensesnittet før omstart.
16/log log.txt - skriver logg til en bestemt fil. Som standard opprettes en
17 loggfil i %TEMP%.</String>
18 <String Id="HelpCloseButton">&amp;Lukk</String>
19 <String Id="InstallLicenseTerms">Klikk Godta og installer for å godta&lt;a href="#"&gt;lisensvilkårene&lt;/a&gt; for Microsoft .NET Framework.</String>
20 <String Id="InstallAcceptAndInstallButton">&amp;Godta og installer</String>
21 <String Id="InstallDeclineButton">&amp;Avslå</String>
22 <String Id="ProgressHeader">Fremdrift for installasjon</String>
23 <String Id="ProgressLabel">Behandler:</String>
24 <String Id="ProgressCancelButton">&amp;Avbryt</String>
25 <String Id="FailureHeader">Installasjon mislyktes</String>
26 <String Id="FailureLogLinkText">Ett eller flere problemer var årsak til at installasjonen mislyktes. Løs problemene, og installer på nytt. Du finner flere opplysninger i &lt;a href="#"&gt;loggfilen&lt;/a&gt;.</String>
27 <String Id="FailureRestartText">Du må starte datamaskinen på nytt for å fullføre tilbakerullingen av programvaren.</String>
28 <String Id="FailureRestartButton">&amp;Start på nytt</String>
29 <String Id="FailureCloseButton">&amp;Lukk</String>
30</WixLocalization>
diff --git a/src/ext/Bal/wixstdba/Resources/1045/mbapreq.wxl b/src/ext/Bal/wixstdba/Resources/1045/mbapreq.wxl
new file mode 100644
index 00000000..7aca87c2
--- /dev/null
+++ b/src/ext/Bal/wixstdba/Resources/1045/mbapreq.wxl
@@ -0,0 +1,30 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3
4
5<WixLocalization Culture="pl-pl" Language="1045" xmlns="http://schemas.microsoft.com/wix/2006/localization">
6 <String Id="Caption">Instalator programu [WixBundleName]</String>
7 <String Id="Title">Do zainstalowania programu [WixBundleName] jest wymagany program Microsoft .NET Framework</String>
8 <String Id="ConfirmCancelMessage">Czy na pewno chcesz anulować?</String>
9 <String Id="HelpHeader">Pomoc instalatora</String>
10 <String Id="HelpText">/passive | /quiet - wyświetla minimalny interfejs użytkownika bez monitów
11 lub nie wyświetla interfejsu użytkownika ani monitów. Domyślnie jest
12 wyświetlany interfejs użytkownika i wszystkie monity.
13
14/norestart - pomija wszelkie próby ponownego uruchomienia. Domyślnie
15 interfejs użytkownika będzie wyświetlał monit przed ponownym uruchomieniem.
16/log log.txt - zapisuje wpisy dziennika do określonego pliku.
17 Domyślnie plik dziennika jest tworzony w folderze %TEMP%.</String>
18 <String Id="HelpCloseButton">&amp;Zamknij</String>
19 <String Id="InstallLicenseTerms">Kliknij przycisk Zaakceptuj i zainstaluj, aby zaakceptować &lt;a href="#"&gt;warunki licencji&lt;/a&gt; programu Microsoft .NET Framework.</String>
20 <String Id="InstallAcceptAndInstallButton">&amp;Zaakceptuj i zainstaluj</String>
21 <String Id="InstallDeclineButton">&amp;Odrzuć</String>
22 <String Id="ProgressHeader">Postęp instalacji</String>
23 <String Id="ProgressLabel">Trwa przetwarzanie:</String>
24 <String Id="ProgressCancelButton">&amp;Anuluj</String>
25 <String Id="FailureHeader">Instalacja nie powiodła się</String>
26 <String Id="FailureLogLinkText">Co najmniej jeden problem spowodował niepowodzenie instalacji. Usuń problemy, a następnie ponów próbę instalacji. Aby uzyskać więcej informacji można znaleźć w &lt;a href="#"&gt;pliku dziennika&lt;/a&gt;.</String>
27 <String Id="FailureRestartText">Aby zakończyć wycofywanie oprogramowania, musisz ponownie uruchomić komputer.</String>
28 <String Id="FailureRestartButton">&amp;Uruchom ponownie</String>
29 <String Id="FailureCloseButton">&amp;Zamknij</String>
30</WixLocalization>
diff --git a/src/ext/Bal/wixstdba/Resources/1046/mbapreq.wxl b/src/ext/Bal/wixstdba/Resources/1046/mbapreq.wxl
new file mode 100644
index 00000000..be185502
--- /dev/null
+++ b/src/ext/Bal/wixstdba/Resources/1046/mbapreq.wxl
@@ -0,0 +1,29 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3
4
5<WixLocalization Culture="pt-br" Language="1046" xmlns="http://schemas.microsoft.com/wix/2006/localization">
6 <String Id="Caption">[WixBundleName] Instalação</String>
7 <String Id="Title">Microsoft .NET Framework é necessário para instalação do [WixBundleName]</String>
8 <String Id="ConfirmCancelMessage">Tem certeza de que deseja cancelar?</String>
9 <String Id="HelpHeader">Ajuda da Instalação</String>
10 <String Id="HelpText">/passive | /quiet - exibe UI mínima sem avisos ou exibe sem UI e
11 sem avisos. Por padrão a UI e todos avisos são exibidos.
12
13/norestart - suprime qualquer tentativa de reinicialização. Por padrão a UI
14 irá solicitar antes de reiniciar.
15/log log.txt - logs para um arquivo específico. Por padrão um arquivo de log é
16 criado em %TEMP%.</String>
17 <String Id="HelpCloseButton">&amp;Fechar</String>
18 <String Id="InstallLicenseTerms">Clique o botão "Aceitar e Instalar" para aceitar os termos de licença do Microsoft .NET Framework &lt;a href="#"&gt;&lt;/a&gt;.</String>
19 <String Id="InstallAcceptAndInstallButton">&amp;Aceitar e Instalar</String>
20 <String Id="InstallDeclineButton">&amp;Recusar</String>
21 <String Id="ProgressHeader">Progresso da Instalação</String>
22 <String Id="ProgressLabel">Processando:</String>
23 <String Id="ProgressCancelButton">&amp;Cancelar</String>
24 <String Id="FailureHeader">Falha na Instalação</String>
25 <String Id="FailureLogLinkText">Um ou mais problemas causaram falha na instalação. Corrija os problemas e tente a instalação novamente. Para mais informações consulte o &lt;a href="#"&gt;arquivo de log&lt;/a&gt;.</String>
26 <String Id="FailureRestartText">Você deve reiniciar o computador para completar a reversão do software. </String>
27 <String Id="FailureRestartButton">&amp;Reiniciar</String>
28 <String Id="FailureCloseButton">&amp;Fechar</String>
29</WixLocalization>
diff --git a/src/ext/Bal/wixstdba/Resources/1049/mbapreq.wxl b/src/ext/Bal/wixstdba/Resources/1049/mbapreq.wxl
new file mode 100644
index 00000000..a1aec7ed
--- /dev/null
+++ b/src/ext/Bal/wixstdba/Resources/1049/mbapreq.wxl
@@ -0,0 +1,29 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3
4
5<WixLocalization Culture="ru-ru" Language="1049" xmlns="http://schemas.microsoft.com/wix/2006/localization">
6 <String Id="Caption">Установка [WixBundleName]</String>
7 <String Id="Title">Для установки [WixBundleName] требуется Microsoft .NET Framework</String>
8 <String Id="ConfirmCancelMessage">Вы действительно хотите отменить операцию?</String>
9 <String Id="HelpHeader">Справка по установке</String>
10 <String Id="HelpText">/passive | /quiet - отображение минимального ИП без запросов или работа без ИП
11 и беззапросов. По умолчанию отображаются ИП и все запросы.
12
13/norestart - отключение всех попыток перезагрузки. По умолчанию в ИП перед
14 перезагрузкой отображается запрос.
15/log log.txt - запись журнала в указанный файл. По умолчанию файл журнала
16 создается в папке %TEMP%.</String>
17 <String Id="HelpCloseButton">&amp;Закрыть</String>
18 <String Id="InstallLicenseTerms">Нажмите кнопку "Принять и установить", чтобы принять &lt;a href="#"&gt;условия лицензии&lt;/a&gt; Microsoft .NET Framework.</String>
19 <String Id="InstallAcceptAndInstallButton">&amp;Принять и установить</String>
20 <String Id="InstallDeclineButton">&amp;Отклонить</String>
21 <String Id="ProgressHeader">Выполнение установки</String>
22 <String Id="ProgressLabel">Обработка:</String>
23 <String Id="ProgressCancelButton">&amp;Отмена</String>
24 <String Id="FailureHeader">Сбой установки</String>
25 <String Id="FailureLogLinkText">Не удалось выполнить установку из-за одной или нескольких проблем. Устраните эти проблемы, а затем снова запустите программу установки. Дополнительные сведения см. в &lt;a href="#"&gt;файле журнала&lt;/a&gt;.</String>
26 <String Id="FailureRestartText">Необходимо перезагрузить компьютер, чтобы завершить откат программного обеспечения.</String>
27 <String Id="FailureRestartButton">&amp;Перезагрузить</String>
28 <String Id="FailureCloseButton">&amp;Закрыть</String>
29</WixLocalization>
diff --git a/src/ext/Bal/wixstdba/Resources/1051/mbapreq.wxl b/src/ext/Bal/wixstdba/Resources/1051/mbapreq.wxl
new file mode 100644
index 00000000..9f0b4711
--- /dev/null
+++ b/src/ext/Bal/wixstdba/Resources/1051/mbapreq.wxl
@@ -0,0 +1,30 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3
4
5<WixLocalization Culture="sk-sk" Language="1051" xmlns="http://schemas.microsoft.com/wix/2006/localization">
6 <String Id="Caption">[WixBundleName] – inštalácia</String>
7 <String Id="Title">Na inštaláciu aplikácie [WixBundleName] sa vyžaduje súčasť Microsoft .NET Framework</String>
8 <String Id="ConfirmCancelMessage">Naozaj chcete zrušiť operáciu?</String>
9 <String Id="HelpHeader">Pomocník pre inštaláciu</String>
10 <String Id="HelpText">/passive | /quiet – zobrazí minimálne používateľské rozhranie bez výziev alebo
11 nezobrazí žiadne používateľské rozhranie ani výzvy. Predvolene sa
12 zobrazuje používateľské rozhranie aj všetky výzvy.
13
14/norestart – zruší všetky pokusy o reštart. Používateľské rozhranie
15 predvolene zobrazí pred reštartom výzvu.
16/log log.txt – urobí záznam do určeného súboru. Súbor denníka sa predvolene
17 vytvorí v priečinku %TEMP%.</String>
18 <String Id="HelpCloseButton">&amp;Zavrieť</String>
19 <String Id="InstallLicenseTerms">Kliknutím na tlačidlo Súhlasiť a inštalovať vyjadrite svoj súhlas s &lt;a href="#"&gt;licenčnými podmienkami&lt;/a&gt; súčasti Microsoft .NET Framework.</String>
20 <String Id="InstallAcceptAndInstallButton">&amp;Súhlasiť a inštalovať</String>
21 <String Id="InstallDeclineButton">&amp;Odmietnuť</String>
22 <String Id="ProgressHeader">Priebeh inštalácie</String>
23 <String Id="ProgressLabel">Spracúva sa:</String>
24 <String Id="ProgressCancelButton">&amp;Zrušiť</String>
25 <String Id="FailureHeader">Inštalácia zlyhala</String>
26 <String Id="FailureLogLinkText">Inštalácia zlyhala pre jednu alebo viac príčin. Odstráňte problémy a skúste znova spustiť inštaláciu. Ďalšie informácie nájdete v &lt;a href="#"&gt;súbore denníka&lt;/a&gt;.</String>
27 <String Id="FailureRestartText">Dokončenie všetkých zmien softvéru vyžaduje reštart počítača.</String>
28 <String Id="FailureRestartButton">&amp;Reštartovať</String>
29 <String Id="FailureCloseButton">&amp;Zavrieť</String>
30</WixLocalization>
diff --git a/src/ext/Bal/wixstdba/Resources/1053/mbapreq.wxl b/src/ext/Bal/wixstdba/Resources/1053/mbapreq.wxl
new file mode 100644
index 00000000..72961409
--- /dev/null
+++ b/src/ext/Bal/wixstdba/Resources/1053/mbapreq.wxl
@@ -0,0 +1,30 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3
4
5<WixLocalization Culture="sv-se" Language="1053" xmlns="http://schemas.microsoft.com/wix/2006/localization">
6 <String Id="Caption">[WixBundleName]-installation</String>
7 <String Id="Title">Microsoft .NET Framework krävs för installation av [WixBundleName]</String>
8 <String Id="ConfirmCancelMessage">Vill du avbryta?</String>
9 <String Id="HelpHeader">Installationshjälp</String>
10 <String Id="HelpText">/passive | /quiet - visar ett minimalt användargränssnitt utan prompter,
11 alternativt inget användargränssnitt och inga prompter. Som standard visas
12 användargränssnitt och samtliga prompter.
13
14/norestart - hejdar omstart. Som standard visar användargränssnittet en
15 prompt före omstart.
16/log log.txt - skapar logg till en specifik fil. Som standard skapas loggfilen
17 i %TEMP%.</String>
18 <String Id="HelpCloseButton">&amp;Stäng</String>
19 <String Id="InstallLicenseTerms">Klicka på knappen "Godkänn och installera" för att godkänna &lt;a href="#"&gt;licensvillkoren&lt;/a&gt; för Microsoft .NET Framework.</String>
20 <String Id="InstallAcceptAndInstallButton">&amp;Godkänn och installera</String>
21 <String Id="InstallDeclineButton">&amp;Avbryt</String>
22 <String Id="ProgressHeader">Installationsförlopp</String>
23 <String Id="ProgressLabel">Bearbetar:</String>
24 <String Id="ProgressCancelButton">&amp;Avbryt</String>
25 <String Id="FailureHeader">Installationen misslyckades</String>
26 <String Id="FailureLogLinkText">Installationen misslyckades på grund av ett eller flera problem. Åtgärda problemen och försök igen. Se &lt;a href="#"&gt;loggfilen&lt;/a&gt; för mer information.</String>
27 <String Id="FailureRestartText">Starta om datorn för att återställa programmet.</String>
28 <String Id="FailureRestartButton">&amp;Starta om</String>
29 <String Id="FailureCloseButton">&amp;Stäng</String>
30</WixLocalization>
diff --git a/src/ext/Bal/wixstdba/Resources/1055/mbapreq.wxl b/src/ext/Bal/wixstdba/Resources/1055/mbapreq.wxl
new file mode 100644
index 00000000..ee52da98
--- /dev/null
+++ b/src/ext/Bal/wixstdba/Resources/1055/mbapreq.wxl
@@ -0,0 +1,30 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3
4
5<WixLocalization Culture="tr-tr" Language="1055" xmlns="http://schemas.microsoft.com/wix/2006/localization">
6 <String Id="Caption">[WixBundleName] Kurulumu</String>
7 <String Id="Title">[WixBundleName] kurulumu için Microsoft .NET Framework gerekir</String>
8 <String Id="ConfirmCancelMessage">İptal etmek istediğinizden emin misiniz?</String>
9 <String Id="HelpHeader">Kurulum Yardımı</String>
10 <String Id="HelpText">/passive | /quiet - komut istemi olmayan olabildiğince küçük bir UI
11 görüntüler veya komut istemi ve UI görüntülemez. Varsayılan olarak UI
12 ve tüm komut istemleri görüntülenir.
13
14/norestart - yeniden başlatma denemelerini engeller. Varsayılan
15 olarak UI yeniden başlatmadan önce komut isteyecektir.
16/log log.txt - belirli bir dosyayı günlük dosyası olarak kullanır.
17 Varsayılan olarak %TEMP% konumunda bir günlük dosyası oluşturulur.</String>
18 <String Id="HelpCloseButton">&amp;Kapat</String>
19 <String Id="InstallLicenseTerms">Microsoft .NET Framework &lt;a href="#"&gt;lisans şartlarını&lt;/a&gt; kabul etmek için "Kabul Et ve Yükle" düğmesini tıklatın.</String>
20 <String Id="InstallAcceptAndInstallButton">&amp;Kabul Et ve Yükle</String>
21 <String Id="InstallDeclineButton">&amp;Reddet</String>
22 <String Id="ProgressHeader">Kurulum İlerleme Durumu</String>
23 <String Id="ProgressLabel">İşleniyor:</String>
24 <String Id="ProgressCancelButton">&amp;İptal</String>
25 <String Id="FailureHeader">Kurulum Başarısız</String>
26 <String Id="FailureLogLinkText">Bir veya daha fazla sorun kurulumun başarısız olmasına neden oldu. Lütfen sorunları çözün ve kurulumu yeniden deneyin. Daha fazla bilgi için &lt;a href="#"&gt;günlük dosyasına&lt;/a&gt; bakın.</String>
27 <String Id="FailureRestartText">Yazılım geri alma işlemini tamamlamak için bilgisayarınızı yeniden başlatmanız gerekir.</String>
28 <String Id="FailureRestartButton">&amp;Yeniden Başlat</String>
29 <String Id="FailureCloseButton">&amp;Kapat</String>
30</WixLocalization>
diff --git a/src/ext/Bal/wixstdba/Resources/1060/mbapreq.wxl b/src/ext/Bal/wixstdba/Resources/1060/mbapreq.wxl
new file mode 100644
index 00000000..f3b4bfe5
--- /dev/null
+++ b/src/ext/Bal/wixstdba/Resources/1060/mbapreq.wxl
@@ -0,0 +1,30 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3
4
5<WixLocalization Culture="sl-si" Language="1060" xmlns="http://schemas.microsoft.com/wix/2006/localization">
6 <String Id="Caption">[WixBundleName] Namestitev</String>
7 <String Id="Title">Microsoft .NET Framework, potreben za namestitev paketa [WixBundleName]</String>
8 <String Id="ConfirmCancelMessage">Ali ste prepričani, da želite preklicati?</String>
9 <String Id="HelpHeader">Pomoč za namestitev</String>
10 <String Id="HelpText">/passive | /quiet - prikaže minimalni uporabniški vmesnik brez pozivov ali ne prikaže
11 uporabniškega vmesnika in pozivov. Privzeto so prikazani uporabniški vmesnik in
12 vsi pozivi.
13
14/norestart - skrije vse možnosti za vnovicni zagon. Privzeto uporabniški vmesnik
15 prikaže poziv pred ponovnim zagonom.
16/log log.txt - beleži vnose v dnevnik v doloceno datoteko. Privzeto je datoteko
17 ustvarjena v mapi %TEMP%.</String>
18 <String Id="HelpCloseButton">&amp;Zapri</String>
19 <String Id="InstallLicenseTerms">Kliknite »Sprejmi in namesti« in sprejmite &lt;a href="#"&gt;licenčne pogoje&lt;/a&gt; za Microsoft .NET Framework.</String>
20 <String Id="InstallAcceptAndInstallButton">&amp;Sprejmi in namesti</String>
21 <String Id="InstallDeclineButton">&amp;Zavrni</String>
22 <String Id="ProgressHeader">Potek namestitve</String>
23 <String Id="ProgressLabel">Obdelovanje:</String>
24 <String Id="ProgressCancelButton">&amp;Prekliči</String>
25 <String Id="FailureHeader">Namestitev ni uspela</String>
26 <String Id="FailureLogLinkText">Namestitev ni uspela zaradi ene ali več težav. Odpravite težave in ponovno zaženite namestitev. Za več informacij glejte &lt;a href="#"&gt;dnevniško datoteko&lt;/a&gt;.</String>
27 <String Id="FailureRestartText">Za povrnitev prejšnjega stanja programske opreme morate ponovno zagnati računalnik.</String>
28 <String Id="FailureRestartButton">&amp;Ponovni zagon</String>
29 <String Id="FailureCloseButton">&amp;Zapri</String>
30</WixLocalization>
diff --git a/src/ext/Bal/wixstdba/Resources/2052/mbapreq.wxl b/src/ext/Bal/wixstdba/Resources/2052/mbapreq.wxl
new file mode 100644
index 00000000..63cdb418
--- /dev/null
+++ b/src/ext/Bal/wixstdba/Resources/2052/mbapreq.wxl
@@ -0,0 +1,27 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3
4
5<WixLocalization Culture="zh-ch" Language="2052" xmlns="http://schemas.microsoft.com/wix/2006/localization">
6 <String Id="Caption">[WixBundleName] 安装</String>
7 <String Id="Title">[WixBundleName] 安装需要 Microsoft .NET Framework</String>
8 <String Id="ConfirmCancelMessage">是否确实要取消?</String>
9 <String Id="HelpHeader">安装程序帮助</String>
10 <String Id="HelpText">/passive | /quiet - 显示最小的 UI 且无提示,或者不显示 UI 且
11 无提示。默认情况下显示 UI 和所有提示。
12
13/norestart - 隐藏任何重启提示。默认情况下 UI 会在重启前提示。
14/log log.txt - 记录到特定文件。默认情况下在 %TEMP% 中创建日志文件。</String>
15 <String Id="HelpCloseButton">关闭(&amp;C)</String>
16 <String Id="InstallLicenseTerms">单击“接受并安装”按钮以接受 Microsoft .NET Framework &lt;a href="#"&gt;许可证条款&lt;/a&gt;。</String>
17 <String Id="InstallAcceptAndInstallButton">接受并安装(&amp;A)</String>
18 <String Id="InstallDeclineButton">拒绝(&amp;D)</String>
19 <String Id="ProgressHeader">安装进度</String>
20 <String Id="ProgressLabel">正在处理:</String>
21 <String Id="ProgressCancelButton">取消(&amp;C)</String>
22 <String Id="FailureHeader">安装失败</String>
23 <String Id="FailureLogLinkText">一个或多个问题导致安装失败。请解决问题,然后重新尝试安装。有关详情,请查看&lt;a href="#"&gt;日志文件&lt;/a&gt;。</String>
24 <String Id="FailureRestartText">必须重启计算机才能完成软件的回滚。</String>
25 <String Id="FailureRestartButton">重启(&amp;R)</String>
26 <String Id="FailureCloseButton">关闭(&amp;C)</String>
27</WixLocalization>
diff --git a/src/ext/Bal/wixstdba/Resources/2070/mbapreq.wxl b/src/ext/Bal/wixstdba/Resources/2070/mbapreq.wxl
new file mode 100644
index 00000000..6a49ca31
--- /dev/null
+++ b/src/ext/Bal/wixstdba/Resources/2070/mbapreq.wxl
@@ -0,0 +1,29 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3
4
5<WixLocalization Culture="pt-pt" Language="2070" xmlns="http://schemas.microsoft.com/wix/2006/localization">
6 <String Id="Caption">Configuração do [WixBundleName]</String>
7 <String Id="Title">O Microsoft .NET Framework é necessário para a configuração do [WixBundleName]</String>
8 <String Id="ConfirmCancelMessage">Tem a certeza de que pretende cancelar?</String>
9 <String Id="HelpHeader">Ajuda da Configuração</String>
10 <String Id="HelpText">/passive | /quiet - apresenta IU mínima sem mensagens ou não apresenta IU nem
11 mensagens. Por predefinição, são apresentadas a IU e todas as mensagens.
12
13/norestart - suprimir qualquer tentativa de reinício. Por predefinição, a IU
14 avisará antes de reiniciar.
15/log log.txt - regista num ficheiro específico. Por predefinição, é criado um
16 ficheiro de registo em %TEMP%.</String>
17 <String Id="HelpCloseButton">&amp;Fechar</String>
18 <String Id="InstallLicenseTerms">Clique no botão "Aceitar e Instalar" para aceitar os &lt;a href="#"&gt;termos de licenciamento&lt;/a&gt; do Microsoft .NET Framework.</String>
19 <String Id="InstallAcceptAndInstallButton">&amp;Aceitar e Instalar</String>
20 <String Id="InstallDeclineButton">&amp;Recusar</String>
21 <String Id="ProgressHeader">Progresso da Configuração</String>
22 <String Id="ProgressLabel">A processar:</String>
23 <String Id="ProgressCancelButton">&amp;Cancelar</String>
24 <String Id="FailureHeader">Falha da Configuração</String>
25 <String Id="FailureLogLinkText">Um ou mais problemas provocaram a falha da configuração. Corrija os problemas e repita a configuração. Para mais informações, consulte o &lt;a href="#"&gt;ficheiro de registo&lt;/a&gt;.</String>
26 <String Id="FailureRestartText">Tem de reiniciar o computador para concluir a reversão do software.</String>
27 <String Id="FailureRestartButton">&amp;Reiniciar</String>
28 <String Id="FailureCloseButton">&amp;Fechar</String>
29</WixLocalization>
diff --git a/src/ext/Bal/wixstdba/Resources/3082/mbapreq.wxl b/src/ext/Bal/wixstdba/Resources/3082/mbapreq.wxl
new file mode 100644
index 00000000..0290624c
--- /dev/null
+++ b/src/ext/Bal/wixstdba/Resources/3082/mbapreq.wxl
@@ -0,0 +1,31 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3
4
5<WixLocalization Culture="es-es" Language="3082" xmlns="http://schemas.microsoft.com/wix/2006/localization">
6 <String Id="Caption">Instalación de [WixBundleName]</String>
7 <String Id="Title">La instalación de [WixBundleName] requiere Microsoft .NET Framework</String>
8 <String Id="ConfirmCancelMessage">¿Está seguro de que desea cancelar?</String>
9 <String Id="HelpHeader">Ayuda del programa de instalación</String>
10 <String Id="HelpText">/passive | /quiet - muestra una interfaz de usuario mínima y no realiza
11 preguntas, o bien no muestra interfaz de usuario y no realiza preguntas.
12 De manera predeterminada se muestra la interfaz de usuario completa y se
13 realizan todas las preguntas necesarias.
14
15/norestart - suprime cualquier intento de reinicio. De manera predeterminada,
16 la interfaz de usuario preguntará si se desea reiniciar.
17/log log.txt - registra los datos de instalación en un archivo específico.
18 De manera predeterminada se crea un archivo de registro en %TEMP%.</String>
19 <String Id="HelpCloseButton">&amp;Cerrar</String>
20 <String Id="InstallLicenseTerms">Haga clic en el botón "Aceptar e instalar" para aceptar los &lt;a href="#"&gt;términos de licencia&lt;/a&gt; de Microsoft .NET Framework.</String>
21 <String Id="InstallAcceptAndInstallButton">&amp;Aceptar e instalar</String>
22 <String Id="InstallDeclineButton">&amp;Rechazar</String>
23 <String Id="ProgressHeader">Progreso de la instalación</String>
24 <String Id="ProgressLabel">Procesando:</String>
25 <String Id="ProgressCancelButton">&amp;Cancelar</String>
26 <String Id="FailureHeader">Error de la instalación</String>
27 <String Id="FailureLogLinkText">No se pudo completar la instalación a causa de uno o varios problemas. Corrija los problemas y vuelva a intentar la instalación. Para más información, vea el &lt;a href="#"&gt;archivo de registro&lt;/a&gt;.</String>
28 <String Id="FailureRestartText">Debe reiniciar el equipo para completar la reversión del software.</String>
29 <String Id="FailureRestartButton">&amp;Reiniciar</String>
30 <String Id="FailureCloseButton">&amp;Cerrar</String>
31</WixLocalization>
diff --git a/src/ext/Bal/wixstdba/Resources/HyperlinkLargeTheme.xml b/src/ext/Bal/wixstdba/Resources/HyperlinkLargeTheme.xml
new file mode 100644
index 00000000..39a38ee0
--- /dev/null
+++ b/src/ext/Bal/wixstdba/Resources/HyperlinkLargeTheme.xml
@@ -0,0 +1,109 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3
4
5<Theme xmlns="http://wixtoolset.org/schemas/v4/thmutil">
6 <Font Id="0" Height="-12" Weight="500" Foreground="windowtext" Background="window">Segoe UI</Font>
7 <Font Id="1" Height="-24" Weight="500" Foreground="windowtext">Segoe UI</Font>
8 <Font Id="2" Height="-22" Weight="500" Foreground="graytext">Segoe UI</Font>
9 <Font Id="3" Height="-12" Weight="500" Foreground="windowtext" Background="window">Segoe UI</Font>
10
11 <Window Width="500" Height="390" HexStyle="100a0000" FontId="0" Caption="#(loc.Caption)">
12 <ImageControl X="11" Y="11" Width="64" Height="64" ImageFile="logo.png" Visible="yes"/>
13 <Label X="80" Y="11" Width="-11" Height="64" FontId="1" Visible="yes" DisablePrefix="yes">#(loc.Title)</Label>
14
15 <Page Name="Help">
16 <Label X="11" Y="80" Width="-11" Height="30" FontId="2" DisablePrefix="yes">#(loc.HelpHeader)</Label>
17 <Label X="11" Y="112" Width="-11" Height="-35" FontId="3" DisablePrefix="yes">#(loc.HelpText)</Label>
18 <Button Name="HelpCloseButton" X="-11" Y="-11" Width="75" Height="23" TabStop="yes" FontId="0">
19 <Text>#(loc.HelpCloseButton)</Text>
20 <CloseWindowAction />
21 </Button>
22 </Page>
23 <Page Name="Install">
24 <Label X="11" Y="80" Width="-11" Height="30" FontId="2" DisablePrefix="yes">#(loc.InstallHeader)</Label>
25 <Label X="11" Y="121" Width="-11" Height="-129" FontId="3" DisablePrefix="yes">#(loc.InstallMessage)</Label>
26 <Hypertext Name="EulaHyperlink" X="11" Y="-107" Width="-11" Height="17" TabStop="yes" FontId="3" HideWhenDisabled="yes">#(loc.InstallLicenseLinkText)</Hypertext>
27 <Label Name="InstallVersion" X="11" Y="-73" Width="246" Height="17" FontId="3" DisablePrefix="yes" VisibleCondition="WixStdBAShowVersion">#(loc.InstallVersion)</Label>
28 <Checkbox Name="EulaAcceptCheckbox" X="-11" Y="-41" Width="260" Height="17" TabStop="yes" FontId="3" HideWhenDisabled="yes">#(loc.InstallAcceptCheckbox)</Checkbox>
29 <Button Name="OptionsButton" X="-171" Y="-11" Width="75" Height="23" TabStop="yes" FontId="0" VisibleCondition="NOT WixStdBASuppressOptionsUI">
30 <Text>#(loc.InstallOptionsButton)</Text>
31 <ChangePageAction Page="Options" />
32 </Button>
33 <Button Name="InstallButton" X="-91" Y="-11" Width="75" Height="23" TabStop="yes" FontId="0">#(loc.InstallInstallButton)</Button>
34 <Button Name="InstallCancelButton" X="-11" Y="-11" Width="75" Height="23" TabStop="yes" FontId="0">
35 <Text>#(loc.InstallCancelButton)</Text>
36 <CloseWindowAction />
37 </Button>
38 </Page>
39 <Page Name="Options">
40 <Label X="11" Y="80" Width="-11" Height="30" FontId="2" DisablePrefix="yes">#(loc.OptionsHeader)</Label>
41 <Label X="11" Y="121" Width="-11" Height="17" FontId="3" DisablePrefix="yes">#(loc.OptionsLocationLabel)</Label>
42 <Editbox Name="InstallFolder" X="11" Y="143" Width="-91" Height="21" TabStop="yes" FontId="3" FileSystemAutoComplete="yes" />
43 <Button Name="BrowseButton" X="-11" Y="142" Width="75" Height="23" TabStop="yes" FontId="0">
44 <Text>#(loc.OptionsBrowseButton)</Text>
45 <BrowseDirectoryAction VariableName="InstallFolder" />
46 </Button>
47 <Button Name="OptionsOkButton" X="-91" Y="-11" Width="75" Height="23" TabStop="yes" FontId="0">
48 <Text>#(loc.OptionsOkButton)</Text>
49 <ChangePageAction Page="Install" />
50 </Button>
51 <Button Name="OptionsCancelButton" X="-11" Y="-11" Width="75" Height="23" TabStop="yes" FontId="0">
52 <Text>#(loc.OptionsCancelButton)</Text>
53 <ChangePageAction Page="Install" Cancel="yes" />
54 </Button>
55 </Page>
56 <Page Name="Progress">
57 <Label X="11" Y="80" Width="-11" Height="30" FontId="2" DisablePrefix="yes">#(loc.ProgressHeader)</Label>
58 <Label X="11" Y="121" Width="70" Height="17" FontId="3" DisablePrefix="yes">#(loc.ProgressLabel)</Label>
59 <Label Name="OverallProgressPackageText" X="85" Y="121" Width="-11" Height="17" FontId="3" DisablePrefix="yes">#(loc.OverallProgressPackageText)</Label>
60 <Progressbar Name="OverallCalculatedProgressbar" X="11" Y="143" Width="-11" Height="15" />
61 <Button Name="ProgressCancelButton" X="-11" Y="-11" Width="75" Height="23" TabStop="yes" FontId="0">#(loc.ProgressCancelButton)</Button>
62 </Page>
63 <Page Name="Modify">
64 <Label X="11" Y="80" Width="-11" Height="30" FontId="2" DisablePrefix="yes">#(loc.ModifyHeader)</Label>
65 <Button Name="RepairButton" X="-171" Y="-11" Width="75" Height="23" TabStop="yes" FontId="0" HideWhenDisabled="yes">#(loc.ModifyRepairButton)</Button>
66 <Button Name="UninstallButton" X="-91" Y="-11" Width="75" Height="23" TabStop="yes" FontId="0">#(loc.ModifyUninstallButton)</Button>
67 <Button Name="ModifyCancelButton" X="-11" Y="-11" Width="75" Height="23" TabStop="yes" FontId="0">
68 <Text>#(loc.ModifyCancelButton)</Text>
69 <CloseWindowAction />
70 </Button>
71 </Page>
72 <Page Name="Success">
73 <Label X="11" Y="80" Width="-11" Height="30" FontId="2" DisablePrefix="yes">
74 <Text>#(loc.SuccessHeader)</Text>
75 <Text Condition="WixBundleAction = 2">#(loc.SuccessLayoutHeader)</Text>
76 <Text Condition="WixBundleAction = 3">#(loc.SuccessUninstallHeader)</Text>
77 <Text Condition="WixBundleAction = 5">#(loc.SuccessInstallHeader)</Text>
78 <Text Condition="WixBundleAction = 7">#(loc.SuccessRepairHeader)</Text>
79 </Label>
80 <Button Name="LaunchButton" X="-91" Y="-11" Width="75" Height="23" TabStop="yes" FontId="0" HideWhenDisabled="yes">#(loc.SuccessLaunchButton)</Button>
81 <Label X="-11" Y="-51" Width="400" Height="34" FontId="3" DisablePrefix="yes" VisibleCondition="WixStdBARestartRequired">
82 <Text>#(loc.SuccessRestartText)</Text>
83 <Text Condition="WixBundleAction = 3">#(loc.SuccessUninstallRestartText)</Text>
84 </Label>
85 <Button Name="SuccessRestartButton" X="-91" Y="-11" Width="75" Height="23" TabStop="yes" FontId="0" HideWhenDisabled="yes">#(loc.SuccessRestartButton)</Button>
86 <Button Name="SuccessCloseButton" X="-11" Y="-11" Width="75" Height="23" TabStop="yes" FontId="0">
87 <Text>#(loc.SuccessCloseButton)</Text>
88 <CloseWindowAction />
89 </Button>
90 </Page>
91 <Page Name="Failure">
92 <Label X="11" Y="80" Width="-11" Height="30" FontId="2" DisablePrefix="yes">
93 <Text>#(loc.FailureHeader)</Text>
94 <Text Condition="WixBundleAction = 2">#(loc.FailureLayoutHeader)</Text>
95 <Text Condition="WixBundleAction = 3">#(loc.FailureUninstallHeader)</Text>
96 <Text Condition="WixBundleAction = 5">#(loc.FailureInstallHeader)</Text>
97 <Text Condition="WixBundleAction = 7">#(loc.FailureRepairHeader)</Text>
98 </Label>
99 <Hypertext Name="FailureLogFileLink" X="11" Y="121" Width="-11" Height="42" FontId="3" TabStop="yes" HideWhenDisabled="yes">#(loc.FailureHyperlinkLogText)</Hypertext>
100 <Hypertext Name="FailureMessageText" X="22" Y="163" Width="-11" Height="51" FontId="3" TabStop="yes" HideWhenDisabled="yes" />
101 <Label X="-11" Y="-51" Width="400" Height="34" FontId="3" DisablePrefix="yes" VisibleCondition="WixStdBARestartRequired">#(loc.FailureRestartText)</Label>
102 <Button Name="FailureRestartButton" X="-91" Y="-11" Width="75" Height="23" TabStop="yes" FontId="0" HideWhenDisabled="yes">#(loc.FailureRestartButton)</Button>
103 <Button Name="FailureCloseButton" X="-11" Y="-11" Width="75" Height="23" TabStop="yes" FontId="0">
104 <Text>#(loc.FailureCloseButton)</Text>
105 <CloseWindowAction />
106 </Button>
107 </Page>
108 </Window>
109</Theme>
diff --git a/src/ext/Bal/wixstdba/Resources/HyperlinkSidebarTheme.xml b/src/ext/Bal/wixstdba/Resources/HyperlinkSidebarTheme.xml
new file mode 100644
index 00000000..1dff9d7e
--- /dev/null
+++ b/src/ext/Bal/wixstdba/Resources/HyperlinkSidebarTheme.xml
@@ -0,0 +1,120 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3
4
5<Theme xmlns="http://wixtoolset.org/schemas/v4/thmutil">
6 <Font Id="0" Height="-12" Weight="500" Foreground="windowtext" Background="window">Segoe UI</Font>
7 <Font Id="1" Height="-24" Weight="500" Foreground="windowtext">Segoe UI</Font>
8 <Font Id="2" Height="-22" Weight="500" Foreground="graytext">Segoe UI</Font>
9 <Font Id="3" Height="-12" Weight="500" Foreground="windowtext" Background="window">Segoe UI</Font>
10
11 <Window Width="600" Height="450" HexStyle="100a0000" FontId="0" Caption="#(loc.Caption)">
12 <Page Name="Help">
13 <Label X="80" Y="11" Width="-11" Height="32" FontId="1" DisablePrefix="yes">#(loc.Title)</Label>
14 <ImageControl X="11" Y="11" Width="64" Height="64" ImageFile="logo.png"/>
15 <Label X="11" Y="80" Width="-11" Height="32" FontId="2" DisablePrefix="yes">#(loc.HelpHeader)</Label>
16 <Label X="11" Y="121" Width="-11" Height="-35" FontId="3" DisablePrefix="yes">#(loc.HelpText)</Label>
17 <Button Name="HelpCloseButton" X="-11" Y="-11" Width="75" Height="23" TabStop="yes" FontId="0">
18 <Text>#(loc.HelpCloseButton)</Text>
19 <CloseWindowAction />
20 </Button>
21 </Page>
22 <Page Name="Install">
23 <Label X="185" Y="11" Width="-11" Height="32" FontId="1" DisablePrefix="yes">#(loc.Title)</Label>
24 <ImageControl X="11" Y="11" Width="165" Height="400" ImageFile="logoside.png"/>
25 <Label X="185" Y="50" Width="-11" Height="32" FontId="2" DisablePrefix="yes">#(loc.InstallHeader)</Label>
26 <Label X="185" Y="91" Width="-11" Height="64" FontId="3" DisablePrefix="yes">#(loc.InstallMessage)</Label>
27 <Hypertext Name="EulaHyperlink" X="185" Y="-111" Width="-11" Height="17" TabStop="yes" FontId="3" HideWhenDisabled="yes">#(loc.InstallLicenseLinkText)</Hypertext>
28 <Label Name="InstallVersion" X="185" Y="-81" Width="-11" Height="17" FontId="3" DisablePrefix="yes" VisibleCondition="WixStdBAShowVersion">#(loc.InstallVersion)</Label>
29 <Checkbox Name="EulaAcceptCheckbox" X="185" Y="-51" Width="-11" Height="17" TabStop="yes" FontId="3" HideWhenDisabled="yes">#(loc.InstallAcceptCheckbox)</Checkbox>
30 <Button Name="OptionsButton" X="-171" Y="-11" Width="75" Height="23" TabStop="yes" FontId="0" VisibleCondition="NOT WixStdBASuppressOptionsUI">
31 <Text>#(loc.InstallOptionsButton)</Text>
32 <ChangePageAction Page="Options" />
33 </Button>
34 <Button Name="InstallButton" X="-91" Y="-11" Width="75" Height="23" TabStop="yes" FontId="0">#(loc.InstallInstallButton)</Button>
35 <Button Name="InstallCancelButton" X="-11" Y="-11" Width="75" Height="23" TabStop="yes" FontId="0">
36 <Text>#(loc.InstallCancelButton)</Text>
37 <CloseWindowAction />
38 </Button>
39 </Page>
40 <Page Name="Options">
41 <Label X="80" Y="11" Width="-11" Height="32" FontId="1" DisablePrefix="yes">#(loc.Title)</Label>
42 <ImageControl X="11" Y="11" Width="64" Height="64" ImageFile="logo.png"/>
43 <Label X="11" Y="80" Width="-11" Height="30" FontId="2" DisablePrefix="yes">#(loc.OptionsHeader)</Label>
44 <Label X="11" Y="121" Width="-11" Height="17" FontId="3">#(loc.OptionsLocationLabel)</Label>
45 <Editbox Name="InstallFolder" X="11" Y="143" Width="-91" Height="21" TabStop="yes" FontId="3" FileSystemAutoComplete="yes" />
46 <Button Name="BrowseButton" X="-11" Y="142" Width="75" Height="23" TabStop="yes" FontId="3">
47 <Text>#(loc.OptionsBrowseButton)</Text>
48 <BrowseDirectoryAction VariableName="InstallFolder" />
49 </Button>
50 <Button Name="OptionsOkButton" X="-91" Y="-11" Width="75" Height="23" TabStop="yes" FontId="0">
51 <Text>#(loc.OptionsOkButton)</Text>
52 <ChangePageAction Page="Install" />
53 </Button>
54 <Button Name="OptionsCancelButton" X="-11" Y="-11" Width="75" Height="23" TabStop="yes" FontId="0">
55 <Text>#(loc.OptionsCancelButton)</Text>
56 <ChangePageAction Page="Install" Cancel="yes" />
57 </Button>
58 </Page>
59 <Page Name="Progress">
60 <Label X="80" Y="11" Width="-11" Height="32" FontId="1" DisablePrefix="yes">#(loc.Title)</Label>
61 <ImageControl X="11" Y="11" Width="64" Height="64" ImageFile="logo.png"/>
62 <Label X="11" Y="80" Width="-11" Height="30" FontId="2" DisablePrefix="yes">#(loc.ProgressHeader)</Label>
63 <Label X="11" Y="141" Width="70" Height="17" FontId="3" DisablePrefix="yes">#(loc.ProgressLabel)</Label>
64 <Label Name="OverallProgressPackageText" X="85" Y="141" Width="-11" Height="17" FontId="3" DisablePrefix="yes">#(loc.OverallProgressPackageText)</Label>
65 <Progressbar Name="OverallCalculatedProgressbar" X="11" Y="163" Width="-11" Height="20" />
66 <Button Name="ProgressCancelButton" X="-11" Y="-11" Width="75" Height="23" TabStop="yes" FontId="0">#(loc.ProgressCancelButton)</Button>
67 </Page>
68 <Page Name="Modify">
69 <Label X="185" Y="11" Width="-11" Height="32" FontId="1" DisablePrefix="yes">#(loc.Title)</Label>
70 <ImageControl X="11" Y="11" Width="165" Height="400" ImageFile="logoside.png"/>
71 <Label X="185" Y="50" Width="-11" Height="30" FontId="2" DisablePrefix="yes">#(loc.ModifyHeader)</Label>
72 <Button Name="RepairButton" X="-171" Y="-11" Width="75" Height="23" TabStop="yes" FontId="0" HideWhenDisabled="yes">#(loc.ModifyRepairButton)</Button>
73 <Button Name="UninstallButton" X="-91" Y="-11" Width="75" Height="23" TabStop="yes" FontId="0">#(loc.ModifyUninstallButton)</Button>
74 <Button Name="ModifyCancelButton" X="-11" Y="-11" Width="75" Height="23" TabStop="yes" FontId="0">
75 <Text>#(loc.ModifyCancelButton)</Text>
76 <CloseWindowAction />
77 </Button>
78 </Page>
79 <Page Name="Success">
80 <Label X="185" Y="11" Width="-11" Height="32" FontId="1" DisablePrefix="yes">#(loc.Title)</Label>
81 <ImageControl X="11" Y="11" Width="165" Height="400" ImageFile="logoside.png"/>
82 <Label X="185" Y="50" Width="-11" Height="30" FontId="2" DisablePrefix="yes">
83 <Text>#(loc.SuccessHeader)</Text>
84 <Text Condition="WixBundleAction = 2">#(loc.SuccessLayoutHeader)</Text>
85 <Text Condition="WixBundleAction = 3">#(loc.SuccessUninstallHeader)</Text>
86 <Text Condition="WixBundleAction = 5">#(loc.SuccessInstallHeader)</Text>
87 <Text Condition="WixBundleAction = 7">#(loc.SuccessRepairHeader)</Text>
88 </Label>
89 <Button Name="LaunchButton" X="-91" Y="-11" Width="75" Height="23" TabStop="yes" FontId="0" HideWhenDisabled="yes">#(loc.SuccessLaunchButton)</Button>
90 <Label X="185" Y="-51" Width="400" Height="34" FontId="3" DisablePrefix="yes" VisibleCondition="WixStdBARestartRequired">
91 <Text>#(loc.SuccessRestartText)</Text>
92 <Text Condition="WixBundleAction = 3">#(loc.SuccessUninstallRestartText)</Text>
93 </Label>
94 <Button Name="SuccessRestartButton" X="-91" Y="-11" Width="75" Height="23" TabStop="yes" FontId="0" HideWhenDisabled="yes">#(loc.SuccessRestartButton)</Button>
95 <Button Name="SuccessCloseButton" X="-11" Y="-11" Width="75" Height="23" TabStop="yes" FontId="0">
96 <Text>#(loc.SuccessCloseButton)</Text>
97 <CloseWindowAction />
98 </Button>
99 </Page>
100 <Page Name="Failure">
101 <Label X="185" Y="11" Width="-11" Height="32" FontId="1" DisablePrefix="yes">#(loc.Title)</Label>
102 <ImageControl X="11" Y="11" Width="165" Height="400" ImageFile="logoside.png"/>
103 <Label X="185" Y="50" Width="-11" Height="30" FontId="2" DisablePrefix="yes">
104 <Text>#(loc.FailureHeader)</Text>
105 <Text Condition="WixBundleAction = 2">#(loc.FailureLayoutHeader)</Text>
106 <Text Condition="WixBundleAction = 3">#(loc.FailureUninstallHeader)</Text>
107 <Text Condition="WixBundleAction = 5">#(loc.FailureInstallHeader)</Text>
108 <Text Condition="WixBundleAction = 7">#(loc.FailureRepairHeader)</Text>
109 </Label>
110 <Hypertext Name="FailureLogFileLink" X="185" Y="121" Width="-11" Height="68" FontId="3" TabStop="yes" HideWhenDisabled="yes">#(loc.FailureHyperlinkLogText)</Hypertext>
111 <Hypertext Name="FailureMessageText" X="185" Y="-115" Width="-11" Height="80" FontId="3" TabStop="yes" HideWhenDisabled="yes" />
112 <Label X="185" Y="-57" Width="-11" Height="80" FontId="3" DisablePrefix="yes" VisibleCondition="WixStdBARestartRequired">#(loc.FailureRestartText)</Label>
113 <Button Name="FailureRestartButton" X="-91" Y="-11" Width="75" Height="23" TabStop="yes" FontId="0" HideWhenDisabled="yes">#(loc.FailureRestartButton)</Button>
114 <Button Name="FailureCloseButton" X="-11" Y="-11" Width="75" Height="23" TabStop="yes" FontId="0">
115 <Text>#(loc.FailureCloseButton)</Text>
116 <CloseWindowAction />
117 </Button>
118 </Page>
119 </Window>
120</Theme>
diff --git a/src/ext/Bal/wixstdba/Resources/HyperlinkTheme.wxl b/src/ext/Bal/wixstdba/Resources/HyperlinkTheme.wxl
new file mode 100644
index 00000000..e6e3f8ab
--- /dev/null
+++ b/src/ext/Bal/wixstdba/Resources/HyperlinkTheme.wxl
@@ -0,0 +1,61 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3
4
5<WixLocalization Culture="en-us" Language="1033" xmlns="http://wixtoolset.org/schemas/v4/wxl">
6 <String Id="Caption">[WixBundleName] Setup</String>
7 <String Id="Title">[WixBundleName]</String>
8 <String Id="InstallHeader">Welcome</String>
9 <String Id="InstallMessage">Setup will install [WixBundleName] on your computer. Click install to continue, options to set the install directory or Close to exit.</String>
10 <String Id="InstallVersion">Version [WixBundleVersion]</String>
11 <String Id="ConfirmCancelMessage">Are you sure you want to cancel?</String>
12 <String Id="ExecuteUpgradeRelatedBundleMessage">Previous version</String>
13 <String Id="HelpHeader">Setup Help</String>
14 <String Id="HelpText">/install | /repair | /uninstall | /layout [directory] - installs, repairs, uninstalls or
15 creates a complete local copy of the bundle in directory. Install is the default.
16
17/passive | /quiet - displays minimal UI with no prompts or displays no UI and
18 no prompts. By default UI and all prompts are displayed.
19
20/norestart - suppress any attempts to restart. By default UI will prompt before restart.
21/log log.txt - logs to a specific file. By default a log file is created in %TEMP%.</String>
22 <String Id="HelpCloseButton">&amp;Close</String>
23 <String Id="InstallLicenseLinkText">[WixBundleName] &lt;a href="#"&gt;license terms&lt;/a&gt;.</String>
24 <String Id="InstallAcceptCheckbox">I &amp;agree to the license terms and conditions</String>
25 <String Id="InstallOptionsButton">&amp;Options</String>
26 <String Id="InstallInstallButton">&amp;Install</String>
27 <String Id="InstallCancelButton">&amp;Cancel</String>
28 <String Id="OptionsHeader">Setup Options</String>
29 <String Id="OptionsLocationLabel">Install location:</String>
30 <String Id="OptionsBrowseButton">&amp;Browse</String>
31 <String Id="OptionsOkButton">&amp;OK</String>
32 <String Id="OptionsCancelButton">&amp;Cancel</String>
33 <String Id="ProgressHeader">Setup Progress</String>
34 <String Id="ProgressLabel">Processing:</String>
35 <String Id="OverallProgressPackageText">Initializing...</String>
36 <String Id="ProgressCancelButton">&amp;Cancel</String>
37 <String Id="ModifyHeader">Modify Setup</String>
38 <String Id="ModifyRepairButton">&amp;Repair</String>
39 <String Id="ModifyUninstallButton">&amp;Uninstall</String>
40 <String Id="ModifyCancelButton">&amp;Cancel</String>
41 <String Id="SuccessHeader">Setup Successful</String>
42 <String Id="SuccessInstallHeader">Installation Successfully Completed</String>
43 <String Id="SuccessLayoutHeader">Layout Successfully Completed</String>
44 <String Id="SuccessRepairHeader">Repair Successfully Completed</String>
45 <String Id="SuccessUninstallHeader">Uninstall Successfully Completed</String>
46 <String Id="SuccessLaunchButton">&amp;Launch</String>
47 <String Id="SuccessRestartText">You must restart your computer before you can use the software.</String>
48 <String Id="SuccessUninstallRestartText">You must restart your computer to complete the removal of the software.</String>
49 <String Id="SuccessRestartButton">&amp;Restart</String>
50 <String Id="SuccessCloseButton">&amp;Close</String>
51 <String Id="FailureHeader">Setup Failed</String>
52 <String Id="FailureInstallHeader">Setup Failed</String>
53 <String Id="FailureLayoutHeader">Layout Failed</String>
54 <String Id="FailureRepairHeader">Repair Failed</String>
55 <String Id="FailureUninstallHeader">Uninstall Failed</String>
56 <String Id="FailureHyperlinkLogText">One or more issues caused the setup to fail. Please fix the issues and then retry setup. For more information see the &lt;a href="#"&gt;log file&lt;/a&gt;.</String>
57 <String Id="FailureRestartText">You must restart your computer to complete the rollback of the software.</String>
58 <String Id="FailureRestartButton">&amp;Restart</String>
59 <String Id="FailureCloseButton">&amp;Close</String>
60 <String Id="ErrorFailNoActionReboot">No action was taken as a system reboot is required.</String>
61</WixLocalization>
diff --git a/src/ext/Bal/wixstdba/Resources/HyperlinkTheme.xml b/src/ext/Bal/wixstdba/Resources/HyperlinkTheme.xml
new file mode 100644
index 00000000..657db34b
--- /dev/null
+++ b/src/ext/Bal/wixstdba/Resources/HyperlinkTheme.xml
@@ -0,0 +1,106 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3
4
5<Theme xmlns="http://wixtoolset.org/schemas/v4/thmutil">
6 <Font Id="0" Height="-12" Weight="500" Foreground="windowtext" Background="window">Segoe UI</Font>
7 <Font Id="1" Height="-24" Weight="500" Foreground="windowtext">Segoe UI</Font>
8 <Font Id="2" Height="-22" Weight="500" Foreground="graytext">Segoe UI</Font>
9 <Font Id="3" Height="-12" Weight="500" Foreground="windowtext" Background="window">Segoe UI</Font>
10
11 <Window Width="485" Height="300" HexStyle="100a0000" FontId="0" Caption="#(loc.Caption)">
12 <ImageControl X="11" Y="11" Width="64" Height="64" ImageFile="logo.png" Visible="yes"/>
13 <Label X="80" Y="11" Width="-11" Height="64" FontId="1" Visible="yes" DisablePrefix="yes">#(loc.Title)</Label>
14
15 <Page Name="Help">
16 <Label X="11" Y="80" Width="-11" Height="30" FontId="2" DisablePrefix="yes">#(loc.HelpHeader)</Label>
17 <Label X="11" Y="112" Width="-11" Height="-35" FontId="3" DisablePrefix="yes">#(loc.HelpText)</Label>
18 <Button Name="HelpCloseButton" X="-11" Y="-11" Width="75" Height="23" TabStop="yes" FontId="0">
19 <Text>#(loc.HelpCloseButton)</Text>
20 <CloseWindowAction />
21 </Button>
22 </Page>
23 <Page Name="Install">
24 <Hypertext Name="EulaHyperlink" X="11" Y="121" Width="-11" Height="51" TabStop="yes" FontId="3" HideWhenDisabled="yes">#(loc.InstallLicenseLinkText)</Hypertext>
25 <Checkbox Name="EulaAcceptCheckbox" X="-11" Y="-41" Width="260" Height="17" TabStop="yes" FontId="3" HideWhenDisabled="yes">#(loc.InstallAcceptCheckbox)</Checkbox>
26 <Button Name="OptionsButton" X="-171" Y="-11" Width="75" Height="23" TabStop="yes" FontId="0" VisibleCondition="NOT WixStdBASuppressOptionsUI">
27 <Text>#(loc.InstallOptionsButton)</Text>
28 <ChangePageAction Page="Options" />
29 </Button>
30 <Button Name="InstallButton" X="-91" Y="-11" Width="75" Height="23" TabStop="yes" FontId="0">#(loc.InstallInstallButton)</Button>
31 <Button Name="InstallCancelButton" X="-11" Y="-11" Width="75" Height="23" TabStop="yes" FontId="0">
32 <Text>#(loc.InstallCancelButton)</Text>
33 <CloseWindowAction />
34 </Button>
35 </Page>
36 <Page Name="Options">
37 <Label X="11" Y="80" Width="-11" Height="30" FontId="2" DisablePrefix="yes">#(loc.OptionsHeader)</Label>
38 <Label X="11" Y="121" Width="-11" Height="17" FontId="3" DisablePrefix="yes">#(loc.OptionsLocationLabel)</Label>
39 <Editbox Name="InstallFolder" X="11" Y="143" Width="-91" Height="21" TabStop="yes" FontId="3" FileSystemAutoComplete="yes" />
40 <Button Name="BrowseButton" X="-11" Y="142" Width="75" Height="23" TabStop="yes" FontId="3">
41 <Text>#(loc.OptionsBrowseButton)</Text>
42 <BrowseDirectoryAction VariableName="InstallFolder" />
43 </Button>
44 <Button Name="OptionsOkButton" X="-91" Y="-11" Width="75" Height="23" TabStop="yes" FontId="0">
45 <Text>#(loc.OptionsOkButton)</Text>
46 <ChangePageAction Page="Install" />
47 </Button>
48 <Button Name="OptionsCancelButton" X="-11" Y="-11" Width="75" Height="23" TabStop="yes" FontId="0">
49 <Text>#(loc.OptionsCancelButton)</Text>
50 <ChangePageAction Page="Install" Cancel="yes" />
51 </Button>
52 </Page>
53 <Page Name="Progress">
54 <Label X="11" Y="80" Width="-11" Height="30" FontId="2" DisablePrefix="yes">#(loc.ProgressHeader)</Label>
55 <Label X="11" Y="121" Width="70" Height="17" FontId="3" DisablePrefix="yes">#(loc.ProgressLabel)</Label>
56 <Label Name="OverallProgressPackageText" X="85" Y="121" Width="-11" Height="17" FontId="3" DisablePrefix="yes">#(loc.OverallProgressPackageText)</Label>
57 <Progressbar Name="OverallCalculatedProgressbar" X="11" Y="143" Width="-11" Height="15" />
58 <Button Name="ProgressCancelButton" X="-11" Y="-11" Width="75" Height="23" TabStop="yes" FontId="0">#(loc.ProgressCancelButton)</Button>
59 </Page>
60 <Page Name="Modify">
61 <Label X="11" Y="80" Width="-11" Height="30" FontId="2" DisablePrefix="yes">#(loc.ModifyHeader)</Label>
62 <Button Name="RepairButton" X="-171" Y="-11" Width="75" Height="23" TabStop="yes" FontId="0" HideWhenDisabled="yes">#(loc.ModifyRepairButton)</Button>
63 <Button Name="UninstallButton" X="-91" Y="-11" Width="75" Height="23" TabStop="yes" FontId="0">#(loc.ModifyUninstallButton)</Button>
64 <Button Name="ModifyCancelButton" X="-11" Y="-11" Width="75" Height="23" TabStop="yes" FontId="0">
65 <Text>#(loc.ModifyCancelButton)</Text>
66 <CloseWindowAction />
67 </Button>
68 </Page>
69 <Page Name="Success">
70 <Label X="11" Y="80" Width="-11" Height="30" FontId="2" DisablePrefix="yes">
71 <Text>#(loc.SuccessHeader)</Text>
72 <Text Condition="WixBundleAction = 2">#(loc.SuccessLayoutHeader)</Text>
73 <Text Condition="WixBundleAction = 3">#(loc.SuccessUninstallHeader)</Text>
74 <Text Condition="WixBundleAction = 5">#(loc.SuccessInstallHeader)</Text>
75 <Text Condition="WixBundleAction = 7">#(loc.SuccessRepairHeader)</Text>
76 </Label>
77 <Button Name="LaunchButton" X="-91" Y="-11" Width="75" Height="23" TabStop="yes" FontId="0" HideWhenDisabled="yes">#(loc.SuccessLaunchButton)</Button>
78 <Label X="-11" Y="-51" Width="400" Height="34" FontId="3" DisablePrefix="yes" VisibleCondition="WixStdBARestartRequired">
79 <Text>#(loc.SuccessRestartText)</Text>
80 <Text Condition="WixBundleAction = 3">#(loc.SuccessUninstallRestartText)</Text>
81 </Label>
82 <Button Name="SuccessRestartButton" X="-91" Y="-11" Width="75" Height="23" TabStop="yes" FontId="0" HideWhenDisabled="yes">#(loc.SuccessRestartButton)</Button>
83 <Button Name="SuccessCloseButton" X="-11" Y="-11" Width="75" Height="23" TabStop="yes" FontId="0">
84 <Text>#(loc.SuccessCloseButton)</Text>
85 <CloseWindowAction />
86 </Button>
87 </Page>
88 <Page Name="Failure">
89 <Label X="11" Y="80" Width="-11" Height="30" FontId="2" DisablePrefix="yes">
90 <Text>#(loc.FailureHeader)</Text>
91 <Text Condition="WixBundleAction = 2">#(loc.FailureLayoutHeader)</Text>
92 <Text Condition="WixBundleAction = 3">#(loc.FailureUninstallHeader)</Text>
93 <Text Condition="WixBundleAction = 5">#(loc.FailureInstallHeader)</Text>
94 <Text Condition="WixBundleAction = 7">#(loc.FailureRepairHeader)</Text>
95 </Label>
96 <Hypertext Name="FailureLogFileLink" X="11" Y="121" Width="-11" Height="42" FontId="3" TabStop="yes" HideWhenDisabled="yes">#(loc.FailureHyperlinkLogText)</Hypertext>
97 <Hypertext Name="FailureMessageText" X="22" Y="163" Width="-11" Height="51" FontId="3" TabStop="yes" HideWhenDisabled="yes" />
98 <Label X="-11" Y="-51" Width="400" Height="34" FontId="3" DisablePrefix="yes" VisibleCondition="WixStdBARestartRequired">#(loc.FailureRestartText)</Label>
99 <Button Name="FailureRestartButton" X="-91" Y="-11" Width="75" Height="23" TabStop="yes" FontId="0" HideWhenDisabled="yes">#(loc.FailureRestartButton)</Button>
100 <Button Name="FailureCloseButton" X="-11" Y="-11" Width="75" Height="23" TabStop="yes" FontId="0">
101 <Text>#(loc.FailureCloseButton)</Text>
102 <CloseWindowAction />
103 </Button>
104 </Page>
105 </Window>
106</Theme>
diff --git a/src/ext/Bal/wixstdba/Resources/LoremIpsumLicense.rtf b/src/ext/Bal/wixstdba/Resources/LoremIpsumLicense.rtf
new file mode 100644
index 00000000..1a183236
--- /dev/null
+++ b/src/ext/Bal/wixstdba/Resources/LoremIpsumLicense.rtf
Binary files differ
diff --git a/src/ext/Bal/wixstdba/Resources/RtfLargeTheme.xml b/src/ext/Bal/wixstdba/Resources/RtfLargeTheme.xml
new file mode 100644
index 00000000..3571e13a
--- /dev/null
+++ b/src/ext/Bal/wixstdba/Resources/RtfLargeTheme.xml
@@ -0,0 +1,108 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3
4
5<Theme xmlns="http://wixtoolset.org/schemas/v4/thmutil">
6 <Font Id="0" Height="-12" Weight="500" Foreground="windowtext" Background="window">Segoe UI</Font>
7 <Font Id="1" Height="-24" Weight="500" Foreground="windowtext">Segoe UI</Font>
8 <Font Id="2" Height="-22" Weight="500" Foreground="graytext">Segoe UI</Font>
9 <Font Id="3" Height="-12" Weight="500" Foreground="windowtext" Background="window">Segoe UI</Font>
10
11 <Window Width="500" Height="390" HexStyle="100a0000" FontId="0" Caption="#(loc.Caption)">
12 <ImageControl X="11" Y="11" Width="64" Height="64" ImageFile="logo.png" Visible="yes"/>
13 <Label X="80" Y="11" Width="-11" Height="64" FontId="1" Visible="yes" DisablePrefix="yes">#(loc.Title)</Label>
14
15 <Page Name="Help">
16 <Label X="11" Y="80" Width="-11" Height="30" FontId="2" DisablePrefix="yes">#(loc.HelpHeader)</Label>
17 <Label X="11" Y="112" Width="-11" Height="-35" FontId="3" DisablePrefix="yes">#(loc.HelpText)</Label>
18 <Button Name="HelpCloseButton" X="-11" Y="-11" Width="75" Height="23" TabStop="yes" FontId="0">
19 <Text>#(loc.HelpCloseButton)</Text>
20 <CloseWindowAction />
21 </Button>
22 </Page>
23 <Page Name="Install">
24 <Label X="11" Y="80" Width="-11" Height="-70" TabStop="no" FontId="2" HexStyle="800000" DisablePrefix="yes" />
25 <Richedit Name="EulaRichedit" X="12" Y="81" Width="-12" Height="-71" TabStop="yes" FontId="0" />
26 <Label Name="InstallVersion" X="11" Y="-41" Width="210" Height="17" FontId="3" DisablePrefix="yes" VisibleCondition="WixStdBAShowVersion">#(loc.InstallVersion)</Label>
27 <Checkbox Name="EulaAcceptCheckbox" X="-11" Y="-41" Width="260" Height="17" TabStop="yes" FontId="3" HideWhenDisabled="yes">#(loc.InstallAcceptCheckbox)</Checkbox>
28 <Button Name="OptionsButton" X="-171" Y="-11" Width="75" Height="23" TabStop="yes" FontId="0" VisibleCondition="NOT WixStdBASuppressOptionsUI">
29 <Text>#(loc.InstallOptionsButton)</Text>
30 <ChangePageAction Page="Options" />
31 </Button>
32 <Button Name="InstallButton" X="-91" Y="-11" Width="75" Height="23" TabStop="yes" FontId="0">#(loc.InstallInstallButton)</Button>
33 <Button Name="InstallCancelButton" X="-11" Y="-11" Width="75" Height="23" TabStop="yes" FontId="0">
34 <Text>#(loc.InstallCancelButton)</Text>
35 <CloseWindowAction />
36 </Button>
37 </Page>
38 <Page Name="Options">
39 <Label X="11" Y="80" Width="-11" Height="30" FontId="2" DisablePrefix="yes">#(loc.OptionsHeader)</Label>
40 <Label X="11" Y="121" Width="-11" Height="17" FontId="3" DisablePrefix="yes">#(loc.OptionsLocationLabel)</Label>
41 <Editbox Name="InstallFolder" X="11" Y="143" Width="-91" Height="21" TabStop="yes" FontId="3" FileSystemAutoComplete="yes" />
42 <Button Name="BrowseButton" X="-11" Y="142" Width="75" Height="23" TabStop="yes" FontId="3">
43 <Text>#(loc.OptionsBrowseButton)</Text>
44 <BrowseDirectoryAction VariableName="InstallFolder" />
45 </Button>
46 <Button Name="OptionsOkButton" X="-91" Y="-11" Width="75" Height="23" TabStop="yes" FontId="0">
47 <Text>#(loc.OptionsOkButton)</Text>
48 <ChangePageAction Page="Install" />
49 </Button>
50 <Button Name="OptionsCancelButton" X="-11" Y="-11" Width="75" Height="23" TabStop="yes" FontId="0">
51 <Text>#(loc.OptionsCancelButton)</Text>
52 <ChangePageAction Page="Install" Cancel="yes" />
53 </Button>
54 </Page>
55 <Page Name="Progress">
56 <Label X="11" Y="80" Width="-11" Height="30" FontId="2" DisablePrefix="yes">#(loc.ProgressHeader)</Label>
57 <Label X="11" Y="121" Width="70" Height="17" FontId="3" DisablePrefix="yes">#(loc.ProgressLabel)</Label>
58 <Label Name="OverallProgressPackageText" X="85" Y="121" Width="-11" Height="17" FontId="3" DisablePrefix="yes">#(loc.OverallProgressPackageText)</Label>
59 <Progressbar Name="OverallCalculatedProgressbar" X="11" Y="143" Width="-11" Height="15" />
60 <Button Name="ProgressCancelButton" X="-11" Y="-11" Width="75" Height="23" TabStop="yes" FontId="0">#(loc.ProgressCancelButton)</Button>
61 </Page>
62 <Page Name="Modify">
63 <Label X="11" Y="80" Width="-11" Height="30" FontId="2" DisablePrefix="yes">#(loc.ModifyHeader)</Label>
64 <Button Name="RepairButton" X="-171" Y="-11" Width="75" Height="23" TabStop="yes" FontId="0" HideWhenDisabled="yes">#(loc.ModifyRepairButton)</Button>
65 <Button Name="UninstallButton" X="-91" Y="-11" Width="75" Height="23" TabStop="yes" FontId="0">#(loc.ModifyUninstallButton)</Button>
66 <Button Name="ModifyCancelButton" X="-11" Y="-11" Width="75" Height="23" TabStop="yes" FontId="0">
67 <Text>#(loc.ModifyCancelButton)</Text>
68 <CloseWindowAction />
69 </Button>
70 </Page>
71 <Page Name="Success">
72 <Label X="11" Y="80" Width="-11" Height="30" FontId="2" DisablePrefix="yes">
73 <Text>#(loc.SuccessHeader)</Text>
74 <Text Condition="WixBundleAction = 2">#(loc.SuccessLayoutHeader)</Text>
75 <Text Condition="WixBundleAction = 3">#(loc.SuccessUninstallHeader)</Text>
76 <Text Condition="WixBundleAction = 5">#(loc.SuccessInstallHeader)</Text>
77 <Text Condition="WixBundleAction = 7">#(loc.SuccessRepairHeader)</Text>
78 </Label>
79 <Button Name="LaunchButton" X="-91" Y="-11" Width="75" Height="23" TabStop="yes" FontId="0" HideWhenDisabled="yes">#(loc.SuccessLaunchButton)</Button>
80 <Label X="-11" Y="-51" Width="400" Height="34" FontId="3" DisablePrefix="yes" VisibleCondition="WixStdBARestartRequired">
81 <Text>#(loc.SuccessRestartText)</Text>
82 <Text Condition="WixBundleAction = 3">#(loc.SuccessUninstallRestartText)</Text>
83 </Label>
84 <Button Name="SuccessRestartButton" X="-91" Y="-11" Width="75" Height="23" TabStop="yes" FontId="0" HideWhenDisabled="yes">#(loc.SuccessRestartButton)</Button>
85 <Button Name="SuccessCloseButton" X="-11" Y="-11" Width="75" Height="23" TabStop="yes" FontId="0">
86 <Text>#(loc.SuccessCloseButton)</Text>
87 <CloseWindowAction />
88 </Button>
89 </Page>
90 <Page Name="Failure">
91 <Label X="11" Y="80" Width="-11" Height="30" FontId="2" DisablePrefix="yes">
92 <Text>#(loc.FailureHeader)</Text>
93 <Text Condition="WixBundleAction = 2">#(loc.FailureLayoutHeader)</Text>
94 <Text Condition="WixBundleAction = 3">#(loc.FailureUninstallHeader)</Text>
95 <Text Condition="WixBundleAction = 5">#(loc.FailureInstallHeader)</Text>
96 <Text Condition="WixBundleAction = 7">#(loc.FailureRepairHeader)</Text>
97 </Label>
98 <Hypertext Name="FailureLogFileLink" X="11" Y="121" Width="-11" Height="42" FontId="3" TabStop="yes" HideWhenDisabled="yes">#(loc.FailureHyperlinkLogText)</Hypertext>
99 <Hypertext Name="FailureMessageText" X="22" Y="163" Width="-11" Height="51" FontId="3" TabStop="yes" HideWhenDisabled="yes" />
100 <Label Name="FailureRestartText" X="-11" Y="-51" Width="400" Height="34" FontId="3" HideWhenDisabled="yes" DisablePrefix="yes">#(loc.FailureRestartText)</Label>
101 <Button Name="FailureRestartButton" X="-91" Y="-11" Width="75" Height="23" TabStop="yes" FontId="0" HideWhenDisabled="yes">#(loc.FailureRestartButton)</Button>
102 <Button Name="FailureCloseButton" X="-11" Y="-11" Width="75" Height="23" TabStop="yes" FontId="0">
103 <Text>#(loc.FailureCloseButton)</Text>
104 <CloseWindowAction />
105 </Button>
106 </Page>
107 </Window>
108</Theme>
diff --git a/src/ext/Bal/wixstdba/Resources/RtfTheme.wxl b/src/ext/Bal/wixstdba/Resources/RtfTheme.wxl
new file mode 100644
index 00000000..f73fb994
--- /dev/null
+++ b/src/ext/Bal/wixstdba/Resources/RtfTheme.wxl
@@ -0,0 +1,58 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3
4
5<WixLocalization Culture="en-us" Language="1033" xmlns="http://wixtoolset.org/schemas/v4/wxl">
6 <String Id="Caption">[WixBundleName] Setup</String>
7 <String Id="Title">[WixBundleName]</String>
8 <String Id="InstallVersion">Version [WixBundleVersion]</String>
9 <String Id="ConfirmCancelMessage">Are you sure you want to cancel?</String>
10 <String Id="ExecuteUpgradeRelatedBundleMessage">Previous version</String>
11 <String Id="HelpHeader">Setup Help</String>
12 <String Id="HelpText">/install | /repair | /uninstall | /layout [directory] - installs, repairs, uninstalls or
13 creates a complete local copy of the bundle in directory. Install is the default.
14
15/passive | /quiet - displays minimal UI with no prompts or displays no UI and
16 no prompts. By default UI and all prompts are displayed.
17
18/norestart - suppress any attempts to restart. By default UI will prompt before restart.
19/log log.txt - logs to a specific file. By default a log file is created in %TEMP%.</String>
20 <String Id="HelpCloseButton">&amp;Close</String>
21 <String Id="InstallAcceptCheckbox">I &amp;agree to the license terms and conditions</String>
22 <String Id="InstallOptionsButton">&amp;Options</String>
23 <String Id="InstallInstallButton">&amp;Install</String>
24 <String Id="InstallCancelButton">&amp;Cancel</String>
25 <String Id="OptionsHeader">Setup Options</String>
26 <String Id="OptionsLocationLabel">Install location:</String>
27 <String Id="OptionsBrowseButton">&amp;Browse</String>
28 <String Id="OptionsOkButton">&amp;OK</String>
29 <String Id="OptionsCancelButton">&amp;Cancel</String>
30 <String Id="ProgressHeader">Setup Progress</String>
31 <String Id="ProgressLabel">Processing:</String>
32 <String Id="OverallProgressPackageText">Initializing...</String>
33 <String Id="ProgressCancelButton">&amp;Cancel</String>
34 <String Id="ModifyHeader">Modify Setup</String>
35 <String Id="ModifyRepairButton">&amp;Repair</String>
36 <String Id="ModifyUninstallButton">&amp;Uninstall</String>
37 <String Id="ModifyCancelButton">&amp;Cancel</String>
38 <String Id="SuccessHeader">Setup Successful</String>
39 <String Id="SuccessInstallHeader">Installation Successfully Completed</String>
40 <String Id="SuccessLayoutHeader">Layout Successfully Completed</String>
41 <String Id="SuccessRepairHeader">Repair Successfully Completed</String>
42 <String Id="SuccessUninstallHeader">Uninstall Successfully Completed</String>
43 <String Id="SuccessLaunchButton">&amp;Launch</String>
44 <String Id="SuccessRestartText">You must restart your computer before you can use the software.</String>
45 <String Id="SuccessUninstallRestartText">You must restart your computer to complete the removal of the software.</String>
46 <String Id="SuccessRestartButton">&amp;Restart</String>
47 <String Id="SuccessCloseButton">&amp;Close</String>
48 <String Id="FailureHeader">Setup Failed</String>
49 <String Id="FailureInstallHeader">Setup Failed</String>
50 <String Id="FailureLayoutHeader">Layout Failed</String>
51 <String Id="FailureRepairHeader">Repair Failed</String>
52 <String Id="FailureUninstallHeader">Uninstall Failed</String>
53 <String Id="FailureHyperlinkLogText">One or more issues caused the setup to fail. Please fix the issues and then retry setup. For more information see the &lt;a href="#"&gt;log file&lt;/a&gt;.</String>
54 <String Id="FailureRestartText">You must restart your computer to complete the rollback of the software.</String>
55 <String Id="FailureRestartButton">&amp;Restart</String>
56 <String Id="FailureCloseButton">&amp;Close</String>
57 <String Id="ErrorFailNoActionReboot">No action was taken as a system reboot is required.</String>
58</WixLocalization>
diff --git a/src/ext/Bal/wixstdba/Resources/RtfTheme.xml b/src/ext/Bal/wixstdba/Resources/RtfTheme.xml
new file mode 100644
index 00000000..d6535bac
--- /dev/null
+++ b/src/ext/Bal/wixstdba/Resources/RtfTheme.xml
@@ -0,0 +1,106 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3
4
5<Theme xmlns="http://wixtoolset.org/schemas/v4/thmutil">
6 <Font Id="0" Height="-12" Weight="500" Foreground="windowtext" Background="window">Segoe UI</Font>
7 <Font Id="1" Height="-24" Weight="500" Foreground="windowtext">Segoe UI</Font>
8 <Font Id="2" Height="-22" Weight="500" Foreground="graytext">Segoe UI</Font>
9 <Font Id="3" Height="-12" Weight="500" Foreground="windowtext" Background="window">Segoe UI</Font>
10
11 <Window Width="485" Height="300" HexStyle="100a0000" FontId="0" Caption="#(loc.Caption)">
12 <ImageControl X="11" Y="11" Width="64" Height="64" ImageFile="logo.png" Visible="yes"/>
13 <Label X="80" Y="11" Width="-11" Height="64" FontId="1" Visible="yes" DisablePrefix="yes">#(loc.Title)</Label>
14
15 <Page Name="Help">
16 <Label X="11" Y="80" Width="-11" Height="30" FontId="2" DisablePrefix="yes">#(loc.HelpHeader)</Label>
17 <Label X="11" Y="112" Width="-11" Height="-35" FontId="3" DisablePrefix="yes">#(loc.HelpText)</Label>
18 <Button Name="HelpCloseButton" X="-11" Y="-11" Width="75" Height="23" TabStop="yes" FontId="0">
19 <Text>#(loc.HelpCloseButton)</Text>
20 <CloseWindowAction />
21 </Button>
22 </Page>
23 <Page Name="Install">
24 <Richedit Name="EulaRichedit" X="11" Y="80" Width="-11" Height="-70" TabStop="yes" FontId="0" HexStyle="800000" />
25 <Checkbox Name="EulaAcceptCheckbox" X="-11" Y="-41" Width="260" Height="17" TabStop="yes" FontId="3" HideWhenDisabled="yes">#(loc.InstallAcceptCheckbox)</Checkbox>
26 <Button Name="OptionsButton" X="-171" Y="-11" Width="75" Height="23" TabStop="yes" FontId="0" VisibleCondition="NOT WixStdBASuppressOptionsUI">
27 <Text>#(loc.InstallOptionsButton)</Text>
28 <ChangePageAction Page="Options" />
29 </Button>
30 <Button Name="InstallButton" X="-91" Y="-11" Width="75" Height="23" TabStop="yes" FontId="0">#(loc.InstallInstallButton)</Button>
31 <Button Name="InstallCancelButton" X="-11" Y="-11" Width="75" Height="23" TabStop="yes" FontId="0">
32 <Text>#(loc.InstallCancelButton)</Text>
33 <CloseWindowAction />
34 </Button>
35 </Page>
36 <Page Name="Options">
37 <Label X="11" Y="80" Width="-11" Height="30" FontId="2" DisablePrefix="yes">#(loc.OptionsHeader)</Label>
38 <Label X="11" Y="121" Width="-11" Height="17" FontId="3" DisablePrefix="yes">#(loc.OptionsLocationLabel)</Label>
39 <Editbox Name="InstallFolder" X="11" Y="143" Width="-91" Height="21" TabStop="yes" FontId="3" FileSystemAutoComplete="yes" />
40 <Button Name="BrowseButton" X="-11" Y="142" Width="75" Height="23" TabStop="yes" FontId="3">
41 <Text>#(loc.OptionsBrowseButton)</Text>
42 <BrowseDirectoryAction VariableName="InstallFolder" />
43 </Button>
44 <Button Name="OptionsOkButton" X="-91" Y="-11" Width="75" Height="23" TabStop="yes" FontId="0">
45 <Text>#(loc.OptionsOkButton)</Text>
46 <ChangePageAction Page="Install" />
47 </Button>
48 <Button Name="OptionsCancelButton" X="-11" Y="-11" Width="75" Height="23" TabStop="yes" FontId="0">
49 <Text>#(loc.OptionsCancelButton)</Text>
50 <ChangePageAction Page="Install" Cancel="yes" />
51 </Button>
52 </Page>
53 <Page Name="Progress">
54 <Label X="11" Y="80" Width="-11" Height="30" FontId="2" DisablePrefix="yes">#(loc.ProgressHeader)</Label>
55 <Label X="11" Y="121" Width="70" Height="17" FontId="3" DisablePrefix="yes">#(loc.ProgressLabel)</Label>
56 <Label Name="OverallProgressPackageText" X="85" Y="121" Width="-11" Height="17" FontId="3" DisablePrefix="yes">#(loc.OverallProgressPackageText)</Label>
57 <Progressbar Name="OverallCalculatedProgressbar" X="11" Y="143" Width="-11" Height="15" />
58 <Button Name="ProgressCancelButton" X="-11" Y="-11" Width="75" Height="23" TabStop="yes" FontId="0">#(loc.ProgressCancelButton)</Button>
59 </Page>
60 <Page Name="Modify">
61 <Label X="11" Y="80" Width="-11" Height="30" FontId="2" DisablePrefix="yes">#(loc.ModifyHeader)</Label>
62 <Button Name="RepairButton" X="-171" Y="-11" Width="75" Height="23" TabStop="yes" FontId="0" HideWhenDisabled="yes">#(loc.ModifyRepairButton)</Button>
63 <Button Name="UninstallButton" X="-91" Y="-11" Width="75" Height="23" TabStop="yes" FontId="0">#(loc.ModifyUninstallButton)</Button>
64 <Button Name="ModifyCancelButton" X="-11" Y="-11" Width="75" Height="23" TabStop="yes" FontId="0">
65 <Text>#(loc.ModifyCancelButton)</Text>
66 <CloseWindowAction />
67 </Button>
68 </Page>
69 <Page Name="Success">
70 <Label X="11" Y="80" Width="-11" Height="30" FontId="2" DisablePrefix="yes">
71 <Text>#(loc.SuccessHeader)</Text>
72 <Text Condition="WixBundleAction = 2">#(loc.SuccessLayoutHeader)</Text>
73 <Text Condition="WixBundleAction = 3">#(loc.SuccessUninstallHeader)</Text>
74 <Text Condition="WixBundleAction = 5">#(loc.SuccessInstallHeader)</Text>
75 <Text Condition="WixBundleAction = 7">#(loc.SuccessRepairHeader)</Text>
76 </Label>
77 <Button Name="LaunchButton" X="-91" Y="-11" Width="75" Height="23" TabStop="yes" FontId="0" HideWhenDisabled="yes">#(loc.SuccessLaunchButton)</Button>
78 <Label X="-11" Y="-51" Width="400" Height="34" FontId="3" DisablePrefix="yes" VisibleCondition="WixStdBARestartRequired">
79 <Text>#(loc.SuccessRestartText)</Text>
80 <Text Condition="WixBundleAction = 3">#(loc.SuccessUninstallRestartText)</Text>
81 </Label>
82 <Button Name="SuccessRestartButton" X="-91" Y="-11" Width="75" Height="23" TabStop="yes" FontId="0" HideWhenDisabled="yes">#(loc.SuccessRestartButton)</Button>
83 <Button Name="SuccessCloseButton" X="-11" Y="-11" Width="75" Height="23" TabStop="yes" FontId="0">
84 <Text>#(loc.SuccessCloseButton)</Text>
85 <CloseWindowAction />
86 </Button>
87 </Page>
88 <Page Name="Failure">
89 <Label X="11" Y="80" Width="-11" Height="30" FontId="2" DisablePrefix="yes">
90 <Text>#(loc.FailureHeader)</Text>
91 <Text Condition="WixBundleAction = 2">#(loc.FailureLayoutHeader)</Text>
92 <Text Condition="WixBundleAction = 3">#(loc.FailureUninstallHeader)</Text>
93 <Text Condition="WixBundleAction = 5">#(loc.FailureInstallHeader)</Text>
94 <Text Condition="WixBundleAction = 7">#(loc.FailureRepairHeader)</Text>
95 </Label>
96 <Hypertext Name="FailureLogFileLink" X="11" Y="121" Width="-11" Height="42" FontId="3" TabStop="yes" HideWhenDisabled="yes">#(loc.FailureHyperlinkLogText)</Hypertext>
97 <Hypertext Name="FailureMessageText" X="22" Y="163" Width="-11" Height="51" FontId="3" TabStop="yes" HideWhenDisabled="yes" />
98 <Label X="-11" Y="-51" Width="400" Height="34" FontId="3" DisablePrefix="yes" VisibleCondition="WixStdBARestartRequired">#(loc.FailureRestartText)</Label>
99 <Button Name="FailureRestartButton" X="-91" Y="-11" Width="75" Height="23" TabStop="yes" FontId="0" HideWhenDisabled="yes">#(loc.FailureRestartButton)</Button>
100 <Button Name="FailureCloseButton" X="-11" Y="-11" Width="75" Height="23" TabStop="yes" FontId="0">
101 <Text>#(loc.FailureCloseButton)</Text>
102 <CloseWindowAction />
103 </Button>
104 </Page>
105 </Window>
106</Theme>
diff --git a/src/ext/Bal/wixstdba/Resources/dncpreq.thm b/src/ext/Bal/wixstdba/Resources/dncpreq.thm
new file mode 100644
index 00000000..4ae61819
--- /dev/null
+++ b/src/ext/Bal/wixstdba/Resources/dncpreq.thm
@@ -0,0 +1,47 @@
1<?xml version="1.0" encoding="utf-8"?>
2<Theme xmlns="http://wixtoolset.org/schemas/v4/thmutil">
3 <Font Id="0" Height="-12" Weight="500" Foreground="windowtext" Background="window">Segoe UI</Font>
4 <Font Id="1" Height="-24" Weight="500" Foreground="windowtext">Segoe UI</Font>
5 <Font Id="2" Height="-22" Weight="500" Foreground="graytext">Segoe UI</Font>
6 <Font Id="3" Height="-12" Weight="500" Foreground="windowtext" Background="window">Segoe UI</Font>
7
8 <Window Width="485" Height="300" HexStyle="100a0000" FontId="0" Caption="#(loc.Caption)">
9 <ImageControl X="11" Y="11" Width="64" Height="64" ImageFile="mbapreq.png" Visible="yes"/>
10 <Label X="80" Y="11" Width="-11" Height="96" FontId="1" Visible="yes" DisablePrefix="yes">#(loc.Title)</Label>
11
12 <Page Name="Help">
13 <Label X="11" Y="112" Width="-11" Height="30" FontId="2" DisablePrefix="yes">#(loc.HelpHeader)</Label>
14 <Label X="11" Y="153" Width="-11" Height="-35" FontId="3" DisablePrefix="yes">#(loc.HelpText)</Label>
15 <Button Name="HelpCloseButton" X="-11" Y="-11" Width="75" Height="23" TabStop="yes" FontId="0">
16 <Text>#(loc.HelpCloseButton)</Text>
17 <CloseWindowAction />
18 </Button>
19 </Page>
20 <Page Name="Install">
21 <Hypertext Name="EulaHyperlink" X="11" Y="121" Width="-11" Height="34" TabStop="yes" FontId="3">#(loc.InstallLicenseTerms)</Hypertext>
22 <Button Name="InstallButton" X="-91" Y="-11" Width="130" Height="23" TabStop="yes" FontId="0">#(loc.InstallAcceptAndInstallButton)</Button>
23 <Button Name="InstallDeclineButton" X="-11" Y="-11" Width="75" Height="23" TabStop="yes" FontId="0">
24 <Text>#(loc.InstallDeclineButton)</Text>
25 <CloseWindowAction />
26 </Button>
27 </Page>
28 <Page Name="Progress">
29 <Label X="11" Y="112" Width="-11" Height="30" FontId="2" DisablePrefix="yes">#(loc.ProgressHeader)</Label>
30 <Label X="11" Y="153" Width="70" Height="17" FontId="3" DisablePrefix="yes">#(loc.ProgressLabel)</Label>
31 <Label Name="OverallProgressPackageText" X="85" Y="153" Width="-11" Height="17" FontId="3" DisablePrefix="yes">[ProgressPackageName]</Label>
32 <Progressbar Name="OverallCalculatedProgressbar" X="11" Y="175" Width="-11" Height="15" />
33 <Button Name="ProgressCancelButton" X="-11" Y="-11" Width="75" Height="23" TabStop="yes" FontId="0">#(loc.ProgressCancelButton)</Button>
34 </Page>
35 <Page Name="Failure">
36 <Label X="11" Y="112" Width="-11" Height="30" FontId="2" DisablePrefix="yes">#(loc.FailureHeader)</Label>
37 <Hypertext Name="FailureLogFileLink" X="11" Y="153" Width="-11" Height="51" FontId="3" TabStop="yes" HideWhenDisabled="yes">#(loc.FailureLogLinkText)</Hypertext>
38 <Hypertext Name="FailureMessageText" X="22" Y="190" Width="-11" Height="51" FontId="3" TabStop="yes" HideWhenDisabled="yes"/>
39 <Label X="-11" Y="-20" Width="400" Height="34" FontId="3" DisablePrefix="yes" VisibleCondition="WixStdBARestartRequired">#(loc.FailureRestartText)</Label>
40 <Button Name="FailureRestartButton" X="-91" Y="-11" Width="75" Height="23" TabStop="yes" FontId="0" HideWhenDisabled="yes">#(loc.FailureRestartButton)</Button>
41 <Button Name="FailureCloseButton" X="-11" Y="-11" Width="75" Height="23" TabStop="yes" FontId="0">
42 <Text>#(loc.FailureCloseButton)</Text>
43 <CloseWindowAction />
44 </Button>
45 </Page>
46 </Window>
47</Theme>
diff --git a/src/ext/Bal/wixstdba/Resources/dncpreq.wxl b/src/ext/Bal/wixstdba/Resources/dncpreq.wxl
new file mode 100644
index 00000000..d6b73b5f
--- /dev/null
+++ b/src/ext/Bal/wixstdba/Resources/dncpreq.wxl
@@ -0,0 +1,29 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3
4
5<WixLocalization Culture="en-us" Language="1033" xmlns="http://wixtoolset.org/schemas/v4/wxl">
6 <String Id="Caption">[WixBundleName] Setup</String>
7 <String Id="Title">Microsoft .NET Core required for [WixBundleName] setup</String>
8 <String Id="ConfirmCancelMessage">Are you sure you want to cancel?</String>
9 <String Id="HelpHeader">Setup Help</String>
10 <String Id="HelpText">/passive | /quiet - displays minimal UI with no prompts or displays no UI and
11 no prompts. By default UI and all prompts are displayed.
12
13/norestart - suppress any attempts to restart. By default UI will prompt before restart.
14/log log.txt - logs to a specific file. By default a log file is created in %TEMP%.</String>
15 <String Id="HelpCloseButton">&amp;Close</String>
16 <String Id="InstallLicenseTerms">Click the "Accept and Install" button to accept the Microsoft .NET Core &lt;a href="#"&gt;license terms&lt;/a&gt;.</String>
17 <String Id="InstallAcceptAndInstallButton">&amp;Accept and Install</String>
18 <String Id="InstallDeclineButton">&amp;Decline</String>
19 <String Id="ProgressHeader">Setup Progress</String>
20 <String Id="ProgressLabel">Processing:</String>
21 <String Id="ProgressCancelButton">&amp;Cancel</String>
22 <String Id="FailureHeader">Setup Failed</String>
23 <String Id="FailureLogLinkText">One or more issues caused the setup to fail. Please fix the issues and then retry setup. For more information see the &lt;a href="#"&gt;log file&lt;/a&gt;.</String>
24 <String Id="FailureRestartText">You must restart your computer to complete the rollback of the software.</String>
25 <String Id="FailureRestartButton">&amp;Restart</String>
26 <String Id="FailureCloseButton">&amp;Close</String>
27 <String Id="SCDRUNTIMEFAILUREErrorMessage">[WixBundleName] cannot run on this machine. Install the latest updates and/or the latest OS to run in a supported environment.</String>
28 <String Id="ErrorFailNoActionReboot">No action was taken as a system reboot is required.</String>
29</WixLocalization>
diff --git a/src/ext/Bal/wixstdba/Resources/logo.png b/src/ext/Bal/wixstdba/Resources/logo.png
new file mode 100644
index 00000000..7adc6e11
--- /dev/null
+++ b/src/ext/Bal/wixstdba/Resources/logo.png
Binary files differ
diff --git a/src/ext/Bal/wixstdba/Resources/logoSide.png b/src/ext/Bal/wixstdba/Resources/logoSide.png
new file mode 100644
index 00000000..308841c5
--- /dev/null
+++ b/src/ext/Bal/wixstdba/Resources/logoSide.png
Binary files differ
diff --git a/src/ext/Bal/wixstdba/Resources/mbapreq.png b/src/ext/Bal/wixstdba/Resources/mbapreq.png
new file mode 100644
index 00000000..c6e9527b
--- /dev/null
+++ b/src/ext/Bal/wixstdba/Resources/mbapreq.png
Binary files differ
diff --git a/src/ext/Bal/wixstdba/Resources/mbapreq.thm b/src/ext/Bal/wixstdba/Resources/mbapreq.thm
new file mode 100644
index 00000000..4ae61819
--- /dev/null
+++ b/src/ext/Bal/wixstdba/Resources/mbapreq.thm
@@ -0,0 +1,47 @@
1<?xml version="1.0" encoding="utf-8"?>
2<Theme xmlns="http://wixtoolset.org/schemas/v4/thmutil">
3 <Font Id="0" Height="-12" Weight="500" Foreground="windowtext" Background="window">Segoe UI</Font>
4 <Font Id="1" Height="-24" Weight="500" Foreground="windowtext">Segoe UI</Font>
5 <Font Id="2" Height="-22" Weight="500" Foreground="graytext">Segoe UI</Font>
6 <Font Id="3" Height="-12" Weight="500" Foreground="windowtext" Background="window">Segoe UI</Font>
7
8 <Window Width="485" Height="300" HexStyle="100a0000" FontId="0" Caption="#(loc.Caption)">
9 <ImageControl X="11" Y="11" Width="64" Height="64" ImageFile="mbapreq.png" Visible="yes"/>
10 <Label X="80" Y="11" Width="-11" Height="96" FontId="1" Visible="yes" DisablePrefix="yes">#(loc.Title)</Label>
11
12 <Page Name="Help">
13 <Label X="11" Y="112" Width="-11" Height="30" FontId="2" DisablePrefix="yes">#(loc.HelpHeader)</Label>
14 <Label X="11" Y="153" Width="-11" Height="-35" FontId="3" DisablePrefix="yes">#(loc.HelpText)</Label>
15 <Button Name="HelpCloseButton" X="-11" Y="-11" Width="75" Height="23" TabStop="yes" FontId="0">
16 <Text>#(loc.HelpCloseButton)</Text>
17 <CloseWindowAction />
18 </Button>
19 </Page>
20 <Page Name="Install">
21 <Hypertext Name="EulaHyperlink" X="11" Y="121" Width="-11" Height="34" TabStop="yes" FontId="3">#(loc.InstallLicenseTerms)</Hypertext>
22 <Button Name="InstallButton" X="-91" Y="-11" Width="130" Height="23" TabStop="yes" FontId="0">#(loc.InstallAcceptAndInstallButton)</Button>
23 <Button Name="InstallDeclineButton" X="-11" Y="-11" Width="75" Height="23" TabStop="yes" FontId="0">
24 <Text>#(loc.InstallDeclineButton)</Text>
25 <CloseWindowAction />
26 </Button>
27 </Page>
28 <Page Name="Progress">
29 <Label X="11" Y="112" Width="-11" Height="30" FontId="2" DisablePrefix="yes">#(loc.ProgressHeader)</Label>
30 <Label X="11" Y="153" Width="70" Height="17" FontId="3" DisablePrefix="yes">#(loc.ProgressLabel)</Label>
31 <Label Name="OverallProgressPackageText" X="85" Y="153" Width="-11" Height="17" FontId="3" DisablePrefix="yes">[ProgressPackageName]</Label>
32 <Progressbar Name="OverallCalculatedProgressbar" X="11" Y="175" Width="-11" Height="15" />
33 <Button Name="ProgressCancelButton" X="-11" Y="-11" Width="75" Height="23" TabStop="yes" FontId="0">#(loc.ProgressCancelButton)</Button>
34 </Page>
35 <Page Name="Failure">
36 <Label X="11" Y="112" Width="-11" Height="30" FontId="2" DisablePrefix="yes">#(loc.FailureHeader)</Label>
37 <Hypertext Name="FailureLogFileLink" X="11" Y="153" Width="-11" Height="51" FontId="3" TabStop="yes" HideWhenDisabled="yes">#(loc.FailureLogLinkText)</Hypertext>
38 <Hypertext Name="FailureMessageText" X="22" Y="190" Width="-11" Height="51" FontId="3" TabStop="yes" HideWhenDisabled="yes"/>
39 <Label X="-11" Y="-20" Width="400" Height="34" FontId="3" DisablePrefix="yes" VisibleCondition="WixStdBARestartRequired">#(loc.FailureRestartText)</Label>
40 <Button Name="FailureRestartButton" X="-91" Y="-11" Width="75" Height="23" TabStop="yes" FontId="0" HideWhenDisabled="yes">#(loc.FailureRestartButton)</Button>
41 <Button Name="FailureCloseButton" X="-11" Y="-11" Width="75" Height="23" TabStop="yes" FontId="0">
42 <Text>#(loc.FailureCloseButton)</Text>
43 <CloseWindowAction />
44 </Button>
45 </Page>
46 </Window>
47</Theme>
diff --git a/src/ext/Bal/wixstdba/Resources/mbapreq.wxl b/src/ext/Bal/wixstdba/Resources/mbapreq.wxl
new file mode 100644
index 00000000..95e3a6ae
--- /dev/null
+++ b/src/ext/Bal/wixstdba/Resources/mbapreq.wxl
@@ -0,0 +1,29 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3
4
5<WixLocalization Culture="en-us" Language="1033" xmlns="http://wixtoolset.org/schemas/v4/wxl">
6 <String Id="Caption">[WixBundleName] Setup</String>
7 <String Id="Title">Microsoft .NET Framework required for [WixBundleName] setup</String>
8 <String Id="ConfirmCancelMessage">Are you sure you want to cancel?</String>
9 <String Id="HelpHeader">Setup Help</String>
10 <String Id="HelpText">/passive | /quiet - displays minimal UI with no prompts or displays no UI and
11 no prompts. By default UI and all prompts are displayed.
12
13/norestart - suppress any attempts to restart. By default UI will prompt before restart.
14/log log.txt - logs to a specific file. By default a log file is created in %TEMP%.</String>
15 <String Id="HelpCloseButton">&amp;Close</String>
16 <String Id="InstallLicenseTerms">Click the "Accept and Install" button to accept the Microsoft .NET Framework &lt;a href="#"&gt;license terms&lt;/a&gt;.</String>
17 <String Id="InstallAcceptAndInstallButton">&amp;Accept and Install</String>
18 <String Id="InstallDeclineButton">&amp;Decline</String>
19 <String Id="ProgressHeader">Setup Progress</String>
20 <String Id="ProgressLabel">Processing:</String>
21 <String Id="ProgressCancelButton">&amp;Cancel</String>
22 <String Id="FailureHeader">Setup Failed</String>
23 <String Id="FailureLogLinkText">One or more issues caused the setup to fail. Please fix the issues and then retry setup. For more information see the &lt;a href="#"&gt;log file&lt;/a&gt;.</String>
24 <String Id="FailureRestartText">You must restart your computer to complete the rollback of the software.</String>
25 <String Id="FailureRestartButton">&amp;Restart</String>
26 <String Id="FailureCloseButton">&amp;Close</String>
27 <String Id="NET452WIN7RTMErrorMessage">[WixBundleName] cannot run on Windows 7 RTM with .NET 4.5.2 installed. Install Windows 7 SP1 to run in a supported environment.</String>
28 <String Id="ErrorFailNoActionReboot">No action was taken as a system reboot is required.</String>
29</WixLocalization>
diff --git a/src/ext/Bal/wixstdba/WixStandardBootstrapperApplication.cpp b/src/ext/Bal/wixstdba/WixStandardBootstrapperApplication.cpp
new file mode 100644
index 00000000..d4bf7b43
--- /dev/null
+++ b/src/ext/Bal/wixstdba/WixStandardBootstrapperApplication.cpp
@@ -0,0 +1,4264 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3#include "precomp.h"
4#include "BalBaseBootstrapperApplicationProc.h"
5#include "BalBaseBootstrapperApplication.h"
6
7static const LPCWSTR WIXBUNDLE_VARIABLE_ELEVATED = L"WixBundleElevated";
8
9static const LPCWSTR WIXSTDBA_WINDOW_CLASS = L"WixStdBA";
10
11static const LPCWSTR WIXSTDBA_VARIABLE_INSTALL_FOLDER = L"InstallFolder";
12static const LPCWSTR WIXSTDBA_VARIABLE_LAUNCH_TARGET_PATH = L"LaunchTarget";
13static const LPCWSTR WIXSTDBA_VARIABLE_LAUNCH_TARGET_ELEVATED_ID = L"LaunchTargetElevatedId";
14static const LPCWSTR WIXSTDBA_VARIABLE_LAUNCH_ARGUMENTS = L"LaunchArguments";
15static const LPCWSTR WIXSTDBA_VARIABLE_LAUNCH_HIDDEN = L"LaunchHidden";
16static const LPCWSTR WIXSTDBA_VARIABLE_LAUNCH_WORK_FOLDER = L"LaunchWorkingFolder";
17
18static const DWORD WIXSTDBA_ACQUIRE_PERCENTAGE = 30;
19
20static const LPCWSTR WIXSTDBA_VARIABLE_BUNDLE_FILE_VERSION = L"WixBundleFileVersion";
21static const LPCWSTR WIXSTDBA_VARIABLE_LANGUAGE_ID = L"WixStdBALanguageId";
22static const LPCWSTR WIXSTDBA_VARIABLE_RESTART_REQUIRED = L"WixStdBARestartRequired";
23static const LPCWSTR WIXSTDBA_VARIABLE_SHOW_VERSION = L"WixStdBAShowVersion";
24static const LPCWSTR WIXSTDBA_VARIABLE_SUPPRESS_OPTIONS_UI = L"WixStdBASuppressOptionsUI";
25
26enum WIXSTDBA_STATE
27{
28 WIXSTDBA_STATE_INITIALIZING,
29 WIXSTDBA_STATE_INITIALIZED,
30 WIXSTDBA_STATE_HELP,
31 WIXSTDBA_STATE_DETECTING,
32 WIXSTDBA_STATE_DETECTED,
33 WIXSTDBA_STATE_PLANNING,
34 WIXSTDBA_STATE_PLANNED,
35 WIXSTDBA_STATE_APPLYING,
36 WIXSTDBA_STATE_CACHING,
37 WIXSTDBA_STATE_CACHED,
38 WIXSTDBA_STATE_EXECUTING,
39 WIXSTDBA_STATE_EXECUTED,
40 WIXSTDBA_STATE_APPLIED,
41 WIXSTDBA_STATE_FAILED,
42};
43
44enum WM_WIXSTDBA
45{
46 WM_WIXSTDBA_SHOW_HELP = WM_APP + 100,
47 WM_WIXSTDBA_DETECT_PACKAGES,
48 WM_WIXSTDBA_PLAN_PACKAGES,
49 WM_WIXSTDBA_APPLY_PACKAGES,
50 WM_WIXSTDBA_CHANGE_STATE,
51 WM_WIXSTDBA_SHOW_FAILURE,
52};
53
54// This enum must be kept in the same order as the vrgwzPageNames array.
55enum WIXSTDBA_PAGE
56{
57 WIXSTDBA_PAGE_LOADING,
58 WIXSTDBA_PAGE_HELP,
59 WIXSTDBA_PAGE_INSTALL,
60 WIXSTDBA_PAGE_MODIFY,
61 WIXSTDBA_PAGE_PROGRESS,
62 WIXSTDBA_PAGE_PROGRESS_PASSIVE,
63 WIXSTDBA_PAGE_SUCCESS,
64 WIXSTDBA_PAGE_FAILURE,
65 COUNT_WIXSTDBA_PAGE,
66};
67
68// This array must be kept in the same order as the WIXSTDBA_PAGE enum.
69static LPCWSTR vrgwzPageNames[] = {
70 L"Loading",
71 L"Help",
72 L"Install",
73 L"Modify",
74 L"Progress",
75 L"ProgressPassive",
76 L"Success",
77 L"Failure",
78};
79
80enum WIXSTDBA_CONTROL
81{
82 // Welcome page
83 WIXSTDBA_CONTROL_INSTALL_BUTTON = THEME_FIRST_ASSIGN_CONTROL_ID,
84 WIXSTDBA_CONTROL_EULA_RICHEDIT,
85 WIXSTDBA_CONTROL_EULA_LINK,
86 WIXSTDBA_CONTROL_EULA_ACCEPT_CHECKBOX,
87
88 // Modify page
89 WIXSTDBA_CONTROL_REPAIR_BUTTON,
90 WIXSTDBA_CONTROL_UNINSTALL_BUTTON,
91
92 // Progress page
93 WIXSTDBA_CONTROL_CACHE_PROGRESS_PACKAGE_TEXT,
94 WIXSTDBA_CONTROL_CACHE_PROGRESS_BAR,
95 WIXSTDBA_CONTROL_CACHE_PROGRESS_TEXT,
96
97 WIXSTDBA_CONTROL_EXECUTE_PROGRESS_PACKAGE_TEXT,
98 WIXSTDBA_CONTROL_EXECUTE_PROGRESS_BAR,
99 WIXSTDBA_CONTROL_EXECUTE_PROGRESS_TEXT,
100 WIXSTDBA_CONTROL_EXECUTE_PROGRESS_ACTIONDATA_TEXT,
101
102 WIXSTDBA_CONTROL_OVERALL_PROGRESS_PACKAGE_TEXT,
103 WIXSTDBA_CONTROL_OVERALL_PROGRESS_BAR,
104 WIXSTDBA_CONTROL_OVERALL_CALCULATED_PROGRESS_BAR,
105 WIXSTDBA_CONTROL_OVERALL_PROGRESS_TEXT,
106
107 WIXSTDBA_CONTROL_PROGRESS_CANCEL_BUTTON,
108
109 // Success page
110 WIXSTDBA_CONTROL_LAUNCH_BUTTON,
111 WIXSTDBA_CONTROL_SUCCESS_RESTART_BUTTON,
112
113 // Failure page
114 WIXSTDBA_CONTROL_FAILURE_LOGFILE_LINK,
115 WIXSTDBA_CONTROL_FAILURE_MESSAGE_TEXT,
116 WIXSTDBA_CONTROL_FAILURE_RESTART_BUTTON,
117};
118
119static THEME_ASSIGN_CONTROL_ID vrgInitControls[] = {
120 { WIXSTDBA_CONTROL_INSTALL_BUTTON, L"InstallButton" },
121 { WIXSTDBA_CONTROL_EULA_RICHEDIT, L"EulaRichedit" },
122 { WIXSTDBA_CONTROL_EULA_LINK, L"EulaHyperlink" },
123 { WIXSTDBA_CONTROL_EULA_ACCEPT_CHECKBOX, L"EulaAcceptCheckbox" },
124
125 { WIXSTDBA_CONTROL_REPAIR_BUTTON, L"RepairButton" },
126 { WIXSTDBA_CONTROL_UNINSTALL_BUTTON, L"UninstallButton" },
127
128 { WIXSTDBA_CONTROL_CACHE_PROGRESS_PACKAGE_TEXT, L"CacheProgressPackageText" },
129 { WIXSTDBA_CONTROL_CACHE_PROGRESS_BAR, L"CacheProgressbar" },
130 { WIXSTDBA_CONTROL_CACHE_PROGRESS_TEXT, L"CacheProgressText" },
131 { WIXSTDBA_CONTROL_EXECUTE_PROGRESS_PACKAGE_TEXT, L"ExecuteProgressPackageText" },
132 { WIXSTDBA_CONTROL_EXECUTE_PROGRESS_BAR, L"ExecuteProgressbar" },
133 { WIXSTDBA_CONTROL_EXECUTE_PROGRESS_TEXT, L"ExecuteProgressText" },
134 { WIXSTDBA_CONTROL_EXECUTE_PROGRESS_ACTIONDATA_TEXT, L"ExecuteProgressActionDataText"},
135 { WIXSTDBA_CONTROL_OVERALL_PROGRESS_PACKAGE_TEXT, L"OverallProgressPackageText" },
136 { WIXSTDBA_CONTROL_OVERALL_PROGRESS_BAR, L"OverallProgressbar" },
137 { WIXSTDBA_CONTROL_OVERALL_CALCULATED_PROGRESS_BAR, L"OverallCalculatedProgressbar" },
138 { WIXSTDBA_CONTROL_OVERALL_PROGRESS_TEXT, L"OverallProgressText" },
139 { WIXSTDBA_CONTROL_PROGRESS_CANCEL_BUTTON, L"ProgressCancelButton" },
140
141 { WIXSTDBA_CONTROL_LAUNCH_BUTTON, L"LaunchButton" },
142 { WIXSTDBA_CONTROL_SUCCESS_RESTART_BUTTON, L"SuccessRestartButton" },
143
144 { WIXSTDBA_CONTROL_FAILURE_LOGFILE_LINK, L"FailureLogFileLink" },
145 { WIXSTDBA_CONTROL_FAILURE_MESSAGE_TEXT, L"FailureMessageText" },
146 { WIXSTDBA_CONTROL_FAILURE_RESTART_BUTTON, L"FailureRestartButton" },
147};
148
149typedef struct _WIXSTDBA_PACKAGE_INFO
150{
151 LPWSTR sczPackageId;
152 BOOL fWasAlreadyInstalled;
153 BOOL fPlannedToBeInstalled;
154 BOOL fSuccessfullyInstalled;
155} WIXSTDBA_PACKAGE_INFO;
156
157
158static HRESULT DAPI EvaluateVariableConditionCallback(
159 __in_z LPCWSTR wzCondition,
160 __out BOOL* pf,
161 __in_opt LPVOID pvContext
162 );
163static HRESULT DAPI FormatVariableStringCallback(
164 __in_z LPCWSTR wzFormat,
165 __inout LPWSTR* psczOut,
166 __in_opt LPVOID pvContext
167 );
168static HRESULT DAPI GetVariableNumericCallback(
169 __in_z LPCWSTR wzVariable,
170 __out LONGLONG* pllValue,
171 __in_opt LPVOID pvContext
172 );
173static HRESULT DAPI SetVariableNumericCallback(
174 __in_z LPCWSTR wzVariable,
175 __in LONGLONG llValue,
176 __in_opt LPVOID pvContext
177 );
178static HRESULT DAPI GetVariableStringCallback(
179 __in_z LPCWSTR wzVariable,
180 __inout LPWSTR* psczValue,
181 __in_opt LPVOID pvContext
182 );
183static HRESULT DAPI SetVariableStringCallback(
184 __in_z LPCWSTR wzVariable,
185 __in_z_opt LPCWSTR wzValue,
186 __in BOOL fFormatted,
187 __in_opt LPVOID pvContext
188 );
189static LPCSTR LoggingRequestStateToString(
190 __in BOOTSTRAPPER_REQUEST_STATE requestState
191 );
192static LPCSTR LoggingMsiFeatureStateToString(
193 __in BOOTSTRAPPER_FEATURE_STATE featureState
194 );
195
196
197class CWixStandardBootstrapperApplication : public CBalBaseBootstrapperApplication
198{
199public: // IBootstrapperApplication
200 virtual STDMETHODIMP OnStartup()
201 {
202 HRESULT hr = S_OK;
203 DWORD dwUIThreadId = 0;
204
205 // create UI thread
206 m_hUiThread = ::CreateThread(NULL, 0, UiThreadProc, this, 0, &dwUIThreadId);
207 if (!m_hUiThread)
208 {
209 ExitWithLastError(hr, "Failed to create UI thread.");
210 }
211
212 LExit:
213 return hr;
214 }
215
216
217 virtual STDMETHODIMP OnShutdown(
218 __inout BOOTSTRAPPER_SHUTDOWN_ACTION* pAction
219 )
220 {
221 HRESULT hr = S_OK;
222
223 // wait for UI thread to terminate
224 if (m_hUiThread)
225 {
226 ::WaitForSingleObject(m_hUiThread, INFINITE);
227 ReleaseHandle(m_hUiThread);
228 }
229
230 // If a restart was required.
231 if (m_fRestartRequired)
232 {
233 if (m_fAllowRestart)
234 {
235 *pAction = BOOTSTRAPPER_SHUTDOWN_ACTION_RESTART;
236 }
237
238 if (m_fPrereq)
239 {
240 BalLog(BOOTSTRAPPER_LOG_LEVEL_STANDARD, m_fAllowRestart ? "The prerequisites scheduled a restart. The bootstrapper application will be reloaded after the computer is restarted."
241 : "A restart is required by the prerequisites but the user delayed it. The bootstrapper application will be reloaded after the computer is restarted.");
242 }
243 }
244 else if (m_fPrereqInstalled)
245 {
246 BalLog(BOOTSTRAPPER_LOG_LEVEL_STANDARD, "The prerequisites were successfully installed. The bootstrapper application will be reloaded.");
247 *pAction = BOOTSTRAPPER_SHUTDOWN_ACTION_RELOAD_BOOTSTRAPPER;
248 }
249 else if (m_fPrereqAlreadyInstalled)
250 {
251 BalLog(BOOTSTRAPPER_LOG_LEVEL_STANDARD, "The prerequisites were already installed. The bootstrapper application will not be reloaded to prevent an infinite loop.");
252 }
253 else if (m_fPrereq)
254 {
255 BalLog(BOOTSTRAPPER_LOG_LEVEL_STANDARD, "The prerequisites were not successfully installed, error: 0x%x. The bootstrapper application will be not reloaded.", m_hrFinal);
256 }
257
258 return hr;
259 }
260
261
262 virtual STDMETHODIMP OnDetectRelatedBundle(
263 __in LPCWSTR wzBundleId,
264 __in BOOTSTRAPPER_RELATION_TYPE relationType,
265 __in LPCWSTR wzBundleTag,
266 __in BOOL fPerMachine,
267 __in LPCWSTR wzVersion,
268 __in BOOTSTRAPPER_RELATED_OPERATION operation,
269 __in BOOL fMissingFromCache,
270 __inout BOOL* pfCancel
271 )
272 {
273 BAL_INFO_PACKAGE* pPackage = NULL;
274
275 if (!fMissingFromCache)
276 {
277 if (SUCCEEDED(BalInfoAddRelatedBundleAsPackage(&m_Bundle.packages, wzBundleId, relationType, fPerMachine, &pPackage)))
278 {
279 InitializePackageInfoForPackage(pPackage);
280 }
281
282 // If we're not doing a prerequisite install, remember when our bundle would cause a downgrade.
283 if (!m_fPrereq && BOOTSTRAPPER_RELATED_OPERATION_DOWNGRADE == operation)
284 {
285 m_fDowngrading = TRUE;
286 }
287 }
288
289 return CBalBaseBootstrapperApplication::OnDetectRelatedBundle(wzBundleId, relationType, wzBundleTag, fPerMachine, wzVersion, operation, fMissingFromCache, pfCancel);
290 }
291
292
293 virtual STDMETHODIMP OnDetectPackageComplete(
294 __in LPCWSTR wzPackageId,
295 __in HRESULT /*hrStatus*/,
296 __in BOOTSTRAPPER_PACKAGE_STATE state
297 )
298 {
299 WIXSTDBA_PACKAGE_INFO* pPackageInfo = NULL;
300 BAL_INFO_PACKAGE* pPackage = NULL;
301
302 if (BOOTSTRAPPER_PACKAGE_STATE_PRESENT == state &&
303 SUCCEEDED(GetPackageInfo(wzPackageId, &pPackageInfo, &pPackage)) &&
304 pPackageInfo)
305 {
306 // If the package is already installed, remember that.
307 pPackageInfo->fWasAlreadyInstalled = TRUE;
308 }
309
310 return S_OK;
311 }
312
313
314 virtual STDMETHODIMP OnDetectComplete(
315 __in HRESULT hrStatus,
316 __in BOOL /*fEligibleForCleanup*/
317 )
318 {
319 HRESULT hr = S_OK;
320 // If we're not interacting with the user or we're doing a layout or we're resuming just after a force restart
321 // then automatically start planning.
322 BOOL fSkipToPlan = SUCCEEDED(hrStatus) &&
323 (BOOTSTRAPPER_DISPLAY_FULL > m_command.display ||
324 BOOTSTRAPPER_ACTION_LAYOUT == m_command.action ||
325 BOOTSTRAPPER_RESUME_TYPE_REBOOT == m_command.resumeType);
326 // If we're requiring user input (which currently means Install, Repair, or Uninstall)
327 // or if we're skipping to an action that modifies machine state
328 // then evaluate conditions.
329 BOOL fEvaluateConditions = SUCCEEDED(hrStatus) &&
330 (!fSkipToPlan || BOOTSTRAPPER_ACTION_LAYOUT < m_command.action && BOOTSTRAPPER_ACTION_UPDATE_REPLACE > m_command.action);
331
332 if (fEvaluateConditions)
333 {
334 hrStatus = EvaluateConditions();
335 }
336
337 if (FAILED(hrStatus))
338 {
339 fSkipToPlan = FALSE;
340 }
341 else
342 {
343 if (m_fPrereq)
344 {
345 m_fPrereqAlreadyInstalled = TRUE;
346
347 // At this point we have to assume that all prerequisite packages need to be installed, so set to false if any of them aren't installed.
348 for (DWORD i = 0; i < m_Bundle.packages.cPackages; ++i)
349 {
350 BAL_INFO_PACKAGE* pPackage = &m_Bundle.packages.rgPackages[i];
351 WIXSTDBA_PACKAGE_INFO* pPackageInfo = reinterpret_cast<WIXSTDBA_PACKAGE_INFO*>(pPackage->pvCustomData);
352 if (pPackage->fPrereqPackage && pPackageInfo && !pPackageInfo->fWasAlreadyInstalled)
353 {
354 m_fPrereqAlreadyInstalled = FALSE;
355 break;
356 }
357 }
358 }
359 }
360
361 SetState(WIXSTDBA_STATE_DETECTED, hrStatus);
362
363 if (fSkipToPlan)
364 {
365 ::PostMessageW(m_hWnd, WM_WIXSTDBA_PLAN_PACKAGES, 0, m_command.action);
366 }
367
368 return hr;
369 }
370
371
372 virtual STDMETHODIMP OnPlanRelatedBundle(
373 __in_z LPCWSTR wzBundleId,
374 __in BOOTSTRAPPER_REQUEST_STATE recommendedState,
375 __inout_z BOOTSTRAPPER_REQUEST_STATE* pRequestedState,
376 __inout BOOL* pfCancel
377 )
378 {
379 // If we're only installing prerequisites, do not touch related bundles.
380 if (m_fPrereq)
381 {
382 *pRequestedState = BOOTSTRAPPER_REQUEST_STATE_NONE;
383 }
384
385 return CBalBaseBootstrapperApplication::OnPlanRelatedBundle(wzBundleId, recommendedState, pRequestedState, pfCancel);
386 }
387
388
389 virtual STDMETHODIMP OnPlanPackageBegin(
390 __in_z LPCWSTR wzPackageId,
391 __in BOOTSTRAPPER_PACKAGE_STATE state,
392 __in BOOL fCached,
393 __in BOOTSTRAPPER_PACKAGE_CONDITION_RESULT installCondition,
394 __in BOOTSTRAPPER_REQUEST_STATE recommendedState,
395 __in BOOTSTRAPPER_CACHE_TYPE recommendedCacheType,
396 __inout BOOTSTRAPPER_REQUEST_STATE* pRequestState,
397 __inout BOOTSTRAPPER_CACHE_TYPE* pRequestedCacheType,
398 __inout BOOL* pfCancel
399 )
400 {
401 HRESULT hr = S_OK;
402 WIXSTDBA_PACKAGE_INFO* pPackageInfo = NULL;
403 BAL_INFO_PACKAGE* pPackage = NULL;
404
405 // If we're planning to install prerequisites, install them. The prerequisites need to be installed
406 // in all cases (even uninstall!) so the BA can load next.
407 if (m_fPrereq)
408 {
409 // Only install prerequisite packages, and check the InstallCondition on them.
410 BOOL fInstall = FALSE;
411 hr = GetPackageInfo(wzPackageId, &pPackageInfo, &pPackage);
412 if (SUCCEEDED(hr) && pPackage->fPrereqPackage && pPackageInfo)
413 {
414 pPackageInfo->fPlannedToBeInstalled = fInstall = BOOTSTRAPPER_PACKAGE_CONDITION_FALSE != installCondition;
415 }
416
417 if (fInstall)
418 {
419 *pRequestState = BOOTSTRAPPER_REQUEST_STATE_PRESENT;
420 }
421 else
422 {
423 *pRequestState = BOOTSTRAPPER_REQUEST_STATE_NONE;
424 }
425
426 // Don't force cache packages while installing prerequisites.
427 if (BOOTSTRAPPER_CACHE_TYPE_FORCE == *pRequestedCacheType)
428 {
429 *pRequestedCacheType = BOOTSTRAPPER_CACHE_TYPE_KEEP;
430 }
431 }
432 else if (m_sczAfterForcedRestartPackage) // after force restart, skip packages until after the package that caused the restart.
433 {
434 // After restart we need to finish the dependency registration for our package so allow the package
435 // to go present.
436 if (CSTR_EQUAL == ::CompareStringW(LOCALE_NEUTRAL, 0, wzPackageId, -1, m_sczAfterForcedRestartPackage, -1))
437 {
438 // Do not allow a repair because that could put us in a perpetual restart loop.
439 if (BOOTSTRAPPER_REQUEST_STATE_REPAIR == *pRequestState)
440 {
441 *pRequestState = BOOTSTRAPPER_REQUEST_STATE_PRESENT;
442 }
443
444 ReleaseNullStr(m_sczAfterForcedRestartPackage); // no more skipping now.
445 }
446 else // not the matching package, so skip it.
447 {
448 BalLog(BOOTSTRAPPER_LOG_LEVEL_STANDARD, "Skipping package: %ls, after restart because it was applied before the restart.", wzPackageId);
449
450 *pRequestState = BOOTSTRAPPER_REQUEST_STATE_NONE;
451 }
452 }
453
454 return CBalBaseBootstrapperApplication::OnPlanPackageBegin(wzPackageId, state, fCached, installCondition, recommendedState, recommendedCacheType, pRequestState, pRequestedCacheType, pfCancel);
455 }
456
457
458 virtual STDMETHODIMP OnPlanMsiPackage(
459 __in_z LPCWSTR wzPackageId,
460 __in BOOL fExecute,
461 __in BOOTSTRAPPER_ACTION_STATE action,
462 __inout BOOL* pfCancel,
463 __inout BURN_MSI_PROPERTY* pActionMsiProperty,
464 __inout INSTALLUILEVEL* pUiLevel,
465 __inout BOOL* pfDisableExternalUiHandler
466 )
467 {
468 HRESULT hr = S_OK;
469 WIXSTDBA_PACKAGE_INFO* pPackageInfo = NULL;
470 BAL_INFO_PACKAGE* pPackage = NULL;
471 BOOL fShowInternalUI = FALSE;
472 INSTALLUILEVEL uiLevel = INSTALLUILEVEL_NOCHANGE;
473
474 switch (m_command.display)
475 {
476 case BOOTSTRAPPER_DISPLAY_FULL:
477 uiLevel = INSTALLUILEVEL_FULL;
478 break;
479
480 case BOOTSTRAPPER_DISPLAY_PASSIVE:
481 uiLevel = INSTALLUILEVEL_REDUCED;
482 break;
483 }
484
485 if (INSTALLUILEVEL_NOCHANGE != uiLevel)
486 {
487 hr = GetPackageInfo(wzPackageId, &pPackageInfo, &pPackage);
488 if (SUCCEEDED(hr) && pPackage->sczDisplayInternalUICondition)
489 {
490 hr = BalEvaluateCondition(pPackage->sczDisplayInternalUICondition, &fShowInternalUI);
491 BalExitOnFailure(hr, "Failed to evaluate condition for package '%ls': %ls", wzPackageId, pPackage->sczDisplayInternalUICondition);
492
493 if (fShowInternalUI)
494 {
495 *pUiLevel = uiLevel;
496 }
497 }
498 }
499
500 LExit:
501 return __super::OnPlanMsiPackage(wzPackageId, fExecute, action, pfCancel, pActionMsiProperty, pUiLevel, pfDisableExternalUiHandler);
502 }
503
504
505 virtual STDMETHODIMP OnPlanComplete(
506 __in HRESULT hrStatus
507 )
508 {
509 HRESULT hr = S_OK;
510
511 if (m_fPrereq)
512 {
513 m_fPrereqAlreadyInstalled = TRUE;
514
515 // Now that we've planned the packages, we can focus on the prerequisite packages that are supposed to be installed.
516 for (DWORD i = 0; i < m_Bundle.packages.cPackages; ++i)
517 {
518 BAL_INFO_PACKAGE* pPackage = &m_Bundle.packages.rgPackages[i];
519 WIXSTDBA_PACKAGE_INFO* pPackageInfo = reinterpret_cast<WIXSTDBA_PACKAGE_INFO*>(pPackage->pvCustomData);
520 if (pPackage->fPrereqPackage && pPackageInfo && !pPackageInfo->fWasAlreadyInstalled && pPackageInfo->fPlannedToBeInstalled)
521 {
522 m_fPrereqAlreadyInstalled = FALSE;
523 break;
524 }
525 }
526 }
527
528 SetState(WIXSTDBA_STATE_PLANNED, hrStatus);
529
530 if (SUCCEEDED(hrStatus))
531 {
532 ::PostMessageW(m_hWnd, WM_WIXSTDBA_APPLY_PACKAGES, 0, 0);
533 }
534
535 m_fStartedExecution = FALSE;
536 m_dwCalculatedCacheProgress = 0;
537 m_dwCalculatedExecuteProgress = 0;
538
539 return hr;
540 }
541
542
543 virtual STDMETHODIMP OnPauseAutomaticUpdatesBegin(
544 )
545 {
546 HRESULT hr = S_OK;
547 LOC_STRING* pLocString = NULL;
548 LPWSTR sczFormattedString = NULL;
549 LPCWSTR wz = NULL;
550
551 hr = __super::OnPauseAutomaticUpdatesBegin();
552
553 LocGetString(m_pWixLoc, L"#(loc.PauseAutomaticUpdatesMessage)", &pLocString);
554
555 if (pLocString)
556 {
557 BalFormatString(pLocString->wzText, &sczFormattedString);
558 }
559
560 wz = sczFormattedString ? sczFormattedString : L"Pausing Windows automatic updates";
561
562 ThemeSetTextControl(m_pTheme, WIXSTDBA_CONTROL_OVERALL_PROGRESS_PACKAGE_TEXT, wz);
563
564 ReleaseStr(sczFormattedString);
565 return hr;
566 }
567
568
569 virtual STDMETHODIMP OnSystemRestorePointBegin(
570 )
571 {
572 HRESULT hr = S_OK;
573 LOC_STRING* pLocString = NULL;
574 LPWSTR sczFormattedString = NULL;
575 LPCWSTR wz = NULL;
576
577 hr = __super::OnSystemRestorePointBegin();
578
579 LocGetString(m_pWixLoc, L"#(loc.SystemRestorePointMessage)", &pLocString);
580
581 if (pLocString)
582 {
583 BalFormatString(pLocString->wzText, &sczFormattedString);
584 }
585
586 wz = sczFormattedString ? sczFormattedString : L"Creating system restore point";
587
588 ThemeSetTextControl(m_pTheme, WIXSTDBA_CONTROL_OVERALL_PROGRESS_PACKAGE_TEXT, wz);
589
590 ReleaseStr(sczFormattedString);
591 return hr;
592 }
593
594
595 virtual STDMETHODIMP OnCachePackageBegin(
596 __in_z LPCWSTR wzPackageId,
597 __in DWORD cCachePayloads,
598 __in DWORD64 dw64PackageCacheSize,
599 __inout BOOL* pfCancel
600 )
601 {
602 if (wzPackageId && *wzPackageId)
603 {
604 BAL_INFO_PACKAGE* pPackage = NULL;
605 HRESULT hr = BalInfoFindPackageById(&m_Bundle.packages, wzPackageId, &pPackage);
606 LPCWSTR wz = (SUCCEEDED(hr) && pPackage->sczDisplayName) ? pPackage->sczDisplayName : wzPackageId;
607
608 ThemeSetTextControl(m_pTheme, WIXSTDBA_CONTROL_CACHE_PROGRESS_PACKAGE_TEXT, wz);
609
610 // If something started executing, leave it in the overall progress text.
611 if (!m_fStartedExecution)
612 {
613 ThemeSetTextControl(m_pTheme, WIXSTDBA_CONTROL_OVERALL_PROGRESS_PACKAGE_TEXT, wz);
614 }
615 }
616
617 return __super::OnCachePackageBegin(wzPackageId, cCachePayloads, dw64PackageCacheSize, pfCancel);
618 }
619
620
621 virtual STDMETHODIMP OnCacheAcquireProgress(
622 __in_z LPCWSTR wzPackageOrContainerId,
623 __in_z_opt LPCWSTR wzPayloadId,
624 __in DWORD64 dw64Progress,
625 __in DWORD64 dw64Total,
626 __in DWORD dwOverallPercentage,
627 __inout BOOL* pfCancel
628 )
629 {
630#ifdef DEBUG
631 BalLog(BOOTSTRAPPER_LOG_LEVEL_STANDARD, "WIXSTDBA: OnCacheAcquireProgress() - container/package: %ls, payload: %ls, progress: %I64u, total: %I64u, overall progress: %u%%", wzPackageOrContainerId, wzPayloadId, dw64Progress, dw64Total, dwOverallPercentage);
632#endif
633
634 UpdateCacheProgress(dwOverallPercentage);
635
636 return __super::OnCacheAcquireProgress(wzPackageOrContainerId, wzPayloadId, dw64Progress, dw64Total, dwOverallPercentage, pfCancel);
637 }
638
639
640 virtual STDMETHODIMP OnCacheContainerOrPayloadVerifyProgress(
641 __in_z LPCWSTR wzPackageOrContainerId,
642 __in_z_opt LPCWSTR wzPayloadId,
643 __in DWORD64 dw64Progress,
644 __in DWORD64 dw64Total,
645 __in DWORD dwOverallPercentage,
646 __inout BOOL* pfCancel
647 )
648 {
649#ifdef DEBUG
650 BalLog(BOOTSTRAPPER_LOG_LEVEL_STANDARD, "WIXSTDBA: OnCacheContainerOrPayloadVerifyProgress() - container/package: %ls, payload: %ls, progress: %I64u, total: %I64u, overall progress: %u%%", wzPackageOrContainerId, wzPayloadId, dw64Progress, dw64Total, dwOverallPercentage);
651#endif
652
653 UpdateCacheProgress(dwOverallPercentage);
654
655 return __super::OnCacheContainerOrPayloadVerifyProgress(wzPackageOrContainerId, wzPayloadId, dw64Progress, dw64Total, dwOverallPercentage, pfCancel);
656 }
657
658
659 virtual STDMETHODIMP OnCachePayloadExtractProgress(
660 __in_z LPCWSTR wzPackageOrContainerId,
661 __in_z_opt LPCWSTR wzPayloadId,
662 __in DWORD64 dw64Progress,
663 __in DWORD64 dw64Total,
664 __in DWORD dwOverallPercentage,
665 __inout BOOL* pfCancel
666 )
667 {
668#ifdef DEBUG
669 BalLog(BOOTSTRAPPER_LOG_LEVEL_STANDARD, "WIXSTDBA: OnCachePayloadExtractProgress() - container/package: %ls, payload: %ls, progress: %I64u, total: %I64u, overall progress: %u%%", wzPackageOrContainerId, wzPayloadId, dw64Progress, dw64Total, dwOverallPercentage);
670#endif
671
672 UpdateCacheProgress(dwOverallPercentage);
673
674 return __super::OnCachePayloadExtractProgress(wzPackageOrContainerId, wzPayloadId, dw64Progress, dw64Total, dwOverallPercentage, pfCancel);
675 }
676
677
678 virtual STDMETHODIMP OnCacheVerifyProgress(
679 __in_z LPCWSTR wzPackageOrContainerId,
680 __in_z_opt LPCWSTR wzPayloadId,
681 __in DWORD64 dw64Progress,
682 __in DWORD64 dw64Total,
683 __in DWORD dwOverallPercentage,
684 __in BOOTSTRAPPER_CACHE_VERIFY_STEP verifyStep,
685 __inout BOOL* pfCancel
686 )
687 {
688#ifdef DEBUG
689 BalLog(BOOTSTRAPPER_LOG_LEVEL_STANDARD, "WIXSTDBA: OnCacheVerifyProgress() - container/package: %ls, payload: %ls, progress: %I64u, total: %I64u, overall progress: %u%%, step: %u", wzPackageOrContainerId, wzPayloadId, dw64Progress, dw64Total, dwOverallPercentage, verifyStep);
690#endif
691
692 UpdateCacheProgress(dwOverallPercentage);
693
694 return __super::OnCacheVerifyProgress(wzPackageOrContainerId, wzPayloadId, dw64Progress, dw64Total, dwOverallPercentage, verifyStep, pfCancel);
695 }
696
697
698 virtual STDMETHODIMP OnCacheAcquireComplete(
699 __in_z LPCWSTR wzPackageOrContainerId,
700 __in_z_opt LPCWSTR wzPayloadId,
701 __in HRESULT hrStatus,
702 __in BOOTSTRAPPER_CACHEACQUIRECOMPLETE_ACTION recommendation,
703 __inout BOOTSTRAPPER_CACHEACQUIRECOMPLETE_ACTION* pAction
704 )
705 {
706 SetProgressState(hrStatus);
707 return __super::OnCacheAcquireComplete(wzPackageOrContainerId, wzPayloadId, hrStatus, recommendation, pAction);
708 }
709
710
711 virtual STDMETHODIMP OnCacheContainerOrPayloadVerifyComplete(
712 __in_z LPCWSTR wzPackageOrContainerId,
713 __in_z_opt LPCWSTR wzPayloadId,
714 __in HRESULT hrStatus
715 )
716 {
717 SetProgressState(hrStatus);
718 return __super::OnCacheContainerOrPayloadVerifyComplete(wzPackageOrContainerId, wzPayloadId, hrStatus);
719 }
720
721
722 virtual STDMETHODIMP OnCachePayloadExtractComplete(
723 __in_z LPCWSTR wzPackageOrContainerId,
724 __in_z_opt LPCWSTR wzPayloadId,
725 __in HRESULT hrStatus
726 )
727 {
728 SetProgressState(hrStatus);
729 return __super::OnCachePayloadExtractComplete(wzPackageOrContainerId, wzPayloadId, hrStatus);
730 }
731
732
733 virtual STDMETHODIMP OnCacheVerifyComplete(
734 __in_z LPCWSTR wzPackageId,
735 __in_z LPCWSTR wzPayloadId,
736 __in HRESULT hrStatus,
737 __in BOOTSTRAPPER_CACHEVERIFYCOMPLETE_ACTION recommendation,
738 __inout BOOTSTRAPPER_CACHEVERIFYCOMPLETE_ACTION* pAction
739 )
740 {
741 SetProgressState(hrStatus);
742 return __super::OnCacheVerifyComplete(wzPackageId, wzPayloadId, hrStatus, recommendation, pAction);
743 }
744
745
746 virtual STDMETHODIMP OnCacheComplete(
747 __in HRESULT hrStatus
748 )
749 {
750 UpdateCacheProgress(SUCCEEDED(hrStatus) ? 100 : 0);
751 ThemeSetTextControl(m_pTheme, WIXSTDBA_CONTROL_CACHE_PROGRESS_PACKAGE_TEXT, L"");
752 SetState(WIXSTDBA_STATE_CACHED, S_OK); // we always return success here and let OnApplyComplete() deal with the error.
753 return __super::OnCacheComplete(hrStatus);
754 }
755
756
757 virtual STDMETHODIMP OnError(
758 __in BOOTSTRAPPER_ERROR_TYPE errorType,
759 __in LPCWSTR wzPackageId,
760 __in DWORD dwCode,
761 __in_z LPCWSTR wzError,
762 __in DWORD dwUIHint,
763 __in DWORD /*cData*/,
764 __in_ecount_z_opt(cData) LPCWSTR* /*rgwzData*/,
765 __in int /*nRecommendation*/,
766 __inout int* pResult
767 )
768 {
769 HRESULT hr = S_OK;
770 int nResult = *pResult;
771 LPWSTR sczError = NULL;
772
773 if (BOOTSTRAPPER_DISPLAY_EMBEDDED == m_command.display)
774 {
775 hr = m_pEngine->SendEmbeddedError(dwCode, wzError, dwUIHint, &nResult);
776 if (FAILED(hr))
777 {
778 nResult = IDERROR;
779 }
780 }
781 else if (BOOTSTRAPPER_DISPLAY_FULL == m_command.display)
782 {
783 // If this is an authentication failure, let the engine try to handle it for us.
784 if (BOOTSTRAPPER_ERROR_TYPE_HTTP_AUTH_SERVER == errorType || BOOTSTRAPPER_ERROR_TYPE_HTTP_AUTH_PROXY == errorType)
785 {
786 nResult = IDTRYAGAIN;
787 }
788 else // show a generic error message box.
789 {
790 BalRetryErrorOccurred(wzPackageId, dwCode);
791
792 if (!m_fShowingInternalUiThisPackage)
793 {
794 // If no error message was provided, use the error code to try and get an error message.
795 if (!wzError || !*wzError || BOOTSTRAPPER_ERROR_TYPE_WINDOWS_INSTALLER != errorType)
796 {
797 hr = StrAllocFromError(&sczError, dwCode, NULL);
798 if (FAILED(hr) || !sczError || !*sczError)
799 {
800 // special case for ERROR_FAIL_NOACTION_REBOOT: use loc string for Windows XP
801 if (ERROR_FAIL_NOACTION_REBOOT == dwCode)
802 {
803 LOC_STRING* pLocString = NULL;
804 hr = LocGetString(m_pWixLoc, L"#(loc.ErrorFailNoActionReboot)", &pLocString);
805 if (SUCCEEDED(hr))
806 {
807 StrAllocString(&sczError, pLocString->wzText, 0);
808 }
809 else
810 {
811 StrAllocFormatted(&sczError, L"0x%x", dwCode);
812 }
813 }
814 else
815 {
816 StrAllocFormatted(&sczError, L"0x%x", dwCode);
817 }
818 }
819 hr = S_OK;
820 }
821
822 nResult = ::MessageBoxW(m_hWnd, sczError ? sczError : wzError, m_pTheme->sczCaption, dwUIHint);
823 }
824 }
825
826 SetProgressState(HRESULT_FROM_WIN32(dwCode));
827 }
828 else // just take note of the error code and let things continue.
829 {
830 BalRetryErrorOccurred(wzPackageId, dwCode);
831 }
832
833 ReleaseStr(sczError);
834 *pResult = nResult;
835 return hr;
836 }
837
838
839 virtual STDMETHODIMP OnExecuteMsiMessage(
840 __in_z LPCWSTR wzPackageId,
841 __in INSTALLMESSAGE messageType,
842 __in DWORD dwUIHint,
843 __in_z LPCWSTR wzMessage,
844 __in DWORD cData,
845 __in_ecount_z_opt(cData) LPCWSTR* rgwzData,
846 __in int nRecommendation,
847 __inout int* pResult
848 )
849 {
850#ifdef DEBUG
851 BalLog(BOOTSTRAPPER_LOG_LEVEL_STANDARD, "WIXSTDBA: OnExecuteMsiMessage() - package: %ls, message: %ls", wzPackageId, wzMessage);
852#endif
853 if (BOOTSTRAPPER_DISPLAY_FULL == m_command.display && (INSTALLMESSAGE_WARNING == messageType || INSTALLMESSAGE_USER == messageType))
854 {
855 if (!m_fShowingInternalUiThisPackage)
856 {
857 int nResult = ::MessageBoxW(m_hWnd, wzMessage, m_pTheme->sczCaption, dwUIHint);
858 return nResult;
859 }
860 }
861
862 if (INSTALLMESSAGE_ACTIONSTART == messageType)
863 {
864 ThemeSetTextControl(m_pTheme, WIXSTDBA_CONTROL_EXECUTE_PROGRESS_ACTIONDATA_TEXT, wzMessage);
865 }
866
867 return __super::OnExecuteMsiMessage(wzPackageId, messageType, dwUIHint, wzMessage, cData, rgwzData, nRecommendation, pResult);
868 }
869
870
871 virtual STDMETHODIMP OnProgress(
872 __in DWORD dwProgressPercentage,
873 __in DWORD dwOverallProgressPercentage,
874 __inout BOOL* pfCancel
875 )
876 {
877 WCHAR wzProgress[5] = { };
878
879#ifdef DEBUG
880 BalLog(BOOTSTRAPPER_LOG_LEVEL_STANDARD, "WIXSTDBA: OnProgress() - progress: %u%%, overall progress: %u%%", dwProgressPercentage, dwOverallProgressPercentage);
881#endif
882
883 ::StringCchPrintfW(wzProgress, countof(wzProgress), L"%u%%", dwOverallProgressPercentage);
884 ThemeSetTextControl(m_pTheme, WIXSTDBA_CONTROL_OVERALL_PROGRESS_TEXT, wzProgress);
885
886 ThemeSetProgressControl(m_pTheme, WIXSTDBA_CONTROL_OVERALL_PROGRESS_BAR, dwOverallProgressPercentage);
887 SetTaskbarButtonProgress(dwOverallProgressPercentage);
888
889 return __super::OnProgress(dwProgressPercentage, dwOverallProgressPercentage, pfCancel);
890 }
891
892
893 virtual STDMETHODIMP OnExecutePackageBegin(
894 __in_z LPCWSTR wzPackageId,
895 __in BOOL fExecute,
896 __in BOOTSTRAPPER_ACTION_STATE action,
897 __in INSTALLUILEVEL uiLevel,
898 __in BOOL fDisableExternalUiHandler,
899 __inout BOOL* pfCancel
900 )
901 {
902 HRESULT hr = S_OK;
903 LPWSTR sczFormattedString = NULL;
904 BOOL fShowingInternalUiThisPackage = FALSE;
905
906 m_fStartedExecution = TRUE;
907
908 if (wzPackageId && *wzPackageId)
909 {
910 BAL_INFO_PACKAGE* pPackage = NULL;
911 BalInfoFindPackageById(&m_Bundle.packages, wzPackageId, &pPackage);
912
913 LPCWSTR wz = wzPackageId;
914 if (pPackage)
915 {
916 LOC_STRING* pLocString = NULL;
917
918 switch (pPackage->type)
919 {
920 case BAL_INFO_PACKAGE_TYPE_BUNDLE_ADDON:
921 LocGetString(m_pWixLoc, L"#(loc.ExecuteAddonRelatedBundleMessage)", &pLocString);
922 break;
923
924 case BAL_INFO_PACKAGE_TYPE_BUNDLE_PATCH:
925 LocGetString(m_pWixLoc, L"#(loc.ExecutePatchRelatedBundleMessage)", &pLocString);
926 break;
927
928 case BAL_INFO_PACKAGE_TYPE_BUNDLE_UPGRADE:
929 LocGetString(m_pWixLoc, L"#(loc.ExecuteUpgradeRelatedBundleMessage)", &pLocString);
930 break;
931 }
932
933 if (pLocString)
934 {
935 // If the wix developer is showing a hidden variable in the UI, then obviously they don't care about keeping it safe
936 // so don't go down the rabbit hole of making sure that this is securely freed.
937 BalFormatString(pLocString->wzText, &sczFormattedString);
938 }
939
940 wz = sczFormattedString ? sczFormattedString : pPackage->sczDisplayName ? pPackage->sczDisplayName : wzPackageId;
941 }
942
943 fShowingInternalUiThisPackage = INSTALLUILEVEL_NONE != (INSTALLUILEVEL_NONE & uiLevel);
944
945 ThemeSetTextControl(m_pTheme, WIXSTDBA_CONTROL_EXECUTE_PROGRESS_PACKAGE_TEXT, wz);
946 ThemeSetTextControl(m_pTheme, WIXSTDBA_CONTROL_OVERALL_PROGRESS_PACKAGE_TEXT, wz);
947 }
948
949 ::EnterCriticalSection(&m_csShowingInternalUiThisPackage);
950 m_fShowingInternalUiThisPackage = fShowingInternalUiThisPackage;
951 hr = __super::OnExecutePackageBegin(wzPackageId, fExecute, action, uiLevel, fDisableExternalUiHandler, pfCancel);
952 ::LeaveCriticalSection(&m_csShowingInternalUiThisPackage);
953
954 ReleaseStr(sczFormattedString);
955 return hr;
956 }
957
958
959 virtual STDMETHODIMP OnExecuteProgress(
960 __in_z LPCWSTR wzPackageId,
961 __in DWORD dwProgressPercentage,
962 __in DWORD dwOverallProgressPercentage,
963 __inout BOOL* pfCancel
964 )
965 {
966 WCHAR wzProgress[5] = { };
967
968#ifdef DEBUG
969 BalLog(BOOTSTRAPPER_LOG_LEVEL_STANDARD, "WIXSTDBA: OnExecuteProgress() - package: %ls, progress: %u%%, overall progress: %u%%", wzPackageId, dwProgressPercentage, dwOverallProgressPercentage);
970#endif
971
972 ::StringCchPrintfW(wzProgress, countof(wzProgress), L"%u%%", dwOverallProgressPercentage);
973 ThemeSetTextControl(m_pTheme, WIXSTDBA_CONTROL_EXECUTE_PROGRESS_TEXT, wzProgress);
974
975 ThemeSetProgressControl(m_pTheme, WIXSTDBA_CONTROL_EXECUTE_PROGRESS_BAR, dwOverallProgressPercentage);
976
977 m_dwCalculatedExecuteProgress = dwOverallProgressPercentage * (100 - WIXSTDBA_ACQUIRE_PERCENTAGE) / 100;
978 ThemeSetProgressControl(m_pTheme, WIXSTDBA_CONTROL_OVERALL_CALCULATED_PROGRESS_BAR, m_dwCalculatedCacheProgress + m_dwCalculatedExecuteProgress);
979
980 SetTaskbarButtonProgress(m_dwCalculatedCacheProgress + m_dwCalculatedExecuteProgress);
981
982 return __super::OnExecuteProgress(wzPackageId, dwProgressPercentage, dwOverallProgressPercentage, pfCancel);
983 }
984
985
986 virtual STDMETHODIMP OnExecutePackageComplete(
987 __in_z LPCWSTR wzPackageId,
988 __in HRESULT hrStatus,
989 __in BOOTSTRAPPER_APPLY_RESTART restart,
990 __in BOOTSTRAPPER_EXECUTEPACKAGECOMPLETE_ACTION recommendation,
991 __inout BOOTSTRAPPER_EXECUTEPACKAGECOMPLETE_ACTION* pAction
992 )
993 {
994 HRESULT hr = S_OK;
995 SetProgressState(hrStatus);
996
997 hr = __super::OnExecutePackageComplete(wzPackageId, hrStatus, restart, recommendation, pAction);
998
999 WIXSTDBA_PACKAGE_INFO* pPackageInfo = NULL;
1000 BAL_INFO_PACKAGE* pPackage;
1001 HRESULT hrPrereq = GetPackageInfo(wzPackageId, &pPackageInfo, &pPackage);
1002 if (SUCCEEDED(hrPrereq) && pPackageInfo)
1003 {
1004 pPackageInfo->fSuccessfullyInstalled = SUCCEEDED(hrStatus);
1005
1006 // If the prerequisite required a restart (any restart) then do an immediate
1007 // restart to ensure that the bundle will get launched again post reboot.
1008 if (m_fPrereq && pPackage->fPrereqPackage && BOOTSTRAPPER_APPLY_RESTART_NONE != restart)
1009 {
1010 *pAction = BOOTSTRAPPER_EXECUTEPACKAGECOMPLETE_ACTION_RESTART;
1011 }
1012 }
1013
1014 return hr;
1015 }
1016
1017
1018 virtual STDMETHODIMP OnExecuteComplete(
1019 __in HRESULT hrStatus
1020 )
1021 {
1022 HRESULT hr = S_OK;
1023
1024 ThemeSetTextControl(m_pTheme, WIXSTDBA_CONTROL_EXECUTE_PROGRESS_PACKAGE_TEXT, L"");
1025 ThemeSetTextControl(m_pTheme, WIXSTDBA_CONTROL_EXECUTE_PROGRESS_ACTIONDATA_TEXT, L"");
1026 ThemeSetTextControl(m_pTheme, WIXSTDBA_CONTROL_OVERALL_PROGRESS_PACKAGE_TEXT, L"");
1027 ThemeControlEnable(m_pTheme, WIXSTDBA_CONTROL_PROGRESS_CANCEL_BUTTON, FALSE); // no more cancel.
1028 m_fShowingInternalUiThisPackage = FALSE;
1029
1030 SetState(WIXSTDBA_STATE_EXECUTED, S_OK); // we always return success here and let OnApplyComplete() deal with the error.
1031 SetProgressState(hrStatus);
1032
1033 return hr;
1034 }
1035
1036
1037 virtual STDMETHODIMP OnCacheAcquireResolving(
1038 __in_z_opt LPCWSTR wzPackageOrContainerId,
1039 __in_z_opt LPCWSTR wzPayloadId,
1040 __in_z LPCWSTR* rgSearchPaths,
1041 __in DWORD /*cSearchPaths*/,
1042 __in BOOL /*fFoundLocal*/,
1043 __in DWORD dwRecommendedSearchPath,
1044 __in_z_opt LPCWSTR /*wzDownloadUrl*/,
1045 __in_z_opt LPCWSTR /*wzPayloadContainerId*/,
1046 __in BOOTSTRAPPER_CACHE_RESOLVE_OPERATION /*recommendation*/,
1047 __inout DWORD* /*pdwChosenSearchPath*/,
1048 __inout BOOTSTRAPPER_CACHE_RESOLVE_OPERATION* pAction,
1049 __inout BOOL* pfCancel
1050 )
1051 {
1052 HRESULT hr = S_OK;
1053
1054 if (BOOTSTRAPPER_CACHE_RESOLVE_NONE == *pAction && BOOTSTRAPPER_DISPLAY_FULL == m_command.display) // prompt to change the source location.
1055 {
1056 OPENFILENAMEW ofn = { };
1057 WCHAR wzFile[MAX_PATH] = { };
1058
1059 ::StringCchCopyW(wzFile, countof(wzFile), rgSearchPaths[dwRecommendedSearchPath]);
1060
1061 ofn.lStructSize = sizeof(ofn);
1062 ofn.hwndOwner = m_hWnd;
1063 ofn.lpstrFile = wzFile;
1064 ofn.nMaxFile = countof(wzFile);
1065 ofn.lpstrFilter = L"All Files\0*.*\0";
1066 ofn.nFilterIndex = 1;
1067 ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
1068 ofn.lpstrTitle = m_pTheme->sczCaption;
1069
1070 if (::GetOpenFileNameW(&ofn))
1071 {
1072 hr = m_pEngine->SetLocalSource(wzPackageOrContainerId, wzPayloadId, ofn.lpstrFile);
1073 *pAction = BOOTSTRAPPER_CACHE_RESOLVE_RETRY;
1074 }
1075 else
1076 {
1077 *pfCancel = TRUE;
1078 }
1079 }
1080 // else there's nothing more we can do in non-interactive mode
1081
1082 *pfCancel |= CheckCanceled();
1083 return hr;
1084 }
1085
1086
1087 virtual STDMETHODIMP OnApplyComplete(
1088 __in HRESULT hrStatus,
1089 __in BOOTSTRAPPER_APPLY_RESTART restart,
1090 __in BOOTSTRAPPER_APPLYCOMPLETE_ACTION recommendation,
1091 __inout BOOTSTRAPPER_APPLYCOMPLETE_ACTION* pAction
1092 )
1093 {
1094 HRESULT hr = S_OK;
1095
1096 __super::OnApplyComplete(hrStatus, restart, recommendation, pAction);
1097
1098 m_restartResult = restart; // remember the restart result so we return the correct error code no matter what the user chooses to do in the UI.
1099
1100 // If a restart was encountered and we are not suppressing restarts, then restart is required.
1101 m_fRestartRequired = (BOOTSTRAPPER_APPLY_RESTART_NONE != restart && BOOTSTRAPPER_RESTART_NEVER < m_command.restart);
1102 BalSetStringVariable(WIXSTDBA_VARIABLE_RESTART_REQUIRED, m_fRestartRequired ? L"1" : NULL, FALSE);
1103
1104 // If a restart is required and we're not displaying a UI or we are not supposed to prompt for restart then allow the restart.
1105 m_fAllowRestart = m_fRestartRequired && (BOOTSTRAPPER_DISPLAY_FULL > m_command.display || BOOTSTRAPPER_RESTART_PROMPT < m_command.restart);
1106
1107 if (m_fPrereq)
1108 {
1109 m_fPrereqInstalled = TRUE;
1110 BOOL fInstalledAPackage = FALSE;
1111
1112 for (DWORD i = 0; i < m_Bundle.packages.cPackages; ++i)
1113 {
1114 BAL_INFO_PACKAGE* pPackage = &m_Bundle.packages.rgPackages[i];
1115 WIXSTDBA_PACKAGE_INFO* pPackageInfo = reinterpret_cast<WIXSTDBA_PACKAGE_INFO*>(pPackage->pvCustomData);
1116 if (pPackage->fPrereqPackage && pPackageInfo && pPackageInfo->fPlannedToBeInstalled && !pPackageInfo->fWasAlreadyInstalled)
1117 {
1118 if (pPackageInfo->fSuccessfullyInstalled)
1119 {
1120 fInstalledAPackage = TRUE;
1121 }
1122 else
1123 {
1124 m_fPrereqInstalled = FALSE;
1125 break;
1126 }
1127 }
1128 }
1129
1130 m_fPrereqInstalled = m_fPrereqInstalled && fInstalledAPackage;
1131 }
1132
1133 // If we are showing UI, wait a beat before moving to the final screen.
1134 if (BOOTSTRAPPER_DISPLAY_NONE < m_command.display)
1135 {
1136 ::Sleep(250);
1137 }
1138
1139 SetState(WIXSTDBA_STATE_APPLIED, hrStatus);
1140 SetTaskbarButtonProgress(100); // show full progress bar, green, yellow, or red
1141
1142 *pAction = BOOTSTRAPPER_APPLYCOMPLETE_ACTION_NONE;
1143
1144 return hr;
1145 }
1146
1147 virtual STDMETHODIMP OnLaunchApprovedExeComplete(
1148 __in HRESULT hrStatus,
1149 __in DWORD /*processId*/
1150 )
1151 {
1152 HRESULT hr = S_OK;
1153
1154 if (HRESULT_FROM_WIN32(ERROR_ACCESS_DENIED) == hrStatus)
1155 {
1156 //try with ShelExec next time
1157 OnClickLaunchButton();
1158 }
1159 else
1160 {
1161 ::PostMessageW(m_hWnd, WM_CLOSE, 0, 0);
1162 }
1163
1164 return hr;
1165 }
1166
1167 virtual STDMETHODIMP_(void) BAProcFallback(
1168 __in BOOTSTRAPPER_APPLICATION_MESSAGE message,
1169 __in const LPVOID pvArgs,
1170 __inout LPVOID pvResults,
1171 __inout HRESULT* phr,
1172 __in_opt LPVOID /*pvContext*/
1173 )
1174 {
1175 if (!m_pfnBAFunctionsProc || FAILED(*phr))
1176 {
1177 return;
1178 }
1179
1180 // Always log before and after so we don't get blamed when BAFunctions changes something.
1181 switch (message)
1182 {
1183 case BOOTSTRAPPER_APPLICATION_MESSAGE_ONDETECTBEGIN:
1184 OnDetectBeginFallback(reinterpret_cast<BA_ONDETECTBEGIN_ARGS*>(pvArgs), reinterpret_cast<BA_ONDETECTBEGIN_RESULTS*>(pvResults));
1185 break;
1186 case BOOTSTRAPPER_APPLICATION_MESSAGE_ONDETECTCOMPLETE:
1187 OnDetectCompleteFallback(reinterpret_cast<BA_ONDETECTCOMPLETE_ARGS*>(pvArgs), reinterpret_cast<BA_ONDETECTCOMPLETE_RESULTS*>(pvResults));
1188 break;
1189 case BOOTSTRAPPER_APPLICATION_MESSAGE_ONPLANBEGIN:
1190 OnPlanBeginFallback(reinterpret_cast<BA_ONPLANBEGIN_ARGS*>(pvArgs), reinterpret_cast<BA_ONPLANBEGIN_RESULTS*>(pvResults));
1191 break;
1192 case BOOTSTRAPPER_APPLICATION_MESSAGE_ONPLANCOMPLETE:
1193 OnPlanCompleteFallback(reinterpret_cast<BA_ONPLANCOMPLETE_ARGS*>(pvArgs), reinterpret_cast<BA_ONPLANCOMPLETE_RESULTS*>(pvResults));
1194 break;
1195 case BOOTSTRAPPER_APPLICATION_MESSAGE_ONSTARTUP: // BAFunctions is loaded during this event on a separate thread so it's not possible to forward it.
1196 break;
1197 case BOOTSTRAPPER_APPLICATION_MESSAGE_ONSHUTDOWN:
1198 OnShutdownFallback(reinterpret_cast<BA_ONSHUTDOWN_ARGS*>(pvArgs), reinterpret_cast<BA_ONSHUTDOWN_RESULTS*>(pvResults));
1199 break;
1200 case BOOTSTRAPPER_APPLICATION_MESSAGE_ONSYSTEMSHUTDOWN:
1201 OnSystemShutdownFallback(reinterpret_cast<BA_ONSYSTEMSHUTDOWN_ARGS*>(pvArgs), reinterpret_cast<BA_ONSYSTEMSHUTDOWN_RESULTS*>(pvResults));
1202 break;
1203 case BOOTSTRAPPER_APPLICATION_MESSAGE_ONDETECTFORWARDCOMPATIBLEBUNDLE:
1204 OnDetectForwardCompatibleBundleFallback(reinterpret_cast<BA_ONDETECTFORWARDCOMPATIBLEBUNDLE_ARGS*>(pvArgs), reinterpret_cast<BA_ONDETECTFORWARDCOMPATIBLEBUNDLE_RESULTS*>(pvResults));
1205 break;
1206 case BOOTSTRAPPER_APPLICATION_MESSAGE_ONDETECTUPDATEBEGIN:
1207 OnDetectUpdateBeginFallback(reinterpret_cast<BA_ONDETECTUPDATEBEGIN_ARGS*>(pvArgs), reinterpret_cast<BA_ONDETECTUPDATEBEGIN_RESULTS*>(pvResults));
1208 break;
1209 case BOOTSTRAPPER_APPLICATION_MESSAGE_ONDETECTUPDATE:
1210 OnDetectUpdateFallback(reinterpret_cast<BA_ONDETECTUPDATE_ARGS*>(pvArgs), reinterpret_cast<BA_ONDETECTUPDATE_RESULTS*>(pvResults));
1211 break;
1212 case BOOTSTRAPPER_APPLICATION_MESSAGE_ONDETECTUPDATECOMPLETE:
1213 OnDetectUpdateCompleteFallback(reinterpret_cast<BA_ONDETECTUPDATECOMPLETE_ARGS*>(pvArgs), reinterpret_cast<BA_ONDETECTUPDATECOMPLETE_RESULTS*>(pvResults));
1214 break;
1215 case BOOTSTRAPPER_APPLICATION_MESSAGE_ONDETECTRELATEDBUNDLE:
1216 OnDetectRelatedBundleFallback(reinterpret_cast<BA_ONDETECTRELATEDBUNDLE_ARGS*>(pvArgs), reinterpret_cast<BA_ONDETECTRELATEDBUNDLE_RESULTS*>(pvResults));
1217 break;
1218 case BOOTSTRAPPER_APPLICATION_MESSAGE_ONDETECTPACKAGEBEGIN:
1219 OnDetectPackageBeginFallback(reinterpret_cast<BA_ONDETECTPACKAGEBEGIN_ARGS*>(pvArgs), reinterpret_cast<BA_ONDETECTPACKAGEBEGIN_RESULTS*>(pvResults));
1220 break;
1221 case BOOTSTRAPPER_APPLICATION_MESSAGE_ONDETECTRELATEDMSIPACKAGE:
1222 OnDetectRelatedMsiPackageFallback(reinterpret_cast<BA_ONDETECTRELATEDMSIPACKAGE_ARGS*>(pvArgs), reinterpret_cast<BA_ONDETECTRELATEDMSIPACKAGE_RESULTS*>(pvResults));
1223 break;
1224 case BOOTSTRAPPER_APPLICATION_MESSAGE_ONDETECTPATCHTARGET:
1225 OnDetectPatchTargetFallback(reinterpret_cast<BA_ONDETECTPATCHTARGET_ARGS*>(pvArgs), reinterpret_cast<BA_ONDETECTPATCHTARGET_RESULTS*>(pvResults));
1226 break;
1227 case BOOTSTRAPPER_APPLICATION_MESSAGE_ONDETECTMSIFEATURE:
1228 OnDetectMsiFeatureFallback(reinterpret_cast<BA_ONDETECTMSIFEATURE_ARGS*>(pvArgs), reinterpret_cast<BA_ONDETECTMSIFEATURE_RESULTS*>(pvResults));
1229 break;
1230 case BOOTSTRAPPER_APPLICATION_MESSAGE_ONDETECTPACKAGECOMPLETE:
1231 OnDetectPackageCompleteFallback(reinterpret_cast<BA_ONDETECTPACKAGECOMPLETE_ARGS*>(pvArgs), reinterpret_cast<BA_ONDETECTPACKAGECOMPLETE_RESULTS*>(pvResults));
1232 break;
1233 case BOOTSTRAPPER_APPLICATION_MESSAGE_ONPLANRELATEDBUNDLE:
1234 OnPlanRelatedBundleFallback(reinterpret_cast<BA_ONPLANRELATEDBUNDLE_ARGS*>(pvArgs), reinterpret_cast<BA_ONPLANRELATEDBUNDLE_RESULTS*>(pvResults));
1235 break;
1236 case BOOTSTRAPPER_APPLICATION_MESSAGE_ONPLANPACKAGEBEGIN:
1237 OnPlanPackageBeginFallback(reinterpret_cast<BA_ONPLANPACKAGEBEGIN_ARGS*>(pvArgs), reinterpret_cast<BA_ONPLANPACKAGEBEGIN_RESULTS*>(pvResults));
1238 break;
1239 case BOOTSTRAPPER_APPLICATION_MESSAGE_ONPLANPATCHTARGET:
1240 OnPlanPatchTargetFallback(reinterpret_cast<BA_ONPLANPATCHTARGET_ARGS*>(pvArgs), reinterpret_cast<BA_ONPLANPATCHTARGET_RESULTS*>(pvResults));
1241 break;
1242 case BOOTSTRAPPER_APPLICATION_MESSAGE_ONPLANMSIFEATURE:
1243 OnPlanMsiFeatureFallback(reinterpret_cast<BA_ONPLANMSIFEATURE_ARGS*>(pvArgs), reinterpret_cast<BA_ONPLANMSIFEATURE_RESULTS*>(pvResults));
1244 break;
1245 case BOOTSTRAPPER_APPLICATION_MESSAGE_ONPLANPACKAGECOMPLETE:
1246 OnPlanPackageCompleteFallback(reinterpret_cast<BA_ONPLANPACKAGECOMPLETE_ARGS*>(pvArgs), reinterpret_cast<BA_ONPLANPACKAGECOMPLETE_RESULTS*>(pvResults));
1247 break;
1248 case BOOTSTRAPPER_APPLICATION_MESSAGE_ONAPPLYBEGIN:
1249 OnApplyBeginFallback(reinterpret_cast<BA_ONAPPLYBEGIN_ARGS*>(pvArgs), reinterpret_cast<BA_ONAPPLYBEGIN_RESULTS*>(pvResults));
1250 break;
1251 case BOOTSTRAPPER_APPLICATION_MESSAGE_ONELEVATEBEGIN:
1252 OnElevateBeginFallback(reinterpret_cast<BA_ONELEVATEBEGIN_ARGS*>(pvArgs), reinterpret_cast<BA_ONELEVATEBEGIN_RESULTS*>(pvResults));
1253 break;
1254 case BOOTSTRAPPER_APPLICATION_MESSAGE_ONELEVATECOMPLETE:
1255 OnElevateCompleteFallback(reinterpret_cast<BA_ONELEVATECOMPLETE_ARGS*>(pvArgs), reinterpret_cast<BA_ONELEVATECOMPLETE_RESULTS*>(pvResults));
1256 break;
1257 case BOOTSTRAPPER_APPLICATION_MESSAGE_ONPROGRESS:
1258 OnProgressFallback(reinterpret_cast<BA_ONPROGRESS_ARGS*>(pvArgs), reinterpret_cast<BA_ONPROGRESS_RESULTS*>(pvResults));
1259 break;
1260 case BOOTSTRAPPER_APPLICATION_MESSAGE_ONERROR:
1261 OnErrorFallback(reinterpret_cast<BA_ONERROR_ARGS*>(pvArgs), reinterpret_cast<BA_ONERROR_RESULTS*>(pvResults));
1262 break;
1263 case BOOTSTRAPPER_APPLICATION_MESSAGE_ONREGISTERBEGIN:
1264 OnRegisterBeginFallback(reinterpret_cast<BA_ONREGISTERBEGIN_ARGS*>(pvArgs), reinterpret_cast<BA_ONREGISTERBEGIN_RESULTS*>(pvResults));
1265 break;
1266 case BOOTSTRAPPER_APPLICATION_MESSAGE_ONREGISTERCOMPLETE:
1267 OnRegisterCompleteFallback(reinterpret_cast<BA_ONREGISTERCOMPLETE_ARGS*>(pvArgs), reinterpret_cast<BA_ONREGISTERCOMPLETE_RESULTS*>(pvResults));
1268 break;
1269 case BOOTSTRAPPER_APPLICATION_MESSAGE_ONCACHEBEGIN:
1270 OnCacheBeginFallback(reinterpret_cast<BA_ONCACHEBEGIN_ARGS*>(pvArgs), reinterpret_cast<BA_ONCACHEBEGIN_RESULTS*>(pvResults));
1271 break;
1272 case BOOTSTRAPPER_APPLICATION_MESSAGE_ONCACHEPACKAGEBEGIN:
1273 OnCachePackageBeginFallback(reinterpret_cast<BA_ONCACHEPACKAGEBEGIN_ARGS*>(pvArgs), reinterpret_cast<BA_ONCACHEPACKAGEBEGIN_RESULTS*>(pvResults));
1274 break;
1275 case BOOTSTRAPPER_APPLICATION_MESSAGE_ONCACHEACQUIREBEGIN:
1276 OnCacheAcquireBeginFallback(reinterpret_cast<BA_ONCACHEACQUIREBEGIN_ARGS*>(pvArgs), reinterpret_cast<BA_ONCACHEACQUIREBEGIN_RESULTS*>(pvResults));
1277 break;
1278 case BOOTSTRAPPER_APPLICATION_MESSAGE_ONCACHEACQUIREPROGRESS:
1279 OnCacheAcquireProgressFallback(reinterpret_cast<BA_ONCACHEACQUIREPROGRESS_ARGS*>(pvArgs), reinterpret_cast<BA_ONCACHEACQUIREPROGRESS_RESULTS*>(pvResults));
1280 break;
1281 case BOOTSTRAPPER_APPLICATION_MESSAGE_ONCACHEACQUIRERESOLVING:
1282 OnCacheAcquireResolvingFallback(reinterpret_cast<BA_ONCACHEACQUIRERESOLVING_ARGS*>(pvArgs), reinterpret_cast<BA_ONCACHEACQUIRERESOLVING_RESULTS*>(pvResults));
1283 break;
1284 case BOOTSTRAPPER_APPLICATION_MESSAGE_ONCACHEACQUIRECOMPLETE:
1285 OnCacheAcquireCompleteFallback(reinterpret_cast<BA_ONCACHEACQUIRECOMPLETE_ARGS*>(pvArgs), reinterpret_cast<BA_ONCACHEACQUIRECOMPLETE_RESULTS*>(pvResults));
1286 break;
1287 case BOOTSTRAPPER_APPLICATION_MESSAGE_ONCACHEVERIFYBEGIN:
1288 OnCacheVerifyBeginFallback(reinterpret_cast<BA_ONCACHEVERIFYBEGIN_ARGS*>(pvArgs), reinterpret_cast<BA_ONCACHEVERIFYBEGIN_RESULTS*>(pvResults));
1289 break;
1290 case BOOTSTRAPPER_APPLICATION_MESSAGE_ONCACHEVERIFYCOMPLETE:
1291 OnCacheVerifyCompleteFallback(reinterpret_cast<BA_ONCACHEVERIFYCOMPLETE_ARGS*>(pvArgs), reinterpret_cast<BA_ONCACHEVERIFYCOMPLETE_RESULTS*>(pvResults));
1292 break;
1293 case BOOTSTRAPPER_APPLICATION_MESSAGE_ONCACHEPACKAGECOMPLETE:
1294 OnCachePackageCompleteFallback(reinterpret_cast<BA_ONCACHEPACKAGECOMPLETE_ARGS*>(pvArgs), reinterpret_cast<BA_ONCACHEPACKAGECOMPLETE_RESULTS*>(pvResults));
1295 break;
1296 case BOOTSTRAPPER_APPLICATION_MESSAGE_ONCACHECOMPLETE:
1297 OnCacheCompleteFallback(reinterpret_cast<BA_ONCACHECOMPLETE_ARGS*>(pvArgs), reinterpret_cast<BA_ONCACHECOMPLETE_RESULTS*>(pvResults));
1298 break;
1299 case BOOTSTRAPPER_APPLICATION_MESSAGE_ONEXECUTEBEGIN:
1300 OnExecuteBeginFallback(reinterpret_cast<BA_ONEXECUTEBEGIN_ARGS*>(pvArgs), reinterpret_cast<BA_ONEXECUTEBEGIN_RESULTS*>(pvResults));
1301 break;
1302 case BOOTSTRAPPER_APPLICATION_MESSAGE_ONEXECUTEPACKAGEBEGIN:
1303 OnExecutePackageBeginFallback(reinterpret_cast<BA_ONEXECUTEPACKAGEBEGIN_ARGS*>(pvArgs), reinterpret_cast<BA_ONEXECUTEPACKAGEBEGIN_RESULTS*>(pvResults));
1304 break;
1305 case BOOTSTRAPPER_APPLICATION_MESSAGE_ONEXECUTEPATCHTARGET:
1306 OnExecutePatchTargetFallback(reinterpret_cast<BA_ONEXECUTEPATCHTARGET_ARGS*>(pvArgs), reinterpret_cast<BA_ONEXECUTEPATCHTARGET_RESULTS*>(pvResults));
1307 break;
1308 case BOOTSTRAPPER_APPLICATION_MESSAGE_ONEXECUTEPROGRESS:
1309 OnExecuteProgressFallback(reinterpret_cast<BA_ONEXECUTEPROGRESS_ARGS*>(pvArgs), reinterpret_cast<BA_ONEXECUTEPROGRESS_RESULTS*>(pvResults));
1310 break;
1311 case BOOTSTRAPPER_APPLICATION_MESSAGE_ONEXECUTEMSIMESSAGE:
1312 OnExecuteMsiMessageFallback(reinterpret_cast<BA_ONEXECUTEMSIMESSAGE_ARGS*>(pvArgs), reinterpret_cast<BA_ONEXECUTEMSIMESSAGE_RESULTS*>(pvResults));
1313 break;
1314 case BOOTSTRAPPER_APPLICATION_MESSAGE_ONEXECUTEFILESINUSE:
1315 OnExecuteFilesInUseFallback(reinterpret_cast<BA_ONEXECUTEFILESINUSE_ARGS*>(pvArgs), reinterpret_cast<BA_ONEXECUTEFILESINUSE_RESULTS*>(pvResults));
1316 break;
1317 case BOOTSTRAPPER_APPLICATION_MESSAGE_ONEXECUTEPACKAGECOMPLETE:
1318 OnExecutePackageCompleteFallback(reinterpret_cast<BA_ONEXECUTEPACKAGECOMPLETE_ARGS*>(pvArgs), reinterpret_cast<BA_ONEXECUTEPACKAGECOMPLETE_RESULTS*>(pvResults));
1319 break;
1320 case BOOTSTRAPPER_APPLICATION_MESSAGE_ONEXECUTECOMPLETE:
1321 OnExecuteCompleteFallback(reinterpret_cast<BA_ONEXECUTECOMPLETE_ARGS*>(pvArgs), reinterpret_cast<BA_ONEXECUTECOMPLETE_RESULTS*>(pvResults));
1322 break;
1323 case BOOTSTRAPPER_APPLICATION_MESSAGE_ONUNREGISTERBEGIN:
1324 OnUnregisterBeginFallback(reinterpret_cast<BA_ONUNREGISTERBEGIN_ARGS*>(pvArgs), reinterpret_cast<BA_ONUNREGISTERBEGIN_RESULTS*>(pvResults));
1325 break;
1326 case BOOTSTRAPPER_APPLICATION_MESSAGE_ONUNREGISTERCOMPLETE:
1327 OnUnregisterCompleteFallback(reinterpret_cast<BA_ONUNREGISTERCOMPLETE_ARGS*>(pvArgs), reinterpret_cast<BA_ONUNREGISTERCOMPLETE_RESULTS*>(pvResults));
1328 break;
1329 case BOOTSTRAPPER_APPLICATION_MESSAGE_ONAPPLYCOMPLETE:
1330 OnApplyCompleteFallback(reinterpret_cast<BA_ONAPPLYCOMPLETE_ARGS*>(pvArgs), reinterpret_cast<BA_ONAPPLYCOMPLETE_RESULTS*>(pvResults));
1331 break;
1332 case BOOTSTRAPPER_APPLICATION_MESSAGE_ONLAUNCHAPPROVEDEXEBEGIN:
1333 OnLaunchApprovedExeBeginFallback(reinterpret_cast<BA_ONLAUNCHAPPROVEDEXEBEGIN_ARGS*>(pvArgs), reinterpret_cast<BA_ONLAUNCHAPPROVEDEXEBEGIN_RESULTS*>(pvResults));
1334 break;
1335 case BOOTSTRAPPER_APPLICATION_MESSAGE_ONLAUNCHAPPROVEDEXECOMPLETE:
1336 OnLaunchApprovedExeCompleteFallback(reinterpret_cast<BA_ONLAUNCHAPPROVEDEXECOMPLETE_ARGS*>(pvArgs), reinterpret_cast<BA_ONLAUNCHAPPROVEDEXECOMPLETE_RESULTS*>(pvResults));
1337 break;
1338 case BOOTSTRAPPER_APPLICATION_MESSAGE_ONPLANMSIPACKAGE:
1339 OnPlanMsiPackageFallback(reinterpret_cast<BA_ONPLANMSIPACKAGE_ARGS*>(pvArgs), reinterpret_cast<BA_ONPLANMSIPACKAGE_RESULTS*>(pvResults));
1340 break;
1341 case BOOTSTRAPPER_APPLICATION_MESSAGE_ONBEGINMSITRANSACTIONBEGIN:
1342 OnBeginMsiTransactionBeginFallback(reinterpret_cast<BA_ONBEGINMSITRANSACTIONBEGIN_ARGS*>(pvArgs), reinterpret_cast<BA_ONBEGINMSITRANSACTIONBEGIN_RESULTS*>(pvResults));
1343 break;
1344 case BOOTSTRAPPER_APPLICATION_MESSAGE_ONBEGINMSITRANSACTIONCOMPLETE:
1345 OnBeginMsiTransactionCompleteFallback(reinterpret_cast<BA_ONBEGINMSITRANSACTIONCOMPLETE_ARGS*>(pvArgs), reinterpret_cast<BA_ONBEGINMSITRANSACTIONCOMPLETE_RESULTS*>(pvResults));
1346 break;
1347 case BOOTSTRAPPER_APPLICATION_MESSAGE_ONCOMMITMSITRANSACTIONBEGIN:
1348 OnCommitMsiTransactionBeginFallback(reinterpret_cast<BA_ONCOMMITMSITRANSACTIONBEGIN_ARGS*>(pvArgs), reinterpret_cast<BA_ONCOMMITMSITRANSACTIONBEGIN_RESULTS*>(pvResults));
1349 break;
1350 case BOOTSTRAPPER_APPLICATION_MESSAGE_ONCOMMITMSITRANSACTIONCOMPLETE:
1351 OnCommitMsiTransactionCompleteFallback(reinterpret_cast<BA_ONCOMMITMSITRANSACTIONCOMPLETE_ARGS*>(pvArgs), reinterpret_cast<BA_ONCOMMITMSITRANSACTIONCOMPLETE_RESULTS*>(pvResults));
1352 break;
1353 case BOOTSTRAPPER_APPLICATION_MESSAGE_ONROLLBACKMSITRANSACTIONBEGIN:
1354 OnRollbackMsiTransactionBeginFallback(reinterpret_cast<BA_ONROLLBACKMSITRANSACTIONBEGIN_ARGS*>(pvArgs), reinterpret_cast<BA_ONROLLBACKMSITRANSACTIONBEGIN_RESULTS*>(pvResults));
1355 break;
1356 case BOOTSTRAPPER_APPLICATION_MESSAGE_ONROLLBACKMSITRANSACTIONCOMPLETE:
1357 OnRollbackMsiTransactionCompleteFallback(reinterpret_cast<BA_ONROLLBACKMSITRANSACTIONCOMPLETE_ARGS*>(pvArgs), reinterpret_cast<BA_ONROLLBACKMSITRANSACTIONCOMPLETE_RESULTS*>(pvResults));
1358 break;
1359 case BOOTSTRAPPER_APPLICATION_MESSAGE_ONPAUSEAUTOMATICUPDATESBEGIN:
1360 OnPauseAutomaticUpdatesBeginFallback(reinterpret_cast<BA_ONPAUSEAUTOMATICUPDATESBEGIN_ARGS*>(pvArgs), reinterpret_cast<BA_ONPAUSEAUTOMATICUPDATESBEGIN_RESULTS*>(pvResults));
1361 break;
1362 case BOOTSTRAPPER_APPLICATION_MESSAGE_ONPAUSEAUTOMATICUPDATESCOMPLETE:
1363 OnPauseAutomaticUpdatesCompleteFallback(reinterpret_cast<BA_ONPAUSEAUTOMATICUPDATESCOMPLETE_ARGS*>(pvArgs), reinterpret_cast<BA_ONPAUSEAUTOMATICUPDATESCOMPLETE_RESULTS*>(pvResults));
1364 break;
1365 case BOOTSTRAPPER_APPLICATION_MESSAGE_ONSYSTEMRESTOREPOINTBEGIN:
1366 OnSystemRestorePointBeginFallback(reinterpret_cast<BA_ONSYSTEMRESTOREPOINTBEGIN_ARGS*>(pvArgs), reinterpret_cast<BA_ONSYSTEMRESTOREPOINTBEGIN_RESULTS*>(pvResults));
1367 break;
1368 case BOOTSTRAPPER_APPLICATION_MESSAGE_ONSYSTEMRESTOREPOINTCOMPLETE:
1369 OnSystemRestorePointCompleteFallback(reinterpret_cast<BA_ONSYSTEMRESTOREPOINTCOMPLETE_ARGS*>(pvArgs), reinterpret_cast<BA_ONSYSTEMRESTOREPOINTCOMPLETE_RESULTS*>(pvResults));
1370 break;
1371 case BOOTSTRAPPER_APPLICATION_MESSAGE_ONPLANNEDPACKAGE:
1372 OnPlannedPackageFallback(reinterpret_cast<BA_ONPLANNEDPACKAGE_ARGS*>(pvArgs), reinterpret_cast<BA_ONPLANNEDPACKAGE_RESULTS*>(pvResults));
1373 break;
1374 case BOOTSTRAPPER_APPLICATION_MESSAGE_ONCACHEVERIFYPROGRESS:
1375 OnCacheVerifyProgressFallback(reinterpret_cast<BA_ONCACHEVERIFYPROGRESS_ARGS*>(pvArgs), reinterpret_cast<BA_ONCACHEVERIFYPROGRESS_RESULTS*>(pvResults));
1376 break;
1377 case BOOTSTRAPPER_APPLICATION_MESSAGE_ONCACHECONTAINERORPAYLOADVERIFYBEGIN:
1378 OnCacheContainerOrPayloadVerifyBeginFallback(reinterpret_cast<BA_ONCACHECONTAINERORPAYLOADVERIFYBEGIN_ARGS*>(pvArgs), reinterpret_cast<BA_ONCACHECONTAINERORPAYLOADVERIFYBEGIN_RESULTS*>(pvResults));
1379 break;
1380 case BOOTSTRAPPER_APPLICATION_MESSAGE_ONCACHECONTAINERORPAYLOADVERIFYCOMPLETE:
1381 OnCacheContainerOrPayloadVerifyCompleteFallback(reinterpret_cast<BA_ONCACHECONTAINERORPAYLOADVERIFYCOMPLETE_ARGS*>(pvArgs), reinterpret_cast<BA_ONCACHECONTAINERORPAYLOADVERIFYCOMPLETE_RESULTS*>(pvResults));
1382 break;
1383 case BOOTSTRAPPER_APPLICATION_MESSAGE_ONCACHECONTAINERORPAYLOADVERIFYPROGRESS:
1384 OnCacheContainerOrPayloadVerifyProgressFallback(reinterpret_cast<BA_ONCACHECONTAINERORPAYLOADVERIFYPROGRESS_ARGS*>(pvArgs), reinterpret_cast<BA_ONCACHECONTAINERORPAYLOADVERIFYPROGRESS_RESULTS*>(pvResults));
1385 break;
1386 case BOOTSTRAPPER_APPLICATION_MESSAGE_ONCACHEPAYLOADEXTRACTBEGIN:
1387 OnCachePayloadExtractBeginFallback(reinterpret_cast<BA_ONCACHEPAYLOADEXTRACTBEGIN_ARGS*>(pvArgs), reinterpret_cast<BA_ONCACHEPAYLOADEXTRACTBEGIN_RESULTS*>(pvResults));
1388 break;
1389 case BOOTSTRAPPER_APPLICATION_MESSAGE_ONCACHEPAYLOADEXTRACTCOMPLETE:
1390 OnCachePayloadExtractCompleteFallback(reinterpret_cast<BA_ONCACHEPAYLOADEXTRACTCOMPLETE_ARGS*>(pvArgs), reinterpret_cast<BA_ONCACHEPAYLOADEXTRACTCOMPLETE_RESULTS*>(pvResults));
1391 break;
1392 case BOOTSTRAPPER_APPLICATION_MESSAGE_ONCACHEPAYLOADEXTRACTPROGRESS:
1393 OnCachePayloadExtractProgressFallback(reinterpret_cast<BA_ONCACHEPAYLOADEXTRACTPROGRESS_ARGS*>(pvArgs), reinterpret_cast<BA_ONCACHEPAYLOADEXTRACTPROGRESS_RESULTS*>(pvResults));
1394 break;
1395 default:
1396#ifdef DEBUG
1397 BalLog(BOOTSTRAPPER_LOG_LEVEL_STANDARD, "WIXSTDBA: Forwarding unknown BA message: %d", message);
1398#endif
1399 m_pfnBAFunctionsProc((BA_FUNCTIONS_MESSAGE)message, pvArgs, pvResults, m_pvBAFunctionsProcContext);
1400 break;
1401 }
1402 }
1403
1404
1405private: // privates
1406 void OnDetectBeginFallback(
1407 __in BA_ONDETECTBEGIN_ARGS* pArgs,
1408 __inout BA_ONDETECTBEGIN_RESULTS* pResults
1409 )
1410 {
1411 m_pfnBAFunctionsProc(BA_FUNCTIONS_MESSAGE_ONDETECTBEGIN, pArgs, pResults, m_pvBAFunctionsProcContext);
1412 }
1413
1414 void OnDetectCompleteFallback(
1415 __in BA_ONDETECTCOMPLETE_ARGS* pArgs,
1416 __inout BA_ONDETECTCOMPLETE_RESULTS* pResults
1417 )
1418 {
1419 m_pfnBAFunctionsProc(BA_FUNCTIONS_MESSAGE_ONDETECTCOMPLETE, pArgs, pResults, m_pvBAFunctionsProcContext);
1420 }
1421
1422 void OnPlanBeginFallback(
1423 __in BA_ONPLANBEGIN_ARGS* pArgs,
1424 __inout BA_ONPLANBEGIN_RESULTS* pResults
1425 )
1426 {
1427 m_pfnBAFunctionsProc(BA_FUNCTIONS_MESSAGE_ONPLANBEGIN, pArgs, pResults, m_pvBAFunctionsProcContext);
1428 }
1429
1430 void OnPlanCompleteFallback(
1431 __in BA_ONPLANCOMPLETE_ARGS* pArgs,
1432 __inout BA_ONPLANCOMPLETE_RESULTS* pResults
1433 )
1434 {
1435 m_pfnBAFunctionsProc(BA_FUNCTIONS_MESSAGE_ONPLANCOMPLETE, pArgs, pResults, m_pvBAFunctionsProcContext);
1436 }
1437
1438 void OnShutdownFallback(
1439 __in BA_ONSHUTDOWN_ARGS* pArgs,
1440 __inout BA_ONSHUTDOWN_RESULTS* pResults
1441 )
1442 {
1443 m_pfnBAFunctionsProc(BA_FUNCTIONS_MESSAGE_ONSHUTDOWN, pArgs, pResults, m_pvBAFunctionsProcContext);
1444 }
1445
1446 void OnSystemShutdownFallback(
1447 __in BA_ONSYSTEMSHUTDOWN_ARGS* pArgs,
1448 __inout BA_ONSYSTEMSHUTDOWN_RESULTS* pResults
1449 )
1450 {
1451 m_pfnBAFunctionsProc(BA_FUNCTIONS_MESSAGE_ONSYSTEMSHUTDOWN, pArgs, pResults, m_pvBAFunctionsProcContext);
1452 }
1453
1454 void OnDetectForwardCompatibleBundleFallback(
1455 __in BA_ONDETECTFORWARDCOMPATIBLEBUNDLE_ARGS* pArgs,
1456 __inout BA_ONDETECTFORWARDCOMPATIBLEBUNDLE_RESULTS* pResults
1457 )
1458 {
1459 m_pfnBAFunctionsProc(BA_FUNCTIONS_MESSAGE_ONDETECTFORWARDCOMPATIBLEBUNDLE, pArgs, pResults, m_pvBAFunctionsProcContext);
1460 }
1461
1462 void OnDetectUpdateBeginFallback(
1463 __in BA_ONDETECTUPDATEBEGIN_ARGS* pArgs,
1464 __inout BA_ONDETECTUPDATEBEGIN_RESULTS* pResults
1465 )
1466 {
1467 m_pfnBAFunctionsProc(BA_FUNCTIONS_MESSAGE_ONDETECTUPDATEBEGIN, pArgs, pResults, m_pvBAFunctionsProcContext);
1468 }
1469
1470 void OnDetectUpdateFallback(
1471 __in BA_ONDETECTUPDATE_ARGS* pArgs,
1472 __inout BA_ONDETECTUPDATE_RESULTS* pResults
1473 )
1474 {
1475 m_pfnBAFunctionsProc(BA_FUNCTIONS_MESSAGE_ONDETECTUPDATE, pArgs, pResults, m_pvBAFunctionsProcContext);
1476 }
1477
1478 void OnDetectUpdateCompleteFallback(
1479 __in BA_ONDETECTUPDATECOMPLETE_ARGS* pArgs,
1480 __inout BA_ONDETECTUPDATECOMPLETE_RESULTS* pResults
1481 )
1482 {
1483 m_pfnBAFunctionsProc(BA_FUNCTIONS_MESSAGE_ONDETECTUPDATECOMPLETE, pArgs, pResults, m_pvBAFunctionsProcContext);
1484 }
1485
1486 void OnDetectRelatedBundleFallback(
1487 __in BA_ONDETECTRELATEDBUNDLE_ARGS* pArgs,
1488 __inout BA_ONDETECTRELATEDBUNDLE_RESULTS* pResults
1489 )
1490 {
1491 m_pfnBAFunctionsProc(BA_FUNCTIONS_MESSAGE_ONDETECTRELATEDBUNDLE, pArgs, pResults, m_pvBAFunctionsProcContext);
1492 }
1493
1494 void OnDetectPackageBeginFallback(
1495 __in BA_ONDETECTPACKAGEBEGIN_ARGS* pArgs,
1496 __inout BA_ONDETECTPACKAGEBEGIN_RESULTS* pResults
1497 )
1498 {
1499 m_pfnBAFunctionsProc(BA_FUNCTIONS_MESSAGE_ONDETECTPACKAGEBEGIN, pArgs, pResults, m_pvBAFunctionsProcContext);
1500 }
1501
1502 void OnDetectRelatedMsiPackageFallback(
1503 __in BA_ONDETECTRELATEDMSIPACKAGE_ARGS* pArgs,
1504 __inout BA_ONDETECTRELATEDMSIPACKAGE_RESULTS* pResults
1505 )
1506 {
1507 m_pfnBAFunctionsProc(BA_FUNCTIONS_MESSAGE_ONDETECTRELATEDMSIPACKAGE, pArgs, pResults, m_pvBAFunctionsProcContext);
1508 }
1509
1510 void OnDetectPatchTargetFallback(
1511 __in BA_ONDETECTPATCHTARGET_ARGS* pArgs,
1512 __inout BA_ONDETECTPATCHTARGET_RESULTS* pResults
1513 )
1514 {
1515 m_pfnBAFunctionsProc(BA_FUNCTIONS_MESSAGE_ONDETECTPATCHTARGET, pArgs, pResults, m_pvBAFunctionsProcContext);
1516 }
1517
1518 void OnDetectMsiFeatureFallback(
1519 __in BA_ONDETECTMSIFEATURE_ARGS* pArgs,
1520 __inout BA_ONDETECTMSIFEATURE_RESULTS* pResults
1521 )
1522 {
1523 m_pfnBAFunctionsProc(BA_FUNCTIONS_MESSAGE_ONDETECTMSIFEATURE, pArgs, pResults, m_pvBAFunctionsProcContext);
1524 }
1525
1526 void OnDetectPackageCompleteFallback(
1527 __in BA_ONDETECTPACKAGECOMPLETE_ARGS* pArgs,
1528 __inout BA_ONDETECTPACKAGECOMPLETE_RESULTS* pResults
1529 )
1530 {
1531 m_pfnBAFunctionsProc(BA_FUNCTIONS_MESSAGE_ONDETECTPACKAGECOMPLETE, pArgs, pResults, m_pvBAFunctionsProcContext);
1532 }
1533
1534 void OnPlanRelatedBundleFallback(
1535 __in BA_ONPLANRELATEDBUNDLE_ARGS* pArgs,
1536 __inout BA_ONPLANRELATEDBUNDLE_RESULTS* pResults
1537 )
1538 {
1539 BOOTSTRAPPER_REQUEST_STATE requestedState = pResults->requestedState;
1540 m_pfnBAFunctionsProc(BA_FUNCTIONS_MESSAGE_ONPLANRELATEDBUNDLE, pArgs, pResults, m_pvBAFunctionsProcContext);
1541 BalLogId(BOOTSTRAPPER_LOG_LEVEL_STANDARD, MSG_WIXSTDBA_PLANNED_RELATED_BUNDLE, m_hModule, pArgs->wzBundleId, LoggingRequestStateToString(requestedState), LoggingRequestStateToString(pResults->requestedState));
1542 }
1543
1544 void OnPlanPackageBeginFallback(
1545 __in BA_ONPLANPACKAGEBEGIN_ARGS* pArgs,
1546 __inout BA_ONPLANPACKAGEBEGIN_RESULTS* pResults
1547 )
1548 {
1549 BOOTSTRAPPER_REQUEST_STATE requestedState = pResults->requestedState;
1550 m_pfnBAFunctionsProc(BA_FUNCTIONS_MESSAGE_ONPLANPACKAGEBEGIN, pArgs, pResults, m_pvBAFunctionsProcContext);
1551 BalLogId(BOOTSTRAPPER_LOG_LEVEL_STANDARD, MSG_WIXSTDBA_PLANNED_PACKAGE, m_hModule, pArgs->wzPackageId, LoggingRequestStateToString(requestedState), LoggingRequestStateToString(pResults->requestedState));
1552 }
1553
1554 void OnPlanPatchTargetFallback(
1555 __in BA_ONPLANPATCHTARGET_ARGS* pArgs,
1556 __inout BA_ONPLANPATCHTARGET_RESULTS* pResults
1557 )
1558 {
1559 BOOTSTRAPPER_REQUEST_STATE requestedState = pResults->requestedState;
1560 m_pfnBAFunctionsProc(BA_FUNCTIONS_MESSAGE_ONPLANPATCHTARGET, pArgs, pResults, m_pvBAFunctionsProcContext);
1561 BalLogId(BOOTSTRAPPER_LOG_LEVEL_STANDARD, MSG_WIXSTDBA_PLANNED_TARGET_MSI_PACKAGE, m_hModule, pArgs->wzPackageId, pArgs->wzProductCode, LoggingRequestStateToString(requestedState), LoggingRequestStateToString(pResults->requestedState));
1562 }
1563
1564 void OnPlanMsiFeatureFallback(
1565 __in BA_ONPLANMSIFEATURE_ARGS* pArgs,
1566 __inout BA_ONPLANMSIFEATURE_RESULTS* pResults
1567 )
1568 {
1569 BOOTSTRAPPER_FEATURE_STATE requestedState = pResults->requestedState;
1570 m_pfnBAFunctionsProc(BA_FUNCTIONS_MESSAGE_ONPLANMSIFEATURE, pArgs, pResults, m_pvBAFunctionsProcContext);
1571 BalLogId(BOOTSTRAPPER_LOG_LEVEL_STANDARD, MSG_WIXSTDBA_PLANNED_MSI_FEATURE, m_hModule, pArgs->wzPackageId, pArgs->wzFeatureId, LoggingMsiFeatureStateToString(requestedState), LoggingMsiFeatureStateToString(pResults->requestedState));
1572 }
1573
1574 void OnPlanPackageCompleteFallback(
1575 __in BA_ONPLANPACKAGECOMPLETE_ARGS* pArgs,
1576 __inout BA_ONPLANPACKAGECOMPLETE_RESULTS* pResults
1577 )
1578 {
1579 m_pfnBAFunctionsProc(BA_FUNCTIONS_MESSAGE_ONPLANPACKAGECOMPLETE, pArgs, pResults, m_pvBAFunctionsProcContext);
1580 }
1581
1582 void OnPlannedPackageFallback(
1583 __in BA_ONPLANNEDPACKAGE_ARGS* pArgs,
1584 __inout BA_ONPLANNEDPACKAGE_RESULTS* pResults
1585 )
1586 {
1587 m_pfnBAFunctionsProc(BA_FUNCTIONS_MESSAGE_ONPLANNEDPACKAGE, pArgs, pResults, m_pvBAFunctionsProcContext);
1588 }
1589
1590 void OnApplyBeginFallback(
1591 __in BA_ONAPPLYBEGIN_ARGS* pArgs,
1592 __inout BA_ONAPPLYBEGIN_RESULTS* pResults
1593 )
1594 {
1595 m_pfnBAFunctionsProc(BA_FUNCTIONS_MESSAGE_ONAPPLYBEGIN, pArgs, pResults, m_pvBAFunctionsProcContext);
1596 }
1597
1598 void OnElevateBeginFallback(
1599 __in BA_ONELEVATEBEGIN_ARGS* pArgs,
1600 __inout BA_ONELEVATEBEGIN_RESULTS* pResults
1601 )
1602 {
1603 m_pfnBAFunctionsProc(BA_FUNCTIONS_MESSAGE_ONELEVATEBEGIN, pArgs, pResults, m_pvBAFunctionsProcContext);
1604 }
1605
1606 void OnElevateCompleteFallback(
1607 __in BA_ONELEVATECOMPLETE_ARGS* pArgs,
1608 __inout BA_ONELEVATECOMPLETE_RESULTS* pResults
1609 )
1610 {
1611 m_pfnBAFunctionsProc(BA_FUNCTIONS_MESSAGE_ONELEVATECOMPLETE, pArgs, pResults, m_pvBAFunctionsProcContext);
1612 }
1613
1614 void OnProgressFallback(
1615 __in BA_ONPROGRESS_ARGS* pArgs,
1616 __inout BA_ONPROGRESS_RESULTS* pResults
1617 )
1618 {
1619 m_pfnBAFunctionsProc(BA_FUNCTIONS_MESSAGE_ONPROGRESS, pArgs, pResults, m_pvBAFunctionsProcContext);
1620 }
1621
1622 void OnErrorFallback(
1623 __in BA_ONERROR_ARGS* pArgs,
1624 __inout BA_ONERROR_RESULTS* pResults
1625 )
1626 {
1627 m_pfnBAFunctionsProc(BA_FUNCTIONS_MESSAGE_ONERROR, pArgs, pResults, m_pvBAFunctionsProcContext);
1628 }
1629
1630 void OnRegisterBeginFallback(
1631 __in BA_ONREGISTERBEGIN_ARGS* pArgs,
1632 __inout BA_ONREGISTERBEGIN_RESULTS* pResults
1633 )
1634 {
1635 m_pfnBAFunctionsProc(BA_FUNCTIONS_MESSAGE_ONREGISTERBEGIN, pArgs, pResults, m_pvBAFunctionsProcContext);
1636 }
1637
1638 void OnRegisterCompleteFallback(
1639 __in BA_ONREGISTERCOMPLETE_ARGS* pArgs,
1640 __inout BA_ONREGISTERCOMPLETE_RESULTS* pResults
1641 )
1642 {
1643 m_pfnBAFunctionsProc(BA_FUNCTIONS_MESSAGE_ONREGISTERCOMPLETE, pArgs, pResults, m_pvBAFunctionsProcContext);
1644 }
1645
1646 void OnCacheBeginFallback(
1647 __in BA_ONCACHEBEGIN_ARGS* pArgs,
1648 __inout BA_ONCACHEBEGIN_RESULTS* pResults
1649 )
1650 {
1651 m_pfnBAFunctionsProc(BA_FUNCTIONS_MESSAGE_ONCACHEBEGIN, pArgs, pResults, m_pvBAFunctionsProcContext);
1652 }
1653
1654 void OnCachePackageBeginFallback(
1655 __in BA_ONCACHEPACKAGEBEGIN_ARGS* pArgs,
1656 __inout BA_ONCACHEPACKAGEBEGIN_RESULTS* pResults
1657 )
1658 {
1659 m_pfnBAFunctionsProc(BA_FUNCTIONS_MESSAGE_ONCACHEPACKAGEBEGIN, pArgs, pResults, m_pvBAFunctionsProcContext);
1660 }
1661
1662 void OnCacheAcquireBeginFallback(
1663 __in BA_ONCACHEACQUIREBEGIN_ARGS* pArgs,
1664 __inout BA_ONCACHEACQUIREBEGIN_RESULTS* pResults
1665 )
1666 {
1667 m_pfnBAFunctionsProc(BA_FUNCTIONS_MESSAGE_ONCACHEACQUIREBEGIN, pArgs, pResults, m_pvBAFunctionsProcContext);
1668 }
1669
1670 void OnCacheAcquireProgressFallback(
1671 __in BA_ONCACHEACQUIREPROGRESS_ARGS* pArgs,
1672 __inout BA_ONCACHEACQUIREPROGRESS_RESULTS* pResults
1673 )
1674 {
1675 m_pfnBAFunctionsProc(BA_FUNCTIONS_MESSAGE_ONCACHEACQUIREPROGRESS, pArgs, pResults, m_pvBAFunctionsProcContext);
1676 }
1677
1678 void OnCacheAcquireResolvingFallback(
1679 __in BA_ONCACHEACQUIRERESOLVING_ARGS* pArgs,
1680 __inout BA_ONCACHEACQUIRERESOLVING_RESULTS* pResults
1681 )
1682 {
1683 m_pfnBAFunctionsProc(BA_FUNCTIONS_MESSAGE_ONCACHEACQUIRERESOLVING, pArgs, pResults, m_pvBAFunctionsProcContext);
1684 }
1685
1686 void OnCacheAcquireCompleteFallback(
1687 __in BA_ONCACHEACQUIRECOMPLETE_ARGS* pArgs,
1688 __inout BA_ONCACHEACQUIRECOMPLETE_RESULTS* pResults
1689 )
1690 {
1691 m_pfnBAFunctionsProc(BA_FUNCTIONS_MESSAGE_ONCACHEACQUIRECOMPLETE, pArgs, pResults, m_pvBAFunctionsProcContext);
1692 }
1693
1694 void OnCacheVerifyBeginFallback(
1695 __in BA_ONCACHEVERIFYBEGIN_ARGS* pArgs,
1696 __inout BA_ONCACHEVERIFYBEGIN_RESULTS* pResults
1697 )
1698 {
1699 m_pfnBAFunctionsProc(BA_FUNCTIONS_MESSAGE_ONCACHEVERIFYBEGIN, pArgs, pResults, m_pvBAFunctionsProcContext);
1700 }
1701
1702 void OnCacheVerifyCompleteFallback(
1703 __in BA_ONCACHEVERIFYCOMPLETE_ARGS* pArgs,
1704 __inout BA_ONCACHEVERIFYCOMPLETE_RESULTS* pResults
1705 )
1706 {
1707 m_pfnBAFunctionsProc(BA_FUNCTIONS_MESSAGE_ONCACHEVERIFYCOMPLETE, pArgs, pResults, m_pvBAFunctionsProcContext);
1708 }
1709
1710 void OnCachePackageCompleteFallback(
1711 __in BA_ONCACHEPACKAGECOMPLETE_ARGS* pArgs,
1712 __inout BA_ONCACHEPACKAGECOMPLETE_RESULTS* pResults
1713 )
1714 {
1715 m_pfnBAFunctionsProc(BA_FUNCTIONS_MESSAGE_ONCACHEPACKAGECOMPLETE, pArgs, pResults, m_pvBAFunctionsProcContext);
1716 }
1717
1718 void OnCacheCompleteFallback(
1719 __in BA_ONCACHECOMPLETE_ARGS* pArgs,
1720 __inout BA_ONCACHECOMPLETE_RESULTS* pResults
1721 )
1722 {
1723 m_pfnBAFunctionsProc(BA_FUNCTIONS_MESSAGE_ONCACHECOMPLETE, pArgs, pResults, m_pvBAFunctionsProcContext);
1724 }
1725
1726 void OnExecuteBeginFallback(
1727 __in BA_ONEXECUTEBEGIN_ARGS* pArgs,
1728 __inout BA_ONEXECUTEBEGIN_RESULTS* pResults
1729 )
1730 {
1731 m_pfnBAFunctionsProc(BA_FUNCTIONS_MESSAGE_ONEXECUTEBEGIN, pArgs, pResults, m_pvBAFunctionsProcContext);
1732 }
1733
1734 void OnExecutePackageBeginFallback(
1735 __in BA_ONEXECUTEPACKAGEBEGIN_ARGS* pArgs,
1736 __inout BA_ONEXECUTEPACKAGEBEGIN_RESULTS* pResults
1737 )
1738 {
1739 m_pfnBAFunctionsProc(BA_FUNCTIONS_MESSAGE_ONEXECUTEPACKAGEBEGIN, pArgs, pResults, m_pvBAFunctionsProcContext);
1740 }
1741
1742 void OnExecutePatchTargetFallback(
1743 __in BA_ONEXECUTEPATCHTARGET_ARGS* pArgs,
1744 __inout BA_ONEXECUTEPATCHTARGET_RESULTS* pResults
1745 )
1746 {
1747 m_pfnBAFunctionsProc(BA_FUNCTIONS_MESSAGE_ONEXECUTEPATCHTARGET, pArgs, pResults, m_pvBAFunctionsProcContext);
1748 }
1749
1750 void OnExecuteProgressFallback(
1751 __in BA_ONEXECUTEPROGRESS_ARGS* pArgs,
1752 __inout BA_ONEXECUTEPROGRESS_RESULTS* pResults
1753 )
1754 {
1755 m_pfnBAFunctionsProc(BA_FUNCTIONS_MESSAGE_ONEXECUTEPROGRESS, pArgs, pResults, m_pvBAFunctionsProcContext);
1756 }
1757
1758 void OnExecuteMsiMessageFallback(
1759 __in BA_ONEXECUTEMSIMESSAGE_ARGS* pArgs,
1760 __inout BA_ONEXECUTEMSIMESSAGE_RESULTS* pResults
1761 )
1762 {
1763 m_pfnBAFunctionsProc(BA_FUNCTIONS_MESSAGE_ONEXECUTEMSIMESSAGE, pArgs, pResults, m_pvBAFunctionsProcContext);
1764 }
1765
1766 void OnExecuteFilesInUseFallback(
1767 __in BA_ONEXECUTEFILESINUSE_ARGS* pArgs,
1768 __inout BA_ONEXECUTEFILESINUSE_RESULTS* pResults
1769 )
1770 {
1771 m_pfnBAFunctionsProc(BA_FUNCTIONS_MESSAGE_ONEXECUTEFILESINUSE, pArgs, pResults, m_pvBAFunctionsProcContext);
1772 }
1773
1774 void OnExecutePackageCompleteFallback(
1775 __in BA_ONEXECUTEPACKAGECOMPLETE_ARGS* pArgs,
1776 __inout BA_ONEXECUTEPACKAGECOMPLETE_RESULTS* pResults
1777 )
1778 {
1779 m_pfnBAFunctionsProc(BA_FUNCTIONS_MESSAGE_ONEXECUTEPACKAGECOMPLETE, pArgs, pResults, m_pvBAFunctionsProcContext);
1780 }
1781
1782 void OnExecuteCompleteFallback(
1783 __in BA_ONEXECUTECOMPLETE_ARGS* pArgs,
1784 __inout BA_ONEXECUTECOMPLETE_RESULTS* pResults
1785 )
1786 {
1787 m_pfnBAFunctionsProc(BA_FUNCTIONS_MESSAGE_ONEXECUTECOMPLETE, pArgs, pResults, m_pvBAFunctionsProcContext);
1788 }
1789
1790 void OnUnregisterBeginFallback(
1791 __in BA_ONUNREGISTERBEGIN_ARGS* pArgs,
1792 __inout BA_ONUNREGISTERBEGIN_RESULTS* pResults
1793 )
1794 {
1795 m_pfnBAFunctionsProc(BA_FUNCTIONS_MESSAGE_ONUNREGISTERBEGIN, pArgs, pResults, m_pvBAFunctionsProcContext);
1796 }
1797
1798 void OnUnregisterCompleteFallback(
1799 __in BA_ONUNREGISTERCOMPLETE_ARGS* pArgs,
1800 __inout BA_ONUNREGISTERCOMPLETE_RESULTS* pResults
1801 )
1802 {
1803 m_pfnBAFunctionsProc(BA_FUNCTIONS_MESSAGE_ONUNREGISTERCOMPLETE, pArgs, pResults, m_pvBAFunctionsProcContext);
1804 }
1805
1806 void OnApplyCompleteFallback(
1807 __in BA_ONAPPLYCOMPLETE_ARGS* pArgs,
1808 __inout BA_ONAPPLYCOMPLETE_RESULTS* pResults
1809 )
1810 {
1811 m_pfnBAFunctionsProc(BA_FUNCTIONS_MESSAGE_ONAPPLYCOMPLETE, pArgs, pResults, m_pvBAFunctionsProcContext);
1812 }
1813
1814 void OnLaunchApprovedExeBeginFallback(
1815 __in BA_ONLAUNCHAPPROVEDEXEBEGIN_ARGS* pArgs,
1816 __inout BA_ONLAUNCHAPPROVEDEXEBEGIN_RESULTS* pResults
1817 )
1818 {
1819 m_pfnBAFunctionsProc(BA_FUNCTIONS_MESSAGE_ONLAUNCHAPPROVEDEXEBEGIN, pArgs, pResults, m_pvBAFunctionsProcContext);
1820 }
1821
1822 void OnLaunchApprovedExeCompleteFallback(
1823 __in BA_ONLAUNCHAPPROVEDEXECOMPLETE_ARGS* pArgs,
1824 __inout BA_ONLAUNCHAPPROVEDEXECOMPLETE_RESULTS* pResults
1825 )
1826 {
1827 m_pfnBAFunctionsProc(BA_FUNCTIONS_MESSAGE_ONLAUNCHAPPROVEDEXECOMPLETE, pArgs, pResults, m_pvBAFunctionsProcContext);
1828 }
1829
1830 void OnPlanMsiPackageFallback(
1831 __in BA_ONPLANMSIPACKAGE_ARGS* pArgs,
1832 __inout BA_ONPLANMSIPACKAGE_RESULTS* pResults
1833 )
1834 {
1835 BURN_MSI_PROPERTY actionMsiProperty = pResults->actionMsiProperty;
1836 INSTALLUILEVEL uiLevel = pResults->uiLevel;
1837 BOOL fDisableExternalUiHandler = pResults->fDisableExternalUiHandler;
1838 m_pfnBAFunctionsProc(BA_FUNCTIONS_MESSAGE_ONPLANMSIPACKAGE, pArgs, pResults, m_pvBAFunctionsProcContext);
1839 BalLogId(BOOTSTRAPPER_LOG_LEVEL_STANDARD, MSG_WIXSTDBA_PLANNED_MSI_PACKAGE, m_hModule, pArgs->wzPackageId, actionMsiProperty, uiLevel, fDisableExternalUiHandler ? "yes" : "no", pResults->actionMsiProperty, pResults->uiLevel, pResults->fDisableExternalUiHandler ? "yes" : "no");
1840 }
1841
1842 void OnBeginMsiTransactionBeginFallback(
1843 __in BA_ONBEGINMSITRANSACTIONBEGIN_ARGS* pArgs,
1844 __inout BA_ONBEGINMSITRANSACTIONBEGIN_RESULTS* pResults
1845 )
1846 {
1847 m_pfnBAFunctionsProc(BA_FUNCTIONS_MESSAGE_ONBEGINMSITRANSACTIONBEGIN, pArgs, pResults, m_pvBAFunctionsProcContext);
1848 }
1849
1850 void OnBeginMsiTransactionCompleteFallback(
1851 __in BA_ONBEGINMSITRANSACTIONCOMPLETE_ARGS* pArgs,
1852 __inout BA_ONBEGINMSITRANSACTIONCOMPLETE_RESULTS* pResults
1853 )
1854 {
1855 m_pfnBAFunctionsProc(BA_FUNCTIONS_MESSAGE_ONBEGINMSITRANSACTIONCOMPLETE, pArgs, pResults, m_pvBAFunctionsProcContext);
1856 }
1857
1858 void OnCommitMsiTransactionBeginFallback(
1859 __in BA_ONCOMMITMSITRANSACTIONBEGIN_ARGS* pArgs,
1860 __inout BA_ONCOMMITMSITRANSACTIONBEGIN_RESULTS* pResults
1861 )
1862 {
1863 m_pfnBAFunctionsProc(BA_FUNCTIONS_MESSAGE_ONCOMMITMSITRANSACTIONBEGIN, pArgs, pResults, m_pvBAFunctionsProcContext);
1864 }
1865
1866 void OnCommitMsiTransactionCompleteFallback(
1867 __in BA_ONCOMMITMSITRANSACTIONCOMPLETE_ARGS* pArgs,
1868 __inout BA_ONCOMMITMSITRANSACTIONCOMPLETE_RESULTS* pResults
1869 )
1870 {
1871 m_pfnBAFunctionsProc(BA_FUNCTIONS_MESSAGE_ONCOMMITMSITRANSACTIONCOMPLETE, pArgs, pResults, m_pvBAFunctionsProcContext);
1872 }
1873
1874 void OnRollbackMsiTransactionBeginFallback(
1875 __in BA_ONROLLBACKMSITRANSACTIONBEGIN_ARGS* pArgs,
1876 __inout BA_ONROLLBACKMSITRANSACTIONBEGIN_RESULTS* pResults
1877 )
1878 {
1879 m_pfnBAFunctionsProc(BA_FUNCTIONS_MESSAGE_ONROLLBACKMSITRANSACTIONBEGIN, pArgs, pResults, m_pvBAFunctionsProcContext);
1880 }
1881
1882 void OnRollbackMsiTransactionCompleteFallback(
1883 __in BA_ONROLLBACKMSITRANSACTIONCOMPLETE_ARGS* pArgs,
1884 __inout BA_ONROLLBACKMSITRANSACTIONCOMPLETE_RESULTS* pResults
1885 )
1886 {
1887 m_pfnBAFunctionsProc(BA_FUNCTIONS_MESSAGE_ONROLLBACKMSITRANSACTIONCOMPLETE, pArgs, pResults, m_pvBAFunctionsProcContext);
1888 }
1889
1890 void OnPauseAutomaticUpdatesBeginFallback(
1891 __in BA_ONPAUSEAUTOMATICUPDATESBEGIN_ARGS* pArgs,
1892 __inout BA_ONPAUSEAUTOMATICUPDATESBEGIN_RESULTS* pResults
1893 )
1894 {
1895 m_pfnBAFunctionsProc(BA_FUNCTIONS_MESSAGE_ONPAUSEAUTOMATICUPDATESBEGIN, pArgs, pResults, m_pvBAFunctionsProcContext);
1896 }
1897
1898 void OnPauseAutomaticUpdatesCompleteFallback(
1899 __in BA_ONPAUSEAUTOMATICUPDATESCOMPLETE_ARGS* pArgs,
1900 __inout BA_ONPAUSEAUTOMATICUPDATESCOMPLETE_RESULTS* pResults
1901 )
1902 {
1903 m_pfnBAFunctionsProc(BA_FUNCTIONS_MESSAGE_ONPAUSEAUTOMATICUPDATESCOMPLETE, pArgs, pResults, m_pvBAFunctionsProcContext);
1904 }
1905
1906 void OnSystemRestorePointBeginFallback(
1907 __in BA_ONSYSTEMRESTOREPOINTBEGIN_ARGS* pArgs,
1908 __inout BA_ONSYSTEMRESTOREPOINTBEGIN_RESULTS* pResults
1909 )
1910 {
1911 m_pfnBAFunctionsProc(BA_FUNCTIONS_MESSAGE_ONSYSTEMRESTOREPOINTBEGIN, pArgs, pResults, m_pvBAFunctionsProcContext);
1912 }
1913
1914 void OnSystemRestorePointCompleteFallback(
1915 __in BA_ONSYSTEMRESTOREPOINTCOMPLETE_ARGS* pArgs,
1916 __inout BA_ONSYSTEMRESTOREPOINTCOMPLETE_RESULTS* pResults
1917 )
1918 {
1919 m_pfnBAFunctionsProc(BA_FUNCTIONS_MESSAGE_ONSYSTEMRESTOREPOINTCOMPLETE, pArgs, pResults, m_pvBAFunctionsProcContext);
1920 }
1921
1922 void OnPlanForwardCompatibleBundleFallback(
1923 __in BA_ONPLANFORWARDCOMPATIBLEBUNDLE_ARGS* pArgs,
1924 __inout BA_ONPLANFORWARDCOMPATIBLEBUNDLE_RESULTS* pResults
1925 )
1926 {
1927 BOOL fIgnoreBundle = pResults->fIgnoreBundle;
1928 m_pfnBAFunctionsProc(BA_FUNCTIONS_MESSAGE_ONPLANFORWARDCOMPATIBLEBUNDLE, pArgs, pResults, m_pvBAFunctionsProcContext);
1929 BalLogId(BOOTSTRAPPER_LOG_LEVEL_STANDARD, MSG_WIXSTDBA_PLANNED_FORWARD_COMPATIBLE_BUNDLE, m_hModule, pArgs->wzBundleId, fIgnoreBundle ? "ignore" : "enable", pResults->fIgnoreBundle ? "ignore" : "enable");
1930 }
1931
1932 void OnCacheVerifyProgressFallback(
1933 __in BA_ONCACHEVERIFYPROGRESS_ARGS* pArgs,
1934 __inout BA_ONCACHEVERIFYPROGRESS_RESULTS* pResults
1935 )
1936 {
1937 m_pfnBAFunctionsProc(BA_FUNCTIONS_MESSAGE_ONCACHEVERIFYPROGRESS, pArgs, pResults, m_pvBAFunctionsProcContext);
1938 }
1939
1940 void OnCacheContainerOrPayloadVerifyBeginFallback(
1941 __in BA_ONCACHECONTAINERORPAYLOADVERIFYBEGIN_ARGS* pArgs,
1942 __inout BA_ONCACHECONTAINERORPAYLOADVERIFYBEGIN_RESULTS* pResults
1943 )
1944 {
1945 m_pfnBAFunctionsProc(BA_FUNCTIONS_MESSAGE_ONCACHECONTAINERORPAYLOADVERIFYBEGIN, pArgs, pResults, m_pvBAFunctionsProcContext);
1946 }
1947
1948 void OnCacheContainerOrPayloadVerifyCompleteFallback(
1949 __in BA_ONCACHECONTAINERORPAYLOADVERIFYCOMPLETE_ARGS* pArgs,
1950 __inout BA_ONCACHECONTAINERORPAYLOADVERIFYCOMPLETE_RESULTS* pResults
1951 )
1952 {
1953 m_pfnBAFunctionsProc(BA_FUNCTIONS_MESSAGE_ONCACHECONTAINERORPAYLOADVERIFYCOMPLETE, pArgs, pResults, m_pvBAFunctionsProcContext);
1954 }
1955
1956 void OnCacheContainerOrPayloadVerifyProgressFallback(
1957 __in BA_ONCACHECONTAINERORPAYLOADVERIFYPROGRESS_ARGS* pArgs,
1958 __inout BA_ONCACHECONTAINERORPAYLOADVERIFYPROGRESS_RESULTS* pResults
1959 )
1960 {
1961 m_pfnBAFunctionsProc(BA_FUNCTIONS_MESSAGE_ONCACHECONTAINERORPAYLOADVERIFYPROGRESS, pArgs, pResults, m_pvBAFunctionsProcContext);
1962 }
1963
1964 void OnCachePayloadExtractBeginFallback(
1965 __in BA_ONCACHEPAYLOADEXTRACTBEGIN_ARGS* pArgs,
1966 __inout BA_ONCACHEPAYLOADEXTRACTBEGIN_RESULTS* pResults
1967 )
1968 {
1969 m_pfnBAFunctionsProc(BA_FUNCTIONS_MESSAGE_ONCACHEPAYLOADEXTRACTBEGIN, pArgs, pResults, m_pvBAFunctionsProcContext);
1970 }
1971
1972 void OnCachePayloadExtractCompleteFallback(
1973 __in BA_ONCACHEPAYLOADEXTRACTCOMPLETE_ARGS* pArgs,
1974 __inout BA_ONCACHEPAYLOADEXTRACTCOMPLETE_RESULTS* pResults
1975 )
1976 {
1977 m_pfnBAFunctionsProc(BA_FUNCTIONS_MESSAGE_ONCACHEPAYLOADEXTRACTCOMPLETE, pArgs, pResults, m_pvBAFunctionsProcContext);
1978 }
1979
1980 void OnCachePayloadExtractProgressFallback(
1981 __in BA_ONCACHEPAYLOADEXTRACTPROGRESS_ARGS* pArgs,
1982 __inout BA_ONCACHEPAYLOADEXTRACTPROGRESS_RESULTS* pResults
1983 )
1984 {
1985 m_pfnBAFunctionsProc(BA_FUNCTIONS_MESSAGE_ONCACHEPAYLOADEXTRACTPROGRESS, pArgs, pResults, m_pvBAFunctionsProcContext);
1986 }
1987
1988 //
1989 // UiThreadProc - entrypoint for UI thread.
1990 //
1991 static DWORD WINAPI UiThreadProc(
1992 __in LPVOID pvContext
1993 )
1994 {
1995 HRESULT hr = S_OK;
1996 CWixStandardBootstrapperApplication* pThis = (CWixStandardBootstrapperApplication*)pvContext;
1997 BOOL fComInitialized = FALSE;
1998 BOOL fRet = FALSE;
1999 MSG msg = { };
2000
2001 // Initialize COM and theme.
2002 hr = ::CoInitialize(NULL);
2003 BalExitOnFailure(hr, "Failed to initialize COM.");
2004 fComInitialized = TRUE;
2005
2006 hr = ThemeInitialize(pThis->m_hModule);
2007 BalExitOnFailure(hr, "Failed to initialize theme manager.");
2008
2009 hr = pThis->InitializeData();
2010 BalExitOnFailure(hr, "Failed to initialize data in bootstrapper application.");
2011
2012 // Create main window.
2013 pThis->InitializeTaskbarButton();
2014 hr = pThis->CreateMainWindow();
2015 BalExitOnFailure(hr, "Failed to create main window.");
2016
2017 if (FAILED(pThis->m_hrFinal))
2018 {
2019 pThis->SetState(WIXSTDBA_STATE_FAILED, hr);
2020 ::PostMessageW(pThis->m_hWnd, WM_WIXSTDBA_SHOW_FAILURE, 0, 0);
2021 }
2022 else
2023 {
2024 // Okay, we're ready for packages now.
2025 pThis->SetState(WIXSTDBA_STATE_INITIALIZED, hr);
2026 ::PostMessageW(pThis->m_hWnd, BOOTSTRAPPER_ACTION_HELP == pThis->m_command.action ? WM_WIXSTDBA_SHOW_HELP : WM_WIXSTDBA_DETECT_PACKAGES, 0, 0);
2027 }
2028
2029 // message pump
2030 while (0 != (fRet = ::GetMessageW(&msg, NULL, 0, 0)))
2031 {
2032 if (-1 == fRet)
2033 {
2034 hr = E_UNEXPECTED;
2035 BalExitOnFailure(hr, "Unexpected return value from message pump.");
2036 }
2037 else if (!ThemeHandleKeyboardMessage(pThis->m_pTheme, msg.hwnd, &msg))
2038 {
2039 ::TranslateMessage(&msg);
2040 ::DispatchMessageW(&msg);
2041 }
2042 }
2043
2044 // Succeeded thus far, check to see if anything went wrong while actually
2045 // executing changes.
2046 if (FAILED(pThis->m_hrFinal))
2047 {
2048 hr = pThis->m_hrFinal;
2049 }
2050 else if (pThis->CheckCanceled())
2051 {
2052 hr = HRESULT_FROM_WIN32(ERROR_INSTALL_USEREXIT);
2053 }
2054
2055 LExit:
2056 // destroy main window
2057 pThis->DestroyMainWindow();
2058 pThis->UninitializeTaskbarButton();
2059
2060 // initiate engine shutdown
2061 DWORD dwQuit = HRESULT_CODE(hr);
2062 if (BOOTSTRAPPER_APPLY_RESTART_INITIATED == pThis->m_restartResult)
2063 {
2064 dwQuit = ERROR_SUCCESS_REBOOT_INITIATED;
2065 }
2066 else if (BOOTSTRAPPER_APPLY_RESTART_REQUIRED == pThis->m_restartResult)
2067 {
2068 dwQuit = ERROR_SUCCESS_REBOOT_REQUIRED;
2069 }
2070 pThis->m_pEngine->Quit(dwQuit);
2071
2072 ReleaseTheme(pThis->m_pTheme);
2073 ThemeUninitialize();
2074
2075 // uninitialize COM
2076 if (fComInitialized)
2077 {
2078 ::CoUninitialize();
2079 }
2080
2081 return hr;
2082 }
2083
2084
2085 //
2086 // InitializeData - initializes all the package and prerequisite information.
2087 //
2088 HRESULT InitializeData()
2089 {
2090 HRESULT hr = S_OK;
2091 LPWSTR sczModulePath = NULL;
2092 IXMLDOMDocument *pixdManifest = NULL;
2093
2094 hr = BalManifestLoad(m_hModule, &pixdManifest);
2095 BalExitOnFailure(hr, "Failed to load bootstrapper application manifest.");
2096
2097 hr = ParseOverridableVariablesFromXml(pixdManifest);
2098 BalExitOnFailure(hr, "Failed to read overridable variables.");
2099
2100 hr = ProcessCommandLine(&m_sczLanguage);
2101 ExitOnFailure(hr, "Unknown commandline parameters.");
2102
2103 hr = PathRelativeToModule(&sczModulePath, NULL, m_hModule);
2104 BalExitOnFailure(hr, "Failed to get module path.");
2105
2106 hr = LoadLocalization(sczModulePath, m_sczLanguage);
2107 ExitOnFailure(hr, "Failed to load localization.");
2108
2109 hr = LoadTheme(sczModulePath, m_sczLanguage);
2110 ExitOnFailure(hr, "Failed to load theme.");
2111
2112 hr = BalInfoParseFromXml(&m_Bundle, pixdManifest);
2113 BalExitOnFailure(hr, "Failed to load bundle information.");
2114
2115 hr = BalConditionsParseFromXml(&m_Conditions, pixdManifest, m_pWixLoc);
2116 BalExitOnFailure(hr, "Failed to load conditions from XML.");
2117
2118 hr = LoadBAFunctions(pixdManifest);
2119 BalExitOnFailure(hr, "Failed to load bootstrapper functions.");
2120
2121 GetBundleFileVersion();
2122 // don't fail if we couldn't get the version info; best-effort only
2123
2124 hr = InitializePackageInfo();
2125 BalExitOnFailure(hr, "Failed to initialize wixstdba package information.");
2126
2127 if (m_fPrereq)
2128 {
2129 hr = InitializePrerequisiteInformation();
2130 BalExitOnFailure(hr, "Failed to initialize prerequisite information.");
2131 }
2132 else
2133 {
2134 hr = ParseBootstrapperApplicationDataFromXml(pixdManifest);
2135 BalExitOnFailure(hr, "Failed to read bootstrapper application data.");
2136 }
2137
2138 if (BOOTSTRAPPER_ACTION_CACHE == m_plannedAction)
2139 {
2140 if (m_fSupportCacheOnly)
2141 {
2142 // Doesn't make sense to prompt the user if cache only is requested.
2143 if (BOOTSTRAPPER_DISPLAY_PASSIVE < m_command.display)
2144 {
2145 m_command.display = BOOTSTRAPPER_DISPLAY_PASSIVE;
2146 }
2147
2148 m_command.action = BOOTSTRAPPER_ACTION_CACHE;
2149 }
2150 else
2151 {
2152 BalLog(BOOTSTRAPPER_LOG_LEVEL_ERROR, "Ignoring attempt to only cache a bundle that does not explicitly support it.");
2153 m_plannedAction = BOOTSTRAPPER_ACTION_UNKNOWN;
2154 }
2155 }
2156
2157 LExit:
2158 ReleaseObject(pixdManifest);
2159 ReleaseStr(sczModulePath);
2160
2161 return hr;
2162 }
2163
2164
2165 //
2166 // ProcessCommandLine - process the provided command line arguments.
2167 //
2168 HRESULT ProcessCommandLine(
2169 __inout LPWSTR* psczLanguage
2170 )
2171 {
2172 HRESULT hr = S_OK;
2173 int argc = 0;
2174 LPWSTR* argv = NULL;
2175 LPWSTR sczVariableName = NULL;
2176 LPWSTR sczVariableValue = NULL;
2177
2178 if (m_command.wzCommandLine && *m_command.wzCommandLine)
2179 {
2180 hr = AppParseCommandLine(m_command.wzCommandLine, &argc, &argv);
2181 ExitOnFailure(hr, "Failed to parse command line.");
2182
2183 for (int i = 0; i < argc; ++i)
2184 {
2185 if (argv[i][0] == L'-' || argv[i][0] == L'/')
2186 {
2187 if (CSTR_EQUAL == ::CompareStringW(LOCALE_INVARIANT, NORM_IGNORECASE, &argv[i][1], -1, L"lang", -1))
2188 {
2189 if (i + 1 >= argc)
2190 {
2191 hr = E_INVALIDARG;
2192 BalExitOnFailure(hr, "Must specify a language.");
2193 }
2194
2195 ++i;
2196
2197 hr = StrAllocString(psczLanguage, &argv[i][0], 0);
2198 BalExitOnFailure(hr, "Failed to copy language.");
2199 }
2200 }
2201 else if (CSTR_EQUAL == ::CompareStringW(LOCALE_INVARIANT, NORM_IGNORECASE, &argv[i][1], -1, L"cache", -1))
2202 {
2203 m_plannedAction = BOOTSTRAPPER_ACTION_CACHE;
2204 }
2205 else if (m_sdOverridableVariables)
2206 {
2207 const wchar_t* pwc = wcschr(argv[i], L'=');
2208 if (pwc)
2209 {
2210 hr = StrAllocString(&sczVariableName, argv[i], pwc - argv[i]);
2211 BalExitOnFailure(hr, "Failed to copy variable name.");
2212
2213 hr = DictKeyExists(m_sdOverridableVariables, sczVariableName);
2214 if (E_NOTFOUND == hr)
2215 {
2216 BalLog(BOOTSTRAPPER_LOG_LEVEL_ERROR, "Ignoring attempt to set non-overridable variable: '%ls'.", sczVariableName);
2217 hr = S_OK;
2218 continue;
2219 }
2220 ExitOnFailure(hr, "Failed to check the dictionary of overridable variables.");
2221
2222 hr = StrAllocString(&sczVariableValue, ++pwc, 0);
2223 BalExitOnFailure(hr, "Failed to copy variable value.");
2224
2225 hr = m_pEngine->SetVariableString(sczVariableName, sczVariableValue, FALSE);
2226 BalExitOnFailure(hr, "Failed to set variable.");
2227 }
2228 else
2229 {
2230 BalLog(BOOTSTRAPPER_LOG_LEVEL_STANDARD, "Ignoring unknown argument: %ls", argv[i]);
2231 }
2232 }
2233 }
2234 }
2235
2236 LExit:
2237 if (argv)
2238 {
2239 AppFreeCommandLineArgs(argv);
2240 }
2241
2242 ReleaseStr(sczVariableName);
2243 ReleaseStr(sczVariableValue);
2244
2245 return hr;
2246 }
2247
2248 HRESULT LoadLocalization(
2249 __in_z LPCWSTR wzModulePath,
2250 __in_z_opt LPCWSTR wzLanguage
2251 )
2252 {
2253 HRESULT hr = S_OK;
2254 LPWSTR sczLocPath = NULL;
2255 LPWSTR sczFormatted = NULL;
2256 LPCWSTR wzLocFileName = m_fPrereq ? L"mbapreq.wxl" : L"thm.wxl";
2257
2258 // Find and load .wxl file.
2259 hr = LocProbeForFile(wzModulePath, wzLocFileName, wzLanguage, &sczLocPath);
2260 BalExitOnFailure(hr, "Failed to probe for loc file: %ls in path: %ls", wzLocFileName, wzModulePath);
2261
2262 hr = LocLoadFromFile(sczLocPath, &m_pWixLoc);
2263 BalExitOnFailure(hr, "Failed to load loc file from path: %ls", sczLocPath);
2264
2265 // Set WixStdBALanguageId to .wxl language id.
2266 if (WIX_LOCALIZATION_LANGUAGE_NOT_SET != m_pWixLoc->dwLangId)
2267 {
2268 ::SetThreadLocale(m_pWixLoc->dwLangId);
2269
2270 hr = m_pEngine->SetVariableNumeric(WIXSTDBA_VARIABLE_LANGUAGE_ID, m_pWixLoc->dwLangId);
2271 BalExitOnFailure(hr, "Failed to set WixStdBALanguageId variable.");
2272 }
2273
2274 // Load ConfirmCancelMessage.
2275 hr = StrAllocString(&m_sczConfirmCloseMessage, L"#(loc.ConfirmCancelMessage)", 0);
2276 ExitOnFailure(hr, "Failed to initialize confirm message loc identifier.");
2277
2278 hr = LocLocalizeString(m_pWixLoc, &m_sczConfirmCloseMessage);
2279 BalExitOnFailure(hr, "Failed to localize confirm close message: %ls", m_sczConfirmCloseMessage);
2280
2281 hr = BalFormatString(m_sczConfirmCloseMessage, &sczFormatted);
2282 if (SUCCEEDED(hr))
2283 {
2284 ReleaseStr(m_sczConfirmCloseMessage);
2285 m_sczConfirmCloseMessage = sczFormatted;
2286 sczFormatted = NULL;
2287 }
2288
2289 LExit:
2290 ReleaseStr(sczFormatted);
2291 ReleaseStr(sczLocPath);
2292
2293 return hr;
2294 }
2295
2296
2297 HRESULT LoadTheme(
2298 __in_z LPCWSTR wzModulePath,
2299 __in_z_opt LPCWSTR wzLanguage
2300 )
2301 {
2302 HRESULT hr = S_OK;
2303 LPWSTR sczThemePath = NULL;
2304 LPCWSTR wzThemeFileName = m_fPrereq ? L"mbapreq.thm" : L"thm.xml";
2305
2306 hr = LocProbeForFile(wzModulePath, wzThemeFileName, wzLanguage, &sczThemePath);
2307 BalExitOnFailure(hr, "Failed to probe for theme file: %ls in path: %ls", wzThemeFileName, wzModulePath);
2308
2309 hr = ThemeLoadFromFile(sczThemePath, &m_pTheme);
2310 BalExitOnFailure(hr, "Failed to load theme from path: %ls", sczThemePath);
2311
2312 hr = ThemeRegisterVariableCallbacks(m_pTheme, EvaluateVariableConditionCallback, FormatVariableStringCallback, GetVariableNumericCallback, SetVariableNumericCallback, GetVariableStringCallback, SetVariableStringCallback, NULL);
2313 BalExitOnFailure(hr, "Failed to register variable theme callbacks.");
2314
2315 hr = ThemeLocalize(m_pTheme, m_pWixLoc);
2316 BalExitOnFailure(hr, "Failed to localize theme: %ls", sczThemePath);
2317
2318 LExit:
2319 ReleaseStr(sczThemePath);
2320
2321 return hr;
2322 }
2323
2324
2325 HRESULT ParseOverridableVariablesFromXml(
2326 __in IXMLDOMDocument* pixdManifest
2327 )
2328 {
2329 HRESULT hr = S_OK;
2330 IXMLDOMNode* pNode = NULL;
2331 IXMLDOMNodeList* pNodes = NULL;
2332 DWORD cNodes = 0;
2333 LPWSTR scz = NULL;
2334
2335 // Get the list of variables users can override on the command line.
2336 hr = XmlSelectNodes(pixdManifest, L"/BootstrapperApplicationData/WixStdbaOverridableVariable", &pNodes);
2337 if (S_FALSE == hr)
2338 {
2339 ExitFunction1(hr = S_OK);
2340 }
2341 ExitOnFailure(hr, "Failed to select overridable variable nodes.");
2342
2343 hr = pNodes->get_length((long*)&cNodes);
2344 ExitOnFailure(hr, "Failed to get overridable variable node count.");
2345
2346 if (cNodes)
2347 {
2348 hr = DictCreateStringList(&m_sdOverridableVariables, 32, DICT_FLAG_NONE);
2349 ExitOnFailure(hr, "Failed to create the string dictionary.");
2350
2351 for (DWORD i = 0; i < cNodes; ++i)
2352 {
2353 hr = XmlNextElement(pNodes, &pNode, NULL);
2354 ExitOnFailure(hr, "Failed to get next node.");
2355
2356 // @Name
2357 hr = XmlGetAttributeEx(pNode, L"Name", &scz);
2358 ExitOnFailure(hr, "Failed to get @Name.");
2359
2360 hr = DictAddKey(m_sdOverridableVariables, scz);
2361 ExitOnFailure(hr, "Failed to add \"%ls\" to the string dictionary.", scz);
2362
2363 // prepare next iteration
2364 ReleaseNullObject(pNode);
2365 }
2366 }
2367
2368 LExit:
2369 ReleaseObject(pNode);
2370 ReleaseObject(pNodes);
2371 ReleaseStr(scz);
2372 return hr;
2373 }
2374
2375
2376 HRESULT InitializePackageInfo()
2377 {
2378 HRESULT hr = S_OK;
2379 BAL_INFO_PACKAGE* pPackage = NULL;
2380
2381 for (DWORD i = 0; i < m_Bundle.packages.cPackages; ++i)
2382 {
2383 pPackage = &m_Bundle.packages.rgPackages[i];
2384
2385 hr = InitializePackageInfoForPackage(pPackage);
2386 BalExitOnFailure(hr, "Failed to initialize wixstdba package info for package: %ls.", pPackage->sczId);
2387 }
2388
2389 LExit:
2390 return hr;
2391 }
2392
2393
2394 HRESULT InitializePackageInfoForPackage(
2395 __in BAL_INFO_PACKAGE* pPackage
2396 )
2397 {
2398 HRESULT hr = S_OK;
2399
2400 pPackage->pvCustomData = MemAlloc(sizeof(WIXSTDBA_PACKAGE_INFO), TRUE);
2401 BalExitOnNull(pPackage->pvCustomData, hr, E_OUTOFMEMORY, "Failed to allocate memory for wixstdba package info.");
2402
2403 LExit:
2404 return hr;
2405 }
2406
2407
2408 HRESULT InitializePrerequisiteInformation()
2409 {
2410 HRESULT hr = S_OK;
2411 BAL_INFO_PACKAGE* pPackage = NULL;
2412
2413 for (DWORD i = 0; i < m_Bundle.packages.cPackages; ++i)
2414 {
2415 pPackage = &m_Bundle.packages.rgPackages[i];
2416 if (!pPackage->fPrereqPackage)
2417 {
2418 continue;
2419 }
2420
2421 if (pPackage->sczPrereqLicenseFile)
2422 {
2423 if (m_sczLicenseFile)
2424 {
2425 hr = HRESULT_FROM_WIN32(ERROR_INVALID_DATA);
2426 BalExitOnFailure(hr, "More than one license file specified in prerequisite info.");
2427 }
2428
2429 hr = StrAllocString(&m_sczLicenseFile, pPackage->sczPrereqLicenseFile, 0);
2430 BalExitOnFailure(hr, "Failed to copy license file location from prereq package.");
2431 }
2432
2433 if (pPackage->sczPrereqLicenseUrl)
2434 {
2435 if (m_sczLicenseUrl)
2436 {
2437 hr = HRESULT_FROM_WIN32(ERROR_INVALID_DATA);
2438 BalExitOnFailure(hr, "More than one license URL specified in prerequisite info.");
2439 }
2440
2441 hr = StrAllocString(&m_sczLicenseUrl, pPackage->sczPrereqLicenseUrl, 0);
2442 BalExitOnFailure(hr, "Failed to copy license URL from prereq package.");
2443 }
2444 }
2445
2446 LExit:
2447 return hr;
2448 }
2449
2450
2451 HRESULT ParseBootstrapperApplicationDataFromXml(
2452 __in IXMLDOMDocument* pixdManifest
2453 )
2454 {
2455 HRESULT hr = S_OK;
2456 IXMLDOMNode* pNode = NULL;
2457 DWORD dwBool = 0;
2458
2459 hr = XmlSelectSingleNode(pixdManifest, L"/BootstrapperApplicationData/WixStdbaInformation", &pNode);
2460 if (S_FALSE == hr)
2461 {
2462 hr = E_INVALIDARG;
2463 }
2464 BalExitOnFailure(hr, "BootstrapperApplication.xml manifest is missing wixstdba information.");
2465
2466 hr = XmlGetAttributeEx(pNode, L"LicenseFile", &m_sczLicenseFile);
2467 if (E_NOTFOUND == hr)
2468 {
2469 hr = S_OK;
2470 }
2471 BalExitOnFailure(hr, "Failed to get license file.");
2472
2473 hr = XmlGetAttributeEx(pNode, L"LicenseUrl", &m_sczLicenseUrl);
2474 if (E_NOTFOUND == hr)
2475 {
2476 hr = S_OK;
2477 }
2478 BalExitOnFailure(hr, "Failed to get license URL.");
2479
2480 ReleaseObject(pNode);
2481
2482 hr = XmlSelectSingleNode(pixdManifest, L"/BootstrapperApplicationData/WixStdbaOptions", &pNode);
2483 if (S_FALSE == hr)
2484 {
2485 ExitFunction1(hr = S_OK);
2486 }
2487 BalExitOnFailure(hr, "Failed to read wixstdba options from BootstrapperApplication.xml manifest.");
2488
2489 hr = XmlGetAttributeNumber(pNode, L"SuppressOptionsUI", &dwBool);
2490 if (S_FALSE == hr)
2491 {
2492 hr = S_OK;
2493 }
2494 else if (SUCCEEDED(hr) && dwBool)
2495 {
2496 hr = BalSetNumericVariable(WIXSTDBA_VARIABLE_SUPPRESS_OPTIONS_UI, 1);
2497 BalExitOnFailure(hr, "Failed to set '%ls' variable.", WIXSTDBA_VARIABLE_SUPPRESS_OPTIONS_UI);
2498 }
2499 BalExitOnFailure(hr, "Failed to get SuppressOptionsUI value.");
2500
2501 dwBool = 0;
2502 hr = XmlGetAttributeNumber(pNode, L"SuppressDowngradeFailure", &dwBool);
2503 if (S_FALSE == hr)
2504 {
2505 hr = S_OK;
2506 }
2507 else if (SUCCEEDED(hr))
2508 {
2509 m_fSuppressDowngradeFailure = 0 < dwBool;
2510 }
2511 BalExitOnFailure(hr, "Failed to get SuppressDowngradeFailure value.");
2512
2513 dwBool = 0;
2514 hr = XmlGetAttributeNumber(pNode, L"SuppressRepair", &dwBool);
2515 if (S_FALSE == hr)
2516 {
2517 hr = S_OK;
2518 }
2519 else if (SUCCEEDED(hr))
2520 {
2521 m_fSuppressRepair = 0 < dwBool;
2522 }
2523 BalExitOnFailure(hr, "Failed to get SuppressRepair value.");
2524
2525 hr = XmlGetAttributeNumber(pNode, L"ShowVersion", &dwBool);
2526 if (S_FALSE == hr)
2527 {
2528 hr = S_OK;
2529 }
2530 else if (SUCCEEDED(hr) && dwBool)
2531 {
2532 hr = BalSetNumericVariable(WIXSTDBA_VARIABLE_SHOW_VERSION, 1);
2533 BalExitOnFailure(hr, "Failed to set '%ls' variable.", WIXSTDBA_VARIABLE_SHOW_VERSION);
2534 }
2535 BalExitOnFailure(hr, "Failed to get ShowVersion value.");
2536
2537 hr = XmlGetAttributeNumber(pNode, L"SupportCacheOnly", &dwBool);
2538 if (S_FALSE == hr)
2539 {
2540 hr = S_OK;
2541 }
2542 else if (SUCCEEDED(hr))
2543 {
2544 m_fSupportCacheOnly = 0 < dwBool;
2545 }
2546 BalExitOnFailure(hr, "Failed to get SupportCacheOnly value.");
2547
2548 LExit:
2549 ReleaseObject(pNode);
2550 return hr;
2551 }
2552
2553 HRESULT GetPackageInfo(
2554 __in_z LPCWSTR wzPackageId,
2555 __out WIXSTDBA_PACKAGE_INFO** ppPackageInfo,
2556 __out BAL_INFO_PACKAGE** ppPackage
2557 )
2558 {
2559 HRESULT hr = E_NOTFOUND;
2560 WIXSTDBA_PACKAGE_INFO* pPackageInfo = NULL;
2561 BAL_INFO_PACKAGE* pPackage = NULL;
2562
2563 Assert(wzPackageId && *wzPackageId);
2564 Assert(ppPackage);
2565 Assert(ppPackageInfo);
2566
2567 hr = BalInfoFindPackageById(&m_Bundle.packages, wzPackageId, &pPackage);
2568 if (E_NOTFOUND != hr)
2569 {
2570 ExitOnFailure(hr, "Failed trying to find the requested package.");
2571
2572 pPackageInfo = reinterpret_cast<WIXSTDBA_PACKAGE_INFO*>(pPackage->pvCustomData);
2573 }
2574
2575 *ppPackageInfo = pPackageInfo;
2576 *ppPackage = pPackage;
2577
2578 LExit:
2579 return hr;
2580 }
2581
2582
2583 //
2584 // Get the file version of the bootstrapper and record in bootstrapper log file
2585 //
2586 HRESULT GetBundleFileVersion()
2587 {
2588 HRESULT hr = S_OK;
2589 ULARGE_INTEGER uliVersion = { };
2590 LPWSTR sczCurrentPath = NULL;
2591 VERUTIL_VERSION* pVersion = NULL;
2592
2593 hr = PathForCurrentProcess(&sczCurrentPath, NULL);
2594 BalExitOnFailure(hr, "Failed to get bundle path.");
2595
2596 hr = FileVersion(sczCurrentPath, &uliVersion.HighPart, &uliVersion.LowPart);
2597 BalExitOnFailure(hr, "Failed to get bundle file version.");
2598
2599 hr = VerVersionFromQword(uliVersion.QuadPart, &pVersion);
2600 BalExitOnFailure(hr, "Failed to create bundle file version.");
2601
2602 hr = m_pEngine->SetVariableVersion(WIXSTDBA_VARIABLE_BUNDLE_FILE_VERSION, pVersion->sczVersion);
2603 BalExitOnFailure(hr, "Failed to set WixBundleFileVersion variable.");
2604
2605 LExit:
2606 ReleaseVerutilVersion(pVersion);
2607 ReleaseStr(sczCurrentPath);
2608
2609 return hr;
2610 }
2611
2612
2613 //
2614 // CreateMainWindow - creates the main install window.
2615 //
2616 HRESULT CreateMainWindow()
2617 {
2618 HRESULT hr = S_OK;
2619 HICON hIcon = reinterpret_cast<HICON>(m_pTheme->hIcon);
2620 WNDCLASSW wc = { };
2621 DWORD dwWindowStyle = 0;
2622 int x = CW_USEDEFAULT;
2623 int y = CW_USEDEFAULT;
2624 POINT ptCursor = { };
2625
2626 // If the theme did not provide an icon, try using the icon from the bundle engine.
2627 if (!hIcon)
2628 {
2629 HMODULE hBootstrapperEngine = ::GetModuleHandleW(NULL);
2630 if (hBootstrapperEngine)
2631 {
2632 hIcon = ::LoadIconW(hBootstrapperEngine, MAKEINTRESOURCEW(1));
2633 }
2634 }
2635
2636 // Register the window class and create the window.
2637 wc.lpfnWndProc = CWixStandardBootstrapperApplication::WndProc;
2638 wc.hInstance = m_hModule;
2639 wc.hIcon = hIcon;
2640 wc.hCursor = ::LoadCursorW(NULL, (LPCWSTR)IDC_ARROW);
2641 wc.hbrBackground = m_pTheme->rgFonts[m_pTheme->dwFontId].hBackground;
2642 wc.lpszMenuName = NULL;
2643 wc.lpszClassName = WIXSTDBA_WINDOW_CLASS;
2644 if (!::RegisterClassW(&wc))
2645 {
2646 ExitWithLastError(hr, "Failed to register window.");
2647 }
2648
2649 m_fRegistered = TRUE;
2650
2651 // Calculate the window style based on the theme style and command display value.
2652 dwWindowStyle = m_pTheme->dwStyle;
2653 if (BOOTSTRAPPER_DISPLAY_NONE >= m_command.display)
2654 {
2655 dwWindowStyle &= ~WS_VISIBLE;
2656 }
2657
2658 // Don't show the window if there is a splash screen (it will be made visible when the splash screen is hidden)
2659 if (::IsWindow(m_command.hwndSplashScreen))
2660 {
2661 dwWindowStyle &= ~WS_VISIBLE;
2662 }
2663
2664 // Center the window on the monitor with the mouse.
2665 if (::GetCursorPos(&ptCursor))
2666 {
2667 x = ptCursor.x;
2668 y = ptCursor.y;
2669 }
2670
2671 hr = ThemeCreateParentWindow(m_pTheme, 0, wc.lpszClassName, m_pTheme->sczCaption, dwWindowStyle, x, y, HWND_DESKTOP, m_hModule, this, THEME_WINDOW_INITIAL_POSITION_CENTER_MONITOR_FROM_COORDINATES, &m_hWnd);
2672 ExitOnFailure(hr, "Failed to create window.");
2673
2674 hr = S_OK;
2675
2676 LExit:
2677 return hr;
2678 }
2679
2680
2681 //
2682 // InitializeTaskbarButton - initializes taskbar button for progress.
2683 //
2684 void InitializeTaskbarButton()
2685 {
2686 HRESULT hr = S_OK;
2687
2688 hr = ::CoCreateInstance(CLSID_TaskbarList, NULL, CLSCTX_ALL, __uuidof(ITaskbarList3), reinterpret_cast<LPVOID*>(&m_pTaskbarList));
2689 if (REGDB_E_CLASSNOTREG == hr) // not supported before Windows 7
2690 {
2691 ExitFunction1(hr = S_OK);
2692 }
2693 BalExitOnFailure(hr, "Failed to create ITaskbarList3. Continuing.");
2694
2695 m_uTaskbarButtonCreatedMessage = ::RegisterWindowMessageW(L"TaskbarButtonCreated");
2696 BalExitOnNullWithLastError(m_uTaskbarButtonCreatedMessage, hr, "Failed to get TaskbarButtonCreated message. Continuing.");
2697
2698 LExit:
2699 return;
2700 }
2701
2702 //
2703 // DestroyMainWindow - clean up all the window registration.
2704 //
2705 void DestroyMainWindow()
2706 {
2707 if (::IsWindow(m_hWnd))
2708 {
2709 ::DestroyWindow(m_hWnd);
2710 m_hWnd = NULL;
2711 m_fTaskbarButtonOK = FALSE;
2712 }
2713
2714 if (m_fRegistered)
2715 {
2716 ::UnregisterClassW(WIXSTDBA_WINDOW_CLASS, m_hModule);
2717 m_fRegistered = FALSE;
2718 }
2719 }
2720
2721
2722 //
2723 // UninitializeTaskbarButton - clean up the taskbar registration.
2724 //
2725 void UninitializeTaskbarButton()
2726 {
2727 m_fTaskbarButtonOK = FALSE;
2728 ReleaseNullObject(m_pTaskbarList);
2729 }
2730
2731
2732 static LRESULT CallDefaultWndProc(
2733 __in CWixStandardBootstrapperApplication* pBA,
2734 __in HWND hWnd,
2735 __in UINT uMsg,
2736 __in WPARAM wParam,
2737 __in LPARAM lParam
2738 )
2739 {
2740 LRESULT lres = NULL;
2741 THEME* pTheme = NULL;
2742 HRESULT hr = S_OK;
2743 BA_FUNCTIONS_WNDPROC_ARGS wndProcArgs = { };
2744 BA_FUNCTIONS_WNDPROC_RESULTS wndProcResults = { };
2745
2746 if (pBA)
2747 {
2748 pTheme = pBA->m_pTheme;
2749
2750 if (pBA->m_pfnBAFunctionsProc)
2751 {
2752 wndProcArgs.cbSize = sizeof(wndProcArgs);
2753 wndProcArgs.pTheme = pTheme;
2754 wndProcArgs.hWnd = hWnd;
2755 wndProcArgs.uMsg = uMsg;
2756 wndProcArgs.wParam = wParam;
2757 wndProcArgs.lParam = lParam;
2758 wndProcResults.cbSize = sizeof(wndProcResults);
2759
2760 hr = pBA->m_pfnBAFunctionsProc(BA_FUNCTIONS_MESSAGE_WNDPROC, &wndProcArgs, &wndProcResults, pBA->m_pvBAFunctionsProcContext);
2761 if (E_NOTIMPL != hr)
2762 {
2763 lres = wndProcResults.lres;
2764 ExitFunction();
2765 }
2766 }
2767 }
2768
2769 lres = ThemeDefWindowProc(pTheme, hWnd, uMsg, wParam, lParam);
2770
2771 LExit:
2772 return lres;
2773 }
2774
2775 //
2776 // WndProc - standard windows message handler.
2777 //
2778 static LRESULT CALLBACK WndProc(
2779 __in HWND hWnd,
2780 __in UINT uMsg,
2781 __in WPARAM wParam,
2782 __in LPARAM lParam
2783 )
2784 {
2785#pragma warning(suppress:4312)
2786 CWixStandardBootstrapperApplication* pBA = reinterpret_cast<CWixStandardBootstrapperApplication*>(::GetWindowLongPtrW(hWnd, GWLP_USERDATA));
2787 BOOL fCancel = FALSE;
2788
2789 switch (uMsg)
2790 {
2791 case WM_NCCREATE:
2792 {
2793 LPCREATESTRUCT lpcs = reinterpret_cast<LPCREATESTRUCT>(lParam);
2794 pBA = reinterpret_cast<CWixStandardBootstrapperApplication*>(lpcs->lpCreateParams);
2795#pragma warning(suppress:4244)
2796 ::SetWindowLongPtrW(hWnd, GWLP_USERDATA, reinterpret_cast<LONG_PTR>(pBA));
2797 }
2798 break;
2799
2800 case WM_NCDESTROY:
2801 {
2802 LRESULT lres = CallDefaultWndProc(pBA, hWnd, uMsg, wParam, lParam);
2803 ::SetWindowLongPtrW(hWnd, GWLP_USERDATA, 0);
2804 ::PostQuitMessage(0);
2805 return lres;
2806 }
2807
2808 case WM_CREATE:
2809 if (!pBA->OnCreate(hWnd))
2810 {
2811 return -1;
2812 }
2813 break;
2814
2815 case WM_QUERYENDSESSION:
2816 fCancel = true;
2817 pBA->OnSystemShutdown(static_cast<DWORD>(lParam), &fCancel);
2818 return !fCancel;
2819
2820 case WM_CLOSE:
2821 // If the user chose not to close, do *not* let the default window proc handle the message.
2822 if (!pBA->OnClose())
2823 {
2824 return 0;
2825 }
2826 break;
2827
2828 case WM_WIXSTDBA_SHOW_HELP:
2829 pBA->OnShowHelp();
2830 return 0;
2831
2832 case WM_WIXSTDBA_DETECT_PACKAGES:
2833 pBA->OnDetect();
2834 return 0;
2835
2836 case WM_WIXSTDBA_PLAN_PACKAGES:
2837 pBA->OnPlan(static_cast<BOOTSTRAPPER_ACTION>(lParam));
2838 return 0;
2839
2840 case WM_WIXSTDBA_APPLY_PACKAGES:
2841 pBA->OnApply();
2842 return 0;
2843
2844 case WM_WIXSTDBA_CHANGE_STATE:
2845 pBA->OnChangeState(static_cast<WIXSTDBA_STATE>(lParam));
2846 return 0;
2847
2848 case WM_WIXSTDBA_SHOW_FAILURE:
2849 pBA->OnShowFailure();
2850 return 0;
2851
2852 case WM_COMMAND:
2853 switch (HIWORD(wParam))
2854 {
2855 case BN_CLICKED:
2856 switch (LOWORD(wParam))
2857 {
2858 case WIXSTDBA_CONTROL_EULA_ACCEPT_CHECKBOX:
2859 pBA->OnClickAcceptCheckbox();
2860 return 0;
2861
2862 case WIXSTDBA_CONTROL_INSTALL_BUTTON:
2863 pBA->OnClickInstallButton();
2864 return 0;
2865
2866 case WIXSTDBA_CONTROL_REPAIR_BUTTON:
2867 pBA->OnClickRepairButton();
2868 return 0;
2869
2870 case WIXSTDBA_CONTROL_UNINSTALL_BUTTON:
2871 pBA->OnClickUninstallButton();
2872 return 0;
2873
2874 case WIXSTDBA_CONTROL_LAUNCH_BUTTON:
2875 pBA->OnClickLaunchButton();
2876 return 0;
2877
2878 case WIXSTDBA_CONTROL_SUCCESS_RESTART_BUTTON: __fallthrough;
2879 case WIXSTDBA_CONTROL_FAILURE_RESTART_BUTTON:
2880 pBA->OnClickRestartButton();
2881 return 0;
2882
2883 case WIXSTDBA_CONTROL_PROGRESS_CANCEL_BUTTON:
2884 pBA->OnClickCloseButton();
2885 return 0;
2886 }
2887 break;
2888 }
2889 break;
2890
2891 case WM_NOTIFY:
2892 if (lParam)
2893 {
2894 LPNMHDR pnmhdr = reinterpret_cast<LPNMHDR>(lParam);
2895 switch (pnmhdr->code)
2896 {
2897 case NM_CLICK: __fallthrough;
2898 case NM_RETURN:
2899 switch (static_cast<DWORD>(pnmhdr->idFrom))
2900 {
2901 case WIXSTDBA_CONTROL_EULA_LINK:
2902 pBA->OnClickEulaLink();
2903 return 1;
2904 case WIXSTDBA_CONTROL_FAILURE_LOGFILE_LINK:
2905 pBA->OnClickLogFileLink();
2906 return 1;
2907 }
2908 }
2909 }
2910 break;
2911 }
2912
2913 if (pBA && pBA->m_pTaskbarList && uMsg == pBA->m_uTaskbarButtonCreatedMessage)
2914 {
2915 pBA->m_fTaskbarButtonOK = TRUE;
2916 return 0;
2917 }
2918
2919 return CallDefaultWndProc(pBA, hWnd, uMsg, wParam, lParam);
2920 }
2921
2922
2923 //
2924 // OnCreate - finishes loading the theme.
2925 //
2926 BOOL OnCreate(
2927 __in HWND /*hWnd*/
2928 )
2929 {
2930 HRESULT hr = S_OK;
2931 LPWSTR sczLicenseFormatted = NULL;
2932 LPWSTR sczLicensePath = NULL;
2933 LPWSTR sczLicenseDirectory = NULL;
2934 LPWSTR sczLicenseFilename = NULL;
2935 BA_FUNCTIONS_ONTHEMELOADED_ARGS themeLoadedArgs = { };
2936 BA_FUNCTIONS_ONTHEMELOADED_RESULTS themeLoadedResults = { };
2937
2938 hr = ThemeLoadControls(m_pTheme, vrgInitControls, countof(vrgInitControls));
2939 BalExitOnFailure(hr, "Failed to load theme controls.");
2940
2941 C_ASSERT(COUNT_WIXSTDBA_PAGE == countof(vrgwzPageNames));
2942 C_ASSERT(countof(m_rgdwPageIds) == countof(vrgwzPageNames));
2943
2944 ThemeGetPageIds(m_pTheme, vrgwzPageNames, m_rgdwPageIds, countof(m_rgdwPageIds));
2945
2946 // Load the RTF EULA control with text if the control exists.
2947 if (ThemeControlExists(m_pTheme, WIXSTDBA_CONTROL_EULA_RICHEDIT))
2948 {
2949 hr = (m_sczLicenseFile && *m_sczLicenseFile) ? S_OK : E_INVALIDDATA;
2950 if (SUCCEEDED(hr))
2951 {
2952 hr = StrAllocString(&sczLicenseFormatted, m_sczLicenseFile, 0);
2953 if (SUCCEEDED(hr))
2954 {
2955 hr = LocLocalizeString(m_pWixLoc, &sczLicenseFormatted);
2956 if (SUCCEEDED(hr))
2957 {
2958 // Assume there is no hidden variables to be formatted
2959 // so don't worry about securely freeing it.
2960 hr = BalFormatString(sczLicenseFormatted, &sczLicenseFormatted);
2961 if (SUCCEEDED(hr))
2962 {
2963 hr = PathRelativeToModule(&sczLicensePath, sczLicenseFormatted, m_hModule);
2964 if (SUCCEEDED(hr))
2965 {
2966 hr = PathGetDirectory(sczLicensePath, &sczLicenseDirectory);
2967 if (SUCCEEDED(hr))
2968 {
2969 hr = StrAllocString(&sczLicenseFilename, PathFile(sczLicenseFormatted), 0);
2970 if (SUCCEEDED(hr))
2971 {
2972 hr = LocProbeForFile(sczLicenseDirectory, sczLicenseFilename, m_sczLanguage, &sczLicensePath);
2973 if (SUCCEEDED(hr))
2974 {
2975 hr = ThemeLoadRichEditFromFile(m_pTheme, WIXSTDBA_CONTROL_EULA_RICHEDIT, sczLicensePath, m_hModule);
2976 }
2977 }
2978 }
2979 }
2980 }
2981 }
2982 }
2983 }
2984
2985 if (FAILED(hr))
2986 {
2987 BalLog(BOOTSTRAPPER_LOG_LEVEL_ERROR, "Failed to load file into license richedit control from path '%ls' manifest value: %ls", sczLicensePath, m_sczLicenseFile);
2988 hr = S_OK;
2989 }
2990 }
2991
2992 if (m_pfnBAFunctionsProc)
2993 {
2994 themeLoadedArgs.cbSize = sizeof(themeLoadedArgs);
2995 themeLoadedArgs.pTheme = m_pTheme;
2996 themeLoadedArgs.pWixLoc = m_pWixLoc;
2997 themeLoadedResults.cbSize = sizeof(themeLoadedResults);
2998 hr = m_pfnBAFunctionsProc(BA_FUNCTIONS_MESSAGE_ONTHEMELOADED, &themeLoadedArgs, &themeLoadedResults, m_pvBAFunctionsProcContext);
2999 BalExitOnFailure(hr, "BAFunctions OnThemeLoaded failed.");
3000 }
3001
3002 LExit:
3003 ReleaseStr(sczLicenseFilename);
3004 ReleaseStr(sczLicenseDirectory);
3005 ReleaseStr(sczLicensePath);
3006 ReleaseStr(sczLicenseFormatted);
3007
3008 return SUCCEEDED(hr);
3009 }
3010
3011
3012 //
3013 // OnShowFailure - display the failure page.
3014 //
3015 void OnShowFailure()
3016 {
3017 SetState(WIXSTDBA_STATE_FAILED, S_OK);
3018
3019 // If the UI should be visible, display it now and hide the splash screen
3020 if (BOOTSTRAPPER_DISPLAY_NONE < m_command.display)
3021 {
3022 ::ShowWindow(m_pTheme->hwndParent, SW_SHOW);
3023 }
3024
3025 m_pEngine->CloseSplashScreen();
3026
3027 return;
3028 }
3029
3030
3031 //
3032 // OnShowHelp - display the help page.
3033 //
3034 void OnShowHelp()
3035 {
3036 SetState(WIXSTDBA_STATE_HELP, S_OK);
3037
3038 // If the UI should be visible, display it now and hide the splash screen
3039 if (BOOTSTRAPPER_DISPLAY_NONE < m_command.display)
3040 {
3041 ::ShowWindow(m_pTheme->hwndParent, SW_SHOW);
3042 }
3043
3044 m_pEngine->CloseSplashScreen();
3045
3046 return;
3047 }
3048
3049
3050 //
3051 // OnDetect - start the processing of packages.
3052 //
3053 void OnDetect()
3054 {
3055 HRESULT hr = S_OK;
3056
3057 SetState(WIXSTDBA_STATE_DETECTING, hr);
3058
3059 // If the UI should be visible, display it now and hide the splash screen
3060 if (BOOTSTRAPPER_DISPLAY_NONE < m_command.display)
3061 {
3062 ::ShowWindow(m_pTheme->hwndParent, SW_SHOW);
3063 }
3064
3065 m_pEngine->CloseSplashScreen();
3066
3067 // Tell the core we're ready for the packages to be processed now.
3068 hr = m_pEngine->Detect();
3069 BalExitOnFailure(hr, "Failed to start detecting chain.");
3070
3071 LExit:
3072 if (FAILED(hr))
3073 {
3074 SetState(WIXSTDBA_STATE_DETECTING, hr);
3075 }
3076
3077 return;
3078 }
3079
3080
3081 //
3082 // OnPlan - plan the detected changes.
3083 //
3084 void OnPlan(
3085 __in BOOTSTRAPPER_ACTION action
3086 )
3087 {
3088 HRESULT hr = S_OK;
3089
3090 m_plannedAction = action;
3091
3092 // If we are going to apply a downgrade, bail.
3093 if (m_fDowngrading && BOOTSTRAPPER_ACTION_UNINSTALL < action)
3094 {
3095 if (m_fSuppressDowngradeFailure)
3096 {
3097 BalLog(BOOTSTRAPPER_LOG_LEVEL_STANDARD, "A newer version of this product is installed but downgrade failure has been suppressed; continuing...");
3098 }
3099 else
3100 {
3101 hr = HRESULT_FROM_WIN32(ERROR_PRODUCT_VERSION);
3102 BalExitOnFailure(hr, "Cannot install a product when a newer version is installed.");
3103 }
3104 }
3105
3106 SetState(WIXSTDBA_STATE_PLANNING, hr);
3107
3108 hr = m_pEngine->Plan(action);
3109 BalExitOnFailure(hr, "Failed to start planning packages.");
3110
3111 LExit:
3112 if (FAILED(hr))
3113 {
3114 SetState(WIXSTDBA_STATE_PLANNING, hr);
3115 }
3116
3117 return;
3118 }
3119
3120
3121 //
3122 // OnApply - apply the packages.
3123 //
3124 void OnApply()
3125 {
3126 HRESULT hr = S_OK;
3127
3128 SetState(WIXSTDBA_STATE_APPLYING, hr);
3129 SetProgressState(hr);
3130 SetTaskbarButtonProgress(0);
3131
3132 hr = m_pEngine->Apply(m_hWnd);
3133 BalExitOnFailure(hr, "Failed to start applying packages.");
3134
3135 ThemeControlEnable(m_pTheme, WIXSTDBA_CONTROL_PROGRESS_CANCEL_BUTTON, TRUE); // ensure the cancel button is enabled before starting.
3136
3137 LExit:
3138 if (FAILED(hr))
3139 {
3140 SetState(WIXSTDBA_STATE_APPLYING, hr);
3141 }
3142
3143 return;
3144 }
3145
3146
3147 //
3148 // OnChangeState - change state.
3149 //
3150 void OnChangeState(
3151 __in WIXSTDBA_STATE state
3152 )
3153 {
3154 WIXSTDBA_STATE stateOld = m_state;
3155 DWORD dwOldPageId = 0;
3156 DWORD dwNewPageId = 0;
3157 LPWSTR sczText = NULL;
3158 LPWSTR sczUnformattedText = NULL;
3159 LPWSTR sczControlState = NULL;
3160 LPWSTR sczControlName = NULL;
3161
3162 m_state = state;
3163
3164 // If our install is at the end (success or failure) and we're not showing full UI or
3165 // we successfully installed the prerequisite then exit (prompt for restart if required).
3166 if ((WIXSTDBA_STATE_APPLIED <= m_state && BOOTSTRAPPER_DISPLAY_FULL > m_command.display) ||
3167 (WIXSTDBA_STATE_APPLIED == m_state && m_fPrereq))
3168 {
3169 // If a restart was required but we were not automatically allowed to
3170 // accept the reboot then do the prompt.
3171 if (m_fRestartRequired && !m_fAllowRestart)
3172 {
3173 StrAllocFromError(&sczUnformattedText, HRESULT_FROM_WIN32(ERROR_SUCCESS_REBOOT_REQUIRED), NULL);
3174
3175 int nResult = ::MessageBoxW(m_hWnd, sczUnformattedText ? sczUnformattedText : L"The requested operation is successful. Changes will not be effective until the system is rebooted.", m_pTheme->sczCaption, MB_ICONEXCLAMATION | MB_OKCANCEL);
3176 m_fAllowRestart = (IDOK == nResult);
3177 }
3178
3179 // Quietly exit.
3180 ::PostMessageW(m_hWnd, WM_CLOSE, 0, 0);
3181 }
3182 else // try to change the pages.
3183 {
3184 DeterminePageId(stateOld, &dwOldPageId);
3185 DeterminePageId(m_state, &dwNewPageId);
3186
3187 if (dwOldPageId != dwNewPageId)
3188 {
3189 // Enable disable controls per-page.
3190 if (m_rgdwPageIds[WIXSTDBA_PAGE_INSTALL] == dwNewPageId) // on the "Install" page, ensure the install button is enabled/disabled correctly.
3191 {
3192 LONGLONG llElevated = 0;
3193 if (m_Bundle.fPerMachine)
3194 {
3195 BalGetNumericVariable(WIXBUNDLE_VARIABLE_ELEVATED, &llElevated);
3196 }
3197 ThemeControlElevates(m_pTheme, WIXSTDBA_CONTROL_INSTALL_BUTTON, (m_Bundle.fPerMachine && !llElevated));
3198
3199 // If the EULA control exists, show it only if a license URL is provided as well.
3200 if (ThemeControlExists(m_pTheme, WIXSTDBA_CONTROL_EULA_LINK))
3201 {
3202 BOOL fEulaLink = (m_sczLicenseUrl && *m_sczLicenseUrl);
3203 ThemeControlEnable(m_pTheme, WIXSTDBA_CONTROL_EULA_LINK, fEulaLink);
3204 ThemeControlEnable(m_pTheme, WIXSTDBA_CONTROL_EULA_ACCEPT_CHECKBOX, fEulaLink);
3205 }
3206
3207 BOOL fAcceptedLicense = !ThemeControlExists(m_pTheme, WIXSTDBA_CONTROL_EULA_ACCEPT_CHECKBOX) || !ThemeControlEnabled(m_pTheme, WIXSTDBA_CONTROL_EULA_ACCEPT_CHECKBOX) || ThemeIsControlChecked(m_pTheme, WIXSTDBA_CONTROL_EULA_ACCEPT_CHECKBOX);
3208 ThemeControlEnable(m_pTheme, WIXSTDBA_CONTROL_INSTALL_BUTTON, fAcceptedLicense);
3209 }
3210 else if (m_rgdwPageIds[WIXSTDBA_PAGE_MODIFY] == dwNewPageId)
3211 {
3212 ThemeControlEnable(m_pTheme, WIXSTDBA_CONTROL_REPAIR_BUTTON, !m_fSuppressRepair);
3213 }
3214 else if (m_rgdwPageIds[WIXSTDBA_PAGE_SUCCESS] == dwNewPageId) // on the "Success" page, check if the restart or launch button should be enabled.
3215 {
3216 BOOL fShowRestartButton = FALSE;
3217 BOOL fLaunchTargetExists = FALSE;
3218 if (m_fRestartRequired)
3219 {
3220 if (BOOTSTRAPPER_RESTART_PROMPT == m_command.restart)
3221 {
3222 fShowRestartButton = TRUE;
3223 }
3224 }
3225 else if (ThemeControlExists(m_pTheme, WIXSTDBA_CONTROL_LAUNCH_BUTTON))
3226 {
3227 fLaunchTargetExists = BalVariableExists(WIXSTDBA_VARIABLE_LAUNCH_TARGET_PATH);
3228 }
3229
3230 ThemeControlEnable(m_pTheme, WIXSTDBA_CONTROL_LAUNCH_BUTTON, fLaunchTargetExists && BOOTSTRAPPER_ACTION_UNINSTALL < m_plannedAction);
3231 ThemeControlEnable(m_pTheme, WIXSTDBA_CONTROL_SUCCESS_RESTART_BUTTON, fShowRestartButton);
3232 }
3233 else if (m_rgdwPageIds[WIXSTDBA_PAGE_FAILURE] == dwNewPageId) // on the "Failure" page, show error message and check if the restart button should be enabled.
3234 {
3235 BOOL fShowLogLink = (m_Bundle.sczLogVariable && *m_Bundle.sczLogVariable); // if there is a log file variable then we'll assume the log file exists.
3236 BOOL fShowErrorMessage = FALSE;
3237 BOOL fShowRestartButton = FALSE;
3238
3239 if (FAILED(m_hrFinal))
3240 {
3241 // If we know the failure message, use that.
3242 if (m_sczFailedMessage && *m_sczFailedMessage)
3243 {
3244 StrAllocString(&sczUnformattedText, m_sczFailedMessage, 0);
3245 }
3246 else if (E_MBAHOST_NET452_ON_WIN7RTM == m_hrFinal)
3247 {
3248 HRESULT hr = StrAllocString(&sczUnformattedText, L"#(loc.NET452WIN7RTMErrorMessage)", 0);
3249 if (FAILED(hr))
3250 {
3251 BalLogError(hr, "Failed to initialize NET452WIN7RTMErrorMessage loc identifier.");
3252 }
3253 else
3254 {
3255 hr = LocLocalizeString(m_pWixLoc, &sczUnformattedText);
3256 if (FAILED(hr))
3257 {
3258 BalLogError(hr, "Failed to localize NET452WIN7RTMErrorMessage: %ls", sczUnformattedText);
3259 ReleaseNullStr(sczUnformattedText);
3260 }
3261 }
3262 }
3263 else if (E_DNCHOST_SCD_RUNTIME_FAILURE == m_hrFinal)
3264 {
3265 HRESULT hr = StrAllocString(&sczUnformattedText, L"#(loc.SCDRUNTIMEFAILUREErrorMessage)", 0);
3266 if (FAILED(hr))
3267 {
3268 BalLogError(hr, "Failed to initialize SCDRUNTIMEFAILUREErrorMessage loc identifier.");
3269 }
3270 else
3271 {
3272 hr = LocLocalizeString(m_pWixLoc, &sczUnformattedText);
3273 if (FAILED(hr))
3274 {
3275 BalLogError(hr, "Failed to localize SCDRUNTIMEFAILUREErrorMessage: %ls", sczUnformattedText);
3276 ReleaseNullStr(sczUnformattedText);
3277 }
3278 }
3279 }
3280 else // try to get the error message from the error code.
3281 {
3282 StrAllocFromError(&sczUnformattedText, m_hrFinal, NULL);
3283 if (!sczUnformattedText || !*sczUnformattedText)
3284 {
3285 StrAllocFromError(&sczUnformattedText, E_FAIL, NULL);
3286 }
3287 }
3288
3289 if (E_WIXSTDBA_CONDITION_FAILED == m_hrFinal)
3290 {
3291 if (sczUnformattedText)
3292 {
3293 StrAllocString(&sczText, sczUnformattedText, 0);
3294 }
3295 }
3296 else if (E_MBAHOST_NET452_ON_WIN7RTM == m_hrFinal)
3297 {
3298 if (sczUnformattedText)
3299 {
3300 BalFormatString(sczUnformattedText, &sczText);
3301 }
3302 }
3303 else if (E_DNCHOST_SCD_RUNTIME_FAILURE == m_hrFinal)
3304 {
3305 if (sczUnformattedText)
3306 {
3307 BalFormatString(sczUnformattedText, &sczText);
3308 }
3309 }
3310 else
3311 {
3312 StrAllocFormatted(&sczText, L"0x%08x - %ls", m_hrFinal, sczUnformattedText);
3313 }
3314
3315 ThemeSetTextControl(m_pTheme, WIXSTDBA_CONTROL_FAILURE_MESSAGE_TEXT, sczText);
3316 fShowErrorMessage = TRUE;
3317 }
3318
3319 if (m_fRestartRequired)
3320 {
3321 if (BOOTSTRAPPER_RESTART_PROMPT == m_command.restart)
3322 {
3323 fShowRestartButton = TRUE;
3324 }
3325 }
3326
3327 ThemeControlEnable(m_pTheme, WIXSTDBA_CONTROL_FAILURE_LOGFILE_LINK, fShowLogLink);
3328 ThemeControlEnable(m_pTheme, WIXSTDBA_CONTROL_FAILURE_MESSAGE_TEXT, fShowErrorMessage);
3329 ThemeControlEnable(m_pTheme, WIXSTDBA_CONTROL_FAILURE_RESTART_BUTTON, fShowRestartButton);
3330 }
3331
3332 HRESULT hr = ThemeShowPage(m_pTheme, dwOldPageId, SW_HIDE);
3333 if (FAILED(hr))
3334 {
3335 BalLogError(hr, "Failed to hide page: %u", dwOldPageId);
3336 }
3337
3338 hr = ThemeShowPage(m_pTheme, dwNewPageId, SW_SHOW);
3339 if (FAILED(hr))
3340 {
3341 BalLogError(hr, "Failed to show page: %u", dwOldPageId);
3342 }
3343
3344 // On the install page set the focus to the install button or the next enabled control if install is disabled.
3345 if (m_rgdwPageIds[WIXSTDBA_PAGE_INSTALL] == dwNewPageId)
3346 {
3347 ThemeSetFocus(m_pTheme, WIXSTDBA_CONTROL_INSTALL_BUTTON);
3348 }
3349 }
3350 }
3351
3352 ReleaseStr(sczText);
3353 ReleaseStr(sczUnformattedText);
3354 ReleaseStr(sczControlState);
3355 ReleaseStr(sczControlName);
3356 }
3357
3358
3359 //
3360 // OnClose - called when the window is trying to be closed.
3361 //
3362 BOOL OnClose()
3363 {
3364 BOOL fClose = FALSE;
3365 BOOL fCancel = FALSE;
3366
3367 // If we've already succeeded or failed or showing the help page, just close (prompts are annoying if the bootstrapper is done).
3368 if (WIXSTDBA_STATE_APPLIED <= m_state || WIXSTDBA_STATE_HELP == m_state)
3369 {
3370 fClose = TRUE;
3371 }
3372 else // prompt the user or force the cancel if there is no UI.
3373 {
3374 ::EnterCriticalSection(&m_csShowingInternalUiThisPackage);
3375 fClose = PromptCancel(
3376 m_hWnd,
3377 BOOTSTRAPPER_DISPLAY_FULL != m_command.display || m_fShowingInternalUiThisPackage,
3378 m_sczConfirmCloseMessage ? m_sczConfirmCloseMessage : L"Are you sure you want to cancel?",
3379 m_pTheme->sczCaption);
3380 ::LeaveCriticalSection(&m_csShowingInternalUiThisPackage);
3381
3382 fCancel = fClose;
3383 }
3384
3385 // If we're doing progress then we never close, we just cancel to let rollback occur.
3386 if (WIXSTDBA_STATE_APPLYING <= m_state && WIXSTDBA_STATE_APPLIED > m_state)
3387 {
3388 // If we canceled, disable cancel button since clicking it again is silly.
3389 if (fClose)
3390 {
3391 ThemeControlEnable(m_pTheme, WIXSTDBA_CONTROL_PROGRESS_CANCEL_BUTTON, FALSE);
3392 }
3393
3394 fClose = FALSE;
3395 }
3396
3397 if (fClose)
3398 {
3399 DWORD dwCurrentPageId = 0;
3400 DeterminePageId(m_state, &dwCurrentPageId);
3401
3402 // Hide the current page to let thmutil do its thing with variables.
3403 ThemeShowPageEx(m_pTheme, dwCurrentPageId, SW_HIDE, fCancel ? THEME_SHOW_PAGE_REASON_CANCEL : THEME_SHOW_PAGE_REASON_DEFAULT);
3404 }
3405
3406 return fClose;
3407 }
3408
3409
3410 //
3411 // OnClickAcceptCheckbox - allow the install to continue.
3412 //
3413 void OnClickAcceptCheckbox()
3414 {
3415 BOOL fAcceptedLicense = ThemeIsControlChecked(m_pTheme, WIXSTDBA_CONTROL_EULA_ACCEPT_CHECKBOX);
3416 ThemeControlEnable(m_pTheme, WIXSTDBA_CONTROL_INSTALL_BUTTON, fAcceptedLicense);
3417 }
3418
3419
3420 //
3421 // OnClickInstallButton - start the install by planning the packages.
3422 //
3423 void OnClickInstallButton()
3424 {
3425 this->OnPlan(BOOTSTRAPPER_ACTION_INSTALL);
3426 }
3427
3428
3429 //
3430 // OnClickRepairButton - start the repair.
3431 //
3432 void OnClickRepairButton()
3433 {
3434 this->OnPlan(BOOTSTRAPPER_ACTION_REPAIR);
3435 }
3436
3437
3438 //
3439 // OnClickUninstallButton - start the uninstall.
3440 //
3441 void OnClickUninstallButton()
3442 {
3443 this->OnPlan(BOOTSTRAPPER_ACTION_UNINSTALL);
3444 }
3445
3446
3447 //
3448 // OnClickCloseButton - close the application.
3449 //
3450 void OnClickCloseButton()
3451 {
3452 ::SendMessageW(m_hWnd, WM_CLOSE, 0, 0);
3453 }
3454
3455
3456 //
3457 // OnClickEulaLink - show the end user license agreement.
3458 //
3459 void OnClickEulaLink()
3460 {
3461 HRESULT hr = S_OK;
3462 LPWSTR sczLicenseUrl = NULL;
3463 LPWSTR sczLicensePath = NULL;
3464 LPWSTR sczLicenseDirectory = NULL;
3465 LPWSTR sczLicenseFilename = NULL;
3466 URI_PROTOCOL protocol = URI_PROTOCOL_UNKNOWN;
3467
3468 hr = StrAllocString(&sczLicenseUrl, m_sczLicenseUrl, 0);
3469 BalExitOnFailure(hr, "Failed to copy license URL: %ls", m_sczLicenseUrl);
3470
3471 hr = LocLocalizeString(m_pWixLoc, &sczLicenseUrl);
3472 BalExitOnFailure(hr, "Failed to localize license URL: %ls", m_sczLicenseUrl);
3473
3474 // Assume there is no hidden variables to be formatted
3475 // so don't worry about securely freeing it.
3476 hr = BalFormatString(sczLicenseUrl, &sczLicenseUrl);
3477 BalExitOnFailure(hr, "Failed to get formatted license URL: %ls", m_sczLicenseUrl);
3478
3479 hr = UriProtocol(sczLicenseUrl, &protocol);
3480 if (FAILED(hr) || URI_PROTOCOL_UNKNOWN == protocol)
3481 {
3482 // Probe for localized license file
3483 hr = PathRelativeToModule(&sczLicensePath, sczLicenseUrl, m_hModule);
3484 if (SUCCEEDED(hr))
3485 {
3486 hr = PathGetDirectory(sczLicensePath, &sczLicenseDirectory);
3487 if (SUCCEEDED(hr))
3488 {
3489 hr = LocProbeForFile(sczLicenseDirectory, PathFile(sczLicenseUrl), m_sczLanguage, &sczLicensePath);
3490 }
3491 }
3492 }
3493
3494 hr = ShelExecUnelevated(sczLicensePath ? sczLicensePath : sczLicenseUrl, NULL, L"open", NULL, SW_SHOWDEFAULT);
3495 BalExitOnFailure(hr, "Failed to launch URL to EULA.");
3496
3497 LExit:
3498 ReleaseStr(sczLicensePath);
3499 ReleaseStr(sczLicenseUrl);
3500 ReleaseStr(sczLicenseDirectory);
3501 ReleaseStr(sczLicenseFilename);
3502
3503 return;
3504 }
3505
3506
3507 //
3508 // OnClickLaunchButton - launch the app from the success page.
3509 //
3510 void OnClickLaunchButton()
3511 {
3512 HRESULT hr = S_OK;
3513 LPWSTR sczUnformattedLaunchTarget = NULL;
3514 LPWSTR sczLaunchTarget = NULL;
3515 LPWSTR sczLaunchTargetElevatedId = NULL;
3516 LPWSTR sczUnformattedArguments = NULL;
3517 LPWSTR sczArguments = NULL;
3518 LPWSTR sczUnformattedLaunchFolder = NULL;
3519 LPWSTR sczLaunchFolder = NULL;
3520 int nCmdShow = SW_SHOWNORMAL;
3521
3522 hr = BalGetStringVariable(WIXSTDBA_VARIABLE_LAUNCH_TARGET_PATH, &sczUnformattedLaunchTarget);
3523 BalExitOnFailure(hr, "Failed to get launch target variable '%ls'.", WIXSTDBA_VARIABLE_LAUNCH_TARGET_PATH);
3524
3525 hr = BalFormatString(sczUnformattedLaunchTarget, &sczLaunchTarget);
3526 BalExitOnFailure(hr, "Failed to format launch target variable: %ls", sczUnformattedLaunchTarget);
3527
3528 if (BalVariableExists(WIXSTDBA_VARIABLE_LAUNCH_TARGET_ELEVATED_ID))
3529 {
3530 hr = BalGetStringVariable(WIXSTDBA_VARIABLE_LAUNCH_TARGET_ELEVATED_ID, &sczLaunchTargetElevatedId);
3531 BalExitOnFailure(hr, "Failed to get launch target elevated id '%ls'.", WIXSTDBA_VARIABLE_LAUNCH_TARGET_ELEVATED_ID);
3532 }
3533
3534 if (BalVariableExists(WIXSTDBA_VARIABLE_LAUNCH_ARGUMENTS))
3535 {
3536 hr = BalGetStringVariable(WIXSTDBA_VARIABLE_LAUNCH_ARGUMENTS, &sczUnformattedArguments);
3537 BalExitOnFailure(hr, "Failed to get launch arguments '%ls'.", WIXSTDBA_VARIABLE_LAUNCH_ARGUMENTS);
3538 }
3539
3540 if (BalVariableExists(WIXSTDBA_VARIABLE_LAUNCH_HIDDEN))
3541 {
3542 nCmdShow = SW_HIDE;
3543 }
3544
3545 if (BalVariableExists(WIXSTDBA_VARIABLE_LAUNCH_WORK_FOLDER))
3546 {
3547 hr = BalGetStringVariable(WIXSTDBA_VARIABLE_LAUNCH_WORK_FOLDER, &sczUnformattedLaunchFolder);
3548 BalExitOnFailure(hr, "Failed to get launch working directory variable '%ls'.", WIXSTDBA_VARIABLE_LAUNCH_WORK_FOLDER);
3549 }
3550
3551 if (sczLaunchTargetElevatedId && !m_fTriedToLaunchElevated)
3552 {
3553 m_fTriedToLaunchElevated = TRUE;
3554 hr = m_pEngine->LaunchApprovedExe(m_hWnd, sczLaunchTargetElevatedId, sczUnformattedArguments, 0);
3555 if (FAILED(hr))
3556 {
3557 BalLogError(hr, "Failed to launch elevated target: %ls", sczLaunchTargetElevatedId);
3558
3559 //try with ShelExec next time
3560 OnClickLaunchButton();
3561 }
3562 }
3563 else
3564 {
3565 if (sczUnformattedArguments)
3566 {
3567 hr = BalFormatString(sczUnformattedArguments, &sczArguments);
3568 BalExitOnFailure(hr, "Failed to format launch arguments variable: %ls", sczUnformattedArguments);
3569 }
3570
3571 if (sczUnformattedLaunchFolder)
3572 {
3573 hr = BalFormatString(sczUnformattedLaunchFolder, &sczLaunchFolder);
3574 BalExitOnFailure(hr, "Failed to format launch working directory variable: %ls", sczUnformattedLaunchFolder);
3575 }
3576
3577 hr = ShelExec(sczLaunchTarget, sczArguments, L"open", sczLaunchFolder, nCmdShow, m_hWnd, NULL);
3578 BalExitOnFailure(hr, "Failed to launch target: %ls", sczLaunchTarget);
3579
3580 ::PostMessageW(m_hWnd, WM_CLOSE, 0, 0);
3581 }
3582
3583 LExit:
3584 StrSecureZeroFreeString(sczLaunchFolder);
3585 ReleaseStr(sczUnformattedLaunchFolder);
3586 StrSecureZeroFreeString(sczArguments);
3587 ReleaseStr(sczUnformattedArguments);
3588 ReleaseStr(sczLaunchTargetElevatedId);
3589 StrSecureZeroFreeString(sczLaunchTarget);
3590 ReleaseStr(sczUnformattedLaunchTarget);
3591
3592 return;
3593 }
3594
3595
3596 //
3597 // OnClickRestartButton - allows the restart and closes the app.
3598 //
3599 void OnClickRestartButton()
3600 {
3601 AssertSz(m_fRestartRequired, "Restart must be requested to be able to click on the restart button.");
3602
3603 m_fAllowRestart = TRUE;
3604 ::SendMessageW(m_hWnd, WM_CLOSE, 0, 0);
3605
3606 return;
3607 }
3608
3609
3610 //
3611 // OnClickLogFileLink - show the log file.
3612 //
3613 void OnClickLogFileLink()
3614 {
3615 HRESULT hr = S_OK;
3616 LPWSTR sczLogFile = NULL;
3617
3618 hr = BalGetStringVariable(m_Bundle.sczLogVariable, &sczLogFile);
3619 BalExitOnFailure(hr, "Failed to get log file variable '%ls'.", m_Bundle.sczLogVariable);
3620
3621 hr = ShelExecUnelevated(L"notepad.exe", sczLogFile, L"open", NULL, SW_SHOWDEFAULT);
3622 BalExitOnFailure(hr, "Failed to open log file target: %ls", sczLogFile);
3623
3624 LExit:
3625 ReleaseStr(sczLogFile);
3626
3627 return;
3628 }
3629
3630
3631 //
3632 // SetState
3633 //
3634 void SetState(
3635 __in WIXSTDBA_STATE state,
3636 __in HRESULT hrStatus
3637 )
3638 {
3639 if (FAILED(hrStatus))
3640 {
3641 m_hrFinal = hrStatus;
3642 }
3643
3644 if (FAILED(m_hrFinal))
3645 {
3646 state = WIXSTDBA_STATE_FAILED;
3647 }
3648
3649 if (m_state < state)
3650 {
3651 ::PostMessageW(m_hWnd, WM_WIXSTDBA_CHANGE_STATE, 0, state);
3652 }
3653 }
3654
3655
3656 void DeterminePageId(
3657 __in WIXSTDBA_STATE state,
3658 __out DWORD* pdwPageId
3659 )
3660 {
3661 if (BOOTSTRAPPER_DISPLAY_PASSIVE == m_command.display)
3662 {
3663 switch (state)
3664 {
3665 case WIXSTDBA_STATE_INITIALIZED:
3666 *pdwPageId = BOOTSTRAPPER_ACTION_HELP == m_command.action ? m_rgdwPageIds[WIXSTDBA_PAGE_HELP] : m_rgdwPageIds[WIXSTDBA_PAGE_LOADING];
3667 break;
3668
3669 case WIXSTDBA_STATE_HELP:
3670 *pdwPageId = m_rgdwPageIds[WIXSTDBA_PAGE_HELP];
3671 break;
3672
3673 case WIXSTDBA_STATE_DETECTING:
3674 *pdwPageId = m_rgdwPageIds[WIXSTDBA_PAGE_LOADING] ? m_rgdwPageIds[WIXSTDBA_PAGE_LOADING] : m_rgdwPageIds[WIXSTDBA_PAGE_PROGRESS_PASSIVE] ? m_rgdwPageIds[WIXSTDBA_PAGE_PROGRESS_PASSIVE] : m_rgdwPageIds[WIXSTDBA_PAGE_PROGRESS];
3675 break;
3676
3677 case WIXSTDBA_STATE_DETECTED: __fallthrough;
3678 case WIXSTDBA_STATE_PLANNING: __fallthrough;
3679 case WIXSTDBA_STATE_PLANNED: __fallthrough;
3680 case WIXSTDBA_STATE_APPLYING: __fallthrough;
3681 case WIXSTDBA_STATE_CACHING: __fallthrough;
3682 case WIXSTDBA_STATE_CACHED: __fallthrough;
3683 case WIXSTDBA_STATE_EXECUTING: __fallthrough;
3684 case WIXSTDBA_STATE_EXECUTED:
3685 *pdwPageId = m_rgdwPageIds[WIXSTDBA_PAGE_PROGRESS_PASSIVE] ? m_rgdwPageIds[WIXSTDBA_PAGE_PROGRESS_PASSIVE] : m_rgdwPageIds[WIXSTDBA_PAGE_PROGRESS];
3686 break;
3687
3688 default:
3689 *pdwPageId = 0;
3690 break;
3691 }
3692 }
3693 else if (BOOTSTRAPPER_DISPLAY_FULL == m_command.display)
3694 {
3695 switch (state)
3696 {
3697 case WIXSTDBA_STATE_INITIALIZING:
3698 *pdwPageId = 0;
3699 break;
3700
3701 case WIXSTDBA_STATE_INITIALIZED:
3702 *pdwPageId = BOOTSTRAPPER_ACTION_HELP == m_command.action ? m_rgdwPageIds[WIXSTDBA_PAGE_HELP] : m_rgdwPageIds[WIXSTDBA_PAGE_LOADING];
3703 break;
3704
3705 case WIXSTDBA_STATE_HELP:
3706 *pdwPageId = m_rgdwPageIds[WIXSTDBA_PAGE_HELP];
3707 break;
3708
3709 case WIXSTDBA_STATE_DETECTING:
3710 *pdwPageId = m_rgdwPageIds[WIXSTDBA_PAGE_LOADING];
3711 break;
3712
3713 case WIXSTDBA_STATE_DETECTED:
3714 switch (m_command.action)
3715 {
3716 case BOOTSTRAPPER_ACTION_INSTALL:
3717 *pdwPageId = m_rgdwPageIds[WIXSTDBA_PAGE_INSTALL];
3718 break;
3719
3720 case BOOTSTRAPPER_ACTION_MODIFY: __fallthrough;
3721 case BOOTSTRAPPER_ACTION_REPAIR: __fallthrough;
3722 case BOOTSTRAPPER_ACTION_UNINSTALL:
3723 *pdwPageId = m_rgdwPageIds[WIXSTDBA_PAGE_MODIFY];
3724 break;
3725 }
3726 break;
3727
3728 case WIXSTDBA_STATE_PLANNING: __fallthrough;
3729 case WIXSTDBA_STATE_PLANNED: __fallthrough;
3730 case WIXSTDBA_STATE_APPLYING: __fallthrough;
3731 case WIXSTDBA_STATE_CACHING: __fallthrough;
3732 case WIXSTDBA_STATE_CACHED: __fallthrough;
3733 case WIXSTDBA_STATE_EXECUTING: __fallthrough;
3734 case WIXSTDBA_STATE_EXECUTED:
3735 *pdwPageId = m_rgdwPageIds[WIXSTDBA_PAGE_PROGRESS];
3736 break;
3737
3738 case WIXSTDBA_STATE_APPLIED:
3739 *pdwPageId = m_rgdwPageIds[WIXSTDBA_PAGE_SUCCESS];
3740 break;
3741
3742 case WIXSTDBA_STATE_FAILED:
3743 *pdwPageId = m_rgdwPageIds[WIXSTDBA_PAGE_FAILURE];
3744 break;
3745 }
3746 }
3747 }
3748
3749
3750 HRESULT EvaluateConditions()
3751 {
3752 HRESULT hr = S_OK;
3753 BOOL fResult = FALSE;
3754
3755 for (DWORD i = 0; i < m_Conditions.cConditions; ++i)
3756 {
3757 BAL_CONDITION* pCondition = m_Conditions.rgConditions + i;
3758
3759 hr = BalConditionEvaluate(pCondition, m_pEngine, &fResult, &m_sczFailedMessage);
3760 BalExitOnFailure(hr, "Failed to evaluate condition.");
3761
3762 if (!fResult)
3763 {
3764 hr = E_WIXSTDBA_CONDITION_FAILED;
3765 BalExitOnFailure(hr, "%ls", m_sczFailedMessage);
3766 }
3767 }
3768
3769 ReleaseNullStrSecure(m_sczFailedMessage);
3770
3771 LExit:
3772 return hr;
3773 }
3774
3775 void UpdateCacheProgress(
3776 __in DWORD dwOverallPercentage
3777 )
3778 {
3779 WCHAR wzProgress[5] = { };
3780
3781 ::StringCchPrintfW(wzProgress, countof(wzProgress), L"%u%%", dwOverallPercentage);
3782 ThemeSetTextControl(m_pTheme, WIXSTDBA_CONTROL_CACHE_PROGRESS_TEXT, wzProgress);
3783
3784 ThemeSetProgressControl(m_pTheme, WIXSTDBA_CONTROL_CACHE_PROGRESS_BAR, dwOverallPercentage);
3785
3786 m_dwCalculatedCacheProgress = dwOverallPercentage * WIXSTDBA_ACQUIRE_PERCENTAGE / 100;
3787 ThemeSetProgressControl(m_pTheme, WIXSTDBA_CONTROL_OVERALL_CALCULATED_PROGRESS_BAR, m_dwCalculatedCacheProgress + m_dwCalculatedExecuteProgress);
3788
3789 SetTaskbarButtonProgress(m_dwCalculatedCacheProgress + m_dwCalculatedExecuteProgress);
3790 }
3791
3792
3793 void SetTaskbarButtonProgress(
3794 __in DWORD dwOverallPercentage
3795 )
3796 {
3797 HRESULT hr = S_OK;
3798
3799 if (m_fTaskbarButtonOK)
3800 {
3801 hr = m_pTaskbarList->SetProgressValue(m_hWnd, dwOverallPercentage, 100UL);
3802 BalExitOnFailure(hr, "Failed to set taskbar button progress to: %d%%.", dwOverallPercentage);
3803 }
3804
3805 LExit:
3806 return;
3807 }
3808
3809
3810 void SetTaskbarButtonState(
3811 __in TBPFLAG tbpFlags
3812 )
3813 {
3814 HRESULT hr = S_OK;
3815
3816 if (m_fTaskbarButtonOK)
3817 {
3818 hr = m_pTaskbarList->SetProgressState(m_hWnd, tbpFlags);
3819 BalExitOnFailure(hr, "Failed to set taskbar button state.", tbpFlags);
3820 }
3821
3822 LExit:
3823 return;
3824 }
3825
3826
3827 void SetProgressState(
3828 __in HRESULT hrStatus
3829 )
3830 {
3831 TBPFLAG flag = TBPF_NORMAL;
3832
3833 if (IsCanceled() || HRESULT_FROM_WIN32(ERROR_INSTALL_USEREXIT) == hrStatus)
3834 {
3835 flag = TBPF_PAUSED;
3836 }
3837 else if (IsRollingBack() || FAILED(hrStatus))
3838 {
3839 flag = TBPF_ERROR;
3840 }
3841
3842 SetTaskbarButtonState(flag);
3843 }
3844
3845
3846 HRESULT LoadBAFunctions(
3847 __in IXMLDOMDocument* pixdManifest
3848 )
3849 {
3850 HRESULT hr = S_OK;
3851 IXMLDOMNode* pBAFunctionsNode = NULL;
3852 IXMLDOMNode* pPayloadNode = NULL;
3853 LPWSTR sczPayloadId = NULL;
3854 LPWSTR sczPayloadXPath = NULL;
3855 LPWSTR sczBafName = NULL;
3856 LPWSTR sczBafPath = NULL;
3857 BA_FUNCTIONS_CREATE_ARGS bafCreateArgs = { };
3858 BA_FUNCTIONS_CREATE_RESULTS bafCreateResults = { };
3859
3860 hr = XmlSelectSingleNode(pixdManifest, L"/BootstrapperApplicationData/WixBalBAFunctions", &pBAFunctionsNode);
3861 BalExitOnFailure(hr, "Failed to read WixBalBAFunctions node from BootstrapperApplicationData.xml.");
3862
3863 if (S_FALSE == hr)
3864 {
3865 ExitFunction();
3866 }
3867
3868 hr = XmlGetAttributeEx(pBAFunctionsNode, L"PayloadId", &sczPayloadId);
3869 BalExitOnFailure(hr, "Failed to get BAFunctions PayloadId.");
3870
3871 hr = StrAllocFormatted(&sczPayloadXPath, L"/BootstrapperApplicationData/WixPayloadProperties[@Payload='%ls']", sczPayloadId);
3872 BalExitOnFailure(hr, "Failed to format BAFunctions payload XPath.");
3873
3874 hr = XmlSelectSingleNode(pixdManifest, sczPayloadXPath, &pPayloadNode);
3875 if (S_FALSE == hr)
3876 {
3877 hr = E_NOTFOUND;
3878 }
3879 BalExitOnFailure(hr, "Failed to find WixPayloadProperties node for BAFunctions PayloadId: %ls.", sczPayloadId);
3880
3881 hr = XmlGetAttributeEx(pPayloadNode, L"Name", &sczBafName);
3882 BalExitOnFailure(hr, "Failed to get BAFunctions Name.");
3883
3884 hr = PathRelativeToModule(&sczBafPath, sczBafName, m_hModule);
3885 BalExitOnFailure(hr, "Failed to get path to BAFunctions DLL.");
3886
3887 BalLog(BOOTSTRAPPER_LOG_LEVEL_STANDARD, "WIXSTDBA: LoadBAFunctions() - BAFunctions DLL %ls", sczBafPath);
3888
3889 m_hBAFModule = ::LoadLibraryExW(sczBafPath, NULL, LOAD_WITH_ALTERED_SEARCH_PATH);
3890 BalExitOnNullWithLastError(m_hBAFModule, hr, "WIXSTDBA: LoadBAFunctions() - Failed to load DLL %ls", sczBafPath);
3891
3892 PFN_BA_FUNCTIONS_CREATE pfnBAFunctionsCreate = reinterpret_cast<PFN_BA_FUNCTIONS_CREATE>(::GetProcAddress(m_hBAFModule, "BAFunctionsCreate"));
3893 BalExitOnNullWithLastError(pfnBAFunctionsCreate, hr, "Failed to get BAFunctionsCreate entry-point from: %ls", sczBafPath);
3894
3895 bafCreateArgs.cbSize = sizeof(bafCreateArgs);
3896 bafCreateArgs.qwBAFunctionsAPIVersion = MAKEQWORDVERSION(0, 0, 0, 2); // TODO: need to decide whether to keep this, and if so when to update it.
3897 bafCreateArgs.pBootstrapperCreateArgs = &m_createArgs;
3898
3899 bafCreateResults.cbSize = sizeof(bafCreateResults);
3900
3901 hr = pfnBAFunctionsCreate(&bafCreateArgs, &bafCreateResults);
3902 BalExitOnFailure(hr, "Failed to create BAFunctions.");
3903
3904 m_pfnBAFunctionsProc = bafCreateResults.pfnBAFunctionsProc;
3905 m_pvBAFunctionsProcContext = bafCreateResults.pvBAFunctionsProcContext;
3906
3907 LExit:
3908 if (m_hBAFModule && !m_pfnBAFunctionsProc)
3909 {
3910 ::FreeLibrary(m_hBAFModule);
3911 m_hBAFModule = NULL;
3912 }
3913 ReleaseStr(sczBafPath);
3914 ReleaseStr(sczBafName);
3915 ReleaseStr(sczPayloadXPath);
3916 ReleaseStr(sczPayloadId);
3917 ReleaseObject(pBAFunctionsNode);
3918 ReleaseObject(pPayloadNode);
3919
3920 return hr;
3921 }
3922
3923
3924public:
3925 //
3926 // Constructor - initialize member variables.
3927 //
3928 CWixStandardBootstrapperApplication(
3929 __in HMODULE hModule,
3930 __in BOOL fPrereq,
3931 __in HRESULT hrHostInitialization,
3932 __in IBootstrapperEngine* pEngine,
3933 __in const BOOTSTRAPPER_CREATE_ARGS* pArgs
3934 ) : CBalBaseBootstrapperApplication(pEngine, pArgs, 3, 3000)
3935 {
3936 m_hModule = hModule;
3937 memcpy_s(&m_command, sizeof(m_command), pArgs->pCommand, sizeof(BOOTSTRAPPER_COMMAND));
3938 memcpy_s(&m_createArgs, sizeof(m_createArgs), pArgs, sizeof(BOOTSTRAPPER_CREATE_ARGS));
3939 m_createArgs.pCommand = &m_command;
3940
3941 if (fPrereq)
3942 {
3943 // Pre-req BA should only show help or do an install (to launch the Managed BA which can then do the right action).
3944 if (BOOTSTRAPPER_ACTION_HELP != m_command.action)
3945 {
3946 m_command.action = BOOTSTRAPPER_ACTION_INSTALL;
3947 }
3948 }
3949 else // maybe modify the action state if the bundle is or is not already installed.
3950 {
3951 LONGLONG llInstalled = 0;
3952 HRESULT hr = BalGetNumericVariable(L"WixBundleInstalled", &llInstalled);
3953 if (SUCCEEDED(hr) && BOOTSTRAPPER_RESUME_TYPE_REBOOT != m_command.resumeType && 0 < llInstalled && BOOTSTRAPPER_ACTION_INSTALL == m_command.action)
3954 {
3955 m_command.action = BOOTSTRAPPER_ACTION_MODIFY;
3956 }
3957 else if (0 == llInstalled && (BOOTSTRAPPER_ACTION_MODIFY == m_command.action || BOOTSTRAPPER_ACTION_REPAIR == m_command.action))
3958 {
3959 m_command.action = BOOTSTRAPPER_ACTION_INSTALL;
3960 }
3961 }
3962
3963 m_plannedAction = BOOTSTRAPPER_ACTION_UNKNOWN;
3964
3965 // When resuming from restart doing some install-like operation, try to find the package that forced the
3966 // restart. We'll use this information during planning.
3967 m_sczAfterForcedRestartPackage = NULL;
3968
3969 if (BOOTSTRAPPER_RESUME_TYPE_REBOOT == m_command.resumeType && BOOTSTRAPPER_ACTION_UNINSTALL < m_command.action)
3970 {
3971 // Ensure the forced restart package variable is null when it is an empty string.
3972 HRESULT hr = BalGetStringVariable(L"WixBundleForcedRestartPackage", &m_sczAfterForcedRestartPackage);
3973 if (FAILED(hr) || !m_sczAfterForcedRestartPackage || !*m_sczAfterForcedRestartPackage)
3974 {
3975 ReleaseNullStr(m_sczAfterForcedRestartPackage);
3976 }
3977 }
3978
3979 m_pWixLoc = NULL;
3980 memset(&m_Bundle, 0, sizeof(m_Bundle));
3981 memset(&m_Conditions, 0, sizeof(m_Conditions));
3982 m_sczConfirmCloseMessage = NULL;
3983 m_sczFailedMessage = NULL;
3984
3985 m_sczLanguage = NULL;
3986 m_pTheme = NULL;
3987 memset(m_rgdwPageIds, 0, sizeof(m_rgdwPageIds));
3988 m_hUiThread = NULL;
3989 m_fRegistered = FALSE;
3990 m_hWnd = NULL;
3991
3992 m_state = WIXSTDBA_STATE_INITIALIZING;
3993 m_hrFinal = hrHostInitialization;
3994
3995 m_fDowngrading = FALSE;
3996 m_restartResult = BOOTSTRAPPER_APPLY_RESTART_NONE;
3997 m_fRestartRequired = FALSE;
3998 m_fAllowRestart = FALSE;
3999
4000 m_sczLicenseFile = NULL;
4001 m_sczLicenseUrl = NULL;
4002 m_fSuppressDowngradeFailure = FALSE;
4003 m_fSuppressRepair = FALSE;
4004 m_fSupportCacheOnly = FALSE;
4005
4006 m_sdOverridableVariables = NULL;
4007 m_pTaskbarList = NULL;
4008 m_uTaskbarButtonCreatedMessage = UINT_MAX;
4009 m_fTaskbarButtonOK = FALSE;
4010 ::InitializeCriticalSection(&m_csShowingInternalUiThisPackage);
4011 m_fShowingInternalUiThisPackage = FALSE;
4012 m_fTriedToLaunchElevated = FALSE;
4013
4014 m_fPrereq = fPrereq;
4015 m_fPrereqInstalled = FALSE;
4016 m_fPrereqAlreadyInstalled = FALSE;
4017
4018 pEngine->AddRef();
4019 m_pEngine = pEngine;
4020
4021 m_hBAFModule = NULL;
4022 m_pfnBAFunctionsProc = NULL;
4023 m_pvBAFunctionsProcContext = NULL;
4024 }
4025
4026
4027 //
4028 // Destructor - release member variables.
4029 //
4030 ~CWixStandardBootstrapperApplication()
4031 {
4032 AssertSz(!::IsWindow(m_hWnd), "Window should have been destroyed before destructor.");
4033 AssertSz(!m_pTaskbarList, "Taskbar should have been released before destructor.");
4034 AssertSz(!m_pTheme, "Theme should have been released before destructor.");
4035
4036 for (DWORD i = 0; i < m_Bundle.packages.cPackages; ++i)
4037 {
4038 ReleaseMem(m_Bundle.packages.rgPackages[i].pvCustomData);
4039 }
4040
4041 ::DeleteCriticalSection(&m_csShowingInternalUiThisPackage);
4042 ReleaseDict(m_sdOverridableVariables);
4043 ReleaseStr(m_sczFailedMessage);
4044 ReleaseStr(m_sczConfirmCloseMessage);
4045 BalConditionsUninitialize(&m_Conditions);
4046 BalInfoUninitialize(&m_Bundle);
4047 LocFree(m_pWixLoc);
4048
4049 ReleaseStr(m_sczLanguage);
4050 ReleaseStr(m_sczLicenseFile);
4051 ReleaseStr(m_sczLicenseUrl);
4052 ReleaseStr(m_sczAfterForcedRestartPackage);
4053 ReleaseNullObject(m_pEngine);
4054
4055 if (m_hBAFModule)
4056 {
4057 PFN_BA_FUNCTIONS_DESTROY pfnBAFunctionsDestroy = reinterpret_cast<PFN_BA_FUNCTIONS_DESTROY>(::GetProcAddress(m_hBAFModule, "BAFunctionsDestroy"));
4058 if (pfnBAFunctionsDestroy)
4059 {
4060 pfnBAFunctionsDestroy();
4061 }
4062
4063 ::FreeLibrary(m_hBAFModule);
4064 m_hBAFModule = NULL;
4065 }
4066 }
4067
4068private:
4069 HMODULE m_hModule;
4070 BOOTSTRAPPER_CREATE_ARGS m_createArgs;
4071 BOOTSTRAPPER_COMMAND m_command;
4072 IBootstrapperEngine* m_pEngine;
4073 BOOTSTRAPPER_ACTION m_plannedAction;
4074
4075 LPWSTR m_sczAfterForcedRestartPackage;
4076
4077 WIX_LOCALIZATION* m_pWixLoc;
4078 BAL_INFO_BUNDLE m_Bundle;
4079 BAL_CONDITIONS m_Conditions;
4080 LPWSTR m_sczFailedMessage;
4081 LPWSTR m_sczConfirmCloseMessage;
4082
4083 LPWSTR m_sczLanguage;
4084 THEME* m_pTheme;
4085 DWORD m_rgdwPageIds[countof(vrgwzPageNames)];
4086 HANDLE m_hUiThread;
4087 BOOL m_fRegistered;
4088 HWND m_hWnd;
4089
4090 WIXSTDBA_STATE m_state;
4091 HRESULT m_hrFinal;
4092
4093 BOOL m_fStartedExecution;
4094 DWORD m_dwCalculatedCacheProgress;
4095 DWORD m_dwCalculatedExecuteProgress;
4096
4097 BOOL m_fDowngrading;
4098 BOOTSTRAPPER_APPLY_RESTART m_restartResult;
4099 BOOL m_fRestartRequired;
4100 BOOL m_fAllowRestart;
4101
4102 LPWSTR m_sczLicenseFile;
4103 LPWSTR m_sczLicenseUrl;
4104 BOOL m_fSuppressDowngradeFailure;
4105 BOOL m_fSuppressRepair;
4106 BOOL m_fSupportCacheOnly;
4107
4108 STRINGDICT_HANDLE m_sdOverridableVariables;
4109
4110 BOOL m_fPrereq;
4111 BOOL m_fPrereqInstalled;
4112 BOOL m_fPrereqAlreadyInstalled;
4113
4114 ITaskbarList3* m_pTaskbarList;
4115 UINT m_uTaskbarButtonCreatedMessage;
4116 BOOL m_fTaskbarButtonOK;
4117 CRITICAL_SECTION m_csShowingInternalUiThisPackage;
4118 BOOL m_fShowingInternalUiThisPackage;
4119 BOOL m_fTriedToLaunchElevated;
4120
4121 HMODULE m_hBAFModule;
4122 PFN_BA_FUNCTIONS_PROC m_pfnBAFunctionsProc;
4123 LPVOID m_pvBAFunctionsProcContext;
4124};
4125
4126
4127//
4128// CreateBootstrapperApplication - creates a new IBootstrapperApplication object.
4129//
4130HRESULT CreateBootstrapperApplication(
4131 __in HMODULE hModule,
4132 __in BOOL fPrereq,
4133 __in HRESULT hrHostInitialization,
4134 __in IBootstrapperEngine* pEngine,
4135 __in const BOOTSTRAPPER_CREATE_ARGS* pArgs,
4136 __inout BOOTSTRAPPER_CREATE_RESULTS* pResults,
4137 __out IBootstrapperApplication** ppApplication
4138 )
4139{
4140 HRESULT hr = S_OK;
4141 CWixStandardBootstrapperApplication* pApplication = NULL;
4142
4143 if (BOOTSTRAPPER_DISPLAY_UNKNOWN == pArgs->pCommand->display)
4144 {
4145 BalExitOnFailure(hr = E_INVALIDARG, "Engine requested Unknown display type.");
4146 }
4147
4148 pApplication = new CWixStandardBootstrapperApplication(hModule, fPrereq, hrHostInitialization, pEngine, pArgs);
4149 ExitOnNull(pApplication, hr, E_OUTOFMEMORY, "Failed to create new standard bootstrapper application object.");
4150
4151 pResults->pfnBootstrapperApplicationProc = BalBaseBootstrapperApplicationProc;
4152 pResults->pvBootstrapperApplicationProcContext = pApplication;
4153 *ppApplication = pApplication;
4154 pApplication = NULL;
4155
4156LExit:
4157 ReleaseObject(pApplication);
4158 return hr;
4159}
4160
4161
4162static HRESULT DAPI EvaluateVariableConditionCallback(
4163 __in_z LPCWSTR wzCondition,
4164 __out BOOL* pf,
4165 __in_opt LPVOID /*pvContext*/
4166 )
4167{
4168 return BalEvaluateCondition(wzCondition, pf);
4169}
4170
4171
4172static HRESULT DAPI FormatVariableStringCallback(
4173 __in_z LPCWSTR wzFormat,
4174 __inout LPWSTR* psczOut,
4175 __in_opt LPVOID /*pvContext*/
4176 )
4177{
4178 return BalFormatString(wzFormat, psczOut);
4179}
4180
4181
4182static HRESULT DAPI GetVariableNumericCallback(
4183 __in_z LPCWSTR wzVariable,
4184 __out LONGLONG* pllValue,
4185 __in_opt LPVOID /*pvContext*/
4186 )
4187{
4188 return BalGetNumericVariable(wzVariable, pllValue);
4189}
4190
4191
4192static HRESULT DAPI SetVariableNumericCallback(
4193 __in_z LPCWSTR wzVariable,
4194 __in LONGLONG llValue,
4195 __in_opt LPVOID /*pvContext*/
4196 )
4197{
4198 return BalSetNumericVariable(wzVariable, llValue);
4199}
4200
4201
4202static HRESULT DAPI GetVariableStringCallback(
4203 __in_z LPCWSTR wzVariable,
4204 __inout LPWSTR* psczValue,
4205 __in_opt LPVOID /*pvContext*/
4206 )
4207{
4208 return BalGetStringVariable(wzVariable, psczValue);
4209}
4210
4211
4212static HRESULT DAPI SetVariableStringCallback(
4213 __in_z LPCWSTR wzVariable,
4214 __in_z_opt LPCWSTR wzValue,
4215 __in BOOL fFormatted,
4216 __in_opt LPVOID /*pvContext*/
4217 )
4218{
4219 return BalSetStringVariable(wzVariable, wzValue, fFormatted);
4220}
4221
4222static LPCSTR LoggingRequestStateToString(
4223 __in BOOTSTRAPPER_REQUEST_STATE requestState
4224 )
4225{
4226 switch (requestState)
4227 {
4228 case BOOTSTRAPPER_REQUEST_STATE_NONE:
4229 return "None";
4230 case BOOTSTRAPPER_REQUEST_STATE_FORCE_ABSENT:
4231 return "ForceAbsent";
4232 case BOOTSTRAPPER_REQUEST_STATE_ABSENT:
4233 return "Absent";
4234 case BOOTSTRAPPER_REQUEST_STATE_CACHE:
4235 return "Cache";
4236 case BOOTSTRAPPER_REQUEST_STATE_PRESENT:
4237 return "Present";
4238 case BOOTSTRAPPER_REQUEST_STATE_REPAIR:
4239 return "Repair";
4240 default:
4241 return "Invalid";
4242 }
4243}
4244
4245static LPCSTR LoggingMsiFeatureStateToString(
4246 __in BOOTSTRAPPER_FEATURE_STATE featureState
4247 )
4248{
4249 switch (featureState)
4250 {
4251 case BOOTSTRAPPER_FEATURE_STATE_UNKNOWN:
4252 return "Unknown";
4253 case BOOTSTRAPPER_FEATURE_STATE_ABSENT:
4254 return "Absent";
4255 case BOOTSTRAPPER_FEATURE_STATE_ADVERTISED:
4256 return "Advertised";
4257 case BOOTSTRAPPER_FEATURE_STATE_LOCAL:
4258 return "Local";
4259 case BOOTSTRAPPER_FEATURE_STATE_SOURCE:
4260 return "Source";
4261 default:
4262 return "Invalid";
4263 }
4264}
diff --git a/src/ext/Bal/wixstdba/packages.config b/src/ext/Bal/wixstdba/packages.config
new file mode 100644
index 00000000..071284ac
--- /dev/null
+++ b/src/ext/Bal/wixstdba/packages.config
@@ -0,0 +1,10 @@
1<?xml version="1.0" encoding="utf-8"?>
2<packages>
3 <package id="Microsoft.Build.Tasks.Git" version="1.0.0" targetFramework="native" developmentDependency="true" />
4 <package id="Microsoft.SourceLink.Common" version="1.0.0" targetFramework="native" developmentDependency="true" />
5 <package id="Microsoft.SourceLink.GitHub" version="1.0.0" targetFramework="native" developmentDependency="true" />
6 <package id="Nerdbank.GitVersioning" version="3.3.37" targetFramework="native" developmentDependency="true" />
7 <package id="WixToolset.BalUtil" version="4.0.58" targetFramework="native" />
8 <package id="WixToolset.BootstrapperCore.Native" version="4.0.141" targetFramework="native" />
9 <package id="WixToolset.DUtil" version="4.0.72" targetFramework="native" />
10</packages> \ No newline at end of file
diff --git a/src/ext/Bal/wixstdba/precomp.cpp b/src/ext/Bal/wixstdba/precomp.cpp
new file mode 100644
index 00000000..37664a1c
--- /dev/null
+++ b/src/ext/Bal/wixstdba/precomp.cpp
@@ -0,0 +1,3 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3#include "precomp.h"
diff --git a/src/ext/Bal/wixstdba/precomp.h b/src/ext/Bal/wixstdba/precomp.h
new file mode 100644
index 00000000..547183bd
--- /dev/null
+++ b/src/ext/Bal/wixstdba/precomp.h
@@ -0,0 +1,58 @@
1#pragma once
2// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
3
4
5#include <windows.h>
6
7#pragma warning(push)
8#pragma warning(disable:4458) // declaration of 'xxx' hides class member
9#include <gdiplus.h>
10#pragma warning(pop)
11
12#include <msiquery.h>
13#include <objbase.h>
14#include <shlobj.h>
15#include <shlwapi.h>
16#include <stdlib.h>
17#include <strsafe.h>
18#include <stddef.h>
19
20#include "dutil.h"
21#include "apputil.h"
22#include "memutil.h"
23#include "dictutil.h"
24#include "dirutil.h"
25#include "fileutil.h"
26#include "locutil.h"
27#include "logutil.h"
28#include "pathutil.h"
29#include "resrutil.h"
30#include "shelutil.h"
31#include "strutil.h"
32#include "thmutil.h"
33#include "verutil.h"
34#include "uriutil.h"
35#include "xmlutil.h"
36
37#include "BootstrapperEngine.h"
38#include "BootstrapperApplication.h"
39#include "IBootstrapperEngine.h"
40#include "IBootstrapperApplication.h"
41
42#include "balutil.h"
43#include "balinfo.h"
44#include "balcondition.h"
45
46#include "BAFunctions.h"
47
48#include "wixstdba.messages.h"
49
50HRESULT CreateBootstrapperApplication(
51 __in HMODULE hModule,
52 __in BOOL fPrereq,
53 __in HRESULT hrHostInitialization,
54 __in IBootstrapperEngine* pEngine,
55 __in const BOOTSTRAPPER_CREATE_ARGS* pArgs,
56 __inout BOOTSTRAPPER_CREATE_RESULTS* pResults,
57 __out IBootstrapperApplication** ppApplication
58 );
diff --git a/src/ext/Bal/wixstdba/resource.h b/src/ext/Bal/wixstdba/resource.h
new file mode 100644
index 00000000..149a8ff4
--- /dev/null
+++ b/src/ext/Bal/wixstdba/resource.h
@@ -0,0 +1,15 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3#define IDC_STATIC -1
4
5
6// Next default values for new objects
7//
8#ifdef APSTUDIO_INVOKED
9#ifndef APSTUDIO_READONLY_SYMBOLS
10#define _APS_NEXT_RESOURCE_VALUE 102
11#define _APS_NEXT_COMMAND_VALUE 40001
12#define _APS_NEXT_CONTROL_VALUE 1003
13#define _APS_NEXT_SYMED_VALUE 101
14#endif
15#endif
diff --git a/src/ext/Bal/wixstdba/wixstdba.cpp b/src/ext/Bal/wixstdba/wixstdba.cpp
new file mode 100644
index 00000000..a96f1738
--- /dev/null
+++ b/src/ext/Bal/wixstdba/wixstdba.cpp
@@ -0,0 +1,144 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3#include "precomp.h"
4
5static HINSTANCE vhInstance = NULL;
6static IBootstrapperApplication* vpApplication = NULL;
7
8static void CALLBACK WixstdbaTraceError(
9 __in_z LPCSTR szFile,
10 __in int iLine,
11 __in REPORT_LEVEL rl,
12 __in UINT source,
13 __in HRESULT hrError,
14 __in_z __format_string LPCSTR szFormat,
15 __in va_list args
16 );
17
18extern "C" BOOL WINAPI DllMain(
19 IN HINSTANCE hInstance,
20 IN DWORD dwReason,
21 IN LPVOID /* pvReserved */
22 )
23{
24 switch(dwReason)
25 {
26 case DLL_PROCESS_ATTACH:
27 ::DisableThreadLibraryCalls(hInstance);
28 vhInstance = hInstance;
29 break;
30
31 case DLL_PROCESS_DETACH:
32 vhInstance = NULL;
33 break;
34 }
35
36 return TRUE;
37}
38
39
40extern "C" HRESULT WINAPI BootstrapperApplicationCreate(
41 __in const BOOTSTRAPPER_CREATE_ARGS* pArgs,
42 __inout BOOTSTRAPPER_CREATE_RESULTS* pResults
43 )
44{
45 HRESULT hr = S_OK;
46 IBootstrapperEngine* pEngine = NULL;
47
48 DutilInitialize(&WixstdbaTraceError);
49
50 hr = BalInitializeFromCreateArgs(pArgs, &pEngine);
51 ExitOnFailure(hr, "Failed to initialize Bal.");
52
53 hr = CreateBootstrapperApplication(vhInstance, FALSE, S_OK, pEngine, pArgs, pResults, &vpApplication);
54 BalExitOnFailure(hr, "Failed to create bootstrapper application interface.");
55
56LExit:
57 ReleaseObject(pEngine);
58
59 return hr;
60}
61
62
63extern "C" void WINAPI BootstrapperApplicationDestroy()
64{
65 ReleaseNullObject(vpApplication);
66 BalUninitialize();
67 DutilUninitialize();
68}
69
70
71extern "C" HRESULT WINAPI DncPrereqBootstrapperApplicationCreate(
72 __in HRESULT hrHostInitialization,
73 __in IBootstrapperEngine* pEngine,
74 __in const BOOTSTRAPPER_CREATE_ARGS* pArgs,
75 __inout BOOTSTRAPPER_CREATE_RESULTS* pResults
76 )
77{
78 HRESULT hr = S_OK;
79
80 DutilInitialize(&WixstdbaTraceError);
81
82 BalInitialize(pEngine);
83
84 hr = CreateBootstrapperApplication(vhInstance, TRUE, hrHostInitialization, pEngine, pArgs, pResults, &vpApplication);
85 BalExitOnFailure(hr, "Failed to create .NET Core prerequisite bootstrapper application interface.");
86
87LExit:
88 return hr;
89}
90
91
92extern "C" void WINAPI DncPrereqBootstrapperApplicationDestroy()
93{
94 ReleaseNullObject(vpApplication);
95 BalUninitialize();
96 DutilUninitialize();
97}
98
99
100extern "C" HRESULT WINAPI MbaPrereqBootstrapperApplicationCreate(
101 __in HRESULT hrHostInitialization,
102 __in IBootstrapperEngine* pEngine,
103 __in const BOOTSTRAPPER_CREATE_ARGS* pArgs,
104 __inout BOOTSTRAPPER_CREATE_RESULTS* pResults
105 )
106{
107 HRESULT hr = S_OK;
108
109 DutilInitialize(&WixstdbaTraceError);
110
111 BalInitialize(pEngine);
112
113 hr = CreateBootstrapperApplication(vhInstance, TRUE, hrHostInitialization, pEngine, pArgs, pResults, &vpApplication);
114 BalExitOnFailure(hr, "Failed to create managed prerequisite bootstrapper application interface.");
115
116LExit:
117 return hr;
118}
119
120
121extern "C" void WINAPI MbaPrereqBootstrapperApplicationDestroy()
122{
123 ReleaseNullObject(vpApplication);
124 BalUninitialize();
125 DutilUninitialize();
126}
127
128static void CALLBACK WixstdbaTraceError(
129 __in_z LPCSTR /*szFile*/,
130 __in int /*iLine*/,
131 __in REPORT_LEVEL /*rl*/,
132 __in UINT source,
133 __in HRESULT hrError,
134 __in_z __format_string LPCSTR szFormat,
135 __in va_list args
136 )
137{
138 // BalLogError currently uses the Exit... macros,
139 // so if expanding the scope need to ensure this doesn't get called recursively.
140 if (DUTIL_SOURCE_THMUTIL == source)
141 {
142 BalLogErrorArgs(hrError, szFormat, args);
143 }
144}
diff --git a/src/ext/Bal/wixstdba/wixstdba.def b/src/ext/Bal/wixstdba/wixstdba.def
new file mode 100644
index 00000000..ba9980d3
--- /dev/null
+++ b/src/ext/Bal/wixstdba/wixstdba.def
@@ -0,0 +1,10 @@
1; Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3
4EXPORTS
5 BootstrapperApplicationCreate
6 BootstrapperApplicationDestroy
7 DncPrereqBootstrapperApplicationCreate
8 DncPrereqBootstrapperApplicationDestroy
9 MbaPrereqBootstrapperApplicationCreate
10 MbaPrereqBootstrapperApplicationDestroy
diff --git a/src/ext/Bal/wixstdba/wixstdba.mc b/src/ext/Bal/wixstdba/wixstdba.mc
new file mode 100644
index 00000000..688b1da1
--- /dev/null
+++ b/src/ext/Bal/wixstdba/wixstdba.mc
@@ -0,0 +1,73 @@
1; // Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3
4MessageIdTypedef=DWORD
5
6LanguageNames=(English=0x409:MSG00409)
7
8
9; // message definitions
10
11; // MessageId=#
12; // Severity=Success
13; // SymbolicName=MSG_SUCCESS
14; // Language=English
15; // Success %1.
16; // .
17;
18; // MessageId=#
19; // Severity=Warning
20; // SymbolicName=MSG_WARNING
21; // Language=English
22; // Warning %1.
23; // .
24;
25; // MessageId=#
26; // Severity=Error
27; // SymbolicName=MSG_ERROR
28; // Language=English
29; // Error %1.
30; // .
31
32MessageId=1
33Severity=Success
34SymbolicName=MSG_WIXSTDBA_PLANNED_FORWARD_COMPATIBLE_BUNDLE
35Language=English
36WIXSTDBA: Planned forward compatible bundle: %1!ls!, wixstdba requested: %2!hs!, bafunctions requested: %3!hs!
37.
38
39MessageId=2
40Severity=Success
41SymbolicName=MSG_WIXSTDBA_PLANNED_PACKAGE
42Language=English
43WIXSTDBA: Planned package: %1!ls!, wixstdba requested: %2!hs!, bafunctions requested: %3!hs!
44.
45
46MessageId=3
47Severity=Success
48SymbolicName=MSG_WIXSTDBA_PLANNED_RELATED_BUNDLE
49Language=English
50WIXSTDBA: Planned related bundle: %1!ls!, wixstdba requested: %2!hs!, bafunctions requested: %3!hs!
51.
52
53MessageId=5
54Severity=Success
55SymbolicName=MSG_WIXSTDBA_PLANNED_TARGET_MSI_PACKAGE
56Language=English
57WIXSTDBA: Planned target MSI package: %1!ls!, productCode: %2!ls!, wixstdba requested: %3!hs!, bafunctions requested: %4!hs!
58.
59
60MessageId=6
61Severity=Success
62SymbolicName=MSG_WIXSTDBA_PLANNED_MSI_FEATURE
63Language=English
64WIXSTDBA: Planned MSI feature: %2!ls! for %1!ls!, wixstdba requested: %3!hs!, bafunctions requested: %4!hs!
65.
66
67MessageId=7
68Severity=Success
69SymbolicName=MSG_WIXSTDBA_PLANNED_MSI_PACKAGE
70Language=English
71WIXSTDBA: Planned MSI package: %1!ls!, wixstdba requested: actionMsiProperty=%2!d!;uiLevel=%3!d!;disableExternalUiHandler=%4!hs!, bafunctions requested: actionMsiProperty=%5!d!;uiLevel=%6!d!;disableExternalUiHandler=%7!hs!
72.
73
diff --git a/src/ext/Bal/wixstdba/wixstdba.vcxproj b/src/ext/Bal/wixstdba/wixstdba.vcxproj
new file mode 100644
index 00000000..06b1c8d8
--- /dev/null
+++ b/src/ext/Bal/wixstdba/wixstdba.vcxproj
@@ -0,0 +1,101 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3
4<Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
5 <Import Project="..\..\packages\Microsoft.SourceLink.GitHub.1.0.0\build\Microsoft.SourceLink.GitHub.props" Condition="Exists('..\..\packages\Microsoft.SourceLink.GitHub.1.0.0\build\Microsoft.SourceLink.GitHub.props')" />
6 <Import Project="..\..\packages\Microsoft.SourceLink.Common.1.0.0\build\Microsoft.SourceLink.Common.props" Condition="Exists('..\..\packages\Microsoft.SourceLink.Common.1.0.0\build\Microsoft.SourceLink.Common.props')" />
7 <Import Project="..\..\packages\Microsoft.Build.Tasks.Git.1.0.0\build\Microsoft.Build.Tasks.Git.props" Condition="Exists('..\..\packages\Microsoft.Build.Tasks.Git.1.0.0\build\Microsoft.Build.Tasks.Git.props')" />
8 <Import Project="..\..\packages\WixToolset.BalUtil.4.0.58\build\WixToolset.BalUtil.props" Condition="Exists('..\..\packages\WixToolset.BalUtil.4.0.58\build\WixToolset.BalUtil.props')" />
9 <Import Project="..\..\packages\WixToolset.BootstrapperCore.Native.4.0.141\build\WixToolset.BootstrapperCore.Native.props" Condition="Exists('..\..\packages\WixToolset.BootstrapperCore.Native.4.0.141\build\WixToolset.BootstrapperCore.Native.props')" />
10 <Import Project="..\..\packages\WixToolset.DUtil.4.0.72\build\WixToolset.DUtil.props" Condition="Exists('..\..\packages\WixToolset.DUtil.4.0.72\build\WixToolset.DUtil.props')" />
11
12 <ItemGroup Label="ProjectConfigurations">
13 <ProjectConfiguration Include="Debug|ARM64">
14 <Configuration>Debug</Configuration>
15 <Platform>ARM64</Platform>
16 </ProjectConfiguration>
17 <ProjectConfiguration Include="Release|ARM64">
18 <Configuration>Release</Configuration>
19 <Platform>ARM64</Platform>
20 </ProjectConfiguration>
21 <ProjectConfiguration Include="Debug|Win32">
22 <Configuration>Debug</Configuration>
23 <Platform>Win32</Platform>
24 </ProjectConfiguration>
25 <ProjectConfiguration Include="Release|Win32">
26 <Configuration>Release</Configuration>
27 <Platform>Win32</Platform>
28 </ProjectConfiguration>
29 <ProjectConfiguration Include="Debug|x64">
30 <Configuration>Debug</Configuration>
31 <Platform>x64</Platform>
32 </ProjectConfiguration>
33 <ProjectConfiguration Include="Release|x64">
34 <Configuration>Release</Configuration>
35 <Platform>x64</Platform>
36 </ProjectConfiguration>
37 </ItemGroup>
38
39 <PropertyGroup Label="Globals">
40 <ProjectGuid>{41085A22-E6AA-4E8B-AB1B-DDEE0DC89DFA}</ProjectGuid>
41 <ConfigurationType>DynamicLibrary</ConfigurationType>
42 <PlatformToolset>v142</PlatformToolset>
43 <CharacterSet>Unicode</CharacterSet>
44 <TargetName>WixStdBA</TargetName>
45 <ProjectModuleDefinitionFile>wixstdba.def</ProjectModuleDefinitionFile>
46 </PropertyGroup>
47
48 <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
49 <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
50
51 <PropertyGroup>
52 <ProjectAdditionalLinkLibraries>comctl32.lib;gdiplus.lib;msimg32.lib;shlwapi.lib;wininet.lib;wixstdba.res</ProjectAdditionalLinkLibraries>
53 </PropertyGroup>
54
55 <ItemGroup>
56 <ClCompile Include="precomp.cpp">
57 <PrecompiledHeader>Create</PrecompiledHeader>
58 </ClCompile>
59 <ClCompile Include="WixStandardBootstrapperApplication.cpp" />
60 <ClCompile Include="wixstdba.cpp" />
61 </ItemGroup>
62 <ItemGroup>
63 <ClInclude Include="precomp.h" />
64 <ClInclude Include="resource.h" />
65 </ItemGroup>
66 <ItemGroup>
67 <None Include="wixstdba.def" />
68 </ItemGroup>
69 <ItemGroup>
70 <None Include="packages.config" />
71 </ItemGroup>
72 <ItemGroup>
73 <CustomBuild Include="wixstdba.mc">
74 <Message>Compiling message file...</Message>
75 <Command>mc.exe -h "$(IntDir)." -r "$(IntDir)." -A -c -z wixstdba.messages "$(InputDir)wixstdba.mc"
76rc.exe -fo "$(OutDir)wixstdba.res" "$(IntDir)wixstdba.messages.rc"</Command>
77 <Outputs>$(IntDir)wixstdba.messages.h;$(IntDir)wixstdba.messages.rc</Outputs>
78 </CustomBuild>
79 </ItemGroup>
80
81 <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
82 <Import Project="..\..\packages\Microsoft.Build.Tasks.Git.1.0.0\build\Microsoft.Build.Tasks.Git.targets" Condition="Exists('..\..\packages\Microsoft.Build.Tasks.Git.1.0.0\build\Microsoft.Build.Tasks.Git.targets')" />
83 <Import Project="..\..\packages\Microsoft.SourceLink.Common.1.0.0\build\Microsoft.SourceLink.Common.targets" Condition="Exists('..\..\packages\Microsoft.SourceLink.Common.1.0.0\build\Microsoft.SourceLink.Common.targets')" />
84 <Import Project="..\..\packages\Microsoft.SourceLink.GitHub.1.0.0\build\Microsoft.SourceLink.GitHub.targets" Condition="Exists('..\..\packages\Microsoft.SourceLink.GitHub.1.0.0\build\Microsoft.SourceLink.GitHub.targets')" />
85 <Import Project="..\..\packages\Nerdbank.GitVersioning.3.3.37\build\Nerdbank.GitVersioning.targets" Condition="Exists('..\..\packages\Nerdbank.GitVersioning.3.3.37\build\Nerdbank.GitVersioning.targets')" />
86 <Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
87 <PropertyGroup>
88 <ErrorText>This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
89 </PropertyGroup>
90 <Error Condition="!Exists('..\..\packages\Microsoft.Build.Tasks.Git.1.0.0\build\Microsoft.Build.Tasks.Git.props')" Text="$([System.String]::Format('$(ErrorText)', '..\..\packages\Microsoft.Build.Tasks.Git.1.0.0\build\Microsoft.Build.Tasks.Git.props'))" />
91 <Error Condition="!Exists('..\..\packages\Microsoft.Build.Tasks.Git.1.0.0\build\Microsoft.Build.Tasks.Git.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\..\packages\Microsoft.Build.Tasks.Git.1.0.0\build\Microsoft.Build.Tasks.Git.targets'))" />
92 <Error Condition="!Exists('..\..\packages\Microsoft.SourceLink.Common.1.0.0\build\Microsoft.SourceLink.Common.props')" Text="$([System.String]::Format('$(ErrorText)', '..\..\packages\Microsoft.SourceLink.Common.1.0.0\build\Microsoft.SourceLink.Common.props'))" />
93 <Error Condition="!Exists('..\..\packages\Microsoft.SourceLink.Common.1.0.0\build\Microsoft.SourceLink.Common.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\..\packages\Microsoft.SourceLink.Common.1.0.0\build\Microsoft.SourceLink.Common.targets'))" />
94 <Error Condition="!Exists('..\..\packages\Microsoft.SourceLink.GitHub.1.0.0\build\Microsoft.SourceLink.GitHub.props')" Text="$([System.String]::Format('$(ErrorText)', '..\..\packages\Microsoft.SourceLink.GitHub.1.0.0\build\Microsoft.SourceLink.GitHub.props'))" />
95 <Error Condition="!Exists('..\..\packages\Microsoft.SourceLink.GitHub.1.0.0\build\Microsoft.SourceLink.GitHub.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\..\packages\Microsoft.SourceLink.GitHub.1.0.0\build\Microsoft.SourceLink.GitHub.targets'))" />
96 <Error Condition="!Exists('..\..\packages\Nerdbank.GitVersioning.3.3.37\build\Nerdbank.GitVersioning.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\..\packages\Nerdbank.GitVersioning.3.3.37\build\Nerdbank.GitVersioning.targets'))" />
97 <Error Condition="!Exists('..\..\packages\WixToolset.BalUtil.4.0.58\build\WixToolset.BalUtil.props')" Text="$([System.String]::Format('$(ErrorText)', '..\..\packages\WixToolset.BalUtil.4.0.58\build\WixToolset.BalUtil.props'))" />
98 <Error Condition="!Exists('..\..\packages\WixToolset.BootstrapperCore.Native.4.0.141\build\WixToolset.BootstrapperCore.Native.props')" Text="$([System.String]::Format('$(ErrorText)', '..\..\packages\WixToolset.BootstrapperCore.Native.4.0.141\build\WixToolset.BootstrapperCore.Native.props'))" />
99 <Error Condition="!Exists('..\..\packages\WixToolset.DUtil.4.0.72\build\WixToolset.DUtil.props')" Text="$([System.String]::Format('$(ErrorText)', '..\..\packages\WixToolset.DUtil.4.0.72\build\WixToolset.DUtil.props'))" />
100 </Target>
101</Project> \ No newline at end of file
diff --git a/src/ext/ComPlus/CSharp.Build.props b/src/ext/ComPlus/CSharp.Build.props
new file mode 100644
index 00000000..b12f4c6e
--- /dev/null
+++ b/src/ext/ComPlus/CSharp.Build.props
@@ -0,0 +1,11 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2<!--
3 Do NOT modify this file. Update the canonical version in Home\repo-template\src\CSharp.Build.props
4 then update all of the repos.
5-->
6<Project>
7 <PropertyGroup>
8 <SignAssembly>true</SignAssembly>
9 <AssemblyOriginatorKeyFile>$([System.IO.Path]::GetFullPath($(MSBuildThisFileDirectory)wix.snk))</AssemblyOriginatorKeyFile>
10 </PropertyGroup>
11</Project>
diff --git a/src/ext/ComPlus/ComPlus.wixext.sln b/src/ext/ComPlus/ComPlus.wixext.sln
new file mode 100644
index 00000000..9fab25f2
--- /dev/null
+++ b/src/ext/ComPlus/ComPlus.wixext.sln
@@ -0,0 +1,64 @@
1
2Microsoft Visual Studio Solution File, Format Version 12.00
3# Visual Studio Version 16
4VisualStudioVersion = 16.0.30611.23
5MinimumVisualStudioVersion = 10.0.40219.1
6Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "complusca", "src\ca\complusca.vcxproj", "{BDEF51ED-E242-4FA2-801A-01B127DF851A}"
7EndProject
8Project("{930C7802-8A8C-48F9-8165-68863BCCD9DD}") = "complus", "src\wixlib\complus.wixproj", "{E191E61E-E098-4F71-888F-51A79F952022}"
9 ProjectSection(ProjectDependencies) = postProject
10 {BDEF51ED-E242-4FA2-801A-01B127DF851A} = {BDEF51ED-E242-4FA2-801A-01B127DF851A}
11 EndProjectSection
12EndProject
13Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WixToolset.ComPlus.wixext", "src\wixext\WixToolset.ComPlus.wixext.csproj", "{1497B777-330B-4CFE-927A-22850CD24D64}"
14EndProject
15Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WixToolsetTest.ComPlus", "src\test\WixToolsetTest.ComPlus\WixToolsetTest.ComPlus.csproj", "{2FC5F039-EACF-428B-BA87-8CDE1D25E121}"
16EndProject
17Global
18 GlobalSection(SolutionConfigurationPlatforms) = preSolution
19 Debug|Any CPU = Debug|Any CPU
20 Debug|x86 = Debug|x86
21 Release|Any CPU = Release|Any CPU
22 Release|x86 = Release|x86
23 EndGlobalSection
24 GlobalSection(ProjectConfigurationPlatforms) = postSolution
25 {BDEF51ED-E242-4FA2-801A-01B127DF851A}.Debug|Any CPU.ActiveCfg = Debug|Win32
26 {BDEF51ED-E242-4FA2-801A-01B127DF851A}.Debug|Any CPU.Build.0 = Debug|Win32
27 {BDEF51ED-E242-4FA2-801A-01B127DF851A}.Debug|x86.ActiveCfg = Debug|Win32
28 {BDEF51ED-E242-4FA2-801A-01B127DF851A}.Debug|x86.Build.0 = Debug|Win32
29 {BDEF51ED-E242-4FA2-801A-01B127DF851A}.Release|Any CPU.ActiveCfg = Release|Win32
30 {BDEF51ED-E242-4FA2-801A-01B127DF851A}.Release|Any CPU.Build.0 = Release|Win32
31 {BDEF51ED-E242-4FA2-801A-01B127DF851A}.Release|x86.ActiveCfg = Release|Win32
32 {BDEF51ED-E242-4FA2-801A-01B127DF851A}.Release|x86.Build.0 = Release|Win32
33 {E191E61E-E098-4F71-888F-51A79F952022}.Debug|Any CPU.ActiveCfg = Debug|x86
34 {E191E61E-E098-4F71-888F-51A79F952022}.Debug|Any CPU.Build.0 = Debug|x86
35 {E191E61E-E098-4F71-888F-51A79F952022}.Debug|x86.ActiveCfg = Debug|x86
36 {E191E61E-E098-4F71-888F-51A79F952022}.Debug|x86.Build.0 = Debug|x86
37 {E191E61E-E098-4F71-888F-51A79F952022}.Release|Any CPU.ActiveCfg = Release|x86
38 {E191E61E-E098-4F71-888F-51A79F952022}.Release|Any CPU.Build.0 = Release|x86
39 {E191E61E-E098-4F71-888F-51A79F952022}.Release|x86.ActiveCfg = Release|x86
40 {E191E61E-E098-4F71-888F-51A79F952022}.Release|x86.Build.0 = Release|x86
41 {1497B777-330B-4CFE-927A-22850CD24D64}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
42 {1497B777-330B-4CFE-927A-22850CD24D64}.Debug|Any CPU.Build.0 = Debug|Any CPU
43 {1497B777-330B-4CFE-927A-22850CD24D64}.Debug|x86.ActiveCfg = Debug|Any CPU
44 {1497B777-330B-4CFE-927A-22850CD24D64}.Debug|x86.Build.0 = Debug|Any CPU
45 {1497B777-330B-4CFE-927A-22850CD24D64}.Release|Any CPU.ActiveCfg = Release|Any CPU
46 {1497B777-330B-4CFE-927A-22850CD24D64}.Release|Any CPU.Build.0 = Release|Any CPU
47 {1497B777-330B-4CFE-927A-22850CD24D64}.Release|x86.ActiveCfg = Release|Any CPU
48 {1497B777-330B-4CFE-927A-22850CD24D64}.Release|x86.Build.0 = Release|Any CPU
49 {2FC5F039-EACF-428B-BA87-8CDE1D25E121}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
50 {2FC5F039-EACF-428B-BA87-8CDE1D25E121}.Debug|Any CPU.Build.0 = Debug|Any CPU
51 {2FC5F039-EACF-428B-BA87-8CDE1D25E121}.Debug|x86.ActiveCfg = Debug|Any CPU
52 {2FC5F039-EACF-428B-BA87-8CDE1D25E121}.Debug|x86.Build.0 = Debug|Any CPU
53 {2FC5F039-EACF-428B-BA87-8CDE1D25E121}.Release|Any CPU.ActiveCfg = Release|Any CPU
54 {2FC5F039-EACF-428B-BA87-8CDE1D25E121}.Release|Any CPU.Build.0 = Release|Any CPU
55 {2FC5F039-EACF-428B-BA87-8CDE1D25E121}.Release|x86.ActiveCfg = Release|Any CPU
56 {2FC5F039-EACF-428B-BA87-8CDE1D25E121}.Release|x86.Build.0 = Release|Any CPU
57 EndGlobalSection
58 GlobalSection(SolutionProperties) = preSolution
59 HideSolutionNode = FALSE
60 EndGlobalSection
61 GlobalSection(ExtensibilityGlobals) = postSolution
62 SolutionGuid = {3E1857C4-5EE1-4C9E-9390-9954E041546D}
63 EndGlobalSection
64EndGlobal
diff --git a/src/ext/ComPlus/Cpp.Build.props b/src/ext/ComPlus/Cpp.Build.props
new file mode 100644
index 00000000..9551e76f
--- /dev/null
+++ b/src/ext/ComPlus/Cpp.Build.props
@@ -0,0 +1,88 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3
4<Project>
5 <PropertyGroup>
6 <Platform Condition=" '$(Platform)' == '' OR '$(Platform)' == 'AnyCPU' OR '$(Platform)' == 'x86' ">Win32</Platform>
7 <NormalizedPlatform Condition=" '$(Platform)'=='Win32' ">x86</NormalizedPlatform>
8 <NormalizedPlatform Condition=" '$(NormalizedPlatform)'=='' ">$(Platform)</NormalizedPlatform>
9 <IntDir>$(BaseIntermediateOutputPath)$(Configuration)\$(NormalizedPlatform)\</IntDir>
10 <OutDir>$(OutputPath)$(NormalizedPlatform)\</OutDir>
11 </PropertyGroup>
12
13 <PropertyGroup Condition="'$(WindowsTargetPlatformVersion)'=='' AND '$(VisualStudioVersion)'>='15.0'">
14 <WindowsTargetPlatformVersion>$([Microsoft.Build.Utilities.ToolLocationHelper]::GetLatestSDKTargetPlatformVersion('Windows', '10.0'))</WindowsTargetPlatformVersion>
15 </PropertyGroup>
16
17 <ItemDefinitionGroup>
18 <ClCompile>
19 <DisableSpecificWarnings>$(DisableSpecificCompilerWarnings)</DisableSpecificWarnings>
20 <WarningLevel>Level4</WarningLevel>
21 <AdditionalIncludeDirectories>$(ProjectDir)inc;$(MSBuildProjectDirectory);$(IntDir);$(SqlCESdkIncludePath);$(ProjectAdditionalIncludeDirectories);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
22 <PreprocessorDefinitions>WIN32;_WINDOWS;_WIN32_MSI=500;_WIN32_WINNT=0x0501;$(ArmPreprocessorDefinitions);$(UnicodePreprocessorDefinitions);_CRT_STDIO_LEGACY_WIDE_SPECIFIERS;_WINSOCK_DEPRECATED_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
23 <PrecompiledHeader>Use</PrecompiledHeader>
24 <PrecompiledHeaderFile>precomp.h</PrecompiledHeaderFile>
25 <CallingConvention Condition="'$(Platform)'=='Win32'">StdCall</CallingConvention>
26 <TreatWarningAsError>true</TreatWarningAsError>
27 <ExceptionHandling>false</ExceptionHandling>
28 <AdditionalOptions>-YlprecompDefine</AdditionalOptions>
29 <AdditionalOptions Condition=" $(PlatformToolset.StartsWith('v14')) ">/Zc:threadSafeInit- %(AdditionalOptions)</AdditionalOptions>
30 <MultiProcessorCompilation Condition=" $(NUMBER_OF_PROCESSORS) &gt; 4 ">true</MultiProcessorCompilation>
31 </ClCompile>
32 <ResourceCompile>
33 <PreprocessorDefinitions>$(ArmPreprocessorDefinitions);%(PreprocessorDefinitions)</PreprocessorDefinitions>
34 <AdditionalIncludeDirectories>$(ProjectAdditionalResourceIncludeDirectories);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
35 </ResourceCompile>
36 <Lib>
37 <AdditionalLibraryDirectories>$(OutDir);$(AdditionalMultiTargetLibraryPath);$(ProjectAdditionalLibraryDirectories);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
38 </Lib>
39 <Link>
40 <SubSystem>$(ProjectSubSystem)</SubSystem>
41 <ModuleDefinitionFile>$(ProjectModuleDefinitionFile)</ModuleDefinitionFile>
42 <NoEntryPoint>$(ResourceOnlyDll)</NoEntryPoint>
43 <GenerateDebugInformation>true</GenerateDebugInformation>
44 <AdditionalDependencies>$(ProjectAdditionalLinkLibraries);advapi32.lib;comdlg32.lib;user32.lib;oleaut32.lib;gdi32.lib;shell32.lib;ole32.lib;version.lib;%(AdditionalDependencies)</AdditionalDependencies>
45 <AdditionalLibraryDirectories>$(OutDir);$(AdditionalMultiTargetLibraryPath);$(ArmLibraryDirectories);$(ProjectAdditionalLinkLibraryDirectories);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
46 <AdditionalOptions Condition=" $(PlatformToolset.StartsWith('v14')) ">/IGNORE:4099 %(AdditionalOptions)</AdditionalOptions>
47 </Link>
48 </ItemDefinitionGroup>
49
50 <ItemDefinitionGroup Condition=" '$(Platform)'=='Win32' and '$(PlatformToolset)'!='v100'">
51 <ClCompile>
52 <EnableEnhancedInstructionSet>NoExtensions</EnableEnhancedInstructionSet>
53 </ClCompile>
54 </ItemDefinitionGroup>
55 <ItemDefinitionGroup Condition=" '$(Platform)'=='arm' ">
56 <ClCompile>
57 <CallingConvention>CDecl</CallingConvention>
58 </ClCompile>
59 </ItemDefinitionGroup>
60 <ItemDefinitionGroup Condition=" '$(ConfigurationType)'=='StaticLibrary' ">
61 <ClCompile>
62 <DebugInformationFormat>OldStyle</DebugInformationFormat>
63 <OmitDefaultLibName>true</OmitDefaultLibName>
64 <IgnoreAllDefaultLibraries>true</IgnoreAllDefaultLibraries>
65 </ClCompile>
66 </ItemDefinitionGroup>
67 <ItemDefinitionGroup Condition=" '$(Configuration)'=='Debug' ">
68 <ClCompile>
69 <Optimization>Disabled</Optimization>
70 <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
71 <PreprocessorDefinitions>_DEBUG;DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
72 <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
73 </ClCompile>
74 </ItemDefinitionGroup>
75 <ItemDefinitionGroup Condition=" '$(Configuration)'=='Release' ">
76 <ClCompile>
77 <Optimization>MinSpace</Optimization>
78 <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
79 <FunctionLevelLinking>true</FunctionLevelLinking>
80 <IntrinsicFunctions>true</IntrinsicFunctions>
81 <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
82 </ClCompile>
83 <Link>
84 <EnableCOMDATFolding>true</EnableCOMDATFolding>
85 <OptimizeReferences>true</OptimizeReferences>
86 </Link>
87 </ItemDefinitionGroup>
88</Project>
diff --git a/src/ext/ComPlus/Directory.Build.props b/src/ext/ComPlus/Directory.Build.props
new file mode 100644
index 00000000..b3c6287c
--- /dev/null
+++ b/src/ext/ComPlus/Directory.Build.props
@@ -0,0 +1,27 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3<!--
4 Do NOT modify this file. Update the canonical version in Home\repo-template\src\Directory.Build.props
5 then update all of the repos.
6-->
7<Project>
8 <PropertyGroup>
9 <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
10 <EnableSourceLink Condition=" '$(NCrunch)' == '1' ">false</EnableSourceLink>
11 <MSBuildWarningsAsMessages>MSB3246</MSBuildWarningsAsMessages>
12
13 <ProjectName Condition=" '$(ProjectName)' == '' ">$(MSBuildProjectName)</ProjectName>
14 <BaseOutputPath>$([System.IO.Path]::GetFullPath($(MSBuildThisFileDirectory)..\build\))</BaseOutputPath>
15 <BaseIntermediateOutputPath>$(BaseOutputPath)obj\$(ProjectName)\</BaseIntermediateOutputPath>
16 <OutputPath>$(BaseOutputPath)$(Configuration)\</OutputPath>
17
18 <Authors>WiX Toolset Team</Authors>
19 <Company>WiX Toolset</Company>
20 <Copyright>Copyright (c) .NET Foundation and contributors. All rights reserved.</Copyright>
21 <PackageLicenseExpression>MS-RL</PackageLicenseExpression>
22 <Product>WiX Toolset</Product>
23 </PropertyGroup>
24
25 <Import Project="Directory$(MSBuildProjectExtension).props" Condition=" Exists('Directory$(MSBuildProjectExtension).props') " />
26 <Import Project="Custom.Build.props" Condition=" Exists('Custom.Build.props') " />
27</Project>
diff --git a/src/ext/ComPlus/Directory.Build.targets b/src/ext/ComPlus/Directory.Build.targets
new file mode 100644
index 00000000..2fcc765a
--- /dev/null
+++ b/src/ext/ComPlus/Directory.Build.targets
@@ -0,0 +1,51 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3<!--
4 Do NOT modify this file. Update the canonical version in Home\repo-template\src\Directory.Build.targets
5 then update all of the repos.
6-->
7<!--
8 Replace PackageReferences with ProjectReferences when the projects can be found in .sln.
9 See the original here: https://github.com/dotnet/sdk/issues/1151#issuecomment-385133284
10-->
11<Project>
12 <PropertyGroup>
13 <ReplacePackageReferences>true</ReplacePackageReferences>
14 <TheSolutionPath Condition=" '$(NCrunch)'=='' ">$(SolutionPath)</TheSolutionPath>
15 <TheSolutionPath Condition=" '$(NCrunch)'=='1' ">$(NCrunchOriginalSolutionPath)</TheSolutionPath>
16 </PropertyGroup>
17
18 <Choose>
19 <When Condition="$(ReplacePackageReferences) AND '$(TheSolutionPath)' != '' AND '$(TheSolutionPath)' != '*undefined*' AND Exists('$(TheSolutionPath)')">
20
21 <PropertyGroup>
22 <SolutionFileContent>$([System.IO.File]::ReadAllText($(TheSolutionPath)))</SolutionFileContent>
23 <SmartSolutionDir>$([System.IO.Path]::GetDirectoryName( $(TheSolutionPath) ))</SmartSolutionDir>
24 <RegexPattern>(?&lt;="[PackageName]", ")(.*)(?=", ")</RegexPattern>
25 </PropertyGroup>
26
27 <ItemGroup>
28 <!-- Keep the identity of the PackageReference -->
29 <SmartPackageReference Include="@(PackageReference)">
30 <PackageName>%(Identity)</PackageName>
31 <InSolution>$(SolutionFileContent.Contains('\%(Identity).csproj'))</InSolution>
32 </SmartPackageReference>
33
34 <!-- Filter them by mapping them to another ItemGroup using the WithMetadataValue item function -->
35 <PackageInSolution Include="@(SmartPackageReference->WithMetadataValue('InSolution', True))">
36 <Pattern>$(RegexPattern.Replace('[PackageName]','%(PackageName)') )</Pattern>
37 <SmartPath>$([System.Text.RegularExpressions.Regex]::Match('$(SolutionFileContent)', '%(Pattern)'))</SmartPath>
38 </PackageInSolution>
39
40 <ProjectReference Include="@(PackageInSolution->'$(SmartSolutionDir)\%(SmartPath)' )"/>
41
42 <!-- Remove the package references that are now referenced as projects -->
43 <PackageReference Remove="@(PackageInSolution->'%(PackageName)')"/>
44 </ItemGroup>
45
46 </When>
47 </Choose>
48
49 <Import Project="Directory$(MSBuildProjectExtension).targets" Condition=" Exists('Directory$(MSBuildProjectExtension).targets') " />
50 <Import Project="Custom.Build.targets" Condition=" Exists('Custom.Build.targets') " />
51</Project>
diff --git a/src/ext/ComPlus/Directory.csproj.props b/src/ext/ComPlus/Directory.csproj.props
new file mode 100644
index 00000000..81d24ad1
--- /dev/null
+++ b/src/ext/ComPlus/Directory.csproj.props
@@ -0,0 +1,13 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2<!--
3 Do NOT modify this file. Update the canonical version in Home\repo-template\src\CSharp.Build.props
4 then update all of the repos.
5-->
6<Project>
7 <PropertyGroup>
8 <CheckForOverflowUnderflow>true</CheckForOverflowUnderflow>
9 <SignAssembly>true</SignAssembly>
10 <AssemblyOriginatorKeyFile>$([System.IO.Path]::GetFullPath($(MSBuildThisFileDirectory)wix.snk))</AssemblyOriginatorKeyFile>
11 <NBGV_EmitThisAssemblyClass>false</NBGV_EmitThisAssemblyClass>
12 </PropertyGroup>
13</Project>
diff --git a/src/ext/ComPlus/Directory.csproj.targets b/src/ext/ComPlus/Directory.csproj.targets
new file mode 100644
index 00000000..c3270426
--- /dev/null
+++ b/src/ext/ComPlus/Directory.csproj.targets
@@ -0,0 +1,26 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2<!--
3 Do NOT modify this file. Update the canonical version in Home\repo-template\src\Directory.csproj.targets
4 then update all of the repos.
5-->
6<Project>
7 <PropertyGroup>
8 <CreateDocumentation Condition=" '$(CreateDocumentationFile)'!='true' ">false</CreateDocumentation>
9 <DocumentationFile Condition=" '$(CreateDocumentationFile)'=='true' ">$(OutputPath)\$(AssemblyName).xml</DocumentationFile>
10 </PropertyGroup>
11
12 <Target Name="SetNuspecProperties" DependsOnTargets="InitializeSourceControlInformation" AfterTargets="GetBuildVersion"
13 Condition=" Exists('$(MSBuildProjectName).nuspec') ">
14 <PropertyGroup>
15 <ProjectUrl Condition=" '$(ProjectUrl)'=='' and '$(PrivateRepositoryUrl)'!='' ">$(PrivateRepositoryUrl.Replace('.git',''))</ProjectUrl>
16
17 <NuspecFile>$(MSBuildProjectName).nuspec</NuspecFile>
18 <NuspecBasePath Condition=" '$(NuspecBasePath)'=='' ">$(OutputPath)..\</NuspecBasePath>
19 <NuspecProperties>$(NuspecProperties);Id=$(PackageId);Authors=$(Authors);Copyright=$(Copyright);Description=$(Description);Title=$(Title)</NuspecProperties>
20 <NuspecProperties>$(NuspecProperties);Version=$(PackageVersion);RepositoryCommit=$(SourceRevisionId);RepositoryType=$(RepositoryType);RepositoryUrl=$(PrivateRepositoryUrl);ProjectFolder=$(MSBuildProjectDirectory)\;ProjectUrl=$(ProjectUrl)</NuspecProperties>
21 <PublishRepositoryUrl>true</PublishRepositoryUrl>
22 <SymbolPackageFormat>snupkg</SymbolPackageFormat>
23 </PropertyGroup>
24 </Target>
25
26</Project>
diff --git a/src/ext/ComPlus/Directory.vcxproj.props b/src/ext/ComPlus/Directory.vcxproj.props
new file mode 100644
index 00000000..664bc1d8
--- /dev/null
+++ b/src/ext/ComPlus/Directory.vcxproj.props
@@ -0,0 +1,93 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3
4<Project>
5 <PropertyGroup>
6 <Platform Condition=" '$(Platform)' == '' OR '$(Platform)' == 'AnyCPU' ">Win32</Platform>
7 <IntDir>$(BaseIntermediateOutputPath)$(Configuration)\$(Platform)\</IntDir>
8 <OutDir>$(OutputPath)$(Platform)\</OutDir>
9
10 <!-- NBGV properties -->
11 <AssemblyCompany>$(Company)</AssemblyCompany>
12 <AssemblyCopyright>$(Copyright)</AssemblyCopyright>
13
14 <RuntimeIdentifiers>win-x86;win-x64;win-arm64</RuntimeIdentifiers>
15 <NuGetTargetMoniker>native,Version=v0.0</NuGetTargetMoniker>
16 </PropertyGroup>
17
18 <PropertyGroup Condition="'$(WindowsTargetPlatformVersion)'=='' AND '$(VisualStudioVersion)'>='15.0'">
19 <WindowsTargetPlatformVersion>$([Microsoft.Build.Utilities.ToolLocationHelper]::GetLatestSDKTargetPlatformVersion('Windows', '10.0'))</WindowsTargetPlatformVersion>
20 </PropertyGroup>
21
22 <ItemDefinitionGroup>
23 <ClCompile>
24 <DisableSpecificWarnings>$(DisableSpecificCompilerWarnings)</DisableSpecificWarnings>
25 <WarningLevel>Level4</WarningLevel>
26 <AdditionalIncludeDirectories>$(ProjectDir)inc;$(MSBuildProjectDirectory);$(IntDir);$(SqlCESdkIncludePath);$(ProjectAdditionalIncludeDirectories);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
27 <PreprocessorDefinitions>WIN32;_WINDOWS;_WIN32_MSI=500;_WIN32_WINNT=0x0501;$(ArmPreprocessorDefinitions);$(UnicodePreprocessorDefinitions);_CRT_STDIO_LEGACY_WIDE_SPECIFIERS;_WINSOCK_DEPRECATED_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
28 <PrecompiledHeader>Use</PrecompiledHeader>
29 <PrecompiledHeaderFile>precomp.h</PrecompiledHeaderFile>
30 <CallingConvention Condition="'$(Platform)'=='Win32'">StdCall</CallingConvention>
31 <TreatWarningAsError>true</TreatWarningAsError>
32 <ExceptionHandling>false</ExceptionHandling>
33 <AdditionalOptions>-YlprecompDefine</AdditionalOptions>
34 <AdditionalOptions Condition=" $(PlatformToolset.StartsWith('v14')) ">/Zc:threadSafeInit- %(AdditionalOptions)</AdditionalOptions>
35 <MultiProcessorCompilation Condition=" $(NUMBER_OF_PROCESSORS) &gt; 4 ">true</MultiProcessorCompilation>
36 </ClCompile>
37 <ResourceCompile>
38 <PreprocessorDefinitions>$(ArmPreprocessorDefinitions);%(PreprocessorDefinitions)</PreprocessorDefinitions>
39 <AdditionalIncludeDirectories>$(ProjectAdditionalResourceIncludeDirectories);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
40 </ResourceCompile>
41 <Lib>
42 <AdditionalLibraryDirectories>$(OutDir);$(AdditionalMultiTargetLibraryPath);$(ProjectAdditionalLibraryDirectories);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
43 </Lib>
44 <Link>
45 <SubSystem>$(ProjectSubSystem)</SubSystem>
46 <ModuleDefinitionFile>$(ProjectModuleDefinitionFile)</ModuleDefinitionFile>
47 <NoEntryPoint>$(ResourceOnlyDll)</NoEntryPoint>
48 <GenerateDebugInformation>true</GenerateDebugInformation>
49 <AdditionalDependencies>$(ProjectAdditionalLinkLibraries);advapi32.lib;comdlg32.lib;user32.lib;oleaut32.lib;gdi32.lib;shell32.lib;ole32.lib;version.lib;%(AdditionalDependencies)</AdditionalDependencies>
50 <AdditionalLibraryDirectories>$(OutDir);$(AdditionalMultiTargetLibraryPath);$(ArmLibraryDirectories);$(ProjectAdditionalLinkLibraryDirectories);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
51 <AdditionalOptions Condition=" $(PlatformToolset.StartsWith('v14')) ">/IGNORE:4099 %(AdditionalOptions)</AdditionalOptions>
52 </Link>
53 </ItemDefinitionGroup>
54
55 <ItemDefinitionGroup Condition=" '$(Platform)'=='Win32' and '$(PlatformToolset)'!='v100'">
56 <ClCompile>
57 <EnableEnhancedInstructionSet>NoExtensions</EnableEnhancedInstructionSet>
58 </ClCompile>
59 </ItemDefinitionGroup>
60 <ItemDefinitionGroup Condition=" '$(Platform)'=='arm' ">
61 <ClCompile>
62 <CallingConvention>CDecl</CallingConvention>
63 </ClCompile>
64 </ItemDefinitionGroup>
65 <ItemDefinitionGroup Condition=" '$(ConfigurationType)'=='StaticLibrary' ">
66 <ClCompile>
67 <DebugInformationFormat>OldStyle</DebugInformationFormat>
68 <OmitDefaultLibName>true</OmitDefaultLibName>
69 <IgnoreAllDefaultLibraries>true</IgnoreAllDefaultLibraries>
70 </ClCompile>
71 </ItemDefinitionGroup>
72 <ItemDefinitionGroup Condition=" '$(Configuration)'=='Debug' ">
73 <ClCompile>
74 <Optimization>Disabled</Optimization>
75 <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
76 <PreprocessorDefinitions>_DEBUG;DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
77 <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
78 </ClCompile>
79 </ItemDefinitionGroup>
80 <ItemDefinitionGroup Condition=" '$(Configuration)'=='Release' ">
81 <ClCompile>
82 <Optimization>MinSpace</Optimization>
83 <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
84 <FunctionLevelLinking>true</FunctionLevelLinking>
85 <IntrinsicFunctions>true</IntrinsicFunctions>
86 <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
87 </ClCompile>
88 <Link>
89 <EnableCOMDATFolding>true</EnableCOMDATFolding>
90 <OptimizeReferences>true</OptimizeReferences>
91 </Link>
92 </ItemDefinitionGroup>
93</Project>
diff --git a/src/ext/ComPlus/README.md b/src/ext/ComPlus/README.md
new file mode 100644
index 00000000..8604c104
--- /dev/null
+++ b/src/ext/ComPlus/README.md
@@ -0,0 +1,2 @@
1# ComPlus.wixext
2WixToolset.ComPlus.wixext - COM+ WiX Toolset Extension
diff --git a/src/ext/ComPlus/Wix.Build.props b/src/ext/ComPlus/Wix.Build.props
new file mode 100644
index 00000000..a81c9615
--- /dev/null
+++ b/src/ext/ComPlus/Wix.Build.props
@@ -0,0 +1,31 @@
1<?xml version="1.0" encoding="utf-8" ?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3
4<Project>
5 <PropertyGroup>
6 <DefineConstants>$(DefineConstants);CompanyName=$(Company)</DefineConstants>
7 <OutputPath_x86>$(OutputPath)x86\</OutputPath_x86>
8 <OutputPath_x64>$(OutputPath)x64\</OutputPath_x64>
9 <OutputPath_arm>$(OutputPath)ARM\</OutputPath_arm>
10 <OutputPath_arm64>$(OutputPath)ARM64\</OutputPath_arm64>
11 <OutputPath_win32>$(OutputPath)Win32\</OutputPath_win32>
12 </PropertyGroup>
13
14 <ItemGroup>
15 <BindInputPaths Include="$(OutputPath_x86)">
16 <BindName>x86</BindName>
17 </BindInputPaths>
18 <BindInputPaths Include="$(OutputPath_x64)">
19 <BindName>x64</BindName>
20 </BindInputPaths>
21 <BindInputPaths Include="$(OutputPath_arm)">
22 <BindName>arm</BindName>
23 </BindInputPaths>
24 <BindInputPaths Include="$(OutputPath_arm64)">
25 <BindName>arm64</BindName>
26 </BindInputPaths>
27 <BindInputPaths Include="$(OutputPath_win32)">
28 <BindName>win32</BindName>
29 </BindInputPaths>
30 </ItemGroup>
31</Project>
diff --git a/src/ext/ComPlus/appveyor.cmd b/src/ext/ComPlus/appveyor.cmd
new file mode 100644
index 00000000..17900d31
--- /dev/null
+++ b/src/ext/ComPlus/appveyor.cmd
@@ -0,0 +1,22 @@
1@setlocal
2@pushd %~dp0
3@set _C=Release
4@if /i "%1"=="debug" set _C=Debug
5
6:: Restore
7msbuild -p:Configuration=%_C% -t:Restore || exit /b
8
9::msbuild -p:Configuration=%_C% -p:Platform=Win32 src\ca\complusca.vcxproj || exit /b
10::msbuild -p:Configuration=%_C% -p:Platform=x64 src\ca\complusca.vcxproj || exit /b
11
12:: Build
13msbuild -p:Configuration=%_C% src\test\WixToolsetTest.ComPlus\WixToolsetTest.ComPlus.csproj || exit /b
14
15:: Test
16dotnet test -c %_C% --no-build src\test\WixToolsetTest.ComPlus || exit /b
17
18:: Pack
19msbuild -p:Configuration=%_C% -p:NoBuild=true -t:Pack src\wixext\WixToolset.ComPlus.wixext.csproj || exit /b
20
21@popd
22@endlocal \ No newline at end of file
diff --git a/src/ext/ComPlus/appveyor.yml b/src/ext/ComPlus/appveyor.yml
new file mode 100644
index 00000000..c53cc9cc
--- /dev/null
+++ b/src/ext/ComPlus/appveyor.yml
@@ -0,0 +1,42 @@
1# Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2#
3# Do NOT modify this file. Update the canonical version in Home\repo-template\src\appveyor.yml
4# then update all of the repos.
5
6branches:
7 only:
8 - master
9 - develop
10
11image: Visual Studio 2019
12
13version: 0.0.0.{build}
14configuration: Release
15
16environment:
17 DOTNET_SKIP_FIRST_TIME_EXPERIENCE: true
18 DOTNET_CLI_TELEMETRY_OPTOUT: 1
19 NUGET_XMLDOC_MODE: skip
20
21build_script:
22 - appveyor.cmd
23
24pull_requests:
25 do_not_increment_build_number: true
26
27nuget:
28 disable_publish_on_pr: true
29
30skip_branch_with_pr: true
31skip_tags: true
32
33artifacts:
34- path: build\Release\**\*.nupkg
35 name: nuget
36- path: build\Release\**\*.snupkg
37 name: snupkg
38
39notifications:
40- provider: Slack
41 incoming_webhook:
42 secure: p5xuu+4x2JHfwGDMDe5KcG1k7gZxqYc4jWVwvyNZv5cvkubPD2waJs5yXMAXZNN7Z63/3PWHb7q4KoY/99AjauYa1nZ4c5qYqRPFRBKTHfA=
diff --git a/src/ext/ComPlus/ca/complusca.def b/src/ext/ComPlus/ca/complusca.def
new file mode 100644
index 00000000..7c475759
--- /dev/null
+++ b/src/ext/ComPlus/ca/complusca.def
@@ -0,0 +1,15 @@
1; Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3
4LIBRARY "complusca"
5
6EXPORTS
7 ComPlusPrepare
8 ComPlusCleanup
9 ComPlusInstallExecute
10 ComPlusInstallExecuteCommit
11 ComPlusRollbackInstallExecute
12 ComPlusUninstallExecute
13 ComPlusRollbackUninstallExecute
14 ConfigureComPlusInstall
15 ConfigureComPlusUninstall
diff --git a/src/ext/ComPlus/ca/complusca.vcxproj b/src/ext/ComPlus/ca/complusca.vcxproj
new file mode 100644
index 00000000..3a7f6e64
--- /dev/null
+++ b/src/ext/ComPlus/ca/complusca.vcxproj
@@ -0,0 +1,95 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3
4<Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
5 <ItemGroup Label="ProjectConfigurations">
6 <ProjectConfiguration Include="Debug|Win32">
7 <Configuration>Debug</Configuration>
8 <Platform>Win32</Platform>
9 </ProjectConfiguration>
10 <ProjectConfiguration Include="Release|Win32">
11 <Configuration>Release</Configuration>
12 <Platform>Win32</Platform>
13 </ProjectConfiguration>
14 <ProjectConfiguration Include="Debug|x64">
15 <Configuration>Debug</Configuration>
16 <Platform>x64</Platform>
17 </ProjectConfiguration>
18 <ProjectConfiguration Include="Release|x64">
19 <Configuration>Release</Configuration>
20 <Platform>x64</Platform>
21 </ProjectConfiguration>
22 </ItemGroup>
23
24 <PropertyGroup Label="Globals">
25 <ProjectGuid>{BDEF51ED-E242-4FA2-801A-01B127DF851A}</ProjectGuid>
26 <ConfigurationType>DynamicLibrary</ConfigurationType>
27 <PlatformToolset>v142</PlatformToolset>
28 <CharacterSet>Unicode</CharacterSet>
29 <TargetName>complusca</TargetName>
30 <ProjectModuleDefinitionFile>complusca.def</ProjectModuleDefinitionFile>
31 <Description>WiX Toolset ComPlus CustomAction</Description>
32 <WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
33 </PropertyGroup>
34
35 <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
36 <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
37
38 <PropertyGroup>
39 <ProjectAdditionalLinkLibraries>msi.lib</ProjectAdditionalLinkLibraries>
40 </PropertyGroup>
41
42 <ItemGroup>
43 <ClCompile Include="cpappexec.cpp" />
44 <ClCompile Include="cpapproleexec.cpp" />
45 <ClCompile Include="cpapprolesched.cpp" />
46 <ClCompile Include="cpappsched.cpp" />
47 <ClCompile Include="cpasmexec.cpp" />
48 <ClCompile Include="cpasmsched.cpp" />
49 <ClCompile Include="cpexec.cpp" />
50 <ClCompile Include="cppartexec.cpp" />
51 <ClCompile Include="cppartroleexec.cpp" />
52 <ClCompile Include="cppartrolesched.cpp" />
53 <ClCompile Include="cppartsched.cpp" />
54 <ClCompile Include="cpsched.cpp" />
55 <ClCompile Include="cpsubsexec.cpp" />
56 <ClCompile Include="cpsubssched.cpp" />
57 <ClCompile Include="cputilexec.cpp" />
58 <ClCompile Include="cputilsched.cpp" />
59 <ClCompile Include="dllmain.cpp">
60 <PrecompiledHeader>Create</PrecompiledHeader>
61 </ClCompile>
62 </ItemGroup>
63
64 <ItemGroup>
65 <ClInclude Include="cpappexec.h" />
66 <ClInclude Include="cpapproleexec.h" />
67 <ClInclude Include="cpapprolesched.h" />
68 <ClInclude Include="cpappsched.h" />
69 <ClInclude Include="cpasmexec.h" />
70 <ClInclude Include="cpasmsched.h" />
71 <ClInclude Include="cpcost.h" />
72 <ClInclude Include="cppartexec.h" />
73 <ClInclude Include="cppartroleexec.h" />
74 <ClInclude Include="cppartrolesched.h" />
75 <ClInclude Include="cppartsched.h" />
76 <ClInclude Include="cpsubsexec.h" />
77 <ClInclude Include="cpsubssched.h" />
78 <ClInclude Include="cputilexec.h" />
79 <ClInclude Include="cputilsched.h" />
80 <ClInclude Include="precomp.h" />
81 </ItemGroup>
82
83 <ItemGroup>
84 <None Include="complusca.def" />
85 </ItemGroup>
86
87 <ItemGroup>
88 <PackageReference Include="WixToolset.Dutil" Version="4.0.62" />
89 <PackageReference Include="WixToolset.WcaUtil" Version="4.0.18" />
90 <PackageReference Include="Microsoft.SourceLink.GitHub" Version="1.0.0" />
91 <PackageReference Include="Nerdbank.GitVersioning" Version="3.3.37" />
92 </ItemGroup>
93
94 <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
95</Project> \ No newline at end of file
diff --git a/src/ext/ComPlus/ca/cpappexec.cpp b/src/ext/ComPlus/ca/cpappexec.cpp
new file mode 100644
index 00000000..48948210
--- /dev/null
+++ b/src/ext/ComPlus/ca/cpappexec.cpp
@@ -0,0 +1,344 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3#include "precomp.h"
4
5
6// private structs
7
8struct CPI_APPLICATION_ATTRIBUTES
9{
10 int iActionType;
11 int iActionCost;
12 LPWSTR pwzKey;
13 LPWSTR pwzID;
14 LPWSTR pwzName;
15 LPWSTR pwzPartID;
16 CPI_PROPERTY* pPropList;
17};
18
19
20// prototypes for private helper functions
21
22static HRESULT ReadApplicationAttributes(
23 LPWSTR* ppwzData,
24 CPI_APPLICATION_ATTRIBUTES* pAttrs
25 );
26static void FreeApplicationAttributes(
27 CPI_APPLICATION_ATTRIBUTES* pAttrs
28 );
29static HRESULT CreateApplication(
30 CPI_APPLICATION_ATTRIBUTES* pAttrs
31 );
32static HRESULT RemoveApplication(
33 CPI_APPLICATION_ATTRIBUTES* pAttrs
34 );
35
36
37// function definitions
38
39HRESULT CpiConfigureApplications(
40 LPWSTR* ppwzData,
41 HANDLE hRollbackFile
42 )
43{
44 HRESULT hr = S_OK;
45
46 CPI_APPLICATION_ATTRIBUTES attrs;
47 ::ZeroMemory(&attrs, sizeof(attrs));
48
49 // read action text
50 hr = CpiActionStartMessage(ppwzData, FALSE);
51 ExitOnFailure(hr, "Failed to send action start message");
52
53 // get count
54 int iCnt = 0;
55 hr = WcaReadIntegerFromCaData(ppwzData, &iCnt);
56 ExitOnFailure(hr, "Failed to read count");
57
58 // write count to rollback file
59 hr = CpiWriteIntegerToRollbackFile(hRollbackFile, iCnt);
60 ExitOnFailure(hr, "Failed to write count to rollback file");
61
62 for (int i = 0; i < iCnt; i++)
63 {
64 // read attributes from CustomActionData
65 hr = ReadApplicationAttributes(ppwzData, &attrs);
66 ExitOnFailure(hr, "Failed to read attributes");
67
68 // progress message
69 hr = CpiActionDataMessage(1, attrs.pwzName);
70 ExitOnFailure(hr, "Failed to send progress messages");
71
72 if (S_FALSE == hr)
73 ExitFunction();
74
75 // write key to rollback file
76 hr = CpiWriteKeyToRollbackFile(hRollbackFile, attrs.pwzKey);
77 ExitOnFailure(hr, "Failed to write key to rollback file");
78
79 // action
80 switch (attrs.iActionType)
81 {
82 case atCreate:
83 hr = CreateApplication(&attrs);
84 ExitOnFailure(hr, "Failed to create application, key: %S", attrs.pwzKey);
85 break;
86 case atRemove:
87 hr = RemoveApplication(&attrs);
88 ExitOnFailure(hr, "Failed to remove application, key: %S", attrs.pwzKey);
89 break;
90 }
91
92 // write completion status to rollback file
93 hr = CpiWriteIntegerToRollbackFile(hRollbackFile, 1);
94 ExitOnFailure(hr, "Failed to write completion status to rollback file");
95
96 // progress
97 hr = WcaProgressMessage(attrs.iActionCost, FALSE);
98 ExitOnFailure(hr, "Failed to update progress");
99 }
100
101 hr = S_OK;
102
103LExit:
104 // clean up
105 FreeApplicationAttributes(&attrs);
106
107 return hr;
108}
109
110HRESULT CpiRollbackConfigureApplications(
111 LPWSTR* ppwzData,
112 CPI_ROLLBACK_DATA* pRollbackDataList
113 )
114{
115 HRESULT hr = S_OK;
116
117 int iRollbackStatus;
118
119 CPI_APPLICATION_ATTRIBUTES attrs;
120 ::ZeroMemory(&attrs, sizeof(attrs));
121
122 // read action text
123 hr = CpiActionStartMessage(ppwzData, NULL == pRollbackDataList);
124 ExitOnFailure(hr, "Failed to send action start message");
125
126 // get count
127 int iCnt = 0;
128 hr = WcaReadIntegerFromCaData(ppwzData, &iCnt);
129 ExitOnFailure(hr, "Failed to read count");
130
131 for (int i = 0; i < iCnt; i++)
132 {
133 // read attributes from CustomActionData
134 hr = ReadApplicationAttributes(ppwzData, &attrs);
135 ExitOnFailure(hr, "Failed to read attributes");
136
137 // rollback status
138 hr = CpiFindRollbackStatus(pRollbackDataList, attrs.pwzKey, &iRollbackStatus);
139
140 if (S_FALSE == hr)
141 continue; // not found, nothing to rollback
142
143 // progress message
144 hr = CpiActionDataMessage(1, attrs.pwzName);
145 ExitOnFailure(hr, "Failed to send progress messages");
146
147 if (S_FALSE == hr)
148 ExitFunction();
149
150 // action
151 switch (attrs.iActionType)
152 {
153 case atCreate:
154 hr = CreateApplication(&attrs);
155 if (FAILED(hr))
156 WcaLog(LOGMSG_STANDARD, "Failed to create application, hr: 0x%x, key: %S", hr, attrs.pwzKey);
157 break;
158 case atRemove:
159 hr = RemoveApplication(&attrs);
160 if (FAILED(hr))
161 WcaLog(LOGMSG_STANDARD, "Failed to remove application, hr: 0x%x, key: %S", hr, attrs.pwzKey);
162 break;
163 }
164
165 // check rollback status
166 if (0 == iRollbackStatus)
167 continue; // operation did not complete, skip progress
168
169 // progress
170 hr = WcaProgressMessage(attrs.iActionCost, FALSE);
171 ExitOnFailure(hr, "Failed to update progress");
172 }
173
174 hr = S_OK;
175
176LExit:
177 // clean up
178 FreeApplicationAttributes(&attrs);
179
180 return hr;
181}
182
183
184// helper function definitions
185
186static HRESULT ReadApplicationAttributes(
187 LPWSTR* ppwzData,
188 CPI_APPLICATION_ATTRIBUTES* pAttrs
189 )
190{
191 HRESULT hr = S_OK;
192
193 hr = WcaReadIntegerFromCaData(ppwzData, &pAttrs->iActionType);
194 ExitOnFailure(hr, "Failed to read action type");
195 hr = WcaReadIntegerFromCaData(ppwzData, &pAttrs->iActionCost);
196 ExitOnFailure(hr, "Failed to read action cost");
197 hr = WcaReadStringFromCaData(ppwzData, &pAttrs->pwzKey);
198 ExitOnFailure(hr, "Failed to read key");
199 hr = WcaReadStringFromCaData(ppwzData, &pAttrs->pwzID);
200 ExitOnFailure(hr, "Failed to read id");
201 hr = WcaReadStringFromCaData(ppwzData, &pAttrs->pwzName);
202 ExitOnFailure(hr, "Failed to read name");
203 hr = WcaReadStringFromCaData(ppwzData, &pAttrs->pwzPartID);
204 ExitOnFailure(hr, "Failed to read partition id");
205 hr = CpiReadPropertyList(ppwzData, &pAttrs->pPropList);
206 ExitOnFailure(hr, "Failed to read properties");
207
208 hr = S_OK;
209
210LExit:
211 return hr;
212}
213
214static void FreeApplicationAttributes(
215 CPI_APPLICATION_ATTRIBUTES* pAttrs
216 )
217{
218 ReleaseStr(pAttrs->pwzKey);
219 ReleaseStr(pAttrs->pwzID);
220 ReleaseStr(pAttrs->pwzName);
221 ReleaseStr(pAttrs->pwzPartID);
222
223 if (pAttrs->pPropList)
224 CpiFreePropertyList(pAttrs->pPropList);
225}
226
227static HRESULT CreateApplication(
228 CPI_APPLICATION_ATTRIBUTES* pAttrs
229 )
230{
231 HRESULT hr = S_OK;
232
233 ICatalogCollection* piAppColl = NULL;
234 ICatalogObject* piAppObj = NULL;
235
236 long lChanges = 0;
237
238 // log
239 WcaLog(LOGMSG_VERBOSE, "Creating application, key: %S", pAttrs->pwzKey);
240
241 // get applications collection
242 hr = CpiExecGetApplicationsCollection(pAttrs->pwzPartID, &piAppColl);
243 if (S_FALSE == hr)
244 hr = HRESULT_FROM_WIN32(ERROR_NOT_FOUND);
245 ExitOnFailure(hr, "Failed to get applications collection");
246
247 // check if application exists
248 hr = CpiFindCollectionObjectByStringKey(piAppColl, pAttrs->pwzID, &piAppObj);
249 ExitOnFailure(hr, "Failed to find application");
250
251 if (S_FALSE == hr)
252 {
253 // create application
254 hr = CpiAddCollectionObject(piAppColl, &piAppObj);
255 ExitOnFailure(hr, "Failed to add application to collection");
256
257 hr = CpiPutCollectionObjectValue(piAppObj, L"ID", pAttrs->pwzID);
258 ExitOnFailure(hr, "Failed to set application id property");
259
260 hr = CpiPutCollectionObjectValue(piAppObj, L"Name", pAttrs->pwzName);
261 ExitOnFailure(hr, "Failed to set application name property");
262
263 // save changes
264 hr = piAppColl->SaveChanges(&lChanges);
265 if (COMADMIN_E_OBJECTERRORS == hr)
266 CpiLogCatalogErrorInfo();
267 ExitOnFailure(hr, "Failed to add application");
268 }
269
270 // properties
271 hr = CpiPutCollectionObjectValues(piAppObj, pAttrs->pPropList);
272 ExitOnFailure(hr, "Failed to write properties");
273
274 // save changes
275 hr = piAppColl->SaveChanges(&lChanges);
276 if (COMADMIN_E_OBJECTERRORS == hr)
277 CpiLogCatalogErrorInfo();
278 ExitOnFailure(hr, "Failed to save changes");
279
280 // log
281 WcaLog(LOGMSG_VERBOSE, "%d changes saved to catalog, key: %S", lChanges, pAttrs->pwzKey);
282
283 hr = S_OK;
284
285LExit:
286 // clean up
287 ReleaseObject(piAppColl);
288 ReleaseObject(piAppObj);
289
290 return hr;
291}
292
293static HRESULT RemoveApplication(
294 CPI_APPLICATION_ATTRIBUTES* pAttrs
295 )
296{
297 HRESULT hr = S_OK;
298
299 ICatalogCollection* piAppColl = NULL;
300
301 long lChanges = 0;
302
303 // log
304 WcaLog(LOGMSG_VERBOSE, "Removing application, key: %S", pAttrs->pwzKey);
305
306 // get applications collection
307 hr = CpiExecGetApplicationsCollection(pAttrs->pwzPartID, &piAppColl);
308 ExitOnFailure(hr, "Failed to get applications collection");
309
310 if (S_FALSE == hr)
311 {
312 // applications collection not found
313 WcaLog(LOGMSG_VERBOSE, "Unable to retrieve applications collection, nothing to delete, key: %S", pAttrs->pwzKey);
314 ExitFunction1(hr = S_OK);
315 }
316
317 // remove
318 hr = CpiRemoveCollectionObject(piAppColl, pAttrs->pwzID, NULL, TRUE);
319 ExitOnFailure(hr, "Failed to remove application");
320
321 if (S_FALSE == hr)
322 {
323 // application not found
324 WcaLog(LOGMSG_VERBOSE, "Application not found, nothing to delete, key: %S", pAttrs->pwzKey);
325 ExitFunction1(hr = S_OK);
326 }
327
328 // save changes
329 hr = piAppColl->SaveChanges(&lChanges);
330 if (COMADMIN_E_OBJECTERRORS == hr)
331 CpiLogCatalogErrorInfo();
332 ExitOnFailure(hr, "Failed to save changes");
333
334 // log
335 WcaLog(LOGMSG_VERBOSE, "%d changes saved to catalog, key: %S", lChanges, pAttrs->pwzKey);
336
337 hr = S_OK;
338
339LExit:
340 // clean up
341 ReleaseObject(piAppColl);
342
343 return hr;
344}
diff --git a/src/ext/ComPlus/ca/cpappexec.h b/src/ext/ComPlus/ca/cpappexec.h
new file mode 100644
index 00000000..5003b046
--- /dev/null
+++ b/src/ext/ComPlus/ca/cpappexec.h
@@ -0,0 +1,12 @@
1#pragma once
2// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
3
4
5HRESULT CpiConfigureApplications(
6 LPWSTR* ppwzData,
7 HANDLE hRollbackFile
8 );
9HRESULT CpiRollbackConfigureApplications(
10 LPWSTR* ppwzData,
11 CPI_ROLLBACK_DATA* pRollbackDataList
12 );
diff --git a/src/ext/ComPlus/ca/cpapproleexec.cpp b/src/ext/ComPlus/ca/cpapproleexec.cpp
new file mode 100644
index 00000000..e3b71e93
--- /dev/null
+++ b/src/ext/ComPlus/ca/cpapproleexec.cpp
@@ -0,0 +1,720 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3#include "precomp.h"
4
5
6// private structs
7
8struct CPI_APPLICATION_ROLE_ATTRIBUTES
9{
10 int iActionType;
11 int iActionCost;
12 LPWSTR pwzKey;
13 LPWSTR pwzName;
14 LPWSTR pwzAppID;
15 LPWSTR pwzPartID;
16 CPI_PROPERTY* pPropList;
17};
18
19struct CPI_USER_IN_APPLICATION_ROLE_ATTRIBUTES
20{
21 int iActionType;
22 int iActionCost;
23 LPWSTR pwzKey;
24 LPWSTR pwzRoleName;
25 LPWSTR pwzAccount;
26 LPWSTR pwzAppID;
27 LPWSTR pwzPartID;
28};
29
30
31// prototypes for private helper functions
32
33static HRESULT ReadApplicationRoleAttributes(
34 LPWSTR* ppwzData,
35 CPI_APPLICATION_ROLE_ATTRIBUTES* pAttrs
36 );
37static void FreeApplicationRoleAttributes(
38 CPI_APPLICATION_ROLE_ATTRIBUTES* pAttrs
39 );
40static HRESULT CreateApplicationRole(
41 CPI_APPLICATION_ROLE_ATTRIBUTES* pAttrs
42 );
43static HRESULT RemoveApplicationRole(
44 CPI_APPLICATION_ROLE_ATTRIBUTES* pAttrs
45 );
46static HRESULT ReadUsersInApplicationRoleAttributes(
47 LPWSTR* ppwzData,
48 CPI_USER_IN_APPLICATION_ROLE_ATTRIBUTES* pAttrs
49 );
50static void FreeUsersInApplicationRoleAttributes(
51 CPI_USER_IN_APPLICATION_ROLE_ATTRIBUTES* pAttrs
52 );
53static HRESULT CreateUsersInApplicationRole(
54 CPI_USER_IN_APPLICATION_ROLE_ATTRIBUTES* pAttrs
55 );
56static HRESULT RemoveUsersInApplicationRole(
57 CPI_USER_IN_APPLICATION_ROLE_ATTRIBUTES* pAttrs
58 );
59
60
61// function definitions
62
63HRESULT CpiConfigureApplicationRoles(
64 LPWSTR* ppwzData,
65 HANDLE hRollbackFile
66 )
67{
68 HRESULT hr = S_OK;
69
70 CPI_APPLICATION_ROLE_ATTRIBUTES attrs;
71 ::ZeroMemory(&attrs, sizeof(attrs));
72
73 // read action text
74 hr = CpiActionStartMessage(ppwzData, FALSE);
75 ExitOnFailure(hr, "Failed to send action start message");
76
77 // ger count
78 int iCnt = 0;
79 hr = WcaReadIntegerFromCaData(ppwzData, &iCnt);
80 ExitOnFailure(hr, "Failed to read count");
81
82 // write count to rollback file
83 hr = CpiWriteIntegerToRollbackFile(hRollbackFile, iCnt);
84 ExitOnFailure(hr, "Failed to write count to rollback file");
85
86 for (int i = 0; i < iCnt; i++)
87 {
88 // read attributes from CustomActionData
89 hr = ReadApplicationRoleAttributes(ppwzData, &attrs);
90 ExitOnFailure(hr, "Failed to read attributes");
91
92 // progress message
93 hr = CpiActionDataMessage(1, attrs.pwzName);
94 ExitOnFailure(hr, "Failed to send progress messages");
95
96 if (S_FALSE == hr)
97 ExitFunction();
98
99 // write key to rollback file
100 hr = CpiWriteKeyToRollbackFile(hRollbackFile, attrs.pwzKey);
101 ExitOnFailure(hr, "Failed to write key to rollback file");
102
103 // action
104 switch (attrs.iActionType)
105 {
106 case atCreate:
107 hr = CreateApplicationRole(&attrs);
108 ExitOnFailure(hr, "Failed to create application role, key: %S", attrs.pwzKey);
109 break;
110 case atRemove:
111 hr = RemoveApplicationRole(&attrs);
112 ExitOnFailure(hr, "Failed to remove application role, key: %S", attrs.pwzKey);
113 break;
114 }
115
116 // write completion status to rollback file
117 hr = CpiWriteIntegerToRollbackFile(hRollbackFile, 1);
118 ExitOnFailure(hr, "Failed to write completion status to rollback file");
119
120 // progress
121 hr = WcaProgressMessage(attrs.iActionCost, FALSE);
122 ExitOnFailure(hr, "Failed to update progress");
123 }
124
125 hr = S_OK;
126
127LExit:
128 // clean up
129 FreeApplicationRoleAttributes(&attrs);
130
131 return hr;
132}
133
134HRESULT CpiRollbackConfigureApplicationRoles(
135 LPWSTR* ppwzData,
136 CPI_ROLLBACK_DATA* pRollbackDataList
137 )
138{
139 HRESULT hr = S_OK;
140
141 int iRollbackStatus;
142
143 CPI_APPLICATION_ROLE_ATTRIBUTES attrs;
144 ::ZeroMemory(&attrs, sizeof(attrs));
145
146 // read action text
147 hr = CpiActionStartMessage(ppwzData, NULL == pRollbackDataList);
148 ExitOnFailure(hr, "Failed to send action start message");
149
150 // get count
151 int iCnt = 0;
152 hr = WcaReadIntegerFromCaData(ppwzData, &iCnt);
153 ExitOnFailure(hr, "Failed to read count");
154
155 for (int i = 0; i < iCnt; i++)
156 {
157 // read attributes from CustomActionData
158 hr = ReadApplicationRoleAttributes(ppwzData, &attrs);
159 ExitOnFailure(hr, "Failed to read attributes");
160
161 // rollback status
162 hr = CpiFindRollbackStatus(pRollbackDataList, attrs.pwzKey, &iRollbackStatus);
163
164 if (S_FALSE == hr)
165 continue; // not found, nothing to rollback
166
167 // progress message
168 hr = CpiActionDataMessage(1, attrs.pwzName);
169 ExitOnFailure(hr, "Failed to send progress messages");
170
171 if (S_FALSE == hr)
172 ExitFunction();
173
174 // action
175 switch (attrs.iActionType)
176 {
177 case atCreate:
178 hr = CreateApplicationRole(&attrs);
179 if (FAILED(hr))
180 WcaLog(LOGMSG_STANDARD, "Failed to create application role, hr: 0x%x, key: %S", hr, attrs.pwzKey);
181 break;
182 case atRemove:
183 hr = RemoveApplicationRole(&attrs);
184 if (FAILED(hr))
185 WcaLog(LOGMSG_STANDARD, "Failed to remove application role, hr: 0x%x, key: %S", hr, attrs.pwzKey);
186 break;
187 }
188
189 // check rollback status
190 if (0 == iRollbackStatus)
191 continue; // operation did not complete, skip progress
192
193 // progress
194 hr = WcaProgressMessage(attrs.iActionCost, FALSE);
195 ExitOnFailure(hr, "Failed to update progress");
196 }
197
198 hr = S_OK;
199
200LExit:
201 // clean up
202 FreeApplicationRoleAttributes(&attrs);
203
204 return hr;
205}
206
207HRESULT CpiConfigureUsersInApplicationRoles(
208 LPWSTR* ppwzData,
209 HANDLE hRollbackFile
210 )
211{
212 HRESULT hr = S_OK;
213
214 CPI_USER_IN_APPLICATION_ROLE_ATTRIBUTES attrs;
215 ::ZeroMemory(&attrs, sizeof(attrs));
216
217 // read action text
218 hr = CpiActionStartMessage(ppwzData, FALSE);
219 ExitOnFailure(hr, "Failed to send action start message");
220
221 // ger count
222 int iCnt = 0;
223 hr = WcaReadIntegerFromCaData(ppwzData, &iCnt);
224 ExitOnFailure(hr, "Failed to read count");
225
226 // write count to rollback file
227 hr = CpiWriteIntegerToRollbackFile(hRollbackFile, iCnt);
228 ExitOnFailure(hr, "Failed to write count to rollback file");
229
230 for (int i = 0; i < iCnt; i++)
231 {
232 // read attributes from CustomActionData
233 hr = ReadUsersInApplicationRoleAttributes(ppwzData, &attrs);
234 ExitOnFailure(hr, "Failed to read attributes");
235
236 // progress message
237 hr = CpiActionDataMessage(1, attrs.pwzRoleName);
238 ExitOnFailure(hr, "Failed to send progress messages");
239
240 if (S_FALSE == hr)
241 ExitFunction();
242
243 // write key to rollback file
244 hr = CpiWriteKeyToRollbackFile(hRollbackFile, attrs.pwzKey);
245 ExitOnFailure(hr, "Failed to write key to rollback file");
246
247 // action
248 switch (attrs.iActionType)
249 {
250 case atCreate:
251 hr = CreateUsersInApplicationRole(&attrs);
252 ExitOnFailure(hr, "Failed to create user in application role, key: %S", attrs.pwzKey);
253 break;
254 case atRemove:
255 hr = RemoveUsersInApplicationRole(&attrs);
256 ExitOnFailure(hr, "Failed to remove user from application role, key: %S", attrs.pwzKey);
257 break;
258 }
259
260 // write completion status to rollback file
261 hr = CpiWriteIntegerToRollbackFile(hRollbackFile, 1);
262 ExitOnFailure(hr, "Failed to write completion status to rollback file");
263
264 // progress
265 hr = WcaProgressMessage(attrs.iActionCost, FALSE);
266 ExitOnFailure(hr, "Failed to update progress");
267 }
268
269 hr = S_OK;
270
271LExit:
272 // clean up
273 FreeUsersInApplicationRoleAttributes(&attrs);
274
275 return hr;
276}
277
278HRESULT CpiRollbackConfigureUsersInApplicationRoles(
279 LPWSTR* ppwzData,
280 CPI_ROLLBACK_DATA* pRollbackDataList
281 )
282{
283 HRESULT hr = S_OK;
284
285 int iRollbackStatus;
286
287 CPI_USER_IN_APPLICATION_ROLE_ATTRIBUTES attrs;
288 ::ZeroMemory(&attrs, sizeof(attrs));
289
290 // read action text
291 hr = CpiActionStartMessage(ppwzData, NULL == pRollbackDataList);
292 ExitOnFailure(hr, "Failed to send action start message");
293
294 // get count
295 int iCnt = 0;
296 hr = WcaReadIntegerFromCaData(ppwzData, &iCnt);
297 ExitOnFailure(hr, "Failed to read count");
298
299 for (int i = 0; i < iCnt; i++)
300 {
301 // read attributes from CustomActionData
302 hr = ReadUsersInApplicationRoleAttributes(ppwzData, &attrs);
303 ExitOnFailure(hr, "Failed to read attributes");
304
305 // rollback status
306 hr = CpiFindRollbackStatus(pRollbackDataList, attrs.pwzKey, &iRollbackStatus);
307
308 if (S_FALSE == hr)
309 continue; // not found, nothing to rollback
310
311 // progress message
312 hr = CpiActionDataMessage(1, attrs.pwzRoleName);
313 ExitOnFailure(hr, "Failed to send progress messages");
314
315 if (S_FALSE == hr)
316 ExitFunction();
317
318 // action
319 switch (attrs.iActionType)
320 {
321 case atCreate:
322 hr = CreateUsersInApplicationRole(&attrs);
323 if (FAILED(hr))
324 WcaLog(LOGMSG_STANDARD, "Failed to add user to application role, hr: 0x%x, key: %S", hr, attrs.pwzKey);
325 break;
326 case atRemove:
327 hr = RemoveUsersInApplicationRole(&attrs);
328 if (FAILED(hr))
329 WcaLog(LOGMSG_STANDARD, "Failed to remove user from application role, hr: 0x%x, key: %S", hr, attrs.pwzKey);
330 break;
331 }
332
333 // check rollback status
334 if (0 == iRollbackStatus)
335 continue; // operation did not complete, skip progress
336
337 // progress
338 hr = WcaProgressMessage(attrs.iActionCost, FALSE);
339 ExitOnFailure(hr, "Failed to update progress");
340 }
341
342 hr = S_OK;
343
344LExit:
345 // clean up
346 FreeUsersInApplicationRoleAttributes(&attrs);
347
348 return hr;
349}
350
351
352// helper function definitions
353
354static HRESULT ReadApplicationRoleAttributes(
355 LPWSTR* ppwzData,
356 CPI_APPLICATION_ROLE_ATTRIBUTES* pAttrs
357 )
358{
359 HRESULT hr = S_OK;
360
361 hr = WcaReadIntegerFromCaData(ppwzData, &pAttrs->iActionType);
362 ExitOnFailure(hr, "Failed to read action type");
363 hr = WcaReadIntegerFromCaData(ppwzData, &pAttrs->iActionCost);
364 ExitOnFailure(hr, "Failed to read action cost");
365 hr = WcaReadStringFromCaData(ppwzData, &pAttrs->pwzKey);
366 ExitOnFailure(hr, "Failed to read key");
367 hr = WcaReadStringFromCaData(ppwzData, &pAttrs->pwzName);
368 ExitOnFailure(hr, "Failed to read name");
369 hr = WcaReadStringFromCaData(ppwzData, &pAttrs->pwzAppID);
370 ExitOnFailure(hr, "Failed to read application id");
371 hr = WcaReadStringFromCaData(ppwzData, &pAttrs->pwzPartID);
372 ExitOnFailure(hr, "Failed to read partition id");
373 hr = CpiReadPropertyList(ppwzData, &pAttrs->pPropList);
374 ExitOnFailure(hr, "Failed to read properties");
375
376 hr = S_OK;
377
378LExit:
379 return hr;
380}
381
382static void FreeApplicationRoleAttributes(
383 CPI_APPLICATION_ROLE_ATTRIBUTES* pAttrs
384 )
385{
386 ReleaseStr(pAttrs->pwzKey);
387 ReleaseStr(pAttrs->pwzName);
388 ReleaseStr(pAttrs->pwzAppID);
389 ReleaseStr(pAttrs->pwzPartID);
390
391 if (pAttrs->pPropList)
392 CpiFreePropertyList(pAttrs->pPropList);
393}
394
395static HRESULT CreateApplicationRole(
396 CPI_APPLICATION_ROLE_ATTRIBUTES* pAttrs
397 )
398{
399 HRESULT hr = S_OK;
400
401 ICatalogCollection* piRolesColl = NULL;
402 ICatalogObject* piRoleObj = NULL;
403
404 long lChanges = 0;
405
406 // log
407 WcaLog(LOGMSG_VERBOSE, "Creating application role, key: %S", pAttrs->pwzKey);
408
409 // get roles collection
410 hr = CpiGetRolesCollection(pAttrs->pwzPartID, pAttrs->pwzAppID, &piRolesColl);
411 if (S_FALSE == hr)
412 hr = HRESULT_FROM_WIN32(ERROR_NOT_FOUND);
413 ExitOnFailure(hr, "Failed to get roles collection");
414
415 // check if role exists
416 hr = CpiFindCollectionObjectByName(piRolesColl, pAttrs->pwzName, &piRoleObj);
417 ExitOnFailure(hr, "Failed to find role");
418
419 if (S_FALSE == hr)
420 {
421 // create role
422 hr = CpiAddCollectionObject(piRolesColl, &piRoleObj);
423 ExitOnFailure(hr, "Failed to add role to collection");
424
425 hr = CpiPutCollectionObjectValue(piRoleObj, L"Name", pAttrs->pwzName);
426 ExitOnFailure(hr, "Failed to set role name property");
427 }
428
429 // properties
430 hr = CpiPutCollectionObjectValues(piRoleObj, pAttrs->pPropList);
431 ExitOnFailure(hr, "Failed to write properties");
432
433 // save changes
434 hr = piRolesColl->SaveChanges(&lChanges);
435 if (COMADMIN_E_OBJECTERRORS == hr)
436 CpiLogCatalogErrorInfo();
437 ExitOnFailure(hr, "Failed to save changes");
438
439 // log
440 WcaLog(LOGMSG_VERBOSE, "%d changes saved to catalog, key: %S", lChanges, pAttrs->pwzKey);
441
442 hr = S_OK;
443
444LExit:
445 // clean up
446 ReleaseObject(piRolesColl);
447 ReleaseObject(piRoleObj);
448
449 return hr;
450}
451
452static HRESULT RemoveApplicationRole(
453 CPI_APPLICATION_ROLE_ATTRIBUTES* pAttrs
454 )
455{
456 HRESULT hr = S_OK;
457
458 ICatalogCollection* piRolesColl = NULL;
459
460 long lChanges = 0;
461
462 // log
463 WcaLog(LOGMSG_VERBOSE, "Removing application role, key: %S", pAttrs->pwzKey);
464
465 // get roles collection
466 hr = CpiGetRolesCollection(pAttrs->pwzPartID, pAttrs->pwzAppID, &piRolesColl);
467 ExitOnFailure(hr, "Failed to get roles collection");
468
469 if (S_FALSE == hr)
470 {
471 // roles collection not found
472 WcaLog(LOGMSG_VERBOSE, "Unable to retrieve roles collection, nothing to delete, key: %S", pAttrs->pwzKey);
473 ExitFunction1(hr = S_OK);
474 }
475
476 // remove
477 hr = CpiRemoveCollectionObject(piRolesColl, NULL, pAttrs->pwzName, FALSE);
478 ExitOnFailure(hr, "Failed to remove role");
479
480 if (S_FALSE == hr)
481 {
482 // role not found
483 WcaLog(LOGMSG_VERBOSE, "Role not found, nothing to delete, key: %S", pAttrs->pwzKey);
484 ExitFunction1(hr = S_OK);
485 }
486
487 // save changes
488 hr = piRolesColl->SaveChanges(&lChanges);
489 if (COMADMIN_E_OBJECTERRORS == hr)
490 CpiLogCatalogErrorInfo();
491 ExitOnFailure(hr, "Failed to save changes");
492
493 // log
494 WcaLog(LOGMSG_VERBOSE, "%d changes saved to catalog, key: %S", lChanges, pAttrs->pwzKey);
495
496 hr = S_OK;
497
498LExit:
499 // clean up
500 ReleaseObject(piRolesColl);
501
502 return hr;
503}
504
505static HRESULT ReadUsersInApplicationRoleAttributes(
506 LPWSTR* ppwzData,
507 CPI_USER_IN_APPLICATION_ROLE_ATTRIBUTES* pAttrs
508 )
509{
510 HRESULT hr = S_OK;
511
512 hr = WcaReadIntegerFromCaData(ppwzData, &pAttrs->iActionType);
513 ExitOnFailure(hr, "Failed to read action type");
514 hr = WcaReadIntegerFromCaData(ppwzData, &pAttrs->iActionCost);
515 ExitOnFailure(hr, "Failed to read action cost");
516 hr = WcaReadStringFromCaData(ppwzData, &pAttrs->pwzKey);
517 ExitOnFailure(hr, "Failed to read key");
518 hr = WcaReadStringFromCaData(ppwzData, &pAttrs->pwzRoleName);
519 ExitOnFailure(hr, "Failed to read role name");
520 hr = WcaReadStringFromCaData(ppwzData, &pAttrs->pwzAccount);
521 ExitOnFailure(hr, "Failed to read account name");
522 hr = WcaReadStringFromCaData(ppwzData, &pAttrs->pwzAppID);
523 ExitOnFailure(hr, "Failed to read application id");
524 hr = WcaReadStringFromCaData(ppwzData, &pAttrs->pwzPartID);
525 ExitOnFailure(hr, "Failed to read partition id");
526
527 hr = S_OK;
528
529LExit:
530 return hr;
531}
532
533static void FreeUsersInApplicationRoleAttributes(
534 CPI_USER_IN_APPLICATION_ROLE_ATTRIBUTES* pAttrs
535 )
536{
537 ReleaseStr(pAttrs->pwzKey);
538 ReleaseStr(pAttrs->pwzRoleName);
539 ReleaseStr(pAttrs->pwzAccount);
540 ReleaseStr(pAttrs->pwzAppID);
541 ReleaseStr(pAttrs->pwzPartID);
542}
543
544static HRESULT CreateUsersInApplicationRole(
545 CPI_USER_IN_APPLICATION_ROLE_ATTRIBUTES* pAttrs
546 )
547{
548 HRESULT hr = S_OK;
549 UINT er = ERROR_SUCCESS;
550
551 ICatalogCollection* piUsrInRoleColl = NULL;
552 ICatalogObject* piUsrInRoleObj = NULL;
553
554 PSID pSid = NULL;
555 long lChanges = 0;
556
557 // log
558 WcaLog(LOGMSG_VERBOSE, "Adding user to application role, key: %S", pAttrs->pwzKey);
559
560 // get users in role collection
561 hr = CpiGetUsersInRoleCollection(pAttrs->pwzPartID, pAttrs->pwzAppID, pAttrs->pwzRoleName, &piUsrInRoleColl);
562 if (S_FALSE == hr)
563 hr = HRESULT_FROM_WIN32(ERROR_NOT_FOUND);
564 ExitOnFailure(hr, "Failed to get users in role collection");
565
566 // get SID for account
567 do {
568 er = ERROR_SUCCESS;
569 hr = CpiAccountNameToSid(pAttrs->pwzAccount, &pSid);
570 if (HRESULT_FROM_WIN32(ERROR_NONE_MAPPED) == hr && !::MsiGetMode(WcaGetInstallHandle(), MSIRUNMODE_ROLLBACK))
571 {
572 WcaLog(LOGMSG_STANDARD, "Failed to lookup account name, hr: 0x%x, account: '%S'", hr, pAttrs->pwzAccount);
573 er = WcaErrorMessage(msierrComPlusFailedLookupNames, hr, INSTALLMESSAGE_ERROR | MB_ABORTRETRYIGNORE, 0);
574 switch (er)
575 {
576 case IDABORT:
577 ExitFunction(); // exit with error code from CpiAccountNameToSid()
578 case IDRETRY:
579 break;
580 case IDIGNORE:
581 default:
582 ExitFunction1(hr = S_OK);
583 }
584 }
585 else
586 ExitOnFailure(hr, "Failed to get SID for account");
587 } while (IDRETRY == er);
588
589 // find any existing entry
590 hr = CpiFindUserCollectionObject(piUsrInRoleColl, pSid, NULL);
591 if (HRESULT_FROM_WIN32(ERROR_NONE_MAPPED) == hr || HRESULT_FROM_WIN32(ERROR_SOME_NOT_MAPPED) == hr)
592 WcaLog(LOGMSG_STANDARD, "Failed to lookup account names, hr: 0x%x", hr);
593 else
594 ExitOnFailure(hr, "Failed to find user in application role");
595
596 if (S_OK == hr)
597 {
598 WcaLog(LOGMSG_VERBOSE, "User already assigned to application role, key: %S", pAttrs->pwzKey);
599 ExitFunction(); // exit with hr = S_OK
600 }
601
602 // convert SID back to account name
603 hr = CpiSidToAccountName(pSid, &pAttrs->pwzAccount);
604 ExitOnFailure(hr, "Failed to convert SID to account name");
605
606 // add user
607 hr = CpiAddCollectionObject(piUsrInRoleColl, &piUsrInRoleObj);
608 ExitOnFailure(hr, "Failed to add user in role to collection");
609
610 hr = CpiPutCollectionObjectValue(piUsrInRoleObj, L"User", pAttrs->pwzAccount);
611 ExitOnFailure(hr, "Failed to set role name property");
612
613 // save changes
614 hr = piUsrInRoleColl->SaveChanges(&lChanges);
615 if (COMADMIN_E_OBJECTERRORS == hr)
616 CpiLogCatalogErrorInfo();
617 ExitOnFailure(hr, "Failed to save changes");
618
619 // log
620 WcaLog(LOGMSG_VERBOSE, "%d changes saved to catalog, key: %S", lChanges, pAttrs->pwzKey);
621
622 hr = S_OK;
623
624LExit:
625 // clean up
626 ReleaseObject(piUsrInRoleColl);
627 ReleaseObject(piUsrInRoleObj);
628
629 if (pSid)
630 ::HeapFree(::GetProcessHeap(), 0, pSid);
631
632 return hr;
633}
634
635static HRESULT RemoveUsersInApplicationRole(
636 CPI_USER_IN_APPLICATION_ROLE_ATTRIBUTES* pAttrs
637 )
638{
639 HRESULT hr = S_OK;
640 UINT er = ERROR_SUCCESS;
641
642 ICatalogCollection* piUsrInRoleColl = NULL;
643
644 PSID pSid = NULL;
645 long lChanges = 0;
646
647 // log
648 WcaLog(LOGMSG_VERBOSE, "Removing user from application role, key: %S", pAttrs->pwzKey);
649
650 // get users in role collection
651 hr = CpiGetUsersInRoleCollection(pAttrs->pwzPartID, pAttrs->pwzAppID, pAttrs->pwzRoleName, &piUsrInRoleColl);
652 ExitOnFailure(hr, "Failed to get users in role collection");
653
654 if (S_FALSE == hr)
655 {
656 // users in role collection not found
657 WcaLog(LOGMSG_VERBOSE, "Unable to retrieve users in role collection, nothing to delete, key: %S", pAttrs->pwzKey);
658 ExitFunction1(hr = S_OK);
659 }
660
661 // get SID for account
662 do {
663 er = ERROR_SUCCESS;
664 hr = CpiAccountNameToSid(pAttrs->pwzAccount, &pSid);
665 if (HRESULT_FROM_WIN32(ERROR_NONE_MAPPED) == hr && !::MsiGetMode(WcaGetInstallHandle(), MSIRUNMODE_ROLLBACK))
666 {
667 WcaLog(LOGMSG_STANDARD, "Failed to lookup account name, hr: 0x%x, account: '%S'", hr, pAttrs->pwzAccount);
668 er = WcaErrorMessage(msierrComPlusFailedLookupNames, hr, INSTALLMESSAGE_ERROR | MB_ABORTRETRYIGNORE, 0);
669 switch (er)
670 {
671 case IDABORT:
672 ExitFunction(); // exit with error code from CpiAccountNameToSid()
673 case IDRETRY:
674 break;
675 case IDIGNORE:
676 default:
677 ExitFunction1(hr = S_OK);
678 }
679 }
680 else
681 ExitOnFailure(hr, "Failed to get SID for account");
682 } while (IDRETRY == er);
683
684 // remove
685 hr = CpiRemoveUserCollectionObject(piUsrInRoleColl, pSid);
686 if (HRESULT_FROM_WIN32(ERROR_NONE_MAPPED) == hr || HRESULT_FROM_WIN32(ERROR_SOME_NOT_MAPPED) == hr)
687 {
688 WcaLog(LOGMSG_STANDARD, "Failed to lookup account names, hr: 0x%x", hr);
689 hr = S_FALSE;
690 }
691 else
692 ExitOnFailure(hr, "Failed to remove user");
693
694 if (S_FALSE == hr)
695 {
696 // role not found
697 WcaLog(LOGMSG_VERBOSE, "User not found for application role, nothing to delete, key: %S", pAttrs->pwzKey);
698 ExitFunction1(hr = S_OK);
699 }
700
701 // save changes
702 hr = piUsrInRoleColl->SaveChanges(&lChanges);
703 if (COMADMIN_E_OBJECTERRORS == hr)
704 CpiLogCatalogErrorInfo();
705 ExitOnFailure(hr, "Failed to save changes");
706
707 // log
708 WcaLog(LOGMSG_VERBOSE, "%d changes saved to catalog, key: %S", lChanges, pAttrs->pwzKey);
709
710 hr = S_OK;
711
712LExit:
713 // clean up
714 ReleaseObject(piUsrInRoleColl);
715
716 if (pSid)
717 ::HeapFree(::GetProcessHeap(), 0, pSid);
718
719 return hr;
720}
diff --git a/src/ext/ComPlus/ca/cpapproleexec.h b/src/ext/ComPlus/ca/cpapproleexec.h
new file mode 100644
index 00000000..1251cbdb
--- /dev/null
+++ b/src/ext/ComPlus/ca/cpapproleexec.h
@@ -0,0 +1,20 @@
1#pragma once
2// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
3
4
5HRESULT CpiConfigureApplicationRoles(
6 LPWSTR* ppwzData,
7 HANDLE hRollbackFile
8 );
9HRESULT CpiRollbackConfigureApplicationRoles(
10 LPWSTR* ppwzData,
11 CPI_ROLLBACK_DATA* pRollbackDataList
12 );
13HRESULT CpiConfigureUsersInApplicationRoles(
14 LPWSTR* ppwzData,
15 HANDLE hRollbackFile
16 );
17HRESULT CpiRollbackConfigureUsersInApplicationRoles(
18 LPWSTR* ppwzData,
19 CPI_ROLLBACK_DATA* pRollbackDataList
20 );
diff --git a/src/ext/ComPlus/ca/cpapprolesched.cpp b/src/ext/ComPlus/ca/cpapprolesched.cpp
new file mode 100644
index 00000000..a268d156
--- /dev/null
+++ b/src/ext/ComPlus/ca/cpapprolesched.cpp
@@ -0,0 +1,843 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3#include "precomp.h"
4
5
6// sql queries
7
8LPCWSTR vcsApplicationRoleQuery =
9 L"SELECT `ApplicationRole`, `Application_`, `Component_`, `Name` FROM `ComPlusApplicationRole`";
10enum eApplicationRoleQuery { arqApplicationRole = 1, arqApplication, arqComponent, arqName };
11
12LPCWSTR vcsUserInApplicationRoleQuery =
13 L"SELECT `UserInApplicationRole`, `ApplicationRole_`, `ComPlusUserInApplicationRole`.`Component_`, `Domain`, `Name` FROM `ComPlusUserInApplicationRole`, `User` WHERE `User_` = `User`";
14LPCWSTR vcsGroupInApplicationRoleQuery =
15 L"SELECT `GroupInApplicationRole`, `ApplicationRole_`, `ComPlusGroupInApplicationRole`.`Component_`, `Domain`, `Name` FROM `ComPlusGroupInApplicationRole`, `Group` WHERE `Group_` = `Group`";
16enum eTrusteeInApplicationRoleQuery { tiarqUserInApplicationRole = 1, tiarqApplicationRole, tiarqComponent, tiarqDomain, tiarqName };
17
18LPCWSTR vcsApplicationRolePropertyQuery =
19 L"SELECT `Name`, `Value` FROM `ComPlusApplicationRoleProperty` WHERE `ApplicationRole_` = ?";
20
21
22// property definitions
23
24CPI_PROPERTY_DEFINITION pdlApplicationRoleProperties[] =
25{
26 {L"Description", cpptString, 500},
27 {NULL, cpptNone, 0}
28};
29
30
31// prototypes for private helper functions
32
33static HRESULT TrusteesInApplicationRolesRead(
34 LPCWSTR pwzQuery,
35 CPI_APPLICATION_ROLE_LIST* pAppRoleList,
36 CPI_USER_IN_APPLICATION_ROLE_LIST* pUsrInAppRoleList
37 );
38static void FreeApplicationRole(
39 CPI_APPLICATION_ROLE* pItm
40 );
41static void FreeUserInApplicationRole(
42 CPI_USER_IN_APPLICATION_ROLE* pItm
43 );
44//static HRESULT GetUsersCollForApplicationRole(
45// CPI_APPLICATION_ROLE* pAppRole,
46// ICatalogCollection** ppiUsersColl
47// );
48static HRESULT FindObjectForApplicationRole(
49 CPI_APPLICATION_ROLE* pItm,
50 ICatalogObject** ppiRoleObj
51 );
52static HRESULT AddApplicationRoleToActionData(
53 CPI_APPLICATION_ROLE* pItm,
54 int iActionType,
55 int iActionCost,
56 LPWSTR* ppwzActionData
57 );
58static HRESULT AddUserInApplicationRoleToActionData(
59 CPI_USER_IN_APPLICATION_ROLE* pItm,
60 int iActionType,
61 int iActionCost,
62 LPWSTR* ppwzActionData
63 );
64
65
66// function definitions
67
68void CpiApplicationRoleListFree(
69 CPI_APPLICATION_ROLE_LIST* pList
70 )
71{
72 CPI_APPLICATION_ROLE* pItm = pList->pFirst;
73
74 while (pItm)
75 {
76 CPI_APPLICATION_ROLE* pDelete = pItm;
77 pItm = pItm->pNext;
78 FreeApplicationRole(pDelete);
79 }
80}
81
82HRESULT CpiApplicationRolesRead(
83 CPI_APPLICATION_LIST* pAppList,
84 CPI_APPLICATION_ROLE_LIST* pAppRoleList
85 )
86{
87 HRESULT hr = S_OK;
88 UINT er = ERROR_SUCCESS;
89
90 PMSIHANDLE hView, hRec;
91
92 CPI_APPLICATION_ROLE* pItm = NULL;
93 LPWSTR pwzData = NULL;
94 BOOL fMatchingArchitecture = FALSE;
95
96 // loop through all application roles
97 hr = WcaOpenExecuteView(vcsApplicationRoleQuery, &hView);
98 ExitOnFailure(hr, "Failed to execute view on ComPlusApplicationRole table");
99
100 while (S_OK == (hr = WcaFetchRecord(hView, &hRec)))
101 {
102 // get component
103 hr = WcaGetRecordString(hRec, arqComponent, &pwzData);
104 ExitOnFailure(hr, "Failed to get component");
105
106 // check if the component is our processor architecture
107 if (pwzData && *pwzData)
108 {
109 hr = CpiVerifyComponentArchitecure(pwzData, &fMatchingArchitecture);
110 ExitOnFailure(hr, "Failed to get component architecture.");
111
112 if (!fMatchingArchitecture)
113 {
114 continue; // not the same architecture, ignore
115 }
116 }
117
118 // create entry
119 pItm = (CPI_APPLICATION_ROLE*)::HeapAlloc(::GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(CPI_APPLICATION_ROLE));
120 if (!pItm)
121 ExitFunction1(hr = E_OUTOFMEMORY);
122
123 // get component install state
124 if (pwzData && *pwzData)
125 {
126 pItm->fHasComponent = TRUE;
127
128 er = ::MsiGetComponentStateW(WcaGetInstallHandle(), pwzData, &pItm->isInstalled, &pItm->isAction);
129 ExitOnFailure(hr = HRESULT_FROM_WIN32(er), "Failed to get component state");
130 }
131
132 // get key
133 hr = WcaGetRecordString(hRec, arqApplicationRole, &pwzData);
134 ExitOnFailure(hr, "Failed to get key");
135 StringCchCopyW(pItm->wzKey, countof(pItm->wzKey), pwzData);
136
137 // get application
138 hr = WcaGetRecordString(hRec, arqApplication, &pwzData);
139 ExitOnFailure(hr, "Failed to get application");
140
141 hr = CpiApplicationFindByKey(pAppList, pwzData, &pItm->pApplication);
142 if (S_FALSE == hr)
143 hr = HRESULT_FROM_WIN32(ERROR_NOT_FOUND);
144 ExitOnFailure(hr, "Failed to find application, key: %S", pwzData);
145
146 // get name
147 hr = WcaGetRecordFormattedString(hRec, arqName, &pwzData);
148 ExitOnFailure(hr, "Failed to get name");
149 StringCchCopyW(pItm->wzName, countof(pItm->wzName), pwzData);
150
151 // get properties
152 if (CpiTableExists(cptComPlusApplicationRoleProperty))
153 {
154 hr = CpiPropertiesRead(vcsApplicationRolePropertyQuery, pItm->wzKey, pdlApplicationRoleProperties, &pItm->pProperties, &pItm->iPropertyCount);
155 ExitOnFailure(hr, "Failed to get properties");
156 }
157
158 // set references & increment counters
159 if (pItm->fHasComponent)
160 {
161 if (WcaIsInstalling(pItm->isInstalled, pItm->isAction))
162 {
163 CpiApplicationAddReferenceInstall(pItm->pApplication);
164 pAppRoleList->iInstallCount++;
165 }
166 if (WcaIsUninstalling(pItm->isInstalled, pItm->isAction))
167 {
168 CpiApplicationAddReferenceUninstall(pItm->pApplication);
169 pAppRoleList->iUninstallCount++;
170 }
171 }
172
173 // add entry
174 if (pAppRoleList->pFirst)
175 pItm->pNext = pAppRoleList->pFirst;
176 pAppRoleList->pFirst = pItm;
177 pItm = NULL;
178 }
179
180 if (E_NOMOREITEMS == hr)
181 hr = S_OK;
182
183LExit:
184 // clean up
185 if (pItm)
186 FreeApplicationRole(pItm);
187
188 ReleaseStr(pwzData);
189
190 return hr;
191}
192
193HRESULT CpiApplicationRolesVerifyInstall(
194 CPI_APPLICATION_ROLE_LIST* pList
195 )
196{
197 HRESULT hr = S_OK;
198 UINT er = ERROR_SUCCESS;
199
200 ICatalogObject* piRoleObj = NULL;
201
202 for (CPI_APPLICATION_ROLE* pItm = pList->pFirst; pItm; pItm = pItm->pNext)
203 {
204 // referenced locaters or roles that are being installed
205 if (!pItm->fReferencedForInstall && !(pItm->fHasComponent && WcaIsInstalling(pItm->isInstalled, pItm->isAction)))
206 continue;
207
208 // if the role is referensed and is not a locater, it must be installed
209 if (pItm->fReferencedForInstall && pItm->fHasComponent && !CpiWillBeInstalled(pItm->isInstalled, pItm->isAction))
210 MessageExitOnFailure(hr = E_FAIL, msierrComPlusApplicationRoleDependency, "An application role is used by another entity being installed, but is not installed itself, key: %S", pItm->wzKey);
211
212 // role is a locater
213 if (!pItm->fHasComponent)
214 {
215 // get collection object for role
216 hr = FindObjectForApplicationRole(pItm, &piRoleObj);
217 ExitOnFailure(hr, "Failed to find collection object for role");
218
219 // if the role was not found
220 if (S_FALSE == hr)
221 MessageExitOnFailure(hr = HRESULT_FROM_WIN32(ERROR_NOT_FOUND), msierrComPlusApplicationRoleNotFound, "An application role required by this installation was not found, key: %S", pItm->wzKey);
222 }
223
224 // role is supposed to be created
225 else if (!CpiIsInstalled(pItm->isInstalled))
226 {
227 do {
228 // find roles with conflicting name or id
229 hr = FindObjectForApplicationRole(pItm, NULL);
230 ExitOnFailure(hr, "Failed to find collection object for role");
231
232 if (S_OK == hr)
233 {
234 er = WcaErrorMessage(msierrComPlusApplicationRoleConflict, hr, INSTALLMESSAGE_ERROR | MB_ABORTRETRYIGNORE, 0);
235 switch (er)
236 {
237 case IDABORT:
238 ExitOnFailure(hr = E_FAIL, "An application with a conflictiong name exists, key: %S", pItm->wzKey);
239 break;
240 case IDRETRY:
241 break;
242 case IDIGNORE:
243 default:
244 hr = S_FALSE; // indicate that this is not a conflict
245 }
246 }
247 } while (S_OK == hr); // hr = S_FALSE if we don't have any conflicts
248 }
249
250 // clean up
251 ReleaseNullObject(piRoleObj);
252 }
253
254 hr = S_OK;
255
256LExit:
257 // clean up
258 ReleaseObject(piRoleObj);
259
260 return hr;
261}
262
263HRESULT CpiApplicationRolesVerifyUninstall(
264 CPI_APPLICATION_ROLE_LIST* pList
265 )
266{
267 HRESULT hr = S_OK;
268
269 for (CPI_APPLICATION_ROLE* pItm = pList->pFirst; pItm; pItm = pItm->pNext)
270 {
271 // referenced locaters or roles that are being installed
272 if (!pItm->fReferencedForUninstall && !(pItm->fHasComponent && WcaIsUninstalling(pItm->isInstalled, pItm->isAction)))
273 continue;
274
275 // get collection object for role
276 hr = FindObjectForApplicationRole(pItm, NULL);
277 ExitOnFailure(hr, "Failed to find collection object for role");
278
279 // if the role was not found
280 if (S_FALSE == hr)
281 {
282 pItm->fObjectNotFound = TRUE;
283 if (pItm->fHasComponent)
284 pList->iUninstallCount--; // elements with the fObjectNotFound flag set will not be scheduled for uninstall
285 }
286 }
287
288 hr = S_OK;
289
290LExit:
291 return hr;
292}
293
294void CpiApplicationRoleAddReferenceInstall(
295 CPI_APPLICATION_ROLE* pItm
296 )
297{
298 pItm->fReferencedForInstall = TRUE;
299 CpiApplicationAddReferenceInstall(pItm->pApplication);
300}
301
302void CpiApplicationRoleAddReferenceUninstall(
303 CPI_APPLICATION_ROLE* pItm
304 )
305{
306 pItm->fReferencedForUninstall = TRUE;
307 CpiApplicationAddReferenceUninstall(pItm->pApplication);
308}
309
310HRESULT CpiApplicationRolesInstall(
311 CPI_APPLICATION_ROLE_LIST* pList,
312 int iRunMode,
313 LPWSTR* ppwzActionData,
314 int* piProgress
315 )
316{
317 HRESULT hr = S_OK;
318
319 int iActionType;
320
321 // add action text
322 hr = CpiAddActionTextToActionData(L"CreateComPlusApplicationRoles", ppwzActionData);
323 ExitOnFailure(hr, "Failed to add action text to custom action data");
324
325 // add count to action data
326 hr = WcaWriteIntegerToCaData(pList->iInstallCount, ppwzActionData);
327 ExitOnFailure(hr, "Failed to add count to custom action data");
328
329 // add roles to custom action data
330 for (CPI_APPLICATION_ROLE* pItm = pList->pFirst; pItm; pItm = pItm->pNext)
331 {
332 // roles that are being installed only
333 if (!WcaIsInstalling(pItm->isInstalled, pItm->isAction))
334 continue;
335
336 // action type
337 if (rmRollback == iRunMode)
338 {
339 if (CpiIsInstalled(pItm->isInstalled))
340 iActionType = atNoOp;
341 else
342 iActionType = atRemove;
343 }
344 else
345 iActionType = atCreate;
346
347 // add to action data
348 hr = AddApplicationRoleToActionData(pItm, iActionType, COST_APPLICATION_ROLE_CREATE, ppwzActionData);
349 ExitOnFailure(hr, "Failed to add application role to custom action data, key: %S", pItm->wzKey);
350 }
351
352 // add progress tics
353 if (piProgress)
354 *piProgress += COST_APPLICATION_ROLE_CREATE * pList->iInstallCount;
355
356 hr = S_OK;
357
358LExit:
359 return hr;
360}
361
362HRESULT CpiApplicationRolesUninstall(
363 CPI_APPLICATION_ROLE_LIST* pList,
364 int iRunMode,
365 LPWSTR* ppwzActionData,
366 int* piProgress
367 )
368{
369 HRESULT hr = S_OK;
370
371 int iActionType;
372
373 // add action text
374 hr = CpiAddActionTextToActionData(L"RemoveComPlusApplicationRoles", ppwzActionData);
375 ExitOnFailure(hr, "Failed to add action text to custom action data");
376
377 // add count to action data
378 hr = WcaWriteIntegerToCaData(pList->iUninstallCount, ppwzActionData);
379 ExitOnFailure(hr, "Failed to add count to custom action data");
380
381 // add roles to custom action data
382 for (CPI_APPLICATION_ROLE* pItm = pList->pFirst; pItm; pItm = pItm->pNext)
383 {
384 // roles that are being uninstalled only
385 if (pItm->fObjectNotFound || !WcaIsUninstalling(pItm->isInstalled, pItm->isAction))
386 continue;
387
388 // action type
389 if (rmRollback == iRunMode)
390 iActionType = atCreate;
391 else
392 iActionType = atRemove;
393
394 // add to action data
395 hr = AddApplicationRoleToActionData(pItm, iActionType, COST_APPLICATION_ROLE_DELETE, ppwzActionData);
396 ExitOnFailure(hr, "Failed to add application role to custom action data, key: %S", pItm->wzKey);
397 }
398
399 // add progress tics
400 if (piProgress)
401 *piProgress += COST_APPLICATION_ROLE_DELETE * pList->iUninstallCount;
402
403 hr = S_OK;
404
405LExit:
406 return hr;
407}
408
409HRESULT CpiApplicationRoleFindByKey(
410 CPI_APPLICATION_ROLE_LIST* pList,
411 LPCWSTR pwzKey,
412 CPI_APPLICATION_ROLE** ppAppRole
413 )
414{
415 for (CPI_APPLICATION_ROLE* pItm = pList->pFirst; pItm; pItm = pItm->pNext)
416 {
417 if (0 == lstrcmpW(pItm->wzKey, pwzKey))
418 {
419 *ppAppRole = pItm;
420 return S_OK;
421 }
422 }
423
424 return S_FALSE;
425}
426
427void CpiUserInApplicationRoleListFree(
428 CPI_USER_IN_APPLICATION_ROLE_LIST* pList
429 )
430{
431 CPI_USER_IN_APPLICATION_ROLE* pItm = pList->pFirst;
432
433 while (pItm)
434 {
435 CPI_USER_IN_APPLICATION_ROLE* pDelete = pItm;
436 pItm = pItm->pNext;
437 FreeUserInApplicationRole(pDelete);
438 }
439}
440
441HRESULT CpiUsersInApplicationRolesRead(
442 CPI_APPLICATION_ROLE_LIST* pAppRoleList,
443 CPI_USER_IN_APPLICATION_ROLE_LIST* pUsrInAppRoleList
444 )
445{
446 HRESULT hr = S_OK;
447
448 // read users in application roles
449 if (CpiTableExists(cptComPlusUserInApplicationRole))
450 {
451 hr = TrusteesInApplicationRolesRead(vcsUserInApplicationRoleQuery, pAppRoleList, pUsrInAppRoleList);
452 ExitOnFailure(hr, "Failed to read users in application roles");
453 }
454
455 // read groups in application roles
456 if (CpiTableExists(cptComPlusGroupInApplicationRole))
457 {
458 hr = TrusteesInApplicationRolesRead(vcsGroupInApplicationRoleQuery, pAppRoleList, pUsrInAppRoleList);
459 ExitOnFailure(hr, "Failed to read groups in application roles");
460 }
461
462 hr = S_OK;
463
464LExit:
465 return hr;
466}
467
468HRESULT CpiUsersInApplicationRolesInstall(
469 CPI_USER_IN_APPLICATION_ROLE_LIST* pList,
470 int iRunMode,
471 LPWSTR* ppwzActionData,
472 int* piProgress
473 )
474{
475 HRESULT hr = S_OK;
476
477 int iActionType;
478
479 // add action text
480 hr = CpiAddActionTextToActionData(L"AddUsersToComPlusApplicationRoles", ppwzActionData);
481 ExitOnFailure(hr, "Failed to add action text to custom action data");
482
483 // add count to action data
484 hr = WcaWriteIntegerToCaData(pList->iInstallCount, ppwzActionData);
485 ExitOnFailure(hr, "Failed to add count to custom action data");
486
487 // add roles to custom action data
488 for (CPI_USER_IN_APPLICATION_ROLE* pItm = pList->pFirst; pItm; pItm = pItm->pNext)
489 {
490 // roles that are being installed only
491 if (!WcaIsInstalling(pItm->isInstalled, pItm->isAction))
492 continue;
493
494 // action type
495 if (rmRollback == iRunMode)
496 {
497 if (CpiIsInstalled(pItm->isInstalled))
498 iActionType = atNoOp;
499 else
500 iActionType = atRemove;
501 }
502 else
503 iActionType = atCreate;
504
505 // add to action data
506 hr = AddUserInApplicationRoleToActionData(pItm, iActionType, COST_USER_IN_APPLICATION_ROLE_CREATE, ppwzActionData);
507 ExitOnFailure(hr, "Failed to add user in application role to custom action data, key: %S", pItm->wzKey);
508 }
509
510 // add progress tics
511 if (piProgress)
512 *piProgress += COST_USER_IN_APPLICATION_ROLE_CREATE * pList->iInstallCount;
513
514 hr = S_OK;
515
516LExit:
517 return hr;
518}
519
520HRESULT CpiUsersInApplicationRolesUninstall(
521 CPI_USER_IN_APPLICATION_ROLE_LIST* pList,
522 int iRunMode,
523 LPWSTR* ppwzActionData,
524 int* piProgress
525 )
526{
527 HRESULT hr = S_OK;
528
529 int iActionType;
530
531 // add action text
532 hr = CpiAddActionTextToActionData(L"RemoveUsersFromComPlusAppRoles", ppwzActionData);
533 ExitOnFailure(hr, "Failed to add action text to custom action data");
534
535 // add count to action data
536 hr = WcaWriteIntegerToCaData(pList->iUninstallCount, ppwzActionData);
537 ExitOnFailure(hr, "Failed to add count to custom action data");
538
539 // add roles to custom action data
540 for (CPI_USER_IN_APPLICATION_ROLE* pItm = pList->pFirst; pItm; pItm = pItm->pNext)
541 {
542 // roles that are being uninstalled only
543 if (!WcaIsUninstalling(pItm->isInstalled, pItm->isAction))
544 continue;
545
546 // action type
547 if (rmRollback == iRunMode)
548 iActionType = atCreate;
549 else
550 iActionType = atRemove;
551
552 // add to action data
553 hr = AddUserInApplicationRoleToActionData(pItm, iActionType, COST_USER_IN_APPLICATION_ROLE_DELETE, ppwzActionData);
554 ExitOnFailure(hr, "Failed to add user in application role to custom action data, key: %S", pItm->wzKey);
555 }
556
557 // add progress tics
558 if (piProgress)
559 *piProgress += COST_USER_IN_APPLICATION_ROLE_DELETE * pList->iUninstallCount;
560
561 hr = S_OK;
562
563LExit:
564 return hr;
565}
566
567
568// helper function definitions
569
570static HRESULT TrusteesInApplicationRolesRead(
571 LPCWSTR pwzQuery,
572 CPI_APPLICATION_ROLE_LIST* pAppRoleList,
573 CPI_USER_IN_APPLICATION_ROLE_LIST* pUsrInAppRoleList
574 )
575{
576 HRESULT hr = S_OK;
577 UINT er = ERROR_SUCCESS;
578
579 PMSIHANDLE hView, hRec;
580
581 CPI_USER_IN_APPLICATION_ROLE* pItm = NULL;
582 LPWSTR pwzData = NULL;
583 LPWSTR pwzDomain = NULL;
584 LPWSTR pwzName = NULL;
585 BOOL fMatchingArchitecture = FALSE;
586
587 // loop through all application roles
588 hr = WcaOpenExecuteView(pwzQuery, &hView);
589 ExitOnFailure(hr, "Failed to execute view on table");
590
591 while (S_OK == (hr = WcaFetchRecord(hView, &hRec)))
592 {
593 // get component
594 hr = WcaGetRecordString(hRec, tiarqComponent, &pwzData);
595 ExitOnFailure(hr, "Failed to get component");
596
597 // check if the component is our processor architecture
598 hr = CpiVerifyComponentArchitecure(pwzData, &fMatchingArchitecture);
599 ExitOnFailure(hr, "Failed to get component architecture.");
600
601 if (!fMatchingArchitecture)
602 {
603 continue; // not the same architecture, ignore
604 }
605
606 // create entry
607 pItm = (CPI_USER_IN_APPLICATION_ROLE*)::HeapAlloc(::GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(CPI_USER_IN_APPLICATION_ROLE));
608 if (!pItm)
609 ExitFunction1(hr = E_OUTOFMEMORY);
610
611 // get component install state
612 er = ::MsiGetComponentStateW(WcaGetInstallHandle(), pwzData, &pItm->isInstalled, &pItm->isAction);
613 ExitOnFailure(hr = HRESULT_FROM_WIN32(er), "Failed to get component state");
614
615 // get key
616 hr = WcaGetRecordString(hRec, tiarqUserInApplicationRole, &pwzData);
617 ExitOnFailure(hr, "Failed to get key");
618 StringCchCopyW(pItm->wzKey, countof(pItm->wzKey), pwzData);
619
620 // get application role
621 hr = WcaGetRecordString(hRec, tiarqApplicationRole, &pwzData);
622 ExitOnFailure(hr, "Failed to get application role");
623
624 hr = CpiApplicationRoleFindByKey(pAppRoleList, pwzData, &pItm->pApplicationRole);
625 if (S_FALSE == hr)
626 hr = HRESULT_FROM_WIN32(ERROR_NOT_FOUND);
627 ExitOnFailure(hr, "Failed to find application role, key: %S", pwzData);
628
629 // get user domain
630 hr = WcaGetRecordFormattedString(hRec, tiarqDomain, &pwzDomain);
631 ExitOnFailure(hr, "Failed to get domain");
632
633 // get user name
634 hr = WcaGetRecordFormattedString(hRec, tiarqName, &pwzName);
635 ExitOnFailure(hr, "Failed to get name");
636
637 // build account name
638 hr = CpiBuildAccountName(pwzDomain, pwzName, &pItm->pwzAccount);
639 ExitOnFailure(hr, "Failed to build account name");
640
641 // set references & increment counters
642 if (WcaIsInstalling(pItm->isInstalled, pItm->isAction))
643 {
644 CpiApplicationRoleAddReferenceInstall(pItm->pApplicationRole);
645 pUsrInAppRoleList->iInstallCount++;
646 }
647 if (WcaIsUninstalling(pItm->isInstalled, pItm->isAction))
648 {
649 CpiApplicationRoleAddReferenceUninstall(pItm->pApplicationRole);
650 pUsrInAppRoleList->iUninstallCount++;
651 }
652
653 // add entry
654 if (pUsrInAppRoleList->pFirst)
655 pItm->pNext = pUsrInAppRoleList->pFirst;
656 pUsrInAppRoleList->pFirst = pItm;
657 pItm = NULL;
658 }
659
660 if (E_NOMOREITEMS == hr)
661 hr = S_OK;
662
663LExit:
664 // clean up
665 if (pItm)
666 FreeUserInApplicationRole(pItm);
667
668 ReleaseStr(pwzData);
669 ReleaseStr(pwzDomain);
670 ReleaseStr(pwzName);
671
672 return hr;
673}
674
675static void FreeApplicationRole(
676 CPI_APPLICATION_ROLE* pItm
677 )
678{
679 if (pItm->pProperties)
680 CpiPropertiesFreeList(pItm->pProperties);
681
682 ReleaseObject(pItm->piUsersColl);
683
684 ::HeapFree(::GetProcessHeap(), 0, pItm);
685}
686
687static void FreeUserInApplicationRole(
688 CPI_USER_IN_APPLICATION_ROLE* pItm
689 )
690{
691 ReleaseStr(pItm->pwzAccount);
692
693 ::HeapFree(::GetProcessHeap(), 0, pItm);
694}
695
696//static HRESULT GetUsersCollForApplicationRole(
697// CPI_APPLICATION_ROLE* pAppRole,
698// ICatalogCollection** ppiUsersColl
699// )
700//{
701// HRESULT hr = S_OK;
702//
703// ICatalogCollection* piRoleColl = NULL;
704// ICatalogObject* piRoleObj = NULL;
705//
706// // if a previous attempt to locate the collection object failed
707// if (pAppRole->fObjectNotFound)
708// ExitFunction1(hr = S_FALSE);
709//
710// // get applications collection
711// if (!pAppRole->piUsersColl)
712// {
713// // get collection object for role
714// hr = FindObjectForApplicationRole(pAppRole, &piRoleObj);
715// ExitOnFailure(hr, "Failed to find collection object for role");
716//
717// if (S_FALSE == hr)
718// ExitFunction(); // exit with hr = S_FALSE
719//
720// // get users collection
721// hr = CpiGetCatalogCollection(piRoleColl, piRoleObj, L"UsersInRole", &pAppRole->piUsersColl);
722// ExitOnFailure(hr, "Failed to get users in role collection");
723// }
724//
725// // return value
726// *ppiUsersColl = pAppRole->piUsersColl;
727// (*ppiUsersColl)->AddRef();
728//
729// hr = S_OK;
730//
731//LExit:
732// // clean up
733// ReleaseObject(piRoleColl);
734// ReleaseObject(piRoleObj);
735//
736// return hr;
737//}
738
739static HRESULT FindObjectForApplicationRole(
740 CPI_APPLICATION_ROLE* pItm,
741 ICatalogObject** ppiRoleObj
742 )
743{
744 HRESULT hr = S_OK;
745
746 ICatalogCollection* piRoleColl = NULL;
747
748 // get roles collection
749 hr = CpiGetRolesCollForApplication(pItm->pApplication, &piRoleColl);
750 ExitOnFailure(hr, "Failed to get collection");
751
752 if (S_FALSE == hr)
753 ExitFunction(); // exit with hr = S_FALSE
754
755 // find role object
756 hr = CpiFindCollectionObject(piRoleColl, NULL, pItm->wzName, ppiRoleObj);
757 ExitOnFailure(hr, "Failed to find object");
758
759 // exit with hr from CpiFindCollectionObject()
760
761LExit:
762 // clean up
763 ReleaseObject(piRoleColl);
764
765 return hr;
766}
767
768static HRESULT AddApplicationRoleToActionData(
769 CPI_APPLICATION_ROLE* pItm,
770 int iActionType,
771 int iActionCost,
772 LPWSTR* ppwzActionData
773 )
774{
775 HRESULT hr = S_OK;
776
777 // add action information to custom action data
778 hr = WcaWriteIntegerToCaData(iActionType, ppwzActionData);
779 ExitOnFailure(hr, "Failed to add action type to custom action data");
780 hr = WcaWriteIntegerToCaData(iActionCost, ppwzActionData);
781 ExitOnFailure(hr, "Failed to add action cost to custom action data");
782
783 // add application role information to custom action data
784 hr = WcaWriteStringToCaData(pItm->wzKey, ppwzActionData);
785 ExitOnFailure(hr, "Failed to add application role key to custom action data");
786 hr = WcaWriteStringToCaData(pItm->wzName, ppwzActionData);
787 ExitOnFailure(hr, "Failed to add application role name to custom action data");
788
789 // add application information to custom action data
790 hr = WcaWriteStringToCaData(pItm->pApplication->wzID, ppwzActionData);
791 ExitOnFailure(hr, "Failed to add application id to custom action data");
792
793 // add partition information to custom action data
794 hr = WcaWriteStringToCaData(pItm->pApplication->pPartition ? pItm->pApplication->pPartition->wzID : L"", ppwzActionData);
795 ExitOnFailure(hr, "Failed to add partition id to custom action data");
796
797 // add properties to custom action data
798 hr = CpiAddPropertiesToActionData(atCreate == iActionType ? pItm->iPropertyCount : 0, pItm->pProperties, ppwzActionData);
799 ExitOnFailure(hr, "Failed to add properties to custom action data");
800
801 hr = S_OK;
802
803LExit:
804 return hr;
805}
806
807static HRESULT AddUserInApplicationRoleToActionData(
808 CPI_USER_IN_APPLICATION_ROLE* pItm,
809 int iActionType,
810 int iActionCost,
811 LPWSTR* ppwzActionData
812 )
813{
814 HRESULT hr = S_OK;
815
816 // add action information to custom action data
817 hr = WcaWriteIntegerToCaData(iActionType, ppwzActionData);
818 ExitOnFailure(hr, "Failed to add action type to custom action data");
819 hr = WcaWriteIntegerToCaData(iActionCost, ppwzActionData);
820 ExitOnFailure(hr, "Failed to add action cost to custom action data");
821
822 // add application role information to custom action data
823 hr = WcaWriteStringToCaData(pItm->wzKey, ppwzActionData);
824 ExitOnFailure(hr, "Failed to add key to custom action data");
825 hr = WcaWriteStringToCaData(pItm->pApplicationRole->wzName, ppwzActionData);
826 ExitOnFailure(hr, "Failed to add role name to custom action data");
827 hr = WcaWriteStringToCaData(pItm->pwzAccount, ppwzActionData);
828 ExitOnFailure(hr, "Failed to add user account to custom action data");
829
830 // add application information to custom action data
831 CPI_APPLICATION* pApplication = pItm->pApplicationRole->pApplication;
832 hr = WcaWriteStringToCaData(pApplication->wzID, ppwzActionData);
833 ExitOnFailure(hr, "Failed to add application id to custom action data");
834
835 // add partition information to custom action data
836 hr = WcaWriteStringToCaData(pApplication->pPartition ? pApplication->pPartition->wzID : L"", ppwzActionData);
837 ExitOnFailure(hr, "Failed to add partition id to custom action data");
838
839 hr = S_OK;
840
841LExit:
842 return hr;
843}
diff --git a/src/ext/ComPlus/ca/cpapprolesched.h b/src/ext/ComPlus/ca/cpapprolesched.h
new file mode 100644
index 00000000..02852eef
--- /dev/null
+++ b/src/ext/ComPlus/ca/cpapprolesched.h
@@ -0,0 +1,112 @@
1#pragma once
2// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
3
4
5struct CPI_APPLICATION_ROLE
6{
7 WCHAR wzKey[MAX_DARWIN_KEY + 1];
8 WCHAR wzName[MAX_DARWIN_COLUMN + 1];
9
10 int iPropertyCount;
11 CPI_PROPERTY* pProperties;
12
13 BOOL fHasComponent;
14 BOOL fReferencedForInstall;
15 BOOL fReferencedForUninstall;
16 BOOL fObjectNotFound;
17
18 INSTALLSTATE isInstalled, isAction;
19
20 CPI_APPLICATION* pApplication;
21
22 ICatalogCollection* piUsersColl;
23
24 CPI_APPLICATION_ROLE* pNext;
25};
26
27struct CPI_APPLICATION_ROLE_LIST
28{
29 CPI_APPLICATION_ROLE* pFirst;
30
31 int iInstallCount;
32 int iUninstallCount;
33};
34
35struct CPI_USER_IN_APPLICATION_ROLE
36{
37 WCHAR wzKey[MAX_DARWIN_KEY + 1];
38 LPWSTR pwzAccount;
39
40 INSTALLSTATE isInstalled, isAction;
41
42 CPI_APPLICATION_ROLE* pApplicationRole;
43
44 CPI_USER_IN_APPLICATION_ROLE* pNext;
45};
46
47struct CPI_USER_IN_APPLICATION_ROLE_LIST
48{
49 CPI_USER_IN_APPLICATION_ROLE* pFirst;
50
51 int iInstallCount;
52 int iUninstallCount;
53};
54
55
56// function prototypes
57
58void CpiApplicationRoleListFree(
59 CPI_APPLICATION_ROLE_LIST* pList
60 );
61HRESULT CpiApplicationRolesRead(
62 CPI_APPLICATION_LIST* pAppList,
63 CPI_APPLICATION_ROLE_LIST* pAppRoleList
64 );
65HRESULT CpiApplicationRolesVerifyInstall(
66 CPI_APPLICATION_ROLE_LIST* pList
67 );
68HRESULT CpiApplicationRolesVerifyUninstall(
69 CPI_APPLICATION_ROLE_LIST* pList
70 );
71void CpiApplicationRoleAddReferenceInstall(
72 CPI_APPLICATION_ROLE* pItm
73 );
74void CpiApplicationRoleAddReferenceUninstall(
75 CPI_APPLICATION_ROLE* pItm
76 );
77HRESULT CpiApplicationRolesInstall(
78 CPI_APPLICATION_ROLE_LIST* pList,
79 int iRunMode,
80 LPWSTR* ppwzActionData,
81 int* piProgress
82 );
83HRESULT CpiApplicationRolesUninstall(
84 CPI_APPLICATION_ROLE_LIST* pList,
85 int iRunMode,
86 LPWSTR* ppwzActionData,
87 int* piProgress
88 );
89HRESULT CpiApplicationRoleFindByKey(
90 CPI_APPLICATION_ROLE_LIST* pList,
91 LPCWSTR pwzKey,
92 CPI_APPLICATION_ROLE** ppAppRole
93 );
94void CpiUserInApplicationRoleListFree(
95 CPI_USER_IN_APPLICATION_ROLE_LIST* pList
96 );
97HRESULT CpiUsersInApplicationRolesRead(
98 CPI_APPLICATION_ROLE_LIST* pAppRoleList,
99 CPI_USER_IN_APPLICATION_ROLE_LIST* pUsrInAppRoleList
100 );
101HRESULT CpiUsersInApplicationRolesInstall(
102 CPI_USER_IN_APPLICATION_ROLE_LIST* pList,
103 int iRunMode,
104 LPWSTR* ppwzActionData,
105 int* piProgress
106 );
107HRESULT CpiUsersInApplicationRolesUninstall(
108 CPI_USER_IN_APPLICATION_ROLE_LIST* pList,
109 int iRunMode,
110 LPWSTR* ppwzActionData,
111 int* piProgress
112 );
diff --git a/src/ext/ComPlus/ca/cpappsched.cpp b/src/ext/ComPlus/ca/cpappsched.cpp
new file mode 100644
index 00000000..1fb2203b
--- /dev/null
+++ b/src/ext/ComPlus/ca/cpappsched.cpp
@@ -0,0 +1,752 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3#include "precomp.h"
4
5
6// sql queries
7
8LPCWSTR vcsApplicationQuery =
9 L"SELECT `Application`, `Component_`, `Partition_`, `Id`, `Name` FROM `ComPlusApplication`";
10enum eApplicationQuery { aqApplication = 1, aqComponent, aqPartition, aqID, aqName };
11
12LPCWSTR vcsApplicationPropertyQuery =
13 L"SELECT `Name`, `Value` FROM `ComPlusApplicationProperty` WHERE `Application_` = ?";
14
15
16// property definitions
17
18CPI_PROPERTY_DEFINITION pdlApplicationProperties[] =
19{
20 {L"3GigSupportEnabled", cpptBoolean, 500},
21 {L"AccessChecksLevel", cpptInteger, 500},
22 {L"Activation", cpptInteger, 500},
23 {L"ApplicationAccessChecksEnabled", cpptBoolean, 500},
24 {L"ApplicationDirectory", cpptString, 501},
25 {L"Authentication", cpptInteger, 500},
26 {L"AuthenticationCapability", cpptInteger, 500},
27 {L"Changeable", cpptBoolean, 500},
28 {L"CommandLine", cpptString, 500},
29 {L"ConcurrentApps", cpptInteger, 501},
30 {L"CreatedBy", cpptString, 500},
31 {L"CRMEnabled", cpptBoolean, 500},
32 {L"CRMLogFile", cpptString, 500},
33 {L"Deleteable", cpptBoolean, 500},
34 {L"Description", cpptString, 500},
35 {L"DumpEnabled", cpptBoolean, 501},
36 {L"DumpOnException", cpptBoolean, 501},
37 {L"DumpOnFailfast", cpptBoolean, 501},
38 {L"DumpPath", cpptString, 501},
39 {L"EventsEnabled", cpptBoolean, 500},
40 {L"Identity", cpptString, 500},
41 {L"ImpersonationLevel", cpptInteger, 500},
42 {L"IsEnabled", cpptBoolean, 501},
43 {L"MaxDumpCount", cpptInteger, 501},
44 {L"Password", cpptString, 500},
45 {L"QCAuthenticateMsgs", cpptInteger, 501},
46 {L"QCListenerMaxThreads", cpptInteger, 501},
47 {L"QueueListenerEnabled", cpptBoolean, 500},
48 {L"QueuingEnabled", cpptBoolean, 500},
49 {L"RecycleActivationLimit", cpptInteger, 501},
50 {L"RecycleCallLimit", cpptInteger, 501},
51 {L"RecycleExpirationTimeout", cpptInteger, 501},
52 {L"RecycleLifetimeLimit", cpptInteger, 501},
53 {L"RecycleMemoryLimit", cpptInteger, 501},
54 {L"Replicable", cpptBoolean, 501},
55 {L"RunForever", cpptBoolean, 500},
56 {L"ShutdownAfter", cpptInteger, 500},
57 {L"SoapActivated", cpptBoolean, 502},
58 {L"SoapBaseUrl", cpptString, 502},
59 {L"SoapMailTo", cpptString, 502},
60 {L"SoapVRoot", cpptString, 502},
61 {L"SRPEnabled", cpptBoolean, 501},
62 {L"SRPTrustLevel", cpptInteger, 501},
63 {NULL, cpptNone, 0}
64};
65
66
67// prototypes for private helper functions
68
69static void FreeApplication(
70 CPI_APPLICATION* pItm
71 );
72static HRESULT FindObjectForApplication(
73 CPI_APPLICATION* pItm,
74 BOOL fFindId,
75 BOOL fFindName,
76 ICatalogObject** ppiAppObj
77 );
78static HRESULT AddApplicationToActionData(
79 CPI_APPLICATION* pItm,
80 int iActionType,
81 int iActionCost,
82 LPWSTR* ppwzActionData
83 );
84
85
86// function definitions
87
88void CpiApplicationListFree(
89 CPI_APPLICATION_LIST* pList
90 )
91{
92 CPI_APPLICATION* pItm = pList->pFirst;
93
94 while (pItm)
95 {
96 CPI_APPLICATION* pDelete = pItm;
97 pItm = pItm->pNext;
98 FreeApplication(pDelete);
99 }
100}
101
102HRESULT CpiApplicationsRead(
103 CPI_PARTITION_LIST* pPartList,
104 CPI_APPLICATION_LIST* pAppList
105 )
106{
107 HRESULT hr = S_OK;
108 UINT er = ERROR_SUCCESS;
109
110 int iVersionNT = 0;
111
112 PMSIHANDLE hView, hRec;
113
114 CPI_APPLICATION* pItm = NULL;
115 LPWSTR pwzData = NULL;
116 BOOL fMatchingArchitecture = FALSE;
117
118 // get NT version
119 hr = WcaGetIntProperty(L"VersionNT", &iVersionNT);
120 ExitOnFailure(hr, "Failed to get VersionNT property");
121
122 // loop through all applications
123 hr = WcaOpenExecuteView(vcsApplicationQuery, &hView);
124 ExitOnFailure(hr, "Failed to execute view on ComPlusApplication table");
125
126 while (S_OK == (hr = WcaFetchRecord(hView, &hRec)))
127 {
128 // get component
129 hr = WcaGetRecordString(hRec, aqComponent, &pwzData);
130 ExitOnFailure(hr, "Failed to get component");
131
132 // check if the component is our processor architecture
133 if (pwzData && *pwzData)
134 {
135 hr = CpiVerifyComponentArchitecure(pwzData, &fMatchingArchitecture);
136 ExitOnFailure(hr, "Failed to get component architecture.");
137
138 if (!fMatchingArchitecture)
139 {
140 continue; // not the same architecture, ignore
141 }
142 }
143
144 // create entry
145 pItm = (CPI_APPLICATION*)::HeapAlloc(::GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(CPI_APPLICATION));
146 if (!pItm)
147 ExitFunction1(hr = E_OUTOFMEMORY);
148
149 // get component install state
150 if (pwzData && *pwzData)
151 {
152 pItm->fHasComponent = TRUE;
153
154 er = ::MsiGetComponentStateW(WcaGetInstallHandle(), pwzData, &pItm->isInstalled, &pItm->isAction);
155 ExitOnFailure(hr = HRESULT_FROM_WIN32(er), "Failed to get component state");
156 }
157
158 // get key
159 hr = WcaGetRecordString(hRec, aqApplication, &pwzData);
160 ExitOnFailure(hr, "Failed to get key");
161 StringCchCopyW(pItm->wzKey, countof(pItm->wzKey), pwzData);
162
163 // get partition
164 if (502 <= iVersionNT)
165 {
166 hr = WcaGetRecordString(hRec, aqPartition, &pwzData);
167 ExitOnFailure(hr, "Failed to get partition");
168
169 if (pwzData && *pwzData)
170 {
171 hr = CpiPartitionFindByKey(pPartList, pwzData, &pItm->pPartition);
172 ExitOnFailure(hr, "Failed to find partition, key: %S", pwzData);
173 }
174 }
175
176 // get id
177 hr = WcaGetRecordFormattedString(hRec, aqID, &pwzData);
178 ExitOnFailure(hr, "Failed to get id");
179
180 if (pwzData && *pwzData)
181 {
182 hr = PcaGuidToRegFormat(pwzData, pItm->wzID, countof(pItm->wzID));
183 ExitOnFailure(hr, "Failed to parse id guid value, key: %S, value: '%S'", pItm->wzKey, pwzData);
184 }
185
186 // get name
187 hr = WcaGetRecordFormattedString(hRec, aqName, &pwzData);
188 ExitOnFailure(hr, "Failed to get name");
189 StringCchCopyW(pItm->wzName, countof(pItm->wzName), pwzData);
190
191 // if application is a locater, either an id or a name must be provided
192 if (!pItm->fHasComponent && !*pItm->wzID && !*pItm->wzName)
193 ExitOnFailure(hr = E_FAIL, "An application locater must have either an id or a name associated, key: %S", pItm->wzKey);
194
195 // if application is not a locater, an name must be provided
196 if (pItm->fHasComponent && !*pItm->wzName)
197 ExitOnFailure(hr = E_FAIL, "An application must have a name associated, key: %S", pItm->wzKey);
198
199 // get properties
200 if (CpiTableExists(cptComPlusApplicationProperty) && pItm->fHasComponent)
201 {
202 hr = CpiPropertiesRead(vcsApplicationPropertyQuery, pItm->wzKey, pdlApplicationProperties, &pItm->pProperties, &pItm->iPropertyCount);
203 ExitOnFailure(hr, "Failed to get properties");
204 }
205
206 // set references & increment counters
207 if (pItm->fHasComponent)
208 {
209 if (WcaIsInstalling(pItm->isInstalled, pItm->isAction))
210 {
211 if (pItm->pPartition)
212 CpiPartitionAddReferenceInstall(pItm->pPartition);
213 pAppList->iInstallCount++;
214 }
215 if (WcaIsUninstalling(pItm->isInstalled, pItm->isAction))
216 {
217 if (pItm->pPartition)
218 CpiPartitionAddReferenceUninstall(pItm->pPartition);
219 pAppList->iUninstallCount++;
220 }
221 }
222
223 // add entry
224 if (pAppList->pFirst)
225 pItm->pNext = pAppList->pFirst;
226 pAppList->pFirst = pItm;
227 pItm = NULL;
228 }
229
230 if (E_NOMOREITEMS == hr)
231 hr = S_OK;
232
233LExit:
234 // clean up
235 if (pItm)
236 FreeApplication(pItm);
237
238 ReleaseStr(pwzData);
239
240 return hr;
241}
242
243HRESULT CpiApplicationsVerifyInstall(
244 CPI_APPLICATION_LIST* pList
245 )
246{
247 HRESULT hr = S_OK;
248 UINT er = ERROR_SUCCESS;
249
250 ICatalogObject* piAppObj = NULL;
251
252 for (CPI_APPLICATION* pItm = pList->pFirst; pItm; pItm = pItm->pNext)
253 {
254 // referenced locaters or applications that are being installed
255 if (!pItm->fReferencedForInstall && !(pItm->fHasComponent && WcaIsInstalling(pItm->isInstalled, pItm->isAction)))
256 continue;
257
258 // if the application is referensed and is not a locater, it must be installed
259 if (pItm->fReferencedForInstall && pItm->fHasComponent && !CpiWillBeInstalled(pItm->isInstalled, pItm->isAction))
260 MessageExitOnFailure(hr = E_FAIL, msierrComPlusApplicationDependency, "An application is used by another entity being installed, but is not installed itself, key: %S", pItm->wzKey);
261
262 // application is supposed to exist
263 if (!pItm->fHasComponent || CpiIsInstalled(pItm->isInstalled))
264 {
265 // get collection object for application
266 hr = FindObjectForApplication(pItm, 0 != *pItm->wzID, 0 == *pItm->wzID, &piAppObj);
267 ExitOnFailure(hr, "Failed to find collection object for application");
268
269 // if the application was found
270 if (S_OK == hr)
271 {
272 // if we don't have an id, copy id from object
273 if (!*pItm->wzID)
274 {
275 hr = CpiGetKeyForObject(piAppObj, pItm->wzID, countof(pItm->wzID));
276 ExitOnFailure(hr, "Failed to get id");
277 }
278 }
279
280 // if the application was not found
281 else
282 {
283 // if the application is a locater, this is an error
284 if (!pItm->fHasComponent)
285 MessageExitOnFailure(hr = HRESULT_FROM_WIN32(ERROR_NOT_FOUND), msierrComPlusApplicationNotFound, "An application required by this installation was not found, key: %S", pItm->wzKey);
286
287 // create a new id if one is missing
288 if (!*pItm->wzID)
289 {
290 hr = CpiCreateId(pItm->wzID, countof(pItm->wzID));
291 ExitOnFailure(hr, "Failed to create id");
292 }
293 }
294 }
295
296 // application is supposed to be created
297 else
298 {
299 // check for conflicts
300 do {
301 if (*pItm->wzID)
302 {
303 // find applications with conflicting id
304 hr = FindObjectForApplication(pItm, TRUE, FALSE, &piAppObj);
305 ExitOnFailure(hr, "Failed to find collection object for application");
306
307 if (S_FALSE == hr)
308 {
309 // find applications with conflicting name
310 hr = FindObjectForApplication(pItm, FALSE, TRUE, &piAppObj);
311 ExitOnFailure(hr, "Failed to find collection object for application");
312
313 if (S_OK == hr)
314 // "A application with a conflictiong name exists. retry cancel"
315 er = WcaErrorMessage(msierrComPlusApplicationNameConflict, hr, INSTALLMESSAGE_ERROR | MB_RETRYCANCEL, 0);
316 else
317 break; // no conflicting entry found, break loop
318 }
319 else
320 // "A application with a conflicting id exists. abort retry ignore"
321 er = WcaErrorMessage(msierrComPlusApplicationIdConflict, hr, INSTALLMESSAGE_ERROR | MB_ABORTRETRYIGNORE, 0);
322 }
323 else
324 {
325 // find applications with conflicting name
326 hr = FindObjectForApplication(pItm, FALSE, TRUE, &piAppObj);
327 ExitOnFailure(hr, "Failed to find collection object for application");
328
329 if (S_OK == hr)
330 // "A subscription with a conflictiong name exists. abort retry ignore"
331 er = WcaErrorMessage(msierrComPlusApplicationNameConflict, hr, INSTALLMESSAGE_ERROR | MB_ABORTRETRYIGNORE, 0);
332 else
333 break; // no conflicting entry found, break loop
334 }
335
336 switch (er)
337 {
338 case IDCANCEL:
339 case IDABORT:
340 ExitOnFailure(hr = E_FAIL, "An application with a conflictiong name or id exists, key: %S", pItm->wzKey);
341 break;
342 case IDRETRY:
343 break;
344 case IDIGNORE:
345 default:
346 // if we don't have an id, copy id from object
347 if (!*pItm->wzID)
348 {
349 hr = CpiGetKeyForObject(piAppObj, pItm->wzID, countof(pItm->wzID));
350 ExitOnFailure(hr, "Failed to get id");
351 }
352 hr = S_FALSE; // indicate that this is not a conflict
353 }
354 } while (S_OK == hr); // hr = S_FALSE if we don't have any conflicts
355
356 // create a new id if one is missing
357 if (!*pItm->wzID)
358 {
359 hr = CpiCreateId(pItm->wzID, countof(pItm->wzID));
360 ExitOnFailure(hr, "Failed to create id");
361 }
362 }
363
364 // clean up
365 ReleaseNullObject(piAppObj);
366 }
367
368 hr = S_OK;
369
370LExit:
371 // clean up
372 ReleaseObject(piAppObj);
373
374 return hr;
375}
376
377HRESULT CpiApplicationsVerifyUninstall(
378 CPI_APPLICATION_LIST* pList
379 )
380{
381 HRESULT hr = S_OK;
382 ICatalogObject* piAppObj = NULL;
383
384 for (CPI_APPLICATION* pItm = pList->pFirst; pItm; pItm = pItm->pNext)
385 {
386 // referenced locaters or applications that are being installed
387 if (!pItm->fReferencedForUninstall && !(pItm->fHasComponent && WcaIsUninstalling(pItm->isInstalled, pItm->isAction)))
388 continue;
389
390 // get collection object for application
391 hr = FindObjectForApplication(pItm, 0 != *pItm->wzID, 0 == *pItm->wzID, &piAppObj);
392 ExitOnFailure(hr, "Failed to find collection object for application");
393
394 // if the application was found
395 if (S_OK == hr)
396 {
397 // if we don't have an id, copy id from object
398 if (!*pItm->wzID)
399 {
400 hr = CpiGetKeyForObject(piAppObj, pItm->wzID, countof(pItm->wzID));
401 ExitOnFailure(hr, "Failed to get id");
402 }
403 }
404
405 // if the application was not found
406 else
407 {
408 pItm->fObjectNotFound = TRUE;
409 if (pItm->fHasComponent)
410 pList->iUninstallCount--; // elements with the fObjectNotFound flag set will not be scheduled for uninstall
411 }
412
413 // clean up
414 ReleaseNullObject(piAppObj);
415 }
416
417 hr = S_OK;
418
419LExit:
420 // clean up
421 ReleaseObject(piAppObj);
422
423 return hr;
424}
425
426void CpiApplicationAddReferenceInstall(
427 CPI_APPLICATION* pItm
428 )
429{
430 pItm->fReferencedForInstall = TRUE;
431 if (pItm->pPartition)
432 CpiPartitionAddReferenceInstall(pItm->pPartition);
433}
434
435void CpiApplicationAddReferenceUninstall(
436 CPI_APPLICATION* pItm
437 )
438{
439 pItm->fReferencedForUninstall = TRUE;
440 if (pItm->pPartition)
441 CpiPartitionAddReferenceUninstall(pItm->pPartition);
442}
443
444HRESULT CpiApplicationsInstall(
445 CPI_APPLICATION_LIST* pList,
446 int iRunMode,
447 LPWSTR* ppwzActionData,
448 int* piProgress
449 )
450{
451 HRESULT hr = S_OK;
452
453 int iActionType;
454
455 // add action text
456 hr = CpiAddActionTextToActionData(L"CreateComPlusApplications", ppwzActionData);
457 ExitOnFailure(hr, "Failed to add action text to custom action data");
458
459 // add applicaton count to action data
460 hr = WcaWriteIntegerToCaData(pList->iInstallCount, ppwzActionData);
461 ExitOnFailure(hr, "Failed to add count to custom action data");
462
463 // add applications to custom action data
464 for (CPI_APPLICATION* pItm = pList->pFirst; pItm; pItm = pItm->pNext)
465 {
466 // applications that are being installed only
467 if (!pItm->fHasComponent || !WcaIsInstalling(pItm->isInstalled, pItm->isAction))
468 continue;
469
470 // action type
471 if (rmRollback == iRunMode)
472 {
473 if (CpiIsInstalled(pItm->isInstalled))
474 iActionType = atNoOp;
475 else
476 iActionType = atRemove;
477 }
478 else
479 iActionType = atCreate;
480
481 // add to action data
482 hr = AddApplicationToActionData(pItm, iActionType, COST_APPLICATION_CREATE, ppwzActionData);
483 ExitOnFailure(hr, "Failed to add applicaton to custom action data, key: %S", pItm->wzKey);
484 }
485
486 // add progress tics
487 if (piProgress)
488 *piProgress += COST_APPLICATION_CREATE * pList->iInstallCount;
489
490 hr = S_OK;
491
492LExit:
493 return hr;
494}
495
496HRESULT CpiApplicationsUninstall(
497 CPI_APPLICATION_LIST* pList,
498 int iRunMode,
499 LPWSTR* ppwzActionData,
500 int* piProgress
501 )
502{
503 HRESULT hr = S_OK;
504
505 int iActionType;
506
507 // add action text
508 hr = CpiAddActionTextToActionData(L"RemoveComPlusApplications", ppwzActionData);
509 ExitOnFailure(hr, "Failed to add action text to custom action data");
510
511 // add applicaton count to action data
512 hr = WcaWriteIntegerToCaData(pList->iUninstallCount, ppwzActionData);
513 ExitOnFailure(hr, "Failed to add count to custom action data");
514
515 // add applications to custom action data
516 for (CPI_APPLICATION* pItm = pList->pFirst; pItm; pItm = pItm->pNext)
517 {
518 // applications that are being uninstalled only
519 if (!pItm->fHasComponent || !WcaIsUninstalling(pItm->isInstalled, pItm->isAction))
520 continue;
521
522 // action type
523 if (rmRollback == iRunMode)
524 iActionType = atCreate;
525 else
526 iActionType = atRemove;
527
528 // add to action data
529 hr = AddApplicationToActionData(pItm, iActionType, COST_APPLICATION_DELETE, ppwzActionData);
530 ExitOnFailure(hr, "Failed to add applicaton to custom action data, key: %S", pItm->wzKey);
531 }
532
533 // add progress tics
534 if (piProgress)
535 *piProgress += COST_APPLICATION_DELETE * pList->iUninstallCount;
536
537 hr = S_OK;
538
539LExit:
540 return hr;
541}
542
543HRESULT CpiApplicationFindByKey(
544 CPI_APPLICATION_LIST* pList,
545 LPCWSTR pwzKey,
546 CPI_APPLICATION** ppApp
547 )
548{
549 for (CPI_APPLICATION* pItm = pList->pFirst; pItm; pItm = pItm->pNext)
550 {
551 if (0 == lstrcmpW(pItm->wzKey, pwzKey))
552 {
553 *ppApp = pItm;
554 return S_OK;
555 }
556 }
557
558 return S_FALSE;
559}
560
561HRESULT CpiGetRolesCollForApplication(
562 CPI_APPLICATION* pApp,
563 ICatalogCollection** ppiRolesColl
564 )
565{
566 HRESULT hr = S_OK;
567
568 ICatalogCollection* piAppColl = NULL;
569 ICatalogObject* piAppObj = NULL;
570
571 // if a previous attempt to locate the collection object failed
572 if (pApp->fObjectNotFound)
573 ExitFunction1(hr = S_FALSE);
574
575 // get applications collection
576 if (!pApp->piRolesColl)
577 {
578 // get applications collection
579 if (pApp->pPartition)
580 hr = CpiGetApplicationsCollForPartition(pApp->pPartition, &piAppColl);
581 else
582 hr = CpiSchedGetApplicationsCollection(&piAppColl);
583 ExitOnFailure(hr, "Failed to get applications collection");
584
585 if (S_FALSE == hr)
586 ExitFunction(); // exit with hr = S_FALSE
587
588 // find application object
589 hr = CpiFindCollectionObject(piAppColl, pApp->wzID, *pApp->wzID ? NULL : pApp->wzName, &piAppObj);
590 ExitOnFailure(hr, "Failed to find application object");
591
592 if (S_FALSE == hr)
593 ExitFunction(); // exit with hr = S_FALSE
594
595 // get roles collection
596 hr = CpiSchedGetCatalogCollection(piAppColl, piAppObj, L"Roles", &pApp->piRolesColl);
597 ExitOnFailure(hr, "Failed to get roles collection");
598 }
599
600 // return value
601 *ppiRolesColl = pApp->piRolesColl;
602 (*ppiRolesColl)->AddRef();
603
604 hr = S_OK;
605
606LExit:
607 // clean up
608 ReleaseObject(piAppColl);
609 ReleaseObject(piAppObj);
610
611 return hr;
612}
613
614HRESULT CpiGetComponentsCollForApplication(
615 CPI_APPLICATION* pApp,
616 ICatalogCollection** ppiCompsColl
617 )
618{
619 HRESULT hr = S_OK;
620
621 ICatalogCollection* piAppColl = NULL;
622 ICatalogObject* piAppObj = NULL;
623
624 // if a previous attempt to locate the collection object failed
625 if (pApp->fObjectNotFound)
626 ExitFunction1(hr = S_FALSE);
627
628 // get applications collection
629 if (!pApp->piCompsColl)
630 {
631 // get applications collection
632 if (pApp->pPartition)
633 hr = CpiGetApplicationsCollForPartition(pApp->pPartition, &piAppColl);
634 else
635 hr = CpiSchedGetApplicationsCollection(&piAppColl);
636 ExitOnFailure(hr, "Failed to get applications collection");
637
638 if (S_FALSE == hr)
639 ExitFunction(); // exit with hr = S_FALSE
640
641 // find application object
642 hr = CpiFindCollectionObject(piAppColl, pApp->wzID, *pApp->wzID ? NULL : pApp->wzName, &piAppObj);
643 ExitOnFailure(hr, "Failed to find application object");
644
645 if (S_FALSE == hr)
646 ExitFunction(); // exit with hr = S_FALSE
647
648 // get roles collection
649 hr = CpiSchedGetCatalogCollection(piAppColl, piAppObj, L"Components", &pApp->piCompsColl);
650 ExitOnFailure(hr, "Failed to get components collection");
651 }
652
653 // return value
654 *ppiCompsColl = pApp->piCompsColl;
655 (*ppiCompsColl)->AddRef();
656
657 hr = S_OK;
658
659LExit:
660 // clean up
661 ReleaseObject(piAppColl);
662 ReleaseObject(piAppObj);
663
664 return hr;
665}
666
667
668// helper function definitions
669
670static void FreeApplication(
671 CPI_APPLICATION* pItm
672 )
673{
674 if (pItm->pProperties)
675 CpiPropertiesFreeList(pItm->pProperties);
676
677 ReleaseObject(pItm->piRolesColl);
678 ReleaseObject(pItm->piCompsColl);
679
680 ::HeapFree(::GetProcessHeap(), 0, pItm);
681}
682
683static HRESULT FindObjectForApplication(
684 CPI_APPLICATION* pItm,
685 BOOL fFindId,
686 BOOL fFindName,
687 ICatalogObject** ppiAppObj
688 )
689{
690 HRESULT hr = S_OK;
691
692 ICatalogCollection* piAppColl = NULL;
693
694 // get applications collection
695 if (pItm->pPartition)
696 hr = CpiGetApplicationsCollForPartition(pItm->pPartition, &piAppColl);
697 else
698 hr = CpiSchedGetApplicationsCollection(&piAppColl);
699 ExitOnFailure(hr, "Failed to get applications collection");
700
701 if (S_FALSE == hr)
702 ExitFunction(); // exit with hr = S_FALSE
703
704 // find application object
705 hr = CpiFindCollectionObject(piAppColl, fFindId ? pItm->wzID : NULL, fFindName ? pItm->wzName : NULL, ppiAppObj);
706 ExitOnFailure(hr, "Failed to find application object");
707
708 // exit with hr from CpiFindCollectionObject()
709
710LExit:
711 // clean up
712 ReleaseObject(piAppColl);
713
714 return hr;
715}
716
717static HRESULT AddApplicationToActionData(
718 CPI_APPLICATION* pItm,
719 int iActionType,
720 int iActionCost,
721 LPWSTR* ppwzActionData
722 )
723{
724 HRESULT hr = S_OK;
725
726 // add action information to custom action data
727 hr = WcaWriteIntegerToCaData(iActionType, ppwzActionData);
728 ExitOnFailure(hr, "Failed to add action type to custom action data");
729 hr = WcaWriteIntegerToCaData(iActionCost, ppwzActionData);
730 ExitOnFailure(hr, "Failed to add action cost to custom action data");
731
732 // add application information to custom action data
733 hr = WcaWriteStringToCaData(pItm->wzKey, ppwzActionData);
734 ExitOnFailure(hr, "Failed to add application key to custom action data");
735 hr = WcaWriteStringToCaData(pItm->wzID, ppwzActionData);
736 ExitOnFailure(hr, "Failed to add application id to custom action data");
737 hr = WcaWriteStringToCaData(pItm->wzName, ppwzActionData);
738 ExitOnFailure(hr, "Failed to add application name to custom action data");
739
740 // add partition information to custom action data
741 hr = WcaWriteStringToCaData(pItm->pPartition ? pItm->pPartition->wzID : L"", ppwzActionData);
742 ExitOnFailure(hr, "Failed to add partition id to custom action data");
743
744 // add properties to custom action data
745 hr = CpiAddPropertiesToActionData(atCreate == iActionType ? pItm->iPropertyCount : 0, pItm->pProperties, ppwzActionData);
746 ExitOnFailure(hr, "Failed to add properties to custom action data");
747
748 hr = S_OK;
749
750LExit:
751 return hr;
752}
diff --git a/src/ext/ComPlus/ca/cpappsched.h b/src/ext/ComPlus/ca/cpappsched.h
new file mode 100644
index 00000000..2cd6a0ee
--- /dev/null
+++ b/src/ext/ComPlus/ca/cpappsched.h
@@ -0,0 +1,83 @@
1#pragma once
2// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
3
4
5struct CPI_APPLICATION
6{
7 WCHAR wzKey[MAX_DARWIN_KEY + 1];
8 WCHAR wzID[CPI_MAX_GUID + 1];
9 WCHAR wzName[MAX_DARWIN_COLUMN + 1];
10
11 int iPropertyCount;
12 CPI_PROPERTY* pProperties;
13
14 BOOL fHasComponent;
15 BOOL fReferencedForInstall;
16 BOOL fReferencedForUninstall;
17 BOOL fObjectNotFound;
18
19 INSTALLSTATE isInstalled, isAction;
20
21 CPI_PARTITION* pPartition;
22
23 ICatalogCollection* piRolesColl;
24 ICatalogCollection* piCompsColl;
25
26 CPI_APPLICATION* pNext;
27};
28
29struct CPI_APPLICATION_LIST
30{
31 CPI_APPLICATION* pFirst;
32
33 int iInstallCount;
34 int iUninstallCount;
35};
36
37
38// function prototypes
39
40void CpiApplicationListFree(
41 CPI_APPLICATION_LIST* pList
42 );
43HRESULT CpiApplicationsRead(
44 CPI_PARTITION_LIST* pPartList,
45 CPI_APPLICATION_LIST* pAppList
46 );
47HRESULT CpiApplicationsVerifyInstall(
48 CPI_APPLICATION_LIST* pList
49 );
50HRESULT CpiApplicationsVerifyUninstall(
51 CPI_APPLICATION_LIST* pList
52 );
53void CpiApplicationAddReferenceInstall(
54 CPI_APPLICATION* pItm
55 );
56void CpiApplicationAddReferenceUninstall(
57 CPI_APPLICATION* pItm
58 );
59HRESULT CpiApplicationsInstall(
60 CPI_APPLICATION_LIST* pList,
61 int iRunMode,
62 LPWSTR* ppwzActionData,
63 int* piProgress
64 );
65HRESULT CpiApplicationsUninstall(
66 CPI_APPLICATION_LIST* pList,
67 int iRunMode,
68 LPWSTR* ppwzActionData,
69 int* piProgress
70 );
71HRESULT CpiApplicationFindByKey(
72 CPI_APPLICATION_LIST* pList,
73 LPCWSTR pwzKey,
74 CPI_APPLICATION** ppApp
75 );
76HRESULT CpiGetRolesCollForApplication(
77 CPI_APPLICATION* pApp,
78 ICatalogCollection** ppiRolesColl
79 );
80HRESULT CpiGetComponentsCollForApplication(
81 CPI_APPLICATION* pApp,
82 ICatalogCollection** ppiCompsColl
83 );
diff --git a/src/ext/ComPlus/ca/cpasmexec.cpp b/src/ext/ComPlus/ca/cpasmexec.cpp
new file mode 100644
index 00000000..3d140027
--- /dev/null
+++ b/src/ext/ComPlus/ca/cpasmexec.cpp
@@ -0,0 +1,1877 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3#include "precomp.h"
4
5
6// GAC related declarations
7
8typedef struct _FUSION_INSTALL_REFERENCE_
9{
10 DWORD cbSize;
11 DWORD dwFlags;
12 GUID guidScheme;
13 LPCWSTR szIdentifier;
14 LPCWSTR szNonCannonicalData;
15} FUSION_INSTALL_REFERENCE;
16
17typedef struct _FUSION_INSTALL_REFERENCE_ *LPFUSION_INSTALL_REFERENCE;
18
19typedef const FUSION_INSTALL_REFERENCE *LPCFUSION_INSTALL_REFERENCE;
20
21typedef struct _ASSEMBLY_INFO
22{
23 ULONG cbAssemblyInfo;
24 DWORD dwAssemblyFlags;
25 ULARGE_INTEGER uliAssemblySizeInKB;
26 LPWSTR pszCurrentAssemblyPathBuf;
27 ULONG cchBuf;
28} ASSEMBLY_INFO;
29
30typedef interface IAssemblyCacheItem IAssemblyCacheItem;
31
32MIDL_INTERFACE("e707dcde-d1cd-11d2-bab9-00c04f8eceae")
33IAssemblyCache : public IUnknown
34{
35public:
36 virtual HRESULT STDMETHODCALLTYPE UninstallAssembly(
37 /* [in] */ DWORD dwFlags,
38 /* [in] */ LPCWSTR pszAssemblyName,
39 /* [in] */ LPCFUSION_INSTALL_REFERENCE pRefData,
40 /* [optional][out] */ ULONG *pulDisposition) = 0;
41
42 virtual HRESULT STDMETHODCALLTYPE QueryAssemblyInfo(
43 /* [in] */ DWORD dwFlags,
44 /* [in] */ LPCWSTR pszAssemblyName,
45 /* [out][in] */ ASSEMBLY_INFO *pAsmInfo) = 0;
46
47 virtual HRESULT STDMETHODCALLTYPE CreateAssemblyCacheItem(
48 /* [in] */ DWORD dwFlags,
49 /* [in] */ PVOID pvReserved,
50 /* [out] */ IAssemblyCacheItem **ppAsmItem,
51 /* [optional][in] */ LPCWSTR pszAssemblyName) = 0;
52
53 virtual HRESULT STDMETHODCALLTYPE CreateAssemblyScavenger(
54 /* [out] */ IUnknown **ppUnkReserved) = 0;
55
56 virtual HRESULT STDMETHODCALLTYPE InstallAssembly(
57 /* [in] */ DWORD dwFlags,
58 /* [in] */ LPCWSTR pszManifestFilePath,
59 /* [in] */ LPCFUSION_INSTALL_REFERENCE pRefData) = 0;
60};
61
62typedef HRESULT (__stdcall *LoadLibraryShimFunc)(LPCWSTR szDllName, LPCWSTR szVersion, LPVOID pvReserved, HMODULE *phModDll);
63typedef HRESULT (__stdcall *CreateAssemblyCacheFunc)(IAssemblyCache **ppAsmCache, DWORD dwReserved);
64
65
66// RegistrationHelper related declarations
67
68static const GUID CLSID_RegistrationHelper =
69 { 0x89a86e7b, 0xc229, 0x4008, { 0x9b, 0xaa, 0x2f, 0x5c, 0x84, 0x11, 0xd7, 0xe0 } };
70
71enum eInstallationFlags {
72 ifConfigureComponentsOnly = 16,
73 ifFindOrCreateTargetApplication = 4,
74 ifExpectExistingTypeLib = 1
75};
76
77
78// private structs
79
80struct CPIEXEC_ROLE_ASSIGNMENT
81{
82 WCHAR wzKey[MAX_DARWIN_KEY + 1];
83 WCHAR wzRoleName[MAX_DARWIN_COLUMN + 1];
84
85 CPIEXEC_ROLE_ASSIGNMENT* pNext;
86};
87
88struct CPIEXEC_METHOD
89{
90 WCHAR wzIndex[11 + 1];
91 WCHAR wzName[MAX_DARWIN_COLUMN + 1];
92
93 CPI_PROPERTY* pPropertyList;
94 CPIEXEC_ROLE_ASSIGNMENT* pRoleAssignmentList;
95
96 CPIEXEC_METHOD* pNext;
97};
98
99struct CPIEXEC_INTERFACE
100{
101 WCHAR wzIID[CPI_MAX_GUID + 1];
102
103 CPI_PROPERTY* pPropertyList;
104 CPIEXEC_ROLE_ASSIGNMENT* pRoleAssignmentList;
105 CPIEXEC_METHOD* pMethodList;
106
107 CPIEXEC_INTERFACE* pNext;
108};
109
110struct CPIEXEC_COMPONENT
111{
112 WCHAR wzCLSID[CPI_MAX_GUID + 1];
113
114 CPI_PROPERTY* pPropertyList;
115 CPIEXEC_ROLE_ASSIGNMENT* pRoleAssignmentList;
116 CPIEXEC_INTERFACE* pInterfaceList;
117
118 CPIEXEC_COMPONENT* pNext;
119};
120
121struct CPI_ASSEMBLY_ATTRIBUTES
122{
123 int iActionType;
124 int iActionCost;
125 LPWSTR pwzKey;
126 LPWSTR pwzAssemblyName;
127 LPWSTR pwzDllPath;
128 LPWSTR pwzTlbPath;
129 LPWSTR pwzPSDllPath;
130 LPWSTR pwzAppID;
131 LPWSTR pwzPartID;
132 int iAttributes;
133 CPIEXEC_COMPONENT* pCompList;
134};
135
136struct CPI_ROLE_ASSIGNMENTS_ATTRIBUTES
137{
138 int iActionType;
139 int iActionCost;
140 LPWSTR pwzKey;
141 LPWSTR pwzAppID;
142 LPWSTR pwzPartID;
143 int iRoleCount;
144 CPIEXEC_COMPONENT* pCompList;
145};
146
147
148// prototypes for private helper functions
149
150static HRESULT RegisterAssembly(
151 CPI_ASSEMBLY_ATTRIBUTES* pAttrs
152 );
153static HRESULT UnregisterAssembly(
154 CPI_ASSEMBLY_ATTRIBUTES* pAttrs
155 );
156static void InitAssemblyExec();
157static void UninitAssemblyExec();
158static HRESULT GetRegistrationHelper(
159 IDispatch** ppiRegHlp
160 );
161static HRESULT GetAssemblyCacheObject(
162 IAssemblyCache** ppAssemblyCache
163 );
164static HRESULT GetAssemblyPathFromGAC(
165 LPCWSTR pwzAssemblyName,
166 LPWSTR* ppwzAssemblyPath
167 );
168static HRESULT RegisterDotNetAssembly(
169 CPI_ASSEMBLY_ATTRIBUTES* pAttrs
170 );
171static HRESULT RegisterNativeAssembly(
172 CPI_ASSEMBLY_ATTRIBUTES* pAttrs
173 );
174static HRESULT UnregisterDotNetAssembly(
175 CPI_ASSEMBLY_ATTRIBUTES* pAttrs
176 );
177static HRESULT RemoveComponents(
178 ICatalogCollection* piCompColl,
179 CPIEXEC_COMPONENT* pCompList
180 );
181static HRESULT ReadAssemblyAttributes(
182 LPWSTR* ppwzData,
183 CPI_ASSEMBLY_ATTRIBUTES* pAttrs
184 );
185static void FreeAssemblyAttributes(
186 CPI_ASSEMBLY_ATTRIBUTES* pAttrs
187 );
188static HRESULT ReadRoleAssignmentsAttributes(
189 LPWSTR* ppwzData,
190 CPI_ROLE_ASSIGNMENTS_ATTRIBUTES* pAttrs
191 );
192static void FreeRoleAssignmentsAttributes(
193 CPI_ROLE_ASSIGNMENTS_ATTRIBUTES* pAttrs
194 );
195static HRESULT ConfigureComponents(
196 LPCWSTR pwzPartID,
197 LPCWSTR pwzAppID,
198 CPIEXEC_COMPONENT* pCompList,
199 BOOL fCreate,
200 BOOL fProgress
201 );
202static HRESULT ConfigureInterfaces(
203 ICatalogCollection* piCompColl,
204 ICatalogObject* piCompObj,
205 CPIEXEC_INTERFACE* pIntfList,
206 BOOL fCreate
207 );
208static HRESULT ConfigureMethods(
209 ICatalogCollection* piIntfColl,
210 ICatalogObject* piIntfObj,
211 CPIEXEC_METHOD* pMethList,
212 BOOL fCreate
213 );
214static HRESULT ConfigureRoleAssignments(
215 LPCWSTR pwzCollName,
216 ICatalogCollection* piCompColl,
217 ICatalogObject* piCompObj,
218 CPIEXEC_ROLE_ASSIGNMENT* pRoleList,
219 BOOL fCreate
220 );
221static HRESULT ReadComponentList(
222 LPWSTR* ppwzData,
223 CPIEXEC_COMPONENT** ppCompList
224 );
225static HRESULT ReadInterfaceList(
226 LPWSTR* ppwzData,
227 CPIEXEC_INTERFACE** ppIntfList
228 );
229static HRESULT ReadMethodList(
230 LPWSTR* ppwzData,
231 CPIEXEC_METHOD** ppMethList
232 );
233static HRESULT ReadRoleAssignmentList(
234 LPWSTR* ppwzData,
235 CPIEXEC_ROLE_ASSIGNMENT** ppRoleList
236 );
237static void FreeComponentList(
238 CPIEXEC_COMPONENT* pList
239 );
240static void FreeInterfaceList(
241 CPIEXEC_INTERFACE* pList
242 );
243static void FreeMethodList(
244 CPIEXEC_METHOD* pList
245 );
246static void FreeRoleAssignmentList(
247 CPIEXEC_ROLE_ASSIGNMENT* pList
248 );
249
250
251// variables
252
253static IDispatch* gpiRegHlp;
254static IAssemblyCache* gpAssemblyCache;
255static HMODULE ghMscoree;
256static HMODULE ghFusion;
257
258
259// function definitions
260
261HRESULT CpiConfigureAssemblies(
262 LPWSTR* ppwzData,
263 HANDLE hRollbackFile
264 )
265{
266 HRESULT hr = S_OK;
267
268 CPI_ASSEMBLY_ATTRIBUTES attrs;
269 ::ZeroMemory(&attrs, sizeof(attrs));
270
271 // initialize
272 InitAssemblyExec();
273
274 // read action text
275 hr = CpiActionStartMessage(ppwzData, FALSE);
276 ExitOnFailure(hr, "Failed to send action start message");
277
278 // get count
279 int iCnt = 0;
280 hr = WcaReadIntegerFromCaData(ppwzData, &iCnt);
281 ExitOnFailure(hr, "Failed to read count");
282
283 // write count to rollback file
284 hr = CpiWriteIntegerToRollbackFile(hRollbackFile, iCnt);
285 ExitOnFailure(hr, "Failed to write count to rollback file");
286
287 for (int i = 0; i < iCnt; i++)
288 {
289 // read attributes from CustomActionData
290 hr = ReadAssemblyAttributes(ppwzData, &attrs);
291 ExitOnFailure(hr, "Failed to read assembly attributes");
292
293 // write key to rollback file
294 hr = CpiWriteKeyToRollbackFile(hRollbackFile, attrs.pwzKey);
295 ExitOnFailure(hr, "Failed to write key to rollback file");
296
297 // action
298 switch (attrs.iActionType)
299 {
300 case atCreate:
301 hr = RegisterAssembly(&attrs);
302 ExitOnFailure(hr, "Failed to register assembly, key: %S", attrs.pwzKey);
303 break;
304 case atRemove:
305 hr = UnregisterAssembly(&attrs);
306 ExitOnFailure(hr, "Failed to unregister assembly, key: %S", attrs.pwzKey);
307 break;
308 default:
309 hr = S_OK;
310 break;
311 }
312
313 if (S_FALSE == hr)
314 ExitFunction(); // aborted by user
315
316 // write completion status to rollback file
317 hr = CpiWriteIntegerToRollbackFile(hRollbackFile, 1);
318 ExitOnFailure(hr, "Failed to write completion status to rollback file");
319
320 // progress
321 hr = WcaProgressMessage(attrs.iActionCost, FALSE);
322 ExitOnFailure(hr, "Failed to update progress");
323 }
324
325 hr = S_OK;
326
327LExit:
328 // clean up
329 FreeAssemblyAttributes(&attrs);
330
331 // uninitialize
332 UninitAssemblyExec();
333
334 return hr;
335}
336
337HRESULT CpiRollbackConfigureAssemblies(
338 LPWSTR* ppwzData,
339 CPI_ROLLBACK_DATA* pRollbackDataList
340 )
341{
342 HRESULT hr = S_OK;
343
344 int iRollbackStatus;
345
346 CPI_ASSEMBLY_ATTRIBUTES attrs;
347 ::ZeroMemory(&attrs, sizeof(attrs));
348
349 // initialize
350 InitAssemblyExec();
351
352 // read action text
353 hr = CpiActionStartMessage(ppwzData, NULL == pRollbackDataList);
354 ExitOnFailure(hr, "Failed to send action start message");
355
356 // get count
357 int iCnt = 0;
358 hr = WcaReadIntegerFromCaData(ppwzData, &iCnt);
359 ExitOnFailure(hr, "Failed to read count");
360
361 for (int i = 0; i < iCnt; i++)
362 {
363 // read attributes from CustomActionData
364 hr = ReadAssemblyAttributes(ppwzData, &attrs);
365 ExitOnFailure(hr, "Failed to read assembly attributes");
366
367 // rollback status
368 hr = CpiFindRollbackStatus(pRollbackDataList, attrs.pwzKey, &iRollbackStatus);
369
370 if (S_FALSE == hr)
371 continue; // not found, nothing to rollback
372
373 // action
374 switch (attrs.iActionType)
375 {
376 case atCreate:
377 hr = RegisterAssembly(&attrs);
378 if (FAILED(hr))
379 WcaLog(LOGMSG_STANDARD, "Failed to register assembly, hr: 0x%x, key: %S", hr, attrs.pwzKey);
380 break;
381 case atRemove:
382 hr = UnregisterAssembly(&attrs);
383 if (FAILED(hr))
384 WcaLog(LOGMSG_STANDARD, "Failed to unregister assembly, hr: 0x%x, key: %S", hr, attrs.pwzKey);
385 break;
386 }
387
388 // check rollback status
389 if (0 == iRollbackStatus)
390 continue; // operation did not complete, skip progress
391
392 // progress
393 hr = WcaProgressMessage(attrs.iActionCost, FALSE);
394 ExitOnFailure(hr, "Failed to update progress");
395 }
396
397 hr = S_OK;
398
399LExit:
400 // clean up
401 FreeAssemblyAttributes(&attrs);
402
403 // uninitialize
404 UninitAssemblyExec();
405
406 return hr;
407}
408
409HRESULT CpiConfigureRoleAssignments(
410 LPWSTR* ppwzData,
411 HANDLE hRollbackFile
412 )
413{
414 HRESULT hr = S_OK;
415
416 CPI_ROLE_ASSIGNMENTS_ATTRIBUTES attrs;
417 ::ZeroMemory(&attrs, sizeof(attrs));
418
419 // read action text
420 hr = CpiActionStartMessage(ppwzData, FALSE);
421 ExitOnFailure(hr, "Failed to send action start message");
422
423 // get count
424 int iCnt = 0;
425 hr = WcaReadIntegerFromCaData(ppwzData, &iCnt);
426 ExitOnFailure(hr, "Failed to read count");
427
428 // write count to rollback file
429 hr = CpiWriteIntegerToRollbackFile(hRollbackFile, iCnt);
430 ExitOnFailure(hr, "Failed to write count to rollback file");
431
432 for (int i = 0; i < iCnt; i++)
433 {
434 // read attributes from CustomActionData
435 hr = ReadRoleAssignmentsAttributes(ppwzData, &attrs);
436 ExitOnFailure(hr, "Failed to read role assignments attributes");
437
438 // write key to rollback file
439 hr = CpiWriteKeyToRollbackFile(hRollbackFile, attrs.pwzKey);
440 ExitOnFailure(hr, "Failed to write key to rollback file");
441
442 // action
443 if (atNoOp != attrs.iActionType)
444 {
445 hr = ConfigureComponents(attrs.pwzPartID, attrs.pwzAppID, attrs.pCompList, atCreate == attrs.iActionType, TRUE);
446 ExitOnFailure(hr, "Failed to configure components");
447
448 if (S_FALSE == hr)
449 ExitFunction(); // aborted by user
450 }
451
452 // write completion status to rollback file
453 hr = CpiWriteIntegerToRollbackFile(hRollbackFile, 1);
454 ExitOnFailure(hr, "Failed to write completion status to rollback file");
455
456 // progress
457 hr = WcaProgressMessage(attrs.iActionCost * attrs.iRoleCount, FALSE);
458 ExitOnFailure(hr, "Failed to update progress");
459 }
460
461 hr = S_OK;
462
463LExit:
464 // clean up
465 FreeRoleAssignmentsAttributes(&attrs);
466
467 return hr;
468}
469
470HRESULT CpiRollbackConfigureRoleAssignments(
471 LPWSTR* ppwzData,
472 CPI_ROLLBACK_DATA* pRollbackDataList
473 )
474{
475 HRESULT hr = S_OK;
476
477 int iRollbackStatus;
478
479 CPI_ROLE_ASSIGNMENTS_ATTRIBUTES attrs;
480 ::ZeroMemory(&attrs, sizeof(attrs));
481
482 // read action text
483 hr = CpiActionStartMessage(ppwzData, NULL == pRollbackDataList);
484 ExitOnFailure(hr, "Failed to send action start message");
485
486 // get count
487 int iCnt = 0;
488 hr = WcaReadIntegerFromCaData(ppwzData, &iCnt);
489 ExitOnFailure(hr, "Failed to read count");
490
491 for (int i = 0; i < iCnt; i++)
492 {
493 // read attributes from CustomActionData
494 hr = ReadRoleAssignmentsAttributes(ppwzData, &attrs);
495 ExitOnFailure(hr, "Failed to read role assignments attributes");
496
497 // rollback status
498 hr = CpiFindRollbackStatus(pRollbackDataList, attrs.pwzKey, &iRollbackStatus);
499
500 if (S_FALSE == hr)
501 continue; // not found, nothing to rollback
502
503 // action
504 if (atNoOp != attrs.iActionType)
505 {
506 hr = ConfigureComponents(attrs.pwzPartID, attrs.pwzAppID, attrs.pCompList, atCreate == attrs.iActionType, TRUE);
507 ExitOnFailure(hr, "Failed to configure components");
508
509 if (S_FALSE == hr)
510 ExitFunction(); // aborted by user
511 }
512
513 // check rollback status
514 if (0 == iRollbackStatus)
515 continue; // operation did not complete, skip progress
516
517 // progress
518 hr = WcaProgressMessage(attrs.iActionCost * attrs.iRoleCount, FALSE);
519 ExitOnFailure(hr, "Failed to update progress");
520 }
521
522 hr = S_OK;
523
524LExit:
525 // clean up
526 FreeRoleAssignmentsAttributes(&attrs);
527
528 return hr;
529}
530
531
532// helper function definitions
533
534static HRESULT RegisterAssembly(
535 CPI_ASSEMBLY_ATTRIBUTES* pAttrs
536 )
537{
538 HRESULT hr = S_OK;
539
540 // progress message
541 hr = CpiActionDataMessage(1, (pAttrs->iAttributes & aaPathFromGAC) ? pAttrs->pwzAssemblyName : pAttrs->pwzDllPath);
542 ExitOnFailure(hr, "Failed to send progress messages");
543
544 if (S_FALSE == hr)
545 ExitFunction(); // aborted by user
546
547 // log
548 WcaLog(LOGMSG_VERBOSE, "Registering assembly, key: %S", pAttrs->pwzKey);
549
550 // extract path from GAC
551 if (pAttrs->iAttributes & aaPathFromGAC)
552 {
553 hr = GetAssemblyPathFromGAC(pAttrs->pwzAssemblyName, &pAttrs->pwzDllPath);
554 if (S_FALSE == hr)
555 hr = HRESULT_FROM_WIN32(ERROR_NOT_FOUND);
556 ExitOnFailure(hr, "Failed to get path for assembly from GAC");
557
558 // log
559 WcaLog(LOGMSG_VERBOSE, "Assembly path extracted from GAC, key: %S, path: '%S'", pAttrs->pwzKey, pAttrs->pwzDllPath);
560 }
561
562 // .net assembly
563 if (pAttrs->iAttributes & aaDotNetAssembly)
564 {
565 hr = RegisterDotNetAssembly(pAttrs);
566 ExitOnFailure(hr, "Failed to register .NET assembly");
567 }
568
569 // native assembly
570 else
571 {
572 hr = RegisterNativeAssembly(pAttrs);
573 ExitOnFailure(hr, "Failed to register native assembly");
574 }
575
576 // configure components
577 if (pAttrs->pCompList)
578 {
579 hr = ConfigureComponents(pAttrs->pwzPartID, pAttrs->pwzAppID, pAttrs->pCompList, TRUE, FALSE);
580 ExitOnFailure(hr, "Failed to configure components");
581 }
582
583 hr = S_OK;
584
585LExit:
586 return hr;
587}
588
589static HRESULT UnregisterAssembly(
590 CPI_ASSEMBLY_ATTRIBUTES* pAttrs
591 )
592{
593 HRESULT hr = S_OK;
594
595 long lChanges = 0;
596
597 ICatalogCollection* piColl = NULL;
598 ICatalogObject* piObj = NULL;
599
600 // progress message
601 hr = CpiActionDataMessage(1, (pAttrs->iAttributes & aaPathFromGAC) ? pAttrs->pwzAssemblyName : pAttrs->pwzDllPath);
602 ExitOnFailure(hr, "Failed to send progress messages");
603
604 if (S_FALSE == hr)
605 ExitFunction(); // aborted by user
606
607 // log
608 WcaLog(LOGMSG_VERBOSE, "Unregistering assembly, key: %S", pAttrs->pwzKey);
609
610 // extract path from GAC
611 if (pAttrs->iAttributes & aaPathFromGAC)
612 {
613 hr = GetAssemblyPathFromGAC(pAttrs->pwzAssemblyName, &pAttrs->pwzDllPath);
614 ExitOnFailure(hr, "Failed to get path for assembly from GAC");
615
616 if (S_FALSE == hr)
617 {
618 WcaLog(LOGMSG_VERBOSE, "Unable to locate assembly in GAC, assembly will not be unregistered from COM+, key: %S", pAttrs->pwzKey);
619 ExitFunction1(hr = S_OK);
620 }
621
622 // log
623 WcaLog(LOGMSG_VERBOSE, "Assembly path extracted from GAC, key: %S, path: '%S'", pAttrs->pwzKey, pAttrs->pwzDllPath);
624 }
625
626 // .NET assembly
627 if (pAttrs->iAttributes & aaDotNetAssembly)
628 {
629 if (pAttrs->pwzAppID && *pAttrs->pwzAppID)
630 {
631 // When unregistering a .net assembly using the RegistrationHelper class, and the application is
632 // left empty after all components in the assembly are removed, the RegistrationHelper class also
633 // attempts to remove the application for some reason. However, it does not handle the situation
634 // when the application has its deleteable property set to false, and will simply fail if this is
635 // the case. This is the reason we are clearing the deleatable property of the application here.
636 //
637 // TODO: handle rollbacks
638
639 // get applications collection
640 hr = CpiExecGetApplicationsCollection(pAttrs->pwzPartID, &piColl);
641 ExitOnFailure(hr, "Failed to get applications collection");
642
643 if (S_FALSE == hr)
644 {
645 // applications collection not found
646 WcaLog(LOGMSG_VERBOSE, "Unable to retrieve applications collection, nothing to delete, key: %S", pAttrs->pwzKey);
647 ExitFunction1(hr = S_OK);
648 }
649
650 // find application object
651 hr = CpiFindCollectionObjectByStringKey(piColl, pAttrs->pwzAppID, &piObj);
652 ExitOnFailure(hr, "Failed to find application object");
653
654 if (S_FALSE == hr)
655 {
656 // application not found
657 WcaLog(LOGMSG_VERBOSE, "Unable to find application object, nothing to delete, key: %S", pAttrs->pwzKey);
658 ExitFunction1(hr = S_OK);
659 }
660
661 // reset deleteable property
662 hr = CpiResetObjectProperty(piColl, piObj, L"Deleteable");
663 ExitOnFailure(hr, "Failed to reset deleteable property");
664 }
665
666 // unregister assembly
667 hr = UnregisterDotNetAssembly(pAttrs);
668 ExitOnFailure(hr, "Failed to unregister .NET assembly");
669 }
670
671 // native assembly
672 else
673 {
674 // get components collection
675 hr = CpiGetComponentsCollection(pAttrs->pwzPartID, pAttrs->pwzAppID, &piColl);
676 ExitOnFailure(hr, "Failed to get components collection");
677
678 if (S_FALSE == hr)
679 {
680 // components collection not found
681 WcaLog(LOGMSG_VERBOSE, "Unable to retrieve components collection, nothing to delete, key: %S", pAttrs->pwzKey);
682 ExitFunction1(hr = S_OK);
683 }
684
685 // remove components
686 hr = RemoveComponents(piColl, pAttrs->pCompList);
687 ExitOnFailure(hr, "Failed to get remove components");
688
689 // save changes
690 hr = piColl->SaveChanges(&lChanges);
691 if (COMADMIN_E_OBJECTERRORS == hr)
692 CpiLogCatalogErrorInfo();
693 ExitOnFailure(hr, "Failed to save changes");
694 }
695
696 hr = S_OK;
697
698LExit:
699 // clean up
700 ReleaseObject(piColl);
701 ReleaseObject(piObj);
702
703 return hr;
704}
705
706static void InitAssemblyExec()
707{
708 gpiRegHlp = NULL;
709 gpAssemblyCache = NULL;
710 ghMscoree = NULL;
711 ghFusion = NULL;
712}
713
714static void UninitAssemblyExec()
715{
716 ReleaseObject(gpiRegHlp);
717 ReleaseObject(gpAssemblyCache);
718 if (ghFusion)
719 ::FreeLibrary(ghFusion);
720 if (ghMscoree)
721 ::FreeLibrary(ghMscoree);
722}
723
724static HRESULT GetRegistrationHelper(
725 IDispatch** ppiRegHlp
726 )
727{
728 HRESULT hr = S_OK;
729
730 if (!gpiRegHlp)
731 {
732 // create registration helper object
733 hr = ::CoCreateInstance(CLSID_RegistrationHelper, NULL, CLSCTX_ALL, IID_IDispatch, (void**)&gpiRegHlp);
734 ExitOnFailure(hr, "Failed to create registration helper object");
735 }
736
737 gpiRegHlp->AddRef();
738 *ppiRegHlp = gpiRegHlp;
739
740 hr = S_OK;
741
742LExit:
743 return hr;
744}
745
746static HRESULT GetAssemblyCacheObject(
747 IAssemblyCache** ppAssemblyCache
748 )
749{
750 HRESULT hr = S_OK;
751
752 if (!gpAssemblyCache)
753 {
754 // mscoree.dll
755 if (!ghMscoree)
756 {
757 // load mscoree.dll
758 ghMscoree = ::LoadLibraryW(L"mscoree.dll");
759 ExitOnNull(ghMscoree, hr, E_FAIL, "Failed to load mscoree.dll");
760 }
761
762 // fusion.dll
763 if (!ghFusion)
764 {
765 // get LoadLibraryShim function address
766 LoadLibraryShimFunc pfnLoadLibraryShim = (LoadLibraryShimFunc)::GetProcAddress(ghMscoree, "LoadLibraryShim");
767 ExitOnNull(pfnLoadLibraryShim, hr, HRESULT_FROM_WIN32(::GetLastError()), "Failed get address for LoadLibraryShim() function");
768
769 // load fusion.dll
770 hr = pfnLoadLibraryShim(L"fusion.dll", NULL, NULL, &ghFusion);
771 ExitOnFailure(hr, "Failed to load fusion.dll");
772 }
773
774 // get CreateAssemblyCache function address
775 CreateAssemblyCacheFunc pfnCreateAssemblyCache = (CreateAssemblyCacheFunc)::GetProcAddress(ghFusion, "CreateAssemblyCache");
776 ExitOnNull(pfnCreateAssemblyCache, hr, HRESULT_FROM_WIN32(::GetLastError()), "Failed get address for CreateAssemblyCache() function");
777
778 // create AssemblyCache object
779 hr = pfnCreateAssemblyCache(&gpAssemblyCache, 0);
780 ExitOnFailure(hr, "Failed to create AssemblyCache object");
781 }
782
783 gpAssemblyCache->AddRef();
784 *ppAssemblyCache = gpAssemblyCache;
785
786 hr = S_OK;
787
788LExit:
789 return hr;
790}
791
792static HRESULT GetAssemblyPathFromGAC(
793 LPCWSTR pwzAssemblyName,
794 LPWSTR* ppwzAssemblyPath
795 )
796{
797 HRESULT hr = S_OK;
798
799 IAssemblyCache* pAssemblyCache = NULL;
800
801 ASSEMBLY_INFO assemblyInfo;
802 WCHAR wzPathBuf[MAX_PATH];
803
804 ::ZeroMemory(&assemblyInfo, sizeof(ASSEMBLY_INFO));
805 ::ZeroMemory(wzPathBuf, countof(wzPathBuf));
806
807 // get AssemblyCache object
808 hr = GetAssemblyCacheObject(&pAssemblyCache);
809 ExitOnFailure(hr, "Failed to get AssemblyCache object");
810
811 // get assembly info
812 assemblyInfo.cbAssemblyInfo = sizeof(ASSEMBLY_INFO);
813 assemblyInfo.pszCurrentAssemblyPathBuf = wzPathBuf;
814 assemblyInfo.cchBuf = countof(wzPathBuf);
815
816 hr = pAssemblyCache->QueryAssemblyInfo(0, pwzAssemblyName, &assemblyInfo);
817 if (HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND) == hr)
818 ExitFunction1(hr = S_FALSE);
819 ExitOnFailure(hr, "Failed to get assembly info");
820
821 // copy assembly path
822 hr = StrAllocString(ppwzAssemblyPath, wzPathBuf, 0);
823 ExitOnFailure(hr, "Failed to copy assembly path");
824
825 hr = S_OK;
826
827LExit:
828 // clean up
829 ReleaseObject(pAssemblyCache);
830
831 return hr;
832}
833
834static HRESULT RegisterDotNetAssembly(
835 CPI_ASSEMBLY_ATTRIBUTES* pAttrs
836 )
837{
838 HRESULT hr = S_OK;
839
840 IDispatch* piRegHlp = NULL;
841
842 DISPID dispid;
843 BSTR bstrMember = NULL;
844
845 long lInstallationFlags = 0;
846
847 VARIANTARG rgvarg[5];
848 DISPPARAMS dispparams;
849 EXCEPINFO excepInfo;
850
851 BSTR bstrPartName = NULL;
852 BSTR bstrAppName = NULL;
853 BSTR bstrDllPath = NULL;
854 BSTR bstrTlbPath = NULL;
855
856 ::ZeroMemory(rgvarg, sizeof(rgvarg));
857 ::ZeroMemory(&dispparams, sizeof(dispparams));
858 ::ZeroMemory(&excepInfo, sizeof(excepInfo));
859
860 bstrMember = ::SysAllocString(L"InstallAssembly_2");
861 ExitOnNull(bstrMember, hr, E_OUTOFMEMORY, "Failed to allocate BSTR for method name");
862
863 // create BSTRs for parameters
864 if (pAttrs->pwzPartID && *pAttrs->pwzPartID)
865 {
866 bstrPartName = ::SysAllocString(pAttrs->pwzPartID);
867 ExitOnNull(bstrPartName, hr, E_OUTOFMEMORY, "Failed to allocate BSTR for partition id");
868 }
869
870 if (pAttrs->pwzAppID && *pAttrs->pwzAppID)
871 {
872 bstrAppName = ::SysAllocString(pAttrs->pwzAppID);
873 ExitOnNull(bstrAppName, hr, E_OUTOFMEMORY, "Failed to allocate BSTR for application id");
874 }
875
876 bstrDllPath = ::SysAllocString(pAttrs->pwzDllPath);
877 ExitOnNull(bstrDllPath, hr, E_OUTOFMEMORY, "Failed to allocate BSTR for dll path");
878
879 if (pAttrs->pwzTlbPath && *pAttrs->pwzTlbPath)
880 {
881 bstrTlbPath = ::SysAllocString(pAttrs->pwzTlbPath);
882 ExitOnNull(bstrTlbPath, hr, E_OUTOFMEMORY, "Failed to allocate BSTR for tlb path");
883 }
884
885 // get registration helper object
886 hr = GetRegistrationHelper(&piRegHlp);
887 ExitOnFailure(hr, "Failed to get registration helper object");
888
889 // get dispatch id of InstallAssembly() method
890 hr = piRegHlp->GetIDsOfNames(IID_NULL, &bstrMember, 1, LOCALE_USER_DEFAULT, &dispid);
891 ExitOnFailure(hr, "Failed to get dispatch id of InstallAssembly() method");
892
893 // set installation flags
894 lInstallationFlags = ifExpectExistingTypeLib;
895
896 if (!bstrAppName)
897 lInstallationFlags |= ifFindOrCreateTargetApplication;
898
899 // invoke InstallAssembly() method
900 rgvarg[0].vt = VT_I4;
901 rgvarg[0].lVal = lInstallationFlags;
902 rgvarg[1].vt = VT_BYREF|VT_BSTR;
903 rgvarg[1].pbstrVal = &bstrTlbPath;
904 rgvarg[2].vt = VT_BSTR;
905 rgvarg[2].bstrVal = bstrPartName;
906 rgvarg[3].vt = VT_BYREF|VT_BSTR;
907 rgvarg[3].pbstrVal = &bstrAppName;
908 rgvarg[4].vt = VT_BSTR;
909 rgvarg[4].bstrVal = bstrDllPath;
910 dispparams.rgvarg = rgvarg;
911 dispparams.cArgs = 5;
912 dispparams.cNamedArgs = 0;
913
914 hr = piRegHlp->Invoke(dispid, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &dispparams, NULL, &excepInfo, NULL);
915 if (DISP_E_EXCEPTION == hr)
916 {
917 // log exception information
918 if (!excepInfo.pfnDeferredFillIn || (excepInfo.pfnDeferredFillIn && SUCCEEDED(excepInfo.pfnDeferredFillIn(&excepInfo))))
919 {
920 WcaLog(LOGMSG_STANDARD, "ExceptionInfo: Code='%hu', Source='%S', Description='%S', HelpFile='%S', HelpContext='%u'",
921 excepInfo.wCode, excepInfo.bstrSource,
922 excepInfo.bstrDescription ? excepInfo.bstrDescription : L"",
923 excepInfo.bstrHelpFile ? excepInfo.bstrHelpFile : L"",
924 excepInfo.dwHelpContext);
925 }
926 }
927 ExitOnFailure(hr, "Failed to invoke RegistrationHelper.InstallAssembly() method");
928
929 hr = S_OK;
930
931LExit:
932 // clean up
933 ReleaseObject(piRegHlp);
934
935 ReleaseBSTR(bstrMember);
936
937 ReleaseBSTR(excepInfo.bstrSource);
938 ReleaseBSTR(excepInfo.bstrDescription);
939 ReleaseBSTR(excepInfo.bstrHelpFile);
940
941 ReleaseBSTR(bstrPartName);
942 ReleaseBSTR(bstrAppName);
943 ReleaseBSTR(bstrDllPath);
944 ReleaseBSTR(bstrTlbPath);
945
946 return hr;
947}
948
949static HRESULT RegisterNativeAssembly(
950 CPI_ASSEMBLY_ATTRIBUTES* pAttrs
951 )
952{
953 HRESULT hr = S_OK;
954
955 ICOMAdminCatalog* piCatalog = NULL;
956 ICOMAdminCatalog2* piCatalog2 = NULL;
957 BSTR bstrGlobPartID = NULL;
958
959 BSTR bstrPartID = NULL;
960 BSTR bstrAppID = NULL;
961 BSTR bstrDllPath = NULL;
962 BSTR bstrTlbPath = NULL;
963 BSTR bstrPSDllPath = NULL;
964
965 // create BSTRs for parameters
966 if (pAttrs->pwzPartID && *pAttrs->pwzPartID)
967 {
968 bstrPartID = ::SysAllocString(pAttrs->pwzPartID);
969 ExitOnNull(bstrPartID, hr, E_OUTOFMEMORY, "Failed to allocate BSTR for partition id");
970 }
971
972 bstrAppID = ::SysAllocString(pAttrs->pwzAppID);
973 ExitOnNull(bstrAppID, hr, E_OUTOFMEMORY, "Failed to allocate BSTR for application id");
974
975 bstrDllPath = ::SysAllocString(pAttrs->pwzDllPath);
976 ExitOnNull(bstrDllPath, hr, E_OUTOFMEMORY, "Failed to allocate BSTR for dll path");
977
978 bstrTlbPath = ::SysAllocString(pAttrs->pwzTlbPath ? pAttrs->pwzTlbPath : L"");
979 ExitOnNull(bstrTlbPath, hr, E_OUTOFMEMORY, "Failed to allocate BSTR for tlb path");
980
981 bstrPSDllPath = ::SysAllocString(pAttrs->pwzPSDllPath ? pAttrs->pwzPSDllPath : L"");
982 ExitOnNull(bstrPSDllPath, hr, E_OUTOFMEMORY, "Failed to allocate BSTR for tlb path");
983
984 // get catalog
985 hr = CpiExecGetAdminCatalog(&piCatalog);
986 ExitOnFailure(hr, "Failed to get COM+ admin catalog");
987
988 // get ICOMAdminCatalog2 interface
989 hr = piCatalog->QueryInterface(IID_ICOMAdminCatalog2, (void**)&piCatalog2);
990
991 // COM+ 1.5 or later
992 if (E_NOINTERFACE != hr)
993 {
994 ExitOnFailure(hr, "Failed to get IID_ICOMAdminCatalog2 interface");
995
996 // partition id
997 if (!bstrPartID)
998 {
999 // get global partition id
1000 hr = piCatalog2->get_GlobalPartitionID(&bstrGlobPartID);
1001 ExitOnFailure(hr, "Failed to get global partition id");
1002 }
1003
1004 // set current partition
1005 hr = piCatalog2->put_CurrentPartition(bstrPartID ? bstrPartID : bstrGlobPartID);
1006 ExitOnFailure(hr, "Failed to set current partition");
1007 }
1008
1009 // COM+ pre 1.5
1010 else
1011 {
1012 // this version of COM+ does not support partitions, make sure a partition was not specified
1013 if (bstrPartID)
1014 ExitOnFailure(hr = E_FAIL, "Partitions are not supported by this version of COM+");
1015 }
1016
1017 // install event classes
1018 if (pAttrs->iAttributes & aaEventClass)
1019 {
1020 hr = piCatalog->InstallEventClass(bstrAppID, bstrDllPath, bstrTlbPath, bstrPSDllPath);
1021 if (COMADMIN_E_OBJECTERRORS == hr)
1022 CpiLogCatalogErrorInfo();
1023 ExitOnFailure(hr, "Failed to install event classes");
1024 }
1025
1026 // install components
1027 else
1028 {
1029 hr = piCatalog->InstallComponent(bstrAppID, bstrDllPath, bstrTlbPath, bstrPSDllPath);
1030 if (COMADMIN_E_OBJECTERRORS == hr)
1031 CpiLogCatalogErrorInfo();
1032 ExitOnFailure(hr, "Failed to install components");
1033 }
1034
1035 hr = S_OK;
1036
1037LExit:
1038 // clean up
1039 ReleaseObject(piCatalog);
1040 ReleaseObject(piCatalog2);
1041 ReleaseBSTR(bstrGlobPartID);
1042
1043 ReleaseBSTR(bstrPartID);
1044 ReleaseBSTR(bstrAppID);
1045 ReleaseBSTR(bstrDllPath);
1046 ReleaseBSTR(bstrTlbPath);
1047 ReleaseBSTR(bstrPSDllPath);
1048
1049 return hr;
1050}
1051
1052static HRESULT UnregisterDotNetAssembly(
1053 CPI_ASSEMBLY_ATTRIBUTES* pAttrs
1054 )
1055{
1056 HRESULT hr = S_OK;
1057
1058 IDispatch* piRegHlp = NULL;
1059
1060 DISPID dispid;
1061 BSTR bstrMember = NULL;
1062
1063 VARIANTARG rgvarg[3];
1064 DISPPARAMS dispparams;
1065 EXCEPINFO excepInfo;
1066
1067 BSTR bstrPartName = NULL;
1068 BSTR bstrAppName = NULL;
1069 BSTR bstrDllPath = NULL;
1070
1071 ::ZeroMemory(rgvarg, sizeof(rgvarg));
1072 ::ZeroMemory(&dispparams, sizeof(dispparams));
1073 ::ZeroMemory(&excepInfo, sizeof(excepInfo));
1074
1075 bstrMember = ::SysAllocString(L"UninstallAssembly_2");
1076 ExitOnNull(bstrMember, hr, E_OUTOFMEMORY, "Failed to allocate BSTR for method name");
1077
1078 // create BSTRs for parameters
1079 if (pAttrs->pwzPartID && *pAttrs->pwzPartID)
1080 {
1081 bstrPartName = ::SysAllocString(pAttrs->pwzPartID);
1082 ExitOnNull(bstrPartName, hr, E_OUTOFMEMORY, "Failed to allocate BSTR for partition id");
1083 }
1084
1085 bstrAppName = ::SysAllocString(pAttrs->pwzAppID);
1086 ExitOnNull(bstrAppName, hr, E_OUTOFMEMORY, "Failed to allocate BSTR for application id");
1087
1088 bstrDllPath = ::SysAllocString(pAttrs->pwzDllPath);
1089 ExitOnNull(bstrDllPath, hr, E_OUTOFMEMORY, "Failed to allocate BSTR for dll path");
1090
1091 // get registration helper object
1092 hr = GetRegistrationHelper(&piRegHlp);
1093 ExitOnFailure(hr, "Failed to get registration helper object");
1094
1095 // get dispatch id of UninstallAssembly() method
1096 hr = piRegHlp->GetIDsOfNames(IID_NULL, &bstrMember, 1, LOCALE_USER_DEFAULT, &dispid);
1097 ExitOnFailure(hr, "Failed to get dispatch id of UninstallAssembly() method");
1098
1099 // invoke UninstallAssembly() method
1100 rgvarg[0].vt = VT_BSTR;
1101 rgvarg[0].bstrVal = bstrPartName;
1102 rgvarg[1].vt = VT_BSTR;
1103 rgvarg[1].bstrVal = bstrAppName;
1104 rgvarg[2].vt = VT_BSTR;
1105 rgvarg[2].bstrVal = bstrDllPath;
1106 dispparams.rgvarg = rgvarg;
1107 dispparams.cArgs = 3;
1108 dispparams.cNamedArgs = 0;
1109
1110 hr = piRegHlp->Invoke(dispid, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &dispparams, NULL, &excepInfo, NULL);
1111 if (DISP_E_EXCEPTION == hr)
1112 {
1113 // log exception information
1114 if (!excepInfo.pfnDeferredFillIn || (excepInfo.pfnDeferredFillIn && SUCCEEDED(excepInfo.pfnDeferredFillIn(&excepInfo))))
1115 {
1116 WcaLog(LOGMSG_STANDARD, "ExceptionInfo: Code='%hu', Source='%S', Description='%S', HelpFile='%S', HelpContext='%u'",
1117 excepInfo.wCode, excepInfo.bstrSource,
1118 excepInfo.bstrDescription ? excepInfo.bstrDescription : L"",
1119 excepInfo.bstrHelpFile ? excepInfo.bstrHelpFile : L"",
1120 excepInfo.dwHelpContext);
1121 }
1122 }
1123 ExitOnFailure(hr, "Failed to invoke RegistrationHelper.UninstallAssembly() method");
1124
1125 hr = S_OK;
1126
1127LExit:
1128 // clean up
1129 ReleaseObject(piRegHlp);
1130
1131 ReleaseBSTR(bstrMember);
1132
1133 ReleaseBSTR(excepInfo.bstrSource);
1134 ReleaseBSTR(excepInfo.bstrDescription);
1135 ReleaseBSTR(excepInfo.bstrHelpFile);
1136
1137 ReleaseBSTR(bstrPartName);
1138 ReleaseBSTR(bstrAppName);
1139 ReleaseBSTR(bstrDllPath);
1140
1141 return hr;
1142}
1143
1144static HRESULT RemoveComponents(
1145 ICatalogCollection* piCompColl,
1146 CPIEXEC_COMPONENT* pCompList
1147 )
1148{
1149 HRESULT hr = S_OK;
1150
1151 for (CPIEXEC_COMPONENT* pItm = pCompList; pItm; pItm = pItm->pNext)
1152 {
1153 // remove
1154 hr = CpiRemoveCollectionObject(piCompColl, pItm->wzCLSID, NULL, FALSE);
1155 ExitOnFailure(hr, "Failed to remove component");
1156
1157 if (S_FALSE == hr)
1158 WcaLog(LOGMSG_VERBOSE, "Component not found, nothing to delete, key: %S", pItm->wzCLSID);
1159 }
1160
1161 hr = S_OK;
1162
1163LExit:
1164 return hr;
1165}
1166
1167static HRESULT ReadAssemblyAttributes(
1168 LPWSTR* ppwzData,
1169 CPI_ASSEMBLY_ATTRIBUTES* pAttrs
1170 )
1171{
1172 HRESULT hr = S_OK;
1173
1174 // read attributes
1175 hr = WcaReadIntegerFromCaData(ppwzData, &pAttrs->iActionType);
1176 ExitOnFailure(hr, "Failed to read action type");
1177 hr = WcaReadIntegerFromCaData(ppwzData, &pAttrs->iActionCost);
1178 ExitOnFailure(hr, "Failed to read action cost");
1179 hr = WcaReadStringFromCaData(ppwzData, &pAttrs->pwzKey);
1180 ExitOnFailure(hr, "Failed to read key");
1181 hr = WcaReadStringFromCaData(ppwzData, &pAttrs->pwzAssemblyName);
1182 ExitOnFailure(hr, "Failed to read assembly name");
1183 hr = WcaReadStringFromCaData(ppwzData, &pAttrs->pwzDllPath);
1184 ExitOnFailure(hr, "Failed to read dll path");
1185 hr = WcaReadStringFromCaData(ppwzData, &pAttrs->pwzTlbPath);
1186 ExitOnFailure(hr, "Failed to read tlb path");
1187 hr = WcaReadStringFromCaData(ppwzData, &pAttrs->pwzPSDllPath);
1188 ExitOnFailure(hr, "Failed to read proxy-stub dll path");
1189 hr = WcaReadIntegerFromCaData(ppwzData, &pAttrs->iAttributes);
1190 ExitOnFailure(hr, "Failed to read attributes");
1191 hr = WcaReadStringFromCaData(ppwzData, &pAttrs->pwzAppID);
1192 ExitOnFailure(hr, "Failed to read application id");
1193 hr = WcaReadStringFromCaData(ppwzData, &pAttrs->pwzPartID);
1194 ExitOnFailure(hr, "Failed to read partition id");
1195
1196 // free existing component list
1197 if (pAttrs->pCompList)
1198 {
1199 FreeComponentList(pAttrs->pCompList);
1200 pAttrs->pCompList = NULL;
1201 }
1202
1203 // read components
1204 hr = ReadComponentList(ppwzData, &pAttrs->pCompList);
1205 ExitOnFailure(hr, "Failed to read components");
1206
1207 hr = S_OK;
1208
1209LExit:
1210 return hr;
1211}
1212
1213static void FreeAssemblyAttributes(
1214 CPI_ASSEMBLY_ATTRIBUTES* pAttrs
1215 )
1216{
1217 ReleaseStr(pAttrs->pwzKey);
1218 ReleaseStr(pAttrs->pwzAssemblyName);
1219 ReleaseStr(pAttrs->pwzDllPath);
1220 ReleaseStr(pAttrs->pwzTlbPath);
1221 ReleaseStr(pAttrs->pwzPSDllPath);
1222 ReleaseStr(pAttrs->pwzAppID);
1223 ReleaseStr(pAttrs->pwzPartID);
1224
1225 if (pAttrs->pCompList)
1226 FreeComponentList(pAttrs->pCompList);
1227}
1228
1229static HRESULT ReadRoleAssignmentsAttributes(
1230 LPWSTR* ppwzData,
1231 CPI_ROLE_ASSIGNMENTS_ATTRIBUTES* pAttrs
1232 )
1233{
1234 HRESULT hr = S_OK;
1235
1236 // read attributes
1237 hr = WcaReadIntegerFromCaData(ppwzData, &pAttrs->iActionType);
1238 ExitOnFailure(hr, "Failed to read action type");
1239 hr = WcaReadIntegerFromCaData(ppwzData, &pAttrs->iActionCost);
1240 ExitOnFailure(hr, "Failed to read action cost");
1241 hr = WcaReadStringFromCaData(ppwzData, &pAttrs->pwzKey);
1242 ExitOnFailure(hr, "Failed to read key");
1243 hr = WcaReadIntegerFromCaData(ppwzData, &pAttrs->iRoleCount);
1244 ExitOnFailure(hr, "Failed to read role assignments count");
1245 hr = WcaReadStringFromCaData(ppwzData, &pAttrs->pwzAppID);
1246 ExitOnFailure(hr, "Failed to read application id");
1247 hr = WcaReadStringFromCaData(ppwzData, &pAttrs->pwzPartID);
1248 ExitOnFailure(hr, "Failed to read partition id");
1249
1250 // free existing component list
1251 if (pAttrs->pCompList)
1252 {
1253 FreeComponentList(pAttrs->pCompList);
1254 pAttrs->pCompList = NULL;
1255 }
1256
1257 // read components
1258 hr = ReadComponentList(ppwzData, &pAttrs->pCompList);
1259 ExitOnFailure(hr, "Failed to read components");
1260
1261 hr = S_OK;
1262
1263LExit:
1264 return hr;
1265}
1266
1267static void FreeRoleAssignmentsAttributes(
1268 CPI_ROLE_ASSIGNMENTS_ATTRIBUTES* pAttrs
1269 )
1270{
1271 ReleaseStr(pAttrs->pwzKey);
1272 ReleaseStr(pAttrs->pwzAppID);
1273 ReleaseStr(pAttrs->pwzPartID);
1274
1275 if (pAttrs->pCompList)
1276 FreeComponentList(pAttrs->pCompList);
1277}
1278
1279
1280static HRESULT ConfigureComponents(
1281 LPCWSTR pwzPartID,
1282 LPCWSTR pwzAppID,
1283 CPIEXEC_COMPONENT* pCompList,
1284 BOOL fCreate,
1285 BOOL fProgress
1286 )
1287{
1288 HRESULT hr = S_OK;
1289
1290 ICatalogCollection* piCompColl = NULL;
1291 ICatalogObject* piCompObj = NULL;
1292
1293 long lChanges = 0;
1294
1295 // get components collection
1296 hr = CpiGetComponentsCollection(pwzPartID, pwzAppID, &piCompColl);
1297 if (S_FALSE == hr)
1298 if (fCreate)
1299 hr = HRESULT_FROM_WIN32(ERROR_NOT_FOUND);
1300 else
1301 ExitFunction1(hr = S_OK);
1302 ExitOnFailure(hr, "Failed to get components collection");
1303
1304 // read components
1305 for (CPIEXEC_COMPONENT* pItm = pCompList; pItm; pItm = pItm->pNext)
1306 {
1307 // progress message
1308 if (fProgress)
1309 {
1310 hr = CpiActionDataMessage(1, pItm->wzCLSID);
1311 ExitOnFailure(hr, "Failed to send progress messages");
1312
1313 if (S_FALSE == hr)
1314 ExitFunction(); // aborted by user
1315 }
1316
1317 // find component
1318 hr = CpiFindCollectionObjectByStringKey(piCompColl, pItm->wzCLSID, &piCompObj);
1319 if (S_FALSE == hr)
1320 if (fCreate)
1321 hr = HRESULT_FROM_WIN32(ERROR_NOT_FOUND);
1322 else
1323 continue;
1324 ExitOnFailure(hr, "Failed to find component object");
1325
1326 // properties
1327 hr = CpiPutCollectionObjectValues(piCompObj, pItm->pPropertyList);
1328 ExitOnFailure(hr, "Failed to write properties");
1329
1330 // read roles
1331 if (pItm->pRoleAssignmentList)
1332 {
1333 hr = ConfigureRoleAssignments(L"RolesForComponent", piCompColl, piCompObj, pItm->pRoleAssignmentList, fCreate);
1334 ExitOnFailure(hr, "Failed to read roles");
1335 }
1336
1337 // read interfaces
1338 if (pItm->pInterfaceList)
1339 {
1340 hr = ConfigureInterfaces(piCompColl, piCompObj, pItm->pInterfaceList, fCreate);
1341 ExitOnFailure(hr, "Failed to read interfaces");
1342 }
1343
1344 // clean up
1345 ReleaseNullObject(piCompObj);
1346 }
1347
1348 // save changes
1349 hr = piCompColl->SaveChanges(&lChanges);
1350 if (COMADMIN_E_OBJECTERRORS == hr)
1351 CpiLogCatalogErrorInfo();
1352 ExitOnFailure(hr, "Failed to save changes");
1353
1354 hr = S_OK;
1355
1356LExit:
1357 // clean up
1358 ReleaseObject(piCompColl);
1359 ReleaseObject(piCompObj);
1360
1361 return hr;
1362}
1363
1364static HRESULT ConfigureInterfaces(
1365 ICatalogCollection* piCompColl,
1366 ICatalogObject* piCompObj,
1367 CPIEXEC_INTERFACE* pIntfList,
1368 BOOL fCreate
1369 )
1370{
1371 HRESULT hr = S_OK;
1372
1373 ICatalogCollection* piIntfColl = NULL;
1374 ICatalogObject* piIntfObj = NULL;
1375
1376 long lChanges = 0;
1377
1378 // get interfaces collection
1379 hr = CpiGetInterfacesCollection(piCompColl, piCompObj, &piIntfColl);
1380 if (S_FALSE == hr)
1381 if (fCreate)
1382 hr = HRESULT_FROM_WIN32(ERROR_NOT_FOUND);
1383 else
1384 ExitFunction1(hr = S_OK);
1385 ExitOnFailure(hr, "Failed to get interfaces collection");
1386
1387 // read interfaces
1388 for (CPIEXEC_INTERFACE* pItm = pIntfList; pItm; pItm = pItm->pNext)
1389 {
1390 // find interface
1391 hr = CpiFindCollectionObjectByStringKey(piIntfColl, pItm->wzIID, &piIntfObj);
1392 if (S_FALSE == hr)
1393 if (fCreate)
1394 hr = HRESULT_FROM_WIN32(ERROR_NOT_FOUND);
1395 else
1396 continue;
1397 ExitOnFailure(hr, "Failed to find interface object");
1398
1399 // properties
1400 hr = CpiPutCollectionObjectValues(piIntfObj, pItm->pPropertyList);
1401 ExitOnFailure(hr, "Failed to write properties");
1402
1403 // read roles
1404 if (pItm->pRoleAssignmentList)
1405 {
1406 hr = ConfigureRoleAssignments(L"RolesForInterface", piIntfColl, piIntfObj, pItm->pRoleAssignmentList, fCreate);
1407 ExitOnFailure(hr, "Failed to read roles");
1408 }
1409
1410 // read methods
1411 if (pItm->pMethodList)
1412 {
1413 hr = ConfigureMethods(piIntfColl, piIntfObj, pItm->pMethodList, fCreate);
1414 ExitOnFailure(hr, "Failed to read methods");
1415 }
1416
1417 // clean up
1418 ReleaseNullObject(piIntfObj);
1419 }
1420
1421 // save changes
1422 hr = piIntfColl->SaveChanges(&lChanges);
1423 if (COMADMIN_E_OBJECTERRORS == hr)
1424 CpiLogCatalogErrorInfo();
1425 ExitOnFailure(hr, "Failed to save changes");
1426
1427 hr = S_OK;
1428
1429LExit:
1430 // clean up
1431 ReleaseObject(piIntfColl);
1432 ReleaseObject(piIntfObj);
1433
1434 return hr;
1435}
1436
1437static HRESULT ConfigureMethods(
1438 ICatalogCollection* piIntfColl,
1439 ICatalogObject* piIntfObj,
1440 CPIEXEC_METHOD* pMethList,
1441 BOOL fCreate
1442 )
1443{
1444 HRESULT hr = S_OK;
1445
1446 ICatalogCollection* piMethColl = NULL;
1447 ICatalogObject* piMethObj = NULL;
1448
1449 long lChanges = 0;
1450
1451 // get methods collection
1452 hr = CpiGetMethodsCollection(piIntfColl, piIntfObj, &piMethColl);
1453 if (S_FALSE == hr)
1454 if (fCreate)
1455 hr = HRESULT_FROM_WIN32(ERROR_NOT_FOUND);
1456 else
1457 ExitFunction1(hr = S_OK);
1458 ExitOnFailure(hr, "Failed to get methods collection");
1459
1460 // read methods
1461 for (CPIEXEC_METHOD* pItm = pMethList; pItm; pItm = pItm->pNext)
1462 {
1463 // find method
1464 if (*pItm->wzIndex)
1465 hr = CpiFindCollectionObjectByIntegerKey(piMethColl, _wtol(pItm->wzIndex), &piMethObj);
1466 else
1467 hr = CpiFindCollectionObjectByName(piMethColl, pItm->wzName, &piMethObj);
1468
1469 if (S_FALSE == hr)
1470 if (fCreate)
1471 hr = HRESULT_FROM_WIN32(ERROR_NOT_FOUND);
1472 else
1473 continue;
1474 ExitOnFailure(hr, "Failed to find method object");
1475
1476 // properties
1477 hr = CpiPutCollectionObjectValues(piMethObj, pItm->pPropertyList);
1478 ExitOnFailure(hr, "Failed to write properties");
1479
1480 // read roles
1481 if (pItm->pRoleAssignmentList)
1482 {
1483 hr = ConfigureRoleAssignments(L"RolesForMethod", piMethColl, piMethObj, pItm->pRoleAssignmentList, fCreate);
1484 ExitOnFailure(hr, "Failed to read roles");
1485 }
1486
1487 // clean up
1488 ReleaseNullObject(piMethObj);
1489 }
1490
1491 // save changes
1492 hr = piMethColl->SaveChanges(&lChanges);
1493 if (COMADMIN_E_OBJECTERRORS == hr)
1494 CpiLogCatalogErrorInfo();
1495 ExitOnFailure(hr, "Failed to save changes");
1496
1497 hr = S_OK;
1498
1499LExit:
1500 // clean up
1501 ReleaseObject(piMethColl);
1502 ReleaseObject(piMethObj);
1503
1504 return hr;
1505}
1506
1507static HRESULT ConfigureRoleAssignments(
1508 LPCWSTR pwzCollName,
1509 ICatalogCollection* piCompColl,
1510 ICatalogObject* piCompObj,
1511 CPIEXEC_ROLE_ASSIGNMENT* pRoleList,
1512 BOOL fCreate
1513 )
1514{
1515 HRESULT hr = S_OK;
1516
1517 ICatalogCollection* piRoleColl = NULL;
1518 ICatalogObject* piRoleObj = NULL;
1519
1520 long lChanges = 0;
1521
1522 // get roles collection
1523 hr = CpiExecGetCatalogCollection(piCompColl, piCompObj, pwzCollName, &piRoleColl);
1524 if (S_FALSE == hr)
1525 if (fCreate)
1526 hr = HRESULT_FROM_WIN32(ERROR_NOT_FOUND);
1527 else
1528 ExitFunction1(hr = S_OK);
1529 ExitOnFailure(hr, "Failed to get role assignments collection");
1530
1531 // read roles
1532 for (CPIEXEC_ROLE_ASSIGNMENT* pItm = pRoleList; pItm; pItm = pItm->pNext)
1533 {
1534 if (fCreate)
1535 {
1536 // find existing role
1537 hr = CpiFindCollectionObjectByName(piRoleColl, pItm->wzRoleName, NULL);
1538 ExitOnFailure(hr, "Failed to find role, key: %S", pItm->wzKey);
1539
1540 if (S_OK == hr)
1541 continue; // role already exists
1542
1543 // add object
1544 hr = CpiAddCollectionObject(piRoleColl, &piRoleObj);
1545 ExitOnFailure(hr, "Failed to add role assignment to collection");
1546
1547 // role name
1548 hr = CpiPutCollectionObjectValue(piRoleObj, L"Name", pItm->wzRoleName);
1549 ExitOnFailure(hr, "Failed to set role name property, key: %S", pItm->wzKey);
1550
1551 // clean up
1552 ReleaseNullObject(piRoleObj);
1553 }
1554 else
1555 {
1556 // remove role
1557 hr = CpiRemoveCollectionObject(piRoleColl, NULL, pItm->wzRoleName, FALSE);
1558 ExitOnFailure(hr, "Failed to remove role, key: %S", pItm->wzKey);
1559 }
1560 }
1561
1562 // save changes
1563 hr = piRoleColl->SaveChanges(&lChanges);
1564 if (COMADMIN_E_OBJECTERRORS == hr)
1565 CpiLogCatalogErrorInfo();
1566 ExitOnFailure(hr, "Failed to save changes");
1567
1568 hr = S_OK;
1569
1570LExit:
1571 // clean up
1572 ReleaseObject(piRoleColl);
1573 ReleaseObject(piRoleObj);
1574
1575 return hr;
1576}
1577
1578static HRESULT ReadComponentList(
1579 LPWSTR* ppwzData,
1580 CPIEXEC_COMPONENT** ppCompList
1581 )
1582{
1583 HRESULT hr = S_OK;
1584
1585 LPWSTR pwzData = NULL;
1586
1587 CPIEXEC_COMPONENT* pItm = NULL;
1588
1589 int iCnt = 0;
1590
1591 // read count
1592 hr = WcaReadIntegerFromCaData(ppwzData, &iCnt);
1593 ExitOnFailure(hr, "Failed to read count");
1594
1595 // read components
1596 for (int i = 0; i < iCnt; i++)
1597 {
1598 pItm = (CPIEXEC_COMPONENT*)::HeapAlloc(::GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(CPIEXEC_COMPONENT));
1599 if (!pItm)
1600 ExitFunction1(hr = E_OUTOFMEMORY);
1601
1602 // read clsid
1603 hr = WcaReadStringFromCaData(ppwzData, &pwzData);
1604 ExitOnFailure(hr, "Failed to read clsid");
1605 StringCchCopyW(pItm->wzCLSID, countof(pItm->wzCLSID), pwzData);
1606
1607 // read properties
1608 hr = CpiReadPropertyList(ppwzData, &pItm->pPropertyList);
1609 ExitOnFailure(hr, "Failed to read properties");
1610
1611 // read role assignments
1612 hr = ReadRoleAssignmentList(ppwzData, &pItm->pRoleAssignmentList);
1613 ExitOnFailure(hr, "Failed to read role assignments");
1614
1615 // read interfaces
1616 hr = ReadInterfaceList(ppwzData, &pItm->pInterfaceList);
1617 ExitOnFailure(hr, "Failed to read interfaces");
1618
1619 // add to list
1620 if (*ppCompList)
1621 pItm->pNext = *ppCompList;
1622 *ppCompList = pItm;
1623 pItm = NULL;
1624 }
1625
1626 hr = S_OK;
1627
1628LExit:
1629 // clean up
1630 ReleaseStr(pwzData);
1631
1632 if (pItm)
1633 FreeComponentList(pItm);
1634
1635 return hr;
1636}
1637
1638static HRESULT ReadInterfaceList(
1639 LPWSTR* ppwzData,
1640 CPIEXEC_INTERFACE** ppIntfList
1641 )
1642{
1643 HRESULT hr = S_OK;
1644
1645 LPWSTR pwzData = NULL;
1646
1647 CPIEXEC_INTERFACE* pItm = NULL;
1648
1649 int iCnt = 0;
1650
1651 // read count
1652 hr = WcaReadIntegerFromCaData(ppwzData, &iCnt);
1653 ExitOnFailure(hr, "Failed to read count");
1654
1655 // read interfaces
1656 for (int i = 0; i < iCnt; i++)
1657 {
1658 pItm = (CPIEXEC_INTERFACE*)::HeapAlloc(::GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(CPIEXEC_INTERFACE));
1659 if (!pItm)
1660 ExitFunction1(hr = E_OUTOFMEMORY);
1661
1662 // read iid
1663 hr = WcaReadStringFromCaData(ppwzData, &pwzData);
1664 ExitOnFailure(hr, "Failed to read iid");
1665 StringCchCopyW(pItm->wzIID, countof(pItm->wzIID), pwzData);
1666
1667 // read properties
1668 hr = CpiReadPropertyList(ppwzData, &pItm->pPropertyList);
1669 ExitOnFailure(hr, "Failed to read properties");
1670
1671 // read role assignments
1672 hr = ReadRoleAssignmentList(ppwzData, &pItm->pRoleAssignmentList);
1673 ExitOnFailure(hr, "Failed to read role assignments");
1674
1675 // read methods
1676 hr = ReadMethodList(ppwzData, &pItm->pMethodList);
1677 ExitOnFailure(hr, "Failed to read methods");
1678
1679 // add to list
1680 if (*ppIntfList)
1681 pItm->pNext = *ppIntfList;
1682 *ppIntfList = pItm;
1683 pItm = NULL;
1684 }
1685
1686 hr = S_OK;
1687
1688LExit:
1689 // clean up
1690 ReleaseStr(pwzData);
1691
1692 if (pItm)
1693 FreeInterfaceList(pItm);
1694
1695 return hr;
1696}
1697
1698static HRESULT ReadMethodList(
1699 LPWSTR* ppwzData,
1700 CPIEXEC_METHOD** ppMethList
1701 )
1702{
1703 HRESULT hr = S_OK;
1704
1705 LPWSTR pwzData = NULL;
1706
1707 CPIEXEC_METHOD* pItm = NULL;
1708
1709 int iCnt = 0;
1710
1711 // read count
1712 hr = WcaReadIntegerFromCaData(ppwzData, &iCnt);
1713 ExitOnFailure(hr, "Failed to read count");
1714
1715 // read methods
1716 for (int i = 0; i < iCnt; i++)
1717 {
1718 pItm = (CPIEXEC_METHOD*)::HeapAlloc(::GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(CPIEXEC_METHOD));
1719 if (!pItm)
1720 ExitFunction1(hr = E_OUTOFMEMORY);
1721
1722 // read index
1723 hr = WcaReadStringFromCaData(ppwzData, &pwzData);
1724 ExitOnFailure(hr, "Failed to read index");
1725 StringCchCopyW(pItm->wzIndex, countof(pItm->wzIndex), pwzData);
1726
1727 // read name
1728 hr = WcaReadStringFromCaData(ppwzData, &pwzData);
1729 ExitOnFailure(hr, "Failed to read name");
1730 StringCchCopyW(pItm->wzName, countof(pItm->wzName), pwzData);
1731
1732 // read properties
1733 hr = CpiReadPropertyList(ppwzData, &pItm->pPropertyList);
1734 ExitOnFailure(hr, "Failed to read properties");
1735
1736 // read role assignments
1737 hr = ReadRoleAssignmentList(ppwzData, &pItm->pRoleAssignmentList);
1738 ExitOnFailure(hr, "Failed to read role assignments");
1739
1740 // add to list
1741 if (*ppMethList)
1742 pItm->pNext = *ppMethList;
1743 *ppMethList = pItm;
1744 pItm = NULL;
1745 }
1746
1747 hr = S_OK;
1748
1749LExit:
1750 // clean up
1751 ReleaseStr(pwzData);
1752
1753 if (pItm)
1754 FreeMethodList(pItm);
1755
1756 return hr;
1757}
1758
1759static HRESULT ReadRoleAssignmentList(
1760 LPWSTR* ppwzData,
1761 CPIEXEC_ROLE_ASSIGNMENT** ppRoleList
1762 )
1763{
1764 HRESULT hr = S_OK;
1765
1766 LPWSTR pwzData = NULL;
1767
1768 CPIEXEC_ROLE_ASSIGNMENT* pItm = NULL;
1769
1770 int iCnt = 0;
1771
1772 // read role count
1773 hr = WcaReadIntegerFromCaData(ppwzData, &iCnt);
1774 ExitOnFailure(hr, "Failed to read role assignments count");
1775
1776 // read roles
1777 for (int i = 0; i < iCnt; i++)
1778 {
1779 pItm = (CPIEXEC_ROLE_ASSIGNMENT*)::HeapAlloc(::GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(CPIEXEC_ROLE_ASSIGNMENT));
1780 if (!pItm)
1781 ExitFunction1(hr = E_OUTOFMEMORY);
1782
1783 // read key
1784 hr = WcaReadStringFromCaData(ppwzData, &pwzData);
1785 ExitOnFailure(hr, "Failed to read key");
1786 StringCchCopyW(pItm->wzKey, countof(pItm->wzKey), pwzData);
1787
1788 // read role name
1789 hr = WcaReadStringFromCaData(ppwzData, &pwzData);
1790 ExitOnFailure(hr, "Failed to read role name");
1791 StringCchCopyW(pItm->wzRoleName, countof(pItm->wzRoleName), pwzData);
1792
1793 // add to list
1794 if (*ppRoleList)
1795 pItm->pNext = *ppRoleList;
1796 *ppRoleList = pItm;
1797 pItm = NULL;
1798 }
1799
1800 hr = S_OK;
1801
1802LExit:
1803 // clean up
1804 ReleaseStr(pwzData);
1805
1806 if (pItm)
1807 FreeRoleAssignmentList(pItm);
1808
1809 return hr;
1810}
1811
1812static void FreeComponentList(
1813 CPIEXEC_COMPONENT* pList
1814 )
1815{
1816 while (pList)
1817 {
1818 if (pList->pPropertyList)
1819 CpiFreePropertyList(pList->pPropertyList);
1820 if (pList->pRoleAssignmentList)
1821 FreeRoleAssignmentList(pList->pRoleAssignmentList);
1822 if (pList->pInterfaceList)
1823 FreeInterfaceList(pList->pInterfaceList);
1824
1825 CPIEXEC_COMPONENT* pDelete = pList;
1826 pList = pList->pNext;
1827 ::HeapFree(::GetProcessHeap(), 0, pDelete);
1828 }
1829}
1830
1831static void FreeInterfaceList(
1832 CPIEXEC_INTERFACE* pList
1833 )
1834{
1835 while (pList)
1836 {
1837 if (pList->pPropertyList)
1838 CpiFreePropertyList(pList->pPropertyList);
1839 if (pList->pRoleAssignmentList)
1840 FreeRoleAssignmentList(pList->pRoleAssignmentList);
1841 if (pList->pMethodList)
1842 FreeMethodList(pList->pMethodList);
1843
1844 CPIEXEC_INTERFACE* pDelete = pList;
1845 pList = pList->pNext;
1846 ::HeapFree(::GetProcessHeap(), 0, pDelete);
1847 }
1848}
1849
1850static void FreeMethodList(
1851 CPIEXEC_METHOD* pList
1852 )
1853{
1854 while (pList)
1855 {
1856 if (pList->pPropertyList)
1857 CpiFreePropertyList(pList->pPropertyList);
1858 if (pList->pRoleAssignmentList)
1859 FreeRoleAssignmentList(pList->pRoleAssignmentList);
1860
1861 CPIEXEC_METHOD* pDelete = pList;
1862 pList = pList->pNext;
1863 ::HeapFree(::GetProcessHeap(), 0, pDelete);
1864 }
1865}
1866
1867static void FreeRoleAssignmentList(
1868 CPIEXEC_ROLE_ASSIGNMENT* pList
1869 )
1870{
1871 while (pList)
1872 {
1873 CPIEXEC_ROLE_ASSIGNMENT* pDelete = pList;
1874 pList = pList->pNext;
1875 ::HeapFree(::GetProcessHeap(), 0, pDelete);
1876 }
1877}
diff --git a/src/ext/ComPlus/ca/cpasmexec.h b/src/ext/ComPlus/ca/cpasmexec.h
new file mode 100644
index 00000000..56184c01
--- /dev/null
+++ b/src/ext/ComPlus/ca/cpasmexec.h
@@ -0,0 +1,20 @@
1#pragma once
2// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
3
4
5HRESULT CpiConfigureAssemblies(
6 LPWSTR* ppwzData,
7 HANDLE hRollbackFile
8 );
9HRESULT CpiRollbackConfigureAssemblies(
10 LPWSTR* ppwzData,
11 CPI_ROLLBACK_DATA* pRollbackDataList
12 );
13HRESULT CpiConfigureRoleAssignments(
14 LPWSTR* ppwzData,
15 HANDLE hRollbackFile
16 );
17HRESULT CpiRollbackConfigureRoleAssignments(
18 LPWSTR* ppwzData,
19 CPI_ROLLBACK_DATA* pRollbackDataList
20 );
diff --git a/src/ext/ComPlus/ca/cpasmsched.cpp b/src/ext/ComPlus/ca/cpasmsched.cpp
new file mode 100644
index 00000000..2d0573a5
--- /dev/null
+++ b/src/ext/ComPlus/ca/cpasmsched.cpp
@@ -0,0 +1,2135 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3#include "precomp.h"
4
5
6// sql queries
7
8LPCWSTR vcsMsiAssemblyNameQuery =
9 L"SELECT `Name`, `Value` FROM `MsiAssemblyName` WHERE `Component_` = ?";
10enum eMsiAssemblyNameQuery { manqName = 1, manqValue };
11
12LPCWSTR vcsModuleQuery =
13 L"SELECT `ModuleID` FROM `ModuleSignature`";
14enum eModuleQuery { mqModule = 1 };
15
16LPCWSTR vcsAssemblyQuery =
17 L"SELECT `Assembly`, `Component_`, `Application_`, `AssemblyName`, `DllPath`, `TlbPath`, `PSDllPath`, `Attributes` FROM `ComPlusAssembly`";
18enum eAssemblyQuery { aqAssembly = 1, aqComponent, aqApplication, aqAssemblyName, aqDllPath, aqTlbPath, aqPSDllPath, aqAttributes };
19
20LPCWSTR vcsComponentQuery =
21 L"SELECT `ComPlusComponent`, `CLSID` FROM `ComPlusComponent` WHERE `Assembly_` = ?";
22enum eComponentQuery { cqComponent = 1, cqCLSID };
23
24LPCWSTR vcsComponentPropertyQuery =
25 L"SELECT `Name`, `Value` FROM `ComPlusComponentProperty` WHERE `ComPlusComponent_` = ?";
26
27LPCWSTR vcsInterfaceQuery =
28 L"SELECT `Interface`, `IID` FROM `ComPlusInterface` WHERE `ComPlusComponent_` = ?";
29enum eInterfaceQuery { iqInterface = 1, iqIID };
30
31LPCWSTR vcsInterfacePropertyQuery =
32 L"SELECT `Name`, `Value` FROM `ComPlusInterfaceProperty` WHERE `Interface_` = ?";
33
34LPCWSTR vcsMethodQuery =
35 L"SELECT `Method`, `Index`, `Name` FROM `ComPlusMethod` WHERE `Interface_` = ?";
36enum eMethodQuery { mqMethod = 1, mqIndex, mqName };
37
38LPCWSTR vcsMethodPropertyQuery =
39 L"SELECT `Name`, `Value` FROM `ComPlusMethodProperty` WHERE `Method_` = ?";
40
41LPCWSTR vcsRoleForComponentQuery =
42 L"SELECT `RoleForComponent`, `ApplicationRole_`, `Component_` FROM `ComPlusRoleForComponent` WHERE `ComPlusComponent_` = ?";
43LPCWSTR vcsRoleForInterfaceQuery =
44 L"SELECT `RoleForInterface`, `ApplicationRole_`, `Component_` FROM `ComPlusRoleForInterface` WHERE `Interface_` = ?";
45LPCWSTR vcsRoleForMethodQuery =
46 L"SELECT `RoleForMethod`, `ApplicationRole_`, `Component_` FROM `ComPlusRoleForMethod` WHERE `Method_` = ?";
47
48enum eRoleAssignmentQuery { raqKey = 1, raqApplicationRole, raqComponent };
49
50LPCWSTR vcsModuleComponentsQuery =
51 L"SELECT `Component`, `ModuleID` FROM `ModuleComponents`";
52LPCWSTR vcsModuleDependencyQuery =
53 L"SELECT `ModuleID`, `RequiredID` FROM `ModuleDependency`";
54LPCWSTR vcsAssemblyDependencyQuery =
55 L"SELECT `Assembly_`, `RequiredAssembly_` FROM `ComPlusAssemblyDependency`";
56
57enum eKeyPairQuery { kpqFirstKey = 1, kpqSecondKey };
58
59
60// private structs
61
62struct CPI_KEY_PAIR
63{
64 WCHAR wzFirstKey[MAX_DARWIN_KEY + 1];
65 WCHAR wzSecondKey[MAX_DARWIN_KEY + 1];
66
67 CPI_KEY_PAIR* pNext;
68};
69
70struct CPI_DEPENDENCY_CHAIN
71{
72 LPCWSTR pwzKey;
73
74 CPI_DEPENDENCY_CHAIN* pPrev;
75};
76
77struct CPI_MODULE
78{
79 WCHAR wzKey[MAX_DARWIN_KEY + 1];
80
81 CPI_MODULE* pPrev;
82 CPI_MODULE* pNext;
83};
84
85struct CPI_MODULE_LIST
86{
87 CPI_MODULE* pFirst;
88 CPI_MODULE* pLast;
89};
90
91
92// property definitions
93
94CPI_PROPERTY_DEFINITION pdlComponentProperties[] =
95{
96 {L"AllowInprocSubscribers", cpptBoolean, 500},
97 {L"ComponentAccessChecksEnabled", cpptBoolean, 500},
98 {L"ComponentTransactionTimeout", cpptInteger, 500},
99 {L"ComponentTransactionTimeoutEnabled", cpptBoolean, 500},
100 {L"COMTIIntrinsics", cpptBoolean, 500},
101 {L"ConstructionEnabled", cpptBoolean, 500},
102 {L"ConstructorString", cpptString, 500},
103 {L"CreationTimeout", cpptInteger, 500},
104 {L"Description", cpptString, 500},
105 {L"EventTrackingEnabled", cpptBoolean, 500},
106 {L"ExceptionClass", cpptString, 500},
107 {L"FireInParallel", cpptBoolean, 500},
108 {L"IISIntrinsics", cpptBoolean, 500},
109 {L"InitializesServerApplication", cpptBoolean, 500},
110 {L"IsEnabled", cpptBoolean, 501},
111 {L"IsPrivateComponent", cpptBoolean, 501},
112 {L"JustInTimeActivation", cpptBoolean, 500},
113 {L"LoadBalancingSupported", cpptBoolean, 500},
114 {L"MaxPoolSize", cpptInteger, 500},
115 {L"MinPoolSize", cpptInteger, 500},
116 {L"MultiInterfacePublisherFilterCLSID", cpptString, 500},
117 {L"MustRunInClientContext", cpptBoolean, 500},
118 {L"MustRunInDefaultContext", cpptBoolean, 501},
119 {L"ObjectPoolingEnabled", cpptBoolean, 500},
120 {L"PublisherID", cpptString, 500},
121 {L"SoapAssemblyName", cpptString, 502},
122 {L"SoapTypeName", cpptString, 502},
123 {L"Synchronization", cpptInteger, 500},
124 {L"Transaction", cpptInteger, 500},
125 {L"TxIsolationLevel", cpptInteger, 501},
126 {NULL, cpptNone, 0}
127};
128
129CPI_PROPERTY_DEFINITION pdlInterfaceProperties[] =
130{
131 {L"Description", cpptString, 500},
132 {L"QueuingEnabled", cpptBoolean, 500},
133 {NULL, cpptNone, 0}
134};
135
136CPI_PROPERTY_DEFINITION pdlMethodProperties[] =
137{
138 {L"AutoComplete", cpptBoolean, 500},
139 {L"Description", cpptString, 500},
140 {NULL, cpptNone, 0}
141};
142
143
144// prototypes for private helper functions
145
146static HRESULT GetAssemblyName(
147 LPCWSTR pwzComponent,
148 LPWSTR* ppwzAssemblyName
149 );
150static HRESULT KeyPairsRead(
151 LPCWSTR pwzQuery,
152 CPI_KEY_PAIR** ppKeyPairList
153 );
154static HRESULT ModulesRead(
155 CPI_MODULE_LIST* pModList
156 );
157static HRESULT AssembliesRead(
158 CPI_KEY_PAIR* pModCompList,
159 CPI_APPLICATION_LIST* pAppList,
160 CPI_APPLICATION_ROLE_LIST* pAppRoleList,
161 CPI_ASSEMBLY_LIST* pAsmList
162 );
163static HRESULT ComponentsRead(
164 LPCWSTR pwzAsmKey,
165 CPI_APPLICATION_ROLE_LIST* pAppRoleList,
166 CPI_ASSEMBLY* pAsm
167 );
168static HRESULT InterfacesRead(
169 LPCWSTR pwzCompKey,
170 CPI_APPLICATION_ROLE_LIST* pAppRoleList,
171 CPI_ASSEMBLY* pAsm,
172 CPISCHED_COMPONENT* pComp
173 );
174static HRESULT MethodsRead(
175 LPCWSTR pwzIntfKey,
176 CPI_APPLICATION_ROLE_LIST* pAppRoleList,
177 CPI_ASSEMBLY* pAsm,
178 CPISCHED_INTERFACE* pIntf
179 );
180static HRESULT RoleAssignmentsRead(
181 LPCWSTR pwzQuery,
182 LPCWSTR pwzKey,
183 CPI_APPLICATION_ROLE_LIST* pAppRoleList,
184 CPISCHED_ROLE_ASSIGNMENT** ppRoleList,
185 int* piInstallCount,
186 int* piUninstallCount
187 );
188static HRESULT TopSortModuleList(
189 CPI_KEY_PAIR* pDepList,
190 CPI_MODULE_LIST* pList
191 );
192static HRESULT SwapDependentModules(
193 CPI_DEPENDENCY_CHAIN* pdcPrev,
194 CPI_KEY_PAIR* pDepList,
195 CPI_MODULE_LIST* pList,
196 CPI_MODULE* pRoot,
197 CPI_MODULE* pItm
198 );
199static HRESULT ModuleFindByKey(
200 CPI_MODULE* pItm,
201 LPCWSTR pwzKey,
202 BOOL fReverse,
203 CPI_MODULE** ppItm
204 );
205static void SortAssemblyListByModule(
206 CPI_MODULE_LIST* pModList,
207 CPI_ASSEMBLY_LIST* pAsmList
208 );
209static HRESULT TopSortAssemblyList(
210 CPI_KEY_PAIR* pDepList,
211 CPI_ASSEMBLY_LIST* pList
212 );
213static HRESULT SwapDependentAssemblies(
214 CPI_DEPENDENCY_CHAIN* pdcPrev,
215 CPI_KEY_PAIR* pDepList,
216 CPI_ASSEMBLY_LIST* pList,
217 CPI_ASSEMBLY* pRoot,
218 CPI_ASSEMBLY* pItm
219 );
220static HRESULT AssemblyFindByKey(
221 CPI_ASSEMBLY* pItm,
222 LPCWSTR pwzKey,
223 BOOL fReverse,
224 CPI_ASSEMBLY** ppItm
225 );
226static HRESULT AddAssemblyToActionData(
227 CPI_ASSEMBLY* pItm,
228 BOOL fInstall,
229 int iActionType,
230 int iActionCost,
231 LPWSTR* ppwzActionData
232 );
233static HRESULT AddRoleAssignmentsToActionData(
234 CPI_ASSEMBLY* pItm,
235 BOOL fInstall,
236 int iActionType,
237 int iActionCost,
238 LPWSTR* ppwzActionData
239 );
240static HRESULT AddComponentToActionData(
241 CPISCHED_COMPONENT* pItm,
242 BOOL fInstall,
243 BOOL fProps,
244 BOOL fRoles,
245 LPWSTR* ppwzActionData
246 );
247static HRESULT AddInterfaceToActionData(
248 CPISCHED_INTERFACE* pItm,
249 BOOL fInstall,
250 BOOL fProps,
251 BOOL fRoles,
252 LPWSTR* ppwzActionData
253 );
254static HRESULT AddMethodToActionData(
255 CPISCHED_METHOD* pItm,
256 BOOL fInstall,
257 BOOL fProps,
258 BOOL fRoles,
259 LPWSTR* ppwzActionData
260 );
261static HRESULT AddRolesToActionData(
262 int iRoleInstallCount,
263 int iRoleUninstallCount,
264 CPISCHED_ROLE_ASSIGNMENT* pRoleList,
265 BOOL fInstall,
266 BOOL fRoles,
267 LPWSTR* ppwzActionData
268 );
269static HRESULT KeyPairFindByFirstKey(
270 CPI_KEY_PAIR* pList,
271 LPCWSTR pwzKey,
272 CPI_KEY_PAIR** ppItm
273 );
274static void AssemblyFree(
275 CPI_ASSEMBLY* pItm
276 );
277static void KeyPairsFreeList(
278 CPI_KEY_PAIR* pList
279 );
280void ModuleListFree(
281 CPI_MODULE_LIST* pList
282 );
283static void ModuleFree(
284 CPI_MODULE* pItm
285 );
286static void ComponentsFreeList(
287 CPISCHED_COMPONENT* pList
288 );
289static void InterfacesFreeList(
290 CPISCHED_INTERFACE* pList
291 );
292static void MethodsFreeList(
293 CPISCHED_METHOD* pList
294 );
295static void RoleAssignmentsFreeList(
296 CPISCHED_ROLE_ASSIGNMENT* pList
297 );
298
299
300// function definitions
301
302void CpiAssemblyListFree(
303 CPI_ASSEMBLY_LIST* pList
304 )
305{
306 CPI_ASSEMBLY* pItm = pList->pFirst;
307
308 while (pItm)
309 {
310 CPI_ASSEMBLY* pDelete = pItm;
311 pItm = pItm->pNext;
312 AssemblyFree(pDelete);
313 }
314}
315
316HRESULT CpiAssembliesRead(
317 CPI_APPLICATION_LIST* pAppList,
318 CPI_APPLICATION_ROLE_LIST* pAppRoleList,
319 CPI_ASSEMBLY_LIST* pAsmList
320 )
321{
322 HRESULT hr = S_OK;
323 CPI_MODULE_LIST modList;
324 CPI_KEY_PAIR* pModCompList = NULL;
325 CPI_KEY_PAIR* pModDepList = NULL;
326 CPI_KEY_PAIR* pAsmDepList = NULL;
327
328 ::ZeroMemory(&modList, sizeof(CPI_MODULE_LIST));
329
330 BOOL fModuleSignatureTable = (S_OK == WcaTableExists(L"ModuleSignature"));
331 BOOL fModuleComponentsTable = (S_OK == WcaTableExists(L"ModuleComponents"));
332 BOOL fModuleDependencyTable = (S_OK == WcaTableExists(L"ModuleDependency"));
333
334 // read modules
335 if (fModuleSignatureTable)
336 {
337 hr = ModulesRead(&modList);
338 ExitOnFailure(hr, "Failed to read ModuleSignature table");
339 }
340
341 // read module components
342 if (fModuleComponentsTable)
343 {
344 hr = KeyPairsRead(vcsModuleComponentsQuery, &pModCompList);
345 ExitOnFailure(hr, "Failed to read ModuleComponents table");
346 }
347
348 // read module dependencies
349 if (fModuleDependencyTable)
350 {
351 hr = KeyPairsRead(vcsModuleDependencyQuery, &pModDepList);
352 ExitOnFailure(hr, "Failed to read ModuleDependency table");
353 }
354
355 // read assemblies
356 hr = AssembliesRead(pModCompList, pAppList, pAppRoleList, pAsmList);
357 ExitOnFailure(hr, "Failed to read ComPlusAssembly table");
358
359 // read assembly dependencies
360 if (CpiTableExists(cptComPlusAssemblyDependency))
361 {
362 hr = KeyPairsRead(vcsAssemblyDependencyQuery, &pAsmDepList);
363 ExitOnFailure(hr, "Failed to read ComPlusAssemblyDependency table");
364 }
365
366 // sort modules
367 if (modList.pFirst && pModDepList)
368 {
369 hr = TopSortModuleList(pModDepList, &modList);
370 ExitOnFailure(hr, "Failed to sort modules");
371 }
372
373 // sort assemblies by module
374 if (pAsmList->pFirst && modList.pFirst && pModDepList)
375 SortAssemblyListByModule(&modList, pAsmList);
376
377 // sort assemblies by dependency
378 if (pAsmList->pFirst && pAsmDepList)
379 {
380 hr = TopSortAssemblyList(pAsmDepList, pAsmList);
381 ExitOnFailure(hr, "Failed to sort assemblies");
382 }
383
384 hr = S_OK;
385
386LExit:
387 // clean up
388 ModuleListFree(&modList);
389 if (pModCompList)
390 KeyPairsFreeList(pModCompList);
391 if (pModDepList)
392 KeyPairsFreeList(pModDepList);
393 if (pAsmDepList)
394 KeyPairsFreeList(pAsmDepList);
395
396 return hr;
397}
398
399HRESULT CpiAssembliesVerifyInstall(
400 CPI_ASSEMBLY_LIST* pList
401 )
402{
403 HRESULT hr = S_OK;
404
405 for (CPI_ASSEMBLY* pItm = pList->pFirst; pItm; pItm = pItm->pNext)
406 {
407 // assemblies that are being installed
408 if (!pItm->fReferencedForInstall && !pItm->iRoleAssignmentsInstallCount && !WcaIsInstalling(pItm->isInstalled, pItm->isAction))
409 continue;
410
411 // if the assembly is referensed, it must be installed
412 if ((pItm->fReferencedForInstall || pItm->iRoleAssignmentsInstallCount) && !CpiWillBeInstalled(pItm->isInstalled, pItm->isAction))
413 MessageExitOnFailure(hr = E_FAIL, msierrComPlusAssemblyDependency, "An assembly is used by another entity being installed, but is not installed itself, key: %S", pItm->wzKey);
414 }
415
416 hr = S_OK;
417
418LExit:
419 return hr;
420}
421
422HRESULT CpiAssembliesVerifyUninstall(
423 CPI_ASSEMBLY_LIST* pList
424 )
425{
426 HRESULT hr = S_OK;
427
428 for (CPI_ASSEMBLY* pItm = pList->pFirst; pItm; pItm = pItm->pNext)
429 {
430 // assemblies that are being uninstalled
431 if (!pItm->fReferencedForUninstall && !pItm->iRoleAssignmentsUninstallCount && (!WcaIsUninstalling(pItm->isInstalled, pItm->isAction) && !WcaIsReInstalling(pItm->isInstalled, pItm->isAction)))
432 continue;
433
434 // if the application is not present, there is no need to remove the components
435 if (pItm->pApplication && pItm->pApplication->fObjectNotFound)
436 {
437 pItm->fIgnore = TRUE;
438 pList->iUninstallCount--; // elements with the fIgnore flag set will not be scheduled for uninstall
439 pList->iRoleUninstallCount--;
440 }
441 }
442
443 hr = S_OK;
444
445//LExit:
446 return hr;
447}
448
449HRESULT CpiAssembliesInstall(
450 CPI_ASSEMBLY_LIST* pList,
451 int iRunMode,
452 LPWSTR* ppwzActionData,
453 int* piProgress
454 )
455{
456 HRESULT hr = S_OK;
457
458 int iActionType;
459 int iCount = 0;
460
461 // add action text
462 hr = CpiAddActionTextToActionData(L"RegisterComPlusAssemblies", ppwzActionData);
463 ExitOnFailure(hr, "Failed to add action text to custom action data");
464
465 // assembly count
466 switch (iRunMode)
467 {
468 case rmDeferred:
469 iCount = pList->iInstallCount - pList->iCommitCount;
470 break;
471 case rmCommit:
472 iCount = pList->iCommitCount;
473 break;
474 case rmRollback:
475 iCount = pList->iInstallCount;
476 break;
477 }
478
479 // add assembly count to action data
480 hr = WcaWriteIntegerToCaData(iCount, ppwzActionData);
481 ExitOnFailure(hr, "Failed to add count to custom action data");
482
483 // add assemblies to custom action data in forward order
484 for (CPI_ASSEMBLY* pItm = pList->pFirst; pItm; pItm = pItm->pNext)
485 {
486 // assemblies that are being installed, or contains roll assignments to install
487 if (!WcaIsInstalling(pItm->isInstalled, pItm->isAction))
488 continue;
489
490 // assemblies that are being installed must be scheduled during the right type of action
491 BOOL fRunInCommit = 0 != (pItm->iAttributes & aaRunInCommit);
492 if (((rmCommit == iRunMode && !fRunInCommit) || (rmDeferred == iRunMode && fRunInCommit)))
493 continue;
494
495 // action type
496 if (rmRollback == iRunMode)
497 {
498 if (CpiIsInstalled(pItm->isInstalled))
499 iActionType = atNoOp;
500 else
501 iActionType = atRemove;
502 }
503 else
504 iActionType = atCreate;
505
506 // add to action data
507 hr = AddAssemblyToActionData(pItm, TRUE, iActionType, COST_ASSEMBLY_REGISTER, ppwzActionData);
508 ExitOnFailure(hr, "Failed to add assembly to custom action data, key: %S", pItm->wzKey);
509 }
510
511 // add progress tics
512 if (piProgress)
513 *piProgress += COST_ASSEMBLY_REGISTER * iCount;
514
515 hr = S_OK;
516
517LExit:
518 return hr;
519}
520
521HRESULT CpiAssembliesUninstall(
522 CPI_ASSEMBLY_LIST* pList,
523 int iRunMode,
524 LPWSTR* ppwzActionData,
525 int* piProgress
526 )
527{
528 HRESULT hr = S_OK;
529
530 int iActionType;
531
532 // add action text
533 hr = CpiAddActionTextToActionData(L"UnregisterComPlusAssemblies", ppwzActionData);
534 ExitOnFailure(hr, "Failed to add action text to custom action data");
535
536 // add assembly count to action data
537 hr = WcaWriteIntegerToCaData(pList->iUninstallCount, ppwzActionData);
538 ExitOnFailure(hr, "Failed to add count to custom action data");
539
540 // add assemblies to custom action data in reverse order
541 for (CPI_ASSEMBLY* pItm = pList->pLast; pItm; pItm = pItm->pPrev)
542 {
543 // assemblies that are being uninstalled
544 if (pItm->fIgnore || (!WcaIsUninstalling(pItm->isInstalled, pItm->isAction) && !WcaIsReInstalling(pItm->isInstalled, pItm->isAction)))
545 continue;
546
547 // action type
548 if (rmRollback == iRunMode)
549 iActionType = atCreate;
550 else
551 iActionType = atRemove;
552
553 // add to action data
554 hr = AddAssemblyToActionData(pItm, FALSE, iActionType, COST_ASSEMBLY_UNREGISTER, ppwzActionData);
555 ExitOnFailure(hr, "Failed to add assembly to custom action data, key: %S", pItm->wzKey);
556 }
557
558 // add progress tics
559 if (piProgress)
560 *piProgress += COST_ASSEMBLY_UNREGISTER * pList->iUninstallCount;
561
562 hr = S_OK;
563
564LExit:
565 return hr;
566}
567
568HRESULT CpiRoleAssignmentsInstall(
569 CPI_ASSEMBLY_LIST* pList,
570 int iRunMode,
571 LPWSTR* ppwzActionData,
572 int* piProgress
573 )
574{
575 HRESULT hr = S_OK;
576
577 int iActionType;
578 int iCount = 0;
579
580 // add action text
581 hr = CpiAddActionTextToActionData(L"AddComPlusRoleAssignments", ppwzActionData);
582 ExitOnFailure(hr, "Failed to add action text to custom action data");
583
584 // assembly count
585 switch (iRunMode)
586 {
587 case rmDeferred:
588 iCount = pList->iRoleInstallCount - pList->iRoleCommitCount;
589 break;
590 case rmCommit:
591 iCount = pList->iRoleCommitCount;
592 break;
593 case rmRollback:
594 iCount = pList->iRoleInstallCount;
595 break;
596 }
597
598 // add assembly count to action data
599 hr = WcaWriteIntegerToCaData(iCount, ppwzActionData);
600 ExitOnFailure(hr, "Failed to add count to custom action data");
601
602 // add assemblies to custom action data in forward order
603 for (CPI_ASSEMBLY* pItm = pList->pFirst; pItm; pItm = pItm->pNext)
604 {
605 // assemblies that are being installed, or contains roll assignments to install
606 if (!pItm->iRoleAssignmentsInstallCount)
607 continue;
608
609 // assemblies that are being installed must be scheduled during the right type of action
610 BOOL fRunInCommit = 0 != (pItm->iAttributes & aaRunInCommit);
611 if (((rmCommit == iRunMode && !fRunInCommit) || (rmDeferred == iRunMode && fRunInCommit)))
612 continue;
613
614 // action type
615 if (rmRollback == iRunMode)
616 {
617 if (CpiIsInstalled(pItm->isInstalled))
618 iActionType = atNoOp;
619 else
620 iActionType = atRemove;
621 }
622 else
623 iActionType = atCreate;
624
625 // add to action data
626 hr = AddRoleAssignmentsToActionData(pItm, TRUE, iActionType, COST_ROLLASSIGNMENT_CREATE, ppwzActionData);
627 ExitOnFailure(hr, "Failed to add assembly to custom action data, key: %S", pItm->wzKey);
628
629 // add progress tics
630 if (piProgress)
631 *piProgress += COST_ROLLASSIGNMENT_CREATE * pItm->iRoleAssignmentsInstallCount;
632 }
633
634 hr = S_OK;
635
636LExit:
637 return hr;
638}
639
640HRESULT CpiRoleAssignmentsUninstall(
641 CPI_ASSEMBLY_LIST* pList,
642 int iRunMode,
643 LPWSTR* ppwzActionData,
644 int* piProgress
645 )
646{
647 HRESULT hr = S_OK;
648
649 int iActionType;
650
651 // add action text
652 hr = CpiAddActionTextToActionData(L"RemoveComPlusRoleAssignments", ppwzActionData);
653 ExitOnFailure(hr, "Failed to add action text to custom action data");
654
655 // add assembly count to action data
656 hr = WcaWriteIntegerToCaData(pList->iRoleUninstallCount, ppwzActionData);
657 ExitOnFailure(hr, "Failed to add count to custom action data");
658
659 // add assemblies to custom action data in reverse order
660 for (CPI_ASSEMBLY* pItm = pList->pLast; pItm; pItm = pItm->pPrev)
661 {
662 // assemblies that are being uninstalled
663 if (pItm->fIgnore || !pItm->iRoleAssignmentsUninstallCount)
664 continue;
665
666 // action type
667 if (rmRollback == iRunMode)
668 iActionType = atCreate;
669 else
670 iActionType = atRemove;
671
672 // add to action data
673 hr = AddRoleAssignmentsToActionData(pItm, FALSE, iActionType, COST_ROLLASSIGNMENT_DELETE, ppwzActionData);
674 ExitOnFailure(hr, "Failed to add assembly to custom action data, key: %S", pItm->wzKey);
675
676 // add progress tics
677 if (piProgress)
678 *piProgress += COST_ROLLASSIGNMENT_DELETE * pItm->iRoleAssignmentsUninstallCount;
679 }
680
681 hr = S_OK;
682
683LExit:
684 return hr;
685}
686
687HRESULT CpiGetSubscriptionsCollForComponent(
688 CPI_ASSEMBLY* pAsm,
689 CPISCHED_COMPONENT* pComp,
690 ICatalogCollection** ppiSubsColl
691 )
692{
693 HRESULT hr = S_OK;
694
695 ICatalogCollection* piCompColl = NULL;
696 ICatalogObject* piCompObj = NULL;
697
698 // get applications collection
699 if (!pComp->piSubsColl)
700 {
701 // get components collection for application
702 hr = CpiGetComponentsCollForApplication(pAsm->pApplication, &piCompColl);
703 ExitOnFailure(hr, "Failed to get components collection for application");
704
705 if (S_FALSE == hr)
706 ExitFunction(); // exit with hr = S_FALSE
707
708 // find component object
709 hr = CpiFindCollectionObject(piCompColl, pComp->wzCLSID, NULL, &piCompObj);
710 ExitOnFailure(hr, "Failed to find component object");
711
712 if (S_FALSE == hr)
713 ExitFunction(); // exit with hr = S_FALSE
714
715 // get roles collection
716 hr = CpiSchedGetCatalogCollection(piCompColl, piCompObj, L"SubscriptionsForComponent", &pComp->piSubsColl);
717 ExitOnFailure(hr, "Failed to get subscriptions collection");
718 }
719
720 // return value
721 *ppiSubsColl = pComp->piSubsColl;
722 (*ppiSubsColl)->AddRef();
723
724 hr = S_OK;
725
726LExit:
727 // clean up
728 ReleaseObject(piCompColl);
729 ReleaseObject(piCompObj);
730
731 return hr;
732}
733
734
735// helper function definitions
736
737static HRESULT GetAssemblyName(
738 LPCWSTR pwzComponent,
739 LPWSTR* ppwzAssemblyName
740 )
741{
742 HRESULT hr = S_OK;
743
744 PMSIHANDLE hView, hRecKey, hRec;
745
746 LPWSTR pwzKey = NULL;
747
748 LPWSTR pwzName = NULL;
749 LPWSTR pwzVersion = NULL;
750 LPWSTR pwzCulture = NULL;
751 LPWSTR pwzPublicKeyToken = NULL;
752
753 // create parameter record
754 hRecKey = ::MsiCreateRecord(1);
755 ExitOnNull(hRecKey, hr, E_OUTOFMEMORY, "Failed to create record");
756 hr = WcaSetRecordString(hRecKey, 1, pwzComponent);
757 ExitOnFailure(hr, "Failed to set record string");
758
759 // open view
760 hr = WcaOpenView(vcsMsiAssemblyNameQuery, &hView);
761 ExitOnFailure(hr, "Failed to open view on MsiAssemblyName table");
762 hr = WcaExecuteView(hView, hRecKey);
763 ExitOnFailure(hr, "Failed to execute view on MsiAssemblyName table");
764
765 while (S_OK == (hr = WcaFetchRecord(hView, &hRec)))
766 {
767 // read key
768 hr = WcaGetRecordString(hRec, manqName, &pwzKey);
769 ExitOnFailure(hr, "Failed to get name");
770
771 // read value
772 if (0 == lstrcmpiW(L"name", pwzKey))
773 hr = WcaGetRecordString(hRec, manqValue, &pwzName);
774 else if (0 == lstrcmpiW(L"version", pwzKey))
775 hr = WcaGetRecordString(hRec, manqValue, &pwzVersion);
776 else if (0 == lstrcmpiW(L"culture", pwzKey))
777 hr = WcaGetRecordString(hRec, manqValue, &pwzCulture);
778 else if (0 == lstrcmpiW(L"publicKeyToken", pwzKey))
779 hr = WcaGetRecordString(hRec, manqValue, &pwzPublicKeyToken);
780 else
781 {
782 WcaLog(LOGMSG_VERBOSE, "Unknown name in MsiAssemblyName table: %S, %S", pwzComponent, pwzKey);
783 hr = S_OK;
784 }
785
786 ExitOnFailure(hr, "Failed to get value");
787 }
788
789 if (E_NOMOREITEMS != hr)
790 ExitOnFailure(hr, "Failed to fetch record");
791
792 // verify
793 if (!(pwzName && *pwzName) || !(pwzVersion && *pwzVersion))
794 ExitOnFailure(hr = E_FAIL, "Incomplete assembly name");
795
796 // build name string
797 hr = StrAllocFormatted(ppwzAssemblyName, L"%s, Version=%s, Culture=%s, PublicKeyToken=%s",
798 pwzName, pwzVersion,
799 pwzCulture && *pwzCulture ? pwzCulture : L"Neutral",
800 pwzPublicKeyToken && *pwzPublicKeyToken ? pwzPublicKeyToken : L"null");
801 ExitOnFailure(hr, "Failed to build assembly name string");
802
803 hr = S_OK;
804
805LExit:
806 // clean up
807 ReleaseStr(pwzKey);
808 ReleaseStr(pwzName);
809 ReleaseStr(pwzVersion);
810 ReleaseStr(pwzCulture);
811 ReleaseStr(pwzPublicKeyToken);
812
813 return hr;
814}
815
816static HRESULT KeyPairsRead(
817 LPCWSTR pwzQuery,
818 CPI_KEY_PAIR** ppKeyPairList
819 )
820{
821 HRESULT hr = S_OK;
822
823 PMSIHANDLE hView, hRec;
824
825 CPI_KEY_PAIR* pItm = NULL;
826 LPWSTR pwzData = NULL;
827
828 // loop through all dependencies
829 hr = WcaOpenExecuteView(pwzQuery, &hView);
830 ExitOnFailure(hr, "Failed to execute view on table");
831
832 while (S_OK == (hr = WcaFetchRecord(hView, &hRec)))
833 {
834 // create entry
835 pItm = (CPI_KEY_PAIR*)::HeapAlloc(::GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(CPI_KEY_PAIR));
836 if (!pItm)
837 ExitFunction1(hr = E_OUTOFMEMORY);
838
839 // get key
840 hr = WcaGetRecordString(hRec, kpqFirstKey, &pwzData);
841 ExitOnFailure(hr, "Failed to get first key");
842 StringCchCopyW(pItm->wzFirstKey, countof(pItm->wzFirstKey), pwzData);
843
844 // get key
845 hr = WcaGetRecordString(hRec, kpqSecondKey, &pwzData);
846 ExitOnFailure(hr, "Failed to get second key");
847 StringCchCopyW(pItm->wzSecondKey, countof(pItm->wzSecondKey), pwzData);
848
849 // add entry
850 if (*ppKeyPairList)
851 pItm->pNext = *ppKeyPairList;
852 *ppKeyPairList = pItm;
853 pItm = NULL;
854 }
855
856 if (E_NOMOREITEMS == hr)
857 hr = S_OK;
858
859LExit:
860 // clean up
861 if (pItm)
862 KeyPairsFreeList(pItm);
863
864 ReleaseStr(pwzData);
865
866 return hr;
867}
868
869static HRESULT ModulesRead(
870 CPI_MODULE_LIST* pModList
871 )
872{
873 HRESULT hr = S_OK;
874
875 PMSIHANDLE hView, hRec;
876
877 CPI_MODULE* pItm = NULL;
878 LPWSTR pwzData = NULL;
879
880 // loop through all modules
881 hr = WcaOpenExecuteView(vcsModuleQuery, &hView);
882 ExitOnFailure(hr, "Failed to execute view on ModuleSignature table");
883
884 while (S_OK == (hr = WcaFetchRecord(hView, &hRec)))
885 {
886 // create entry
887 pItm = (CPI_MODULE*)::HeapAlloc(::GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(CPI_MODULE));
888 if (!pItm)
889 ExitFunction1(hr = E_OUTOFMEMORY);
890
891 // get key
892 hr = WcaGetRecordString(hRec, mqModule, &pwzData);
893 ExitOnFailure(hr, "Failed to get key");
894 StringCchCopyW(pItm->wzKey, countof(pItm->wzKey), pwzData);
895
896 // add entry
897 if (pModList->pLast)
898 {
899 pModList->pLast->pNext = pItm;
900 pItm->pPrev = pModList->pLast;
901 }
902 else
903 pModList->pFirst = pItm;
904 pModList->pLast = pItm;
905 pItm = NULL;
906 }
907
908 if (E_NOMOREITEMS == hr)
909 hr = S_OK;
910
911LExit:
912 // clean up
913 if (pItm)
914 ModuleFree(pItm);
915
916 ReleaseStr(pwzData);
917
918 return hr;
919}
920
921static HRESULT AssembliesRead(
922 CPI_KEY_PAIR* pModCompList,
923 CPI_APPLICATION_LIST* pAppList,
924 CPI_APPLICATION_ROLE_LIST* pAppRoleList,
925 CPI_ASSEMBLY_LIST* pAsmList
926 )
927{
928 HRESULT hr = S_OK;
929 UINT er = ERROR_SUCCESS;
930
931 PMSIHANDLE hView, hRec;
932
933 CPI_ASSEMBLY* pItm = NULL;
934 CPI_KEY_PAIR* pModComp;
935 LPWSTR pwzData = NULL;
936 LPWSTR pwzComponent = NULL;
937 BOOL fMatchingArchitecture = FALSE;
938
939 // loop through all assemblies
940 hr = WcaOpenExecuteView(vcsAssemblyQuery, &hView);
941 ExitOnFailure(hr, "Failed to execute view on ComPlusAssembly table");
942
943 while (S_OK == (hr = WcaFetchRecord(hView, &hRec)))
944 {
945 // get component
946 hr = WcaGetRecordString(hRec, aqComponent, &pwzComponent);
947 ExitOnFailure(hr, "Failed to get component");
948
949 // check if the component is our processor architecture
950 hr = CpiVerifyComponentArchitecure(pwzComponent, &fMatchingArchitecture);
951 ExitOnFailure(hr, "Failed to get component architecture.");
952
953 if (!fMatchingArchitecture)
954 {
955 continue; // not the same architecture, ignore
956 }
957
958 // create entry
959 pItm = (CPI_ASSEMBLY*)::HeapAlloc(::GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(CPI_ASSEMBLY));
960 if (!pItm)
961 ExitFunction1(hr = E_OUTOFMEMORY);
962
963 // get component install state
964 er = ::MsiGetComponentStateW(WcaGetInstallHandle(), pwzComponent, &pItm->isInstalled, &pItm->isAction);
965 ExitOnFailure(hr = HRESULT_FROM_WIN32(er), "Failed to get component state");
966
967 // get key
968 hr = WcaGetRecordString(hRec, aqAssembly, &pwzData);
969 ExitOnFailure(hr, "Failed to get key");
970 StringCchCopyW(pItm->wzKey, countof(pItm->wzKey), pwzData);
971
972 // get attributes
973 hr = WcaGetRecordInteger(hRec, aqAttributes, &pItm->iAttributes);
974 ExitOnFailure(hr, "Failed to get attributes");
975
976 // get assembly name
977 hr = WcaGetRecordFormattedString(hRec, aqAssemblyName, &pItm->pwzAssemblyName);
978 ExitOnFailure(hr, "Failed to get assembly name");
979
980 if (!*pItm->pwzAssemblyName && (pItm->iAttributes & aaPathFromGAC))
981 {
982 // get assembly name for component
983 hr = GetAssemblyName(pwzComponent, &pItm->pwzAssemblyName);
984 ExitOnFailure(hr, "Failed to get assembly name for component");
985 }
986
987 // get dll path
988 hr = WcaGetRecordFormattedString(hRec, aqDllPath, &pItm->pwzDllPath);
989 ExitOnFailure(hr, "Failed to get assembly dll path");
990
991 // get module
992 // TODO: if there is a very large number of components belonging to modules, this search might be slow
993 hr = KeyPairFindByFirstKey(pModCompList, pwzData, &pModComp);
994
995 if (S_OK == hr)
996 StringCchCopyW(pItm->wzModule, countof(pItm->wzModule), pModComp->wzSecondKey);
997
998 // get application
999 hr = WcaGetRecordString(hRec, aqApplication, &pwzData);
1000 ExitOnFailure(hr, "Failed to get application");
1001
1002 if (pwzData && *pwzData)
1003 {
1004 hr = CpiApplicationFindByKey(pAppList, pwzData, &pItm->pApplication);
1005 if (S_FALSE == hr)
1006 hr = HRESULT_FROM_WIN32(ERROR_NOT_FOUND);
1007 ExitOnFailure(hr, "Failed to find application, key: %S", pwzData);
1008 }
1009
1010 // get tlb path
1011 hr = WcaGetRecordFormattedString(hRec, aqTlbPath, &pItm->pwzTlbPath);
1012 ExitOnFailure(hr, "Failed to get assembly tlb path");
1013
1014 // get proxy-stub dll path
1015 hr = WcaGetRecordFormattedString(hRec, aqPSDllPath, &pItm->pwzPSDllPath);
1016 ExitOnFailure(hr, "Failed to get assembly proxy-stub DLL path");
1017
1018 // read components
1019 if (CpiTableExists(cptComPlusComponent))
1020 {
1021 hr = ComponentsRead(pItm->wzKey, pAppRoleList, pItm);
1022 ExitOnFailure(hr, "Failed to read components for assembly");
1023 }
1024
1025 // set references & increment counters
1026 if (WcaIsInstalling(pItm->isInstalled, pItm->isAction))
1027 {
1028 pAsmList->iInstallCount++;
1029 if (pItm->iAttributes & aaRunInCommit)
1030 pAsmList->iCommitCount++;
1031 }
1032 if (WcaIsUninstalling(pItm->isInstalled, pItm->isAction) || WcaIsReInstalling(pItm->isInstalled, pItm->isAction))
1033 pAsmList->iUninstallCount++;
1034
1035 if (pItm->iRoleAssignmentsInstallCount)
1036 {
1037 pAsmList->iRoleInstallCount++;
1038 if (pItm->iAttributes & aaRunInCommit)
1039 pAsmList->iRoleCommitCount++;
1040 }
1041 if (pItm->iRoleAssignmentsUninstallCount)
1042 pAsmList->iRoleUninstallCount++;
1043
1044 if (pItm->pApplication)
1045 {
1046 if (pItm->iRoleAssignmentsInstallCount || WcaIsInstalling(pItm->isInstalled, pItm->isAction))
1047 CpiApplicationAddReferenceInstall(pItm->pApplication);
1048 if (pItm->iRoleAssignmentsUninstallCount || WcaIsUninstalling(pItm->isInstalled, pItm->isAction) || WcaIsReInstalling(pItm->isInstalled, pItm->isAction))
1049 CpiApplicationAddReferenceUninstall(pItm->pApplication);
1050 }
1051
1052 // add entry
1053 if (pAsmList->pLast)
1054 {
1055 pAsmList->pLast->pNext = pItm;
1056 pItm->pPrev = pAsmList->pLast;
1057 }
1058 else
1059 pAsmList->pFirst = pItm;
1060 pAsmList->pLast = pItm;
1061 pItm = NULL;
1062 }
1063
1064 if (E_NOMOREITEMS == hr)
1065 hr = S_OK;
1066
1067LExit:
1068 // clean up
1069 if (pItm)
1070 AssemblyFree(pItm);
1071
1072 ReleaseStr(pwzData);
1073 ReleaseStr(pwzComponent);
1074
1075 return hr;
1076}
1077
1078static HRESULT TopSortModuleList(
1079 CPI_KEY_PAIR* pDepList,
1080 CPI_MODULE_LIST* pList
1081 )
1082{
1083 HRESULT hr = S_OK;
1084
1085 // top sort list
1086 for (CPI_MODULE* pItm = pList->pFirst; pItm; pItm = pItm->pNext)
1087 {
1088 // append module
1089 hr = SwapDependentModules(NULL, pDepList, pList, pItm, pItm);
1090 ExitOnFailure(hr, "Failed to swap dependent modules");
1091 }
1092
1093 hr = S_OK;
1094
1095LExit:
1096 return hr;
1097}
1098
1099static HRESULT SwapDependentModules(
1100 CPI_DEPENDENCY_CHAIN* pdcPrev, // list containing the entire dependency chain
1101 CPI_KEY_PAIR* pDepList, // module dependency list
1102 CPI_MODULE_LIST* pList, // module list being sorted
1103 CPI_MODULE* pRoot, // first module in the chain
1104 CPI_MODULE* pItm // current module to test for dependencies
1105 )
1106{
1107 HRESULT hr = S_OK;
1108
1109 CPI_MODULE* pDepItm;
1110
1111 // find dependencies
1112 for (CPI_KEY_PAIR* pDep = pDepList; pDep; pDep = pDep->pNext)
1113 {
1114 if (0 == lstrcmpW(pItm->wzKey, pDep->wzFirstKey))
1115 {
1116 CPI_DEPENDENCY_CHAIN dcItm;
1117 dcItm.pwzKey = pItm->wzKey;
1118 dcItm.pPrev = pdcPrev;
1119
1120 // check for circular dependencies
1121 for (CPI_DEPENDENCY_CHAIN* pdcItm = &dcItm; pdcItm; pdcItm = pdcItm->pPrev)
1122 {
1123 if (0 == lstrcmpW(pdcItm->pwzKey, pDep->wzSecondKey))
1124 {
1125 // circular dependency found
1126 ExitOnFailure(hr = E_FAIL, "Circular module dependency found, key: %S", pDep->wzSecondKey);
1127 }
1128 }
1129
1130 // make sure the item is not already in the list
1131 hr = ModuleFindByKey(pRoot->pPrev, pDep->wzSecondKey, TRUE, &pDepItm); // find in reverse order
1132
1133 if (S_OK == hr)
1134 continue; // item found, move on
1135
1136 // find item in the list
1137 hr = ModuleFindByKey(pRoot->pNext, pDep->wzSecondKey, FALSE, &pDepItm); // find in forward order
1138
1139 if (S_FALSE == hr)
1140 {
1141 // not found
1142 ExitOnFailure(hr = E_FAIL, "Module dependency not found, key: %S", pDep->wzSecondKey);
1143 }
1144
1145 // if this item in turn has dependencies, they have to be swaped first
1146 hr = SwapDependentModules(&dcItm, pDepList, pList, pRoot, pDepItm);
1147 ExitOnFailure(hr, "Failed to swap dependent module");
1148
1149 // remove item from its current position
1150 pDepItm->pPrev->pNext = pDepItm->pNext; // pDepItm can never be the first item, no need to check pPrev
1151 if (pDepItm->pNext)
1152 pDepItm->pNext->pPrev = pDepItm->pPrev;
1153 else
1154 {
1155 pList->pLast = pDepItm->pPrev;
1156 pList->pLast->pNext = NULL;
1157 }
1158
1159 // insert before the current item
1160 if (pRoot->pPrev)
1161 pRoot->pPrev->pNext = pDepItm;
1162 else
1163 pList->pFirst = pDepItm;
1164 pDepItm->pPrev = pRoot->pPrev;
1165 pRoot->pPrev = pDepItm;
1166 pDepItm->pNext = pRoot;
1167 }
1168 }
1169
1170 hr = S_OK;
1171
1172LExit:
1173 return hr;
1174}
1175
1176static HRESULT ModuleFindByKey(
1177 CPI_MODULE* pItm,
1178 LPCWSTR pwzKey,
1179 BOOL fReverse,
1180 CPI_MODULE** ppItm
1181 )
1182{
1183 for (; pItm; pItm = fReverse ? pItm->pPrev : pItm->pNext)
1184 {
1185 if (0 == lstrcmpW(pItm->wzKey, pwzKey))
1186 {
1187 *ppItm = pItm;
1188 return S_OK;
1189 }
1190 }
1191
1192 return S_FALSE;
1193}
1194
1195static void SortAssemblyListByModule(
1196 CPI_MODULE_LIST* pModList,
1197 CPI_ASSEMBLY_LIST* pAsmList
1198 )
1199{
1200 CPI_ASSEMBLY* pMoved = NULL; // first moved item
1201
1202 // loop modules in reverse order
1203 for (CPI_MODULE* pMod = pModList->pLast; pMod; pMod = pMod->pPrev)
1204 {
1205 // loop assemblies in forward order, starting with the first unmoved item
1206 CPI_ASSEMBLY* pAsm = pMoved ? pMoved->pNext : pAsmList->pFirst;
1207 while (pAsm)
1208 {
1209 CPI_ASSEMBLY* pNext = pAsm->pNext;
1210
1211 // check if assembly belongs to the current module
1212 if (0 == lstrcmpW(pMod->wzKey, pAsm->wzModule))
1213 {
1214 // if the item is not already first in the list
1215 if (pAsm->pPrev)
1216 {
1217 // remove item from it's current position
1218 pAsm->pPrev->pNext = pAsm->pNext;
1219 if (pAsm->pNext)
1220 pAsm->pNext->pPrev = pAsm->pPrev;
1221 else
1222 pAsmList->pLast = pAsm->pPrev;
1223
1224 // insert item first in the list
1225 pAsmList->pFirst->pPrev = pAsm;
1226 pAsm->pNext = pAsmList->pFirst;
1227 pAsm->pPrev = NULL;
1228 pAsmList->pFirst = pAsm;
1229 }
1230
1231 // if we haven't moved any items yet, this is the first moved item
1232 if (!pMoved)
1233 pMoved = pAsm;
1234 }
1235
1236 pAsm = pNext;
1237 }
1238 }
1239}
1240
1241static HRESULT TopSortAssemblyList(
1242 CPI_KEY_PAIR* pDepList,
1243 CPI_ASSEMBLY_LIST* pList
1244 )
1245{
1246 HRESULT hr = S_OK;
1247
1248 // top sort list
1249 for (CPI_ASSEMBLY* pItm = pList->pFirst; pItm; pItm = pItm->pNext)
1250 {
1251 // append module
1252 hr = SwapDependentAssemblies(NULL, pDepList, pList, pItm, pItm);
1253 ExitOnFailure(hr, "Failed to swap dependent assemblies");
1254 }
1255
1256 hr = S_OK;
1257
1258LExit:
1259 return hr;
1260}
1261
1262static HRESULT SwapDependentAssemblies(
1263 CPI_DEPENDENCY_CHAIN* pdcPrev, // list containing the entire dependency chain
1264 CPI_KEY_PAIR* pDepList, // assembly dependency list
1265 CPI_ASSEMBLY_LIST* pList, // assembly list being sorted
1266 CPI_ASSEMBLY* pRoot, // first assembly in the chain
1267 CPI_ASSEMBLY* pItm // current assembly to test for dependencies
1268 )
1269{
1270 HRESULT hr = S_OK;
1271
1272 CPI_ASSEMBLY* pDepItm;
1273
1274 // find dependencies
1275 for (CPI_KEY_PAIR* pDep = pDepList; pDep; pDep = pDep->pNext)
1276 {
1277 if (0 == lstrcmpW(pItm->wzKey, pDep->wzFirstKey))
1278 {
1279 CPI_DEPENDENCY_CHAIN dcItm;
1280 dcItm.pwzKey = pItm->wzKey;
1281 dcItm.pPrev = pdcPrev;
1282
1283 // check for circular dependencies
1284 for (CPI_DEPENDENCY_CHAIN* pdcItm = &dcItm; pdcItm; pdcItm = pdcItm->pPrev)
1285 {
1286 if (0 == lstrcmpW(pdcItm->pwzKey, pDep->wzSecondKey))
1287 {
1288 // circular dependency found
1289 ExitOnFailure(hr = E_FAIL, "Circular assembly dependency found, key: %S", pDep->wzSecondKey);
1290 }
1291 }
1292
1293 // make sure the item is not already in the list
1294 hr = AssemblyFindByKey(pRoot->pPrev, pDep->wzSecondKey, TRUE, &pDepItm); // find in reverse order
1295
1296 if (S_OK == hr)
1297 continue; // item found, move on
1298
1299 // find item in the list
1300 hr = AssemblyFindByKey(pRoot->pNext, pDep->wzSecondKey, FALSE, &pDepItm); // find in forward order
1301
1302 if (S_FALSE == hr)
1303 {
1304 // not found
1305 ExitOnFailure(hr = E_FAIL, "Assembly dependency not found, key: %S", pDep->wzSecondKey);
1306 }
1307
1308 // if the root item belongs to a module, this item must also belong to the same module
1309 if (*pItm->wzModule)
1310 {
1311 if (0 != lstrcmpW(pDepItm->wzModule, pItm->wzModule))
1312 ExitOnFailure(hr = E_FAIL, "An assembly dependency can only exist between two assemblies not belonging to modules, or belonging to the same module. assembly: %S, required assembly: %S", pItm->wzKey, pDepItm->wzKey);
1313 }
1314
1315 // if this item in turn has dependencies, they have to be swaped first
1316 hr = SwapDependentAssemblies(&dcItm, pDepList, pList, pRoot, pDepItm);
1317 ExitOnFailure(hr, "Failed to swap dependent assemblies");
1318
1319 // remove item from its current position
1320 pDepItm->pPrev->pNext = pDepItm->pNext; // pDepItm can never be the first item, no need to check pPrev
1321 if (pDepItm->pNext)
1322 pDepItm->pNext->pPrev = pDepItm->pPrev;
1323 else
1324 {
1325 pList->pLast = pDepItm->pPrev;
1326 pList->pLast->pNext = NULL;
1327 }
1328
1329 // insert before the current item
1330 if (pRoot->pPrev)
1331 pRoot->pPrev->pNext = pDepItm;
1332 else
1333 pList->pFirst = pDepItm;
1334 pDepItm->pPrev = pRoot->pPrev;
1335 pRoot->pPrev = pDepItm;
1336 pDepItm->pNext = pRoot;
1337 }
1338 }
1339
1340 hr = S_OK;
1341
1342LExit:
1343 return hr;
1344}
1345
1346static HRESULT AssemblyFindByKey(
1347 CPI_ASSEMBLY* pItm,
1348 LPCWSTR pwzKey,
1349 BOOL fReverse,
1350 CPI_ASSEMBLY** ppItm
1351 )
1352{
1353 for (; pItm; pItm = fReverse ? pItm->pPrev : pItm->pNext)
1354 {
1355 if (0 == lstrcmpW(pItm->wzKey, pwzKey))
1356 {
1357 *ppItm = pItm;
1358 return S_OK;
1359 }
1360 }
1361
1362 return S_FALSE;
1363}
1364
1365static HRESULT ComponentsRead(
1366 LPCWSTR pwzAsmKey,
1367 CPI_APPLICATION_ROLE_LIST* pAppRoleList,
1368 CPI_ASSEMBLY* pAsm
1369 )
1370{
1371 HRESULT hr = S_OK;
1372 PMSIHANDLE hView;
1373 PMSIHANDLE hRec;
1374 PMSIHANDLE hRecKey;
1375 CPISCHED_COMPONENT* pItm = NULL;
1376 LPWSTR pwzData = NULL;
1377
1378 // create parameter record
1379 hRecKey = ::MsiCreateRecord(1);
1380 ExitOnNull(hRecKey, hr, E_OUTOFMEMORY, "Failed to create record");
1381 hr = WcaSetRecordString(hRecKey, 1, pwzAsmKey);
1382 ExitOnFailure(hr, "Failed to set record string");
1383
1384 // open view
1385 hr = WcaOpenView(vcsComponentQuery, &hView);
1386 ExitOnFailure(hr, "Failed to open view on ComPlusComponent table");
1387 hr = WcaExecuteView(hView, hRecKey);
1388 ExitOnFailure(hr, "Failed to execute view on ComPlusComponent table");
1389
1390 while (S_OK == (hr = WcaFetchRecord(hView, &hRec)))
1391 {
1392 // create entry
1393 pItm = (CPISCHED_COMPONENT*)::HeapAlloc(::GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(CPISCHED_COMPONENT));
1394 if (!pItm)
1395 ExitFunction1(hr = E_OUTOFMEMORY);
1396
1397 // get key
1398 hr = WcaGetRecordString(hRec, cqComponent, &pwzData);
1399 ExitOnFailure(hr, "Failed to get key");
1400 StringCchCopyW(pItm->wzKey, countof(pItm->wzKey), pwzData);
1401
1402 // get clsid
1403 hr = WcaGetRecordFormattedString(hRec, cqCLSID, &pwzData);
1404 ExitOnFailure(hr, "Failed to get clsid");
1405 StringCchCopyW(pItm->wzCLSID, countof(pItm->wzCLSID), pwzData);
1406
1407 // read properties
1408 if (CpiTableExists(cptComPlusComponentProperty))
1409 {
1410 hr = CpiPropertiesRead(vcsComponentPropertyQuery, pItm->wzKey, pdlComponentProperties, &pItm->pProperties, &pItm->iPropertyCount);
1411 ExitOnFailure(hr, "Failed to get component properties");
1412 }
1413
1414 // read roles
1415 if (CpiTableExists(cptComPlusRoleForComponent))
1416 {
1417 hr = RoleAssignmentsRead(vcsRoleForComponentQuery, pItm->wzKey, pAppRoleList, &pItm->pRoles, &pItm->iRoleInstallCount, &pItm->iRoleUninstallCount);
1418 ExitOnFailure(hr, "Failed to get roles for component");
1419 }
1420
1421 if (pItm->iRoleInstallCount)
1422 pAsm->iRoleAssignmentsInstallCount++;
1423 if (pItm->iRoleUninstallCount)
1424 pAsm->iRoleAssignmentsUninstallCount++;
1425
1426 // read interfaces
1427 if (CpiTableExists(cptComPlusInterface))
1428 {
1429 hr = InterfacesRead(pItm->wzKey, pAppRoleList, pAsm, pItm);
1430 ExitOnFailure(hr, "Failed to get interfaces for component");
1431 }
1432
1433 // add entry
1434 pAsm->iComponentCount++;
1435 if (pAsm->pComponents)
1436 pItm->pNext = pAsm->pComponents;
1437 pAsm->pComponents = pItm;
1438 pItm = NULL;
1439 }
1440
1441 if (E_NOMOREITEMS == hr)
1442 hr = S_OK;
1443
1444LExit:
1445 // clean up
1446 if (pItm)
1447 ComponentsFreeList(pItm);
1448
1449 ReleaseStr(pwzData);
1450
1451 return hr;
1452}
1453
1454static HRESULT InterfacesRead(
1455 LPCWSTR pwzCompKey,
1456 CPI_APPLICATION_ROLE_LIST* pAppRoleList,
1457 CPI_ASSEMBLY* pAsm,
1458 CPISCHED_COMPONENT* pComp
1459 )
1460{
1461 HRESULT hr = S_OK;
1462 PMSIHANDLE hView;
1463 PMSIHANDLE hRec;
1464 PMSIHANDLE hRecKey;
1465 CPISCHED_INTERFACE* pItm = NULL;
1466 LPWSTR pwzData = NULL;
1467
1468 // create parameter record
1469 hRecKey = ::MsiCreateRecord(1);
1470 ExitOnNull(hRecKey, hr, E_OUTOFMEMORY, "Failed to create record");
1471 hr = WcaSetRecordString(hRecKey, 1, pwzCompKey);
1472 ExitOnFailure(hr, "Failed to set record string");
1473
1474 // open view
1475 hr = WcaOpenView(vcsInterfaceQuery, &hView);
1476 ExitOnFailure(hr, "Failed to open view on ComPlusInterface table");
1477 hr = WcaExecuteView(hView, hRecKey);
1478 ExitOnFailure(hr, "Failed to execute view on ComPlusInterface table");
1479
1480 while (S_OK == (hr = WcaFetchRecord(hView, &hRec)))
1481 {
1482 // create entry
1483 pItm = (CPISCHED_INTERFACE*)::HeapAlloc(::GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(CPISCHED_INTERFACE));
1484 if (!pItm)
1485 ExitFunction1(hr = E_OUTOFMEMORY);
1486
1487 // get key
1488 hr = WcaGetRecordString(hRec, iqInterface, &pwzData);
1489 ExitOnFailure(hr, "Failed to get key");
1490 StringCchCopyW(pItm->wzKey, countof(pItm->wzKey), pwzData);
1491
1492 // get iid
1493 hr = WcaGetRecordFormattedString(hRec, iqIID, &pwzData);
1494 ExitOnFailure(hr, "Failed to get iid");
1495 StringCchCopyW(pItm->wzIID, countof(pItm->wzIID), pwzData);
1496
1497 // read properties
1498 if (CpiTableExists(cptComPlusInterfaceProperty))
1499 {
1500 hr = CpiPropertiesRead(vcsInterfacePropertyQuery, pItm->wzKey, pdlInterfaceProperties, &pItm->pProperties, &pItm->iPropertyCount);
1501 ExitOnFailure(hr, "Failed to get interface properties");
1502 }
1503
1504 // read roles
1505 if (CpiTableExists(cptComPlusRoleForInterface))
1506 {
1507 hr = RoleAssignmentsRead(vcsRoleForInterfaceQuery, pItm->wzKey, pAppRoleList, &pItm->pRoles, &pItm->iRoleInstallCount, &pItm->iRoleUninstallCount);
1508 ExitOnFailure(hr, "Failed to get roles for interface");
1509 }
1510
1511 if (pItm->iRoleInstallCount)
1512 pAsm->iRoleAssignmentsInstallCount++;
1513 if (pItm->iRoleUninstallCount)
1514 pAsm->iRoleAssignmentsUninstallCount++;
1515
1516 // read methods
1517 if (CpiTableExists(cptComPlusMethod))
1518 {
1519 hr = MethodsRead(pItm->wzKey, pAppRoleList, pAsm, pItm);
1520 ExitOnFailure(hr, "Failed to get methods for interface");
1521 }
1522
1523 // add entry
1524 pComp->iInterfaceCount++;
1525 if (pComp->pInterfaces)
1526 pItm->pNext = pComp->pInterfaces;
1527 pComp->pInterfaces = pItm;
1528 pItm = NULL;
1529 }
1530
1531 if (E_NOMOREITEMS == hr)
1532 hr = S_OK;
1533
1534LExit:
1535 // clean up
1536 if (pItm)
1537 InterfacesFreeList(pItm);
1538
1539 ReleaseStr(pwzData);
1540
1541 return hr;
1542}
1543
1544static HRESULT MethodsRead(
1545 LPCWSTR pwzIntfKey,
1546 CPI_APPLICATION_ROLE_LIST* pAppRoleList,
1547 CPI_ASSEMBLY* pAsm,
1548 CPISCHED_INTERFACE* pIntf
1549 )
1550{
1551 HRESULT hr = S_OK;
1552 PMSIHANDLE hView, hRec, hRecKey;
1553 CPISCHED_METHOD* pItm = NULL;
1554 LPWSTR pwzData = NULL;
1555
1556 // create parameter record
1557 hRecKey = ::MsiCreateRecord(1);
1558 ExitOnNull(hRecKey, hr, E_OUTOFMEMORY, "Failed to create record");
1559 hr = WcaSetRecordString(hRecKey, 1, pwzIntfKey);
1560 ExitOnFailure(hr, "Failed to set record string");
1561
1562 // open view
1563 hr = WcaOpenView(vcsMethodQuery, &hView);
1564 ExitOnFailure(hr, "Failed to open view on ComPlusMethod table");
1565 hr = WcaExecuteView(hView, hRecKey);
1566 ExitOnFailure(hr, "Failed to execute view on ComPlusMethod table");
1567
1568 while (S_OK == (hr = WcaFetchRecord(hView, &hRec)))
1569 {
1570 // create entry
1571 pItm = (CPISCHED_METHOD*)::HeapAlloc(::GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(CPISCHED_METHOD));
1572 if (!pItm)
1573 ExitFunction1(hr = E_OUTOFMEMORY);
1574
1575 // get key
1576 hr = WcaGetRecordString(hRec, iqInterface, &pwzData);
1577 ExitOnFailure(hr, "Failed to get key");
1578 StringCchCopyW(pItm->wzKey, countof(pItm->wzKey), pwzData);
1579
1580 // get index
1581 hr = WcaGetRecordFormattedString(hRec, mqIndex, &pwzData);
1582 ExitOnFailure(hr, "Failed to get index");
1583 StringCchCopyW(pItm->wzIndex, countof(pItm->wzIndex), pwzData);
1584
1585 // get name
1586 hr = WcaGetRecordFormattedString(hRec, mqName, &pwzData);
1587 ExitOnFailure(hr, "Failed to get name");
1588 StringCchCopyW(pItm->wzName, countof(pItm->wzName), pwzData);
1589
1590 // either an index or a name must be provided
1591 if (!*pItm->wzIndex && !*pItm->wzName)
1592 ExitOnFailure(hr = E_FAIL, "A method must have either an index or a name associated, key: %S", pItm->wzKey);
1593
1594 // read properties
1595 if (CpiTableExists(cptComPlusMethodProperty))
1596 {
1597 hr = CpiPropertiesRead(vcsMethodPropertyQuery, pItm->wzKey, pdlMethodProperties, &pItm->pProperties, &pItm->iPropertyCount);
1598 ExitOnFailure(hr, "Failed to get method properties");
1599 }
1600
1601 // read roles
1602 if (CpiTableExists(cptComPlusRoleForMethod))
1603 {
1604 hr = RoleAssignmentsRead(vcsRoleForMethodQuery, pItm->wzKey, pAppRoleList, &pItm->pRoles, &pItm->iRoleInstallCount, &pItm->iRoleUninstallCount);
1605 ExitOnFailure(hr, "Failed to get roles for method");
1606 }
1607
1608 if (pItm->iRoleInstallCount)
1609 pAsm->iRoleAssignmentsInstallCount++;
1610 if (pItm->iRoleUninstallCount)
1611 pAsm->iRoleAssignmentsUninstallCount++;
1612
1613 // add entry
1614 pIntf->iMethodCount++;
1615 if (pIntf->pMethods)
1616 pItm->pNext = pIntf->pMethods;
1617 pIntf->pMethods = pItm;
1618 pItm = NULL;
1619 }
1620
1621 if (E_NOMOREITEMS == hr)
1622 hr = S_OK;
1623
1624LExit:
1625 // clean up
1626 if (pItm)
1627 MethodsFreeList(pItm);
1628
1629 ReleaseStr(pwzData);
1630
1631 return hr;
1632}
1633
1634static HRESULT RoleAssignmentsRead(
1635 LPCWSTR pwzQuery,
1636 LPCWSTR pwzKey,
1637 CPI_APPLICATION_ROLE_LIST* pAppRoleList,
1638 CPISCHED_ROLE_ASSIGNMENT** ppRoleList,
1639 int* piInstallCount,
1640 int* piUninstallCount
1641 )
1642{
1643 HRESULT hr = S_OK;
1644 UINT er = ERROR_SUCCESS;
1645
1646 PMSIHANDLE hView, hRec, hRecKey;
1647
1648 CPISCHED_ROLE_ASSIGNMENT* pItm = NULL;
1649 LPWSTR pwzData = NULL;
1650 BOOL fMatchingArchitecture = FALSE;
1651
1652 // create parameter record
1653 hRecKey = ::MsiCreateRecord(1);
1654 ExitOnNull(hRecKey, hr, E_OUTOFMEMORY, "Failed to create record");
1655 hr = WcaSetRecordString(hRecKey, 1, pwzKey);
1656 ExitOnFailure(hr, "Failed to set record string");
1657
1658 // open view
1659 hr = WcaOpenView(pwzQuery, &hView);
1660 ExitOnFailure(hr, "Failed to open view on role assignment table");
1661 hr = WcaExecuteView(hView, hRecKey);
1662 ExitOnFailure(hr, "Failed to execute view on role assignment table");
1663
1664 while (S_OK == (hr = WcaFetchRecord(hView, &hRec)))
1665 {
1666 // get component
1667 hr = WcaGetRecordString(hRec, raqComponent, &pwzData);
1668 ExitOnFailure(hr, "Failed to get assembly component");
1669
1670 // check if the component is our processor architecture
1671 hr = CpiVerifyComponentArchitecure(pwzData, &fMatchingArchitecture);
1672 ExitOnFailure(hr, "Failed to get component architecture.");
1673
1674 if (!fMatchingArchitecture)
1675 {
1676 continue; // not the same architecture, ignore
1677 }
1678
1679 // create entry
1680 pItm = (CPISCHED_ROLE_ASSIGNMENT*)::HeapAlloc(::GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(CPISCHED_ROLE_ASSIGNMENT));
1681 if (!pItm)
1682 ExitFunction1(hr = E_OUTOFMEMORY);
1683
1684 // get component install state
1685 er = ::MsiGetComponentStateW(WcaGetInstallHandle(), pwzData, &pItm->isInstalled, &pItm->isAction);
1686 ExitOnFailure(hr = HRESULT_FROM_WIN32(er), "Failed to get component state");
1687
1688 // get key
1689 hr = WcaGetRecordString(hRec, raqKey, &pwzData);
1690 ExitOnFailure(hr, "Failed to get key");
1691 StringCchCopyW(pItm->wzKey, countof(pItm->wzKey), pwzData);
1692
1693 // get application role
1694 hr = WcaGetRecordString(hRec, raqApplicationRole, &pwzData);
1695 ExitOnFailure(hr, "Failed to get application role");
1696
1697 hr = CpiApplicationRoleFindByKey(pAppRoleList, pwzData, &pItm->pApplicationRole);
1698 if (S_FALSE == hr)
1699 hr = HRESULT_FROM_WIN32(ERROR_NOT_FOUND);
1700 ExitOnFailure(hr, "Failed to find application, key: %S", pwzData);
1701
1702 // set references & increment counters
1703 if (WcaIsInstalling(pItm->isInstalled, pItm->isAction))
1704 {
1705 CpiApplicationRoleAddReferenceInstall(pItm->pApplicationRole);
1706 ++*piInstallCount;
1707 }
1708 if (WcaIsUninstalling(pItm->isInstalled, pItm->isAction))
1709 {
1710 CpiApplicationRoleAddReferenceUninstall(pItm->pApplicationRole);
1711 ++*piUninstallCount;
1712 }
1713
1714 // add entry
1715 if (*ppRoleList)
1716 pItm->pNext = *ppRoleList;
1717 *ppRoleList = pItm;
1718 pItm = NULL;
1719 }
1720
1721 if (E_NOMOREITEMS == hr)
1722 hr = S_OK;
1723
1724LExit:
1725 // clean up
1726 if (pItm)
1727 RoleAssignmentsFreeList(pItm);
1728
1729 ReleaseStr(pwzData);
1730
1731 return hr;
1732}
1733
1734static HRESULT AddAssemblyToActionData(
1735 CPI_ASSEMBLY* pItm,
1736 BOOL fInstall,
1737 int iActionType,
1738 int iActionCost,
1739 LPWSTR* ppwzActionData
1740 )
1741{
1742 HRESULT hr = S_OK;
1743
1744 // add action information to custom action data
1745 hr = WcaWriteIntegerToCaData(iActionType, ppwzActionData);
1746 ExitOnFailure(hr, "Failed to add action type to custom action data");
1747 hr = WcaWriteIntegerToCaData(iActionCost, ppwzActionData);
1748 ExitOnFailure(hr, "Failed to add action cost to custom action data");
1749
1750 // add assembly information to custom action data
1751 hr = WcaWriteStringToCaData(pItm->wzKey, ppwzActionData);
1752 ExitOnFailure(hr, "Failed to add assembly key to custom action data");
1753 hr = WcaWriteStringToCaData(pItm->pwzAssemblyName, ppwzActionData);
1754 ExitOnFailure(hr, "Failed to add assembly name to custom action data");
1755 hr = WcaWriteStringToCaData(pItm->pwzDllPath, ppwzActionData);
1756 ExitOnFailure(hr, "Failed to add assembly dll path to custom action data");
1757 hr = WcaWriteStringToCaData(atCreate == iActionType ? pItm->pwzTlbPath : L"", ppwzActionData);
1758 ExitOnFailure(hr, "Failed to add assembly tlb path to custom action data");
1759 hr = WcaWriteStringToCaData(atCreate == iActionType ? pItm->pwzPSDllPath : L"", ppwzActionData);
1760 ExitOnFailure(hr, "Failed to add assembly proxy-stub dll path to custom action data");
1761 hr = WcaWriteIntegerToCaData(pItm->iAttributes, ppwzActionData);
1762 ExitOnFailure(hr, "Failed to add assembly attributes to custom action data");
1763
1764 // add application information to custom action data
1765 hr = WcaWriteStringToCaData(pItm->pApplication ? pItm->pApplication->wzID : L"", ppwzActionData);
1766 ExitOnFailure(hr, "Failed to add application id to custom action data");
1767
1768 // add partition information to custom action data
1769 LPCWSTR pwzPartID = pItm->pApplication && pItm->pApplication->pPartition ? pItm->pApplication->pPartition->wzID : L"";
1770 hr = WcaWriteStringToCaData(pwzPartID, ppwzActionData);
1771 ExitOnFailure(hr, "Failed to add partition id to custom action data");
1772
1773 // add components to custom action data
1774 //
1775 // components are needed acording to the following table:
1776 //
1777 // Native .NET
1778 // --------------------------------------------
1779 // NoOp | No | No
1780 // Create | Yes | Yes
1781 // Remove | Yes | No
1782 //
1783 int iCompCount = (atCreate == iActionType || (atRemove == iActionType && 0 == (pItm->iAttributes & aaDotNetAssembly))) ? pItm->iComponentCount : 0;
1784 hr = WcaWriteIntegerToCaData(iCompCount, ppwzActionData);
1785 ExitOnFailure(hr, "Failed to add component count to custom action data, key: %S", pItm->wzKey);
1786
1787 if (iCompCount)
1788 {
1789 for (CPISCHED_COMPONENT* pComp = pItm->pComponents; pComp; pComp = pComp->pNext)
1790 {
1791 hr = AddComponentToActionData(pComp, fInstall, atCreate == iActionType, FALSE, ppwzActionData);
1792 ExitOnFailure(hr, "Failed to add component to custom action data, component: %S", pComp->wzKey);
1793 }
1794 }
1795
1796 hr = S_OK;
1797
1798LExit:
1799 return hr;
1800}
1801
1802static HRESULT AddRoleAssignmentsToActionData(
1803 CPI_ASSEMBLY* pItm,
1804 BOOL fInstall,
1805 int iActionType,
1806 int iActionCost,
1807 LPWSTR* ppwzActionData
1808 )
1809{
1810 HRESULT hr = S_OK;
1811
1812 // add action information to custom action data
1813 hr = WcaWriteIntegerToCaData(iActionType, ppwzActionData);
1814 ExitOnFailure(hr, "Failed to add action type to custom action data");
1815 hr = WcaWriteIntegerToCaData(iActionCost, ppwzActionData);
1816 ExitOnFailure(hr, "Failed to add action cost to custom action data");
1817
1818 // add assembly information to custom action data
1819 hr = WcaWriteStringToCaData(pItm->wzKey, ppwzActionData);
1820 ExitOnFailure(hr, "Failed to add assembly key to custom action data");
1821 hr = WcaWriteIntegerToCaData(fInstall ? pItm->iRoleAssignmentsInstallCount : pItm->iRoleAssignmentsUninstallCount, ppwzActionData);
1822 ExitOnFailure(hr, "Failed to add role assignments count to custom action data");
1823
1824 // add application information to custom action data
1825 hr = WcaWriteStringToCaData(pItm->pApplication ? pItm->pApplication->wzID : L"", ppwzActionData);
1826 ExitOnFailure(hr, "Failed to add application id to custom action data");
1827
1828 // add partition information to custom action data
1829 LPCWSTR pwzPartID = pItm->pApplication && pItm->pApplication->pPartition ? pItm->pApplication->pPartition->wzID : L"";
1830 hr = WcaWriteStringToCaData(pwzPartID, ppwzActionData);
1831 ExitOnFailure(hr, "Failed to add partition id to custom action data");
1832
1833 // add components to custom action data
1834 hr = WcaWriteIntegerToCaData(pItm->iComponentCount, ppwzActionData);
1835 ExitOnFailure(hr, "Failed to add component count to custom action data");
1836
1837 for (CPISCHED_COMPONENT* pComp = pItm->pComponents; pComp; pComp = pComp->pNext)
1838 {
1839 hr = AddComponentToActionData(pComp, fInstall, FALSE, TRUE, ppwzActionData);
1840 ExitOnFailure(hr, "Failed to add component to custom action data, component: %S", pComp->wzKey);
1841 }
1842
1843 hr = S_OK;
1844
1845LExit:
1846 return hr;
1847}
1848
1849static HRESULT AddComponentToActionData(
1850 CPISCHED_COMPONENT* pItm,
1851 BOOL fInstall,
1852 BOOL fProps,
1853 BOOL fRoles,
1854 LPWSTR* ppwzActionData
1855 )
1856{
1857 HRESULT hr = S_OK;
1858
1859 // add component information to custom action data
1860 hr = WcaWriteStringToCaData(pItm->wzCLSID, ppwzActionData);
1861 ExitOnFailure(hr, "Failed to add component CLSID to custom action data");
1862
1863 // add properties to custom action data
1864 hr = CpiAddPropertiesToActionData(fProps ? pItm->iPropertyCount : 0, pItm->pProperties, ppwzActionData);
1865 ExitOnFailure(hr, "Failed to add properties to custom action data");
1866
1867 // add roles to custom action data
1868 hr = AddRolesToActionData(pItm->iRoleInstallCount, pItm->iRoleUninstallCount, pItm->pRoles, fInstall, fRoles, ppwzActionData);
1869 ExitOnFailure(hr, "Failed to add roles to custom action data");
1870
1871 // add interfaces to custom action data
1872 int iIntfCount = (fProps || fRoles) ? pItm->iInterfaceCount : 0;
1873 hr = WcaWriteIntegerToCaData(iIntfCount, ppwzActionData);
1874 ExitOnFailure(hr, "Failed to add interface count to custom action data");
1875
1876 if (iIntfCount)
1877 {
1878 for (CPISCHED_INTERFACE* pIntf = pItm->pInterfaces; pIntf; pIntf = pIntf->pNext)
1879 {
1880 hr = AddInterfaceToActionData(pIntf, fInstall, fProps, fRoles, ppwzActionData);
1881 ExitOnFailure(hr, "Failed to add interface custom action data, interface: %S", pIntf->wzKey);
1882 }
1883 }
1884
1885 hr = S_OK;
1886
1887LExit:
1888 return hr;
1889}
1890
1891static HRESULT AddInterfaceToActionData(
1892 CPISCHED_INTERFACE* pItm,
1893 BOOL fInstall,
1894 BOOL fProps,
1895 BOOL fRoles,
1896 LPWSTR* ppwzActionData
1897 )
1898{
1899 HRESULT hr = S_OK;
1900
1901 // add interface information to custom action data
1902 hr = WcaWriteStringToCaData(pItm->wzIID, ppwzActionData);
1903 ExitOnFailure(hr, "Failed to add interface IID to custom action data");
1904
1905 // add properties to custom action data
1906 hr = CpiAddPropertiesToActionData(fProps ? pItm->iPropertyCount : 0, pItm->pProperties, ppwzActionData);
1907 ExitOnFailure(hr, "Failed to add properties to custom action data");
1908
1909 // add roles to custom action data
1910 hr = AddRolesToActionData(pItm->iRoleInstallCount, pItm->iRoleUninstallCount, pItm->pRoles, fInstall, fRoles, ppwzActionData);
1911 ExitOnFailure(hr, "Failed to add roles to custom action data");
1912
1913 // add methods to custom action data
1914 hr = WcaWriteIntegerToCaData(pItm->iMethodCount, ppwzActionData);
1915 ExitOnFailure(hr, "Failed to add method count to custom action data");
1916
1917 for (CPISCHED_METHOD* pMeth = pItm->pMethods; pMeth; pMeth = pMeth->pNext)
1918 {
1919 hr = AddMethodToActionData(pMeth, fInstall, fProps, fRoles, ppwzActionData);
1920 ExitOnFailure(hr, "Failed to add method custom action data, method: %S", pMeth->wzKey);
1921 }
1922
1923 hr = S_OK;
1924
1925LExit:
1926 return hr;
1927}
1928
1929static HRESULT AddMethodToActionData(
1930 CPISCHED_METHOD* pItm,
1931 BOOL fInstall,
1932 BOOL fProps,
1933 BOOL fRoles,
1934 LPWSTR* ppwzActionData
1935 )
1936{
1937 HRESULT hr = S_OK;
1938
1939 // add interface information to custom action data
1940 hr = WcaWriteStringToCaData(pItm->wzIndex, ppwzActionData);
1941 ExitOnFailure(hr, "Failed to add method index to custom action data");
1942
1943 hr = WcaWriteStringToCaData(pItm->wzName, ppwzActionData);
1944 ExitOnFailure(hr, "Failed to add method name to custom action data");
1945
1946 // add properties to custom action data
1947 hr = CpiAddPropertiesToActionData(fProps ? pItm->iPropertyCount : 0, pItm->pProperties, ppwzActionData);
1948 ExitOnFailure(hr, "Failed to add properties to custom action data");
1949
1950 // add roles to custom action data
1951 hr = AddRolesToActionData(pItm->iRoleInstallCount, pItm->iRoleUninstallCount, pItm->pRoles, fInstall, fRoles, ppwzActionData);
1952 ExitOnFailure(hr, "Failed to add roles to custom action data");
1953
1954 hr = S_OK;
1955
1956LExit:
1957 return hr;
1958}
1959
1960static HRESULT AddRolesToActionData(
1961 int iRoleInstallCount,
1962 int iRoleUninstallCount,
1963 CPISCHED_ROLE_ASSIGNMENT* pRoleList,
1964 BOOL fInstall,
1965 BOOL fRoles,
1966 LPWSTR* ppwzActionData
1967 )
1968{
1969 HRESULT hr = S_OK;
1970
1971 int iRoleCount = fRoles ? (fInstall ? iRoleInstallCount : iRoleUninstallCount) : 0;
1972 hr = WcaWriteIntegerToCaData(iRoleCount, ppwzActionData);
1973 ExitOnFailure(hr, "Failed to add role count to custom action data");
1974
1975 if (iRoleCount)
1976 {
1977 for (CPISCHED_ROLE_ASSIGNMENT* pRole = pRoleList; pRole; pRole = pRole->pNext)
1978 {
1979 // make sure the install state matches the create flag
1980 if (fInstall ? !WcaIsInstalling(pRole->isInstalled, pRole->isAction) : !WcaIsUninstalling(pRole->isInstalled, pRole->isAction))
1981 continue;
1982
1983 hr = WcaWriteStringToCaData(pRole->pApplicationRole->wzKey, ppwzActionData);
1984 ExitOnFailure(hr, "Failed to add key to custom action data, role: %S", pRole->wzKey);
1985
1986 hr = WcaWriteStringToCaData(pRole->pApplicationRole->wzName, ppwzActionData);
1987 ExitOnFailure(hr, "Failed to add role name to custom action data, role: %S", pRole->wzKey);
1988 }
1989 }
1990
1991 hr = S_OK;
1992
1993LExit:
1994 return hr;
1995}
1996
1997static HRESULT KeyPairFindByFirstKey(
1998 CPI_KEY_PAIR* pList,
1999 LPCWSTR pwzKey,
2000 CPI_KEY_PAIR** ppItm
2001 )
2002{
2003 for (; pList; pList = pList->pNext)
2004 {
2005 if (0 == lstrcmpW(pList->wzFirstKey, pwzKey))
2006 {
2007 *ppItm = pList;
2008 return S_OK;
2009 }
2010 }
2011
2012 return S_FALSE;
2013}
2014
2015static void AssemblyFree(
2016 CPI_ASSEMBLY* pItm
2017 )
2018{
2019 ReleaseStr(pItm->pwzAssemblyName);
2020 ReleaseStr(pItm->pwzDllPath);
2021 ReleaseStr(pItm->pwzTlbPath);
2022 ReleaseStr(pItm->pwzPSDllPath);
2023
2024 if (pItm->pComponents)
2025 ComponentsFreeList(pItm->pComponents);
2026
2027 ::HeapFree(::GetProcessHeap(), 0, pItm);
2028}
2029
2030static void KeyPairsFreeList(
2031 CPI_KEY_PAIR* pList
2032 )
2033{
2034 while (pList)
2035 {
2036 CPI_KEY_PAIR* pDelete = pList;
2037 pList = pList->pNext;
2038 ::HeapFree(::GetProcessHeap(), 0, pDelete);
2039 }
2040}
2041
2042void ModuleListFree(
2043 CPI_MODULE_LIST* pList
2044 )
2045{
2046 CPI_MODULE* pItm = pList->pFirst;
2047
2048 while (pItm)
2049 {
2050 CPI_MODULE* pDelete = pItm;
2051 pItm = pItm->pNext;
2052 ModuleFree(pDelete);
2053 }
2054}
2055
2056static void ModuleFree(
2057 CPI_MODULE* pItm
2058 )
2059{
2060 ::HeapFree(::GetProcessHeap(), 0, pItm);
2061}
2062
2063static void ComponentsFreeList(
2064 CPISCHED_COMPONENT* pList
2065 )
2066{
2067 while (pList)
2068 {
2069 if (pList->pProperties)
2070 CpiPropertiesFreeList(pList->pProperties);
2071
2072 if (pList->pRoles)
2073 RoleAssignmentsFreeList(pList->pRoles);
2074
2075 if (pList->pInterfaces)
2076 InterfacesFreeList(pList->pInterfaces);
2077
2078 ReleaseObject(pList->piSubsColl);
2079
2080 CPISCHED_COMPONENT* pDelete = pList;
2081 pList = pList->pNext;
2082 ::HeapFree(::GetProcessHeap(), 0, pDelete);
2083 }
2084}
2085
2086static void InterfacesFreeList(
2087 CPISCHED_INTERFACE* pList
2088 )
2089{
2090 while (pList)
2091 {
2092 if (pList->pProperties)
2093 CpiPropertiesFreeList(pList->pProperties);
2094
2095 if (pList->pRoles)
2096 RoleAssignmentsFreeList(pList->pRoles);
2097
2098 if (pList->pMethods)
2099 MethodsFreeList(pList->pMethods);
2100
2101 CPISCHED_INTERFACE* pDelete = pList;
2102 pList = pList->pNext;
2103 ::HeapFree(::GetProcessHeap(), 0, pDelete);
2104 }
2105}
2106
2107static void MethodsFreeList(
2108 CPISCHED_METHOD* pList
2109 )
2110{
2111 while (pList)
2112 {
2113 if (pList->pProperties)
2114 CpiPropertiesFreeList(pList->pProperties);
2115
2116 if (pList->pRoles)
2117 RoleAssignmentsFreeList(pList->pRoles);
2118
2119 CPISCHED_METHOD* pDelete = pList;
2120 pList = pList->pNext;
2121 ::HeapFree(::GetProcessHeap(), 0, pDelete);
2122 }
2123}
2124
2125static void RoleAssignmentsFreeList(
2126 CPISCHED_ROLE_ASSIGNMENT* pList
2127 )
2128{
2129 while (pList)
2130 {
2131 CPISCHED_ROLE_ASSIGNMENT* pDelete = pList;
2132 pList = pList->pNext;
2133 ::HeapFree(::GetProcessHeap(), 0, pDelete);
2134 }
2135}
diff --git a/src/ext/ComPlus/ca/cpasmsched.h b/src/ext/ComPlus/ca/cpasmsched.h
new file mode 100644
index 00000000..ddf4b6c0
--- /dev/null
+++ b/src/ext/ComPlus/ca/cpasmsched.h
@@ -0,0 +1,168 @@
1#pragma once
2// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
3
4
5enum eAssemblyAttributes
6{
7 aaEventClass = (1 << 0),
8 aaDotNetAssembly = (1 << 1),
9 aaPathFromGAC = (1 << 2),
10 aaRunInCommit = (1 << 3)
11};
12
13
14// structs
15
16struct CPISCHED_ROLE_ASSIGNMENT
17{
18 WCHAR wzKey[MAX_DARWIN_KEY + 1];
19
20 INSTALLSTATE isInstalled, isAction;
21
22 CPI_APPLICATION_ROLE* pApplicationRole;
23
24 CPISCHED_ROLE_ASSIGNMENT* pNext;
25};
26
27struct CPISCHED_METHOD
28{
29 WCHAR wzKey[MAX_DARWIN_KEY + 1];
30 WCHAR wzIndex[11 + 1];
31 WCHAR wzName[MAX_DARWIN_COLUMN + 1];
32
33 int iPropertyCount;
34 CPI_PROPERTY* pProperties;
35
36 int iRoleInstallCount;
37 int iRoleUninstallCount;
38 CPISCHED_ROLE_ASSIGNMENT* pRoles;
39
40 CPISCHED_METHOD* pNext;
41};
42
43struct CPISCHED_INTERFACE
44{
45 WCHAR wzKey[MAX_DARWIN_KEY + 1];
46 WCHAR wzIID[CPI_MAX_GUID + 1];
47
48 int iPropertyCount;
49 CPI_PROPERTY* pProperties;
50
51 int iRoleInstallCount;
52 int iRoleUninstallCount;
53 CPISCHED_ROLE_ASSIGNMENT* pRoles;
54
55 int iMethodCount;
56 CPISCHED_METHOD* pMethods;
57
58 CPISCHED_INTERFACE* pNext;
59};
60
61struct CPISCHED_COMPONENT
62{
63 WCHAR wzKey[MAX_DARWIN_KEY + 1];
64 WCHAR wzCLSID[CPI_MAX_GUID + 1];
65
66 int iPropertyCount;
67 CPI_PROPERTY* pProperties;
68
69 int iRoleInstallCount;
70 int iRoleUninstallCount;
71 CPISCHED_ROLE_ASSIGNMENT* pRoles;
72
73 int iInterfaceCount;
74 CPISCHED_INTERFACE* pInterfaces;
75
76 ICatalogCollection* piSubsColl;
77
78 CPISCHED_COMPONENT* pNext;
79};
80
81struct CPI_ASSEMBLY
82{
83 WCHAR wzKey[MAX_DARWIN_KEY + 1];
84 WCHAR wzModule[MAX_DARWIN_KEY + 1];
85 LPWSTR pwzAssemblyName;
86 LPWSTR pwzDllPath;
87 LPWSTR pwzTlbPath;
88 LPWSTR pwzPSDllPath;
89 int iAttributes;
90
91 int iComponentCount;
92 CPISCHED_COMPONENT* pComponents;
93
94 BOOL fReferencedForInstall;
95 BOOL fReferencedForUninstall;
96 BOOL fIgnore;
97
98 int iRoleAssignmentsInstallCount;
99 int iRoleAssignmentsUninstallCount;
100
101 INSTALLSTATE isInstalled, isAction;
102
103 CPI_APPLICATION* pApplication;
104
105 CPI_ASSEMBLY* pPrev;
106 CPI_ASSEMBLY* pNext;
107};
108
109struct CPI_ASSEMBLY_LIST
110{
111 CPI_ASSEMBLY* pFirst;
112 CPI_ASSEMBLY* pLast;
113
114 int iInstallCount;
115 int iCommitCount;
116 int iUninstallCount;
117
118 int iRoleInstallCount;
119 int iRoleCommitCount;
120 int iRoleUninstallCount;
121};
122
123
124// function prototypes
125
126void CpiAssemblyListFree(
127 CPI_ASSEMBLY_LIST* pList
128 );
129HRESULT CpiAssembliesRead(
130 CPI_APPLICATION_LIST* pAppList,
131 CPI_APPLICATION_ROLE_LIST* pAppRoleList,
132 CPI_ASSEMBLY_LIST* pAsmList
133 );
134HRESULT CpiAssembliesVerifyInstall(
135 CPI_ASSEMBLY_LIST* pList
136 );
137HRESULT CpiAssembliesVerifyUninstall(
138 CPI_ASSEMBLY_LIST* pList
139 );
140HRESULT CpiAssembliesInstall(
141 CPI_ASSEMBLY_LIST* pList,
142 int iRunMode,
143 LPWSTR* ppwzActionData,
144 int* piProgress
145 );
146HRESULT CpiAssembliesUninstall(
147 CPI_ASSEMBLY_LIST* pList,
148 int iRunMode,
149 LPWSTR* ppwzActionData,
150 int* piProgress
151 );
152HRESULT CpiRoleAssignmentsInstall(
153 CPI_ASSEMBLY_LIST* pList,
154 int iRunMode,
155 LPWSTR* ppwzActionData,
156 int* piProgress
157 );
158HRESULT CpiRoleAssignmentsUninstall(
159 CPI_ASSEMBLY_LIST* pList,
160 int iRunMode,
161 LPWSTR* ppwzActionData,
162 int* piProgress
163 );
164HRESULT CpiGetSubscriptionsCollForComponent(
165 CPI_ASSEMBLY* pAsm,
166 CPISCHED_COMPONENT* pComp,
167 ICatalogCollection** ppiSubsColl
168 );
diff --git a/src/ext/ComPlus/ca/cpcost.h b/src/ext/ComPlus/ca/cpcost.h
new file mode 100644
index 00000000..7a23e03b
--- /dev/null
+++ b/src/ext/ComPlus/ca/cpcost.h
@@ -0,0 +1,30 @@
1#pragma once
2// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
3
4
5#define COST_PARTITION_CREATE 10000
6#define COST_PARTITION_DELETE 10000
7
8#define COST_PARTITION_USER_CREATE 10000
9#define COST_PARTITION_USER_DELETE 10000
10
11#define COST_USER_IN_PARTITION_ROLE_CREATE 10000
12#define COST_USER_IN_PARTITION_ROLE_DELETE 10000
13
14#define COST_APPLICATION_CREATE 10000
15#define COST_APPLICATION_DELETE 10000
16
17#define COST_APPLICATION_ROLE_CREATE 10000
18#define COST_APPLICATION_ROLE_DELETE 10000
19
20#define COST_USER_IN_APPLICATION_ROLE_CREATE 10000
21#define COST_USER_IN_APPLICATION_ROLE_DELETE 10000
22
23#define COST_ASSEMBLY_REGISTER 50000
24#define COST_ASSEMBLY_UNREGISTER 10000
25
26#define COST_ROLLASSIGNMENT_CREATE 10000
27#define COST_ROLLASSIGNMENT_DELETE 10000
28
29#define COST_SUBSCRIPTION_CREATE 10000
30#define COST_SUBSCRIPTION_DELETE 10000
diff --git a/src/ext/ComPlus/ca/cpexec.cpp b/src/ext/ComPlus/ca/cpexec.cpp
new file mode 100644
index 00000000..9b1691fc
--- /dev/null
+++ b/src/ext/ComPlus/ca/cpexec.cpp
@@ -0,0 +1,681 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3#include "precomp.h"
4
5/********************************************************************
6 ComPlusPrepare - CUSTOM ACTION ENTRY POINT
7
8 Input: deferred CustomActionData - ComPlusPrepare
9********************************************************************/
10extern "C" UINT __stdcall ComPlusPrepare(MSIHANDLE hInstall)
11{
12 HRESULT hr = S_OK;
13 UINT er = ERROR_SUCCESS;
14
15 LPWSTR pwzCustomActionData = NULL;
16 LPWSTR pwzData = NULL;
17
18 HANDLE hRollbackFile = INVALID_HANDLE_VALUE;
19
20 // initialize
21 hr = WcaInitialize(hInstall, "ComPlusPrepare");
22 ExitOnFailure(hr, "Failed to initialize ComPlusPrepare");
23
24 // get custom action data
25 hr = WcaGetProperty(L"CustomActionData", &pwzCustomActionData);
26 ExitOnFailure(hr, "Failed to get CustomActionData");
27 pwzData = pwzCustomActionData;
28
29 // create rollback file
30 hRollbackFile = ::CreateFileW(pwzData, GENERIC_WRITE, 0, NULL, CREATE_NEW, FILE_ATTRIBUTE_TEMPORARY, NULL);
31 if (INVALID_HANDLE_VALUE == hRollbackFile)
32 ExitOnFailure(hr = HRESULT_FROM_WIN32(::GetLastError()), "Failed to create rollback file, name: %S", pwzData);
33
34 hr = S_OK;
35
36LExit:
37 // clean up
38 ReleaseStr(pwzCustomActionData);
39
40 if (INVALID_HANDLE_VALUE != hRollbackFile)
41 ::CloseHandle(hRollbackFile);
42
43 er = SUCCEEDED(hr) ? ERROR_SUCCESS : ERROR_INSTALL_FAILURE;
44 return WcaFinalize(er);
45}
46
47/********************************************************************
48 ComPlusCleanup - CUSTOM ACTION ENTRY POINT
49
50 Input: deferred CustomActionData - ComPlusCleanup
51********************************************************************/
52extern "C" UINT __stdcall ComPlusCleanup(MSIHANDLE hInstall)
53{
54 HRESULT hr = S_OK;
55 UINT er = ERROR_SUCCESS;
56
57 LPWSTR pwzCustomActionData = NULL;
58 LPWSTR pwzData = NULL;
59
60 // initialize
61 hr = WcaInitialize(hInstall, "ComPlusCleanup");
62 ExitOnFailure(hr, "Failed to initialize ComPlusCleanup");
63
64 // get custom action data
65 hr = WcaGetProperty(L"CustomActionData", &pwzCustomActionData);
66 ExitOnFailure(hr, "Failed to get CustomActionData");
67 pwzData = pwzCustomActionData;
68
69 // delete rollback file
70 if (!::DeleteFileW(pwzData))
71 {
72 // error, but not a showstopper
73 hr = HRESULT_FROM_WIN32(::GetLastError());
74 WcaLog(LOGMSG_STANDARD, "Failed to delete rollback file, hr: 0x%x, name: %S", hr, pwzData);
75 }
76
77 hr = S_OK;
78
79LExit:
80 // clean up
81 ReleaseStr(pwzCustomActionData);
82
83 er = SUCCEEDED(hr) ? ERROR_SUCCESS : ERROR_INSTALL_FAILURE;
84 return WcaFinalize(er);
85}
86
87/********************************************************************
88 ComPlusInstallExecute - CUSTOM ACTION ENTRY POINT
89
90 Input: deferred CustomActionData - ComPlusInstallExecute
91********************************************************************/
92extern "C" UINT __stdcall ComPlusInstallExecute(MSIHANDLE hInstall)
93{
94 HRESULT hr = S_OK;
95 UINT er = ERROR_SUCCESS;
96
97 LPWSTR pwzCustomActionData = NULL;
98 LPWSTR pwzData = NULL;
99 LPWSTR pwzRollbackFileName = NULL;
100
101 HANDLE hRollbackFile = INVALID_HANDLE_VALUE;
102
103 BOOL fInitializedCom = FALSE;
104
105 // initialize
106 hr = WcaInitialize(hInstall, "ComPlusInstallExecute");
107 ExitOnFailure(hr, "Failed to initialize ComPlusInstallExecute");
108
109 hr = ::CoInitialize(NULL);
110 ExitOnFailure(hr, "Failed to initialize COM");
111 fInitializedCom = TRUE;
112
113 CpiExecInitialize();
114
115 // get custom action data
116 hr = WcaGetProperty(L"CustomActionData", &pwzCustomActionData);
117 ExitOnFailure(hr, "Failed to get CustomActionData");
118 pwzData = pwzCustomActionData;
119
120 // open rollback file
121 hr = WcaReadStringFromCaData(&pwzData, &pwzRollbackFileName);
122 ExitOnFailure(hr, "Failed to read rollback file name");
123
124 hRollbackFile = ::CreateFileW(pwzRollbackFileName, GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_TEMPORARY, NULL);
125 if (INVALID_HANDLE_VALUE == hRollbackFile)
126 ExitOnFailure(hr = HRESULT_FROM_WIN32(::GetLastError()), "Failed to open rollback file, name: %S", pwzRollbackFileName);
127
128 // create partitions
129 hr = CpiConfigurePartitions(&pwzData, hRollbackFile);
130 ExitOnFailure(hr, "Failed to create partitions");
131 if (S_FALSE == hr) ExitFunction();
132
133 // create users in partition roles
134 hr = CpiConfigureUsersInPartitionRoles(&pwzData, hRollbackFile);
135 ExitOnFailure(hr, "Failed to create users in partition roles");
136 if (S_FALSE == hr) ExitFunction();
137
138 // create partition users
139 hr = CpiConfigurePartitionUsers(&pwzData, hRollbackFile);
140 ExitOnFailure(hr, "Failed to add partition users");
141 if (S_FALSE == hr) ExitFunction();
142
143 // create applications
144 hr = CpiConfigureApplications(&pwzData, hRollbackFile);
145 ExitOnFailure(hr, "Failed to create applications");
146 if (S_FALSE == hr) ExitFunction();
147
148 // create application roles
149 hr = CpiConfigureApplicationRoles(&pwzData, hRollbackFile);
150 ExitOnFailure(hr, "Failed to create application roles");
151 if (S_FALSE == hr) ExitFunction();
152
153 // create users in application roles
154 hr = CpiConfigureUsersInApplicationRoles(&pwzData, hRollbackFile);
155 ExitOnFailure(hr, "Failed to create users in application roles");
156 if (S_FALSE == hr) ExitFunction();
157
158 // register assemblies
159 hr = CpiConfigureAssemblies(&pwzData, hRollbackFile);
160 ExitOnFailure(hr, "Failed to register assemblies");
161 if (S_FALSE == hr) ExitFunction();
162
163 // create role assignments
164 hr = CpiConfigureRoleAssignments(&pwzData, hRollbackFile);
165 ExitOnFailure(hr, "Failed to create role assignments");
166 if (S_FALSE == hr) ExitFunction();
167
168 // create subscriptions
169 hr = CpiConfigureSubscriptions(&pwzData, hRollbackFile);
170 ExitOnFailure(hr, "Failed to create subscriptions");
171 if (S_FALSE == hr) ExitFunction();
172
173 hr = S_OK;
174
175LExit:
176 // clean up
177 ReleaseStr(pwzCustomActionData);
178 ReleaseStr(pwzRollbackFileName);
179
180 if (INVALID_HANDLE_VALUE != hRollbackFile)
181 ::CloseHandle(hRollbackFile);
182
183 // unitialize
184 CpiExecFinalize();
185
186 if (fInitializedCom)
187 ::CoUninitialize();
188
189 er = SUCCEEDED(hr) ? ERROR_SUCCESS : ERROR_INSTALL_FAILURE;
190 return WcaFinalize(er);
191}
192
193/********************************************************************
194 ComPlusInstallExecuteCommit - CUSTOM ACTION ENTRY POINT
195
196 Input: deferred CustomActionData - ComPlusInstallExecuteCommit
197********************************************************************/
198extern "C" UINT __stdcall ComPlusInstallExecuteCommit(MSIHANDLE hInstall)
199{
200 HRESULT hr = S_OK;
201 UINT er = ERROR_SUCCESS;
202
203 LPWSTR pwzCustomActionData = NULL;
204 LPWSTR pwzData = NULL;
205 LPWSTR pwzRollbackFileName = NULL;
206
207 HANDLE hRollbackFile = INVALID_HANDLE_VALUE;
208
209 BOOL fInitializedCom = FALSE;
210
211 // initialize
212 hr = WcaInitialize(hInstall, "ComPlusInstallExecuteCommit");
213 ExitOnFailure(hr, "Failed to initialize ComPlusInstallExecuteCommit");
214
215 hr = ::CoInitialize(NULL);
216 ExitOnFailure(hr, "Failed to initialize COM");
217 fInitializedCom = TRUE;
218
219 CpiExecInitialize();
220
221 // get custom action data
222 hr = WcaGetProperty(L"CustomActionData", &pwzCustomActionData);
223 ExitOnFailure(hr, "Failed to get CustomActionData");
224 pwzData = pwzCustomActionData;
225
226 // open rollback file
227 hr = WcaReadStringFromCaData(&pwzData, &pwzRollbackFileName);
228 ExitOnFailure(hr, "Failed to read rollback file name");
229
230 hRollbackFile = ::CreateFileW(pwzRollbackFileName, GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_TEMPORARY, NULL);
231 if (INVALID_HANDLE_VALUE == hRollbackFile)
232 ExitOnFailure(hr = HRESULT_FROM_WIN32(::GetLastError()), "Failed to open rollback file, name: %S", pwzRollbackFileName);
233
234 if (INVALID_SET_FILE_POINTER == ::SetFilePointer(hRollbackFile, 0, NULL, FILE_END))
235 ExitOnFailure(hr = HRESULT_FROM_WIN32(::GetLastError()), "Failed to set file pointer");
236
237 // register assemblies
238 hr = CpiConfigureAssemblies(&pwzData, hRollbackFile);
239 ExitOnFailure(hr, "Failed to register assemblies");
240 if (S_FALSE == hr) ExitFunction();
241
242 // create role assignments
243 hr = CpiConfigureRoleAssignments(&pwzData, hRollbackFile);
244 ExitOnFailure(hr, "Failed to create role assignments");
245 if (S_FALSE == hr) ExitFunction();
246
247 // create subscriptions
248 hr = CpiConfigureSubscriptions(&pwzData, hRollbackFile);
249 ExitOnFailure(hr, "Failed to create subscriptions");
250 if (S_FALSE == hr) ExitFunction();
251
252 hr = S_OK;
253
254LExit:
255 // clean up
256 ReleaseStr(pwzCustomActionData);
257
258 if (INVALID_HANDLE_VALUE != hRollbackFile)
259 ::CloseHandle(hRollbackFile);
260
261 // unitialize
262 CpiExecFinalize();
263
264 if (fInitializedCom)
265 ::CoUninitialize();
266
267 er = SUCCEEDED(hr) ? ERROR_SUCCESS : ERROR_INSTALL_FAILURE;
268 return WcaFinalize(er);
269}
270
271/********************************************************************
272 ComPlusRollbackInstallExecute - CUSTOM ACTION ENTRY POINT
273
274 Input: deferred CustomActionData - ComPlusRollbackInstallExecute
275********************************************************************/
276extern "C" UINT __stdcall ComPlusRollbackInstallExecute(MSIHANDLE hInstall)
277{
278 HRESULT hr = S_OK;
279 UINT er = ERROR_SUCCESS;
280
281 LPWSTR pwzCustomActionData = NULL;
282 LPWSTR pwzData = NULL;
283 LPWSTR pwzRollbackFileName = NULL;
284
285 HANDLE hRollbackFile = INVALID_HANDLE_VALUE;
286
287 CPI_ROLLBACK_DATA* prdPartitions = NULL;
288 CPI_ROLLBACK_DATA* prdUsersInPartitionRoles = NULL;
289 CPI_ROLLBACK_DATA* prdPartitionUsers = NULL;
290 CPI_ROLLBACK_DATA* prdApplications = NULL;
291 CPI_ROLLBACK_DATA* prdApplicationRoles = NULL;
292 CPI_ROLLBACK_DATA* prdUsersApplicationRoles = NULL;
293 CPI_ROLLBACK_DATA* prdAssemblies = NULL;
294 CPI_ROLLBACK_DATA* prdRoleAssignments = NULL;
295 CPI_ROLLBACK_DATA* prdSubscriptions = NULL;
296
297 BOOL fInitializedCom = FALSE;
298
299 // initialize
300 hr = WcaInitialize(hInstall, "ComPlusRollbackInstallExecute");
301 ExitOnFailure(hr, "Failed to initialize ComPlusRollbackInstallExecute");
302
303 hr = ::CoInitialize(NULL);
304 ExitOnFailure(hr, "Failed to initialize COM");
305 fInitializedCom = TRUE;
306
307 CpiExecInitialize();
308
309 // get custom action data
310 hr = WcaGetProperty(L"CustomActionData", &pwzCustomActionData);
311 ExitOnFailure(hr, "Failed to get CustomActionData");
312 pwzData = pwzCustomActionData;
313
314 // open rollback file
315 hr = WcaReadStringFromCaData(&pwzData, &pwzRollbackFileName);
316 ExitOnFailure(hr, "Failed to read rollback file name");
317
318 hRollbackFile = ::CreateFileW(pwzRollbackFileName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_TEMPORARY, NULL);
319 if (INVALID_HANDLE_VALUE == hRollbackFile)
320 ExitOnFailure(hr = HRESULT_FROM_WIN32(::GetLastError()), "Failed to open rollback file, name: %S", pwzRollbackFileName);
321
322 // read rollback data (execute)
323 hr = CpiReadRollbackDataList(hRollbackFile, &prdPartitions);
324 ExitOnFailure(hr, "Failed to read partitions rollback data");
325 hr = CpiReadRollbackDataList(hRollbackFile, &prdUsersInPartitionRoles);
326 ExitOnFailure(hr, "Failed to read users in partition roles rollback data");
327 hr = CpiReadRollbackDataList(hRollbackFile, &prdPartitionUsers);
328 ExitOnFailure(hr, "Failed to read partition users rollback data");
329 hr = CpiReadRollbackDataList(hRollbackFile, &prdApplications);
330 ExitOnFailure(hr, "Failed to read applications rollback data");
331 hr = CpiReadRollbackDataList(hRollbackFile, &prdApplicationRoles);
332 ExitOnFailure(hr, "Failed to read application roles rollback data");
333 hr = CpiReadRollbackDataList(hRollbackFile, &prdUsersApplicationRoles);
334 ExitOnFailure(hr, "Failed to read users in application roles rollback data");
335 hr = CpiReadRollbackDataList(hRollbackFile, &prdAssemblies);
336 ExitOnFailure(hr, "Failed to read assemblies rollback data");
337 hr = CpiReadRollbackDataList(hRollbackFile, &prdRoleAssignments);
338 ExitOnFailure(hr, "Failed to read role assignments rollback data");
339 hr = CpiReadRollbackDataList(hRollbackFile, &prdSubscriptions);
340 ExitOnFailure(hr, "Failed to read subscription rollback data");
341
342 // read rollback data (commit)
343 hr = CpiReadRollbackDataList(hRollbackFile, &prdAssemblies);
344 ExitOnFailure(hr, "Failed to read assemblies rollback data (commit)");
345 hr = CpiReadRollbackDataList(hRollbackFile, &prdRoleAssignments);
346 ExitOnFailure(hr, "Failed to read role assignments rollback data");
347 hr = CpiReadRollbackDataList(hRollbackFile, &prdSubscriptions);
348 ExitOnFailure(hr, "Failed to read subscription rollback data (commit)");
349
350 ::CloseHandle(hRollbackFile);
351 hRollbackFile = INVALID_HANDLE_VALUE;
352
353 // rollback create subscriptions
354 hr = CpiRollbackConfigureSubscriptions(&pwzData, prdSubscriptions);
355 ExitOnFailure(hr, "Failed to rollback create subscriptions");
356
357 // rollback create role assignments
358 hr = CpiRollbackConfigureRoleAssignments(&pwzData, prdRoleAssignments);
359 ExitOnFailure(hr, "Failed to rollback create role assignments");
360
361 // rollback register assemblies
362 hr = CpiRollbackConfigureAssemblies(&pwzData, prdAssemblies);
363 ExitOnFailure(hr, "Failed to rollback register assemblies");
364
365 // rollback create users in application roles
366 hr = CpiRollbackConfigureUsersInApplicationRoles(&pwzData, prdUsersApplicationRoles);
367 ExitOnFailure(hr, "Failed to rollback create users in application roles");
368
369 // rollback create application roles
370 hr = CpiRollbackConfigureApplicationRoles(&pwzData, prdApplicationRoles);
371 ExitOnFailure(hr, "Failed to rollback create application roles");
372
373 // rollback create applications
374 hr = CpiRollbackConfigureApplications(&pwzData, prdApplications);
375 ExitOnFailure(hr, "Failed to rollback create applications");
376
377 // rollback create partition users
378 hr = CpiRollbackConfigurePartitionUsers(&pwzData, prdPartitionUsers);
379 ExitOnFailure(hr, "Failed to rollback create partition users");
380
381 // rollback create users in partition roles
382 hr = CpiRollbackConfigureUsersInPartitionRoles(&pwzData, prdUsersInPartitionRoles);
383 ExitOnFailure(hr, "Failed to rollback create users in partition roles");
384
385 // rollback create partitions
386 hr = CpiRollbackConfigurePartitions(&pwzData, prdPartitions);
387 ExitOnFailure(hr, "Failed to rollback create partitions");
388
389 hr = S_OK;
390
391LExit:
392 // clean up
393 ReleaseStr(pwzCustomActionData);
394 ReleaseStr(pwzRollbackFileName);
395
396 if (INVALID_HANDLE_VALUE != hRollbackFile)
397 ::CloseHandle(hRollbackFile);
398
399 if (prdPartitions)
400 CpiFreeRollbackDataList(prdPartitions);
401 if (prdUsersInPartitionRoles)
402 CpiFreeRollbackDataList(prdUsersInPartitionRoles);
403 if (prdPartitionUsers)
404 CpiFreeRollbackDataList(prdPartitionUsers);
405 if (prdApplications)
406 CpiFreeRollbackDataList(prdApplications);
407 if (prdApplicationRoles)
408 CpiFreeRollbackDataList(prdApplicationRoles);
409 if (prdUsersApplicationRoles)
410 CpiFreeRollbackDataList(prdUsersApplicationRoles);
411 if (prdAssemblies)
412 CpiFreeRollbackDataList(prdAssemblies);
413 if (prdRoleAssignments)
414 CpiFreeRollbackDataList(prdRoleAssignments);
415 if (prdSubscriptions)
416 CpiFreeRollbackDataList(prdSubscriptions);
417
418 // unitialize
419 CpiExecFinalize();
420
421 if (fInitializedCom)
422 ::CoUninitialize();
423
424 er = SUCCEEDED(hr) ? ERROR_SUCCESS : ERROR_INSTALL_FAILURE;
425 return WcaFinalize(er);
426}
427
428/********************************************************************
429 ComPlusUninstallExecute - CUSTOM ACTION ENTRY POINT
430
431 Input: deferred CustomActionData - ComPlusUninstallExecute
432********************************************************************/
433extern "C" UINT __stdcall ComPlusUninstallExecute(MSIHANDLE hInstall)
434{
435 HRESULT hr = S_OK;
436 UINT er = ERROR_SUCCESS;
437
438 LPWSTR pwzCustomActionData = NULL;
439 LPWSTR pwzData = NULL;
440 LPWSTR pwzRollbackFileName = NULL;
441
442 HANDLE hRollbackFile = INVALID_HANDLE_VALUE;
443
444 BOOL fInitializedCom = FALSE;
445
446 // initialize
447 hr = WcaInitialize(hInstall, "ComPlusUninstallExecute");
448 ExitOnFailure(hr, "Failed to initialize ComPlusUninstallExecute");
449
450 hr = ::CoInitialize(NULL);
451 ExitOnFailure(hr, "Failed to initialize COM");
452 fInitializedCom = TRUE;
453
454 CpiExecInitialize();
455
456 // get custom action data
457 hr = WcaGetProperty(L"CustomActionData", &pwzCustomActionData);
458 ExitOnFailure(hr, "Failed to get CustomActionData");
459 pwzData = pwzCustomActionData;
460
461 // open rollback file
462 hr = WcaReadStringFromCaData(&pwzData, &pwzRollbackFileName);
463 ExitOnFailure(hr, "Failed to read rollback file name");
464
465 hRollbackFile = ::CreateFileW(pwzRollbackFileName, GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_TEMPORARY, NULL);
466 if (INVALID_HANDLE_VALUE == hRollbackFile)
467 ExitOnFailure(hr = HRESULT_FROM_WIN32(::GetLastError()), "Failed to open rollback file, name: %S", pwzRollbackFileName);
468
469 // delete subscriptions
470 hr = CpiConfigureSubscriptions(&pwzData, hRollbackFile);
471 ExitOnFailure(hr, "Failed to delete subscriptions");
472 if (S_FALSE == hr) ExitFunction();
473
474 // delete role assignments
475 hr = CpiConfigureRoleAssignments(&pwzData, hRollbackFile);
476 ExitOnFailure(hr, "Failed to delete role assignments");
477 if (S_FALSE == hr) ExitFunction();
478
479 // unregister assemblies
480 hr = CpiConfigureAssemblies(&pwzData, hRollbackFile);
481 ExitOnFailure(hr, "Failed to unregister assemblies");
482 if (S_FALSE == hr) ExitFunction();
483
484 // remove users in application roles
485 hr = CpiConfigureUsersInApplicationRoles(&pwzData, hRollbackFile);
486 ExitOnFailure(hr, "Failed to delete users in application roles");
487 if (S_FALSE == hr) ExitFunction();
488
489 // remove application roles
490 hr = CpiConfigureApplicationRoles(&pwzData, hRollbackFile);
491 ExitOnFailure(hr, "Failed to delete application roles");
492 if (S_FALSE == hr) ExitFunction();
493
494 // remove applications
495 hr = CpiConfigureApplications(&pwzData, hRollbackFile);
496 ExitOnFailure(hr, "Failed to remove applications");
497 if (S_FALSE == hr) ExitFunction();
498
499 // remove partition users
500 hr = CpiConfigurePartitionUsers(&pwzData, hRollbackFile);
501 ExitOnFailure(hr, "Failed to remove partition users");
502 if (S_FALSE == hr) ExitFunction();
503
504 // remove users in partition roles
505 hr = CpiConfigureUsersInPartitionRoles(&pwzData, hRollbackFile);
506 ExitOnFailure(hr, "Failed to delete users in partition roles");
507 if (S_FALSE == hr) ExitFunction();
508
509 // remove partitions
510 hr = CpiConfigurePartitions(&pwzData, hRollbackFile);
511 ExitOnFailure(hr, "Failed to delete partitions");
512 if (S_FALSE == hr) ExitFunction();
513
514 hr = S_OK;
515
516LExit:
517 // clean up
518 ReleaseStr(pwzCustomActionData);
519 ReleaseStr(pwzRollbackFileName);
520
521 if (INVALID_HANDLE_VALUE != hRollbackFile)
522 ::CloseHandle(hRollbackFile);
523
524 // unitialize
525 CpiExecFinalize();
526
527 if (fInitializedCom)
528 ::CoUninitialize();
529
530 er = SUCCEEDED(hr) ? ERROR_SUCCESS : ERROR_INSTALL_FAILURE;
531 return WcaFinalize(er);
532}
533
534/********************************************************************
535 ComPlusRollbackUninstallExecute - CUSTOM ACTION ENTRY POINT
536
537 Input: deferred CustomActionData - ComPlusRollbackUninstallExecute
538********************************************************************/
539extern "C" UINT __stdcall ComPlusRollbackUninstallExecute(MSIHANDLE hInstall)
540{
541 HRESULT hr = S_OK;
542 UINT er = ERROR_SUCCESS;
543
544 LPWSTR pwzCustomActionData = NULL;
545 LPWSTR pwzData = NULL;
546 LPWSTR pwzRollbackFileName = NULL;
547
548 HANDLE hRollbackFile = INVALID_HANDLE_VALUE;
549
550 CPI_ROLLBACK_DATA* prdPartitions = NULL;
551 CPI_ROLLBACK_DATA* prdUsersInPartitionRoles = NULL;
552 CPI_ROLLBACK_DATA* prdPartitionUsers = NULL;
553 CPI_ROLLBACK_DATA* prdApplications = NULL;
554 CPI_ROLLBACK_DATA* prdApplicationRoles = NULL;
555 CPI_ROLLBACK_DATA* prdUsersApplicationRoles = NULL;
556 CPI_ROLLBACK_DATA* prdAssemblies = NULL;
557 CPI_ROLLBACK_DATA* prdRoleAssignments = NULL;
558 CPI_ROLLBACK_DATA* prdSubscriptions = NULL;
559
560 BOOL fInitializedCom = FALSE;
561
562 // initialize
563 hr = WcaInitialize(hInstall, "ComPlusRollbackUninstallExecute");
564 ExitOnFailure(hr, "Failed to initialize ComPlusRollbackUninstallExecute");
565
566 hr = ::CoInitialize(NULL);
567 ExitOnFailure(hr, "Failed to initialize COM");
568 fInitializedCom = TRUE;
569
570 CpiExecInitialize();
571
572 // get custom action data
573 hr = WcaGetProperty(L"CustomActionData", &pwzCustomActionData);
574 ExitOnFailure(hr, "Failed to get CustomActionData");
575 pwzData = pwzCustomActionData;
576
577 // open rollback file
578 hr = WcaReadStringFromCaData(&pwzData, &pwzRollbackFileName);
579 ExitOnFailure(hr, "Failed to read rollback file name");
580
581 hRollbackFile = ::CreateFileW(pwzRollbackFileName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_TEMPORARY, NULL);
582 if (INVALID_HANDLE_VALUE == hRollbackFile)
583 ExitOnFailure(hr = HRESULT_FROM_WIN32(::GetLastError()), "Failed to open rollback file, name: %S", pwzRollbackFileName);
584
585 // read rollback data
586 hr = CpiReadRollbackDataList(hRollbackFile, &prdSubscriptions);
587 ExitOnFailure(hr, "Failed to read subscription rollback data");
588 hr = CpiReadRollbackDataList(hRollbackFile, &prdRoleAssignments);
589 ExitOnFailure(hr, "Failed to read role assignments rollback data");
590 hr = CpiReadRollbackDataList(hRollbackFile, &prdAssemblies);
591 ExitOnFailure(hr, "Failed to read assemblies rollback data");
592 hr = CpiReadRollbackDataList(hRollbackFile, &prdUsersApplicationRoles);
593 ExitOnFailure(hr, "Failed to read users in application roles rollback data");
594 hr = CpiReadRollbackDataList(hRollbackFile, &prdApplicationRoles);
595 ExitOnFailure(hr, "Failed to read application roles rollback data");
596 hr = CpiReadRollbackDataList(hRollbackFile, &prdApplications);
597 ExitOnFailure(hr, "Failed to read applications rollback data");
598 hr = CpiReadRollbackDataList(hRollbackFile, &prdPartitionUsers);
599 ExitOnFailure(hr, "Failed to read partition users rollback data");
600 hr = CpiReadRollbackDataList(hRollbackFile, &prdUsersInPartitionRoles);
601 ExitOnFailure(hr, "Failed to read users in partition roles rollback data");
602 hr = CpiReadRollbackDataList(hRollbackFile, &prdPartitions);
603 ExitOnFailure(hr, "Failed to read partitions rollback data");
604
605 ::CloseHandle(hRollbackFile);
606 hRollbackFile = INVALID_HANDLE_VALUE;
607
608 // rollback remove partitions
609 hr = CpiRollbackConfigurePartitions(&pwzData, prdPartitions);
610 ExitOnFailure(hr, "Failed to rollback delete partitions");
611
612 // rollback remove users in partition roles
613 hr = CpiRollbackConfigureUsersInPartitionRoles(&pwzData, prdUsersInPartitionRoles);
614 ExitOnFailure(hr, "Failed to rollback delete users in partition roles");
615
616 // rollback remove partition users
617 hr = CpiRollbackConfigurePartitionUsers(&pwzData, prdPartitionUsers);
618 ExitOnFailure(hr, "Failed to rollback delete partition users");
619
620 // rollback remove applications
621 hr = CpiRollbackConfigureApplications(&pwzData, prdApplications);
622 ExitOnFailure(hr, "Failed to rollback delete applications");
623
624 // rollback remove application roles
625 hr = CpiRollbackConfigureApplicationRoles(&pwzData, prdApplicationRoles);
626 ExitOnFailure(hr, "Failed to rollback delete application roles");
627
628 // rollback remove users in application roles
629 hr = CpiRollbackConfigureUsersInApplicationRoles(&pwzData, prdUsersApplicationRoles);
630 ExitOnFailure(hr, "Failed to rollback delete users in application roles");
631
632 // rollback unregister assemblies
633 hr = CpiRollbackConfigureAssemblies(&pwzData, prdAssemblies);
634 ExitOnFailure(hr, "Failed to rollback unregister assemblies");
635
636 // rollback delete role assignments
637 hr = CpiRollbackConfigureRoleAssignments(&pwzData, prdAssemblies);
638 ExitOnFailure(hr, "Failed to rollback delete role assignments");
639
640 // rollback delete subscriptions
641 hr = CpiRollbackConfigureSubscriptions(&pwzData, prdSubscriptions);
642 ExitOnFailure(hr, "Failed to rollback delete subscriptions");
643
644 hr = S_OK;
645
646LExit:
647 // clean up
648 ReleaseStr(pwzCustomActionData);
649 ReleaseStr(pwzRollbackFileName);
650
651 if (INVALID_HANDLE_VALUE != hRollbackFile)
652 ::CloseHandle(hRollbackFile);
653
654 if (prdPartitions)
655 CpiFreeRollbackDataList(prdPartitions);
656 if (prdUsersInPartitionRoles)
657 CpiFreeRollbackDataList(prdUsersInPartitionRoles);
658 if (prdPartitionUsers)
659 CpiFreeRollbackDataList(prdPartitionUsers);
660 if (prdApplications)
661 CpiFreeRollbackDataList(prdApplications);
662 if (prdApplicationRoles)
663 CpiFreeRollbackDataList(prdApplicationRoles);
664 if (prdUsersApplicationRoles)
665 CpiFreeRollbackDataList(prdUsersApplicationRoles);
666 if (prdAssemblies)
667 CpiFreeRollbackDataList(prdAssemblies);
668 if (prdRoleAssignments)
669 CpiFreeRollbackDataList(prdRoleAssignments);
670 if (prdSubscriptions)
671 CpiFreeRollbackDataList(prdSubscriptions);
672
673 // unitialize
674 CpiExecFinalize();
675
676 if (fInitializedCom)
677 ::CoUninitialize();
678
679 er = SUCCEEDED(hr) ? ERROR_SUCCESS : ERROR_INSTALL_FAILURE;
680 return WcaFinalize(er);
681}
diff --git a/src/ext/ComPlus/ca/cppartexec.cpp b/src/ext/ComPlus/ca/cppartexec.cpp
new file mode 100644
index 00000000..673bdaf9
--- /dev/null
+++ b/src/ext/ComPlus/ca/cppartexec.cpp
@@ -0,0 +1,690 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3#include "precomp.h"
4
5
6// private structs
7
8struct CPI_PARTITION_ATTRIBUTES
9{
10 int iActionType;
11 int iActionCost;
12 LPWSTR pwzKey;
13 LPWSTR pwzID;
14 LPWSTR pwzName;
15 CPI_PROPERTY* pPropList;
16};
17
18struct CPI_PARTITION_USER_ATTRIBUTES
19{
20 int iActionType;
21 int iActionCost;
22 LPWSTR pwzKey;
23 LPWSTR pwzAccount;
24 LPWSTR pwzPartID;
25};
26
27
28// prototypes for private helper functions
29
30static HRESULT ReadPartitionAttributes(
31 LPWSTR* ppwzData,
32 CPI_PARTITION_ATTRIBUTES* pAttrs
33 );
34static void FreePartitionAttributes(
35 CPI_PARTITION_ATTRIBUTES* pAttrs
36 );
37static HRESULT CreatePartition(
38 CPI_PARTITION_ATTRIBUTES* pAttrs
39 );
40static HRESULT RemovePartition(
41 CPI_PARTITION_ATTRIBUTES* pAttrs
42 );
43static HRESULT ReadPartitionUserAttributes(
44 LPWSTR* ppwzData,
45 CPI_PARTITION_USER_ATTRIBUTES* pAttrs
46 );
47static void FreePartitionUserAttributes(
48 CPI_PARTITION_USER_ATTRIBUTES* pAttrs
49 );
50static HRESULT CreatePartitionUser(
51 CPI_PARTITION_USER_ATTRIBUTES* pAttrs
52 );
53static HRESULT RemovePartitionUser(
54 CPI_PARTITION_USER_ATTRIBUTES* pAttrs
55 );
56
57
58// function definitions
59
60HRESULT CpiConfigurePartitions(
61 LPWSTR* ppwzData,
62 HANDLE hRollbackFile
63 )
64{
65 HRESULT hr = S_OK;
66
67 CPI_PARTITION_ATTRIBUTES attrs;
68 ::ZeroMemory(&attrs, sizeof(attrs));
69
70 // read action text
71 hr = CpiActionStartMessage(ppwzData, FALSE);
72 ExitOnFailure(hr, "Failed to send action start message");
73
74 // ger partition count
75 int iCnt = 0;
76 hr = WcaReadIntegerFromCaData(ppwzData, &iCnt);
77 ExitOnFailure(hr, "Failed to read count");
78
79 // write count to rollback file
80 hr = CpiWriteIntegerToRollbackFile(hRollbackFile, iCnt);
81 ExitOnFailure(hr, "Failed to write count to rollback file");
82
83 for (int i = 0; i < iCnt; i++)
84 {
85 // read partition attributes from CustomActionData
86 hr = ReadPartitionAttributes(ppwzData, &attrs);
87 ExitOnFailure(hr, "Failed to read attributes");
88
89 // progress message
90 hr = CpiActionDataMessage(1, attrs.pwzName);
91 ExitOnFailure(hr, "Failed to send progress messages");
92
93 if (S_FALSE == hr)
94 ExitFunction();
95
96 // write key to rollback file
97 hr = CpiWriteKeyToRollbackFile(hRollbackFile, attrs.pwzKey);
98 ExitOnFailure(hr, "Failed to write key to rollback file");
99
100 // action
101 switch (attrs.iActionType)
102 {
103 case atCreate:
104 hr = CreatePartition(&attrs);
105 ExitOnFailure(hr, "Failed to create partition, key: %S", attrs.pwzKey);
106 break;
107 case atRemove:
108 hr = RemovePartition(&attrs);
109 ExitOnFailure(hr, "Failed to remove partition, key: %S", attrs.pwzKey);
110 break;
111 }
112
113 // write completion status to rollback file
114 hr = CpiWriteIntegerToRollbackFile(hRollbackFile, 1);
115 ExitOnFailure(hr, "Failed to write completion status to rollback file");
116
117 // progress
118 hr = WcaProgressMessage(attrs.iActionCost, FALSE);
119 ExitOnFailure(hr, "Failed to update progress");
120 }
121
122 hr = S_OK;
123
124LExit:
125 // clean up
126 FreePartitionAttributes(&attrs);
127
128 return hr;
129}
130
131HRESULT CpiRollbackConfigurePartitions(
132 LPWSTR* ppwzData,
133 CPI_ROLLBACK_DATA* pRollbackDataList
134 )
135{
136 HRESULT hr = S_OK;
137
138 int iRollbackStatus;
139
140 CPI_PARTITION_ATTRIBUTES attrs;
141 ::ZeroMemory(&attrs, sizeof(attrs));
142
143 // read action text
144 hr = CpiActionStartMessage(ppwzData, NULL == pRollbackDataList);
145 ExitOnFailure(hr, "Failed to send action start message");
146
147 // get count
148 int iCnt = 0;
149 hr = WcaReadIntegerFromCaData(ppwzData, &iCnt);
150 ExitOnFailure(hr, "Failed to read count");
151
152 for (int i = 0; i < iCnt; i++)
153 {
154 // read partition attributes from CustomActionData
155 hr = ReadPartitionAttributes(ppwzData, &attrs);
156 ExitOnFailure(hr, "Failed to read attributes");
157
158 // rollback status
159 hr = CpiFindRollbackStatus(pRollbackDataList, attrs.pwzKey, &iRollbackStatus);
160
161 if (S_FALSE == hr)
162 continue; // not found, nothing to rollback
163
164 // progress message
165 hr = CpiActionDataMessage(1, attrs.pwzName);
166 ExitOnFailure(hr, "Failed to send progress messages");
167
168 if (S_FALSE == hr)
169 ExitFunction();
170
171 // action
172 switch (attrs.iActionType)
173 {
174 case atCreate:
175 hr = CreatePartition(&attrs);
176 if (FAILED(hr))
177 WcaLog(LOGMSG_STANDARD, "Failed to create partition, hr: 0x%x, key: %S", hr, attrs.pwzKey);
178 break;
179 case atRemove:
180 hr = RemovePartition(&attrs);
181 if (FAILED(hr))
182 WcaLog(LOGMSG_STANDARD, "Failed to remove partition, hr: 0x%x, key: %S", hr, attrs.pwzKey);
183 break;
184 }
185
186 // check rollback status
187 if (0 == iRollbackStatus)
188 continue; // operation did not complete, skip progress
189
190 // progress
191 hr = WcaProgressMessage(attrs.iActionCost, FALSE);
192 ExitOnFailure(hr, "Failed to update progress");
193 }
194
195 hr = S_OK;
196
197LExit:
198 // clean up
199 FreePartitionAttributes(&attrs);
200
201 return hr;
202}
203
204HRESULT CpiConfigurePartitionUsers(
205 LPWSTR* ppwzData,
206 HANDLE hRollbackFile
207 )
208{
209 HRESULT hr = S_OK;
210
211 CPI_PARTITION_USER_ATTRIBUTES attrs;
212 ::ZeroMemory(&attrs, sizeof(attrs));
213
214 // read action text
215 hr = CpiActionStartMessage(ppwzData, FALSE);
216 ExitOnFailure(hr, "Failed to send action start message");
217
218 // ger partition count
219 int iCnt = 0;
220 hr = WcaReadIntegerFromCaData(ppwzData, &iCnt);
221 ExitOnFailure(hr, "Failed to read count");
222
223 // write count to rollback file
224 hr = CpiWriteIntegerToRollbackFile(hRollbackFile, iCnt);
225 ExitOnFailure(hr, "Failed to write count to rollback file");
226
227 for (int i = 0; i < iCnt; i++)
228 {
229 // read partition attributes from CustomActionData
230 hr = ReadPartitionUserAttributes(ppwzData, &attrs);
231 ExitOnFailure(hr, "Failed to read attributes");
232
233 // progress message
234 hr = CpiActionDataMessage(1, attrs.pwzAccount);
235 ExitOnFailure(hr, "Failed to send progress messages");
236
237 if (S_FALSE == hr)
238 ExitFunction();
239
240 // write key to rollback file
241 hr = CpiWriteKeyToRollbackFile(hRollbackFile, attrs.pwzKey);
242 ExitOnFailure(hr, "Failed to write key to rollback file");
243
244 // action
245 switch (attrs.iActionType)
246 {
247 case atCreate:
248 hr = CreatePartitionUser(&attrs);
249 ExitOnFailure(hr, "Failed to create partition user, key: %S", attrs.pwzKey);
250 break;
251 case atRemove:
252 hr = RemovePartitionUser(&attrs);
253 ExitOnFailure(hr, "Failed to remove partition user, key: %S", attrs.pwzKey);
254 break;
255 }
256
257 // write completion status to rollback file
258 hr = CpiWriteIntegerToRollbackFile(hRollbackFile, 1);
259 ExitOnFailure(hr, "Failed to write completion status to rollback file");
260
261 // progress
262 hr = WcaProgressMessage(attrs.iActionCost, FALSE);
263 ExitOnFailure(hr, "Failed to update progress");
264 }
265
266 hr = S_OK;
267
268LExit:
269 // clean up
270 FreePartitionUserAttributes(&attrs);
271
272 return hr;
273}
274
275HRESULT CpiRollbackConfigurePartitionUsers(
276 LPWSTR* ppwzData,
277 CPI_ROLLBACK_DATA* pRollbackDataList
278 )
279{
280 HRESULT hr = S_OK;
281
282 int iRollbackStatus;
283
284 CPI_PARTITION_USER_ATTRIBUTES attrs;
285 ::ZeroMemory(&attrs, sizeof(attrs));
286
287 // read action text
288 hr = CpiActionStartMessage(ppwzData, NULL == pRollbackDataList);
289 ExitOnFailure(hr, "Failed to send action start message");
290
291 // get count
292 int iCnt = 0;
293 hr = WcaReadIntegerFromCaData(ppwzData, &iCnt);
294 ExitOnFailure(hr, "Failed to read count");
295
296 for (int i = 0; i < iCnt; i++)
297 {
298 // read partition attributes from CustomActionData
299 hr = ReadPartitionUserAttributes(ppwzData, &attrs);
300 ExitOnFailure(hr, "Failed to read attributes");
301
302 // rollback status
303 hr = CpiFindRollbackStatus(pRollbackDataList, attrs.pwzKey, &iRollbackStatus);
304
305 if (S_FALSE == hr)
306 continue; // not found, nothing to rollback
307
308 // progress message
309 hr = CpiActionDataMessage(1, attrs.pwzAccount);
310 ExitOnFailure(hr, "Failed to send progress messages");
311
312 if (S_FALSE == hr)
313 ExitFunction();
314
315 // action
316 switch (attrs.iActionType)
317 {
318 case atCreate:
319 hr = CreatePartitionUser(&attrs);
320 ExitOnFailure(hr, "Failed to create partition user, key: %S", attrs.pwzKey);
321 break;
322 case atRemove:
323 hr = RemovePartitionUser(&attrs);
324 ExitOnFailure(hr, "Failed to remove partition user, key: %S", attrs.pwzKey);
325 break;
326 }
327
328 // check rollback status
329 if (0 == iRollbackStatus)
330 continue; // operation did not complete, skip progress
331
332 // progress
333 hr = WcaProgressMessage(attrs.iActionCost, FALSE);
334 ExitOnFailure(hr, "Failed to update progress");
335 }
336
337 hr = S_OK;
338
339LExit:
340 // clean up
341 FreePartitionUserAttributes(&attrs);
342
343 return hr;
344}
345
346
347// helper function definitions
348
349static HRESULT ReadPartitionAttributes(
350 LPWSTR* ppwzData,
351 CPI_PARTITION_ATTRIBUTES* pAttrs
352 )
353{
354 HRESULT hr = S_OK;
355
356 hr = WcaReadIntegerFromCaData(ppwzData, &pAttrs->iActionType);
357 ExitOnFailure(hr, "Failed to read action type");
358 hr = WcaReadIntegerFromCaData(ppwzData, &pAttrs->iActionCost);
359 ExitOnFailure(hr, "Failed to read action cost");
360 hr = WcaReadStringFromCaData(ppwzData, &pAttrs->pwzKey);
361 ExitOnFailure(hr, "Failed to read key");
362 hr = WcaReadStringFromCaData(ppwzData, &pAttrs->pwzID);
363 ExitOnFailure(hr, "Failed to read id");
364 hr = WcaReadStringFromCaData(ppwzData, &pAttrs->pwzName);
365 ExitOnFailure(hr, "Failed to read name");
366 hr = CpiReadPropertyList(ppwzData, &pAttrs->pPropList);
367 ExitOnFailure(hr, "Failed to read properties");
368
369 hr = S_OK;
370
371LExit:
372 return hr;
373}
374
375static void FreePartitionAttributes(
376 CPI_PARTITION_ATTRIBUTES* pAttrs
377 )
378{
379 ReleaseStr(pAttrs->pwzKey);
380 ReleaseStr(pAttrs->pwzID);
381 ReleaseStr(pAttrs->pwzName);
382
383 if (pAttrs->pPropList)
384 CpiFreePropertyList(pAttrs->pPropList);
385}
386
387static HRESULT CreatePartition(
388 CPI_PARTITION_ATTRIBUTES* pAttrs
389 )
390{
391 HRESULT hr = S_OK;
392
393 ICatalogCollection* piPartColl = NULL;
394 ICatalogObject* piPartObj = NULL;
395
396 long lChanges = 0;
397
398 // log
399 WcaLog(LOGMSG_VERBOSE, "Creating partition, key: %S", pAttrs->pwzKey);
400
401 // get partitions collection
402 hr = CpiExecGetPartitionsCollection(&piPartColl);
403 ExitOnFailure(hr, "Failed to get partitions collection");
404
405 // check if partition exists
406 hr = CpiFindCollectionObjectByStringKey(piPartColl, pAttrs->pwzID, &piPartObj);
407 ExitOnFailure(hr, "Failed to find partition");
408
409 if (S_FALSE == hr)
410 {
411 // create partition
412 hr = CpiAddCollectionObject(piPartColl, &piPartObj);
413 ExitOnFailure(hr, "Failed to add partition to collection");
414
415 hr = CpiPutCollectionObjectValue(piPartObj, L"ID", pAttrs->pwzID);
416 ExitOnFailure(hr, "Failed to set partition id property");
417
418 hr = CpiPutCollectionObjectValue(piPartObj, L"Name", pAttrs->pwzName);
419 ExitOnFailure(hr, "Failed to set partition name property");
420 }
421
422 // properties
423 hr = CpiPutCollectionObjectValues(piPartObj, pAttrs->pPropList);
424 ExitOnFailure(hr, "Failed to write properties");
425
426 // save changes
427 hr = piPartColl->SaveChanges(&lChanges);
428 if (COMADMIN_E_OBJECTERRORS == hr)
429 CpiLogCatalogErrorInfo();
430 ExitOnFailure(hr, "Failed to save changes");
431
432 // log
433 WcaLog(LOGMSG_VERBOSE, "%d changes saved to catalog, key: %S", lChanges, pAttrs->pwzKey);
434
435 hr = S_OK;
436
437LExit:
438 // clean up
439 ReleaseObject(piPartColl);
440 ReleaseObject(piPartObj);
441
442 return hr;
443}
444
445static HRESULT RemovePartition(
446 CPI_PARTITION_ATTRIBUTES* pAttrs
447 )
448{
449 HRESULT hr = S_OK;
450
451 ICatalogCollection* piPartColl = NULL;
452
453 long lChanges = 0;
454
455 // log
456 WcaLog(LOGMSG_VERBOSE, "Removing partition, key: %S", pAttrs->pwzKey);
457
458 // get partitions collection
459 hr = CpiExecGetPartitionsCollection(&piPartColl);
460 ExitOnFailure(hr, "Failed to get partitions collection");
461
462 // remove
463 hr = CpiRemoveCollectionObject(piPartColl, pAttrs->pwzID, NULL, TRUE);
464 ExitOnFailure(hr, "Failed to remove partition");
465
466 if (S_FALSE == hr)
467 {
468 // partition not found
469 WcaLog(LOGMSG_VERBOSE, "Partition not found, nothing to delete, key: %S", pAttrs->pwzKey);
470 ExitFunction1(hr = S_OK);
471 }
472
473 // save changes
474 hr = piPartColl->SaveChanges(&lChanges);
475 if (COMADMIN_E_OBJECTERRORS == hr)
476 CpiLogCatalogErrorInfo();
477 ExitOnFailure(hr, "Failed to save changes");
478
479 // log
480 WcaLog(LOGMSG_VERBOSE, "%d changes saved to catalog, key: %S", lChanges, pAttrs->pwzKey);
481
482 hr = S_OK;
483
484LExit:
485 // clean up
486 ReleaseObject(piPartColl);
487
488 return hr;
489}
490
491static HRESULT ReadPartitionUserAttributes(
492 LPWSTR* ppwzData,
493 CPI_PARTITION_USER_ATTRIBUTES* pAttrs
494 )
495{
496 HRESULT hr = S_OK;
497
498 hr = WcaReadIntegerFromCaData(ppwzData, &pAttrs->iActionType);
499 ExitOnFailure(hr, "Failed to read action type");
500 hr = WcaReadIntegerFromCaData(ppwzData, &pAttrs->iActionCost);
501 ExitOnFailure(hr, "Failed to read action cost");
502 hr = WcaReadStringFromCaData(ppwzData, &pAttrs->pwzKey);
503 ExitOnFailure(hr, "Failed to read key");
504 hr = WcaReadStringFromCaData(ppwzData, &pAttrs->pwzAccount);
505 ExitOnFailure(hr, "Failed to read account name");
506 hr = WcaReadStringFromCaData(ppwzData, &pAttrs->pwzPartID);
507 ExitOnFailure(hr, "Failed to read partition id");
508
509 hr = S_OK;
510
511LExit:
512 return hr;
513}
514
515static void FreePartitionUserAttributes(
516 CPI_PARTITION_USER_ATTRIBUTES* pAttrs
517 )
518{
519 ReleaseStr(pAttrs->pwzKey);
520 ReleaseStr(pAttrs->pwzAccount);
521 ReleaseStr(pAttrs->pwzPartID);
522}
523
524static HRESULT CreatePartitionUser(
525 CPI_PARTITION_USER_ATTRIBUTES* pAttrs
526 )
527{
528 HRESULT hr = S_OK;
529 UINT er = ERROR_SUCCESS;
530
531 ICatalogCollection* piUserColl = NULL;
532 ICatalogObject* piUserObj = NULL;
533
534 PSID pSid = NULL;
535 long lChanges = 0;
536
537 // log
538 WcaLog(LOGMSG_VERBOSE, "Setting default partition for user, key: %S", pAttrs->pwzKey);
539
540 // get partition users collection
541 hr = CpiGetPartitionUsersCollection(&piUserColl);
542 ExitOnFailure(hr, "Failed to get partition users collection");
543
544 // get SID for account
545 do {
546 er = ERROR_SUCCESS;
547 hr = CpiAccountNameToSid(pAttrs->pwzAccount, &pSid);
548 if (HRESULT_FROM_WIN32(ERROR_NONE_MAPPED) == hr && !::MsiGetMode(WcaGetInstallHandle(), MSIRUNMODE_ROLLBACK))
549 {
550 WcaLog(LOGMSG_STANDARD, "Failed to lookup account name, hr: 0x%x, account: '%S'", hr, pAttrs->pwzAccount);
551 er = WcaErrorMessage(msierrComPlusFailedLookupNames, hr, INSTALLMESSAGE_ERROR | MB_ABORTRETRYIGNORE, 0);
552 switch (er)
553 {
554 case IDABORT:
555 ExitFunction(); // exit with error code from CpiAccountNameToSid()
556 case IDRETRY:
557 break;
558 case IDIGNORE:
559 default:
560 ExitFunction1(hr = S_OK);
561 }
562 }
563 else
564 ExitOnFailure(hr, "Failed to get SID for account");
565 } while (IDRETRY == er);
566
567 // remove any existing entry
568 hr = CpiRemoveUserCollectionObject(piUserColl, pSid);
569 if (HRESULT_FROM_WIN32(ERROR_NONE_MAPPED) == hr || HRESULT_FROM_WIN32(ERROR_SOME_NOT_MAPPED) == hr)
570 {
571 WcaLog(LOGMSG_STANDARD, "Failed to lookup account names, hr: 0x%x", hr);
572 hr = S_FALSE;
573 }
574 else
575 ExitOnFailure(hr, "Failed to remove user");
576
577 if (S_OK == hr)
578 WcaLog(LOGMSG_VERBOSE, "Existing default partition for user was removed, key: %S", pAttrs->pwzKey);
579
580 // add partition user
581 hr = CpiAddCollectionObject(piUserColl, &piUserObj);
582 ExitOnFailure(hr, "Failed to add partition to collection");
583
584 hr = CpiPutCollectionObjectValue(piUserObj, L"AccountName", pAttrs->pwzAccount);
585 ExitOnFailure(hr, "Failed to set account name property");
586
587 hr = CpiPutCollectionObjectValue(piUserObj, L"DefaultPartitionID", pAttrs->pwzPartID);
588 ExitOnFailure(hr, "Failed to set default partition id property");
589
590 // save changes
591 hr = piUserColl->SaveChanges(&lChanges);
592 if (COMADMIN_E_OBJECTERRORS == hr)
593 CpiLogCatalogErrorInfo();
594 ExitOnFailure(hr, "Failed to save changes");
595
596 // log
597 WcaLog(LOGMSG_VERBOSE, "%d changes saved to catalog, key: %S", lChanges, pAttrs->pwzKey);
598
599 hr = S_OK;
600
601LExit:
602 // clean up
603 ReleaseObject(piUserColl);
604 ReleaseObject(piUserObj);
605
606 if (pSid)
607 ::HeapFree(::GetProcessHeap(), 0, pSid);
608
609 return hr;
610}
611
612static HRESULT RemovePartitionUser(
613 CPI_PARTITION_USER_ATTRIBUTES* pAttrs
614 )
615{
616 HRESULT hr = S_OK;
617 UINT er = ERROR_SUCCESS;
618
619 ICatalogCollection* piUserColl = NULL;
620
621 PSID pSid = NULL;
622 long lChanges = 0;
623
624 // log
625 WcaLog(LOGMSG_VERBOSE, "Removing default partition for user, key: %S", pAttrs->pwzKey);
626
627 // get partition users collection
628 hr = CpiGetPartitionUsersCollection(&piUserColl);
629 ExitOnFailure(hr, "Failed to get partition users collection");
630
631 // get SID for account
632 do {
633 er = ERROR_SUCCESS;
634 hr = CpiAccountNameToSid(pAttrs->pwzAccount, &pSid);
635 if (HRESULT_FROM_WIN32(ERROR_NONE_MAPPED) == hr && !::MsiGetMode(WcaGetInstallHandle(), MSIRUNMODE_ROLLBACK))
636 {
637 WcaLog(LOGMSG_STANDARD, "Failed to lookup account name, hr: 0x%x, account: '%S'", hr, pAttrs->pwzAccount);
638 er = WcaErrorMessage(msierrComPlusFailedLookupNames, hr, INSTALLMESSAGE_ERROR | MB_ABORTRETRYIGNORE, 0);
639 switch (er)
640 {
641 case IDABORT:
642 ExitFunction(); // exit with error code from CpiAccountNameToSid()
643 case IDRETRY:
644 break;
645 case IDIGNORE:
646 default:
647 ExitFunction1(hr = S_OK);
648 }
649 }
650 else
651 ExitOnFailure(hr, "Failed to get SID for account");
652 } while (IDRETRY == er);
653
654 // remove
655 hr = CpiRemoveUserCollectionObject(piUserColl, pSid);
656 if (HRESULT_FROM_WIN32(ERROR_NONE_MAPPED) == hr || HRESULT_FROM_WIN32(ERROR_SOME_NOT_MAPPED) == hr)
657 {
658 WcaLog(LOGMSG_STANDARD, "Failed to lookup account names, hr: 0x%x", hr);
659 hr = S_FALSE;
660 }
661 else
662 ExitOnFailure(hr, "Failed to remove user");
663
664 if (S_FALSE == hr)
665 {
666 // user not found
667 WcaLog(LOGMSG_VERBOSE, "Default partition for user not found, nothing to delete, key: %S", pAttrs->pwzKey);
668 ExitFunction1(hr = S_OK);
669 }
670
671 // save changes
672 hr = piUserColl->SaveChanges(&lChanges);
673 if (COMADMIN_E_OBJECTERRORS == hr)
674 CpiLogCatalogErrorInfo();
675 ExitOnFailure(hr, "Failed to save changes");
676
677 // log
678 WcaLog(LOGMSG_VERBOSE, "%d changes saved to catalog, key: %S", lChanges, pAttrs->pwzKey);
679
680 hr = S_OK;
681
682LExit:
683 // clean up
684 ReleaseObject(piUserColl);
685
686 if (pSid)
687 ::HeapFree(::GetProcessHeap(), 0, pSid);
688
689 return hr;
690}
diff --git a/src/ext/ComPlus/ca/cppartexec.h b/src/ext/ComPlus/ca/cppartexec.h
new file mode 100644
index 00000000..132a9f5a
--- /dev/null
+++ b/src/ext/ComPlus/ca/cppartexec.h
@@ -0,0 +1,20 @@
1#pragma once
2// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
3
4
5HRESULT CpiConfigurePartitions(
6 LPWSTR* ppwzData,
7 HANDLE hRollbackFile
8 );
9HRESULT CpiRollbackConfigurePartitions(
10 LPWSTR* ppwzData,
11 CPI_ROLLBACK_DATA* pRollbackDataList
12 );
13HRESULT CpiConfigurePartitionUsers(
14 LPWSTR* ppwzData,
15 HANDLE hRollbackFile
16 );
17HRESULT CpiRollbackConfigurePartitionUsers(
18 LPWSTR* ppwzData,
19 CPI_ROLLBACK_DATA* pRollbackDataList
20 );
diff --git a/src/ext/ComPlus/ca/cppartroleexec.cpp b/src/ext/ComPlus/ca/cppartroleexec.cpp
new file mode 100644
index 00000000..4a503c79
--- /dev/null
+++ b/src/ext/ComPlus/ca/cppartroleexec.cpp
@@ -0,0 +1,397 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3#include "precomp.h"
4
5
6// private structs
7
8struct CPI_USER_IN_PARTITION_ROLE_ATTRIBUTES
9{
10 int iActionType;
11 int iActionCost;
12 LPWSTR pwzKey;
13 LPWSTR pwzRoleName;
14 LPWSTR pwzAccount;
15 LPWSTR pwzPartID;
16};
17
18
19// prototypes for private helper functions
20
21static HRESULT ReadUserInPartitionRoleAttributes(
22 LPWSTR* ppwzData,
23 CPI_USER_IN_PARTITION_ROLE_ATTRIBUTES* pAttrs
24 );
25static void FreeUserInPartitionRoleAttributes(
26 CPI_USER_IN_PARTITION_ROLE_ATTRIBUTES* pAttrs
27 );
28static HRESULT CreateUserInPartitionRole(
29 CPI_USER_IN_PARTITION_ROLE_ATTRIBUTES* pAttrs
30 );
31static HRESULT RemoveUserInPartitionRole(
32 CPI_USER_IN_PARTITION_ROLE_ATTRIBUTES* pAttrs
33 );
34
35
36// function definitions
37
38HRESULT CpiConfigureUsersInPartitionRoles(
39 LPWSTR* ppwzData,
40 HANDLE hRollbackFile
41 )
42{
43 HRESULT hr = S_OK;
44
45 CPI_USER_IN_PARTITION_ROLE_ATTRIBUTES attrs;
46 ::ZeroMemory(&attrs, sizeof(attrs));
47
48 // read action text
49 hr = CpiActionStartMessage(ppwzData, FALSE);
50 ExitOnFailure(hr, "Failed to send action start message");
51
52 // ger count
53 int iCnt = 0;
54 hr = WcaReadIntegerFromCaData(ppwzData, &iCnt);
55 ExitOnFailure(hr, "Failed to read count");
56
57 // write count to rollback file
58 hr = CpiWriteIntegerToRollbackFile(hRollbackFile, iCnt);
59 ExitOnFailure(hr, "Failed to write count to rollback file");
60
61 for (int i = 0; i < iCnt; i++)
62 {
63 // read attributes from CustomActionData
64 hr = ReadUserInPartitionRoleAttributes(ppwzData, &attrs);
65 ExitOnFailure(hr, "Failed to read attributes");
66
67 // progress message
68 hr = CpiActionDataMessage(1, attrs.pwzRoleName);
69 ExitOnFailure(hr, "Failed to send progress messages");
70
71 if (S_FALSE == hr)
72 ExitFunction();
73
74 // write key to rollback file
75 hr = CpiWriteKeyToRollbackFile(hRollbackFile, attrs.pwzKey);
76 ExitOnFailure(hr, "Failed to write key to rollback file");
77
78 // action
79 switch (attrs.iActionType)
80 {
81 case atCreate:
82 hr = CreateUserInPartitionRole(&attrs);
83 ExitOnFailure(hr, "Failed to add user to partition role, key: %S", attrs.pwzKey);
84 break;
85 case atRemove:
86 hr = RemoveUserInPartitionRole(&attrs);
87 ExitOnFailure(hr, "Failed to remove user from partition role, key: %S", attrs.pwzKey);
88 break;
89 }
90
91 // write completion status to rollback file
92 hr = CpiWriteIntegerToRollbackFile(hRollbackFile, 1);
93 ExitOnFailure(hr, "Failed to write completion status to rollback file");
94
95 // progress
96 hr = WcaProgressMessage(attrs.iActionCost, FALSE);
97 ExitOnFailure(hr, "Failed to update progress");
98 }
99
100 hr = S_OK;
101
102LExit:
103 // clean up
104 FreeUserInPartitionRoleAttributes(&attrs);
105
106 return hr;
107}
108
109HRESULT CpiRollbackConfigureUsersInPartitionRoles(
110 LPWSTR* ppwzData,
111 CPI_ROLLBACK_DATA* pRollbackDataList
112 )
113{
114 HRESULT hr = S_OK;
115
116 int iRollbackStatus;
117
118 CPI_USER_IN_PARTITION_ROLE_ATTRIBUTES attrs;
119 ::ZeroMemory(&attrs, sizeof(attrs));
120
121 // read action text
122 hr = CpiActionStartMessage(ppwzData, NULL == pRollbackDataList);
123 ExitOnFailure(hr, "Failed to send action start message");
124
125 // get count
126 int iCnt = 0;
127 hr = WcaReadIntegerFromCaData(ppwzData, &iCnt);
128 ExitOnFailure(hr, "Failed to read count");
129
130 for (int i = 0; i < iCnt; i++)
131 {
132 // read attributes from CustomActionData
133 hr = ReadUserInPartitionRoleAttributes(ppwzData, &attrs);
134 ExitOnFailure(hr, "Failed to read attributes");
135
136 // rollback status
137 hr = CpiFindRollbackStatus(pRollbackDataList, attrs.pwzKey, &iRollbackStatus);
138
139 if (S_FALSE == hr)
140 continue; // not found, nothing to rollback
141
142 // progress message
143 hr = CpiActionDataMessage(1, attrs.pwzRoleName);
144 ExitOnFailure(hr, "Failed to send progress messages");
145
146 if (S_FALSE == hr)
147 ExitFunction();
148
149 // action
150 switch (attrs.iActionType)
151 {
152 case atCreate:
153 hr = CreateUserInPartitionRole(&attrs);
154 if (FAILED(hr))
155 WcaLog(LOGMSG_STANDARD, "Failed to add user to partition role, hr: 0x%x, key: %S", hr, attrs.pwzKey);
156 break;
157 case atRemove:
158 hr = RemoveUserInPartitionRole(&attrs);
159 if (FAILED(hr))
160 WcaLog(LOGMSG_STANDARD, "Failed to remove user from partition role, hr: 0x%x, key: %S", hr, attrs.pwzKey);
161 break;
162 }
163
164 // check rollback status
165 if (0 == iRollbackStatus)
166 continue; // operation did not complete, skip progress
167
168 // progress
169 hr = WcaProgressMessage(attrs.iActionCost, FALSE);
170 ExitOnFailure(hr, "Failed to update progress");
171 }
172
173 hr = S_OK;
174
175LExit:
176 // clean up
177 FreeUserInPartitionRoleAttributes(&attrs);
178
179 return hr;
180}
181
182
183// helper function definitions
184
185static HRESULT ReadUserInPartitionRoleAttributes(
186 LPWSTR* ppwzData,
187 CPI_USER_IN_PARTITION_ROLE_ATTRIBUTES* pAttrs
188 )
189{
190 HRESULT hr = S_OK;
191
192 hr = WcaReadIntegerFromCaData(ppwzData, &pAttrs->iActionType);
193 ExitOnFailure(hr, "Failed to read action type");
194 hr = WcaReadIntegerFromCaData(ppwzData, &pAttrs->iActionCost);
195 ExitOnFailure(hr, "Failed to read action cost");
196 hr = WcaReadStringFromCaData(ppwzData, &pAttrs->pwzKey);
197 ExitOnFailure(hr, "Failed to read key");
198 hr = WcaReadStringFromCaData(ppwzData, &pAttrs->pwzRoleName);
199 ExitOnFailure(hr, "Failed to read role name");
200 hr = WcaReadStringFromCaData(ppwzData, &pAttrs->pwzAccount);
201 ExitOnFailure(hr, "Failed to read account name");
202 hr = WcaReadStringFromCaData(ppwzData, &pAttrs->pwzPartID);
203 ExitOnFailure(hr, "Failed to read partition id");
204
205 hr = S_OK;
206
207LExit:
208 return hr;
209}
210
211static void FreeUserInPartitionRoleAttributes(
212 CPI_USER_IN_PARTITION_ROLE_ATTRIBUTES* pAttrs
213 )
214{
215 ReleaseStr(pAttrs->pwzKey);
216 ReleaseStr(pAttrs->pwzRoleName);
217 ReleaseStr(pAttrs->pwzAccount);
218 ReleaseStr(pAttrs->pwzPartID);
219}
220
221static HRESULT CreateUserInPartitionRole(
222 CPI_USER_IN_PARTITION_ROLE_ATTRIBUTES* pAttrs
223 )
224{
225 HRESULT hr = S_OK;
226 UINT er = ERROR_SUCCESS;
227
228 ICatalogCollection* piUsrInRoleColl = NULL;
229 ICatalogObject* piUsrInRoleObj = NULL;
230
231 PSID pSid = NULL;
232 long lChanges = 0;
233
234 // log
235 WcaLog(LOGMSG_VERBOSE, "Adding user to partition role, key: %S", pAttrs->pwzKey);
236
237 // get users in partition role collection
238 hr = CpiGetUsersInPartitionRoleCollection(pAttrs->pwzPartID, pAttrs->pwzRoleName, &piUsrInRoleColl);
239 if (S_FALSE == hr)
240 hr = HRESULT_FROM_WIN32(ERROR_NOT_FOUND);
241 ExitOnFailure(hr, "Failed to get users in partition role collection");
242
243 // get SID for account
244 do {
245 er = ERROR_SUCCESS;
246 hr = CpiAccountNameToSid(pAttrs->pwzAccount, &pSid);
247 if (HRESULT_FROM_WIN32(ERROR_NONE_MAPPED) == hr && !::MsiGetMode(WcaGetInstallHandle(), MSIRUNMODE_ROLLBACK))
248 {
249 WcaLog(LOGMSG_STANDARD, "Failed to lookup account name, hr: 0x%x, account: '%S'", hr, pAttrs->pwzAccount);
250 er = WcaErrorMessage(msierrComPlusFailedLookupNames, hr, INSTALLMESSAGE_ERROR | MB_ABORTRETRYIGNORE, 0);
251 switch (er)
252 {
253 case IDABORT:
254 ExitFunction(); // exit with error code from CpiAccountNameToSid()
255 case IDRETRY:
256 break;
257 case IDIGNORE:
258 default:
259 ExitFunction1(hr = S_OK);
260 }
261 }
262 else
263 ExitOnFailure(hr, "Failed to get SID for account");
264 } while (IDRETRY == er);
265
266 // find any existing entry
267 hr = CpiFindUserCollectionObject(piUsrInRoleColl, pSid, NULL);
268 if (HRESULT_FROM_WIN32(ERROR_NONE_MAPPED) == hr || HRESULT_FROM_WIN32(ERROR_SOME_NOT_MAPPED) == hr)
269 WcaLog(LOGMSG_STANDARD, "Failed to lookup account names, hr: 0x%x", hr);
270 else
271 ExitOnFailure(hr, "Failed to find user in partition role");
272
273 if (S_OK == hr)
274 {
275 WcaLog(LOGMSG_VERBOSE, "User already assigned to partition role, key: %S", pAttrs->pwzKey);
276 ExitFunction(); // exit with hr = S_OK
277 }
278
279 // convert SID back to account name
280 hr = CpiSidToAccountName(pSid, &pAttrs->pwzAccount);
281 ExitOnFailure(hr, "Failed to convert SID to account name");
282
283 // add user
284 hr = CpiAddCollectionObject(piUsrInRoleColl, &piUsrInRoleObj);
285 ExitOnFailure(hr, "Failed to add user in role to collection");
286
287 hr = CpiPutCollectionObjectValue(piUsrInRoleObj, L"User", pAttrs->pwzAccount);
288 ExitOnFailure(hr, "Failed to set role name property");
289
290 // save changes
291 hr = piUsrInRoleColl->SaveChanges(&lChanges);
292 if (COMADMIN_E_OBJECTERRORS == hr)
293 CpiLogCatalogErrorInfo();
294 ExitOnFailure(hr, "Failed to save changes");
295
296 // log
297 WcaLog(LOGMSG_VERBOSE, "%d changes saved to catalog, key: %S", lChanges, pAttrs->pwzKey);
298
299 hr = S_OK;
300
301LExit:
302 // clean up
303 ReleaseObject(piUsrInRoleColl);
304 ReleaseObject(piUsrInRoleObj);
305
306 if (pSid)
307 ::HeapFree(::GetProcessHeap(), 0, pSid);
308
309 return hr;
310}
311
312static HRESULT RemoveUserInPartitionRole(
313 CPI_USER_IN_PARTITION_ROLE_ATTRIBUTES* pAttrs
314 )
315{
316 HRESULT hr = S_OK;
317 UINT er = ERROR_SUCCESS;
318
319 ICatalogCollection* piUsrInRoleColl = NULL;
320
321 PSID pSid = NULL;
322 long lChanges = 0;
323
324 // log
325 WcaLog(LOGMSG_VERBOSE, "Removing user from partition role, key: %S", pAttrs->pwzKey);
326
327 // get users in partition role collection
328 hr = CpiGetUsersInPartitionRoleCollection(pAttrs->pwzPartID, pAttrs->pwzRoleName, &piUsrInRoleColl);
329 ExitOnFailure(hr, "Failed to get users in partition role collection");
330
331 if (S_FALSE == hr)
332 {
333 // users in role collection not found
334 WcaLog(LOGMSG_VERBOSE, "Unable to retrieve users in partition role collection, nothing to delete, key: %S", pAttrs->pwzKey);
335 ExitFunction1(hr = S_OK);
336 }
337
338 // get SID for account
339 do {
340 er = ERROR_SUCCESS;
341 hr = CpiAccountNameToSid(pAttrs->pwzAccount, &pSid);
342 if (HRESULT_FROM_WIN32(ERROR_NONE_MAPPED) == hr && !::MsiGetMode(WcaGetInstallHandle(), MSIRUNMODE_ROLLBACK))
343 {
344 WcaLog(LOGMSG_STANDARD, "Failed to lookup account name, hr: 0x%x, account: '%S'", hr, pAttrs->pwzAccount);
345 er = WcaErrorMessage(msierrComPlusFailedLookupNames, hr, INSTALLMESSAGE_ERROR | MB_ABORTRETRYIGNORE, 0);
346 switch (er)
347 {
348 case IDABORT:
349 ExitFunction(); // exit with error code from CpiAccountNameToSid()
350 case IDRETRY:
351 break;
352 case IDIGNORE:
353 default:
354 ExitFunction1(hr = S_OK);
355 }
356 }
357 else
358 ExitOnFailure(hr, "Failed to get SID for account");
359 } while (IDRETRY == er);
360
361 // remove
362 hr = CpiRemoveUserCollectionObject(piUsrInRoleColl, pSid);
363 if (HRESULT_FROM_WIN32(ERROR_NONE_MAPPED) == hr || HRESULT_FROM_WIN32(ERROR_SOME_NOT_MAPPED) == hr)
364 {
365 WcaLog(LOGMSG_STANDARD, "Failed to lookup account names, hr: 0x%x", hr);
366 hr = S_FALSE;
367 }
368 else
369 ExitOnFailure(hr, "Failed to remove user");
370
371 if (S_FALSE == hr)
372 {
373 // role not found
374 WcaLog(LOGMSG_VERBOSE, "User not found for partition role, nothing to delete, key: %S", pAttrs->pwzKey);
375 ExitFunction1(hr = S_OK);
376 }
377
378 // save changes
379 hr = piUsrInRoleColl->SaveChanges(&lChanges);
380 if (COMADMIN_E_OBJECTERRORS == hr)
381 CpiLogCatalogErrorInfo();
382 ExitOnFailure(hr, "Failed to save changes");
383
384 // log
385 WcaLog(LOGMSG_VERBOSE, "%d changes saved to catalog, key: %S", lChanges, pAttrs->pwzKey);
386
387 hr = S_OK;
388
389LExit:
390 // clean up
391 ReleaseObject(piUsrInRoleColl);
392
393 if (pSid)
394 ::HeapFree(::GetProcessHeap(), 0, pSid);
395
396 return hr;
397}
diff --git a/src/ext/ComPlus/ca/cppartroleexec.h b/src/ext/ComPlus/ca/cppartroleexec.h
new file mode 100644
index 00000000..0ec47dad
--- /dev/null
+++ b/src/ext/ComPlus/ca/cppartroleexec.h
@@ -0,0 +1,12 @@
1#pragma once
2// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
3
4
5HRESULT CpiConfigureUsersInPartitionRoles(
6 LPWSTR* ppwzData,
7 HANDLE hRollbackFile
8 );
9HRESULT CpiRollbackConfigureUsersInPartitionRoles(
10 LPWSTR* ppwzData,
11 CPI_ROLLBACK_DATA* pRollbackDataList
12 );
diff --git a/src/ext/ComPlus/ca/cppartrolesched.cpp b/src/ext/ComPlus/ca/cppartrolesched.cpp
new file mode 100644
index 00000000..a988f8e3
--- /dev/null
+++ b/src/ext/ComPlus/ca/cppartrolesched.cpp
@@ -0,0 +1,421 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3#include "precomp.h"
4
5
6// sql queries
7
8LPCWSTR vcsPartitionRoleQuery =
9 L"SELECT `PartitionRole`, `Partition_`, `Component_`, `Name` FROM `ComPlusPartitionRole`";
10enum ePartitionRoleQuery { prqPartitionRole = 1, prqPartition, prqComponent, prqName };
11
12LPCWSTR vcsUserInPartitionRoleQuery =
13 L"SELECT `UserInPartitionRole`, `PartitionRole_`, `ComPlusUserInPartitionRole`.`Component_`, `Domain`, `Name` FROM `ComPlusUserInPartitionRole`, `User` WHERE `User_` = `User`";
14LPCWSTR vcsGroupInPartitionRoleQuery =
15 L"SELECT `GroupInPartitionRole`, `PartitionRole_`, `ComPlusGroupInPartitionRole`.`Component_`, `Domain`, `Name` FROM `ComPlusGroupInPartitionRole`, `Group` WHERE `Group_` = `Group`";
16enum eTrusteeInPartitionRoleQuery { tiprqUserInPartitionRole = 1, tiprqPartitionRole, tiprqComponent, tiprqDomain, tiprqName };
17
18
19// prototypes for private helper functions
20
21static HRESULT TrusteesInPartitionRolesRead(
22 LPCWSTR pwzQuery,
23 CPI_PARTITION_ROLE_LIST* pPartRoleList,
24 CPI_USER_IN_PARTITION_ROLE_LIST* pUsrInPartRoleList
25 );
26static void FreePartitionRole(
27 CPI_PARTITION_ROLE* pItm
28 );
29static void FreeUserInPartitionRole(
30 CPI_USER_IN_PARTITION_ROLE* pItm
31 );
32static HRESULT AddUserInPartitionRoleToActionData(
33 CPI_USER_IN_PARTITION_ROLE* pItm,
34 int iActionType,
35 int iActionCost,
36 LPWSTR* ppwzActionData
37 );
38
39
40// function definitions
41
42void CpiPartitionRoleListFree(
43 CPI_PARTITION_ROLE_LIST* pList
44 )
45{
46 CPI_PARTITION_ROLE* pItm = pList->pFirst;
47
48 while (pItm)
49 {
50 CPI_PARTITION_ROLE* pDelete = pItm;
51 pItm = pItm->pNext;
52 FreePartitionRole(pDelete);
53 }
54}
55
56HRESULT CpiPartitionRolesRead(
57 CPI_PARTITION_LIST* pPartList,
58 CPI_PARTITION_ROLE_LIST* pPartRoleList
59 )
60{
61 HRESULT hr = S_OK;
62 PMSIHANDLE hView, hRec;
63 CPI_PARTITION_ROLE* pItm = NULL;
64 LPWSTR pwzData = NULL;
65
66 // loop through all application roles
67 hr = WcaOpenExecuteView(vcsPartitionRoleQuery, &hView);
68 ExitOnFailure(hr, "Failed to execute view on ComPlusPartitionRole table");
69
70 while (S_OK == (hr = WcaFetchRecord(hView, &hRec)))
71 {
72 // create entry
73 pItm = (CPI_PARTITION_ROLE*)::HeapAlloc(::GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(CPI_PARTITION_ROLE));
74 if (!pItm)
75 ExitFunction1(hr = E_OUTOFMEMORY);
76
77 // get key
78 hr = WcaGetRecordString(hRec, prqPartitionRole, &pwzData);
79 ExitOnFailure(hr, "Failed to get key");
80 StringCchCopyW(pItm->wzKey, countof(pItm->wzKey), pwzData);
81
82 // get partition
83 hr = WcaGetRecordString(hRec, prqPartition, &pwzData);
84 ExitOnFailure(hr, "Failed to get application");
85
86 hr = CpiPartitionFindByKey(pPartList, pwzData, &pItm->pPartition);
87 if (S_FALSE == hr)
88 hr = HRESULT_FROM_WIN32(ERROR_NOT_FOUND);
89 ExitOnFailure(hr, "Failed to find partition, key: %S", pwzData);
90
91 // get name
92 hr = WcaGetRecordFormattedString(hRec, prqName, &pwzData);
93 ExitOnFailure(hr, "Failed to get name");
94 StringCchCopyW(pItm->wzName, countof(pItm->wzName), pwzData);
95
96 // add entry
97 if (pPartRoleList->pFirst)
98 pItm->pNext = pPartRoleList->pFirst;
99 pPartRoleList->pFirst = pItm;
100 pItm = NULL;
101 }
102
103 if (E_NOMOREITEMS == hr)
104 hr = S_OK;
105
106LExit:
107 // clean up
108 if (pItm)
109 FreePartitionRole(pItm);
110
111 ReleaseStr(pwzData);
112
113 return hr;
114}
115
116HRESULT CpiPartitionRoleFindByKey(
117 CPI_PARTITION_ROLE_LIST* pList,
118 LPCWSTR pwzKey,
119 CPI_PARTITION_ROLE** ppPartRole
120 )
121{
122 for (CPI_PARTITION_ROLE* pItm = pList->pFirst; pItm; pItm = pItm->pNext)
123 {
124 if (0 == lstrcmpW(pItm->wzKey, pwzKey))
125 {
126 *ppPartRole = pItm;
127 return S_OK;
128 }
129 }
130
131 return E_FAIL;
132}
133
134void CpiUserInPartitionRoleListFree(
135 CPI_USER_IN_PARTITION_ROLE_LIST* pList
136 )
137{
138 CPI_USER_IN_PARTITION_ROLE* pItm = pList->pFirst;
139
140 while (pItm)
141 {
142 CPI_USER_IN_PARTITION_ROLE* pDelete = pItm;
143 pItm = pItm->pNext;
144 FreeUserInPartitionRole(pDelete);
145 }
146}
147
148HRESULT CpiUsersInPartitionRolesRead(
149 CPI_PARTITION_ROLE_LIST* pPartRoleList,
150 CPI_USER_IN_PARTITION_ROLE_LIST* pUsrInPartRoleList
151 )
152{
153 HRESULT hr = S_OK;
154
155 // read users in partition roles
156 if (CpiTableExists(cptComPlusUserInPartitionRole))
157 {
158 hr = TrusteesInPartitionRolesRead(vcsUserInPartitionRoleQuery, pPartRoleList, pUsrInPartRoleList);
159 ExitOnFailure(hr, "Failed to read users in partition roles");
160 }
161
162 // read groups in partition roles
163 if (CpiTableExists(cptComPlusGroupInPartitionRole))
164 {
165 hr = TrusteesInPartitionRolesRead(vcsGroupInPartitionRoleQuery, pPartRoleList, pUsrInPartRoleList);
166 ExitOnFailure(hr, "Failed to read groups in partition roles");
167 }
168
169 hr = S_OK;
170
171LExit:
172 return hr;
173}
174
175HRESULT CpiUsersInPartitionRolesInstall(
176 CPI_USER_IN_PARTITION_ROLE_LIST* pList,
177 int iRunMode,
178 LPWSTR* ppwzActionData,
179 int* piProgress
180 )
181{
182 HRESULT hr = S_OK;
183
184 int iActionType;
185
186 // add action text
187 hr = CpiAddActionTextToActionData(L"AddUsersToComPlusPartitionRoles", ppwzActionData);
188 ExitOnFailure(hr, "Failed to add action text to custom action data");
189
190 // add count to action data
191 hr = WcaWriteIntegerToCaData(pList->iInstallCount, ppwzActionData);
192 ExitOnFailure(hr, "Failed to add count to custom action data");
193
194 // add roles to custom action data
195 for (CPI_USER_IN_PARTITION_ROLE* pItm = pList->pFirst; pItm; pItm = pItm->pNext)
196 {
197 // roles that are being installed only
198 if (!WcaIsInstalling(pItm->isInstalled, pItm->isAction))
199 continue;
200
201 // action type
202 if (rmRollback == iRunMode)
203 {
204 if (CpiIsInstalled(pItm->isInstalled))
205 iActionType = atNoOp;
206 else
207 iActionType = atRemove;
208 }
209 else
210 iActionType = atCreate;
211
212 // add to action data
213 hr = AddUserInPartitionRoleToActionData(pItm, iActionType, COST_USER_IN_APPLICATION_ROLE_CREATE, ppwzActionData);
214 ExitOnFailure(hr, "Failed to add user in partition role to custom action data, key: %S", pItm->wzKey);
215 }
216
217 // add progress tics
218 if (piProgress)
219 *piProgress += COST_USER_IN_APPLICATION_ROLE_CREATE * pList->iInstallCount;
220
221 hr = S_OK;
222
223LExit:
224 return hr;
225}
226
227HRESULT CpiUsersInPartitionRolesUninstall(
228 CPI_USER_IN_PARTITION_ROLE_LIST* pList,
229 int iRunMode,
230 LPWSTR* ppwzActionData,
231 int* piProgress
232 )
233{
234 HRESULT hr = S_OK;
235
236 int iActionType;
237
238 // add action text
239 hr = CpiAddActionTextToActionData(L"RemoveUsersFromComPlusPartRoles", ppwzActionData);
240 ExitOnFailure(hr, "Failed to add action text to custom action data");
241
242 // add count to action data
243 hr = WcaWriteIntegerToCaData(pList->iUninstallCount, ppwzActionData);
244 ExitOnFailure(hr, "Failed to add count to custom action data");
245
246 // add roles to custom action data
247 for (CPI_USER_IN_PARTITION_ROLE* pItm = pList->pFirst; pItm; pItm = pItm->pNext)
248 {
249 // roles that are being uninstalled only
250 if (!WcaIsUninstalling(pItm->isInstalled, pItm->isAction))
251 continue;
252
253 // action type
254 if (rmRollback == iRunMode)
255 iActionType = atCreate;
256 else
257 iActionType = atRemove;
258
259 // add to action data
260 hr = AddUserInPartitionRoleToActionData(pItm, iActionType, COST_USER_IN_APPLICATION_ROLE_DELETE, ppwzActionData);
261 ExitOnFailure(hr, "Failed to add user in partition role to custom action data, key: %S", pItm->wzKey);
262 }
263
264 // add progress tics
265 if (piProgress)
266 *piProgress += COST_USER_IN_APPLICATION_ROLE_DELETE * pList->iUninstallCount;
267
268 hr = S_OK;
269
270LExit:
271 return hr;
272}
273
274
275// helper function definitions
276
277static HRESULT TrusteesInPartitionRolesRead(
278 LPCWSTR pwzQuery,
279 CPI_PARTITION_ROLE_LIST* pPartRoleList,
280 CPI_USER_IN_PARTITION_ROLE_LIST* pUsrInPartRoleList
281 )
282{
283 HRESULT hr = S_OK;
284 UINT er = ERROR_SUCCESS;
285
286 PMSIHANDLE hView, hRec;
287
288 CPI_USER_IN_PARTITION_ROLE* pItm = NULL;
289 LPWSTR pwzData = NULL;
290 LPWSTR pwzDomain = NULL;
291 LPWSTR pwzName = NULL;
292 BOOL fMatchingArchitecture = FALSE;
293
294 // loop through all application roles
295 hr = WcaOpenExecuteView(pwzQuery, &hView);
296 ExitOnFailure(hr, "Failed to execute view on table");
297
298 while (S_OK == (hr = WcaFetchRecord(hView, &hRec)))
299 {
300 // get component
301 hr = WcaGetRecordString(hRec, tiprqComponent, &pwzData);
302 ExitOnFailure(hr, "Failed to get component");
303
304 // check if the component is our processor architecture
305 hr = CpiVerifyComponentArchitecure(pwzData, &fMatchingArchitecture);
306 ExitOnFailure(hr, "Failed to get component architecture.");
307
308 if (!fMatchingArchitecture)
309 {
310 continue; // not the same architecture, ignore
311 }
312
313 // create entry
314 pItm = (CPI_USER_IN_PARTITION_ROLE*)::HeapAlloc(::GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(CPI_USER_IN_PARTITION_ROLE));
315 if (!pItm)
316 ExitFunction1(hr = E_OUTOFMEMORY);
317
318 // get component install state
319 er = ::MsiGetComponentStateW(WcaGetInstallHandle(), pwzData, &pItm->isInstalled, &pItm->isAction);
320 ExitOnFailure(hr = HRESULT_FROM_WIN32(er), "Failed to get component state");
321
322 // get key
323 hr = WcaGetRecordString(hRec, tiprqUserInPartitionRole, &pwzData);
324 ExitOnFailure(hr, "Failed to get key");
325 StringCchCopyW(pItm->wzKey, countof(pItm->wzKey), pwzData);
326
327 // get partition role
328 hr = WcaGetRecordString(hRec, tiprqPartitionRole, &pwzData);
329 ExitOnFailure(hr, "Failed to get partition role");
330
331 hr = CpiPartitionRoleFindByKey(pPartRoleList, pwzData, &pItm->pPartitionRole);
332 ExitOnFailure(hr, "Failed to find partition role, key: %S", pwzData);
333
334 // get user domain
335 hr = WcaGetRecordFormattedString(hRec, tiprqDomain, &pwzDomain);
336 ExitOnFailure(hr, "Failed to get domain");
337
338 // get user name
339 hr = WcaGetRecordFormattedString(hRec, tiprqName, &pwzName);
340 ExitOnFailure(hr, "Failed to get name");
341
342 // build account name
343 hr = CpiBuildAccountName(pwzDomain, pwzName, &pItm->pwzAccount);
344 ExitOnFailure(hr, "Failed to build account name");
345
346 // increment counters
347 if (WcaIsInstalling(pItm->isInstalled, pItm->isAction))
348 pUsrInPartRoleList->iInstallCount++;
349 if (WcaIsUninstalling(pItm->isInstalled, pItm->isAction))
350 pUsrInPartRoleList->iUninstallCount++;
351
352 // add entry
353 if (pUsrInPartRoleList->pFirst)
354 pItm->pNext = pUsrInPartRoleList->pFirst;
355 pUsrInPartRoleList->pFirst = pItm;
356 pItm = NULL;
357 }
358
359 if (E_NOMOREITEMS == hr)
360 hr = S_OK;
361
362LExit:
363 // clean up
364 if (pItm)
365 FreeUserInPartitionRole(pItm);
366
367 ReleaseStr(pwzData);
368 ReleaseStr(pwzDomain);
369 ReleaseStr(pwzName);
370
371 return hr;
372}
373
374static void FreePartitionRole(
375 CPI_PARTITION_ROLE* pItm
376 )
377{
378 ::HeapFree(::GetProcessHeap(), 0, pItm);
379}
380
381static void FreeUserInPartitionRole(
382 CPI_USER_IN_PARTITION_ROLE* pItm
383 )
384{
385 ReleaseStr(pItm->pwzAccount);
386
387 ::HeapFree(::GetProcessHeap(), 0, pItm);
388}
389
390static HRESULT AddUserInPartitionRoleToActionData(
391 CPI_USER_IN_PARTITION_ROLE* pItm,
392 int iActionType,
393 int iActionCost,
394 LPWSTR* ppwzActionData
395 )
396{
397 HRESULT hr = S_OK;
398
399 // add action information to custom action data
400 hr = WcaWriteIntegerToCaData(iActionType, ppwzActionData);
401 ExitOnFailure(hr, "Failed to add action type to custom action data");
402 hr = WcaWriteIntegerToCaData(iActionCost, ppwzActionData);
403 ExitOnFailure(hr, "Failed to add action cost to custom action data");
404
405 // add application role information to custom action data
406 hr = WcaWriteStringToCaData(pItm->wzKey, ppwzActionData);
407 ExitOnFailure(hr, "Failed to add key to custom action data");
408 hr = WcaWriteStringToCaData(pItm->pPartitionRole->wzName, ppwzActionData);
409 ExitOnFailure(hr, "Failed to add role name to custom action data");
410 hr = WcaWriteStringToCaData(pItm->pwzAccount, ppwzActionData);
411 ExitOnFailure(hr, "Failed to add user account to custom action data");
412
413 // add partition information to custom action data
414 hr = WcaWriteStringToCaData(pItm->pPartitionRole->pPartition->wzID, ppwzActionData);
415 ExitOnFailure(hr, "Failed to add partition id to custom action data");
416
417 hr = S_OK;
418
419LExit:
420 return hr;
421}
diff --git a/src/ext/ComPlus/ca/cppartrolesched.h b/src/ext/ComPlus/ca/cppartrolesched.h
new file mode 100644
index 00000000..ff1275d9
--- /dev/null
+++ b/src/ext/ComPlus/ca/cppartrolesched.h
@@ -0,0 +1,76 @@
1#pragma once
2// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
3
4
5struct CPI_PARTITION_ROLE
6{
7 WCHAR wzKey[MAX_DARWIN_KEY + 1];
8 WCHAR wzName[MAX_DARWIN_COLUMN + 1];
9
10 CPI_PARTITION* pPartition;
11
12 ICatalogCollection* piUsersColl;
13
14 CPI_PARTITION_ROLE* pNext;
15};
16
17struct CPI_PARTITION_ROLE_LIST
18{
19 CPI_PARTITION_ROLE* pFirst;
20};
21
22struct CPI_USER_IN_PARTITION_ROLE
23{
24 WCHAR wzKey[MAX_DARWIN_KEY + 1];
25 LPWSTR pwzAccount;
26
27 INSTALLSTATE isInstalled, isAction;
28
29 CPI_PARTITION_ROLE* pPartitionRole;
30
31 CPI_USER_IN_PARTITION_ROLE* pNext;
32};
33
34struct CPI_USER_IN_PARTITION_ROLE_LIST
35{
36 CPI_USER_IN_PARTITION_ROLE* pFirst;
37
38 int iInstallCount;
39 int iUninstallCount;
40};
41
42
43// function prototypes
44
45void CpiPartitionRoleListFree(
46 CPI_PARTITION_ROLE_LIST* pList
47 );
48HRESULT CpiPartitionRolesRead(
49 CPI_PARTITION_LIST* pPartList,
50 CPI_PARTITION_ROLE_LIST* pPartRoleList
51 );
52HRESULT CpiPartitionRoleFindByKey(
53 CPI_PARTITION_ROLE_LIST* pList,
54 LPCWSTR pwzKey,
55 CPI_PARTITION_ROLE** ppPartRole
56 );
57
58void CpiUserInPartitionRoleListFree(
59 CPI_USER_IN_PARTITION_ROLE_LIST* pList
60 );
61HRESULT CpiUsersInPartitionRolesRead(
62 CPI_PARTITION_ROLE_LIST* pPartRoleList,
63 CPI_USER_IN_PARTITION_ROLE_LIST* pUsrInPartRoleList
64 );
65HRESULT CpiUsersInPartitionRolesInstall(
66 CPI_USER_IN_PARTITION_ROLE_LIST* pList,
67 int iRunMode,
68 LPWSTR* ppwzActionData,
69 int* piProgress
70 );
71HRESULT CpiUsersInPartitionRolesUninstall(
72 CPI_USER_IN_PARTITION_ROLE_LIST* pList,
73 int iRunMode,
74 LPWSTR* ppwzActionData,
75 int* piProgress
76 );
diff --git a/src/ext/ComPlus/ca/cppartsched.cpp b/src/ext/ComPlus/ca/cppartsched.cpp
new file mode 100644
index 00000000..7cd98791
--- /dev/null
+++ b/src/ext/ComPlus/ca/cppartsched.cpp
@@ -0,0 +1,912 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3#include "precomp.h"
4
5
6// sql queries
7
8LPCWSTR vcsPartitionQuery =
9 L"SELECT `Partition`, `Component_`, `Id`, `Name` FROM `ComPlusPartition`";
10enum ePartitionQuery { pqPartition = 1, pqComponent, pqID, pqName };
11
12LPCWSTR vcsPartitionPropertyQuery =
13 L"SELECT `Name`, `Value` FROM `ComPlusPartitionProperty` WHERE `Partition_` = ?";
14
15LPCWSTR vcsPartitionUserQuery =
16 L"SELECT `PartitionUser`, `Partition_`, `ComPlusPartitionUser`.`Component_`, `Domain`, `Name` FROM `ComPlusPartitionUser`, `User` WHERE `User_` = `User`";
17enum ePartitionUserQuery { puqPartitionUser = 1, puqPartition, puqComponent, puqDomain, puqName };
18
19
20// property definitions
21
22CPI_PROPERTY_DEFINITION pdlPartitionProperties[] =
23{
24 {L"Changeable", cpptBoolean, 502},
25 {L"Deleteable", cpptBoolean, 502},
26 {L"Description", cpptString, 502},
27 {NULL, cpptNone, 0}
28};
29
30
31// prototypes for private helper functions
32
33static void FreePartition(
34 CPI_PARTITION* pItm
35 );
36static void FreePartitionUser(
37 CPI_PARTITION_USER* pItm
38 );
39static HRESULT AddPartitionToActionData(
40 CPI_PARTITION* pItm,
41 int iActionType,
42 int iActionCost,
43 LPWSTR* ppwzActionData
44 );
45static HRESULT AddPartitionUserToActionData(
46 CPI_PARTITION_USER* pItm,
47 int iActionType,
48 int iActionCost,
49 LPWSTR* ppwzActionData
50 );
51
52
53// function definitions
54
55void CpiPartitionListFree(
56 CPI_PARTITION_LIST* pList
57 )
58{
59 CPI_PARTITION* pItm = pList->pFirst;
60
61 while (pItm)
62 {
63 CPI_PARTITION* pDelete = pItm;
64 pItm = pItm->pNext;
65 FreePartition(pDelete);
66 }
67}
68
69HRESULT CpiPartitionsRead(
70 CPI_PARTITION_LIST* pPartList
71 )
72{
73 HRESULT hr = S_OK;
74 UINT er = ERROR_SUCCESS;
75
76 PMSIHANDLE hView, hRec;
77
78 CPI_PARTITION* pItm = NULL;
79 LPWSTR pwzData = NULL;
80 BOOL fMatchingArchitecture = FALSE;
81
82 // loop through all partitions
83 hr = WcaOpenExecuteView(vcsPartitionQuery, &hView);
84 ExitOnFailure(hr, "Failed to execute view on ComPlusPartition table");
85
86 while (S_OK == (hr = WcaFetchRecord(hView, &hRec)))
87 {
88 // get component
89 hr = WcaGetRecordString(hRec, pqComponent, &pwzData);
90 ExitOnFailure(hr, "Failed to get component");
91
92 // check if the component is our processor architecture
93 if (pwzData && *pwzData)
94 {
95 hr = CpiVerifyComponentArchitecure(pwzData, &fMatchingArchitecture);
96 ExitOnFailure(hr, "Failed to get component architecture.");
97
98 if (!fMatchingArchitecture)
99 {
100 continue; // not the same architecture, ignore
101 }
102 }
103
104 // create entry
105 pItm = (CPI_PARTITION*)::HeapAlloc(::GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(CPI_PARTITION));
106 if (!pItm)
107 ExitFunction1(hr = E_OUTOFMEMORY);
108
109 // get component install state
110 if (pwzData && *pwzData)
111 {
112 pItm->fHasComponent = TRUE;
113
114 er = ::MsiGetComponentStateW(WcaGetInstallHandle(), pwzData, &pItm->isInstalled, &pItm->isAction);
115 ExitOnFailure(hr = HRESULT_FROM_WIN32(er), "Failed to get component state");
116 }
117
118 // get key
119 hr = WcaGetRecordString(hRec, pqPartition, &pwzData);
120 ExitOnFailure(hr, "Failed to get key");
121 StringCchCopyW(pItm->wzKey, countof(pItm->wzKey), pwzData);
122
123 // get id
124 hr = WcaGetRecordFormattedString(hRec, pqID, &pwzData);
125 ExitOnFailure(hr, "Failed to get id");
126
127 if (pwzData && *pwzData)
128 {
129 hr = PcaGuidToRegFormat(pwzData, pItm->wzID, countof(pItm->wzID));
130 ExitOnFailure(hr, "Failed to parse id guid value, key: %S, value: '%S'", pItm->wzKey, pwzData);
131 }
132
133 // get name
134 hr = WcaGetRecordFormattedString(hRec, pqName, &pwzData);
135 ExitOnFailure(hr, "Failed to get name");
136 StringCchCopyW(pItm->wzName, countof(pItm->wzName), pwzData);
137
138 // if partition is a locater, either an id or a name must be provided
139 if (!pItm->fHasComponent && !*pItm->wzID && !*pItm->wzName)
140 ExitOnFailure(hr = E_FAIL, "A partition locater must have either an id or a name associated, key: %S", pItm->wzKey);
141
142 // if partition is not a locater, an name must be provided
143 if (pItm->fHasComponent && !*pItm->wzName)
144 ExitOnFailure(hr = E_FAIL, "A partition must have a name associated, key: %S", pItm->wzKey);
145
146 // get properties
147 if (CpiTableExists(cptComPlusPartitionProperty) && pItm->fHasComponent)
148 {
149 hr = CpiPropertiesRead(vcsPartitionPropertyQuery, pItm->wzKey, pdlPartitionProperties, &pItm->pProperties, &pItm->iPropertyCount);
150 ExitOnFailure(hr, "Failed to get properties");
151 }
152
153 // increment counters
154 if (pItm->fHasComponent && WcaIsInstalling(pItm->isInstalled, pItm->isAction))
155 pPartList->iInstallCount++;
156 if (pItm->fHasComponent && WcaIsUninstalling(pItm->isInstalled, pItm->isAction))
157 pPartList->iUninstallCount++;
158
159 // add entry
160 if (pPartList->pFirst)
161 pItm->pNext = pPartList->pFirst;
162 pPartList->pFirst = pItm;
163 pItm = NULL;
164 }
165
166 if (E_NOMOREITEMS == hr)
167 hr = S_OK;
168
169LExit:
170 // clean up
171 if (pItm)
172 FreePartition(pItm);
173
174 ReleaseStr(pwzData);
175
176 return hr;
177}
178
179HRESULT CpiPartitionsVerifyInstall(
180 CPI_PARTITION_LIST* pList
181 )
182{
183 HRESULT hr = S_OK;
184 UINT er = ERROR_SUCCESS;
185
186 ICatalogCollection* piPartColl = NULL;
187 ICatalogObject* piPartObj = NULL;
188
189 for (CPI_PARTITION* pItm = pList->pFirst; pItm; pItm = pItm->pNext)
190 {
191 // referenced locaters or partitions that are being installed
192 if (!pItm->fReferencedForInstall && !(pItm->fHasComponent && WcaIsInstalling(pItm->isInstalled, pItm->isAction)))
193 continue;
194
195 // if the partition is referensed and is not a locater, it must be installed
196 if (pItm->fReferencedForInstall && pItm->fHasComponent && !CpiWillBeInstalled(pItm->isInstalled, pItm->isAction))
197 MessageExitOnFailure(hr = E_FAIL, msierrComPlusPartitionDependency, "A partition is used by another entity being installed, but is not installed itself, key: %S", pItm->wzKey);
198
199 // get partitions collection
200 if (!piPartColl)
201 {
202 hr = CpiSchedGetPartitionsCollection(&piPartColl);
203 ExitOnFailure(hr, "Failed to get partitions collection");
204 }
205
206 // partition is supposed to exist
207 if (!pItm->fHasComponent || CpiIsInstalled(pItm->isInstalled))
208 {
209 // get collection object for partition
210 hr = CpiFindCollectionObject(piPartColl, pItm->wzID, *pItm->wzID ? NULL : pItm->wzName, &piPartObj);
211 ExitOnFailure(hr, "Failed to find collection object for partition");
212
213 // if the partition was found
214 if (S_OK == hr)
215 {
216 // if we don't have an id, copy id from object
217 if (!*pItm->wzID)
218 {
219 hr = CpiGetKeyForObject(piPartObj, pItm->wzID, countof(pItm->wzID));
220 ExitOnFailure(hr, "Failed to get id");
221 }
222 }
223
224 // if the partition was not found
225 else
226 {
227 // if the application is a locater, this is an error
228 if (!pItm->fHasComponent)
229 MessageExitOnFailure(hr = HRESULT_FROM_WIN32(ERROR_NOT_FOUND), msierrComPlusPartitionNotFound, "A partition required by this installation was not found, key: %S", pItm->wzKey);
230
231 // create a new id if one is missing
232 if (!*pItm->wzID)
233 {
234 hr = CpiCreateId(pItm->wzID, countof(pItm->wzID));
235 ExitOnFailure(hr, "Failed to create id");
236 }
237 }
238 }
239
240 // partition is supposed to be created
241 else
242 {
243 // check for conflicts
244 do {
245 if (*pItm->wzID)
246 {
247 // find partitions with conflicting id
248 hr = CpiFindCollectionObject(piPartColl, pItm->wzID, NULL, &piPartObj);
249 ExitOnFailure(hr, "Failed to find collection object for partition");
250
251 if (S_FALSE == hr)
252 {
253 // find partitions with conflicting name
254 hr = CpiFindCollectionObject(piPartColl, NULL, pItm->wzName, &piPartObj);
255 ExitOnFailure(hr, "Failed to find collection object for partition");
256
257 if (S_OK == hr)
258 // "A partition with a conflictiong name exists. retry cancel"
259 er = WcaErrorMessage(msierrComPlusPartitionNameConflict, hr, INSTALLMESSAGE_ERROR | MB_RETRYCANCEL, 0);
260 else
261 break; // no conflicting entry found, break loop
262 }
263 else
264 // "A partition with a conflicting id exists. abort retry ignore"
265 er = WcaErrorMessage(msierrComPlusPartitionIdConflict, hr, INSTALLMESSAGE_ERROR | MB_ABORTRETRYIGNORE, 0);
266 }
267 else
268 {
269 // find partitions with conflicting name
270 hr = CpiFindCollectionObject(piPartColl, NULL, pItm->wzName, &piPartObj);
271 ExitOnFailure(hr, "Failed to find collection object for partition");
272
273 if (S_OK == hr)
274 // "A partition with a conflictiong name exists. abort retry ignore"
275 er = WcaErrorMessage(msierrComPlusPartitionNameConflict, hr, INSTALLMESSAGE_ERROR | MB_ABORTRETRYIGNORE, 0);
276 else
277 break; // no conflicting entry found, break loop
278 }
279
280 switch (er)
281 {
282 case IDCANCEL:
283 case IDABORT:
284 ExitOnFailure(hr = E_FAIL, "A partition with a conflictiong name or id exists, key: %S", pItm->wzKey);
285 break;
286 case IDRETRY:
287 break;
288 case IDIGNORE:
289 default:
290 // if we don't have an id, copy id from object
291 if (!*pItm->wzID)
292 {
293 hr = CpiGetKeyForObject(piPartObj, pItm->wzID, countof(pItm->wzID));
294 ExitOnFailure(hr, "Failed to get id");
295 }
296 hr = S_FALSE; // indicate that this is not a conflict
297 }
298 } while (S_OK == hr); // hr = S_FALSE if we don't have any conflicts
299
300 // create a new id if one is missing
301 if (!*pItm->wzID)
302 {
303 hr = CpiCreateId(pItm->wzID, countof(pItm->wzID));
304 ExitOnFailure(hr, "Failed to create id");
305 }
306 }
307
308 // clean up
309 ReleaseNullObject(piPartObj);
310 }
311
312 hr = S_OK;
313
314LExit:
315 // clean up
316 ReleaseObject(piPartColl);
317 ReleaseObject(piPartObj);
318
319 return hr;
320}
321
322HRESULT CpiPartitionsVerifyUninstall(
323 CPI_PARTITION_LIST* pList
324 )
325{
326 HRESULT hr = S_OK;
327 ICatalogCollection* piPartColl = NULL;
328 ICatalogObject* piPartObj = NULL;
329
330 for (CPI_PARTITION* pItm = pList->pFirst; pItm; pItm = pItm->pNext)
331 {
332 // referenced locaters or partitions that are being uninstalled
333 if (!pItm->fReferencedForUninstall && !(pItm->fHasComponent && WcaIsUninstalling(pItm->isInstalled, pItm->isAction)))
334 continue;
335
336 // get partitions collection
337 if (!piPartColl)
338 {
339 hr = CpiSchedGetPartitionsCollection(&piPartColl);
340 ExitOnFailure(hr, "Failed to get partitions collection");
341 }
342
343 // get collection object for partition
344 hr = CpiFindCollectionObject(piPartColl, pItm->wzID, *pItm->wzID ? NULL : pItm->wzName, &piPartObj);
345 ExitOnFailure(hr, "Failed to find collection object for partition");
346
347 // if the partition was found
348 if (S_OK == hr)
349 {
350 // if we don't have an id, copy id from object
351 if (!*pItm->wzID)
352 {
353 hr = CpiGetKeyForObject(piPartObj, pItm->wzID, countof(pItm->wzID));
354 ExitOnFailure(hr, "Failed to get id");
355 }
356 }
357
358 // if the partition was not found
359 else
360 {
361 pItm->fObjectNotFound = TRUE;
362 if (pItm->fHasComponent)
363 pList->iUninstallCount--; // elements with the fObjectNotFound flag set will not be scheduled for uninstall
364 }
365
366 // clean up
367 ReleaseNullObject(piPartObj);
368 }
369
370 hr = S_OK;
371
372LExit:
373 // clean up
374 ReleaseObject(piPartColl);
375 ReleaseObject(piPartObj);
376
377 return hr;
378}
379
380void CpiPartitionAddReferenceInstall(
381 CPI_PARTITION* pItm
382 )
383{
384 pItm->fReferencedForInstall = TRUE;
385}
386
387void CpiPartitionAddReferenceUninstall(
388 CPI_PARTITION* pItm
389 )
390{
391 pItm->fReferencedForUninstall = TRUE;
392}
393
394HRESULT CpiPartitionsInstall(
395 CPI_PARTITION_LIST* pList,
396 int iRunMode,
397 LPWSTR* ppwzActionData,
398 int* piProgress
399 )
400{
401 HRESULT hr = S_OK;
402
403 int iActionType;
404
405 // add action text
406 hr = CpiAddActionTextToActionData(L"CreateComPlusPartitions", ppwzActionData);
407 ExitOnFailure(hr, "Failed to add action text to custom action data");
408
409 // add partition count to action data
410 hr = WcaWriteIntegerToCaData(pList->iInstallCount, ppwzActionData);
411 ExitOnFailure(hr, "Failed to add count to custom action data");
412
413 // add applications to custom action data
414 for (CPI_PARTITION* pItm = pList->pFirst; pItm; pItm = pItm->pNext)
415 {
416 // partitions that are being installed only
417 if (!pItm->fHasComponent || !WcaIsInstalling(pItm->isInstalled, pItm->isAction))
418 continue;
419
420 // action type
421 if (rmRollback == iRunMode)
422 {
423 if (CpiIsInstalled(pItm->isInstalled))
424 iActionType = atNoOp;
425 else
426 iActionType = atRemove;
427 }
428 else
429 iActionType = atCreate;
430
431 // add to action data
432 hr = AddPartitionToActionData(pItm, iActionType, COST_PARTITION_CREATE, ppwzActionData);
433 ExitOnFailure(hr, "Failed to add partition to custom action data, key: %S", pItm->wzKey);
434 }
435
436 // add progress tics
437 if (piProgress)
438 *piProgress += COST_PARTITION_CREATE * pList->iInstallCount;
439
440 hr = S_OK;
441
442LExit:
443 return hr;
444}
445
446HRESULT CpiPartitionsUninstall(
447 CPI_PARTITION_LIST* pList,
448 int iRunMode,
449 LPWSTR* ppwzActionData,
450 int* piProgress
451 )
452{
453 HRESULT hr = S_OK;
454
455 int iActionType;
456
457 // add action text
458 hr = CpiAddActionTextToActionData(L"RemoveComPlusPartitions", ppwzActionData);
459 ExitOnFailure(hr, "Failed to add action text to custom action data");
460
461 // add partition count to action data
462 hr = WcaWriteIntegerToCaData(pList->iUninstallCount, ppwzActionData);
463 ExitOnFailure(hr, "Failed to add count to custom action data");
464
465 // add partitions to custom action data
466 for (CPI_PARTITION* pItm = pList->pFirst; pItm; pItm = pItm->pNext)
467 {
468 // partitions that are being uninstalled only
469 if (!pItm->fHasComponent || pItm->fObjectNotFound || !WcaIsUninstalling(pItm->isInstalled, pItm->isAction))
470 continue;
471
472 // action type
473 if (rmRollback == iRunMode)
474 iActionType = atCreate;
475 else
476 iActionType = atRemove;
477
478 // add to action data
479 hr = AddPartitionToActionData(pItm, iActionType, COST_PARTITION_DELETE, ppwzActionData);
480 ExitOnFailure(hr, "Failed to add partition to custom action data, key:", pItm->wzKey);
481 }
482
483 // add progress tics
484 if (piProgress)
485 *piProgress += COST_PARTITION_DELETE * pList->iUninstallCount;
486
487 hr = S_OK;
488
489LExit:
490 return hr;
491}
492
493HRESULT CpiPartitionFindByKey(
494 CPI_PARTITION_LIST* pList,
495 LPCWSTR wzKey,
496 CPI_PARTITION** ppItm
497 )
498{
499 for (CPI_PARTITION* pItm = pList->pFirst; pItm; pItm = pItm->pNext)
500 {
501 if (0 == lstrcmpW(pItm->wzKey, wzKey))
502 {
503 *ppItm = pItm;
504 return S_OK;
505 }
506 }
507
508 return S_FALSE;
509}
510
511HRESULT CpiGetApplicationsCollForPartition(
512 CPI_PARTITION* pPart,
513 ICatalogCollection** ppiAppColl
514 )
515{
516 HRESULT hr = S_OK;
517
518 ICatalogCollection* piPartColl = NULL;
519 ICatalogObject* piPartObj = NULL;
520
521 // if a previous attempt to locate the collection object failed
522 if (pPart->fObjectNotFound)
523 ExitFunction1(hr = S_FALSE);
524
525 // get applications collection
526 if (!pPart->piApplicationsColl)
527 {
528 // get partitions collection from catalog
529 hr = CpiSchedGetPartitionsCollection(&piPartColl);
530 ExitOnFailure(hr, "Failed to get partitions collection");
531
532 // find application object
533 hr = CpiFindCollectionObject(piPartColl, pPart->wzID, *pPart->wzID ? NULL : pPart->wzName, &piPartObj);
534 ExitOnFailure(hr, "Failed to find partition object");
535
536 if (S_FALSE == hr)
537 {
538 pPart->fObjectNotFound = TRUE;
539 ExitFunction(); // exit with hr = S_FALSE
540 }
541
542 // get roles collection
543 hr = CpiSchedGetCatalogCollection(piPartColl, piPartObj, L"Applications", &pPart->piApplicationsColl);
544 ExitOnFailure(hr, "Failed to get applications collection");
545 }
546
547 // return value
548 *ppiAppColl = pPart->piApplicationsColl;
549 (*ppiAppColl)->AddRef();
550
551 hr = S_OK;
552
553LExit:
554 // clean up
555 ReleaseObject(piPartColl);
556 ReleaseObject(piPartObj);
557
558 return hr;
559}
560
561HRESULT CpiGetRolesCollForPartition(
562 CPI_PARTITION* pPart,
563 ICatalogCollection** ppiRolesColl
564 )
565{
566 HRESULT hr = S_OK;
567
568 ICatalogCollection* piPartColl = NULL;
569 ICatalogObject* piPartObj = NULL;
570
571 // if a previous attempt to locate the collection object failed
572 if (pPart->fObjectNotFound)
573 ExitFunction1(hr = S_FALSE);
574
575 // get applications collection
576 if (!pPart->piRolesColl)
577 {
578 // get partitions collection from catalog
579 hr = CpiSchedGetPartitionsCollection(&piPartColl);
580 ExitOnFailure(hr, "Failed to get partitions collection");
581
582 // find partition object
583 hr = CpiFindCollectionObject(piPartColl, pPart->wzID, *pPart->wzID ? NULL : pPart->wzName, &piPartObj);
584 ExitOnFailure(hr, "Failed to find partition object");
585
586 if (S_FALSE == hr)
587 ExitFunction(); // exit with hr = S_FALSE
588
589 // get roles collection
590 hr = CpiSchedGetCatalogCollection(piPartColl, piPartObj, L"RolesForPartition", &pPart->piRolesColl);
591 ExitOnFailure(hr, "Failed to get roles collection");
592 }
593
594 // return value
595 *ppiRolesColl = pPart->piRolesColl;
596 (*ppiRolesColl)->AddRef();
597
598 hr = S_OK;
599
600LExit:
601 // clean up
602 ReleaseObject(piPartColl);
603 ReleaseObject(piPartObj);
604
605 return hr;
606}
607
608void CpiPartitionUserListFree(
609 CPI_PARTITION_USER_LIST* pList
610 )
611{
612 CPI_PARTITION_USER* pItm = pList->pFirst;
613
614 while (pItm)
615 {
616 CPI_PARTITION_USER* pDelete = pItm;
617 pItm = pItm->pNext;
618 FreePartitionUser(pDelete);
619 }
620}
621
622HRESULT CpiPartitionUsersRead(
623 CPI_PARTITION_LIST* pPartList,
624 CPI_PARTITION_USER_LIST* pPartUsrList
625 )
626{
627 HRESULT hr = S_OK;
628 UINT er = ERROR_SUCCESS;
629
630 PMSIHANDLE hView, hRec;
631
632 CPI_PARTITION_USER* pItm = NULL;
633 LPWSTR pwzData = NULL;
634 LPWSTR pwzDomain = NULL;
635 LPWSTR pwzName = NULL;
636 BOOL fMatchingArchitecture = FALSE;
637
638 // loop through all partition users
639 hr = WcaOpenExecuteView(vcsPartitionUserQuery, &hView);
640 ExitOnFailure(hr, "Failed to execute view on ComPlusPartitionUser table");
641
642 while (S_OK == (hr = WcaFetchRecord(hView, &hRec)))
643 {
644 // get component
645 hr = WcaGetRecordString(hRec, puqComponent, &pwzData);
646 ExitOnFailure(hr, "Failed to get component");
647
648 // check if the component is our processor architecture
649 hr = CpiVerifyComponentArchitecure(pwzData, &fMatchingArchitecture);
650 ExitOnFailure(hr, "Failed to get component architecture.");
651
652 if (!fMatchingArchitecture)
653 {
654 continue; // not the same architecture, ignore
655 }
656
657 // create entry
658 pItm = (CPI_PARTITION_USER*)::HeapAlloc(::GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(CPI_PARTITION_USER));
659 if (!pItm)
660 ExitFunction1(hr = E_OUTOFMEMORY);
661
662 // get component install state
663 er = ::MsiGetComponentStateW(WcaGetInstallHandle(), pwzData, &pItm->isInstalled, &pItm->isAction);
664 ExitOnFailure(hr = HRESULT_FROM_WIN32(er), "Failed to get component state");
665
666 // get key
667 hr = WcaGetRecordString(hRec, puqPartitionUser, &pwzData);
668 ExitOnFailure(hr, "Failed to get key");
669 StringCchCopyW(pItm->wzKey, countof(pItm->wzKey), pwzData);
670
671 // get partition
672 hr = WcaGetRecordString(hRec, puqPartition, &pwzData);
673 ExitOnFailure(hr, "Failed to get partition");
674
675 hr = CpiPartitionFindByKey(pPartList, pwzData, &pItm->pPartition);
676 if (S_FALSE == hr)
677 hr = HRESULT_FROM_WIN32(ERROR_NOT_FOUND);
678 ExitOnFailure(hr, "Failed to find partition, key: %S", pwzData);
679
680 // get user domain
681 hr = WcaGetRecordFormattedString(hRec, puqDomain, &pwzDomain);
682 ExitOnFailure(hr, "Failed to get user domain");
683
684 // get user name
685 hr = WcaGetRecordFormattedString(hRec, puqName, &pwzName);
686 ExitOnFailure(hr, "Failed to get user name");
687
688 // build account name
689 hr = CpiBuildAccountName(pwzDomain, pwzName, &pItm->pwzAccount);
690 ExitOnFailure(hr, "Failed to build account name");
691
692 // set references & increment counters
693 if (WcaIsInstalling(pItm->isInstalled, pItm->isAction))
694 {
695 pItm->pPartition->fReferencedForInstall = TRUE;
696 pPartUsrList->iInstallCount++;
697 }
698 if (WcaIsUninstalling(pItm->isInstalled, pItm->isAction))
699 {
700 pItm->pPartition->fReferencedForUninstall = TRUE;
701 pPartUsrList->iUninstallCount++;
702 }
703
704 // add entry
705 if (pPartUsrList->pFirst)
706 pItm->pNext = pPartUsrList->pFirst;
707 pPartUsrList->pFirst = pItm;
708 pItm = NULL;
709 }
710
711 if (E_NOMOREITEMS == hr)
712 hr = S_OK;
713
714LExit:
715 // clean up
716 if (pItm)
717 FreePartitionUser(pItm);
718
719 ReleaseStr(pwzData);
720 ReleaseStr(pwzDomain);
721 ReleaseStr(pwzName);
722
723 return hr;
724}
725
726HRESULT CpiPartitionUsersInstall(
727 CPI_PARTITION_USER_LIST* pList,
728 int iRunMode,
729 LPWSTR* ppwzActionData,
730 int* piProgress
731 )
732{
733 HRESULT hr = S_OK;
734
735 int iActionType;
736
737 // add action text
738 hr = CpiAddActionTextToActionData(L"AddComPlusPartitionUsers", ppwzActionData);
739 ExitOnFailure(hr, "Failed to add action text to custom action data");
740
741 // add partition count to action data
742 hr = WcaWriteIntegerToCaData(pList->iInstallCount, ppwzActionData);
743 ExitOnFailure(hr, "Failed to add count to custom action data");
744
745 // add applications to custom action data
746 for (CPI_PARTITION_USER* pItm = pList->pFirst; pItm; pItm = pItm->pNext)
747 {
748 // partitions that are being installed only
749 if (!WcaIsInstalling(pItm->isInstalled, pItm->isAction))
750 continue;
751
752 // action type
753 if (rmRollback == iRunMode)
754 {
755 if (CpiIsInstalled(pItm->isInstalled))
756 iActionType = atNoOp;
757 else
758 iActionType = atRemove;
759 }
760 else
761 iActionType = atCreate;
762
763 // add to action data
764 hr = AddPartitionUserToActionData(pItm, iActionType, COST_PARTITION_USER_CREATE, ppwzActionData);
765 ExitOnFailure(hr, "Failed to add partition user to custom action data, key: %S", pItm->wzKey);
766 }
767
768 // add progress tics
769 if (piProgress)
770 *piProgress += COST_PARTITION_USER_CREATE * pList->iInstallCount;
771
772 hr = S_OK;
773
774LExit:
775 return hr;
776}
777
778HRESULT CpiPartitionUsersUninstall(
779 CPI_PARTITION_USER_LIST* pList,
780 int iRunMode,
781 LPWSTR* ppwzActionData,
782 int* piProgress
783 )
784{
785 HRESULT hr = S_OK;
786
787 int iActionType;
788
789 // add action text
790 hr = CpiAddActionTextToActionData(L"RemoveComPlusPartitionUsers", ppwzActionData);
791 ExitOnFailure(hr, "Failed to add action text to custom action data");
792
793 // add partition count to action data
794 hr = WcaWriteIntegerToCaData(pList->iUninstallCount, ppwzActionData);
795 ExitOnFailure(hr, "Failed to add count to custom action data");
796
797 // add partitions to custom action data
798 for (CPI_PARTITION_USER* pItm = pList->pFirst; pItm; pItm = pItm->pNext)
799 {
800 // partitions that are being uninstalled only
801 if (!WcaIsUninstalling(pItm->isInstalled, pItm->isAction))
802 continue;
803
804 // action type
805 if (rmRollback == iRunMode)
806 iActionType = atCreate;
807 else
808 iActionType = atRemove;
809
810 // add to action data
811 hr = AddPartitionUserToActionData(pItm, iActionType, COST_PARTITION_USER_DELETE, ppwzActionData);
812 ExitOnFailure(hr, "Failed to add partition user to custom action data, key: %S", pItm->wzKey);
813 }
814
815 // add progress tics
816 if (piProgress)
817 *piProgress += COST_PARTITION_USER_DELETE * pList->iUninstallCount;
818
819 hr = S_OK;
820
821LExit:
822 return hr;
823}
824
825
826// helper function definitions
827
828static void FreePartition(
829 CPI_PARTITION* pItm
830 )
831{
832 if (pItm->pProperties)
833 CpiPropertiesFreeList(pItm->pProperties);
834
835 ReleaseObject(pItm->piApplicationsColl);
836 ReleaseObject(pItm->piRolesColl);
837
838 ::HeapFree(::GetProcessHeap(), 0, pItm);
839}
840
841static void FreePartitionUser(
842 CPI_PARTITION_USER* pItm
843 )
844{
845 ReleaseStr(pItm->pwzAccount);
846
847 ::HeapFree(::GetProcessHeap(), 0, pItm);
848}
849
850static HRESULT AddPartitionToActionData(
851 CPI_PARTITION* pItm,
852 int iActionType,
853 int iActionCost,
854 LPWSTR* ppwzActionData
855 )
856{
857 HRESULT hr = S_OK;
858
859 // add action information to custom action data
860 hr = WcaWriteIntegerToCaData(iActionType, ppwzActionData);
861 ExitOnFailure(hr, "Failed to add action type to custom action data");
862 hr = WcaWriteIntegerToCaData(iActionCost, ppwzActionData);
863 ExitOnFailure(hr, "Failed to add action cost to custom action data");
864
865 // add partition information to custom action data
866 hr = WcaWriteStringToCaData(pItm->wzKey, ppwzActionData);
867 ExitOnFailure(hr, "Failed to add partition key to custom action data");
868 hr = WcaWriteStringToCaData(pItm->wzID, ppwzActionData);
869 ExitOnFailure(hr, "Failed to add partition id to custom action data");
870 hr = WcaWriteStringToCaData(pItm->wzName, ppwzActionData);
871 ExitOnFailure(hr, "Failed to add partition name to custom action data");
872
873 // add properties to custom action data
874 hr = CpiAddPropertiesToActionData(atCreate == iActionType ? pItm->iPropertyCount : 0, pItm->pProperties, ppwzActionData);
875 ExitOnFailure(hr, "Failed to add properties to custom action data");
876
877 hr = S_OK;
878
879LExit:
880 return hr;
881}
882
883static HRESULT AddPartitionUserToActionData(
884 CPI_PARTITION_USER* pItm,
885 int iActionType,
886 int iActionCost,
887 LPWSTR* ppwzActionData
888 )
889{
890 HRESULT hr = S_OK;
891
892 // add action information to custom action data
893 hr = WcaWriteIntegerToCaData(iActionType, ppwzActionData);
894 ExitOnFailure(hr, "Failed to add action type to custom action data");
895 hr = WcaWriteIntegerToCaData(iActionCost, ppwzActionData);
896 ExitOnFailure(hr, "Failed to add action cost to custom action data");
897
898 // add partition user information to custom action data
899 hr = WcaWriteStringToCaData(pItm->wzKey, ppwzActionData);
900 ExitOnFailure(hr, "Failed to add partition user key to custom action data");
901 hr = WcaWriteStringToCaData(pItm->pwzAccount, ppwzActionData);
902 ExitOnFailure(hr, "Failed to add user account to custom action data");
903
904 // add partition information to custom action data
905 hr = WcaWriteStringToCaData(atCreate == iActionType ? pItm->pPartition->wzID : L"", ppwzActionData);
906 ExitOnFailure(hr, "Failed to add partition id to custom action data");
907
908 hr = S_OK;
909
910LExit:
911 return hr;
912}
diff --git a/src/ext/ComPlus/ca/cppartsched.h b/src/ext/ComPlus/ca/cppartsched.h
new file mode 100644
index 00000000..55085912
--- /dev/null
+++ b/src/ext/ComPlus/ca/cppartsched.h
@@ -0,0 +1,125 @@
1#pragma once
2// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
3
4
5struct CPI_PARTITION
6{
7 WCHAR wzKey[MAX_DARWIN_KEY + 1];
8 WCHAR wzID[CPI_MAX_GUID + 1];
9 WCHAR wzName[MAX_DARWIN_COLUMN + 1];
10
11 int iPropertyCount;
12 CPI_PROPERTY* pProperties;
13
14 BOOL fHasComponent;
15 BOOL fReferencedForInstall;
16 BOOL fReferencedForUninstall;
17 BOOL fObjectNotFound;
18
19 INSTALLSTATE isInstalled, isAction;
20
21 ICatalogCollection* piApplicationsColl;
22 ICatalogCollection* piRolesColl;
23
24 CPI_PARTITION* pNext;
25};
26
27struct CPI_PARTITION_LIST
28{
29 CPI_PARTITION* pFirst;
30
31 int iInstallCount;
32 int iUninstallCount;
33};
34
35struct CPI_PARTITION_USER
36{
37 WCHAR wzKey[MAX_DARWIN_KEY + 1];
38 LPWSTR pwzAccount;
39
40 BOOL fNoFind;
41
42 INSTALLSTATE isInstalled, isAction;
43
44 CPI_PARTITION* pPartition;
45
46 CPI_PARTITION_USER* pNext;
47};
48
49struct CPI_PARTITION_USER_LIST
50{
51 CPI_PARTITION_USER* pFirst;
52
53 int iInstallCount;
54 int iUninstallCount;
55};
56
57
58// function prototypes
59
60void CpiPartitionListFree(
61 CPI_PARTITION_LIST* pList
62 );
63HRESULT CpiPartitionsRead(
64 CPI_PARTITION_LIST* pPartList
65 );
66HRESULT CpiPartitionsVerifyInstall(
67 CPI_PARTITION_LIST* pList
68 );
69HRESULT CpiPartitionsVerifyUninstall(
70 CPI_PARTITION_LIST* pList
71 );
72void CpiPartitionAddReferenceInstall(
73 CPI_PARTITION* pItm
74 );
75void CpiPartitionAddReferenceUninstall(
76 CPI_PARTITION* pItm
77 );
78HRESULT CpiPartitionsInstall(
79 CPI_PARTITION_LIST* pList,
80 int iRunMode,
81 LPWSTR* ppwzActionData,
82 int* piProgress
83 );
84HRESULT CpiPartitionsUninstall(
85 CPI_PARTITION_LIST* pList,
86 int iRunMode,
87 LPWSTR* ppwzActionData,
88 int* piProgress
89 );
90HRESULT CpiPartitionFindByKey(
91 CPI_PARTITION_LIST* pList,
92 LPCWSTR wzKey,
93 CPI_PARTITION** ppItm
94 );
95HRESULT CpiGetApplicationsCollForPartition(
96 CPI_PARTITION* pPart,
97 ICatalogCollection** ppiAppColl
98 );
99HRESULT CpiGetPartitionUsersCollection(
100 CPI_PARTITION* pPart,
101 ICatalogCollection** ppiPartUsrColl
102 );
103HRESULT CpiGetRolesCollForPartition(
104 CPI_PARTITION* pPart,
105 ICatalogCollection** ppiRolesColl
106 );
107void CpiPartitionUserListFree(
108 CPI_PARTITION_USER_LIST* pList
109 );
110HRESULT CpiPartitionUsersRead(
111 CPI_PARTITION_LIST* pPartList,
112 CPI_PARTITION_USER_LIST* pPartUsrList
113 );
114HRESULT CpiPartitionUsersInstall(
115 CPI_PARTITION_USER_LIST* pList,
116 int iRunMode,
117 LPWSTR* ppwzActionData,
118 int* piProgress
119 );
120HRESULT CpiPartitionUsersUninstall(
121 CPI_PARTITION_USER_LIST* pList,
122 int iRunMode,
123 LPWSTR* ppwzActionData,
124 int* piProgress
125 );
diff --git a/src/ext/ComPlus/ca/cpsched.cpp b/src/ext/ComPlus/ca/cpsched.cpp
new file mode 100644
index 00000000..ebc547ae
--- /dev/null
+++ b/src/ext/ComPlus/ca/cpsched.cpp
@@ -0,0 +1,566 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3#include "precomp.h"
4
5
6#ifdef _WIN64
7#define CP_COMPLUSROLLBACKINSTALLPREPARE L"ComPlusRollbackInstallPrepare_64"
8#define CP_COMPLUSINSTALLPREPARE L"ComPlusInstallPrepare_64"
9#define CP_COMPLUSROLLBACKINSTALLEXECUTE L"ComPlusRollbackInstallExecute_64"
10#define CP_COMPLUSINSTALLEXECUTE L"ComPlusInstallExecute_64"
11#define CP_COMPLUSINSTALLEXECUTECOMMIT L"ComPlusInstallExecuteCommit_64"
12#define CP_COMPLUSINSTALLCOMMIT L"ComPlusInstallCommit_64"
13#define CP_COMPLUSROLLBACKINSTALLPREPARE L"ComPlusRollbackInstallPrepare_64"
14#define CP_COMPLUSINSTALLPREPARE L"ComPlusInstallPrepare_64"
15#define CP_COMPLUSROLLBACKUNINSTALLEXECUTE L"ComPlusRollbackUninstallExecute_64"
16#define CP_COMPLUSUNINSTALLEXECUTE L"ComPlusUninstallExecute_64"
17#define CP_COMPLUSINSTALLCOMMIT L"ComPlusInstallCommit_64"
18#else
19#define CP_COMPLUSROLLBACKINSTALLPREPARE L"ComPlusRollbackInstallPrepare"
20#define CP_COMPLUSINSTALLPREPARE L"ComPlusInstallPrepare"
21#define CP_COMPLUSROLLBACKINSTALLEXECUTE L"ComPlusRollbackInstallExecute"
22#define CP_COMPLUSINSTALLEXECUTE L"ComPlusInstallExecute"
23#define CP_COMPLUSINSTALLEXECUTECOMMIT L"ComPlusInstallExecuteCommit"
24#define CP_COMPLUSINSTALLCOMMIT L"ComPlusInstallCommit"
25#define CP_COMPLUSROLLBACKINSTALLPREPARE L"ComPlusRollbackInstallPrepare"
26#define CP_COMPLUSINSTALLPREPARE L"ComPlusInstallPrepare"
27#define CP_COMPLUSROLLBACKUNINSTALLEXECUTE L"ComPlusRollbackUninstallExecute"
28#define CP_COMPLUSUNINSTALLEXECUTE L"ComPlusUninstallExecute"
29#define CP_COMPLUSINSTALLCOMMIT L"ComPlusInstallCommit"
30#endif
31
32/********************************************************************
33 ConfigureComPlusInstall - CUSTOM ACTION ENTRY POINT for installing COM+ components
34
35********************************************************************/
36extern "C" UINT __stdcall ConfigureComPlusInstall(MSIHANDLE hInstall)
37{
38 HRESULT hr = S_OK;
39 UINT er = ERROR_SUCCESS;
40
41 BOOL fInitializedCom = FALSE;
42
43 ICOMAdminCatalog* piCatalog = NULL;
44
45 CPI_PARTITION_LIST partList;
46 CPI_PARTITION_ROLE_LIST partRoleList;
47 CPI_USER_IN_PARTITION_ROLE_LIST usrInPartRoleList;
48 CPI_PARTITION_USER_LIST partUsrList;
49 CPI_APPLICATION_LIST appList;
50 CPI_APPLICATION_ROLE_LIST appRoleList;
51 CPI_USER_IN_APPLICATION_ROLE_LIST usrInAppRoleList;
52 CPI_ASSEMBLY_LIST asmList;
53 CPI_SUBSCRIPTION_LIST subList;
54
55 LPWSTR pwzRollbackFileName = NULL;
56 LPWSTR pwzActionData = NULL;
57 LPWSTR pwzRollbackActionData = NULL;
58 LPWSTR pwzCommitActionData = NULL;
59
60 int iVersionNT = 0;
61 int iProgress = 0;
62 int iCommitProgress = 0;
63
64 ::ZeroMemory(&partList, sizeof(CPI_PARTITION_LIST));
65 ::ZeroMemory(&partRoleList, sizeof(CPI_PARTITION_ROLE_LIST));
66 ::ZeroMemory(&usrInPartRoleList, sizeof(CPI_USER_IN_PARTITION_ROLE_LIST));
67 ::ZeroMemory(&partUsrList, sizeof(CPI_PARTITION_USER_LIST));
68 ::ZeroMemory(&appList, sizeof(CPI_APPLICATION_LIST));
69 ::ZeroMemory(&appRoleList, sizeof(CPI_APPLICATION_ROLE_LIST));
70 ::ZeroMemory(&usrInAppRoleList, sizeof(CPI_USER_IN_APPLICATION_ROLE_LIST));
71 ::ZeroMemory(&asmList, sizeof(CPI_ASSEMBLY_LIST));
72 ::ZeroMemory(&subList, sizeof(CPI_SUBSCRIPTION_LIST));
73
74 // initialize
75 hr = WcaInitialize(hInstall, "ConfigureComPlusInstall");
76 ExitOnFailure(hr, "Failed to initialize");
77
78 hr = ::CoInitialize(NULL);
79 ExitOnFailure(hr, "Failed to initialize COM");
80 fInitializedCom = TRUE;
81
82 CpiSchedInitialize();
83
84 // check for the prerequsite tables
85 if (!CpiTableExists(cptComPlusPartition) && !CpiTableExists(cptComPlusApplication) && !CpiTableExists(cptComPlusAssembly))
86 {
87 WcaLog(LOGMSG_VERBOSE, "skipping install COM+ CustomAction, no ComPlusPartition, ComPlusApplication or ComPlusAssembly table present");
88 ExitFunction1(hr = S_FALSE);
89 }
90
91 // make sure we can access the COM+ admin catalog
92 do {
93 hr = CpiSchedGetAdminCatalog(&piCatalog);
94 if (FAILED(hr))
95 {
96 WcaLog(LOGMSG_STANDARD, "Failed to get COM+ admin catalog");
97 er = WcaErrorMessage(msierrComPlusCannotConnect, hr, INSTALLMESSAGE_ERROR | MB_ABORTRETRYIGNORE, 0);
98 switch (er)
99 {
100 case IDABORT:
101 ExitFunction(); // exit with hr from CpiGetAdminCatalog() to kick off a rollback
102 case IDRETRY:
103 hr = S_FALSE;
104 break;
105 case IDIGNORE:
106 default:
107 ExitFunction1(hr = S_OK); // pretend everything is okay and bail
108 }
109 }
110 } while (S_FALSE == hr);
111
112 // get NT version
113 hr = WcaGetIntProperty(L"VersionNT", &iVersionNT);
114 ExitOnFailure(hr, "Failed to get VersionNT property");
115
116 // read elements
117 if (502 <= iVersionNT && CpiTableExists(cptComPlusPartition))
118 {
119 hr = CpiPartitionsRead(&partList);
120 MessageExitOnFailure(hr, msierrComPlusPartitionReadFailed, "Failed to read ComPlusPartitions table");
121 }
122
123 if (502 <= iVersionNT && CpiTableExists(cptComPlusPartitionRole))
124 {
125 hr = CpiPartitionRolesRead(&partList, &partRoleList);
126 MessageExitOnFailure(hr, msierrComPlusPartitionRoleReadFailed, "Failed to read ComPlusPartitionRole table");
127 }
128
129 if (502 <= iVersionNT && (CpiTableExists(cptComPlusUserInPartitionRole) || CpiTableExists(cptComPlusGroupInPartitionRole)))
130 {
131 hr = CpiUsersInPartitionRolesRead(&partRoleList, &usrInPartRoleList);
132 MessageExitOnFailure(hr, msierrComPlusUserInPartitionRoleReadFailed, "Failed to read ComPlusUserInPartitionRole table");
133 }
134
135 if (502 <= iVersionNT && CpiTableExists(cptComPlusPartitionUser))
136 {
137 hr = CpiPartitionUsersRead(&partList, &partUsrList);
138 MessageExitOnFailure(hr, msierrComPlusPartitionUserReadFailed, "Failed to read ComPlusPartitionUser table");
139 }
140
141 if (CpiTableExists(cptComPlusApplication))
142 {
143 hr = CpiApplicationsRead(&partList, &appList);
144 MessageExitOnFailure(hr, msierrComPlusApplicationReadFailed, "Failed to read ComPlusApplication table");
145 }
146
147 if (CpiTableExists(cptComPlusApplicationRole))
148 {
149 hr = CpiApplicationRolesRead(&appList, &appRoleList);
150 MessageExitOnFailure(hr, msierrComPlusApplicationRoleReadFailed, "Failed to read ComPlusApplicationRole table");
151 }
152
153 if (CpiTableExists(cptComPlusUserInApplicationRole) || CpiTableExists(cptComPlusGroupInApplicationRole))
154 {
155 hr = CpiUsersInApplicationRolesRead(&appRoleList, &usrInAppRoleList);
156 MessageExitOnFailure(hr, msierrComPlusUserInApplicationRoleReadFailed, "Failed to read ComPlusUserInApplicationRole table");
157 }
158
159 if (CpiTableExists(cptComPlusAssembly))
160 {
161 hr = CpiAssembliesRead(&appList, &appRoleList, &asmList);
162 MessageExitOnFailure(hr, msierrComPlusAssembliesReadFailed, "Failed to read ComPlusAssembly table");
163 }
164
165 if (CpiTableExists(cptComPlusSubscription))
166 {
167 hr = CpiSubscriptionsRead(&asmList, &subList);
168 MessageExitOnFailure(hr, msierrComPlusSubscriptionReadFailed, "Failed to read ComPlusSubscription table");
169 }
170
171 // verify elements
172 hr = CpiPartitionsVerifyInstall(&partList);
173 ExitOnFailure(hr, "Failed to verify partitions");
174
175 hr = CpiApplicationsVerifyInstall(&appList);
176 ExitOnFailure(hr, "Failed to verify applications");
177
178 hr = CpiApplicationRolesVerifyInstall(&appRoleList);
179 ExitOnFailure(hr, "Failed to verify application roles");
180
181 hr = CpiAssembliesVerifyInstall(&asmList);
182 ExitOnFailure(hr, "Failed to verify assemblies");
183
184 if (subList.iInstallCount)
185 {
186 hr = CpiSubscriptionsVerifyInstall(&subList);
187 ExitOnFailure(hr, "Failed to verify subscriptions");
188 }
189
190 // schedule
191 if (partList.iInstallCount || appList.iInstallCount || usrInAppRoleList.iInstallCount ||
192 appRoleList.iInstallCount || asmList.iInstallCount || asmList.iRoleInstallCount || subList.iInstallCount)
193 {
194 // create rollback file name
195 hr = CpiGetTempFileName(&pwzRollbackFileName);
196 ExitOnFailure(hr, "Failed to get rollback file name");
197
198 // schedule rollback prepare custom action
199 hr = WcaDoDeferredAction(CP_COMPLUSROLLBACKINSTALLPREPARE, pwzRollbackFileName, 0);
200 ExitOnFailure(hr, "Failed to schedule ComPlusRollbackInstallPrepare");
201
202 // schedule prepare custom action
203 hr = WcaDoDeferredAction(CP_COMPLUSINSTALLPREPARE, pwzRollbackFileName, 0);
204 ExitOnFailure(hr, "Failed to schedule ComPlusInstallPrepare");
205
206 // schedule rollback custom action
207 hr = WcaWriteStringToCaData(pwzRollbackFileName, &pwzRollbackActionData);
208 ExitOnFailure(hr, "Failed to add rollback file name to rollback custom action data");
209
210 hr = CpiSubscriptionsInstall(&subList, rmRollback, &pwzRollbackActionData, NULL);
211 ExitOnFailure(hr, "Failed to install subscriptions");
212 hr = CpiRoleAssignmentsInstall(&asmList, rmRollback, &pwzRollbackActionData, NULL);
213 ExitOnFailure(hr, "Failed to install assemblies");
214 hr = CpiAssembliesInstall(&asmList, rmRollback, &pwzRollbackActionData, NULL);
215 ExitOnFailure(hr, "Failed to install assemblies");
216 hr = CpiUsersInApplicationRolesInstall(&usrInAppRoleList, rmRollback, &pwzRollbackActionData, NULL);
217 ExitOnFailure(hr, "Failed to install users in application roles");
218 hr = CpiApplicationRolesInstall(&appRoleList, rmRollback, &pwzRollbackActionData, NULL);
219 ExitOnFailure(hr, "Failed to install application roles");
220 hr = CpiApplicationsInstall(&appList, rmRollback, &pwzRollbackActionData, NULL);
221 ExitOnFailure(hr, "Failed to install applications");
222 hr = CpiPartitionUsersInstall(&partUsrList, rmRollback, &pwzRollbackActionData, NULL);
223 ExitOnFailure(hr, "Failed to install partition users");
224 hr = CpiUsersInPartitionRolesInstall(&usrInPartRoleList, rmRollback, &pwzRollbackActionData, NULL);
225 ExitOnFailure(hr, "Failed to install users in partition roles");
226 hr = CpiPartitionsInstall(&partList, rmRollback, &pwzRollbackActionData, NULL);
227 ExitOnFailure(hr, "Failed to install partitions");
228
229 hr = WcaDoDeferredAction(CP_COMPLUSROLLBACKINSTALLEXECUTE, pwzRollbackActionData, 0);
230 ExitOnFailure(hr, "Failed to schedule ComPlusRollbackInstallExecute");
231
232 // schedule install custom action
233 hr = WcaWriteStringToCaData(pwzRollbackFileName, &pwzActionData);
234 ExitOnFailure(hr, "Failed to add rollback file name to custom action data");
235
236 hr = CpiPartitionsInstall(&partList, rmDeferred, &pwzActionData, &iProgress);
237 ExitOnFailure(hr, "Failed to install partitions");
238 hr = CpiUsersInPartitionRolesInstall(&usrInPartRoleList, rmDeferred, &pwzActionData, &iProgress);
239 ExitOnFailure(hr, "Failed to install users in partition roles");
240 hr = CpiPartitionUsersInstall(&partUsrList, rmDeferred, &pwzActionData, &iProgress);
241 ExitOnFailure(hr, "Failed to install partition users");
242 hr = CpiApplicationsInstall(&appList, rmDeferred, &pwzActionData, &iProgress);
243 ExitOnFailure(hr, "Failed to install applications");
244 hr = CpiApplicationRolesInstall(&appRoleList, rmDeferred, &pwzActionData, &iProgress);
245 ExitOnFailure(hr, "Failed to install application roles");
246 hr = CpiUsersInApplicationRolesInstall(&usrInAppRoleList, rmDeferred, &pwzActionData, &iProgress);
247 ExitOnFailure(hr, "Failed to install users in application roles");
248 hr = CpiAssembliesInstall(&asmList, rmDeferred, &pwzActionData, &iProgress);
249 ExitOnFailure(hr, "Failed to install assemblies");
250 hr = CpiRoleAssignmentsInstall(&asmList, rmDeferred, &pwzActionData, &iProgress);
251 ExitOnFailure(hr, "Failed to install assemblies");
252 hr = CpiSubscriptionsInstall(&subList, rmDeferred, &pwzActionData, &iProgress);
253 ExitOnFailure(hr, "Failed to install subscriptions");
254
255 hr = WcaDoDeferredAction(CP_COMPLUSINSTALLEXECUTE, pwzActionData, iProgress);
256 ExitOnFailure(hr, "Failed to schedule ComPlusInstallExecute");
257
258 // schedule install commit custom action
259 hr = WcaWriteStringToCaData(pwzRollbackFileName, &pwzCommitActionData);
260 ExitOnFailure(hr, "Failed to add rollback file name to commit custom action data");
261
262 hr = CpiAssembliesInstall(&asmList, rmCommit, &pwzCommitActionData, &iCommitProgress);
263 ExitOnFailure(hr, "Failed to install assemblies");
264 hr = CpiRoleAssignmentsInstall(&asmList, rmCommit, &pwzCommitActionData, &iCommitProgress);
265 ExitOnFailure(hr, "Failed to install assemblies");
266 hr = CpiSubscriptionsInstall(&subList, rmCommit, &pwzCommitActionData, &iCommitProgress);
267 ExitOnFailure(hr, "Failed to install subscriptions");
268
269 hr = WcaDoDeferredAction(CP_COMPLUSINSTALLEXECUTECOMMIT, pwzCommitActionData, iCommitProgress);
270 ExitOnFailure(hr, "Failed to schedule ComPlusInstallExecuteCommit");
271
272 // schedule commit custom action
273 hr = WcaDoDeferredAction(CP_COMPLUSINSTALLCOMMIT, pwzRollbackFileName, 0);
274 ExitOnFailure(hr, "Failed to schedule ComPlusInstallCommit");
275 }
276
277 hr = S_OK;
278
279LExit:
280 // clean up
281 ReleaseObject(piCatalog);
282
283 ReleaseStr(pwzRollbackFileName);
284 ReleaseStr(pwzActionData);
285 ReleaseStr(pwzRollbackActionData);
286 ReleaseStr(pwzCommitActionData);
287
288 CpiPartitionListFree(&partList);
289 CpiPartitionRoleListFree(&partRoleList);
290 CpiUserInPartitionRoleListFree(&usrInPartRoleList);
291 CpiPartitionUserListFree(&partUsrList);
292 CpiApplicationListFree(&appList);
293 CpiApplicationRoleListFree(&appRoleList);
294 CpiUserInApplicationRoleListFree(&usrInAppRoleList);
295 CpiAssemblyListFree(&asmList);
296 CpiSubscriptionListFree(&subList);
297
298 // unitialize
299 CpiSchedFinalize();
300
301 if (fInitializedCom)
302 ::CoUninitialize();
303
304 er = SUCCEEDED(hr) ? ERROR_SUCCESS : ERROR_INSTALL_FAILURE;
305 return WcaFinalize(er);
306}
307
308
309/********************************************************************
310 ConfigureComPlusUninstall - CUSTOM ACTION ENTRY POINT for uninstalling COM+ components
311
312********************************************************************/
313extern "C" UINT __stdcall ConfigureComPlusUninstall(MSIHANDLE hInstall)
314{
315 HRESULT hr = S_OK;
316 UINT er = ERROR_SUCCESS;
317
318 BOOL fInitializedCom = FALSE;
319
320 ICOMAdminCatalog* piCatalog = NULL;
321
322 CPI_PARTITION_LIST partList;
323 CPI_PARTITION_ROLE_LIST partRoleList;
324 CPI_USER_IN_PARTITION_ROLE_LIST usrInPartRoleList;
325 CPI_PARTITION_USER_LIST partUsrList;
326 CPI_APPLICATION_LIST appList;
327 CPI_APPLICATION_ROLE_LIST appRoleList;
328 CPI_USER_IN_APPLICATION_ROLE_LIST usrInAppRoleList;
329 CPI_ASSEMBLY_LIST asmList;
330 CPI_SUBSCRIPTION_LIST subList;
331
332 LPWSTR pwzRollbackFileName = NULL;
333 LPWSTR pwzActionData = NULL;
334 LPWSTR pwzRollbackActionData = NULL;
335
336 int iVersionNT = 0;
337 int iProgress = 0;
338
339 ::ZeroMemory(&partList, sizeof(CPI_PARTITION_LIST));
340 ::ZeroMemory(&partRoleList, sizeof(CPI_PARTITION_ROLE_LIST));
341 ::ZeroMemory(&usrInPartRoleList, sizeof(CPI_USER_IN_PARTITION_ROLE_LIST));
342 ::ZeroMemory(&partUsrList, sizeof(CPI_PARTITION_USER_LIST));
343 ::ZeroMemory(&appList, sizeof(CPI_APPLICATION_LIST));
344 ::ZeroMemory(&appRoleList, sizeof(CPI_APPLICATION_ROLE_LIST));
345 ::ZeroMemory(&usrInAppRoleList, sizeof(CPI_USER_IN_APPLICATION_ROLE_LIST));
346 ::ZeroMemory(&asmList, sizeof(CPI_ASSEMBLY_LIST));
347 ::ZeroMemory(&subList, sizeof(CPI_SUBSCRIPTION_LIST));
348
349 // initialize
350 hr = WcaInitialize(hInstall, "ConfigureComPlusUninstall");
351 ExitOnFailure(hr, "Failed to initialize");
352
353 hr = ::CoInitialize(NULL);
354 ExitOnFailure(hr, "Failed to initialize COM");
355 fInitializedCom = TRUE;
356
357 CpiSchedInitialize();
358
359 // check for the prerequsite tables
360 if (!CpiTableExists(cptComPlusPartition) && !CpiTableExists(cptComPlusApplication) && !CpiTableExists(cptComPlusAssembly))
361 {
362 WcaLog(LOGMSG_VERBOSE, "skipping uninstall COM+ CustomAction, no ComPlusPartition, ComPlusApplication or ComPlusAssembly table present");
363 ExitFunction1(hr = S_FALSE);
364 }
365
366 // make sure we can access the COM+ admin catalog
367 do {
368 hr = CpiSchedGetAdminCatalog(&piCatalog);
369 if (FAILED(hr))
370 {
371 WcaLog(LOGMSG_STANDARD, "Failed to get COM+ admin catalog");
372 er = WcaErrorMessage(msierrComPlusCannotConnect, hr, INSTALLMESSAGE_ERROR | MB_ABORTRETRYIGNORE, 0);
373 switch (er)
374 {
375 case IDABORT:
376 ExitFunction(); // exit with hr from CpiGetAdminCatalog() to kick off a rollback
377 case IDRETRY:
378 hr = S_FALSE;
379 break;
380 case IDIGNORE:
381 default:
382 ExitFunction1(hr = S_OK); // pretend everything is okay and bail
383 }
384 }
385 } while (S_FALSE == hr);
386
387 // get NT version
388 hr = WcaGetIntProperty(L"VersionNT", &iVersionNT);
389 ExitOnFailure(hr, "Failed to get VersionNT property");
390
391 // read elements
392 if (502 <= iVersionNT && CpiTableExists(cptComPlusPartition))
393 {
394 hr = CpiPartitionsRead(&partList);
395 MessageExitOnFailure(hr, msierrComPlusPartitionReadFailed, "Failed to read ComPlusPartitions table");
396 }
397
398 if (502 <= iVersionNT && CpiTableExists(cptComPlusPartitionRole))
399 {
400 hr = CpiPartitionRolesRead(&partList, &partRoleList);
401 MessageExitOnFailure(hr, msierrComPlusPartitionRoleReadFailed, "Failed to read ComPlusPartitionRole table");
402 }
403
404 if (502 <= iVersionNT && (CpiTableExists(cptComPlusUserInPartitionRole) || CpiTableExists(cptComPlusGroupInPartitionRole)))
405 {
406 hr = CpiUsersInPartitionRolesRead(&partRoleList, &usrInPartRoleList);
407 MessageExitOnFailure(hr, msierrComPlusUserInPartitionRoleReadFailed, "Failed to read ComPlusUserInPartitionRole table");
408 }
409
410 if (502 <= iVersionNT && CpiTableExists(cptComPlusPartitionUser))
411 {
412 hr = CpiPartitionUsersRead(&partList, &partUsrList);
413 MessageExitOnFailure(hr, msierrComPlusPartitionUserReadFailed, "Failed to read ComPlusPartitionUser table");
414 }
415
416 if (CpiTableExists(cptComPlusApplication))
417 {
418 hr = CpiApplicationsRead(&partList, &appList);
419 MessageExitOnFailure(hr, msierrComPlusApplicationReadFailed, "Failed to read ComPlusApplication table");
420 }
421
422 if (CpiTableExists(cptComPlusApplicationRole))
423 {
424 hr = CpiApplicationRolesRead(&appList, &appRoleList);
425 MessageExitOnFailure(hr, msierrComPlusApplicationRoleReadFailed, "Failed to read ComPlusApplicationRole table");
426 }
427
428 if (CpiTableExists(cptComPlusUserInApplicationRole) || CpiTableExists(cptComPlusGroupInApplicationRole))
429 {
430 hr = CpiUsersInApplicationRolesRead(&appRoleList, &usrInAppRoleList);
431 MessageExitOnFailure(hr, msierrComPlusUserInApplicationRoleReadFailed, "Failed to read ComPlusUserInApplicationRole table");
432 }
433
434 if (CpiTableExists(cptComPlusAssembly))
435 {
436 hr = CpiAssembliesRead(&appList, &appRoleList, &asmList);
437 MessageExitOnFailure(hr, msierrComPlusAssembliesReadFailed, "Failed to read ComPlusAssembly table");
438 }
439
440 if (CpiTableExists(cptComPlusSubscription))
441 {
442 hr = CpiSubscriptionsRead(&asmList, &subList);
443 MessageExitOnFailure(hr, msierrComPlusSubscriptionReadFailed, "Failed to read ComPlusSubscription table");
444 }
445
446 // verify elements
447 hr = CpiPartitionsVerifyUninstall(&partList);
448 ExitOnFailure(hr, "Failed to verify partitions");
449
450 hr = CpiApplicationsVerifyUninstall(&appList);
451 ExitOnFailure(hr, "Failed to verify applications");
452
453 hr = CpiApplicationRolesVerifyUninstall(&appRoleList);
454 ExitOnFailure(hr, "Failed to verify application roles");
455
456 hr = CpiAssembliesVerifyUninstall(&asmList);
457 ExitOnFailure(hr, "Failed to verify assemblies");
458
459 if (subList.iUninstallCount)
460 {
461 hr = CpiSubscriptionsVerifyUninstall(&subList);
462 ExitOnFailure(hr, "Failed to verify subscriptions");
463 }
464
465 // schedule
466 if (partList.iUninstallCount || appList.iUninstallCount || appRoleList.iUninstallCount ||
467 usrInAppRoleList.iUninstallCount || asmList.iUninstallCount || asmList.iRoleUninstallCount || subList.iUninstallCount)
468 {
469 // create rollback file name
470 hr = CpiGetTempFileName(&pwzRollbackFileName);
471 ExitOnFailure(hr, "Failed to get rollback file name");
472
473 // schedule rollback prepare custom action
474 hr = WcaDoDeferredAction(CP_COMPLUSROLLBACKINSTALLPREPARE, pwzRollbackFileName, 0);
475 ExitOnFailure(hr, "Failed to schedule ComPlusRollbackInstallPrepare");
476
477 // schedule prepare custom action
478 hr = WcaDoDeferredAction(CP_COMPLUSINSTALLPREPARE, pwzRollbackFileName, 0);
479 ExitOnFailure(hr, "Failed to schedule ComPlusInstallPrepare");
480
481 // schedule rollback custom action
482 hr = WcaWriteStringToCaData(pwzRollbackFileName, &pwzRollbackActionData);
483 ExitOnFailure(hr, "Failed to add rollback file name to rollback custom action data");
484
485 hr = CpiPartitionsUninstall(&partList, rmRollback, &pwzRollbackActionData, NULL);
486 ExitOnFailure(hr, "Failed to uninstall partitions");
487 hr = CpiUsersInPartitionRolesUninstall(&usrInPartRoleList, rmRollback, &pwzRollbackActionData, NULL);
488 ExitOnFailure(hr, "Failed to uninstall users in partition roles");
489 hr = CpiPartitionUsersUninstall(&partUsrList, rmRollback, &pwzRollbackActionData, NULL);
490 ExitOnFailure(hr, "Failed to uninstall partition users");
491 hr = CpiApplicationsUninstall(&appList, rmRollback, &pwzRollbackActionData, NULL);
492 ExitOnFailure(hr, "Failed to uninstall applications");
493 hr = CpiApplicationRolesUninstall(&appRoleList, rmRollback, &pwzRollbackActionData, NULL);
494 ExitOnFailure(hr, "Failed to uninstall application roles");
495 hr = CpiUsersInApplicationRolesUninstall(&usrInAppRoleList, rmRollback, &pwzRollbackActionData, NULL);
496 ExitOnFailure(hr, "Failed to uninstall users in application roles");
497 hr = CpiAssembliesUninstall(&asmList, rmRollback, &pwzRollbackActionData, NULL);
498 ExitOnFailure(hr, "Failed to uninstall assemblies");
499 hr = CpiRoleAssignmentsUninstall(&asmList, rmRollback, &pwzRollbackActionData, NULL);
500 ExitOnFailure(hr, "Failed to uninstall assemblies");
501 hr = CpiSubscriptionsUninstall(&subList, rmRollback, &pwzRollbackActionData, NULL);
502 ExitOnFailure(hr, "Failed to uninstall subscriptions");
503
504 hr = WcaDoDeferredAction(CP_COMPLUSROLLBACKUNINSTALLEXECUTE, pwzRollbackActionData, 0);
505 ExitOnFailure(hr, "Failed to schedule ComPlusRollbackUninstallExecute");
506
507 // schedule install custom action
508 hr = WcaWriteStringToCaData(pwzRollbackFileName, &pwzActionData);
509 ExitOnFailure(hr, "Failed to add rollback file name to custom action data");
510
511 hr = CpiSubscriptionsUninstall(&subList, rmDeferred, &pwzActionData, &iProgress);
512 ExitOnFailure(hr, "Failed to uninstall subscriptions");
513 hr = CpiRoleAssignmentsUninstall(&asmList, rmDeferred, &pwzActionData, &iProgress);
514 ExitOnFailure(hr, "Failed to uninstall assemblies");
515 hr = CpiAssembliesUninstall(&asmList, rmDeferred, &pwzActionData, &iProgress);
516 ExitOnFailure(hr, "Failed to uninstall assemblies");
517 hr = CpiUsersInApplicationRolesUninstall(&usrInAppRoleList, rmDeferred, &pwzActionData, &iProgress);
518 ExitOnFailure(hr, "Failed to uninstall users in application roles");
519 hr = CpiApplicationRolesUninstall(&appRoleList, rmDeferred, &pwzActionData, &iProgress);
520 ExitOnFailure(hr, "Failed to uninstall application roles");
521 hr = CpiApplicationsUninstall(&appList, rmDeferred, &pwzActionData, &iProgress);
522 ExitOnFailure(hr, "Failed to uninstall applications");
523 hr = CpiPartitionUsersUninstall(&partUsrList, rmDeferred, &pwzActionData, &iProgress);
524 ExitOnFailure(hr, "Failed to uninstall partition users");
525 hr = CpiUsersInPartitionRolesUninstall(&usrInPartRoleList, rmDeferred, &pwzActionData, &iProgress);
526 ExitOnFailure(hr, "Failed to uninstall users in partition roles");
527 hr = CpiPartitionsUninstall(&partList, rmDeferred, &pwzActionData, &iProgress);
528 ExitOnFailure(hr, "Failed to uninstall partitions");
529
530 hr = WcaDoDeferredAction(CP_COMPLUSUNINSTALLEXECUTE, pwzActionData, iProgress);
531 ExitOnFailure(hr, "Failed to schedule ComPlusUninstallExecute");
532
533 // schedule commit custom action
534 hr = WcaDoDeferredAction(CP_COMPLUSINSTALLCOMMIT, pwzRollbackFileName, 0);
535 ExitOnFailure(hr, "Failed to schedule ComPlusInstallCommit");
536 }
537
538 hr = S_OK;
539
540LExit:
541 // clean up
542 ReleaseObject(piCatalog);
543
544 ReleaseStr(pwzRollbackFileName);
545 ReleaseStr(pwzActionData);
546 ReleaseStr(pwzRollbackActionData);
547
548 CpiPartitionListFree(&partList);
549 CpiPartitionRoleListFree(&partRoleList);
550 CpiUserInPartitionRoleListFree(&usrInPartRoleList);
551 CpiPartitionUserListFree(&partUsrList);
552 CpiApplicationListFree(&appList);
553 CpiApplicationRoleListFree(&appRoleList);
554 CpiUserInApplicationRoleListFree(&usrInAppRoleList);
555 CpiAssemblyListFree(&asmList);
556 CpiSubscriptionListFree(&subList);
557
558 // unitialize
559 CpiSchedFinalize();
560
561 if (fInitializedCom)
562 ::CoUninitialize();
563
564 er = SUCCEEDED(hr) ? ERROR_SUCCESS : ERROR_INSTALL_FAILURE;
565 return WcaFinalize(er);
566}
diff --git a/src/ext/ComPlus/ca/cpsubsexec.cpp b/src/ext/ComPlus/ca/cpsubsexec.cpp
new file mode 100644
index 00000000..bbcf9853
--- /dev/null
+++ b/src/ext/ComPlus/ca/cpsubsexec.cpp
@@ -0,0 +1,411 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3#include "precomp.h"
4
5
6// private structs
7
8struct CPI_SUBSCRIPTION_ATTRIBUTES
9{
10 int iActionType;
11 int iActionCost;
12 LPWSTR pwzKey;
13 LPWSTR pwzID;
14 LPWSTR pwzName;
15 LPWSTR pwzEventCLSID;
16 LPWSTR pwzPublisherID;
17 LPWSTR pwzCompCLSID;
18 LPWSTR pwzAppID;
19 LPWSTR pwzPartID;
20 CPI_PROPERTY* pPropList;
21};
22
23
24// prototypes for private helper functions
25
26static HRESULT ReadSubscriptionAttributes(
27 LPWSTR* ppwzData,
28 CPI_SUBSCRIPTION_ATTRIBUTES* pAttrs
29 );
30static void FreeSubscriptionAttributes(
31 CPI_SUBSCRIPTION_ATTRIBUTES* pAttrs
32 );
33static HRESULT CreateSubscription(
34 CPI_SUBSCRIPTION_ATTRIBUTES* pAttrs
35 );
36static HRESULT RemoveSubscription(
37 CPI_SUBSCRIPTION_ATTRIBUTES* pAttrs
38 );
39
40
41// function definitions
42
43HRESULT CpiConfigureSubscriptions(
44 LPWSTR* ppwzData,
45 HANDLE hRollbackFile
46 )
47{
48 HRESULT hr = S_OK;
49
50 CPI_SUBSCRIPTION_ATTRIBUTES attrs;
51 ::ZeroMemory(&attrs, sizeof(attrs));
52
53 // read action text
54 hr = CpiActionStartMessage(ppwzData, FALSE);
55 ExitOnFailure(hr, "Failed to send action start message");
56
57 // ger count
58 int iCnt = 0;
59 hr = WcaReadIntegerFromCaData(ppwzData, &iCnt);
60 ExitOnFailure(hr, "Failed to read count");
61
62 // write count to rollback file
63 hr = CpiWriteIntegerToRollbackFile(hRollbackFile, iCnt);
64 ExitOnFailure(hr, "Failed to write count to rollback file");
65
66 for (int i = 0; i < iCnt; i++)
67 {
68 // read attributes from CustomActionData
69 hr = ReadSubscriptionAttributes(ppwzData, &attrs);
70 ExitOnFailure(hr, "Failed to read attributes");
71
72 // progress message
73 hr = CpiActionDataMessage(1, attrs.pwzName);
74 ExitOnFailure(hr, "Failed to send progress messages");
75
76 if (S_FALSE == hr)
77 ExitFunction();
78
79 // write key to rollback file
80 hr = CpiWriteKeyToRollbackFile(hRollbackFile, attrs.pwzKey);
81 ExitOnFailure(hr, "Failed to write key to rollback file");
82
83 // action
84 switch (attrs.iActionType)
85 {
86 case atCreate:
87 hr = CreateSubscription(&attrs);
88 ExitOnFailure(hr, "Failed to create subscription, key: %S", attrs.pwzKey);
89 break;
90 case atRemove:
91 hr = RemoveSubscription(&attrs);
92 ExitOnFailure(hr, "Failed to remove subscription, key: %S", attrs.pwzKey);
93 break;
94 }
95
96 // write completion status to rollback file
97 hr = CpiWriteIntegerToRollbackFile(hRollbackFile, 1);
98 ExitOnFailure(hr, "Failed to write completion status to rollback file");
99
100 // progress
101 hr = WcaProgressMessage(attrs.iActionCost, FALSE);
102 ExitOnFailure(hr, "Failed to update progress");
103 }
104
105 hr = S_OK;
106
107LExit:
108 // clean up
109 FreeSubscriptionAttributes(&attrs);
110
111 return hr;
112}
113
114HRESULT CpiRollbackConfigureSubscriptions(
115 LPWSTR* ppwzData,
116 CPI_ROLLBACK_DATA* pRollbackDataList
117 )
118{
119 HRESULT hr = S_OK;
120
121 int iRollbackStatus;
122
123 CPI_SUBSCRIPTION_ATTRIBUTES attrs;
124 ::ZeroMemory(&attrs, sizeof(attrs));
125
126 // read action text
127 hr = CpiActionStartMessage(ppwzData, NULL == pRollbackDataList);
128 ExitOnFailure(hr, "Failed to send action start message");
129
130 // ger count
131 int iCnt = 0;
132 hr = WcaReadIntegerFromCaData(ppwzData, &iCnt);
133 ExitOnFailure(hr, "Failed to read count");
134
135 for (int i = 0; i < iCnt; i++)
136 {
137 // read attributes from CustomActionData
138 hr = ReadSubscriptionAttributes(ppwzData, &attrs);
139 ExitOnFailure(hr, "Failed to read attributes");
140
141 // rollback status
142 hr = CpiFindRollbackStatus(pRollbackDataList, attrs.pwzKey, &iRollbackStatus);
143
144 if (S_FALSE == hr)
145 continue; // not found, nothing to rollback
146
147 // progress message
148 hr = CpiActionDataMessage(1, attrs.pwzName);
149 ExitOnFailure(hr, "Failed to send progress messages");
150
151 if (S_FALSE == hr)
152 ExitFunction();
153
154 // action
155 switch (attrs.iActionType)
156 {
157 case atCreate:
158 hr = CreateSubscription(&attrs);
159 if (FAILED(hr))
160 WcaLog(LOGMSG_STANDARD, "Failed to create subscription, hr: 0x%x, key: %S", hr, attrs.pwzKey);
161 break;
162 case atRemove:
163 hr = RemoveSubscription(&attrs);
164 if (FAILED(hr))
165 WcaLog(LOGMSG_STANDARD, "Failed to remove subscription, hr: 0x%x, key: %S", hr, attrs.pwzKey);
166 break;
167 }
168
169 // check rollback status
170 if (0 == iRollbackStatus)
171 continue; // operation did not complete, skip progress
172
173 // progress
174 hr = WcaProgressMessage(attrs.iActionCost, FALSE);
175 ExitOnFailure(hr, "Failed to update progress");
176 }
177
178 hr = S_OK;
179
180LExit:
181 // clean up
182 FreeSubscriptionAttributes(&attrs);
183
184 return hr;
185}
186
187
188// helper function definitions
189
190static HRESULT ReadSubscriptionAttributes(
191 LPWSTR* ppwzData,
192 CPI_SUBSCRIPTION_ATTRIBUTES* pAttrs
193 )
194{
195 HRESULT hr = S_OK;
196
197 hr = WcaReadIntegerFromCaData(ppwzData, &pAttrs->iActionType);
198 ExitOnFailure(hr, "Failed to read action type");
199 hr = WcaReadIntegerFromCaData(ppwzData, &pAttrs->iActionCost);
200 ExitOnFailure(hr, "Failed to read action cost");
201 hr = WcaReadStringFromCaData(ppwzData, &pAttrs->pwzKey);
202 ExitOnFailure(hr, "Failed to read key");
203 hr = WcaReadStringFromCaData(ppwzData, &pAttrs->pwzID);
204 ExitOnFailure(hr, "Failed to read id");
205 hr = WcaReadStringFromCaData(ppwzData, &pAttrs->pwzName);
206 ExitOnFailure(hr, "Failed to read name");
207 hr = WcaReadStringFromCaData(ppwzData, &pAttrs->pwzEventCLSID);
208 ExitOnFailure(hr, "Failed to read event clsid");
209 hr = WcaReadStringFromCaData(ppwzData, &pAttrs->pwzPublisherID);
210 ExitOnFailure(hr, "Failed to read publisher id");
211 hr = WcaReadStringFromCaData(ppwzData, &pAttrs->pwzCompCLSID);
212 ExitOnFailure(hr, "Failed to read component clsid");
213 hr = WcaReadStringFromCaData(ppwzData, &pAttrs->pwzAppID);
214 ExitOnFailure(hr, "Failed to read application id");
215 hr = WcaReadStringFromCaData(ppwzData, &pAttrs->pwzPartID);
216 ExitOnFailure(hr, "Failed to read partition id");
217
218 hr = CpiReadPropertyList(ppwzData, &pAttrs->pPropList);
219 ExitOnFailure(hr, "Failed to read properties");
220
221 hr = S_OK;
222
223LExit:
224 return hr;
225}
226
227static void FreeSubscriptionAttributes(
228 CPI_SUBSCRIPTION_ATTRIBUTES* pAttrs
229 )
230{
231 ReleaseStr(pAttrs->pwzKey);
232 ReleaseStr(pAttrs->pwzID);
233 ReleaseStr(pAttrs->pwzName);
234 ReleaseStr(pAttrs->pwzEventCLSID);
235 ReleaseStr(pAttrs->pwzPublisherID);
236 ReleaseStr(pAttrs->pwzCompCLSID);
237 ReleaseStr(pAttrs->pwzAppID);
238 ReleaseStr(pAttrs->pwzPartID);
239
240 if (pAttrs->pPropList)
241 CpiFreePropertyList(pAttrs->pPropList);
242}
243
244static HRESULT CreateSubscription(
245 CPI_SUBSCRIPTION_ATTRIBUTES* pAttrs
246 )
247{
248 HRESULT hr = S_OK;
249 UINT er = ERROR_SUCCESS;
250
251 ICatalogCollection* piSubsColl = NULL;
252 ICatalogObject* piSubsObj = NULL;
253
254 PSID pSid = NULL;
255 long lChanges = 0;
256
257 // log
258 WcaLog(LOGMSG_VERBOSE, "Creating subscription, key: %S", pAttrs->pwzKey);
259
260 // get subscriptions collection
261 hr = CpiGetSubscriptionsCollection(pAttrs->pwzPartID, pAttrs->pwzAppID, pAttrs->pwzCompCLSID, &piSubsColl);
262 if (S_FALSE == hr)
263 hr = HRESULT_FROM_WIN32(ERROR_NOT_FOUND);
264 ExitOnFailure(hr, "Failed to get subscriptions collection");
265
266 // check if subscription exists
267 hr = CpiFindCollectionObjectByStringKey(piSubsColl, pAttrs->pwzID, &piSubsObj);
268 ExitOnFailure(hr, "Failed to find subscription");
269
270 if (S_FALSE == hr)
271 {
272 // create subscription
273 hr = CpiAddCollectionObject(piSubsColl, &piSubsObj);
274 ExitOnFailure(hr, "Failed to add subscription to collection");
275
276 hr = CpiPutCollectionObjectValue(piSubsObj, L"ID", pAttrs->pwzID);
277 ExitOnFailure(hr, "Failed to set subscription id property");
278
279 hr = CpiPutCollectionObjectValue(piSubsObj, L"Name", pAttrs->pwzName);
280 ExitOnFailure(hr, "Failed to set subscription name property");
281
282 if (pAttrs->pwzEventCLSID && *pAttrs->pwzEventCLSID)
283 {
284 hr = CpiPutCollectionObjectValue(piSubsObj, L"EventCLSID", pAttrs->pwzEventCLSID);
285 ExitOnFailure(hr, "Failed to set role event clsid property");
286 }
287
288 if (pAttrs->pwzPublisherID && *pAttrs->pwzPublisherID)
289 {
290 hr = CpiPutCollectionObjectValue(piSubsObj, L"PublisherID", pAttrs->pwzPublisherID);
291 ExitOnFailure(hr, "Failed to set role publisher id property");
292 }
293 }
294
295 // properties
296 for (CPI_PROPERTY* pItm = pAttrs->pPropList; pItm; pItm = pItm->pNext)
297 {
298 // UserName property
299 if (0 == lstrcmpW(pItm->wzName, L"UserName"))
300 {
301 // get SID for account
302 do {
303 er = ERROR_SUCCESS;
304 hr = CpiAccountNameToSid(pItm->pwzValue, &pSid);
305 if (!::MsiGetMode(WcaGetInstallHandle(), MSIRUNMODE_ROLLBACK))
306 {
307 if (HRESULT_FROM_WIN32(ERROR_NONE_MAPPED) == hr)
308 {
309 WcaLog(LOGMSG_STANDARD, "Failed to lookup account name, hr: 0x%x, account: '%S'", hr, pItm->pwzValue);
310 er = WcaErrorMessage(msierrComPlusFailedLookupNames, hr, INSTALLMESSAGE_ERROR | MB_ABORTRETRYIGNORE, 0);
311 switch (er)
312 {
313 case IDABORT:
314 ExitFunction(); // exit with error code from CpiAccountNameToSid()
315 case IDRETRY:
316 break;
317 case IDIGNORE:
318 default:
319 hr = S_FALSE;
320 }
321 }
322 else
323 ExitOnFailure(hr, "Failed to get SID for account, account: '%S'", pItm->pwzValue);
324 }
325 else if (FAILED(hr))
326 {
327 WcaLog(LOGMSG_STANDARD, "Failed to get SID for account, hr: 0x%x, account: '%S'", hr, pItm->pwzValue);
328 hr = S_FALSE;
329 }
330 } while (IDRETRY == er);
331
332 if (S_FALSE == hr)
333 continue;
334
335 // convert SID back to account name
336 hr = CpiSidToAccountName(pSid, &pItm->pwzValue);
337 ExitOnFailure(hr, "Failed to convert SID to account name");
338 }
339
340 // set property
341 hr = CpiPutCollectionObjectValue(piSubsObj, pItm->wzName, pItm->pwzValue);
342 ExitOnFailure(hr, "Failed to set object property value, name: %S", pItm->wzName);
343 }
344
345 // save changes
346 hr = piSubsColl->SaveChanges(&lChanges);
347 if (COMADMIN_E_OBJECTERRORS == hr)
348 CpiLogCatalogErrorInfo();
349 ExitOnFailure(hr, "Failed to save changes");
350
351 // log
352 WcaLog(LOGMSG_VERBOSE, "%d changes saved to catalog, key: %S", lChanges, pAttrs->pwzKey);
353
354 hr = S_OK;
355
356LExit:
357 // clean up
358 ReleaseObject(piSubsColl);
359 ReleaseObject(piSubsObj);
360
361 if (pSid)
362 ::HeapFree(::GetProcessHeap(), 0, pSid);
363
364 return hr;
365}
366
367static HRESULT RemoveSubscription(
368 CPI_SUBSCRIPTION_ATTRIBUTES* pAttrs
369 )
370{
371 HRESULT hr = S_OK;
372
373 ICatalogCollection* piSubsColl = NULL;
374
375 long lChanges = 0;
376
377 // log
378 WcaLog(LOGMSG_VERBOSE, "Removing subscription, key: %S", pAttrs->pwzKey);
379
380 // get subscriptions collection
381 hr = CpiGetSubscriptionsCollection(pAttrs->pwzPartID, pAttrs->pwzAppID, pAttrs->pwzCompCLSID, &piSubsColl);
382 ExitOnFailure(hr, "Failed to get subscriptions collection");
383
384 if (S_FALSE == hr)
385 {
386 // subscription not found
387 WcaLog(LOGMSG_VERBOSE, "Unable to retrieve subscriptions collection, nothing to delete, key: %S", pAttrs->pwzKey);
388 ExitFunction1(hr = S_OK);
389 }
390
391 // remove
392 hr = CpiRemoveCollectionObject(piSubsColl, pAttrs->pwzID, NULL, FALSE);
393 ExitOnFailure(hr, "Failed to remove subscriptions");
394
395 // save changes
396 hr = piSubsColl->SaveChanges(&lChanges);
397 if (COMADMIN_E_OBJECTERRORS == hr)
398 CpiLogCatalogErrorInfo();
399 ExitOnFailure(hr, "Failed to save changes");
400
401 // log
402 WcaLog(LOGMSG_VERBOSE, "%d changes saved to catalog, key: %S", lChanges, pAttrs->pwzKey);
403
404 hr = S_OK;
405
406LExit:
407 // clean up
408 ReleaseObject(piSubsColl);
409
410 return hr;
411}
diff --git a/src/ext/ComPlus/ca/cpsubsexec.h b/src/ext/ComPlus/ca/cpsubsexec.h
new file mode 100644
index 00000000..2f4d3c75
--- /dev/null
+++ b/src/ext/ComPlus/ca/cpsubsexec.h
@@ -0,0 +1,12 @@
1#pragma once
2// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
3
4
5HRESULT CpiConfigureSubscriptions(
6 LPWSTR* ppwzData,
7 HANDLE hRollbackFile
8 );
9HRESULT CpiRollbackConfigureSubscriptions(
10 LPWSTR* ppwzData,
11 CPI_ROLLBACK_DATA* pRollbackDataList
12 );
diff --git a/src/ext/ComPlus/ca/cpsubssched.cpp b/src/ext/ComPlus/ca/cpsubssched.cpp
new file mode 100644
index 00000000..df15fd03
--- /dev/null
+++ b/src/ext/ComPlus/ca/cpsubssched.cpp
@@ -0,0 +1,606 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3#include "precomp.h"
4
5
6// sql queries
7
8LPCWSTR vcsSubscriptionQuery =
9 L"SELECT `Subscription`, `ComPlusComponent_`, `Component_`, `Id`, `Name`, `EventCLSID`, `PublisherID` FROM `ComPlusSubscription`";
10enum eSubscriptionQuery { sqSubscription = 1, sqComPlusComponent, sqComponent, sqID, sqName, sqEventCLSID, sqPublisherID };
11
12LPCWSTR vcsSubscriptionPropertyQuery =
13 L"SELECT `Name`, `Value` FROM `ComPlusSubscriptionProperty` WHERE `Subscription_` = ?";
14
15
16// property definitions
17
18CPI_PROPERTY_DEFINITION pdlSubscriptionProperties[] =
19{
20 {L"Description", cpptString, 500},
21 {L"Enabled", cpptBoolean, 500},
22 {L"EventClassPartitionID", cpptString, 502},
23 {L"FilterCriteria", cpptString, 500},
24 {L"InterfaceID", cpptString, 500},
25 {L"MachineName", cpptString, 500},
26 {L"MethodName", cpptString, 500},
27 {L"PerUser", cpptBoolean, 500},
28 {L"Queued", cpptBoolean, 500},
29 {L"SubscriberMoniker", cpptString, 500},
30 {L"UserName", cpptUser, 500},
31 {NULL, cpptNone, 0}
32};
33
34
35// prototypes for private helper functions
36
37static void FreeSubscription(
38 CPI_SUBSCRIPTION* pItm
39 );
40static HRESULT FindObjectForSubscription(
41 CPI_SUBSCRIPTION* pItm,
42 BOOL fFindId,
43 BOOL fFindName,
44 ICatalogObject** ppiSubsObj
45 );
46static HRESULT AddSubscriptionToActionData(
47 CPI_SUBSCRIPTION* pItm,
48 int iActionType,
49 int iActionCost,
50 LPWSTR* ppwzActionData
51 );
52static HRESULT ComponentFindByKey(
53 CPI_ASSEMBLY_LIST* pAsmList,
54 LPCWSTR pwzKey,
55 CPI_ASSEMBLY** ppAsmItm,
56 CPISCHED_COMPONENT** ppCompItm
57 );
58
59
60// function definitions
61
62void CpiSubscriptionListFree(
63 CPI_SUBSCRIPTION_LIST* pList
64 )
65{
66 CPI_SUBSCRIPTION* pItm = pList->pFirst;
67
68 while (pItm)
69 {
70 CPI_SUBSCRIPTION* pDelete = pItm;
71 pItm = pItm->pNext;
72 FreeSubscription(pDelete);
73 }
74}
75
76HRESULT CpiSubscriptionsRead(
77 CPI_ASSEMBLY_LIST* pAsmList,
78 CPI_SUBSCRIPTION_LIST* pSubList
79 )
80{
81 HRESULT hr = S_OK;
82 UINT er = ERROR_SUCCESS;
83
84 PMSIHANDLE hView, hRec;
85
86 CPI_SUBSCRIPTION* pItm = NULL;
87 LPWSTR pwzData = NULL;
88 BOOL fMatchingArchitecture = FALSE;
89
90 // loop through all applications
91 hr = WcaOpenExecuteView(vcsSubscriptionQuery, &hView);
92 ExitOnFailure(hr, "Failed to execute view on ComPlusSubscription table");
93
94 while (S_OK == (hr = WcaFetchRecord(hView, &hRec)))
95 {
96 // get component
97 hr = WcaGetRecordString(hRec, sqComponent, &pwzData);
98 ExitOnFailure(hr, "Failed to get component");
99
100 // check if the component is our processor architecture
101 hr = CpiVerifyComponentArchitecure(pwzData, &fMatchingArchitecture);
102 ExitOnFailure(hr, "Failed to get component architecture.");
103
104 if (!fMatchingArchitecture)
105 {
106 continue; // not the same architecture, ignore
107 }
108
109 // create entry
110 pItm = (CPI_SUBSCRIPTION*)::HeapAlloc(::GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(CPI_SUBSCRIPTION));
111 if (!pItm)
112 ExitFunction1(hr = E_OUTOFMEMORY);
113
114 // get component install state
115 er = ::MsiGetComponentStateW(WcaGetInstallHandle(), pwzData, &pItm->isInstalled, &pItm->isAction);
116 ExitOnFailure(hr = HRESULT_FROM_WIN32(er), "Failed to get component state");
117
118 // get key
119 hr = WcaGetRecordString(hRec, sqSubscription, &pwzData);
120 ExitOnFailure(hr, "Failed to get key");
121 StringCchCopyW(pItm->wzKey, countof(pItm->wzKey), pwzData);
122
123 // get com+ component
124 hr = WcaGetRecordString(hRec, sqComPlusComponent, &pwzData);
125 ExitOnFailure(hr, "Failed to get COM+ component");
126
127 hr = ComponentFindByKey(pAsmList, pwzData, &pItm->pAssembly, &pItm->pComponent);
128
129 if (S_FALSE == hr)
130 {
131 // component not found
132 ExitOnFailure(hr = E_FAIL, "Failed to find component, key: %S", pwzData);
133 }
134
135 // get id
136 hr = WcaGetRecordFormattedString(hRec, sqID, &pwzData);
137 ExitOnFailure(hr, "Failed to get id");
138
139 if (pwzData && *pwzData)
140 {
141 hr = PcaGuidToRegFormat(pwzData, pItm->wzID, countof(pItm->wzID));
142 ExitOnFailure(hr, "Failed to parse id guid value, key: %S, value: '%S'", pItm->wzKey, pwzData);
143 }
144
145 // get name
146 hr = WcaGetRecordFormattedString(hRec, sqName, &pwzData);
147 ExitOnFailure(hr, "Failed to get name");
148 StringCchCopyW(pItm->wzName, countof(pItm->wzName), pwzData);
149
150 // get event clsid
151 hr = WcaGetRecordFormattedString(hRec, sqEventCLSID, &pwzData);
152 ExitOnFailure(hr, "Failed to get event clsid");
153 StringCchCopyW(pItm->wzEventCLSID, countof(pItm->wzEventCLSID), pwzData);
154
155 // get publisher id
156 hr = WcaGetRecordFormattedString(hRec, sqPublisherID, &pwzData);
157 ExitOnFailure(hr, "Failed to get publisher id");
158 StringCchCopyW(pItm->wzPublisherID, countof(pItm->wzPublisherID), pwzData);
159
160 // get properties
161 if (CpiTableExists(cptComPlusSubscriptionProperty))
162 {
163 hr = CpiPropertiesRead(vcsSubscriptionPropertyQuery, pItm->wzKey, pdlSubscriptionProperties, &pItm->pProperties, &pItm->iPropertyCount);
164 ExitOnFailure(hr, "Failed to get subscription properties");
165 }
166
167 // set references & increment counters
168 if (WcaIsInstalling(pItm->isInstalled, pItm->isAction))
169 {
170 CpiApplicationAddReferenceInstall(pItm->pAssembly->pApplication);
171 pItm->pAssembly->fReferencedForInstall = TRUE;
172 pSubList->iInstallCount++;
173 if (pItm->pAssembly->iAttributes & aaRunInCommit)
174 pSubList->iCommitCount++;
175 }
176 if (WcaIsUninstalling(pItm->isInstalled, pItm->isAction))
177 {
178 CpiApplicationAddReferenceUninstall(pItm->pAssembly->pApplication);
179 pItm->pAssembly->fReferencedForUninstall = TRUE;
180 pSubList->iUninstallCount++;
181 }
182
183 // add entry
184 if (pSubList->pFirst)
185 pItm->pNext = pSubList->pFirst;
186 pSubList->pFirst = pItm;
187 pItm = NULL;
188 }
189
190 if (E_NOMOREITEMS == hr)
191 hr = S_OK;
192
193LExit:
194 // clean up
195 if (pItm)
196 FreeSubscription(pItm);
197
198 ReleaseStr(pwzData);
199
200 return hr;
201}
202
203HRESULT CpiSubscriptionsVerifyInstall(
204 CPI_SUBSCRIPTION_LIST* pList
205 )
206{
207 HRESULT hr = S_OK;
208 UINT er = ERROR_SUCCESS;
209
210 ICatalogObject* piSubsObj = NULL;
211
212 for (CPI_SUBSCRIPTION* pItm = pList->pFirst; pItm; pItm = pItm->pNext)
213 {
214 // subscriptions that are being installed
215 if (!WcaIsInstalling(pItm->isInstalled, pItm->isAction))
216 continue;
217
218 // subscription is supposed to exist
219 if (CpiIsInstalled(pItm->isInstalled))
220 {
221 // if we don't have an id
222 if (!*pItm->wzID)
223 {
224 // find subscriptions with conflicting name
225 hr = FindObjectForSubscription(pItm, FALSE, TRUE, &piSubsObj);
226 ExitOnFailure(hr, "Failed to find collection object for subscription");
227
228 // if the subscription was found
229 if (S_OK == hr)
230 {
231 // get id from subscription object
232 hr = CpiGetKeyForObject(piSubsObj, pItm->wzID, countof(pItm->wzID));
233 ExitOnFailure(hr, "Failed to get id");
234 }
235
236 // if the subscription was not found
237 else
238 {
239 // create a new id
240 hr = CpiCreateId(pItm->wzID, countof(pItm->wzID));
241 ExitOnFailure(hr, "Failed to create id");
242 }
243 }
244 }
245
246 // subscription is supposed to be created
247 else
248 {
249 // check for conflicts
250 do {
251 if (*pItm->wzID)
252 {
253 // find subscriptions with conflicting id
254 hr = FindObjectForSubscription(pItm, TRUE, FALSE, &piSubsObj);
255 ExitOnFailure(hr, "Failed to find collection object for subscription");
256
257 if (S_FALSE == hr)
258 {
259 // find subscriptions with conflicting name
260 hr = FindObjectForSubscription(pItm, FALSE, TRUE, &piSubsObj);
261 ExitOnFailure(hr, "Failed to find collection object for subscription");
262
263 if (S_OK == hr)
264 // "A subscription with a conflictiong name exists. retry cancel"
265 er = WcaErrorMessage(msierrComPlusSubscriptionNameConflict, hr, INSTALLMESSAGE_ERROR | MB_RETRYCANCEL, 0);
266 else
267 break; // no conflicting entry found, break loop
268 }
269 else
270 // "A subscription with a conflicting id exists. abort retry ignore"
271 er = WcaErrorMessage(msierrComPlusSubscriptionIdConflict, hr, INSTALLMESSAGE_ERROR | MB_ABORTRETRYIGNORE, 0);
272 }
273 else
274 {
275 // find subscriptions with conflicting name
276 hr = FindObjectForSubscription(pItm, FALSE, TRUE, &piSubsObj);
277 ExitOnFailure(hr, "Failed to find collection object for subscription");
278
279 if (S_OK == hr)
280 // "A subscription with a conflictiong name exists. abort retry ignore"
281 er = WcaErrorMessage(msierrComPlusSubscriptionNameConflict, hr, INSTALLMESSAGE_ERROR | MB_ABORTRETRYIGNORE, 0);
282 else
283 break; // no conflicting entry found, break loop
284 }
285
286 switch (er)
287 {
288 case IDCANCEL:
289 case IDABORT:
290 ExitOnFailure(hr = E_FAIL, "A subscription with a conflictiong name or id exists, key: %S", pItm->wzKey);
291 break;
292 case IDRETRY:
293 break;
294 case IDIGNORE:
295 default:
296 // if we don't have an id, copy id from object
297 if (!*pItm->wzID)
298 {
299 hr = CpiGetKeyForObject(piSubsObj, pItm->wzID, countof(pItm->wzID));
300 ExitOnFailure(hr, "Failed to get id");
301 }
302 hr = S_FALSE; // indicate that this is not a conflict
303 }
304 } while (S_OK == hr); // hr = S_FALSE if we don't have any conflicts
305
306 // create a new id if one is missing
307 if (!*pItm->wzID)
308 {
309 hr = CpiCreateId(pItm->wzID, countof(pItm->wzID));
310 ExitOnFailure(hr, "Failed to create id");
311 }
312 }
313
314 // clean up
315 ReleaseNullObject(piSubsObj);
316 }
317
318 hr = S_OK;
319
320LExit:
321 // clean up
322 ReleaseObject(piSubsObj);
323
324 return hr;
325}
326
327HRESULT CpiSubscriptionsVerifyUninstall(
328 CPI_SUBSCRIPTION_LIST* pList
329 )
330{
331 HRESULT hr = S_OK;
332 ICatalogObject* piSubsObj = NULL;
333
334 for (CPI_SUBSCRIPTION* pItm = pList->pFirst; pItm; pItm = pItm->pNext)
335 {
336 // subscriptions that are being installed
337 if (!WcaIsUninstalling(pItm->isInstalled, pItm->isAction))
338 continue;
339
340 // find subscriptions with conflicting name
341 hr = FindObjectForSubscription(pItm, 0 != *pItm->wzID, 0 == *pItm->wzID, &piSubsObj);
342 ExitOnFailure(hr, "Failed to find collection object for subscription");
343
344 // if the subscription was found
345 if (S_OK == hr)
346 {
347 // if we don't have an id, copy id from object
348 if (!*pItm->wzID)
349 {
350 hr = CpiGetKeyForObject(piSubsObj, pItm->wzID, countof(pItm->wzID));
351 ExitOnFailure(hr, "Failed to get id");
352 }
353 }
354
355 // if the subscription was not found
356 else
357 {
358 pItm->fObjectNotFound = TRUE;
359 pList->iUninstallCount--; // elements with the fObjectNotFound flag set will not be scheduled for uninstall
360 }
361
362 // clean up
363 ReleaseNullObject(piSubsObj);
364 }
365
366 hr = S_OK;
367
368LExit:
369 // clean up
370 ReleaseObject(piSubsObj);
371
372 return hr;
373}
374
375HRESULT CpiSubscriptionsInstall(
376 CPI_SUBSCRIPTION_LIST* pList,
377 int iRunMode,
378 LPWSTR* ppwzActionData,
379 int* piProgress
380 )
381{
382 HRESULT hr = S_OK;
383
384 int iActionType;
385 int iCount = 0;
386
387 // add action text
388 hr = CpiAddActionTextToActionData(L"CreateSubscrComPlusComponents", ppwzActionData);
389 ExitOnFailure(hr, "Failed to add action text to custom action data");
390
391 // subscription count
392 switch (iRunMode)
393 {
394 case rmDeferred:
395 iCount = pList->iInstallCount - pList->iCommitCount;
396 break;
397 case rmCommit:
398 iCount = pList->iCommitCount;
399 break;
400 case rmRollback:
401 iCount = pList->iInstallCount;
402 break;
403 }
404
405 // add subscription count to action data
406 hr = WcaWriteIntegerToCaData(iCount, ppwzActionData);
407 ExitOnFailure(hr, "Failed to add count to custom action data");
408
409 // add assemblies to custom action data in forward order
410 for (CPI_SUBSCRIPTION* pItm = pList->pFirst; pItm; pItm = pItm->pNext)
411 {
412 // roles that are being installed only
413 if ((rmCommit == iRunMode && !(pItm->pAssembly->iAttributes & aaRunInCommit)) ||
414 (rmDeferred == iRunMode && (pItm->pAssembly->iAttributes & aaRunInCommit)) ||
415 !WcaIsInstalling(pItm->isInstalled, pItm->isAction))
416 continue;
417
418 // action type
419 if (rmRollback == iRunMode)
420 {
421 if (CpiIsInstalled(pItm->isInstalled))
422 iActionType = atNoOp;
423 else
424 iActionType = atRemove;
425 }
426 else
427 iActionType = atCreate;
428
429 // add to action data
430 hr = AddSubscriptionToActionData(pItm, iActionType, COST_SUBSCRIPTION_CREATE, ppwzActionData);
431 ExitOnFailure(hr, "Failed to add subscription to custom action data, key: %S", pItm->wzKey);
432 }
433
434 // add progress tics
435 if (piProgress)
436 *piProgress += COST_SUBSCRIPTION_CREATE * pList->iInstallCount;
437
438 hr = S_OK;
439
440LExit:
441 return hr;
442}
443
444HRESULT CpiSubscriptionsUninstall(
445 CPI_SUBSCRIPTION_LIST* pList,
446 int iRunMode,
447 LPWSTR* ppwzActionData,
448 int* piProgress
449 )
450{
451 HRESULT hr = S_OK;
452
453 int iActionType;
454
455 // add action text
456 hr = CpiAddActionTextToActionData(L"RemoveSubscrComPlusComponents", ppwzActionData);
457 ExitOnFailure(hr, "Failed to add action text to custom action data");
458
459 // add subscription count to action data
460 hr = WcaWriteIntegerToCaData(pList->iUninstallCount, ppwzActionData);
461 ExitOnFailure(hr, "Failed to add count to custom action data");
462
463 // add assemblies to custom action data in reverse order
464 for (CPI_SUBSCRIPTION* pItm = pList->pFirst; pItm; pItm = pItm->pNext)
465 {
466 // roles that are being uninstalled only
467 if (pItm->fObjectNotFound || !WcaIsUninstalling(pItm->isInstalled, pItm->isAction))
468 continue;
469
470 // action type
471 if (rmRollback == iRunMode)
472 iActionType = atCreate;
473 else
474 iActionType = atRemove;
475
476 // add to action data
477 hr = AddSubscriptionToActionData(pItm, iActionType, COST_SUBSCRIPTION_DELETE, ppwzActionData);
478 ExitOnFailure(hr, "Failed to add subscription to custom action data, key: %S", pItm->wzKey);
479 }
480
481 // add progress tics
482 if (piProgress)
483 *piProgress += COST_SUBSCRIPTION_DELETE * pList->iUninstallCount;
484
485 hr = S_OK;
486
487LExit:
488 return hr;
489}
490
491
492// helper function definitions
493
494static void FreeSubscription(
495 CPI_SUBSCRIPTION* pItm
496 )
497{
498 if (pItm->pProperties)
499 CpiPropertiesFreeList(pItm->pProperties);
500
501 ::HeapFree(::GetProcessHeap(), 0, pItm);
502}
503
504static HRESULT FindObjectForSubscription(
505 CPI_SUBSCRIPTION* pItm,
506 BOOL fFindId,
507 BOOL fFindName,
508 ICatalogObject** ppiSubsObj
509 )
510{
511 HRESULT hr = S_OK;
512
513 ICatalogCollection* piSubsColl = NULL;
514
515 // get applications collection
516 hr = CpiGetSubscriptionsCollForComponent(pItm->pAssembly, pItm->pComponent, &piSubsColl);
517 ExitOnFailure(hr, "Failed to get collection");
518
519 if (S_FALSE == hr)
520 ExitFunction(); // exit with hr = S_FALSE
521
522 // find application object
523 hr = CpiFindCollectionObject(piSubsColl, fFindId ? pItm->wzID : NULL, fFindName ? pItm->wzName : NULL, ppiSubsObj);
524 ExitOnFailure(hr, "Failed to find object");
525
526 // exit with hr from CpiFindCollectionObject()
527
528LExit:
529 // clean up
530 ReleaseObject(piSubsColl);
531
532 return hr;
533}
534
535static HRESULT AddSubscriptionToActionData(
536 CPI_SUBSCRIPTION* pItm,
537 int iActionType,
538 int iActionCost,
539 LPWSTR* ppwzActionData
540 )
541{
542 HRESULT hr = S_OK;
543
544 // add action information to custom action data
545 hr = WcaWriteIntegerToCaData(iActionType, ppwzActionData);
546 ExitOnFailure(hr, "Failed to add action type to custom action data");
547 hr = WcaWriteIntegerToCaData(iActionCost, ppwzActionData);
548 ExitOnFailure(hr, "Failed to add action cost to custom action data");
549
550 // add application role information to custom action data
551 hr = WcaWriteStringToCaData(pItm->wzKey, ppwzActionData);
552 ExitOnFailure(hr, "Failed to add subscription key to custom action data");
553 hr = WcaWriteStringToCaData(pItm->wzID, ppwzActionData);
554 ExitOnFailure(hr, "Failed to add subscription id to custom action data");
555 hr = WcaWriteStringToCaData(pItm->wzName, ppwzActionData);
556 ExitOnFailure(hr, "Failed to add subscription name to custom action data");
557 hr = WcaWriteStringToCaData(atCreate == iActionType ? pItm->wzEventCLSID : L"", ppwzActionData);
558 ExitOnFailure(hr, "Failed to add assembly tlb path to custom action data");
559 hr = WcaWriteStringToCaData(atCreate == iActionType ? pItm->wzPublisherID : L"", ppwzActionData);
560 ExitOnFailure(hr, "Failed to add assembly proxy-stub dll path to custom action data");
561
562 // add component information to custom action data
563 hr = WcaWriteStringToCaData(pItm->pComponent->wzCLSID, ppwzActionData);
564 ExitOnFailure(hr, "Failed to add application id to custom action data");
565
566 // add application information to custom action data
567 hr = WcaWriteStringToCaData(pItm->pAssembly->pApplication->wzID, ppwzActionData);
568 ExitOnFailure(hr, "Failed to add application id to custom action data");
569
570 // add partition information to custom action data
571 LPCWSTR pwzPartID = pItm->pAssembly->pApplication->pPartition ? pItm->pAssembly->pApplication->pPartition->wzID : L"";
572 hr = WcaWriteStringToCaData(pwzPartID, ppwzActionData);
573 ExitOnFailure(hr, "Failed to add partition id to custom action data");
574
575 // add properties to custom action data
576 hr = CpiAddPropertiesToActionData(atCreate == iActionType ? pItm->iPropertyCount : 0, pItm->pProperties, ppwzActionData);
577 ExitOnFailure(hr, "Failed to add properties to custom action data");
578
579 hr = S_OK;
580
581LExit:
582 return hr;
583}
584
585static HRESULT ComponentFindByKey(
586 CPI_ASSEMBLY_LIST* pAsmList,
587 LPCWSTR pwzKey,
588 CPI_ASSEMBLY** ppAsmItm,
589 CPISCHED_COMPONENT** ppCompItm
590 )
591{
592 for (CPI_ASSEMBLY* pAsmItm = pAsmList->pFirst; pAsmItm; pAsmItm = pAsmItm->pNext)
593 {
594 for (CPISCHED_COMPONENT* pCompItm = pAsmItm->pComponents; pCompItm; pCompItm = pCompItm->pNext)
595 {
596 if (0 == lstrcmpW(pCompItm->wzKey, pwzKey))
597 {
598 *ppAsmItm = pAsmItm;
599 *ppCompItm = pCompItm;
600 return S_OK;
601 }
602 }
603 }
604
605 return S_FALSE;
606}
diff --git a/src/ext/ComPlus/ca/cpsubssched.h b/src/ext/ComPlus/ca/cpsubssched.h
new file mode 100644
index 00000000..83ff1af8
--- /dev/null
+++ b/src/ext/ComPlus/ca/cpsubssched.h
@@ -0,0 +1,62 @@
1#pragma once
2// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
3
4
5struct CPI_SUBSCRIPTION
6{
7 WCHAR wzKey[MAX_DARWIN_KEY + 1];
8 WCHAR wzID[CPI_MAX_GUID + 1];
9 WCHAR wzName[MAX_DARWIN_COLUMN + 1];
10 WCHAR wzEventCLSID[CPI_MAX_GUID + 1];
11 WCHAR wzPublisherID[CPI_MAX_GUID + 1];
12
13 BOOL fObjectNotFound;
14
15 int iPropertyCount;
16 CPI_PROPERTY* pProperties;
17
18 INSTALLSTATE isInstalled, isAction;
19
20 CPI_ASSEMBLY* pAssembly;
21 CPISCHED_COMPONENT* pComponent;
22
23 CPI_SUBSCRIPTION* pNext;
24};
25
26struct CPI_SUBSCRIPTION_LIST
27{
28 CPI_SUBSCRIPTION* pFirst;
29
30 int iInstallCount;
31 int iCommitCount;
32 int iUninstallCount;
33};
34
35
36// function prototypes
37
38void CpiSubscriptionListFree(
39 CPI_SUBSCRIPTION_LIST* pList
40 );
41HRESULT CpiSubscriptionsRead(
42 CPI_ASSEMBLY_LIST* pAsmList,
43 CPI_SUBSCRIPTION_LIST* pSubList
44 );
45HRESULT CpiSubscriptionsVerifyInstall(
46 CPI_SUBSCRIPTION_LIST* pList
47 );
48HRESULT CpiSubscriptionsVerifyUninstall(
49 CPI_SUBSCRIPTION_LIST* pList
50 );
51HRESULT CpiSubscriptionsInstall(
52 CPI_SUBSCRIPTION_LIST* pList,
53 int iRunMode,
54 LPWSTR* ppwzActionData,
55 int* piProgress
56 );
57HRESULT CpiSubscriptionsUninstall(
58 CPI_SUBSCRIPTION_LIST* pList,
59 int iRunMode,
60 LPWSTR* ppwzActionData,
61 int* piProgress
62 );
diff --git a/src/ext/ComPlus/ca/cputilexec.cpp b/src/ext/ComPlus/ca/cputilexec.cpp
new file mode 100644
index 00000000..1c2c8b93
--- /dev/null
+++ b/src/ext/ComPlus/ca/cputilexec.cpp
@@ -0,0 +1,1881 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3#include "precomp.h"
4
5
6// private structs
7
8struct CPI_WELLKNOWN_SID
9{
10 LPCWSTR pwzName;
11 SID_IDENTIFIER_AUTHORITY iaIdentifierAuthority;
12 BYTE nSubAuthorityCount;
13 DWORD dwSubAuthority[8];
14};
15
16
17// well known SIDs
18
19CPI_WELLKNOWN_SID wsWellKnownSids[] = {
20 {L"\\Everyone", SECURITY_WORLD_SID_AUTHORITY, 1, {SECURITY_WORLD_RID, 0, 0, 0, 0, 0, 0, 0}},
21 {L"\\Administrators", SECURITY_NT_AUTHORITY, 2, {SECURITY_BUILTIN_DOMAIN_RID, DOMAIN_ALIAS_RID_ADMINS, 0, 0, 0, 0, 0, 0}},
22 {L"\\LocalSystem", SECURITY_NT_AUTHORITY, 1, {SECURITY_LOCAL_SYSTEM_RID, 0, 0, 0, 0, 0, 0, 0}},
23 {L"\\LocalService", SECURITY_NT_AUTHORITY, 1, {SECURITY_LOCAL_SERVICE_RID, 0, 0, 0, 0, 0, 0, 0}},
24 {L"\\NetworkService", SECURITY_NT_AUTHORITY, 1, {SECURITY_NETWORK_SERVICE_RID, 0, 0, 0, 0, 0, 0, 0}},
25 {L"\\AuthenticatedUser", SECURITY_NT_AUTHORITY, 1, {SECURITY_AUTHENTICATED_USER_RID, 0, 0, 0, 0, 0, 0, 0}},
26 {L"\\Guests", SECURITY_NT_AUTHORITY, 2, {SECURITY_BUILTIN_DOMAIN_RID, DOMAIN_ALIAS_RID_GUESTS, 0, 0, 0, 0, 0, 0}},
27 {L"\\Users", SECURITY_NT_AUTHORITY, 2, {SECURITY_BUILTIN_DOMAIN_RID, DOMAIN_ALIAS_RID_USERS, 0, 0, 0, 0, 0, 0}},
28 {L"\\CREATOR OWNER", SECURITY_NT_AUTHORITY, 1, {SECURITY_CREATOR_OWNER_RID, 0, 0, 0, 0, 0, 0, 0}},
29 {NULL, SECURITY_NULL_SID_AUTHORITY, 0, {0, 0, 0, 0, 0, 0, 0, 0}}
30};
31
32
33// prototypes for private helper functions
34
35static HRESULT FindUserCollectionObjectIndex(
36 ICatalogCollection* piColl,
37 PSID pSid,
38 int* pi
39 );
40static HRESULT CreateSidFromDomainRidPair(
41 PSID pDomainSid,
42 DWORD dwRid,
43 PSID* ppSid
44 );
45static HRESULT InitLsaUnicodeString(
46 PLSA_UNICODE_STRING plusStr,
47 LPCWSTR pwzStr,
48 DWORD dwLen
49 );
50static void FreeLsaUnicodeString(
51 PLSA_UNICODE_STRING plusStr
52 );
53static HRESULT WriteFileAll(
54 HANDLE hFile,
55 PBYTE pbBuffer,
56 DWORD dwBufferLength
57 );
58static HRESULT ReadFileAll(
59 HANDLE hFile,
60 PBYTE pbBuffer,
61 DWORD dwBufferLength
62 );
63
64
65// variables
66
67static ICOMAdminCatalog* gpiCatalog;
68
69
70// function definitions
71
72void CpiExecInitialize()
73{
74 // collections
75 gpiCatalog = NULL;
76}
77
78void CpiExecFinalize()
79{
80 // collections
81 ReleaseObject(gpiCatalog);
82}
83
84HRESULT CpiActionStartMessage(
85 LPWSTR* ppwzActionData,
86 BOOL fSuppress
87 )
88{
89 HRESULT hr = S_OK;
90 UINT er = ERROR_SUCCESS;
91
92 PMSIHANDLE hRec;
93
94 LPWSTR pwzData = NULL;
95
96 // create record
97 hRec = ::MsiCreateRecord(3);
98 ExitOnNull(hRec, hr, E_OUTOFMEMORY, "Failed to create record");
99
100 // action name
101 hr = WcaReadStringFromCaData(ppwzActionData, &pwzData);
102 ExitOnFailure(hr, "Failed to action name");
103
104 er = ::MsiRecordSetStringW(hRec, 1, pwzData);
105 ExitOnFailure(hr = HRESULT_FROM_WIN32(er), "Failed to set action name");
106
107 // description
108 hr = WcaReadStringFromCaData(ppwzActionData, &pwzData);
109 ExitOnFailure(hr, "Failed to description");
110
111 er = ::MsiRecordSetStringW(hRec, 2, pwzData);
112 ExitOnFailure(hr = HRESULT_FROM_WIN32(er), "Failed to set description");
113
114 // template
115 hr = WcaReadStringFromCaData(ppwzActionData, &pwzData);
116 ExitOnFailure(hr, "Failed to template");
117
118 er = ::MsiRecordSetStringW(hRec, 3, pwzData);
119 ExitOnFailure(hr = HRESULT_FROM_WIN32(er), "Failed to set template");
120
121 // message
122 if (!fSuppress)
123 {
124 er = WcaProcessMessage(INSTALLMESSAGE_ACTIONSTART, hRec);
125 if (0 == er || IDOK == er || IDYES == er)
126 {
127 hr = S_OK;
128 }
129 else if (IDABORT == er || IDCANCEL == er)
130 {
131 WcaSetReturnValue(ERROR_INSTALL_USEREXIT); // note that the user said exit
132 hr = S_FALSE;
133 }
134 else
135 hr = E_UNEXPECTED;
136 }
137
138LExit:
139 // clean up
140 ReleaseStr(pwzData);
141
142 return hr;
143}
144
145HRESULT CpiActionDataMessage(
146 DWORD cArgs,
147 ...
148 )
149{
150 HRESULT hr = S_OK;
151 UINT er = ERROR_SUCCESS;
152
153 PMSIHANDLE hRec;
154 va_list args;
155
156 // record
157 hRec = ::MsiCreateRecord(cArgs);
158 ExitOnNull(hRec, hr, E_OUTOFMEMORY, "Failed to create record");
159
160 va_start(args, cArgs);
161 for (DWORD i = 1; i <= cArgs; i++)
162 {
163 LPCWSTR pwzArg = va_arg(args, WCHAR*);
164 if (pwzArg && *pwzArg)
165 {
166 er = ::MsiRecordSetStringW(hRec, i, pwzArg);
167 ExitOnFailure(hr = HRESULT_FROM_WIN32(er), "Failed to set record field string");
168 }
169 }
170 va_end(args);
171
172 // message
173 er = WcaProcessMessage(INSTALLMESSAGE_ACTIONDATA, hRec);
174 if (0 == er || IDOK == er || IDYES == er)
175 {
176 hr = S_OK;
177 }
178 else if (IDABORT == er || IDCANCEL == er)
179 {
180 WcaSetReturnValue(ERROR_INSTALL_USEREXIT); // note that the user said exit
181 hr = S_FALSE;
182 }
183 else
184 hr = E_UNEXPECTED;
185
186LExit:
187 return hr;
188}
189
190HRESULT CpiExecGetAdminCatalog(
191 ICOMAdminCatalog** ppiCatalog
192 )
193{
194 HRESULT hr = S_OK;
195
196 if (!gpiCatalog)
197 {
198 // get collection
199 hr = ::CoCreateInstance(CLSID_COMAdminCatalog, NULL, CLSCTX_ALL, IID_ICOMAdminCatalog, (void**)&gpiCatalog);
200 ExitOnFailure(hr, "Failed to create COM+ admin catalog object");
201 }
202
203 // return value
204 gpiCatalog->AddRef();
205 *ppiCatalog = gpiCatalog;
206
207 hr = S_OK;
208
209LExit:
210 return hr;
211}
212
213HRESULT CpiLogCatalogErrorInfo()
214{
215 HRESULT hr = S_OK;
216
217 ICOMAdminCatalog* piCatalog = NULL;
218 ICatalogCollection* piErrColl = NULL;
219 IDispatch* piDisp = NULL;
220 ICatalogObject* piObj = NULL;
221
222 LPWSTR pwzName = NULL;
223 LPWSTR pwzErrorCode = NULL;
224 LPWSTR pwzMajorRef = NULL;
225 LPWSTR pwzMinorRef = NULL;
226
227 // get catalog
228 hr = CpiExecGetAdminCatalog(&piCatalog);
229 ExitOnFailure(hr, "Failed to get COM+ admin catalog");
230
231 // get error info collection
232 hr = CpiExecGetCatalogCollection(L"ErrorInfo", &piErrColl);
233 ExitOnFailure(hr, "Failed to get error info collection");
234
235 // loop objects
236 long lCnt;
237 hr = piErrColl->get_Count(&lCnt);
238 ExitOnFailure(hr, "Failed to get to number of items in collection");
239
240 for (long i = 0; i < lCnt; i++)
241 {
242 // get ICatalogObject interface
243 hr = piErrColl->get_Item(i, &piDisp);
244 ExitOnFailure(hr, "Failed to get item from partitions collection");
245
246 hr = piDisp->QueryInterface(IID_ICatalogObject, (void**)&piObj);
247 ExitOnFailure(hr, "Failed to get IID_ICatalogObject interface");
248
249 // get properties
250 hr = CpiGetCollectionObjectValue(piObj, L"Name", &pwzName);
251 ExitOnFailure(hr, "Failed to get name");
252 hr = CpiGetCollectionObjectValue(piObj, L"ErrorCode", &pwzErrorCode);
253 ExitOnFailure(hr, "Failed to get error code");
254 hr = CpiGetCollectionObjectValue(piObj, L"MajorRef", &pwzMajorRef);
255 ExitOnFailure(hr, "Failed to get major ref");
256 hr = CpiGetCollectionObjectValue(piObj, L"MinorRef", &pwzMinorRef);
257 ExitOnFailure(hr, "Failed to get minor ref");
258
259 // write to log
260 WcaLog(LOGMSG_STANDARD, "ErrorInfo: Name='%S', ErrorCode='%S', MajorRef='%S', MinorRef='%S'",
261 pwzName, pwzErrorCode, pwzMajorRef, pwzMinorRef);
262
263 // clean up
264 ReleaseNullObject(piDisp);
265 ReleaseNullObject(piObj);
266 }
267
268 hr = S_OK;
269
270LExit:
271 // clean up
272 ReleaseObject(piCatalog);
273 ReleaseObject(piErrColl);
274 ReleaseObject(piDisp);
275 ReleaseObject(piObj);
276
277 ReleaseStr(pwzName);
278 ReleaseStr(pwzErrorCode);
279 ReleaseStr(pwzMajorRef);
280 ReleaseStr(pwzMinorRef);
281
282 return hr;
283}
284
285HRESULT CpiExecGetCatalogCollection(
286 LPCWSTR pwzName,
287 ICatalogCollection** ppiColl
288 )
289{
290 HRESULT hr = S_OK;
291
292 ICOMAdminCatalog* piCatalog = NULL;
293 IDispatch* piDisp = NULL;
294
295 BSTR bstrName = NULL;
296
297 // copy name string
298 bstrName = ::SysAllocString(pwzName);
299 ExitOnNull(bstrName, hr, E_OUTOFMEMORY, "Failed to allocate BSTR for collection name");
300
301 // get catalog
302 hr = CpiExecGetAdminCatalog(&piCatalog);
303 ExitOnFailure(hr, "Failed to get COM+ admin catalog");
304
305 // get collecton from catalog
306 hr = piCatalog->GetCollection(bstrName, &piDisp);
307 ExitOnFailure(hr, "Failed to get collection");
308
309 hr = piDisp->QueryInterface(IID_ICatalogCollection, (void**)ppiColl);
310 ExitOnFailure(hr, "Failed to get IID_ICatalogCollection interface");
311
312 // populate collection
313 hr = (*ppiColl)->Populate();
314 if (COMADMIN_E_OBJECTERRORS == hr)
315 CpiLogCatalogErrorInfo();
316 ExitOnFailure(hr, "Failed to populate collection");
317
318 hr = S_OK;
319
320LExit:
321 // clean up
322 ReleaseObject(piCatalog);
323 ReleaseObject(piDisp);
324 ReleaseBSTR(bstrName);
325
326 return hr;
327}
328
329HRESULT CpiExecGetCatalogCollection(
330 ICatalogCollection* piColl,
331 ICatalogObject* piObj,
332 LPCWSTR pwzName,
333 ICatalogCollection** ppiColl
334 )
335{
336 HRESULT hr = S_OK;
337
338 ICOMAdminCatalog* piCatalog = NULL;
339 IDispatch* piDisp = NULL;
340
341 BSTR bstrName = NULL;
342
343 VARIANT vtKey;
344 ::VariantInit(&vtKey);
345
346 // copy name string
347 bstrName = ::SysAllocString(pwzName);
348 ExitOnNull(bstrName, hr, E_OUTOFMEMORY, "Failed to allocate BSTR for collection name");
349
350 // get catalog
351 hr = CpiExecGetAdminCatalog(&piCatalog);
352 ExitOnFailure(hr, "Failed to get COM+ admin catalog");
353
354 // get key
355 hr = piObj->get_Key(&vtKey);
356 ExitOnFailure(hr, "Failed to get object key");
357
358 // get collecton from catalog
359 hr = piColl->GetCollection(bstrName, vtKey, &piDisp);
360 ExitOnFailure(hr, "Failed to get collection");
361
362 hr = piDisp->QueryInterface(IID_ICatalogCollection, (void**)ppiColl);
363 ExitOnFailure(hr, "Failed to get IID_ICatalogCollection interface");
364
365 // populate collection
366 hr = (*ppiColl)->Populate();
367 if (COMADMIN_E_OBJECTERRORS == hr)
368 CpiLogCatalogErrorInfo();
369 ExitOnFailure(hr, "Failed to populate collection");
370
371 hr = S_OK;
372
373LExit:
374 // clean up
375 ReleaseObject(piCatalog);
376 ReleaseObject(piDisp);
377 ReleaseBSTR(bstrName);
378 ::VariantClear(&vtKey);
379
380 return hr;
381}
382
383HRESULT CpiAddCollectionObject(
384 ICatalogCollection* piColl,
385 ICatalogObject** ppiObj
386 )
387{
388 HRESULT hr = S_OK;
389
390 IDispatch* piDisp = NULL;
391
392 hr = piColl->Add(&piDisp);
393 ExitOnFailure(hr, "Failed to add object to collection");
394
395 hr = piDisp->QueryInterface(IID_ICatalogObject, (void**)ppiObj);
396 ExitOnFailure(hr, "Failed to get IID_ICatalogObject interface");
397
398 hr = S_OK;
399
400LExit:
401 // clean up
402 ReleaseObject(piDisp);
403
404 return hr;
405}
406
407HRESULT CpiPutCollectionObjectValue(
408 ICatalogObject* piObj,
409 LPCWSTR pwzPropName,
410 LPCWSTR pwzValue
411 )
412{
413 HRESULT hr = S_OK;
414
415 BSTR bstrPropName = NULL;
416
417 VARIANT vtVal;
418 ::VariantInit(&vtVal);
419
420 // allocate property name string
421 bstrPropName = ::SysAllocString(pwzPropName);
422 ExitOnNull(bstrPropName, hr, E_OUTOFMEMORY, "Failed to allocate property name string");
423
424 // prepare value variant
425 vtVal.vt = VT_BSTR;
426 vtVal.bstrVal = ::SysAllocString(pwzValue);
427 ExitOnNull(vtVal.bstrVal, hr, E_OUTOFMEMORY, "Failed to allocate property value string");
428
429 // put value
430 hr = piObj->put_Value(bstrPropName, vtVal);
431 ExitOnFailure(hr, "Failed to put property value");
432
433 hr = S_OK;
434
435LExit:
436 // clean up
437 ReleaseBSTR(bstrPropName);
438 ::VariantClear(&vtVal);
439
440 return hr;
441}
442
443HRESULT CpiPutCollectionObjectValues(
444 ICatalogObject* piObj,
445 CPI_PROPERTY* pPropList
446 )
447{
448 HRESULT hr = S_OK;
449
450 for (CPI_PROPERTY* pItm = pPropList; pItm; pItm = pItm->pNext)
451 {
452 // set property
453 hr = CpiPutCollectionObjectValue(piObj, pItm->wzName, pItm->pwzValue);
454 ExitOnFailure(hr, "Failed to set object property value, name: %S", pItm->wzName);
455 }
456
457 hr = S_OK;
458
459LExit:
460 return hr;
461}
462
463HRESULT CpiGetCollectionObjectValue(
464 ICatalogObject* piObj,
465 LPCWSTR szPropName,
466 LPWSTR* ppwzValue
467 )
468{
469 HRESULT hr = S_OK;
470
471 BSTR bstrPropName = NULL;
472
473 VARIANT vtVal;
474 ::VariantInit(&vtVal);
475
476 // allocate property name string
477 bstrPropName = ::SysAllocString(szPropName);
478 ExitOnNull(bstrPropName, hr, E_OUTOFMEMORY, "Failed to allocate property name string");
479
480 // get value
481 hr = piObj->get_Value(bstrPropName, &vtVal);
482 ExitOnFailure(hr, "Failed to get property value");
483
484 hr = ::VariantChangeType(&vtVal, &vtVal, 0, VT_BSTR);
485 ExitOnFailure(hr, "Failed to change variant type");
486
487 hr = StrAllocString(ppwzValue, vtVal.bstrVal, ::SysStringLen(vtVal.bstrVal));
488 ExitOnFailure(hr, "Failed to allocate memory for value string");
489
490 hr = S_OK;
491
492LExit:
493 // clean up
494 ReleaseBSTR(bstrPropName);
495 ::VariantClear(&vtVal);
496
497 return hr;
498}
499
500HRESULT CpiResetObjectProperty(
501 ICatalogCollection* piColl,
502 ICatalogObject* piObj,
503 LPCWSTR pwzPropName
504 )
505{
506 HRESULT hr = S_OK;
507
508 BSTR bstrPropName = NULL;
509
510 long lChanges = 0;
511
512 VARIANT vtVal;
513 ::VariantInit(&vtVal);
514
515 // allocate property name string
516 bstrPropName = ::SysAllocString(pwzPropName);
517 ExitOnNull(bstrPropName, hr, E_OUTOFMEMORY, "Failed to allocate deleteable property name string");
518
519 // get value
520 hr = piObj->get_Value(bstrPropName, &vtVal);
521 ExitOnFailure(hr, "Failed to get deleteable property value");
522
523 hr = ::VariantChangeType(&vtVal, &vtVal, 0, VT_BOOL);
524 ExitOnFailure(hr, "Failed to change variant type");
525
526 // if the deleteable property is set
527 if (VARIANT_FALSE == vtVal.boolVal)
528 {
529 // clear property
530 vtVal.boolVal = VARIANT_TRUE;
531
532 hr = piObj->put_Value(bstrPropName, vtVal);
533 ExitOnFailure(hr, "Failed to get property value");
534
535 // save changes
536 hr = piColl->SaveChanges(&lChanges);
537 if (COMADMIN_E_OBJECTERRORS == hr)
538 CpiLogCatalogErrorInfo();
539 ExitOnFailure(hr, "Failed to save changes");
540 }
541
542 hr = S_OK;
543
544LExit:
545 // clean up
546 ReleaseBSTR(bstrPropName);
547 ::VariantClear(&vtVal);
548
549 return hr;
550}
551
552HRESULT CpiRemoveCollectionObject(
553 ICatalogCollection* piColl,
554 LPCWSTR pwzID,
555 LPCWSTR pwzName,
556 BOOL fResetDeleteable
557 )
558{
559 HRESULT hr = S_OK;
560
561 IDispatch* piDisp = NULL;
562 ICatalogObject* piObj = NULL;
563
564 BOOL fMatch = FALSE;
565
566 VARIANT vtVal;
567 ::VariantInit(&vtVal);
568
569 long lCnt;
570 hr = piColl->get_Count(&lCnt);
571 ExitOnFailure(hr, "Failed to get to number of items in collection");
572
573 for (long i = 0; i < lCnt; i++)
574 {
575 // get ICatalogObject interface
576 hr = piColl->get_Item(i, &piDisp);
577 ExitOnFailure(hr, "Failed to get object from collection");
578
579 hr = piDisp->QueryInterface(IID_ICatalogObject, (void**)&piObj);
580 ExitOnFailure(hr, "Failed to get IID_ICatalogObject interface");
581
582 // compare id
583 if (pwzID && *pwzID)
584 {
585 hr = piObj->get_Key(&vtVal);
586 ExitOnFailure(hr, "Failed to get key");
587
588 hr = ::VariantChangeType(&vtVal, &vtVal, 0, VT_BSTR);
589 ExitOnFailure(hr, "Failed to change variant type");
590
591 if (0 == lstrcmpiW(vtVal.bstrVal, pwzID))
592 fMatch = TRUE;
593
594 ::VariantClear(&vtVal);
595 }
596
597 // compare name
598 if (pwzName && *pwzName)
599 {
600 hr = piObj->get_Name(&vtVal);
601 ExitOnFailure(hr, "Failed to get name");
602
603 hr = ::VariantChangeType(&vtVal, &vtVal, 0, VT_BSTR);
604 ExitOnFailure(hr, "Failed to change variant type");
605
606 if (0 == lstrcmpW(vtVal.bstrVal, pwzName))
607 fMatch = TRUE;
608
609 ::VariantClear(&vtVal);
610 }
611
612 // if it's a match, remove it
613 if (fMatch)
614 {
615 if (fResetDeleteable)
616 {
617 // reset deleteable property, if set
618 hr = CpiResetObjectProperty(piColl, piObj, L"Deleteable");
619 ExitOnFailure(hr, "Failed to reset deleteable property");
620 }
621
622 hr = piColl->Remove(i);
623 ExitOnFailure(hr, "Failed to remove item from collection");
624 break;
625 }
626
627 // release interface pointers
628 ReleaseNullObject(piDisp);
629 ReleaseNullObject(piObj);
630 }
631
632 hr = S_OK;
633
634LExit:
635 // clean up
636 ReleaseObject(piDisp);
637 ReleaseObject(piObj);
638
639 ::VariantClear(&vtVal);
640
641 return hr;
642}
643
644HRESULT CpiRemoveUserCollectionObject(
645 ICatalogCollection* piColl,
646 PSID pSid
647 )
648{
649 HRESULT hr = S_OK;
650
651 int i = 0;
652
653 // find index
654 hr = FindUserCollectionObjectIndex(piColl, pSid, &i);
655 ExitOnFailure(hr, "Failed to find user collection index");
656
657 if (S_FALSE == hr)
658 ExitFunction(); // not found, exit with hr = S_FALSE
659
660 // remove object
661 hr = piColl->Remove(i);
662 ExitOnFailure(hr, "Failed to remove object from collection");
663
664 hr = S_OK;
665
666LExit:
667 return hr;
668}
669
670HRESULT CpiFindCollectionObjectByStringKey(
671 ICatalogCollection* piColl,
672 LPCWSTR pwzKey,
673 ICatalogObject** ppiObj
674 )
675{
676 HRESULT hr = S_OK;
677
678 IDispatch* piDisp = NULL;
679 ICatalogObject* piObj = NULL;
680
681 VARIANT vtVal;
682 ::VariantInit(&vtVal);
683
684 long lCnt;
685 hr = piColl->get_Count(&lCnt);
686 ExitOnFailure(hr, "Failed to get to number of items in collection");
687
688 for (long i = 0; i < lCnt; i++)
689 {
690 // get ICatalogObject interface
691 hr = piColl->get_Item(i, &piDisp);
692 ExitOnFailure(hr, "Failed to get object from collection");
693
694 hr = piDisp->QueryInterface(IID_ICatalogObject, (void**)&piObj);
695 ExitOnFailure(hr, "Failed to get IID_ICatalogObject interface");
696
697 // compare key
698 hr = piObj->get_Key(&vtVal);
699 ExitOnFailure(hr, "Failed to get key");
700
701 hr = ::VariantChangeType(&vtVal, &vtVal, 0, VT_BSTR);
702 ExitOnFailure(hr, "Failed to change variant type");
703
704 if (0 == lstrcmpiW(vtVal.bstrVal, pwzKey))
705 {
706 if (ppiObj)
707 {
708 *ppiObj = piObj;
709 piObj = NULL;
710 }
711 ExitFunction1(hr = S_OK);
712 }
713
714 // clean up
715 ReleaseNullObject(piDisp);
716 ReleaseNullObject(piObj);
717
718 ::VariantClear(&vtVal);
719 }
720
721 hr = S_FALSE;
722
723LExit:
724 // clean up
725 ReleaseObject(piDisp);
726 ReleaseObject(piObj);
727
728 ::VariantClear(&vtVal);
729
730 return hr;
731}
732
733HRESULT CpiFindCollectionObjectByIntegerKey(
734 ICatalogCollection* piColl,
735 long lKey,
736 ICatalogObject** ppiObj
737 )
738{
739 HRESULT hr = S_OK;
740
741 IDispatch* piDisp = NULL;
742 ICatalogObject* piObj = NULL;
743
744 VARIANT vtVal;
745 ::VariantInit(&vtVal);
746
747 long lCnt;
748 hr = piColl->get_Count(&lCnt);
749 ExitOnFailure(hr, "Failed to get to number of items in collection");
750
751 for (long i = 0; i < lCnt; i++)
752 {
753 // get ICatalogObject interface
754 hr = piColl->get_Item(i, &piDisp);
755 ExitOnFailure(hr, "Failed to get object from collection");
756
757 hr = piDisp->QueryInterface(IID_ICatalogObject, (void**)&piObj);
758 ExitOnFailure(hr, "Failed to get IID_ICatalogObject interface");
759
760 // compare key
761 hr = piObj->get_Key(&vtVal);
762 ExitOnFailure(hr, "Failed to get key");
763
764 hr = ::VariantChangeType(&vtVal, &vtVal, 0, VT_I4);
765 ExitOnFailure(hr, "Failed to change variant type");
766
767 if (vtVal.lVal == lKey)
768 {
769 if (ppiObj)
770 {
771 *ppiObj = piObj;
772 piObj = NULL;
773 }
774 ExitFunction1(hr = S_OK);
775 }
776
777 // clean up
778 ReleaseNullObject(piDisp);
779 ReleaseNullObject(piObj);
780
781 ::VariantClear(&vtVal);
782 }
783
784 hr = S_FALSE;
785
786LExit:
787 // clean up
788 ReleaseObject(piDisp);
789 ReleaseObject(piObj);
790
791 ::VariantClear(&vtVal);
792
793 return hr;
794}
795
796HRESULT CpiFindCollectionObjectByName(
797 ICatalogCollection* piColl,
798 LPCWSTR pwzName,
799 ICatalogObject** ppiObj
800 )
801{
802 HRESULT hr = S_OK;
803
804 IDispatch* piDisp = NULL;
805 ICatalogObject* piObj = NULL;
806
807 VARIANT vtVal;
808 ::VariantInit(&vtVal);
809
810 long lCnt;
811 hr = piColl->get_Count(&lCnt);
812 ExitOnFailure(hr, "Failed to get to number of items in collection");
813
814 for (long i = 0; i < lCnt; i++)
815 {
816 // get ICatalogObject interface
817 hr = piColl->get_Item(i, &piDisp);
818 ExitOnFailure(hr, "Failed to get object from collection");
819
820 hr = piDisp->QueryInterface(IID_ICatalogObject, (void**)&piObj);
821 ExitOnFailure(hr, "Failed to get IID_ICatalogObject interface");
822
823 // compare key
824 hr = piObj->get_Name(&vtVal);
825 ExitOnFailure(hr, "Failed to get key");
826
827 hr = ::VariantChangeType(&vtVal, &vtVal, 0, VT_BSTR);
828 ExitOnFailure(hr, "Failed to change variant type");
829
830 if (0 == lstrcmpW(vtVal.bstrVal, pwzName))
831 {
832 if (ppiObj)
833 {
834 *ppiObj = piObj;
835 piObj = NULL;
836 }
837 ExitFunction1(hr = S_OK);
838 }
839
840 // clean up
841 ReleaseNullObject(piDisp);
842 ReleaseNullObject(piObj);
843
844 ::VariantClear(&vtVal);
845 }
846
847 hr = S_FALSE;
848
849LExit:
850 // clean up
851 ReleaseObject(piDisp);
852 ReleaseObject(piObj);
853
854 ::VariantClear(&vtVal);
855
856 return hr;
857}
858
859HRESULT CpiFindUserCollectionObject(
860 ICatalogCollection* piColl,
861 PSID pSid,
862 ICatalogObject** ppiObj
863 )
864{
865 HRESULT hr = S_OK;
866
867 int i = 0;
868
869 IDispatch* piDisp = NULL;
870
871 // find index
872 hr = FindUserCollectionObjectIndex(piColl, pSid, &i);
873 ExitOnFailure(hr, "Failed to find user collection index");
874
875 if (S_FALSE == hr)
876 ExitFunction(); // not found, exit with hr = S_FALSE
877
878 // get object
879 if (ppiObj)
880 {
881 hr = piColl->get_Item(i, &piDisp);
882 ExitOnFailure(hr, "Failed to get object from collection");
883
884 hr = piDisp->QueryInterface(IID_ICatalogObject, (void**)ppiObj);
885 ExitOnFailure(hr, "Failed to get IID_ICatalogObject interface");
886 }
887
888 hr = S_OK;
889
890LExit:
891 // clean up
892 ReleaseObject(piDisp);
893
894 return hr;
895}
896
897HRESULT CpiExecGetPartitionsCollection(
898 ICatalogCollection** ppiPartColl
899 )
900{
901 HRESULT hr = S_OK;
902
903 // get collection
904 hr = CpiExecGetCatalogCollection(L"Partitions", ppiPartColl);
905 ExitOnFailure(hr, "Failed to get catalog collection");
906
907 hr = S_OK;
908
909LExit:
910 return hr;
911}
912
913HRESULT CpiGetPartitionRolesCollection(
914 LPCWSTR pwzPartID,
915 ICatalogCollection** ppiRolesColl
916 )
917{
918 HRESULT hr = S_OK;
919
920 ICatalogCollection* piPartColl = NULL;
921 ICatalogObject* piPartObj = NULL;
922
923 // get partitions collection
924 hr = CpiExecGetPartitionsCollection(&piPartColl);
925 ExitOnFailure(hr, "Failed to get partitions collection");
926
927 if (S_FALSE == hr)
928 ExitFunction(); // partitions collection not found, exit with hr = S_FALSE
929
930 // find object
931 hr = CpiFindCollectionObjectByStringKey(piPartColl, pwzPartID, &piPartObj);
932 ExitOnFailure(hr, "Failed to find collection object");
933
934 if (S_FALSE == hr)
935 ExitFunction(); // partition not found, exit with hr = S_FALSE
936
937 // get roles collection
938 hr = CpiExecGetCatalogCollection(piPartColl, piPartObj, L"RolesForPartition", ppiRolesColl);
939 ExitOnFailure(hr, "Failed to get catalog collection");
940
941 hr = S_OK;
942
943LExit:
944 // clean up
945 ReleaseObject(piPartColl);
946 ReleaseObject(piPartObj);
947
948 return hr;
949}
950
951HRESULT CpiGetUsersInPartitionRoleCollection(
952 LPCWSTR pwzPartID,
953 LPCWSTR pwzRoleName,
954 ICatalogCollection** ppiUsrInRoleColl
955 )
956{
957 HRESULT hr = S_OK;
958
959 ICatalogCollection* piRoleColl = NULL;
960 ICatalogObject* piRoleObj = NULL;
961
962 // get roles collection
963 hr = CpiGetPartitionRolesCollection(pwzPartID, &piRoleColl);
964 ExitOnFailure(hr, "Failed to get roles collection");
965
966 if (S_FALSE == hr)
967 ExitFunction(); // partition roles collection not found, exit with hr = S_FALSE
968
969 // find object
970 hr = CpiFindCollectionObjectByName(piRoleColl, pwzRoleName, &piRoleObj);
971 ExitOnFailure(hr, "Failed to find collection object");
972
973 if (S_FALSE == hr)
974 ExitFunction(); // user not found, exit with hr = S_FALSE
975
976 // get roles collection
977 hr = CpiExecGetCatalogCollection(piRoleColl, piRoleObj, L"UsersInPartitionRole", ppiUsrInRoleColl);
978 ExitOnFailure(hr, "Failed to get catalog collection");
979
980 hr = S_OK;
981
982LExit:
983 // clean up
984 ReleaseObject(piRoleColl);
985 ReleaseObject(piRoleObj);
986
987 return hr;
988}
989
990HRESULT CpiGetPartitionUsersCollection(
991 ICatalogCollection** ppiUserColl
992 )
993{
994 HRESULT hr = S_OK;
995
996 // get roles collection
997 hr = CpiExecGetCatalogCollection(L"PartitionUsers", ppiUserColl);
998 ExitOnFailure(hr, "Failed to get catalog collection");
999
1000 hr = S_OK;
1001
1002LExit:
1003 return hr;
1004}
1005
1006HRESULT CpiExecGetApplicationsCollection(
1007 LPCWSTR pwzPartID,
1008 ICatalogCollection** ppiAppColl
1009 )
1010{
1011 HRESULT hr = S_OK;
1012
1013 ICOMAdminCatalog* piCatalog = NULL;
1014 ICOMAdminCatalog2* piCatalog2 = NULL;
1015 BSTR bstrGlobPartID = NULL;
1016
1017 ICatalogCollection* piPartColl = NULL;
1018 ICatalogObject* piPartObj = NULL;
1019
1020 // get catalog
1021 hr = CpiExecGetAdminCatalog(&piCatalog);
1022 ExitOnFailure(hr, "Failed to get COM+ admin catalog");
1023
1024 // get ICOMAdminCatalog2 interface
1025 hr = piCatalog->QueryInterface(IID_ICOMAdminCatalog2, (void**)&piCatalog2);
1026
1027 // COM+ 1.5 or later
1028 if (E_NOINTERFACE != hr)
1029 {
1030 ExitOnFailure(hr, "Failed to get IID_ICOMAdminCatalog2 interface");
1031
1032 // partition id
1033 if (!pwzPartID || !*pwzPartID)
1034 {
1035 // get global partition id
1036 hr = piCatalog2->get_GlobalPartitionID(&bstrGlobPartID);
1037 ExitOnFailure(hr, "Failed to get global partition id");
1038 }
1039
1040 // get partitions collection
1041 hr = CpiExecGetPartitionsCollection(&piPartColl);
1042 ExitOnFailure(hr, "Failed to get partitions collection");
1043
1044 // find object
1045 hr = CpiFindCollectionObjectByStringKey(piPartColl, bstrGlobPartID ? bstrGlobPartID : pwzPartID, &piPartObj);
1046 ExitOnFailure(hr, "Failed to find collection object");
1047
1048 if (S_FALSE == hr)
1049 ExitFunction(); // partition not found, exit with hr = S_FALSE
1050
1051 // get applications collection
1052 hr = CpiExecGetCatalogCollection(piPartColl, piPartObj, L"Applications", ppiAppColl);
1053 ExitOnFailure(hr, "Failed to get catalog collection for partition");
1054 }
1055
1056 // COM+ pre 1.5
1057 else
1058 {
1059 // this version of COM+ does not support partitions, make sure a partition was not specified
1060 if (pwzPartID && *pwzPartID)
1061 ExitOnFailure(hr = E_FAIL, "Partitions are not supported by this version of COM+");
1062
1063 // get applications collection
1064 hr = CpiExecGetCatalogCollection(L"Applications", ppiAppColl);
1065 ExitOnFailure(hr, "Failed to get catalog collection");
1066 }
1067
1068 hr = S_OK;
1069
1070LExit:
1071 // clean up
1072 ReleaseObject(piCatalog);
1073 ReleaseObject(piCatalog2);
1074 ReleaseBSTR(bstrGlobPartID);
1075
1076 ReleaseObject(piPartColl);
1077 ReleaseObject(piPartObj);
1078
1079 return hr;
1080}
1081
1082HRESULT CpiGetRolesCollection(
1083 LPCWSTR pwzPartID,
1084 LPCWSTR pwzAppID,
1085 ICatalogCollection** ppiRolesColl
1086 )
1087{
1088 HRESULT hr = S_OK;
1089
1090 ICatalogCollection* piAppColl = NULL;
1091 ICatalogObject* piAppObj = NULL;
1092
1093 // get applications collection
1094 hr = CpiExecGetApplicationsCollection(pwzPartID, &piAppColl);
1095 ExitOnFailure(hr, "Failed to get applications collection");
1096
1097 if (S_FALSE == hr)
1098 ExitFunction(); // applications collection not found, exit with hr = S_FALSE
1099
1100 // find object
1101 hr = CpiFindCollectionObjectByStringKey(piAppColl, pwzAppID, &piAppObj);
1102 ExitOnFailure(hr, "Failed to find collection object");
1103
1104 if (S_FALSE == hr)
1105 ExitFunction(); // application not found, exit with hr = S_FALSE
1106
1107 // get roles collection
1108 hr = CpiExecGetCatalogCollection(piAppColl, piAppObj, L"Roles", ppiRolesColl);
1109 ExitOnFailure(hr, "Failed to catalog collection");
1110
1111 hr = S_OK;
1112
1113LExit:
1114 // clean up
1115 ReleaseObject(piAppColl);
1116 ReleaseObject(piAppObj);
1117
1118 return hr;
1119}
1120
1121HRESULT CpiGetUsersInRoleCollection(
1122 LPCWSTR pwzPartID,
1123 LPCWSTR pwzAppID,
1124 LPCWSTR pwzRoleName,
1125 ICatalogCollection** ppiUsrInRoleColl
1126 )
1127{
1128 HRESULT hr = S_OK;
1129
1130 ICatalogCollection* piRoleColl = NULL;
1131 ICatalogObject* piRoleObj = NULL;
1132
1133 // get roles collection
1134 hr = CpiGetRolesCollection(pwzPartID, pwzAppID, &piRoleColl);
1135 ExitOnFailure(hr, "Failed to get roles collection");
1136
1137 if (S_FALSE == hr)
1138 ExitFunction(); // roles collection not found, exit with hr = S_FALSE
1139
1140 // find object
1141 hr = CpiFindCollectionObjectByName(piRoleColl, pwzRoleName, &piRoleObj);
1142 ExitOnFailure(hr, "Failed to find collection object");
1143
1144 if (S_FALSE == hr)
1145 ExitFunction(); // role not found, exit with hr = S_FALSE
1146
1147 // get roles collection
1148 hr = CpiExecGetCatalogCollection(piRoleColl, piRoleObj, L"UsersInRole", ppiUsrInRoleColl);
1149 ExitOnFailure(hr, "Failed to get catalog collection");
1150
1151 hr = S_OK;
1152
1153LExit:
1154 // clean up
1155 ReleaseObject(piRoleColl);
1156 ReleaseObject(piRoleObj);
1157
1158 return hr;
1159}
1160
1161HRESULT CpiGetComponentsCollection(
1162 LPCWSTR pwzPartID,
1163 LPCWSTR pwzAppID,
1164 ICatalogCollection** ppiCompsColl
1165 )
1166{
1167 HRESULT hr = S_OK;
1168
1169 ICatalogCollection* piAppColl = NULL;
1170 ICatalogObject* piAppObj = NULL;
1171
1172 // get applications collection
1173 hr = CpiExecGetApplicationsCollection(pwzPartID, &piAppColl);
1174 ExitOnFailure(hr, "Failed to get applications collection");
1175
1176 if (S_FALSE == hr)
1177 ExitFunction(); // applications collection not found, exit with hr = S_FALSE
1178
1179 // find object
1180 hr = CpiFindCollectionObjectByStringKey(piAppColl, pwzAppID, &piAppObj);
1181 ExitOnFailure(hr, "Failed to find collection object");
1182
1183 if (S_FALSE == hr)
1184 ExitFunction(); // application not found, exit with hr = S_FALSE
1185
1186 // get components collection
1187 hr = CpiExecGetCatalogCollection(piAppColl, piAppObj, L"Components", ppiCompsColl);
1188 ExitOnFailure(hr, "Failed to get catalog collection");
1189
1190 hr = S_OK;
1191
1192LExit:
1193 // clean up
1194 ReleaseObject(piAppColl);
1195 ReleaseObject(piAppObj);
1196
1197 return hr;
1198}
1199
1200HRESULT CpiGetInterfacesCollection(
1201 ICatalogCollection* piCompColl,
1202 ICatalogObject* piCompObj,
1203 ICatalogCollection** ppiIntfColl
1204 )
1205{
1206 HRESULT hr = S_OK;
1207
1208 // get interfaces collection
1209 hr = CpiExecGetCatalogCollection(piCompColl, piCompObj, L"InterfacesForComponent", ppiIntfColl);
1210 ExitOnFailure(hr, "Failed to get catalog collection");
1211
1212 hr = S_OK;
1213
1214LExit:
1215 return hr;
1216}
1217
1218HRESULT CpiGetMethodsCollection(
1219 ICatalogCollection* piIntfColl,
1220 ICatalogObject* piIntfObj,
1221 ICatalogCollection** ppiMethColl
1222 )
1223{
1224 HRESULT hr = S_OK;
1225
1226 // get interfaces collection
1227 hr = CpiExecGetCatalogCollection(piIntfColl, piIntfObj, L"MethodsForInterface", ppiMethColl);
1228 ExitOnFailure(hr, "Failed to get catalog collection");
1229
1230 hr = S_OK;
1231
1232LExit:
1233 return hr;
1234}
1235
1236HRESULT CpiGetSubscriptionsCollection(
1237 LPCWSTR pwzPartID,
1238 LPCWSTR pwzAppID,
1239 LPCWSTR pwzCompCLSID,
1240 ICatalogCollection** ppiSubsColl
1241 )
1242{
1243 HRESULT hr = S_OK;
1244
1245 ICatalogCollection* piCompColl = NULL;
1246 ICatalogObject* piCompObj = NULL;
1247
1248 // get components collection
1249 hr = CpiGetComponentsCollection(pwzPartID, pwzAppID, &piCompColl);
1250 ExitOnFailure(hr, "Failed to get components collection");
1251
1252 if (S_FALSE == hr)
1253 ExitFunction(); // components collection not found, exit with hr = S_FALSE
1254
1255 // find object
1256 hr = CpiFindCollectionObjectByStringKey(piCompColl, pwzCompCLSID, &piCompObj);
1257 ExitOnFailure(hr, "Failed to find collection object");
1258
1259 if (S_FALSE == hr)
1260 ExitFunction(); // component not found, exit with hr = S_FALSE
1261
1262 // get subscriptions collection
1263 hr = CpiExecGetCatalogCollection(piCompColl, piCompObj, L"SubscriptionsForComponent", ppiSubsColl);
1264 ExitOnFailure(hr, "Failed to get catalog collection");
1265
1266 hr = S_OK;
1267
1268LExit:
1269 // clean up
1270 ReleaseObject(piCompColl);
1271 ReleaseObject(piCompObj);
1272
1273 return hr;
1274}
1275
1276HRESULT CpiReadPropertyList(
1277 LPWSTR* ppwzData,
1278 CPI_PROPERTY** ppPropList
1279 )
1280{
1281 HRESULT hr = S_OK;
1282
1283 CPI_PROPERTY* pItm = NULL;
1284 LPWSTR pwzName = NULL;
1285
1286 // clear list if it already contains items
1287 if (*ppPropList)
1288 CpiFreePropertyList(*ppPropList);
1289 *ppPropList = NULL;
1290
1291 // read property count
1292 int iPropCnt = 0;
1293 hr = WcaReadIntegerFromCaData(ppwzData, &iPropCnt);
1294 ExitOnFailure(hr, "Failed to read property count");
1295
1296 for (int i = 0; i < iPropCnt; i++)
1297 {
1298 // allocate new element
1299 pItm = (CPI_PROPERTY*)::HeapAlloc(::GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(CPI_PROPERTY));
1300 if (!pItm)
1301 ExitFunction1(hr = E_OUTOFMEMORY);
1302
1303 // Name
1304 hr = WcaReadStringFromCaData(ppwzData, &pwzName);
1305 ExitOnFailure(hr, "Failed to read name");
1306 StringCchCopyW(pItm->wzName, countof(pItm->wzName), pwzName);
1307
1308 // Value
1309 hr = WcaReadStringFromCaData(ppwzData, &pItm->pwzValue);
1310 ExitOnFailure(hr, "Failed to read property value");
1311
1312 // add to list
1313 if (*ppPropList)
1314 pItm->pNext = *ppPropList;
1315 *ppPropList = pItm;
1316 pItm = NULL;
1317 }
1318
1319 hr = S_OK;
1320
1321LExit:
1322 // clean up
1323 ReleaseStr(pwzName);
1324
1325 if (pItm)
1326 CpiFreePropertyList(pItm);
1327
1328 return hr;
1329}
1330
1331void CpiFreePropertyList(
1332 CPI_PROPERTY* pList
1333 )
1334{
1335 while (pList)
1336 {
1337 ReleaseStr(pList->pwzValue);
1338
1339 CPI_PROPERTY* pDelete = pList;
1340 pList = pList->pNext;
1341 ::HeapFree(::GetProcessHeap(), 0, pDelete);
1342 }
1343}
1344
1345HRESULT CpiWriteKeyToRollbackFile(
1346 HANDLE hFile,
1347 LPCWSTR pwzKey
1348 )
1349{
1350 HRESULT hr = S_OK;
1351
1352 WCHAR wzKey[MAX_DARWIN_KEY + 1];
1353 ::ZeroMemory(wzKey, sizeof(wzKey));
1354 hr = StringCchCopyW(wzKey, countof(wzKey), pwzKey);
1355 ExitOnFailure(hr, "Failed to copy key");
1356
1357 hr = WriteFileAll(hFile, (PBYTE)wzKey, MAX_DARWIN_KEY * sizeof(WCHAR));
1358 ExitOnFailure(hr, "Failed to write buffer");
1359
1360 FlushFileBuffers(hFile);
1361
1362 hr = S_OK;
1363
1364LExit:
1365 return hr;
1366}
1367
1368HRESULT CpiWriteIntegerToRollbackFile(
1369 HANDLE hFile,
1370 int i
1371 )
1372{
1373 HRESULT hr = S_OK;
1374
1375 hr = WriteFileAll(hFile, (PBYTE)&i, sizeof(int));
1376 ExitOnFailure(hr, "Failed to write buffer");
1377
1378 FlushFileBuffers(hFile);
1379
1380 hr = S_OK;
1381
1382LExit:
1383 return hr;
1384}
1385
1386HRESULT CpiReadRollbackDataList(
1387 HANDLE hFile,
1388 CPI_ROLLBACK_DATA** pprdList
1389 )
1390{
1391 HRESULT hr = S_OK;
1392
1393 int iCount;
1394
1395 CPI_ROLLBACK_DATA* pItm = NULL;
1396
1397 // read count
1398 hr = ReadFileAll(hFile, (PBYTE)&iCount, sizeof(int));
1399 if (HRESULT_FROM_WIN32(ERROR_HANDLE_EOF) == hr)
1400 ExitFunction1(hr = S_OK); // EOF reached, nothing left to read
1401 ExitOnFailure(hr, "Failed to read count");
1402
1403 for (int i = 0; i < iCount; i++)
1404 {
1405 // allocate new element
1406 pItm = (CPI_ROLLBACK_DATA*)::HeapAlloc(::GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(CPI_ROLLBACK_DATA));
1407 if (!pItm)
1408 ExitFunction1(hr = E_OUTOFMEMORY);
1409
1410 // read from file
1411 hr = ReadFileAll(hFile, (PBYTE)pItm->wzKey, MAX_DARWIN_KEY * sizeof(WCHAR));
1412 if (HRESULT_FROM_WIN32(ERROR_HANDLE_EOF) == hr)
1413 break; // EOF reached, nothing left to read
1414 ExitOnFailure(hr, "Failed to read key");
1415
1416 hr = ReadFileAll(hFile, (PBYTE)&pItm->iStatus, sizeof(int));
1417 if (HRESULT_FROM_WIN32(ERROR_HANDLE_EOF) == hr)
1418 pItm->iStatus = 0; // EOF reached, the operation was interupted; set status to zero
1419 else
1420 ExitOnFailure(hr, "Failed to read status");
1421
1422 // add to list
1423 if (*pprdList)
1424 pItm->pNext = *pprdList;
1425 *pprdList = pItm;
1426 pItm = NULL;
1427 }
1428
1429 hr = S_OK;
1430
1431LExit:
1432 // clean up
1433 if (pItm)
1434 CpiFreeRollbackDataList(pItm);
1435
1436 return hr;
1437}
1438
1439void CpiFreeRollbackDataList(
1440 CPI_ROLLBACK_DATA* pList
1441 )
1442{
1443 while (pList)
1444 {
1445 CPI_ROLLBACK_DATA* pDelete = pList;
1446 pList = pList->pNext;
1447 ::HeapFree(::GetProcessHeap(), 0, pDelete);
1448 }
1449}
1450
1451HRESULT CpiFindRollbackStatus(
1452 CPI_ROLLBACK_DATA* pList,
1453 LPCWSTR pwzKey,
1454 int* piStatus
1455 )
1456{
1457 HRESULT hr = S_OK;
1458
1459 for (; pList; pList = pList->pNext)
1460 {
1461 if (0 == lstrcmpW(pList->wzKey, pwzKey))
1462 {
1463 *piStatus = pList->iStatus;
1464 ExitFunction1(hr = S_OK);
1465 }
1466 }
1467
1468 hr = S_FALSE;
1469
1470LExit:
1471 return hr;
1472}
1473
1474HRESULT CpiAccountNameToSid(
1475 LPCWSTR pwzAccountName,
1476 PSID* ppSid
1477 )
1478{
1479 HRESULT hr = S_OK;
1480 UINT er = ERROR_SUCCESS;
1481 NTSTATUS st = 0;
1482
1483 PSID pSid = NULL;
1484 LSA_OBJECT_ATTRIBUTES loaAttributes;
1485 LSA_HANDLE lsahPolicy = NULL;
1486 LSA_UNICODE_STRING lusName;
1487 PLSA_REFERENCED_DOMAIN_LIST plrdsDomains = NULL;
1488 PLSA_TRANSLATED_SID pltsSid = NULL;
1489
1490 ::ZeroMemory(&loaAttributes, sizeof(loaAttributes));
1491 ::ZeroMemory(&lusName, sizeof(lusName));
1492
1493 // identify well known SIDs
1494 for (CPI_WELLKNOWN_SID* pWS = wsWellKnownSids; pWS->pwzName; pWS++)
1495 {
1496 if (0 == lstrcmpiW(pwzAccountName, pWS->pwzName))
1497 {
1498 // allocate SID buffer
1499 pSid = (PSID)::HeapAlloc(::GetProcessHeap(), HEAP_ZERO_MEMORY, ::GetSidLengthRequired(pWS->nSubAuthorityCount));
1500 ExitOnNull(pSid, hr, E_OUTOFMEMORY, "Failed to allocate buffer for SID");
1501
1502 // initialize SID
1503 ::InitializeSid(pSid, &pWS->iaIdentifierAuthority, pWS->nSubAuthorityCount);
1504
1505 // copy sub autorities
1506 for (DWORD i = 0; i < pWS->nSubAuthorityCount; i++)
1507 *::GetSidSubAuthority(pSid, i) = pWS->dwSubAuthority[i];
1508
1509 break;
1510 }
1511 }
1512
1513 // lookup name
1514 if (!pSid)
1515 {
1516 // open policy handle
1517 st = ::LsaOpenPolicy(NULL, &loaAttributes, POLICY_ALL_ACCESS, &lsahPolicy);
1518 er = ::LsaNtStatusToWinError(st);
1519 ExitOnFailure(hr = HRESULT_FROM_WIN32(er), "Failed to open policy handle");
1520
1521 // create account name lsa unicode string
1522 hr = InitLsaUnicodeString(&lusName, pwzAccountName, (DWORD)wcslen(pwzAccountName));
1523 ExitOnFailure(hr, "Failed to initialize account name string");
1524
1525 // lookup name
1526 st = ::LsaLookupNames(lsahPolicy, 1, &lusName, &plrdsDomains, &pltsSid);
1527 er = ::LsaNtStatusToWinError(st);
1528 ExitOnFailure(hr = HRESULT_FROM_WIN32(er), "Failed to lookup account names");
1529
1530 if (SidTypeDomain == pltsSid->Use)
1531 ExitOnFailure(hr = HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED), "Domain SIDs not supported");
1532
1533 // convert sid
1534 hr = CreateSidFromDomainRidPair(plrdsDomains->Domains[pltsSid->DomainIndex].Sid, pltsSid->RelativeId, &pSid);
1535 ExitOnFailure(hr, "Failed to convert SID");
1536 }
1537
1538 *ppSid = pSid;
1539 pSid = NULL;
1540
1541 hr = S_OK;
1542
1543LExit:
1544 // clean up
1545 if (pSid)
1546 ::HeapFree(::GetProcessHeap(), 0, pSid);
1547 if (lsahPolicy)
1548 ::LsaClose(lsahPolicy);
1549 if (plrdsDomains)
1550 ::LsaFreeMemory(plrdsDomains);
1551 if (pltsSid)
1552 ::LsaFreeMemory(pltsSid);
1553 FreeLsaUnicodeString(&lusName);
1554
1555 return hr;
1556}
1557
1558HRESULT CpiSidToAccountName(
1559 PSID pSid,
1560 LPWSTR* ppwzAccountName
1561 )
1562{
1563 HRESULT hr = S_OK;
1564 UINT er = ERROR_SUCCESS;
1565 NTSTATUS st = 0;
1566
1567 LSA_OBJECT_ATTRIBUTES loaAttributes;
1568 LSA_HANDLE lsahPolicy = NULL;
1569 PLSA_REFERENCED_DOMAIN_LIST plrdsDomains = NULL;
1570 PLSA_TRANSLATED_NAME pltnName = NULL;
1571
1572 LPWSTR pwzDomain = NULL;
1573 LPWSTR pwzName = NULL;
1574
1575 ::ZeroMemory(&loaAttributes, sizeof(loaAttributes));
1576
1577 // open policy handle
1578 st = ::LsaOpenPolicy(NULL, &loaAttributes, POLICY_ALL_ACCESS, &lsahPolicy);
1579 er = ::LsaNtStatusToWinError(st);
1580 ExitOnFailure(hr = HRESULT_FROM_WIN32(er), "Failed to open policy handle");
1581
1582 // lookup SID
1583 st = ::LsaLookupSids(lsahPolicy, 1, &pSid, &plrdsDomains, &pltnName);
1584 er = ::LsaNtStatusToWinError(st);
1585 ExitOnFailure(hr = HRESULT_FROM_WIN32(er), "Failed lookup SID");
1586
1587 if (SidTypeDomain == pltnName->Use)
1588 ExitOnFailure(hr = HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED), "Domain SIDs not supported");
1589
1590 // format account name string
1591 if (SidTypeWellKnownGroup != pltnName->Use)
1592 {
1593 PLSA_UNICODE_STRING plusDomain = &plrdsDomains->Domains[pltnName->DomainIndex].Name;
1594 hr = StrAllocString(&pwzDomain, plusDomain->Buffer, plusDomain->Length / sizeof(WCHAR));
1595 ExitOnFailure(hr, "Failed to allocate name string");
1596 }
1597
1598 hr = StrAllocString(&pwzName, pltnName->Name.Buffer, pltnName->Name.Length / sizeof(WCHAR));
1599 ExitOnFailure(hr, "Failed to allocate domain string");
1600
1601 hr = StrAllocFormatted(ppwzAccountName, L"%s\\%s", pwzDomain ? pwzDomain : L"", pwzName);
1602 ExitOnFailure(hr, "Failed to format account name string");
1603
1604 hr = S_OK;
1605
1606LExit:
1607 // clean up
1608 if (lsahPolicy)
1609 ::LsaClose(lsahPolicy);
1610 if (plrdsDomains)
1611 ::LsaFreeMemory(plrdsDomains);
1612 if (pltnName)
1613 ::LsaFreeMemory(pltnName);
1614
1615 ReleaseStr(pwzDomain);
1616 ReleaseStr(pwzName);
1617
1618 return hr;
1619}
1620
1621// helper function definitions
1622
1623static HRESULT FindUserCollectionObjectIndex(
1624 ICatalogCollection* piColl,
1625 PSID pSid,
1626 int* pi
1627 )
1628{
1629 HRESULT hr = S_OK;
1630 UINT er = ERROR_SUCCESS;
1631 NTSTATUS st = 0;
1632
1633 long i = 0;
1634 long lCollCnt = 0;
1635
1636 LSA_OBJECT_ATTRIBUTES loaAttributes;
1637 LSA_HANDLE lsahPolicy = NULL;
1638 PLSA_UNICODE_STRING plusNames = NULL;
1639 PLSA_REFERENCED_DOMAIN_LIST plrdsDomains = NULL;
1640 PLSA_TRANSLATED_SID pltsSids = NULL;
1641
1642 IDispatch* piDisp = NULL;
1643 ICatalogObject* piObj = NULL;
1644 VARIANT vtVal;
1645
1646 PSID pTmpSid = NULL;
1647
1648 PLSA_TRANSLATED_SID pltsSid;
1649
1650 ::VariantInit(&vtVal);
1651 ::ZeroMemory(&loaAttributes, sizeof(loaAttributes));
1652
1653 // open policy handle
1654 st = ::LsaOpenPolicy(NULL, &loaAttributes, POLICY_ALL_ACCESS, &lsahPolicy);
1655 er = ::LsaNtStatusToWinError(st);
1656 ExitOnFailure(hr = HRESULT_FROM_WIN32(er), "Failed to open policy handle");
1657
1658 // get number of elements in collection
1659 hr = piColl->get_Count(&lCollCnt);
1660 ExitOnFailure(hr, "Failed to get to number of objects in collection");
1661
1662 if (0 == lCollCnt)
1663 ExitFunction1(hr = S_FALSE); // not found
1664
1665 // allocate name buffer
1666 plusNames = (PLSA_UNICODE_STRING)::HeapAlloc(::GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(LSA_UNICODE_STRING) * lCollCnt);
1667 ExitOnNull(plusNames, hr, E_OUTOFMEMORY, "Failed to allocate names buffer");
1668
1669 // get accounts in collection
1670 for (i = 0; i < lCollCnt; i++)
1671 {
1672 // get ICatalogObject interface
1673 hr = piColl->get_Item(i, &piDisp);
1674 ExitOnFailure(hr, "Failed to get object from collection");
1675
1676 hr = piDisp->QueryInterface(IID_ICatalogObject, (void**)&piObj);
1677 ExitOnFailure(hr, "Failed to get IID_ICatalogObject interface");
1678
1679 // get value
1680 hr = piObj->get_Key(&vtVal);
1681 ExitOnFailure(hr, "Failed to get key");
1682
1683 hr = ::VariantChangeType(&vtVal, &vtVal, 0, VT_BSTR);
1684 ExitOnFailure(hr, "Failed to change variant type");
1685
1686 // copy account name string
1687 hr = InitLsaUnicodeString(&plusNames[i], vtVal.bstrVal, ::SysStringLen(vtVal.bstrVal));
1688 ExitOnFailure(hr, "Failed to initialize account name string");
1689
1690 // clean up
1691 ReleaseNullObject(piDisp);
1692 ReleaseNullObject(piObj);
1693 ::VariantClear(&vtVal);
1694 }
1695
1696 // lookup names
1697 st = ::LsaLookupNames(lsahPolicy, lCollCnt, plusNames, &plrdsDomains, &pltsSids);
1698 er = ::LsaNtStatusToWinError(st);
1699 if (ERROR_NONE_MAPPED != er && ERROR_SOME_NOT_MAPPED != er)
1700 ExitOnFailure(hr = HRESULT_FROM_WIN32(er), "Failed to lookup account names");
1701
1702 // compare SIDs
1703 for (i = 0; i < lCollCnt; i++)
1704 {
1705 // get SID
1706 pltsSid = &pltsSids[i];
1707 if (SidTypeDomain == pltsSid->Use || SidTypeInvalid == pltsSid->Use || SidTypeUnknown == pltsSid->Use)
1708 continue; // ignore...
1709
1710 hr = CreateSidFromDomainRidPair(plrdsDomains->Domains[pltsSid->DomainIndex].Sid, pltsSid->RelativeId, &pTmpSid);
1711 ExitOnFailure(hr, "Failed to convert SID");
1712
1713 // compare SIDs
1714 if (::EqualSid(pSid, pTmpSid))
1715 {
1716 *pi = i;
1717 ExitFunction1(hr = S_OK);
1718 }
1719 }
1720
1721 if (ERROR_NONE_MAPPED == er || ERROR_SOME_NOT_MAPPED == er)
1722 hr = HRESULT_FROM_WIN32(er);
1723 else
1724 hr = S_FALSE; // not found
1725
1726LExit:
1727 // clean up
1728 ReleaseObject(piDisp);
1729 ReleaseObject(piObj);
1730 ::VariantClear(&vtVal);
1731
1732 if (plusNames)
1733 {
1734 for (i = 0; i < lCollCnt; i++)
1735 FreeLsaUnicodeString(&plusNames[i]);
1736 ::HeapFree(::GetProcessHeap(), 0, plusNames);
1737 }
1738
1739 if (lsahPolicy)
1740 ::LsaClose(lsahPolicy);
1741 if (plrdsDomains)
1742 ::LsaFreeMemory(plrdsDomains);
1743 if (pltsSids)
1744 ::LsaFreeMemory(pltsSids);
1745
1746 if (pTmpSid)
1747 ::HeapFree(::GetProcessHeap(), 0, pTmpSid);
1748
1749 return hr;
1750}
1751
1752static HRESULT CreateSidFromDomainRidPair(
1753 PSID pDomainSid,
1754 DWORD dwRid,
1755 PSID* ppSid
1756 )
1757{
1758 HRESULT hr = S_OK;
1759 PSID pSid = NULL;
1760
1761 // get domain SID sub authority count
1762 UCHAR ucSubAuthorityCount = *::GetSidSubAuthorityCount(pDomainSid);
1763
1764 // allocate SID buffer
1765 DWORD dwLengthRequired = ::GetSidLengthRequired(ucSubAuthorityCount + (UCHAR)1);
1766 if (*ppSid)
1767 {
1768 SIZE_T ccb = ::HeapSize(::GetProcessHeap(), 0, *ppSid);
1769 if (-1 == ccb)
1770 ExitOnFailure(hr = E_FAIL, "Failed to get size of SID buffer");
1771
1772 if (ccb < dwLengthRequired)
1773 {
1774 pSid = (PSID)::HeapReAlloc(::GetProcessHeap(), HEAP_ZERO_MEMORY, *ppSid, dwLengthRequired);
1775 ExitOnNull(pSid, hr, E_OUTOFMEMORY, "Failed to reallocate buffer for SID, len: %d", dwLengthRequired);
1776 *ppSid = pSid;
1777 }
1778 }
1779 else
1780 {
1781 *ppSid = (PSID)::HeapAlloc(::GetProcessHeap(), HEAP_ZERO_MEMORY, dwLengthRequired);
1782 ExitOnNull(*ppSid, hr, E_OUTOFMEMORY, "Failed to allocate buffer for SID, len: %d", dwLengthRequired);
1783 }
1784
1785 ::InitializeSid(*ppSid, ::GetSidIdentifierAuthority(pDomainSid), ucSubAuthorityCount + (UCHAR)1);
1786
1787 // copy sub autorities
1788 DWORD i = 0;
1789 for (; i < ucSubAuthorityCount; i++)
1790 *::GetSidSubAuthority(*ppSid, i) = *::GetSidSubAuthority(pDomainSid, i);
1791 *::GetSidSubAuthority(*ppSid, i) = dwRid;
1792
1793 hr = S_OK;
1794
1795LExit:
1796 return hr;
1797}
1798
1799static HRESULT InitLsaUnicodeString(
1800 PLSA_UNICODE_STRING plusStr,
1801 LPCWSTR pwzStr,
1802 DWORD dwLen
1803 )
1804{
1805 HRESULT hr = S_OK;
1806
1807 plusStr->Length = (USHORT)dwLen * sizeof(WCHAR);
1808 plusStr->MaximumLength = (USHORT)(dwLen + 1) * sizeof(WCHAR);
1809
1810 plusStr->Buffer = (WCHAR*)::HeapAlloc(::GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(WCHAR) * (dwLen + 1));
1811 ExitOnNull(plusStr->Buffer, hr, E_OUTOFMEMORY, "Failed to allocate account name string");
1812
1813 hr = StringCchCopyW(plusStr->Buffer, dwLen + 1, pwzStr);
1814 ExitOnFailure(hr, "Failed to copy buffer");
1815
1816 hr = S_OK;
1817
1818LExit:
1819 return hr;
1820}
1821
1822static void FreeLsaUnicodeString(
1823 PLSA_UNICODE_STRING plusStr
1824 )
1825{
1826 if (plusStr->Buffer)
1827 ::HeapFree(::GetProcessHeap(), 0, plusStr->Buffer);
1828}
1829
1830static HRESULT WriteFileAll(
1831 HANDLE hFile,
1832 PBYTE pbBuffer,
1833 DWORD dwBufferLength
1834 )
1835{
1836 HRESULT hr = S_OK;
1837
1838 DWORD dwBytesWritten;
1839
1840 while (dwBufferLength)
1841 {
1842 if (!::WriteFile(hFile, pbBuffer, dwBufferLength, &dwBytesWritten, NULL))
1843 ExitFunction1(hr = HRESULT_FROM_WIN32(::GetLastError()));
1844
1845 dwBufferLength -= dwBytesWritten;
1846 pbBuffer += dwBytesWritten;
1847 }
1848
1849 hr = S_OK;
1850
1851LExit:
1852 return hr;
1853}
1854
1855static HRESULT ReadFileAll(
1856 HANDLE hFile,
1857 PBYTE pbBuffer,
1858 DWORD dwBufferLength
1859 )
1860{
1861 HRESULT hr = S_OK;
1862
1863 DWORD dwBytesRead;
1864
1865 while (dwBufferLength)
1866 {
1867 if (!::ReadFile(hFile, pbBuffer, dwBufferLength, &dwBytesRead, NULL))
1868 ExitFunction1(hr = HRESULT_FROM_WIN32(::GetLastError()));
1869
1870 if (0 == dwBytesRead)
1871 ExitFunction1(hr = HRESULT_FROM_WIN32(ERROR_HANDLE_EOF));
1872
1873 dwBufferLength -= dwBytesRead;
1874 pbBuffer += dwBytesRead;
1875 }
1876
1877 hr = S_OK;
1878
1879LExit:
1880 return hr;
1881}
diff --git a/src/ext/ComPlus/ca/cputilexec.h b/src/ext/ComPlus/ca/cputilexec.h
new file mode 100644
index 00000000..b900883d
--- /dev/null
+++ b/src/ext/ComPlus/ca/cputilexec.h
@@ -0,0 +1,193 @@
1#pragma once
2// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
3
4
5#define CPI_MAX_GUID 38
6
7enum eActionType { atNoOp = 0, atCreate, atRemove };
8
9
10// structs
11
12struct CPI_PROPERTY
13{
14 WCHAR wzName[MAX_DARWIN_KEY + 1];
15 LPWSTR pwzValue;
16
17 CPI_PROPERTY* pNext;
18};
19
20struct CPI_ROLLBACK_DATA
21{
22 WCHAR wzKey[MAX_DARWIN_KEY + 1];
23 int iStatus;
24
25 CPI_ROLLBACK_DATA* pNext;
26};
27
28
29// function prototypes
30
31void CpiExecInitialize();
32void CpiExecFinalize();
33HRESULT CpiActionStartMessage(
34 LPWSTR* ppwzActionData,
35 BOOL fSuppress
36 );
37HRESULT CpiActionDataMessage(
38 DWORD cArgs,
39 ...
40 );
41HRESULT CpiExecGetAdminCatalog(
42 ICOMAdminCatalog** ppiCatalog
43 );
44HRESULT CpiLogCatalogErrorInfo();
45HRESULT CpiExecGetCatalogCollection(
46 LPCWSTR pwzName,
47 ICatalogCollection** ppiColl
48 );
49HRESULT CpiExecGetCatalogCollection(
50 ICatalogCollection* piColl,
51 ICatalogObject* piObj,
52 LPCWSTR pwzName,
53 ICatalogCollection** ppiColl
54 );
55HRESULT CpiAddCollectionObject(
56 ICatalogCollection* piColl,
57 ICatalogObject** ppiObj
58 );
59HRESULT CpiPutCollectionObjectValue(
60 ICatalogObject* piObj,
61 LPCWSTR pwzPropName,
62 LPCWSTR pwzValue
63 );
64HRESULT CpiPutCollectionObjectValues(
65 ICatalogObject* piObj,
66 CPI_PROPERTY* pPropList
67 );
68HRESULT CpiGetCollectionObjectValue(
69 ICatalogObject* piObj,
70 LPCWSTR szPropName,
71 LPWSTR* ppwzValue
72 );
73HRESULT CpiResetObjectProperty(
74 ICatalogCollection* piColl,
75 ICatalogObject* piObj,
76 LPCWSTR pwzPropName
77 );
78HRESULT CpiRemoveCollectionObject(
79 ICatalogCollection* piColl,
80 LPCWSTR pwzID,
81 LPCWSTR pwzName,
82 BOOL fResetDeleteable
83 );
84HRESULT CpiRemoveUserCollectionObject(
85 ICatalogCollection* piColl,
86 PSID pSid
87 );
88HRESULT CpiFindCollectionObjectByStringKey(
89 ICatalogCollection* piColl,
90 LPCWSTR pwzKey,
91 ICatalogObject** ppiObj
92 );
93HRESULT CpiFindCollectionObjectByIntegerKey(
94 ICatalogCollection* piColl,
95 long lKey,
96 ICatalogObject** ppiObj
97 );
98HRESULT CpiFindCollectionObjectByName(
99 ICatalogCollection* piColl,
100 LPCWSTR pwzName,
101 ICatalogObject** ppiObj
102 );
103HRESULT CpiFindUserCollectionObject(
104 ICatalogCollection* piColl,
105 PSID pSid,
106 ICatalogObject** ppiObj
107 );
108HRESULT CpiExecGetPartitionsCollection(
109 ICatalogCollection** ppiPartColl
110 );
111HRESULT CpiGetPartitionRolesCollection(
112 LPCWSTR pwzPartID,
113 ICatalogCollection** ppiRolesColl
114 );
115HRESULT CpiGetUsersInPartitionRoleCollection(
116 LPCWSTR pwzPartID,
117 LPCWSTR pwzRoleName,
118 ICatalogCollection** ppiUsrInRoleColl
119 );
120HRESULT CpiGetPartitionUsersCollection(
121 ICatalogCollection** ppiUserColl
122 );
123HRESULT CpiExecGetApplicationsCollection(
124 LPCWSTR pwzPartID,
125 ICatalogCollection** ppiAppColl
126 );
127HRESULT CpiGetRolesCollection(
128 LPCWSTR pwzPartID,
129 LPCWSTR pwzAppID,
130 ICatalogCollection** ppiRolesColl
131 );
132HRESULT CpiGetUsersInRoleCollection(
133 LPCWSTR pwzPartID,
134 LPCWSTR pwzAppID,
135 LPCWSTR pwzRoleName,
136 ICatalogCollection** ppiUsrInRoleColl
137 );
138HRESULT CpiGetComponentsCollection(
139 LPCWSTR pwzPartID,
140 LPCWSTR pwzAppID,
141 ICatalogCollection** ppiCompsColl
142 );
143HRESULT CpiGetInterfacesCollection(
144 ICatalogCollection* piCompColl,
145 ICatalogObject* piCompObj,
146 ICatalogCollection** ppiIntfColl
147 );
148HRESULT CpiGetMethodsCollection(
149 ICatalogCollection* piIntfColl,
150 ICatalogObject* piIntfObj,
151 ICatalogCollection** ppiMethColl
152 );
153HRESULT CpiGetSubscriptionsCollection(
154 LPCWSTR pwzPartID,
155 LPCWSTR pwzAppID,
156 LPCWSTR pwzCompCLSID,
157 ICatalogCollection** ppiCompsColl
158 );
159HRESULT CpiReadPropertyList(
160 LPWSTR* ppwzData,
161 CPI_PROPERTY** ppPropList
162 );
163void CpiFreePropertyList(
164 CPI_PROPERTY* pList
165 );
166HRESULT CpiWriteKeyToRollbackFile(
167 HANDLE hFile,
168 LPCWSTR pwzKey
169 );
170HRESULT CpiWriteIntegerToRollbackFile(
171 HANDLE hFile,
172 int i
173 );
174HRESULT CpiReadRollbackDataList(
175 HANDLE hFile,
176 CPI_ROLLBACK_DATA** pprdList
177 );
178void CpiFreeRollbackDataList(
179 CPI_ROLLBACK_DATA* pList
180 );
181HRESULT CpiFindRollbackStatus(
182 CPI_ROLLBACK_DATA* pList,
183 LPCWSTR pwzKey,
184 int* piStatus
185 );
186HRESULT CpiAccountNameToSid(
187 LPCWSTR pwzAccountName,
188 PSID* ppSid
189 );
190HRESULT CpiSidToAccountName(
191 PSID pSid,
192 LPWSTR* ppwzAccountName
193 );
diff --git a/src/ext/ComPlus/ca/cputilsched.cpp b/src/ext/ComPlus/ca/cputilsched.cpp
new file mode 100644
index 00000000..1a958c56
--- /dev/null
+++ b/src/ext/ComPlus/ca/cputilsched.cpp
@@ -0,0 +1,885 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3#include "precomp.h"
4
5
6// sql queries
7
8LPCWSTR vcsActionTextQuery =
9 L"SELECT `Description`, `Template` FROM `ActionText` WHERE `Action` = ?";
10enum eActionTextQuery { atqDescription = 1, atqTemplate };
11
12LPCWSTR vcsComponentAttributesQuery =
13 L"SELECT `Attributes` FROM `Component` WHERE `Component` = ?";
14enum eComponentAttributesQuery { caqAttributes = 1 };
15
16LPCWSTR vcsUserQuery = L"SELECT `Domain`, `Name` FROM `User` WHERE `User` = ?";
17enum eUserQuery { uqDomain = 1, uqName };
18
19enum ePropertyQuery { pqName = 1, pqValue };
20
21
22// prototypes for private helper functions
23
24static HRESULT FindPropertyDefinition(
25 CPI_PROPERTY_DEFINITION* pPropDefList,
26 LPCWSTR pwzName,
27 CPI_PROPERTY_DEFINITION** ppPropDef
28 );
29static HRESULT GetUserAccountName(
30 LPCWSTR pwzKey,
31 LPWSTR* ppwzAccount
32 );
33
34
35// variables
36
37static ICOMAdminCatalog* gpiCatalog;
38static ICatalogCollection* gpiPartColl;
39static ICatalogCollection* gpiAppColl;
40
41static int giTables;
42
43
44// function definitions
45
46void CpiSchedInitialize()
47{
48 // collections
49 gpiCatalog = NULL;
50 gpiPartColl = NULL;
51 gpiAppColl = NULL;
52
53 // tables
54 giTables = 0;
55
56 if (S_OK == WcaTableExists(L"ComPlusPartition")) giTables |= cptComPlusPartition;
57 if (S_OK == WcaTableExists(L"ComPlusPartitionProperty")) giTables |= cptComPlusPartitionProperty;
58 if (S_OK == WcaTableExists(L"ComPlusPartitionRole")) giTables |= cptComPlusPartitionRole;
59 if (S_OK == WcaTableExists(L"ComPlusUserInPartitionRole")) giTables |= cptComPlusUserInPartitionRole;
60 if (S_OK == WcaTableExists(L"ComPlusGroupInPartitionRole")) giTables |= cptComPlusGroupInPartitionRole;
61 if (S_OK == WcaTableExists(L"ComPlusPartitionUser")) giTables |= cptComPlusPartitionUser;
62 if (S_OK == WcaTableExists(L"ComPlusApplication")) giTables |= cptComPlusApplication;
63 if (S_OK == WcaTableExists(L"ComPlusApplicationProperty")) giTables |= cptComPlusApplicationProperty;
64 if (S_OK == WcaTableExists(L"ComPlusApplicationRole")) giTables |= cptComPlusApplicationRole;
65 if (S_OK == WcaTableExists(L"ComPlusApplicationRoleProperty")) giTables |= cptComPlusApplicationRoleProperty;
66 if (S_OK == WcaTableExists(L"ComPlusUserInApplicationRole")) giTables |= cptComPlusUserInApplicationRole;
67 if (S_OK == WcaTableExists(L"ComPlusGroupInApplicationRole")) giTables |= cptComPlusGroupInApplicationRole;
68 if (S_OK == WcaTableExists(L"ComPlusAssembly")) giTables |= cptComPlusAssembly;
69 if (S_OK == WcaTableExists(L"ComPlusAssemblyDependency")) giTables |= cptComPlusAssemblyDependency;
70 if (S_OK == WcaTableExists(L"ComPlusComponent")) giTables |= cptComPlusComponent;
71 if (S_OK == WcaTableExists(L"ComPlusComponentProperty")) giTables |= cptComPlusComponentProperty;
72 if (S_OK == WcaTableExists(L"ComPlusRoleForComponent")) giTables |= cptComPlusRoleForComponent;
73 if (S_OK == WcaTableExists(L"ComPlusInterface")) giTables |= cptComPlusInterface;
74 if (S_OK == WcaTableExists(L"ComPlusInterfaceProperty")) giTables |= cptComPlusInterfaceProperty;
75 if (S_OK == WcaTableExists(L"ComPlusRoleForInterface")) giTables |= cptComPlusRoleForInterface;
76 if (S_OK == WcaTableExists(L"ComPlusMethod")) giTables |= cptComPlusMethod;
77 if (S_OK == WcaTableExists(L"ComPlusMethodProperty")) giTables |= cptComPlusMethodProperty;
78 if (S_OK == WcaTableExists(L"ComPlusRoleForMethod")) giTables |= cptComPlusRoleForMethod;
79 if (S_OK == WcaTableExists(L"ComPlusSubscription")) giTables |= cptComPlusSubscription;
80 if (S_OK == WcaTableExists(L"ComPlusSubscriptionProperty")) giTables |= cptComPlusSubscriptionProperty;
81}
82
83void CpiSchedFinalize()
84{
85 // collections
86 ReleaseObject(gpiCatalog);
87 ReleaseObject(gpiPartColl);
88 ReleaseObject(gpiAppColl);
89}
90
91BOOL CpiTableExists(
92 int iTable
93 )
94{
95 return (giTables & iTable) == iTable;
96}
97
98HRESULT CpiSchedGetAdminCatalog(
99 ICOMAdminCatalog** ppiCatalog
100 )
101{
102 HRESULT hr = S_OK;
103
104 if (!gpiCatalog)
105 {
106 // get collection
107 hr = ::CoCreateInstance(CLSID_COMAdminCatalog, NULL, CLSCTX_ALL, IID_ICOMAdminCatalog, (void**)&gpiCatalog);
108 ExitOnFailure(hr, "Failed to create COM+ admin catalog object");
109 }
110
111 // return value
112 gpiCatalog->AddRef();
113 *ppiCatalog = gpiCatalog;
114
115 hr = S_OK;
116
117LExit:
118 return hr;
119}
120
121HRESULT CpiSchedGetCatalogCollection(
122 LPCWSTR pwzName,
123 ICatalogCollection** ppiColl
124 )
125{
126 HRESULT hr = S_OK;
127
128 ICOMAdminCatalog* piCatalog = NULL;
129 IDispatch* piDisp = NULL;
130 BSTR bstrName = NULL;
131
132 // copy name string
133 bstrName = ::SysAllocString(pwzName);
134 ExitOnNull(bstrName, hr, E_OUTOFMEMORY, "Failed to allocate BSTR for collection name");
135
136 // get catalog
137 hr = CpiSchedGetAdminCatalog(&piCatalog);
138 ExitOnFailure(hr, "Failed to get COM+ admin catalog");
139
140 // get collecton from catalog
141 hr = piCatalog->GetCollection(bstrName, &piDisp);
142 ExitOnFailure(hr, "Failed to get collection");
143
144 hr = piDisp->QueryInterface(IID_ICatalogCollection, (void**)ppiColl);
145 ExitOnFailure(hr, "Failed to get IID_ICatalogCollection interface");
146
147 // populate collection
148 hr = (*ppiColl)->Populate();
149 ExitOnFailure(hr, "Failed to populate collection");
150
151 hr = S_OK;
152
153LExit:
154 // clean up
155 ReleaseObject(piCatalog);
156 ReleaseObject(piDisp);
157 ReleaseBSTR(bstrName);
158
159 return hr;
160}
161
162HRESULT CpiSchedGetCatalogCollection(
163 ICatalogCollection* piColl,
164 ICatalogObject* piObj,
165 LPCWSTR pwzName,
166 ICatalogCollection** ppiColl
167 )
168{
169 HRESULT hr = S_OK;
170
171 ICOMAdminCatalog* piCatalog = NULL;
172 IDispatch* piDisp = NULL;
173 BSTR bstrName = NULL;
174
175 VARIANT vtKey;
176 ::VariantInit(&vtKey);
177
178 // copy name string
179 bstrName = ::SysAllocString(pwzName);
180 ExitOnNull(bstrName, hr, E_OUTOFMEMORY, "Failed to allocate BSTR for collection name");
181
182 // get catalog
183 hr = CpiSchedGetAdminCatalog(&piCatalog);
184 ExitOnFailure(hr, "Failed to get COM+ admin catalog");
185
186 // get key
187 hr = piObj->get_Key(&vtKey);
188 ExitOnFailure(hr, "Failed to get object key");
189
190 // get collecton from catalog
191 hr = piColl->GetCollection(bstrName, vtKey, &piDisp);
192 ExitOnFailure(hr, "Failed to get collection");
193
194 hr = piDisp->QueryInterface(IID_ICatalogCollection, (void**)ppiColl);
195 ExitOnFailure(hr, "Failed to get IID_ICatalogCollection interface");
196
197 // populate collection
198 hr = (*ppiColl)->Populate();
199 ExitOnFailure(hr, "Failed to populate collection");
200
201 hr = S_OK;
202
203LExit:
204 // clean up
205 ReleaseObject(piCatalog);
206 ReleaseObject(piDisp);
207 ReleaseBSTR(bstrName);
208 ::VariantClear(&vtKey);
209
210 return hr;
211}
212
213HRESULT CpiGetKeyForObject(
214 ICatalogObject* piObj,
215 LPWSTR pwzKey,
216 SIZE_T cchKey
217 )
218{
219 HRESULT hr = S_OK;
220
221 VARIANT vtKey;
222 ::VariantInit(&vtKey);
223
224 // get key
225 hr = piObj->get_Key(&vtKey);
226 ExitOnFailure(hr, "Failed to get key");
227
228 // change variant type
229 hr = ::VariantChangeType(&vtKey, &vtKey, 0, VT_BSTR);
230 ExitOnFailure(hr, "Failed to change variant type");
231
232 // copy key
233 hr = StringCchCopyW(pwzKey, cchKey, vtKey.bstrVal);
234 ExitOnFailure(hr, "Failed to copy key");
235
236 hr = S_OK;
237
238LExit:
239 // clean up
240 ::VariantClear(&vtKey);
241
242 return hr;
243}
244
245HRESULT CpiFindCollectionObject(
246 ICatalogCollection* piColl,
247 LPCWSTR pwzID,
248 LPCWSTR pwzName,
249 ICatalogObject** ppiObj
250 )
251{
252 HRESULT hr = S_OK;
253
254 IDispatch* piDisp = NULL;
255 ICatalogObject* piObj = NULL;
256
257 VARIANT vtVal;
258 ::VariantInit(&vtVal);
259
260 long lCnt;
261 hr = piColl->get_Count(&lCnt);
262 ExitOnFailure(hr, "Failed to get to number of items in collection");
263
264 for (long i = 0; i < lCnt; i++)
265 {
266 // get ICatalogObject interface
267 hr = piColl->get_Item(i, &piDisp);
268 ExitOnFailure(hr, "Failed to get object from collection");
269
270 hr = piDisp->QueryInterface(IID_ICatalogObject, (void**)&piObj);
271 ExitOnFailure(hr, "Failed to get IID_ICatalogObject interface");
272
273 // compare id
274 if (pwzID && *pwzID)
275 {
276 hr = piObj->get_Key(&vtVal);
277 ExitOnFailure(hr, "Failed to get key");
278
279 hr = ::VariantChangeType(&vtVal, &vtVal, 0, VT_BSTR);
280 ExitOnFailure(hr, "Failed to change variant type");
281
282 if (0 == lstrcmpiW(vtVal.bstrVal, pwzID))
283 {
284 if (ppiObj)
285 {
286 *ppiObj = piObj;
287 piObj = NULL;
288 }
289 ExitFunction1(hr = S_OK);
290 }
291
292 ::VariantClear(&vtVal);
293 }
294
295 // compare name
296 if (pwzName && *pwzName)
297 {
298 hr = piObj->get_Name(&vtVal);
299 ExitOnFailure(hr, "Failed to get name");
300
301 hr = ::VariantChangeType(&vtVal, &vtVal, 0, VT_BSTR);
302 ExitOnFailure(hr, "Failed to change variant type");
303
304 if (0 == lstrcmpW(vtVal.bstrVal, pwzName))
305 {
306 if (ppiObj)
307 {
308 *ppiObj = piObj;
309 piObj = NULL;
310 }
311 ExitFunction1(hr = S_OK);
312 }
313
314 ::VariantClear(&vtVal);
315 }
316
317 // release interface pointers
318 ReleaseNullObject(piDisp);
319 ReleaseNullObject(piObj);
320 }
321
322 hr = S_FALSE;
323
324LExit:
325 // clean up
326 ReleaseObject(piDisp);
327 ReleaseObject(piObj);
328
329 ::VariantClear(&vtVal);
330
331 return hr;
332}
333
334HRESULT CpiSchedGetPartitionsCollection(
335 ICatalogCollection** ppiPartColl
336 )
337{
338 HRESULT hr = S_OK;
339
340 if (!gpiPartColl)
341 {
342 // get collection
343 hr = CpiSchedGetCatalogCollection(L"Partitions", &gpiPartColl);
344 ExitOnFailure(hr, "Failed to get partitions collection");
345 }
346
347 // return value
348 gpiPartColl->AddRef();
349 *ppiPartColl = gpiPartColl;
350
351 hr = S_OK;
352
353LExit:
354 return hr;
355}
356
357HRESULT CpiSchedGetApplicationsCollection(
358 ICatalogCollection** ppiAppColl
359 )
360{
361 HRESULT hr = S_OK;
362
363 ICOMAdminCatalog* piCatalog = NULL;
364 ICOMAdminCatalog2* piCatalog2 = NULL;
365 ICatalogCollection* piPartColl = NULL;
366 ICatalogObject* piPartObj = NULL;
367 BSTR bstrGlobPartID = NULL;
368
369 if (!gpiAppColl)
370 {
371 // get catalog
372 hr = CpiSchedGetAdminCatalog(&piCatalog);
373 ExitOnFailure(hr, "Failed to get COM+ admin catalog");
374
375 // get ICOMAdminCatalog2 interface
376 hr = piCatalog->QueryInterface(IID_ICOMAdminCatalog2, (void**)&piCatalog2);
377
378 // COM+ 1.5 or later
379 if (E_NOINTERFACE != hr)
380 {
381 ExitOnFailure(hr, "Failed to get IID_ICOMAdminCatalog2 interface");
382
383 // get global partition id
384 hr = piCatalog2->get_GlobalPartitionID(&bstrGlobPartID);
385 ExitOnFailure(hr, "Failed to get global partition id");
386
387 // get partitions collection
388 hr = CpiSchedGetPartitionsCollection(&piPartColl);
389 ExitOnFailure(hr, "Failed to get partitions collection");
390
391 // find object
392 hr = CpiFindCollectionObject(piPartColl, bstrGlobPartID, NULL, &piPartObj);
393 ExitOnFailure(hr, "Failed to find collection object");
394
395 if (S_FALSE == hr)
396 ExitFunction(); // partition not found, exit with hr = S_FALSE
397
398 // get applications collection
399 hr = CpiSchedGetCatalogCollection(piPartColl, piPartObj, L"Applications", &gpiAppColl);
400 ExitOnFailure(hr, "Failed to get applications collection");
401 }
402
403 // COM+ pre 1.5
404 else
405 {
406 // get applications collection
407 hr = CpiSchedGetCatalogCollection(L"Applications", &gpiAppColl);
408 ExitOnFailure(hr, "Failed to get applications collection");
409 }
410 }
411
412 // return value
413 gpiAppColl->AddRef();
414 *ppiAppColl = gpiAppColl;
415
416 hr = S_OK;
417
418LExit:
419 // clean up
420 ReleaseObject(piCatalog);
421 ReleaseObject(piCatalog2);
422 ReleaseObject(piPartColl);
423 ReleaseObject(piPartObj);
424 ReleaseBSTR(bstrGlobPartID);
425
426 return hr;
427}
428
429HRESULT CpiAddActionTextToActionData(
430 LPCWSTR pwzAction,
431 LPWSTR* ppwzActionData
432 )
433{
434 HRESULT hr = S_OK;
435
436 PMSIHANDLE hView, hRecKey, hRec;
437
438 LPWSTR pwzDescription = NULL;
439 LPWSTR pwzTemplate = NULL;
440
441 if (S_OK == WcaTableExists(L"ActionText"))
442 {
443 // create parameter record
444 hRecKey = ::MsiCreateRecord(1);
445 ExitOnNull(hRecKey, hr, E_OUTOFMEMORY, "Failed to create record");
446 hr = WcaSetRecordString(hRecKey, 1, pwzAction);
447 ExitOnFailure(hr, "Failed to set record string");
448
449 // open view
450 hr = WcaOpenView(vcsActionTextQuery, &hView);
451 ExitOnFailure(hr, "Failed to open view on ActionText table");
452 hr = WcaExecuteView(hView, hRecKey);
453 ExitOnFailure(hr, "Failed to execute view on ActionText table");
454
455 // fetch record
456 hr = WcaFetchSingleRecord(hView, &hRec);
457 if (S_FALSE != hr)
458 {
459 ExitOnFailure(hr, "Failed to fetch action text record");
460
461 // get description
462 hr = WcaGetRecordString(hRec, atqDescription, &pwzDescription);
463 ExitOnFailure(hr, "Failed to get description");
464
465 // get template
466 hr = WcaGetRecordString(hRec, atqTemplate, &pwzTemplate);
467 ExitOnFailure(hr, "Failed to get template");
468 }
469 }
470
471 // add action name to action data
472 hr = WcaWriteStringToCaData(pwzAction, ppwzActionData);
473 ExitOnFailure(hr, "Failed to add action name to custom action data");
474
475 // add description to action data
476 hr = WcaWriteStringToCaData(pwzDescription ? pwzDescription : L"", ppwzActionData);
477 ExitOnFailure(hr, "Failed to add description to custom action data");
478
479 // add template to action data
480 hr = WcaWriteStringToCaData(pwzTemplate ? pwzTemplate : L"", ppwzActionData);
481 ExitOnFailure(hr, "Failed to add template to custom action data");
482
483 hr = S_OK;
484
485LExit:
486 // clean up
487 ReleaseStr(pwzDescription);
488 ReleaseStr(pwzTemplate);
489
490 return hr;
491}
492
493HRESULT CpiVerifyComponentArchitecure(
494 LPCWSTR pwzComponent,
495 BOOL* pfMatchingArchitecture
496 )
497{
498 HRESULT hr = S_OK;
499
500 PMSIHANDLE hView, hRecKey, hRec;
501
502 int iAttributes = 0;
503
504 if (S_OK == WcaTableExists(L"Component"))
505 {
506 // create parameter record
507 hRecKey = ::MsiCreateRecord(1);
508 ExitOnNull(hRecKey, hr, E_OUTOFMEMORY, "Failed to create record");
509 hr = WcaSetRecordString(hRecKey, 1, pwzComponent);
510 ExitOnFailure(hr, "Failed to set record string");
511
512 // open view
513 hr = WcaOpenView(vcsComponentAttributesQuery, &hView);
514 ExitOnFailure(hr, "Failed to open view on ActionText table");
515 hr = WcaExecuteView(hView, hRecKey);
516 ExitOnFailure(hr, "Failed to execute view on ActionText table");
517
518 // fetch record
519 hr = WcaFetchSingleRecord(hView, &hRec);
520 if (S_FALSE != hr)
521 {
522 ExitOnFailure(hr, "Failed to fetch component record");
523
524 hr = WcaGetRecordInteger(hRec, caqAttributes, &iAttributes);
525 ExitOnFailure(hr, "Failed to get component attributes");
526 }
527 }
528
529 // return values
530#ifdef _WIN64
531 *pfMatchingArchitecture = 256 == (iAttributes & 256);
532#else
533 *pfMatchingArchitecture = 256 != (iAttributes & 256);
534#endif
535
536 hr = S_OK;
537
538LExit:
539 return hr;
540}
541
542HRESULT CpiPropertiesRead(
543 LPCWSTR pwzQuery,
544 LPCWSTR pwzKey,
545 CPI_PROPERTY_DEFINITION* pPropDefList,
546 CPI_PROPERTY** ppPropList,
547 int* piCount
548 )
549{
550 HRESULT hr = S_OK;
551
552 PMSIHANDLE hView, hRecKey, hRec;
553
554 CPI_PROPERTY* pItm = NULL;
555 LPWSTR pwzData = NULL;
556
557 int iVersionNT = 0;
558
559 CPI_PROPERTY_DEFINITION* pPropDef;
560
561 *piCount = 0;
562
563 // get NT version
564 hr = WcaGetIntProperty(L"VersionNT", &iVersionNT);
565 ExitOnFailure(hr, "Failed to set record string");
566
567 // create parameter record
568 hRecKey = ::MsiCreateRecord(1);
569 ExitOnNull(hRecKey, hr, E_OUTOFMEMORY, "Failed to create record");
570 hr = WcaSetRecordString(hRecKey, 1, pwzKey);
571 ExitOnFailure(hr, "Failed to set record string");
572
573 // open view
574 hr = WcaOpenView(pwzQuery, &hView);
575 ExitOnFailure(hr, "Failed to open view on property table");
576 hr = WcaExecuteView(hView, hRecKey);
577 ExitOnFailure(hr, "Failed to execute view on property table");
578
579 while (S_OK == (hr = WcaFetchRecord(hView, &hRec)))
580 {
581 // create entry
582 pItm = (CPI_PROPERTY*)::HeapAlloc(::GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(CPI_PROPERTY));
583 if (!pItm)
584 ExitFunction1(hr = E_OUTOFMEMORY);
585
586 // get name
587 hr = WcaGetRecordString(hRec, pqName, &pwzData);
588 ExitOnFailure(hr, "Failed to get name");
589 StringCchCopyW(pItm->wzName, countof(pItm->wzName), pwzData);
590
591 // get value
592 hr = WcaGetRecordFormattedString(hRec, pqValue, &pItm->pwzValue);
593 ExitOnFailure(hr, "Failed to get value");
594
595 // find property definition
596 hr = FindPropertyDefinition(pPropDefList, pItm->wzName, &pPropDef);
597 ExitOnFailure(hr, "Failed to find property definition");
598
599 if (S_FALSE == hr)
600 ExitOnFailure(hr = HRESULT_FROM_WIN32(ERROR_NOT_FOUND), "Unknown property, key: %S, property: %S", pwzKey, pItm->wzName);
601
602 // check version, ignore if catalog version is too low
603 if (iVersionNT < pPropDef->iMinVersionNT)
604 {
605 WcaLog(LOGMSG_VERBOSE, "Skipping property since NT version is too low, key: %S, property: %S", pwzKey, pItm->wzName);
606 CpiPropertiesFreeList(pItm);
607 pItm = NULL;
608 continue;
609 }
610
611 // if the property is a user, replace the User table key with a user account name
612 if (cpptUser == pPropDef->iType)
613 {
614 hr = GetUserAccountName(pItm->pwzValue, &pItm->pwzValue);
615 ExitOnFailure(hr, "Failed to get user account name");
616 }
617
618 // add entry
619 ++*piCount;
620 if (*ppPropList)
621 pItm->pNext = *ppPropList;
622 *ppPropList = pItm;
623 pItm = NULL;
624 }
625
626 if (E_NOMOREITEMS == hr)
627 hr = S_OK;
628
629LExit:
630 // clean up
631 if (pItm)
632 CpiPropertiesFreeList(pItm);
633
634 ReleaseStr(pwzData);
635
636 return hr;
637}
638
639void CpiPropertiesFreeList(
640 CPI_PROPERTY* pList
641 )
642{
643 while (pList)
644 {
645 ReleaseStr(pList->pwzValue);
646
647 CPI_PROPERTY* pDelete = pList;
648 pList = pList->pNext;
649 ::HeapFree(::GetProcessHeap(), 0, pDelete);
650 }
651}
652
653HRESULT CpiAddPropertiesToActionData(
654 int iPropCount,
655 CPI_PROPERTY* pPropList,
656 LPWSTR* ppwzActionData
657 )
658{
659 HRESULT hr = S_OK;
660
661 hr = WcaWriteIntegerToCaData(iPropCount, ppwzActionData);
662 ExitOnFailure(hr, "Failed to add count to custom action data");
663
664 if (iPropCount) // count might be 0 event thought there are elements in the list
665 {
666 for (CPI_PROPERTY* pProp = pPropList; pProp; pProp = pProp->pNext)
667 {
668 hr = WcaWriteStringToCaData(pProp->wzName, ppwzActionData);
669 ExitOnFailure(hr, "Failed to add property name to custom action data, name: %S", pProp->wzName);
670
671 hr = WcaWriteStringToCaData(pProp->pwzValue, ppwzActionData);
672 ExitOnFailure(hr, "Failed to add property value to custom action data, name: %S", pProp->wzName);
673 }
674 }
675
676 hr = S_OK;
677
678LExit:
679 return hr;
680}
681
682HRESULT CpiBuildAccountName(
683 LPCWSTR pwzDomain,
684 LPCWSTR pwzName,
685 LPWSTR* ppwzAccount
686 )
687{
688 HRESULT hr = S_OK;
689
690 WCHAR wzComputerName[MAX_COMPUTERNAME_LENGTH + 1];
691 ::ZeroMemory(wzComputerName, sizeof(wzComputerName));
692
693 // if domain is '.', get computer name
694 if (0 == lstrcmpW(pwzDomain, L"."))
695 {
696 DWORD dwSize = countof(wzComputerName);
697 if (!::GetComputerNameW(wzComputerName, &dwSize))
698 ExitOnFailure(hr = HRESULT_FROM_WIN32(::GetLastError()), "Failed to get computer name");
699 }
700
701 // build account name
702 hr = StrAllocFormatted(ppwzAccount, L"%s\\%s", *wzComputerName ? wzComputerName : pwzDomain, pwzName);
703 ExitOnFailure(hr, "Failed to build domain user name");
704
705 hr = S_OK;
706
707LExit:
708 return hr;
709}
710
711HRESULT CpiGetTempFileName(
712 LPWSTR* ppwzTempFile
713 )
714{
715 HRESULT hr = S_OK;
716
717 // get temp path
718 WCHAR wzTempPath[MAX_PATH];
719 DWORD dw = ::GetTempPathW(countof(wzTempPath), wzTempPath);
720 if (countof(wzTempPath) <= dw)
721 ExitOnFailure(hr = E_FAIL, "TEMP directory path too long");
722
723 // get unique number
724 LARGE_INTEGER liCount;
725 if (!::QueryPerformanceCounter(&liCount))
726 ExitOnFailure(hr = HRESULT_FROM_WIN32(::GetLastError()), "Failed to query performance counter");
727
728 // create temp file name
729 hr = StrAllocFormatted(ppwzTempFile, L"%sCPI%I64X.tmp", wzTempPath, liCount.QuadPart);
730 ExitOnFailure(hr, "Failed to create temp file name string");
731
732 hr = S_OK;
733
734LExit:
735 return hr;
736}
737
738HRESULT CpiCreateId(
739 LPWSTR pwzDest,
740 SIZE_T cchDest
741 )
742{
743 HRESULT hr = S_OK;
744
745 GUID guid;
746
747 // create new guid
748 hr = ::CoCreateGuid(&guid);
749 ExitOnFailure(hr, "Failed to create new guid");
750
751 // convert guid to string
752 if (0 == ::StringFromGUID2(guid, pwzDest, (int)cchDest))
753 ExitOnFailure(hr = E_FAIL, "Failed to convert guid to string");
754
755 hr = S_OK;
756
757LExit:
758 return hr;
759}
760
761BOOL CpiIsInstalled(
762 INSTALLSTATE isInstalled
763 )
764{
765 return INSTALLSTATE_LOCAL == isInstalled || INSTALLSTATE_SOURCE == isInstalled;
766}
767
768BOOL CpiWillBeInstalled(
769 INSTALLSTATE isInstalled,
770 INSTALLSTATE isAction
771 )
772{
773 return WcaIsInstalling(isInstalled, isAction) ||
774 (CpiIsInstalled(isInstalled) && !WcaIsUninstalling(isInstalled, isAction));
775}
776
777HRESULT PcaGuidToRegFormat(
778 LPWSTR pwzGuid,
779 LPWSTR pwzDest,
780 SIZE_T cchDest
781 )
782{
783 HRESULT hr = S_OK;
784
785 GUID guid = GUID_NULL;
786 int cch = 0;
787
788 WCHAR wz[39];
789 ::ZeroMemory(wz, sizeof(wz));
790
791 cch = lstrlenW(pwzGuid);
792
793 if (38 == cch && L'{' == pwzGuid[0] && L'}' == pwzGuid[37])
794 StringCchCopyW(wz, countof(wz), pwzGuid);
795 else if (36 == cch)
796 StringCchPrintfW(wz, countof(wz), L"{%s}", pwzGuid);
797 else
798 ExitFunction1(hr = E_INVALIDARG);
799
800 // convert string to guid
801 hr = ::CLSIDFromString(wz, &guid);
802 ExitOnFailure(hr, "Failed to parse guid string");
803
804 // convert guid to string
805 if (0 == ::StringFromGUID2(guid, pwzDest, (int)cchDest))
806 ExitOnFailure(hr = E_FAIL, "Failed to convert guid to string");
807
808 hr = S_OK;
809
810LExit:
811 return hr;
812}
813
814
815// helper function definitions
816
817static HRESULT FindPropertyDefinition(
818 CPI_PROPERTY_DEFINITION* pPropDefList,
819 LPCWSTR pwzName,
820 CPI_PROPERTY_DEFINITION** ppPropDef
821 )
822{
823 for (CPI_PROPERTY_DEFINITION* pItm = pPropDefList; pItm->pwzName; pItm++)
824 {
825 if (0 == lstrcmpW(pItm->pwzName, pwzName))
826 {
827 *ppPropDef = pItm;
828 return S_OK;
829 }
830 }
831
832 return S_FALSE;
833}
834
835static HRESULT GetUserAccountName(
836 LPCWSTR pwzKey,
837 LPWSTR* ppwzAccount
838 )
839{
840 HRESULT hr = S_OK;
841
842 PMSIHANDLE hView, hRecKey, hRec;
843
844 LPWSTR pwzDomain = NULL;
845 LPWSTR pwzName = NULL;
846
847 // create parameter record
848 hRecKey = ::MsiCreateRecord(1);
849 ExitOnNull(hRecKey, hr, E_OUTOFMEMORY, "Failed to create record");
850 hr = WcaSetRecordString(hRecKey, 1, pwzKey);
851 ExitOnFailure(hr, "Failed to set record string");
852
853 // open view
854 hr = WcaOpenView(vcsUserQuery, &hView);
855 ExitOnFailure(hr, "Failed to open view on User table");
856 hr = WcaExecuteView(hView, hRecKey);
857 ExitOnFailure(hr, "Failed to execute view on User table");
858
859 // fetch record
860 hr = WcaFetchSingleRecord(hView, &hRec);
861 if (S_FALSE == hr)
862 ExitOnFailure(hr = HRESULT_FROM_WIN32(ERROR_NOT_FOUND), "User not found, key: %S", pwzKey);
863 ExitOnFailure(hr, "Failed to fetch user record");
864
865 // get user domain
866 hr = WcaGetRecordFormattedString(hRec, uqDomain, &pwzDomain);
867 ExitOnFailure(hr, "Failed to get domain");
868
869 // get user name
870 hr = WcaGetRecordFormattedString(hRec, uqName, &pwzName);
871 ExitOnFailure(hr, "Failed to get name");
872
873 // build account name
874 hr = CpiBuildAccountName(pwzDomain, pwzName, ppwzAccount);
875 ExitOnFailure(hr, "Failed to build account name");
876
877 hr = S_OK;
878
879LExit:
880 // clean up
881 ReleaseStr(pwzDomain);
882 ReleaseStr(pwzName);
883
884 return hr;
885}
diff --git a/src/ext/ComPlus/ca/cputilsched.h b/src/ext/ComPlus/ca/cputilsched.h
new file mode 100644
index 00000000..1f315576
--- /dev/null
+++ b/src/ext/ComPlus/ca/cputilsched.h
@@ -0,0 +1,132 @@
1#pragma once
2// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
3
4
5enum eRunMode { rmDeferred = 1, rmCommit, rmRollback };
6
7enum eComPlusPropertyType { cpptNone = 0, cpptBoolean, cpptInteger, cpptString, cpptUser };
8
9enum eComPlusTables
10{
11 cptComPlusPartition = (1 << 0),
12 cptComPlusPartitionProperty = (1 << 1),
13 cptComPlusPartitionRole = (1 << 2),
14 cptComPlusUserInPartitionRole = (1 << 3),
15 cptComPlusGroupInPartitionRole = (1 << 4),
16 cptComPlusPartitionUser = (1 << 5),
17 cptComPlusApplication = (1 << 6),
18 cptComPlusApplicationProperty = (1 << 7),
19 cptComPlusApplicationRole = (1 << 8),
20 cptComPlusApplicationRoleProperty = (1 << 9),
21 cptComPlusUserInApplicationRole = (1 << 10),
22 cptComPlusGroupInApplicationRole = (1 << 11),
23 cptComPlusAssembly = (1 << 12),
24 cptComPlusAssemblyDependency = (1 << 13),
25 cptComPlusComponent = (1 << 14),
26 cptComPlusComponentProperty = (1 << 15),
27 cptComPlusRoleForComponent = (1 << 16),
28 cptComPlusInterface = (1 << 17),
29 cptComPlusInterfaceProperty = (1 << 18),
30 cptComPlusRoleForInterface = (1 << 19),
31 cptComPlusMethod = (1 << 20),
32 cptComPlusMethodProperty = (1 << 21),
33 cptComPlusRoleForMethod = (1 << 22),
34 cptComPlusSubscription = (1 << 23),
35 cptComPlusSubscriptionProperty = (1 << 24)
36};
37
38
39// structs
40
41struct CPI_PROPERTY_DEFINITION
42{
43 LPCWSTR pwzName;
44 int iType;
45 int iMinVersionNT;
46};
47
48
49// function prototypes
50
51void CpiSchedInitialize();
52void CpiSchedFinalize();
53BOOL CpiTableExists(
54 int iTable
55 );
56HRESULT CpiSchedGetAdminCatalog(
57 ICOMAdminCatalog** ppiCatalog
58 );
59HRESULT CpiSchedGetCatalogCollection(
60 LPCWSTR pwzName,
61 ICatalogCollection** ppiColl
62 );
63HRESULT CpiSchedGetCatalogCollection(
64 ICatalogCollection* piColl,
65 ICatalogObject* piObj,
66 LPCWSTR pwzName,
67 ICatalogCollection** ppiColl
68 );
69HRESULT CpiGetKeyForObject(
70 ICatalogObject* piObj,
71 LPWSTR pwzKey,
72 SIZE_T cchKey
73 );
74HRESULT CpiFindCollectionObject(
75 ICatalogCollection* piColl,
76 LPCWSTR pwzID,
77 LPCWSTR pwzName,
78 ICatalogObject** ppiObj
79 );
80HRESULT CpiSchedGetPartitionsCollection(
81 ICatalogCollection** ppiPartColl
82 );
83HRESULT CpiSchedGetApplicationsCollection(
84 ICatalogCollection** ppiAppColl
85 );
86HRESULT CpiAddActionTextToActionData(
87 LPCWSTR pwzAction,
88 LPWSTR* ppwzActionData
89 );
90HRESULT CpiVerifyComponentArchitecure(
91 LPCWSTR pwzComponent,
92 BOOL* pfMatchingArchitecture
93 );
94HRESULT CpiPropertiesRead(
95 LPCWSTR pwzQuery,
96 LPCWSTR pwzKey,
97 CPI_PROPERTY_DEFINITION* pPropDefList,
98 CPI_PROPERTY** ppPropList,
99 int* piCount
100 );
101void CpiPropertiesFreeList(
102 CPI_PROPERTY* pList
103 );
104HRESULT CpiAddPropertiesToActionData(
105 int iPropCount,
106 CPI_PROPERTY* pPropList,
107 LPWSTR* ppwzActionData
108 );
109HRESULT CpiBuildAccountName(
110 LPCWSTR pwzDomain,
111 LPCWSTR pwzName,
112 LPWSTR* ppwzAccount
113 );
114HRESULT CpiGetTempFileName(
115 LPWSTR* ppwzTempFile
116 );
117HRESULT CpiCreateId(
118 LPWSTR pwzDest,
119 SIZE_T cchDest
120 );
121BOOL CpiIsInstalled(
122 INSTALLSTATE isInstalled
123 );
124BOOL CpiWillBeInstalled(
125 INSTALLSTATE isInstalled,
126 INSTALLSTATE isAction
127 );
128HRESULT PcaGuidToRegFormat(
129 LPWSTR pwzGuid,
130 LPWSTR pwzDest,
131 SIZE_T cchDest
132 );
diff --git a/src/ext/ComPlus/ca/custommsierrors.h b/src/ext/ComPlus/ca/custommsierrors.h
new file mode 100644
index 00000000..219df698
--- /dev/null
+++ b/src/ext/ComPlus/ca/custommsierrors.h
@@ -0,0 +1,29 @@
1#pragma once
2// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
3
4
5#define msierrComPlusCannotConnect 28001
6#define msierrComPlusPartitionReadFailed 28002
7#define msierrComPlusPartitionRoleReadFailed 28003
8#define msierrComPlusUserInPartitionRoleReadFailed 28004
9#define msierrComPlusPartitionUserReadFailed 28005
10#define msierrComPlusApplicationReadFailed 28006
11#define msierrComPlusApplicationRoleReadFailed 28007
12#define msierrComPlusUserInApplicationRoleReadFailed 28008
13#define msierrComPlusAssembliesReadFailed 28009
14#define msierrComPlusSubscriptionReadFailed 28010
15#define msierrComPlusPartitionDependency 28011
16#define msierrComPlusPartitionNotFound 28012
17#define msierrComPlusPartitionIdConflict 28013
18#define msierrComPlusPartitionNameConflict 28014
19#define msierrComPlusApplicationDependency 28015
20#define msierrComPlusApplicationNotFound 28016
21#define msierrComPlusApplicationIdConflict 28017
22#define msierrComPlusApplicationNameConflict 28018
23#define msierrComPlusApplicationRoleDependency 28019
24#define msierrComPlusApplicationRoleNotFound 28020
25#define msierrComPlusApplicationRoleConflict 28021
26#define msierrComPlusAssemblyDependency 28022
27#define msierrComPlusSubscriptionIdConflict 28023
28#define msierrComPlusSubscriptionNameConflict 28024
29#define msierrComPlusFailedLookupNames 28025
diff --git a/src/ext/ComPlus/ca/dllmain.cpp b/src/ext/ComPlus/ca/dllmain.cpp
new file mode 100644
index 00000000..7d299feb
--- /dev/null
+++ b/src/ext/ComPlus/ca/dllmain.cpp
@@ -0,0 +1,27 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3#include "precomp.h"
4
5/********************************************************************
6DllMain - standard entry point for all WiX custom actions.
7
8********************************************************************/
9extern "C" BOOL WINAPI DllMain(
10 IN HINSTANCE hInstance,
11 IN ULONG ulReason,
12 IN LPVOID)
13{
14 switch(ulReason)
15 {
16 case DLL_PROCESS_ATTACH:
17 WcaGlobalInitialize(hInstance);
18 ::DisableThreadLibraryCalls(hInstance);
19 break;
20
21 case DLL_PROCESS_DETACH:
22 WcaGlobalFinalize();
23 break;
24 }
25
26 return TRUE;
27}
diff --git a/src/ext/ComPlus/ca/packages.config b/src/ext/ComPlus/ca/packages.config
new file mode 100644
index 00000000..e3dc0e43
--- /dev/null
+++ b/src/ext/ComPlus/ca/packages.config
@@ -0,0 +1,5 @@
1<?xml version="1.0" encoding="utf-8"?>
2<packages>
3 <package id="WixToolset.DUtil" version="4.0.30" targetFramework="native" />
4 <package id="WixToolset.WcaUtil" version="4.0.16" targetFramework="native" />
5</packages> \ No newline at end of file
diff --git a/src/ext/ComPlus/ca/precomp.h b/src/ext/ComPlus/ca/precomp.h
new file mode 100644
index 00000000..74c328d2
--- /dev/null
+++ b/src/ext/ComPlus/ca/precomp.h
@@ -0,0 +1,33 @@
1#pragma once
2// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
3
4
5#include <windows.h>
6#include <msiquery.h>
7#include <strsafe.h>
8#include <comadmin.h>
9#include <ntsecapi.h>
10#include <aclapi.h>
11
12#include "wcautil.h"
13#include "memutil.h"
14#include "strutil.h"
15#include "wiutil.h"
16
17#include "CustomMsiErrors.h"
18
19#include "cpcost.h"
20#include "cputilexec.h"
21#include "cppartexec.h"
22#include "cppartroleexec.h"
23#include "cpappexec.h"
24#include "cpapproleexec.h"
25#include "cpasmexec.h"
26#include "cpsubsexec.h"
27#include "cputilsched.h"
28#include "cppartsched.h"
29#include "cppartrolesched.h"
30#include "cpappsched.h"
31#include "cpapprolesched.h"
32#include "cpasmsched.h"
33#include "cpsubssched.h"
diff --git a/src/ext/ComPlus/nuget.config b/src/ext/ComPlus/nuget.config
new file mode 100644
index 00000000..db7aba29
--- /dev/null
+++ b/src/ext/ComPlus/nuget.config
@@ -0,0 +1,17 @@
1<?xml version="1.0" encoding="utf-8"?>
2<configuration>
3 <packageSources>
4 <clear />
5 <add key="wixtoolset-burn" value="https://ci.appveyor.com/nuget/wixtoolset-burn" />
6 <add key="wixtoolset-data" value="https://ci.appveyor.com/nuget/wixtoolset-data" />
7 <add key="wixtoolset-extensibility" value="https://ci.appveyor.com/nuget/wixtoolset-extensibility" />
8 <add key="wixtoolset-core" value="https://ci.appveyor.com/nuget/wixtoolset-core" />
9 <add key="wixtoolset-core-native" value="https://ci.appveyor.com/nuget/wixtoolset-core-native" />
10 <add key="wixtoolset-dtf" value="https://ci.appveyor.com/nuget/wixtoolset-dtf" />
11 <add key="wixtoolset-dutil" value="https://ci.appveyor.com/nuget/wixtoolset-dutil" />
12 <add key="wixtoolset-wcautil" value="https://ci.appveyor.com/nuget/wixtoolset-wcautil" />
13 <add key="wixtoolset-tools" value="https://ci.appveyor.com/nuget/wixtoolset-tools" />
14 <add key="wixbuildtools" value="https://ci.appveyor.com/nuget/wixbuildtools" />
15 <add key="api.nuget.org" value="https://api.nuget.org/v3/index.json" protocolVersion="3" />
16 </packageSources>
17</configuration> \ No newline at end of file
diff --git a/src/ext/ComPlus/test/WixToolsetTest.ComPlus/ComPlusExtensionFixture.cs b/src/ext/ComPlus/test/WixToolsetTest.ComPlus/ComPlusExtensionFixture.cs
new file mode 100644
index 00000000..ace4d6b6
--- /dev/null
+++ b/src/ext/ComPlus/test/WixToolsetTest.ComPlus/ComPlusExtensionFixture.cs
@@ -0,0 +1,32 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolsetTest.ComPlus
4{
5 using System.Linq;
6 using WixBuildTools.TestSupport;
7 using WixToolset.Core.TestPackage;
8 using WixToolset.ComPlus;
9 using Xunit;
10
11 public class ComPlusExtensionFixture
12 {
13 [Fact]
14 public void CanBuildUsingComPlusPartition()
15 {
16 var folder = TestData.Get(@"TestData\UsingComPlusPartition");
17 var build = new Builder(folder, typeof(ComPlusExtensionFactory), new[] { folder });
18
19 var results = build.BuildAndQuery(Build, "ComPlusPartition");
20 WixAssert.CompareLineByLine(new[]
21 {
22 "ComPlusPartition:MyPartition\tfilF5_pLhBuF5b4N9XEo52g_hUM5Lo\tMyPartitionId\tMyPartition",
23 }, results);
24 }
25
26 private static void Build(string[] args)
27 {
28 var result = WixRunner.Execute(args)
29 .AssertSuccess();
30 }
31 }
32}
diff --git a/src/ext/ComPlus/test/WixToolsetTest.ComPlus/TestData/UsingComPlusPartition/Package.en-us.wxl b/src/ext/ComPlus/test/WixToolsetTest.ComPlus/TestData/UsingComPlusPartition/Package.en-us.wxl
new file mode 100644
index 00000000..38c12ac1
--- /dev/null
+++ b/src/ext/ComPlus/test/WixToolsetTest.ComPlus/TestData/UsingComPlusPartition/Package.en-us.wxl
@@ -0,0 +1,11 @@
1<?xml version="1.0" encoding="utf-8"?>
2
3<!--
4This file contains the declaration of all the localizable strings.
5-->
6<WixLocalization xmlns="http://wixtoolset.org/schemas/v4/wxl" Culture="en-US">
7
8 <String Id="DowngradeError">A newer version of [ProductName] is already installed.</String>
9 <String Id="FeatureTitle">MsiPackage</String>
10
11</WixLocalization>
diff --git a/src/ext/ComPlus/test/WixToolsetTest.ComPlus/TestData/UsingComPlusPartition/Package.wxs b/src/ext/ComPlus/test/WixToolsetTest.ComPlus/TestData/UsingComPlusPartition/Package.wxs
new file mode 100644
index 00000000..bd31e81f
--- /dev/null
+++ b/src/ext/ComPlus/test/WixToolsetTest.ComPlus/TestData/UsingComPlusPartition/Package.wxs
@@ -0,0 +1,15 @@
1<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
2 <Package Name="MsiPackage" Language="1033" Version="1.0.0.0" Manufacturer="Example Corporation" UpgradeCode="047730a5-30fe-4a62-a520-da9381b8226a" InstallerVersion="200">
3 <MajorUpgrade DowngradeErrorMessage="!(loc.DowngradeError)" />
4
5 <Feature Id="ProductFeature" Title="!(loc.FeatureTitle)">
6 <ComponentGroupRef Id="ProductComponents" />
7 </Feature>
8 </Package>
9
10 <Fragment>
11 <StandardDirectory Id="ProgramFilesFolder">
12 <Directory Id="INSTALLFOLDER" Name="MsiPackage" />
13 </StandardDirectory>
14 </Fragment>
15</Wix>
diff --git a/src/ext/ComPlus/test/WixToolsetTest.ComPlus/TestData/UsingComPlusPartition/PackageComponents.wxs b/src/ext/ComPlus/test/WixToolsetTest.ComPlus/TestData/UsingComPlusPartition/PackageComponents.wxs
new file mode 100644
index 00000000..f61eedd6
--- /dev/null
+++ b/src/ext/ComPlus/test/WixToolsetTest.ComPlus/TestData/UsingComPlusPartition/PackageComponents.wxs
@@ -0,0 +1,12 @@
1<?xml version="1.0" encoding="utf-8"?>
2<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs"
3 xmlns:complus="http://wixtoolset.org/schemas/v4/wxs/complus">
4 <Fragment>
5 <ComponentGroup Id="ProductComponents" Directory="INSTALLFOLDER">
6 <Component>
7 <File Source="example.txt" />
8 <complus:ComPlusPartition Id="MyPartition" Name="MyPartition" PartitionId="MyPartitionId" />
9 </Component>
10 </ComponentGroup>
11 </Fragment>
12</Wix>
diff --git a/src/ext/ComPlus/test/WixToolsetTest.ComPlus/TestData/UsingComPlusPartition/example.txt b/src/ext/ComPlus/test/WixToolsetTest.ComPlus/TestData/UsingComPlusPartition/example.txt
new file mode 100644
index 00000000..1b4ffe8a
--- /dev/null
+++ b/src/ext/ComPlus/test/WixToolsetTest.ComPlus/TestData/UsingComPlusPartition/example.txt
@@ -0,0 +1 @@
This is example.txt. \ No newline at end of file
diff --git a/src/ext/ComPlus/test/WixToolsetTest.ComPlus/WixToolsetTest.ComPlus.csproj b/src/ext/ComPlus/test/WixToolsetTest.ComPlus/WixToolsetTest.ComPlus.csproj
new file mode 100644
index 00000000..e4a529cb
--- /dev/null
+++ b/src/ext/ComPlus/test/WixToolsetTest.ComPlus/WixToolsetTest.ComPlus.csproj
@@ -0,0 +1,38 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3
4<Project Sdk="Microsoft.NET.Sdk">
5 <PropertyGroup>
6 <TargetFramework>netcoreapp3.1</TargetFramework>
7 <IsPackable>false</IsPackable>
8 </PropertyGroup>
9
10 <PropertyGroup>
11 <NoWarn>NU1701</NoWarn>
12 </PropertyGroup>
13
14 <ItemGroup>
15 <Content Include="TestData\**" CopyToOutputDirectory="PreserveNewest" />
16 </ItemGroup>
17
18 <ItemGroup>
19 <ProjectReference Include="..\..\wixext\WixToolset.ComPlus.wixext.csproj" />
20 </ItemGroup>
21
22 <ItemGroup>
23 <PackageReference Include="WixToolset.Core" Version="4.0.*" />
24 <PackageReference Include="WixToolset.Core.Burn" Version="4.0.*" />
25 <PackageReference Include="WixToolset.Core.WindowsInstaller" Version="4.0.*" />
26 <PackageReference Include="WixToolset.Core.TestPackage" Version="4.0.*" />
27 </ItemGroup>
28
29 <ItemGroup>
30 <PackageReference Include="WixBuildTools.TestSupport" Version="4.0.*" />
31 </ItemGroup>
32
33 <ItemGroup>
34 <PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.3.0" />
35 <PackageReference Include="xunit" Version="2.4.1" />
36 <PackageReference Include="xunit.runner.visualstudio" Version="2.4.1" PrivateAssets="All" />
37 </ItemGroup>
38</Project>
diff --git a/src/ext/ComPlus/wix.snk b/src/ext/ComPlus/wix.snk
new file mode 100644
index 00000000..3908a66a
--- /dev/null
+++ b/src/ext/ComPlus/wix.snk
Binary files differ
diff --git a/src/ext/ComPlus/wixext/ComPlusCompiler.cs b/src/ext/ComPlus/wixext/ComPlusCompiler.cs
new file mode 100644
index 00000000..4404801e
--- /dev/null
+++ b/src/ext/ComPlus/wixext/ComPlusCompiler.cs
@@ -0,0 +1,2164 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.ComPlus
4{
5 using System;
6 using System.Collections.Generic;
7 using System.Xml.Linq;
8 using WixToolset.ComPlus.Symbols;
9 using WixToolset.Data;
10 using WixToolset.Extensibility;
11
12 /// <summary>
13 /// The compiler for the WiX Toolset COM+ Extension.
14 /// </summary>
15 public sealed class ComPlusCompiler : BaseCompilerExtension
16 {
17 /// <summary>
18 /// </summary>
19 /// <remarks></remarks>
20 public enum CpiAssemblyAttributes
21 {
22 EventClass = (1 << 0),
23 DotNetAssembly = (1 << 1),
24 DllPathFromGAC = (1 << 2),
25 RegisterInCommit = (1 << 3)
26 }
27
28 public override XNamespace Namespace => "http://wixtoolset.org/schemas/v4/wxs/complus";
29
30 /// <summary>
31 /// Processes an element for the Compiler.
32 /// </summary>
33 /// <param name="sourceLineNumbers">Source line number for the parent element.</param>
34 /// <param name="parentElement">Parent element of element to process.</param>
35 /// <param name="element">Element to process.</param>
36 /// <param name="contextValues">Extra information about the context in which this element is being parsed.</param>
37 public override void ParseElement(Intermediate intermediate, IntermediateSection section, XElement parentElement, XElement element, IDictionary<string, string> context)
38 {
39 switch (parentElement.Name.LocalName)
40 {
41 case "Component":
42 var componentId = context["ComponentId"];
43 var directoryId = context["DirectoryId"];
44 var win64 = Boolean.Parse(context["Win64"]);
45
46 switch (element.Name.LocalName)
47 {
48 case "ComPlusPartition":
49 this.ParseComPlusPartitionElement(intermediate, section, element, componentId, win64);
50 break;
51 case "ComPlusPartitionRole":
52 this.ParseComPlusPartitionRoleElement(intermediate, section, element, componentId, null);
53 break;
54 case "ComPlusUserInPartitionRole":
55 this.ParseComPlusUserInPartitionRoleElement(intermediate, section, element, componentId, null);
56 break;
57 case "ComPlusGroupInPartitionRole":
58 this.ParseComPlusGroupInPartitionRoleElement(intermediate, section, element, componentId, null);
59 break;
60 case "ComPlusPartitionUser":
61 this.ParseComPlusPartitionUserElement(intermediate, section, element, componentId, null);
62 break;
63 case "ComPlusApplication":
64 this.ParseComPlusApplicationElement(intermediate, section, element, componentId, win64, null);
65 break;
66 case "ComPlusApplicationRole":
67 this.ParseComPlusApplicationRoleElement(intermediate, section, element, componentId, null);
68 break;
69 case "ComPlusUserInApplicationRole":
70 this.ParseComPlusUserInApplicationRoleElement(intermediate, section, element, componentId, null);
71 break;
72 case "ComPlusGroupInApplicationRole":
73 this.ParseComPlusGroupInApplicationRoleElement(intermediate, section, element, componentId, null);
74 break;
75 case "ComPlusAssembly":
76 this.ParseComPlusAssemblyElement(intermediate, section, element, componentId, win64, null);
77 break;
78 case "ComPlusRoleForComponent":
79 this.ParseComPlusRoleForComponentElement(intermediate, section, element, componentId, null);
80 break;
81 case "ComPlusRoleForInterface":
82 this.ParseComPlusRoleForInterfaceElement(intermediate, section, element, componentId, null);
83 break;
84 case "ComPlusRoleForMethod":
85 this.ParseComPlusRoleForMethodElement(intermediate, section, element, componentId, null);
86 break;
87 case "ComPlusSubscription":
88 this.ParseComPlusSubscriptionElement(intermediate, section, element, componentId, null);
89 break;
90 default:
91 this.ParseHelper.UnexpectedElement(parentElement, element);
92 break;
93 }
94 break;
95 case "Fragment":
96 case "Module":
97 case "Package":
98 switch (element.Name.LocalName)
99 {
100 case "ComPlusPartition":
101 this.ParseComPlusPartitionElement(intermediate, section, element, null, false);
102 break;
103 case "ComPlusPartitionRole":
104 this.ParseComPlusPartitionRoleElement(intermediate, section, element, null, null);
105 break;
106 case "ComPlusApplication":
107 this.ParseComPlusApplicationElement(intermediate, section, element, null, false, null);
108 break;
109 case "ComPlusApplicationRole":
110 this.ParseComPlusApplicationRoleElement(intermediate, section, element, null, null);
111 break;
112 default:
113 this.ParseHelper.UnexpectedElement(parentElement, element);
114 break;
115 }
116 break;
117 default:
118 this.ParseHelper.UnexpectedElement(parentElement, element);
119 break;
120 }
121 }
122
123 /// <summary>
124 /// Parses a COM+ partition element.
125 /// </summary>
126 /// <param name="node">Element to parse.</param>
127 /// <param name="componentKey">Identifier of parent component.</param>
128 private void ParseComPlusPartitionElement(Intermediate intermediate, IntermediateSection section, XElement node, string componentKey, bool win64)
129 {
130 var sourceLineNumbers = this.ParseHelper.GetSourceLineNumbers(node);
131
132 Identifier key = null;
133 string id = null;
134 string name = null;
135
136 var properties = new Dictionary<string, string>();
137
138 foreach (var attrib in node.Attributes())
139 {
140 if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || this.Namespace == attrib.Name.Namespace)
141 {
142 switch (attrib.Name.LocalName)
143 {
144 case "Id":
145 key = this.ParseHelper.GetAttributeIdentifier(sourceLineNumbers, attrib);
146 break;
147 case "PartitionId":
148 id = this.TryFormatGuidValue(this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib));
149 break;
150 case "Name":
151 name = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
152 break;
153 case "Changeable":
154 this.Messaging.Write(WarningMessages.DeprecatedAttribute(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName));
155 break;
156 case "Deleteable":
157 if (null == componentKey)
158 {
159 this.Messaging.Write(ComPlusErrors.IllegalAttributeWithoutComponent(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName));
160 }
161 properties["Deleteable"] = YesNoType.Yes == this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib) ? "1" : "0";
162 break;
163 case "Description":
164 if (null == componentKey)
165 {
166 this.Messaging.Write(ComPlusErrors.IllegalAttributeWithoutComponent(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName));
167 }
168 properties["Description"] = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
169 break;
170 default:
171 this.ParseHelper.UnexpectedAttribute(node, attrib);
172 break;
173 }
174 }
175 else
176 {
177 this.ParseHelper.ParseExtensionAttribute(this.Context.Extensions, intermediate, section, node, attrib);
178 }
179 }
180
181 if (null != componentKey && null == name)
182 {
183 this.Messaging.Write(ComPlusErrors.RequiredAttributeUnderComponent(sourceLineNumbers, node.Name.LocalName, "Name"));
184 }
185 if (null == componentKey && null == id && null == name)
186 {
187 this.Messaging.Write(ComPlusErrors.RequiredAttributeNotUnderComponent(sourceLineNumbers, node.Name.LocalName, "Id", "Name"));
188 }
189
190 foreach (var child in node.Elements())
191 {
192 if (this.Namespace == child.Name.Namespace)
193 {
194 switch (child.Name.LocalName)
195 {
196 case "ComPlusPartitionRole":
197 this.ParseComPlusPartitionRoleElement(intermediate, section, child, componentKey, key?.Id);
198 break;
199 case "ComPlusPartitionUser":
200 this.ParseComPlusPartitionUserElement(intermediate, section, child, componentKey, key?.Id);
201 break;
202 case "ComPlusApplication":
203 this.ParseComPlusApplicationElement(intermediate, section, child, componentKey, win64, key?.Id);
204 break;
205 default:
206 this.ParseHelper.UnexpectedElement(node, child);
207 break;
208 }
209 }
210 else
211 {
212 this.ParseHelper.ParseExtensionElement(this.Context.Extensions, intermediate, section, node, child);
213 }
214 }
215
216 section.AddSymbol(new ComPlusPartitionSymbol(sourceLineNumbers, key)
217 {
218 ComponentRef = componentKey,
219 PartitionId = id,
220 Name = name,
221 });
222
223 foreach (var kvp in properties)
224 {
225 section.AddSymbol(new ComPlusPartitionPropertySymbol(sourceLineNumbers)
226 {
227 PartitionRef = key?.Id,
228 Name = kvp.Key,
229 Value = kvp.Value,
230 });
231 }
232
233 if (componentKey != null)
234 {
235 this.AddReferenceToConfigureComPlus(section, sourceLineNumbers, node.Name.LocalName, win64);
236 }
237 }
238
239 /// <summary>
240 /// Parses a COM+ partition role element.
241 /// </summary>
242 /// <param name="node">Element to parse.</param>
243 /// <param name="componentKey">Identifier of parent component.</param>
244 /// <param name="applicationKey">Optional identifier of parent application.</param>
245 private void ParseComPlusPartitionRoleElement(Intermediate intermediate, IntermediateSection section, XElement node, string componentKey, string partitionKey)
246 {
247 var sourceLineNumbers = this.ParseHelper.GetSourceLineNumbers(node);
248
249 Identifier key = null;
250 string name = null;
251
252 foreach (var attrib in node.Attributes())
253 {
254 if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || this.Namespace == attrib.Name.Namespace)
255 {
256 switch (attrib.Name.LocalName)
257 {
258 case "Id":
259 key = this.ParseHelper.GetAttributeIdentifier(sourceLineNumbers, attrib);
260 break;
261 case "Partition":
262 if (null != partitionKey)
263 {
264 this.Messaging.Write(ErrorMessages.IllegalAttributeWhenNested(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName, node.Parent.Name.LocalName));
265 }
266 partitionKey = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
267 this.ParseHelper.CreateSimpleReference(section, sourceLineNumbers, ComPlusSymbolDefinitions.ComPlusPartition, partitionKey);
268 break;
269 case "Name":
270 name = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
271 break;
272 default:
273 this.ParseHelper.UnexpectedAttribute(node, attrib);
274 break;
275 }
276 }
277 else
278 {
279 this.ParseHelper.ParseExtensionAttribute(this.Context.Extensions, intermediate, section, node, attrib);
280 }
281 }
282
283 if (null == partitionKey)
284 {
285 this.Messaging.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, node.Name.LocalName, "Partition"));
286 }
287
288 foreach (var child in node.Elements())
289 {
290 if (this.Namespace == child.Name.Namespace)
291 {
292 switch (child.Name.LocalName)
293 {
294 case "ComPlusUserInPartitionRole":
295 this.ParseComPlusUserInPartitionRoleElement(intermediate, section, child, componentKey, key?.Id);
296 break;
297 case "ComPlusGroupInPartitionRole":
298 this.ParseComPlusGroupInPartitionRoleElement(intermediate, section, child, componentKey, key?.Id);
299 break;
300 default:
301 this.ParseHelper.UnexpectedElement(node, child);
302 break;
303 }
304 }
305 else
306 {
307 this.ParseHelper.ParseExtensionElement(this.Context.Extensions, intermediate, section, node, child);
308 }
309 }
310
311 section.AddSymbol(new ComPlusPartitionRoleSymbol(sourceLineNumbers, key)
312 {
313 PartitionRef = partitionKey,
314 Name = name,
315 });
316 }
317
318 /// <summary>
319 /// Parses a COM+ partition role user element.
320 /// </summary>
321 /// <param name="node">Element to parse.</param>
322 /// <param name="componentKey">Identifier of parent component.</param>
323 /// <param name="applicationKey">Optional identifier of parent application role.</param>
324 private void ParseComPlusUserInPartitionRoleElement(Intermediate intermediate, IntermediateSection section, XElement node, string componentKey, string partitionRoleKey)
325 {
326 var sourceLineNumbers = this.ParseHelper.GetSourceLineNumbers(node);
327
328 Identifier key = null;
329 string user = null;
330
331 foreach (var attrib in node.Attributes())
332 {
333 if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || this.Namespace == attrib.Name.Namespace)
334 {
335 switch (attrib.Name.LocalName)
336 {
337 case "Id":
338 key = this.ParseHelper.GetAttributeIdentifier(sourceLineNumbers, attrib);
339 break;
340 case "PartitionRole":
341 if (null != partitionRoleKey)
342 {
343 this.Messaging.Write(ErrorMessages.IllegalAttributeWhenNested(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName, node.Parent.Name.LocalName));
344 }
345 partitionRoleKey = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
346 this.ParseHelper.CreateSimpleReference(section, sourceLineNumbers, ComPlusSymbolDefinitions.ComPlusPartitionRole, partitionRoleKey);
347 break;
348 case "User":
349 user = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
350 this.ParseHelper.CreateSimpleReference(section, sourceLineNumbers, "User", user);
351 break;
352 default:
353 this.ParseHelper.UnexpectedAttribute(node, attrib);
354 break;
355 }
356 }
357 else
358 {
359 this.ParseHelper.ParseExtensionAttribute(this.Context.Extensions, intermediate, section, node, attrib);
360 }
361 }
362
363 if (null == partitionRoleKey)
364 {
365 this.Messaging.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, node.Name.LocalName, "PartitionRole"));
366 }
367
368 section.AddSymbol(new ComPlusUserInPartitionRoleSymbol(sourceLineNumbers, key)
369 {
370 PartitionRoleRef = partitionRoleKey,
371 ComponentRef = componentKey,
372 UserRef = user,
373 });
374 }
375
376 /// <summary>
377 /// Parses a COM+ partition role user element.
378 /// </summary>
379 /// <param name="node">Element to parse.</param>
380 /// <param name="componentKey">Identifier of parent component.</param>
381 /// <param name="applicationKey">Optional identifier of parent application role.</param>
382 private void ParseComPlusGroupInPartitionRoleElement(Intermediate intermediate, IntermediateSection section, XElement node, string componentKey, string partitionRoleKey)
383 {
384 var sourceLineNumbers = this.ParseHelper.GetSourceLineNumbers(node);
385
386 Identifier key = null;
387 string group = null;
388
389 foreach (var attrib in node.Attributes())
390 {
391 if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || this.Namespace == attrib.Name.Namespace)
392 {
393 switch (attrib.Name.LocalName)
394 {
395 case "Id":
396 key = this.ParseHelper.GetAttributeIdentifier(sourceLineNumbers, attrib);
397 break;
398 case "PartitionRole":
399 if (null != partitionRoleKey)
400 {
401 this.Messaging.Write(ErrorMessages.IllegalAttributeWhenNested(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName, node.Parent.Name.LocalName));
402 }
403 partitionRoleKey = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
404 this.ParseHelper.CreateSimpleReference(section, sourceLineNumbers, ComPlusSymbolDefinitions.ComPlusPartitionRole, partitionRoleKey);
405 break;
406 case "Group":
407 group = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
408 this.ParseHelper.CreateSimpleReference(section, sourceLineNumbers, "Group", group);
409 break;
410 default:
411 this.ParseHelper.UnexpectedAttribute(node, attrib);
412 break;
413 }
414 }
415 else
416 {
417 this.ParseHelper.ParseExtensionAttribute(this.Context.Extensions, intermediate, section, node, attrib);
418 }
419 }
420
421 if (null == partitionRoleKey)
422 {
423 this.Messaging.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, node.Name.LocalName, "PartitionRole"));
424 }
425
426 section.AddSymbol(new ComPlusGroupInPartitionRoleSymbol(sourceLineNumbers, key)
427 {
428 PartitionRoleRef = partitionRoleKey,
429 ComponentRef = componentKey,
430 GroupRef = group,
431 });
432 }
433
434 /// <summary>
435 /// Parses a COM+ partition element.
436 /// </summary>
437 /// <param name="node">Element to parse.</param>
438 /// <param name="componentKey">Identifier of parent component.</param>
439 private void ParseComPlusPartitionUserElement(Intermediate intermediate, IntermediateSection section, XElement node, string componentKey, string partitionKey)
440 {
441 var sourceLineNumbers = this.ParseHelper.GetSourceLineNumbers(node);
442
443 Identifier key = null;
444 string user = null;
445
446 foreach (var attrib in node.Attributes())
447 {
448 if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || this.Namespace == attrib.Name.Namespace)
449 {
450 switch (attrib.Name.LocalName)
451 {
452 case "Id":
453 key = this.ParseHelper.GetAttributeIdentifier(sourceLineNumbers, attrib);
454 break;
455 case "Partition":
456 if (null != partitionKey)
457 {
458 this.Messaging.Write(ErrorMessages.IllegalAttributeWhenNested(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName, node.Parent.Name.LocalName));
459 }
460 partitionKey = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
461 this.ParseHelper.CreateSimpleReference(section, sourceLineNumbers, ComPlusSymbolDefinitions.ComPlusPartition, partitionKey);
462 break;
463 case "User":
464 user = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
465 this.ParseHelper.CreateSimpleReference(section, sourceLineNumbers, "User", user);
466 break;
467 default:
468 this.ParseHelper.UnexpectedAttribute(node, attrib);
469 break;
470 }
471 }
472 else
473 {
474 this.ParseHelper.ParseExtensionAttribute(this.Context.Extensions, intermediate, section, node, attrib);
475 }
476 }
477
478 if (null == partitionKey)
479 {
480 this.Messaging.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, node.Name.LocalName, "Partition"));
481 }
482
483 section.AddSymbol(new ComPlusPartitionUserSymbol(sourceLineNumbers, key)
484 {
485 PartitionRef = partitionKey,
486 ComponentRef = componentKey,
487 UserRef = user,
488 });
489 }
490
491 /// <summary>
492 /// Parses a COM+ application element.
493 /// </summary>
494 /// <param name="node">Element to parse.</param>
495 /// <param name="componentKey">Identifier of parent component.</param>
496 /// <param name="partitionKey">Optional identifier of parent partition.</param>
497 private void ParseComPlusApplicationElement(Intermediate intermediate, IntermediateSection section, XElement node, string componentKey, bool win64, string partitionKey)
498 {
499 var sourceLineNumbers = this.ParseHelper.GetSourceLineNumbers(node);
500
501 Identifier key = null;
502 string id = null;
503 string name = null;
504
505 var properties = new Dictionary<string, string>();
506
507 foreach (XAttribute attrib in node.Attributes())
508 {
509 if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || this.Namespace == attrib.Name.Namespace)
510 {
511 switch (attrib.Name.LocalName)
512 {
513 case "Id":
514 key = this.ParseHelper.GetAttributeIdentifier(sourceLineNumbers, attrib);
515 break;
516 case "Partition":
517 if (null != partitionKey)
518 {
519 this.Messaging.Write(ErrorMessages.IllegalAttributeWhenNested(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName, node.Parent.Name.LocalName));
520 }
521 partitionKey = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
522 this.ParseHelper.CreateSimpleReference(section, sourceLineNumbers, ComPlusSymbolDefinitions.ComPlusPartition, partitionKey);
523 break;
524 case "ApplicationId":
525 id = this.TryFormatGuidValue(this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib));
526 break;
527 case "Name":
528 name = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
529 break;
530 case "ThreeGigSupportEnabled":
531 if (null == componentKey)
532 {
533 this.Messaging.Write(ComPlusErrors.IllegalAttributeWithoutComponent(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName));
534 }
535 properties["3GigSupportEnabled"] = YesNoType.Yes == this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib) ? "1" : "0";
536 break;
537 case "AccessChecksLevel":
538 if (null == componentKey)
539 {
540 this.Messaging.Write(ComPlusErrors.IllegalAttributeWithoutComponent(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName));
541 }
542 var accessChecksLevelValue = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
543 switch (accessChecksLevelValue)
544 {
545 case "applicationLevel":
546 properties["AccessChecksLevel"] = "0";
547 break;
548 case "applicationComponentLevel":
549 properties["AccessChecksLevel"] = "1";
550 break;
551 default:
552 this.Messaging.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, "ComPlusApplication", "AccessChecksLevel", accessChecksLevelValue, "applicationLevel", "applicationComponentLevel"));
553 break;
554 }
555 break;
556 case "Activation":
557 if (null == componentKey)
558 {
559 this.Messaging.Write(ComPlusErrors.IllegalAttributeWithoutComponent(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName));
560 }
561 var activationValue = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
562 switch (activationValue)
563 {
564 case "inproc":
565 properties["Activation"] = "Inproc";
566 break;
567 case "local":
568 properties["Activation"] = "Local";
569 break;
570 default:
571 this.Messaging.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, "ComPlusApplication", "Activation", activationValue, "inproc", "local"));
572 break;
573 }
574 break;
575 case "ApplicationAccessChecksEnabled":
576 if (null == componentKey)
577 {
578 this.Messaging.Write(ComPlusErrors.IllegalAttributeWithoutComponent(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName));
579 }
580 properties["ApplicationAccessChecksEnabled"] = YesNoType.Yes == this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib) ? "1" : "0";
581 break;
582 case "ApplicationDirectory":
583 if (null == componentKey)
584 {
585 this.Messaging.Write(ComPlusErrors.IllegalAttributeWithoutComponent(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName));
586 }
587 properties["ApplicationDirectory"] = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
588 break;
589 case "Authentication":
590 if (null == componentKey)
591 {
592 this.Messaging.Write(ComPlusErrors.IllegalAttributeWithoutComponent(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName));
593 }
594 string authenticationValue = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
595 switch (authenticationValue)
596 {
597 case "default":
598 properties["Authentication"] = "0";
599 break;
600 case "none":
601 properties["Authentication"] = "1";
602 break;
603 case "connect":
604 properties["Authentication"] = "2";
605 break;
606 case "call":
607 properties["Authentication"] = "3";
608 break;
609 case "packet":
610 properties["Authentication"] = "4";
611 break;
612 case "integrity":
613 properties["Authentication"] = "5";
614 break;
615 case "privacy":
616 properties["Authentication"] = "6";
617 break;
618 default:
619 this.Messaging.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, "ComPlusApplication", "Authentication", authenticationValue, "default", "none", "connect", "call", "packet", "integrity", "privacy"));
620 break;
621 }
622 break;
623 case "AuthenticationCapability":
624 if (null == componentKey)
625 {
626 this.Messaging.Write(ComPlusErrors.IllegalAttributeWithoutComponent(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName));
627 }
628 var authenticationCapabilityValue = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
629 switch (authenticationCapabilityValue)
630 {
631 case "none":
632 properties["AuthenticationCapability"] = "0";
633 break;
634 case "secureReference":
635 properties["AuthenticationCapability"] = "2";
636 break;
637 case "staticCloaking":
638 properties["AuthenticationCapability"] = "32";
639 break;
640 case "dynamicCloaking":
641 properties["AuthenticationCapability"] = "64";
642 break;
643 default:
644 this.Messaging.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, "ComPlusApplication", "AuthenticationCapability", authenticationCapabilityValue, "none", "secureReference", "staticCloaking", "dynamicCloaking"));
645 break;
646 }
647 break;
648 case "Changeable":
649 this.Messaging.Write(WarningMessages.DeprecatedAttribute(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName));
650 break;
651 case "CommandLine":
652 if (null == componentKey)
653 {
654 this.Messaging.Write(ComPlusErrors.IllegalAttributeWithoutComponent(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName));
655 }
656 properties["CommandLine"] = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
657 break;
658 case "ConcurrentApps":
659 if (null == componentKey)
660 {
661 this.Messaging.Write(ComPlusErrors.IllegalAttributeWithoutComponent(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName));
662 }
663 properties["ConcurrentApps"] = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
664 break;
665 case "CreatedBy":
666 if (null == componentKey)
667 {
668 this.Messaging.Write(ComPlusErrors.IllegalAttributeWithoutComponent(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName));
669 }
670 properties["CreatedBy"] = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
671 break;
672 case "CRMEnabled":
673 if (null == componentKey)
674 {
675 this.Messaging.Write(ComPlusErrors.IllegalAttributeWithoutComponent(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName));
676 }
677 properties["CRMEnabled"] = YesNoType.Yes == this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib) ? "1" : "0";
678 break;
679 case "CRMLogFile":
680 if (null == componentKey)
681 {
682 this.Messaging.Write(ComPlusErrors.IllegalAttributeWithoutComponent(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName));
683 }
684 properties["CRMLogFile"] = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
685 break;
686 case "Deleteable":
687 if (null == componentKey)
688 {
689 this.Messaging.Write(ComPlusErrors.IllegalAttributeWithoutComponent(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName));
690 }
691 properties["Deleteable"] = YesNoType.Yes == this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib) ? "1" : "0";
692 break;
693 case "Description":
694 if (null == componentKey)
695 {
696 this.Messaging.Write(ComPlusErrors.IllegalAttributeWithoutComponent(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName));
697 }
698 properties["Description"] = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
699 break;
700 case "DumpEnabled":
701 if (null == componentKey)
702 {
703 this.Messaging.Write(ComPlusErrors.IllegalAttributeWithoutComponent(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName));
704 }
705 properties["DumpEnabled"] = YesNoType.Yes == this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib) ? "1" : "0";
706 break;
707 case "DumpOnException":
708 if (null == componentKey)
709 {
710 this.Messaging.Write(ComPlusErrors.IllegalAttributeWithoutComponent(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName));
711 }
712 properties["DumpOnException"] = YesNoType.Yes == this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib) ? "1" : "0";
713 break;
714 case "DumpOnFailfast":
715 if (null == componentKey)
716 {
717 this.Messaging.Write(ComPlusErrors.IllegalAttributeWithoutComponent(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName));
718 }
719 properties["DumpOnFailfast"] = YesNoType.Yes == this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib) ? "1" : "0";
720 break;
721 case "DumpPath":
722 if (null == componentKey)
723 {
724 this.Messaging.Write(ComPlusErrors.IllegalAttributeWithoutComponent(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName));
725 }
726 properties["DumpPath"] = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
727 break;
728 case "EventsEnabled":
729 if (null == componentKey)
730 {
731 this.Messaging.Write(ComPlusErrors.IllegalAttributeWithoutComponent(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName));
732 }
733 properties["EventsEnabled"] = YesNoType.Yes == this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib) ? "1" : "0";
734 break;
735 case "Identity":
736 if (null == componentKey)
737 {
738 this.Messaging.Write(ComPlusErrors.IllegalAttributeWithoutComponent(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName));
739 }
740 properties["Identity"] = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
741 break;
742 case "ImpersonationLevel":
743 if (null == componentKey)
744 {
745 this.Messaging.Write(ComPlusErrors.IllegalAttributeWithoutComponent(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName));
746 }
747 string impersonationLevelValue = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
748 switch (impersonationLevelValue)
749 {
750 case "anonymous":
751 properties["ImpersonationLevel"] = "1";
752 break;
753 case "identify":
754 properties["ImpersonationLevel"] = "2";
755 break;
756 case "impersonate":
757 properties["ImpersonationLevel"] = "3";
758 break;
759 case "delegate":
760 properties["ImpersonationLevel"] = "4";
761 break;
762 default:
763 this.Messaging.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, "ComPlusApplication", "ImpersonationLevel", impersonationLevelValue, "anonymous", "identify", "impersonate", "delegate"));
764 break;
765 }
766 break;
767 case "IsEnabled":
768 if (null == componentKey)
769 {
770 this.Messaging.Write(ComPlusErrors.IllegalAttributeWithoutComponent(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName));
771 }
772 properties["IsEnabled"] = YesNoType.Yes == this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib) ? "1" : "0";
773 break;
774 case "MaxDumpCount":
775 if (null == componentKey)
776 {
777 this.Messaging.Write(ComPlusErrors.IllegalAttributeWithoutComponent(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName));
778 }
779 properties["MaxDumpCount"] = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
780 break;
781 case "Password":
782 if (null == componentKey)
783 {
784 this.Messaging.Write(ComPlusErrors.IllegalAttributeWithoutComponent(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName));
785 }
786 properties["Password"] = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
787 break;
788 case "QCAuthenticateMsgs":
789 if (null == componentKey)
790 {
791 this.Messaging.Write(ComPlusErrors.IllegalAttributeWithoutComponent(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName));
792 }
793 string qcAuthenticateMsgsValue = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
794 switch (qcAuthenticateMsgsValue)
795 {
796 case "secureApps":
797 properties["QCAuthenticateMsgs"] = "0";
798 break;
799 case "off":
800 properties["QCAuthenticateMsgs"] = "1";
801 break;
802 case "on":
803 properties["QCAuthenticateMsgs"] = "2";
804 break;
805 default:
806 this.Messaging.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, "ComPlusApplication", "QCAuthenticateMsgs", qcAuthenticateMsgsValue, "secureApps", "off", "on"));
807 break;
808 }
809 break;
810 case "QCListenerMaxThreads":
811 if (null == componentKey)
812 {
813 this.Messaging.Write(ComPlusErrors.IllegalAttributeWithoutComponent(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName));
814 }
815 properties["QCListenerMaxThreads"] = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
816 break;
817 case "QueueListenerEnabled":
818 if (null == componentKey)
819 {
820 this.Messaging.Write(ComPlusErrors.IllegalAttributeWithoutComponent(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName));
821 }
822 properties["QueueListenerEnabled"] = YesNoType.Yes == this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib) ? "1" : "0";
823 break;
824 case "QueuingEnabled":
825 if (null == componentKey)
826 {
827 this.Messaging.Write(ComPlusErrors.IllegalAttributeWithoutComponent(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName));
828 }
829 properties["QueuingEnabled"] = YesNoType.Yes == this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib) ? "1" : "0";
830 break;
831 case "RecycleActivationLimit":
832 if (null == componentKey)
833 {
834 this.Messaging.Write(ComPlusErrors.IllegalAttributeWithoutComponent(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName));
835 }
836 properties["RecycleActivationLimit"] = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
837 break;
838 case "RecycleCallLimit":
839 if (null == componentKey)
840 {
841 this.Messaging.Write(ComPlusErrors.IllegalAttributeWithoutComponent(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName));
842 }
843 properties["RecycleCallLimit"] = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
844 break;
845 case "RecycleExpirationTimeout":
846 if (null == componentKey)
847 {
848 this.Messaging.Write(ComPlusErrors.IllegalAttributeWithoutComponent(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName));
849 }
850 properties["RecycleExpirationTimeout"] = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
851 break;
852 case "RecycleLifetimeLimit":
853 if (null == componentKey)
854 {
855 this.Messaging.Write(ComPlusErrors.IllegalAttributeWithoutComponent(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName));
856 }
857 properties["RecycleLifetimeLimit"] = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
858 break;
859 case "RecycleMemoryLimit":
860 if (null == componentKey)
861 {
862 this.Messaging.Write(ComPlusErrors.IllegalAttributeWithoutComponent(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName));
863 }
864 properties["RecycleMemoryLimit"] = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
865 break;
866 case "Replicable":
867 if (null == componentKey)
868 {
869 this.Messaging.Write(ComPlusErrors.IllegalAttributeWithoutComponent(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName));
870 }
871 properties["Replicable"] = YesNoType.Yes == this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib) ? "1" : "0";
872 break;
873 case "RunForever":
874 if (null == componentKey)
875 {
876 this.Messaging.Write(ComPlusErrors.IllegalAttributeWithoutComponent(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName));
877 }
878 properties["RunForever"] = YesNoType.Yes == this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib) ? "1" : "0";
879 break;
880 case "ShutdownAfter":
881 if (null == componentKey)
882 {
883 this.Messaging.Write(ComPlusErrors.IllegalAttributeWithoutComponent(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName));
884 }
885 properties["ShutdownAfter"] = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
886 break;
887 case "SoapActivated":
888 if (null == componentKey)
889 {
890 this.Messaging.Write(ComPlusErrors.IllegalAttributeWithoutComponent(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName));
891 }
892 properties["SoapActivated"] = YesNoType.Yes == this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib) ? "1" : "0";
893 break;
894 case "SoapBaseUrl":
895 if (null == componentKey)
896 {
897 this.Messaging.Write(ComPlusErrors.IllegalAttributeWithoutComponent(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName));
898 }
899 properties["SoapBaseUrl"] = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
900 break;
901 case "SoapMailTo":
902 if (null == componentKey)
903 {
904 this.Messaging.Write(ComPlusErrors.IllegalAttributeWithoutComponent(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName));
905 }
906 properties["SoapMailTo"] = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
907 break;
908 case "SoapVRoot":
909 if (null == componentKey)
910 {
911 this.Messaging.Write(ComPlusErrors.IllegalAttributeWithoutComponent(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName));
912 }
913 properties["SoapVRoot"] = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
914 break;
915 case "SRPEnabled":
916 if (null == componentKey)
917 {
918 this.Messaging.Write(ComPlusErrors.IllegalAttributeWithoutComponent(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName));
919 }
920 properties["SRPEnabled"] = YesNoType.Yes == this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib) ? "1" : "0";
921 break;
922 case "SRPTrustLevel":
923 if (null == componentKey)
924 {
925 this.Messaging.Write(ComPlusErrors.IllegalAttributeWithoutComponent(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName));
926 }
927 var srpTrustLevelValue = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
928 switch (srpTrustLevelValue)
929 {
930 case "disallowed":
931 properties["SRPTrustLevel"] = "0";
932 break;
933 case "fullyTrusted":
934 properties["SRPTrustLevel"] = "262144";
935 break;
936 default:
937 this.Messaging.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, "ComPlusApplication", "SRPTrustLevel", srpTrustLevelValue, "disallowed", "fullyTrusted"));
938 break;
939 }
940 break;
941 default:
942 this.ParseHelper.UnexpectedAttribute(node, attrib);
943 break;
944 }
945 }
946 else
947 {
948 this.ParseHelper.ParseExtensionAttribute(this.Context.Extensions, intermediate, section, node, attrib);
949 }
950 }
951
952 if (null != componentKey && null == name)
953 {
954 this.Messaging.Write(ComPlusErrors.RequiredAttributeUnderComponent(sourceLineNumbers, node.Name.LocalName, "Name"));
955 }
956 if (null == componentKey && null == id && null == name)
957 {
958 this.Messaging.Write(ComPlusErrors.RequiredAttributeNotUnderComponent(sourceLineNumbers, node.Name.LocalName, "Id", "Name"));
959 }
960
961 foreach (var child in node.Elements())
962 {
963 if (this.Namespace == child.Name.Namespace)
964 {
965 switch (child.Name.LocalName)
966 {
967 case "ComPlusApplicationRole":
968 this.ParseComPlusApplicationRoleElement(intermediate, section, child, componentKey, key?.Id);
969 break;
970 case "ComPlusAssembly":
971 this.ParseComPlusAssemblyElement(intermediate, section, child, componentKey, win64, key?.Id);
972 break;
973 default:
974 this.ParseHelper.UnexpectedElement(node, child);
975 break;
976 }
977 }
978 else
979 {
980 this.ParseHelper.ParseExtensionElement(this.Context.Extensions, intermediate, section, node, child);
981 }
982 }
983
984 section.AddSymbol(new ComPlusApplicationSymbol(sourceLineNumbers, key)
985 {
986 PartitionRef = partitionKey,
987 ComponentRef = componentKey,
988 ApplicationId = id,
989 Name = name,
990 });
991
992 foreach (var kvp in properties)
993 {
994 section.AddSymbol(new ComPlusApplicationPropertySymbol(sourceLineNumbers)
995 {
996 ApplicationRef = key?.Id,
997 Name = kvp.Key,
998 Value = kvp.Value,
999 });
1000 }
1001
1002 if (componentKey != null)
1003 {
1004 this.AddReferenceToConfigureComPlus(section, sourceLineNumbers, node.Name.LocalName, win64);
1005 }
1006 }
1007
1008 /// <summary>
1009 /// Parses a COM+ application role element.
1010 /// </summary>
1011 /// <param name="node">Element to parse.</param>
1012 /// <param name="componentKey">Identifier of parent component.</param>
1013 /// <param name="applicationKey">Optional identifier of parent application.</param>
1014 private void ParseComPlusApplicationRoleElement(Intermediate intermediate, IntermediateSection section, XElement node, string componentKey, string applicationKey)
1015 {
1016 var sourceLineNumbers = this.ParseHelper.GetSourceLineNumbers(node);
1017
1018 Identifier key = null;
1019 string name = null;
1020
1021 var properties = new Dictionary<string, string>();
1022
1023 foreach (var attrib in node.Attributes())
1024 {
1025 if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || this.Namespace == attrib.Name.Namespace)
1026 {
1027 switch (attrib.Name.LocalName)
1028 {
1029 case "Id":
1030 key = this.ParseHelper.GetAttributeIdentifier(sourceLineNumbers, attrib);
1031 break;
1032 case "Application":
1033 if (null != applicationKey)
1034 {
1035 this.Messaging.Write(ErrorMessages.IllegalAttributeWhenNested(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName, node.Parent.Name.LocalName));
1036 }
1037 applicationKey = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
1038 this.ParseHelper.CreateSimpleReference(section, sourceLineNumbers, ComPlusSymbolDefinitions.ComPlusApplication, applicationKey);
1039 break;
1040 case "Name":
1041 name = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
1042 break;
1043 case "Description":
1044 if (null == componentKey)
1045 {
1046 this.Messaging.Write(ComPlusErrors.IllegalAttributeWithoutComponent(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName));
1047 }
1048 properties["Description"] = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
1049 break;
1050 default:
1051 this.ParseHelper.UnexpectedAttribute(node, attrib);
1052 break;
1053 }
1054 }
1055 else
1056 {
1057 this.ParseHelper.ParseExtensionAttribute(this.Context.Extensions, intermediate, section, node, attrib);
1058 }
1059 }
1060
1061 if (null == applicationKey)
1062 {
1063 this.Messaging.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, node.Name.LocalName, "Application"));
1064 }
1065
1066 foreach (var child in node.Elements())
1067 {
1068 if (this.Namespace == child.Name.Namespace)
1069 {
1070 switch (child.Name.LocalName)
1071 {
1072 case "ComPlusUserInApplicationRole":
1073 this.ParseComPlusUserInApplicationRoleElement(intermediate, section, child, componentKey, key?.Id);
1074 break;
1075 case "ComPlusGroupInApplicationRole":
1076 this.ParseComPlusGroupInApplicationRoleElement(intermediate, section, child, componentKey, key?.Id);
1077 break;
1078 default:
1079 this.ParseHelper.UnexpectedElement(node, child);
1080 break;
1081 }
1082 }
1083 else
1084 {
1085 this.ParseHelper.ParseExtensionElement(this.Context.Extensions, intermediate, section, node, child);
1086 }
1087 }
1088
1089 section.AddSymbol(new ComPlusApplicationRoleSymbol(sourceLineNumbers, key)
1090 {
1091 ApplicationRef = applicationKey,
1092 ComponentRef = componentKey,
1093 Name = name,
1094 });
1095
1096 foreach (var kvp in properties)
1097 {
1098 section.AddSymbol(new ComPlusApplicationRolePropertySymbol(sourceLineNumbers)
1099 {
1100 ApplicationRoleRef = key?.Id,
1101 Name = kvp.Key,
1102 Value = kvp.Value,
1103 });
1104 }
1105 }
1106
1107 /// <summary>
1108 /// Parses a COM+ application role user element.
1109 /// </summary>
1110 /// <param name="node">Element to parse.</param>
1111 /// <param name="componentKey">Identifier of parent component.</param>
1112 /// <param name="applicationKey">Optional identifier of parent application role.</param>
1113 private void ParseComPlusUserInApplicationRoleElement(Intermediate intermediate, IntermediateSection section, XElement node, string componentKey, string applicationRoleKey)
1114 {
1115 var sourceLineNumbers = this.ParseHelper.GetSourceLineNumbers(node);
1116
1117 Identifier key = null;
1118 string user = null;
1119
1120 foreach (var attrib in node.Attributes())
1121 {
1122 if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || this.Namespace == attrib.Name.Namespace)
1123 {
1124 switch (attrib.Name.LocalName)
1125 {
1126 case "Id":
1127 key = this.ParseHelper.GetAttributeIdentifier(sourceLineNumbers, attrib);
1128 break;
1129 case "ApplicationRole":
1130 if (null != applicationRoleKey)
1131 {
1132 this.Messaging.Write(ErrorMessages.IllegalAttributeWhenNested(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName, node.Parent.Name.LocalName));
1133 }
1134 applicationRoleKey = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
1135 this.ParseHelper.CreateSimpleReference(section, sourceLineNumbers, ComPlusSymbolDefinitions.ComPlusApplicationRole, applicationRoleKey);
1136 break;
1137 case "User":
1138 user = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
1139 this.ParseHelper.CreateSimpleReference(section, sourceLineNumbers, "User", user);
1140 break;
1141 default:
1142 this.ParseHelper.UnexpectedAttribute(node, attrib);
1143 break;
1144 }
1145 }
1146 else
1147 {
1148 this.ParseHelper.ParseExtensionAttribute(this.Context.Extensions, intermediate, section, node, attrib);
1149 }
1150 }
1151
1152 if (null == applicationRoleKey)
1153 {
1154 this.Messaging.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, node.Name.LocalName, "ApplicationRole"));
1155 }
1156
1157 section.AddSymbol(new ComPlusUserInApplicationRoleSymbol(sourceLineNumbers, key)
1158 {
1159 ApplicationRoleRef = applicationRoleKey,
1160 ComponentRef = componentKey,
1161 UserRef = user,
1162 });
1163 }
1164
1165 /// <summary>
1166 /// Parses a COM+ application role group element.
1167 /// </summary>
1168 /// <param name="node">Element to parse.</param>
1169 /// <param name="componentKey">Identifier of parent component.</param>
1170 /// <param name="applicationKey">Optional identifier of parent application role.</param>
1171 private void ParseComPlusGroupInApplicationRoleElement(Intermediate intermediate, IntermediateSection section, XElement node, string componentKey, string applicationRoleKey)
1172 {
1173 var sourceLineNumbers = this.ParseHelper.GetSourceLineNumbers(node);
1174
1175 Identifier key = null;
1176 string group = null;
1177
1178 foreach (var attrib in node.Attributes())
1179 {
1180 if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || this.Namespace == attrib.Name.Namespace)
1181 {
1182 switch (attrib.Name.LocalName)
1183 {
1184 case "Id":
1185 key = this.ParseHelper.GetAttributeIdentifier(sourceLineNumbers, attrib);
1186 break;
1187 case "ApplicationRole":
1188 if (null != applicationRoleKey)
1189 {
1190 this.Messaging.Write(ErrorMessages.IllegalAttributeWhenNested(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName, node.Parent.Name.LocalName));
1191 }
1192 applicationRoleKey = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
1193 this.ParseHelper.CreateSimpleReference(section, sourceLineNumbers, ComPlusSymbolDefinitions.ComPlusApplicationRole, applicationRoleKey);
1194 break;
1195 case "Group":
1196 group = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
1197 this.ParseHelper.CreateSimpleReference(section, sourceLineNumbers, "Group", group);
1198 break;
1199 default:
1200 this.ParseHelper.UnexpectedAttribute(node, attrib);
1201 break;
1202 }
1203 }
1204 else
1205 {
1206 this.ParseHelper.ParseExtensionAttribute(this.Context.Extensions, intermediate, section, node, attrib);
1207 }
1208 }
1209
1210 if (null == applicationRoleKey)
1211 {
1212 this.Messaging.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, node.Name.LocalName, "ApplicationRole"));
1213 }
1214
1215 section.AddSymbol(new ComPlusGroupInApplicationRoleSymbol(sourceLineNumbers, key)
1216 {
1217 ApplicationRoleRef = applicationRoleKey,
1218 ComponentRef = componentKey,
1219 GroupRef = group,
1220 });
1221 }
1222
1223 /// <summary>
1224 /// Parses a COM+ assembly element.
1225 /// </summary>
1226 /// <param name="node">Element to parse.</param>
1227 /// <param name="componentKey">Identifier of parent component.</param>
1228 /// <param name="applicationKey">Optional identifier of parent application.</param>
1229 private void ParseComPlusAssemblyElement(Intermediate intermediate, IntermediateSection section, XElement node, string componentKey, bool win64, string applicationKey)
1230 {
1231 var sourceLineNumbers = this.ParseHelper.GetSourceLineNumbers(node);
1232
1233 Identifier key = null;
1234 string assemblyName = null;
1235 string dllPath = null;
1236 string tlbPath = null;
1237 string psDllPath = null;
1238 int attributes = 0;
1239
1240 var hasComponents = false;
1241
1242 foreach (var attrib in node.Attributes())
1243 {
1244 if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || this.Namespace == attrib.Name.Namespace)
1245 {
1246 switch (attrib.Name.LocalName)
1247 {
1248 case "Id":
1249 key = this.ParseHelper.GetAttributeIdentifier(sourceLineNumbers, attrib);
1250 break;
1251 case "Application":
1252 if (null != applicationKey)
1253 {
1254 this.Messaging.Write(ErrorMessages.IllegalAttributeWhenNested(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName, node.Parent.Name.LocalName));
1255 }
1256 applicationKey = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
1257 this.ParseHelper.CreateSimpleReference(section, sourceLineNumbers, ComPlusSymbolDefinitions.ComPlusApplication, applicationKey);
1258 break;
1259 case "AssemblyName":
1260 assemblyName = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
1261 break;
1262 case "DllPath":
1263 dllPath = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
1264 break;
1265 case "TlbPath":
1266 tlbPath = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
1267 break;
1268 case "PSDllPath":
1269 psDllPath = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
1270 break;
1271 case "Type":
1272 string typeValue = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
1273 switch (typeValue)
1274 {
1275 case ".net":
1276 attributes |= (int)CpiAssemblyAttributes.DotNetAssembly;
1277 break;
1278 case "native":
1279 attributes &= ~(int)CpiAssemblyAttributes.DotNetAssembly;
1280 break;
1281 default:
1282 this.Messaging.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, "ComPlusAssembly", "Type", typeValue, ".net", "native"));
1283 break;
1284 }
1285 break;
1286 case "EventClass":
1287 if (YesNoType.Yes == this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib))
1288 {
1289 attributes |= (int)CpiAssemblyAttributes.EventClass;
1290 }
1291 else
1292 {
1293 attributes &= ~(int)CpiAssemblyAttributes.EventClass;
1294 }
1295 break;
1296 case "DllPathFromGAC":
1297 if (YesNoType.Yes == this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib))
1298 {
1299 attributes |= (int)CpiAssemblyAttributes.DllPathFromGAC;
1300 }
1301 else
1302 {
1303 attributes &= ~(int)CpiAssemblyAttributes.DllPathFromGAC;
1304 }
1305 break;
1306 case "RegisterInCommit":
1307 if (YesNoType.Yes == this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib))
1308 {
1309 attributes |= (int)CpiAssemblyAttributes.RegisterInCommit;
1310 }
1311 else
1312 {
1313 attributes &= ~(int)CpiAssemblyAttributes.RegisterInCommit;
1314 }
1315 break;
1316 default:
1317 this.ParseHelper.UnexpectedAttribute(node, attrib);
1318 break;
1319 }
1320 }
1321 else
1322 {
1323 this.ParseHelper.ParseExtensionAttribute(this.Context.Extensions, intermediate, section, node, attrib);
1324 }
1325 }
1326
1327 if (null == applicationKey && 0 == (attributes & (int)CpiAssemblyAttributes.DotNetAssembly))
1328 {
1329 this.Messaging.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, node.Name.LocalName, "Application", "Type", "native"));
1330 }
1331 if (null != assemblyName && 0 == (attributes & (int)CpiAssemblyAttributes.DllPathFromGAC))
1332 {
1333 this.Messaging.Write(ComPlusErrors.UnexpectedAttributeWithoutOtherValue(sourceLineNumbers, node.Name.LocalName, "AssemblyName", "DllPathFromGAC", "no"));
1334 }
1335 if (null == tlbPath && 0 != (attributes & (int)CpiAssemblyAttributes.DotNetAssembly))
1336 {
1337 this.Messaging.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, node.Name.LocalName, "TlbPath", "Type", ".net"));
1338 }
1339 if (null != psDllPath && 0 != (attributes & (int)CpiAssemblyAttributes.DotNetAssembly))
1340 {
1341 this.Messaging.Write(ComPlusErrors.UnexpectedAttributeWithOtherValue(sourceLineNumbers, node.Name.LocalName, "PSDllPath", "Type", ".net"));
1342 }
1343 if (0 != (attributes & (int)CpiAssemblyAttributes.EventClass) && 0 != (attributes & (int)CpiAssemblyAttributes.DotNetAssembly))
1344 {
1345 this.Messaging.Write(ComPlusErrors.UnexpectedAttributeWithOtherValue(sourceLineNumbers, node.Name.LocalName, "EventClass", "yes", "Type", ".net"));
1346 }
1347
1348 foreach (var child in node.Elements())
1349 {
1350 if (this.Namespace == child.Name.Namespace)
1351 {
1352 switch (child.Name.LocalName)
1353 {
1354 case "ComPlusAssemblyDependency":
1355 this.ParseComPlusAssemblyDependencyElement(intermediate, section, child, key?.Id);
1356 break;
1357 case "ComPlusComponent":
1358 this.ParseComPlusComponentElement(intermediate, section, child, componentKey, key?.Id);
1359 hasComponents = true;
1360 break;
1361 default:
1362 this.ParseHelper.UnexpectedElement(node, child);
1363 break;
1364 }
1365 }
1366 else
1367 {
1368 this.ParseHelper.ParseExtensionElement(this.Context.Extensions, intermediate, section, node, child);
1369 }
1370 }
1371
1372 if (0 == (attributes & (int)CpiAssemblyAttributes.DotNetAssembly) && !hasComponents)
1373 {
1374 this.Messaging.Write(ComPlusWarnings.MissingComponents(sourceLineNumbers));
1375 }
1376
1377 section.AddSymbol(new ComPlusAssemblySymbol(sourceLineNumbers, key)
1378 {
1379 ApplicationRef = applicationKey,
1380 ComponentRef = componentKey,
1381 AssemblyName = assemblyName,
1382 DllPath = dllPath,
1383 TlbPath = tlbPath,
1384 PSDllPath = psDllPath,
1385 Attributes = attributes,
1386 });
1387
1388 this.AddReferenceToConfigureComPlus(section, sourceLineNumbers, node.Name.LocalName, win64);
1389 }
1390
1391 /// <summary>
1392 /// Parses a COM+ assembly dependency element.
1393 /// </summary>
1394 /// <param name="node">Element to parse.</param>
1395 /// <param name="assemblyKey">Identifier of parent assembly.</param>
1396 private void ParseComPlusAssemblyDependencyElement(Intermediate intermediate, IntermediateSection section, XElement node, string assemblyKey)
1397 {
1398 var sourceLineNumbers = this.ParseHelper.GetSourceLineNumbers(node);
1399
1400 string requiredAssemblyKey = null;
1401
1402 foreach (var attrib in node.Attributes())
1403 {
1404 if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || this.Namespace == attrib.Name.Namespace)
1405 {
1406 switch (attrib.Name.LocalName)
1407 {
1408 case "RequiredAssembly":
1409 requiredAssemblyKey = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
1410 break;
1411 default:
1412 this.ParseHelper.UnexpectedAttribute(node, attrib);
1413 break;
1414 }
1415 }
1416 else
1417 {
1418 this.ParseHelper.ParseExtensionAttribute(this.Context.Extensions, intermediate, section, node, attrib);
1419 }
1420 }
1421
1422 section.AddSymbol(new ComPlusAssemblyDependencySymbol(sourceLineNumbers)
1423 {
1424 AssemblyRef = assemblyKey,
1425 RequiredAssemblyRef = requiredAssemblyKey,
1426 });
1427 }
1428
1429 /// <summary>
1430 /// Parses a COM+ component element.
1431 /// </summary>
1432 /// <param name="node">Element to parse.</param>
1433 /// <param name="componentKey">Identifier of parent component.</param>
1434 /// <param name="assemblyKey">Identifier of parent assembly.</param>
1435 private void ParseComPlusComponentElement(Intermediate intermediate, IntermediateSection section, XElement node, string componentKey, string assemblyKey)
1436 {
1437 var sourceLineNumbers = this.ParseHelper.GetSourceLineNumbers(node);
1438
1439 Identifier key = null;
1440 string clsid = null;
1441
1442 var properties = new Dictionary<string, string>();
1443
1444 foreach (var attrib in node.Attributes())
1445 {
1446 if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || this.Namespace == attrib.Name.Namespace)
1447 {
1448 switch (attrib.Name.LocalName)
1449 {
1450 case "Id":
1451 key = this.ParseHelper.GetAttributeIdentifier(sourceLineNumbers, attrib);
1452 break;
1453 case "CLSID":
1454 clsid = "{" + this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib) + "}";
1455 break;
1456 case "AllowInprocSubscribers":
1457 properties["AllowInprocSubscribers"] = YesNoType.Yes == this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib) ? "1" : "0";
1458 break;
1459 case "ComponentAccessChecksEnabled":
1460 properties["ComponentAccessChecksEnabled"] = YesNoType.Yes == this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib) ? "1" : "0";
1461 break;
1462 case "ComponentTransactionTimeout":
1463 properties["ComponentTransactionTimeout"] = this.ParseHelper.GetAttributeIntegerValue(sourceLineNumbers, attrib, 0, 3600).ToString();
1464 break;
1465 case "ComponentTransactionTimeoutEnabled":
1466 properties["ComponentTransactionTimeoutEnabled"] = YesNoType.Yes == this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib) ? "1" : "0";
1467 break;
1468 case "COMTIIntrinsics":
1469 properties["COMTIIntrinsics"] = YesNoType.Yes == this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib) ? "1" : "0";
1470 break;
1471 case "ConstructionEnabled":
1472 properties["ConstructionEnabled"] = YesNoType.Yes == this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib) ? "1" : "0";
1473 break;
1474 case "ConstructorString":
1475 properties["ConstructorString"] = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
1476 break;
1477 case "CreationTimeout":
1478 properties["CreationTimeout"] = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
1479 break;
1480 case "Description":
1481 properties["Description"] = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
1482 break;
1483 case "EventTrackingEnabled":
1484 properties["EventTrackingEnabled"] = YesNoType.Yes == this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib) ? "1" : "0";
1485 break;
1486 case "ExceptionClass":
1487 properties["ExceptionClass"] = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
1488 break;
1489 case "FireInParallel":
1490 properties["FireInParallel"] = YesNoType.Yes == this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib) ? "1" : "0";
1491 break;
1492 case "IISIntrinsics":
1493 properties["IISIntrinsics"] = YesNoType.Yes == this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib) ? "1" : "0";
1494 break;
1495 case "InitializesServerApplication":
1496 properties["InitializesServerApplication"] = YesNoType.Yes == this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib) ? "1" : "0";
1497 break;
1498 case "IsEnabled":
1499 properties["IsEnabled"] = YesNoType.Yes == this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib) ? "1" : "0";
1500 break;
1501 case "IsPrivateComponent":
1502 properties["IsPrivateComponent"] = YesNoType.Yes == this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib) ? "1" : "0";
1503 break;
1504 case "JustInTimeActivation":
1505 properties["JustInTimeActivation"] = YesNoType.Yes == this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib) ? "1" : "0";
1506 break;
1507 case "LoadBalancingSupported":
1508 properties["LoadBalancingSupported"] = YesNoType.Yes == this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib) ? "1" : "0";
1509 break;
1510 case "MaxPoolSize":
1511 properties["MaxPoolSize"] = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
1512 break;
1513 case "MinPoolSize":
1514 properties["MinPoolSize"] = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
1515 break;
1516 case "MultiInterfacePublisherFilterCLSID":
1517 properties["MultiInterfacePublisherFilterCLSID"] = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
1518 break;
1519 case "MustRunInClientContext":
1520 properties["MustRunInClientContext"] = YesNoType.Yes == this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib) ? "1" : "0";
1521 break;
1522 case "MustRunInDefaultContext":
1523 properties["MustRunInDefaultContext"] = YesNoType.Yes == this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib) ? "1" : "0";
1524 break;
1525 case "ObjectPoolingEnabled":
1526 properties["ObjectPoolingEnabled"] = YesNoType.Yes == this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib) ? "1" : "0";
1527 break;
1528 case "PublisherID":
1529 properties["PublisherID"] = this.TryFormatGuidValue(this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib));
1530 break;
1531 case "SoapAssemblyName":
1532 properties["SoapAssemblyName"] = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
1533 break;
1534 case "SoapTypeName":
1535 properties["SoapTypeName"] = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
1536 break;
1537 case "Synchronization":
1538 var synchronizationValue = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
1539 switch (synchronizationValue)
1540 {
1541 case "ignored":
1542 properties["Synchronization"] = "0";
1543 break;
1544 case "none":
1545 properties["Synchronization"] = "1";
1546 break;
1547 case "supported":
1548 properties["Synchronization"] = "2";
1549 break;
1550 case "required":
1551 properties["Synchronization"] = "3";
1552 break;
1553 case "requiresNew":
1554 properties["Synchronization"] = "4";
1555 break;
1556 default:
1557 this.Messaging.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, "ComPlusComponent", "Synchronization", synchronizationValue, "ignored", "none", "supported", "required", "requiresNew"));
1558 break;
1559 }
1560 break;
1561 case "Transaction":
1562 var transactionValue = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
1563 switch (transactionValue)
1564 {
1565 case "ignored":
1566 properties["Transaction"] = "0";
1567 break;
1568 case "none":
1569 properties["Transaction"] = "1";
1570 break;
1571 case "supported":
1572 properties["Transaction"] = "2";
1573 break;
1574 case "required":
1575 properties["Transaction"] = "3";
1576 break;
1577 case "requiresNew":
1578 properties["Transaction"] = "4";
1579 break;
1580 default:
1581 this.Messaging.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, "ComPlusComponent", "Transaction", transactionValue, "ignored", "none", "supported", "required", "requiresNew"));
1582 break;
1583 }
1584 break;
1585 case "TxIsolationLevel":
1586 var txIsolationLevelValue = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
1587 switch (txIsolationLevelValue)
1588 {
1589 case "any":
1590 properties["TxIsolationLevel"] = "0";
1591 break;
1592 case "readUnCommitted":
1593 properties["TxIsolationLevel"] = "1";
1594 break;
1595 case "readCommitted":
1596 properties["TxIsolationLevel"] = "2";
1597 break;
1598 case "repeatableRead":
1599 properties["TxIsolationLevel"] = "3";
1600 break;
1601 case "serializable":
1602 properties["TxIsolationLevel"] = "4";
1603 break;
1604 default:
1605 this.Messaging.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, "ComPlusComponent", "TxIsolationLevel", txIsolationLevelValue, "any", "readUnCommitted", "readCommitted", "repeatableRead", "serializable"));
1606 break;
1607 }
1608 break;
1609 default:
1610 this.ParseHelper.UnexpectedAttribute(node, attrib);
1611 break;
1612 }
1613 }
1614 else
1615 {
1616 this.ParseHelper.ParseExtensionAttribute(this.Context.Extensions, intermediate, section, node, attrib);
1617 }
1618 }
1619
1620 foreach (var child in node.Elements())
1621 {
1622 if (this.Namespace == child.Name.Namespace)
1623 {
1624 switch (child.Name.LocalName)
1625 {
1626 case "ComPlusRoleForComponent":
1627 this.ParseComPlusRoleForComponentElement(intermediate, section, child, componentKey, key?.Id);
1628 break;
1629 case "ComPlusInterface":
1630 this.ParseComPlusInterfaceElement(intermediate, section, child, componentKey, key?.Id);
1631 break;
1632 case "ComPlusSubscription":
1633 this.ParseComPlusSubscriptionElement(intermediate, section, child, componentKey, key?.Id);
1634 break;
1635 default:
1636 this.ParseHelper.UnexpectedElement(node, child);
1637 break;
1638 }
1639 }
1640 else
1641 {
1642 this.ParseHelper.ParseExtensionElement(this.Context.Extensions, intermediate, section, node, child);
1643 }
1644 }
1645
1646 section.AddSymbol(new ComPlusComponentSymbol(sourceLineNumbers, key)
1647 {
1648 AssemblyRef = assemblyKey,
1649 CLSID = clsid,
1650 });
1651
1652 foreach (var kvp in properties)
1653 {
1654 section.AddSymbol(new ComPlusComponentPropertySymbol(sourceLineNumbers)
1655 {
1656 ComPlusComponentRef = key?.Id,
1657 Name = kvp.Key,
1658 Value = kvp.Value,
1659 });
1660 }
1661 }
1662
1663 /// <summary>
1664 /// Parses a COM+ application role for component element.
1665 /// </summary>
1666 /// <param name="node">Element to parse.</param>
1667 /// <param name="componentKey">Identifier of parent component.</param>
1668 /// <param name="cpcomponentKey">Identifier of parent COM+ component.</param>
1669 private void ParseComPlusRoleForComponentElement(Intermediate intermediate, IntermediateSection section, XElement node, string componentKey, string cpcomponentKey)
1670 {
1671 var sourceLineNumbers = this.ParseHelper.GetSourceLineNumbers(node);
1672
1673 Identifier key = null;
1674 string applicationRoleKey = null;
1675
1676 foreach (var attrib in node.Attributes())
1677 {
1678 if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || this.Namespace == attrib.Name.Namespace)
1679 {
1680 switch (attrib.Name.LocalName)
1681 {
1682 case "Id":
1683 key = this.ParseHelper.GetAttributeIdentifier(sourceLineNumbers, attrib);
1684 break;
1685 case "Component":
1686 if (null != cpcomponentKey)
1687 {
1688 this.Messaging.Write(ErrorMessages.IllegalAttributeWhenNested(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName, node.Parent.Name.LocalName));
1689 }
1690 cpcomponentKey = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
1691 this.ParseHelper.CreateSimpleReference(section, sourceLineNumbers, ComPlusSymbolDefinitions.ComPlusComponent, cpcomponentKey);
1692 break;
1693 case "ApplicationRole":
1694 applicationRoleKey = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
1695 break;
1696 default:
1697 this.ParseHelper.UnexpectedAttribute(node, attrib);
1698 break;
1699 }
1700 }
1701 else
1702 {
1703 this.ParseHelper.ParseExtensionAttribute(this.Context.Extensions, intermediate, section, node, attrib);
1704 }
1705 }
1706
1707 if (null == cpcomponentKey)
1708 {
1709 this.Messaging.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, node.Name.LocalName, "Component"));
1710 }
1711
1712 section.AddSymbol(new ComPlusRoleForComponentSymbol(sourceLineNumbers, key)
1713 {
1714 ComPlusComponentRef = cpcomponentKey,
1715 ApplicationRoleRef = applicationRoleKey,
1716 ComponentRef = componentKey,
1717 });
1718 }
1719
1720 /// <summary>
1721 /// Parses a COM+ interface element.
1722 /// </summary>
1723 /// <param name="node">Element to parse.</param>
1724 /// <param name="componentKey">Identifier of parent component.</param>
1725 /// <param name="cpcomponentKey">Identifier of parent COM+ component.</param>
1726 private void ParseComPlusInterfaceElement(Intermediate intermediate, IntermediateSection section, XElement node, string componentKey, string cpcomponentKey)
1727 {
1728 var sourceLineNumbers = this.ParseHelper.GetSourceLineNumbers(node);
1729
1730 // parse attributes
1731 Identifier key = null;
1732 string iid = null;
1733
1734 var properties = new Dictionary<string, string>();
1735
1736 foreach (var attrib in node.Attributes())
1737 {
1738 if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || this.Namespace == attrib.Name.Namespace)
1739 {
1740 switch (attrib.Name.LocalName)
1741 {
1742 case "Id":
1743 key = this.ParseHelper.GetAttributeIdentifier(sourceLineNumbers, attrib);
1744 break;
1745 case "IID":
1746 iid = "{" + this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib) + "}";
1747 break;
1748 case "Description":
1749 properties["Description"] = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
1750 break;
1751 case "QueuingEnabled":
1752 properties["QueuingEnabled"] = YesNoType.Yes == this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib) ? "1" : "0";
1753 break;
1754 default:
1755 this.ParseHelper.UnexpectedAttribute(node, attrib);
1756 break;
1757 }
1758 }
1759 else
1760 {
1761 this.ParseHelper.ParseExtensionAttribute(this.Context.Extensions, intermediate, section, node, attrib);
1762 }
1763 }
1764
1765 foreach (var child in node.Elements())
1766 {
1767 if (this.Namespace == child.Name.Namespace)
1768 {
1769 switch (child.Name.LocalName)
1770 {
1771 case "ComPlusRoleForInterface":
1772 this.ParseComPlusRoleForInterfaceElement(intermediate, section, child, componentKey, key?.Id);
1773 break;
1774 case "ComPlusMethod":
1775 this.ParseComPlusMethodElement(intermediate, section, child, componentKey, key?.Id);
1776 break;
1777 default:
1778 this.ParseHelper.UnexpectedElement(node, child);
1779 break;
1780 }
1781 }
1782 else
1783 {
1784 this.ParseHelper.ParseExtensionElement(this.Context.Extensions, intermediate, section, node, child);
1785 }
1786 }
1787
1788 section.AddSymbol(new ComPlusInterfaceSymbol(sourceLineNumbers, key)
1789 {
1790 ComPlusComponentRef = cpcomponentKey,
1791 IID = iid,
1792 });
1793
1794 foreach (var kvp in properties)
1795 {
1796 section.AddSymbol(new ComPlusInterfacePropertySymbol(sourceLineNumbers)
1797 {
1798 InterfaceRef = key?.Id,
1799 Name = kvp.Key,
1800 Value = kvp.Value,
1801 });
1802 }
1803 }
1804
1805 /// <summary>
1806 /// Parses a COM+ application role for interface element.
1807 /// </summary>
1808 /// <param name="node">Element to parse.</param>
1809 /// <param name="componentKey">Identifier of parent component.</param>
1810 /// <param name="interfaceKey">Identifier of parent interface.</param>
1811 private void ParseComPlusRoleForInterfaceElement(Intermediate intermediate, IntermediateSection section, XElement node, string componentKey, string interfaceKey)
1812 {
1813 var sourceLineNumbers = this.ParseHelper.GetSourceLineNumbers(node);
1814
1815 Identifier key = null;
1816 string applicationRoleKey = null;
1817
1818 foreach (var attrib in node.Attributes())
1819 {
1820 if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || this.Namespace == attrib.Name.Namespace)
1821 {
1822 switch (attrib.Name.LocalName)
1823 {
1824 case "Id":
1825 key = this.ParseHelper.GetAttributeIdentifier(sourceLineNumbers, attrib);
1826 break;
1827 case "Interface":
1828 if (null != interfaceKey)
1829 {
1830 this.Messaging.Write(ErrorMessages.IllegalAttributeWhenNested(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName, node.Parent.Name.LocalName));
1831 }
1832 interfaceKey = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
1833 this.ParseHelper.CreateSimpleReference(section, sourceLineNumbers, ComPlusSymbolDefinitions.ComPlusInterface, interfaceKey);
1834 break;
1835 case "ApplicationRole":
1836 applicationRoleKey = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
1837 break;
1838 default:
1839 this.ParseHelper.UnexpectedAttribute(node, attrib);
1840 break;
1841 }
1842 }
1843 else
1844 {
1845 this.ParseHelper.ParseExtensionAttribute(this.Context.Extensions, intermediate, section, node, attrib);
1846 }
1847 }
1848
1849 if (null == interfaceKey)
1850 {
1851 this.Messaging.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, node.Name.LocalName, "Interface"));
1852 }
1853
1854 section.AddSymbol(new ComPlusRoleForInterfaceSymbol(sourceLineNumbers, key)
1855 {
1856 InterfaceRef = interfaceKey,
1857 ApplicationRoleRef = applicationRoleKey,
1858 ComponentRef = componentKey,
1859 });
1860 }
1861
1862 /// <summary>
1863 /// Parses a COM+ method element.
1864 /// </summary>
1865 /// <param name="node">Element to parse.</param>
1866 /// <param name="componentKey">Identifier of parent component.</param>
1867 /// <param name="interfaceKey">Identifier of parent interface.</param>
1868 private void ParseComPlusMethodElement(Intermediate intermediate, IntermediateSection section, XElement node, string componentKey, string interfaceKey)
1869 {
1870 var sourceLineNumbers = this.ParseHelper.GetSourceLineNumbers(node);
1871
1872 Identifier key = null;
1873 var index = CompilerConstants.IntegerNotSet;
1874 string name = null;
1875
1876 var properties = new Dictionary<string, string>();
1877
1878 foreach (var attrib in node.Attributes())
1879 {
1880 if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || this.Namespace == attrib.Name.Namespace)
1881 {
1882 switch (attrib.Name.LocalName)
1883 {
1884 case "Id":
1885 key = this.ParseHelper.GetAttributeIdentifier(sourceLineNumbers, attrib);
1886 break;
1887 case "Index":
1888 index = this.ParseHelper.GetAttributeIntegerValue(sourceLineNumbers, attrib, 0, int.MaxValue);
1889 break;
1890 case "Name":
1891 name = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
1892 break;
1893 case "AutoComplete":
1894 properties["AutoComplete"] = YesNoType.Yes == this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib) ? "1" : "0";
1895 break;
1896 case "Description":
1897 properties["Description"] = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
1898 break;
1899 default:
1900 this.ParseHelper.UnexpectedAttribute(node, attrib);
1901 break;
1902 }
1903 }
1904 else
1905 {
1906 this.ParseHelper.ParseExtensionAttribute(this.Context.Extensions, intermediate, section, node, attrib);
1907 }
1908 }
1909
1910 foreach (var child in node.Elements())
1911 {
1912 if (this.Namespace == child.Name.Namespace)
1913 {
1914 switch (child.Name.LocalName)
1915 {
1916 case "ComPlusRoleForMethod":
1917 this.ParseComPlusRoleForMethodElement(intermediate, section, child, componentKey, key?.Id);
1918 break;
1919 default:
1920 this.ParseHelper.UnexpectedElement(node, child);
1921 break;
1922 }
1923 }
1924 else
1925 {
1926 this.ParseHelper.ParseExtensionElement(this.Context.Extensions, intermediate, section, node, child);
1927 }
1928 }
1929
1930 if (CompilerConstants.IntegerNotSet == index && null == name)
1931 {
1932 this.Messaging.Write(ComPlusErrors.RequiredAttribute(sourceLineNumbers, node.Name.LocalName, "Index", "Name"));
1933 }
1934
1935 var symbol = section.AddSymbol(new ComPlusMethodSymbol(sourceLineNumbers, key)
1936 {
1937 InterfaceRef = interfaceKey,
1938 Name = name,
1939 });
1940
1941 if (CompilerConstants.IntegerNotSet != index)
1942 {
1943 symbol.Index = index;
1944 }
1945
1946 foreach (var kvp in properties)
1947 {
1948 section.AddSymbol(new ComPlusMethodPropertySymbol(sourceLineNumbers)
1949 {
1950 MethodRef = key?.Id,
1951 Name = kvp.Key,
1952 Value = kvp.Value,
1953 });
1954 }
1955 }
1956
1957 /// <summary>
1958 /// Parses a COM+ application role for method element.
1959 /// </summary>
1960 /// <param name="node">Element to parse.</param>
1961 /// <param name="componentKey">Identifier of parent component.</param>
1962 /// <param name="methodKey">Identifier of parent method.</param>
1963 private void ParseComPlusRoleForMethodElement(Intermediate intermediate, IntermediateSection section, XElement node, string componentKey, string methodKey)
1964 {
1965 var sourceLineNumbers = this.ParseHelper.GetSourceLineNumbers(node);
1966
1967 Identifier key = null;
1968 string applicationRoleKey = null;
1969
1970 foreach (var attrib in node.Attributes())
1971 {
1972 if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || this.Namespace == attrib.Name.Namespace)
1973 {
1974 switch (attrib.Name.LocalName)
1975 {
1976 case "Id":
1977 key = this.ParseHelper.GetAttributeIdentifier(sourceLineNumbers, attrib);
1978 break;
1979 case "Method":
1980 if (null != methodKey)
1981 {
1982 this.Messaging.Write(ErrorMessages.IllegalAttributeWhenNested(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName, node.Parent.Name.LocalName));
1983 }
1984 methodKey = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
1985 this.ParseHelper.CreateSimpleReference(section, sourceLineNumbers, ComPlusSymbolDefinitions.ComPlusMethod, methodKey);
1986 break;
1987 case "ApplicationRole":
1988 applicationRoleKey = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
1989 break;
1990 default:
1991 this.ParseHelper.UnexpectedAttribute(node, attrib);
1992 break;
1993 }
1994 }
1995 else
1996 {
1997 this.ParseHelper.ParseExtensionAttribute(this.Context.Extensions, intermediate, section, node, attrib);
1998 }
1999 }
2000
2001 if (null == methodKey)
2002 {
2003 this.Messaging.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, node.Name.LocalName, "Method"));
2004 }
2005
2006 section.AddSymbol(new ComPlusRoleForMethodSymbol(sourceLineNumbers, key)
2007 {
2008 MethodRef = methodKey,
2009 ApplicationRoleRef = applicationRoleKey,
2010 ComponentRef = componentKey,
2011 });
2012 }
2013
2014 /// <summary>
2015 /// Parses a COM+ event subscription element.
2016 /// </summary>
2017 /// <param name="node">Element to parse.</param>
2018 /// <param name="componentKey">Identifier of parent component.</param>
2019 /// <param name="cpcomponentKey">Identifier of parent COM+ component.</param>
2020 private void ParseComPlusSubscriptionElement(Intermediate intermediate, IntermediateSection section, XElement node, string componentKey, string cpcomponentKey)
2021 {
2022 var sourceLineNumbers = this.ParseHelper.GetSourceLineNumbers(node);
2023
2024 Identifier key = null;
2025 string id = null;
2026 string name = null;
2027 string eventCLSID = null;
2028 string publisherID = null;
2029
2030 var properties = new Dictionary<string, string>();
2031
2032 foreach (var attrib in node.Attributes())
2033 {
2034 if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || this.Namespace == attrib.Name.Namespace)
2035 {
2036 switch (attrib.Name.LocalName)
2037 {
2038 case "Id":
2039 key = this.ParseHelper.GetAttributeIdentifier(sourceLineNumbers, attrib);
2040 break;
2041 case "Component":
2042 if (null != cpcomponentKey)
2043 {
2044 this.Messaging.Write(ErrorMessages.IllegalAttributeWhenNested(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName, node.Parent.Name.LocalName));
2045 }
2046 cpcomponentKey = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
2047 this.ParseHelper.CreateSimpleReference(section, sourceLineNumbers, ComPlusSymbolDefinitions.ComPlusComponent, cpcomponentKey);
2048 break;
2049 case "SubscriptionId":
2050 id = this.TryFormatGuidValue(this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib));
2051 break;
2052 case "Name":
2053 name = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
2054 break;
2055 case "EventCLSID":
2056 eventCLSID = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
2057 break;
2058 case "PublisherID":
2059 publisherID = this.TryFormatGuidValue(this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib));
2060 break;
2061 case "Description":
2062 properties["Description"] = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
2063 break;
2064 case "Enabled":
2065 properties["Enabled"] = YesNoType.Yes == this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib) ? "1" : "0";
2066 break;
2067 case "EventClassPartitionID":
2068 properties["EventClassPartitionID"] = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
2069 break;
2070 case "FilterCriteria":
2071 properties["FilterCriteria"] = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
2072 break;
2073 case "InterfaceID":
2074 properties["InterfaceID"] = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
2075 break;
2076 case "MachineName":
2077 properties["MachineName"] = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
2078 break;
2079 case "MethodName":
2080 properties["MethodName"] = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
2081 break;
2082 case "PerUser":
2083 properties["PerUser"] = YesNoType.Yes == this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib) ? "1" : "0";
2084 break;
2085 case "Queued":
2086 properties["Queued"] = YesNoType.Yes == this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib) ? "1" : "0";
2087 break;
2088 case "SubscriberMoniker":
2089 properties["SubscriberMoniker"] = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
2090 break;
2091 case "UserName":
2092 properties["UserName"] = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
2093 break;
2094 default:
2095 this.ParseHelper.UnexpectedAttribute(node, attrib);
2096 break;
2097 }
2098 }
2099 else
2100 {
2101 this.ParseHelper.ParseExtensionAttribute(this.Context.Extensions, intermediate, section, node, attrib);
2102 }
2103 }
2104
2105 if (null == cpcomponentKey)
2106 {
2107 this.Messaging.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, node.Name.LocalName, "Component"));
2108 }
2109
2110 this.ParseHelper.ParseForExtensionElements(this.Context.Extensions, intermediate, section, node);
2111
2112 section.AddSymbol(new ComPlusSubscriptionSymbol(sourceLineNumbers, key)
2113 {
2114 Subscription = key?.Id,
2115 ComPlusComponentRef = cpcomponentKey,
2116 ComponentRef = componentKey,
2117 SubscriptionId = id,
2118 Name = name,
2119 EventCLSID = eventCLSID,
2120 PublisherID = publisherID,
2121 });
2122
2123 foreach (var kvp in properties)
2124 {
2125 section.AddSymbol(new ComPlusSubscriptionPropertySymbol(sourceLineNumbers)
2126 {
2127 SubscriptionRef = key?.Id,
2128 Name = kvp.Key,
2129 Value = kvp.Value,
2130 });
2131 }
2132 }
2133
2134 /// <summary>
2135 /// Attempts to parse the input value as a GUID, and in case the value is a valid
2136 /// GUID returnes it in the format "{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}".
2137 /// </summary>
2138 /// <param name="val"></param>
2139 /// <returns></returns>
2140 private string TryFormatGuidValue(string val)
2141 {
2142 if (!Guid.TryParse(val, out var guid))
2143 {
2144 return val;
2145 }
2146 return guid.ToString("B").ToUpper();
2147 }
2148
2149 private void AddReferenceToConfigureComPlus(IntermediateSection section, SourceLineNumber sourceLineNumbers, string elementName, bool win64)
2150 {
2151 if (win64)
2152 {
2153 this.ParseHelper.CreateSimpleReference(section, sourceLineNumbers, "CustomAction", "ConfigureComPlusInstall_x64");
2154 this.ParseHelper.CreateSimpleReference(section, sourceLineNumbers, "CustomAction", "ConfigureComPlusUninstall_x64");
2155 }
2156 else
2157 {
2158 this.ParseHelper.CreateSimpleReference(section, sourceLineNumbers, "CustomAction", "ConfigureComPlusInstall");
2159 this.ParseHelper.CreateSimpleReference(section, sourceLineNumbers, "CustomAction", "ConfigureComPlusUninstall");
2160 }
2161
2162 }
2163 }
2164}
diff --git a/src/ext/ComPlus/wixext/ComPlusDecompiler.cs b/src/ext/ComPlus/wixext/ComPlusDecompiler.cs
new file mode 100644
index 00000000..6da2df94
--- /dev/null
+++ b/src/ext/ComPlus/wixext/ComPlusDecompiler.cs
@@ -0,0 +1,1845 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.ComPlus
4{
5#if TODO_CONSIDER_DECOMPILER
6 using System;
7 using System.Collections;
8 using System.Globalization;
9 using WixToolset.Data;
10 using WixToolset.Extensibility;
11 using ComPlus = WixToolset.Extensions.Serialize.ComPlus;
12 using Wix = WixToolset.Data.Serialize;
13
14 /// <summary>
15 /// The decompiler for the WiX Toolset COM+ Extension.
16 /// </summary>
17 public sealed class ComPlusDecompiler : DecompilerExtension
18 {
19 /// <summary>
20 /// Creates a decompiler for ComPlus Extension.
21 /// </summary>
22 public ComPlusDecompiler()
23 {
24 this.TableDefinitions = ComPlusExtensionData.GetExtensionTableDefinitions();
25 }
26
27 /// <summary>
28 /// Get the extensions library to be removed.
29 /// </summary>
30 /// <param name="tableDefinitions">Table definitions for library.</param>
31 /// <returns>Library to remove from decompiled output.</returns>
32 public override Library GetLibraryToRemove(TableDefinitionCollection tableDefinitions)
33 {
34 return ComPlusExtensionData.GetExtensionLibrary(tableDefinitions);
35 }
36
37 /// <summary>
38 /// Decompiles an extension table.
39 /// </summary>
40 /// <param name="table">The table to decompile.</param>
41 public override void DecompileTable(Table table)
42 {
43 switch (table.Name)
44 {
45 case "ComPlusPartition":
46 this.DecompileComPlusPartitionTable(table);
47 break;
48 case "ComPlusPartitionProperty":
49 this.DecompileComPlusPartitionPropertyTable(table);
50 break;
51 case "ComPlusPartitionRole":
52 this.DecompileComPlusPartitionRoleTable(table);
53 break;
54 case "ComPlusUserInPartitionRole":
55 this.DecompileComPlusUserInPartitionRoleTable(table);
56 break;
57 case "ComPlusGroupInPartitionRole":
58 this.DecompileComPlusGroupInPartitionRoleTable(table);
59 break;
60 case "ComPlusPartitionUser":
61 this.DecompileComPlusPartitionUserTable(table);
62 break;
63 case "ComPlusApplication":
64 this.DecompileComPlusApplicationTable(table);
65 break;
66 case "ComPlusApplicationProperty":
67 this.DecompileComPlusApplicationPropertyTable(table);
68 break;
69 case "ComPlusApplicationRole":
70 this.DecompileComPlusApplicationRoleTable(table);
71 break;
72 case "ComPlusApplicationRoleProperty":
73 this.DecompileComPlusApplicationRolePropertyTable(table);
74 break;
75 case "ComPlusUserInApplicationRole":
76 this.DecompileComPlusUserInApplicationRoleTable(table);
77 break;
78 case "ComPlusGroupInApplicationRole":
79 this.DecompileComPlusGroupInApplicationRoleTable(table);
80 break;
81 case "ComPlusAssembly":
82 this.DecompileComPlusAssemblyTable(table);
83 break;
84 case "ComPlusComponent":
85 this.DecompileComPlusComponentTable(table);
86 break;
87 case "ComPlusComponentProperty":
88 this.DecompileComPlusComponentPropertyTable(table);
89 break;
90 case "ComPlusRoleForComponent":
91 this.DecompileComPlusRoleForComponentTable(table);
92 break;
93 case "ComPlusInterface":
94 this.DecompileComPlusInterfaceTable(table);
95 break;
96 case "ComPlusInterfaceProperty":
97 this.DecompileComPlusInterfacePropertyTable(table);
98 break;
99 case "ComPlusRoleForInterface":
100 this.DecompileComPlusRoleForInterfaceTable(table);
101 break;
102 case "ComPlusMethod":
103 this.DecompileComPlusMethodTable(table);
104 break;
105 case "ComPlusMethodProperty":
106 this.DecompileComPlusMethodPropertyTable(table);
107 break;
108 case "ComPlusRoleForMethod":
109 this.DecompileComPlusRoleForMethodTable(table);
110 break;
111 case "ComPlusSubscription":
112 this.DecompileComPlusSubscriptionTable(table);
113 break;
114 case "ComPlusSubscriptionProperty":
115 this.DecompileComPlusSubscriptionPropertyTable(table);
116 break;
117 default:
118 base.DecompileTable(table);
119 break;
120 }
121 }
122
123 /// <summary>
124 /// Decompile the ComPlusPartition table.
125 /// </summary>
126 /// <param name="table">The table to decompile.</param>
127 private void DecompileComPlusPartitionTable(Table table)
128 {
129 foreach (Row row in table.Rows)
130 {
131 ComPlus.ComPlusPartition partition = new ComPlus.ComPlusPartition();
132
133 partition.Id = (string)row[0];
134
135 if (null != row[2])
136 {
137 partition.PartitionId = (string)row[2];
138 }
139
140 if (null != row[3])
141 {
142 partition.Name = (string)row[3];
143 }
144
145 if (null != row[1])
146 {
147 Wix.Component component = (Wix.Component)this.Core.GetIndexedElement("Component", (string)row[1]);
148 if (null != component)
149 {
150 component.AddChild(partition);
151 }
152 else
153 {
154 this.Core.OnMessage(WixWarnings.ExpectedForeignRow(row.SourceLineNumbers, table.Name, row.GetPrimaryKey(DecompilerConstants.PrimaryKeyDelimiter), "Component_", (string)row[1], "Component"));
155 }
156 }
157 else
158 {
159 this.Core.RootElement.AddChild(partition);
160 }
161 this.Core.IndexElement(row, partition);
162 }
163 }
164
165 /// <summary>
166 /// Decompile the ComPlusPartitionProperty table.
167 /// </summary>
168 /// <param name="table">The table to decompile.</param>
169 private void DecompileComPlusPartitionPropertyTable(Table table)
170 {
171 foreach (Row row in table.Rows)
172 {
173 ComPlus.ComPlusPartition partition = (ComPlus.ComPlusPartition)this.Core.GetIndexedElement("ComPlusPartition", (string)row[0]);
174 if (null == partition)
175 {
176 this.Core.OnMessage(WixWarnings.ExpectedForeignRow(row.SourceLineNumbers, table.Name, row.GetPrimaryKey(DecompilerConstants.PrimaryKeyDelimiter), "Partition_", (string)row[0], "ComPlusPartition"));
177 }
178
179 switch ((string)row[1])
180 {
181 case "Changeable":
182 switch ((string)row[2])
183 {
184 case "1":
185 partition.Changeable = ComPlus.YesNoType.yes;
186 break;
187 case "0":
188 partition.Changeable = ComPlus.YesNoType.no;
189 break;
190 default:
191 // TODO: Warning
192 break;
193 }
194 break;
195 case "Deleteable":
196 switch ((string)row[2])
197 {
198 case "1":
199 partition.Deleteable = ComPlus.YesNoType.yes;
200 break;
201 case "0":
202 partition.Deleteable = ComPlus.YesNoType.no;
203 break;
204 default:
205 // TODO: Warning
206 break;
207 }
208 break;
209 case "Description":
210 partition.Description = (string)row[2];
211 break;
212 default:
213 // TODO: Warning
214 break;
215 }
216 }
217 }
218
219 /// <summary>
220 /// Decompile the ComPlusPartitionRole table.
221 /// </summary>
222 /// <param name="table">The table to decompile.</param>
223 private void DecompileComPlusPartitionRoleTable(Table table)
224 {
225 foreach (Row row in table.Rows)
226 {
227 ComPlus.ComPlusPartitionRole partitionRole = new ComPlus.ComPlusPartitionRole();
228
229 partitionRole.Id = (string)row[0];
230 partitionRole.Partition = (string)row[1];
231 partitionRole.Name = (string)row[3];
232
233 Wix.Component component = (Wix.Component)this.Core.GetIndexedElement("Component", (string)row[2]);
234 if (null != component)
235 {
236 component.AddChild(partitionRole);
237 }
238 else
239 {
240 this.Core.OnMessage(WixWarnings.ExpectedForeignRow(row.SourceLineNumbers, table.Name, row.GetPrimaryKey(DecompilerConstants.PrimaryKeyDelimiter), "Component_", (string)row[2], "Component"));
241 }
242 }
243 }
244
245 /// <summary>
246 /// Decompile the ComPlusUserInPartitionRole table.
247 /// </summary>
248 /// <param name="table">The table to decompile.</param>
249 private void DecompileComPlusUserInPartitionRoleTable(Table table)
250 {
251 foreach (Row row in table.Rows)
252 {
253 ComPlus.ComPlusUserInPartitionRole userInPartitionRole = new ComPlus.ComPlusUserInPartitionRole();
254
255 userInPartitionRole.Id = (string)row[0];
256 userInPartitionRole.PartitionRole = (string)row[1];
257 userInPartitionRole.User = (string)row[3];
258
259 Wix.Component component = (Wix.Component)this.Core.GetIndexedElement("Component", (string)row[2]);
260 if (null != component)
261 {
262 component.AddChild(userInPartitionRole);
263 }
264 else
265 {
266 this.Core.OnMessage(WixWarnings.ExpectedForeignRow(row.SourceLineNumbers, table.Name, row.GetPrimaryKey(DecompilerConstants.PrimaryKeyDelimiter), "Component_", (string)row[2], "Component"));
267 }
268 }
269 }
270
271 /// <summary>
272 /// Decompile the ComPlusGroupInPartitionRole table.
273 /// </summary>
274 /// <param name="table">The table to decompile.</param>
275 private void DecompileComPlusGroupInPartitionRoleTable(Table table)
276 {
277 foreach (Row row in table.Rows)
278 {
279 ComPlus.ComPlusGroupInPartitionRole groupInPartitionRole = new ComPlus.ComPlusGroupInPartitionRole();
280
281 groupInPartitionRole.Id = (string)row[0];
282 groupInPartitionRole.PartitionRole = (string)row[1];
283 groupInPartitionRole.Group = (string)row[3];
284
285 Wix.Component component = (Wix.Component)this.Core.GetIndexedElement("Component", (string)row[2]);
286 if (null != component)
287 {
288 component.AddChild(groupInPartitionRole);
289 }
290 else
291 {
292 this.Core.OnMessage(WixWarnings.ExpectedForeignRow(row.SourceLineNumbers, table.Name, row.GetPrimaryKey(DecompilerConstants.PrimaryKeyDelimiter), "Component_", (string)row[2], "Component"));
293 }
294 }
295 }
296
297 /// <summary>
298 /// Decompile the ComPlusPartitionUser table.
299 /// </summary>
300 /// <param name="table">The table to decompile.</param>
301 private void DecompileComPlusPartitionUserTable(Table table)
302 {
303 foreach (Row row in table.Rows)
304 {
305 ComPlus.ComPlusPartitionUser partitionUser = new ComPlus.ComPlusPartitionUser();
306
307 partitionUser.Id = (string)row[0];
308 partitionUser.Partition = (string)row[1];
309 partitionUser.User = (string)row[3];
310
311 Wix.Component component = (Wix.Component)this.Core.GetIndexedElement("Component", (string)row[2]);
312 if (null != component)
313 {
314 component.AddChild(partitionUser);
315 }
316 else
317 {
318 this.Core.OnMessage(WixWarnings.ExpectedForeignRow(row.SourceLineNumbers, table.Name, row.GetPrimaryKey(DecompilerConstants.PrimaryKeyDelimiter), "Component_", (string)row[2], "Component"));
319 }
320 }
321 }
322
323 /// <summary>
324 /// Decompile the ComPlusApplication table.
325 /// </summary>
326 /// <param name="table">The table to decompile.</param>
327 private void DecompileComPlusApplicationTable(Table table)
328 {
329 foreach (Row row in table.Rows)
330 {
331 ComPlus.ComPlusApplication application = new ComPlus.ComPlusApplication();
332
333 application.Id = (string)row[0];
334 application.Partition = (string)row[1];
335
336 if (null != row[3])
337 {
338 application.ApplicationId = (string)row[3];
339 }
340
341 if (null != row[4])
342 {
343 application.Name = (string)row[4];
344 }
345
346 if (null != row[2])
347 {
348 Wix.Component component = (Wix.Component)this.Core.GetIndexedElement("Component", (string)row[1]);
349 if (null != component)
350 {
351 component.AddChild(application);
352 }
353 else
354 {
355 this.Core.OnMessage(WixWarnings.ExpectedForeignRow(row.SourceLineNumbers, table.Name, row.GetPrimaryKey(DecompilerConstants.PrimaryKeyDelimiter), "Component_", (string)row[2], "Component"));
356 }
357 }
358 else
359 {
360 this.Core.RootElement.AddChild(application);
361 }
362 this.Core.IndexElement(row, application);
363 }
364 }
365
366 /// <summary>
367 /// Decompile the ComPlusApplicationProperty table.
368 /// </summary>
369 /// <param name="table">The table to decompile.</param>
370 private void DecompileComPlusApplicationPropertyTable(Table table)
371 {
372 foreach (Row row in table.Rows)
373 {
374 ComPlus.ComPlusApplication application = (ComPlus.ComPlusApplication)this.Core.GetIndexedElement("ComPlusApplication", (string)row[0]);
375 if (null == application)
376 {
377 this.Core.OnMessage(WixWarnings.ExpectedForeignRow(row.SourceLineNumbers, table.Name, row.GetPrimaryKey(DecompilerConstants.PrimaryKeyDelimiter), "Application_", (string)row[0], "ComPlusApplication"));
378 }
379
380 switch ((string)row[1])
381 {
382 case "3GigSupportEnabled":
383 switch ((string)row[2])
384 {
385 case "1":
386 application.ThreeGigSupportEnabled = ComPlus.YesNoType.yes;
387 break;
388 case "0":
389 application.ThreeGigSupportEnabled = ComPlus.YesNoType.no;
390 break;
391 default:
392 // TODO: Warning
393 break;
394 }
395 break;
396 case "AccessChecksLevel":
397 switch ((string)row[2])
398 {
399 case "0":
400 application.AccessChecksLevel = ComPlus.ComPlusApplication.AccessChecksLevelType.applicationLevel;
401 break;
402 case "1":
403 application.AccessChecksLevel = ComPlus.ComPlusApplication.AccessChecksLevelType.applicationComponentLevel;
404 break;
405 default:
406 // TODO: Warning
407 break;
408 }
409 break;
410 case "Activation":
411 switch ((string)row[2])
412 {
413 case "Inproc":
414 application.Activation = ComPlus.ComPlusApplication.ActivationType.inproc;
415 break;
416 case "Local":
417 application.Activation = ComPlus.ComPlusApplication.ActivationType.local;
418 break;
419 default:
420 // TODO: Warning
421 break;
422 }
423 break;
424 case "ApplicationAccessChecksEnabled":
425 switch ((string)row[2])
426 {
427 case "1":
428 application.ApplicationAccessChecksEnabled = ComPlus.YesNoType.yes;
429 break;
430 case "0":
431 application.ApplicationAccessChecksEnabled = ComPlus.YesNoType.no;
432 break;
433 default:
434 // TODO: Warning
435 break;
436 }
437 break;
438 case "ApplicationDirectory":
439 application.ApplicationDirectory = (string)row[2];
440 break;
441 case "Authentication":
442 switch ((string)row[2])
443 {
444 case "0":
445 application.Authentication = ComPlus.ComPlusApplication.AuthenticationType.@default;
446 break;
447 case "1":
448 application.Authentication = ComPlus.ComPlusApplication.AuthenticationType.none;
449 break;
450 case "2":
451 application.Authentication = ComPlus.ComPlusApplication.AuthenticationType.connect;
452 break;
453 case "3":
454 application.Authentication = ComPlus.ComPlusApplication.AuthenticationType.call;
455 break;
456 case "4":
457 application.Authentication = ComPlus.ComPlusApplication.AuthenticationType.packet;
458 break;
459 case "5":
460 application.Authentication = ComPlus.ComPlusApplication.AuthenticationType.integrity;
461 break;
462 case "6":
463 application.Authentication = ComPlus.ComPlusApplication.AuthenticationType.privacy;
464 break;
465 default:
466 // TODO: Warning
467 break;
468 }
469 break;
470 case "AuthenticationCapability":
471 switch ((string)row[2])
472 {
473 case "0":
474 application.AuthenticationCapability = ComPlus.ComPlusApplication.AuthenticationCapabilityType.none;
475 break;
476 case "2":
477 application.AuthenticationCapability = ComPlus.ComPlusApplication.AuthenticationCapabilityType.secureReference;
478 break;
479 case "32":
480 application.AuthenticationCapability = ComPlus.ComPlusApplication.AuthenticationCapabilityType.staticCloaking;
481 break;
482 case "64":
483 application.AuthenticationCapability = ComPlus.ComPlusApplication.AuthenticationCapabilityType.dynamicCloaking;
484 break;
485 default:
486 // TODO: Warning
487 break;
488 }
489 break;
490 case "Changeable":
491 switch ((string)row[2])
492 {
493 case "1":
494 application.Changeable = ComPlus.YesNoType.yes;
495 break;
496 case "0":
497 application.Changeable = ComPlus.YesNoType.no;
498 break;
499 default:
500 // TODO: Warning
501 break;
502 }
503 break;
504 case "CommandLine":
505 application.CommandLine = (string)row[2];
506 break;
507 case "ConcurrentApps":
508 int concurrentApps;
509 if (Int32.TryParse((string)row[2], out concurrentApps))
510 {
511 application.ConcurrentApps = concurrentApps;
512 }
513 else
514 {
515 // TODO: Warning
516 }
517 break;
518 case "CreatedBy":
519 application.CreatedBy = (string)row[2];
520 break;
521 case "CRMEnabled":
522 switch ((string)row[2])
523 {
524 case "1":
525 application.CRMEnabled = ComPlus.YesNoType.yes;
526 break;
527 case "0":
528 application.CRMEnabled = ComPlus.YesNoType.no;
529 break;
530 default:
531 // TODO: Warning
532 break;
533 }
534 break;
535 case "CRMLogFile":
536 application.CRMLogFile = (string)row[2];
537 break;
538 case "Deleteable":
539 switch ((string)row[2])
540 {
541 case "1":
542 application.Deleteable = ComPlus.YesNoType.yes;
543 break;
544 case "0":
545 application.Deleteable = ComPlus.YesNoType.no;
546 break;
547 default:
548 // TODO: Warning
549 break;
550 }
551 break;
552 case "Description":
553 application.Description = (string)row[2];
554 break;
555 case "DumpEnabled":
556 switch ((string)row[2])
557 {
558 case "1":
559 application.DumpEnabled = ComPlus.YesNoType.yes;
560 break;
561 case "0":
562 application.DumpEnabled = ComPlus.YesNoType.no;
563 break;
564 default:
565 // TODO: Warning
566 break;
567 }
568 break;
569 case "DumpOnException":
570 switch ((string)row[2])
571 {
572 case "1":
573 application.DumpOnException = ComPlus.YesNoType.yes;
574 break;
575 case "0":
576 application.DumpOnException = ComPlus.YesNoType.no;
577 break;
578 default:
579 // TODO: Warning
580 break;
581 }
582 break;
583 case "DumpOnFailfast":
584 switch ((string)row[2])
585 {
586 case "1":
587 application.DumpOnFailfast = ComPlus.YesNoType.yes;
588 break;
589 case "0":
590 application.DumpOnFailfast = ComPlus.YesNoType.no;
591 break;
592 default:
593 // TODO: Warning
594 break;
595 }
596 break;
597 case "DumpPath":
598 application.DumpPath = (string)row[2];
599 break;
600 case "EventsEnabled":
601 switch ((string)row[2])
602 {
603 case "1":
604 application.EventsEnabled = ComPlus.YesNoType.yes;
605 break;
606 case "0":
607 application.EventsEnabled = ComPlus.YesNoType.no;
608 break;
609 default:
610 // TODO: Warning
611 break;
612 }
613 break;
614 case "Identity":
615 application.Identity = (string)row[2];
616 break;
617 case "ImpersonationLevel":
618 switch ((string)row[2])
619 {
620 case "1":
621 application.ImpersonationLevel = ComPlus.ComPlusApplication.ImpersonationLevelType.anonymous;
622 break;
623 case "2":
624 application.ImpersonationLevel = ComPlus.ComPlusApplication.ImpersonationLevelType.identify;
625 break;
626 case "3":
627 application.ImpersonationLevel = ComPlus.ComPlusApplication.ImpersonationLevelType.impersonate;
628 break;
629 case "4":
630 application.ImpersonationLevel = ComPlus.ComPlusApplication.ImpersonationLevelType.@delegate;
631 break;
632 default:
633 // TODO: Warning
634 break;
635 }
636 break;
637 case "IsEnabled":
638 switch ((string)row[2])
639 {
640 case "1":
641 application.IsEnabled = ComPlus.YesNoType.yes;
642 break;
643 case "0":
644 application.IsEnabled = ComPlus.YesNoType.no;
645 break;
646 default:
647 // TODO: Warning
648 break;
649 }
650 break;
651 case "MaxDumpCount":
652 int maxDumpCount;
653 if (Int32.TryParse((string)row[2], out maxDumpCount))
654 {
655 application.MaxDumpCount = maxDumpCount;
656 }
657 else
658 {
659 // TODO: Warning
660 }
661 break;
662 case "Password":
663 application.Password = (string)row[2];
664 break;
665 case "QCAuthenticateMsgs":
666 switch ((string)row[2])
667 {
668 case "0":
669 application.QCAuthenticateMsgs = ComPlus.ComPlusApplication.QCAuthenticateMsgsType.secureApps;
670 break;
671 case "1":
672 application.QCAuthenticateMsgs = ComPlus.ComPlusApplication.QCAuthenticateMsgsType.off;
673 break;
674 case "2":
675 application.QCAuthenticateMsgs = ComPlus.ComPlusApplication.QCAuthenticateMsgsType.on;
676 break;
677 default:
678 // TODO: Warning
679 break;
680 }
681 break;
682 case "QCListenerMaxThreads":
683 int qcListenerMaxThreads;
684 if (Int32.TryParse((string)row[2], out qcListenerMaxThreads))
685 {
686 application.QCListenerMaxThreads = qcListenerMaxThreads;
687 }
688 else
689 {
690 // TODO: Warning
691 }
692 break;
693 case "QueueListenerEnabled":
694 switch ((string)row[2])
695 {
696 case "1":
697 application.QueueListenerEnabled = ComPlus.YesNoType.yes;
698 break;
699 case "0":
700 application.QueueListenerEnabled = ComPlus.YesNoType.no;
701 break;
702 default:
703 // TODO: Warning
704 break;
705 }
706 break;
707 case "QueuingEnabled":
708 switch ((string)row[2])
709 {
710 case "1":
711 application.QueuingEnabled = ComPlus.YesNoType.yes;
712 break;
713 case "0":
714 application.QueuingEnabled = ComPlus.YesNoType.no;
715 break;
716 default:
717 // TODO: Warning
718 break;
719 }
720 break;
721 case "RecycleActivationLimit":
722 int recycleActivationLimit;
723 if (Int32.TryParse((string)row[2], out recycleActivationLimit))
724 {
725 application.RecycleActivationLimit = recycleActivationLimit;
726 }
727 else
728 {
729 // TODO: Warning
730 }
731 break;
732 case "RecycleCallLimit":
733 int recycleCallLimit;
734 if (Int32.TryParse((string)row[2], out recycleCallLimit))
735 {
736 application.RecycleCallLimit = recycleCallLimit;
737 }
738 else
739 {
740 // TODO: Warning
741 }
742 break;
743 case "RecycleExpirationTimeout":
744 int recycleExpirationTimeout;
745 if (Int32.TryParse((string)row[2], out recycleExpirationTimeout))
746 {
747 application.RecycleExpirationTimeout = recycleExpirationTimeout;
748 }
749 else
750 {
751 // TODO: Warning
752 }
753 break;
754 case "RecycleLifetimeLimit":
755 int recycleLifetimeLimit;
756 if (Int32.TryParse((string)row[2], out recycleLifetimeLimit))
757 {
758 application.RecycleLifetimeLimit = recycleLifetimeLimit;
759 }
760 else
761 {
762 // TODO: Warning
763 }
764 break;
765 case "RecycleMemoryLimit":
766 int recycleMemoryLimit;
767 if (Int32.TryParse((string)row[2], out recycleMemoryLimit))
768 {
769 application.RecycleMemoryLimit = recycleMemoryLimit;
770 }
771 else
772 {
773 // TODO: Warning
774 }
775 break;
776 case "Replicable":
777 switch ((string)row[2])
778 {
779 case "1":
780 application.Replicable = ComPlus.YesNoType.yes;
781 break;
782 case "0":
783 application.Replicable = ComPlus.YesNoType.no;
784 break;
785 default:
786 // TODO: Warning
787 break;
788 }
789 break;
790 case "RunForever":
791 switch ((string)row[2])
792 {
793 case "1":
794 application.RunForever = ComPlus.YesNoType.yes;
795 break;
796 case "0":
797 application.RunForever = ComPlus.YesNoType.no;
798 break;
799 default:
800 // TODO: Warning
801 break;
802 }
803 break;
804 case "ShutdownAfter":
805 int shutdownAfter;
806 if (Int32.TryParse((string)row[2], out shutdownAfter))
807 {
808 application.ShutdownAfter = shutdownAfter;
809 }
810 else
811 {
812 // TODO: Warning
813 }
814 break;
815 case "SoapActivated":
816 switch ((string)row[2])
817 {
818 case "1":
819 application.SoapActivated = ComPlus.YesNoType.yes;
820 break;
821 case "0":
822 application.SoapActivated = ComPlus.YesNoType.no;
823 break;
824 default:
825 // TODO: Warning
826 break;
827 }
828 break;
829 case "SoapBaseUrl":
830 application.SoapBaseUrl = (string)row[2];
831 break;
832 case "SoapMailTo":
833 application.SoapMailTo = (string)row[2];
834 break;
835 case "SoapVRoot":
836 application.SoapVRoot = (string)row[2];
837 break;
838 case "SRPEnabled":
839 switch ((string)row[2])
840 {
841 case "1":
842 application.SRPEnabled = ComPlus.YesNoType.yes;
843 break;
844 case "0":
845 application.SRPEnabled = ComPlus.YesNoType.no;
846 break;
847 default:
848 // TODO: Warning
849 break;
850 }
851 break;
852 case "SRPTrustLevel":
853 switch ((string)row[2])
854 {
855 case "0":
856 application.SRPTrustLevel = ComPlus.ComPlusApplication.SRPTrustLevelType.disallowed;
857 break;
858 case "262144":
859 application.SRPTrustLevel = ComPlus.ComPlusApplication.SRPTrustLevelType.fullyTrusted;
860 break;
861 default:
862 // TODO: Warning
863 break;
864 }
865 break;
866 default:
867 // TODO: Warning
868 break;
869 }
870 }
871 }
872
873 /// <summary>
874 /// Decompile the ComPlusApplicationRole table.
875 /// </summary>
876 /// <param name="table">The table to decompile.</param>
877 private void DecompileComPlusApplicationRoleTable(Table table)
878 {
879 foreach (Row row in table.Rows)
880 {
881 ComPlus.ComPlusApplicationRole applicationRole = new ComPlus.ComPlusApplicationRole();
882
883 applicationRole.Id = (string)row[0];
884 applicationRole.Application = (string)row[1];
885
886 if (null != row[3])
887 {
888 applicationRole.Name = (string)row[3];
889 }
890
891 if (null != row[2])
892 {
893 Wix.Component component = (Wix.Component)this.Core.GetIndexedElement("Component", (string)row[2]);
894 if (null != component)
895 {
896 component.AddChild(applicationRole);
897 }
898 else
899 {
900 this.Core.OnMessage(WixWarnings.ExpectedForeignRow(row.SourceLineNumbers, table.Name, row.GetPrimaryKey(DecompilerConstants.PrimaryKeyDelimiter), "Component_", (string)row[2], "Component"));
901 }
902 }
903 else
904 {
905 this.Core.RootElement.AddChild(applicationRole);
906 }
907 this.Core.IndexElement(row, applicationRole);
908 }
909 }
910
911 /// <summary>
912 /// Decompile the ComPlusApplicationRoleProperty table.
913 /// </summary>
914 /// <param name="table">The table to decompile.</param>
915 private void DecompileComPlusApplicationRolePropertyTable(Table table)
916 {
917 foreach (Row row in table.Rows)
918 {
919 ComPlus.ComPlusApplicationRole applicationRole = (ComPlus.ComPlusApplicationRole)this.Core.GetIndexedElement("ComPlusApplicationRole", (string)row[0]);
920 if (null == applicationRole)
921 {
922 this.Core.OnMessage(WixWarnings.ExpectedForeignRow(row.SourceLineNumbers, table.Name, row.GetPrimaryKey(DecompilerConstants.PrimaryKeyDelimiter), "ApplicationRole_", (string)row[0], "ComPlusApplicationRole"));
923 }
924
925 switch ((string)row[1])
926 {
927 case "Description":
928 applicationRole.Description = (string)row[2];
929 break;
930 default:
931 // TODO: Warning
932 break;
933 }
934 }
935 }
936
937 /// <summary>
938 /// Decompile the ComPlusUserInApplicationRole table.
939 /// </summary>
940 /// <param name="table">The table to decompile.</param>
941 private void DecompileComPlusUserInApplicationRoleTable(Table table)
942 {
943 foreach (Row row in table.Rows)
944 {
945 ComPlus.ComPlusUserInApplicationRole userInApplicationRole = new ComPlus.ComPlusUserInApplicationRole();
946
947 userInApplicationRole.Id = (string)row[0];
948 userInApplicationRole.ApplicationRole = (string)row[1];
949 userInApplicationRole.User = (string)row[3];
950
951 Wix.Component component = (Wix.Component)this.Core.GetIndexedElement("Component", (string)row[2]);
952 if (null != component)
953 {
954 component.AddChild(userInApplicationRole);
955 }
956 else
957 {
958 this.Core.OnMessage(WixWarnings.ExpectedForeignRow(row.SourceLineNumbers, table.Name, row.GetPrimaryKey(DecompilerConstants.PrimaryKeyDelimiter), "Component_", (string)row[2], "Component"));
959 }
960 }
961 }
962
963 /// <summary>
964 /// Decompile the ComPlusGroupInApplicationRole table.
965 /// </summary>
966 /// <param name="table">The table to decompile.</param>
967 private void DecompileComPlusGroupInApplicationRoleTable(Table table)
968 {
969 foreach (Row row in table.Rows)
970 {
971 ComPlus.ComPlusGroupInApplicationRole groupInApplicationRole = new ComPlus.ComPlusGroupInApplicationRole();
972
973 groupInApplicationRole.Id = (string)row[0];
974 groupInApplicationRole.ApplicationRole = (string)row[1];
975 groupInApplicationRole.Group = (string)row[3];
976
977 Wix.Component component = (Wix.Component)this.Core.GetIndexedElement("Component", (string)row[2]);
978 if (null != component)
979 {
980 component.AddChild(groupInApplicationRole);
981 }
982 else
983 {
984 this.Core.OnMessage(WixWarnings.ExpectedForeignRow(row.SourceLineNumbers, table.Name, row.GetPrimaryKey(DecompilerConstants.PrimaryKeyDelimiter), "Component_", (string)row[2], "Component"));
985 }
986 }
987 }
988
989 /// <summary>
990 /// Decompile the ComPlusAssembly table.
991 /// </summary>
992 /// <param name="table">The table to decompile.</param>
993 private void DecompileComPlusAssemblyTable(Table table)
994 {
995 foreach (Row row in table.Rows)
996 {
997 ComPlus.ComPlusAssembly assembly = new ComPlus.ComPlusAssembly();
998
999 assembly.Id = (string)row[0];
1000 assembly.Application = (string)row[1];
1001
1002 if (null != row[3])
1003 {
1004 assembly.AssemblyName = (string)row[3];
1005 }
1006
1007 if (null != row[4])
1008 {
1009 assembly.DllPath = (string)row[4];
1010 }
1011
1012 if (null != row[5])
1013 {
1014 assembly.TlbPath = (string)row[5];
1015 }
1016
1017 if (null != row[6])
1018 {
1019 assembly.PSDllPath = (string)row[6];
1020 }
1021
1022 int attributes = (int)row[7];
1023
1024 if (0 != (attributes & (int)ComPlusCompiler.CpiAssemblyAttributes.EventClass))
1025 {
1026 assembly.EventClass = ComPlus.YesNoType.yes;
1027 }
1028
1029 if (0 != (attributes & (int)ComPlusCompiler.CpiAssemblyAttributes.DotNetAssembly))
1030 {
1031 assembly.Type = ComPlus.ComPlusAssembly.TypeType.net;
1032 }
1033
1034 if (0 != (attributes & (int)ComPlusCompiler.CpiAssemblyAttributes.DllPathFromGAC))
1035 {
1036 assembly.DllPathFromGAC = ComPlus.YesNoType.yes;
1037 }
1038
1039 if (0 != (attributes & (int)ComPlusCompiler.CpiAssemblyAttributes.RegisterInCommit))
1040 {
1041 assembly.RegisterInCommit = ComPlus.YesNoType.yes;
1042 }
1043
1044 Wix.Component component = (Wix.Component)this.Core.GetIndexedElement("Component", (string)row[2]);
1045 if (null != component)
1046 {
1047 component.AddChild(assembly);
1048 }
1049 else
1050 {
1051 this.Core.OnMessage(WixWarnings.ExpectedForeignRow(row.SourceLineNumbers, table.Name, row.GetPrimaryKey(DecompilerConstants.PrimaryKeyDelimiter), "Component_", (string)row[2], "Component"));
1052 }
1053 this.Core.IndexElement(row, assembly);
1054 }
1055 }
1056
1057 /// <summary>
1058 /// Decompile the ComPlusAssemblyDependency table.
1059 /// </summary>
1060 /// <param name="table">The table to decompile.</param>
1061 private void DecompileComPlusAssemblyDependencyTable(Table table)
1062 {
1063 foreach (Row row in table.Rows)
1064 {
1065 ComPlus.ComPlusAssemblyDependency assemblyDependency = new ComPlus.ComPlusAssemblyDependency();
1066
1067 assemblyDependency.RequiredAssembly = (string)row[1];
1068
1069 ComPlus.ComPlusAssembly assembly = (ComPlus.ComPlusAssembly)this.Core.GetIndexedElement("ComPlusAssembly", (string)row[0]);
1070 if (null != assembly)
1071 {
1072 assembly.AddChild(assemblyDependency);
1073 }
1074 else
1075 {
1076 this.Core.OnMessage(WixWarnings.ExpectedForeignRow(row.SourceLineNumbers, table.Name, row.GetPrimaryKey(DecompilerConstants.PrimaryKeyDelimiter), "Assembly_", (string)row[0], "ComPlusAssembly"));
1077 }
1078 }
1079 }
1080
1081 /// <summary>
1082 /// Decompile the ComPlusComponent table.
1083 /// </summary>
1084 /// <param name="table">The table to decompile.</param>
1085 private void DecompileComPlusComponentTable(Table table)
1086 {
1087 foreach (Row row in table.Rows)
1088 {
1089 ComPlus.ComPlusComponent comPlusComponent = new ComPlus.ComPlusComponent();
1090
1091 comPlusComponent.Id = (string)row[0];
1092
1093 try
1094 {
1095 Guid clsid = new Guid((string)row[2]);
1096 comPlusComponent.CLSID = clsid.ToString().ToUpper();
1097 }
1098 catch
1099 {
1100 // TODO: Warning
1101 }
1102
1103 ComPlus.ComPlusAssembly assembly = (ComPlus.ComPlusAssembly)this.Core.GetIndexedElement("ComPlusAssembly", (string)row[1]);
1104 if (null != assembly)
1105 {
1106 assembly.AddChild(comPlusComponent);
1107 }
1108 else
1109 {
1110 this.Core.OnMessage(WixWarnings.ExpectedForeignRow(row.SourceLineNumbers, table.Name, row.GetPrimaryKey(DecompilerConstants.PrimaryKeyDelimiter), "Assembly_", (string)row[1], "ComPlusAssembly"));
1111 }
1112 this.Core.IndexElement(row, comPlusComponent);
1113 }
1114 }
1115
1116 /// <summary>
1117 /// Decompile the ComPlusComponentProperty table.
1118 /// </summary>
1119 /// <param name="table">The table to decompile.</param>
1120 private void DecompileComPlusComponentPropertyTable(Table table)
1121 {
1122 foreach (Row row in table.Rows)
1123 {
1124 ComPlus.ComPlusComponent comPlusComponent = (ComPlus.ComPlusComponent)this.Core.GetIndexedElement("ComPlusComponent", (string)row[0]);
1125 if (null == comPlusComponent)
1126 {
1127 this.Core.OnMessage(WixWarnings.ExpectedForeignRow(row.SourceLineNumbers, table.Name, row.GetPrimaryKey(DecompilerConstants.PrimaryKeyDelimiter), "ComPlusComponent_", (string)row[0], "ComPlusComponent"));
1128 }
1129
1130 switch ((string)row[1])
1131 {
1132 case "AllowInprocSubscribers":
1133 switch ((string)row[2])
1134 {
1135 case "1":
1136 comPlusComponent.AllowInprocSubscribers = ComPlus.YesNoType.yes;
1137 break;
1138 case "0":
1139 comPlusComponent.AllowInprocSubscribers = ComPlus.YesNoType.no;
1140 break;
1141 default:
1142 // TODO: Warning
1143 break;
1144 }
1145 break;
1146 case "ComponentAccessChecksEnabled":
1147 switch ((string)row[2])
1148 {
1149 case "1":
1150 comPlusComponent.ComponentAccessChecksEnabled = ComPlus.YesNoType.yes;
1151 break;
1152 case "0":
1153 comPlusComponent.ComponentAccessChecksEnabled = ComPlus.YesNoType.no;
1154 break;
1155 default:
1156 // TODO: Warning
1157 break;
1158 }
1159 break;
1160 case "ComponentTransactionTimeout":
1161 int componentTransactionTimeout;
1162 if (Int32.TryParse((string)row[2], out componentTransactionTimeout))
1163 {
1164 comPlusComponent.ComponentTransactionTimeout = componentTransactionTimeout;
1165 }
1166 else
1167 {
1168 // TODO: Warning
1169 }
1170 break;
1171 case "ComponentTransactionTimeoutEnabled":
1172 switch ((string)row[2])
1173 {
1174 case "1":
1175 comPlusComponent.ComponentTransactionTimeoutEnabled = ComPlus.YesNoType.yes;
1176 break;
1177 case "0":
1178 comPlusComponent.ComponentTransactionTimeoutEnabled = ComPlus.YesNoType.no;
1179 break;
1180 default:
1181 // TODO: Warning
1182 break;
1183 }
1184 break;
1185 case "COMTIIntrinsics":
1186 switch ((string)row[2])
1187 {
1188 case "1":
1189 comPlusComponent.COMTIIntrinsics = ComPlus.YesNoType.yes;
1190 break;
1191 case "0":
1192 comPlusComponent.COMTIIntrinsics = ComPlus.YesNoType.no;
1193 break;
1194 default:
1195 // TODO: Warning
1196 break;
1197 }
1198 break;
1199 case "ConstructionEnabled":
1200 switch ((string)row[2])
1201 {
1202 case "1":
1203 comPlusComponent.ConstructionEnabled = ComPlus.YesNoType.yes;
1204 break;
1205 case "0":
1206 comPlusComponent.ConstructionEnabled = ComPlus.YesNoType.no;
1207 break;
1208 default:
1209 // TODO: Warning
1210 break;
1211 }
1212 break;
1213 case "ConstructorString":
1214 comPlusComponent.ConstructorString = (string)row[2];
1215 break;
1216 case "CreationTimeout":
1217 int creationTimeout;
1218 if (Int32.TryParse((string)row[2], out creationTimeout))
1219 {
1220 comPlusComponent.CreationTimeout = creationTimeout;
1221 }
1222 else
1223 {
1224 // TODO: Warning
1225 }
1226 break;
1227 case "Description":
1228 comPlusComponent.Description = (string)row[2];
1229 break;
1230 case "EventTrackingEnabled":
1231 switch ((string)row[2])
1232 {
1233 case "1":
1234 comPlusComponent.EventTrackingEnabled = ComPlus.YesNoType.yes;
1235 break;
1236 case "0":
1237 comPlusComponent.EventTrackingEnabled = ComPlus.YesNoType.no;
1238 break;
1239 default:
1240 // TODO: Warning
1241 break;
1242 }
1243 break;
1244 case "ExceptionClass":
1245 comPlusComponent.ExceptionClass = (string)row[2];
1246 break;
1247 case "FireInParallel":
1248 switch ((string)row[2])
1249 {
1250 case "1":
1251 comPlusComponent.FireInParallel = ComPlus.YesNoType.yes;
1252 break;
1253 case "0":
1254 comPlusComponent.FireInParallel = ComPlus.YesNoType.no;
1255 break;
1256 default:
1257 // TODO: Warning
1258 break;
1259 }
1260 break;
1261 case "IISIntrinsics":
1262 switch ((string)row[2])
1263 {
1264 case "1":
1265 comPlusComponent.IISIntrinsics = ComPlus.YesNoType.yes;
1266 break;
1267 case "0":
1268 comPlusComponent.IISIntrinsics = ComPlus.YesNoType.no;
1269 break;
1270 default:
1271 // TODO: Warning
1272 break;
1273 }
1274 break;
1275 case "InitializesServerApplication":
1276 switch ((string)row[2])
1277 {
1278 case "1":
1279 comPlusComponent.InitializesServerApplication = ComPlus.YesNoType.yes;
1280 break;
1281 case "0":
1282 comPlusComponent.InitializesServerApplication = ComPlus.YesNoType.no;
1283 break;
1284 default:
1285 // TODO: Warning
1286 break;
1287 }
1288 break;
1289 case "IsEnabled":
1290 switch ((string)row[2])
1291 {
1292 case "1":
1293 comPlusComponent.IsEnabled = ComPlus.YesNoType.yes;
1294 break;
1295 case "0":
1296 comPlusComponent.IsEnabled = ComPlus.YesNoType.no;
1297 break;
1298 default:
1299 // TODO: Warning
1300 break;
1301 }
1302 break;
1303 case "IsPrivateComponent":
1304 switch ((string)row[2])
1305 {
1306 case "1":
1307 comPlusComponent.IsPrivateComponent = ComPlus.YesNoType.yes;
1308 break;
1309 case "0":
1310 comPlusComponent.IsPrivateComponent = ComPlus.YesNoType.no;
1311 break;
1312 default:
1313 // TODO: Warning
1314 break;
1315 }
1316 break;
1317 case "JustInTimeActivation":
1318 switch ((string)row[2])
1319 {
1320 case "1":
1321 comPlusComponent.JustInTimeActivation = ComPlus.YesNoType.yes;
1322 break;
1323 case "0":
1324 comPlusComponent.JustInTimeActivation = ComPlus.YesNoType.no;
1325 break;
1326 default:
1327 // TODO: Warning
1328 break;
1329 }
1330 break;
1331 case "LoadBalancingSupported":
1332 switch ((string)row[2])
1333 {
1334 case "1":
1335 comPlusComponent.LoadBalancingSupported = ComPlus.YesNoType.yes;
1336 break;
1337 case "0":
1338 comPlusComponent.LoadBalancingSupported = ComPlus.YesNoType.no;
1339 break;
1340 default:
1341 // TODO: Warning
1342 break;
1343 }
1344 break;
1345 case "MaxPoolSize":
1346 int maxPoolSize;
1347 if (Int32.TryParse((string)row[2], out maxPoolSize))
1348 {
1349 comPlusComponent.MaxPoolSize = maxPoolSize;
1350 }
1351 else
1352 {
1353 // TODO: Warning
1354 }
1355 break;
1356 case "MinPoolSize":
1357 int minPoolSize;
1358 if (Int32.TryParse((string)row[2], out minPoolSize))
1359 {
1360 comPlusComponent.MinPoolSize = minPoolSize;
1361 }
1362 else
1363 {
1364 // TODO: Warning
1365 }
1366 break;
1367 case "MultiInterfacePublisherFilterCLSID":
1368 comPlusComponent.MultiInterfacePublisherFilterCLSID = (string)row[2];
1369 break;
1370 case "MustRunInClientContext":
1371 switch ((string)row[2])
1372 {
1373 case "1":
1374 comPlusComponent.MustRunInClientContext = ComPlus.YesNoType.yes;
1375 break;
1376 case "0":
1377 comPlusComponent.MustRunInClientContext = ComPlus.YesNoType.no;
1378 break;
1379 default:
1380 // TODO: Warning
1381 break;
1382 }
1383 break;
1384 case "MustRunInDefaultContext":
1385 switch ((string)row[2])
1386 {
1387 case "1":
1388 comPlusComponent.MustRunInDefaultContext = ComPlus.YesNoType.yes;
1389 break;
1390 case "0":
1391 comPlusComponent.MustRunInDefaultContext = ComPlus.YesNoType.no;
1392 break;
1393 default:
1394 // TODO: Warning
1395 break;
1396 }
1397 break;
1398 case "ObjectPoolingEnabled":
1399 switch ((string)row[2])
1400 {
1401 case "1":
1402 comPlusComponent.ObjectPoolingEnabled = ComPlus.YesNoType.yes;
1403 break;
1404 case "0":
1405 comPlusComponent.ObjectPoolingEnabled = ComPlus.YesNoType.no;
1406 break;
1407 default:
1408 // TODO: Warning
1409 break;
1410 }
1411 break;
1412 case "PublisherID":
1413 comPlusComponent.PublisherID = (string)row[2];
1414 break;
1415 case "SoapAssemblyName":
1416 comPlusComponent.SoapAssemblyName = (string)row[2];
1417 break;
1418 case "SoapTypeName":
1419 comPlusComponent.SoapTypeName = (string)row[2];
1420 break;
1421 case "Synchronization":
1422 switch ((string)row[2])
1423 {
1424 case "0":
1425 comPlusComponent.Synchronization = ComPlus.ComPlusComponent.SynchronizationType.ignored;
1426 break;
1427 case "1":
1428 comPlusComponent.Synchronization = ComPlus.ComPlusComponent.SynchronizationType.none;
1429 break;
1430 case "2":
1431 comPlusComponent.Synchronization = ComPlus.ComPlusComponent.SynchronizationType.supported;
1432 break;
1433 case "3":
1434 comPlusComponent.Synchronization = ComPlus.ComPlusComponent.SynchronizationType.required;
1435 break;
1436 case "4":
1437 comPlusComponent.Synchronization = ComPlus.ComPlusComponent.SynchronizationType.requiresNew;
1438 break;
1439 default:
1440 // TODO: Warning
1441 break;
1442 }
1443 break;
1444 case "Transaction":
1445 switch ((string)row[2])
1446 {
1447 case "0":
1448 comPlusComponent.Transaction = ComPlus.ComPlusComponent.TransactionType.ignored;
1449 break;
1450 case "1":
1451 comPlusComponent.Transaction = ComPlus.ComPlusComponent.TransactionType.none;
1452 break;
1453 case "2":
1454 comPlusComponent.Transaction = ComPlus.ComPlusComponent.TransactionType.supported;
1455 break;
1456 case "3":
1457 comPlusComponent.Transaction = ComPlus.ComPlusComponent.TransactionType.required;
1458 break;
1459 case "4":
1460 comPlusComponent.Transaction = ComPlus.ComPlusComponent.TransactionType.requiresNew;
1461 break;
1462 default:
1463 // TODO: Warning
1464 break;
1465 }
1466 break;
1467 case "TxIsolationLevel":
1468 switch ((string)row[2])
1469 {
1470 case "0":
1471 comPlusComponent.TxIsolationLevel = ComPlus.ComPlusComponent.TxIsolationLevelType.any;
1472 break;
1473 case "1":
1474 comPlusComponent.TxIsolationLevel = ComPlus.ComPlusComponent.TxIsolationLevelType.readUnCommitted;
1475 break;
1476 case "2":
1477 comPlusComponent.TxIsolationLevel = ComPlus.ComPlusComponent.TxIsolationLevelType.readCommitted;
1478 break;
1479 case "3":
1480 comPlusComponent.TxIsolationLevel = ComPlus.ComPlusComponent.TxIsolationLevelType.repeatableRead;
1481 break;
1482 case "4":
1483 comPlusComponent.TxIsolationLevel = ComPlus.ComPlusComponent.TxIsolationLevelType.serializable;
1484 break;
1485 default:
1486 // TODO: Warning
1487 break;
1488 }
1489 break;
1490 default:
1491 // TODO: Warning
1492 break;
1493 }
1494 }
1495 }
1496
1497 /// <summary>
1498 /// Decompile the ComPlusRoleForComponent table.
1499 /// </summary>
1500 /// <param name="table">The table to decompile.</param>
1501 private void DecompileComPlusRoleForComponentTable(Table table)
1502 {
1503 foreach (Row row in table.Rows)
1504 {
1505 ComPlus.ComPlusRoleForComponent roleForComponent = new ComPlus.ComPlusRoleForComponent();
1506
1507 roleForComponent.Id = (string)row[0];
1508 roleForComponent.Component = (string)row[1];
1509 roleForComponent.ApplicationRole = (string)row[2];
1510
1511 Wix.Component component = (Wix.Component)this.Core.GetIndexedElement("Component", (string)row[3]);
1512 if (null != component)
1513 {
1514 component.AddChild(roleForComponent);
1515 }
1516 else
1517 {
1518 this.Core.OnMessage(WixWarnings.ExpectedForeignRow(row.SourceLineNumbers, table.Name, row.GetPrimaryKey(DecompilerConstants.PrimaryKeyDelimiter), "Component_", (string)row[3], "Component"));
1519 }
1520 }
1521 }
1522
1523 /// <summary>
1524 /// Decompile the ComPlusInterface table.
1525 /// </summary>
1526 /// <param name="table">The table to decompile.</param>
1527 private void DecompileComPlusInterfaceTable(Table table)
1528 {
1529 foreach (Row row in table.Rows)
1530 {
1531 ComPlus.ComPlusInterface comPlusInterface = new ComPlus.ComPlusInterface();
1532
1533 comPlusInterface.Id = (string)row[0];
1534
1535 try
1536 {
1537 Guid iid = new Guid((string)row[2]);
1538 comPlusInterface.IID = iid.ToString().ToUpper();
1539 }
1540 catch
1541 {
1542 // TODO: Warning
1543 }
1544
1545 ComPlus.ComPlusComponent comPlusComponent = (ComPlus.ComPlusComponent)this.Core.GetIndexedElement("ComPlusComponent", (string)row[1]);
1546 if (null != comPlusComponent)
1547 {
1548 comPlusComponent.AddChild(comPlusInterface);
1549 }
1550 else
1551 {
1552 this.Core.OnMessage(WixWarnings.ExpectedForeignRow(row.SourceLineNumbers, table.Name, row.GetPrimaryKey(DecompilerConstants.PrimaryKeyDelimiter), "ComPlusComponent_", (string)row[1], "ComPlusComponent"));
1553 }
1554 this.Core.IndexElement(row, comPlusInterface);
1555 }
1556 }
1557
1558 /// <summary>
1559 /// Decompile the ComPlusInterfaceProperty table.
1560 /// </summary>
1561 /// <param name="table">The table to decompile.</param>
1562 private void DecompileComPlusInterfacePropertyTable(Table table)
1563 {
1564 foreach (Row row in table.Rows)
1565 {
1566 ComPlus.ComPlusInterface comPlusInterface = (ComPlus.ComPlusInterface)this.Core.GetIndexedElement("ComPlusInterface", (string)row[0]);
1567 if (null == comPlusInterface)
1568 {
1569 this.Core.OnMessage(WixWarnings.ExpectedForeignRow(row.SourceLineNumbers, table.Name, row.GetPrimaryKey(DecompilerConstants.PrimaryKeyDelimiter), "Interface_", (string)row[0], "ComPlusInterface"));
1570 }
1571
1572 switch ((string)row[1])
1573 {
1574 case "Description":
1575 comPlusInterface.Description = (string)row[2];
1576 break;
1577 case "QueuingEnabled":
1578 switch ((string)row[2])
1579 {
1580 case "1":
1581 comPlusInterface.QueuingEnabled = ComPlus.YesNoType.yes;
1582 break;
1583 case "0":
1584 comPlusInterface.QueuingEnabled = ComPlus.YesNoType.no;
1585 break;
1586 default:
1587 // TODO: Warning
1588 break;
1589 }
1590 break;
1591 default:
1592 // TODO: Warning
1593 break;
1594 }
1595 }
1596 }
1597
1598 /// <summary>
1599 /// Decompile the ComPlusRoleForInterface table.
1600 /// </summary>
1601 /// <param name="table">The table to decompile.</param>
1602 private void DecompileComPlusRoleForInterfaceTable(Table table)
1603 {
1604 foreach (Row row in table.Rows)
1605 {
1606 ComPlus.ComPlusRoleForInterface roleForInterface = new ComPlus.ComPlusRoleForInterface();
1607
1608 roleForInterface.Id = (string)row[0];
1609 roleForInterface.Interface = (string)row[1];
1610 roleForInterface.ApplicationRole = (string)row[2];
1611
1612 Wix.Component component = (Wix.Component)this.Core.GetIndexedElement("Component", (string)row[3]);
1613 if (null != component)
1614 {
1615 component.AddChild(roleForInterface);
1616 }
1617 else
1618 {
1619 this.Core.OnMessage(WixWarnings.ExpectedForeignRow(row.SourceLineNumbers, table.Name, row.GetPrimaryKey(DecompilerConstants.PrimaryKeyDelimiter), "Component_", (string)row[3], "Component"));
1620 }
1621 }
1622 }
1623
1624 /// <summary>
1625 /// Decompile the ComPlusMethod table.
1626 /// </summary>
1627 /// <param name="table">The table to decompile.</param>
1628 private void DecompileComPlusMethodTable(Table table)
1629 {
1630 foreach (Row row in table.Rows)
1631 {
1632 ComPlus.ComPlusMethod comPlusMethod = new ComPlus.ComPlusMethod();
1633
1634 comPlusMethod.Id = (string)row[0];
1635
1636 if (null != row[2])
1637 {
1638 comPlusMethod.Index = (int)row[2];
1639 }
1640
1641 if (null != row[3])
1642 {
1643 comPlusMethod.Name = (string)row[3];
1644 }
1645
1646 ComPlus.ComPlusInterface comPlusInterface = (ComPlus.ComPlusInterface)this.Core.GetIndexedElement("ComPlusInterface", (string)row[1]);
1647 if (null != comPlusInterface)
1648 {
1649 comPlusInterface.AddChild(comPlusMethod);
1650 }
1651 else
1652 {
1653 this.Core.OnMessage(WixWarnings.ExpectedForeignRow(row.SourceLineNumbers, table.Name, row.GetPrimaryKey(DecompilerConstants.PrimaryKeyDelimiter), "Interface_", (string)row[1], "ComPlusInterface"));
1654 }
1655 this.Core.IndexElement(row, comPlusMethod);
1656 }
1657 }
1658
1659 /// <summary>
1660 /// Decompile the ComPlusMethodProperty table.
1661 /// </summary>
1662 /// <param name="table">The table to decompile.</param>
1663 private void DecompileComPlusMethodPropertyTable(Table table)
1664 {
1665 foreach (Row row in table.Rows)
1666 {
1667 ComPlus.ComPlusMethod comPlusMethod = (ComPlus.ComPlusMethod)this.Core.GetIndexedElement("ComPlusMethod", (string)row[0]);
1668 if (null == comPlusMethod)
1669 {
1670 this.Core.OnMessage(WixWarnings.ExpectedForeignRow(row.SourceLineNumbers, table.Name, row.GetPrimaryKey(DecompilerConstants.PrimaryKeyDelimiter), "Method_", (string)row[0], "ComPlusMethod"));
1671 }
1672
1673 switch ((string)row[1])
1674 {
1675 case "AutoComplete":
1676 switch ((string)row[2])
1677 {
1678 case "1":
1679 comPlusMethod.AutoComplete = ComPlus.YesNoType.yes;
1680 break;
1681 case "0":
1682 comPlusMethod.AutoComplete = ComPlus.YesNoType.no;
1683 break;
1684 default:
1685 // TODO: Warning
1686 break;
1687 }
1688 break;
1689 case "Description":
1690 comPlusMethod.Description = (string)row[2];
1691 break;
1692 default:
1693 // TODO: Warning
1694 break;
1695 }
1696 }
1697 }
1698
1699 /// <summary>
1700 /// Decompile the ComPlusRoleForMethod table.
1701 /// </summary>
1702 /// <param name="table">The table to decompile.</param>
1703 private void DecompileComPlusRoleForMethodTable(Table table)
1704 {
1705 foreach (Row row in table.Rows)
1706 {
1707 ComPlus.ComPlusRoleForMethod roleForMethod = new ComPlus.ComPlusRoleForMethod();
1708
1709 roleForMethod.Id = (string)row[0];
1710 roleForMethod.Method = (string)row[1];
1711 roleForMethod.ApplicationRole = (string)row[2];
1712
1713 Wix.Component component = (Wix.Component)this.Core.GetIndexedElement("Component", (string)row[3]);
1714 if (null != component)
1715 {
1716 component.AddChild(roleForMethod);
1717 }
1718 else
1719 {
1720 this.Core.OnMessage(WixWarnings.ExpectedForeignRow(row.SourceLineNumbers, table.Name, row.GetPrimaryKey(DecompilerConstants.PrimaryKeyDelimiter), "Component_", (string)row[3], "Component"));
1721 }
1722 }
1723 }
1724
1725 /// <summary>
1726 /// Decompile the ComPlusSubscription table.
1727 /// </summary>
1728 /// <param name="table">The table to decompile.</param>
1729 private void DecompileComPlusSubscriptionTable(Table table)
1730 {
1731 foreach (Row row in table.Rows)
1732 {
1733 ComPlus.ComPlusSubscription subscription = new ComPlus.ComPlusSubscription();
1734
1735 subscription.Id = (string)row[0];
1736 subscription.Component = (string)row[1];
1737 subscription.SubscriptionId = (string)row[3];
1738 subscription.Name = (string)row[4];
1739 subscription.EventCLSID = (string)row[5];
1740 subscription.PublisherID = (string)row[6];
1741
1742 Wix.Component component = (Wix.Component)this.Core.GetIndexedElement("Component", (string)row[2]);
1743 if (null != component)
1744 {
1745 component.AddChild(subscription);
1746 }
1747 else
1748 {
1749 this.Core.OnMessage(WixWarnings.ExpectedForeignRow(row.SourceLineNumbers, table.Name, row.GetPrimaryKey(DecompilerConstants.PrimaryKeyDelimiter), "Component_", (string)row[2], "Component"));
1750 }
1751 this.Core.IndexElement(row, subscription);
1752 }
1753 }
1754
1755 /// <summary>
1756 /// Decompile the ComPlusSubscriptionProperty table.
1757 /// </summary>
1758 /// <param name="table">The table to decompile.</param>
1759 private void DecompileComPlusSubscriptionPropertyTable(Table table)
1760 {
1761 foreach (Row row in table.Rows)
1762 {
1763 ComPlus.ComPlusSubscription subscription = (ComPlus.ComPlusSubscription)this.Core.GetIndexedElement("ComPlusSubscription", (string)row[0]);
1764 if (null == subscription)
1765 {
1766 this.Core.OnMessage(WixWarnings.ExpectedForeignRow(row.SourceLineNumbers, table.Name, row.GetPrimaryKey(DecompilerConstants.PrimaryKeyDelimiter), "Subscription_", (string)row[0], "ComPlusSubscription"));
1767 }
1768
1769 switch ((string)row[1])
1770 {
1771 case "Description":
1772 subscription.Description = (string)row[2];
1773 break;
1774 case "Enabled":
1775 switch ((string)row[2])
1776 {
1777 case "1":
1778 subscription.Enabled = ComPlus.YesNoType.yes;
1779 break;
1780 case "0":
1781 subscription.Enabled = ComPlus.YesNoType.no;
1782 break;
1783 default:
1784 // TODO: Warning
1785 break;
1786 }
1787 break;
1788 case "EventClassPartitionID":
1789 subscription.EventClassPartitionID = (string)row[2];
1790 break;
1791 case "FilterCriteria":
1792 subscription.FilterCriteria = (string)row[2];
1793 break;
1794 case "InterfaceID":
1795 subscription.InterfaceID = (string)row[2];
1796 break;
1797 case "MachineName":
1798 subscription.MachineName = (string)row[2];
1799 break;
1800 case "MethodName":
1801 subscription.MethodName = (string)row[2];
1802 break;
1803 case "PerUser":
1804 switch ((string)row[2])
1805 {
1806 case "1":
1807 subscription.PerUser = ComPlus.YesNoType.yes;
1808 break;
1809 case "0":
1810 subscription.PerUser = ComPlus.YesNoType.no;
1811 break;
1812 default:
1813 // TODO: Warning
1814 break;
1815 }
1816 break;
1817 case "Queued":
1818 switch ((string)row[2])
1819 {
1820 case "1":
1821 subscription.Queued = ComPlus.YesNoType.yes;
1822 break;
1823 case "0":
1824 subscription.Queued = ComPlus.YesNoType.no;
1825 break;
1826 default:
1827 // TODO: Warning
1828 break;
1829 }
1830 break;
1831 case "SubscriberMoniker":
1832 subscription.SubscriberMoniker = (string)row[2];
1833 break;
1834 case "UserName":
1835 subscription.UserName = (string)row[2];
1836 break;
1837 default:
1838 // TODO: Warning
1839 break;
1840 }
1841 }
1842 }
1843 }
1844#endif
1845}
diff --git a/src/ext/ComPlus/wixext/ComPlusErrors.cs b/src/ext/ComPlus/wixext/ComPlusErrors.cs
new file mode 100644
index 00000000..91b41679
--- /dev/null
+++ b/src/ext/ComPlus/wixext/ComPlusErrors.cs
@@ -0,0 +1,72 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.ComPlus
4{
5 using System;
6 using System.Resources;
7 using WixToolset.Data;
8
9 public static class ComPlusErrors
10 {
11 public static Message IllegalAttributeWithoutComponent(SourceLineNumber sourceLineNumbers, string elementName, string attributeName)
12 {
13 return Message(sourceLineNumbers, Ids.IllegalAttributeWithoutComponent, "The {0}/@{1} attribute cannot be specified unless the element has a component as an ancestor. A {0} that does not have a component ancestor is not installed.", elementName, attributeName);
14 }
15
16 public static Message IllegalElementWithoutComponent(SourceLineNumber sourceLineNumbers, string elementName)
17 {
18 return Message(sourceLineNumbers, Ids.IllegalElementWithoutComponent, "The {0} element cannot be specified unless the element has a component as an ancestor. A {0} that does not have a component ancestor is not installed.", elementName);
19 }
20
21 public static Message RequiredAttribute(SourceLineNumber sourceLineNumbers, string elementName, string attributeName1, string attributeName2)
22 {
23 return Message(sourceLineNumbers, Ids.RequiredAttribute, "A {0} element must have either a {1} attribute or a {2} attribute, or both set.", elementName, attributeName1, attributeName2);
24 }
25
26 public static Message RequiredAttributeNotUnderComponent(SourceLineNumber sourceLineNumbers, string elementName, string attributeName1, string attributeName2)
27 {
28 return Message(sourceLineNumbers, Ids.RequiredAttributeNotUnderComponent, "A {0} element not nested under a component must have either a {1} attribute or a {2} attribute, or both set.", elementName, attributeName1, attributeName2);
29 }
30
31 public static Message RequiredAttributeUnderComponent(SourceLineNumber sourceLineNumbers, string elementName, string attributeName)
32 {
33 return Message(sourceLineNumbers, Ids.RequiredAttributeUnderComponent, "The {0}/@{1} attribute must be provided when {0} element is nested under a component.", elementName, attributeName);
34 }
35
36 public static Message UnexpectedAttributeWithOtherValue(SourceLineNumber sourceLineNumbers, string elementName, string attributeName, string otherAttributeName, string otherValue)
37 {
38 return Message(sourceLineNumbers, Ids.UnexpectedAttributeWithOtherValue, "The {0}/@{1} attribute cannot coexist with the {2} attribute's value of '{3}'.", elementName, attributeName, otherAttributeName, otherValue);
39 }
40
41 public static Message UnexpectedAttributeWithOtherValue(SourceLineNumber sourceLineNumbers, string elementName, string attributeName, string value, string otherAttributeName, string otherValue)
42 {
43 return Message(sourceLineNumbers, Ids.UnexpectedAttributeWithOtherValue, "The {0}/@{1} attribute's value, '{2}', cannot coexist with the {3} attribute's value of '{4}'.", elementName, attributeName, value, otherAttributeName, otherValue);
44 }
45
46 public static Message UnexpectedAttributeWithoutOtherValue(SourceLineNumber sourceLineNumbers, string elementName, string attributeName, string otherAttributeName, string otherValue)
47 {
48 return Message(sourceLineNumbers, Ids.UnexpectedAttributeWithoutOtherValue, "The {0}/@{1} cannot be provided unless the {2} attribute is provided with a value of '{3}'.", elementName, attributeName, otherAttributeName, otherValue);
49 }
50
51 private static Message Message(SourceLineNumber sourceLineNumber, Ids id, string format, params object[] args)
52 {
53 return new Message(sourceLineNumber, MessageLevel.Error, (int)id, format, args);
54 }
55
56 private static Message Message(SourceLineNumber sourceLineNumber, Ids id, ResourceManager resourceManager, string resourceName, params object[] args)
57 {
58 return new Message(sourceLineNumber, MessageLevel.Error, (int)id, resourceManager, resourceName, args);
59 }
60
61 public enum Ids
62 {
63 IllegalAttributeWithoutComponent = 6000,
64 IllegalElementWithoutComponent = 6001,
65 UnexpectedAttributeWithOtherValue = 6002,
66 UnexpectedAttributeWithoutOtherValue = 6003,
67 RequiredAttributeUnderComponent = 6004,
68 RequiredAttribute = 6005,
69 RequiredAttributeNotUnderComponent = 6006,
70 }
71 }
72}
diff --git a/src/ext/ComPlus/wixext/ComPlusExtensionData.cs b/src/ext/ComPlus/wixext/ComPlusExtensionData.cs
new file mode 100644
index 00000000..9cd5341e
--- /dev/null
+++ b/src/ext/ComPlus/wixext/ComPlusExtensionData.cs
@@ -0,0 +1,30 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.ComPlus
4{
5 using WixToolset.Data;
6 using WixToolset.Extensibility;
7
8 /// <summary>
9 /// The WiX Toolset COM+ Extension.
10 /// </summary>
11 public sealed class ComPlusExtensionData : BaseExtensionData
12 {
13 /// <summary>
14 /// Gets the default culture.
15 /// </summary>
16 /// <value>The default culture.</value>
17 public override string DefaultCulture => "en-US";
18
19 public override bool TryGetSymbolDefinitionByName(string name, out IntermediateSymbolDefinition symbolDefinition)
20 {
21 symbolDefinition = ComPlusSymbolDefinitions.ByName(name);
22 return symbolDefinition != null;
23 }
24
25 public override Intermediate GetLibrary(ISymbolDefinitionCreator symbolDefinitions)
26 {
27 return Intermediate.Load(typeof(ComPlusExtensionData).Assembly, "WixToolset.ComPlus.complus.wixlib", symbolDefinitions);
28 }
29 }
30}
diff --git a/src/ext/ComPlus/wixext/ComPlusExtensionFactory.cs b/src/ext/ComPlus/wixext/ComPlusExtensionFactory.cs
new file mode 100644
index 00000000..76b51bff
--- /dev/null
+++ b/src/ext/ComPlus/wixext/ComPlusExtensionFactory.cs
@@ -0,0 +1,18 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.ComPlus
4{
5 using System;
6 using System.Collections.Generic;
7 using WixToolset.Extensibility;
8
9 public class ComPlusExtensionFactory : BaseExtensionFactory
10 {
11 protected override IReadOnlyCollection<Type> ExtensionTypes => new[]
12 {
13 typeof(ComPlusCompiler),
14 typeof(ComPlusExtensionData),
15 typeof(ComPlusWindowsInstallerBackendBinderExtension),
16 };
17 }
18}
diff --git a/src/ext/ComPlus/wixext/ComPlusTableDefinitions.cs b/src/ext/ComPlus/wixext/ComPlusTableDefinitions.cs
new file mode 100644
index 00000000..565e1d44
--- /dev/null
+++ b/src/ext/ComPlus/wixext/ComPlusTableDefinitions.cs
@@ -0,0 +1,360 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.ComPlus
4{
5 using WixToolset.Data.WindowsInstaller;
6
7 public static class ComPlusTableDefinitions
8 {
9 public static readonly TableDefinition ComPlusPartition = new TableDefinition(
10 "ComPlusPartition",
11 ComPlusSymbolDefinitions.ComPlusPartition,
12 new[]
13 {
14 new ColumnDefinition("Partition", ColumnType.String, 72, primaryKey: true, nullable: false, ColumnCategory.Identifier, modularizeType: ColumnModularizeType.Column),
15 new ColumnDefinition("Component_", ColumnType.String, 72, primaryKey: false, nullable: true, ColumnCategory.Identifier, keyTable: "Component", keyColumn: 1, modularizeType: ColumnModularizeType.Column),
16 new ColumnDefinition("Id", ColumnType.String, 72, primaryKey: false, nullable: true, ColumnCategory.Formatted, modularizeType: ColumnModularizeType.Property),
17 new ColumnDefinition("Name", ColumnType.String, 255, primaryKey: false, nullable: true, ColumnCategory.Formatted, modularizeType: ColumnModularizeType.Property),
18 },
19 symbolIdIsPrimaryKey: true
20 );
21
22 public static readonly TableDefinition ComPlusPartitionProperty = new TableDefinition(
23 "ComPlusPartitionProperty",
24 ComPlusSymbolDefinitions.ComPlusPartitionProperty,
25 new[]
26 {
27 new ColumnDefinition("Partition_", ColumnType.String, 72, primaryKey: true, nullable: false, ColumnCategory.Identifier, keyTable: "ComPlusPartition", keyColumn: 1, modularizeType: ColumnModularizeType.Column),
28 new ColumnDefinition("Name", ColumnType.String, 72, primaryKey: true, nullable: false, ColumnCategory.Formatted, modularizeType: ColumnModularizeType.Property),
29 new ColumnDefinition("Value", ColumnType.String, 255, primaryKey: false, nullable: false, ColumnCategory.Formatted, modularizeType: ColumnModularizeType.Property),
30 },
31 symbolIdIsPrimaryKey: false
32 );
33
34 public static readonly TableDefinition ComPlusPartitionRole = new TableDefinition(
35 "ComPlusPartitionRole",
36 ComPlusSymbolDefinitions.ComPlusPartitionRole,
37 new[]
38 {
39 new ColumnDefinition("PartitionRole", ColumnType.String, 72, primaryKey: true, nullable: false, ColumnCategory.Identifier, modularizeType: ColumnModularizeType.Column),
40 new ColumnDefinition("Partition_", ColumnType.String, 72, primaryKey: false, nullable: false, ColumnCategory.Identifier, keyTable: "ComPlusPartition", keyColumn: 1, modularizeType: ColumnModularizeType.Column),
41 new ColumnDefinition("Component_", ColumnType.String, 72, primaryKey: false, nullable: true, ColumnCategory.Identifier, keyTable: "Component", keyColumn: 1, modularizeType: ColumnModularizeType.Column),
42 new ColumnDefinition("Name", ColumnType.String, 255, primaryKey: false, nullable: false, ColumnCategory.Formatted, modularizeType: ColumnModularizeType.Property),
43 },
44 symbolIdIsPrimaryKey: true
45 );
46
47 public static readonly TableDefinition ComPlusUserInPartitionRole = new TableDefinition(
48 "ComPlusUserInPartitionRole",
49 ComPlusSymbolDefinitions.ComPlusUserInPartitionRole,
50 new[]
51 {
52 new ColumnDefinition("UserInPartitionRole", ColumnType.String, 72, primaryKey: true, nullable: false, ColumnCategory.Identifier, modularizeType: ColumnModularizeType.Column),
53 new ColumnDefinition("PartitionRole_", ColumnType.String, 72, primaryKey: false, nullable: false, ColumnCategory.Identifier, keyTable: "ComPlusPartitionRole", keyColumn: 1, modularizeType: ColumnModularizeType.Column),
54 new ColumnDefinition("Component_", ColumnType.String, 72, primaryKey: false, nullable: false, ColumnCategory.Identifier, keyTable: "Component", keyColumn: 1, modularizeType: ColumnModularizeType.Column),
55 new ColumnDefinition("User_", ColumnType.String, 72, primaryKey: false, nullable: false, ColumnCategory.Identifier, modularizeType: ColumnModularizeType.Column),
56 },
57 symbolIdIsPrimaryKey: true
58 );
59
60 public static readonly TableDefinition ComPlusGroupInPartitionRole = new TableDefinition(
61 "ComPlusGroupInPartitionRole",
62 ComPlusSymbolDefinitions.ComPlusGroupInPartitionRole,
63 new[]
64 {
65 new ColumnDefinition("GroupInPartitionRole", ColumnType.String, 72, primaryKey: true, nullable: false, ColumnCategory.Identifier, modularizeType: ColumnModularizeType.Column),
66 new ColumnDefinition("PartitionRole_", ColumnType.String, 72, primaryKey: false, nullable: false, ColumnCategory.Identifier, keyTable: "ComPlusPartitionRole", keyColumn: 1, modularizeType: ColumnModularizeType.Column),
67 new ColumnDefinition("Component_", ColumnType.String, 72, primaryKey: false, nullable: false, ColumnCategory.Identifier, keyTable: "Component", keyColumn: 1, modularizeType: ColumnModularizeType.Column),
68 new ColumnDefinition("Group_", ColumnType.String, 72, primaryKey: false, nullable: false, ColumnCategory.Identifier, modularizeType: ColumnModularizeType.Column),
69 },
70 symbolIdIsPrimaryKey: true
71 );
72
73 public static readonly TableDefinition ComPlusPartitionUser = new TableDefinition(
74 "ComPlusPartitionUser",
75 ComPlusSymbolDefinitions.ComPlusPartitionUser,
76 new[]
77 {
78 new ColumnDefinition("PartitionUser", ColumnType.String, 72, primaryKey: true, nullable: false, ColumnCategory.Identifier, modularizeType: ColumnModularizeType.Column),
79 new ColumnDefinition("Partition_", ColumnType.String, 72, primaryKey: false, nullable: false, ColumnCategory.Identifier, keyTable: "ComPlusPartition", keyColumn: 1, modularizeType: ColumnModularizeType.Column),
80 new ColumnDefinition("Component_", ColumnType.String, 72, primaryKey: false, nullable: false, ColumnCategory.Identifier, keyTable: "Component", keyColumn: 1, modularizeType: ColumnModularizeType.Column),
81 new ColumnDefinition("User_", ColumnType.String, 72, primaryKey: false, nullable: false, ColumnCategory.Identifier, modularizeType: ColumnModularizeType.Column),
82 },
83 symbolIdIsPrimaryKey: true
84 );
85
86 public static readonly TableDefinition ComPlusApplication = new TableDefinition(
87 "ComPlusApplication",
88 ComPlusSymbolDefinitions.ComPlusApplication,
89 new[]
90 {
91 new ColumnDefinition("Application", ColumnType.String, 72, primaryKey: true, nullable: false, ColumnCategory.Identifier, modularizeType: ColumnModularizeType.Column),
92 new ColumnDefinition("Partition_", ColumnType.String, 72, primaryKey: false, nullable: true, ColumnCategory.Identifier, keyTable: "ComPlusPartition", keyColumn: 1, modularizeType: ColumnModularizeType.Column),
93 new ColumnDefinition("Component_", ColumnType.String, 72, primaryKey: false, nullable: true, ColumnCategory.Identifier, keyTable: "Component", keyColumn: 1, modularizeType: ColumnModularizeType.Column),
94 new ColumnDefinition("Id", ColumnType.String, 72, primaryKey: false, nullable: true, ColumnCategory.Formatted, modularizeType: ColumnModularizeType.Property),
95 new ColumnDefinition("Name", ColumnType.String, 255, primaryKey: false, nullable: true, ColumnCategory.Formatted, modularizeType: ColumnModularizeType.Property),
96 },
97 symbolIdIsPrimaryKey: true
98 );
99
100 public static readonly TableDefinition ComPlusApplicationProperty = new TableDefinition(
101 "ComPlusApplicationProperty",
102 ComPlusSymbolDefinitions.ComPlusApplicationProperty,
103 new[]
104 {
105 new ColumnDefinition("Application_", ColumnType.String, 72, primaryKey: true, nullable: false, ColumnCategory.Identifier, keyTable: "ComPlusApplication", keyColumn: 1, modularizeType: ColumnModularizeType.Column),
106 new ColumnDefinition("Name", ColumnType.String, 72, primaryKey: true, nullable: false, ColumnCategory.Formatted, modularizeType: ColumnModularizeType.Property),
107 new ColumnDefinition("Value", ColumnType.String, 255, primaryKey: false, nullable: false, ColumnCategory.Formatted, modularizeType: ColumnModularizeType.Property),
108 },
109 symbolIdIsPrimaryKey: false
110 );
111
112 public static readonly TableDefinition ComPlusApplicationRole = new TableDefinition(
113 "ComPlusApplicationRole",
114 ComPlusSymbolDefinitions.ComPlusApplicationRole,
115 new[]
116 {
117 new ColumnDefinition("ApplicationRole", ColumnType.String, 72, primaryKey: true, nullable: false, ColumnCategory.Identifier, modularizeType: ColumnModularizeType.Column),
118 new ColumnDefinition("Application_", ColumnType.String, 72, primaryKey: false, nullable: false, ColumnCategory.Identifier, keyTable: "ComPlusApplication", keyColumn: 1, modularizeType: ColumnModularizeType.Column),
119 new ColumnDefinition("Component_", ColumnType.String, 72, primaryKey: false, nullable: true, ColumnCategory.Identifier, keyTable: "Component", keyColumn: 1, modularizeType: ColumnModularizeType.Column),
120 new ColumnDefinition("Name", ColumnType.String, 255, primaryKey: false, nullable: false, ColumnCategory.Formatted, modularizeType: ColumnModularizeType.Property),
121 },
122 symbolIdIsPrimaryKey: true
123 );
124
125 public static readonly TableDefinition ComPlusApplicationRoleProperty = new TableDefinition(
126 "ComPlusApplicationRoleProperty",
127 ComPlusSymbolDefinitions.ComPlusApplicationRoleProperty,
128 new[]
129 {
130 new ColumnDefinition("ApplicationRole_", ColumnType.String, 72, primaryKey: true, nullable: false, ColumnCategory.Identifier, keyTable: "ComPlusApplicationRole", keyColumn: 1, modularizeType: ColumnModularizeType.Column),
131 new ColumnDefinition("Name", ColumnType.String, 72, primaryKey: true, nullable: false, ColumnCategory.Formatted, modularizeType: ColumnModularizeType.Property),
132 new ColumnDefinition("Value", ColumnType.String, 255, primaryKey: false, nullable: false, ColumnCategory.Formatted, modularizeType: ColumnModularizeType.Property),
133 },
134 symbolIdIsPrimaryKey: false
135 );
136
137 public static readonly TableDefinition ComPlusUserInApplicationRole = new TableDefinition(
138 "ComPlusUserInApplicationRole",
139 ComPlusSymbolDefinitions.ComPlusUserInApplicationRole,
140 new[]
141 {
142 new ColumnDefinition("UserInApplicationRole", ColumnType.String, 72, primaryKey: true, nullable: false, ColumnCategory.Identifier, modularizeType: ColumnModularizeType.Column),
143 new ColumnDefinition("ApplicationRole_", ColumnType.String, 72, primaryKey: false, nullable: false, ColumnCategory.Identifier, keyTable: "ComPlusApplicationRole", keyColumn: 1, modularizeType: ColumnModularizeType.Column),
144 new ColumnDefinition("Component_", ColumnType.String, 72, primaryKey: false, nullable: false, ColumnCategory.Identifier, keyTable: "Component", keyColumn: 1, modularizeType: ColumnModularizeType.Column),
145 new ColumnDefinition("User_", ColumnType.String, 72, primaryKey: false, nullable: false, ColumnCategory.Identifier, modularizeType: ColumnModularizeType.Column),
146 },
147 symbolIdIsPrimaryKey: true
148 );
149
150 public static readonly TableDefinition ComPlusGroupInApplicationRole = new TableDefinition(
151 "ComPlusGroupInApplicationRole",
152 ComPlusSymbolDefinitions.ComPlusGroupInApplicationRole,
153 new[]
154 {
155 new ColumnDefinition("GroupInApplicationRole", ColumnType.String, 72, primaryKey: true, nullable: false, ColumnCategory.Identifier, modularizeType: ColumnModularizeType.Column),
156 new ColumnDefinition("ApplicationRole_", ColumnType.String, 72, primaryKey: false, nullable: false, ColumnCategory.Identifier, keyTable: "ComPlusApplicationRole", keyColumn: 1, modularizeType: ColumnModularizeType.Column),
157 new ColumnDefinition("Component_", ColumnType.String, 72, primaryKey: false, nullable: false, ColumnCategory.Identifier, keyTable: "Component", keyColumn: 1, modularizeType: ColumnModularizeType.Column),
158 new ColumnDefinition("Group_", ColumnType.String, 72, primaryKey: false, nullable: false, ColumnCategory.Identifier, modularizeType: ColumnModularizeType.Column),
159 },
160 symbolIdIsPrimaryKey: true
161 );
162
163 public static readonly TableDefinition ComPlusAssembly = new TableDefinition(
164 "ComPlusAssembly",
165 ComPlusSymbolDefinitions.ComPlusAssembly,
166 new[]
167 {
168 new ColumnDefinition("Assembly", ColumnType.String, 72, primaryKey: true, nullable: false, ColumnCategory.Identifier, modularizeType: ColumnModularizeType.Column),
169 new ColumnDefinition("Application_", ColumnType.String, 72, primaryKey: false, nullable: true, ColumnCategory.Identifier, keyTable: "ComPlusApplication", keyColumn: 1, modularizeType: ColumnModularizeType.Column),
170 new ColumnDefinition("Component_", ColumnType.String, 72, primaryKey: false, nullable: false, ColumnCategory.Identifier, keyTable: "Component", keyColumn: 1, modularizeType: ColumnModularizeType.Column),
171 new ColumnDefinition("AssemblyName", ColumnType.String, 255, primaryKey: false, nullable: true, ColumnCategory.Formatted, modularizeType: ColumnModularizeType.Property),
172 new ColumnDefinition("DllPath", ColumnType.String, 255, primaryKey: false, nullable: true, ColumnCategory.Formatted, modularizeType: ColumnModularizeType.Property),
173 new ColumnDefinition("TlbPath", ColumnType.String, 255, primaryKey: false, nullable: true, ColumnCategory.Formatted, modularizeType: ColumnModularizeType.Property),
174 new ColumnDefinition("PSDllPath", ColumnType.String, 255, primaryKey: false, nullable: true, ColumnCategory.Formatted, modularizeType: ColumnModularizeType.Property),
175 new ColumnDefinition("Attributes", ColumnType.Number, 4, primaryKey: false, nullable: false, ColumnCategory.Unknown),
176 },
177 symbolIdIsPrimaryKey: true
178 );
179
180 public static readonly TableDefinition ComPlusAssemblyDependency = new TableDefinition(
181 "ComPlusAssemblyDependency",
182 ComPlusSymbolDefinitions.ComPlusAssemblyDependency,
183 new[]
184 {
185 new ColumnDefinition("Assembly_", ColumnType.String, 72, primaryKey: true, nullable: false, ColumnCategory.Identifier, keyTable: "ComPlusAssembly", keyColumn: 1, modularizeType: ColumnModularizeType.Column),
186 new ColumnDefinition("RequiredAssembly_", ColumnType.String, 72, primaryKey: true, nullable: false, ColumnCategory.Identifier, keyTable: "ComPlusAssembly", keyColumn: 1, modularizeType: ColumnModularizeType.Column),
187 },
188 symbolIdIsPrimaryKey: false
189 );
190
191 public static readonly TableDefinition ComPlusComponent = new TableDefinition(
192 "ComPlusComponent",
193 ComPlusSymbolDefinitions.ComPlusComponent,
194 new[]
195 {
196 new ColumnDefinition("ComPlusComponent", ColumnType.String, 72, primaryKey: true, nullable: false, ColumnCategory.Identifier, modularizeType: ColumnModularizeType.Column),
197 new ColumnDefinition("Assembly_", ColumnType.String, 72, primaryKey: false, nullable: false, ColumnCategory.Identifier, keyTable: "ComPlusAssembly", keyColumn: 1, modularizeType: ColumnModularizeType.Column),
198 new ColumnDefinition("CLSID", ColumnType.String, 72, primaryKey: false, nullable: false, ColumnCategory.Formatted, modularizeType: ColumnModularizeType.Property),
199 },
200 symbolIdIsPrimaryKey: true
201 );
202
203 public static readonly TableDefinition ComPlusComponentProperty = new TableDefinition(
204 "ComPlusComponentProperty",
205 ComPlusSymbolDefinitions.ComPlusComponentProperty,
206 new[]
207 {
208 new ColumnDefinition("ComPlusComponent_", ColumnType.String, 72, primaryKey: true, nullable: false, ColumnCategory.Identifier, keyTable: "ComPlusComponent", keyColumn: 1, modularizeType: ColumnModularizeType.Column),
209 new ColumnDefinition("Name", ColumnType.String, 72, primaryKey: true, nullable: false, ColumnCategory.Formatted, modularizeType: ColumnModularizeType.Property),
210 new ColumnDefinition("Value", ColumnType.String, 255, primaryKey: false, nullable: false, ColumnCategory.Formatted, modularizeType: ColumnModularizeType.Property),
211 },
212 symbolIdIsPrimaryKey: false
213 );
214
215 public static readonly TableDefinition ComPlusRoleForComponent = new TableDefinition(
216 "ComPlusRoleForComponent",
217 ComPlusSymbolDefinitions.ComPlusRoleForComponent,
218 new[]
219 {
220 new ColumnDefinition("RoleForComponent", ColumnType.String, 72, primaryKey: true, nullable: false, ColumnCategory.Identifier, modularizeType: ColumnModularizeType.Column),
221 new ColumnDefinition("ComPlusComponent_", ColumnType.String, 72, primaryKey: false, nullable: false, ColumnCategory.Identifier, keyTable: "ComPlusComponent", keyColumn: 1, modularizeType: ColumnModularizeType.Column),
222 new ColumnDefinition("ApplicationRole_", ColumnType.String, 72, primaryKey: false, nullable: false, ColumnCategory.Identifier, keyTable: "ComPlusApplicationRole", keyColumn: 1, modularizeType: ColumnModularizeType.Column),
223 new ColumnDefinition("Component_", ColumnType.String, 72, primaryKey: false, nullable: false, ColumnCategory.Identifier, keyTable: "Component", keyColumn: 1, modularizeType: ColumnModularizeType.Column),
224 },
225 symbolIdIsPrimaryKey: true
226 );
227
228 public static readonly TableDefinition ComPlusInterface = new TableDefinition(
229 "ComPlusInterface",
230 ComPlusSymbolDefinitions.ComPlusInterface,
231 new[]
232 {
233 new ColumnDefinition("Interface", ColumnType.String, 72, primaryKey: true, nullable: false, ColumnCategory.Identifier, modularizeType: ColumnModularizeType.Column),
234 new ColumnDefinition("ComPlusComponent_", ColumnType.String, 72, primaryKey: false, nullable: false, ColumnCategory.Identifier, keyTable: "ComPlusComponent", keyColumn: 1, modularizeType: ColumnModularizeType.Column),
235 new ColumnDefinition("IID", ColumnType.String, 72, primaryKey: false, nullable: false, ColumnCategory.Formatted, modularizeType: ColumnModularizeType.Property),
236 },
237 symbolIdIsPrimaryKey: true
238 );
239
240 public static readonly TableDefinition ComPlusInterfaceProperty = new TableDefinition(
241 "ComPlusInterfaceProperty",
242 ComPlusSymbolDefinitions.ComPlusInterfaceProperty,
243 new[]
244 {
245 new ColumnDefinition("Interface_", ColumnType.String, 72, primaryKey: true, nullable: false, ColumnCategory.Identifier, keyTable: "ComPlusInterface", keyColumn: 1, modularizeType: ColumnModularizeType.Column),
246 new ColumnDefinition("Name", ColumnType.String, 72, primaryKey: true, nullable: false, ColumnCategory.Formatted, modularizeType: ColumnModularizeType.Property),
247 new ColumnDefinition("Value", ColumnType.String, 255, primaryKey: false, nullable: false, ColumnCategory.Formatted, modularizeType: ColumnModularizeType.Property),
248 },
249 symbolIdIsPrimaryKey: false
250 );
251
252 public static readonly TableDefinition ComPlusRoleForInterface = new TableDefinition(
253 "ComPlusRoleForInterface",
254 ComPlusSymbolDefinitions.ComPlusRoleForInterface,
255 new[]
256 {
257 new ColumnDefinition("RoleForInterface", ColumnType.String, 72, primaryKey: true, nullable: false, ColumnCategory.Identifier, modularizeType: ColumnModularizeType.Column),
258 new ColumnDefinition("Interface_", ColumnType.String, 72, primaryKey: false, nullable: false, ColumnCategory.Identifier, keyTable: "ComPlusInterface", keyColumn: 1, modularizeType: ColumnModularizeType.Column),
259 new ColumnDefinition("ApplicationRole_", ColumnType.String, 72, primaryKey: false, nullable: false, ColumnCategory.Identifier, keyTable: "ComPlusApplicationRole", keyColumn: 1, modularizeType: ColumnModularizeType.Column),
260 new ColumnDefinition("Component_", ColumnType.String, 72, primaryKey: false, nullable: false, ColumnCategory.Identifier, keyTable: "Component", keyColumn: 1, modularizeType: ColumnModularizeType.Column),
261 },
262 symbolIdIsPrimaryKey: true
263 );
264
265 public static readonly TableDefinition ComPlusMethod = new TableDefinition(
266 "ComPlusMethod",
267 ComPlusSymbolDefinitions.ComPlusMethod,
268 new[]
269 {
270 new ColumnDefinition("Method", ColumnType.String, 72, primaryKey: true, nullable: false, ColumnCategory.Identifier, modularizeType: ColumnModularizeType.Column),
271 new ColumnDefinition("Interface_", ColumnType.String, 72, primaryKey: false, nullable: false, ColumnCategory.Identifier, keyTable: "ComPlusInterface", keyColumn: 1, modularizeType: ColumnModularizeType.Column),
272 new ColumnDefinition("Index", ColumnType.Number, 4, primaryKey: false, nullable: true, ColumnCategory.Unknown),
273 new ColumnDefinition("Name", ColumnType.String, 255, primaryKey: false, nullable: true, ColumnCategory.Formatted, modularizeType: ColumnModularizeType.Property),
274 },
275 symbolIdIsPrimaryKey: true
276 );
277
278 public static readonly TableDefinition ComPlusMethodProperty = new TableDefinition(
279 "ComPlusMethodProperty",
280 ComPlusSymbolDefinitions.ComPlusMethodProperty,
281 new[]
282 {
283 new ColumnDefinition("Method_", ColumnType.String, 72, primaryKey: true, nullable: false, ColumnCategory.Identifier, keyTable: "ComPlusMethod", keyColumn: 1, modularizeType: ColumnModularizeType.Column),
284 new ColumnDefinition("Name", ColumnType.String, 72, primaryKey: true, nullable: false, ColumnCategory.Formatted, modularizeType: ColumnModularizeType.Property),
285 new ColumnDefinition("Value", ColumnType.String, 255, primaryKey: false, nullable: false, ColumnCategory.Formatted, modularizeType: ColumnModularizeType.Property),
286 },
287 symbolIdIsPrimaryKey: false
288 );
289
290 public static readonly TableDefinition ComPlusRoleForMethod = new TableDefinition(
291 "ComPlusRoleForMethod",
292 ComPlusSymbolDefinitions.ComPlusRoleForMethod,
293 new[]
294 {
295 new ColumnDefinition("RoleForMethod", ColumnType.String, 72, primaryKey: true, nullable: false, ColumnCategory.Identifier, modularizeType: ColumnModularizeType.Column),
296 new ColumnDefinition("Method_", ColumnType.String, 72, primaryKey: false, nullable: false, ColumnCategory.Identifier, keyTable: "ComPlusMethod", keyColumn: 1, modularizeType: ColumnModularizeType.Column),
297 new ColumnDefinition("ApplicationRole_", ColumnType.String, 72, primaryKey: false, nullable: false, ColumnCategory.Identifier, keyTable: "ComPlusApplicationRole", keyColumn: 1, modularizeType: ColumnModularizeType.Column),
298 new ColumnDefinition("Component_", ColumnType.String, 72, primaryKey: false, nullable: false, ColumnCategory.Identifier, keyTable: "Component", keyColumn: 1, modularizeType: ColumnModularizeType.Column),
299 },
300 symbolIdIsPrimaryKey: true
301 );
302
303 public static readonly TableDefinition ComPlusSubscription = new TableDefinition(
304 "ComPlusSubscription",
305 ComPlusSymbolDefinitions.ComPlusSubscription,
306 new[]
307 {
308 new ColumnDefinition("Subscription", ColumnType.String, 72, primaryKey: true, nullable: false, ColumnCategory.Identifier, modularizeType: ColumnModularizeType.Column),
309 new ColumnDefinition("ComPlusComponent_", ColumnType.String, 72, primaryKey: true, nullable: false, ColumnCategory.Identifier, keyTable: "ComPlusComponent", keyColumn: 1, modularizeType: ColumnModularizeType.Column),
310 new ColumnDefinition("Component_", ColumnType.String, 72, primaryKey: false, nullable: false, ColumnCategory.Identifier, keyTable: "Component", keyColumn: 1, modularizeType: ColumnModularizeType.Column),
311 new ColumnDefinition("Id", ColumnType.String, 72, primaryKey: false, nullable: true, ColumnCategory.Formatted, modularizeType: ColumnModularizeType.Property),
312 new ColumnDefinition("Name", ColumnType.String, 255, primaryKey: false, nullable: false, ColumnCategory.Formatted, modularizeType: ColumnModularizeType.Property),
313 new ColumnDefinition("EventCLSID", ColumnType.String, 72, primaryKey: false, nullable: true, ColumnCategory.Formatted, modularizeType: ColumnModularizeType.Property),
314 new ColumnDefinition("PublisherID", ColumnType.String, 72, primaryKey: false, nullable: true, ColumnCategory.Formatted, modularizeType: ColumnModularizeType.Property),
315 },
316 symbolIdIsPrimaryKey: false
317 );
318
319 public static readonly TableDefinition ComPlusSubscriptionProperty = new TableDefinition(
320 "ComPlusSubscriptionProperty",
321 ComPlusSymbolDefinitions.ComPlusSubscriptionProperty,
322 new[]
323 {
324 new ColumnDefinition("Subscription_", ColumnType.String, 72, primaryKey: true, nullable: false, ColumnCategory.Identifier, keyTable: "ComPlusSubscription", keyColumn: 1, modularizeType: ColumnModularizeType.Column),
325 new ColumnDefinition("Name", ColumnType.String, 72, primaryKey: true, nullable: false, ColumnCategory.Formatted, modularizeType: ColumnModularizeType.Property),
326 new ColumnDefinition("Value", ColumnType.String, 255, primaryKey: false, nullable: false, ColumnCategory.Formatted, modularizeType: ColumnModularizeType.Property),
327 },
328 symbolIdIsPrimaryKey: false
329 );
330
331 public static readonly TableDefinition[] All = new[]
332 {
333 ComPlusPartition,
334 ComPlusPartitionProperty,
335 ComPlusPartitionRole,
336 ComPlusUserInPartitionRole,
337 ComPlusGroupInPartitionRole,
338 ComPlusPartitionUser,
339 ComPlusApplication,
340 ComPlusApplicationProperty,
341 ComPlusApplicationRole,
342 ComPlusApplicationRoleProperty,
343 ComPlusUserInApplicationRole,
344 ComPlusGroupInApplicationRole,
345 ComPlusAssembly,
346 ComPlusAssemblyDependency,
347 ComPlusComponent,
348 ComPlusComponentProperty,
349 ComPlusRoleForComponent,
350 ComPlusInterface,
351 ComPlusInterfaceProperty,
352 ComPlusRoleForInterface,
353 ComPlusMethod,
354 ComPlusMethodProperty,
355 ComPlusRoleForMethod,
356 ComPlusSubscription,
357 ComPlusSubscriptionProperty,
358 };
359 }
360}
diff --git a/src/ext/ComPlus/wixext/ComPlusWarnings.cs b/src/ext/ComPlus/wixext/ComPlusWarnings.cs
new file mode 100644
index 00000000..e0000918
--- /dev/null
+++ b/src/ext/ComPlus/wixext/ComPlusWarnings.cs
@@ -0,0 +1,31 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.ComPlus
4{
5 using System;
6 using System.Resources;
7 using WixToolset.Data;
8
9 public static class ComPlusWarnings
10 {
11 public static Message MissingComponents(SourceLineNumber sourceLineNumbers)
12 {
13 return Message(sourceLineNumbers, Ids.MissingComponents, "The ComPlusAssembly element has a Type attribute with a value of 'native', but the element does not contain any ComPlusComponent elements. All components contained in a native assembly must be listed, or they will not be correctly removed during uninstall.");
14 }
15
16 private static Message Message(SourceLineNumber sourceLineNumber, Ids id, string format, params object[] args)
17 {
18 return new Message(sourceLineNumber, MessageLevel.Warning, (int)id, format, args);
19 }
20
21 private static Message Message(SourceLineNumber sourceLineNumber, Ids id, ResourceManager resourceManager, string resourceName, params object[] args)
22 {
23 return new Message(sourceLineNumber, MessageLevel.Warning, (int)id, resourceManager, resourceName, args);
24 }
25
26 public enum Ids
27 {
28 MissingComponents = 6007,
29 }
30 }
31}
diff --git a/src/ext/ComPlus/wixext/ComPlusWindowsInstallerBackendBinderExtension.cs b/src/ext/ComPlus/wixext/ComPlusWindowsInstallerBackendBinderExtension.cs
new file mode 100644
index 00000000..cf226a3d
--- /dev/null
+++ b/src/ext/ComPlus/wixext/ComPlusWindowsInstallerBackendBinderExtension.cs
@@ -0,0 +1,13 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.ComPlus
4{
5 using System.Collections.Generic;
6 using WixToolset.Data.WindowsInstaller;
7 using WixToolset.Extensibility;
8
9 public class ComPlusWindowsInstallerBackendBinderExtension : BaseWindowsInstallerBackendBinderExtension
10 {
11 public override IReadOnlyCollection<TableDefinition> TableDefinitions => ComPlusTableDefinitions.All;
12 }
13}
diff --git a/src/ext/ComPlus/wixext/Symbols/ComPlusApplicationPropertySymbol.cs b/src/ext/ComPlus/wixext/Symbols/ComPlusApplicationPropertySymbol.cs
new file mode 100644
index 00000000..6d1e2d28
--- /dev/null
+++ b/src/ext/ComPlus/wixext/Symbols/ComPlusApplicationPropertySymbol.cs
@@ -0,0 +1,63 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.ComPlus
4{
5 using WixToolset.Data;
6 using WixToolset.ComPlus.Symbols;
7
8 public static partial class ComPlusSymbolDefinitions
9 {
10 public static readonly IntermediateSymbolDefinition ComPlusApplicationProperty = new IntermediateSymbolDefinition(
11 ComPlusSymbolDefinitionType.ComPlusApplicationProperty.ToString(),
12 new[]
13 {
14 new IntermediateFieldDefinition(nameof(ComPlusApplicationPropertySymbolFields.ApplicationRef), IntermediateFieldType.String),
15 new IntermediateFieldDefinition(nameof(ComPlusApplicationPropertySymbolFields.Name), IntermediateFieldType.String),
16 new IntermediateFieldDefinition(nameof(ComPlusApplicationPropertySymbolFields.Value), IntermediateFieldType.String),
17 },
18 typeof(ComPlusApplicationPropertySymbol));
19 }
20}
21
22namespace WixToolset.ComPlus.Symbols
23{
24 using WixToolset.Data;
25
26 public enum ComPlusApplicationPropertySymbolFields
27 {
28 ApplicationRef,
29 Name,
30 Value,
31 }
32
33 public class ComPlusApplicationPropertySymbol : IntermediateSymbol
34 {
35 public ComPlusApplicationPropertySymbol() : base(ComPlusSymbolDefinitions.ComPlusApplicationProperty, null, null)
36 {
37 }
38
39 public ComPlusApplicationPropertySymbol(SourceLineNumber sourceLineNumber, Identifier id = null) : base(ComPlusSymbolDefinitions.ComPlusApplicationProperty, sourceLineNumber, id)
40 {
41 }
42
43 public IntermediateField this[ComPlusApplicationPropertySymbolFields index] => this.Fields[(int)index];
44
45 public string ApplicationRef
46 {
47 get => this.Fields[(int)ComPlusApplicationPropertySymbolFields.ApplicationRef].AsString();
48 set => this.Set((int)ComPlusApplicationPropertySymbolFields.ApplicationRef, value);
49 }
50
51 public string Name
52 {
53 get => this.Fields[(int)ComPlusApplicationPropertySymbolFields.Name].AsString();
54 set => this.Set((int)ComPlusApplicationPropertySymbolFields.Name, value);
55 }
56
57 public string Value
58 {
59 get => this.Fields[(int)ComPlusApplicationPropertySymbolFields.Value].AsString();
60 set => this.Set((int)ComPlusApplicationPropertySymbolFields.Value, value);
61 }
62 }
63} \ No newline at end of file
diff --git a/src/ext/ComPlus/wixext/Symbols/ComPlusApplicationRolePropertySymbol.cs b/src/ext/ComPlus/wixext/Symbols/ComPlusApplicationRolePropertySymbol.cs
new file mode 100644
index 00000000..3b957899
--- /dev/null
+++ b/src/ext/ComPlus/wixext/Symbols/ComPlusApplicationRolePropertySymbol.cs
@@ -0,0 +1,63 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.ComPlus
4{
5 using WixToolset.Data;
6 using WixToolset.ComPlus.Symbols;
7
8 public static partial class ComPlusSymbolDefinitions
9 {
10 public static readonly IntermediateSymbolDefinition ComPlusApplicationRoleProperty = new IntermediateSymbolDefinition(
11 ComPlusSymbolDefinitionType.ComPlusApplicationRoleProperty.ToString(),
12 new[]
13 {
14 new IntermediateFieldDefinition(nameof(ComPlusApplicationRolePropertySymbolFields.ApplicationRoleRef), IntermediateFieldType.String),
15 new IntermediateFieldDefinition(nameof(ComPlusApplicationRolePropertySymbolFields.Name), IntermediateFieldType.String),
16 new IntermediateFieldDefinition(nameof(ComPlusApplicationRolePropertySymbolFields.Value), IntermediateFieldType.String),
17 },
18 typeof(ComPlusApplicationRolePropertySymbol));
19 }
20}
21
22namespace WixToolset.ComPlus.Symbols
23{
24 using WixToolset.Data;
25
26 public enum ComPlusApplicationRolePropertySymbolFields
27 {
28 ApplicationRoleRef,
29 Name,
30 Value,
31 }
32
33 public class ComPlusApplicationRolePropertySymbol : IntermediateSymbol
34 {
35 public ComPlusApplicationRolePropertySymbol() : base(ComPlusSymbolDefinitions.ComPlusApplicationRoleProperty, null, null)
36 {
37 }
38
39 public ComPlusApplicationRolePropertySymbol(SourceLineNumber sourceLineNumber, Identifier id = null) : base(ComPlusSymbolDefinitions.ComPlusApplicationRoleProperty, sourceLineNumber, id)
40 {
41 }
42
43 public IntermediateField this[ComPlusApplicationRolePropertySymbolFields index] => this.Fields[(int)index];
44
45 public string ApplicationRoleRef
46 {
47 get => this.Fields[(int)ComPlusApplicationRolePropertySymbolFields.ApplicationRoleRef].AsString();
48 set => this.Set((int)ComPlusApplicationRolePropertySymbolFields.ApplicationRoleRef, value);
49 }
50
51 public string Name
52 {
53 get => this.Fields[(int)ComPlusApplicationRolePropertySymbolFields.Name].AsString();
54 set => this.Set((int)ComPlusApplicationRolePropertySymbolFields.Name, value);
55 }
56
57 public string Value
58 {
59 get => this.Fields[(int)ComPlusApplicationRolePropertySymbolFields.Value].AsString();
60 set => this.Set((int)ComPlusApplicationRolePropertySymbolFields.Value, value);
61 }
62 }
63} \ No newline at end of file
diff --git a/src/ext/ComPlus/wixext/Symbols/ComPlusApplicationRoleSymbol.cs b/src/ext/ComPlus/wixext/Symbols/ComPlusApplicationRoleSymbol.cs
new file mode 100644
index 00000000..84028ee3
--- /dev/null
+++ b/src/ext/ComPlus/wixext/Symbols/ComPlusApplicationRoleSymbol.cs
@@ -0,0 +1,63 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.ComPlus
4{
5 using WixToolset.Data;
6 using WixToolset.ComPlus.Symbols;
7
8 public static partial class ComPlusSymbolDefinitions
9 {
10 public static readonly IntermediateSymbolDefinition ComPlusApplicationRole = new IntermediateSymbolDefinition(
11 ComPlusSymbolDefinitionType.ComPlusApplicationRole.ToString(),
12 new[]
13 {
14 new IntermediateFieldDefinition(nameof(ComPlusApplicationRoleSymbolFields.ApplicationRef), IntermediateFieldType.String),
15 new IntermediateFieldDefinition(nameof(ComPlusApplicationRoleSymbolFields.ComponentRef), IntermediateFieldType.String),
16 new IntermediateFieldDefinition(nameof(ComPlusApplicationRoleSymbolFields.Name), IntermediateFieldType.String),
17 },
18 typeof(ComPlusApplicationRoleSymbol));
19 }
20}
21
22namespace WixToolset.ComPlus.Symbols
23{
24 using WixToolset.Data;
25
26 public enum ComPlusApplicationRoleSymbolFields
27 {
28 ApplicationRef,
29 ComponentRef,
30 Name,
31 }
32
33 public class ComPlusApplicationRoleSymbol : IntermediateSymbol
34 {
35 public ComPlusApplicationRoleSymbol() : base(ComPlusSymbolDefinitions.ComPlusApplicationRole, null, null)
36 {
37 }
38
39 public ComPlusApplicationRoleSymbol(SourceLineNumber sourceLineNumber, Identifier id = null) : base(ComPlusSymbolDefinitions.ComPlusApplicationRole, sourceLineNumber, id)
40 {
41 }
42
43 public IntermediateField this[ComPlusApplicationRoleSymbolFields index] => this.Fields[(int)index];
44
45 public string ApplicationRef
46 {
47 get => this.Fields[(int)ComPlusApplicationRoleSymbolFields.ApplicationRef].AsString();
48 set => this.Set((int)ComPlusApplicationRoleSymbolFields.ApplicationRef, value);
49 }
50
51 public string ComponentRef
52 {
53 get => this.Fields[(int)ComPlusApplicationRoleSymbolFields.ComponentRef].AsString();
54 set => this.Set((int)ComPlusApplicationRoleSymbolFields.ComponentRef, value);
55 }
56
57 public string Name
58 {
59 get => this.Fields[(int)ComPlusApplicationRoleSymbolFields.Name].AsString();
60 set => this.Set((int)ComPlusApplicationRoleSymbolFields.Name, value);
61 }
62 }
63} \ No newline at end of file
diff --git a/src/ext/ComPlus/wixext/Symbols/ComPlusApplicationSymbol.cs b/src/ext/ComPlus/wixext/Symbols/ComPlusApplicationSymbol.cs
new file mode 100644
index 00000000..ce541e43
--- /dev/null
+++ b/src/ext/ComPlus/wixext/Symbols/ComPlusApplicationSymbol.cs
@@ -0,0 +1,71 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.ComPlus
4{
5 using WixToolset.Data;
6 using WixToolset.ComPlus.Symbols;
7
8 public static partial class ComPlusSymbolDefinitions
9 {
10 public static readonly IntermediateSymbolDefinition ComPlusApplication = new IntermediateSymbolDefinition(
11 ComPlusSymbolDefinitionType.ComPlusApplication.ToString(),
12 new[]
13 {
14 new IntermediateFieldDefinition(nameof(ComPlusApplicationSymbolFields.PartitionRef), IntermediateFieldType.String),
15 new IntermediateFieldDefinition(nameof(ComPlusApplicationSymbolFields.ComponentRef), IntermediateFieldType.String),
16 new IntermediateFieldDefinition(nameof(ComPlusApplicationSymbolFields.ApplicationId), IntermediateFieldType.String),
17 new IntermediateFieldDefinition(nameof(ComPlusApplicationSymbolFields.Name), IntermediateFieldType.String),
18 },
19 typeof(ComPlusApplicationSymbol));
20 }
21}
22
23namespace WixToolset.ComPlus.Symbols
24{
25 using WixToolset.Data;
26
27 public enum ComPlusApplicationSymbolFields
28 {
29 PartitionRef,
30 ComponentRef,
31 ApplicationId,
32 Name,
33 }
34
35 public class ComPlusApplicationSymbol : IntermediateSymbol
36 {
37 public ComPlusApplicationSymbol() : base(ComPlusSymbolDefinitions.ComPlusApplication, null, null)
38 {
39 }
40
41 public ComPlusApplicationSymbol(SourceLineNumber sourceLineNumber, Identifier id = null) : base(ComPlusSymbolDefinitions.ComPlusApplication, sourceLineNumber, id)
42 {
43 }
44
45 public IntermediateField this[ComPlusApplicationSymbolFields index] => this.Fields[(int)index];
46
47 public string PartitionRef
48 {
49 get => this.Fields[(int)ComPlusApplicationSymbolFields.PartitionRef].AsString();
50 set => this.Set((int)ComPlusApplicationSymbolFields.PartitionRef, value);
51 }
52
53 public string ComponentRef
54 {
55 get => this.Fields[(int)ComPlusApplicationSymbolFields.ComponentRef].AsString();
56 set => this.Set((int)ComPlusApplicationSymbolFields.ComponentRef, value);
57 }
58
59 public string ApplicationId
60 {
61 get => this.Fields[(int)ComPlusApplicationSymbolFields.ApplicationId].AsString();
62 set => this.Set((int)ComPlusApplicationSymbolFields.ApplicationId, value);
63 }
64
65 public string Name
66 {
67 get => this.Fields[(int)ComPlusApplicationSymbolFields.Name].AsString();
68 set => this.Set((int)ComPlusApplicationSymbolFields.Name, value);
69 }
70 }
71} \ No newline at end of file
diff --git a/src/ext/ComPlus/wixext/Symbols/ComPlusAssemblyDependencySymbol.cs b/src/ext/ComPlus/wixext/Symbols/ComPlusAssemblyDependencySymbol.cs
new file mode 100644
index 00000000..549d53e4
--- /dev/null
+++ b/src/ext/ComPlus/wixext/Symbols/ComPlusAssemblyDependencySymbol.cs
@@ -0,0 +1,55 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.ComPlus
4{
5 using WixToolset.Data;
6 using WixToolset.ComPlus.Symbols;
7
8 public static partial class ComPlusSymbolDefinitions
9 {
10 public static readonly IntermediateSymbolDefinition ComPlusAssemblyDependency = new IntermediateSymbolDefinition(
11 ComPlusSymbolDefinitionType.ComPlusAssemblyDependency.ToString(),
12 new[]
13 {
14 new IntermediateFieldDefinition(nameof(ComPlusAssemblyDependencySymbolFields.AssemblyRef), IntermediateFieldType.String),
15 new IntermediateFieldDefinition(nameof(ComPlusAssemblyDependencySymbolFields.RequiredAssemblyRef), IntermediateFieldType.String),
16 },
17 typeof(ComPlusAssemblyDependencySymbol));
18 }
19}
20
21namespace WixToolset.ComPlus.Symbols
22{
23 using WixToolset.Data;
24
25 public enum ComPlusAssemblyDependencySymbolFields
26 {
27 AssemblyRef,
28 RequiredAssemblyRef,
29 }
30
31 public class ComPlusAssemblyDependencySymbol : IntermediateSymbol
32 {
33 public ComPlusAssemblyDependencySymbol() : base(ComPlusSymbolDefinitions.ComPlusAssemblyDependency, null, null)
34 {
35 }
36
37 public ComPlusAssemblyDependencySymbol(SourceLineNumber sourceLineNumber, Identifier id = null) : base(ComPlusSymbolDefinitions.ComPlusAssemblyDependency, sourceLineNumber, id)
38 {
39 }
40
41 public IntermediateField this[ComPlusAssemblyDependencySymbolFields index] => this.Fields[(int)index];
42
43 public string AssemblyRef
44 {
45 get => this.Fields[(int)ComPlusAssemblyDependencySymbolFields.AssemblyRef].AsString();
46 set => this.Set((int)ComPlusAssemblyDependencySymbolFields.AssemblyRef, value);
47 }
48
49 public string RequiredAssemblyRef
50 {
51 get => this.Fields[(int)ComPlusAssemblyDependencySymbolFields.RequiredAssemblyRef].AsString();
52 set => this.Set((int)ComPlusAssemblyDependencySymbolFields.RequiredAssemblyRef, value);
53 }
54 }
55} \ No newline at end of file
diff --git a/src/ext/ComPlus/wixext/Symbols/ComPlusAssemblySymbol.cs b/src/ext/ComPlus/wixext/Symbols/ComPlusAssemblySymbol.cs
new file mode 100644
index 00000000..1329df30
--- /dev/null
+++ b/src/ext/ComPlus/wixext/Symbols/ComPlusAssemblySymbol.cs
@@ -0,0 +1,95 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.ComPlus
4{
5 using WixToolset.Data;
6 using WixToolset.ComPlus.Symbols;
7
8 public static partial class ComPlusSymbolDefinitions
9 {
10 public static readonly IntermediateSymbolDefinition ComPlusAssembly = new IntermediateSymbolDefinition(
11 ComPlusSymbolDefinitionType.ComPlusAssembly.ToString(),
12 new[]
13 {
14 new IntermediateFieldDefinition(nameof(ComPlusAssemblySymbolFields.ApplicationRef), IntermediateFieldType.String),
15 new IntermediateFieldDefinition(nameof(ComPlusAssemblySymbolFields.ComponentRef), IntermediateFieldType.String),
16 new IntermediateFieldDefinition(nameof(ComPlusAssemblySymbolFields.AssemblyName), IntermediateFieldType.String),
17 new IntermediateFieldDefinition(nameof(ComPlusAssemblySymbolFields.DllPath), IntermediateFieldType.String),
18 new IntermediateFieldDefinition(nameof(ComPlusAssemblySymbolFields.TlbPath), IntermediateFieldType.String),
19 new IntermediateFieldDefinition(nameof(ComPlusAssemblySymbolFields.PSDllPath), IntermediateFieldType.String),
20 new IntermediateFieldDefinition(nameof(ComPlusAssemblySymbolFields.Attributes), IntermediateFieldType.Number),
21 },
22 typeof(ComPlusAssemblySymbol));
23 }
24}
25
26namespace WixToolset.ComPlus.Symbols
27{
28 using WixToolset.Data;
29
30 public enum ComPlusAssemblySymbolFields
31 {
32 ApplicationRef,
33 ComponentRef,
34 AssemblyName,
35 DllPath,
36 TlbPath,
37 PSDllPath,
38 Attributes,
39 }
40
41 public class ComPlusAssemblySymbol : IntermediateSymbol
42 {
43 public ComPlusAssemblySymbol() : base(ComPlusSymbolDefinitions.ComPlusAssembly, null, null)
44 {
45 }
46
47 public ComPlusAssemblySymbol(SourceLineNumber sourceLineNumber, Identifier id = null) : base(ComPlusSymbolDefinitions.ComPlusAssembly, sourceLineNumber, id)
48 {
49 }
50
51 public IntermediateField this[ComPlusAssemblySymbolFields index] => this.Fields[(int)index];
52
53 public string ApplicationRef
54 {
55 get => this.Fields[(int)ComPlusAssemblySymbolFields.ApplicationRef].AsString();
56 set => this.Set((int)ComPlusAssemblySymbolFields.ApplicationRef, value);
57 }
58
59 public string ComponentRef
60 {
61 get => this.Fields[(int)ComPlusAssemblySymbolFields.ComponentRef].AsString();
62 set => this.Set((int)ComPlusAssemblySymbolFields.ComponentRef, value);
63 }
64
65 public string AssemblyName
66 {
67 get => this.Fields[(int)ComPlusAssemblySymbolFields.AssemblyName].AsString();
68 set => this.Set((int)ComPlusAssemblySymbolFields.AssemblyName, value);
69 }
70
71 public string DllPath
72 {
73 get => this.Fields[(int)ComPlusAssemblySymbolFields.DllPath].AsString();
74 set => this.Set((int)ComPlusAssemblySymbolFields.DllPath, value);
75 }
76
77 public string TlbPath
78 {
79 get => this.Fields[(int)ComPlusAssemblySymbolFields.TlbPath].AsString();
80 set => this.Set((int)ComPlusAssemblySymbolFields.TlbPath, value);
81 }
82
83 public string PSDllPath
84 {
85 get => this.Fields[(int)ComPlusAssemblySymbolFields.PSDllPath].AsString();
86 set => this.Set((int)ComPlusAssemblySymbolFields.PSDllPath, value);
87 }
88
89 public int Attributes
90 {
91 get => this.Fields[(int)ComPlusAssemblySymbolFields.Attributes].AsNumber();
92 set => this.Set((int)ComPlusAssemblySymbolFields.Attributes, value);
93 }
94 }
95} \ No newline at end of file
diff --git a/src/ext/ComPlus/wixext/Symbols/ComPlusComponentPropertySymbol.cs b/src/ext/ComPlus/wixext/Symbols/ComPlusComponentPropertySymbol.cs
new file mode 100644
index 00000000..b1d85b60
--- /dev/null
+++ b/src/ext/ComPlus/wixext/Symbols/ComPlusComponentPropertySymbol.cs
@@ -0,0 +1,63 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.ComPlus
4{
5 using WixToolset.Data;
6 using WixToolset.ComPlus.Symbols;
7
8 public static partial class ComPlusSymbolDefinitions
9 {
10 public static readonly IntermediateSymbolDefinition ComPlusComponentProperty = new IntermediateSymbolDefinition(
11 ComPlusSymbolDefinitionType.ComPlusComponentProperty.ToString(),
12 new[]
13 {
14 new IntermediateFieldDefinition(nameof(ComPlusComponentPropertySymbolFields.ComPlusComponentRef), IntermediateFieldType.String),
15 new IntermediateFieldDefinition(nameof(ComPlusComponentPropertySymbolFields.Name), IntermediateFieldType.String),
16 new IntermediateFieldDefinition(nameof(ComPlusComponentPropertySymbolFields.Value), IntermediateFieldType.String),
17 },
18 typeof(ComPlusComponentPropertySymbol));
19 }
20}
21
22namespace WixToolset.ComPlus.Symbols
23{
24 using WixToolset.Data;
25
26 public enum ComPlusComponentPropertySymbolFields
27 {
28 ComPlusComponentRef,
29 Name,
30 Value,
31 }
32
33 public class ComPlusComponentPropertySymbol : IntermediateSymbol
34 {
35 public ComPlusComponentPropertySymbol() : base(ComPlusSymbolDefinitions.ComPlusComponentProperty, null, null)
36 {
37 }
38
39 public ComPlusComponentPropertySymbol(SourceLineNumber sourceLineNumber, Identifier id = null) : base(ComPlusSymbolDefinitions.ComPlusComponentProperty, sourceLineNumber, id)
40 {
41 }
42
43 public IntermediateField this[ComPlusComponentPropertySymbolFields index] => this.Fields[(int)index];
44
45 public string ComPlusComponentRef
46 {
47 get => this.Fields[(int)ComPlusComponentPropertySymbolFields.ComPlusComponentRef].AsString();
48 set => this.Set((int)ComPlusComponentPropertySymbolFields.ComPlusComponentRef, value);
49 }
50
51 public string Name
52 {
53 get => this.Fields[(int)ComPlusComponentPropertySymbolFields.Name].AsString();
54 set => this.Set((int)ComPlusComponentPropertySymbolFields.Name, value);
55 }
56
57 public string Value
58 {
59 get => this.Fields[(int)ComPlusComponentPropertySymbolFields.Value].AsString();
60 set => this.Set((int)ComPlusComponentPropertySymbolFields.Value, value);
61 }
62 }
63} \ No newline at end of file
diff --git a/src/ext/ComPlus/wixext/Symbols/ComPlusComponentSymbol.cs b/src/ext/ComPlus/wixext/Symbols/ComPlusComponentSymbol.cs
new file mode 100644
index 00000000..020b754c
--- /dev/null
+++ b/src/ext/ComPlus/wixext/Symbols/ComPlusComponentSymbol.cs
@@ -0,0 +1,55 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.ComPlus
4{
5 using WixToolset.Data;
6 using WixToolset.ComPlus.Symbols;
7
8 public static partial class ComPlusSymbolDefinitions
9 {
10 public static readonly IntermediateSymbolDefinition ComPlusComponent = new IntermediateSymbolDefinition(
11 ComPlusSymbolDefinitionType.ComPlusComponent.ToString(),
12 new[]
13 {
14 new IntermediateFieldDefinition(nameof(ComPlusComponentSymbolFields.AssemblyRef), IntermediateFieldType.String),
15 new IntermediateFieldDefinition(nameof(ComPlusComponentSymbolFields.CLSID), IntermediateFieldType.String),
16 },
17 typeof(ComPlusComponentSymbol));
18 }
19}
20
21namespace WixToolset.ComPlus.Symbols
22{
23 using WixToolset.Data;
24
25 public enum ComPlusComponentSymbolFields
26 {
27 AssemblyRef,
28 CLSID,
29 }
30
31 public class ComPlusComponentSymbol : IntermediateSymbol
32 {
33 public ComPlusComponentSymbol() : base(ComPlusSymbolDefinitions.ComPlusComponent, null, null)
34 {
35 }
36
37 public ComPlusComponentSymbol(SourceLineNumber sourceLineNumber, Identifier id = null) : base(ComPlusSymbolDefinitions.ComPlusComponent, sourceLineNumber, id)
38 {
39 }
40
41 public IntermediateField this[ComPlusComponentSymbolFields index] => this.Fields[(int)index];
42
43 public string AssemblyRef
44 {
45 get => this.Fields[(int)ComPlusComponentSymbolFields.AssemblyRef].AsString();
46 set => this.Set((int)ComPlusComponentSymbolFields.AssemblyRef, value);
47 }
48
49 public string CLSID
50 {
51 get => this.Fields[(int)ComPlusComponentSymbolFields.CLSID].AsString();
52 set => this.Set((int)ComPlusComponentSymbolFields.CLSID, value);
53 }
54 }
55} \ No newline at end of file
diff --git a/src/ext/ComPlus/wixext/Symbols/ComPlusGroupInApplicationRoleSymbol.cs b/src/ext/ComPlus/wixext/Symbols/ComPlusGroupInApplicationRoleSymbol.cs
new file mode 100644
index 00000000..d6b91e99
--- /dev/null
+++ b/src/ext/ComPlus/wixext/Symbols/ComPlusGroupInApplicationRoleSymbol.cs
@@ -0,0 +1,63 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.ComPlus
4{
5 using WixToolset.Data;
6 using WixToolset.ComPlus.Symbols;
7
8 public static partial class ComPlusSymbolDefinitions
9 {
10 public static readonly IntermediateSymbolDefinition ComPlusGroupInApplicationRole = new IntermediateSymbolDefinition(
11 ComPlusSymbolDefinitionType.ComPlusGroupInApplicationRole.ToString(),
12 new[]
13 {
14 new IntermediateFieldDefinition(nameof(ComPlusGroupInApplicationRoleSymbolFields.ApplicationRoleRef), IntermediateFieldType.String),
15 new IntermediateFieldDefinition(nameof(ComPlusGroupInApplicationRoleSymbolFields.ComponentRef), IntermediateFieldType.String),
16 new IntermediateFieldDefinition(nameof(ComPlusGroupInApplicationRoleSymbolFields.GroupRef), IntermediateFieldType.String),
17 },
18 typeof(ComPlusGroupInApplicationRoleSymbol));
19 }
20}
21
22namespace WixToolset.ComPlus.Symbols
23{
24 using WixToolset.Data;
25
26 public enum ComPlusGroupInApplicationRoleSymbolFields
27 {
28 ApplicationRoleRef,
29 ComponentRef,
30 GroupRef,
31 }
32
33 public class ComPlusGroupInApplicationRoleSymbol : IntermediateSymbol
34 {
35 public ComPlusGroupInApplicationRoleSymbol() : base(ComPlusSymbolDefinitions.ComPlusGroupInApplicationRole, null, null)
36 {
37 }
38
39 public ComPlusGroupInApplicationRoleSymbol(SourceLineNumber sourceLineNumber, Identifier id = null) : base(ComPlusSymbolDefinitions.ComPlusGroupInApplicationRole, sourceLineNumber, id)
40 {
41 }
42
43 public IntermediateField this[ComPlusGroupInApplicationRoleSymbolFields index] => this.Fields[(int)index];
44
45 public string ApplicationRoleRef
46 {
47 get => this.Fields[(int)ComPlusGroupInApplicationRoleSymbolFields.ApplicationRoleRef].AsString();
48 set => this.Set((int)ComPlusGroupInApplicationRoleSymbolFields.ApplicationRoleRef, value);
49 }
50
51 public string ComponentRef
52 {
53 get => this.Fields[(int)ComPlusGroupInApplicationRoleSymbolFields.ComponentRef].AsString();
54 set => this.Set((int)ComPlusGroupInApplicationRoleSymbolFields.ComponentRef, value);
55 }
56
57 public string GroupRef
58 {
59 get => this.Fields[(int)ComPlusGroupInApplicationRoleSymbolFields.GroupRef].AsString();
60 set => this.Set((int)ComPlusGroupInApplicationRoleSymbolFields.GroupRef, value);
61 }
62 }
63} \ No newline at end of file
diff --git a/src/ext/ComPlus/wixext/Symbols/ComPlusGroupInPartitionRoleSymbol.cs b/src/ext/ComPlus/wixext/Symbols/ComPlusGroupInPartitionRoleSymbol.cs
new file mode 100644
index 00000000..da70de9f
--- /dev/null
+++ b/src/ext/ComPlus/wixext/Symbols/ComPlusGroupInPartitionRoleSymbol.cs
@@ -0,0 +1,63 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.ComPlus
4{
5 using WixToolset.Data;
6 using WixToolset.ComPlus.Symbols;
7
8 public static partial class ComPlusSymbolDefinitions
9 {
10 public static readonly IntermediateSymbolDefinition ComPlusGroupInPartitionRole = new IntermediateSymbolDefinition(
11 ComPlusSymbolDefinitionType.ComPlusGroupInPartitionRole.ToString(),
12 new[]
13 {
14 new IntermediateFieldDefinition(nameof(ComPlusGroupInPartitionRoleSymbolFields.PartitionRoleRef), IntermediateFieldType.String),
15 new IntermediateFieldDefinition(nameof(ComPlusGroupInPartitionRoleSymbolFields.ComponentRef), IntermediateFieldType.String),
16 new IntermediateFieldDefinition(nameof(ComPlusGroupInPartitionRoleSymbolFields.GroupRef), IntermediateFieldType.String),
17 },
18 typeof(ComPlusGroupInPartitionRoleSymbol));
19 }
20}
21
22namespace WixToolset.ComPlus.Symbols
23{
24 using WixToolset.Data;
25
26 public enum ComPlusGroupInPartitionRoleSymbolFields
27 {
28 PartitionRoleRef,
29 ComponentRef,
30 GroupRef,
31 }
32
33 public class ComPlusGroupInPartitionRoleSymbol : IntermediateSymbol
34 {
35 public ComPlusGroupInPartitionRoleSymbol() : base(ComPlusSymbolDefinitions.ComPlusGroupInPartitionRole, null, null)
36 {
37 }
38
39 public ComPlusGroupInPartitionRoleSymbol(SourceLineNumber sourceLineNumber, Identifier id = null) : base(ComPlusSymbolDefinitions.ComPlusGroupInPartitionRole, sourceLineNumber, id)
40 {
41 }
42
43 public IntermediateField this[ComPlusGroupInPartitionRoleSymbolFields index] => this.Fields[(int)index];
44
45 public string PartitionRoleRef
46 {
47 get => this.Fields[(int)ComPlusGroupInPartitionRoleSymbolFields.PartitionRoleRef].AsString();
48 set => this.Set((int)ComPlusGroupInPartitionRoleSymbolFields.PartitionRoleRef, value);
49 }
50
51 public string ComponentRef
52 {
53 get => this.Fields[(int)ComPlusGroupInPartitionRoleSymbolFields.ComponentRef].AsString();
54 set => this.Set((int)ComPlusGroupInPartitionRoleSymbolFields.ComponentRef, value);
55 }
56
57 public string GroupRef
58 {
59 get => this.Fields[(int)ComPlusGroupInPartitionRoleSymbolFields.GroupRef].AsString();
60 set => this.Set((int)ComPlusGroupInPartitionRoleSymbolFields.GroupRef, value);
61 }
62 }
63} \ No newline at end of file
diff --git a/src/ext/ComPlus/wixext/Symbols/ComPlusInterfacePropertySymbol.cs b/src/ext/ComPlus/wixext/Symbols/ComPlusInterfacePropertySymbol.cs
new file mode 100644
index 00000000..2ed4ce18
--- /dev/null
+++ b/src/ext/ComPlus/wixext/Symbols/ComPlusInterfacePropertySymbol.cs
@@ -0,0 +1,63 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.ComPlus
4{
5 using WixToolset.Data;
6 using WixToolset.ComPlus.Symbols;
7
8 public static partial class ComPlusSymbolDefinitions
9 {
10 public static readonly IntermediateSymbolDefinition ComPlusInterfaceProperty = new IntermediateSymbolDefinition(
11 ComPlusSymbolDefinitionType.ComPlusInterfaceProperty.ToString(),
12 new[]
13 {
14 new IntermediateFieldDefinition(nameof(ComPlusInterfacePropertySymbolFields.InterfaceRef), IntermediateFieldType.String),
15 new IntermediateFieldDefinition(nameof(ComPlusInterfacePropertySymbolFields.Name), IntermediateFieldType.String),
16 new IntermediateFieldDefinition(nameof(ComPlusInterfacePropertySymbolFields.Value), IntermediateFieldType.String),
17 },
18 typeof(ComPlusInterfacePropertySymbol));
19 }
20}
21
22namespace WixToolset.ComPlus.Symbols
23{
24 using WixToolset.Data;
25
26 public enum ComPlusInterfacePropertySymbolFields
27 {
28 InterfaceRef,
29 Name,
30 Value,
31 }
32
33 public class ComPlusInterfacePropertySymbol : IntermediateSymbol
34 {
35 public ComPlusInterfacePropertySymbol() : base(ComPlusSymbolDefinitions.ComPlusInterfaceProperty, null, null)
36 {
37 }
38
39 public ComPlusInterfacePropertySymbol(SourceLineNumber sourceLineNumber, Identifier id = null) : base(ComPlusSymbolDefinitions.ComPlusInterfaceProperty, sourceLineNumber, id)
40 {
41 }
42
43 public IntermediateField this[ComPlusInterfacePropertySymbolFields index] => this.Fields[(int)index];
44
45 public string InterfaceRef
46 {
47 get => this.Fields[(int)ComPlusInterfacePropertySymbolFields.InterfaceRef].AsString();
48 set => this.Set((int)ComPlusInterfacePropertySymbolFields.InterfaceRef, value);
49 }
50
51 public string Name
52 {
53 get => this.Fields[(int)ComPlusInterfacePropertySymbolFields.Name].AsString();
54 set => this.Set((int)ComPlusInterfacePropertySymbolFields.Name, value);
55 }
56
57 public string Value
58 {
59 get => this.Fields[(int)ComPlusInterfacePropertySymbolFields.Value].AsString();
60 set => this.Set((int)ComPlusInterfacePropertySymbolFields.Value, value);
61 }
62 }
63} \ No newline at end of file
diff --git a/src/ext/ComPlus/wixext/Symbols/ComPlusInterfaceSymbol.cs b/src/ext/ComPlus/wixext/Symbols/ComPlusInterfaceSymbol.cs
new file mode 100644
index 00000000..f875b424
--- /dev/null
+++ b/src/ext/ComPlus/wixext/Symbols/ComPlusInterfaceSymbol.cs
@@ -0,0 +1,55 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.ComPlus
4{
5 using WixToolset.Data;
6 using WixToolset.ComPlus.Symbols;
7
8 public static partial class ComPlusSymbolDefinitions
9 {
10 public static readonly IntermediateSymbolDefinition ComPlusInterface = new IntermediateSymbolDefinition(
11 ComPlusSymbolDefinitionType.ComPlusInterface.ToString(),
12 new[]
13 {
14 new IntermediateFieldDefinition(nameof(ComPlusInterfaceSymbolFields.ComPlusComponentRef), IntermediateFieldType.String),
15 new IntermediateFieldDefinition(nameof(ComPlusInterfaceSymbolFields.IID), IntermediateFieldType.String),
16 },
17 typeof(ComPlusInterfaceSymbol));
18 }
19}
20
21namespace WixToolset.ComPlus.Symbols
22{
23 using WixToolset.Data;
24
25 public enum ComPlusInterfaceSymbolFields
26 {
27 ComPlusComponentRef,
28 IID,
29 }
30
31 public class ComPlusInterfaceSymbol : IntermediateSymbol
32 {
33 public ComPlusInterfaceSymbol() : base(ComPlusSymbolDefinitions.ComPlusInterface, null, null)
34 {
35 }
36
37 public ComPlusInterfaceSymbol(SourceLineNumber sourceLineNumber, Identifier id = null) : base(ComPlusSymbolDefinitions.ComPlusInterface, sourceLineNumber, id)
38 {
39 }
40
41 public IntermediateField this[ComPlusInterfaceSymbolFields index] => this.Fields[(int)index];
42
43 public string ComPlusComponentRef
44 {
45 get => this.Fields[(int)ComPlusInterfaceSymbolFields.ComPlusComponentRef].AsString();
46 set => this.Set((int)ComPlusInterfaceSymbolFields.ComPlusComponentRef, value);
47 }
48
49 public string IID
50 {
51 get => this.Fields[(int)ComPlusInterfaceSymbolFields.IID].AsString();
52 set => this.Set((int)ComPlusInterfaceSymbolFields.IID, value);
53 }
54 }
55} \ No newline at end of file
diff --git a/src/ext/ComPlus/wixext/Symbols/ComPlusMethodPropertySymbol.cs b/src/ext/ComPlus/wixext/Symbols/ComPlusMethodPropertySymbol.cs
new file mode 100644
index 00000000..65b17ea4
--- /dev/null
+++ b/src/ext/ComPlus/wixext/Symbols/ComPlusMethodPropertySymbol.cs
@@ -0,0 +1,63 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.ComPlus
4{
5 using WixToolset.Data;
6 using WixToolset.ComPlus.Symbols;
7
8 public static partial class ComPlusSymbolDefinitions
9 {
10 public static readonly IntermediateSymbolDefinition ComPlusMethodProperty = new IntermediateSymbolDefinition(
11 ComPlusSymbolDefinitionType.ComPlusMethodProperty.ToString(),
12 new[]
13 {
14 new IntermediateFieldDefinition(nameof(ComPlusMethodPropertySymbolFields.MethodRef), IntermediateFieldType.String),
15 new IntermediateFieldDefinition(nameof(ComPlusMethodPropertySymbolFields.Name), IntermediateFieldType.String),
16 new IntermediateFieldDefinition(nameof(ComPlusMethodPropertySymbolFields.Value), IntermediateFieldType.String),
17 },
18 typeof(ComPlusMethodPropertySymbol));
19 }
20}
21
22namespace WixToolset.ComPlus.Symbols
23{
24 using WixToolset.Data;
25
26 public enum ComPlusMethodPropertySymbolFields
27 {
28 MethodRef,
29 Name,
30 Value,
31 }
32
33 public class ComPlusMethodPropertySymbol : IntermediateSymbol
34 {
35 public ComPlusMethodPropertySymbol() : base(ComPlusSymbolDefinitions.ComPlusMethodProperty, null, null)
36 {
37 }
38
39 public ComPlusMethodPropertySymbol(SourceLineNumber sourceLineNumber, Identifier id = null) : base(ComPlusSymbolDefinitions.ComPlusMethodProperty, sourceLineNumber, id)
40 {
41 }
42
43 public IntermediateField this[ComPlusMethodPropertySymbolFields index] => this.Fields[(int)index];
44
45 public string MethodRef
46 {
47 get => this.Fields[(int)ComPlusMethodPropertySymbolFields.MethodRef].AsString();
48 set => this.Set((int)ComPlusMethodPropertySymbolFields.MethodRef, value);
49 }
50
51 public string Name
52 {
53 get => this.Fields[(int)ComPlusMethodPropertySymbolFields.Name].AsString();
54 set => this.Set((int)ComPlusMethodPropertySymbolFields.Name, value);
55 }
56
57 public string Value
58 {
59 get => this.Fields[(int)ComPlusMethodPropertySymbolFields.Value].AsString();
60 set => this.Set((int)ComPlusMethodPropertySymbolFields.Value, value);
61 }
62 }
63} \ No newline at end of file
diff --git a/src/ext/ComPlus/wixext/Symbols/ComPlusMethodSymbol.cs b/src/ext/ComPlus/wixext/Symbols/ComPlusMethodSymbol.cs
new file mode 100644
index 00000000..9959a56f
--- /dev/null
+++ b/src/ext/ComPlus/wixext/Symbols/ComPlusMethodSymbol.cs
@@ -0,0 +1,63 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.ComPlus
4{
5 using WixToolset.Data;
6 using WixToolset.ComPlus.Symbols;
7
8 public static partial class ComPlusSymbolDefinitions
9 {
10 public static readonly IntermediateSymbolDefinition ComPlusMethod = new IntermediateSymbolDefinition(
11 ComPlusSymbolDefinitionType.ComPlusMethod.ToString(),
12 new[]
13 {
14 new IntermediateFieldDefinition(nameof(ComPlusMethodSymbolFields.InterfaceRef), IntermediateFieldType.String),
15 new IntermediateFieldDefinition(nameof(ComPlusMethodSymbolFields.Index), IntermediateFieldType.Number),
16 new IntermediateFieldDefinition(nameof(ComPlusMethodSymbolFields.Name), IntermediateFieldType.String),
17 },
18 typeof(ComPlusMethodSymbol));
19 }
20}
21
22namespace WixToolset.ComPlus.Symbols
23{
24 using WixToolset.Data;
25
26 public enum ComPlusMethodSymbolFields
27 {
28 InterfaceRef,
29 Index,
30 Name,
31 }
32
33 public class ComPlusMethodSymbol : IntermediateSymbol
34 {
35 public ComPlusMethodSymbol() : base(ComPlusSymbolDefinitions.ComPlusMethod, null, null)
36 {
37 }
38
39 public ComPlusMethodSymbol(SourceLineNumber sourceLineNumber, Identifier id = null) : base(ComPlusSymbolDefinitions.ComPlusMethod, sourceLineNumber, id)
40 {
41 }
42
43 public IntermediateField this[ComPlusMethodSymbolFields index] => this.Fields[(int)index];
44
45 public string InterfaceRef
46 {
47 get => this.Fields[(int)ComPlusMethodSymbolFields.InterfaceRef].AsString();
48 set => this.Set((int)ComPlusMethodSymbolFields.InterfaceRef, value);
49 }
50
51 public int? Index
52 {
53 get => this.Fields[(int)ComPlusMethodSymbolFields.Index].AsNullableNumber();
54 set => this.Set((int)ComPlusMethodSymbolFields.Index, value);
55 }
56
57 public string Name
58 {
59 get => this.Fields[(int)ComPlusMethodSymbolFields.Name].AsString();
60 set => this.Set((int)ComPlusMethodSymbolFields.Name, value);
61 }
62 }
63} \ No newline at end of file
diff --git a/src/ext/ComPlus/wixext/Symbols/ComPlusPartitionPropertySymbol.cs b/src/ext/ComPlus/wixext/Symbols/ComPlusPartitionPropertySymbol.cs
new file mode 100644
index 00000000..e42feae2
--- /dev/null
+++ b/src/ext/ComPlus/wixext/Symbols/ComPlusPartitionPropertySymbol.cs
@@ -0,0 +1,63 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.ComPlus
4{
5 using WixToolset.Data;
6 using WixToolset.ComPlus.Symbols;
7
8 public static partial class ComPlusSymbolDefinitions
9 {
10 public static readonly IntermediateSymbolDefinition ComPlusPartitionProperty = new IntermediateSymbolDefinition(
11 ComPlusSymbolDefinitionType.ComPlusPartitionProperty.ToString(),
12 new[]
13 {
14 new IntermediateFieldDefinition(nameof(ComPlusPartitionPropertySymbolFields.PartitionRef), IntermediateFieldType.String),
15 new IntermediateFieldDefinition(nameof(ComPlusPartitionPropertySymbolFields.Name), IntermediateFieldType.String),
16 new IntermediateFieldDefinition(nameof(ComPlusPartitionPropertySymbolFields.Value), IntermediateFieldType.String),
17 },
18 typeof(ComPlusPartitionPropertySymbol));
19 }
20}
21
22namespace WixToolset.ComPlus.Symbols
23{
24 using WixToolset.Data;
25
26 public enum ComPlusPartitionPropertySymbolFields
27 {
28 PartitionRef,
29 Name,
30 Value,
31 }
32
33 public class ComPlusPartitionPropertySymbol : IntermediateSymbol
34 {
35 public ComPlusPartitionPropertySymbol() : base(ComPlusSymbolDefinitions.ComPlusPartitionProperty, null, null)
36 {
37 }
38
39 public ComPlusPartitionPropertySymbol(SourceLineNumber sourceLineNumber, Identifier id = null) : base(ComPlusSymbolDefinitions.ComPlusPartitionProperty, sourceLineNumber, id)
40 {
41 }
42
43 public IntermediateField this[ComPlusPartitionPropertySymbolFields index] => this.Fields[(int)index];
44
45 public string PartitionRef
46 {
47 get => this.Fields[(int)ComPlusPartitionPropertySymbolFields.PartitionRef].AsString();
48 set => this.Set((int)ComPlusPartitionPropertySymbolFields.PartitionRef, value);
49 }
50
51 public string Name
52 {
53 get => this.Fields[(int)ComPlusPartitionPropertySymbolFields.Name].AsString();
54 set => this.Set((int)ComPlusPartitionPropertySymbolFields.Name, value);
55 }
56
57 public string Value
58 {
59 get => this.Fields[(int)ComPlusPartitionPropertySymbolFields.Value].AsString();
60 set => this.Set((int)ComPlusPartitionPropertySymbolFields.Value, value);
61 }
62 }
63} \ No newline at end of file
diff --git a/src/ext/ComPlus/wixext/Symbols/ComPlusPartitionRoleSymbol.cs b/src/ext/ComPlus/wixext/Symbols/ComPlusPartitionRoleSymbol.cs
new file mode 100644
index 00000000..23293d93
--- /dev/null
+++ b/src/ext/ComPlus/wixext/Symbols/ComPlusPartitionRoleSymbol.cs
@@ -0,0 +1,63 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.ComPlus
4{
5 using WixToolset.Data;
6 using WixToolset.ComPlus.Symbols;
7
8 public static partial class ComPlusSymbolDefinitions
9 {
10 public static readonly IntermediateSymbolDefinition ComPlusPartitionRole = new IntermediateSymbolDefinition(
11 ComPlusSymbolDefinitionType.ComPlusPartitionRole.ToString(),
12 new[]
13 {
14 new IntermediateFieldDefinition(nameof(ComPlusPartitionRoleSymbolFields.PartitionRef), IntermediateFieldType.String),
15 new IntermediateFieldDefinition(nameof(ComPlusPartitionRoleSymbolFields.ComponentRef), IntermediateFieldType.String),
16 new IntermediateFieldDefinition(nameof(ComPlusPartitionRoleSymbolFields.Name), IntermediateFieldType.String),
17 },
18 typeof(ComPlusPartitionRoleSymbol));
19 }
20}
21
22namespace WixToolset.ComPlus.Symbols
23{
24 using WixToolset.Data;
25
26 public enum ComPlusPartitionRoleSymbolFields
27 {
28 PartitionRef,
29 ComponentRef,
30 Name,
31 }
32
33 public class ComPlusPartitionRoleSymbol : IntermediateSymbol
34 {
35 public ComPlusPartitionRoleSymbol() : base(ComPlusSymbolDefinitions.ComPlusPartitionRole, null, null)
36 {
37 }
38
39 public ComPlusPartitionRoleSymbol(SourceLineNumber sourceLineNumber, Identifier id = null) : base(ComPlusSymbolDefinitions.ComPlusPartitionRole, sourceLineNumber, id)
40 {
41 }
42
43 public IntermediateField this[ComPlusPartitionRoleSymbolFields index] => this.Fields[(int)index];
44
45 public string PartitionRef
46 {
47 get => this.Fields[(int)ComPlusPartitionRoleSymbolFields.PartitionRef].AsString();
48 set => this.Set((int)ComPlusPartitionRoleSymbolFields.PartitionRef, value);
49 }
50
51 public string ComponentRef
52 {
53 get => this.Fields[(int)ComPlusPartitionRoleSymbolFields.ComponentRef].AsString();
54 set => this.Set((int)ComPlusPartitionRoleSymbolFields.ComponentRef, value);
55 }
56
57 public string Name
58 {
59 get => this.Fields[(int)ComPlusPartitionRoleSymbolFields.Name].AsString();
60 set => this.Set((int)ComPlusPartitionRoleSymbolFields.Name, value);
61 }
62 }
63} \ No newline at end of file
diff --git a/src/ext/ComPlus/wixext/Symbols/ComPlusPartitionSymbol.cs b/src/ext/ComPlus/wixext/Symbols/ComPlusPartitionSymbol.cs
new file mode 100644
index 00000000..c60fca40
--- /dev/null
+++ b/src/ext/ComPlus/wixext/Symbols/ComPlusPartitionSymbol.cs
@@ -0,0 +1,63 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.ComPlus
4{
5 using WixToolset.Data;
6 using WixToolset.ComPlus.Symbols;
7
8 public static partial class ComPlusSymbolDefinitions
9 {
10 public static readonly IntermediateSymbolDefinition ComPlusPartition = new IntermediateSymbolDefinition(
11 ComPlusSymbolDefinitionType.ComPlusPartition.ToString(),
12 new[]
13 {
14 new IntermediateFieldDefinition(nameof(ComPlusPartitionSymbolFields.ComponentRef), IntermediateFieldType.String),
15 new IntermediateFieldDefinition(nameof(ComPlusPartitionSymbolFields.PartitionId), IntermediateFieldType.String),
16 new IntermediateFieldDefinition(nameof(ComPlusPartitionSymbolFields.Name), IntermediateFieldType.String),
17 },
18 typeof(ComPlusPartitionSymbol));
19 }
20}
21
22namespace WixToolset.ComPlus.Symbols
23{
24 using WixToolset.Data;
25
26 public enum ComPlusPartitionSymbolFields
27 {
28 ComponentRef,
29 PartitionId,
30 Name,
31 }
32
33 public class ComPlusPartitionSymbol : IntermediateSymbol
34 {
35 public ComPlusPartitionSymbol() : base(ComPlusSymbolDefinitions.ComPlusPartition, null, null)
36 {
37 }
38
39 public ComPlusPartitionSymbol(SourceLineNumber sourceLineNumber, Identifier id = null) : base(ComPlusSymbolDefinitions.ComPlusPartition, sourceLineNumber, id)
40 {
41 }
42
43 public IntermediateField this[ComPlusPartitionSymbolFields index] => this.Fields[(int)index];
44
45 public string ComponentRef
46 {
47 get => this.Fields[(int)ComPlusPartitionSymbolFields.ComponentRef].AsString();
48 set => this.Set((int)ComPlusPartitionSymbolFields.ComponentRef, value);
49 }
50
51 public string PartitionId
52 {
53 get => this.Fields[(int)ComPlusPartitionSymbolFields.PartitionId].AsString();
54 set => this.Set((int)ComPlusPartitionSymbolFields.PartitionId, value);
55 }
56
57 public string Name
58 {
59 get => this.Fields[(int)ComPlusPartitionSymbolFields.Name].AsString();
60 set => this.Set((int)ComPlusPartitionSymbolFields.Name, value);
61 }
62 }
63} \ No newline at end of file
diff --git a/src/ext/ComPlus/wixext/Symbols/ComPlusPartitionUserSymbol.cs b/src/ext/ComPlus/wixext/Symbols/ComPlusPartitionUserSymbol.cs
new file mode 100644
index 00000000..c4d52f54
--- /dev/null
+++ b/src/ext/ComPlus/wixext/Symbols/ComPlusPartitionUserSymbol.cs
@@ -0,0 +1,63 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.ComPlus
4{
5 using WixToolset.Data;
6 using WixToolset.ComPlus.Symbols;
7
8 public static partial class ComPlusSymbolDefinitions
9 {
10 public static readonly IntermediateSymbolDefinition ComPlusPartitionUser = new IntermediateSymbolDefinition(
11 ComPlusSymbolDefinitionType.ComPlusPartitionUser.ToString(),
12 new[]
13 {
14 new IntermediateFieldDefinition(nameof(ComPlusPartitionUserSymbolFields.PartitionRef), IntermediateFieldType.String),
15 new IntermediateFieldDefinition(nameof(ComPlusPartitionUserSymbolFields.ComponentRef), IntermediateFieldType.String),
16 new IntermediateFieldDefinition(nameof(ComPlusPartitionUserSymbolFields.UserRef), IntermediateFieldType.String),
17 },
18 typeof(ComPlusPartitionUserSymbol));
19 }
20}
21
22namespace WixToolset.ComPlus.Symbols
23{
24 using WixToolset.Data;
25
26 public enum ComPlusPartitionUserSymbolFields
27 {
28 PartitionRef,
29 ComponentRef,
30 UserRef,
31 }
32
33 public class ComPlusPartitionUserSymbol : IntermediateSymbol
34 {
35 public ComPlusPartitionUserSymbol() : base(ComPlusSymbolDefinitions.ComPlusPartitionUser, null, null)
36 {
37 }
38
39 public ComPlusPartitionUserSymbol(SourceLineNumber sourceLineNumber, Identifier id = null) : base(ComPlusSymbolDefinitions.ComPlusPartitionUser, sourceLineNumber, id)
40 {
41 }
42
43 public IntermediateField this[ComPlusPartitionUserSymbolFields index] => this.Fields[(int)index];
44
45 public string PartitionRef
46 {
47 get => this.Fields[(int)ComPlusPartitionUserSymbolFields.PartitionRef].AsString();
48 set => this.Set((int)ComPlusPartitionUserSymbolFields.PartitionRef, value);
49 }
50
51 public string ComponentRef
52 {
53 get => this.Fields[(int)ComPlusPartitionUserSymbolFields.ComponentRef].AsString();
54 set => this.Set((int)ComPlusPartitionUserSymbolFields.ComponentRef, value);
55 }
56
57 public string UserRef
58 {
59 get => this.Fields[(int)ComPlusPartitionUserSymbolFields.UserRef].AsString();
60 set => this.Set((int)ComPlusPartitionUserSymbolFields.UserRef, value);
61 }
62 }
63} \ No newline at end of file
diff --git a/src/ext/ComPlus/wixext/Symbols/ComPlusRoleForComponentSymbol.cs b/src/ext/ComPlus/wixext/Symbols/ComPlusRoleForComponentSymbol.cs
new file mode 100644
index 00000000..2d9968ee
--- /dev/null
+++ b/src/ext/ComPlus/wixext/Symbols/ComPlusRoleForComponentSymbol.cs
@@ -0,0 +1,63 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.ComPlus
4{
5 using WixToolset.Data;
6 using WixToolset.ComPlus.Symbols;
7
8 public static partial class ComPlusSymbolDefinitions
9 {
10 public static readonly IntermediateSymbolDefinition ComPlusRoleForComponent = new IntermediateSymbolDefinition(
11 ComPlusSymbolDefinitionType.ComPlusRoleForComponent.ToString(),
12 new[]
13 {
14 new IntermediateFieldDefinition(nameof(ComPlusRoleForComponentSymbolFields.ComPlusComponentRef), IntermediateFieldType.String),
15 new IntermediateFieldDefinition(nameof(ComPlusRoleForComponentSymbolFields.ApplicationRoleRef), IntermediateFieldType.String),
16 new IntermediateFieldDefinition(nameof(ComPlusRoleForComponentSymbolFields.ComponentRef), IntermediateFieldType.String),
17 },
18 typeof(ComPlusRoleForComponentSymbol));
19 }
20}
21
22namespace WixToolset.ComPlus.Symbols
23{
24 using WixToolset.Data;
25
26 public enum ComPlusRoleForComponentSymbolFields
27 {
28 ComPlusComponentRef,
29 ApplicationRoleRef,
30 ComponentRef,
31 }
32
33 public class ComPlusRoleForComponentSymbol : IntermediateSymbol
34 {
35 public ComPlusRoleForComponentSymbol() : base(ComPlusSymbolDefinitions.ComPlusRoleForComponent, null, null)
36 {
37 }
38
39 public ComPlusRoleForComponentSymbol(SourceLineNumber sourceLineNumber, Identifier id = null) : base(ComPlusSymbolDefinitions.ComPlusRoleForComponent, sourceLineNumber, id)
40 {
41 }
42
43 public IntermediateField this[ComPlusRoleForComponentSymbolFields index] => this.Fields[(int)index];
44
45 public string ComPlusComponentRef
46 {
47 get => this.Fields[(int)ComPlusRoleForComponentSymbolFields.ComPlusComponentRef].AsString();
48 set => this.Set((int)ComPlusRoleForComponentSymbolFields.ComPlusComponentRef, value);
49 }
50
51 public string ApplicationRoleRef
52 {
53 get => this.Fields[(int)ComPlusRoleForComponentSymbolFields.ApplicationRoleRef].AsString();
54 set => this.Set((int)ComPlusRoleForComponentSymbolFields.ApplicationRoleRef, value);
55 }
56
57 public string ComponentRef
58 {
59 get => this.Fields[(int)ComPlusRoleForComponentSymbolFields.ComponentRef].AsString();
60 set => this.Set((int)ComPlusRoleForComponentSymbolFields.ComponentRef, value);
61 }
62 }
63} \ No newline at end of file
diff --git a/src/ext/ComPlus/wixext/Symbols/ComPlusRoleForInterfaceSymbol.cs b/src/ext/ComPlus/wixext/Symbols/ComPlusRoleForInterfaceSymbol.cs
new file mode 100644
index 00000000..b77bd215
--- /dev/null
+++ b/src/ext/ComPlus/wixext/Symbols/ComPlusRoleForInterfaceSymbol.cs
@@ -0,0 +1,63 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.ComPlus
4{
5 using WixToolset.Data;
6 using WixToolset.ComPlus.Symbols;
7
8 public static partial class ComPlusSymbolDefinitions
9 {
10 public static readonly IntermediateSymbolDefinition ComPlusRoleForInterface = new IntermediateSymbolDefinition(
11 ComPlusSymbolDefinitionType.ComPlusRoleForInterface.ToString(),
12 new[]
13 {
14 new IntermediateFieldDefinition(nameof(ComPlusRoleForInterfaceSymbolFields.InterfaceRef), IntermediateFieldType.String),
15 new IntermediateFieldDefinition(nameof(ComPlusRoleForInterfaceSymbolFields.ApplicationRoleRef), IntermediateFieldType.String),
16 new IntermediateFieldDefinition(nameof(ComPlusRoleForInterfaceSymbolFields.ComponentRef), IntermediateFieldType.String),
17 },
18 typeof(ComPlusRoleForInterfaceSymbol));
19 }
20}
21
22namespace WixToolset.ComPlus.Symbols
23{
24 using WixToolset.Data;
25
26 public enum ComPlusRoleForInterfaceSymbolFields
27 {
28 InterfaceRef,
29 ApplicationRoleRef,
30 ComponentRef,
31 }
32
33 public class ComPlusRoleForInterfaceSymbol : IntermediateSymbol
34 {
35 public ComPlusRoleForInterfaceSymbol() : base(ComPlusSymbolDefinitions.ComPlusRoleForInterface, null, null)
36 {
37 }
38
39 public ComPlusRoleForInterfaceSymbol(SourceLineNumber sourceLineNumber, Identifier id = null) : base(ComPlusSymbolDefinitions.ComPlusRoleForInterface, sourceLineNumber, id)
40 {
41 }
42
43 public IntermediateField this[ComPlusRoleForInterfaceSymbolFields index] => this.Fields[(int)index];
44
45 public string InterfaceRef
46 {
47 get => this.Fields[(int)ComPlusRoleForInterfaceSymbolFields.InterfaceRef].AsString();
48 set => this.Set((int)ComPlusRoleForInterfaceSymbolFields.InterfaceRef, value);
49 }
50
51 public string ApplicationRoleRef
52 {
53 get => this.Fields[(int)ComPlusRoleForInterfaceSymbolFields.ApplicationRoleRef].AsString();
54 set => this.Set((int)ComPlusRoleForInterfaceSymbolFields.ApplicationRoleRef, value);
55 }
56
57 public string ComponentRef
58 {
59 get => this.Fields[(int)ComPlusRoleForInterfaceSymbolFields.ComponentRef].AsString();
60 set => this.Set((int)ComPlusRoleForInterfaceSymbolFields.ComponentRef, value);
61 }
62 }
63} \ No newline at end of file
diff --git a/src/ext/ComPlus/wixext/Symbols/ComPlusRoleForMethodSymbol.cs b/src/ext/ComPlus/wixext/Symbols/ComPlusRoleForMethodSymbol.cs
new file mode 100644
index 00000000..9ba9d03b
--- /dev/null
+++ b/src/ext/ComPlus/wixext/Symbols/ComPlusRoleForMethodSymbol.cs
@@ -0,0 +1,63 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.ComPlus
4{
5 using WixToolset.Data;
6 using WixToolset.ComPlus.Symbols;
7
8 public static partial class ComPlusSymbolDefinitions
9 {
10 public static readonly IntermediateSymbolDefinition ComPlusRoleForMethod = new IntermediateSymbolDefinition(
11 ComPlusSymbolDefinitionType.ComPlusRoleForMethod.ToString(),
12 new[]
13 {
14 new IntermediateFieldDefinition(nameof(ComPlusRoleForMethodSymbolFields.MethodRef), IntermediateFieldType.String),
15 new IntermediateFieldDefinition(nameof(ComPlusRoleForMethodSymbolFields.ApplicationRoleRef), IntermediateFieldType.String),
16 new IntermediateFieldDefinition(nameof(ComPlusRoleForMethodSymbolFields.ComponentRef), IntermediateFieldType.String),
17 },
18 typeof(ComPlusRoleForMethodSymbol));
19 }
20}
21
22namespace WixToolset.ComPlus.Symbols
23{
24 using WixToolset.Data;
25
26 public enum ComPlusRoleForMethodSymbolFields
27 {
28 MethodRef,
29 ApplicationRoleRef,
30 ComponentRef,
31 }
32
33 public class ComPlusRoleForMethodSymbol : IntermediateSymbol
34 {
35 public ComPlusRoleForMethodSymbol() : base(ComPlusSymbolDefinitions.ComPlusRoleForMethod, null, null)
36 {
37 }
38
39 public ComPlusRoleForMethodSymbol(SourceLineNumber sourceLineNumber, Identifier id = null) : base(ComPlusSymbolDefinitions.ComPlusRoleForMethod, sourceLineNumber, id)
40 {
41 }
42
43 public IntermediateField this[ComPlusRoleForMethodSymbolFields index] => this.Fields[(int)index];
44
45 public string MethodRef
46 {
47 get => this.Fields[(int)ComPlusRoleForMethodSymbolFields.MethodRef].AsString();
48 set => this.Set((int)ComPlusRoleForMethodSymbolFields.MethodRef, value);
49 }
50
51 public string ApplicationRoleRef
52 {
53 get => this.Fields[(int)ComPlusRoleForMethodSymbolFields.ApplicationRoleRef].AsString();
54 set => this.Set((int)ComPlusRoleForMethodSymbolFields.ApplicationRoleRef, value);
55 }
56
57 public string ComponentRef
58 {
59 get => this.Fields[(int)ComPlusRoleForMethodSymbolFields.ComponentRef].AsString();
60 set => this.Set((int)ComPlusRoleForMethodSymbolFields.ComponentRef, value);
61 }
62 }
63} \ No newline at end of file
diff --git a/src/ext/ComPlus/wixext/Symbols/ComPlusSubscriptionPropertySymbol.cs b/src/ext/ComPlus/wixext/Symbols/ComPlusSubscriptionPropertySymbol.cs
new file mode 100644
index 00000000..af995c3d
--- /dev/null
+++ b/src/ext/ComPlus/wixext/Symbols/ComPlusSubscriptionPropertySymbol.cs
@@ -0,0 +1,63 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.ComPlus
4{
5 using WixToolset.Data;
6 using WixToolset.ComPlus.Symbols;
7
8 public static partial class ComPlusSymbolDefinitions
9 {
10 public static readonly IntermediateSymbolDefinition ComPlusSubscriptionProperty = new IntermediateSymbolDefinition(
11 ComPlusSymbolDefinitionType.ComPlusSubscriptionProperty.ToString(),
12 new[]
13 {
14 new IntermediateFieldDefinition(nameof(ComPlusSubscriptionPropertySymbolFields.SubscriptionRef), IntermediateFieldType.String),
15 new IntermediateFieldDefinition(nameof(ComPlusSubscriptionPropertySymbolFields.Name), IntermediateFieldType.String),
16 new IntermediateFieldDefinition(nameof(ComPlusSubscriptionPropertySymbolFields.Value), IntermediateFieldType.String),
17 },
18 typeof(ComPlusSubscriptionPropertySymbol));
19 }
20}
21
22namespace WixToolset.ComPlus.Symbols
23{
24 using WixToolset.Data;
25
26 public enum ComPlusSubscriptionPropertySymbolFields
27 {
28 SubscriptionRef,
29 Name,
30 Value,
31 }
32
33 public class ComPlusSubscriptionPropertySymbol : IntermediateSymbol
34 {
35 public ComPlusSubscriptionPropertySymbol() : base(ComPlusSymbolDefinitions.ComPlusSubscriptionProperty, null, null)
36 {
37 }
38
39 public ComPlusSubscriptionPropertySymbol(SourceLineNumber sourceLineNumber, Identifier id = null) : base(ComPlusSymbolDefinitions.ComPlusSubscriptionProperty, sourceLineNumber, id)
40 {
41 }
42
43 public IntermediateField this[ComPlusSubscriptionPropertySymbolFields index] => this.Fields[(int)index];
44
45 public string SubscriptionRef
46 {
47 get => this.Fields[(int)ComPlusSubscriptionPropertySymbolFields.SubscriptionRef].AsString();
48 set => this.Set((int)ComPlusSubscriptionPropertySymbolFields.SubscriptionRef, value);
49 }
50
51 public string Name
52 {
53 get => this.Fields[(int)ComPlusSubscriptionPropertySymbolFields.Name].AsString();
54 set => this.Set((int)ComPlusSubscriptionPropertySymbolFields.Name, value);
55 }
56
57 public string Value
58 {
59 get => this.Fields[(int)ComPlusSubscriptionPropertySymbolFields.Value].AsString();
60 set => this.Set((int)ComPlusSubscriptionPropertySymbolFields.Value, value);
61 }
62 }
63} \ No newline at end of file
diff --git a/src/ext/ComPlus/wixext/Symbols/ComPlusSubscriptionSymbol.cs b/src/ext/ComPlus/wixext/Symbols/ComPlusSubscriptionSymbol.cs
new file mode 100644
index 00000000..24d3f92e
--- /dev/null
+++ b/src/ext/ComPlus/wixext/Symbols/ComPlusSubscriptionSymbol.cs
@@ -0,0 +1,95 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.ComPlus
4{
5 using WixToolset.Data;
6 using WixToolset.ComPlus.Symbols;
7
8 public static partial class ComPlusSymbolDefinitions
9 {
10 public static readonly IntermediateSymbolDefinition ComPlusSubscription = new IntermediateSymbolDefinition(
11 ComPlusSymbolDefinitionType.ComPlusSubscription.ToString(),
12 new[]
13 {
14 new IntermediateFieldDefinition(nameof(ComPlusSubscriptionSymbolFields.Subscription), IntermediateFieldType.String),
15 new IntermediateFieldDefinition(nameof(ComPlusSubscriptionSymbolFields.ComPlusComponentRef), IntermediateFieldType.String),
16 new IntermediateFieldDefinition(nameof(ComPlusSubscriptionSymbolFields.ComponentRef), IntermediateFieldType.String),
17 new IntermediateFieldDefinition(nameof(ComPlusSubscriptionSymbolFields.SubscriptionId), IntermediateFieldType.String),
18 new IntermediateFieldDefinition(nameof(ComPlusSubscriptionSymbolFields.Name), IntermediateFieldType.String),
19 new IntermediateFieldDefinition(nameof(ComPlusSubscriptionSymbolFields.EventCLSID), IntermediateFieldType.String),
20 new IntermediateFieldDefinition(nameof(ComPlusSubscriptionSymbolFields.PublisherID), IntermediateFieldType.String),
21 },
22 typeof(ComPlusSubscriptionSymbol));
23 }
24}
25
26namespace WixToolset.ComPlus.Symbols
27{
28 using WixToolset.Data;
29
30 public enum ComPlusSubscriptionSymbolFields
31 {
32 Subscription,
33 ComPlusComponentRef,
34 ComponentRef,
35 SubscriptionId,
36 Name,
37 EventCLSID,
38 PublisherID,
39 }
40
41 public class ComPlusSubscriptionSymbol : IntermediateSymbol
42 {
43 public ComPlusSubscriptionSymbol() : base(ComPlusSymbolDefinitions.ComPlusSubscription, null, null)
44 {
45 }
46
47 public ComPlusSubscriptionSymbol(SourceLineNumber sourceLineNumber, Identifier id = null) : base(ComPlusSymbolDefinitions.ComPlusSubscription, sourceLineNumber, id)
48 {
49 }
50
51 public IntermediateField this[ComPlusSubscriptionSymbolFields index] => this.Fields[(int)index];
52
53 public string Subscription
54 {
55 get => this.Fields[(int)ComPlusSubscriptionSymbolFields.Subscription].AsString();
56 set => this.Set((int)ComPlusSubscriptionSymbolFields.Subscription, value);
57 }
58
59 public string ComPlusComponentRef
60 {
61 get => this.Fields[(int)ComPlusSubscriptionSymbolFields.ComPlusComponentRef].AsString();
62 set => this.Set((int)ComPlusSubscriptionSymbolFields.ComPlusComponentRef, value);
63 }
64
65 public string ComponentRef
66 {
67 get => this.Fields[(int)ComPlusSubscriptionSymbolFields.ComponentRef].AsString();
68 set => this.Set((int)ComPlusSubscriptionSymbolFields.ComponentRef, value);
69 }
70
71 public string SubscriptionId
72 {
73 get => this.Fields[(int)ComPlusSubscriptionSymbolFields.SubscriptionId].AsString();
74 set => this.Set((int)ComPlusSubscriptionSymbolFields.SubscriptionId, value);
75 }
76
77 public string Name
78 {
79 get => this.Fields[(int)ComPlusSubscriptionSymbolFields.Name].AsString();
80 set => this.Set((int)ComPlusSubscriptionSymbolFields.Name, value);
81 }
82
83 public string EventCLSID
84 {
85 get => this.Fields[(int)ComPlusSubscriptionSymbolFields.EventCLSID].AsString();
86 set => this.Set((int)ComPlusSubscriptionSymbolFields.EventCLSID, value);
87 }
88
89 public string PublisherID
90 {
91 get => this.Fields[(int)ComPlusSubscriptionSymbolFields.PublisherID].AsString();
92 set => this.Set((int)ComPlusSubscriptionSymbolFields.PublisherID, value);
93 }
94 }
95} \ No newline at end of file
diff --git a/src/ext/ComPlus/wixext/Symbols/ComPlusSymbolDefinitions.cs b/src/ext/ComPlus/wixext/Symbols/ComPlusSymbolDefinitions.cs
new file mode 100644
index 00000000..407b9c14
--- /dev/null
+++ b/src/ext/ComPlus/wixext/Symbols/ComPlusSymbolDefinitions.cs
@@ -0,0 +1,135 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.ComPlus
4{
5 using System;
6 using WixToolset.Data;
7
8 public enum ComPlusSymbolDefinitionType
9 {
10 ComPlusApplication,
11 ComPlusApplicationProperty,
12 ComPlusApplicationRole,
13 ComPlusApplicationRoleProperty,
14 ComPlusAssembly,
15 ComPlusAssemblyDependency,
16 ComPlusComponent,
17 ComPlusComponentProperty,
18 ComPlusGroupInApplicationRole,
19 ComPlusGroupInPartitionRole,
20 ComPlusInterface,
21 ComPlusInterfaceProperty,
22 ComPlusMethod,
23 ComPlusMethodProperty,
24 ComPlusPartition,
25 ComPlusPartitionProperty,
26 ComPlusPartitionRole,
27 ComPlusPartitionUser,
28 ComPlusRoleForComponent,
29 ComPlusRoleForInterface,
30 ComPlusRoleForMethod,
31 ComPlusSubscription,
32 ComPlusSubscriptionProperty,
33 ComPlusUserInApplicationRole,
34 ComPlusUserInPartitionRole,
35 }
36
37 public static partial class ComPlusSymbolDefinitions
38 {
39 public static readonly Version Version = new Version("4.0.0");
40
41 public static IntermediateSymbolDefinition ByName(string name)
42 {
43 if (!Enum.TryParse(name, out ComPlusSymbolDefinitionType type))
44 {
45 return null;
46 }
47
48 return ByType(type);
49 }
50
51 public static IntermediateSymbolDefinition ByType(ComPlusSymbolDefinitionType type)
52 {
53 switch (type)
54 {
55 case ComPlusSymbolDefinitionType.ComPlusApplication:
56 return ComPlusSymbolDefinitions.ComPlusApplication;
57
58 case ComPlusSymbolDefinitionType.ComPlusApplicationProperty:
59 return ComPlusSymbolDefinitions.ComPlusApplicationProperty;
60
61 case ComPlusSymbolDefinitionType.ComPlusApplicationRole:
62 return ComPlusSymbolDefinitions.ComPlusApplicationRole;
63
64 case ComPlusSymbolDefinitionType.ComPlusApplicationRoleProperty:
65 return ComPlusSymbolDefinitions.ComPlusApplicationRoleProperty;
66
67 case ComPlusSymbolDefinitionType.ComPlusAssembly:
68 return ComPlusSymbolDefinitions.ComPlusAssembly;
69
70 case ComPlusSymbolDefinitionType.ComPlusAssemblyDependency:
71 return ComPlusSymbolDefinitions.ComPlusAssemblyDependency;
72
73 case ComPlusSymbolDefinitionType.ComPlusComponent:
74 return ComPlusSymbolDefinitions.ComPlusComponent;
75
76 case ComPlusSymbolDefinitionType.ComPlusComponentProperty:
77 return ComPlusSymbolDefinitions.ComPlusComponentProperty;
78
79 case ComPlusSymbolDefinitionType.ComPlusGroupInApplicationRole:
80 return ComPlusSymbolDefinitions.ComPlusGroupInApplicationRole;
81
82 case ComPlusSymbolDefinitionType.ComPlusGroupInPartitionRole:
83 return ComPlusSymbolDefinitions.ComPlusGroupInPartitionRole;
84
85 case ComPlusSymbolDefinitionType.ComPlusInterface:
86 return ComPlusSymbolDefinitions.ComPlusInterface;
87
88 case ComPlusSymbolDefinitionType.ComPlusInterfaceProperty:
89 return ComPlusSymbolDefinitions.ComPlusInterfaceProperty;
90
91 case ComPlusSymbolDefinitionType.ComPlusMethod:
92 return ComPlusSymbolDefinitions.ComPlusMethod;
93
94 case ComPlusSymbolDefinitionType.ComPlusMethodProperty:
95 return ComPlusSymbolDefinitions.ComPlusMethodProperty;
96
97 case ComPlusSymbolDefinitionType.ComPlusPartition:
98 return ComPlusSymbolDefinitions.ComPlusPartition;
99
100 case ComPlusSymbolDefinitionType.ComPlusPartitionProperty:
101 return ComPlusSymbolDefinitions.ComPlusPartitionProperty;
102
103 case ComPlusSymbolDefinitionType.ComPlusPartitionRole:
104 return ComPlusSymbolDefinitions.ComPlusPartitionRole;
105
106 case ComPlusSymbolDefinitionType.ComPlusPartitionUser:
107 return ComPlusSymbolDefinitions.ComPlusPartitionUser;
108
109 case ComPlusSymbolDefinitionType.ComPlusRoleForComponent:
110 return ComPlusSymbolDefinitions.ComPlusRoleForComponent;
111
112 case ComPlusSymbolDefinitionType.ComPlusRoleForInterface:
113 return ComPlusSymbolDefinitions.ComPlusRoleForInterface;
114
115 case ComPlusSymbolDefinitionType.ComPlusRoleForMethod:
116 return ComPlusSymbolDefinitions.ComPlusRoleForMethod;
117
118 case ComPlusSymbolDefinitionType.ComPlusSubscription:
119 return ComPlusSymbolDefinitions.ComPlusSubscription;
120
121 case ComPlusSymbolDefinitionType.ComPlusSubscriptionProperty:
122 return ComPlusSymbolDefinitions.ComPlusSubscriptionProperty;
123
124 case ComPlusSymbolDefinitionType.ComPlusUserInApplicationRole:
125 return ComPlusSymbolDefinitions.ComPlusUserInApplicationRole;
126
127 case ComPlusSymbolDefinitionType.ComPlusUserInPartitionRole:
128 return ComPlusSymbolDefinitions.ComPlusUserInPartitionRole;
129
130 default:
131 throw new ArgumentOutOfRangeException(nameof(type));
132 }
133 }
134 }
135}
diff --git a/src/ext/ComPlus/wixext/Symbols/ComPlusUserInApplicationRoleSymbol.cs b/src/ext/ComPlus/wixext/Symbols/ComPlusUserInApplicationRoleSymbol.cs
new file mode 100644
index 00000000..1f2e01b2
--- /dev/null
+++ b/src/ext/ComPlus/wixext/Symbols/ComPlusUserInApplicationRoleSymbol.cs
@@ -0,0 +1,63 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.ComPlus
4{
5 using WixToolset.Data;
6 using WixToolset.ComPlus.Symbols;
7
8 public static partial class ComPlusSymbolDefinitions
9 {
10 public static readonly IntermediateSymbolDefinition ComPlusUserInApplicationRole = new IntermediateSymbolDefinition(
11 ComPlusSymbolDefinitionType.ComPlusUserInApplicationRole.ToString(),
12 new[]
13 {
14 new IntermediateFieldDefinition(nameof(ComPlusUserInApplicationRoleSymbolFields.ApplicationRoleRef), IntermediateFieldType.String),
15 new IntermediateFieldDefinition(nameof(ComPlusUserInApplicationRoleSymbolFields.ComponentRef), IntermediateFieldType.String),
16 new IntermediateFieldDefinition(nameof(ComPlusUserInApplicationRoleSymbolFields.UserRef), IntermediateFieldType.String),
17 },
18 typeof(ComPlusUserInApplicationRoleSymbol));
19 }
20}
21
22namespace WixToolset.ComPlus.Symbols
23{
24 using WixToolset.Data;
25
26 public enum ComPlusUserInApplicationRoleSymbolFields
27 {
28 ApplicationRoleRef,
29 ComponentRef,
30 UserRef,
31 }
32
33 public class ComPlusUserInApplicationRoleSymbol : IntermediateSymbol
34 {
35 public ComPlusUserInApplicationRoleSymbol() : base(ComPlusSymbolDefinitions.ComPlusUserInApplicationRole, null, null)
36 {
37 }
38
39 public ComPlusUserInApplicationRoleSymbol(SourceLineNumber sourceLineNumber, Identifier id = null) : base(ComPlusSymbolDefinitions.ComPlusUserInApplicationRole, sourceLineNumber, id)
40 {
41 }
42
43 public IntermediateField this[ComPlusUserInApplicationRoleSymbolFields index] => this.Fields[(int)index];
44
45 public string ApplicationRoleRef
46 {
47 get => this.Fields[(int)ComPlusUserInApplicationRoleSymbolFields.ApplicationRoleRef].AsString();
48 set => this.Set((int)ComPlusUserInApplicationRoleSymbolFields.ApplicationRoleRef, value);
49 }
50
51 public string ComponentRef
52 {
53 get => this.Fields[(int)ComPlusUserInApplicationRoleSymbolFields.ComponentRef].AsString();
54 set => this.Set((int)ComPlusUserInApplicationRoleSymbolFields.ComponentRef, value);
55 }
56
57 public string UserRef
58 {
59 get => this.Fields[(int)ComPlusUserInApplicationRoleSymbolFields.UserRef].AsString();
60 set => this.Set((int)ComPlusUserInApplicationRoleSymbolFields.UserRef, value);
61 }
62 }
63} \ No newline at end of file
diff --git a/src/ext/ComPlus/wixext/Symbols/ComPlusUserInPartitionRoleSymbol.cs b/src/ext/ComPlus/wixext/Symbols/ComPlusUserInPartitionRoleSymbol.cs
new file mode 100644
index 00000000..10df94bf
--- /dev/null
+++ b/src/ext/ComPlus/wixext/Symbols/ComPlusUserInPartitionRoleSymbol.cs
@@ -0,0 +1,63 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.ComPlus
4{
5 using WixToolset.Data;
6 using WixToolset.ComPlus.Symbols;
7
8 public static partial class ComPlusSymbolDefinitions
9 {
10 public static readonly IntermediateSymbolDefinition ComPlusUserInPartitionRole = new IntermediateSymbolDefinition(
11 ComPlusSymbolDefinitionType.ComPlusUserInPartitionRole.ToString(),
12 new[]
13 {
14 new IntermediateFieldDefinition(nameof(ComPlusUserInPartitionRoleSymbolFields.PartitionRoleRef), IntermediateFieldType.String),
15 new IntermediateFieldDefinition(nameof(ComPlusUserInPartitionRoleSymbolFields.ComponentRef), IntermediateFieldType.String),
16 new IntermediateFieldDefinition(nameof(ComPlusUserInPartitionRoleSymbolFields.UserRef), IntermediateFieldType.String),
17 },
18 typeof(ComPlusUserInPartitionRoleSymbol));
19 }
20}
21
22namespace WixToolset.ComPlus.Symbols
23{
24 using WixToolset.Data;
25
26 public enum ComPlusUserInPartitionRoleSymbolFields
27 {
28 PartitionRoleRef,
29 ComponentRef,
30 UserRef,
31 }
32
33 public class ComPlusUserInPartitionRoleSymbol : IntermediateSymbol
34 {
35 public ComPlusUserInPartitionRoleSymbol() : base(ComPlusSymbolDefinitions.ComPlusUserInPartitionRole, null, null)
36 {
37 }
38
39 public ComPlusUserInPartitionRoleSymbol(SourceLineNumber sourceLineNumber, Identifier id = null) : base(ComPlusSymbolDefinitions.ComPlusUserInPartitionRole, sourceLineNumber, id)
40 {
41 }
42
43 public IntermediateField this[ComPlusUserInPartitionRoleSymbolFields index] => this.Fields[(int)index];
44
45 public string PartitionRoleRef
46 {
47 get => this.Fields[(int)ComPlusUserInPartitionRoleSymbolFields.PartitionRoleRef].AsString();
48 set => this.Set((int)ComPlusUserInPartitionRoleSymbolFields.PartitionRoleRef, value);
49 }
50
51 public string ComponentRef
52 {
53 get => this.Fields[(int)ComPlusUserInPartitionRoleSymbolFields.ComponentRef].AsString();
54 set => this.Set((int)ComPlusUserInPartitionRoleSymbolFields.ComponentRef, value);
55 }
56
57 public string UserRef
58 {
59 get => this.Fields[(int)ComPlusUserInPartitionRoleSymbolFields.UserRef].AsString();
60 set => this.Set((int)ComPlusUserInPartitionRoleSymbolFields.UserRef, value);
61 }
62 }
63} \ No newline at end of file
diff --git a/src/ext/ComPlus/wixext/WixToolset.ComPlus.wixext.csproj b/src/ext/ComPlus/wixext/WixToolset.ComPlus.wixext.csproj
new file mode 100644
index 00000000..11271ad3
--- /dev/null
+++ b/src/ext/ComPlus/wixext/WixToolset.ComPlus.wixext.csproj
@@ -0,0 +1,32 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3
4<Project Sdk="Microsoft.NET.Sdk">
5 <PropertyGroup>
6 <TargetFramework>netstandard2.0</TargetFramework>
7 <DebugType>embedded</DebugType>
8 <RootNamespace>WixToolset.ComPlus</RootNamespace>
9 <Description>WiX Toolset ComPlus Extension</Description>
10 <Title>WiX Toolset ComPlus Extension</Title>
11 <IsTool>true</IsTool>
12 <IncludeSymbols>true</IncludeSymbols>
13 </PropertyGroup>
14
15 <ItemGroup>
16 <EmbeddedResource Include="$(OutputPath)..\complus.wixlib" />
17 </ItemGroup>
18
19 <ItemGroup>
20 <ProjectReference Include="..\wixlib\complus.wixproj" ReferenceOutputAssembly="false" Condition=" '$(NCrunch)'=='' " />
21 </ItemGroup>
22
23 <ItemGroup>
24 <PackageReference Include="WixToolset.Data" Version="4.0.*" PrivateAssets="all" />
25 <PackageReference Include="WixToolset.Extensibility" Version="4.0.*" PrivateAssets="all" />
26 </ItemGroup>
27
28 <ItemGroup>
29 <PackageReference Include="Microsoft.SourceLink.GitHub" Version="1.0.0" PrivateAssets="all" />
30 <PackageReference Include="Nerdbank.GitVersioning" Version="3.3.37" PrivateAssets="all" />
31 </ItemGroup>
32</Project>
diff --git a/src/ext/ComPlus/wixext/WixToolset.ComPlus.wixext.nuspec b/src/ext/ComPlus/wixext/WixToolset.ComPlus.wixext.nuspec
new file mode 100644
index 00000000..3197250b
--- /dev/null
+++ b/src/ext/ComPlus/wixext/WixToolset.ComPlus.wixext.nuspec
@@ -0,0 +1,24 @@
1<?xml version="1.0"?>
2<package xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd">
3 <metadata minClientVersion="4.0">
4 <id>$id$</id>
5 <version>$version$</version>
6 <title>$title$</title>
7 <description>$description$</description>
8 <authors>$authors$</authors>
9 <license type="expression">MS-RL</license>
10 <requireLicenseAcceptance>false</requireLicenseAcceptance>
11 <copyright>$copyright$</copyright>
12 <projectUrl>$projectUrl$</projectUrl>
13 <repository type="$repositorytype$" url="$repositoryurl$" commit="$repositorycommit$" />
14 </metadata>
15
16 <files>
17 <file src="$projectFolder$$id$.targets" target="build" />
18
19 <file src="netstandard2.0\$id$.dll" target="tools" />
20
21 <file src="x86\*.pdb" target="pdbs\x86" />
22 <file src="x64\*.pdb" target="pdbs\x64" />
23 </files>
24</package>
diff --git a/src/ext/ComPlus/wixext/WixToolset.ComPlus.wixext.targets b/src/ext/ComPlus/wixext/WixToolset.ComPlus.wixext.targets
new file mode 100644
index 00000000..8115b715
--- /dev/null
+++ b/src/ext/ComPlus/wixext/WixToolset.ComPlus.wixext.targets
@@ -0,0 +1,11 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3
4<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0">
5 <PropertyGroup>
6 <WixToolsetComPlusWixextPath Condition=" '$(WixToolsetComPlusWixextPath)' == '' ">$(MSBuildThisFileDirectory)..\tools\WixToolset.ComPlus.wixext.dll</WixToolsetComPlusWixextPath>
7 </PropertyGroup>
8 <ItemGroup>
9 <WixExtension Include="$(WixToolsetComPlusWixextPath)" />
10 </ItemGroup>
11</Project>
diff --git a/src/ext/ComPlus/wixlib/ComPlusExtension.wxs b/src/ext/ComPlus/wixlib/ComPlusExtension.wxs
new file mode 100644
index 00000000..fe74eeae
--- /dev/null
+++ b/src/ext/ComPlus/wixlib/ComPlusExtension.wxs
@@ -0,0 +1,135 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2
3<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
4 <?include caerr.wxi ?>
5
6 <Fragment>
7 <UI Id="ComPlusUI">
8 <Error Id="$(var.msierrComPlusCannotConnect)" Message="!(loc.msierrComPlusCannotConnect)" />
9 <Error Id="$(var.msierrComPlusPartitionReadFailed)" Message="!(loc.msierrComPlusPartitionReadFailed)" />
10 <Error Id="$(var.msierrComPlusPartitionRoleReadFailed)" Message="!(loc.msierrComPlusPartitionRoleReadFailed)" />
11 <Error Id="$(var.msierrComPlusUserInPartitionRoleReadFailed)" Message="!(loc.msierrComPlusUserInPartitionRoleReadFailed)" />
12 <Error Id="$(var.msierrComPlusPartitionUserReadFailed)" Message="!(loc.msierrComPlusPartitionUserReadFailed)" />
13 <Error Id="$(var.msierrComPlusApplicationReadFailed)" Message="!(loc.msierrComPlusApplicationReadFailed)" />
14 <Error Id="$(var.msierrComPlusApplicationRoleReadFailed)" Message="!(loc.msierrComPlusApplicationRoleReadFailed)" />
15 <Error Id="$(var.msierrComPlusUserInApplicationRoleReadFailed)" Message="!(loc.msierrComPlusUserInApplicationRoleReadFailed)" />
16 <Error Id="$(var.msierrComPlusAssembliesReadFailed)" Message="!(loc.msierrComPlusAssembliesReadFailed)" />
17 <Error Id="$(var.msierrComPlusSubscriptionReadFailed)" Message="!(loc.msierrComPlusSubscriptionReadFailed)" />
18 <Error Id="$(var.msierrComPlusPartitionDependency)" Message="!(loc.msierrComPlusPartitionDependency)" />
19 <Error Id="$(var.msierrComPlusPartitionNotFound)" Message="!(loc.msierrComPlusPartitionNotFound)" />
20 <Error Id="$(var.msierrComPlusPartitionIdConflict)" Message="!(loc.msierrComPlusPartitionIdConflict)" />
21 <Error Id="$(var.msierrComPlusPartitionNameConflict)" Message="!(loc.msierrComPlusPartitionNameConflict)" />
22 <Error Id="$(var.msierrComPlusApplicationDependency)" Message="!(loc.msierrComPlusApplicationDependency)" />
23 <Error Id="$(var.msierrComPlusApplicationNotFound)" Message="!(loc.msierrComPlusApplicationNotFound)" />
24 <Error Id="$(var.msierrComPlusApplicationIdConflict)" Message="!(loc.msierrComPlusApplicationIdConflict)" />
25 <Error Id="$(var.msierrComPlusApplicationNameConflict)" Message="!(loc.msierrComPlusApplicationNameConflict)" />
26 <Error Id="$(var.msierrComPlusApplicationRoleDependency)" Message="!(loc.msierrComPlusApplicationRoleDependency)" />
27 <Error Id="$(var.msierrComPlusApplicationRoleNotFound)" Message="!(loc.msierrComPlusApplicationRoleNotFound)" />
28 <Error Id="$(var.msierrComPlusApplicationRoleConflict)" Message="!(loc.msierrComPlusApplicationRoleConflict)" />
29 <Error Id="$(var.msierrComPlusAssemblyDependency)" Message="!(loc.msierrComPlusAssemblyDependency)" />
30 <Error Id="$(var.msierrComPlusSubscriptionIdConflict)" Message="!(loc.msierrComPlusSubscriptionIdConflict)" />
31 <Error Id="$(var.msierrComPlusSubscriptionNameConflict)" Message="!(loc.msierrComPlusSubscriptionNameConflict)" />
32 <Error Id="$(var.msierrComPlusFailedLookupNames)" Message="!(loc.msierrComPlusFailedLookupNames)" />
33
34 <ProgressText Action="ComPlusInstallExecute" Message="!(loc.ComPlusInstallExecute)" />
35 <ProgressText Action="ComPlusUninstallExecute" Message="!(loc.ComPlusUninstallExecute)" />
36
37 <ProgressText Action="CreateComPlusPartitions" Template="!(loc.CreateComPlusPartitionsTemplate)" Message="!(loc.CreateComPlusPartitions)" />
38 <ProgressText Action="RemoveComPlusPartitions" Template="!(loc.RemoveComPlusPartitionsTemplate)" Message="!(loc.RemoveComPlusPartitions)" />
39 <ProgressText Action="AddUsersToComPlusPartitionRoles" Template="!(loc.AddUsersToComPlusPartitionRolesTemplate)" Message="!(loc.AddUsersToComPlusPartitionRoles)" />
40 <ProgressText Action="RemoveUsersFromComPlusPartRoles" Template="!(loc.RemoveUsersFromComPlusPartitionRolesTemplate)" Message="!(loc.RemoveUsersFromComPlusPartitionRoles)" />
41 <ProgressText Action="AddComPlusPartitionUsers" Template="!(loc.AddComPlusPartitionUsersTemplate)" Message="!(loc.AddComPlusPartitionUsers)" />
42 <ProgressText Action="RemoveComPlusPartitionUsers" Template="!(loc.RemoveComPlusPartitionUsersTemplate)" Message="!(loc.RemoveComPlusPartitionUsers)" />
43 <ProgressText Action="CreateComPlusApplications" Template="!(loc.CreateComPlusApplicationsTemplate)" Message="!(loc.CreateComPlusApplications)" />
44 <ProgressText Action="RemoveComPlusApplications" Template="!(loc.RemoveComPlusApplicationsTemplate)" Message="!(loc.RemoveComPlusApplications)" />
45 <ProgressText Action="CreateComPlusApplicationRoles" Template="!(loc.CreateComPlusApplicationRolesTemplate)" Message="!(loc.CreateComPlusApplicationRoles)" />
46 <ProgressText Action="RemoveComPlusApplicationRoles" Template="!(loc.RemoveComPlusApplicationRolesTemplate)" Message="!(loc.RemoveComPlusApplicationRoles)" />
47 <ProgressText Action="AddUsersToComPlusApplicationRoles" Template="!(loc.AddUsersToComPlusApplicationRolesTemplate)" Message="!(loc.AddUsersToComPlusApplicationRoles)" />
48 <ProgressText Action="RemoveUsersFromComPlusAppRoles" Template="!(loc.RemoveUsersFromComPlusApplicationRolesTemplate)" Message="!(loc.RemoveUsersFromComPlusApplicationRoles)" />
49 <ProgressText Action="RegisterComPlusAssemblies" Template="!(loc.RegisterComPlusAssembliesTemplate)" Message="!(loc.RegisterComPlusAssemblies)" />
50 <ProgressText Action="UnregisterComPlusAssemblies" Template="!(loc.UnregisterComPlusAssembliesTemplate)" Message="!(loc.UnregisterComPlusAssemblies)" />
51 <ProgressText Action="AddComPlusRoleAssignments" Template="!(loc.AddComPlusRoleAssignmentsTemplate)" Message="!(loc.AddComPlusRoleAssignments)" />
52 <ProgressText Action="RemoveComPlusRoleAssignments" Template="!(loc.RemoveComPlusRoleAssignmentsTemplate)" Message="!(loc.RemoveComPlusRoleAssignments)" />
53 <ProgressText Action="CreateSubscrComPlusComponents" Template="!(loc.CreateSubscriptionsComPlusComponentsTemplate)" Message="!(loc.CreateSubscriptionsComPlusComponents)" />
54 <ProgressText Action="RemoveSubscrComPlusComponents" Template="!(loc.RemoveSubscriptionsComPlusComponentsTemplate)" Message="!(loc.RemoveSubscriptionsComPlusComponents)" />
55 </UI>
56 </Fragment>
57
58 <Fragment>
59 <UIRef Id="ComPlusUI" />
60
61 <CustomAction Id="ConfigureComPlusInstall" DllEntry="ConfigureComPlusInstall" Execute="immediate" Return="check" SuppressModularization="yes" BinaryRef="ComPlusCA_x86" />
62 <CustomAction Id="ConfigureComPlusUninstall" DllEntry="ConfigureComPlusUninstall" Execute="immediate" Return="check" SuppressModularization="yes" BinaryRef="ComPlusCA_x86" />
63 <CustomAction Id="ComPlusInstallPrepare" DllEntry="ComPlusPrepare" Execute="deferred" Return="check" Impersonate="no" HideTarget="yes" SuppressModularization="yes" BinaryRef="ComPlusCA_x86" />
64 <CustomAction Id="ComPlusRollbackInstallPrepare" DllEntry="ComPlusCleanup" Execute="rollback" Return="check" Impersonate="no" HideTarget="yes" SuppressModularization="yes" BinaryRef="ComPlusCA_x86" />
65 <CustomAction Id="ComPlusInstallExecute" DllEntry="ComPlusInstallExecute" Execute="deferred" Return="check" Impersonate="no" HideTarget="yes" SuppressModularization="yes" BinaryRef="ComPlusCA_x86" />
66 <CustomAction Id="ComPlusInstallExecuteCommit" DllEntry="ComPlusInstallExecuteCommit" Execute="commit" Return="check" Impersonate="no" HideTarget="yes" SuppressModularization="yes" BinaryRef="ComPlusCA_x86" />
67 <CustomAction Id="ComPlusRollbackInstallExecute" DllEntry="ComPlusRollbackInstallExecute" Execute="rollback" Return="check" Impersonate="no" HideTarget="yes" SuppressModularization="yes" BinaryRef="ComPlusCA_x86" />
68 <CustomAction Id="ComPlusInstallCommit" DllEntry="ComPlusCleanup" Execute="commit" Return="check" Impersonate="no" HideTarget="yes" SuppressModularization="yes" BinaryRef="ComPlusCA_x86" />
69 <CustomAction Id="ComPlusUninstallPrepare" DllEntry="ComPlusPrepare" Execute="deferred" Return="check" Impersonate="no" HideTarget="yes" SuppressModularization="yes" BinaryRef="ComPlusCA_x86" />
70 <CustomAction Id="ComPlusRollbackUninstallPrepare" DllEntry="ComPlusCleanup" Execute="rollback" Return="check" Impersonate="no" HideTarget="yes" SuppressModularization="yes" BinaryRef="ComPlusCA_x86" />
71 <CustomAction Id="ComPlusUninstallExecute" DllEntry="ComPlusUninstallExecute" Execute="deferred" Return="check" Impersonate="no" HideTarget="yes" SuppressModularization="yes" BinaryRef="ComPlusCA_x86" />
72 <CustomAction Id="ComPlusRollbackUninstallExecute" DllEntry="ComPlusInstallExecute" Execute="rollback" Return="check" Impersonate="no" HideTarget="yes" SuppressModularization="yes" BinaryRef="ComPlusCA_x86" />
73 <CustomAction Id="ComPlusUninstallCommit" DllEntry="ComPlusCleanup" Execute="commit" Return="check" Impersonate="no" HideTarget="yes" SuppressModularization="yes" BinaryRef="ComPlusCA_x86" />
74
75 <Property Id="ComPlusInstallPrepare" Hidden="yes" SuppressModularization="yes" />
76 <Property Id="ComPlusRollbackInstallPrepare" Hidden="yes" SuppressModularization="yes" />
77 <Property Id="ComPlusInstallExecute" Hidden="yes" SuppressModularization="yes" />
78 <Property Id="ComPlusInstallExecuteCommit" Hidden="yes" SuppressModularization="yes" />
79 <Property Id="ComPlusRollbackInstallExecute" Hidden="yes" SuppressModularization="yes" />
80 <Property Id="ComPlusInstallCommit" Hidden="yes" SuppressModularization="yes" />
81 <Property Id="ComPlusUninstallPrepare" Hidden="yes" SuppressModularization="yes" />
82 <Property Id="ComPlusRollbackUninstallPrepare" Hidden="yes" SuppressModularization="yes" />
83 <Property Id="ComPlusUninstallExecute" Hidden="yes" SuppressModularization="yes" />
84 <Property Id="ComPlusRollbackUninstallExecute" Hidden="yes" SuppressModularization="yes" />
85 <Property Id="ComPlusUninstallCommit" Hidden="yes" SuppressModularization="yes" />
86
87 <InstallExecuteSequence>
88 <Custom Action="ConfigureComPlusUninstall" After="DeleteServices" Overridable="yes" Condition="VersionNT &gt;= 500" />
89 <Custom Action="ConfigureComPlusInstall" Before="InstallServices" Overridable="yes" Condition="VersionNT &gt;= 500" />
90 </InstallExecuteSequence>
91 </Fragment>
92
93 <Fragment>
94 <UIRef Id="ComPlusUI" />
95
96 <CustomAction Id="ConfigureComPlusInstall_x64" DllEntry="ConfigureComPlusInstall" Execute="immediate" Return="check" SuppressModularization="yes" BinaryRef="ComPlusCA_x64" />
97 <CustomAction Id="ConfigureComPlusUninstall_x64" DllEntry="ConfigureComPlusUninstall" Execute="immediate" Return="check" SuppressModularization="yes" BinaryRef="ComPlusCA_x64" />
98 <CustomAction Id="ComPlusInstallPrepare_64" DllEntry="ComPlusPrepare" Execute="deferred" Return="check" Impersonate="no" HideTarget="yes" SuppressModularization="yes" BinaryRef="ComPlusCA_x64" />
99 <CustomAction Id="ComPlusRollbackInstallPrepare_64" DllEntry="ComPlusCleanup" Execute="rollback" Return="check" Impersonate="no" HideTarget="yes" SuppressModularization="yes" BinaryRef="ComPlusCA_x64" />
100 <CustomAction Id="ComPlusInstallExecute_64" DllEntry="ComPlusInstallExecute" Execute="deferred" Return="check" Impersonate="no" HideTarget="yes" SuppressModularization="yes" BinaryRef="ComPlusCA_x64" />
101 <CustomAction Id="ComPlusInstallExecuteCommit_64" DllEntry="ComPlusInstallExecuteCommit" Execute="commit" Return="check" Impersonate="no" HideTarget="yes" SuppressModularization="yes" BinaryRef="ComPlusCA_x64" />
102 <CustomAction Id="ComPlusRollbackInstallExecute_64" DllEntry="ComPlusRollbackInstallExecute" Execute="rollback" Return="check" Impersonate="no" HideTarget="yes" SuppressModularization="yes" BinaryRef="ComPlusCA_x64" />
103 <CustomAction Id="ComPlusInstallCommit_64" DllEntry="ComPlusCleanup" Execute="commit" Return="check" Impersonate="no" HideTarget="yes" SuppressModularization="yes" BinaryRef="ComPlusCA_x64" />
104 <CustomAction Id="ComPlusUninstallPrepare_64" DllEntry="ComPlusPrepare" Execute="deferred" Return="check" Impersonate="no" HideTarget="yes" SuppressModularization="yes" BinaryRef="ComPlusCA_x64" />
105 <CustomAction Id="ComPlusRollbackUninstallPrepare_64" DllEntry="ComPlusCleanup" Execute="rollback" Return="check" Impersonate="no" HideTarget="yes" SuppressModularization="yes" BinaryRef="ComPlusCA_x64" />
106 <CustomAction Id="ComPlusUninstallExecute_64" DllEntry="ComPlusUninstallExecute" Execute="deferred" Return="check" Impersonate="no" HideTarget="yes" SuppressModularization="yes" BinaryRef="ComPlusCA_x64" />
107 <CustomAction Id="ComPlusRollbackUninstallExecute_64" DllEntry="ComPlusInstallExecute" Execute="rollback" Return="check" Impersonate="no" HideTarget="yes" SuppressModularization="yes" BinaryRef="ComPlusCA_x64" />
108 <CustomAction Id="ComPlusUninstallCommit_64" DllEntry="ComPlusCleanup" Execute="commit" Return="check" Impersonate="no" HideTarget="yes" SuppressModularization="yes" BinaryRef="ComPlusCA_x64" />
109
110 <Property Id="ComPlusInstallPrepare_64" Hidden="yes" SuppressModularization="yes" />
111 <Property Id="ComPlusRollbackInstallPrepare_64" Hidden="yes" SuppressModularization="yes" />
112 <Property Id="ComPlusInstallExecute_64" Hidden="yes" SuppressModularization="yes" />
113 <Property Id="ComPlusInstallExecuteCommit_64" Hidden="yes" SuppressModularization="yes" />
114 <Property Id="ComPlusRollbackInstallExecute_64" Hidden="yes" SuppressModularization="yes" />
115 <Property Id="ComPlusInstallCommit_64" Hidden="yes" SuppressModularization="yes" />
116 <Property Id="ComPlusUninstallPrepare_64" Hidden="yes" SuppressModularization="yes" />
117 <Property Id="ComPlusRollbackUninstallPrepare_64" Hidden="yes" SuppressModularization="yes" />
118 <Property Id="ComPlusUninstallExecute_64" Hidden="yes" SuppressModularization="yes" />
119 <Property Id="ComPlusRollbackUninstallExecute_64" Hidden="yes" SuppressModularization="yes" />
120 <Property Id="ComPlusUninstallCommit_64" Hidden="yes" SuppressModularization="yes" />
121
122 <InstallExecuteSequence>
123 <Custom Action="ConfigureComPlusUninstall_x64" After="DeleteServices" Overridable="yes" Condition="VersionNT &gt;= 500" />
124 <Custom Action="ConfigureComPlusInstall_x64" Before="InstallServices" Overridable="yes" Condition="VersionNT &gt;= 500" />
125 </InstallExecuteSequence>
126 </Fragment>
127
128 <Fragment>
129 <Binary Id="ComPlusCA_x86" SourceFile="!(bindpath.x86)complusca.dll" />
130 </Fragment>
131
132 <Fragment>
133 <Binary Id="ComPlusCA_x64" SourceFile="!(bindpath.x64)complusca.dll" />
134 </Fragment>
135</Wix>
diff --git a/src/ext/ComPlus/wixlib/caerr.wxi b/src/ext/ComPlus/wixlib/caerr.wxi
new file mode 100644
index 00000000..ff7ec121
--- /dev/null
+++ b/src/ext/ComPlus/wixlib/caerr.wxi
@@ -0,0 +1,96 @@
1<Include xmlns="http://wixtoolset.org/schemas/v4/wxs">
2 <?define msierrSecureObjectsFailedCreateSD = 25520?>
3 <?define msierrSecureObjectsFailedSet = 25521?>
4 <?define msierrSecureObjectsUnknownType = 25522?>
5 <?define msierrXmlFileFailedRead = 25530?>
6 <?define msierrXmlFileFailedOpen = 25531?>
7 <?define msierrXmlFileFailedSelect = 25532?>
8 <?define msierrXmlFileFailedSave = 25533?>
9 <?define msierrXmlConfigFailedRead = 25540?>
10 <?define msierrXmlConfigFailedOpen = 25541?>
11 <?define msierrXmlConfigFailedSelect = 25542?>
12 <?define msierrXmlConfigFailedSave = 25543?>
13 <?define msierrFirewallCannotConnect = 25580?>
14 <?define msierrIISCannotConnect = 26001?>
15 <?define msierrIISFailedReadWebSite = 26002?>
16 <?define msierrIISFailedReadWebDirs = 26003?>
17 <?define msierrIISFailedReadVDirs = 26004?>
18 <?define msierrIISFailedReadFilters = 26005?>
19 <?define msierrIISFailedReadAppPool = 26006?>
20 <?define msierrIISFailedReadMimeMap = 26007?>
21 <?define msierrIISFailedReadProp = 26008?>
22 <?define msierrIISFailedReadWebSvcExt = 26009?>
23 <?define msierrIISFailedReadWebError = 26010?>
24 <?define msierrIISFailedReadHttpHeader = 26011?>
25 <?define msierrIISFailedSchedTransaction = 26031?>
26 <?define msierrIISFailedSchedInstallWebs = 26032?>
27 <?define msierrIISFailedSchedInstallWebDirs = 26033?>
28 <?define msierrIISFailedSchedInstallVDirs = 26034?>
29 <?define msierrIISFailedSchedInstallFilters = 26035?>
30 <?define msierrIISFailedSchedInstallAppPool = 26036?>
31 <?define msierrIISFailedSchedInstallProp = 26037?>
32 <?define msierrIISFailedSchedInstallWebSvcExt = 26038?>
33 <?define msierrIISFailedSchedUninstallWebs = 26051?>
34 <?define msierrIISFailedSchedUninstallWebDirs = 26052?>
35 <?define msierrIISFailedSchedUninstallVDirs = 26053?>
36 <?define msierrIISFailedSchedUninstallFilters = 26054?>
37 <?define msierrIISFailedSchedUninstallAppPool = 26055?>
38 <?define msierrIISFailedSchedUninstallProp = 26056?>
39 <?define msierrIISFailedSchedUninstallWebSvcExt = 26057?>
40 <?define msierrIISFailedStartTransaction = 26101?>
41 <?define msierrIISFailedOpenKey = 26102?>
42 <?define msierrIISFailedCreateKey = 26103?>
43 <?define msierrIISFailedWriteData = 26104?>
44 <?define msierrIISFailedCreateApp = 26105?>
45 <?define msierrIISFailedDeleteKey = 26106?>
46 <?define msierrIISFailedDeleteApp = 26107?>
47 <?define msierrIISFailedDeleteValue = 26108?>
48 <?define msierrIISFailedCommitInUse = 26109?>
49 <?define msierrSQLFailedCreateDatabase = 26201?>
50 <?define msierrSQLFailedDropDatabase = 26202?>
51 <?define msierrSQLFailedConnectDatabase = 26203?>
52 <?define msierrSQLFailedExecString = 26204?>
53 <?define msierrSQLDatabaseAlreadyExists = 26205?>
54 <?define msierrPERFMONFailedRegisterDLL = 26251?>
55 <?define msierrPERFMONFailedUnregisterDLL = 26252?>
56 <?define msierrInstallPerfCounterData = 26253?>
57 <?define msierrUninstallPerfCounterData = 26254?>
58 <?define msierrSMBFailedCreate = 26301?>
59 <?define msierrSMBFailedDrop = 26302?>
60 <?define msierrCERTFailedOpen = 26351?>
61 <?define msierrCERTFailedAdd = 26352?>
62 <?define msierrUSRFailedUserCreate = 26401?>
63 <?define msierrUSRFailedUserCreatePswd = 26402?>
64 <?define msierrUSRFailedUserGroupAdd = 26403?>
65 <?define msierrUSRFailedUserCreateExists = 26404?>
66 <?define msierrUSRFailedGrantLogonAsService = 26405?>
67 <?define msierrDependencyMissingDependencies = 26451?>
68 <?define msierrDependencyHasDependents = 26452?>
69 <?define msierrDotNetRuntimeRequired = 27000?>
70 <?define msierrComPlusCannotConnect = 28001?>
71 <?define msierrComPlusPartitionReadFailed = 28002?>
72 <?define msierrComPlusPartitionRoleReadFailed = 28003?>
73 <?define msierrComPlusUserInPartitionRoleReadFailed = 28004?>
74 <?define msierrComPlusPartitionUserReadFailed = 28005?>
75 <?define msierrComPlusApplicationReadFailed = 28006?>
76 <?define msierrComPlusApplicationRoleReadFailed = 28007?>
77 <?define msierrComPlusUserInApplicationRoleReadFailed = 28008?>
78 <?define msierrComPlusAssembliesReadFailed = 28009?>
79 <?define msierrComPlusSubscriptionReadFailed = 28010?>
80 <?define msierrComPlusPartitionDependency = 28011?>
81 <?define msierrComPlusPartitionNotFound = 28012?>
82 <?define msierrComPlusPartitionIdConflict = 28013?>
83 <?define msierrComPlusPartitionNameConflict = 28014?>
84 <?define msierrComPlusApplicationDependency = 28015?>
85 <?define msierrComPlusApplicationNotFound = 28016?>
86 <?define msierrComPlusApplicationIdConflict = 28017?>
87 <?define msierrComPlusApplicationNameConflict = 28018?>
88 <?define msierrComPlusApplicationRoleDependency = 28019?>
89 <?define msierrComPlusApplicationRoleNotFound = 28020?>
90 <?define msierrComPlusApplicationRoleConflict = 28021?>
91 <?define msierrComPlusAssemblyDependency = 28022?>
92 <?define msierrComPlusSubscriptionIdConflict = 28023?>
93 <?define msierrComPlusSubscriptionNameConflict = 28024?>
94 <?define msierrComPlusFailedLookupNames = 28025?>
95 <?define msierrMsmqCannotConnect = 28101?>
96</Include> \ No newline at end of file
diff --git a/src/ext/ComPlus/wixlib/complus.wixproj b/src/ext/ComPlus/wixlib/complus.wixproj
new file mode 100644
index 00000000..ef792a13
--- /dev/null
+++ b/src/ext/ComPlus/wixlib/complus.wixproj
@@ -0,0 +1,26 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3
4<Project Sdk="WixToolset.Sdk">
5
6 <PropertyGroup>
7 <OutputType>Library</OutputType>
8 <BindFiles>true</BindFiles>
9 <SuppressSpecificWarnings>1086</SuppressSpecificWarnings>
10 </PropertyGroup>
11
12 <ItemGroup>
13 <BindInputPaths Include="$(OutputPath)x86" BindName='x86' />
14 <BindInputPaths Include="$(OutputPath)x64" BindName='x64' />
15 </ItemGroup>
16
17 <ItemGroup>
18 <ProjectReference Include="..\ca\complusca.vcxproj" Properties="Platform=x86" ReferenceOutputAssembly="false" />
19 <ProjectReference Include="..\ca\complusca.vcxproj" Properties="Platform=x64" ReferenceOutputAssembly="false" />
20 </ItemGroup>
21
22 <ItemGroup>
23 <PackageReference Include="Nerdbank.GitVersioning" Version="3.3.37" PrivateAssets="All" />
24 </ItemGroup>
25
26</Project>
diff --git a/src/ext/ComPlus/wixlib/en-us.wxl b/src/ext/ComPlus/wixlib/en-us.wxl
new file mode 100644
index 00000000..8f6f38fc
--- /dev/null
+++ b/src/ext/ComPlus/wixlib/en-us.wxl
@@ -0,0 +1,71 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3
4
5<WixLocalization Culture="en-us" xmlns="http://wixtoolset.org/schemas/v4/wxl">
6 <String Id="msierrComPlusCannotConnect" Overridable="yes">Cannot connect to the COM+ admin catalog. ([2] [3] [4] [5])</String>
7 <String Id="msierrComPlusPartitionReadFailed" Overridable="yes">Failed to read COM+ partitions. ([2] [3] [4] [5])</String>
8 <String Id="msierrComPlusPartitionRoleReadFailed" Overridable="yes">Failed to read COM+ partition roles. ([2] [3] [4] [5])</String>
9 <String Id="msierrComPlusUserInPartitionRoleReadFailed" Overridable="yes">Failed to read COM+ users in partition roles. ([2] [3] [4] [5])</String>
10 <String Id="msierrComPlusPartitionUserReadFailed" Overridable="yes">Failed to read COM+ partition users. ([2] [3] [4] [5])</String>
11 <String Id="msierrComPlusApplicationReadFailed" Overridable="yes">Failed to read COM+ applications. ([2] [3] [4] [5])</String>
12 <String Id="msierrComPlusApplicationRoleReadFailed" Overridable="yes">Failed to read COM+ application roles. ([2] [3] [4] [5])</String>
13 <String Id="msierrComPlusUserInApplicationRoleReadFailed" Overridable="yes">Failed to read COM+ users in application roles. ([2] [3] [4] [5])</String>
14 <String Id="msierrComPlusAssembliesReadFailed" Overridable="yes">Failed to read COM+ assemblies. ([2] [3] [4] [5])</String>
15 <String Id="msierrComPlusSubscriptionReadFailed" Overridable="yes">Failed to read COM+ event subscriptions. ([2] [3] [4] [5])</String>
16 <String Id="msierrComPlusPartitionDependency" Overridable="yes">Another entity is dependent on a COM+ partition that is not being installed. ([2] [3] [4] [5])</String>
17 <String Id="msierrComPlusPartitionNotFound" Overridable="yes">The COM+ partition was not found. ([2] [3] [4] [5])</String>
18 <String Id="msierrComPlusPartitionIdConflict" Overridable="yes">A COM+ partition with the same id already exists. ([2] [3] [4] [5])</String>
19 <String Id="msierrComPlusPartitionNameConflict" Overridable="yes">A COM+ partition with the same name already exists. ([2] [3] [4] [5])</String>
20 <String Id="msierrComPlusApplicationDependency" Overridable="yes">Another entity is dependent on a COM+ application that is not being installed. ([2] [3] [4] [5])</String>
21 <String Id="msierrComPlusApplicationNotFound" Overridable="yes">The COM+ application was not found. ([2] [3] [4] [5])</String>
22 <String Id="msierrComPlusApplicationIdConflict" Overridable="yes">A COM+ application with the same id already exists. ([2] [3] [4] [5])</String>
23 <String Id="msierrComPlusApplicationNameConflict" Overridable="yes">A COM+ application with the same name already exists. ([2] [3] [4] [5])</String>
24 <String Id="msierrComPlusApplicationRoleDependency" Overridable="yes">Another entity is dependent on a COM+ application role that is not being installed. ([2] [3] [4] [5])</String>
25 <String Id="msierrComPlusApplicationRoleNotFound" Overridable="yes">The COM+ application role was not found. ([2] [3] [4] [5])</String>
26 <String Id="msierrComPlusApplicationRoleConflict" Overridable="yes">A COM+ application role with the same name already exists. ([2] [3] [4] [5])</String>
27 <String Id="msierrComPlusAssemblyDependency" Overridable="yes">Another entity is dependent on a COM+ assembly that is not being installed. ([2] [3] [4] [5])</String>
28 <String Id="msierrComPlusSubscriptionIdConflict" Overridable="yes">A COM+ component event subscription with the same id already exists. ([2] [3] [4] [5])</String>
29 <String Id="msierrComPlusSubscriptionNameConflict" Overridable="yes">A COM+ component event subscription with the same name already exists. ([2] [3] [4] [5])</String>
30 <String Id="msierrComPlusFailedLookupNames" Overridable="yes">Failed to lookup user account names. ([2] [3] [4] [5])</String>
31
32 <String Id="ComPlusInstallExecute" Overridable="yes">Registering COM+ components</String>
33 <String Id="ComPlusUninstallExecute" Overridable="yes">Unregistering COM+ components</String>
34
35 <String Id="CreateComPlusPartitions" Overridable="yes">Creating COM+ partitions</String>
36 <String Id="CreateComPlusPartitionsTemplate" Overridable="yes">Partition: [1]</String>
37 <String Id="RemoveComPlusPartitions" Overridable="yes">Removing COM+ partitions</String>
38 <String Id="RemoveComPlusPartitionsTemplate" Overridable="yes">Partition: [1]</String>
39 <String Id="AddUsersToComPlusPartitionRoles" Overridable="yes">Adding users to COM+ partition roles</String>
40 <String Id="AddUsersToComPlusPartitionRolesTemplate" Overridable="yes">Role: [1]</String>
41 <String Id="RemoveUsersFromComPlusPartitionRoles" Overridable="yes">Removing users from COM+ partition roles</String>
42 <String Id="RemoveUsersFromComPlusPartitionRolesTemplate" Overridable="yes">Role: [1]</String>
43 <String Id="AddComPlusPartitionUsers" Overridable="yes">Setting default COM+ partitions for users</String>
44 <String Id="AddComPlusPartitionUsersTemplate" Overridable="yes">User: [1]</String>
45 <String Id="RemoveComPlusPartitionUsers" Overridable="yes">Removing default COM+ partitions for users</String>
46 <String Id="RemoveComPlusPartitionUsersTemplate" Overridable="yes">User: [1]</String>
47 <String Id="CreateComPlusApplications" Overridable="yes">Creating COM+ applications</String>
48 <String Id="CreateComPlusApplicationsTemplate" Overridable="yes">Application: [1]</String>
49 <String Id="RemoveComPlusApplications" Overridable="yes">Removing COM+ applications</String>
50 <String Id="RemoveComPlusApplicationsTemplate" Overridable="yes">Application: [1]</String>
51 <String Id="CreateComPlusApplicationRoles" Overridable="yes">Creating COM+ application roles</String>
52 <String Id="CreateComPlusApplicationRolesTemplate" Overridable="yes">Role: [1]</String>
53 <String Id="RemoveComPlusApplicationRoles" Overridable="yes">Removing COM+ application roles</String>
54 <String Id="RemoveComPlusApplicationRolesTemplate" Overridable="yes">Role: [1]</String>
55 <String Id="AddUsersToComPlusApplicationRoles" Overridable="yes">Adding users to COM+ application roles</String>
56 <String Id="AddUsersToComPlusApplicationRolesTemplate" Overridable="yes">User: [1]</String>
57 <String Id="RemoveUsersFromComPlusApplicationRoles" Overridable="yes">Removing users from COM+ application roles</String>
58 <String Id="RemoveUsersFromComPlusApplicationRolesTemplate" Overridable="yes">User: [1]</String>
59 <String Id="RegisterComPlusAssemblies" Overridable="yes">Registering COM+ components</String>
60 <String Id="RegisterComPlusAssembliesTemplate" Overridable="yes">DLL: [1]</String>
61 <String Id="UnregisterComPlusAssemblies" Overridable="yes">Unregistering COM+ components</String>
62 <String Id="UnregisterComPlusAssembliesTemplate" Overridable="yes">DLL: [1]</String>
63 <String Id="AddComPlusRoleAssignments" Overridable="yes">Assigning roles to COM+ components</String>
64 <String Id="AddComPlusRoleAssignmentsTemplate" Overridable="yes">Component: [1]</String>
65 <String Id="RemoveComPlusRoleAssignments" Overridable="yes">Removing role assignments from COM+ components</String>
66 <String Id="RemoveComPlusRoleAssignmentsTemplate" Overridable="yes">Component: [1]</String>
67 <String Id="CreateSubscriptionsComPlusComponents" Overridable="yes">Creating subscriptions for COM+ components</String>
68 <String Id="CreateSubscriptionsComPlusComponentsTemplate" Overridable="yes">Subscription: [1]</String>
69 <String Id="RemoveSubscriptionsComPlusComponents" Overridable="yes">Removing subscriptions for COM+ components</String>
70 <String Id="RemoveSubscriptionsComPlusComponentsTemplate" Overridable="yes">Subscription: [1]</String>
71</WixLocalization>
diff --git a/src/ext/ComPlus/wixlib/es-es.wxl b/src/ext/ComPlus/wixlib/es-es.wxl
new file mode 100644
index 00000000..5e7eba66
--- /dev/null
+++ b/src/ext/ComPlus/wixlib/es-es.wxl
@@ -0,0 +1,72 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3
4
5<WixLocalization Culture="es-es" xmlns="http://wixtoolset.org/schemas/v4/wxl">
6 <String Id="msierrComPlusCannotConnect" Overridable="yes">No se puede conectar al catálogo de administración de COM+. ([2] [3] [4] [5])</String>
7 <String Id="msierrComPlusPartitionReadFailed" Overridable="yes">Falla al leer las particiones COM+. ([2] [3] [4] [5])</String>
8 <String Id="msierrComPlusPartitionRoleReadFailed" Overridable="yes">Falla al leer los roles de las particiones COM+. ([2] [3] [4] [5])</String>
9 <String Id="msierrComPlusUserInPartitionRoleReadFailed" Overridable="yes">Falla al leer los usuario en los roles de las particiones COM+. ([2] [3] [4] [5])</String>
10 <String Id="msierrComPlusPartitionUserReadFailed" Overridable="yes">Falla al leer los usuario de las particiones COM+. ([2] [3] [4] [5])</String>
11 <String Id="msierrComPlusApplicationReadFailed" Overridable="yes">Falla al leer las aplicaciones COM+. ([2] [3] [4] [5])</String>
12 <String Id="msierrComPlusApplicationRoleReadFailed" Overridable="yes">Falla al leer los roles de las aplicaciones COM+. ([2] [3] [4] [5])</String>
13 <String Id="msierrComPlusUserInApplicationRoleReadFailed" Overridable="yes">Falla al leer los usuario de las aplicaciones COM+. ([2] [3] [4] [5])</String>
14 <String Id="msierrComPlusAssembliesReadFailed" Overridable="yes">Falla al leer los ensamblados COM+. ([2] [3] [4] [5])</String>
15 <String Id="msierrComPlusSubscriptionReadFailed" Overridable="yes">Falla al leer las suscripciones a eventos COM+. ([2] [3] [4] [5])</String>
16 <String Id="msierrComPlusPartitionDependency" Overridable="yes">Otra entidad es dependiente de una partición COM+ que no está siendo instalada. ([2] [3] [4] [5])</String>
17 <String Id="msierrComPlusPartitionNotFound" Overridable="yes">La partición COM+ no pudo ser encontrada. ([2] [3] [4] [5])</String>
18 <String Id="msierrComPlusPartitionIdConflict" Overridable="yes">Ya existe otra partición COM+ con el mismo id. ([2] [3] [4] [5])</String>
19 <String Id="msierrComPlusPartitionNameConflict" Overridable="yes">Ya existe otra partición COM+ con el mismo nombre. ([2] [3] [4] [5])</String>
20 <String Id="msierrComPlusApplicationDependency" Overridable="yes">Otra entidad es dependiente de una aplicación COM+ que no está siendo instalada. ([2] [3] [4] [5])</String>
21 <String Id="msierrComPlusApplicationNotFound" Overridable="yes">La aplicación COM+ no pudo ser encontrada. ([2] [3] [4] [5])</String>
22 <String Id="msierrComPlusApplicationIdConflict" Overridable="yes">Ya existe otra aplicación COM+ con el mismo id. ([2] [3] [4] [5])</String>
23 <String Id="msierrComPlusApplicationNameConflict" Overridable="yes">Ya existe otra aplicación COM+ con el mismo nombre. ([2] [3] [4] [5])</String>
24 <String Id="msierrComPlusApplicationRoleDependency" Overridable="yes">Otra entidad es dependiente de un rol de aplicación COM+ que no está siendo instalado. ([2] [3] [4] [5])</String>
25 <String Id="msierrComPlusApplicationRoleNotFound" Overridable="yes">El rol de aplicación COM+ no pudo ser encontrado. ([2] [3] [4] [5])</String>
26 <String Id="msierrComPlusApplicationRoleConflict" Overridable="yes">Ya existe otro rol de aplicación COM+ con el mismo nombre. ([2] [3] [4] [5])</String>
27 <String Id="msierrComPlusAssemblyDependency" Overridable="yes">Otra entidad es dependiente de un ensamblado COM+ que no está siendo instalado. ([2] [3] [4] [5])</String>
28 <String Id="msierrComPlusSubscriptionIdConflict" Overridable="yes">Ya existe otra suscripción de evento al componente COM+ con el mismo id. ([2] [3] [4] [5])</String>
29 <String Id="msierrComPlusSubscriptionNameConflict" Overridable="yes">Ya existe otra suscripción de evento al componente COM+ con el mismo nombre. ([2] [3] [4] [5])</String>
30 <String Id="msierrComPlusFailedLookupNames" Overridable="yes">Falla el la búsqueda de los nombres de usuario. ([2] [3] [4] [5])</String>
31
32 <String Id="ComPlusInstallExecute" Overridable="yes">Registrando componentes COM+</String>
33 <String Id="ComPlusUninstallExecute" Overridable="yes">Anular el registro de componentes COM+</String>
34
35 <String Id="CreateComPlusPartitions" Overridable="yes">Creando particiones COM+</String>
36 <String Id="CreateComPlusPartitionsTemplate" Overridable="yes">Particiones: [1]</String>
37 <String Id="RemoveComPlusPartitions" Overridable="yes">Borrando particiones COM+</String>
38 <String Id="RemoveComPlusPartitionsTemplate" Overridable="yes">Particiones: [1]</String>
39 <String Id="AddUsersToComPlusPartitionRoles" Overridable="yes">Agregando usuarios a los roles de las particiones COM+</String>
40 <String Id="AddUsersToComPlusPartitionRolesTemplate" Overridable="yes">Rol: [1]</String>
41 <String Id="RemoveUsersFromComPlusPartitionRoles" Overridable="yes">Borrando usuarios a los roles de las particiones COM+</String>
42 <String Id="RemoveUsersFromComPlusPartitionRolesTemplate" Overridable="yes">Rol: [1]</String>
43 <String Id="AddComPlusPartitionUsers" Overridable="yes">Ajustando partición COM+ por omisión para los usuarios</String>
44 <String Id="AddComPlusPartitionUsersTemplate" Overridable="yes">Usuario: [1]</String>
45 <String Id="RemoveComPlusPartitionUsers" Overridable="yes">Borrando partición COM+ por omisión para los usuarios</String>
46 <String Id="RemoveComPlusPartitionUsersTemplate" Overridable="yes">Usuario: [1]</String>
47 <String Id="CreateComPlusApplications" Overridable="yes">Creando aplicación COM+</String>
48 <String Id="CreateComPlusApplicationsTemplate" Overridable="yes">Aplicación: [1]</String>
49 <String Id="RemoveComPlusApplications" Overridable="yes">Borrando aplicación COM+</String>
50 <String Id="RemoveComPlusApplicationsTemplate" Overridable="yes">Aplicación: [1]</String>
51 <String Id="CreateComPlusApplicationRoles" Overridable="yes">Creando roles de aplicación COM+</String>
52 <String Id="CreateComPlusApplicationRolesTemplate" Overridable="yes">Rol: [1]</String>
53 <String Id="RemoveComPlusApplicationRoles" Overridable="yes">Borrando roles de aplicación COM+</String>
54 <String Id="RemoveComPlusApplicationRolesTemplate" Overridable="yes">Rol: [1]</String>
55 <String Id="AddUsersToComPlusApplicationRoles" Overridable="yes">Agregando usuarios a los roles de aplicación COM+</String>
56 <String Id="AddUsersToComPlusApplicationRolesTemplate" Overridable="yes">Usuario: [1]</String>
57 <String Id="RemoveUsersFromComPlusApplicationRoles" Overridable="yes">Borrando usuarios a los roles de aplicación COM</String>
58 <String Id="RemoveUsersFromComPlusApplicationRolesTemplate" Overridable="yes">Usuario: [1]</String>
59 <String Id="RegisterComPlusAssemblies" Overridable="yes">Registrando componente COM+</String>
60 <String Id="RegisterComPlusAssembliesTemplate" Overridable="yes">DLL: [1]</String>
61 <String Id="UnregisterComPlusAssemblies" Overridable="yes">Anulando el registro de componentes COM+</String>
62 <String Id="UnregisterComPlusAssembliesTemplate" Overridable="yes">DLL: [1]</String>
63 <String Id="AddComPlusRoleAssignments" Overridable="yes">Asignando roles a los componentes COM+</String>
64 <String Id="AddComPlusRoleAssignmentsTemplate" Overridable="yes">Componente: [1]</String>
65 <String Id="RemoveComPlusRoleAssignments" Overridable="yes">Borrando asignación de roles a los componentes COM+</String>
66 <String Id="RemoveComPlusRoleAssignmentsTemplate" Overridable="yes">Componente: [1]</String>
67 <String Id="CreateSubscriptionsComPlusComponents" Overridable="yes">Creando suscripción a componentes COM+</String>
68 <String Id="CreateSubscriptionsComPlusComponentsTemplate" Overridable="yes">Suscripción: [1]</String>
69 <String Id="RemoveSubscriptionsComPlusComponents" Overridable="yes">Borrando suscripción a componentes COM+</String>
70 <String Id="RemoveSubscriptionsComPlusComponentsTemplate" Overridable="yes">Suscripción: [1]</String>
71</WixLocalization>
72
diff --git a/src/ext/ComPlus/wixlib/ja-jp.wxl b/src/ext/ComPlus/wixlib/ja-jp.wxl
new file mode 100644
index 00000000..03b2cf1c
--- /dev/null
+++ b/src/ext/ComPlus/wixlib/ja-jp.wxl
@@ -0,0 +1,71 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3
4
5<WixLocalization Culture="ja-jp" xmlns="http://wixtoolset.org/schemas/v4/wxl">
6 <String Id="msierrComPlusCannotConnect" Overridable="yes">COM+ 管理カタログへ接続できません。 ([2] [3] [4] [5])</String>
7 <String Id="msierrComPlusPartitionReadFailed" Overridable="yes">COM+ パーティションの読み込みに失敗しました。 ([2] [3] [4] [5])</String>
8 <String Id="msierrComPlusPartitionRoleReadFailed" Overridable="yes">COM+ パーティション役割の読み込みに失敗しました。 ([2] [3] [4] [5])</String>
9 <String Id="msierrComPlusUserInPartitionRoleReadFailed" Overridable="yes">COM+ パーティション役割内ユーザーの読み込みに失敗しました。 ([2] [3] [4] [5])</String>
10 <String Id="msierrComPlusPartitionUserReadFailed" Overridable="yes">COM+ パーティション ユーザーの読み込みに失敗しました。 ([2] [3] [4] [5])</String>
11 <String Id="msierrComPlusApplicationReadFailed" Overridable="yes">COM+ アプリケーションの読み込みに失敗しました。 ([2] [3] [4] [5])</String>
12 <String Id="msierrComPlusApplicationRoleReadFailed" Overridable="yes">COM+ アプリケーション役割の読み込みに失敗しました。 ([2] [3] [4] [5])</String>
13 <String Id="msierrComPlusUserInApplicationRoleReadFailed" Overridable="yes">COM+ アプリケーション役割内ユーザーの読み込みに失敗しました。 ([2] [3] [4] [5])</String>
14 <String Id="msierrComPlusAssembliesReadFailed" Overridable="yes">COM+ アセンブリの読み込みに失敗しました。 ([2] [3] [4] [5])</String>
15 <String Id="msierrComPlusSubscriptionReadFailed" Overridable="yes">COM+ イベント登録の読み込みに失敗しました。 ([2] [3] [4] [5])</String>
16 <String Id="msierrComPlusPartitionDependency" Overridable="yes">他のエンティティはインストールされない COM+ パーティションに依存します。 ([2] [3] [4] [5])</String>
17 <String Id="msierrComPlusPartitionNotFound" Overridable="yes">COM+ パーティションは見つかりません ([2] [3] [4] [5])</String>
18 <String Id="msierrComPlusPartitionIdConflict" Overridable="yes">同一 ID を持つ COM+ パーティションが既に存在します。 ([2] [3] [4] [5])</String>
19 <String Id="msierrComPlusPartitionNameConflict" Overridable="yes">同一名称を持つ COM+ パーティションが既に存在します。 ([2] [3] [4] [5])</String>
20 <String Id="msierrComPlusApplicationDependency" Overridable="yes">他のエンティティはインストールされない COM+ アプリケーションに依存します。 ([2] [3] [4] [5])</String>
21 <String Id="msierrComPlusApplicationNotFound" Overridable="yes">COM+ アプリケーションは見つかりません。 ([2] [3] [4] [5])</String>
22 <String Id="msierrComPlusApplicationIdConflict" Overridable="yes">同一 ID を持つ COM+ アプリケーションが既に存在します。 ([2] [3] [4] [5])</String>
23 <String Id="msierrComPlusApplicationNameConflict" Overridable="yes">同一名称を持つ COM+ アプリケーションが既に存在します。 ([2] [3] [4] [5])</String>
24 <String Id="msierrComPlusApplicationRoleDependency" Overridable="yes">他のエンティティはインストールされない COM+ アプリケーション役割に依存します。 ([2] [3] [4] [5])</String>
25 <String Id="msierrComPlusApplicationRoleNotFound" Overridable="yes">COM+ アプリケーション役割は見つかりません。 ([2] [3] [4] [5])</String>
26 <String Id="msierrComPlusApplicationRoleConflict" Overridable="yes">同一名称を持つ COM+ アプリケーション役割が既に存在します。 ([2] [3] [4] [5])</String>
27 <String Id="msierrComPlusAssemblyDependency" Overridable="yes">他のエンティティはインストールされない COM+ アセンブリに依存します。 ([2] [3] [4] [5])</String>
28 <String Id="msierrComPlusSubscriptionIdConflict" Overridable="yes">同一 ID を持つ COM+ コンポーネントのイベント登録が既に存在します。 ([2] [3] [4] [5])</String>
29 <String Id="msierrComPlusSubscriptionNameConflict" Overridable="yes">同一名称を持つ COM+ コンポーネントのイベント登録が既に存在します。 ([2] [3] [4] [5])</String>
30 <String Id="msierrComPlusFailedLookupNames" Overridable="yes">ユーザー アカウント名の照合に失敗しました。 ([2] [3] [4] [5])</String>
31
32 <String Id="ComPlusInstallExecute" Overridable="yes">COM+ コンポーネントを登録しています</String>
33 <String Id="ComPlusUninstallExecute" Overridable="yes">COM+ コンポーネント登録を解除しています</String>
34
35 <String Id="CreateComPlusPartitions" Overridable="yes">COM+ パーティションを作成しています</String>
36 <String Id="CreateComPlusPartitionsTemplate" Overridable="yes">パーティション: [1]</String>
37 <String Id="RemoveComPlusPartitions" Overridable="yes">COM+ パーティションを削除しています</String>
38 <String Id="RemoveComPlusPartitionsTemplate" Overridable="yes">パーティション: [1]</String>
39 <String Id="AddUsersToComPlusPartitionRoles" Overridable="yes">ユーザーを COM+ パーティション役割に追加しています</String>
40 <String Id="AddUsersToComPlusPartitionRolesTemplate" Overridable="yes">役割: [1]</String>
41 <String Id="RemoveUsersFromComPlusPartitionRoles" Overridable="yes">ユーザを COM+ パーティション役割より削除しています</String>
42 <String Id="RemoveUsersFromComPlusPartitionRolesTemplate" Overridable="yes">役割: [1]</String>
43 <String Id="AddComPlusPartitionUsers" Overridable="yes">ユーザーのデフォルト COM+ 役割を設定しています</String>
44 <String Id="AddComPlusPartitionUsersTemplate" Overridable="yes">ユーザー: [1]</String>
45 <String Id="RemoveComPlusPartitionUsers" Overridable="yes">ユーザーのデフォルト COM+ パーティション役割を削除しています</String>
46 <String Id="RemoveComPlusPartitionUsersTemplate" Overridable="yes">ユーザー: [1]</String>
47 <String Id="CreateComPlusApplications" Overridable="yes">COM+ アプリケーションを作成しています</String>
48 <String Id="CreateComPlusApplicationsTemplate" Overridable="yes">アプリケーション: [1]</String>
49 <String Id="RemoveComPlusApplications" Overridable="yes">COM+ アプリケーションを削除しています</String>
50 <String Id="RemoveComPlusApplicationsTemplate" Overridable="yes">アプリケーション: [1]</String>
51 <String Id="CreateComPlusApplicationRoles" Overridable="yes">COM+ アプリケーション役割を作成しています</String>
52 <String Id="CreateComPlusApplicationRolesTemplate" Overridable="yes">役割: [1]</String>
53 <String Id="RemoveComPlusApplicationRoles" Overridable="yes">COM+ アプリケーション役割を削除しています</String>
54 <String Id="RemoveComPlusApplicationRolesTemplate" Overridable="yes">役割: [1]</String>
55 <String Id="AddUsersToComPlusApplicationRoles" Overridable="yes">ユーザーを COM+ アプリケーション役割に追加しています</String>
56 <String Id="AddUsersToComPlusApplicationRolesTemplate" Overridable="yes">ユーザー: [1]</String>
57 <String Id="RemoveUsersFromComPlusApplicationRoles" Overridable="yes">ユーザーを COM+ アプリケーション役割より削除しています</String>
58 <String Id="RemoveUsersFromComPlusApplicationRolesTemplate" Overridable="yes">ユーザー: [1]</String>
59 <String Id="RegisterComPlusAssemblies" Overridable="yes">COM+ コンポーネントを登録しています</String>
60 <String Id="RegisterComPlusAssembliesTemplate" Overridable="yes">DLL: [1]</String>
61 <String Id="UnregisterComPlusAssemblies" Overridable="yes">COM+ コンポーネント登録を解除しています</String>
62 <String Id="UnregisterComPlusAssembliesTemplate" Overridable="yes">DLL: [1]</String>
63 <String Id="AddComPlusRoleAssignments" Overridable="yes">COM+ コンポーネントへ役割を割り当てています</String>
64 <String Id="AddComPlusRoleAssignmentsTemplate" Overridable="yes">コンポーネント: [1]</String>
65 <String Id="RemoveComPlusRoleAssignments" Overridable="yes">COM+ コンポーネントより役割割当を削除しています</String>
66 <String Id="RemoveComPlusRoleAssignmentsTemplate" Overridable="yes">コンポーネント: [1]</String>
67 <String Id="CreateSubscriptionsComPlusComponents" Overridable="yes">COM+ コンポーネント用登録を作成しています</String>
68 <String Id="CreateSubscriptionsComPlusComponentsTemplate" Overridable="yes">登録: [1]</String>
69 <String Id="RemoveSubscriptionsComPlusComponents" Overridable="yes">COM+ コンポーネント用登録を削除しています</String>
70 <String Id="RemoveSubscriptionsComPlusComponentsTemplate" Overridable="yes">登録: [1]</String>
71</WixLocalization>
diff --git a/src/ext/Dependency/Dependency.wixext.sln b/src/ext/Dependency/Dependency.wixext.sln
new file mode 100644
index 00000000..e771ddf6
--- /dev/null
+++ b/src/ext/Dependency/Dependency.wixext.sln
@@ -0,0 +1,61 @@
1
2Microsoft Visual Studio Solution File, Format Version 12.00
3# Visual Studio Version 16
4VisualStudioVersion = 16.0.30204.135
5MinimumVisualStudioVersion = 10.0.40219.1
6Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "dependencyca", "src\ca\dependencyca.vcxproj", "{B86AF46C-0F90-49CC-923F-A800B088D015}"
7EndProject
8Project("{930C7802-8A8C-48F9-8165-68863BCCD9DD}") = "dependency", "src\wixlib\dependency.wixproj", "{58ED0EC8-73F8-4EE1-8664-A53486D38EC8}"
9EndProject
10Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WixToolset.Dependency.wixext", "src\wixext\WixToolset.Dependency.wixext.csproj", "{A0B6D3F1-AE5E-423B-BA92-60C9926CA498}"
11EndProject
12Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WixToolsetTest.Dependency", "src\test\WixToolsetTest.Dependency\WixToolsetTest.Dependency.csproj", "{E2AB6AA2-359D-4305-92B0-D90C8F87AF9B}"
13EndProject
14Global
15 GlobalSection(SolutionConfigurationPlatforms) = preSolution
16 Debug|Any CPU = Debug|Any CPU
17 Debug|x86 = Debug|x86
18 Release|Any CPU = Release|Any CPU
19 Release|x86 = Release|x86
20 EndGlobalSection
21 GlobalSection(ProjectConfigurationPlatforms) = postSolution
22 {B86AF46C-0F90-49CC-923F-A800B088D015}.Debug|Any CPU.ActiveCfg = Debug|Win32
23 {B86AF46C-0F90-49CC-923F-A800B088D015}.Debug|Any CPU.Build.0 = Debug|Win32
24 {B86AF46C-0F90-49CC-923F-A800B088D015}.Debug|x86.ActiveCfg = Debug|Win32
25 {B86AF46C-0F90-49CC-923F-A800B088D015}.Debug|x86.Build.0 = Debug|Win32
26 {B86AF46C-0F90-49CC-923F-A800B088D015}.Release|Any CPU.ActiveCfg = Release|Win32
27 {B86AF46C-0F90-49CC-923F-A800B088D015}.Release|Any CPU.Build.0 = Release|Win32
28 {B86AF46C-0F90-49CC-923F-A800B088D015}.Release|x86.ActiveCfg = Release|Win32
29 {B86AF46C-0F90-49CC-923F-A800B088D015}.Release|x86.Build.0 = Release|Win32
30 {58ED0EC8-73F8-4EE1-8664-A53486D38EC8}.Debug|Any CPU.ActiveCfg = Debug|x86
31 {58ED0EC8-73F8-4EE1-8664-A53486D38EC8}.Debug|Any CPU.Build.0 = Debug|x86
32 {58ED0EC8-73F8-4EE1-8664-A53486D38EC8}.Debug|x86.ActiveCfg = Debug|x86
33 {58ED0EC8-73F8-4EE1-8664-A53486D38EC8}.Debug|x86.Build.0 = Debug|x86
34 {58ED0EC8-73F8-4EE1-8664-A53486D38EC8}.Release|Any CPU.ActiveCfg = Release|x86
35 {58ED0EC8-73F8-4EE1-8664-A53486D38EC8}.Release|Any CPU.Build.0 = Release|x86
36 {58ED0EC8-73F8-4EE1-8664-A53486D38EC8}.Release|x86.ActiveCfg = Release|x86
37 {58ED0EC8-73F8-4EE1-8664-A53486D38EC8}.Release|x86.Build.0 = Release|x86
38 {A0B6D3F1-AE5E-423B-BA92-60C9926CA498}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
39 {A0B6D3F1-AE5E-423B-BA92-60C9926CA498}.Debug|Any CPU.Build.0 = Debug|Any CPU
40 {A0B6D3F1-AE5E-423B-BA92-60C9926CA498}.Debug|x86.ActiveCfg = Debug|Any CPU
41 {A0B6D3F1-AE5E-423B-BA92-60C9926CA498}.Debug|x86.Build.0 = Debug|Any CPU
42 {A0B6D3F1-AE5E-423B-BA92-60C9926CA498}.Release|Any CPU.ActiveCfg = Release|Any CPU
43 {A0B6D3F1-AE5E-423B-BA92-60C9926CA498}.Release|Any CPU.Build.0 = Release|Any CPU
44 {A0B6D3F1-AE5E-423B-BA92-60C9926CA498}.Release|x86.ActiveCfg = Release|Any CPU
45 {A0B6D3F1-AE5E-423B-BA92-60C9926CA498}.Release|x86.Build.0 = Release|Any CPU
46 {E2AB6AA2-359D-4305-92B0-D90C8F87AF9B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
47 {E2AB6AA2-359D-4305-92B0-D90C8F87AF9B}.Debug|Any CPU.Build.0 = Debug|Any CPU
48 {E2AB6AA2-359D-4305-92B0-D90C8F87AF9B}.Debug|x86.ActiveCfg = Debug|Any CPU
49 {E2AB6AA2-359D-4305-92B0-D90C8F87AF9B}.Debug|x86.Build.0 = Debug|Any CPU
50 {E2AB6AA2-359D-4305-92B0-D90C8F87AF9B}.Release|Any CPU.ActiveCfg = Release|Any CPU
51 {E2AB6AA2-359D-4305-92B0-D90C8F87AF9B}.Release|Any CPU.Build.0 = Release|Any CPU
52 {E2AB6AA2-359D-4305-92B0-D90C8F87AF9B}.Release|x86.ActiveCfg = Release|Any CPU
53 {E2AB6AA2-359D-4305-92B0-D90C8F87AF9B}.Release|x86.Build.0 = Release|Any CPU
54 EndGlobalSection
55 GlobalSection(SolutionProperties) = preSolution
56 HideSolutionNode = FALSE
57 EndGlobalSection
58 GlobalSection(ExtensibilityGlobals) = postSolution
59 SolutionGuid = {77F012B1-8E94-4F85-9450-066C6BD15000}
60 EndGlobalSection
61EndGlobal
diff --git a/src/ext/Dependency/Directory.Build.props b/src/ext/Dependency/Directory.Build.props
new file mode 100644
index 00000000..b3c6287c
--- /dev/null
+++ b/src/ext/Dependency/Directory.Build.props
@@ -0,0 +1,27 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3<!--
4 Do NOT modify this file. Update the canonical version in Home\repo-template\src\Directory.Build.props
5 then update all of the repos.
6-->
7<Project>
8 <PropertyGroup>
9 <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
10 <EnableSourceLink Condition=" '$(NCrunch)' == '1' ">false</EnableSourceLink>
11 <MSBuildWarningsAsMessages>MSB3246</MSBuildWarningsAsMessages>
12
13 <ProjectName Condition=" '$(ProjectName)' == '' ">$(MSBuildProjectName)</ProjectName>
14 <BaseOutputPath>$([System.IO.Path]::GetFullPath($(MSBuildThisFileDirectory)..\build\))</BaseOutputPath>
15 <BaseIntermediateOutputPath>$(BaseOutputPath)obj\$(ProjectName)\</BaseIntermediateOutputPath>
16 <OutputPath>$(BaseOutputPath)$(Configuration)\</OutputPath>
17
18 <Authors>WiX Toolset Team</Authors>
19 <Company>WiX Toolset</Company>
20 <Copyright>Copyright (c) .NET Foundation and contributors. All rights reserved.</Copyright>
21 <PackageLicenseExpression>MS-RL</PackageLicenseExpression>
22 <Product>WiX Toolset</Product>
23 </PropertyGroup>
24
25 <Import Project="Directory$(MSBuildProjectExtension).props" Condition=" Exists('Directory$(MSBuildProjectExtension).props') " />
26 <Import Project="Custom.Build.props" Condition=" Exists('Custom.Build.props') " />
27</Project>
diff --git a/src/ext/Dependency/Directory.Build.targets b/src/ext/Dependency/Directory.Build.targets
new file mode 100644
index 00000000..2fcc765a
--- /dev/null
+++ b/src/ext/Dependency/Directory.Build.targets
@@ -0,0 +1,51 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3<!--
4 Do NOT modify this file. Update the canonical version in Home\repo-template\src\Directory.Build.targets
5 then update all of the repos.
6-->
7<!--
8 Replace PackageReferences with ProjectReferences when the projects can be found in .sln.
9 See the original here: https://github.com/dotnet/sdk/issues/1151#issuecomment-385133284
10-->
11<Project>
12 <PropertyGroup>
13 <ReplacePackageReferences>true</ReplacePackageReferences>
14 <TheSolutionPath Condition=" '$(NCrunch)'=='' ">$(SolutionPath)</TheSolutionPath>
15 <TheSolutionPath Condition=" '$(NCrunch)'=='1' ">$(NCrunchOriginalSolutionPath)</TheSolutionPath>
16 </PropertyGroup>
17
18 <Choose>
19 <When Condition="$(ReplacePackageReferences) AND '$(TheSolutionPath)' != '' AND '$(TheSolutionPath)' != '*undefined*' AND Exists('$(TheSolutionPath)')">
20
21 <PropertyGroup>
22 <SolutionFileContent>$([System.IO.File]::ReadAllText($(TheSolutionPath)))</SolutionFileContent>
23 <SmartSolutionDir>$([System.IO.Path]::GetDirectoryName( $(TheSolutionPath) ))</SmartSolutionDir>
24 <RegexPattern>(?&lt;="[PackageName]", ")(.*)(?=", ")</RegexPattern>
25 </PropertyGroup>
26
27 <ItemGroup>
28 <!-- Keep the identity of the PackageReference -->
29 <SmartPackageReference Include="@(PackageReference)">
30 <PackageName>%(Identity)</PackageName>
31 <InSolution>$(SolutionFileContent.Contains('\%(Identity).csproj'))</InSolution>
32 </SmartPackageReference>
33
34 <!-- Filter them by mapping them to another ItemGroup using the WithMetadataValue item function -->
35 <PackageInSolution Include="@(SmartPackageReference->WithMetadataValue('InSolution', True))">
36 <Pattern>$(RegexPattern.Replace('[PackageName]','%(PackageName)') )</Pattern>
37 <SmartPath>$([System.Text.RegularExpressions.Regex]::Match('$(SolutionFileContent)', '%(Pattern)'))</SmartPath>
38 </PackageInSolution>
39
40 <ProjectReference Include="@(PackageInSolution->'$(SmartSolutionDir)\%(SmartPath)' )"/>
41
42 <!-- Remove the package references that are now referenced as projects -->
43 <PackageReference Remove="@(PackageInSolution->'%(PackageName)')"/>
44 </ItemGroup>
45
46 </When>
47 </Choose>
48
49 <Import Project="Directory$(MSBuildProjectExtension).targets" Condition=" Exists('Directory$(MSBuildProjectExtension).targets') " />
50 <Import Project="Custom.Build.targets" Condition=" Exists('Custom.Build.targets') " />
51</Project>
diff --git a/src/ext/Dependency/Directory.csproj.props b/src/ext/Dependency/Directory.csproj.props
new file mode 100644
index 00000000..81d24ad1
--- /dev/null
+++ b/src/ext/Dependency/Directory.csproj.props
@@ -0,0 +1,13 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2<!--
3 Do NOT modify this file. Update the canonical version in Home\repo-template\src\CSharp.Build.props
4 then update all of the repos.
5-->
6<Project>
7 <PropertyGroup>
8 <CheckForOverflowUnderflow>true</CheckForOverflowUnderflow>
9 <SignAssembly>true</SignAssembly>
10 <AssemblyOriginatorKeyFile>$([System.IO.Path]::GetFullPath($(MSBuildThisFileDirectory)wix.snk))</AssemblyOriginatorKeyFile>
11 <NBGV_EmitThisAssemblyClass>false</NBGV_EmitThisAssemblyClass>
12 </PropertyGroup>
13</Project>
diff --git a/src/ext/Dependency/Directory.csproj.targets b/src/ext/Dependency/Directory.csproj.targets
new file mode 100644
index 00000000..c3270426
--- /dev/null
+++ b/src/ext/Dependency/Directory.csproj.targets
@@ -0,0 +1,26 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2<!--
3 Do NOT modify this file. Update the canonical version in Home\repo-template\src\Directory.csproj.targets
4 then update all of the repos.
5-->
6<Project>
7 <PropertyGroup>
8 <CreateDocumentation Condition=" '$(CreateDocumentationFile)'!='true' ">false</CreateDocumentation>
9 <DocumentationFile Condition=" '$(CreateDocumentationFile)'=='true' ">$(OutputPath)\$(AssemblyName).xml</DocumentationFile>
10 </PropertyGroup>
11
12 <Target Name="SetNuspecProperties" DependsOnTargets="InitializeSourceControlInformation" AfterTargets="GetBuildVersion"
13 Condition=" Exists('$(MSBuildProjectName).nuspec') ">
14 <PropertyGroup>
15 <ProjectUrl Condition=" '$(ProjectUrl)'=='' and '$(PrivateRepositoryUrl)'!='' ">$(PrivateRepositoryUrl.Replace('.git',''))</ProjectUrl>
16
17 <NuspecFile>$(MSBuildProjectName).nuspec</NuspecFile>
18 <NuspecBasePath Condition=" '$(NuspecBasePath)'=='' ">$(OutputPath)..\</NuspecBasePath>
19 <NuspecProperties>$(NuspecProperties);Id=$(PackageId);Authors=$(Authors);Copyright=$(Copyright);Description=$(Description);Title=$(Title)</NuspecProperties>
20 <NuspecProperties>$(NuspecProperties);Version=$(PackageVersion);RepositoryCommit=$(SourceRevisionId);RepositoryType=$(RepositoryType);RepositoryUrl=$(PrivateRepositoryUrl);ProjectFolder=$(MSBuildProjectDirectory)\;ProjectUrl=$(ProjectUrl)</NuspecProperties>
21 <PublishRepositoryUrl>true</PublishRepositoryUrl>
22 <SymbolPackageFormat>snupkg</SymbolPackageFormat>
23 </PropertyGroup>
24 </Target>
25
26</Project>
diff --git a/src/ext/Dependency/Directory.vcxproj.props b/src/ext/Dependency/Directory.vcxproj.props
new file mode 100644
index 00000000..664bc1d8
--- /dev/null
+++ b/src/ext/Dependency/Directory.vcxproj.props
@@ -0,0 +1,93 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3
4<Project>
5 <PropertyGroup>
6 <Platform Condition=" '$(Platform)' == '' OR '$(Platform)' == 'AnyCPU' ">Win32</Platform>
7 <IntDir>$(BaseIntermediateOutputPath)$(Configuration)\$(Platform)\</IntDir>
8 <OutDir>$(OutputPath)$(Platform)\</OutDir>
9
10 <!-- NBGV properties -->
11 <AssemblyCompany>$(Company)</AssemblyCompany>
12 <AssemblyCopyright>$(Copyright)</AssemblyCopyright>
13
14 <RuntimeIdentifiers>win-x86;win-x64;win-arm64</RuntimeIdentifiers>
15 <NuGetTargetMoniker>native,Version=v0.0</NuGetTargetMoniker>
16 </PropertyGroup>
17
18 <PropertyGroup Condition="'$(WindowsTargetPlatformVersion)'=='' AND '$(VisualStudioVersion)'>='15.0'">
19 <WindowsTargetPlatformVersion>$([Microsoft.Build.Utilities.ToolLocationHelper]::GetLatestSDKTargetPlatformVersion('Windows', '10.0'))</WindowsTargetPlatformVersion>
20 </PropertyGroup>
21
22 <ItemDefinitionGroup>
23 <ClCompile>
24 <DisableSpecificWarnings>$(DisableSpecificCompilerWarnings)</DisableSpecificWarnings>
25 <WarningLevel>Level4</WarningLevel>
26 <AdditionalIncludeDirectories>$(ProjectDir)inc;$(MSBuildProjectDirectory);$(IntDir);$(SqlCESdkIncludePath);$(ProjectAdditionalIncludeDirectories);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
27 <PreprocessorDefinitions>WIN32;_WINDOWS;_WIN32_MSI=500;_WIN32_WINNT=0x0501;$(ArmPreprocessorDefinitions);$(UnicodePreprocessorDefinitions);_CRT_STDIO_LEGACY_WIDE_SPECIFIERS;_WINSOCK_DEPRECATED_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
28 <PrecompiledHeader>Use</PrecompiledHeader>
29 <PrecompiledHeaderFile>precomp.h</PrecompiledHeaderFile>
30 <CallingConvention Condition="'$(Platform)'=='Win32'">StdCall</CallingConvention>
31 <TreatWarningAsError>true</TreatWarningAsError>
32 <ExceptionHandling>false</ExceptionHandling>
33 <AdditionalOptions>-YlprecompDefine</AdditionalOptions>
34 <AdditionalOptions Condition=" $(PlatformToolset.StartsWith('v14')) ">/Zc:threadSafeInit- %(AdditionalOptions)</AdditionalOptions>
35 <MultiProcessorCompilation Condition=" $(NUMBER_OF_PROCESSORS) &gt; 4 ">true</MultiProcessorCompilation>
36 </ClCompile>
37 <ResourceCompile>
38 <PreprocessorDefinitions>$(ArmPreprocessorDefinitions);%(PreprocessorDefinitions)</PreprocessorDefinitions>
39 <AdditionalIncludeDirectories>$(ProjectAdditionalResourceIncludeDirectories);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
40 </ResourceCompile>
41 <Lib>
42 <AdditionalLibraryDirectories>$(OutDir);$(AdditionalMultiTargetLibraryPath);$(ProjectAdditionalLibraryDirectories);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
43 </Lib>
44 <Link>
45 <SubSystem>$(ProjectSubSystem)</SubSystem>
46 <ModuleDefinitionFile>$(ProjectModuleDefinitionFile)</ModuleDefinitionFile>
47 <NoEntryPoint>$(ResourceOnlyDll)</NoEntryPoint>
48 <GenerateDebugInformation>true</GenerateDebugInformation>
49 <AdditionalDependencies>$(ProjectAdditionalLinkLibraries);advapi32.lib;comdlg32.lib;user32.lib;oleaut32.lib;gdi32.lib;shell32.lib;ole32.lib;version.lib;%(AdditionalDependencies)</AdditionalDependencies>
50 <AdditionalLibraryDirectories>$(OutDir);$(AdditionalMultiTargetLibraryPath);$(ArmLibraryDirectories);$(ProjectAdditionalLinkLibraryDirectories);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
51 <AdditionalOptions Condition=" $(PlatformToolset.StartsWith('v14')) ">/IGNORE:4099 %(AdditionalOptions)</AdditionalOptions>
52 </Link>
53 </ItemDefinitionGroup>
54
55 <ItemDefinitionGroup Condition=" '$(Platform)'=='Win32' and '$(PlatformToolset)'!='v100'">
56 <ClCompile>
57 <EnableEnhancedInstructionSet>NoExtensions</EnableEnhancedInstructionSet>
58 </ClCompile>
59 </ItemDefinitionGroup>
60 <ItemDefinitionGroup Condition=" '$(Platform)'=='arm' ">
61 <ClCompile>
62 <CallingConvention>CDecl</CallingConvention>
63 </ClCompile>
64 </ItemDefinitionGroup>
65 <ItemDefinitionGroup Condition=" '$(ConfigurationType)'=='StaticLibrary' ">
66 <ClCompile>
67 <DebugInformationFormat>OldStyle</DebugInformationFormat>
68 <OmitDefaultLibName>true</OmitDefaultLibName>
69 <IgnoreAllDefaultLibraries>true</IgnoreAllDefaultLibraries>
70 </ClCompile>
71 </ItemDefinitionGroup>
72 <ItemDefinitionGroup Condition=" '$(Configuration)'=='Debug' ">
73 <ClCompile>
74 <Optimization>Disabled</Optimization>
75 <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
76 <PreprocessorDefinitions>_DEBUG;DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
77 <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
78 </ClCompile>
79 </ItemDefinitionGroup>
80 <ItemDefinitionGroup Condition=" '$(Configuration)'=='Release' ">
81 <ClCompile>
82 <Optimization>MinSpace</Optimization>
83 <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
84 <FunctionLevelLinking>true</FunctionLevelLinking>
85 <IntrinsicFunctions>true</IntrinsicFunctions>
86 <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
87 </ClCompile>
88 <Link>
89 <EnableCOMDATFolding>true</EnableCOMDATFolding>
90 <OptimizeReferences>true</OptimizeReferences>
91 </Link>
92 </ItemDefinitionGroup>
93</Project>
diff --git a/src/ext/Dependency/README.md b/src/ext/Dependency/README.md
new file mode 100644
index 00000000..09feba68
--- /dev/null
+++ b/src/ext/Dependency/README.md
@@ -0,0 +1,2 @@
1# Dependency.wixext
2WixToolset.Dependency.wixext - Dependency WiX Toolset Extension
diff --git a/src/ext/Dependency/appveyor.cmd b/src/ext/Dependency/appveyor.cmd
new file mode 100644
index 00000000..3450d535
--- /dev/null
+++ b/src/ext/Dependency/appveyor.cmd
@@ -0,0 +1,19 @@
1@setlocal
2@pushd %~dp0
3@set _C=Release
4@if /i "%1"=="debug" set _C=Debug
5
6:: Restore
7msbuild -p:Configuration=%_C% -t:Restore || exit /b
8
9:: Build
10msbuild -p:Configuration=%_C% src\test\WixToolsetTest.Dependency\WixToolsetTest.Dependency.csproj || exit /b
11
12:: Test
13dotnet test -c %_C% --no-build src\test\WixToolsetTest.Dependency || exit /b
14
15:: Pack
16msbuild -p:Configuration=%_C% -p:NoBuild=true -t:Pack src\wixext\WixToolset.Dependency.wixext.csproj || exit /b
17
18@popd
19@endlocal
diff --git a/src/ext/Dependency/appveyor.yml b/src/ext/Dependency/appveyor.yml
new file mode 100644
index 00000000..c53cc9cc
--- /dev/null
+++ b/src/ext/Dependency/appveyor.yml
@@ -0,0 +1,42 @@
1# Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2#
3# Do NOT modify this file. Update the canonical version in Home\repo-template\src\appveyor.yml
4# then update all of the repos.
5
6branches:
7 only:
8 - master
9 - develop
10
11image: Visual Studio 2019
12
13version: 0.0.0.{build}
14configuration: Release
15
16environment:
17 DOTNET_SKIP_FIRST_TIME_EXPERIENCE: true
18 DOTNET_CLI_TELEMETRY_OPTOUT: 1
19 NUGET_XMLDOC_MODE: skip
20
21build_script:
22 - appveyor.cmd
23
24pull_requests:
25 do_not_increment_build_number: true
26
27nuget:
28 disable_publish_on_pr: true
29
30skip_branch_with_pr: true
31skip_tags: true
32
33artifacts:
34- path: build\Release\**\*.nupkg
35 name: nuget
36- path: build\Release\**\*.snupkg
37 name: snupkg
38
39notifications:
40- provider: Slack
41 incoming_webhook:
42 secure: p5xuu+4x2JHfwGDMDe5KcG1k7gZxqYc4jWVwvyNZv5cvkubPD2waJs5yXMAXZNN7Z63/3PWHb7q4KoY/99AjauYa1nZ4c5qYqRPFRBKTHfA=
diff --git a/src/ext/Dependency/ca/custommsierrors.h b/src/ext/Dependency/ca/custommsierrors.h
new file mode 100644
index 00000000..26450452
--- /dev/null
+++ b/src/ext/Dependency/ca/custommsierrors.h
@@ -0,0 +1,5 @@
1#pragma once
2// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
3
4#define msierrDependencyMissingDependencies 26451
5#define msierrDependencyHasDependents 26452
diff --git a/src/ext/Dependency/ca/dependencyca.vcxproj b/src/ext/Dependency/ca/dependencyca.vcxproj
new file mode 100644
index 00000000..2a0760d6
--- /dev/null
+++ b/src/ext/Dependency/ca/dependencyca.vcxproj
@@ -0,0 +1,73 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3
4<Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
5 <ItemGroup Label="ProjectConfigurations">
6 <ProjectConfiguration Include="Debug|Win32">
7 <Configuration>Debug</Configuration>
8 <Platform>Win32</Platform>
9 </ProjectConfiguration>
10 <ProjectConfiguration Include="Release|Win32">
11 <Configuration>Release</Configuration>
12 <Platform>Win32</Platform>
13 </ProjectConfiguration>
14 <ProjectConfiguration Include="Debug|x64">
15 <Configuration>Debug</Configuration>
16 <Platform>x64</Platform>
17 </ProjectConfiguration>
18 <ProjectConfiguration Include="Release|x64">
19 <Configuration>Release</Configuration>
20 <Platform>x64</Platform>
21 </ProjectConfiguration>
22 <ProjectConfiguration Include="Debug|ARM64">
23 <Configuration>Debug</Configuration>
24 <Platform>ARM64</Platform>
25 </ProjectConfiguration>
26 <ProjectConfiguration Include="Release|ARM64">
27 <Configuration>Release</Configuration>
28 <Platform>ARM64</Platform>
29 </ProjectConfiguration>
30 </ItemGroup>
31
32 <PropertyGroup Label="Globals">
33 <ProjectGuid>{B86AF46C-0F90-49CC-923F-A800B088D015}</ProjectGuid>
34 <ConfigurationType>DynamicLibrary</ConfigurationType>
35 <PlatformToolset>v142</PlatformToolset>
36 <CharacterSet>Unicode</CharacterSet>
37 <TargetName>dependencyca</TargetName>
38 <ProjectModuleDefinitionFile>wixdepca.def</ProjectModuleDefinitionFile>
39 <Description>WiX Toolset Dependency CustomAction</Description>
40 <WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
41 </PropertyGroup>
42
43 <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
44 <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
45
46 <PropertyGroup>
47 <ProjectAdditionalLinkLibraries>msi.lib</ProjectAdditionalLinkLibraries>
48 </PropertyGroup>
49
50 <ItemGroup>
51 <ClCompile Include="dllmain.cpp">
52 <PrecompiledHeader>Create</PrecompiledHeader>
53 </ClCompile>
54 <ClCompile Include="wixdepca.cpp" />
55 </ItemGroup>
56
57 <ItemGroup>
58 <ClInclude Include="precomp.h" />
59 </ItemGroup>
60
61 <ItemGroup>
62 <None Include="wixdepca.def" />
63 </ItemGroup>
64
65 <ItemGroup>
66 <PackageReference Include="WixToolset.Dutil" Version="4.0.72" />
67 <PackageReference Include="WixToolset.WcaUtil" Version="4.0.19" />
68 <PackageReference Include="Microsoft.SourceLink.GitHub" Version="1.0.0" />
69 <PackageReference Include="Nerdbank.GitVersioning" Version="3.3.37" />
70 </ItemGroup>
71
72 <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
73</Project>
diff --git a/src/ext/Dependency/ca/dependencyca.vcxproj.filters b/src/ext/Dependency/ca/dependencyca.vcxproj.filters
new file mode 100644
index 00000000..bfe457e2
--- /dev/null
+++ b/src/ext/Dependency/ca/dependencyca.vcxproj.filters
@@ -0,0 +1,36 @@
1<?xml version="1.0" encoding="utf-8"?>
2<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
3 <ItemGroup>
4 <Filter Include="Source Files">
5 <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
6 <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
7 </Filter>
8 <Filter Include="Header Files">
9 <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
10 <Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions>
11 </Filter>
12 <Filter Include="Resource Files">
13 <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
14 <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
15 </Filter>
16 </ItemGroup>
17 <ItemGroup>
18 <ClCompile Include="wixdepca.cpp">
19 <Filter>Source Files</Filter>
20 </ClCompile>
21 <ClCompile Include="dllmain.cpp">
22 <Filter>Source Files</Filter>
23 </ClCompile>
24 </ItemGroup>
25 <ItemGroup>
26 <ClInclude Include="precomp.h">
27 <Filter>Header Files</Filter>
28 </ClInclude>
29 </ItemGroup>
30 <ItemGroup>
31 <None Include="wixdepca.def">
32 <Filter>Source Files</Filter>
33 </None>
34 <None Include="packages.config" />
35 </ItemGroup>
36</Project> \ No newline at end of file
diff --git a/src/ext/Dependency/ca/dllmain.cpp b/src/ext/Dependency/ca/dllmain.cpp
new file mode 100644
index 00000000..7d299feb
--- /dev/null
+++ b/src/ext/Dependency/ca/dllmain.cpp
@@ -0,0 +1,27 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3#include "precomp.h"
4
5/********************************************************************
6DllMain - standard entry point for all WiX custom actions.
7
8********************************************************************/
9extern "C" BOOL WINAPI DllMain(
10 IN HINSTANCE hInstance,
11 IN ULONG ulReason,
12 IN LPVOID)
13{
14 switch(ulReason)
15 {
16 case DLL_PROCESS_ATTACH:
17 WcaGlobalInitialize(hInstance);
18 ::DisableThreadLibraryCalls(hInstance);
19 break;
20
21 case DLL_PROCESS_DETACH:
22 WcaGlobalFinalize();
23 break;
24 }
25
26 return TRUE;
27}
diff --git a/src/ext/Dependency/ca/precomp.h b/src/ext/Dependency/ca/precomp.h
new file mode 100644
index 00000000..5fd06cff
--- /dev/null
+++ b/src/ext/Dependency/ca/precomp.h
@@ -0,0 +1,18 @@
1#pragma once
2// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
3
4
5#include <windows.h>
6#include <msiquery.h>
7#include <intsafe.h>
8#include <strsafe.h>
9
10#include "wcautil.h"
11#include "fileutil.h"
12#include "strutil.h"
13#include "memutil.h"
14#include "regutil.h"
15#include "dictutil.h"
16#include "deputil.h"
17
18#include "CustomMsiErrors.h"
diff --git a/src/ext/Dependency/ca/wixdepca.cpp b/src/ext/Dependency/ca/wixdepca.cpp
new file mode 100644
index 00000000..d6433707
--- /dev/null
+++ b/src/ext/Dependency/ca/wixdepca.cpp
@@ -0,0 +1,516 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3#include "precomp.h"
4
5#define IDNOACTION 0
6#define INITIAL_STRINGDICT_SIZE 4
7
8LPCWSTR vcsDependencyProviderQuery =
9 L"SELECT `WixDependencyProvider`.`WixDependencyProvider`, `WixDependencyProvider`.`Component_`, `WixDependencyProvider`.`ProviderKey`, `WixDependencyProvider`.`Attributes` "
10 L"FROM `WixDependencyProvider`";
11enum eDependencyProviderQuery { dpqId = 1, dpqComponent, dpqProviderKey, dpqAttributes };
12
13LPCWSTR vcsDependencyQuery =
14 L"SELECT `WixDependency`.`WixDependency`, `WixDependencyProvider`.`Component_`, `WixDependency`.`ProviderKey`, `WixDependency`.`MinVersion`, `WixDependency`.`MaxVersion`, `WixDependency`.`Attributes` "
15 L"FROM `WixDependencyProvider`, `WixDependency`, `WixDependencyRef` "
16 L"WHERE `WixDependency`.`WixDependency` = `WixDependencyRef`.`WixDependency_` AND `WixDependencyProvider`.`WixDependencyProvider` = `WixDependencyRef`.`WixDependencyProvider_`";
17enum eDependencyComponentQuery { dqId = 1, dqComponent, dqProviderKey, dqMinVersion, dqMaxVersion, dqAttributes };
18
19static HRESULT EnsureRequiredDependencies(
20 __in MSIHANDLE hInstall,
21 __in BOOL fMachineContext
22 );
23
24static HRESULT EnsureAbsentDependents(
25 __in MSIHANDLE hInstall,
26 __in BOOL fMachineContext
27 );
28
29static HRESULT SplitIgnoredDependents(
30 __deref_inout STRINGDICT_HANDLE* psdIgnoredDependents
31 );
32
33static HRESULT CreateDependencyRecord(
34 __in int iMessageId,
35 __in_ecount(cDependencies) const DEPENDENCY* rgDependencies,
36 __in UINT cDependencies,
37 __out MSIHANDLE *phRecord
38 );
39
40static LPCWSTR LogDependencyName(
41 __in_z LPCWSTR wzName
42 );
43
44/***************************************************************************
45 WixDependencyRequire - Checks that all required dependencies are installed.
46
47***************************************************************************/
48extern "C" UINT __stdcall WixDependencyRequire(
49 __in MSIHANDLE hInstall
50 )
51{
52 HRESULT hr = S_OK;
53 UINT er = ERROR_SUCCESS;
54 BOOL fMachineContext = FALSE;
55
56 hr = WcaInitialize(hInstall, "WixDependencyRequire");
57 ExitOnFailure(hr, "Failed to initialize.");
58
59 hr = RegInitialize();
60 ExitOnFailure(hr, "Failed to initialize the registry functions.");
61
62 // Determine whether we're installing per-user or per-machine.
63 fMachineContext = WcaIsPropertySet("ALLUSERS");
64
65 // Check for any provider components being (re)installed that their requirements are already installed.
66 hr = EnsureRequiredDependencies(hInstall, fMachineContext);
67 ExitOnFailure(hr, "Failed to ensure required dependencies for (re)installing components.");
68
69LExit:
70 RegUninitialize();
71
72 er = FAILED(hr) ? ERROR_INSTALL_FAILURE : ERROR_SUCCESS;
73 return WcaFinalize(er);
74}
75
76/***************************************************************************
77 WixDependencyCheck - Check dependencies based on component state.
78
79 Note: may return ERROR_NO_MORE_ITEMS to terminate the session early.
80***************************************************************************/
81extern "C" UINT __stdcall WixDependencyCheck(
82 __in MSIHANDLE hInstall
83 )
84{
85 HRESULT hr = S_OK;
86 UINT er = ERROR_SUCCESS;
87 BOOL fMachineContext = FALSE;
88
89 hr = WcaInitialize(hInstall, "WixDependencyCheck");
90 ExitOnFailure(hr, "Failed to initialize.");
91
92 hr = RegInitialize();
93 ExitOnFailure(hr, "Failed to initialize the registry functions.");
94
95 // Determine whether we're installing per-user or per-machine.
96 fMachineContext = WcaIsPropertySet("ALLUSERS");
97
98 // Check for any dependents of provider components being uninstalled.
99 hr = EnsureAbsentDependents(hInstall, fMachineContext);
100 ExitOnFailure(hr, "Failed to ensure absent dependents for uninstalling components.");
101
102LExit:
103 RegUninitialize();
104
105 er = FAILED(hr) ? ERROR_INSTALL_FAILURE : ERROR_SUCCESS;
106 return WcaFinalize(er);
107}
108
109/***************************************************************************
110 EnsureRequiredDependencies - Check that dependencies are installed for
111 any provider component that is being installed or reinstalled.
112
113 Note: Skipped if DISABLEDEPENDENCYCHECK is set.
114***************************************************************************/
115static HRESULT EnsureRequiredDependencies(
116 __in MSIHANDLE /*hInstall*/,
117 __in BOOL fMachineContext
118 )
119{
120 HRESULT hr = S_OK;
121 DWORD er = ERROR_SUCCESS;
122 STRINGDICT_HANDLE sdDependencies = NULL;
123 HKEY hkHive = NULL;
124 PMSIHANDLE hView = NULL;
125 PMSIHANDLE hRec = NULL;
126 LPWSTR sczId = NULL;
127 LPWSTR sczComponent = NULL;
128 LPWSTR sczProviderKey = NULL;
129 LPWSTR sczMinVersion = NULL;
130 LPWSTR sczMaxVersion = NULL;
131 int iAttributes = 0;
132 WCA_TODO tComponentAction = WCA_TODO_UNKNOWN;
133 DEPENDENCY* rgDependencies = NULL;
134 UINT cDependencies = 0;
135 PMSIHANDLE hDependencyRec = NULL;
136
137 // Skip the dependency check if the WixDependency table is missing (no dependencies to check for).
138 hr = WcaTableExists(L"WixDependency");
139 if (S_FALSE == hr)
140 {
141 WcaLog(LOGMSG_STANDARD, "Skipping the dependency check since no dependencies are authored.");
142 ExitFunction1(hr = S_OK);
143 }
144
145 // If the table exists but not the others, the database was not authored correctly.
146 ExitOnFailure(hr, "Failed to check if the WixDependency table exists.");
147
148 // Initialize the dictionary to keep track of unique dependency keys.
149 hr = DictCreateStringList(&sdDependencies, INITIAL_STRINGDICT_SIZE, DICT_FLAG_CASEINSENSITIVE);
150 ExitOnFailure(hr, "Failed to initialize the unique dependency string list.");
151
152 // Set the registry hive to use depending on install context.
153 hkHive = fMachineContext ? HKEY_LOCAL_MACHINE : HKEY_CURRENT_USER;
154
155 // Loop over the provider components.
156 hr = WcaOpenExecuteView(vcsDependencyQuery, &hView);
157 ExitOnFailure(hr, "Failed to open the query view for dependencies.");
158
159 while (S_OK == (hr = WcaFetchRecord(hView, &hRec)))
160 {
161 hr = WcaGetRecordString(hRec, dqId, &sczId);
162 ExitOnFailure(hr, "Failed to get WixDependency.WixDependency.");
163
164 hr = WcaGetRecordString(hRec, dqComponent, &sczComponent);
165 ExitOnFailure(hr, "Failed to get WixDependencyProvider.Component_.");
166
167 // Skip the current component if its not being installed or reinstalled.
168 tComponentAction = WcaGetComponentToDo(sczComponent);
169 if (WCA_TODO_INSTALL != tComponentAction && WCA_TODO_REINSTALL != tComponentAction)
170 {
171 WcaLog(LOGMSG_STANDARD, "Skipping dependency check for %ls because the component %ls is not being (re)installed.", sczId, sczComponent);
172 continue;
173 }
174
175 hr = WcaGetRecordString(hRec, dqProviderKey, &sczProviderKey);
176 ExitOnFailure(hr, "Failed to get WixDependency.ProviderKey.");
177
178 hr = WcaGetRecordString(hRec, dqMinVersion, &sczMinVersion);
179 ExitOnFailure(hr, "Failed to get WixDependency.MinVersion.");
180
181 hr = WcaGetRecordString(hRec, dqMaxVersion, &sczMaxVersion);
182 ExitOnFailure(hr, "Failed to get WixDependency.MaxVersion.");
183
184 hr = WcaGetRecordInteger(hRec, dqAttributes, &iAttributes);
185 ExitOnFailure(hr, "Failed to get WixDependency.Attributes.");
186
187 // Check the registry to see if the required providers (dependencies) exist.
188 hr = DepCheckDependency(hkHive, sczProviderKey, sczMinVersion, sczMaxVersion, iAttributes, sdDependencies, &rgDependencies, &cDependencies);
189 if (E_NOTFOUND != hr)
190 {
191 ExitOnFailure(hr, "Failed dependency check for %ls.", sczId);
192 }
193 }
194
195 if (E_NOMOREITEMS != hr)
196 {
197 ExitOnFailure(hr, "Failed to enumerate all of the rows in the dependency query view.");
198 }
199 else
200 {
201 hr = S_OK;
202 }
203
204 // If we collected any dependencies in the previous check, pump a message and prompt the user.
205 if (0 < cDependencies)
206 {
207 hr = CreateDependencyRecord(msierrDependencyMissingDependencies, rgDependencies, cDependencies, &hDependencyRec);
208 ExitOnFailure(hr, "Failed to create the dependency record for message %d.", msierrDependencyMissingDependencies);
209
210 // Send a yes/no message with a warning icon since continuing could be detrimental.
211 // This is sent as a USER message to better detect whether a user or dependency-aware bootstrapper is responding
212 // or if Windows Installer or a dependency-unaware boostrapper is returning a typical default response.
213 er = WcaProcessMessage(static_cast<INSTALLMESSAGE>(INSTALLMESSAGE_USER | MB_ICONWARNING | MB_YESNO | MB_DEFBUTTON2), hDependencyRec);
214 switch (er)
215 {
216 // Only a user or dependency-aware bootstrapper that prompted the user should return IDYES to continue anyway.
217 case IDYES:
218 ExitFunction1(hr = S_OK);
219
220 // Only a user or dependency-aware bootstrapper that prompted the user should return IDNO to terminate the operation.
221 case IDNO:
222 WcaSetReturnValue(ERROR_INSTALL_USEREXIT);
223 ExitFunction1(hr = S_OK);
224
225 // A dependency-aware bootstrapper should return IDCANCEL if running silently and the operation should be canceled.
226 case IDCANCEL:
227 __fallthrough;
228
229 // Bootstrappers which are not dependency-aware may return IDOK for unhandled messages.
230 case IDOK:
231 __fallthrough;
232
233 // Windows Installer returns 0 for USER messages when silent or passive, or when a bootstrapper does not handle the message.
234 case IDNOACTION:
235 WcaSetReturnValue(ERROR_INSTALL_FAILURE);
236 ExitFunction1(hr = S_OK);
237
238 default:
239 ExitOnFailure(hr = E_UNEXPECTED, "Unexpected message response %d from user or bootstrapper application.", er);
240 }
241 }
242
243LExit:
244 ReleaseDependencyArray(rgDependencies, cDependencies);
245 ReleaseStr(sczId);
246 ReleaseStr(sczComponent);
247 ReleaseStr(sczProviderKey);
248 ReleaseStr(sczMinVersion);
249 ReleaseStr(sczMaxVersion);
250 ReleaseDict(sdDependencies);
251
252 return hr;
253}
254
255/***************************************************************************
256 EnsureAbsentDependents - Checks that there are no dependents
257 registered for providers that are being uninstalled.
258
259 Note: Skipped if UPGRADINGPRODUCTCODE is set.
260***************************************************************************/
261static HRESULT EnsureAbsentDependents(
262 __in MSIHANDLE /*hInstall*/,
263 __in BOOL fMachineContext
264 )
265{
266 HRESULT hr = S_OK;
267 DWORD er = ERROR_SUCCESS;
268 STRINGDICT_HANDLE sdIgnoredDependents = NULL;
269 HKEY hkHive = NULL;
270 PMSIHANDLE hView = NULL;
271 PMSIHANDLE hRec = NULL;
272 LPWSTR sczId = NULL;
273 LPWSTR sczComponent = NULL;
274 LPWSTR sczProviderKey = NULL;
275 int iAttributes = 0;
276 WCA_TODO tComponentAction = WCA_TODO_UNKNOWN;
277 DEPENDENCY* rgDependents = NULL;
278 UINT cDependents = 0;
279 PMSIHANDLE hDependencyRec = NULL;
280
281 // Skip the dependent check if the WixDependencyProvider table is missing (no dependency providers).
282 hr = WcaTableExists(L"WixDependencyProvider");
283 if (S_FALSE == hr)
284 {
285 WcaLog(LOGMSG_STANDARD, "Skipping the dependents check since no dependency providers are authored.");
286 ExitFunction1(hr = S_OK);
287 }
288
289 ExitOnFailure(hr, "Failed to check if the WixDependencyProvider table exists.");
290
291 // Split the IGNOREDEPENDENCIES property for use below if set. If it is "ALL", then quit now.
292 hr = SplitIgnoredDependents(&sdIgnoredDependents);
293 ExitOnFailure(hr, "Failed to get the ignored dependents.");
294
295 hr = DictKeyExists(sdIgnoredDependents, L"ALL");
296 if (E_NOTFOUND != hr)
297 {
298 ExitOnFailure(hr, "Failed to check if \"ALL\" was set in IGNOREDEPENDENCIES.");
299
300 // Otherwise...
301 WcaLog(LOGMSG_STANDARD, "Skipping the dependencies check since IGNOREDEPENDENCIES contains \"ALL\".");
302 ExitFunction();
303 }
304 else
305 {
306 // Key was not found, so proceed.
307 hr = S_OK;
308 }
309
310 // Set the registry hive to use depending on install context.
311 hkHive = fMachineContext ? HKEY_LOCAL_MACHINE : HKEY_CURRENT_USER;
312
313 // Loop over the provider components.
314 hr = WcaOpenExecuteView(vcsDependencyProviderQuery, &hView);
315 ExitOnFailure(hr, "Failed to open the query view for dependency providers.");
316
317 while (S_OK == (hr = WcaFetchRecord(hView, &hRec)))
318 {
319 hr = WcaGetRecordString(hRec, dpqId, &sczId);
320 ExitOnFailure(hr, "Failed to get WixDependencyProvider.WixDependencyProvider.");
321
322 hr = WcaGetRecordString(hRec, dpqComponent, &sczComponent);
323 ExitOnFailure(hr, "Failed to get WixDependencyProvider.Component.");
324
325 // Skip the current component if its not being uninstalled.
326 tComponentAction = WcaGetComponentToDo(sczComponent);
327 if (WCA_TODO_UNINSTALL != tComponentAction)
328 {
329 WcaLog(LOGMSG_STANDARD, "Skipping dependents check for %ls because the component %ls is not being uninstalled.", sczId, sczComponent);
330 continue;
331 }
332
333 hr = WcaGetRecordString(hRec, dpqProviderKey, &sczProviderKey);
334 ExitOnFailure(hr, "Failed to get WixDependencyProvider.ProviderKey.");
335
336 hr = WcaGetRecordInteger(hRec, dpqAttributes, &iAttributes);
337 ExitOnFailure(hr, "Failed to get WixDependencyProvider.Attributes.");
338
339 // Check the registry to see if the provider has any dependents registered.
340 hr = DepCheckDependents(hkHive, sczProviderKey, iAttributes, sdIgnoredDependents, &rgDependents, &cDependents);
341 ExitOnFailure(hr, "Failed dependents check for %ls.", sczId);
342 }
343
344 if (E_NOMOREITEMS != hr)
345 {
346 ExitOnFailure(hr, "Failed to enumerate all of the rows in the dependency provider query view.");
347 }
348 else
349 {
350 hr = S_OK;
351 }
352
353 // If we collected any providers with dependents in the previous check, pump a message and prompt the user.
354 if (0 < cDependents)
355 {
356 hr = CreateDependencyRecord(msierrDependencyHasDependents, rgDependents, cDependents, &hDependencyRec);
357 ExitOnFailure(hr, "Failed to create the dependency record for message %d.", msierrDependencyHasDependents);
358
359 // Send a yes/no message with a warning icon since continuing could be detrimental.
360 // This is sent as a USER message to better detect whether a user or dependency-aware bootstrapper is responding
361 // or if Windows Installer or a dependency-unaware boostrapper is returning a typical default response.
362 er = WcaProcessMessage(static_cast<INSTALLMESSAGE>(INSTALLMESSAGE_USER | MB_ICONWARNING | MB_YESNO | MB_DEFBUTTON2), hDependencyRec);
363 switch (er)
364 {
365 // Only a user or dependency-aware bootstrapper that prompted the user should return IDYES to continue anyway.
366 case IDYES:
367 ExitFunction1(hr = S_OK);
368
369 // Only a user or dependency-aware bootstrapper that prompted the user should return IDNO to terminate the operation.
370 case IDNO:
371 __fallthrough;
372
373 // Bootstrappers which are not dependency-aware may return IDOK for unhandled messages.
374 case IDOK:
375 __fallthrough;
376
377 // Windows Installer returns 0 for USER messages when silent or passive, or when a bootstrapper does not handle the message.
378 case IDNOACTION:
379 WcaSetReturnValue(ERROR_NO_MORE_ITEMS);
380 ExitFunction1(hr = S_OK);
381
382 // A dependency-aware bootstrapper should return IDCANCEL if running silently and the operation should be canceled.
383 case IDCANCEL:
384 WcaSetReturnValue(ERROR_INSTALL_FAILURE);
385 ExitFunction1(hr = S_OK);
386
387 default:
388 hr = E_UNEXPECTED;
389 ExitOnFailure(hr, "Unexpected message response %d from user or bootstrapper application.", er);
390 }
391 }
392
393LExit:
394 ReleaseDependencyArray(rgDependents, cDependents);
395 ReleaseStr(sczId);
396 ReleaseStr(sczComponent);
397 ReleaseStr(sczProviderKey);
398
399 return hr;
400}
401
402/***************************************************************************
403 SplitIgnoredDependents - Splits the IGNOREDEPENDENCIES property into a map.
404
405***************************************************************************/
406static HRESULT SplitIgnoredDependents(
407 __deref_inout STRINGDICT_HANDLE* psdIgnoredDependents
408 )
409{
410 HRESULT hr = S_OK;
411 LPWSTR sczIgnoreDependencies = NULL;
412 LPCWSTR wzDelim = L";";
413 LPWSTR wzContext = NULL;
414
415 hr = WcaGetProperty(L"IGNOREDEPENDENCIES", &sczIgnoreDependencies);
416 ExitOnFailure(hr, "Failed to get the string value of the IGNOREDEPENDENCIES property.");
417
418 hr = DictCreateStringList(psdIgnoredDependents, INITIAL_STRINGDICT_SIZE, DICT_FLAG_CASEINSENSITIVE);
419 ExitOnFailure(hr, "Failed to create the string dictionary.");
420
421 // Parse through the semicolon-delimited tokens and add to the string dictionary.
422 for (LPCWSTR wzToken = ::wcstok_s(sczIgnoreDependencies, wzDelim, &wzContext); wzToken; wzToken = ::wcstok_s(NULL, wzDelim, &wzContext))
423 {
424 hr = DictAddKey(*psdIgnoredDependents, wzToken);
425 ExitOnFailure(hr, "Failed to ignored dependency \"%ls\" to the string dictionary.", wzToken);
426 }
427
428LExit:
429 ReleaseStr(sczIgnoreDependencies);
430
431 return hr;
432}
433
434/***************************************************************************
435 CreateDependencyRecord - Creates a record containing the message template
436 and records to send to the UI handler.
437
438 Notes: Callers should call WcaProcessMessage and handle return codes.
439***************************************************************************/
440static HRESULT CreateDependencyRecord(
441 __in int iMessageId,
442 __in_ecount(cDependencies) const DEPENDENCY* rgDependencies,
443 __in UINT cDependencies,
444 __out MSIHANDLE *phRecord
445 )
446{
447 HRESULT hr = S_OK;
448 UINT er = ERROR_SUCCESS;
449 UINT cParams = 0;
450 UINT iParam = 0;
451
452 // Should not be PMSIHANDLE.
453 MSIHANDLE hRec = NULL;
454
455 // Calculate the number of parameters based on the format:
456 // msgId, count, key1, name1, key2, name2, etc.
457 cParams = 2 + 2 * cDependencies;
458
459 hRec = ::MsiCreateRecord(cParams);
460 ExitOnNull(hRec, hr, E_OUTOFMEMORY, "Not enough memory to create the message record.");
461
462 er = ::MsiRecordSetInteger(hRec, ++iParam, iMessageId);
463 ExitOnFailure(hr = HRESULT_FROM_WIN32(er), "Failed to set the message identifier into the message record.");
464
465 er = ::MsiRecordSetInteger(hRec, ++iParam, cDependencies);
466 ExitOnFailure(hr = HRESULT_FROM_WIN32(er), "Failed to set the number of dependencies into the message record.");
467
468 // Now loop through each dependency and add the key and name to the record.
469 for (UINT i = 0; i < cDependencies; i++)
470 {
471 const DEPENDENCY* pDependency = &rgDependencies[i];
472
473 // Log message type-specific information.
474 switch (iMessageId)
475 {
476 // Send a user message when installing a component that is missing some dependencies.
477 case msierrDependencyMissingDependencies:
478 WcaLog(LOGMSG_VERBOSE, "The dependency \"%ls\" is missing or is not the required version.", pDependency->sczKey);
479 break;
480
481 // Send a user message when uninstalling a component that still has registered dependents.
482 case msierrDependencyHasDependents:
483 WcaLog(LOGMSG_VERBOSE, "Found dependent \"%ls\", name: \"%ls\".", pDependency->sczKey, LogDependencyName(pDependency->sczName));
484 break;
485 }
486
487 er = ::MsiRecordSetStringW(hRec, ++iParam, pDependency->sczKey);
488 ExitOnFailure(hr = HRESULT_FROM_WIN32(er), "Failed to set the dependency key \"%ls\" into the message record.", pDependency->sczKey);
489
490 er = ::MsiRecordSetStringW(hRec, ++iParam, pDependency->sczName);
491 ExitOnFailure(hr = HRESULT_FROM_WIN32(er), "Failed to set the dependency name \"%ls\" into the message record.", pDependency->sczName);
492 }
493
494 // Only assign the out parameter if successful to this point.
495 *phRecord = hRec;
496 hRec = NULL;
497
498LExit:
499 if (hRec)
500 {
501 ::MsiCloseHandle(hRec);
502 }
503
504 return hr;
505}
506
507/***************************************************************************
508 LogDependencyName - Returns the dependency name or "Unknown" if null.
509
510***************************************************************************/
511static LPCWSTR LogDependencyName(
512 __in_z LPCWSTR wzName
513 )
514{
515 return wzName ? wzName : L"Unknown";
516}
diff --git a/src/ext/Dependency/ca/wixdepca.def b/src/ext/Dependency/ca/wixdepca.def
new file mode 100644
index 00000000..651c6373
--- /dev/null
+++ b/src/ext/Dependency/ca/wixdepca.def
@@ -0,0 +1,8 @@
1; Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3
4LIBRARY "dependencyca"
5
6EXPORTS
7 WixDependencyRequire
8 WixDependencyCheck
diff --git a/src/ext/Dependency/nuget.config b/src/ext/Dependency/nuget.config
new file mode 100644
index 00000000..10ef488d
--- /dev/null
+++ b/src/ext/Dependency/nuget.config
@@ -0,0 +1,18 @@
1<?xml version="1.0" encoding="utf-8"?>
2<configuration>
3 <packageSources>
4 <clear />
5 <add key="wixtoolset-burn" value="https://ci.appveyor.com/nuget/wixtoolset-burn" />
6 <add key="wixtoolset-data" value="https://ci.appveyor.com/nuget/wixtoolset-data" />
7 <add key="wixtoolset-extensibility" value="https://ci.appveyor.com/nuget/wixtoolset-extensibility" />
8 <add key="wixtoolset-core" value="https://ci.appveyor.com/nuget/wixtoolset-core" />
9 <add key="wixtoolset-core-native" value="https://ci.appveyor.com/nuget/wixtoolset-core-native" />
10 <add key="wixtoolset-data" value="https://ci.appveyor.com/nuget/wixtoolset-data" />
11 <add key="wixtoolset-dtf" value="https://ci.appveyor.com/nuget/wixtoolset-dtf" />
12 <add key="wixtoolset-dutil" value="https://ci.appveyor.com/nuget/wixtoolset-dutil" />
13 <add key="wixtoolset-wcautil" value="https://ci.appveyor.com/nuget/wixtoolset-wcautil" />
14 <add key="wixtoolset-tools" value="https://ci.appveyor.com/nuget/wixtoolset-tools" />
15 <add key="wixbuildtools" value="https://ci.appveyor.com/nuget/wixbuildtools" />
16 <add key="api.nuget.org" value="https://api.nuget.org/v3/index.json" protocolVersion="3" />
17 </packageSources>
18</configuration> \ No newline at end of file
diff --git a/src/ext/Dependency/test/WixToolsetTest.Dependency/DependencyExtensionFixture.cs b/src/ext/Dependency/test/WixToolsetTest.Dependency/DependencyExtensionFixture.cs
new file mode 100644
index 00000000..708ae658
--- /dev/null
+++ b/src/ext/Dependency/test/WixToolsetTest.Dependency/DependencyExtensionFixture.cs
@@ -0,0 +1,38 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolsetTest.Dependency
4{
5 using System.Linq;
6 using System.Text.RegularExpressions;
7 using WixBuildTools.TestSupport;
8 using WixToolset.Core.TestPackage;
9 using WixToolset.Dependency;
10 using Xunit;
11
12 public class DependencyExtensionFixture
13 {
14 [Fact]
15 public void CanBuildUsingProvides()
16 {
17 var folder = TestData.Get(@"TestData\UsingProvides");
18 var build = new Builder(folder, typeof(DependencyExtensionFactory), new[] { folder });
19
20 var results = build.BuildAndQuery(Build, "CustomAction", "WixDependencyProvider")
21 .Select(r => Regex.Replace(r, "{[^}]*}", "{*}"))
22 .ToArray();
23 WixAssert.CompareLineByLine(new[]
24 {
25 "CustomAction:Wix4DependencyCheck_X86\t1\tDependencyCA_X86\tWixDependencyCheck\t",
26 "CustomAction:Wix4DependencyRequire_X86\t1\tDependencyCA_X86\tWixDependencyRequire\t",
27 "WixDependencyProvider:dep74OfIcniaqxA7EprRGBw4Oyy3r8\tfilF5_pLhBuF5b4N9XEo52g_hUM5Lo\tUsingProvides\t\t\t",
28 "WixDependencyProvider:depTpv28q7slcxvXPWmU4Z0GfbiI.4\tfilF5_pLhBuF5b4N9XEo52g_hUM5Lo\t{*}\t\t\t",
29 }, results);
30 }
31
32 private static void Build(string[] args)
33 {
34 var result = WixRunner.Execute(args)
35 .AssertSuccess();
36 }
37 }
38}
diff --git a/src/ext/Dependency/test/WixToolsetTest.Dependency/TestData/UsingProvides/Package.en-us.wxl b/src/ext/Dependency/test/WixToolsetTest.Dependency/TestData/UsingProvides/Package.en-us.wxl
new file mode 100644
index 00000000..38c12ac1
--- /dev/null
+++ b/src/ext/Dependency/test/WixToolsetTest.Dependency/TestData/UsingProvides/Package.en-us.wxl
@@ -0,0 +1,11 @@
1<?xml version="1.0" encoding="utf-8"?>
2
3<!--
4This file contains the declaration of all the localizable strings.
5-->
6<WixLocalization xmlns="http://wixtoolset.org/schemas/v4/wxl" Culture="en-US">
7
8 <String Id="DowngradeError">A newer version of [ProductName] is already installed.</String>
9 <String Id="FeatureTitle">MsiPackage</String>
10
11</WixLocalization>
diff --git a/src/ext/Dependency/test/WixToolsetTest.Dependency/TestData/UsingProvides/Package.wxs b/src/ext/Dependency/test/WixToolsetTest.Dependency/TestData/UsingProvides/Package.wxs
new file mode 100644
index 00000000..65984395
--- /dev/null
+++ b/src/ext/Dependency/test/WixToolsetTest.Dependency/TestData/UsingProvides/Package.wxs
@@ -0,0 +1,21 @@
1<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs"
2 xmlns:dep="http://wixtoolset.org/schemas/v4/wxs/dependency">
3 <Package Name="MsiPackage" Language="1033" Version="1.0.0.0" Manufacturer="Example Corporation" UpgradeCode="047730a5-30fe-4a62-a520-da9381b8226a" InstallerVersion="200">
4 <MajorUpgrade DowngradeErrorMessage="!(loc.DowngradeError)" />
5
6 <StandardDirectory Id="ProgramFilesFolder">
7 <Directory Id="INSTALLFOLDER" Name="MsiPackage" />
8 </StandardDirectory>
9
10 <Feature Id="ProductFeature" Title="!(loc.FeatureTitle)">
11 <Component Directory="INSTALLFOLDER">
12 <File Name="example.txt" Source="Package.wxs" />
13 <Provides Key="UsingProvides" dep:Check="yes" />
14 <Provides>
15 <Requires ProviderKey="UsingRequires" Minimum="1.0.0.0" dep:Enforce="yes" />
16 </Provides>
17 </Component>
18 </Feature>
19
20 </Package>
21</Wix>
diff --git a/src/ext/Dependency/test/WixToolsetTest.Dependency/WixToolsetTest.Dependency.csproj b/src/ext/Dependency/test/WixToolsetTest.Dependency/WixToolsetTest.Dependency.csproj
new file mode 100644
index 00000000..0b80dc83
--- /dev/null
+++ b/src/ext/Dependency/test/WixToolsetTest.Dependency/WixToolsetTest.Dependency.csproj
@@ -0,0 +1,39 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3
4<Project Sdk="Microsoft.NET.Sdk">
5 <PropertyGroup>
6 <TargetFramework>netcoreapp3.1</TargetFramework>
7 <DebugType>embedded</DebugType>
8 <IsPackable>false</IsPackable>
9 </PropertyGroup>
10
11 <PropertyGroup>
12 <NoWarn>NU1701</NoWarn>
13 </PropertyGroup>
14
15 <ItemGroup>
16 <Content Include="TestData\**" CopyToOutputDirectory="PreserveNewest" />
17 </ItemGroup>
18
19 <ItemGroup>
20 <ProjectReference Include="..\..\wixext\WixToolset.Dependency.wixext.csproj" />
21 </ItemGroup>
22
23 <ItemGroup>
24 <PackageReference Include="WixToolset.Core" Version="4.0.*" />
25 <PackageReference Include="WixToolset.Core.Burn" Version="4.0.*" />
26 <PackageReference Include="WixToolset.Core.WindowsInstaller" Version="4.0.*" />
27 <PackageReference Include="WixToolset.Core.TestPackage" Version="4.0.*" />
28 </ItemGroup>
29
30 <ItemGroup>
31 <PackageReference Include="WixBuildTools.TestSupport" Version="4.0.*" />
32 </ItemGroup>
33
34 <ItemGroup>
35 <PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.3.0" />
36 <PackageReference Include="xunit" Version="2.4.1" />
37 <PackageReference Include="xunit.runner.visualstudio" Version="2.4.1" PrivateAssets="All" />
38 </ItemGroup>
39</Project>
diff --git a/src/ext/Dependency/wix.snk b/src/ext/Dependency/wix.snk
new file mode 100644
index 00000000..3908a66a
--- /dev/null
+++ b/src/ext/Dependency/wix.snk
Binary files differ
diff --git a/src/ext/Dependency/wixext/DependencyCompiler.cs b/src/ext/Dependency/wixext/DependencyCompiler.cs
new file mode 100644
index 00000000..3d6c84a7
--- /dev/null
+++ b/src/ext/Dependency/wixext/DependencyCompiler.cs
@@ -0,0 +1,61 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Dependency
4{
5 using System.Collections.Generic;
6 using System.Xml.Linq;
7 using WixToolset.Data;
8 using WixToolset.Extensibility;
9 using WixToolset.Extensibility.Data;
10
11 /// <summary>
12 /// The compiler for the WiX Toolset Dependency Extension.
13 /// </summary>
14 public sealed class DependencyCompiler : BaseCompilerExtension
15 {
16 public override XNamespace Namespace => "http://wixtoolset.org/schemas/v4/wxs/dependency";
17
18 /// <summary>
19 /// Processes an attribute for the Compiler.
20 /// </summary>
21 /// <param name="sourceLineNumbers">Source line number for the parent element.</param>
22 /// <param name="parentElement">Parent element of attribute.</param>
23 /// <param name="attribute">Attribute to process.</param>
24 public override void ParseAttribute(Intermediate intermediate, IntermediateSection section, XElement parentElement, XAttribute attribute, IDictionary<string, string> context)
25 {
26 var sourceLineNumbers = this.ParseHelper.GetSourceLineNumbers(parentElement);
27 var addCheck = YesNoType.NotSet;
28 var addRequire = YesNoType.NotSet;
29
30 switch (parentElement.Name.LocalName)
31 {
32 case "Provides":
33 if (attribute.Name.LocalName == "Check" && parentElement.Parent?.Name.LocalName == "Component")
34 {
35 addCheck = this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attribute);
36 }
37 break;
38 case "Requires":
39 case "RequiresRef":
40 if (attribute.Name.LocalName == "Enforce" && parentElement.Parent?.Parent?.Name.LocalName == "Component")
41 {
42 addRequire = this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attribute);
43 }
44 break;
45 }
46
47 if (addCheck == YesNoType.NotSet && addRequire == YesNoType.NotSet)
48 {
49 this.ParseHelper.UnexpectedAttribute(parentElement, attribute);
50 }
51 else if (addCheck == YesNoType.Yes)
52 {
53 this.ParseHelper.CreateCustomActionReference(sourceLineNumbers, section, "Wix4DependencyCheck", this.Context.Platform, CustomActionPlatforms.X86 | CustomActionPlatforms.X64 | CustomActionPlatforms.ARM64);
54 }
55 else if (addRequire == YesNoType.Yes)
56 {
57 this.ParseHelper.CreateCustomActionReference(sourceLineNumbers, section, "Wix4DependencyRequire", this.Context.Platform, CustomActionPlatforms.X86 | CustomActionPlatforms.X64 | CustomActionPlatforms.ARM64);
58 }
59 }
60 }
61}
diff --git a/src/ext/Dependency/wixext/DependencyDecompiler.cs b/src/ext/Dependency/wixext/DependencyDecompiler.cs
new file mode 100644
index 00000000..31de3097
--- /dev/null
+++ b/src/ext/Dependency/wixext/DependencyDecompiler.cs
@@ -0,0 +1,347 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Dependency
4{
5#if TODO_CONSIDER_DECOMPILER
6 using System;
7 using System.Collections.Generic;
8 using System.Collections.ObjectModel;
9 using WixToolset;
10 using WixToolset.Data;
11 using WixToolset.Extensibility;
12 using WixToolset.Extensions.Serialize.Dependency;
13 using Dependency = WixToolset.Extensions.Serialize.Dependency;
14 using Wix = WixToolset.Data.Serialize;
15
16 /// <summary>
17 /// The decompiler for the WiX toolset dependency extension.
18 /// </summary>
19 public sealed class DependencyDecompiler : DecompilerExtension
20 {
21 private RegistryKeyValueCollection registryValues;
22 private Dictionary<string, string> keyCache;
23
24 /// <summary>
25 /// Creates a new instance of the <see cref="DependencyDecompiler"/> class.
26 /// </summary>
27 public DependencyDecompiler()
28 {
29 this.registryValues = new RegistryKeyValueCollection();
30 this.keyCache = new Dictionary<string, string>();
31
32 this.TableDefinitions = DependencyExtensionData.GetExtensionTableDefinitions();
33 }
34
35 /// <summary>
36 /// Get the extensions library to be removed.
37 /// </summary>
38 /// <param name="tableDefinitions">Table definitions for library.</param>
39 /// <returns>Library to remove from decompiled output.</returns>
40 public override Library GetLibraryToRemove(TableDefinitionCollection tableDefinitions)
41 {
42 return DependencyExtensionData.GetExtensionLibrary(tableDefinitions);
43 }
44
45 /// <summary>
46 /// Decompiles an extension table.
47 /// </summary>
48 /// <param name="table">The table to decompile.</param>
49 public override void DecompileTable(Table table)
50 {
51 switch (table.Name)
52 {
53 case "WixDependencyProvider":
54 this.DecompileWixDependencyProviderTable(table);
55 break;
56
57 case "WixDependency":
58 this.DecompileWixDependencyTable(table);
59 break;
60
61 case "WixDependencyRef":
62 this.DecompileWixDependencyRefTable(table);
63 break;
64
65 default:
66 base.DecompileTable(table);
67 break;
68 }
69 }
70
71 /// <summary>
72 /// Finalize decompilation by removing registry values that the compiler writes.
73 /// </summary>
74 /// <param name="tables">The collection of all tables.</param>
75 public override void Finish(TableIndexedCollection tables)
76 {
77 // Remove generated registry rows.
78 this.FinalizeRegistryTable(tables);
79
80 // Remove extension properties.
81 this.FinalizeProperties();
82 }
83
84 /// <summary>
85 /// Decompiles the WixDependencyProvider table.
86 /// </summary>
87 /// <param name="table">The table to decompile.</param>
88 private void DecompileWixDependencyProviderTable(Table table)
89 {
90 foreach (Row row in table.Rows)
91 {
92 Provides provides = new Provides();
93
94 provides.Id = (string)row[0];
95 provides.Key = (string)row[2];
96
97 if (null != row[3])
98 {
99 provides.Version = (string)row[3];
100 }
101
102 if (null != row[4])
103 {
104 provides.DisplayName = (string)row[4];
105 }
106
107 // Nothing to parse for attributes currently.
108
109 Wix.Component component = (Wix.Component)this.Core.GetIndexedElement("Component", (string)row[1]);
110 if (null != component)
111 {
112 component.AddChild(provides);
113 }
114 else
115 {
116 this.Core.OnMessage(WixWarnings.ExpectedForeignRow(row.SourceLineNumbers, table.Name, row.GetPrimaryKey(DecompilerConstants.PrimaryKeyDelimiter), "Component_", (string)row[1], "Component"));
117 }
118
119 // Index the provider to parent the RequiresRef elements.
120 this.Core.IndexElement(row, provides);
121
122 // Add the provider-specific registry keys to be removed during finalization.
123 // Only remove specific keys that the compiler writes.
124 string keyProvides = String.Concat(DependencyCommon.RegistryRoot, provides.Key);
125
126 this.registryValues.Add(keyProvides, null);
127 this.registryValues.Add(keyProvides, "Version");
128 this.registryValues.Add(keyProvides, "DisplayName");
129 this.registryValues.Add(keyProvides, "Attributes");
130
131 // Cache the provider key.
132 this.keyCache[provides.Id] = provides.Key;
133 }
134 }
135
136 /// <summary>
137 /// Decompiles the WixDependency table.
138 /// </summary>
139 /// <param name="table">The table to decompile.</param>
140 private void DecompileWixDependencyTable(Table table)
141 {
142 foreach (Row row in table.Rows)
143 {
144 Requires requires = new Requires();
145
146 requires.Id = (string)row[0];
147 requires.ProviderKey = (string)row[1];
148
149 if (null != row[2])
150 {
151 requires.Minimum = (string)row[2];
152 }
153
154 if (null != row[3])
155 {
156 requires.Maximum = (string)row[3];
157 }
158
159 if (null != row[4])
160 {
161 int attributes = (int)row[4];
162
163 if (0 != (attributes & DependencyCommon.RequiresAttributesMinVersionInclusive))
164 {
165 requires.IncludeMinimum = Dependency.YesNoType.yes;
166 }
167
168 if (0 != (attributes & DependencyCommon.RequiresAttributesMaxVersionInclusive))
169 {
170 requires.IncludeMaximum = Dependency.YesNoType.yes;
171 }
172 }
173
174 this.Core.RootElement.AddChild(requires);
175
176 // Cache the requires key.
177 this.keyCache[requires.Id] = requires.ProviderKey;
178 }
179 }
180
181 /// <summary>
182 /// Decompiles the WixDependencyRef table.
183 /// </summary>
184 /// <param name="table">The table to decompile.</param>
185 private void DecompileWixDependencyRefTable(Table table)
186 {
187 foreach (Row row in table.Rows)
188 {
189 RequiresRef requiresRef = new RequiresRef();
190
191 requiresRef.Id = (string)row[1];
192
193 Provides provides = (Provides)this.Core.GetIndexedElement("WixDependencyProvider", (string)row[0]);
194 if (null != provides)
195 {
196 provides.AddChild(requiresRef);
197 }
198 else
199 {
200 this.Core.OnMessage(WixWarnings.ExpectedForeignRow(row.SourceLineNumbers, table.Name, row.GetPrimaryKey(DecompilerConstants.PrimaryKeyDelimiter), "WixDependencyProvider_", (string)row[0], "WixDependencyProvider"));
201 }
202
203 // Get the cached keys for the provider and dependency IDs and generate registry rows.
204 string providesKey = null;
205 string requiresKey = null;
206
207 if (null != provides && this.keyCache.ContainsKey(provides.Id))
208 {
209 providesKey = this.keyCache[provides.Id];
210 }
211 else
212 {
213 this.Core.OnMessage(DependencyWarnings.ProvidesKeyNotFound(row.SourceLineNumbers, provides.Id));
214 }
215
216 if (this.keyCache.ContainsKey(requiresRef.Id))
217 {
218 requiresKey = this.keyCache[requiresRef.Id];
219 }
220 else
221 {
222 this.Core.OnMessage(DependencyWarnings.RequiresKeyNotFound(row.SourceLineNumbers, requiresRef.Id));
223 }
224
225 if (!this.Core.EncounteredError)
226 {
227 // Add the dependency-specific registry keys to be removed during finalization.
228 // Only remove specific keys that the compiler writes.
229 string keyRequires = String.Format(@"{0}{1}\{2}\{3}", DependencyCommon.RegistryRoot, requiresKey, DependencyCommon.RegistryDependents, providesKey);
230
231 this.registryValues.Add(keyRequires, "*");
232 this.registryValues.Add(keyRequires, "MinVersion");
233 this.registryValues.Add(keyRequires, "MaxVersion");
234 this.registryValues.Add(keyRequires, "Attributes");
235 }
236 }
237 }
238
239 /// <summary>
240 /// Removes rows from the Registry table that are generated by this extension.
241 /// </summary>
242 /// <param name="tables">The collection of tables.</param>
243 private void FinalizeRegistryTable(TableIndexedCollection tables)
244 {
245 Table registryTable = tables["Registry"];
246 if (null != registryTable)
247 {
248 foreach (Row registryRow in registryTable.Rows)
249 {
250 // Check if the compiler writes this registry value; if so, it should be removed.
251 if (this.registryValues.Contains(registryRow))
252 {
253 Wix.ISchemaElement elem = this.Core.GetIndexedElement(registryRow);
254
255 // If the registry row was found, remove it from its parent.
256 if (null != elem && null != elem.ParentElement)
257 {
258 Wix.IParentElement elemParent = elem.ParentElement as Wix.IParentElement;
259 if (null != elemParent)
260 {
261 elemParent.RemoveChild(elem);
262 }
263 }
264 }
265 }
266 }
267 }
268
269 /// <summary>
270 /// Removes properties defined by this extension.
271 /// </summary>
272 /// <param name="tables">The collection of tables.</param>
273 private void FinalizeProperties()
274 {
275 string[] properties = new string[] { "DISABLEDEPENDENCYCHECK", "IGNOREDEPENDENCIES" };
276 foreach (string property in properties)
277 {
278 Wix.Property elem = this.Core.GetIndexedElement("Property", property) as Wix.Property;
279 if (null != elem)
280 {
281 // If a value is defined, log a warning we're removing it.
282 if (!String.IsNullOrEmpty(elem.Value))
283 {
284 this.Core.OnMessage(DependencyWarnings.PropertyRemoved(elem.Id));
285 }
286
287 // If the property row was found, remove it from its parent.
288 if (null != elem.ParentElement)
289 {
290 Wix.IParentElement elemParent = elem.ParentElement as Wix.IParentElement;
291 if (null != elemParent)
292 {
293 elemParent.RemoveChild(elem);
294 }
295 }
296 }
297 }
298 }
299
300 /// <summary>
301 /// Provides an O(1) lookup for registry key and value name pairs for use in the decompiler.
302 /// </summary>
303 private sealed class RegistryKeyValueCollection : KeyedCollection<int, KeyValuePair<string, string>>
304 {
305 /// <summary>
306 /// Adds the registry key and value name pair to the collection if it doesn't already exist.
307 /// </summary>
308 /// <param name="key">The registry key to add.</param>
309 /// <param name="name">The registry value name to add.</param>
310 internal void Add(string key, string name)
311 {
312 KeyValuePair<string, string> pair = new KeyValuePair<string, string>(key, name);
313 if (!this.Contains(pair))
314 {
315 this.Add(pair);
316 }
317 }
318
319 /// <summary>
320 /// Returns whether the collection contains the registry key and value name pair from the <see cref="Row"/>.
321 /// </summary>
322 /// <param name="row">The registry <see cref="Row"/> to search for.</param>
323 /// <returns>True if the collection contains the registry key and value name pair from the <see cref="Row"/>; otherwise, false.</returns>
324 internal bool Contains(Row row)
325 {
326 if (null == row)
327 {
328 return false;
329 }
330
331 KeyValuePair<string, string> pair = new KeyValuePair<string, string>((string)row[2], (string)row[3]);
332 return this.Contains(pair);
333 }
334
335 /// <summary>
336 /// Return the hash code of the key and value pair concatenated with a colon as a delimiter.
337 /// </summary>
338 /// <param name="pair">The registry key and value name pair.</param>
339 /// <returns></returns>
340 protected override int GetKeyForItem(KeyValuePair<string, string> pair)
341 {
342 return String.Concat(pair.Key, ":", pair.Value).GetHashCode();
343 }
344 }
345 }
346#endif
347}
diff --git a/src/ext/Dependency/wixext/DependencyExtensionData.cs b/src/ext/Dependency/wixext/DependencyExtensionData.cs
new file mode 100644
index 00000000..2f30c2bf
--- /dev/null
+++ b/src/ext/Dependency/wixext/DependencyExtensionData.cs
@@ -0,0 +1,29 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Dependency
4{
5 using WixToolset.Data;
6 using WixToolset.Extensibility;
7
8 /// <summary>
9 /// The WiX Toolset Dependency Extension.
10 /// </summary>
11 public sealed class DependencyExtensionData : BaseExtensionData
12 {
13 /// <summary>
14 /// Gets the default culture.
15 /// </summary>
16 /// <value>The default culture.</value>
17 public override string DefaultCulture => "en-US";
18
19 /// <summary>
20 /// Gets the contained .wixlib content.
21 /// </summary>
22 /// <param name="symbolDefinitions">Strong typed symbold definitions.</param>
23 /// <returns>The .wixlib.</returns>
24 public override Intermediate GetLibrary(ISymbolDefinitionCreator symbolDefinitions)
25 {
26 return Intermediate.Load(typeof(DependencyExtensionData).Assembly, "WixToolset.Dependency.dependency.wixlib", symbolDefinitions);
27 }
28 }
29}
diff --git a/src/ext/Dependency/wixext/DependencyExtensionFactory.cs b/src/ext/Dependency/wixext/DependencyExtensionFactory.cs
new file mode 100644
index 00000000..413f99ae
--- /dev/null
+++ b/src/ext/Dependency/wixext/DependencyExtensionFactory.cs
@@ -0,0 +1,17 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Dependency
4{
5 using System;
6 using System.Collections.Generic;
7 using WixToolset.Extensibility;
8
9 public class DependencyExtensionFactory : BaseExtensionFactory
10 {
11 protected override IReadOnlyCollection<Type> ExtensionTypes => new[]
12 {
13 typeof(DependencyCompiler),
14 typeof(DependencyExtensionData),
15 };
16 }
17}
diff --git a/src/ext/Dependency/wixext/WixToolset.Dependency.wixext.csproj b/src/ext/Dependency/wixext/WixToolset.Dependency.wixext.csproj
new file mode 100644
index 00000000..b2663231
--- /dev/null
+++ b/src/ext/Dependency/wixext/WixToolset.Dependency.wixext.csproj
@@ -0,0 +1,32 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3
4<Project Sdk="Microsoft.NET.Sdk">
5 <PropertyGroup>
6 <TargetFramework>netstandard2.0</TargetFramework>
7 <DebugType>embedded</DebugType>
8 <RootNamespace>WixToolset.Dependency</RootNamespace>
9 <Description>WiX Toolset Dependency Extension</Description>
10 <Title>WiX Toolset Dependency Extension</Title>
11 <IsTool>true</IsTool>
12 <IncludeSymbols>true</IncludeSymbols>
13 </PropertyGroup>
14
15 <ItemGroup>
16 <EmbeddedResource Include="$(OutputPath)..\dependency.wixlib" />
17 </ItemGroup>
18
19 <ItemGroup>
20 <ProjectReference Include="..\wixlib\dependency.wixproj" ReferenceOutputAssembly="false" Condition=" '$(NCrunch)'=='' " />
21 </ItemGroup>
22
23 <ItemGroup>
24 <PackageReference Include="WixToolset.Data" Version="4.0.*" PrivateAssets="all" />
25 <PackageReference Include="WixToolset.Extensibility" Version="4.0.*" PrivateAssets="all" />
26 </ItemGroup>
27
28 <ItemGroup>
29 <PackageReference Include="Microsoft.SourceLink.GitHub" Version="1.0.0" PrivateAssets="all" />
30 <PackageReference Include="Nerdbank.GitVersioning" Version="3.3.37" PrivateAssets="all" />
31 </ItemGroup>
32</Project>
diff --git a/src/ext/Dependency/wixext/WixToolset.Dependency.wixext.nuspec b/src/ext/Dependency/wixext/WixToolset.Dependency.wixext.nuspec
new file mode 100644
index 00000000..ba3eaade
--- /dev/null
+++ b/src/ext/Dependency/wixext/WixToolset.Dependency.wixext.nuspec
@@ -0,0 +1,25 @@
1<?xml version="1.0"?>
2<package xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd">
3 <metadata minClientVersion="4.0">
4 <id>$id$</id>
5 <version>$version$</version>
6 <title>$title$</title>
7 <description>$description$</description>
8 <authors>$authors$</authors>
9 <license type="expression">MS-RL</license>
10 <requireLicenseAcceptance>false</requireLicenseAcceptance>
11 <copyright>$copyright$</copyright>
12 <projectUrl>$projectUrl$</projectUrl>
13 <repository type="$repositorytype$" url="$repositoryurl$" commit="$repositorycommit$" />
14 </metadata>
15
16 <files>
17 <file src="$projectFolder$$id$.targets" target="build" />
18
19 <file src="netstandard2.0\$id$.dll" target="tools" />
20
21 <file src="ARM64\*.pdb" target="pdbs\ARM64" />
22 <file src="x86\*.pdb" target="pdbs\x86" />
23 <file src="x64\*.pdb" target="pdbs\x64" />
24 </files>
25</package>
diff --git a/src/ext/Dependency/wixext/WixToolset.Dependency.wixext.targets b/src/ext/Dependency/wixext/WixToolset.Dependency.wixext.targets
new file mode 100644
index 00000000..2b298736
--- /dev/null
+++ b/src/ext/Dependency/wixext/WixToolset.Dependency.wixext.targets
@@ -0,0 +1,11 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3
4<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0">
5 <PropertyGroup>
6 <WixToolsetDependencyWixextPath Condition=" '$(WixToolsetDependencyWixextPath)' == '' ">$(MSBuildThisFileDirectory)..\tools\WixToolset.Dependency.wixext.dll</WixToolsetDependencyWixextPath>
7 </PropertyGroup>
8 <ItemGroup>
9 <WixExtension Include="$(WixToolsetDependencyWixextPath)" />
10 </ItemGroup>
11</Project>
diff --git a/src/ext/Dependency/wixlib/DependencyExtension.wxs b/src/ext/Dependency/wixlib/DependencyExtension.wxs
new file mode 100644
index 00000000..0516b18c
--- /dev/null
+++ b/src/ext/Dependency/wixlib/DependencyExtension.wxs
@@ -0,0 +1,21 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2
3
4<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
5 <?include caerr.wxi ?>
6
7 <Fragment>
8 <UI Id="WixDependencyErrors">
9 <Error Id="$(var.msierrDependencyMissingDependencies)" Message="!(loc.msierrDependencyMissingDependencies)" />
10 <Error Id="$(var.msierrDependencyHasDependents)" Message="!(loc.msierrDependencyHasDependents)" />
11 </UI>
12 </Fragment>
13
14 <Fragment>
15 <Property Id="DISABLEDEPENDENCYCHECK" Secure="yes" SuppressModularization="yes" />
16 </Fragment>
17
18 <Fragment>
19 <Property Id="IGNOREDEPENDENCIES" Secure="yes" SuppressModularization="yes" />
20 </Fragment>
21</Wix>
diff --git a/src/ext/Dependency/wixlib/DependencyExtension_Platform.wxi b/src/ext/Dependency/wixlib/DependencyExtension_Platform.wxi
new file mode 100644
index 00000000..9ab28ef3
--- /dev/null
+++ b/src/ext/Dependency/wixlib/DependencyExtension_Platform.wxi
@@ -0,0 +1,28 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2
3
4<Include xmlns="http://wixtoolset.org/schemas/v4/wxs">
5 <?include caDecor.wxi ?>
6
7 <Fragment>
8 <CustomAction Id="$(var.Prefix)DependencyRequire$(var.Suffix)" DllEntry="WixDependencyRequire" Execute="immediate" Return="check" SuppressModularization="yes" BinaryRef="DependencyCA$(var.Suffix)" />
9 <InstallExecuteSequence>
10 <Custom Action="$(var.Prefix)DependencyRequire$(var.Suffix)" Before="$(var.Prefix)DependencyCheck$(var.Suffix)" Overridable="yes" Condition="NOT DISABLEDEPENDENCYCHECK" />
11 </InstallExecuteSequence>
12 <UIRef Id="WixDependencyErrors" />
13 <PropertyRef Id="DISABLEDEPENDENCYCHECK" />
14 </Fragment>
15
16 <Fragment>
17 <CustomAction Id="$(var.Prefix)DependencyCheck$(var.Suffix)" DllEntry="WixDependencyCheck" Execute="immediate" Return="check" SuppressModularization="yes" BinaryRef="DependencyCA$(var.Suffix)" />
18 <InstallExecuteSequence>
19 <Custom Action="$(var.Prefix)DependencyCheck$(var.Suffix)" Before="InstallInitialize" Overridable="yes" Condition="(REMOVE OR MsiPatchRemovalList) AND NOT (UPGRADINGPRODUCTCODE OR IGNOREDEPENDENCIES=&quot;ALL&quot;)" />
20 </InstallExecuteSequence>
21 <UIRef Id="WixDependencyErrors" />
22 <PropertyRef Id="IGNOREDEPENDENCIES" />
23 </Fragment>
24
25 <Fragment>
26 <Binary Id="DependencyCA$(var.Suffix)" SourceFile="!(bindpath.$(var.platform))dependencyca.dll" />
27 </Fragment>
28</Include>
diff --git a/src/ext/Dependency/wixlib/DependencyExtension_arm64.wxs b/src/ext/Dependency/wixlib/DependencyExtension_arm64.wxs
new file mode 100644
index 00000000..958650e6
--- /dev/null
+++ b/src/ext/Dependency/wixlib/DependencyExtension_arm64.wxs
@@ -0,0 +1,7 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2
3
4<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
5 <?define platform=arm64 ?>
6 <?include DependencyExtension_Platform.wxi ?>
7</Wix>
diff --git a/src/ext/Dependency/wixlib/DependencyExtension_x64.wxs b/src/ext/Dependency/wixlib/DependencyExtension_x64.wxs
new file mode 100644
index 00000000..4fe458e8
--- /dev/null
+++ b/src/ext/Dependency/wixlib/DependencyExtension_x64.wxs
@@ -0,0 +1,7 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2
3
4<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
5 <?define platform=x64 ?>
6 <?include DependencyExtension_Platform.wxi ?>
7</Wix>
diff --git a/src/ext/Dependency/wixlib/DependencyExtension_x86.wxs b/src/ext/Dependency/wixlib/DependencyExtension_x86.wxs
new file mode 100644
index 00000000..d8ac6785
--- /dev/null
+++ b/src/ext/Dependency/wixlib/DependencyExtension_x86.wxs
@@ -0,0 +1,7 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2
3
4<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
5 <?define platform=x86 ?>
6 <?include DependencyExtension_Platform.wxi ?>
7</Wix>
diff --git a/src/ext/Dependency/wixlib/caDecor.wxi b/src/ext/Dependency/wixlib/caDecor.wxi
new file mode 100644
index 00000000..b1711518
--- /dev/null
+++ b/src/ext/Dependency/wixlib/caDecor.wxi
@@ -0,0 +1,39 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2
3
4<Include xmlns="http://wixtoolset.org/schemas/v4/wxs">
5 <?ifdef Prefix ?>
6 <?undef Prefix ?>
7 <?endif?>
8
9 <?define Prefix="Wix4" ?>
10
11 <?ifndef platform ?>
12 <?define platform="x86" ?>
13 <?endif?>
14
15 <?if $(var.platform)="" ?>
16 <?undef platform ?>
17 <?define platform="x86" ?>
18 <?endif?>
19
20 <?ifdef Suffix ?>
21 <?undef Suffix ?>
22 <?endif?>
23
24 <?if $(var.platform)~="x86" ?>
25 <?define Suffix="_X86" ?>
26 <?endif?>
27
28 <?if $(var.platform)~="x64" ?>
29 <?define Suffix="_X64" ?>
30 <?endif?>
31
32 <?if $(var.platform)~="arm" ?>
33 <?define Suffix="_A32" ?>
34 <?endif?>
35
36 <?if $(var.platform)~="arm64" ?>
37 <?define Suffix="_A64" ?>
38 <?endif?>
39</Include>
diff --git a/src/ext/Dependency/wixlib/caerr.wxi b/src/ext/Dependency/wixlib/caerr.wxi
new file mode 100644
index 00000000..ff7ec121
--- /dev/null
+++ b/src/ext/Dependency/wixlib/caerr.wxi
@@ -0,0 +1,96 @@
1<Include xmlns="http://wixtoolset.org/schemas/v4/wxs">
2 <?define msierrSecureObjectsFailedCreateSD = 25520?>
3 <?define msierrSecureObjectsFailedSet = 25521?>
4 <?define msierrSecureObjectsUnknownType = 25522?>
5 <?define msierrXmlFileFailedRead = 25530?>
6 <?define msierrXmlFileFailedOpen = 25531?>
7 <?define msierrXmlFileFailedSelect = 25532?>
8 <?define msierrXmlFileFailedSave = 25533?>
9 <?define msierrXmlConfigFailedRead = 25540?>
10 <?define msierrXmlConfigFailedOpen = 25541?>
11 <?define msierrXmlConfigFailedSelect = 25542?>
12 <?define msierrXmlConfigFailedSave = 25543?>
13 <?define msierrFirewallCannotConnect = 25580?>
14 <?define msierrIISCannotConnect = 26001?>
15 <?define msierrIISFailedReadWebSite = 26002?>
16 <?define msierrIISFailedReadWebDirs = 26003?>
17 <?define msierrIISFailedReadVDirs = 26004?>
18 <?define msierrIISFailedReadFilters = 26005?>
19 <?define msierrIISFailedReadAppPool = 26006?>
20 <?define msierrIISFailedReadMimeMap = 26007?>
21 <?define msierrIISFailedReadProp = 26008?>
22 <?define msierrIISFailedReadWebSvcExt = 26009?>
23 <?define msierrIISFailedReadWebError = 26010?>
24 <?define msierrIISFailedReadHttpHeader = 26011?>
25 <?define msierrIISFailedSchedTransaction = 26031?>
26 <?define msierrIISFailedSchedInstallWebs = 26032?>
27 <?define msierrIISFailedSchedInstallWebDirs = 26033?>
28 <?define msierrIISFailedSchedInstallVDirs = 26034?>
29 <?define msierrIISFailedSchedInstallFilters = 26035?>
30 <?define msierrIISFailedSchedInstallAppPool = 26036?>
31 <?define msierrIISFailedSchedInstallProp = 26037?>
32 <?define msierrIISFailedSchedInstallWebSvcExt = 26038?>
33 <?define msierrIISFailedSchedUninstallWebs = 26051?>
34 <?define msierrIISFailedSchedUninstallWebDirs = 26052?>
35 <?define msierrIISFailedSchedUninstallVDirs = 26053?>
36 <?define msierrIISFailedSchedUninstallFilters = 26054?>
37 <?define msierrIISFailedSchedUninstallAppPool = 26055?>
38 <?define msierrIISFailedSchedUninstallProp = 26056?>
39 <?define msierrIISFailedSchedUninstallWebSvcExt = 26057?>
40 <?define msierrIISFailedStartTransaction = 26101?>
41 <?define msierrIISFailedOpenKey = 26102?>
42 <?define msierrIISFailedCreateKey = 26103?>
43 <?define msierrIISFailedWriteData = 26104?>
44 <?define msierrIISFailedCreateApp = 26105?>
45 <?define msierrIISFailedDeleteKey = 26106?>
46 <?define msierrIISFailedDeleteApp = 26107?>
47 <?define msierrIISFailedDeleteValue = 26108?>
48 <?define msierrIISFailedCommitInUse = 26109?>
49 <?define msierrSQLFailedCreateDatabase = 26201?>
50 <?define msierrSQLFailedDropDatabase = 26202?>
51 <?define msierrSQLFailedConnectDatabase = 26203?>
52 <?define msierrSQLFailedExecString = 26204?>
53 <?define msierrSQLDatabaseAlreadyExists = 26205?>
54 <?define msierrPERFMONFailedRegisterDLL = 26251?>
55 <?define msierrPERFMONFailedUnregisterDLL = 26252?>
56 <?define msierrInstallPerfCounterData = 26253?>
57 <?define msierrUninstallPerfCounterData = 26254?>
58 <?define msierrSMBFailedCreate = 26301?>
59 <?define msierrSMBFailedDrop = 26302?>
60 <?define msierrCERTFailedOpen = 26351?>
61 <?define msierrCERTFailedAdd = 26352?>
62 <?define msierrUSRFailedUserCreate = 26401?>
63 <?define msierrUSRFailedUserCreatePswd = 26402?>
64 <?define msierrUSRFailedUserGroupAdd = 26403?>
65 <?define msierrUSRFailedUserCreateExists = 26404?>
66 <?define msierrUSRFailedGrantLogonAsService = 26405?>
67 <?define msierrDependencyMissingDependencies = 26451?>
68 <?define msierrDependencyHasDependents = 26452?>
69 <?define msierrDotNetRuntimeRequired = 27000?>
70 <?define msierrComPlusCannotConnect = 28001?>
71 <?define msierrComPlusPartitionReadFailed = 28002?>
72 <?define msierrComPlusPartitionRoleReadFailed = 28003?>
73 <?define msierrComPlusUserInPartitionRoleReadFailed = 28004?>
74 <?define msierrComPlusPartitionUserReadFailed = 28005?>
75 <?define msierrComPlusApplicationReadFailed = 28006?>
76 <?define msierrComPlusApplicationRoleReadFailed = 28007?>
77 <?define msierrComPlusUserInApplicationRoleReadFailed = 28008?>
78 <?define msierrComPlusAssembliesReadFailed = 28009?>
79 <?define msierrComPlusSubscriptionReadFailed = 28010?>
80 <?define msierrComPlusPartitionDependency = 28011?>
81 <?define msierrComPlusPartitionNotFound = 28012?>
82 <?define msierrComPlusPartitionIdConflict = 28013?>
83 <?define msierrComPlusPartitionNameConflict = 28014?>
84 <?define msierrComPlusApplicationDependency = 28015?>
85 <?define msierrComPlusApplicationNotFound = 28016?>
86 <?define msierrComPlusApplicationIdConflict = 28017?>
87 <?define msierrComPlusApplicationNameConflict = 28018?>
88 <?define msierrComPlusApplicationRoleDependency = 28019?>
89 <?define msierrComPlusApplicationRoleNotFound = 28020?>
90 <?define msierrComPlusApplicationRoleConflict = 28021?>
91 <?define msierrComPlusAssemblyDependency = 28022?>
92 <?define msierrComPlusSubscriptionIdConflict = 28023?>
93 <?define msierrComPlusSubscriptionNameConflict = 28024?>
94 <?define msierrComPlusFailedLookupNames = 28025?>
95 <?define msierrMsmqCannotConnect = 28101?>
96</Include> \ No newline at end of file
diff --git a/src/ext/Dependency/wixlib/dependency.wixproj b/src/ext/Dependency/wixlib/dependency.wixproj
new file mode 100644
index 00000000..76e3ecd3
--- /dev/null
+++ b/src/ext/Dependency/wixlib/dependency.wixproj
@@ -0,0 +1,30 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3
4<Project Sdk="WixToolset.Sdk">
5
6 <PropertyGroup>
7 <OutputType>Library</OutputType>
8 <BindFiles>true</BindFiles>
9 <!-- PropertyModularizationSuppressed -->
10 <SuppressSpecificWarnings>1086</SuppressSpecificWarnings>
11 <Cultures>en-us</Cultures>
12 </PropertyGroup>
13
14 <ItemGroup>
15 <BindInputPaths Include="$(OutputPath)x86" BindName='x86' />
16 <BindInputPaths Include="$(OutputPath)x64" BindName='x64' />
17 <BindInputPaths Include="$(OutputPath)arm64" BindName='arm64' />
18 </ItemGroup>
19
20 <ItemGroup>
21 <ProjectReference Include="..\ca\dependencyca.vcxproj" Properties="Platform=ARM64" ReferenceOutputAssembly="false" />
22 <ProjectReference Include="..\ca\dependencyca.vcxproj" Properties="Platform=x86" ReferenceOutputAssembly="false" />
23 <ProjectReference Include="..\ca\dependencyca.vcxproj" Properties="Platform=x64" ReferenceOutputAssembly="false" />
24 </ItemGroup>
25
26 <ItemGroup>
27 <PackageReference Include="Nerdbank.GitVersioning" Version="3.3.37" PrivateAssets="All" />
28 </ItemGroup>
29
30</Project>
diff --git a/src/ext/Dependency/wixlib/en-us.wxl b/src/ext/Dependency/wixlib/en-us.wxl
new file mode 100644
index 00000000..6ad7d63d
--- /dev/null
+++ b/src/ext/Dependency/wixlib/en-us.wxl
@@ -0,0 +1,7 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2
3
4<WixLocalization Culture="en-US" xmlns="http://wixtoolset.org/schemas/v4/wxl">
5 <String Id="msierrDependencyMissingDependencies" Overridable="yes">If you continue with this install, the product may not work properly because [2] or more dependencies are missing. Do you want to continue with this install anyway?</String>
6 <String Id="msierrDependencyHasDependents" Overridable="yes">If you continue with this uninstall, [2] or more products may stop working properly. Do you want to continue with this uninstall anyway?</String>
7</WixLocalization>
diff --git a/src/ext/DifxApp/CSharp.Build.props b/src/ext/DifxApp/CSharp.Build.props
new file mode 100644
index 00000000..b12f4c6e
--- /dev/null
+++ b/src/ext/DifxApp/CSharp.Build.props
@@ -0,0 +1,11 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2<!--
3 Do NOT modify this file. Update the canonical version in Home\repo-template\src\CSharp.Build.props
4 then update all of the repos.
5-->
6<Project>
7 <PropertyGroup>
8 <SignAssembly>true</SignAssembly>
9 <AssemblyOriginatorKeyFile>$([System.IO.Path]::GetFullPath($(MSBuildThisFileDirectory)wix.snk))</AssemblyOriginatorKeyFile>
10 </PropertyGroup>
11</Project>
diff --git a/src/ext/DifxApp/DifxApp.wixext.sln b/src/ext/DifxApp/DifxApp.wixext.sln
new file mode 100644
index 00000000..2b891405
--- /dev/null
+++ b/src/ext/DifxApp/DifxApp.wixext.sln
@@ -0,0 +1,63 @@
1
2Microsoft Visual Studio Solution File, Format Version 12.00
3# Visual Studio Version 16
4VisualStudioVersion = 16.0.30611.23
5MinimumVisualStudioVersion = 15.0.26124.0
6Project("{930C7802-8A8C-48F9-8165-68863BCCD9DD}") = "difxapp", "src\wixlib\difxapp.wixproj", "{5066EB93-D8F7-4FAE-B687-024D7A81BD95}"
7EndProject
8Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WixToolset.DifxApp.wixext", "src\wixext\WixToolset.DifxApp.wixext.csproj", "{2256EFD7-E678-4485-818D-986D590068BE}"
9EndProject
10Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WixToolsetTest.DifxApp", "src\test\WixToolsetTest.DifxApp\WixToolsetTest.DifxApp.csproj", "{883D7BA3-1ADC-47AC-95B0-221BB0B7788D}"
11EndProject
12Global
13 GlobalSection(SolutionConfigurationPlatforms) = preSolution
14 Debug|Any CPU = Debug|Any CPU
15 Debug|x64 = Debug|x64
16 Debug|x86 = Debug|x86
17 Release|Any CPU = Release|Any CPU
18 Release|x64 = Release|x64
19 Release|x86 = Release|x86
20 EndGlobalSection
21 GlobalSection(ProjectConfigurationPlatforms) = postSolution
22 {5066EB93-D8F7-4FAE-B687-024D7A81BD95}.Debug|Any CPU.ActiveCfg = Debug|x86
23 {5066EB93-D8F7-4FAE-B687-024D7A81BD95}.Debug|Any CPU.Build.0 = Debug|x86
24 {5066EB93-D8F7-4FAE-B687-024D7A81BD95}.Debug|x64.ActiveCfg = Debug|x86
25 {5066EB93-D8F7-4FAE-B687-024D7A81BD95}.Debug|x86.ActiveCfg = Debug|x86
26 {5066EB93-D8F7-4FAE-B687-024D7A81BD95}.Debug|x86.Build.0 = Debug|x86
27 {5066EB93-D8F7-4FAE-B687-024D7A81BD95}.Release|Any CPU.ActiveCfg = Release|x86
28 {5066EB93-D8F7-4FAE-B687-024D7A81BD95}.Release|Any CPU.Build.0 = Release|x86
29 {5066EB93-D8F7-4FAE-B687-024D7A81BD95}.Release|x64.ActiveCfg = Release|x86
30 {5066EB93-D8F7-4FAE-B687-024D7A81BD95}.Release|x86.ActiveCfg = Release|x86
31 {5066EB93-D8F7-4FAE-B687-024D7A81BD95}.Release|x86.Build.0 = Release|x86
32 {2256EFD7-E678-4485-818D-986D590068BE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
33 {2256EFD7-E678-4485-818D-986D590068BE}.Debug|Any CPU.Build.0 = Debug|Any CPU
34 {2256EFD7-E678-4485-818D-986D590068BE}.Debug|x64.ActiveCfg = Debug|Any CPU
35 {2256EFD7-E678-4485-818D-986D590068BE}.Debug|x64.Build.0 = Debug|Any CPU
36 {2256EFD7-E678-4485-818D-986D590068BE}.Debug|x86.ActiveCfg = Debug|Any CPU
37 {2256EFD7-E678-4485-818D-986D590068BE}.Debug|x86.Build.0 = Debug|Any CPU
38 {2256EFD7-E678-4485-818D-986D590068BE}.Release|Any CPU.ActiveCfg = Release|Any CPU
39 {2256EFD7-E678-4485-818D-986D590068BE}.Release|Any CPU.Build.0 = Release|Any CPU
40 {2256EFD7-E678-4485-818D-986D590068BE}.Release|x64.ActiveCfg = Release|Any CPU
41 {2256EFD7-E678-4485-818D-986D590068BE}.Release|x64.Build.0 = Release|Any CPU
42 {2256EFD7-E678-4485-818D-986D590068BE}.Release|x86.ActiveCfg = Release|Any CPU
43 {2256EFD7-E678-4485-818D-986D590068BE}.Release|x86.Build.0 = Release|Any CPU
44 {883D7BA3-1ADC-47AC-95B0-221BB0B7788D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
45 {883D7BA3-1ADC-47AC-95B0-221BB0B7788D}.Debug|Any CPU.Build.0 = Debug|Any CPU
46 {883D7BA3-1ADC-47AC-95B0-221BB0B7788D}.Debug|x64.ActiveCfg = Debug|Any CPU
47 {883D7BA3-1ADC-47AC-95B0-221BB0B7788D}.Debug|x64.Build.0 = Debug|Any CPU
48 {883D7BA3-1ADC-47AC-95B0-221BB0B7788D}.Debug|x86.ActiveCfg = Debug|Any CPU
49 {883D7BA3-1ADC-47AC-95B0-221BB0B7788D}.Debug|x86.Build.0 = Debug|Any CPU
50 {883D7BA3-1ADC-47AC-95B0-221BB0B7788D}.Release|Any CPU.ActiveCfg = Release|Any CPU
51 {883D7BA3-1ADC-47AC-95B0-221BB0B7788D}.Release|Any CPU.Build.0 = Release|Any CPU
52 {883D7BA3-1ADC-47AC-95B0-221BB0B7788D}.Release|x64.ActiveCfg = Release|Any CPU
53 {883D7BA3-1ADC-47AC-95B0-221BB0B7788D}.Release|x64.Build.0 = Release|Any CPU
54 {883D7BA3-1ADC-47AC-95B0-221BB0B7788D}.Release|x86.ActiveCfg = Release|Any CPU
55 {883D7BA3-1ADC-47AC-95B0-221BB0B7788D}.Release|x86.Build.0 = Release|Any CPU
56 EndGlobalSection
57 GlobalSection(SolutionProperties) = preSolution
58 HideSolutionNode = FALSE
59 EndGlobalSection
60 GlobalSection(ExtensibilityGlobals) = postSolution
61 SolutionGuid = {60A3EA0F-9313-47F8-BF6B-74478A57B577}
62 EndGlobalSection
63EndGlobal
diff --git a/src/ext/DifxApp/Directory.Build.props b/src/ext/DifxApp/Directory.Build.props
new file mode 100644
index 00000000..f83cc154
--- /dev/null
+++ b/src/ext/DifxApp/Directory.Build.props
@@ -0,0 +1,29 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3<!--
4 Do NOT modify this file. Update the canonical version in Home\repo-template\src\Directory.Build.props
5 then update all of the repos.
6-->
7<Project>
8 <PropertyGroup>
9 <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
10 <EnableSourceLink Condition=" '$(NCrunch)' == '1' ">false</EnableSourceLink>
11 <MSBuildWarningsAsMessages>MSB3246</MSBuildWarningsAsMessages>
12
13 <ProjectName Condition=" '$(ProjectName)' == '' ">$(MSBuildProjectName)</ProjectName>
14 <BaseOutputPath>$([System.IO.Path]::GetFullPath($(MSBuildThisFileDirectory)..\build\))</BaseOutputPath>
15 <BaseIntermediateOutputPath>$(BaseOutputPath)obj\$(ProjectName)\</BaseIntermediateOutputPath>
16 <OutputPath>$(BaseOutputPath)$(Configuration)\</OutputPath>
17
18 <Authors>WiX Toolset Team</Authors>
19 <Company>WiX Toolset</Company>
20 <Copyright>Copyright (c) .NET Foundation and contributors. All rights reserved.</Copyright>
21 <PackageLicenseExpression>MS-RL</PackageLicenseExpression>
22 <Product>WiX Toolset</Product>
23 </PropertyGroup>
24
25 <Import Project="CSharp.Build.props" Condition=" '$(MSBuildProjectExtension)'=='.csproj' and Exists('CSharp.Build.props') " />
26 <Import Project="Cpp.Build.props" Condition=" Exists('Cpp.Build.props') And '$(MSBuildProjectExtension)'=='.vcxproj' " />
27 <Import Project="Wix.Build.props" Condition=" Exists('Wix.Build.props') And '$(MSBuildProjectExtension)'=='.wixproj' " />
28 <Import Project="Custom.Build.props" Condition=" Exists('Custom.Build.props') " />
29</Project>
diff --git a/src/ext/DifxApp/Directory.Build.targets b/src/ext/DifxApp/Directory.Build.targets
new file mode 100644
index 00000000..dac7452a
--- /dev/null
+++ b/src/ext/DifxApp/Directory.Build.targets
@@ -0,0 +1,48 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3<!--
4 Do NOT modify this file. Update the canonical version in Home\repo-template\src\Directory.Build.targets
5 then update all of the repos.
6-->
7<!--
8 Replace PackageReferences with ProjectReferences when the projects can be found in .sln.
9 See the original here: https://github.com/dotnet/sdk/issues/1151#issuecomment-385133284
10-->
11<Project>
12 <PropertyGroup>
13 <ReplacePackageReferences>true</ReplacePackageReferences>
14 <TheSolutionPath Condition=" '$(NCrunch)'=='' ">$(SolutionPath)</TheSolutionPath>
15 <TheSolutionPath Condition=" '$(NCrunch)'=='1' ">$(NCrunchOriginalSolutionPath)</TheSolutionPath>
16 </PropertyGroup>
17
18 <Choose>
19 <When Condition="$(ReplacePackageReferences) AND '$(TheSolutionPath)' != '' AND '$(TheSolutionPath)' != '*undefined*' AND Exists('$(TheSolutionPath)')">
20
21 <PropertyGroup>
22 <SolutionFileContent>$([System.IO.File]::ReadAllText($(TheSolutionPath)))</SolutionFileContent>
23 <SmartSolutionDir>$([System.IO.Path]::GetDirectoryName( $(TheSolutionPath) ))</SmartSolutionDir>
24 <RegexPattern>(?&lt;="[PackageName]", ")(.*)(?=", ")</RegexPattern>
25 </PropertyGroup>
26
27 <ItemGroup>
28 <!-- Keep the identity of the PackageReference -->
29 <SmartPackageReference Include="@(PackageReference)">
30 <PackageName>%(Identity)</PackageName>
31 <InSolution>$(SolutionFileContent.Contains('\%(Identity).csproj'))</InSolution>
32 </SmartPackageReference>
33
34 <!-- Filter them by mapping them to another ItemGroup using the WithMetadataValue item function -->
35 <PackageInSolution Include="@(SmartPackageReference->WithMetadataValue('InSolution', True))">
36 <Pattern>$(RegexPattern.Replace('[PackageName]','%(PackageName)') )</Pattern>
37 <SmartPath>$([System.Text.RegularExpressions.Regex]::Match('$(SolutionFileContent)', '%(Pattern)'))</SmartPath>
38 </PackageInSolution>
39
40 <ProjectReference Include="@(PackageInSolution->'$(SmartSolutionDir)\%(SmartPath)' )"/>
41
42 <!-- Remove the package references that are now referenced as projects -->
43 <PackageReference Remove="@(PackageInSolution->'%(PackageName)' )"/>
44 </ItemGroup>
45
46 </When>
47 </Choose>
48</Project>
diff --git a/src/ext/DifxApp/README.md b/src/ext/DifxApp/README.md
new file mode 100644
index 00000000..49f30df8
--- /dev/null
+++ b/src/ext/DifxApp/README.md
@@ -0,0 +1,2 @@
1# DifxApp.wixext
2WixToolset.DifxApp.wixext - DIFxApp WiX Toolset Extension
diff --git a/src/ext/DifxApp/appveyor.cmd b/src/ext/DifxApp/appveyor.cmd
new file mode 100644
index 00000000..ec37397e
--- /dev/null
+++ b/src/ext/DifxApp/appveyor.cmd
@@ -0,0 +1,14 @@
1@setlocal
2@pushd %~dp0
3
4nuget restore || exit /b
5
6msbuild -p:Configuration=Release -t:Restore || exit /b
7
8msbuild -p:Configuration=Release src\test\WixToolsetTest.DifxApp\WixToolsetTest.DifxApp.csproj || exit /b
9dotnet test -c Release --no-build src\test\WixToolsetTest.DifxApp || exit /b
10
11msbuild -p:Configuration=Release -t:Pack src\wixext\WixToolset.DifxApp.wixext.csproj || exit /b
12
13@popd
14@endlocal \ No newline at end of file
diff --git a/src/ext/DifxApp/appveyor.yml b/src/ext/DifxApp/appveyor.yml
new file mode 100644
index 00000000..7c686b04
--- /dev/null
+++ b/src/ext/DifxApp/appveyor.yml
@@ -0,0 +1,40 @@
1# Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2#
3# Do NOT modify this file. Update the canonical version in Home\repo-template\src\appveyor.yml
4# then update all of the repos.
5
6branches:
7 only:
8 - master
9 - develop
10
11image: Visual Studio 2019
12
13version: 0.0.0.{build}
14configuration: Release
15
16environment:
17 DOTNET_SKIP_FIRST_TIME_EXPERIENCE: true
18 DOTNET_CLI_TELEMETRY_OPTOUT: 1
19 NUGET_XMLDOC_MODE: skip
20
21build_script:
22 - appveyor.cmd
23
24pull_requests:
25 do_not_increment_build_number: true
26
27nuget:
28 disable_publish_on_pr: true
29
30skip_branch_with_pr: true
31skip_tags: true
32
33artifacts:
34- path: build\Release\**\*.nupkg
35 name: nuget
36
37notifications:
38- provider: Slack
39 incoming_webhook:
40 secure: p5xuu+4x2JHfwGDMDe5KcG1k7gZxqYc4jWVwvyNZv5cvkubPD2waJs5yXMAXZNN7Z63/3PWHb7q4KoY/99AjauYa1nZ4c5qYqRPFRBKTHfA=
diff --git a/src/ext/DifxApp/nuget.config b/src/ext/DifxApp/nuget.config
new file mode 100644
index 00000000..db7aba29
--- /dev/null
+++ b/src/ext/DifxApp/nuget.config
@@ -0,0 +1,17 @@
1<?xml version="1.0" encoding="utf-8"?>
2<configuration>
3 <packageSources>
4 <clear />
5 <add key="wixtoolset-burn" value="https://ci.appveyor.com/nuget/wixtoolset-burn" />
6 <add key="wixtoolset-data" value="https://ci.appveyor.com/nuget/wixtoolset-data" />
7 <add key="wixtoolset-extensibility" value="https://ci.appveyor.com/nuget/wixtoolset-extensibility" />
8 <add key="wixtoolset-core" value="https://ci.appveyor.com/nuget/wixtoolset-core" />
9 <add key="wixtoolset-core-native" value="https://ci.appveyor.com/nuget/wixtoolset-core-native" />
10 <add key="wixtoolset-dtf" value="https://ci.appveyor.com/nuget/wixtoolset-dtf" />
11 <add key="wixtoolset-dutil" value="https://ci.appveyor.com/nuget/wixtoolset-dutil" />
12 <add key="wixtoolset-wcautil" value="https://ci.appveyor.com/nuget/wixtoolset-wcautil" />
13 <add key="wixtoolset-tools" value="https://ci.appveyor.com/nuget/wixtoolset-tools" />
14 <add key="wixbuildtools" value="https://ci.appveyor.com/nuget/wixbuildtools" />
15 <add key="api.nuget.org" value="https://api.nuget.org/v3/index.json" protocolVersion="3" />
16 </packageSources>
17</configuration> \ No newline at end of file
diff --git a/src/ext/DifxApp/test/WixToolsetTest.DifxApp/DifxAppExtensionFixture.cs b/src/ext/DifxApp/test/WixToolsetTest.DifxApp/DifxAppExtensionFixture.cs
new file mode 100644
index 00000000..f5166453
--- /dev/null
+++ b/src/ext/DifxApp/test/WixToolsetTest.DifxApp/DifxAppExtensionFixture.cs
@@ -0,0 +1,36 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolsetTest.DifxApp
4{
5 using System.Linq;
6 using WixBuildTools.TestSupport;
7 using WixToolset.Core.TestPackage;
8 using WixToolset.DifxApp;
9 using Xunit;
10
11 public class DifxAppExtensionFixture
12 {
13 [Fact]
14 public void CanBuildUsingDriver()
15 {
16 var folder = TestData.Get(@"TestData\UsingDriver");
17 var build = new Builder(folder, typeof(DifxAppExtensionFactory), new[] { folder });
18
19 var results = build.BuildAndQuery(Build, "CustomAction");
20 Assert.Equal(new[]
21 {
22 "CustomAction:MsiCleanupOnSuccess\t1\tDIFxApp.dll\tCleanupOnSuccess\t",
23 "CustomAction:MsiInstallDrivers\t3073\tDIFxAppA.dll\tInstallDriverPackages\t",
24 "CustomAction:MsiProcessDrivers\t1\tDIFxApp.dll\tProcessDriverPackages\t",
25 "CustomAction:MsiRollbackInstall\t3329\tDIFxAppA.dll\tRollbackInstall\t",
26 "CustomAction:MsiUninstallDrivers\t3073\tDIFxAppA.dll\tUninstallDriverPackages\t",
27 }, results);
28 }
29
30 private static void Build(string[] args)
31 {
32 var result = WixRunner.Execute(args)
33 .AssertSuccess();
34 }
35 }
36}
diff --git a/src/ext/DifxApp/test/WixToolsetTest.DifxApp/TestData/UsingDriver/Package.en-us.wxl b/src/ext/DifxApp/test/WixToolsetTest.DifxApp/TestData/UsingDriver/Package.en-us.wxl
new file mode 100644
index 00000000..38c12ac1
--- /dev/null
+++ b/src/ext/DifxApp/test/WixToolsetTest.DifxApp/TestData/UsingDriver/Package.en-us.wxl
@@ -0,0 +1,11 @@
1<?xml version="1.0" encoding="utf-8"?>
2
3<!--
4This file contains the declaration of all the localizable strings.
5-->
6<WixLocalization xmlns="http://wixtoolset.org/schemas/v4/wxl" Culture="en-US">
7
8 <String Id="DowngradeError">A newer version of [ProductName] is already installed.</String>
9 <String Id="FeatureTitle">MsiPackage</String>
10
11</WixLocalization>
diff --git a/src/ext/DifxApp/test/WixToolsetTest.DifxApp/TestData/UsingDriver/Package.wxs b/src/ext/DifxApp/test/WixToolsetTest.DifxApp/TestData/UsingDriver/Package.wxs
new file mode 100644
index 00000000..411893bc
--- /dev/null
+++ b/src/ext/DifxApp/test/WixToolsetTest.DifxApp/TestData/UsingDriver/Package.wxs
@@ -0,0 +1,15 @@
1<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
2 <Package Name="MsiPackage" Language="1033" Version="1.0.0.0" Manufacturer="Example Corporation" UpgradeCode="047730a5-30fe-4a62-a520-da9381b8226a">
3 <MajorUpgrade DowngradeErrorMessage="!(loc.DowngradeError)" />
4
5 <Feature Id="ProductFeature" Title="!(loc.FeatureTitle)">
6 <ComponentGroupRef Id="ProductComponents" />
7 </Feature>
8 </Package>
9
10 <Fragment>
11 <StandardDirectory Id="ProgramFilesFolder">
12 <Directory Id="INSTALLFOLDER" Name="MsiPackage" />
13 </StandardDirectory>
14 </Fragment>
15</Wix>
diff --git a/src/ext/DifxApp/test/WixToolsetTest.DifxApp/TestData/UsingDriver/PackageComponents.wxs b/src/ext/DifxApp/test/WixToolsetTest.DifxApp/TestData/UsingDriver/PackageComponents.wxs
new file mode 100644
index 00000000..9609771a
--- /dev/null
+++ b/src/ext/DifxApp/test/WixToolsetTest.DifxApp/TestData/UsingDriver/PackageComponents.wxs
@@ -0,0 +1,12 @@
1<?xml version="1.0" encoding="utf-8"?>
2<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs"
3 xmlns:difxapp="http://wixtoolset.org/schemas/v4/wxs/difxapp">
4 <Fragment>
5 <ComponentGroup Id="ProductComponents" Directory="INSTALLFOLDER">
6 <Component>
7 <File Source="example.txt" />
8 <difxapp:Driver />
9 </Component>
10 </ComponentGroup>
11 </Fragment>
12</Wix>
diff --git a/src/ext/DifxApp/test/WixToolsetTest.DifxApp/TestData/UsingDriver/example.txt b/src/ext/DifxApp/test/WixToolsetTest.DifxApp/TestData/UsingDriver/example.txt
new file mode 100644
index 00000000..1b4ffe8a
--- /dev/null
+++ b/src/ext/DifxApp/test/WixToolsetTest.DifxApp/TestData/UsingDriver/example.txt
@@ -0,0 +1 @@
This is example.txt. \ No newline at end of file
diff --git a/src/ext/DifxApp/test/WixToolsetTest.DifxApp/WixToolsetTest.DifxApp.csproj b/src/ext/DifxApp/test/WixToolsetTest.DifxApp/WixToolsetTest.DifxApp.csproj
new file mode 100644
index 00000000..e205d24a
--- /dev/null
+++ b/src/ext/DifxApp/test/WixToolsetTest.DifxApp/WixToolsetTest.DifxApp.csproj
@@ -0,0 +1,41 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3
4<Project Sdk="Microsoft.NET.Sdk">
5 <PropertyGroup>
6 <TargetFramework>netcoreapp3.1</TargetFramework>
7 <IsPackable>false</IsPackable>
8 </PropertyGroup>
9
10 <PropertyGroup>
11 <NoWarn>NU1701</NoWarn>
12 </PropertyGroup>
13
14 <ItemGroup>
15 <Content Include="TestData\UsingDriver\example.txt" CopyToOutputDirectory="PreserveNewest" />
16 <Content Include="TestData\UsingDriver\Package.en-us.wxl" CopyToOutputDirectory="PreserveNewest" />
17 <Content Include="TestData\UsingDriver\Package.wxs" CopyToOutputDirectory="PreserveNewest" />
18 <Content Include="TestData\UsingDriver\PackageComponents.wxs" CopyToOutputDirectory="PreserveNewest" />
19 </ItemGroup>
20
21 <ItemGroup>
22 <ProjectReference Include="..\..\wixext\WixToolset.DifxApp.wixext.csproj" />
23 </ItemGroup>
24
25 <ItemGroup>
26 <PackageReference Include="WixToolset.Core" Version="4.0.*" />
27 <PackageReference Include="WixToolset.Core.Burn" Version="4.0.*" />
28 <PackageReference Include="WixToolset.Core.WindowsInstaller" Version="4.0.*" />
29 <PackageReference Include="WixToolset.Core.TestPackage" Version="4.0.*" />
30 </ItemGroup>
31
32 <ItemGroup>
33 <PackageReference Include="WixBuildTools.TestSupport" Version="4.0.*" />
34 </ItemGroup>
35
36 <ItemGroup>
37 <PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.3.0" />
38 <PackageReference Include="xunit" Version="2.4.1" />
39 <PackageReference Include="xunit.runner.visualstudio" Version="2.4.1" PrivateAssets="All" />
40 </ItemGroup>
41</Project>
diff --git a/src/ext/DifxApp/wix.snk b/src/ext/DifxApp/wix.snk
new file mode 100644
index 00000000..3908a66a
--- /dev/null
+++ b/src/ext/DifxApp/wix.snk
Binary files differ
diff --git a/src/ext/DifxApp/wixext/DifxAppCompiler.cs b/src/ext/DifxApp/wixext/DifxAppCompiler.cs
new file mode 100644
index 00000000..e056988f
--- /dev/null
+++ b/src/ext/DifxApp/wixext/DifxAppCompiler.cs
@@ -0,0 +1,161 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.DifxApp
4{
5 using System;
6 using System.Collections.Generic;
7 using System.Xml.Linq;
8 using WixToolset.Data;
9 using WixToolset.DifxApp.Symbols;
10 using WixToolset.Extensibility;
11
12 /// <summary>
13 /// The compiler for the WiX Toolset Driver Install Frameworks for Applications Extension.
14 /// </summary>
15 public sealed class DifxAppCompiler : BaseCompilerExtension
16 {
17 private HashSet<string> components;
18
19 public override XNamespace Namespace => "http://wixtoolset.org/schemas/v4/wxs/difxapp";
20 /// <summary>
21 /// Instantiate a new DifxAppCompiler.
22 /// </summary>
23 public DifxAppCompiler()
24 {
25 this.components = new HashSet<string>();
26 }
27
28 /// <summary>
29 /// Processes an element for the Compiler.
30 /// </summary>
31 /// <param name="sourceLineNumbers">Source line number for the parent element.</param>
32 /// <param name="parentElement">Parent element of element to process.</param>
33 /// <param name="element">Element to process.</param>
34 /// <param name="contextValues">Extra information about the context in which this element is being parsed.</param>
35 public override void ParseElement(Intermediate intermediate, IntermediateSection section, XElement parentElement, XElement element, IDictionary<string, string> context)
36 {
37 switch (parentElement.Name.LocalName)
38 {
39 case "Component":
40 var componentId = context["ComponentId"];
41 var directoryId = context["DirectoryId"];
42 var componentWin64 = Boolean.Parse(context["Win64"]);
43
44 switch (element.Name.LocalName)
45 {
46 case "Driver":
47 this.ParseDriverElement(intermediate, section, element, componentId, componentWin64);
48 break;
49 default:
50 this.ParseHelper.UnexpectedElement(parentElement, element);
51 break;
52 }
53 break;
54 default:
55 this.ParseHelper.UnexpectedElement(parentElement, element);
56 break;
57 }
58 }
59
60 /// <summary>
61 /// Parses a Driver element.
62 /// </summary>
63 /// <param name="node">Element to parse.</param>
64 /// <param name="componentId">Identifier for parent component.</param>
65 private void ParseDriverElement(Intermediate intermediate, IntermediateSection section, XElement node, string componentId, bool win64)
66 {
67 var sourceLineNumbers = this.ParseHelper.GetSourceLineNumbers(node);
68 int attributes = 0;
69 var sequence = CompilerConstants.IntegerNotSet;
70
71 // check the number of times a Driver element has been nested under this Component element
72 if (null != componentId)
73 {
74 if (this.components.Contains(componentId))
75 {
76 this.Messaging.Write(ErrorMessages.TooManyElements(sourceLineNumbers, "Component", node.Name.LocalName, 1));
77 }
78 else
79 {
80 this.components.Add(componentId);
81 }
82 }
83
84 foreach (var attrib in node.Attributes())
85 {
86 if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || this.Namespace == attrib.Name.Namespace)
87 {
88 switch (attrib.Name.LocalName)
89 {
90 case "AddRemovePrograms":
91 if (YesNoType.No == this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib))
92 {
93 attributes |= 0x4;
94 }
95 break;
96 case "DeleteFiles":
97 if (YesNoType.Yes == this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib))
98 {
99 attributes |= 0x10;
100 }
101 break;
102 case "ForceInstall":
103 if (YesNoType.Yes == this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib))
104 {
105 attributes |= 0x1;
106 }
107 break;
108 case "Legacy":
109 if (YesNoType.Yes == this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib))
110 {
111 attributes |= 0x8;
112 }
113 break;
114 case "PlugAndPlayPrompt":
115 if (YesNoType.No == this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib))
116 {
117 attributes |= 0x2;
118 }
119 break;
120 case "Sequence":
121 sequence = this.ParseHelper.GetAttributeIntegerValue(sourceLineNumbers, attrib, 0, int.MaxValue);
122 break;
123 default:
124 this.ParseHelper.UnexpectedAttribute(node, attrib);
125 break;
126 }
127 }
128 else
129 {
130 this.ParseHelper.ParseExtensionAttribute(this.Context.Extensions, intermediate, section, node, attrib);
131 }
132 }
133
134 this.ParseHelper.ParseForExtensionElements(this.Context.Extensions, intermediate, section, node);
135
136 if (!this.Messaging.EncounteredError)
137 {
138 switch (this.Context.Platform)
139 {
140 case Platform.X86:
141 this.ParseHelper.CreateSimpleReference(section, sourceLineNumbers, SymbolDefinitions.CustomAction, "MsiProcessDrivers");
142 break;
143 case Platform.X64:
144 this.ParseHelper.CreateSimpleReference(section, sourceLineNumbers, SymbolDefinitions.CustomAction, "MsiProcessDrivers_x64");
145 break;
146 }
147
148 var symbol = section.AddSymbol(new MsiDriverPackagesSymbol(sourceLineNumbers)
149 {
150 ComponentRef = componentId,
151 Flags = attributes,
152 });
153
154 if (CompilerConstants.IntegerNotSet != sequence)
155 {
156 symbol.Sequence = sequence;
157 }
158 }
159 }
160 }
161}
diff --git a/src/ext/DifxApp/wixext/DifxAppDecompiler.cs b/src/ext/DifxApp/wixext/DifxAppDecompiler.cs
new file mode 100644
index 00000000..e41d8b98
--- /dev/null
+++ b/src/ext/DifxApp/wixext/DifxAppDecompiler.cs
@@ -0,0 +1,98 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.DifxApp
4{
5#if TODO_CONSIDER_DECOMPILER
6 using System;
7 using System.Collections;
8 using System.Globalization;
9 using WixToolset.Data;
10 using WixToolset.Extensibility;
11 using DifxApp = WixToolset.Extensions.Serialize.DifxApp;
12 using Wix = WixToolset.Data.Serialize;
13
14 /// <summary>
15 /// The decompiler for the WiX Toolset Driver Install Frameworks for Applications Extension.
16 /// </summary>
17 public sealed class DifxAppDecompiler : DecompilerExtension
18 {
19 /// <summary>
20 /// Creates a decompiler for Gaming Extension.
21 /// </summary>
22 public DifxAppDecompiler()
23 {
24 this.TableDefinitions = DifxAppExtensionData.GetExtensionTableDefinitions();
25 }
26
27 /// <summary>
28 /// Decompiles an extension table.
29 /// </summary>
30 /// <param name="table">The table to decompile.</param>
31 public override void DecompileTable(Table table)
32 {
33 switch (table.Name)
34 {
35 case "MsiDriverPackages":
36 this.DecompileMsiDriverPackagesTable(table);
37 break;
38 default:
39 base.DecompileTable(table);
40 break;
41 }
42 }
43
44 /// <summary>
45 /// Decompile the MsiDriverPackages table.
46 /// </summary>
47 /// <param name="table">The table to decompile.</param>
48 private void DecompileMsiDriverPackagesTable(Table table)
49 {
50 foreach (Row row in table.Rows)
51 {
52 DifxApp.Driver driver = new DifxApp.Driver();
53
54 int attributes = (int)row[1];
55 if (0x1 == (attributes & 0x1))
56 {
57 driver.ForceInstall = DifxApp.YesNoType.yes;
58 }
59
60 if (0x2 == (attributes & 0x2))
61 {
62 driver.PlugAndPlayPrompt = DifxApp.YesNoType.no;
63 }
64
65 if (0x4 == (attributes & 0x4))
66 {
67 driver.AddRemovePrograms = DifxApp.YesNoType.no;
68 }
69
70 if (0x8 == (attributes & 0x8))
71 {
72 driver.Legacy = DifxApp.YesNoType.yes;
73 }
74
75 if (0x10 == (attributes & 0x10))
76 {
77 driver.DeleteFiles = DifxApp.YesNoType.yes;
78 }
79
80 if (null != row[2])
81 {
82 driver.Sequence = (int)row[2];
83 }
84
85 Wix.Component component = (Wix.Component)this.Core.GetIndexedElement("Component", (string)row[0]);
86 if (null != component)
87 {
88 component.AddChild(driver);
89 }
90 else
91 {
92 this.Core.OnMessage(WixWarnings.ExpectedForeignRow(row.SourceLineNumbers, table.Name, row.GetPrimaryKey(DecompilerConstants.PrimaryKeyDelimiter), "Component", (string)row[0], "Component"));
93 }
94 }
95 }
96 }
97#endif
98}
diff --git a/src/ext/DifxApp/wixext/DifxAppExtensionData.cs b/src/ext/DifxApp/wixext/DifxAppExtensionData.cs
new file mode 100644
index 00000000..31a95b8e
--- /dev/null
+++ b/src/ext/DifxApp/wixext/DifxAppExtensionData.cs
@@ -0,0 +1,23 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.DifxApp
4{
5 using WixToolset.Data;
6 using WixToolset.Extensibility;
7
8 public sealed class DifxAppExtensionData : BaseExtensionData
9 {
10 public override string DefaultCulture => "en-US";
11
12 public override bool TryGetSymbolDefinitionByName(string name, out IntermediateSymbolDefinition symbolDefinition)
13 {
14 symbolDefinition = DifxAppSymbolDefinitions.ByName(name);
15 return symbolDefinition != null;
16 }
17
18 public override Intermediate GetLibrary(ISymbolDefinitionCreator symbolDefinitions)
19 {
20 return Intermediate.Load(typeof(DifxAppExtensionData).Assembly, "WixToolset.DifxApp.difxapp.wixlib", symbolDefinitions);
21 }
22 }
23}
diff --git a/src/ext/DifxApp/wixext/DifxAppExtensionFactory.cs b/src/ext/DifxApp/wixext/DifxAppExtensionFactory.cs
new file mode 100644
index 00000000..3932685d
--- /dev/null
+++ b/src/ext/DifxApp/wixext/DifxAppExtensionFactory.cs
@@ -0,0 +1,18 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.DifxApp
4{
5 using System;
6 using System.Collections.Generic;
7 using WixToolset.Extensibility;
8
9 public class DifxAppExtensionFactory : BaseExtensionFactory
10 {
11 protected override IReadOnlyCollection<Type> ExtensionTypes => new[]
12 {
13 typeof(DifxAppCompiler),
14 typeof(DifxAppExtensionData),
15 typeof(DifxAppWindowsInstallerBackendBinderExtension),
16 };
17 }
18}
diff --git a/src/ext/DifxApp/wixext/DifxAppTableDefinitions.cs b/src/ext/DifxApp/wixext/DifxAppTableDefinitions.cs
new file mode 100644
index 00000000..a6c26444
--- /dev/null
+++ b/src/ext/DifxApp/wixext/DifxAppTableDefinitions.cs
@@ -0,0 +1,26 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.DifxApp
4{
5 using WixToolset.Data.WindowsInstaller;
6
7 public static class DifxAppTableDefinitions
8 {
9 public static readonly TableDefinition MsiDriverPackages = new TableDefinition(
10 "MsiDriverPackages",
11 DifxAppSymbolDefinitions.MsiDriverPackages,
12 new[]
13 {
14 new ColumnDefinition("Component", ColumnType.String, 72, primaryKey: true, nullable: false, ColumnCategory.Identifier, keyTable: "Component", keyColumn: 1, description: "Name of the component that represents the driver package", modularizeType: ColumnModularizeType.Column),
15 new ColumnDefinition("Flags", ColumnType.Number, 4, primaryKey: false, nullable: false, ColumnCategory.Unknown, minValue: 0, maxValue: 31, description: "Flags for installing and uninstalling driver packages"),
16 new ColumnDefinition("Sequence", ColumnType.Number, 4, primaryKey: false, nullable: true, ColumnCategory.Unknown, minValue: 0, description: "Order in which the driver packages are processed"),
17 },
18 symbolIdIsPrimaryKey: false
19 );
20
21 public static readonly TableDefinition[] All = new[]
22 {
23 MsiDriverPackages,
24 };
25 }
26}
diff --git a/src/ext/DifxApp/wixext/DifxAppWindowsInstallerBackendBinderExtension.cs b/src/ext/DifxApp/wixext/DifxAppWindowsInstallerBackendBinderExtension.cs
new file mode 100644
index 00000000..41f01175
--- /dev/null
+++ b/src/ext/DifxApp/wixext/DifxAppWindowsInstallerBackendBinderExtension.cs
@@ -0,0 +1,13 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.DifxApp
4{
5 using System.Collections.Generic;
6 using WixToolset.Data.WindowsInstaller;
7 using WixToolset.Extensibility;
8
9 public class DifxAppWindowsInstallerBackendBinderExtension : BaseWindowsInstallerBackendBinderExtension
10 {
11 public override IReadOnlyCollection<TableDefinition> TableDefinitions => DifxAppTableDefinitions.All;
12 }
13}
diff --git a/src/ext/DifxApp/wixext/Symbols/DifxAppSymbolDefinitions.cs b/src/ext/DifxApp/wixext/Symbols/DifxAppSymbolDefinitions.cs
new file mode 100644
index 00000000..76f4d88f
--- /dev/null
+++ b/src/ext/DifxApp/wixext/Symbols/DifxAppSymbolDefinitions.cs
@@ -0,0 +1,39 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.DifxApp
4{
5 using System;
6 using WixToolset.Data;
7
8 public enum DifxAppSymbolDefinitionType
9 {
10 MsiDriverPackages,
11 }
12
13 public static partial class DifxAppSymbolDefinitions
14 {
15 public static readonly Version Version = new Version("4.0.0");
16
17 public static IntermediateSymbolDefinition ByName(string name)
18 {
19 if (!Enum.TryParse(name, out DifxAppSymbolDefinitionType type))
20 {
21 return null;
22 }
23
24 return ByType(type);
25 }
26
27 public static IntermediateSymbolDefinition ByType(DifxAppSymbolDefinitionType type)
28 {
29 switch (type)
30 {
31 case DifxAppSymbolDefinitionType.MsiDriverPackages:
32 return DifxAppSymbolDefinitions.MsiDriverPackages;
33
34 default:
35 throw new ArgumentOutOfRangeException(nameof(type));
36 }
37 }
38 }
39}
diff --git a/src/ext/DifxApp/wixext/Symbols/MsiDriverPackagesSymbol.cs b/src/ext/DifxApp/wixext/Symbols/MsiDriverPackagesSymbol.cs
new file mode 100644
index 00000000..2fd91bc8
--- /dev/null
+++ b/src/ext/DifxApp/wixext/Symbols/MsiDriverPackagesSymbol.cs
@@ -0,0 +1,63 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.DifxApp
4{
5 using WixToolset.Data;
6 using WixToolset.DifxApp.Symbols;
7
8 public static partial class DifxAppSymbolDefinitions
9 {
10 public static readonly IntermediateSymbolDefinition MsiDriverPackages = new IntermediateSymbolDefinition(
11 DifxAppSymbolDefinitionType.MsiDriverPackages.ToString(),
12 new[]
13 {
14 new IntermediateFieldDefinition(nameof(MsiDriverPackagesSymbolFields.ComponentRef), IntermediateFieldType.String),
15 new IntermediateFieldDefinition(nameof(MsiDriverPackagesSymbolFields.Flags), IntermediateFieldType.Number),
16 new IntermediateFieldDefinition(nameof(MsiDriverPackagesSymbolFields.Sequence), IntermediateFieldType.Number),
17 },
18 typeof(MsiDriverPackagesSymbol));
19 }
20}
21
22namespace WixToolset.DifxApp.Symbols
23{
24 using WixToolset.Data;
25
26 public enum MsiDriverPackagesSymbolFields
27 {
28 ComponentRef,
29 Flags,
30 Sequence,
31 }
32
33 public class MsiDriverPackagesSymbol : IntermediateSymbol
34 {
35 public MsiDriverPackagesSymbol() : base(DifxAppSymbolDefinitions.MsiDriverPackages, null, null)
36 {
37 }
38
39 public MsiDriverPackagesSymbol(SourceLineNumber sourceLineNumber, Identifier id = null) : base(DifxAppSymbolDefinitions.MsiDriverPackages, sourceLineNumber, id)
40 {
41 }
42
43 public IntermediateField this[MsiDriverPackagesSymbolFields index] => this.Fields[(int)index];
44
45 public string ComponentRef
46 {
47 get => this.Fields[(int)MsiDriverPackagesSymbolFields.ComponentRef].AsString();
48 set => this.Set((int)MsiDriverPackagesSymbolFields.ComponentRef, value);
49 }
50
51 public int Flags
52 {
53 get => this.Fields[(int)MsiDriverPackagesSymbolFields.Flags].AsNumber();
54 set => this.Set((int)MsiDriverPackagesSymbolFields.Flags, value);
55 }
56
57 public int? Sequence
58 {
59 get => this.Fields[(int)MsiDriverPackagesSymbolFields.Sequence].AsNullableNumber();
60 set => this.Set((int)MsiDriverPackagesSymbolFields.Sequence, value);
61 }
62 }
63} \ No newline at end of file
diff --git a/src/ext/DifxApp/wixext/WixToolset.DifxApp.wixext.csproj b/src/ext/DifxApp/wixext/WixToolset.DifxApp.wixext.csproj
new file mode 100644
index 00000000..50d3debf
--- /dev/null
+++ b/src/ext/DifxApp/wixext/WixToolset.DifxApp.wixext.csproj
@@ -0,0 +1,28 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3
4<Project Sdk="Microsoft.NET.Sdk">
5 <PropertyGroup>
6 <TargetFramework>netstandard2.0</TargetFramework>
7 <RootNamespace>WixToolset.DifxApp</RootNamespace>
8 <Description>WiX Toolset DIFxApp Extension</Description>
9 <Title>WiX Toolset DIFxApp Extension</Title>
10 <IsTool>true</IsTool>
11 <ContentTargetFolders>build</ContentTargetFolders>
12 </PropertyGroup>
13 <ItemGroup>
14 <Content Include="$(MSBuildThisFileName).targets" />
15 <EmbeddedResource Include="$(OutputPath)..\difxapp.wixlib" />
16 </ItemGroup>
17 <ItemGroup>
18 <PackageReference Include="WixToolset.Extensibility" Version="4.0.*" PrivateAssets="all" />
19 </ItemGroup>
20
21 <ItemGroup>
22 <ProjectReference Include="..\wixlib\difxapp.wixproj" ReferenceOutputAssembly="false" Condition=" '$(NCrunch)'=='' " />
23 </ItemGroup>
24
25 <ItemGroup>
26 <PackageReference Include="Nerdbank.GitVersioning" Version="3.3.37" PrivateAssets="all" />
27 </ItemGroup>
28</Project>
diff --git a/src/ext/DifxApp/wixext/WixToolset.DifxApp.wixext.targets b/src/ext/DifxApp/wixext/WixToolset.DifxApp.wixext.targets
new file mode 100644
index 00000000..b01d4116
--- /dev/null
+++ b/src/ext/DifxApp/wixext/WixToolset.DifxApp.wixext.targets
@@ -0,0 +1,11 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3
4<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0">
5 <PropertyGroup>
6 <WixToolsetDifxAppWixextPath Condition=" '$(WixToolsetDifxAppWixextPath)' == '' ">$(MSBuildThisFileDirectory)..\tools\WixToolset.DifxApp.wixext.dll</WixToolsetDifxAppWixextPath>
7 </PropertyGroup>
8 <ItemGroup>
9 <WixExtension Include="$(WixToolsetDifxAppWixextPath)" />
10 </ItemGroup>
11</Project>
diff --git a/src/ext/DifxApp/wixlib/DifxAppExtension_Platform.wxi b/src/ext/DifxApp/wixlib/DifxAppExtension_Platform.wxi
new file mode 100644
index 00000000..b8d613c9
--- /dev/null
+++ b/src/ext/DifxApp/wixlib/DifxAppExtension_Platform.wxi
@@ -0,0 +1,22 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2
3
4<Include xmlns="http://wixtoolset.org/schemas/v4/wxs">
5 <?include caSuffix.wxi ?>
6
7 <Fragment>
8 <InstallExecuteSequence>
9 <Custom Action="MsiProcessDrivers" After="InstallFiles" Condition="VersionNT &gt; 400" />
10 <Custom Action="MsiCleanupOnSuccess" After="InstallFinalize" Condition="VersionNT &gt; 400" />
11 </InstallExecuteSequence>
12
13 <Binary Id="DIFxApp.dll$(var.Suffix)" SourceFile="$(var.platform)\DIFxApp.dll" />
14 <Binary Id="DIFxAppA.dll$(var.Suffix)" SourceFile="$(var.platform)\DIFxAppA.dll" />
15
16 <CustomAction Id="MsiProcessDrivers$(var.Suffix)" DllEntry="ProcessDriverPackages" SuppressModularization="yes" Execute="immediate" BinaryRef="DIFxApp.dll$(var.Suffix)" />
17 <CustomAction Id="MsiInstallDrivers$(var.Suffix)" DllEntry="InstallDriverPackages" SuppressModularization="yes" Execute="deferred" Impersonate="no" BinaryRef="DIFxAppA.dll$(var.Suffix)" />
18 <CustomAction Id="MsiUninstallDrivers$(var.Suffix)" DllEntry="UninstallDriverPackages" SuppressModularization="yes" Execute="deferred" Impersonate="no" BinaryRef="DIFxAppA.dll$(var.Suffix)" />
19 <CustomAction Id="MsiRollbackInstall$(var.Suffix)" DllEntry="RollbackInstall" SuppressModularization="yes" Execute="rollback" Impersonate="no" BinaryRef="DIFxAppA.dll$(var.Suffix)" />
20 <CustomAction Id="MsiCleanupOnSuccess$(var.Suffix)" DllEntry="CleanupOnSuccess" SuppressModularization="yes" Execute="immediate" BinaryRef="DIFxApp.dll$(var.Suffix)" />
21 </Fragment>
22</Include>
diff --git a/src/ext/DifxApp/wixlib/DifxAppExtension_x64.wxs b/src/ext/DifxApp/wixlib/DifxAppExtension_x64.wxs
new file mode 100644
index 00000000..3c534363
--- /dev/null
+++ b/src/ext/DifxApp/wixlib/DifxAppExtension_x64.wxs
@@ -0,0 +1,8 @@
1<?xml version="1.0"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3
4
5<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
6 <?define platform=x64 ?>
7 <?include DifxAppExtension_Platform.wxi ?>
8</Wix>
diff --git a/src/ext/DifxApp/wixlib/DifxAppExtension_x86.wxs b/src/ext/DifxApp/wixlib/DifxAppExtension_x86.wxs
new file mode 100644
index 00000000..d352a272
--- /dev/null
+++ b/src/ext/DifxApp/wixlib/DifxAppExtension_x86.wxs
@@ -0,0 +1,8 @@
1<?xml version="1.0"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3
4
5<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
6 <?define platform=x86 ?>
7 <?include DifxAppExtension_Platform.wxi ?>
8</Wix>
diff --git a/src/ext/DifxApp/wixlib/caSuffix.wxi b/src/ext/DifxApp/wixlib/caSuffix.wxi
new file mode 100644
index 00000000..a56a2393
--- /dev/null
+++ b/src/ext/DifxApp/wixlib/caSuffix.wxi
@@ -0,0 +1,28 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3
4<Include xmlns="http://wixtoolset.org/schemas/v4/wxs">
5 <?ifndef platform ?>
6 <?error Required value "platform" not defined in include caSuffix.wxi ?>
7 <?endif ?>
8
9 <?ifdef Suffix ?>
10 <?undef Suffix ?>
11 <?undef DeferredSuffix ?>
12 <?endif ?>
13
14 <?if $(var.platform)="x86" ?>
15 <?define Suffix="" ?>
16 <?define DeferredSuffix="" ?>
17 <?endif ?>
18
19 <?if $(var.platform)="x64" ?>
20 <?define Suffix="_x64" ?>
21 <?define DeferredSuffix="_64" ?>
22 <?endif ?>
23
24 <?if $(var.platform)="arm" ?>
25 <?define Suffix="_ARM" ?>
26 <?define DeferredSuffix="_ARM" ?>
27 <?endif ?>
28</Include>
diff --git a/src/ext/DifxApp/wixlib/difxapp.wixproj b/src/ext/DifxApp/wixlib/difxapp.wixproj
new file mode 100644
index 00000000..2ae9a097
--- /dev/null
+++ b/src/ext/DifxApp/wixlib/difxapp.wixproj
@@ -0,0 +1,14 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2<Project Sdk="WixToolset.Sdk">
3
4 <PropertyGroup>
5 <OutputType>Library</OutputType>
6 <BindFiles>true</BindFiles>
7 <Cultures>en-us</Cultures>
8 </PropertyGroup>
9
10 <ItemGroup>
11 <PackageReference Include="Nerdbank.GitVersioning" Version="3.3.37" PrivateAssets="All" />
12 </ItemGroup>
13
14</Project>
diff --git a/src/ext/DifxApp/wixlib/x64/DIFxApp.dll b/src/ext/DifxApp/wixlib/x64/DIFxApp.dll
new file mode 100644
index 00000000..69a44cc8
--- /dev/null
+++ b/src/ext/DifxApp/wixlib/x64/DIFxApp.dll
Binary files differ
diff --git a/src/ext/DifxApp/wixlib/x64/DIFxAppA.dll b/src/ext/DifxApp/wixlib/x64/DIFxAppA.dll
new file mode 100644
index 00000000..99458040
--- /dev/null
+++ b/src/ext/DifxApp/wixlib/x64/DIFxAppA.dll
Binary files differ
diff --git a/src/ext/DifxApp/wixlib/x86/DIFxApp.dll b/src/ext/DifxApp/wixlib/x86/DIFxApp.dll
new file mode 100644
index 00000000..678a9d95
--- /dev/null
+++ b/src/ext/DifxApp/wixlib/x86/DIFxApp.dll
Binary files differ
diff --git a/src/ext/DifxApp/wixlib/x86/DIFxAppA.dll b/src/ext/DifxApp/wixlib/x86/DIFxAppA.dll
new file mode 100644
index 00000000..3ac0838d
--- /dev/null
+++ b/src/ext/DifxApp/wixlib/x86/DIFxAppA.dll
Binary files differ
diff --git a/src/ext/DirectX/CSharp.Build.props b/src/ext/DirectX/CSharp.Build.props
new file mode 100644
index 00000000..b12f4c6e
--- /dev/null
+++ b/src/ext/DirectX/CSharp.Build.props
@@ -0,0 +1,11 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2<!--
3 Do NOT modify this file. Update the canonical version in Home\repo-template\src\CSharp.Build.props
4 then update all of the repos.
5-->
6<Project>
7 <PropertyGroup>
8 <SignAssembly>true</SignAssembly>
9 <AssemblyOriginatorKeyFile>$([System.IO.Path]::GetFullPath($(MSBuildThisFileDirectory)wix.snk))</AssemblyOriginatorKeyFile>
10 </PropertyGroup>
11</Project>
diff --git a/src/ext/DirectX/Cpp.Build.props b/src/ext/DirectX/Cpp.Build.props
new file mode 100644
index 00000000..9b7a1bb5
--- /dev/null
+++ b/src/ext/DirectX/Cpp.Build.props
@@ -0,0 +1,86 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3
4<Project>
5 <PropertyGroup>
6 <Platform Condition=" '$(Platform)' == '' OR '$(Platform)' == 'AnyCPU' ">Win32</Platform>
7 <IntDir>$(BaseIntermediateOutputPath)$(Configuration)\$(Platform)\</IntDir>
8 <OutDir>$(OutputPath)$(Platform)\</OutDir>
9 </PropertyGroup>
10
11 <PropertyGroup Condition="'$(WindowsTargetPlatformVersion)'=='' AND '$(VisualStudioVersion)'>='15.0'">
12 <WindowsTargetPlatformVersion>$([Microsoft.Build.Utilities.ToolLocationHelper]::GetLatestSDKTargetPlatformVersion('Windows', '10.0'))</WindowsTargetPlatformVersion>
13 </PropertyGroup>
14
15 <ItemDefinitionGroup>
16 <ClCompile>
17 <DisableSpecificWarnings>$(DisableSpecificCompilerWarnings)</DisableSpecificWarnings>
18 <WarningLevel>Level4</WarningLevel>
19 <AdditionalIncludeDirectories>$(ProjectDir)inc;$(MSBuildProjectDirectory);$(IntDir);$(SqlCESdkIncludePath);$(ProjectAdditionalIncludeDirectories);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
20 <PreprocessorDefinitions>WIN32;_WINDOWS;_WIN32_MSI=500;_WIN32_WINNT=0x0501;$(ArmPreprocessorDefinitions);$(UnicodePreprocessorDefinitions);_CRT_STDIO_LEGACY_WIDE_SPECIFIERS;_WINSOCK_DEPRECATED_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
21 <PrecompiledHeader>Use</PrecompiledHeader>
22 <PrecompiledHeaderFile>precomp.h</PrecompiledHeaderFile>
23 <CallingConvention Condition="'$(Platform)'=='Win32'">StdCall</CallingConvention>
24 <TreatWarningAsError>true</TreatWarningAsError>
25 <ExceptionHandling>false</ExceptionHandling>
26 <AdditionalOptions>-YlprecompDefine</AdditionalOptions>
27 <AdditionalOptions Condition=" $(PlatformToolset.StartsWith('v14')) ">/Zc:threadSafeInit- %(AdditionalOptions)</AdditionalOptions>
28 <MultiProcessorCompilation Condition=" $(NUMBER_OF_PROCESSORS) &gt; 4 ">true</MultiProcessorCompilation>
29 </ClCompile>
30 <ResourceCompile>
31 <PreprocessorDefinitions>$(ArmPreprocessorDefinitions);%(PreprocessorDefinitions)</PreprocessorDefinitions>
32 <AdditionalIncludeDirectories>$(ProjectAdditionalResourceIncludeDirectories);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
33 </ResourceCompile>
34 <Lib>
35 <AdditionalLibraryDirectories>$(OutDir);$(AdditionalMultiTargetLibraryPath);$(ProjectAdditionalLibraryDirectories);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
36 </Lib>
37 <Link>
38 <SubSystem>$(ProjectSubSystem)</SubSystem>
39 <ModuleDefinitionFile>$(ProjectModuleDefinitionFile)</ModuleDefinitionFile>
40 <NoEntryPoint>$(ResourceOnlyDll)</NoEntryPoint>
41 <GenerateDebugInformation>true</GenerateDebugInformation>
42 <AdditionalDependencies>$(ProjectAdditionalLinkLibraries);advapi32.lib;comdlg32.lib;user32.lib;oleaut32.lib;gdi32.lib;shell32.lib;ole32.lib;version.lib;%(AdditionalDependencies)</AdditionalDependencies>
43 <AdditionalLibraryDirectories>$(OutDir);$(AdditionalMultiTargetLibraryPath);$(ArmLibraryDirectories);$(ProjectAdditionalLinkLibraryDirectories);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
44 <AdditionalOptions Condition=" $(PlatformToolset.StartsWith('v14')) ">/IGNORE:4099 %(AdditionalOptions)</AdditionalOptions>
45 </Link>
46 </ItemDefinitionGroup>
47
48 <ItemDefinitionGroup Condition=" '$(Platform)'=='Win32' and '$(PlatformToolset)'!='v100'">
49 <ClCompile>
50 <EnableEnhancedInstructionSet>NoExtensions</EnableEnhancedInstructionSet>
51 </ClCompile>
52 </ItemDefinitionGroup>
53 <ItemDefinitionGroup Condition=" '$(Platform)'=='arm' ">
54 <ClCompile>
55 <CallingConvention>CDecl</CallingConvention>
56 </ClCompile>
57 </ItemDefinitionGroup>
58 <ItemDefinitionGroup Condition=" '$(ConfigurationType)'=='StaticLibrary' ">
59 <ClCompile>
60 <DebugInformationFormat>OldStyle</DebugInformationFormat>
61 <OmitDefaultLibName>true</OmitDefaultLibName>
62 <IgnoreAllDefaultLibraries>true</IgnoreAllDefaultLibraries>
63 </ClCompile>
64 </ItemDefinitionGroup>
65 <ItemDefinitionGroup Condition=" '$(Configuration)'=='Debug' ">
66 <ClCompile>
67 <Optimization>Disabled</Optimization>
68 <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
69 <PreprocessorDefinitions>_DEBUG;DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
70 <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
71 </ClCompile>
72 </ItemDefinitionGroup>
73 <ItemDefinitionGroup Condition=" '$(Configuration)'=='Release' ">
74 <ClCompile>
75 <Optimization>MinSpace</Optimization>
76 <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
77 <FunctionLevelLinking>true</FunctionLevelLinking>
78 <IntrinsicFunctions>true</IntrinsicFunctions>
79 <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
80 </ClCompile>
81 <Link>
82 <EnableCOMDATFolding>true</EnableCOMDATFolding>
83 <OptimizeReferences>true</OptimizeReferences>
84 </Link>
85 </ItemDefinitionGroup>
86</Project>
diff --git a/src/ext/DirectX/DirectX.wixext.sln b/src/ext/DirectX/DirectX.wixext.sln
new file mode 100644
index 00000000..2ec5721f
--- /dev/null
+++ b/src/ext/DirectX/DirectX.wixext.sln
@@ -0,0 +1,61 @@
1
2Microsoft Visual Studio Solution File, Format Version 12.00
3# Visual Studio Version 16
4VisualStudioVersion = 16.0.30204.135
5MinimumVisualStudioVersion = 10.0.40219.1
6Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "directxca", "src\ca\directxca.vcxproj", "{76542B28-0FFD-47D3-AD6A-D0F20FA875AC}"
7EndProject
8Project("{930C7802-8A8C-48F9-8165-68863BCCD9DD}") = "directx", "src\wixlib\directx.wixproj", "{4D8DDEC7-AAAC-4A32-87D0-5992FE382ED9}"
9EndProject
10Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WixToolset.DirectX.wixext", "src\wixext\WixToolset.DirectX.wixext.csproj", "{6182DBCA-146A-4F37-8406-3139BBE04636}"
11EndProject
12Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WixToolsetTest.DirectX", "src\test\WixToolsetTest.DirectX\WixToolsetTest.DirectX.csproj", "{508A3DD0-FE58-4150-A1F6-A803A377012A}"
13EndProject
14Global
15 GlobalSection(SolutionConfigurationPlatforms) = preSolution
16 Debug|Any CPU = Debug|Any CPU
17 Debug|x86 = Debug|x86
18 Release|Any CPU = Release|Any CPU
19 Release|x86 = Release|x86
20 EndGlobalSection
21 GlobalSection(ProjectConfigurationPlatforms) = postSolution
22 {76542B28-0FFD-47D3-AD6A-D0F20FA875AC}.Debug|Any CPU.ActiveCfg = Debug|Win32
23 {76542B28-0FFD-47D3-AD6A-D0F20FA875AC}.Debug|Any CPU.Build.0 = Debug|Win32
24 {76542B28-0FFD-47D3-AD6A-D0F20FA875AC}.Debug|x86.ActiveCfg = Debug|Win32
25 {76542B28-0FFD-47D3-AD6A-D0F20FA875AC}.Debug|x86.Build.0 = Debug|Win32
26 {76542B28-0FFD-47D3-AD6A-D0F20FA875AC}.Release|Any CPU.ActiveCfg = Release|Win32
27 {76542B28-0FFD-47D3-AD6A-D0F20FA875AC}.Release|Any CPU.Build.0 = Release|Win32
28 {76542B28-0FFD-47D3-AD6A-D0F20FA875AC}.Release|x86.ActiveCfg = Release|Win32
29 {76542B28-0FFD-47D3-AD6A-D0F20FA875AC}.Release|x86.Build.0 = Release|Win32
30 {4D8DDEC7-AAAC-4A32-87D0-5992FE382ED9}.Debug|Any CPU.ActiveCfg = Debug|x86
31 {4D8DDEC7-AAAC-4A32-87D0-5992FE382ED9}.Debug|Any CPU.Build.0 = Debug|x86
32 {4D8DDEC7-AAAC-4A32-87D0-5992FE382ED9}.Debug|x86.ActiveCfg = Debug|x86
33 {4D8DDEC7-AAAC-4A32-87D0-5992FE382ED9}.Debug|x86.Build.0 = Debug|x86
34 {4D8DDEC7-AAAC-4A32-87D0-5992FE382ED9}.Release|Any CPU.ActiveCfg = Release|x86
35 {4D8DDEC7-AAAC-4A32-87D0-5992FE382ED9}.Release|Any CPU.Build.0 = Release|x86
36 {4D8DDEC7-AAAC-4A32-87D0-5992FE382ED9}.Release|x86.ActiveCfg = Release|x86
37 {4D8DDEC7-AAAC-4A32-87D0-5992FE382ED9}.Release|x86.Build.0 = Release|x86
38 {6182DBCA-146A-4F37-8406-3139BBE04636}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
39 {6182DBCA-146A-4F37-8406-3139BBE04636}.Debug|Any CPU.Build.0 = Debug|Any CPU
40 {6182DBCA-146A-4F37-8406-3139BBE04636}.Debug|x86.ActiveCfg = Debug|Any CPU
41 {6182DBCA-146A-4F37-8406-3139BBE04636}.Debug|x86.Build.0 = Debug|Any CPU
42 {6182DBCA-146A-4F37-8406-3139BBE04636}.Release|Any CPU.ActiveCfg = Release|Any CPU
43 {6182DBCA-146A-4F37-8406-3139BBE04636}.Release|Any CPU.Build.0 = Release|Any CPU
44 {6182DBCA-146A-4F37-8406-3139BBE04636}.Release|x86.ActiveCfg = Release|Any CPU
45 {6182DBCA-146A-4F37-8406-3139BBE04636}.Release|x86.Build.0 = Release|Any CPU
46 {508A3DD0-FE58-4150-A1F6-A803A377012A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
47 {508A3DD0-FE58-4150-A1F6-A803A377012A}.Debug|Any CPU.Build.0 = Debug|Any CPU
48 {508A3DD0-FE58-4150-A1F6-A803A377012A}.Debug|x86.ActiveCfg = Debug|Any CPU
49 {508A3DD0-FE58-4150-A1F6-A803A377012A}.Debug|x86.Build.0 = Debug|Any CPU
50 {508A3DD0-FE58-4150-A1F6-A803A377012A}.Release|Any CPU.ActiveCfg = Release|Any CPU
51 {508A3DD0-FE58-4150-A1F6-A803A377012A}.Release|Any CPU.Build.0 = Release|Any CPU
52 {508A3DD0-FE58-4150-A1F6-A803A377012A}.Release|x86.ActiveCfg = Release|Any CPU
53 {508A3DD0-FE58-4150-A1F6-A803A377012A}.Release|x86.Build.0 = Release|Any CPU
54 EndGlobalSection
55 GlobalSection(SolutionProperties) = preSolution
56 HideSolutionNode = FALSE
57 EndGlobalSection
58 GlobalSection(ExtensibilityGlobals) = postSolution
59 SolutionGuid = {A32D323A-3843-410E-BB3A-A97ABA6E4107}
60 EndGlobalSection
61EndGlobal
diff --git a/src/ext/DirectX/Directory.Build.props b/src/ext/DirectX/Directory.Build.props
new file mode 100644
index 00000000..f83cc154
--- /dev/null
+++ b/src/ext/DirectX/Directory.Build.props
@@ -0,0 +1,29 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3<!--
4 Do NOT modify this file. Update the canonical version in Home\repo-template\src\Directory.Build.props
5 then update all of the repos.
6-->
7<Project>
8 <PropertyGroup>
9 <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
10 <EnableSourceLink Condition=" '$(NCrunch)' == '1' ">false</EnableSourceLink>
11 <MSBuildWarningsAsMessages>MSB3246</MSBuildWarningsAsMessages>
12
13 <ProjectName Condition=" '$(ProjectName)' == '' ">$(MSBuildProjectName)</ProjectName>
14 <BaseOutputPath>$([System.IO.Path]::GetFullPath($(MSBuildThisFileDirectory)..\build\))</BaseOutputPath>
15 <BaseIntermediateOutputPath>$(BaseOutputPath)obj\$(ProjectName)\</BaseIntermediateOutputPath>
16 <OutputPath>$(BaseOutputPath)$(Configuration)\</OutputPath>
17
18 <Authors>WiX Toolset Team</Authors>
19 <Company>WiX Toolset</Company>
20 <Copyright>Copyright (c) .NET Foundation and contributors. All rights reserved.</Copyright>
21 <PackageLicenseExpression>MS-RL</PackageLicenseExpression>
22 <Product>WiX Toolset</Product>
23 </PropertyGroup>
24
25 <Import Project="CSharp.Build.props" Condition=" '$(MSBuildProjectExtension)'=='.csproj' and Exists('CSharp.Build.props') " />
26 <Import Project="Cpp.Build.props" Condition=" Exists('Cpp.Build.props') And '$(MSBuildProjectExtension)'=='.vcxproj' " />
27 <Import Project="Wix.Build.props" Condition=" Exists('Wix.Build.props') And '$(MSBuildProjectExtension)'=='.wixproj' " />
28 <Import Project="Custom.Build.props" Condition=" Exists('Custom.Build.props') " />
29</Project>
diff --git a/src/ext/DirectX/Directory.Build.targets b/src/ext/DirectX/Directory.Build.targets
new file mode 100644
index 00000000..dac7452a
--- /dev/null
+++ b/src/ext/DirectX/Directory.Build.targets
@@ -0,0 +1,48 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3<!--
4 Do NOT modify this file. Update the canonical version in Home\repo-template\src\Directory.Build.targets
5 then update all of the repos.
6-->
7<!--
8 Replace PackageReferences with ProjectReferences when the projects can be found in .sln.
9 See the original here: https://github.com/dotnet/sdk/issues/1151#issuecomment-385133284
10-->
11<Project>
12 <PropertyGroup>
13 <ReplacePackageReferences>true</ReplacePackageReferences>
14 <TheSolutionPath Condition=" '$(NCrunch)'=='' ">$(SolutionPath)</TheSolutionPath>
15 <TheSolutionPath Condition=" '$(NCrunch)'=='1' ">$(NCrunchOriginalSolutionPath)</TheSolutionPath>
16 </PropertyGroup>
17
18 <Choose>
19 <When Condition="$(ReplacePackageReferences) AND '$(TheSolutionPath)' != '' AND '$(TheSolutionPath)' != '*undefined*' AND Exists('$(TheSolutionPath)')">
20
21 <PropertyGroup>
22 <SolutionFileContent>$([System.IO.File]::ReadAllText($(TheSolutionPath)))</SolutionFileContent>
23 <SmartSolutionDir>$([System.IO.Path]::GetDirectoryName( $(TheSolutionPath) ))</SmartSolutionDir>
24 <RegexPattern>(?&lt;="[PackageName]", ")(.*)(?=", ")</RegexPattern>
25 </PropertyGroup>
26
27 <ItemGroup>
28 <!-- Keep the identity of the PackageReference -->
29 <SmartPackageReference Include="@(PackageReference)">
30 <PackageName>%(Identity)</PackageName>
31 <InSolution>$(SolutionFileContent.Contains('\%(Identity).csproj'))</InSolution>
32 </SmartPackageReference>
33
34 <!-- Filter them by mapping them to another ItemGroup using the WithMetadataValue item function -->
35 <PackageInSolution Include="@(SmartPackageReference->WithMetadataValue('InSolution', True))">
36 <Pattern>$(RegexPattern.Replace('[PackageName]','%(PackageName)') )</Pattern>
37 <SmartPath>$([System.Text.RegularExpressions.Regex]::Match('$(SolutionFileContent)', '%(Pattern)'))</SmartPath>
38 </PackageInSolution>
39
40 <ProjectReference Include="@(PackageInSolution->'$(SmartSolutionDir)\%(SmartPath)' )"/>
41
42 <!-- Remove the package references that are now referenced as projects -->
43 <PackageReference Remove="@(PackageInSolution->'%(PackageName)' )"/>
44 </ItemGroup>
45
46 </When>
47 </Choose>
48</Project>
diff --git a/src/ext/DirectX/README.md b/src/ext/DirectX/README.md
new file mode 100644
index 00000000..6131cf35
--- /dev/null
+++ b/src/ext/DirectX/README.md
@@ -0,0 +1,2 @@
1# DirectX.wixext
2WixToolset.DirectX.wixext - DirectX WiX Toolset Extension
diff --git a/src/ext/DirectX/appveyor.cmd b/src/ext/DirectX/appveyor.cmd
new file mode 100644
index 00000000..3a7e2d72
--- /dev/null
+++ b/src/ext/DirectX/appveyor.cmd
@@ -0,0 +1,14 @@
1@setlocal
2@pushd %~dp0
3
4nuget restore || exit /b
5
6msbuild -p:Configuration=Release -t:Restore || exit /b
7
8msbuild -p:Configuration=Release src\test\WixToolsetTest.DirectX\WixToolsetTest.DirectX.csproj || exit /b
9dotnet test -c Release --no-build src\test\WixToolsetTest.DirectX || exit /b
10
11msbuild -p:Configuration=Release -t:Pack src\wixext\WixToolset.DirectX.wixext.csproj || exit /b
12
13@popd
14@endlocal \ No newline at end of file
diff --git a/src/ext/DirectX/appveyor.yml b/src/ext/DirectX/appveyor.yml
new file mode 100644
index 00000000..7c686b04
--- /dev/null
+++ b/src/ext/DirectX/appveyor.yml
@@ -0,0 +1,40 @@
1# Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2#
3# Do NOT modify this file. Update the canonical version in Home\repo-template\src\appveyor.yml
4# then update all of the repos.
5
6branches:
7 only:
8 - master
9 - develop
10
11image: Visual Studio 2019
12
13version: 0.0.0.{build}
14configuration: Release
15
16environment:
17 DOTNET_SKIP_FIRST_TIME_EXPERIENCE: true
18 DOTNET_CLI_TELEMETRY_OPTOUT: 1
19 NUGET_XMLDOC_MODE: skip
20
21build_script:
22 - appveyor.cmd
23
24pull_requests:
25 do_not_increment_build_number: true
26
27nuget:
28 disable_publish_on_pr: true
29
30skip_branch_with_pr: true
31skip_tags: true
32
33artifacts:
34- path: build\Release\**\*.nupkg
35 name: nuget
36
37notifications:
38- provider: Slack
39 incoming_webhook:
40 secure: p5xuu+4x2JHfwGDMDe5KcG1k7gZxqYc4jWVwvyNZv5cvkubPD2waJs5yXMAXZNN7Z63/3PWHb7q4KoY/99AjauYa1nZ4c5qYqRPFRBKTHfA=
diff --git a/src/ext/DirectX/ca/directx.cpp b/src/ext/DirectX/ca/directx.cpp
new file mode 100644
index 00000000..21838262
--- /dev/null
+++ b/src/ext/DirectX/ca/directx.cpp
@@ -0,0 +1,49 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3#include "precomp.h"
4
5/********************************************************************
6WixQueryDirectXCaps - entry point for WixQueryDirectXCaps CA
7
8 Called as Type 1 custom action (DLL from the Binary table) from
9 Windows Installer to set properties that identify the DirectX
10 capabilities ("caps") of the system.
11********************************************************************/
12extern "C" UINT __stdcall WixQueryDirectXCaps(
13 __in MSIHANDLE hInstall
14 )
15{
16#if 0
17 ::MessageBoxA(0, "break into debugger now please", "---->> ATTACH TO ME!", MB_ICONEXCLAMATION);
18#endif
19
20 HRESULT hr = S_OK;
21 DWORD er = ERROR_SUCCESS;
22 LPDIRECT3D9 pD3D = NULL;
23
24 hr = WcaInitialize(hInstall, "WixQueryDirectXCaps");
25 ExitOnFailure(hr, "failed to initialize");
26
27 pD3D = Direct3DCreate9(D3D_SDK_VERSION);
28 ExitOnNull(pD3D, hr, E_FAIL, "Direct3DCreate9 failed");
29
30 D3DCAPS9 d3dCaps;
31 hr = pD3D->GetDeviceCaps(
32 0, // first adapter
33 D3DDEVTYPE_HAL, // fail on non-HAL devices
34 &d3dCaps
35 );
36 ExitOnFailure(hr, "GetDeviceCaps call failed");
37
38 int iVertexShaderVersion = D3DSHADER_VERSION_MAJOR(d3dCaps.VertexShaderVersion) * 100 + D3DSHADER_VERSION_MINOR(d3dCaps.VertexShaderVersion);
39 WcaSetIntProperty(L"WIX_DIRECTX_VERTEXSHADERVERSION", iVertexShaderVersion);
40
41 int iPixelShaderVersion = D3DSHADER_VERSION_MAJOR(d3dCaps.PixelShaderVersion) * 100 + D3DSHADER_VERSION_MINOR(d3dCaps.PixelShaderVersion);
42 WcaSetIntProperty(L"WIX_DIRECTX_PIXELSHADERVERSION", iPixelShaderVersion);
43
44LExit:
45 ReleaseObject(pD3D);
46 return WcaFinalize(er = FAILED(hr) ? ERROR_INSTALL_FAILURE : er);
47}
48
49
diff --git a/src/ext/DirectX/ca/directx.def b/src/ext/DirectX/ca/directx.def
new file mode 100644
index 00000000..8f46f9a8
--- /dev/null
+++ b/src/ext/DirectX/ca/directx.def
@@ -0,0 +1,7 @@
1; Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3
4LIBRARY "directxca"
5
6EXPORTS
7 WixQueryDirectXCaps
diff --git a/src/ext/DirectX/ca/directxca.vcxproj b/src/ext/DirectX/ca/directxca.vcxproj
new file mode 100644
index 00000000..e772009a
--- /dev/null
+++ b/src/ext/DirectX/ca/directxca.vcxproj
@@ -0,0 +1,70 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3<Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
4 <Import Project="..\..\packages\WixToolset.DUtil.4.0.30\build\WixToolset.DUtil.props" Condition="Exists('..\..\packages\WixToolset.DUtil.4.0.30\build\WixToolset.DUtil.props')" />
5 <Import Project="..\..\packages\WixToolset.WcaUtil.4.0.16\build\WixToolset.WcaUtil.props" Condition="Exists('..\..\packages\WixToolset.WcaUtil.4.0.16\build\WixToolset.WcaUtil.props')" />
6
7 <ItemGroup Label="ProjectConfigurations">
8 <ProjectConfiguration Include="Debug|Win32">
9 <Configuration>Debug</Configuration>
10 <Platform>Win32</Platform>
11 </ProjectConfiguration>
12 <ProjectConfiguration Include="Release|Win32">
13 <Configuration>Release</Configuration>
14 <Platform>Win32</Platform>
15 </ProjectConfiguration>
16 <ProjectConfiguration Include="Debug|x64">
17 <Configuration>Debug</Configuration>
18 <Platform>x64</Platform>
19 </ProjectConfiguration>
20 <ProjectConfiguration Include="Release|x64">
21 <Configuration>Release</Configuration>
22 <Platform>x64</Platform>
23 </ProjectConfiguration>
24 <ProjectConfiguration Include="Debug|ARM64">
25 <Configuration>Debug</Configuration>
26 <Platform>ARM64</Platform>
27 </ProjectConfiguration>
28 <ProjectConfiguration Include="Release|ARM64">
29 <Configuration>Release</Configuration>
30 <Platform>ARM64</Platform>
31 </ProjectConfiguration>
32 </ItemGroup>
33
34 <PropertyGroup Label="Globals">
35 <ProjectGuid>{76542B28-0FFD-47D3-AD6A-D0F20FA875AC}</ProjectGuid>
36 <ConfigurationType>DynamicLibrary</ConfigurationType>
37 <PlatformToolset>v142</PlatformToolset>
38 <CharacterSet>Unicode</CharacterSet>
39 <TargetName>directxca</TargetName>
40 <ProjectModuleDefinitionFile>directx.def</ProjectModuleDefinitionFile>
41 <Description>WiX Toolset DirectX CustomAction</Description>
42 </PropertyGroup>
43
44 <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
45 <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
46
47 <PropertyGroup>
48 <ProjectAdditionalLinkLibraries>d3d9.lib;msi.lib</ProjectAdditionalLinkLibraries>
49 </PropertyGroup>
50
51 <ItemGroup>
52 <ClCompile Include="directx.cpp" />
53 <ClCompile Include="dllmain.cpp">
54 <PrecompiledHeader>Create</PrecompiledHeader>
55 </ClCompile>
56 <ClInclude Include="precomp.h" />
57 <None Include="directx.def" />
58 <None Include="packages.config" />
59 </ItemGroup>
60
61 <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
62
63 <Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
64 <PropertyGroup>
65 <ErrorText>This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
66 </PropertyGroup>
67 <Error Condition="!Exists('..\..\packages\WixToolset.DUtil.4.0.30\build\WixToolset.DUtil.props')" Text="$([System.String]::Format('$(ErrorText)', '..\..\packages\WixToolset.DUtil.4.0.30\build\WixToolset.DUtil.props'))" />
68 <Error Condition="!Exists('..\..\packages\WixToolset.WcaUtil.4.0.16\build\WixToolset.WcaUtil.props')" Text="$([System.String]::Format('$(ErrorText)', '..\..\packages\WixToolset.WcaUtil.4.0.16\build\WixToolset.WcaUtil.props'))" />
69 </Target>
70</Project> \ No newline at end of file
diff --git a/src/ext/DirectX/ca/dllmain.cpp b/src/ext/DirectX/ca/dllmain.cpp
new file mode 100644
index 00000000..df53f872
--- /dev/null
+++ b/src/ext/DirectX/ca/dllmain.cpp
@@ -0,0 +1,26 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3#include "precomp.h"
4
5/********************************************************************
6DllMain - standard entry point for all WiX CustomActions
7
8********************************************************************/
9extern "C" BOOL WINAPI DllMain(
10 IN HINSTANCE hInst,
11 IN ULONG ulReason,
12 IN LPVOID)
13{
14 switch(ulReason)
15 {
16 case DLL_PROCESS_ATTACH:
17 WcaGlobalInitialize(hInst);
18 break;
19
20 case DLL_PROCESS_DETACH:
21 WcaGlobalFinalize();
22 break;
23 }
24
25 return TRUE;
26}
diff --git a/src/ext/DirectX/ca/packages.config b/src/ext/DirectX/ca/packages.config
new file mode 100644
index 00000000..e3dc0e43
--- /dev/null
+++ b/src/ext/DirectX/ca/packages.config
@@ -0,0 +1,5 @@
1<?xml version="1.0" encoding="utf-8"?>
2<packages>
3 <package id="WixToolset.DUtil" version="4.0.30" targetFramework="native" />
4 <package id="WixToolset.WcaUtil" version="4.0.16" targetFramework="native" />
5</packages> \ No newline at end of file
diff --git a/src/ext/DirectX/ca/precomp.h b/src/ext/DirectX/ca/precomp.h
new file mode 100644
index 00000000..75a15829
--- /dev/null
+++ b/src/ext/DirectX/ca/precomp.h
@@ -0,0 +1,11 @@
1#pragma once
2// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
3
4
5#include <windows.h>
6#include <msidefs.h>
7#include <msiquery.h>
8#include <D3D9.h>
9
10#include "wcautil.h"
11#include "strutil.h"
diff --git a/src/ext/DirectX/nuget.config b/src/ext/DirectX/nuget.config
new file mode 100644
index 00000000..db7aba29
--- /dev/null
+++ b/src/ext/DirectX/nuget.config
@@ -0,0 +1,17 @@
1<?xml version="1.0" encoding="utf-8"?>
2<configuration>
3 <packageSources>
4 <clear />
5 <add key="wixtoolset-burn" value="https://ci.appveyor.com/nuget/wixtoolset-burn" />
6 <add key="wixtoolset-data" value="https://ci.appveyor.com/nuget/wixtoolset-data" />
7 <add key="wixtoolset-extensibility" value="https://ci.appveyor.com/nuget/wixtoolset-extensibility" />
8 <add key="wixtoolset-core" value="https://ci.appveyor.com/nuget/wixtoolset-core" />
9 <add key="wixtoolset-core-native" value="https://ci.appveyor.com/nuget/wixtoolset-core-native" />
10 <add key="wixtoolset-dtf" value="https://ci.appveyor.com/nuget/wixtoolset-dtf" />
11 <add key="wixtoolset-dutil" value="https://ci.appveyor.com/nuget/wixtoolset-dutil" />
12 <add key="wixtoolset-wcautil" value="https://ci.appveyor.com/nuget/wixtoolset-wcautil" />
13 <add key="wixtoolset-tools" value="https://ci.appveyor.com/nuget/wixtoolset-tools" />
14 <add key="wixbuildtools" value="https://ci.appveyor.com/nuget/wixbuildtools" />
15 <add key="api.nuget.org" value="https://api.nuget.org/v3/index.json" protocolVersion="3" />
16 </packageSources>
17</configuration> \ No newline at end of file
diff --git a/src/ext/DirectX/test/WixToolsetTest.DirectX/DirectXExtensionFixture.cs b/src/ext/DirectX/test/WixToolsetTest.DirectX/DirectXExtensionFixture.cs
new file mode 100644
index 00000000..81a5fb00
--- /dev/null
+++ b/src/ext/DirectX/test/WixToolsetTest.DirectX/DirectXExtensionFixture.cs
@@ -0,0 +1,32 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolsetTest.DirectX
4{
5 using System.Linq;
6 using WixBuildTools.TestSupport;
7 using WixToolset.Core.TestPackage;
8 using WixToolset.DirectX;
9 using Xunit;
10
11 public class DirectXExtensionFixture
12 {
13 [Fact]
14 public void CanBuildUsingPixelShaderVersion()
15 {
16 var folder = TestData.Get(@"TestData\UsingPixelShaderVersion");
17 var build = new Builder(folder, typeof(DirectXExtensionFactory), new[] { folder });
18
19 var results = build.BuildAndQuery(Build, "CustomAction");
20 Assert.Equal(new[]
21 {
22 "CustomAction:WixQueryDirectXCaps\t65\tDirectXCA\tWixQueryDirectXCaps\t",
23 }, results);
24 }
25
26 private static void Build(string[] args)
27 {
28 var result = WixRunner.Execute(args)
29 .AssertSuccess();
30 }
31 }
32}
diff --git a/src/ext/DirectX/test/WixToolsetTest.DirectX/TestData/UsingPixelShaderVersion/Package.en-us.wxl b/src/ext/DirectX/test/WixToolsetTest.DirectX/TestData/UsingPixelShaderVersion/Package.en-us.wxl
new file mode 100644
index 00000000..38c12ac1
--- /dev/null
+++ b/src/ext/DirectX/test/WixToolsetTest.DirectX/TestData/UsingPixelShaderVersion/Package.en-us.wxl
@@ -0,0 +1,11 @@
1<?xml version="1.0" encoding="utf-8"?>
2
3<!--
4This file contains the declaration of all the localizable strings.
5-->
6<WixLocalization xmlns="http://wixtoolset.org/schemas/v4/wxl" Culture="en-US">
7
8 <String Id="DowngradeError">A newer version of [ProductName] is already installed.</String>
9 <String Id="FeatureTitle">MsiPackage</String>
10
11</WixLocalization>
diff --git a/src/ext/DirectX/test/WixToolsetTest.DirectX/TestData/UsingPixelShaderVersion/Package.wxs b/src/ext/DirectX/test/WixToolsetTest.DirectX/TestData/UsingPixelShaderVersion/Package.wxs
new file mode 100644
index 00000000..bd31e81f
--- /dev/null
+++ b/src/ext/DirectX/test/WixToolsetTest.DirectX/TestData/UsingPixelShaderVersion/Package.wxs
@@ -0,0 +1,15 @@
1<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
2 <Package Name="MsiPackage" Language="1033" Version="1.0.0.0" Manufacturer="Example Corporation" UpgradeCode="047730a5-30fe-4a62-a520-da9381b8226a" InstallerVersion="200">
3 <MajorUpgrade DowngradeErrorMessage="!(loc.DowngradeError)" />
4
5 <Feature Id="ProductFeature" Title="!(loc.FeatureTitle)">
6 <ComponentGroupRef Id="ProductComponents" />
7 </Feature>
8 </Package>
9
10 <Fragment>
11 <StandardDirectory Id="ProgramFilesFolder">
12 <Directory Id="INSTALLFOLDER" Name="MsiPackage" />
13 </StandardDirectory>
14 </Fragment>
15</Wix>
diff --git a/src/ext/DirectX/test/WixToolsetTest.DirectX/TestData/UsingPixelShaderVersion/PackageComponents.wxs b/src/ext/DirectX/test/WixToolsetTest.DirectX/TestData/UsingPixelShaderVersion/PackageComponents.wxs
new file mode 100644
index 00000000..f3a2ae92
--- /dev/null
+++ b/src/ext/DirectX/test/WixToolsetTest.DirectX/TestData/UsingPixelShaderVersion/PackageComponents.wxs
@@ -0,0 +1,11 @@
1<?xml version="1.0" encoding="utf-8"?>
2<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
3 <Fragment>
4 <PropertyRef Id="WIX_DIRECTX_PIXELSHADERVERSION" />
5 <ComponentGroup Id="ProductComponents" Directory="INSTALLFOLDER">
6 <Component>
7 <File Source="example.txt" />
8 </Component>
9 </ComponentGroup>
10 </Fragment>
11</Wix>
diff --git a/src/ext/DirectX/test/WixToolsetTest.DirectX/TestData/UsingPixelShaderVersion/example.txt b/src/ext/DirectX/test/WixToolsetTest.DirectX/TestData/UsingPixelShaderVersion/example.txt
new file mode 100644
index 00000000..1b4ffe8a
--- /dev/null
+++ b/src/ext/DirectX/test/WixToolsetTest.DirectX/TestData/UsingPixelShaderVersion/example.txt
@@ -0,0 +1 @@
This is example.txt. \ No newline at end of file
diff --git a/src/ext/DirectX/test/WixToolsetTest.DirectX/WixToolsetTest.DirectX.csproj b/src/ext/DirectX/test/WixToolsetTest.DirectX/WixToolsetTest.DirectX.csproj
new file mode 100644
index 00000000..1722a613
--- /dev/null
+++ b/src/ext/DirectX/test/WixToolsetTest.DirectX/WixToolsetTest.DirectX.csproj
@@ -0,0 +1,41 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3
4<Project Sdk="Microsoft.NET.Sdk">
5 <PropertyGroup>
6 <TargetFramework>netcoreapp3.1</TargetFramework>
7 <IsPackable>false</IsPackable>
8 </PropertyGroup>
9
10 <PropertyGroup>
11 <NoWarn>NU1701</NoWarn>
12 </PropertyGroup>
13
14 <ItemGroup>
15 <Content Include="TestData\UsingPixelShaderVersion\example.txt" CopyToOutputDirectory="PreserveNewest" />
16 <Content Include="TestData\UsingPixelShaderVersion\Package.en-us.wxl" CopyToOutputDirectory="PreserveNewest" />
17 <Content Include="TestData\UsingPixelShaderVersion\Package.wxs" CopyToOutputDirectory="PreserveNewest" />
18 <Content Include="TestData\UsingPixelShaderVersion\PackageComponents.wxs" CopyToOutputDirectory="PreserveNewest" />
19 </ItemGroup>
20
21 <ItemGroup>
22 <ProjectReference Include="..\..\wixext\WixToolset.DirectX.wixext.csproj" />
23 </ItemGroup>
24
25 <ItemGroup>
26 <PackageReference Include="WixToolset.Core" Version="4.0.*" />
27 <PackageReference Include="WixToolset.Core.Burn" Version="4.0.*" />
28 <PackageReference Include="WixToolset.Core.WindowsInstaller" Version="4.0.*" />
29 <PackageReference Include="WixToolset.Core.TestPackage" Version="4.0.*" />
30 </ItemGroup>
31
32 <ItemGroup>
33 <PackageReference Include="WixBuildTools.TestSupport" Version="4.0.*" />
34 </ItemGroup>
35
36 <ItemGroup>
37 <PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.3.0" />
38 <PackageReference Include="xunit" Version="2.4.1" />
39 <PackageReference Include="xunit.runner.visualstudio" Version="2.4.1" PrivateAssets="All" />
40 </ItemGroup>
41</Project>
diff --git a/src/ext/DirectX/wix.snk b/src/ext/DirectX/wix.snk
new file mode 100644
index 00000000..3908a66a
--- /dev/null
+++ b/src/ext/DirectX/wix.snk
Binary files differ
diff --git a/src/ext/DirectX/wixext/DirectXDecompiler.cs b/src/ext/DirectX/wixext/DirectXDecompiler.cs
new file mode 100644
index 00000000..03f90163
--- /dev/null
+++ b/src/ext/DirectX/wixext/DirectXDecompiler.cs
@@ -0,0 +1,72 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.DirectX
4{
5#if TODO_CONSIDER_DECOMPILER
6 using System;
7 using System.Text;
8 using WixToolset.Data;
9 using WixToolset.Extensibility;
10 using Wix = WixToolset.Data.Serialize;
11
12 /// <summary>
13 /// The WiX Toolset DirectX Extension.
14 /// </summary>
15 public sealed class DirectXDecompiler : DecompilerExtension
16 {
17 /// <summary>
18 /// Get the extensions library to be removed.
19 /// </summary>
20 /// <param name="tableDefinitions">Table definitions for library.</param>
21 /// <returns>Library to remove from decompiled output.</returns>
22 public override Library GetLibraryToRemove(TableDefinitionCollection tableDefinitions)
23 {
24 return DirectXExtensionData.GetExtensionLibrary(tableDefinitions);
25 }
26
27 /// <summary>
28 /// Called at the beginning of the decompilation of a database.
29 /// </summary>
30 /// <param name="tables">The collection of all tables.</param>
31 public override void Initialize(TableIndexedCollection tables)
32 {
33 Table propertyTable = tables["Property"];
34
35 if (null != propertyTable)
36 {
37 foreach (Row row in propertyTable.Rows)
38 {
39 if ("SecureCustomProperties" == row[0].ToString())
40 {
41 // if we've referenced any of the DirectX properties, add
42 // a PropertyRef to pick up the CA from the extension and then remove
43 // it from the SecureCustomExtensions property so we don't get duplicates
44 StringBuilder remainingProperties = new StringBuilder();
45 string[] secureCustomProperties = row[1].ToString().Split(';');
46 foreach (string property in secureCustomProperties)
47 {
48 if (property.StartsWith("WIX_DIRECTX_"))
49 {
50 Wix.PropertyRef propertyRef = new Wix.PropertyRef();
51 propertyRef.Id = property;
52 this.Core.RootElement.AddChild(propertyRef);
53 }
54 else
55 {
56 if (0 < remainingProperties.Length)
57 {
58 remainingProperties.Append(";");
59 }
60 remainingProperties.Append(property);
61 }
62 }
63
64 row[1] = remainingProperties.ToString();
65 break;
66 }
67 }
68 }
69 }
70 }
71#endif
72}
diff --git a/src/ext/DirectX/wixext/DirectXExtensionData.cs b/src/ext/DirectX/wixext/DirectXExtensionData.cs
new file mode 100644
index 00000000..d61af23f
--- /dev/null
+++ b/src/ext/DirectX/wixext/DirectXExtensionData.cs
@@ -0,0 +1,24 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.DirectX
4{
5 using WixToolset.Data;
6 using WixToolset.Extensibility;
7
8 /// <summary>
9 /// The WiX Toolset DirectX Extension.
10 /// </summary>
11 public sealed class DirectXExtensionData : BaseExtensionData
12 {
13 /// <summary>
14 /// Gets the default culture.
15 /// </summary>
16 /// <value>The default culture.</value>
17 public override string DefaultCulture => "en-US";
18
19 public override Intermediate GetLibrary(ISymbolDefinitionCreator symbolDefinitions)
20 {
21 return Intermediate.Load(typeof(DirectXExtensionData).Assembly, "WixToolset.DirectX.directx.wixlib", symbolDefinitions);
22 }
23 }
24}
diff --git a/src/ext/DirectX/wixext/DirectXExtensionFactory.cs b/src/ext/DirectX/wixext/DirectXExtensionFactory.cs
new file mode 100644
index 00000000..fb7f84aa
--- /dev/null
+++ b/src/ext/DirectX/wixext/DirectXExtensionFactory.cs
@@ -0,0 +1,16 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.DirectX
4{
5 using System;
6 using System.Collections.Generic;
7 using WixToolset.Extensibility;
8
9 public class DirectXExtensionFactory : BaseExtensionFactory
10 {
11 protected override IReadOnlyCollection<Type> ExtensionTypes => new[]
12 {
13 typeof(DirectXExtensionData),
14 };
15 }
16}
diff --git a/src/ext/DirectX/wixext/WixToolset.DirectX.wixext.csproj b/src/ext/DirectX/wixext/WixToolset.DirectX.wixext.csproj
new file mode 100644
index 00000000..a848ff9a
--- /dev/null
+++ b/src/ext/DirectX/wixext/WixToolset.DirectX.wixext.csproj
@@ -0,0 +1,31 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3
4<Project Sdk="Microsoft.NET.Sdk">
5 <PropertyGroup>
6 <TargetFramework>netstandard2.0</TargetFramework>
7 <RootNamespace>WixToolset.DirectX</RootNamespace>
8 <Description>WiX Toolset DirectX Extension</Description>
9 <Title>WiX Toolset DirectX Extension</Title>
10 <IsTool>true</IsTool>
11 <ContentTargetFolders>build</ContentTargetFolders>
12 </PropertyGroup>
13
14 <ItemGroup>
15 <Content Include="$(MSBuildThisFileName).targets" />
16 <EmbeddedResource Include="$(OutputPath)..\directx.wixlib" />
17 </ItemGroup>
18
19 <ItemGroup>
20 <PackageReference Include="WixToolset.Data" Version="4.0.*" PrivateAssets="all" />
21 <PackageReference Include="WixToolset.Extensibility" Version="4.0.*" PrivateAssets="all" />
22 </ItemGroup>
23
24 <ItemGroup>
25 <ProjectReference Include="..\wixlib\directx.wixproj" ReferenceOutputAssembly="false" Condition=" '$(NCrunch)'=='' " />
26 </ItemGroup>
27
28 <ItemGroup>
29 <PackageReference Include="Nerdbank.GitVersioning" Version="2.1.65" PrivateAssets="all" />
30 </ItemGroup>
31</Project>
diff --git a/src/ext/DirectX/wixext/WixToolset.DirectX.wixext.targets b/src/ext/DirectX/wixext/WixToolset.DirectX.wixext.targets
new file mode 100644
index 00000000..4e27a6da
--- /dev/null
+++ b/src/ext/DirectX/wixext/WixToolset.DirectX.wixext.targets
@@ -0,0 +1,11 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3
4<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0">
5 <PropertyGroup>
6 <WixToolsetDirectXWixextPath Condition=" '$(WixToolsetDirectXWixextPath)' == '' ">$(MSBuildThisFileDirectory)..\tools\WixToolset.DirectX.wixext.dll</WixToolsetDirectXWixextPath>
7 </PropertyGroup>
8 <ItemGroup>
9 <WixExtension Include="$(WixToolsetDirectXWixextPath)" />
10 </ItemGroup>
11</Project>
diff --git a/src/ext/DirectX/wixlib/DirectXExtension.wxs b/src/ext/DirectX/wixlib/DirectXExtension.wxs
new file mode 100644
index 00000000..b83dc98d
--- /dev/null
+++ b/src/ext/DirectX/wixlib/DirectXExtension.wxs
@@ -0,0 +1,33 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2
3
4<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
5 <?include caerr.wxi ?>
6
7 <!-- DirectX Custom Action DLL Definitions -->
8 <Fragment>
9 <Binary Id="DirectXCA" SourceFile="directxca.dll" />
10 </Fragment>
11
12 <Fragment>
13 <CustomAction Id="WixQueryDirectXCaps" DllEntry="WixQueryDirectXCaps" Return="ignore" BinaryRef="DirectXCA" />
14
15 <InstallUISequence>
16 <Custom Action="WixQueryDirectXCaps" Before="LaunchConditions" Overridable="yes" Condition="VersionNT &gt; 400" />
17 </InstallUISequence>
18
19 <InstallExecuteSequence>
20 <Custom Action="WixQueryDirectXCaps" Before="LaunchConditions" Overridable="yes" Condition="VersionNT &gt; 400" />
21 </InstallExecuteSequence>
22 </Fragment>
23
24 <Fragment>
25 <Property Id="WIX_DIRECTX_VERTEXSHADERVERSION" Secure="yes" Value="NotSet" />
26 <CustomActionRef Id="WixQueryDirectXCaps" />
27 </Fragment>
28
29 <Fragment>
30 <Property Id="WIX_DIRECTX_PIXELSHADERVERSION" Secure="yes" Value="NotSet" />
31 <CustomActionRef Id="WixQueryDirectXCaps" />
32 </Fragment>
33</Wix>
diff --git a/src/ext/DirectX/wixlib/caerr.wxi b/src/ext/DirectX/wixlib/caerr.wxi
new file mode 100644
index 00000000..ff7ec121
--- /dev/null
+++ b/src/ext/DirectX/wixlib/caerr.wxi
@@ -0,0 +1,96 @@
1<Include xmlns="http://wixtoolset.org/schemas/v4/wxs">
2 <?define msierrSecureObjectsFailedCreateSD = 25520?>
3 <?define msierrSecureObjectsFailedSet = 25521?>
4 <?define msierrSecureObjectsUnknownType = 25522?>
5 <?define msierrXmlFileFailedRead = 25530?>
6 <?define msierrXmlFileFailedOpen = 25531?>
7 <?define msierrXmlFileFailedSelect = 25532?>
8 <?define msierrXmlFileFailedSave = 25533?>
9 <?define msierrXmlConfigFailedRead = 25540?>
10 <?define msierrXmlConfigFailedOpen = 25541?>
11 <?define msierrXmlConfigFailedSelect = 25542?>
12 <?define msierrXmlConfigFailedSave = 25543?>
13 <?define msierrFirewallCannotConnect = 25580?>
14 <?define msierrIISCannotConnect = 26001?>
15 <?define msierrIISFailedReadWebSite = 26002?>
16 <?define msierrIISFailedReadWebDirs = 26003?>
17 <?define msierrIISFailedReadVDirs = 26004?>
18 <?define msierrIISFailedReadFilters = 26005?>
19 <?define msierrIISFailedReadAppPool = 26006?>
20 <?define msierrIISFailedReadMimeMap = 26007?>
21 <?define msierrIISFailedReadProp = 26008?>
22 <?define msierrIISFailedReadWebSvcExt = 26009?>
23 <?define msierrIISFailedReadWebError = 26010?>
24 <?define msierrIISFailedReadHttpHeader = 26011?>
25 <?define msierrIISFailedSchedTransaction = 26031?>
26 <?define msierrIISFailedSchedInstallWebs = 26032?>
27 <?define msierrIISFailedSchedInstallWebDirs = 26033?>
28 <?define msierrIISFailedSchedInstallVDirs = 26034?>
29 <?define msierrIISFailedSchedInstallFilters = 26035?>
30 <?define msierrIISFailedSchedInstallAppPool = 26036?>
31 <?define msierrIISFailedSchedInstallProp = 26037?>
32 <?define msierrIISFailedSchedInstallWebSvcExt = 26038?>
33 <?define msierrIISFailedSchedUninstallWebs = 26051?>
34 <?define msierrIISFailedSchedUninstallWebDirs = 26052?>
35 <?define msierrIISFailedSchedUninstallVDirs = 26053?>
36 <?define msierrIISFailedSchedUninstallFilters = 26054?>
37 <?define msierrIISFailedSchedUninstallAppPool = 26055?>
38 <?define msierrIISFailedSchedUninstallProp = 26056?>
39 <?define msierrIISFailedSchedUninstallWebSvcExt = 26057?>
40 <?define msierrIISFailedStartTransaction = 26101?>
41 <?define msierrIISFailedOpenKey = 26102?>
42 <?define msierrIISFailedCreateKey = 26103?>
43 <?define msierrIISFailedWriteData = 26104?>
44 <?define msierrIISFailedCreateApp = 26105?>
45 <?define msierrIISFailedDeleteKey = 26106?>
46 <?define msierrIISFailedDeleteApp = 26107?>
47 <?define msierrIISFailedDeleteValue = 26108?>
48 <?define msierrIISFailedCommitInUse = 26109?>
49 <?define msierrSQLFailedCreateDatabase = 26201?>
50 <?define msierrSQLFailedDropDatabase = 26202?>
51 <?define msierrSQLFailedConnectDatabase = 26203?>
52 <?define msierrSQLFailedExecString = 26204?>
53 <?define msierrSQLDatabaseAlreadyExists = 26205?>
54 <?define msierrPERFMONFailedRegisterDLL = 26251?>
55 <?define msierrPERFMONFailedUnregisterDLL = 26252?>
56 <?define msierrInstallPerfCounterData = 26253?>
57 <?define msierrUninstallPerfCounterData = 26254?>
58 <?define msierrSMBFailedCreate = 26301?>
59 <?define msierrSMBFailedDrop = 26302?>
60 <?define msierrCERTFailedOpen = 26351?>
61 <?define msierrCERTFailedAdd = 26352?>
62 <?define msierrUSRFailedUserCreate = 26401?>
63 <?define msierrUSRFailedUserCreatePswd = 26402?>
64 <?define msierrUSRFailedUserGroupAdd = 26403?>
65 <?define msierrUSRFailedUserCreateExists = 26404?>
66 <?define msierrUSRFailedGrantLogonAsService = 26405?>
67 <?define msierrDependencyMissingDependencies = 26451?>
68 <?define msierrDependencyHasDependents = 26452?>
69 <?define msierrDotNetRuntimeRequired = 27000?>
70 <?define msierrComPlusCannotConnect = 28001?>
71 <?define msierrComPlusPartitionReadFailed = 28002?>
72 <?define msierrComPlusPartitionRoleReadFailed = 28003?>
73 <?define msierrComPlusUserInPartitionRoleReadFailed = 28004?>
74 <?define msierrComPlusPartitionUserReadFailed = 28005?>
75 <?define msierrComPlusApplicationReadFailed = 28006?>
76 <?define msierrComPlusApplicationRoleReadFailed = 28007?>
77 <?define msierrComPlusUserInApplicationRoleReadFailed = 28008?>
78 <?define msierrComPlusAssembliesReadFailed = 28009?>
79 <?define msierrComPlusSubscriptionReadFailed = 28010?>
80 <?define msierrComPlusPartitionDependency = 28011?>
81 <?define msierrComPlusPartitionNotFound = 28012?>
82 <?define msierrComPlusPartitionIdConflict = 28013?>
83 <?define msierrComPlusPartitionNameConflict = 28014?>
84 <?define msierrComPlusApplicationDependency = 28015?>
85 <?define msierrComPlusApplicationNotFound = 28016?>
86 <?define msierrComPlusApplicationIdConflict = 28017?>
87 <?define msierrComPlusApplicationNameConflict = 28018?>
88 <?define msierrComPlusApplicationRoleDependency = 28019?>
89 <?define msierrComPlusApplicationRoleNotFound = 28020?>
90 <?define msierrComPlusApplicationRoleConflict = 28021?>
91 <?define msierrComPlusAssemblyDependency = 28022?>
92 <?define msierrComPlusSubscriptionIdConflict = 28023?>
93 <?define msierrComPlusSubscriptionNameConflict = 28024?>
94 <?define msierrComPlusFailedLookupNames = 28025?>
95 <?define msierrMsmqCannotConnect = 28101?>
96</Include> \ No newline at end of file
diff --git a/src/ext/DirectX/wixlib/directx.wixproj b/src/ext/DirectX/wixlib/directx.wixproj
new file mode 100644
index 00000000..bdad24a4
--- /dev/null
+++ b/src/ext/DirectX/wixlib/directx.wixproj
@@ -0,0 +1,13 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2<Project Sdk="WixToolset.Sdk" ToolsVersion="4.0">
3 <PropertyGroup>
4 <OutputType>Library</OutputType>
5 <BindFiles>true</BindFiles>
6 </PropertyGroup>
7 <ItemGroup>
8 <ProjectReference Include="..\ca\directxca.vcxproj" />
9 </ItemGroup>
10 <ItemGroup>
11 <PackageReference Include="Nerdbank.GitVersioning" Version="2.1.65" PrivateAssets="All" />
12 </ItemGroup>
13</Project> \ No newline at end of file
diff --git a/src/ext/Firewall/CSharp.Build.props b/src/ext/Firewall/CSharp.Build.props
new file mode 100644
index 00000000..b12f4c6e
--- /dev/null
+++ b/src/ext/Firewall/CSharp.Build.props
@@ -0,0 +1,11 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2<!--
3 Do NOT modify this file. Update the canonical version in Home\repo-template\src\CSharp.Build.props
4 then update all of the repos.
5-->
6<Project>
7 <PropertyGroup>
8 <SignAssembly>true</SignAssembly>
9 <AssemblyOriginatorKeyFile>$([System.IO.Path]::GetFullPath($(MSBuildThisFileDirectory)wix.snk))</AssemblyOriginatorKeyFile>
10 </PropertyGroup>
11</Project>
diff --git a/src/ext/Firewall/Cpp.Build.props b/src/ext/Firewall/Cpp.Build.props
new file mode 100644
index 00000000..9b7a1bb5
--- /dev/null
+++ b/src/ext/Firewall/Cpp.Build.props
@@ -0,0 +1,86 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3
4<Project>
5 <PropertyGroup>
6 <Platform Condition=" '$(Platform)' == '' OR '$(Platform)' == 'AnyCPU' ">Win32</Platform>
7 <IntDir>$(BaseIntermediateOutputPath)$(Configuration)\$(Platform)\</IntDir>
8 <OutDir>$(OutputPath)$(Platform)\</OutDir>
9 </PropertyGroup>
10
11 <PropertyGroup Condition="'$(WindowsTargetPlatformVersion)'=='' AND '$(VisualStudioVersion)'>='15.0'">
12 <WindowsTargetPlatformVersion>$([Microsoft.Build.Utilities.ToolLocationHelper]::GetLatestSDKTargetPlatformVersion('Windows', '10.0'))</WindowsTargetPlatformVersion>
13 </PropertyGroup>
14
15 <ItemDefinitionGroup>
16 <ClCompile>
17 <DisableSpecificWarnings>$(DisableSpecificCompilerWarnings)</DisableSpecificWarnings>
18 <WarningLevel>Level4</WarningLevel>
19 <AdditionalIncludeDirectories>$(ProjectDir)inc;$(MSBuildProjectDirectory);$(IntDir);$(SqlCESdkIncludePath);$(ProjectAdditionalIncludeDirectories);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
20 <PreprocessorDefinitions>WIN32;_WINDOWS;_WIN32_MSI=500;_WIN32_WINNT=0x0501;$(ArmPreprocessorDefinitions);$(UnicodePreprocessorDefinitions);_CRT_STDIO_LEGACY_WIDE_SPECIFIERS;_WINSOCK_DEPRECATED_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
21 <PrecompiledHeader>Use</PrecompiledHeader>
22 <PrecompiledHeaderFile>precomp.h</PrecompiledHeaderFile>
23 <CallingConvention Condition="'$(Platform)'=='Win32'">StdCall</CallingConvention>
24 <TreatWarningAsError>true</TreatWarningAsError>
25 <ExceptionHandling>false</ExceptionHandling>
26 <AdditionalOptions>-YlprecompDefine</AdditionalOptions>
27 <AdditionalOptions Condition=" $(PlatformToolset.StartsWith('v14')) ">/Zc:threadSafeInit- %(AdditionalOptions)</AdditionalOptions>
28 <MultiProcessorCompilation Condition=" $(NUMBER_OF_PROCESSORS) &gt; 4 ">true</MultiProcessorCompilation>
29 </ClCompile>
30 <ResourceCompile>
31 <PreprocessorDefinitions>$(ArmPreprocessorDefinitions);%(PreprocessorDefinitions)</PreprocessorDefinitions>
32 <AdditionalIncludeDirectories>$(ProjectAdditionalResourceIncludeDirectories);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
33 </ResourceCompile>
34 <Lib>
35 <AdditionalLibraryDirectories>$(OutDir);$(AdditionalMultiTargetLibraryPath);$(ProjectAdditionalLibraryDirectories);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
36 </Lib>
37 <Link>
38 <SubSystem>$(ProjectSubSystem)</SubSystem>
39 <ModuleDefinitionFile>$(ProjectModuleDefinitionFile)</ModuleDefinitionFile>
40 <NoEntryPoint>$(ResourceOnlyDll)</NoEntryPoint>
41 <GenerateDebugInformation>true</GenerateDebugInformation>
42 <AdditionalDependencies>$(ProjectAdditionalLinkLibraries);advapi32.lib;comdlg32.lib;user32.lib;oleaut32.lib;gdi32.lib;shell32.lib;ole32.lib;version.lib;%(AdditionalDependencies)</AdditionalDependencies>
43 <AdditionalLibraryDirectories>$(OutDir);$(AdditionalMultiTargetLibraryPath);$(ArmLibraryDirectories);$(ProjectAdditionalLinkLibraryDirectories);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
44 <AdditionalOptions Condition=" $(PlatformToolset.StartsWith('v14')) ">/IGNORE:4099 %(AdditionalOptions)</AdditionalOptions>
45 </Link>
46 </ItemDefinitionGroup>
47
48 <ItemDefinitionGroup Condition=" '$(Platform)'=='Win32' and '$(PlatformToolset)'!='v100'">
49 <ClCompile>
50 <EnableEnhancedInstructionSet>NoExtensions</EnableEnhancedInstructionSet>
51 </ClCompile>
52 </ItemDefinitionGroup>
53 <ItemDefinitionGroup Condition=" '$(Platform)'=='arm' ">
54 <ClCompile>
55 <CallingConvention>CDecl</CallingConvention>
56 </ClCompile>
57 </ItemDefinitionGroup>
58 <ItemDefinitionGroup Condition=" '$(ConfigurationType)'=='StaticLibrary' ">
59 <ClCompile>
60 <DebugInformationFormat>OldStyle</DebugInformationFormat>
61 <OmitDefaultLibName>true</OmitDefaultLibName>
62 <IgnoreAllDefaultLibraries>true</IgnoreAllDefaultLibraries>
63 </ClCompile>
64 </ItemDefinitionGroup>
65 <ItemDefinitionGroup Condition=" '$(Configuration)'=='Debug' ">
66 <ClCompile>
67 <Optimization>Disabled</Optimization>
68 <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
69 <PreprocessorDefinitions>_DEBUG;DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
70 <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
71 </ClCompile>
72 </ItemDefinitionGroup>
73 <ItemDefinitionGroup Condition=" '$(Configuration)'=='Release' ">
74 <ClCompile>
75 <Optimization>MinSpace</Optimization>
76 <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
77 <FunctionLevelLinking>true</FunctionLevelLinking>
78 <IntrinsicFunctions>true</IntrinsicFunctions>
79 <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
80 </ClCompile>
81 <Link>
82 <EnableCOMDATFolding>true</EnableCOMDATFolding>
83 <OptimizeReferences>true</OptimizeReferences>
84 </Link>
85 </ItemDefinitionGroup>
86</Project>
diff --git a/src/ext/Firewall/Directory.Build.props b/src/ext/Firewall/Directory.Build.props
new file mode 100644
index 00000000..f83cc154
--- /dev/null
+++ b/src/ext/Firewall/Directory.Build.props
@@ -0,0 +1,29 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3<!--
4 Do NOT modify this file. Update the canonical version in Home\repo-template\src\Directory.Build.props
5 then update all of the repos.
6-->
7<Project>
8 <PropertyGroup>
9 <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
10 <EnableSourceLink Condition=" '$(NCrunch)' == '1' ">false</EnableSourceLink>
11 <MSBuildWarningsAsMessages>MSB3246</MSBuildWarningsAsMessages>
12
13 <ProjectName Condition=" '$(ProjectName)' == '' ">$(MSBuildProjectName)</ProjectName>
14 <BaseOutputPath>$([System.IO.Path]::GetFullPath($(MSBuildThisFileDirectory)..\build\))</BaseOutputPath>
15 <BaseIntermediateOutputPath>$(BaseOutputPath)obj\$(ProjectName)\</BaseIntermediateOutputPath>
16 <OutputPath>$(BaseOutputPath)$(Configuration)\</OutputPath>
17
18 <Authors>WiX Toolset Team</Authors>
19 <Company>WiX Toolset</Company>
20 <Copyright>Copyright (c) .NET Foundation and contributors. All rights reserved.</Copyright>
21 <PackageLicenseExpression>MS-RL</PackageLicenseExpression>
22 <Product>WiX Toolset</Product>
23 </PropertyGroup>
24
25 <Import Project="CSharp.Build.props" Condition=" '$(MSBuildProjectExtension)'=='.csproj' and Exists('CSharp.Build.props') " />
26 <Import Project="Cpp.Build.props" Condition=" Exists('Cpp.Build.props') And '$(MSBuildProjectExtension)'=='.vcxproj' " />
27 <Import Project="Wix.Build.props" Condition=" Exists('Wix.Build.props') And '$(MSBuildProjectExtension)'=='.wixproj' " />
28 <Import Project="Custom.Build.props" Condition=" Exists('Custom.Build.props') " />
29</Project>
diff --git a/src/ext/Firewall/Directory.Build.targets b/src/ext/Firewall/Directory.Build.targets
new file mode 100644
index 00000000..dac7452a
--- /dev/null
+++ b/src/ext/Firewall/Directory.Build.targets
@@ -0,0 +1,48 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3<!--
4 Do NOT modify this file. Update the canonical version in Home\repo-template\src\Directory.Build.targets
5 then update all of the repos.
6-->
7<!--
8 Replace PackageReferences with ProjectReferences when the projects can be found in .sln.
9 See the original here: https://github.com/dotnet/sdk/issues/1151#issuecomment-385133284
10-->
11<Project>
12 <PropertyGroup>
13 <ReplacePackageReferences>true</ReplacePackageReferences>
14 <TheSolutionPath Condition=" '$(NCrunch)'=='' ">$(SolutionPath)</TheSolutionPath>
15 <TheSolutionPath Condition=" '$(NCrunch)'=='1' ">$(NCrunchOriginalSolutionPath)</TheSolutionPath>
16 </PropertyGroup>
17
18 <Choose>
19 <When Condition="$(ReplacePackageReferences) AND '$(TheSolutionPath)' != '' AND '$(TheSolutionPath)' != '*undefined*' AND Exists('$(TheSolutionPath)')">
20
21 <PropertyGroup>
22 <SolutionFileContent>$([System.IO.File]::ReadAllText($(TheSolutionPath)))</SolutionFileContent>
23 <SmartSolutionDir>$([System.IO.Path]::GetDirectoryName( $(TheSolutionPath) ))</SmartSolutionDir>
24 <RegexPattern>(?&lt;="[PackageName]", ")(.*)(?=", ")</RegexPattern>
25 </PropertyGroup>
26
27 <ItemGroup>
28 <!-- Keep the identity of the PackageReference -->
29 <SmartPackageReference Include="@(PackageReference)">
30 <PackageName>%(Identity)</PackageName>
31 <InSolution>$(SolutionFileContent.Contains('\%(Identity).csproj'))</InSolution>
32 </SmartPackageReference>
33
34 <!-- Filter them by mapping them to another ItemGroup using the WithMetadataValue item function -->
35 <PackageInSolution Include="@(SmartPackageReference->WithMetadataValue('InSolution', True))">
36 <Pattern>$(RegexPattern.Replace('[PackageName]','%(PackageName)') )</Pattern>
37 <SmartPath>$([System.Text.RegularExpressions.Regex]::Match('$(SolutionFileContent)', '%(Pattern)'))</SmartPath>
38 </PackageInSolution>
39
40 <ProjectReference Include="@(PackageInSolution->'$(SmartSolutionDir)\%(SmartPath)' )"/>
41
42 <!-- Remove the package references that are now referenced as projects -->
43 <PackageReference Remove="@(PackageInSolution->'%(PackageName)' )"/>
44 </ItemGroup>
45
46 </When>
47 </Choose>
48</Project>
diff --git a/src/ext/Firewall/Firewall.wixext.sln b/src/ext/Firewall/Firewall.wixext.sln
new file mode 100644
index 00000000..59209c88
--- /dev/null
+++ b/src/ext/Firewall/Firewall.wixext.sln
@@ -0,0 +1,73 @@
1
2Microsoft Visual Studio Solution File, Format Version 12.00
3# Visual Studio 15
4VisualStudioVersion = 15.0.27130.2003
5MinimumVisualStudioVersion = 15.0.26124.0
6Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "fwca", "src\ca\fwca.vcxproj", "{F72D34CA-48DA-4DFD-91A9-A0C78BEF6981}"
7EndProject
8Project("{930C7802-8A8C-48F9-8165-68863BCCD9DD}") = "firewall", "src\wixlib\firewall.wixproj", "{1ACFFEFD-505A-41A5-ACBF-A02B7B473AA2}"
9EndProject
10Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WixToolset.Firewall.wixext", "src\wixext\WixToolset.Firewall.wixext.csproj", "{6CF033EB-0A39-4AC6-9D41-9BD506352045}"
11EndProject
12Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WixToolsetTest.Firewall", "src\test\WixToolsetTest.Firewall\WixToolsetTest.Firewall.csproj", "{D5D34EC4-AF91-4B11-AC0A-FA5242AE924B}"
13EndProject
14Global
15 GlobalSection(SolutionConfigurationPlatforms) = preSolution
16 Debug|Any CPU = Debug|Any CPU
17 Debug|x64 = Debug|x64
18 Debug|x86 = Debug|x86
19 Release|Any CPU = Release|Any CPU
20 Release|x64 = Release|x64
21 Release|x86 = Release|x86
22 EndGlobalSection
23 GlobalSection(ProjectConfigurationPlatforms) = postSolution
24 {F72D34CA-48DA-4DFD-91A9-A0C78BEF6981}.Debug|Any CPU.ActiveCfg = Debug|Win32
25 {F72D34CA-48DA-4DFD-91A9-A0C78BEF6981}.Debug|Any CPU.Build.0 = Debug|Win32
26 {F72D34CA-48DA-4DFD-91A9-A0C78BEF6981}.Debug|x64.ActiveCfg = Debug|Win32
27 {F72D34CA-48DA-4DFD-91A9-A0C78BEF6981}.Debug|x86.ActiveCfg = Debug|Win32
28 {F72D34CA-48DA-4DFD-91A9-A0C78BEF6981}.Debug|x86.Build.0 = Debug|Win32
29 {F72D34CA-48DA-4DFD-91A9-A0C78BEF6981}.Release|Any CPU.ActiveCfg = Release|Win32
30 {F72D34CA-48DA-4DFD-91A9-A0C78BEF6981}.Release|x64.ActiveCfg = Release|Win32
31 {F72D34CA-48DA-4DFD-91A9-A0C78BEF6981}.Release|x86.ActiveCfg = Release|Win32
32 {F72D34CA-48DA-4DFD-91A9-A0C78BEF6981}.Release|x86.Build.0 = Release|Win32
33 {1ACFFEFD-505A-41A5-ACBF-A02B7B473AA2}.Debug|Any CPU.ActiveCfg = Debug|x86
34 {1ACFFEFD-505A-41A5-ACBF-A02B7B473AA2}.Debug|Any CPU.Build.0 = Debug|x86
35 {1ACFFEFD-505A-41A5-ACBF-A02B7B473AA2}.Debug|x64.ActiveCfg = Debug|x86
36 {1ACFFEFD-505A-41A5-ACBF-A02B7B473AA2}.Debug|x86.ActiveCfg = Debug|x86
37 {1ACFFEFD-505A-41A5-ACBF-A02B7B473AA2}.Debug|x86.Build.0 = Debug|x86
38 {1ACFFEFD-505A-41A5-ACBF-A02B7B473AA2}.Release|Any CPU.ActiveCfg = Release|x86
39 {1ACFFEFD-505A-41A5-ACBF-A02B7B473AA2}.Release|x64.ActiveCfg = Release|x86
40 {1ACFFEFD-505A-41A5-ACBF-A02B7B473AA2}.Release|x86.ActiveCfg = Release|x86
41 {1ACFFEFD-505A-41A5-ACBF-A02B7B473AA2}.Release|x86.Build.0 = Release|x86
42 {6CF033EB-0A39-4AC6-9D41-9BD506352045}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
43 {6CF033EB-0A39-4AC6-9D41-9BD506352045}.Debug|Any CPU.Build.0 = Debug|Any CPU
44 {6CF033EB-0A39-4AC6-9D41-9BD506352045}.Debug|x64.ActiveCfg = Debug|Any CPU
45 {6CF033EB-0A39-4AC6-9D41-9BD506352045}.Debug|x64.Build.0 = Debug|Any CPU
46 {6CF033EB-0A39-4AC6-9D41-9BD506352045}.Debug|x86.ActiveCfg = Debug|Any CPU
47 {6CF033EB-0A39-4AC6-9D41-9BD506352045}.Debug|x86.Build.0 = Debug|Any CPU
48 {6CF033EB-0A39-4AC6-9D41-9BD506352045}.Release|Any CPU.ActiveCfg = Release|Any CPU
49 {6CF033EB-0A39-4AC6-9D41-9BD506352045}.Release|Any CPU.Build.0 = Release|Any CPU
50 {6CF033EB-0A39-4AC6-9D41-9BD506352045}.Release|x64.ActiveCfg = Release|Any CPU
51 {6CF033EB-0A39-4AC6-9D41-9BD506352045}.Release|x64.Build.0 = Release|Any CPU
52 {6CF033EB-0A39-4AC6-9D41-9BD506352045}.Release|x86.ActiveCfg = Release|Any CPU
53 {6CF033EB-0A39-4AC6-9D41-9BD506352045}.Release|x86.Build.0 = Release|Any CPU
54 {D5D34EC4-AF91-4B11-AC0A-FA5242AE924B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
55 {D5D34EC4-AF91-4B11-AC0A-FA5242AE924B}.Debug|Any CPU.Build.0 = Debug|Any CPU
56 {D5D34EC4-AF91-4B11-AC0A-FA5242AE924B}.Debug|x64.ActiveCfg = Debug|Any CPU
57 {D5D34EC4-AF91-4B11-AC0A-FA5242AE924B}.Debug|x64.Build.0 = Debug|Any CPU
58 {D5D34EC4-AF91-4B11-AC0A-FA5242AE924B}.Debug|x86.ActiveCfg = Debug|Any CPU
59 {D5D34EC4-AF91-4B11-AC0A-FA5242AE924B}.Debug|x86.Build.0 = Debug|Any CPU
60 {D5D34EC4-AF91-4B11-AC0A-FA5242AE924B}.Release|Any CPU.ActiveCfg = Release|Any CPU
61 {D5D34EC4-AF91-4B11-AC0A-FA5242AE924B}.Release|Any CPU.Build.0 = Release|Any CPU
62 {D5D34EC4-AF91-4B11-AC0A-FA5242AE924B}.Release|x64.ActiveCfg = Release|Any CPU
63 {D5D34EC4-AF91-4B11-AC0A-FA5242AE924B}.Release|x64.Build.0 = Release|Any CPU
64 {D5D34EC4-AF91-4B11-AC0A-FA5242AE924B}.Release|x86.ActiveCfg = Release|Any CPU
65 {D5D34EC4-AF91-4B11-AC0A-FA5242AE924B}.Release|x86.Build.0 = Release|Any CPU
66 EndGlobalSection
67 GlobalSection(SolutionProperties) = preSolution
68 HideSolutionNode = FALSE
69 EndGlobalSection
70 GlobalSection(ExtensibilityGlobals) = postSolution
71 SolutionGuid = {E4566A6B-47D0-4EA0-989A-D763AC39105D}
72 EndGlobalSection
73EndGlobal
diff --git a/src/ext/Firewall/Firewall.wixext.v3.ncrunchsolution b/src/ext/Firewall/Firewall.wixext.v3.ncrunchsolution
new file mode 100644
index 00000000..10420ac9
--- /dev/null
+++ b/src/ext/Firewall/Firewall.wixext.v3.ncrunchsolution
@@ -0,0 +1,6 @@
1<SolutionConfiguration>
2 <Settings>
3 <AllowParallelTestExecution>True</AllowParallelTestExecution>
4 <SolutionConfigured>True</SolutionConfigured>
5 </Settings>
6</SolutionConfiguration> \ No newline at end of file
diff --git a/src/ext/Firewall/README.md b/src/ext/Firewall/README.md
new file mode 100644
index 00000000..be5801da
--- /dev/null
+++ b/src/ext/Firewall/README.md
@@ -0,0 +1,2 @@
1# Firewall.wixext
2WixToolset.Firewall.wixext - Firewall WiX Toolset Extension
diff --git a/src/ext/Firewall/appveyor.cmd b/src/ext/Firewall/appveyor.cmd
new file mode 100644
index 00000000..79c24cc1
--- /dev/null
+++ b/src/ext/Firewall/appveyor.cmd
@@ -0,0 +1,14 @@
1@setlocal
2@pushd %~dp0
3
4nuget restore || exit /b
5
6msbuild -p:Configuration=Release -t:Restore || exit /b
7
8msbuild -p:Configuration=Release src\test\WixToolsetTest.Firewall\WixToolsetTest.Firewall.csproj || exit /b
9dotnet test -c Release --no-build src\test\WixToolsetTest.Firewall || exit /b
10
11msbuild -p:Configuration=Release -t:Pack src\wixext\WixToolset.Firewall.wixext.csproj || exit /b
12
13@popd
14@endlocal \ No newline at end of file
diff --git a/src/ext/Firewall/appveyor.yml b/src/ext/Firewall/appveyor.yml
new file mode 100644
index 00000000..7c686b04
--- /dev/null
+++ b/src/ext/Firewall/appveyor.yml
@@ -0,0 +1,40 @@
1# Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2#
3# Do NOT modify this file. Update the canonical version in Home\repo-template\src\appveyor.yml
4# then update all of the repos.
5
6branches:
7 only:
8 - master
9 - develop
10
11image: Visual Studio 2019
12
13version: 0.0.0.{build}
14configuration: Release
15
16environment:
17 DOTNET_SKIP_FIRST_TIME_EXPERIENCE: true
18 DOTNET_CLI_TELEMETRY_OPTOUT: 1
19 NUGET_XMLDOC_MODE: skip
20
21build_script:
22 - appveyor.cmd
23
24pull_requests:
25 do_not_increment_build_number: true
26
27nuget:
28 disable_publish_on_pr: true
29
30skip_branch_with_pr: true
31skip_tags: true
32
33artifacts:
34- path: build\Release\**\*.nupkg
35 name: nuget
36
37notifications:
38- provider: Slack
39 incoming_webhook:
40 secure: p5xuu+4x2JHfwGDMDe5KcG1k7gZxqYc4jWVwvyNZv5cvkubPD2waJs5yXMAXZNN7Z63/3PWHb7q4KoY/99AjauYa1nZ4c5qYqRPFRBKTHfA=
diff --git a/src/ext/Firewall/ca/CustomMsiErrors.h b/src/ext/Firewall/ca/CustomMsiErrors.h
new file mode 100644
index 00000000..f149fb31
--- /dev/null
+++ b/src/ext/Firewall/ca/CustomMsiErrors.h
@@ -0,0 +1,130 @@
1#pragma once
2// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
3
4
5#define GLOBAL_ERROR_BASE 25501
6
7#define msierrSecureObjectsFailedCreateSD 25520
8#define msierrSecureObjectsFailedSet 25521
9#define msierrSecureObjectsUnknownType 25522
10
11#define msierrXmlFileFailedRead 25530
12#define msierrXmlFileFailedOpen 25531
13#define msierrXmlFileFailedSelect 25532
14#define msierrXmlFileFailedSave 25533
15
16#define msierrXmlConfigFailedRead 25540
17#define msierrXmlConfigFailedOpen 25541
18#define msierrXmlConfigFailedSelect 25542
19#define msierrXmlConfigFailedSave 25543
20
21#define msierrFirewallCannotConnect 25580
22
23//---------------------------------------------------------------------------
24// Server CustomAction Errors
25// SERVER range: 26001-26100
26#define SERVER_ERROR_BASE 26000
27
28#define msierrIISCannotConnect 26001
29#define msierrIISFailedReadWebSite 26002
30#define msierrIISFailedReadWebDirs 26003
31#define msierrIISFailedReadVDirs 26004
32#define msierrIISFailedReadFilters 26005
33#define msierrIISFailedReadAppPool 26006
34#define msierrIISFailedReadMimeMap 26007
35#define msierrIISFailedReadProp 26008
36#define msierrIISFailedReadWebSvcExt 26009
37#define msierrIISFailedReadWebError 26010
38#define msierrIISFailedReadHttpHeader 26011
39
40#define msierrIISFailedSchedTransaction 26031
41#define msierrIISFailedSchedInstallWebs 26032
42#define msierrIISFailedSchedInstallWebDirs 26033
43#define msierrIISFailedSchedInstallVDirs 26034
44#define msierrIISFailedSchedInstallFilters 26035
45#define msierrIISFailedSchedInstallAppPool 26036
46#define msierrIISFailedSchedInstallProp 26037
47#define msierrIISFailedSchedInstallWebSvcExt 26038
48
49#define msierrIISFailedSchedUninstallWebs 26051
50#define msierrIISFailedSchedUninstallWebDirs 26052
51#define msierrIISFailedSchedUninstallVDirs 26053
52#define msierrIISFailedSchedUninstallFilters 26054
53#define msierrIISFailedSchedUninstallAppPool 26055
54#define msierrIISFailedSchedUninstallProp 26056
55#define msierrIISFailedSchedUninstallWebSvcExt 26057
56
57#define msierrIISFailedStartTransaction 26101
58#define msierrIISFailedOpenKey 26102
59#define msierrIISFailedCreateKey 26103
60#define msierrIISFailedWriteData 26104
61#define msierrIISFailedCreateApp 26105
62#define msierrIISFailedDeleteKey 26106
63#define msierrIISFailedDeleteApp 26107
64#define msierrIISFailedDeleteValue 26108
65#define msierrIISFailedCommitInUse 26109
66
67#define msierrSQLFailedCreateDatabase 26201
68#define msierrSQLFailedDropDatabase 26202
69#define msierrSQLFailedConnectDatabase 26203
70#define msierrSQLFailedExecString 26204
71#define msierrSQLDatabaseAlreadyExists 26205
72
73#define msierrPERFMONFailedRegisterDLL 26251
74#define msierrPERFMONFailedUnregisterDLL 26252
75#define msierrInstallPerfCounterData 26253
76#define msierrUninstallPerfCounterData 26254
77
78#define msierrSMBFailedCreate 26301
79#define msierrSMBFailedDrop 26302
80
81#define msierrCERTFailedOpen 26351
82#define msierrCERTFailedAdd 26352
83
84#define msierrUSRFailedUserCreate 26401
85#define msierrUSRFailedUserCreatePswd 26402
86#define msierrUSRFailedUserGroupAdd 26403
87#define msierrUSRFailedUserCreateExists 26404
88#define msierrUSRFailedGrantLogonAsService 26405
89
90#define msierrDependencyMissingDependencies 26451
91#define msierrDependencyHasDependents 26452
92
93//--------------------------------------------------------------------------
94// Managed code CustomAction Errors
95// MANAGED range: 27000-27100
96#define MANAGED_ERROR_BASE 27000
97
98#define msierrDotNetRuntimeRequired 27000
99//---------------------------------------------------------------------------
100// Public CustomAction Errors
101// PUBLIC range: 28001-28100
102#define PUBLIC_ERROR_BASE 28000
103
104#define msierrComPlusCannotConnect 28001
105#define msierrComPlusPartitionReadFailed 28002
106#define msierrComPlusPartitionRoleReadFailed 28003
107#define msierrComPlusUserInPartitionRoleReadFailed 28004
108#define msierrComPlusPartitionUserReadFailed 28005
109#define msierrComPlusApplicationReadFailed 28006
110#define msierrComPlusApplicationRoleReadFailed 28007
111#define msierrComPlusUserInApplicationRoleReadFailed 28008
112#define msierrComPlusAssembliesReadFailed 28009
113#define msierrComPlusSubscriptionReadFailed 28010
114#define msierrComPlusPartitionDependency 28011
115#define msierrComPlusPartitionNotFound 28012
116#define msierrComPlusPartitionIdConflict 28013
117#define msierrComPlusPartitionNameConflict 28014
118#define msierrComPlusApplicationDependency 28015
119#define msierrComPlusApplicationNotFound 28016
120#define msierrComPlusApplicationIdConflict 28017
121#define msierrComPlusApplicationNameConflict 28018
122#define msierrComPlusApplicationRoleDependency 28019
123#define msierrComPlusApplicationRoleNotFound 28020
124#define msierrComPlusApplicationRoleConflict 28021
125#define msierrComPlusAssemblyDependency 28022
126#define msierrComPlusSubscriptionIdConflict 28023
127#define msierrComPlusSubscriptionNameConflict 28024
128#define msierrComPlusFailedLookupNames 28025
129
130#define msierrMsmqCannotConnect 28101
diff --git a/src/ext/Firewall/ca/caDecor.h b/src/ext/Firewall/ca/caDecor.h
new file mode 100644
index 00000000..da274650
--- /dev/null
+++ b/src/ext/Firewall/ca/caDecor.h
@@ -0,0 +1,13 @@
1#pragma once
2// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
3
4
5#if defined(_M_ARM64)
6#define CUSTOM_ACTION_DECORATION(f) L"Wix4" f L"_A64"
7#elif defined(_M_AMD64)
8#define CUSTOM_ACTION_DECORATION(f) L"Wix4" f L"_X64"
9#elif defined(_M_ARM)
10#define CUSTOM_ACTION_DECORATION(f) L"Wix4" f L"_ARM"
11#else
12#define CUSTOM_ACTION_DECORATION(f) L"Wix4" f L"_X86"
13#endif
diff --git a/src/ext/Firewall/ca/cost.h b/src/ext/Firewall/ca/cost.h
new file mode 100644
index 00000000..da68c667
--- /dev/null
+++ b/src/ext/Firewall/ca/cost.h
@@ -0,0 +1,5 @@
1#pragma once
2// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
3
4
5const UINT COST_FIREWALL_EXCEPTION = 2000;
diff --git a/src/ext/Firewall/ca/dllmain.cpp b/src/ext/Firewall/ca/dllmain.cpp
new file mode 100644
index 00000000..df53f872
--- /dev/null
+++ b/src/ext/Firewall/ca/dllmain.cpp
@@ -0,0 +1,26 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3#include "precomp.h"
4
5/********************************************************************
6DllMain - standard entry point for all WiX CustomActions
7
8********************************************************************/
9extern "C" BOOL WINAPI DllMain(
10 IN HINSTANCE hInst,
11 IN ULONG ulReason,
12 IN LPVOID)
13{
14 switch(ulReason)
15 {
16 case DLL_PROCESS_ATTACH:
17 WcaGlobalInitialize(hInst);
18 break;
19
20 case DLL_PROCESS_DETACH:
21 WcaGlobalFinalize();
22 break;
23 }
24
25 return TRUE;
26}
diff --git a/src/ext/Firewall/ca/firewall.cpp b/src/ext/Firewall/ca/firewall.cpp
new file mode 100644
index 00000000..caae21a1
--- /dev/null
+++ b/src/ext/Firewall/ca/firewall.cpp
@@ -0,0 +1,1085 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3#include "precomp.h"
4
5LPCWSTR vcsFirewallExceptionQuery =
6 L"SELECT `Name`, `RemoteAddresses`, `Port`, `Protocol`, `Program`, `Attributes`, `Profile`, `Component_`, `Description`, `Direction` FROM `Wix4FirewallException`";
7enum eFirewallExceptionQuery { feqName = 1, feqRemoteAddresses, feqPort, feqProtocol, feqProgram, feqAttributes, feqProfile, feqComponent, feqDescription };
8enum eFirewallExceptionTarget { fetPort = 1, fetApplication, fetUnknown };
9enum eFirewallExceptionAttributes { feaIgnoreFailures = 1 };
10
11/******************************************************************
12 SchedFirewallExceptions - immediate custom action worker to
13 register and remove firewall exceptions.
14
15********************************************************************/
16static UINT SchedFirewallExceptions(
17 __in MSIHANDLE hInstall,
18 WCA_TODO todoSched
19 )
20{
21 HRESULT hr = S_OK;
22 UINT er = ERROR_SUCCESS;
23 int cFirewallExceptions = 0;
24
25 PMSIHANDLE hView = NULL;
26 PMSIHANDLE hRec = NULL;
27
28 LPWSTR pwzCustomActionData = NULL;
29 LPWSTR pwzName = NULL;
30 LPWSTR pwzRemoteAddresses = NULL;
31 LPWSTR pwzPort = NULL;
32 int iProtocol = 0;
33 int iAttributes = 0;
34 int iProfile = 0;
35 LPWSTR pwzProgram = NULL;
36 LPWSTR pwzComponent = NULL;
37 LPWSTR pwzFormattedFile = NULL;
38 LPWSTR pwzDescription = NULL;
39 int iDirection = 0;
40
41 // initialize
42 hr = WcaInitialize(hInstall, "SchedFirewallExceptions");
43 ExitOnFailure(hr, "failed to initialize");
44
45 // anything to do?
46 if (S_OK != WcaTableExists(L"Wix4FirewallException"))
47 {
48 WcaLog(LOGMSG_STANDARD, "Wix4FirewallException table doesn't exist, so there are no firewall exceptions to configure.");
49 ExitFunction();
50 }
51
52 // query and loop through all the firewall exceptions
53 hr = WcaOpenExecuteView(vcsFirewallExceptionQuery, &hView);
54 ExitOnFailure(hr, "failed to open view on Wix4FirewallException table");
55
56 while (S_OK == (hr = WcaFetchRecord(hView, &hRec)))
57 {
58 hr = WcaGetRecordFormattedString(hRec, feqName, &pwzName);
59 ExitOnFailure(hr, "failed to get firewall exception name");
60
61 hr = WcaGetRecordFormattedString(hRec, feqRemoteAddresses, &pwzRemoteAddresses);
62 ExitOnFailure(hr, "failed to get firewall exception remote addresses");
63
64 hr = WcaGetRecordFormattedString(hRec, feqPort, &pwzPort);
65 ExitOnFailure(hr, "failed to get firewall exception port");
66
67 hr = WcaGetRecordInteger(hRec, feqProtocol, &iProtocol);
68 ExitOnFailure(hr, "failed to get firewall exception protocol");
69
70 hr = WcaGetRecordFormattedString(hRec, feqProgram, &pwzProgram);
71 ExitOnFailure(hr, "failed to get firewall exception program");
72
73 hr = WcaGetRecordInteger(hRec, feqAttributes, &iAttributes);
74 ExitOnFailure(hr, "failed to get firewall exception attributes");
75
76 hr = WcaGetRecordInteger(hRec, feqProfile, &iProfile);
77 ExitOnFailure(hr, "failed to get firewall exception profile");
78
79 hr = WcaGetRecordString(hRec, feqComponent, &pwzComponent);
80 ExitOnFailure(hr, "failed to get firewall exception component");
81
82 hr = WcaGetRecordString(hRec, feqDescription, &pwzDescription);
83 ExitOnFailure(hr, "failed to get firewall description");
84
85 // figure out what we're doing for this exception, treating reinstall the same as install
86 WCA_TODO todoComponent = WcaGetComponentToDo(pwzComponent);
87 if ((WCA_TODO_REINSTALL == todoComponent ? WCA_TODO_INSTALL : todoComponent) != todoSched)
88 {
89 WcaLog(LOGMSG_STANDARD, "Component '%ls' action state (%d) doesn't match request (%d)", pwzComponent, todoComponent, todoSched);
90 continue;
91 }
92
93 // action :: name :: profile :: remoteaddresses :: attributes :: target :: {port::protocol | path}
94 ++cFirewallExceptions;
95 hr = WcaWriteIntegerToCaData(todoComponent, &pwzCustomActionData);
96 ExitOnFailure(hr, "failed to write exception action to custom action data");
97
98 hr = WcaWriteStringToCaData(pwzName, &pwzCustomActionData);
99 ExitOnFailure(hr, "failed to write exception name to custom action data");
100
101 hr = WcaWriteIntegerToCaData(iProfile, &pwzCustomActionData);
102 ExitOnFailure(hr, "failed to write exception profile to custom action data");
103
104 hr = WcaWriteStringToCaData(pwzRemoteAddresses, &pwzCustomActionData);
105 ExitOnFailure(hr, "failed to write exception remote addresses to custom action data");
106
107 hr = WcaWriteIntegerToCaData(iAttributes, &pwzCustomActionData);
108 ExitOnFailure(hr, "failed to write exception attributes to custom action data");
109
110 if (*pwzProgram)
111 {
112 // If program is defined, we have an application exception.
113 hr = WcaWriteIntegerToCaData(fetApplication, &pwzCustomActionData);
114 ExitOnFailure(hr, "failed to write exception target (application) to custom action data");
115
116 hr = WcaWriteStringToCaData(pwzProgram, &pwzCustomActionData);
117 ExitOnFailure(hr, "failed to write application path to custom action data");
118 }
119 else
120 {
121 // we have a port-only exception
122 hr = WcaWriteIntegerToCaData(fetPort, &pwzCustomActionData);
123 ExitOnFailure(hr, "failed to write exception target (port) to custom action data");
124 }
125
126 hr = WcaWriteStringToCaData(pwzPort, &pwzCustomActionData);
127 ExitOnFailure(hr, "failed to write application path to custom action data");
128
129 hr = WcaWriteIntegerToCaData(iProtocol, &pwzCustomActionData);
130 ExitOnFailure(hr, "failed to write exception protocol to custom action data");
131
132 hr = WcaWriteStringToCaData(pwzDescription, &pwzCustomActionData);
133 ExitOnFailure(hr, "failed to write firewall rule description to custom action data");
134
135 hr = WcaWriteIntegerToCaData(iDirection, &pwzCustomActionData);
136 ExitOnFailure(hr, "failed to write firewall rule direction to custom action data");
137 }
138
139 // reaching the end of the list is actually a good thing, not an error
140 if (E_NOMOREITEMS == hr)
141 {
142 hr = S_OK;
143 }
144 ExitOnFailure(hr, "failure occured while processing Wix4FirewallException table");
145
146 // schedule ExecFirewallExceptions if there's anything to do
147 if (pwzCustomActionData && *pwzCustomActionData)
148 {
149 WcaLog(LOGMSG_STANDARD, "Scheduling firewall exception (%ls)", pwzCustomActionData);
150
151 if (WCA_TODO_INSTALL == todoSched)
152 {
153 hr = WcaDoDeferredAction(CUSTOM_ACTION_DECORATION(L"RollbackFirewallExceptionsInstall"), pwzCustomActionData, cFirewallExceptions * COST_FIREWALL_EXCEPTION);
154 ExitOnFailure(hr, "failed to schedule firewall install exceptions rollback");
155 hr = WcaDoDeferredAction(CUSTOM_ACTION_DECORATION(L"ExecFirewallExceptionsInstall"), pwzCustomActionData, cFirewallExceptions * COST_FIREWALL_EXCEPTION);
156 ExitOnFailure(hr, "failed to schedule firewall install exceptions execution");
157 }
158 else
159 {
160 hr = WcaDoDeferredAction(CUSTOM_ACTION_DECORATION(L"RollbackFirewallExceptionsUninstall"), pwzCustomActionData, cFirewallExceptions * COST_FIREWALL_EXCEPTION);
161 ExitOnFailure(hr, "failed to schedule firewall uninstall exceptions rollback");
162 hr = WcaDoDeferredAction(CUSTOM_ACTION_DECORATION(L"ExecFirewallExceptionsUninstall"), pwzCustomActionData, cFirewallExceptions * COST_FIREWALL_EXCEPTION);
163 ExitOnFailure(hr, "failed to schedule firewall uninstall exceptions execution");
164 }
165 }
166 else
167 {
168 WcaLog(LOGMSG_STANDARD, "No firewall exceptions scheduled");
169 }
170
171LExit:
172 ReleaseStr(pwzCustomActionData);
173 ReleaseStr(pwzName);
174 ReleaseStr(pwzRemoteAddresses);
175 ReleaseStr(pwzPort);
176 ReleaseStr(pwzProgram);
177 ReleaseStr(pwzComponent);
178 ReleaseStr(pwzDescription);
179 ReleaseStr(pwzFormattedFile);
180
181 return WcaFinalize(er = FAILED(hr) ? ERROR_INSTALL_FAILURE : er);
182}
183
184/******************************************************************
185 SchedFirewallExceptionsInstall - immediate custom action entry
186 point to register firewall exceptions.
187
188********************************************************************/
189extern "C" UINT __stdcall SchedFirewallExceptionsInstall(
190 __in MSIHANDLE hInstall
191 )
192{
193 return SchedFirewallExceptions(hInstall, WCA_TODO_INSTALL);
194}
195
196/******************************************************************
197 SchedFirewallExceptionsUninstall - immediate custom action entry
198 point to remove firewall exceptions.
199
200********************************************************************/
201extern "C" UINT __stdcall SchedFirewallExceptionsUninstall(
202 __in MSIHANDLE hInstall
203 )
204{
205 return SchedFirewallExceptions(hInstall, WCA_TODO_UNINSTALL);
206}
207
208/******************************************************************
209 GetFirewallRules - Get the collection of firewall rules.
210
211********************************************************************/
212static HRESULT GetFirewallRules(
213 __in BOOL fIgnoreFailures,
214 __out INetFwRules** ppNetFwRules
215 )
216{
217 HRESULT hr = S_OK;
218 INetFwPolicy2* pNetFwPolicy2 = NULL;
219 INetFwRules* pNetFwRules = NULL;
220 *ppNetFwRules = NULL;
221
222 do
223 {
224 ReleaseNullObject(pNetFwPolicy2);
225 ReleaseNullObject(pNetFwRules);
226
227 if (SUCCEEDED(hr = ::CoCreateInstance(__uuidof(NetFwPolicy2), NULL, CLSCTX_ALL, __uuidof(INetFwPolicy2), (void**)&pNetFwPolicy2)) &&
228 SUCCEEDED(hr = pNetFwPolicy2->get_Rules(&pNetFwRules)))
229 {
230 break;
231 }
232 else if (fIgnoreFailures)
233 {
234 ExitFunction1(hr = S_FALSE);
235 }
236 else
237 {
238 WcaLog(LOGMSG_STANDARD, "Failed to connect to Windows Firewall");
239 UINT er = WcaErrorMessage(msierrFirewallCannotConnect, hr, INSTALLMESSAGE_ERROR | MB_ABORTRETRYIGNORE, 0);
240 switch (er)
241 {
242 case IDABORT: // exit with the current HRESULT
243 ExitFunction();
244 case IDRETRY: // clean up and retry the loop
245 hr = S_FALSE;
246 break;
247 case IDIGNORE: // pass S_FALSE back to the caller, who knows how to ignore the failure
248 ExitFunction1(hr = S_FALSE);
249 default: // No UI, so default is to fail.
250 ExitFunction();
251 }
252 }
253 } while (S_FALSE == hr);
254
255 *ppNetFwRules = pNetFwRules;
256 pNetFwRules = NULL;
257
258LExit:
259 ReleaseObject(pNetFwPolicy2);
260 ReleaseObject(pNetFwRules);
261
262 return hr;
263}
264
265/******************************************************************
266 CreateFwRuleObject - CoCreate a firewall rule, and set the common set of properties which are shared
267 between port and application firewall rules
268
269********************************************************************/
270static HRESULT CreateFwRuleObject(
271 __in BSTR bstrName,
272 __in int iProfile,
273 __in_opt LPCWSTR wzRemoteAddresses,
274 __in LPCWSTR wzPort,
275 __in int iProtocol,
276 __in LPCWSTR wzDescription,
277 __in int iDirection,
278 __out INetFwRule** ppNetFwRule
279 )
280{
281 HRESULT hr = S_OK;
282 BSTR bstrRemoteAddresses = NULL;
283 BSTR bstrPort = NULL;
284 BSTR bstrDescription = NULL;
285 INetFwRule* pNetFwRule = NULL;
286 *ppNetFwRule = NULL;
287
288 // convert to BSTRs to make COM happy
289 bstrRemoteAddresses = ::SysAllocString(wzRemoteAddresses);
290 ExitOnNull(bstrRemoteAddresses, hr, E_OUTOFMEMORY, "failed SysAllocString for remote addresses");
291 bstrPort = ::SysAllocString(wzPort);
292 ExitOnNull(bstrPort, hr, E_OUTOFMEMORY, "failed SysAllocString for port");
293 bstrDescription = ::SysAllocString(wzDescription);
294 ExitOnNull(bstrDescription, hr, E_OUTOFMEMORY, "failed SysAllocString for description");
295
296 hr = ::CoCreateInstance(__uuidof(NetFwRule), NULL, CLSCTX_ALL, __uuidof(INetFwRule), (void**)&pNetFwRule);
297 ExitOnFailure(hr, "failed to create NetFwRule object");
298
299 hr = pNetFwRule->put_Name(bstrName);
300 ExitOnFailure(hr, "failed to set exception name");
301
302 hr = pNetFwRule->put_Profiles(static_cast<NET_FW_PROFILE_TYPE2>(iProfile));
303 ExitOnFailure(hr, "failed to set exception profile");
304
305 if (MSI_NULL_INTEGER != iProtocol)
306 {
307 hr = pNetFwRule->put_Protocol(static_cast<NET_FW_IP_PROTOCOL>(iProtocol));
308 ExitOnFailure(hr, "failed to set exception protocol");
309 }
310
311 if (bstrPort && *bstrPort)
312 {
313 hr = pNetFwRule->put_LocalPorts(bstrPort);
314 ExitOnFailure(hr, "failed to set exception port");
315 }
316
317 if (bstrRemoteAddresses && *bstrRemoteAddresses)
318 {
319 hr = pNetFwRule->put_RemoteAddresses(bstrRemoteAddresses);
320 ExitOnFailure(hr, "failed to set exception remote addresses '%ls'", bstrRemoteAddresses);
321 }
322
323 if (bstrDescription && *bstrDescription)
324 {
325 hr = pNetFwRule->put_Description(bstrDescription);
326 ExitOnFailure(hr, "failed to set exception description '%ls'", bstrDescription);
327 }
328
329 if (MSI_NULL_INTEGER != iDirection)
330 {
331 hr = pNetFwRule->put_Direction(static_cast<NET_FW_RULE_DIRECTION> (iDirection));
332 ExitOnFailure(hr, "failed to set exception direction");
333 }
334
335 *ppNetFwRule = pNetFwRule;
336 pNetFwRule = NULL;
337
338LExit:
339 ReleaseBSTR(bstrRemoteAddresses);
340 ReleaseBSTR(bstrPort);
341 ReleaseBSTR(bstrDescription);
342 ReleaseObject(pNetFwRule);
343
344 return hr;
345}
346
347/******************************************************************
348 FSupportProfiles - Returns true if we support profiles on this machine.
349 (Only on Vista or later)
350
351********************************************************************/
352static BOOL FSupportProfiles()
353{
354 BOOL fSupportProfiles = FALSE;
355 INetFwRules* pNetFwRules = NULL;
356
357 // We only support profiles if we can co-create an instance of NetFwPolicy2.
358 // This will not work on pre-vista machines.
359 if (SUCCEEDED(GetFirewallRules(TRUE, &pNetFwRules)) && pNetFwRules != NULL)
360 {
361 fSupportProfiles = TRUE;
362 ReleaseObject(pNetFwRules);
363 }
364
365 return fSupportProfiles;
366}
367
368/******************************************************************
369 GetCurrentFirewallProfile - get the active firewall profile as an
370 INetFwProfile, which owns the lists of exceptions we're
371 updating.
372
373********************************************************************/
374static HRESULT GetCurrentFirewallProfile(
375 __in BOOL fIgnoreFailures,
376 __out INetFwProfile** ppfwProfile
377 )
378{
379 HRESULT hr = S_OK;
380 INetFwMgr* pfwMgr = NULL;
381 INetFwPolicy* pfwPolicy = NULL;
382 INetFwProfile* pfwProfile = NULL;
383 *ppfwProfile = NULL;
384
385 do
386 {
387 ReleaseNullObject(pfwPolicy);
388 ReleaseNullObject(pfwMgr);
389 ReleaseNullObject(pfwProfile);
390
391 if (SUCCEEDED(hr = ::CoCreateInstance(__uuidof(NetFwMgr), NULL, CLSCTX_INPROC_SERVER, __uuidof(INetFwMgr), (void**)&pfwMgr)) &&
392 SUCCEEDED(hr = pfwMgr->get_LocalPolicy(&pfwPolicy)) &&
393 SUCCEEDED(hr = pfwPolicy->get_CurrentProfile(&pfwProfile)))
394 {
395 break;
396 }
397 else if (fIgnoreFailures)
398 {
399 ExitFunction1(hr = S_FALSE);
400 }
401 else
402 {
403 WcaLog(LOGMSG_STANDARD, "Failed to connect to Windows Firewall");
404 UINT er = WcaErrorMessage(msierrFirewallCannotConnect, hr, INSTALLMESSAGE_ERROR | MB_ABORTRETRYIGNORE, 0);
405 switch (er)
406 {
407 case IDABORT: // exit with the current HRESULT
408 ExitFunction();
409 case IDRETRY: // clean up and retry the loop
410 hr = S_FALSE;
411 break;
412 case IDIGNORE: // pass S_FALSE back to the caller, who knows how to ignore the failure
413 ExitFunction1(hr = S_FALSE);
414 default: // No UI, so default is to fail.
415 ExitFunction();
416 }
417 }
418 } while (S_FALSE == hr);
419
420 *ppfwProfile = pfwProfile;
421 pfwProfile = NULL;
422
423LExit:
424 ReleaseObject(pfwPolicy);
425 ReleaseObject(pfwMgr);
426 ReleaseObject(pfwProfile);
427
428 return hr;
429}
430
431/******************************************************************
432 AddApplicationException
433
434********************************************************************/
435static HRESULT AddApplicationException(
436 __in LPCWSTR wzFile,
437 __in LPCWSTR wzName,
438 __in int iProfile,
439 __in_opt LPCWSTR wzRemoteAddresses,
440 __in BOOL fIgnoreFailures,
441 __in LPCWSTR wzPort,
442 __in int iProtocol,
443 __in LPCWSTR wzDescription,
444 __in int iDirection
445 )
446{
447 HRESULT hr = S_OK;
448 BSTR bstrFile = NULL;
449 BSTR bstrName = NULL;
450 INetFwRules* pNetFwRules = NULL;
451 INetFwRule* pNetFwRule = NULL;
452
453 // convert to BSTRs to make COM happy
454 bstrFile = ::SysAllocString(wzFile);
455 ExitOnNull(bstrFile, hr, E_OUTOFMEMORY, "failed SysAllocString for path");
456 bstrName = ::SysAllocString(wzName);
457 ExitOnNull(bstrName, hr, E_OUTOFMEMORY, "failed SysAllocString for name");
458
459 // get the collection of firewall rules
460 hr = GetFirewallRules(fIgnoreFailures, &pNetFwRules);
461 ExitOnFailure(hr, "failed to get firewall rules object");
462 if (S_FALSE == hr) // user or package author chose to ignore missing firewall
463 {
464 ExitFunction();
465 }
466
467 // try to find it (i.e., support reinstall)
468 hr = pNetFwRules->Item(bstrName, &pNetFwRule);
469 if (HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND) == hr)
470 {
471 hr = CreateFwRuleObject(bstrName, iProfile, wzRemoteAddresses, wzPort, iProtocol, wzDescription, iDirection, &pNetFwRule);
472 ExitOnFailure(hr, "failed to create FwRule object");
473
474 // set edge traversal to true
475 hr = pNetFwRule->put_EdgeTraversal(VARIANT_TRUE);
476 ExitOnFailure(hr, "failed to set application exception edgetraversal property");
477
478 // set path
479 hr = pNetFwRule->put_ApplicationName(bstrFile);
480 ExitOnFailure(hr, "failed to set application name");
481
482 // enable it
483 hr = pNetFwRule->put_Enabled(VARIANT_TRUE);
484 ExitOnFailure(hr, "failed to to enable application exception");
485
486 // add it to the list of authorized apps
487 hr = pNetFwRules->Add(pNetFwRule);
488 ExitOnFailure(hr, "failed to add app to the authorized apps list");
489 }
490 else
491 {
492 // we found an existing app exception (if we succeeded, that is)
493 ExitOnFailure(hr, "failed trying to find existing app");
494
495 // enable it (just in case it was disabled)
496 pNetFwRule->put_Enabled(VARIANT_TRUE);
497 }
498
499LExit:
500 ReleaseBSTR(bstrName);
501 ReleaseBSTR(bstrFile);
502 ReleaseObject(pNetFwRules);
503 ReleaseObject(pNetFwRule);
504
505 return fIgnoreFailures ? S_OK : hr;
506}
507
508/******************************************************************
509 AddApplicationExceptionOnCurrentProfile
510
511********************************************************************/
512static HRESULT AddApplicationExceptionOnCurrentProfile(
513 __in LPCWSTR wzFile,
514 __in LPCWSTR wzName,
515 __in_opt LPCWSTR wzRemoteAddresses,
516 __in BOOL fIgnoreFailures
517 )
518{
519 HRESULT hr = S_OK;
520 BSTR bstrFile = NULL;
521 BSTR bstrName = NULL;
522 BSTR bstrRemoteAddresses = NULL;
523 INetFwProfile* pfwProfile = NULL;
524 INetFwAuthorizedApplications* pfwApps = NULL;
525 INetFwAuthorizedApplication* pfwApp = NULL;
526
527 // convert to BSTRs to make COM happy
528 bstrFile = ::SysAllocString(wzFile);
529 ExitOnNull(bstrFile, hr, E_OUTOFMEMORY, "failed SysAllocString for path");
530 bstrName = ::SysAllocString(wzName);
531 ExitOnNull(bstrName, hr, E_OUTOFMEMORY, "failed SysAllocString for name");
532 bstrRemoteAddresses = ::SysAllocString(wzRemoteAddresses);
533 ExitOnNull(bstrRemoteAddresses, hr, E_OUTOFMEMORY, "failed SysAllocString for remote addresses");
534
535 // get the firewall profile, which is our entry point for adding exceptions
536 hr = GetCurrentFirewallProfile(fIgnoreFailures, &pfwProfile);
537 ExitOnFailure(hr, "failed to get firewall profile");
538 if (S_FALSE == hr) // user or package author chose to ignore missing firewall
539 {
540 ExitFunction();
541 }
542
543 // first, let's see if the app is already on the exception list
544 hr = pfwProfile->get_AuthorizedApplications(&pfwApps);
545 ExitOnFailure(hr, "failed to get list of authorized apps");
546
547 // try to find it (i.e., support reinstall)
548 hr = pfwApps->Item(bstrFile, &pfwApp);
549 if (HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND) == hr)
550 {
551 // not found, so we get to add it
552 hr = ::CoCreateInstance(__uuidof(NetFwAuthorizedApplication), NULL, CLSCTX_INPROC_SERVER, __uuidof(INetFwAuthorizedApplication), reinterpret_cast<void**>(&pfwApp));
553 ExitOnFailure(hr, "failed to create authorized app");
554
555 // set the display name
556 hr = pfwApp->put_Name(bstrName);
557 ExitOnFailure(hr, "failed to set authorized app name");
558
559 // set path
560 hr = pfwApp->put_ProcessImageFileName(bstrFile);
561 ExitOnFailure(hr, "failed to set authorized app path");
562
563 // set the allowed remote addresses
564 if (bstrRemoteAddresses && *bstrRemoteAddresses)
565 {
566 hr = pfwApp->put_RemoteAddresses(bstrRemoteAddresses);
567 ExitOnFailure(hr, "failed to set authorized app remote addresses");
568 }
569
570 // add it to the list of authorized apps
571 hr = pfwApps->Add(pfwApp);
572 ExitOnFailure(hr, "failed to add app to the authorized apps list");
573 }
574 else
575 {
576 // we found an existing app exception (if we succeeded, that is)
577 ExitOnFailure(hr, "failed trying to find existing app");
578
579 // enable it (just in case it was disabled)
580 pfwApp->put_Enabled(VARIANT_TRUE);
581 }
582
583LExit:
584 ReleaseBSTR(bstrRemoteAddresses);
585 ReleaseBSTR(bstrName);
586 ReleaseBSTR(bstrFile);
587 ReleaseObject(pfwApp);
588 ReleaseObject(pfwApps);
589 ReleaseObject(pfwProfile);
590
591 return fIgnoreFailures ? S_OK : hr;
592}
593
594/******************************************************************
595 AddPortException
596
597********************************************************************/
598static HRESULT AddPortException(
599 __in LPCWSTR wzName,
600 __in int iProfile,
601 __in_opt LPCWSTR wzRemoteAddresses,
602 __in BOOL fIgnoreFailures,
603 __in LPCWSTR wzPort,
604 __in int iProtocol,
605 __in LPCWSTR wzDescription,
606 __in int iDirection
607)
608{
609 HRESULT hr = S_OK;
610 BSTR bstrName = NULL;
611 INetFwRules* pNetFwRules = NULL;
612 INetFwRule* pNetFwRule = NULL;
613
614 // convert to BSTRs to make COM happy
615 bstrName = ::SysAllocString(wzName);
616 ExitOnNull(bstrName, hr, E_OUTOFMEMORY, "failed SysAllocString for name");
617
618 // get the collection of firewall rules
619 hr = GetFirewallRules(fIgnoreFailures, &pNetFwRules);
620 ExitOnFailure(hr, "failed to get firewall rules object");
621 if (S_FALSE == hr) // user or package author chose to ignore missing firewall
622 {
623 ExitFunction();
624 }
625
626 // try to find it (i.e., support reinstall)
627 hr = pNetFwRules->Item(bstrName, &pNetFwRule);
628 if (HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND) == hr)
629 {
630 hr = CreateFwRuleObject(bstrName, iProfile, wzRemoteAddresses, wzPort, iProtocol, wzDescription, iDirection, &pNetFwRule);
631 ExitOnFailure(hr, "failed to create FwRule object");
632
633 // enable it
634 hr = pNetFwRule->put_Enabled(VARIANT_TRUE);
635 ExitOnFailure(hr, "failed to to enable port exception");
636
637 // add it to the list of authorized ports
638 hr = pNetFwRules->Add(pNetFwRule);
639 ExitOnFailure(hr, "failed to add app to the authorized ports list");
640 }
641 else
642 {
643 // we found an existing port exception (if we succeeded, that is)
644 ExitOnFailure(hr, "failed trying to find existing port rule");
645
646 // enable it (just in case it was disabled)
647 pNetFwRule->put_Enabled(VARIANT_TRUE);
648 }
649
650LExit:
651 ReleaseBSTR(bstrName);
652 ReleaseObject(pNetFwRules);
653 ReleaseObject(pNetFwRule);
654
655 return fIgnoreFailures ? S_OK : hr;
656}
657
658/******************************************************************
659 AddPortExceptionOnCurrentProfile
660
661********************************************************************/
662static HRESULT AddPortExceptionOnCurrentProfile(
663 __in LPCWSTR wzName,
664 __in_opt LPCWSTR wzRemoteAddresses,
665 __in BOOL fIgnoreFailures,
666 __in int iPort,
667 __in int iProtocol
668 )
669{
670 HRESULT hr = S_OK;
671 BSTR bstrName = NULL;
672 BSTR bstrRemoteAddresses = NULL;
673 INetFwProfile* pfwProfile = NULL;
674 INetFwOpenPorts* pfwPorts = NULL;
675 INetFwOpenPort* pfwPort = NULL;
676
677 // convert to BSTRs to make COM happy
678 bstrName = ::SysAllocString(wzName);
679 ExitOnNull(bstrName, hr, E_OUTOFMEMORY, "failed SysAllocString for name");
680 bstrRemoteAddresses = ::SysAllocString(wzRemoteAddresses);
681 ExitOnNull(bstrRemoteAddresses, hr, E_OUTOFMEMORY, "failed SysAllocString for remote addresses");
682
683 // create and initialize a new open port object
684 hr = ::CoCreateInstance(__uuidof(NetFwOpenPort), NULL, CLSCTX_INPROC_SERVER, __uuidof(INetFwOpenPort), reinterpret_cast<void**>(&pfwPort));
685 ExitOnFailure(hr, "failed to create new open port");
686
687 hr = pfwPort->put_Port(iPort);
688 ExitOnFailure(hr, "failed to set exception port");
689
690 hr = pfwPort->put_Protocol(static_cast<NET_FW_IP_PROTOCOL>(iProtocol));
691 ExitOnFailure(hr, "failed to set exception protocol");
692
693 if (bstrRemoteAddresses && *bstrRemoteAddresses)
694 {
695 hr = pfwPort->put_RemoteAddresses(bstrRemoteAddresses);
696 ExitOnFailure(hr, "failed to set exception remote addresses '%ls'", bstrRemoteAddresses);
697 }
698
699 hr = pfwPort->put_Name(bstrName);
700 ExitOnFailure(hr, "failed to set exception name");
701
702 // get the firewall profile, its current list of open ports, and add ours
703 hr = GetCurrentFirewallProfile(fIgnoreFailures, &pfwProfile);
704 ExitOnFailure(hr, "failed to get firewall profile");
705 if (S_FALSE == hr) // user or package author chose to ignore missing firewall
706 {
707 ExitFunction();
708 }
709
710 hr = pfwProfile->get_GloballyOpenPorts(&pfwPorts);
711 ExitOnFailure(hr, "failed to get open ports");
712
713 hr = pfwPorts->Add(pfwPort);
714 ExitOnFailure(hr, "failed to add exception to global list");
715
716LExit:
717 ReleaseBSTR(bstrRemoteAddresses);
718 ReleaseBSTR(bstrName);
719 ReleaseObject(pfwProfile);
720 ReleaseObject(pfwPorts);
721 ReleaseObject(pfwPort);
722
723 return fIgnoreFailures ? S_OK : hr;
724}
725
726/******************************************************************
727 RemoveException - Removes the exception rule with the given name.
728
729********************************************************************/
730static HRESULT RemoveException(
731 __in LPCWSTR wzName,
732 __in BOOL fIgnoreFailures
733 )
734{
735 HRESULT hr = S_OK;;
736 INetFwRules* pNetFwRules = NULL;
737
738 // convert to BSTRs to make COM happy
739 BSTR bstrName = ::SysAllocString(wzName);
740 ExitOnNull(bstrName, hr, E_OUTOFMEMORY, "failed SysAllocString for path");
741
742 // get the collection of firewall rules
743 hr = GetFirewallRules(fIgnoreFailures, &pNetFwRules);
744 ExitOnFailure(hr, "failed to get firewall rules object");
745 if (S_FALSE == hr) // user or package author chose to ignore missing firewall
746 {
747 ExitFunction();
748 }
749
750 hr = pNetFwRules->Remove(bstrName);
751 ExitOnFailure(hr, "failed to remove authorized app");
752
753LExit:
754 ReleaseBSTR(bstrName);
755 ReleaseObject(pNetFwRules);
756
757 return fIgnoreFailures ? S_OK : hr;
758}
759
760/******************************************************************
761 RemoveApplicationExceptionFromCurrentProfile
762
763********************************************************************/
764static HRESULT RemoveApplicationExceptionFromCurrentProfile(
765 __in LPCWSTR wzFile,
766 __in BOOL fIgnoreFailures
767 )
768{
769 HRESULT hr = S_OK;
770 INetFwProfile* pfwProfile = NULL;
771 INetFwAuthorizedApplications* pfwApps = NULL;
772
773 // convert to BSTRs to make COM happy
774 BSTR bstrFile = ::SysAllocString(wzFile);
775 ExitOnNull(bstrFile, hr, E_OUTOFMEMORY, "failed SysAllocString for path");
776
777 // get the firewall profile, which is our entry point for removing exceptions
778 hr = GetCurrentFirewallProfile(fIgnoreFailures, &pfwProfile);
779 ExitOnFailure(hr, "failed to get firewall profile");
780 if (S_FALSE == hr) // user or package author chose to ignore missing firewall
781 {
782 ExitFunction();
783 }
784
785 // now get the list of app exceptions and remove the one
786 hr = pfwProfile->get_AuthorizedApplications(&pfwApps);
787 ExitOnFailure(hr, "failed to get list of authorized apps");
788
789 hr = pfwApps->Remove(bstrFile);
790 ExitOnFailure(hr, "failed to remove authorized app");
791
792LExit:
793 ReleaseBSTR(bstrFile);
794 ReleaseObject(pfwApps);
795 ReleaseObject(pfwProfile);
796
797 return fIgnoreFailures ? S_OK : hr;
798}
799
800/******************************************************************
801 RemovePortExceptionFromCurrentProfile
802
803********************************************************************/
804static HRESULT RemovePortExceptionFromCurrentProfile(
805 __in int iPort,
806 __in int iProtocol,
807 __in BOOL fIgnoreFailures
808 )
809{
810 HRESULT hr = S_OK;
811 INetFwProfile* pfwProfile = NULL;
812 INetFwOpenPorts* pfwPorts = NULL;
813
814 // get the firewall profile, which is our entry point for adding exceptions
815 hr = GetCurrentFirewallProfile(fIgnoreFailures, &pfwProfile);
816 ExitOnFailure(hr, "failed to get firewall profile");
817 if (S_FALSE == hr) // user or package author chose to ignore missing firewall
818 {
819 ExitFunction();
820 }
821
822 hr = pfwProfile->get_GloballyOpenPorts(&pfwPorts);
823 ExitOnFailure(hr, "failed to get open ports");
824
825 hr = pfwPorts->Remove(iPort, static_cast<NET_FW_IP_PROTOCOL>(iProtocol));
826 ExitOnFailure(hr, "failed to remove open port %d, protocol %d", iPort, iProtocol);
827
828LExit:
829 return fIgnoreFailures ? S_OK : hr;
830}
831
832static HRESULT AddApplicationException(
833 __in BOOL fSupportProfiles,
834 __in LPCWSTR wzFile,
835 __in LPCWSTR wzName,
836 __in int iProfile,
837 __in_opt LPCWSTR wzRemoteAddresses,
838 __in BOOL fIgnoreFailures,
839 __in LPCWSTR wzPort,
840 __in int iProtocol,
841 __in LPCWSTR wzDescription,
842 __in int iDirection
843)
844{
845 HRESULT hr = S_OK;
846
847 if (fSupportProfiles)
848 {
849 hr = AddApplicationException(wzFile, wzName, iProfile, wzRemoteAddresses, fIgnoreFailures, wzPort, iProtocol, wzDescription, iDirection);
850 }
851 else
852 {
853 if (0 != *wzPort || MSI_NULL_INTEGER != iProtocol)
854 {
855 // NOTE: This is treated as an error rather than either creating a rule based on just the application (no port), or
856 // just the port because it is unclear what is the proper fall back. For example, suppose that you have code that
857 // runs in dllhost.exe. Clearly falling back to opening all of dllhost is wrong. Because the firewall is a security
858 // feature, it seems better to require the MSI author to indicate the behavior that they want.
859 WcaLog(LOGMSG_STANDARD, "FirewallExtension: Cannot add firewall rule '%ls', which defines both an application and a port or protocol. Such a rule requires Microsoft Windows Vista or later.", wzName);
860 return fIgnoreFailures ? S_OK : E_NOTIMPL;
861 }
862
863 hr = AddApplicationExceptionOnCurrentProfile(wzFile, wzName, wzRemoteAddresses, fIgnoreFailures);
864 }
865
866 return hr;
867}
868
869static HRESULT AddPortException(
870 __in BOOL fSupportProfiles,
871 __in LPCWSTR wzName,
872 __in int iProfile,
873 __in_opt LPCWSTR wzRemoteAddresses,
874 __in BOOL fIgnoreFailures,
875 __in LPCWSTR wzPort,
876 __in int iProtocol,
877 __in LPCWSTR wzDescription,
878 __in int iDirection
879)
880{
881 HRESULT hr = S_OK;
882
883 if (fSupportProfiles)
884 {
885 hr = AddPortException(wzName, iProfile, wzRemoteAddresses, fIgnoreFailures, wzPort, iProtocol, wzDescription, iDirection);
886 }
887 else
888 {
889 hr = AddPortExceptionOnCurrentProfile(wzName, wzRemoteAddresses, fIgnoreFailures, wcstol(wzPort, NULL, 10), iProtocol);
890 }
891
892 return hr;
893}
894
895static HRESULT RemoveApplicationException(
896 __in BOOL fSupportProfiles,
897 __in LPCWSTR wzName,
898 __in LPCWSTR wzFile,
899 __in BOOL fIgnoreFailures,
900 __in LPCWSTR wzPort,
901 __in int iProtocol
902 )
903{
904 HRESULT hr = S_OK;
905
906 if (fSupportProfiles)
907 {
908 hr = RemoveException(wzName, fIgnoreFailures);
909 }
910 else
911 {
912 if (0 != *wzPort || MSI_NULL_INTEGER != iProtocol)
913 {
914 WcaLog(LOGMSG_STANDARD, "FirewallExtension: Cannot remove firewall rule '%ls', which defines both an application and a port or protocol. Such a rule requires Microsoft Windows Vista or later.", wzName);
915 return S_OK;
916 }
917
918 hr = RemoveApplicationExceptionFromCurrentProfile(wzFile, fIgnoreFailures);
919 }
920
921 return hr;
922}
923
924static HRESULT RemovePortException(
925 __in BOOL fSupportProfiles,
926 __in LPCWSTR wzName,
927 __in LPCWSTR wzPort,
928 __in int iProtocol,
929 __in BOOL fIgnoreFailures
930 )
931{
932 HRESULT hr = S_OK;
933
934 if (fSupportProfiles)
935 {
936 hr = RemoveException(wzName, fIgnoreFailures);
937 }
938 else
939 {
940 hr = RemovePortExceptionFromCurrentProfile(wcstol(wzPort, NULL, 10), iProtocol, fIgnoreFailures);
941 }
942
943 return hr;
944}
945
946/******************************************************************
947 ExecFirewallExceptions - deferred custom action entry point to
948 register and remove firewall exceptions.
949
950********************************************************************/
951extern "C" UINT __stdcall ExecFirewallExceptions(
952 __in MSIHANDLE hInstall
953 )
954{
955 HRESULT hr = S_OK;
956 BOOL fSupportProfiles = FALSE;
957 LPWSTR pwz = NULL;
958 LPWSTR pwzCustomActionData = NULL;
959 int iTodo = WCA_TODO_UNKNOWN;
960 LPWSTR pwzName = NULL;
961 LPWSTR pwzRemoteAddresses = NULL;
962 int iAttributes = 0;
963 int iTarget = fetUnknown;
964 LPWSTR pwzFile = NULL;
965 LPWSTR pwzPort = NULL;
966 LPWSTR pwzDescription = NULL;
967 int iProtocol = 0;
968 int iProfile = 0;
969 int iDirection = 0;
970
971 // initialize
972 hr = WcaInitialize(hInstall, "ExecFirewallExceptions");
973 ExitOnFailure(hr, "failed to initialize");
974
975 hr = WcaGetProperty( L"CustomActionData", &pwzCustomActionData);
976 ExitOnFailure(hr, "failed to get CustomActionData");
977 WcaLog(LOGMSG_TRACEONLY, "CustomActionData: %ls", pwzCustomActionData);
978
979 hr = ::CoInitialize(NULL);
980 ExitOnFailure(hr, "failed to initialize COM");
981
982 // Find out if we support profiles (only on Vista or later)
983 fSupportProfiles = FSupportProfiles();
984
985 // loop through all the passed in data
986 pwz = pwzCustomActionData;
987 while (pwz && *pwz)
988 {
989 // extract the custom action data and if rolling back, swap INSTALL and UNINSTALL
990 hr = WcaReadIntegerFromCaData(&pwz, &iTodo);
991 ExitOnFailure(hr, "failed to read todo from custom action data");
992 if (::MsiGetMode(hInstall, MSIRUNMODE_ROLLBACK))
993 {
994 if (WCA_TODO_INSTALL == iTodo)
995 {
996 iTodo = WCA_TODO_UNINSTALL;
997 }
998 else if (WCA_TODO_UNINSTALL == iTodo)
999 {
1000 iTodo = WCA_TODO_INSTALL;
1001 }
1002 }
1003
1004 hr = WcaReadStringFromCaData(&pwz, &pwzName);
1005 ExitOnFailure(hr, "failed to read name from custom action data");
1006
1007 hr = WcaReadIntegerFromCaData(&pwz, &iProfile);
1008 ExitOnFailure(hr, "failed to read profile from custom action data");
1009
1010 hr = WcaReadStringFromCaData(&pwz, &pwzRemoteAddresses);
1011 ExitOnFailure(hr, "failed to read remote addresses from custom action data");
1012
1013 hr = WcaReadIntegerFromCaData(&pwz, &iAttributes);
1014 ExitOnFailure(hr, "failed to read attributes from custom action data");
1015 BOOL fIgnoreFailures = feaIgnoreFailures == (iAttributes & feaIgnoreFailures);
1016
1017 hr = WcaReadIntegerFromCaData(&pwz, &iTarget);
1018 ExitOnFailure(hr, "failed to read target from custom action data");
1019
1020 if (iTarget == fetApplication)
1021 {
1022 hr = WcaReadStringFromCaData(&pwz, &pwzFile);
1023 ExitOnFailure(hr, "failed to read file path from custom action data");
1024 }
1025
1026 hr = WcaReadStringFromCaData(&pwz, &pwzPort);
1027 ExitOnFailure(hr, "failed to read port from custom action data");
1028 hr = WcaReadIntegerFromCaData(&pwz, &iProtocol);
1029 ExitOnFailure(hr, "failed to read protocol from custom action data");
1030 hr = WcaReadStringFromCaData(&pwz, &pwzDescription);
1031 ExitOnFailure(hr, "failed to read protocol from custom action data");
1032 hr = WcaReadIntegerFromCaData(&pwz, &iDirection);
1033 ExitOnFailure(hr, "failed to read direction from custom action data");
1034
1035 switch (iTarget)
1036 {
1037 case fetPort:
1038 switch (iTodo)
1039 {
1040 case WCA_TODO_INSTALL:
1041 case WCA_TODO_REINSTALL:
1042 WcaLog(LOGMSG_STANDARD, "Installing firewall exception2 %ls on port %ls, protocol %d", pwzName, pwzPort, iProtocol);
1043 hr = AddPortException(fSupportProfiles, pwzName, iProfile, pwzRemoteAddresses, fIgnoreFailures, pwzPort, iProtocol, pwzDescription, iDirection);
1044 ExitOnFailure(hr, "failed to add/update port exception for name '%ls' on port %ls, protocol %d", pwzName, pwzPort, iProtocol);
1045 break;
1046
1047 case WCA_TODO_UNINSTALL:
1048 WcaLog(LOGMSG_STANDARD, "Uninstalling firewall exception2 %ls on port %ls, protocol %d", pwzName, pwzPort, iProtocol);
1049 hr = RemovePortException(fSupportProfiles, pwzName, pwzPort, iProtocol, fIgnoreFailures);
1050 ExitOnFailure(hr, "failed to remove port exception for name '%ls' on port %ls, protocol %d", pwzName, pwzPort, iProtocol);
1051 break;
1052 }
1053 break;
1054
1055 case fetApplication:
1056 switch (iTodo)
1057 {
1058 case WCA_TODO_INSTALL:
1059 case WCA_TODO_REINSTALL:
1060 WcaLog(LOGMSG_STANDARD, "Installing firewall exception2 %ls (%ls)", pwzName, pwzFile);
1061 hr = AddApplicationException(fSupportProfiles, pwzFile, pwzName, iProfile, pwzRemoteAddresses, fIgnoreFailures, pwzPort, iProtocol, pwzDescription, iDirection);
1062 ExitOnFailure(hr, "failed to add/update application exception for name '%ls', file '%ls'", pwzName, pwzFile);
1063 break;
1064
1065 case WCA_TODO_UNINSTALL:
1066 WcaLog(LOGMSG_STANDARD, "Uninstalling firewall exception2 %ls (%ls)", pwzName, pwzFile);
1067 hr = RemoveApplicationException(fSupportProfiles, pwzName, pwzFile, fIgnoreFailures, pwzPort, iProtocol);
1068 ExitOnFailure(hr, "failed to remove application exception for name '%ls', file '%ls'", pwzName, pwzFile);
1069 break;
1070 }
1071 break;
1072 }
1073 }
1074
1075LExit:
1076 ReleaseStr(pwzCustomActionData);
1077 ReleaseStr(pwzName);
1078 ReleaseStr(pwzRemoteAddresses);
1079 ReleaseStr(pwzFile);
1080 ReleaseStr(pwzPort);
1081 ReleaseStr(pwzDescription);
1082 ::CoUninitialize();
1083
1084 return WcaFinalize(FAILED(hr) ? ERROR_INSTALL_FAILURE : ERROR_SUCCESS);
1085}
diff --git a/src/ext/Firewall/ca/fwca.def b/src/ext/Firewall/ca/fwca.def
new file mode 100644
index 00000000..d32c5379
--- /dev/null
+++ b/src/ext/Firewall/ca/fwca.def
@@ -0,0 +1,9 @@
1; Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3
4LIBRARY "fwca"
5
6EXPORTS
7 SchedFirewallExceptionsInstall
8 SchedFirewallExceptionsUninstall
9 ExecFirewallExceptions
diff --git a/src/ext/Firewall/ca/fwca.v3.ncrunchproject b/src/ext/Firewall/ca/fwca.v3.ncrunchproject
new file mode 100644
index 00000000..319cd523
--- /dev/null
+++ b/src/ext/Firewall/ca/fwca.v3.ncrunchproject
@@ -0,0 +1,5 @@
1<ProjectConfiguration>
2 <Settings>
3 <IgnoreThisComponentCompletely>True</IgnoreThisComponentCompletely>
4 </Settings>
5</ProjectConfiguration> \ No newline at end of file
diff --git a/src/ext/Firewall/ca/fwca.vcxproj b/src/ext/Firewall/ca/fwca.vcxproj
new file mode 100644
index 00000000..5e9a1db6
--- /dev/null
+++ b/src/ext/Firewall/ca/fwca.vcxproj
@@ -0,0 +1,81 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3
4<Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
5 <Import Project="..\..\packages\WixToolset.DUtil.4.0.56\build\WixToolset.DUtil.props" Condition="Exists('..\..\packages\WixToolset.DUtil.4.0.56\build\WixToolset.DUtil.props')" />
6 <Import Project="..\..\packages\WixToolset.WcaUtil.4.0.17\build\WixToolset.WcaUtil.props" Condition="Exists('..\..\packages\WixToolset.WcaUtil.4.0.17\build\WixToolset.WcaUtil.props')" />
7
8 <ItemGroup Label="ProjectConfigurations">
9 <ProjectConfiguration Include="Debug|ARM64">
10 <Configuration>Debug</Configuration>
11 <Platform>ARM64</Platform>
12 </ProjectConfiguration>
13 <ProjectConfiguration Include="Release|ARM64">
14 <Configuration>Release</Configuration>
15 <Platform>ARM64</Platform>
16 </ProjectConfiguration>
17
18 <ProjectConfiguration Include="Debug|X64">
19 <Configuration>Debug</Configuration>
20 <Platform>X64</Platform>
21 </ProjectConfiguration>
22 <ProjectConfiguration Include="Release|X64">
23 <Configuration>Release</Configuration>
24 <Platform>X64</Platform>
25 </ProjectConfiguration>
26
27 <ProjectConfiguration Include="Debug|Win32">
28 <Configuration>Debug</Configuration>
29 <Platform>Win32</Platform>
30 </ProjectConfiguration>
31 <ProjectConfiguration Include="Release|Win32">
32 <Configuration>Release</Configuration>
33 <Platform>Win32</Platform>
34 </ProjectConfiguration>
35 </ItemGroup>
36
37 <PropertyGroup Label="Globals">
38 <ProjectGuid>{F72D34CA-48DA-4DFD-91A9-A0C78BEF6981}</ProjectGuid>
39 <ConfigurationType>DynamicLibrary</ConfigurationType>
40 <TargetName>fwca</TargetName>
41 <PlatformToolset>v142</PlatformToolset>
42 <CharacterSet>Unicode</CharacterSet>
43 <ProjectModuleDefinitionFile>fwca.def</ProjectModuleDefinitionFile>
44 <Description>WiX Toolset Firewall CustomAction</Description>
45 </PropertyGroup>
46
47 <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
48 <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
49
50 <PropertyGroup>
51 <ProjectAdditionalLinkLibraries>msi.lib</ProjectAdditionalLinkLibraries>
52 </PropertyGroup>
53
54 <ItemGroup>
55 <ClCompile Include="dllmain.cpp">
56 <PrecompiledHeader>Create</PrecompiledHeader>
57 </ClCompile>
58 <ClCompile Include="firewall.cpp" />
59 </ItemGroup>
60
61 <ItemGroup>
62 <ClInclude Include="cost.h" />
63 <ClInclude Include="CustomMsiErrors.h" />
64 <ClInclude Include="precomp.h" />
65 </ItemGroup>
66
67 <ItemGroup>
68 <None Include="fwca.def" />
69 <None Include="packages.config" />
70 </ItemGroup>
71
72 <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
73
74 <Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
75 <PropertyGroup>
76 <ErrorText>This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
77 </PropertyGroup>
78 <Error Condition="!Exists('..\..\packages\WixToolset.DUtil.4.0.56\build\WixToolset.DUtil.props')" Text="$([System.String]::Format('$(ErrorText)', '..\..\packages\WixToolset.DUtil.4.0.56\build\WixToolset.DUtil.props'))" />
79 <Error Condition="!Exists('..\..\packages\WixToolset.WcaUtil.4.0.17\build\WixToolset.WcaUtil.props')" Text="$([System.String]::Format('$(ErrorText)', '..\..\packages\WixToolset.WcaUtil.4.0.17\build\WixToolset.WcaUtil.props'))" />
80 </Target>
81</Project>
diff --git a/src/ext/Firewall/ca/packages.config b/src/ext/Firewall/ca/packages.config
new file mode 100644
index 00000000..9d88f529
--- /dev/null
+++ b/src/ext/Firewall/ca/packages.config
@@ -0,0 +1,5 @@
1<?xml version="1.0" encoding="utf-8"?>
2<packages>
3 <package id="WixToolset.DUtil" version="4.0.56" targetFramework="native" />
4 <package id="WixToolset.WcaUtil" version="4.0.17" targetFramework="native" />
5</packages> \ No newline at end of file
diff --git a/src/ext/Firewall/ca/precomp.h b/src/ext/Firewall/ca/precomp.h
new file mode 100644
index 00000000..03845e1e
--- /dev/null
+++ b/src/ext/Firewall/ca/precomp.h
@@ -0,0 +1,19 @@
1#pragma once
2// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
3
4
5#include <windows.h>
6#include <msidefs.h>
7#include <msiquery.h>
8#include <strsafe.h>
9#include <netfw.h>
10
11#include "wcautil.h"
12#include "fileutil.h"
13#include "pathutil.h"
14#include "strutil.h"
15
16#include "CustomMsiErrors.h"
17#include "cost.h"
18
19#include "caDecor.h"
diff --git a/src/ext/Firewall/nuget.config b/src/ext/Firewall/nuget.config
new file mode 100644
index 00000000..aaf36562
--- /dev/null
+++ b/src/ext/Firewall/nuget.config
@@ -0,0 +1,18 @@
1<?xml version="1.0" encoding="utf-8"?>
2<configuration>
3 <packageSources>
4 <clear />
5 <add key="wixtoolset-burn" value="https://ci.appveyor.com/nuget/wixtoolset-burn" />
6 <add key="wixtoolset-data" value="https://ci.appveyor.com/nuget/wixtoolset-data" />
7 <add key="wixtoolset-extensibility" value="https://ci.appveyor.com/nuget/wixtoolset-extensibility" />
8 <add key="wixtoolset-core" value="https://ci.appveyor.com/nuget/wixtoolset-core" />
9 <add key="wixtoolset-core-native" value="https://ci.appveyor.com/nuget/wixtoolset-core-native" />
10 <add key="wixtoolset-burn" value="https://ci.appveyor.com/nuget/wixtoolset-burn" />
11 <add key="wixtoolset-dtf" value="https://ci.appveyor.com/nuget/wixtoolset-dtf" />
12 <add key="wixtoolset-dutil" value="https://ci.appveyor.com/nuget/wixtoolset-dutil" />
13 <add key="wixtoolset-wcautil" value="https://ci.appveyor.com/nuget/wixtoolset-wcautil" />
14 <add key="wixtoolset-tools" value="https://ci.appveyor.com/nuget/wixtoolset-tools" />
15 <add key="wixbuildtools" value="https://ci.appveyor.com/nuget/wixbuildtools" />
16 <add key="api.nuget.org" value="https://api.nuget.org/v3/index.json" protocolVersion="3" />
17 </packageSources>
18</configuration> \ No newline at end of file
diff --git a/src/ext/Firewall/test/WixToolsetTest.Firewall/FirewallExtensionFixture.cs b/src/ext/Firewall/test/WixToolsetTest.Firewall/FirewallExtensionFixture.cs
new file mode 100644
index 00000000..ffdc1326
--- /dev/null
+++ b/src/ext/Firewall/test/WixToolsetTest.Firewall/FirewallExtensionFixture.cs
@@ -0,0 +1,80 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolsetTest.Firewall
4{
5 using System.Linq;
6 using WixBuildTools.TestSupport;
7 using WixToolset.Core.TestPackage;
8 using WixToolset.Firewall;
9 using Xunit;
10
11 public class FirewallExtensionFixture
12 {
13 [Fact]
14 public void CanBuildUsingFirewall()
15 {
16 var folder = TestData.Get(@"TestData\UsingFirewall");
17 var build = new Builder(folder, typeof(FirewallExtensionFactory), new[] { folder });
18
19 var results = build.BuildAndQuery(Build, "Wix4FirewallException", "CustomAction");
20 Assert.Equal(new[]
21 {
22 "CustomAction:Wix4ExecFirewallExceptionsInstall_X86\t3073\tWix4FWCA_X86\tExecFirewallExceptions\t",
23 "CustomAction:Wix4ExecFirewallExceptionsUninstall_X86\t3073\tWix4FWCA_X86\tExecFirewallExceptions\t",
24 "CustomAction:Wix4RollbackFirewallExceptionsInstall_X86\t3329\tWix4FWCA_X86\tExecFirewallExceptions\t",
25 "CustomAction:Wix4RollbackFirewallExceptionsUninstall_X86\t3329\tWix4FWCA_X86\tExecFirewallExceptions\t",
26 "CustomAction:Wix4SchedFirewallExceptionsInstall_X86\t1\tWix4FWCA_X86\tSchedFirewallExceptionsInstall\t",
27 "CustomAction:Wix4SchedFirewallExceptionsUninstall_X86\t1\tWix4FWCA_X86\tSchedFirewallExceptionsUninstall\t",
28 "Wix4FirewallException:ExampleFirewall\texample\t*\t42\t6\t\t0\t2147483647\tfilF5_pLhBuF5b4N9XEo52g_hUM5Lo\tAn example firewall\t1",
29 }, results);
30 }
31
32 [Fact]
33 public void CanBuildUsingFirewallARM64()
34 {
35 var folder = TestData.Get(@"TestData\UsingFirewall");
36 var build = new Builder(folder, typeof(FirewallExtensionFactory), new[] { folder });
37
38 var results = build.BuildAndQuery(BuildARM64, "Wix4FirewallException", "CustomAction");
39 Assert.Equal(new[]
40 {
41 "CustomAction:Wix4ExecFirewallExceptionsInstall_A64\t3073\tWix4FWCA_A64\tExecFirewallExceptions\t",
42 "CustomAction:Wix4ExecFirewallExceptionsUninstall_A64\t3073\tWix4FWCA_A64\tExecFirewallExceptions\t",
43 "CustomAction:Wix4RollbackFirewallExceptionsInstall_A64\t3329\tWix4FWCA_A64\tExecFirewallExceptions\t",
44 "CustomAction:Wix4RollbackFirewallExceptionsUninstall_A64\t3329\tWix4FWCA_A64\tExecFirewallExceptions\t",
45 "CustomAction:Wix4SchedFirewallExceptionsInstall_A64\t1\tWix4FWCA_A64\tSchedFirewallExceptionsInstall\t",
46 "CustomAction:Wix4SchedFirewallExceptionsUninstall_A64\t1\tWix4FWCA_A64\tSchedFirewallExceptionsUninstall\t",
47 "Wix4FirewallException:ExampleFirewall\texample\t*\t42\t6\t\t0\t2147483647\tfilF5_pLhBuF5b4N9XEo52g_hUM5Lo\tAn example firewall\t1",
48 }, results);
49 }
50
51 [Fact]
52 public void CanBuildUsingOutboundFirewall()
53 {
54 var folder = TestData.Get(@"TestData\UsingOutboundFirewall");
55 var build = new Builder(folder, typeof(FirewallExtensionFactory), new[] { folder });
56
57 var results = build.BuildAndQuery(Build, "Wix4FirewallException");
58 Assert.Equal(new[]
59 {
60 "Wix4FirewallException:fex.5c8b_4C0THcQTvn8tpwhoRrgck\texample\t*\t42\t6\t\t0\t2147483647\tfilF5_pLhBuF5b4N9XEo52g_hUM5Lo\tAn example outbound firewall\t2",
61 }, results);
62 }
63
64 private static void Build(string[] args)
65 {
66 var result = WixRunner.Execute(args);
67 result.AssertSuccess();
68 }
69
70 private static void BuildARM64(string[] args)
71 {
72 var newArgs = args.ToList();
73 newArgs.Add("-platform");
74 newArgs.Add("arm64");
75
76 var result = WixRunner.Execute(newArgs.ToArray());
77 result.AssertSuccess();
78 }
79 }
80}
diff --git a/src/ext/Firewall/test/WixToolsetTest.Firewall/TestData/UsingFirewall/Package.en-us.wxl b/src/ext/Firewall/test/WixToolsetTest.Firewall/TestData/UsingFirewall/Package.en-us.wxl
new file mode 100644
index 00000000..38c12ac1
--- /dev/null
+++ b/src/ext/Firewall/test/WixToolsetTest.Firewall/TestData/UsingFirewall/Package.en-us.wxl
@@ -0,0 +1,11 @@
1<?xml version="1.0" encoding="utf-8"?>
2
3<!--
4This file contains the declaration of all the localizable strings.
5-->
6<WixLocalization xmlns="http://wixtoolset.org/schemas/v4/wxl" Culture="en-US">
7
8 <String Id="DowngradeError">A newer version of [ProductName] is already installed.</String>
9 <String Id="FeatureTitle">MsiPackage</String>
10
11</WixLocalization>
diff --git a/src/ext/Firewall/test/WixToolsetTest.Firewall/TestData/UsingFirewall/Package.wxs b/src/ext/Firewall/test/WixToolsetTest.Firewall/TestData/UsingFirewall/Package.wxs
new file mode 100644
index 00000000..411893bc
--- /dev/null
+++ b/src/ext/Firewall/test/WixToolsetTest.Firewall/TestData/UsingFirewall/Package.wxs
@@ -0,0 +1,15 @@
1<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
2 <Package Name="MsiPackage" Language="1033" Version="1.0.0.0" Manufacturer="Example Corporation" UpgradeCode="047730a5-30fe-4a62-a520-da9381b8226a">
3 <MajorUpgrade DowngradeErrorMessage="!(loc.DowngradeError)" />
4
5 <Feature Id="ProductFeature" Title="!(loc.FeatureTitle)">
6 <ComponentGroupRef Id="ProductComponents" />
7 </Feature>
8 </Package>
9
10 <Fragment>
11 <StandardDirectory Id="ProgramFilesFolder">
12 <Directory Id="INSTALLFOLDER" Name="MsiPackage" />
13 </StandardDirectory>
14 </Fragment>
15</Wix>
diff --git a/src/ext/Firewall/test/WixToolsetTest.Firewall/TestData/UsingFirewall/PackageComponents.wxs b/src/ext/Firewall/test/WixToolsetTest.Firewall/TestData/UsingFirewall/PackageComponents.wxs
new file mode 100644
index 00000000..53e75427
--- /dev/null
+++ b/src/ext/Firewall/test/WixToolsetTest.Firewall/TestData/UsingFirewall/PackageComponents.wxs
@@ -0,0 +1,14 @@
1<?xml version="1.0" encoding="utf-8"?>
2<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs"
3 xmlns:fw="http://wixtoolset.org/schemas/v4/wxs/firewall">
4 <Fragment>
5 <ComponentGroup Id="ProductComponents" Directory="INSTALLFOLDER">
6 <Component>
7 <File Source="example.txt" />
8 <fw:FirewallException Id="ExampleFirewall" Description="An example firewall" Name="example" Port="42">
9 <fw:RemoteAddress Value="*" />
10 </fw:FirewallException>
11 </Component>
12 </ComponentGroup>
13 </Fragment>
14</Wix>
diff --git a/src/ext/Firewall/test/WixToolsetTest.Firewall/TestData/UsingFirewall/example.txt b/src/ext/Firewall/test/WixToolsetTest.Firewall/TestData/UsingFirewall/example.txt
new file mode 100644
index 00000000..1b4ffe8a
--- /dev/null
+++ b/src/ext/Firewall/test/WixToolsetTest.Firewall/TestData/UsingFirewall/example.txt
@@ -0,0 +1 @@
This is example.txt. \ No newline at end of file
diff --git a/src/ext/Firewall/test/WixToolsetTest.Firewall/TestData/UsingOutboundFirewall/Package.en-us.wxl b/src/ext/Firewall/test/WixToolsetTest.Firewall/TestData/UsingOutboundFirewall/Package.en-us.wxl
new file mode 100644
index 00000000..38c12ac1
--- /dev/null
+++ b/src/ext/Firewall/test/WixToolsetTest.Firewall/TestData/UsingOutboundFirewall/Package.en-us.wxl
@@ -0,0 +1,11 @@
1<?xml version="1.0" encoding="utf-8"?>
2
3<!--
4This file contains the declaration of all the localizable strings.
5-->
6<WixLocalization xmlns="http://wixtoolset.org/schemas/v4/wxl" Culture="en-US">
7
8 <String Id="DowngradeError">A newer version of [ProductName] is already installed.</String>
9 <String Id="FeatureTitle">MsiPackage</String>
10
11</WixLocalization>
diff --git a/src/ext/Firewall/test/WixToolsetTest.Firewall/TestData/UsingOutboundFirewall/Package.wxs b/src/ext/Firewall/test/WixToolsetTest.Firewall/TestData/UsingOutboundFirewall/Package.wxs
new file mode 100644
index 00000000..411893bc
--- /dev/null
+++ b/src/ext/Firewall/test/WixToolsetTest.Firewall/TestData/UsingOutboundFirewall/Package.wxs
@@ -0,0 +1,15 @@
1<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
2 <Package Name="MsiPackage" Language="1033" Version="1.0.0.0" Manufacturer="Example Corporation" UpgradeCode="047730a5-30fe-4a62-a520-da9381b8226a">
3 <MajorUpgrade DowngradeErrorMessage="!(loc.DowngradeError)" />
4
5 <Feature Id="ProductFeature" Title="!(loc.FeatureTitle)">
6 <ComponentGroupRef Id="ProductComponents" />
7 </Feature>
8 </Package>
9
10 <Fragment>
11 <StandardDirectory Id="ProgramFilesFolder">
12 <Directory Id="INSTALLFOLDER" Name="MsiPackage" />
13 </StandardDirectory>
14 </Fragment>
15</Wix>
diff --git a/src/ext/Firewall/test/WixToolsetTest.Firewall/TestData/UsingOutboundFirewall/PackageComponents.wxs b/src/ext/Firewall/test/WixToolsetTest.Firewall/TestData/UsingOutboundFirewall/PackageComponents.wxs
new file mode 100644
index 00000000..8084706e
--- /dev/null
+++ b/src/ext/Firewall/test/WixToolsetTest.Firewall/TestData/UsingOutboundFirewall/PackageComponents.wxs
@@ -0,0 +1,14 @@
1<?xml version="1.0" encoding="utf-8"?>
2<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs"
3 xmlns:fw="http://wixtoolset.org/schemas/v4/wxs/firewall">
4 <Fragment>
5 <ComponentGroup Id="ProductComponents" Directory="INSTALLFOLDER">
6 <Component>
7 <File Source="example.txt" />
8 <fw:FirewallException Description="An example outbound firewall" Name="example" Port="42" Outbound="yes">
9 <fw:RemoteAddress Value="*" />
10 </fw:FirewallException>
11 </Component>
12 </ComponentGroup>
13 </Fragment>
14</Wix>
diff --git a/src/ext/Firewall/test/WixToolsetTest.Firewall/TestData/UsingOutboundFirewall/example.txt b/src/ext/Firewall/test/WixToolsetTest.Firewall/TestData/UsingOutboundFirewall/example.txt
new file mode 100644
index 00000000..1b4ffe8a
--- /dev/null
+++ b/src/ext/Firewall/test/WixToolsetTest.Firewall/TestData/UsingOutboundFirewall/example.txt
@@ -0,0 +1 @@
This is example.txt. \ No newline at end of file
diff --git a/src/ext/Firewall/test/WixToolsetTest.Firewall/WixToolsetTest.Firewall.csproj b/src/ext/Firewall/test/WixToolsetTest.Firewall/WixToolsetTest.Firewall.csproj
new file mode 100644
index 00000000..d04368c1
--- /dev/null
+++ b/src/ext/Firewall/test/WixToolsetTest.Firewall/WixToolsetTest.Firewall.csproj
@@ -0,0 +1,45 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3
4<Project Sdk="Microsoft.NET.Sdk">
5 <PropertyGroup>
6 <TargetFramework>netcoreapp3.1</TargetFramework>
7 <IsPackable>false</IsPackable>
8 </PropertyGroup>
9
10 <PropertyGroup>
11 <NoWarn>NU1701</NoWarn>
12 </PropertyGroup>
13
14 <ItemGroup>
15 <Content Include="TestData\UsingFirewall\example.txt" CopyToOutputDirectory="PreserveNewest" />
16 <Content Include="TestData\UsingFirewall\Package.en-us.wxl" CopyToOutputDirectory="PreserveNewest" />
17 <Content Include="TestData\UsingFirewall\Package.wxs" CopyToOutputDirectory="PreserveNewest" />
18 <Content Include="TestData\UsingFirewall\PackageComponents.wxs" CopyToOutputDirectory="PreserveNewest" />
19 <Content Include="TestData\UsingOutboundFirewall\example.txt" CopyToOutputDirectory="PreserveNewest" />
20 <Content Include="TestData\UsingOutboundFirewall\Package.en-us.wxl" CopyToOutputDirectory="PreserveNewest" />
21 <Content Include="TestData\UsingOutboundFirewall\Package.wxs" CopyToOutputDirectory="PreserveNewest" />
22 <Content Include="TestData\UsingOutboundFirewall\PackageComponents.wxs" CopyToOutputDirectory="PreserveNewest" />
23 </ItemGroup>
24
25 <ItemGroup>
26 <ProjectReference Include="..\..\wixext\WixToolset.Firewall.wixext.csproj" />
27 </ItemGroup>
28
29 <ItemGroup>
30 <PackageReference Include="WixToolset.Core" Version="4.0.*" />
31 <PackageReference Include="WixToolset.Core.Burn" Version="4.0.*" />
32 <PackageReference Include="WixToolset.Core.WindowsInstaller" Version="4.0.*" />
33 <PackageReference Include="WixToolset.Core.TestPackage" Version="4.0.*" />
34 </ItemGroup>
35
36 <ItemGroup>
37 <PackageReference Include="WixBuildTools.TestSupport" Version="4.0.*" />
38 </ItemGroup>
39
40 <ItemGroup>
41 <PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.3.0" />
42 <PackageReference Include="xunit" Version="2.4.1" />
43 <PackageReference Include="xunit.runner.visualstudio" Version="2.4.1" PrivateAssets="All" />
44 </ItemGroup>
45</Project>
diff --git a/src/ext/Firewall/test/WixToolsetTest.Firewall/WixToolsetTest.Firewall.v3.ncrunchproject b/src/ext/Firewall/test/WixToolsetTest.Firewall/WixToolsetTest.Firewall.v3.ncrunchproject
new file mode 100644
index 00000000..7b5b2139
--- /dev/null
+++ b/src/ext/Firewall/test/WixToolsetTest.Firewall/WixToolsetTest.Firewall.v3.ncrunchproject
@@ -0,0 +1,5 @@
1<ProjectConfiguration>
2 <Settings>
3 <CopyReferencedAssembliesToWorkspace>True</CopyReferencedAssembliesToWorkspace>
4 </Settings>
5</ProjectConfiguration> \ No newline at end of file
diff --git a/src/ext/Firewall/wix.snk b/src/ext/Firewall/wix.snk
new file mode 100644
index 00000000..3908a66a
--- /dev/null
+++ b/src/ext/Firewall/wix.snk
Binary files differ
diff --git a/src/ext/Firewall/wixext/FirewallCompiler.cs b/src/ext/Firewall/wixext/FirewallCompiler.cs
new file mode 100644
index 00000000..cbe82d37
--- /dev/null
+++ b/src/ext/Firewall/wixext/FirewallCompiler.cs
@@ -0,0 +1,354 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Firewall
4{
5 using System;
6 using System.Collections.Generic;
7 using System.Xml.Linq;
8 using WixToolset.Data;
9 using WixToolset.Extensibility;
10 using WixToolset.Extensibility.Data;
11 using WixToolset.Firewall.Symbols;
12
13 /// <summary>
14 /// The compiler for the WiX Toolset Firewall Extension.
15 /// </summary>
16 public sealed class FirewallCompiler : BaseCompilerExtension
17 {
18 public override XNamespace Namespace => "http://wixtoolset.org/schemas/v4/wxs/firewall";
19
20 /// <summary>
21 /// Processes an element for the Compiler.
22 /// </summary>
23 /// <param name="sourceLineNumbers">Source line number for the parent element.</param>
24 /// <param name="parentElement">Parent element of element to process.</param>
25 /// <param name="element">Element to process.</param>
26 /// <param name="contextValues">Extra information about the context in which this element is being parsed.</param>
27 public override void ParseElement(Intermediate intermediate, IntermediateSection section, XElement parentElement, XElement element, IDictionary<string, string> context)
28 {
29 switch (parentElement.Name.LocalName)
30 {
31 case "File":
32 var fileId = context["FileId"];
33 var fileComponentId = context["ComponentId"];
34
35 switch (element.Name.LocalName)
36 {
37 case "FirewallException":
38 this.ParseFirewallExceptionElement(intermediate, section, element, fileComponentId, fileId);
39 break;
40 default:
41 this.ParseHelper.UnexpectedElement(parentElement, element);
42 break;
43 }
44 break;
45 case "Component":
46 var componentId = context["ComponentId"];
47
48 switch (element.Name.LocalName)
49 {
50 case "FirewallException":
51 this.ParseFirewallExceptionElement(intermediate, section, element, componentId, null);
52 break;
53 default:
54 this.ParseHelper.UnexpectedElement(parentElement, element);
55 break;
56 }
57 break;
58 default:
59 this.ParseHelper.UnexpectedElement(parentElement, element);
60 break;
61 }
62 }
63
64 /// <summary>
65 /// Parses a FirewallException element.
66 /// </summary>
67 /// <param name="element">The element to parse.</param>
68 /// <param name="componentId">Identifier of the component that owns this firewall exception.</param>
69 /// <param name="fileId">The file identifier of the parent element (null if nested under Component).</param>
70 private void ParseFirewallExceptionElement(Intermediate intermediate, IntermediateSection section, XElement element, string componentId, string fileId)
71 {
72 var sourceLineNumbers = this.ParseHelper.GetSourceLineNumbers(element);
73 Identifier id = null;
74 string name = null;
75 int attributes = 0;
76 string file = null;
77 string program = null;
78 string port = null;
79 int? protocol = null;
80 int? profile = null;
81 string scope = null;
82 string remoteAddresses = null;
83 string description = null;
84 int? direction = null;
85
86 foreach (var attrib in element.Attributes())
87 {
88 if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || this.Namespace == attrib.Name.Namespace)
89 {
90 switch (attrib.Name.LocalName)
91 {
92 case "Id":
93 id = this.ParseHelper.GetAttributeIdentifier(sourceLineNumbers, attrib);
94 break;
95 case "Name":
96 name = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
97 break;
98 case "File":
99 if (null != fileId)
100 {
101 this.Messaging.Write(ErrorMessages.IllegalAttributeWhenNested(sourceLineNumbers, element.Name.LocalName, "File", "File"));
102 }
103 else
104 {
105 file = this.ParseHelper.GetAttributeIdentifierValue(sourceLineNumbers, attrib);
106 }
107 break;
108 case "IgnoreFailure":
109 if (YesNoType.Yes == this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib))
110 {
111 attributes |= 0x1; // feaIgnoreFailures
112 }
113 break;
114 case "Program":
115 if (null != fileId)
116 {
117 this.Messaging.Write(ErrorMessages.IllegalAttributeWhenNested(sourceLineNumbers, element.Name.LocalName, "Program", "File"));
118 }
119 else
120 {
121 program = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
122 }
123 break;
124 case "Port":
125 port = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
126 break;
127 case "Protocol":
128 var protocolValue = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
129 switch (protocolValue)
130 {
131 case "tcp":
132 protocol = FirewallConstants.NET_FW_IP_PROTOCOL_TCP;
133 break;
134 case "udp":
135 protocol = FirewallConstants.NET_FW_IP_PROTOCOL_UDP;
136 break;
137 default:
138 this.Messaging.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, element.Name.LocalName, "Protocol", protocolValue, "tcp", "udp"));
139 break;
140 }
141 break;
142 case "Scope":
143 scope = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
144 switch (scope)
145 {
146 case "any":
147 remoteAddresses = "*";
148 break;
149 case "localSubnet":
150 remoteAddresses = "LocalSubnet";
151 break;
152 default:
153 this.Messaging.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, element.Name.LocalName, "Scope", scope, "any", "localSubnet"));
154 break;
155 }
156 break;
157 case "Profile":
158 var profileValue = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
159 switch (profileValue)
160 {
161 case "domain":
162 profile = FirewallConstants.NET_FW_PROFILE2_DOMAIN;
163 break;
164 case "private":
165 profile = FirewallConstants.NET_FW_PROFILE2_PRIVATE;
166 break;
167 case "public":
168 profile = FirewallConstants.NET_FW_PROFILE2_PUBLIC;
169 break;
170 case "all":
171 profile = FirewallConstants.NET_FW_PROFILE2_ALL;
172 break;
173 default:
174 this.Messaging.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, element.Name.LocalName, "Profile", profileValue, "domain", "private", "public", "all"));
175 break;
176 }
177 break;
178 case "Description":
179 description = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
180 break;
181 case "Outbound":
182 direction = this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib) == YesNoType.Yes
183 ? FirewallConstants.NET_FW_RULE_DIR_OUT
184 : FirewallConstants.NET_FW_RULE_DIR_IN;
185 break;
186 default:
187 this.ParseHelper.UnexpectedAttribute(element, attrib);
188 break;
189 }
190 }
191 else
192 {
193 this.ParseHelper.ParseExtensionAttribute(this.Context.Extensions, intermediate, section, element, attrib);
194 }
195 }
196
197 // parse RemoteAddress children
198 foreach (var child in element.Elements())
199 {
200 if (this.Namespace == child.Name.Namespace)
201 {
202 switch (child.Name.LocalName)
203 {
204 case "RemoteAddress":
205 if (null != scope)
206 {
207 this.Messaging.Write(FirewallErrors.IllegalRemoteAddressWithScopeAttribute(sourceLineNumbers));
208 }
209 else
210 {
211 this.ParseRemoteAddressElement(intermediate, section, child, ref remoteAddresses);
212 }
213 break;
214 default:
215 this.ParseHelper.UnexpectedElement(element, child);
216 break;
217 }
218 }
219 else
220 {
221 this.ParseHelper.ParseExtensionElement(this.Context.Extensions, intermediate, section, element, child);
222 }
223 }
224
225 if (null == id)
226 {
227 id = this.ParseHelper.CreateIdentifier("fex", name, remoteAddresses, componentId);
228 }
229
230 // Name is required
231 if (null == name)
232 {
233 this.Messaging.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, element.Name.LocalName, "Name"));
234 }
235
236 // Scope or child RemoteAddress(es) are required
237 if (null == remoteAddresses)
238 {
239 this.Messaging.Write(ErrorMessages.ExpectedAttributeOrElement(sourceLineNumbers, element.Name.LocalName, "Scope", "RemoteAddress"));
240 }
241
242 // can't have both Program and File
243 if (null != program && null != file)
244 {
245 this.Messaging.Write(ErrorMessages.IllegalAttributeWithOtherAttribute(sourceLineNumbers, element.Name.LocalName, "File", "Program"));
246 }
247
248 // must be nested under File, have File or Program attributes, or have Port attribute
249 if (String.IsNullOrEmpty(fileId) && String.IsNullOrEmpty(file) && String.IsNullOrEmpty(program) && String.IsNullOrEmpty(port))
250 {
251 this.Messaging.Write(FirewallErrors.NoExceptionSpecified(sourceLineNumbers));
252 }
253
254 if (!this.Messaging.EncounteredError)
255 {
256 // at this point, File attribute and File parent element are treated the same
257 if (null != file)
258 {
259 fileId = file;
260 }
261
262 var symbol = section.AddSymbol(new WixFirewallExceptionSymbol(sourceLineNumbers, id)
263 {
264 Name = name,
265 RemoteAddresses = remoteAddresses,
266 Profile = profile ?? FirewallConstants.NET_FW_PROFILE2_ALL,
267 ComponentRef = componentId,
268 Description = description,
269 Direction = direction ?? FirewallConstants.NET_FW_RULE_DIR_IN,
270 });
271
272 if (!String.IsNullOrEmpty(port))
273 {
274 symbol.Port = port;
275
276 if (!protocol.HasValue)
277 {
278 // default protocol is "TCP"
279 protocol = FirewallConstants.NET_FW_IP_PROTOCOL_TCP;
280 }
281 }
282
283 if (protocol.HasValue)
284 {
285 symbol.Protocol = protocol.Value;
286 }
287
288 if (!String.IsNullOrEmpty(fileId))
289 {
290 symbol.Program = $"[#{fileId}]";
291 this.ParseHelper.CreateSimpleReference(section, sourceLineNumbers, SymbolDefinitions.File, fileId);
292 }
293 else if (!String.IsNullOrEmpty(program))
294 {
295 symbol.Program = program;
296 }
297
298 if (CompilerConstants.IntegerNotSet != attributes)
299 {
300 symbol.Attributes = attributes;
301 }
302
303 this.ParseHelper.CreateCustomActionReference(sourceLineNumbers, section, "Wix4SchedFirewallExceptionsInstall", this.Context.Platform, CustomActionPlatforms.ARM64 | CustomActionPlatforms.X64 | CustomActionPlatforms.X86);
304 this.ParseHelper.CreateCustomActionReference(sourceLineNumbers, section, "Wix4SchedFirewallExceptionsUninstall", this.Context.Platform, CustomActionPlatforms.ARM64 | CustomActionPlatforms.X64 | CustomActionPlatforms.X86);
305 }
306 }
307
308 /// <summary>
309 /// Parses a RemoteAddress element
310 /// </summary>
311 /// <param name="element">The element to parse.</param>
312 private void ParseRemoteAddressElement(Intermediate intermediate, IntermediateSection section, XElement element, ref string remoteAddresses)
313 {
314 var sourceLineNumbers = this.ParseHelper.GetSourceLineNumbers(element);
315 string address = null;
316
317 // no attributes
318 foreach (var attrib in element.Attributes())
319 {
320 if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || this.Namespace == attrib.Name.Namespace)
321 {
322 switch (attrib.Name.LocalName)
323 {
324 case "Value":
325 address = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
326 break;
327 }
328 }
329 else
330 {
331 this.ParseHelper.ParseExtensionAttribute(this.Context.Extensions, intermediate, section, element, attrib);
332 }
333 }
334
335 this.ParseHelper.ParseForExtensionElements(this.Context.Extensions, intermediate, section, element);
336
337 if (String.IsNullOrEmpty(address))
338 {
339 this.Messaging.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, element.Name.LocalName, "Value"));
340 }
341 else
342 {
343 if (String.IsNullOrEmpty(remoteAddresses))
344 {
345 remoteAddresses = address;
346 }
347 else
348 {
349 remoteAddresses = String.Concat(remoteAddresses, ",", address);
350 }
351 }
352 }
353 }
354}
diff --git a/src/ext/Firewall/wixext/FirewallConstants.cs b/src/ext/Firewall/wixext/FirewallConstants.cs
new file mode 100644
index 00000000..7bb12ba4
--- /dev/null
+++ b/src/ext/Firewall/wixext/FirewallConstants.cs
@@ -0,0 +1,23 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Firewall
4{
5 using System;
6 using System.Collections.Generic;
7 using System.Text;
8
9 static class FirewallConstants
10 {
11 // from icftypes.h
12 public const int NET_FW_RULE_DIR_IN = 1;
13 public const int NET_FW_RULE_DIR_OUT = 2;
14 public const int NET_FW_IP_PROTOCOL_TCP = 6;
15 public const int NET_FW_IP_PROTOCOL_UDP = 17;
16
17 // from icftypes.h
18 public const int NET_FW_PROFILE2_DOMAIN = 0x0001;
19 public const int NET_FW_PROFILE2_PRIVATE = 0x0002;
20 public const int NET_FW_PROFILE2_PUBLIC = 0x0004;
21 public const int NET_FW_PROFILE2_ALL = 0x7FFFFFFF;
22 }
23}
diff --git a/src/ext/Firewall/wixext/FirewallDecompiler.cs b/src/ext/Firewall/wixext/FirewallDecompiler.cs
new file mode 100644
index 00000000..c9478de1
--- /dev/null
+++ b/src/ext/Firewall/wixext/FirewallDecompiler.cs
@@ -0,0 +1,182 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Firewall
4{
5#if TODO_CONSIDER_DECOMPILER
6 using System;
7 using System.Collections;
8 using System.Diagnostics;
9 using System.Globalization;
10 using WixToolset.Data;
11 using WixToolset.Extensibility;
12 using Firewall = WixToolset.Extensions.Serialize.Firewall;
13 using Wix = WixToolset.Data.Serialize;
14
15 /// <summary>
16 /// The decompiler for the WiX Toolset Firewall Extension.
17 /// </summary>
18 public sealed class FirewallDecompiler : DecompilerExtension
19 {
20 /// <summary>
21 /// Creates a decompiler for Firewall Extension.
22 /// </summary>
23 public FirewallDecompiler()
24 {
25 this.TableDefinitions = FirewallExtensionData.GetExtensionTableDefinitions();
26 }
27
28 /// <summary>
29 /// Get the extensions library to be removed.
30 /// </summary>
31 /// <param name="tableDefinitions">Table definitions for library.</param>
32 /// <returns>Library to remove from decompiled output.</returns>
33 public override Library GetLibraryToRemove(TableDefinitionCollection tableDefinitions)
34 {
35 return FirewallExtensionData.GetExtensionLibrary(tableDefinitions);
36 }
37
38 /// <summary>
39 /// Decompiles an extension table.
40 /// </summary>
41 /// <param name="table">The table to decompile.</param>
42 public override void DecompileTable(Table table)
43 {
44 switch (table.Name)
45 {
46 case "WixFirewallException":
47 this.DecompileWixFirewallExceptionTable(table);
48 break;
49 default:
50 base.DecompileTable(table);
51 break;
52 }
53 }
54
55 /// <summary>
56 /// Decompile the WixFirewallException table.
57 /// </summary>
58 /// <param name="table">The table to decompile.</param>
59 private void DecompileWixFirewallExceptionTable(Table table)
60 {
61 foreach (Row row in table.Rows)
62 {
63 Firewall.FirewallException fire = new Firewall.FirewallException();
64 fire.Id = (string)row[0];
65 fire.Name = (string)row[1];
66
67 string[] addresses = ((string)row[2]).Split(',');
68 if (1 == addresses.Length)
69 {
70 // special-case the Scope attribute values
71 if ("*" == addresses[0])
72 {
73 fire.Scope = Firewall.FirewallException.ScopeType.any;
74 }
75 else if ("LocalSubnet" == addresses[0])
76 {
77 fire.Scope = Firewall.FirewallException.ScopeType.localSubnet;
78 }
79 else
80 {
81 FirewallDecompiler.AddRemoteAddress(fire, addresses[0]);
82 }
83 }
84 else
85 {
86 foreach (string address in addresses)
87 {
88 FirewallDecompiler.AddRemoteAddress(fire, address);
89 }
90 }
91
92 if (!row.IsColumnEmpty(3))
93 {
94 fire.Port = (string)row[3];
95 }
96
97 if (!row.IsColumnEmpty(4))
98 {
99 switch (Convert.ToInt32(row[4]))
100 {
101 case FirewallConstants.NET_FW_IP_PROTOCOL_TCP:
102 fire.Protocol = Firewall.FirewallException.ProtocolType.tcp;
103 break;
104 case FirewallConstants.NET_FW_IP_PROTOCOL_UDP:
105 fire.Protocol = Firewall.FirewallException.ProtocolType.udp;
106 break;
107 }
108 }
109
110 if (!row.IsColumnEmpty(5))
111 {
112 fire.Program = (string)row[5];
113 }
114
115 if (!row.IsColumnEmpty(6))
116 {
117 int attr = Convert.ToInt32(row[6]);
118 if (0x1 == (attr & 0x1)) // feaIgnoreFailures
119 {
120 fire.IgnoreFailure = Firewall.YesNoType.yes;
121 }
122 }
123
124 if (!row.IsColumnEmpty(7))
125 {
126 switch (Convert.ToInt32(row[7]))
127 {
128 case FirewallConstants.NET_FW_PROFILE2_DOMAIN:
129 fire.Profile = Firewall.FirewallException.ProfileType.domain;
130 break;
131 case FirewallConstants.NET_FW_PROFILE2_PRIVATE:
132 fire.Profile = Firewall.FirewallException.ProfileType.@private;
133 break;
134 case FirewallConstants.NET_FW_PROFILE2_PUBLIC:
135 fire.Profile = Firewall.FirewallException.ProfileType.@public;
136 break;
137 case FirewallConstants.NET_FW_PROFILE2_ALL:
138 fire.Profile = Firewall.FirewallException.ProfileType.all;
139 break;
140 }
141 }
142
143 // Description column is new in v3.6
144 if (9 < row.Fields.Length && !row.IsColumnEmpty(9))
145 {
146 fire.Description = (string)row[9];
147 }
148
149 if (!row.IsColumnEmpty(10))
150 {
151 switch (Convert.ToInt32(row[10]))
152 {
153 case FirewallConstants.NET_FW_RULE_DIR_IN:
154 fire.Direction = Firewall.FirewallException.DirectionType.@in;
155 break;
156 case FirewallConstants.NET_FW_RULE_DIR_OUT:
157 fire.Direction = Firewall.FirewallException.DirectionType.@out;
158 break;
159 }
160 }
161
162 Wix.Component component = (Wix.Component)this.Core.GetIndexedElement("Component", (string)row[8]);
163 if (null != component)
164 {
165 component.AddChild(fire);
166 }
167 else
168 {
169 this.Core.OnMessage(WixWarnings.ExpectedForeignRow(row.SourceLineNumbers, table.Name, row.GetPrimaryKey(DecompilerConstants.PrimaryKeyDelimiter), "Component_", (string)row[6], "Component"));
170 }
171 }
172 }
173
174 private static void AddRemoteAddress(Firewall.FirewallException fire, string address)
175 {
176 Firewall.RemoteAddress remote = new Firewall.RemoteAddress();
177 remote.Content = address;
178 fire.AddChild(remote);
179 }
180 }
181#endif
182}
diff --git a/src/ext/Firewall/wixext/FirewallErrors.cs b/src/ext/Firewall/wixext/FirewallErrors.cs
new file mode 100644
index 00000000..b2dac782
--- /dev/null
+++ b/src/ext/Firewall/wixext/FirewallErrors.cs
@@ -0,0 +1,36 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Firewall
4{
5 using System.Resources;
6 using WixToolset.Data;
7
8 public static class FirewallErrors
9 {
10 public static Message IllegalRemoteAddressWithScopeAttribute(SourceLineNumber sourceLineNumbers)
11 {
12 return Message(sourceLineNumbers, Ids.IllegalRemoteAddressWithScopeAttribute, "The RemoteAddress element cannot be specified because its parent FirewallException already specified the Scope attribute. To use RemoteAddress elements, omit the Scope attribute.");
13 }
14
15 public static Message NoExceptionSpecified(SourceLineNumber sourceLineNumbers)
16 {
17 return Message(sourceLineNumbers, Ids.NoExceptionSpecified, "The FirewallException element doesn't identify the target of the firewall exception. To create an application exception, nest the FirewallException element under a File element or provide a value for the File or Program attributes. To create a port exception, provide a value for the Port attribute.");
18 }
19
20 private static Message Message(SourceLineNumber sourceLineNumber, Ids id, string format, params object[] args)
21 {
22 return new Message(sourceLineNumber, MessageLevel.Error, (int)id, format, args);
23 }
24
25 private static Message Message(SourceLineNumber sourceLineNumber, Ids id, ResourceManager resourceManager, string resourceName, params object[] args)
26 {
27 return new Message(sourceLineNumber, MessageLevel.Error, (int)id, resourceManager, resourceName, args);
28 }
29
30 public enum Ids
31 {
32 IllegalRemoteAddressWithScopeAttribute = 6401,
33 NoExceptionSpecified = 6403,
34 }
35 }
36}
diff --git a/src/ext/Firewall/wixext/FirewallExtensionData.cs b/src/ext/Firewall/wixext/FirewallExtensionData.cs
new file mode 100644
index 00000000..7481d993
--- /dev/null
+++ b/src/ext/Firewall/wixext/FirewallExtensionData.cs
@@ -0,0 +1,23 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Firewall
4{
5 using WixToolset.Data;
6 using WixToolset.Extensibility;
7
8 public sealed class FirewallExtensionData : BaseExtensionData
9 {
10 public override string DefaultCulture => "en-US";
11
12 public override bool TryGetSymbolDefinitionByName(string name, out IntermediateSymbolDefinition symbolDefinition)
13 {
14 symbolDefinition = FirewallSymbolDefinitions.ByName(name);
15 return symbolDefinition != null;
16 }
17
18 public override Intermediate GetLibrary(ISymbolDefinitionCreator symbolDefinitions)
19 {
20 return Intermediate.Load(typeof(FirewallExtensionData).Assembly, "WixToolset.Firewall.firewall.wixlib", symbolDefinitions);
21 }
22 }
23}
diff --git a/src/ext/Firewall/wixext/FirewallExtensionFactory.cs b/src/ext/Firewall/wixext/FirewallExtensionFactory.cs
new file mode 100644
index 00000000..279b322a
--- /dev/null
+++ b/src/ext/Firewall/wixext/FirewallExtensionFactory.cs
@@ -0,0 +1,18 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Firewall
4{
5 using System;
6 using System.Collections.Generic;
7 using WixToolset.Extensibility;
8
9 public class FirewallExtensionFactory : BaseExtensionFactory
10 {
11 protected override IReadOnlyCollection<Type> ExtensionTypes => new[]
12 {
13 typeof(FirewallCompiler),
14 typeof(FirewallExtensionData),
15 typeof(FirewallWindowsInstallerBackendBinderExtension),
16 };
17 }
18}
diff --git a/src/ext/Firewall/wixext/FirewallTableDefinitions.cs b/src/ext/Firewall/wixext/FirewallTableDefinitions.cs
new file mode 100644
index 00000000..04918f5f
--- /dev/null
+++ b/src/ext/Firewall/wixext/FirewallTableDefinitions.cs
@@ -0,0 +1,34 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Firewall
4{
5 using WixToolset.Data.WindowsInstaller;
6
7 public static class FirewallTableDefinitions
8 {
9 public static readonly TableDefinition WixFirewallException = new TableDefinition(
10 "Wix4FirewallException",
11 FirewallSymbolDefinitions.WixFirewallException,
12 new[]
13 {
14 new ColumnDefinition("Wix4FirewallException", ColumnType.String, 72, primaryKey: true, nullable: false, ColumnCategory.Identifier, description: "The primary key, a non-localized token.", modularizeType: ColumnModularizeType.Column),
15 new ColumnDefinition("Name", ColumnType.Localized, 255, primaryKey: false, nullable: true, ColumnCategory.Formatted, description: "Localizable display name.", modularizeType: ColumnModularizeType.Property),
16 new ColumnDefinition("RemoteAddresses", ColumnType.String, 0, primaryKey: false, nullable: false, ColumnCategory.Formatted, description: "Remote address to accept incoming connections from.", modularizeType: ColumnModularizeType.Property),
17 new ColumnDefinition("Port", ColumnType.String, 0, primaryKey: false, nullable: true, ColumnCategory.Formatted, minValue: 1, description: "Port number.", modularizeType: ColumnModularizeType.Property),
18 new ColumnDefinition("Protocol", ColumnType.Number, 1, primaryKey: false, nullable: true, ColumnCategory.Integer, minValue: 6, maxValue: 17, description: "Protocol (6=TCP; 17=UDP)."),
19 new ColumnDefinition("Program", ColumnType.String, 255, primaryKey: false, nullable: true, ColumnCategory.Formatted, description: "Exception for a program (formatted path name).", modularizeType: ColumnModularizeType.Property),
20 new ColumnDefinition("Attributes", ColumnType.Number, 4, primaryKey: false, nullable: true, ColumnCategory.Unknown, description: "Vital=1"),
21 new ColumnDefinition("Profile", ColumnType.Number, 4, primaryKey: false, nullable: false, ColumnCategory.Integer, minValue: 1, maxValue: 2147483647, description: "Profile (1=domain; 2=private; 4=public; 2147483647=all)."),
22 new ColumnDefinition("Component_", ColumnType.String, 72, primaryKey: false, nullable: false, ColumnCategory.Identifier, keyTable: "Component", keyColumn: 1, description: "Foreign key into the Component table referencing component that controls the firewall configuration.", modularizeType: ColumnModularizeType.Column),
23 new ColumnDefinition("Description", ColumnType.String, 255, primaryKey: false, nullable: true, ColumnCategory.Formatted, description: "Description displayed in Windows Firewall manager for this firewall rule."),
24 new ColumnDefinition("Direction", ColumnType.Number, 1, primaryKey: false, nullable: true, ColumnCategory.Integer, minValue: 1, maxValue: 2, description: "Direction (1=in; 2=out)"),
25 },
26 symbolIdIsPrimaryKey: true
27 );
28
29 public static readonly TableDefinition[] All = new[]
30 {
31 WixFirewallException,
32 };
33 }
34}
diff --git a/src/ext/Firewall/wixext/FirewallWindowsInstallerBackendExtension.cs b/src/ext/Firewall/wixext/FirewallWindowsInstallerBackendExtension.cs
new file mode 100644
index 00000000..b5b97d85
--- /dev/null
+++ b/src/ext/Firewall/wixext/FirewallWindowsInstallerBackendExtension.cs
@@ -0,0 +1,13 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Firewall
4{
5 using System.Collections.Generic;
6 using WixToolset.Data.WindowsInstaller;
7 using WixToolset.Extensibility;
8
9 public class FirewallWindowsInstallerBackendBinderExtension : BaseWindowsInstallerBackendBinderExtension
10 {
11 public override IReadOnlyCollection<TableDefinition> TableDefinitions => FirewallTableDefinitions.All;
12 }
13}
diff --git a/src/ext/Firewall/wixext/Symbols/FirewallSymbolDefinitions.cs b/src/ext/Firewall/wixext/Symbols/FirewallSymbolDefinitions.cs
new file mode 100644
index 00000000..887893c7
--- /dev/null
+++ b/src/ext/Firewall/wixext/Symbols/FirewallSymbolDefinitions.cs
@@ -0,0 +1,39 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Firewall
4{
5 using System;
6 using WixToolset.Data;
7
8 public enum FirewallSymbolDefinitionType
9 {
10 WixFirewallException,
11 }
12
13 public static partial class FirewallSymbolDefinitions
14 {
15 public static readonly Version Version = new Version("4.0.0");
16
17 public static IntermediateSymbolDefinition ByName(string name)
18 {
19 if (!Enum.TryParse(name, out FirewallSymbolDefinitionType type))
20 {
21 return null;
22 }
23
24 return ByType(type);
25 }
26
27 public static IntermediateSymbolDefinition ByType(FirewallSymbolDefinitionType type)
28 {
29 switch (type)
30 {
31 case FirewallSymbolDefinitionType.WixFirewallException:
32 return FirewallSymbolDefinitions.WixFirewallException;
33
34 default:
35 throw new ArgumentOutOfRangeException(nameof(type));
36 }
37 }
38 }
39}
diff --git a/src/ext/Firewall/wixext/Symbols/WixFirewallExceptionSymbol.cs b/src/ext/Firewall/wixext/Symbols/WixFirewallExceptionSymbol.cs
new file mode 100644
index 00000000..620de969
--- /dev/null
+++ b/src/ext/Firewall/wixext/Symbols/WixFirewallExceptionSymbol.cs
@@ -0,0 +1,119 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Firewall
4{
5 using WixToolset.Data;
6 using WixToolset.Firewall.Symbols;
7
8 public static partial class FirewallSymbolDefinitions
9 {
10 public static readonly IntermediateSymbolDefinition WixFirewallException = new IntermediateSymbolDefinition(
11 FirewallSymbolDefinitionType.WixFirewallException.ToString(),
12 new[]
13 {
14 new IntermediateFieldDefinition(nameof(WixFirewallExceptionSymbolFields.Name), IntermediateFieldType.String),
15 new IntermediateFieldDefinition(nameof(WixFirewallExceptionSymbolFields.RemoteAddresses), IntermediateFieldType.String),
16 new IntermediateFieldDefinition(nameof(WixFirewallExceptionSymbolFields.Port), IntermediateFieldType.String),
17 new IntermediateFieldDefinition(nameof(WixFirewallExceptionSymbolFields.Protocol), IntermediateFieldType.Number),
18 new IntermediateFieldDefinition(nameof(WixFirewallExceptionSymbolFields.Program), IntermediateFieldType.String),
19 new IntermediateFieldDefinition(nameof(WixFirewallExceptionSymbolFields.Attributes), IntermediateFieldType.Number),
20 new IntermediateFieldDefinition(nameof(WixFirewallExceptionSymbolFields.Profile), IntermediateFieldType.Number),
21 new IntermediateFieldDefinition(nameof(WixFirewallExceptionSymbolFields.ComponentRef), IntermediateFieldType.String),
22 new IntermediateFieldDefinition(nameof(WixFirewallExceptionSymbolFields.Description), IntermediateFieldType.String),
23 new IntermediateFieldDefinition(nameof(WixFirewallExceptionSymbolFields.Direction), IntermediateFieldType.Number),
24 },
25 typeof(WixFirewallExceptionSymbol));
26 }
27}
28
29namespace WixToolset.Firewall.Symbols
30{
31 using WixToolset.Data;
32
33 public enum WixFirewallExceptionSymbolFields
34 {
35 Name,
36 RemoteAddresses,
37 Port,
38 Protocol,
39 Program,
40 Attributes,
41 Profile,
42 ComponentRef,
43 Description,
44 Direction,
45 }
46
47 public class WixFirewallExceptionSymbol : IntermediateSymbol
48 {
49 public WixFirewallExceptionSymbol() : base(FirewallSymbolDefinitions.WixFirewallException, null, null)
50 {
51 }
52
53 public WixFirewallExceptionSymbol(SourceLineNumber sourceLineNumber, Identifier id = null) : base(FirewallSymbolDefinitions.WixFirewallException, sourceLineNumber, id)
54 {
55 }
56
57 public IntermediateField this[WixFirewallExceptionSymbolFields index] => this.Fields[(int)index];
58
59 public string Name
60 {
61 get => this.Fields[(int)WixFirewallExceptionSymbolFields.Name].AsString();
62 set => this.Set((int)WixFirewallExceptionSymbolFields.Name, value);
63 }
64
65 public string RemoteAddresses
66 {
67 get => this.Fields[(int)WixFirewallExceptionSymbolFields.RemoteAddresses].AsString();
68 set => this.Set((int)WixFirewallExceptionSymbolFields.RemoteAddresses, value);
69 }
70
71 public string Port
72 {
73 get => this.Fields[(int)WixFirewallExceptionSymbolFields.Port].AsString();
74 set => this.Set((int)WixFirewallExceptionSymbolFields.Port, value);
75 }
76
77 public int? Protocol
78 {
79 get => this.Fields[(int)WixFirewallExceptionSymbolFields.Protocol].AsNullableNumber();
80 set => this.Set((int)WixFirewallExceptionSymbolFields.Protocol, value);
81 }
82
83 public string Program
84 {
85 get => this.Fields[(int)WixFirewallExceptionSymbolFields.Program].AsString();
86 set => this.Set((int)WixFirewallExceptionSymbolFields.Program, value);
87 }
88
89 public int Attributes
90 {
91 get => this.Fields[(int)WixFirewallExceptionSymbolFields.Attributes].AsNumber();
92 set => this.Set((int)WixFirewallExceptionSymbolFields.Attributes, value);
93 }
94
95 public int Profile
96 {
97 get => this.Fields[(int)WixFirewallExceptionSymbolFields.Profile].AsNumber();
98 set => this.Set((int)WixFirewallExceptionSymbolFields.Profile, value);
99 }
100
101 public string ComponentRef
102 {
103 get => this.Fields[(int)WixFirewallExceptionSymbolFields.ComponentRef].AsString();
104 set => this.Set((int)WixFirewallExceptionSymbolFields.ComponentRef, value);
105 }
106
107 public string Description
108 {
109 get => this.Fields[(int)WixFirewallExceptionSymbolFields.Description].AsString();
110 set => this.Set((int)WixFirewallExceptionSymbolFields.Description, value);
111 }
112
113 public int Direction
114 {
115 get => this.Fields[(int)WixFirewallExceptionSymbolFields.Direction].AsNumber();
116 set => this.Set((int)WixFirewallExceptionSymbolFields.Direction, value);
117 }
118 }
119} \ No newline at end of file
diff --git a/src/ext/Firewall/wixext/WixToolset.Firewall.wixext.csproj b/src/ext/Firewall/wixext/WixToolset.Firewall.wixext.csproj
new file mode 100644
index 00000000..6704dad2
--- /dev/null
+++ b/src/ext/Firewall/wixext/WixToolset.Firewall.wixext.csproj
@@ -0,0 +1,31 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3
4<Project Sdk="Microsoft.NET.Sdk">
5 <PropertyGroup>
6 <TargetFramework>netstandard2.0</TargetFramework>
7 <RootNamespace>WixToolset.Firewall</RootNamespace>
8 <Description>WiX Toolset Firewallity Extension</Description>
9 <Title>WiX Toolset Firewall Extension</Title>
10 <IsTool>true</IsTool>
11 <ContentTargetFolders>build</ContentTargetFolders>
12 </PropertyGroup>
13
14 <ItemGroup>
15 <Content Include="$(MSBuildThisFileName).targets" />
16 <EmbeddedResource Include="$(OutputPath)..\firewall.wixlib" />
17 </ItemGroup>
18
19 <ItemGroup>
20 <PackageReference Include="WixToolset.Data" Version="4.0.*" PrivateAssets="all" />
21 <PackageReference Include="WixToolset.Extensibility" Version="4.0.*" PrivateAssets="all" />
22 </ItemGroup>
23
24 <ItemGroup>
25 <ProjectReference Include="..\wixlib\firewall.wixproj" ReferenceOutputAssembly="false" Condition=" '$(NCrunch)'=='' " />
26 </ItemGroup>
27
28 <ItemGroup>
29 <PackageReference Include="Nerdbank.GitVersioning" Version="3.3.37" PrivateAssets="all" />
30 </ItemGroup>
31</Project>
diff --git a/src/ext/Firewall/wixext/WixToolset.Firewall.wixext.targets b/src/ext/Firewall/wixext/WixToolset.Firewall.wixext.targets
new file mode 100644
index 00000000..c717450f
--- /dev/null
+++ b/src/ext/Firewall/wixext/WixToolset.Firewall.wixext.targets
@@ -0,0 +1,11 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3
4<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0">
5 <PropertyGroup>
6 <WixToolsetFirewallWixextPath Condition=" '$(WixToolsetFirewallWixextPath)' == '' ">$(MSBuildThisFileDirectory)..\tools\WixToolset.Firewall.wixext.dll</WixToolsetFirewallWixextPath>
7 </PropertyGroup>
8 <ItemGroup>
9 <WixExtension Include="$(WixToolsetFirewallWixextPath)" />
10 </ItemGroup>
11</Project>
diff --git a/src/ext/Firewall/wixlib/FirewallExtension.wxs b/src/ext/Firewall/wixlib/FirewallExtension.wxs
new file mode 100644
index 00000000..56ad693e
--- /dev/null
+++ b/src/ext/Firewall/wixlib/FirewallExtension.wxs
@@ -0,0 +1,11 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2
3
4<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
5 <?include caerr.wxi ?>
6 <Fragment>
7 <UI Id="WixFirewallErrors">
8 <Error Id="$(var.msierrFirewallCannotConnect)" Message="!(loc.msierrFirewallCannotConnect)" />
9 </UI>
10 </Fragment>
11</Wix>
diff --git a/src/ext/Firewall/wixlib/FirewallExtension_Platform.wxi b/src/ext/Firewall/wixlib/FirewallExtension_Platform.wxi
new file mode 100644
index 00000000..3861bd5d
--- /dev/null
+++ b/src/ext/Firewall/wixlib/FirewallExtension_Platform.wxi
@@ -0,0 +1,36 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2
3<Include xmlns="http://wixtoolset.org/schemas/v4/wxs">
4 <?include caDecor.wxi ?>
5 <Fragment>
6 <UIRef Id="WixFirewallErrors" />
7 <UI>
8 <ProgressText Action="$(var.Prefix)SchedFirewallExceptionsInstall$(var.Suffix)" Message="!(loc.WixSchedFirewallExceptionsInstall)" />
9 <ProgressText Action="$(var.Prefix)SchedFirewallExceptionsUninstall$(var.Suffix)" Message="!(loc.WixSchedFirewallExceptionsUninstall)" />
10 <ProgressText Action="$(var.Prefix)RollbackFirewallExceptionsInstall$(var.Suffix)" Message="!(loc.WixRollbackFirewallExceptionsInstall)" />
11 <ProgressText Action="$(var.Prefix)ExecFirewallExceptionsInstall$(var.Suffix)" Message="!(loc.WixExecFirewallExceptionsInstall)" />
12 <ProgressText Action="$(var.Prefix)RollbackFirewallExceptionsUninstall$(var.Suffix)" Message="!(loc.WixRollbackFirewallExceptionsUninstall)" />
13 <ProgressText Action="$(var.Prefix)ExecFirewallExceptionsUninstall$(var.Suffix)" Message="!(loc.WixExecFirewallExceptionsUninstall)" />
14 </UI>
15
16 <CustomAction Id="$(var.Prefix)SchedFirewallExceptionsInstall$(var.Suffix)" DllEntry="SchedFirewallExceptionsInstall" Execute="immediate" Return="check" SuppressModularization="yes" BinaryRef="$(var.Prefix)FWCA$(var.Suffix)" />
17 <CustomAction Id="$(var.Prefix)SchedFirewallExceptionsUninstall$(var.Suffix)" DllEntry="SchedFirewallExceptionsUninstall" Execute="immediate" Return="check" SuppressModularization="yes" BinaryRef="$(var.Prefix)FWCA$(var.Suffix)" />
18 <CustomAction Id="$(var.Prefix)RollbackFirewallExceptionsInstall$(var.Suffix)" DllEntry="ExecFirewallExceptions" Execute="rollback" Impersonate="no" Return="check" SuppressModularization="yes" BinaryRef="$(var.Prefix)FWCA$(var.Suffix)" />
19 <CustomAction Id="$(var.Prefix)ExecFirewallExceptionsInstall$(var.Suffix)" DllEntry="ExecFirewallExceptions" Execute="deferred" Impersonate="no" Return="check" SuppressModularization="yes" BinaryRef="$(var.Prefix)FWCA$(var.Suffix)" />
20 <CustomAction Id="$(var.Prefix)RollbackFirewallExceptionsUninstall$(var.Suffix)" DllEntry="ExecFirewallExceptions" Execute="rollback" Impersonate="no" Return="check" SuppressModularization="yes" BinaryRef="$(var.Prefix)FWCA$(var.Suffix)" />
21 <CustomAction Id="$(var.Prefix)ExecFirewallExceptionsUninstall$(var.Suffix)" DllEntry="ExecFirewallExceptions" Execute="deferred" Impersonate="no" Return="check" SuppressModularization="yes" BinaryRef="$(var.Prefix)FWCA$(var.Suffix)" />
22
23 <!--
24 We need the firewall on Windows XP SP2 or later.
25 -->
26 <InstallExecuteSequence>
27 <Custom Action="$(var.Prefix)SchedFirewallExceptionsUninstall$(var.Suffix)" Before="RemoveFiles" Overridable="yes" Condition="VersionNT &gt;= 600 OR (VersionNT &gt;= 501 AND ((MsiNTProductType = 1 AND ServicePackLevel &gt;= 2) OR (MsiNTProductType &gt; 1 AND ServicePackLevel &gt;= 1)))" />
28 <Custom Action="$(var.Prefix)SchedFirewallExceptionsInstall$(var.Suffix)" After="InstallFiles" Overridable="yes" Condition="VersionNT &gt;= 600 OR (VersionNT &gt;= 501 AND ((MsiNTProductType = 1 AND ServicePackLevel &gt;= 2) OR (MsiNTProductType &gt; 1 AND ServicePackLevel &gt;= 1)))" />
29 </InstallExecuteSequence>
30 </Fragment>
31
32 <!-- Firewall Custom Action DLL Definitions -->
33 <Fragment>
34 <Binary Id="$(var.Prefix)FWCA$(var.Suffix)" SourceFile="!(bindpath.$(var.platform))fwca.dll" />
35 </Fragment>
36</Include>
diff --git a/src/ext/Firewall/wixlib/FirewallExtension_arm64.wxs b/src/ext/Firewall/wixlib/FirewallExtension_arm64.wxs
new file mode 100644
index 00000000..63cdd1e8
--- /dev/null
+++ b/src/ext/Firewall/wixlib/FirewallExtension_arm64.wxs
@@ -0,0 +1,7 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2
3
4<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
5 <?define platform=arm64 ?>
6 <?include FirewallExtension_Platform.wxi ?>
7</Wix>
diff --git a/src/ext/Firewall/wixlib/FirewallExtension_x64.wxs b/src/ext/Firewall/wixlib/FirewallExtension_x64.wxs
new file mode 100644
index 00000000..842aedf1
--- /dev/null
+++ b/src/ext/Firewall/wixlib/FirewallExtension_x64.wxs
@@ -0,0 +1,7 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2
3
4<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
5 <?define platform=x64 ?>
6 <?include FirewallExtension_Platform.wxi ?>
7</Wix>
diff --git a/src/ext/Firewall/wixlib/FirewallExtension_x86.wxs b/src/ext/Firewall/wixlib/FirewallExtension_x86.wxs
new file mode 100644
index 00000000..5867f791
--- /dev/null
+++ b/src/ext/Firewall/wixlib/FirewallExtension_x86.wxs
@@ -0,0 +1,7 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2
3
4<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
5 <?define platform=x86 ?>
6 <?include FirewallExtension_Platform.wxi ?>
7</Wix>
diff --git a/src/ext/Firewall/wixlib/caDecor.wxi b/src/ext/Firewall/wixlib/caDecor.wxi
new file mode 100644
index 00000000..b1711518
--- /dev/null
+++ b/src/ext/Firewall/wixlib/caDecor.wxi
@@ -0,0 +1,39 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2
3
4<Include xmlns="http://wixtoolset.org/schemas/v4/wxs">
5 <?ifdef Prefix ?>
6 <?undef Prefix ?>
7 <?endif?>
8
9 <?define Prefix="Wix4" ?>
10
11 <?ifndef platform ?>
12 <?define platform="x86" ?>
13 <?endif?>
14
15 <?if $(var.platform)="" ?>
16 <?undef platform ?>
17 <?define platform="x86" ?>
18 <?endif?>
19
20 <?ifdef Suffix ?>
21 <?undef Suffix ?>
22 <?endif?>
23
24 <?if $(var.platform)~="x86" ?>
25 <?define Suffix="_X86" ?>
26 <?endif?>
27
28 <?if $(var.platform)~="x64" ?>
29 <?define Suffix="_X64" ?>
30 <?endif?>
31
32 <?if $(var.platform)~="arm" ?>
33 <?define Suffix="_A32" ?>
34 <?endif?>
35
36 <?if $(var.platform)~="arm64" ?>
37 <?define Suffix="_A64" ?>
38 <?endif?>
39</Include>
diff --git a/src/ext/Firewall/wixlib/caerr.wxi b/src/ext/Firewall/wixlib/caerr.wxi
new file mode 100644
index 00000000..ff7ec121
--- /dev/null
+++ b/src/ext/Firewall/wixlib/caerr.wxi
@@ -0,0 +1,96 @@
1<Include xmlns="http://wixtoolset.org/schemas/v4/wxs">
2 <?define msierrSecureObjectsFailedCreateSD = 25520?>
3 <?define msierrSecureObjectsFailedSet = 25521?>
4 <?define msierrSecureObjectsUnknownType = 25522?>
5 <?define msierrXmlFileFailedRead = 25530?>
6 <?define msierrXmlFileFailedOpen = 25531?>
7 <?define msierrXmlFileFailedSelect = 25532?>
8 <?define msierrXmlFileFailedSave = 25533?>
9 <?define msierrXmlConfigFailedRead = 25540?>
10 <?define msierrXmlConfigFailedOpen = 25541?>
11 <?define msierrXmlConfigFailedSelect = 25542?>
12 <?define msierrXmlConfigFailedSave = 25543?>
13 <?define msierrFirewallCannotConnect = 25580?>
14 <?define msierrIISCannotConnect = 26001?>
15 <?define msierrIISFailedReadWebSite = 26002?>
16 <?define msierrIISFailedReadWebDirs = 26003?>
17 <?define msierrIISFailedReadVDirs = 26004?>
18 <?define msierrIISFailedReadFilters = 26005?>
19 <?define msierrIISFailedReadAppPool = 26006?>
20 <?define msierrIISFailedReadMimeMap = 26007?>
21 <?define msierrIISFailedReadProp = 26008?>
22 <?define msierrIISFailedReadWebSvcExt = 26009?>
23 <?define msierrIISFailedReadWebError = 26010?>
24 <?define msierrIISFailedReadHttpHeader = 26011?>
25 <?define msierrIISFailedSchedTransaction = 26031?>
26 <?define msierrIISFailedSchedInstallWebs = 26032?>
27 <?define msierrIISFailedSchedInstallWebDirs = 26033?>
28 <?define msierrIISFailedSchedInstallVDirs = 26034?>
29 <?define msierrIISFailedSchedInstallFilters = 26035?>
30 <?define msierrIISFailedSchedInstallAppPool = 26036?>
31 <?define msierrIISFailedSchedInstallProp = 26037?>
32 <?define msierrIISFailedSchedInstallWebSvcExt = 26038?>
33 <?define msierrIISFailedSchedUninstallWebs = 26051?>
34 <?define msierrIISFailedSchedUninstallWebDirs = 26052?>
35 <?define msierrIISFailedSchedUninstallVDirs = 26053?>
36 <?define msierrIISFailedSchedUninstallFilters = 26054?>
37 <?define msierrIISFailedSchedUninstallAppPool = 26055?>
38 <?define msierrIISFailedSchedUninstallProp = 26056?>
39 <?define msierrIISFailedSchedUninstallWebSvcExt = 26057?>
40 <?define msierrIISFailedStartTransaction = 26101?>
41 <?define msierrIISFailedOpenKey = 26102?>
42 <?define msierrIISFailedCreateKey = 26103?>
43 <?define msierrIISFailedWriteData = 26104?>
44 <?define msierrIISFailedCreateApp = 26105?>
45 <?define msierrIISFailedDeleteKey = 26106?>
46 <?define msierrIISFailedDeleteApp = 26107?>
47 <?define msierrIISFailedDeleteValue = 26108?>
48 <?define msierrIISFailedCommitInUse = 26109?>
49 <?define msierrSQLFailedCreateDatabase = 26201?>
50 <?define msierrSQLFailedDropDatabase = 26202?>
51 <?define msierrSQLFailedConnectDatabase = 26203?>
52 <?define msierrSQLFailedExecString = 26204?>
53 <?define msierrSQLDatabaseAlreadyExists = 26205?>
54 <?define msierrPERFMONFailedRegisterDLL = 26251?>
55 <?define msierrPERFMONFailedUnregisterDLL = 26252?>
56 <?define msierrInstallPerfCounterData = 26253?>
57 <?define msierrUninstallPerfCounterData = 26254?>
58 <?define msierrSMBFailedCreate = 26301?>
59 <?define msierrSMBFailedDrop = 26302?>
60 <?define msierrCERTFailedOpen = 26351?>
61 <?define msierrCERTFailedAdd = 26352?>
62 <?define msierrUSRFailedUserCreate = 26401?>
63 <?define msierrUSRFailedUserCreatePswd = 26402?>
64 <?define msierrUSRFailedUserGroupAdd = 26403?>
65 <?define msierrUSRFailedUserCreateExists = 26404?>
66 <?define msierrUSRFailedGrantLogonAsService = 26405?>
67 <?define msierrDependencyMissingDependencies = 26451?>
68 <?define msierrDependencyHasDependents = 26452?>
69 <?define msierrDotNetRuntimeRequired = 27000?>
70 <?define msierrComPlusCannotConnect = 28001?>
71 <?define msierrComPlusPartitionReadFailed = 28002?>
72 <?define msierrComPlusPartitionRoleReadFailed = 28003?>
73 <?define msierrComPlusUserInPartitionRoleReadFailed = 28004?>
74 <?define msierrComPlusPartitionUserReadFailed = 28005?>
75 <?define msierrComPlusApplicationReadFailed = 28006?>
76 <?define msierrComPlusApplicationRoleReadFailed = 28007?>
77 <?define msierrComPlusUserInApplicationRoleReadFailed = 28008?>
78 <?define msierrComPlusAssembliesReadFailed = 28009?>
79 <?define msierrComPlusSubscriptionReadFailed = 28010?>
80 <?define msierrComPlusPartitionDependency = 28011?>
81 <?define msierrComPlusPartitionNotFound = 28012?>
82 <?define msierrComPlusPartitionIdConflict = 28013?>
83 <?define msierrComPlusPartitionNameConflict = 28014?>
84 <?define msierrComPlusApplicationDependency = 28015?>
85 <?define msierrComPlusApplicationNotFound = 28016?>
86 <?define msierrComPlusApplicationIdConflict = 28017?>
87 <?define msierrComPlusApplicationNameConflict = 28018?>
88 <?define msierrComPlusApplicationRoleDependency = 28019?>
89 <?define msierrComPlusApplicationRoleNotFound = 28020?>
90 <?define msierrComPlusApplicationRoleConflict = 28021?>
91 <?define msierrComPlusAssemblyDependency = 28022?>
92 <?define msierrComPlusSubscriptionIdConflict = 28023?>
93 <?define msierrComPlusSubscriptionNameConflict = 28024?>
94 <?define msierrComPlusFailedLookupNames = 28025?>
95 <?define msierrMsmqCannotConnect = 28101?>
96</Include> \ No newline at end of file
diff --git a/src/ext/Firewall/wixlib/en-us.wxl b/src/ext/Firewall/wixlib/en-us.wxl
new file mode 100644
index 00000000..ab9ce8a0
--- /dev/null
+++ b/src/ext/Firewall/wixlib/en-us.wxl
@@ -0,0 +1,13 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2
3
4<WixLocalization Culture="en-us" xmlns="http://wixtoolset.org/schemas/v4/wxl">
5 <String Id="msierrFirewallCannotConnect" Overridable="yes">Cannot connect to Windows Firewall. ([2] [3] [4] [5])</String>
6
7 <String Id="WixSchedFirewallExceptionsInstall" Overridable="yes">Configuring Windows Firewall</String>
8 <String Id="WixSchedFirewallExceptionsUninstall" Overridable="yes">Configuring Windows Firewall</String>
9 <String Id="WixRollbackFirewallExceptionsInstall" Overridable="yes">Rolling back Windows Firewall configuration</String>
10 <String Id="WixExecFirewallExceptionsInstall" Overridable="yes">Installing Windows Firewall configuration</String>
11 <String Id="WixRollbackFirewallExceptionsUninstall" Overridable="yes">Rolling back Windows Firewall configuration</String>
12 <String Id="WixExecFirewallExceptionsUninstall" Overridable="yes">Uninstalling Windows Firewall configuration</String>
13</WixLocalization>
diff --git a/src/ext/Firewall/wixlib/es-es.wxl b/src/ext/Firewall/wixlib/es-es.wxl
new file mode 100644
index 00000000..0631b3a3
--- /dev/null
+++ b/src/ext/Firewall/wixlib/es-es.wxl
@@ -0,0 +1,12 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2
3<WixLocalization Culture="es-es" xmlns="http://wixtoolset.org/schemas/v4/wxl">
4 <String Id="msierrFirewallCannotConnect" Overridable="yes">No se puede conectar al Firewall de Windows. ([2] [3] [4] [5])</String>
5
6 <String Id="WixSchedFirewallExceptionsInstall" Overridable="yes">Configurando el Firewall de Windows</String>
7 <String Id="WixSchedFirewallExceptionsUninstall" Overridable="yes">Configurando el Firewall de Windows</String>
8 <String Id="WixRollbackFirewallExceptionsInstall" Overridable="yes">Regresando la configuración del Firewall de Windows</String>
9 <String Id="WixExecFirewallExceptionsInstall" Overridable="yes">Instalando la configuración del Firewall de Windows</String>
10 <String Id="WixRollbackFirewallExceptionsUninstall" Overridable="yes">Regresando la configuración del Firewall de Windows</String>
11 <String Id="WixExecFirewallExceptionsUninstall" Overridable="yes">Desinstalando la configuración del Firewall de Windows</String>
12</WixLocalization>
diff --git a/src/ext/Firewall/wixlib/firewall.v3.ncrunchproject b/src/ext/Firewall/wixlib/firewall.v3.ncrunchproject
new file mode 100644
index 00000000..319cd523
--- /dev/null
+++ b/src/ext/Firewall/wixlib/firewall.v3.ncrunchproject
@@ -0,0 +1,5 @@
1<ProjectConfiguration>
2 <Settings>
3 <IgnoreThisComponentCompletely>True</IgnoreThisComponentCompletely>
4 </Settings>
5</ProjectConfiguration> \ No newline at end of file
diff --git a/src/ext/Firewall/wixlib/firewall.wixproj b/src/ext/Firewall/wixlib/firewall.wixproj
new file mode 100644
index 00000000..242fa56e
--- /dev/null
+++ b/src/ext/Firewall/wixlib/firewall.wixproj
@@ -0,0 +1,26 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2<Project Sdk="WixToolset.Sdk">
3
4 <PropertyGroup>
5 <OutputType>Library</OutputType>
6 <BindFiles>true</BindFiles>
7 <Cultures>en-us</Cultures>
8 </PropertyGroup>
9
10 <ItemGroup>
11 <BindInputPaths Include="$(OutputPath)x86" BindName='x86' />
12 <BindInputPaths Include="$(OutputPath)x64" BindName='x64' />
13 <BindInputPaths Include="$(OutputPath)arm64" BindName='arm64' />
14 </ItemGroup>
15
16 <ItemGroup>
17 <ProjectReference Include="..\ca\fwca.vcxproj" Properties="Platform=ARM64" />
18 <ProjectReference Include="..\ca\fwca.vcxproj" Properties="Platform=x86" />
19 <ProjectReference Include="..\ca\fwca.vcxproj" Properties="Platform=x64" />
20 </ItemGroup>
21
22 <ItemGroup>
23 <PackageReference Include="Nerdbank.GitVersioning" Version="3.3.37" PrivateAssets="All" />
24 </ItemGroup>
25
26</Project>
diff --git a/src/ext/Firewall/wixlib/ja-jp.wxl b/src/ext/Firewall/wixlib/ja-jp.wxl
new file mode 100644
index 00000000..a4036c7e
--- /dev/null
+++ b/src/ext/Firewall/wixlib/ja-jp.wxl
@@ -0,0 +1,13 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2
3
4<WixLocalization Culture="ja-jp" xmlns="http://wixtoolset.org/schemas/v4/wxl">
5 <String Id="msierrFirewallCannotConnect" Overridable="yes">Windows ファイアウォールへ接続できません。 ([2] [3] [4] [5])</String>
6
7 <String Id="WixSchedFirewallExceptionsInstall" Overridable="yes">Windows ファイアウォールを構成しています</String>
8 <String Id="WixSchedFirewallExceptionsUninstall" Overridable="yes">Windows ファイアウォールを構成しています</String>
9 <String Id="WixRollbackFirewallExceptionsInstall" Overridable="yes">Windows ファイアウォール構成をロールバックしています</String>
10 <String Id="WixExecFirewallExceptionsInstall" Overridable="yes">Windows ファイアウォール構成をインストールしています</String>
11 <String Id="WixRollbackFirewallExceptionsUninstall" Overridable="yes">Windows ファイアウォール構成をロールバックしています</String>
12 <String Id="WixExecFirewallExceptionsUninstall" Overridable="yes">Windows ファイアウォール構成をアンインストールしています</String>
13</WixLocalization>
diff --git a/src/ext/Firewall/wixlib/pl-pl.wxl b/src/ext/Firewall/wixlib/pl-pl.wxl
new file mode 100644
index 00000000..1b37460e
--- /dev/null
+++ b/src/ext/Firewall/wixlib/pl-pl.wxl
@@ -0,0 +1,13 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2
3
4<WixLocalization Culture="pl-pl" xmlns="http://wixtoolset.org/schemas/v4/wxl">
5 <String Id="msierrFirewallCannotConnect" Overridable="yes">Nie udało się połączyć z Zaporą systemu Windows. ([2] [3] [4] [5])</String>
6
7 <String Id="WixSchedFirewallExceptionsInstall" Overridable="yes">Dodawanie wyjątków do Zapory systemu Windows</String>
8 <String Id="WixSchedFirewallExceptionsUninstall" Overridable="yes">Usuwanie wyjątków z Zapory systemu Windows</String>
9 <String Id="WixRollbackFirewallExceptionsInstall" Overridable="yes">Cofanie zmian konfiguracji Zapory systemu Windows</String>
10 <String Id="WixExecFirewallExceptionsInstall" Overridable="yes">Konfigurowywanie Zapory systemu Windows</String>
11 <String Id="WixRollbackFirewallExceptionsUninstall" Overridable="yes">Cofanie zmian konfiguracji Zapory systemu Windows</String>
12 <String Id="WixExecFirewallExceptionsUninstall" Overridable="yes">Konfigurowywanie Zapory systemu Windows</String>
13</WixLocalization>
diff --git a/src/ext/Http/CSharp.Build.props b/src/ext/Http/CSharp.Build.props
new file mode 100644
index 00000000..b12f4c6e
--- /dev/null
+++ b/src/ext/Http/CSharp.Build.props
@@ -0,0 +1,11 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2<!--
3 Do NOT modify this file. Update the canonical version in Home\repo-template\src\CSharp.Build.props
4 then update all of the repos.
5-->
6<Project>
7 <PropertyGroup>
8 <SignAssembly>true</SignAssembly>
9 <AssemblyOriginatorKeyFile>$([System.IO.Path]::GetFullPath($(MSBuildThisFileDirectory)wix.snk))</AssemblyOriginatorKeyFile>
10 </PropertyGroup>
11</Project>
diff --git a/src/ext/Http/Cpp.Build.props b/src/ext/Http/Cpp.Build.props
new file mode 100644
index 00000000..9b7a1bb5
--- /dev/null
+++ b/src/ext/Http/Cpp.Build.props
@@ -0,0 +1,86 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3
4<Project>
5 <PropertyGroup>
6 <Platform Condition=" '$(Platform)' == '' OR '$(Platform)' == 'AnyCPU' ">Win32</Platform>
7 <IntDir>$(BaseIntermediateOutputPath)$(Configuration)\$(Platform)\</IntDir>
8 <OutDir>$(OutputPath)$(Platform)\</OutDir>
9 </PropertyGroup>
10
11 <PropertyGroup Condition="'$(WindowsTargetPlatformVersion)'=='' AND '$(VisualStudioVersion)'>='15.0'">
12 <WindowsTargetPlatformVersion>$([Microsoft.Build.Utilities.ToolLocationHelper]::GetLatestSDKTargetPlatformVersion('Windows', '10.0'))</WindowsTargetPlatformVersion>
13 </PropertyGroup>
14
15 <ItemDefinitionGroup>
16 <ClCompile>
17 <DisableSpecificWarnings>$(DisableSpecificCompilerWarnings)</DisableSpecificWarnings>
18 <WarningLevel>Level4</WarningLevel>
19 <AdditionalIncludeDirectories>$(ProjectDir)inc;$(MSBuildProjectDirectory);$(IntDir);$(SqlCESdkIncludePath);$(ProjectAdditionalIncludeDirectories);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
20 <PreprocessorDefinitions>WIN32;_WINDOWS;_WIN32_MSI=500;_WIN32_WINNT=0x0501;$(ArmPreprocessorDefinitions);$(UnicodePreprocessorDefinitions);_CRT_STDIO_LEGACY_WIDE_SPECIFIERS;_WINSOCK_DEPRECATED_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
21 <PrecompiledHeader>Use</PrecompiledHeader>
22 <PrecompiledHeaderFile>precomp.h</PrecompiledHeaderFile>
23 <CallingConvention Condition="'$(Platform)'=='Win32'">StdCall</CallingConvention>
24 <TreatWarningAsError>true</TreatWarningAsError>
25 <ExceptionHandling>false</ExceptionHandling>
26 <AdditionalOptions>-YlprecompDefine</AdditionalOptions>
27 <AdditionalOptions Condition=" $(PlatformToolset.StartsWith('v14')) ">/Zc:threadSafeInit- %(AdditionalOptions)</AdditionalOptions>
28 <MultiProcessorCompilation Condition=" $(NUMBER_OF_PROCESSORS) &gt; 4 ">true</MultiProcessorCompilation>
29 </ClCompile>
30 <ResourceCompile>
31 <PreprocessorDefinitions>$(ArmPreprocessorDefinitions);%(PreprocessorDefinitions)</PreprocessorDefinitions>
32 <AdditionalIncludeDirectories>$(ProjectAdditionalResourceIncludeDirectories);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
33 </ResourceCompile>
34 <Lib>
35 <AdditionalLibraryDirectories>$(OutDir);$(AdditionalMultiTargetLibraryPath);$(ProjectAdditionalLibraryDirectories);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
36 </Lib>
37 <Link>
38 <SubSystem>$(ProjectSubSystem)</SubSystem>
39 <ModuleDefinitionFile>$(ProjectModuleDefinitionFile)</ModuleDefinitionFile>
40 <NoEntryPoint>$(ResourceOnlyDll)</NoEntryPoint>
41 <GenerateDebugInformation>true</GenerateDebugInformation>
42 <AdditionalDependencies>$(ProjectAdditionalLinkLibraries);advapi32.lib;comdlg32.lib;user32.lib;oleaut32.lib;gdi32.lib;shell32.lib;ole32.lib;version.lib;%(AdditionalDependencies)</AdditionalDependencies>
43 <AdditionalLibraryDirectories>$(OutDir);$(AdditionalMultiTargetLibraryPath);$(ArmLibraryDirectories);$(ProjectAdditionalLinkLibraryDirectories);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
44 <AdditionalOptions Condition=" $(PlatformToolset.StartsWith('v14')) ">/IGNORE:4099 %(AdditionalOptions)</AdditionalOptions>
45 </Link>
46 </ItemDefinitionGroup>
47
48 <ItemDefinitionGroup Condition=" '$(Platform)'=='Win32' and '$(PlatformToolset)'!='v100'">
49 <ClCompile>
50 <EnableEnhancedInstructionSet>NoExtensions</EnableEnhancedInstructionSet>
51 </ClCompile>
52 </ItemDefinitionGroup>
53 <ItemDefinitionGroup Condition=" '$(Platform)'=='arm' ">
54 <ClCompile>
55 <CallingConvention>CDecl</CallingConvention>
56 </ClCompile>
57 </ItemDefinitionGroup>
58 <ItemDefinitionGroup Condition=" '$(ConfigurationType)'=='StaticLibrary' ">
59 <ClCompile>
60 <DebugInformationFormat>OldStyle</DebugInformationFormat>
61 <OmitDefaultLibName>true</OmitDefaultLibName>
62 <IgnoreAllDefaultLibraries>true</IgnoreAllDefaultLibraries>
63 </ClCompile>
64 </ItemDefinitionGroup>
65 <ItemDefinitionGroup Condition=" '$(Configuration)'=='Debug' ">
66 <ClCompile>
67 <Optimization>Disabled</Optimization>
68 <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
69 <PreprocessorDefinitions>_DEBUG;DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
70 <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
71 </ClCompile>
72 </ItemDefinitionGroup>
73 <ItemDefinitionGroup Condition=" '$(Configuration)'=='Release' ">
74 <ClCompile>
75 <Optimization>MinSpace</Optimization>
76 <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
77 <FunctionLevelLinking>true</FunctionLevelLinking>
78 <IntrinsicFunctions>true</IntrinsicFunctions>
79 <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
80 </ClCompile>
81 <Link>
82 <EnableCOMDATFolding>true</EnableCOMDATFolding>
83 <OptimizeReferences>true</OptimizeReferences>
84 </Link>
85 </ItemDefinitionGroup>
86</Project>
diff --git a/src/ext/Http/Directory.Build.props b/src/ext/Http/Directory.Build.props
new file mode 100644
index 00000000..f83cc154
--- /dev/null
+++ b/src/ext/Http/Directory.Build.props
@@ -0,0 +1,29 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3<!--
4 Do NOT modify this file. Update the canonical version in Home\repo-template\src\Directory.Build.props
5 then update all of the repos.
6-->
7<Project>
8 <PropertyGroup>
9 <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
10 <EnableSourceLink Condition=" '$(NCrunch)' == '1' ">false</EnableSourceLink>
11 <MSBuildWarningsAsMessages>MSB3246</MSBuildWarningsAsMessages>
12
13 <ProjectName Condition=" '$(ProjectName)' == '' ">$(MSBuildProjectName)</ProjectName>
14 <BaseOutputPath>$([System.IO.Path]::GetFullPath($(MSBuildThisFileDirectory)..\build\))</BaseOutputPath>
15 <BaseIntermediateOutputPath>$(BaseOutputPath)obj\$(ProjectName)\</BaseIntermediateOutputPath>
16 <OutputPath>$(BaseOutputPath)$(Configuration)\</OutputPath>
17
18 <Authors>WiX Toolset Team</Authors>
19 <Company>WiX Toolset</Company>
20 <Copyright>Copyright (c) .NET Foundation and contributors. All rights reserved.</Copyright>
21 <PackageLicenseExpression>MS-RL</PackageLicenseExpression>
22 <Product>WiX Toolset</Product>
23 </PropertyGroup>
24
25 <Import Project="CSharp.Build.props" Condition=" '$(MSBuildProjectExtension)'=='.csproj' and Exists('CSharp.Build.props') " />
26 <Import Project="Cpp.Build.props" Condition=" Exists('Cpp.Build.props') And '$(MSBuildProjectExtension)'=='.vcxproj' " />
27 <Import Project="Wix.Build.props" Condition=" Exists('Wix.Build.props') And '$(MSBuildProjectExtension)'=='.wixproj' " />
28 <Import Project="Custom.Build.props" Condition=" Exists('Custom.Build.props') " />
29</Project>
diff --git a/src/ext/Http/Directory.Build.targets b/src/ext/Http/Directory.Build.targets
new file mode 100644
index 00000000..dac7452a
--- /dev/null
+++ b/src/ext/Http/Directory.Build.targets
@@ -0,0 +1,48 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3<!--
4 Do NOT modify this file. Update the canonical version in Home\repo-template\src\Directory.Build.targets
5 then update all of the repos.
6-->
7<!--
8 Replace PackageReferences with ProjectReferences when the projects can be found in .sln.
9 See the original here: https://github.com/dotnet/sdk/issues/1151#issuecomment-385133284
10-->
11<Project>
12 <PropertyGroup>
13 <ReplacePackageReferences>true</ReplacePackageReferences>
14 <TheSolutionPath Condition=" '$(NCrunch)'=='' ">$(SolutionPath)</TheSolutionPath>
15 <TheSolutionPath Condition=" '$(NCrunch)'=='1' ">$(NCrunchOriginalSolutionPath)</TheSolutionPath>
16 </PropertyGroup>
17
18 <Choose>
19 <When Condition="$(ReplacePackageReferences) AND '$(TheSolutionPath)' != '' AND '$(TheSolutionPath)' != '*undefined*' AND Exists('$(TheSolutionPath)')">
20
21 <PropertyGroup>
22 <SolutionFileContent>$([System.IO.File]::ReadAllText($(TheSolutionPath)))</SolutionFileContent>
23 <SmartSolutionDir>$([System.IO.Path]::GetDirectoryName( $(TheSolutionPath) ))</SmartSolutionDir>
24 <RegexPattern>(?&lt;="[PackageName]", ")(.*)(?=", ")</RegexPattern>
25 </PropertyGroup>
26
27 <ItemGroup>
28 <!-- Keep the identity of the PackageReference -->
29 <SmartPackageReference Include="@(PackageReference)">
30 <PackageName>%(Identity)</PackageName>
31 <InSolution>$(SolutionFileContent.Contains('\%(Identity).csproj'))</InSolution>
32 </SmartPackageReference>
33
34 <!-- Filter them by mapping them to another ItemGroup using the WithMetadataValue item function -->
35 <PackageInSolution Include="@(SmartPackageReference->WithMetadataValue('InSolution', True))">
36 <Pattern>$(RegexPattern.Replace('[PackageName]','%(PackageName)') )</Pattern>
37 <SmartPath>$([System.Text.RegularExpressions.Regex]::Match('$(SolutionFileContent)', '%(Pattern)'))</SmartPath>
38 </PackageInSolution>
39
40 <ProjectReference Include="@(PackageInSolution->'$(SmartSolutionDir)\%(SmartPath)' )"/>
41
42 <!-- Remove the package references that are now referenced as projects -->
43 <PackageReference Remove="@(PackageInSolution->'%(PackageName)' )"/>
44 </ItemGroup>
45
46 </When>
47 </Choose>
48</Project>
diff --git a/src/ext/Http/FindLocalWix.props b/src/ext/Http/FindLocalWix.props
new file mode 100644
index 00000000..1666e4fe
--- /dev/null
+++ b/src/ext/Http/FindLocalWix.props
@@ -0,0 +1,8 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3
4<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
5 <PropertyGroup>
6 <WixTargetsPath Condition=" '$(Configuration)' == 'Debug' And Exists('$(MSBuildThisFileDirectory)..\..\Tools\README.md') And Exists('$(MSBuildThisFileDirectory)..\..\Tools\build\Debug\net461\wix.targets') ">$(MSBuildThisFileDirectory)..\..\Tools\build\Debug\net461\wix.targets</WixTargetsPath>
7 </PropertyGroup>
8</Project>
diff --git a/src/ext/Http/Http.wixext.sln b/src/ext/Http/Http.wixext.sln
new file mode 100644
index 00000000..fe5c52e9
--- /dev/null
+++ b/src/ext/Http/Http.wixext.sln
@@ -0,0 +1,61 @@
1
2Microsoft Visual Studio Solution File, Format Version 12.00
3# Visual Studio Version 16
4VisualStudioVersion = 16.0.30204.135
5MinimumVisualStudioVersion = 10.0.40219.1
6Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "httpca", "src\ca\httpca.vcxproj", "{90743805-C043-47C7-B5FF-8F5EE5C8A2DE}"
7EndProject
8Project("{930C7802-8A8C-48F9-8165-68863BCCD9DD}") = "http", "src\wixlib\http.wixproj", "{055C1517-4CED-4199-BCDE-A383E5C4EF78}"
9EndProject
10Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WixToolset.Http.wixext", "src\wixext\WixToolset.Http.wixext.csproj", "{AAFC3C7F-D818-4B1D-AF3F-A331EA917F3F}"
11EndProject
12Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WixToolsetTest.Http", "src\test\WixToolsetTest.Http\WixToolsetTest.Http.csproj", "{6379EBAA-B5FE-4468-89A3-EF0B5D30B87E}"
13EndProject
14Global
15 GlobalSection(SolutionConfigurationPlatforms) = preSolution
16 Debug|Any CPU = Debug|Any CPU
17 Debug|x86 = Debug|x86
18 Release|Any CPU = Release|Any CPU
19 Release|x86 = Release|x86
20 EndGlobalSection
21 GlobalSection(ProjectConfigurationPlatforms) = postSolution
22 {90743805-C043-47C7-B5FF-8F5EE5C8A2DE}.Debug|Any CPU.ActiveCfg = Debug|Win32
23 {90743805-C043-47C7-B5FF-8F5EE5C8A2DE}.Debug|Any CPU.Build.0 = Debug|Win32
24 {90743805-C043-47C7-B5FF-8F5EE5C8A2DE}.Debug|x86.ActiveCfg = Debug|Win32
25 {90743805-C043-47C7-B5FF-8F5EE5C8A2DE}.Debug|x86.Build.0 = Debug|Win32
26 {90743805-C043-47C7-B5FF-8F5EE5C8A2DE}.Release|Any CPU.ActiveCfg = Release|Win32
27 {90743805-C043-47C7-B5FF-8F5EE5C8A2DE}.Release|Any CPU.Build.0 = Release|Win32
28 {90743805-C043-47C7-B5FF-8F5EE5C8A2DE}.Release|x86.ActiveCfg = Release|Win32
29 {90743805-C043-47C7-B5FF-8F5EE5C8A2DE}.Release|x86.Build.0 = Release|Win32
30 {055C1517-4CED-4199-BCDE-A383E5C4EF78}.Debug|Any CPU.ActiveCfg = Debug|x86
31 {055C1517-4CED-4199-BCDE-A383E5C4EF78}.Debug|Any CPU.Build.0 = Debug|x86
32 {055C1517-4CED-4199-BCDE-A383E5C4EF78}.Debug|x86.ActiveCfg = Debug|x86
33 {055C1517-4CED-4199-BCDE-A383E5C4EF78}.Debug|x86.Build.0 = Debug|x86
34 {055C1517-4CED-4199-BCDE-A383E5C4EF78}.Release|Any CPU.ActiveCfg = Release|x86
35 {055C1517-4CED-4199-BCDE-A383E5C4EF78}.Release|Any CPU.Build.0 = Release|x86
36 {055C1517-4CED-4199-BCDE-A383E5C4EF78}.Release|x86.ActiveCfg = Release|x86
37 {055C1517-4CED-4199-BCDE-A383E5C4EF78}.Release|x86.Build.0 = Release|x86
38 {AAFC3C7F-D818-4B1D-AF3F-A331EA917F3F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
39 {AAFC3C7F-D818-4B1D-AF3F-A331EA917F3F}.Debug|Any CPU.Build.0 = Debug|Any CPU
40 {AAFC3C7F-D818-4B1D-AF3F-A331EA917F3F}.Debug|x86.ActiveCfg = Debug|Any CPU
41 {AAFC3C7F-D818-4B1D-AF3F-A331EA917F3F}.Debug|x86.Build.0 = Debug|Any CPU
42 {AAFC3C7F-D818-4B1D-AF3F-A331EA917F3F}.Release|Any CPU.ActiveCfg = Release|Any CPU
43 {AAFC3C7F-D818-4B1D-AF3F-A331EA917F3F}.Release|Any CPU.Build.0 = Release|Any CPU
44 {AAFC3C7F-D818-4B1D-AF3F-A331EA917F3F}.Release|x86.ActiveCfg = Release|Any CPU
45 {AAFC3C7F-D818-4B1D-AF3F-A331EA917F3F}.Release|x86.Build.0 = Release|Any CPU
46 {6379EBAA-B5FE-4468-89A3-EF0B5D30B87E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
47 {6379EBAA-B5FE-4468-89A3-EF0B5D30B87E}.Debug|Any CPU.Build.0 = Debug|Any CPU
48 {6379EBAA-B5FE-4468-89A3-EF0B5D30B87E}.Debug|x86.ActiveCfg = Debug|Any CPU
49 {6379EBAA-B5FE-4468-89A3-EF0B5D30B87E}.Debug|x86.Build.0 = Debug|Any CPU
50 {6379EBAA-B5FE-4468-89A3-EF0B5D30B87E}.Release|Any CPU.ActiveCfg = Release|Any CPU
51 {6379EBAA-B5FE-4468-89A3-EF0B5D30B87E}.Release|Any CPU.Build.0 = Release|Any CPU
52 {6379EBAA-B5FE-4468-89A3-EF0B5D30B87E}.Release|x86.ActiveCfg = Release|Any CPU
53 {6379EBAA-B5FE-4468-89A3-EF0B5D30B87E}.Release|x86.Build.0 = Release|Any CPU
54 EndGlobalSection
55 GlobalSection(SolutionProperties) = preSolution
56 HideSolutionNode = FALSE
57 EndGlobalSection
58 GlobalSection(ExtensibilityGlobals) = postSolution
59 SolutionGuid = {570B1B57-B310-4493-A3A3-B40D7374EFC3}
60 EndGlobalSection
61EndGlobal
diff --git a/src/ext/Http/README.md b/src/ext/Http/README.md
new file mode 100644
index 00000000..2d9f1895
--- /dev/null
+++ b/src/ext/Http/README.md
@@ -0,0 +1,2 @@
1# Http.wixext
2WixToolset.Http.wixext - Http WiX Toolset Extension
diff --git a/src/ext/Http/appveyor.cmd b/src/ext/Http/appveyor.cmd
new file mode 100644
index 00000000..16a34ff9
--- /dev/null
+++ b/src/ext/Http/appveyor.cmd
@@ -0,0 +1,14 @@
1@setlocal
2@pushd %~dp0
3
4nuget restore || exit /b
5
6msbuild -p:Configuration=Release -t:Restore || exit /b
7
8msbuild -p:Configuration=Release src\test\WixToolsetTest.Http\WixToolsetTest.Http.csproj || exit /b
9dotnet test -c Release --no-build src\test\WixToolsetTest.Http || exit /b
10
11msbuild -p:Configuration=Release -t:Pack src\wixext\WixToolset.Http.wixext.csproj || exit /b
12
13@popd
14@endlocal \ No newline at end of file
diff --git a/src/ext/Http/appveyor.yml b/src/ext/Http/appveyor.yml
new file mode 100644
index 00000000..7c686b04
--- /dev/null
+++ b/src/ext/Http/appveyor.yml
@@ -0,0 +1,40 @@
1# Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2#
3# Do NOT modify this file. Update the canonical version in Home\repo-template\src\appveyor.yml
4# then update all of the repos.
5
6branches:
7 only:
8 - master
9 - develop
10
11image: Visual Studio 2019
12
13version: 0.0.0.{build}
14configuration: Release
15
16environment:
17 DOTNET_SKIP_FIRST_TIME_EXPERIENCE: true
18 DOTNET_CLI_TELEMETRY_OPTOUT: 1
19 NUGET_XMLDOC_MODE: skip
20
21build_script:
22 - appveyor.cmd
23
24pull_requests:
25 do_not_increment_build_number: true
26
27nuget:
28 disable_publish_on_pr: true
29
30skip_branch_with_pr: true
31skip_tags: true
32
33artifacts:
34- path: build\Release\**\*.nupkg
35 name: nuget
36
37notifications:
38- provider: Slack
39 incoming_webhook:
40 secure: p5xuu+4x2JHfwGDMDe5KcG1k7gZxqYc4jWVwvyNZv5cvkubPD2waJs5yXMAXZNN7Z63/3PWHb7q4KoY/99AjauYa1nZ4c5qYqRPFRBKTHfA=
diff --git a/src/ext/Http/ca/caDecor.h b/src/ext/Http/ca/caDecor.h
new file mode 100644
index 00000000..da274650
--- /dev/null
+++ b/src/ext/Http/ca/caDecor.h
@@ -0,0 +1,13 @@
1#pragma once
2// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
3
4
5#if defined(_M_ARM64)
6#define CUSTOM_ACTION_DECORATION(f) L"Wix4" f L"_A64"
7#elif defined(_M_AMD64)
8#define CUSTOM_ACTION_DECORATION(f) L"Wix4" f L"_X64"
9#elif defined(_M_ARM)
10#define CUSTOM_ACTION_DECORATION(f) L"Wix4" f L"_ARM"
11#else
12#define CUSTOM_ACTION_DECORATION(f) L"Wix4" f L"_X86"
13#endif
diff --git a/src/ext/Http/ca/cost.h b/src/ext/Http/ca/cost.h
new file mode 100644
index 00000000..9677e7e8
--- /dev/null
+++ b/src/ext/Http/ca/cost.h
@@ -0,0 +1,6 @@
1#pragma once
2// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
3
4
5const UINT COST_HTTP_URL_ACL = 2000;
6const UINT COST_HTTP_SNI_SSL = 2000;
diff --git a/src/ext/Http/ca/dllmain.cpp b/src/ext/Http/ca/dllmain.cpp
new file mode 100644
index 00000000..b4c8c037
--- /dev/null
+++ b/src/ext/Http/ca/dllmain.cpp
@@ -0,0 +1,26 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3#include "precomp.h"
4
5/********************************************************************
6DllMain - standard entry point for all WiX CustomActions
7
8********************************************************************/
9extern "C" BOOL WINAPI DllMain(
10 IN HINSTANCE hInstance,
11 IN ULONG ulReason,
12 IN LPVOID)
13{
14 switch(ulReason)
15 {
16 case DLL_PROCESS_ATTACH:
17 WcaGlobalInitialize(hInstance);
18 break;
19
20 case DLL_PROCESS_DETACH:
21 WcaGlobalFinalize();
22 break;
23 }
24
25 return TRUE;
26}
diff --git a/src/ext/Http/ca/httpca.vcxproj b/src/ext/Http/ca/httpca.vcxproj
new file mode 100644
index 00000000..fde00ff4
--- /dev/null
+++ b/src/ext/Http/ca/httpca.vcxproj
@@ -0,0 +1,72 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3<Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
4 <Import Project="..\..\packages\WixToolset.DUtil.4.0.56\build\WixToolset.DUtil.props" Condition="Exists('..\..\packages\WixToolset.DUtil.4.0.56\build\WixToolset.DUtil.props')" />
5 <Import Project="..\..\packages\WixToolset.WcaUtil.4.0.17\build\WixToolset.WcaUtil.props" Condition="Exists('..\..\packages\WixToolset.WcaUtil.4.0.17\build\WixToolset.WcaUtil.props')" />
6
7 <ItemGroup Label="ProjectConfigurations">
8 <ProjectConfiguration Include="Debug|Win32">
9 <Configuration>Debug</Configuration>
10 <Platform>Win32</Platform>
11 </ProjectConfiguration>
12 <ProjectConfiguration Include="Release|Win32">
13 <Configuration>Release</Configuration>
14 <Platform>Win32</Platform>
15 </ProjectConfiguration>
16 <ProjectConfiguration Include="Debug|x64">
17 <Configuration>Debug</Configuration>
18 <Platform>x64</Platform>
19 </ProjectConfiguration>
20 <ProjectConfiguration Include="Release|x64">
21 <Configuration>Release</Configuration>
22 <Platform>x64</Platform>
23 </ProjectConfiguration>
24 <ProjectConfiguration Include="Debug|ARM64">
25 <Configuration>Debug</Configuration>
26 <Platform>ARM64</Platform>
27 </ProjectConfiguration>
28 <ProjectConfiguration Include="Release|ARM64">
29 <Configuration>Release</Configuration>
30 <Platform>ARM64</Platform>
31 </ProjectConfiguration>
32 </ItemGroup>
33
34 <PropertyGroup Label="Globals">
35 <ProjectGuid>{90743805-C043-47C7-B5FF-8F5EE5C8A2DE}</ProjectGuid>
36 <ConfigurationType>DynamicLibrary</ConfigurationType>
37 <PlatformToolset>v142</PlatformToolset>
38 <CharacterSet>Unicode</CharacterSet>
39 <TargetName>httpca</TargetName>
40 <ProjectModuleDefinitionFile>wixhttpca.def</ProjectModuleDefinitionFile>
41 <Description>WiX Toolset Http CustomAction</Description>
42 </PropertyGroup>
43
44 <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
45 <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
46
47 <PropertyGroup>
48 <ProjectAdditionalLinkLibraries>crypt32.lib;httpapi.lib;msi.lib;rpcrt4.lib;ws2_32.lib</ProjectAdditionalLinkLibraries>
49 </PropertyGroup>
50
51 <ItemGroup>
52 <ClCompile Include="dllmain.cpp">
53 <PrecompiledHeader>Create</PrecompiledHeader>
54 </ClCompile>
55 <ClCompile Include="snisslcert.cpp" />
56 <ClCompile Include="wixhttpca.cpp" />
57 <ClInclude Include="cost.h" />
58 <ClInclude Include="precomp.h" />
59 <None Include="packages.config" />
60 <None Include="wixhttpca.def" />
61 </ItemGroup>
62
63 <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
64
65 <Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
66 <PropertyGroup>
67 <ErrorText>This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
68 </PropertyGroup>
69 <Error Condition="!Exists('..\..\packages\WixToolset.DUtil.4.0.56\build\WixToolset.DUtil.props')" Text="$([System.String]::Format('$(ErrorText)', '..\..\packages\WixToolset.DUtil.4.0.56\build\WixToolset.DUtil.props'))" />
70 <Error Condition="!Exists('..\..\packages\WixToolset.WcaUtil.4.0.17\build\WixToolset.WcaUtil.props')" Text="$([System.String]::Format('$(ErrorText)', '..\..\packages\WixToolset.WcaUtil.4.0.17\build\WixToolset.WcaUtil.props'))" />
71 </Target>
72</Project>
diff --git a/src/ext/Http/ca/httpca.vcxproj.filters b/src/ext/Http/ca/httpca.vcxproj.filters
new file mode 100644
index 00000000..2ccd604d
--- /dev/null
+++ b/src/ext/Http/ca/httpca.vcxproj.filters
@@ -0,0 +1,42 @@
1<?xml version="1.0" encoding="utf-8"?>
2<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
3 <ItemGroup>
4 <Filter Include="Source Files">
5 <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
6 <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
7 </Filter>
8 <Filter Include="Header Files">
9 <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
10 <Extensions>h;hh;hpp;hxx;hm;inl;inc;xsd</Extensions>
11 </Filter>
12 <Filter Include="Resource Files">
13 <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
14 <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
15 </Filter>
16 </ItemGroup>
17 <ItemGroup>
18 <ClCompile Include="wixhttpca.cpp">
19 <Filter>Source Files</Filter>
20 </ClCompile>
21 <ClCompile Include="dllmain.cpp">
22 <Filter>Source Files</Filter>
23 </ClCompile>
24 <ClCompile Include="snisslcert.cpp">
25 <Filter>Source Files</Filter>
26 </ClCompile>
27 </ItemGroup>
28 <ItemGroup>
29 <ClInclude Include="precomp.h">
30 <Filter>Header Files</Filter>
31 </ClInclude>
32 <ClInclude Include="cost.h">
33 <Filter>Header Files</Filter>
34 </ClInclude>
35 </ItemGroup>
36 <ItemGroup>
37 <None Include="wixhttpca.def">
38 <Filter>Source Files</Filter>
39 </None>
40 <None Include="packages.config" />
41 </ItemGroup>
42</Project> \ No newline at end of file
diff --git a/src/ext/Http/ca/packages.config b/src/ext/Http/ca/packages.config
new file mode 100644
index 00000000..9d88f529
--- /dev/null
+++ b/src/ext/Http/ca/packages.config
@@ -0,0 +1,5 @@
1<?xml version="1.0" encoding="utf-8"?>
2<packages>
3 <package id="WixToolset.DUtil" version="4.0.56" targetFramework="native" />
4 <package id="WixToolset.WcaUtil" version="4.0.17" targetFramework="native" />
5</packages> \ No newline at end of file
diff --git a/src/ext/Http/ca/precomp.h b/src/ext/Http/ca/precomp.h
new file mode 100644
index 00000000..c78d78c1
--- /dev/null
+++ b/src/ext/Http/ca/precomp.h
@@ -0,0 +1,25 @@
1#pragma once
2// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
3
4
5#include <http.h>
6#include <msiquery.h>
7#include <strsafe.h>
8
9#include "wcautil.h"
10#include "cryputil.h"
11#include "dutil.h"
12#include "memutil.h"
13#include "strutil.h"
14#include "aclutil.h"
15
16#include "cost.h"
17
18#include "caDecor.h"
19
20enum eHandleExisting
21{
22 heReplace = 0,
23 heIgnore = 1,
24 heFail = 2
25};
diff --git a/src/ext/Http/ca/snisslcert.cpp b/src/ext/Http/ca/snisslcert.cpp
new file mode 100644
index 00000000..3a7336af
--- /dev/null
+++ b/src/ext/Http/ca/snisslcert.cpp
@@ -0,0 +1,704 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3#include "precomp.h"
4
5#if _WIN32_WINNT < 0x0602
6
7typedef struct _HTTP_SERVICE_CONFIG_SSL_SNI_KEY
8{
9 SOCKADDR_STORAGE IpPort;
10 PWSTR Host;
11} HTTP_SERVICE_CONFIG_SSL_SNI_KEY, * PHTTP_SERVICE_CONFIG_SSL_SNI_KEY;
12
13typedef struct _HTTP_SERVICE_CONFIG_SSL_SNI_SET
14{
15 HTTP_SERVICE_CONFIG_SSL_SNI_KEY KeyDesc;
16 HTTP_SERVICE_CONFIG_SSL_PARAM ParamDesc;
17} HTTP_SERVICE_CONFIG_SSL_SNI_SET, * PHTTP_SERVICE_CONFIG_SSL_SNI_SET;
18
19typedef struct _HTTP_SERVICE_CONFIG_SSL_SNI_QUERY
20{
21 HTTP_SERVICE_CONFIG_QUERY_TYPE QueryDesc;
22 HTTP_SERVICE_CONFIG_SSL_SNI_KEY KeyDesc;
23 DWORD dwToken;
24} HTTP_SERVICE_CONFIG_SSL_SNI_QUERY, * PHTTP_SERVICE_CONFIG_SSL_SNI_QUERY;
25
26#define HttpServiceConfigSslSniCertInfo static_cast<HTTP_SERVICE_CONFIG_ID>(HttpServiceConfigCache + 1)
27
28#endif
29
30static UINT SchedHttpSniSslCerts(
31 __in WCA_TODO todoSched
32);
33static HRESULT WriteExistingSniSslCert(
34 __in WCA_TODO action,
35 __in_z LPCWSTR wzId,
36 __in_z LPCWSTR wzHost,
37 __in int iPort,
38 __in int iHandleExisting,
39 __in HTTP_SERVICE_CONFIG_SSL_SNI_SET* pSniSslSet,
40 __inout_z LPWSTR* psczCustomActionData
41);
42static HRESULT WriteSniSslCert(
43 __in WCA_TODO action,
44 __in_z LPCWSTR wzId,
45 __in_z LPCWSTR wzHost,
46 __in int iPort,
47 __in int iHandleExisting,
48 __in_z LPCWSTR wzCertificateThumbprint,
49 __in_z LPCWSTR wzAppId,
50 __in_z_opt LPCWSTR wzCertificateStore,
51 __inout_z LPWSTR* psczCustomActionData
52);
53static HRESULT EnsureAppId(
54 __inout_z LPWSTR* psczAppId,
55 __in_opt HTTP_SERVICE_CONFIG_SSL_SNI_SET* pExistingSniSslSet
56);
57static HRESULT StringFromGuid(
58 __in REFGUID rguid,
59 __inout_z LPWSTR* psczGuid
60);
61static HRESULT AddSniSslCert(
62 __in_z LPCWSTR wzId,
63 __in_z LPWSTR wzHost,
64 __in int iPort,
65 __in BYTE rgbCertificateThumbprint[],
66 __in DWORD cbCertificateThumbprint,
67 __in GUID* pAppId,
68 __in_z LPWSTR wzSslCertStore
69);
70static HRESULT GetSniSslCert(
71 __in_z LPWSTR wzHost,
72 __in int nPort,
73 __out HTTP_SERVICE_CONFIG_SSL_SNI_SET** ppSet
74);
75static HRESULT RemoveSniSslCert(
76 __in_z LPCWSTR wzId,
77 __in_z LPWSTR wzHost,
78 __in int iPort
79);
80static void SetSniSslCertSetKey(
81 __in HTTP_SERVICE_CONFIG_SSL_SNI_KEY* pKey,
82 __in_z LPWSTR wzHost,
83 __in int iPort
84);
85
86
87LPCWSTR vcsWixHttpSniSslCertQuery =
88L"SELECT `Wix4HttpSniSslCert`.`Wix4HttpSniSslCert`, `Wix4HttpSniSslCert`.`Host`, `Wix4HttpSniSslCert`.`Port`, `Wix4HttpSniSslCert`.`Thumbprint`, `Wix4HttpSniSslCert`.`AppId`, `Wix4HttpSniSslCert`.`Store`, `Wix4HttpSniSslCert`.`HandleExisting`, `Wix4HttpSniSslCert`.`Component_` "
89L"FROM `Wix4HttpSniSslCert`";
90enum eWixHttpSniSslCertQuery { hurqId = 1, hurqHost, hurqPort, hurqCertificateThumbprint, hurqAppId, hurqCertificateStore, hurqHandleExisting, hurqComponent };
91
92/******************************************************************
93 SchedWixHttpSniSslCertsInstall - immediate custom action entry
94 point to prepare adding URL reservations.
95
96********************************************************************/
97extern "C" UINT __stdcall SchedHttpSniSslCertsInstall(
98 __in MSIHANDLE hInstall
99)
100{
101 HRESULT hr = S_OK;
102
103 hr = WcaInitialize(hInstall, "SchedHttpSniSslCertsInstall");
104 ExitOnFailure(hr, "Failed to initialize");
105
106 hr = SchedHttpSniSslCerts(WCA_TODO_INSTALL);
107
108LExit:
109 return WcaFinalize(FAILED(hr) ? ERROR_INSTALL_FAILURE : ERROR_SUCCESS);
110}
111
112/******************************************************************
113 SchedWixHttpSniSslCertsUninstall - immediate custom action entry
114 point to prepare removing URL reservations.
115
116********************************************************************/
117extern "C" UINT __stdcall SchedHttpSniSslCertsUninstall(
118 __in MSIHANDLE hInstall
119)
120{
121 HRESULT hr = S_OK;
122
123 hr = WcaInitialize(hInstall, "SchedHttpSniSslCertsUninstall");
124 ExitOnFailure(hr, "Failed to initialize");
125
126 hr = SchedHttpSniSslCerts(WCA_TODO_UNINSTALL);
127
128LExit:
129 return WcaFinalize(FAILED(hr) ? ERROR_INSTALL_FAILURE : ERROR_SUCCESS);
130}
131
132/******************************************************************
133 ExecHttpSniSslCerts - deferred custom action entry point to
134 register and remove URL reservations.
135
136********************************************************************/
137extern "C" UINT __stdcall ExecHttpSniSslCerts(
138 __in MSIHANDLE hInstall
139)
140{
141 HRESULT hr = S_OK;
142 BOOL fHttpInitialized = FALSE;
143 LPWSTR sczCustomActionData = NULL;
144 LPWSTR wz = NULL;
145 int iTodo = WCA_TODO_UNKNOWN;
146 LPWSTR sczId = NULL;
147 LPWSTR sczHost = NULL;
148 int iPort = 0;
149 eHandleExisting handleExisting = heIgnore;
150 LPWSTR sczCertificateThumbprint = NULL;
151 LPWSTR sczAppId = NULL;
152 LPWSTR sczCertificateStore = NULL;
153
154 BOOL fRollback = ::MsiGetMode(hInstall, MSIRUNMODE_ROLLBACK);
155 BOOL fRemove = FALSE;
156 BOOL fAdd = FALSE;
157 BOOL fFailOnExisting = FALSE;
158
159 GUID guidAppId = { };
160 BYTE* pbCertificateThumbprint = NULL;
161 DWORD cbCertificateThumbprint = 0;
162
163 // Initialize.
164 hr = WcaInitialize(hInstall, "ExecHttpSniSslCerts");
165 ExitOnFailure(hr, "Failed to initialize");
166
167 hr = HRESULT_FROM_WIN32(::HttpInitialize(HTTPAPI_VERSION_1, HTTP_INITIALIZE_CONFIG, NULL));
168 ExitOnFailure(hr, "Failed to initialize HTTP Server configuration");
169
170 fHttpInitialized = TRUE;
171
172 hr = WcaGetProperty(L"CustomActionData", &sczCustomActionData);
173 ExitOnFailure(hr, "Failed to get CustomActionData");
174 WcaLog(LOGMSG_TRACEONLY, "CustomActionData: %ls", sczCustomActionData);
175
176 wz = sczCustomActionData;
177 while (wz && *wz)
178 {
179 // Extract the custom action data and if rolling back, swap INSTALL and UNINSTALL.
180 hr = WcaReadIntegerFromCaData(&wz, &iTodo);
181 ExitOnFailure(hr, "Failed to read todo from custom action data");
182
183 hr = WcaReadStringFromCaData(&wz, &sczId);
184 ExitOnFailure(hr, "Failed to read Id from custom action data");
185
186 hr = WcaReadStringFromCaData(&wz, &sczHost);
187 ExitOnFailure(hr, "Failed to read Host from custom action data");
188
189 hr = WcaReadIntegerFromCaData(&wz, &iPort);
190 ExitOnFailure(hr, "Failed to read Port from custom action data");
191
192 hr = WcaReadIntegerFromCaData(&wz, reinterpret_cast<int*>(&handleExisting));
193 ExitOnFailure(hr, "Failed to read HandleExisting from custom action data");
194
195 hr = WcaReadStringFromCaData(&wz, &sczCertificateThumbprint);
196 ExitOnFailure(hr, "Failed to read CertificateThumbprint from custom action data");
197
198 hr = WcaReadStringFromCaData(&wz, &sczAppId);
199 ExitOnFailure(hr, "Failed to read AppId from custom action data");
200
201 hr = WcaReadStringFromCaData(&wz, &sczCertificateStore);
202 ExitOnFailure(hr, "Failed to read CertificateStore from custom action data");
203
204 switch (iTodo)
205 {
206 case WCA_TODO_INSTALL:
207 case WCA_TODO_REINSTALL:
208 fRemove = heReplace == handleExisting || fRollback;
209 fAdd = !fRollback || *sczCertificateThumbprint;
210 fFailOnExisting = heFail == handleExisting && !fRollback;
211 break;
212
213 case WCA_TODO_UNINSTALL:
214 fRemove = !fRollback;
215 fAdd = fRollback && *sczCertificateThumbprint;
216 fFailOnExisting = FALSE;
217 break;
218 }
219
220 if (fRemove)
221 {
222 hr = RemoveSniSslCert(sczId, sczHost, iPort);
223 if (S_OK == hr)
224 {
225 WcaLog(LOGMSG_STANDARD, "Removed SNI SSL certificate '%ls' for hostname: %ls:%d", sczId, sczHost, iPort);
226 }
227 else if (FAILED(hr))
228 {
229 if (fRollback)
230 {
231 WcaLogError(hr, "Failed to remove SNI SSL certificate to rollback '%ls' for hostname: %ls:%d", sczId, sczHost, iPort);
232 }
233 else
234 {
235 ExitOnFailure(hr, "Failed to remove SNI SSL certificate '%ls' for hostname: %ls:%d", sczId, sczHost, iPort);
236 }
237 }
238 }
239
240 if (fAdd)
241 {
242 WcaLog(LOGMSG_STANDARD, "Adding SNI SSL certificate '%ls' for hostname: %ls:%d", sczId, sczHost, iPort);
243
244 hr = StrAllocHexDecode(sczCertificateThumbprint, &pbCertificateThumbprint, &cbCertificateThumbprint);
245 ExitOnFailure(hr, "Failed to convert thumbprint to bytes for SNI SSL certificate '%ls' for hostname: %ls:%d", sczId, sczHost, iPort);
246
247 hr = ::IIDFromString(sczAppId, &guidAppId);
248 ExitOnFailure(hr, "Failed to convert AppId '%ls' back to GUID for SNI SSL certificate '%ls' for hostname: %ls:%d", sczAppId, sczId, sczHost, iPort);
249
250 hr = AddSniSslCert(sczId, sczHost, iPort, pbCertificateThumbprint, cbCertificateThumbprint, &guidAppId, sczCertificateStore && *sczCertificateStore ? sczCertificateStore : L"MY");
251 if (S_FALSE == hr && fFailOnExisting)
252 {
253 hr = HRESULT_FROM_WIN32(ERROR_ALREADY_EXISTS);
254 }
255
256 if (S_OK == hr)
257 {
258 WcaLog(LOGMSG_STANDARD, "Added SNI SSL certificate '%ls' for hostname: %ls:%d with thumbprint: %ls", sczId, sczHost, iPort, sczCertificateThumbprint);
259 }
260 else if (FAILED(hr))
261 {
262 if (fRollback)
263 {
264 WcaLogError(hr, "Failed to add SNI SSL certificate to rollback '%ls' for hostname: %ls:%d", sczId, sczHost, iPort);
265 }
266 else
267 {
268 ExitOnFailure(hr, "Failed to add SNI SSL certificate '%ls' for hostname: %ls:%d", sczId, sczHost, iPort);
269 }
270 }
271
272 ReleaseNullMem(pbCertificateThumbprint);
273 }
274 }
275
276LExit:
277 ReleaseMem(pbCertificateThumbprint);
278 ReleaseStr(sczCertificateStore);
279 ReleaseStr(sczAppId);
280 ReleaseStr(sczCertificateThumbprint);
281 ReleaseStr(sczHost);
282 ReleaseStr(sczId);
283 ReleaseStr(sczCustomActionData);
284
285 if (fHttpInitialized)
286 {
287 ::HttpTerminate(HTTP_INITIALIZE_CONFIG, NULL);
288 }
289
290 return WcaFinalize(FAILED(hr) ? ERROR_INSTALL_FAILURE : ERROR_SUCCESS);
291}
292
293static UINT SchedHttpSniSslCerts(
294 __in WCA_TODO todoSched
295)
296{
297 HRESULT hr = S_OK;
298 UINT er = ERROR_SUCCESS;
299 BOOL fHttpInitialized = FALSE;
300 DWORD cCertificates = 0;
301
302 PMSIHANDLE hView = NULL;
303 PMSIHANDLE hRec = NULL;
304 PMSIHANDLE hQueryReq = NULL;
305 PMSIHANDLE hAceView = NULL;
306
307 LPWSTR sczCustomActionData = NULL;
308 LPWSTR sczRollbackCustomActionData = NULL;
309
310 LPWSTR sczId = NULL;
311 LPWSTR sczComponent = NULL;
312 WCA_TODO todoComponent = WCA_TODO_UNKNOWN;
313 LPWSTR sczHost = NULL;
314 int iPort = 0;
315 LPWSTR sczCertificateThumbprint = NULL;
316 LPWSTR sczAppId = NULL;
317 LPWSTR sczCertificateStore = NULL;
318 int iHandleExisting = 0;
319
320 HTTP_SERVICE_CONFIG_SSL_SNI_SET* pExistingSniSslSet = NULL;
321
322 // Anything to do?
323 hr = WcaTableExists(L"Wix4HttpSniSslCert");
324 ExitOnFailure(hr, "Failed to check if the Wix4HttpSniSslCert table exists");
325 if (S_FALSE == hr)
326 {
327 WcaLog(LOGMSG_STANDARD, "Wix4HttpSniSslCert table doesn't exist, so there are no URL reservations to configure");
328 ExitFunction();
329 }
330
331 // Query and loop through all the SNI SSL certificates.
332 hr = WcaOpenExecuteView(vcsWixHttpSniSslCertQuery, &hView);
333 ExitOnFailure(hr, "Failed to open view on the Wix4HttpSniSslCert table");
334
335 hr = HRESULT_FROM_WIN32(::HttpInitialize(HTTPAPI_VERSION_1, HTTP_INITIALIZE_CONFIG, NULL));
336 ExitOnFailure(hr, "Failed to initialize HTTP Server configuration");
337
338 fHttpInitialized = TRUE;
339
340 while (S_OK == (hr = WcaFetchRecord(hView, &hRec)))
341 {
342 hr = WcaGetRecordString(hRec, hurqId, &sczId);
343 ExitOnFailure(hr, "Failed to get Wix4HttpSniSslCert.Wix4HttpSniSslCert");
344
345 hr = WcaGetRecordString(hRec, hurqComponent, &sczComponent);
346 ExitOnFailure(hr, "Failed to get Wix4HttpSniSslCert.Component_");
347
348 // Figure out what we're doing for this reservation, treating reinstall the same as install.
349 todoComponent = WcaGetComponentToDo(sczComponent);
350 if ((WCA_TODO_REINSTALL == todoComponent ? WCA_TODO_INSTALL : todoComponent) != todoSched)
351 {
352 WcaLog(LOGMSG_STANDARD, "Component '%ls' action state (%d) doesn't match request (%d) for Wix4HttpSniSslCert '%ls'", sczComponent, todoComponent, todoSched, sczId);
353 continue;
354 }
355
356 hr = WcaGetRecordFormattedString(hRec, hurqHost, &sczHost);
357 ExitOnFailure(hr, "Failed to get Wix4HttpSniSslCert.Host");
358
359 hr = WcaGetRecordFormattedInteger(hRec, hurqPort, &iPort);
360 ExitOnFailure(hr, "Failed to get Wix4HttpSniSslCert.Port");
361
362 hr = WcaGetRecordFormattedString(hRec, hurqCertificateThumbprint, &sczCertificateThumbprint);
363 ExitOnFailure(hr, "Failed to get Wix4HttpSniSslCert.CertificateThumbprint");
364
365 if (!sczHost || !*sczHost)
366 {
367 hr = E_INVALIDARG;
368 ExitOnFailure(hr, "Require a Host value for Wix4HttpSniSslCert '%ls'", sczId);
369 }
370
371 if (!iPort)
372 {
373 hr = E_INVALIDARG;
374 ExitOnFailure(hr, "Require a Port value for Wix4HttpSniSslCert '%ls'", sczId);
375 }
376
377 if (!sczCertificateThumbprint || !*sczCertificateThumbprint)
378 {
379 hr = E_INVALIDARG;
380 ExitOnFailure(hr, "Require a CertificateThumbprint value for Wix4HttpSniSslCert '%ls'", sczId);
381 }
382
383 hr = WcaGetRecordFormattedString(hRec, hurqAppId, &sczAppId);
384 ExitOnFailure(hr, "Failed to get AppId for Wix4HttpSniSslCert '%ls'", sczId);
385
386 hr = WcaGetRecordFormattedString(hRec, hurqCertificateStore, &sczCertificateStore);
387 ExitOnFailure(hr, "Failed to get CertificateStore for Wix4HttpSniSslCert '%ls'", sczId);
388
389 hr = WcaGetRecordInteger(hRec, hurqHandleExisting, &iHandleExisting);
390 ExitOnFailure(hr, "Failed to get HandleExisting for Wix4HttpSniSslCert '%ls'", sczId);
391
392 hr = GetSniSslCert(sczHost, iPort, &pExistingSniSslSet);
393 ExitOnFailure(hr, "Failed to get the existing SNI SSL certificate for Wix4HttpSniSslCert '%ls'", sczId);
394
395 hr = EnsureAppId(&sczAppId, pExistingSniSslSet);
396 ExitOnFailure(hr, "Failed to ensure AppId for Wix4HttpSniSslCert '%ls'", sczId);
397
398 hr = WriteExistingSniSslCert(todoComponent, sczId, sczHost, iPort, iHandleExisting, pExistingSniSslSet, &sczRollbackCustomActionData);
399 ExitOnFailure(hr, "Failed to write rollback custom action data for Wix4HttpSniSslCert '%ls'", sczId);
400
401 hr = WriteSniSslCert(todoComponent, sczId, sczHost, iPort, iHandleExisting, sczCertificateThumbprint, sczAppId, sczCertificateStore, &sczCustomActionData);
402 ExitOnFailure(hr, "Failed to write custom action data for Wix4HttpSniSslCert '%ls'", sczId);
403 ++cCertificates;
404
405 ReleaseNullMem(pExistingSniSslSet);
406 }
407
408 // Reaching the end of the list is not an error.
409 if (E_NOMOREITEMS == hr)
410 {
411 hr = S_OK;
412 }
413 ExitOnFailure(hr, "Failure occurred while processing Wix4HttpSniSslCert table");
414
415 // Schedule ExecHttpSniSslCerts if there's anything to do.
416 if (cCertificates)
417 {
418 WcaLog(LOGMSG_STANDARD, "Scheduling SNI SSL certificate (%ls)", sczCustomActionData);
419 WcaLog(LOGMSG_STANDARD, "Scheduling rollback SNI SSL certificate (%ls)", sczRollbackCustomActionData);
420
421 if (WCA_TODO_INSTALL == todoSched)
422 {
423 hr = WcaDoDeferredAction(CUSTOM_ACTION_DECORATION(L"WixRollbackHttpSniSslCertsInstall"), sczRollbackCustomActionData, cCertificates * COST_HTTP_SNI_SSL);
424 ExitOnFailure(hr, "Failed to schedule install SNI SSL certificate rollback");
425 hr = WcaDoDeferredAction(CUSTOM_ACTION_DECORATION(L"WixExecHttpSniSslCertsInstall"), sczCustomActionData, cCertificates * COST_HTTP_SNI_SSL);
426 ExitOnFailure(hr, "Failed to schedule install SNI SSL certificate execution");
427 }
428 else
429 {
430 hr = WcaDoDeferredAction(CUSTOM_ACTION_DECORATION(L"WixRollbackHttpSniSslCertsUninstall"), sczRollbackCustomActionData, cCertificates * COST_HTTP_SNI_SSL);
431 ExitOnFailure(hr, "Failed to schedule uninstall SNI SSL certificate rollback");
432 hr = WcaDoDeferredAction(CUSTOM_ACTION_DECORATION(L"WixExecHttpSniSslCertsUninstall"), sczCustomActionData, cCertificates * COST_HTTP_SNI_SSL);
433 ExitOnFailure(hr, "Failed to schedule uninstall SNI SSL certificate execution");
434 }
435 }
436 else
437 {
438 WcaLog(LOGMSG_STANDARD, "No SNI SSL certificates scheduled");
439 }
440
441LExit:
442 ReleaseMem(pExistingSniSslSet);
443 ReleaseStr(sczCertificateStore);
444 ReleaseStr(sczAppId);
445 ReleaseStr(sczCertificateThumbprint);
446 ReleaseStr(sczHost);
447 ReleaseStr(sczComponent);
448 ReleaseStr(sczId);
449 ReleaseStr(sczRollbackCustomActionData);
450 ReleaseStr(sczCustomActionData);
451
452 if (fHttpInitialized)
453 {
454 ::HttpTerminate(HTTP_INITIALIZE_CONFIG, NULL);
455 }
456
457 return WcaFinalize(er = FAILED(hr) ? ERROR_INSTALL_FAILURE : er);
458}
459
460static HRESULT WriteExistingSniSslCert(
461 __in WCA_TODO action,
462 __in_z LPCWSTR wzId,
463 __in_z LPCWSTR wzHost,
464 __in int iPort,
465 __in int iHandleExisting,
466 __in HTTP_SERVICE_CONFIG_SSL_SNI_SET* pSniSslSet,
467 __inout_z LPWSTR* psczCustomActionData
468)
469{
470 HRESULT hr = S_OK;
471 LPWSTR sczCertificateThumbprint = NULL;
472 LPWSTR sczAppId = NULL;
473 LPCWSTR wzCertificateStore = NULL;
474
475 if (pSniSslSet)
476 {
477 hr = StrAllocHexEncode(reinterpret_cast<BYTE*>(pSniSslSet->ParamDesc.pSslHash), pSniSslSet->ParamDesc.SslHashLength, &sczCertificateThumbprint);
478 ExitOnFailure(hr, "Failed to convert existing certificate thumbprint to hex for Wix4HttpSniSslCert '%ls'", wzId);
479
480 hr = StringFromGuid(pSniSslSet->ParamDesc.AppId, &sczAppId);
481 ExitOnFailure(hr, "Failed to copy existing AppId for Wix4HttpSniSslCert '%ls'", wzId);
482
483 wzCertificateStore = pSniSslSet->ParamDesc.pSslCertStoreName;
484 }
485
486 hr = WriteSniSslCert(action, wzId, wzHost, iPort, iHandleExisting, sczCertificateThumbprint ? sczCertificateThumbprint : L"", sczAppId ? sczAppId : L"", wzCertificateStore ? wzCertificateStore : L"", psczCustomActionData);
487 ExitOnFailure(hr, "Failed to write custom action data for Wix4HttpSniSslCert '%ls'", wzId);
488
489LExit:
490 ReleaseStr(sczAppId);
491 ReleaseStr(sczCertificateThumbprint);
492
493 return hr;
494}
495
496static HRESULT WriteSniSslCert(
497 __in WCA_TODO action,
498 __in_z LPCWSTR wzId,
499 __in_z LPCWSTR wzHost,
500 __in int iPort,
501 __in int iHandleExisting,
502 __in_z LPCWSTR wzCertificateThumbprint,
503 __in_z LPCWSTR wzAppId,
504 __in_z_opt LPCWSTR wzCertificateStore,
505 __inout_z LPWSTR* psczCustomActionData
506)
507{
508 HRESULT hr = S_OK;
509
510 hr = WcaWriteIntegerToCaData(action, psczCustomActionData);
511 ExitOnFailure(hr, "Failed to write action to custom action data");
512
513 hr = WcaWriteStringToCaData(wzId, psczCustomActionData);
514 ExitOnFailure(hr, "Failed to write id to custom action data");
515
516 hr = WcaWriteStringToCaData(wzHost, psczCustomActionData);
517 ExitOnFailure(hr, "Failed to write Host to custom action data");
518
519 hr = WcaWriteIntegerToCaData(iPort, psczCustomActionData);
520 ExitOnFailure(hr, "Failed to write Port to custom action data");
521
522 hr = WcaWriteIntegerToCaData(iHandleExisting, psczCustomActionData);
523 ExitOnFailure(hr, "Failed to write HandleExisting to custom action data");
524
525 hr = WcaWriteStringToCaData(wzCertificateThumbprint, psczCustomActionData);
526 ExitOnFailure(hr, "Failed to write CertificateThumbprint to custom action data");
527
528 hr = WcaWriteStringToCaData(wzAppId, psczCustomActionData);
529 ExitOnFailure(hr, "Failed to write AppId to custom action data");
530
531 hr = WcaWriteStringToCaData(wzCertificateStore ? wzCertificateStore : L"", psczCustomActionData);
532 ExitOnFailure(hr, "Failed to write CertificateStore to custom action data");
533
534LExit:
535 return hr;
536}
537
538static HRESULT EnsureAppId(
539 __inout_z LPWSTR* psczAppId,
540 __in_opt HTTP_SERVICE_CONFIG_SSL_SNI_SET* pExistingSniSslSet
541)
542{
543 HRESULT hr = S_OK;
544 RPC_STATUS rs = RPC_S_OK;
545 GUID guid = { };
546
547 if (!psczAppId || !*psczAppId || !**psczAppId)
548 {
549 if (pExistingSniSslSet)
550 {
551 hr = StringFromGuid(pExistingSniSslSet->ParamDesc.AppId, psczAppId);
552 ExitOnFailure(hr, "Failed to ensure AppId guid");
553 }
554 else
555 {
556 rs = ::UuidCreate(&guid);
557 hr = HRESULT_FROM_RPC(rs);
558 ExitOnRootFailure(hr, "Failed to create guid for AppId");
559
560 hr = StringFromGuid(guid, psczAppId);
561 ExitOnFailure(hr, "Failed to ensure AppId guid");
562 }
563 }
564
565LExit:
566 return hr;
567}
568
569static HRESULT StringFromGuid(
570 __in REFGUID rguid,
571 __inout_z LPWSTR* psczGuid
572)
573{
574 HRESULT hr = S_OK;
575 WCHAR wzGuid[39];
576
577 if (!::StringFromGUID2(rguid, wzGuid, countof(wzGuid)))
578 {
579 hr = E_OUTOFMEMORY;
580 ExitOnRootFailure(hr, "Failed to convert guid into string");
581 }
582
583 hr = StrAllocString(psczGuid, wzGuid, 0);
584 ExitOnFailure(hr, "Failed to copy guid");
585
586LExit:
587 return hr;
588}
589
590static HRESULT AddSniSslCert(
591 __in_z LPCWSTR /*wzId*/,
592 __in_z LPWSTR wzHost,
593 __in int iPort,
594 __in BYTE rgbCertificateThumbprint[],
595 __in DWORD cbCertificateThumbprint,
596 __in GUID* pAppId,
597 __in_z LPWSTR wzSslCertStore
598)
599{
600 HRESULT hr = S_OK;
601 DWORD er = ERROR_SUCCESS;
602 HTTP_SERVICE_CONFIG_SSL_SNI_SET set = { };
603
604 SetSniSslCertSetKey(&set.KeyDesc, wzHost, iPort);
605 set.ParamDesc.SslHashLength = cbCertificateThumbprint;
606 set.ParamDesc.pSslHash = rgbCertificateThumbprint;
607 set.ParamDesc.AppId = *pAppId;
608 set.ParamDesc.pSslCertStoreName = wzSslCertStore;
609
610 er = ::HttpSetServiceConfiguration(NULL, HttpServiceConfigSslSniCertInfo, &set, sizeof(set), NULL);
611 if (ERROR_ALREADY_EXISTS == er)
612 {
613 hr = S_FALSE;
614 }
615 else
616 {
617 hr = HRESULT_FROM_WIN32(er);
618 }
619
620 return hr;
621}
622
623static HRESULT GetSniSslCert(
624 __in_z LPWSTR wzHost,
625 __in int nPort,
626 __out HTTP_SERVICE_CONFIG_SSL_SNI_SET** ppSet
627)
628{
629 HRESULT hr = S_OK;
630 DWORD er = ERROR_SUCCESS;
631 HTTP_SERVICE_CONFIG_SSL_SNI_QUERY query = { };
632 HTTP_SERVICE_CONFIG_SSL_SNI_SET* pSet = NULL;
633 ULONG cbSet = 0;
634
635 *ppSet = NULL;
636
637 query.QueryDesc = HttpServiceConfigQueryExact;
638 SetSniSslCertSetKey(&query.KeyDesc, wzHost, nPort);
639
640 er = ::HttpQueryServiceConfiguration(NULL, HttpServiceConfigSslSniCertInfo, &query, sizeof(query), pSet, cbSet, &cbSet, NULL);
641 if (ERROR_INSUFFICIENT_BUFFER == er)
642 {
643 pSet = reinterpret_cast<HTTP_SERVICE_CONFIG_SSL_SNI_SET*>(MemAlloc(cbSet, TRUE));
644 ExitOnNull(pSet, hr, E_OUTOFMEMORY, "Failed to allocate query SN SSL certificate buffer");
645
646 er = ::HttpQueryServiceConfiguration(NULL, HttpServiceConfigSslSniCertInfo, &query, sizeof(query), pSet, cbSet, &cbSet, NULL);
647 }
648
649 if (ERROR_SUCCESS == er)
650 {
651 *ppSet = pSet;
652 pSet = NULL;
653 }
654 else if (ERROR_FILE_NOT_FOUND == er)
655 {
656 hr = S_FALSE;
657 }
658 else
659 {
660 hr = HRESULT_FROM_WIN32(er);
661 }
662
663LExit:
664 ReleaseMem(pSet);
665
666 return hr;
667}
668
669static HRESULT RemoveSniSslCert(
670 __in_z LPCWSTR /*wzId*/,
671 __in_z LPWSTR wzHost,
672 __in int iPort
673)
674{
675 HRESULT hr = S_OK;
676 DWORD er = ERROR_SUCCESS;
677 HTTP_SERVICE_CONFIG_SSL_SNI_SET set = { };
678
679 SetSniSslCertSetKey(&set.KeyDesc, wzHost, iPort);
680
681 er = ::HttpDeleteServiceConfiguration(NULL, HttpServiceConfigSslSniCertInfo, &set, sizeof(set), NULL);
682 if (ERROR_FILE_NOT_FOUND == er)
683 {
684 hr = S_FALSE;
685 }
686 else
687 {
688 hr = HRESULT_FROM_WIN32(er);
689 }
690
691 return hr;
692}
693
694static void SetSniSslCertSetKey(
695 __in HTTP_SERVICE_CONFIG_SSL_SNI_KEY* pKey,
696 __in_z LPWSTR wzHost,
697 __in int iPort
698)
699{
700 pKey->Host = wzHost;
701 SOCKADDR_IN* pss = reinterpret_cast<SOCKADDR_IN*>(&pKey->IpPort);
702 pss->sin_family = AF_INET;
703 pss->sin_port = htons(static_cast<USHORT>(iPort));
704}
diff --git a/src/ext/Http/ca/wixhttpca.cpp b/src/ext/Http/ca/wixhttpca.cpp
new file mode 100644
index 00000000..8c846ffc
--- /dev/null
+++ b/src/ext/Http/ca/wixhttpca.cpp
@@ -0,0 +1,530 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3#include "precomp.h"
4
5static HRESULT AppendUrlAce(
6 __in LPWSTR wzSecurityPrincipal,
7 __in int iRights,
8 __in LPWSTR* psczSDDL
9 );
10static HRESULT WriteHttpUrlReservation(
11 __in WCA_TODO action,
12 __in LPWSTR wzUrl,
13 __in LPWSTR wzSDDL,
14 __in int iHandleExisting,
15 __in LPWSTR* psczCustomActionData
16 );
17static HRESULT AddUrlReservation(
18 __in LPWSTR wzUrl,
19 __in LPWSTR wzSddl
20 );
21static HRESULT GetUrlReservation(
22 __in LPWSTR wzUrl,
23 __deref_out_z LPWSTR* psczSddl
24 );
25static HRESULT RemoveUrlReservation(
26 __in LPWSTR wzUrl
27 );
28
29HTTPAPI_VERSION vcHttpVersion = HTTPAPI_VERSION_1;
30ULONG vcHttpFlags = HTTP_INITIALIZE_CONFIG;
31
32LPCWSTR vcsHttpUrlReservationQuery =
33 L"SELECT `Wix4HttpUrlReservation`.`Wix4HttpUrlReservation`, `Wix4HttpUrlReservation`.`HandleExisting`, `Wix4HttpUrlReservation`.`Sddl`, `Wix4HttpUrlReservation`.`Url`, `Wix4HttpUrlReservation`.`Component_` "
34 L"FROM `Wix4HttpUrlReservation`";
35enum eHttpUrlReservationQuery { hurqId = 1, hurqHandleExisting, hurqSDDL, hurqUrl, hurqComponent };
36
37LPCWSTR vcsHttpUrlAceQuery =
38 L"SELECT `Wix4HttpUrlAce`.`SecurityPrincipal`, `Wix4HttpUrlAce`.`Rights` "
39 L"FROM `Wix4HttpUrlAce` "
40 L"WHERE `Wix4HttpUrlAce`.`Wix4HttpUrlReservation_`=?";
41enum eHttpUrlAceQuery { huaqSecurityPrincipal = 1, huaqRights };
42
43/******************************************************************
44 SchedHttpUrlReservations - immediate custom action worker to
45 prepare configuring URL reservations.
46
47********************************************************************/
48static UINT SchedHttpUrlReservations(
49 __in MSIHANDLE hInstall,
50 __in WCA_TODO todoSched
51 )
52{
53 HRESULT hr = S_OK;
54 UINT er = ERROR_SUCCESS;
55 BOOL fAceTableExists = FALSE;
56 BOOL fHttpInitialized = FALSE;
57 DWORD cUrlReservations = 0;
58
59 PMSIHANDLE hView = NULL;
60 PMSIHANDLE hRec = NULL;
61 PMSIHANDLE hQueryReq = NULL;
62 PMSIHANDLE hAceView = NULL;
63
64 LPWSTR sczCustomActionData = NULL;
65 LPWSTR sczRollbackCustomActionData = NULL;
66
67 LPWSTR sczId = NULL;
68 LPWSTR sczComponent = NULL;
69 WCA_TODO todoComponent = WCA_TODO_UNKNOWN;
70 LPWSTR sczUrl = NULL;
71 LPWSTR sczSecurityPrincipal = NULL;
72 int iRights = 0;
73 int iHandleExisting = 0;
74
75 LPWSTR sczExistingSDDL = NULL;
76 LPWSTR sczSDDL = NULL;
77
78 // Initialize.
79 hr = WcaInitialize(hInstall, "SchedHttpUrlReservations");
80 ExitOnFailure(hr, "Failed to initialize.");
81
82 // Anything to do?
83 hr = WcaTableExists(L"Wix4HttpUrlReservation");
84 ExitOnFailure(hr, "Failed to check if the Wix4HttpUrlReservation table exists.");
85 if (S_FALSE == hr)
86 {
87 WcaLog(LOGMSG_STANDARD, "Wix4HttpUrlReservation table doesn't exist, so there are no URL reservations to configure.");
88 ExitFunction();
89 }
90
91 hr = WcaTableExists(L"Wix4HttpUrlAce");
92 ExitOnFailure(hr, "Failed to check if the Wix4HttpUrlAce table exists.");
93 fAceTableExists = S_OK == hr;
94
95 // Query and loop through all the URL reservations.
96 hr = WcaOpenExecuteView(vcsHttpUrlReservationQuery, &hView);
97 ExitOnFailure(hr, "Failed to open view on the Wix4HttpUrlReservation table.");
98
99 hr = HRESULT_FROM_WIN32(::HttpInitialize(vcHttpVersion, vcHttpFlags, NULL));
100 ExitOnFailure(hr, "Failed to initialize HTTP Server configuration.");
101
102 fHttpInitialized = TRUE;
103
104 while (S_OK == (hr = WcaFetchRecord(hView, &hRec)))
105 {
106 hr = WcaGetRecordString(hRec, hurqId, &sczId);
107 ExitOnFailure(hr, "Failed to get Wix4HttpUrlReservation.Wix4HttpUrlReservation");
108
109 hr = WcaGetRecordString(hRec, hurqComponent, &sczComponent);
110 ExitOnFailure(hr, "Failed to get Wix4HttpUrlReservation.Component_");
111
112 // Figure out what we're doing for this reservation, treating reinstall the same as install.
113 todoComponent = WcaGetComponentToDo(sczComponent);
114 if ((WCA_TODO_REINSTALL == todoComponent ? WCA_TODO_INSTALL : todoComponent) != todoSched)
115 {
116 WcaLog(LOGMSG_STANDARD, "Component '%ls' action state (%d) doesn't match request (%d) for UrlReservation '%ls'.", sczComponent, todoComponent, todoSched, sczId);
117 continue;
118 }
119
120 hr = WcaGetRecordFormattedString(hRec, hurqUrl, &sczUrl);
121 ExitOnFailure(hr, "Failed to get Wix4HttpUrlReservation.Url");
122
123 hr = WcaGetRecordInteger(hRec, hurqHandleExisting, &iHandleExisting);
124 ExitOnFailure(hr, "Failed to get Wix4HttpUrlReservation.HandleExisting");
125
126 if (::MsiRecordIsNull(hRec, hurqSDDL))
127 {
128 hr = StrAllocString(&sczSDDL, L"D:", 2);
129 ExitOnFailure(hr, "Failed to allocate SDDL string.");
130
131 // Skip creating the SDDL on uninstall, since it's never used and the lookup(s) could fail.
132 if (fAceTableExists && WCA_TODO_UNINSTALL != todoComponent)
133 {
134 hQueryReq = ::MsiCreateRecord(1);
135 hr = WcaSetRecordString(hQueryReq, 1, sczId);
136 ExitOnFailure(hr, "Failed to create record for querying Wix4HttpUrlAce table for reservation %ls", sczId);
137
138 hr = WcaOpenView(vcsHttpUrlAceQuery, &hAceView);
139 ExitOnFailure(hr, "Failed to open view on Wix4HttpUrlAce table for reservation %ls", sczId);
140 hr = WcaExecuteView(hAceView, hQueryReq);
141 ExitOnFailure(hr, "Failed to execute view on Wix4HttpUrlAce table for reservation %ls", sczId);
142
143 while (S_OK == (hr = WcaFetchRecord(hAceView, &hRec)))
144 {
145 hr = WcaGetRecordFormattedString(hRec, huaqSecurityPrincipal, &sczSecurityPrincipal);
146 ExitOnFailure(hr, "Failed to get Wix4HttpUrlAce.SecurityPrincipal");
147
148 hr = WcaGetRecordInteger(hRec, huaqRights, &iRights);
149 ExitOnFailure(hr, "Failed to get Wix4HttpUrlAce.Rights");
150
151 hr = AppendUrlAce(sczSecurityPrincipal, iRights, &sczSDDL);
152 ExitOnFailure(hr, "Failed to append URL ACE.");
153 }
154
155 if (E_NOMOREITEMS == hr)
156 {
157 hr = S_OK;
158 }
159 ExitOnFailure(hr, "Failed to enumerate selected rows from Wix4HttpUrlAce table.");
160 }
161 }
162 else
163 {
164 hr = WcaGetRecordFormattedString(hRec, hurqSDDL, &sczSDDL);
165 ExitOnFailure(hr, "Failed to get Wix4HttpUrlReservation.SDDL");
166 }
167
168 hr = GetUrlReservation(sczUrl, &sczExistingSDDL);
169 ExitOnFailure(hr, "Failed to get the existing SDDL for %ls", sczUrl);
170
171 hr = WriteHttpUrlReservation(todoComponent, sczUrl, sczExistingSDDL ? sczExistingSDDL : L"", iHandleExisting, &sczRollbackCustomActionData);
172 ExitOnFailure(hr, "Failed to write URL Reservation to rollback custom action data.");
173
174 hr = WriteHttpUrlReservation(todoComponent, sczUrl, sczSDDL, iHandleExisting, &sczCustomActionData);
175 ExitOnFailure(hr, "Failed to write URL reservation to custom action data.");
176 ++cUrlReservations;
177 }
178
179 // Reaching the end of the list is not an error.
180 if (E_NOMOREITEMS == hr)
181 {
182 hr = S_OK;
183 }
184 ExitOnFailure(hr, "Failure occurred while processing Wix4HttpUrlReservation table.");
185
186 // Schedule ExecHttpUrlReservations if there's anything to do.
187 if (cUrlReservations)
188 {
189 WcaLog(LOGMSG_STANDARD, "Scheduling URL reservations (%ls)", sczCustomActionData);
190 WcaLog(LOGMSG_STANDARD, "Scheduling rollback URL reservations (%ls)", sczRollbackCustomActionData);
191
192 if (WCA_TODO_INSTALL == todoSched)
193 {
194 hr = WcaDoDeferredAction(CUSTOM_ACTION_DECORATION(L"WixRollbackHttpUrlReservationsInstall"), sczRollbackCustomActionData, cUrlReservations * COST_HTTP_URL_ACL);
195 ExitOnFailure(hr, "Failed to schedule install URL reservations rollback.");
196 hr = WcaDoDeferredAction(CUSTOM_ACTION_DECORATION(L"WixExecHttpUrlReservationsInstall"), sczCustomActionData, cUrlReservations * COST_HTTP_URL_ACL);
197 ExitOnFailure(hr, "Failed to schedule install URL reservations execution.");
198 }
199 else
200 {
201 hr = WcaDoDeferredAction(CUSTOM_ACTION_DECORATION(L"WixRollbackHttpUrlReservationsUninstall"), sczRollbackCustomActionData, cUrlReservations * COST_HTTP_URL_ACL);
202 ExitOnFailure(hr, "Failed to schedule uninstall URL reservations rollback.");
203 hr = WcaDoDeferredAction(CUSTOM_ACTION_DECORATION(L"WixExecHttpUrlReservationsUninstall"), sczCustomActionData, cUrlReservations * COST_HTTP_URL_ACL);
204 ExitOnFailure(hr, "Failed to schedule uninstall URL reservations execution.");
205 }
206 }
207 else
208 {
209 WcaLog(LOGMSG_STANDARD, "No URL reservations scheduled.");
210 }
211
212LExit:
213 ReleaseStr(sczSDDL);
214 ReleaseStr(sczExistingSDDL);
215 ReleaseStr(sczSecurityPrincipal);
216 ReleaseStr(sczUrl)
217 ReleaseStr(sczComponent);
218 ReleaseStr(sczId);
219 ReleaseStr(sczRollbackCustomActionData);
220 ReleaseStr(sczCustomActionData);
221
222 if (fHttpInitialized)
223 {
224 ::HttpTerminate(vcHttpFlags, NULL);
225 }
226
227 return WcaFinalize(er = FAILED(hr) ? ERROR_INSTALL_FAILURE : er);
228}
229
230static HRESULT AppendUrlAce(
231 __in LPWSTR wzSecurityPrincipal,
232 __in int iRights,
233 __in LPWSTR* psczSDDL
234 )
235{
236 HRESULT hr = S_OK;
237 LPCWSTR wzSid = NULL;
238 LPWSTR sczSid = NULL;
239
240 Assert(wzSecurityPrincipal && *wzSecurityPrincipal);
241 Assert(psczSDDL && *psczSDDL);
242
243 // As documented in the xsd, if the first char is '*', then the rest of the string is a SID string, e.g. *S-1-5-18.
244 if (L'*' == wzSecurityPrincipal[0])
245 {
246 wzSid = &wzSecurityPrincipal[1];
247 }
248 else
249 {
250 hr = AclGetAccountSidStringEx(NULL, wzSecurityPrincipal, &sczSid);
251 ExitOnFailure(hr, "Failed to lookup the SID for account %ls", wzSecurityPrincipal);
252
253 wzSid = sczSid;
254 }
255
256 hr = StrAllocFormatted(psczSDDL, L"%ls(A;;%#x;;;%ls)", *psczSDDL, iRights, wzSid);
257
258LExit:
259 ReleaseStr(sczSid);
260
261 return hr;
262}
263
264static HRESULT WriteHttpUrlReservation(
265 __in WCA_TODO action,
266 __in LPWSTR wzUrl,
267 __in LPWSTR wzSDDL,
268 __in int iHandleExisting,
269 __in LPWSTR* psczCustomActionData
270 )
271{
272 HRESULT hr = S_OK;
273
274 hr = WcaWriteIntegerToCaData(action, psczCustomActionData);
275 ExitOnFailure(hr, "Failed to write action to custom action data.");
276
277 hr = WcaWriteStringToCaData(wzUrl, psczCustomActionData);
278 ExitOnFailure(hr, "Failed to write URL to custom action data.");
279
280 hr = WcaWriteStringToCaData(wzSDDL, psczCustomActionData);
281 ExitOnFailure(hr, "Failed to write SDDL to custom action data.");
282
283 hr = WcaWriteIntegerToCaData(iHandleExisting, psczCustomActionData);
284 ExitOnFailure(hr, "Failed to write HandleExisting to custom action data.")
285
286LExit:
287 return hr;
288}
289
290/******************************************************************
291 SchedHttpUrlReservationsInstall - immediate custom action entry
292 point to prepare adding URL reservations.
293
294********************************************************************/
295extern "C" UINT __stdcall SchedHttpUrlReservationsInstall(
296 __in MSIHANDLE hInstall
297 )
298{
299 return SchedHttpUrlReservations(hInstall, WCA_TODO_INSTALL);
300}
301
302/******************************************************************
303 SchedHttpUrlReservationsUninstall - immediate custom action entry
304 point to prepare removing URL reservations.
305
306********************************************************************/
307extern "C" UINT __stdcall SchedHttpUrlReservationsUninstall(
308 __in MSIHANDLE hInstall
309 )
310{
311 return SchedHttpUrlReservations(hInstall, WCA_TODO_UNINSTALL);
312}
313
314/******************************************************************
315 ExecHttpUrlReservations - deferred custom action entry point to
316 register and remove URL reservations.
317
318********************************************************************/
319extern "C" UINT __stdcall ExecHttpUrlReservations(
320 __in MSIHANDLE hInstall
321 )
322{
323 HRESULT hr = S_OK;
324 BOOL fHttpInitialized = FALSE;
325 LPWSTR sczCustomActionData = NULL;
326 LPWSTR wz = NULL;
327 int iTodo = WCA_TODO_UNKNOWN;
328 LPWSTR sczUrl = NULL;
329 LPWSTR sczSDDL = NULL;
330 eHandleExisting handleExisting = heIgnore;
331 BOOL fRollback = ::MsiGetMode(hInstall, MSIRUNMODE_ROLLBACK);
332 BOOL fRemove = FALSE;
333 BOOL fAdd = FALSE;
334 BOOL fFailOnExisting = FALSE;
335
336 // Initialize.
337 hr = WcaInitialize(hInstall, "ExecHttpUrlReservations");
338 ExitOnFailure(hr, "Failed to initialize.");
339
340 hr = HRESULT_FROM_WIN32(::HttpInitialize(vcHttpVersion, vcHttpFlags, NULL));
341 ExitOnFailure(hr, "Failed to initialize HTTP Server configuration.");
342
343 fHttpInitialized = TRUE;
344
345 hr = WcaGetProperty(L"CustomActionData", &sczCustomActionData);
346 ExitOnFailure(hr, "Failed to get CustomActionData.");
347 WcaLog(LOGMSG_TRACEONLY, "CustomActionData: %ls", sczCustomActionData);
348
349 if (!sczCustomActionData || !*sczCustomActionData)
350 {
351 WcaLog(LOGMSG_STANDARD, "No URL reservations to be executed.");
352 }
353
354 wz = sczCustomActionData;
355 while (wz && *wz)
356 {
357 // Extract the custom action data and if rolling back, swap INSTALL and UNINSTALL.
358 hr = WcaReadIntegerFromCaData(&wz, &iTodo);
359 ExitOnFailure(hr, "Failed to read todo from custom action data.");
360
361 hr = WcaReadStringFromCaData(&wz, &sczUrl);
362 ExitOnFailure(hr, "Failed to read Url from custom action data.");
363
364 hr = WcaReadStringFromCaData(&wz, &sczSDDL);
365 ExitOnFailure(hr, "Failed to read SDDL from custom action data.");
366
367 hr = WcaReadIntegerFromCaData(&wz, reinterpret_cast<int*>(&handleExisting));
368 ExitOnFailure(hr, "Failed to read HandleExisting from custom action data.");
369
370 switch (iTodo)
371 {
372 case WCA_TODO_INSTALL:
373 case WCA_TODO_REINSTALL:
374 fRemove = heReplace == handleExisting || fRollback;
375 fAdd = !fRollback || *sczSDDL;
376 fFailOnExisting = heFail == handleExisting && !fRollback;
377 break;
378
379 case WCA_TODO_UNINSTALL:
380 fRemove = !fRollback;
381 fAdd = fRollback && *sczSDDL;
382 fFailOnExisting = FALSE;
383 break;
384 }
385
386 if (fRemove)
387 {
388 WcaLog(LOGMSG_STANDARD, "Removing reservation for URL '%ls'", sczUrl);
389 hr = RemoveUrlReservation(sczUrl);
390 if (FAILED(hr))
391 {
392 if (fRollback)
393 {
394 WcaLogError(hr, "Failed to remove reservation for rollback for URL '%ls'", sczUrl);
395 }
396 else
397 {
398 ExitOnFailure(hr, "Failed to remove reservation for URL '%ls'", sczUrl);
399 }
400 }
401 }
402
403 if (fAdd)
404 {
405 WcaLog(LOGMSG_STANDARD, "Adding reservation for URL '%ls' with SDDL '%ls'", sczUrl, sczSDDL);
406 hr = AddUrlReservation(sczUrl, sczSDDL);
407 if (S_FALSE == hr && fFailOnExisting)
408 {
409 hr = HRESULT_FROM_WIN32(ERROR_ALREADY_EXISTS);
410 }
411 if (FAILED(hr))
412 {
413 if (fRollback)
414 {
415 WcaLogError(hr, "Failed to add reservation for rollback for URL '%ls' with SDDL '%ls'", sczUrl, sczSDDL);
416 }
417 else
418 {
419 ExitOnFailure(hr, "Failed to add reservation for URL '%ls' with SDDL '%ls'", sczUrl, sczSDDL);
420 }
421 }
422 }
423 }
424
425LExit:
426 ReleaseStr(sczSDDL);
427 ReleaseStr(sczUrl);
428 ReleaseStr(sczCustomActionData);
429
430 if (fHttpInitialized)
431 {
432 ::HttpTerminate(vcHttpFlags, NULL);
433 }
434
435 return WcaFinalize(FAILED(hr) ? ERROR_INSTALL_FAILURE : ERROR_SUCCESS);
436}
437
438static HRESULT AddUrlReservation(
439 __in LPWSTR wzUrl,
440 __in LPWSTR wzSddl
441 )
442{
443 HRESULT hr = S_OK;
444 DWORD er = ERROR_SUCCESS;
445 HTTP_SERVICE_CONFIG_URLACL_SET set = { };
446
447 set.KeyDesc.pUrlPrefix = wzUrl;
448 set.ParamDesc.pStringSecurityDescriptor = wzSddl;
449
450 er = ::HttpSetServiceConfiguration(NULL, HttpServiceConfigUrlAclInfo, &set, sizeof(set), NULL);
451 if (ERROR_ALREADY_EXISTS == er)
452 {
453 hr = S_FALSE;
454 }
455 else
456 {
457 hr = HRESULT_FROM_WIN32(er);
458 }
459 ExitOnFailure(hr, "Failed to add URL reservation: %ls, ACL: %ls", wzUrl, wzSddl);
460
461LExit:
462 return hr;
463}
464
465static HRESULT GetUrlReservation(
466 __in LPWSTR wzUrl,
467 __deref_out_z LPWSTR* psczSddl
468 )
469{
470 HRESULT hr = S_OK;
471 DWORD er = ERROR_SUCCESS;
472 HTTP_SERVICE_CONFIG_URLACL_QUERY query = { };
473 HTTP_SERVICE_CONFIG_URLACL_SET* pSet = NULL;
474 ULONG cbSet = 0;
475
476 query.QueryDesc = HttpServiceConfigQueryExact;
477 query.KeyDesc.pUrlPrefix = wzUrl;
478
479 er = ::HttpQueryServiceConfiguration(NULL, HttpServiceConfigUrlAclInfo, &query, sizeof(query), pSet, cbSet, &cbSet, NULL);
480 if (ERROR_INSUFFICIENT_BUFFER == er)
481 {
482 pSet = reinterpret_cast<HTTP_SERVICE_CONFIG_URLACL_SET*>(MemAlloc(cbSet, TRUE));
483 ExitOnNull(pSet, hr, E_OUTOFMEMORY, "Failed to allocate query URLACL buffer.");
484
485 er = ::HttpQueryServiceConfiguration(NULL, HttpServiceConfigUrlAclInfo, &query, sizeof(query), pSet, cbSet, &cbSet, NULL);
486 }
487
488 if (ERROR_SUCCESS == er)
489 {
490 hr = StrAllocString(psczSddl, pSet->ParamDesc.pStringSecurityDescriptor, 0);
491 }
492 else if (ERROR_FILE_NOT_FOUND == er)
493 {
494 hr = S_FALSE;
495 }
496 else
497 {
498 hr = HRESULT_FROM_WIN32(er);
499 }
500
501LExit:
502 ReleaseMem(pSet);
503
504 return hr;
505}
506
507static HRESULT RemoveUrlReservation(
508 __in LPWSTR wzUrl
509 )
510{
511 HRESULT hr = S_OK;
512 DWORD er = ERROR_SUCCESS;
513 HTTP_SERVICE_CONFIG_URLACL_SET set = { };
514
515 set.KeyDesc.pUrlPrefix = wzUrl;
516
517 er = ::HttpDeleteServiceConfiguration(NULL, HttpServiceConfigUrlAclInfo, &set, sizeof(set), NULL);
518 if (ERROR_FILE_NOT_FOUND == er)
519 {
520 hr = S_FALSE;
521 }
522 else
523 {
524 hr = HRESULT_FROM_WIN32(er);
525 }
526 ExitOnFailure(hr, "Failed to remove URL reservation: %ls", wzUrl);
527
528LExit:
529 return hr;
530}
diff --git a/src/ext/Http/ca/wixhttpca.def b/src/ext/Http/ca/wixhttpca.def
new file mode 100644
index 00000000..281c5631
--- /dev/null
+++ b/src/ext/Http/ca/wixhttpca.def
@@ -0,0 +1,12 @@
1; Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3
4LIBRARY "httpca"
5
6EXPORTS
7 SchedHttpUrlReservationsInstall
8 SchedHttpUrlReservationsUninstall
9 ExecHttpUrlReservations
10 SchedHttpSniSslCertsInstall
11 SchedHttpSniSslCertsUninstall
12 ExecHttpSniSslCerts
diff --git a/src/ext/Http/nuget.config b/src/ext/Http/nuget.config
new file mode 100644
index 00000000..db7aba29
--- /dev/null
+++ b/src/ext/Http/nuget.config
@@ -0,0 +1,17 @@
1<?xml version="1.0" encoding="utf-8"?>
2<configuration>
3 <packageSources>
4 <clear />
5 <add key="wixtoolset-burn" value="https://ci.appveyor.com/nuget/wixtoolset-burn" />
6 <add key="wixtoolset-data" value="https://ci.appveyor.com/nuget/wixtoolset-data" />
7 <add key="wixtoolset-extensibility" value="https://ci.appveyor.com/nuget/wixtoolset-extensibility" />
8 <add key="wixtoolset-core" value="https://ci.appveyor.com/nuget/wixtoolset-core" />
9 <add key="wixtoolset-core-native" value="https://ci.appveyor.com/nuget/wixtoolset-core-native" />
10 <add key="wixtoolset-dtf" value="https://ci.appveyor.com/nuget/wixtoolset-dtf" />
11 <add key="wixtoolset-dutil" value="https://ci.appveyor.com/nuget/wixtoolset-dutil" />
12 <add key="wixtoolset-wcautil" value="https://ci.appveyor.com/nuget/wixtoolset-wcautil" />
13 <add key="wixtoolset-tools" value="https://ci.appveyor.com/nuget/wixtoolset-tools" />
14 <add key="wixbuildtools" value="https://ci.appveyor.com/nuget/wixbuildtools" />
15 <add key="api.nuget.org" value="https://api.nuget.org/v3/index.json" protocolVersion="3" />
16 </packageSources>
17</configuration> \ No newline at end of file
diff --git a/src/ext/Http/test/WixToolsetTest.Http/HttpExtensionFixture.cs b/src/ext/Http/test/WixToolsetTest.Http/HttpExtensionFixture.cs
new file mode 100644
index 00000000..40b49327
--- /dev/null
+++ b/src/ext/Http/test/WixToolsetTest.Http/HttpExtensionFixture.cs
@@ -0,0 +1,57 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolsetTest.Http
4{
5 using WixBuildTools.TestSupport;
6 using WixToolset.Core.TestPackage;
7 using WixToolset.Http;
8 using Xunit;
9
10 public class HttpExtensionFixture
11 {
12 [Fact]
13 public void CanBuildUsingSniSssl()
14 {
15 var folder = TestData.Get("TestData", "SniSsl");
16 var build = new Builder(folder, typeof(HttpExtensionFactory), new[] { folder });
17
18 var results = build.BuildAndQuery(Build, "CustomAction", "Wix4HttpSniSslCert");
19 WixAssert.CompareLineByLine(new[]
20 {
21 "CustomAction:Wix4ExecHttpSniSslCertsInstall_X86\t3073\tWix4HttpCA_X86\tExecHttpSniSslCerts\t",
22 "CustomAction:Wix4ExecHttpSniSslCertsUninstall_X86\t3073\tWix4HttpCA_X86\tExecHttpSniSslCerts\t",
23 "CustomAction:Wix4RollbackHttpSniSslCertsInstall_X86\t3329\tWix4HttpCA_X86\tExecHttpSniSslCerts\t",
24 "CustomAction:Wix4RollbackHttpSniSslCertsUninstall_X86\t3329\tWix4HttpCA_X86\tExecHttpSniSslCerts\t",
25 "CustomAction:Wix4SchedHttpSniSslCertsInstall_X86\t1\tWix4HttpCA_X86\tSchedHttpSniSslCertsInstall\t",
26 "CustomAction:Wix4SchedHttpSniSslCertsUninstall_X86\t1\tWix4HttpCA_X86\tSchedHttpSniSslCertsUninstall\t",
27 "Wix4HttpSniSslCert:sslC9YX6_H7UL_WGBx4DoDGI.Sj.D0\texample.com\t8080\t[SOME_THUMBPRINT]\t\t\t2\tfilF5_pLhBuF5b4N9XEo52g_hUM5Lo",
28 }, results);
29 }
30
31 [Fact]
32 public void CanBuildUsingUrlReservation()
33 {
34 var folder = TestData.Get(@"TestData\UsingUrlReservation");
35 var build = new Builder(folder, typeof(HttpExtensionFactory), new[] { folder });
36
37 var results = build.BuildAndQuery(Build, "CustomAction", "Wix4HttpUrlAce", "Wix4HttpUrlReservation");
38 WixAssert.CompareLineByLine(new[]
39 {
40 "CustomAction:Wix4ExecHttpUrlReservationsInstall_X86\t3073\tWix4HttpCA_X86\tExecHttpUrlReservations\t",
41 "CustomAction:Wix4ExecHttpUrlReservationsUninstall_X86\t3073\tWix4HttpCA_X86\tExecHttpUrlReservations\t",
42 "CustomAction:Wix4RollbackHttpUrlReservationsInstall_X86\t3329\tWix4HttpCA_X86\tExecHttpUrlReservations\t",
43 "CustomAction:Wix4RollbackHttpUrlReservationsUninstall_X86\t3329\tWix4HttpCA_X86\tExecHttpUrlReservations\t",
44 "CustomAction:Wix4SchedHttpUrlReservationsInstall_X86\t1\tWix4HttpCA_X86\tSchedHttpUrlReservationsInstall\t",
45 "CustomAction:Wix4SchedHttpUrlReservationsUninstall_X86\t1\tWix4HttpCA_X86\tSchedHttpUrlReservationsUninstall\t",
46 "Wix4HttpUrlAce:aceu5os2gQoblRmzwjt85LQf997uD4\turlO23FkY2xzEY54lY6E6sXFW6glXc\tNT SERVICE\\TestService\t268435456",
47 "Wix4HttpUrlReservation:urlO23FkY2xzEY54lY6E6sXFW6glXc\t0\t\thttp://+:80/vroot/\tfilF5_pLhBuF5b4N9XEo52g_hUM5Lo",
48 }, results);
49 }
50
51 private static void Build(string[] args)
52 {
53 var result = WixRunner.Execute(args)
54 .AssertSuccess();
55 }
56 }
57}
diff --git a/src/ext/Http/test/WixToolsetTest.Http/TestData/SniSsl/Package.en-us.wxl b/src/ext/Http/test/WixToolsetTest.Http/TestData/SniSsl/Package.en-us.wxl
new file mode 100644
index 00000000..38c12ac1
--- /dev/null
+++ b/src/ext/Http/test/WixToolsetTest.Http/TestData/SniSsl/Package.en-us.wxl
@@ -0,0 +1,11 @@
1<?xml version="1.0" encoding="utf-8"?>
2
3<!--
4This file contains the declaration of all the localizable strings.
5-->
6<WixLocalization xmlns="http://wixtoolset.org/schemas/v4/wxl" Culture="en-US">
7
8 <String Id="DowngradeError">A newer version of [ProductName] is already installed.</String>
9 <String Id="FeatureTitle">MsiPackage</String>
10
11</WixLocalization>
diff --git a/src/ext/Http/test/WixToolsetTest.Http/TestData/SniSsl/Package.wxs b/src/ext/Http/test/WixToolsetTest.Http/TestData/SniSsl/Package.wxs
new file mode 100644
index 00000000..c85e9bba
--- /dev/null
+++ b/src/ext/Http/test/WixToolsetTest.Http/TestData/SniSsl/Package.wxs
@@ -0,0 +1,15 @@
1<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
2 <Package Name="MsiPackage" Version="1.0.0.0" Manufacturer="Example Corporation" UpgradeCode="047730a5-30fe-4a62-a520-da9381b8226a">
3 <MajorUpgrade DowngradeErrorMessage="!(loc.DowngradeError)" />
4
5 <Feature Id="ProductFeature" Title="!(loc.FeatureTitle)">
6 <ComponentGroupRef Id="ProductComponents" />
7 </Feature>
8 </Package>
9
10 <Fragment>
11 <StandardDirectory Id="ProgramFilesFolder">
12 <Directory Id="INSTALLFOLDER" Name="MsiPackage" />
13 </StandardDirectory>
14 </Fragment>
15</Wix>
diff --git a/src/ext/Http/test/WixToolsetTest.Http/TestData/SniSsl/PackageComponents.wxs b/src/ext/Http/test/WixToolsetTest.Http/TestData/SniSsl/PackageComponents.wxs
new file mode 100644
index 00000000..f0aae485
--- /dev/null
+++ b/src/ext/Http/test/WixToolsetTest.Http/TestData/SniSsl/PackageComponents.wxs
@@ -0,0 +1,12 @@
1<?xml version="1.0" encoding="utf-8"?>
2<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs"
3 xmlns:http="http://wixtoolset.org/schemas/v4/wxs/http">
4 <Fragment>
5 <ComponentGroup Id="ProductComponents" Directory="INSTALLFOLDER">
6 <Component>
7 <File Source="example.txt" />
8 <http:SniSslCertificate Host="example.com" Port="8080" Thumbprint="[SOME_THUMBPRINT]" HandleExisting="fail" />
9 </Component>
10 </ComponentGroup>
11 </Fragment>
12</Wix>
diff --git a/src/ext/Http/test/WixToolsetTest.Http/TestData/SniSsl/example.txt b/src/ext/Http/test/WixToolsetTest.Http/TestData/SniSsl/example.txt
new file mode 100644
index 00000000..1b4ffe8a
--- /dev/null
+++ b/src/ext/Http/test/WixToolsetTest.Http/TestData/SniSsl/example.txt
@@ -0,0 +1 @@
This is example.txt. \ No newline at end of file
diff --git a/src/ext/Http/test/WixToolsetTest.Http/TestData/UsingUrlReservation/Package.en-us.wxl b/src/ext/Http/test/WixToolsetTest.Http/TestData/UsingUrlReservation/Package.en-us.wxl
new file mode 100644
index 00000000..38c12ac1
--- /dev/null
+++ b/src/ext/Http/test/WixToolsetTest.Http/TestData/UsingUrlReservation/Package.en-us.wxl
@@ -0,0 +1,11 @@
1<?xml version="1.0" encoding="utf-8"?>
2
3<!--
4This file contains the declaration of all the localizable strings.
5-->
6<WixLocalization xmlns="http://wixtoolset.org/schemas/v4/wxl" Culture="en-US">
7
8 <String Id="DowngradeError">A newer version of [ProductName] is already installed.</String>
9 <String Id="FeatureTitle">MsiPackage</String>
10
11</WixLocalization>
diff --git a/src/ext/Http/test/WixToolsetTest.Http/TestData/UsingUrlReservation/Package.wxs b/src/ext/Http/test/WixToolsetTest.Http/TestData/UsingUrlReservation/Package.wxs
new file mode 100644
index 00000000..bd31e81f
--- /dev/null
+++ b/src/ext/Http/test/WixToolsetTest.Http/TestData/UsingUrlReservation/Package.wxs
@@ -0,0 +1,15 @@
1<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
2 <Package Name="MsiPackage" Language="1033" Version="1.0.0.0" Manufacturer="Example Corporation" UpgradeCode="047730a5-30fe-4a62-a520-da9381b8226a" InstallerVersion="200">
3 <MajorUpgrade DowngradeErrorMessage="!(loc.DowngradeError)" />
4
5 <Feature Id="ProductFeature" Title="!(loc.FeatureTitle)">
6 <ComponentGroupRef Id="ProductComponents" />
7 </Feature>
8 </Package>
9
10 <Fragment>
11 <StandardDirectory Id="ProgramFilesFolder">
12 <Directory Id="INSTALLFOLDER" Name="MsiPackage" />
13 </StandardDirectory>
14 </Fragment>
15</Wix>
diff --git a/src/ext/Http/test/WixToolsetTest.Http/TestData/UsingUrlReservation/PackageComponents.wxs b/src/ext/Http/test/WixToolsetTest.Http/TestData/UsingUrlReservation/PackageComponents.wxs
new file mode 100644
index 00000000..780d598b
--- /dev/null
+++ b/src/ext/Http/test/WixToolsetTest.Http/TestData/UsingUrlReservation/PackageComponents.wxs
@@ -0,0 +1,16 @@
1<?xml version="1.0" encoding="utf-8"?>
2<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs"
3 xmlns:http="http://wixtoolset.org/schemas/v4/wxs/http">
4 <Fragment>
5 <ComponentGroup Id="ProductComponents" Directory="INSTALLFOLDER">
6 <Component>
7 <File Source="example.txt" />
8 <ServiceInstall Name="TestService" Type="ownProcess" Start="auto" ErrorControl="ignore">
9 <http:UrlReservation Url="http://+:80/vroot/">
10 <http:UrlAce Rights="all" />
11 </http:UrlReservation>
12 </ServiceInstall>
13 </Component>
14 </ComponentGroup>
15 </Fragment>
16</Wix>
diff --git a/src/ext/Http/test/WixToolsetTest.Http/TestData/UsingUrlReservation/example.txt b/src/ext/Http/test/WixToolsetTest.Http/TestData/UsingUrlReservation/example.txt
new file mode 100644
index 00000000..1b4ffe8a
--- /dev/null
+++ b/src/ext/Http/test/WixToolsetTest.Http/TestData/UsingUrlReservation/example.txt
@@ -0,0 +1 @@
This is example.txt. \ No newline at end of file
diff --git a/src/ext/Http/test/WixToolsetTest.Http/WixToolsetTest.Http.csproj b/src/ext/Http/test/WixToolsetTest.Http/WixToolsetTest.Http.csproj
new file mode 100644
index 00000000..7e60e426
--- /dev/null
+++ b/src/ext/Http/test/WixToolsetTest.Http/WixToolsetTest.Http.csproj
@@ -0,0 +1,38 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3
4<Project Sdk="Microsoft.NET.Sdk">
5 <PropertyGroup>
6 <TargetFramework>netcoreapp3.1</TargetFramework>
7 <IsPackable>false</IsPackable>
8 </PropertyGroup>
9
10 <PropertyGroup>
11 <NoWarn>NU1701</NoWarn>
12 </PropertyGroup>
13
14 <ItemGroup>
15 <Content Include="TestData\**" CopyToOutputDirectory="PreserveNewest" />
16 </ItemGroup>
17
18 <ItemGroup>
19 <ProjectReference Include="..\..\wixext\WixToolset.Http.wixext.csproj" />
20 </ItemGroup>
21
22 <ItemGroup>
23 <PackageReference Include="WixToolset.Core" Version="4.0.*" />
24 <PackageReference Include="WixToolset.Core.Burn" Version="4.0.*" />
25 <PackageReference Include="WixToolset.Core.WindowsInstaller" Version="4.0.*" />
26 <PackageReference Include="WixToolset.Core.TestPackage" Version="4.0.*" />
27 </ItemGroup>
28
29 <ItemGroup>
30 <PackageReference Include="WixBuildTools.TestSupport" Version="4.0.*" />
31 </ItemGroup>
32
33 <ItemGroup>
34 <PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.3.0" />
35 <PackageReference Include="xunit" Version="2.4.1" />
36 <PackageReference Include="xunit.runner.visualstudio" Version="2.4.1" PrivateAssets="All" />
37 </ItemGroup>
38</Project>
diff --git a/src/ext/Http/wix.snk b/src/ext/Http/wix.snk
new file mode 100644
index 00000000..3908a66a
--- /dev/null
+++ b/src/ext/Http/wix.snk
Binary files differ
diff --git a/src/ext/Http/wixext/HttpCompiler.cs b/src/ext/Http/wixext/HttpCompiler.cs
new file mode 100644
index 00000000..6c572470
--- /dev/null
+++ b/src/ext/Http/wixext/HttpCompiler.cs
@@ -0,0 +1,383 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Http
4{
5 using System;
6 using System.Collections.Generic;
7 using System.Xml.Linq;
8 using WixToolset.Data;
9 using WixToolset.Extensibility;
10 using WixToolset.Extensibility.Data;
11 using WixToolset.Http.Symbols;
12
13 /// <summary>
14 /// The compiler for the WiX Toolset Http Extension.
15 /// </summary>
16 public sealed class HttpCompiler : BaseCompilerExtension
17 {
18 public override XNamespace Namespace => "http://wixtoolset.org/schemas/v4/wxs/http";
19
20 /// <summary>
21 /// Processes an element for the Compiler.
22 /// </summary>
23 /// <param name="sourceLineNumbers">Source line number for the parent element.</param>
24 /// <param name="parentElement">Parent element of element to process.</param>
25 /// <param name="element">Element to process.</param>
26 /// <param name="contextValues">Extra information about the context in which this element is being parsed.</param>
27 public override void ParseElement(Intermediate intermediate, IntermediateSection section, XElement parentElement, XElement element, IDictionary<string, string> context)
28 {
29 switch (parentElement.Name.LocalName)
30 {
31 case "ServiceInstall":
32 var serviceInstallName = context["ServiceInstallName"];
33 var serviceUser = String.IsNullOrEmpty(serviceInstallName) ? null : String.Concat("NT SERVICE\\", serviceInstallName);
34 var serviceComponentId = context["ServiceInstallComponentId"];
35
36 switch (element.Name.LocalName)
37 {
38 case "UrlReservation":
39 this.ParseUrlReservationElement(intermediate, section, element, serviceComponentId, serviceUser);
40 break;
41 default:
42 this.ParseHelper.UnexpectedElement(parentElement, element);
43 break;
44 }
45 break;
46 case "Component":
47 string componentId = context["ComponentId"];
48
49 switch (element.Name.LocalName)
50 {
51 case "SniSslCertificate":
52 this.ParseSniSslCertificateElement(intermediate, section, element, componentId);
53 break;
54
55 case "UrlReservation":
56 this.ParseUrlReservationElement(intermediate, section, element, componentId, null);
57 break;
58 default:
59 this.ParseHelper.UnexpectedElement(parentElement, element);
60 break;
61 }
62 break;
63 default:
64 this.ParseHelper.UnexpectedElement(parentElement, element);
65 break;
66 }
67 }
68
69 /// <summary>
70 /// Parses a SniSsl element.
71 /// </summary>
72 /// <param name="node">The element to parse.</param>
73 /// <param name="componentId">Identifier of the component that owns this SNI SSL Certificate.</param>
74 private void ParseSniSslCertificateElement(Intermediate intermediate, IntermediateSection section, XElement node, string componentId)
75 {
76 var sourceLineNumbers = this.ParseHelper.GetSourceLineNumbers(node);
77 Identifier id = null;
78 string host = null;
79 string port = null;
80 string appId = null;
81 string store = null;
82 string thumbprint = null;
83 var handleExisting = HandleExisting.Replace;
84 string handleExistingValue = null;
85
86 foreach (var attrib in node.Attributes())
87 {
88 if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || this.Namespace == attrib.Name.Namespace)
89 {
90 switch (attrib.Name.LocalName)
91 {
92 case "Id":
93 id = this.ParseHelper.GetAttributeIdentifier(sourceLineNumbers, attrib);
94 break;
95 case "AppId":
96 appId = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
97 break;
98 case "HandleExisting":
99 handleExistingValue = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
100 switch (handleExistingValue)
101 {
102 case "replace":
103 handleExisting = HandleExisting.Replace;
104 break;
105 case "ignore":
106 handleExisting = HandleExisting.Ignore;
107 break;
108 case "fail":
109 handleExisting = HandleExisting.Fail;
110 break;
111 default:
112 this.Messaging.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, node.Name.LocalName, "HandleExisting", handleExistingValue, "replace", "ignore", "fail"));
113 break;
114 }
115 break;
116 case "Host":
117 host = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
118 break;
119 case "Port":
120 port = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
121 break;
122 case "Store":
123 store = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
124 break;
125 case "Thumbprint":
126 thumbprint = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
127 break;
128 default:
129 this.ParseHelper.UnexpectedAttribute(node, attrib);
130 break;
131 }
132 }
133 else
134 {
135 this.ParseHelper.ParseExtensionAttribute(this.Context.Extensions, intermediate, section, node, attrib);
136 }
137 }
138
139 // Need the element ID for child element processing, so generate now if not authored.
140 if (null == id)
141 {
142 id = this.ParseHelper.CreateIdentifier("ssl", componentId, host, port);
143 }
144
145 // Required attributes.
146 if (null == host)
147 {
148 this.Messaging.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, node.Name.LocalName, "Host"));
149 }
150
151 if (null == port)
152 {
153 this.Messaging.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, node.Name.LocalName, "Port"));
154 }
155
156 if (null == thumbprint)
157 {
158 this.Messaging.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, node.Name.LocalName, "Thumbprint"));
159 }
160
161 // Parse unknown children.
162 this.ParseHelper.ParseForExtensionElements(this.Context.Extensions, intermediate, section, node);
163
164 if (!this.Messaging.EncounteredError)
165 {
166 section.AddSymbol(new WixHttpSniSslCertSymbol(sourceLineNumbers, id)
167 {
168 Host = host,
169 Port = port,
170 Thumbprint = thumbprint,
171 AppId = appId,
172 Store = store,
173 HandleExisting = handleExisting,
174 ComponentRef = componentId,
175 });
176
177 this.ParseHelper.CreateCustomActionReference(sourceLineNumbers, section, "Wix4SchedHttpSniSslCertsInstall", this.Context.Platform, CustomActionPlatforms.X86 | CustomActionPlatforms.X64 | CustomActionPlatforms.ARM64);
178 this.ParseHelper.CreateCustomActionReference(sourceLineNumbers, section, "Wix4SchedHttpSniSslCertsUninstall", this.Context.Platform, CustomActionPlatforms.X86 | CustomActionPlatforms.X64 | CustomActionPlatforms.ARM64);
179 }
180 }
181
182 /// <summary>
183 /// Parses a UrlReservation element.
184 /// </summary>
185 /// <param name="node">The element to parse.</param>
186 /// <param name="componentId">Identifier of the component that owns this URL reservation.</param>
187 /// <param name="securityPrincipal">The security principal of the parent element (null if nested under Component).</param>
188 private void ParseUrlReservationElement(Intermediate intermediate, IntermediateSection section, XElement node, string componentId, string securityPrincipal)
189 {
190 var sourceLineNumbers = this.ParseHelper.GetSourceLineNumbers(node);
191 Identifier id = null;
192 var handleExisting = HandleExisting.Replace;
193 string sddl = null;
194 string url = null;
195 var foundACE = false;
196
197 foreach (var attrib in node.Attributes())
198 {
199 if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || this.Namespace == attrib.Name.Namespace)
200 {
201 switch (attrib.Name.LocalName)
202 {
203 case "Id":
204 id = this.ParseHelper.GetAttributeIdentifier(sourceLineNumbers, attrib);
205 break;
206 case "HandleExisting":
207 var handleExistingValue = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
208 switch (handleExistingValue)
209 {
210 case "replace":
211 handleExisting = HandleExisting.Replace;
212 break;
213 case "ignore":
214 handleExisting = HandleExisting.Ignore;
215 break;
216 case "fail":
217 handleExisting = HandleExisting.Fail;
218 break;
219 default:
220 this.Messaging.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, node.Name.LocalName, "HandleExisting", handleExistingValue, "replace", "ignore", "fail"));
221 break;
222 }
223 break;
224 case "Sddl":
225 sddl = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
226 break;
227 case "Url":
228 url = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
229 break;
230 default:
231 this.ParseHelper.UnexpectedAttribute(node, attrib);
232 break;
233 }
234 }
235 else
236 {
237 this.ParseHelper.ParseExtensionAttribute(this.Context.Extensions, intermediate, section, node, attrib);
238 }
239 }
240
241 // Need the element ID for child element processing, so generate now if not authored.
242 if (null == id)
243 {
244 id = this.ParseHelper.CreateIdentifier("url", componentId, securityPrincipal, url);
245 }
246
247 // Parse UrlAce children.
248 foreach (var child in node.Elements())
249 {
250 if (this.Namespace == child.Name.Namespace)
251 {
252 switch (child.Name.LocalName)
253 {
254 case "UrlAce":
255 if (null != sddl)
256 {
257 this.Messaging.Write(ErrorMessages.IllegalParentAttributeWhenNested(sourceLineNumbers, "UrlReservation", "Sddl", "UrlAce"));
258 }
259 else
260 {
261 foundACE = true;
262 this.ParseUrlAceElement(intermediate, section, child, id.Id, securityPrincipal);
263 }
264 break;
265 default:
266 this.ParseHelper.UnexpectedElement(node, child);
267 break;
268 }
269 }
270 else
271 {
272 this.ParseHelper.ParseExtensionElement(this.Context.Extensions, intermediate, section, node, child);
273 }
274 }
275
276 // Url is required.
277 if (null == url)
278 {
279 this.Messaging.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, node.Name.LocalName, "Url"));
280 }
281
282 // Security is required.
283 if (null == sddl && !foundACE)
284 {
285 this.Messaging.Write(HttpErrors.NoSecuritySpecified(sourceLineNumbers));
286 }
287
288 if (!this.Messaging.EncounteredError)
289 {
290 section.AddSymbol(new WixHttpUrlReservationSymbol(sourceLineNumbers, id)
291 {
292 HandleExisting = handleExisting,
293 Sddl = sddl,
294 Url = url,
295 ComponentRef = componentId,
296 });
297
298 this.ParseHelper.CreateCustomActionReference(sourceLineNumbers, section, "Wix4SchedHttpUrlReservationsInstall", this.Context.Platform, CustomActionPlatforms.X86 | CustomActionPlatforms.X64 | CustomActionPlatforms.ARM64);
299 this.ParseHelper.CreateCustomActionReference(sourceLineNumbers, section, "Wix4SchedHttpUrlReservationsUninstall", this.Context.Platform, CustomActionPlatforms.X86 | CustomActionPlatforms.X64 | CustomActionPlatforms.ARM64);
300 }
301 }
302
303 /// <summary>
304 /// Parses a UrlAce element.
305 /// </summary>
306 /// <param name="node">The element to parse.</param>
307 /// <param name="urlReservationId">The URL reservation ID.</param>
308 /// <param name="defaultSecurityPrincipal">The default security principal.</param>
309 private void ParseUrlAceElement(Intermediate intermediate, IntermediateSection section, XElement node, string urlReservationId, string defaultSecurityPrincipal)
310 {
311 var sourceLineNumbers = this.ParseHelper.GetSourceLineNumbers(node);
312 Identifier id = null;
313 var securityPrincipal = defaultSecurityPrincipal;
314 var rights = HttpConstants.GENERIC_ALL;
315 string rightsValue = null;
316
317 foreach (var attrib in node.Attributes())
318 {
319 if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || this.Namespace == attrib.Name.Namespace)
320 {
321 switch (attrib.Name.LocalName)
322 {
323 case "Id":
324 id = this.ParseHelper.GetAttributeIdentifier(sourceLineNumbers, attrib);
325 break;
326 case "SecurityPrincipal":
327 securityPrincipal = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
328 break;
329 case "Rights":
330 rightsValue = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
331 switch (rightsValue)
332 {
333 case "all":
334 rights = HttpConstants.GENERIC_ALL;
335 break;
336 case "delegate":
337 rights = HttpConstants.GENERIC_WRITE;
338 break;
339 case "register":
340 rights = HttpConstants.GENERIC_EXECUTE;
341 break;
342 default:
343 this.Messaging.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, node.Name.LocalName, "Rights", rightsValue, "all", "delegate", "register"));
344 break;
345 }
346 break;
347 default:
348 this.ParseHelper.UnexpectedAttribute(node, attrib);
349 break;
350 }
351 }
352 else
353 {
354 this.ParseHelper.ParseExtensionAttribute(this.Context.Extensions, intermediate, section, node, attrib);
355 }
356 }
357
358 // Generate Id now if not authored.
359 if (null == id)
360 {
361 id = this.ParseHelper.CreateIdentifier("ace", urlReservationId, securityPrincipal, rightsValue);
362 }
363
364 this.ParseHelper.ParseForExtensionElements(this.Context.Extensions, intermediate, section, node);
365
366 // SecurityPrincipal is required.
367 if (null == securityPrincipal)
368 {
369 this.Messaging.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, node.Name.LocalName, "SecurityPrincipal"));
370 }
371
372 if (!this.Messaging.EncounteredError)
373 {
374 section.AddSymbol(new WixHttpUrlAceSymbol(sourceLineNumbers, id)
375 {
376 WixHttpUrlReservationRef = urlReservationId,
377 SecurityPrincipal = securityPrincipal,
378 Rights = rights,
379 });
380 }
381 }
382 }
383}
diff --git a/src/ext/Http/wixext/HttpConstants.cs b/src/ext/Http/wixext/HttpConstants.cs
new file mode 100644
index 00000000..5fb42d86
--- /dev/null
+++ b/src/ext/Http/wixext/HttpConstants.cs
@@ -0,0 +1,15 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Http
4{
5 using System;
6
7 internal static class HttpConstants
8 {
9 // from winnt.h
10 public const int GENERIC_ALL = 0x10000000;
11 public const int GENERIC_EXECUTE = 0x20000000;
12 public const int GENERIC_WRITE = 0x40000000;
13
14 }
15}
diff --git a/src/ext/Http/wixext/HttpDecompiler.cs b/src/ext/Http/wixext/HttpDecompiler.cs
new file mode 100644
index 00000000..8991ec2f
--- /dev/null
+++ b/src/ext/Http/wixext/HttpDecompiler.cs
@@ -0,0 +1,137 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Http
4{
5#if TODO_CONSIDER_DECOMPILER
6 using System;
7 using System.Collections;
8 using System.Diagnostics;
9 using System.Globalization;
10 using WixToolset.Data;
11 using WixToolset.Extensibility;
12 using Http = WixToolset.Extensions.Serialize.Http;
13 using Wix = WixToolset.Data.Serialize;
14
15 /// <summary>
16 /// The decompiler for the WiX Toolset Http Extension.
17 /// </summary>
18 public sealed class HttpDecompiler : DecompilerExtension
19 {
20 /// <summary>
21 /// Creates a decompiler for Http Extension.
22 /// </summary>
23 public HttpDecompiler()
24 {
25 this.TableDefinitions = HttpExtensionData.GetExtensionTableDefinitions();
26 }
27
28 /// <summary>
29 /// Get the extensions library to be removed.
30 /// </summary>
31 /// <param name="tableDefinitions">Table definitions for library.</param>
32 /// <returns>Library to remove from decompiled output.</returns>
33 public override Library GetLibraryToRemove(TableDefinitionCollection tableDefinitions)
34 {
35 return HttpExtensionData.GetExtensionLibrary(tableDefinitions);
36 }
37
38 /// <summary>
39 /// Decompiles an extension table.
40 /// </summary>
41 /// <param name="table">The table to decompile.</param>
42 public override void DecompileTable(Table table)
43 {
44 switch (table.Name)
45 {
46 case "WixHttpUrlReservation":
47 this.DecompileWixHttpUrlReservationTable(table);
48 break;
49 case "WixHttpUrlAce":
50 this.DecompileWixHttpUrlAceTable(table);
51 break;
52 default:
53 base.DecompileTable(table);
54 break;
55 }
56 }
57
58 /// <summary>
59 /// Decompile the WixHttpUrlReservation table.
60 /// </summary>
61 /// <param name="table">The table to decompile.</param>
62 private void DecompileWixHttpUrlReservationTable(Table table)
63 {
64 foreach (Row row in table.Rows)
65 {
66 Http.UrlReservation urlReservation = new Http.UrlReservation();
67 urlReservation.Id = (string)row[0];
68 switch((int)row[1])
69 {
70 case HttpConstants.heReplace:
71 default:
72 urlReservation.HandleExisting = Http.UrlReservation.HandleExistingType.replace;
73 break;
74 case HttpConstants.heIgnore:
75 urlReservation.HandleExisting = Http.UrlReservation.HandleExistingType.ignore;
76 break;
77 case HttpConstants.heFail:
78 urlReservation.HandleExisting = Http.UrlReservation.HandleExistingType.fail;
79 break;
80 }
81 urlReservation.Sddl = (string)row[2];
82 urlReservation.Url = (string)row[3];
83
84 Wix.Component component = (Wix.Component)this.Core.GetIndexedElement("Component", (string)row[4]);
85 if (null != component)
86 {
87 component.AddChild(urlReservation);
88 }
89 else
90 {
91 this.Core.OnMessage(WixWarnings.ExpectedForeignRow(row.SourceLineNumbers, table.Name, row.GetPrimaryKey(DecompilerConstants.PrimaryKeyDelimiter), "Component_", (string)row[2], "Component"));
92 }
93 this.Core.IndexElement(row, urlReservation);
94 }
95 }
96
97
98 /// <summary>
99 /// Decompile the WixHttpUrlAce table.
100 /// </summary>
101 /// <param name="table">The table to decompile.</param>
102 private void DecompileWixHttpUrlAceTable(Table table)
103 {
104 foreach (Row row in table.Rows)
105 {
106 Http.UrlAce urlace = new Http.UrlAce();
107 urlace.Id = (string)row[0];
108 urlace.SecurityPrincipal = (string)row[2];
109 switch (Convert.ToInt32(row[3]))
110 {
111 case HttpConstants.GENERIC_ALL:
112 default:
113 urlace.Rights = Http.UrlAce.RightsType.all;
114 break;
115 case HttpConstants.GENERIC_EXECUTE:
116 urlace.Rights = Http.UrlAce.RightsType.register;
117 break;
118 case HttpConstants.GENERIC_WRITE:
119 urlace.Rights = Http.UrlAce.RightsType.@delegate;
120 break;
121 }
122
123 string reservationId = (string)row[1];
124 Http.UrlReservation urlReservation = (Http.UrlReservation)this.Core.GetIndexedElement("WixHttpUrlReservation", reservationId);
125 if (null != urlReservation)
126 {
127 urlReservation.AddChild(urlace);
128 }
129 else
130 {
131 this.Core.OnMessage(WixWarnings.ExpectedForeignRow(row.SourceLineNumbers, table.Name, urlace.Id, "WixHttpUrlReservation_", reservationId, "WixHttpUrlReservation"));
132 }
133 }
134 }
135 }
136#endif
137}
diff --git a/src/ext/Http/wixext/HttpErrors.cs b/src/ext/Http/wixext/HttpErrors.cs
new file mode 100644
index 00000000..e87adf54
--- /dev/null
+++ b/src/ext/Http/wixext/HttpErrors.cs
@@ -0,0 +1,31 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Http
4{
5 using System;
6 using System.Resources;
7 using WixToolset.Data;
8
9 public static class HttpErrors
10 {
11 public static Message NoSecuritySpecified(SourceLineNumber sourceLineNumbers)
12 {
13 return Message(sourceLineNumbers, Ids.NoSecuritySpecified, "The UrlReservation element doesn't identify the security for the reservation. You must either specify the Sddl attribute, or provide child UrlAce elements.");
14 }
15
16 private static Message Message(SourceLineNumber sourceLineNumber, Ids id, string format, params object[] args)
17 {
18 return new Message(sourceLineNumber, MessageLevel.Error, (int)id, format, args);
19 }
20
21 private static Message Message(SourceLineNumber sourceLineNumber, Ids id, ResourceManager resourceManager, string resourceName, params object[] args)
22 {
23 return new Message(sourceLineNumber, MessageLevel.Error, (int)id, resourceManager, resourceName, args);
24 }
25
26 public enum Ids
27 {
28 NoSecuritySpecified = 6701,
29 }
30 }
31}
diff --git a/src/ext/Http/wixext/HttpExtensionData.cs b/src/ext/Http/wixext/HttpExtensionData.cs
new file mode 100644
index 00000000..04e3dcee
--- /dev/null
+++ b/src/ext/Http/wixext/HttpExtensionData.cs
@@ -0,0 +1,30 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Http
4{
5 using WixToolset.Data;
6 using WixToolset.Extensibility;
7
8 /// <summary>
9 /// The WiX Toolset Http Extension.
10 /// </summary>
11 public sealed class HttpExtensionData : BaseExtensionData
12 {
13 /// <summary>
14 /// Gets the default culture.
15 /// </summary>
16 /// <value>The default culture.</value>
17 public override string DefaultCulture => "en-US";
18
19 public override bool TryGetSymbolDefinitionByName(string name, out IntermediateSymbolDefinition symbolDefinition)
20 {
21 symbolDefinition = HttpSymbolDefinitions.ByName(name);
22 return symbolDefinition != null;
23 }
24
25 public override Intermediate GetLibrary(ISymbolDefinitionCreator symbolDefinitions)
26 {
27 return Intermediate.Load(typeof(HttpExtensionData).Assembly, "WixToolset.Http.http.wixlib", symbolDefinitions);
28 }
29 }
30}
diff --git a/src/ext/Http/wixext/HttpExtensionFactory.cs b/src/ext/Http/wixext/HttpExtensionFactory.cs
new file mode 100644
index 00000000..ad7d84d0
--- /dev/null
+++ b/src/ext/Http/wixext/HttpExtensionFactory.cs
@@ -0,0 +1,18 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Http
4{
5 using System;
6 using System.Collections.Generic;
7 using WixToolset.Extensibility;
8
9 public class HttpExtensionFactory : BaseExtensionFactory
10 {
11 protected override IReadOnlyCollection<Type> ExtensionTypes => new[]
12 {
13 typeof(HttpCompiler),
14 typeof(HttpExtensionData),
15 typeof(HttpWindowsInstallerBackendBinderExtension),
16 };
17 }
18}
diff --git a/src/ext/Http/wixext/HttpTableDefinitions.cs b/src/ext/Http/wixext/HttpTableDefinitions.cs
new file mode 100644
index 00000000..431b9a33
--- /dev/null
+++ b/src/ext/Http/wixext/HttpTableDefinitions.cs
@@ -0,0 +1,60 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Http
4{
5 using WixToolset.Data.WindowsInstaller;
6
7 public static class HttpTableDefinitions
8 {
9 public static readonly TableDefinition WixHttpSniSslCert = new TableDefinition(
10 "Wix4HttpSniSslCert",
11 HttpSymbolDefinitions.WixHttpSniSslCert,
12 new[]
13 {
14 new ColumnDefinition("Wix4HttpSniSslCert", ColumnType.String, 72, primaryKey: true, nullable: false, ColumnCategory.Identifier, description: "The non-localized primary key for the table.", modularizeType: ColumnModularizeType.Column),
15 new ColumnDefinition("Host", ColumnType.String, 0, primaryKey: false, nullable: false, ColumnCategory.Formatted, description: "Host for the SNI SSL certificate.", modularizeType: ColumnModularizeType.Property),
16 new ColumnDefinition("Port", ColumnType.String, 0, primaryKey: false, nullable: false, ColumnCategory.Formatted, description: "Port for the SNI SSL certificate.", modularizeType: ColumnModularizeType.Property),
17 new ColumnDefinition("Thumbprint", ColumnType.String, 0, primaryKey: false, nullable: false, ColumnCategory.Formatted, description: "humbprint of the SNI SSL certificate to find.", modularizeType: ColumnModularizeType.Property),
18 new ColumnDefinition("AppId", ColumnType.String, 0, primaryKey: false, nullable: true, ColumnCategory.Formatted, description: "Optional application id for the SNI SSL certificate.", modularizeType: ColumnModularizeType.Property),
19 new ColumnDefinition("Store", ColumnType.String, 0, primaryKey: false, nullable: true, ColumnCategory.Formatted, description: "Optional application id for the SNI SSL certificate.", modularizeType: ColumnModularizeType.Property),
20 new ColumnDefinition("HandleExisting", ColumnType.Number, 4, primaryKey: false, nullable: false, ColumnCategory.Unknown, minValue: 0, maxValue: 2, description: "The behavior when trying to install a SNI SSL certificate and it already exists."),
21 new ColumnDefinition("Component_", ColumnType.String, 72, primaryKey: false, nullable: false, ColumnCategory.Identifier, keyTable: "Component", keyColumn: 1, description: "Foreign key into the Component table referencing the component that controls the URL reservation.", modularizeType: ColumnModularizeType.Column),
22 },
23 symbolIdIsPrimaryKey: true
24 );
25
26 public static readonly TableDefinition WixHttpUrlReservation = new TableDefinition(
27 "Wix4HttpUrlReservation",
28 HttpSymbolDefinitions.WixHttpUrlReservation,
29 new[]
30 {
31 new ColumnDefinition("Wix4HttpUrlReservation", ColumnType.String, 72, primaryKey: true, nullable: false, ColumnCategory.Identifier, description: "The non-localized primary key for the table.", modularizeType: ColumnModularizeType.Column),
32 new ColumnDefinition("HandleExisting", ColumnType.Number, 4, primaryKey: false, nullable: false, ColumnCategory.Unknown, minValue: 0, maxValue: 2, description: "The behavior when trying to install a URL reservation and it already exists."),
33 new ColumnDefinition("Sddl", ColumnType.String, 0, primaryKey: false, nullable: true, ColumnCategory.Formatted, description: "Security descriptor for the URL reservation.", modularizeType: ColumnModularizeType.Property),
34 new ColumnDefinition("Url", ColumnType.String, 0, primaryKey: false, nullable: false, ColumnCategory.Formatted, description: "URL to be reserved.", modularizeType: ColumnModularizeType.Property),
35 new ColumnDefinition("Component_", ColumnType.String, 72, primaryKey: false, nullable: false, ColumnCategory.Identifier, keyTable: "Component", keyColumn: 1, description: "Foreign key into the Component table referencing the component that controls the URL reservation.", modularizeType: ColumnModularizeType.Column),
36 },
37 symbolIdIsPrimaryKey: true
38 );
39
40 public static readonly TableDefinition WixHttpUrlAce = new TableDefinition(
41 "Wix4HttpUrlAce",
42 HttpSymbolDefinitions.WixHttpUrlAce,
43 new[]
44 {
45 new ColumnDefinition("Wix4HttpUrlAce", ColumnType.String, 72, primaryKey: true, nullable: false, ColumnCategory.Identifier, description: "The non-localized primary key for the table.", modularizeType: ColumnModularizeType.Column),
46 new ColumnDefinition("WixHttpUrlReservation_", ColumnType.String, 72, primaryKey: false, nullable: false, ColumnCategory.Identifier, keyTable: "WixHttpUrlReservation", keyColumn: 1, description: "Foreign key into the WixHttpUrlReservation table.", modularizeType: ColumnModularizeType.Column),
47 new ColumnDefinition("SecurityPrincipal", ColumnType.String, 0, primaryKey: false, nullable: false, ColumnCategory.Formatted, description: "The security principal for this ACE.", modularizeType: ColumnModularizeType.Property),
48 new ColumnDefinition("Rights", ColumnType.Number, 4, primaryKey: false, nullable: false, ColumnCategory.Unknown, minValue: 0, maxValue: 1073741824, description: "The rights for this ACE."),
49 },
50 symbolIdIsPrimaryKey: true
51 );
52
53 public static readonly TableDefinition[] All = new[]
54 {
55 WixHttpSniSslCert,
56 WixHttpUrlReservation,
57 WixHttpUrlAce,
58 };
59 }
60}
diff --git a/src/ext/Http/wixext/HttpWindowsInstallerBackendBinderExtension.cs b/src/ext/Http/wixext/HttpWindowsInstallerBackendBinderExtension.cs
new file mode 100644
index 00000000..8e4f1a96
--- /dev/null
+++ b/src/ext/Http/wixext/HttpWindowsInstallerBackendBinderExtension.cs
@@ -0,0 +1,13 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Http
4{
5 using System.Collections.Generic;
6 using WixToolset.Data.WindowsInstaller;
7 using WixToolset.Extensibility;
8
9 public class HttpWindowsInstallerBackendBinderExtension : BaseWindowsInstallerBackendBinderExtension
10 {
11 public override IReadOnlyCollection<TableDefinition> TableDefinitions => HttpTableDefinitions.All;
12 }
13}
diff --git a/src/ext/Http/wixext/Symbols/HandleExisting.cs b/src/ext/Http/wixext/Symbols/HandleExisting.cs
new file mode 100644
index 00000000..0d70cebc
--- /dev/null
+++ b/src/ext/Http/wixext/Symbols/HandleExisting.cs
@@ -0,0 +1,14 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Http.Symbols
4{
5 /// <summary>
6 /// Must match constants in wixhttpca.cpp
7 /// </summary>
8 public enum HandleExisting
9 {
10 Replace = 0,
11 Ignore = 1,
12 Fail = 2,
13 }
14}
diff --git a/src/ext/Http/wixext/Symbols/HttpSymbolDefinitions.cs b/src/ext/Http/wixext/Symbols/HttpSymbolDefinitions.cs
new file mode 100644
index 00000000..2aa03468
--- /dev/null
+++ b/src/ext/Http/wixext/Symbols/HttpSymbolDefinitions.cs
@@ -0,0 +1,47 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Http
4{
5 using System;
6 using WixToolset.Data;
7
8 public enum HttpSymbolDefinitionType
9 {
10 WixHttpSniSslCert,
11 WixHttpUrlAce,
12 WixHttpUrlReservation,
13 }
14
15 public static partial class HttpSymbolDefinitions
16 {
17 public static readonly Version Version = new Version("4.0.0");
18
19 public static IntermediateSymbolDefinition ByName(string name)
20 {
21 if (!Enum.TryParse(name, out HttpSymbolDefinitionType type))
22 {
23 return null;
24 }
25
26 return ByType(type);
27 }
28
29 public static IntermediateSymbolDefinition ByType(HttpSymbolDefinitionType type)
30 {
31 switch (type)
32 {
33 case HttpSymbolDefinitionType.WixHttpSniSslCert:
34 return HttpSymbolDefinitions.WixHttpSniSslCert;
35
36 case HttpSymbolDefinitionType.WixHttpUrlAce:
37 return HttpSymbolDefinitions.WixHttpUrlAce;
38
39 case HttpSymbolDefinitionType.WixHttpUrlReservation:
40 return HttpSymbolDefinitions.WixHttpUrlReservation;
41
42 default:
43 throw new ArgumentOutOfRangeException(nameof(type));
44 }
45 }
46 }
47}
diff --git a/src/ext/Http/wixext/Symbols/WixHttpSniSslCertSymbol.cs b/src/ext/Http/wixext/Symbols/WixHttpSniSslCertSymbol.cs
new file mode 100644
index 00000000..ec67a089
--- /dev/null
+++ b/src/ext/Http/wixext/Symbols/WixHttpSniSslCertSymbol.cs
@@ -0,0 +1,95 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Http
4{
5 using WixToolset.Data;
6 using WixToolset.Http.Symbols;
7
8 public static partial class HttpSymbolDefinitions
9 {
10 public static readonly IntermediateSymbolDefinition WixHttpSniSslCert = new IntermediateSymbolDefinition(
11 HttpSymbolDefinitionType.WixHttpSniSslCert.ToString(),
12 new[]
13 {
14 new IntermediateFieldDefinition(nameof(WixHttpSniSslCertSymbolFields.Host), IntermediateFieldType.String),
15 new IntermediateFieldDefinition(nameof(WixHttpSniSslCertSymbolFields.Port), IntermediateFieldType.String),
16 new IntermediateFieldDefinition(nameof(WixHttpSniSslCertSymbolFields.Thumbprint), IntermediateFieldType.String),
17 new IntermediateFieldDefinition(nameof(WixHttpSniSslCertSymbolFields.AppId), IntermediateFieldType.String),
18 new IntermediateFieldDefinition(nameof(WixHttpSniSslCertSymbolFields.Store), IntermediateFieldType.String),
19 new IntermediateFieldDefinition(nameof(WixHttpSniSslCertSymbolFields.HandleExisting), IntermediateFieldType.Number),
20 new IntermediateFieldDefinition(nameof(WixHttpSniSslCertSymbolFields.ComponentRef), IntermediateFieldType.String),
21 },
22 typeof(WixHttpSniSslCertSymbol));
23 }
24}
25
26namespace WixToolset.Http.Symbols
27{
28 using WixToolset.Data;
29
30 public enum WixHttpSniSslCertSymbolFields
31 {
32 Host,
33 Port,
34 Thumbprint,
35 AppId,
36 Store,
37 HandleExisting,
38 ComponentRef,
39 }
40
41 public class WixHttpSniSslCertSymbol : IntermediateSymbol
42 {
43 public WixHttpSniSslCertSymbol() : base(HttpSymbolDefinitions.WixHttpSniSslCert, null, null)
44 {
45 }
46
47 public WixHttpSniSslCertSymbol(SourceLineNumber sourceLineNumber, Identifier id = null) : base(HttpSymbolDefinitions.WixHttpSniSslCert, sourceLineNumber, id)
48 {
49 }
50
51 public IntermediateField this[WixHttpSniSslCertSymbolFields index] => this.Fields[(int)index];
52
53 public string Host
54 {
55 get => this.Fields[(int)WixHttpSniSslCertSymbolFields.Host].AsString();
56 set => this.Set((int)WixHttpSniSslCertSymbolFields.Host, value);
57 }
58
59 public string Port
60 {
61 get => this.Fields[(int)WixHttpSniSslCertSymbolFields.Port].AsString();
62 set => this.Set((int)WixHttpSniSslCertSymbolFields.Port, value);
63 }
64
65 public string Thumbprint
66 {
67 get => this.Fields[(int)WixHttpSniSslCertSymbolFields.Thumbprint].AsString();
68 set => this.Set((int)WixHttpSniSslCertSymbolFields.Thumbprint, value);
69 }
70
71 public string AppId
72 {
73 get => this.Fields[(int)WixHttpSniSslCertSymbolFields.AppId].AsString();
74 set => this.Set((int)WixHttpSniSslCertSymbolFields.AppId, value);
75 }
76
77 public string Store
78 {
79 get => this.Fields[(int)WixHttpSniSslCertSymbolFields.Store].AsString();
80 set => this.Set((int)WixHttpSniSslCertSymbolFields.Store, value);
81 }
82
83 public HandleExisting HandleExisting
84 {
85 get => (HandleExisting)this.Fields[(int)WixHttpSniSslCertSymbolFields.HandleExisting].AsNumber();
86 set => this.Set((int)WixHttpSniSslCertSymbolFields.HandleExisting, (int)value);
87 }
88
89 public string ComponentRef
90 {
91 get => this.Fields[(int)WixHttpSniSslCertSymbolFields.ComponentRef].AsString();
92 set => this.Set((int)WixHttpSniSslCertSymbolFields.ComponentRef, value);
93 }
94 }
95}
diff --git a/src/ext/Http/wixext/Symbols/WixHttpUrlAceSymbol.cs b/src/ext/Http/wixext/Symbols/WixHttpUrlAceSymbol.cs
new file mode 100644
index 00000000..1d57bd52
--- /dev/null
+++ b/src/ext/Http/wixext/Symbols/WixHttpUrlAceSymbol.cs
@@ -0,0 +1,63 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Http
4{
5 using WixToolset.Data;
6 using WixToolset.Http.Symbols;
7
8 public static partial class HttpSymbolDefinitions
9 {
10 public static readonly IntermediateSymbolDefinition WixHttpUrlAce = new IntermediateSymbolDefinition(
11 HttpSymbolDefinitionType.WixHttpUrlAce.ToString(),
12 new[]
13 {
14 new IntermediateFieldDefinition(nameof(WixHttpUrlAceSymbolFields.WixHttpUrlReservationRef), IntermediateFieldType.String),
15 new IntermediateFieldDefinition(nameof(WixHttpUrlAceSymbolFields.SecurityPrincipal), IntermediateFieldType.String),
16 new IntermediateFieldDefinition(nameof(WixHttpUrlAceSymbolFields.Rights), IntermediateFieldType.Number),
17 },
18 typeof(WixHttpUrlAceSymbol));
19 }
20}
21
22namespace WixToolset.Http.Symbols
23{
24 using WixToolset.Data;
25
26 public enum WixHttpUrlAceSymbolFields
27 {
28 WixHttpUrlReservationRef,
29 SecurityPrincipal,
30 Rights,
31 }
32
33 public class WixHttpUrlAceSymbol : IntermediateSymbol
34 {
35 public WixHttpUrlAceSymbol() : base(HttpSymbolDefinitions.WixHttpUrlAce, null, null)
36 {
37 }
38
39 public WixHttpUrlAceSymbol(SourceLineNumber sourceLineNumber, Identifier id = null) : base(HttpSymbolDefinitions.WixHttpUrlAce, sourceLineNumber, id)
40 {
41 }
42
43 public IntermediateField this[WixHttpUrlAceSymbolFields index] => this.Fields[(int)index];
44
45 public string WixHttpUrlReservationRef
46 {
47 get => this.Fields[(int)WixHttpUrlAceSymbolFields.WixHttpUrlReservationRef].AsString();
48 set => this.Set((int)WixHttpUrlAceSymbolFields.WixHttpUrlReservationRef, value);
49 }
50
51 public string SecurityPrincipal
52 {
53 get => this.Fields[(int)WixHttpUrlAceSymbolFields.SecurityPrincipal].AsString();
54 set => this.Set((int)WixHttpUrlAceSymbolFields.SecurityPrincipal, value);
55 }
56
57 public int Rights
58 {
59 get => this.Fields[(int)WixHttpUrlAceSymbolFields.Rights].AsNumber();
60 set => this.Set((int)WixHttpUrlAceSymbolFields.Rights, value);
61 }
62 }
63} \ No newline at end of file
diff --git a/src/ext/Http/wixext/Symbols/WixHttpUrlReservationSymbol.cs b/src/ext/Http/wixext/Symbols/WixHttpUrlReservationSymbol.cs
new file mode 100644
index 00000000..4aa4a5da
--- /dev/null
+++ b/src/ext/Http/wixext/Symbols/WixHttpUrlReservationSymbol.cs
@@ -0,0 +1,71 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Http
4{
5 using WixToolset.Data;
6 using WixToolset.Http.Symbols;
7
8 public static partial class HttpSymbolDefinitions
9 {
10 public static readonly IntermediateSymbolDefinition WixHttpUrlReservation = new IntermediateSymbolDefinition(
11 HttpSymbolDefinitionType.WixHttpUrlReservation.ToString(),
12 new[]
13 {
14 new IntermediateFieldDefinition(nameof(WixHttpUrlReservationSymbolFields.HandleExisting), IntermediateFieldType.Number),
15 new IntermediateFieldDefinition(nameof(WixHttpUrlReservationSymbolFields.Sddl), IntermediateFieldType.String),
16 new IntermediateFieldDefinition(nameof(WixHttpUrlReservationSymbolFields.Url), IntermediateFieldType.String),
17 new IntermediateFieldDefinition(nameof(WixHttpUrlReservationSymbolFields.ComponentRef), IntermediateFieldType.String),
18 },
19 typeof(WixHttpUrlReservationSymbol));
20 }
21}
22
23namespace WixToolset.Http.Symbols
24{
25 using WixToolset.Data;
26
27 public enum WixHttpUrlReservationSymbolFields
28 {
29 HandleExisting,
30 Sddl,
31 Url,
32 ComponentRef,
33 }
34
35 public class WixHttpUrlReservationSymbol : IntermediateSymbol
36 {
37 public WixHttpUrlReservationSymbol() : base(HttpSymbolDefinitions.WixHttpUrlReservation, null, null)
38 {
39 }
40
41 public WixHttpUrlReservationSymbol(SourceLineNumber sourceLineNumber, Identifier id = null) : base(HttpSymbolDefinitions.WixHttpUrlReservation, sourceLineNumber, id)
42 {
43 }
44
45 public IntermediateField this[WixHttpUrlReservationSymbolFields index] => this.Fields[(int)index];
46
47 public HandleExisting HandleExisting
48 {
49 get => (HandleExisting)this.Fields[(int)WixHttpUrlReservationSymbolFields.HandleExisting].AsNumber();
50 set => this.Set((int)WixHttpUrlReservationSymbolFields.HandleExisting, (int)value);
51 }
52
53 public string Sddl
54 {
55 get => this.Fields[(int)WixHttpUrlReservationSymbolFields.Sddl].AsString();
56 set => this.Set((int)WixHttpUrlReservationSymbolFields.Sddl, value);
57 }
58
59 public string Url
60 {
61 get => this.Fields[(int)WixHttpUrlReservationSymbolFields.Url].AsString();
62 set => this.Set((int)WixHttpUrlReservationSymbolFields.Url, value);
63 }
64
65 public string ComponentRef
66 {
67 get => this.Fields[(int)WixHttpUrlReservationSymbolFields.ComponentRef].AsString();
68 set => this.Set((int)WixHttpUrlReservationSymbolFields.ComponentRef, value);
69 }
70 }
71} \ No newline at end of file
diff --git a/src/ext/Http/wixext/WixToolset.Http.wixext.csproj b/src/ext/Http/wixext/WixToolset.Http.wixext.csproj
new file mode 100644
index 00000000..089a51d0
--- /dev/null
+++ b/src/ext/Http/wixext/WixToolset.Http.wixext.csproj
@@ -0,0 +1,31 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3
4<Project Sdk="Microsoft.NET.Sdk">
5 <PropertyGroup>
6 <TargetFramework>netstandard2.0</TargetFramework>
7 <RootNamespace>WixToolset.Http</RootNamespace>
8 <Description>WiX Toolset Http Extension</Description>
9 <Title>WiX Toolset Http Extension</Title>
10 <IsTool>true</IsTool>
11 <ContentTargetFolders>build</ContentTargetFolders>
12 </PropertyGroup>
13
14 <ItemGroup>
15 <Content Include="$(MSBuildThisFileName).targets" />
16 <EmbeddedResource Include="$(OutputPath)..\http.wixlib" />
17 </ItemGroup>
18
19 <ItemGroup>
20 <PackageReference Include="WixToolset.Data" Version="4.0.*" PrivateAssets="all" />
21 <PackageReference Include="WixToolset.Extensibility" Version="4.0.*" PrivateAssets="all" />
22 </ItemGroup>
23
24 <ItemGroup>
25 <ProjectReference Include="..\wixlib\http.wixproj" ReferenceOutputAssembly="false" Condition=" '$(NCrunch)'=='' " />
26 </ItemGroup>
27
28 <ItemGroup>
29 <PackageReference Include="Nerdbank.GitVersioning" Version="3.3.37" PrivateAssets="all" />
30 </ItemGroup>
31</Project>
diff --git a/src/ext/Http/wixext/WixToolset.Http.wixext.targets b/src/ext/Http/wixext/WixToolset.Http.wixext.targets
new file mode 100644
index 00000000..254b0010
--- /dev/null
+++ b/src/ext/Http/wixext/WixToolset.Http.wixext.targets
@@ -0,0 +1,11 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3
4<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0">
5 <PropertyGroup>
6 <WixToolsetHttpWixextPath Condition=" '$(WixToolsetHttpWixextPath)' == '' ">$(MSBuildThisFileDirectory)..\tools\WixToolset.Http.wixext.dll</WixToolsetHttpWixextPath>
7 </PropertyGroup>
8 <ItemGroup>
9 <WixExtension Include="$(WixToolsetHttpWixextPath)" />
10 </ItemGroup>
11</Project>
diff --git a/src/ext/Http/wixlib/HttpExtension.wxs b/src/ext/Http/wixlib/HttpExtension.wxs
new file mode 100644
index 00000000..e9717fc1
--- /dev/null
+++ b/src/ext/Http/wixlib/HttpExtension.wxs
@@ -0,0 +1,10 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2
3
4<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
5 <?include caerr.wxi ?>
6 <Fragment>
7 <UI Id="WixHttpErrors">
8 </UI>
9 </Fragment>
10</Wix>
diff --git a/src/ext/Http/wixlib/HttpExtension_Platform.wxi b/src/ext/Http/wixlib/HttpExtension_Platform.wxi
new file mode 100644
index 00000000..4f4a9e23
--- /dev/null
+++ b/src/ext/Http/wixlib/HttpExtension_Platform.wxi
@@ -0,0 +1,64 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2
3
4<Include xmlns="http://wixtoolset.org/schemas/v4/wxs">
5 <?include caDecor.wxi ?>
6
7 <Fragment>
8 <UIRef Id="WixHttpErrors" />
9 <UI>
10 <ProgressText Action="$(var.Prefix)SchedHttpUrlReservationsInstall$(var.Suffix)" Message="!(loc.WixSchedHttpUrlReservationsInstall)" />
11 <ProgressText Action="$(var.Prefix)SchedHttpUrlReservationsUninstall$(var.Suffix)" Message="!(loc.WixSchedHttpUrlReservationsUninstall)" />
12 <ProgressText Action="$(var.Prefix)RollbackHttpUrlReservationsInstall$(var.Suffix)" Message="!(loc.WixRollbackHttpUrlReservationsInstall)" />
13 <ProgressText Action="$(var.Prefix)ExecHttpUrlReservationsInstall$(var.Suffix)" Message="!(loc.WixExecHttpUrlReservationsInstall)" />
14 <ProgressText Action="$(var.Prefix)RollbackHttpUrlReservationsUninstall$(var.Suffix)" Message="!(loc.WixRollbackHttpUrlReservationsUninstall)" />
15 <ProgressText Action="$(var.Prefix)ExecHttpUrlReservationsUninstall$(var.Suffix)" Message="!(loc.WixExecHttpUrlReservationsUninstall)" />
16 </UI>
17
18 <CustomAction Id="$(var.Prefix)SchedHttpUrlReservationsInstall$(var.Suffix)" DllEntry="SchedHttpUrlReservationsInstall" Execute="immediate" Return="check" SuppressModularization="yes" BinaryRef="$(var.Prefix)HttpCA$(var.Suffix)" />
19 <CustomAction Id="$(var.Prefix)SchedHttpUrlReservationsUninstall$(var.Suffix)" DllEntry="SchedHttpUrlReservationsUninstall" Execute="immediate" Return="check" SuppressModularization="yes" BinaryRef="$(var.Prefix)HttpCA$(var.Suffix)" />
20 <CustomAction Id="$(var.Prefix)RollbackHttpUrlReservationsInstall$(var.Suffix)" DllEntry="ExecHttpUrlReservations" Execute="rollback" Impersonate="no" Return="check" SuppressModularization="yes" BinaryRef="$(var.Prefix)HttpCA$(var.Suffix)" />
21 <CustomAction Id="$(var.Prefix)ExecHttpUrlReservationsInstall$(var.Suffix)" DllEntry="ExecHttpUrlReservations" Execute="deferred" Impersonate="no" Return="check" SuppressModularization="yes" BinaryRef="$(var.Prefix)HttpCA$(var.Suffix)" />
22 <CustomAction Id="$(var.Prefix)RollbackHttpUrlReservationsUninstall$(var.Suffix)" DllEntry="ExecHttpUrlReservations" Execute="rollback" Impersonate="no" Return="check" SuppressModularization="yes" BinaryRef="$(var.Prefix)HttpCA$(var.Suffix)" />
23 <CustomAction Id="$(var.Prefix)ExecHttpUrlReservationsUninstall$(var.Suffix)" DllEntry="ExecHttpUrlReservations" Execute="deferred" Impersonate="no" Return="check" SuppressModularization="yes" BinaryRef="$(var.Prefix)HttpCA$(var.Suffix)" />
24
25 <!--
26 We need the HTTP server on Windows XP SP2 or later.
27 -->
28 <InstallExecuteSequence>
29 <Custom Action="$(var.Prefix)SchedHttpUrlReservationsUninstall$(var.Suffix)" Before="RemoveFiles" Overridable="yes" Condition="VersionNT &gt;= 600 OR (VersionNT &gt;= 501 AND ((MsiNTProductType = 1 AND ServicePackLevel &gt;= 2) OR (MsiNTProductType &gt; 1)))" />
30 <Custom Action="$(var.Prefix)SchedHttpUrlReservationsInstall$(var.Suffix)" After="InstallFiles" Overridable="yes" Condition="VersionNT &gt;= 600 OR (VersionNT &gt;= 501 AND ((MsiNTProductType = 1 AND ServicePackLevel &gt;= 2) OR (MsiNTProductType &gt; 1)))" />
31 </InstallExecuteSequence>
32 </Fragment>
33
34 <Fragment>
35 <UIRef Id="WixHttpErrors" />
36 <UI>
37 <ProgressText Action="$(var.Prefix)SchedHttpSniSslCertsInstall$(var.Suffix)" Message="!(loc.WixSchedHttpSniSslCertsInstall)" />
38 <ProgressText Action="$(var.Prefix)SchedHttpSniSslCertsUninstall$(var.Suffix)" Message="!(loc.WixSchedHttpSniSslCertsUninstall)" />
39 <ProgressText Action="$(var.Prefix)RollbackHttpSniSslCertsInstall$(var.Suffix)" Message="!(loc.WixRollbackHttpSniSslCertsInstall)" />
40 <ProgressText Action="$(var.Prefix)ExecHttpSniSslCertsInstall$(var.Suffix)" Message="!(loc.WixExecHttpSniSslCertsInstall)" />
41 <ProgressText Action="$(var.Prefix)RollbackHttpSniSslCertsUninstall$(var.Suffix)" Message="!(loc.WixRollbackHttpSniSslCertsUninstall)" />
42 <ProgressText Action="$(var.Prefix)ExecHttpSniSslCertsUninstall$(var.Suffix)" Message="!(loc.WixExecHttpSniSslCertsUninstall)" />
43 </UI>
44
45 <CustomAction Id="$(var.Prefix)SchedHttpSniSslCertsInstall$(var.Suffix)" BinaryRef="$(var.Prefix)HttpCA$(var.Suffix)" DllEntry="SchedHttpSniSslCertsInstall" Execute="immediate" Return="check" SuppressModularization="yes" />
46 <CustomAction Id="$(var.Prefix)SchedHttpSniSslCertsUninstall$(var.Suffix)" BinaryRef="$(var.Prefix)HttpCA$(var.Suffix)" DllEntry="SchedHttpSniSslCertsUninstall" Execute="immediate" Return="check" SuppressModularization="yes" />
47 <CustomAction Id="$(var.Prefix)RollbackHttpSniSslCertsInstall$(var.Suffix)" BinaryRef="$(var.Prefix)HttpCA$(var.Suffix)" DllEntry="ExecHttpSniSslCerts" Execute="rollback" Impersonate="no" Return="check" SuppressModularization="yes" />
48 <CustomAction Id="$(var.Prefix)ExecHttpSniSslCertsInstall$(var.Suffix)" BinaryRef="$(var.Prefix)HttpCA$(var.Suffix)" DllEntry="ExecHttpSniSslCerts" Execute="deferred" Impersonate="no" Return="check" SuppressModularization="yes" />
49 <CustomAction Id="$(var.Prefix)RollbackHttpSniSslCertsUninstall$(var.Suffix)" BinaryRef="$(var.Prefix)HttpCA$(var.Suffix)" DllEntry="ExecHttpSniSslCerts" Execute="rollback" Impersonate="no" Return="check" SuppressModularization="yes" />
50 <CustomAction Id="$(var.Prefix)ExecHttpSniSslCertsUninstall$(var.Suffix)" BinaryRef="$(var.Prefix)HttpCA$(var.Suffix)" DllEntry="ExecHttpSniSslCerts" Execute="deferred" Impersonate="no" Return="check" SuppressModularization="yes" />
51
52 <!--
53 We need HTTP.SYS on Windows 8 or later for SNI SSL support.
54 -->
55 <InstallExecuteSequence>
56 <Custom Action="$(var.Prefix)SchedHttpSniSslCertsUninstall$(var.Suffix)" Before="RemoveFiles" Overridable="yes" Condition="VersionNT >= 602" />
57 <Custom Action="$(var.Prefix)SchedHttpSniSslCertsInstall$(var.Suffix)" After="InstallFiles" Overridable="yes" Condition="VersionNT >= 602" />
58 </InstallExecuteSequence>
59 </Fragment>
60
61 <Fragment>
62 <Binary Id="$(var.Prefix)HttpCA$(var.Suffix)" SourceFile="!(bindpath.$(var.platform))httpca.dll" />
63 </Fragment>
64</Include>
diff --git a/src/ext/Http/wixlib/HttpExtension_arm64.wxs b/src/ext/Http/wixlib/HttpExtension_arm64.wxs
new file mode 100644
index 00000000..3c69a644
--- /dev/null
+++ b/src/ext/Http/wixlib/HttpExtension_arm64.wxs
@@ -0,0 +1,7 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2
3
4<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
5 <?define platform=arm64 ?>
6 <?include HttpExtension_Platform.wxi ?>
7</Wix>
diff --git a/src/ext/Http/wixlib/HttpExtension_x64.wxs b/src/ext/Http/wixlib/HttpExtension_x64.wxs
new file mode 100644
index 00000000..f66f0d6f
--- /dev/null
+++ b/src/ext/Http/wixlib/HttpExtension_x64.wxs
@@ -0,0 +1,7 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2
3
4<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
5 <?define platform=x64 ?>
6 <?include HttpExtension_Platform.wxi ?>
7</Wix>
diff --git a/src/ext/Http/wixlib/HttpExtension_x86.wxs b/src/ext/Http/wixlib/HttpExtension_x86.wxs
new file mode 100644
index 00000000..f76df25f
--- /dev/null
+++ b/src/ext/Http/wixlib/HttpExtension_x86.wxs
@@ -0,0 +1,7 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2
3
4<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
5 <?define platform=x86 ?>
6 <?include HttpExtension_Platform.wxi ?>
7</Wix>
diff --git a/src/ext/Http/wixlib/caDecor.wxi b/src/ext/Http/wixlib/caDecor.wxi
new file mode 100644
index 00000000..b1711518
--- /dev/null
+++ b/src/ext/Http/wixlib/caDecor.wxi
@@ -0,0 +1,39 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2
3
4<Include xmlns="http://wixtoolset.org/schemas/v4/wxs">
5 <?ifdef Prefix ?>
6 <?undef Prefix ?>
7 <?endif?>
8
9 <?define Prefix="Wix4" ?>
10
11 <?ifndef platform ?>
12 <?define platform="x86" ?>
13 <?endif?>
14
15 <?if $(var.platform)="" ?>
16 <?undef platform ?>
17 <?define platform="x86" ?>
18 <?endif?>
19
20 <?ifdef Suffix ?>
21 <?undef Suffix ?>
22 <?endif?>
23
24 <?if $(var.platform)~="x86" ?>
25 <?define Suffix="_X86" ?>
26 <?endif?>
27
28 <?if $(var.platform)~="x64" ?>
29 <?define Suffix="_X64" ?>
30 <?endif?>
31
32 <?if $(var.platform)~="arm" ?>
33 <?define Suffix="_A32" ?>
34 <?endif?>
35
36 <?if $(var.platform)~="arm64" ?>
37 <?define Suffix="_A64" ?>
38 <?endif?>
39</Include>
diff --git a/src/ext/Http/wixlib/caerr.wxi b/src/ext/Http/wixlib/caerr.wxi
new file mode 100644
index 00000000..ff7ec121
--- /dev/null
+++ b/src/ext/Http/wixlib/caerr.wxi
@@ -0,0 +1,96 @@
1<Include xmlns="http://wixtoolset.org/schemas/v4/wxs">
2 <?define msierrSecureObjectsFailedCreateSD = 25520?>
3 <?define msierrSecureObjectsFailedSet = 25521?>
4 <?define msierrSecureObjectsUnknownType = 25522?>
5 <?define msierrXmlFileFailedRead = 25530?>
6 <?define msierrXmlFileFailedOpen = 25531?>
7 <?define msierrXmlFileFailedSelect = 25532?>
8 <?define msierrXmlFileFailedSave = 25533?>
9 <?define msierrXmlConfigFailedRead = 25540?>
10 <?define msierrXmlConfigFailedOpen = 25541?>
11 <?define msierrXmlConfigFailedSelect = 25542?>
12 <?define msierrXmlConfigFailedSave = 25543?>
13 <?define msierrFirewallCannotConnect = 25580?>
14 <?define msierrIISCannotConnect = 26001?>
15 <?define msierrIISFailedReadWebSite = 26002?>
16 <?define msierrIISFailedReadWebDirs = 26003?>
17 <?define msierrIISFailedReadVDirs = 26004?>
18 <?define msierrIISFailedReadFilters = 26005?>
19 <?define msierrIISFailedReadAppPool = 26006?>
20 <?define msierrIISFailedReadMimeMap = 26007?>
21 <?define msierrIISFailedReadProp = 26008?>
22 <?define msierrIISFailedReadWebSvcExt = 26009?>
23 <?define msierrIISFailedReadWebError = 26010?>
24 <?define msierrIISFailedReadHttpHeader = 26011?>
25 <?define msierrIISFailedSchedTransaction = 26031?>
26 <?define msierrIISFailedSchedInstallWebs = 26032?>
27 <?define msierrIISFailedSchedInstallWebDirs = 26033?>
28 <?define msierrIISFailedSchedInstallVDirs = 26034?>
29 <?define msierrIISFailedSchedInstallFilters = 26035?>
30 <?define msierrIISFailedSchedInstallAppPool = 26036?>
31 <?define msierrIISFailedSchedInstallProp = 26037?>
32 <?define msierrIISFailedSchedInstallWebSvcExt = 26038?>
33 <?define msierrIISFailedSchedUninstallWebs = 26051?>
34 <?define msierrIISFailedSchedUninstallWebDirs = 26052?>
35 <?define msierrIISFailedSchedUninstallVDirs = 26053?>
36 <?define msierrIISFailedSchedUninstallFilters = 26054?>
37 <?define msierrIISFailedSchedUninstallAppPool = 26055?>
38 <?define msierrIISFailedSchedUninstallProp = 26056?>
39 <?define msierrIISFailedSchedUninstallWebSvcExt = 26057?>
40 <?define msierrIISFailedStartTransaction = 26101?>
41 <?define msierrIISFailedOpenKey = 26102?>
42 <?define msierrIISFailedCreateKey = 26103?>
43 <?define msierrIISFailedWriteData = 26104?>
44 <?define msierrIISFailedCreateApp = 26105?>
45 <?define msierrIISFailedDeleteKey = 26106?>
46 <?define msierrIISFailedDeleteApp = 26107?>
47 <?define msierrIISFailedDeleteValue = 26108?>
48 <?define msierrIISFailedCommitInUse = 26109?>
49 <?define msierrSQLFailedCreateDatabase = 26201?>
50 <?define msierrSQLFailedDropDatabase = 26202?>
51 <?define msierrSQLFailedConnectDatabase = 26203?>
52 <?define msierrSQLFailedExecString = 26204?>
53 <?define msierrSQLDatabaseAlreadyExists = 26205?>
54 <?define msierrPERFMONFailedRegisterDLL = 26251?>
55 <?define msierrPERFMONFailedUnregisterDLL = 26252?>
56 <?define msierrInstallPerfCounterData = 26253?>
57 <?define msierrUninstallPerfCounterData = 26254?>
58 <?define msierrSMBFailedCreate = 26301?>
59 <?define msierrSMBFailedDrop = 26302?>
60 <?define msierrCERTFailedOpen = 26351?>
61 <?define msierrCERTFailedAdd = 26352?>
62 <?define msierrUSRFailedUserCreate = 26401?>
63 <?define msierrUSRFailedUserCreatePswd = 26402?>
64 <?define msierrUSRFailedUserGroupAdd = 26403?>
65 <?define msierrUSRFailedUserCreateExists = 26404?>
66 <?define msierrUSRFailedGrantLogonAsService = 26405?>
67 <?define msierrDependencyMissingDependencies = 26451?>
68 <?define msierrDependencyHasDependents = 26452?>
69 <?define msierrDotNetRuntimeRequired = 27000?>
70 <?define msierrComPlusCannotConnect = 28001?>
71 <?define msierrComPlusPartitionReadFailed = 28002?>
72 <?define msierrComPlusPartitionRoleReadFailed = 28003?>
73 <?define msierrComPlusUserInPartitionRoleReadFailed = 28004?>
74 <?define msierrComPlusPartitionUserReadFailed = 28005?>
75 <?define msierrComPlusApplicationReadFailed = 28006?>
76 <?define msierrComPlusApplicationRoleReadFailed = 28007?>
77 <?define msierrComPlusUserInApplicationRoleReadFailed = 28008?>
78 <?define msierrComPlusAssembliesReadFailed = 28009?>
79 <?define msierrComPlusSubscriptionReadFailed = 28010?>
80 <?define msierrComPlusPartitionDependency = 28011?>
81 <?define msierrComPlusPartitionNotFound = 28012?>
82 <?define msierrComPlusPartitionIdConflict = 28013?>
83 <?define msierrComPlusPartitionNameConflict = 28014?>
84 <?define msierrComPlusApplicationDependency = 28015?>
85 <?define msierrComPlusApplicationNotFound = 28016?>
86 <?define msierrComPlusApplicationIdConflict = 28017?>
87 <?define msierrComPlusApplicationNameConflict = 28018?>
88 <?define msierrComPlusApplicationRoleDependency = 28019?>
89 <?define msierrComPlusApplicationRoleNotFound = 28020?>
90 <?define msierrComPlusApplicationRoleConflict = 28021?>
91 <?define msierrComPlusAssemblyDependency = 28022?>
92 <?define msierrComPlusSubscriptionIdConflict = 28023?>
93 <?define msierrComPlusSubscriptionNameConflict = 28024?>
94 <?define msierrComPlusFailedLookupNames = 28025?>
95 <?define msierrMsmqCannotConnect = 28101?>
96</Include> \ No newline at end of file
diff --git a/src/ext/Http/wixlib/en-us.wxl b/src/ext/Http/wixlib/en-us.wxl
new file mode 100644
index 00000000..22d74f78
--- /dev/null
+++ b/src/ext/Http/wixlib/en-us.wxl
@@ -0,0 +1,17 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2
3<WixLocalization Culture="en-us" xmlns="http://wixtoolset.org/schemas/v4/wxl">
4 <String Id="WixSchedHttpUrlReservationsInstall" Overridable="yes">Preparing to configure Windows HTTP Server</String>
5 <String Id="WixSchedHttpUrlReservationsUninstall" Overridable="yes">Preparing to configure Windows HTTP Server</String>
6 <String Id="WixRollbackHttpUrlReservationsInstall" Overridable="yes">Rolling back Windows HTTP Server configuration</String>
7 <String Id="WixExecHttpUrlReservationsInstall" Overridable="yes">Configuring Windows HTTP Server</String>
8 <String Id="WixRollbackHttpUrlReservationsUninstall" Overridable="yes">Rolling back Windows HTTP Server configuration</String>
9 <String Id="WixExecHttpUrlReservationsUninstall" Overridable="yes">Configuring Windows HTTP Server</String>
10
11 <String Id="WixSchedHttpSniSslCertsInstall" Overridable="yes">Preparing to configure Windows HTTP Server SSL</String>
12 <String Id="WixSchedHttpSniSslCertsUninstall" Overridable="yes">Preparing to configure Windows HTTP Server SSL</String>
13 <String Id="WixRollbackHttpSniSslCertsInstall" Overridable="yes">Rolling back Windows HTTP Server SSL configuration</String>
14 <String Id="WixExecHttpSniSslCertsInstall" Overridable="yes">Configuring Windows HTTP Server SSL</String>
15 <String Id="WixRollbackHttpSniSslCertsUninstall" Overridable="yes">Rolling back Windows HTTP Server SSL configuration</String>
16 <String Id="WixExecHttpSniSslCertsUninstall" Overridable="yes">Configuring Windows HTTP Server SSL</String>
17</WixLocalization>
diff --git a/src/ext/Http/wixlib/http.wixproj b/src/ext/Http/wixlib/http.wixproj
new file mode 100644
index 00000000..999b7334
--- /dev/null
+++ b/src/ext/Http/wixlib/http.wixproj
@@ -0,0 +1,24 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2<Project Sdk="WixToolset.Sdk">
3 <PropertyGroup>
4 <OutputType>Library</OutputType>
5 <BindFiles>true</BindFiles>
6 <Cultures>en-us</Cultures>
7 </PropertyGroup>
8
9 <ItemGroup>
10 <BindInputPaths Include="$(OutputPath)x86" BindName='x86' />
11 <BindInputPaths Include="$(OutputPath)x64" BindName='x64' />
12 <BindInputPaths Include="$(OutputPath)arm64" BindName='arm64' />
13 </ItemGroup>
14
15 <ItemGroup>
16 <ProjectReference Include="..\ca\httpca.vcxproj" Properties="Platform=ARM64" />
17 <ProjectReference Include="..\ca\httpca.vcxproj" Properties="Platform=x86" />
18 <ProjectReference Include="..\ca\httpca.vcxproj" Properties="Platform=x64" />
19 </ItemGroup>
20
21 <ItemGroup>
22 <PackageReference Include="Nerdbank.GitVersioning" Version="3.3.37" PrivateAssets="All" />
23 </ItemGroup>
24</Project> \ No newline at end of file
diff --git a/src/ext/Iis/CSharp.Build.props b/src/ext/Iis/CSharp.Build.props
new file mode 100644
index 00000000..b12f4c6e
--- /dev/null
+++ b/src/ext/Iis/CSharp.Build.props
@@ -0,0 +1,11 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2<!--
3 Do NOT modify this file. Update the canonical version in Home\repo-template\src\CSharp.Build.props
4 then update all of the repos.
5-->
6<Project>
7 <PropertyGroup>
8 <SignAssembly>true</SignAssembly>
9 <AssemblyOriginatorKeyFile>$([System.IO.Path]::GetFullPath($(MSBuildThisFileDirectory)wix.snk))</AssemblyOriginatorKeyFile>
10 </PropertyGroup>
11</Project>
diff --git a/src/ext/Iis/Cpp.Build.props b/src/ext/Iis/Cpp.Build.props
new file mode 100644
index 00000000..9b7a1bb5
--- /dev/null
+++ b/src/ext/Iis/Cpp.Build.props
@@ -0,0 +1,86 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3
4<Project>
5 <PropertyGroup>
6 <Platform Condition=" '$(Platform)' == '' OR '$(Platform)' == 'AnyCPU' ">Win32</Platform>
7 <IntDir>$(BaseIntermediateOutputPath)$(Configuration)\$(Platform)\</IntDir>
8 <OutDir>$(OutputPath)$(Platform)\</OutDir>
9 </PropertyGroup>
10
11 <PropertyGroup Condition="'$(WindowsTargetPlatformVersion)'=='' AND '$(VisualStudioVersion)'>='15.0'">
12 <WindowsTargetPlatformVersion>$([Microsoft.Build.Utilities.ToolLocationHelper]::GetLatestSDKTargetPlatformVersion('Windows', '10.0'))</WindowsTargetPlatformVersion>
13 </PropertyGroup>
14
15 <ItemDefinitionGroup>
16 <ClCompile>
17 <DisableSpecificWarnings>$(DisableSpecificCompilerWarnings)</DisableSpecificWarnings>
18 <WarningLevel>Level4</WarningLevel>
19 <AdditionalIncludeDirectories>$(ProjectDir)inc;$(MSBuildProjectDirectory);$(IntDir);$(SqlCESdkIncludePath);$(ProjectAdditionalIncludeDirectories);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
20 <PreprocessorDefinitions>WIN32;_WINDOWS;_WIN32_MSI=500;_WIN32_WINNT=0x0501;$(ArmPreprocessorDefinitions);$(UnicodePreprocessorDefinitions);_CRT_STDIO_LEGACY_WIDE_SPECIFIERS;_WINSOCK_DEPRECATED_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
21 <PrecompiledHeader>Use</PrecompiledHeader>
22 <PrecompiledHeaderFile>precomp.h</PrecompiledHeaderFile>
23 <CallingConvention Condition="'$(Platform)'=='Win32'">StdCall</CallingConvention>
24 <TreatWarningAsError>true</TreatWarningAsError>
25 <ExceptionHandling>false</ExceptionHandling>
26 <AdditionalOptions>-YlprecompDefine</AdditionalOptions>
27 <AdditionalOptions Condition=" $(PlatformToolset.StartsWith('v14')) ">/Zc:threadSafeInit- %(AdditionalOptions)</AdditionalOptions>
28 <MultiProcessorCompilation Condition=" $(NUMBER_OF_PROCESSORS) &gt; 4 ">true</MultiProcessorCompilation>
29 </ClCompile>
30 <ResourceCompile>
31 <PreprocessorDefinitions>$(ArmPreprocessorDefinitions);%(PreprocessorDefinitions)</PreprocessorDefinitions>
32 <AdditionalIncludeDirectories>$(ProjectAdditionalResourceIncludeDirectories);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
33 </ResourceCompile>
34 <Lib>
35 <AdditionalLibraryDirectories>$(OutDir);$(AdditionalMultiTargetLibraryPath);$(ProjectAdditionalLibraryDirectories);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
36 </Lib>
37 <Link>
38 <SubSystem>$(ProjectSubSystem)</SubSystem>
39 <ModuleDefinitionFile>$(ProjectModuleDefinitionFile)</ModuleDefinitionFile>
40 <NoEntryPoint>$(ResourceOnlyDll)</NoEntryPoint>
41 <GenerateDebugInformation>true</GenerateDebugInformation>
42 <AdditionalDependencies>$(ProjectAdditionalLinkLibraries);advapi32.lib;comdlg32.lib;user32.lib;oleaut32.lib;gdi32.lib;shell32.lib;ole32.lib;version.lib;%(AdditionalDependencies)</AdditionalDependencies>
43 <AdditionalLibraryDirectories>$(OutDir);$(AdditionalMultiTargetLibraryPath);$(ArmLibraryDirectories);$(ProjectAdditionalLinkLibraryDirectories);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
44 <AdditionalOptions Condition=" $(PlatformToolset.StartsWith('v14')) ">/IGNORE:4099 %(AdditionalOptions)</AdditionalOptions>
45 </Link>
46 </ItemDefinitionGroup>
47
48 <ItemDefinitionGroup Condition=" '$(Platform)'=='Win32' and '$(PlatformToolset)'!='v100'">
49 <ClCompile>
50 <EnableEnhancedInstructionSet>NoExtensions</EnableEnhancedInstructionSet>
51 </ClCompile>
52 </ItemDefinitionGroup>
53 <ItemDefinitionGroup Condition=" '$(Platform)'=='arm' ">
54 <ClCompile>
55 <CallingConvention>CDecl</CallingConvention>
56 </ClCompile>
57 </ItemDefinitionGroup>
58 <ItemDefinitionGroup Condition=" '$(ConfigurationType)'=='StaticLibrary' ">
59 <ClCompile>
60 <DebugInformationFormat>OldStyle</DebugInformationFormat>
61 <OmitDefaultLibName>true</OmitDefaultLibName>
62 <IgnoreAllDefaultLibraries>true</IgnoreAllDefaultLibraries>
63 </ClCompile>
64 </ItemDefinitionGroup>
65 <ItemDefinitionGroup Condition=" '$(Configuration)'=='Debug' ">
66 <ClCompile>
67 <Optimization>Disabled</Optimization>
68 <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
69 <PreprocessorDefinitions>_DEBUG;DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
70 <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
71 </ClCompile>
72 </ItemDefinitionGroup>
73 <ItemDefinitionGroup Condition=" '$(Configuration)'=='Release' ">
74 <ClCompile>
75 <Optimization>MinSpace</Optimization>
76 <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
77 <FunctionLevelLinking>true</FunctionLevelLinking>
78 <IntrinsicFunctions>true</IntrinsicFunctions>
79 <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
80 </ClCompile>
81 <Link>
82 <EnableCOMDATFolding>true</EnableCOMDATFolding>
83 <OptimizeReferences>true</OptimizeReferences>
84 </Link>
85 </ItemDefinitionGroup>
86</Project>
diff --git a/src/ext/Iis/Directory.Build.props b/src/ext/Iis/Directory.Build.props
new file mode 100644
index 00000000..f83cc154
--- /dev/null
+++ b/src/ext/Iis/Directory.Build.props
@@ -0,0 +1,29 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3<!--
4 Do NOT modify this file. Update the canonical version in Home\repo-template\src\Directory.Build.props
5 then update all of the repos.
6-->
7<Project>
8 <PropertyGroup>
9 <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
10 <EnableSourceLink Condition=" '$(NCrunch)' == '1' ">false</EnableSourceLink>
11 <MSBuildWarningsAsMessages>MSB3246</MSBuildWarningsAsMessages>
12
13 <ProjectName Condition=" '$(ProjectName)' == '' ">$(MSBuildProjectName)</ProjectName>
14 <BaseOutputPath>$([System.IO.Path]::GetFullPath($(MSBuildThisFileDirectory)..\build\))</BaseOutputPath>
15 <BaseIntermediateOutputPath>$(BaseOutputPath)obj\$(ProjectName)\</BaseIntermediateOutputPath>
16 <OutputPath>$(BaseOutputPath)$(Configuration)\</OutputPath>
17
18 <Authors>WiX Toolset Team</Authors>
19 <Company>WiX Toolset</Company>
20 <Copyright>Copyright (c) .NET Foundation and contributors. All rights reserved.</Copyright>
21 <PackageLicenseExpression>MS-RL</PackageLicenseExpression>
22 <Product>WiX Toolset</Product>
23 </PropertyGroup>
24
25 <Import Project="CSharp.Build.props" Condition=" '$(MSBuildProjectExtension)'=='.csproj' and Exists('CSharp.Build.props') " />
26 <Import Project="Cpp.Build.props" Condition=" Exists('Cpp.Build.props') And '$(MSBuildProjectExtension)'=='.vcxproj' " />
27 <Import Project="Wix.Build.props" Condition=" Exists('Wix.Build.props') And '$(MSBuildProjectExtension)'=='.wixproj' " />
28 <Import Project="Custom.Build.props" Condition=" Exists('Custom.Build.props') " />
29</Project>
diff --git a/src/ext/Iis/Directory.Build.targets b/src/ext/Iis/Directory.Build.targets
new file mode 100644
index 00000000..dac7452a
--- /dev/null
+++ b/src/ext/Iis/Directory.Build.targets
@@ -0,0 +1,48 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3<!--
4 Do NOT modify this file. Update the canonical version in Home\repo-template\src\Directory.Build.targets
5 then update all of the repos.
6-->
7<!--
8 Replace PackageReferences with ProjectReferences when the projects can be found in .sln.
9 See the original here: https://github.com/dotnet/sdk/issues/1151#issuecomment-385133284
10-->
11<Project>
12 <PropertyGroup>
13 <ReplacePackageReferences>true</ReplacePackageReferences>
14 <TheSolutionPath Condition=" '$(NCrunch)'=='' ">$(SolutionPath)</TheSolutionPath>
15 <TheSolutionPath Condition=" '$(NCrunch)'=='1' ">$(NCrunchOriginalSolutionPath)</TheSolutionPath>
16 </PropertyGroup>
17
18 <Choose>
19 <When Condition="$(ReplacePackageReferences) AND '$(TheSolutionPath)' != '' AND '$(TheSolutionPath)' != '*undefined*' AND Exists('$(TheSolutionPath)')">
20
21 <PropertyGroup>
22 <SolutionFileContent>$([System.IO.File]::ReadAllText($(TheSolutionPath)))</SolutionFileContent>
23 <SmartSolutionDir>$([System.IO.Path]::GetDirectoryName( $(TheSolutionPath) ))</SmartSolutionDir>
24 <RegexPattern>(?&lt;="[PackageName]", ")(.*)(?=", ")</RegexPattern>
25 </PropertyGroup>
26
27 <ItemGroup>
28 <!-- Keep the identity of the PackageReference -->
29 <SmartPackageReference Include="@(PackageReference)">
30 <PackageName>%(Identity)</PackageName>
31 <InSolution>$(SolutionFileContent.Contains('\%(Identity).csproj'))</InSolution>
32 </SmartPackageReference>
33
34 <!-- Filter them by mapping them to another ItemGroup using the WithMetadataValue item function -->
35 <PackageInSolution Include="@(SmartPackageReference->WithMetadataValue('InSolution', True))">
36 <Pattern>$(RegexPattern.Replace('[PackageName]','%(PackageName)') )</Pattern>
37 <SmartPath>$([System.Text.RegularExpressions.Regex]::Match('$(SolutionFileContent)', '%(Pattern)'))</SmartPath>
38 </PackageInSolution>
39
40 <ProjectReference Include="@(PackageInSolution->'$(SmartSolutionDir)\%(SmartPath)' )"/>
41
42 <!-- Remove the package references that are now referenced as projects -->
43 <PackageReference Remove="@(PackageInSolution->'%(PackageName)' )"/>
44 </ItemGroup>
45
46 </When>
47 </Choose>
48</Project>
diff --git a/src/ext/Iis/Iis.wixext.sln b/src/ext/Iis/Iis.wixext.sln
new file mode 100644
index 00000000..85323fde
--- /dev/null
+++ b/src/ext/Iis/Iis.wixext.sln
@@ -0,0 +1,58 @@
1
2Microsoft Visual Studio Solution File, Format Version 12.00
3# Visual Studio Version 16
4VisualStudioVersion = 16.0.30204.135
5MinimumVisualStudioVersion = 10.0.40219.1
6Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "iisca", "src\ca\iisca.vcxproj", "{CB3FB8C4-14BF-4EA6-9F01-7FB258E5AEF3}"
7EndProject
8Project("{930C7802-8A8C-48F9-8165-68863BCCD9DD}") = "iis", "src\wixlib\iis.wixproj", "{92FE99D2-355D-4F52-A7C1-10EECB4A5BB1}"
9EndProject
10Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WixToolset.Iis.wixext", "src\wixext\WixToolset.Iis.wixext.csproj", "{612029FB-B5D4-4D7E-B794-A0E202BFE493}"
11EndProject
12Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WixToolsetTest.Iis", "src\test\WixToolsetTest.Iis\WixToolsetTest.Iis.csproj", "{E62712D7-31A1-49E4-B1F4-0084FAD14193}"
13EndProject
14Global
15 GlobalSection(SolutionConfigurationPlatforms) = preSolution
16 Debug|Any CPU = Debug|Any CPU
17 Debug|x86 = Debug|x86
18 Release|Any CPU = Release|Any CPU
19 Release|x86 = Release|x86
20 EndGlobalSection
21 GlobalSection(ProjectConfigurationPlatforms) = postSolution
22 {CB3FB8C4-14BF-4EA6-9F01-7FB258E5AEF3}.Debug|Any CPU.ActiveCfg = Debug|Win32
23 {CB3FB8C4-14BF-4EA6-9F01-7FB258E5AEF3}.Debug|Any CPU.Build.0 = Debug|Win32
24 {CB3FB8C4-14BF-4EA6-9F01-7FB258E5AEF3}.Debug|x86.ActiveCfg = Debug|Win32
25 {CB3FB8C4-14BF-4EA6-9F01-7FB258E5AEF3}.Debug|x86.Build.0 = Debug|Win32
26 {CB3FB8C4-14BF-4EA6-9F01-7FB258E5AEF3}.Release|Any CPU.ActiveCfg = Release|Win32
27 {CB3FB8C4-14BF-4EA6-9F01-7FB258E5AEF3}.Release|x86.ActiveCfg = Release|Win32
28 {CB3FB8C4-14BF-4EA6-9F01-7FB258E5AEF3}.Release|x86.Build.0 = Release|Win32
29 {92FE99D2-355D-4F52-A7C1-10EECB4A5BB1}.Debug|Any CPU.ActiveCfg = Debug|x86
30 {92FE99D2-355D-4F52-A7C1-10EECB4A5BB1}.Debug|x86.ActiveCfg = Debug|x86
31 {92FE99D2-355D-4F52-A7C1-10EECB4A5BB1}.Debug|x86.Build.0 = Debug|x86
32 {92FE99D2-355D-4F52-A7C1-10EECB4A5BB1}.Release|Any CPU.ActiveCfg = Release|x86
33 {92FE99D2-355D-4F52-A7C1-10EECB4A5BB1}.Release|x86.ActiveCfg = Release|x86
34 {92FE99D2-355D-4F52-A7C1-10EECB4A5BB1}.Release|x86.Build.0 = Release|x86
35 {612029FB-B5D4-4D7E-B794-A0E202BFE493}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
36 {612029FB-B5D4-4D7E-B794-A0E202BFE493}.Debug|Any CPU.Build.0 = Debug|Any CPU
37 {612029FB-B5D4-4D7E-B794-A0E202BFE493}.Debug|x86.ActiveCfg = Debug|Any CPU
38 {612029FB-B5D4-4D7E-B794-A0E202BFE493}.Debug|x86.Build.0 = Debug|Any CPU
39 {612029FB-B5D4-4D7E-B794-A0E202BFE493}.Release|Any CPU.ActiveCfg = Release|Any CPU
40 {612029FB-B5D4-4D7E-B794-A0E202BFE493}.Release|Any CPU.Build.0 = Release|Any CPU
41 {612029FB-B5D4-4D7E-B794-A0E202BFE493}.Release|x86.ActiveCfg = Release|Any CPU
42 {612029FB-B5D4-4D7E-B794-A0E202BFE493}.Release|x86.Build.0 = Release|Any CPU
43 {E62712D7-31A1-49E4-B1F4-0084FAD14193}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
44 {E62712D7-31A1-49E4-B1F4-0084FAD14193}.Debug|Any CPU.Build.0 = Debug|Any CPU
45 {E62712D7-31A1-49E4-B1F4-0084FAD14193}.Debug|x86.ActiveCfg = Debug|Any CPU
46 {E62712D7-31A1-49E4-B1F4-0084FAD14193}.Debug|x86.Build.0 = Debug|Any CPU
47 {E62712D7-31A1-49E4-B1F4-0084FAD14193}.Release|Any CPU.ActiveCfg = Release|Any CPU
48 {E62712D7-31A1-49E4-B1F4-0084FAD14193}.Release|Any CPU.Build.0 = Release|Any CPU
49 {E62712D7-31A1-49E4-B1F4-0084FAD14193}.Release|x86.ActiveCfg = Release|Any CPU
50 {E62712D7-31A1-49E4-B1F4-0084FAD14193}.Release|x86.Build.0 = Release|Any CPU
51 EndGlobalSection
52 GlobalSection(SolutionProperties) = preSolution
53 HideSolutionNode = FALSE
54 EndGlobalSection
55 GlobalSection(ExtensibilityGlobals) = postSolution
56 SolutionGuid = {89256463-14A3-4968-8688-F75EC230B021}
57 EndGlobalSection
58EndGlobal
diff --git a/src/ext/Iis/README.md b/src/ext/Iis/README.md
new file mode 100644
index 00000000..ddb21a82
--- /dev/null
+++ b/src/ext/Iis/README.md
@@ -0,0 +1,2 @@
1# Iis.wixext
2WixToolset.Iis.wixext - Iis WiX Toolset Extension
diff --git a/src/ext/Iis/appveyor.cmd b/src/ext/Iis/appveyor.cmd
new file mode 100644
index 00000000..af993a8f
--- /dev/null
+++ b/src/ext/Iis/appveyor.cmd
@@ -0,0 +1,14 @@
1@setlocal
2@pushd %~dp0
3
4nuget restore || exit /b
5
6msbuild -p:Configuration=Release -t:Restore || exit /b
7
8msbuild -p:Configuration=Release src\test\WixToolsetTest.Iis\WixToolsetTest.Iis.csproj || exit /b
9dotnet test -c Release --no-build src\test\WixToolsetTest.Iis || exit /b
10
11msbuild -p:Configuration=Release -t:Pack src\wixext\WixToolset.Iis.wixext.csproj || exit /b
12
13@popd
14@endlocal \ No newline at end of file
diff --git a/src/ext/Iis/appveyor.yml b/src/ext/Iis/appveyor.yml
new file mode 100644
index 00000000..7c686b04
--- /dev/null
+++ b/src/ext/Iis/appveyor.yml
@@ -0,0 +1,40 @@
1# Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2#
3# Do NOT modify this file. Update the canonical version in Home\repo-template\src\appveyor.yml
4# then update all of the repos.
5
6branches:
7 only:
8 - master
9 - develop
10
11image: Visual Studio 2019
12
13version: 0.0.0.{build}
14configuration: Release
15
16environment:
17 DOTNET_SKIP_FIRST_TIME_EXPERIENCE: true
18 DOTNET_CLI_TELEMETRY_OPTOUT: 1
19 NUGET_XMLDOC_MODE: skip
20
21build_script:
22 - appveyor.cmd
23
24pull_requests:
25 do_not_increment_build_number: true
26
27nuget:
28 disable_publish_on_pr: true
29
30skip_branch_with_pr: true
31skip_tags: true
32
33artifacts:
34- path: build\Release\**\*.nupkg
35 name: nuget
36
37notifications:
38- provider: Slack
39 incoming_webhook:
40 secure: p5xuu+4x2JHfwGDMDe5KcG1k7gZxqYc4jWVwvyNZv5cvkubPD2waJs5yXMAXZNN7Z63/3PWHb7q4KoY/99AjauYa1nZ4c5qYqRPFRBKTHfA=
diff --git a/src/ext/Iis/ca/CustomMsiErrors.h b/src/ext/Iis/ca/CustomMsiErrors.h
new file mode 100644
index 00000000..1fd8d050
--- /dev/null
+++ b/src/ext/Iis/ca/CustomMsiErrors.h
@@ -0,0 +1,48 @@
1#pragma once
2// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
3
4#define msierrIISCannotConnect 26001
5#define msierrIISFailedReadWebSite 26002
6#define msierrIISFailedReadWebDirs 26003
7#define msierrIISFailedReadVDirs 26004
8#define msierrIISFailedReadFilters 26005
9#define msierrIISFailedReadAppPool 26006
10#define msierrIISFailedReadMimeMap 26007
11#define msierrIISFailedReadProp 26008
12#define msierrIISFailedReadWebSvcExt 26009
13#define msierrIISFailedReadWebError 26010
14#define msierrIISFailedReadHttpHeader 26011
15
16#define msierrIISFailedSchedTransaction 26031
17#define msierrIISFailedSchedInstallWebs 26032
18#define msierrIISFailedSchedInstallWebDirs 26033
19#define msierrIISFailedSchedInstallVDirs 26034
20#define msierrIISFailedSchedInstallFilters 26035
21#define msierrIISFailedSchedInstallAppPool 26036
22#define msierrIISFailedSchedInstallProp 26037
23#define msierrIISFailedSchedInstallWebSvcExt 26038
24
25#define msierrIISFailedSchedUninstallWebs 26051
26#define msierrIISFailedSchedUninstallWebDirs 26052
27#define msierrIISFailedSchedUninstallVDirs 26053
28#define msierrIISFailedSchedUninstallFilters 26054
29#define msierrIISFailedSchedUninstallAppPool 26055
30#define msierrIISFailedSchedUninstallProp 26056
31#define msierrIISFailedSchedUninstallWebSvcExt 26057
32
33#define msierrIISFailedStartTransaction 26101
34#define msierrIISFailedOpenKey 26102
35#define msierrIISFailedCreateKey 26103
36#define msierrIISFailedWriteData 26104
37#define msierrIISFailedCreateApp 26105
38#define msierrIISFailedDeleteKey 26106
39#define msierrIISFailedDeleteApp 26107
40#define msierrIISFailedDeleteValue 26108
41#define msierrIISFailedCommitInUse 26109
42
43// Last available value 26200
44
45#define msierrCERTFailedOpen 26351
46#define msierrCERTFailedAdd 26352
47
48// Last available value 26450
diff --git a/src/ext/Iis/ca/caDecor.h b/src/ext/Iis/ca/caDecor.h
new file mode 100644
index 00000000..da274650
--- /dev/null
+++ b/src/ext/Iis/ca/caDecor.h
@@ -0,0 +1,13 @@
1#pragma once
2// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
3
4
5#if defined(_M_ARM64)
6#define CUSTOM_ACTION_DECORATION(f) L"Wix4" f L"_A64"
7#elif defined(_M_AMD64)
8#define CUSTOM_ACTION_DECORATION(f) L"Wix4" f L"_X64"
9#elif defined(_M_ARM)
10#define CUSTOM_ACTION_DECORATION(f) L"Wix4" f L"_ARM"
11#else
12#define CUSTOM_ACTION_DECORATION(f) L"Wix4" f L"_X86"
13#endif
diff --git a/src/ext/Iis/ca/dllmain.cpp b/src/ext/Iis/ca/dllmain.cpp
new file mode 100644
index 00000000..35ae6d1c
--- /dev/null
+++ b/src/ext/Iis/ca/dllmain.cpp
@@ -0,0 +1,26 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3#include "precomp.h"
4
5/********************************************************************
6DllMain - standard entry point for all WiX custom actions
7
8********************************************************************/
9extern "C" BOOL WINAPI DllMain(
10 IN HINSTANCE hInst,
11 IN ULONG ulReason,
12 IN LPVOID)
13{
14 switch(ulReason)
15 {
16 case DLL_PROCESS_ATTACH:
17 WcaGlobalInitialize(hInst);
18 break;
19
20 case DLL_PROCESS_DETACH:
21 WcaGlobalFinalize();
22 break;
23 }
24
25 return TRUE;
26}
diff --git a/src/ext/Iis/ca/iisca.cpp b/src/ext/Iis/ca/iisca.cpp
new file mode 100644
index 00000000..37664a1c
--- /dev/null
+++ b/src/ext/Iis/ca/iisca.cpp
@@ -0,0 +1,3 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3#include "precomp.h"
diff --git a/src/ext/Iis/ca/iisca.def b/src/ext/Iis/ca/iisca.def
new file mode 100644
index 00000000..b9127da6
--- /dev/null
+++ b/src/ext/Iis/ca/iisca.def
@@ -0,0 +1,30 @@
1; Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3
4LIBRARY "iisca"
5
6EXPORTS
7;scacert.cpp
8 InstallCertificates
9 UninstallCertificates
10;scacertexec.cpp
11 AddUserCertificate
12 AddMachineCertificate
13 DeleteUserCertificate
14 DeleteMachineCertificate
15;scaexec.cpp
16 StartMetabaseTransaction
17 RollbackMetabaseTransaction
18 CommitMetabaseTransaction
19
20 WriteMetabaseChanges
21
22 StartIIS7ConfigTransaction
23 RollbackIIS7ConfigTransaction
24 CommitIIS7ConfigTransaction
25
26 WriteIIS7ConfigChanges
27;scasched.cpp
28 ConfigureIIs
29 ConfigureIIsExec
30 ConfigureIIs7Exec
diff --git a/src/ext/Iis/ca/iisca.vcxproj b/src/ext/Iis/ca/iisca.vcxproj
new file mode 100644
index 00000000..eb1174be
--- /dev/null
+++ b/src/ext/Iis/ca/iisca.vcxproj
@@ -0,0 +1,147 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3<Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
4 <Import Project="..\..\packages\WixToolset.DUtil.4.0.30\build\WixToolset.DUtil.props" Condition="Exists('..\..\packages\WixToolset.DUtil.4.0.30\build\WixToolset.DUtil.props')" />
5 <Import Project="..\..\packages\WixToolset.WcaUtil.4.0.16\build\WixToolset.WcaUtil.props" Condition="Exists('..\..\packages\WixToolset.WcaUtil.4.0.16\build\WixToolset.WcaUtil.props')" />
6
7 <ItemGroup Label="ProjectConfigurations">
8 <ProjectConfiguration Include="Debug|Win32">
9 <Configuration>Debug</Configuration>
10 <Platform>Win32</Platform>
11 </ProjectConfiguration>
12 <ProjectConfiguration Include="Release|Win32">
13 <Configuration>Release</Configuration>
14 <Platform>Win32</Platform>
15 </ProjectConfiguration>
16 <ProjectConfiguration Include="Debug|x64">
17 <Configuration>Debug</Configuration>
18 <Platform>x64</Platform>
19 </ProjectConfiguration>
20 <ProjectConfiguration Include="Release|x64">
21 <Configuration>Release</Configuration>
22 <Platform>x64</Platform>
23 </ProjectConfiguration>
24 <ProjectConfiguration Include="Debug|ARM64">
25 <Configuration>Debug</Configuration>
26 <Platform>ARM64</Platform>
27 </ProjectConfiguration>
28 <ProjectConfiguration Include="Release|ARM64">
29 <Configuration>Release</Configuration>
30 <Platform>ARM64</Platform>
31 </ProjectConfiguration>
32 </ItemGroup>
33
34 <PropertyGroup Label="Globals">
35 <ProjectGuid>{CB3FB8C4-14BF-4EA6-9F01-7FB258E5AEF3}</ProjectGuid>
36 <ConfigurationType>DynamicLibrary</ConfigurationType>
37 <TargetName>iisca</TargetName>
38 <PlatformToolset>v142</PlatformToolset>
39 <CharacterSet>Unicode</CharacterSet>
40 <ProjectModuleDefinitionFile>iisca.def</ProjectModuleDefinitionFile>
41 <Description>WiX Toolset Iis CustomAction</Description>
42 </PropertyGroup>
43
44 <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
45 <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
46
47 <PropertyGroup>
48 <ProjectAdditionalLinkLibraries>crypt32.lib;msi.lib;Ws2_32.lib</ProjectAdditionalLinkLibraries>
49 </PropertyGroup>
50
51 <ItemGroup>
52 <ClCompile Include="dllmain.cpp">
53 <PrecompiledHeader>Create</PrecompiledHeader>
54 </ClCompile>
55 <ClCompile Include="iisca.cpp" />
56 <ClCompile Include="scaapppool.cpp" />
57 <ClCompile Include="scaapppool7.cpp" />
58 <ClCompile Include="scacert.cpp" />
59 <ClCompile Include="scacertexec.cpp" />
60 <ClCompile Include="scaexec.cpp" />
61 <ClCompile Include="scaexecIIS7.cpp" />
62 <ClCompile Include="scafilter.cpp" />
63 <ClCompile Include="scafilter7.cpp" />
64 <ClCompile Include="scahttpheader.cpp" />
65 <ClCompile Include="scahttpheader7.cpp" />
66 <ClCompile Include="scaiis.cpp" />
67 <ClCompile Include="scaiis7.cpp" />
68 <ClCompile Include="scamimemap.cpp" />
69 <ClCompile Include="scamimemap7.cpp" />
70 <ClCompile Include="scaproperty.cpp" />
71 <ClCompile Include="scaproperty7.cpp" />
72 <ClCompile Include="scasched.cpp" />
73 <ClCompile Include="scassl.cpp" />
74 <ClCompile Include="scassl7.cpp" />
75 <ClCompile Include="scauser.cpp" />
76 <ClCompile Include="scavdir.cpp" />
77 <ClCompile Include="scavdir7.cpp" />
78 <ClCompile Include="scaweb.cpp" />
79 <ClCompile Include="scaweb7.cpp" />
80 <ClCompile Include="scawebapp.cpp" />
81 <ClCompile Include="scawebapp7.cpp" />
82 <ClCompile Include="scawebappext.cpp" />
83 <ClCompile Include="scawebappext7.cpp" />
84 <ClCompile Include="scawebdir.cpp" />
85 <ClCompile Include="scawebdir7.cpp" />
86 <ClCompile Include="scaweberr.cpp" />
87 <ClCompile Include="scaweberr7.cpp" />
88 <ClCompile Include="scaweblog.cpp" />
89 <ClCompile Include="scaweblog7.cpp" />
90 <ClCompile Include="scawebprop.cpp" />
91 <ClCompile Include="scawebprop7.cpp" />
92 <ClCompile Include="scawebsvcext.cpp" />
93 <ClCompile Include="scawebsvcext7.cpp" />
94 <ClInclude Include="caSuffix.h" />
95 <ClInclude Include="CustomMsiErrors.h" />
96 <ClInclude Include="precomp.h" />
97 <ClInclude Include="sca.h" />
98 <ClInclude Include="scaapppool.h" />
99 <ClInclude Include="scaapppool7.h" />
100 <ClInclude Include="scacert.h" />
101 <ClInclude Include="scacost.h" />
102 <ClInclude Include="scaexecIIS7.h" />
103 <ClInclude Include="scafilter.h" />
104 <ClInclude Include="scafilter7.h" />
105 <ClInclude Include="scahttpheader.h" />
106 <ClInclude Include="scahttpheader7.h" />
107 <ClInclude Include="scaiis.h" />
108 <ClInclude Include="scaiis7.h" />
109 <ClInclude Include="scamimemap.h" />
110 <ClInclude Include="scamimemap7.h" />
111 <ClInclude Include="scaproperty.h" />
112 <ClInclude Include="scaproperty7.h" />
113 <ClInclude Include="scassl.h" />
114 <ClInclude Include="scassl7.h" />
115 <ClInclude Include="scauser.h" />
116 <ClInclude Include="scavdir.h" />
117 <ClInclude Include="scavdir7.h" />
118 <ClInclude Include="scaweb.h" />
119 <ClInclude Include="scaweb7.h" />
120 <ClInclude Include="scawebapp.h" />
121 <ClInclude Include="scawebapp7.h" />
122 <ClInclude Include="scawebappext.h" />
123 <ClInclude Include="scawebappext7.h" />
124 <ClInclude Include="scawebdir.h" />
125 <ClInclude Include="scawebdir7.h" />
126 <ClInclude Include="scaweberr.h" />
127 <ClInclude Include="scaweberr7.h" />
128 <ClInclude Include="scaweblog.h" />
129 <ClInclude Include="scaweblog7.h" />
130 <ClInclude Include="scawebprop.h" />
131 <ClInclude Include="scawebprop7.h" />
132 <ClInclude Include="scawebsvcext.h" />
133 <ClInclude Include="scawebsvcext7.h" />
134 <None Include="packages.config" />
135 <None Include="iisca.def" />
136 </ItemGroup>
137
138 <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
139
140 <Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
141 <PropertyGroup>
142 <ErrorText>This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
143 </PropertyGroup>
144 <Error Condition="!Exists('..\..\packages\WixToolset.DUtil.4.0.30\build\WixToolset.DUtil.props')" Text="$([System.String]::Format('$(ErrorText)', '..\..\packages\WixToolset.DUtil.4.0.30\build\WixToolset.DUtil.props'))" />
145 <Error Condition="!Exists('..\..\packages\WixToolset.WcaUtil.4.0.16\build\WixToolset.WcaUtil.props')" Text="$([System.String]::Format('$(ErrorText)', '..\..\packages\WixToolset.WcaUtil.4.0.16\build\WixToolset.WcaUtil.props'))" />
146 </Target>
147</Project> \ No newline at end of file
diff --git a/src/ext/Iis/ca/packages.config b/src/ext/Iis/ca/packages.config
new file mode 100644
index 00000000..e3dc0e43
--- /dev/null
+++ b/src/ext/Iis/ca/packages.config
@@ -0,0 +1,5 @@
1<?xml version="1.0" encoding="utf-8"?>
2<packages>
3 <package id="WixToolset.DUtil" version="4.0.30" targetFramework="native" />
4 <package id="WixToolset.WcaUtil" version="4.0.16" targetFramework="native" />
5</packages> \ No newline at end of file
diff --git a/src/ext/Iis/ca/precomp.h b/src/ext/Iis/ca/precomp.h
new file mode 100644
index 00000000..85ee0890
--- /dev/null
+++ b/src/ext/Iis/ca/precomp.h
@@ -0,0 +1,66 @@
1#pragma once
2// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
3
4
5#if _WIN32_MSI < 150
6#define _WIN32_MSI 150
7#endif
8
9#include <windows.h>
10#include <msiquery.h>
11#include <msidefs.h>
12#include <strsafe.h>
13
14#include <lm.h> // NetApi32.lib
15
16#include <Dsgetdc.h>
17#include <ComAdmin.h>
18#include <ahadmin.h> // IIS 7 config
19
20#define MAXUINT USHRT_MAX
21
22#include "wcautil.h"
23#include "wcawow64.h"
24#include "wcawrapquery.h"
25
26#include "certutil.h"
27#include "cryputil.h"
28#include "fileutil.h"
29#include "iis7util.h"
30#include "memutil.h"
31#include "metautil.h"
32#include "strutil.h"
33#include "userutil.h"
34#include "wiutil.h"
35
36#include "CustomMsiErrors.h"
37#include "sca.h"
38#include "scacost.h"
39#include "scacert.h"
40#include "scafilter.h"
41
42#include "scaiis.h"
43#include "scaiis7.h"
44#include "scaproperty.h"
45#include "scaweb.h"
46#include "scawebdir.h"
47#include "scawebsvcext.h"
48#include "scavdir.h"
49#include "scaweb7.h"
50#include "scaapppool7.h"
51#include "scavdir7.h"
52#include "scawebapp7.h"
53#include "scawebappext7.h"
54#include "scamimemap7.h"
55#include "scawebprop7.h"
56#include "scaweblog7.h"
57#include "scafilter7.h"
58#include "scahttpheader7.h"
59#include "scaweberr7.h"
60#include "scawebsvcext7.h"
61#include "scaproperty7.h"
62#include "scawebdir7.h"
63#include "scassl7.h"
64#include "scaexecIIS7.h"
65
66#include "caDecor.h"
diff --git a/src/ext/Iis/ca/sca.h b/src/ext/Iis/ca/sca.h
new file mode 100644
index 00000000..64567dcb
--- /dev/null
+++ b/src/ext/Iis/ca/sca.h
@@ -0,0 +1,124 @@
1#pragma once
2// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
3
4
5#define MAGIC_MULTISZ_CHAR 127
6
7// Generic action enum.
8enum SCA_ACTION
9{
10 SCA_ACTION_NONE,
11 SCA_ACTION_INSTALL,
12 SCA_ACTION_UNINSTALL
13};
14
15
16// IIS Metabase actions
17enum METABASE_ACTION
18{
19 MBA_UNKNOWNACTION = 0,
20 MBA_CREATEKEY,
21 MBA_DELETEKEY,
22 MBA_WRITEVALUE,
23 MBA_DELETEVALUE,
24 MBA_CREATEAPP,
25 MBA_DELETEAPP,
26};
27
28// IIS 7 Config actions
29enum IIS_CONFIG_ACTION
30{
31 IIS_CREATE,
32 IIS_DELETE,
33 IIS_SITE,
34 IIS_APPLICATION,
35 IIS_APPPOOL,
36 IIS_APPPOOL_RECYCLE_MIN,
37 IIS_APPPOOL_RECYCLE_REQ,
38 IIS_APPPOOL_RECYCLE_TIMES,
39 IIS_APPPOOL_RECYCLE_VIRMEM,
40 IIS_APPPOOL_RECYCLE_PRIVMEM,
41 IIS_APPPOOL_RECYCLE_IDLTIMEOUT,
42 IIS_APPPOOL_RECYCLE_QUEUELIMIT,
43 IIS_APPPOOL_RECYCLE_CPU_PCT,
44 IIS_APPPOOL_RECYCLE_CPU_REFRESH,
45 IIS_APPPOOL_RECYCLE_CPU_ACTION,
46 IIS_APPPOOL_MAXPROCESS,
47 IIS_APPPOOL_IDENTITY,
48 IIS_APPPOOL_USER,
49 IIS_APPPOOL_PWD,
50 IIS_APPPOOL_32BIT,
51 IIS_APPPOOL_MANAGED_PIPELINE_MODE,
52 IIS_APPPOOL_MANAGED_RUNTIME_VERSION,
53 IIS_APPPOOL_END,
54 IIS_APPEXT_BEGIN,
55 IIS_APPEXT,
56 IIS_APPEXT_END,
57 IIS_VDIR,
58 IIS_BINDING,
59 IIS_MIMEMAP_BEGIN,
60 IIS_MIMEMAP,
61 IIS_MIMEMAP_END,
62 IIS_DIRPROP_BEGIN,
63 IIS_DIRPROP_ACCESS,
64 IIS_DIRPROP_AUTH,
65 IIS_DIRPROP_USER,
66 IIS_DIRPROP_PWD,
67 IIS_DIRPROP_PWDCTRL,
68 IIS_DIRPROP_LOG,
69 IIS_DIRPROP_DEFDOCS,
70 IIS_DIRPROP_SSLFLAGS,
71 IIS_DIRPROP_AUTHPROVID,
72 IIS_DIRPROP_ASPERROR,
73 IIS_DIRPROP_HTTPEXPIRES,
74 IIS_DIRPROP_MAXAGE,
75 IIS_DIRPROP_CACHECUST,
76 IIS_DIRPROP_NOCUSTERROR,
77 IIS_DIRPROP_LOGVISITS,
78 IIS_DIRPROP_END,
79 IIS_WEBLOG,
80 IIS_FILTER_BEGIN,
81 IIS_FILTER_GLOBAL_BEGIN,
82 IIS_FILTER,
83 IIS_FILTER_END,
84 IIS_HTTP_HEADER_BEGIN,
85 IIS_HTTP_HEADER,
86 IIS_HTTP_HEADER_END,
87 IIS_WEBERROR_BEGIN,
88 IIS_WEBERROR,
89 IIS_WEBERROR_END,
90 IIS_WEB_SVC_EXT,
91 IIS_PROPERTY,
92 IIS_PROPERTY_MAXBAND,
93 IIS_PROPERTY_LOGUTF8,
94 IIS_WEBDIR,
95 IIS_ASP_BEGIN,
96 IIS_ASP_SESSIONSTATE,
97 IIS_ASP_SESSIONTIMEOUT,
98 IIS_ASP_BUFFER,
99 IIS_ASP_PARENTPATHS,
100 IIS_ASP_SCRIPTLANG,
101 IIS_ASP_SCRIPTTIMEOUT,
102 IIS_ASP_SCRIPTSERVERDEBUG,
103 IIS_ASP_SCRIPTCLIENTDEBUG,
104 IIS_ASP_END,
105 IIS_SSL_BINDING
106};
107
108
109// user creation attributes definitions
110enum SCAU_ATTRIBUTES
111{
112 SCAU_DONT_EXPIRE_PASSWRD = 0x00000001,
113 SCAU_PASSWD_CANT_CHANGE = 0x00000002,
114 SCAU_PASSWD_CHANGE_REQD_ON_LOGIN = 0x00000004,
115 SCAU_DISABLE_ACCOUNT = 0x00000008,
116 SCAU_FAIL_IF_EXISTS = 0x00000010,
117 SCAU_UPDATE_IF_EXISTS = 0x00000020,
118 SCAU_ALLOW_LOGON_AS_SERVICE = 0x00000040,
119 SCAU_ALLOW_LOGON_AS_BATCH = 0x00000080,
120
121 SCAU_DONT_REMOVE_ON_UNINSTALL = 0x00000100,
122 SCAU_DONT_CREATE_USER = 0x00000200,
123 SCAU_NON_VITAL = 0x00000400,
124};
diff --git a/src/ext/Iis/ca/scaapppool.cpp b/src/ext/Iis/ca/scaapppool.cpp
new file mode 100644
index 00000000..781c55ca
--- /dev/null
+++ b/src/ext/Iis/ca/scaapppool.cpp
@@ -0,0 +1,594 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3#include "precomp.h"
4
5/*------------------------------------------------------------------
6AppPool table:
7
8Column Type Nullable Example Value
9AppPool s72 No TestPool
10Name s72 No "TestPool"
11Component_ s72 No ComponentName
12Attributes i2 No 8 (APATTR_OTHERUSER)
13User_ s72 Yes UserKey
14RecycleMinutes i2 Yes 500
15RecycleRequests i2 Yes 5000
16RecycleTimes s72 Yes "1:45,13:30,22:00"
17IdleTimeout i2 Yes 15
18QueueLimit i2 Yes 500
19CPUMon s72 Yes "65,500,1" (65% CPU usage, 500 minutes, Shutdown Action)
20MaxProc i2 Yes 5
21ManagedRuntimeVersion s72 Yes "v2.0"
22ManagedPipelineMode s72 Yes "Integrated"
23
24Notes:
25RecycleTimes is a comma delimeted list of times. CPUMon is a
26comma delimeted list of the following format:
27<percent CPU usage>,<refress minutes>,<Action>. The values for
28Action are 1 (Shutdown) and 0 (No Action).
29
30------------------------------------------------------------------*/
31
32enum eAppPoolQuery { apqAppPool = 1, apqName, apqComponent, apqAttributes, apqUser, apqRecycleMinutes, apqRecycleRequests, apqRecycleTimes, apqVirtualMemory, apqPrivateMemory, apqIdleTimeout, apqQueueLimit, apqCpuMon, apqMaxProc, apqManagedRuntimeVersion, apqManagedPipelineMode, apqInstalled, apqAction };
33
34enum eComponentAttrQuery { caqComponent = 1, caqAttributes };
35
36// prototypes
37static HRESULT AppPoolExists(
38 __in IMSAdminBase* piMetabase,
39 __in LPCWSTR wzAppPool
40 );
41
42// functions
43
44void ScaAppPoolFreeList(
45 __in SCA_APPPOOL* psapList
46 )
47{
48 SCA_APPPOOL* psapDelete = psapList;
49 while (psapList)
50 {
51 psapDelete = psapList;
52 psapList = psapList->psapNext;
53
54 MemFree(psapDelete);
55 }
56}
57
58
59HRESULT ScaAppPoolRead(
60 __inout SCA_APPPOOL** ppsapList,
61 __in WCA_WRAPQUERY_HANDLE hUserQuery,
62 __inout LPWSTR *ppwzCustomActionData
63 )
64{
65 Assert(ppsapList);
66
67 HRESULT hr = S_OK;
68
69 MSIHANDLE hRec, hRecComp;
70 LPWSTR pwzData = NULL;
71 SCA_APPPOOL* psap = NULL;
72 WCA_WRAPQUERY_HANDLE hAppPoolQuery = NULL;
73 WCA_WRAPQUERY_HANDLE hComponentQuery = NULL;
74
75 hr = WcaBeginUnwrapQuery(&hAppPoolQuery, ppwzCustomActionData);
76 ExitOnFailure(hr, "Failed to unwrap query for ScaAppPoolRead");
77
78 if (0 == WcaGetQueryRecords(hAppPoolQuery))
79 {
80 WcaLog(LOGMSG_VERBOSE, "Skipping ScaAppPoolRead() - required table not present");
81 ExitFunction1(hr = S_FALSE);
82 }
83
84 hr = WcaBeginUnwrapQuery(&hComponentQuery, ppwzCustomActionData);
85 ExitOnFailure(hr, "Failed to unwrap query for ScaAppPoolRead");
86
87 // loop through all the AppPools
88 while (S_OK == (hr = WcaFetchWrappedRecord(hAppPoolQuery, &hRec)))
89 {
90 // Add this record's information into the list of things to process.
91 hr = AddAppPoolToList(ppsapList);
92 ExitOnFailure(hr, "failed to add app pool to app pool list");
93
94 psap = *ppsapList;
95
96 hr = WcaGetRecordString(hRec, apqComponent, &pwzData);
97 ExitOnFailure(hr, "failed to get AppPool.Component");
98
99 if (pwzData && *pwzData)
100 {
101 psap->fHasComponent = TRUE;
102
103 hr = ::StringCchCopyW(psap->wzComponent, countof(psap->wzComponent), pwzData);
104 ExitOnFailure(hr, "failed to copy component name: %ls", pwzData);
105
106 hr = WcaGetRecordInteger(hRec, apqInstalled, (int *)&psap->isInstalled);
107 ExitOnFailure(hr, "Failed to get Component installed state for app pool");
108
109 hr = WcaGetRecordInteger(hRec, apqAction, (int *)&psap->isAction);
110 ExitOnFailure(hr, "Failed to get Component action state for app pool");
111
112 WcaFetchWrappedReset(hComponentQuery);
113 hr = WcaFetchWrappedRecordWhereString(hComponentQuery, caqComponent, psap->wzComponent, &hRecComp);
114 ExitOnFailure(hr, "Failed to fetch Component.Attributes for Component '%ls'", psap->wzComponent);
115
116 hr = WcaGetRecordInteger(hRecComp, caqAttributes, &psap->iCompAttributes);
117 ExitOnFailure(hr, "failed to get Component.Attributes");
118 }
119
120 hr = WcaGetRecordString(hRec, apqAppPool, &pwzData);
121 ExitOnFailure(hr, "failed to get AppPool.AppPool");
122 hr = ::StringCchCopyW(psap->wzAppPool, countof(psap->wzAppPool), pwzData);
123 ExitOnFailure(hr, "failed to copy AppPool name: %ls", pwzData);
124
125 hr = WcaGetRecordString(hRec, apqName, &pwzData);
126 ExitOnFailure(hr, "failed to get AppPool.Name");
127 hr = ::StringCchCopyW(psap->wzName, countof(psap->wzName), pwzData);
128 ExitOnFailure(hr, "failed to copy app pool name: %ls", pwzData);
129 hr = ::StringCchPrintfW(psap->wzKey, countof(psap->wzKey), L"/LM/W3SVC/AppPools/%s", pwzData);
130 ExitOnFailure(hr, "failed to format app pool key name");
131
132 hr = WcaGetRecordInteger(hRec, apqAttributes, &psap->iAttributes);
133 ExitOnFailure(hr, "failed to get AppPool.Attributes");
134
135 hr = WcaGetRecordString(hRec, apqUser, &pwzData);
136 ExitOnFailure(hr, "failed to get AppPool.User");
137 hr = ScaGetUserDeferred(pwzData, hUserQuery, &psap->suUser);
138 ExitOnFailure(hr, "failed to get user: %ls", pwzData);
139
140 hr = WcaGetRecordInteger(hRec, apqRecycleRequests, &psap->iRecycleRequests);
141 ExitOnFailure(hr, "failed to get AppPool.RecycleRequests");
142
143 hr = WcaGetRecordInteger(hRec, apqRecycleMinutes, &psap->iRecycleMinutes);
144 ExitOnFailure(hr, "failed to get AppPool.Minutes");
145
146 hr = WcaGetRecordString(hRec, apqRecycleTimes, &pwzData);
147 ExitOnFailure(hr, "failed to get AppPool.RecycleTimes");
148 hr = ::StringCchCopyW(psap->wzRecycleTimes, countof(psap->wzRecycleTimes), pwzData);
149 ExitOnFailure(hr, "failed to copy recycle value: %ls", pwzData);
150
151 hr = WcaGetRecordInteger(hRec, apqVirtualMemory, &psap->iVirtualMemory);
152 ExitOnFailure(hr, "failed to get AppPool.VirtualMemory");
153
154 hr = WcaGetRecordInteger(hRec, apqPrivateMemory, &psap->iPrivateMemory);
155 ExitOnFailure(hr, "failed to get AppPool.PrivateMemory");
156
157 hr = WcaGetRecordInteger(hRec, apqIdleTimeout, &psap->iIdleTimeout);
158 ExitOnFailure(hr, "failed to get AppPool.IdleTimeout");
159
160 hr = WcaGetRecordInteger(hRec, apqQueueLimit, &psap->iQueueLimit);
161 ExitOnFailure(hr, "failed to get AppPool.QueueLimit");
162
163 hr = WcaGetRecordString(hRec, apqCpuMon, &pwzData);
164 ExitOnFailure(hr, "failed to get AppPool.CPUMon");
165 hr = ::StringCchCopyW(psap->wzCpuMon, countof(psap->wzCpuMon), pwzData);
166 ExitOnFailure(hr, "failed to copy cpu monitor value: %ls", pwzData);
167
168 hr = WcaGetRecordInteger(hRec, apqMaxProc, &psap->iMaxProcesses);
169 ExitOnFailure(hr, "failed to get AppPool.MaxProc");
170
171 hr = WcaGetRecordString(hRec, apqManagedRuntimeVersion, &pwzData);
172 ExitOnFailure(hr, "failed to get AppPool.ManagedRuntimeVersion");
173 hr = ::StringCchCopyW(psap->wzManagedRuntimeVersion, countof(psap->wzManagedRuntimeVersion), pwzData);
174 ExitOnFailure(hr, "failed to copy ManagedRuntimeVersion value: %ls", pwzData);
175
176 hr = WcaGetRecordString(hRec, apqManagedPipelineMode, &pwzData);
177 ExitOnFailure(hr, "failed to get AppPool.ManagedPipelineMode");
178 hr = ::StringCchCopyW(psap->wzManagedPipelineMode, countof(psap->wzManagedPipelineMode), pwzData);
179 ExitOnFailure(hr, "failed to copy ManagedPipelineMode value: %ls", pwzData);
180
181 }
182
183 if (E_NOMOREITEMS == hr)
184 {
185 hr = S_OK;
186 }
187 ExitOnFailure(hr, "failure while processing AppPools");
188
189LExit:
190 WcaFinishUnwrapQuery(hAppPoolQuery);
191 WcaFinishUnwrapQuery(hComponentQuery);
192
193 ReleaseStr(pwzData);
194 return hr;
195}
196
197
198HRESULT ScaFindAppPool(
199 __in IMSAdminBase* piMetabase,
200 __in LPCWSTR wzAppPool,
201 __out_ecount(cchName) LPWSTR wzName,
202 __in DWORD cchName,
203 __in SCA_APPPOOL *psapList
204 )
205{
206 Assert(piMetabase && wzAppPool && *wzAppPool && wzName && *wzName);
207
208 HRESULT hr = S_OK;
209
210 // check memory first
211 SCA_APPPOOL* psap = psapList;
212 for (; psap; psap = psap->psapNext)
213 {
214 if (0 == lstrcmpW(psap->wzAppPool, wzAppPool))
215 {
216 break;
217 }
218 }
219 ExitOnNull(psap, hr, HRESULT_FROM_WIN32(ERROR_NOT_FOUND), "Could not find the app pool: %ls", wzAppPool);
220
221 // copy the web app pool name
222 hr = ::StringCchCopyW(wzName, cchName, psap->wzName);
223 ExitOnFailure(hr, "failed to copy app pool name while finding app pool: %ls", psap->wzName);
224
225 // if it's not being installed now, check if it exists already
226 if (!psap->fHasComponent)
227 {
228 hr = AppPoolExists(piMetabase, psap->wzName);
229 ExitOnFailure(hr, "failed to check for existence of app pool: %ls", psap->wzName);
230 }
231
232LExit:
233 return hr;
234}
235
236
237static HRESULT AppPoolExists(
238 __in IMSAdminBase* piMetabase,
239 __in LPCWSTR wzAppPool
240 )
241{
242 Assert(piMetabase && wzAppPool && *wzAppPool);
243
244 HRESULT hr = S_OK;
245 WCHAR wzSubKey[METADATA_MAX_NAME_LEN];
246
247 for (DWORD dwIndex = 0; SUCCEEDED(hr); ++dwIndex)
248 {
249 hr = piMetabase->EnumKeys(METADATA_MASTER_ROOT_HANDLE, L"/LM/W3SVC/AppPools", wzSubKey, dwIndex);
250 if (SUCCEEDED(hr) && 0 == lstrcmpW(wzSubKey, wzAppPool))
251 {
252 hr = S_OK;
253 break;
254 }
255 }
256
257 if (E_NOMOREITEMS == hr || HRESULT_FROM_WIN32(ERROR_PATH_NOT_FOUND) == hr || HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND) == hr)
258 {
259 hr = S_FALSE;
260 }
261
262 return hr;
263}
264
265
266HRESULT ScaAppPoolInstall(
267 __in IMSAdminBase* piMetabase,
268 __in SCA_APPPOOL* psapList
269 )
270{
271 Assert(piMetabase);
272
273 HRESULT hr = S_OK;
274
275 for (SCA_APPPOOL* psap = psapList; psap; psap = psap->psapNext)
276 {
277 // if we are installing the app pool
278 if (psap->fHasComponent && WcaIsInstalling(psap->isInstalled, psap->isAction))
279 {
280 hr = ScaWriteAppPool(piMetabase, psap);
281 ExitOnFailure(hr, "failed to write AppPool '%ls' to metabase", psap->wzAppPool);
282 }
283 }
284
285LExit:
286 return hr;
287}
288
289
290HRESULT ScaAppPoolUninstall(
291 __in IMSAdminBase* piMetabase,
292 __in SCA_APPPOOL* psapList
293 )
294{
295 Assert(piMetabase);
296
297 HRESULT hr = S_OK;
298
299 for (SCA_APPPOOL* psap = psapList; psap; psap = psap->psapNext)
300 {
301 // if we are uninstalling the app pool
302 if (psap->fHasComponent && WcaIsUninstalling(psap->isInstalled, psap->isAction))
303 {
304 hr = ScaRemoveAppPool(piMetabase, psap);
305 ExitOnFailure(hr, "Failed to remove AppPool '%ls' from metabase", psap->wzAppPool);
306 }
307 }
308
309LExit:
310 return hr;
311}
312
313
314HRESULT ScaWriteAppPool(
315 __in IMSAdminBase* piMetabase,
316 __in SCA_APPPOOL* psap
317 )
318{
319 Assert(piMetabase && psap);
320
321 HRESULT hr = S_OK;
322 DWORD dwIdentity = 0xFFFFFFFF;
323 BOOL fExists = FALSE;
324 LPWSTR pwzValue = NULL;
325 LPWSTR wz = NULL;
326
327 hr = AppPoolExists(piMetabase, psap->wzName);
328 ExitOnFailure(hr, "failed to check if app pool already exists");
329 if (S_FALSE == hr)
330 {
331 // didn't find the AppPool key, so we need to create it
332 hr = ScaCreateMetabaseKey(piMetabase, psap->wzKey, L"");
333 ExitOnFailure(hr, "failed to create AppPool key: %ls", psap->wzKey);
334
335 // mark it as an AppPool
336 hr = ScaWriteMetabaseValue(piMetabase, psap->wzKey, NULL, MD_KEY_TYPE, METADATA_NO_ATTRIBUTES, IIS_MD_UT_SERVER, STRING_METADATA, (LPVOID)L"IIsApplicationPool");
337 ExitOnFailure(hr, "failed to mark key as AppPool key: %ls", psap->wzKey);
338
339 // TODO: Make this an Attribute?
340 // set autostart value
341 hr = ScaWriteMetabaseValue(piMetabase, psap->wzKey, NULL, MD_APPPOOL_AUTO_START, METADATA_NO_ATTRIBUTES, IIS_MD_UT_SERVER, DWORD_METADATA, (LPVOID)1);
342 ExitOnFailure(hr, "failed to mark key as AppPool key: %ls", psap->wzKey);
343 }
344 else
345 {
346 fExists = TRUE;
347 }
348
349 //
350 // Set the AppPool Recycling Tab
351 //
352 if (MSI_NULL_INTEGER != psap->iRecycleMinutes)
353 {
354 hr = ScaWriteMetabaseValue(piMetabase, psap->wzKey, NULL, MD_APPPOOL_PERIODIC_RESTART_TIME, METADATA_INHERIT, IIS_MD_UT_SERVER, DWORD_METADATA, (LPVOID)((DWORD_PTR)psap->iRecycleMinutes));
355 ExitOnFailure(hr, "failed to set periodic restart time");
356 }
357
358 if (MSI_NULL_INTEGER != psap->iRecycleRequests)
359 {
360 hr = ScaWriteMetabaseValue(piMetabase, psap->wzKey, NULL, MD_APPPOOL_PERIODIC_RESTART_REQUEST_COUNT, METADATA_INHERIT, IIS_MD_UT_SERVER, DWORD_METADATA, (LPVOID)((DWORD_PTR)psap->iRecycleRequests));
361 ExitOnFailure(hr, "failed to set periodic restart request count");
362 }
363
364 if (*psap->wzRecycleTimes)
365 {
366 // Add another NULL' onto pwz since it's a 'MULTISZ'
367 hr = StrAllocString(&pwzValue, psap->wzRecycleTimes, 0);
368 ExitOnFailure(hr, "failed to allocate string for MULTISZ");
369 hr = StrAllocConcat(&pwzValue, L"\0", 1);
370 ExitOnFailure(hr, "failed to add second null to RecycleTime multisz");
371
372 // Replace the commas with NULLs
373 wz = pwzValue;
374 while (NULL != (wz = wcschr(wz, L',')))
375 {
376 *wz = L'\0';
377 ++wz;
378 }
379
380 hr = ScaWriteMetabaseValue(piMetabase, psap->wzKey, NULL, MD_APPPOOL_PERIODIC_RESTART_SCHEDULE, METADATA_INHERIT, IIS_MD_UT_SERVER, MULTISZ_METADATA, (LPVOID)pwzValue);
381 ExitOnFailure(hr, "failed to set periodic restart schedule");
382 }
383
384 if (MSI_NULL_INTEGER != psap->iVirtualMemory)
385 {
386 hr = ScaWriteMetabaseValue(piMetabase, psap->wzKey, NULL, MD_APPPOOL_PERIODIC_RESTART_MEMORY, METADATA_INHERIT, IIS_MD_UT_SERVER, DWORD_METADATA, (LPVOID)((DWORD_PTR)psap->iVirtualMemory));
387 ExitOnFailure(hr, "failed to set periodic restart memory count");
388 }
389
390 if (MSI_NULL_INTEGER != psap->iPrivateMemory)
391 {
392 hr = ScaWriteMetabaseValue(piMetabase, psap->wzKey, NULL, MD_APPPOOL_PERIODIC_RESTART_PRIVATE_MEMORY, METADATA_INHERIT, IIS_MD_UT_SERVER, DWORD_METADATA, (LPVOID)((DWORD_PTR)psap->iPrivateMemory));
393 ExitOnFailure(hr, "failed to set periodic restart private memory count");
394 }
395
396
397 //
398 // Set AppPool Performance Tab
399 //
400 if (MSI_NULL_INTEGER != psap->iIdleTimeout)
401 {
402 hr = ScaWriteMetabaseValue(piMetabase, psap->wzKey, NULL, MD_APPPOOL_IDLE_TIMEOUT, METADATA_INHERIT, IIS_MD_UT_SERVER, DWORD_METADATA, (LPVOID)((DWORD_PTR)psap->iIdleTimeout));
403 ExitOnFailure(hr, "failed to set idle timeout value");
404 }
405
406 if (MSI_NULL_INTEGER != psap->iQueueLimit)
407 {
408 hr = ScaWriteMetabaseValue(piMetabase, psap->wzKey, NULL, MD_APPPOOL_UL_APPPOOL_QUEUE_LENGTH, METADATA_INHERIT, IIS_MD_UT_SERVER, DWORD_METADATA, (LPVOID)((DWORD_PTR)psap->iQueueLimit));
409 ExitOnFailure(hr, "failed to set request queue limit value");
410 }
411
412 if (*psap->wzCpuMon)
413 {
414 hr = StrAllocString(&pwzValue, psap->wzCpuMon, 0);
415 ExitOnFailure(hr, "failed to allocate CPUMonitor string");
416
417 DWORD dwPercent = 0;
418 DWORD dwRefreshMinutes = 0;
419 DWORD dwAction = 0;
420
421 dwPercent = wcstoul(pwzValue, &wz, 10);
422 if (100 < dwPercent)
423 {
424 ExitOnFailure(hr = E_INVALIDARG, "invalid maximum cpu percentage value: %d", dwPercent);
425 }
426 if (wz && L',' == *wz)
427 {
428 ++wz;
429 dwRefreshMinutes = wcstoul(wz, &wz, 10);
430 if (wz && L',' == *wz)
431 {
432 ++wz;
433 dwAction = wcstoul(wz, &wz, 10);
434 }
435 }
436
437 if (dwPercent)
438 {
439 hr = ScaWriteMetabaseValue(piMetabase, psap->wzKey, NULL, MD_CPU_LIMIT, METADATA_INHERIT, IIS_MD_UT_SERVER, DWORD_METADATA, (LPVOID)((DWORD_PTR)(dwPercent * 1000)));
440 ExitOnFailure(hr, "failed to set CPU percentage max");
441 }
442 if (dwRefreshMinutes)
443 {
444 hr = ScaWriteMetabaseValue(piMetabase, psap->wzKey, NULL, MD_CPU_RESET_INTERVAL, METADATA_INHERIT, IIS_MD_UT_SERVER, DWORD_METADATA, (LPVOID)((DWORD_PTR)dwRefreshMinutes));
445 ExitOnFailure(hr, "failed to set refresh CPU minutes");
446 }
447 if (dwAction)
448 {
449 // 0 = No Action
450 // 1 = Shutdown
451 hr = ScaWriteMetabaseValue(piMetabase, psap->wzKey, NULL, MD_CPU_ACTION, METADATA_INHERIT, IIS_MD_UT_SERVER, DWORD_METADATA, (LPVOID)((DWORD_PTR)dwAction));
452 ExitOnFailure(hr, "failed to set CPU action");
453 }
454 }
455
456 if (MSI_NULL_INTEGER != psap->iMaxProcesses)
457 {
458 hr = ScaWriteMetabaseValue(piMetabase, psap->wzKey, NULL, MD_APPPOOL_MAX_PROCESS_COUNT, METADATA_INHERIT, IIS_MD_UT_SERVER, DWORD_METADATA, (LPVOID)((DWORD_PTR)psap->iMaxProcesses));
459 ExitOnFailure(hr, "failed to set web garden maximum worker processes");
460 }
461
462 // TODO: Health Tab if anyone wants it?
463
464 //
465 // Set the AppPool Identity tab
466 //
467 if (psap->iAttributes & APATTR_NETSERVICE)
468 {
469 dwIdentity = MD_APPPOOL_IDENTITY_TYPE_NETWORKSERVICE;
470 }
471 else if (psap->iAttributes & APATTR_LOCSERVICE)
472 {
473 dwIdentity = MD_APPPOOL_IDENTITY_TYPE_LOCALSERVICE;
474 }
475 else if (psap->iAttributes & APATTR_LOCSYSTEM)
476 {
477 dwIdentity = MD_APPPOOL_IDENTITY_TYPE_LOCALSYSTEM;
478 }
479 else if (psap->iAttributes & APATTR_OTHERUSER)
480 {
481 if (!*psap->suUser.wzDomain || CSTR_EQUAL == ::CompareStringW(LOCALE_INVARIANT, NORM_IGNORECASE, psap->suUser.wzDomain, -1, L".", -1))
482 {
483 if (CSTR_EQUAL == ::CompareStringW(LOCALE_INVARIANT, NORM_IGNORECASE, psap->suUser.wzName, -1, L"NetworkService", -1))
484 {
485 dwIdentity = MD_APPPOOL_IDENTITY_TYPE_NETWORKSERVICE;
486 }
487 else if (CSTR_EQUAL == ::CompareStringW(LOCALE_INVARIANT, NORM_IGNORECASE, psap->suUser.wzName, -1, L"LocalService", -1))
488 {
489 dwIdentity = MD_APPPOOL_IDENTITY_TYPE_LOCALSERVICE;
490 }
491 else if (CSTR_EQUAL == ::CompareStringW(LOCALE_INVARIANT, NORM_IGNORECASE, psap->suUser.wzName, -1, L"LocalSystem", -1))
492 {
493 dwIdentity = MD_APPPOOL_IDENTITY_TYPE_LOCALSYSTEM;
494 }
495 else
496 {
497 dwIdentity = MD_APPPOOL_IDENTITY_TYPE_SPECIFICUSER;
498 }
499 }
500 else if (CSTR_EQUAL == ::CompareStringW(LOCALE_INVARIANT, NORM_IGNORECASE, psap->suUser.wzDomain, -1, L"NT AUTHORITY", -1))
501 {
502 if (CSTR_EQUAL == ::CompareStringW(LOCALE_INVARIANT, NORM_IGNORECASE, psap->suUser.wzName, -1, L"NETWORK SERVICE", -1))
503 {
504 dwIdentity = MD_APPPOOL_IDENTITY_TYPE_NETWORKSERVICE;
505 }
506 else if (CSTR_EQUAL == ::CompareStringW(LOCALE_INVARIANT, NORM_IGNORECASE, psap->suUser.wzName, -1, L"SERVICE", -1))
507 {
508 dwIdentity = MD_APPPOOL_IDENTITY_TYPE_LOCALSERVICE;
509 }
510 else if (CSTR_EQUAL == ::CompareStringW(LOCALE_INVARIANT, NORM_IGNORECASE, psap->suUser.wzName, -1, L"SYSTEM", -1))
511 {
512 dwIdentity = MD_APPPOOL_IDENTITY_TYPE_LOCALSYSTEM;
513 }
514 else
515 {
516 dwIdentity = MD_APPPOOL_IDENTITY_TYPE_SPECIFICUSER;
517 }
518 }
519 else
520 {
521 dwIdentity = MD_APPPOOL_IDENTITY_TYPE_SPECIFICUSER;
522 }
523 }
524
525 if (-1 != dwIdentity)
526 {
527 hr = ScaWriteMetabaseValue(piMetabase, psap->wzKey, NULL, MD_APPPOOL_IDENTITY_TYPE, METADATA_INHERIT , IIS_MD_UT_SERVER, DWORD_METADATA, (LPVOID)((DWORD_PTR)dwIdentity));
528 ExitOnFailure(hr, "failed to set app pool identity");
529
530 if (MD_APPPOOL_IDENTITY_TYPE_SPECIFICUSER == dwIdentity)
531 {
532 if (*psap->suUser.wzDomain)
533 {
534 hr = StrAllocFormatted(&pwzValue, L"%s\\%s", psap->suUser.wzDomain, psap->suUser.wzName);
535 ExitOnFailure(hr, "failed to format user name: %ls domain: %ls", psap->suUser.wzName, psap->suUser.wzDomain);
536 }
537 else
538 {
539 hr = StrAllocFormatted(&pwzValue, L"%s", psap->suUser.wzName);
540 ExitOnFailure(hr, "failed to format user name: %ls", psap->suUser.wzName);
541 }
542
543 hr = ScaWriteMetabaseValue(piMetabase, psap->wzKey, NULL, MD_WAM_USER_NAME, METADATA_INHERIT , IIS_MD_UT_FILE, STRING_METADATA, (LPVOID)pwzValue);
544 ExitOnFailure(hr, "failed to set app pool identity name");
545
546 hr = ScaWriteMetabaseValue(piMetabase, psap->wzKey, NULL, MD_WAM_PWD, METADATA_INHERIT | METADATA_SECURE, IIS_MD_UT_FILE, STRING_METADATA, (LPVOID)psap->suUser.wzPassword);
547 ExitOnFailure(hr, "failed to set app pool identity password");
548 }
549 }
550
551LExit:
552 ReleaseStr(pwzValue);
553
554 return hr;
555}
556
557
558HRESULT ScaRemoveAppPool(
559 __in IMSAdminBase* piMetabase,
560 __in SCA_APPPOOL* psap
561 )
562{
563 Assert(piMetabase && psap);
564
565 HRESULT hr = S_OK;
566
567 // simply remove the root key and everything else is pulled at the same time
568 if (0 != lstrlenW(psap->wzKey))
569 {
570 hr = ScaDeleteMetabaseKey(piMetabase, psap->wzKey, L"");
571 ExitOnFailure(hr, "failed to delete AppPool key: %ls", psap->wzKey);
572 }
573
574 // TODO: Maybe check to make sure any web sites that are using this AppPool are put back in the 'DefaultAppPool'
575
576LExit:
577 return hr;
578}
579
580
581HRESULT AddAppPoolToList(
582 __in SCA_APPPOOL** ppsapList
583 )
584{
585 HRESULT hr = S_OK;
586 SCA_APPPOOL* psap = static_cast<SCA_APPPOOL*>(MemAlloc(sizeof(SCA_APPPOOL), TRUE));
587 ExitOnNull(psap, hr, E_OUTOFMEMORY, "failed to allocate memory for new element in app pool list");
588
589 psap->psapNext = *ppsapList;
590 *ppsapList = psap;
591
592LExit:
593 return hr;
594}
diff --git a/src/ext/Iis/ca/scaapppool.h b/src/ext/Iis/ca/scaapppool.h
new file mode 100644
index 00000000..68575fcb
--- /dev/null
+++ b/src/ext/Iis/ca/scaapppool.h
@@ -0,0 +1,88 @@
1#pragma once
2// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
3
4
5#include "scauser.h"
6
7// Identity
8#define APATTR_NETSERVICE 0x0001 // Network Service
9#define APATTR_LOCSERVICE 0x0002 // Local Service
10#define APATTR_LOCSYSTEM 0x0004 // Local System
11#define APATTR_OTHERUSER 0x0008 // Other User
12
13struct SCA_APPPOOL
14{
15 // iis app pool configuation information
16 WCHAR wzAppPool[MAX_DARWIN_KEY + 1];
17 WCHAR wzName[METADATA_MAX_NAME_LEN + 1];
18 WCHAR wzKey[METADATA_MAX_NAME_LEN + 1];
19 WCHAR wzComponent[METADATA_MAX_NAME_LEN + 1];
20 BOOL fHasComponent;
21 INSTALLSTATE isInstalled;
22 INSTALLSTATE isAction;
23 INT iAttributes;
24
25 SCA_USER suUser;
26
27 INT iRecycleRequests;
28 INT iRecycleMinutes;
29 WCHAR wzRecycleTimes[MAX_DARWIN_KEY + 1];
30 INT iVirtualMemory;
31 INT iPrivateMemory;
32
33 INT iIdleTimeout;
34 INT iQueueLimit;
35 WCHAR wzCpuMon[MAX_DARWIN_KEY + 1];
36 INT iMaxProcesses;
37 WCHAR wzManagedPipelineMode[MAX_DARWIN_KEY + 1];
38 WCHAR wzManagedRuntimeVersion[MAX_DARWIN_KEY + 1];
39
40 int iCompAttributes;
41
42 SCA_APPPOOL *psapNext;
43};
44
45
46// prototypes
47
48HRESULT ScaAppPoolRead(
49 __inout SCA_APPPOOL** ppsapList,
50 __in WCA_WRAPQUERY_HANDLE hUserQuery,
51 __inout LPWSTR *ppwzCustomActionData
52 );
53
54void ScaAppPoolFreeList(
55 __in SCA_APPPOOL* psapList
56 );
57
58HRESULT ScaFindAppPool(
59 __in IMSAdminBase* piMetabase,
60 __in LPCWSTR wzAppPool,
61 __out_ecount(cchName) LPWSTR wzName,
62 __in DWORD cchName,
63 __in SCA_APPPOOL *psapList
64 );
65
66HRESULT ScaAppPoolInstall(
67 __in IMSAdminBase* piMetabase,
68 __in SCA_APPPOOL* psapList
69 );
70
71HRESULT ScaAppPoolUninstall(
72 __in IMSAdminBase* piMetabase,
73 __in SCA_APPPOOL* psapList
74 );
75
76HRESULT ScaWriteAppPool(
77 __in IMSAdminBase* piMetabase,
78 __in SCA_APPPOOL* psap
79 );
80
81HRESULT ScaRemoveAppPool(
82 __in IMSAdminBase* piMetabase,
83 __in SCA_APPPOOL* psap
84 );
85
86HRESULT AddAppPoolToList(
87 __in SCA_APPPOOL** ppsapList
88 );
diff --git a/src/ext/Iis/ca/scaapppool7.cpp b/src/ext/Iis/ca/scaapppool7.cpp
new file mode 100644
index 00000000..0fac4346
--- /dev/null
+++ b/src/ext/Iis/ca/scaapppool7.cpp
@@ -0,0 +1,401 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3#include "precomp.h"
4
5// prototypes
6static HRESULT AppPoolExists(
7 __in LPCWSTR wzAppPool
8 );
9
10// functions
11HRESULT ScaFindAppPool7(
12 __in LPCWSTR wzAppPool,
13 __out_ecount(cchName) LPWSTR wzName,
14 __in DWORD cchName,
15 __in SCA_APPPOOL *psapList
16 )
17{
18 Assert(wzAppPool && *wzAppPool && wzName && *wzName);
19
20 HRESULT hr = S_OK;
21
22 // check memory first
23 SCA_APPPOOL* psap = psapList;
24 for (; psap; psap = psap->psapNext)
25 {
26 if (0 == wcscmp(psap->wzAppPool, wzAppPool))
27 {
28 break;
29 }
30 }
31 ExitOnNull(psap, hr, HRESULT_FROM_WIN32(ERROR_NOT_FOUND), "Could not find the app pool: %ls", wzAppPool);
32
33 // copy the web app pool name
34#pragma prefast(suppress:26037, "Source string is null terminated - it is populated as target of ::StringCchCopyW")
35 hr = ::StringCchCopyW(wzName, cchName, psap->wzName);
36 ExitOnFailure(hr, "failed to copy app pool name while finding app pool: %ls", psap->wzName);
37
38 // if it's not being installed now, check if it exists already
39 if (!psap->fHasComponent)
40 {
41 hr = AppPoolExists(psap->wzName);
42 ExitOnFailure(hr, "failed to check for existence of app pool: %ls", psap->wzName);
43 }
44
45LExit:
46 return hr;
47}
48
49
50static HRESULT AppPoolExists(
51 __in LPCWSTR /*wzAppPool*/
52 )
53{
54 HRESULT hr = S_OK;
55
56 //this function checks for existance of app pool in IIS7 config
57 //at schedule time, we will defer this to execute time.
58
59 return hr;
60}
61
62
63HRESULT ScaAppPoolInstall7(
64 __in SCA_APPPOOL* psapList
65 )
66{
67 HRESULT hr = S_OK;
68
69 for (SCA_APPPOOL* psap = psapList; psap; psap = psap->psapNext)
70 {
71 // if we are installing the app pool
72 if (psap->fHasComponent && WcaIsInstalling(psap->isInstalled, psap->isAction))
73 {
74 hr = ScaWriteAppPool7(psap);
75 ExitOnFailure(hr, "failed to write AppPool '%ls' to metabase", psap->wzAppPool);
76 }
77 }
78
79LExit:
80 return hr;
81}
82
83
84HRESULT ScaAppPoolUninstall7(
85 __in SCA_APPPOOL* psapList
86 )
87{
88
89 HRESULT hr = S_OK;
90
91 for (SCA_APPPOOL* psap = psapList; psap; psap = psap->psapNext)
92 {
93 // if we are uninstalling the app pool
94 if (psap->fHasComponent && WcaIsUninstalling(psap->isInstalled, psap->isAction))
95 {
96 hr = ScaRemoveAppPool7(psap);
97 ExitOnFailure(hr, "Failed to remove AppPool '%ls' from metabase", psap->wzAppPool);
98 }
99 }
100
101LExit:
102 return hr;
103}
104
105
106HRESULT ScaWriteAppPool7(
107 __in const SCA_APPPOOL* psap
108 )
109{
110 Assert(psap);
111
112 HRESULT hr = S_OK;
113 DWORD dwIdentity = 0xFFFFFFFF;
114 LPWSTR pwzValue = NULL;
115 LPWSTR wz = NULL;
116
117 //create the app pool
118 hr = ScaWriteConfigID(IIS_APPPOOL);
119 ExitOnFailure(hr, "failed to write AppPool key.");
120
121 hr = ScaWriteConfigID(IIS_CREATE);
122 ExitOnFailure(hr, "failed to write AppPool create action.");
123
124 hr = ScaWriteConfigString(psap->wzName);
125 ExitOnFailure(hr, "failed to write AppPool name: %ls", psap->wzName);
126
127 // Now do all the optional stuff
128
129 // Set the AppPool Recycling Tab
130 if (MSI_NULL_INTEGER != psap->iRecycleMinutes)
131 {
132 hr = ScaWriteConfigID(IIS_APPPOOL_RECYCLE_MIN);
133 ExitOnFailure(hr, "failed to set periodic restart time id");
134 hr = ScaWriteConfigInteger(psap->iRecycleMinutes);
135 ExitOnFailure(hr, "failed to set periodic restart time");
136 }
137
138 if (MSI_NULL_INTEGER != psap->iRecycleRequests)
139 {
140 hr = ScaWriteConfigID(IIS_APPPOOL_RECYCLE_REQ);
141 ExitOnFailure(hr, "failed to set periodic restart request count id");
142 hr = ScaWriteConfigInteger(psap->iRecycleRequests);
143 ExitOnFailure(hr, "failed to set periodic restart request count");
144 }
145
146 if (*psap->wzRecycleTimes)
147 {
148 hr = ScaWriteConfigID(IIS_APPPOOL_RECYCLE_TIMES);
149 ExitOnFailure(hr, "failed to set periodic restart schedule id");
150 hr = ScaWriteConfigString(psap->wzRecycleTimes);
151 ExitOnFailure(hr, "failed to set periodic restart schedule");
152 }
153
154 if (MSI_NULL_INTEGER != psap->iVirtualMemory)
155 {
156 hr = ScaWriteConfigID(IIS_APPPOOL_RECYCLE_VIRMEM);
157 ExitOnFailure(hr, "failed to set periodic restart memory count id");
158 hr = ScaWriteConfigInteger(psap->iVirtualMemory);
159 ExitOnFailure(hr, "failed to set periodic restart memory count");
160 }
161
162 if (MSI_NULL_INTEGER != psap->iPrivateMemory)
163 {
164 hr = ScaWriteConfigID(IIS_APPPOOL_RECYCLE_PRIVMEM);
165 ExitOnFailure(hr, "failed to set periodic restart private memory count id");
166 hr = ScaWriteConfigInteger(psap->iPrivateMemory);
167 ExitOnFailure(hr, "failed to set periodic restart private memory count");
168 }
169
170 // Set AppPool Performance Tab
171 if (MSI_NULL_INTEGER != psap->iIdleTimeout)
172 {
173 hr = ScaWriteConfigID(IIS_APPPOOL_RECYCLE_IDLTIMEOUT);
174 ExitOnFailure(hr, "failed to set idle timeout value id");
175 hr = ScaWriteConfigInteger(psap->iIdleTimeout);
176 ExitOnFailure(hr, "failed to set idle timeout value");
177 }
178
179 if (MSI_NULL_INTEGER != psap->iQueueLimit)
180 {
181 hr = ScaWriteConfigID(IIS_APPPOOL_RECYCLE_QUEUELIMIT);
182 ExitOnFailure(hr, "failed to set request queue limit value id");
183 hr = ScaWriteConfigInteger(psap->iQueueLimit);
184 ExitOnFailure(hr, "failed to set request queue limit value");
185 }
186 if (*psap->wzCpuMon)
187 {
188#pragma prefast(suppress:26037, "Source string is null terminated - it is populated as target of ::StringCchCopyW")
189 hr = ::StrAllocString(&pwzValue, psap->wzCpuMon, 0);
190 ExitOnFailure(hr, "failed to allocate CPUMonitor string");
191
192 DWORD dwPercent = 0;
193 DWORD dwRefreshMinutes = 0;
194 DWORD dwAction = 0;
195
196 dwPercent = wcstoul(pwzValue, &wz, 10);
197 if (100 < dwPercent)
198 {
199 ExitOnFailure(hr = E_INVALIDARG, "invalid maximum cpu percentage value: %d", dwPercent);
200 }
201 if (wz && L',' == *wz)
202 {
203 ++wz;
204 dwRefreshMinutes = wcstoul(wz, &wz, 10);
205 if (wz && L',' == *wz)
206 {
207 ++wz;
208 dwAction = wcstoul(wz, &wz, 10);
209 }
210 }
211 if (dwPercent)
212 {
213 hr = ScaWriteConfigID(IIS_APPPOOL_RECYCLE_CPU_PCT);
214 ExitOnFailure(hr, "failed to set recycle pct id");
215 hr = ScaWriteConfigInteger(dwPercent);
216 ExitOnFailure(hr, "failed to set CPU percentage max");
217 }
218 if (dwRefreshMinutes)
219 {
220 hr = ScaWriteConfigID(IIS_APPPOOL_RECYCLE_CPU_REFRESH);
221 ExitOnFailure(hr, "failed to set recycle refresh id");
222 hr = ScaWriteConfigInteger(dwRefreshMinutes);
223 ExitOnFailure(hr, "failed to set refresh CPU minutes");
224 }
225 if (dwAction)
226 {
227 // 0 = No Action
228 // 1 = Shutdown
229 hr = ScaWriteConfigID(IIS_APPPOOL_RECYCLE_CPU_ACTION);
230 ExitOnFailure(hr, "failed to set recycle refresh id");
231 hr = ScaWriteConfigInteger(dwAction);
232 ExitOnFailure(hr, "failed to set CPU action");
233 }
234 }
235
236 if (MSI_NULL_INTEGER != psap->iMaxProcesses)
237 {
238 hr = ScaWriteConfigID(IIS_APPPOOL_MAXPROCESS);
239 ExitOnFailure(hr, "Failed to write max processes config ID");
240
241 hr = ScaWriteConfigInteger(psap->iMaxProcesses);
242 ExitOnFailure(hr, "failed to set web garden maximum worker processes");
243 }
244
245 hr = ScaWriteConfigID(IIS_APPPOOL_32BIT);
246 ExitOnFailure(hr, "Failed to write 32 bit app pool config ID");
247 hr = ScaWriteConfigInteger(psap->iCompAttributes & msidbComponentAttributes64bit ? 0 : 1);
248 ExitOnFailure(hr, "Failed to write 32 bit app pool config value");
249
250 //
251 // Set the AppPool Identity tab
252 //
253 if (psap->iAttributes & APATTR_APPPOOLIDENTITY)
254 {
255 dwIdentity = 4;
256 }
257 else if (psap->iAttributes & APATTR_NETSERVICE)
258 {
259 dwIdentity = 2;
260 }
261 else if (psap->iAttributes & APATTR_LOCSERVICE)
262 {
263 dwIdentity = 1;
264 }
265 else if (psap->iAttributes & APATTR_LOCSYSTEM)
266 {
267 dwIdentity = 0;
268 }
269 else if (psap->iAttributes & APATTR_OTHERUSER)
270 {
271 if (!*psap->suUser.wzDomain || 0 == _wcsicmp(psap->suUser.wzDomain, L"."))
272 {
273 if (0 == _wcsicmp(psap->suUser.wzName, L"NetworkService"))
274 {
275 dwIdentity = 2;
276 }
277 else if (0 == _wcsicmp(psap->suUser.wzName, L"LocalService"))
278 {
279 dwIdentity = 1;
280 }
281 else if (0 == _wcsicmp(psap->suUser.wzName, L"LocalSystem"))
282 {
283 dwIdentity = 0;
284 }
285 else
286 {
287 dwIdentity = 3;
288 }
289 }
290 else if (0 == _wcsicmp(psap->suUser.wzDomain, L"NT AUTHORITY"))
291 {
292 if (0 == _wcsicmp(psap->suUser.wzName, L"NETWORK SERVICE"))
293 {
294 dwIdentity = 2;
295 }
296 else if (0 == _wcsicmp(psap->suUser.wzName, L"SERVICE"))
297 {
298 dwIdentity = 1;
299 }
300 else if (0 == _wcsicmp(psap->suUser.wzName, L"SYSTEM"))
301 {
302 dwIdentity = 0;
303 }
304 else
305 {
306 dwIdentity = 3;
307 }
308 }
309 else
310 {
311 dwIdentity = 3;
312 }
313 }
314
315 if (-1 != dwIdentity)
316 {
317 hr = ScaWriteConfigID(IIS_APPPOOL_IDENTITY);
318 ExitOnFailure(hr, "failed to set app pool identity id");
319 hr = ScaWriteConfigInteger(dwIdentity);
320 ExitOnFailure(hr, "failed to set app pool identity");
321
322 if (3 == dwIdentity)
323 {
324 if (*psap->suUser.wzDomain)
325 {
326 hr = StrAllocFormatted(&pwzValue, L"%s\\%s", psap->suUser.wzDomain, psap->suUser.wzName);
327 ExitOnFailure(hr, "failed to format user name: %ls domain: %ls", psap->suUser.wzName, psap->suUser.wzDomain);
328 }
329 else
330 {
331 hr = StrAllocFormatted(&pwzValue, L"%s", psap->suUser.wzName);
332 ExitOnFailure(hr, "failed to format user name: %ls", psap->suUser.wzName);
333 }
334
335 hr = ScaWriteConfigID(IIS_APPPOOL_USER);
336 ExitOnFailure(hr, "failed to set app pool identity name id");
337 hr = ScaWriteConfigString(pwzValue);
338 ExitOnFailure(hr, "failed to set app pool identity name");
339
340 hr = ScaWriteConfigID(IIS_APPPOOL_PWD);
341 ExitOnFailure(hr, "failed to set app pool identity password id");
342 hr = ScaWriteConfigString(psap->suUser.wzPassword);
343 ExitOnFailure(hr, "failed to set app pool identity password");
344 }
345 }
346
347 if (*psap->wzManagedPipelineMode)
348 {
349 hr = ScaWriteConfigID(IIS_APPPOOL_MANAGED_PIPELINE_MODE);
350 ExitOnFailure(hr, "failed to set app pool integrated mode");
351 hr = ScaWriteConfigString(psap->wzManagedPipelineMode);
352 ExitOnFailure(hr, "failed to set app pool managed pipeline mode value");
353 }
354
355 if (*psap->wzManagedRuntimeVersion)
356 {
357 hr = ScaWriteConfigID(IIS_APPPOOL_MANAGED_RUNTIME_VERSION);
358 ExitOnFailure(hr, "failed to set app pool managed runtime version mode");
359 hr = ScaWriteConfigString(psap->wzManagedRuntimeVersion);
360 ExitOnFailure(hr, "failed to set app pool managed runtime version value");
361 }
362
363 //
364 //The number of properties above is variable so we put an end tag in so the
365 //execute CA will know when to stop looking for AppPool properties
366 //
367 hr = ScaWriteConfigID(IIS_APPPOOL_END);
368 ExitOnFailure(hr, "failed to set app pool end of properties id");
369
370LExit:
371 ReleaseStr(pwzValue);
372
373 return hr;
374}
375
376
377HRESULT ScaRemoveAppPool7(
378 __in const SCA_APPPOOL* psap
379 )
380{
381 Assert(psap);
382
383 HRESULT hr = S_OK;
384
385 //do not delete the default App Pool
386 if (0 != _wcsicmp(psap->wzAppPool, L"DefaultAppPool"))
387 {
388 //delete the app pool
389 hr = ScaWriteConfigID(IIS_APPPOOL);
390 ExitOnFailure(hr, "failed to write AppPool key.");
391
392 hr = ScaWriteConfigID(IIS_DELETE);
393 ExitOnFailure(hr, "failed to write AppPool delete action.");
394
395 hr = ScaWriteConfigString(psap->wzName);
396 ExitOnFailure(hr, "failed to delete AppPool: %ls", psap->wzName);
397 }
398
399LExit:
400 return hr;
401}
diff --git a/src/ext/Iis/ca/scaapppool7.h b/src/ext/Iis/ca/scaapppool7.h
new file mode 100644
index 00000000..1f49d899
--- /dev/null
+++ b/src/ext/Iis/ca/scaapppool7.h
@@ -0,0 +1,36 @@
1#pragma once
2// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
3
4
5#include "scauser.h"
6
7// Identity
8#define APATTR_NETSERVICE 0x0001 // Network Service
9#define APATTR_LOCSERVICE 0x0002 // Local Service
10#define APATTR_LOCSYSTEM 0x0004 // Local System
11#define APATTR_OTHERUSER 0x0008 // Other User
12#define APATTR_APPPOOLIDENTITY 0x0010 // ApplicationPoolIdentity
13
14// prototypes
15HRESULT ScaFindAppPool7(
16 __in LPCWSTR wzAppPool,
17 __out_ecount(cchName) LPWSTR wzName,
18 __in DWORD cchName,
19 __in SCA_APPPOOL *psapList
20 );
21
22HRESULT ScaAppPoolInstall7(
23 __in SCA_APPPOOL* psapList
24 );
25
26HRESULT ScaAppPoolUninstall7(
27 __in SCA_APPPOOL* psapList
28 );
29
30HRESULT ScaWriteAppPool7(
31 __in const SCA_APPPOOL* psap
32 );
33
34HRESULT ScaRemoveAppPool7(
35 __in const SCA_APPPOOL* psap
36 );
diff --git a/src/ext/Iis/ca/scacert.cpp b/src/ext/Iis/ca/scacert.cpp
new file mode 100644
index 00000000..5eae905a
--- /dev/null
+++ b/src/ext/Iis/ca/scacert.cpp
@@ -0,0 +1,1482 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3#include "precomp.h"
4
5// prototypes
6static HRESULT ConfigureCertificates(
7 __in SCA_ACTION saAction
8 );
9
10static LPCWSTR StoreMapping(
11 __in int iStore
12 );
13
14static HRESULT FindExistingCertificate(
15 __in LPCWSTR wzName,
16 __in DWORD dwStoreLocation,
17 __in LPCWSTR wzStore,
18 __out BYTE** prgbCertificate,
19 __out DWORD* pcbCertificate
20 );
21
22static HRESULT ResolveCertificate(
23 __in LPCWSTR wzId,
24 __in LPCWSTR wzName,
25 __in DWORD dwStoreLocation,
26 __in LPCWSTR wzStoreName,
27 __in DWORD dwAttributess,
28 __in LPCWSTR wzData,
29 __in LPCWSTR wzPFXPassword,
30 __out BYTE** ppbCertificate,
31 __out DWORD* pcbCertificate
32 );
33
34static HRESULT ReadCertificateFile(
35 __in LPCWSTR wzPath,
36 __out BYTE** prgbData,
37 __out DWORD* pcbData
38 );
39
40static HRESULT CertificateToHash(
41 __in BYTE* pbCertificate,
42 __in DWORD cbCertificate,
43 __in DWORD dwStoreLocation,
44 __in LPCWSTR wzPFXPassword,
45 __in BYTE rgbHash[],
46 __in DWORD cbHash
47 );
48
49/*
50HRESULT ScaGetCertificateByPath(LPCWSTR pwzName, BOOL fIsInstalling,
51 BOOL fIsUninstalling, INT iStore,
52 INT iStoreLocation, LPCWSTR wzSslCertificate,
53 LPCWSTR wzPFXPassword, BSTR* pbstrCertificate,
54 DWORD* pcbCertificate, BYTE* pbaHashBuffer);
55
56HRESULT ScaGetCertificateByRequest(LPCWSTR pwzName, BOOL fIsInstalling,
57 BOOL fIsUninstalling, INT iStore,
58 INT iStoreLocation, LPCWSTR wzDistinguishedName,
59 LPCWSTR wzCA, BSTR* pbstrCertificate,
60 DWORD* pcbCertificate, BYTE* pbaHashBuffer);
61
62HRESULT ScaSslNewCertificate(LPCWSTR pwzName, INT iStore,
63 INT iStoreLocation, LPCWSTR wzComputerName,
64 LPCWSTR wzDistinguishedName, LPCWSTR wzCertificateAuthorityOrig,
65 BSTR* pbstrCertificate, DWORD* pcbCertificate,
66 BYTE* pbaHashBuffer);
67
68HRESULT ScaSslExistingCertificateByName(LPCWSTR pwzName, INT iStore,
69 INT iStoreLocation, BSTR* pbstrCertificate,
70 DWORD* pcbCertificate, BYTE* pbaHashBuffer);
71
72HRESULT ScaSslExistingCertificateByBinaryData(INT iStore, INT iStoreLocation,
73 BYTE* pwzData, DWORD cchData);
74
75HRESULT CreateEnroll(ICEnroll2 **hEnroll, INT iStore,
76 INT iStoreLocation);
77
78HRESULT RequestCertificate(LPCWSTR pwzName, INT iStore,
79 INT iStoreLocation, LPCWSTR wzComputerName,
80 LPCWSTR wzDistinguishedName, LPCWSTR wzCertificateAuthority,
81 BSTR *pbstrCertificate);
82
83VOID ParseCertificateAuthority(__in LPCWSTR wzCertificateAuthorityOrig, __out LPWSTR *pwzBuffer,
84 __out LPWSTR **hwzCAArray, __out int *piCAArray);
85*/
86
87
88LPCWSTR vcsCertQuery = L"SELECT `Certificate`, `Name`, `Component_`, `StoreLocation`, `StoreName`, `Attributes`, `Binary_`, `CertificatePath`, `PFXPassword` FROM `Certificate`";
89enum eCertQuery { cqCertificate = 1, cqName, cqComponent, cqStoreLocation, cqStoreName, cqAttributes, cqCertificateBinary, cqCertificatePath, cqPFXPassword };
90
91
92/********************************************************************
93InstallCertificates - CUSTOM ACTION ENTRY POINT for installing
94 certificates
95
96********************************************************************/
97extern "C" UINT __stdcall InstallCertificates(
98 __in MSIHANDLE hInstall
99 )
100{
101 HRESULT hr = S_OK;
102 UINT er = ERROR_SUCCESS;
103
104 // initialize
105 hr = WcaInitialize(hInstall, "InstallCertificates");
106 ExitOnFailure(hr, "Failed to initialize");
107
108 hr = ConfigureCertificates(SCA_ACTION_INSTALL);
109
110LExit:
111 er = SUCCEEDED(hr) ? ERROR_SUCCESS : ERROR_INSTALL_FAILURE;
112 return WcaFinalize(er);
113}
114
115
116/********************************************************************
117UninstallCertificates - CUSTOM ACTION ENTRY POINT for uninstalling
118 certificates
119
120********************************************************************/
121extern "C" UINT __stdcall UninstallCertificates(
122 __in MSIHANDLE hInstall
123 )
124{
125 HRESULT hr = S_OK;
126 UINT er = ERROR_SUCCESS;
127
128 // initialize
129 hr = WcaInitialize(hInstall, "UninstallCertificates");
130 ExitOnFailure(hr, "Failed to initialize");
131
132 hr = ConfigureCertificates(SCA_ACTION_UNINSTALL);
133
134LExit:
135 er = SUCCEEDED(hr) ? ERROR_SUCCESS : ERROR_INSTALL_FAILURE;
136 return WcaFinalize(er);
137}
138
139
140static HRESULT ConfigureCertificates(
141 __in SCA_ACTION saAction
142 )
143{
144 //AssertSz(FALSE, "debug ConfigureCertificates().");
145
146 HRESULT hr = S_OK;
147 DWORD er = ERROR_SUCCESS;
148
149 PMSIHANDLE hViewCertificate;
150 PMSIHANDLE hRecCertificate;
151 INSTALLSTATE isInstalled = INSTALLSTATE_UNKNOWN;
152 INSTALLSTATE isAction = INSTALLSTATE_UNKNOWN;
153
154 WCHAR* pwzId = NULL;
155 WCHAR* pwzName = NULL;
156 WCHAR* pwzComponent = NULL;
157 int iData = 0;
158 DWORD dwStoreLocation = 0;
159 LPWSTR pwzStoreName = 0;
160 DWORD dwAttributes = 0;
161 WCHAR* pwzData = NULL;
162 WCHAR* pwzPFXPassword = NULL;
163 WCHAR* pwzCaData = NULL;
164 WCHAR* pwzRollbackCaData = NULL;
165
166 BYTE* pbCertificate = NULL;
167 DWORD cbCertificate = 0;
168 DWORD_PTR cbPFXPassword = 0;
169
170 // Bail quickly if the Certificate table isn't around.
171 if (S_OK != WcaTableExists(L"Certificate"))
172 {
173 WcaLog(LOGMSG_VERBOSE, "Skipping ConfigureCertificates() - required table not present.");
174 ExitFunction1(hr = S_FALSE);
175 }
176
177 // Process the Certificate table.
178 hr = WcaOpenExecuteView(vcsCertQuery, &hViewCertificate);
179 ExitOnFailure(hr, "failed to open view on Certificate table");
180
181 while (SUCCEEDED(hr = WcaFetchRecord(hViewCertificate, &hRecCertificate)))
182 {
183 hr = WcaGetRecordString(hRecCertificate, cqCertificate, &pwzId); // the id is just useful to have up front
184 ExitOnFailure(hr, "failed to get Certificate.Certificate");
185
186 hr = WcaGetRecordString(hRecCertificate, cqComponent, &pwzComponent);
187 ExitOnFailure(hr, "failed to get Certificate.Component_");
188
189 er = ::MsiGetComponentStateW(WcaGetInstallHandle(), pwzComponent, &isInstalled, &isAction);
190 hr = HRESULT_FROM_WIN32(er);
191 ExitOnFailure(hr, "failed to get state for component: %ls", pwzComponent);
192
193 if (!(WcaIsInstalling(isInstalled, isAction) && SCA_ACTION_INSTALL == saAction) &&
194 !(WcaIsUninstalling(isInstalled, isAction) && SCA_ACTION_UNINSTALL == saAction) &&
195 !(WcaIsReInstalling(isInstalled, isAction)))
196 {
197 WcaLog(LOGMSG_VERBOSE, "Skipping non-action certificate: %ls", pwzId);
198 continue;
199 }
200
201 // extract the rest of the data from the Certificate table
202 hr = WcaGetRecordFormattedString(hRecCertificate, cqName, &pwzName);
203 ExitOnFailure(hr, "failed to get Certificate.Name");
204
205 hr = WcaGetRecordInteger(hRecCertificate, cqStoreLocation, &iData);
206 ExitOnFailure(hr, "failed to get Certificate.StoreLocation");
207
208 switch (iData)
209 {
210 case SCA_CERTSYSTEMSTORE_CURRENTUSER:
211 dwStoreLocation = CERT_SYSTEM_STORE_CURRENT_USER;
212 break;
213 case SCA_CERTSYSTEMSTORE_LOCALMACHINE:
214 dwStoreLocation = CERT_SYSTEM_STORE_LOCAL_MACHINE;
215 break;
216 default:
217 hr = E_INVALIDARG;
218 ExitOnFailure(hr, "Invalid store location value: %d", iData);
219 }
220
221 hr = WcaGetRecordString(hRecCertificate, cqStoreName, &pwzStoreName);
222 ExitOnFailure(hr, "failed to get Certificate.StoreName");
223
224 hr = WcaGetRecordInteger(hRecCertificate, cqAttributes, reinterpret_cast<int*>(&dwAttributes));
225 ExitOnFailure(hr, "failed to get Certificate.Attributes");
226
227 if (dwAttributes & SCA_CERT_ATTRIBUTE_BINARYDATA)
228 {
229 hr = WcaGetRecordString(hRecCertificate, cqCertificateBinary, &pwzData);
230 ExitOnFailure(hr, "failed to get Certificate.Binary_");
231 }
232 else
233 {
234 hr = WcaGetRecordFormattedString(hRecCertificate, cqCertificatePath, &pwzData);
235 ExitOnFailure(hr, "failed to get Certificate.CertificatePath");
236 }
237
238 hr = WcaGetRecordFormattedString(hRecCertificate, cqPFXPassword, &pwzPFXPassword);
239 ExitOnFailure(hr, "failed to get Certificate.PFXPassword");
240
241 // Write the common data (for both install and uninstall) to the CustomActionData
242 // to pass data to the deferred CustomAction.
243 hr = StrAllocString(&pwzCaData, pwzName, 0);
244 ExitOnFailure(hr, "Failed to pass Certificate.Certificate to deferred CustomAction.");
245 hr = WcaWriteStringToCaData(pwzStoreName, &pwzCaData);
246 ExitOnFailure(hr, "Failed to pass Certificate.StoreName to deferred CustomAction.");
247 hr = WcaWriteIntegerToCaData(dwAttributes, &pwzCaData);
248 ExitOnFailure(hr, "Failed to pass Certificate.Attributes to deferred CustomAction.");
249
250 // Copy the rollback data from the deferred data because it's the same up to this point.
251 hr = StrAllocString(&pwzRollbackCaData, pwzCaData, 0);
252 ExitOnFailure(hr, "Failed to allocate string for rollback CustomAction.");
253
254 // Finally, schedule the correct deferred CustomAction to actually do work.
255 LPCWSTR wzAction = NULL;
256 LPCWSTR wzRollbackAction = NULL;
257 DWORD dwCost = 0;
258 if (SCA_ACTION_UNINSTALL == saAction)
259 {
260 // Find an existing certificate one (if there is one) to so we have it for rollback.
261 hr = FindExistingCertificate(pwzName, dwStoreLocation, pwzStoreName, &pbCertificate, &cbCertificate);
262 ExitOnFailure(hr, "Failed to search for existing certificate with friendly name: %ls", pwzName);
263
264 if (pbCertificate)
265 {
266 hr = WcaWriteStreamToCaData(pbCertificate, cbCertificate, &pwzRollbackCaData);
267 ExitOnFailure(hr, "Failed to pass Certificate.Data to rollback CustomAction.");
268
269 hr = WcaWriteStringToCaData(pwzPFXPassword, &pwzRollbackCaData);
270 ExitOnFailure(hr, "Failed to pass Certificate.PFXPassword to rollback CustomAction.");
271
272 hr = WcaWriteIntegerToCaData(dwAttributes, &pwzCaData);
273 ExitOnFailure(hr, "Failed to pass Certificate.Attributes to deferred CustomAction.");
274 }
275
276 // Pick the right action to run based on what store we're uninstalling from.
277 if (CERT_SYSTEM_STORE_LOCAL_MACHINE == dwStoreLocation)
278 {
279 wzAction = CUSTOM_ACTION_DECORATION(L"DeleteMachineCertificate");
280 if (pbCertificate)
281 {
282 wzRollbackAction = L"RollbackDeleteMachineCertificate";
283 }
284 }
285 else
286 {
287 wzAction = CUSTOM_ACTION_DECORATION(L"DeleteUserCertificate");
288 if (pbCertificate)
289 {
290 wzRollbackAction = L"RollbackDeleteUserCertificate";
291 }
292 }
293 dwCost = COST_CERT_DELETE;
294 }
295 else
296 {
297 // Actually get the certificate, resolve it to a blob, and get the blob's hash.
298 hr = ResolveCertificate(pwzId, pwzName, dwStoreLocation, pwzStoreName, dwAttributes, pwzData, pwzPFXPassword, &pbCertificate, &cbCertificate);
299 ExitOnFailure(hr, "Failed to resolve certificate: %ls", pwzId);
300
301 hr = WcaWriteStreamToCaData(pbCertificate, cbCertificate, &pwzCaData);
302 ExitOnFailure(hr, "Failed to pass Certificate.Data to deferred CustomAction.");
303
304 hr = WcaWriteStringToCaData(pwzPFXPassword, &pwzCaData);
305 ExitOnFailure(hr, "Failed to pass Certificate.PFXPassword to deferred CustomAction.");
306
307 // Pick the right action to run based on what store we're installing into.
308 if (CERT_SYSTEM_STORE_LOCAL_MACHINE == dwStoreLocation)
309 {
310 wzAction = CUSTOM_ACTION_DECORATION(L"AddMachineCertificate");
311 wzRollbackAction = CUSTOM_ACTION_DECORATION(L"RollbackAddMachineCertificate");
312 }
313 else
314 {
315 wzAction = CUSTOM_ACTION_DECORATION(L"AddUserCertificate");
316 wzRollbackAction = CUSTOM_ACTION_DECORATION(L"RollbackAddUserCertificate");
317 }
318 dwCost = COST_CERT_ADD;
319 }
320
321 if (wzRollbackAction)
322 {
323 hr = WcaDoDeferredAction(wzRollbackAction, pwzRollbackCaData, dwCost);
324 ExitOnFailure(hr, "Failed to schedule rollback certificate action '%ls' for: %ls", wzRollbackAction, pwzId);
325 }
326
327 hr = WcaDoDeferredAction(wzAction, pwzCaData, dwCost);
328 ExitOnFailure(hr, "Failed to schedule certificate action '%ls' for: %ls", wzAction, pwzId);
329
330 // Clean up for the next certificate.
331 ReleaseNullMem(pbCertificate);
332 }
333
334 if (E_NOMOREITEMS == hr)
335 {
336 hr = S_OK;
337 }
338
339LExit:
340 if (NULL != pwzPFXPassword && SUCCEEDED(StrSize(pwzPFXPassword, &cbPFXPassword)))
341 {
342 SecureZeroMemory(pwzPFXPassword, cbPFXPassword);
343 }
344
345 ReleaseMem(pbCertificate);
346 ReleaseStr(pwzCaData);
347 ReleaseStr(pwzPFXPassword);
348 ReleaseStr(pwzData);
349 ReleaseStr(pwzName);
350 ReleaseStr(pwzStoreName);
351 ReleaseStr(pwzComponent);
352 ReleaseStr(pwzId);
353
354 return hr;
355}
356
357
358static HRESULT ResolveCertificate(
359 __in LPCWSTR wzId,
360 __in LPCWSTR /*wzName*/,
361 __in DWORD dwStoreLocation,
362 __in LPCWSTR /*wzStoreName*/,
363 __in DWORD dwAttributes,
364 __in LPCWSTR wzData,
365 __in LPCWSTR wzPFXPassword,
366 __out BYTE** ppbCertificate,
367 __out DWORD* pcbCertificate
368 )
369{
370 HRESULT hr = S_OK;
371
372 LPWSTR pwzSql = NULL;
373 PMSIHANDLE hView;
374 PMSIHANDLE hRec;
375 MSIHANDLE hCertificateHashView = NULL;
376 MSIHANDLE hCertificateHashColumns = NULL;
377
378 BYTE rgbCertificateHash[CB_CERTIFICATE_HASH] = { 0 };
379 WCHAR wzEncodedCertificateHash[CB_CERTIFICATE_HASH * 2 + 1] = { 0 };
380
381 PMSIHANDLE hViewCertificateRequest, hRecCertificateRequest;
382
383 WCHAR* pwzDistinguishedName = NULL;
384 WCHAR* pwzCA = NULL;
385
386 BYTE* pbData = NULL;
387 DWORD cbData = 0;
388
389 if (dwAttributes & SCA_CERT_ATTRIBUTE_REQUEST)
390 {
391 hr = E_NOTIMPL;
392 ExitOnFailure(hr, "Installing certificates by requesting them from a certificate authority is not currently supported");
393 //if (dwAttributes & SCA_CERT_ATTRIBUTE_OVERWRITE)
394 //{
395 // // try to overwrite with the patch to a cert file
396 // WcaLog(LOGMSG_VERBOSE, "ConfigureCertificates - Overwrite with SSLCERTIFICATE");
397 // hr = ScaGetCertificateByPath(pwzName, fIsInstalling, fIsUninstalling,
398 // iStore, iStoreLocation, pwzData, wzPFXPassword, pbstrCertificate, pcbCertificate, pbaHashBuffer);
399 //}
400 //if (hr != S_OK)
401 //{
402 // if (fIsUninstalling && !fIsInstalling)
403 // {
404 // // for uninstall, we just want to find the existing certificate
405 // hr = ScaSslExistingCertificateByName(pwzName, iStore, iStoreLocation, pbstrCertificate, pcbCertificate, pbaHashBuffer);
406 // ExitOnFailure(hr, "Failed Retrieving existing certificate during uninstall");
407 // // ok if no existing cert
408 // if (S_OK != hr)
409 // hr = S_OK;
410 // }
411 // else
412 // {
413 // // still no certificate
414 // // user has request this certificate, try to locate DistinguishedName and CA
415 // hr = WcaTableExists(L"CertificateRequest");
416 // ExitOnFailure(hr, "CertificateRequest is referenced but not found");
417 // WcaLog(LOGMSG_VERBOSE, "ConfigureCertificates - CertificateRequest table present");
418 // cchSQLView = 255 + lstrlenW(pwzName);
419 // pwzSQLView = new WCHAR[cchSQLView];
420 // if (pwzSQLView)
421 // {
422 // hr = ::StringCchPrintfW(pwzSQLView, cchSQLView, L"SELECT `DistinguishedName`, `CA` FROM `CertificateRequest` WHERE `Certificate_`=\'%s\'", pwzName);
423 // ExitOnFailure(hr, "::StringCchPrintfW failed");
424 // hr = WcaOpenExecuteView(pwzSQLView, &hViewCertificateRequest);
425 // ExitOnFailure(hr, "failed to open view on CertificateRequest table");
426 // hr = WcaFetchSingleRecord(hViewCertificateRequest, &hRecCertificateRequest);
427 // ExitOnFailure(hr, "failed to retrieve request from CertificateRequest table");
428 // hr = WcaGetRecordString(hRecCertificateRequest, 1, &pwzDistinguishedName);
429 // ExitOnFailure(hr, "failed to get DistinguishedName");
430 // hr = WcaGetRecordString(hRecCertificateRequest, 2, &pwzCA);
431 // ExitOnFailure(hr, "failed to get CA");
432 // if (pwzDistinguishedName && pwzCA && *pwzDistinguishedName && *pwzCA)
433 // {
434 // hr = ScaGetCertificateByRequest(pwzName, fIsInstalling, fIsUninstalling, iStore, iStoreLocation, pwzDistinguishedName, pwzCA, pbstrCertificate, pcbCertificate, pbaHashBuffer);
435 // }
436 // else
437 // {
438 // hr = E_FAIL;
439 // ExitOnFailure(hr, "CertificateRequest entry is empty");
440 // }
441 // }
442 // else
443 // {
444 // hr = E_FAIL;
445 // ExitOnFailure(hr, "Out of memory");
446 // }
447 // }
448 //}
449 }
450 else if (dwAttributes & SCA_CERT_ATTRIBUTE_BINARYDATA)
451 {
452 // get the binary stream in Binary
453 hr = WcaTableExists(L"Binary");
454 if (S_OK != hr)
455 {
456 if (SUCCEEDED(hr))
457 {
458 hr = E_UNEXPECTED;
459 }
460 ExitOnFailure(hr, "Binary was referenced but there is no Binary table.");
461 }
462
463 hr = StrAllocFormatted(&pwzSql, L"SELECT `Data` FROM `Binary` WHERE `Name`=\'%s\'", wzData);
464 ExitOnFailure(hr, "Failed to allocate Binary table query.");
465
466 hr = WcaOpenExecuteView(pwzSql, &hView);
467 ExitOnFailure(hr, "Failed to open view on Binary table");
468
469 hr = WcaFetchSingleRecord(hView, &hRec);
470 ExitOnFailure(hr, "Failed to retrieve request from Binary table");
471
472 hr = WcaGetRecordStream(hRec, 1, &pbData, &cbData);
473 ExitOnFailure(hr, "Failed to ready Binary.Data for certificate.");
474 }
475 else if (dwAttributes == SCA_CERT_ATTRIBUTE_DEFAULT)
476 {
477 hr = ReadCertificateFile(wzData, &pbData, &cbData);
478 ExitOnFailure(hr, "Failed to read certificate from file path.");
479 }
480 else
481 {
482 hr = E_INVALIDARG;
483 ExitOnFailure(hr, "Invalid Certificate.Attributes.");
484 }
485
486 // If we have loaded a certificate, update the Certificate.Hash column.
487 if (pbData)
488 {
489 hr = CertificateToHash(pbData, cbData, dwStoreLocation, wzPFXPassword, rgbCertificateHash, countof(rgbCertificateHash));
490 ExitOnFailure(hr, "Failed to get SHA1 hash of certificate.");
491
492 hr = StrHexEncode(rgbCertificateHash, countof(rgbCertificateHash), wzEncodedCertificateHash, countof(wzEncodedCertificateHash));
493 ExitOnFailure(hr, "Failed to hex encode SHA1 hash of certificate.");
494
495 // Update the CertificateHash table.
496 hr = WcaAddTempRecord(&hCertificateHashView, &hCertificateHashColumns, L"CertificateHash", NULL, 0, 2, wzId, wzEncodedCertificateHash);
497 ExitOnFailure(hr, "Failed to add encoded has for certificate: %ls", wzId);
498 }
499
500 *ppbCertificate = pbData;
501 *pcbCertificate = cbData;
502 pbData = NULL;
503
504LExit:
505 if (hCertificateHashColumns)
506 {
507 ::MsiCloseHandle(hCertificateHashColumns);
508 }
509
510 if (hCertificateHashView)
511 {
512 ::MsiCloseHandle(hCertificateHashView);
513 }
514
515 ReleaseStr(pwzDistinguishedName);
516 ReleaseStr(pwzCA);
517 ReleaseMem(pbData);
518 ReleaseStr(pwzSql);
519
520 return hr;
521}
522
523
524static HRESULT ReadCertificateFile(
525 __in LPCWSTR wzPath,
526 __out BYTE** prgbData,
527 __out DWORD* pcbData
528 )
529{
530 HRESULT hr = S_OK;
531
532 PCCERT_CONTEXT pCertContext = NULL;
533 DWORD dwContentType;
534 BYTE* pbData = NULL;
535 DWORD cbData = 0;
536
537 if (!::CryptQueryObject(CERT_QUERY_OBJECT_FILE, reinterpret_cast<LPCVOID>(wzPath), CERT_QUERY_CONTENT_FLAG_ALL, CERT_QUERY_FORMAT_FLAG_ALL, 0, NULL, &dwContentType, NULL, NULL, NULL, (LPCVOID*)&pCertContext))
538 {
539 ExitOnFailure(hr, "Failed to read certificate from file: %ls", wzPath);
540 }
541
542 if (pCertContext)
543 {
544 cbData = pCertContext->cbCertEncoded;
545 pbData = static_cast<BYTE*>(MemAlloc(cbData, FALSE));
546 ExitOnNull(pbData, hr, E_OUTOFMEMORY, "Failed to allocate memory to read certificate from file: %ls", wzPath);
547
548 CopyMemory(pbData, pCertContext->pbCertEncoded, pCertContext->cbCertEncoded);
549 }
550 else
551 {
552 // If we have a PFX blob, get the first certificate out of the PFX and use that instead of the PFX.
553 if (dwContentType & CERT_QUERY_CONTENT_PFX)
554 {
555 hr = FileRead(&pbData, &cbData, wzPath);
556 ExitOnFailure(hr, "Failed to read PFX file: %ls", wzPath);
557 }
558 else
559 {
560 hr = E_UNEXPECTED;
561 ExitOnFailure(hr, "Unexpected certificate type read from disk.");
562 }
563 }
564
565 *pcbData = cbData;
566 *prgbData = pbData;
567 pbData = NULL;
568
569LExit:
570 ReleaseMem(pbData);
571 return hr;
572}
573
574
575static HRESULT CertificateToHash(
576 __in BYTE* pbCertificate,
577 __in DWORD cbCertificate,
578 __in DWORD dwStoreLocation,
579 __in LPCWSTR wzPFXPassword,
580 __in BYTE rgbHash[],
581 __in DWORD cbHash
582 )
583{
584 HRESULT hr = S_OK;
585
586 HCERTSTORE hPfxCertStore = NULL;
587 PCCERT_CONTEXT pCertContext = NULL;
588 PCCERT_CONTEXT pCertContextEnum = NULL;
589 CRYPT_DATA_BLOB blob = { 0 };
590 CRYPT_KEY_PROV_INFO* pPfxInfo = NULL;
591 DWORD dwKeyset = (CERT_SYSTEM_STORE_CURRENT_USER == dwStoreLocation) ? CRYPT_USER_KEYSET : CRYPT_MACHINE_KEYSET;
592 DWORD dwEncodingType;
593 DWORD dwContentType;
594 DWORD dwFormatType;
595
596 blob.pbData = pbCertificate;
597 blob.cbData = cbCertificate;
598
599 if (!::CryptQueryObject(CERT_QUERY_OBJECT_BLOB, &blob, CERT_QUERY_CONTENT_FLAG_ALL, CERT_QUERY_FORMAT_FLAG_ALL, 0, &dwEncodingType, &dwContentType, &dwFormatType, NULL, NULL, (LPCVOID*)&pCertContext))
600 {
601 ExitWithLastError(hr, "Failed to process certificate as a valid certificate.");
602 }
603
604 if (!pCertContext)
605 {
606 // If we have a PFX blob, get the first certificate out of the PFX and use that instead of the PFX.
607 if (dwContentType & CERT_QUERY_CONTENT_PFX)
608 {
609 // If we fail and our password is blank, also try passing in NULL for the password (according to the docs)
610 hPfxCertStore = ::PFXImportCertStore((CRYPT_DATA_BLOB*)&blob, wzPFXPassword, dwKeyset);
611 if (NULL == hPfxCertStore && !*wzPFXPassword)
612 {
613 hPfxCertStore = ::PFXImportCertStore((CRYPT_DATA_BLOB*)&blob, NULL, dwKeyset);
614 }
615 ExitOnNullWithLastError(hPfxCertStore, hr, "Failed to open PFX file.");
616
617 // Find the first cert with a private key, or just use the last one
618 for (pCertContextEnum = ::CertEnumCertificatesInStore(hPfxCertStore, pCertContextEnum);
619 pCertContextEnum;
620 pCertContextEnum = ::CertEnumCertificatesInStore(hPfxCertStore, pCertContextEnum))
621 {
622 pCertContext = pCertContextEnum;
623
624 if (pCertContext && CertHasPrivateKey(pCertContext, NULL))
625 {
626 break;
627 }
628 }
629
630 ExitOnNullWithLastError(pCertContext, hr, "Failed to read first certificate out of PFX file.");
631
632 // Ignore failures, the worst that happens is some parts of the PFX get left behind.
633 CertReadProperty(pCertContext, CERT_KEY_PROV_INFO_PROP_ID, &pPfxInfo, NULL);
634 }
635 else
636 {
637 hr = E_UNEXPECTED;
638 ExitOnFailure(hr, "Unexpected certificate type processed.");
639 }
640 }
641
642 DWORD cb = cbHash;
643 if (!::CertGetCertificateContextProperty(pCertContext, CERT_SHA1_HASH_PROP_ID, static_cast<LPVOID>(rgbHash), &cb))
644 {
645 ExitWithLastError(hr, "Failed to get certificate SHA1 hash property.");
646 }
647 AssertSz(cb == cbHash, "Did not correctly read certificate SHA1 hash.");
648
649LExit:
650 if (pCertContext)
651 {
652 ::CertFreeCertificateContext(pCertContext);
653 }
654
655 if (hPfxCertStore)
656 {
657 ::CertCloseStore(hPfxCertStore, 0);
658 }
659
660 if (pPfxInfo)
661 {
662 HCRYPTPROV hProvIgnored = NULL; // ignored on deletes.
663 ::CryptAcquireContextW(&hProvIgnored, pPfxInfo->pwszContainerName, pPfxInfo->pwszProvName, pPfxInfo->dwProvType, dwKeyset | CRYPT_DELETEKEYSET | CRYPT_SILENT);
664
665 MemFree(pPfxInfo);
666 }
667
668 return hr;
669}
670
671
672static HRESULT FindExistingCertificate(
673 __in LPCWSTR wzName,
674 __in DWORD dwStoreLocation,
675 __in LPCWSTR wzStore,
676 __out BYTE** prgbCertificate,
677 __out DWORD* pcbCertificate
678 )
679{
680 HRESULT hr = S_OK;
681 HCERTSTORE hCertStore = NULL;
682 PCCERT_CONTEXT pCertContext = NULL;
683 BYTE* pbCertificate = NULL;
684 DWORD cbCertificate = 0;
685
686 hCertStore = ::CertOpenStore(CERT_STORE_PROV_SYSTEM, 0, NULL, dwStoreLocation | CERT_STORE_READONLY_FLAG, wzStore);
687 MessageExitOnNullWithLastError(hCertStore, hr, msierrCERTFailedOpen, "Failed to open certificate store.");
688
689 // Loop through the certificate, looking for certificates that match our friendly name.
690 pCertContext = CertFindCertificateInStore(hCertStore, PKCS_7_ASN_ENCODING | X509_ASN_ENCODING, 0, CERT_FIND_ANY, NULL, NULL);
691 while (pCertContext)
692 {
693 WCHAR wzFriendlyName[256] = { 0 };
694 DWORD cbFriendlyName = sizeof(wzFriendlyName);
695
696 if (::CertGetCertificateContextProperty(pCertContext, CERT_FRIENDLY_NAME_PROP_ID, reinterpret_cast<BYTE*>(wzFriendlyName), &cbFriendlyName) &&
697 CSTR_EQUAL == ::CompareStringW(LOCALE_SYSTEM_DEFAULT, 0, wzName, -1, wzFriendlyName, -1))
698 {
699 // If the certificate with matching friendly name is valid, let's use that.
700 long lVerify = ::CertVerifyTimeValidity(NULL, pCertContext->pCertInfo);
701 if (0 == lVerify)
702 {
703 cbCertificate = pCertContext->cbCertEncoded;
704 pbCertificate = static_cast<BYTE*>(MemAlloc(cbCertificate, FALSE));
705 ExitOnNull(pbCertificate, hr, E_OUTOFMEMORY, "Failed to allocate memory to copy out exist certificate.");
706
707 CopyMemory(pbCertificate, pCertContext->pbCertEncoded, cbCertificate);
708 break; // found a matching certificate, no more searching necessary
709 }
710 }
711
712 // Next certificate in the store.
713 PCCERT_CONTEXT pNext = ::CertFindCertificateInStore(hCertStore, PKCS_7_ASN_ENCODING | X509_ASN_ENCODING, 0, CERT_FIND_ANY, NULL, pCertContext);
714 // old pCertContext is freed by CertFindCertificateInStore
715 pCertContext = pNext;
716 }
717
718 *prgbCertificate = pbCertificate;
719 *pcbCertificate = cbCertificate;
720 pbCertificate = NULL;
721
722LExit:
723 ReleaseMem(pbCertificate);
724
725 if (pCertContext)
726 {
727 ::CertFreeCertificateContext(pCertContext);
728 }
729
730 if (hCertStore)
731 {
732 ::CertCloseStore(hCertStore, 0);
733 }
734
735 return hr;
736}
737
738/*
739HRESULT CreateEnroll(ICEnroll2 **hEnroll, INT iStore, INT iStoreLocation)
740{
741 ICEnroll2 *pEnroll = NULL;
742 HRESULT hr = S_OK;
743 LONG lFlags;
744 DWORD dwFlags = iStoreLocation << CERT_SYSTEM_STORE_LOCATION_SHIFT;
745
746 // create IEntroll
747 hr = CoCreateInstance( CLSID_CEnroll, NULL, CLSCTX_INPROC_SERVER, IID_ICEnroll2, (void **)&pEnroll );
748 if (FAILED(hr))
749 return hr;
750
751 switch (iStore)
752 {
753 case SCA_CERT_STORENAME_MY:
754 pEnroll->get_MyStoreFlags(&lFlags);
755 lFlags &= ~CERT_SYSTEM_STORE_LOCATION_MASK;
756 lFlags |= dwFlags;
757 // following call will change Request store flags also
758 pEnroll->put_MyStoreFlags(lFlags);
759 break;
760 case SCA_CERT_STORENAME_CA:
761 pEnroll->get_CAStoreFlags(&lFlags);
762 lFlags &= ~CERT_SYSTEM_STORE_LOCATION_MASK;
763 lFlags |= dwFlags;
764 // following call will change Request store flags also
765 pEnroll->put_CAStoreFlags(lFlags);
766 break;
767 case SCA_CERT_STORENAME_REQUEST:
768 pEnroll->get_RequestStoreFlags(&lFlags);
769 lFlags &= ~CERT_SYSTEM_STORE_LOCATION_MASK;
770 lFlags |= dwFlags;
771 // following call will change Request store flags also
772 pEnroll->put_RequestStoreFlags(lFlags);
773 break;
774 case SCA_CERT_STORENAME_ROOT:
775 pEnroll->get_RootStoreFlags(&lFlags);
776 lFlags &= ~CERT_SYSTEM_STORE_LOCATION_MASK;
777 lFlags |= dwFlags;
778 // following call will change Request store flags also
779 pEnroll->put_RootStoreFlags(lFlags);
780 break;
781 default:
782 hr = E_FAIL;
783 return hr;
784 }
785
786 pEnroll->get_GenKeyFlags(&lFlags);
787 lFlags |= CRYPT_EXPORTABLE;
788 pEnroll->put_GenKeyFlags(lFlags);
789
790 pEnroll->put_KeySpec(AT_KEYEXCHANGE);
791 pEnroll->put_ProviderType(PROV_RSA_SCHANNEL);
792 pEnroll->put_DeleteRequestCert(TRUE);
793
794 *hEnroll = pEnroll;
795 return hr;
796}
797
798
799HRESULT RequestCertificate(LPCWSTR pwzName, INT iStore, INT iStoreLocation,
800 LPCWSTR wzComputerName, LPCWSTR wzDistinguishedName, LPCWSTR wzCertificateAuthority,
801 BSTR *pbstrCertificate)
802{
803 if (pbstrCertificate == NULL)
804 return E_INVALIDARG;
805
806 HRESULT hr;
807 ICEnroll2 *pEnroll = NULL;
808 ICertRequest *pCertRequest = NULL;
809 BSTR bstrRequest = NULL;
810 LONG nDisposition;
811
812 BSTR bstrCertificateUsage = NULL;
813 BSTR bstrCertificateAttributes = NULL;
814 BSTR bstrCertificateAuthority = NULL;
815
816 // equivalent to: sprintf(bstrDistinguishedName, L"%s,CN=%s", wzDistinguishedName, wzComputerName);
817 DWORD cchComputerName = lstrlenW(wzComputerName);
818 DWORD cchDistinguishedName = lstrlenW(wzDistinguishedName);
819 CONST DWORD cchbstrDistinguishedName = 5 + cchComputerName + cchDistinguishedName;
820 BSTR bstrDistinguishedName = SysAllocStringLen(NULL, cchbstrDistinguishedName);
821 ExitOnNull(bstrDistinguishedName, hr, E_OUTOFMEMORY, "Failed to allocate space for distinguished name.");
822 ::StringCchCopyW((WCHAR*) bstrDistinguishedName, cchbstrDistinguishedName, wzDistinguishedName);
823 ::StringCchCatW((WCHAR*) bstrDistinguishedName, cchbstrDistinguishedName, L",CN=");
824 ::StringCchCatW((WCHAR*) bstrDistinguishedName, cchbstrDistinguishedName, wzComputerName);
825
826 bstrCertificateUsage = SysAllocString(WIDE(szOID_PKIX_KP_SERVER_AUTH));
827 ExitOnNull(bstrCertificateUsage, hr, E_OUTOFMEMORY, "Failed to allocate space for Certificate Usage.");
828 bstrCertificateAttributes = SysAllocString(L"CertificateTemplate:WebServer");
829 bstrCertificateAuthority = SysAllocString(wzCertificateAuthority);
830 ExitOnNull(bstrCertificateAuthority, hr, E_OUTOFMEMORY, "Failed to allocate space for Certificate Authority.");
831
832 hr = CreateEnroll(&pEnroll, iStore, iStoreLocation);
833 ExitOnFailure(hr, "failed CoCreateInstance IEnroll");
834
835 hr = pEnroll->createPKCS10(bstrDistinguishedName, bstrCertificateUsage, &bstrRequest);
836 ExitOnFailure(hr, "failed createPKCS10");
837
838 hr = CoCreateInstance(CLSID_CCertRequest, NULL, CLSCTX_INPROC_SERVER, IID_ICertRequest, (void **)&pCertRequest);
839 ExitOnFailure(hr, "failed CoCreateInstance ICertRequest");
840
841 hr = pCertRequest->Submit(CR_IN_BASE64 | CR_IN_PKCS10, bstrRequest, bstrCertificateAttributes, bstrCertificateAuthority, &nDisposition);
842 ExitOnFailure(hr, "failed ICertRequest.Submit");
843
844 hr = (nDisposition == CR_DISP_ISSUED) ? S_OK : E_FAIL;
845 ExitOnFailure(hr, "failed CR_DISP_ISSUED");
846
847 hr = pCertRequest->GetCertificate(CR_OUT_BASE64, pbstrCertificate);
848 ExitOnFailure(hr, "failed ICertRequest.GetCertificate");
849
850 // save the certificate in place, cannot be passed to a deferred custom action
851 hr = pEnroll->acceptPKCS7(*pbstrCertificate);
852 ExitOnFailure(hr, "failed accept certificate into MY store");
853
854LExit:
855 ReleaseObject(pCertRequest);
856 ReleaseBSTR(bstrRequest);
857 ReleaseObject(pEnroll);
858 ReleaseBSTR(bstrCertificateAuthority);
859 ReleaseBSTR(bstrCertificateAttributes);
860 ReleaseBSTR(bstrDistinguishedName);
861
862 return hr;
863}
864
865
866VOID ParseCertificateAuthority(__in LPCWSTR wzCertificateAuthorityOrig, __out LPWSTR *pwzBuffer, __out LPWSTR **hwzCAArray, __out int *piCAArray)
867{
868 // @asAuthorities = split /;/, $sAuthority;
869 CONST WCHAR wchDelimiter = L';';
870
871 // copy constant into a buffer
872 Assert(wzCertificateAuthorityOrig);
873
874 INT cchCA = lstrlenW(wzCertificateAuthorityOrig) + 1;
875 WCHAR* wzBuffer = new WCHAR[cchCA];
876 if (!wzBuffer)
877 return;
878
879 ::StringCchCopyW(wzBuffer, cchCA, wzCertificateAuthorityOrig);
880
881 // determine the number of strings in the field
882 int iCAArray = 1;
883 int i;
884 for (i = 0; i < cchCA; ++i)
885 {
886 if (wzBuffer[i] == wchDelimiter)
887 ++iCAArray;
888 }
889 LPWSTR *pwzCAArray = (LPWSTR*) new BYTE[iCAArray * sizeof(LPWSTR)];
890 if (!pwzCAArray)
891 {
892 return;
893 }
894
895 pwzCAArray[0] = wzBuffer;
896 iCAArray = 0;
897 for (i = 0; i < cchCA; ++i)
898 {
899 if (wzBuffer[i] != wchDelimiter)
900 continue;
901 wzBuffer[i] = 0; // convert buffer into MULTISZ
902 pwzCAArray[iCAArray] = &wzBuffer[i+1];
903 ++iCAArray;
904 }
905
906 *pwzBuffer = wzBuffer;
907 *hwzCAArray = pwzCAArray;
908 *piCAArray = iCAArray;
909}
910
911
912HRESULT ScaSslExistingCertificateByBinaryData(INT iStore, INT iStoreLocation, BYTE* pwzData, DWORD cchData)
913{
914 HRESULT hr = S_FALSE;
915 HCERTSTORE hCertStore = NULL;
916 PCCERT_CONTEXT pCertCtx = NULL, pCertCtxExisting = NULL;
917 DWORD dwFlags = 0;
918 LPCWSTR wzStore = StoreMapping(iStore);
919 CERT_BLOB blob;
920
921 dwFlags = iStoreLocation << CERT_SYSTEM_STORE_LOCATION_SHIFT;
922 hCertStore = CertOpenStore(CERT_STORE_PROV_SYSTEM, 0, NULL, dwFlags, wzStore);
923 MessageExitOnNullWithLastError(hCertStore, hr, msierrCERTFailedOpen, "failed to open certificate store, OK on uninstall");
924
925 blob.pbData = pwzData;
926 blob.cbData = cchData;
927
928 if (!::CryptQueryObject(CERT_QUERY_OBJECT_BLOB, &blob, CERT_QUERY_CONTENT_FLAG_ALL, CERT_QUERY_FORMAT_FLAG_ALL,
929 0, NULL, NULL, NULL, NULL, NULL, (LPCVOID*)&pCertCtx))
930 ExitOnLastError(hr, "failed to parse the certificate blob, OK on uninstall");
931
932 pCertCtxExisting = CertFindCertificateInStore(
933 hCertStore,
934 PKCS_7_ASN_ENCODING | X509_ASN_ENCODING,
935 0,
936 CERT_FIND_EXISTING,
937 pCertCtx,
938 NULL);
939
940 if (pCertCtxExisting)
941 {
942 hr = S_OK;
943 }
944
945LExit:
946 if (pCertCtx)
947 {
948 CertFreeCertificateContext(pCertCtx);
949 pCertCtx = NULL;
950 }
951 if (pCertCtxExisting)
952 {
953 CertFreeCertificateContext(pCertCtxExisting);
954 pCertCtxExisting = NULL;
955 }
956 if (hCertStore)
957 {
958 CertCloseStore(hCertStore, 0);
959 hCertStore = NULL;
960 }
961
962 return hr;
963}
964
965
966HRESULT ScaSslExistingCertificateByName(LPCWSTR pwzName, INT iStore, INT iStoreLocation,
967 BSTR* pbstrCertificate, DWORD* pcbCertificate, BYTE* pbaHashBuffer)
968{
969 HRESULT hr = S_FALSE;
970 HCERTSTORE hSystemStore = NULL;
971 PCCERT_CONTEXT pTargetCert = NULL;
972 WCHAR wzFriendlyName[MAX_PATH] = {0};
973 DWORD dwFriendlyNameLen = sizeof(wzFriendlyName);
974
975 // Call CertOpenStore to open the CA store.
976 hSystemStore = CertOpenStore(
977 CERT_STORE_PROV_SYSTEM_REGISTRY,
978 0,
979 NULL,
980 (iStoreLocation << CERT_SYSTEM_STORE_LOCATION_SHIFT) | CERT_STORE_OPEN_EXISTING_FLAG,
981 StoreMapping(iStore));
982 if (hSystemStore == NULL)
983 ExitFunction();
984
985 // Get a particular certificate using CertFindCertificateInStore.
986 pTargetCert = CertFindCertificateInStore(
987 hSystemStore,
988 PKCS_7_ASN_ENCODING | X509_ASN_ENCODING,
989 0,
990 CERT_FIND_ANY,
991 NULL,
992 NULL);
993 while (pTargetCert != NULL)
994 {
995 if ((CertGetCertificateContextProperty(pTargetCert, CERT_FRIENDLY_NAME_PROP_ID,
996 (BYTE*)wzFriendlyName, &dwFriendlyNameLen)) &&
997 lstrcmpW(wzFriendlyName, pwzName) == 0)
998 {
999 // pTargetCert is a pointer to the desired certificate.
1000 // Check the certificate's validity.
1001 switch (CertVerifyTimeValidity(
1002 NULL,
1003 pTargetCert->pCertInfo))
1004 {
1005 case 1:
1006 // Certificate is expired
1007 WcaLog(LOGMSG_STANDARD, "The SSL certificate has expired");
1008 // always remove it
1009 {
1010 PCCERT_CONTEXT pDupCertContext = CertDuplicateCertificateContext(pTargetCert);
1011 if (pDupCertContext && CertDeleteCertificateFromStore(pDupCertContext))
1012 {
1013 WcaLog(LOGMSG_STANDARD, "A SSL certificate has removed");
1014 }
1015 }
1016 break;
1017 case 0:
1018 // Certificate is valid
1019 WcaLog(LOGMSG_STANDARD, "The SSL certificate is valid");
1020 hr = S_OK;
1021 if (pbaHashBuffer)
1022 {
1023 // if the certificate already exists and is valid, use that one
1024 DWORD dwHashSize = CB_CERTIFICATE_HASH;
1025 hr = CertGetCertificateContextProperty(pTargetCert, CERT_SHA1_HASH_PROP_ID, (VOID*)pbaHashBuffer, &dwHashSize)
1026 ? S_OK : E_FAIL;
1027 ExitOnFailure(hr, "failed CertGetCertificateContextProperty CERT_SHA1_HASH_PROP_ID");
1028 Assert(pbstrCertificate);
1029 Assert(pcbCertificate);
1030 ReleaseBSTR(*pbstrCertificate);
1031
1032 *pbstrCertificate = SysAllocStringByteLen((LPCSTR)(pTargetCert->pbCertEncoded), pTargetCert->cbCertEncoded);
1033 *pcbCertificate = pTargetCert->cbCertEncoded;
1034 }
1035 ExitFunction();
1036 break;
1037 default:
1038 // Certificate not valid yet, ignore it
1039 WcaLog(LOGMSG_STANDARD, "The SSL certificate is not valid");
1040 break;
1041 }
1042 }
1043 pTargetCert = CertFindCertificateInStore(
1044 hSystemStore,
1045 PKCS_7_ASN_ENCODING | X509_ASN_ENCODING,
1046 0,
1047 CERT_FIND_ANY,
1048 NULL,
1049 pTargetCert);
1050 wzFriendlyName[0] = 0;
1051 dwFriendlyNameLen = sizeof(wzFriendlyName);
1052 }
1053
1054LExit:
1055 // Clean up memory and quit.
1056 if (pTargetCert)
1057 {
1058 CertFreeCertificateContext(pTargetCert);
1059 pTargetCert = NULL;
1060 }
1061 if (hSystemStore)
1062 {
1063 CertCloseStore(hSystemStore, CERT_CLOSE_STORE_CHECK_FLAG);
1064 hSystemStore = NULL;
1065 }
1066
1067 return hr;
1068}
1069
1070
1071HRESULT ScaSslNewCertificate(LPCWSTR pwzName, INT iStore, INT iStoreLocation, LPCWSTR wzComputerName, LPCWSTR wzDistinguishedName, LPCWSTR wzCertificateAuthorityOrig,
1072 BSTR* pbstrCertificate, DWORD* pcbCertificate, BYTE* pbaHashBuffer)
1073{
1074
1075 if (pbstrCertificate == NULL)
1076 return E_INVALIDARG;
1077
1078 HRESULT hr = S_OK;
1079 LPWSTR wzCABuffer = NULL;
1080 LPWSTR *wzCAArray = NULL;
1081 int iCAArray = 0;
1082
1083 // otherwise call the CA for one
1084 ParseCertificateAuthority(wzCertificateAuthorityOrig, &wzCABuffer, &wzCAArray, &iCAArray);
1085
1086 // try each authority three times
1087 for (int i = 0; i < 3 * iCAArray; ++i)
1088 {
1089 LPCWSTR wzCA = wzCAArray[i % iCAArray];
1090 if (NULL == wzCA || NULL == wzCA[0]) continue;
1091 WcaLog(LOGMSG_STANDARD, "Requesting SSL certificate from %ls", wzCA);
1092 hr = RequestCertificate(pwzName, iStore, iStoreLocation, wzComputerName, wzDistinguishedName, wzCA, pbstrCertificate);
1093 if (hr == S_OK && pbstrCertificate)
1094 {
1095 // set the friendly name
1096 CRYPT_HASH_BLOB hblob;
1097 CERT_BLOB blob;
1098 HCERTSTORE hCertStore = NULL;
1099 PCCERT_CONTEXT pCertCtxExisting = NULL;
1100
1101 blob.pbData = (BYTE*)pwzName;
1102 blob.cbData = (lstrlenW(pwzName) + 1) * sizeof(pwzName[0]); // including terminating null
1103
1104 *pcbCertificate = SysStringByteLen(*pbstrCertificate);
1105 hr = CertificateToHash(*pbstrCertificate, pbaHashBuffer);
1106 ExitOnFailure(hr, "failed to CertificateToHash for an existing certificate");
1107
1108 hblob.pbData = pbaHashBuffer;
1109 hblob.cbData = CB_CERTIFICATE_HASH;
1110
1111 hCertStore = CertOpenStore(CERT_STORE_PROV_SYSTEM, 0, NULL, (iStoreLocation << CERT_SYSTEM_STORE_LOCATION_SHIFT), StoreMapping(iStore));
1112 MessageExitOnNullWithLastError(hCertStore, hr, msierrCERTFailedOpen, "failed to open certificate store");
1113
1114 pCertCtxExisting = CertFindCertificateInStore(
1115 hCertStore,
1116 PKCS_7_ASN_ENCODING | X509_ASN_ENCODING,
1117 0,
1118 CERT_FIND_HASH,
1119 &hblob,
1120 NULL);
1121
1122 if (pCertCtxExisting)
1123 {
1124 CertSetCertificateContextProperty(
1125 pCertCtxExisting,
1126 CERT_FRIENDLY_NAME_PROP_ID,
1127 0,
1128 &blob);
1129 }
1130
1131 if (pCertCtxExisting)
1132 {
1133 CertFreeCertificateContext(pCertCtxExisting);
1134 pCertCtxExisting = NULL;
1135 }
1136 if (hCertStore)
1137 {
1138 CertCloseStore(hCertStore, 0);
1139 hCertStore = NULL;
1140 }
1141 ExitFunction();
1142 }
1143 if (pbstrCertificate && *pbstrCertificate)
1144 {
1145 SysFreeString(*pbstrCertificate);
1146 pbstrCertificate = NULL;
1147 }
1148 }
1149 hr = E_FAIL;
1150 ExitOnFailure(hr, "failed to RequestCertificate");
1151
1152LExit:
1153 if (wzCABuffer)
1154 {
1155 delete wzCABuffer;
1156 }
1157 if (wzCAArray)
1158 {
1159 delete wzCAArray;
1160 }
1161
1162 return hr;
1163}
1164
1165
1166HRESULT ScaGetCertificateByRequest(LPCWSTR pwzName, BOOL fIsInstalling, BOOL fIsUninstalling,
1167 INT iStore, INT iStoreLocation,
1168 LPCWSTR wzDistinguishedName, LPCWSTR wzCA,
1169 BSTR* pbstrCertificate, DWORD* pcbCertificate, BYTE* pbaHashBuffer)
1170{
1171 HRESULT hr = S_OK;
1172 WCHAR wzComputerName[MAX_COMPUTER_NAME] = {0};
1173 WCHAR* pwzData = NULL;
1174 DWORD cchData = 0;
1175
1176 // override %COMPUTERNAME% with DOMAINNAME property
1177 hr = WcaGetProperty( L"DOMAINNAME", &pwzData);
1178 ExitOnFailure(hr, "Failed to get Property DOMAINNAME");
1179 if (*pwzData)
1180 {
1181 // if DOMAINNAME is set, use it
1182 ::StringCchCopyW(wzComputerName, MAX_COMPUTER_NAME, pwzData);
1183 }
1184 else
1185 {
1186 // otherwise get the intranet name given by %COMPUTERNAME%
1187 GetEnvironmentVariableW(L"COMPUTERNAME", wzComputerName, MAX_COMPUTER_NAME);
1188 }
1189
1190 hr = ScaSslExistingCertificateByName(pwzName, iStore, iStoreLocation, pbstrCertificate, pcbCertificate, pbaHashBuffer);
1191 ExitOnFailure(hr, "Failed ScaSslExistingCertificateByName");
1192 if (S_OK != hr)
1193 {
1194 if (!fIsUninstalling && fIsInstalling)
1195 {
1196 // if no existing cert and not on uninstall, hit the authority
1197 WcaLog(LOGMSG_STANDARD, "Adding certificate: requested, %ls", wzDistinguishedName);
1198 hr = ScaSslNewCertificate(pwzName, iStore, iStoreLocation, wzComputerName, wzDistinguishedName, wzCA,
1199 pbstrCertificate, pcbCertificate, pbaHashBuffer);
1200 ExitOnFailure(hr, "Failed ScaSslNewCertificate");
1201 }
1202 else
1203 {
1204 // if no existing cert and uninstall
1205 hr = S_OK;
1206 }
1207 }
1208
1209LExit:
1210 ReleaseStr(pwzData);
1211
1212 return hr;
1213}
1214
1215
1216HRESULT ScaInstallCertificateByContext(LPCWSTR pwzName, INT iStore, INT iStoreLocation,
1217 PCCERT_CONTEXT pCertContext)
1218{
1219 HRESULT hr = S_OK;
1220 HCERTSTORE hCertStore = NULL;
1221 DWORD dwFlags = iStoreLocation << CERT_SYSTEM_STORE_LOCATION_SHIFT;
1222 CERT_BLOB blob;
1223
1224 hCertStore = CertOpenStore(CERT_STORE_PROV_SYSTEM, 0, NULL, dwFlags, StoreMapping(iStore));
1225 if (hCertStore == NULL)
1226 MessageExitOnLastError(hr, msierrCERTFailedOpen, "failed to open certificate store");
1227
1228 blob.pbData = (BYTE*)pwzName;
1229 blob.cbData = (lstrlenW(pwzName) + 1) * sizeof(pwzName[0]); // including terminating null
1230 CertSetCertificateContextProperty(
1231 pCertContext,
1232 CERT_FRIENDLY_NAME_PROP_ID,
1233 0,
1234 &blob);
1235
1236 if (!CertAddCertificateContextToStore(
1237 hCertStore,
1238 pCertContext,
1239 CERT_STORE_ADD_REPLACE_EXISTING,
1240 NULL))
1241 {
1242 hr = E_FAIL;
1243 MessageExitOnLastError(hr, msierrCERTFailedAdd, "failed to add certificate to the store");
1244 }
1245
1246LExit:
1247 if (hCertStore)
1248 {
1249 CertCloseStore(hCertStore, 0);
1250 hCertStore = NULL;
1251 }
1252
1253 return hr;
1254}
1255
1256
1257HRESULT ScaGetCertificateByPath(LPCWSTR pwzName, BOOL fIsInstalling, BOOL fIsUninstalling,
1258 INT iStore, INT iStoreLocation, LPCWSTR wzSslCertificate, LPCWSTR wzPFXPassword,
1259 BSTR* pbstrCertificate, DWORD* pcbCertificate, BYTE* pbaHashBuffer)
1260{
1261 Assert(wzSslCertificate);
1262 HRESULT hr = S_OK;
1263 PCCERT_CONTEXT pCertContext = NULL;
1264 DWORD dwEncodingType = 0;
1265 DWORD dwContentType = 0;
1266 DWORD dwFormatType = 0;
1267 DWORD dwHashSize = CB_CERTIFICATE_HASH;
1268 HANDLE hPfxFile = INVALID_HANDLE_VALUE;
1269 CRYPT_DATA_BLOB blob;
1270
1271 blob.pbData = NULL;
1272 blob.cbData = 0;
1273
1274 if (wzSslCertificate && wzSslCertificate[0] != 0)
1275 {
1276 if (!::CryptQueryObject(CERT_QUERY_OBJECT_FILE, (LPVOID)wzSslCertificate, CERT_QUERY_CONTENT_FLAG_ALL, CERT_QUERY_FORMAT_FLAG_ALL,
1277 0, &dwEncodingType, &dwContentType, &dwFormatType, NULL, NULL, (LPCVOID*)&pCertContext))
1278 hr = fIsUninstalling ? S_FALSE : HRESULT_FROM_WIN32(::GetLastError()); // don't fail on uninstall
1279 ExitOnFailure(hr, "failed CryptQueryObject");
1280 }
1281 else
1282 {
1283 hr = S_FALSE;
1284 ExitFunction();
1285 }
1286
1287 if (!pCertContext)
1288 {
1289 // this is a pfx?
1290 // make sure to exit this block of code properly for clean up blob.pbData
1291 if (dwContentType & CERT_QUERY_CONTENT_PFX)
1292 {
1293 DWORD iSize = 0, iReadSize = 0;
1294 HCERTSTORE hPfxCertStore = NULL;
1295
1296 hPfxFile = ::CreateFileW(wzSslCertificate, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
1297 NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
1298 hr = (hPfxFile != INVALID_HANDLE_VALUE) ? S_OK : E_FAIL;
1299 ExitOnFailure(hr, "failed CryptQueryObject, file handle is null");
1300 iSize = ::GetFileSize(hPfxFile, NULL);
1301 hr = (iSize > 0) ? S_OK : E_FAIL;
1302 ExitOnFailure(hr, "failed CryptQueryObject, file size is 0");
1303 blob.pbData = new BYTE[iSize];
1304 blob.cbData = iSize;
1305 hr = (blob.pbData) ? S_OK : E_FAIL;
1306 ExitOnFailure(hr, "out of memory for blob");
1307
1308 if (::ReadFile(hPfxFile, (LPVOID)blob.pbData, iSize, &iReadSize, NULL))
1309 {
1310 hPfxCertStore = PFXImportCertStore((CRYPT_DATA_BLOB*)&blob, wzPFXPassword,
1311 (iStoreLocation == SCA_CERTSYSTEMSTORE_CURRENTUSER) ? CRYPT_USER_KEYSET : CRYPT_MACHINE_KEYSET);
1312 if (hPfxCertStore)
1313 {
1314 pCertContext = CertEnumCertificatesInStore(hPfxCertStore, NULL);
1315 // work only with the first certificate in pfx
1316 if (pCertContext)
1317 {
1318 hr = CertGetCertificateContextProperty(pCertContext, CERT_SHA1_HASH_PROP_ID, (VOID*)pbaHashBuffer, &dwHashSize)
1319 ? S_OK : E_FAIL;
1320 ExitOnFailure(hr, "failed CertGetCertificateContextProperty CERT_SHA1_HASH_PROP_ID");
1321 ReleaseBSTR(*pbstrCertificate);
1322
1323 *pbstrCertificate = SysAllocStringByteLen((LPCSTR)(pCertContext->pbCertEncoded), pCertContext->cbCertEncoded);
1324 *pcbCertificate = pCertContext->cbCertEncoded;
1325 if (fIsInstalling)
1326 {
1327 // install the certificate, cannot defer because the data required cannot be passed
1328 hr = ScaInstallCertificateByContext(pwzName, iStore, iStoreLocation, pCertContext);
1329 }
1330 }
1331 else
1332 hr = E_FAIL;
1333 }
1334 else
1335 hr = E_FAIL;
1336 }
1337 else
1338 hr = E_FAIL;
1339 }
1340 else
1341 {
1342 ExitOnFailure(hr = E_FAIL, "failed CryptQueryObject, unknown data");
1343 }
1344 }
1345 else
1346 {
1347 // return cert and its hash
1348 hr = CertGetCertificateContextProperty(pCertContext, CERT_SHA1_HASH_PROP_ID, (VOID*)pbaHashBuffer, &dwHashSize)
1349 ? S_OK : E_FAIL;
1350 ExitOnFailure(hr, "failed CertGetCertificateContextProperty CERT_SHA1_HASH_PROP_ID");
1351 ReleaseBSTR(*pbstrCertificate);
1352
1353 *pbstrCertificate = SysAllocStringByteLen((LPCSTR)(pCertContext->pbCertEncoded), pCertContext->cbCertEncoded);
1354 *pcbCertificate = pCertContext->cbCertEncoded;
1355 if (fIsInstalling)
1356 {
1357 // install the certificate, cannot defer because the data required cannot be passed
1358 hr = ScaInstallCertificateByContext(pwzName, iStore, iStoreLocation, pCertContext);
1359 }
1360 }
1361
1362LExit:
1363 if (pCertContext)
1364 {
1365 CertFreeCertificateContext(pCertContext);
1366 pCertContext = NULL;
1367 }
1368 if (hPfxFile != INVALID_HANDLE_VALUE)
1369 {
1370 CloseHandle(hPfxFile);
1371 hPfxFile = INVALID_HANDLE_VALUE;
1372 }
1373 if (blob.pbData)
1374 {
1375 delete [] blob.pbData;
1376 blob.pbData = NULL;
1377 blob.cbData = 0;
1378 }
1379
1380 return hr;
1381}
1382
1383
1384HRESULT ScaInstallCertificateByBinaryData(BOOL fAddCert, INT iStore, INT iStoreLocation, LPCWSTR wzName, BYTE* pwzData, DWORD cchData,
1385 LPCWSTR wzPFXPassword)
1386{
1387 Assert(wzName);
1388 Assert(pwzData);
1389 Assert(cchData);
1390 HRESULT hr = S_OK;
1391 HCERTSTORE hCertStore = NULL, hPfxCertStore = NULL;
1392 PCCERT_CONTEXT pCertCtx = NULL, pCertCtxExisting = NULL;
1393 DWORD dwFlags, dwEncodingType, dwContentType, dwFormatType;
1394 CERT_BLOB blob;
1395 LPCWSTR wzStore = StoreMapping(iStore);
1396
1397 dwFlags = iStoreLocation << CERT_SYSTEM_STORE_LOCATION_SHIFT;
1398 hCertStore = CertOpenStore(CERT_STORE_PROV_SYSTEM, 0, NULL, dwFlags, wzStore);
1399 MessageExitOnNullWithLastError(hCertStore, hr, msierrCERTFailedOpen, "failed to open certificate store");
1400
1401 blob.pbData = pwzData;
1402 blob.cbData = cchData;
1403
1404 if (!::CryptQueryObject(CERT_QUERY_OBJECT_BLOB, &blob, CERT_QUERY_CONTENT_FLAG_ALL, CERT_QUERY_FORMAT_FLAG_ALL,
1405 0, &dwEncodingType, &dwContentType, &dwFormatType, NULL, NULL, (LPCVOID*)&pCertCtx))
1406 ExitOnLastError(hr, "failed to parse the certificate blob");
1407 ExitOnNull(pCertCtx, hr, E_UNEXPECTED, "failed to parse the certificate blob");
1408
1409 blob.pbData = (BYTE*)wzName;
1410 blob.cbData = (lstrlenW(wzName) + 1) * sizeof(wzName[0]); // including terminating null
1411
1412 CertSetCertificateContextProperty(
1413 pCertCtx,
1414 CERT_FRIENDLY_NAME_PROP_ID,
1415 0,
1416 &blob);
1417
1418 if (fAddCert)
1419 {
1420 // Add
1421 WcaLog(LOGMSG_STANDARD, "Adding certificate: binary name, %ls", wzName);
1422 if (!CertAddCertificateContextToStore(
1423 hCertStore,
1424 pCertCtx,
1425 CERT_STORE_ADD_REPLACE_EXISTING,
1426 NULL))
1427 {
1428 hr = E_FAIL;
1429 MessageExitOnLastError(hr, msierrCERTFailedAdd, "failed to add certificate to the store");
1430 }
1431 }
1432 else
1433 {
1434 // Delete
1435 WcaLog(LOGMSG_STANDARD, "Deleting certificate provided: binary name, %ls", wzName);
1436 pCertCtxExisting = CertFindCertificateInStore(
1437 hCertStore,
1438 PKCS_7_ASN_ENCODING | X509_ASN_ENCODING,
1439 0,
1440 CERT_FIND_EXISTING,
1441 pCertCtx,
1442 NULL);
1443
1444 if (pCertCtxExisting)
1445 {
1446 if (!CertDeleteCertificateFromStore(pCertCtxExisting))
1447 {
1448 ExitOnLastError(hr, "failed to delete certificate");
1449 }
1450 else
1451 {
1452 pCertCtxExisting = NULL;
1453 }
1454 }
1455 }
1456
1457LExit:
1458 if (pCertCtx)
1459 {
1460 CertFreeCertificateContext(pCertCtx);
1461 pCertCtx = NULL;
1462 }
1463 if (pCertCtxExisting)
1464 {
1465 CertFreeCertificateContext(pCertCtxExisting);
1466 pCertCtxExisting = NULL;
1467 }
1468 // order is important for store
1469 if (hCertStore)
1470 {
1471 CertCloseStore(hCertStore, 0);
1472 hCertStore = NULL;
1473 }
1474 if (hPfxCertStore)
1475 {
1476 CertCloseStore(hPfxCertStore, 0);
1477 hPfxCertStore = NULL;
1478 }
1479
1480 return hr;
1481}
1482*/
diff --git a/src/ext/Iis/ca/scacert.h b/src/ext/Iis/ca/scacert.h
new file mode 100644
index 00000000..39b00d3d
--- /dev/null
+++ b/src/ext/Iis/ca/scacert.h
@@ -0,0 +1,23 @@
1#pragma once
2// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
3
4
5#define CB_CERTIFICATE_HASH 20
6
7// Certificate.Attribute
8enum SCA_CERT_ATTRIBUTES
9{
10 SCA_CERT_ATTRIBUTE_DEFAULT = 0,
11 SCA_CERT_ATTRIBUTE_REQUEST = 1,
12 SCA_CERT_ATTRIBUTE_BINARYDATA = 2,
13 SCA_CERT_ATTRIBUTE_OVERWRITE = 4,
14 SCA_CERT_ATTRIBUTE_VITAL = 8,
15};
16
17
18// Certificate.StoreLocation
19enum SCA_CERTSYSTEMSTORE
20{
21 SCA_CERTSYSTEMSTORE_CURRENTUSER = 1,
22 SCA_CERTSYSTEMSTORE_LOCALMACHINE = 2,
23};
diff --git a/src/ext/Iis/ca/scacertexec.cpp b/src/ext/Iis/ca/scacertexec.cpp
new file mode 100644
index 00000000..95870c79
--- /dev/null
+++ b/src/ext/Iis/ca/scacertexec.cpp
@@ -0,0 +1,431 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3#include "precomp.h"
4
5#define SIXTY_FOUR_MEG 64 * 1024 * 1024
6
7// prototypes
8static HRESULT ExecuteCertificateOperation(
9 __in MSIHANDLE hInstall,
10 __in SCA_ACTION saAction,
11 __in DWORD dwStoreRoot
12 );
13
14static HRESULT ReadCertificateFile(
15 __in LPCWSTR wzPath,
16 __out BYTE** prgbData,
17 __out DWORD* pcbData
18 );
19
20static HRESULT InstallCertificatePackage(
21 __in HCERTSTORE hStore,
22 __in BOOL fUserCertificateStore,
23 __in LPCWSTR wzName,
24 __in_opt BYTE* rgbData,
25 __in DWORD cbData,
26 __in BOOL fVital,
27 __in_opt LPCWSTR wzPFXPassword
28 );
29
30static HRESULT UninstallCertificatePackage(
31 __in HCERTSTORE hStore,
32 __in BOOL fUserCertificateStore,
33 __in LPCWSTR wzName
34 );
35
36static HRESULT AddCertificate(
37 __in HCERTSTORE hStore,
38 __in PCCERT_CONTEXT pCertContext,
39 __in LPCWSTR wzCertificateUniqueName,
40 __in BOOL fVital
41);
42
43/* ****************************************************************
44 AddUserCertificate - CUSTOM ACTION ENTRY POINT for adding per-user
45 certificates
46
47 * ***************************************************************/
48extern "C" UINT __stdcall AddUserCertificate(
49 __in MSIHANDLE hInstall
50 )
51{
52 HRESULT hr = S_OK;
53 DWORD er = ERROR_SUCCESS;
54
55 hr = WcaInitialize(hInstall, "AddUserCertificate");
56 ExitOnFailure(hr, "Failed to initialize AddUserCertificate.");
57
58 hr = ExecuteCertificateOperation(hInstall, SCA_ACTION_INSTALL, CERT_SYSTEM_STORE_CURRENT_USER);
59 ExitOnFailure(hr, "Failed to install per-user certificate.");
60
61LExit:
62 er = SUCCEEDED(hr) ? ERROR_SUCCESS : ERROR_INSTALL_FAILURE;
63 return WcaFinalize(er);
64}
65
66
67/* ****************************************************************
68 AddMachineCertificate - CUSTOM ACTION ENTRY POINT for adding
69 per-machine certificates
70
71 * ***************************************************************/
72extern "C" UINT __stdcall AddMachineCertificate(
73 __in MSIHANDLE hInstall
74 )
75{
76 HRESULT hr = S_OK;
77 DWORD er = ERROR_SUCCESS;
78
79 hr = WcaInitialize(hInstall, "AddMachineCertificate");
80 ExitOnFailure(hr, "Failed to initialize AddMachineCertificate.");
81
82 hr = ExecuteCertificateOperation(hInstall, SCA_ACTION_INSTALL, CERT_SYSTEM_STORE_LOCAL_MACHINE);
83 ExitOnFailure(hr, "Failed to install per-machine certificate.");
84
85LExit:
86 er = SUCCEEDED(hr) ? ERROR_SUCCESS : ERROR_INSTALL_FAILURE;
87 return WcaFinalize(er);
88}
89
90
91/* ****************************************************************
92 DeleteUserCertificate - CUSTOM ACTION ENTRY POINT for deleting
93 per-user certificates
94
95 * ***************************************************************/
96extern "C" UINT __stdcall DeleteUserCertificate(
97 __in MSIHANDLE hInstall
98 )
99{
100 HRESULT hr = S_OK;
101 DWORD er = ERROR_SUCCESS;
102
103 hr = WcaInitialize(hInstall, "DeleteUserCertificate");
104 ExitOnFailure(hr, "Failed to initialize DeleteUserCertificate.");
105
106 hr = ExecuteCertificateOperation(hInstall, SCA_ACTION_UNINSTALL, CERT_SYSTEM_STORE_CURRENT_USER);
107 ExitOnFailure(hr, "Failed to uninstall per-user certificate.");
108
109LExit:
110 er = SUCCEEDED(hr) ? ERROR_SUCCESS : ERROR_INSTALL_FAILURE;
111 return WcaFinalize(er);
112}
113
114
115/* ****************************************************************
116 DeleteMachineCertificate - CUSTOM ACTION ENTRY POINT for deleting
117 per-machine certificates
118
119 * ***************************************************************/
120extern "C" UINT __stdcall DeleteMachineCertificate(
121 __in MSIHANDLE hInstall
122 )
123{
124 HRESULT hr = S_OK;
125 DWORD er = ERROR_SUCCESS;
126
127 hr = WcaInitialize(hInstall, "DeleteMachineCertificate");
128 ExitOnFailure(hr, "Failed to initialize DeleteMachineCertificate.");
129
130 hr = ExecuteCertificateOperation(hInstall, SCA_ACTION_UNINSTALL, CERT_SYSTEM_STORE_LOCAL_MACHINE);
131 ExitOnFailure(hr, "Failed to uninstall per-machine certificate.");
132
133LExit:
134 er = SUCCEEDED(hr) ? ERROR_SUCCESS : ERROR_INSTALL_FAILURE;
135 return WcaFinalize(er);
136}
137
138
139static HRESULT ExecuteCertificateOperation(
140 __in MSIHANDLE /*hInstall*/,
141 __in SCA_ACTION saAction,
142 __in DWORD dwStoreLocation
143 )
144{
145 //AssertSz(FALSE, "Debug ExecuteCertificateOperation() here.");
146 Assert(saAction & SCA_ACTION_INSTALL || saAction & SCA_ACTION_UNINSTALL);
147
148 HRESULT hr = S_OK;
149 LPWSTR pwzCaData = NULL;
150 LPWSTR pwz;
151 LPWSTR pwzName = NULL;
152 LPWSTR pwzStore = NULL;
153 int iAttributes = 0;
154 LPWSTR pwzPFXPassword = NULL;
155 LPWSTR pwzFilePath = NULL;
156 BYTE* pbData = NULL;
157 DWORD cbData = 0;
158 DWORD_PTR cbPFXPassword = 0;
159
160 BOOL fUserStoreLocation = (CERT_SYSTEM_STORE_CURRENT_USER == dwStoreLocation);
161 HCERTSTORE hCertStore = NULL;
162
163 hr = WcaGetProperty(L"CustomActionData", &pwzCaData);
164 ExitOnFailure(hr, "Failed to get CustomActionData");
165
166 WcaLog(LOGMSG_TRACEONLY, "CustomActionData: %ls", pwzCaData);
167
168 pwz = pwzCaData;
169 hr = WcaReadStringFromCaData(&pwz, &pwzName);
170 ExitOnFailure(hr, "Failed to parse certificate name.");
171 hr = WcaReadStringFromCaData(&pwz, &pwzStore);
172 ExitOnFailure(hr, "Failed to parse CustomActionData, StoreName");
173 hr = WcaReadIntegerFromCaData(&pwz, &iAttributes);
174 ExitOnFailure(hr, "Failed to parse certificate attribute");
175 if (SCA_ACTION_INSTALL == saAction) // install operations need more data
176 {
177 hr = WcaReadStreamFromCaData(&pwz, &pbData, (DWORD_PTR*)&cbData);
178 ExitOnFailure(hr, "Failed to parse certificate stream.");
179
180 hr = WcaReadStringFromCaData(&pwz, &pwzPFXPassword);
181 ExitOnFailure(hr, "Failed to parse certificate password.");
182 }
183
184 // Open the right store.
185 hCertStore = ::CertOpenStore(CERT_STORE_PROV_SYSTEM, 0, NULL, dwStoreLocation | CERT_STORE_MAXIMUM_ALLOWED_FLAG, pwzStore);
186 MessageExitOnNullWithLastError(hCertStore, hr, msierrCERTFailedOpen, "Failed to open certificate store: %ls", pwzStore);
187
188 if (SCA_ACTION_INSTALL == saAction) // install operations need more data
189 {
190 // Uninstall existing versions of this package. Ignore any failures
191 // This is needed to clean up the private key of a cert when we replace an existing cert
192 // CertAddCertificateContextToStore(CERT_STORE_ADD_REPLACE_EXISTING) does not remove the private key if the cert is replaced
193 UninstallCertificatePackage(hCertStore, fUserStoreLocation, pwzName);
194
195 hr = InstallCertificatePackage(hCertStore, fUserStoreLocation, pwzName, pbData, cbData, iAttributes & SCA_CERT_ATTRIBUTE_VITAL, pwzPFXPassword);
196 ExitOnFailure(hr, "Failed to install certificate.");
197 }
198 else
199 {
200 Assert(SCA_ACTION_UNINSTALL == saAction);
201
202 hr = UninstallCertificatePackage(hCertStore, fUserStoreLocation, pwzName);
203 ExitOnFailure(hr, "Failed to uninstall certificate.");
204 }
205
206LExit:
207 if (NULL != pwzPFXPassword && SUCCEEDED(StrSize(pwzPFXPassword, &cbPFXPassword)))
208 {
209 SecureZeroMemory(pwzPFXPassword, cbPFXPassword);
210 }
211
212 if (hCertStore)
213 {
214 if (!::CertCloseStore(hCertStore, CERT_CLOSE_STORE_CHECK_FLAG))
215 {
216 WcaLog(LOGMSG_VERBOSE, "Cert store was closed but not all resources were freed. Error 0x%x", GetLastError());
217 }
218 }
219
220 ReleaseMem(pbData);
221 ReleaseStr(pwzFilePath);
222 ReleaseStr(pwzPFXPassword);
223 ReleaseStr(pwzStore);
224 ReleaseStr(pwzName);
225 ReleaseStr(pwzCaData);
226 return hr;
227}
228
229
230static HRESULT InstallCertificatePackage(
231 __in HCERTSTORE hStore,
232 __in BOOL fUserCertificateStore,
233 __in LPCWSTR wzName,
234 __in_opt BYTE* rgbData,
235 __in DWORD cbData,
236 __in BOOL fVital,
237 __in_opt LPCWSTR wzPFXPassword
238 )
239{
240 HRESULT hr = S_OK;
241
242 HCERTSTORE hPfxCertStore = NULL;
243 PCCERT_CONTEXT pCertContext = NULL;
244 CERT_BLOB blob = { 0 };
245 DWORD dwKeyset = fUserCertificateStore ? CRYPT_USER_KEYSET : CRYPT_MACHINE_KEYSET;
246 DWORD dwEncodingType;
247 DWORD dwContentType;
248 DWORD dwFormatType;
249 LPWSTR pwzUniqueName = NULL;
250 int iUniqueId = 0;
251
252 // Figure out what type of blob (certificate or PFX) we're dealing with here.
253 blob.pbData = rgbData;
254 blob.cbData = cbData;
255
256 if (!::CryptQueryObject(CERT_QUERY_OBJECT_BLOB, &blob, CERT_QUERY_CONTENT_FLAG_ALL, CERT_QUERY_FORMAT_FLAG_ALL, 0, &dwEncodingType, &dwContentType, &dwFormatType, NULL, NULL, (LPCVOID*)&pCertContext))
257 {
258 ExitWithLastError(hr, "Failed to parse the certificate blob: %ls", wzName);
259 }
260
261 hr = StrAllocFormatted(&pwzUniqueName, L"%s_wixCert_%d", wzName, ++iUniqueId);
262 ExitOnFailure(hr, "Failed to format unique name");
263
264 if (!pCertContext)
265 {
266 // If we have a PFX blob, get the first certificate out of the PFX and use that instead of the PFX.
267 if (dwContentType & CERT_QUERY_CONTENT_PFX)
268 {
269 ExitOnNull(wzPFXPassword, hr, E_INVALIDARG, "Failed to import PFX blob because no password was provided");
270
271 // If we fail and our password is blank, also try passing in NULL for the password (according to the docs)
272 hPfxCertStore = ::PFXImportCertStore((CRYPT_DATA_BLOB*)&blob, wzPFXPassword, dwKeyset);
273 if (NULL == hPfxCertStore && !*wzPFXPassword)
274 {
275 hPfxCertStore = ::PFXImportCertStore((CRYPT_DATA_BLOB*)&blob, NULL, dwKeyset);
276 }
277 ExitOnNullWithLastError(hPfxCertStore, hr, "Failed to open PFX file.");
278
279 // Install all certificates in the PFX
280 for (pCertContext = ::CertEnumCertificatesInStore(hPfxCertStore, pCertContext);
281 pCertContext;
282 pCertContext = ::CertEnumCertificatesInStore(hPfxCertStore, pCertContext))
283 {
284 hr = AddCertificate(hStore, pCertContext, pwzUniqueName, fVital);
285 MessageExitOnFailure(hr, msierrCERTFailedAdd, "Failed to add certificate to the store.");
286
287 hr = StrAllocFormatted(&pwzUniqueName, L"%s_wixCert_%d", wzName, ++iUniqueId);
288 ExitOnFailure(hr, "Failed to format unique name");
289 }
290 }
291 else
292 {
293 hr = E_UNEXPECTED;
294 ExitOnFailure(hr, "Unexpected certificate type processed.");
295 }
296 }
297 else
298 {
299 hr = AddCertificate(hStore, pCertContext, pwzUniqueName, fVital);
300 MessageExitOnFailure(hr, msierrCERTFailedAdd, "Failed to add certificate to the store.");
301 }
302
303 hr = WcaProgressMessage(COST_CERT_ADD, FALSE);
304 ExitOnFailure(hr, "Failed to send install progress message.");
305
306LExit:
307 ReleaseStr(pwzUniqueName);
308
309 if (pCertContext)
310 {
311 ::CertFreeCertificateContext(pCertContext);
312 }
313
314 // Close the stores after the context's are released.
315 if (hPfxCertStore)
316 {
317 if (!::CertCloseStore(hPfxCertStore, CERT_CLOSE_STORE_CHECK_FLAG))
318 {
319 WcaLog(LOGMSG_VERBOSE, "PFX cert store was closed but not all resources were freed. Error 0x%x", GetLastError());
320 }
321 }
322
323 return hr;
324}
325
326
327static HRESULT UninstallCertificatePackage(
328 __in HCERTSTORE hStore,
329 __in BOOL fUserCertificateStore,
330 __in LPCWSTR wzName
331 )
332{
333 HRESULT hr = S_OK;
334 DWORD er = ERROR_SUCCESS;
335 PCCERT_CONTEXT pCertContext = NULL;
336 CRYPT_KEY_PROV_INFO* pPrivateKeyInfo = NULL;
337 LPWSTR pwzUniquePrefix = NULL;
338 int ccUniquePrefix = 0;
339
340 hr = StrAllocFormatted(&pwzUniquePrefix, L"%s_wixCert_", wzName);
341 ExitOnFailure(hr, "Failed to format unique name");
342 ccUniquePrefix = ::lstrlenW(pwzUniquePrefix);
343
344 WcaLog(LOGMSG_STANDARD, "Deleting certificate that begin with friendly name: %ls", pwzUniquePrefix);
345
346 // Loop through all certificates in the store, deleting the ones that begin with our prefix.
347 while (NULL != (pCertContext = ::CertFindCertificateInStore(hStore, PKCS_7_ASN_ENCODING | X509_ASN_ENCODING, 0, CERT_FIND_ANY, NULL, pCertContext)))
348 {
349 WCHAR wzFriendlyName[256] = { 0 };
350 DWORD cbFriendlyName = sizeof(wzFriendlyName);
351
352 if (::CertGetCertificateContextProperty(pCertContext, CERT_FRIENDLY_NAME_PROP_ID, reinterpret_cast<BYTE*>(wzFriendlyName), &cbFriendlyName) &&
353 lstrlenW(wzFriendlyName) >= ccUniquePrefix &&
354 CSTR_EQUAL == ::CompareStringW(LOCALE_SYSTEM_DEFAULT, 0, pwzUniquePrefix, ccUniquePrefix, wzFriendlyName, ccUniquePrefix))
355 {
356 PCCERT_CONTEXT pCertContextDelete = ::CertDuplicateCertificateContext(pCertContext); // duplicate the context so we can delete it with out disrupting the looping
357 if(pCertContextDelete)
358 {
359 // Delete the certificate and if successful delete the matching private key as well.
360 if (::CertDeleteCertificateFromStore(pCertContextDelete))
361 {
362 // If we found private key info, delete it.
363 hr = CertReadProperty(pCertContextDelete, CERT_KEY_PROV_INFO_PROP_ID, &pPrivateKeyInfo, NULL);
364 if (SUCCEEDED(hr))
365 {
366 HCRYPTPROV hProvIgnored = NULL; // ignored on deletes.
367 DWORD dwKeyset = fUserCertificateStore ? CRYPT_USER_KEYSET : CRYPT_MACHINE_KEYSET;
368
369 if (!::CryptAcquireContextW(&hProvIgnored, pPrivateKeyInfo->pwszContainerName, pPrivateKeyInfo->pwszProvName, pPrivateKeyInfo->dwProvType, dwKeyset | CRYPT_DELETEKEYSET | CRYPT_SILENT))
370 {
371 er = ::GetLastError();
372 hr = HRESULT_FROM_WIN32(er);
373 }
374
375 ReleaseNullMem(pPrivateKeyInfo);
376 }
377 else // don't worry about failures to delete private keys.
378 {
379 hr = S_OK;
380 }
381 }
382 else
383 {
384 er = ::GetLastError();
385 hr = HRESULT_FROM_WIN32(er);
386 }
387
388 if (FAILED(hr))
389 {
390 WcaLog(LOGMSG_STANDARD, "Failed to delete certificate with friendly name: %ls, continuing anyway. Error: 0x%x", wzFriendlyName, hr);
391 }
392
393 pCertContextDelete = NULL;
394 }
395 }
396 }
397
398 hr = WcaProgressMessage(COST_CERT_DELETE, FALSE);
399 ExitOnFailure(hr, "Failed to send uninstall progress message.");
400
401LExit:
402 ReleaseStr(pwzUniquePrefix);
403 ReleaseMem(pPrivateKeyInfo);
404 if(pCertContext)
405 {
406 ::CertFreeCertificateContext(pCertContext);
407 }
408
409 return hr;
410}
411
412static HRESULT AddCertificate(
413 __in HCERTSTORE hStore,
414 __in PCCERT_CONTEXT pCertContext,
415 __in LPCWSTR wzCertificateUniqueName,
416 __in BOOL fVital
417)
418{
419 HRESULT hr = S_OK;
420
421 WcaLog(LOGMSG_STANDARD, "Adding certificate: %ls", wzCertificateUniqueName);
422
423 hr = CertInstallSingleCertificate(hStore, pCertContext, wzCertificateUniqueName);
424 if (FAILED(hr) && !fVital)
425 {
426 WcaLog(LOGMSG_STANDARD, "Could not add non-vital certificate: %ls due to error: 0x%x, continuing...", wzCertificateUniqueName, hr);
427 hr = S_FALSE;
428 }
429
430 return hr;
431}
diff --git a/src/ext/Iis/ca/scacost.h b/src/ext/Iis/ca/scacost.h
new file mode 100644
index 00000000..be92cf26
--- /dev/null
+++ b/src/ext/Iis/ca/scacost.h
@@ -0,0 +1,15 @@
1#pragma once
2// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
3
4
5const UINT COST_IIS_TRANSACTIONS = 10000;
6
7const UINT COST_IIS_CREATEKEY = 5000;
8const UINT COST_IIS_DELETEKEY = 5000;
9const UINT COST_IIS_WRITEVALUE = 5000;
10const UINT COST_IIS_DELETEVALUE = 5000;
11const UINT COST_IIS_CREATEAPP = 5000;
12const UINT COST_IIS_DELETEAPP = 5000;
13
14const UINT COST_CERT_ADD = 5000;
15const UINT COST_CERT_DELETE = 5000;
diff --git a/src/ext/Iis/ca/scaexec.cpp b/src/ext/Iis/ca/scaexec.cpp
new file mode 100644
index 00000000..df25e8db
--- /dev/null
+++ b/src/ext/Iis/ca/scaexec.cpp
@@ -0,0 +1,1184 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3#include "precomp.h"
4
5
6/********************************************************************
7 StartMetabaseTransaction - CUSTOM ACTION ENTRY POINT for backing up metabase
8
9 Input: deferred CustomActionData - BackupName
10********************************************************************/
11extern "C" UINT __stdcall StartMetabaseTransaction(MSIHANDLE hInstall)
12{
13//AssertSz(FALSE, "debug StartMetabaseTransaction here");
14 HRESULT hr = S_OK;
15 UINT er = ERROR_SUCCESS;
16
17 IMSAdminBase* piMetabase = NULL;
18 LPWSTR pwzData = NULL;
19 BOOL fInitializedCom = FALSE;
20
21 // initialize
22 hr = WcaInitialize(hInstall, "StartMetabaseTransaction");
23 ExitOnFailure(hr, "failed to initialize StartMetabaseTransaction");
24
25 hr = ::CoInitialize(NULL);
26 ExitOnFailure(hr, "failed to initialize COM");
27 fInitializedCom = TRUE;
28 hr = ::CoCreateInstance(CLSID_MSAdminBase, NULL, CLSCTX_ALL, IID_IMSAdminBase, reinterpret_cast<void**>(&piMetabase));
29 if (hr == REGDB_E_CLASSNOTREG)
30 {
31 WcaLog(LOGMSG_STANDARD, "Failed to get IIMSAdminBase to backup - continuing");
32 hr = S_OK;
33 }
34 else
35 {
36 MessageExitOnFailure(hr, msierrIISCannotConnect, "failed to get IID_IIMSAdminBase object");
37
38 hr = WcaGetProperty(L"CustomActionData", &pwzData);
39 ExitOnFailure(hr, "failed to get CustomActionData");
40
41 // back up the metabase
42 Assert(lstrlenW(pwzData) < MD_BACKUP_MAX_LEN);
43
44 // MD_BACKUP_OVERWRITE = Overwrite if a backup of the same name and version exists in the backup location
45 hr = piMetabase->Backup(pwzData, MD_BACKUP_NEXT_VERSION, MD_BACKUP_OVERWRITE | MD_BACKUP_FORCE_BACKUP | MD_BACKUP_SAVE_FIRST);
46 if (MD_WARNING_SAVE_FAILED == hr)
47 {
48 WcaLog(LOGMSG_STANDARD, "Failed to save metabase before backing up - continuing");
49 hr = S_OK;
50 }
51 MessageExitOnFailure(hr, msierrIISFailedStartTransaction, "failed to begin metabase transaction: '%ls'", pwzData);
52 }
53 hr = WcaProgressMessage(COST_IIS_TRANSACTIONS, FALSE);
54LExit:
55 ReleaseStr(pwzData);
56 ReleaseObject(piMetabase);
57
58 if (fInitializedCom)
59 {
60 ::CoUninitialize();
61 }
62
63 if (FAILED(hr))
64 er = ERROR_INSTALL_FAILURE;
65 return WcaFinalize(er);
66}
67
68
69/********************************************************************
70 RollbackMetabaseTransaction - CUSTOM ACTION ENTRY POINT for unbacking up metabase
71
72 Input: deferred CustomActionData - BackupName
73********************************************************************/
74extern "C" UINT __stdcall RollbackMetabaseTransaction(MSIHANDLE hInstall)
75{
76//AssertSz(FALSE, "debug RollbackMetabaseTransaction here");
77 HRESULT hr = S_OK;
78 UINT er = ERROR_SUCCESS;
79
80 IMSAdminBase* piMetabase = NULL;
81 LPWSTR pwzData = NULL;
82 BOOL fInitializedCom = FALSE;
83
84 hr = WcaInitialize(hInstall, "RollbackMetabaseTransaction");
85 ExitOnFailure(hr, "failed to initialize");
86
87 hr = ::CoInitialize(NULL);
88 ExitOnFailure(hr, "failed to initialize COM");
89 fInitializedCom = TRUE;
90 hr = ::CoCreateInstance(CLSID_MSAdminBase, NULL, CLSCTX_ALL, IID_IMSAdminBase, reinterpret_cast<void**>(&piMetabase));
91 if (hr == REGDB_E_CLASSNOTREG)
92 {
93 WcaLog(LOGMSG_STANDARD, "Failed to get IIMSAdminBase to rollback - continuing");
94 hr = S_OK;
95 ExitFunction();
96 }
97 ExitOnFailure(hr, "failed to get IID_IIMSAdminBase object");
98
99
100 hr = WcaGetProperty( L"CustomActionData", &pwzData);
101 ExitOnFailure(hr, "failed to get CustomActionData");
102
103 hr = piMetabase->Restore(pwzData, MD_BACKUP_HIGHEST_VERSION, 0);
104 ExitOnFailure(hr, "failed to rollback metabase transaction: '%ls'", pwzData);
105
106 hr = piMetabase->DeleteBackup(pwzData, MD_BACKUP_HIGHEST_VERSION);
107 ExitOnFailure(hr, "failed to cleanup metabase transaction '%ls', continuing", pwzData);
108
109LExit:
110 ReleaseStr(pwzData);
111 ReleaseObject(piMetabase);
112
113 if (fInitializedCom)
114 {
115 ::CoUninitialize();
116 }
117
118 if (FAILED(hr))
119 {
120 er = ERROR_INSTALL_FAILURE;
121 }
122 return WcaFinalize(er);
123}
124
125
126/********************************************************************
127 CommitMetabaseTransaction - CUSTOM ACTION ENTRY POINT for unbacking up metabase
128
129 Input: deferred CustomActionData - BackupName
130 * *****************************************************************/
131extern "C" UINT __stdcall CommitMetabaseTransaction(MSIHANDLE hInstall)
132{
133 HRESULT hr = S_OK;
134 UINT er = ERROR_SUCCESS;
135
136 IMSAdminBase* piMetabase = NULL;
137 LPWSTR pwzData = NULL;
138 BOOL fInitializedCom = FALSE;
139
140 hr = WcaInitialize(hInstall, "CommitMetabaseTransaction");
141 ExitOnFailure(hr, "failed to initialize");
142
143 hr = ::CoInitialize(NULL);
144 ExitOnFailure(hr, "failed to initialize COM");
145 fInitializedCom = TRUE;
146 hr = ::CoCreateInstance(CLSID_MSAdminBase, NULL, CLSCTX_ALL, IID_IMSAdminBase, reinterpret_cast<void**>(&piMetabase));
147 if (hr == REGDB_E_CLASSNOTREG)
148 {
149 WcaLog(LOGMSG_STANDARD, "Failed to get IIMSAdminBase to commit - continuing");
150 hr = S_OK;
151 ExitFunction();
152 }
153 ExitOnFailure(hr, "failed to get IID_IIMSAdminBase object");
154
155 hr = WcaGetProperty( L"CustomActionData", &pwzData);
156 ExitOnFailure(hr, "failed to get CustomActionData");
157
158 hr = piMetabase->DeleteBackup(pwzData, MD_BACKUP_HIGHEST_VERSION);
159 ExitOnFailure(hr, "failed to cleanup metabase transaction: '%ls'", pwzData);
160
161LExit:
162 ReleaseStr(pwzData);
163 ReleaseObject(piMetabase);
164
165 if (fInitializedCom)
166 {
167 ::CoUninitialize();
168 }
169
170 if (FAILED(hr))
171 {
172 er = ERROR_INSTALL_FAILURE;
173 }
174 return WcaFinalize(er);
175}
176
177
178/********************************************************************
179 CreateMetabaseKey - Installs metabase keys
180
181 Input: deferred CustomActionData - Key
182 * *****************************************************************/
183static HRESULT CreateMetabaseKey(__in LPWSTR* ppwzCustomActionData, __in IMSAdminBase* piMetabase)
184{
185//AssertSz(FALSE, "debug CreateMetabaseKey here");
186 HRESULT hr = S_OK;
187 METADATA_HANDLE mhRoot = 0;
188 LPWSTR pwzData = NULL;
189 LPCWSTR pwzKey;
190
191 int i;
192
193 hr = WcaReadStringFromCaData(ppwzCustomActionData, &pwzData);
194 ExitOnFailure(hr, "failed to read key from custom action data");
195
196 hr = piMetabase->OpenKey(METADATA_MASTER_ROOT_HANDLE, L"/LM", METADATA_PERMISSION_WRITE, 10, &mhRoot);
197 for (i = 30; i > 0 && HRESULT_FROM_WIN32(ERROR_PATH_BUSY) == hr; i--)
198 {
199 ::Sleep(1000);
200 WcaLog(LOGMSG_STANDARD, "failed to open root key, retrying %d time(s)...", i);
201 hr = piMetabase->OpenKey(METADATA_MASTER_ROOT_HANDLE, L"/LM", METADATA_PERMISSION_WRITE, 10, &mhRoot);
202 }
203 MessageExitOnFailure(hr, msierrIISFailedOpenKey, "failed to open metabase key: %ls", L"/LM");
204
205 pwzKey = pwzData + 3;
206
207 WcaLog(LOGMSG_VERBOSE, "Creating Metabase Key: %ls", pwzKey);
208
209 hr = piMetabase->AddKey(mhRoot, pwzKey);
210 if (HRESULT_FROM_WIN32(ERROR_ALREADY_EXISTS) == hr)
211 {
212 WcaLog(LOGMSG_VERBOSE, "Key `%ls` already existed, continuing.", pwzData);
213 hr = S_OK;
214 }
215 MessageExitOnFailure(hr, msierrIISFailedCreateKey, "failed to create metabase key: %ls", pwzKey);
216
217 hr = WcaProgressMessage(COST_IIS_CREATEKEY, FALSE);
218
219LExit:
220 if (mhRoot)
221 {
222 piMetabase->CloseKey(mhRoot);
223 }
224
225 return hr;
226}
227
228
229/********************************************************************
230 WriteMetabaseValue -Installs metabase values
231
232 Input: deferred CustomActionData - Key\tIdentifier\tAttributes\tUserType\tDataType\tData
233 * *****************************************************************/
234static HRESULT WriteMetabaseValue(__in LPWSTR* ppwzCustomActionData, __in IMSAdminBase* piMetabase)
235{
236 //AssertSz(FALSE, "debug WriteMetabaseValue here");
237 HRESULT hr = S_OK;
238
239 METADATA_HANDLE mhKey = 0;
240
241 LPWSTR pwzKey = NULL;
242 LPWSTR pwzTemp = NULL;
243 DWORD dwData = 0;
244 DWORD dwTemp = 0;
245 BOOL fFreeData = FALSE;
246 METADATA_RECORD mr;
247 ::ZeroMemory((LPVOID)&mr, sizeof(mr));
248 METADATA_RECORD mrGet;
249 ::ZeroMemory((LPVOID)&mrGet, sizeof(mrGet));
250
251 int i;
252
253 // get the key first
254 hr = WcaReadStringFromCaData(ppwzCustomActionData, &pwzKey);
255 ExitOnFailure(hr, "failed to read key");
256 hr = WcaReadIntegerFromCaData(ppwzCustomActionData, reinterpret_cast<int *>(&mr.dwMDIdentifier));
257 ExitOnFailure(hr, "failed to read identifier");
258 hr = WcaReadIntegerFromCaData(ppwzCustomActionData, reinterpret_cast<int *>(&mr.dwMDAttributes));
259 ExitOnFailure(hr, "failed to read attributes");
260 hr = WcaReadIntegerFromCaData(ppwzCustomActionData, reinterpret_cast<int *>(&mr.dwMDUserType));
261 ExitOnFailure(hr, "failed to read user type");
262 hr = WcaReadIntegerFromCaData(ppwzCustomActionData, reinterpret_cast<int *>(&mr.dwMDDataType));
263 ExitOnFailure(hr, "failed to read data type");
264
265 switch (mr.dwMDDataType) // data
266 {
267 case DWORD_METADATA:
268 hr = WcaReadIntegerFromCaData(ppwzCustomActionData, reinterpret_cast<int *>(&dwData));
269 mr.dwMDDataLen = sizeof(dwData);
270 mr.pbMDData = reinterpret_cast<BYTE*>(&dwData);
271 break;
272 case STRING_METADATA:
273 hr = WcaReadStringFromCaData(ppwzCustomActionData, &pwzTemp);
274 mr.dwMDDataLen = (lstrlenW(pwzTemp) + 1) * sizeof(WCHAR);
275 mr.pbMDData = reinterpret_cast<BYTE*>(pwzTemp);
276 break;
277 case MULTISZ_METADATA:
278 {
279 hr = WcaReadStringFromCaData(ppwzCustomActionData, &pwzTemp);
280 mr.dwMDDataLen = (lstrlenW(pwzTemp) + 1) * sizeof(WCHAR);
281 for (LPWSTR pwzT = pwzTemp; *pwzT; ++pwzT)
282 {
283 if (MAGIC_MULTISZ_CHAR == *pwzT)
284 {
285 *pwzT = L'\0';
286 }
287 }
288 mr.pbMDData = reinterpret_cast<BYTE*>(pwzTemp);
289 }
290 break;
291 case BINARY_METADATA:
292 hr = WcaReadStreamFromCaData(ppwzCustomActionData, &mr.pbMDData, reinterpret_cast<DWORD_PTR *>(&mr.dwMDDataLen));
293 fFreeData = TRUE;
294 break;
295 default:
296 hr = E_UNEXPECTED;
297 break;
298 }
299 ExitOnFailure(hr, "failed to parse CustomActionData into metabase record");
300
301 WcaLog(LOGMSG_VERBOSE, "Writing Metabase Value Under Key: %ls ID: %d", pwzKey, mr.dwMDIdentifier);
302
303 hr = piMetabase->OpenKey(METADATA_MASTER_ROOT_HANDLE, L"/LM", METADATA_PERMISSION_WRITE, 10, &mhKey);
304 for (i = 30; i > 0 && HRESULT_FROM_WIN32(ERROR_PATH_BUSY) == hr; i--)
305 {
306 ::Sleep(1000);
307 WcaLog(LOGMSG_STANDARD, "failed to open '%ls' key, retrying %d time(s)...", pwzKey, i);
308 hr = piMetabase->OpenKey(METADATA_MASTER_ROOT_HANDLE, L"/LM", METADATA_PERMISSION_WRITE, 10, &mhKey);
309 }
310 MessageExitOnFailure(hr, msierrIISFailedOpenKey, "failed to open metabase key: %ls", pwzKey);
311
312 if (lstrlenW(pwzKey) < 3)
313 {
314 ExitOnFailure(hr = E_INVALIDARG, "Key didn't begin with \"/LM\" as expected - key value: %ls", pwzKey);
315 }
316
317 hr = piMetabase->SetData(mhKey, pwzKey + 3, &mr); // pwzKey + 3 to skip "/LM" that was used to open the key.
318
319 // This means we're trying to write to a secure key without the secure flag set - let's try again with the secure flag set
320 if (MD_ERROR_CANNOT_REMOVE_SECURE_ATTRIBUTE == hr)
321 {
322 mr.dwMDAttributes |= METADATA_SECURE;
323 hr = piMetabase->SetData(mhKey, pwzKey + 3, &mr);
324 }
325
326 // If IIS6 returned failure, let's check if the correct value exists in the metabase before actually failing the CA
327 if (FAILED(hr))
328 {
329 // Backup the original failure error, so we can log it below if necessary
330 HRESULT hrOldValue = hr;
331
332 mrGet.dwMDIdentifier = mr.dwMDIdentifier;
333 mrGet.dwMDAttributes = METADATA_NO_ATTRIBUTES;
334 mrGet.dwMDUserType = mr.dwMDUserType;
335 mrGet.dwMDDataType = mr.dwMDDataType;
336 mrGet.dwMDDataLen = mr.dwMDDataLen;
337 mrGet.pbMDData = static_cast<BYTE*>(MemAlloc(mr.dwMDDataLen, TRUE));
338
339 hr = piMetabase->GetData(mhKey, pwzKey + 3, &mrGet, &dwTemp);
340 if (SUCCEEDED(hr))
341 {
342 if (mrGet.dwMDDataType == mr.dwMDDataType && mrGet.dwMDDataLen == mr.dwMDDataLen && 0 == memcmp(mrGet.pbMDData, mr.pbMDData, mr.dwMDDataLen))
343 {
344 WcaLog(LOGMSG_VERBOSE, "Received error while writing metabase value under key: %ls ID: %d with error 0x%x, but the correct value is in the metabase - continuing", pwzKey, mr.dwMDIdentifier, hrOldValue);
345 hr = S_OK;
346 }
347 else
348 {
349 WcaLog(LOGMSG_VERBOSE, "Succeeded in checking metabase value after write value, but the values didn't match");
350 hr = hrOldValue;
351 }
352 }
353 else
354 {
355 WcaLog(LOGMSG_VERBOSE, "Failed to check value after metabase write failure (error code 0x%x)", hr);
356 hr = hrOldValue;
357 }
358 }
359 MessageExitOnFailure(hr, msierrIISFailedWriteData, "failed to write data to metabase key: %ls", pwzKey);
360
361 hr = WcaProgressMessage(COST_IIS_WRITEVALUE, FALSE);
362
363LExit:
364 ReleaseStr(pwzTemp);
365 ReleaseStr(pwzKey);
366
367 if (mhKey)
368 {
369 piMetabase->CloseKey(mhKey);
370 }
371
372 if (fFreeData && mr.pbMDData)
373 {
374 MemFree(mr.pbMDData);
375 }
376
377 return hr;
378}
379
380
381/********************************************************************
382 DeleteMetabaseValue -Installs metabase values
383
384 Input: deferred CustomActionData - Key\tIdentifier\tAttributes\tUserType\tDataType\tData
385 * *****************************************************************/
386static HRESULT DeleteMetabaseValue(__in LPWSTR* ppwzCustomActionData, __in IMSAdminBase* piMetabase)
387{
388 //AssertSz(FALSE, "debug DeleteMetabaseValue here");
389 HRESULT hr = S_OK;
390
391 METADATA_HANDLE mhKey = 0;
392
393 LPWSTR pwzKey = NULL;
394 DWORD dwIdentifier = 0;
395 DWORD dwDataType = 0;
396
397 int i;
398
399 // get the key first
400 hr = WcaReadStringFromCaData(ppwzCustomActionData, &pwzKey);
401 ExitOnFailure(hr, "failed to read key");
402 hr = WcaReadIntegerFromCaData(ppwzCustomActionData, reinterpret_cast<int *>(&dwIdentifier));
403 ExitOnFailure(hr, "failed to read identifier");
404 hr = WcaReadIntegerFromCaData(ppwzCustomActionData, reinterpret_cast<int *>(&dwDataType));
405 ExitOnFailure(hr, "failed to read data type");
406
407 WcaLog(LOGMSG_VERBOSE, "Deleting Metabase Value Under Key: %ls ID: %d", pwzKey, dwIdentifier);
408
409 hr = piMetabase->OpenKey(METADATA_MASTER_ROOT_HANDLE, L"/LM", METADATA_PERMISSION_WRITE, 10, &mhKey);
410 for (i = 30; i > 0 && HRESULT_FROM_WIN32(ERROR_PATH_BUSY) == hr; i--)
411 {
412 ::Sleep(1000);
413 WcaLog(LOGMSG_STANDARD, "failed to open '%ls' key, retrying %d time(s)...", pwzKey, i);
414 hr = piMetabase->OpenKey(METADATA_MASTER_ROOT_HANDLE, L"/LM", METADATA_PERMISSION_WRITE, 10, &mhKey);
415 }
416 MessageExitOnFailure(hr, msierrIISFailedOpenKey, "failed to open metabase key: %ls", pwzKey);
417
418 if (lstrlenW(pwzKey) < 3)
419 {
420 ExitOnFailure(hr = E_INVALIDARG, "Key didn't begin with \"/LM\" as expected - key value: %ls", pwzKey);
421 }
422
423 hr = piMetabase->DeleteData(mhKey, pwzKey + 3, dwIdentifier, dwDataType); // pwzKey + 3 to skip "/LM" that was used to open the key.
424 if (MD_ERROR_DATA_NOT_FOUND == hr || HRESULT_FROM_WIN32(ERROR_PATH_NOT_FOUND) == hr)
425 {
426 hr = S_OK;
427 }
428 MessageExitOnFailure(hr, msierrIISFailedDeleteValue, "failed to delete value %d from metabase key: %ls", dwIdentifier, pwzKey);
429
430 hr = WcaProgressMessage(COST_IIS_DELETEVALUE, FALSE);
431LExit:
432 ReleaseStr(pwzKey);
433
434 if (mhKey)
435 piMetabase->CloseKey(mhKey);
436
437 return hr;
438}
439
440
441/********************************************************************
442 DeleteAspApp - Deletes applications in IIS
443
444 Input: deferred CustomActionData - MetabaseRoot\tRecursive
445 * *****************************************************************/
446static HRESULT DeleteAspApp(__in LPWSTR* ppwzCustomActionData, __in IMSAdminBase* piMetabase, __in ICatalogCollection* pApplicationCollection, __in IWamAdmin* piWam)
447{
448 const int BUFFER_BYTES = 512;
449 const BSTR bstrPropName = SysAllocString(L"Deleteable");
450
451 HRESULT hr = S_OK;
452 ICatalogObject* pApplication = NULL;
453
454 LPWSTR pwzRoot = NULL;
455 DWORD dwActualBufferSize = 0;
456 long lSize = 0;
457 long lIndex = 0;
458 long lChanges = 0;
459
460 VARIANT keyValue;
461 ::VariantInit(&keyValue);
462 VARIANT propValue;
463 propValue.vt = VT_BOOL;
464 propValue.boolVal = TRUE;
465
466 METADATA_RECORD mr;
467 // Get current set of web service extensions.
468 ::ZeroMemory(&mr, sizeof(mr));
469 mr.dwMDIdentifier = MD_APP_PACKAGE_ID;
470 mr.dwMDAttributes = 0;
471 mr.dwMDUserType = ASP_MD_UT_APP;
472 mr.dwMDDataType = STRING_METADATA;
473 mr.pbMDData = new unsigned char[BUFFER_BYTES];
474 mr.dwMDDataLen = BUFFER_BYTES;
475
476 hr = WcaReadStringFromCaData(ppwzCustomActionData, &pwzRoot); // MetabaseRoot
477 ExitOnFailure(hr, "failed to get metabase root");
478
479 hr = piMetabase->GetData(METADATA_MASTER_ROOT_HANDLE, pwzRoot, &mr, &dwActualBufferSize);
480 if (HRESULT_FROM_WIN32(MD_ERROR_DATA_NOT_FOUND) == hr || HRESULT_FROM_WIN32(ERROR_PATH_NOT_FOUND) == hr || HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND) == hr)
481 {
482 // This one doesn't have an independent app GUID associated with it - it may have been already partially deleted, or a low isolation app
483 WcaLog(LOGMSG_VERBOSE, "No independent COM+ application found associated with %ls. It either doesn't exist, or was already removed - continuing", pwzRoot);
484 ExitFunction1(hr = S_OK);
485 }
486 MessageExitOnFailure(hr, msierrIISFailedDeleteApp, "failed to get GUID for application at path: %ls", pwzRoot);
487
488 WcaLog(LOGMSG_VERBOSE, "Deleting ASP App (used query: %ls) with GUID: %ls", pwzRoot, (LPWSTR)(mr.pbMDData));
489
490 // Delete the application association from IIS's point of view before it's obliterated from the application collection
491 hr = piWam->AppDelete(pwzRoot, FALSE);
492 if (FAILED(hr))
493 {
494 // This isn't necessarily an error if we fail here, but let's log a failure if it happens
495 WcaLog(LOGMSG_VERBOSE, "error 0x%x: failed to call IWamAdmin::AppDelete() while removing web application - continuing");
496 hr = S_OK;
497 }
498
499 if (!pApplicationCollection)
500 {
501 WcaLog(LOGMSG_STANDARD, "Could not remove application with GUID %ls because the application collection could not be found", (LPWSTR)(mr.pbMDData));
502 ExitFunction1(hr = S_OK);
503 }
504
505 hr = pApplicationCollection->Populate();
506 MessageExitOnFailure(hr, msierrIISFailedDeleteApp, "failed to populate Application collection");
507
508 hr = pApplicationCollection->get_Count(&lSize);
509 MessageExitOnFailure(hr, msierrIISFailedDeleteApp, "failed to get size of Application collection");
510 WcaLog(LOGMSG_TRACEONLY, "Found %u items in application collection", lSize);
511
512 // No need to check this too early, as we may not even need this to have successfully allocated
513 ExitOnNull(bstrPropName, hr, E_OUTOFMEMORY, "failed to allocate memory for \"Deleteable\" string");
514
515 for (lIndex = 0; lIndex < lSize; ++lIndex)
516 {
517 hr = pApplicationCollection->get_Item(lIndex, reinterpret_cast<IDispatch**>(&pApplication));
518 MessageExitOnFailure(hr, msierrIISFailedDeleteApp, "failed to get COM+ application while enumerating through COM+ applications");
519
520 hr = pApplication->get_Key(&keyValue);
521 MessageExitOnFailure(hr, msierrIISFailedDeleteApp, "failed to get key of COM+ application while enumerating through COM+ applications");
522
523 WcaLog(LOGMSG_TRACEONLY, "While enumerating through COM+ applications, found an application with GUID: %ls", (LPWSTR)keyValue.bstrVal);
524
525 if (VT_BSTR == keyValue.vt && 0 == lstrcmpW((LPWSTR)keyValue.bstrVal, (LPWSTR)(mr.pbMDData)))
526 {
527 hr = pApplication->put_Value(bstrPropName, propValue);
528 if (FAILED(hr))
529 {
530 // This isn't necessarily a critical error unless we fail to actually delete it in the next step
531 WcaLog(LOGMSG_VERBOSE, "error 0x%x: failed to ensure COM+ application with guid %ls is deletable - continuing", hr, (LPWSTR)(mr.pbMDData));
532 }
533
534 hr = pApplicationCollection->SaveChanges(&lChanges);
535 if (FAILED(hr))
536 {
537 // This isn't necessarily a critical error unless we fail to actually delete it in the next step
538 WcaLog(LOGMSG_VERBOSE, "error 0x%x: failed to save changes while ensuring COM+ application with guid %ls is deletable - continuing", hr, (LPWSTR)(mr.pbMDData));
539 }
540
541 hr = pApplicationCollection->Remove(lIndex);
542 if (FAILED(hr))
543 {
544 WcaLog(LOGMSG_STANDARD, "error 0x%x: failed to remove COM+ application with guid %ls. The COM application will not be removed", hr, (LPWSTR)(mr.pbMDData));
545 }
546 else
547 {
548 hr = pApplicationCollection->SaveChanges(&lChanges);
549 if (FAILED(hr))
550 {
551 WcaLog(LOGMSG_STANDARD, "error 0x%x: failed to save changes when removing COM+ application with guid %ls. The COM application will not be removed - continuing", hr, (LPWSTR)(mr.pbMDData));
552 }
553 else
554 {
555 WcaLog(LOGMSG_VERBOSE, "Found and removed application with GUID %ls", (LPWSTR)(mr.pbMDData));
556 }
557 }
558
559 // We've found the right key and successfully deleted the app - let's exit the loop now
560 lIndex = lSize;
561 }
562 }
563 // If we didn't find it, it isn't an error, because the application we want to delete doesn't seem to exist!
564
565 hr = WcaProgressMessage(COST_IIS_DELETEAPP, FALSE);
566LExit:
567 ReleaseBSTR(bstrPropName);
568
569 ReleaseStr(pwzRoot);
570 // Don't release pApplication, because it points to an object within the collection
571
572 delete [] mr.pbMDData;
573
574 return hr;
575}
576
577
578/********************************************************************
579 CreateAspApp - Creates applications in IIS
580
581 Input: deferred CustomActionData - MetabaseRoot\tInProc
582 * ****************************************************************/
583static HRESULT CreateAspApp(__in LPWSTR* ppwzCustomActionData, __in IWamAdmin* piWam)
584{
585 HRESULT hr = S_OK;
586
587 LPWSTR pwzRoot = NULL;
588 BOOL fInProc;
589
590 hr = WcaReadStringFromCaData(ppwzCustomActionData, &pwzRoot); // MetabaseRoot
591 ExitOnFailure(hr, "failed to get metabase root");
592 hr = WcaReadIntegerFromCaData(ppwzCustomActionData, reinterpret_cast<int *>(&fInProc)); // InProc
593 ExitOnFailure(hr, "failed to get in proc flag");
594
595 WcaLog(LOGMSG_VERBOSE, "Creating ASP App: %ls", pwzRoot);
596
597 hr = piWam->AppCreate(pwzRoot, fInProc);
598 MessageExitOnFailure(hr, msierrIISFailedCreateApp, "failed to create web application: %ls", pwzRoot);
599
600 hr = WcaProgressMessage(COST_IIS_CREATEAPP, FALSE);
601LExit:
602 return hr;
603}
604
605
606/********************************************************************
607 DeleteMetabaseKey - Deletes metabase keys
608
609 Input: deferred CustomActionData - Key
610 ******************************************************************/
611static HRESULT DeleteMetabaseKey(__in LPWSTR *ppwzCustomActionData, __in IMSAdminBase* piMetabase)
612{
613 HRESULT hr = S_OK;
614
615 METADATA_HANDLE mhRoot = 0;
616
617 LPWSTR pwzData = NULL;
618
619 LPCWSTR pwzKey;
620 int i;
621
622 hr = WcaReadStringFromCaData(ppwzCustomActionData, &pwzData);
623 ExitOnFailure(hr, "failed to read key to be deleted");
624
625 hr = piMetabase->OpenKey(METADATA_MASTER_ROOT_HANDLE, L"/LM", METADATA_PERMISSION_WRITE, 10, &mhRoot);
626 for (i = 30; i > 0 && HRESULT_FROM_WIN32(ERROR_PATH_BUSY) == hr; i--)
627 {
628 ::Sleep(1000);
629 WcaLog(LOGMSG_STANDARD, "failed to open root key, retrying %d time(s)...", i);
630 hr = piMetabase->OpenKey(METADATA_MASTER_ROOT_HANDLE, L"/LM", METADATA_PERMISSION_WRITE, 10, &mhRoot);
631 }
632 MessageExitOnFailure(hr, msierrIISFailedOpenKey, "failed to open metabase key: %ls", L"/LM");
633
634 pwzKey = pwzData + 3;
635
636 WcaLog(LOGMSG_VERBOSE, "Deleting Metabase Key: %ls", pwzKey);
637
638 hr = piMetabase->DeleteKey(mhRoot, pwzKey);
639 if (HRESULT_FROM_WIN32(ERROR_PATH_NOT_FOUND) == hr)
640 {
641 WcaLog(LOGMSG_STANDARD, "Key `%ls` did not exist, continuing.", pwzData);
642 hr = S_OK;
643 }
644 MessageExitOnFailure(hr, msierrIISFailedDeleteKey, "failed to delete metabase key: %ls", pwzData);
645
646 hr = WcaProgressMessage(COST_IIS_DELETEKEY, FALSE);
647LExit:
648 if (mhRoot)
649 {
650 piMetabase->CloseKey(mhRoot);
651 }
652
653 return hr;
654}
655
656
657/********************************************************************
658 WriteMetabaseChanges - CUSTOM ACTION ENTRY POINT for IIS Metabase changes
659
660 *******************************************************************/
661extern "C" UINT __stdcall WriteMetabaseChanges(MSIHANDLE hInstall)
662{
663//AssertSz(FALSE, "debug WriteMetabaseChanges here");
664 HRESULT hr = S_OK;
665 UINT er = ERROR_SUCCESS;
666 IMSAdminBase* piMetabase = NULL;
667 IWamAdmin* piWam = NULL;
668 ICOMAdminCatalog* pCatalog = NULL;
669 ICatalogCollection* pApplicationCollection = NULL;
670 WCA_CASCRIPT_HANDLE hWriteMetabaseScript = NULL;
671 BSTR bstrApplications = SysAllocString(L"Applications");
672 BOOL fInitializedCom = FALSE;
673
674 LPWSTR pwzData = NULL;
675 LPWSTR pwz = NULL;
676 LPWSTR pwzScriptKey = NULL;
677 METABASE_ACTION maAction = MBA_UNKNOWNACTION;
678
679 hr = WcaInitialize(hInstall, "WriteMetabaseChanges");
680 ExitOnFailure(hr, "failed to initialize");
681
682 hr = ::CoInitialize(NULL);
683 ExitOnFailure(hr, "failed to initialize COM");
684 fInitializedCom = TRUE;
685
686 hr = WcaGetProperty( L"CustomActionData", &pwzData);
687 ExitOnFailure(hr, "failed to get CustomActionData");
688
689 WcaLog(LOGMSG_TRACEONLY, "CustomActionData: %ls", pwzData);
690
691 // Get the CaScript key
692 hr = WcaReadStringFromCaData(&pwzData, &pwzScriptKey);
693 ExitOnFailure(hr, "Failed to get CaScript key from custom action data");
694
695 hr = WcaCaScriptOpen(WCA_ACTION_INSTALL, WCA_CASCRIPT_SCHEDULED, FALSE, pwzScriptKey, &hWriteMetabaseScript);
696 ExitOnFailure(hr, "Failed to open CaScript file");
697
698 // The rest of our existing custom action data string should be empty - go ahead and overwrite it
699 ReleaseNullStr(pwzData);
700 hr = WcaCaScriptReadAsCustomActionData(hWriteMetabaseScript, &pwzData);
701 ExitOnFailure(hr, "Failed to read script into CustomAction data.");
702
703 pwz = pwzData;
704
705 while (S_OK == (hr = WcaReadIntegerFromCaData(&pwz, (int *)&maAction)))
706 {
707 switch (maAction)
708 {
709 case MBA_CREATEAPP:
710 if (NULL == piWam)
711 {
712 hr = ::CoCreateInstance(CLSID_WamAdmin, NULL, CLSCTX_ALL, IID_IWamAdmin, reinterpret_cast<void**>(&piWam));
713 MessageExitOnFailure(hr, msierrIISCannotConnect, "failed to get IID_IWamAdmin object");
714 }
715
716 hr = CreateAspApp(&pwz, piWam);
717 ExitOnFailure(hr, "failed to create ASP App");
718 break;
719 case MBA_DELETEAPP:
720 if (NULL == piMetabase)
721 {
722 hr = ::CoCreateInstance(CLSID_MSAdminBase, NULL, CLSCTX_ALL, IID_IMSAdminBase, reinterpret_cast<void**>(&piMetabase));
723 MessageExitOnFailure(hr, msierrIISCannotConnect, "failed to get IID_IIMSAdminBase object");
724 }
725
726 if (NULL == pCatalog)
727 {
728 hr = CoCreateInstance(CLSID_COMAdminCatalog, NULL, CLSCTX_INPROC_SERVER, IID_IUnknown, (void**)&pCatalog);
729 MessageExitOnFailure(hr, msierrIISCannotConnect, "failed to get IID_ICOMAdmin object");
730
731 hr = pCatalog->GetCollection(bstrApplications, reinterpret_cast<IDispatch**>(&pApplicationCollection));
732 if (FAILED(hr))
733 {
734 hr = S_OK;
735 WcaLog(LOGMSG_STANDARD, "error 0x%x: failed to get ApplicationCollection object for list of COM+ applications - COM+ applications will not be able to be uninstalled - continuing", hr);
736 }
737 }
738
739 if (NULL == piWam)
740 {
741 hr = ::CoCreateInstance(CLSID_WamAdmin, NULL, CLSCTX_ALL, IID_IWamAdmin, reinterpret_cast<void**>(&piWam));
742 MessageExitOnFailure(hr, msierrIISCannotConnect, "failed to get IID_IWamAdmin object");
743 }
744
745 hr = DeleteAspApp(&pwz, piMetabase, pApplicationCollection, piWam);
746 ExitOnFailure(hr, "failed to delete ASP App");
747 break;
748 case MBA_CREATEKEY:
749 if (NULL == piMetabase)
750 {
751 hr = ::CoCreateInstance(CLSID_MSAdminBase, NULL, CLSCTX_ALL, IID_IMSAdminBase, reinterpret_cast<void**>(&piMetabase));
752 MessageExitOnFailure(hr, msierrIISCannotConnect, "failed to get IID_IIMSAdminBase object");
753 }
754
755 hr = CreateMetabaseKey(&pwz, piMetabase);
756 ExitOnFailure(hr, "failed to create metabase key");
757 break;
758 case MBA_DELETEKEY:
759 if (NULL == piMetabase)
760 {
761 hr = ::CoCreateInstance(CLSID_MSAdminBase, NULL, CLSCTX_ALL, IID_IMSAdminBase, reinterpret_cast<void**>(&piMetabase));
762 MessageExitOnFailure(hr, msierrIISCannotConnect, "failed to get IID_IIMSAdminBase object");
763 }
764
765 hr = DeleteMetabaseKey(&pwz, piMetabase);
766 ExitOnFailure(hr, "failed to delete metabase key");
767 break;
768 case MBA_WRITEVALUE:
769 if (NULL == piMetabase)
770 {
771 hr = ::CoCreateInstance(CLSID_MSAdminBase, NULL, CLSCTX_ALL, IID_IMSAdminBase, reinterpret_cast<void**>(&piMetabase));
772 MessageExitOnFailure(hr, msierrIISCannotConnect, "failed to get IID_IIMSAdminBase object");
773 }
774
775 hr = WriteMetabaseValue(&pwz, piMetabase);
776 ExitOnFailure(hr, "failed to write metabase value");
777 break;
778 case MBA_DELETEVALUE:
779 if (NULL == piMetabase)
780 {
781 hr = ::CoCreateInstance(CLSID_MSAdminBase, NULL, CLSCTX_ALL, IID_IMSAdminBase, reinterpret_cast<void**>(&piMetabase));
782 MessageExitOnFailure(hr, msierrIISCannotConnect, "failed to get IID_IIMSAdminBase object");
783 }
784
785 hr = DeleteMetabaseValue(&pwz, piMetabase);
786 ExitOnFailure(hr, "failed to delete metabase value");
787 break;
788 default:
789 ExitOnFailure(hr = E_UNEXPECTED, "Unexpected metabase action specified: %d", maAction);
790 break;
791 }
792 }
793 if (E_NOMOREITEMS == hr) // If there are no more items, all is well
794 {
795 if (NULL != piMetabase)
796 {
797 hr = piMetabase->SaveData();
798 for (int i = 30; i > 0 && HRESULT_FROM_WIN32(ERROR_PATH_BUSY) == hr; i--)
799 {
800 ::Sleep(1000);
801 WcaLog(LOGMSG_VERBOSE, "Failed to force save of metabase data, retrying %d time(s)...", i);
802 hr = piMetabase->SaveData();
803 }
804 if (FAILED(hr))
805 {
806 WcaLog(LOGMSG_VERBOSE, "Failed to force save of metabase data: 0x%x - continuing", hr);
807 }
808 hr = S_OK;
809 }
810 else
811 {
812 hr = S_OK;
813 }
814 }
815
816LExit:
817 WcaCaScriptClose(hWriteMetabaseScript, WCA_CASCRIPT_CLOSE_DELETE);
818
819 ReleaseBSTR(bstrApplications);
820 ReleaseStr(pwzScriptKey);
821 ReleaseStr(pwzData);
822 ReleaseObject(piMetabase);
823 ReleaseObject(piWam);
824 ReleaseObject(pCatalog);
825 ReleaseObject(pApplicationCollection);
826
827 if (fInitializedCom)
828 {
829 ::CoUninitialize();
830 }
831
832 if (FAILED(hr))
833 {
834 er = ERROR_INSTALL_FAILURE;
835 }
836 return WcaFinalize(er);
837}
838/********************************************************************
839 WriteIIS7ConfigChanges - CUSTOM ACTION ENTRY POINT for IIS7 config changes
840
841 *******************************************************************/
842extern "C" UINT __stdcall WriteIIS7ConfigChanges(MSIHANDLE hInstall)
843{
844 //AssertSz(FALSE, "debug WriteIIS7ConfigChanges here");
845 HRESULT hr = S_OK;
846 UINT er = ERROR_SUCCESS;
847 LPWSTR pwzData = NULL;
848 LPWSTR pwzScriptKey = NULL;
849 LPWSTR pwzHashString = NULL;
850 BYTE rgbActualHash[SHA1_HASH_LEN] = { };
851 DWORD dwHashedBytes = SHA1_HASH_LEN;
852
853 WCA_CASCRIPT_HANDLE hWriteIis7Script = NULL;
854
855 hr = WcaInitialize(hInstall, "WriteIIS7ConfigChanges");
856 ExitOnFailure(hr, "Failed to initialize");
857
858 hr = WcaGetProperty( L"CustomActionData", &pwzScriptKey);
859 ExitOnFailure(hr, "Failed to get CustomActionData");
860 WcaLog(LOGMSG_TRACEONLY, "Script WriteIIS7ConfigChanges: %ls", pwzScriptKey);
861
862 hr = WcaCaScriptOpen(WCA_ACTION_INSTALL, WCA_CASCRIPT_SCHEDULED, FALSE, pwzScriptKey, &hWriteIis7Script);
863 ExitOnFailure(hr, "Failed to open CaScript file");
864
865 hr = WcaCaScriptReadAsCustomActionData(hWriteIis7Script, &pwzData);
866 ExitOnFailure(hr, "Failed to read script into CustomAction data.");
867
868 hr = CrypHashBuffer((BYTE*)pwzData, sizeof(pwzData) * sizeof(WCHAR), PROV_RSA_AES, CALG_SHA1, rgbActualHash, dwHashedBytes);
869 ExitOnFailure(hr, "Failed to calculate hash of CustomAction data.");
870
871 hr = StrAlloc(&pwzHashString, ((dwHashedBytes * 2) + 1));
872 ExitOnFailure(hr, "Failed to allocate string for script hash");
873
874 hr = StrHexEncode(rgbActualHash, dwHashedBytes, pwzHashString, ((dwHashedBytes * 2) + 1));
875 ExitOnFailure(hr, "Failed to convert hash bytes to string.");
876
877 WcaLog(LOGMSG_TRACEONLY, "CustomActionData WriteIIS7ConfigChanges: %ls", pwzData);
878 WcaLog(LOGMSG_VERBOSE, "Custom action data hash: %ls", pwzHashString);
879 WcaLog(LOGMSG_VERBOSE, "CustomActionData WriteIIS7ConfigChanges length: %d", wcslen(pwzData));
880
881 hr = IIS7ConfigChanges(hInstall, pwzData);
882 ExitOnFailure(hr, "WriteIIS7ConfigChanges Failed.");
883
884LExit:
885 WcaCaScriptClose(hWriteIis7Script, WCA_CASCRIPT_CLOSE_DELETE);
886 ReleaseStr(pwzScriptKey);
887 ReleaseStr(pwzData);
888 ReleaseStr(pwzHashString);
889
890 if (FAILED(hr))
891 {
892 er = ERROR_INSTALL_FAILURE;
893 }
894
895 return WcaFinalize(er);
896}
897
898
899/********************************************************************
900 CommitIIS7ConfigTransaction - CUSTOM ACTION ENTRY POINT for unbacking up config
901
902 Input: deferred CustomActionData - BackupName
903 * *****************************************************************/
904extern "C" UINT __stdcall CommitIIS7ConfigTransaction(MSIHANDLE hInstall)
905{
906 HRESULT hr = S_OK;
907 UINT er = ERROR_SUCCESS;
908 LPWSTR pwzData = NULL;
909 WCHAR wzConfigCopy[MAX_PATH];
910 DWORD dwSize = 0;
911
912 BOOL fIsWow64Process = FALSE;
913 BOOL fIsFSRedirectDisabled = FALSE;
914
915 hr = WcaInitialize(hInstall, "CommitIIS7ConfigTransaction");
916 ExitOnFailure(hr, "failed to initialize IIS7 commit transaction");
917
918 WcaInitializeWow64();
919 fIsWow64Process = WcaIsWow64Process();
920 if (fIsWow64Process)
921 {
922 hr = WcaDisableWow64FSRedirection();
923 if(FAILED(hr))
924 {
925 //eat this error
926 hr = S_OK;
927 }
928 else
929 {
930 fIsFSRedirectDisabled = TRUE;
931 }
932 }
933
934 hr = WcaGetProperty( L"CustomActionData", &pwzData);
935 ExitOnFailure(hr, "failed to get CustomActionData");
936
937 // Config AdminMgr changes already committed, just
938 // delete backup config file.
939
940 dwSize = ExpandEnvironmentStringsW(L"%windir%\\system32\\inetsrv\\config\\applicationHost.config",
941 wzConfigCopy,
942 MAX_PATH
943 );
944 if ( dwSize == 0 )
945 {
946 ExitWithLastError(hr, "failed to get ExpandEnvironmentStrings");
947 }
948
949 hr = ::StringCchCatW(wzConfigCopy, MAX_PATH, L".");
950 ExitOnFailure(hr, "Commit IIS7 failed StringCchCatW of .");
951
952 hr = ::StringCchCatW(wzConfigCopy, MAX_PATH, pwzData);
953 ExitOnFailure(hr, "Commit IIS7 failed StringCchCatW of extension");
954
955 if (!::DeleteFileW(wzConfigCopy))
956 {
957 hr = HRESULT_FROM_WIN32(GetLastError());
958 if (HRESULT_FROM_WIN32(ERROR_PATH_NOT_FOUND) == hr ||
959 HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND) == hr)
960 {
961 WcaLog(LOGMSG_STANDARD, "Failed to delete backup applicationHost, not found - continuing");
962 hr = S_OK;
963 }
964 else
965 {
966 ExitOnFailure(hr, "failed to delete config backup");
967 }
968 }
969
970LExit:
971 ReleaseStr(pwzData);
972
973 // Make sure we revert FS Redirection if necessary before exiting
974 if (fIsFSRedirectDisabled)
975 {
976 fIsFSRedirectDisabled = FALSE;
977 WcaRevertWow64FSRedirection();
978 }
979 WcaFinalizeWow64();
980
981
982 if (FAILED(hr))
983 {
984 er = ERROR_INSTALL_FAILURE;
985 }
986 return WcaFinalize(er);
987}
988/********************************************************************
989 StartIIS7Config Transaction - CUSTOM ACTION ENTRY POINT for backing up config
990
991 Input: deferred CustomActionData - BackupName
992********************************************************************/
993extern "C" UINT __stdcall StartIIS7ConfigTransaction(MSIHANDLE hInstall)
994{
995 HRESULT hr = S_OK;
996 UINT er = ERROR_SUCCESS;
997 LPWSTR pwzData = NULL;
998 WCHAR wzConfigSource[MAX_PATH];
999 WCHAR wzConfigCopy[MAX_PATH];
1000 DWORD dwSize = 0;
1001
1002
1003 BOOL fIsWow64Process = FALSE;
1004 BOOL fIsFSRedirectDisabled = FALSE;
1005
1006 // initialize
1007 hr = WcaInitialize(hInstall, "StartIIS7ConfigTransaction");
1008 ExitOnFailure(hr, "failed to initialize StartIIS7ConfigTransaction");
1009
1010 WcaInitializeWow64();
1011 fIsWow64Process = WcaIsWow64Process();
1012 if (fIsWow64Process)
1013 {
1014 hr = WcaDisableWow64FSRedirection();
1015 if(FAILED(hr))
1016 {
1017 //eat this error
1018 hr = S_OK;
1019 }
1020 else
1021 {
1022 fIsFSRedirectDisabled = TRUE;
1023 }
1024 }
1025
1026 hr = WcaGetProperty(L"CustomActionData", &pwzData);
1027 ExitOnFailure(hr, "failed to get CustomActionData");
1028
1029
1030 dwSize = ExpandEnvironmentStringsW(L"%windir%\\system32\\inetsrv\\config\\applicationHost.config",
1031 wzConfigSource,
1032 MAX_PATH
1033 );
1034 if ( dwSize == 0 )
1035 {
1036 ExitWithLastError(hr, "failed to get ExpandEnvironmentStrings");
1037 }
1038 hr = ::StringCchCopyW(wzConfigCopy, MAX_PATH, wzConfigSource);
1039 ExitOnFailure(hr, "Commit IIS7 failed StringCchCopyW");
1040
1041 //add ca action as extension
1042
1043 hr = ::StringCchCatW(wzConfigCopy, MAX_PATH, L".");
1044 ExitOnFailure(hr, "Commit IIS7 failed StringCchCatW of .");
1045
1046 hr = ::StringCchCatW(wzConfigCopy, MAX_PATH, pwzData);
1047 ExitOnFailure(hr, "Commit IIS7 failed StringCchCatW of extension");
1048
1049 if ( !::CopyFileW(wzConfigSource, wzConfigCopy, FALSE) )
1050 {
1051 hr = HRESULT_FROM_WIN32(GetLastError());
1052 if (HRESULT_FROM_WIN32(ERROR_PATH_NOT_FOUND) == hr ||
1053 HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND) == hr)
1054 {
1055 // IIS may not be installed on the machine, we'll fail later if we try to install anything
1056 WcaLog(LOGMSG_STANDARD, "Failed to back up applicationHost, not found - continuing");
1057 hr = S_OK;
1058 }
1059 else
1060 {
1061 ExitOnFailure(hr, "Failed to copy config backup %ls -> %ls", wzConfigSource, wzConfigCopy);
1062 }
1063 }
1064
1065
1066 hr = WcaProgressMessage(COST_IIS_TRANSACTIONS, FALSE);
1067
1068
1069LExit:
1070
1071 ReleaseStr(pwzData);
1072
1073 // Make sure we revert FS Redirection if necessary before exiting
1074 if (fIsFSRedirectDisabled)
1075 {
1076 fIsFSRedirectDisabled = FALSE;
1077 WcaRevertWow64FSRedirection();
1078 }
1079 WcaFinalizeWow64();
1080
1081 if (FAILED(hr))
1082 er = ERROR_INSTALL_FAILURE;
1083 return WcaFinalize(er);
1084}
1085
1086
1087/********************************************************************
1088 RollbackIIS7ConfigTransaction - CUSTOM ACTION ENTRY POINT for unbacking up config
1089
1090 Input: deferred CustomActionData - BackupName
1091********************************************************************/
1092extern "C" UINT __stdcall RollbackIIS7ConfigTransaction(MSIHANDLE hInstall)
1093{
1094 HRESULT hr = S_OK;
1095 UINT er = ERROR_SUCCESS;
1096 LPWSTR pwzData = NULL;
1097 WCHAR wzConfigSource[MAX_PATH];
1098 WCHAR wzConfigCopy[MAX_PATH];
1099 DWORD dwSize = 0;
1100
1101 BOOL fIsWow64Process = FALSE;
1102 BOOL fIsFSRedirectDisabled = FALSE;
1103
1104 hr = WcaInitialize(hInstall, "RollbackIIS7ConfigTransaction");
1105 ExitOnFailure(hr, "failed to initialize");
1106
1107 WcaInitializeWow64();
1108 fIsWow64Process = WcaIsWow64Process();
1109 if (fIsWow64Process)
1110 {
1111 hr = WcaDisableWow64FSRedirection();
1112 if(FAILED(hr))
1113 {
1114 //eat this error
1115 hr = S_OK;
1116 }
1117 else
1118 {
1119 fIsFSRedirectDisabled = TRUE;
1120 }
1121 }
1122
1123 hr = WcaGetProperty( L"CustomActionData", &pwzData);
1124 ExitOnFailure(hr, "failed to get CustomActionData");
1125
1126 dwSize = ExpandEnvironmentStringsW(L"%windir%\\system32\\inetsrv\\config\\applicationHost.config",
1127 wzConfigSource,
1128 MAX_PATH
1129 );
1130 if ( dwSize == 0 )
1131 {
1132 ExitWithLastError(hr, "failed to get ExpandEnvironmentStrings");
1133 }
1134 hr = ::StringCchCopyW(wzConfigCopy, MAX_PATH, wzConfigSource);
1135 ExitOnFailure(hr, "Commit IIS7 failed StringCchCopyW");
1136
1137 //add ca action as extension
1138
1139 hr = ::StringCchCatW(wzConfigCopy, MAX_PATH, L".");
1140 ExitOnFailure(hr, "Commit IIS7 failed StringCchCatW of .");
1141
1142 hr = ::StringCchCatW(wzConfigCopy, MAX_PATH, pwzData);
1143 ExitOnFailure(hr, "Commit IIS7 failed StringCchCatW of extension");
1144
1145 //copy is reverse of start transaction
1146 if (!::CopyFileW(wzConfigCopy, wzConfigSource, FALSE))
1147 {
1148 hr = HRESULT_FROM_WIN32(GetLastError());
1149 if (HRESULT_FROM_WIN32(ERROR_PATH_NOT_FOUND) == hr ||
1150 HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND) == hr)
1151 {
1152 WcaLog(LOGMSG_STANDARD, "Failed to restore applicationHost, not found - continuing");
1153 hr = S_OK;
1154 }
1155 else
1156 {
1157 ExitOnFailure(hr, "failed to restore config backup");
1158 }
1159 }
1160
1161 if (!::DeleteFileW(wzConfigCopy))
1162 {
1163 ExitWithLastError(hr, "failed to delete config backup");
1164 }
1165
1166 hr = WcaProgressMessage(COST_IIS_TRANSACTIONS, FALSE);
1167
1168LExit:
1169 ReleaseStr(pwzData);
1170
1171 // Make sure we revert FS Redirection if necessary before exiting
1172 if (fIsFSRedirectDisabled)
1173 {
1174 fIsFSRedirectDisabled = FALSE;
1175 WcaRevertWow64FSRedirection();
1176 }
1177 WcaFinalizeWow64();
1178
1179 if (FAILED(hr))
1180 {
1181 er = ERROR_INSTALL_FAILURE;
1182 }
1183 return WcaFinalize(er);
1184}
diff --git a/src/ext/Iis/ca/scaexecIIS7.cpp b/src/ext/Iis/ca/scaexecIIS7.cpp
new file mode 100644
index 00000000..108007a1
--- /dev/null
+++ b/src/ext/Iis/ca/scaexecIIS7.cpp
@@ -0,0 +1,4205 @@
1#pragma once
2// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
3
4
5#include "precomp.h"
6
7//local CAData action functions
8HRESULT IIS7Site(
9 __inout LPWSTR *ppwzCustomActionData,
10 __in IAppHostWritableAdminManager *pAdminMgr
11 );
12
13HRESULT IIS7Application(
14 __inout LPWSTR *ppwzCustomActionData,
15 __in IAppHostWritableAdminManager *pAdminMgr
16 );
17HRESULT IIS7VDir(
18 __inout LPWSTR *ppwzCustomActionData,
19 __in IAppHostWritableAdminManager *pAdminMgr
20 );
21HRESULT IIS7Binding(
22 __inout LPWSTR *ppwzCustomActionData,
23 __in IAppHostWritableAdminManager *pAdminMgr
24 );
25HRESULT IIS7AppPool(
26 __inout LPWSTR *ppwzCustomActionData,
27 __in IAppHostWritableAdminManager *pAdminMgr
28 );
29HRESULT IIS7AppExtension(
30 __inout LPWSTR *ppwzCustomActionData,
31 __in IAppHostWritableAdminManager *pAdminMgr
32 );
33HRESULT IIS7MimeMap(
34 __inout LPWSTR *ppwzCustomActionData,
35 __in IAppHostWritableAdminManager *pAdminMgr
36 );
37HRESULT IIS7DirProperties(
38 __inout LPWSTR *ppwzCustomActionData,
39 __in IAppHostWritableAdminManager *pAdminMgr
40 );
41HRESULT IIS7WebLog(
42 __inout LPWSTR *ppwzCustomActionData,
43 __in IAppHostWritableAdminManager *pAdminMgr
44 );
45HRESULT IIS7FilterGlobal(
46 __inout LPWSTR *ppwzCustomActionData,
47 __in IAppHostWritableAdminManager *pAdminMgr
48 );
49HRESULT IIS7FilterSite(
50 __inout LPWSTR *ppwzCustomActionData,
51 __in IAppHostWritableAdminManager *pAdminMgr
52 );
53HRESULT IIS7HttpHeader(
54 __inout LPWSTR *ppwzCustomActionData,
55 __in IAppHostWritableAdminManager *pAdminMgr
56 );
57HRESULT IIS7WebError(
58 __inout LPWSTR *ppwzCustomActionData,
59 __in IAppHostWritableAdminManager *pAdminMgr
60 );
61HRESULT IIS7WebSvcExt(
62 __inout LPWSTR *ppwzCustomActionData,
63 __in IAppHostWritableAdminManager *pAdminMgr
64 );
65HRESULT IIS7WebProperty(
66 __inout LPWSTR *ppwzCustomActionData,
67 __in IAppHostWritableAdminManager *pAdminMgr
68 );
69HRESULT IIS7WebDir(
70 __inout LPWSTR *ppwzCustomActionData,
71 __in IAppHostWritableAdminManager *pAdminMgr
72 );
73HRESULT IIS7AspProperty(
74 __inout LPWSTR *ppwzCustomActionData,
75 __in IAppHostWritableAdminManager *pAdminMgr
76 );
77HRESULT IIS7SslBinding(
78 __inout LPWSTR *ppwzCustomActionData,
79 __in IAppHostWritableAdminManager *pAdminMgr
80 );
81//local helper functions
82
83static HRESULT GetNextAvailableSiteId(
84 IAppHostWritableAdminManager *pAdminMgr,
85 DWORD *plSiteId
86 );
87static HRESULT GetSiteElement(
88 IAppHostWritableAdminManager *pAdminMgr,
89 LPCWSTR swSiteName,
90 IAppHostElement **pSiteElement,
91 BOOL* fFound
92 );
93static HRESULT GetApplicationElement(
94 IAppHostElement *pSiteElement,
95 LPCWSTR swAppPath,
96 IAppHostElement **pAppElement,
97 BOOL* fFound
98 );
99static HRESULT GetApplicationElementForVDir(
100 IAppHostElement *pSiteElement,
101 LPCWSTR swVDirPath,
102 IAppHostElement **ppAppElement,
103 LPCWSTR *ppwzVDirSubPath,
104 BOOL* fFound
105 );
106
107static HRESULT CreateApplication(
108 IAppHostElement *pSiteElement,
109 LPCWSTR swAppPath,
110 IAppHostElement **pAppElement
111 );
112static HRESULT DeleteApplication(
113 IAppHostElement *pSiteElement,
114 LPCWSTR swAppPath
115 );
116
117static HRESULT SetAppPool(
118 IAppHostElement *pAppElementpAppElement,
119 LPCWSTR pwzAppPool
120 );
121static HRESULT CreateVdir(
122 IAppHostElement *pAppElement,
123 LPCWSTR pwzVDirPath,
124 LPCWSTR pwzVDirPhyDir
125 );
126static HRESULT DeleteVdir(
127 IAppHostElement *pAppElement,
128 LPCWSTR pwzVDirPath
129 );
130
131static HRESULT CreateBinding(
132 IAppHostElement *pSiteElem,
133 LPCWSTR pwzProtocol,
134 LPCWSTR pwzInfo
135 );
136static HRESULT DeleteBinding(
137 IAppHostElement *pSiteElem,
138 LPCWSTR pwzProtocol,
139 LPCWSTR pwzInfo
140 );
141
142static HRESULT CreateSslBinding(
143 IAppHostElement *pSiteElem,
144 LPCWSTR pwzStoreName,
145 LPCWSTR pwzEncodedCertificateHash
146 );
147static HRESULT DeleteSslBinding(
148 IAppHostElement *pSiteElem,
149 LPCWSTR pwzStoreName,
150 LPCWSTR pwzEncodedCertificateHash
151 );
152
153static HRESULT CreateSite(
154 IAppHostElementCollection *pAdminMgr,
155 LPCWSTR swSiteName,
156 IAppHostElement **pSiteElement
157 );
158
159static HRESULT DeleteAppPool(
160 IAppHostWritableAdminManager *pAdminMgr,
161 LPCWSTR swAppPoolName
162 );
163static HRESULT CreateAppPool(
164 __inout LPWSTR *ppwzCustomActionData,
165 IAppHostWritableAdminManager *pAdminMgr,
166 LPCWSTR swAppPoolName
167 );
168
169static HRESULT SetDirPropAuthentications(
170 IAppHostWritableAdminManager *pAdminMgr,
171 LPCWSTR wcConfigPath,
172 DWORD dwData
173 );
174static HRESULT SetDirPropAuthProvider(
175 IAppHostWritableAdminManager *pAdminMgr,
176 LPCWSTR wszConfigPath,
177 __in LPWSTR wszData
178 );
179static HRESULT SetDirPropDefDoc(
180 IAppHostWritableAdminManager *pAdminMgr,
181 LPCWSTR wszConfigPath,
182 __in LPWSTR wszData
183 );
184
185static HRESULT ClearLocationTag(
186 IAppHostWritableAdminManager *pAdminMgr,
187 LPCWSTR swLocationPath
188 );
189
190static HRESULT CreateWebLog(
191 IAppHostElement *pSiteElem,
192 LPCWSTR pwzFormat
193 );
194
195static HRESULT CreateGlobalFilter(
196 __inout LPWSTR *ppwzCustomActionData,
197 IAppHostElement *pSection
198 );
199static HRESULT DeleteGlobalFilter(
200 __inout LPWSTR *ppwzCustomActionData,
201 IAppHostElement *pSection
202 );
203
204static HRESULT CreateSiteFilter(
205 __inout LPWSTR *ppwzCustomActionData,
206 IAppHostWritableAdminManager *pAdminMgr
207 );
208static HRESULT DeleteSiteFilter(
209 __inout LPWSTR *ppwzCustomActionData,
210 IAppHostWritableAdminManager *pAdminMgr
211 );
212
213static HRESULT DeleteCollectionElement(
214 __in IAppHostElementCollection *pCollection,
215 __in LPCWSTR pwzElementName,
216 __in LPCWSTR pwzAttributeName,
217 __in LPCWSTR pwzAttributeValue
218 );
219
220struct SCA_WEB_ERROR_SERVER
221{
222 int iErrorCode;
223 int iSubCode;
224 WCHAR wzFile[MAX_PATH];
225 WCHAR wzLangPath[MAX_PATH];
226 int iResponseMode;
227 SCA_WEB_ERROR_SERVER *psweNext;
228};
229static HRESULT AddWebErrorToList(
230 SCA_WEB_ERROR_SERVER** ppsweList
231 );
232static void ScaWebErrorFreeList7(
233 SCA_WEB_ERROR_SERVER *psweList
234 );
235static HRESULT PopulateHttpErrors(
236 IAppHostElement *pSection,
237 SCA_WEB_ERROR_SERVER **psweList
238 );
239static HRESULT GetErrorFromList(
240 const SCA_WEB_ERROR_SERVER & we,
241 SCA_WEB_ERROR_SERVER **ppsweList,
242 SCA_WEB_ERROR_SERVER **pswe,
243 BOOL *fFound
244 );
245
246static void ConvSecToHMS(
247 int Sec,
248 __out_ecount(cchDest) LPWSTR wcTime,
249 size_t cchDest
250 );
251static void ConvSecToDHMS(
252 unsigned int Sec,
253 __out_ecount(cchDest) LPWSTR wcTime,
254 size_t cchDest
255 );
256
257////////////////////////////////////////////////////////////////////
258// ScopeBSTR: Local helper class to construct & free BSTR from LPWSTR
259//
260/////////////////////////////////////////////////////////////////////
261class ScopeBSTR
262{
263public:
264 BSTR m_str;
265
266 ScopeBSTR()
267 {
268 m_str = NULL;
269 }
270
271 ScopeBSTR( __in LPCWSTR pSrc)
272 {
273 if (pSrc == NULL)
274 {
275 m_str = NULL;
276 }
277 else
278 {
279 m_str = ::SysAllocString(pSrc);
280
281 }
282 }
283
284 ~ScopeBSTR()
285 {
286 ::SysFreeString(m_str);
287 }
288
289 operator BSTR()
290 {
291 return m_str;
292 }
293};
294
295
296/********************************************************************
297 IIS7ConfigChanges - Start of IIS7 config changes
298
299 *******************************************************************/
300HRESULT IIS7ConfigChanges(MSIHANDLE /*hInstall*/, __inout LPWSTR pwzData)
301{
302 HRESULT hr = S_OK;
303 BOOL fInitializedCom = FALSE;
304
305 IAppHostWritableAdminManager *pAdminMgr = NULL;
306
307 LPWSTR pwz = NULL;
308 LPWSTR pwzLast = NULL;
309 LPWSTR pwzBackup = NULL;
310 DWORD cchData = lstrlenW(pwzData);
311 int iAction = -1;
312
313 int iRetryCount = 0;
314
315 hr = ::CoInitialize(NULL);
316 ExitOnFailure(hr, "Failed to initialize COM");
317 fInitializedCom = TRUE;
318
319 pwz = pwzLast = pwzData;
320
321 hr = StrAllocString(&pwzBackup, pwz, 0);
322 ExitOnFailure(hr, "Failed to backup custom action data");
323
324 while (S_OK == (hr = WcaReadIntegerFromCaData(&pwz, &iAction)))
325 {
326 if (NULL == pAdminMgr)
327 {
328 hr = ::CoCreateInstance( __uuidof(AppHostWritableAdminManager),
329 NULL,
330 CLSCTX_INPROC_SERVER,
331 __uuidof(IAppHostWritableAdminManager),
332 reinterpret_cast<void**> (&pAdminMgr));
333 ExitOnFailure(hr , "Failed to open AppHostWritableAdminManager to configure IIS7");
334 }
335
336 switch (iAction)
337 {
338 case IIS_SITE:
339 {
340#pragma prefast(suppress:26010, "This is a prefast issue - pAdminMgr is correctly allocated")
341 hr = IIS7Site(&pwz, pAdminMgr);
342 ExitOnFailure(hr, "Failed to configure IIS site.");
343 break;
344 }
345 case IIS_APPLICATION:
346 {
347#pragma prefast(suppress:26010, "This is a prefast issue - pAdminMgr is correctly allocated")
348 hr = IIS7Application(&pwz, pAdminMgr);
349 ExitOnFailure(hr, "Failed to configure IIS application.");
350 break;
351 }
352 case IIS_VDIR:
353 {
354#pragma prefast(suppress:26010, "This is a prefast issue - pAdminMgr is correctly allocated")
355 hr = IIS7VDir(&pwz, pAdminMgr);
356 ExitOnFailure(hr, "Failed to configure IIS VDir.");
357 break;
358 }
359 case IIS_BINDING:
360 {
361#pragma prefast(suppress:26010, "This is a prefast issue - pAdminMgr is correctly allocated")
362 hr = IIS7Binding(&pwz, pAdminMgr);
363 ExitOnFailure(hr, "Failed to configure IIS site binding.");
364 break;
365 }
366 case IIS_APPPOOL:
367 {
368#pragma prefast(suppress:26010, "This is a prefast issue - pAdminMgr is correctly allocated")
369 hr = IIS7AppPool(&pwz, pAdminMgr);
370 ExitOnFailure(hr, "Failed to configure IIS appPool.");
371 break;
372 }
373 case IIS_APPEXT_BEGIN:
374 {
375#pragma prefast(suppress:26010, "This is a prefast issue - pAdminMgr is correctly allocated")
376 hr = IIS7AppExtension(&pwz, pAdminMgr);
377 ExitOnFailure(hr, "Failed to configure IIS AppExtension.");
378 break;
379 }
380 case IIS_MIMEMAP_BEGIN:
381 {
382#pragma prefast(suppress:26010, "This is a prefast issue - pAdminMgr is correctly allocated")
383 hr = IIS7MimeMap(&pwz, pAdminMgr);
384 ExitOnFailure(hr, "Failed to configure IIS MimeMap.");
385 break;
386 }
387 case IIS_DIRPROP_BEGIN:
388 {
389#pragma prefast(suppress:26010, "This is a prefast issue - pAdminMgr is correctly allocated")
390 hr = IIS7DirProperties(&pwz, pAdminMgr);
391 ExitOnFailure(hr, "Failed to configure IIS DirProperties.");
392 break;
393 }
394 case IIS_WEBLOG:
395 {
396#pragma prefast(suppress:26010, "This is a prefast issue - pAdminMgr is correctly allocated")
397 hr = IIS7WebLog(&pwz, pAdminMgr);
398 ExitOnFailure(hr, "Failed to configure IIS WebLog.");
399 break;
400 }
401 case IIS_FILTER_GLOBAL_BEGIN:
402 {
403#pragma prefast(suppress:26010, "This is a prefast issue - pAdminMgr is correctly allocated")
404 hr = IIS7FilterGlobal(&pwz, pAdminMgr);
405 ExitOnFailure(hr, "Failed to configure IIS filter global.");
406 break;
407 }
408 case IIS_FILTER_BEGIN:
409 {
410#pragma prefast(suppress:26010, "This is a prefast issue - pAdminMgr is correctly allocated")
411 hr = IIS7FilterSite(&pwz, pAdminMgr);
412 ExitOnFailure(hr, "Failed to configure IIS Filter.");
413 break;
414 }
415 case IIS_HTTP_HEADER_BEGIN:
416 {
417#pragma prefast(suppress:26010, "This is a prefast issue - pAdminMgr is correctly allocated")
418 hr = IIS7HttpHeader(&pwz, pAdminMgr);
419 ExitOnFailure(hr, "Failed to configure IIS http Header.");
420 break;
421 }
422 case IIS_WEBERROR_BEGIN:
423 {
424#pragma prefast(suppress:26010, "This is a prefast issue - pAdminMgr is correctly allocated")
425 hr = IIS7WebError(&pwz, pAdminMgr);
426 ExitOnFailure(hr, "Failed to configure IIS http Errors.");
427 break;
428 }
429 case IIS_WEB_SVC_EXT:
430 {
431#pragma prefast(suppress:26010, "This is a prefast issue - pAdminMgr is correctly allocated")
432 hr = IIS7WebSvcExt(&pwz, pAdminMgr);
433 ExitOnFailure(hr, "Failed to configure IIS web svc ext.");
434 break;
435 }
436 case IIS_PROPERTY:
437 {
438#pragma prefast(suppress:26010, "This is a prefast issue - pAdminMgr is correctly allocated")
439 hr = IIS7WebProperty(&pwz, pAdminMgr);
440 ExitOnFailure(hr, "Failed to configure IIS web property.");
441 break;
442 }
443 case IIS_WEBDIR:
444 {
445#pragma prefast(suppress:26010, "This is a prefast issue - pAdminMgr is correctly allocated")
446 hr = IIS7WebDir(&pwz, pAdminMgr);
447 ExitOnFailure(hr, "Failed to configure IIS web directory.");
448 break;
449 }
450 case IIS_ASP_BEGIN:
451 {
452#pragma prefast(suppress:26010, "This is a prefast issue - pAdminMgr is correctly allocated")
453 hr = IIS7AspProperty(&pwz, pAdminMgr);
454 ExitOnFailure(hr, "Failed to configure IIS Asp property.");
455 break;
456 }
457 case IIS_SSL_BINDING:
458#pragma prefast(suppress:26010, "This is a prefast issue - pAdminMgr is correctly allocated")
459 hr = IIS7SslBinding(&pwz, pAdminMgr);
460 ExitOnFailure(hr, "Failed to configure IIS SSL binding.");
461 break;
462
463 default:
464 ExitOnFailure(hr = E_UNEXPECTED, "IIS7ConfigChanges: Unexpected IIS Config action specified: %d", iAction);
465 break;
466 }
467 if (S_OK == hr)
468 {
469 // commit config changes now to close out IIS Admin changes,
470 // the Rollback or Commit defered CAs will determine final commit status.
471 hr = pAdminMgr->CommitChanges();
472
473 // Our transaction may have been interrupted.
474 if (hr == HRESULT_FROM_WIN32(ERROR_SHARING_VIOLATION) || hr == HRESULT_FROM_WIN32(ERROR_TRANSACTIONAL_CONFLICT))
475 {
476 WcaLog(LOGMSG_VERBOSE, "Sharing violation or transactional conflict during attempt to save changes to applicationHost.config");
477 if (++iRetryCount > 30)
478 {
479 if (IDRETRY == WcaErrorMessage(msierrIISFailedCommitInUse, hr, INSTALLMESSAGE_ERROR | MB_RETRYCANCEL, 0))
480 {
481 iRetryCount = 0;
482 }
483 else
484 {
485 ExitOnFailure(hr, "Failed to Commit IIS Config Changes, in silent mode or user has chosen to cancel");
486 }
487 }
488
489 // Throw away the changes since IIS has no way to remove uncommited changes from an AdminManager.
490 ReleaseNullObject(pAdminMgr);
491
492 // Restore our CA data backup
493 pwz = pwzLast;
494 hr = ::StringCchCopyW(pwz, cchData - (pwz - pwzData) + 1, pwzBackup);
495 ExitOnFailure(hr , "Failed to restore custom action data backup");
496
497 }
498 else if (FAILED(hr))
499 {
500 ExitOnFailure(hr , "Failed to Commit IIS Config Changes");
501 }
502 else
503 {
504 // store a backup of CA data @ the last place that we successfully commited changes unless we are done.
505 if(NULL != pwz)
506 {
507 pwzLast = pwz;
508 hr = StrAllocString(&pwzBackup, pwz, 0);
509 ExitOnFailure(hr, "Failed to backup custom action data");
510 }
511 }
512 }
513 }
514 if (E_NOMOREITEMS == hr) // If there are no more items, all is well
515 {
516 hr = S_OK;
517 }
518LExit:
519 ReleaseObject(pAdminMgr);
520 ReleaseStr(pwzBackup);
521
522 if (fInitializedCom)
523 {
524 ::CoUninitialize();
525 }
526
527 return hr;
528}
529//-------------------------------------------------------------------------------------------------
530// IIS7AspProperty
531// Called by WriteIIS7ConfigChanges
532// Processes asp properties for WebApplication
533//
534//-------------------------------------------------------------------------------------------------
535
536HRESULT IIS7AspProperty(
537 __inout LPWSTR *ppwzCustomActionData,
538 __in IAppHostWritableAdminManager *pAdminMgr
539 )
540{
541 HRESULT hr = S_OK;
542
543 int iAction = -1;
544 int iData = 0;
545
546 LPWSTR pwzData = NULL;
547 LPWSTR pwzSiteName = NULL;
548 LPWSTR pwzPathName = NULL;
549 LPWSTR pwzLocationPath = NULL;
550 WCHAR wcTime[60];
551
552 IAppHostElement *pSection = NULL;
553 IAppHostElement *pElement = NULL;
554
555 //read web site key
556 hr = WcaReadStringFromCaData(ppwzCustomActionData, &pwzSiteName);
557 ExitOnFailure(hr, "Failed read webDir webkey");
558
559 //read path key
560 hr = WcaReadStringFromCaData(ppwzCustomActionData, &pwzPathName);
561 ExitOnFailure(hr, "Failed read webDir path");
562
563 //Construct Location path
564 hr = StrAllocFormatted(&pwzLocationPath, L"%s/%s", IIS_CONFIG_APPHOST_ROOT, pwzSiteName);
565 ExitOnFailure(hr, "failed to format webDir location");
566 //
567 //Do not append trailing '/' for default vDir
568 //
569 if (CSTR_EQUAL != ::CompareStringW(LOCALE_INVARIANT, NORM_IGNORECASE, pwzPathName, -1, L"/", -1))
570 {
571 hr = StrAllocConcat(&pwzLocationPath, L"/", 0);
572 ExitOnFailure(hr, "failed to copy location WebDir '/'");
573 hr = StrAllocConcat(&pwzLocationPath, pwzPathName, 0);
574 ExitOnFailure(hr, "failed to copy location WebDir path");
575 }
576
577 //get asp section at config path location tag
578 hr = pAdminMgr->GetAdminSection( ScopeBSTR(IIS_CONFIG_ASP_SECTION), pwzLocationPath, &pSection);
579 ExitOnFailure(hr, "Failed get httpErrors section");
580
581 // Get action
582 hr = WcaReadIntegerFromCaData(ppwzCustomActionData, &iAction);
583 ExitOnFailure(hr, "Failed to read property action");
584
585 while (IIS_ASP_END != iAction)
586 {
587 switch (iAction)
588 {
589 case IIS_ASP_SESSIONSTATE:
590 {
591 //system.webServer/asp /session | allowSessionState
592 hr = WcaReadIntegerFromCaData(ppwzCustomActionData, &iData);
593 ExitOnFailure(hr, "Failed to read asp session state");
594 hr = pSection->GetElementByName(ScopeBSTR(IIS_CONFIG_SESSION), &pElement);
595 ExitOnFailure(hr, "Failed to get asp session element");
596 hr = Iis7PutPropertyBool( pElement, IIS_CONFIG_ALLOWSTATE, iData);
597 ExitOnFailure(hr, "Failed to put asp session value");
598 ReleaseNullObject(pElement);
599 break;
600 }
601 case IIS_ASP_SESSIONTIMEOUT:
602 {
603 //system.webServer/asp /session | timeout
604 hr = WcaReadIntegerFromCaData(ppwzCustomActionData, &iData);
605 ExitOnFailure(hr, "Failed to read asp session timeout");
606 hr = pSection->GetElementByName(ScopeBSTR(IIS_CONFIG_SESSION), &pElement);
607 ExitOnFailure(hr, "Failed to get asp session timeout");
608 *wcTime = '\0';
609 ConvSecToHMS(iData * 60, wcTime, countof( wcTime));
610 hr = Iis7PutPropertyString( pElement, IIS_CONFIG_TIMEOUT, wcTime);
611 ExitOnFailure(hr, "Failed to put asp timeout value");
612 ReleaseNullObject(pElement);
613 break;
614 }
615 case IIS_ASP_BUFFER:
616 {
617 //system.webServer/asp | bufferingOn
618 hr = WcaReadIntegerFromCaData(ppwzCustomActionData, &iData);
619 ExitOnFailure(hr, "Failed to read asp bufferingOn");
620 hr = Iis7PutPropertyBool( pSection, IIS_CONFIG_BUFFERING, iData);
621 ExitOnFailure(hr, "Failed to put asp bufferingOn value");
622 break;
623 }
624 case IIS_ASP_PARENTPATHS:
625 {
626 //system.webServer/asp | enableParentPaths
627 hr = WcaReadIntegerFromCaData(ppwzCustomActionData, &iData);
628 ExitOnFailure(hr, "Failed to read asp ParentPaths");
629 hr = Iis7PutPropertyBool( pSection, IIS_CONFIG_PARENTPATHS, iData);
630 ExitOnFailure(hr, "Failed to put asp ParentPaths value");
631 break;
632 }
633 case IIS_ASP_SCRIPTLANG:
634 {
635 //system.webServer/asp | scriptLanguage
636 hr = WcaReadStringFromCaData(ppwzCustomActionData, &pwzData);
637 ExitOnFailure(hr, "Failed to read asp scriptLanguage");
638 hr = Iis7PutPropertyString( pSection, IIS_CONFIG_SCRIPTLANG, pwzData);
639 ExitOnFailure(hr, "Failed to put asp scriptLanguage value");
640 break;
641 }
642 case IIS_ASP_SCRIPTTIMEOUT:
643 {
644 //system.webServer/asp /limits | scriptTimeout
645 hr = WcaReadIntegerFromCaData(ppwzCustomActionData, &iData);
646 ExitOnFailure(hr, "Failed to read asp scriptTimeout");
647 hr = pSection->GetElementByName(ScopeBSTR(IIS_CONFIG_LIMITS), &pElement);
648 ExitOnFailure(hr, "Failed to get asp session element");
649 *wcTime = '\0';
650 ConvSecToHMS(iData, wcTime, countof( wcTime));
651 hr = Iis7PutPropertyString( pElement, IIS_CONFIG_SCRIPTTIMEOUT, wcTime);
652 ExitOnFailure(hr, "Failed to put asp scriptTimeout value");
653 ReleaseNullObject(pElement);
654 break;
655
656 }
657 case IIS_ASP_SCRIPTSERVERDEBUG:
658 {
659 //system.webServer/asp | appAllowDebugging
660 hr = WcaReadIntegerFromCaData(ppwzCustomActionData, &iData);
661 ExitOnFailure(hr, "Failed to read asp appAllowDebugging");
662 hr = Iis7PutPropertyBool( pSection, IIS_CONFIG_ALLOWDEBUG, iData);
663 ExitOnFailure(hr, "Failed to put asp appAllowDebugging value");
664 break;
665 }
666 case IIS_ASP_SCRIPTCLIENTDEBUG:
667 {
668 //system.webServer/asp | appAllowClientDebug
669 hr = WcaReadIntegerFromCaData(ppwzCustomActionData, &iData);
670 ExitOnFailure(hr, "Failed to read asp appAllowClientDebug");
671 hr = Iis7PutPropertyBool( pSection, IIS_CONFIG_ALLOWCLIENTDEBUG, iData);
672 ExitOnFailure(hr, "Failed to put asp appAllowClientDebug value");
673 break;
674 }
675 default:
676 {
677 ExitOnFailure(hr = E_UNEXPECTED, "Unexpected IIS Config action specified for asp properties");
678 break;
679 }
680 }
681 // Get next action
682 hr = WcaReadIntegerFromCaData(ppwzCustomActionData, &iAction);
683 ExitOnFailure(hr, "Failed to read asp prop action");
684 }
685
686LExit:
687 ReleaseStr(pwzData);
688 ReleaseStr(pwzSiteName);
689 ReleaseStr(pwzPathName);
690 ReleaseStr(pwzLocationPath);
691 ReleaseObject(pSection);
692 ReleaseObject(pElement);
693
694 return hr;
695}
696
697//-------------------------------------------------------------------------------------------------
698// IIS7WebDir
699// Called by WriteIIS7ConfigChanges
700// Processes WebDir
701//
702//-------------------------------------------------------------------------------------------------
703HRESULT IIS7WebDir(
704 __inout LPWSTR *ppwzCustomActionData,
705 __in IAppHostWritableAdminManager *pAdminMgr
706 )
707{
708 HRESULT hr = S_OK;
709
710 int iAction = -1;
711
712 LPWSTR pwzSiteName = NULL;
713 LPWSTR pwzPathName = NULL;
714 LPWSTR pwzLocationPath = NULL;
715
716 // Get action
717 hr = WcaReadIntegerFromCaData(ppwzCustomActionData, &iAction);
718 ExitOnFailure(hr, "Failed to read property action");
719
720 //read web site key
721 hr = WcaReadStringFromCaData(ppwzCustomActionData, &pwzSiteName);
722 ExitOnFailure(hr, "Failed read webDir webkey");
723
724 //read path key
725 hr = WcaReadStringFromCaData(ppwzCustomActionData, &pwzPathName);
726 ExitOnFailure(hr, "Failed read webDir path");
727
728 switch (iAction)
729 {
730 case IIS_CREATE:
731 {
732 //no action needed for create since WebDir has a
733 //WebDirProperties element that will create and populate
734 //location tag
735 break;
736 }
737 case IIS_DELETE:
738 {
739 //Construct Location path
740 hr = StrAllocString(&pwzLocationPath, pwzSiteName, 0);
741 ExitOnFailure(hr, "failed to copy location WebDir web name");
742 //
743 //Do not append trailing '/' for default vDir
744 //
745 if (CSTR_EQUAL != ::CompareStringW(LOCALE_INVARIANT, NORM_IGNORECASE, pwzPathName, -1, L"/", -1))
746 {
747 hr = StrAllocConcat(&pwzLocationPath, L"/", 0);
748 ExitOnFailure(hr, "failed to copy location WebDir '/'");
749 hr = StrAllocConcat(&pwzLocationPath, pwzPathName, 0);
750 ExitOnFailure(hr, "failed to copy location WebDir path");
751 }
752 // and delete location tag for this application
753 hr = ClearLocationTag(pAdminMgr, pwzLocationPath);
754 ExitOnFailure(hr, "failed to clear location tag for %ls", pwzLocationPath)
755 break;
756 }
757 default:
758 {
759 ExitOnFailure(hr = E_UNEXPECTED, "Unexpected IIS Config action specified for WebDir");
760 break;
761 }
762 }
763LExit:
764 ReleaseStr(pwzSiteName);
765 ReleaseStr(pwzPathName);
766 ReleaseStr(pwzLocationPath);
767
768 return hr;
769}
770
771//-------------------------------------------------------------------------------------------------
772// IIS7WebProperty
773// Called by WriteIIS7ConfigChanges
774// Processes isapiCgiRestriction
775//
776//-------------------------------------------------------------------------------------------------
777HRESULT IIS7WebProperty(
778 __inout LPWSTR *ppwzCustomActionData,
779 __in IAppHostWritableAdminManager *pAdminMgr
780 )
781{
782 HRESULT hr = S_OK;
783
784 int iAction = -1;
785 int iData = 0;
786
787 IAppHostElement *pSection = NULL;
788
789 // Get action
790 hr = WcaReadIntegerFromCaData(ppwzCustomActionData, &iAction);
791 ExitOnFailure(hr, "Failed to read property action");
792
793 switch (iAction)
794 {
795 case IIS_PROPERTY_MAXBAND:
796 {
797 hr = WcaReadIntegerFromCaData(ppwzCustomActionData, &iData);
798 ExitOnFailure(hr, "Failed to read property max band");
799 //set value at system.applicationHost/webLimits | maxGlobalBandwidth
800 //Get IIS config section
801 hr = pAdminMgr->GetAdminSection(ScopeBSTR(IIS_CONFIG_WEBLIMITS_SECTION), ScopeBSTR(IIS_CONFIG_APPHOST_ROOT), &pSection);
802 ExitOnFailure(hr, "Failed get isapiCgiRestriction section");
803 if (!pSection)
804 {
805 hr = HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND);
806 ExitOnFailure(hr, "Failed get isapiCgiRestriction section object");
807 }
808 hr = Iis7PutPropertyInteger(pSection, IIS_CONFIG_WEBLIMITS_MAXBAND, iData);
809
810 break;
811 }
812 case IIS_PROPERTY_LOGUTF8:
813 {
814 hr = WcaReadIntegerFromCaData(ppwzCustomActionData, &iData);
815 ExitOnFailure(hr, "Failed to read property log");
816 //set value at system.applicationHost/log | logInUTF8
817 //Get IIS config section
818 hr = pAdminMgr->GetAdminSection(ScopeBSTR(IIS_CONFIG_LOG_SECTION), ScopeBSTR(IIS_CONFIG_APPHOST_ROOT), &pSection);
819 ExitOnFailure(hr, "Failed get isapiCgiRestriction section");
820 if (!pSection)
821 {
822 hr = HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND);
823 ExitOnFailure(hr, "Failed get isapiCgiRestriction section object");
824 }
825 hr = Iis7PutPropertyBool(pSection, IIS_CONFIG_LOG_UTF8, iData);
826
827 break;
828 }
829 default:
830 {
831 ExitOnFailure(hr = E_UNEXPECTED, "Unexpected IIS Config action specified for Web Property");
832 break;
833 }
834 }
835
836LExit:
837 ReleaseObject(pSection);
838
839 return hr;
840}
841
842//-------------------------------------------------------------------------------------------------
843// IIS7WebSvcExt
844// Called by WriteIIS7ConfigChanges
845// Processes isapiCgiRestriction
846//
847//-------------------------------------------------------------------------------------------------
848HRESULT IIS7WebSvcExt(
849 __inout LPWSTR *ppwzCustomActionData,
850 __in IAppHostWritableAdminManager *pAdminMgr
851 )
852{
853 HRESULT hr = S_OK;
854
855 int iAction = -1;
856 int iData = 0;
857 BOOL fFound = FALSE;
858 LPWSTR pwzData = NULL;
859 LPWSTR pwzPath = NULL;
860
861 IAppHostElement *pSection = NULL;
862 IAppHostElement *pElement = NULL;
863 IAppHostElementCollection *pCollection = NULL;
864
865 // Get action
866 hr = WcaReadIntegerFromCaData(ppwzCustomActionData, &iAction);
867 ExitOnFailure(hr, "Failed to read WebSvcExt action");
868
869 //get path
870 hr = WcaReadStringFromCaData(ppwzCustomActionData, &pwzPath);
871 ExitOnFailure(hr, "Failed to read WebSvcExt key");
872
873 //Get IIS config section
874 hr = pAdminMgr->GetAdminSection(ScopeBSTR(IIS_CONFIG_RESTRICTION_SECTION), ScopeBSTR(IIS_CONFIG_APPHOST_ROOT), &pSection);
875 ExitOnFailure(hr, "Failed get isapiCgiRestriction section");
876 if (!pSection)
877 {
878 hr = HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND);
879 ExitOnFailure(hr, "Failed get isapiCgiRestriction section object");
880 }
881 //get collection
882 hr = pSection->get_Collection(&pCollection);
883 ExitOnFailure(hr, "Failed get isapiCgiRestriction collection");
884
885 //find element
886 hr = Iis7FindAppHostElementPath(pCollection, IIS_CONFIG_ADD, IIS_CONFIG_PATH, pwzPath, &pElement, NULL);
887 ExitOnFailure(hr, "Failed get isapiCgiRestriction element");
888 fFound = (NULL != pElement);
889
890 switch (iAction)
891 {
892 case IIS_CREATE:
893 {
894 if (!fFound)
895 {
896 //create a restriction element
897 hr = pCollection->CreateNewElement(ScopeBSTR(IIS_CONFIG_ADD), &pElement);
898 ExitOnFailure(hr, "Failed create isapiCgiRestriction element");
899 //put path
900 hr = Iis7PutPropertyString(pElement, IIS_CONFIG_PATH, pwzPath);
901 ExitOnFailure(hr, "Failed set isapiCgiRestriction path property");
902 }
903 //update common properties
904
905 //update allowed
906 hr = WcaReadIntegerFromCaData(ppwzCustomActionData, &iData);
907 ExitOnFailure(hr, "Failed to read WebSvcExt allowed");
908 hr = Iis7PutPropertyBool(pElement, IIS_CONFIG_ALLOWED, iData);
909 ExitOnFailure(hr, "Failed set isapiCgiRestriction allowed property");
910
911 //update groupId
912 hr = WcaReadStringFromCaData(ppwzCustomActionData, &pwzData);
913 ExitOnFailure(hr, "Failed to read WebSvcExt group ID");
914 if (*pwzData)
915 {
916 hr = Iis7PutPropertyString(pElement, IIS_CONFIG_GROUPID, pwzData);
917 ExitOnFailure(hr, "Failed set isapiCgiRestriction groupId property");
918 }
919 //update description
920 hr = WcaReadStringFromCaData(ppwzCustomActionData, &pwzData);
921 ExitOnFailure(hr, "Failed to read WebSvcExt description");
922 if (*pwzData)
923 {
924 hr = Iis7PutPropertyString(pElement, IIS_CONFIG_DESC, pwzData);
925 ExitOnFailure(hr, "Failed set isapiCgiRestriction description property");
926 }
927 // add element if new
928 if (!fFound)
929 {
930 hr = pCollection->AddElement(pElement);
931 ExitOnFailure(hr, "Failed add isapiCgiRestriction element");
932 }
933
934 break;
935 }
936 case IIS_DELETE:
937 {
938 hr = DeleteCollectionElement(pCollection, IIS_CONFIG_ADD, IIS_CONFIG_PATH, pwzPath);
939 ExitOnFailure(hr, "Failed delete isapiCgiRestriction element");
940 break;
941 }
942 default:
943 {
944 ExitOnFailure(hr = E_UNEXPECTED, "Unexpected IIS Config action specified for WebSvcExt");
945 break;
946 }
947 }
948
949LExit:
950 ReleaseStr(pwzPath);
951 ReleaseStr(pwzData);
952 ReleaseObject(pSection);
953 ReleaseObject(pElement);
954 ReleaseObject(pCollection);
955
956 return hr;
957
958}
959
960//-------------------------------------------------------------------------------------------------
961// IIS7WebError
962// Called by WriteIIS7ConfigChanges
963// Processes http header CA Data
964//
965//-------------------------------------------------------------------------------------------------
966
967HRESULT IIS7WebError(
968 __inout LPWSTR *ppwzCustomActionData,
969 __in IAppHostWritableAdminManager *pAdminMgr
970 )
971{
972 HRESULT hr = S_OK;
973 LPWSTR pwzConfigPath = NULL;
974 LPWSTR pwzSiteName = NULL;
975 LPWSTR pwzAppName = NULL;
976
977 IAppHostElement *pElement = NULL;
978 IAppHostElement *pSection = NULL;
979 IAppHostElementCollection *pCollection = NULL;
980
981 SCA_WEB_ERROR_SERVER *psweList = NULL;
982 SCA_WEB_ERROR_SERVER* pswe = NULL;
983 SCA_WEB_ERROR_SERVER we;
984 BOOL fFound = FALSE;
985
986 int iAction = -1;
987 LPWSTR pwzData = NULL;
988
989 //read web site key
990 hr = WcaReadStringFromCaData(ppwzCustomActionData, &pwzSiteName);
991 ExitOnFailure(hr, "Failed read web error site name");
992
993 //read app key
994 hr = WcaReadStringFromCaData(ppwzCustomActionData, &pwzAppName);
995 ExitOnFailure(hr, "Failed read web error app name");
996
997 //Construct config root path
998 hr = StrAllocFormatted(&pwzConfigPath, L"%s/%s", IIS_CONFIG_APPHOST_ROOT, pwzSiteName);
999 ExitOnFailure(hr, "failed to format web error config path");
1000
1001 if (CSTR_EQUAL != ::CompareStringW(LOCALE_INVARIANT, NORM_IGNORECASE, pwzAppName, -1, L"/", -1))
1002 {
1003 hr = StrAllocConcat(&pwzConfigPath, L"/", 0);
1004 ExitOnFailure(hr, "failed to copy web error config path delim");
1005 hr = StrAllocConcat(&pwzConfigPath, pwzAppName, 0);
1006 ExitOnFailure(hr, "failed to app name to web error config path");
1007 }
1008
1009 //get httpErrors section at config path location tag
1010 hr = pAdminMgr->GetAdminSection(ScopeBSTR(IIS_CONFIG_HTTPERRORS_SECTION), pwzConfigPath, &pSection);
1011 ExitOnFailure(hr, "Failed get httpErrors section");
1012
1013 //get existing httpErrors list & clear collection
1014 hr = PopulateHttpErrors(pSection, &psweList);
1015 ExitOnFailure(hr, "Failed to read httpErrors list");
1016
1017 //get collection
1018 hr = pSection->get_Collection(&pCollection);
1019 ExitOnFailure(hr, "Failed get httpErrors collection");
1020
1021 DWORD cErrors = 0;
1022 hr = pCollection->get_Count(&cErrors);
1023
1024 // Get web error action
1025 hr = WcaReadIntegerFromCaData(ppwzCustomActionData, &iAction);
1026 ExitOnFailure(hr, "Failed to read filter action");
1027 while (IIS_WEBERROR_END != iAction)
1028 {
1029 //Process property action
1030 if (IIS_WEBERROR == iAction)
1031 {
1032 hr = WcaReadIntegerFromCaData(ppwzCustomActionData, &(we.iErrorCode));
1033 ExitOnFailure(hr, "failed to get httpErrors ErrorCode");
1034
1035 hr = WcaReadIntegerFromCaData(ppwzCustomActionData, &(we.iSubCode));
1036 ExitOnFailure(hr, "failed to get httpErrors SubCode");
1037 //0 is the sub error code wild card for IIS6, change to -1 for IIS7
1038 if (we.iSubCode == 0)
1039 {
1040 we.iSubCode = -1;
1041 }
1042 hr = WcaReadStringFromCaData(ppwzCustomActionData, &pwzData);
1043 ExitOnFailure(hr, "Failed to get httpErrors File");
1044 hr = ::StringCchCopyW(we.wzFile, countof(we.wzFile), pwzData);
1045 ExitOnFailure(hr, "Failed to copy httpErrors File");
1046
1047 hr = WcaReadIntegerFromCaData(ppwzCustomActionData, &(we.iResponseMode));
1048 ExitOnFailure(hr, "Failed to get httpErrors File code");
1049
1050 fFound = FALSE;
1051 hr = GetErrorFromList( we, &psweList, &pswe, &fFound);
1052 if (!fFound)
1053 {
1054 hr = AddWebErrorToList(&psweList);
1055 ExitOnFailure(hr, "failed to add web error to list");
1056 pswe = psweList;
1057 }
1058 else
1059 {
1060 //if overwriting existing http errors element then clear lang path
1061 hr = ::StringCchCopyW(pswe->wzLangPath, countof(pswe->wzLangPath), L"");
1062 ExitOnFailure(hr, "Failed to copy httpErrors lang path value");
1063 }
1064 pswe->iErrorCode = we.iErrorCode;
1065 pswe->iSubCode = we.iSubCode;
1066 hr = ::StringCchCopyW(pswe->wzFile, countof(pswe->wzFile), we.wzFile);
1067 ExitOnFailure(hr, "Failed to copy httpErrors File value");
1068 pswe->iResponseMode = we.iResponseMode;
1069
1070 }
1071 else
1072 {
1073 ExitOnFailure(hr = E_UNEXPECTED, "Unexpected IIS Config action specified for http header");
1074 }
1075
1076 // Get AppExt action
1077 hr = WcaReadIntegerFromCaData(ppwzCustomActionData, &iAction);
1078 ExitOnFailure(hr, "Failed to read filter action");
1079 }
1080
1081 //No inheritance - put a clear in at this loc tag
1082 hr = pCollection->CreateNewElement(ScopeBSTR(IIS_CONFIG_CLEAR), &pElement);
1083 ExitOnFailure(hr, "Failed create httpErrors clear");
1084 hr = pCollection->AddElement(pElement);
1085 ExitOnFailure(hr, "Failed add httpErrors clear");
1086
1087 //now we have merged new, from MSI, http errors with global list
1088 //write this back out at location tag.
1089 // Loop through the HTTP headers
1090 for ( pswe = psweList; pswe; pswe = pswe->psweNext)
1091 {
1092 hr = pCollection->CreateNewElement(ScopeBSTR(IIS_CONFIG_ERROR), &pElement);
1093 ExitOnFailure(hr, "Failed create httpErrors element");
1094
1095 // status code
1096 hr = Iis7PutPropertyInteger(pElement, IIS_CONFIG_STATUSCODE, pswe->iErrorCode);
1097 ExitOnFailure(hr, "Failed set httpErrors code value");
1098
1099 //sub status
1100 hr = Iis7PutPropertyInteger(pElement, IIS_CONFIG_SUBSTATUS, pswe->iSubCode);
1101 ExitOnFailure(hr, "Failed set httpErrors sub code value");
1102
1103 //lang path
1104 hr = Iis7PutPropertyString(pElement, IIS_CONFIG_LANGPATH, pswe->wzLangPath);
1105 ExitOnFailure(hr, "Failed set httpErrors lang path value");
1106
1107 //path
1108 hr = Iis7PutPropertyString(pElement, IIS_CONFIG_PATH, pswe->wzFile);
1109 ExitOnFailure(hr, "Failed set httpErrors path value");
1110
1111 //response mode
1112 hr = Iis7PutPropertyInteger(pElement, IIS_CONFIG_RESPMODE, pswe->iResponseMode);
1113 ExitOnFailure(hr, "Failed set httpErrors resp mode value");
1114
1115 //add the element
1116 hr = pCollection->AddElement(pElement);
1117 ExitOnFailure(hr, "Failed add httpErrors element");
1118 ReleaseNullObject(pElement);
1119 }
1120
1121LExit:
1122 ScaWebErrorFreeList7(psweList);
1123
1124 ReleaseStr(pwzConfigPath);
1125 ReleaseStr(pwzSiteName);
1126 ReleaseStr(pwzAppName);
1127 ReleaseStr(pwzData);
1128 ReleaseObject(pElement);
1129 ReleaseObject(pSection);
1130 ReleaseObject(pCollection);
1131
1132 return hr;
1133}
1134
1135static HRESULT PopulateHttpErrors(IAppHostElement *pSection, SCA_WEB_ERROR_SERVER **ppsweList)
1136{
1137 HRESULT hr = S_OK;
1138
1139 IAppHostElement *pElement = NULL;
1140 IAppHostElementCollection *pCollection = NULL;
1141 IAppHostProperty *pProperty = NULL;
1142
1143 DWORD cErrors = 0;
1144 SCA_WEB_ERROR_SERVER *pswe = NULL;
1145
1146 VARIANT vPropValue;
1147 VARIANT vtIndex;
1148
1149 VariantInit(&vPropValue);
1150 VariantInit(&vtIndex);
1151
1152 hr = pSection->get_Collection(&pCollection);
1153 ExitOnFailure(hr, "Failed get httpErrors collection");
1154
1155 hr = pCollection->get_Count(&cErrors);
1156 ExitOnFailure(hr, "Failed get sites collection count");
1157
1158 vtIndex.vt = VT_UI4;
1159 for (DWORD i = 0; i < cErrors; ++i)
1160 {
1161 vtIndex.ulVal = i;
1162 hr = pCollection->get_Item(vtIndex , &pElement);
1163 ExitOnFailure(hr, "Failed get httpErrors collection item");
1164
1165 hr = AddWebErrorToList(ppsweList);
1166 ExitOnFailure(hr, "Failed add web error list item");
1167 pswe = *ppsweList;
1168
1169 //get all properties
1170 //
1171 // statusCode UINT
1172 // subStatusCode INT
1173 // prefixLanguageFilePath type="string"
1174 // path type="string"
1175 // responseMode type="enum" defaultValue="File">
1176 // <enum name="File" value="0" />
1177 // <enum name="ExecuteURL" value="1" />
1178 // <enum name="Redirect" value="2" />
1179
1180 // status code
1181 hr = pElement->GetPropertyByName(ScopeBSTR(IIS_CONFIG_STATUSCODE), &pProperty);
1182 ExitOnFailure(hr, "Failed get httpErrors code property");
1183 hr = pProperty->get_Value(&vPropValue);
1184 ExitOnFailure(hr, "Failed get httpErrors code value");
1185 pswe->iErrorCode = vPropValue.uintVal;
1186 ReleaseVariant(vPropValue);
1187
1188 //sub status
1189 hr = pElement->GetPropertyByName(ScopeBSTR(IIS_CONFIG_SUBSTATUS), &pProperty);
1190 ExitOnFailure(hr, "Failed get httpErrors sub code property");
1191 hr = pProperty->get_Value(&vPropValue);
1192 ExitOnFailure(hr, "Failed get httpErrors sub code value");
1193 pswe->iSubCode = vPropValue.intVal;
1194 ReleaseVariant(vPropValue);
1195
1196 //lang path
1197 hr = pElement->GetPropertyByName(ScopeBSTR(IIS_CONFIG_LANGPATH), &pProperty);
1198 ExitOnFailure(hr, "Failed get httpErrors lang path property");
1199 hr = pProperty->get_Value(&vPropValue);
1200 ExitOnFailure(hr, "Failed get httpErrors lang path value");
1201 hr = ::StringCchCopyW(pswe->wzLangPath, countof(pswe->wzLangPath), vPropValue.bstrVal);
1202 ExitOnFailure(hr, "Failed to copy httpErrors lang path");
1203 ReleaseVariant(vPropValue);
1204
1205 //path
1206 hr = pElement->GetPropertyByName(ScopeBSTR(IIS_CONFIG_PATH), &pProperty);
1207 ExitOnFailure(hr, "Failed get httpErrors path property");
1208 hr = pProperty->get_Value(&vPropValue);
1209 ExitOnFailure(hr, "Failed get httpErrors path value");
1210 hr = ::StringCchCopyW(pswe->wzFile, countof(pswe->wzFile), vPropValue.bstrVal);
1211 ExitOnFailure(hr, "Failed to copy httpErrors File");
1212 ReleaseVariant(vPropValue);
1213
1214 //response mode
1215 hr = pElement->GetPropertyByName(ScopeBSTR(IIS_CONFIG_RESPMODE), &pProperty);
1216 ExitOnFailure(hr, "Failed get httpErrors resp mode property");
1217 hr = pProperty->get_Value(&vPropValue);
1218 ExitOnFailure(hr, "Failed get httpErrors resp mode value");
1219 pswe->iResponseMode = vPropValue.intVal;
1220 ReleaseVariant(vPropValue);
1221
1222 ReleaseNullObject(pElement);
1223 ReleaseNullObject(pProperty);
1224 }
1225
1226 //remove the elements from connection so we can add back later
1227 hr = pCollection->Clear();
1228 ExitOnFailure(hr, "Failed clear httpErrors collection");
1229
1230LExit:
1231 ReleaseVariant(vPropValue);
1232 ReleaseObject(pProperty);
1233 ReleaseObject(pElement);
1234 ReleaseObject(pCollection);
1235
1236 return hr;
1237}
1238
1239static void ScaWebErrorFreeList7(SCA_WEB_ERROR_SERVER *psweList)
1240{
1241 SCA_WEB_ERROR_SERVER *psweDelete = psweList;
1242 while (psweList)
1243 {
1244 psweDelete = psweList;
1245 psweList = psweList->psweNext;
1246
1247 MemFree(psweDelete);
1248 }
1249}
1250static HRESULT AddWebErrorToList(SCA_WEB_ERROR_SERVER **ppsweList)
1251{
1252 HRESULT hr = S_OK;
1253
1254 SCA_WEB_ERROR_SERVER* pswe = static_cast<SCA_WEB_ERROR_SERVER*>(MemAlloc(sizeof(SCA_WEB_ERROR_SERVER), TRUE));
1255
1256 ExitOnNull(pswe, hr, E_OUTOFMEMORY, "failed to allocate memory for new web error list element");
1257
1258 pswe->psweNext = *ppsweList;
1259 *ppsweList = pswe;
1260
1261LExit:
1262 return hr;
1263}
1264static HRESULT GetErrorFromList( const SCA_WEB_ERROR_SERVER& we,
1265 SCA_WEB_ERROR_SERVER **ppsweList,
1266 SCA_WEB_ERROR_SERVER **ppswe,
1267 BOOL *fFound)
1268{
1269 HRESULT hr = S_OK;
1270
1271 *fFound = FALSE;
1272
1273 SCA_WEB_ERROR_SERVER *pswe;
1274
1275 for ( pswe = *ppsweList; pswe; pswe = pswe->psweNext)
1276 {
1277 if ((pswe->iErrorCode == we.iErrorCode) && (pswe->iSubCode == we.iSubCode))
1278 {
1279 *fFound = TRUE;
1280 *ppswe = pswe;
1281 break;
1282 }
1283 }
1284
1285 return hr;
1286}
1287
1288//-------------------------------------------------------------------------------------------------
1289// IIS7HttpHeader
1290// Called by WriteIIS7ConfigChanges
1291// Processes http header CA Data
1292//
1293//-------------------------------------------------------------------------------------------------
1294
1295HRESULT IIS7HttpHeader(
1296 __inout LPWSTR *ppwzCustomActionData,
1297 __in IAppHostWritableAdminManager *pAdminMgr
1298 )
1299{
1300 HRESULT hr = S_OK;
1301 LPWSTR pwzConfigPath = NULL;
1302 LPWSTR pwzSiteName = NULL;
1303 LPWSTR pwzAppName = NULL;
1304
1305 LPWSTR pwzHeaderName = NULL;
1306 LPWSTR pwzHeaderValue = NULL;
1307
1308 IAppHostElement *pElement = NULL;
1309 IAppHostElement *pSection = NULL;
1310 IAppHostElementCollection *pCollection = NULL;
1311 IAppHostElement *pElementHeaders = NULL;
1312
1313 int iAction = -1;
1314 BOOL fFound = FALSE;
1315
1316 //read web site key
1317 hr = WcaReadStringFromCaData(ppwzCustomActionData, &pwzSiteName);
1318 ExitOnFailure(hr, "Failed read header web site name");
1319
1320 //read app key
1321 hr = WcaReadStringFromCaData(ppwzCustomActionData, &pwzAppName);
1322 ExitOnFailure(hr, "Failed read header appkey");
1323
1324 //Construct config root path
1325 hr = StrAllocFormatted(&pwzConfigPath, L"%s/%s", IIS_CONFIG_APPHOST_ROOT, pwzSiteName);
1326 ExitOnFailure(hr, "failed to format web error config path");
1327
1328 if (CSTR_EQUAL != ::CompareStringW(LOCALE_INVARIANT, NORM_IGNORECASE, pwzAppName, -1, L"/", -1))
1329 {
1330 hr = StrAllocConcat(&pwzConfigPath, L"/", 0);
1331 ExitOnFailure(hr, "failed to copy web error config path delim");
1332 hr = StrAllocConcat(&pwzConfigPath, pwzAppName, 0);
1333 ExitOnFailure(hr, "failed to app name to web error config path");
1334 }
1335
1336 //get admin handlers section at config path location tag
1337 hr = pAdminMgr->GetAdminSection(ScopeBSTR(IIS_CONFIG_HTTPPROTO_SECTION), pwzConfigPath, &pSection);
1338 ExitOnFailure(hr, "Failed get http protocol section");
1339
1340 hr = pSection->GetElementByName(ScopeBSTR(IIS_CONFIG_HEADERS), &pElementHeaders);
1341 ExitOnFailure(hr, "Failed get http customHeaders section");
1342
1343 hr = pElementHeaders->get_Collection(&pCollection);
1344 ExitOnFailure(hr, "Failed get http customHeaders collection");
1345
1346 // Get filter action
1347 hr = WcaReadIntegerFromCaData(ppwzCustomActionData, &iAction);
1348 ExitOnFailure(hr, "Failed to read filter action");
1349 while (IIS_HTTP_HEADER_END != iAction)
1350 {
1351 //Process property action
1352 if (IIS_HTTP_HEADER == iAction)
1353 {
1354 hr = WcaReadStringFromCaData(ppwzCustomActionData, &pwzHeaderName);
1355 ExitOnFailure(hr, "Fail to read httpHeader name");
1356
1357 hr = WcaReadStringFromCaData(ppwzCustomActionData, &pwzHeaderValue);
1358 ExitOnFailure(hr, "Fail to read httpHeader value");
1359
1360 hr = Iis7FindAppHostElementString(pCollection, IIS_CONFIG_ADD, IIS_CONFIG_NAME, pwzHeaderName, &pElement, NULL);
1361 ExitOnFailure(hr, "Failed get isapiCgiRestriction element");
1362 fFound = (NULL != pElement);
1363
1364 if (!fFound)
1365 {
1366 //make a new element
1367 hr = pCollection->CreateNewElement(ScopeBSTR(IIS_CONFIG_ADD), &pElement);
1368 ExitOnFailure(hr, "Failed to create filter config element");
1369
1370 hr = Iis7PutPropertyString(pElement, IIS_CONFIG_NAME, pwzHeaderName);
1371 ExitOnFailure(hr, "Failed to set header name");
1372 }
1373
1374 hr = Iis7PutPropertyString(pElement, IIS_CONFIG_VALUE, pwzHeaderValue);
1375 ExitOnFailure(hr, "Failed to set header Value");
1376
1377 if (!fFound)
1378 {
1379 hr = pCollection->AddElement(pElement);
1380 ExitOnFailure(hr, "Failed add http header");
1381 }
1382
1383 }
1384 else
1385 {
1386 ExitOnFailure(hr = E_UNEXPECTED, "Unexpected IIS Config action specified for http header");
1387 }
1388
1389 // Get AppExt action
1390 hr = WcaReadIntegerFromCaData(ppwzCustomActionData, &iAction);
1391 ExitOnFailure(hr, "Failed to read filter action");
1392 }
1393
1394LExit:
1395 ReleaseStr(pwzConfigPath);
1396 ReleaseStr(pwzSiteName);
1397 ReleaseStr(pwzAppName);
1398 ReleaseStr(pwzHeaderName);
1399 ReleaseStr(pwzHeaderValue);
1400 ReleaseObject(pElementHeaders);
1401 ReleaseObject(pElement);
1402 ReleaseObject(pSection);
1403 ReleaseObject(pCollection);
1404
1405 return hr;
1406}
1407
1408//-------------------------------------------------------------------------------------------------
1409// IIS7FilterGlobal
1410// Called by WriteIIS7ConfigChanges
1411// Processes Filter CA Data
1412//
1413//-------------------------------------------------------------------------------------------------
1414HRESULT IIS7FilterGlobal(
1415 __inout LPWSTR *ppwzCustomActionData,
1416 __in IAppHostWritableAdminManager *pAdminMgr
1417 )
1418{
1419 HRESULT hr = S_OK;
1420 int iAction = 0;
1421
1422 IAppHostElement *pSection = NULL;
1423
1424 hr = pAdminMgr->GetAdminSection(ScopeBSTR(IIS_CONFIG_ISAPI_SECTION), ScopeBSTR(IIS_CONFIG_APPHOST_ROOT), &pSection);
1425 ExitOnFailure(hr, "Failed get sites section");
1426
1427 if (!pSection)
1428 {
1429 hr = HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND);
1430 ExitOnFailure(hr, "Failed get isapiFilters section object");
1431 }
1432
1433 // Get filter action
1434 hr = WcaReadIntegerFromCaData(ppwzCustomActionData, &iAction);
1435 ExitOnFailure(hr, "Failed to read filter action");
1436
1437 while (IIS_FILTER_END != iAction)
1438 {
1439 //Process property action
1440 switch (iAction)
1441 {
1442 case IIS_FILTER :
1443 {
1444 hr = WcaReadIntegerFromCaData(ppwzCustomActionData, &iAction);
1445 ExitOnFailure(hr, "Failed to read filter action");
1446
1447 if (iAction == IIS_CREATE)
1448 {
1449 hr = CreateGlobalFilter(ppwzCustomActionData, pSection);
1450 }
1451 else
1452 {
1453 hr = DeleteGlobalFilter(ppwzCustomActionData, pSection);
1454 }
1455 break;
1456 }
1457 default:
1458 {
1459 ExitOnFailure(hr = E_UNEXPECTED, "Unexpected IIS Config action specified for global filter");
1460 break;
1461 }
1462 }
1463 // Get AppExt action
1464 hr = WcaReadIntegerFromCaData(ppwzCustomActionData, &iAction);
1465 ExitOnFailure(hr, "Failed to read filter action");
1466
1467 }
1468
1469LExit:
1470 ReleaseObject(pSection);
1471
1472 return hr;
1473}
1474
1475static HRESULT CreateGlobalFilter( __inout LPWSTR *ppwzCustomActionData, IAppHostElement *pSection)
1476{
1477 HRESULT hr = S_OK;
1478
1479 LPWSTR pwzFilterName = NULL;
1480 LPWSTR pwzSiteName = NULL;
1481 LPWSTR pwzFilterPath = NULL;
1482 int iLoadOrder = 0;
1483 DWORD cFilters = 0;
1484
1485 IAppHostElement *pElement = NULL;
1486 IAppHostElementCollection *pCollection = NULL;
1487
1488 hr = pSection->get_Collection(&pCollection);
1489 ExitOnFailure(hr, "Failed get filter collection");
1490
1491 hr = pCollection->get_Count(&cFilters);
1492 ExitOnFailure(hr, "Failed get filter collection count");
1493
1494 // Attempt to delete, we will we recreate with desired property values and order
1495 hr = DeleteCollectionElement(pCollection, IIS_CONFIG_FILTER, IIS_CONFIG_NAME, pwzFilterName);
1496 ExitOnFailure(hr, "Failed to delete filter");
1497
1498 //make a new element
1499 hr = pCollection->CreateNewElement(ScopeBSTR(IIS_CONFIG_FILTER), &pElement);
1500 ExitOnFailure(hr, "Failed to create filter config element");
1501
1502 //filter Name key
1503 hr = WcaReadStringFromCaData(ppwzCustomActionData, &pwzFilterName);
1504 ExitOnFailure(hr, "Failed to read filter name");
1505 hr = Iis7PutPropertyString(pElement, IIS_CONFIG_NAME, pwzFilterName);
1506 ExitOnFailure(hr, "Failed to set filter name");
1507
1508 //web site name
1509 hr = WcaReadStringFromCaData(ppwzCustomActionData, &pwzSiteName);
1510 ExitOnFailure(hr, "Failed to read filter site name");
1511
1512 // filter path
1513 hr = WcaReadStringFromCaData(ppwzCustomActionData, &pwzFilterPath);
1514 ExitOnFailure(hr, "Failed to read filter path");
1515 hr = Iis7PutPropertyString(pElement,IIS_CONFIG_PATH, pwzFilterPath);
1516 ExitOnFailure(hr, "Failed to set filter path");
1517
1518 //filter load order
1519 hr = WcaReadIntegerFromCaData(ppwzCustomActionData, &iLoadOrder);
1520 ExitOnFailure(hr, "Failed to read filter load order");
1521
1522 // put element in order in list
1523 int iPosition = -1;
1524 int icFilters = cFilters;
1525 switch (iLoadOrder)
1526 {
1527 case 0 :
1528 {
1529 iPosition = -1;
1530 break;
1531 }
1532 case -1 :
1533 {
1534 iPosition = icFilters;
1535 break;
1536 }
1537 case MSI_NULL_INTEGER :
1538 {
1539 iPosition = icFilters;
1540 break;
1541 }
1542 default:
1543 {
1544 if (iLoadOrder > icFilters)
1545 {
1546 iPosition = icFilters;
1547 }
1548 else
1549 {
1550 iPosition = iLoadOrder;
1551 }
1552 break;
1553 }
1554 }
1555 hr = pCollection->AddElement(pElement, iPosition);
1556 ExitOnFailure(hr, "Failed to add filter element");
1557
1558LExit:
1559 ReleaseStr(pwzFilterName);
1560 ReleaseStr(pwzSiteName);
1561 ReleaseStr(pwzFilterPath);
1562 ReleaseObject(pCollection);
1563 ReleaseObject(pElement);
1564
1565 return hr;
1566}
1567
1568static HRESULT DeleteGlobalFilter( __inout LPWSTR *ppwzCustomActionData, IAppHostElement *pSection)
1569{
1570 HRESULT hr = S_OK;
1571
1572 LPWSTR pwzFilterName = NULL;
1573 LPWSTR pwzSiteName = NULL;
1574
1575 IAppHostElementCollection *pCollection = NULL;
1576
1577 hr = pSection->get_Collection(&pCollection);
1578 ExitOnFailure(hr, "Failed get filter collection");
1579
1580 //filter Name key
1581 hr = WcaReadStringFromCaData(ppwzCustomActionData, &pwzFilterName);
1582 ExitOnFailure(hr, "Failed to read filter name");
1583
1584 //web site name
1585 hr = WcaReadStringFromCaData(ppwzCustomActionData, &pwzSiteName); // TODO: unused?
1586 ExitOnFailure(hr, "Failed to read filter site name");
1587
1588 DeleteCollectionElement(pCollection, IIS_CONFIG_FILTER, IIS_CONFIG_NAME, pwzFilterName);
1589 ExitOnFailure(hr, "Failed to delete filter %ls", pwzFilterName);
1590
1591LExit:
1592 ReleaseStr(pwzFilterName);
1593 ReleaseStr(pwzSiteName);
1594 ReleaseObject(pCollection);
1595
1596 return hr;
1597}
1598
1599//-------------------------------------------------------------------------------------------------
1600// IIS7FilterSite
1601// Called by WriteIIS7ConfigChanges
1602// Processes Filter CA Data
1603//
1604//-------------------------------------------------------------------------------------------------
1605HRESULT IIS7FilterSite(
1606 __inout LPWSTR *ppwzCustomActionData,
1607 __in IAppHostWritableAdminManager *pAdminMgr
1608 )
1609{
1610 HRESULT hr = S_OK;
1611 int iAction = 0;
1612
1613 // Get filter action
1614 hr = WcaReadIntegerFromCaData(ppwzCustomActionData, &iAction);
1615 ExitOnFailure(hr, "Failed to read filter action");
1616
1617 while (IIS_FILTER_END != iAction)
1618 {
1619 //Process property action
1620 switch (iAction)
1621 {
1622 case IIS_FILTER :
1623 {
1624 hr = WcaReadIntegerFromCaData(ppwzCustomActionData, &iAction);
1625 ExitOnFailure(hr, "Failed to read filter action");
1626
1627 if (iAction == IIS_CREATE)
1628 {
1629 hr = CreateSiteFilter(ppwzCustomActionData, pAdminMgr);
1630 }
1631 else
1632 {
1633 hr = DeleteSiteFilter(ppwzCustomActionData, pAdminMgr);
1634 }
1635 break;
1636 }
1637 default:
1638 {
1639 ExitOnFailure(hr = E_UNEXPECTED, "Unexpected IIS Config action specified for global filter");
1640 break;
1641 }
1642 }
1643
1644 // Get AppExt action
1645 hr = WcaReadIntegerFromCaData(ppwzCustomActionData, &iAction);
1646 ExitOnFailure(hr, "Failed to read filter action");
1647 }
1648
1649LExit:
1650 return hr;
1651
1652}
1653
1654static HRESULT CreateSiteFilter(__inout LPWSTR *ppwzCustomActionData, IAppHostWritableAdminManager *pAdminMgr)
1655{
1656 HRESULT hr = S_OK;
1657 LPWSTR pwzFilterName = NULL;
1658 LPWSTR pwzSiteName = NULL;
1659 LPWSTR pwzFilterPath = NULL;
1660 LPWSTR pwzConfigPath = NULL;
1661 int iLoadOrder = 0;
1662 DWORD cFilters;
1663
1664 IAppHostElement *pElement = NULL;
1665 IAppHostElement *pSection = NULL;
1666 IAppHostElementCollection *pCollection = NULL;
1667
1668 //filter Name key
1669 hr = WcaReadStringFromCaData(ppwzCustomActionData, &pwzFilterName);
1670 ExitOnFailure(hr, "Failed to read filter name");
1671
1672 //web site name
1673 hr = WcaReadStringFromCaData(ppwzCustomActionData, &pwzSiteName);
1674 ExitOnFailure(hr, "Failed to read filter site name");
1675
1676 //Construct config root
1677 hr = StrAllocFormatted(&pwzConfigPath, L"%s/%s", IIS_CONFIG_APPHOST_ROOT, pwzSiteName);
1678 ExitOnFailure(hr, "failed to format filter config path");
1679
1680 //get admin isapiFilters section at config path location tag
1681 hr = pAdminMgr->GetAdminSection(ScopeBSTR(IIS_CONFIG_ISAPI_SECTION), pwzConfigPath, &pSection);
1682 ExitOnFailure(hr, "Failed get isapiFilters section");
1683
1684 hr = pSection->get_Collection(&pCollection);
1685 ExitOnFailure(hr, "Failed get filter collection");
1686
1687 hr = pCollection->get_Count(&cFilters);
1688 ExitOnFailure(hr, "Failed get filter collection count");
1689
1690 // Attempt to delete, we will we recreate with desired property values and order
1691 hr = DeleteCollectionElement(pCollection, IIS_CONFIG_FILTER, IIS_CONFIG_NAME, pwzFilterName);
1692 ExitOnFailure(hr, "Failed to delete filter");
1693
1694 //make a new element
1695 hr = pCollection->CreateNewElement(ScopeBSTR(IIS_CONFIG_FILTER), &pElement);
1696 ExitOnFailure(hr, "Failed to create filter config element");
1697
1698 hr = Iis7PutPropertyString(pElement,IIS_CONFIG_NAME, pwzFilterName);
1699 ExitOnFailure(hr, "Failed to set filter name");
1700
1701 // filter path
1702 hr = WcaReadStringFromCaData(ppwzCustomActionData, &pwzFilterPath);
1703 ExitOnFailure(hr, "Failed to read filter path");
1704
1705 hr = Iis7PutPropertyString(pElement, IIS_CONFIG_PATH, pwzFilterPath);
1706 ExitOnFailure(hr, "Failed to set filter path");
1707
1708 //filter load order
1709 hr = WcaReadIntegerFromCaData(ppwzCustomActionData, &iLoadOrder);
1710 ExitOnFailure(hr, "Failed to read filter load order");
1711
1712 // put element in order in list
1713 int iPosition = -1;
1714 int icFilters = cFilters;
1715 switch (iLoadOrder)
1716 {
1717 case 0 :
1718 {
1719 iPosition = -1;
1720 break;
1721 }
1722 case -1 :
1723 {
1724 iPosition = icFilters;
1725 break;
1726 }
1727 case MSI_NULL_INTEGER :
1728 {
1729 iPosition = icFilters;
1730 break;
1731 }
1732 default:
1733 {
1734 if (iLoadOrder > icFilters)
1735 {
1736 iPosition = icFilters;
1737 }
1738 else
1739 {
1740 iPosition = iLoadOrder;
1741 }
1742 break;
1743 }
1744 }
1745
1746 hr = pCollection->AddElement(pElement, iPosition);
1747 ExitOnFailure(hr, "Failed to add filter element");
1748
1749LExit:
1750 ReleaseStr(pwzFilterName);
1751 ReleaseStr(pwzSiteName);
1752 ReleaseStr(pwzFilterPath);
1753 ReleaseStr(pwzConfigPath);
1754 ReleaseObject(pElement);
1755 ReleaseObject(pSection);
1756 ReleaseObject(pCollection);
1757
1758 return hr;
1759}
1760
1761static HRESULT DeleteSiteFilter(__inout LPWSTR *ppwzCustomActionData, IAppHostWritableAdminManager *pAdminMgr)
1762{
1763 HRESULT hr = S_OK;
1764 LPWSTR pwzFilterName = NULL;
1765 LPWSTR pwzSiteName = NULL;
1766 LPWSTR pwzConfigPath = NULL;
1767
1768 IAppHostElement *pSection = NULL;
1769 IAppHostElementCollection *pCollection = NULL;
1770
1771 //filter Name key
1772 hr = WcaReadStringFromCaData(ppwzCustomActionData, &pwzFilterName);
1773 ExitOnFailure(hr, "Failed to read filter name");
1774
1775 //web site name
1776 hr = WcaReadStringFromCaData(ppwzCustomActionData, &pwzSiteName);
1777 ExitOnFailure(hr, "Failed to read filter site name");
1778
1779 //Construct config root
1780 hr = StrAllocFormatted(&pwzConfigPath, L"%s/%s", IIS_CONFIG_APPHOST_ROOT, pwzSiteName);
1781 ExitOnFailure(hr, "failed to format filter config path");
1782
1783 //get admin isapiFilters section at config path location tag
1784 hr = pAdminMgr->GetAdminSection(ScopeBSTR(IIS_CONFIG_ISAPI_SECTION), pwzConfigPath, &pSection);
1785 ExitOnFailure(hr, "Failed get isapiFilters section");
1786
1787 hr = pSection->get_Collection(&pCollection);
1788 ExitOnFailure(hr, "Failed get filter collection");
1789
1790 DeleteCollectionElement(pCollection, IIS_CONFIG_FILTER, IIS_CONFIG_NAME, pwzFilterName);
1791 ExitOnFailure(hr, "Failed to delete filter %ls", pwzFilterName);
1792
1793LExit:
1794 ReleaseStr(pwzFilterName);
1795 ReleaseStr(pwzSiteName);
1796 ReleaseStr(pwzConfigPath);
1797 ReleaseObject(pSection);
1798 ReleaseObject(pCollection);
1799
1800 return hr;
1801}
1802
1803//-------------------------------------------------------------------------------------------------
1804// IIS7Site
1805// Called by WriteIIS7ConfigChanges
1806// Processes WebSite CA Data
1807//
1808//-------------------------------------------------------------------------------------------------
1809HRESULT IIS7Site(
1810 __inout LPWSTR *ppwzCustomActionData,
1811 __in IAppHostWritableAdminManager *pAdminMgr)
1812{
1813 HRESULT hr = S_OK;
1814 int iAction = -1;
1815 int iData = 0;
1816 BOOL fFound = FALSE;
1817
1818 LPWSTR pwzSiteName = NULL;
1819 IAppHostElement *pSites = NULL;
1820 IAppHostElementCollection *pCollection = NULL;
1821 IAppHostElement *pSiteElem = NULL;
1822 IAppHostElement *pElement = NULL;
1823
1824 // Get site action
1825 hr = WcaReadIntegerFromCaData(ppwzCustomActionData, &iAction);
1826 ExitOnFailure(hr, "Failed to read site action");
1827
1828 //get site name
1829 hr = WcaReadStringFromCaData(ppwzCustomActionData, &pwzSiteName);
1830 ExitOnFailure(hr, "Failed to read site key");
1831
1832 //Get site if it exists
1833 hr = GetSiteElement(pAdminMgr, pwzSiteName, &pSiteElem, &fFound);
1834 ExitOnFailure(hr, "Failed to read sites from config");
1835
1836 hr = pAdminMgr->GetAdminSection(ScopeBSTR(IIS_CONFIG_SITES_SECTION), ScopeBSTR(IIS_CONFIG_APPHOST_ROOT), &pSites);
1837 ExitOnFailure(hr, "Failed get sites section");
1838 ExitOnNull(pSites, hr, ERROR_FILE_NOT_FOUND, "Failed get sites section object");
1839
1840 hr = pSites->get_Collection( &pCollection);
1841 ExitOnFailure(hr, "Failed get site collection");
1842 switch (iAction)
1843 {
1844 case IIS_DELETE :
1845 {
1846 if (fFound)
1847 {
1848 hr = DeleteCollectionElement(pCollection, IIS_CONFIG_SITE, IIS_CONFIG_NAME, pwzSiteName);
1849 ExitOnFailure(hr, "Failed to delete website");
1850 }
1851 ExitFunction();
1852 break;
1853 }
1854 case IIS_CREATE :
1855 {
1856 if (!fFound)
1857 {
1858 //Create the site
1859 hr = CreateSite(pCollection, pwzSiteName, &pSiteElem);
1860 ExitOnFailure(hr, "Failed to create site");
1861
1862 }
1863 }
1864 }
1865 //
1866 //Set other Site properties
1867 //
1868 //set site Id
1869 hr = WcaReadIntegerFromCaData(ppwzCustomActionData, &iData);
1870 ExitOnFailure(hr, "Failed to read site Id");
1871 if (iData != MSI_NULL_INTEGER && -1 != iData)
1872 {
1873 hr = Iis7PutPropertyInteger(pSiteElem, IIS_CONFIG_SITE_ID, iData);
1874 ExitOnFailure(hr, "Failed set site Id data");
1875 }
1876 //Set Site AutoStart
1877 hr = WcaReadIntegerFromCaData(ppwzCustomActionData, &iData);
1878 ExitOnFailure(hr, "Failed to read site autostart");
1879 if (MSI_NULL_INTEGER != iData)
1880 {
1881 hr = Iis7PutPropertyBool(pSiteElem, IIS_CONFIG_AUTOSTART, iData);
1882 ExitOnFailure(hr, "Failed set site config data");
1883 }
1884
1885 //Set Site Connection timeout
1886 hr = WcaReadIntegerFromCaData(ppwzCustomActionData, &iData);
1887 ExitOnFailure(hr, "Failed to read site connection tomeout data");
1888 if (MSI_NULL_INTEGER != iData)
1889 {
1890 // get limits element, get connectionTimeout property
1891 hr = pSiteElem->GetElementByName(ScopeBSTR(IIS_CONFIG_LIMITS), &pElement);
1892 ExitOnFailure(hr, "Failed to read limits from config");
1893 //convert iData in seconds to timeSpan hh:mm:ss
1894 WCHAR wcTime[60];
1895 *wcTime = '\0';
1896 ConvSecToHMS( iData, wcTime, countof( wcTime));
1897
1898 hr = Iis7PutPropertyString(pElement, IIS_CONFIG_CONNECTTIMEOUT, wcTime);
1899 ExitOnFailure(hr, "IIS: failed set connection timeout config data");
1900 }
1901
1902LExit:
1903 ReleaseStr(pwzSiteName);
1904 ReleaseObject(pSites);
1905 ReleaseObject(pCollection);
1906 ReleaseObject(pSiteElem);
1907 ReleaseObject(pElement);
1908
1909 return hr;
1910}
1911//-------------------------------------------------------------------------------------------------
1912// IIS7Application
1913// Processes Application CA Data
1914//
1915//
1916//-------------------------------------------------------------------------------------------------
1917
1918HRESULT IIS7Application(
1919 __inout LPWSTR *ppwzCustomActionData,
1920 __in IAppHostWritableAdminManager *pAdminMgr)
1921{
1922 HRESULT hr = S_OK;
1923
1924 int iAction = -1;
1925 BOOL fSiteFound = FALSE;
1926 BOOL fAppFound = FALSE;
1927
1928 LPWSTR pwzSiteName = NULL;
1929 LPWSTR pwzAppPath = NULL;
1930 LPWSTR pwzAppPool = NULL;
1931 LPWSTR pwzLocationPath = NULL;
1932 IAppHostElement *pSiteElem = NULL;
1933 IAppHostElement *pAppElement = NULL;
1934 // Get Application action
1935 hr = WcaReadIntegerFromCaData( ppwzCustomActionData, &iAction);
1936 ExitOnFailure(hr, "Failed to read application action")
1937 //get site key name
1938 hr = WcaReadStringFromCaData(ppwzCustomActionData, &pwzSiteName);
1939 ExitOnFailure(hr, "Failed to read app site key");
1940 //get application path
1941 hr = WcaReadStringFromCaData(ppwzCustomActionData, &pwzAppPath);
1942 ExitOnFailure(hr, "Failed to read app path key");
1943 //get application Pool
1944 hr = WcaReadStringFromCaData(ppwzCustomActionData, &pwzAppPool);
1945 ExitOnFailure(hr, "Failed to read app pool key");
1946
1947 //Get site if it exists
1948 hr = GetSiteElement(pAdminMgr, pwzSiteName, &pSiteElem, &fSiteFound);
1949 ExitOnFailure(hr, "Failed to read sites from config");
1950
1951 switch (iAction)
1952 {
1953 case IIS_CREATE :
1954 {
1955 if (fSiteFound)
1956 {
1957 //have site get application collection
1958 hr = GetApplicationElement(pSiteElem,
1959 pwzAppPath,
1960 &pAppElement,
1961 &fAppFound);
1962 ExitOnFailure(hr, "Error reading application from config");
1963
1964 if (!fAppFound)
1965 {
1966 //Create Application
1967 hr = CreateApplication(pSiteElem, pwzAppPath, &pAppElement);
1968 ExitOnFailure(hr, "Error creating application in config");
1969 }
1970 //Update application properties:
1971 //
1972 //Set appPool
1973 hr = SetAppPool(pAppElement, pwzAppPool);
1974 ExitOnFailure(hr, "Unable to set appPool for application");
1975 }
1976 else
1977 {
1978 hr = HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND);
1979 ExitOnFailure(hr, "Site not found for create application");
1980 }
1981 break;
1982 }
1983 case IIS_DELETE :
1984 {
1985 if (fSiteFound)
1986 {
1987 //have site get application collection
1988 hr = GetApplicationElement( pSiteElem,
1989 pwzAppPath,
1990 &pAppElement,
1991 &fAppFound);
1992 ExitOnFailure(hr, "Error reading application from config")
1993 if (fAppFound)
1994 {
1995 //delete Application
1996 hr = DeleteApplication(pSiteElem, pwzAppPath);
1997 ExitOnFailure(hr, "Error deleating application from config")
1998 //Construct Location path
1999 // TODO: it seems odd that these are just
2000 // jammed together, need to determine if this requires a '\'
2001 hr = StrAllocString(&pwzLocationPath, pwzSiteName, 0);
2002 ExitOnFailure(hr, "failed to copy location config path web name");
2003 hr = StrAllocConcat(&pwzLocationPath, pwzAppPath, 0);
2004 ExitOnFailure(hr, "failed to copy location config path appPath ");
2005
2006 // and delete location tag for this application
2007 hr = ClearLocationTag(pAdminMgr, pwzLocationPath);
2008 ExitOnFailure(hr, "failed to clear location tag for %ls", pwzLocationPath);
2009 }
2010 }
2011 break;
2012 }
2013 default:
2014 ExitOnFailure(hr = E_UNEXPECTED, "Unexpected IIS Config action specified for Application");
2015 break;
2016 }
2017
2018LExit:
2019 ReleaseStr(pwzSiteName);
2020 ReleaseStr(pwzAppPath);
2021 ReleaseStr(pwzAppPool);
2022 ReleaseStr(pwzLocationPath);
2023 ReleaseObject(pSiteElem);
2024 ReleaseObject(pAppElement);
2025
2026 return hr;
2027}
2028//-------------------------------------------------------------------------------------------------
2029// IIS7VDir
2030// Processes VDir CA Data
2031//
2032//
2033//-------------------------------------------------------------------------------------------------
2034HRESULT IIS7VDir(
2035 __inout LPWSTR *ppwzCustomActionData,
2036 __in IAppHostWritableAdminManager *pAdminMgr)
2037{
2038 HRESULT hr = S_OK;
2039
2040 int iAction = -1;
2041 BOOL fSiteFound = FALSE;
2042 BOOL fAppFound = FALSE;
2043
2044 LPWSTR pwzSiteName = NULL;
2045 LPWSTR pwzVDirPath = NULL;
2046 LPWSTR pwzVDirPhyDir = NULL;
2047 LPCWSTR pwzVDirSubPath = NULL;
2048
2049 IAppHostElement *pSiteElem = NULL;
2050 IAppHostElement *pAppElement = NULL;
2051 IAppHostElementCollection *pElement = NULL;
2052
2053 // Get Application action
2054 hr = WcaReadIntegerFromCaData(ppwzCustomActionData, &iAction);
2055 ExitOnFailure(hr, "Failed to read VDir action");
2056
2057 //get site key name
2058 hr = WcaReadStringFromCaData(ppwzCustomActionData, &pwzSiteName);
2059 ExitOnFailure(hr, "Failed to read site key");
2060 //get VDir path
2061 hr = WcaReadStringFromCaData(ppwzCustomActionData, &pwzVDirPath);
2062 ExitOnFailure(hr, "Failed to read VDir key");
2063 //get physical dir path
2064 hr = WcaReadStringFromCaData(ppwzCustomActionData, &pwzVDirPhyDir);
2065 ExitOnFailure(hr, "Failed to read VDirPath key");
2066
2067 //Get site if it exists
2068 hr = GetSiteElement(pAdminMgr, pwzSiteName, &pSiteElem, &fSiteFound);
2069 ExitOnFailure(hr, "Failed to read sites from config");
2070
2071 if (IIS_CREATE == iAction)
2072 {
2073 if (fSiteFound)
2074 {
2075 //have site get application
2076 hr = GetApplicationElementForVDir( pSiteElem,
2077 pwzVDirPath,
2078 &pAppElement,
2079 &pwzVDirSubPath,
2080 &fAppFound);
2081 ExitOnFailure(hr, "Error reading application element from config");
2082
2083 if (!fAppFound)
2084 {
2085 // need application to add vDir
2086 hr = E_FILENOTFOUND;
2087 ExitOnFailure(hr, "Error application not found for create VDir");
2088 }
2089 //
2090 // create the virDir
2091 //
2092 hr = CreateVdir(pAppElement, pwzVDirSubPath, pwzVDirPhyDir);
2093 ExitOnFailure(hr, "Failed to create vdir for application");
2094 }
2095 else
2096 {
2097 hr = E_FILENOTFOUND;
2098 ExitOnFailure(hr, "IIS: site not found for create VDir");
2099 }
2100 }
2101 else if (IIS_DELETE == iAction)
2102 {
2103 if (fSiteFound)
2104 {
2105 //have site get application
2106 hr = GetApplicationElementForVDir( pSiteElem,
2107 pwzVDirPath,
2108 &pAppElement,
2109 &pwzVDirSubPath,
2110 &fAppFound);
2111 ExitOnFailure(hr, "Error reading application from config")
2112 if (fAppFound)
2113 {
2114 //delete vdir
2115 hr = DeleteVdir(pAppElement, pwzVDirSubPath);
2116 ExitOnFailure(hr, "Unable to delete vdir for application");
2117 }
2118 }
2119 }
2120
2121 LExit:
2122 ReleaseStr(pwzSiteName);
2123 ReleaseStr(pwzVDirPath);
2124 ReleaseStr(pwzVDirPhyDir);
2125 ReleaseObject(pSiteElem);
2126 ReleaseObject(pAppElement);
2127 ReleaseObject(pElement);
2128
2129 return hr;
2130}
2131
2132//-------------------------------------------------------------------------------------------------
2133// IIS7Binding
2134// Processes Bindings CA Data
2135//
2136//
2137//-------------------------------------------------------------------------------------------------
2138HRESULT IIS7Binding(
2139 __inout LPWSTR *ppwzCustomActionData,
2140 __in IAppHostWritableAdminManager *pAdminMgr)
2141{
2142 HRESULT hr = S_OK;
2143
2144 int iAction = -1;
2145 BOOL fSiteFound = FALSE;
2146
2147 LPWSTR pwzSiteName = NULL;
2148 LPWSTR pwzProtocol = NULL;
2149 LPWSTR pwzInfo = NULL;
2150
2151 IAppHostElement *pSiteElem = NULL;
2152
2153 // Get Application action
2154 hr = WcaReadIntegerFromCaData( ppwzCustomActionData, &iAction);
2155 ExitOnFailure(hr, "Failed to read binding action");
2156
2157 //get site key name
2158 hr = WcaReadStringFromCaData(ppwzCustomActionData, &pwzSiteName);
2159 ExitOnFailure(hr, "Failed to read binding site name key");
2160
2161 //get binding protocol
2162 hr = WcaReadStringFromCaData(ppwzCustomActionData, &pwzProtocol);
2163 ExitOnFailure(hr, "Failed to read binding protocol");
2164
2165 //get binding info
2166 hr = WcaReadStringFromCaData(ppwzCustomActionData, &pwzInfo);
2167 ExitOnFailure(hr, "Failed to read binding info");
2168
2169 //Get site if it exists
2170 hr = GetSiteElement(pAdminMgr, pwzSiteName, &pSiteElem, &fSiteFound);
2171 ExitOnFailure(hr, "Failed to read sites from config");
2172
2173 if (IIS_CREATE == iAction)
2174 {
2175 if (fSiteFound)
2176 {
2177 //add binding
2178 hr = CreateBinding(pSiteElem, pwzProtocol, pwzInfo);
2179 ExitOnFailure(hr, "Failed to create site binding");
2180 }
2181 else
2182 {
2183 hr = HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND);
2184 ExitOnFailure(hr, "Site not found for create binding");
2185 }
2186 }
2187 else if (IIS_DELETE == iAction)
2188 {
2189 if (fSiteFound)
2190 {
2191 //delete binding
2192 hr = DeleteBinding(pSiteElem, pwzProtocol, pwzInfo);
2193 ExitOnFailure(hr, "Failed to delete binding");
2194 }
2195 }
2196
2197 LExit:
2198 ReleaseStr(pwzSiteName);
2199 ReleaseStr(pwzProtocol);
2200 ReleaseStr(pwzInfo);
2201 ReleaseObject(pSiteElem);
2202
2203 return hr;
2204}
2205//-------------------------------------------------------------------------------------------------
2206// IIS7Binding
2207// Processes WebLog CA Data
2208//
2209//
2210//-------------------------------------------------------------------------------------------------
2211HRESULT IIS7WebLog(
2212 __inout LPWSTR *ppwzCustomActionData,
2213 __in IAppHostWritableAdminManager *pAdminMgr)
2214{
2215 HRESULT hr = S_OK;
2216
2217 BOOL fSiteFound = FALSE;
2218
2219 LPWSTR pwzSiteName = NULL;
2220 LPWSTR pwzLogFormat = NULL;
2221
2222 IAppHostElement *pSiteElem = NULL;
2223
2224 //get site key name
2225 hr = WcaReadStringFromCaData(ppwzCustomActionData, &pwzSiteName);
2226 ExitOnFailure(hr, "Failed to read web log site name key");
2227
2228 //get log format
2229 hr = WcaReadStringFromCaData(ppwzCustomActionData, &pwzLogFormat);
2230 ExitOnFailure(hr, "Failed to read web log protocol");
2231
2232 //Get site if it exists
2233 hr = GetSiteElement(pAdminMgr, pwzSiteName, &pSiteElem, &fSiteFound);
2234 ExitOnFailure(hr, "Failed to read web log sites from config");
2235
2236 if (fSiteFound)
2237 {
2238 //add log format
2239 hr = CreateWebLog(pSiteElem, pwzLogFormat);
2240 ExitOnFailure(hr, "Failed to create weblog file format");
2241 }
2242 else
2243 {
2244 hr = HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND);
2245 ExitOnFailure(hr, "Site not found for create weblog file format");
2246 }
2247
2248 LExit:
2249 ReleaseStr(pwzSiteName);
2250 ReleaseStr(pwzLogFormat);
2251 ReleaseObject(pSiteElem);
2252
2253 return hr;
2254}
2255//-------------------------------------------------------------------------------------------------
2256// IIS7AppPool
2257// Processes AppPool CA Data
2258//
2259//
2260//-------------------------------------------------------------------------------------------------
2261HRESULT IIS7AppPool(
2262 __inout LPWSTR *ppwzCustomActionData,
2263 __in IAppHostWritableAdminManager *pAdminMgr
2264 )
2265{
2266 HRESULT hr = S_OK;
2267
2268 int iAction = -1;
2269
2270 LPWSTR pwzAppPoolName = NULL;
2271
2272 // Get AppPool action
2273 hr = WcaReadIntegerFromCaData( ppwzCustomActionData, &iAction);
2274 ExitOnFailure(hr, "Failed to read AppPool action");
2275
2276 //get appPool name
2277 hr = WcaReadStringFromCaData(ppwzCustomActionData, &pwzAppPoolName);
2278 ExitOnFailure(hr, "Failed to read AppPool name key");
2279
2280 switch (iAction)
2281 {
2282 case IIS_CREATE :
2283 {
2284 hr = CreateAppPool(ppwzCustomActionData, pAdminMgr, pwzAppPoolName);
2285 break;
2286 }
2287 case IIS_DELETE:
2288 {
2289 hr = DeleteAppPool(pAdminMgr, pwzAppPoolName);
2290 break;
2291 }
2292 default:
2293 ExitOnFailure(hr = E_UNEXPECTED, "Unexpected IIS Config action specified for appPool");
2294 break;
2295 }
2296
2297LExit:
2298 ReleaseStr(pwzAppPoolName);
2299 return hr;
2300}
2301
2302//-------------------------------------------------------------------------------------------------
2303// IIS7AppExtension
2304// Processes AppExtension (config handlers) CA Data
2305//
2306//
2307//-------------------------------------------------------------------------------------------------
2308HRESULT IIS7AppExtension(
2309 __inout LPWSTR *ppwzCustomActionData,
2310 __in IAppHostWritableAdminManager *pAdminMgr)
2311{
2312 HRESULT hr = S_OK;
2313
2314 LPWSTR pwzWebName = NULL;
2315 LPWSTR pwzWebRoot = NULL;
2316 LPWSTR pwzData = NULL;
2317 LPWSTR pwzConfigPath = NULL;
2318 LPWSTR pwzHandlerName = NULL;
2319 LPWSTR pwzPath = NULL;
2320 int iAction = -1;
2321
2322 IAppHostElement *pSection = NULL;
2323 IAppHostElement *pElement = NULL;
2324 IAppHostElementCollection *pCollection = NULL;
2325
2326 BOOL fFound = FALSE;
2327 DWORD cHandlers = 1000;
2328
2329 //get web name
2330 hr = WcaReadStringFromCaData(ppwzCustomActionData, &pwzWebName);
2331 ExitOnFailure(hr, "Failed to read appExt Web name key");
2332
2333 //get root name
2334 hr = WcaReadStringFromCaData(ppwzCustomActionData, &pwzWebRoot);
2335 ExitOnFailure(hr, "Failed to read appExt Web name key");
2336
2337 //Construct config root
2338 hr = StrAllocFormatted(&pwzConfigPath, L"%s/%s", IIS_CONFIG_APPHOST_ROOT, pwzWebName);
2339 ExitOnFailure(hr, "failed to format appext config path");
2340 //
2341 //Do not append trailing '/' for default vDir
2342 //
2343 if (CSTR_EQUAL != ::CompareStringW(LOCALE_INVARIANT, NORM_IGNORECASE, pwzWebRoot, -1, L"/", -1))
2344 {
2345 hr = StrAllocConcat(&pwzConfigPath, L"/", 0);
2346 ExitOnFailure(hr, "failed to copy appext config path delim");
2347 hr = StrAllocConcat(&pwzConfigPath, pwzWebRoot, 0);
2348 ExitOnFailure(hr, "failed to copy appext config path root name");
2349 }
2350 //get admin handlers section at config path location tag
2351 hr = pAdminMgr->GetAdminSection(ScopeBSTR(IIS_CONFIG_HANDLERS_SECTION), pwzConfigPath, &pSection);
2352 ExitOnFailure(hr, "Failed get appext section");
2353
2354 if (!pSection)
2355 {
2356 hr = HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND);
2357 ExitOnFailure(hr, "Failed get appext section object");
2358 }
2359
2360 // Get AppExt action
2361 hr = WcaReadIntegerFromCaData(ppwzCustomActionData, &iAction);
2362 ExitOnFailure(hr, "Failed to read appExt action");
2363
2364 hr = pSection->get_Collection(&pCollection);
2365 ExitOnFailure(hr, "Failed get handlers collection for appext");
2366
2367 while (IIS_APPEXT_END != iAction)
2368 {
2369 fFound = FALSE;
2370
2371 //Process property action
2372 switch (iAction)
2373 {
2374 case IIS_APPEXT :
2375 {
2376 // These IDs aren't really stable but this is stable enough to support repair since the MSI won't change
2377 hr = StrAllocFormatted(&pwzHandlerName, L"MsiCustom-%u", ++cHandlers);
2378 ExitOnFailure(hr, "Failed increment handler name");
2379
2380 hr = Iis7FindAppHostElementString(pCollection, IIS_CONFIG_ADD, IIS_CONFIG_NAME, pwzHandlerName, &pElement, NULL);
2381 ExitOnFailure(hr, "Failed to find mimemap extension");
2382
2383 fFound = (NULL != pElement);
2384 if (!fFound)
2385 {
2386 //create new handler element
2387 hr = pCollection->CreateNewElement(ScopeBSTR(IIS_CONFIG_ADD), &pElement);
2388 ExitOnFailure(hr, "Failed get create handler element for appext");
2389
2390 hr = Iis7PutPropertyString(pElement, IIS_CONFIG_NAME, pwzHandlerName);
2391 ExitOnFailure(hr, "Failed set appext name property");
2392 }
2393
2394 //BUGBUG: For compat we are assuming these are all ISAPI MODULES so we are
2395 //setting the modules property to IsapiModule.
2396 //Currently can't deal with handlers of different module types.
2397 hr = Iis7PutPropertyString(pElement, IIS_CONFIG_MODULES, L"IsapiModule");
2398 ExitOnFailure(hr, "Failed set site appExt path property");
2399
2400 //get extension (path)
2401 hr = WcaReadStringFromCaData(ppwzCustomActionData, &pwzData);
2402 ExitOnFailure(hr, "Failed to read appExt extension");
2403 hr = StrAllocFormatted(&pwzPath, L"*.%s", pwzData);
2404 ExitOnFailure(hr, "Failed decorate appExt path");
2405 //put property
2406 hr = Iis7PutPropertyString(pElement, IIS_CONFIG_PATH, pwzPath);
2407 ExitOnFailure(hr, "Failed set site appExt path property");
2408
2409 //get executable
2410 hr = WcaReadStringFromCaData(ppwzCustomActionData, &pwzData);
2411 ExitOnFailure(hr, "Failed to read appExt executable");
2412 //put property
2413 hr = Iis7PutPropertyString(pElement, IIS_CONFIG_EXECUTABLE, pwzData);
2414 ExitOnFailure(hr, "Failed set site appExt executable property");
2415
2416 //get verbs
2417 hr = WcaReadStringFromCaData(ppwzCustomActionData, &pwzData);
2418 ExitOnFailure(hr, "Failed to read appExt verbs");
2419 //put property
2420 hr = Iis7PutPropertyString(pElement, IIS_CONFIG_VERBS, pwzData);
2421 ExitOnFailure(hr, "Failed set site appExt verbs property");
2422
2423 break;
2424 }
2425 default:
2426 {
2427 ExitOnFailure(hr = E_UNEXPECTED, "Unexpected IIS Config action specified for AppExt");
2428 break;
2429 }
2430 }
2431
2432 if (!fFound)
2433 {
2434 // put handler element at beginning of list
2435 hr = pCollection->AddElement(pElement, 0);
2436 ExitOnFailure(hr, "Failed add handler element for appext");
2437 }
2438
2439 ReleaseNullObject(pElement);
2440
2441 // Get AppExt action
2442 hr = WcaReadIntegerFromCaData(ppwzCustomActionData, &iAction);
2443 ExitOnFailure(hr, "Failed to read AppPool Property action");
2444 }
2445
2446LExit:
2447 ReleaseStr(pwzWebName);
2448 ReleaseStr(pwzWebRoot);
2449 ReleaseStr(pwzData);
2450 ReleaseStr(pwzConfigPath);
2451 ReleaseStr(pwzHandlerName);
2452 ReleaseStr(pwzPath);
2453 ReleaseObject(pSection);
2454 ReleaseObject(pElement);
2455 ReleaseObject(pCollection);
2456
2457 return hr;
2458}
2459
2460//-------------------------------------------------------------------------------------------------
2461// IIS7MimeMap
2462// Processes Mime Map (config handlers) CA Data
2463//
2464//
2465//-------------------------------------------------------------------------------------------------
2466 HRESULT IIS7MimeMap(
2467 __inout LPWSTR *ppwzCustomActionData,
2468 __in IAppHostWritableAdminManager *pAdminMgr
2469 )
2470{
2471 HRESULT hr = S_OK;
2472 LPWSTR pwzConfigPath = NULL;
2473 LPWSTR pwzWebName = NULL;
2474 LPWSTR pwzWebRoot = NULL;
2475 LPWSTR pwzData = NULL;
2476 int iAction = -1;
2477
2478 IAppHostElement *pSection = NULL;
2479 IAppHostElement *pElement = NULL;
2480 IAppHostElementCollection *pCollection = NULL;
2481
2482 BOOL fFound = FALSE;
2483
2484 //get web name
2485 hr = WcaReadStringFromCaData(ppwzCustomActionData, &pwzWebName);
2486 ExitOnFailure(hr, "Failed to read mime map Web name key");
2487
2488 //get vdir root name
2489 hr = WcaReadStringFromCaData(ppwzCustomActionData, &pwzWebRoot);
2490 ExitOnFailure(hr, "Failed to read vdir root name key");
2491
2492 //Construct config root
2493 hr = StrAllocFormatted(&pwzConfigPath, L"%s/%s", IIS_CONFIG_APPHOST_ROOT, pwzWebName);
2494 ExitOnFailure(hr, "failed to format mime map config path web name");
2495 //
2496 //Do not append trailing '/' for default vDir
2497 //
2498 if (CSTR_EQUAL != ::CompareStringW(LOCALE_INVARIANT, NORM_IGNORECASE, pwzWebRoot, -1, L"/", -1))
2499 {
2500 hr = StrAllocConcat(&pwzConfigPath, L"/", 0);
2501 ExitOnFailure(hr, "failed to copy appext config path delim");
2502 hr = StrAllocConcat(&pwzConfigPath, pwzWebRoot, 0);
2503 ExitOnFailure(hr, "failed to copy appext config path root name");
2504 }
2505
2506 //get admin section <staticContent> at config path location tag
2507 hr = pAdminMgr->GetAdminSection(ScopeBSTR(IIS_CONFIG_STATICCONTENT_SECTION), pwzConfigPath, &pSection);
2508 ExitOnFailure(hr, "Failed get staticContent section for mimemap");
2509
2510 if (!pSection)
2511 {
2512 hr = HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND);
2513 ExitOnFailure(hr, "Failed get staticContent section object");
2514 }
2515
2516 // Get mimemap action
2517 hr = WcaReadIntegerFromCaData(ppwzCustomActionData, &iAction);
2518 ExitOnFailure(hr, "Failed to read mimemap action");
2519
2520 hr = pSection->get_Collection(&pCollection);
2521 ExitOnFailure(hr, "Failed get staticContent collection for mimemap");
2522
2523 while (IIS_MIMEMAP_END != iAction)
2524 {
2525 //Process property action
2526 switch (iAction)
2527 {
2528 case IIS_MIMEMAP :
2529 {
2530 //get extension
2531 hr = WcaReadStringFromCaData(ppwzCustomActionData, &pwzData);
2532 ExitOnFailure(hr, "Failed to read mimemap extension");
2533
2534 hr = Iis7FindAppHostElementString(pCollection, IIS_CONFIG_MIMEMAP, IIS_CONFIG_FILEEXT, pwzData, &pElement, NULL);
2535 ExitOnFailure(hr, "Failed to find mimemap extension");
2536 fFound = (NULL != pElement);
2537
2538 if (!fFound)
2539 {
2540 //create new mimeMap element
2541 hr = pCollection->CreateNewElement(ScopeBSTR(IIS_CONFIG_MIMEMAP), &pElement);
2542 ExitOnFailure(hr, "Failed get create MimeMap element");
2543 }
2544
2545 //put property
2546 hr = Iis7PutPropertyString(pElement, IIS_CONFIG_FILEEXT, pwzData);
2547 ExitOnFailure(hr, "Failed set mimemap extension property");
2548
2549 //get type
2550 hr = WcaReadStringFromCaData(ppwzCustomActionData, &pwzData);
2551 ExitOnFailure(hr, "Failed to read mimemap type");
2552 //put property
2553 hr = Iis7PutPropertyString(pElement, IIS_CONFIG_MIMETYPE, pwzData);
2554 ExitOnFailure(hr, "Failed set mimemap type property");
2555
2556 break;
2557 }
2558 default:
2559 {
2560 ExitOnFailure(hr = E_UNEXPECTED, "Unexpected IIS Config action specified for mimeMap");
2561 break;
2562 }
2563 }
2564
2565 if (!fFound)
2566 {
2567 // put mimeMap element at beginning of list
2568 hr = pCollection->AddElement(pElement, -1);
2569 ExitOnFailure(hr, "Failed add mimemap");
2570 }
2571
2572 // Get AppExt action
2573 hr = WcaReadIntegerFromCaData(ppwzCustomActionData, &iAction);
2574 ExitOnFailure(hr, "Failed to read mimemap action");
2575
2576 ReleaseNullObject(pElement);
2577 }
2578
2579LExit:
2580 ReleaseStr(pwzConfigPath);
2581 ReleaseStr(pwzWebName);
2582 ReleaseStr(pwzWebRoot);
2583 ReleaseStr(pwzData);
2584 ReleaseObject(pSection);
2585 ReleaseObject(pElement);
2586 ReleaseObject(pCollection);
2587
2588 return hr;
2589}
2590
2591//-------------------------------------------------------------------------------------------------
2592// IIS7DirProperties
2593// ProcessesVdir Properties CA Data
2594//
2595//
2596//-------------------------------------------------------------------------------------------------
2597HRESULT IIS7DirProperties(
2598 __inout LPWSTR *ppwzCustomActionData,
2599 __in IAppHostWritableAdminManager *pAdminMgr
2600 )
2601{
2602 HRESULT hr = S_OK;
2603 WCHAR wcTime[60];
2604 LPWSTR pwzConfigPath = NULL;
2605 LPWSTR pwzWebName = NULL;
2606 LPWSTR pwzWebRoot = NULL;
2607 LPWSTR pwzData = NULL;
2608 int iAction = -1;
2609 int iData = 0;
2610 DWORD dwData = 0;
2611
2612 IAppHostElement *pSection = NULL;
2613 IAppHostElement *pElement = NULL;
2614 IAppHostElementCollection *pCollection = NULL;
2615
2616 //get web name
2617 hr = WcaReadStringFromCaData(ppwzCustomActionData, &pwzWebName);
2618 ExitOnFailure(hr, "Failed to read DirProp Web name key");
2619
2620 //get vdir root name
2621 hr = WcaReadStringFromCaData(ppwzCustomActionData, &pwzWebRoot);
2622 ExitOnFailure(hr, "Failed to read DirProp Web name key");
2623
2624 //Construct config root
2625 hr = StrAllocFormatted(&pwzConfigPath, L"%s/%s", IIS_CONFIG_APPHOST_ROOT, pwzWebName);
2626 ExitOnFailure(hr, "failed to format mime map config path web name");
2627 //
2628 //Do not append trailing '/' for default vDir
2629 //
2630 if (CSTR_EQUAL != ::CompareStringW(LOCALE_INVARIANT, NORM_IGNORECASE, pwzWebRoot, -1, L"/", -1))
2631 {
2632 hr = StrAllocConcat(&pwzConfigPath, L"/", 0);
2633 ExitOnFailure(hr, "failed to copy appext config path delim");
2634 hr = StrAllocConcat(&pwzConfigPath, pwzWebRoot, 0);
2635 ExitOnFailure(hr, "failed to copy appext config path root name");
2636 }
2637
2638 // Get DirProps action
2639 hr = WcaReadIntegerFromCaData(ppwzCustomActionData, &iAction);
2640 ExitOnFailure(hr, "Failed to read DirProps action");
2641
2642 while (IIS_DIRPROP_END != iAction)
2643 {
2644 //Process property action
2645 switch (iAction)
2646 {
2647 case IIS_DIRPROP_ACCESS :
2648 {
2649 hr = WcaReadIntegerFromCaData(ppwzCustomActionData, &iData);
2650 ExitOnFailure(hr, "Failed to read DirProps access");
2651 //iData contains bit flags for <handlers accessPolicy="">
2652 //no translation required
2653 //get admin section at config path location tag
2654 hr = pAdminMgr->GetAdminSection(ScopeBSTR(IIS_CONFIG_HANDLERS_SECTION), pwzConfigPath, &pSection);
2655 ExitOnFailure(hr, "Failed get handlers section for DirProp");
2656 if (!pSection)
2657 {
2658 hr = HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND);
2659 ExitOnFailure(hr, "Failed get handlers section object for DirProps");
2660 }
2661 dwData = iData;
2662 hr = Iis7PutPropertyInteger( pSection, L"accessPolicy", dwData);
2663 ExitOnFailure(hr, "Failed set accessPolicy for DirProps");
2664 ReleaseNullObject(pSection);
2665 break;
2666 }
2667 case IIS_DIRPROP_USER :
2668 {
2669 hr = WcaReadStringFromCaData(ppwzCustomActionData, &pwzData);
2670 ExitOnFailure(hr, "Failed to read DirProps user");
2671 hr = pAdminMgr->GetAdminSection(ScopeBSTR(L"system.webServer/security/authentication/anonymousAuthentication"), pwzConfigPath, &pSection);
2672 ExitOnFailure(hr, "Failed get AnonymousAuthentication section for DirProp");
2673 hr = Iis7PutPropertyString( pSection, IIS_CONFIG_USERNAME, pwzData);
2674 ExitOnFailure(hr, "Failed set accessPolicy for DirProps");
2675 ReleaseNullObject(pSection);
2676 break;
2677 }
2678 case IIS_DIRPROP_PWD :
2679 {
2680 hr = WcaReadStringFromCaData(ppwzCustomActionData, &pwzData);
2681 ExitOnFailure(hr, "Failed to read DirProps pwd");
2682 hr = pAdminMgr->GetAdminSection(ScopeBSTR(L"system.webServer/security/authentication/anonymousAuthentication"), pwzConfigPath, &pSection);
2683 ExitOnFailure(hr, "Failed get AnonymousAuthentication section for DirProp");
2684 hr = Iis7PutPropertyString( pSection, IIS_CONFIG_PASSWORD, pwzData);
2685 ExitOnFailure(hr, "Failed set accessPolicy for DirProps");
2686 ReleaseNullObject(pSection);
2687 break;
2688 }
2689 case IIS_DIRPROP_DEFDOCS :
2690 {
2691 hr = WcaReadStringFromCaData(ppwzCustomActionData, &pwzData);
2692 ExitOnFailure(hr, "Failed to read DirProps def doc");
2693 hr = SetDirPropDefDoc(pAdminMgr, pwzConfigPath, pwzData);
2694 ExitOnFailure(hr, "Failed to set DirProps Default Documents");
2695 break;
2696 }
2697 case IIS_DIRPROP_AUTH :
2698 {
2699 hr = WcaReadIntegerFromCaData(ppwzCustomActionData, &iData);
2700 ExitOnFailure(hr, "Failed to read DirProps auth");
2701 //iData contains bit flags for /security/authentication/<...>
2702 // Anonymous = 1
2703 // Basic = 2
2704 // Windows = 4
2705 // Digest =16
2706 // Passport =64 *not supported
2707 //translation required from bit map to section
2708 // E.G security/authentication/windowsAuthentication [property enabled true|false]
2709 dwData= iData;
2710 hr = SetDirPropAuthentications(pAdminMgr, pwzConfigPath, dwData);
2711 ExitOnFailure(hr, "Failed set Authentication for DirProps");
2712 break;
2713 }
2714 case IIS_DIRPROP_SSLFLAGS :
2715 {
2716 hr = WcaReadIntegerFromCaData(ppwzCustomActionData, &iData);
2717 ExitOnFailure(hr, "Failed to read DirProps sslFlags");
2718 //iData contains bit flags for /security/access sslFlags
2719 //no translation required
2720 hr = pAdminMgr->GetAdminSection(ScopeBSTR(L"system.webServer/security/access"), pwzConfigPath, &pSection);
2721 ExitOnFailure(hr, "Failed get security/access section for DirProp");
2722 dwData = iData;
2723 hr = Iis7PutPropertyInteger( pSection, L"sslFlags", dwData);
2724 ExitOnFailure(hr, "Failed set security/access for DirProps");
2725 ReleaseNullObject(pSection);
2726 break;
2727 }
2728 case IIS_DIRPROP_AUTHPROVID :
2729 {
2730 hr = WcaReadStringFromCaData(ppwzCustomActionData, &pwzData);
2731 ExitOnFailure(hr, "Failed to read DirProps auth provider");
2732 hr = SetDirPropAuthProvider(pAdminMgr, pwzConfigPath, pwzData);
2733 ExitOnFailure(hr, "Failed to set DirProps auth provider");
2734 break;
2735 }
2736 case IIS_DIRPROP_ASPERROR:
2737 {
2738 hr = WcaReadIntegerFromCaData(ppwzCustomActionData, &iData);
2739 ExitOnFailure(hr, "Failed to read DirProps aspDetailedError");
2740 hr = pAdminMgr->GetAdminSection(ScopeBSTR(IIS_CONFIG_ASP_SECTION), pwzConfigPath, &pSection);
2741 ExitOnFailure(hr, "Failed get asp section for DirProp");
2742 hr = Iis7PutPropertyBool(pSection, IIS_CONFIG_SCRIPTERROR, iData);
2743 ExitOnFailure(hr, "Failed to set DirProps aspDetailedError");
2744 ReleaseNullObject(pSection);
2745 break;
2746 }
2747 case IIS_DIRPROP_HTTPEXPIRES:
2748 {
2749 hr = WcaReadStringFromCaData(ppwzCustomActionData, &pwzData);
2750 ExitOnFailure(hr, "Failed to read DirProps httpExpires provider");
2751 hr = pAdminMgr->GetAdminSection(ScopeBSTR(IIS_CONFIG_STATICCONTENT_SECTION), pwzConfigPath, &pSection);
2752 ExitOnFailure(hr, "Failed get staticContent section for DirProp");
2753 hr = pSection->GetElementByName(ScopeBSTR(IIS_CONFIG_CLIENTCACHE), &pElement);
2754 ExitOnFailure(hr, "Failed to get clientCache element");
2755 hr = Iis7PutPropertyString(pElement, IIS_CONFIG_HTTPEXPIRES, pwzData);
2756 ExitOnFailure(hr, "Failed to set clientCache httpExpires value");
2757 hr = Iis7PutPropertyString(pElement, IIS_CONFIG_CACHECONTROLMODE, IIS_CONFIG_USEEXPIRES);
2758 ExitOnFailure(hr, "Failed to set clientCache cacheControlMode value");
2759 ReleaseNullObject(pSection);
2760 ReleaseNullObject(pElement);
2761 break;
2762 }
2763 case IIS_DIRPROP_MAXAGE:
2764 {
2765 hr = WcaReadIntegerFromCaData(ppwzCustomActionData, &iData);
2766 ExitOnFailure(hr, "Failed to read DirProps httpExpires provider");
2767 hr = pAdminMgr->GetAdminSection(ScopeBSTR(IIS_CONFIG_STATICCONTENT_SECTION), pwzConfigPath, &pSection);
2768 ExitOnFailure(hr, "Failed get staticContent section for DirProp");
2769 hr = pSection->GetElementByName(ScopeBSTR(IIS_CONFIG_CLIENTCACHE), &pElement);
2770 ExitOnFailure(hr, "Failed to get clientCache element");
2771 *wcTime = '\0';
2772 ConvSecToDHMS(iData, wcTime, countof(wcTime));
2773 hr = Iis7PutPropertyString(pElement, IIS_CONFIG_MAXAGE, wcTime);
2774 ExitOnFailure(hr, "Failed to set clientCache maxAge value");
2775 hr = Iis7PutPropertyString(pElement, IIS_CONFIG_CACHECONTROLMODE, IIS_CONFIG_USEMAXAGE);
2776 ExitOnFailure(hr, "Failed to set clientCache cacheControlMode value");
2777 ReleaseNullObject(pSection);
2778 ReleaseNullObject(pElement);
2779 break;
2780 }
2781 case IIS_DIRPROP_CACHECUST:
2782 {
2783 hr = WcaReadStringFromCaData(ppwzCustomActionData, &pwzData);
2784 ExitOnFailure(hr, "Failed to read DirProps cacheControlCustom");
2785 hr = pAdminMgr->GetAdminSection(ScopeBSTR(IIS_CONFIG_STATICCONTENT_SECTION), pwzConfigPath, &pSection);
2786 ExitOnFailure(hr, "Failed get staticContent section for DirProp");
2787 hr = pSection->GetElementByName(ScopeBSTR(IIS_CONFIG_CLIENTCACHE), &pElement);
2788 ExitOnFailure(hr, "Failed to get clientCache element");
2789 hr = Iis7PutPropertyString(pElement, IIS_CONFIG_CACHECUST, pwzData);
2790 ExitOnFailure(hr, "Failed to set clientCache cacheControlCustom value");
2791 ReleaseNullObject(pSection);
2792 ReleaseNullObject(pElement);
2793 break;
2794 }
2795 case IIS_DIRPROP_NOCUSTERROR:
2796 {
2797 //no value, if have ID tag write clear to system.webServer/httpErrors
2798 //error collection
2799 hr = pAdminMgr->GetAdminSection(ScopeBSTR(IIS_CONFIG_HTTPERRORS_SECTION), pwzConfigPath, &pSection);
2800 ExitOnFailure(hr, "Failed get httperrors section for DirProp");
2801 hr = pSection->get_Collection(&pCollection);
2802 ExitOnFailure(hr, "Failed get error collection for DirProp");
2803 hr = pCollection->CreateNewElement(ScopeBSTR(IIS_CONFIG_CLEAR), &pElement);
2804 ExitOnFailure(hr, "Failed to create clear element for error collection for DirProp");
2805 hr = pCollection->AddElement(pElement);
2806 ExitOnFailure(hr, "Failed to add lear element for error collection for DirProp");
2807 ReleaseNullObject(pSection);
2808 ReleaseNullObject(pElement);
2809 break;
2810 }
2811 case IIS_DIRPROP_LOGVISITS:
2812 {
2813 hr = WcaReadIntegerFromCaData(ppwzCustomActionData, &iData);
2814 ExitOnFailure(hr, "Failed to read DirProps logVisits");
2815 hr = pAdminMgr->GetAdminSection(ScopeBSTR(IIS_CONFIG_HTTPLOGGING_SECTION), pwzConfigPath, &pSection);
2816 ExitOnFailure(hr, "Failed get httpLogging section for DirProp");
2817 hr = Iis7PutPropertyBool(pSection, IIS_CONFIG_DONTLOG, iData);
2818 ExitOnFailure(hr, "Failed to set DirProps aspDetailedError");
2819 ReleaseNullObject(pSection);
2820 break;
2821 }
2822 default:
2823 {
2824 ExitOnFailure(hr = E_UNEXPECTED, "Unexpected IIS Config action specified for WebDirProperties");
2825 break;
2826 }
2827 }
2828
2829 // Get AppExt action
2830 hr = WcaReadIntegerFromCaData(ppwzCustomActionData, &iAction);
2831 ExitOnFailure(hr, "Failed to read DirProps Property action");
2832 }
2833LExit:
2834 ReleaseStr(pwzConfigPath);
2835 ReleaseStr(pwzWebName);
2836 ReleaseStr(pwzWebRoot);
2837 ReleaseStr(pwzData);
2838 ReleaseObject(pSection);
2839 ReleaseObject(pElement);
2840 ReleaseObject(pCollection);
2841
2842 return hr;
2843}
2844
2845//-------------------------------------------------------------------------------------------------
2846// IIS7SslBinding
2847// ProcessesVdir Properties CA Data
2848//
2849//
2850//-------------------------------------------------------------------------------------------------
2851HRESULT IIS7SslBinding(
2852 __inout LPWSTR *ppwzCustomActionData,
2853 __in IAppHostWritableAdminManager *pAdminMgr
2854 )
2855{
2856 HRESULT hr = S_OK;
2857 int iAction = -1;
2858 BOOL fSiteFound = FALSE;
2859
2860 LPWSTR pwzSiteName = NULL;
2861 LPWSTR pwzStoreName = NULL;
2862 LPWSTR pwzEncodedCertificateHash = NULL;
2863
2864 IAppHostElement *pSiteElem = NULL;
2865
2866 // Get Application action
2867 hr = WcaReadIntegerFromCaData( ppwzCustomActionData, &iAction);
2868 ExitOnFailure(hr, "Failed to read binding action");
2869
2870 //get site key name
2871 hr = WcaReadStringFromCaData(ppwzCustomActionData, &pwzSiteName);
2872 ExitOnFailure(hr, "Failed to read binding site name key");
2873
2874 //get binding protocol
2875 hr = WcaReadStringFromCaData(ppwzCustomActionData, &pwzStoreName);
2876 ExitOnFailure(hr, "Failed to read binding protocol");
2877
2878 //get binding info
2879 hr = WcaReadStringFromCaData(ppwzCustomActionData, &pwzEncodedCertificateHash);
2880 ExitOnFailure(hr, "Failed to read binding info");
2881
2882 //Get site if it exists
2883 hr = GetSiteElement(pAdminMgr, pwzSiteName, &pSiteElem, &fSiteFound);
2884 ExitOnFailure(hr, "Failed to read sites from config");
2885
2886 if (IIS_CREATE == iAction)
2887 {
2888 if (fSiteFound)
2889 {
2890 //add SSL cert to binding
2891 hr = CreateSslBinding(pSiteElem, pwzStoreName, pwzEncodedCertificateHash);
2892 ExitOnFailure(hr, "Failed to create site binding");
2893 }
2894 else
2895 {
2896 hr = HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND);
2897 ExitOnFailure(hr, "Site not found for create binding");
2898 }
2899 }
2900 else if (IIS_DELETE == iAction)
2901 {
2902 if (fSiteFound)
2903 {
2904 //delete binding
2905 hr = DeleteSslBinding(pSiteElem, pwzStoreName, pwzEncodedCertificateHash);
2906 ExitOnFailure(hr, "Failed to delete binding");
2907 }
2908 }
2909
2910 LExit:
2911 ReleaseStr(pwzSiteName);
2912 ReleaseStr(pwzStoreName);
2913 ReleaseStr(pwzEncodedCertificateHash);
2914 ReleaseObject(pSiteElem);
2915
2916 return hr;
2917}
2918
2919//-------------------------------------------------------------------------------------------------
2920// Helper Functions
2921//
2922//
2923//
2924//-------------------------------------------------------------------------------------------------
2925
2926static HRESULT GetNextAvailableSiteId(
2927 IAppHostElementCollection *pCollection,
2928 DWORD *plSiteId
2929 )
2930{
2931 HRESULT hr = S_OK;
2932 IAppHostElement *pElement = NULL;
2933 IAppHostProperty *pProperty = NULL;
2934
2935 DWORD cSites;
2936 DWORD plNextAvailSite = 0;
2937 VARIANT vPropValue;
2938 VARIANT vtIndex;
2939
2940 VariantInit(&vPropValue);
2941 VariantInit(&vtIndex);
2942
2943 *plSiteId = 0;
2944
2945 hr = pCollection->get_Count(&cSites);
2946 ExitOnFailure(hr, "Failed get sites collection count");
2947
2948 vtIndex.vt = VT_UI4;
2949 for (DWORD i = 0; i < cSites; ++i)
2950 {
2951 vtIndex.ulVal = i;
2952 hr = pCollection->get_Item(vtIndex , &pElement);
2953 ExitOnFailure(hr, "Failed get sites collection item");
2954
2955 hr = pElement->GetPropertyByName(ScopeBSTR(IIS_CONFIG_ID), &pProperty);
2956 ExitOnFailure(hr, "Failed get site property");
2957
2958 hr = pProperty->get_Value(&vPropValue);
2959 ExitOnFailure(hr, "Failed get site property value");
2960
2961 *plSiteId = vPropValue.lVal;
2962 if (*plSiteId > plNextAvailSite)
2963 {
2964 plNextAvailSite = *plSiteId;
2965 }
2966 ReleaseNullObject(pElement);
2967 ReleaseNullObject(pProperty);
2968 }
2969 *plSiteId = ++plNextAvailSite;
2970
2971LExit:
2972 ReleaseVariant(vPropValue);
2973 ReleaseVariant(vtIndex);
2974
2975 ReleaseObject(pElement);
2976 ReleaseObject(pProperty);
2977
2978 return hr;
2979}
2980
2981static HRESULT GetSiteElement(
2982 IAppHostWritableAdminManager *pAdminMgr,
2983 LPCWSTR swSiteName,
2984 IAppHostElement **ppSiteElement,
2985 BOOL* fFound
2986 )
2987{
2988 HRESULT hr = S_OK;
2989 IAppHostElement *pSites = NULL;
2990 IAppHostElementCollection *pCollection = NULL;
2991
2992 *fFound = FALSE;
2993
2994 hr = pAdminMgr->GetAdminSection(ScopeBSTR(IIS_CONFIG_SITES_SECTION), ScopeBSTR(IIS_CONFIG_APPHOST_ROOT), &pSites);
2995 ExitOnFailure(hr, "Failed get sites section");
2996 ExitOnNull(pSites, hr, ERROR_FILE_NOT_FOUND, "Failed get sites section object");
2997
2998 hr = pSites->get_Collection(&pCollection);
2999 ExitOnFailure(hr, "Failed get sites collection");
3000
3001 hr = Iis7FindAppHostElementString(pCollection, IIS_CONFIG_SITE, IIS_CONFIG_NAME, swSiteName, ppSiteElement, NULL);
3002 ExitOnFailure(hr, "Failed to find site %ls", swSiteName);
3003
3004 *fFound = ppSiteElement != NULL && *ppSiteElement != NULL;
3005
3006LExit:
3007 ReleaseObject(pSites);
3008 ReleaseObject(pCollection);
3009
3010 return hr;
3011}
3012
3013static HRESULT GetApplicationElement( IAppHostElement *pSiteElement,
3014 LPCWSTR swAppPath,
3015 IAppHostElement **ppAppElement,
3016 BOOL* fFound)
3017{
3018 HRESULT hr = S_OK;
3019 IAppHostElementCollection *pCollection = NULL;
3020
3021 *fFound = FALSE;
3022
3023 hr = pSiteElement->get_Collection( &pCollection);
3024 ExitOnFailure(hr, "Failed get site app collection");
3025
3026 hr = Iis7FindAppHostElementString(pCollection, IIS_CONFIG_APPLICATION, IIS_CONFIG_PATH, swAppPath, ppAppElement, NULL);
3027 ExitOnFailure(hr, "Failed to find app %ls", swAppPath);
3028
3029 *fFound = ppAppElement != NULL && *ppAppElement != NULL;
3030
3031LExit:
3032 ReleaseObject(pCollection);
3033
3034 return hr;
3035}
3036
3037static HRESULT GetApplicationElementForVDir( IAppHostElement *pSiteElement,
3038 LPCWSTR pwzVDirPath,
3039 IAppHostElement **ppAppElement,
3040 LPCWSTR *ppwzVDirSubPath,
3041 BOOL* fFound)
3042{
3043 HRESULT hr = S_OK;
3044 IAppHostElementCollection *pCollection = NULL;
3045 LPWSTR pwzAppPath = NULL;
3046 *fFound = FALSE;
3047 *ppwzVDirSubPath = NULL;
3048
3049 hr = pSiteElement->get_Collection( &pCollection);
3050 ExitOnFailure(hr, "Failed get site app collection");
3051
3052 // Start with full path
3053 int iLastPathIndex = lstrlenW(pwzVDirPath) - 1;
3054 hr = StrAllocString(&pwzAppPath, pwzVDirPath, 0);
3055 ExitOnFailure(hr, "Failed allocate application path");
3056
3057 for (int iSubPathIndex = iLastPathIndex; (iSubPathIndex >= 0) && (!*fFound); --iSubPathIndex)
3058 {
3059 // We are looking at the full path, or at a directory boundary, or at the root
3060 if (iSubPathIndex == iLastPathIndex ||
3061 '/' == pwzAppPath[iSubPathIndex] ||
3062 0 == iSubPathIndex)
3063 {
3064 // break the path if needed
3065 if ('/' == pwzAppPath[iSubPathIndex])
3066 {
3067 pwzAppPath[iSubPathIndex] = '\0';
3068 }
3069
3070 // Special case for root path, need an empty app path
3071 LPCWSTR pwzAppSearchPath = 0 == iSubPathIndex ? L"/" : pwzAppPath;
3072
3073 // Try to find an app with the specified path
3074 hr = Iis7FindAppHostElementString(pCollection, IIS_CONFIG_APPLICATION, IIS_CONFIG_PATH, pwzAppSearchPath, ppAppElement, NULL);
3075 ExitOnFailure(hr, "Failed to search for app %ls", pwzAppSearchPath);
3076 *fFound = ppAppElement != NULL && *ppAppElement != NULL;
3077
3078 if (*fFound)
3079 {
3080 // set return value for sub path
3081 // special case for app path == vdir path, need an empty subpath.
3082 *ppwzVDirSubPath = (iSubPathIndex == iLastPathIndex) ? L"/" : pwzVDirPath + iSubPathIndex;
3083 }
3084 }
3085 }
3086
3087LExit:
3088 ReleaseObject(pCollection);
3089 ReleaseStr(pwzAppPath);
3090
3091 return hr;
3092}
3093
3094static HRESULT CreateSite(
3095 __in IAppHostElementCollection *pCollection,
3096 __in LPCWSTR swSiteName,
3097 __out IAppHostElement **pSiteElement
3098 )
3099{
3100 HRESULT hr = S_OK;
3101 IAppHostElement *pNewElement = NULL;
3102
3103 hr = pCollection->CreateNewElement(ScopeBSTR(IIS_CONFIG_SITE), &pNewElement);
3104 ExitOnFailure(hr, "Failed create site element");
3105
3106 hr = Iis7PutPropertyString(pNewElement, IIS_CONFIG_NAME, swSiteName);
3107 ExitOnFailure(hr, "Failed set site name property");
3108
3109 DWORD lSiteId = 0;
3110 hr = GetNextAvailableSiteId(pCollection, &lSiteId);
3111 ExitOnFailure(hr, "Failed get next site id");
3112
3113 Iis7PutPropertyInteger(pNewElement, IIS_CONFIG_ID, lSiteId);
3114 ExitOnFailure(hr, "Failed set site id property");
3115
3116 hr = pCollection->AddElement(pNewElement);
3117 ExitOnFailure(hr, "Failed add site element");
3118
3119 *pSiteElement = pNewElement;
3120 pNewElement = NULL;
3121
3122LExit:
3123 ReleaseObject(pNewElement);
3124
3125 return hr;
3126}
3127
3128static HRESULT CreateApplication(
3129 IAppHostElement *pSiteElement,
3130 LPCWSTR swAppPath,
3131 IAppHostElement **pAppElement
3132 )
3133{
3134 HRESULT hr = S_OK;
3135 IAppHostElement *pNewElement = NULL;
3136 IAppHostElementCollection *pCollection = NULL;
3137
3138 hr = pSiteElement->get_Collection(&pCollection);
3139 ExitOnFailure(hr, "Failed get application collection");
3140
3141 hr = pCollection->CreateNewElement(ScopeBSTR(IIS_CONFIG_APPLICATION), &pNewElement);
3142 ExitOnFailure(hr, "Failed get application element");
3143
3144 hr = Iis7PutPropertyString(pNewElement, IIS_CONFIG_PATH, swAppPath);
3145 ExitOnFailure(hr, "Failed set application path property");
3146
3147 hr = pCollection->AddElement(pNewElement);
3148 ExitOnFailure(hr, "Failed add application to collection");
3149
3150 *pAppElement = pNewElement;
3151 pNewElement = NULL;
3152
3153LExit:
3154 ReleaseObject(pCollection);
3155 ReleaseObject(pNewElement);
3156
3157 return hr;
3158}
3159
3160static HRESULT DeleteApplication(
3161 IAppHostElement *pSiteElement,
3162 LPCWSTR swAppPath
3163 )
3164{
3165 HRESULT hr = S_OK;
3166 IAppHostElementCollection *pCollection = NULL;
3167
3168 hr = pSiteElement->get_Collection(&pCollection);
3169 ExitOnFailure(hr, "Failed get application collection");
3170
3171 hr = DeleteCollectionElement(pCollection, IIS_CONFIG_APPLICATION, IIS_CONFIG_PATH, swAppPath);
3172 ExitOnFailure(hr, "Failed to delete website");
3173
3174LExit:
3175 ReleaseObject(pCollection);
3176
3177 return hr;
3178}
3179
3180static HRESULT SetAppPool(
3181 IAppHostElement *pAppElement,
3182 LPCWSTR pwzAppPool
3183 )
3184{
3185 HRESULT hr = S_OK;
3186
3187 if (*pwzAppPool != 0)
3188 {
3189 hr = Iis7PutPropertyString(pAppElement, IIS_CONFIG_APPPOOL, pwzAppPool);
3190 ExitOnFailure(hr, "Failed set application appPool property");
3191 }
3192LExit:
3193 return hr;
3194}
3195
3196static HRESULT CreateVdir(
3197 IAppHostElement *pAppElement,
3198 LPCWSTR pwzVDirPath,
3199 LPCWSTR pwzVDirPhyDir
3200 )
3201{
3202 HRESULT hr = S_OK;
3203 IAppHostElement *pElement = NULL;
3204 IAppHostElementCollection *pCollection = NULL;
3205 BOOL fFound;
3206
3207 hr = pAppElement->get_Collection(&pCollection);
3208 ExitOnFailure(hr, "Failed get application VDir collection");
3209
3210 hr = Iis7FindAppHostElementString(pCollection, IIS_CONFIG_VDIR, IIS_CONFIG_PATH, pwzVDirPath, &pElement, NULL);
3211 ExitOnFailure(hr, "Failed while finding virtualDir");
3212 fFound = (NULL != pElement);
3213
3214 if (!fFound)
3215 {
3216 hr = pCollection->CreateNewElement(ScopeBSTR(IIS_CONFIG_VDIR), &pElement);
3217 ExitOnFailure(hr, "Failed create application VDir collection");
3218
3219 hr = Iis7PutPropertyString(pElement, IIS_CONFIG_PATH, pwzVDirPath);
3220 ExitOnFailure(hr, "Failed set VDir path property");
3221 }
3222
3223 hr = Iis7PutPropertyString(pElement, IIS_CONFIG_PHYSPATH, pwzVDirPhyDir);
3224 ExitOnFailure(hr, "Failed set VDir phys path property");
3225
3226 if (!fFound)
3227 {
3228 hr = pCollection->AddElement(pElement);
3229 ExitOnFailure(hr, "Failed add application VDir element");
3230 }
3231
3232LExit:
3233 ReleaseObject(pCollection);
3234 ReleaseObject(pElement);
3235
3236 return hr;
3237}
3238
3239static HRESULT DeleteVdir(
3240 IAppHostElement *pAppElement,
3241 LPCWSTR pwzVDirPath
3242 )
3243{
3244 HRESULT hr = S_OK;
3245 IAppHostElementCollection *pCollection = NULL;
3246
3247 hr = pAppElement->get_Collection(&pCollection);
3248 ExitOnFailure(hr, "Failed get application VDir collection");
3249
3250 hr = DeleteCollectionElement(pCollection, IIS_CONFIG_VDIR, IIS_CONFIG_PATH, pwzVDirPath);
3251 ExitOnFailure(hr, "Failed to delete vdir");
3252
3253LExit:
3254 ReleaseObject(pCollection);
3255
3256 return hr;
3257}
3258
3259static HRESULT CreateBinding(
3260 IAppHostElement *pSiteElem,
3261 LPCWSTR pwzProtocol,
3262 LPCWSTR pwzInfo
3263 )
3264{
3265 HRESULT hr = S_OK;
3266 IAppHostChildElementCollection *pChildElems = NULL;
3267 IAppHostElement *pBindings = NULL;
3268 IAppHostElement *pBindingElement = NULL;
3269 IAppHostElementCollection *pCollection = NULL;
3270
3271 VARIANT vtProp;
3272
3273 VariantInit(&vtProp);
3274
3275 hr = pSiteElem->get_ChildElements(&pChildElems);
3276 ExitOnFailure(hr, "Failed get site child elements collection");
3277
3278 vtProp.vt = VT_BSTR;
3279 vtProp.bstrVal = ::SysAllocString(IIS_CONFIG_BINDINGS);
3280 hr = pChildElems->get_Item(vtProp, &pBindings);
3281 ExitOnFailure(hr, "Failed get bindings element");
3282 ReleaseVariant(vtProp);
3283
3284 hr = pBindings->get_Collection(&pCollection);
3285 ExitOnFailure(hr, "Failed get bindings collection");
3286
3287 hr = pCollection->CreateNewElement(ScopeBSTR(IIS_CONFIG_BINDING), &pBindingElement);
3288 ExitOnFailure(hr, "Failed get binding element");
3289
3290 hr = Iis7PutPropertyString(pBindingElement, IIS_CONFIG_PROTOCOL, pwzProtocol);
3291 ExitOnFailure(hr, "Failed set binding protocol property");
3292
3293 hr = Iis7PutPropertyString(pBindingElement, IIS_CONFIG_BINDINGINFO, pwzInfo);
3294 ExitOnFailure(hr, "Failed set binding information property");
3295
3296 hr = pCollection->AddElement(pBindingElement);
3297 if (hr == HRESULT_FROM_WIN32(ERROR_ALREADY_EXISTS))
3298 {
3299 //Eat this error. Binding is there and nothing to repair since
3300 //identity == protocol + info so all is OK
3301 hr = S_OK;
3302 }
3303 else
3304 {
3305 ExitOnFailure(hr, "Failed add binding to site");
3306 }
3307
3308LExit:
3309 ReleaseVariant(vtProp);
3310
3311 ReleaseObject(pCollection);
3312 ReleaseObject(pChildElems);
3313 ReleaseObject(pBindingElement);
3314 ReleaseObject(pBindings);
3315
3316 return hr;
3317}
3318static HRESULT CreateWebLog(
3319 IAppHostElement *pSiteElem,
3320 LPCWSTR pwzFormat
3321 )
3322{
3323 HRESULT hr = S_OK;
3324 IAppHostChildElementCollection *pChildElems = NULL;
3325 IAppHostElement *pLogFile = NULL;
3326
3327 VARIANT vtProp;
3328
3329 VariantInit(&vtProp);
3330
3331 hr = pSiteElem->get_ChildElements(&pChildElems);
3332 ExitOnFailure(hr, "Failed get site child elements collection");
3333
3334 vtProp.vt = VT_BSTR;
3335 vtProp.bstrVal = ::SysAllocString(IIS_CONFIG_WEBLOG);
3336 hr = pChildElems->get_Item(vtProp, &pLogFile);
3337 ExitOnFailure(hr, "Failed get logfile element");
3338 ReleaseVariant(vtProp);
3339
3340 if (CSTR_EQUAL != ::CompareStringW(LOCALE_INVARIANT, NORM_IGNORECASE, pwzFormat, -1, L"none", -1))
3341 {
3342 hr = Iis7PutPropertyString(pLogFile, IIS_CONFIG_LOGFORMAT, pwzFormat);
3343 ExitOnFailure(hr, "Failed set logfile format property");
3344 hr = Iis7PutPropertyString(pLogFile, IIS_CONFIG_ENABLED, IIS_CONFIG_TRUE);
3345 ExitOnFailure(hr, "Failed set logfile enabled property");
3346 }
3347 else
3348 {
3349 hr = Iis7PutPropertyString(pLogFile, IIS_CONFIG_ENABLED, IIS_CONFIG_FALSE);
3350 ExitOnFailure(hr, "Failed set logfile enabled property");
3351 }
3352
3353LExit:
3354 ReleaseVariant(vtProp);
3355
3356 ReleaseObject(pLogFile);
3357 ReleaseObject(pChildElems);
3358
3359 return hr;
3360}
3361
3362static HRESULT DeleteBinding(
3363 IAppHostElement* /*pSiteElem*/,
3364 LPCWSTR /*pwzProtocol*/,
3365 LPCWSTR /*pwzInfo*/
3366 )
3367{
3368 HRESULT hr = S_OK;
3369 //
3370 //this isn't supported right now, we should support this for the SiteSearch scenario
3371 return hr;
3372}
3373
3374struct SCA_SSLBINDINGINFO
3375{
3376 IIS7_APPHOSTELEMENTCOMPARISON comparison;
3377 LPCWSTR pwzStoreName;
3378 LPCWSTR pwzEncodedCertificateHash;
3379 HRESULT hr;
3380};
3381
3382static BOOL AddSslCertificateToBindingCallback(IAppHostElement *pBindingElement, LPVOID pContext)
3383{
3384 HRESULT hr = S_OK;
3385 VARIANT vtProp;
3386 VariantInit(&vtProp);
3387 SCA_SSLBINDINGINFO* pBindingInfo = (SCA_SSLBINDINGINFO*)pContext;
3388 IAppHostMethodCollection *pAppHostMethodCollection = NULL;
3389 IAppHostMethod *pAddSslMethod = NULL;
3390 IAppHostMethodInstance *pAddSslMethodInstance = NULL;
3391 IAppHostElement *pAddSslInput = NULL;
3392 int iWsaError = 0;
3393 WSADATA wsaData = {};
3394 BOOL fWsaInitialized = FALSE;
3395
3396 // IIS's AddSslCertificate doesn't initialize WinSock on 2008 before using it to parse the IP
3397 // Initialize before calling to workaround the failure.
3398 iWsaError = WSAStartup(MAKEWORD(2, 2), &wsaData);
3399 if (0 != iWsaError)
3400 {
3401 ExitOnWin32Error(iWsaError, hr, "Failed to initialize WinSock");
3402 }
3403
3404 fWsaInitialized = TRUE;
3405
3406 if (Iis7IsMatchingAppHostElement(pBindingElement, &pBindingInfo->comparison))
3407 {
3408 hr = pBindingElement->get_Methods(&pAppHostMethodCollection);
3409 ExitOnFailure(hr, "failed to get binding method collection");
3410
3411 hr = Iis7FindAppHostMethod(pAppHostMethodCollection, L"AddSslCertificate", &pAddSslMethod, NULL);
3412 if (FAILED(hr))
3413 {
3414 WcaLog(LOGMSG_STANDARD, "The AddSslCertificate method is not supported by the binding element, SSL certificate will not be associated with the website");
3415 ExitFunction();
3416 }
3417
3418 pAddSslMethod->CreateInstance(&pAddSslMethodInstance);
3419 ExitOnFailure(hr, "failed to create an instance of AddSslCertificate method");
3420
3421 pAddSslMethodInstance->get_Input(&pAddSslInput);
3422 ExitOnFailure(hr, "failed to get input element of AddSslCertificate method");
3423
3424 Iis7PutPropertyString(pAddSslInput, IIS_CONFIG_CERTIFICATESTORENAME, pBindingInfo->pwzStoreName);
3425 ExitOnFailure(hr, "failed to set certificateStoreName input parameter of AddSslCertificate method");
3426
3427 Iis7PutPropertyString(pAddSslInput, IIS_CONFIG_CERTIFICATEHASH, pBindingInfo->pwzEncodedCertificateHash);
3428 ExitOnFailure(hr, "failed to set certificateHash input parameter of AddSslCertificate method");
3429
3430 hr = pAddSslMethodInstance->Execute();
3431 ExitOnFailure(hr, "failed to execute AddSslCertificate method");
3432 }
3433LExit:
3434 pBindingInfo->hr = hr;
3435 ReleaseObject(pAppHostMethodCollection);
3436 ReleaseObject(pAddSslMethod);
3437 ReleaseObject(pAddSslMethodInstance);
3438 ReleaseObject(pAddSslInput);
3439 if (fWsaInitialized)
3440 {
3441 WSACleanup();
3442 }
3443
3444 return FAILED(hr);
3445}
3446
3447static HRESULT CreateSslBinding( IAppHostElement *pSiteElem, LPCWSTR pwzStoreName, LPCWSTR pwzEncodedCertificateHash)
3448{
3449 HRESULT hr = S_OK;
3450 IAppHostChildElementCollection *pChildElems = NULL;
3451 IAppHostElement *pBindingsElement = NULL;
3452 IAppHostElementCollection *pBindingsCollection = NULL;
3453 SCA_SSLBINDINGINFO bindingInfo = {};
3454 VARIANT vtProp;
3455 VariantInit(&vtProp);
3456
3457 hr = pSiteElem->get_ChildElements(&pChildElems);
3458 ExitOnFailure(hr, "Failed get site child elements collection");
3459
3460 vtProp.vt = VT_BSTR;
3461 vtProp.bstrVal = ::SysAllocString(IIS_CONFIG_BINDINGS);
3462 hr = pChildElems->get_Item(vtProp, &pBindingsElement);
3463 ExitOnFailure(hr, "Failed get bindings element");
3464 ReleaseVariant(vtProp);
3465
3466 hr = pBindingsElement->get_Collection(&pBindingsCollection);
3467 ExitOnFailure(hr, "Failed get bindings collection");
3468
3469 bindingInfo.comparison.sczElementName = IIS_CONFIG_BINDING;
3470 bindingInfo.comparison.sczAttributeName = IIS_CONFIG_PROTOCOL;
3471 vtProp.vt = VT_BSTR;
3472 vtProp.bstrVal = ::SysAllocString(L"https");
3473 bindingInfo.comparison.pvAttributeValue = &vtProp;
3474 bindingInfo.pwzStoreName = pwzStoreName;
3475 bindingInfo.pwzEncodedCertificateHash = pwzEncodedCertificateHash;
3476
3477 // Our current IISWebSiteCertificates schema does not allow specification of the website binding
3478 // to associate the certificate with. For now just associate it with all secure bindings.
3479
3480 hr = Iis7EnumAppHostElements(pBindingsCollection, AddSslCertificateToBindingCallback, &bindingInfo, NULL, NULL);
3481 ExitOnFailure(hr, "Failed to enumerate bindings collection");
3482 hr = bindingInfo.hr;
3483 ExitOnFailure(hr, "Failed to add ssl binding");
3484
3485LExit:
3486 ReleaseVariant(vtProp);
3487
3488 ReleaseObject(pChildElems);
3489 ReleaseObject(pBindingsElement);
3490 ReleaseObject(pBindingsCollection);
3491
3492 return hr;
3493}
3494
3495static HRESULT DeleteSslBinding(
3496 IAppHostElement * /*pSiteElem*/,
3497 LPCWSTR /*pwzStoreName*/,
3498 LPCWSTR /*pwzEncodedCertificateHash*/
3499 )
3500{
3501 HRESULT hr = S_OK;
3502 //
3503 //this isn't supported right now, we should support this for the SiteSearch scenario
3504 return hr;
3505}
3506
3507static HRESULT DeleteAppPool( IAppHostWritableAdminManager *pAdminMgr,
3508 LPCWSTR swAppPoolName)
3509{
3510 HRESULT hr = S_OK;
3511 IAppHostElement *pAppPools = NULL;
3512 IAppHostElementCollection *pCollection = NULL;
3513
3514 hr = pAdminMgr->GetAdminSection(ScopeBSTR(IIS_CONFIG_APPPOOL_SECTION), ScopeBSTR(IIS_CONFIG_APPHOST_ROOT), &pAppPools);
3515 ExitOnFailure(hr, "Failed get AppPools section");
3516 ExitOnNull(pAppPools, hr, E_UNEXPECTED, "Failed get appPools section object");
3517
3518 hr = pAppPools->get_Collection( &pCollection);
3519 ExitOnFailure(hr, "Failed get AppPools collection");
3520
3521 hr = DeleteCollectionElement(pCollection, IIS_CONFIG_ADD, IIS_CONFIG_NAME, swAppPoolName);
3522 ExitOnFailure(hr, "Failed to delete app pool %ls", swAppPoolName);
3523
3524LExit:
3525 ReleaseObject(pAppPools);
3526 ReleaseObject(pCollection);
3527
3528 return hr;
3529}
3530
3531static HRESULT CreateAppPool(
3532 __inout LPWSTR *ppwzCustomActionData,
3533 IAppHostWritableAdminManager *pAdminMgr,
3534 LPCWSTR swAppPoolName
3535 )
3536{
3537 HRESULT hr = S_OK;
3538 IAppHostElement *pAppPools = NULL;
3539 IAppHostElement *pAppPoolElement = NULL;
3540 IAppHostElement *pElement = NULL;
3541 IAppHostElement *pElement2 = NULL;
3542 IAppHostElement *pElement3 = NULL;
3543 IAppHostElementCollection *pCollection = NULL;
3544 IAppHostElementCollection *pCollection2 = NULL;
3545 int iAction = -1;
3546 int iData = 0;
3547 LPWSTR pwzData = NULL;
3548 WCHAR wcData[512];
3549 WCHAR wcTime[60];
3550 BOOL fFound = FALSE;
3551
3552 hr = pAdminMgr->GetAdminSection(ScopeBSTR(IIS_CONFIG_APPPOOL_SECTION), ScopeBSTR(IIS_CONFIG_APPHOST_ROOT), &pAppPools);
3553 ExitOnFailure(hr, "Failed get AppPools section");
3554 ExitOnNull(pAppPools, hr, ERROR_FILE_NOT_FOUND, "Failed get AppPools section object");
3555
3556 hr = pAppPools->get_Collection( &pCollection);
3557 ExitOnFailure(hr, "Failed get AppPools collection");
3558
3559 hr = Iis7FindAppHostElementString(pCollection, IIS_CONFIG_ADD, IIS_CONFIG_NAME, swAppPoolName, &pAppPoolElement, NULL);
3560 ExitOnFailure(hr, "Failed find AppPool element");
3561 fFound = (NULL != pAppPoolElement);
3562
3563 if (!fFound)
3564 {
3565 hr = pCollection->CreateNewElement(ScopeBSTR(IIS_CONFIG_ADD), &pAppPoolElement);
3566 ExitOnFailure(hr, "Failed create AppPool element");
3567 }
3568
3569 hr = Iis7PutPropertyString(pAppPoolElement, IIS_CONFIG_NAME, swAppPoolName);
3570 ExitOnFailure(hr, "Failed set AppPool name property");
3571
3572 //For WiX II6 /ABO compat we will default managedPipelineMode="Classic"
3573 hr = Iis7PutPropertyString(pAppPoolElement, IIS_CONFIG_PIPELINEMODE, L"Classic");
3574 ExitOnFailure(hr, "Failed set AppPool managedPipelineMode property");
3575 //For WiX II6 /ABO compat we will be hardcoding autostart="true"
3576 hr = Iis7PutPropertyString(pAppPoolElement, IIS_CONFIG_APPPOOL_AUTO, L"true");
3577 ExitOnFailure(hr, "Failed set AppPool autoStart property");
3578
3579 if (!fFound)
3580 {
3581 hr = pCollection->AddElement(pAppPoolElement);
3582 ExitOnFailure(hr, "Failed to add appPool element");
3583 }
3584
3585 // Get AppPool Property action
3586 hr = WcaReadIntegerFromCaData(ppwzCustomActionData, &iAction);
3587 ExitOnFailure(hr, "Failed to read AppPool Property action");
3588 while (IIS_APPPOOL_END != iAction)
3589 {
3590 //Process property action
3591 switch (iAction)
3592 {
3593 case IIS_APPPOOL_RECYCLE_MIN :
3594 {
3595 // /recycling / periodicRestart | time
3596 hr = WcaReadIntegerFromCaData(ppwzCustomActionData, &iData);
3597 ExitOnFailure(hr, "Failed to read AppPool recycle min");
3598 hr = pAppPoolElement->GetElementByName(ScopeBSTR(IIS_CONFIG_RECYCLING), &pElement);
3599 ExitOnFailure(hr, "Failed to get AppPool recycling element");
3600 hr = pElement->GetElementByName(ScopeBSTR(IIS_CONFIG_PEROIDRESTART), &pElement2);
3601 ExitOnFailure(hr, "Failed to get AppPool periodicRestart element");
3602 *wcTime = '\0';
3603 ConvSecToHMS(iData * 60, wcTime, countof(wcTime));
3604 hr = Iis7PutPropertyString(pElement2, IIS_CONFIG_TIME, wcTime);
3605 ExitOnFailure(hr, "Failed to set AppPool periodicRestart time value");
3606 ReleaseNullObject(pElement);
3607 ReleaseNullObject(pElement2);
3608 break;
3609 }
3610 case IIS_APPPOOL_RECYCLE_REQ :
3611 {
3612 // /recycling / periodicRestart | requests
3613 hr = WcaReadIntegerFromCaData(ppwzCustomActionData, &iData);
3614 ExitOnFailure(hr, "Failed to read AppPool recycle req");
3615 hr = pAppPoolElement->GetElementByName(ScopeBSTR(IIS_CONFIG_RECYCLING), &pElement);
3616 ExitOnFailure(hr, "Failed to get AppPool recycling element");
3617 hr = pElement->GetElementByName(ScopeBSTR(IIS_CONFIG_PEROIDRESTART), &pElement2);
3618 ExitOnFailure(hr, "Failed to get AppPool periodicRestart element");
3619 hr = Iis7PutPropertyInteger(pElement2, IIS_CONFIG_REQUESTS, iData);
3620 ExitOnFailure(hr, "Failed to set AppPool periodicRestart time value");
3621 ReleaseNullObject(pElement);
3622 ReleaseNullObject(pElement2);
3623 break;
3624 }
3625 case IIS_APPPOOL_RECYCLE_TIMES :
3626 {
3627 // /recycling / periodicRestart | schedule
3628 hr = WcaReadStringFromCaData(ppwzCustomActionData, &pwzData);
3629 ExitOnFailure(hr, "Failed to read AppPool recycle times");
3630 hr = pAppPoolElement->GetElementByName(ScopeBSTR(IIS_CONFIG_RECYCLING), &pElement);
3631 ExitOnFailure(hr, "Failed to get AppPool recycling element");
3632 hr = pElement->GetElementByName(ScopeBSTR(IIS_CONFIG_PEROIDRESTART), &pElement2);
3633 ExitOnFailure(hr, "Failed to get AppPool periodicRestart element");
3634 hr = pElement2->GetElementByName(ScopeBSTR(IIS_CONFIG_SCHEDULE), &pElement3);
3635 ExitOnFailure(hr, "Failed to get AppPool schedule element");
3636 hr = pElement3->get_Collection(&pCollection2);
3637 ExitOnFailure(hr, "Failed to get AppPool schedule collection");
3638
3639 WCHAR wcDelim[] = L",";
3640 const WCHAR *wszToken = NULL;
3641 WCHAR *wszNextToken = NULL;
3642 wszToken = wcstok_s( pwzData, wcDelim, &wszNextToken);
3643
3644 while (wszToken)
3645 {
3646 *wcData = '\0';
3647 hr = ::StringCchCopyW(wcData, countof(wcData), wszToken);
3648 ExitOnFailure(hr, "failed to copy AppPool schedule");
3649 hr = ::StringCchCatW(wcData, countof(wcData), L":00");
3650 ExitOnFailure(hr, "failed to append AppPool schedule");
3651
3652 hr = pCollection2->CreateNewElement(ScopeBSTR(IIS_CONFIG_ADD), &pElement3);
3653 ExitOnFailure(hr, "Failed to create AppPool schedule element");
3654
3655 hr = Iis7PutPropertyString(pElement3, IIS_CONFIG_VALUE, wcData);
3656 ExitOnFailure(hr, "Failed to set AppPool schedule value");
3657
3658 hr = pCollection2->AddElement(pElement3);
3659 if (hr == HRESULT_FROM_WIN32(ERROR_ALREADY_EXISTS))
3660 {
3661 //Eat this error, recycle time already exists NBD
3662 hr = S_OK;
3663 }
3664 ExitOnFailure(hr, "Failed to add win auth providers element");
3665 ReleaseNullObject(pElement3);
3666 wszToken = wcstok_s( NULL, wcDelim, &wszNextToken);
3667 }
3668 ReleaseNullObject(pElement);
3669 ReleaseNullObject(pElement2);
3670 ReleaseNullObject(pElement3);
3671 ReleaseNullObject(pCollection2);
3672 break;
3673 }
3674 case IIS_APPPOOL_RECYCLE_VIRMEM :
3675 {
3676 // /recycling / periodicRestart | memory
3677 hr = WcaReadIntegerFromCaData(ppwzCustomActionData, &iData);
3678 ExitOnFailure(hr, "Failed to read AppPool recycle vir memory");
3679 hr = pAppPoolElement->GetElementByName(ScopeBSTR(IIS_CONFIG_RECYCLING), &pElement);
3680 ExitOnFailure(hr, "Failed to get AppPool recycling element");
3681 hr = pElement->GetElementByName(ScopeBSTR(IIS_CONFIG_PEROIDRESTART), &pElement2);
3682 ExitOnFailure(hr, "Failed to get AppPool periodicRestart element");
3683 hr = Iis7PutPropertyInteger(pElement2, IIS_CONFIG_MEMORY, iData);
3684 ExitOnFailure(hr, "Failed to set AppPool periodicRestart memory");
3685 ReleaseNullObject(pElement);
3686 ReleaseNullObject(pElement2);
3687 break;
3688 }
3689 case IIS_APPPOOL_RECYCLE_PRIVMEM :
3690 {
3691 // /recycling / periodicRestart | privateMemory
3692 hr = WcaReadIntegerFromCaData(ppwzCustomActionData, &iData);
3693 ExitOnFailure(hr, "Failed to read AppPool recycle priv mem");
3694 hr = pAppPoolElement->GetElementByName(ScopeBSTR(IIS_CONFIG_RECYCLING), &pElement);
3695 ExitOnFailure(hr, "Failed to get AppPool recycling element");
3696 hr = pElement->GetElementByName(ScopeBSTR(IIS_CONFIG_PEROIDRESTART), &pElement2);
3697 ExitOnFailure(hr, "Failed to get AppPool periodicRestart element");
3698 hr = Iis7PutPropertyInteger(pElement2, IIS_CONFIG_PRIVMEMORY, iData);
3699 ExitOnFailure(hr, "Failed to set AppPool periodicRestart private memory");
3700 ReleaseNullObject(pElement);
3701 ReleaseNullObject(pElement2);
3702 break;
3703 }
3704 case IIS_APPPOOL_RECYCLE_IDLTIMEOUT :
3705 {
3706 // /processModel | idleTimeout
3707 hr = WcaReadIntegerFromCaData(ppwzCustomActionData, &iData);
3708 ExitOnFailure(hr, "Failed to read AppPool idle timeout");
3709 hr = pAppPoolElement->GetElementByName(ScopeBSTR(IIS_CONFIG_PROCESSMODEL), &pElement);
3710 ExitOnFailure(hr, "Failed to get AppPool processModel element");
3711 *wcTime = '\0';
3712 ConvSecToHMS(iData * 60, wcTime, countof(wcTime));
3713 hr = Iis7PutPropertyString(pElement, IIS_CONFIG_IDLETIMEOUT, wcTime);
3714 ExitOnFailure(hr, "Failed to set AppPool processModel idle timeout value");
3715 ReleaseNullObject(pElement);
3716 break;
3717 }
3718 case IIS_APPPOOL_RECYCLE_QUEUELIMIT :
3719 {
3720 // /applicationPools | queueLength
3721 hr = WcaReadIntegerFromCaData(ppwzCustomActionData, &iData);
3722 ExitOnFailure(hr, "Failed to read AppPool recycle queue limit");
3723 hr = Iis7PutPropertyInteger(pAppPoolElement, IIS_CONFIG_QUEUELENGTH, iData);
3724 ExitOnFailure(hr, "Failed to set AppPool recycle queue limit value");
3725 break;
3726 }
3727 case IIS_APPPOOL_MAXPROCESS :
3728 {
3729 // /processModel | maxProcesses
3730 hr = WcaReadIntegerFromCaData(ppwzCustomActionData, &iData);
3731 ExitOnFailure(hr, "Failed to read AppPool max processes");
3732 hr = pAppPoolElement->GetElementByName(ScopeBSTR(IIS_CONFIG_PROCESSMODEL), &pElement);
3733 ExitOnFailure(hr, "Failed to get AppPool processModel element");
3734 hr = Iis7PutPropertyInteger(pElement, IIS_CONFIG_MAXWRKPROCESSES, iData);
3735 ExitOnFailure(hr, "Failed to set AppPool processModel maxProcesses value");
3736 ReleaseNullObject(pElement);
3737 break;
3738 }
3739 case IIS_APPPOOL_IDENTITY :
3740 {
3741 //"LocalSystem" 0
3742 //"LocalService" 1
3743 //"NetworkService" 2
3744 //"SpecificUser" 3
3745 //"ApplicationPoolIdentity" 4
3746 // /processModel | identityType
3747 hr = WcaReadIntegerFromCaData(ppwzCustomActionData, &iData);
3748 ExitOnFailure(hr, "Failed to read AppPool identity");
3749 hr = pAppPoolElement->GetElementByName(ScopeBSTR(IIS_CONFIG_PROCESSMODEL), &pElement);
3750 ExitOnFailure(hr, "Failed to get AppPool processModel element");
3751 if (iData == 0)
3752 {
3753 hr = Iis7PutPropertyString(pElement, IIS_CONFIG_IDENITITYTYPE, IIS_CONFIG_LOCALSYSTEM);
3754 }
3755 else if (iData == 1)
3756 {
3757 hr = Iis7PutPropertyString(pElement, IIS_CONFIG_IDENITITYTYPE, IIS_CONFIG_LOCALSERVICE);
3758 }
3759 else if (iData == 2)
3760 {
3761 hr = Iis7PutPropertyString(pElement, IIS_CONFIG_IDENITITYTYPE, IIS_CONFIG_NETWORKSERVICE);
3762 }
3763 else if (iData == 3)
3764 {
3765 hr = Iis7PutPropertyString(pElement, IIS_CONFIG_IDENITITYTYPE, IIS_CONFIG_SPECIFICUSER);
3766 }
3767 else if (iData == 4)
3768 {
3769 hr = Iis7PutPropertyString(pElement, IIS_CONFIG_IDENITITYTYPE, IIS_CONFIG_APPLICATIONPOOLIDENTITY);
3770 }
3771 ExitOnFailure(hr, "Failed to set AppPool processModel identityType value");
3772 ReleaseNullObject(pElement);
3773 break;
3774 }
3775 case IIS_APPPOOL_USER :
3776 {
3777 // /processModel | userName
3778 hr = WcaReadStringFromCaData(ppwzCustomActionData, &pwzData);
3779 ExitOnFailure(hr, "Failed to read AppPool user");
3780 hr = pAppPoolElement->GetElementByName(ScopeBSTR(IIS_CONFIG_PROCESSMODEL), &pElement);
3781 ExitOnFailure(hr, "Failed to get AppPool processModel element");
3782 hr = Iis7PutPropertyString(pElement, IIS_CONFIG_USERNAME, pwzData);
3783 ExitOnFailure(hr, "Failed to set AppPool processModel username value");
3784 ReleaseNullObject(pElement);
3785 break;
3786 }
3787 case IIS_APPPOOL_PWD :
3788 {
3789 // /processModel | password
3790 hr = WcaReadStringFromCaData(ppwzCustomActionData, &pwzData);
3791 ExitOnFailure(hr, "Failed to read AppPool pwd");
3792 hr = pAppPoolElement->GetElementByName(ScopeBSTR(IIS_CONFIG_PROCESSMODEL), &pElement);
3793 ExitOnFailure(hr, "Failed to get AppPool processModel element");
3794 hr = Iis7PutPropertyString(pElement, IIS_CONFIG_PASSWORD, pwzData);
3795 ExitOnFailure(hr, "Failed to set AppPool processModel password value");
3796 ReleaseNullObject(pElement);
3797 break;
3798 }
3799 case IIS_APPPOOL_RECYCLE_CPU_PCT:
3800 {
3801 // /cpu | limit
3802 hr = WcaReadIntegerFromCaData(ppwzCustomActionData, &iData);
3803 ExitOnFailure(hr, "Failed to read cpu pct");
3804 hr = pAppPoolElement->GetElementByName(ScopeBSTR(IIS_CONFIG_CPU), &pElement);
3805 ExitOnFailure(hr, "Failed to get AppPool cpu element");
3806 // limit is maximum percentage of CPU time (in 1/1000ths of one percent)
3807 hr = Iis7PutPropertyInteger(pElement, IIS_CONFIG_LIMIT, iData * 1000);
3808 ExitOnFailure(hr, "Failed to set AppPool cpu limit");
3809 ReleaseNullObject(pElement);
3810 break;
3811 }
3812 case IIS_APPPOOL_RECYCLE_CPU_REFRESH:
3813 {
3814 // /cpu | resetInterval
3815 hr = WcaReadIntegerFromCaData(ppwzCustomActionData, &iData);
3816 ExitOnFailure(hr, "Failed to read cpu refresh pwd");
3817 hr = pAppPoolElement->GetElementByName(ScopeBSTR(IIS_CONFIG_CPU), &pElement);
3818 ExitOnFailure(hr, "Failed to get AppPool cpu element");
3819 *wcTime = '\0';
3820 ConvSecToHMS(iData * 60, wcTime, countof(wcTime));
3821 hr = Iis7PutPropertyString(pElement, IIS_CONFIG_RESETINTERVAL, wcTime);
3822 ExitOnFailure(hr, "Failed to set AppPool cpu resetInterval value");
3823 ReleaseNullObject(pElement);
3824 break;
3825 }
3826 case IIS_APPPOOL_RECYCLE_CPU_ACTION:
3827 {
3828 // /cpu | action
3829 //"NoAction" 0
3830 //"KillW3wp" 1
3831 hr = WcaReadIntegerFromCaData(ppwzCustomActionData, &iData);
3832 ExitOnFailure(hr, "Failed to read cpu action");
3833 hr = pAppPoolElement->GetElementByName(ScopeBSTR(IIS_CONFIG_CPU), &pElement);
3834 ExitOnFailure(hr, "Failed to get AppPool cpu element");
3835 if (iData)
3836 {
3837 hr = Iis7PutPropertyString(pElement, IIS_CONFIG_CPU_ACTION, IIS_CONFIG_KILLW3WP);
3838 }
3839 else
3840 {
3841 hr = Iis7PutPropertyString(pElement, IIS_CONFIG_CPU_ACTION, IIS_CONFIG_NOACTION);
3842 }
3843 ExitOnFailure(hr, "Failed to set AppPool cpu action value");
3844 ReleaseNullObject(pElement);
3845 break;
3846 }
3847 case IIS_APPPOOL_32BIT:
3848 {
3849 hr = WcaReadIntegerFromCaData(ppwzCustomActionData, &iData);
3850 ExitOnFailure(hr, "Failed to read enable32BitAppOnWin64 value");
3851 // enable32BitAppOnWin64
3852 hr = Iis7PutPropertyBool(pAppPoolElement, IIS_CONFIG_ENABLE32, iData ? TRUE : FALSE);
3853 ExitOnFailure(hr, "Failed to set AppPool enable32BitAppOnWin64 value");
3854 break;
3855 }
3856 case IIS_APPPOOL_MANAGED_PIPELINE_MODE:
3857 {
3858 // managedPipelineMode
3859 hr = WcaReadStringFromCaData(ppwzCustomActionData, &pwzData);
3860 ExitOnFailure(hr, "Failed to read AppPool managedRuntimeVersion");
3861 hr = Iis7PutPropertyString(pAppPoolElement, IIS_CONFIG_PIPELINEMODE, pwzData);
3862 ExitOnFailure(hr, "Failed set AppPool managedPipelineMode property");
3863 break;
3864 }
3865 case IIS_APPPOOL_MANAGED_RUNTIME_VERSION:
3866 {
3867 // managedRuntimeVersion
3868 hr = WcaReadStringFromCaData(ppwzCustomActionData, &pwzData);
3869 ExitOnFailure(hr, "Failed to read AppPool managedRuntimeVersion");
3870 hr = Iis7PutPropertyString(pAppPoolElement, IIS_CONFIG_MANAGEDRUNTIMEVERSION, pwzData);
3871 ExitOnFailure(hr, "Failed set AppPool managedRuntimeVersion property");
3872 break;
3873 }
3874
3875 default:
3876 ExitOnFailure(hr = E_UNEXPECTED, "Unexpected IIS Config action specified for AppPool");
3877 break;
3878
3879 }
3880 // Get AppPool property action
3881 hr = WcaReadIntegerFromCaData(ppwzCustomActionData, &iAction);
3882 ExitOnFailure(hr, "Failed to read AppPool Property action");
3883 }
3884
3885LExit:
3886 ReleaseObject(pAppPools);
3887 ReleaseObject(pCollection);
3888 ReleaseObject(pCollection2);
3889 ReleaseObject(pAppPoolElement);
3890 ReleaseObject(pElement);
3891 ReleaseObject(pElement2);
3892 ReleaseObject(pElement3);
3893
3894 return hr;
3895}
3896
3897static HRESULT SetDirPropAuthentications(IAppHostWritableAdminManager *pAdminMgr,
3898 LPCWSTR wszConfigPath,
3899 DWORD dwData)
3900{
3901 HRESULT hr = S_OK;
3902 IAppHostElement *pSection = NULL;
3903
3904 //dwData contains bit flags for /security/authentication/<...>
3905 // Anonymous = 1
3906 // Basic = 2
3907 // Windows = 4
3908 // Digest =16
3909 // Passport =64 *not supported
3910 //translation required from bit map to section name
3911 // E.G security/authentication/windowsAuthentication [property enabled true|false]
3912
3913 // AnonymousAuthentication = 1
3914 hr = pAdminMgr->GetAdminSection(ScopeBSTR(L"system.webServer/security/authentication/anonymousAuthentication"), ScopeBSTR(wszConfigPath), &pSection);
3915 ExitOnFailure(hr, "Failed get AnonymousAuthentication section for DirProp");
3916 if (!pSection)
3917 {
3918 hr = HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND);
3919 ExitOnFailure(hr, "Failed get AnonymousAuthentication section object for DirProps");
3920 }
3921
3922 hr = Iis7PutPropertyBool(pSection, L"enabled", (BOOL)(dwData & 0x1));
3923 ExitOnFailure(hr, "Failed set AnonymousAuthentication enabled for DirProps");
3924 ReleaseNullObject(pSection);
3925
3926 // basicAuthentication = 2
3927 hr = pAdminMgr->GetAdminSection(ScopeBSTR(L"system.webServer/security/authentication/basicAuthentication"), ScopeBSTR(wszConfigPath), &pSection);
3928 ExitOnFailure(hr, "Failed get basicAuthentication section for DirProp");
3929 if (!pSection)
3930 {
3931 hr = HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND);
3932 ExitOnFailure(hr, "Failed get basicAuthentication section object for DirProps");
3933 }
3934
3935 hr = Iis7PutPropertyBool(pSection, L"enabled", (BOOL)(dwData & 0x2));
3936 ExitOnFailure(hr, "Failed set basicAuthentication enabled for DirProps");
3937 ReleaseNullObject(pSection);
3938
3939 // WindowsAuthentication = 4
3940 hr = pAdminMgr->GetAdminSection(ScopeBSTR(L"system.webServer/security/authentication/windowsAuthentication"), ScopeBSTR(wszConfigPath), &pSection);
3941 ExitOnFailure(hr, "Failed get windowsAuthentication section for DirProp");
3942 if (!pSection)
3943 {
3944 hr = HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND);
3945 ExitOnFailure(hr, "Failed get windowsAuthentication section object for DirProps");
3946 }
3947
3948 hr = Iis7PutPropertyBool(pSection, L"enabled", (BOOL)(dwData & 0x4));
3949 ExitOnFailure(hr, "Failed set windowsAuthentication enabled for DirProps");
3950 ReleaseNullObject(pSection);
3951
3952 // digestAuthentication = 16
3953 hr = pAdminMgr->GetAdminSection(ScopeBSTR(L"system.webServer/security/authentication/digestAuthentication"), ScopeBSTR(wszConfigPath), &pSection);
3954 ExitOnFailure(hr, "Failed get digestAuthentication section for DirProp");
3955 if (!pSection)
3956 {
3957 hr = HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND);
3958 ExitOnFailure(hr, "Failed get digestAuthentication section object for DirProps");
3959 }
3960
3961 hr = Iis7PutPropertyBool(pSection, L"enabled", (BOOL)(dwData & 0x10));
3962 ExitOnFailure(hr, "Failed set digestAuthentication enabled for DirProps");
3963 ReleaseNullObject(pSection);
3964
3965LExit:
3966 ReleaseObject(pSection);
3967
3968 return hr;
3969}
3970
3971static HRESULT SetDirPropAuthProvider(IAppHostWritableAdminManager *pAdminMgr,
3972 LPCWSTR wszConfigPath,
3973 __in LPWSTR wszData)
3974{
3975 HRESULT hr = S_OK;
3976 IAppHostElement *pSection = NULL;
3977 IAppHostElement *pElement = NULL;
3978 IAppHostElement *pNewElement = NULL;
3979 IAppHostElementCollection *pCollection = NULL;
3980
3981 WCHAR wcDelim[] = L",";
3982 const WCHAR *wszToken = NULL;
3983 WCHAR *wszNextToken = NULL;
3984
3985 hr = pAdminMgr->GetAdminSection(ScopeBSTR(L"system.webServer/security/authentication/windowsAuthentication"), ScopeBSTR(wszConfigPath), &pSection);
3986 ExitOnFailure(hr, "Failed get windowsAuthentication section for DirProp providers");
3987
3988 hr = pSection->GetElementByName(ScopeBSTR(L"providers"), &pElement);
3989 ExitOnFailure(hr, "Failed get win auth providers section");
3990
3991 hr = pElement->get_Collection(&pCollection);
3992 ExitOnFailure(hr, "Failed get win auth providers collection");
3993
3994 hr = pCollection->Clear();
3995 ExitOnFailure(hr, "Failed to clear win auth providers collection");
3996
3997 //Clear out inherited items - add clear
3998 hr = pCollection->CreateNewElement(ScopeBSTR(IIS_CONFIG_CLEAR), &pNewElement);
3999 ExitOnFailure(hr, "Failed to create win auth providers clear element");
4000 hr = pCollection->AddElement(pNewElement);
4001 ExitOnFailure(hr, "Failed to add win auth providers clear element");
4002 ReleaseNullObject(pNewElement);
4003
4004 wszToken = wcstok_s( wszData, wcDelim, &wszNextToken);
4005 for (int i = 0; (wszToken); ++i)
4006 {
4007 hr = pCollection->CreateNewElement(ScopeBSTR(IIS_CONFIG_ADD), &pNewElement);
4008 ExitOnFailure(hr, "Failed to create win auth providers element");
4009
4010 hr = Iis7PutPropertyString( pNewElement, IIS_CONFIG_VALUE, wszToken);
4011 ExitOnFailure(hr, "Failed to set win auth providers value");
4012
4013 hr = pCollection->AddElement(pNewElement, i);
4014 ExitOnFailure(hr, "Failed to add win auth providers element");
4015 ReleaseNullObject(pNewElement);
4016
4017 wszToken = wcstok_s( NULL, wcDelim, &wszNextToken);
4018 }
4019
4020LExit:
4021 ReleaseObject(pSection);
4022 ReleaseObject(pCollection);
4023 ReleaseObject(pElement);
4024 ReleaseObject(pNewElement);
4025
4026 return hr;
4027}
4028
4029static HRESULT SetDirPropDefDoc(
4030 IAppHostWritableAdminManager *pAdminMgr,
4031 LPCWSTR wszConfigPath,
4032 __in LPWSTR wszData)
4033{
4034 HRESULT hr = S_OK;
4035 IAppHostElement *pSection = NULL;
4036 IAppHostElement *pElement = NULL;
4037 IAppHostElement *pNewElement = NULL;
4038 IAppHostElementCollection *pCollection = NULL;
4039
4040 WCHAR wcDelim[] = L",";
4041 const WCHAR *wszToken = NULL;
4042 WCHAR *wszNextToken = NULL;
4043
4044 hr = pAdminMgr->GetAdminSection(ScopeBSTR(IIS_CONFIG_DEFAULTDOC_SECTION), ScopeBSTR(wszConfigPath), &pSection);
4045 ExitOnFailure(hr, "Failed get defaultDocument section for DirProp");
4046
4047 hr = pSection->GetElementByName(ScopeBSTR(L"files"), &pElement);
4048 ExitOnFailure(hr, "Failed get win files section");
4049
4050 hr = pElement->get_Collection(&pCollection);
4051 ExitOnFailure(hr, "Failed get files collection");
4052
4053 hr = pCollection->Clear();
4054 ExitOnFailure(hr, "Failed clear files collection");
4055
4056 //Clear out inherited items - add clear
4057 hr = pCollection->CreateNewElement(ScopeBSTR(IIS_CONFIG_CLEAR), &pNewElement);
4058 ExitOnFailure(hr, "Failed to create files clear element");
4059 hr = pCollection->AddElement(pNewElement);
4060 ExitOnFailure(hr, "Failed to add files clear element");
4061
4062 wszToken = wcstok_s( wszData, wcDelim, &wszNextToken);
4063 for (int i = 0; (wszToken); ++i)
4064 {
4065 hr = pCollection->CreateNewElement(ScopeBSTR(IIS_CONFIG_ADD), &pNewElement);
4066 ExitOnFailure(hr, "Failed to create win auth providers element");
4067
4068 hr = Iis7PutPropertyString( pNewElement, IIS_CONFIG_VALUE, wszToken);
4069 ExitOnFailure(hr, "Failed to set win auth providers value");
4070
4071 hr = pCollection->AddElement(pNewElement, i);
4072 ExitOnFailure(hr, "Failed to add defaultDocument Files element");
4073 ReleaseNullObject(pNewElement);
4074
4075 wszToken = wcstok_s( NULL, wcDelim, &wszNextToken);
4076 }
4077
4078LExit:
4079 ReleaseObject(pSection);
4080 ReleaseObject(pCollection);
4081 ReleaseObject(pNewElement);
4082
4083 return hr;
4084}
4085
4086static HRESULT ClearLocationTag(
4087 IAppHostWritableAdminManager *pAdminMgr,
4088 LPCWSTR swLocationPath
4089 )
4090{
4091 HRESULT hr = S_OK;
4092 IAppHostConfigManager *pConfigMgr = NULL;
4093 IAppHostConfigFile *pConfigFile = NULL;
4094 IAppHostConfigLocationCollection *pLocationCollection = NULL;
4095 IAppHostConfigLocation *pLocation = NULL;
4096
4097 DWORD dwCount = 0;
4098 BSTR bstrLocationPath = NULL;
4099
4100 hr = pAdminMgr->get_ConfigManager(&pConfigMgr);
4101 ExitOnFailure(hr, "Failed to get IIS ConfigManager interface");
4102
4103 hr = pConfigMgr->GetConfigFile(ScopeBSTR(IIS_CONFIG_APPHOST_ROOT), &pConfigFile);
4104 ExitOnFailure(hr, "Failed to get IIS ConfigFile interface");
4105
4106 hr = pConfigFile->get_Locations(&pLocationCollection);
4107 ExitOnFailure(hr, "Failed to get IIS location tag collection");
4108
4109 hr = pLocationCollection->get_Count(&dwCount);
4110 ExitOnFailure(hr, "Failed to get IIS location collection count");
4111
4112 VARIANT vtIndex;
4113 vtIndex.vt = VT_UI4;
4114 for (DWORD i = 0; i < dwCount; ++i)
4115 {
4116 vtIndex.ulVal = i;
4117 hr = pLocationCollection->get_Item(vtIndex, &pLocation);
4118 ExitOnFailure(hr, "Failed to get IIS location collection count");
4119
4120 hr = pLocation->get_Path(&bstrLocationPath);
4121 if (CSTR_EQUAL == ::CompareStringW(LOCALE_INVARIANT, NORM_IGNORECASE, swLocationPath, -1, bstrLocationPath, -1))
4122 {
4123 hr = pLocationCollection->DeleteLocation(vtIndex);
4124 ExitOnFailure(hr, "Failed to delete IIS location tag %ls",swLocationPath);
4125 break;
4126 }
4127
4128 ReleaseNullObject(pLocation);
4129 ::SysFreeString(bstrLocationPath);
4130 bstrLocationPath = NULL;
4131 }
4132LExit:
4133 ReleaseObject(pConfigMgr);
4134 ReleaseObject(pConfigFile);
4135 ReleaseObject(pLocationCollection);
4136 ReleaseObject(pLocation);
4137 ReleaseBSTR(bstrLocationPath);
4138
4139 return hr;
4140
4141}
4142
4143static HRESULT DeleteCollectionElement(
4144 __in IAppHostElementCollection *pCollection,
4145 __in LPCWSTR pwzElementName,
4146 __in LPCWSTR pwzAttributeName,
4147 __in LPCWSTR pwzAttributeValue
4148 )
4149{
4150 HRESULT hr = S_OK;
4151
4152 DWORD dwIndex;
4153 VARIANT vtIndex;
4154 VariantInit(&vtIndex);
4155
4156 hr = Iis7FindAppHostElementString(pCollection, pwzElementName, pwzAttributeName, pwzAttributeValue, NULL, &dwIndex);
4157 ExitOnFailure(hr, "Failed while finding IAppHostElement %ls/@%ls=%ls", pwzElementName, pwzAttributeName, pwzAttributeValue);
4158
4159 if (MAXDWORD != dwIndex)
4160 {
4161 vtIndex.vt = VT_UI4;
4162 vtIndex.ulVal = dwIndex;
4163 hr = pCollection->DeleteElement(vtIndex);
4164 ExitOnFailure(hr, "Failed to delete IAppHostElement %ls/@%ls=%ls", pwzElementName, pwzAttributeName, pwzAttributeValue);
4165 }
4166 // else : nothing to do, already deleted
4167LExit:
4168 ReleaseVariant(vtIndex);
4169
4170 return hr;
4171}
4172static void ConvSecToHMS( int Sec, __out_ecount(cchDest) LPWSTR wcTime, size_t cchDest)
4173{
4174 int ZH, ZM, ZS = 0;
4175
4176 ZH = (Sec / 3600);
4177 Sec = Sec - ZH * 3600;
4178 ZM = (Sec / 60) ;
4179 Sec = Sec - ZM * 60;
4180 ZS = Sec ;
4181
4182 HRESULT hr = ::StringCchPrintfW(wcTime, cchDest, L"%02d:%02d:%02d", ZH, ZM, ZS);
4183 if (S_OK != hr)
4184 {
4185 *wcTime = '\0';
4186 }
4187}
4188static void ConvSecToDHMS( unsigned int Sec, __out_ecount(cchDest) LPWSTR wcTime, size_t cchDest)
4189{
4190 int ZD, ZH, ZM, ZS = 0;
4191
4192 ZD = Sec / 86400;
4193 Sec = Sec - ZD * 86400;
4194 ZH = (Sec / 3600);
4195 Sec = Sec - ZH * 3600;
4196 ZM = (Sec / 60) ;
4197 Sec = Sec - ZM * 60;
4198 ZS = Sec ;
4199
4200 HRESULT hr = ::StringCchPrintfW(wcTime, cchDest, L"%d.%02d:%02d:%02d", ZD, ZH, ZM, ZS);
4201 if (S_OK != hr)
4202 {
4203 *wcTime = '\0';
4204 }
4205}
diff --git a/src/ext/Iis/ca/scaexecIIS7.h b/src/ext/Iis/ca/scaexecIIS7.h
new file mode 100644
index 00000000..ec31f202
--- /dev/null
+++ b/src/ext/Iis/ca/scaexecIIS7.h
@@ -0,0 +1,5 @@
1#pragma once
2// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
3
4
5HRESULT IIS7ConfigChanges(MSIHANDLE hInstall, __inout LPWSTR pwzData);
diff --git a/src/ext/Iis/ca/scafilter.cpp b/src/ext/Iis/ca/scafilter.cpp
new file mode 100644
index 00000000..9d9014fd
--- /dev/null
+++ b/src/ext/Iis/ca/scafilter.cpp
@@ -0,0 +1,510 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3#include "precomp.h"
4
5// prototypes
6static HRESULT ReadFilterLoadOrder(
7 __in IMSAdminBase* piMetabase,
8 __in LPCWSTR wzFilterRoot,
9 __out LPWSTR *ppwzLoadOrder
10 );
11static HRESULT AddFilterToLoadOrder(
12 __in LPCWSTR wzFilter,
13 __in int iLoadOrder,
14 __inout LPWSTR *ppwzLoadOrder
15 );
16static HRESULT RemoveFilterFromLoadOrder(
17 __in LPCWSTR wzFilter,
18 __inout LPWSTR *ppwzLoadOrder
19 );
20
21
22UINT __stdcall ScaFiltersRead(
23 __in IMSAdminBase* piMetabase,
24 __in SCA_WEB* pswList,
25 __in WCA_WRAPQUERY_HANDLE hWebBaseQuery,
26 __inout SCA_FILTER** ppsfList,
27 __inout LPWSTR *ppwzCustomActionData
28 )
29{
30 HRESULT hr = S_OK;
31 MSIHANDLE hRec;
32 INSTALLSTATE isInstalled = INSTALLSTATE_UNKNOWN;
33 INSTALLSTATE isAction = INSTALLSTATE_UNKNOWN;
34
35 LPWSTR pwzData = NULL;
36
37 SCA_FILTER* psf = NULL;
38 WCA_WRAPQUERY_HANDLE hWrapQuery = NULL;
39
40 hr = WcaBeginUnwrapQuery(&hWrapQuery, ppwzCustomActionData);
41 ExitOnFailure(hr, "Failed to unwrap query for ScaAppPoolRead");
42
43 if (0 == WcaGetQueryRecords(hWrapQuery))
44 {
45 WcaLog(LOGMSG_VERBOSE, "Skipping ScaFiltersRead() - no IIsFilter table");
46 ExitFunction1(hr = S_FALSE);
47 }
48
49 // loop through all the filters
50 while (S_OK == (hr = WcaFetchWrappedRecord(hWrapQuery, &hRec)))
51 {
52 // Get the Component first. If the component is not being modified during
53 // this transaction, skip processing this whole record.
54 hr = WcaGetRecordString(hRec, fqComponent, &pwzData);
55 ExitOnFailure(hr, "failed to get IIsFilter.Component");
56
57 hr = WcaGetRecordInteger(hRec, fqInstalled, (int *)&isInstalled);
58 ExitOnFailure(hr, "Failed to get Component installed state for IIs filter");
59
60 hr = WcaGetRecordInteger(hRec, fqAction, (int *)&isAction);
61 ExitOnFailure(hr, "Failed to get Component action state for IIs filter");
62
63 if (!WcaIsInstalling(isInstalled, isAction) &&
64 !WcaIsReInstalling(isInstalled, isAction) &&
65 !WcaIsUninstalling(isInstalled, isAction))
66 {
67 continue; // skip this record.
68 }
69
70 hr = AddFilterToList(ppsfList);
71 ExitOnFailure(hr, "failed to add filter to list");
72
73 psf = *ppsfList;
74
75 hr = ::StringCchCopyW(psf->wzComponent, countof(psf->wzComponent), pwzData);
76 ExitOnFailure(hr, "failed to copy component name: %ls", pwzData);
77
78 psf->isInstalled = isInstalled;
79 psf->isAction = isAction;
80
81 hr = WcaGetRecordString(hRec, fqWeb, &pwzData);
82 ExitOnFailure(hr, "Failed to get Web for VirtualDir");
83
84 if (*pwzData)
85 {
86 hr = ScaWebsGetBase(piMetabase, pswList, pwzData, psf->wzWebBase, countof(psf->wzWebBase), hWebBaseQuery);
87 if (FAILED(hr) && WcaIsUninstalling(isInstalled, isAction))
88 {
89 // If we're uninstalling, don't bother finding the existing web, just leave the filter root empty
90 hr = S_OK;
91 }
92 ExitOnFailure(hr, "Failed to get base of web for Filter");
93
94 if (0 != lstrlenW(psf->wzWebBase))
95 {
96 hr = ::StringCchPrintfW(psf->wzFilterRoot, countof(psf->wzFilterRoot), L"%s/Filters", psf->wzWebBase);
97 ExitOnFailure(hr, "Failed to allocate filter base string");
98 }
99 }
100 else
101 {
102 hr = ::StringCchCopyW(psf->wzFilterRoot, countof(psf->wzFilterRoot), L"/LM/W3SVC/Filters");
103 ExitOnFailure(hr, "Failed to allocate global filter base string");
104 }
105
106 // filter key
107 hr = WcaGetRecordString(hRec, fqFilter, &pwzData);
108 ExitOnFailure(hr, "Failed to get Filter.Filter");
109 hr = ::StringCchCopyW(psf->wzKey, countof(psf->wzKey), pwzData);
110 ExitOnFailure(hr, "Failed to copy key string to filter object");
111
112 // filter path
113 hr = WcaGetRecordString(hRec, fqPath, &pwzData);
114 ExitOnFailure(hr, "Failed to get Filter.Path");
115 hr = ::StringCchCopyW(psf->wzPath, countof(psf->wzPath), pwzData);
116 ExitOnFailure(hr, "Failed to copy path string to filter object");
117
118 // filter description
119 hr = WcaGetRecordString(hRec, fqDescription, &pwzData);
120 ExitOnFailure(hr, "Failed to get Filter.Description");
121 hr = ::StringCchCopyW(psf->wzDescription, countof(psf->wzDescription), pwzData);
122 ExitOnFailure(hr, "Failed to copy description string to filter object");
123
124 // filter flags
125 hr = WcaGetRecordInteger(hRec, fqFlags, &psf->iFlags);
126 ExitOnFailure(hr, "Failed to get Filter.Flags");
127
128 // filter load order
129 hr = WcaGetRecordInteger(hRec, fqLoadOrder, &psf->iLoadOrder);
130 ExitOnFailure(hr, "Failed to get Filter.LoadOrder");
131 }
132
133 if (E_NOMOREITEMS == hr)
134 {
135 hr = S_OK;
136 }
137 ExitOnFailure(hr, "Failure while processing filters");
138
139LExit:
140 WcaFinishUnwrapQuery(hWrapQuery);
141
142 ReleaseStr(pwzData);
143 return hr;
144}
145
146
147HRESULT ScaFiltersInstall(
148 __in IMSAdminBase* piMetabase,
149 __in SCA_FILTER* psfList
150 )
151{
152 HRESULT hr = S_OK;
153 SCA_FILTER* psf = psfList;
154 LPCWSTR wzPreviousFilterRoot = NULL;
155 LPWSTR pwzLoadOrder = NULL;
156
157 while (psf)
158 {
159 if (WcaIsInstalling(psf->isInstalled, psf->isAction))
160 {
161 if (!wzPreviousFilterRoot || CSTR_EQUAL != ::CompareStringW(LOCALE_INVARIANT, 0, wzPreviousFilterRoot, -1, psf->wzFilterRoot, -1))
162 {
163 if (pwzLoadOrder)
164 {
165 hr = ScaWriteMetabaseValue(piMetabase, wzPreviousFilterRoot, L"", MD_FILTER_LOAD_ORDER, METADATA_NO_ATTRIBUTES, IIS_MD_UT_SERVER, STRING_METADATA, (LPVOID)pwzLoadOrder);
166 ExitOnFailure(hr, "Failed to write filter load order to metabase");
167
168 ReleaseNullStr(pwzLoadOrder);
169 }
170
171 hr = ReadFilterLoadOrder(piMetabase, psf->wzFilterRoot, &pwzLoadOrder);
172 ExitOnFailure(hr, "Failed to read filter load order.");
173
174 wzPreviousFilterRoot = psf->wzFilterRoot;
175 }
176
177 hr = ScaCreateMetabaseKey(piMetabase, psf->wzFilterRoot, psf->wzKey);
178 ExitOnFailure(hr, "Failed to create key for filter '%ls'", psf->wzKey);
179
180 hr = ScaWriteMetabaseValue(piMetabase, psf->wzFilterRoot, psf->wzKey, MD_KEY_TYPE, METADATA_NO_ATTRIBUTES, IIS_MD_UT_SERVER, STRING_METADATA, (LPVOID)L"IIsFilter");
181 ExitOnFailure(hr, "Failed to write key type for filter '%ls'", psf->wzKey);
182
183 // filter path
184 hr = ScaWriteMetabaseValue(piMetabase, psf->wzFilterRoot, psf->wzKey, MD_FILTER_IMAGE_PATH, METADATA_NO_ATTRIBUTES, IIS_MD_UT_SERVER, STRING_METADATA, (LPVOID)psf->wzPath);
185 ExitOnFailure(hr, "Failed to write Path for filter '%ls'", psf->wzKey);
186
187 // filter description
188 hr = ScaWriteMetabaseValue(piMetabase, psf->wzFilterRoot, psf->wzKey, MD_FILTER_DESCRIPTION, METADATA_NO_ATTRIBUTES, IIS_MD_UT_SERVER, STRING_METADATA, (LPVOID)psf->wzDescription);
189 ExitOnFailure(hr, "Failed to write Description for filter '%ls'", psf->wzKey);
190
191 // filter flags
192 if (MSI_NULL_INTEGER != psf->iFlags)
193 {
194 hr = ScaWriteMetabaseValue(piMetabase, psf->wzFilterRoot, psf->wzKey, MD_FILTER_FLAGS, METADATA_NO_ATTRIBUTES, IIS_MD_UT_SERVER, DWORD_METADATA, (LPVOID)((DWORD_PTR)psf->iFlags));
195 ExitOnFailure(hr, "Failed to write Flags for filter '%ls'", psf->wzKey);
196 }
197
198 // filter load order
199 if (MSI_NULL_INTEGER != psf->iLoadOrder)
200 {
201 hr = AddFilterToLoadOrder(psf->wzKey, psf->iLoadOrder, &pwzLoadOrder);
202 ExitOnFailure(hr, "Failed to add filter '%ls' to load order.", psf->wzKey);
203 }
204 }
205
206 psf = psf->psfNext;
207 }
208
209 if (pwzLoadOrder)
210 {
211 Assert(wzPreviousFilterRoot && *wzPreviousFilterRoot);
212
213 hr = ScaWriteMetabaseValue(piMetabase, wzPreviousFilterRoot, L"", MD_FILTER_LOAD_ORDER, METADATA_NO_ATTRIBUTES, IIS_MD_UT_SERVER, STRING_METADATA, (LPVOID)pwzLoadOrder);
214 ExitOnFailure(hr, "Failed to write filter load order to metabase");
215 }
216
217LExit:
218 ReleaseStr(pwzLoadOrder);
219 return hr;
220}
221
222
223HRESULT ScaFiltersUninstall(
224 __in IMSAdminBase* piMetabase,
225 __in SCA_FILTER* psfList
226 )
227{
228 HRESULT hr = S_OK;
229 SCA_FILTER* psf = psfList;
230 LPCWSTR wzPreviousFilterRoot = NULL;
231 LPWSTR pwzLoadOrder = NULL;
232
233 while (psf)
234 {
235 if (WcaIsUninstalling(psf->isInstalled, psf->isAction))
236 {
237 if (!wzPreviousFilterRoot || CSTR_EQUAL != ::CompareStringW(LOCALE_INVARIANT, 0, wzPreviousFilterRoot, -1, psf->wzFilterRoot, -1))
238 {
239 if (pwzLoadOrder)
240 {
241 hr = ScaWriteMetabaseValue(piMetabase, wzPreviousFilterRoot, L"", MD_FILTER_LOAD_ORDER, METADATA_NO_ATTRIBUTES, IIS_MD_UT_SERVER, STRING_METADATA, (LPVOID)pwzLoadOrder);
242 ExitOnFailure(hr, "Failed to write filter load order to metabase");
243
244 ReleaseNullStr(pwzLoadOrder);
245 }
246
247 hr = ReadFilterLoadOrder(piMetabase, psf->wzFilterRoot, &pwzLoadOrder);
248 ExitOnFailure(hr, "Failed to read filter load order.");
249
250 wzPreviousFilterRoot = psf->wzFilterRoot;
251 }
252
253 hr = RemoveFilterFromLoadOrder(psf->wzKey, &pwzLoadOrder);
254 ExitOnFailure(hr, "Failed to remove filter '%ls' from load order", psf->wzKey);
255
256 // remove the filter from the load order and remove the filter's key
257 if (0 != lstrlenW(psf->wzFilterRoot))
258 {
259 hr = ScaDeleteMetabaseKey(piMetabase, psf->wzFilterRoot, psf->wzKey);
260 ExitOnFailure(hr, "Failed to remove web '%ls' from metabase", psf->wzKey);
261 }
262 }
263
264 psf = psf->psfNext;
265 }
266
267 if (pwzLoadOrder)
268 {
269 Assert(wzPreviousFilterRoot && *wzPreviousFilterRoot);
270
271 hr = ScaWriteMetabaseValue(piMetabase, wzPreviousFilterRoot, L"", MD_FILTER_LOAD_ORDER, METADATA_NO_ATTRIBUTES, IIS_MD_UT_SERVER, STRING_METADATA, (LPVOID)pwzLoadOrder);
272 ExitOnFailure(hr, "Failed to write filter load order to metabase");
273 }
274
275LExit:
276 return hr;
277}
278
279
280void ScaFiltersFreeList(
281 __in SCA_FILTER* psfList
282 )
283{
284 SCA_FILTER* psfDelete = psfList;
285 while (psfList)
286 {
287 psfDelete = psfList;
288 psfList = psfList->psfNext;
289
290 MemFree(psfDelete);
291 }
292}
293
294HRESULT AddFilterToList(
295 __inout SCA_FILTER** ppsfList)
296{
297 HRESULT hr = S_OK;
298 SCA_FILTER* psf = static_cast<SCA_FILTER*>(MemAlloc(sizeof(SCA_FILTER), TRUE));
299 ExitOnNull(psf, hr, E_OUTOFMEMORY, "failed to add filter to filter list");
300
301 psf->psfNext = *ppsfList;
302 *ppsfList = psf;
303
304LExit:
305 return hr;
306}
307
308// private helper functions
309
310
311static HRESULT ReadFilterLoadOrder(
312 __in IMSAdminBase* piMetabase,
313 __in LPCWSTR wzFilterRoot,
314 __out LPWSTR *ppwzLoadOrder
315 )
316{
317 HRESULT hr = S_OK;
318 METADATA_HANDLE mhRoot = NULL;
319
320 METADATA_RECORD mr;
321 DWORD dwRequired = 0;
322 DWORD cchData = 255;
323
324 ::ZeroMemory(&mr, sizeof(mr));
325 mr.dwMDIdentifier = MD_FILTER_LOAD_ORDER;
326 mr.dwMDAttributes = METADATA_NO_ATTRIBUTES;
327 mr.dwMDUserType = IIS_MD_UT_SERVER;
328 mr.dwMDDataType = ALL_METADATA;
329 mr.dwMDDataLen = cchData;
330 mr.pbMDData = static_cast<BYTE*>(MemAlloc(mr.dwMDDataLen * sizeof(WCHAR), TRUE));
331 ExitOnNull(mr.pbMDData, hr, E_OUTOFMEMORY, "failed to allocate memory for MDData in metadata record");
332
333 hr = piMetabase->OpenKey(METADATA_MASTER_ROOT_HANDLE, wzFilterRoot, METADATA_PERMISSION_READ | METADATA_PERMISSION_WRITE, 10, &mhRoot);
334 for (int i = 30; i > 0 && HRESULT_FROM_WIN32(ERROR_PATH_BUSY) == hr; i--)
335 {
336 ::Sleep(1000);
337 WcaLog(LOGMSG_STANDARD, "Failed to open root key, retrying %d time(s)...", i);
338 hr = piMetabase->OpenKey(METADATA_MASTER_ROOT_HANDLE, wzFilterRoot, METADATA_PERMISSION_READ | METADATA_PERMISSION_WRITE, 10, &mhRoot);
339 }
340
341 if (SUCCEEDED(hr))
342 {
343 hr = piMetabase->GetData(mhRoot, L"", &mr, &dwRequired);
344 if (HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER) == hr)
345 {
346 mr.dwMDDataLen = cchData = dwRequired;
347
348 LPVOID pv = MemReAlloc(mr.pbMDData, mr.dwMDDataLen * sizeof(WCHAR), TRUE);
349 ExitOnNull(pv, hr, E_OUTOFMEMORY, "failed to allocate memory for MDData in metadata record");
350 mr.pbMDData = static_cast<BYTE*>(pv);
351
352 hr = piMetabase->GetData(mhRoot, L"", &mr, &dwRequired);
353 }
354 }
355
356 // The /Filters node or /Filters/FilterLoadOrder property might not exist (yet).
357 if (HRESULT_FROM_WIN32(ERROR_PATH_NOT_FOUND) == hr || MD_ERROR_DATA_NOT_FOUND == hr)
358 {
359 hr = S_OK;
360 }
361 ExitOnFailure(hr, "Failed to get filter load order.");
362
363 hr = StrAllocString(ppwzLoadOrder, reinterpret_cast<LPCWSTR>(mr.pbMDData), 0);
364 ExitOnFailure(hr, "Failed to allocate string for filter load order.");
365
366LExit:
367 ReleaseMem(mr.pbMDData);
368
369 if (mhRoot)
370 {
371 piMetabase->CloseKey(mhRoot);
372 }
373
374 return hr;
375}
376
377
378static HRESULT AddFilterToLoadOrder(
379 __in LPCWSTR wzFilter,
380 __in int iLoadOrder,
381 __inout LPWSTR *ppwzLoadOrder
382 )
383{
384 HRESULT hr = S_OK;
385 LPCWSTR wzLoadOrder = *ppwzLoadOrder;
386 int cchFilter = lstrlenW(wzFilter);
387 LPWSTR pwzTemp = NULL;
388
389 // If the filter name ends with '\0' or ',' and
390 // the filter name begins at the beginning of the list or with ','
391 // Then we've found the exact filter by name.
392 //
393 // If the filter isn't already in the load order, add it
394 if (wzLoadOrder && *wzLoadOrder)
395 {
396 LPCWSTR pwz = wcsstr(wzLoadOrder, wzFilter);
397
398 if (NULL != pwz &&
399 (L'\0' == *(pwz + cchFilter) || L',' == *(pwz + cchFilter)) &&
400 (pwz == wzLoadOrder || L',' == *(pwz - 1)))
401 {
402 // Filter already in the load order, no work to do.
403 }
404 else
405 {
406 pwz = NULL;
407 if (0 <= iLoadOrder)
408 {
409 pwz = wzLoadOrder;
410 for (int i = 0; i < iLoadOrder && pwz; ++i)
411 {
412 pwz = wcsstr(pwz, L",");
413 }
414 }
415
416 if (NULL == pwz) // put the filter at the end of the order
417 {
418 Assert(wzLoadOrder && *wzLoadOrder);
419
420 // tack on a comma since there are other filters in the order
421 hr = StrAllocConcat(ppwzLoadOrder, L",", 1);
422 ExitOnFailure(hr, "Failed to append a comma to filter load order.");
423
424 hr = StrAllocConcat(ppwzLoadOrder, wzFilter, cchFilter);
425 ExitOnFailure(hr, "Failed to append the filter on to the load order.");
426 }
427 else if (L',' == *pwz) // put the filter in the middle of the order
428 {
429 hr = StrAllocString(&pwzTemp, wzLoadOrder, pwz - wzLoadOrder + 1);
430 ExitOnFailure(hr, "Failed to copy first half of filter load order to temp string.");
431
432 hr = StrAllocConcat(&pwzTemp, wzFilter, 0);
433 ExitOnFailure(hr, "Failed to copy filter into load order.");
434
435 hr = StrAllocConcat(&pwzTemp, pwz, 0);
436 ExitOnFailure(hr, "Failed to copy remaining filter load order back onto load order.");
437
438 hr = StrAllocString(ppwzLoadOrder, pwzTemp, 0);
439 ExitOnFailure(hr, "Failed to copy temp string to load order string.");
440 }
441 else // put the filter at the beginning of the order
442 {
443 hr = StrAllocPrefix(ppwzLoadOrder, L",", 1);
444 ExitOnFailure(hr, "Failed to prepend a comma to filter load order.");
445
446 hr = StrAllocPrefix(ppwzLoadOrder, wzFilter, cchFilter);
447 ExitOnFailure(hr, "Failed to prepend the filter on to the load order.");
448 }
449 }
450 }
451 else
452 {
453 hr = StrAllocString(ppwzLoadOrder, wzFilter, cchFilter);
454 ExitOnFailure(hr, "Failed to add filter to load order.");
455 }
456
457LExit:
458 ReleaseStr(pwzTemp);
459 return hr;
460}
461
462
463static HRESULT RemoveFilterFromLoadOrder(
464 __in LPCWSTR wzFilter,
465 __inout LPWSTR *ppwzLoadOrder
466 )
467{
468 HRESULT hr = S_OK;
469 int cchFilter = lstrlenW(wzFilter);
470
471 LPCWSTR pwzStart = NULL;
472 LPWSTR pwzFind = NULL;
473
474 pwzStart = pwzFind = *ppwzLoadOrder;
475 while (NULL != (pwzFind = wcsstr(pwzFind, wzFilter)))
476 {
477 // Make sure to only match [wzFilter] and NOT foo[wzFilter]bar
478 if (pwzFind == pwzStart || L',' == *(pwzFind - 1))
479 {
480 int cchRemainder = lstrlenW(pwzFind) - cchFilter + 1; // add one to include the null terminator
481
482 if (L'\0' == *(pwzFind + cchFilter))
483 {
484 if (pwzFind == pwzStart)
485 {
486 memmove(pwzFind, pwzFind + cchFilter, cchRemainder * sizeof(WCHAR)); // copy down the null terminator
487 }
488 else
489 {
490 memmove(pwzFind - 1, pwzFind + cchFilter, cchRemainder * sizeof(WCHAR)); // copy down the null terminator over top the trailing ","
491 }
492 }
493 else if (L',' == *(pwzFind + cchFilter))
494 {
495 memmove(pwzFind, pwzFind + cchFilter + 1, (cchRemainder - 1) * sizeof(WCHAR)); // skip copying the ","
496 }
497 else // skip past the partial match
498 {
499 pwzFind = pwzFind + cchFilter;
500 }
501 }
502 else // skip past the partial match
503 {
504 pwzFind = pwzFind + cchFilter;
505 }
506 }
507
508//LExit:
509 return hr;
510}
diff --git a/src/ext/Iis/ca/scafilter.h b/src/ext/Iis/ca/scafilter.h
new file mode 100644
index 00000000..d072bf22
--- /dev/null
+++ b/src/ext/Iis/ca/scafilter.h
@@ -0,0 +1,46 @@
1#pragma once
2// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
3
4
5#include "scaweb.h"
6
7enum eFilterQuery { fqWeb = 1, fqFilter, fqComponent , fqPath, fqDescription, fqFlags, fqLoadOrder, fqInstalled, fqAction };
8
9struct SCA_FILTER
10{
11 // darwin information
12 WCHAR wzKey[MAX_DARWIN_KEY + 1];
13 WCHAR wzComponent[MAX_DARWIN_KEY + 1];
14 INSTALLSTATE isInstalled;
15 INSTALLSTATE isAction;
16
17 // metabase information
18 WCHAR wzWebKey[MAX_DARWIN_KEY + 1];
19 WCHAR wzWebBase[METADATA_MAX_NAME_LEN + 1];
20 WCHAR wzFilterRoot[METADATA_MAX_NAME_LEN + 1];
21
22 // iis configuation information
23 WCHAR wzPath[MAX_PATH];
24 WCHAR wzDescription[MAX_DARWIN_COLUMN + 1];
25 int iFlags;
26 int iLoadOrder;
27
28 SCA_FILTER* psfNext;
29};
30
31
32// prototypes
33HRESULT AddFilterToList(
34 __in SCA_FILTER** ppsfList
35 );
36
37UINT __stdcall ScaFiltersRead(IMSAdminBase* piMetabase,
38 SCA_WEB* pswList, __in WCA_WRAPQUERY_HANDLE hWebBaseQuery, SCA_FILTER** ppsfList,
39 __inout LPWSTR *ppwzCustomActionData);
40
41HRESULT ScaFiltersInstall(IMSAdminBase* piMetabase, SCA_FILTER* psfList);
42
43HRESULT ScaFiltersUninstall(IMSAdminBase* piMetabase, SCA_FILTER* psfList);
44
45void ScaFiltersFreeList(SCA_FILTER* psfList);
46
diff --git a/src/ext/Iis/ca/scafilter7.cpp b/src/ext/Iis/ca/scafilter7.cpp
new file mode 100644
index 00000000..dda91c4d
--- /dev/null
+++ b/src/ext/Iis/ca/scafilter7.cpp
@@ -0,0 +1,284 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3#include "precomp.h"
4
5static HRESULT WriteFilter(const SCA_FILTER* psf);
6
7UINT __stdcall ScaFiltersRead7(
8 __in SCA_WEB7* pswList,
9 __in WCA_WRAPQUERY_HANDLE /*hWebBaseQuery*/,
10 __inout SCA_FILTER** ppsfList,
11 __inout LPWSTR *ppwzCustomActionData
12 )
13{
14 HRESULT hr = S_OK;
15 MSIHANDLE hRec;
16 INSTALLSTATE isInstalled = INSTALLSTATE_UNKNOWN;
17 INSTALLSTATE isAction = INSTALLSTATE_UNKNOWN;
18 SCA_FILTER* psf;
19
20 LPWSTR pwzData = NULL;
21 WCA_WRAPQUERY_HANDLE hWrapQuery = NULL;
22 hr = WcaBeginUnwrapQuery(&hWrapQuery, ppwzCustomActionData);
23 ExitOnFailure(hr, "Failed to unwrap query for ScaAppPoolRead");
24
25 if (0 == WcaGetQueryRecords(hWrapQuery))
26 {
27 WcaLog(LOGMSG_VERBOSE, "Skipping ScaFiltersRead() - no IIsFilter table");
28 ExitFunction1(hr = S_FALSE);
29 }
30
31 // loop through all the filters
32 while (S_OK == (hr = WcaFetchWrappedRecord(hWrapQuery, &hRec)))
33 {
34 // Get the Component first. If the component is not being modified during
35 // this transaction, skip processing this whole record.
36 // get the darwin information
37 hr = WcaGetRecordString(hRec, fqComponent, &pwzData);
38 ExitOnFailure(hr, "failed to get IIsFilter.Component");
39
40 hr = WcaGetRecordInteger(hRec, fqInstalled, (int *)&isInstalled);
41 ExitOnFailure(hr, "Failed to get Component installed state for IIs filter");
42
43 hr = WcaGetRecordInteger(hRec, fqAction, (int *)&isAction);
44 ExitOnFailure(hr, "Failed to get Component action state for IIs filter");
45
46 if (!WcaIsInstalling(isInstalled, isAction) &&
47 !WcaIsReInstalling(isInstalled, isAction) &&
48 !WcaIsUninstalling(isInstalled, isAction))
49 {
50 continue; // skip this record.
51 }
52
53 hr = AddFilterToList(ppsfList);
54 ExitOnFailure(hr, "failed to add filter to list");
55
56 psf = *ppsfList;
57
58 hr = ::StringCchCopyW(psf->wzComponent, countof(psf->wzComponent), pwzData);
59 ExitOnFailure(hr, "failed to copy component name: %ls", pwzData);
60
61 psf->isInstalled = isInstalled;
62 psf->isAction = isAction;
63
64 hr = WcaGetRecordString(hRec, fqWeb, &pwzData);
65 ExitOnFailure(hr, "Failed to get Web for VirtualDir");
66
67 if (*pwzData)
68 {
69 hr = ScaWebsGetBase7(pswList, pwzData, psf->wzFilterRoot, countof(psf->wzFilterRoot));
70 if (FAILED(hr))
71 {
72 WcaLog(LOGMSG_VERBOSE, "Could not find site for filter: %ls. Result 0x%x ", psf->wzFilterRoot, hr);
73 hr = S_OK;
74 }
75 }
76 else
77 {
78 hr = ::StringCchCopyW(psf->wzFilterRoot, countof(psf->wzFilterRoot), L"/");
79 ExitOnFailure(hr, "Failed to allocate global filter base string");
80 }
81
82 // filter Name key
83 hr = WcaGetRecordString(hRec, fqFilter, &pwzData);
84 ExitOnFailure(hr, "Failed to get Filter.Filter");
85 hr = ::StringCchCopyW(psf->wzKey, countof(psf->wzKey), pwzData);
86 ExitOnFailure(hr, "Failed to copy key string to filter object");
87
88 // filter path
89 hr = WcaGetRecordString(hRec, fqPath, &pwzData);
90 ExitOnFailure(hr, "Failed to get Filter.Path");
91 hr = ::StringCchCopyW(psf->wzPath, countof(psf->wzPath), pwzData);
92 ExitOnFailure(hr, "Failed to copy path string to filter object");
93
94 // filter description -- not supported in iis 7
95 hr = WcaGetRecordString(hRec, fqDescription, &pwzData);
96 ExitOnFailure(hr, "Failed to get Filter.Description");
97 hr = ::StringCchCopyW(psf->wzDescription, countof(psf->wzDescription), pwzData);
98 ExitOnFailure(hr, "Failed to copy description string to filter object");
99
100 // filter flags
101 //What are these
102 hr = WcaGetRecordInteger(hRec, fqFlags, &psf->iFlags);
103 ExitOnFailure(hr, "Failed to get Filter.Flags");
104
105 // filter load order
106 hr = WcaGetRecordInteger(hRec, fqLoadOrder, &psf->iLoadOrder);
107 ExitOnFailure(hr, "Failed to get Filter.LoadOrder");
108 }
109
110 if (E_NOMOREITEMS == hr)
111 {
112 hr = S_OK;
113 }
114 ExitOnFailure(hr, "Failure while processing filters");
115
116LExit:
117 WcaFinishUnwrapQuery(hWrapQuery);
118
119 ReleaseStr(pwzData);
120
121 return hr;
122}
123
124
125HRESULT ScaFiltersInstall7(
126 __in SCA_FILTER* psfList
127 )
128{
129 HRESULT hr = S_OK;
130 SCA_FILTER* psf = psfList;
131
132 if (!psf)
133 {
134 ExitFunction();
135 }
136 //write global filters
137 hr = ScaWriteConfigID(IIS_FILTER_GLOBAL_BEGIN);
138 ExitOnFailure(hr, "Failed to write filter begin ID");
139 while (psf)
140 {
141 if (WcaIsInstalling(psf->isInstalled, psf->isAction))
142 {
143 if (0 == wcscmp(psf->wzFilterRoot, L"/"))
144 {
145 hr = WriteFilter(psf);
146 }
147 }
148 psf = psf->psfNext;
149 }
150 hr = ScaWriteConfigID(IIS_FILTER_END);
151 ExitOnFailure(hr, "Failed to write filter ID");
152
153 psf = psfList;
154
155 //Write Web Site Filters
156 hr = ScaWriteConfigID(IIS_FILTER_BEGIN);
157 ExitOnFailure(hr, "Failed to write filter begin ID");
158 while (psf)
159 {
160 if (WcaIsInstalling(psf->isInstalled, psf->isAction))
161 {
162 if (0 != wcscmp(psf->wzFilterRoot, L"/"))
163 {
164 hr = WriteFilter(psf);
165 }
166 }
167 psf = psf->psfNext;
168 }
169 hr = ScaWriteConfigID(IIS_FILTER_END);
170 ExitOnFailure(hr, "Failed to write filter ID");
171
172LExit:
173
174 return hr;
175}
176static HRESULT WriteFilter(const SCA_FILTER* psf)
177{
178 HRESULT hr = S_OK;
179
180 hr = ScaWriteConfigID(IIS_FILTER);
181 ExitOnFailure(hr, "Failed to write filter begin ID");
182
183 hr = ScaWriteConfigID(IIS_CREATE);
184 ExitOnFailure(hr, "Failed to write filter create ID");
185
186 //filter Name key
187 hr = ScaWriteConfigString(psf->wzKey);
188 ExitOnFailure(hr, "Failed to write key name for filter '%ls'", psf->wzKey);
189
190 //web site name
191 hr = ScaWriteConfigString(psf->wzFilterRoot);
192 ExitOnFailure(hr, "Failed to write filter web root ");
193
194 // filter path
195 hr = ScaWriteConfigString(psf->wzPath);
196 ExitOnFailure(hr, "Failed to write Path for filter '%ls'", psf->wzKey);
197
198 //filter load order
199 hr = ScaWriteConfigInteger(psf->iLoadOrder);
200 ExitOnFailure(hr, "Failed to write load order for filter '%ls'", psf->wzKey);
201
202LExit:
203 return hr;
204}
205
206
207HRESULT ScaFiltersUninstall7(
208 __in SCA_FILTER* psfList
209 )
210{
211 HRESULT hr = S_OK;
212 SCA_FILTER* psf = psfList;
213
214 if (!psf)
215 {
216 ExitFunction1(hr = S_OK);
217 }
218
219 //Uninstall global filters
220 hr = ScaWriteConfigID(IIS_FILTER_GLOBAL_BEGIN);
221 ExitOnFailure(hr, "Failed to write filter begin ID");
222
223 while (psf)
224 {
225 if (WcaIsUninstalling(psf->isInstalled, psf->isAction))
226 {
227 if (0 == wcscmp(psf->wzFilterRoot, L"/"))
228 {
229 hr = ScaWriteConfigID(IIS_FILTER);
230 ExitOnFailure(hr, "Failed to write filter begin ID");
231
232 hr = ScaWriteConfigID(IIS_DELETE);
233 ExitOnFailure(hr, "Failed to write filter create ID");
234
235 //filter Name key
236 hr = ScaWriteConfigString(psf->wzKey);
237 ExitOnFailure(hr, "Failed to write key name for filter '%ls'", psf->wzKey);
238
239 //web site name
240 hr = ScaWriteConfigString(psf->wzFilterRoot);
241 ExitOnFailure(hr, "Failed to write filter web root ");
242
243 }
244 }
245 psf = psf->psfNext;
246 }
247
248 hr = ScaWriteConfigID(IIS_FILTER_END);
249 ExitOnFailure(hr, "Failed to write filter ID");
250
251 psf = psfList;
252
253 //Uninstall website filters
254 hr = ScaWriteConfigID(IIS_FILTER_BEGIN);
255 ExitOnFailure(hr, "Failed to write filter begin ID");
256 while (psf)
257 {
258 if (WcaIsUninstalling(psf->isInstalled, psf->isAction))
259 {
260 if (0 != wcscmp(psf->wzFilterRoot, L"/"))
261 {
262 hr = ScaWriteConfigID(IIS_FILTER);
263 ExitOnFailure(hr, "Failed to write filter begin ID");
264
265 hr = ScaWriteConfigID(IIS_DELETE);
266 ExitOnFailure(hr, "Failed to write filter create ID");
267
268 //filter Name key
269 hr = ScaWriteConfigString(psf->wzKey);
270 ExitOnFailure(hr, "Failed to write key name for filter '%ls'", psf->wzKey);
271
272 //web site name
273 hr = ScaWriteConfigString(psf->wzFilterRoot);
274 ExitOnFailure(hr, "Failed to write filter web root ");
275 }
276 }
277 psf = psf->psfNext;
278 }
279 hr = ScaWriteConfigID(IIS_FILTER_END);
280 ExitOnFailure(hr, "Failed to write filter ID");
281
282LExit:
283 return hr;
284}
diff --git a/src/ext/Iis/ca/scafilter7.h b/src/ext/Iis/ca/scafilter7.h
new file mode 100644
index 00000000..50ff6652
--- /dev/null
+++ b/src/ext/Iis/ca/scafilter7.h
@@ -0,0 +1,21 @@
1#pragma once
2// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
3
4
5#include "scaweb.h"
6
7// prototypes
8UINT __stdcall ScaFiltersRead7(
9 __in SCA_WEB7* pswList,
10 __in WCA_WRAPQUERY_HANDLE hWebBaseQuery,
11 __inout SCA_FILTER** ppsfList,
12 __inout LPWSTR *ppwzCustomActionData
13 );
14
15HRESULT ScaFiltersInstall7(
16 SCA_FILTER* psfList
17 );
18
19HRESULT ScaFiltersUninstall7(
20 SCA_FILTER* psfList
21 );
diff --git a/src/ext/Iis/ca/scahttpheader.cpp b/src/ext/Iis/ca/scahttpheader.cpp
new file mode 100644
index 00000000..1e134cea
--- /dev/null
+++ b/src/ext/Iis/ca/scahttpheader.cpp
@@ -0,0 +1,323 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3#include "precomp.h"
4
5enum eHttpHeaderQuery { hhqName = 1, hhqParentType, hhqParentValue, hhqValue, hhqAttributes};
6
7static HRESULT AddHttpHeaderToList(
8 __in SCA_HTTP_HEADER** ppshhList
9 );
10
11
12void ScaHttpHeaderFreeList(
13 __in SCA_HTTP_HEADER* pshhList
14 )
15{
16 SCA_HTTP_HEADER* pshhDelete = pshhList;
17 while (pshhList)
18 {
19 pshhDelete = pshhList;
20 pshhList = pshhList->pshhNext;
21
22 MemFree(pshhDelete);
23 }
24}
25
26
27HRESULT ScaHttpHeaderRead(
28 __in SCA_HTTP_HEADER** ppshhList,
29 __inout LPWSTR *ppwzCustomActionData
30 )
31{
32 Assert(ppshhList);
33
34 HRESULT hr = S_OK;
35 MSIHANDLE hRec;
36 LPWSTR pwzData = NULL;
37 SCA_HTTP_HEADER* pshh = NULL;
38 WCA_WRAPQUERY_HANDLE hWrapQuery = NULL;
39
40 hr = WcaBeginUnwrapQuery(&hWrapQuery, ppwzCustomActionData);
41 ExitOnFailure(hr, "Failed to unwrap query for ScaAppPoolRead");
42
43 if (0 == WcaGetQueryRecords(hWrapQuery))
44 {
45 WcaLog(LOGMSG_VERBOSE, "Skipping ScaHttpHeaderRead() - required tables not present.");
46 ExitFunction1(hr = S_FALSE);
47 }
48
49 // loop through all the HTTP headers
50 while (S_OK == (hr = WcaFetchWrappedRecord(hWrapQuery, &hRec)))
51 {
52 hr = AddHttpHeaderToList(ppshhList);
53 ExitOnFailure(hr, "failed to add http header to list");
54
55 pshh = *ppshhList;
56
57 hr = WcaGetRecordInteger(hRec, hhqParentType, &(pshh->iParentType));
58 ExitOnFailure(hr, "failed to get IIsHttpHeader.ParentType");
59
60 hr = WcaGetRecordString(hRec, hhqParentValue, &pwzData);
61 ExitOnFailure(hr, "Failed to get IIsHttpHeader.ParentValue");
62 hr = ::StringCchCopyW(pshh->wzParentValue, countof(pshh->wzParentValue), pwzData);
63 ExitOnFailure(hr, "Failed to copy IIsHttpHeader.ParentValue");
64
65 hr = WcaGetRecordString(hRec, hhqName, &pwzData);
66 ExitOnFailure(hr, "Failed to get IIsHttpHeader.Name");
67 hr = ::StringCchCopyW(pshh->wzName, countof(pshh->wzName), pwzData);
68 ExitOnFailure(hr, "Failed to copy IIsHttpHeader.Name");
69
70 hr = WcaGetRecordString(hRec, hhqValue, &pwzData);
71 ExitOnFailure(hr, "Failed to get IIsHttpHeader.Value");
72 hr = ::StringCchCopyW(pshh->wzValue, countof(pshh->wzValue), pwzData);
73 ExitOnFailure(hr, "Failed to copy IIsHttpHeader.Value");
74
75 hr = WcaGetRecordInteger(hRec, hhqAttributes, &(pshh->iAttributes));
76 ExitOnFailure(hr, "failed to get IIsHttpHeader.Attributes");
77 }
78
79 if (E_NOMOREITEMS == hr)
80 {
81 hr = S_OK;
82 }
83 ExitOnFailure(hr, "Failure while processing web errors");
84
85LExit:
86 WcaFinishUnwrapQuery(hWrapQuery);
87
88 ReleaseStr(pwzData);
89
90 return hr;
91}
92
93
94HRESULT ScaGetHttpHeader(
95 __in int iParentType,
96 __in LPCWSTR wzParentValue,
97 __in SCA_HTTP_HEADER** ppshhList,
98 __out SCA_HTTP_HEADER** ppshhOut
99 )
100{
101 HRESULT hr = S_OK;
102 SCA_HTTP_HEADER* pshhAdd = NULL;
103 SCA_HTTP_HEADER* pshhLast = NULL;
104
105 *ppshhOut = NULL;
106
107 if (!*ppshhList)
108 {
109 return hr;
110 }
111
112 SCA_HTTP_HEADER* pshh = *ppshhList;
113 while (pshh)
114 {
115 if (iParentType == pshh->iParentType && CSTR_EQUAL == ::CompareStringW(LOCALE_SYSTEM_DEFAULT, 0, wzParentValue, -1, pshh->wzParentValue, -1))
116 {
117 // Found a match, take this one out of the list and add it to the matched out list
118 pshhAdd = pshh;
119
120 if (pshhLast)
121 {
122 // If we're not at the beginning of the list tell the last node about it's new next (since we're taking away it's current next)
123 pshhLast->pshhNext = pshhAdd->pshhNext;
124 }
125 else
126 {
127 // If we are at the beginning (no pshhLast) update the beginning (since we're taking it)
128 *ppshhList = pshh->pshhNext;
129 }
130 pshh = pshh->pshhNext; // move on
131
132 // Add the one we've removed to the beginning of the out list
133 pshhAdd->pshhNext = *ppshhOut;
134 *ppshhOut = pshhAdd;
135 }
136 else
137 {
138 pshhLast = pshh; // remember the last we that didn't match
139 pshh = pshh->pshhNext; // move on
140 }
141 }
142
143 return hr;
144}
145
146
147HRESULT ScaWriteHttpHeader(
148 __in IMSAdminBase* piMetabase,
149 __in LPCWSTR wzRoot,
150 __in SCA_HTTP_HEADER* pshhList
151 )
152{
153 Assert(piMetabase && pshhList);
154
155 HRESULT hr = S_OK;
156 METADATA_RECORD mr = { 0 };
157 DWORD cchData = 0;
158 LPWSTR pwzSearchKey = NULL;
159 LPWSTR pwz = NULL;
160 LPWSTR pwzHeaders = NULL;
161 LPWSTR pwzNewHeader = NULL;
162 DWORD_PTR dwFoundHeaderIndex = 0;
163 LPCWSTR wzFoundHeader = NULL;
164 BOOL fOldValueFound = FALSE;
165
166 ExitOnNull(wzRoot, hr, E_INVALIDARG, "Failed to write HTTP header, because no root was provided");
167
168 Assert(*wzRoot);
169
170 // Check if HTTP header already exist here.
171 mr.dwMDIdentifier = MD_HTTP_CUSTOM;
172 mr.dwMDAttributes = METADATA_INHERIT;
173 mr.dwMDUserType = IIS_MD_UT_SERVER;
174 mr.dwMDDataType = ALL_METADATA;
175 mr.dwMDDataLen = cchData = 0;
176 mr.pbMDData = NULL;
177
178 hr = MetaGetValue(piMetabase, METADATA_MASTER_ROOT_HANDLE, wzRoot, &mr);
179 if (HRESULT_FROM_WIN32(ERROR_PATH_NOT_FOUND) == hr || MD_ERROR_DATA_NOT_FOUND == hr)
180 {
181 //
182 // If we don't have any HTTP Headers already, move up to get the parent headers.
183 // TODO: Make it configurable to not inherit HTTP Headers
184 //
185 hr = StrAllocConcat(&pwzSearchKey, wzRoot, 0);
186 ExitOnFailure(hr, "Failed to copy root string: %ls", wzRoot);
187
188 pwz = pwzSearchKey + lstrlenW(pwzSearchKey);
189 while (NULL == pwzHeaders)
190 {
191 // find the last slash
192 while (*pwz != '/' && pwz != pwzSearchKey)
193 {
194 --pwz;
195 }
196
197 if (pwz == pwzSearchKey)
198 {
199 break;
200 }
201
202 *pwz = L'\0';
203
204 // Try here. If it's not found, keep walking up the path
205 hr = MetaGetValue(piMetabase, METADATA_MASTER_ROOT_HANDLE, pwzSearchKey, &mr);
206 if (HRESULT_FROM_WIN32(ERROR_PATH_NOT_FOUND) == hr || MD_ERROR_DATA_NOT_FOUND == hr)
207 {
208 hr = S_FALSE;
209 }
210 ExitOnFailure(hr, "Failed to find search for HTTP headers for web root: %ls while walking up the tree", wzRoot);
211
212 if (S_OK == hr)
213 {
214 hr = StrAllocString(&pwzHeaders, reinterpret_cast<LPWSTR>(mr.pbMDData), 0);
215 ExitOnFailure(hr, "Failed to allocate parent HTTP header string");
216 break;
217 }
218 }
219 }
220 else
221 {
222 hr = StrAllocString(&pwzHeaders, reinterpret_cast<LPWSTR>(mr.pbMDData), 0);
223 ExitOnFailure(hr, "Failed to allocate HTTP header string");
224 }
225 ExitOnFailure(hr, "Failed while searching for default HTTP headers to start with for web root: %ls", wzRoot);
226
227 // Loop through the HTTP headers
228 for (SCA_HTTP_HEADER* pshh = pshhList; pshh; pshh = pshh->pshhNext)
229 {
230 fOldValueFound = FALSE; // assume a HTTP Header match will not be found
231
232 hr = StrAllocFormatted(&pwzNewHeader, L"%s: ", pshh->wzName);
233 ExitOnFailure(hr, "Failed to allocate header name");
234
235 if (NULL != pwzHeaders && *pwzHeaders)
236 {
237 // Try to find a matching header already in the list
238 hr = MultiSzFindSubstring(pwzHeaders, pwzNewHeader, &dwFoundHeaderIndex, &wzFoundHeader);
239 ExitOnFailure(hr, "Failed while searching for existing HTTP header.");
240
241 // If there was a substring HTTP header match, make sure the match was at the beginning
242 // of the string because that is the HTTP header name.
243 if (S_OK == hr)
244 {
245 DWORD cchMatch = lstrlenW(pwzNewHeader);
246 if (CSTR_EQUAL == ::CompareStringW(LOCALE_SYSTEM_DEFAULT, NORM_IGNORECASE, pwzNewHeader, cchMatch, wzFoundHeader, cchMatch))
247 {
248 fOldValueFound = TRUE;
249 break;
250 }
251 }
252 }
253
254 // Add the value on to the header name now.
255 hr = StrAllocConcat(&pwzNewHeader, pshh->wzValue, 0);
256 ExitOnFailure(hr, "Failed to add value on to HTTP header name.");
257
258 // If we have something to replace, replace it, otherwise, put it at the beginning (order shouldn't matter)
259 if (fOldValueFound)
260 {
261 if (NULL == pwzHeaders)
262 {
263 ExitOnFailure(hr = E_INVALIDARG, "While attempting to replace old HTTP header with new HTTP header, it was discovered that the old HTTP header was NULL!");
264 }
265 hr = MultiSzReplaceString(&pwzHeaders, dwFoundHeaderIndex, pwzNewHeader);
266 ExitOnFailure(hr, "Failed to replace old HTTP header with new HTTP header");
267 }
268 else
269 {
270 hr = MultiSzPrepend(&pwzHeaders, NULL, pwzNewHeader);
271 ExitOnFailure(hr, "Failed to prepend new HTTP header");
272 }
273 }
274
275 // now write the HttpCustom to the metabase
276 hr = ScaWriteMetabaseValue(piMetabase, wzRoot, NULL, MD_HTTP_CUSTOM, METADATA_INHERIT, IIS_MD_UT_FILE, MULTISZ_METADATA, pwzHeaders);
277 ExitOnFailure(hr, "Failed to write HTTP Headers to metabase");
278
279LExit:
280 MetaFreeValue(&mr);
281
282 ReleaseStr(pwzNewHeader);
283 ReleaseStr(pwzHeaders);
284 ReleaseStr(pwzSearchKey);
285
286 return hr;
287}
288
289
290HRESULT ScaHttpHeaderCheckList(
291 __in SCA_HTTP_HEADER* pshhList
292 )
293{
294 if (!pshhList)
295 {
296 return S_OK;
297 }
298
299 while (pshhList)
300 {
301 WcaLog(LOGMSG_STANDARD, "Http Header: %ls for parent: %ls not used!", pshhList->wzName, pshhList->wzParentValue);
302 pshhList = pshhList->pshhNext;
303 }
304
305 return E_FAIL;
306}
307
308
309static HRESULT AddHttpHeaderToList(
310 __in SCA_HTTP_HEADER** ppshhList
311 )
312{
313 HRESULT hr = S_OK;
314
315 SCA_HTTP_HEADER* pshh = static_cast<SCA_HTTP_HEADER*>(MemAlloc(sizeof(SCA_HTTP_HEADER), TRUE));
316 ExitOnNull(pshh, hr, E_OUTOFMEMORY, "failed to allocate memory for new http header list element");
317
318 pshh->pshhNext = *ppshhList;
319 *ppshhList = pshh;
320
321LExit:
322 return hr;
323}
diff --git a/src/ext/Iis/ca/scahttpheader.h b/src/ext/Iis/ca/scahttpheader.h
new file mode 100644
index 00000000..a4c407a4
--- /dev/null
+++ b/src/ext/Iis/ca/scahttpheader.h
@@ -0,0 +1,40 @@
1#pragma once
2// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
3
4
5enum eHttpHeaderParentType { hhptVDir = 1, hhptWeb };
6
7struct SCA_HTTP_HEADER
8{
9 int iParentType;
10 WCHAR wzParentValue[MAX_DARWIN_KEY + 1];
11
12 WCHAR wzName[MAX_PATH];
13 WCHAR wzValue[MAX_PATH];
14 int iAttributes;
15
16 SCA_HTTP_HEADER* pshhNext;
17};
18
19// prototypes
20HRESULT ScaHttpHeaderRead(
21 __in SCA_HTTP_HEADER **ppshhList,
22 __inout LPWSTR *ppwzCustomActionData
23 );
24void ScaHttpHeaderFreeList(
25 __in SCA_HTTP_HEADER *pshhList
26 );
27HRESULT ScaHttpHeaderCheckList(
28 __in SCA_HTTP_HEADER* pshhList
29 );
30HRESULT ScaGetHttpHeader(
31 __in int iParentType,
32 __in LPCWSTR wzParentValue,
33 __in SCA_HTTP_HEADER** ppshhList,
34 __out SCA_HTTP_HEADER** ppshhOut
35 );
36HRESULT ScaWriteHttpHeader(
37 __in IMSAdminBase* piMetabase,
38 LPCWSTR wzRoot,
39 SCA_HTTP_HEADER* pshhList
40 );
diff --git a/src/ext/Iis/ca/scahttpheader7.cpp b/src/ext/Iis/ca/scahttpheader7.cpp
new file mode 100644
index 00000000..645dd8d4
--- /dev/null
+++ b/src/ext/Iis/ca/scahttpheader7.cpp
@@ -0,0 +1,130 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3#include "precomp.h"
4
5HRESULT ScaGetHttpHeader7(
6 __in int iParentType,
7 __in_z LPCWSTR wzParentValue,
8 __in SCA_HTTP_HEADER** ppshhList,
9 __out SCA_HTTP_HEADER** ppshhOut
10 )
11{
12 HRESULT hr = S_OK;
13 SCA_HTTP_HEADER* pshhAdd = NULL;
14 SCA_HTTP_HEADER* pshhLast = NULL;
15
16 *ppshhOut = NULL;
17
18 if (!*ppshhList)
19 {
20 return hr;
21 }
22
23 SCA_HTTP_HEADER* pshh = *ppshhList;
24 while (pshh)
25 {
26 if (iParentType == pshh->iParentType && 0 == wcscmp(wzParentValue, pshh->wzParentValue))
27 {
28 // Found a match, take this one out of the list and add it to the matched out list
29 pshhAdd = pshh;
30
31 if (pshhLast)
32 {
33 // If we're not at the beginning of the list tell the last node about it's new next (since we're taking away it's current next)
34 pshhLast->pshhNext = pshhAdd->pshhNext;
35 }
36 else
37 {
38 // If we are at the beginning (no pshhLast) update the beginning (since we're taking it)
39 *ppshhList = pshh->pshhNext;
40 }
41 pshh = pshh->pshhNext; // move on
42
43 // Add the one we've removed to the beginning of the out list
44 pshhAdd->pshhNext = *ppshhOut;
45 *ppshhOut = pshhAdd;
46 }
47 else
48 {
49 pshhLast = pshh; // remember the last we that didn't match
50 pshh = pshh->pshhNext; // move on
51 }
52 }
53
54 return hr;
55}
56
57
58HRESULT ScaWriteHttpHeader7(
59 __in_z LPCWSTR wzWebName,
60 __in_z LPCWSTR wzRoot,
61 SCA_HTTP_HEADER* pshhList
62 )
63{
64
65 HRESULT hr = S_OK;
66
67 hr = ScaWriteConfigID(IIS_HTTP_HEADER_BEGIN);
68 ExitOnFailure(hr, "Fail to write httpHeader begin ID");
69
70 hr = ScaWriteConfigString(wzWebName);
71 ExitOnFailure(hr, "Fail to write httpHeader Web Key");
72
73 hr = ScaWriteConfigString(wzRoot);
74 ExitOnFailure(hr, "Fail to write httpHeader Vdir key");
75
76 // Loop through the HTTP headers
77 for (SCA_HTTP_HEADER* pshh = pshhList; pshh; pshh = pshh->pshhNext)
78 {
79 hr = ScaWriteConfigID(IIS_HTTP_HEADER);
80 ExitOnFailure(hr, "Fail to write httpHeader ID");
81
82 hr = ScaWriteConfigString(pshh->wzName);
83 ExitOnFailure(hr, "Fail to write httpHeader name");
84
85 hr = ScaWriteConfigString(pshh->wzValue);
86 ExitOnFailure(hr, "Fail to write httpHeader value");
87 }
88
89 hr = ScaWriteConfigID(IIS_HTTP_HEADER_END);
90 ExitOnFailure(hr, "Fail to write httpHeader end ID");
91
92LExit:
93 return hr;
94}
95
96
97HRESULT ScaHttpHeaderCheckList7(
98 __in SCA_HTTP_HEADER* pshhList
99 )
100{
101 if (!pshhList)
102 {
103 return S_OK;
104 }
105
106 while (pshhList)
107 {
108 WcaLog(LOGMSG_STANDARD, "Http Header: %ls for parent: %ls not used!", pshhList->wzName, pshhList->wzParentValue);
109 pshhList = pshhList->pshhNext;
110 }
111
112 return E_FAIL;
113}
114
115
116//static HRESULT AddHttpHeaderToList(
117// __in SCA_HTTP_HEADER** ppshhList
118// )
119//{
120// HRESULT hr = S_OK;
121//
122// SCA_HTTP_HEADER* pshh = static_cast<SCA_HTTP_HEADER*>(MemAlloc(sizeof(SCA_HTTP_HEADER), TRUE));
123// ExitOnNull(pshh, hr, E_OUTOFMEMORY, "failed to allocate memory for new http header list element");
124//
125// pshh->pshhNext = *ppshhList;
126// *ppshhList = pshh;
127//
128//LExit:
129// return hr;
130//}
diff --git a/src/ext/Iis/ca/scahttpheader7.h b/src/ext/Iis/ca/scahttpheader7.h
new file mode 100644
index 00000000..7a873c16
--- /dev/null
+++ b/src/ext/Iis/ca/scahttpheader7.h
@@ -0,0 +1,15 @@
1#pragma once
2// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
3
4
5HRESULT ScaGetHttpHeader7(
6 __in int iParentType,
7 __in_z LPCWSTR wzParentValue,
8 __in SCA_HTTP_HEADER** ppshhList,
9 __out SCA_HTTP_HEADER** ppshhOut
10 );
11HRESULT ScaWriteHttpHeader7(
12 __in_z LPCWSTR wzWebName,
13 __in_z LPCWSTR wzRoot,
14 SCA_HTTP_HEADER* pshhList
15 );
diff --git a/src/ext/Iis/ca/scaiis.cpp b/src/ext/Iis/ca/scaiis.cpp
new file mode 100644
index 00000000..958051ed
--- /dev/null
+++ b/src/ext/Iis/ca/scaiis.cpp
@@ -0,0 +1,481 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3#include "precomp.h"
4
5// globals
6LPWSTR vpwzCustomActionData = NULL;
7DWORD vdwCustomActionCost = 0;
8
9HRESULT ScaMetabaseTransaction(__in_z LPCWSTR wzBackup)
10{
11 HRESULT hr = S_OK;
12
13 // TODO: These functions have been reported to hang IIS (O11:51709). They may have been fixed in IIS6, but if not, need to be re-written the hard way
14
15 hr = WcaDoDeferredAction(CUSTOM_ACTION_DECORATION(L"StartMetabaseTransaction"), wzBackup, COST_IIS_TRANSACTIONS);
16 ExitOnFailure(hr, "Failed to schedule StartMetabaseTransaction");
17
18 hr = WcaDoDeferredAction(CUSTOM_ACTION_DECORATION(L"RollbackMetabaseTransaction"), wzBackup, 0); // rollback cost is irrelevant
19 ExitOnFailure(hr, "Failed to schedule RollbackMetabaseTransaction");
20
21 hr = WcaDoDeferredAction(CUSTOM_ACTION_DECORATION(L"CommitMetabaseTransaction"), wzBackup, 0); // commit is free
22 ExitOnFailure(hr, "Failed to schedule StartMetabaseTransaction");
23
24LExit:
25 return hr;
26}
27
28
29HRESULT ScaCreateWeb(IMSAdminBase* piMetabase, LPCWSTR /*wzWeb*/, LPCWSTR wzWebBase)
30{
31 Assert(piMetabase);
32
33 HRESULT hr = S_OK;
34 UINT ui = 0;
35
36 hr = ScaCreateMetabaseKey(piMetabase, wzWebBase, L"");
37 ExitOnFailure(hr, "Failed to create web");
38
39 hr = ScaWriteMetabaseValue(piMetabase, wzWebBase, L"", MD_KEY_TYPE, METADATA_NO_ATTRIBUTES, IIS_MD_UT_SERVER, STRING_METADATA, (LPVOID)L"IIsWebServer");
40 ExitOnFailure(hr, "Failed to set key type for web");
41
42 hr = ScaCreateMetabaseKey(piMetabase, wzWebBase, L"Root");
43 ExitOnFailure(hr, "Failed to create web root");
44
45 hr = ScaWriteMetabaseValue(piMetabase, wzWebBase, L"Root", MD_KEY_TYPE, METADATA_NO_ATTRIBUTES, IIS_MD_UT_SERVER, STRING_METADATA, (LPVOID)L"IIsWebVirtualDir");
46 ExitOnFailure(hr, "Failed to set key type for web root");
47
48 ui = 0x4000003e; // 1073741886; // default directory browsing rights
49 hr = ScaWriteMetabaseValue(piMetabase, wzWebBase, L"Root", MD_DIRECTORY_BROWSING, METADATA_INHERIT, IIS_MD_UT_FILE, DWORD_METADATA, (LPVOID)((DWORD_PTR)ui));
50 ExitOnFailure(hr, "Failed to set directory browsing for web");
51
52 hr = ScaCreateMetabaseKey(piMetabase, wzWebBase, L"Filters");
53 ExitOnFailure(hr, "Failed to create web filters root");
54
55 hr = ScaWriteMetabaseValue(piMetabase, wzWebBase, L"Filters", MD_KEY_TYPE, METADATA_NO_ATTRIBUTES, IIS_MD_UT_SERVER, STRING_METADATA, (LPVOID)L"IIsFilters");
56 ExitOnFailure(hr, "Failed to set key for web filters root");
57
58 hr = ScaWriteMetabaseValue(piMetabase, wzWebBase, L"Filters", MD_FILTER_LOAD_ORDER, METADATA_NO_ATTRIBUTES, IIS_MD_UT_SERVER, STRING_METADATA, (LPVOID)L"");
59 ExitOnFailure(hr, "Failed to set empty load order for web");
60
61LExit:
62 return hr;
63}
64
65
66HRESULT ScaDeleteApp(IMSAdminBase* piMetabase, LPCWSTR wzWebRoot)
67{
68 Assert(piMetabase);
69 Unused(piMetabase);
70
71 HRESULT hr = S_OK;
72 WCHAR wzKey[METADATA_MAX_NAME_LEN];
73
74 WCHAR* pwzCustomActionData = NULL;
75
76 hr = WcaWriteIntegerToCaData(MBA_DELETEAPP, &pwzCustomActionData);
77 ExitOnFailure(hr, "Failed to add metabase delete app directive to CustomActionData");
78
79 hr = ::StringCchCopyW(wzKey, countof(wzKey), wzWebRoot);
80 ExitOnFailure(hr, "Failed to copy webroot string to key");
81 hr = WcaWriteStringToCaData(wzKey, &pwzCustomActionData);
82 ExitOnFailure(hr, "Failed to add metabase key to CustomActionData");
83
84 hr = ScaAddToIisConfiguration(pwzCustomActionData, COST_IIS_DELETEAPP);
85 ExitOnFailure(hr, "Failed to add ScaDeleteApp action data: %ls cost: %d", pwzCustomActionData, COST_IIS_DELETEAPP);
86
87LExit:
88 ReleaseStr(pwzCustomActionData);
89
90 return hr;
91}
92
93
94HRESULT ScaCreateApp(IMSAdminBase* piMetabase, LPCWSTR wzWebRoot,
95 DWORD dwIsolation)
96{
97 Assert(piMetabase);
98 Unused(piMetabase);
99
100 HRESULT hr = S_OK;
101 WCHAR wzKey[METADATA_MAX_NAME_LEN];
102 BOOL fInProc = FALSE;
103
104 WCHAR* pwzCustomActionData = NULL;
105
106 hr = WcaWriteIntegerToCaData(MBA_CREATEAPP, &pwzCustomActionData);
107 ExitOnFailure(hr, "Failed to add metabase create app directive to CustomActionData");
108
109 hr = ::StringCchCopyW(wzKey, countof(wzKey), wzWebRoot);
110 ExitOnFailure(hr, "Failed to copy webroot string to key");
111 hr = WcaWriteStringToCaData(wzKey, &pwzCustomActionData);
112 ExitOnFailure(hr, "Failed to add metabase key to CustomActionData");
113
114 if (0 == dwIsolation)
115 fInProc = TRUE;
116 else
117 fInProc = FALSE;
118
119 hr = WcaWriteIntegerToCaData(fInProc, &pwzCustomActionData);
120 ExitOnFailure(hr, "Failed to add isolation value to CustomActionData");
121
122 hr = ScaAddToIisConfiguration(pwzCustomActionData, COST_IIS_CREATEAPP);
123 ExitOnFailure(hr, "Failed to add ScaCreateApp action data: %ls cost: %d", pwzCustomActionData, COST_IIS_CREATEAPP);
124
125LExit:
126 ReleaseStr(pwzCustomActionData);
127
128 return hr;
129}
130
131
132HRESULT ScaCreateMetabaseKey(IMSAdminBase* piMetabase, LPCWSTR wzRootKey,
133 LPCWSTR wzSubKey)
134{
135 Assert(piMetabase);
136 Unused(piMetabase);
137
138 HRESULT hr = S_OK;
139 WCHAR wzKey[METADATA_MAX_NAME_LEN];
140 WCHAR* pwzCustomActionData = NULL;
141
142 hr = ::StringCchCopyW(wzKey, countof(wzKey), wzRootKey);
143 ExitOnFailure(hr, "Failed to copy root key string to key");
144 if (L'/' != *(wzKey + lstrlenW(wzRootKey)))
145 {
146 hr = ::StringCchCatW(wzKey, countof(wzKey), L"/");
147 ExitOnFailure(hr, "Failed to concatenate / to key string");
148 }
149 if (wzSubKey && *wzSubKey)
150 {
151 if (L'/' == *wzSubKey)
152 {
153 hr = ::StringCchCatW(wzKey, countof(wzKey), wzSubKey + 1);
154 ExitOnFailure(hr, "Failed to concatenate subkey (minus slash) to key string");
155 }
156 else
157 {
158 hr = ::StringCchCatW(wzKey, countof(wzKey), wzSubKey);
159 ExitOnFailure(hr, "Failed to concatenate subkey to key string");
160 }
161 }
162
163 hr = WcaWriteIntegerToCaData(MBA_CREATEKEY, &pwzCustomActionData);
164 ExitOnFailure(hr, "Failed to add metabase delete key directive to CustomActionData");
165
166 hr = WcaWriteStringToCaData(wzKey, &pwzCustomActionData);
167 ExitOnFailure(hr, "Failed to add metabase key to CustomActionData");
168
169 hr = ScaAddToIisConfiguration(pwzCustomActionData, COST_IIS_CREATEKEY);
170 ExitOnFailure(hr, "Failed to add ScaCreateMetabaseKey action data: %ls cost: %d", pwzCustomActionData, COST_IIS_CREATEKEY);
171
172LExit:
173 ReleaseStr(pwzCustomActionData);
174
175 return hr;
176}
177
178
179HRESULT ScaDeleteMetabaseKey(IMSAdminBase* piMetabase, LPCWSTR wzRootKey,
180 LPCWSTR wzSubKey)
181{
182 Assert(piMetabase);
183 Unused(piMetabase);
184
185 HRESULT hr = S_OK;
186 WCHAR wzKey[METADATA_MAX_NAME_LEN];
187 WCHAR* pwzCustomActionData = NULL;
188
189 hr = ::StringCchCopyW(wzKey, countof(wzKey), wzRootKey);
190 ExitOnFailure(hr, "Failed to copy root key string to key");
191 if (L'/' != *(wzKey + lstrlenW(wzRootKey)))
192 {
193 hr = ::StringCchCatW(wzKey, countof(wzKey), L"/");
194 ExitOnFailure(hr, "Failed to concatenate / to key string");
195 }
196 if (*wzSubKey)
197 {
198 if (L'/' == *wzSubKey)
199 {
200 hr = ::StringCchCatW(wzKey, countof(wzKey), wzSubKey + 1);
201 ExitOnFailure(hr, "Failed to concatenate subkey (minus slash) to key string");
202 }
203 else
204 {
205 hr = ::StringCchCatW(wzKey, countof(wzKey), wzSubKey);
206 ExitOnFailure(hr, "Failed to concatenate subkey to key string");
207 }
208 }
209
210 hr = WcaWriteIntegerToCaData(MBA_DELETEKEY, &pwzCustomActionData);
211 ExitOnFailure(hr, "Failed to add metabase delete key directive to CustomActionData");
212
213 hr = WcaWriteStringToCaData(wzKey, &pwzCustomActionData);
214 ExitOnFailure(hr, "Failed to add metabase key to CustomActionData");
215
216 hr = ScaAddToIisConfiguration(pwzCustomActionData, COST_IIS_DELETEKEY);
217 ExitOnFailure(hr, "Failed to add ScaDeleteMetabaseKey action data: %ls cost: %d", pwzCustomActionData, COST_IIS_DELETEKEY);
218
219LExit:
220 ReleaseStr(pwzCustomActionData);
221
222 return hr;
223}
224
225
226HRESULT ScaDeleteMetabaseValue(IMSAdminBase* piMetabase, LPCWSTR wzRootKey,
227 LPCWSTR wzSubKey, DWORD dwIdentifier,
228 DWORD dwDataType)
229{
230 Assert(piMetabase);
231 Unused(piMetabase);
232
233 HRESULT hr = S_OK;
234 WCHAR wzKey[METADATA_MAX_NAME_LEN];
235 WCHAR* pwzCustomActionData = NULL;
236
237 hr = ::StringCchCopyW(wzKey, countof(wzKey), wzRootKey);
238 ExitOnFailure(hr, "Failed to copy root key string to key");
239 if (L'/' != *(wzKey + lstrlenW(wzRootKey)))
240 {
241 hr = ::StringCchCatW(wzKey, countof(wzKey), L"/");
242 ExitOnFailure(hr, "Failed to concatenate / to key string");
243 }
244
245 if (wzSubKey && *wzSubKey)
246 {
247 if (L'/' == *wzSubKey)
248 {
249 hr = ::StringCchCatW(wzKey, countof(wzKey), wzSubKey + 1);
250 ExitOnFailure(hr, "Failed to concatenate subkey (minus slash) to key string");
251 }
252 else
253 {
254 hr = ::StringCchCatW(wzKey, countof(wzKey), wzSubKey);
255 ExitOnFailure(hr, "Failed to concatenate subkey to key string");
256 }
257 }
258
259 hr = WcaWriteIntegerToCaData(MBA_DELETEVALUE, &pwzCustomActionData);
260 ExitOnFailure(hr, "Failed to add metabase write value directive to CustomActionData");
261
262 hr = WcaWriteStringToCaData(wzKey, &pwzCustomActionData);
263 ExitOnFailure(hr, "Failed to add metabase key to CustomActionData");
264
265 hr = WcaWriteIntegerToCaData(dwIdentifier, &pwzCustomActionData);
266 ExitOnFailure(hr, "Failed to add metabase identifier to CustomActionData");
267
268 hr = WcaWriteIntegerToCaData(dwDataType, &pwzCustomActionData);
269 ExitOnFailure(hr, "Failed to add metabase data type to CustomActionData");
270
271 hr = ScaAddToIisConfiguration(pwzCustomActionData, COST_IIS_DELETEVALUE);
272 ExitOnFailure(hr, "Failed to add ScaDeleteMetabaseValue action data: %ls, cost: %d", pwzCustomActionData, COST_IIS_DELETEVALUE);
273
274LExit:
275 ReleaseStr(pwzCustomActionData);
276
277 return hr;
278}
279
280
281#pragma prefast(push)
282#pragma prefast(disable:25120) // Disable "requires count parameter" warning - we do have a way to distinguish buffer sizes in all situations,
283 // it just depends on the dwDataType, and there's no way to annotate the situation in SAL
284HRESULT ScaWriteMetabaseValue(IMSAdminBase* piMetabase, LPCWSTR wzRootKey,
285 LPCWSTR wzSubKey, DWORD dwIdentifier,
286 DWORD dwAttributes, DWORD dwUserType,
287 DWORD dwDataType, LPVOID pvData)
288#pragma prefast(pop)
289{
290 Assert(piMetabase && (pvData || (DWORD_METADATA == dwDataType))); // pvData may be 0 if it is DWORD data
291 Unused(piMetabase);
292
293 HRESULT hr = S_OK;
294 WCHAR wzKey[METADATA_MAX_NAME_LEN];
295 WCHAR* pwzCustomActionData = NULL;
296
297 if (BINARY_METADATA == dwDataType)
298 {
299 ExitOnNull(pvData, hr, E_INVALIDARG, "Failed to write binary metadata - no data available to write");
300 }
301
302 hr = ::StringCchCopyW(wzKey, countof(wzKey), wzRootKey);
303 ExitOnFailure(hr, "Failed to copy root key string to key");
304 if (L'/' != *(wzKey + lstrlenW(wzRootKey)))
305 {
306 hr = ::StringCchCatW(wzKey, countof(wzKey), L"/");
307 ExitOnFailure(hr, "Failed to concatenate / to key string");
308 }
309 if (wzSubKey && *wzSubKey)
310 {
311 if (L'/' == *wzSubKey)
312 {
313 hr = ::StringCchCatW(wzKey, countof(wzKey), wzSubKey + 1);
314 ExitOnFailure(hr, "Failed to concatenate subkey (minus slash) to key string");
315 }
316 else
317 {
318 hr = ::StringCchCatW(wzKey, countof(wzKey), wzSubKey);
319 ExitOnFailure(hr, "Failed to concatenate subkey to key string");
320 }
321 }
322
323 hr = WcaWriteIntegerToCaData(MBA_WRITEVALUE, &pwzCustomActionData);
324 ExitOnFailure(hr, "Failed to add metabase write value directive to CustomActionData");
325
326 hr = WcaWriteStringToCaData(wzKey, &pwzCustomActionData);
327 ExitOnFailure(hr, "Failed to add metabase key to CustomActionData");
328
329 hr = WcaWriteIntegerToCaData(dwIdentifier, &pwzCustomActionData);
330 ExitOnFailure(hr, "Failed to add metabase identifier to CustomActionData");
331
332 hr = WcaWriteIntegerToCaData(dwAttributes, &pwzCustomActionData);
333 ExitOnFailure(hr, "Failed to add metabase attributes to CustomActionData");
334
335 hr = WcaWriteIntegerToCaData(dwUserType, &pwzCustomActionData);
336 ExitOnFailure(hr, "Failed to add metabase user type to CustomActionData");
337
338 hr = WcaWriteIntegerToCaData(dwDataType, &pwzCustomActionData);
339 ExitOnFailure(hr, "Failed to add metabase data type to CustomActionData");
340
341 switch (dwDataType)
342 {
343 case DWORD_METADATA:
344 hr = WcaWriteIntegerToCaData((DWORD)((DWORD_PTR)pvData), &pwzCustomActionData);
345 break;
346 case STRING_METADATA:
347 hr = WcaWriteStringToCaData((LPCWSTR)pvData, &pwzCustomActionData);
348 break;
349 case MULTISZ_METADATA:
350 {
351 // change NULLs to unprintable character to create a 'safe' MULTISZ string
352 LPWSTR pwz = (LPWSTR)pvData;
353 for (;;)
354 {
355 if ('\0' == *pwz)
356 {
357 *pwz = MAGIC_MULTISZ_CHAR;
358 if ('\0' == *(pwz + 1)) // second null back to back means end of string
359 break;
360 }
361
362 ++pwz;
363 }
364
365 hr = WcaWriteStringToCaData((LPCWSTR)pvData, &pwzCustomActionData);
366 }
367 break;
368 case BINARY_METADATA:
369 hr = WcaWriteStreamToCaData(((BLOB*) pvData)->pBlobData, ((BLOB*) pvData)->cbSize, &pwzCustomActionData);
370 break;
371 default:
372 hr = E_UNEXPECTED;
373 }
374 ExitOnFailure(hr, "Failed to add metabase data to CustomActionData");
375
376 // TODO: maybe look the key up and make sure we're not just writing the same value that already there
377
378 hr = ScaAddToIisConfiguration(pwzCustomActionData, COST_IIS_WRITEVALUE);
379 ExitOnFailure(hr, "Failed to add ScaWriteMetabaseValue action data: %ls, cost: %d", pwzCustomActionData, COST_IIS_WRITEVALUE);
380
381LExit:
382 ReleaseStr(pwzCustomActionData);
383
384 return hr;
385}
386
387
388HRESULT ScaAddToIisConfiguration(LPCWSTR pwzData, DWORD dwCost)
389{
390 HRESULT hr = S_OK;
391
392 hr = WcaWriteStringToCaData(pwzData, &vpwzCustomActionData);
393 ExitOnFailure(hr, "failed to add to metabase configuration data string: %ls", pwzData);
394
395 vdwCustomActionCost += dwCost;
396
397LExit:
398 return hr;
399}
400
401
402HRESULT ScaWriteConfigurationScript(__in LPCWSTR pwzCaScriptKey)
403{
404 HRESULT hr = S_OK;
405 WCA_CASCRIPT_HANDLE hScript = NULL;
406 LPWSTR pwzHashString = NULL;
407 BYTE rgbActualHash[SHA1_HASH_LEN] = { };
408 DWORD dwHashedBytes = SHA1_HASH_LEN;
409
410 // Create CaScript for communication with WriteMetabaseChanges
411 hr = WcaCaScriptCreate(WCA_ACTION_INSTALL, WCA_CASCRIPT_SCHEDULED, FALSE, pwzCaScriptKey, FALSE, &hScript);
412 ExitOnFailure(hr, "Failed to write ca script for WriteMetabaseChanges script.");
413
414 if (vpwzCustomActionData && *vpwzCustomActionData)
415 {
416 // Write the actual custom action data to the ca script
417 WcaCaScriptWriteString(hScript, vpwzCustomActionData);
418
419 hr = CrypHashBuffer((BYTE*)vpwzCustomActionData, sizeof(vpwzCustomActionData) * sizeof(WCHAR), PROV_RSA_AES, CALG_SHA1, rgbActualHash, dwHashedBytes);
420 ExitOnFailure(hr, "Failed to calculate hash of CustomAction data.");
421
422 hr = StrAlloc(&pwzHashString, ((dwHashedBytes * 2) + 1));
423 ExitOnFailure(hr, "Failed to allocate string for script hash");
424
425 hr = StrHexEncode(rgbActualHash, dwHashedBytes, pwzHashString, ((dwHashedBytes * 2) + 1));
426 ExitOnFailure(hr, "Failed to convert hash bytes to string.");
427
428 WcaLog(LOGMSG_VERBOSE, "Custom action data hash: %ls", pwzHashString);
429 WcaLog(LOGMSG_TRACEONLY, "Custom action data being written to ca script: %ls", vpwzCustomActionData);
430 }
431 else
432 hr = S_FALSE;
433
434LExit:
435 // Release the string
436 ReleaseStr(vpwzCustomActionData);
437 ReleaseStr(pwzHashString);
438
439 // Flush the ca script to disk as best we can
440 WcaCaScriptFlush(hScript);
441
442 WcaCaScriptClose(hScript, WCA_CASCRIPT_CLOSE_PRESERVE);
443
444 return hr;
445}
446
447
448HRESULT ScaLoadMetabase(IMSAdminBase** ppiMetabase)
449{
450 HRESULT hr = S_OK;
451 UINT er = ERROR_SUCCESS;
452
453 // if IIS was uninstalled (thus no IID_IMSAdminBase) allow the
454 // user to still uninstall this package by clicking "Ignore"
455 do
456 {
457 hr = ::CoCreateInstance(CLSID_MSAdminBase, NULL, CLSCTX_ALL, IID_IMSAdminBase, (void**)ppiMetabase);
458 if (FAILED(hr))
459 {
460 WcaLog(LOGMSG_STANDARD, "failed to get IID_IMSAdminBase Object");
461 er = WcaErrorMessage(msierrIISCannotConnect, hr, INSTALLMESSAGE_ERROR | MB_ABORTRETRYIGNORE, 0);
462 switch (er)
463 {
464 case IDABORT:
465 ExitFunction(); // bail with the error result from the CoCreate to kick off a rollback
466 case IDRETRY:
467 hr = S_FALSE; // hit me, baby, one more time
468 break;
469 case IDIGNORE:
470 hr = S_OK; // pretend everything is okay and bail
471 break;
472 default: // For failure on uninstall continue
473 hr = S_OK;
474 break;
475 }
476 }
477 } while (S_FALSE == hr);
478
479LExit:
480 return hr;
481}
diff --git a/src/ext/Iis/ca/scaiis.h b/src/ext/Iis/ca/scaiis.h
new file mode 100644
index 00000000..4c743edf
--- /dev/null
+++ b/src/ext/Iis/ca/scaiis.h
@@ -0,0 +1,33 @@
1#pragma once
2// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
3
4
5HRESULT ScaMetabaseTransaction(__in_z LPCWSTR wzBackup);
6
7HRESULT ScaCreateWeb(IMSAdminBase* piMetabase, LPCWSTR wzWeb, LPCWSTR wzWebBase);
8
9HRESULT ScaDeleteApp(IMSAdminBase* piMetabase, LPCWSTR wzWebRoot);
10
11HRESULT ScaCreateApp(IMSAdminBase* piMetabase, LPCWSTR wzWebRoot,
12 DWORD dwIsolation);
13
14HRESULT ScaCreateMetabaseKey(IMSAdminBase* piMetabase, LPCWSTR wzRootKey,
15 LPCWSTR wzSubKey);
16
17HRESULT ScaDeleteMetabaseKey(IMSAdminBase* piMetabase, LPCWSTR wzRootKey,
18 LPCWSTR wzSubKey);
19
20HRESULT ScaWriteMetabaseValue(IMSAdminBase* piMetabase, LPCWSTR wzRootKey,
21 LPCWSTR wzSubKey, DWORD dwIdentifier,
22 DWORD dwAttributes, DWORD dwUserType,
23 DWORD dwDataType, LPVOID pvData);
24
25HRESULT ScaDeleteMetabaseValue(IMSAdminBase* piMetabase, LPCWSTR wzRootKey,
26 LPCWSTR wzSubKey, DWORD dwIdentifier,
27 DWORD dwDataType);
28
29HRESULT ScaWriteConfigurationScript(LPCWSTR pwzCaScriptKey);
30
31HRESULT ScaAddToIisConfiguration(LPCWSTR pwzData, DWORD dwCost);
32
33HRESULT ScaLoadMetabase(IMSAdminBase** piMetabase);
diff --git a/src/ext/Iis/ca/scaiis7.cpp b/src/ext/Iis/ca/scaiis7.cpp
new file mode 100644
index 00000000..aaf307d7
--- /dev/null
+++ b/src/ext/Iis/ca/scaiis7.cpp
@@ -0,0 +1,74 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3#include "precomp.h"
4
5#define COST_IIS_WRITEKEY 10
6
7HRESULT ScaIIS7ConfigTransaction(LPCWSTR wzBackup)
8{
9 HRESULT hr = S_OK;
10
11 hr = WcaDoDeferredAction(CUSTOM_ACTION_DECORATION(L"StartIIS7ConfigTransaction"), wzBackup, COST_IIS_TRANSACTIONS);
12 ExitOnFailure(hr, "Failed to schedule StartIIS7ConfigTransaction");
13
14 hr = WcaDoDeferredAction(CUSTOM_ACTION_DECORATION(L"RollbackIIS7ConfigTransaction"), wzBackup, 0); // rollback cost is irrelevant
15 ExitOnFailure(hr, "Failed to schedule RollbackIIS7ConfigTransaction");
16
17 hr = WcaDoDeferredAction(CUSTOM_ACTION_DECORATION(L"CommitIIS7ConfigTransaction"), wzBackup, 0); // commit is free
18 ExitOnFailure(hr, "Failed to schedule StartIIS7ConfigTransaction");
19
20LExit:
21 return hr;
22}
23
24HRESULT ScaWriteConfigString(const LPCWSTR wzValue)
25{
26 HRESULT hr = S_OK;
27 WCHAR* pwzCustomActionData = NULL;
28
29 hr = WcaWriteStringToCaData(wzValue, &pwzCustomActionData);
30 ExitOnFailure(hr, "Failed to add metabase delete key directive to CustomActionData");
31
32 hr = ScaAddToIisConfiguration(pwzCustomActionData, COST_IIS_WRITEKEY);
33 ExitOnFailure(hr, "Failed to add ScaWriteMetabaseValue action data: %ls, cost: %d", pwzCustomActionData, COST_IIS_WRITEKEY);
34
35LExit:
36 ReleaseStr(pwzCustomActionData);
37
38 return hr;
39}
40
41HRESULT ScaWriteConfigInteger(DWORD dwValue)
42{
43 HRESULT hr = S_OK;
44 WCHAR* pwzCustomActionData = NULL;
45
46 hr = WcaWriteIntegerToCaData(dwValue, &pwzCustomActionData);
47 ExitOnFailure(hr, "Failed to add metabase delete key directive to CustomActionData");
48
49 hr = ScaAddToIisConfiguration(pwzCustomActionData, COST_IIS_WRITEKEY);
50 ExitOnFailure(hr, "Failed to add ScaWriteMetabaseValue action data: %ls, cost: %d", pwzCustomActionData, COST_IIS_WRITEKEY);
51
52LExit:
53 ReleaseStr(pwzCustomActionData);
54
55 return hr;
56}
57
58HRESULT ScaWriteConfigID(IIS_CONFIG_ACTION emID)
59{
60 HRESULT hr = S_OK;
61 WCHAR* pwzCustomActionData = NULL;
62
63 hr = WcaWriteIntegerToCaData(emID, &pwzCustomActionData);
64 ExitOnFailure(hr, "Failed to add metabase delete key directive to CustomActionData");
65
66 hr = ScaAddToIisConfiguration(pwzCustomActionData, COST_IIS_WRITEKEY);
67 ExitOnFailure(hr, "Failed to add ScaWriteMetabaseValue action data: %ls, cost: %d", pwzCustomActionData, COST_IIS_WRITEKEY);
68
69LExit:
70 ReleaseStr(pwzCustomActionData);
71
72 return hr;
73}
74
diff --git a/src/ext/Iis/ca/scaiis7.h b/src/ext/Iis/ca/scaiis7.h
new file mode 100644
index 00000000..f398deca
--- /dev/null
+++ b/src/ext/Iis/ca/scaiis7.h
@@ -0,0 +1,17 @@
1#pragma once
2// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
3
4
5HRESULT ScaScheduleIIS7Configuration();
6
7HRESULT ScaIIS7ConfigTransaction(__in_z LPCWSTR wzBackup);
8
9HRESULT ScaCreateApp7(__in_z LPCWSTR wzWebRoot, DWORD dwIsolation);
10
11HRESULT ScaDeleteConfigElement(IIS_CONFIG_ACTION emElement, LPCWSTR wzSubKey);
12
13HRESULT ScaWriteConfigString(__in_z const LPCWSTR wzValue);
14
15HRESULT ScaWriteConfigID(IIS_CONFIG_ACTION emID);
16
17HRESULT ScaWriteConfigInteger(DWORD dwValue);
diff --git a/src/ext/Iis/ca/scamimemap.cpp b/src/ext/Iis/ca/scamimemap.cpp
new file mode 100644
index 00000000..8afe99f9
--- /dev/null
+++ b/src/ext/Iis/ca/scamimemap.cpp
@@ -0,0 +1,200 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3#include "precomp.h"
4
5enum eMimeMapQuery { mmqMimeMap = 1, mmqParentType, mmqParentValue,
6 mmqMimeType, mmqExtension};
7
8// prototypes
9static HRESULT AddMimeMapToList(SCA_MIMEMAP** ppsmmList);
10
11
12void ScaMimeMapFreeList(SCA_MIMEMAP* psmmList)
13{
14 SCA_MIMEMAP* psmmDelete = psmmList;
15 while (psmmList)
16 {
17 psmmDelete = psmmList;
18 psmmList = psmmList->psmmNext;
19
20 MemFree(psmmDelete);
21 }
22}
23
24
25HRESULT __stdcall ScaMimeMapRead(
26 SCA_MIMEMAP** ppsmmList,
27 __inout LPWSTR *ppwzCustomActionData
28 )
29{
30 HRESULT hr = S_OK;
31 MSIHANDLE hRec;
32 LPWSTR pwzData = NULL;
33 SCA_MIMEMAP* psmm;
34 WCA_WRAPQUERY_HANDLE hWrapQuery = NULL;
35
36 hr = WcaBeginUnwrapQuery(&hWrapQuery, ppwzCustomActionData);
37 ExitOnFailure(hr, "Failed to unwrap query for ScaMimeMapRead");
38
39 if (0 == WcaGetQueryRecords(hWrapQuery))
40 {
41 WcaLog(LOGMSG_VERBOSE, "Skipping ScaMimeMapRead() - required table not present");
42 ExitFunction1(hr = S_FALSE);
43 }
44
45 // loop through all the mimemappings
46 while (S_OK == (hr = WcaFetchWrappedRecord(hWrapQuery, &hRec)))
47 {
48 hr = AddMimeMapToList(ppsmmList);
49 ExitOnFailure(hr, "failed to add mime map to list");
50
51 psmm = *ppsmmList;
52
53 hr = WcaGetRecordString(hRec, mmqMimeMap, &pwzData);
54 ExitOnFailure(hr, "Failed to get MimeMap.MimeMap");
55 hr = ::StringCchCopyW(psmm->wzMimeMap, countof(psmm->wzMimeMap), pwzData);
56 ExitOnFailure(hr, "Failed to copy mimemap string to mimemap object");
57
58 hr = WcaGetRecordInteger(hRec, mmqParentType, &psmm->iParentType);
59 ExitOnFailure(hr, "Failed to get MimeMap.iParentType");
60
61 hr = WcaGetRecordString(hRec, mmqParentValue, &pwzData);
62 ExitOnFailure(hr, "Failed to get MimeMap.ParentValue");
63 hr = ::StringCchCopyW(psmm->wzParentValue, countof(psmm->wzParentValue), pwzData);
64 ExitOnFailure(hr, "Failed to copy parent value string to mimemap object");
65
66 hr = WcaGetRecordString(hRec, mmqExtension, &pwzData);
67 ExitOnFailure(hr, "Failed to get MimeMap.Extension");
68 hr = ::StringCchCopyW(psmm->wzExtension, countof(psmm->wzExtension), pwzData);
69 ExitOnFailure(hr, "Failed to copy extension string to mimemap object");
70
71 hr = WcaGetRecordString(hRec, mmqMimeType, &pwzData);
72 ExitOnFailure(hr, "Failed to get MimeMap.MimeType");
73 hr = ::StringCchCopyW(psmm->wzMimeType, countof(psmm->wzMimeType), pwzData);
74 ExitOnFailure(hr, "Failed to copy mimetype string to mimemap object");
75 }
76
77 if (E_NOMOREITEMS == hr)
78 hr = S_OK;
79 ExitOnFailure(hr, "Failure while processing mimemappings");
80
81LExit:
82 WcaFinishUnwrapQuery(hWrapQuery);
83
84 ReleaseStr(pwzData);
85
86 return hr;
87}
88
89
90HRESULT ScaGetMimeMap(int iParentType, LPCWSTR wzParentValue, SCA_MIMEMAP **ppsmmList, SCA_MIMEMAP **ppsmmOut)
91{
92 HRESULT hr = S_OK;
93 SCA_MIMEMAP* psmmAdd = NULL;
94 SCA_MIMEMAP* psmmLast = NULL;
95
96 *ppsmmOut = NULL;
97
98 if (!*ppsmmList)
99 return hr;
100
101 SCA_MIMEMAP* psmm = *ppsmmList;
102 while (psmm)
103 {
104 if (iParentType == psmm->iParentType && 0 == lstrcmpW(wzParentValue, psmm->wzParentValue))
105 {
106 // Found a match, take this one out of the list and add it to the matched out list
107 psmmAdd = psmm;
108
109 if (psmmLast)
110 {
111 // If we're not at the beginning of the list tell the last node about it's new next (since we're taking away it's current next)
112 psmmLast->psmmNext = psmmAdd->psmmNext;
113 }
114 else
115 {
116 // If we are at the beginning (no psmmLast) update the beginning (since we're taking it)
117 *ppsmmList = psmm->psmmNext;
118 }
119 psmm = psmm->psmmNext; // move on
120
121 // Add the one we've removed to the beginning of the out list
122 psmmAdd->psmmNext = *ppsmmOut;
123 *ppsmmOut = psmmAdd;
124 }
125 else
126 {
127 psmmLast = psmm; // remember the last we that didn't match
128 psmm = psmm->psmmNext; // move on
129 }
130 }
131
132 return hr;
133}
134
135HRESULT ScaMimeMapCheckList(SCA_MIMEMAP* psmmList)
136{
137 if (!psmmList)
138 return S_OK;
139
140 while (psmmList)
141 {
142 WcaLog(LOGMSG_STANDARD, "MimeMapping of %ls with ParentType=%d and ParentValue=%ls not used!", psmmList->wzMimeMap, psmmList->iParentType, psmmList->wzParentValue);
143 psmmList = psmmList->psmmNext;
144 }
145
146 return E_FAIL;
147}
148
149
150HRESULT ScaWriteMimeMap(IMSAdminBase* piMetabase, LPCWSTR wzRootOfWeb,
151 SCA_MIMEMAP* psmmList)
152{
153 HRESULT hr = S_OK;
154
155 WCHAR wzMimeMap[8192];
156 WCHAR *pwzNext = wzMimeMap;
157 const WCHAR *pwzMac = wzMimeMap + countof(wzMimeMap); // used to properly create the MULTI_SZ
158
159 // fill the MULTI_SZ wzMimeMap buffer for the MimeMap attribute
160 ::ZeroMemory(wzMimeMap, sizeof(wzMimeMap));
161
162 for (SCA_MIMEMAP* psmm = psmmList; psmm; psmm = psmm->psmmNext)
163 {
164 hr = ::StringCchPrintfW(pwzNext, max(0, pwzMac - pwzNext), L"%s,%s", psmm->wzExtension, psmm->wzMimeType);
165 ExitOnFailure(hr, "Failed to set MimeMap string");
166
167 pwzNext += lstrlenW(pwzNext) + 1; // reserve space for null
168 Assert(pwzNext <= pwzMac);
169 }
170
171 if (pwzNext != wzMimeMap)
172 {
173 // now write the CustomErrors to the metabase
174 hr = ScaWriteMetabaseValue(piMetabase, wzRootOfWeb, NULL, MD_MIME_MAP, METADATA_INHERIT, IIS_MD_UT_FILE, MULTISZ_METADATA, wzMimeMap);
175 ExitOnFailure(hr, "Failed to write MimeMap");
176 }
177 else
178 {
179 WcaLog(LOGMSG_VERBOSE, "Skipping ScaWriteMimeMap() - no mappings found.");
180 ExitFunction1(hr = S_FALSE);
181 }
182
183LExit:
184 return hr;
185}
186
187
188static HRESULT AddMimeMapToList(SCA_MIMEMAP** ppsmmList)
189{
190 HRESULT hr = S_OK;
191
192 SCA_MIMEMAP* psmm = static_cast<SCA_MIMEMAP*>(MemAlloc(sizeof(SCA_MIMEMAP), TRUE));
193 ExitOnNull(psmm, hr, E_OUTOFMEMORY, "failed to allocate memory for new mime map list element");
194
195 psmm->psmmNext = *ppsmmList;
196 *ppsmmList = psmm;
197
198LExit:
199 return hr;
200}
diff --git a/src/ext/Iis/ca/scamimemap.h b/src/ext/Iis/ca/scamimemap.h
new file mode 100644
index 00000000..b50e82e9
--- /dev/null
+++ b/src/ext/Iis/ca/scamimemap.h
@@ -0,0 +1,33 @@
1#pragma once
2// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
3
4
5enum eMimeMapParentType { mmptVDir = 1, mmptWeb = 2 };
6
7struct SCA_MIMEMAP
8{
9 // iis configuation information
10 WCHAR wzMimeMap[MAX_DARWIN_KEY + 1];
11 int iParentType;
12 WCHAR wzParentValue[MAX_DARWIN_KEY + 1];
13 WCHAR wzMimeType[MAX_DARWIN_KEY + 1];
14 WCHAR wzExtension[MAX_DARWIN_KEY + 1];
15
16
17 SCA_MIMEMAP* psmmNext;
18};
19
20
21// prototypes
22
23HRESULT __stdcall ScaMimeMapRead(SCA_MIMEMAP** ppsmmList, __inout LPWSTR *ppwzCustomActionData);
24
25HRESULT ScaGetMimeMap(int iParentType, LPCWSTR wzParentValue, SCA_MIMEMAP **psmmList, SCA_MIMEMAP **ppsmmOut);
26
27HRESULT ScaMimeMapCheckList(SCA_MIMEMAP* psmmList);
28
29void ScaMimeMapFreeList(SCA_MIMEMAP* psmmList);
30
31HRESULT ScaWriteMimeMap(IMSAdminBase* piMetabase, LPCWSTR wzRootOfWeb,
32 SCA_MIMEMAP* psmmList);
33
diff --git a/src/ext/Iis/ca/scamimemap7.cpp b/src/ext/Iis/ca/scamimemap7.cpp
new file mode 100644
index 00000000..f6689720
--- /dev/null
+++ b/src/ext/Iis/ca/scamimemap7.cpp
@@ -0,0 +1,68 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3#include "precomp.h"
4
5// prototypes
6HRESULT ScaWriteMimeMap7(
7 __in_z LPCWSTR wzWebName,
8 __in_z LPCWSTR wzRootOfWeb,
9 SCA_MIMEMAP* psmmList
10 )
11{
12 HRESULT hr = S_OK;
13 SCA_MIMEMAP* psmm;
14
15 //create the mimemap list for this vdir application
16 //all go to same web/root location tag
17 hr = ScaWriteConfigID(IIS_MIMEMAP_BEGIN);
18 ExitOnFailure(hr, "Failed to write mimemap begin id");
19 hr = ScaWriteConfigString(wzWebName); //site name key
20 ExitOnFailure(hr, "Failed to write mimemap web key");
21 hr = ScaWriteConfigString(wzRootOfWeb); //app path key
22 ExitOnFailure(hr, "Failed to write mimemap app key");
23
24 psmm = psmmList;
25
26 while (psmm)
27 {
28 //create the Extension for this vdir application
29 hr = ScaWriteConfigID(IIS_MIMEMAP);
30 ExitOnFailure(hr, "Failed to write mimemap id");
31
32 if (*psmm->wzExtension)
33 {
34 hr = ScaWriteConfigString(psmm->wzExtension);
35 }
36 else // blank means "*" (all)
37 {
38 hr = ScaWriteConfigString(L"*");
39 }
40 ExitOnFailure(hr, "Failed to write mimemap extension");
41
42 hr = ScaWriteConfigString(psmm->wzMimeType);
43 ExitOnFailure(hr, "Failed to write mimemap type");
44
45 psmm = psmm->psmmNext;
46 }
47
48 hr = ScaWriteConfigID(IIS_MIMEMAP_END);
49 ExitOnFailure(hr, "Failed to write mimemap end id");
50
51LExit:
52 return hr;
53}
54
55
56//static HRESULT AddMimeMapToList(SCA_MIMEMAP** ppsmmList)
57//{
58// HRESULT hr = S_OK;
59//
60// SCA_MIMEMAP* psmm = static_cast<SCA_MIMEMAP*>(MemAlloc(sizeof(SCA_MIMEMAP), TRUE));
61// ExitOnNull(psmm, hr, E_OUTOFMEMORY, "failed to allocate memory for new mime map list element");
62//
63// psmm->psmmNext = *ppsmmList;
64// *ppsmmList = psmm;
65//
66//LExit:
67// return hr;
68//}
diff --git a/src/ext/Iis/ca/scamimemap7.h b/src/ext/Iis/ca/scamimemap7.h
new file mode 100644
index 00000000..88fcdc39
--- /dev/null
+++ b/src/ext/Iis/ca/scamimemap7.h
@@ -0,0 +1,10 @@
1#pragma once
2// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
3
4
5HRESULT ScaWriteMimeMap7(
6 __in_z LPCWSTR wzWebName,
7 __in_z LPCWSTR wzRootOfWeb,
8 SCA_MIMEMAP* psmmList
9 );
10
diff --git a/src/ext/Iis/ca/scaproperty.cpp b/src/ext/Iis/ca/scaproperty.cpp
new file mode 100644
index 00000000..d0e0d8a4
--- /dev/null
+++ b/src/ext/Iis/ca/scaproperty.cpp
@@ -0,0 +1,252 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3#include "precomp.h"
4
5/*------------------------------------------------------------------
6IIsProperty table:
7
8Property Component_ Attributes Value
9s72 s72 i4 s255
10------------------------------------------------------------------*/
11
12// sql queries
13enum ePropertyQuery { pqProperty = 1, pqComponent, pqAttributes, pqValue, pqInstalled, pqAction };
14
15
16// prototypes
17static HRESULT AddPropertyToList(
18 SCA_PROPERTY** ppspList
19 );
20
21
22// functions
23void ScaPropertyFreeList(
24 SCA_PROPERTY* pspList
25 )
26{
27 SCA_PROPERTY* pspDelete = pspList;
28 while (pspList)
29 {
30 pspDelete = pspList;
31 pspList = pspList->pspNext;
32
33 MemFree(pspDelete);
34 }
35}
36
37
38HRESULT ScaPropertyRead(
39 SCA_PROPERTY** ppspList,
40 __inout LPWSTR *ppwzCustomActionData
41 )
42{
43 HRESULT hr = S_OK;
44 MSIHANDLE hRec;
45
46 LPWSTR pwzData = NULL;
47 SCA_PROPERTY* pss;
48
49 WCA_WRAPQUERY_HANDLE hWrapQuery = NULL;
50
51 ExitOnNull(ppspList, hr, E_INVALIDARG, "Failed to read property, because no property to read was provided");
52
53 hr = WcaBeginUnwrapQuery(&hWrapQuery, ppwzCustomActionData);
54 ExitOnFailure(hr, "Failed to unwrap query for ScaAppPoolRead");
55
56 if (0 == WcaGetQueryRecords(hWrapQuery))
57 {
58 WcaLog(LOGMSG_VERBOSE, "Skipping ScaInstallProperty() - required table not present");
59 ExitFunction1(hr = S_FALSE);
60 }
61
62 // loop through all the Settings
63 while (S_OK == (hr = WcaFetchWrappedRecord(hWrapQuery, &hRec)))
64 {
65 hr = AddPropertyToList(ppspList);
66 ExitOnFailure(hr, "failed to add property to list");
67
68 pss = *ppspList;
69
70 hr = WcaGetRecordString(hRec, pqProperty, &pwzData);
71 ExitOnFailure(hr, "failed to get IIsProperty.Property");
72 hr = ::StringCchCopyW(pss->wzProperty, countof(pss->wzProperty), pwzData);
73 ExitOnFailure(hr, "failed to copy Property name: %ls", pwzData);
74
75 hr = WcaGetRecordString(hRec, pqValue, &pwzData);
76 ExitOnFailure(hr, "failed to get IIsProperty.Value");
77 hr = ::StringCchCopyW(pss->wzValue, countof(pss->wzValue), pwzData);
78 ExitOnFailure(hr, "failed to copy Property value: %ls", pwzData);
79
80 hr = WcaGetRecordInteger(hRec, pqAttributes, &pss->iAttributes);
81 ExitOnFailure(hr, "failed to get IIsProperty.Attributes");
82
83 hr = WcaGetRecordString(hRec, pqComponent, &pwzData);
84 ExitOnFailure(hr, "failed to get IIsProperty.Component");
85 hr = ::StringCchCopyW(pss->wzComponent, countof(pss->wzComponent), pwzData);
86 ExitOnFailure(hr, "failed to copy component name: %ls", pwzData);
87
88 hr = WcaGetRecordInteger(hRec, pqInstalled, (int *)&pss->isInstalled);
89 ExitOnFailure(hr, "Failed to get Component installed state for filter");
90
91 hr = WcaGetRecordInteger(hRec, pqAction, (int *)&pss->isAction);
92 ExitOnFailure(hr, "Failed to get Component action state for filter");
93 }
94
95 if (E_NOMOREITEMS == hr)
96 {
97 hr = S_OK;
98 }
99 ExitOnFailure(hr, "failure while processing IIsProperty table");
100
101LExit:
102 WcaFinishUnwrapQuery(hWrapQuery);
103
104 ReleaseStr(pwzData);
105
106 return hr;
107}
108
109
110HRESULT ScaPropertyInstall(
111 IMSAdminBase* piMetabase,
112 SCA_PROPERTY* pspList
113 )
114{
115 Assert(piMetabase);
116
117 HRESULT hr = S_OK;
118
119 for (SCA_PROPERTY* psp = pspList; psp; psp = psp->pspNext)
120 {
121 // if we are installing the web site
122 if (WcaIsInstalling(psp->isInstalled, psp->isAction))
123 {
124 hr = ScaWriteProperty(piMetabase, psp);
125 ExitOnFailure(hr, "failed to write Property '%ls' to metabase", psp->wzProperty);
126 }
127 }
128
129LExit:
130 return hr;
131}
132
133
134HRESULT ScaPropertyUninstall(
135 IMSAdminBase* piMetabase,
136 SCA_PROPERTY* pspList
137 )
138{
139 Assert(piMetabase);
140
141 HRESULT hr = S_OK;
142
143 for (SCA_PROPERTY* psp = pspList; psp; psp = psp->pspNext)
144 {
145 // if we are uninstalling the web site
146 if (WcaIsUninstalling(psp->isInstalled, psp->isAction))
147 {
148 hr = ScaRemoveProperty(piMetabase, psp);
149 ExitOnFailure(hr, "Failed to remove Property '%ls' from metabase", psp->wzProperty);
150 }
151 }
152
153LExit:
154 return hr;
155}
156
157
158HRESULT ScaWriteProperty(
159 IMSAdminBase* piMetabase,
160 SCA_PROPERTY* psp
161 )
162{
163 Assert(piMetabase);
164
165 HRESULT hr = S_OK;
166 DWORD dwValue;
167 LPWSTR wz = NULL;
168
169 ExitOnNull(psp, hr, E_INVALIDARG, "Failed to write property because no property to write was given");
170
171 //
172 // Figure out what setting we're writing and write it
173 //
174 if (0 == lstrcmpW(psp->wzProperty, wzIISPROPERTY_IIS5_ISOLATION_MODE))
175 {
176 dwValue = 1;
177 hr = ScaWriteMetabaseValue(piMetabase, L"/LM/W3SVC", NULL, MD_GLOBAL_STANDARD_APP_MODE_ENABLED, METADATA_NO_ATTRIBUTES, IIS_MD_UT_SERVER, DWORD_METADATA, (LPVOID)((DWORD_PTR)dwValue));
178 ExitOnFailure(hr, "failed to set IIs5IsolationMode");
179 }
180 else if (0 == lstrcmpW(psp->wzProperty, wzIISPROPERTY_MAX_GLOBAL_BANDWIDTH))
181 {
182 dwValue = wcstoul(psp->wzValue, &wz, 10) * 1024; // remember, the value shown is in kilobytes, the value saved is in bytes
183 hr = ScaWriteMetabaseValue(piMetabase, L"/LM/W3SVC", NULL, MD_MAX_GLOBAL_BANDWIDTH, METADATA_NO_ATTRIBUTES, IIS_MD_UT_SERVER, DWORD_METADATA, (LPVOID)((DWORD_PTR)dwValue));
184 ExitOnFailure(hr, "failed to set MaxGlobalBandwidth");
185 }
186 else if (0 == lstrcmpW(psp->wzProperty, wzIISPROPERTY_LOG_IN_UTF8))
187 {
188 dwValue = 1;
189 hr = ScaWriteMetabaseValue(piMetabase, L"/LM/W3SVC", NULL, MD_GLOBAL_LOG_IN_UTF_8, METADATA_NO_ATTRIBUTES, IIS_MD_UT_SERVER, DWORD_METADATA, (LPVOID)((DWORD_PTR)dwValue));
190 ExitOnFailure(hr, "failed to set LogInUTF8");
191 }
192 else if (0 == lstrcmpW(psp->wzProperty, wzIISPROPERTY_ETAG_CHANGENUMBER))
193 {
194 dwValue = wcstoul(psp->wzValue, &wz, 10);
195 hr = ScaWriteMetabaseValue(piMetabase, L"/LM/W3SVC", NULL, /*MD_ETAG_CHANGENUMBER*/ 2039, METADATA_INHERIT, IIS_MD_UT_SERVER, DWORD_METADATA, (LPVOID)((DWORD_PTR)dwValue));
196 ExitOnFailure(hr, "failed to set EtagChangenumber");
197 }
198LExit:
199 return hr;
200}
201
202
203HRESULT ScaRemoveProperty(
204 IMSAdminBase* piMetabase,
205 SCA_PROPERTY* psp
206 )
207{
208 Assert(piMetabase);
209
210 HRESULT hr = S_OK;
211 DWORD dwValue;
212
213 ExitOnNull(psp, hr, E_INVALIDARG, "Failed to remove property because no property to remove was given");
214
215 if (0 == lstrcmpW(psp->wzProperty, wzIISPROPERTY_IIS5_ISOLATION_MODE))
216 {
217 dwValue = 0;
218 hr = ScaWriteMetabaseValue(piMetabase, L"/LM/W3SVC", NULL, MD_GLOBAL_STANDARD_APP_MODE_ENABLED, METADATA_NO_ATTRIBUTES, IIS_MD_UT_SERVER, DWORD_METADATA, (LPVOID)((DWORD_PTR)dwValue));
219 ExitOnFailure(hr, "failed to clear IIs5IsolationMode");
220 }
221 else if (0 == lstrcmpW(psp->wzProperty, wzIISPROPERTY_MAX_GLOBAL_BANDWIDTH))
222 {
223 dwValue = 0xFFFFFFFF; // This unchecks the box
224 hr = ScaWriteMetabaseValue(piMetabase, L"/LM/W3SVC", NULL, MD_MAX_GLOBAL_BANDWIDTH, METADATA_NO_ATTRIBUTES , IIS_MD_UT_SERVER, DWORD_METADATA, (LPVOID)((DWORD_PTR)dwValue));
225 ExitOnFailure(hr, "failed to clear MaxGlobalBandwidth");
226 }
227 else if (0 == lstrcmpW(psp->wzProperty, wzIISPROPERTY_LOG_IN_UTF8))
228 {
229 dwValue = 0;
230 hr = ScaWriteMetabaseValue(piMetabase, L"/LM/W3SVC", NULL, MD_GLOBAL_LOG_IN_UTF_8, METADATA_NO_ATTRIBUTES, IIS_MD_UT_SERVER, DWORD_METADATA, (LPVOID)((DWORD_PTR)dwValue));
231 ExitOnFailure(hr, "failed to clear LogInUTF8");
232 }
233
234LExit:
235 return hr;
236}
237
238
239static HRESULT AddPropertyToList(
240 SCA_PROPERTY** ppspList
241 )
242{
243 HRESULT hr = S_OK;
244 SCA_PROPERTY* psp = static_cast<SCA_PROPERTY*>(MemAlloc(sizeof(SCA_PROPERTY), TRUE));
245 ExitOnNull(psp, hr, E_OUTOFMEMORY, "failed to allocate memory for new property list element");
246
247 psp->pspNext = *ppspList;
248 *ppspList = psp;
249
250LExit:
251 return hr;
252}
diff --git a/src/ext/Iis/ca/scaproperty.h b/src/ext/Iis/ca/scaproperty.h
new file mode 100644
index 00000000..21e7cfc7
--- /dev/null
+++ b/src/ext/Iis/ca/scaproperty.h
@@ -0,0 +1,54 @@
1#pragma once
2// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
3
4
5#define wzIISPROPERTY_IIS5_ISOLATION_MODE L"IIs5IsolationMode"
6#define wzIISPROPERTY_MAX_GLOBAL_BANDWIDTH L"MaxGlobalBandwidth"
7#define wzIISPROPERTY_LOG_IN_UTF8 L"LogInUTF8"
8#define wzIISPROPERTY_ETAG_CHANGENUMBER L"ETagChangeNumber"
9
10struct SCA_PROPERTY
11{
12 // iis configuation information
13 WCHAR wzProperty[MAX_DARWIN_KEY + 1];
14 WCHAR wzComponent[MAX_DARWIN_KEY + 1];
15 INSTALLSTATE isInstalled;
16 INSTALLSTATE isAction;
17 INT iAttributes;
18 WCHAR wzValue[MAX_DARWIN_COLUMN + 1];
19
20 SCA_PROPERTY *pspNext;
21};
22
23
24// prototypes
25
26HRESULT ScaPropertyRead(
27 SCA_PROPERTY** ppspList,
28 __inout LPWSTR *ppwzCustomActionData
29 );
30
31void ScaPropertyFreeList(
32 SCA_PROPERTY* pspList
33 );
34
35HRESULT ScaPropertyInstall(
36 IMSAdminBase* piMetabase,
37 SCA_PROPERTY* pspList
38 );
39
40HRESULT ScaPropertyUninstall(
41 IMSAdminBase* piMetabase,
42 SCA_PROPERTY* pspList
43 );
44
45HRESULT ScaWriteProperty(
46 IMSAdminBase* piMetabase,
47 SCA_PROPERTY* psp
48 );
49
50HRESULT ScaRemoveProperty(
51 IMSAdminBase* piMetabase,
52 SCA_PROPERTY* psp
53 );
54
diff --git a/src/ext/Iis/ca/scaproperty7.cpp b/src/ext/Iis/ca/scaproperty7.cpp
new file mode 100644
index 00000000..d17eeb68
--- /dev/null
+++ b/src/ext/Iis/ca/scaproperty7.cpp
@@ -0,0 +1,108 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3#include "precomp.h"
4
5HRESULT ScaPropertyInstall7(
6 SCA_PROPERTY* pspList
7 )
8{
9 HRESULT hr = S_OK;
10
11 for (SCA_PROPERTY* psp = pspList; psp; psp = psp->pspNext)
12 {
13 // if we are installing the web site
14 if (WcaIsInstalling(psp->isInstalled, psp->isAction))
15 {
16 hr = ScaWriteProperty7(psp);
17 ExitOnFailure(hr, "failed to write Property '%ls' ", psp->wzProperty);
18 }
19 }
20
21LExit:
22 return hr;
23}
24
25
26HRESULT ScaPropertyUninstall7(
27 SCA_PROPERTY* pspList
28 )
29{
30 HRESULT hr = S_OK;
31
32 for (SCA_PROPERTY* psp = pspList; psp; psp = psp->pspNext)
33 {
34 // if we are uninstalling the web site
35 if (WcaIsUninstalling(psp->isInstalled, psp->isAction))
36 {
37 hr = ScaRemoveProperty7(psp);
38 ExitOnFailure(hr, "Failed to remove Property '%ls'", psp->wzProperty);
39 }
40 }
41
42LExit:
43 return hr;
44}
45
46
47HRESULT ScaWriteProperty7(
48 const SCA_PROPERTY* psp
49 )
50{
51 HRESULT hr = S_OK;
52 DWORD dwValue;
53 LPWSTR wz = NULL;
54
55 ExitOnNull(psp, hr, E_INVALIDARG, "Failed to write property because no property to write was given");
56 //
57 // Figure out what setting we're writing and write it
58 //
59 if (0 == wcscmp(psp->wzProperty, wzIISPROPERTY_IIS5_ISOLATION_MODE))
60 {
61 // IIs5IsolationMode not supported
62 WcaLog(LOGMSG_VERBOSE, "Not supported by IIS7: IIs5IsolationMode, ignoring");
63 }
64 else if (0 == wcscmp(psp->wzProperty, wzIISPROPERTY_MAX_GLOBAL_BANDWIDTH))
65 {
66 dwValue = wcstoul(psp->wzValue, &wz, 10) * 1024; // remember, the value shown is in kilobytes, the value saved is in bytes
67 hr = ScaWriteConfigID(IIS_PROPERTY);
68 ExitOnFailure(hr, "failed to set Property ID");
69 hr = ScaWriteConfigID(IIS_PROPERTY_MAXBAND);
70 ExitOnFailure(hr, "failed to set Property MSXBAND ID");
71 hr = ScaWriteConfigInteger(dwValue);
72 ExitOnFailure(hr, "failed to set Property MSXBAND value");
73 }
74 else if (0 == wcscmp(psp->wzProperty, wzIISPROPERTY_LOG_IN_UTF8))
75 {
76 dwValue = 1;
77 hr = ScaWriteConfigID(IIS_PROPERTY);
78 ExitOnFailure(hr, "failed to set Property ID");
79 hr = ScaWriteConfigID(IIS_PROPERTY_LOGUTF8);
80 ExitOnFailure(hr, "failed to set Property LOG ID");
81 hr = ScaWriteConfigInteger(dwValue);
82 ExitOnFailure(hr, "failed to set Property Log value");
83 }
84 else if (0 == wcscmp(psp->wzProperty, wzIISPROPERTY_ETAG_CHANGENUMBER))
85 {
86 //EtagChangenumber not supported
87 WcaLog(LOGMSG_VERBOSE, "Not supported by IIS7: EtagChangenumber, ignoring");
88 }
89
90LExit:
91 return hr;
92}
93
94HRESULT ScaRemoveProperty7(
95 __in SCA_PROPERTY* /*psp*/
96 )
97{
98
99 // NOP function for now
100 //The two global values being set by WebProperty:
101 // <iis:WebProperty Id="MaxGlobalBandwidth" Value="1024" />
102 // <iis:WebProperty Id ="LogInUTF8" />
103 // should should not be removed on uninstall.
104
105 HRESULT hr = S_OK;
106
107 return hr;
108}
diff --git a/src/ext/Iis/ca/scaproperty7.h b/src/ext/Iis/ca/scaproperty7.h
new file mode 100644
index 00000000..bbf811e8
--- /dev/null
+++ b/src/ext/Iis/ca/scaproperty7.h
@@ -0,0 +1,26 @@
1#pragma once
2// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
3
4
5#define wzIISPROPERTY_IIS5_ISOLATION_MODE L"IIs5IsolationMode"
6#define wzIISPROPERTY_MAX_GLOBAL_BANDWIDTH L"MaxGlobalBandwidth"
7#define wzIISPROPERTY_LOG_IN_UTF8 L"LogInUTF8"
8#define wzIISPROPERTY_ETAG_CHANGENUMBER L"ETagChangeNumber"
9
10// prototypes
11HRESULT ScaPropertyInstall7(
12 SCA_PROPERTY* pspList
13 );
14
15HRESULT ScaPropertyUninstall7(
16 SCA_PROPERTY* pspList
17 );
18
19HRESULT ScaWriteProperty7(
20 const SCA_PROPERTY* psp
21 );
22
23HRESULT ScaRemoveProperty7(
24 SCA_PROPERTY* psp
25 );
26
diff --git a/src/ext/Iis/ca/scasched.cpp b/src/ext/Iis/ca/scasched.cpp
new file mode 100644
index 00000000..de021275
--- /dev/null
+++ b/src/ext/Iis/ca/scasched.cpp
@@ -0,0 +1,823 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3#include "precomp.h"
4
5const int ConfigureIIsCost = 8;
6const int WriteMetabaseChangesCost = 20;
7const int WriteIIS7ConfigChangesCost = 20;
8
9// sql queries
10LPCWSTR vcsUserDeferredQuery = L"SELECT `User`, `Component_`, `Name`, `Domain`, `Password` FROM `User`";
11
12LPCWSTR vcsWebSvcExtQuery = L"SELECT `Component_`, `File`, `Description`, `Group`, `Attributes` FROM `IIsWebServiceExtension`";
13
14LPCWSTR vcsAppPoolQuery = L"SELECT `AppPool`, `Name`, `Component_`, `Attributes`, `User_`, `RecycleMinutes`, `RecycleRequests`, `RecycleTimes`, `VirtualMemory`, `PrivateMemory`, `IdleTimeout`, `QueueLimit`, `CPUMon`, `MaxProc`, `ManagedRuntimeVersion`, `ManagedPipelineMode` FROM `IIsAppPool`";
15
16LPCWSTR vcsComponentAttrQuery = L"SELECT `Component`,`Attributes` FROM `Component`";
17
18LPCWSTR vcsMimeMapQuery = L"SELECT `MimeMap`, `ParentType`, `ParentValue`, `MimeType`, `Extension` FROM `IIsMimeMap`";
19
20LPCWSTR vcsHttpHeaderQuery = L"SELECT `Name`, `ParentType`, `ParentValue`, `Value`, `Attributes` FROM `IIsHttpHeader` ORDER BY `Sequence`";
21
22LPCWSTR vcsWebErrorQuery =
23 L"SELECT `ErrorCode`, `SubCode`, `ParentType`, `ParentValue`, `File`, `URL` "
24 L"FROM `IIsWebError` ORDER BY `ErrorCode`, `SubCode`";
25
26LPCWSTR vcsWebDirPropertiesQuery = L"SELECT `DirProperties`, `Access`, `Authorization`, `AnonymousUser_`, `IIsControlledPassword`, `LogVisits`, `Index`, `DefaultDoc`, `AspDetailedError`, `HttpExpires`, `CacheControlMaxAge`, `CacheControlCustom`, `NoCustomError`, `AccessSSLFlags`, `AuthenticationProviders` "
27 L"FROM `IIsWebDirProperties`";
28
29LPCWSTR vcsSslCertificateQuery = L"SELECT `Certificate`.`StoreName`, `CertificateHash`.`Hash`, `IIsWebSiteCertificates`.`Web_` FROM `Certificate`, `CertificateHash`, `IIsWebSiteCertificates` WHERE `Certificate`.`Certificate`=`CertificateHash`.`Certificate_` AND `CertificateHash`.`Certificate_`=`IIsWebSiteCertificates`.`Certificate_`";
30
31LPCWSTR vcsWebLogQuery = L"SELECT `Log`, `Format` "
32 L"FROM `IIsWebLog`";
33
34LPCWSTR vcsWebApplicationQuery = L"SELECT `Name`, `Isolation`, `AllowSessions`, `SessionTimeout`, "
35 L"`Buffer`, `ParentPaths`, `DefaultScript`, `ScriptTimeout`, "
36 L"`ServerDebugging`, `ClientDebugging`, `AppPool_`, `Application` "
37 L"FROM `IIsWebApplication`";
38
39LPCWSTR vcsWebAppExtensionQuery = L"SELECT `Extension`, `Verbs`, `Executable`, `Attributes`, `Application_` FROM `IIsWebApplicationExtension`";
40
41LPCWSTR vcsWebQuery = L"SELECT `Web`, `Component_`, `Id`, `Description`, `ConnectionTimeout`, `Directory_`, `State`, `Attributes`, `DirProperties_`, `Application_`, "
42 L"`Address`, `IP`, `Port`, `Header`, `Secure`, `Log_` FROM `IIsWebSite`, `IIsWebAddress` "
43 L"WHERE `KeyAddress_`=`Address` ORDER BY `Sequence`";
44
45LPCWSTR vcsWebAddressQuery = L"SELECT `Address`, `Web_`, `IP`, `Port`, `Header`, `Secure` "
46 L"FROM `IIsWebAddress`";
47
48LPCWSTR vcsWebBaseQuery = L"SELECT `Web`, `Id`, `IP`, `Port`, `Header`, `Secure`, `Description` "
49 L"FROM `IIsWebSite`, `IIsWebAddress` "
50 L"WHERE `KeyAddress_`=`Address`";
51
52LPCWSTR vcsWebDirQuery = L"SELECT `Web_`, `WebDir`, `Component_`, `Path`, `DirProperties_`, `Application_` "
53 L"FROM `IIsWebDir`";
54
55LPCWSTR vcsVDirQuery = L"SELECT `Web_`, `VirtualDir`, `Component_`, `Alias`, `Directory_`, `DirProperties_`, `Application_` "
56 L"FROM `IIsWebVirtualDir`";
57
58LPCWSTR vcsFilterQuery = L"SELECT `Web_`, `Name`, `Component_`, `Path`, `Description`, `Flags`, `LoadOrder` FROM `IIsFilter` ORDER BY `Web_`";
59
60LPCWSTR vcsPropertyQuery = L"SELECT `Property`, `Component_`, `Attributes`, `Value` "
61 L"FROM `IIsProperty`";
62
63#define IIS7CONDITION L"VersionNT >= 600"
64#define USEIIS7CONDITION IIS7CONDITION L"AND NOT UseIis6Compatibility"
65
66/********************************************************************
67ConfigureIIs - CUSTOM ACTION ENTRY POINT for installing IIs settings
68
69********************************************************************/
70extern "C" UINT __stdcall ConfigureIIs(
71 __in MSIHANDLE hInstall
72 )
73{
74 //AssertSz(FALSE, "debug ConfigureIIs here");
75 HRESULT hr = S_OK;
76 UINT er = ERROR_SUCCESS;
77 LPWSTR pwzScriptKey = NULL;
78 LPWSTR pwzBackupId = NULL;
79 LPWSTR pwzCustomActionData = NULL; // CustomActionData for ConfigureIIs custom action
80
81 // initialize
82 hr = WcaInitialize(hInstall, "ConfigureIIs");
83 ExitOnFailure(hr, "Failed to initialize");
84
85 // check for the prerequsite tables
86 if (S_OK != WcaTableExists(L"IIsWebSite") && S_OK != WcaTableExists(L"IIsFilter") && S_OK != WcaTableExists(L"IIsProperty") &&
87 S_OK != WcaTableExists(L"IIsWebServiceExtension") && S_OK != WcaTableExists(L"IIsAppPool"))
88 {
89 WcaLog(LOGMSG_VERBOSE, "skipping IIs CustomAction, no IIsWebSite table, no IIsFilter table, no IIsProperty table, no IIsWebServiceExtension, and no IIsAppPool table");
90 ExitFunction1(hr = S_FALSE);
91 }
92
93 // Get a CaScript key
94 hr = WcaCaScriptCreateKey(&pwzScriptKey);
95 ExitOnFailure(hr, "Failed to get encoding key.");
96
97 // Generate a unique string to be used for this product's transaction
98 // This prevents a name collision when doing a major upgrade
99 hr = WcaGetProperty(L"ProductCode", &pwzBackupId);
100 ExitOnFailure(hr, "failed to get ProductCode");
101
102 hr = StrAllocConcat(&pwzBackupId, L"ScaConfigureIIs", 0);
103 ExitOnFailure(hr, "failed to concat ScaConfigureIIs");
104
105 // make sure the operations below are wrapped in a "transaction"
106 // use IIS7 transaction logic even if using Iis6 compat because Backup/Restore don't work with metabase compatibility
107 if (MSICONDITION_TRUE == ::MsiEvaluateConditionW(hInstall, IIS7CONDITION))
108 {
109 hr = ScaIIS7ConfigTransaction(pwzBackupId);
110 MessageExitOnFailure(hr, msierrIISFailedSchedTransaction, "failed to start IIS7 transaction");
111 }
112 else
113 {
114 hr = ScaMetabaseTransaction(pwzBackupId);
115 MessageExitOnFailure(hr, msierrIISFailedSchedTransaction, "failed to start IIS transaction");
116 }
117
118 // Write the CaScript key to the ConfigureIIS custom action data
119 hr = WcaWriteStringToCaData(pwzScriptKey, &pwzCustomActionData);
120 ExitOnFailure(hr, "Failed to add encoding key to CustomActionData.");
121
122 // Wrap vcsUserDeferredQuery to send to deferred CA
123 if (S_OK == WcaTableExists(L"User"))
124 {
125 hr = WcaWrapQuery(vcsUserDeferredQuery, &pwzCustomActionData, efmcColumn3 | efmcColumn4 | efmcColumn5, 0xFFFFFFFF, 0xFFFFFFFF);
126 ExitOnFailure(hr, "Failed to wrap User query");
127 }
128 else
129 {
130 hr = WcaWrapEmptyQuery(&pwzCustomActionData);
131 ExitOnFailure(hr, "Failed to wrap User empty query");
132 }
133
134 // Wrap vcsWebSvcExtQuery to send to deferred CA
135 if (S_OK == WcaTableExists(L"IIsWebServiceExtension"))
136 {
137 hr = WcaWrapQuery(vcsWebSvcExtQuery, &pwzCustomActionData, efmcColumn2 | efmcColumn3 | efmcColumn4, 1, 0xFFFFFFFF);
138 ExitOnFailure(hr, "Failed to wrap IIsWebServiceExtension query");
139 }
140 else
141 {
142 hr = WcaWrapEmptyQuery(&pwzCustomActionData);
143 ExitOnFailure(hr, "Failed to wrap IIsWebServiceExtension empty query");
144 }
145
146 // Wrap vcsAppPoolQuery to send to deferred CA
147 if (S_OK == WcaTableExists(L"IIsAppPool"))
148 {
149 hr = WcaWrapQuery(vcsAppPoolQuery, &pwzCustomActionData, efmcColumn2 | efmcColumn15 | efmcColumn16, 3, 0xFFFFFFFF);
150 ExitOnFailure(hr, "Failed to wrap IIsAppPool query");
151
152 hr = WcaWrapQuery(vcsComponentAttrQuery, &pwzCustomActionData, 0, 0xFFFFFFFF, 0xFFFFFFFF);
153 ExitOnFailure(hr, "Failed to wrap Component query");
154 }
155 else
156 {
157 hr = WcaWrapEmptyQuery(&pwzCustomActionData);
158 ExitOnFailure(hr, "Failed to wrap IIsAppPool empty query");
159 }
160
161 // Wrap vcsMimeMapQuery to send to deferred CA
162 if (S_OK == WcaTableExists(L"IIsMimeMap"))
163 {
164 hr = WcaWrapQuery(vcsMimeMapQuery, &pwzCustomActionData, efmcColumn4 | efmcColumn5, 0xFFFFFFFF, 0xFFFFFFFF);
165 ExitOnFailure(hr, "Failed to wrap IIsMimeMap query");
166 }
167 else
168 {
169 hr = WcaWrapEmptyQuery(&pwzCustomActionData);
170 ExitOnFailure(hr, "Failed to wrap IIsMimeMap empty query");
171 }
172
173 // Wrap vcsHttpHeaderQuery to send to deferred CA
174 if (S_OK == WcaTableExists(L"IIsHttpHeader"))
175 {
176 hr = WcaWrapQuery(vcsHttpHeaderQuery, &pwzCustomActionData, efmcColumn1 | efmcColumn4, 0xFFFFFFFF, 0xFFFFFFFF);
177 ExitOnFailure(hr, "Failed to wrap IIsHttpHeader query");
178 }
179 else
180 {
181 hr = WcaWrapEmptyQuery(&pwzCustomActionData);
182 ExitOnFailure(hr, "Failed to wrap IIsHttpHeader empty query");
183 }
184
185 // Wrap vcsWebErrorQuery to send to deferred CA
186 if (S_OK == WcaTableExists(L"IIsWebError"))
187 {
188 hr = WcaWrapQuery(vcsWebErrorQuery, &pwzCustomActionData, efmcColumn5 | efmcColumn6, 0xFFFFFFFF, 0xFFFFFFFF);
189 ExitOnFailure(hr, "Failed to wrap IIsWebError query");
190 }
191 else
192 {
193 hr = WcaWrapEmptyQuery(&pwzCustomActionData);
194 ExitOnFailure(hr, "Failed to wrap IIsWebError empty query");
195 }
196
197 // Wrap vcsWebDirPropertiesQuery to send to deferred CA
198 if (S_OK == WcaTableExists(L"IIsWebDirProperties"))
199 {
200 hr = WcaWrapQuery(vcsWebDirPropertiesQuery, &pwzCustomActionData, efmcColumn8 | efmcColumn10 | efmcColumn12 | efmcColumn15, 0xFFFFFFFF, 0xFFFFFFFF);
201 ExitOnFailure(hr, "Failed to wrap IIsWebDirProperties query");
202 }
203 else
204 {
205 hr = WcaWrapEmptyQuery(&pwzCustomActionData);
206 ExitOnFailure(hr, "Failed to wrap IIsWebDirProperties empty query");
207 }
208
209 // Wrap vcsSslCertificateQuery to send to deferred CA
210 if (S_OK == WcaTableExists(L"Certificate") && S_OK == WcaTableExists(L"CertificateHash") && S_OK == WcaTableExists(L"IIsWebSiteCertificates"))
211 {
212 hr = WcaWrapQuery(vcsSslCertificateQuery, &pwzCustomActionData, 0, 0xFFFFFFFF, 0xFFFFFFFF);
213 ExitOnFailure(hr, "Failed to wrap SslCertificate query");
214 }
215 else
216 {
217 hr = WcaWrapEmptyQuery(&pwzCustomActionData);
218 ExitOnFailure(hr, "Failed to wrap SslCertificate empty query");
219 }
220
221 // Wrap vcsWebLogQuery to send to deferred CA
222 if (S_OK == WcaTableExists(L"IIsWebLog"))
223 {
224 hr = WcaWrapQuery(vcsWebLogQuery, &pwzCustomActionData, efmcColumn2, 0xFFFFFFFF, 0xFFFFFFFF);
225 ExitOnFailure(hr, "Failed to wrap IIsWebLog query");
226 }
227 else
228 {
229 hr = WcaWrapEmptyQuery(&pwzCustomActionData);
230 ExitOnFailure(hr, "Failed to wrap IIsWebLog empty query");
231 }
232
233 // Wrap vcsWebApplicationQuery to send to deferred CA
234 if (S_OK == WcaTableExists(L"IIsWebApplication"))
235 {
236 hr = WcaWrapQuery(vcsWebApplicationQuery, &pwzCustomActionData, efmcColumn1, 0xFFFFFFFF, 0xFFFFFFFF);
237 ExitOnFailure(hr, "Failed to wrap IIsWebApplication query");
238 }
239 else
240 {
241 hr = WcaWrapEmptyQuery(&pwzCustomActionData);
242 ExitOnFailure(hr, "Failed to wrap IIsWebApplication empty query");
243 }
244
245 // Wrap vcsWebAppExtensionQuery to send to deferred CA
246 if (S_OK == WcaTableExists(L"IIsWebApplicationExtension"))
247 {
248 hr = WcaWrapQuery(vcsWebAppExtensionQuery, &pwzCustomActionData, efmcColumn2 | efmcColumn3, 0xFFFFFFFF, 0xFFFFFFFF);
249 ExitOnFailure(hr, "Failed to wrap IIsWebApplicationExtension query");
250 }
251 else
252 {
253 hr = WcaWrapEmptyQuery(&pwzCustomActionData);
254 ExitOnFailure(hr, "Failed to wrap IIsWebApplicationExtension empty query");
255 }
256
257 // Wrap vcsWebQuery, vcsWebAddressQuery, and vcsWebBaseQuery to send to deferred CA
258 if (S_OK == WcaTableExists(L"IIsWebAddress") && S_OK == WcaTableExists(L"IIsWebSite"))
259 {
260 hr = WcaWrapQuery(vcsWebQuery, &pwzCustomActionData, efmcColumn3 | efmcColumn4 | efmcColumn12 | efmcColumn13 | efmcColumn14, 2, 6);
261 ExitOnFailure(hr, "Failed to wrap IIsWebSite query");
262
263 hr = WcaWrapQuery(vcsWebAddressQuery, &pwzCustomActionData, efmcColumn3 | efmcColumn4 | efmcColumn5, 0xFFFFFFFF, 0xFFFFFFFF);
264 ExitOnFailure(hr, "Failed to wrap IIsWebAddress query");
265
266 hr = WcaWrapQuery(vcsWebBaseQuery, &pwzCustomActionData, efmcColumn2 | efmcColumn3 | efmcColumn4 | efmcColumn5 | efmcColumn7, 0xFFFFFFFF, 0xFFFFFFFF);
267 ExitOnFailure(hr, "Failed to wrap IIsWebBase query");
268 }
269 else
270 {
271 hr = WcaWrapEmptyQuery(&pwzCustomActionData);
272 ExitOnFailure(hr, "Failed to wrap IIsWebSite empty query");
273
274 hr = WcaWrapEmptyQuery(&pwzCustomActionData);
275 ExitOnFailure(hr, "Failed to wrap IIsWebAddress empty query");
276
277 hr = WcaWrapEmptyQuery(&pwzCustomActionData);
278 ExitOnFailure(hr, "Failed to wrap IIsWebBase empty query");
279 }
280
281 // Wrap vcsWebDirQuery to send to deferred CA
282 if (S_OK == WcaTableExists(L"IIsWebDir"))
283 {
284 hr = WcaWrapQuery(vcsWebDirQuery, &pwzCustomActionData, efmcColumn4, 3, 0xFFFFFFFF);
285 ExitOnFailure(hr, "Failed to wrap IIsWebDir query");
286 }
287 else
288 {
289 hr = WcaWrapEmptyQuery(&pwzCustomActionData);
290 ExitOnFailure(hr, "Failed to wrap IIsWebDir empty query");
291 }
292
293 // Wrap vcsVDirQuery to send to deferred CA
294 if (S_OK == WcaTableExists(L"IIsWebVirtualDir"))
295 {
296 hr = WcaWrapQuery(vcsVDirQuery, &pwzCustomActionData, efmcColumn4, 3, 5);
297 ExitOnFailure(hr, "Failed to wrap IIsWebVirtualDir query");
298 }
299 else
300 {
301 hr = WcaWrapEmptyQuery(&pwzCustomActionData);
302 ExitOnFailure(hr, "Failed to wrap IIsWebVirtualDir empty query");
303 }
304
305 // Wrap vcsFilterQuery to send to deferred CA
306 if (S_OK == WcaTableExists(L"IIsFilter"))
307 {
308 hr = WcaWrapQuery(vcsFilterQuery, &pwzCustomActionData, efmcColumn4 | efmcColumn5, 3, 0xFFFFFFFF);
309 ExitOnFailure(hr, "Failed to wrap IIsFilter query");
310 }
311 else
312 {
313 hr = WcaWrapEmptyQuery(&pwzCustomActionData);
314 ExitOnFailure(hr, "Failed to wrap IIsFilter empty query");
315 }
316
317 // Wrap vcsPropertyQuery to send to deferred CA
318 if (S_OK == WcaTableExists(L"IIsProperty"))
319 {
320 hr = WcaWrapQuery(vcsPropertyQuery, &pwzCustomActionData, efmcColumn4, 2, 0xFFFFFFFF);
321 ExitOnFailure(hr, "Failed to wrap IIsProperty query");
322 }
323 else
324 {
325 hr = WcaWrapEmptyQuery(&pwzCustomActionData);
326 ExitOnFailure(hr, "Failed to wrap IIsProperty empty query");
327 }
328
329 if (MSICONDITION_TRUE == ::MsiEvaluateConditionW(hInstall, USEIIS7CONDITION))
330 {
331 // This must remain trace only, CA data may contain password
332 WcaLog(LOGMSG_TRACEONLY, "Custom Action Data for ConfigureIIS7Exec will be: %ls", pwzCustomActionData);
333
334 hr = WcaDoDeferredAction(CUSTOM_ACTION_DECORATION(L"ConfigureIIs7Exec"), pwzCustomActionData, ConfigureIIsCost);
335 ExitOnFailure(hr, "Failed to schedule ConfigureIIs7Exec custom action");
336
337 ReleaseNullStr(pwzCustomActionData);
338
339 // Write the CaScript key to the ConfigureIIS custom action data
340 hr = WcaWriteStringToCaData(pwzScriptKey, &pwzCustomActionData);
341 ExitOnFailure(hr, "Failed to add script key to CustomActionData.");
342
343 hr = WcaDoDeferredAction(CUSTOM_ACTION_DECORATION(L"WriteIIS7ConfigChanges"), pwzCustomActionData, WriteIIS7ConfigChangesCost);
344 ExitOnFailure(hr, "Failed to schedule WriteMetabaseChanges custom action");
345 }
346 else
347 {
348 // This must remain trace only, CA data may contain password
349 WcaLog(LOGMSG_TRACEONLY, "Custom Action Data for ConfigureIISExec will be: %ls", pwzCustomActionData);
350
351 hr = WcaDoDeferredAction(CUSTOM_ACTION_DECORATION(L"ConfigureIIsExec"), pwzCustomActionData, ConfigureIIsCost);
352 ExitOnFailure(hr, "Failed to schedule ConfigureIISExec custom action");
353
354 ReleaseNullStr(pwzCustomActionData);
355
356 // Write the CaScript key to the ConfigureIIS custom action data
357 hr = WcaWriteStringToCaData(pwzScriptKey, &pwzCustomActionData);
358 ExitOnFailure(hr, "Failed to add script key to CustomActionData.");
359
360 hr = WcaDoDeferredAction(CUSTOM_ACTION_DECORATION(L"WriteMetabaseChanges"), pwzCustomActionData, WriteMetabaseChangesCost);
361 ExitOnFailure(hr, "Failed to schedule WriteMetabaseChanges custom action");
362 }
363
364LExit:
365 ReleaseStr(pwzScriptKey);
366 ReleaseStr(pwzBackupId);
367 ReleaseStr(pwzCustomActionData);
368
369 er = SUCCEEDED(hr) ? ERROR_SUCCESS : ERROR_INSTALL_FAILURE;
370 return WcaFinalize(er);
371}
372
373/********************************************************************
374ConfigureIIsExec - custom action for installing IIs settings - table
375data will be wrapped and passed in from immediate CA
376ReadIIsTables
377
378********************************************************************/
379extern "C" UINT __stdcall ConfigureIIsExec(
380 __in MSIHANDLE hInstall
381 )
382{
383 //AssertSz(FALSE, "debug ConfigureIIsExec here");
384 HRESULT hr = S_OK;
385 UINT er = ERROR_SUCCESS;
386
387 BOOL fInitializedCom = FALSE;
388 IMSAdminBase* piMetabase = NULL;
389
390 SCA_WEB* pswList = NULL;
391 SCA_WEBDIR* pswdList = NULL;
392 SCA_VDIR* psvdList = NULL;
393 SCA_FILTER* psfList = NULL;
394 SCA_APPPOOL *psapList = NULL;
395 SCA_MIMEMAP* psmmList = NULL;
396 SCA_HTTP_HEADER* pshhList = NULL;
397 SCA_PROPERTY *pspList = NULL;
398 SCA_WEBSVCEXT* psWseList = NULL;
399 SCA_WEB_ERROR* psweList = NULL;
400
401 LPWSTR pwzScriptKey = NULL;
402 LPWSTR pwzCustomActionData = NULL;
403
404 WCA_WRAPQUERY_HANDLE hUserQuery = NULL;
405 WCA_WRAPQUERY_HANDLE hWebBaseQuery = NULL;
406 WCA_WRAPQUERY_HANDLE hWebDirPropQuery = NULL;
407 WCA_WRAPQUERY_HANDLE hSslCertQuery = NULL;
408 WCA_WRAPQUERY_HANDLE hWebLogQuery = NULL;
409 WCA_WRAPQUERY_HANDLE hWebAppQuery = NULL;
410 WCA_WRAPQUERY_HANDLE hWebAppExtQuery = NULL;
411
412 // initialize
413 hr = WcaInitialize(hInstall, "ConfigureIIsExec");
414 ExitOnFailure(hr, "Failed to initialize");
415
416 hr = WcaGetProperty(L"CustomActionData", &pwzCustomActionData);
417 ExitOnFailure(hr, "failed to get CustomActionData");
418
419 // Get the CaScript key
420 hr = WcaReadStringFromCaData(&pwzCustomActionData, &pwzScriptKey);
421 ExitOnFailure(hr, "Failed to get CaScript key from custom action data");
422
423 hr = ::CoInitialize(NULL);
424 ExitOnFailure(hr, "failed to initialize COM");
425 fInitializedCom = TRUE;
426
427 // if IIS was uninstalled (thus no IID_IMSAdminBase) allow the
428 // user to still uninstall this package by clicking "Ignore"
429 do
430 {
431 hr = ::CoCreateInstance(CLSID_MSAdminBase, NULL, CLSCTX_ALL, IID_IMSAdminBase, (void**)&piMetabase);
432 if (FAILED(hr))
433 {
434 WcaLog(LOGMSG_STANDARD, "failed to get IID_IMSAdminBase Object");
435 er = WcaErrorMessage(msierrIISCannotConnect, hr, INSTALLMESSAGE_ERROR | MB_ABORTRETRYIGNORE, 0);
436 switch (er)
437 {
438 case IDABORT:
439 ExitFunction(); // bail with the error result from the CoCreate to kick off a rollback
440 case IDRETRY:
441 hr = S_FALSE; // hit me, baby, one more time
442 break;
443 case IDIGNORE:
444 __fallthrough;
445 default:
446 WcaLog(LOGMSG_STANDARD, "ignoring absent IIS");
447 // We need to write the empty script to communicate to other deferred CA that there is noting to do.
448 hr = ScaWriteConfigurationScript(pwzScriptKey);
449 ExitOnFailure(hr, "failed to schedule metabase configuration");
450
451 ExitFunction1(hr = S_OK); // pretend everything is okay
452 break;
453 }
454 }
455 } while (S_FALSE == hr);
456
457 // read the msi tables
458 hr = WcaBeginUnwrapQuery(&hUserQuery, &pwzCustomActionData);
459 ExitOnFailure(hr, "Failed to unwrap user query");
460
461 hr = ScaWebSvcExtRead(&psWseList, &pwzCustomActionData);
462 MessageExitOnFailure(hr, msierrIISFailedReadWebSvcExt, "failed while processing WebServiceExtensions");
463
464 hr = ScaAppPoolRead(&psapList, hUserQuery, &pwzCustomActionData);
465 MessageExitOnFailure(hr, msierrIISFailedReadAppPool, "failed while processing WebAppPools");
466
467 // MimeMap, Error and HttpHeader need to be read before the virtual directory and web read
468 hr = ScaMimeMapRead(&psmmList, &pwzCustomActionData);
469 MessageExitOnFailure(hr, msierrIISFailedReadMimeMap, "failed while processing MimeMaps");
470
471 hr = ScaHttpHeaderRead(&pshhList, &pwzCustomActionData);
472 MessageExitOnFailure(hr, msierrIISFailedReadHttpHeader, "failed while processing HttpHeaders");
473
474 hr = ScaWebErrorRead(&psweList, &pwzCustomActionData);
475 MessageExitOnFailure(hr, msierrIISFailedReadWebError, "failed while processing WebErrors");
476
477 hr = WcaBeginUnwrapQuery(&hWebDirPropQuery, &pwzCustomActionData);
478 ExitOnFailure(hr, "Failed to unwrap web dir properties query");
479
480 hr = WcaBeginUnwrapQuery(&hSslCertQuery, &pwzCustomActionData);
481 ExitOnFailure(hr, "Failed to unwrap ssl certificate query");
482
483 hr = WcaBeginUnwrapQuery(&hWebLogQuery, &pwzCustomActionData);
484 ExitOnFailure(hr, "Failed to unwrap web log query");
485
486 hr = WcaBeginUnwrapQuery(&hWebAppQuery, &pwzCustomActionData);
487 ExitOnFailure(hr, "Failed to unwrap web application query");
488
489 hr = WcaBeginUnwrapQuery(&hWebAppExtQuery, &pwzCustomActionData);
490 ExitOnFailure(hr, "Failed to unwrap web application extension query");
491
492 hr = ScaWebsRead(piMetabase, &psmmList, &pswList, &pshhList, &psweList, hUserQuery, hWebDirPropQuery, hSslCertQuery, hWebLogQuery, hWebAppQuery, hWebAppExtQuery, &pwzCustomActionData);
493 MessageExitOnFailure(hr, msierrIISFailedReadWebSite, "failed while processing WebSites");
494
495 hr = WcaBeginUnwrapQuery(&hWebBaseQuery, &pwzCustomActionData);
496 ExitOnFailure(hr, "Failed to unwrap web base query");
497
498 hr = ScaWebDirsRead(piMetabase, pswList, hUserQuery, hWebBaseQuery, hWebDirPropQuery, hWebAppQuery, hWebAppExtQuery, &pwzCustomActionData, &pswdList);
499 MessageExitOnFailure(hr, msierrIISFailedReadWebDirs, "failed while processing WebDirs");
500
501 hr = ScaVirtualDirsRead(piMetabase, pswList, &psvdList, &psmmList, &pshhList, &psweList, hUserQuery, hWebBaseQuery, hWebDirPropQuery, hWebAppQuery, hWebAppExtQuery, &pwzCustomActionData);
502 MessageExitOnFailure(hr, msierrIISFailedReadVDirs, "failed while processing WebVirtualDirs");
503
504 hr = ScaFiltersRead(piMetabase, pswList, hWebBaseQuery, &psfList, &pwzCustomActionData);
505 MessageExitOnFailure(hr, msierrIISFailedReadFilters, "failed while processing WebFilters");
506
507 hr = ScaPropertyRead(&pspList, &pwzCustomActionData);
508 MessageExitOnFailure(hr, msierrIISFailedReadProp, "failed while processing WebProperties");
509
510 // do uninstall actions (order is important!)
511 hr = ScaPropertyUninstall(piMetabase, pspList);
512 MessageExitOnFailure(hr, msierrIISFailedSchedUninstallProp, "failed to uninstall IIS properties");
513
514 hr = ScaFiltersUninstall(piMetabase, psfList);
515 MessageExitOnFailure(hr, msierrIISFailedSchedUninstallFilters, "failed to schedule uninstall of filters");
516
517 hr = ScaVirtualDirsUninstall(piMetabase, psvdList);
518 MessageExitOnFailure(hr, msierrIISFailedSchedUninstallVDirs, "failed to schedule uninstall of virtual directories");
519
520 hr = ScaWebDirsUninstall(piMetabase, pswdList);
521 MessageExitOnFailure(hr, msierrIISFailedSchedUninstallWebDirs, "failed to schedule uninstall of web directories");
522
523 hr = ScaWebsUninstall(piMetabase, pswList);
524 MessageExitOnFailure(hr, msierrIISFailedSchedUninstallWebs, "failed to schedule uninstall of webs");
525
526 hr = ScaAppPoolUninstall(piMetabase, psapList);
527 MessageExitOnFailure(hr, msierrIISFailedSchedUninstallAppPool, "failed to schedule uninstall of AppPools");
528
529
530 // do install actions (order is important!)
531 // ScaWebSvcExtCommit contains both uninstall and install actions.
532 hr = ScaWebSvcExtCommit(piMetabase, psWseList);
533 MessageExitOnFailure(hr, msierrIISFailedSchedInstallWebSvcExt, "failed to schedule install/uninstall of WebSvcExt");
534
535 hr = ScaAppPoolInstall(piMetabase, psapList);
536 MessageExitOnFailure(hr, msierrIISFailedSchedInstallAppPool, "failed to schedule install of AppPools");
537
538 hr = ScaWebsInstall(piMetabase, pswList, psapList);
539 MessageExitOnFailure(hr, msierrIISFailedSchedInstallWebs, "failed to schedule install of webs");
540
541 hr = ScaWebDirsInstall(piMetabase, pswdList, psapList);
542 MessageExitOnFailure(hr, msierrIISFailedSchedInstallWebDirs, "failed to schedule install of web directories");
543
544 hr = ScaVirtualDirsInstall(piMetabase, psvdList, psapList);
545 MessageExitOnFailure(hr, msierrIISFailedSchedInstallVDirs, "failed to schedule install of virtual directories");
546
547 hr = ScaFiltersInstall(piMetabase, psfList);
548 MessageExitOnFailure(hr, msierrIISFailedSchedInstallFilters, "failed to schedule install of filters");
549
550 hr = ScaPropertyInstall(piMetabase, pspList);
551 MessageExitOnFailure(hr, msierrIISFailedSchedInstallProp, "failed to schedule install of properties");
552
553 hr = ScaWriteConfigurationScript(pwzScriptKey);
554 ExitOnFailure(hr, "failed to schedule metabase configuration");
555
556LExit:
557 ReleaseStr(pwzScriptKey);
558 ReleaseStr(pwzCustomActionData);
559
560 WcaFinishUnwrapQuery(hUserQuery);
561 WcaFinishUnwrapQuery(hWebBaseQuery);
562 WcaFinishUnwrapQuery(hWebDirPropQuery);
563 WcaFinishUnwrapQuery(hSslCertQuery);
564 WcaFinishUnwrapQuery(hWebLogQuery);
565 WcaFinishUnwrapQuery(hWebAppQuery);
566 WcaFinishUnwrapQuery(hWebAppExtQuery);
567
568 if (psWseList)
569 {
570 ScaWebSvcExtFreeList(psWseList);
571 }
572
573 if (psfList)
574 {
575 ScaFiltersFreeList(psfList);
576 }
577
578 if (psvdList)
579 {
580 ScaVirtualDirsFreeList(psvdList);
581 }
582
583 if (pswdList)
584 {
585 ScaWebDirsFreeList(pswdList);
586 }
587
588 if (pswList)
589 {
590 ScaWebsFreeList(pswList);
591 }
592
593 if (psmmList)
594 {
595 ScaMimeMapCheckList(psmmList);
596 ScaMimeMapFreeList(psmmList);
597 }
598
599 if (pshhList)
600 {
601 ScaHttpHeaderCheckList(pshhList);
602 ScaHttpHeaderFreeList(pshhList);
603 }
604
605 if (psweList)
606 {
607 ScaWebErrorCheckList(psweList);
608 ScaWebErrorFreeList(psweList);
609 }
610
611 ReleaseObject(piMetabase);
612
613 if (fInitializedCom)
614 {
615 ::CoUninitialize();
616 }
617
618 er = SUCCEEDED(hr) ? ERROR_SUCCESS : ERROR_INSTALL_FAILURE;
619 return WcaFinalize(er);
620}
621
622
623/********************************************************************
624ConfigureIIs - CUSTOM ACTION ENTRY POINT for installing IIs settings
625
626********************************************************************/
627extern "C" UINT __stdcall ConfigureIIs7Exec(
628 __in MSIHANDLE hInstall
629 )
630{
631 //AssertSz(FALSE, "debug ConfigureIIs7Exec here");
632 HRESULT hr = S_OK;
633 UINT er = ERROR_SUCCESS;
634
635 LPWSTR pwzScriptKey = NULL;
636 LPWSTR pwzCustomActionData = NULL;
637
638 SCA_WEB7* pswList = NULL;
639 SCA_WEBDIR7* pswdList = NULL;
640 SCA_VDIR7* psvdList = NULL;
641 SCA_FILTER* psfList = NULL;
642 SCA_APPPOOL *psapList = NULL;
643 SCA_MIMEMAP* psmmList = NULL;
644 SCA_HTTP_HEADER* pshhList = NULL;
645 SCA_PROPERTY *pspList = NULL;
646 SCA_WEBSVCEXT* psWseList = NULL;
647 SCA_WEB_ERROR* psweList = NULL;
648
649 WCA_WRAPQUERY_HANDLE hUserQuery = NULL;
650 WCA_WRAPQUERY_HANDLE hWebBaseQuery = NULL;
651 WCA_WRAPQUERY_HANDLE hWebDirPropQuery = NULL;
652 WCA_WRAPQUERY_HANDLE hSslCertQuery = NULL;
653 WCA_WRAPQUERY_HANDLE hWebLogQuery = NULL;
654 WCA_WRAPQUERY_HANDLE hWebAppQuery = NULL;
655 WCA_WRAPQUERY_HANDLE hWebAppExtQuery = NULL;
656
657 // initialize
658 hr = WcaInitialize(hInstall, "ConfigureIIs7Exec");
659 ExitOnFailure(hr, "Failed to initialize");
660
661 hr = WcaGetProperty(L"CustomActionData", &pwzCustomActionData);
662 ExitOnFailure(hr, "failed to get CustomActionData");
663
664 // Get the CaScript key
665 hr = WcaReadStringFromCaData(&pwzCustomActionData, &pwzScriptKey);
666 ExitOnFailure(hr, "Failed to get CaScript key from custom action data");
667
668 // read the msi tables
669 hr = WcaBeginUnwrapQuery(&hUserQuery, &pwzCustomActionData);
670 ExitOnFailure(hr, "Failed to unwrap user query");
671
672 hr = ScaWebSvcExtRead(&psWseList, &pwzCustomActionData);
673 MessageExitOnFailure(hr, msierrIISFailedReadWebSvcExt, "failed while processing WebServiceExtensions");
674
675 hr = ScaAppPoolRead(&psapList, hUserQuery, &pwzCustomActionData);
676 MessageExitOnFailure(hr, msierrIISFailedReadAppPool, "failed while processing WebAppPools");
677
678 // MimeMap, Error and HttpHeader need to be read before the virtual directory and web read
679 hr = ScaMimeMapRead(&psmmList, &pwzCustomActionData);
680 MessageExitOnFailure(hr, msierrIISFailedReadMimeMap, "failed while processing MimeMaps");
681
682 hr = ScaHttpHeaderRead(&pshhList, &pwzCustomActionData);
683 MessageExitOnFailure(hr, msierrIISFailedReadHttpHeader, "failed while processing HttpHeaders");
684
685 hr = ScaWebErrorRead(&psweList, &pwzCustomActionData);
686 MessageExitOnFailure(hr, msierrIISFailedReadWebError, "failed while processing WebErrors");
687
688 hr = WcaBeginUnwrapQuery(&hWebDirPropQuery, &pwzCustomActionData);
689 ExitOnFailure(hr, "Failed to unwrap web dir properties query");
690
691 hr = WcaBeginUnwrapQuery(&hSslCertQuery, &pwzCustomActionData);
692 ExitOnFailure(hr, "Failed to unwrap ssl certificate query");
693
694 hr = WcaBeginUnwrapQuery(&hWebLogQuery, &pwzCustomActionData);
695 ExitOnFailure(hr, "Failed to unwrap web log query");
696
697 hr = WcaBeginUnwrapQuery(&hWebAppQuery, &pwzCustomActionData);
698 ExitOnFailure(hr, "Failed to unwrap web application query");
699
700 hr = WcaBeginUnwrapQuery(&hWebAppExtQuery, &pwzCustomActionData);
701 ExitOnFailure(hr, "Failed to unwrap web application extension query");
702
703 hr = ScaWebsRead7(&pswList, &pshhList, &psweList, hUserQuery, hWebDirPropQuery, hSslCertQuery, hWebLogQuery, hWebAppQuery, hWebAppExtQuery, &pwzCustomActionData);
704 MessageExitOnFailure(hr, msierrIISFailedReadWebSite, "failed while processing WebSites");
705
706 hr = WcaBeginUnwrapQuery(&hWebBaseQuery, &pwzCustomActionData);
707 ExitOnFailure(hr, "Failed to unwrap web base query");
708
709 hr = ScaWebDirsRead7(pswList, hUserQuery, hWebBaseQuery, hWebDirPropQuery, hWebAppQuery, hWebAppExtQuery, &pwzCustomActionData, &pswdList);
710 MessageExitOnFailure(hr, msierrIISFailedReadWebDirs, "failed while processing WebDirs");
711
712 hr = ScaVirtualDirsRead7(pswList, &psvdList, &psmmList, &pshhList, &psweList, hUserQuery, hWebBaseQuery, hWebDirPropQuery, hWebAppQuery, hWebAppExtQuery, &pwzCustomActionData);
713 MessageExitOnFailure(hr, msierrIISFailedReadVDirs, "failed while processing WebVirtualDirs");
714
715 hr = ScaFiltersRead7(pswList, hWebBaseQuery, &psfList, &pwzCustomActionData);
716 MessageExitOnFailure(hr, msierrIISFailedReadFilters, "failed while processing WebFilters");
717
718 hr = ScaPropertyRead(&pspList, &pwzCustomActionData);
719 MessageExitOnFailure(hr, msierrIISFailedReadProp, "failed while processing WebProperties");
720
721 // do uninstall actions (order is important!)
722 hr = ScaPropertyUninstall7(pspList);
723 MessageExitOnFailure(hr, msierrIISFailedSchedUninstallProp, "failed to uninstall IIS properties");
724
725 hr = ScaFiltersUninstall7(psfList);
726 MessageExitOnFailure(hr, msierrIISFailedSchedUninstallFilters, "failed to schedule uninstall of filters");
727
728 hr = ScaVirtualDirsUninstall7(psvdList);
729 MessageExitOnFailure(hr, msierrIISFailedSchedUninstallVDirs, "failed to schedule uninstall of virtual directories");
730
731 hr = ScaWebDirsUninstall7(pswdList);
732 MessageExitOnFailure(hr, msierrIISFailedSchedUninstallWebDirs, "failed to schedule uninstall of web directories");
733
734 hr = ScaWebsUninstall7(pswList);
735 MessageExitOnFailure(hr, msierrIISFailedSchedUninstallWebs, "failed to schedule uninstall of webs");
736
737 hr = ScaAppPoolUninstall7(psapList);
738 MessageExitOnFailure(hr, msierrIISFailedSchedUninstallAppPool, "failed to schedule uninstall of AppPools");
739
740
741 // do install actions (order is important!)
742 // ScaWebSvcExtCommit contains both uninstall and install actions.
743 hr = ScaWebSvcExtCommit7(psWseList);
744 MessageExitOnFailure(hr, msierrIISFailedSchedInstallWebSvcExt, "failed to schedule install/uninstall of WebSvcExt");
745
746 hr = ScaAppPoolInstall7(psapList);
747 MessageExitOnFailure(hr, msierrIISFailedSchedInstallAppPool, "failed to schedule install of AppPools");
748
749 hr = ScaWebsInstall7(pswList, psapList);
750 MessageExitOnFailure(hr, msierrIISFailedSchedInstallWebs, "failed to schedule install of webs");
751
752 hr = ScaWebDirsInstall7(pswdList, psapList);
753 MessageExitOnFailure(hr, msierrIISFailedSchedInstallWebDirs, "failed to schedule install of web directories");
754
755 hr = ScaVirtualDirsInstall7(psvdList, psapList);
756 MessageExitOnFailure(hr, msierrIISFailedSchedInstallVDirs, "failed to schedule install of virtual directories");
757
758 hr = ScaFiltersInstall7(psfList);
759 MessageExitOnFailure(hr, msierrIISFailedSchedInstallFilters, "failed to schedule install of filters");
760
761 hr = ScaPropertyInstall7(pspList);
762 MessageExitOnFailure(hr, msierrIISFailedSchedInstallProp, "failed to schedule install of properties");
763
764 hr = ScaWriteConfigurationScript(pwzScriptKey);
765 ExitOnFailure(hr, "failed to schedule metabase configuration");
766
767LExit:
768 ReleaseNullStr(pwzScriptKey);
769 ReleaseNullStr(pwzCustomActionData);
770
771 WcaFinishUnwrapQuery(hUserQuery);
772 WcaFinishUnwrapQuery(hWebBaseQuery);
773 WcaFinishUnwrapQuery(hWebDirPropQuery);
774 WcaFinishUnwrapQuery(hSslCertQuery);
775 WcaFinishUnwrapQuery(hWebLogQuery);
776 WcaFinishUnwrapQuery(hWebAppQuery);
777 WcaFinishUnwrapQuery(hWebAppExtQuery);
778
779 if (psWseList)
780 {
781 ScaWebSvcExtFreeList(psWseList);
782 }
783
784 if (psfList)
785 {
786 ScaFiltersFreeList(psfList);
787 }
788
789 if (psvdList)
790 {
791 ScaVirtualDirsFreeList7(psvdList);
792 }
793
794 if (pswdList)
795 {
796 ScaWebDirsFreeList7(pswdList);
797 }
798
799 if (pswList)
800 {
801 ScaWebsFreeList7(pswList);
802 }
803
804 if (psmmList)
805 {
806 ScaMimeMapFreeList(psmmList);
807 }
808
809 if (pshhList)
810 {
811 ScaHttpHeaderCheckList(pshhList);
812 ScaHttpHeaderFreeList(pshhList);
813 }
814
815 if (psweList)
816 {
817 ScaWebErrorCheckList(psweList);
818 ScaWebErrorFreeList(psweList);
819 }
820
821 er = SUCCEEDED(hr) ? ERROR_SUCCESS : ERROR_INSTALL_FAILURE;
822 return WcaFinalize(er);
823}
diff --git a/src/ext/Iis/ca/scassl.cpp b/src/ext/Iis/ca/scassl.cpp
new file mode 100644
index 00000000..4a06b77e
--- /dev/null
+++ b/src/ext/Iis/ca/scassl.cpp
@@ -0,0 +1,115 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3#include "precomp.h"
4
5enum eSslCertificateQuery { scqStoreName = 1, scqHash, scqWeb };
6
7static HRESULT AddSslCertificateToList(
8 __in SCA_WEB_SSL_CERTIFICATE** ppswscList
9 );
10
11
12HRESULT ScaSslCertificateRead(
13 __in LPCWSTR wzWebId,
14 __in WCA_WRAPQUERY_HANDLE hSslCertQuery,
15 __inout SCA_WEB_SSL_CERTIFICATE** ppswscList
16 )
17{
18 HRESULT hr = S_OK;
19
20 MSIHANDLE hRec;
21 SCA_WEB_SSL_CERTIFICATE* pswsc = NULL;
22 LPWSTR pwzData = NULL;
23
24 WcaFetchWrappedReset(hSslCertQuery);
25
26 // Get the certificate information.
27 while (S_OK == (hr = WcaFetchWrappedRecordWhereString(hSslCertQuery, scqWeb, wzWebId, &hRec)))
28 {
29 hr = AddSslCertificateToList(ppswscList);
30 ExitOnFailure(hr, "failed to add ssl certificate to list");
31
32 pswsc = *ppswscList;
33
34 hr = WcaGetRecordString(hRec, scqStoreName, &pwzData);
35 ExitOnFailure(hr, "Failed to get web ssl certificate store name.");
36
37 hr = ::StringCchCopyW(pswsc->wzStoreName, countof(pswsc->wzStoreName), pwzData);
38 ExitOnFailure(hr, "Failed to copy web ssl certificate store name.");
39
40 hr = WcaGetRecordString(hRec, scqHash, &pwzData);
41 ExitOnFailure(hr, "Failed to get hash for web ssl certificate.");
42
43 hr = StrHexDecode(pwzData, pswsc->rgbSHA1Hash, countof(pswsc->rgbSHA1Hash));
44 ExitOnFailure(hr, "Failed to decode certificate hash for web: %ls, data: %ls", wzWebId, pwzData);
45 }
46
47 if (E_NOMOREITEMS == hr)
48 {
49 hr = S_OK;
50 }
51 ExitOnFailure(hr, "Failed to read IIsWebSiteCertificates table.");
52
53LExit:
54 ReleaseStr(pwzData);
55 return hr;
56}
57
58
59HRESULT ScaSslCertificateWriteMetabase(
60 __in IMSAdminBase* piMetabase,
61 __in LPCWSTR wzWebBase,
62 __in SCA_WEB_SSL_CERTIFICATE* pswscList
63 )
64{
65 HRESULT hr = S_OK;
66 BLOB blob;
67
68 for (SCA_WEB_SSL_CERTIFICATE* pswsc = pswscList; pswsc; pswsc = pswsc->pNext)
69 {
70 // Write: /W3SVC/1:SslCertStoreName = "MY", "CA", "Root", etc.
71 hr = ScaWriteMetabaseValue(piMetabase, wzWebBase, L"", MD_SSL_CERT_STORE_NAME, METADATA_INHERIT, IIS_MD_UT_SERVER, STRING_METADATA, static_cast<LPVOID>(pswsc->wzStoreName));
72 ExitOnFailure(hr, "Failed to write SslCertStoreName");
73
74 // Write: /W3SVC/1:SslCertHash = <blob>
75 blob.pBlobData = pswsc->rgbSHA1Hash;
76 blob.cbSize = countof(pswsc->rgbSHA1Hash);
77 hr = ScaWriteMetabaseValue(piMetabase, wzWebBase, L"", MD_SSL_CERT_HASH, METADATA_INHERIT, IIS_MD_UT_SERVER, BINARY_METADATA, static_cast<LPVOID>(&blob));
78 ExitOnFailure(hr, "Failed to write SslCertHash");
79 }
80
81LExit:
82 return hr;
83}
84
85
86void ScaSslCertificateFreeList(
87 __in SCA_WEB_SSL_CERTIFICATE* pswscList
88 )
89{
90 SCA_WEB_SSL_CERTIFICATE* pswscDelete = pswscList;
91 while (pswscList)
92 {
93 pswscDelete = pswscList;
94 pswscList = pswscList->pNext;
95
96 MemFree(pswscDelete);
97 }
98}
99
100
101static HRESULT AddSslCertificateToList(
102 __in SCA_WEB_SSL_CERTIFICATE** ppswscList
103 )
104{
105 HRESULT hr = S_OK;
106
107 SCA_WEB_SSL_CERTIFICATE* pswsc = static_cast<SCA_WEB_SSL_CERTIFICATE*>(MemAlloc(sizeof(SCA_WEB_SSL_CERTIFICATE), TRUE));
108 ExitOnNull(pswsc, hr, E_OUTOFMEMORY, "failed to allocate memory for new SSL certificate list element");
109
110 pswsc->pNext = *ppswscList;
111 *ppswscList = pswsc;
112
113LExit:
114 return hr;
115}
diff --git a/src/ext/Iis/ca/scassl.h b/src/ext/Iis/ca/scassl.h
new file mode 100644
index 00000000..df7c473d
--- /dev/null
+++ b/src/ext/Iis/ca/scassl.h
@@ -0,0 +1,36 @@
1#pragma once
2// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
3
4
5#define MD_SSL_CERT_HASH ( IIS_MD_SSL_BASE+6 )
6#define MD_SSL_CERT_STORE_NAME ( IIS_MD_SSL_BASE+11 )
7//#define WIDE(x) WIDE2(x)
8//#define WIDE2(x) L ## x
9
10
11// structs
12struct SCA_WEB_SSL_CERTIFICATE
13{
14 WCHAR wzStoreName[65];
15 BYTE rgbSHA1Hash[CB_CERTIFICATE_HASH];
16
17 SCA_WEB_SSL_CERTIFICATE* pNext;
18};
19
20
21// prototypes
22HRESULT ScaSslCertificateRead(
23 __in LPCWSTR wzWebId,
24 __in WCA_WRAPQUERY_HANDLE hSslCertQuery,
25 __inout SCA_WEB_SSL_CERTIFICATE** ppswscList
26 );
27
28HRESULT ScaSslCertificateWriteMetabase(
29 __in IMSAdminBase* piMetabase,
30 __in LPCWSTR wzWebBase,
31 __in SCA_WEB_SSL_CERTIFICATE* pswscList
32 );
33
34void ScaSslCertificateFreeList(
35 __in SCA_WEB_SSL_CERTIFICATE* pswscList
36 );
diff --git a/src/ext/Iis/ca/scassl7.cpp b/src/ext/Iis/ca/scassl7.cpp
new file mode 100644
index 00000000..47c16a9d
--- /dev/null
+++ b/src/ext/Iis/ca/scassl7.cpp
@@ -0,0 +1,34 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3#include "precomp.h"
4
5HRESULT ScaSslCertificateWrite7(
6 __in_z LPCWSTR wzWebBase,
7 __in SCA_WEB_SSL_CERTIFICATE* pswscList
8 )
9{
10 HRESULT hr = S_OK;
11 WCHAR wzEncodedCertificateHash[CB_CERTIFICATE_HASH * 2 + 1] = { 0 };
12
13 for (SCA_WEB_SSL_CERTIFICATE* pswsc = pswscList; pswsc; pswsc = pswsc->pNext)
14 {
15 hr = ScaWriteConfigID(IIS_SSL_BINDING);
16 ExitOnFailure(hr, "Failed write SSL binding ID");
17 hr = ScaWriteConfigID(IIS_CREATE); // Need to determine site action
18 ExitOnFailure(hr, "Failed write binding action");
19
20 hr = ScaWriteConfigString(wzWebBase); //site name key
21 ExitOnFailure(hr, "Failed to write SSL website");
22 hr = ScaWriteConfigString(pswsc->wzStoreName); //ssl store name
23 ExitOnFailure(hr, "Failed to write SSL store name");
24
25 hr = StrHexEncode(pswsc->rgbSHA1Hash, countof(pswsc->rgbSHA1Hash), wzEncodedCertificateHash, countof(wzEncodedCertificateHash));
26 ExitOnFailure(hr, "Failed to encode SSL hash");
27
28 hr = ScaWriteConfigString(wzEncodedCertificateHash); //ssl hash
29 ExitOnFailure(hr, "Failed to write SSL hash");
30 }
31LExit:
32
33 return hr;
34}
diff --git a/src/ext/Iis/ca/scassl7.h b/src/ext/Iis/ca/scassl7.h
new file mode 100644
index 00000000..1a4b09af
--- /dev/null
+++ b/src/ext/Iis/ca/scassl7.h
@@ -0,0 +1,8 @@
1#pragma once
2// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
3
4
5HRESULT ScaSslCertificateWrite7(
6 __in_z LPCWSTR wzWebBase,
7 __in SCA_WEB_SSL_CERTIFICATE* pswscList
8 );
diff --git a/src/ext/Iis/ca/scauser.cpp b/src/ext/Iis/ca/scauser.cpp
new file mode 100644
index 00000000..0b99edff
--- /dev/null
+++ b/src/ext/Iis/ca/scauser.cpp
@@ -0,0 +1,91 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3#include "precomp.h"
4
5LPCWSTR vcsUserQuery = L"SELECT `User`, `Component_`, `Name`, `Domain`, `Password` FROM `User` WHERE `User`=?";
6enum eUserQuery { vuqUser = 1, vuqComponent, vuqName, vuqDomain, vuqPassword };
7
8LPCWSTR vcsGroupQuery = L"SELECT `Group`, `Component_`, `Name`, `Domain` FROM `Group` WHERE `Group`=?";
9enum eGroupQuery { vgqGroup = 1, vgqComponent, vgqName, vgqDomain };
10
11LPCWSTR vcsUserGroupQuery = L"SELECT `User_`, `Group_` FROM `UserGroup` WHERE `User_`=?";
12enum eUserGroupQuery { vugqUser = 1, vugqGroup };
13
14LPCWSTR vActionableQuery = L"SELECT `User`,`Component_`,`Name`,`Domain`,`Password`,`Attributes` FROM `User` WHERE `Component_` IS NOT NULL";
15enum eActionableQuery { vaqUser = 1, vaqComponent, vaqName, vaqDomain, vaqPassword, vaqAttributes };
16
17HRESULT __stdcall ScaGetUserDeferred(
18 __in LPCWSTR wzUser,
19 __in WCA_WRAPQUERY_HANDLE hUserQuery,
20 __out SCA_USER* pscau
21 )
22{
23 if (!wzUser || !pscau)
24 {
25 return E_INVALIDARG;
26 }
27
28 HRESULT hr = S_OK;
29 MSIHANDLE hRec, hRecTest;
30
31 LPWSTR pwzData = NULL;
32
33 // clear struct and bail right away if no user key was passed to search for
34 ::ZeroMemory(pscau, sizeof(*pscau));
35 if (!*wzUser)
36 {
37 ExitFunction1(hr = S_OK);
38 }
39
40 // Reset back to the first record
41 WcaFetchWrappedReset(hUserQuery);
42
43 hr = WcaFetchWrappedRecordWhereString(hUserQuery, vuqUser, wzUser, &hRec);
44 if (S_OK == hr)
45 {
46 hr = WcaFetchWrappedRecordWhereString(hUserQuery, vuqUser, wzUser, &hRecTest);
47 if (S_OK == hr)
48 {
49 AssertSz(FALSE, "Found multiple matching User rows");
50 }
51
52 hr = WcaGetRecordString(hRec, vuqUser, &pwzData);
53 ExitOnFailure(hr, "Failed to get User.User");
54 hr = ::StringCchCopyW(pscau->wzKey, countof(pscau->wzKey), pwzData);
55 ExitOnFailure(hr, "Failed to copy key string to user object (in deferred CA)");
56
57 hr = WcaGetRecordString(hRec, vuqComponent, &pwzData);
58 ExitOnFailure(hr, "Failed to get User.Component_");
59 hr = ::StringCchCopyW(pscau->wzComponent, countof(pscau->wzComponent), pwzData);
60 ExitOnFailure(hr, "Failed to copy component string to user object (in deferred CA)");
61
62 hr = WcaGetRecordString(hRec, vuqName, &pwzData);
63 ExitOnFailure(hr, "Failed to get User.Name");
64 hr = ::StringCchCopyW(pscau->wzName, countof(pscau->wzName), pwzData);
65 ExitOnFailure(hr, "Failed to copy name string to user object (in deferred CA)");
66
67 hr = WcaGetRecordString(hRec, vuqDomain, &pwzData);
68 ExitOnFailure(hr, "Failed to get User.Domain");
69 hr = ::StringCchCopyW(pscau->wzDomain, countof(pscau->wzDomain), pwzData);
70 ExitOnFailure(hr, "Failed to copy domain string to user object (in deferred CA)");
71
72 hr = WcaGetRecordString(hRec, vuqPassword, &pwzData);
73 ExitOnFailure(hr, "Failed to get User.Password");
74 hr = ::StringCchCopyW(pscau->wzPassword, countof(pscau->wzPassword), pwzData);
75 ExitOnFailure(hr, "Failed to copy password string to user object (in deferred CA)");
76 }
77 else if (E_NOMOREITEMS == hr)
78 {
79 WcaLog(LOGMSG_STANDARD, "Error: Cannot locate User.User='%ls'", wzUser);
80 hr = E_FAIL;
81 }
82 else
83 {
84 ExitOnFailure(hr, "Error fetching single User row");
85 }
86
87LExit:
88 ReleaseStr(pwzData);
89
90 return hr;
91}
diff --git a/src/ext/Iis/ca/scauser.h b/src/ext/Iis/ca/scauser.h
new file mode 100644
index 00000000..b2b94650
--- /dev/null
+++ b/src/ext/Iis/ca/scauser.h
@@ -0,0 +1,39 @@
1#pragma once
2// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
3
4// structs
5struct SCA_GROUP
6{
7 WCHAR wzKey[MAX_DARWIN_KEY + 1];
8 WCHAR wzComponent[MAX_DARWIN_KEY + 1];
9
10 WCHAR wzDomain[MAX_DARWIN_COLUMN + 1];
11 WCHAR wzName[MAX_DARWIN_COLUMN + 1];
12
13 SCA_GROUP *psgNext;
14};
15
16struct SCA_USER
17{
18 WCHAR wzKey[MAX_DARWIN_KEY + 1];
19 WCHAR wzComponent[MAX_DARWIN_KEY + 1];
20 INSTALLSTATE isInstalled;
21 INSTALLSTATE isAction;
22
23 WCHAR wzDomain[MAX_DARWIN_COLUMN + 1];
24 WCHAR wzName[MAX_DARWIN_COLUMN + 1];
25 WCHAR wzPassword[MAX_DARWIN_COLUMN + 1];
26 INT iAttributes;
27
28 SCA_GROUP *psgGroups;
29
30 SCA_USER *psuNext;
31};
32
33
34// prototypes
35HRESULT __stdcall ScaGetUserDeferred(
36 __in LPCWSTR wzUser,
37 __in WCA_WRAPQUERY_HANDLE hUserQuery,
38 __out SCA_USER* pscau
39 );
diff --git a/src/ext/Iis/ca/scavdir.cpp b/src/ext/Iis/ca/scavdir.cpp
new file mode 100644
index 00000000..d388ce97
--- /dev/null
+++ b/src/ext/Iis/ca/scavdir.cpp
@@ -0,0 +1,331 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3#include "precomp.h"
4
5// prototypes
6static HRESULT AddVirtualDirToList(
7 __in SCA_VDIR** psvdList
8 );
9
10
11HRESULT __stdcall ScaVirtualDirsRead(
12 __in IMSAdminBase* piMetabase,
13 __in SCA_WEB* pswList,
14 __in SCA_VDIR** ppsvdList,
15 __in SCA_MIMEMAP** ppsmmList,
16 __in SCA_HTTP_HEADER** ppshhList,
17 __in SCA_WEB_ERROR** ppsweList,
18 __in WCA_WRAPQUERY_HANDLE hUserQuery,
19 __in WCA_WRAPQUERY_HANDLE hWebBaseQuery,
20 __in WCA_WRAPQUERY_HANDLE hWebDirPropQuery,
21 __in WCA_WRAPQUERY_HANDLE hWebAppQuery,
22 __in WCA_WRAPQUERY_HANDLE hWebAppExtQuery,
23 __inout LPWSTR *ppwzCustomActionData
24 )
25{
26 Assert(piMetabase && ppsvdList);
27
28 HRESULT hr = S_OK;
29 MSIHANDLE hRec;
30 INSTALLSTATE isInstalled = INSTALLSTATE_UNKNOWN;
31 INSTALLSTATE isAction = INSTALLSTATE_UNKNOWN;
32
33 SCA_VDIR* pvdir = NULL;
34 LPWSTR pwzData = NULL;
35
36 WCA_WRAPQUERY_HANDLE hWrapQuery = NULL;
37
38 hr = WcaBeginUnwrapQuery(&hWrapQuery, ppwzCustomActionData);
39 ExitOnFailure(hr, "Failed to unwrap query for ScaAppPoolRead");
40
41 if (0 == WcaGetQueryRecords(hWrapQuery))
42 {
43 WcaLog(LOGMSG_VERBOSE, "Skipping ScaVirtualDirsRead() because IIsWebVirtualDir table not present");
44 ExitFunction1(hr = S_FALSE);
45 }
46
47 // loop through all the vdirs
48 while (S_OK == (hr = WcaFetchWrappedRecord(hWrapQuery, &hRec)))
49 {
50 // Get the Component first. If there is a Component and it is not being modified during
51 // this transaction, skip processing this whole record.
52 hr = WcaGetRecordString(hRec, vdqComponent, &pwzData);
53 ExitOnFailure(hr, "failed to get IIsWebVirtualDir.Component");
54
55 hr = WcaGetRecordInteger(hRec, vdqInstalled, (int *)&isInstalled);
56 ExitOnFailure(hr, "Failed to get Component installed state for virtual dir");
57
58 hr = WcaGetRecordInteger(hRec, vdqAction, (int *)&isAction);
59 ExitOnFailure(hr, "Failed to get Component action state for virtual dir");
60
61 if (!WcaIsInstalling(isInstalled, isAction) &&
62 !WcaIsReInstalling(isInstalled, isAction) &&
63 !WcaIsUninstalling(isInstalled, isAction))
64 {
65 continue; // skip this record.
66 }
67
68 hr = AddVirtualDirToList(ppsvdList);
69 ExitOnFailure(hr, "failed to add virtual dir to list");
70
71 pvdir = *ppsvdList;
72
73 hr = ::StringCchCopyW(pvdir->wzComponent, countof(pvdir->wzComponent), pwzData);
74 ExitOnFailure(hr, "failed to copy component name: %ls", pwzData);
75
76 pvdir->isInstalled = isInstalled;
77 pvdir->isAction = isAction;
78
79 // get the web key
80 hr = WcaGetRecordString(hRec, vdqWeb, &pwzData);
81 ExitOnFailure(hr, "Failed to get Web for VirtualDir");
82
83 hr = ScaWebsGetBase(piMetabase, pswList, pwzData, pvdir->wzWebBase, countof(pvdir->wzWebBase), hWebBaseQuery);
84 if (WcaIsUninstalling(isInstalled, isAction))
85 {
86 // If we're uninstalling, ignore any failure to find the existing web
87 hr = S_OK;
88 }
89 ExitOnFailure(hr, "Failed to get base of web: %ls for VirtualDir", pwzData);
90
91 hr = WcaGetRecordString(hRec, vdqAlias, &pwzData);
92 ExitOnFailure(hr, "Failed to get Alias for VirtualDir");
93
94 if (0 != lstrlenW(pvdir->wzWebBase))
95 {
96 hr = ::StringCchPrintfW(pvdir->wzVDirRoot, countof(pvdir->wzVDirRoot), L"%s/Root/%s", pvdir->wzWebBase, pwzData);
97 ExitOnFailure(hr, "Failed to set VDirRoot for VirtualDir");
98 }
99
100 // get the vdir's directory
101 hr = WcaGetRecordString(hRec, vdqDirectory, &pwzData);
102 ExitOnFailure(hr, "Failed to get Directory for VirtualDir");
103
104 // get the web's directory
105 if (INSTALLSTATE_SOURCE == pvdir->isAction)
106 {
107 hr = WcaGetRecordString(hRec, vdqSourcePath, &pwzData);
108 }
109 else
110 {
111 hr = WcaGetRecordString(hRec, vdqTargetPath, &pwzData);
112 }
113 ExitOnFailure(hr, "Failed to get Source/TargetPath for Directory");
114
115 // remove trailing backslash(es)
116 while (lstrlenW(pwzData) > 0 && pwzData[lstrlenW(pwzData)-1] == L'\\')
117 {
118 pwzData[lstrlenW(pwzData)-1] = 0;
119 }
120 hr = ::StringCchCopyW(pvdir->wzDirectory, countof(pvdir->wzDirectory), pwzData);
121 ExitOnFailure(hr, "Failed to copy directory string to vdir object");
122
123 // get the security information for this web
124 hr = WcaGetRecordString(hRec, vdqProperties, &pwzData);
125 ExitOnFailure(hr, "Failed to get web directory identifier for VirtualDir");
126 if (*pwzData)
127 {
128 hr = ScaGetWebDirProperties(pwzData, hUserQuery, hWebDirPropQuery, &pvdir->swp);
129 ExitOnFailure(hr, "Failed to get web directory for VirtualDir");
130
131 pvdir->fHasProperties = TRUE;
132 }
133
134 // get the application information for this web
135 hr = WcaGetRecordString(hRec, vdqApplication, &pwzData);
136 ExitOnFailure(hr, "Failed to get application identifier for VirtualDir");
137 if (*pwzData)
138 {
139 hr = ScaGetWebApplication(NULL, pwzData, hWebAppQuery, hWebAppExtQuery, &pvdir->swapp);
140 ExitOnFailure(hr, "Failed to get application for VirtualDir");
141
142 pvdir->fHasApplication = TRUE;
143 }
144
145 hr = WcaGetRecordString(hRec, vdqVDir, &pwzData);
146 ExitOnFailure(hr, "Failed to get VDir for VirtualDir");
147
148 if (*pwzData && *ppsmmList)
149 {
150 hr = ScaGetMimeMap(mmptVDir, pwzData, ppsmmList, &pvdir->psmm);
151 ExitOnFailure(hr, "Failed to get mimemap for VirtualDir");
152 }
153
154 if (*pwzData && *ppshhList)
155 {
156 hr = ScaGetHttpHeader(hhptVDir, pwzData, ppshhList, &pvdir->pshh);
157 ExitOnFailure(hr, "Failed to get custom HTTP headers for VirtualDir: %ls", pwzData);
158 }
159
160 if (*pwzData && *ppsweList)
161 {
162 hr = ScaGetWebError(weptVDir, pwzData, ppsweList, &pvdir->pswe);
163 ExitOnFailure(hr, "Failed to get custom web errors for VirtualDir: %ls", pwzData);
164 }
165 }
166
167 if (E_NOMOREITEMS == hr)
168 {
169 hr = S_OK;
170 }
171 ExitOnFailure(hr, "Failure while processing VirtualDirs");
172
173LExit:
174 WcaFinishUnwrapQuery(hWrapQuery);
175
176 ReleaseStr(pwzData);
177 return hr;
178}
179
180
181HRESULT ScaVirtualDirsInstall(
182 __in IMSAdminBase* piMetabase,
183 __in SCA_VDIR* psvdList,
184 __in SCA_APPPOOL * psapList
185 )
186{
187 Assert(piMetabase);
188
189 HRESULT hr = S_OK;
190 SCA_VDIR* psvd = psvdList;
191 int i;
192
193 while (psvd)
194 {
195 // On reinstall, we have to uninstall the old application, otherwise a duplicate will be created
196 if (WcaIsReInstalling(psvd->isInstalled, psvd->isAction))
197 {
198 if (psvd->fHasApplication)
199 {
200 hr = ScaDeleteApp(piMetabase, psvd->wzVDirRoot);
201 ExitOnFailure(hr, "Failed to remove application for WebVDir as part of a reinstall");
202 }
203 }
204
205 if (WcaIsInstalling(psvd->isInstalled, psvd->isAction))
206 {
207 hr = ScaCreateMetabaseKey(piMetabase, psvd->wzVDirRoot, L"");
208 ExitOnFailure(hr, "Failed to create key for VirtualDir");
209 hr = ScaWriteMetabaseValue(piMetabase, psvd->wzVDirRoot, L"", MD_KEY_TYPE, METADATA_NO_ATTRIBUTES, IIS_MD_UT_SERVER, STRING_METADATA, (LPVOID)L"IIsWebVirtualDir");
210 ExitOnFailure(hr, "Failed to write key type for for VirtualDir");
211 i = 0x4000003e; // 1073741886; // default directory browsing rights
212 hr = ScaWriteMetabaseValue(piMetabase, psvd->wzVDirRoot, L"", MD_DIRECTORY_BROWSING, METADATA_INHERIT, IIS_MD_UT_FILE, DWORD_METADATA, (LPVOID)((DWORD_PTR)i));
213 ExitOnFailure(hr, "Failed to set directory browsing for VirtualDir");
214
215 hr = ScaWriteMetabaseValue(piMetabase, psvd->wzVDirRoot, L"", MD_VR_PATH, METADATA_INHERIT, IIS_MD_UT_FILE, STRING_METADATA, (LPVOID)psvd->wzDirectory);
216 ExitOnFailure(hr, "Failed to write Directory for VirtualDir");
217
218 if (psvd->fHasProperties)
219 {
220 ScaWriteWebDirProperties(piMetabase, psvd->wzVDirRoot, &psvd->swp);
221 ExitOnFailure(hr, "Failed to write directory properties for VirtualDir");
222 }
223
224 if (psvd->fHasApplication)
225 {
226 hr = ScaWriteWebApplication(piMetabase, psvd->wzVDirRoot, &psvd->swapp, psapList);
227 ExitOnFailure(hr, "Failed to write application for VirtualDir");
228 }
229
230 if (psvd->psmm)
231 {
232 hr = ScaWriteMimeMap(piMetabase, psvd->wzVDirRoot, psvd->psmm);
233 ExitOnFailure(hr, "Failed to write mimemap for VirtualDir");
234 }
235
236 if (psvd->pshh)
237 {
238 hr = ScaWriteHttpHeader(piMetabase, psvd->wzVDirRoot, psvd->pshh);
239 ExitOnFailure(hr, "Failed to write custom HTTP headers for VirtualDir");
240 }
241
242 if (psvd->pswe)
243 {
244 hr = ScaWriteWebError(piMetabase, weptVDir, psvd->wzVDirRoot, psvd->pswe);
245 ExitOnFailure(hr, "Failed to write custom web errors for VirtualDir");
246 }
247 }
248
249 psvd = psvd->psvdNext;
250 }
251
252LExit:
253 return hr;
254}
255
256
257HRESULT ScaVirtualDirsUninstall(
258 __in IMSAdminBase* piMetabase,
259 __in SCA_VDIR* psvdList
260 )
261{
262 Assert(piMetabase);
263
264 HRESULT hr = S_OK;
265 SCA_VDIR* psvd = psvdList;
266
267 while (psvd)
268 {
269 if (WcaIsUninstalling(psvd->isInstalled, psvd->isAction))
270 {
271 // delete the application for this virtual directory
272 if (psvd->fHasApplication)
273 {
274 hr = ScaDeleteApp(piMetabase, psvd->wzVDirRoot);
275 ExitOnFailure(hr, "Failed to remove application for WebVDir");
276 }
277
278 if (0 != lstrlenW(psvd->wzVDirRoot))
279 {
280 hr = ScaDeleteMetabaseKey(piMetabase, psvd->wzVDirRoot, L"");
281 ExitOnFailure(hr, "Failed to remove VirtualDir '%ls' from metabase", psvd->wzKey);
282 }
283 }
284
285 psvd = psvd->psvdNext;
286 }
287
288LExit:
289 return hr;
290}
291
292
293void ScaVirtualDirsFreeList(
294 __in SCA_VDIR* psvdList
295 )
296{
297 SCA_VDIR* psvdDelete = psvdList;
298 while (psvdList)
299 {
300 psvdDelete = psvdList;
301 psvdList = psvdList->psvdNext;
302
303 if (psvdDelete->psmm)
304 {
305 ScaMimeMapFreeList(psvdDelete->psmm);
306 }
307
308 if (psvdDelete->pswe)
309 {
310 ScaWebErrorFreeList(psvdDelete->pswe);
311 }
312
313 MemFree(psvdDelete);
314 }
315}
316
317
318static HRESULT AddVirtualDirToList(
319 __in SCA_VDIR** ppsvdList
320 )
321{
322 HRESULT hr = S_OK;
323 SCA_VDIR* psvd = static_cast<SCA_VDIR*>(MemAlloc(sizeof(SCA_VDIR), TRUE));
324 ExitOnNull(psvd, hr, E_OUTOFMEMORY, "failed to allocate memory for new vdir list element");
325
326 psvd->psvdNext= *ppsvdList;
327 *ppsvdList = psvd;
328
329LExit:
330 return hr;
331}
diff --git a/src/ext/Iis/ca/scavdir.h b/src/ext/Iis/ca/scavdir.h
new file mode 100644
index 00000000..c7e9661b
--- /dev/null
+++ b/src/ext/Iis/ca/scavdir.h
@@ -0,0 +1,71 @@
1#pragma once
2// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
3
4
5#include "scawebprop.h"
6#include "scawebapp.h"
7#include "scamimemap.h"
8#include "scaapppool.h"
9
10enum eVDirQuery { vdqWeb = 1, vdqVDir, vdqComponent , vdqAlias, vdqDirectory, vdqProperties, vdqApplication, vdqInstalled, vdqAction, vdqSourcePath, vdqTargetPath };
11
12struct SCA_VDIR
13{
14 // darwin information
15 WCHAR wzKey[MAX_DARWIN_KEY + 1];
16 WCHAR wzComponent[MAX_DARWIN_KEY + 1];
17 INSTALLSTATE isInstalled;
18 INSTALLSTATE isAction;
19
20 // metabase information
21 WCHAR wzWebKey[MAX_DARWIN_KEY + 1];
22 WCHAR wzWebBase[METADATA_MAX_NAME_LEN + 1];
23 WCHAR wzVDirRoot[METADATA_MAX_NAME_LEN + 1];
24
25 // iis configuation information
26 WCHAR wzDirectory[MAX_PATH];
27
28 BOOL fHasProperties;
29 SCA_WEB_PROPERTIES swp;
30
31 BOOL fHasApplication;
32 SCA_WEB_APPLICATION swapp;
33
34 SCA_MIMEMAP* psmm; // mime mappings
35 SCA_HTTP_HEADER* pshh; // custom web errors
36 SCA_WEB_ERROR* pswe; // custom web errors
37
38 SCA_VDIR* psvdNext;
39};
40
41
42// prototypes
43HRESULT __stdcall ScaVirtualDirsRead(
44 __in IMSAdminBase* piMetabase,
45 __in SCA_WEB* pswList,
46 __in SCA_VDIR** ppsvdList,
47 __in SCA_MIMEMAP** ppsmmList,
48 __in SCA_HTTP_HEADER** ppshhList,
49 __in SCA_WEB_ERROR** ppsweList,
50 __in WCA_WRAPQUERY_HANDLE hUserQuery,
51 __in WCA_WRAPQUERY_HANDLE hWebBaseQuery,
52 __in WCA_WRAPQUERY_HANDLE hWebDirPropQuery,
53 __in WCA_WRAPQUERY_HANDLE hWebAppQuery,
54 __in WCA_WRAPQUERY_HANDLE hWebAppExtQuery,
55 __inout LPWSTR *ppwzCustomActionData
56 );
57
58HRESULT ScaVirtualDirsInstall(
59 __in IMSAdminBase* piMetabase,
60 __in SCA_VDIR* psvdList,
61 __in SCA_APPPOOL * psapList
62 );
63
64HRESULT ScaVirtualDirsUninstall(
65 __in IMSAdminBase* piMetabase,
66 __in SCA_VDIR* psvdList
67 );
68
69void ScaVirtualDirsFreeList(
70 __in SCA_VDIR* psvdList
71 );
diff --git a/src/ext/Iis/ca/scavdir7.cpp b/src/ext/Iis/ca/scavdir7.cpp
new file mode 100644
index 00000000..3f675357
--- /dev/null
+++ b/src/ext/Iis/ca/scavdir7.cpp
@@ -0,0 +1,380 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3#include "precomp.h"
4
5// prototypes
6static HRESULT AddVirtualDirToList7(
7 __in SCA_VDIR7** psvdList
8 );
9
10
11HRESULT __stdcall ScaVirtualDirsRead7(
12 __in SCA_WEB7* pswList,
13 __in SCA_VDIR7** ppsvdList,
14 __in SCA_MIMEMAP** ppsmmList,
15 __in SCA_HTTP_HEADER** ppshhList,
16 __in SCA_WEB_ERROR** ppsweList,
17 __in WCA_WRAPQUERY_HANDLE hUserQuery,
18 __in WCA_WRAPQUERY_HANDLE /*hWebBaseQuery*/,
19 __in WCA_WRAPQUERY_HANDLE hWebDirPropQuery,
20 __in WCA_WRAPQUERY_HANDLE hWebAppQuery,
21 __in WCA_WRAPQUERY_HANDLE hWebAppExtQuery,
22 __inout LPWSTR *ppwzCustomActionData
23 )
24{
25 Assert(ppsvdList);
26
27 HRESULT hr = S_OK;
28 MSIHANDLE hRec;
29
30 SCA_VDIR7* pvdir = NULL;
31 LPWSTR pwzData = NULL;
32 WCA_WRAPQUERY_HANDLE hWrapQuery = NULL;
33
34 hr = WcaBeginUnwrapQuery(&hWrapQuery, ppwzCustomActionData);
35 ExitOnFailure(hr, "Failed to unwrap query for ScaAppPoolRead");
36
37 if (0 == WcaGetQueryRecords(hWrapQuery))
38 {
39 WcaLog(LOGMSG_VERBOSE, "Skipping ScaVirtualDirsRead() because IIsWebVirtualDir table not present");
40 ExitFunction1(hr = S_FALSE);
41 }
42
43 // loop through all the vdirs
44 while (S_OK == (hr = WcaFetchWrappedRecord(hWrapQuery, &hRec)))
45 {
46 // Add this record's information into the list of things to process.
47 hr = AddVirtualDirToList7(ppsvdList);
48 ExitOnFailure(hr, "failed to add vdir to vdir list");
49
50 pvdir = *ppsvdList;
51
52 // get the darwin information
53 hr = WcaGetRecordString(hRec, vdqComponent, &pwzData);
54 ExitOnFailure(hr, "failed to get IIsWebVirtualDir.Component");
55
56 hr = WcaGetRecordInteger(hRec, vdqInstalled, (int *)&pvdir->isInstalled);
57 ExitOnFailure(hr, "Failed to get Component installed state for virtual dir");
58
59 hr = WcaGetRecordInteger(hRec, vdqAction, (int *)&pvdir->isAction);
60 ExitOnFailure(hr, "Failed to get Component action state for virtual dir");
61
62 // get vdir properties
63 hr = ::StringCchCopyW(pvdir->wzComponent, countof(pvdir->wzComponent), pwzData);
64 ExitOnFailure(hr, "failed to copy vdir component name: %ls", pwzData);
65
66 hr = WcaGetRecordString(hRec, vdqWeb, &pwzData);
67 ExitOnFailure(hr, "Failed to get Web for VirtualDir");
68
69 hr = ScaWebsGetBase7(pswList, pwzData, pvdir->wzWebName , countof(pvdir->wzWebName));
70 if (S_FALSE == hr)
71 {
72 hr = HRESULT_FROM_WIN32(ERROR_NOT_FOUND);
73 ExitOnFailure(hr, "Failed to get Web Base for VirtualDir");
74 }
75 if (WcaIsUninstalling(pvdir->isInstalled, pvdir->isAction))
76 {
77 // If we're uninstalling, ignore any failure to find the existing web
78 hr = S_OK;
79 }
80
81 hr = WcaGetRecordString(hRec, vdqAlias, &pwzData);
82 ExitOnFailure(hr, "Failed to get Alias for VirtualDir");
83
84 hr = ::StringCchCopyW(pvdir->wzVDirRoot, countof(pvdir->wzVDirRoot), pwzData);
85 ExitOnFailure(hr, "Failed to set VDirRoot for VirtualDir");
86
87 // get the vdir's directory
88 hr = WcaGetRecordString(hRec, vdqDirectory, &pwzData);
89 ExitOnFailure(hr, "Failed to get Directory for VirtualDir");
90
91 // get the web's directory
92 if (INSTALLSTATE_SOURCE == pvdir->isAction)
93 {
94 hr = WcaGetRecordString(hRec, vdqSourcePath, &pwzData);
95 }
96 else
97 {
98 hr = WcaGetRecordString(hRec, vdqTargetPath, &pwzData);
99 }
100 ExitOnFailure(hr, "Failed to get Source/TargetPath for Directory");
101
102 // remove trailing backslash(es)
103 while (lstrlenW(pwzData) > 0 && pwzData[lstrlenW(pwzData)-1] == L'\\')
104 {
105 pwzData[lstrlenW(pwzData)-1] = 0;
106 }
107 hr = ::StringCchCopyW(pvdir->wzDirectory, countof(pvdir->wzDirectory), pwzData);
108 ExitOnFailure(hr, "Failed to copy directory string to vdir object");
109
110 // get the security information for this web
111 hr = WcaGetRecordString(hRec, vdqProperties, &pwzData);
112 ExitOnFailure(hr, "Failed to get web directory identifier for VirtualDir");
113 if (*pwzData)
114 {
115 hr = ScaGetWebDirProperties(pwzData, hUserQuery, hWebDirPropQuery, &pvdir->swp);
116 ExitOnFailure(hr, "Failed to get web directory for VirtualDir");
117
118 pvdir->fHasProperties = TRUE;
119 }
120
121 // get the application information for this web
122 hr = WcaGetRecordString(hRec, vdqApplication, &pwzData);
123 ExitOnFailure(hr, "Failed to get application identifier for VirtualDir");
124 if (*pwzData)
125 {
126 hr = ScaGetWebApplication(NULL, pwzData, hWebAppQuery, hWebAppExtQuery, &pvdir->swapp);
127 ExitOnFailure(hr, "Failed to get application for VirtualDir");
128
129 pvdir->fHasApplication = TRUE;
130 }
131
132 hr = WcaGetRecordString(hRec, vdqVDir, &pwzData);
133 ExitOnFailure(hr, "Failed to get VDir for VirtualDir");
134
135 if (*pwzData && *ppsmmList)
136 {
137 hr = ScaGetMimeMap(mmptVDir, pwzData, ppsmmList, &pvdir->psmm);
138 ExitOnFailure(hr, "Failed to get mimemap for VirtualDir");
139 }
140
141 if (*pwzData && *ppshhList)
142 {
143 hr = ScaGetHttpHeader(hhptVDir, pwzData, ppshhList, &pvdir->pshh);
144 ExitOnFailure(hr, "Failed to get custom HTTP headers for VirtualDir: %ls", pwzData);
145 }
146
147 if (*pwzData && *ppsweList)
148 {
149 hr = ScaGetWebError(weptVDir, pwzData, ppsweList, &pvdir->pswe);
150 ExitOnFailure(hr, "Failed to get custom web errors for VirtualDir: %ls", pwzData);
151 }
152 }
153
154 if (E_NOMOREITEMS == hr)
155 {
156 hr = S_OK;
157 }
158 ExitOnFailure(hr, "Failure while processing VirtualDirs");
159
160LExit:
161 WcaFinishUnwrapQuery(hWrapQuery);
162
163 ReleaseStr(pwzData);
164
165 return hr;
166}
167
168
169HRESULT ScaVirtualDirsInstall7(
170 __in SCA_VDIR7* psvdList,
171 __in SCA_APPPOOL * psapList
172 )
173{
174 HRESULT hr = S_OK;
175 SCA_VDIR7* psvd = psvdList;
176 LPWSTR wzPath = NULL;
177 WCHAR wzAppPoolName[MAX_PATH];
178 while (psvd)
179 {
180 if (WcaIsInstalling(psvd->isInstalled, psvd->isAction))
181 {
182 // First write all applications, this is necessary since vdirs must be nested under the applications.
183 if (psvd->fHasApplication)
184 {
185 //create the application for this vdir application
186 hr = ScaWriteConfigID(IIS_APPLICATION);
187 ExitOnFailure(hr, "Failed to write app ID");
188 hr = ScaWriteConfigID(IIS_CREATE);
189 ExitOnFailure(hr, "Failed to write app action");
190#pragma prefast(suppress:26037, "Source string is null terminated - it is populated as target of ::StringCchCopyW")
191 hr = ScaWriteConfigString(psvd->wzWebName); //site name key
192 ExitOnFailure(hr, "Failed to write app web key");
193 hr = StrAllocFormatted(&wzPath, L"/%s", psvd->wzVDirRoot);
194 ExitOnFailure(hr, "Failed to create app path");
195 hr = ScaWriteConfigString(wzPath); // App Path
196 ExitOnFailure(hr, "Failed to write app path root ");
197
198 if (!*psvd->swapp.wzAppPool)
199 {
200 //This Application goes in default appPool
201 hr = ScaWriteConfigString(L""); // App Pool
202 }
203 else
204 {
205 //get apppool from WebApplication
206#pragma prefast(suppress:26037, "Source string is null terminated - it is populated as target of ::StringCchCopyW")
207 hr = ScaFindAppPool7(psvd->swapp.wzAppPool, wzAppPoolName, countof(wzAppPoolName), psapList);
208 ExitOnFailure(hr, "Failed to read app pool from application");
209 hr = ScaWriteConfigString(wzAppPoolName); // App Pool
210 ExitOnFailure(hr, "Failed to write appPool for vdir");
211
212 }
213 }
214 }
215
216 psvd = psvd->psvdNext;
217 }
218
219 // Reset our linked list and write all the VDirs
220 psvd = psvdList;
221 while (psvd)
222 {
223 if (WcaIsInstalling(psvd->isInstalled, psvd->isAction))
224 {
225 //create the Vdir
226 hr = ScaWriteConfigID(IIS_VDIR);
227 ExitOnFailure(hr, "Failed write VirDir ID")
228 hr = ScaWriteConfigID(IIS_CREATE);
229 ExitOnFailure(hr, "Failed write VirDir action")
230#pragma prefast(suppress:26037, "Source string is null terminated - it is populated as target of ::StringCchCopyW")
231 hr = ScaWriteConfigString(psvd->wzWebName); //site name key
232 ExitOnFailure(hr, "Failed write VirDir web name");
233 hr = StrAllocFormatted(&wzPath, L"/%s", psvd->wzVDirRoot);
234 ExitOnFailure(hr, "Failed to create vdir path");
235 hr = ScaWriteConfigString(wzPath); //vdir path
236 ExitOnFailure(hr, "Failed write VirDir path")
237#pragma prefast(suppress:26037, "Source string is null terminated - it is populated as target of ::StringCchCopyW")
238 hr = ScaWriteConfigString(psvd->wzDirectory); //physical dir
239 ExitOnFailure(hr, "Failed write VirDir dir");
240
241 if (psvd->fHasProperties)
242 {
243 ScaWriteWebDirProperties7(psvd->wzWebName, psvd->wzVDirRoot, &psvd->swp);
244 ExitOnFailure(hr, "Failed to write directory properties for VirtualDir");
245 }
246
247 if (psvd->fHasApplication)
248 {
249 hr = ScaWriteWebApplication7(psvd->wzWebName, psvd->wzVDirRoot, &psvd->swapp, psapList);
250 ExitOnFailure(hr, "Failed to write application for VirtualDir");
251 }
252
253 if (psvd->psmm)
254 {
255 hr = ScaWriteMimeMap7(psvd->wzWebName, psvd->wzVDirRoot, psvd->psmm);
256 ExitOnFailure(hr, "Failed to write mimemap for VirtualDir");
257 }
258
259 if (psvd->pshh)
260 {
261 hr = ScaWriteHttpHeader7(psvd->wzWebName, psvd->wzVDirRoot, psvd->pshh);
262 ExitOnFailure(hr, "Failed to write custom HTTP headers for VirtualDir");
263 }
264
265 if (psvd->pswe)
266 {
267 hr = ScaWriteWebError7(psvd->wzWebName, psvd->wzVDirRoot, psvd->pswe);
268 ExitOnFailure(hr, "Failed to write custom web errors for VirtualDir");
269 }
270 }
271
272 psvd = psvd->psvdNext;
273 }
274
275LExit:
276 ReleaseStr(wzPath);
277 return hr;
278}
279
280
281HRESULT ScaVirtualDirsUninstall7(
282 __in SCA_VDIR7* psvdList
283 )
284{
285
286 HRESULT hr = S_OK;
287 SCA_VDIR7* psvd = psvdList;
288 LPWSTR wzPath = NULL;
289
290 while (psvd)
291 {
292 if (WcaIsUninstalling(psvd->isInstalled, psvd->isAction))
293 {
294 //init path
295 hr = StrAllocFormatted(&wzPath, L"/%s", psvd->wzVDirRoot);
296 ExitOnFailure(hr, "Failed to create vdir path");
297
298 if (psvd->fHasApplication)
299 {
300 //delete Application
301 hr = ScaWriteConfigID(IIS_APPLICATION);
302 ExitOnFailure(hr, "Failed to write app ID ");
303 hr = ScaWriteConfigID(IIS_DELETE);
304 ExitOnFailure(hr, "Failed to write delete app ID ");
305#pragma prefast(suppress:26037, "Source string is null terminated - it is populated as target of ::StringCchCopyW")
306 hr = ScaWriteConfigString(psvd->wzWebName); //site name key
307 ExitOnFailure(hr, "Failed to write App site Name");
308#pragma prefast(suppress:26037, "Source string is null terminated - it is populated as target of ::StringCchCopyW")
309 hr = ScaWriteConfigString(wzPath); // App Path
310 ExitOnFailure(hr, "Failed to write app path root ");
311 hr = ScaWriteConfigString(L"NOP"); // App pool
312 ExitOnFailure(hr, "Failed to write app path app pool ");
313 }
314 else
315 {
316 //delete VDir
317 hr = ScaWriteConfigID(IIS_VDIR);
318 ExitOnFailure(hr, "Failed to write vDir ID ");
319 hr = ScaWriteConfigID(IIS_DELETE);
320#pragma prefast(suppress:26037, "Source string is null terminated - it is populated as target of ::StringCchCopyW")
321 hr = ScaWriteConfigString(psvd->wzWebName); //site name key
322 ExitOnFailure(hr, "Failed to write App site Name");
323 hr = ScaWriteConfigString(wzPath); // Vdir Path
324 ExitOnFailure(hr, "Failed to write app vdir ");
325 hr = ScaWriteConfigString(L"NOP"); // Phy Path
326 ExitOnFailure(hr, "Failed to write vdir path");
327 }
328
329 ExitOnFailure(hr, "Failed to remove VirtualDir '%ls' from config", psvd->wzKey);
330 }
331
332 psvd = psvd->psvdNext;
333 }
334
335LExit:
336 ReleaseStr(wzPath);
337 return hr;
338}
339
340
341void ScaVirtualDirsFreeList7(
342 __in SCA_VDIR7* psvdList
343 )
344{
345 SCA_VDIR7* psvdDelete = psvdList;
346 while (psvdList)
347 {
348 psvdDelete = psvdList;
349 psvdList = psvdList->psvdNext;
350
351 if (psvdDelete->psmm)
352 {
353 ScaMimeMapFreeList(psvdDelete->psmm);
354 }
355
356 if (psvdDelete->pswe)
357 {
358 ScaWebErrorFreeList(psvdDelete->pswe);
359 }
360
361 MemFree(psvdDelete);
362 }
363}
364
365
366static HRESULT AddVirtualDirToList7(
367 __in SCA_VDIR7** ppsvdList
368 )
369{
370 HRESULT hr = S_OK;
371
372 SCA_VDIR7* psvd = static_cast<SCA_VDIR7*>(MemAlloc(sizeof(SCA_VDIR7), TRUE));
373 ExitOnNull(psvd, hr, E_OUTOFMEMORY, "failed to allocate memory for new vdir list element");
374
375 psvd->psvdNext= *ppsvdList;
376 *ppsvdList = psvd;
377
378LExit:
379 return hr;
380}
diff --git a/src/ext/Iis/ca/scavdir7.h b/src/ext/Iis/ca/scavdir7.h
new file mode 100644
index 00000000..dba25431
--- /dev/null
+++ b/src/ext/Iis/ca/scavdir7.h
@@ -0,0 +1,66 @@
1#pragma once
2// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
3
4
5#include "scawebprop.h"
6#include "scawebapp.h"
7#include "scamimemap.h"
8#include "scaapppool.h"
9
10struct SCA_VDIR7
11{
12 // darwin information
13 WCHAR wzKey[MAX_DARWIN_KEY + 1];
14 WCHAR wzComponent[MAX_DARWIN_KEY + 1];
15 INSTALLSTATE isInstalled;
16 INSTALLSTATE isAction;
17
18 // metabase information
19 WCHAR wzWebKey[MAX_DARWIN_KEY + 1];
20 WCHAR wzWebName[METADATA_MAX_NAME_LEN + 1];
21 WCHAR wzVDirRoot[METADATA_MAX_NAME_LEN + 1];
22
23 // iis configuation information
24 WCHAR wzDirectory[MAX_PATH];
25
26 BOOL fHasProperties;
27 SCA_WEB_PROPERTIES swp;
28
29 BOOL fHasApplication;
30 SCA_WEB_APPLICATION swapp;
31
32 SCA_MIMEMAP* psmm; // mime mappings
33 SCA_HTTP_HEADER* pshh; // custom web errors
34 SCA_WEB_ERROR* pswe; // custom web errors
35
36 SCA_VDIR7* psvdNext;
37};
38
39
40// prototypes
41HRESULT __stdcall ScaVirtualDirsRead7(
42 __in SCA_WEB7* pswList,
43 __in SCA_VDIR7** ppsvdList,
44 __in SCA_MIMEMAP** ppsmmList,
45 __in SCA_HTTP_HEADER** ppshhList,
46 __in SCA_WEB_ERROR** ppsweList,
47 __in WCA_WRAPQUERY_HANDLE hUserQuery,
48 __in WCA_WRAPQUERY_HANDLE hWebBaseQuery,
49 __in WCA_WRAPQUERY_HANDLE hWebDirPropQuery,
50 __in WCA_WRAPQUERY_HANDLE hWebAppQuery,
51 __in WCA_WRAPQUERY_HANDLE hWebAppExtQuery,
52 __inout LPWSTR *ppwzCustomActionData
53 );
54
55HRESULT ScaVirtualDirsInstall7(
56 __in SCA_VDIR7* psvdList,
57 __in SCA_APPPOOL * psapList
58 );
59
60HRESULT ScaVirtualDirsUninstall7(
61 __in SCA_VDIR7* psvdList
62 );
63
64void ScaVirtualDirsFreeList7(
65 __in SCA_VDIR7* psvdList
66 );
diff --git a/src/ext/Iis/ca/scaweb.cpp b/src/ext/Iis/ca/scaweb.cpp
new file mode 100644
index 00000000..0452fb0b
--- /dev/null
+++ b/src/ext/Iis/ca/scaweb.cpp
@@ -0,0 +1,1187 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3#include "precomp.h"
4
5//Adding this because delivery doesn't have the updated specstrings.h that windows build does
6#ifndef __in_xcount
7#define __in_xcount(size)
8#endif
9
10// sql queries
11
12enum eWebBaseQuery { wbqWeb = 1, wbqId, wbqIP, wbqPort, wbqHeader, wbqSecure, wbqDescription };
13
14
15// prototypes for private helper functions
16static SCA_WEB* NewWeb();
17static void FreeWeb(SCA_WEB *pswDelete);
18static SCA_WEB* AddWebToList(
19 __in SCA_WEB* pswList,
20 __in SCA_WEB* psw
21 );
22static HRESULT ScaWebFindBase(
23 __in IMSAdminBase* piMetabase,
24 __in SCA_WEB* pswList,
25 __in_z LPCWSTR wzWeb,
26 __in int iSiteId,
27 __in_z LPCWSTR wzIP,
28 __in int iPort,
29 __in_z LPCWSTR wzHeader,
30 __in BOOL fSecure,
31 __in_z LPCWSTR wzDescription,
32 __out_ecount(cchWebBase) LPWSTR wzWebBase,
33 __in DWORD cchWebBase
34 );
35static HRESULT ScaWebFindFreeBase(
36 __in IMSAdminBase* piMetabase,
37 __in_xcount(unknown) SCA_WEB* pswList,
38 __in int iSiteId,
39 __in_z LPCWSTR wzDescription,
40 __out_ecount(cchWebBase) LPWSTR wzWebBase,
41 __in DWORD cchWebBase
42 );
43static HRESULT ScaWebWrite(
44 __in IMSAdminBase* piMetabase,
45 __in SCA_WEB* psw,
46 __in SCA_APPPOOL * psapList
47 );
48static HRESULT ScaWebRemove(
49 __in IMSAdminBase* piMetabase,
50 __in const SCA_WEB* psw);
51static DWORD SiteIdFromDescription(
52 __in_z LPCWSTR wzDescription
53 );
54static void Sort(
55 __in_ecount(cArray) DWORD dwArray[],
56 __in int cArray
57 );
58
59
60HRESULT ScaWebsRead(
61 __in IMSAdminBase* piMetabase,
62 __in SCA_MIMEMAP** ppsmmList,
63 __in SCA_WEB** ppswList,
64 __in SCA_HTTP_HEADER** ppshhList,
65 __in SCA_WEB_ERROR** ppsweList,
66 __in WCA_WRAPQUERY_HANDLE hUserQuery,
67 __in WCA_WRAPQUERY_HANDLE hWebDirPropQuery,
68 __in WCA_WRAPQUERY_HANDLE hSslCertQuery,
69 __in WCA_WRAPQUERY_HANDLE hWebLogQuery,
70 __in WCA_WRAPQUERY_HANDLE hWebAppQuery,
71 __in WCA_WRAPQUERY_HANDLE hWebAppExtQuery,
72 __inout LPWSTR *ppwzCustomActionData
73 )
74{
75 Assert(piMetabase && ppswList);
76
77 HRESULT hr = S_OK;
78
79 MSIHANDLE hRec;
80 MSIHANDLE hRecAddresses;
81
82 SCA_WEB* psw = NULL;
83 LPWSTR pwzData = NULL;
84 int iSiteId;
85
86 DWORD dwLen = 0;
87 WCA_WRAPQUERY_HANDLE hQueryWebSite = NULL;
88 WCA_WRAPQUERY_HANDLE hQueryWebAddress = NULL;
89
90 hr = WcaBeginUnwrapQuery(&hQueryWebSite, ppwzCustomActionData);
91 ExitOnFailure(hr, "Failed to unwrap query for ScaWebsRead");
92
93 hr = WcaBeginUnwrapQuery(&hQueryWebAddress, ppwzCustomActionData);
94 ExitOnFailure(hr, "Failed to unwrap query for ScaWebsRead");
95
96 if (0 == WcaGetQueryRecords(hQueryWebSite))
97 {
98 WcaLog(LOGMSG_VERBOSE, "Required tables not present");
99 ExitFunction1(hr = S_FALSE);
100 }
101
102 // loop through all the webs
103 while (S_OK == (hr = WcaFetchWrappedRecord(hQueryWebSite, &hRec)))
104 {
105 psw = NewWeb();
106 ExitOnNull(psw, hr, E_OUTOFMEMORY, "Failed to allocate memory for web object in memory");
107
108 // get the darwin information
109 hr = WcaGetRecordString(hRec, wqWeb, &pwzData);
110 ExitOnFailure(hr, "Failed to get Web");
111 hr = ::StringCchCopyW(psw->wzKey, countof(psw->wzKey), pwzData);
112 ExitOnFailure(hr, "Failed to copy key string to web object");
113
114 if (*pwzData && *ppsmmList)
115 {
116 hr = ScaGetMimeMap(mmptWeb, pwzData, ppsmmList, &psw->psmm);
117 ExitOnFailure(hr, "Failed to get mimemap for VirtualDir");
118 }
119
120 // get component install state
121 hr = WcaGetRecordString(hRec, wqComponent, &pwzData);
122 ExitOnFailure(hr, "Failed to get Component for Web");
123 hr = ::StringCchCopyW(psw->wzComponent, countof(psw->wzComponent), pwzData);
124 ExitOnFailure(hr, "Failed to copy component string to web object");
125 if (*(psw->wzComponent))
126 {
127 psw->fHasComponent = TRUE;
128
129 hr = WcaGetRecordInteger(hRec, wqInstalled, (int *)&psw->isInstalled);
130 ExitOnFailure(hr, "Failed to get web Component's installed state");
131
132 WcaGetRecordInteger(hRec, wqAction, (int *)&psw->isAction);
133 ExitOnFailure(hr, "Failed to get web Component's action state");
134
135 if (!WcaIsInstalling(psw->isInstalled, psw->isAction) && !WcaIsUninstalling(psw->isInstalled, psw->isAction)
136 && !WcaIsReInstalling(psw->isInstalled, psw->isAction))
137 {
138 FreeWeb(psw);
139 psw = NULL;
140
141 continue; // If we aren't acting on this component, skip it
142 }
143 }
144
145 hr = WcaGetRecordInteger(hRec, wqId, &iSiteId);
146 ExitOnFailure(hr, "Failed to get SiteId for Web");
147
148 // Get the web's key address.
149 hr = WcaGetRecordString(hRec, wqAddress, &pwzData);
150 ExitOnFailure(hr, "Failed to get Address for Web");
151 hr = ::StringCchCopyW(psw->swaKey.wzKey, countof(psw->swaKey.wzKey), pwzData);
152 ExitOnFailure(hr, "Failed to copy key string to web object");
153
154 hr = WcaGetRecordString(hRec, wqIP, &pwzData);
155 ExitOnFailure(hr, "Failed to get IP for Web");
156 hr = ::StringCchCopyW(psw->swaKey.wzIP, countof(psw->swaKey.wzIP), pwzData);
157 ExitOnFailure(hr, "Failed to copy IP string to web object");
158
159 hr = WcaGetRecordString(hRec, wqPort, &pwzData);
160 ExitOnFailure(hr, "Failed to get Web Address port");
161 psw->swaKey.iPort = wcstol(pwzData, NULL, 10);
162
163 hr = WcaGetRecordString(hRec, wqHeader, &pwzData);
164 ExitOnFailure(hr, "Failed to get Header for Web");
165 hr = ::StringCchCopyW(psw->swaKey.wzHeader, countof(psw->swaKey.wzHeader), pwzData);
166 ExitOnFailure(hr, "Failed to copy header string to web object");
167
168 hr = WcaGetRecordInteger(hRec, wqSecure, &psw->swaKey.fSecure);
169 ExitOnFailure(hr, "Failed to get if Web is secure");
170 if (S_FALSE == hr)
171 {
172 psw->swaKey.fSecure = FALSE;
173 }
174
175 // Get the web's description.
176 hr = WcaGetRecordString(hRec, wqDescription, &pwzData);
177 ExitOnFailure(hr, "Failed to get Description for Web");
178 hr = ::StringCchCopyW(psw->wzDescription, countof(psw->wzDescription), pwzData);
179 ExitOnFailure(hr, "Failed to copy description string to web object");
180
181 // Try to find the web root in case it already exists.
182 dwLen = METADATA_MAX_NAME_LEN;
183 hr = ScaWebFindBase(piMetabase, *ppswList,
184 psw->wzKey,
185 iSiteId,
186 psw->swaKey.wzIP,
187 psw->swaKey.iPort,
188 psw->swaKey.wzHeader,
189 psw->swaKey.fSecure,
190 psw->wzDescription,
191 psw->wzWebBase, dwLen);
192 if (S_OK == hr)
193 {
194 psw->fBaseExists = TRUE;
195 }
196 else if (S_FALSE == hr) // didn't find the web site.
197 {
198 psw->fBaseExists = FALSE;
199
200 // If we're actually configuring the web site.
201 if (psw->fHasComponent)
202 {
203 if (WcaIsInstalling(psw->isInstalled, psw->isAction))
204 {
205 hr = ScaWebFindFreeBase(piMetabase, *ppswList, iSiteId, psw->wzDescription, psw->wzWebBase, countof(psw->wzWebBase));
206 ExitOnFailure(hr, "Failed to find free web root.");
207 }
208 else if (WcaIsUninstalling(psw->isInstalled, psw->isAction))
209 {
210 WcaLog(LOGMSG_VERBOSE, "Web site: '%ls' was already removed, skipping.", psw->wzKey);
211
212 hr = S_OK;
213 continue;
214 }
215 }
216 }
217 ExitOnFailure(hr, "Failed to find web root");
218
219 // get any extra web addresses
220 WcaFetchWrappedReset(hQueryWebAddress);
221 while (S_OK == (hr = WcaFetchWrappedRecordWhereString(hQueryWebAddress, 2, psw->wzKey, &hRecAddresses)))
222 {
223 if (MAX_ADDRESSES_PER_WEB <= psw->cExtraAddresses)
224 {
225 hr = HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER);
226 ExitOnFailure(hr, "Failure to get more extra web addresses, max exceeded.");
227 }
228
229 hr = WcaGetRecordString(hRecAddresses, waqAddress, &pwzData);
230 ExitOnFailure(hr, "Failed to get extra web Address");
231
232 // if this isn't the key address add it
233 if (0 != lstrcmpW(pwzData, psw->swaKey.wzKey))
234 {
235 hr = ::StringCchCopyW(psw->swaExtraAddresses[psw->cExtraAddresses].wzKey, countof(psw->swaExtraAddresses[psw->cExtraAddresses].wzKey), pwzData);
236 ExitOnFailure(hr, "Failed to copy extra addresses key string to web object");
237
238 hr = WcaGetRecordString(hRecAddresses, waqIP, &pwzData);
239 ExitOnFailure(hr, "Failed to get extra web IP");
240 hr = ::StringCchCopyW(psw->swaExtraAddresses[psw->cExtraAddresses].wzIP, countof(psw->swaExtraAddresses[psw->cExtraAddresses].wzIP), pwzData);
241 ExitOnFailure(hr, "Failed to copy extra addresses IP string to web object");
242
243 hr = WcaGetRecordString(hRecAddresses, waqPort, &pwzData);
244 ExitOnFailure(hr, "Failed to get port for extra web IP");
245 psw->swaExtraAddresses[psw->cExtraAddresses].iPort= wcstol(pwzData, NULL, 10);
246
247 hr = WcaGetRecordString(hRecAddresses, waqHeader, &pwzData);
248 ExitOnFailure(hr, "Failed to get header for extra web IP");
249 hr = ::StringCchCopyW(psw->swaExtraAddresses[psw->cExtraAddresses].wzHeader, countof(psw->swaExtraAddresses[psw->cExtraAddresses].wzHeader), pwzData);
250 ExitOnFailure(hr, "Failed to copy extra addresses header string to web object");
251
252 hr = WcaGetRecordInteger(hRecAddresses, waqSecure, &psw->swaExtraAddresses[psw->cExtraAddresses].fSecure);
253 ExitOnFailure(hr, "Failed to get if secure extra web IP");
254 if (S_FALSE == hr)
255 psw->swaExtraAddresses[psw->cExtraAddresses].fSecure = FALSE;
256
257 ++psw->cExtraAddresses;
258 }
259 }
260
261 if (E_NOMOREITEMS == hr)
262 hr = S_OK;
263 ExitOnFailure(hr, "Failure occured while getting extra web addresses");
264
265 hr = WcaGetRecordInteger(hRec, wqConnectionTimeout, &psw->iConnectionTimeout);
266 ExitOnFailure(hr, "Failed to get connection timeout for Web");
267
268 if (psw->fHasComponent) // If we're installing it, it needs a dir
269 {
270 // get the web's directory
271 if (INSTALLSTATE_SOURCE == psw->isAction)
272 {
273 hr = WcaGetRecordString(hRec, wqSourcePath, &pwzData);
274 }
275 else
276 {
277 hr = WcaGetRecordString(hRec, wqTargetPath, &pwzData);
278 }
279 ExitOnFailure(hr, "Failed to get Source/TargetPath for Directory");
280
281 // remove trailing backslashes
282 while (lstrlenW(pwzData) > 0 && pwzData[lstrlenW(pwzData)-1] == L'\\')
283 {
284 pwzData[lstrlenW(pwzData)-1] = 0;
285 }
286 hr = ::StringCchCopyW(psw->wzDirectory, countof(psw->wzDirectory), pwzData);
287 ExitOnFailure(hr, "Failed to copy directory string to web object");
288 }
289
290 hr = WcaGetRecordInteger(hRec, wqState, &psw->iState);
291 ExitOnFailure(hr, "Failed to get state for Web");
292
293 hr = WcaGetRecordInteger(hRec, wqAttributes, &psw->iAttributes);
294 ExitOnFailure(hr, "Failed to get attributes for Web");
295
296 // get the dir properties for this web
297 hr = WcaGetRecordString(hRec, wqProperties, &pwzData);
298 ExitOnFailure(hr, "Failed to get directory property record for Web");
299 if (*pwzData)
300 {
301 hr = ScaGetWebDirProperties(pwzData, hUserQuery, hWebDirPropQuery, &psw->swp);
302 ExitOnFailure(hr, "Failed to get directory properties for Web");
303
304 psw->fHasProperties = TRUE;
305 }
306
307 // get the application information for this web
308 hr = WcaGetRecordString(hRec, wqApplication, &pwzData);
309 ExitOnFailure(hr, "Failed to get application identifier for Web");
310 if (*pwzData)
311 {
312 hr = ScaGetWebApplication(NULL, pwzData, hWebAppQuery, hWebAppExtQuery, &psw->swapp);
313 ExitOnFailure(hr, "Failed to get application for Web");
314
315 psw->fHasApplication = TRUE;
316 }
317
318 // get the SSL certificates
319 hr = ScaSslCertificateRead(psw->wzKey, hSslCertQuery, &(psw->pswscList));
320 ExitOnFailure(hr, "Failed to get SSL Certificates.");
321
322 // get the custom headers
323 if (*ppshhList)
324 {
325 hr = ScaGetHttpHeader(hhptWeb, psw->wzKey, ppshhList, &(psw->pshhList));
326 ExitOnFailure(hr, "Failed to get Custom HTTP Headers");
327 }
328
329 // get the errors
330 if (*ppsweList)
331 {
332 hr = ScaGetWebError(weptWeb, psw->wzKey, ppsweList, &(psw->psweList));
333 ExitOnFailure(hr, "Failed to get Custom Errors");
334 }
335
336 // get the log information for this web
337 hr = WcaGetRecordString(hRec, wqLog, &pwzData);
338 ExitOnFailure(hr, "Failed to get log identifier for Web");
339 if (*pwzData)
340 {
341 hr = ScaGetWebLog(piMetabase, pwzData, hWebLogQuery, &psw->swl);
342 ExitOnFailure(hr, "Failed to get Log for Web.");
343
344 psw->fHasLog = TRUE;
345 }
346
347 *ppswList = AddWebToList(*ppswList, psw);
348 psw = NULL; // set the web NULL so it doesn't accidentally get freed below
349 }
350
351 if (E_NOMOREITEMS == hr)
352 {
353 hr = S_OK;
354 }
355
356LExit:
357 // if anything was left over after an error clean it all up
358 WcaFinishUnwrapQuery(hQueryWebSite);
359 WcaFinishUnwrapQuery(hQueryWebAddress);
360
361 if (psw)
362 {
363 ScaWebsFreeList(psw);
364 }
365
366 ReleaseStr(pwzData);
367
368 return hr;
369}
370
371
372HRESULT ScaWebsGetBase(
373 __in IMSAdminBase* piMetabase,
374 __in SCA_WEB* pswList,
375 __in LPCWSTR wzWeb,
376 __out_ecount(cchWebBase) LPWSTR wzWebBase,
377 __in DWORD cchWebBase,
378 __in WCA_WRAPQUERY_HANDLE hWrapQuery
379 )
380{
381 HRESULT hr = S_OK;
382 MSIHANDLE hRec;
383
384 int iSiteId;
385 WCHAR wzIP[MAX_PATH];
386 int iPort = -1;
387 WCHAR wzHeader[MAX_PATH];
388 BOOL fSecure = FALSE;
389
390 LPWSTR pwzData = NULL;
391
392 // get the web information
393 WcaFetchWrappedReset(hWrapQuery);
394
395 hr = WcaFetchWrappedRecordWhereString(hWrapQuery, 1, wzWeb, &hRec);
396 if (S_OK == hr)
397 {
398 // get the data to search for
399 hr = WcaGetRecordInteger(hRec, wbqId, &iSiteId);
400 ExitOnFailure(hr, "Failed to get SiteId for Web for VirtualDir");
401
402 hr = WcaGetRecordString(hRec, wbqIP, &pwzData);
403 ExitOnFailure(hr, "Failed to get IP for Web for VirtualDir");
404 hr = ::StringCchCopyW(wzIP, countof(wzIP), pwzData);
405 ExitOnFailure(hr, "Failed to copy IP for Web for VirtualDir");
406
407 hr = WcaGetRecordString(hRec, wbqPort, &pwzData);
408 ExitOnFailure(hr, "Failed to get port for extra web IP");
409 iPort = wcstol(pwzData, NULL, 10);
410
411 hr = WcaGetRecordString(hRec, wbqHeader, &pwzData);
412 ExitOnFailure(hr, "Failed to get Header for Web for VirtualDir");
413 hr = ::StringCchCopyW(wzHeader, countof(wzHeader), pwzData);
414 ExitOnFailure(hr, "Failed to copy Header for Web for VirtualDir");
415
416 hr = WcaGetRecordInteger(hRec, wbqSecure, &fSecure);
417 if (S_FALSE == hr)
418 fSecure = FALSE;
419
420 hr = WcaGetRecordString(hRec, wbqDescription, &pwzData);
421 ExitOnFailure(hr, "Failed to get Description for Web");
422
423 // find the web or find the next free web location
424 hr = ScaWebFindBase(piMetabase, pswList, wzWeb, iSiteId, wzIP, iPort, wzHeader, fSecure, pwzData, wzWebBase, cchWebBase);
425 if (S_FALSE == hr)
426 hr = HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND);
427 ExitOnFailure(hr, "Failed to find Web base");
428 }
429 else if (S_FALSE == hr)
430 hr = HRESULT_FROM_WIN32(ERROR_NOT_FOUND);
431
432 // Let's check that there isn't more than one record found - if there is, throw an assert like WcaFetchSingleRecord() would
433 HRESULT hrTemp = WcaFetchWrappedRecordWhereString(hWrapQuery, 1, wzWeb, &hRec);
434 if (SUCCEEDED(hrTemp))
435 {
436 AssertSz(E_NOMOREITEMS == hrTemp, "ScaWebsGetBase found more than one record");
437 }
438
439LExit:
440 ReleaseStr(pwzData);
441
442 return hr;
443}
444
445
446HRESULT ScaWebsInstall(
447 __in IMSAdminBase* piMetabase,
448 __in SCA_WEB* pswList,
449 __in SCA_APPPOOL * psapList
450 )
451{
452 HRESULT hr = S_OK;
453 SCA_WEB* psw = pswList;
454
455 while (psw)
456 {
457 // if we are installing the web site
458 if (psw->fHasComponent && WcaIsInstalling(psw->isInstalled, psw->isAction))
459 {
460 hr = ScaWebWrite(piMetabase, psw, psapList);
461 ExitOnFailure(hr, "failed to write web '%ls' to metabase", psw->wzKey);
462 }
463
464 psw = psw->pswNext;
465 }
466
467LExit:
468 return hr;
469}
470
471
472HRESULT ScaWebsUninstall(
473 __in IMSAdminBase* piMetabase,
474 __in SCA_WEB* pswList
475 )
476{
477 HRESULT hr = S_OK;
478 SCA_WEB* psw = pswList;
479
480 while (psw)
481 {
482 // if we are uninstalling the web site
483 if (psw->fHasComponent && WcaIsUninstalling(psw->isInstalled, psw->isAction))
484 {
485 hr = ScaWebRemove(piMetabase, psw);
486 ExitOnFailure(hr, "Failed to remove web '%ls' from metabase", psw->wzKey);
487 }
488
489 psw = psw->pswNext;
490 }
491
492LExit:
493 return hr;
494}
495
496
497void ScaWebsFreeList(
498 __in SCA_WEB* pswList
499 )
500{
501 SCA_WEB* pswDelete = pswList;
502 while (pswList)
503 {
504 pswDelete = pswList;
505 pswList = pswList->pswNext;
506
507 // Free the SSL, headers and errors list first
508 FreeWeb(pswDelete);
509 }
510}
511
512
513// private helper functions
514
515static void FreeWeb(SCA_WEB *pswDelete)
516{
517 ScaSslCertificateFreeList(pswDelete->pswscList);
518 ScaHttpHeaderFreeList(pswDelete->pshhList);
519 ScaWebErrorFreeList(pswDelete->psweList);
520 MemFree(pswDelete);
521}
522
523static SCA_WEB* NewWeb()
524{
525 SCA_WEB* psw = static_cast<SCA_WEB*>(MemAlloc(sizeof(SCA_WEB), TRUE));
526 Assert(psw);
527 return psw;
528}
529
530
531static SCA_WEB* AddWebToList(
532 __in SCA_WEB* pswList,
533 __in SCA_WEB* psw
534 )
535{
536 if (pswList)
537 {
538 SCA_WEB* pswTemp = pswList;
539 while (pswTemp->pswNext)
540 {
541 pswTemp = pswTemp->pswNext;
542 }
543
544 pswTemp->pswNext = psw;
545 }
546 else
547 {
548 pswList = psw;
549 }
550
551 return pswList;
552}
553
554
555static HRESULT ScaWebFindBase(
556 __in IMSAdminBase* piMetabase,
557 __in SCA_WEB* pswList,
558 __in_z LPCWSTR wzWeb,
559 __in int iSiteId,
560 __in_z LPCWSTR wzIP,
561 __in int iPort,
562 __in_z LPCWSTR wzHeader,
563 __in BOOL fSecure,
564 __in_z LPCWSTR wzDescription,
565 __out_ecount(cchWebBase) LPWSTR wzWebBase,
566 __in DWORD cchWebBase
567 )
568{
569 Assert(piMetabase);
570
571 HRESULT hr = S_OK;
572
573 WCHAR wzKey[METADATA_MAX_NAME_LEN];
574 WCHAR wzSubkey[METADATA_MAX_NAME_LEN];
575 LPWSTR wzFoundKey = NULL;
576
577 METADATA_RECORD mr;
578 ::ZeroMemory(&mr, sizeof(mr));
579
580 METADATA_RECORD mrCompare;
581 ::ZeroMemory(&mrCompare, sizeof(mrCompare));
582
583 // try to find the web in memory first
584 for (SCA_WEB* psw = pswList; psw; psw = psw->pswNext)
585 {
586 if (0 == lstrcmpW(wzWeb, psw->wzKey))
587 {
588 if ((0 == lstrcmpW(wzIP, psw->swaKey.wzIP) || 0 == lstrcmpW(wzIP, L"*") || 0 == lstrcmpW(psw->swaKey.wzIP, L"*")) &&
589 iPort == psw->swaKey.iPort &&
590 0 == lstrcmpW(wzHeader, psw->swaKey.wzHeader) &&
591 fSecure == psw->swaKey.fSecure)
592 {
593 if (0 == lstrlenW(psw->wzWebBase))
594 {
595 WcaLog(LOGMSG_STANDARD, "A matching web object in memory was found, but the web object in memory has no associated base");
596 ExitFunction1(hr = S_FALSE);
597 }
598
599 hr = ::StringCchCopyW(wzKey, countof(wzKey), psw->wzWebBase);
600 ExitOnFailure(hr, "Failed to copy web base into key.");
601
602 wzFoundKey = wzKey;
603 break;
604 }
605 else
606 {
607 WcaLog(LOGMSG_STANDARD, "Found web `%ls` but data did not match.", wzWeb);
608 hr = E_UNEXPECTED;
609 break;
610 }
611 }
612 }
613 ExitOnFailure(hr, "Failure occured while searching for web in memory");
614
615 // If we didn't find a web in memory matching look in the metabase.
616 if (!wzFoundKey)
617 {
618 mr.dwMDIdentifier = MD_KEY_TYPE;
619 mr.dwMDAttributes = METADATA_INHERIT;
620 mr.dwMDUserType = IIS_MD_UT_SERVER;
621 mr.dwMDDataType = ALL_METADATA;
622 mr.dwMDDataLen = 0;
623 mr.pbMDData = NULL;
624
625 // If we're looking based on the old WebAddress detection (NULL) or the new
626 // Web description detection (-1)
627 if (MSI_NULL_INTEGER == iSiteId || -1 == iSiteId)
628 {
629 if (MSI_NULL_INTEGER == iSiteId)
630 {
631 mrCompare.dwMDIdentifier = (fSecure) ? MD_SECURE_BINDINGS : MD_SERVER_BINDINGS;
632 }
633 else
634 {
635 mrCompare.dwMDIdentifier = MD_SERVER_COMMENT;
636 }
637 mrCompare.dwMDAttributes = METADATA_INHERIT;
638 mrCompare.dwMDUserType = IIS_MD_UT_SERVER;
639 mrCompare.dwMDDataType = ALL_METADATA;
640 mrCompare.dwMDDataLen = 0;
641 mrCompare.pbMDData = NULL;
642
643 // Loop through the "web keys" looking for the "IIsWebServer" key that matches our search criteria.
644 for (DWORD dwIndex = 0; SUCCEEDED(hr); ++dwIndex)
645 {
646 hr = piMetabase->EnumKeys(METADATA_MASTER_ROOT_HANDLE, L"/LM/W3SVC", wzSubkey, dwIndex);
647 if (SUCCEEDED(hr))
648 {
649 hr = ::StringCchPrintfW(wzKey, countof(wzKey), L"/LM/W3SVC/%s", wzSubkey);
650 ExitOnFailure(hr, "Failed to copy web subkey.");
651
652 hr = MetaGetValue(piMetabase, METADATA_MASTER_ROOT_HANDLE, wzKey, &mr);
653 if (MD_ERROR_DATA_NOT_FOUND == hr || HRESULT_FROM_WIN32(ERROR_PATH_NOT_FOUND) == hr)
654 {
655 hr = S_FALSE; // didn't find anything, try next one
656 continue;
657 }
658 ExitOnFailure(hr, "Failed to get key from metabase while searching for web servers");
659
660 // If we have an IIsWebServer check to see if this is the site we are searching for.
661 if (0 == lstrcmpW(L"IIsWebServer", (LPCWSTR)mr.pbMDData))
662 {
663 hr = MetaGetValue(piMetabase, METADATA_MASTER_ROOT_HANDLE, wzKey, &mrCompare);
664 if (MD_ERROR_DATA_NOT_FOUND == hr || NULL == mrCompare.pbMDData)
665 {
666 hr = S_FALSE;
667 continue;
668 }
669 ExitOnFailure(hr, "Failed to get address/description from metabase while searching for web servers");
670
671 LPWSTR pwzExists = (LPWSTR)mrCompare.pbMDData;
672 if (MSI_NULL_INTEGER == iSiteId)
673 {
674 // Break down the address into its constituent parts (IP:Port:Header).
675 while (S_OK == hr && *pwzExists)
676 {
677 LPCWSTR pwzIPExists = pwzExists;
678 pwzExists = const_cast<LPWSTR>(wcsstr(pwzIPExists, L":"));
679 ExitOnNull(pwzExists, hr, E_INVALIDARG, "Invalid web address. IP was not separated by a colon.");
680 *pwzExists = L'\0';
681
682 LPCWSTR pwzPortExists = pwzExists + 1;
683 pwzExists = const_cast<LPWSTR>(wcsstr(pwzPortExists, L":"));
684 ExitOnNull(pwzExists, hr, E_INVALIDARG, "Invalid web address. Port was not separated by a colon.");
685 *pwzExists = L'\0';
686 int iPortExists = wcstol(pwzPortExists, NULL, 10);
687
688 LPCWSTR pwzHeaderExists = pwzExists + 1;
689
690 // compare the passed in address with the address listed for this web
691 if ((0 == lstrcmpW(wzIP, pwzIPExists) || 0 == lstrcmpW(wzIP, L"*")) &&
692 iPort == iPortExists &&
693 0 == lstrcmpW(wzHeader, pwzHeaderExists))
694 {
695 wzFoundKey = wzKey;
696 break;
697 }
698
699 // move to the next block of data, this may move beyond the available
700 // data and exit the while loop above.
701 pwzExists = const_cast<LPWSTR>(pwzHeaderExists + lstrlenW(pwzHeaderExists) + 1);
702 }
703 }
704 else
705 {
706 if (0 == lstrcmpW(wzDescription, pwzExists))
707 {
708 wzFoundKey = wzKey;
709 }
710 }
711
712 // If we found the key we were looking for, no point in continuing to search.
713 if (wzFoundKey)
714 {
715 break;
716 }
717 }
718 }
719 }
720
721 if (E_NOMOREITEMS == hr)
722 {
723 Assert(!wzFoundKey);
724 hr = S_FALSE;
725 }
726 }
727 else // we're looking a specific SiteId
728 {
729 hr = ::StringCchPrintfW(wzKey, countof(wzKey), L"/LM/W3SVC/%d", iSiteId);
730 ExitOnFailure(hr, "Failed to allocate metabase key string.");
731
732 // if we have an IIsWebServer store the key
733 hr = MetaGetValue(piMetabase, METADATA_MASTER_ROOT_HANDLE, wzKey, &mr);
734
735 if (SUCCEEDED(hr) && NULL != mr.pbMDData && 0 == lstrcmpW(L"IIsWebServer", (LPCWSTR)mr.pbMDData))
736 {
737 wzFoundKey = wzKey;
738 }
739 else if (MD_ERROR_DATA_NOT_FOUND == hr || NULL == mrCompare.pbMDData || NULL == mr.pbMDData)
740 {
741 hr = S_FALSE;
742 }
743 }
744 }
745
746 if (wzFoundKey)
747 {
748 Assert(S_OK == hr);
749
750 hr = ::StringCchCopyW(wzWebBase, cchWebBase, wzFoundKey);
751 ExitOnFailure(hr, "Buffer not larger enough for found base key.");
752 }
753
754LExit:
755 MetaFreeValue(&mr);
756 MetaFreeValue(&mrCompare);
757
758 if (!wzFoundKey && SUCCEEDED(hr))
759 {
760 hr = S_FALSE;
761 }
762
763 return hr;
764}
765
766
767static HRESULT ScaWebFindFreeBase(
768 __in IMSAdminBase* piMetabase,
769 __in_xcount(unknown) SCA_WEB* pswList,
770 __in int iSiteId,
771 __in_z LPCWSTR wzDescription,
772 __out_ecount(cchWebBase) LPWSTR wzWebBase,
773 __in DWORD cchWebBase
774 )
775{
776 Assert(piMetabase);
777
778 HRESULT hr = S_OK;
779
780 WCHAR wzKey[METADATA_MAX_NAME_LEN];
781 WCHAR wzSubkey[METADATA_MAX_NAME_LEN];
782 DWORD* prgdwSubKeys = NULL;
783 DWORD cSubKeys = 128;
784 DWORD cSubKeysFilled = 0;
785
786 DWORD dwKey;
787
788 METADATA_RECORD mr;
789 ::ZeroMemory(&mr, sizeof(METADATA_RECORD));
790 mr.dwMDIdentifier = MD_KEY_TYPE;
791 mr.dwMDAttributes = 0;
792 mr.dwMDUserType = IIS_MD_UT_SERVER;
793 mr.dwMDDataType = STRING_METADATA;
794 mr.dwMDDataLen = 0;
795 mr.pbMDData = NULL;
796
797 if (MSI_NULL_INTEGER == iSiteId || -1 == iSiteId)
798 {
799 prgdwSubKeys = static_cast<DWORD*>(MemAlloc(cSubKeys * sizeof(DWORD), TRUE));
800 ExitOnNull(prgdwSubKeys, hr, E_OUTOFMEMORY, "failed to allocate space for web site keys");
801
802 // loop through the "web keys" looking for the "IIsWebServer" key that matches wzWeb
803 for (DWORD dwIndex = 0; SUCCEEDED(hr); ++dwIndex)
804 {
805 hr = piMetabase->EnumKeys(METADATA_MASTER_ROOT_HANDLE, L"/LM/W3SVC", wzSubkey, dwIndex);
806 if (SUCCEEDED(hr))
807 {
808 hr = ::StringCchPrintfW(wzKey, countof(wzKey), L"/LM/W3SVC/%s", wzSubkey);
809 ExitOnFailure(hr, "Failed remember key.");
810
811 hr = MetaGetValue(piMetabase, METADATA_MASTER_ROOT_HANDLE, wzKey, &mr);
812 if (MD_ERROR_DATA_NOT_FOUND == hr || HRESULT_FROM_WIN32(ERROR_PATH_NOT_FOUND) == hr)
813 {
814 hr = S_FALSE; // didn't find anything, try next one
815 continue;
816 }
817 ExitOnFailure(hr, "Failed to get key from metabase while searching for free web root");
818
819 // if we have a IIsWebServer get the address information
820 if (0 == lstrcmpW(L"IIsWebServer", (LPCWSTR)mr.pbMDData))
821 {
822 if (cSubKeysFilled >= cSubKeys)
823 {
824 cSubKeys = cSubKeys * 2;
825 prgdwSubKeys = static_cast<DWORD*>(MemReAlloc(prgdwSubKeys, cSubKeys * sizeof(DWORD), FALSE));
826 ExitOnNull(prgdwSubKeys, hr, E_OUTOFMEMORY, "failed to allocate space for web site keys");
827 }
828
829 prgdwSubKeys[cSubKeysFilled] = wcstol(wzSubkey, NULL, 10);
830 ++cSubKeysFilled;
831 Sort(prgdwSubKeys, cSubKeysFilled);
832 }
833 }
834 }
835
836 if (E_NOMOREITEMS == hr)
837 {
838 hr = S_OK;
839 }
840 ExitOnFailure(hr, "Failed to find free web root");
841
842 // Add all the webs created in memory.
843 CONST WCHAR *pcchSlash;
844 for (SCA_WEB* psw = pswList; psw; psw = psw->pswNext)
845 {
846 // Don't process webs that don't have a base
847 if (!*psw->wzWebBase)
848 {
849 continue;
850 }
851
852 // find the last slash in the web root because the root # is after it
853 pcchSlash = NULL;
854 for (CONST WCHAR *pcch = psw->wzWebBase; pcch && *pcch; ++pcch)
855 {
856 if (L'/' == *pcch)
857 {
858 pcchSlash = pcch;
859 }
860 }
861 // In case we don't find a slash, error out
862 ExitOnNull(pcchSlash, hr, E_INVALIDARG, "Failed to find a slash in the web root: %ls", psw->wzWebBase);
863
864 prgdwSubKeys[cSubKeysFilled] = wcstol(pcchSlash + 1, NULL, 10);
865 ++cSubKeysFilled;
866 Sort(prgdwSubKeys, cSubKeysFilled);
867
868 if (cSubKeysFilled >= cSubKeys)
869 {
870 cSubKeys = cSubKeys * 2;
871 prgdwSubKeys = static_cast<DWORD*>(MemReAlloc(prgdwSubKeys, cSubKeys * sizeof(DWORD), FALSE));
872 ExitOnNull(prgdwSubKeys, hr, E_OUTOFMEMORY, "failed to allocate space for web site keys");
873 }
874 }
875
876 // Find the lowest free web root.
877 dwKey = (-1 == iSiteId) ? SiteIdFromDescription(wzDescription) : 1;
878 for (DWORD i = 0; i < cSubKeysFilled; ++i)
879 {
880 if (dwKey == prgdwSubKeys[i])
881 {
882 ++dwKey;
883 }
884 else if (dwKey < prgdwSubKeys[i])
885 {
886 break;
887 }
888 }
889 }
890 else
891 {
892 dwKey = iSiteId;
893 }
894
895 hr = ::StringCchPrintfW(wzWebBase, cchWebBase, L"/LM/W3SVC/%u", dwKey);
896 ExitOnFailure(hr, "failed to format web base with key: %u", dwKey);
897
898LExit:
899 MetaFreeValue(&mr);
900
901 if (prgdwSubKeys)
902 {
903 MemFree(prgdwSubKeys);
904 }
905
906 return hr;
907}
908
909
910static HRESULT ScaWebWrite(
911 __in IMSAdminBase* piMetabase,
912 __in SCA_WEB* psw,
913 __in SCA_APPPOOL * psapList)
914{
915 HRESULT hr = S_OK;
916
917 UINT ui = 0;
918 WCHAR wzIP[64];
919 WCHAR wzBindings[1024];
920 WCHAR wzSecureBindings[1024];
921 WCHAR* pcchNext; // used to properly create the MULTI_SZ
922 DWORD cchPcchNext;
923 WCHAR* pcchSecureNext ; // used to properly create the MULTI_SZ
924 DWORD cchPcchSecureNext;
925
926 // if the web root doesn't exist create it
927 if (!psw->fBaseExists)
928 {
929 hr = ScaCreateWeb(piMetabase, psw->wzKey, psw->wzWebBase);
930 ExitOnFailure(hr, "Failed to create web");
931 }
932 else if (psw->iAttributes & SWATTRIB_NOCONFIGUREIFEXISTS) // if we're not supposed to configure existing webs, bail
933 {
934 Assert(psw->fBaseExists);
935
936 hr = S_FALSE;
937 WcaLog(LOGMSG_VERBOSE, "Skipping configuration of existing web: %ls", psw->wzKey);
938 ExitFunction();
939 }
940
941 // put the secure and non-secure bindings together as MULTI_SZs
942 ::ZeroMemory(wzBindings, sizeof(wzBindings));
943 pcchNext = wzBindings;
944 cchPcchNext = countof(wzBindings);
945 ::ZeroMemory(wzSecureBindings, sizeof(wzSecureBindings));
946 pcchSecureNext = wzSecureBindings;
947 cchPcchSecureNext = countof(wzSecureBindings);
948
949 // set the IP address appropriately
950 if (0 == lstrcmpW(psw->swaKey.wzIP, L"*"))
951 {
952 ::ZeroMemory(wzIP, sizeof(wzIP));
953 }
954 else
955 {
956 hr = ::StringCchCopyW(wzIP, countof(wzIP), psw->swaKey.wzIP);
957 ExitOnFailure(hr, "Failed to copy IP string");
958 }
959
960 WCHAR wzBinding[256];
961 hr = ::StringCchPrintfW(wzBinding, countof(wzBinding), L"%s:%d:%s", wzIP, psw->swaKey.iPort, psw->swaKey.wzHeader);
962 ExitOnFailure(hr, "Failed to format IP:Port:Header binding string");
963 if (psw->swaKey.fSecure)
964 {
965 hr = ::StringCchCopyW(pcchSecureNext, cchPcchSecureNext, wzBinding);
966 ExitOnFailure(hr, "Failed to copy binding string to securenext string");
967 pcchSecureNext += lstrlenW(wzBinding) + 1;
968 cchPcchSecureNext -= lstrlenW(wzBinding) + 1;
969 }
970 else
971 {
972 hr = ::StringCchCopyW(pcchNext, cchPcchNext, wzBinding);
973 ExitOnFailure(hr, "Failed to copy binding string to next string");
974 pcchNext += lstrlenW(wzBinding) + 1;
975 cchPcchNext -= lstrlenW(wzBinding) + 1;
976 }
977
978 for (ui = 0; ui < psw->cExtraAddresses; ++ui)
979 {
980 // set the IP address appropriately
981 if (0 == lstrcmpW(psw->swaExtraAddresses[ui].wzIP, L"*"))
982 {
983 ::ZeroMemory(wzIP, sizeof(wzIP));
984 }
985 else
986 {
987 hr = ::StringCchCopyW(wzIP, countof(wzIP), psw->swaExtraAddresses[ui].wzIP);
988 ExitOnFailure(hr, "Failed to copy extra addresses IP to IP string");
989 }
990
991 hr = ::StringCchPrintfW(wzBinding, countof(wzBinding), L"%s:%d:%s", wzIP, psw->swaExtraAddresses[ui].iPort, psw->swaExtraAddresses[ui].wzHeader);
992 ExitOnFailure(hr, "Failed to format IP:Port:Header binding string for extra address");
993 if (psw->swaExtraAddresses[ui].fSecure)
994 {
995 hr = ::StringCchCopyW(pcchSecureNext, cchPcchSecureNext, wzBinding);
996 ExitOnFailure(hr, "Failed to copy binding string to securenext string for extra address");
997 pcchSecureNext += lstrlenW(wzBinding) + 1;
998 cchPcchSecureNext -= lstrlenW(wzBinding) + 1;
999 }
1000 else
1001 {
1002 hr = ::StringCchCopyW(pcchNext, cchPcchNext, wzBinding);
1003 ExitOnFailure(hr, "Failed to copy binding string to next string for extra address");
1004 pcchNext += lstrlenW(wzBinding) + 1;
1005 cchPcchNext -= lstrlenW(wzBinding) + 1;
1006 }
1007 }
1008
1009 // Delete the existing secure bindings metabase value, as having one while SSLCertHash and SSLStoreName aren't both set correctly can result in
1010 // 0x80070520 (ERROR_NO_SUCH_LOGON_SESSION) errors in some situations on IIS7. Clearing this value first and then setting it after the install has completed
1011 // allows the two aforementioned properties to exist in an intermediate state without errors
1012 hr = ScaDeleteMetabaseValue(piMetabase, psw->wzWebBase, L"", MD_SECURE_BINDINGS, MULTISZ_METADATA);
1013 ExitOnFailure(hr, "Failed to temporarily delete secure bindings for Web");
1014
1015 // now write the bindings to the metabase
1016 hr = ScaWriteMetabaseValue(piMetabase, psw->wzWebBase, L"", MD_SERVER_BINDINGS, METADATA_NO_ATTRIBUTES, IIS_MD_UT_SERVER, MULTISZ_METADATA, wzBindings);
1017 ExitOnFailure(hr, "Failed to write server bindings for Web");
1018
1019 // write the target path for the web's directory to the metabase
1020 hr = ScaWriteMetabaseValue(piMetabase, psw->wzWebBase, L"/Root", MD_VR_PATH, METADATA_INHERIT, IIS_MD_UT_FILE, STRING_METADATA, psw->wzDirectory);
1021 ExitOnFailure(hr, "Failed to write virtual root path for Web");
1022
1023 // write the description for the web to the metabase
1024 hr = ScaWriteMetabaseValue(piMetabase, psw->wzWebBase, L"", MD_SERVER_COMMENT, METADATA_INHERIT, IIS_MD_UT_SERVER, STRING_METADATA, psw->wzDescription);
1025 ExitOnFailure(hr, "Failed to write description for Web");
1026
1027 ui = psw->iConnectionTimeout;
1028 if (MSI_NULL_INTEGER != ui)
1029 {
1030 hr = ScaWriteMetabaseValue(piMetabase, psw->wzWebBase, L"", MD_CONNECTION_TIMEOUT, METADATA_NO_ATTRIBUTES, IIS_MD_UT_SERVER, DWORD_METADATA, (LPVOID)((DWORD_PTR)ui));
1031 ExitOnFailure(hr, "Failed to write connection timeout for Web");
1032 }
1033
1034 ui = psw->iState;
1035 if (MSI_NULL_INTEGER != ui)
1036 {
1037 if (2 == ui)
1038 {
1039 ui = 1;
1040 hr = ScaWriteMetabaseValue(piMetabase, psw->wzWebBase, L"", MD_SERVER_AUTOSTART, METADATA_INHERIT, IIS_MD_UT_SERVER, DWORD_METADATA, (LPVOID)((DWORD_PTR)ui));
1041 ExitOnFailure(hr, "Failed to write auto start flag for Web");
1042 ui = 2;
1043 }
1044
1045 if (1 == ui || 2 == ui)
1046 {
1047 ui = 1; // start command
1048 hr = ScaWriteMetabaseValue(piMetabase, psw->wzWebBase, L"", MD_SERVER_COMMAND, METADATA_NO_ATTRIBUTES, IIS_MD_UT_SERVER, DWORD_METADATA, (LPVOID)((DWORD_PTR)ui));
1049 ExitOnFailure(hr, "Failed to start Web");
1050 }
1051 else if (0 == ui)
1052 {
1053 ui = 2; // stop command
1054 hr = ScaWriteMetabaseValue(piMetabase, psw->wzWebBase, L"", MD_SERVER_COMMAND, METADATA_NO_ATTRIBUTES, IIS_MD_UT_SERVER, DWORD_METADATA, (LPVOID)((DWORD_PTR)ui));
1055 ExitOnFailure(hr, "Failed to stop Web");
1056 }
1057 else
1058 {
1059 hr = E_UNEXPECTED;
1060 ExitOnFailure(hr, "Unexpected value for Web State");
1061 }
1062 }
1063
1064 WCHAR wzRootOfWeb[METADATA_MAX_NAME_LEN];
1065 hr = ::StringCchPrintfW(wzRootOfWeb, countof(wzRootOfWeb), L"%s/Root", psw->wzWebBase);
1066 ExitOnFailure(hr, "Failed to allocate WebBase/Root string for root of web");
1067
1068 // write the web dirproperties information
1069 if (psw->fHasProperties)
1070 {
1071 hr = ScaWriteWebDirProperties(piMetabase, wzRootOfWeb, &psw->swp);
1072 ExitOnFailure(hr, "Failed to write web security information to metabase");
1073 }
1074
1075 // write the application information
1076 if (psw->fHasApplication)
1077 {
1078 // On reinstall, we have to uninstall the old application, otherwise a duplicate will be created
1079 if (WcaIsReInstalling(psw->isInstalled, psw->isAction))
1080 {
1081 hr = ScaDeleteApp(piMetabase, wzRootOfWeb);
1082 ExitOnFailure(hr, "Failed to remove application for WebDir as part of a reinstall");
1083 }
1084
1085 hr = ScaWriteWebApplication(piMetabase, wzRootOfWeb, &psw->swapp, psapList);
1086 ExitOnFailure(hr, "Failed to write web application information to metabase");
1087 }
1088
1089 // write the SSL certificate information
1090 if (psw->pswscList)
1091 {
1092 hr = ScaSslCertificateWriteMetabase(piMetabase, psw->wzWebBase, psw->pswscList);
1093 ExitOnFailure(hr, "Failed to write SSL certificates for Web site: %ls", psw->wzKey);
1094 }
1095
1096 hr = ScaWriteMetabaseValue(piMetabase, psw->wzWebBase, L"", MD_SECURE_BINDINGS, METADATA_NO_ATTRIBUTES, IIS_MD_UT_SERVER, MULTISZ_METADATA, wzSecureBindings);
1097 ExitOnFailure(hr, "Failed to write secure bindings for Web");
1098
1099 // write the headers
1100 if (psw->pshhList)
1101 {
1102 hr = ScaWriteHttpHeader(piMetabase, wzRootOfWeb, psw->pshhList);
1103 ExitOnFailure(hr, "Failed to write custom HTTP headers for Web site: %ls", psw->wzKey);
1104 }
1105
1106 // write the errors
1107 if (psw->psweList)
1108 {
1109 hr = ScaWriteWebError(piMetabase, weptWeb, psw->wzWebBase, psw->psweList);
1110 ExitOnFailure(hr, "Failed to write custom web errors for Web site: %ls", psw->wzKey);
1111 }
1112
1113 // write the mimetypes
1114 if (psw->psmm)
1115 {
1116 hr = ScaWriteMimeMap(piMetabase, wzRootOfWeb, psw->psmm);
1117 ExitOnFailure(hr, "Failed to write mimemap for Web site: %ls", psw->wzKey);
1118 }
1119
1120 // write the log information to the metabase
1121 if (psw->fHasLog)
1122 {
1123 hr = ScaWriteWebLog(piMetabase, psw->wzWebBase, &psw->swl);
1124 ExitOnFailure(hr, "Failed to write web log information to metabase");
1125 }
1126
1127LExit:
1128 return hr;
1129}
1130
1131
1132static HRESULT ScaWebRemove(
1133 __in IMSAdminBase* piMetabase,
1134 __in const SCA_WEB* psw
1135 )
1136{
1137 HRESULT hr = S_OK;
1138
1139 // simply remove the root key and everything else is pulled at the same time
1140 hr = ScaDeleteMetabaseKey(piMetabase, psw->wzWebBase, L"");
1141 ExitOnFailure(hr, "Failed to remove web '%ls' from metabase", psw->wzKey);
1142
1143LExit:
1144 return hr;
1145}
1146
1147
1148static DWORD SiteIdFromDescription(
1149 __in_z LPCWSTR wzDescription
1150 )
1151{
1152 LPCWSTR pwz = wzDescription;
1153 DWORD dwSiteId = 0;
1154 while (pwz && *pwz)
1155 {
1156 WCHAR ch = *pwz & 0xdf;
1157 dwSiteId = (dwSiteId * 101) + ch;
1158 ++pwz;
1159 }
1160
1161 return (dwSiteId % INT_MAX) + 1;
1162}
1163
1164
1165// insertion sort
1166static void Sort(
1167 __in_ecount(cArray) DWORD dwArray[],
1168 __in int cArray
1169 )
1170{
1171 int i, j;
1172 DWORD dwData;
1173
1174 for (i = 1; i < cArray; ++i)
1175 {
1176 dwData = dwArray[i];
1177
1178 j = i - 1;
1179 while (0 <= j && dwArray[j] > dwData)
1180 {
1181 dwArray[j + 1] = dwArray[j];
1182 j--;
1183 }
1184
1185 dwArray[j + 1] = dwData;
1186 }
1187}
diff --git a/src/ext/Iis/ca/scaweb.h b/src/ext/Iis/ca/scaweb.h
new file mode 100644
index 00000000..294030b4
--- /dev/null
+++ b/src/ext/Iis/ca/scaweb.h
@@ -0,0 +1,123 @@
1#pragma once
2// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
3
4
5#include "scawebapp.h"
6#include "scawebprop.h"
7#include "scahttpheader.h"
8#include "scaweberr.h"
9#include "scassl.h"
10#include "scaapppool.h"
11#include "scaweblog.h"
12#include "scamimemap.h"
13
14// globals
15#define MAX_ADDRESSES_PER_WEB 10
16
17enum eWebQuery { wqWeb = 1, wqComponent, wqId, wqDescription, wqConnectionTimeout, wqDirectory,
18 wqState, wqAttributes, wqProperties, wqApplication, wqAddress, wqIP, wqPort, wqHeader, wqSecure, wqLog, wqInstalled, wqAction, wqSourcePath, wqTargetPath};
19
20enum eWebAddressQuery { waqAddress = 1, waqWeb, waqIP, waqPort, waqHeader, waqSecure };
21
22enum SCA_WEB_ATTRIBUTES
23{
24 SWATTRIB_NOCONFIGUREIFEXISTS = 2
25};
26
27// structs
28struct SCA_WEB_ADDRESS
29{
30 WCHAR wzKey [MAX_DARWIN_KEY + 1];
31
32 WCHAR wzIP[MAX_DARWIN_COLUMN + 1];
33 int iPort;
34 WCHAR wzHeader[MAX_DARWIN_COLUMN + 1];
35 BOOL fSecure;
36};
37
38struct SCA_WEB
39{
40 // darwin information
41 WCHAR wzKey[MAX_DARWIN_KEY + 1];
42 WCHAR wzComponent[MAX_DARWIN_KEY + 1];
43 BOOL fHasComponent;
44 INSTALLSTATE isInstalled;
45 INSTALLSTATE isAction;
46
47 // metabase information
48 WCHAR wzWebBase[METADATA_MAX_NAME_LEN + 1];
49 BOOL fBaseExists;
50
51 // iis configuation information
52 SCA_WEB_ADDRESS swaKey;
53
54 SCA_WEB_ADDRESS swaExtraAddresses[MAX_ADDRESSES_PER_WEB + 1];
55 DWORD cExtraAddresses;
56
57 WCHAR wzDirectory[MAX_PATH];
58 WCHAR wzDescription[MAX_DARWIN_COLUMN + 1];
59
60 int iState;
61 int iAttributes;
62
63 BOOL fHasProperties;
64 SCA_WEB_PROPERTIES swp;
65
66 BOOL fHasApplication;
67 SCA_WEB_APPLICATION swapp;
68
69 BOOL fHasSecurity;
70 int dwAccessPermissions;
71 int iConnectionTimeout;
72
73 SCA_MIMEMAP* psmm; // mime mappings
74 SCA_WEB_SSL_CERTIFICATE* pswscList;
75 SCA_HTTP_HEADER* pshhList;
76 SCA_WEB_ERROR* psweList;
77
78 BOOL fHasLog;
79 SCA_WEB_LOG swl;
80
81 SCA_WEB* pswNext;
82};
83
84
85// prototypes
86HRESULT ScaWebsRead(
87 __in IMSAdminBase* piMetabase,
88 __in SCA_MIMEMAP** ppsmmList,
89 __in SCA_WEB** ppswList,
90 __in SCA_HTTP_HEADER** pshhList,
91 __in SCA_WEB_ERROR** psweList,
92 __in WCA_WRAPQUERY_HANDLE hUserQuery,
93 __in WCA_WRAPQUERY_HANDLE hWebDirPropQuery,
94 __in WCA_WRAPQUERY_HANDLE hSslCertQuery,
95 __in WCA_WRAPQUERY_HANDLE hWebLogQuery,
96 __in WCA_WRAPQUERY_HANDLE hWebAppQuery,
97 __in WCA_WRAPQUERY_HANDLE hWebAppExtQuery,
98 __inout LPWSTR *ppwzCustomActionData
99 );
100
101HRESULT ScaWebsGetBase(
102 __in IMSAdminBase* piMetabase,
103 __in SCA_WEB* pswList,
104 __in LPCWSTR wzWeb,
105 __out_ecount(cchWebBase) LPWSTR wzWebBase,
106 __in DWORD cchWebBase,
107 __in WCA_WRAPQUERY_HANDLE hWrapQuery
108 );
109
110HRESULT ScaWebsInstall(
111 __in IMSAdminBase* piMetabase,
112 __in SCA_WEB* pswList,
113 __in SCA_APPPOOL * psapList
114 );
115
116HRESULT ScaWebsUninstall(
117 __in IMSAdminBase* piMetabase,
118 __in SCA_WEB* pswList
119 );
120
121void ScaWebsFreeList(
122 __in SCA_WEB* pswHead
123 );
diff --git a/src/ext/Iis/ca/scaweb7.cpp b/src/ext/Iis/ca/scaweb7.cpp
new file mode 100644
index 00000000..3ee781f2
--- /dev/null
+++ b/src/ext/Iis/ca/scaweb7.cpp
@@ -0,0 +1,953 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3#include "precomp.h"
4
5//Adding this because delivery doesn't have the updated specstrings.h that windows build does
6#ifndef __in_xcount
7#define __in_xcount(size)
8#endif
9
10// prototypes for private helper functions
11static SCA_WEB7* NewWeb7();
12static SCA_WEB7* AddWebToList7(
13 __in SCA_WEB7* pswList,
14 __in SCA_WEB7* psw
15 );
16
17static HRESULT ScaWebFindBase7(
18 __in SCA_WEB7* pswList,
19 LPCWSTR wzDescription
20 );
21
22static HRESULT ScaWebWrite7(
23 __in SCA_WEB7* psw,
24 __in SCA_APPPOOL * psapList
25 );
26
27static HRESULT ScaWebRemove7(__in const SCA_WEB7* psw);
28
29
30HRESULT ScaWebsRead7(
31 __in SCA_WEB7** ppswList,
32 __in SCA_HTTP_HEADER** ppshhList,
33 __in SCA_WEB_ERROR** ppsweList,
34 __in WCA_WRAPQUERY_HANDLE hUserQuery,
35 __in WCA_WRAPQUERY_HANDLE hWebDirPropQuery,
36 __in WCA_WRAPQUERY_HANDLE hSslCertQuery,
37 __in WCA_WRAPQUERY_HANDLE hWebLogQuery,
38 __in WCA_WRAPQUERY_HANDLE hWebAppQuery,
39 __in WCA_WRAPQUERY_HANDLE hWebAppExtQuery,
40 __inout LPWSTR *ppwzCustomActionData
41 )
42{
43 Assert(ppswList);
44 WcaLog(LOGMSG_VERBOSE, "Entering ScaWebsRead7()");
45
46 HRESULT hr = S_OK;
47
48 MSIHANDLE hRec;
49 MSIHANDLE hRecAddresses;
50
51 WCA_WRAPQUERY_HANDLE hQueryWebSite = NULL;
52 WCA_WRAPQUERY_HANDLE hQueryWebAddress = NULL;
53
54 SCA_WEB7* psw = NULL;
55 LPWSTR pwzData = NULL;
56
57 DWORD dwLen = 0;
58 errno_t error = EINVAL;
59
60 // check to see what tables are available
61 hr = WcaBeginUnwrapQuery(&hQueryWebSite, ppwzCustomActionData);
62 ExitOnFailure(hr, "Failed to unwrap query for ScaWebsRead");
63
64 hr = WcaBeginUnwrapQuery(&hQueryWebAddress, ppwzCustomActionData);
65 ExitOnFailure(hr, "Failed to unwrap query for ScaWebsRead");
66
67
68 if (0 == WcaGetQueryRecords(hQueryWebSite) || 0 == WcaGetQueryRecords(hQueryWebAddress))
69 {
70 WcaLog(LOGMSG_VERBOSE, "Required tables not present");
71 ExitFunction1(hr = S_FALSE);
72 }
73
74 // loop through all the webs
75 while (S_OK == (hr = WcaFetchWrappedRecord(hQueryWebSite, &hRec)))
76 {
77 psw = NewWeb7();
78 if (!psw)
79 {
80 hr = E_OUTOFMEMORY;
81 break;
82 }
83
84 // get the darwin information
85 hr = WcaGetRecordString(hRec, wqWeb, &pwzData);
86 ExitOnFailure(hr, "Failed to get Web");
87 hr = ::StringCchCopyW(psw->wzKey, countof(psw->wzKey), pwzData);
88 ExitOnFailure(hr, "Failed to copy key string to web object");
89
90 // get component install state
91 hr = WcaGetRecordString(hRec, wqComponent, &pwzData);
92 ExitOnFailure(hr, "Failed to get Component for Web");
93 hr = ::StringCchCopyW(psw->wzComponent, countof(psw->wzComponent), pwzData);
94 ExitOnFailure(hr, "Failed to copy component string to web object");
95 if (*(psw->wzComponent))
96 {
97 psw->fHasComponent = TRUE;
98
99 hr = WcaGetRecordInteger(hRec, wqInstalled, (int *)&psw->isInstalled);
100 ExitOnFailure(hr, "Failed to get web Component's installed state");
101
102 WcaGetRecordInteger(hRec, wqAction, (int *)&psw->isAction);
103 ExitOnFailure(hr, "Failed to get web Component's action state");
104 }
105
106 // Get the web's description.
107 hr = WcaGetRecordString(hRec, wqDescription, &pwzData);
108 ExitOnFailure(hr, "Failed to get Description for Web");
109 hr = ::StringCchCopyW(psw->wzDescription, countof(psw->wzDescription), pwzData);
110 ExitOnFailure(hr, "Failed to copy description string to web object");
111
112 //get web's site Id
113 hr = WcaGetRecordInteger(hRec, wqId, &psw->iSiteId);
114 ExitOnFailure(hr, "Failed to get SiteId for Web");
115
116 // get the web's key address (Bindings)
117 hr = WcaGetRecordString(hRec, wqAddress, &pwzData);
118 ExitOnFailure(hr, "Failed to get Address for Web");
119 hr = ::StringCchCopyW(psw->swaBinding.wzKey, countof(psw->swaBinding.wzKey), pwzData);
120 ExitOnFailure(hr, "Failed to copy web binding key");
121
122 hr = WcaGetRecordString(hRec, wqIP, &pwzData);
123 ExitOnFailure(hr, "Failed to get IP for Web");
124 hr = ::StringCchCopyW(psw->swaBinding.wzIP, countof(psw->swaBinding.wzIP), pwzData);
125 ExitOnFailure(hr, "Failed to copy web IP");
126
127 hr = WcaGetRecordString(hRec, wqPort, &pwzData);
128 ExitOnFailure(hr, "Failed to get Web Address port");
129 psw->swaBinding.iPort = wcstol(pwzData, NULL, 10);
130
131 hr = WcaGetRecordString(hRec, wqHeader, &pwzData);
132 ExitOnFailure(hr, "Failed to get Header for Web");
133 hr = ::StringCchCopyW(psw->swaBinding.wzHeader, countof(psw->swaBinding.wzHeader), pwzData);
134 ExitOnFailure(hr, "Failed to copy web header");
135
136 hr = WcaGetRecordInteger(hRec, wqSecure, &psw->swaBinding.fSecure);
137 ExitOnFailure(hr, "Failed to get if Web is secure");
138 if (S_FALSE == hr)
139 {
140 psw->swaBinding.fSecure = FALSE;
141 }
142
143 // look to see if site exists
144 dwLen = METADATA_MAX_NAME_LEN;
145 hr = ScaWebFindBase7(*ppswList, psw->wzDescription);
146
147 // If we didn't find a web in memory, ignore it - during execute CA
148 // if the site truly does not exist then there will be an error.
149 if (S_OK == hr)
150 {
151 // site exists in config
152 psw->fBaseExists = TRUE;
153 }
154 else if (HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND) == hr)
155 {
156 hr = S_OK;
157
158 // site does not exists in config
159 psw->fBaseExists = FALSE;
160 }
161 ExitOnFailure(hr, "Failed to find web site");
162
163 // get any extra web addresses
164 WcaFetchWrappedReset(hQueryWebAddress);
165
166 while (S_OK == (hr = WcaFetchWrappedRecordWhereString(hQueryWebAddress, 2, psw->wzKey, &hRecAddresses)))
167 {
168 if (MAX_ADDRESSES_PER_WEB <= psw->cExtraAddresses)
169 {
170 hr = HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER);
171 ExitOnFailure(hr, "Failure to get more extra web addresses, max exceeded.");
172 }
173
174 hr = WcaGetRecordString(hRecAddresses, waqAddress, &pwzData);
175 ExitOnFailure(hr, "Failed to get extra web Address");
176
177 // if this isn't the key address add it
178 if (0 != lstrcmpW(pwzData, psw->swaBinding.wzKey))
179 {
180 hr = ::StringCchCopyW(psw->swaExtraAddresses[psw->cExtraAddresses].wzKey,
181 countof(psw->swaExtraAddresses[psw->cExtraAddresses].wzKey), pwzData);
182 ExitOnFailure(hr, "Failed to copy web binding key");
183
184 hr = WcaGetRecordString(hRecAddresses, waqIP, &pwzData);
185 ExitOnFailure(hr, "Failed to get extra web IP");
186 hr = ::StringCchCopyW(psw->swaExtraAddresses[psw->cExtraAddresses].wzIP, countof(psw->swaExtraAddresses[psw->cExtraAddresses].wzIP), pwzData);
187 ExitOnFailure(hr, "Failed to copy web binding IP");
188
189 hr = WcaGetRecordString(hRecAddresses, waqPort, &pwzData);
190 ExitOnFailure(hr, "Failed to get port for extra web IP");
191 psw->swaExtraAddresses[psw->cExtraAddresses].iPort= wcstol(pwzData, NULL, 10);
192
193 // errno is set to ERANGE if overflow or underflow occurs
194 _get_errno(&error);
195
196 if (ERANGE == error)
197 {
198 hr = E_INVALIDARG;
199 ExitOnFailure(hr, "Failed to convert web Port address");
200 }
201
202 hr = WcaGetRecordString(hRecAddresses, waqHeader, &pwzData);
203 ExitOnFailure(hr, "Failed to get header for extra web IP");
204 hr = ::StringCchCopyW(psw->swaExtraAddresses[psw->cExtraAddresses].wzHeader, countof(psw->swaExtraAddresses[psw->cExtraAddresses].wzHeader), pwzData);
205 ExitOnFailure(hr, "Failed to copy web binding header");
206
207 hr = WcaGetRecordInteger(hRecAddresses, waqSecure, &psw->swaExtraAddresses[psw->cExtraAddresses].fSecure);
208 ExitOnFailure(hr, "Failed to get if secure extra web IP");
209 if (S_FALSE == hr)
210 {
211 psw->swaExtraAddresses[psw->cExtraAddresses].fSecure = FALSE;
212 }
213
214 ++psw->cExtraAddresses;
215 }
216 }
217
218 if (E_NOMOREITEMS == hr)
219 {
220 hr = S_OK;
221 }
222 ExitOnFailure(hr, "Failure occured while getting extra web addresses");
223
224 //
225 // Connection time out
226 //
227 hr = WcaGetRecordInteger(hRec, wqConnectionTimeout, &psw->iConnectionTimeout);
228 ExitOnFailure(hr, "Failed to get connection timeout for Web");
229
230 if (psw->fHasComponent) // If we're installing it, it needs a dir
231 {
232 // get the web's directory
233 if (INSTALLSTATE_SOURCE == psw->isAction)
234 {
235 hr = WcaGetRecordString(hRec, wqSourcePath, &pwzData);
236 }
237 else
238 {
239 hr = WcaGetRecordString(hRec, wqTargetPath, &pwzData);
240 }
241 ExitOnFailure(hr, "Failed to get Source/TargetPath for Directory");
242
243 dwLen = lstrlenW(pwzData);
244 // remove trailing backslash
245 if (dwLen > 0 && pwzData[dwLen-1] == L'\\')
246 {
247 pwzData[dwLen-1] = 0;
248 }
249 hr = ::StringCchCopyW(psw->wzDirectory, countof(psw->wzDirectory), pwzData);
250 ExitOnFailure(hr, "Failed to copy web dir: '%ls'", pwzData);
251
252 }
253
254 hr = WcaGetRecordInteger(hRec, wqState, &psw->iState);
255 ExitOnFailure(hr, "Failed to get state for Web");
256
257 hr = WcaGetRecordInteger(hRec, wqAttributes, &psw->iAttributes);
258 ExitOnFailure(hr, "Failed to get attributes for Web");
259
260 // get the dir properties for this web
261 hr = WcaGetRecordString(hRec, wqProperties, &pwzData);
262 ExitOnFailure(hr, "Failed to get directory properties for Web");
263 if (*pwzData)
264 {
265 hr = ScaGetWebDirProperties(pwzData, hUserQuery, hWebDirPropQuery, &psw->swp);
266 ExitOnFailure(hr, "Failed to get directory properties for Web");
267
268 psw->fHasProperties = TRUE;
269 }
270
271 // get the application information for this web
272 hr = WcaGetRecordString(hRec, wqApplication, &pwzData);
273 ExitOnFailure(hr, "Failed to get application identifier for Web");
274 if (*pwzData)
275 {
276 hr = ScaGetWebApplication(NULL, pwzData, hWebAppQuery, hWebAppExtQuery, &psw->swapp);
277 ExitOnFailure(hr, "Failed to get application for Web");
278
279 psw->fHasApplication = TRUE;
280 }
281
282 // get the SSL certificates
283 hr = ScaSslCertificateRead(psw->wzKey, hSslCertQuery, &(psw->pswscList));
284 ExitOnFailure(hr, "Failed to get SSL Certificates.");
285
286 // get the custom headers
287 if (*ppshhList)
288 {
289 hr = ScaGetHttpHeader(hhptWeb, psw->wzKey, ppshhList, &(psw->pshhList));
290 ExitOnFailure(hr, "Failed to get Custom HTTP Headers");
291 }
292
293 // get the errors
294 if (*ppsweList)
295 {
296 hr = ScaGetWebError(weptWeb, psw->wzKey, ppsweList, &(psw->psweList));
297 ExitOnFailure(hr, "Failed to get Custom Errors");
298 }
299
300 // get the log information for this web
301 hr = WcaGetRecordString(hRec, wqLog, &pwzData);
302 ExitOnFailure(hr, "Failed to get log identifier for Web");
303 if (*pwzData)
304 {
305 hr = ScaGetWebLog7(pwzData, hWebLogQuery, &psw->swl);
306 ExitOnFailure(hr, "Failed to get Log for Web.");
307 psw->fHasLog = TRUE;
308 }
309
310 *ppswList = AddWebToList7(*ppswList, psw);
311 psw = NULL; // set the web NULL so it doesn't accidentally get freed below
312 }
313
314 if (E_NOMOREITEMS == hr)
315 {
316 hr = S_OK;
317 }
318
319LExit:
320 // if anything was left over after an error clean it all up
321 WcaFinishUnwrapQuery(hQueryWebSite);
322 WcaFinishUnwrapQuery(hQueryWebAddress);
323
324 ScaWebsFreeList7(psw);
325
326 ReleaseStr(pwzData);
327 WcaLog(LOGMSG_VERBOSE, "Exiting ScaWebsRead7()");
328
329 return hr;
330}
331
332BOOL CompareBinding(
333 __in IAppHostElement* pBinding,
334 __in LPVOID pContext
335 )
336{
337 BOOL fFound = FALSE;
338 HRESULT hr = S_OK;
339 LPWSTR pwzBindingInfo = NULL;
340 SCA_WEB7* psw = (SCA_WEB7*)pContext;
341
342 hr = Iis7GetPropertyString(pBinding, IIS_CONFIG_BINDINGINFO, &pwzBindingInfo);
343 ExitOnFailure(hr, "Failed to get bindinginfo for binding element");
344
345 LPWSTR pwzExists = pwzBindingInfo;
346 // Break down the address into its constituent parts (IP:Port:Header).
347 // Taken from IIS6 CA code for compatibility
348 while (S_OK == hr && *pwzExists)
349 {
350 LPCWSTR pwzIPExists = pwzExists;
351 pwzExists = const_cast<LPWSTR>(wcsstr(pwzIPExists, L":"));
352 if (NULL == pwzExists)
353 {
354 ExitFunction();
355 }
356 *pwzExists = L'\0';
357
358 LPCWSTR pwzPortExists = pwzExists + 1;
359 pwzExists = const_cast<LPWSTR>(wcsstr(pwzPortExists, L":"));
360 if (NULL == pwzExists)
361 {
362 ExitFunction();
363 }
364 *pwzExists = L'\0';
365 int iPortExists = wcstol(pwzPortExists, NULL, 10);
366
367 LPCWSTR pwzHeaderExists = pwzExists + 1;
368
369 BOOL fIpMatches = (0 == lstrcmpW(psw->swaBinding.wzIP, pwzIPExists)); // Explicit IP match
370 fIpMatches |= (0 == lstrcmpW(psw->swaBinding.wzIP, L"*")); // Authored * matches any IP
371 fIpMatches |= ('\0' != psw->swaBinding.wzIP) && // Unauthored IP
372 (0 == lstrcmpW(pwzIPExists, L"*")); // matches the All Unassigned IP : '*'
373
374 // compare the passed in address with the address listed for this web
375 if (fIpMatches && psw->swaBinding.iPort == iPortExists &&
376 0 == lstrcmpW(psw->swaBinding.wzHeader, pwzHeaderExists))
377 {
378 fFound = TRUE;
379 break;
380 }
381
382 // move to the next block of data, this may move beyond the available
383 // data and exit the while loop above.
384 pwzExists = const_cast<LPWSTR>(pwzHeaderExists + lstrlenW(pwzHeaderExists));
385 }
386
387LExit:
388 WcaLog(LOGMSG_VERBOSE, "Site with binding %ls %s a match", pwzBindingInfo, fFound ? "is" : "is not");
389 ReleaseNullStr(pwzBindingInfo);
390 return fFound;
391}
392
393BOOL EnumSiteCompareBinding(
394 __in IAppHostElement* pSite,
395 __in LPVOID pContext
396 )
397{
398 BOOL fFound = FALSE;
399 HRESULT hr = S_OK;
400 SCA_WEB7* psw = (SCA_WEB7*)pContext;
401 IAppHostChildElementCollection *pSiteChildren = NULL;
402 IAppHostElement *pBindings = NULL;
403 IAppHostElementCollection *pBindingsCollection = NULL;
404 IAppHostElement *pBinding = NULL;
405 VARIANT vtProp;
406 VariantInit(&vtProp);
407
408 hr = pSite->get_ChildElements(&pSiteChildren);
409 ExitOnFailure(hr, "Failed get site child elements collection");
410
411 vtProp.vt = VT_BSTR;
412 vtProp.bstrVal = ::SysAllocString(IIS_CONFIG_BINDINGS);
413 hr = pSiteChildren->get_Item(vtProp, &pBindings);
414 ExitOnFailure(hr, "Failed get bindings element");
415
416 hr = pBindings->get_Collection(&pBindingsCollection);
417 ExitOnFailure(hr, "Failed get bindings collection");
418
419 WcaLog(LOGMSG_VERBOSE, "Searching for site with binding %ls:%d:%ls", psw->swaBinding.wzIP, psw->swaBinding.iPort, psw->swaBinding.wzHeader);
420
421 hr = Iis7EnumAppHostElements(pBindingsCollection, CompareBinding, psw, &pBinding, NULL);
422 ExitOnFailure(hr, "Failed search bindings collection");
423
424 fFound = NULL != pBinding;
425LExit:
426 VariantClear(&vtProp);
427 ReleaseNullObject(pSiteChildren);
428 ReleaseNullObject(pBindings);
429 ReleaseNullObject(pBindingsCollection);
430 ReleaseNullObject(pBinding);
431 return fFound;
432}
433
434HRESULT ScaWebSearch7(
435 __in SCA_WEB7* psw,
436 __deref_out_z_opt LPWSTR* pswWeb,
437 __out_opt BOOL* pfFound
438 )
439{
440 HRESULT hr = S_OK;
441 BOOL fInitializedCom = FALSE;
442 BSTR bstrSites = NULL;
443 BSTR bstrAppHostRoot = NULL;
444 IAppHostAdminManager *pAdminMgr = NULL;
445 IAppHostElement *pSites = NULL;
446 IAppHostElementCollection *pCollection = NULL;
447 IAppHostElement *pSite = NULL;
448
449 if (NULL != pswWeb)
450 {
451 ReleaseNullStr(*pswWeb);
452 }
453
454 if (NULL != pfFound)
455 {
456 *pfFound = FALSE;
457 }
458
459 hr = ::CoInitialize(NULL);
460 ExitOnFailure(hr, "Failed to initialize COM");
461 fInitializedCom = TRUE;
462
463 hr = CoCreateInstance(__uuidof(AppHostAdminManager), NULL, CLSCTX_INPROC_SERVER, __uuidof(IAppHostAdminManager), reinterpret_cast<void**> (&pAdminMgr));
464 if (REGDB_E_CLASSNOTREG == hr)
465 {
466 WcaLog(LOGMSG_VERBOSE, "AppHostAdminManager was not registered, cannot find site.");
467 hr = S_OK;
468 ExitFunction();
469 }
470 ExitOnFailure(hr, "Failed to CoCreate IAppHostAdminManager");
471
472 bstrSites = ::SysAllocString(IIS_CONFIG_SITES_SECTION);
473 ExitOnNull(bstrSites, hr, E_OUTOFMEMORY, "Failed to allocate sites string.");
474
475 bstrAppHostRoot = ::SysAllocString(IIS_CONFIG_APPHOST_ROOT);
476 ExitOnNull(bstrAppHostRoot, hr, E_OUTOFMEMORY, "Failed to allocate host root string.");
477
478 hr = pAdminMgr->GetAdminSection(bstrSites, bstrAppHostRoot, &pSites);
479 ExitOnFailure(hr, "Failed get sites section");
480 ExitOnNull(pSites, hr, ERROR_FILE_NOT_FOUND, "Failed get sites section object");
481
482 hr = pSites->get_Collection(&pCollection);
483 ExitOnFailure(hr, "Failed get sites collection");
484
485 // not explicitly doing a Description search
486 if (-1 != psw->iSiteId)
487 {
488 if (MSI_NULL_INTEGER == psw->iSiteId)
489 {
490 // Enumerate sites & determine if the binding matches
491 hr = Iis7EnumAppHostElements(pCollection, EnumSiteCompareBinding, psw, &pSite, NULL);
492 ExitOnFailure(hr, "Failed locate site by ID");
493 }
494 else
495 {
496 // Find a site with ID matches
497 hr = Iis7FindAppHostElementInteger(pCollection, IIS_CONFIG_SITE, IIS_CONFIG_ID, psw->iSiteId, &pSite, NULL);
498 ExitOnFailure(hr, "Failed locate site by ID");
499 }
500 }
501
502 if (NULL == pSite)
503 {
504 // Find a site with Name that matches
505 hr = Iis7FindAppHostElementString(pCollection, IIS_CONFIG_SITE, IIS_CONFIG_NAME, psw->wzDescription, &pSite, NULL);
506 ExitOnFailure(hr, "Failed locate site by ID");
507 }
508
509 if (NULL != pSite)
510 {
511 if (NULL != pfFound)
512 {
513 *pfFound = TRUE;
514 }
515
516 if (NULL != pswWeb)
517 {
518 // We found a site, return its description
519 hr = Iis7GetPropertyString(pSite, IIS_CONFIG_NAME, pswWeb);
520 ExitOnFailure(hr, "Failed get site name");
521 }
522 }
523LExit:
524 ReleaseNullObject(pAdminMgr);
525 ReleaseNullObject(pSites);
526 ReleaseNullObject(pCollection);
527 ReleaseNullObject(pSite);
528 ReleaseBSTR(bstrAppHostRoot);
529 ReleaseBSTR(bstrSites);
530
531 if (fInitializedCom)
532 {
533 ::CoUninitialize();
534 }
535 return hr;
536}
537
538
539HRESULT ScaWebsGetBase7(
540 __in SCA_WEB7* pswList,
541 __in LPCWSTR pswWebKey,
542 __out_ecount(cchDest) LPWSTR pswWeb,
543 __in DWORD_PTR cchDest
544 )
545{
546 HRESULT hr = S_OK;
547 BOOL fFound = FALSE;
548 SCA_WEB7* psw = pswList;
549 LPWSTR wzSiteName = NULL;
550
551 *pswWeb = '/0';
552
553 //looking for psw->wzKey == pswWebKey
554 while(psw)
555 {
556 if (0 == wcscmp(pswWebKey, psw->wzKey))
557 {
558 fFound = TRUE;
559 break;
560 }
561 psw = psw->pswNext;
562 }
563
564 if (!fFound)
565 {
566 ExitFunction1(hr = S_FALSE);
567 }
568
569 // Search if we're not installing the site
570 if (!psw->fHasComponent || (psw->iAttributes & SWATTRIB_NOCONFIGUREIFEXISTS))
571 {
572 // We are not installing this website. Search for it in IIS config
573 hr = ScaWebSearch7(psw, &wzSiteName, NULL);
574 ExitOnFailure(hr, "Failed to search for Website");
575
576 if (NULL != wzSiteName)
577 {
578 hr = ::StringCchCopyW(pswWeb, cchDest, wzSiteName);
579 ExitOnFailure(hr, "Failed to set Website description for located Website");
580 }
581 }
582
583 if ('/0' == *pswWeb)
584 {
585 WcaLog(LOGMSG_VERBOSE, "Could not find Web: %ls, defaulting to %ls", psw->wzKey, psw->wzDescription);
586 // Default to the provided description, the Exec CA will locate by description
587 hr = ::StringCchCopyW(pswWeb, cchDest, psw->wzDescription);
588 ExitOnFailure(hr, "Failed to set Website description to default");
589 }
590LExit:
591 ReleaseNullStr(wzSiteName);
592 return hr;
593}
594
595HRESULT ScaWebsInstall7(
596 __in SCA_WEB7* pswList,
597 __in SCA_APPPOOL * psapList
598 )
599{
600 HRESULT hr = S_OK;
601 SCA_WEB7* psw = pswList;
602
603 while (psw)
604 {
605 // if we are installing the web site
606 if (psw->fHasComponent && WcaIsInstalling(psw->isInstalled, psw->isAction))
607 {
608 hr = ScaWebWrite7(psw, psapList);
609 ExitOnFailure(hr, "failed to write web '%ls' to metabase", psw->wzKey);
610 }
611
612 psw = psw->pswNext;
613 }
614
615LExit:
616 return hr;
617}
618
619
620HRESULT ScaWebsUninstall7(
621 __in SCA_WEB7* pswList
622 )
623{
624 HRESULT hr = S_OK;
625 SCA_WEB7* psw = pswList;
626
627 while (psw)
628 {
629 if (psw->fHasComponent && WcaIsUninstalling(psw->isInstalled, psw->isAction))
630 {
631 // If someone
632 hr = ScaWebRemove7(psw);
633 ExitOnFailure(hr, "Failed to remove web '%ls' ", psw->wzKey);
634 }
635
636 psw = psw->pswNext;
637 }
638
639LExit:
640 return hr;
641}
642
643
644void ScaWebsFreeList7(__in SCA_WEB7* pswList)
645{
646 SCA_WEB7* pswDelete = pswList;
647 while (pswList)
648 {
649 pswDelete = pswList;
650 pswList = pswList->pswNext;
651
652 // Free the SSL, headers and errors list first
653 ScaSslCertificateFreeList(pswDelete->pswscList);
654 ScaHttpHeaderFreeList(pswDelete->pshhList);
655 ScaWebErrorFreeList(pswDelete->psweList);
656
657 MemFree(pswDelete);
658 }
659}
660
661
662// private helper functions
663
664static SCA_WEB7* NewWeb7()
665{
666 SCA_WEB7* psw = (SCA_WEB7*)MemAlloc(sizeof(SCA_WEB7), TRUE);
667 Assert(psw);
668 return psw;
669}
670
671
672static SCA_WEB7* AddWebToList7(
673 __in SCA_WEB7* pswList,
674 __in SCA_WEB7* psw
675 )
676{
677 if (pswList)
678 {
679 SCA_WEB7* pswTemp = pswList;
680 while (pswTemp->pswNext)
681 {
682 pswTemp = pswTemp->pswNext;
683 }
684
685 pswTemp->pswNext = psw;
686 }
687 else
688 {
689 pswList = psw;
690 }
691
692 return pswList;
693}
694
695
696static HRESULT ScaWebFindBase7(
697 __in SCA_WEB7* pswList,
698 __in_z LPCWSTR wzDescription
699 )
700{
701 HRESULT hr = S_OK;
702 BOOL fFound = FALSE;
703
704 // try to find the web in memory first
705 for (SCA_WEB7* psw = pswList; psw; psw = psw->pswNext)
706 {
707 if (0 == wcscmp(wzDescription, psw->wzDescription))
708 {
709 fFound = TRUE;
710 break;
711 }
712 }
713
714 if (!fFound)
715 {
716 hr = HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND);
717 }
718
719 return hr;
720}
721
722
723static HRESULT ScaWebWrite7(
724 __in SCA_WEB7* psw,
725 __in SCA_APPPOOL * psapList
726 )
727{
728 HRESULT hr = S_OK;
729
730 BOOL fExists = FALSE;
731 UINT ui = 0;
732 WCHAR wzIP[64];
733 WCHAR wzBinding[1024];
734 WCHAR wzAppPoolName[MAX_PATH];
735
736 //
737 // determine if site must be new
738 //
739 if (psw->iAttributes & SWATTRIB_NOCONFIGUREIFEXISTS)
740 {
741 // Check if site already exists.
742 hr = ScaWebSearch7(psw, NULL, &fExists);
743 ExitOnFailure(hr, "Failed to search for web: %ls", psw->wzKey);
744
745 if (fExists)
746 {
747 hr = S_FALSE;
748 WcaLog(LOGMSG_VERBOSE, "Skipping configuration of existing web: %ls", psw->wzKey);
749 ExitFunction();
750 }
751 }
752
753 //create a site
754 hr = ScaWriteConfigID(IIS_SITE);
755 ExitOnFailure(hr, "Failed write site ID");
756
757 hr = ScaWriteConfigID(IIS_CREATE);
758 ExitOnFailure(hr, "Failed write site ID create action");
759
760 //Site Name
761 hr = ScaWriteConfigString(psw->wzDescription); //Site Name
762 ExitOnFailure(hr, "Failed write site desc");
763
764 //Site Id -- value is MSI_NULL_INTEGER if not set in WIX
765 hr = ScaWriteConfigInteger(psw->iSiteId); //SiteID
766 ExitOnFailure(hr, "Failed write site id value");
767
768 //Site Auto Start -- value is MSI_NULL_INTEGER if not set in WIX
769 hr = ScaWriteConfigInteger(psw->iState); // serverAutoStart
770 ExitOnFailure(hr, "Failed write site autostart");
771
772 hr = ScaWriteConfigInteger(psw->iConnectionTimeout); //limits/connectionTimeout
773 ExitOnFailure(hr, "Failed write site timeout");
774
775 //create default application
776 hr = ScaWriteConfigID(IIS_APPLICATION);
777 ExitOnFailure(hr, "Failed write app ID");
778 hr = ScaWriteConfigID(IIS_CREATE);
779 ExitOnFailure(hr, "Failed write app action ID");
780 hr = ScaWriteConfigString(psw->wzDescription); //site name key
781 ExitOnFailure(hr, "Failed write app desc");
782 hr = ScaWriteConfigString(L"/"); // App Path (default)
783 ExitOnFailure(hr, "Failed write app def path /");
784
785 if (psw->fHasApplication && *psw->swapp.wzAppPool)
786 {
787 hr = ScaFindAppPool7(psw->swapp.wzAppPool, wzAppPoolName, countof(wzAppPoolName), psapList);
788 ExitOnFailure(hr, "Failed to read app pool from application");
789
790 hr = ScaWriteConfigString(wzAppPoolName);
791 ExitOnFailure(hr, "Failed write app appPool");
792 }
793 else
794 {
795 hr = ScaWriteConfigString(L"");
796 ExitOnFailure(hr, "Failed write app appPool");
797 }
798
799 //create vdir for default application
800 hr = ScaWriteConfigID(IIS_VDIR);
801 ExitOnFailure(hr, "Failed write vdir ID");
802 hr = ScaWriteConfigID(IIS_CREATE);
803 ExitOnFailure(hr, "Failed write vdir action");
804 hr = ScaWriteConfigString(psw->wzDescription); //site name key
805 ExitOnFailure(hr, "Failed write vdir desc");
806 hr = ScaWriteConfigString(L"/"); //vdir path (default)
807 ExitOnFailure(hr, "Failed write vdir app");
808 hr = ScaWriteConfigString(psw->wzDirectory); //physical dir
809 ExitOnFailure(hr, "Failed write vdir dir");
810
811 //create bindings for site
812 hr = ScaWriteConfigID(IIS_BINDING);
813 ExitOnFailure(hr, "Failed write binding ID");
814 hr = ScaWriteConfigID(IIS_CREATE);
815 ExitOnFailure(hr, "Failed write binding action ID");
816 hr = ScaWriteConfigString(psw->wzDescription); //site name key
817 ExitOnFailure(hr, "Failed write binding site key");
818
819 if (psw->swaBinding.fSecure)
820 {
821 hr = ScaWriteConfigString(L"https"); // binding protocol
822 ExitOnFailure(hr, "Failed write binding https");
823 }
824 else
825 {
826 hr = ScaWriteConfigString(L"http"); // binding protocol
827 ExitOnFailure(hr, "Failed write binding http");
828 }
829
830 // set the IP address appropriately
831 if (0 == wcscmp(psw->swaBinding.wzIP, L""))
832 {
833 hr = ::StringCchCopyW(wzIP, countof(wzIP), L"*"); // if no IP specified = add *
834 }
835 else
836 {
837#pragma prefast(suppress:26037, "Source string is null terminated - it is populated as target of ::StringCchCopyW")
838 hr = ::StringCchCopyW(wzIP, countof(wzIP), psw->swaBinding.wzIP); // else leave untouched
839 }
840 ExitOnFailure(hr, "Failed to copy IP string");
841
842 hr = ::StringCchPrintfW(wzBinding, countof(wzBinding), L"%s:%d:%s", wzIP, psw->swaBinding.iPort, psw->swaBinding.wzHeader);
843 ExitOnFailure(hr, "Failed to format IP:Port:Header binding string");
844
845 // write bindings CAData
846 hr = ScaWriteConfigString(wzBinding) ; //binding info
847 ExitOnFailure(hr, "Failed to create web bindings");
848
849 for (ui = 0; (ui < MAX_ADDRESSES_PER_WEB) && (ui < psw->cExtraAddresses); ++ui)
850 {
851 // set the IP address appropriately
852 if (0 == wcscmp(psw->swaExtraAddresses[ui].wzIP, L""))
853 {
854 hr = ::StringCchCopyW(wzIP, countof(wzIP), L"*"); // if no IP specified = add *
855 }
856 else
857 {
858#pragma prefast(suppress:26037, "Source string is null terminated - it is populated as target of ::StringCchCopyW")
859 hr = ::StringCchCopyW(wzIP, countof(wzIP), psw->swaExtraAddresses[ui].wzIP); //else leave untouched
860 }
861 ExitOnFailure(hr, "Failed to copy web IP string");
862
863 hr = ::StringCchPrintfW(wzBinding, countof(wzBinding), L"%s:%d:%s", wzIP, psw->swaExtraAddresses[ui].iPort, psw->swaExtraAddresses[ui].wzHeader);
864 ExitOnFailure(hr, "Failed to copy web IP");
865
866 //create bindings for site
867 hr = ScaWriteConfigID(IIS_BINDING);
868 ExitOnFailure(hr, "Failed write binding ID");
869 hr = ScaWriteConfigID(IIS_CREATE);
870 ExitOnFailure(hr, "Failed write binding action");
871 hr = ScaWriteConfigString(psw->wzDescription); //site name key
872 ExitOnFailure(hr, "Failed write binding web name");
873
874 if (psw->swaExtraAddresses[ui].fSecure)
875 {
876 hr = ScaWriteConfigString(L"https"); // binding protocol
877 }
878 else
879 {
880 hr = ScaWriteConfigString(L"http"); // binding protocol
881 }
882 ExitOnFailure(hr, "Failed write binding http(s)");
883
884 // write bindings CAData
885 hr = ScaWriteConfigString(wzBinding) ; //binding info
886 ExitOnFailure(hr, "Failed write binding info");
887 }
888
889 // write the web dirproperties information
890 if (psw->fHasProperties)
891 {
892 // dir properties are for the default application of the web
893 // with location '/'
894 hr = ScaWriteWebDirProperties7(psw->wzDescription, L"/", &psw->swp);
895 ExitOnFailure(hr, "Failed to write web security information to metabase");
896 }
897
898 //// write the application information
899 if (psw->fHasApplication)
900 {
901 hr = ScaWriteWebApplication7(psw->wzDescription, L"/", &psw->swapp, psapList);
902 ExitOnFailure(hr, "Failed to write web application information to metabase");
903 }
904
905 // write the SSL certificate information
906 if (psw->pswscList)
907 {
908 hr = ScaSslCertificateWrite7(psw->wzDescription, psw->pswscList);
909 ExitOnFailure(hr, "Failed to write SSL certificates for Web site: %ls", psw->wzKey);
910 }
911
912 // write the headers
913 if (psw->pshhList)
914 {
915 hr = ScaWriteHttpHeader7(psw->wzDescription, L"/", psw->pshhList);
916 ExitOnFailure(hr, "Failed to write custom HTTP headers for Web site: %ls", psw->wzKey);
917 }
918
919 // write the errors
920 if (psw->psweList)
921 {
922 hr = ScaWriteWebError7(psw->wzDescription, L"/", psw->psweList);
923 ExitOnFailure(hr, "Failed to write custom web errors for Web site: %ls", psw->wzKey);
924 }
925
926 // write the log information to the metabase
927 if (psw->fHasLog)
928 {
929 hr = ScaWriteWebLog7(psw->wzDescription, &psw->swl);
930 ExitOnFailure(hr, "Failed to write web log information to metabase");
931 }
932
933LExit:
934 return hr;
935}
936
937
938static HRESULT ScaWebRemove7(
939 __in const SCA_WEB7* psw
940 )
941{
942 HRESULT hr = S_OK;
943
944 hr = ScaWriteConfigID(IIS_SITE);
945 ExitOnFailure(hr, "Failed write site ID");
946 hr = ScaWriteConfigID(IIS_DELETE);
947 ExitOnFailure(hr, "Failed write site action");
948 hr = ScaWriteConfigString(psw->wzDescription); //Site Name
949 ExitOnFailure(hr, "Failed write site name");
950
951LExit:
952 return hr;
953}
diff --git a/src/ext/Iis/ca/scaweb7.h b/src/ext/Iis/ca/scaweb7.h
new file mode 100644
index 00000000..78946756
--- /dev/null
+++ b/src/ext/Iis/ca/scaweb7.h
@@ -0,0 +1,97 @@
1#pragma once
2// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
3
4
5#include "scawebapp.h"
6#include "scawebprop.h"
7#include "scahttpheader.h"
8#include "scaweberr.h"
9#include "scassl.h"
10#include "scaapppool.h"
11#include "scaweblog.h"
12
13// globals
14#define MAX_ADDRESSES_PER_WEB 10
15
16// structs
17struct SCA_WEB7
18{
19 // darwin information
20 WCHAR wzKey[MAX_DARWIN_KEY + 1];
21 WCHAR wzComponent[MAX_DARWIN_KEY + 1];
22 BOOL fHasComponent;
23 INSTALLSTATE isInstalled;
24 INSTALLSTATE isAction;
25
26 int iSiteId;
27
28 // metabase information
29 WCHAR wzWebBase[METADATA_MAX_NAME_LEN + 1];
30 BOOL fBaseExists;
31
32 // iis configuation information
33 SCA_WEB_ADDRESS swaBinding;
34
35 SCA_WEB_ADDRESS swaExtraAddresses[MAX_ADDRESSES_PER_WEB + 1];
36 DWORD cExtraAddresses;
37
38 WCHAR wzDirectory[MAX_PATH];
39 WCHAR wzDescription[MAX_DARWIN_COLUMN + 1];
40
41 int iState;
42 int iAttributes;
43
44 BOOL fHasProperties;
45 SCA_WEB_PROPERTIES swp;
46
47 BOOL fHasApplication;
48 SCA_WEB_APPLICATION swapp;
49
50 BOOL fHasSecurity;
51 int dwAccessPermissions;
52 int iConnectionTimeout;
53
54 SCA_WEB_SSL_CERTIFICATE* pswscList;
55 SCA_HTTP_HEADER* pshhList;
56 SCA_WEB_ERROR* psweList;
57
58 BOOL fHasLog;
59 SCA_WEB_LOG swl;
60
61 SCA_WEB7* pswNext;
62};
63
64
65// prototypes
66HRESULT ScaWebsRead7(
67 __in SCA_WEB7** ppswList,
68 __in SCA_HTTP_HEADER** ppshhList,
69 __in SCA_WEB_ERROR** ppsweList,
70 __in WCA_WRAPQUERY_HANDLE hUserQuery,
71 __in WCA_WRAPQUERY_HANDLE hWebDirPropQuery,
72 __in WCA_WRAPQUERY_HANDLE hSslCertQuery,
73 __in WCA_WRAPQUERY_HANDLE hWebLogQuery,
74 __in WCA_WRAPQUERY_HANDLE hWebAppQuery,
75 __in WCA_WRAPQUERY_HANDLE hWebAppExtQuery,
76 __inout LPWSTR *ppwzCustomActionData
77 );
78
79HRESULT ScaWebsGetBase7(
80 __in SCA_WEB7* pswList,
81 __in LPCWSTR pswWebKey,
82 __out_ecount(cchDest) LPWSTR pswWeb,
83 __in DWORD_PTR cchDest
84 );
85
86HRESULT ScaWebsInstall7(
87 __in SCA_WEB7* pswList,
88 __in SCA_APPPOOL * psapList
89 );
90
91HRESULT ScaWebsUninstall7(
92 __in SCA_WEB7* pswList
93 );
94
95void ScaWebsFreeList7(
96 __in SCA_WEB7* pswHead
97 );
diff --git a/src/ext/Iis/ca/scawebapp.cpp b/src/ext/Iis/ca/scawebapp.cpp
new file mode 100644
index 00000000..a7e9cf82
--- /dev/null
+++ b/src/ext/Iis/ca/scawebapp.cpp
@@ -0,0 +1,194 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3#include "precomp.h"
4
5// sql queries
6enum eWebApplicationQuery { wappqName = 1, wappqIsolation, wappqAllowSession,
7 wappqSessionTimeout, wappqBuffer, wappqParentPaths,
8 wappqDefaultScript, wappqScriptTimeout,
9 wappqServerDebugging, wappqClientDebugging, wappqAppPool, wappqApplication};
10
11
12HRESULT ScaGetWebApplication(MSIHANDLE /*hViewApplications*/,
13 LPCWSTR pwzApplication,
14 __in WCA_WRAPQUERY_HANDLE hWebAppQuery,
15 __in WCA_WRAPQUERY_HANDLE hWebAppExtQuery,
16 SCA_WEB_APPLICATION* pswapp)
17{
18 HRESULT hr = S_OK;
19
20 MSIHANDLE hRec;
21 LPWSTR pwzData = NULL;
22
23 // Reset back to the first record
24 WcaFetchWrappedReset(hWebAppQuery);
25
26 // get the application information
27 hr = WcaFetchWrappedRecordWhereString(hWebAppQuery, wappqApplication, pwzApplication, &hRec);
28 if (S_OK == hr)
29 {
30 // application name
31 hr = WcaGetRecordString(hRec, wappqName, &pwzData);
32 ExitOnFailure(hr, "Failed to get Name of App");
33 hr = ::StringCchCopyW(pswapp->wzName, countof(pswapp->wzName), pwzData);
34 if (HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER) == hr)
35 {
36 // The application name is sometimes truncated to IIS's supported length, so ignore insufficient buffer errors here
37 WcaLog(LOGMSG_VERBOSE, "Application name \"%ls\" truncated to fit IIS's supported %d-character length", pwzData, MAX_APP_NAME);
38 hr = S_OK;
39 }
40 ExitOnFailure(hr, "Failed to copy name string to webapp object");
41
42 hr = WcaGetRecordInteger(hRec, wappqIsolation, &pswapp->iIsolation);
43 ExitOnFailure(hr, "Failed to get App isolation: '%ls'", pswapp->wzName);
44
45 hr = WcaGetRecordInteger(hRec, wappqAllowSession, &pswapp->fAllowSessionState);
46
47 hr = WcaGetRecordInteger(hRec, wappqSessionTimeout, &pswapp->iSessionTimeout);
48
49 hr = WcaGetRecordInteger(hRec, wappqBuffer, &pswapp->fBuffer);
50
51 hr = WcaGetRecordInteger(hRec, wappqParentPaths, &pswapp->fParentPaths);
52
53 hr = WcaGetRecordString(hRec, wappqDefaultScript, &pwzData);
54 ExitOnFailure(hr, "Failed to get default scripting language for App: '%ls'", pswapp->wzName);
55 hr = ::StringCchCopyW(pswapp->wzDefaultScript, countof(pswapp->wzDefaultScript), pwzData);
56 ExitOnFailure(hr, "Failed to copy default script string to webapp object");
57
58 // asp script timeout
59 hr = WcaGetRecordInteger(hRec, wappqScriptTimeout, &pswapp->iScriptTimeout);
60 ExitOnFailure(hr, "Failed to get scripting timeout for App: '%ls'", pswapp->wzName);
61
62 // asp server-side script debugging
63 hr = WcaGetRecordInteger(hRec, wappqServerDebugging, &pswapp->fServerDebugging);
64
65 // asp client-side script debugging
66 hr = WcaGetRecordInteger(hRec, wappqClientDebugging, &pswapp->fClientDebugging);
67
68 hr = WcaGetRecordString(hRec, wappqAppPool, &pwzData);
69 ExitOnFailure(hr, "Failed to get AppPool for App: '%ls'", pswapp->wzName);
70 hr = ::StringCchCopyW(pswapp->wzAppPool, countof(pswapp->wzAppPool), pwzData);
71 ExitOnFailure(hr, "failed to copy AppPool: '%ls' for App: '%ls'", pwzData, pswapp->wzName);
72
73 // app extensions
74 hr = ScaWebAppExtensionsRead(pwzApplication, hWebAppExtQuery, &pswapp->pswappextList);
75 ExitOnFailure(hr, "Failed to read AppExtensions for App: '%ls'", pswapp->wzName);
76
77 hr = S_OK;
78 }
79 else if (E_NOMOREITEMS == hr)
80 {
81 WcaLog(LOGMSG_STANDARD, "Error: Cannot locate IIsWebApplication.Application='%ls'", pwzApplication);
82 hr = E_FAIL;
83 }
84 else
85 ExitOnFailure(hr, "Error matching Application rows");
86
87 // Let's check that there isn't more than one record found - if there is, throw an assert like WcaFetchSingleRecord() would
88 HRESULT hrTemp = WcaFetchWrappedRecordWhereString(hWebAppQuery, wappqApplication, pwzApplication, &hRec);
89 if (SUCCEEDED(hrTemp))
90 {
91 AssertSz(E_NOMOREITEMS == hrTemp, "ScaGetWebApplication found more than one record");
92 }
93
94LExit:
95 ReleaseStr(pwzData);
96
97 return hr;
98}
99
100
101HRESULT ScaWriteWebApplication(IMSAdminBase* piMetabase, LPCWSTR wzRootOfWeb,
102 SCA_WEB_APPLICATION* pswapp, SCA_APPPOOL * psapList)
103{
104 HRESULT hr = S_OK;
105 WCHAR wzAppPoolName[MAX_PATH];
106
107 hr = ScaCreateApp(piMetabase, wzRootOfWeb, pswapp->iIsolation);
108 ExitOnFailure(hr, "Failed to create ASP App");
109
110 // Medium Isolation seems to have to be set through the metabase
111 if (2 == pswapp->iIsolation)
112 {
113 hr = ScaWriteMetabaseValue(piMetabase, wzRootOfWeb, NULL, MD_APP_ISOLATED, METADATA_INHERIT, IIS_MD_UT_WAM, DWORD_METADATA, (LPVOID)((DWORD_PTR)pswapp->iIsolation));
114 ExitOnFailure(hr, "Failed to write isolation value for App: '%ls'", pswapp->wzName);
115 }
116
117 // application name
118 hr = ScaWriteMetabaseValue(piMetabase, wzRootOfWeb, NULL, MD_APP_FRIENDLY_NAME, METADATA_INHERIT, IIS_MD_UT_WAM, STRING_METADATA, pswapp->wzName);
119 ExitOnFailure(hr, "Failed to write Name of App: '%ls'", pswapp->wzName);
120
121 // allow session state
122 if (MSI_NULL_INTEGER != pswapp->fAllowSessionState)
123 {
124 hr = ScaWriteMetabaseValue(piMetabase, wzRootOfWeb, NULL, MD_ASP_ALLOWSESSIONSTATE, METADATA_INHERIT, ASP_MD_UT_APP, DWORD_METADATA, (LPVOID)((DWORD_PTR)pswapp->fAllowSessionState));
125 ExitOnFailure(hr, "Failed to write allow session information for App: '%ls'", pswapp->wzName);
126 }
127
128 // session timeout
129 if (MSI_NULL_INTEGER != pswapp->iSessionTimeout)
130 {
131 hr = ScaWriteMetabaseValue(piMetabase, wzRootOfWeb, NULL, MD_ASP_SESSIONTIMEOUT, METADATA_INHERIT, ASP_MD_UT_APP, DWORD_METADATA, (LPVOID)((DWORD_PTR)pswapp->iSessionTimeout));
132 ExitOnFailure(hr, "Failed to write session timeout for App: '%ls'", pswapp->wzName);
133 }
134
135 // asp buffering
136 if (MSI_NULL_INTEGER != pswapp->fBuffer)
137 {
138 hr = ScaWriteMetabaseValue(piMetabase, wzRootOfWeb, NULL, MD_ASP_BUFFERINGON, METADATA_INHERIT, ASP_MD_UT_APP, DWORD_METADATA, (LPVOID)((DWORD_PTR)pswapp->fBuffer));
139 ExitOnFailure(hr, "Failed to write buffering flag for App: '%ls'", pswapp->wzName);
140 }
141
142 // asp parent paths
143 if (MSI_NULL_INTEGER != pswapp->fParentPaths)
144 {
145 hr = ScaWriteMetabaseValue(piMetabase, wzRootOfWeb, NULL, MD_ASP_ENABLEPARENTPATHS, METADATA_INHERIT, ASP_MD_UT_APP, DWORD_METADATA, (LPVOID)((DWORD_PTR)pswapp->fParentPaths));
146 ExitOnFailure(hr, "Failed to write parent paths flag for App: '%ls'", pswapp->wzName);
147 }
148
149 // default scripting language
150 if (*pswapp->wzDefaultScript)
151 {
152 hr = ScaWriteMetabaseValue(piMetabase, wzRootOfWeb, NULL, MD_ASP_SCRIPTLANGUAGE, METADATA_INHERIT, ASP_MD_UT_APP, STRING_METADATA, pswapp->wzDefaultScript);
153 ExitOnFailure(hr, "Failed to write default scripting language for App: '%ls'", pswapp->wzName);
154 }
155
156 // asp script timeout
157 if (MSI_NULL_INTEGER != pswapp->iScriptTimeout)
158 {
159 hr = ScaWriteMetabaseValue(piMetabase, wzRootOfWeb, NULL, MD_ASP_SCRIPTTIMEOUT, METADATA_INHERIT, ASP_MD_UT_APP, DWORD_METADATA, (LPVOID)((DWORD_PTR)pswapp->iScriptTimeout));
160 ExitOnFailure(hr, "Failed to write script timeout for App: '%ls'", pswapp->wzName);
161 }
162
163 // asp server-side script debugging
164 if (MSI_NULL_INTEGER != pswapp->fServerDebugging)
165 {
166 hr = ScaWriteMetabaseValue(piMetabase, wzRootOfWeb, NULL, MD_ASP_ENABLESERVERDEBUG, METADATA_INHERIT, ASP_MD_UT_APP, DWORD_METADATA, (LPVOID)((DWORD_PTR)pswapp->fServerDebugging));
167 ExitOnFailure(hr, "Failed to write ASP server-side script debugging flag for App: '%ls'", pswapp->wzName);
168 }
169
170 // asp server-side script debugging
171 if (MSI_NULL_INTEGER != pswapp->fClientDebugging)
172 {
173 hr = ScaWriteMetabaseValue(piMetabase, wzRootOfWeb, NULL, MD_ASP_ENABLECLIENTDEBUG, METADATA_INHERIT, ASP_MD_UT_APP, DWORD_METADATA, (LPVOID)((DWORD_PTR)pswapp->fClientDebugging));
174 ExitOnFailure(hr, "Failed to write ASP client-side script debugging flag for App: '%ls'", pswapp->wzName);
175 }
176
177 // AppPool
178 if (*pswapp->wzAppPool && NULL != psapList)
179 {
180 hr = ScaFindAppPool(piMetabase, pswapp->wzAppPool, wzAppPoolName, countof(wzAppPoolName), psapList);
181 ExitOnFailure(hr, "failed to find app pool: %ls", pswapp->wzAppPool);
182 hr = ScaWriteMetabaseValue(piMetabase, wzRootOfWeb, NULL, MD_APP_APPPOOL_ID, METADATA_INHERIT, IIS_MD_UT_SERVER, STRING_METADATA, wzAppPoolName);
183 ExitOnFailure(hr, "Failed to write default AppPool for App: '%ls'", pswapp->wzName);
184 }
185
186 if (pswapp->pswappextList)
187 {
188 hr = ScaWebAppExtensionsWrite(piMetabase, wzRootOfWeb, pswapp->pswappextList);
189 ExitOnFailure(hr, "Failed to write AppExtensions for App: '%ls'", pswapp->wzName);
190 }
191
192LExit:
193 return hr;
194}
diff --git a/src/ext/Iis/ca/scawebapp.h b/src/ext/Iis/ca/scawebapp.h
new file mode 100644
index 00000000..a4152116
--- /dev/null
+++ b/src/ext/Iis/ca/scawebapp.h
@@ -0,0 +1,42 @@
1#pragma once
2// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
3
4
5#include "scaapppool.h"
6#include "scawebappext.h"
7
8// global sql queries provided for optimization
9extern LPCWSTR vcsWebApplicationQuery;
10const int MAX_APP_NAME = 255;
11
12// structs
13struct SCA_WEB_APPLICATION
14{
15 WCHAR wzName[MAX_APP_NAME + 1];
16
17 int iIsolation;
18 BOOL fAllowSessionState;
19 int iSessionTimeout;
20 BOOL fBuffer;
21 BOOL fParentPaths;
22
23 WCHAR wzDefaultScript[MAX_DARWIN_COLUMN + 1];
24 int iScriptTimeout;
25 BOOL fServerDebugging;
26 BOOL fClientDebugging;
27 WCHAR wzAppPool[MAX_DARWIN_COLUMN + 1];
28
29 SCA_WEB_APPLICATION_EXTENSION* pswappextList;
30};
31
32
33// prototypes
34HRESULT ScaGetWebApplication(MSIHANDLE hViewApplications,
35 LPCWSTR pwzApplication,
36 __in WCA_WRAPQUERY_HANDLE hWebAppQuery,
37 __in WCA_WRAPQUERY_HANDLE hWebAppExtQuery,
38 SCA_WEB_APPLICATION* pswapp);
39
40HRESULT ScaWriteWebApplication(IMSAdminBase* piMetabase, LPCWSTR wzRootOfWeb,
41 SCA_WEB_APPLICATION* pswapp, SCA_APPPOOL * psapList);
42
diff --git a/src/ext/Iis/ca/scawebapp7.cpp b/src/ext/Iis/ca/scawebapp7.cpp
new file mode 100644
index 00000000..94e6bb18
--- /dev/null
+++ b/src/ext/Iis/ca/scawebapp7.cpp
@@ -0,0 +1,120 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3#include "precomp.h"
4HRESULT ScaWriteWebApplication7(
5 __in_z LPCWSTR wzWebName,
6 __in_z LPCWSTR wzRootOfWeb,
7 SCA_WEB_APPLICATION* pswapp,
8 SCA_APPPOOL * /*psapList*/
9 )
10{
11 HRESULT hr = S_OK;
12
13 //all go to same web/root location tag
14 hr = ScaWriteConfigID(IIS_ASP_BEGIN);
15 ExitOnFailure(hr, "Failed to write WebApp ASP begin id");
16 hr = ScaWriteConfigString(wzWebName); //site name key
17 ExitOnFailure(hr, "Failed to write app web key");
18 hr = ScaWriteConfigString(wzRootOfWeb); //app path key
19 ExitOnFailure(hr, "Failed to write app web root");
20
21 // IIS7 Not Supported: Isolation
22 if (MSI_NULL_INTEGER != pswapp->iIsolation)
23 {
24 WcaLog(LOGMSG_TRACEONLY, "Not supported by IIS7: Isolation Mode, ignoring");
25 }
26
27 // allow session state
28 if (MSI_NULL_INTEGER != pswapp->fAllowSessionState)
29 {
30 //system.webServer/asp /session | allowSessionState
31 hr = ScaWriteConfigID(IIS_ASP_SESSIONSTATE);
32 ExitOnFailure(hr, "Failed to write WebApp ASP sessionstate id");
33 hr = ScaWriteConfigInteger(pswapp->fAllowSessionState);
34 ExitOnFailure(hr, "Failed to write allow session information for App: '%ls'", pswapp->wzName);
35 }
36
37 // session timeout
38 if (MSI_NULL_INTEGER != pswapp->iSessionTimeout)
39 {
40 //system.webServer/asp /session | timeout
41 hr = ScaWriteConfigID(IIS_ASP_SESSIONTIMEOUT);
42 ExitOnFailure(hr, "Failed to write WebApp ASP sessiontimepot id");
43 hr = ScaWriteConfigInteger(pswapp->iSessionTimeout);
44 ExitOnFailure(hr, "Failed to write session timeout for App: '%ls'", pswapp->wzName);
45 }
46
47 // asp buffering
48 if (MSI_NULL_INTEGER != pswapp->fBuffer)
49 {
50 //system.webServer/asp | bufferingOn
51 hr = ScaWriteConfigID(IIS_ASP_BUFFER);
52 ExitOnFailure(hr, "Failed to write WebApp ASP buffer id");
53 hr = ScaWriteConfigInteger(pswapp->fBuffer);
54 ExitOnFailure(hr, "Failed to write buffering flag for App: '%ls'", pswapp->wzName);
55 }
56
57 // asp parent paths
58 if (MSI_NULL_INTEGER != pswapp->fParentPaths)
59 {
60 //system.webServer/asp | enableParentPaths
61 hr = ScaWriteConfigID(IIS_ASP_PARENTPATHS);
62 ExitOnFailure(hr, "Failed to write WebApp ASP parentpaths id");
63 hr = ScaWriteConfigInteger(pswapp->fParentPaths);
64 ExitOnFailure(hr, "Failed to write parent paths flag for App: '%ls'", pswapp->wzName);
65 }
66
67 // default scripting language
68 if (*pswapp->wzDefaultScript)
69 {
70 //system.webServer/asp | scriptLanguage
71 hr = ScaWriteConfigID(IIS_ASP_SCRIPTLANG);
72 ExitOnFailure(hr, "Failed to write WebApp ASP script lang id");
73 hr = ScaWriteConfigString(pswapp->wzDefaultScript);
74 ExitOnFailure(hr, "Failed to write default scripting language for App: '%ls'", pswapp->wzName);
75 }
76
77 // asp script timeout
78 if (MSI_NULL_INTEGER != pswapp->iScriptTimeout)
79 {
80 //system.webServer/asp /limits | scriptTimeout
81 hr = ScaWriteConfigID(IIS_ASP_SCRIPTTIMEOUT);
82 ExitOnFailure(hr, "Failed to write WebApp ASP script timeout id");
83 hr = ScaWriteConfigInteger(pswapp->iScriptTimeout);
84 ExitOnFailure(hr, "Failed to write script timeout for App: '%ls'", pswapp->wzName);
85 }
86
87 // asp server-side script debugging
88 if (MSI_NULL_INTEGER != pswapp->fServerDebugging)
89 {
90 //system.webServer/asp | appAllowDebugging
91 hr = ScaWriteConfigID(IIS_ASP_SCRIPTSERVERDEBUG);
92 ExitOnFailure(hr, "Failed to write WebApp ASP script debug id");
93 hr = ScaWriteConfigInteger(pswapp->fServerDebugging);
94 ExitOnFailure(hr, "Failed to write ASP server-side script debugging flag for App: '%ls'", pswapp->wzName);
95 }
96
97 // asp client-side script debugging
98 if (MSI_NULL_INTEGER != pswapp->fClientDebugging)
99 {
100 //system.webServer/asp | appAllowClientDebug
101 hr = ScaWriteConfigID(IIS_ASP_SCRIPTCLIENTDEBUG);
102 ExitOnFailure(hr, "Failed to write WebApp ASP script debug id");
103 hr = ScaWriteConfigInteger(pswapp->fClientDebugging);
104 ExitOnFailure(hr, "Failed to write ASP client-side script debugging flag for App: '%ls'", pswapp->wzName);
105 }
106
107 //done with ASP application properties
108 hr = ScaWriteConfigID(IIS_ASP_END);
109 ExitOnFailure(hr, "Failed to write WebApp ASP begin id");
110
111 //write out app estensions
112 if (pswapp->pswappextList)
113 {
114 hr = ScaWebAppExtensionsWrite7(wzWebName, wzRootOfWeb, pswapp->pswappextList);
115 ExitOnFailure(hr, "Failed to write AppExtensions for App: '%ls'", pswapp->wzName);
116 }
117
118LExit:
119 return hr;
120}
diff --git a/src/ext/Iis/ca/scawebapp7.h b/src/ext/Iis/ca/scawebapp7.h
new file mode 100644
index 00000000..e1d87f53
--- /dev/null
+++ b/src/ext/Iis/ca/scawebapp7.h
@@ -0,0 +1,10 @@
1#pragma once
2// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
3
4
5HRESULT ScaWriteWebApplication7(
6 __in_z LPCWSTR wzWebName,
7 __in_z LPCWSTR wzRootOfWeb,
8 SCA_WEB_APPLICATION* pswapp,
9 SCA_APPPOOL * psapList
10 );
diff --git a/src/ext/Iis/ca/scawebappext.cpp b/src/ext/Iis/ca/scawebappext.cpp
new file mode 100644
index 00000000..cf3b9dd3
--- /dev/null
+++ b/src/ext/Iis/ca/scawebappext.cpp
@@ -0,0 +1,207 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3#include "precomp.h"
4
5enum eWebAppExtensionQuery { wappextqExtension = 1, wappextqVerbs, wappextqExecutable, wappextqAttributes, wappextqApplication };
6
7// prototypes for private helper functions
8static HRESULT NewAppExt(
9 __out SCA_WEB_APPLICATION_EXTENSION** ppswappext
10 );
11static SCA_WEB_APPLICATION_EXTENSION* AddAppExtToList(
12 __in SCA_WEB_APPLICATION_EXTENSION* pswappextList,
13 __in SCA_WEB_APPLICATION_EXTENSION* pswappext
14 );
15
16
17
18HRESULT ScaWebAppExtensionsRead(
19 __in LPCWSTR wzApplication,
20 __in WCA_WRAPQUERY_HANDLE hWebAppExtQuery,
21 __inout SCA_WEB_APPLICATION_EXTENSION** ppswappextList
22 )
23{
24 HRESULT hr = S_OK;
25 MSIHANDLE hRec;
26
27 SCA_WEB_APPLICATION_EXTENSION* pswappext = NULL;
28 LPWSTR pwzData = NULL;
29
30 // Reset back to the first record
31 WcaFetchWrappedReset(hWebAppExtQuery);
32
33 // get the application extension information
34 while (S_OK == (hr = WcaFetchWrappedRecordWhereString(hWebAppExtQuery, wappextqApplication, wzApplication, &hRec)))
35 {
36 hr = NewAppExt(&pswappext);
37 ExitOnFailure(hr, "failed to create new web app extension");
38
39 // get the extension
40 hr = WcaGetRecordString(hRec, wappextqExtension, &pwzData);
41 ExitOnFailure(hr, "Failed to get Web Application Extension");
42 hr = ::StringCchCopyW(pswappext->wzExtension, countof(pswappext->wzExtension), pwzData);
43 ExitOnFailure(hr, "Failed to copy extension string to webappext object");
44
45 // application extension verbs
46 hr = WcaGetRecordString(hRec, wappextqVerbs, &pwzData);
47 ExitOnFailure(hr, "Failed to get Verbs for Application: '%ls'", wzApplication);
48 hr = ::StringCchCopyW(pswappext->wzVerbs, countof(pswappext->wzVerbs), pwzData);
49 ExitOnFailure(hr, "Failed to copy verbs string to webappext object");
50
51 // extension executeable
52 hr = WcaGetRecordString(hRec, wappextqExecutable, &pwzData);
53 ExitOnFailure(hr, "Failed to get Executable for Application: '%ls'", wzApplication);
54 hr = ::StringCchCopyW(pswappext->wzExecutable, countof(pswappext->wzExecutable), pwzData);
55 ExitOnFailure(hr, "Failed to copy executable string to webappext object");
56
57 hr = WcaGetRecordInteger(hRec, wappextqAttributes, &pswappext->iAttributes);
58 if (S_FALSE == hr)
59 {
60 pswappext->iAttributes = 0;
61 hr = S_OK;
62 }
63 ExitOnFailure(hr, "Failed to get App isolation");
64
65 *ppswappextList = AddAppExtToList(*ppswappextList, pswappext);
66 pswappext = NULL; // set the appext NULL so it doesn't accidentally get freed below
67 }
68
69 if (E_NOMOREITEMS == hr)
70 {
71 hr = S_OK;
72 }
73
74LExit:
75 // if anything was left over after an error clean it all up
76 if (pswappext)
77 {
78 ScaWebAppExtensionsFreeList(pswappext);
79 }
80
81 ReleaseStr(pwzData);
82
83 return hr;
84}
85
86
87
88HRESULT ScaWebAppExtensionsWrite(
89 __in IMSAdminBase* piMetabase,
90 __in LPCWSTR wzRootOfWeb,
91 __in SCA_WEB_APPLICATION_EXTENSION* pswappextList
92 )
93{
94 HRESULT hr = S_OK;
95
96 LPWSTR wzAppExt = NULL;
97 DWORD cchAppExt;
98 WCHAR wzAppExtension[1024];
99 WCHAR wzAppExtensions[65536];
100 SCA_WEB_APPLICATION_EXTENSION* pswappext = NULL;
101
102 if (!pswappextList)
103 {
104 ExitFunction();
105 }
106
107 ::ZeroMemory(wzAppExtensions, sizeof(wzAppExtensions));
108 wzAppExt = wzAppExtensions;
109 cchAppExt = countof(wzAppExtensions);
110 pswappext = pswappextList;
111
112 while (pswappext)
113 {
114 // if all (represented by "*" or blank)
115 if (0 == lstrcmpW(pswappext->wzExtension, L"*") || 0 == lstrlenW(pswappext->wzExtension))
116 {
117 hr = ::StringCchPrintfW(wzAppExtension, countof(wzAppExtension), L"*,%s,%d", pswappext->wzExecutable, pswappext->iAttributes);
118 ExitOnFailure(hr, "Failed to format *,executable,attributes string");
119 }
120 else
121 {
122 hr = ::StringCchPrintfW(wzAppExtension, countof(wzAppExtension), L".%s,%s,%d", pswappext->wzExtension, pswappext->wzExecutable, pswappext->iAttributes);
123 ExitOnFailure(hr, "Failed to format extension,executable,attributes string");
124 }
125
126 // if verbs were specified and not the keyword "all"
127 if (pswappext->wzVerbs[0] && CSTR_EQUAL != CompareStringW(LOCALE_INVARIANT, NORM_IGNORECASE, pswappext->wzVerbs, -1, L"all", -1))
128 {
129 hr = ::StringCchCatW(wzAppExtension, countof(wzAppExtension), L",");
130 ExitOnFailure(hr, "Failed to concatenate comma to app extension string");
131 hr = ::StringCchCatW(wzAppExtension, countof(wzAppExtension), pswappext->wzVerbs);
132 ExitOnFailure(hr, "Failed to concatenate verb to app extension string");
133 }
134
135 hr = ::StringCchCopyW(wzAppExt, cchAppExt, wzAppExtension);
136 ExitOnFailure(hr, "Failed to copy app extension string");
137 wzAppExt += lstrlenW(wzAppExtension) + 1;
138 cchAppExt -= lstrlenW(wzAppExtension) + 1;
139 pswappext = pswappext->pswappextNext;
140 }
141
142 if (*wzAppExtensions)
143 {
144 hr = ScaWriteMetabaseValue(piMetabase, wzRootOfWeb, NULL, MD_SCRIPT_MAPS, METADATA_INHERIT, IIS_MD_UT_FILE, MULTISZ_METADATA, wzAppExtensions);
145 ExitOnFailure(hr, "Failed to write AppExtension: '%ls'", wzAppExtension);
146 }
147
148LExit:
149 return hr;
150}
151
152
153void ScaWebAppExtensionsFreeList(
154 __in SCA_WEB_APPLICATION_EXTENSION* pswappextList
155 )
156{
157 SCA_WEB_APPLICATION_EXTENSION* pswappextDelete = pswappextList;
158 while (pswappextList)
159 {
160 pswappextDelete = pswappextList;
161 pswappextList = pswappextList->pswappextNext;
162
163 MemFree(pswappextDelete);
164 }
165}
166
167
168
169// private helper functions
170
171static HRESULT NewAppExt(
172 __out SCA_WEB_APPLICATION_EXTENSION** ppswappext
173 )
174{
175 HRESULT hr = S_OK;
176 SCA_WEB_APPLICATION_EXTENSION* pswappext = static_cast<SCA_WEB_APPLICATION_EXTENSION*>(MemAlloc(sizeof(SCA_WEB_APPLICATION_EXTENSION), TRUE));
177 ExitOnNull(pswappext, hr, E_OUTOFMEMORY, "failed to allocate memory for new web app ext element");
178
179 *ppswappext = pswappext;
180
181LExit:
182 return hr;
183}
184
185
186static SCA_WEB_APPLICATION_EXTENSION* AddAppExtToList(
187 __in SCA_WEB_APPLICATION_EXTENSION* pswappextList,
188 __in SCA_WEB_APPLICATION_EXTENSION* pswappext
189 )
190{
191 if (pswappextList)
192 {
193 SCA_WEB_APPLICATION_EXTENSION* pswappextT = pswappextList;
194 while (pswappextT->pswappextNext)
195 {
196 pswappextT = pswappextT->pswappextNext;
197 }
198
199 pswappextT->pswappextNext = pswappext;
200 }
201 else
202 {
203 pswappextList = pswappext;
204 }
205
206 return pswappextList;
207}
diff --git a/src/ext/Iis/ca/scawebappext.h b/src/ext/Iis/ca/scawebappext.h
new file mode 100644
index 00000000..71adfd00
--- /dev/null
+++ b/src/ext/Iis/ca/scawebappext.h
@@ -0,0 +1,32 @@
1#pragma once
2// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
3
4
5struct SCA_WEB_APPLICATION_EXTENSION
6{
7 WCHAR wzExtension[MAX_DARWIN_COLUMN + 1];
8
9 WCHAR wzVerbs[MAX_DARWIN_COLUMN + 1];
10 WCHAR wzExecutable[MAX_DARWIN_COLUMN + 1];
11 int iAttributes;
12
13 SCA_WEB_APPLICATION_EXTENSION* pswappextNext;
14};
15
16
17// prototypes
18HRESULT ScaWebAppExtensionsRead(
19 __in LPCWSTR wzApplication,
20 __in WCA_WRAPQUERY_HANDLE hWebAppExtQuery,
21 __inout SCA_WEB_APPLICATION_EXTENSION** ppswappextList
22 );
23
24HRESULT ScaWebAppExtensionsWrite(
25 __in IMSAdminBase* piMetabase,
26 __in LPCWSTR wzRootOfWeb,
27 __in SCA_WEB_APPLICATION_EXTENSION* pswappextList
28 );
29
30void ScaWebAppExtensionsFreeList(
31 __in SCA_WEB_APPLICATION_EXTENSION* pswappextList
32 );
diff --git a/src/ext/Iis/ca/scawebappext7.cpp b/src/ext/Iis/ca/scawebappext7.cpp
new file mode 100644
index 00000000..50d3172f
--- /dev/null
+++ b/src/ext/Iis/ca/scawebappext7.cpp
@@ -0,0 +1,61 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3#include "precomp.h"
4
5HRESULT ScaWebAppExtensionsWrite7(
6 __in_z LPCWSTR wzWebName,
7 __in_z LPCWSTR wzRootOfWeb,
8 __in SCA_WEB_APPLICATION_EXTENSION* pswappextList
9 )
10{
11 HRESULT hr = S_OK;
12 SCA_WEB_APPLICATION_EXTENSION* pswappext = NULL;
13
14 if (!pswappextList)
15 {
16 ExitFunction1(hr = S_OK);
17 }
18
19 //create the Extension for this vdir application
20 //all go to same web/root location tag
21 hr = ScaWriteConfigID(IIS_APPEXT_BEGIN);
22 ExitOnFailure(hr, "Failed to write webappext begin id");
23 hr = ScaWriteConfigString(wzWebName); //site name key
24 ExitOnFailure(hr, "Failed to write app web key");
25 hr = ScaWriteConfigString(wzRootOfWeb); //app path key
26 ExitOnFailure(hr, "Failed to write app web key");
27
28 pswappext = pswappextList;
29
30 while (pswappext)
31 {
32 //create the Extension for this vdir application
33 hr = ScaWriteConfigID(IIS_APPEXT);
34 ExitOnFailure(hr, "Failed to write webappext begin id");
35
36 if (*pswappext->wzExtension)
37 {
38 hr = ScaWriteConfigString(pswappext->wzExtension);
39 }
40 else // blank means "*" (all)
41 {
42 hr = ScaWriteConfigString(L"*");
43 }
44 ExitOnFailure(hr, "Failed to write extension");
45
46 hr = ScaWriteConfigString(pswappext->wzExecutable);
47 ExitOnFailure(hr, "Failed to write extension executable");
48
49 hr = ScaWriteConfigString(pswappext->wzVerbs);
50 ExitOnFailure(hr, "Failed to write extension verbs");
51
52 pswappext = pswappext->pswappextNext;
53 }
54
55 hr = ScaWriteConfigID(IIS_APPEXT_END);
56 ExitOnFailure(hr, "Failed to write webappext begin id");
57
58LExit:
59 return hr;
60}
61
diff --git a/src/ext/Iis/ca/scawebappext7.h b/src/ext/Iis/ca/scawebappext7.h
new file mode 100644
index 00000000..55c8b5fc
--- /dev/null
+++ b/src/ext/Iis/ca/scawebappext7.h
@@ -0,0 +1,9 @@
1#pragma once
2// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
3
4
5HRESULT ScaWebAppExtensionsWrite7(
6 __in_z LPCWSTR wzWebName,
7 __in_z LPCWSTR wzRootOfWeb,
8 __in SCA_WEB_APPLICATION_EXTENSION* pswappextList
9 );
diff --git a/src/ext/Iis/ca/scawebdir.cpp b/src/ext/Iis/ca/scawebdir.cpp
new file mode 100644
index 00000000..26a7b32b
--- /dev/null
+++ b/src/ext/Iis/ca/scawebdir.cpp
@@ -0,0 +1,241 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3#include "precomp.h"
4
5// sql queries
6enum eWebDirQuery { wdqWeb = 1, wdqWebDir, wdqComponent , wdqPath, wdqProperties, wdqApplication, wdqInstalled, wdqAction };
7
8// prototypes
9static void AddWebDirToList(SCA_WEBDIR** ppswdList, SCA_WEBDIR *pswd);
10
11static SCA_WEBDIR* NewWebDir();
12static void FreeWebDir(SCA_WEBDIR *pswd);
13
14
15UINT __stdcall ScaWebDirsRead(
16 __in IMSAdminBase* piMetabase,
17 __in SCA_WEB* pswList,
18 __in WCA_WRAPQUERY_HANDLE hUserQuery,
19 __in WCA_WRAPQUERY_HANDLE hWebBaseQuery,
20 __in WCA_WRAPQUERY_HANDLE hWebDirPropQuery,
21 __in WCA_WRAPQUERY_HANDLE hWebAppQuery,
22 __in WCA_WRAPQUERY_HANDLE hWebAppExtQuery,
23 __inout LPWSTR *ppwzCustomActionData,
24 __out SCA_WEBDIR** ppswdList
25 )
26{
27 Assert(piMetabase && ppswdList);
28
29 HRESULT hr = S_OK;
30 MSIHANDLE hRec;
31
32 LPWSTR pwzData = NULL;
33 SCA_WEBDIR* pswd;
34 WCA_WRAPQUERY_HANDLE hWrapQuery = NULL;
35
36 hr = WcaBeginUnwrapQuery(&hWrapQuery, ppwzCustomActionData);
37 ExitOnFailure(hr, "Failed to unwrap query for ScaWebDirsRead");
38
39 if (0 == WcaGetQueryRecords(hWrapQuery))
40 {
41 WcaLog(LOGMSG_VERBOSE, "Skipping ScaInstallWebDirs() because IIsWebDir table not present");
42 ExitFunction1(hr = S_FALSE);
43 }
44
45 // loop through all the web directories
46 while (S_OK == (hr = WcaFetchWrappedRecord(hWrapQuery, &hRec)))
47 {
48 pswd = NewWebDir();
49 ExitOnNull(pswd, hr, E_OUTOFMEMORY, "Failed to allocate memory for web dir object in memory");
50
51 // get component install state
52 hr = WcaGetRecordString(hRec, wdqComponent, &pwzData);
53 ExitOnFailure(hr, "Failed to get Component for WebDirs");
54 hr = ::StringCchCopyW(pswd->wzComponent, countof(pswd->wzComponent), pwzData);
55 ExitOnFailure(hr, "Failed to copy component string to webdir object");
56
57 hr = WcaGetRecordInteger(hRec, wdqInstalled, (int *)&pswd->isInstalled);
58 ExitOnFailure(hr, "Failed to get Component installed state for webdir");
59
60 hr = WcaGetRecordInteger(hRec, wdqAction, (int *)&pswd->isAction);
61 ExitOnFailure(hr, "Failed to get Component action state for webdir");
62
63 // If this record has a component and no action is being taken for it, skip processing it entirely
64 if (0 < lstrlenW(pswd->wzComponent) && !WcaIsInstalling(pswd->isInstalled, pswd->isAction)
65 && !WcaIsUninstalling(pswd->isInstalled, pswd->isAction) && !WcaIsReInstalling(pswd->isInstalled, pswd->isAction))
66 {
67 FreeWebDir(pswd);
68 pswd = NULL;
69 continue;
70 }
71
72 hr = WcaGetRecordString(hRec, wdqWeb, &pwzData);
73 ExitOnFailure(hr, "Failed to get Web for WebDir");
74
75 hr = ScaWebsGetBase(piMetabase, pswList, pwzData, pswd->wzWebBase, countof(pswd->wzWebBase), hWebBaseQuery);
76 if (WcaIsUninstalling(pswd->isInstalled, pswd->isAction))
77 {
78 // If we're uninstalling, ignore any failure to find the existing web
79 hr = S_OK;
80 }
81
82 ExitOnFailure(hr, "Failed to get base of web for WebDir");
83
84 hr = WcaGetRecordString(hRec, wdqPath, &pwzData);
85 ExitOnFailure(hr, "Failed to get Path for WebDir");
86
87 hr = ::StringCchPrintfW(pswd->wzWebDirRoot, countof(pswd->wzWebDirRoot), L"%s/Root/%s", pswd->wzWebBase, pwzData);
88 ExitOnFailure(hr, "Failed to format webdir root string");
89
90 // get the directory properties for this web
91 hr = WcaGetRecordString(hRec, wdqProperties, &pwzData);
92 ExitOnFailure(hr, "Failed to get security identifier for WebDir");
93 if (*pwzData)
94 {
95 hr = ScaGetWebDirProperties(pwzData, hUserQuery, hWebDirPropQuery, &pswd->swp);
96 ExitOnFailure(hr, "Failed to get properties for WebDir");
97
98 pswd->fHasProperties = TRUE;
99 }
100
101 // get the application information for this web directory
102 hr = WcaGetRecordString(hRec, wdqApplication, &pwzData);
103 ExitOnFailure(hr, "Failed to get application identifier for WebDir");
104 if (*pwzData)
105 {
106 hr = ScaGetWebApplication(NULL, pwzData, hWebAppQuery, hWebAppExtQuery, &pswd->swapp);
107 ExitOnFailure(hr, "Failed to get application for WebDir");
108
109 pswd->fHasApplication = TRUE;
110 }
111
112 AddWebDirToList(ppswdList, pswd);
113 }
114
115 if (E_NOMOREITEMS == hr)
116 {
117 hr = S_OK;
118 }
119 ExitOnFailure(hr, "Failure while processing WebDirs");
120
121LExit:
122 WcaFinishUnwrapQuery(hWrapQuery);
123
124 ReleaseStr(pwzData);
125
126 return hr;
127}
128
129
130HRESULT ScaWebDirsInstall(IMSAdminBase* piMetabase, SCA_WEBDIR* pswdList, SCA_APPPOOL * psapList)
131{
132 HRESULT hr = S_OK;
133 SCA_WEBDIR* pswd = pswdList;
134 int i;
135
136 while (pswd)
137 {
138 // On reinstall, we have to uninstall the old application, otherwise a duplicate will be created
139 if (WcaIsReInstalling(pswd->isInstalled, pswd->isAction))
140 {
141 if (pswd->fHasApplication)
142 {
143 hr = ScaDeleteApp(piMetabase, pswd->wzWebDirRoot);
144 ExitOnFailure(hr, "Failed to remove application for WebDir as part of a reinstall");
145 }
146 }
147
148 // if we are installing the web site
149 if (WcaIsInstalling(pswd->isInstalled, pswd->isAction))
150 {
151 hr = ScaCreateMetabaseKey(piMetabase, pswd->wzWebDirRoot, L"");
152 ExitOnFailure(hr, "Failed to create key for WebDir");
153 hr = ScaWriteMetabaseValue(piMetabase, pswd->wzWebDirRoot, L"", MD_KEY_TYPE, METADATA_NO_ATTRIBUTES, IIS_MD_UT_SERVER, STRING_METADATA, (LPVOID)L"IIsWebDirectory");
154 ExitOnFailure(hr, "Failed to write key type for for WebDir");
155 i = 0x4000003e; // 1073741886: default directory browsing rights
156 hr = ScaWriteMetabaseValue(piMetabase, pswd->wzWebDirRoot, L"", MD_DIRECTORY_BROWSING, METADATA_INHERIT, IIS_MD_UT_FILE, DWORD_METADATA, (LPVOID)((DWORD_PTR)i));
157 ExitOnFailure(hr, "Failed to set directory browsing for WebDir");
158
159 // get the security information for this web
160 if (pswd->fHasProperties)
161 {
162 ScaWriteWebDirProperties(piMetabase, pswd->wzWebDirRoot, &pswd->swp);
163 ExitOnFailure(hr, "Failed to write properties for WebDir");
164 }
165
166 // get the application information for this web directory
167 if (pswd->fHasApplication)
168 {
169 hr = ScaWriteWebApplication(piMetabase, pswd->wzWebDirRoot, &pswd->swapp, psapList);
170 ExitOnFailure(hr, "Failed to write application for WebDir");
171 }
172 }
173
174 pswd = pswd->pswdNext;
175 }
176
177LExit:
178 return hr;
179}
180
181
182HRESULT ScaWebDirsUninstall(IMSAdminBase* piMetabase, SCA_WEBDIR* pswdList)
183{
184 Assert(piMetabase);
185
186 HRESULT hr = S_OK;
187 SCA_WEBDIR* pswd = pswdList;
188
189 while (pswd)
190 {
191 if (WcaIsUninstalling(pswd->isInstalled, pswd->isAction))
192 {
193 // remove the application from this web directory
194 if (pswd->fHasApplication)
195 {
196 hr = ScaDeleteApp(piMetabase, pswd->wzWebDirRoot);
197 ExitOnFailure(hr, "Failed to remove application for WebDir");
198 }
199
200 hr = ScaDeleteMetabaseKey(piMetabase, pswd->wzWebDirRoot, L"");
201 ExitOnFailure(hr, "Failed to remove WebDir '%ls' from metabase", pswd->wzKey);
202 }
203
204 pswd = pswd->pswdNext;
205 }
206
207LExit:
208 return hr;
209}
210
211
212static SCA_WEBDIR* NewWebDir()
213{
214 SCA_WEBDIR* pswd = static_cast<SCA_WEBDIR*>(MemAlloc(sizeof(SCA_WEBDIR), TRUE));
215 Assert(pswd);
216 return pswd;
217}
218
219static void FreeWebDir(SCA_WEBDIR *pswd)
220{
221 MemFree(pswd);
222}
223
224void ScaWebDirsFreeList(SCA_WEBDIR* pswdList)
225{
226 SCA_WEBDIR* pswdDelete = pswdList;
227 while (pswdList)
228 {
229 pswdDelete = pswdList;
230 pswdList = pswdList->pswdNext;
231
232 FreeWebDir(pswdDelete);
233 }
234}
235
236
237static void AddWebDirToList(SCA_WEBDIR** ppswdList, SCA_WEBDIR *pswd)
238{
239 pswd->pswdNext = *ppswdList;
240 *ppswdList = pswd;
241}
diff --git a/src/ext/Iis/ca/scawebdir.h b/src/ext/Iis/ca/scawebdir.h
new file mode 100644
index 00000000..0b594532
--- /dev/null
+++ b/src/ext/Iis/ca/scawebdir.h
@@ -0,0 +1,57 @@
1#pragma once
2// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
3
4
5struct SCA_WEBDIR
6{
7 // darwin information
8 WCHAR wzKey[MAX_DARWIN_KEY + 1];
9 WCHAR wzComponent[MAX_DARWIN_KEY + 1];
10 INSTALLSTATE isInstalled;
11 INSTALLSTATE isAction;
12
13 // metabase information
14 WCHAR wzWebKey[MAX_DARWIN_KEY + 1];
15 WCHAR wzWebBase[METADATA_MAX_NAME_LEN + 1];
16 WCHAR wzWebDirRoot[METADATA_MAX_NAME_LEN + 1];
17
18 // iis configuation information
19 WCHAR wzDirectory[MAX_PATH];
20
21 BOOL fHasProperties;
22 SCA_WEB_PROPERTIES swp;
23
24 BOOL fHasApplication;
25 SCA_WEB_APPLICATION swapp;
26
27 SCA_WEBDIR* pswdNext;
28};
29
30
31// prototypes
32UINT __stdcall ScaWebDirsRead(
33 __in IMSAdminBase* piMetabase,
34 __in SCA_WEB* pswList,
35 __in WCA_WRAPQUERY_HANDLE hUserQuery,
36 __in WCA_WRAPQUERY_HANDLE hWebBaseQuery,
37 __in WCA_WRAPQUERY_HANDLE hWebDirPropQuery,
38 __in WCA_WRAPQUERY_HANDLE hWebAppQuery,
39 __in WCA_WRAPQUERY_HANDLE hWebAppExtQuery,
40 __inout LPWSTR *ppwzCustomActionData,
41 __out SCA_WEBDIR** ppswdList
42 );
43
44HRESULT ScaWebDirsInstall(
45 __in IMSAdminBase* piMetabase,
46 __in SCA_WEBDIR* pswdList,
47 __in SCA_APPPOOL* psapList
48 );
49
50HRESULT ScaWebDirsUninstall(
51 __in IMSAdminBase* piMetabase,
52 __in SCA_WEBDIR* pswdList
53 );
54
55void ScaWebDirsFreeList(
56 __in SCA_WEBDIR* pswdList
57 );
diff --git a/src/ext/Iis/ca/scawebdir7.cpp b/src/ext/Iis/ca/scawebdir7.cpp
new file mode 100644
index 00000000..5ead0470
--- /dev/null
+++ b/src/ext/Iis/ca/scawebdir7.cpp
@@ -0,0 +1,219 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3#include "precomp.h"
4
5// sql queries
6static LPCWSTR vcsWebDirQuery7 = L"SELECT `Web_`, `WebDir`, `Component_`, `Path`, `DirProperties_`, `Application_`"
7 L"FROM `IIsWebDir`";
8
9enum eWebDirQuery { wdqWeb = 1, wdqWebDir, wdqComponent , wdqPath, wdqProperties, wdqApplication, wdqInstalled, wdqAction };
10
11// prototypes
12static HRESULT AddWebDirToList(SCA_WEBDIR7** ppswdList);
13
14
15UINT __stdcall ScaWebDirsRead7(
16 __in SCA_WEB7* pswList,
17 __in WCA_WRAPQUERY_HANDLE hUserQuery,
18 __in WCA_WRAPQUERY_HANDLE /*hWebBaseQuery*/,
19 __in WCA_WRAPQUERY_HANDLE hWebDirPropQuery,
20 __in WCA_WRAPQUERY_HANDLE hWebAppQuery,
21 __in WCA_WRAPQUERY_HANDLE hWebAppExtQuery,
22 __inout LPWSTR *ppwzCustomActionData,
23 __out SCA_WEBDIR7** ppswdList
24 )
25{
26 HRESULT hr = S_OK;
27 MSIHANDLE hRec;
28
29 LPWSTR pwzData = NULL;
30 SCA_WEBDIR7* pswd;
31 WCA_WRAPQUERY_HANDLE hWrapQuery = NULL;
32
33 hr = WcaBeginUnwrapQuery(&hWrapQuery, ppwzCustomActionData);
34 ExitOnFailure(hr, "Failed to unwrap query for ScaWebDirsRead7");
35
36 if (0 == WcaGetQueryRecords(hWrapQuery))
37 {
38 WcaLog(LOGMSG_VERBOSE, "Skipping ScaInstallWebDirs7() because IIsWebDir table not present");
39 ExitFunction1(hr = S_FALSE);
40 }
41
42 // loop through all the web directories
43 while (S_OK == (hr = WcaFetchWrappedRecord(hWrapQuery, &hRec)))
44 {
45 hr = AddWebDirToList(ppswdList);
46 ExitOnFailure(hr, "failed to add web dir to list");
47
48 pswd = *ppswdList;
49 ExitOnNull(pswd, hr, E_INVALIDARG, "No web dir provided");
50
51 // get component install state
52 hr = WcaGetRecordString(hRec, wdqComponent, &pwzData);
53 ExitOnFailure(hr, "Failed to get Component for WebDirs");
54 hr = ::StringCchCopyW(pswd->wzComponent, countof(pswd->wzComponent), pwzData);
55 ExitOnFailure(hr, "Failed to copy component string to webdir object");
56
57 hr = WcaGetRecordInteger(hRec, wdqInstalled, (int *)&pswd->isInstalled);
58 ExitOnFailure(hr, "Failed to get Component installed state for webdir");
59
60 hr = WcaGetRecordInteger(hRec, wdqAction, (int *)&pswd->isAction);
61 ExitOnFailure(hr, "Failed to get Component action state for webdir");
62
63 hr = WcaGetRecordString(hRec, wdqWeb, &pwzData);
64 ExitOnFailure(hr, "Failed to get Web for WebDir");
65
66 // get the web key
67 hr = ScaWebsGetBase7(pswList, pwzData, pswd->wzWebSite, countof(pswd->wzWebSite));
68 if (S_FALSE == hr)
69 {
70 hr = HRESULT_FROM_WIN32(ERROR_NOT_FOUND);
71 ExitOnFailure(hr, "Failed to get base of web for WebDir");
72 }
73 ExitOnFailure(hr, "Failed to format webdir root string");
74
75 hr = WcaGetRecordString(hRec, wdqPath, &pwzData);
76 ExitOnFailure(hr, "Failed to get Path for WebDir");
77
78 hr = ::StringCchCopyW(pswd->wzPath, countof(pswd->wzPath), pwzData);
79 ExitOnFailure(hr, "Failed to copy path for WebDir");
80
81 // get the directory properties for this web
82 hr = WcaGetRecordString(hRec, wdqProperties, &pwzData);
83 ExitOnFailure(hr, "Failed to get security identifier for WebDir");
84 if (*pwzData)
85 {
86 hr = ScaGetWebDirProperties(pwzData, hUserQuery, hWebDirPropQuery, &pswd->swp);
87 ExitOnFailure(hr, "Failed to get properties for WebDir");
88
89 pswd->fHasProperties = TRUE;
90 }
91
92 // get the application information for this web directory
93 hr = WcaGetRecordString(hRec, wdqApplication, &pwzData);
94 ExitOnFailure(hr, "Failed to get application identifier for WebDir");
95 if (*pwzData)
96 {
97 hr = ScaGetWebApplication(NULL, pwzData, hWebAppQuery, hWebAppExtQuery, &pswd->swapp);
98 ExitOnFailure(hr, "Failed to get application for WebDir");
99
100 pswd->fHasApplication = TRUE;
101 }
102 }
103
104 if (E_NOMOREITEMS == hr)
105 {
106 hr = S_OK;
107 }
108 ExitOnFailure(hr, "Failure while processing WebDirs");
109
110LExit:
111 WcaFinishUnwrapQuery(hWrapQuery);
112
113 ReleaseStr(pwzData);
114
115 return hr;
116}
117
118
119HRESULT ScaWebDirsInstall7(SCA_WEBDIR7* pswdList, SCA_APPPOOL * psapList)
120{
121 HRESULT hr = S_OK;
122 SCA_WEBDIR7* pswd = pswdList;
123
124 while (pswd)
125 {
126 // if we are installing the web site
127 if (WcaIsInstalling(pswd->isInstalled, pswd->isAction))
128 {
129 hr = ScaWriteConfigID(IIS_WEBDIR);
130 ExitOnFailure(hr, "Failed to write WebDir ID");
131
132 hr = ScaWriteConfigID(IIS_CREATE);
133 ExitOnFailure(hr, "Failed to write WebDir action ID");
134
135 hr = ScaWriteConfigString(pswd->wzWebSite);
136 ExitOnFailure(hr, "Failed to write WebDir site");
137
138 hr = ScaWriteConfigString(pswd->wzPath);
139 ExitOnFailure(hr, "Failed to write WebDir path");
140
141 // get the security information for this web
142 if (pswd->fHasProperties)
143 {
144 ScaWriteWebDirProperties7(pswd->wzWebSite, pswd->wzPath, &pswd->swp);
145 ExitOnFailure(hr, "Failed to write properties for WebDir");
146 }
147
148 // get the application information for this web directory
149 if (pswd->fHasApplication)
150 {
151 hr = ScaWriteWebApplication7(pswd->wzWebSite, pswd->wzPath, &pswd->swapp, psapList);
152 ExitOnFailure(hr, "Failed to write application for WebDir");
153 }
154 }
155
156 pswd = pswd->pswdNext;
157 }
158
159LExit:
160 return hr;
161}
162
163
164HRESULT ScaWebDirsUninstall7(SCA_WEBDIR7* pswdList)
165{
166 HRESULT hr = S_OK;
167 SCA_WEBDIR7* pswd = pswdList;
168
169 while (pswd)
170 {
171 if (WcaIsUninstalling(pswd->isInstalled, pswd->isAction))
172 {
173 hr = ScaWriteConfigID(IIS_WEBDIR);
174 ExitOnFailure(hr, "Failed to write WebDir ID");
175
176 hr = ScaWriteConfigID(IIS_DELETE);
177 ExitOnFailure(hr, "Failed to write WebDir action ID");
178
179 hr = ScaWriteConfigString(pswd->wzWebSite);
180 ExitOnFailure(hr, "Failed to write WebDir site");
181
182 hr = ScaWriteConfigString(pswd->wzPath);
183 ExitOnFailure(hr, "Failed to write WebDir path");
184 }
185
186 pswd = pswd->pswdNext;
187 }
188
189LExit:
190 return hr;
191}
192
193
194void ScaWebDirsFreeList7(SCA_WEBDIR7* pswdList)
195{
196 SCA_WEBDIR7* pswdDelete = pswdList;
197 while (pswdList)
198 {
199 pswdDelete = pswdList;
200 pswdList = pswdList->pswdNext;
201
202 MemFree(pswdDelete);
203 }
204}
205
206
207static HRESULT AddWebDirToList(SCA_WEBDIR7** ppswdList)
208{
209 HRESULT hr = S_OK;
210
211 SCA_WEBDIR7* pswd = static_cast<SCA_WEBDIR7*>(MemAlloc(sizeof(SCA_WEBDIR7), TRUE));
212 ExitOnNull(pswd, hr, E_OUTOFMEMORY, "failed to allocate element for web dir list");
213
214 pswd->pswdNext = *ppswdList;
215 *ppswdList = pswd;
216
217LExit:
218 return hr;
219}
diff --git a/src/ext/Iis/ca/scawebdir7.h b/src/ext/Iis/ca/scawebdir7.h
new file mode 100644
index 00000000..c5c87e17
--- /dev/null
+++ b/src/ext/Iis/ca/scawebdir7.h
@@ -0,0 +1,51 @@
1#pragma once
2// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
3
4
5struct SCA_WEBDIR7
6{
7 // darwin information
8 WCHAR wzKey[MAX_DARWIN_KEY + 1];
9 WCHAR wzComponent[MAX_DARWIN_KEY + 1];
10 INSTALLSTATE isInstalled;
11 INSTALLSTATE isAction;
12
13
14 // iis configuation information
15 WCHAR wzPath[MAX_PATH];
16 WCHAR wzWebSite[MAX_PATH];
17
18 BOOL fHasProperties;
19 SCA_WEB_PROPERTIES swp;
20
21 BOOL fHasApplication;
22 SCA_WEB_APPLICATION swapp;
23
24 SCA_WEBDIR7* pswdNext;
25};
26
27
28// prototypes
29UINT __stdcall ScaWebDirsRead7(
30 __in SCA_WEB7* pswList,
31 __in WCA_WRAPQUERY_HANDLE hUserQuery,
32 __in WCA_WRAPQUERY_HANDLE hWebBaseQuery,
33 __in WCA_WRAPQUERY_HANDLE hWebDirPropQuery,
34 __in WCA_WRAPQUERY_HANDLE hWebAppQuery,
35 __in WCA_WRAPQUERY_HANDLE hWebAppExtQuery,
36 __inout LPWSTR *ppwzCustomActionData,
37 __out SCA_WEBDIR7** ppswdList
38 );
39
40HRESULT ScaWebDirsInstall7(
41 __in SCA_WEBDIR7* pswdList,
42 __in SCA_APPPOOL* psapList
43 );
44
45HRESULT ScaWebDirsUninstall7(
46 __in SCA_WEBDIR7* pswdList
47 );
48
49void ScaWebDirsFreeList7(
50 __in SCA_WEBDIR7* pswdList
51 );
diff --git a/src/ext/Iis/ca/scaweberr.cpp b/src/ext/Iis/ca/scaweberr.cpp
new file mode 100644
index 00000000..2441f006
--- /dev/null
+++ b/src/ext/Iis/ca/scaweberr.cpp
@@ -0,0 +1,371 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3#include "precomp.h"
4
5enum eWebErrorQuery { weqErrorCode = 1, weqSubCode, weqParentType, weqParentValue, weqFile, weqURL };
6
7static HRESULT AddWebErrorToList(SCA_WEB_ERROR** ppsweList);
8
9void ScaWebErrorFreeList(SCA_WEB_ERROR *psweList)
10{
11 SCA_WEB_ERROR *psweDelete = psweList;
12 while (psweList)
13 {
14 psweDelete = psweList;
15 psweList = psweList->psweNext;
16
17 MemFree(psweDelete);
18 }
19}
20
21HRESULT ScaWebErrorRead(
22 SCA_WEB_ERROR **ppsweList,
23 __inout LPWSTR *ppwzCustomActionData
24 )
25{
26// AssertSz(0, "Debug ScaWebErrorRead here");
27 HRESULT hr = S_OK;
28 MSIHANDLE hRec;
29 LPWSTR pwzData = NULL;
30 SCA_WEB_ERROR* pswe;
31 WCA_WRAPQUERY_HANDLE hWrapQuery = NULL;
32
33 ExitOnNull(ppsweList, hr, E_INVALIDARG, "Failed to read web error, because no web error was provided to read");
34
35 hr = WcaBeginUnwrapQuery(&hWrapQuery, ppwzCustomActionData);
36 ExitOnFailure(hr, "Failed to unwrap query for ScaAppPoolRead");
37
38 if (0 == WcaGetQueryRecords(hWrapQuery))
39 {
40 WcaLog(LOGMSG_VERBOSE, "Skipping ScaWebErrorRead() - required tables not present.");
41 ExitFunction1(hr = S_FALSE);
42 }
43
44 // loop through all the web errors
45 while (S_OK == (hr = WcaFetchWrappedRecord(hWrapQuery, &hRec)))
46 {
47 hr = AddWebErrorToList(ppsweList);
48 ExitOnFailure(hr, "failed to add web error to list");
49
50 pswe = *ppsweList;
51
52 hr = WcaGetRecordInteger(hRec, weqErrorCode, &(pswe->iErrorCode));
53 ExitOnFailure(hr, "failed to get IIsWebError.ErrorCode");
54
55 hr = WcaGetRecordInteger(hRec, weqSubCode, &(pswe->iSubCode));
56 ExitOnFailure(hr, "failed to get IIsWebError.SubCode");
57
58 hr = WcaGetRecordInteger(hRec, weqParentType, &(pswe->iParentType));
59 ExitOnFailure(hr, "failed to get IIsWebError.ParentType");
60
61 hr = WcaGetRecordString(hRec, weqParentValue, &pwzData);
62 ExitOnFailure(hr, "Failed to get IIsWebError.ParentValue");
63 hr = ::StringCchCopyW(pswe->wzParentValue, countof(pswe->wzParentValue), pwzData);
64 ExitOnFailure(hr, "Failed to copy IIsWebError.ParentValue");
65
66 hr = WcaGetRecordString(hRec, weqFile, &pwzData);
67 ExitOnFailure(hr, "Failed to get IIsWebError.File");
68 hr = ::StringCchCopyW(pswe->wzFile, countof(pswe->wzFile), pwzData);
69 ExitOnFailure(hr, "Failed to copy IIsWebError.File");
70
71 hr = WcaGetRecordString(hRec, weqURL, &pwzData);
72 ExitOnFailure(hr, "Failed to get IIsWebError.URL");
73 hr = ::StringCchCopyW(pswe->wzURL, countof(pswe->wzURL), pwzData);
74 ExitOnFailure(hr, "Failed to copy IIsWebError.URL");
75
76 // If they've specified both a file and a URL, that's invalid
77 if (*(pswe->wzFile) && *(pswe->wzURL))
78 ExitOnFailure(hr = HRESULT_FROM_WIN32(ERROR_INVALID_DATA), "Both File and URL specified for web error. File: %ls, URL: %ls", pswe->wzFile, pswe->wzURL);
79 }
80
81 if (E_NOMOREITEMS == hr)
82 {
83 hr = S_OK;
84 }
85 ExitOnFailure(hr, "Failure while processing web errors");
86
87LExit:
88 WcaFinishUnwrapQuery(hWrapQuery);
89
90 ReleaseStr(pwzData);
91
92 return hr;
93}
94
95HRESULT ScaGetWebError(int iParentType, LPCWSTR wzParentValue, SCA_WEB_ERROR **ppsweList, SCA_WEB_ERROR **ppsweOut)
96{
97 HRESULT hr = S_OK;
98 SCA_WEB_ERROR* psweAdd = NULL;
99 SCA_WEB_ERROR* psweLast = NULL;
100
101 *ppsweOut = NULL;
102
103 if (!*ppsweList)
104 return hr;
105
106 SCA_WEB_ERROR* pswe = *ppsweList;
107 while (pswe)
108 {
109 if (iParentType == pswe->iParentType && 0 == lstrcmpW(wzParentValue, pswe->wzParentValue))
110 {
111 // Found a match, take this one out of the list and add it to the matched out list
112 psweAdd = pswe;
113
114 if (psweLast)
115 {
116 // If we're not at the beginning of the list tell the last node about it's new next (since we're taking away it's current next)
117 psweLast->psweNext = psweAdd->psweNext;
118 }
119 else
120 {
121 // If we are at the beginning (no psweLast) update the beginning (since we're taking it)
122 *ppsweList = pswe->psweNext;
123 }
124 pswe = pswe->psweNext; // move on
125
126 // Add the one we've removed to the beginning of the out list
127 psweAdd->psweNext = *ppsweOut;
128 *ppsweOut = psweAdd;
129 }
130 else
131 {
132 psweLast = pswe; // remember the last we that didn't match
133 pswe = pswe->psweNext; // move on
134 }
135 }
136
137 return hr;
138}
139
140HRESULT ScaWriteWebError(IMSAdminBase* piMetabase, int iParentType, LPCWSTR wzRoot, SCA_WEB_ERROR* psweList)
141{
142// AssertSz(0, "Debug ScaWriteWebError here");
143 Assert(*wzRoot && psweList);
144
145 HRESULT hr = S_OK;
146
147 DWORD cchData = 0;
148 LPWSTR pwzSearchKey = NULL;
149 LPWSTR pwz = NULL;
150 LPWSTR pwzErrors = NULL;
151
152 LPWSTR pwzCodeSubCode = NULL;
153 LPWSTR pwzAcceptableCodeSubCode = NULL;
154 LPCWSTR wzFoundCodeSubCode = NULL;
155 DWORD_PTR dwFoundCodeSubCodeIndex = 0xFFFFFFFF;
156 BOOL fOldValueFound = FALSE;
157 LPWSTR pwzAcceptableErrors = NULL;
158
159 LPWSTR pwzNewError = NULL;
160
161 METADATA_RECORD mr;
162 ::ZeroMemory(&mr, sizeof(mr));
163
164 ExitOnNull(piMetabase, hr, E_INVALIDARG, "Failed to write web error, because no metabase was provided");
165 ExitOnNull(wzRoot, hr, E_INVALIDARG, "Failed to write web error, because no root was provided");
166
167 // get the set of all valid custom errors from the metabase
168 mr.dwMDIdentifier = MD_CUSTOM_ERROR_DESC;
169 mr.dwMDAttributes = METADATA_INHERIT;
170 mr.dwMDUserType = IIS_MD_UT_SERVER;
171 mr.dwMDDataType = ALL_METADATA;
172 mr.dwMDDataLen = cchData = 0;
173 mr.pbMDData = NULL;
174
175 hr = MetaGetValue(piMetabase, METADATA_MASTER_ROOT_HANDLE, L"/LM/W3SVC/Info", &mr);
176 ExitOnFailure(hr, "Unable to get set of acceptable error codes for this server.");
177
178 pwzAcceptableErrors = reinterpret_cast<LPWSTR>(mr.pbMDData);
179
180 // Check if web errors already exist here
181 mr.dwMDIdentifier = MD_CUSTOM_ERROR;
182 mr.dwMDAttributes = METADATA_INHERIT;
183 mr.dwMDUserType = IIS_MD_UT_SERVER;
184 mr.dwMDDataType = ALL_METADATA;
185 mr.dwMDDataLen = cchData = 0;
186 mr.pbMDData = NULL;
187
188 hr = MetaGetValue(piMetabase, METADATA_MASTER_ROOT_HANDLE, wzRoot, &mr);
189 if (HRESULT_FROM_WIN32(ERROR_PATH_NOT_FOUND) == hr || MD_ERROR_DATA_NOT_FOUND == hr)
190 {
191 //
192 // If we don't have one already, find an appropriate one to start with
193 //
194
195 // we can walk up key by key and look for custom errors to inherit
196
197 hr = StrAllocConcat(&pwzSearchKey, wzRoot, 0);
198 ExitOnFailure(hr, "Failed to copy root string: %ls", wzRoot);
199
200 pwz = pwzSearchKey + lstrlenW(pwzSearchKey);
201
202 while (NULL == pwzErrors)
203 {
204 // find the last slash
205 while (*pwz != '/' && pwz != pwzSearchKey)
206 pwz --;
207
208 if (pwz == pwzSearchKey)
209 break;
210
211 *pwz = L'\0';
212
213 // Try here. If it's not found, keep walking up the path
214 hr = MetaGetValue(piMetabase, METADATA_MASTER_ROOT_HANDLE, pwzSearchKey, &mr);
215 if (HRESULT_FROM_WIN32(ERROR_PATH_NOT_FOUND) == hr || MD_ERROR_DATA_NOT_FOUND == hr)
216 hr = S_FALSE;
217 ExitOnFailure(hr, "failed to discover default error values to start with for web root: %ls while walking up the tree", wzRoot);
218
219 if (S_OK == hr)
220 {
221 pwzErrors = reinterpret_cast<LPWSTR>(mr.pbMDData);
222 break;
223 }
224
225 // Don't keep going if we're at the root
226 if (0 == lstrcmpW(pwz + 1, L"W3SVC"))
227 break;
228 }
229 }
230 else
231 {
232 pwzErrors = reinterpret_cast<LPWSTR>(mr.pbMDData);
233 }
234 ExitOnFailure(hr, "failed to discover default error values to start with for web root: %ls", wzRoot);
235
236 // The above code should have come up with some value to start pwzErrors off with. Make sure it did.
237 if (NULL == pwzErrors)
238 {
239 ExitOnFailure(hr = E_UNEXPECTED, "failed to discover default error values to start with for web root: %ls", wzRoot);
240 }
241
242 // Loop through the web errors
243 for (SCA_WEB_ERROR* pswe = psweList; pswe; pswe = pswe->psweNext)
244 {
245 // Assume that we will have to replace
246 fOldValueFound = TRUE;
247
248 // If the subcode is 0, that means "*" in MD_CUSTOM_ERROR (thus the special formatting logic)
249 if (0 == pswe->iSubCode)
250 {
251 hr = StrAllocFormatted(&pwzCodeSubCode, L"%d,*", pswe->iErrorCode);
252 ExitOnFailure(hr, "failed to create error code string while installing web error");
253 }
254 else
255 {
256 hr = StrAllocFormatted(&pwzCodeSubCode, L"%d,%d", pswe->iErrorCode, pswe->iSubCode);
257 ExitOnFailure(hr, "failed to create error code,subcode string while installing web error");
258 }
259
260 hr = MultiSzFindSubstring(pwzErrors, pwzCodeSubCode, &dwFoundCodeSubCodeIndex, &wzFoundCodeSubCode);
261 ExitOnFailure(hr, "failed to find existing error code,subcode: %ls", pwzCodeSubCode);
262
263 // If we didn't find this error code/sub code pair in the list already, make sure it's acceptable to add
264 if (S_FALSE == hr)
265 {
266 //
267 // Make sure this error code/sub code pair is in the "acceptable" list
268 //
269
270 // If the subcode is 0, that means "0" in MD_CUSTOM_ERROR_DESC (no special formatting logic needed)
271 hr = StrAllocFormatted(&pwzAcceptableCodeSubCode, L"%d,%d", pswe->iErrorCode, pswe->iSubCode);
272 ExitOnFailure(hr, "failed to create error code,subcode string while installing web error");
273
274 // We don't care where it is, just whether it's there or not
275 hr = MultiSzFindSubstring(pwzAcceptableErrors, pwzAcceptableCodeSubCode, NULL, NULL);
276 ExitOnFailure(hr, "failed to find whether or not error code, subcode: %ls is supported", pwzCodeSubCode);
277
278 if (S_FALSE == hr)
279 {
280 WcaLog(LOGMSG_VERBOSE, "Skipping error code, subcode: %ls because it is not supported by the server.", pwzCodeSubCode);
281 continue;
282 }
283
284 // If we didn't find it (and its an acceptable error) then we have nothing to replace
285 fOldValueFound = FALSE;
286 }
287
288 // Set up the new error string if needed
289 if (*(pswe->wzFile))
290 {
291 hr = StrAllocFormatted(&pwzNewError, L"%s,FILE,%s", pwzCodeSubCode, pswe->wzFile);
292 ExitOnFailure(hr, "failed to create new error code string with code,subcode: %ls, file: %ls", pwzCodeSubCode, pswe->wzFile);
293 }
294 else if (*(pswe->wzURL))
295 {
296 hr = StrAllocFormatted(&pwzNewError, L"%s,URL,%s", pwzCodeSubCode, pswe->wzURL);
297 ExitOnFailure(hr, "failed to create new error code string with code,subcode: %ls, file: %ls", pwzCodeSubCode, pswe->wzFile);
298 }
299 else if (fOldValueFound)
300 {
301 // If no File or URL was specified, they want a default error so remove the old value from the MULTISZ and move on
302 hr = MultiSzRemoveString(&pwzErrors, dwFoundCodeSubCodeIndex);
303 ExitOnFailure(hr, "failed to remove string for error code sub code: %ls in order to make it 'default'", pwzCodeSubCode);
304 continue;
305 }
306
307 // If we have something to replace, replace it, otherwise, put it at the beginning (order shouldn't matter)
308 if (fOldValueFound)
309 {
310 hr = MultiSzReplaceString(&pwzErrors, dwFoundCodeSubCodeIndex, pwzNewError);
311 ExitOnFailure(hr, "failed to replace old error string with new error string for error code,subcode: %ls", pwzCodeSubCode);
312 }
313 else
314 {
315 hr = MultiSzPrepend(&pwzErrors, NULL, pwzNewError);
316 ExitOnFailure(hr, "failed to prepend new error string for error code,subcode: %ls", pwzCodeSubCode);
317 }
318 }
319
320 // now write the CustomErrors to the metabase
321 if (weptWeb == iParentType)
322 {
323 hr = ScaWriteMetabaseValue(piMetabase, wzRoot, L"/Root", MD_CUSTOM_ERROR, METADATA_INHERIT, IIS_MD_UT_FILE, MULTISZ_METADATA, pwzErrors);
324 ExitOnFailure(hr, "Failed to write Web Error to /Root");
325 }
326 else
327 {
328 hr = ScaWriteMetabaseValue(piMetabase, wzRoot, NULL, MD_CUSTOM_ERROR, METADATA_INHERIT, IIS_MD_UT_FILE, MULTISZ_METADATA, pwzErrors);
329 ExitOnFailure(hr, "Failed to write Web Error");
330 }
331
332LExit:
333 ReleaseStr(pwzErrors);
334 ReleaseStr(pwzSearchKey);
335 ReleaseStr(pwzCodeSubCode);
336 ReleaseStr(pwzAcceptableCodeSubCode);
337 ReleaseStr(pwzAcceptableErrors);
338
339 return hr;
340}
341
342static HRESULT AddWebErrorToList(SCA_WEB_ERROR** ppsweList)
343{
344 HRESULT hr = S_OK;
345
346 SCA_WEB_ERROR* pswe = static_cast<SCA_WEB_ERROR*>(MemAlloc(sizeof(SCA_WEB_ERROR), TRUE));
347 ExitOnNull(pswe, hr, E_OUTOFMEMORY, "failed to allocate memory for new web error list element");
348
349 pswe->psweNext = *ppsweList;
350 *ppsweList = pswe;
351
352LExit:
353 return hr;
354}
355
356HRESULT ScaWebErrorCheckList(SCA_WEB_ERROR* psweList)
357{
358 if (!psweList)
359 {
360 return S_OK;
361 }
362
363 while (psweList)
364 {
365 WcaLog(LOGMSG_STANDARD, "WebError code: %d subcode: %d for parent: %ls not used!", psweList->iErrorCode, psweList->iSubCode, psweList->wzParentValue);
366 psweList = psweList->psweNext;
367 }
368
369 return E_FAIL;
370}
371
diff --git a/src/ext/Iis/ca/scaweberr.h b/src/ext/Iis/ca/scaweberr.h
new file mode 100644
index 00000000..ad8ff4f5
--- /dev/null
+++ b/src/ext/Iis/ca/scaweberr.h
@@ -0,0 +1,30 @@
1#pragma once
2// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
3
4
5enum eWebErrorParentType { weptVDir = 1, weptWeb };
6
7struct SCA_WEB_ERROR
8{
9 int iErrorCode;
10 int iSubCode;
11
12 int iParentType;
13 WCHAR wzParentValue[MAX_DARWIN_KEY + 1];
14
15 WCHAR wzFile[MAX_PATH];
16 WCHAR wzURL[MAX_PATH]; // TODO: this needs to be bigger than MAX_PATH
17
18 SCA_WEB_ERROR *psweNext;
19};
20
21// prototypes
22HRESULT ScaWebErrorRead(
23 SCA_WEB_ERROR **ppsweList,
24 __inout LPWSTR *ppwzCustomActionData
25 );
26void ScaWebErrorFreeList(SCA_WEB_ERROR *psweList);
27HRESULT ScaWebErrorCheckList(SCA_WEB_ERROR* psweList);
28HRESULT ScaGetWebError(int iParentType, LPCWSTR wzParentValue, SCA_WEB_ERROR **ppsweList, SCA_WEB_ERROR **ppsweOut);
29HRESULT ScaWriteWebError(IMSAdminBase* piMetabase, int iParentType, LPCWSTR wzRoot, SCA_WEB_ERROR* psweList);
30
diff --git a/src/ext/Iis/ca/scaweberr7.cpp b/src/ext/Iis/ca/scaweberr7.cpp
new file mode 100644
index 00000000..33c2f1bd
--- /dev/null
+++ b/src/ext/Iis/ca/scaweberr7.cpp
@@ -0,0 +1,88 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3#include "precomp.h"
4
5HRESULT ScaWriteWebError7(
6 __in_z LPCWSTR wzWebName,
7 __in_z LPCWSTR wzRoot,
8 SCA_WEB_ERROR* psweList
9 )
10{
11 HRESULT hr = S_OK;
12
13 hr = ScaWriteConfigID(IIS_WEBERROR_BEGIN);
14 ExitOnFailure(hr, "Fail to write webError begin ID");
15
16 hr = ScaWriteConfigString(wzWebName);
17 ExitOnFailure(hr, "Fail to write webError Web Key");
18
19 hr = ScaWriteConfigString(wzRoot);
20 ExitOnFailure(hr, "Fail to write webError Vdir key");
21
22 // Loop through the HTTP headers
23 for (SCA_WEB_ERROR* pswe = psweList; pswe; pswe = pswe->psweNext)
24 {
25 hr = ScaWriteConfigID(IIS_WEBERROR);
26 ExitOnFailure(hr, "Fail to write webError ID");
27
28 hr = ScaWriteConfigInteger(pswe->iErrorCode);
29 ExitOnFailure(hr, "Fail to write webError code");
30
31 hr = ScaWriteConfigInteger(pswe->iSubCode);
32 ExitOnFailure(hr, "Fail to write webError subcode");
33
34 //just write one
35 if (*(pswe->wzFile))
36 {
37 hr = ScaWriteConfigString(pswe->wzFile);
38 ExitOnFailure(hr, "Fail to write webError file");
39 hr = ScaWriteConfigInteger(0);
40 ExitOnFailure(hr, "Fail to write webError file code");
41 }
42 else if (*(pswe->wzURL))
43 {
44 hr = ScaWriteConfigString(pswe->wzURL);
45 ExitOnFailure(hr, "Fail to write webError URL");
46 hr = ScaWriteConfigInteger(1);
47 ExitOnFailure(hr, "Fail to write webError URL code");
48 }
49 }
50
51 hr = ScaWriteConfigID(IIS_WEBERROR_END);
52 ExitOnFailure(hr, "Fail to write httpHeader end ID");
53
54LExit:
55 return hr;
56
57}
58
59//static HRESULT AddWebErrorToList(SCA_WEB_ERROR** ppsweList)
60//{
61// HRESULT hr = S_OK;
62//
63// SCA_WEB_ERROR* pswe = static_cast<SCA_WEB_ERROR*>(MemAlloc(sizeof(SCA_WEB_ERROR), TRUE));
64// ExitOnNull(pswe, hr, E_OUTOFMEMORY, "failed to allocate memory for new web error list element");
65//
66// pswe->psweNext = *ppsweList;
67// *ppsweList = pswe;
68//
69//LExit:
70// return hr;
71//}
72
73HRESULT ScaWebErrorCheckList7(SCA_WEB_ERROR* psweList)
74{
75 if (!psweList)
76 {
77 return S_OK;
78 }
79
80 while (psweList)
81 {
82 WcaLog(LOGMSG_STANDARD, "WebError code: %d subcode: %d for parent: %ls not used!", psweList->iErrorCode, psweList->iSubCode, psweList->wzParentValue);
83 psweList = psweList->psweNext;
84 }
85
86 return E_FAIL;
87}
88
diff --git a/src/ext/Iis/ca/scaweberr7.h b/src/ext/Iis/ca/scaweberr7.h
new file mode 100644
index 00000000..62448211
--- /dev/null
+++ b/src/ext/Iis/ca/scaweberr7.h
@@ -0,0 +1,10 @@
1#pragma once
2// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
3
4
5HRESULT ScaWriteWebError7(
6 __in_z LPCWSTR wzWebName,
7 __in_z LPCWSTR wzRoot,
8 SCA_WEB_ERROR* psweList
9 );
10
diff --git a/src/ext/Iis/ca/scaweblog.cpp b/src/ext/Iis/ca/scaweblog.cpp
new file mode 100644
index 00000000..01147848
--- /dev/null
+++ b/src/ext/Iis/ca/scaweblog.cpp
@@ -0,0 +1,177 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3#include "precomp.h"
4
5enum eWebLogQuery { wlqLog = 1, wlqFormat };
6
7/* ****************************************************************
8 * LookupLogFormatGUID -Looks up a given IIS Log format type in
9 * the metabase and returns the GUID for it.
10 * ****************************************************************/
11static HRESULT LookupLogFormatGUID(
12 __in IMSAdminBase* piMetabase,
13 __in LPCWSTR wzLogFormat,
14 __out_ecount(cchGUID) LPWSTR wzGUID,
15 __in int cchGUID
16 )
17{
18 WCHAR wzKey[METADATA_MAX_NAME_LEN];
19 HRESULT hr = S_OK;
20
21 METADATA_RECORD mrKeyType;
22 ::ZeroMemory(&mrKeyType, sizeof(mrKeyType));
23
24 mrKeyType.dwMDIdentifier = MD_KEY_TYPE;
25 mrKeyType.dwMDAttributes = METADATA_NO_ATTRIBUTES;
26 mrKeyType.dwMDUserType = IIS_MD_UT_SERVER;
27 mrKeyType.dwMDDataType = ALL_METADATA;
28 mrKeyType.dwMDDataLen = 0;
29 mrKeyType.pbMDData = NULL;
30
31 METADATA_RECORD mrPluginId;
32 ::ZeroMemory(&mrPluginId, sizeof(mrPluginId));
33
34 mrPluginId.dwMDIdentifier = MD_LOG_PLUGIN_MOD_ID;
35 mrPluginId.dwMDAttributes = METADATA_INHERIT;
36 mrPluginId.dwMDUserType = IIS_MD_UT_SERVER;
37 mrPluginId.dwMDDataType = ALL_METADATA;
38 mrPluginId.dwMDDataLen = 0;
39 mrPluginId.pbMDData = NULL;
40
41 hr = ::StringCchPrintfW(wzKey, countof(wzKey), L"/LM/Logging/%s", wzLogFormat);
42 ExitOnFailure(hr, "failed to format logging metabase key name");
43
44 // verify that we have this log format available in IIS
45 hr = MetaGetValue(piMetabase, METADATA_MASTER_ROOT_HANDLE, wzKey, &mrKeyType);
46 ExitOnFailure(hr, "Failed to find specified Log format key in IIS for log format: %ls", wzLogFormat);
47 ExitOnNull(mrKeyType.pbMDData, hr, E_POINTER, "Request for Log format key in IIS for log format returned success, but value was NULL");
48
49 if (0 != lstrcmpW(L"IIsLogModule", (LPCWSTR)mrKeyType.pbMDData))
50 {
51 ExitOnFailure(hr = E_UNEXPECTED, "Found invalid log format in IIS: %ls", (LPCWSTR)mrKeyType.pbMDData);
52 }
53
54 // find the GUID for that log format
55 hr = MetaGetValue(piMetabase, METADATA_MASTER_ROOT_HANDLE, wzKey, &mrPluginId);
56 ExitOnFailure(hr, "Failed to retrieve IISLog format GUID. Key: %ls", wzKey);
57 ExitOnNull(mrPluginId.pbMDData, hr, E_POINTER, "Retrieval of IISLog format GUID returned success, but value was NULL");
58
59 hr = ::StringCchCopyW(wzGUID, cchGUID, (LPCWSTR)mrPluginId.pbMDData);
60 ExitOnFailure(hr, "failed to copy metabase value: %ls", (LPCWSTR)mrPluginId.pbMDData);
61
62LExit:
63
64 if (mrKeyType.pbMDData)
65 {
66 MetaFreeValue(&mrKeyType);
67 }
68
69 if (mrPluginId.pbMDData)
70 {
71 MetaFreeValue(&mrPluginId);
72 }
73
74 return hr;
75}
76
77
78/* ****************************************************************
79 * ScaGetWebLog -Retrieves Log table data for the specified Log key
80 *
81 * ****************************************************************/
82HRESULT ScaGetWebLog(
83 IMSAdminBase* piMetabase,
84 LPCWSTR wzLog,
85 __in WCA_WRAPQUERY_HANDLE hWebLogQuery,
86 SCA_WEB_LOG* pswl
87 )
88{
89 HRESULT hr = S_OK;
90 LPWSTR pwzData = NULL;
91 MSIHANDLE hRec;
92
93 if (0 == WcaGetQueryRecords(hWebLogQuery))
94 {
95 WcaLog(LOGMSG_VERBOSE, "Skipping ScaGetWebLog() - no records to process");
96 ExitFunction1(hr = S_FALSE);
97 }
98
99 WcaFetchWrappedReset(hWebLogQuery);
100
101 hr = WcaFetchWrappedRecordWhereString(hWebLogQuery, wlqLog, wzLog, &hRec);
102 if (E_NOMOREITEMS == hr)
103 {
104 ExitOnFailure(hr, "cannot locate IIsWebLog.Log='%ls'", wzLog);
105 }
106 HRESULT hrTemp = WcaFetchWrappedRecordWhereString(hWebLogQuery, wlqLog, wzLog, &hRec);
107
108 if (SUCCEEDED(hrTemp))
109 {
110 ExitOnFailure(hr, "error - found multiple matching IIsWebLog rows");
111 }
112
113 ::ZeroMemory(pswl, sizeof(SCA_WEB_LOG));
114
115 // check that log key matches
116 hr = WcaGetRecordString(hRec, wlqLog, &pwzData);
117 ExitOnFailure(hr, "failed to get IIsWebLog.Log for Log: %ls", wzLog);
118 hr = ::StringCchCopyW(pswl->wzLog, countof(pswl->wzLog), pwzData);
119 ExitOnFailure(hr, "failed to copy log name: %ls", pwzData);
120
121 hr = WcaGetRecordString(hRec, wlqFormat, &pwzData);
122 ExitOnFailure(hr, "failed to get IIsWebLog.Format for Log:", wzLog);
123 hr = ::StringCchCopyW(pswl->wzFormat, countof(pswl->wzFormat), pwzData);
124 ExitOnFailure(hr, "failed to copy log format: %ls", pwzData);
125
126 // if they specified a log format, look up its GUID in the metabase
127 if (*pswl->wzFormat && 0 != lstrcmpW(pswl->wzFormat, L"none"))
128 {
129 hr = LookupLogFormatGUID(piMetabase, pswl->wzFormat, pswl->wzFormatGUID, countof(pswl->wzFormatGUID));
130 ExitOnFailure(hr, "Failed to get Log Format GUID for Log: %ls", wzLog);
131 }
132
133LExit:
134 ReleaseStr(pwzData);
135
136 return hr;
137}
138
139
140/* ****************************************************************
141 * ScaWriteWebLog -Writes the IIS log values to the metabase.
142 *
143 * ****************************************************************/
144HRESULT ScaWriteWebLog(
145 IMSAdminBase* piMetabase,
146 LPCWSTR wzWebBase,
147 SCA_WEB_LOG *pswl
148 )
149{
150 HRESULT hr = S_OK;
151
152 if (*pswl->wzFormat)
153 {
154 if (0 == lstrcmpW(pswl->wzFormat, L"none"))
155 {
156 // user wishes for Logging to be turned 'off'
157 hr = ScaWriteMetabaseValue(piMetabase, wzWebBase, L"", MD_LOG_TYPE, METADATA_INHERIT, IIS_MD_UT_SERVER, DWORD_METADATA, (LPVOID)((DWORD_PTR)0));
158 ExitOnFailure(hr, "Failed to write Log Type for Web: %ls", wzWebBase);
159 }
160 else
161 {
162 Assert(*pswl->wzFormatGUID);
163
164 // write the GUID for the log format for the web to the metabase
165 hr = ScaWriteMetabaseValue(piMetabase, wzWebBase, L"", MD_LOG_PLUGIN_ORDER, METADATA_INHERIT, IIS_MD_UT_SERVER, STRING_METADATA, pswl->wzFormatGUID);
166 ExitOnFailure(hr, "Failed to write Log GUID for Web: %ls", wzWebBase);
167
168 hr = ScaWriteMetabaseValue(piMetabase, wzWebBase, L"", MD_LOG_TYPE, METADATA_INHERIT, IIS_MD_UT_SERVER, DWORD_METADATA, (LPVOID)((DWORD_PTR)1));
169 ExitOnFailure(hr, "Failed to write Log Type for Web: %ls", wzWebBase);
170 }
171 }
172
173LExit:
174 return hr;
175}
176
177
diff --git a/src/ext/Iis/ca/scaweblog.h b/src/ext/Iis/ca/scaweblog.h
new file mode 100644
index 00000000..1a690cce
--- /dev/null
+++ b/src/ext/Iis/ca/scaweblog.h
@@ -0,0 +1,27 @@
1#pragma once
2// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
3
4
5struct SCA_WEB_LOG
6{
7 // iis configuation information
8 WCHAR wzLog[MAX_DARWIN_KEY + 1];
9
10 // for specifying the log format
11 WCHAR wzFormat[MAX_DARWIN_KEY + 1];
12 WCHAR wzFormatGUID[MAX_DARWIN_KEY + 1];
13};
14
15
16// prototypes
17HRESULT ScaGetWebLog(
18 IMSAdminBase* piMetabase,
19 LPCWSTR wzLog,
20 __in WCA_WRAPQUERY_HANDLE hWebLogQuery,
21 SCA_WEB_LOG* pswl
22 );
23HRESULT ScaWriteWebLog(
24 IMSAdminBase* piMetabase,
25 LPCWSTR wzRootOfWeb,
26 SCA_WEB_LOG *pswl
27 );
diff --git a/src/ext/Iis/ca/scaweblog7.cpp b/src/ext/Iis/ca/scaweblog7.cpp
new file mode 100644
index 00000000..c857c46f
--- /dev/null
+++ b/src/ext/Iis/ca/scaweblog7.cpp
@@ -0,0 +1,120 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3#include "precomp.h"
4// sql queries
5LPCWSTR vcsWebLogQuery7 = L"SELECT `Log`, `Format` "
6 L"FROM `IIsWebLog` WHERE `Log`=?";
7
8enum eWebLogQuery { wlqLog = 1, wlqFormat };
9
10/* ****************************************************************
11 * ScaGetWebLog7 -Retrieves Log table data for the specified Log key
12 *
13 * ****************************************************************/
14HRESULT ScaGetWebLog7(
15 __in_z LPCWSTR wzLog,
16 __in WCA_WRAPQUERY_HANDLE hWebLogQuery,
17 __out SCA_WEB_LOG* pswl
18 )
19{
20 HRESULT hr = S_OK;
21 LPWSTR pwzData = NULL;
22 MSIHANDLE hRec;
23
24 if (0 == WcaGetQueryRecords(hWebLogQuery))
25 {
26 WcaLog(LOGMSG_VERBOSE, "Skipping ScaGetWebLog() - no records to process");
27 ExitFunction1(hr = S_FALSE);
28 }
29
30 WcaFetchWrappedReset(hWebLogQuery);
31
32 hr = WcaFetchWrappedRecordWhereString(hWebLogQuery, wlqLog, wzLog, &hRec);
33 if (E_NOMOREITEMS == hr)
34 {
35 ExitOnFailure(hr, "cannot locate IIsWebLog.Log='%ls'", wzLog);
36 }
37 HRESULT hrTemp = WcaFetchWrappedRecordWhereString(hWebLogQuery, wlqLog, wzLog, &hRec);
38
39 if (SUCCEEDED(hrTemp))
40 {
41 ExitOnFailure(hr, "error - found multiple matching IIsWebLog rows");
42 }
43
44 ::ZeroMemory(pswl, sizeof(SCA_WEB_LOG));
45
46 // check that log key matches
47 hr = WcaGetRecordString(hRec, wlqLog, &pwzData);
48 ExitOnFailure(hr, "failed to get IIsWebLog.Log for Log: %ls", wzLog);
49 hr = ::StringCchCopyW(pswl->wzLog, countof(pswl->wzLog), pwzData);
50 ExitOnFailure(hr, "failed to copy log name: %ls", pwzData);
51
52 hr = WcaGetRecordString(hRec, wlqFormat, &pwzData);
53 ExitOnFailure(hr, "failed to get IIsWebLog.Format for Log:", wzLog);
54
55 //translate WIX log format name strings to IIS7
56 if (0 == lstrcmpW(pwzData, L"Microsoft IIS Log File Format"))
57 {
58 hr = ::StringCchCopyW(pswl->wzFormat, countof(pswl->wzFormat), L"IIS");
59 ExitOnFailure(hr, "failed to copy log format: %ls", pwzData);
60 }
61 else if (0 == lstrcmpW(pwzData, L"NCSA Common Log File Format"))
62 {
63 hr = ::StringCchCopyW(pswl->wzFormat, countof(pswl->wzFormat), L"NCSA");
64 ExitOnFailure(hr, "failed to copy log format: %ls", pwzData);
65 }
66 else if (0 == lstrcmpW(pwzData, L"none"))
67 {
68 hr = ::StringCchCopyW(pswl->wzFormat, countof(pswl->wzFormat), L"none");
69 ExitOnFailure(hr, "failed to copy log format: %ls", pwzData);
70 }
71 else if (0 == lstrcmpW(pwzData, L"ODBC Logging"))
72 {
73 hr = ::StringCchCopyW(pswl->wzFormat, countof(pswl->wzFormat), L"W3C");
74 ExitOnFailure(hr, "failed to copy log format: %ls", pwzData);
75 }
76 else if (0 == lstrcmpW(pwzData, L"W3C Extended Log File Format"))
77 {
78 hr = ::StringCchCopyW(pswl->wzFormat, countof(pswl->wzFormat), L"W3C");
79 ExitOnFailure(hr, "failed to copy log format: %ls", pwzData);
80 }
81 else
82 {
83 hr = HRESULT_FROM_WIN32(ERROR_INVALID_INDEX);
84 ExitOnFailure(hr, "Invalid log file format: %ls", pwzData);
85 }
86
87LExit:
88 ReleaseStr(pwzData);
89
90 return hr;
91}
92
93
94/* ****************************************************************
95 * ScaWriteWebLog -Writes the IIS log values to the metabase.
96 *
97 * ****************************************************************/
98HRESULT ScaWriteWebLog7(
99 LPCWSTR wzWebBase,
100 const SCA_WEB_LOG *pswl
101 )
102{
103 HRESULT hr = S_OK;
104
105 if (*pswl->wzFormat)
106 {
107 //write pswl->wzFormat
108 hr = ScaWriteConfigID(IIS_WEBLOG);
109 ExitOnFailure(hr, "Failed to write log format id");
110 hr = ScaWriteConfigString(wzWebBase);
111 ExitOnFailure(hr, "Failed to write log web key");
112 hr = ScaWriteConfigString(pswl->wzFormat);
113 ExitOnFailure(hr, "Failed to write log format string");
114 }
115
116LExit:
117 return hr;
118}
119
120
diff --git a/src/ext/Iis/ca/scaweblog7.h b/src/ext/Iis/ca/scaweblog7.h
new file mode 100644
index 00000000..f2bb60d7
--- /dev/null
+++ b/src/ext/Iis/ca/scaweblog7.h
@@ -0,0 +1,14 @@
1#pragma once
2// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
3
4
5HRESULT ScaGetWebLog7(
6 __in_z LPCWSTR wzLog,
7 __in WCA_WRAPQUERY_HANDLE hWebLogQuery,
8 __out SCA_WEB_LOG* pswl
9 );
10
11HRESULT ScaWriteWebLog7(
12 __in_z LPCWSTR wzRootOfWeb,
13 const SCA_WEB_LOG *pswl
14 );
diff --git a/src/ext/Iis/ca/scawebprop.cpp b/src/ext/Iis/ca/scawebprop.cpp
new file mode 100644
index 00000000..b5e38467
--- /dev/null
+++ b/src/ext/Iis/ca/scawebprop.cpp
@@ -0,0 +1,301 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3#include "precomp.h"
4
5// sql queries
6enum eWebDirPropertiesQuery { wpqProperties = 1, wpqAccess, wpqAuthorization, wpqUser, wpqControlledPassword, wpqLogVisits, wpqIndex, wpqDefaultDoc, wpqAspDetailedError, wpqHttpExp, wpqCCMaxAge, wpqCCCustom, wpqNoCustomError, wpqAccessSSLFlags, wpqAuthenticationProviders };
7
8HRESULT ScaGetWebDirProperties(
9 __in LPCWSTR wzProperties,
10 __in WCA_WRAPQUERY_HANDLE hUserQuery,
11 __in WCA_WRAPQUERY_HANDLE hWebDirPropQuery,
12 __inout SCA_WEB_PROPERTIES* pswp
13 )
14{
15 Assert(*wzProperties && pswp);
16
17 HRESULT hr = S_OK;
18 MSIHANDLE hRec;
19 LPWSTR pwzData = NULL;
20
21 ExitOnNull(wzProperties, hr, E_INVALIDARG, "Failed to get web directory properties because no properties were provided to get");
22
23 WcaFetchWrappedReset(hWebDirPropQuery);
24
25 hr = WcaFetchWrappedRecordWhereString(hWebDirPropQuery, 1, wzProperties, &hRec);
26 if (S_OK == hr)
27 {
28 hr = WcaGetRecordString(hRec, wpqProperties, &pwzData);
29 ExitOnFailure(hr, "Failed to get IIsWebDirProperties.DirProperties");
30 hr = ::StringCchCopyW(pswp->wzKey, countof(pswp->wzKey), pwzData);
31 ExitOnFailure(hr, "Failed to copy key string to webdirproperties object");
32
33 Assert(0 == lstrcmpW(pswp->wzKey, wzProperties));
34
35 hr = WcaGetRecordInteger(hRec, wpqAccess, &pswp->iAccess);
36 ExitOnFailure(hr, "Failed to get access value");
37
38 hr = WcaGetRecordInteger(hRec, wpqAuthorization, &pswp->iAuthorization);
39 ExitOnFailure(hr, "Failed to get authorization value");
40
41 // if allow anonymous users
42 if (S_OK == hr && pswp->iAuthorization & 1)
43 {
44 // if there is an anonymous user specified
45 hr = WcaGetRecordString(hRec, wpqUser, &pwzData);
46 ExitOnFailure(hr, "Failed to get AnonymousUser_");
47 if (pwzData && *pwzData)
48 {
49 hr = WcaGetRecordInteger(hRec, wpqControlledPassword, &pswp->fIIsControlledPassword);
50 ExitOnFailure(hr, "Failed to get IIsControlledPassword");
51 if (S_FALSE == hr)
52 {
53 pswp->fIIsControlledPassword = FALSE;
54 hr = S_OK;
55 }
56
57 hr = ScaGetUserDeferred(pwzData, hUserQuery, &pswp->scau);
58 ExitOnFailure(hr, "Failed to get User information for Web");
59
60 pswp->fHasUser = TRUE;
61 }
62 else
63 pswp->fHasUser = FALSE;
64 }
65
66 hr = WcaGetRecordInteger(hRec, wpqLogVisits, &pswp->fLogVisits);
67 ExitOnFailure(hr, "Failed to get IIsWebDirProperties.LogVisits");
68
69 hr = WcaGetRecordInteger(hRec, wpqIndex, &pswp->fIndex);
70 ExitOnFailure(hr, "Failed to get IIsWebDirProperties.Index");
71
72 hr = WcaGetRecordString(hRec, wpqDefaultDoc, &pwzData);
73 ExitOnFailure(hr, "Failed to get IIsWebDirProperties.DefaultDoc");
74 if (pwzData && *pwzData)
75 {
76 pswp->fHasDefaultDoc = TRUE;
77 if (0 == lstrcmpW(L"-", pwzData)) // remove any existing default documents by setting them blank
78 {
79 pswp->wzDefaultDoc[0] = L'\0';
80 }
81 else // set the default documents
82 {
83 hr = ::StringCchCopyW(pswp->wzDefaultDoc, countof(pswp->wzDefaultDoc), pwzData);
84 ExitOnFailure(hr, "Failed to copy default document string to webdirproperties object");
85 }
86 }
87 else
88 {
89 pswp->fHasDefaultDoc = FALSE;
90 }
91
92 hr = WcaGetRecordInteger(hRec, wpqAspDetailedError, &pswp->fAspDetailedError);
93 ExitOnFailure(hr, "Failed to get IIsWebDirProperties.AspDetailedError");
94
95 hr = WcaGetRecordString(hRec, wpqHttpExp, &pwzData);
96 ExitOnFailure(hr, "Failed to get IIsWebDirProperties.HttpExp");
97 if (pwzData && *pwzData)
98 {
99 pswp->fHasHttpExp = TRUE;
100 if (0 == lstrcmpW(L"-", pwzData)) // remove any existing default expiration settings by setting them blank
101 {
102 pswp->wzHttpExp[0] = L'\0';
103 }
104 else // set the expiration setting
105 {
106 hr = ::StringCchCopyW(pswp->wzHttpExp, countof(pswp->wzHttpExp), pwzData);
107 ExitOnFailure(hr, "Failed to copy http expiration string to webdirproperties object");
108 }
109 }
110 else
111 {
112 pswp->fHasHttpExp = FALSE;
113 }
114
115 hr = WcaGetRecordInteger(hRec, wpqCCMaxAge, &pswp->iCacheControlMaxAge);
116 ExitOnFailure(hr, "failed to get IIsWebDirProperties.CacheControlMaxAge");
117
118 hr = WcaGetRecordString(hRec, wpqCCCustom, &pwzData);
119 ExitOnFailure(hr, "Failed to get IIsWebDirProperties.CacheControlCustom");
120 if (pwzData && *pwzData)
121 {
122 pswp->fHasCacheControlCustom = TRUE;
123 if (0 == lstrcmpW(L"-", pwzData)) // remove any existing default cache control custom settings by setting them blank
124 {
125 pswp->wzCacheControlCustom[0] = L'\0';
126 }
127 else // set the custom cache control setting
128 {
129 hr = ::StringCchCopyW(pswp->wzCacheControlCustom, countof(pswp->wzCacheControlCustom), pwzData);
130 ExitOnFailure(hr, "Failed to copy cache control custom settings to webdirproperites object");
131 }
132 }
133 else
134 {
135 pswp->fHasCacheControlCustom = FALSE;
136 }
137
138 hr = WcaGetRecordInteger(hRec, wpqNoCustomError, &pswp->fNoCustomError);
139 ExitOnFailure(hr, "failed to get IIsWebDirProperties.NoCustomError");
140 if (MSI_NULL_INTEGER == pswp->fNoCustomError)
141 pswp->fNoCustomError = FALSE;
142
143 hr = WcaGetRecordInteger(hRec, wpqAccessSSLFlags, &pswp->iAccessSSLFlags);
144 ExitOnFailure(hr, "failed to get IIsWebDirProperties.AccessSSLFlags");
145
146 hr = WcaGetRecordString(hRec, wpqAuthenticationProviders, &pwzData);
147 ExitOnFailure(hr, "Failed to get IIsWebDirProperties.AuthenticationProviders");
148 if (pwzData && *pwzData)
149 {
150 hr = ::StringCchCopyW(pswp->wzAuthenticationProviders, countof(pswp->wzAuthenticationProviders), pwzData);
151 ExitOnFailure(hr, "Failed to copy authentication providers string to webdirproperties object");
152 }
153 else
154 {
155 pswp->wzAuthenticationProviders[0] = L'\0';
156 }
157 }
158 else if (E_NOMOREITEMS == hr)
159 {
160 WcaLog(LOGMSG_STANDARD, "Error: Cannot locate IIsWebDirProperties.DirProperties='%ls'", wzProperties);
161 hr = E_FAIL;
162 }
163 else
164 {
165 ExitOnFailure(hr, "Error getting appropriate webdirproperty");
166 }
167
168 // Let's check that there isn't more than one record found - if there is, throw an assert like WcaFetchSingleRecord() would
169 HRESULT hrTemp = WcaFetchWrappedRecordWhereString(hWebDirPropQuery, 1, wzProperties, &hRec);
170 if (SUCCEEDED(hrTemp))
171 {
172 AssertSz(E_NOMOREITEMS == hrTemp, "ScaGetWebDirProperties found more than one record");
173 }
174
175LExit:
176 ReleaseStr(pwzData);
177
178 return hr;
179}
180
181
182HRESULT ScaWriteWebDirProperties(
183 __in IMSAdminBase* piMetabase,
184 __in LPCWSTR wzRootOfWeb,
185 __inout SCA_WEB_PROPERTIES* pswp
186 )
187{
188 HRESULT hr = S_OK;
189 DWORD dw = 0;
190 WCHAR wz[METADATA_MAX_NAME_LEN + 1];
191
192 // write the access permissions to the metabase
193 if (MSI_NULL_INTEGER != pswp->iAccess)
194 {
195 hr = ScaWriteMetabaseValue(piMetabase, wzRootOfWeb, NULL, MD_ACCESS_PERM, METADATA_INHERIT, IIS_MD_UT_FILE, DWORD_METADATA, (LPVOID)((DWORD_PTR)pswp->iAccess));
196 ExitOnFailure(hr, "Failed to write access permissions for Web");
197 }
198
199 if (MSI_NULL_INTEGER != pswp->iAuthorization)
200 {
201 hr = ScaWriteMetabaseValue(piMetabase, wzRootOfWeb, NULL, MD_AUTHORIZATION, METADATA_INHERIT, IIS_MD_UT_FILE, DWORD_METADATA, (LPVOID)((DWORD_PTR)pswp->iAuthorization));
202 ExitOnFailure(hr, "Failed to write authorization for Web");
203 }
204
205 if (pswp->fHasUser)
206 {
207 Assert(pswp->scau.wzName);
208 // write the user name
209 if (*pswp->scau.wzDomain)
210 {
211 hr = ::StringCchPrintfW(wz, countof(wz), L"%s\\%s", pswp->scau.wzDomain, pswp->scau.wzName);
212 ExitOnFailure(hr, "Failed to format domain\\username string");
213 }
214 else
215 {
216 hr = ::StringCchCopyW(wz, countof(wz), pswp->scau.wzName);
217 ExitOnFailure(hr, "Failed to copy user name");
218 }
219 hr = ScaWriteMetabaseValue(piMetabase, wzRootOfWeb, NULL, MD_ANONYMOUS_USER_NAME, METADATA_INHERIT, IIS_MD_UT_FILE, STRING_METADATA, (LPVOID)wz);
220 ExitOnFailure(hr, "Failed to write anonymous user name for Web");
221
222 // write the password
223 hr = ScaWriteMetabaseValue(piMetabase, wzRootOfWeb, NULL, MD_ANONYMOUS_PWD, METADATA_INHERIT | METADATA_SECURE, IIS_MD_UT_FILE, STRING_METADATA, (LPVOID)pswp->scau.wzPassword);
224 ExitOnFailure(hr, "Failed to write anonymous user password for Web");
225
226 // store whether IIs controls password
227 dw = (pswp->fIIsControlledPassword) ? TRUE : FALSE;
228 hr = ScaWriteMetabaseValue(piMetabase, wzRootOfWeb, NULL, MD_ANONYMOUS_USE_SUBAUTH, METADATA_INHERIT, IIS_MD_UT_FILE, DWORD_METADATA, (LPVOID)((DWORD_PTR)dw));
229 ExitOnFailure(hr, "Failed to write if IIs controls user password for Web");
230 }
231
232 if (MSI_NULL_INTEGER != pswp->fLogVisits)
233 {
234 // The sense of this boolean value is reversed - it is "don't log", not "log visits."
235 dw = (pswp->fLogVisits) ? FALSE : TRUE;
236 hr = ScaWriteMetabaseValue(piMetabase, wzRootOfWeb, NULL, MD_DONT_LOG, METADATA_INHERIT, IIS_MD_UT_FILE, DWORD_METADATA, (LPVOID)((DWORD_PTR)dw));
237 ExitOnFailure(hr, "Failed to write authorization for Web");
238 }
239
240 if (MSI_NULL_INTEGER != pswp->fIndex)
241 {
242 dw = (pswp->fIndex) ? TRUE : FALSE;
243 hr = ScaWriteMetabaseValue(piMetabase, wzRootOfWeb, NULL, MD_IS_CONTENT_INDEXED, METADATA_INHERIT, IIS_MD_UT_FILE, DWORD_METADATA, (LPVOID)((DWORD_PTR)dw));
244 ExitOnFailure(hr, "Failed to write authorization for Web");
245 }
246
247 if (pswp->fHasDefaultDoc)
248 {
249 hr = ScaWriteMetabaseValue(piMetabase, wzRootOfWeb, NULL, MD_DEFAULT_LOAD_FILE, METADATA_INHERIT, IIS_MD_UT_FILE, STRING_METADATA, (LPVOID)pswp->wzDefaultDoc);
250 ExitOnFailure(hr, "Failed to write default documents for Web");
251 }
252
253 if (MSI_NULL_INTEGER != pswp->fAspDetailedError)
254 {
255 dw = (pswp->fAspDetailedError) ? TRUE : FALSE;
256 hr = ScaWriteMetabaseValue(piMetabase, wzRootOfWeb, NULL, MD_ASP_SCRIPTERRORSSENTTOBROWSER, METADATA_INHERIT, ASP_MD_UT_APP, DWORD_METADATA, (LPVOID)((DWORD_PTR)dw));
257 ExitOnFailure(hr, "Failed to write ASP script error for Web");
258 }
259
260 if (pswp->fHasHttpExp)
261 {
262 hr = ScaWriteMetabaseValue(piMetabase, wzRootOfWeb, NULL, MD_HTTP_EXPIRES, METADATA_INHERIT, IIS_MD_UT_FILE, STRING_METADATA, (LPVOID)pswp->wzHttpExp);
263 ExitOnFailure(hr, "Failed to write HTTP Expiration for Web");
264 }
265
266 if (MSI_NULL_INTEGER != pswp->iCacheControlMaxAge)
267 {
268 hr = ScaWriteMetabaseValue(piMetabase, wzRootOfWeb, NULL, MD_CC_MAX_AGE, METADATA_INHERIT, IIS_MD_UT_FILE, DWORD_METADATA, (LPVOID)((DWORD_PTR)pswp->iCacheControlMaxAge));
269 ExitOnFailure(hr, "Failed to write Cache Control Max Age for Web");
270 }
271
272 if (pswp->fHasCacheControlCustom)
273 {
274 hr = ScaWriteMetabaseValue(piMetabase, wzRootOfWeb, NULL, MD_CC_OTHER, METADATA_INHERIT, IIS_MD_UT_FILE, STRING_METADATA, (LPVOID)pswp->wzCacheControlCustom);
275 ExitOnFailure(hr, "Failed to write Cache Control Custom for Web");
276 }
277
278 if (pswp->fNoCustomError)
279 {
280 memset(wz, 0, sizeof(wz));
281 hr = ScaWriteMetabaseValue(piMetabase, wzRootOfWeb, NULL, MD_CUSTOM_ERROR, METADATA_INHERIT, IIS_MD_UT_FILE, MULTISZ_METADATA, wz);
282 ExitOnFailure(hr, "Failed to write Custom Error for Web");
283 }
284
285 if (MSI_NULL_INTEGER != pswp->iAccessSSLFlags)
286 {
287 hr = ScaWriteMetabaseValue(piMetabase, wzRootOfWeb, NULL, MD_SSL_ACCESS_PERM, METADATA_INHERIT, IIS_MD_UT_FILE, DWORD_METADATA, (LPVOID)((DWORD_PTR)pswp->iAccessSSLFlags));
288 ExitOnFailure(hr, "Failed to write AccessSSLFlags for Web");
289 }
290
291 if (*pswp->wzAuthenticationProviders)
292 {
293 hr = ::StringCchCopyW(wz, countof(wz), pswp->wzAuthenticationProviders);
294 ExitOnFailure(hr, "Failed to copy authentication providers string");
295 hr = ScaWriteMetabaseValue(piMetabase, wzRootOfWeb, NULL, MD_NTAUTHENTICATION_PROVIDERS, METADATA_INHERIT, IIS_MD_UT_FILE, STRING_METADATA, (LPVOID)wz);
296 ExitOnFailure(hr, "Failed to write AuthenticationProviders for Web");
297 }
298
299LExit:
300 return hr;
301}
diff --git a/src/ext/Iis/ca/scawebprop.h b/src/ext/Iis/ca/scawebprop.h
new file mode 100644
index 00000000..7a3ae5c9
--- /dev/null
+++ b/src/ext/Iis/ca/scawebprop.h
@@ -0,0 +1,60 @@
1#pragma once
2// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
3
4
5#include "scauser.h"
6
7// global sql queries provided for optimization
8extern LPCWSTR vcsWebDirPropertiesQuery;
9
10
11// structs
12struct SCA_WEB_PROPERTIES
13{
14 WCHAR wzKey[MAX_DARWIN_KEY + 1];
15
16 int iAccess;
17
18 int iAuthorization;
19 BOOL fHasUser;
20 SCA_USER scau;
21 BOOL fIIsControlledPassword;
22
23 BOOL fLogVisits;
24 BOOL fIndex;
25
26 BOOL fHasDefaultDoc;
27 WCHAR wzDefaultDoc[MAX_DARWIN_COLUMN + 1];
28
29 BOOL fHasHttpExp;
30 WCHAR wzHttpExp[MAX_DARWIN_COLUMN + 1];
31
32 BOOL fAspDetailedError;
33
34 int iCacheControlMaxAge;
35
36 BOOL fHasCacheControlCustom;
37 WCHAR wzCacheControlCustom[MAX_DARWIN_COLUMN + 1];
38
39 BOOL fNoCustomError;
40
41 int iAccessSSLFlags;
42
43 WCHAR wzAuthenticationProviders[MAX_DARWIN_COLUMN + 1];
44};
45
46
47// prototypes
48HRESULT ScaGetWebDirProperties(
49 __in LPCWSTR pwzProperties,
50 __in WCA_WRAPQUERY_HANDLE hUserQuery,
51 __in WCA_WRAPQUERY_HANDLE hWebDirPropQuery,
52 __inout SCA_WEB_PROPERTIES* pswp
53 );
54
55HRESULT ScaWriteWebDirProperties(
56 __in IMSAdminBase* piMetabase,
57 __in LPCWSTR wzRootOfWeb,
58 __inout SCA_WEB_PROPERTIES* pswp
59 );
60
diff --git a/src/ext/Iis/ca/scawebprop7.cpp b/src/ext/Iis/ca/scawebprop7.cpp
new file mode 100644
index 00000000..b8d99b0a
--- /dev/null
+++ b/src/ext/Iis/ca/scawebprop7.cpp
@@ -0,0 +1,155 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3#include "precomp.h"
4
5HRESULT ScaWriteWebDirProperties7(
6 __in_z LPCWSTR wzWebName,
7 __in_z LPCWSTR wzRootOfWeb,
8 __in const SCA_WEB_PROPERTIES* pswp
9 )
10{
11 HRESULT hr = S_OK;
12 WCHAR wz[METADATA_MAX_NAME_LEN + 1];
13
14 //all go to same web/root location tag
15 hr = ScaWriteConfigID(IIS_DIRPROP_BEGIN);
16 ExitOnFailure(hr, "Failed to write DirProp begin id");
17 hr = ScaWriteConfigString(wzWebName); //site name key
18 ExitOnFailure(hr, "Failed to write DirProp web key");
19 hr = ScaWriteConfigString(wzRootOfWeb); //app path key
20 ExitOnFailure(hr, "Failed to write DirProp app key");
21
22 // write the access permissions to the metabase
23 if (MSI_NULL_INTEGER != pswp->iAccess)
24 {
25 hr = ScaWriteConfigID(IIS_DIRPROP_ACCESS);
26 ExitOnFailure(hr, "Failed to write DirProp access id");
27 hr = ScaWriteConfigInteger(pswp->iAccess);
28 ExitOnFailure(hr, "Failed to write access permissions for Web");
29 }
30
31 if (MSI_NULL_INTEGER != pswp->iAuthorization)
32 {
33 hr = ScaWriteConfigID(IIS_DIRPROP_AUTH);
34 ExitOnFailure(hr, "Failed to write DirProp auth id");
35 hr = ScaWriteConfigInteger(pswp->iAuthorization);
36 ExitOnFailure(hr, "Failed to write authorization for Web");
37 }
38
39 if (pswp->fHasUser)
40 {
41 Assert(pswp->scau.wzName);
42 // write the user name
43 if (*pswp->scau.wzDomain)
44 {
45 hr = ::StringCchPrintfW(wz, countof(wz), L"%s\\%s", pswp->scau.wzDomain, pswp->scau.wzName);
46 ExitOnFailure(hr, "Failed to format domain\\username string");
47 }
48 else
49 {
50#pragma prefast(suppress:26037, "Source string is null terminated - it is populated as target of ::StringCchCopyW")
51 hr = ::StringCchCopyW(wz, countof(wz), pswp->scau.wzName);
52 ExitOnFailure(hr, "Failed to copy user name");
53 }
54 hr = ScaWriteConfigID(IIS_DIRPROP_USER);
55 ExitOnFailure(hr, "Failed to write DirProp user id");
56 hr = ScaWriteConfigString(wz);
57 ExitOnFailure(hr, "Failed to write anonymous user name for Web");
58
59 // write the password
60 hr = ScaWriteConfigID(IIS_DIRPROP_PWD);
61 ExitOnFailure(hr, "Failed to write DirProp pwd id");
62 hr = ScaWriteConfigString(pswp->scau.wzPassword);
63 ExitOnFailure(hr, "Failed to write anonymous user password for Web");
64
65 if (pswp->fIIsControlledPassword)
66 {
67 //Not Supported by IIS7 : pswp->fIIsControlledPassword
68 WcaLog(LOGMSG_VERBOSE, "Not supported by IIS7: WebDirProperties.IIsControlledPassword, ignoring");
69 }
70 }
71
72 if (MSI_NULL_INTEGER != pswp->fLogVisits)
73 {
74 hr = ScaWriteConfigID(IIS_DIRPROP_LOGVISITS);
75 ExitOnFailure(hr, "Failed to write DirProp logVisits id");
76 hr = ScaWriteConfigInteger(pswp->fLogVisits ? FALSE : TRUE); // we capture "should log" but IIS7 wants "should not log"
77 ExitOnFailure(hr, "Failed to write DirProp logVisits");
78 }
79
80 if (MSI_NULL_INTEGER != pswp->fIndex)
81 {
82 //Not Supported by IIS7 : pswp->fIndex
83 WcaLog(LOGMSG_VERBOSE, "Not supported by IIS7: WebDirProperties.Index, ignoring");
84 }
85
86 if (pswp->fHasDefaultDoc)
87 {
88 hr = ScaWriteConfigID(IIS_DIRPROP_DEFDOCS);
89 ExitOnFailure(hr, "Failed to write DirProp defdocs id");
90 hr = ScaWriteConfigString(pswp->wzDefaultDoc);
91 ExitOnFailure(hr, "Failed to write default documents for Web");
92 }
93
94 if (MSI_NULL_INTEGER != pswp->fAspDetailedError)
95 {
96 hr = ScaWriteConfigID(IIS_DIRPROP_ASPERROR);
97 ExitOnFailure(hr, "Failed to write ASP script error id");
98 hr = ScaWriteConfigInteger(pswp->fAspDetailedError);
99 ExitOnFailure(hr, "Failed to write ASP script error for Web");
100 }
101
102 if (pswp->fHasHttpExp)
103 {
104 hr = ScaWriteConfigID(IIS_DIRPROP_HTTPEXPIRES);
105 ExitOnFailure(hr, "Failed to write DirProp HttpExpires id");
106 hr = ScaWriteConfigString(pswp->wzHttpExp);
107 ExitOnFailure(hr, "Failed to write DirProp HttpExpires value");
108 }
109
110 if (MSI_NULL_INTEGER != pswp->iCacheControlMaxAge)
111 {
112 hr = ScaWriteConfigID(IIS_DIRPROP_MAXAGE);
113 ExitOnFailure(hr, "Failed to write DirProp MaxAge id");
114 hr = ScaWriteConfigInteger(pswp->iCacheControlMaxAge);
115 ExitOnFailure(hr, "Failed to write DirProp MaxAge value");
116 }
117
118 if (pswp->fHasCacheControlCustom)
119 {
120 hr = ScaWriteConfigID(IIS_DIRPROP_CACHECUST);
121 ExitOnFailure(hr, "Failed to write DirProp Cache Control Custom id");
122 hr = ScaWriteConfigString(pswp->wzCacheControlCustom);
123 ExitOnFailure(hr, "Failed to write Cache Control Custom for Web");
124 }
125
126 if (pswp->fNoCustomError)
127 {
128 hr = ScaWriteConfigID(IIS_DIRPROP_NOCUSTERROR);
129 ExitOnFailure(hr, "Failed to write DirProp clear Cust Errors id");
130 }
131
132 if (MSI_NULL_INTEGER != pswp->iAccessSSLFlags)
133 {
134 hr = ScaWriteConfigID(IIS_DIRPROP_SSLFLAGS);
135 ExitOnFailure(hr, "Failed to write DirProp sslFlags id");
136 hr = ScaWriteConfigInteger(pswp->iAccessSSLFlags);
137 ExitOnFailure(hr, "Failed to write AccessSSLFlags for Web");
138 }
139
140 if (*pswp->wzAuthenticationProviders)
141 {
142 hr = ::StringCchCopyW(wz, countof(wz), pswp->wzAuthenticationProviders);
143 ExitOnFailure(hr, "Failed to copy authentication providers string");
144 hr = ScaWriteConfigID(IIS_DIRPROP_AUTHPROVID);
145 ExitOnFailure(hr, "Failed to write DirProp AuthProvid id");
146 hr = ScaWriteConfigString(wz);
147 ExitOnFailure(hr, "Failed to write AuthenticationProviders for Web");
148 }
149 //End of Dir Properties
150 hr = ScaWriteConfigID(IIS_DIRPROP_END);
151 ExitOnFailure(hr, "Failed to write DirProp end id");
152
153LExit:
154 return hr;
155}
diff --git a/src/ext/Iis/ca/scawebprop7.h b/src/ext/Iis/ca/scawebprop7.h
new file mode 100644
index 00000000..a97e8679
--- /dev/null
+++ b/src/ext/Iis/ca/scawebprop7.h
@@ -0,0 +1,12 @@
1#pragma once
2// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
3
4
5#include "scauser.h"
6
7HRESULT ScaWriteWebDirProperties7(
8 __in_z LPCWSTR wzwWebName,
9 __in_z LPCWSTR wzRootOfWeb,
10 const SCA_WEB_PROPERTIES* pswp
11 );
12
diff --git a/src/ext/Iis/ca/scawebsvcext.cpp b/src/ext/Iis/ca/scawebsvcext.cpp
new file mode 100644
index 00000000..369e951b
--- /dev/null
+++ b/src/ext/Iis/ca/scawebsvcext.cpp
@@ -0,0 +1,343 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3#include "precomp.h"
4
5// sql queries
6enum eWebSvcExtQuery { ldqComponent=1 , ldqFile, ldqDescription, ldqGroup, ldqAttributes, ldqInstalled, ldqAction };
7
8
9LPCWSTR vcsWebSvcExtRoot = L"/LM/W3SVC";
10
11// prototypes for private helper functions
12static HRESULT AddWebSvcExtToList(
13 __in SCA_WEBSVCEXT** ppsWseList
14 );
15
16//static HRESULT ScaCheckWebSvcExtValue(
17// __in IMSAdminBase* piMetabase,
18// __in DWORD dwMDIdentifier
19// );
20
21static HRESULT ScaWebSvcExtInstall(
22 __in LPWSTR *pwzWebSvcExtList,
23 __in DWORD_PTR *pcchWebSvcExtList,
24 __in SCA_WEBSVCEXT* psWseList
25 );
26
27static HRESULT ScaWebSvcExtUninstall(
28 __in LPWSTR *pwzWebSvcExtList,
29 __in const DWORD *pcchWebSvcExtList,
30 __in SCA_WEBSVCEXT* psWseList
31 );
32
33// functions
34
35HRESULT __stdcall ScaWebSvcExtRead(
36 __in SCA_WEBSVCEXT** ppsWseList,
37 __inout LPWSTR *ppwzCustomActionData
38 )
39{
40 Assert(ppsWseList);
41
42 HRESULT hr = S_OK;
43 MSIHANDLE hRec;
44 LPWSTR pwzData = NULL;
45 INSTALLSTATE isInstalled = INSTALLSTATE_UNKNOWN;
46 INSTALLSTATE isAction = INSTALLSTATE_UNKNOWN;
47 SCA_WEBSVCEXT* psWebSvcExt = NULL;
48 WCA_WRAPQUERY_HANDLE hWrapQuery = NULL;
49
50 hr = WcaBeginUnwrapQuery(&hWrapQuery, ppwzCustomActionData);
51 ExitOnFailure(hr, "Failed to unwrap query for ScaWebSvcExtRead");
52
53 if (0 == WcaGetQueryRecords(hWrapQuery))
54 {
55 WcaLog(LOGMSG_VERBOSE, "Skipping ScaWebSvcExtRead() because IIsWebServiceExtension data not present");
56 ExitFunction1(hr = S_FALSE);
57 }
58
59 // loop through all the web service extensions
60 while (S_OK == (hr = WcaFetchWrappedRecord(hWrapQuery, &hRec)))
61 {
62 // Get the Component first. If the Component is not being modified during
63 // this transaction, skip processing this whole record.
64 hr = WcaGetRecordString(hRec, ldqComponent, &pwzData);
65 ExitOnFailure(hr, "Failed to get Component for WebSvcExt");
66
67 hr = WcaGetRecordInteger(hRec, ldqInstalled, (int *)&isInstalled);
68 ExitOnFailure(hr, "Failed to get Component installed state for WebSvcExt");
69
70 hr = WcaGetRecordInteger(hRec, ldqAction, (int *)&isAction);
71 ExitOnFailure(hr, "Failed to get Component action state for WebSvcExt");
72
73 if (!WcaIsInstalling(isInstalled, isAction) &&
74 !WcaIsReInstalling(isInstalled, isAction) &&
75 !WcaIsUninstalling(isInstalled, isAction))
76 {
77 continue; // skip this record.
78 }
79
80 hr = AddWebSvcExtToList(ppsWseList);
81 ExitOnFailure(hr, "failed to add element to web svc ext list");
82
83 psWebSvcExt = *ppsWseList;
84 Assert(psWebSvcExt);
85
86 psWebSvcExt->isInstalled = isInstalled;
87 psWebSvcExt->isAction = isAction;
88
89 hr = WcaGetRecordString(hRec, ldqFile, &pwzData);
90 ExitOnFailure(hr, "Failed to get File for WebSvcExt");
91 hr = ::StringCchCopyW(psWebSvcExt->wzFile, countof(psWebSvcExt->wzFile), pwzData);
92 ExitOnFailure(hr, "Failed to copy File for WebSvcExt");
93
94 hr = WcaGetRecordString(hRec, ldqDescription, &pwzData);
95 ExitOnFailure(hr, "Failed to get Description for WebSvcExt");
96 hr = ::StringCchCopyW(psWebSvcExt->wzDescription, countof(psWebSvcExt->wzDescription), pwzData);
97 ExitOnFailure(hr, "Failed to copy Description for WebSvcExt");
98
99 hr = WcaGetRecordString(hRec, ldqGroup, &pwzData);
100 ExitOnFailure(hr, "Failed to get Group for WebSvcExt");
101 hr = ::StringCchCopyW(psWebSvcExt->wzGroup, countof(psWebSvcExt->wzGroup), pwzData);
102 ExitOnFailure(hr, "Failed to copy Group for WebSvcExt");
103
104 hr = WcaGetRecordInteger(hRec, ldqAttributes, &psWebSvcExt->iAttributes);
105 ExitOnFailure(hr, "Failed to get Attributes for WebSvcExt");
106 }
107
108 if (E_NOMOREITEMS == hr)
109 hr = S_OK;
110 ExitOnFailure(hr, "Failure while processing WebSvcExt");
111
112LExit:
113 WcaFinishUnwrapQuery(hWrapQuery);
114
115 ReleaseStr(pwzData);
116
117 return hr;
118}
119
120
121// Commit does both install and uninstall
122HRESULT __stdcall ScaWebSvcExtCommit(
123 __in IMSAdminBase* piMetabase,
124 __in SCA_WEBSVCEXT* psWseList
125 )
126{
127 Assert(piMetabase);
128
129 HRESULT hr = S_OK;
130 METADATA_RECORD mr;
131
132 LPWSTR wzWebSvcExtList = NULL;
133 DWORD cbWebSvcExtList = 0;
134 DWORD_PTR cchWebSvcExtList = 0;
135
136 if (!psWseList)
137 {
138 WcaLog(LOGMSG_VERBOSE, "Skipping ScaWebSvcExtCommit() because there are no web service extensions in the list");
139 ExitFunction();
140 }
141
142 // Get current set of web service extensions.
143 ::ZeroMemory(&mr, sizeof(mr));
144 mr.dwMDIdentifier = MD_WEB_SVC_EXT_RESTRICTION_LIST;
145 mr.dwMDAttributes = 0;
146 mr.dwMDUserType = IIS_MD_UT_SERVER;
147 mr.dwMDDataType = ALL_METADATA;
148 mr.pbMDData = NULL;
149 mr.dwMDDataLen = 0;
150
151 hr = piMetabase->GetData(METADATA_MASTER_ROOT_HANDLE, vcsWebSvcExtRoot, &mr, &cbWebSvcExtList);
152 if (MD_ERROR_DATA_NOT_FOUND == hr)
153 {
154 WcaLog(LOGMSG_VERBOSE, "Skipping ScaWebSvcExtCommit() because WebSvcExtRestrictionList value is not present");
155 ExitFunction1(hr = S_FALSE);
156 }
157 else if (HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER) == hr)
158 {
159 // cchWebSvcExtList is returned in bytes. Convert to WCHAR size to call StrAlloc
160 cchWebSvcExtList = cbWebSvcExtList / sizeof(WCHAR);
161 hr = StrAlloc(&wzWebSvcExtList, cchWebSvcExtList);
162 ExitOnFailure(hr, "Failed allocating space for web service extensions");
163 }
164 else
165 {
166 ExitOnFailure(hr, "Failed retrieving web service extensions");
167 }
168
169 mr.pbMDData = (unsigned char*)wzWebSvcExtList;
170 mr.dwMDDataLen = cbWebSvcExtList;
171
172 hr = piMetabase->GetData(METADATA_MASTER_ROOT_HANDLE, vcsWebSvcExtRoot, &mr, &cbWebSvcExtList);
173 ExitOnFailure(hr, "Failed retrieving web service extensions");
174
175 // Make changes to local copy of metabase
176 while (psWseList)
177 {
178 if (WcaIsInstalling(psWseList->isInstalled, psWseList->isAction))
179 {
180 hr = ScaWebSvcExtInstall(&wzWebSvcExtList, &cchWebSvcExtList, psWseList);
181 ExitOnFailure(hr, "Failed to install Web Service extension");
182 }
183 else if (WcaIsUninstalling(psWseList->isInstalled, psWseList->isAction))
184 {
185 hr = ScaWebSvcExtUninstall(&wzWebSvcExtList, (DWORD *)&cchWebSvcExtList, psWseList);
186 ExitOnFailure(hr, "Failed to uninstall Web Service extension");
187 }
188
189 psWseList = psWseList->psWseNext;
190 }
191
192 // Write Metabase
193 hr = ScaWriteMetabaseValue(piMetabase, vcsWebSvcExtRoot, NULL, MD_WEB_SVC_EXT_RESTRICTION_LIST, METADATA_INHERIT, IIS_MD_UT_FILE, MULTISZ_METADATA, wzWebSvcExtList);
194 ExitOnFailure(hr, "Failed to write WebServiceExtensions: '%ls'", wzWebSvcExtList);
195
196LExit:
197 ReleaseStr(wzWebSvcExtList);
198
199 return hr;
200}
201
202
203static HRESULT ScaWebSvcExtInstall(
204 __in LPWSTR *ppwzWebSvcExtList,
205 __in DWORD_PTR *pcchWebSvcExtList,
206 __in SCA_WEBSVCEXT* psWseList
207 )
208{
209 Assert( ppwzWebSvcExtList && pcchWebSvcExtList && psWseList);
210 Assert(*ppwzWebSvcExtList);
211
212 HRESULT hr = S_OK;
213
214 LPWSTR pwzWebSvcExt = NULL;
215 int iAllow;
216 int iUiDeletable;
217
218 BOOL fAlreadyExists = FALSE;
219 DWORD_PTR dwIndex = 0xFFFFFFFF;
220 LPCWSTR wzFoundString = NULL;
221
222 // Check if it's already in there
223 hr = MultiSzFindSubstring(*ppwzWebSvcExtList, psWseList->wzFile, &dwIndex, &wzFoundString);
224 ExitOnFailure(hr, "failed to search for string:%ls in web service extension MULTISZ", psWseList->wzFile);
225
226 if (S_FALSE != hr && NULL != wcsstr(wzFoundString, psWseList->wzGroup) && NULL != wcsstr(wzFoundString, psWseList->wzDescription))
227 {
228 fAlreadyExists = TRUE;
229 }
230
231 // Construct the single string in the format required for the WebSvc Ext list in metabase
232 iAllow = (psWseList->iAttributes & 1);
233 iUiDeletable = ((psWseList->iAttributes >> 1) & 1);
234 hr = StrAllocFormatted(&pwzWebSvcExt, L"%d,%s,%d,%s,%s", iAllow, psWseList->wzFile, iUiDeletable, psWseList->wzGroup, psWseList->wzDescription);
235 ExitOnFailure(hr, "Failure allocating space for web service extensions");
236
237 if (fAlreadyExists)
238 {
239 hr = MultiSzReplaceString(ppwzWebSvcExtList, dwIndex, pwzWebSvcExt);
240 ExitOnFailure(hr, "failed to update web service extension string: %ls", pwzWebSvcExt);
241 }
242 else
243 {
244 hr = MultiSzPrepend(ppwzWebSvcExtList, pcchWebSvcExtList, pwzWebSvcExt);
245 ExitOnFailure(hr, "failed to prepend web service extension string: %ls", pwzWebSvcExt);
246 }
247
248LExit:
249 ReleaseStr(pwzWebSvcExt);
250
251 return hr;
252}
253
254
255static HRESULT ScaWebSvcExtUninstall(
256 __in LPWSTR *ppwzWebSvcExtList,
257 __in const DWORD* /*pcchWebSvcExtList*/,
258 __in SCA_WEBSVCEXT* psWseList
259 )
260{
261 Assert(ppwzWebSvcExtList && *ppwzWebSvcExtList && psWseList);
262 Assert(*ppwzWebSvcExtList);
263
264 HRESULT hr = S_OK;
265 DWORD_PTR dwIndex = 0xFFFFFFFF;
266 LPCWSTR wzFoundString = NULL;
267
268 // Find the string to remove
269 hr = MultiSzFindSubstring(*ppwzWebSvcExtList, psWseList->wzFile, &dwIndex, &wzFoundString);
270 ExitOnFailure(hr, "failed to search for string:%ls in web service extension MULTISZ", psWseList->wzFile);
271
272 // If we found a match (ignoring the Allow and Deletable flags)
273 if (S_FALSE != hr && NULL != wcsstr(wzFoundString, psWseList->wzGroup) && NULL != wcsstr(wzFoundString, psWseList->wzDescription))
274 {
275 hr = MultiSzRemoveString(ppwzWebSvcExtList, dwIndex);
276 ExitOnFailure(hr, "failed to remove string: %d from web service extension MULTISZ", dwIndex);
277 }
278
279LExit:
280 return hr;
281}
282
283
284//static HRESULT ScaCheckWebSvcExtValue(
285// __in IMSAdminBase* piMetabase,
286// __in DWORD dwMDIdentifier
287// )
288//{
289// if (!piMetabase)
290// {
291// return E_INVALIDARG;
292// }
293//
294// HRESULT hr = S_OK;
295// METADATA_RECORD mr = { 0 };
296// DWORD cch = 0;
297//
298// mr.dwMDIdentifier = dwMDIdentifier;
299// mr.dwMDUserType = IIS_MD_UT_SERVER;
300//
301// hr = piMetabase->GetData(METADATA_MASTER_ROOT_HANDLE, vcsWebSvcExtRoot, &mr, &cch);
302// if (HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER) == hr)
303// {
304// hr = S_OK;
305// }
306// else if (MD_ERROR_DATA_NOT_FOUND == hr)
307// {
308// hr = S_FALSE;
309// }
310//
311// return hr;
312//}
313
314
315void ScaWebSvcExtFreeList(
316 __in SCA_WEBSVCEXT* psWseList
317 )
318{
319 SCA_WEBSVCEXT* psWseDelete = psWseList;
320 while (psWseList)
321 {
322 psWseDelete = psWseList;
323 psWseList = psWseList->psWseNext;
324 MemFree(psWseDelete);
325 }
326}
327
328
329static HRESULT AddWebSvcExtToList(
330 __in SCA_WEBSVCEXT** ppsWseList
331 )
332{
333 HRESULT hr = S_OK;
334
335 SCA_WEBSVCEXT* psWse = static_cast<SCA_WEBSVCEXT*>(MemAlloc(sizeof(SCA_WEBSVCEXT), TRUE));
336 ExitOnNull(psWse, hr, E_OUTOFMEMORY, "failed to allocate element for web svc ext list");
337
338 psWse->psWseNext = *ppsWseList;
339 *ppsWseList = psWse;
340
341LExit:
342 return hr;
343}
diff --git a/src/ext/Iis/ca/scawebsvcext.h b/src/ext/Iis/ca/scawebsvcext.h
new file mode 100644
index 00000000..4d225b09
--- /dev/null
+++ b/src/ext/Iis/ca/scawebsvcext.h
@@ -0,0 +1,35 @@
1#pragma once
2// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
3
4
5enum SCA_WEBSVCEXT_ATTRIBUTES { SWSEATTRIB_ALLOW = 1, SWSEATTRIB_UIDELETABLE = 2 };
6
7struct SCA_WEBSVCEXT
8{
9 // darwin information
10 INSTALLSTATE isInstalled;
11 INSTALLSTATE isAction;
12
13 // iis configuation information
14 WCHAR wzFile[MAX_PATH + 1];
15 WCHAR wzDescription[MAX_DARWIN_COLUMN + 1];
16 WCHAR wzGroup[MAX_DARWIN_COLUMN + 1];
17
18 int iAttributes;
19
20 SCA_WEBSVCEXT* psWseNext;
21};
22
23HRESULT __stdcall ScaWebSvcExtRead(
24 __in SCA_WEBSVCEXT** ppsWseList,
25 __inout LPWSTR *ppwzCustomActionData
26 );
27
28HRESULT ScaWebSvcExtCommit(
29 __in IMSAdminBase* piMetabase,
30 __in SCA_WEBSVCEXT* psWseList
31 );
32
33void ScaWebSvcExtFreeList(
34 __in SCA_WEBSVCEXT* psWseList
35 );
diff --git a/src/ext/Iis/ca/scawebsvcext7.cpp b/src/ext/Iis/ca/scawebsvcext7.cpp
new file mode 100644
index 00000000..dcf2f7f8
--- /dev/null
+++ b/src/ext/Iis/ca/scawebsvcext7.cpp
@@ -0,0 +1,106 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3#include "precomp.h"
4
5static HRESULT ScaWebSvcExtInstall(
6 const SCA_WEBSVCEXT* psWseList
7 );
8
9static HRESULT ScaWebSvcExtUninstall(
10 const SCA_WEBSVCEXT* psWseList
11 );
12
13// functions
14// Commit does both install and uninstall
15HRESULT __stdcall ScaWebSvcExtCommit7(
16 __in SCA_WEBSVCEXT* psWseList
17 )
18{
19 HRESULT hr = S_OK;
20
21 if (!psWseList)
22 {
23 WcaLog(LOGMSG_VERBOSE, "Skipping ScaWebSvcExtCommit() because there are no web service extensions in the list");
24 ExitFunction();
25 }
26
27 // Make changes to local copy of metabase
28 while (psWseList)
29 {
30 if (WcaIsInstalling(psWseList->isInstalled, psWseList->isAction))
31 {
32 hr = ScaWebSvcExtInstall(psWseList);
33 ExitOnFailure(hr, "Failed to install Web Service extension");
34 }
35 else if (WcaIsUninstalling(psWseList->isInstalled, psWseList->isAction))
36 {
37 hr = ScaWebSvcExtUninstall(psWseList);
38 ExitOnFailure(hr, "Failed to uninstall Web Service extension");
39 }
40
41 psWseList = psWseList->psWseNext;
42 }
43
44
45LExit:
46
47 return hr;
48}
49
50
51static HRESULT ScaWebSvcExtInstall(
52 const SCA_WEBSVCEXT* psWseList
53 )
54{
55 HRESULT hr = S_OK;
56 int iAllow;
57
58 //Write CAData actions
59 hr = ScaWriteConfigID(IIS_WEB_SVC_EXT);
60 ExitOnFailure(hr, "failed add web svc ext ID");
61 hr = ScaWriteConfigID(IIS_CREATE);
62 ExitOnFailure(hr, "failed add web svc ext action");
63
64 // write File path
65 hr = ScaWriteConfigString(psWseList->wzFile);
66 ExitOnFailure(hr, "failed add web svc ext file path");
67
68 // write allowed
69 // unDeleatable n/a in IIS7
70 iAllow = (psWseList->iAttributes & 1);
71 hr = ScaWriteConfigInteger(iAllow);
72 ExitOnFailure(hr, "failed add web svc ext Allowed");
73
74 //write group
75 hr = ScaWriteConfigString(psWseList->wzGroup);
76 ExitOnFailure(hr, "failed add web svc ext group");
77
78 //write description
79 hr = ScaWriteConfigString(psWseList->wzDescription);
80 ExitOnFailure(hr, "failed add web svc ext description");
81
82LExit:
83
84 return hr;
85}
86
87
88static HRESULT ScaWebSvcExtUninstall(
89 const SCA_WEBSVCEXT* psWseList
90 )
91{
92 HRESULT hr = S_OK;
93
94 //Write CAData actions
95 hr = ScaWriteConfigID(IIS_WEB_SVC_EXT);
96 ExitOnFailure(hr, "failed add web svc ext ID");
97 hr = ScaWriteConfigID(IIS_DELETE);
98 ExitOnFailure(hr, "failed add web svc ext action");
99
100 // write File path (Key)
101 hr = ScaWriteConfigString(psWseList->wzFile);
102 ExitOnFailure(hr, "failed add web svc ext file path");
103
104LExit:
105 return hr;
106}
diff --git a/src/ext/Iis/ca/scawebsvcext7.h b/src/ext/Iis/ca/scawebsvcext7.h
new file mode 100644
index 00000000..1a686aed
--- /dev/null
+++ b/src/ext/Iis/ca/scawebsvcext7.h
@@ -0,0 +1,8 @@
1#pragma once
2// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
3
4
5HRESULT ScaWebSvcExtCommit7(
6 __in SCA_WEBSVCEXT* psWseList
7 );
8
diff --git a/src/ext/Iis/nuget.config b/src/ext/Iis/nuget.config
new file mode 100644
index 00000000..db7aba29
--- /dev/null
+++ b/src/ext/Iis/nuget.config
@@ -0,0 +1,17 @@
1<?xml version="1.0" encoding="utf-8"?>
2<configuration>
3 <packageSources>
4 <clear />
5 <add key="wixtoolset-burn" value="https://ci.appveyor.com/nuget/wixtoolset-burn" />
6 <add key="wixtoolset-data" value="https://ci.appveyor.com/nuget/wixtoolset-data" />
7 <add key="wixtoolset-extensibility" value="https://ci.appveyor.com/nuget/wixtoolset-extensibility" />
8 <add key="wixtoolset-core" value="https://ci.appveyor.com/nuget/wixtoolset-core" />
9 <add key="wixtoolset-core-native" value="https://ci.appveyor.com/nuget/wixtoolset-core-native" />
10 <add key="wixtoolset-dtf" value="https://ci.appveyor.com/nuget/wixtoolset-dtf" />
11 <add key="wixtoolset-dutil" value="https://ci.appveyor.com/nuget/wixtoolset-dutil" />
12 <add key="wixtoolset-wcautil" value="https://ci.appveyor.com/nuget/wixtoolset-wcautil" />
13 <add key="wixtoolset-tools" value="https://ci.appveyor.com/nuget/wixtoolset-tools" />
14 <add key="wixbuildtools" value="https://ci.appveyor.com/nuget/wixbuildtools" />
15 <add key="api.nuget.org" value="https://api.nuget.org/v3/index.json" protocolVersion="3" />
16 </packageSources>
17</configuration> \ No newline at end of file
diff --git a/src/ext/Iis/test/WixToolsetTest.Iis/IisExtensionFixture.cs b/src/ext/Iis/test/WixToolsetTest.Iis/IisExtensionFixture.cs
new file mode 100644
index 00000000..685e7126
--- /dev/null
+++ b/src/ext/Iis/test/WixToolsetTest.Iis/IisExtensionFixture.cs
@@ -0,0 +1,32 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolsetTest.Iis
4{
5 using System.Linq;
6 using WixBuildTools.TestSupport;
7 using WixToolset.Core.TestPackage;
8 using WixToolset.Iis;
9 using Xunit;
10
11 public class IisExtensionFixture
12 {
13 [Fact]
14 public void CanBuildUsingIIsWebAddress()
15 {
16 var folder = TestData.Get(@"TestData\UsingIis");
17 var build = new Builder(folder, typeof(IisExtensionFactory), new[] { folder });
18
19 var results = build.BuildAndQuery(Build, "IIsWebAddress");
20 Assert.Equal(new[]
21 {
22 "IIsWebAddress:TestAddress\tTest\t\t[PORT]\t\t0",
23 }, results);
24 }
25
26 private static void Build(string[] args)
27 {
28 var result = WixRunner.Execute(args)
29 .AssertSuccess();
30 }
31 }
32}
diff --git a/src/ext/Iis/test/WixToolsetTest.Iis/TestData/UsingIis/Package.en-us.wxl b/src/ext/Iis/test/WixToolsetTest.Iis/TestData/UsingIis/Package.en-us.wxl
new file mode 100644
index 00000000..38c12ac1
--- /dev/null
+++ b/src/ext/Iis/test/WixToolsetTest.Iis/TestData/UsingIis/Package.en-us.wxl
@@ -0,0 +1,11 @@
1<?xml version="1.0" encoding="utf-8"?>
2
3<!--
4This file contains the declaration of all the localizable strings.
5-->
6<WixLocalization xmlns="http://wixtoolset.org/schemas/v4/wxl" Culture="en-US">
7
8 <String Id="DowngradeError">A newer version of [ProductName] is already installed.</String>
9 <String Id="FeatureTitle">MsiPackage</String>
10
11</WixLocalization>
diff --git a/src/ext/Iis/test/WixToolsetTest.Iis/TestData/UsingIis/Package.wxs b/src/ext/Iis/test/WixToolsetTest.Iis/TestData/UsingIis/Package.wxs
new file mode 100644
index 00000000..f36aafef
--- /dev/null
+++ b/src/ext/Iis/test/WixToolsetTest.Iis/TestData/UsingIis/Package.wxs
@@ -0,0 +1,17 @@
1<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
2 <Package Name="MsiPackage" Language="1033" Version="1.0.0.0" Manufacturer="Example Corporation" UpgradeCode="047730a5-30fe-4a62-a520-da9381b8226a" InstallerVersion="200">
3 <MajorUpgrade DowngradeErrorMessage="!(loc.DowngradeError)" />
4
5 <Feature Id="ProductFeature" Title="!(loc.FeatureTitle)">
6 <ComponentGroupRef Id="ProductComponents" />
7 </Feature>
8 </Package>
9
10 <Fragment>
11 <StandardDirectory Id="ProgramFilesFolder">
12 <Directory Id="INSTALLFOLDER" Name="MsiPackage">
13 <Directory Id="TestWebSiteProductDirectory" />
14 </Directory>
15 </StandardDirectory>
16 </Fragment>
17</Wix>
diff --git a/src/ext/Iis/test/WixToolsetTest.Iis/TestData/UsingIis/PackageComponents.wxs b/src/ext/Iis/test/WixToolsetTest.Iis/TestData/UsingIis/PackageComponents.wxs
new file mode 100644
index 00000000..03203b50
--- /dev/null
+++ b/src/ext/Iis/test/WixToolsetTest.Iis/TestData/UsingIis/PackageComponents.wxs
@@ -0,0 +1,16 @@
1<?xml version="1.0" encoding="utf-8"?>
2<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs"
3 xmlns:iis="http://wixtoolset.org/schemas/v4/wxs/iis">
4 <Fragment>
5 <Property Id="PORT" Value="3062" />
6 <ComponentGroup Id="ProductComponents" Directory="INSTALLFOLDER">
7 <Component>
8 <File Source="example.txt" />
9 <iis:WebSite Id="Test" Description="Test web server" Directory="TestWebSiteProductDirectory" AutoStart="yes" DirProperties="ReadAndExecute" ConfigureIfExists="no" >
10 <iis:WebAddress Id="TestAddress" Port="[PORT]" Secure="no" />
11 </iis:WebSite>
12 </Component>
13 </ComponentGroup>
14 <iis:WebDirProperties Id="ReadAndExecute" />
15 </Fragment>
16</Wix>
diff --git a/src/ext/Iis/test/WixToolsetTest.Iis/TestData/UsingIis/example.txt b/src/ext/Iis/test/WixToolsetTest.Iis/TestData/UsingIis/example.txt
new file mode 100644
index 00000000..1b4ffe8a
--- /dev/null
+++ b/src/ext/Iis/test/WixToolsetTest.Iis/TestData/UsingIis/example.txt
@@ -0,0 +1 @@
This is example.txt. \ No newline at end of file
diff --git a/src/ext/Iis/test/WixToolsetTest.Iis/WixToolsetTest.Iis.csproj b/src/ext/Iis/test/WixToolsetTest.Iis/WixToolsetTest.Iis.csproj
new file mode 100644
index 00000000..49ed89bc
--- /dev/null
+++ b/src/ext/Iis/test/WixToolsetTest.Iis/WixToolsetTest.Iis.csproj
@@ -0,0 +1,41 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3
4<Project Sdk="Microsoft.NET.Sdk">
5 <PropertyGroup>
6 <TargetFramework>netcoreapp3.1</TargetFramework>
7 <IsPackable>false</IsPackable>
8 </PropertyGroup>
9
10 <PropertyGroup>
11 <NoWarn>NU1701</NoWarn>
12 </PropertyGroup>
13
14 <ItemGroup>
15 <Content Include="TestData\UsingIis\example.txt" CopyToOutputDirectory="PreserveNewest" />
16 <Content Include="TestData\UsingIis\Package.en-us.wxl" CopyToOutputDirectory="PreserveNewest" />
17 <Content Include="TestData\UsingIis\Package.wxs" CopyToOutputDirectory="PreserveNewest" />
18 <Content Include="TestData\UsingIis\PackageComponents.wxs" CopyToOutputDirectory="PreserveNewest" />
19 </ItemGroup>
20
21 <ItemGroup>
22 <ProjectReference Include="..\..\wixext\WixToolset.Iis.wixext.csproj" />
23 </ItemGroup>
24
25 <ItemGroup>
26 <PackageReference Include="WixToolset.Core" Version="4.0.*" />
27 <PackageReference Include="WixToolset.Core.Burn" Version="4.0.*" />
28 <PackageReference Include="WixToolset.Core.WindowsInstaller" Version="4.0.*" />
29 <PackageReference Include="WixToolset.Core.TestPackage" Version="4.0.*" />
30 </ItemGroup>
31
32 <ItemGroup>
33 <PackageReference Include="WixBuildTools.TestSupport" Version="4.0.*" />
34 </ItemGroup>
35
36 <ItemGroup>
37 <PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.3.0" />
38 <PackageReference Include="xunit" Version="2.4.1" />
39 <PackageReference Include="xunit.runner.visualstudio" Version="2.4.1" PrivateAssets="All" />
40 </ItemGroup>
41</Project>
diff --git a/src/ext/Iis/test/WixToolsetTest.Iis/WixToolsetTest.Iis.v3.ncrunchproject b/src/ext/Iis/test/WixToolsetTest.Iis/WixToolsetTest.Iis.v3.ncrunchproject
new file mode 100644
index 00000000..7b5b2139
--- /dev/null
+++ b/src/ext/Iis/test/WixToolsetTest.Iis/WixToolsetTest.Iis.v3.ncrunchproject
@@ -0,0 +1,5 @@
1<ProjectConfiguration>
2 <Settings>
3 <CopyReferencedAssembliesToWorkspace>True</CopyReferencedAssembliesToWorkspace>
4 </Settings>
5</ProjectConfiguration> \ No newline at end of file
diff --git a/src/ext/Iis/wix.snk b/src/ext/Iis/wix.snk
new file mode 100644
index 00000000..3908a66a
--- /dev/null
+++ b/src/ext/Iis/wix.snk
Binary files differ
diff --git a/src/ext/Iis/wixext/IIsCompiler.cs b/src/ext/Iis/wixext/IIsCompiler.cs
new file mode 100644
index 00000000..cb573ad1
--- /dev/null
+++ b/src/ext/Iis/wixext/IIsCompiler.cs
@@ -0,0 +1,2620 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Iis
4{
5 using System;
6 using System.Collections.Generic;
7 using System.Globalization;
8 using System.Xml.Linq;
9 using WixToolset.Data;
10 using WixToolset.Extensibility;
11 using WixToolset.Extensibility.Data;
12 using WixToolset.Iis.Symbols;
13
14 /// <summary>
15 /// The compiler for the WiX Toolset Internet Information Services Extension.
16 /// </summary>
17 public sealed class IIsCompiler : BaseCompilerExtension
18 {
19 public override XNamespace Namespace => "http://wixtoolset.org/schemas/v4/wxs/iis";
20
21 /// <summary>
22 /// Types of objects that custom HTTP Headers can be applied to.
23 /// </summary>
24 /// <remarks>Note that this must be kept in sync with the eHttpHeaderParentType in scahttpheader.h.</remarks>
25 private enum HttpHeaderParentType
26 {
27 /// <summary>Custom HTTP Header is to be applied to a Web Virtual Directory.</summary>
28 WebVirtualDir = 1,
29 /// <summary>Custom HTTP Header is to be applied to a Web Site.</summary>
30 WebSite = 2,
31 }
32
33 /// <summary>
34 /// Types of objects that MimeMaps can be applied to.
35 /// </summary>
36 /// <remarks>Note that this must be kept in sync with the eMimeMapParentType in scamimemap.h.</remarks>
37 private enum MimeMapParentType
38 {
39 /// <summary>MimeMap is to be applied to a Web Virtual Directory.</summary>
40 WebVirtualDir = 1,
41 WebSite = 2,
42 }
43
44 /// <summary>
45 /// Types of objects that custom WebErrors can be applied to.
46 /// </summary>
47 /// <remarks>Note that this must be kept in sync with the eWebErrorParentType in scaweberror.h.</remarks>
48 private enum WebErrorParentType
49 {
50 /// <summary>Custom WebError is to be applied to a Web Virtual Directory.</summary>
51 WebVirtualDir = 1,
52
53 /// <summary>Custom WebError is to be applied to a Web Site.</summary>
54 WebSite = 2,
55 }
56
57 /// <summary>
58 /// Processes an element for the Compiler.
59 /// </summary>
60 /// <param name="sourceLineNumbers">Source line number for the parent element.</param>
61 /// <param name="parentElement">Parent element of element to process.</param>
62 /// <param name="element">Element to process.</param>
63 /// <param name="contextValues">Extra information about the context in which this element is being parsed.</param>
64 public override void ParseElement(Intermediate intermediate, IntermediateSection section, XElement parentElement, XElement element, IDictionary<string, string> context)
65 {
66 switch (parentElement.Name.LocalName)
67 {
68 case "Component":
69 var componentId = context["ComponentId"];
70 var directoryId = context["DirectoryId"];
71
72 switch (element.Name.LocalName)
73 {
74 case "Certificate":
75 this.ParseCertificateElement(intermediate, section, element, componentId);
76 break;
77 case "WebAppPool":
78 this.ParseWebAppPoolElement(intermediate, section, element, componentId);
79 break;
80 case "WebDir":
81 this.ParseWebDirElement(intermediate, section, element, componentId, null);
82 break;
83 case "WebFilter":
84 this.ParseWebFilterElement(intermediate, section, element, componentId, null);
85 break;
86 case "WebProperty":
87 this.ParseWebPropertyElement(intermediate, section, element, componentId);
88 break;
89 case "WebServiceExtension":
90 this.ParseWebServiceExtensionElement(intermediate, section, element, componentId);
91 break;
92 case "WebSite":
93 this.ParseWebSiteElement(intermediate, section, element, componentId);
94 break;
95 case "WebVirtualDir":
96 this.ParseWebVirtualDirElement(intermediate, section, element, componentId, null, null);
97 break;
98 default:
99 this.ParseHelper.UnexpectedElement(parentElement, element);
100 break;
101 }
102 break;
103 case "Fragment":
104 case "Module":
105 case "Package":
106 switch (element.Name.LocalName)
107 {
108 case "WebApplication":
109 this.ParseWebApplicationElement(intermediate, section, element);
110 break;
111 case "WebAppPool":
112 this.ParseWebAppPoolElement(intermediate, section, element, null);
113 break;
114 case "WebDirProperties":
115 this.ParseWebDirPropertiesElement(intermediate, section, element, null);
116 break;
117 case "WebLog":
118 this.ParseWebLogElement(intermediate, section, element);
119 break;
120 case "WebSite":
121 this.ParseWebSiteElement(intermediate, section, element, null);
122 break;
123 default:
124 this.ParseHelper.UnexpectedElement(parentElement, element);
125 break;
126 }
127 break;
128 default:
129 this.ParseHelper.UnexpectedElement(parentElement, element);
130 break;
131 }
132 }
133
134 /// <summary>
135 /// Parses a certificate element.
136 /// </summary>
137 /// <param name="element">Element to parse.</param>
138 /// <param name="componentId">Identifier for parent component.</param>
139 private void ParseCertificateElement(Intermediate intermediate, IntermediateSection section, XElement element, string componentId)
140 {
141 var sourceLineNumbers = this.ParseHelper.GetSourceLineNumbers(element);
142 Identifier id = null;
143 int attributes = 8; // SCA_CERT_ATTRIBUTE_VITAL
144 string binaryRef = null;
145 string certificatePath = null;
146 string name = null;
147 string pfxPassword = null;
148 int storeLocation = 0;
149 string storeName = null;
150
151 foreach (var attrib in element.Attributes())
152 {
153 if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || this.Namespace == attrib.Name.Namespace)
154 {
155 switch (attrib.Name.LocalName)
156 {
157 case "Id":
158 id = this.ParseHelper.GetAttributeIdentifier(sourceLineNumbers, attrib);
159 break;
160 case "BinaryRef":
161 attributes |= 2; // SCA_CERT_ATTRIBUTE_BINARYDATA
162 binaryRef = this.ParseHelper.GetAttributeIdentifierValue(sourceLineNumbers, attrib);
163 this.ParseHelper.CreateSimpleReference(section, sourceLineNumbers, SymbolDefinitions.Binary, binaryRef);
164 break;
165 case "CertificatePath":
166 certificatePath = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
167 break;
168 case "Name":
169 name = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
170 break;
171 case "Overwrite":
172 if (YesNoType.Yes == this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib))
173 {
174 attributes |= 4; // SCA_CERT_ATTRIBUTE_OVERWRITE
175 }
176 else
177 {
178 attributes &= ~4; // SCA_CERT_ATTRIBUTE_OVERWRITE
179 }
180 break;
181 case "PFXPassword":
182 pfxPassword = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
183 break;
184 case "Request":
185 if (YesNoType.Yes == this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib))
186 {
187 attributes |= 1; // SCA_CERT_ATTRIBUTE_REQUEST
188 }
189 else
190 {
191 attributes &= ~1; // SCA_CERT_ATTRIBUTE_REQUEST
192 }
193 break;
194 case "StoreLocation":
195 var storeLocationValue = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
196 if (0 < storeLocationValue.Length)
197 {
198 switch (storeLocationValue)
199 {
200 case "currentUser":
201 storeLocation = 1; // SCA_CERTSYSTEMSTORE_CURRENTUSER
202 break;
203 case "localMachine":
204 storeLocation = 2; // SCA_CERTSYSTEMSTORE_LOCALMACHINE
205 break;
206 default:
207 storeLocation = -1;
208 this.Messaging.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, element.Name.LocalName, "StoreLocation", storeLocationValue, "currentUser", "localMachine"));
209 break;
210 }
211 }
212 break;
213 case "StoreName":
214 var storeNameValue = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
215 if (0 < storeNameValue.Length)
216 {
217 switch (storeNameValue)
218 {
219 case "ca":
220 storeName = "CA";
221 break;
222 case "my":
223 case "personal":
224 storeName = "MY";
225 break;
226 case "request":
227 storeName = "REQUEST";
228 break;
229 case "root":
230 storeName = "Root";
231 break;
232 case "otherPeople":
233 storeName = "AddressBook";
234 break;
235 case "trustedPeople":
236 storeName = "TrustedPeople";
237 break;
238 case "trustedPublisher":
239 storeName = "TrustedPublisher";
240 break;
241 default:
242 this.Messaging.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, element.Name.LocalName, "StoreName", storeNameValue, "ca", "my", "request", "root", "otherPeople", "trustedPeople", "trustedPublisher"));
243 break;
244 }
245 }
246 break;
247 case "Vital":
248 if (YesNoType.Yes == this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib))
249 {
250 attributes |= 8; // SCA_CERT_ATTRIBUTE_VITAL
251 }
252 else
253 {
254 attributes &= ~8; // SCA_CERT_ATTRIBUTE_VITAL
255 }
256 break;
257 default:
258 this.ParseHelper.UnexpectedAttribute(element, attrib);
259 break;
260 }
261 }
262 else
263 {
264 this.ParseHelper.ParseExtensionAttribute(this.Context.Extensions, intermediate, section, element, attrib);
265 }
266 }
267
268
269 if (null == id)
270 {
271 id = this.ParseHelper.CreateIdentifier("crt", componentId, binaryRef, certificatePath);
272 }
273
274 if (null == name)
275 {
276 this.Messaging.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, element.Name.LocalName, "Name"));
277 }
278
279 if (0 == storeLocation)
280 {
281 this.Messaging.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, element.Name.LocalName, "StoreLocation"));
282 }
283
284 if (null == storeName)
285 {
286 this.Messaging.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, element.Name.LocalName, "StoreName"));
287 }
288
289 if (null != binaryRef && null != certificatePath)
290 {
291 this.Messaging.Write(ErrorMessages.IllegalAttributeWithOtherAttribute(sourceLineNumbers, element.Name.LocalName, "BinaryRef", "CertificatePath", certificatePath));
292 }
293 else if (null == binaryRef && null == certificatePath)
294 {
295 this.Messaging.Write(ErrorMessages.ExpectedAttributes(sourceLineNumbers, element.Name.LocalName, "BinaryRef", "CertificatePath"));
296 }
297
298 this.ParseHelper.ParseForExtensionElements(this.Context.Extensions, intermediate, section, element);
299
300 // Reference InstallCertificates and UninstallCertificates since nothing will happen without them
301 this.ParseHelper.CreateCustomActionReference(sourceLineNumbers, section, "Wix4InstallCertificates", this.Context.Platform, CustomActionPlatforms.X86 | CustomActionPlatforms.X64 | CustomActionPlatforms.ARM64);
302 this.ParseHelper.CreateCustomActionReference(sourceLineNumbers, section, "Wix4UninstallCertificates", this.Context.Platform, CustomActionPlatforms.X86 | CustomActionPlatforms.X64 | CustomActionPlatforms.ARM64);
303 this.ParseHelper.EnsureTable(section, sourceLineNumbers, IisTableDefinitions.CertificateHash); // Certificate CustomActions require the CertificateHash table
304
305 if (!this.Messaging.EncounteredError)
306 {
307 section.AddSymbol(new CertificateSymbol(sourceLineNumbers, id)
308 {
309 ComponentRef = componentId,
310 Name = name,
311 StoreLocation = storeLocation,
312 StoreName = storeName,
313 Attributes = attributes,
314 BinaryRef = binaryRef,
315 CertificatePath = certificatePath,
316 PFXPassword = pfxPassword,
317 });
318 }
319 }
320
321 /// <summary>
322 /// Parses a CertificateRef extension element.
323 /// </summary>
324 /// <param name="element">Element to parse.</param>
325 /// <param name="webId">Identifier for parent web site.</param>
326 private void ParseCertificateRefElement(Intermediate intermediate, IntermediateSection section, XElement element, string webId)
327 {
328 var sourceLineNumbers = this.ParseHelper.GetSourceLineNumbers(element);
329 Identifier id = null;
330
331 foreach (var attrib in element.Attributes())
332 {
333 if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || this.Namespace == attrib.Name.Namespace)
334 {
335 switch (attrib.Name.LocalName)
336 {
337 case "Id":
338 id = this.ParseHelper.GetAttributeIdentifier(sourceLineNumbers, attrib);
339 this.ParseHelper.CreateSimpleReference(section, sourceLineNumbers, IisSymbolDefinitions.Certificate, id.Id);
340 break;
341 default:
342 this.ParseHelper.UnexpectedAttribute(element, attrib);
343 break;
344 }
345 }
346 else
347 {
348 this.ParseHelper.ParseExtensionAttribute(this.Context.Extensions, intermediate, section, element, attrib);
349 }
350 }
351
352 if (null == id)
353 {
354 id = this.ParseHelper.CreateIdentifier("wsc", webId);
355 }
356
357 this.ParseHelper.ParseForExtensionElements(this.Context.Extensions, intermediate, section, element);
358
359 if (!this.Messaging.EncounteredError)
360 {
361 this.ParseHelper.CreateSimpleReference(section, sourceLineNumbers, IisSymbolDefinitions.Certificate, id.Id);
362
363 section.AddSymbol(new IIsWebSiteCertificatesSymbol(sourceLineNumbers)
364 {
365 WebRef = webId,
366 CertificateRef = id.Id,
367 });
368 }
369 }
370
371 /// <summary>
372 /// Parses a mime map element.
373 /// </summary>
374 /// <param name="element">Element to parse.</param>
375 /// <param name="parentId">Identifier for parent symbol.</param>
376 /// <param name="parentType">Type that parentId refers to.</param>
377 private void ParseMimeMapElement(Intermediate intermediate, IntermediateSection section, XElement element, string parentId, MimeMapParentType parentType)
378 {
379 var sourceLineNumbers = this.ParseHelper.GetSourceLineNumbers(element);
380 Identifier id = null;
381 string extension = null;
382 string type = null;
383
384 foreach (var attrib in element.Attributes())
385 {
386 if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || this.Namespace == attrib.Name.Namespace)
387 {
388 switch (attrib.Name.LocalName)
389 {
390 case "Id":
391 id = this.ParseHelper.GetAttributeIdentifier(sourceLineNumbers, attrib);
392 break;
393 case "Extension":
394 extension = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
395 break;
396 case "Type":
397 type = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
398 break;
399 default:
400 this.ParseHelper.UnexpectedAttribute(element, attrib);
401 break;
402 }
403 }
404 else
405 {
406 this.ParseHelper.ParseExtensionAttribute(this.Context.Extensions, intermediate, section, element, attrib);
407 }
408 }
409
410 if (null == id)
411 {
412 id = this.ParseHelper.CreateIdentifier("imm", parentId, type, extension);
413 }
414
415 if (null == extension)
416 {
417 this.Messaging.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, element.Name.LocalName, "Extension"));
418 }
419 else if (0 < extension.Length)
420 {
421 if (!extension.StartsWith(".", StringComparison.Ordinal))
422 {
423 this.Messaging.Write(IIsErrors.MimeMapExtensionMissingPeriod(sourceLineNumbers, element.Name.LocalName, "Extension", extension));
424 }
425 }
426
427 if (null == type)
428 {
429 this.Messaging.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, element.Name.LocalName, "Type"));
430 }
431
432 this.ParseHelper.ParseForExtensionElements(this.Context.Extensions, intermediate, section, element);
433
434 if (!this.Messaging.EncounteredError)
435 {
436 section.AddSymbol(new IIsMimeMapSymbol(sourceLineNumbers, id)
437 {
438 ParentType = (int)parentType,
439 ParentValue = parentId,
440 MimeType = type,
441 Extension = extension,
442 });
443 }
444 }
445
446 /// <summary>
447 /// Parses a recycle time element.
448 /// </summary>
449 /// <param name="element">Element to parse.</param>
450 /// <returns>Recycle time value.</returns>
451 private string ParseRecycleTimeElement(Intermediate intermediate, IntermediateSection section, XElement element)
452 {
453 var sourceLineNumbers = this.ParseHelper.GetSourceLineNumbers(element);
454 string value = null;
455
456 foreach (var attrib in element.Attributes())
457 {
458 if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || this.Namespace == attrib.Name.Namespace)
459 {
460 switch (attrib.Name.LocalName)
461 {
462 case "Value":
463 value = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
464 break;
465 default:
466 this.ParseHelper.UnexpectedAttribute(element, attrib);
467 break;
468 }
469 }
470 else
471 {
472 this.ParseHelper.ParseExtensionAttribute(this.Context.Extensions, intermediate, section, element, attrib);
473 }
474 }
475
476 if (null == value)
477 {
478 this.Messaging.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, element.Name.LocalName, "Value"));
479 }
480
481 this.ParseHelper.ParseForExtensionElements(this.Context.Extensions, intermediate, section, element);
482
483 return value;
484 }
485
486 /// <summary>
487 /// Parses a web address element.
488 /// </summary>
489 /// <param name="element">Element to parse.</param>
490 /// <param name="parentWeb">Identifier of parent web site.</param>
491 /// <returns>Identifier for web address.</returns>
492 private string ParseWebAddressElement(Intermediate intermediate, IntermediateSection section, XElement element, string parentWeb)
493 {
494 var sourceLineNumbers = this.ParseHelper.GetSourceLineNumbers(element);
495 Identifier id = null;
496 string header = null;
497 string ip = null;
498 string port = null;
499 var secure = false;
500
501 foreach (var attrib in element.Attributes())
502 {
503 if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || this.Namespace == attrib.Name.Namespace)
504 {
505 switch (attrib.Name.LocalName)
506 {
507 case "Id":
508 id = this.ParseHelper.GetAttributeIdentifier(sourceLineNumbers, attrib);
509 break;
510 case "Header":
511 header = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
512 break;
513 case "IP":
514 ip = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
515 break;
516 case "Port":
517 port = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
518 break;
519 case "Secure":
520 secure = YesNoType.Yes == this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib);
521 break;
522 default:
523 this.ParseHelper.UnexpectedAttribute(element, attrib);
524 break;
525 }
526 }
527 else
528 {
529 this.ParseHelper.ParseExtensionAttribute(this.Context.Extensions, intermediate, section, element, attrib);
530 }
531 }
532
533 if (null == id)
534 {
535 id = this.ParseHelper.CreateIdentifier("iwa", parentWeb, ip, port);
536 }
537
538 if (null == port)
539 {
540 this.Messaging.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, element.Name.LocalName, "Port"));
541 }
542
543 this.ParseHelper.ParseForExtensionElements(this.Context.Extensions, intermediate, section, element);
544
545 if (!this.Messaging.EncounteredError)
546 {
547 section.AddSymbol(new IIsWebAddressSymbol(sourceLineNumbers, id)
548 {
549 WebRef = parentWeb,
550 IP = ip,
551 Port = port,
552 Header = header,
553 Secure = secure ? 1 : 0,
554 });
555 }
556
557 return id?.Id;
558 }
559
560 /// <summary>
561 /// Parses a web application element.
562 /// </summary>
563 /// <param name="element">Element to parse.</param>
564 /// <returns>Identifier for web application.</returns>
565 private string ParseWebApplicationElement(Intermediate intermediate, IntermediateSection section, XElement element)
566 {
567 var sourceLineNumbers = this.ParseHelper.GetSourceLineNumbers(element);
568 Identifier id = null;
569 var allowSessions = YesNoDefaultType.Default;
570 string appPool = null;
571 var buffer = YesNoDefaultType.Default;
572 var clientDebugging = YesNoDefaultType.Default;
573 string defaultScript = null;
574 int isolation = 0;
575 string name = null;
576 var parentPaths = YesNoDefaultType.Default;
577 var scriptTimeout = CompilerConstants.IntegerNotSet;
578 var sessionTimeout = CompilerConstants.IntegerNotSet;
579 var serverDebugging = YesNoDefaultType.Default;
580
581 foreach (var attrib in element.Attributes())
582 {
583 if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || this.Namespace == attrib.Name.Namespace)
584 {
585 switch (attrib.Name.LocalName)
586 {
587 case "Id":
588 id = this.ParseHelper.GetAttributeIdentifier(sourceLineNumbers, attrib);
589 break;
590 case "AllowSessions":
591 allowSessions = this.ParseHelper.GetAttributeYesNoDefaultValue(sourceLineNumbers, attrib);
592 break;
593 case "Buffer":
594 buffer = this.ParseHelper.GetAttributeYesNoDefaultValue(sourceLineNumbers, attrib);
595 break;
596 case "ClientDebugging":
597 clientDebugging = this.ParseHelper.GetAttributeYesNoDefaultValue(sourceLineNumbers, attrib);
598 break;
599 case "DefaultScript":
600 defaultScript = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
601 if (0 < defaultScript.Length)
602 {
603 switch (defaultScript)
604 {
605 case "JScript":
606 case "VBScript":
607 // these are valid values
608 break;
609 default:
610 this.Messaging.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, element.Name.LocalName, attrib.Name.LocalName, defaultScript, "JScript", "VBScript"));
611 break;
612 }
613 }
614 break;
615 case "Isolation":
616 string isolationValue = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
617 if (0 < isolationValue.Length)
618 {
619 switch (isolationValue)
620 {
621 case "low":
622 isolation = 0;
623 break;
624 case "medium":
625 isolation = 2;
626 break;
627 case "high":
628 isolation = 1;
629 break;
630 default:
631 this.Messaging.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, element.Name.LocalName, attrib.Name.LocalName, isolationValue, "low", "medium", "high"));
632 break;
633 }
634 }
635 break;
636 case "Name":
637 name = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
638 break;
639 case "ParentPaths":
640 parentPaths = this.ParseHelper.GetAttributeYesNoDefaultValue(sourceLineNumbers, attrib);
641 break;
642 case "ScriptTimeout":
643 scriptTimeout = this.ParseHelper.GetAttributeIntegerValue(sourceLineNumbers, attrib, 0, short.MaxValue);
644 break;
645 case "ServerDebugging":
646 serverDebugging = this.ParseHelper.GetAttributeYesNoDefaultValue(sourceLineNumbers, attrib);
647 break;
648 case "SessionTimeout":
649 sessionTimeout = this.ParseHelper.GetAttributeIntegerValue(sourceLineNumbers, attrib, 0, short.MaxValue);
650 break;
651 case "WebAppPool":
652 appPool = this.ParseHelper.GetAttributeIdentifierValue(sourceLineNumbers, attrib);
653 this.ParseHelper.CreateSimpleReference(section, sourceLineNumbers, IisSymbolDefinitions.IIsAppPool, appPool);
654 break;
655 default:
656 this.ParseHelper.UnexpectedAttribute(element, attrib);
657 break;
658 }
659 }
660 else
661 {
662 this.ParseHelper.ParseExtensionAttribute(this.Context.Extensions, intermediate, section, element, attrib);
663 }
664 }
665
666 if (null == id)
667 {
668 id = this.ParseHelper.CreateIdentifier("wap", name, appPool);
669 }
670
671 if (null == name)
672 {
673 this.Messaging.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, element.Name.LocalName, "Name"));
674 }
675 else if (-1 != name.IndexOf("\\", StringComparison.Ordinal))
676 {
677 this.Messaging.Write(IIsErrors.IllegalCharacterInAttributeValue(sourceLineNumbers, element.Name.LocalName, "Name", name, '\\'));
678 }
679
680 foreach (var child in element.Elements())
681 {
682 if (this.Namespace == child.Name.Namespace)
683 {
684 switch (child.Name.LocalName)
685 {
686 case "WebApplicationExtension":
687 this.ParseWebApplicationExtensionElement(intermediate, section, child, id?.Id);
688 break;
689 default:
690 this.ParseHelper.UnexpectedElement(element, child);
691 break;
692 }
693 }
694 else
695 {
696 this.ParseHelper.ParseExtensionElement(this.Context.Extensions, intermediate, section, element, child);
697 }
698 }
699
700 if (!this.Messaging.EncounteredError)
701 {
702 var symbol = section.AddSymbol(new IIsWebApplicationSymbol(sourceLineNumbers, id)
703 {
704 Name = name,
705 Isolation = isolation,
706 DefaultScript = defaultScript,
707 AppPoolRef = appPool,
708 });
709
710 if (YesNoDefaultType.Default != allowSessions)
711 {
712 symbol.AllowSessions = YesNoDefaultType.Yes == allowSessions ? 1 : 0;
713 }
714
715 if (CompilerConstants.IntegerNotSet != sessionTimeout)
716 {
717 symbol.SessionTimeout = sessionTimeout;
718 }
719
720 if (YesNoDefaultType.Default != buffer)
721 {
722 symbol.Buffer = YesNoDefaultType.Yes == buffer ? 1 : 0;
723 }
724
725 if (YesNoDefaultType.Default != parentPaths)
726 {
727 symbol.ParentPaths = YesNoDefaultType.Yes == parentPaths ? 1 : 0;
728 }
729
730 if (CompilerConstants.IntegerNotSet != scriptTimeout)
731 {
732 symbol.ScriptTimeout = scriptTimeout;
733 }
734
735 if (YesNoDefaultType.Default != serverDebugging)
736 {
737 symbol.ServerDebugging = YesNoDefaultType.Yes == serverDebugging ? 1 : 0;
738 }
739
740 if (YesNoDefaultType.Default != clientDebugging)
741 {
742 symbol.ClientDebugging = YesNoDefaultType.Yes == clientDebugging ? 1 : 0;
743 }
744 }
745
746 return id?.Id;
747 }
748
749 /// <summary>
750 /// Parses a web application extension element.
751 /// </summary>
752 /// <param name="element">Element to parse.</param>
753 /// <param name="application">Identifier for parent web application.</param>
754 private void ParseWebApplicationExtensionElement(Intermediate intermediate, IntermediateSection section, XElement element, string application)
755 {
756 var sourceLineNumbers = this.ParseHelper.GetSourceLineNumbers(element);
757 int attributes = 0;
758 string executable = null;
759 string extension = null;
760 string verbs = null;
761
762 foreach (var attrib in element.Attributes())
763 {
764 if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || this.Namespace == attrib.Name.Namespace)
765 {
766 switch (attrib.Name.LocalName)
767 {
768 case "CheckPath":
769 if (YesNoType.Yes == this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib))
770 {
771 attributes |= 4;
772 }
773 else
774 {
775 attributes &= ~4;
776 }
777 break;
778 case "Executable":
779 executable = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
780 break;
781 case "Extension":
782 extension = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
783 break;
784 case "Script":
785 if (YesNoType.Yes == this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib))
786 {
787 attributes |= 1;
788 }
789 else
790 {
791 attributes &= ~1;
792 }
793 break;
794 case "Verbs":
795 verbs = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
796 break;
797 default:
798 this.ParseHelper.UnexpectedAttribute(element, attrib);
799 break;
800 }
801 }
802 else
803 {
804 this.ParseHelper.ParseExtensionAttribute(this.Context.Extensions, intermediate, section, element, attrib);
805 }
806 }
807
808 this.ParseHelper.ParseForExtensionElements(this.Context.Extensions, intermediate, section, element);
809
810 if (!this.Messaging.EncounteredError)
811 {
812 var symbol = section.AddSymbol(new IIsWebApplicationExtensionSymbol(sourceLineNumbers)
813 {
814 ApplicationRef = application,
815 Extension = extension,
816 Verbs = verbs,
817 Executable = executable,
818 });
819
820 if (0 < attributes)
821 {
822 symbol.Attributes = attributes;
823 }
824 }
825 }
826
827 /// <summary>
828 /// Parses web application pool element.
829 /// </summary>
830 /// <param name="element">Element to parse.</param>
831 /// <param name="componentId">Optional identifier of parent component.</param>
832 private void ParseWebAppPoolElement(Intermediate intermediate, IntermediateSection section, XElement element, string componentId)
833 {
834 var sourceLineNumbers = this.ParseHelper.GetSourceLineNumbers(element);
835 Identifier id = null;
836 int attributes = 0;
837 var cpuAction = CompilerConstants.IntegerNotSet;
838 string cpuMon = null;
839 var idleTimeout = CompilerConstants.IntegerNotSet;
840 int maxCpuUsage = 0;
841 var maxWorkerProcs = CompilerConstants.IntegerNotSet;
842 string managedRuntimeVersion = null;
843 string managedPipelineMode = null;
844 string name = null;
845 var privateMemory = CompilerConstants.IntegerNotSet;
846 var queueLimit = CompilerConstants.IntegerNotSet;
847 var recycleMinutes = CompilerConstants.IntegerNotSet;
848 var recycleRequests = CompilerConstants.IntegerNotSet;
849 string recycleTimes = null;
850 var refreshCpu = CompilerConstants.IntegerNotSet;
851 string user = null;
852 var virtualMemory = CompilerConstants.IntegerNotSet;
853
854 foreach (var attrib in element.Attributes())
855 {
856 if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || this.Namespace == attrib.Name.Namespace)
857 {
858 switch (attrib.Name.LocalName)
859 {
860 case "Id":
861 id = this.ParseHelper.GetAttributeIdentifier(sourceLineNumbers, attrib);
862 break;
863 case "CpuAction":
864 if (null == componentId)
865 {
866 this.Messaging.Write(IIsErrors.IllegalAttributeWithoutComponent(sourceLineNumbers, element.Name.LocalName, attrib.Name.LocalName));
867 }
868
869 var cpuActionValue = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
870 if (0 < cpuActionValue.Length)
871 {
872 switch (cpuActionValue)
873 {
874 case "shutdown":
875 cpuAction = 1;
876 break;
877 case "none":
878 cpuAction = 0;
879 break;
880 default:
881 this.Messaging.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, element.Name.LocalName, attrib.Name.LocalName, cpuActionValue, "shutdown", "none"));
882 break;
883 }
884 }
885 break;
886 case "Identity":
887 if (null == componentId)
888 {
889 this.Messaging.Write(IIsErrors.IllegalAttributeWithoutComponent(sourceLineNumbers, element.Name.LocalName, attrib.Name.LocalName));
890 }
891
892 var identityValue = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
893 if (0 < identityValue.Length)
894 {
895 switch (identityValue)
896 {
897 case "networkService":
898 attributes |= 1;
899 break;
900 case "localService":
901 attributes |= 2;
902 break;
903 case "localSystem":
904 attributes |= 4;
905 break;
906 case "other":
907 attributes |= 8;
908 break;
909 case "applicationPoolIdentity":
910 attributes |= 0x10;
911 break;
912 default:
913 this.Messaging.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, element.Name.LocalName, attrib.Name.LocalName, identityValue, "networkService", "localService", "localSystem", "other", "applicationPoolIdentity"));
914 break;
915 }
916 }
917 break;
918 case "IdleTimeout":
919 if (null == componentId)
920 {
921 this.Messaging.Write(IIsErrors.IllegalAttributeWithoutComponent(sourceLineNumbers, element.Name.LocalName, attrib.Name.LocalName));
922 }
923
924 idleTimeout = this.ParseHelper.GetAttributeIntegerValue(sourceLineNumbers, attrib, 0, short.MaxValue);
925 break;
926 case "ManagedPipelineMode":
927 if (null == componentId)
928 {
929 this.Messaging.Write(IIsErrors.IllegalAttributeWithoutComponent(sourceLineNumbers, element.Name.LocalName, attrib.Name.LocalName));
930 }
931
932 managedPipelineMode = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
933
934
935 if (!String.IsNullOrEmpty(managedPipelineMode))
936 {
937 switch (managedPipelineMode)
938 {
939 // In 3.5 we allowed lower case values (per camel case enum style), we now use formatted fields,
940 // so the value needs to match exactly what we pass in to IIS which uses pascal case.
941 case "classic":
942 managedPipelineMode = "Classic";
943 break;
944 case "integrated":
945 managedPipelineMode = "Integrated";
946 break;
947 case "Classic":
948 break;
949 case "Integrated":
950 break;
951 default:
952 if (!this.ParseHelper.ContainsProperty(managedPipelineMode))
953 {
954 this.Messaging.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, element.Name.LocalName, attrib.Name.LocalName, managedPipelineMode, "Classic", "Integrated"));
955 }
956 break;
957 }
958 }
959
960 break;
961 case "ManagedRuntimeVersion":
962 if (null == componentId)
963 {
964 this.Messaging.Write(IIsErrors.IllegalAttributeWithoutComponent(sourceLineNumbers, element.Name.LocalName, attrib.Name.LocalName));
965 }
966
967 managedRuntimeVersion = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
968 break;
969 case "MaxCpuUsage":
970 if (null == componentId)
971 {
972 this.Messaging.Write(IIsErrors.IllegalAttributeWithoutComponent(sourceLineNumbers, element.Name.LocalName, attrib.Name.LocalName));
973 }
974
975 maxCpuUsage = this.ParseHelper.GetAttributeIntegerValue(sourceLineNumbers, attrib, 0, 100);
976 break;
977 case "MaxWorkerProcesses":
978 if (null == componentId)
979 {
980 this.Messaging.Write(IIsErrors.IllegalAttributeWithoutComponent(sourceLineNumbers, element.Name.LocalName, attrib.Name.LocalName));
981 }
982
983 maxWorkerProcs = this.ParseHelper.GetAttributeIntegerValue(sourceLineNumbers, attrib, 0, short.MaxValue);
984 break;
985 case "Name":
986 name = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
987 break;
988 case "PrivateMemory":
989 if (null == componentId)
990 {
991 this.Messaging.Write(IIsErrors.IllegalAttributeWithoutComponent(sourceLineNumbers, element.Name.LocalName, attrib.Name.LocalName));
992 }
993
994 privateMemory = this.ParseHelper.GetAttributeIntegerValue(sourceLineNumbers, attrib, 0, 4294967);
995 break;
996 case "QueueLimit":
997 if (null == componentId)
998 {
999 this.Messaging.Write(IIsErrors.IllegalAttributeWithoutComponent(sourceLineNumbers, element.Name.LocalName, attrib.Name.LocalName));
1000 }
1001
1002 queueLimit = this.ParseHelper.GetAttributeIntegerValue(sourceLineNumbers, attrib, 0, short.MaxValue);
1003 break;
1004 case "RecycleMinutes":
1005 if (null == componentId)
1006 {
1007 this.Messaging.Write(IIsErrors.IllegalAttributeWithoutComponent(sourceLineNumbers, element.Name.LocalName, attrib.Name.LocalName));
1008 }
1009
1010 recycleMinutes = this.ParseHelper.GetAttributeIntegerValue(sourceLineNumbers, attrib, 0, short.MaxValue);
1011 break;
1012 case "RecycleRequests":
1013 if (null == componentId)
1014 {
1015 this.Messaging.Write(IIsErrors.IllegalAttributeWithoutComponent(sourceLineNumbers, element.Name.LocalName, attrib.Name.LocalName));
1016 }
1017
1018 recycleRequests = this.ParseHelper.GetAttributeIntegerValue(sourceLineNumbers, attrib, 0, short.MaxValue);
1019 break;
1020 case "RefreshCpu":
1021 if (null == componentId)
1022 {
1023 this.Messaging.Write(IIsErrors.IllegalAttributeWithoutComponent(sourceLineNumbers, element.Name.LocalName, attrib.Name.LocalName));
1024 }
1025
1026 refreshCpu = this.ParseHelper.GetAttributeIntegerValue(sourceLineNumbers, attrib, 0, int.MaxValue);
1027 break;
1028 case "User":
1029 if (null == componentId)
1030 {
1031 this.Messaging.Write(IIsErrors.IllegalAttributeWithoutComponent(sourceLineNumbers, element.Name.LocalName, attrib.Name.LocalName));
1032 }
1033
1034 user = this.ParseHelper.GetAttributeIdentifierValue(sourceLineNumbers, attrib);
1035 this.ParseHelper.CreateSimpleReference(section, sourceLineNumbers, "User", user);
1036 break;
1037 case "VirtualMemory":
1038 if (null == componentId)
1039 {
1040 this.Messaging.Write(IIsErrors.IllegalAttributeWithoutComponent(sourceLineNumbers, element.Name.LocalName, attrib.Name.LocalName));
1041 }
1042
1043 virtualMemory = this.ParseHelper.GetAttributeIntegerValue(sourceLineNumbers, attrib, 0, 4294967);
1044 break;
1045 default:
1046 this.ParseHelper.UnexpectedAttribute(element, attrib);
1047 break;
1048 }
1049 }
1050 else
1051 {
1052 this.ParseHelper.ParseExtensionAttribute(this.Context.Extensions, intermediate, section, element, attrib);
1053 }
1054 }
1055
1056 if (null == id)
1057 {
1058 id = this.ParseHelper.CreateIdentifier("iap", name, componentId, user);
1059 }
1060
1061 if (null == name)
1062 {
1063 this.Messaging.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, element.Name.LocalName, "Name"));
1064 }
1065
1066 if (null == user && 8 == (attributes & 0x1F))
1067 {
1068 this.Messaging.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, element.Name.LocalName, "User", "Identity", "other"));
1069 }
1070
1071 if (null != user && 8 != (attributes & 0x1F))
1072 {
1073 this.Messaging.Write(ErrorMessages.IllegalAttributeValueWithoutOtherAttribute(sourceLineNumbers, element.Name.LocalName, "User", user, "Identity", "other"));
1074 }
1075
1076 cpuMon = maxCpuUsage.ToString(CultureInfo.InvariantCulture.NumberFormat);
1077 if (CompilerConstants.IntegerNotSet != refreshCpu)
1078 {
1079 cpuMon = String.Concat(cpuMon, ",", refreshCpu.ToString(CultureInfo.InvariantCulture.NumberFormat));
1080 if (CompilerConstants.IntegerNotSet != cpuAction)
1081 {
1082 cpuMon = String.Concat(cpuMon, ",", cpuAction.ToString(CultureInfo.InvariantCulture.NumberFormat));
1083 }
1084 }
1085
1086 foreach (var child in element.Elements())
1087 {
1088 if (this.Namespace == child.Name.Namespace)
1089 {
1090 switch (child.Name.LocalName)
1091 {
1092 case "RecycleTime":
1093 if (null == componentId)
1094 {
1095 var childSourceLineNumbers = this.ParseHelper.GetSourceLineNumbers(child);
1096 this.Messaging.Write(IIsErrors.IllegalElementWithoutComponent(childSourceLineNumbers, element.Name.LocalName));
1097 }
1098
1099 if (null == recycleTimes)
1100 {
1101 recycleTimes = this.ParseRecycleTimeElement(intermediate, section, child);
1102 }
1103 else
1104 {
1105 recycleTimes = String.Concat(recycleTimes, ",", this.ParseRecycleTimeElement(intermediate, section, child));
1106 }
1107 break;
1108 default:
1109 this.ParseHelper.UnexpectedElement(element, child);
1110 break;
1111 }
1112 }
1113 else
1114 {
1115 this.ParseHelper.ParseExtensionElement(this.Context.Extensions, intermediate, section, element, child);
1116 }
1117 }
1118
1119 if (null != componentId)
1120 {
1121 // Reference ConfigureIIs since nothing will happen without it
1122 this.AddReferenceToConfigureIIs(section, sourceLineNumbers);
1123 }
1124
1125 if (!this.Messaging.EncounteredError)
1126 {
1127 var symbol = section.AddSymbol(new IIsAppPoolSymbol(sourceLineNumbers, id)
1128 {
1129 Name = name,
1130 ComponentRef = componentId,
1131 Attributes = attributes,
1132 UserRef = user,
1133 RecycleTimes = recycleTimes,
1134 CPUMon = cpuMon,
1135 ManagedRuntimeVersion = managedRuntimeVersion,
1136 ManagedPipelineMode = managedPipelineMode,
1137 });
1138
1139 if (CompilerConstants.IntegerNotSet != recycleMinutes)
1140 {
1141 symbol.RecycleMinutes = recycleMinutes;
1142 }
1143
1144 if (CompilerConstants.IntegerNotSet != recycleRequests)
1145 {
1146 symbol.RecycleRequests = recycleRequests;
1147 }
1148
1149 if (CompilerConstants.IntegerNotSet != idleTimeout)
1150 {
1151 symbol.IdleTimeout = idleTimeout;
1152 }
1153
1154 if (CompilerConstants.IntegerNotSet != queueLimit)
1155 {
1156 symbol.QueueLimit = queueLimit;
1157 }
1158
1159 if (CompilerConstants.IntegerNotSet != maxWorkerProcs)
1160 {
1161 symbol.MaxProc = maxWorkerProcs;
1162 }
1163
1164 if (CompilerConstants.IntegerNotSet != virtualMemory)
1165 {
1166 symbol.VirtualMemory = virtualMemory;
1167 }
1168
1169 if (CompilerConstants.IntegerNotSet != privateMemory)
1170 {
1171 symbol.PrivateMemory = privateMemory;
1172 }
1173 }
1174 }
1175
1176 /// <summary>
1177 /// Parses a web directory element.
1178 /// </summary>
1179 /// <param name="element">Element to parse.</param>
1180 /// <param name="componentId">Identifier for parent component.</param>
1181 /// <param name="parentWeb">Optional identifier for parent web site.</param>
1182 private void ParseWebDirElement(Intermediate intermediate, IntermediateSection section, XElement element, string componentId, string parentWeb)
1183 {
1184 var sourceLineNumbers = this.ParseHelper.GetSourceLineNumbers(element);
1185 Identifier id = null;
1186 string dirProperties = null;
1187 string path = null;
1188 string application = null;
1189
1190 foreach (var attrib in element.Attributes())
1191 {
1192 if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || this.Namespace == attrib.Name.Namespace)
1193 {
1194 switch (attrib.Name.LocalName)
1195 {
1196 case "Id":
1197 id = this.ParseHelper.GetAttributeIdentifier(sourceLineNumbers, attrib);
1198 break;
1199 case "DirProperties":
1200 dirProperties = this.ParseHelper.GetAttributeIdentifierValue(sourceLineNumbers, attrib);
1201 break;
1202 case "Path":
1203 path = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
1204 break;
1205 case "WebApplication":
1206 application = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
1207 break;
1208 case "WebSite":
1209 if (null != parentWeb)
1210 {
1211 this.Messaging.Write(IIsErrors.WebSiteAttributeUnderWebSite(sourceLineNumbers, element.Name.LocalName));
1212 }
1213
1214 parentWeb = this.ParseHelper.GetAttributeIdentifierValue(sourceLineNumbers, attrib);
1215 this.ParseHelper.CreateSimpleReference(section, sourceLineNumbers, IisSymbolDefinitions.IIsWebSite, parentWeb);
1216 break;
1217 default:
1218 this.ParseHelper.UnexpectedAttribute(element, attrib);
1219 break;
1220 }
1221 }
1222 else
1223 {
1224 this.ParseHelper.ParseExtensionAttribute(this.Context.Extensions, intermediate, section, element, attrib);
1225 }
1226 }
1227
1228 if (null == id)
1229 {
1230 id = this.ParseHelper.CreateIdentifier("iwd", componentId, parentWeb, dirProperties, application);
1231 }
1232
1233 if (null == path)
1234 {
1235 this.Messaging.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, element.Name.LocalName, "Path"));
1236 }
1237
1238 if (null == parentWeb)
1239 {
1240 this.Messaging.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, element.Name.LocalName, "WebSite"));
1241 }
1242
1243 foreach (var child in element.Elements())
1244 {
1245 if (this.Namespace == child.Name.Namespace)
1246 {
1247 var childSourceLineNumbers = this.ParseHelper.GetSourceLineNumbers(child);
1248 switch (child.Name.LocalName)
1249 {
1250 case "WebApplication":
1251 if (null != application)
1252 {
1253 this.Messaging.Write(IIsErrors.WebApplicationAlreadySpecified(childSourceLineNumbers, element.Name.LocalName));
1254 }
1255
1256 application = this.ParseWebApplicationElement(intermediate, section, child);
1257 break;
1258 case "WebDirProperties":
1259 if (null == componentId)
1260 {
1261 this.Messaging.Write(IIsErrors.IllegalElementWithoutComponent(childSourceLineNumbers, child.Name.LocalName));
1262 }
1263
1264 string childWebDirProperties = this.ParseWebDirPropertiesElement(intermediate, section, child, componentId);
1265 if (null == dirProperties)
1266 {
1267 dirProperties = childWebDirProperties;
1268 }
1269 else
1270 {
1271 this.Messaging.Write(ErrorMessages.IllegalAttributeWhenNested(sourceLineNumbers, child.Name.LocalName, "DirProperties", child.Name.LocalName));
1272 }
1273 break;
1274 default:
1275 this.ParseHelper.UnexpectedElement(element, child);
1276 break;
1277 }
1278 }
1279 else
1280 {
1281 this.ParseHelper.ParseExtensionElement(this.Context.Extensions, intermediate, section, element, child);
1282 }
1283 }
1284
1285 if (null == dirProperties)
1286 {
1287 this.Messaging.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, element.Name.LocalName, "DirProperties"));
1288 }
1289
1290 if (null != application)
1291 {
1292 this.ParseHelper.CreateSimpleReference(section, sourceLineNumbers, IisSymbolDefinitions.IIsWebApplication, application);
1293 }
1294
1295 this.ParseHelper.CreateSimpleReference(section, sourceLineNumbers, IisSymbolDefinitions.IIsWebDirProperties, dirProperties);
1296
1297 // Reference ConfigureIIs since nothing will happen without it
1298 this.AddReferenceToConfigureIIs(section, sourceLineNumbers);
1299
1300 if (!this.Messaging.EncounteredError)
1301 {
1302 section.AddSymbol(new IIsWebDirSymbol(sourceLineNumbers, id)
1303 {
1304 ComponentRef = componentId,
1305 WebRef = parentWeb,
1306 Path = path,
1307 DirPropertiesRef = dirProperties,
1308 ApplicationRef = application,
1309 });
1310 }
1311 }
1312
1313 /// <summary>
1314 /// Parses a web directory properties element.
1315 /// </summary>
1316 /// <param name="element">Element to parse.</param>
1317 /// <returns>The identifier for this WebDirProperties.</returns>
1318 private string ParseWebDirPropertiesElement(Intermediate intermediate, IntermediateSection section, XElement element, string componentId)
1319 {
1320 var sourceLineNumbers = this.ParseHelper.GetSourceLineNumbers(element);
1321 Identifier id = null;
1322 int access = 0;
1323 var accessSet = false;
1324 int accessSSLFlags = 0;
1325 var accessSSLFlagsSet = false;
1326 string anonymousUser = null;
1327 var aspDetailedError = YesNoType.NotSet;
1328 string authenticationProviders = null;
1329 int authorization = 0;
1330 var authorizationSet = false;
1331 string cacheControlCustom = null;
1332 var cacheControlMaxAge = CompilerConstants.LongNotSet;
1333 string defaultDocuments = null;
1334 string httpExpires = null;
1335 var iisControlledPassword = false;
1336 var index = YesNoType.NotSet;
1337 var logVisits = YesNoType.NotSet;
1338 var notCustomError = YesNoType.NotSet;
1339
1340 foreach (var attrib in element.Attributes())
1341 {
1342 if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || this.Namespace == attrib.Name.Namespace)
1343 {
1344 switch (attrib.Name.LocalName)
1345 {
1346 case "Id":
1347 id = this.ParseHelper.GetAttributeIdentifier(sourceLineNumbers, attrib);
1348 break;
1349 case "AnonymousUser":
1350 anonymousUser = this.ParseHelper.GetAttributeIdentifierValue(sourceLineNumbers, attrib);
1351 this.ParseHelper.CreateSimpleReference(section, sourceLineNumbers, "User", anonymousUser);
1352 break;
1353 case "AspDetailedError":
1354 aspDetailedError = this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib);
1355 break;
1356 case "AuthenticationProviders":
1357 authenticationProviders = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
1358 break;
1359 case "CacheControlCustom":
1360 cacheControlCustom = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
1361 break;
1362 case "CacheControlMaxAge":
1363 cacheControlMaxAge = this.ParseHelper.GetAttributeLongValue(sourceLineNumbers, attrib, 0, uint.MaxValue); // 4294967295 (uint.MaxValue) represents unlimited
1364 break;
1365 case "ClearCustomError":
1366 notCustomError = this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib);
1367 break;
1368 case "DefaultDocuments":
1369 defaultDocuments = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
1370 break;
1371 case "HttpExpires":
1372 httpExpires = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
1373 break;
1374 case "IIsControlledPassword":
1375 iisControlledPassword = YesNoType.Yes == this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib);
1376 break;
1377 case "Index":
1378 index = this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib);
1379 break;
1380 case "LogVisits":
1381 logVisits = this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib);
1382 break;
1383
1384 // Access attributes
1385 case "Execute":
1386 if (YesNoType.Yes == this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib))
1387 {
1388 access |= 4;
1389 }
1390 else
1391 {
1392 access &= ~4;
1393 }
1394 accessSet = true;
1395 break;
1396 case "Read":
1397 if (YesNoType.Yes == this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib))
1398 {
1399 access |= 1;
1400 }
1401 else
1402 {
1403 access &= ~1;
1404 }
1405 accessSet = true;
1406 break;
1407 case "Script":
1408 if (YesNoType.Yes == this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib))
1409 {
1410 access |= 512;
1411 }
1412 else
1413 {
1414 access &= ~512;
1415 }
1416 accessSet = true;
1417 break;
1418 case "Write":
1419 if (YesNoType.Yes == this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib))
1420 {
1421 access |= 2;
1422 }
1423 else
1424 {
1425 access &= ~2;
1426 }
1427 accessSet = true;
1428 break;
1429
1430 // AccessSSL Attributes
1431 case "AccessSSL":
1432 if (YesNoType.Yes == this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib))
1433 {
1434 accessSSLFlags |= 8;
1435 }
1436 else
1437 {
1438 accessSSLFlags &= ~8;
1439 }
1440 accessSSLFlagsSet = true;
1441 break;
1442 case "AccessSSL128":
1443 if (YesNoType.Yes == this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib))
1444 {
1445 accessSSLFlags |= 256;
1446 }
1447 else
1448 {
1449 accessSSLFlags &= ~256;
1450 }
1451 accessSSLFlagsSet = true;
1452 break;
1453 case "AccessSSLMapCert":
1454 if (YesNoType.Yes == this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib))
1455 {
1456 accessSSLFlags |= 128;
1457 }
1458 else
1459 {
1460 accessSSLFlags &= ~128;
1461 }
1462 accessSSLFlagsSet = true;
1463 break;
1464 case "AccessSSLNegotiateCert":
1465 if (YesNoType.Yes == this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib))
1466 {
1467 accessSSLFlags |= 32;
1468 }
1469 else
1470 {
1471 accessSSLFlags &= ~32;
1472 }
1473 accessSSLFlagsSet = true;
1474 break;
1475 case "AccessSSLRequireCert":
1476 if (YesNoType.Yes == this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib))
1477 {
1478 accessSSLFlags |= 64;
1479 }
1480 else
1481 {
1482 accessSSLFlags &= ~64;
1483 }
1484 accessSSLFlagsSet = true;
1485 break;
1486
1487 // Authorization attributes
1488 case "AnonymousAccess":
1489 if (YesNoType.Yes == this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib))
1490 {
1491 authorization |= 1;
1492 }
1493 else
1494 {
1495 authorization &= ~1;
1496 }
1497 authorizationSet = true;
1498 break;
1499 case "BasicAuthentication":
1500 if (YesNoType.Yes == this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib))
1501 {
1502 authorization |= 2;
1503 }
1504 else
1505 {
1506 authorization &= ~2;
1507 }
1508 authorizationSet = true;
1509 break;
1510 case "DigestAuthentication":
1511 if (YesNoType.Yes == this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib))
1512 {
1513 authorization |= 16;
1514 }
1515 else
1516 {
1517 authorization &= ~16;
1518 }
1519 authorizationSet = true;
1520 break;
1521 case "PassportAuthentication":
1522 if (YesNoType.Yes == this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib))
1523 {
1524 authorization |= 64;
1525 }
1526 else
1527 {
1528 authorization &= ~64;
1529 }
1530 authorizationSet = true;
1531 break;
1532 case "WindowsAuthentication":
1533 if (YesNoType.Yes == this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib))
1534 {
1535 authorization |= 4;
1536 }
1537 else
1538 {
1539 authorization &= ~4;
1540 }
1541 authorizationSet = true;
1542 break;
1543 default:
1544 this.ParseHelper.UnexpectedAttribute(element, attrib);
1545 break;
1546 }
1547 }
1548 else
1549 {
1550 this.ParseHelper.ParseExtensionAttribute(this.Context.Extensions, intermediate, section, element, attrib);
1551 }
1552 }
1553
1554 if (null == id)
1555 {
1556 if (null == componentId)
1557 {
1558 this.Messaging.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, element.Name.LocalName, "Id"));
1559 id = Identifier.Invalid;
1560 }
1561 else
1562 {
1563 id = this.ParseHelper.CreateIdentifier("wdp", componentId);
1564 }
1565 }
1566
1567 this.ParseHelper.ParseForExtensionElements(this.Context.Extensions, intermediate, section, element);
1568
1569 if (!this.Messaging.EncounteredError)
1570 {
1571 var symbol = section.AddSymbol(new IIsWebDirPropertiesSymbol(sourceLineNumbers, id)
1572 {
1573 AnonymousUserRef = anonymousUser,
1574 IIsControlledPassword = iisControlledPassword ? 1 : 0,
1575 DefaultDoc = defaultDocuments,
1576 HttpExpires = httpExpires,
1577 CacheControlCustom = cacheControlCustom,
1578 });
1579
1580 if (accessSet)
1581 {
1582 symbol.Access = access;
1583 }
1584
1585 if (authorizationSet)
1586 {
1587 symbol.Authorization = authorization;
1588 }
1589
1590 if (YesNoType.NotSet != logVisits)
1591 {
1592 symbol.LogVisits = YesNoType.Yes == logVisits ? 1 : 0;
1593 }
1594
1595 if (YesNoType.NotSet != index)
1596 {
1597 symbol.Index = YesNoType.Yes == index ? 1 : 0;
1598 }
1599
1600 if (YesNoType.NotSet != aspDetailedError)
1601 {
1602 symbol.AspDetailedError = YesNoType.Yes == aspDetailedError ? 1 : 0;
1603 }
1604
1605 if (CompilerConstants.LongNotSet != cacheControlMaxAge)
1606 {
1607 symbol.CacheControlMaxAge = unchecked((int)cacheControlMaxAge);
1608 }
1609
1610 if (YesNoType.NotSet != notCustomError)
1611 {
1612 symbol.NoCustomError = YesNoType.Yes == notCustomError ? 1 : 0;
1613 }
1614
1615 if (accessSSLFlagsSet)
1616 {
1617 symbol.AccessSSLFlags = accessSSLFlags;
1618 }
1619
1620 if (null != authenticationProviders)
1621 {
1622 symbol.AuthenticationProviders = authenticationProviders;
1623 }
1624 }
1625
1626 return id?.Id;
1627 }
1628
1629 /// <summary>
1630 /// Parses a web error element.
1631 /// </summary>
1632 /// <param name="element">Element to parse.</param>
1633 /// <param name="parentType">Type of the parent.</param>
1634 /// <param name="parent">Id of the parent.</param>
1635 private void ParseWebErrorElement(Intermediate intermediate, IntermediateSection section, XElement element, WebErrorParentType parentType, string parent)
1636 {
1637 var sourceLineNumbers = this.ParseHelper.GetSourceLineNumbers(element);
1638 var errorCode = CompilerConstants.IntegerNotSet;
1639 string file = null;
1640 string url = null;
1641 var subCode = CompilerConstants.IntegerNotSet;
1642
1643 foreach (var attrib in element.Attributes())
1644 {
1645 if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || this.Namespace == attrib.Name.Namespace)
1646 {
1647 switch (attrib.Name.LocalName)
1648 {
1649 case "ErrorCode":
1650 errorCode = this.ParseHelper.GetAttributeIntegerValue(sourceLineNumbers, attrib, 400, 599);
1651 break;
1652 case "File":
1653 file = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
1654 break;
1655 case "SubCode":
1656 subCode = this.ParseHelper.GetAttributeIntegerValue(sourceLineNumbers, attrib, 0, int.MaxValue);
1657 break;
1658 case "URL":
1659 url = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
1660 break;
1661 default:
1662 this.ParseHelper.UnexpectedAttribute(element, attrib);
1663 break;
1664 }
1665 }
1666 else
1667 {
1668 this.ParseHelper.ParseExtensionAttribute(this.Context.Extensions, intermediate, section, element, attrib);
1669 }
1670 }
1671
1672 if (CompilerConstants.IntegerNotSet == errorCode)
1673 {
1674 this.Messaging.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, element.Name.LocalName, "ErrorCode"));
1675 errorCode = CompilerConstants.IllegalInteger;
1676 }
1677
1678 if (CompilerConstants.IntegerNotSet == subCode)
1679 {
1680 this.Messaging.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, element.Name.LocalName, "SubCode"));
1681 subCode = CompilerConstants.IllegalInteger;
1682 }
1683
1684 if (String.IsNullOrEmpty(file) && String.IsNullOrEmpty(url))
1685 {
1686 this.Messaging.Write(ErrorMessages.IllegalAttributeWithOtherAttribute(sourceLineNumbers, element.Name.LocalName, "File", "URL"));
1687 }
1688
1689 this.ParseHelper.ParseForExtensionElements(this.Context.Extensions, intermediate, section, element);
1690
1691 // Reference ConfigureIIs since nothing will happen without it
1692 this.AddReferenceToConfigureIIs(section, sourceLineNumbers);
1693
1694 if (!this.Messaging.EncounteredError)
1695 {
1696 section.AddSymbol(new IIsWebErrorSymbol(sourceLineNumbers)
1697 {
1698 ErrorCode = errorCode,
1699 SubCode = subCode,
1700 ParentType = (int)parentType,
1701 ParentValue = parent,
1702 File = file,
1703 URL = url,
1704 });
1705 }
1706 }
1707
1708 /// <summary>
1709 /// Parses a web filter element.
1710 /// </summary>
1711 /// <param name="element">Element to parse.</param>
1712 /// <param name="componentId">Identifier of parent component.</param>
1713 /// <param name="parentWeb">Optional identifier of parent web site.</param>
1714 private void ParseWebFilterElement(Intermediate intermediate, IntermediateSection section, XElement element, string componentId, string parentWeb)
1715 {
1716 var sourceLineNumbers = this.ParseHelper.GetSourceLineNumbers(element);
1717 Identifier id = null;
1718 string description = null;
1719 int flags = 0;
1720 var loadOrder = CompilerConstants.IntegerNotSet;
1721 string name = null;
1722 string path = null;
1723
1724 foreach (var attrib in element.Attributes())
1725 {
1726 if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || this.Namespace == attrib.Name.Namespace)
1727 {
1728 switch (attrib.Name.LocalName)
1729 {
1730 case "Id":
1731 id = this.ParseHelper.GetAttributeIdentifier(sourceLineNumbers, attrib);
1732 break;
1733 case "Description":
1734 description = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
1735 break;
1736 case "Flags":
1737 flags = this.ParseHelper.GetAttributeIntegerValue(sourceLineNumbers, attrib, 0, int.MaxValue);
1738 break;
1739 case "LoadOrder":
1740 string loadOrderValue = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
1741 if (0 < loadOrderValue.Length)
1742 {
1743 switch (loadOrderValue)
1744 {
1745 case "first":
1746 loadOrder = 0;
1747 break;
1748 case "last":
1749 loadOrder = -1;
1750 break;
1751 default:
1752 loadOrder = this.ParseHelper.GetAttributeIntegerValue(sourceLineNumbers, attrib, 1, short.MaxValue);
1753 break;
1754 }
1755 }
1756 break;
1757 case "Name":
1758 name = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
1759 break;
1760 case "Path":
1761 path = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
1762 break;
1763 case "WebSite":
1764 if (null != parentWeb)
1765 {
1766 this.Messaging.Write(IIsErrors.WebSiteAttributeUnderWebSite(sourceLineNumbers, element.Name.LocalName));
1767 }
1768
1769 parentWeb = this.ParseHelper.GetAttributeIdentifierValue(sourceLineNumbers, attrib);
1770 this.ParseHelper.CreateSimpleReference(section, sourceLineNumbers, IisSymbolDefinitions.IIsWebSite, parentWeb);
1771 break;
1772 default:
1773 this.ParseHelper.UnexpectedAttribute(element, attrib);
1774 break;
1775 }
1776 }
1777 else
1778 {
1779 this.ParseHelper.ParseExtensionAttribute(this.Context.Extensions, intermediate, section, element, attrib);
1780 }
1781 }
1782
1783 if (null == id)
1784 {
1785 id = this.ParseHelper.CreateIdentifier("ifl", name, componentId, path, parentWeb);
1786 }
1787
1788 if (null == name)
1789 {
1790 this.Messaging.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, element.Name.LocalName, "Name"));
1791 }
1792
1793 if (null == path)
1794 {
1795 this.Messaging.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, element.Name.LocalName, "Path"));
1796 }
1797
1798 this.ParseHelper.ParseForExtensionElements(this.Context.Extensions, intermediate, section, element);
1799
1800 // Reference ConfigureIIs since nothing will happen without it
1801 this.AddReferenceToConfigureIIs(section, sourceLineNumbers);
1802
1803 if (!this.Messaging.EncounteredError)
1804 {
1805 var symbol = section.AddSymbol(new IIsFilterSymbol(sourceLineNumbers, id)
1806 {
1807 Name = name,
1808 ComponentRef = componentId,
1809 Path = path,
1810 WebRef = parentWeb,
1811 Description = description,
1812 Flags = flags,
1813 });
1814
1815 if (CompilerConstants.IntegerNotSet != loadOrder)
1816 {
1817 symbol.LoadOrder = loadOrder;
1818 }
1819 }
1820 }
1821
1822 /// <summary>
1823 /// Parses web log element.
1824 /// </summary>
1825 /// <param name="element">Node to be parsed.</param>
1826 private void ParseWebLogElement(Intermediate intermediate, IntermediateSection section, XElement element)
1827 {
1828 var sourceLineNumbers = this.ParseHelper.GetSourceLineNumbers(element);
1829 Identifier id = null;
1830 string type = null;
1831
1832 foreach (var attrib in element.Attributes())
1833 {
1834 if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || this.Namespace == attrib.Name.Namespace)
1835 {
1836 switch (attrib.Name.LocalName)
1837 {
1838 case "Id":
1839 id = this.ParseHelper.GetAttributeIdentifier(sourceLineNumbers, attrib);
1840 break;
1841 case "Type":
1842 var typeValue = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
1843 if (0 < typeValue.Length)
1844 {
1845 switch (typeValue)
1846 {
1847 case "IIS":
1848 type = "Microsoft IIS Log File Format";
1849 break;
1850 case "NCSA":
1851 type = "NCSA Common Log File Format";
1852 break;
1853 case "none":
1854 type = "none";
1855 break;
1856 case "ODBC":
1857 type = "ODBC Logging";
1858 break;
1859 case "W3C":
1860 type = "W3C Extended Log File Format";
1861 break;
1862 default:
1863 this.Messaging.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, element.Name.LocalName, "Type", typeValue, "IIS", "NCSA", "none", "ODBC", "W3C"));
1864 break;
1865 }
1866 }
1867 break;
1868 default:
1869 this.ParseHelper.UnexpectedAttribute(element, attrib);
1870 break;
1871 }
1872 }
1873 else
1874 {
1875 this.ParseHelper.ParseExtensionAttribute(this.Context.Extensions, intermediate, section, element, attrib);
1876 }
1877 }
1878
1879 if (null == id)
1880 {
1881 this.Messaging.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, element.Name.LocalName, "Id"));
1882 }
1883
1884 if (null == type)
1885 {
1886 this.Messaging.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, element.Name.LocalName, "Type"));
1887 }
1888
1889 this.ParseHelper.ParseForExtensionElements(this.Context.Extensions, intermediate, section, element);
1890
1891 if (!this.Messaging.EncounteredError)
1892 {
1893 section.AddSymbol(new IIsWebLogSymbol(sourceLineNumbers, id)
1894 {
1895 Format = type,
1896 });
1897 }
1898 }
1899
1900 /// <summary>
1901 /// Parses a web property element.
1902 /// </summary>
1903 /// <param name="element">Element to parse.</param>
1904 /// <param name="componentId">Identifier for parent component.</param>
1905 private void ParseWebPropertyElement(Intermediate intermediate, IntermediateSection section, XElement element, string componentId)
1906 {
1907 var sourceLineNumbers = this.ParseHelper.GetSourceLineNumbers(element);
1908 Identifier id = null;
1909 string value = null;
1910
1911 foreach (var attrib in element.Attributes())
1912 {
1913 if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || this.Namespace == attrib.Name.Namespace)
1914 {
1915 switch (attrib.Name.LocalName)
1916 {
1917 case "Id":
1918 id = this.ParseHelper.GetAttributeIdentifier(sourceLineNumbers, attrib);
1919 break;
1920 case "Value":
1921 value = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
1922 break;
1923 default:
1924 this.ParseHelper.UnexpectedAttribute(element, attrib);
1925 break;
1926 }
1927 }
1928 else
1929 {
1930 this.ParseHelper.ParseExtensionAttribute(this.Context.Extensions, intermediate, section, element, attrib);
1931 }
1932 }
1933
1934 switch (id?.Id)
1935 {
1936 case "ETagChangeNumber":
1937 case "MaxGlobalBandwidth":
1938 // Must specify a value for these
1939 if (null == value)
1940 {
1941 this.Messaging.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, element.Name.LocalName, "Value", "Id", id.Id));
1942 }
1943 break;
1944 case "IIs5IsolationMode":
1945 case "LogInUTF8":
1946 // Can't specify a value for these
1947 if (null != value)
1948 {
1949 this.Messaging.Write(ErrorMessages.IllegalAttributeWithOtherAttribute(sourceLineNumbers, element.Name.LocalName, "Value", "Id", id.Id));
1950 }
1951 break;
1952 default:
1953 this.Messaging.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, element.Name.LocalName, "Id", id?.Id, "ETagChangeNumber", "IIs5IsolationMode", "LogInUTF8", "MaxGlobalBandwidth"));
1954 break;
1955 }
1956
1957 this.ParseHelper.ParseForExtensionElements(this.Context.Extensions, intermediate, section, element);
1958
1959 // Reference ConfigureIIs since nothing will happen without it
1960 this.AddReferenceToConfigureIIs(section, sourceLineNumbers);
1961
1962 if (!this.Messaging.EncounteredError)
1963 {
1964 section.AddSymbol(new IIsPropertySymbol(sourceLineNumbers, id)
1965 {
1966 ComponentRef = componentId,
1967 Attributes = 0,
1968 Value = value,
1969 });
1970 }
1971 }
1972
1973 /// <summary>
1974 /// Parses a web service extension element.
1975 /// </summary>
1976 /// <param name="element">Element to parse.</param>
1977 /// <param name="componentId">Identifier for parent component.</param>
1978 private void ParseWebServiceExtensionElement(Intermediate intermediate, IntermediateSection section, XElement element, string componentId)
1979 {
1980 var sourceLineNumbers = this.ParseHelper.GetSourceLineNumbers(element);
1981 Identifier id = null;
1982 int attributes = 0;
1983 string description = null;
1984 string file = null;
1985 string group = null;
1986
1987 foreach (XAttribute attrib in element.Attributes())
1988 {
1989 if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || this.Namespace == attrib.Name.Namespace)
1990 {
1991 switch (attrib.Name.LocalName)
1992 {
1993 case "Id":
1994 id = this.ParseHelper.GetAttributeIdentifier(sourceLineNumbers, attrib);
1995 break;
1996 case "Allow":
1997 if (YesNoType.Yes == this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib))
1998 {
1999 attributes |= 1;
2000 }
2001 else
2002 {
2003 attributes &= ~1;
2004 }
2005 break;
2006 case "Description":
2007 description = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
2008 break;
2009 case "File":
2010 file = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
2011 break;
2012 case "Group":
2013 group = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
2014 break;
2015 case "UIDeletable":
2016 if (YesNoType.Yes == this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib))
2017 {
2018 attributes |= 2;
2019 }
2020 else
2021 {
2022 attributes &= ~2;
2023 }
2024 break;
2025 default:
2026 this.ParseHelper.UnexpectedAttribute(element, attrib);
2027 break;
2028 }
2029 }
2030 else
2031 {
2032 this.ParseHelper.ParseExtensionAttribute(this.Context.Extensions, intermediate, section, element, attrib);
2033 }
2034 }
2035
2036 if (null == id)
2037 {
2038 id = this.ParseHelper.CreateIdentifier("iwe", componentId, file);
2039 }
2040
2041 if (null == file)
2042 {
2043 this.Messaging.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, element.Name.LocalName, "File"));
2044 }
2045
2046 this.ParseHelper.ParseForExtensionElements(this.Context.Extensions, intermediate, section, element);
2047
2048 // Reference ConfigureIIs since nothing will happen without it
2049 this.AddReferenceToConfigureIIs(section, sourceLineNumbers);
2050
2051 if (!this.Messaging.EncounteredError)
2052 {
2053 section.AddSymbol(new IIsWebServiceExtensionSymbol(sourceLineNumbers, id)
2054 {
2055 ComponentRef = componentId,
2056 File = file,
2057 Description = description,
2058 Group = group,
2059 Attributes = attributes,
2060 });
2061 }
2062 }
2063
2064 /// <summary>
2065 /// Parses a web site element.
2066 /// </summary>
2067 /// <param name="element">Element to parse.</param>
2068 /// <param name="componentId">Optional identifier of parent component.</param>
2069 private void ParseWebSiteElement(Intermediate intermediate, IntermediateSection section, XElement element, string componentId)
2070 {
2071 var sourceLineNumbers = this.ParseHelper.GetSourceLineNumbers(element);
2072 Identifier id = null;
2073 string application = null;
2074 int attributes = 0;
2075 var connectionTimeout = CompilerConstants.IntegerNotSet;
2076 string description = null;
2077 string directory = null;
2078 string dirProperties = null;
2079 string keyAddress = null;
2080 string log = null;
2081 string siteId = null;
2082 var sequence = CompilerConstants.IntegerNotSet;
2083 var state = CompilerConstants.IntegerNotSet;
2084
2085 foreach (var attrib in element.Attributes())
2086 {
2087 if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || this.Namespace == attrib.Name.Namespace)
2088 {
2089 switch (attrib.Name.LocalName)
2090 {
2091 case "Id":
2092 id = this.ParseHelper.GetAttributeIdentifier(sourceLineNumbers, attrib);
2093 break;
2094 case "AutoStart":
2095 if (null == componentId)
2096 {
2097 this.Messaging.Write(IIsErrors.IllegalAttributeWithoutComponent(sourceLineNumbers, element.Name.LocalName, attrib.Name.LocalName));
2098 }
2099
2100 if (YesNoType.Yes == this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib))
2101 {
2102 state = 2;
2103 }
2104 else if (state != 1)
2105 {
2106 state = 0;
2107 }
2108 break;
2109 case "ConfigureIfExists":
2110 if (null == componentId)
2111 {
2112 this.Messaging.Write(IIsErrors.IllegalAttributeWithoutComponent(sourceLineNumbers, element.Name.LocalName, attrib.Name.LocalName));
2113 }
2114
2115 if (YesNoType.Yes == this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib))
2116 {
2117 attributes &= ~2;
2118 }
2119 else
2120 {
2121 attributes |= 2;
2122 }
2123 break;
2124 case "ConnectionTimeout":
2125 connectionTimeout = this.ParseHelper.GetAttributeIntegerValue(sourceLineNumbers, attrib, 0, short.MaxValue);
2126 break;
2127 case "Description":
2128 description = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
2129 break;
2130 case "Directory":
2131 directory = this.ParseHelper.GetAttributeIdentifierValue(sourceLineNumbers, attrib);
2132 this.ParseHelper.CreateSimpleReference(section, sourceLineNumbers, SymbolDefinitions.Directory, directory);
2133 break;
2134 case "DirProperties":
2135 if (null == componentId)
2136 {
2137 this.Messaging.Write(IIsErrors.IllegalAttributeWithoutComponent(sourceLineNumbers, element.Name.LocalName, attrib.Name.LocalName));
2138 }
2139
2140 dirProperties = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
2141 break;
2142 case "SiteId":
2143 siteId = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
2144 if ("*" == siteId)
2145 {
2146 siteId = "-1";
2147 }
2148 break;
2149 case "Sequence":
2150 sequence = this.ParseHelper.GetAttributeIntegerValue(sourceLineNumbers, attrib, 1, short.MaxValue);
2151 break;
2152 case "StartOnInstall":
2153 if (null == componentId)
2154 {
2155 this.Messaging.Write(IIsErrors.IllegalAttributeWithoutComponent(sourceLineNumbers, element.Name.LocalName, attrib.Name.LocalName));
2156 }
2157
2158 // when state is set to 2 it implies 1, so don't set it to 1
2159 if (2 != state && YesNoType.Yes == this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib))
2160 {
2161 state = 1;
2162 }
2163 else if (2 != state)
2164 {
2165 state = 0;
2166 }
2167 break;
2168 case "WebApplication":
2169 if (null == componentId)
2170 {
2171 this.Messaging.Write(IIsErrors.IllegalAttributeWithoutComponent(sourceLineNumbers, element.Name.LocalName, attrib.Name.LocalName));
2172 }
2173
2174 application = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
2175 break;
2176 case "WebLog":
2177 if (null == componentId)
2178 {
2179 this.Messaging.Write(IIsErrors.IllegalAttributeWithoutComponent(sourceLineNumbers, element.Name.LocalName, attrib.Name.LocalName));
2180 }
2181
2182 log = this.ParseHelper.GetAttributeIdentifierValue(sourceLineNumbers, attrib);
2183 this.ParseHelper.CreateSimpleReference(section, sourceLineNumbers, IisSymbolDefinitions.IIsWebLog, log);
2184 break;
2185 default:
2186 this.ParseHelper.UnexpectedAttribute(element, attrib);
2187 break;
2188 }
2189 }
2190 else
2191 {
2192 this.ParseHelper.ParseExtensionAttribute(this.Context.Extensions, intermediate, section, element, attrib);
2193 }
2194 }
2195
2196 if (null == id)
2197 {
2198 id = this.ParseHelper.CreateIdentifier("iws", description, componentId, siteId, application);
2199 }
2200
2201 if (null == description)
2202 {
2203 this.Messaging.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, element.Name.LocalName, "Description"));
2204 }
2205
2206 if (null == directory && null != componentId)
2207 {
2208 this.Messaging.Write(IIsErrors.RequiredAttributeUnderComponent(sourceLineNumbers, element.Name.LocalName, "Directory"));
2209 }
2210
2211 foreach (var child in element.Elements())
2212 {
2213 if (this.Namespace == child.Name.Namespace)
2214 {
2215 var childSourceLineNumbers = this.ParseHelper.GetSourceLineNumbers(child);
2216 switch (child.Name.LocalName)
2217 {
2218 case "CertificateRef":
2219 if (null == componentId)
2220 {
2221 this.Messaging.Write(IIsErrors.IllegalElementWithoutComponent(childSourceLineNumbers, child.Name.LocalName));
2222 }
2223
2224 this.ParseCertificateRefElement(intermediate, section, child, id?.Id);
2225 break;
2226 case "HttpHeader":
2227 if (null == componentId)
2228 {
2229 this.Messaging.Write(IIsErrors.IllegalElementWithoutComponent(childSourceLineNumbers, child.Name.LocalName));
2230 }
2231
2232 this.ParseHttpHeaderElement(intermediate, section, child, HttpHeaderParentType.WebSite, id?.Id);
2233 break;
2234 case "WebAddress":
2235 string address = this.ParseWebAddressElement(intermediate, section, child, id?.Id);
2236 if (null == keyAddress)
2237 {
2238 keyAddress = address;
2239 }
2240 break;
2241 case "WebApplication":
2242 if (null == componentId)
2243 {
2244 this.Messaging.Write(IIsErrors.IllegalElementWithoutComponent(childSourceLineNumbers, child.Name.LocalName));
2245 }
2246
2247 if (null != application)
2248 {
2249 this.Messaging.Write(IIsErrors.WebApplicationAlreadySpecified(childSourceLineNumbers, element.Name.LocalName));
2250 }
2251
2252 application = this.ParseWebApplicationElement(intermediate, section, child);
2253 break;
2254 case "WebDir":
2255 if (null == componentId)
2256 {
2257 this.Messaging.Write(IIsErrors.IllegalElementWithoutComponent(childSourceLineNumbers, child.Name.LocalName));
2258 }
2259
2260 this.ParseWebDirElement(intermediate, section, child, componentId, id?.Id);
2261 break;
2262 case "WebDirProperties":
2263 if (null == componentId)
2264 {
2265 this.Messaging.Write(IIsErrors.IllegalElementWithoutComponent(childSourceLineNumbers, child.Name.LocalName));
2266 }
2267
2268 string childWebDirProperties = this.ParseWebDirPropertiesElement(intermediate, section, child, componentId);
2269 if (null == dirProperties)
2270 {
2271 dirProperties = childWebDirProperties;
2272 }
2273 else
2274 {
2275 this.Messaging.Write(ErrorMessages.IllegalParentAttributeWhenNested(sourceLineNumbers, "WebSite", "DirProperties", child.Name.LocalName));
2276 }
2277 break;
2278 case "WebError":
2279 if (null == componentId)
2280 {
2281 this.Messaging.Write(IIsErrors.IllegalElementWithoutComponent(childSourceLineNumbers, child.Name.LocalName));
2282 }
2283
2284 this.ParseWebErrorElement(intermediate, section, child, WebErrorParentType.WebSite, id?.Id);
2285 break;
2286 case "WebFilter":
2287 if (null == componentId)
2288 {
2289 this.Messaging.Write(IIsErrors.IllegalElementWithoutComponent(childSourceLineNumbers, child.Name.LocalName));
2290 }
2291
2292 this.ParseWebFilterElement(intermediate, section, child, componentId, id?.Id);
2293 break;
2294 case "WebVirtualDir":
2295 if (null == componentId)
2296 {
2297 this.Messaging.Write(IIsErrors.IllegalElementWithoutComponent(childSourceLineNumbers, child.Name.LocalName));
2298 }
2299
2300 this.ParseWebVirtualDirElement(intermediate, section, child, componentId, id?.Id, null);
2301 break;
2302 case "MimeMap":
2303 this.ParseMimeMapElement(intermediate, section, child, id?.Id, MimeMapParentType.WebSite);
2304 break;
2305 default:
2306 this.ParseHelper.UnexpectedElement(element, child);
2307 break;
2308 }
2309 }
2310 else
2311 {
2312 this.ParseHelper.ParseExtensionElement(this.Context.Extensions, intermediate, section, element, child);
2313 }
2314 }
2315
2316
2317 if (null == keyAddress)
2318 {
2319 this.Messaging.Write(ErrorMessages.ExpectedElement(sourceLineNumbers, element.Name.LocalName, "WebAddress"));
2320 }
2321
2322 if (null != application)
2323 {
2324 this.ParseHelper.CreateSimpleReference(section, sourceLineNumbers, IisSymbolDefinitions.IIsWebApplication, application);
2325 }
2326
2327 if (null != dirProperties)
2328 {
2329 this.ParseHelper.CreateSimpleReference(section, sourceLineNumbers, IisSymbolDefinitions.IIsWebDirProperties, dirProperties);
2330 }
2331
2332 if (null != componentId)
2333 {
2334 // Reference ConfigureIIs since nothing will happen without it
2335 this.AddReferenceToConfigureIIs(section, sourceLineNumbers);
2336 }
2337
2338 if (!this.Messaging.EncounteredError)
2339 {
2340 var symbol = section.AddSymbol(new IIsWebSiteSymbol(sourceLineNumbers, id)
2341 {
2342 ComponentRef = componentId,
2343 Description = description,
2344 DirectoryRef = directory,
2345 KeyAddressRef = keyAddress,
2346 DirPropertiesRef = dirProperties,
2347 ApplicationRef = application,
2348 LogRef = log,
2349 WebsiteId = siteId,
2350 });
2351
2352 if (CompilerConstants.IntegerNotSet != connectionTimeout)
2353 {
2354 symbol.ConnectionTimeout = connectionTimeout;
2355 }
2356
2357 if (CompilerConstants.IntegerNotSet != state)
2358 {
2359 symbol.State = state;
2360 }
2361
2362 if (0 != attributes)
2363 {
2364 symbol.Attributes = attributes;
2365 }
2366
2367 if (CompilerConstants.IntegerNotSet != sequence)
2368 {
2369 symbol.Sequence = sequence;
2370 }
2371 }
2372 }
2373
2374 /// <summary>
2375 /// Parses a HTTP Header element.
2376 /// </summary>
2377 /// <param name="element">Element to parse.</param>
2378 /// <param name="parentType">Type of the parent.</param>
2379 /// <param name="parent">Id of the parent.</param>
2380 private void ParseHttpHeaderElement(Intermediate intermediate, IntermediateSection section, XElement element, HttpHeaderParentType parentType, string parent)
2381 {
2382 var sourceLineNumbers = this.ParseHelper.GetSourceLineNumbers(element);
2383 Identifier id = null;
2384 string headerName = null;
2385 string headerValue = null;
2386
2387 foreach (var attrib in element.Attributes())
2388 {
2389 if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || this.Namespace == attrib.Name.Namespace)
2390 {
2391 switch (attrib.Name.LocalName)
2392 {
2393 case "Id":
2394 id = this.ParseHelper.GetAttributeIdentifier(sourceLineNumbers, attrib);
2395 break;
2396 case "Name":
2397 headerName = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
2398 break;
2399 case "Value":
2400 headerValue = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
2401 break;
2402 default:
2403 this.ParseHelper.UnexpectedAttribute(element, attrib);
2404 break;
2405 }
2406 }
2407 else
2408 {
2409 this.ParseHelper.ParseExtensionAttribute(this.Context.Extensions, intermediate, section, element, attrib);
2410 }
2411 }
2412
2413 if (null == headerName)
2414 {
2415 this.Messaging.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, element.Name.LocalName, "Name"));
2416 }
2417 else if (null == id)
2418 {
2419 id = this.ParseHelper.CreateIdentifierFromFilename(headerName);
2420 }
2421
2422 this.ParseHelper.ParseForExtensionElements(this.Context.Extensions, intermediate, section, element);
2423
2424 // Reference ConfigureIIs since nothing will happen without it
2425 this.AddReferenceToConfigureIIs(section, sourceLineNumbers);
2426
2427 if (!this.Messaging.EncounteredError)
2428 {
2429 section.AddSymbol(new IIsHttpHeaderSymbol(sourceLineNumbers, id)
2430 {
2431 HttpHeader = id.Id,
2432 ParentType = (int)parentType,
2433 ParentValue = parent,
2434 Name = headerName,
2435 Value = headerValue,
2436 Attributes = 0,
2437 });
2438 }
2439 }
2440
2441 /// <summary>
2442 /// Parses a virtual directory element.
2443 /// </summary>
2444 /// <param name="element">Element to parse.</param>
2445 /// <param name="componentId">Identifier of parent component.</param>
2446 /// <param name="parentWeb">Identifier of parent web site.</param>
2447 /// <param name="parentAlias">Alias of the parent web site.</param>
2448 private void ParseWebVirtualDirElement(Intermediate intermediate, IntermediateSection section, XElement element, string componentId, string parentWeb, string parentAlias)
2449 {
2450 var sourceLineNumbers = this.ParseHelper.GetSourceLineNumbers(element);
2451 Identifier id = null;
2452 string alias = null;
2453 string application = null;
2454 string directory = null;
2455 string dirProperties = null;
2456
2457 foreach (var attrib in element.Attributes())
2458 {
2459 if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || this.Namespace == attrib.Name.Namespace)
2460 {
2461 switch (attrib.Name.LocalName)
2462 {
2463 case "Id":
2464 id = this.ParseHelper.GetAttributeIdentifier(sourceLineNumbers, attrib);
2465 break;
2466 case "Alias":
2467 alias = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
2468 break;
2469 case "Directory":
2470 directory = this.ParseHelper.GetAttributeIdentifierValue(sourceLineNumbers, attrib);
2471 this.ParseHelper.CreateSimpleReference(section, sourceLineNumbers, SymbolDefinitions.Directory, directory);
2472 break;
2473 case "DirProperties":
2474 dirProperties = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
2475 break;
2476 case "WebApplication":
2477 application = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
2478 break;
2479 case "WebSite":
2480 if (null != parentWeb)
2481 {
2482 this.Messaging.Write(IIsErrors.WebSiteAttributeUnderWebSite(sourceLineNumbers, element.Name.LocalName));
2483 }
2484
2485 parentWeb = this.ParseHelper.GetAttributeIdentifierValue(sourceLineNumbers, attrib);
2486 this.ParseHelper.CreateSimpleReference(section, sourceLineNumbers, IisSymbolDefinitions.IIsWebSite, parentWeb);
2487 break;
2488 default:
2489 this.ParseHelper.UnexpectedAttribute(element, attrib);
2490 break;
2491 }
2492 }
2493 else
2494 {
2495 this.ParseHelper.ParseExtensionAttribute(this.Context.Extensions, intermediate, section, element, attrib);
2496 }
2497 }
2498
2499 if (null == id)
2500 {
2501 id = this.ParseHelper.CreateIdentifier("wvd", alias, directory, dirProperties, application, parentWeb);
2502 }
2503
2504 if (null == alias)
2505 {
2506 this.Messaging.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, element.Name.LocalName, "Alias"));
2507 }
2508 else if (-1 != alias.IndexOf("\\", StringComparison.Ordinal))
2509 {
2510 this.Messaging.Write(IIsErrors.IllegalCharacterInAttributeValue(sourceLineNumbers, element.Name.LocalName, "Alias", alias, '\\'));
2511 }
2512
2513 if (null == directory)
2514 {
2515 this.Messaging.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, element.Name.LocalName, "Directory"));
2516 }
2517
2518 if (null == parentWeb)
2519 {
2520 this.Messaging.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, element.Name.LocalName, "WebSite"));
2521 }
2522
2523 if (null == componentId)
2524 {
2525 this.Messaging.Write(IIsErrors.IllegalElementWithoutComponent(sourceLineNumbers, element.Name.LocalName));
2526 }
2527
2528 if (null != parentAlias)
2529 {
2530 alias = String.Concat(parentAlias, "/", alias);
2531 }
2532
2533 foreach (var child in element.Elements())
2534 {
2535 if (this.Namespace == child.Name.Namespace)
2536 {
2537 var childSourceLineNumbers = this.ParseHelper.GetSourceLineNumbers(child);
2538 switch (child.Name.LocalName)
2539 {
2540 case "WebApplication":
2541 if (null != application)
2542 {
2543 this.Messaging.Write(IIsErrors.WebApplicationAlreadySpecified(childSourceLineNumbers, element.Name.LocalName));
2544 }
2545
2546 application = this.ParseWebApplicationElement(intermediate, section, child);
2547 break;
2548 case "WebDirProperties":
2549 if (null == componentId)
2550 {
2551 this.Messaging.Write(IIsErrors.IllegalElementWithoutComponent(childSourceLineNumbers, child.Name.LocalName));
2552 }
2553
2554 string childWebDirProperties = this.ParseWebDirPropertiesElement(intermediate, section, child, componentId);
2555 if (null == dirProperties)
2556 {
2557 dirProperties = childWebDirProperties;
2558 }
2559 else
2560 {
2561 this.Messaging.Write(ErrorMessages.IllegalAttributeWhenNested(sourceLineNumbers, child.Name.LocalName, "DirProperties", child.Name.LocalName));
2562 }
2563 break;
2564
2565 case "WebError":
2566 this.ParseWebErrorElement(intermediate, section, child, WebErrorParentType.WebVirtualDir, id?.Id);
2567 break;
2568 case "WebVirtualDir":
2569 this.ParseWebVirtualDirElement(intermediate, section, child, componentId, parentWeb, alias);
2570 break;
2571 case "HttpHeader":
2572 this.ParseHttpHeaderElement(intermediate, section, child, HttpHeaderParentType.WebVirtualDir, id?.Id);
2573 break;
2574 case "MimeMap":
2575 this.ParseMimeMapElement(intermediate, section, child, id?.Id, MimeMapParentType.WebVirtualDir);
2576 break;
2577 default:
2578 this.ParseHelper.UnexpectedElement(element, child);
2579 break;
2580 }
2581 }
2582 else
2583 {
2584 this.ParseHelper.ParseExtensionElement(this.Context.Extensions, intermediate, section, element, child);
2585 }
2586 }
2587
2588 if (null != dirProperties)
2589 {
2590 this.ParseHelper.CreateSimpleReference(section, sourceLineNumbers, IisSymbolDefinitions.IIsWebDirProperties, dirProperties);
2591 }
2592
2593 if (null != application)
2594 {
2595 this.ParseHelper.CreateSimpleReference(section, sourceLineNumbers, IisSymbolDefinitions.IIsWebApplication, application);
2596 }
2597
2598 // Reference ConfigureIIs since nothing will happen without it
2599 this.AddReferenceToConfigureIIs(section, sourceLineNumbers);
2600
2601 if (!this.Messaging.EncounteredError)
2602 {
2603 section.AddSymbol(new IIsWebVirtualDirSymbol(sourceLineNumbers, id)
2604 {
2605 ComponentRef = componentId,
2606 WebRef = parentWeb,
2607 Alias = alias,
2608 DirectoryRef = directory,
2609 DirPropertiesRef = dirProperties,
2610 ApplicationRef = application,
2611 });
2612 }
2613 }
2614
2615 private void AddReferenceToConfigureIIs(IntermediateSection section, SourceLineNumber sourceLineNumbers)
2616 {
2617 this.ParseHelper.CreateCustomActionReference(sourceLineNumbers, section, "Wix4ConfigureIIs", this.Context.Platform, CustomActionPlatforms.X86 | CustomActionPlatforms.X64 | CustomActionPlatforms.ARM64);
2618 }
2619 }
2620}
diff --git a/src/ext/Iis/wixext/IIsDecompiler.cs b/src/ext/Iis/wixext/IIsDecompiler.cs
new file mode 100644
index 00000000..17e15348
--- /dev/null
+++ b/src/ext/Iis/wixext/IIsDecompiler.cs
@@ -0,0 +1,1549 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Iis
4{
5#if TODO_CONSIDER_DECOMPILER
6 using System;
7 using System.Collections;
8 using System.Globalization;
9 using WixToolset.Data;
10 using WixToolset.Extensibility;
11 using IIs = WixToolset.Extensions.Serialize.IIs;
12 using Wix = WixToolset.Data.Serialize;
13
14 /// <summary>
15 /// The decompiler for the WiX Toolset Internet Information Services Extension.
16 /// </summary>
17 public sealed class IIsDecompiler : DecompilerExtension
18 {
19 /// <summary>
20 /// Creates a decompiler for IIs Extension.
21 /// </summary>
22 public IIsDecompiler()
23 {
24 this.TableDefinitions = IIsExtensionData.GetExtensionTableDefinitions();
25 }
26
27 /// <summary>
28 /// Get the extensions library to be removed.
29 /// </summary>
30 /// <param name="tableDefinitions">Table definitions for library.</param>
31 /// <returns>Library to remove from decompiled output.</returns>
32 public override Library GetLibraryToRemove(TableDefinitionCollection tableDefinitions)
33 {
34 return IIsExtensionData.GetExtensionLibrary(tableDefinitions);
35 }
36
37 /// <summary>
38 /// Decompiles an extension table.
39 /// </summary>
40 /// <param name="table">The table to decompile.</param>
41 public override void DecompileTable(Table table)
42 {
43 switch (table.Name)
44 {
45 case "Certificate":
46 this.DecompileCertificateTable(table);
47 break;
48 case "CertificateHash":
49 // There is nothing to do for this table, it contains no authored data
50 // to be decompiled.
51 break;
52 case "IIsAppPool":
53 this.DecompileIIsAppPoolTable(table);
54 break;
55 case "IIsFilter":
56 this.DecompileIIsFilterTable(table);
57 break;
58 case "IIsProperty":
59 this.DecompileIIsPropertyTable(table);
60 break;
61 case "IIsHttpHeader":
62 this.DecompileIIsHttpHeaderTable(table);
63 break;
64 case "IIsMimeMap":
65 this.DecompileIIsMimeMapTable(table);
66 break;
67 case "IIsWebAddress":
68 this.DecompileIIsWebAddressTable(table);
69 break;
70 case "IIsWebApplication":
71 this.DecompileIIsWebApplicationTable(table);
72 break;
73 case "IIsWebDirProperties":
74 this.DecompileIIsWebDirPropertiesTable(table);
75 break;
76 case "IIsWebError":
77 this.DecompileIIsWebErrorTable(table);
78 break;
79 case "IIsWebLog":
80 this.DecompileIIsWebLogTable(table);
81 break;
82 case "IIsWebServiceExtension":
83 this.DecompileIIsWebServiceExtensionTable(table);
84 break;
85 case "IIsWebSite":
86 this.DecompileIIsWebSiteTable(table);
87 break;
88 case "IIsWebVirtualDir":
89 this.DecompileIIsWebVirtualDirTable(table);
90 break;
91 case "IIsWebSiteCertificates":
92 this.DecompileIIsWebSiteCertificatesTable(table);
93 break;
94 default:
95 base.DecompileTable(table);
96 break;
97 }
98 }
99
100 /// <summary>
101 /// Finalize decompilation.
102 /// </summary>
103 /// <param name="tables">The collection of all tables.</param>
104 public override void Finish(TableIndexedCollection tables)
105 {
106 this.FinalizeIIsMimeMapTable(tables);
107 this.FinalizeIIsHttpHeaderTable(tables);
108 this.FinalizeIIsWebApplicationTable(tables);
109 this.FinalizeIIsWebErrorTable(tables);
110 this.FinalizeIIsWebVirtualDirTable(tables);
111 this.FinalizeIIsWebSiteCertificatesTable(tables);
112 this.FinalizeWebAddressTable(tables);
113 }
114
115 /// <summary>
116 /// Decompile the Certificate table.
117 /// </summary>
118 /// <param name="table">The table to decompile.</param>
119 private void DecompileCertificateTable(Table table)
120 {
121 foreach (Row row in table.Rows)
122 {
123 IIs.Certificate certificate = new IIs.Certificate();
124
125 certificate.Id = (string)row[0];
126 certificate.Name = (string)row[2];
127
128 switch ((int)row[3])
129 {
130 case 1:
131 certificate.StoreLocation = IIs.Certificate.StoreLocationType.currentUser;
132 break;
133 case 2:
134 certificate.StoreLocation = IIs.Certificate.StoreLocationType.localMachine;
135 break;
136 default:
137 // TODO: warn
138 break;
139 }
140
141 switch ((string)row[4])
142 {
143 case "CA":
144 certificate.StoreName = IIs.Certificate.StoreNameType.ca;
145 break;
146 case "MY":
147 certificate.StoreName = IIs.Certificate.StoreNameType.my;
148 break;
149 case "REQUEST":
150 certificate.StoreName = IIs.Certificate.StoreNameType.request;
151 break;
152 case "Root":
153 certificate.StoreName = IIs.Certificate.StoreNameType.root;
154 break;
155 case "AddressBook":
156 certificate.StoreName = IIs.Certificate.StoreNameType.otherPeople;
157 break;
158 case "TrustedPeople":
159 certificate.StoreName = IIs.Certificate.StoreNameType.trustedPeople;
160 break;
161 case "TrustedPublisher":
162 certificate.StoreName = IIs.Certificate.StoreNameType.trustedPublisher;
163 break;
164 default:
165 // TODO: warn
166 break;
167 }
168
169 int attribute = (int)row[5];
170
171 if (0x1 == (attribute & 0x1))
172 {
173 certificate.Request = IIs.YesNoType.yes;
174 }
175
176 if (0x2 == (attribute & 0x2))
177 {
178 if (null != row[6])
179 {
180 certificate.BinaryKey = (string)row[6];
181 }
182 else
183 {
184 // TODO: warn about expected value in row 5
185 }
186 }
187 else if (null != row[7])
188 {
189 certificate.CertificatePath = (string)row[7];
190 }
191
192 if (0x4 == (attribute & 0x4))
193 {
194 certificate.Overwrite = IIs.YesNoType.yes;
195 }
196
197 if (null != row[8])
198 {
199 certificate.PFXPassword = (string)row[8];
200 }
201
202 Wix.Component component = (Wix.Component)this.Core.GetIndexedElement("Component", (string)row[1]);
203 if (null != component)
204 {
205 component.AddChild(certificate);
206 }
207 else
208 {
209 this.Core.OnMessage(WixWarnings.ExpectedForeignRow(row.SourceLineNumbers, table.Name, row.GetPrimaryKey(DecompilerConstants.PrimaryKeyDelimiter), "Component_", (string)row[1], "Component"));
210 }
211 }
212 }
213
214 /// <summary>
215 /// Decompile the IIsAppPool table.
216 /// </summary>
217 /// <param name="table">The table to decompile.</param>
218 private void DecompileIIsAppPoolTable(Table table)
219 {
220 foreach (Row row in table.Rows)
221 {
222 IIs.WebAppPool webAppPool = new IIs.WebAppPool();
223
224 webAppPool.Id = (string)row[0];
225
226 webAppPool.Name = (string)row[1];
227
228 switch ((int)row[3] & 0x1F)
229 {
230 case 1:
231 webAppPool.Identity = IIs.WebAppPool.IdentityType.networkService;
232 break;
233 case 2:
234 webAppPool.Identity = IIs.WebAppPool.IdentityType.localService;
235 break;
236 case 4:
237 webAppPool.Identity = IIs.WebAppPool.IdentityType.localSystem;
238 break;
239 case 8:
240 webAppPool.Identity = IIs.WebAppPool.IdentityType.other;
241 break;
242 case 0x10:
243 webAppPool.Identity = IIs.WebAppPool.IdentityType.applicationPoolIdentity;
244 break;
245 default:
246 // TODO: warn
247 break;
248 }
249
250 if (null != row[4])
251 {
252 webAppPool.User = (string)row[4];
253 }
254
255 if (null != row[5])
256 {
257 webAppPool.RecycleMinutes = (int)row[5];
258 }
259
260 if (null != row[6])
261 {
262 webAppPool.RecycleRequests = (int)row[6];
263 }
264
265 if (null != row[7])
266 {
267 string[] recycleTimeValues = ((string)row[7]).Split(',');
268
269 foreach (string recycleTimeValue in recycleTimeValues)
270 {
271 IIs.RecycleTime recycleTime = new IIs.RecycleTime();
272
273 recycleTime.Value = recycleTimeValue;
274
275 webAppPool.AddChild(recycleTime);
276 }
277 }
278
279 if (null != row[8])
280 {
281 webAppPool.IdleTimeout = (int)row[8];
282 }
283
284 if (null != row[9])
285 {
286 webAppPool.QueueLimit = (int)row[9];
287 }
288
289 if (null != row[10])
290 {
291 string[] cpuMon = ((string)row[10]).Split(',');
292
293 if (0 < cpuMon.Length && "0" != cpuMon[0])
294 {
295 webAppPool.MaxCpuUsage = Convert.ToInt32(cpuMon[0], CultureInfo.InvariantCulture);
296 }
297
298 if (1 < cpuMon.Length)
299 {
300 webAppPool.RefreshCpu = Convert.ToInt32(cpuMon[1], CultureInfo.InvariantCulture);
301 }
302
303 if (2 < cpuMon.Length)
304 {
305 switch (Convert.ToInt32(cpuMon[2], CultureInfo.InvariantCulture))
306 {
307 case 0:
308 webAppPool.CpuAction = IIs.WebAppPool.CpuActionType.none;
309 break;
310 case 1:
311 webAppPool.CpuAction = IIs.WebAppPool.CpuActionType.shutdown;
312 break;
313 default:
314 // TODO: warn
315 break;
316 }
317 }
318
319 if (3 < cpuMon.Length)
320 {
321 // TODO: warn
322 }
323 }
324
325 if (null != row[11])
326 {
327 webAppPool.MaxWorkerProcesses = (int)row[11];
328 }
329
330 if (null != row[12])
331 {
332 webAppPool.VirtualMemory = (int)row[12];
333 }
334
335 if (null != row[13])
336 {
337 webAppPool.PrivateMemory = (int)row[13];
338 }
339
340 if (null != row[14])
341 {
342 webAppPool.ManagedRuntimeVersion = (string)row[14];
343 }
344
345 if (null != row[15])
346 {
347 webAppPool.ManagedPipelineMode = (string)row[15];
348 }
349
350 if (null != row[2])
351 {
352 Wix.Component component = (Wix.Component)this.Core.GetIndexedElement("Component", (string)row[2]);
353
354 if (null != component)
355 {
356 component.AddChild(webAppPool);
357 }
358 else
359 {
360 this.Core.OnMessage(WixWarnings.ExpectedForeignRow(row.SourceLineNumbers, table.Name, row.GetPrimaryKey(DecompilerConstants.PrimaryKeyDelimiter), "Component_", (string)row[2], "Component"));
361 }
362 }
363 else
364 {
365 this.Core.RootElement.AddChild(webAppPool);
366 }
367 }
368 }
369
370 /// <summary>
371 /// Decompile the IIsProperty table.
372 /// </summary>
373 /// <param name="table">The table to decompile.</param>
374 private void DecompileIIsPropertyTable(Table table)
375 {
376 foreach (Row row in table.Rows)
377 {
378 IIs.WebProperty webProperty = new IIs.WebProperty();
379
380 switch ((string)row[0])
381 {
382 case "ETagChangeNumber":
383 webProperty.Id = IIs.WebProperty.IdType.ETagChangeNumber;
384 break;
385 case "IIs5IsolationMode":
386 webProperty.Id = IIs.WebProperty.IdType.IIs5IsolationMode;
387 break;
388 case "LogInUTF8":
389 webProperty.Id = IIs.WebProperty.IdType.LogInUTF8;
390 break;
391 case "MaxGlobalBandwidth":
392 webProperty.Id = IIs.WebProperty.IdType.MaxGlobalBandwidth;
393 break;
394 }
395
396 if (0 != (int)row[2])
397 {
398 // TODO: warn about value in unused column
399 }
400
401 if (null != row[3])
402 {
403 webProperty.Value = (string)row[3];
404 }
405
406 Wix.Component component = (Wix.Component)this.Core.GetIndexedElement("Component", (string)row[1]);
407 if (null != component)
408 {
409 component.AddChild(webProperty);
410 }
411 else
412 {
413 this.Core.OnMessage(WixWarnings.ExpectedForeignRow(row.SourceLineNumbers, table.Name, row.GetPrimaryKey(DecompilerConstants.PrimaryKeyDelimiter), "Component_", (string)row[1], "Component"));
414 }
415 }
416 }
417
418 /// <summary>
419 /// Decompile the IIsHttpHeader table.
420 /// </summary>
421 /// <param name="table">The table to decompile.</param>
422 private void DecompileIIsHttpHeaderTable(Table table)
423 {
424 foreach (Row row in table.Rows)
425 {
426 IIs.HttpHeader httpHeader = new IIs.HttpHeader();
427
428 httpHeader.Name = (string)row[3];
429
430 // the ParentType and Parent columns are handled in FinalizeIIsHttpHeaderTable
431
432 httpHeader.Value = (string)row[4];
433
434 this.Core.IndexElement(row, httpHeader);
435 }
436 }
437
438 /// <summary>
439 /// Decompile the IIsMimeMap table.
440 /// </summary>
441 /// <param name="table">The table to decompile.</param>
442 private void DecompileIIsMimeMapTable(Table table)
443 {
444 foreach (Row row in table.Rows)
445 {
446 IIs.MimeMap mimeMap = new IIs.MimeMap();
447
448 mimeMap.Id = (string)row[0];
449
450 // the ParentType and ParentValue columns are handled in FinalizeIIsMimeMapTable
451
452 mimeMap.Type = (string)row[3];
453
454 mimeMap.Extension = (string)row[4];
455
456 this.Core.IndexElement(row, mimeMap);
457 }
458 }
459
460 /// <summary>
461 /// Decompile the IIsWebAddress table.
462 /// </summary>
463 /// <param name="table">The table to decompile.</param>
464 private void DecompileIIsWebAddressTable(Table table)
465 {
466 foreach (Row row in table.Rows)
467 {
468 IIs.WebAddress webAddress = new IIs.WebAddress();
469
470 webAddress.Id = (string)row[0];
471
472 if (null != row[2])
473 {
474 webAddress.IP = (string)row[2];
475 }
476
477 webAddress.Port = (string)row[3];
478
479 if (null != row[4])
480 {
481 webAddress.Header = (string)row[4];
482 }
483
484 if (null != row[5] && 1 == (int)row[5])
485 {
486 webAddress.Secure = IIs.YesNoType.yes;
487 }
488
489 this.Core.IndexElement(row, webAddress);
490 }
491 }
492
493 /// <summary>
494 /// Decompile the IIsWebApplication table.
495 /// </summary>
496 /// <param name="table">The table to decompile.</param>
497 private void DecompileIIsWebApplicationTable(Table table)
498 {
499 foreach (Row row in table.Rows)
500 {
501 IIs.WebApplication webApplication = new IIs.WebApplication();
502
503 webApplication.Id = (string)row[0];
504
505 webApplication.Name = (string)row[1];
506
507 // these are not listed incorrectly - the order is low, high, medium
508 switch ((int)row[2])
509 {
510 case 0:
511 webApplication.Isolation = IIs.WebApplication.IsolationType.low;
512 break;
513 case 1:
514 webApplication.Isolation = IIs.WebApplication.IsolationType.high;
515 break;
516 case 2:
517 webApplication.Isolation = IIs.WebApplication.IsolationType.medium;
518 break;
519 default:
520 // TODO: warn
521 break;
522 }
523
524 if (null != row[3])
525 {
526 switch ((int)row[3])
527 {
528 case 0:
529 webApplication.AllowSessions = IIs.YesNoDefaultType.no;
530 break;
531 case 1:
532 webApplication.AllowSessions = IIs.YesNoDefaultType.yes;
533 break;
534 default:
535 // TODO: warn
536 break;
537 }
538 }
539
540 if (null != row[4])
541 {
542 webApplication.SessionTimeout = (int)row[4];
543 }
544
545 if (null != row[5])
546 {
547 switch ((int)row[5])
548 {
549 case 0:
550 webApplication.Buffer = IIs.YesNoDefaultType.no;
551 break;
552 case 1:
553 webApplication.Buffer = IIs.YesNoDefaultType.yes;
554 break;
555 default:
556 // TODO: warn
557 break;
558 }
559 }
560
561 if (null != row[6])
562 {
563 switch ((int)row[6])
564 {
565 case 0:
566 webApplication.ParentPaths = IIs.YesNoDefaultType.no;
567 break;
568 case 1:
569 webApplication.ParentPaths = IIs.YesNoDefaultType.yes;
570 break;
571 default:
572 // TODO: warn
573 break;
574 }
575 }
576
577 if (null != row[7])
578 {
579 switch ((string)row[7])
580 {
581 case "JScript":
582 webApplication.DefaultScript = IIs.WebApplication.DefaultScriptType.JScript;
583 break;
584 case "VBScript":
585 webApplication.DefaultScript = IIs.WebApplication.DefaultScriptType.VBScript;
586 break;
587 default:
588 // TODO: warn
589 break;
590 }
591 }
592
593 if (null != row[8])
594 {
595 webApplication.ScriptTimeout = (int)row[8];
596 }
597
598 if (null != row[9])
599 {
600 switch ((int)row[9])
601 {
602 case 0:
603 webApplication.ServerDebugging = IIs.YesNoDefaultType.no;
604 break;
605 case 1:
606 webApplication.ServerDebugging = IIs.YesNoDefaultType.yes;
607 break;
608 default:
609 // TODO: warn
610 break;
611 }
612 }
613
614 if (null != row[10])
615 {
616 switch ((int)row[10])
617 {
618 case 0:
619 webApplication.ClientDebugging = IIs.YesNoDefaultType.no;
620 break;
621 case 1:
622 webApplication.ClientDebugging = IIs.YesNoDefaultType.yes;
623 break;
624 default:
625 // TODO: warn
626 break;
627 }
628 }
629
630 if (null != row[11])
631 {
632 webApplication.WebAppPool = (string)row[11];
633 }
634
635 this.Core.IndexElement(row, webApplication);
636 }
637 }
638
639 /// <summary>
640 /// Decompile the IIsWebDirProperties table.
641 /// </summary>
642 /// <param name="table">The table to decompile.</param>
643 private void DecompileIIsWebDirPropertiesTable(Table table)
644 {
645 foreach (Row row in table.Rows)
646 {
647 IIs.WebDirProperties webDirProperties = new IIs.WebDirProperties();
648
649 webDirProperties.Id = (string)row[0];
650
651 if (null != row[1])
652 {
653 int access = (int)row[1];
654
655 if (0x1 == (access & 0x1))
656 {
657 webDirProperties.Read = IIs.YesNoType.yes;
658 }
659
660 if (0x2 == (access & 0x2))
661 {
662 webDirProperties.Write = IIs.YesNoType.yes;
663 }
664
665 if (0x4 == (access & 0x4))
666 {
667 webDirProperties.Execute = IIs.YesNoType.yes;
668 }
669
670 if (0x200 == (access & 0x200))
671 {
672 webDirProperties.Script = IIs.YesNoType.yes;
673 }
674 }
675
676 if (null != row[2])
677 {
678 int authorization = (int)row[2];
679
680 if (0x1 == (authorization & 0x1))
681 {
682 webDirProperties.AnonymousAccess = IIs.YesNoType.yes;
683 }
684 else // set one of the properties to 'no' to force the output value to be '0' if not other attributes are set
685 {
686 webDirProperties.AnonymousAccess = IIs.YesNoType.no;
687 }
688
689 if (0x2 == (authorization & 0x2))
690 {
691 webDirProperties.BasicAuthentication = IIs.YesNoType.yes;
692 }
693
694 if (0x4 == (authorization & 0x4))
695 {
696 webDirProperties.WindowsAuthentication = IIs.YesNoType.yes;
697 }
698
699 if (0x10 == (authorization & 0x10))
700 {
701 webDirProperties.DigestAuthentication = IIs.YesNoType.yes;
702 }
703
704 if (0x40 == (authorization & 0x40))
705 {
706 webDirProperties.PassportAuthentication = IIs.YesNoType.yes;
707 }
708 }
709
710 if (null != row[3])
711 {
712 webDirProperties.AnonymousUser = (string)row[3];
713 }
714
715 if (null != row[4] && 1 == (int)row[4])
716 {
717 webDirProperties.IIsControlledPassword = IIs.YesNoType.yes;
718 }
719
720 if (null != row[5])
721 {
722 switch ((int)row[5])
723 {
724 case 0:
725 webDirProperties.LogVisits = IIs.YesNoType.no;
726 break;
727 case 1:
728 webDirProperties.LogVisits = IIs.YesNoType.yes;
729 break;
730 default:
731 // TODO: warn
732 break;
733 }
734 }
735
736 if (null != row[6])
737 {
738 switch ((int)row[6])
739 {
740 case 0:
741 webDirProperties.Index = IIs.YesNoType.no;
742 break;
743 case 1:
744 webDirProperties.Index = IIs.YesNoType.yes;
745 break;
746 default:
747 // TODO: warn
748 break;
749 }
750 }
751
752 if (null != row[7])
753 {
754 webDirProperties.DefaultDocuments = (string)row[7];
755 }
756
757 if (null != row[8])
758 {
759 switch ((int)row[8])
760 {
761 case 0:
762 webDirProperties.AspDetailedError = IIs.YesNoType.no;
763 break;
764 case 1:
765 webDirProperties.AspDetailedError = IIs.YesNoType.yes;
766 break;
767 default:
768 // TODO: warn
769 break;
770 }
771 }
772
773 if (null != row[9])
774 {
775 webDirProperties.HttpExpires = (string)row[9];
776 }
777
778 if (null != row[10])
779 {
780 // force the value to be a positive number
781 webDirProperties.CacheControlMaxAge = unchecked((uint)(int)row[10]);
782 }
783
784 if (null != row[11])
785 {
786 webDirProperties.CacheControlCustom = (string)row[11];
787 }
788
789 if (null != row[12])
790 {
791 switch ((int)row[8])
792 {
793 case 0:
794 webDirProperties.ClearCustomError = IIs.YesNoType.no;
795 break;
796 case 1:
797 webDirProperties.ClearCustomError = IIs.YesNoType.yes;
798 break;
799 default:
800 // TODO: warn
801 break;
802 }
803 }
804
805 if (null != row[13])
806 {
807 int accessSSLFlags = (int)row[13];
808
809 if (0x8 == (accessSSLFlags & 0x8))
810 {
811 webDirProperties.AccessSSL = IIs.YesNoType.yes;
812 }
813
814 if (0x20 == (accessSSLFlags & 0x20))
815 {
816 webDirProperties.AccessSSLNegotiateCert = IIs.YesNoType.yes;
817 }
818
819 if (0x40 == (accessSSLFlags & 0x40))
820 {
821 webDirProperties.AccessSSLRequireCert = IIs.YesNoType.yes;
822 }
823
824 if (0x80 == (accessSSLFlags & 0x80))
825 {
826 webDirProperties.AccessSSLMapCert = IIs.YesNoType.yes;
827 }
828
829 if (0x100 == (accessSSLFlags & 0x100))
830 {
831 webDirProperties.AccessSSL128 = IIs.YesNoType.yes;
832 }
833 }
834
835 if (null != row[14])
836 {
837 webDirProperties.AuthenticationProviders = (string)row[14];
838 }
839
840 this.Core.RootElement.AddChild(webDirProperties);
841 }
842 }
843
844 /// <summary>
845 /// Decompile the IIsWebError table.
846 /// </summary>
847 /// <param name="table">The table to decompile.</param>
848 private void DecompileIIsWebErrorTable(Table table)
849 {
850 foreach (Row row in table.Rows)
851 {
852 IIs.WebError webError = new IIs.WebError();
853
854 webError.ErrorCode = (int)row[0];
855
856 webError.SubCode = (int)row[1];
857
858 // the ParentType and ParentValue columns are handled in FinalizeIIsWebErrorTable
859
860 if (null != row[4])
861 {
862 webError.File = (string)row[4];
863 }
864
865 if (null != row[5])
866 {
867 webError.URL = (string)row[5];
868 }
869
870 this.Core.IndexElement(row, webError);
871 }
872 }
873
874 /// <summary>
875 /// Decompile the IIsFilter table.
876 /// </summary>
877 /// <param name="table">The table to decompile.</param>
878 private void DecompileIIsFilterTable(Table table)
879 {
880 foreach (Row row in table.Rows)
881 {
882 IIs.WebFilter webFilter = new IIs.WebFilter();
883
884 webFilter.Id = (string)row[0];
885
886 webFilter.Name = (string)row[1];
887
888 if (null != row[3])
889 {
890 webFilter.Path = (string)row[3];
891 }
892
893 if (null != row[5])
894 {
895 webFilter.Description = (string)row[5];
896 }
897
898 webFilter.Flags = (int)row[6];
899
900 if (null != row[7])
901 {
902 switch ((int)row[7])
903 {
904 case (-1):
905 webFilter.LoadOrder = "last";
906 break;
907 case 0:
908 webFilter.LoadOrder = "first";
909 break;
910 default:
911 webFilter.LoadOrder = Convert.ToString((int)row[7], CultureInfo.InvariantCulture);
912 break;
913 }
914 }
915
916 if (null != row[4])
917 {
918 IIs.WebSite webSite = (IIs.WebSite)this.Core.GetIndexedElement("IIsWebSite", (string)row[4]);
919
920 if (null != webSite)
921 {
922 webSite.AddChild(webFilter);
923 }
924 else
925 {
926 this.Core.OnMessage(WixWarnings.ExpectedForeignRow(row.SourceLineNumbers, table.Name, row.GetPrimaryKey(DecompilerConstants.PrimaryKeyDelimiter), "Web_", (string)row[4], "IIsWebSite"));
927 }
928 }
929 else // Component parent
930 {
931 Wix.Component component = (Wix.Component)this.Core.GetIndexedElement("Component", (string)row[2]);
932
933 if (null != component)
934 {
935 component.AddChild(webFilter);
936 }
937 else
938 {
939 this.Core.OnMessage(WixWarnings.ExpectedForeignRow(row.SourceLineNumbers, table.Name, row.GetPrimaryKey(DecompilerConstants.PrimaryKeyDelimiter), "Component_", (string)row[2], "Component"));
940 }
941 }
942 }
943 }
944
945 /// <summary>
946 /// Decompile the IIsWebLog table.
947 /// </summary>
948 /// <param name="table">The table to decompile.</param>
949 private void DecompileIIsWebLogTable(Table table)
950 {
951 foreach (Row row in table.Rows)
952 {
953 IIs.WebLog webLog = new IIs.WebLog();
954
955 webLog.Id = (string)row[0];
956
957 switch ((string)row[1])
958 {
959 case "Microsoft IIS Log File Format":
960 webLog.Type = IIs.WebLog.TypeType.IIS;
961 break;
962 case "NCSA Common Log File Format":
963 webLog.Type = IIs.WebLog.TypeType.NCSA;
964 break;
965 case "none":
966 webLog.Type = IIs.WebLog.TypeType.none;
967 break;
968 case "ODBC Logging":
969 webLog.Type = IIs.WebLog.TypeType.ODBC;
970 break;
971 case "W3C Extended Log File Format":
972 webLog.Type = IIs.WebLog.TypeType.W3C;
973 break;
974 default:
975 // TODO: warn
976 break;
977 }
978
979 this.Core.RootElement.AddChild(webLog);
980 }
981 }
982
983 /// <summary>
984 /// Decompile the IIsWebServiceExtension table.
985 /// </summary>
986 /// <param name="table">The table to decompile.</param>
987 private void DecompileIIsWebServiceExtensionTable(Table table)
988 {
989 foreach (Row row in table.Rows)
990 {
991 IIs.WebServiceExtension webServiceExtension = new IIs.WebServiceExtension();
992
993 webServiceExtension.Id = (string)row[0];
994
995 webServiceExtension.File = (string)row[2];
996
997 if (null != row[3])
998 {
999 webServiceExtension.Description = (string)row[3];
1000 }
1001
1002 if (null != row[4])
1003 {
1004 webServiceExtension.Group = (string)row[4];
1005 }
1006
1007 int attributes = (int)row[5];
1008
1009 if (0x1 == (attributes & 0x1))
1010 {
1011 webServiceExtension.Allow = IIs.YesNoType.yes;
1012 }
1013 else
1014 {
1015 webServiceExtension.Allow = IIs.YesNoType.no;
1016 }
1017
1018 if (0x2 == (attributes & 0x2))
1019 {
1020 webServiceExtension.UIDeletable = IIs.YesNoType.yes;
1021 }
1022
1023 Wix.Component component = (Wix.Component)this.Core.GetIndexedElement("Component", (string)row[1]);
1024 if (null != component)
1025 {
1026 component.AddChild(webServiceExtension);
1027 }
1028 else
1029 {
1030 this.Core.OnMessage(WixWarnings.ExpectedForeignRow(row.SourceLineNumbers, table.Name, row.GetPrimaryKey(DecompilerConstants.PrimaryKeyDelimiter), "Component_", (string)row[1], "Component"));
1031 }
1032 }
1033 }
1034
1035 /// <summary>
1036 /// Decompile the IIsWebSite table.
1037 /// </summary>
1038 /// <param name="table">The table to decompile.</param>
1039 private void DecompileIIsWebSiteTable(Table table)
1040 {
1041 foreach (Row row in table.Rows)
1042 {
1043 IIs.WebSite webSite = new IIs.WebSite();
1044
1045 webSite.Id = (string)row[0];
1046
1047 if (null != row[2])
1048 {
1049 webSite.Description = (string)row[2];
1050 }
1051
1052 if (null != row[3])
1053 {
1054 webSite.ConnectionTimeout = (int)row[3];
1055 }
1056
1057 if (null != row[4])
1058 {
1059 webSite.Directory = (string)row[4];
1060 }
1061
1062 if (null != row[5])
1063 {
1064 switch ((int)row[5])
1065 {
1066 case 0:
1067 // this is the default
1068 break;
1069 case 1:
1070 webSite.StartOnInstall = IIs.YesNoType.yes;
1071 break;
1072 case 2:
1073 webSite.AutoStart = IIs.YesNoType.yes;
1074 break;
1075 default:
1076 // TODO: warn
1077 break;
1078 }
1079 }
1080
1081 if (null != row[6])
1082 {
1083 int attributes = (int)row[6];
1084
1085 if (0x2 == (attributes & 0x2))
1086 {
1087 webSite.ConfigureIfExists = IIs.YesNoType.no;
1088 }
1089 }
1090
1091 // the KeyAddress_ column is handled in FinalizeWebAddressTable
1092
1093 if (null != row[8])
1094 {
1095 webSite.DirProperties = (string)row[8];
1096 }
1097
1098 // the Application_ column is handled in FinalizeIIsWebApplicationTable
1099
1100 if (null != row[10])
1101 {
1102 if (-1 != (int)row[10])
1103 {
1104 webSite.Sequence = (int)row[10];
1105 }
1106 }
1107
1108 if (null != row[11])
1109 {
1110 webSite.WebLog = (string)row[11];
1111 }
1112
1113 if (null != row[12])
1114 {
1115 webSite.SiteId = (string)row[12];
1116 }
1117
1118 if (null != row[1])
1119 {
1120 Wix.Component component = (Wix.Component)this.Core.GetIndexedElement("Component", (string)row[1]);
1121
1122 if (null != component)
1123 {
1124 component.AddChild(webSite);
1125 }
1126 else
1127 {
1128 this.Core.OnMessage(WixWarnings.ExpectedForeignRow(row.SourceLineNumbers, table.Name, row.GetPrimaryKey(DecompilerConstants.PrimaryKeyDelimiter), "Component_", (string)row[1], "Component"));
1129 }
1130 }
1131 else
1132 {
1133 this.Core.RootElement.AddChild(webSite);
1134 }
1135 this.Core.IndexElement(row, webSite);
1136 }
1137 }
1138
1139 /// <summary>
1140 /// Decompile the IIsWebVirtualDir table.
1141 /// </summary>
1142 /// <param name="table">The table to decompile.</param>
1143 private void DecompileIIsWebVirtualDirTable(Table table)
1144 {
1145 foreach (Row row in table.Rows)
1146 {
1147 IIs.WebVirtualDir webVirtualDir = new IIs.WebVirtualDir();
1148
1149 webVirtualDir.Id = (string)row[0];
1150
1151 // the Component_ and Web_ columns are handled in FinalizeIIsWebVirtualDirTable
1152
1153 webVirtualDir.Alias = (string)row[3];
1154
1155 webVirtualDir.Directory = (string)row[4];
1156
1157 if (null != row[5])
1158 {
1159 webVirtualDir.DirProperties = (string)row[5];
1160 }
1161
1162 // the Application_ column is handled in FinalizeIIsWebApplicationTable
1163
1164 this.Core.IndexElement(row, webVirtualDir);
1165 }
1166 }
1167
1168 /// <summary>
1169 /// Decompile the IIsWebSiteCertificates table.
1170 /// </summary>
1171 /// <param name="table">The table to decompile.</param>
1172 private void DecompileIIsWebSiteCertificatesTable(Table table)
1173 {
1174 foreach (Row row in table.Rows)
1175 {
1176 IIs.CertificateRef certificateRef = new IIs.CertificateRef();
1177
1178 certificateRef.Id = (string)row[1];
1179
1180 this.Core.IndexElement(row, certificateRef);
1181 }
1182 }
1183
1184 /// <summary>
1185 /// Finalize the IIsHttpHeader table.
1186 /// </summary>
1187 /// <param name="tables">The collection of all tables.</param>
1188 /// <remarks>
1189 /// The IIsHttpHeader table supports multiple parent types so no foreign key
1190 /// is declared and thus nesting must be done late.
1191 /// </remarks>
1192 private void FinalizeIIsHttpHeaderTable(TableIndexedCollection tables)
1193 {
1194 Table iisHttpHeaderTable = tables["IIsHttpHeader"];
1195
1196 if (null != iisHttpHeaderTable)
1197 {
1198 foreach (Row row in iisHttpHeaderTable.Rows)
1199 {
1200 IIs.HttpHeader httpHeader = (IIs.HttpHeader)this.Core.GetIndexedElement(row);
1201
1202 if (1 == (int)row[1])
1203 {
1204 IIs.WebVirtualDir webVirtualDir = (IIs.WebVirtualDir)this.Core.GetIndexedElement("IIsWebVirtualDir", (string)row[2]);
1205 if (null != webVirtualDir)
1206 {
1207 webVirtualDir.AddChild(httpHeader);
1208 }
1209 else
1210 {
1211 this.Core.OnMessage(WixWarnings.ExpectedForeignRow(row.SourceLineNumbers, iisHttpHeaderTable.Name, row.GetPrimaryKey(DecompilerConstants.PrimaryKeyDelimiter), "ParentValue", (string)row[2], "IIsWebVirtualDir"));
1212 }
1213 }
1214 else if (2 == (int)row[1])
1215 {
1216 IIs.WebSite webSite = (IIs.WebSite)this.Core.GetIndexedElement("IIsWebSite", (string)row[2]);
1217 if (null != webSite)
1218 {
1219 webSite.AddChild(httpHeader);
1220 }
1221 else
1222 {
1223 this.Core.OnMessage(WixWarnings.ExpectedForeignRow(row.SourceLineNumbers, iisHttpHeaderTable.Name, row.GetPrimaryKey(DecompilerConstants.PrimaryKeyDelimiter), "ParentValue", (string)row[2], "IIsWebSite"));
1224 }
1225 }
1226 }
1227 }
1228 }
1229
1230 /// <summary>
1231 /// Finalize the IIsMimeMap table.
1232 /// </summary>
1233 /// <param name="tables">The collection of all tables.</param>
1234 /// <remarks>
1235 /// The IIsMimeMap table supports multiple parent types so no foreign key
1236 /// is declared and thus nesting must be done late.
1237 /// </remarks>
1238 private void FinalizeIIsMimeMapTable(TableIndexedCollection tables)
1239 {
1240 Table iisMimeMapTable = tables["IIsMimeMap"];
1241
1242 if (null != iisMimeMapTable)
1243 {
1244 foreach (Row row in iisMimeMapTable.Rows)
1245 {
1246 IIs.MimeMap mimeMap = (IIs.MimeMap)this.Core.GetIndexedElement(row);
1247
1248 if (2 < (int)row[1] || 0 >= (int)row[1])
1249 {
1250 // TODO: warn about unknown parent type
1251 }
1252
1253 IIs.WebVirtualDir webVirtualDir = (IIs.WebVirtualDir)this.Core.GetIndexedElement("IIsWebVirtualDir", (string)row[2]);
1254 IIs.WebSite webSite = (IIs.WebSite)this.Core.GetIndexedElement("IIsWebSite", (string)row[2]);
1255 if (null != webVirtualDir)
1256 {
1257 webVirtualDir.AddChild(mimeMap);
1258 }
1259 else if (null != webSite)
1260 {
1261 webSite.AddChild(mimeMap);
1262 }
1263 else
1264 {
1265 this.Core.OnMessage(WixWarnings.ExpectedForeignRow(row.SourceLineNumbers, iisMimeMapTable.Name, row.GetPrimaryKey(DecompilerConstants.PrimaryKeyDelimiter), "ParentValue", (string)row[2], "IIsWebVirtualDir"));
1266 }
1267 }
1268 }
1269 }
1270
1271 /// <summary>
1272 /// Finalize the IIsWebApplication table.
1273 /// </summary>
1274 /// <param name="tables">The collection of all tables.</param>
1275 /// <remarks>
1276 /// Since WebApplication elements may nest under a specific WebSite or
1277 /// WebVirtualDir (or just the root element), the nesting must be done late.
1278 /// </remarks>
1279 private void FinalizeIIsWebApplicationTable(TableIndexedCollection tables)
1280 {
1281 Table iisWebApplicationTable = tables["IIsWebApplication"];
1282 Table iisWebSiteTable = tables["IIsWebSite"];
1283 Table iisWebVirtualDirTable = tables["IIsWebVirtualDir"];
1284
1285 Hashtable addedWebApplications = new Hashtable();
1286
1287 if (null != iisWebSiteTable)
1288 {
1289 foreach (Row row in iisWebSiteTable.Rows)
1290 {
1291 if (null != row[9])
1292 {
1293 IIs.WebSite webSite = (IIs.WebSite)this.Core.GetIndexedElement(row);
1294
1295 IIs.WebApplication webApplication = (IIs.WebApplication)this.Core.GetIndexedElement("IIsWebApplication", (string)row[9]);
1296 if (null != webApplication)
1297 {
1298 webSite.AddChild(webApplication);
1299 addedWebApplications[webApplication] = null;
1300 }
1301 else
1302 {
1303 this.Core.OnMessage(WixWarnings.ExpectedForeignRow(row.SourceLineNumbers, iisWebSiteTable.Name, row.GetPrimaryKey(DecompilerConstants.PrimaryKeyDelimiter), "Application_", (string)row[9], "IIsWebApplication"));
1304 }
1305 }
1306 }
1307 }
1308
1309 if (null != iisWebVirtualDirTable)
1310 {
1311 foreach (Row row in iisWebVirtualDirTable.Rows)
1312 {
1313 if (null != row[6])
1314 {
1315 IIs.WebVirtualDir webVirtualDir = (IIs.WebVirtualDir)this.Core.GetIndexedElement(row);
1316
1317 IIs.WebApplication webApplication = (IIs.WebApplication)this.Core.GetIndexedElement("IIsWebApplication", (string)row[6]);
1318 if (null != webApplication)
1319 {
1320 webVirtualDir.AddChild(webApplication);
1321 addedWebApplications[webApplication] = null;
1322 }
1323 else
1324 {
1325 this.Core.OnMessage(WixWarnings.ExpectedForeignRow(row.SourceLineNumbers, iisWebVirtualDirTable.Name, row.GetPrimaryKey(DecompilerConstants.PrimaryKeyDelimiter), "Application_", (string)row[6], "IIsWebApplication"));
1326 }
1327 }
1328 }
1329 }
1330
1331 if (null != iisWebApplicationTable)
1332 {
1333 foreach (Row row in iisWebApplicationTable.Rows)
1334 {
1335 IIs.WebApplication webApplication = (IIs.WebApplication)this.Core.GetIndexedElement(row);
1336
1337 if (!addedWebApplications.Contains(webApplication))
1338 {
1339 this.Core.RootElement.AddChild(webApplication);
1340 }
1341 }
1342 }
1343 }
1344
1345 /// <summary>
1346 /// Finalize the IIsWebError table.
1347 /// </summary>
1348 /// <param name="tables">The collection of all tables.</param>
1349 /// <remarks>
1350 /// Since there is no foreign key relationship declared for this table
1351 /// (because it takes various parent types), it must be nested late.
1352 /// </remarks>
1353 private void FinalizeIIsWebErrorTable(TableIndexedCollection tables)
1354 {
1355 Table iisWebErrorTable = tables["IIsWebError"];
1356
1357 if (null != iisWebErrorTable)
1358 {
1359 foreach (Row row in iisWebErrorTable.Rows)
1360 {
1361 IIs.WebError webError = (IIs.WebError)this.Core.GetIndexedElement(row);
1362
1363 if (1 == (int)row[2]) // WebVirtualDir parent
1364 {
1365 IIs.WebVirtualDir webVirtualDir = (IIs.WebVirtualDir)this.Core.GetIndexedElement("IIsWebVirtualDir", (string)row[3]);
1366
1367 if (null != webVirtualDir)
1368 {
1369 webVirtualDir.AddChild(webError);
1370 }
1371 else
1372 {
1373 this.Core.OnMessage(WixWarnings.ExpectedForeignRow(row.SourceLineNumbers, iisWebErrorTable.Name, row.GetPrimaryKey(DecompilerConstants.PrimaryKeyDelimiter), "ParentValue", (string)row[3], "IIsWebVirtualDir"));
1374 }
1375 }
1376 else if (2 == (int)row[2]) // WebSite parent
1377 {
1378 IIs.WebSite webSite = (IIs.WebSite)this.Core.GetIndexedElement("IIsWebSite", (string)row[3]);
1379
1380 if (null != webSite)
1381 {
1382 webSite.AddChild(webError);
1383 }
1384 else
1385 {
1386 this.Core.OnMessage(WixWarnings.ExpectedForeignRow(row.SourceLineNumbers, iisWebErrorTable.Name, row.GetPrimaryKey(DecompilerConstants.PrimaryKeyDelimiter), "ParentValue", (string)row[3], "IIsWebSite"));
1387 }
1388 }
1389 else
1390 {
1391 // TODO: warn unknown parent type
1392 }
1393 }
1394 }
1395 }
1396
1397 /// <summary>
1398 /// Finalize the IIsWebVirtualDir table.
1399 /// </summary>
1400 /// <param name="tables">The collection of all tables.</param>
1401 /// <remarks>
1402 /// WebVirtualDir elements nest under either a WebSite or component
1403 /// depending upon whether the component in the IIsWebVirtualDir row
1404 /// is the same as the one in the parent IIsWebSite row.
1405 /// </remarks>
1406 private void FinalizeIIsWebVirtualDirTable(TableIndexedCollection tables)
1407 {
1408 Table iisWebSiteTable = tables["IIsWebSite"];
1409 Table iisWebVirtualDirTable = tables["IIsWebVirtualDir"];
1410
1411 Hashtable iisWebSiteRows = new Hashtable();
1412
1413 // index the IIsWebSite rows by their primary keys
1414 if (null != iisWebSiteTable)
1415 {
1416 foreach (Row row in iisWebSiteTable.Rows)
1417 {
1418 iisWebSiteRows.Add(row[0], row);
1419 }
1420 }
1421
1422 if (null != iisWebVirtualDirTable)
1423 {
1424 foreach (Row row in iisWebVirtualDirTable.Rows)
1425 {
1426 IIs.WebVirtualDir webVirtualDir = (IIs.WebVirtualDir)this.Core.GetIndexedElement(row);
1427 Row iisWebSiteRow = (Row)iisWebSiteRows[row[2]];
1428
1429 if (null != iisWebSiteRow)
1430 {
1431 if ((string)iisWebSiteRow[1] == (string)row[1])
1432 {
1433 IIs.WebSite webSite = (IIs.WebSite)this.Core.GetIndexedElement(iisWebSiteRow);
1434
1435 webSite.AddChild(webVirtualDir);
1436 }
1437 else
1438 {
1439 Wix.Component component = (Wix.Component)this.Core.GetIndexedElement("Component", (string)row[1]);
1440
1441 if (null != component)
1442 {
1443 webVirtualDir.WebSite = (string)row[2];
1444 component.AddChild(webVirtualDir);
1445 }
1446 else
1447 {
1448 this.Core.OnMessage(WixWarnings.ExpectedForeignRow(row.SourceLineNumbers, iisWebVirtualDirTable.Name, row.GetPrimaryKey(DecompilerConstants.PrimaryKeyDelimiter), "Component_", (string)row[1], "Component"));
1449 }
1450 }
1451 }
1452 else
1453 {
1454 this.Core.OnMessage(WixWarnings.ExpectedForeignRow(row.SourceLineNumbers, iisWebVirtualDirTable.Name, row.GetPrimaryKey(DecompilerConstants.PrimaryKeyDelimiter), "Web_", (string)row[2], "IIsWebSite"));
1455 }
1456 }
1457 }
1458 }
1459
1460 /// <summary>
1461 /// Finalize the IIsWebSiteCertificates table.
1462 /// </summary>
1463 /// <param name="tables">The collection of all tables.</param>
1464 /// <remarks>
1465 /// This table creates CertificateRef elements which nest under WebSite
1466 /// elements.
1467 /// </remarks>
1468 private void FinalizeIIsWebSiteCertificatesTable(TableIndexedCollection tables)
1469 {
1470 Table IIsWebSiteCertificatesTable = tables["IIsWebSiteCertificates"];
1471
1472 if (null != IIsWebSiteCertificatesTable)
1473 {
1474 foreach (Row row in IIsWebSiteCertificatesTable.Rows)
1475 {
1476 IIs.CertificateRef certificateRef = (IIs.CertificateRef)this.Core.GetIndexedElement(row);
1477 IIs.WebSite webSite = (IIs.WebSite)this.Core.GetIndexedElement("IIsWebSite", (string)row[0]);
1478
1479 if (null != webSite)
1480 {
1481 webSite.AddChild(certificateRef);
1482 }
1483 else
1484 {
1485 this.Core.OnMessage(WixWarnings.ExpectedForeignRow(row.SourceLineNumbers, IIsWebSiteCertificatesTable.Name, row.GetPrimaryKey(DecompilerConstants.PrimaryKeyDelimiter), "Web_", (string)row[0], "IIsWebSite"));
1486 }
1487 }
1488 }
1489 }
1490
1491 /// <summary>
1492 /// Finalize the WebAddress table.
1493 /// </summary>
1494 /// <param name="tables">The collection of all tables.</param>
1495 /// <remarks>
1496 /// There is a circular dependency between the WebAddress and WebSite
1497 /// tables, so nesting must be handled here.
1498 /// </remarks>
1499 private void FinalizeWebAddressTable(TableIndexedCollection tables)
1500 {
1501 Table iisWebAddressTable = tables["IIsWebAddress"];
1502 Table iisWebSiteTable = tables["IIsWebSite"];
1503
1504 Hashtable addedWebAddresses = new Hashtable();
1505
1506 if (null != iisWebSiteTable)
1507 {
1508 foreach (Row row in iisWebSiteTable.Rows)
1509 {
1510 IIs.WebSite webSite = (IIs.WebSite)this.Core.GetIndexedElement(row);
1511
1512 IIs.WebAddress webAddress = (IIs.WebAddress)this.Core.GetIndexedElement("IIsWebAddress", (string)row[7]);
1513 if (null != webAddress)
1514 {
1515 webSite.AddChild(webAddress);
1516 addedWebAddresses[webAddress] = null;
1517 }
1518 else
1519 {
1520 this.Core.OnMessage(WixWarnings.ExpectedForeignRow(row.SourceLineNumbers, iisWebSiteTable.Name, row.GetPrimaryKey(DecompilerConstants.PrimaryKeyDelimiter), "KeyAddress_", (string)row[7], "IIsWebAddress"));
1521 }
1522 }
1523 }
1524
1525 if (null != iisWebAddressTable)
1526 {
1527 foreach (Row row in iisWebAddressTable.Rows)
1528 {
1529 IIs.WebAddress webAddress = (IIs.WebAddress)this.Core.GetIndexedElement(row);
1530
1531 if (!addedWebAddresses.Contains(webAddress))
1532 {
1533 IIs.WebSite webSite = (IIs.WebSite)this.Core.GetIndexedElement("IIsWebSite", (string)row[1]);
1534
1535 if (null != webSite)
1536 {
1537 webSite.AddChild(webAddress);
1538 }
1539 else
1540 {
1541 this.Core.OnMessage(WixWarnings.ExpectedForeignRow(row.SourceLineNumbers, iisWebAddressTable.Name, row.GetPrimaryKey(DecompilerConstants.PrimaryKeyDelimiter), "Web_", (string)row[1], "IIsWebSite"));
1542 }
1543 }
1544 }
1545 }
1546 }
1547 }
1548#endif
1549}
diff --git a/src/ext/Iis/wixext/IIsExtensionData.cs b/src/ext/Iis/wixext/IIsExtensionData.cs
new file mode 100644
index 00000000..6a0e1f09
--- /dev/null
+++ b/src/ext/Iis/wixext/IIsExtensionData.cs
@@ -0,0 +1,30 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Iis
4{
5 using WixToolset.Data;
6 using WixToolset.Extensibility;
7
8 /// <summary>
9 /// The WiX Toolset Internet Information Services Extension.
10 /// </summary>
11 public sealed class IIsExtensionData : BaseExtensionData
12 {
13 /// <summary>
14 /// Gets the default culture.
15 /// </summary>
16 /// <value>The default culture.</value>
17 public override string DefaultCulture => "en-US";
18
19 public override bool TryGetSymbolDefinitionByName(string name, out IntermediateSymbolDefinition symbolDefinition)
20 {
21 symbolDefinition = IisSymbolDefinitions.ByName(name);
22 return symbolDefinition != null;
23 }
24
25 public override Intermediate GetLibrary(ISymbolDefinitionCreator symbolDefinitions)
26 {
27 return Intermediate.Load(typeof(IIsExtensionData).Assembly, "WixToolset.Iis.iis.wixlib", symbolDefinitions);
28 }
29 }
30}
diff --git a/src/ext/Iis/wixext/IisErrors.cs b/src/ext/Iis/wixext/IisErrors.cs
new file mode 100644
index 00000000..2f226217
--- /dev/null
+++ b/src/ext/Iis/wixext/IisErrors.cs
@@ -0,0 +1,78 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Data
4{
5 using System;
6 using System.Resources;
7
8 public static class IIsErrors
9 {
10 public static Message DeprecatedBinaryChildElement(SourceLineNumber sourceLineNumbers, string elementName)
11 {
12 return Message(sourceLineNumbers, Ids.DeprecatedBinaryChildElement, "The {0} element contains a deprecated child Binary element. Please move the Binary element under a Fragment, Module, or Product element and set the {0}/@BinaryKey attribute to the value of the Binary/@Id attribute.", elementName);
13 }
14
15 public static Message IllegalAttributeWithoutComponent(SourceLineNumber sourceLineNumbers, string elementName, string attributeName)
16 {
17 return Message(sourceLineNumbers, Ids.IllegalAttributeWithoutComponent, "The {0}/@{1} attribute cannot be specified unless the element has a Component as an ancestor. A {0} that does not have a Component ancestor is not installed.", elementName, attributeName);
18 }
19
20 public static Message IllegalCharacterInAttributeValue(SourceLineNumber sourceLineNumbers, string elementName, string attributeName, string value, Char illegalCharacter)
21 {
22 return Message(sourceLineNumbers, Ids.IllegalCharacterInAttributeValue, "The {0}/@{1} attribute's value, '{2}', is invalid. It cannot contain the character '{3}'.", elementName, attributeName, value, illegalCharacter);
23 }
24
25 public static Message IllegalElementWithoutComponent(SourceLineNumber sourceLineNumbers, string elementName)
26 {
27 return Message(sourceLineNumbers, Ids.IllegalElementWithoutComponent, "The {0} element cannot be specified unless the element has a Component as an ancestor. A {0} that does not have a Component ancestor is not installed.", elementName);
28 }
29
30 public static Message MimeMapExtensionMissingPeriod(SourceLineNumber sourceLineNumbers, string elementName, string attributeName, string attributeValue)
31 {
32 return Message(sourceLineNumbers, Ids.MimeMapExtensionMissingPeriod, "The {0}/@{1} attribute's value, '{2}', is not a valid mime map extension. It must begin with a period.", elementName, attributeName, attributeValue);
33 }
34
35 public static Message OneOfAttributesRequiredUnderComponent(SourceLineNumber sourceLineNumbers, string elementName, string attributeName1, string attributeName2, string attributeName3, string attributeName4)
36 {
37 return Message(sourceLineNumbers, Ids.OneOfAttributesRequiredUnderComponent, "When nested under a Component, the {0} element must have one of the following attributes specified: {1}, {2}, {3} or {4}.", elementName, attributeName1, attributeName2, attributeName3, attributeName4);
38 }
39
40 public static Message RequiredAttributeUnderComponent(SourceLineNumber sourceLineNumbers, string elementName, string attributeName)
41 {
42 return Message(sourceLineNumbers, Ids.RequiredAttributeUnderComponent, "The {0}/@{1} attribute must be specified when the element has a Component as an ancestor.", elementName, attributeName);
43 }
44
45 public static Message WebApplicationAlreadySpecified(SourceLineNumber sourceLineNumbers, string elementName)
46 {
47 return Message(sourceLineNumbers, Ids.WebApplicationAlreadySpecified, "The {0} element can have at most a single WebApplication specified. This can be either through the WebApplication attribute, or through a nested WebApplication element, but not both.", elementName);
48 }
49
50 public static Message WebSiteAttributeUnderWebSite(SourceLineNumber sourceLineNumbers, string elementName)
51 {
52 return Message(sourceLineNumbers, Ids.WebSiteAttributeUnderWebSite, "The {0}/@WebSite attribute cannot be specified when the {0} element is nested under a WebSite element.", elementName);
53 }
54
55 private static Message Message(SourceLineNumber sourceLineNumber, Ids id, string format, params object[] args)
56 {
57 return new Message(sourceLineNumber, MessageLevel.Error, (int)id, format, args);
58 }
59
60 private static Message Message(SourceLineNumber sourceLineNumber, Ids id, ResourceManager resourceManager, string resourceName, params object[] args)
61 {
62 return new Message(sourceLineNumber, MessageLevel.Error, (int)id, resourceManager, resourceName, args);
63 }
64
65 public enum Ids
66 {
67 MimeMapExtensionMissingPeriod = 5150,
68 IllegalAttributeWithoutComponent = 5151,
69 IllegalElementWithoutComponent = 5152,
70 OneOfAttributesRequiredUnderComponent = 5153,
71 WebSiteAttributeUnderWebSite = 5154,
72 WebApplicationAlreadySpecified = 5155,
73 IllegalCharacterInAttributeValue = 5156,
74 DeprecatedBinaryChildElement = 5157,
75 RequiredAttributeUnderComponent = 5161,
76 }
77 }
78}
diff --git a/src/ext/Iis/wixext/IisExtensionFactory.cs b/src/ext/Iis/wixext/IisExtensionFactory.cs
new file mode 100644
index 00000000..2fb7e682
--- /dev/null
+++ b/src/ext/Iis/wixext/IisExtensionFactory.cs
@@ -0,0 +1,18 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Iis
4{
5 using System;
6 using System.Collections.Generic;
7 using WixToolset.Extensibility;
8
9 public class IisExtensionFactory : BaseExtensionFactory
10 {
11 protected override IReadOnlyCollection<Type> ExtensionTypes => new[]
12 {
13 typeof(IIsCompiler),
14 typeof(IIsExtensionData),
15 typeof(IisWindowsInstallerBackendBinderExtension),
16 };
17 }
18}
diff --git a/src/ext/Iis/wixext/IisTableDefinitions.cs b/src/ext/Iis/wixext/IisTableDefinitions.cs
new file mode 100644
index 00000000..f513152e
--- /dev/null
+++ b/src/ext/Iis/wixext/IisTableDefinitions.cs
@@ -0,0 +1,324 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Iis
4{
5 using WixToolset.Data.WindowsInstaller;
6
7 public static class IisTableDefinitions
8 {
9 public static readonly TableDefinition Certificate = new TableDefinition(
10 "Certificate",
11 IisSymbolDefinitions.Certificate,
12 new[]
13 {
14 new ColumnDefinition("Certificate", ColumnType.String, 72, primaryKey: true, nullable: false, ColumnCategory.Identifier, keyColumn: 1, description: "Identifier for the certificate in the package.", modularizeType: ColumnModularizeType.Column),
15 new ColumnDefinition("Component_", ColumnType.String, 72, primaryKey: false, nullable: false, ColumnCategory.Identifier, description: "Foreign key into the Component table used to determine install state", modularizeType: ColumnModularizeType.Column),
16 new ColumnDefinition("Name", ColumnType.String, 255, primaryKey: false, nullable: false, ColumnCategory.Formatted, description: "Name to be used for the Certificate."),
17 new ColumnDefinition("StoreLocation", ColumnType.Number, 2, primaryKey: false, nullable: false, ColumnCategory.Unknown, minValue: 1, maxValue: 2, description: "Location of the target certificate store (CurrentUser == 1, LocalMachine == 2)"),
18 new ColumnDefinition("StoreName", ColumnType.String, 64, primaryKey: false, nullable: false, ColumnCategory.Formatted, description: "Name of the target certificate store"),
19 new ColumnDefinition("Attributes", ColumnType.Number, 4, primaryKey: false, nullable: false, ColumnCategory.Unknown, minValue: 0, maxValue: 2147483647, description: "Attributes of the certificate"),
20 new ColumnDefinition("Binary_", ColumnType.String, 72, primaryKey: false, nullable: true, ColumnCategory.Identifier, keyTable: "Binary", keyColumn: 1, description: "Identifier to Binary table containing certificate.", modularizeType: ColumnModularizeType.Column),
21 new ColumnDefinition("CertificatePath", ColumnType.String, 0, primaryKey: false, nullable: true, ColumnCategory.Formatted, description: "Property to path of certificate.", modularizeType: ColumnModularizeType.Property),
22 new ColumnDefinition("PFXPassword", ColumnType.String, 0, primaryKey: false, nullable: true, ColumnCategory.Formatted, description: "Hidden property to a pfx password", modularizeType: ColumnModularizeType.Property),
23 },
24 symbolIdIsPrimaryKey: true
25 );
26
27 public static readonly TableDefinition CertificateHash = new TableDefinition(
28 "CertificateHash",
29 IisSymbolDefinitions.CertificateHash,
30 new[]
31 {
32 new ColumnDefinition("Certificate_", ColumnType.String, 72, primaryKey: true, nullable: false, ColumnCategory.Identifier, keyColumn: 1, description: "Foreign key to certificate in Certificate table.", modularizeType: ColumnModularizeType.Column),
33 new ColumnDefinition("Hash", ColumnType.String, 0, primaryKey: false, nullable: true, ColumnCategory.Text, description: "Base64 encoded SHA1 hash of certificate populated at run-time."),
34 },
35 symbolIdIsPrimaryKey: false
36 );
37
38 public static readonly TableDefinition IIsWebSiteCertificates = new TableDefinition(
39 "IIsWebSiteCertificates",
40 IisSymbolDefinitions.IIsWebSiteCertificates,
41 new[]
42 {
43 new ColumnDefinition("Web_", ColumnType.String, 72, primaryKey: true, nullable: false, ColumnCategory.Identifier, keyTable: "IIsWebSite", keyColumn: 1, description: "The index into the IIsWebSite table.", modularizeType: ColumnModularizeType.Column),
44 new ColumnDefinition("Certificate_", ColumnType.String, 72, primaryKey: true, nullable: false, ColumnCategory.Text, keyTable: "Certificate", keyColumn: 1, description: "The index into the Certificate table.", modularizeType: ColumnModularizeType.Column),
45 },
46 symbolIdIsPrimaryKey: false
47 );
48
49 public static readonly TableDefinition IIsAppPool = new TableDefinition(
50 "IIsAppPool",
51 IisSymbolDefinitions.IIsAppPool,
52 new[]
53 {
54 new ColumnDefinition("AppPool", ColumnType.String, 72, primaryKey: true, nullable: false, ColumnCategory.Identifier, description: "Primary key, non-localized token for apppool", modularizeType: ColumnModularizeType.Column),
55 new ColumnDefinition("Name", ColumnType.String, 72, primaryKey: false, nullable: false, ColumnCategory.Formatted, description: "Name to be used for the IIs AppPool.", modularizeType: ColumnModularizeType.Property),
56 new ColumnDefinition("Component_", ColumnType.String, 72, primaryKey: false, nullable: true, ColumnCategory.Identifier, keyTable: "Component", keyColumn: 1, description: "Foreign key referencing Component that controls the app pool", modularizeType: ColumnModularizeType.Column),
57 new ColumnDefinition("Attributes", ColumnType.Number, 2, primaryKey: false, nullable: false, ColumnCategory.Unknown, description: "Attributes of the AppPool"),
58 new ColumnDefinition("User_", ColumnType.String, 72, primaryKey: false, nullable: true, ColumnCategory.Identifier, keyTable: "User", keyColumn: 1, description: "User account to run the app pool as", modularizeType: ColumnModularizeType.Column),
59 new ColumnDefinition("RecycleMinutes", ColumnType.Number, 2, primaryKey: false, nullable: true, ColumnCategory.Unknown, description: "Number of minutes between recycling app pool"),
60 new ColumnDefinition("RecycleRequests", ColumnType.Number, 2, primaryKey: false, nullable: true, ColumnCategory.Unknown, description: "Number of requests between recycling app pool"),
61 new ColumnDefinition("RecycleTimes", ColumnType.String, 72, primaryKey: false, nullable: true, ColumnCategory.Unknown, description: "Times to recycle app pool (comma delimited - i.e. 1:45,13:30)"),
62 new ColumnDefinition("IdleTimeout", ColumnType.Number, 2, primaryKey: false, nullable: true, ColumnCategory.Unknown, description: "Amount of idle time before shutting down"),
63 new ColumnDefinition("QueueLimit", ColumnType.Number, 2, primaryKey: false, nullable: true, ColumnCategory.Unknown, description: "Reject requests after queue gets how large"),
64 new ColumnDefinition("CPUMon", ColumnType.String, 72, primaryKey: false, nullable: true, ColumnCategory.Unknown, description: "CPUMon is a comma delimeted list of the following format: <percent CPU usage>,<refress minutes>,<Action>. The values for Action are 1 (Shutdown) and 0 (No Action)."),
65 new ColumnDefinition("MaxProc", ColumnType.Number, 2, primaryKey: false, nullable: true, ColumnCategory.Unknown, description: "Maximum number of processes to use"),
66 new ColumnDefinition("VirtualMemory", ColumnType.Number, 4, primaryKey: false, nullable: true, ColumnCategory.Unknown, description: "Amount of virtual memory (in KB) that a worker process can use before the worker process recycles. The maximum value supported for this field is 4,294,967 KB."),
67 new ColumnDefinition("PrivateMemory", ColumnType.Number, 4, primaryKey: false, nullable: true, ColumnCategory.Unknown, description: "Amount of private memory (in KB) that a worker process can use before the worker process recycles. The maximum value supported for this field is 4,294,967 KB."),
68 new ColumnDefinition("ManagedRuntimeVersion", ColumnType.String, 72, primaryKey: false, nullable: true, ColumnCategory.Unknown, description: "Specifies the .NET Framework version to be used by the application pool."),
69 new ColumnDefinition("ManagedPipelineMode", ColumnType.String, 72, primaryKey: false, nullable: true, ColumnCategory.Unknown, description: "Specifies the request-processing mode that is used to process requests for managed content."),
70 },
71 symbolIdIsPrimaryKey: true
72 );
73
74 public static readonly TableDefinition IIsMimeMap = new TableDefinition(
75 "IIsMimeMap",
76 IisSymbolDefinitions.IIsMimeMap,
77 new[]
78 {
79 new ColumnDefinition("MimeMap", ColumnType.String, 72, primaryKey: true, nullable: false, ColumnCategory.Identifier, description: "Primary key, non-localized token for Mime Map definitions", modularizeType: ColumnModularizeType.Column),
80 new ColumnDefinition("ParentType", ColumnType.Number, 2, primaryKey: false, nullable: false, ColumnCategory.Unknown, possibilities: "1;2", description: "Type of parent: 1=vdir 2=website"),
81 new ColumnDefinition("ParentValue", ColumnType.String, 72, primaryKey: false, nullable: false, ColumnCategory.Identifier, description: "Name of the parent value.", modularizeType: ColumnModularizeType.Column),
82 new ColumnDefinition("MimeType", ColumnType.String, 72, primaryKey: false, nullable: false, ColumnCategory.Text, description: "Mime-type covered by the MimeMap."),
83 new ColumnDefinition("Extension", ColumnType.String, 72, primaryKey: false, nullable: false, ColumnCategory.Text, description: "Extension covered by the MimeMap."),
84 },
85 symbolIdIsPrimaryKey: true
86 );
87
88 public static readonly TableDefinition IIsProperty = new TableDefinition(
89 "IIsProperty",
90 IisSymbolDefinitions.IIsProperty,
91 new[]
92 {
93 new ColumnDefinition("Property", ColumnType.String, 72, primaryKey: true, nullable: false, ColumnCategory.Identifier, description: "Unique name of the IIsProperty"),
94 new ColumnDefinition("Component_", ColumnType.String, 72, primaryKey: false, nullable: false, ColumnCategory.Identifier, keyTable: "Component", keyColumn: 1, description: "Component that the property is linked to", modularizeType: ColumnModularizeType.Column),
95 new ColumnDefinition("Attributes", ColumnType.Number, 2, primaryKey: false, nullable: false, ColumnCategory.Unknown, description: "Attributes of the IIsProperty (unused)"),
96 new ColumnDefinition("Value", ColumnType.String, 72, primaryKey: false, nullable: true, ColumnCategory.Unknown, description: "Value of the IIsProperty"),
97 },
98 symbolIdIsPrimaryKey: true
99 );
100
101 public static readonly TableDefinition IIsWebDirProperties = new TableDefinition(
102 "IIsWebDirProperties",
103 IisSymbolDefinitions.IIsWebDirProperties,
104 new[]
105 {
106 new ColumnDefinition("DirProperties", ColumnType.String, 72, primaryKey: true, nullable: false, ColumnCategory.Identifier, description: "Primary key, non-localized token for Web Properties", modularizeType: ColumnModularizeType.Column),
107 new ColumnDefinition("Access", ColumnType.Number, 2, primaryKey: false, nullable: true, ColumnCategory.Unknown, description: "Access rights to the web server"),
108 new ColumnDefinition("Authorization", ColumnType.Number, 2, primaryKey: false, nullable: true, ColumnCategory.Unknown, description: "Authorization policy to web server (anonymous access, NTLM, etc)"),
109 new ColumnDefinition("AnonymousUser_", ColumnType.String, 72, primaryKey: false, nullable: true, ColumnCategory.Identifier, keyTable: "User", keyColumn: 1, description: "Foreign key, User used to log into database", modularizeType: ColumnModularizeType.Column),
110 new ColumnDefinition("IIsControlledPassword", ColumnType.Number, 2, primaryKey: false, nullable: true, ColumnCategory.Unknown, possibilities: "0;1", description: "Specifies whether IIs is allowed to set the AnonymousUser_ password"),
111 new ColumnDefinition("LogVisits", ColumnType.Number, 2, primaryKey: false, nullable: true, ColumnCategory.Unknown, possibilities: "0;1", description: "Specifies whether IIs tracks all access to the directory"),
112 new ColumnDefinition("Index", ColumnType.Number, 2, primaryKey: false, nullable: true, ColumnCategory.Unknown, possibilities: "0;1", description: "Specifies whether IIs searches the directory"),
113 new ColumnDefinition("DefaultDoc", ColumnType.String, 255, primaryKey: false, nullable: true, ColumnCategory.Text, description: "Comma delimited list of file names to act as a default document"),
114 new ColumnDefinition("AspDetailedError", ColumnType.Number, 2, primaryKey: false, nullable: true, ColumnCategory.Unknown, possibilities: "0;1", description: "Specifies whether detailed ASP errors are sent to browser"),
115 new ColumnDefinition("HttpExpires", ColumnType.String, 255, primaryKey: false, nullable: true, ColumnCategory.Text, description: "Value to set the HttpExpires attribute to for a Web Dir in the metabase"),
116 new ColumnDefinition("CacheControlMaxAge", ColumnType.Number, 4, primaryKey: false, nullable: true, ColumnCategory.Unknown, description: "Integer value specifying the cache control maximum age value."),
117 new ColumnDefinition("CacheControlCustom", ColumnType.String, 255, primaryKey: false, nullable: true, ColumnCategory.Text, description: "Custom HTTP 1.1 cache control directives."),
118 new ColumnDefinition("NoCustomError", ColumnType.Number, 2, primaryKey: false, nullable: true, ColumnCategory.Unknown, possibilities: "0;1", description: "Specifies whether IIs will return custom errors for this directory."),
119 new ColumnDefinition("AccessSSLFlags", ColumnType.Number, 2, primaryKey: false, nullable: true, ColumnCategory.Unknown, description: "Specifies AccessSSLFlags IIS metabase property."),
120 new ColumnDefinition("AuthenticationProviders", ColumnType.String, 255, primaryKey: false, nullable: true, ColumnCategory.Text, description: "Comma delimited list, in order of precedence, of Windows authentication providers that IIS will attempt to use: NTLM, Kerberos, Negotiate, and others."),
121 },
122 symbolIdIsPrimaryKey: true
123 );
124
125 public static readonly TableDefinition IIsWebAddress = new TableDefinition(
126 "IIsWebAddress",
127 IisSymbolDefinitions.IIsWebAddress,
128 new[]
129 {
130 new ColumnDefinition("Address", ColumnType.String, 72, primaryKey: true, nullable: false, ColumnCategory.Identifier, description: "Primary key, non-localized token", modularizeType: ColumnModularizeType.Column),
131 new ColumnDefinition("Web_", ColumnType.String, 72, primaryKey: false, nullable: false, ColumnCategory.Identifier, keyTable: "IIsWebSite", keyColumn: 1, description: "Foreign key referencing Web that uses the address.", modularizeType: ColumnModularizeType.Column),
132 new ColumnDefinition("IP", ColumnType.String, 255, primaryKey: false, nullable: true, ColumnCategory.Text, description: "String representing IP address (#.#.#.#) or NT machine name (fooserver)", modularizeType: ColumnModularizeType.Property),
133 new ColumnDefinition("Port", ColumnType.String, 72, primaryKey: false, nullable: false, ColumnCategory.Formatted, description: "Port web site listens on", modularizeType: ColumnModularizeType.Property),
134 new ColumnDefinition("Header", ColumnType.String, 255, primaryKey: false, nullable: true, ColumnCategory.Text, description: "Special header information for the web site"),
135 new ColumnDefinition("Secure", ColumnType.Number, 2, primaryKey: false, nullable: true, ColumnCategory.Unknown, possibilities: "0;1", description: "Specifies whether SSL is used to communicate with web site"),
136 },
137 symbolIdIsPrimaryKey: true
138 );
139
140 public static readonly TableDefinition IIsWebSite = new TableDefinition(
141 "IIsWebSite",
142 IisSymbolDefinitions.IIsWebSite,
143 new[]
144 {
145 new ColumnDefinition("Web", ColumnType.String, 72, primaryKey: true, nullable: false, ColumnCategory.Identifier, description: "Primary key, non-localized token", modularizeType: ColumnModularizeType.Column),
146 new ColumnDefinition("Component_", ColumnType.String, 72, primaryKey: false, nullable: true, ColumnCategory.Identifier, keyTable: "Component", keyColumn: 1, description: "Foreign key referencing Component that controls the web site", modularizeType: ColumnModularizeType.Column),
147 new ColumnDefinition("Description", ColumnType.String, 255, primaryKey: false, nullable: true, ColumnCategory.Formatted, description: "Description displayed in IIS MMC applet"),
148 new ColumnDefinition("ConnectionTimeout", ColumnType.Number, 2, primaryKey: false, nullable: true, ColumnCategory.Unknown, description: "Time connection is maintained without activity (in seconds)"),
149 new ColumnDefinition("Directory_", ColumnType.String, 72, primaryKey: false, nullable: true, ColumnCategory.Identifier, keyTable: "Directory", keyColumn: 1, description: "Foreign key referencing directory that the web site points at", modularizeType: ColumnModularizeType.Column),
150 new ColumnDefinition("State", ColumnType.Number, 2, primaryKey: false, nullable: true, ColumnCategory.Unknown, possibilities: "0;1;2", description: "Sets intial state of web site"),
151 new ColumnDefinition("Attributes", ColumnType.Number, 2, primaryKey: false, nullable: true, ColumnCategory.Unknown, possibilities: "2", description: "Control the install behavior of web site"),
152 new ColumnDefinition("KeyAddress_", ColumnType.String, 72, primaryKey: false, nullable: false, ColumnCategory.Identifier, keyTable: "IIsWebAddress", keyColumn: 1, description: "Foreign key referencing primary address for the web site", modularizeType: ColumnModularizeType.Column),
153 new ColumnDefinition("DirProperties_", ColumnType.String, 72, primaryKey: false, nullable: true, ColumnCategory.Identifier, keyTable: "IIsWebDirProperties", keyColumn: 1, description: "Foreign key referencing possible security information for the web site", modularizeType: ColumnModularizeType.Column),
154 new ColumnDefinition("Application_", ColumnType.String, 72, primaryKey: false, nullable: true, ColumnCategory.Identifier, keyTable: "IIsWebApplication", keyColumn: 1, description: "Foreign key referencing possible ASP application for the web site.", modularizeType: ColumnModularizeType.Column),
155 new ColumnDefinition("Sequence", ColumnType.Number, 2, primaryKey: false, nullable: true, ColumnCategory.Unknown, description: "Allows ordering of web site install"),
156 new ColumnDefinition("Log_", ColumnType.String, 72, primaryKey: false, nullable: true, ColumnCategory.Unknown, keyTable: "IIsWebLog", keyColumn: 1, description: "Foreign key reference to IIsWebLog data", modularizeType: ColumnModularizeType.Column),
157 new ColumnDefinition("Id", ColumnType.String, 74, primaryKey: false, nullable: true, ColumnCategory.Formatted, description: "Optional number or formatted value that resolves to number that acts as the WebSite Id."),
158 },
159 symbolIdIsPrimaryKey: true
160 );
161
162 public static readonly TableDefinition IIsWebApplication = new TableDefinition(
163 "IIsWebApplication",
164 IisSymbolDefinitions.IIsWebApplication,
165 new[]
166 {
167 new ColumnDefinition("Application", ColumnType.String, 72, primaryKey: true, nullable: false, ColumnCategory.Identifier, description: "Primary key, non-localized token for ASP Application", modularizeType: ColumnModularizeType.Column),
168 new ColumnDefinition("Name", ColumnType.Localized, 255, primaryKey: false, nullable: false, ColumnCategory.Formatted, description: "Name of application in IIS MMC applet", modularizeType: ColumnModularizeType.Property),
169 new ColumnDefinition("Isolation", ColumnType.Number, 2, primaryKey: false, nullable: false, ColumnCategory.Unknown, possibilities: "0;1;2", description: "Isolation level for ASP Application: 0 == Low, 2 == Medium, 1 == High"),
170 new ColumnDefinition("AllowSessions", ColumnType.Number, 2, primaryKey: false, nullable: true, ColumnCategory.Unknown, possibilities: "0;1", description: "Specifies whether application may maintain session state"),
171 new ColumnDefinition("SessionTimeout", ColumnType.Number, 2, primaryKey: false, nullable: true, ColumnCategory.Unknown, description: "Time session state is maintained without user interaction"),
172 new ColumnDefinition("Buffer", ColumnType.Number, 2, primaryKey: false, nullable: true, ColumnCategory.Unknown, possibilities: "0;1", description: "Specifies whether application buffers its output"),
173 new ColumnDefinition("ParentPaths", ColumnType.Number, 2, primaryKey: false, nullable: true, ColumnCategory.Unknown, possibilities: "0;1", description: "What is this for anyway?"),
174 new ColumnDefinition("DefaultScript", ColumnType.String, 26, primaryKey: false, nullable: true, ColumnCategory.Text, possibilities: "VBScript;JScript", description: "Default scripting language for ASP applications"),
175 new ColumnDefinition("ScriptTimeout", ColumnType.Number, 2, primaryKey: false, nullable: true, ColumnCategory.Unknown, description: "Time ASP application page is permitted to process"),
176 new ColumnDefinition("ServerDebugging", ColumnType.Number, 2, primaryKey: false, nullable: true, ColumnCategory.Unknown, possibilities: "0;1", description: "Specifies whether to allow ASP server-side script debugging"),
177 new ColumnDefinition("ClientDebugging", ColumnType.Number, 2, primaryKey: false, nullable: true, ColumnCategory.Unknown, possibilities: "0;1", description: "Specifies whether to allow ASP client-side script debugging"),
178 new ColumnDefinition("AppPool_", ColumnType.String, 72, primaryKey: false, nullable: true, ColumnCategory.Identifier, keyTable: "IIsAppPool", keyColumn: 1, description: "App Pool this application should run under", modularizeType: ColumnModularizeType.Column),
179 },
180 symbolIdIsPrimaryKey: true
181 );
182
183 public static readonly TableDefinition IIsWebApplicationExtension = new TableDefinition(
184 "IIsWebApplicationExtension",
185 IisSymbolDefinitions.IIsWebApplicationExtension,
186 new[]
187 {
188 new ColumnDefinition("Application_", ColumnType.String, 72, primaryKey: true, nullable: false, ColumnCategory.Identifier, keyTable: "IIsWebApplication", keyColumn: 1, description: "Foreign key referencing possible ASP application for the web site", modularizeType: ColumnModularizeType.Column),
189 new ColumnDefinition("Extension", ColumnType.String, 255, primaryKey: true, nullable: true, ColumnCategory.Text, description: "Primary key, Extension that should be registered for this ASP application"),
190 new ColumnDefinition("Verbs", ColumnType.String, 255, primaryKey: false, nullable: true, ColumnCategory.Text, description: "Comma delimited list of HTTP verbs the extension should be registered with"),
191 new ColumnDefinition("Executable", ColumnType.String, 255, primaryKey: false, nullable: false, ColumnCategory.Formatted, description: "Path to extension (usually file property: [#file])", modularizeType: ColumnModularizeType.Property),
192 new ColumnDefinition("Attributes", ColumnType.Number, 2, primaryKey: false, nullable: true, ColumnCategory.Unknown, possibilities: "1;4;5", description: "Attributes for extension: 1 == Script, 4 == Check Path Info"),
193 },
194 symbolIdIsPrimaryKey: false
195 );
196
197 public static readonly TableDefinition IIsFilter = new TableDefinition(
198 "IIsFilter",
199 IisSymbolDefinitions.IIsFilter,
200 new[]
201 {
202 new ColumnDefinition("Filter", ColumnType.String, 72, primaryKey: true, nullable: false, ColumnCategory.Identifier, description: "Primary key, non-localized token", modularizeType: ColumnModularizeType.Column),
203 new ColumnDefinition("Name", ColumnType.String, 72, primaryKey: false, nullable: false, ColumnCategory.Unknown, description: "Name of the ISAPI Filter in IIS"),
204 new ColumnDefinition("Component_", ColumnType.String, 72, primaryKey: false, nullable: false, ColumnCategory.Identifier, keyTable: "Component", keyColumn: 1, description: "Foreign key referencing Component that controls the filter", modularizeType: ColumnModularizeType.Column),
205 new ColumnDefinition("Path", ColumnType.String, 255, primaryKey: false, nullable: true, ColumnCategory.Formatted, description: "Path to filter (usually file property: [#file])", modularizeType: ColumnModularizeType.Property),
206 new ColumnDefinition("Web_", ColumnType.String, 72, primaryKey: false, nullable: true, ColumnCategory.Identifier, keyTable: "IIsWebSite", keyColumn: 1, description: "Foreign key referencing web site that loads the filter (NULL == global filter", modularizeType: ColumnModularizeType.Column),
207 new ColumnDefinition("Description", ColumnType.String, 255, primaryKey: false, nullable: true, ColumnCategory.Formatted, description: "Description displayed in IIS MMC applet"),
208 new ColumnDefinition("Flags", ColumnType.Number, 4, primaryKey: false, nullable: false, ColumnCategory.Unknown, minValue: 0, maxValue: 2147483647, description: "What do all these numbers mean?"),
209 new ColumnDefinition("LoadOrder", ColumnType.Number, 2, primaryKey: false, nullable: true, ColumnCategory.Unknown, description: "-1 == last in order, 0 == first in order, # == place in order"),
210 },
211 symbolIdIsPrimaryKey: true
212 );
213
214 public static readonly TableDefinition IIsWebDir = new TableDefinition(
215 "IIsWebDir",
216 IisSymbolDefinitions.IIsWebDir,
217 new[]
218 {
219 new ColumnDefinition("WebDir", ColumnType.String, 72, primaryKey: true, nullable: false, ColumnCategory.Identifier, description: "Primary key, non-localized token", modularizeType: ColumnModularizeType.Column),
220 new ColumnDefinition("Component_", ColumnType.String, 72, primaryKey: false, nullable: false, ColumnCategory.Identifier, keyTable: "Component", keyColumn: 1, description: "Foreign key referencing Component that controls the virtual directory", modularizeType: ColumnModularizeType.Column),
221 new ColumnDefinition("Web_", ColumnType.String, 72, primaryKey: false, nullable: false, ColumnCategory.Identifier, keyTable: "IIsWebSite", keyColumn: 1, description: "Foreign key referencing web site that controls the virtual directory", modularizeType: ColumnModularizeType.Column),
222 new ColumnDefinition("Path", ColumnType.String, 255, primaryKey: false, nullable: false, ColumnCategory.Formatted, description: "Name of web directory displayed in IIS MMC applet", modularizeType: ColumnModularizeType.Property),
223 new ColumnDefinition("DirProperties_", ColumnType.String, 72, primaryKey: false, nullable: true, ColumnCategory.Identifier, keyTable: "IIsWebDirProperties", keyColumn: 1, description: "Foreign key referencing possible security information for the virtual directory", modularizeType: ColumnModularizeType.Column),
224 new ColumnDefinition("Application_", ColumnType.String, 72, primaryKey: false, nullable: true, ColumnCategory.Identifier, keyTable: "IIsWebApplication", keyColumn: 1, description: "Foreign key referencing possible ASP application for the virtual directory. This column is currently unused, but maintained for compatibility reasons.", modularizeType: ColumnModularizeType.Column),
225 },
226 symbolIdIsPrimaryKey: true
227 );
228
229 public static readonly TableDefinition IIsWebError = new TableDefinition(
230 "IIsWebError",
231 IisSymbolDefinitions.IIsWebError,
232 new[]
233 {
234 new ColumnDefinition("ErrorCode", ColumnType.Number, 2, primaryKey: true, nullable: false, ColumnCategory.Unknown, minValue: 400, maxValue: 599, description: "HTTP status code indicating error."),
235 new ColumnDefinition("SubCode", ColumnType.Number, 4, primaryKey: true, nullable: false, ColumnCategory.Unknown, description: "HTTP sub-status code indicating error."),
236 new ColumnDefinition("ParentType", ColumnType.Number, 2, primaryKey: true, nullable: false, ColumnCategory.Unknown, possibilities: "1;2", description: "Type of parent: 1=vdir, 2=web"),
237 new ColumnDefinition("ParentValue", ColumnType.String, 72, primaryKey: true, nullable: false, ColumnCategory.Identifier, description: "Name of the parent value.", modularizeType: ColumnModularizeType.Column),
238 new ColumnDefinition("File", ColumnType.String, 255, primaryKey: false, nullable: true, ColumnCategory.Formatted, description: "Path to file for this custom error (usually file property: [#file]). Must be null if URL is not null."),
239 new ColumnDefinition("URL", ColumnType.String, 255, primaryKey: false, nullable: true, ColumnCategory.Formatted, description: "URL for this custom error. Must be null if File is not null."),
240 },
241 symbolIdIsPrimaryKey: false
242 );
243
244 public static readonly TableDefinition IIsHttpHeader = new TableDefinition(
245 "IIsHttpHeader",
246 IisSymbolDefinitions.IIsHttpHeader,
247 new[]
248 {
249 new ColumnDefinition("HttpHeader", ColumnType.String, 72, primaryKey: true, nullable: false, ColumnCategory.Identifier, description: "Primary key, non-localized token", modularizeType: ColumnModularizeType.Column),
250 new ColumnDefinition("ParentType", ColumnType.Number, 2, primaryKey: true, nullable: false, ColumnCategory.Unknown, possibilities: "1;2", description: "Type of parent: 1=vdir, 2=web"),
251 new ColumnDefinition("ParentValue", ColumnType.String, 72, primaryKey: true, nullable: false, ColumnCategory.Identifier, description: "Name of the parent value.", modularizeType: ColumnModularizeType.Column),
252 new ColumnDefinition("Name", ColumnType.String, 255, primaryKey: false, nullable: false, ColumnCategory.Text, description: "Name of the HTTP Header"),
253 new ColumnDefinition("Value", ColumnType.String, 255, primaryKey: false, nullable: true, ColumnCategory.Formatted, description: "URL for this custom error. Must be null if File is not null."),
254 new ColumnDefinition("Attributes", ColumnType.Number, 2, primaryKey: false, nullable: false, ColumnCategory.Unknown, minValue: 0, maxValue: 0, description: "Attributes for HTTP Header: none"),
255 new ColumnDefinition("Sequence", ColumnType.Number, 2, primaryKey: false, nullable: true, ColumnCategory.Unknown, description: "Order to add the HTTP Headers."),
256 },
257 symbolIdIsPrimaryKey: false
258 );
259
260 public static readonly TableDefinition IIsWebServiceExtension = new TableDefinition(
261 "IIsWebServiceExtension",
262 IisSymbolDefinitions.IIsWebServiceExtension,
263 new[]
264 {
265 new ColumnDefinition("WebServiceExtension", ColumnType.String, 72, primaryKey: true, nullable: false, ColumnCategory.Identifier, description: "Primary key, non-localized token", modularizeType: ColumnModularizeType.Column),
266 new ColumnDefinition("Component_", ColumnType.String, 72, primaryKey: false, nullable: false, ColumnCategory.Identifier, keyTable: "Component", keyColumn: 1, description: "Foreign key referencing Component that controls the WebServiceExtension handler", modularizeType: ColumnModularizeType.Column),
267 new ColumnDefinition("File", ColumnType.String, 255, primaryKey: false, nullable: false, ColumnCategory.Formatted, description: "Path to handler (usually file property: [#file])", modularizeType: ColumnModularizeType.Property),
268 new ColumnDefinition("Description", ColumnType.Localized, 255, primaryKey: false, nullable: true, ColumnCategory.Formatted, description: "Description displayed in WebServiceExtension Wizard", modularizeType: ColumnModularizeType.Property),
269 new ColumnDefinition("Group", ColumnType.String, 255, primaryKey: false, nullable: true, ColumnCategory.Formatted, description: "String used to identify groups of extensions.", modularizeType: ColumnModularizeType.Property),
270 new ColumnDefinition("Attributes", ColumnType.Number, 1, primaryKey: false, nullable: false, ColumnCategory.Unknown, minValue: 0, maxValue: 3, description: "Attributes for WebServiceExtension: 1 = Allow, 2 = UIDeletable"),
271 },
272 symbolIdIsPrimaryKey: true
273 );
274
275 public static readonly TableDefinition IIsWebVirtualDir = new TableDefinition(
276 "IIsWebVirtualDir",
277 IisSymbolDefinitions.IIsWebVirtualDir,
278 new[]
279 {
280 new ColumnDefinition("VirtualDir", ColumnType.String, 72, primaryKey: true, nullable: false, ColumnCategory.Identifier, description: "Primary key, non-localized token", modularizeType: ColumnModularizeType.Column),
281 new ColumnDefinition("Component_", ColumnType.String, 72, primaryKey: false, nullable: false, ColumnCategory.Identifier, keyTable: "Component", keyColumn: 1, description: "Foreign key referencing Component that controls the virtual directory", modularizeType: ColumnModularizeType.Column),
282 new ColumnDefinition("Web_", ColumnType.String, 72, primaryKey: false, nullable: false, ColumnCategory.Identifier, keyTable: "IIsWebSite", keyColumn: 1, description: "Foreign key referencing web site that controls the virtual directory", modularizeType: ColumnModularizeType.Column),
283 new ColumnDefinition("Alias", ColumnType.String, 255, primaryKey: false, nullable: false, ColumnCategory.Formatted, description: "Name of virtual directory displayed in IIS MMC applet", modularizeType: ColumnModularizeType.Property),
284 new ColumnDefinition("Directory_", ColumnType.String, 72, primaryKey: false, nullable: false, ColumnCategory.Identifier, keyTable: "Directory", keyColumn: 1, description: "Foreign key referencing directory that the virtual directory points at", modularizeType: ColumnModularizeType.Column),
285 new ColumnDefinition("DirProperties_", ColumnType.String, 72, primaryKey: false, nullable: true, ColumnCategory.Identifier, keyTable: "IIsWebDirProperties", keyColumn: 1, description: "Foreign key referencing possible security information for the virtual directory", modularizeType: ColumnModularizeType.Column),
286 new ColumnDefinition("Application_", ColumnType.String, 72, primaryKey: false, nullable: true, ColumnCategory.Identifier, keyTable: "IIsWebApplication", keyColumn: 1, description: "Foreign key referencing possible ASP application for the virtual directory", modularizeType: ColumnModularizeType.Column),
287 },
288 symbolIdIsPrimaryKey: true
289 );
290
291 public static readonly TableDefinition IIsWebLog = new TableDefinition(
292 "IIsWebLog",
293 IisSymbolDefinitions.IIsWebLog,
294 new[]
295 {
296 new ColumnDefinition("Log", ColumnType.String, 72, primaryKey: true, nullable: false, ColumnCategory.Identifier, description: "Primary key, non-localized token", modularizeType: ColumnModularizeType.Column),
297 new ColumnDefinition("Format", ColumnType.String, 255, primaryKey: false, nullable: false, ColumnCategory.Text, description: "Type of log format"),
298 },
299 symbolIdIsPrimaryKey: true
300 );
301
302 public static readonly TableDefinition[] All = new[]
303 {
304 Certificate,
305 CertificateHash,
306 IIsWebSiteCertificates,
307 IIsAppPool,
308 IIsMimeMap,
309 IIsProperty,
310 IIsWebDirProperties,
311 IIsWebAddress,
312 IIsWebSite,
313 IIsWebApplication,
314 IIsWebApplicationExtension,
315 IIsFilter,
316 IIsWebDir,
317 IIsWebError,
318 IIsHttpHeader,
319 IIsWebServiceExtension,
320 IIsWebVirtualDir,
321 IIsWebLog,
322 };
323 }
324}
diff --git a/src/ext/Iis/wixext/IisWindowsInstallerBackendBinderExtension.cs b/src/ext/Iis/wixext/IisWindowsInstallerBackendBinderExtension.cs
new file mode 100644
index 00000000..a61cbad6
--- /dev/null
+++ b/src/ext/Iis/wixext/IisWindowsInstallerBackendBinderExtension.cs
@@ -0,0 +1,13 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Iis
4{
5 using System.Collections.Generic;
6 using WixToolset.Data.WindowsInstaller;
7 using WixToolset.Extensibility;
8
9 public class IisWindowsInstallerBackendBinderExtension : BaseWindowsInstallerBackendBinderExtension
10 {
11 public override IReadOnlyCollection<TableDefinition> TableDefinitions => IisTableDefinitions.All;
12 }
13}
diff --git a/src/ext/Iis/wixext/Symbols/CertificateHashSymbol.cs b/src/ext/Iis/wixext/Symbols/CertificateHashSymbol.cs
new file mode 100644
index 00000000..866d474c
--- /dev/null
+++ b/src/ext/Iis/wixext/Symbols/CertificateHashSymbol.cs
@@ -0,0 +1,55 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Iis
4{
5 using WixToolset.Data;
6 using WixToolset.Iis.Symbols;
7
8 public static partial class IisSymbolDefinitions
9 {
10 public static readonly IntermediateSymbolDefinition CertificateHash = new IntermediateSymbolDefinition(
11 IisSymbolDefinitionType.CertificateHash.ToString(),
12 new[]
13 {
14 new IntermediateFieldDefinition(nameof(CertificateHashSymbolFields.CertificateRef), IntermediateFieldType.String),
15 new IntermediateFieldDefinition(nameof(CertificateHashSymbolFields.Hash), IntermediateFieldType.String),
16 },
17 typeof(CertificateHashSymbol));
18 }
19}
20
21namespace WixToolset.Iis.Symbols
22{
23 using WixToolset.Data;
24
25 public enum CertificateHashSymbolFields
26 {
27 CertificateRef,
28 Hash,
29 }
30
31 public class CertificateHashSymbol : IntermediateSymbol
32 {
33 public CertificateHashSymbol() : base(IisSymbolDefinitions.CertificateHash, null, null)
34 {
35 }
36
37 public CertificateHashSymbol(SourceLineNumber sourceLineNumber, Identifier id = null) : base(IisSymbolDefinitions.CertificateHash, sourceLineNumber, id)
38 {
39 }
40
41 public IntermediateField this[CertificateHashSymbolFields index] => this.Fields[(int)index];
42
43 public string CertificateRef
44 {
45 get => this.Fields[(int)CertificateHashSymbolFields.CertificateRef].AsString();
46 set => this.Set((int)CertificateHashSymbolFields.CertificateRef, value);
47 }
48
49 public string Hash
50 {
51 get => this.Fields[(int)CertificateHashSymbolFields.Hash].AsString();
52 set => this.Set((int)CertificateHashSymbolFields.Hash, value);
53 }
54 }
55} \ No newline at end of file
diff --git a/src/ext/Iis/wixext/Symbols/CertificateSymbol.cs b/src/ext/Iis/wixext/Symbols/CertificateSymbol.cs
new file mode 100644
index 00000000..b80b6ba4
--- /dev/null
+++ b/src/ext/Iis/wixext/Symbols/CertificateSymbol.cs
@@ -0,0 +1,103 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Iis
4{
5 using WixToolset.Data;
6 using WixToolset.Iis.Symbols;
7
8 public static partial class IisSymbolDefinitions
9 {
10 public static readonly IntermediateSymbolDefinition Certificate = new IntermediateSymbolDefinition(
11 IisSymbolDefinitionType.Certificate.ToString(),
12 new[]
13 {
14 new IntermediateFieldDefinition(nameof(CertificateSymbolFields.ComponentRef), IntermediateFieldType.String),
15 new IntermediateFieldDefinition(nameof(CertificateSymbolFields.Name), IntermediateFieldType.String),
16 new IntermediateFieldDefinition(nameof(CertificateSymbolFields.StoreLocation), IntermediateFieldType.Number),
17 new IntermediateFieldDefinition(nameof(CertificateSymbolFields.StoreName), IntermediateFieldType.String),
18 new IntermediateFieldDefinition(nameof(CertificateSymbolFields.Attributes), IntermediateFieldType.Number),
19 new IntermediateFieldDefinition(nameof(CertificateSymbolFields.BinaryRef), IntermediateFieldType.String),
20 new IntermediateFieldDefinition(nameof(CertificateSymbolFields.CertificatePath), IntermediateFieldType.String),
21 new IntermediateFieldDefinition(nameof(CertificateSymbolFields.PFXPassword), IntermediateFieldType.String),
22 },
23 typeof(CertificateSymbol));
24 }
25}
26
27namespace WixToolset.Iis.Symbols
28{
29 using WixToolset.Data;
30
31 public enum CertificateSymbolFields
32 {
33 ComponentRef,
34 Name,
35 StoreLocation,
36 StoreName,
37 Attributes,
38 BinaryRef,
39 CertificatePath,
40 PFXPassword,
41 }
42
43 public class CertificateSymbol : IntermediateSymbol
44 {
45 public CertificateSymbol() : base(IisSymbolDefinitions.Certificate, null, null)
46 {
47 }
48
49 public CertificateSymbol(SourceLineNumber sourceLineNumber, Identifier id = null) : base(IisSymbolDefinitions.Certificate, sourceLineNumber, id)
50 {
51 }
52
53 public IntermediateField this[CertificateSymbolFields index] => this.Fields[(int)index];
54
55 public string ComponentRef
56 {
57 get => this.Fields[(int)CertificateSymbolFields.ComponentRef].AsString();
58 set => this.Set((int)CertificateSymbolFields.ComponentRef, value);
59 }
60
61 public string Name
62 {
63 get => this.Fields[(int)CertificateSymbolFields.Name].AsString();
64 set => this.Set((int)CertificateSymbolFields.Name, value);
65 }
66
67 public int StoreLocation
68 {
69 get => this.Fields[(int)CertificateSymbolFields.StoreLocation].AsNumber();
70 set => this.Set((int)CertificateSymbolFields.StoreLocation, value);
71 }
72
73 public string StoreName
74 {
75 get => this.Fields[(int)CertificateSymbolFields.StoreName].AsString();
76 set => this.Set((int)CertificateSymbolFields.StoreName, value);
77 }
78
79 public int Attributes
80 {
81 get => this.Fields[(int)CertificateSymbolFields.Attributes].AsNumber();
82 set => this.Set((int)CertificateSymbolFields.Attributes, value);
83 }
84
85 public string BinaryRef
86 {
87 get => this.Fields[(int)CertificateSymbolFields.BinaryRef].AsString();
88 set => this.Set((int)CertificateSymbolFields.BinaryRef, value);
89 }
90
91 public string CertificatePath
92 {
93 get => this.Fields[(int)CertificateSymbolFields.CertificatePath].AsString();
94 set => this.Set((int)CertificateSymbolFields.CertificatePath, value);
95 }
96
97 public string PFXPassword
98 {
99 get => this.Fields[(int)CertificateSymbolFields.PFXPassword].AsString();
100 set => this.Set((int)CertificateSymbolFields.PFXPassword, value);
101 }
102 }
103} \ No newline at end of file
diff --git a/src/ext/Iis/wixext/Symbols/IIsAppPoolSymbol.cs b/src/ext/Iis/wixext/Symbols/IIsAppPoolSymbol.cs
new file mode 100644
index 00000000..a6fab136
--- /dev/null
+++ b/src/ext/Iis/wixext/Symbols/IIsAppPoolSymbol.cs
@@ -0,0 +1,159 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Iis
4{
5 using WixToolset.Data;
6 using WixToolset.Iis.Symbols;
7
8 public static partial class IisSymbolDefinitions
9 {
10 public static readonly IntermediateSymbolDefinition IIsAppPool = new IntermediateSymbolDefinition(
11 IisSymbolDefinitionType.IIsAppPool.ToString(),
12 new[]
13 {
14 new IntermediateFieldDefinition(nameof(IIsAppPoolSymbolFields.Name), IntermediateFieldType.String),
15 new IntermediateFieldDefinition(nameof(IIsAppPoolSymbolFields.ComponentRef), IntermediateFieldType.String),
16 new IntermediateFieldDefinition(nameof(IIsAppPoolSymbolFields.Attributes), IntermediateFieldType.Number),
17 new IntermediateFieldDefinition(nameof(IIsAppPoolSymbolFields.UserRef), IntermediateFieldType.String),
18 new IntermediateFieldDefinition(nameof(IIsAppPoolSymbolFields.RecycleMinutes), IntermediateFieldType.Number),
19 new IntermediateFieldDefinition(nameof(IIsAppPoolSymbolFields.RecycleRequests), IntermediateFieldType.Number),
20 new IntermediateFieldDefinition(nameof(IIsAppPoolSymbolFields.RecycleTimes), IntermediateFieldType.String),
21 new IntermediateFieldDefinition(nameof(IIsAppPoolSymbolFields.IdleTimeout), IntermediateFieldType.Number),
22 new IntermediateFieldDefinition(nameof(IIsAppPoolSymbolFields.QueueLimit), IntermediateFieldType.Number),
23 new IntermediateFieldDefinition(nameof(IIsAppPoolSymbolFields.CPUMon), IntermediateFieldType.String),
24 new IntermediateFieldDefinition(nameof(IIsAppPoolSymbolFields.MaxProc), IntermediateFieldType.Number),
25 new IntermediateFieldDefinition(nameof(IIsAppPoolSymbolFields.VirtualMemory), IntermediateFieldType.Number),
26 new IntermediateFieldDefinition(nameof(IIsAppPoolSymbolFields.PrivateMemory), IntermediateFieldType.Number),
27 new IntermediateFieldDefinition(nameof(IIsAppPoolSymbolFields.ManagedRuntimeVersion), IntermediateFieldType.String),
28 new IntermediateFieldDefinition(nameof(IIsAppPoolSymbolFields.ManagedPipelineMode), IntermediateFieldType.String),
29 },
30 typeof(IIsAppPoolSymbol));
31 }
32}
33
34namespace WixToolset.Iis.Symbols
35{
36 using WixToolset.Data;
37
38 public enum IIsAppPoolSymbolFields
39 {
40 Name,
41 ComponentRef,
42 Attributes,
43 UserRef,
44 RecycleMinutes,
45 RecycleRequests,
46 RecycleTimes,
47 IdleTimeout,
48 QueueLimit,
49 CPUMon,
50 MaxProc,
51 VirtualMemory,
52 PrivateMemory,
53 ManagedRuntimeVersion,
54 ManagedPipelineMode,
55 }
56
57 public class IIsAppPoolSymbol : IntermediateSymbol
58 {
59 public IIsAppPoolSymbol() : base(IisSymbolDefinitions.IIsAppPool, null, null)
60 {
61 }
62
63 public IIsAppPoolSymbol(SourceLineNumber sourceLineNumber, Identifier id = null) : base(IisSymbolDefinitions.IIsAppPool, sourceLineNumber, id)
64 {
65 }
66
67 public IntermediateField this[IIsAppPoolSymbolFields index] => this.Fields[(int)index];
68
69 public string Name
70 {
71 get => this.Fields[(int)IIsAppPoolSymbolFields.Name].AsString();
72 set => this.Set((int)IIsAppPoolSymbolFields.Name, value);
73 }
74
75 public string ComponentRef
76 {
77 get => this.Fields[(int)IIsAppPoolSymbolFields.ComponentRef].AsString();
78 set => this.Set((int)IIsAppPoolSymbolFields.ComponentRef, value);
79 }
80
81 public int Attributes
82 {
83 get => this.Fields[(int)IIsAppPoolSymbolFields.Attributes].AsNumber();
84 set => this.Set((int)IIsAppPoolSymbolFields.Attributes, value);
85 }
86
87 public string UserRef
88 {
89 get => this.Fields[(int)IIsAppPoolSymbolFields.UserRef].AsString();
90 set => this.Set((int)IIsAppPoolSymbolFields.UserRef, value);
91 }
92
93 public int? RecycleMinutes
94 {
95 get => this.Fields[(int)IIsAppPoolSymbolFields.RecycleMinutes].AsNullableNumber();
96 set => this.Set((int)IIsAppPoolSymbolFields.RecycleMinutes, value);
97 }
98
99 public int? RecycleRequests
100 {
101 get => this.Fields[(int)IIsAppPoolSymbolFields.RecycleRequests].AsNullableNumber();
102 set => this.Set((int)IIsAppPoolSymbolFields.RecycleRequests, value);
103 }
104
105 public string RecycleTimes
106 {
107 get => this.Fields[(int)IIsAppPoolSymbolFields.RecycleTimes].AsString();
108 set => this.Set((int)IIsAppPoolSymbolFields.RecycleTimes, value);
109 }
110
111 public int? IdleTimeout
112 {
113 get => this.Fields[(int)IIsAppPoolSymbolFields.IdleTimeout].AsNullableNumber();
114 set => this.Set((int)IIsAppPoolSymbolFields.IdleTimeout, value);
115 }
116
117 public int? QueueLimit
118 {
119 get => this.Fields[(int)IIsAppPoolSymbolFields.QueueLimit].AsNullableNumber();
120 set => this.Set((int)IIsAppPoolSymbolFields.QueueLimit, value);
121 }
122
123 public string CPUMon
124 {
125 get => this.Fields[(int)IIsAppPoolSymbolFields.CPUMon].AsString();
126 set => this.Set((int)IIsAppPoolSymbolFields.CPUMon, value);
127 }
128
129 public int? MaxProc
130 {
131 get => this.Fields[(int)IIsAppPoolSymbolFields.MaxProc].AsNullableNumber();
132 set => this.Set((int)IIsAppPoolSymbolFields.MaxProc, value);
133 }
134
135 public int? VirtualMemory
136 {
137 get => this.Fields[(int)IIsAppPoolSymbolFields.VirtualMemory].AsNullableNumber();
138 set => this.Set((int)IIsAppPoolSymbolFields.VirtualMemory, value);
139 }
140
141 public int? PrivateMemory
142 {
143 get => this.Fields[(int)IIsAppPoolSymbolFields.PrivateMemory].AsNullableNumber();
144 set => this.Set((int)IIsAppPoolSymbolFields.PrivateMemory, value);
145 }
146
147 public string ManagedRuntimeVersion
148 {
149 get => this.Fields[(int)IIsAppPoolSymbolFields.ManagedRuntimeVersion].AsString();
150 set => this.Set((int)IIsAppPoolSymbolFields.ManagedRuntimeVersion, value);
151 }
152
153 public string ManagedPipelineMode
154 {
155 get => this.Fields[(int)IIsAppPoolSymbolFields.ManagedPipelineMode].AsString();
156 set => this.Set((int)IIsAppPoolSymbolFields.ManagedPipelineMode, value);
157 }
158 }
159} \ No newline at end of file
diff --git a/src/ext/Iis/wixext/Symbols/IIsFilterSymbol.cs b/src/ext/Iis/wixext/Symbols/IIsFilterSymbol.cs
new file mode 100644
index 00000000..618730bf
--- /dev/null
+++ b/src/ext/Iis/wixext/Symbols/IIsFilterSymbol.cs
@@ -0,0 +1,95 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Iis
4{
5 using WixToolset.Data;
6 using WixToolset.Iis.Symbols;
7
8 public static partial class IisSymbolDefinitions
9 {
10 public static readonly IntermediateSymbolDefinition IIsFilter = new IntermediateSymbolDefinition(
11 IisSymbolDefinitionType.IIsFilter.ToString(),
12 new[]
13 {
14 new IntermediateFieldDefinition(nameof(IIsFilterSymbolFields.Name), IntermediateFieldType.String),
15 new IntermediateFieldDefinition(nameof(IIsFilterSymbolFields.ComponentRef), IntermediateFieldType.String),
16 new IntermediateFieldDefinition(nameof(IIsFilterSymbolFields.Path), IntermediateFieldType.String),
17 new IntermediateFieldDefinition(nameof(IIsFilterSymbolFields.WebRef), IntermediateFieldType.String),
18 new IntermediateFieldDefinition(nameof(IIsFilterSymbolFields.Description), IntermediateFieldType.String),
19 new IntermediateFieldDefinition(nameof(IIsFilterSymbolFields.Flags), IntermediateFieldType.Number),
20 new IntermediateFieldDefinition(nameof(IIsFilterSymbolFields.LoadOrder), IntermediateFieldType.Number),
21 },
22 typeof(IIsFilterSymbol));
23 }
24}
25
26namespace WixToolset.Iis.Symbols
27{
28 using WixToolset.Data;
29
30 public enum IIsFilterSymbolFields
31 {
32 Name,
33 ComponentRef,
34 Path,
35 WebRef,
36 Description,
37 Flags,
38 LoadOrder,
39 }
40
41 public class IIsFilterSymbol : IntermediateSymbol
42 {
43 public IIsFilterSymbol() : base(IisSymbolDefinitions.IIsFilter, null, null)
44 {
45 }
46
47 public IIsFilterSymbol(SourceLineNumber sourceLineNumber, Identifier id = null) : base(IisSymbolDefinitions.IIsFilter, sourceLineNumber, id)
48 {
49 }
50
51 public IntermediateField this[IIsFilterSymbolFields index] => this.Fields[(int)index];
52
53 public string Name
54 {
55 get => this.Fields[(int)IIsFilterSymbolFields.Name].AsString();
56 set => this.Set((int)IIsFilterSymbolFields.Name, value);
57 }
58
59 public string ComponentRef
60 {
61 get => this.Fields[(int)IIsFilterSymbolFields.ComponentRef].AsString();
62 set => this.Set((int)IIsFilterSymbolFields.ComponentRef, value);
63 }
64
65 public string Path
66 {
67 get => this.Fields[(int)IIsFilterSymbolFields.Path].AsString();
68 set => this.Set((int)IIsFilterSymbolFields.Path, value);
69 }
70
71 public string WebRef
72 {
73 get => this.Fields[(int)IIsFilterSymbolFields.WebRef].AsString();
74 set => this.Set((int)IIsFilterSymbolFields.WebRef, value);
75 }
76
77 public string Description
78 {
79 get => this.Fields[(int)IIsFilterSymbolFields.Description].AsString();
80 set => this.Set((int)IIsFilterSymbolFields.Description, value);
81 }
82
83 public int Flags
84 {
85 get => this.Fields[(int)IIsFilterSymbolFields.Flags].AsNumber();
86 set => this.Set((int)IIsFilterSymbolFields.Flags, value);
87 }
88
89 public int? LoadOrder
90 {
91 get => this.Fields[(int)IIsFilterSymbolFields.LoadOrder].AsNullableNumber();
92 set => this.Set((int)IIsFilterSymbolFields.LoadOrder, value);
93 }
94 }
95} \ No newline at end of file
diff --git a/src/ext/Iis/wixext/Symbols/IIsHttpHeaderSymbol.cs b/src/ext/Iis/wixext/Symbols/IIsHttpHeaderSymbol.cs
new file mode 100644
index 00000000..3ab2bf59
--- /dev/null
+++ b/src/ext/Iis/wixext/Symbols/IIsHttpHeaderSymbol.cs
@@ -0,0 +1,95 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Iis
4{
5 using WixToolset.Data;
6 using WixToolset.Iis.Symbols;
7
8 public static partial class IisSymbolDefinitions
9 {
10 public static readonly IntermediateSymbolDefinition IIsHttpHeader = new IntermediateSymbolDefinition(
11 IisSymbolDefinitionType.IIsHttpHeader.ToString(),
12 new[]
13 {
14 new IntermediateFieldDefinition(nameof(IIsHttpHeaderSymbolFields.HttpHeader), IntermediateFieldType.String),
15 new IntermediateFieldDefinition(nameof(IIsHttpHeaderSymbolFields.ParentType), IntermediateFieldType.Number),
16 new IntermediateFieldDefinition(nameof(IIsHttpHeaderSymbolFields.ParentValue), IntermediateFieldType.String),
17 new IntermediateFieldDefinition(nameof(IIsHttpHeaderSymbolFields.Name), IntermediateFieldType.String),
18 new IntermediateFieldDefinition(nameof(IIsHttpHeaderSymbolFields.Value), IntermediateFieldType.String),
19 new IntermediateFieldDefinition(nameof(IIsHttpHeaderSymbolFields.Attributes), IntermediateFieldType.Number),
20 new IntermediateFieldDefinition(nameof(IIsHttpHeaderSymbolFields.Sequence), IntermediateFieldType.Number),
21 },
22 typeof(IIsHttpHeaderSymbol));
23 }
24}
25
26namespace WixToolset.Iis.Symbols
27{
28 using WixToolset.Data;
29
30 public enum IIsHttpHeaderSymbolFields
31 {
32 HttpHeader,
33 ParentType,
34 ParentValue,
35 Name,
36 Value,
37 Attributes,
38 Sequence,
39 }
40
41 public class IIsHttpHeaderSymbol : IntermediateSymbol
42 {
43 public IIsHttpHeaderSymbol() : base(IisSymbolDefinitions.IIsHttpHeader, null, null)
44 {
45 }
46
47 public IIsHttpHeaderSymbol(SourceLineNumber sourceLineNumber, Identifier id = null) : base(IisSymbolDefinitions.IIsHttpHeader, sourceLineNumber, id)
48 {
49 }
50
51 public IntermediateField this[IIsHttpHeaderSymbolFields index] => this.Fields[(int)index];
52
53 public string HttpHeader
54 {
55 get => this.Fields[(int)IIsHttpHeaderSymbolFields.HttpHeader].AsString();
56 set => this.Set((int)IIsHttpHeaderSymbolFields.HttpHeader, value);
57 }
58
59 public int ParentType
60 {
61 get => this.Fields[(int)IIsHttpHeaderSymbolFields.ParentType].AsNumber();
62 set => this.Set((int)IIsHttpHeaderSymbolFields.ParentType, value);
63 }
64
65 public string ParentValue
66 {
67 get => this.Fields[(int)IIsHttpHeaderSymbolFields.ParentValue].AsString();
68 set => this.Set((int)IIsHttpHeaderSymbolFields.ParentValue, value);
69 }
70
71 public string Name
72 {
73 get => this.Fields[(int)IIsHttpHeaderSymbolFields.Name].AsString();
74 set => this.Set((int)IIsHttpHeaderSymbolFields.Name, value);
75 }
76
77 public string Value
78 {
79 get => this.Fields[(int)IIsHttpHeaderSymbolFields.Value].AsString();
80 set => this.Set((int)IIsHttpHeaderSymbolFields.Value, value);
81 }
82
83 public int Attributes
84 {
85 get => this.Fields[(int)IIsHttpHeaderSymbolFields.Attributes].AsNumber();
86 set => this.Set((int)IIsHttpHeaderSymbolFields.Attributes, value);
87 }
88
89 public int? Sequence
90 {
91 get => this.Fields[(int)IIsHttpHeaderSymbolFields.Sequence].AsNullableNumber();
92 set => this.Set((int)IIsHttpHeaderSymbolFields.Sequence, value);
93 }
94 }
95} \ No newline at end of file
diff --git a/src/ext/Iis/wixext/Symbols/IIsMimeMapSymbol.cs b/src/ext/Iis/wixext/Symbols/IIsMimeMapSymbol.cs
new file mode 100644
index 00000000..4af6f81c
--- /dev/null
+++ b/src/ext/Iis/wixext/Symbols/IIsMimeMapSymbol.cs
@@ -0,0 +1,71 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Iis
4{
5 using WixToolset.Data;
6 using WixToolset.Iis.Symbols;
7
8 public static partial class IisSymbolDefinitions
9 {
10 public static readonly IntermediateSymbolDefinition IIsMimeMap = new IntermediateSymbolDefinition(
11 IisSymbolDefinitionType.IIsMimeMap.ToString(),
12 new[]
13 {
14 new IntermediateFieldDefinition(nameof(IIsMimeMapSymbolFields.ParentType), IntermediateFieldType.Number),
15 new IntermediateFieldDefinition(nameof(IIsMimeMapSymbolFields.ParentValue), IntermediateFieldType.String),
16 new IntermediateFieldDefinition(nameof(IIsMimeMapSymbolFields.MimeType), IntermediateFieldType.String),
17 new IntermediateFieldDefinition(nameof(IIsMimeMapSymbolFields.Extension), IntermediateFieldType.String),
18 },
19 typeof(IIsMimeMapSymbol));
20 }
21}
22
23namespace WixToolset.Iis.Symbols
24{
25 using WixToolset.Data;
26
27 public enum IIsMimeMapSymbolFields
28 {
29 ParentType,
30 ParentValue,
31 MimeType,
32 Extension,
33 }
34
35 public class IIsMimeMapSymbol : IntermediateSymbol
36 {
37 public IIsMimeMapSymbol() : base(IisSymbolDefinitions.IIsMimeMap, null, null)
38 {
39 }
40
41 public IIsMimeMapSymbol(SourceLineNumber sourceLineNumber, Identifier id = null) : base(IisSymbolDefinitions.IIsMimeMap, sourceLineNumber, id)
42 {
43 }
44
45 public IntermediateField this[IIsMimeMapSymbolFields index] => this.Fields[(int)index];
46
47 public int ParentType
48 {
49 get => this.Fields[(int)IIsMimeMapSymbolFields.ParentType].AsNumber();
50 set => this.Set((int)IIsMimeMapSymbolFields.ParentType, value);
51 }
52
53 public string ParentValue
54 {
55 get => this.Fields[(int)IIsMimeMapSymbolFields.ParentValue].AsString();
56 set => this.Set((int)IIsMimeMapSymbolFields.ParentValue, value);
57 }
58
59 public string MimeType
60 {
61 get => this.Fields[(int)IIsMimeMapSymbolFields.MimeType].AsString();
62 set => this.Set((int)IIsMimeMapSymbolFields.MimeType, value);
63 }
64
65 public string Extension
66 {
67 get => this.Fields[(int)IIsMimeMapSymbolFields.Extension].AsString();
68 set => this.Set((int)IIsMimeMapSymbolFields.Extension, value);
69 }
70 }
71} \ No newline at end of file
diff --git a/src/ext/Iis/wixext/Symbols/IIsPropertySymbol.cs b/src/ext/Iis/wixext/Symbols/IIsPropertySymbol.cs
new file mode 100644
index 00000000..9cf67014
--- /dev/null
+++ b/src/ext/Iis/wixext/Symbols/IIsPropertySymbol.cs
@@ -0,0 +1,63 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Iis
4{
5 using WixToolset.Data;
6 using WixToolset.Iis.Symbols;
7
8 public static partial class IisSymbolDefinitions
9 {
10 public static readonly IntermediateSymbolDefinition IIsProperty = new IntermediateSymbolDefinition(
11 IisSymbolDefinitionType.IIsProperty.ToString(),
12 new[]
13 {
14 new IntermediateFieldDefinition(nameof(IIsPropertySymbolFields.ComponentRef), IntermediateFieldType.String),
15 new IntermediateFieldDefinition(nameof(IIsPropertySymbolFields.Attributes), IntermediateFieldType.Number),
16 new IntermediateFieldDefinition(nameof(IIsPropertySymbolFields.Value), IntermediateFieldType.String),
17 },
18 typeof(IIsPropertySymbol));
19 }
20}
21
22namespace WixToolset.Iis.Symbols
23{
24 using WixToolset.Data;
25
26 public enum IIsPropertySymbolFields
27 {
28 ComponentRef,
29 Attributes,
30 Value,
31 }
32
33 public class IIsPropertySymbol : IntermediateSymbol
34 {
35 public IIsPropertySymbol() : base(IisSymbolDefinitions.IIsProperty, null, null)
36 {
37 }
38
39 public IIsPropertySymbol(SourceLineNumber sourceLineNumber, Identifier id = null) : base(IisSymbolDefinitions.IIsProperty, sourceLineNumber, id)
40 {
41 }
42
43 public IntermediateField this[IIsPropertySymbolFields index] => this.Fields[(int)index];
44
45 public string ComponentRef
46 {
47 get => this.Fields[(int)IIsPropertySymbolFields.ComponentRef].AsString();
48 set => this.Set((int)IIsPropertySymbolFields.ComponentRef, value);
49 }
50
51 public int Attributes
52 {
53 get => this.Fields[(int)IIsPropertySymbolFields.Attributes].AsNumber();
54 set => this.Set((int)IIsPropertySymbolFields.Attributes, value);
55 }
56
57 public string Value
58 {
59 get => this.Fields[(int)IIsPropertySymbolFields.Value].AsString();
60 set => this.Set((int)IIsPropertySymbolFields.Value, value);
61 }
62 }
63} \ No newline at end of file
diff --git a/src/ext/Iis/wixext/Symbols/IIsWebAddressSymbol.cs b/src/ext/Iis/wixext/Symbols/IIsWebAddressSymbol.cs
new file mode 100644
index 00000000..7111718a
--- /dev/null
+++ b/src/ext/Iis/wixext/Symbols/IIsWebAddressSymbol.cs
@@ -0,0 +1,79 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Iis
4{
5 using WixToolset.Data;
6 using WixToolset.Iis.Symbols;
7
8 public static partial class IisSymbolDefinitions
9 {
10 public static readonly IntermediateSymbolDefinition IIsWebAddress = new IntermediateSymbolDefinition(
11 IisSymbolDefinitionType.IIsWebAddress.ToString(),
12 new[]
13 {
14 new IntermediateFieldDefinition(nameof(IIsWebAddressSymbolFields.WebRef), IntermediateFieldType.String),
15 new IntermediateFieldDefinition(nameof(IIsWebAddressSymbolFields.IP), IntermediateFieldType.String),
16 new IntermediateFieldDefinition(nameof(IIsWebAddressSymbolFields.Port), IntermediateFieldType.String),
17 new IntermediateFieldDefinition(nameof(IIsWebAddressSymbolFields.Header), IntermediateFieldType.String),
18 new IntermediateFieldDefinition(nameof(IIsWebAddressSymbolFields.Secure), IntermediateFieldType.Number),
19 },
20 typeof(IIsWebAddressSymbol));
21 }
22}
23
24namespace WixToolset.Iis.Symbols
25{
26 using WixToolset.Data;
27
28 public enum IIsWebAddressSymbolFields
29 {
30 WebRef,
31 IP,
32 Port,
33 Header,
34 Secure,
35 }
36
37 public class IIsWebAddressSymbol : IntermediateSymbol
38 {
39 public IIsWebAddressSymbol() : base(IisSymbolDefinitions.IIsWebAddress, null, null)
40 {
41 }
42
43 public IIsWebAddressSymbol(SourceLineNumber sourceLineNumber, Identifier id = null) : base(IisSymbolDefinitions.IIsWebAddress, sourceLineNumber, id)
44 {
45 }
46
47 public IntermediateField this[IIsWebAddressSymbolFields index] => this.Fields[(int)index];
48
49 public string WebRef
50 {
51 get => this.Fields[(int)IIsWebAddressSymbolFields.WebRef].AsString();
52 set => this.Set((int)IIsWebAddressSymbolFields.WebRef, value);
53 }
54
55 public string IP
56 {
57 get => this.Fields[(int)IIsWebAddressSymbolFields.IP].AsString();
58 set => this.Set((int)IIsWebAddressSymbolFields.IP, value);
59 }
60
61 public string Port
62 {
63 get => this.Fields[(int)IIsWebAddressSymbolFields.Port].AsString();
64 set => this.Set((int)IIsWebAddressSymbolFields.Port, value);
65 }
66
67 public string Header
68 {
69 get => this.Fields[(int)IIsWebAddressSymbolFields.Header].AsString();
70 set => this.Set((int)IIsWebAddressSymbolFields.Header, value);
71 }
72
73 public int? Secure
74 {
75 get => this.Fields[(int)IIsWebAddressSymbolFields.Secure].AsNullableNumber();
76 set => this.Set((int)IIsWebAddressSymbolFields.Secure, value);
77 }
78 }
79} \ No newline at end of file
diff --git a/src/ext/Iis/wixext/Symbols/IIsWebApplicationExtensionSymbol.cs b/src/ext/Iis/wixext/Symbols/IIsWebApplicationExtensionSymbol.cs
new file mode 100644
index 00000000..4283d702
--- /dev/null
+++ b/src/ext/Iis/wixext/Symbols/IIsWebApplicationExtensionSymbol.cs
@@ -0,0 +1,79 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Iis
4{
5 using WixToolset.Data;
6 using WixToolset.Iis.Symbols;
7
8 public static partial class IisSymbolDefinitions
9 {
10 public static readonly IntermediateSymbolDefinition IIsWebApplicationExtension = new IntermediateSymbolDefinition(
11 IisSymbolDefinitionType.IIsWebApplicationExtension.ToString(),
12 new[]
13 {
14 new IntermediateFieldDefinition(nameof(IIsWebApplicationExtensionSymbolFields.ApplicationRef), IntermediateFieldType.String),
15 new IntermediateFieldDefinition(nameof(IIsWebApplicationExtensionSymbolFields.Extension), IntermediateFieldType.String),
16 new IntermediateFieldDefinition(nameof(IIsWebApplicationExtensionSymbolFields.Verbs), IntermediateFieldType.String),
17 new IntermediateFieldDefinition(nameof(IIsWebApplicationExtensionSymbolFields.Executable), IntermediateFieldType.String),
18 new IntermediateFieldDefinition(nameof(IIsWebApplicationExtensionSymbolFields.Attributes), IntermediateFieldType.Number),
19 },
20 typeof(IIsWebApplicationExtensionSymbol));
21 }
22}
23
24namespace WixToolset.Iis.Symbols
25{
26 using WixToolset.Data;
27
28 public enum IIsWebApplicationExtensionSymbolFields
29 {
30 ApplicationRef,
31 Extension,
32 Verbs,
33 Executable,
34 Attributes,
35 }
36
37 public class IIsWebApplicationExtensionSymbol : IntermediateSymbol
38 {
39 public IIsWebApplicationExtensionSymbol() : base(IisSymbolDefinitions.IIsWebApplicationExtension, null, null)
40 {
41 }
42
43 public IIsWebApplicationExtensionSymbol(SourceLineNumber sourceLineNumber, Identifier id = null) : base(IisSymbolDefinitions.IIsWebApplicationExtension, sourceLineNumber, id)
44 {
45 }
46
47 public IntermediateField this[IIsWebApplicationExtensionSymbolFields index] => this.Fields[(int)index];
48
49 public string ApplicationRef
50 {
51 get => this.Fields[(int)IIsWebApplicationExtensionSymbolFields.ApplicationRef].AsString();
52 set => this.Set((int)IIsWebApplicationExtensionSymbolFields.ApplicationRef, value);
53 }
54
55 public string Extension
56 {
57 get => this.Fields[(int)IIsWebApplicationExtensionSymbolFields.Extension].AsString();
58 set => this.Set((int)IIsWebApplicationExtensionSymbolFields.Extension, value);
59 }
60
61 public string Verbs
62 {
63 get => this.Fields[(int)IIsWebApplicationExtensionSymbolFields.Verbs].AsString();
64 set => this.Set((int)IIsWebApplicationExtensionSymbolFields.Verbs, value);
65 }
66
67 public string Executable
68 {
69 get => this.Fields[(int)IIsWebApplicationExtensionSymbolFields.Executable].AsString();
70 set => this.Set((int)IIsWebApplicationExtensionSymbolFields.Executable, value);
71 }
72
73 public int Attributes
74 {
75 get => this.Fields[(int)IIsWebApplicationExtensionSymbolFields.Attributes].AsNumber();
76 set => this.Set((int)IIsWebApplicationExtensionSymbolFields.Attributes, value);
77 }
78 }
79} \ No newline at end of file
diff --git a/src/ext/Iis/wixext/Symbols/IIsWebApplicationSymbol.cs b/src/ext/Iis/wixext/Symbols/IIsWebApplicationSymbol.cs
new file mode 100644
index 00000000..2f6f87de
--- /dev/null
+++ b/src/ext/Iis/wixext/Symbols/IIsWebApplicationSymbol.cs
@@ -0,0 +1,127 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Iis
4{
5 using WixToolset.Data;
6 using WixToolset.Iis.Symbols;
7
8 public static partial class IisSymbolDefinitions
9 {
10 public static readonly IntermediateSymbolDefinition IIsWebApplication = new IntermediateSymbolDefinition(
11 IisSymbolDefinitionType.IIsWebApplication.ToString(),
12 new[]
13 {
14 new IntermediateFieldDefinition(nameof(IIsWebApplicationSymbolFields.Name), IntermediateFieldType.String),
15 new IntermediateFieldDefinition(nameof(IIsWebApplicationSymbolFields.Isolation), IntermediateFieldType.Number),
16 new IntermediateFieldDefinition(nameof(IIsWebApplicationSymbolFields.AllowSessions), IntermediateFieldType.Number),
17 new IntermediateFieldDefinition(nameof(IIsWebApplicationSymbolFields.SessionTimeout), IntermediateFieldType.Number),
18 new IntermediateFieldDefinition(nameof(IIsWebApplicationSymbolFields.Buffer), IntermediateFieldType.Number),
19 new IntermediateFieldDefinition(nameof(IIsWebApplicationSymbolFields.ParentPaths), IntermediateFieldType.Number),
20 new IntermediateFieldDefinition(nameof(IIsWebApplicationSymbolFields.DefaultScript), IntermediateFieldType.String),
21 new IntermediateFieldDefinition(nameof(IIsWebApplicationSymbolFields.ScriptTimeout), IntermediateFieldType.Number),
22 new IntermediateFieldDefinition(nameof(IIsWebApplicationSymbolFields.ServerDebugging), IntermediateFieldType.Number),
23 new IntermediateFieldDefinition(nameof(IIsWebApplicationSymbolFields.ClientDebugging), IntermediateFieldType.Number),
24 new IntermediateFieldDefinition(nameof(IIsWebApplicationSymbolFields.AppPoolRef), IntermediateFieldType.String),
25 },
26 typeof(IIsWebApplicationSymbol));
27 }
28}
29
30namespace WixToolset.Iis.Symbols
31{
32 using WixToolset.Data;
33
34 public enum IIsWebApplicationSymbolFields
35 {
36 Name,
37 Isolation,
38 AllowSessions,
39 SessionTimeout,
40 Buffer,
41 ParentPaths,
42 DefaultScript,
43 ScriptTimeout,
44 ServerDebugging,
45 ClientDebugging,
46 AppPoolRef,
47 }
48
49 public class IIsWebApplicationSymbol : IntermediateSymbol
50 {
51 public IIsWebApplicationSymbol() : base(IisSymbolDefinitions.IIsWebApplication, null, null)
52 {
53 }
54
55 public IIsWebApplicationSymbol(SourceLineNumber sourceLineNumber, Identifier id = null) : base(IisSymbolDefinitions.IIsWebApplication, sourceLineNumber, id)
56 {
57 }
58
59 public IntermediateField this[IIsWebApplicationSymbolFields index] => this.Fields[(int)index];
60
61 public string Name
62 {
63 get => this.Fields[(int)IIsWebApplicationSymbolFields.Name].AsString();
64 set => this.Set((int)IIsWebApplicationSymbolFields.Name, value);
65 }
66
67 public int Isolation
68 {
69 get => this.Fields[(int)IIsWebApplicationSymbolFields.Isolation].AsNumber();
70 set => this.Set((int)IIsWebApplicationSymbolFields.Isolation, value);
71 }
72
73 public int? AllowSessions
74 {
75 get => this.Fields[(int)IIsWebApplicationSymbolFields.AllowSessions].AsNullableNumber();
76 set => this.Set((int)IIsWebApplicationSymbolFields.AllowSessions, value);
77 }
78
79 public int? SessionTimeout
80 {
81 get => this.Fields[(int)IIsWebApplicationSymbolFields.SessionTimeout].AsNullableNumber();
82 set => this.Set((int)IIsWebApplicationSymbolFields.SessionTimeout, value);
83 }
84
85 public int? Buffer
86 {
87 get => this.Fields[(int)IIsWebApplicationSymbolFields.Buffer].AsNullableNumber();
88 set => this.Set((int)IIsWebApplicationSymbolFields.Buffer, value);
89 }
90
91 public int? ParentPaths
92 {
93 get => this.Fields[(int)IIsWebApplicationSymbolFields.ParentPaths].AsNullableNumber();
94 set => this.Set((int)IIsWebApplicationSymbolFields.ParentPaths, value);
95 }
96
97 public string DefaultScript
98 {
99 get => this.Fields[(int)IIsWebApplicationSymbolFields.DefaultScript].AsString();
100 set => this.Set((int)IIsWebApplicationSymbolFields.DefaultScript, value);
101 }
102
103 public int? ScriptTimeout
104 {
105 get => this.Fields[(int)IIsWebApplicationSymbolFields.ScriptTimeout].AsNullableNumber();
106 set => this.Set((int)IIsWebApplicationSymbolFields.ScriptTimeout, value);
107 }
108
109 public int? ServerDebugging
110 {
111 get => this.Fields[(int)IIsWebApplicationSymbolFields.ServerDebugging].AsNullableNumber();
112 set => this.Set((int)IIsWebApplicationSymbolFields.ServerDebugging, value);
113 }
114
115 public int? ClientDebugging
116 {
117 get => this.Fields[(int)IIsWebApplicationSymbolFields.ClientDebugging].AsNullableNumber();
118 set => this.Set((int)IIsWebApplicationSymbolFields.ClientDebugging, value);
119 }
120
121 public string AppPoolRef
122 {
123 get => this.Fields[(int)IIsWebApplicationSymbolFields.AppPoolRef].AsString();
124 set => this.Set((int)IIsWebApplicationSymbolFields.AppPoolRef, value);
125 }
126 }
127} \ No newline at end of file
diff --git a/src/ext/Iis/wixext/Symbols/IIsWebDirPropertiesSymbol.cs b/src/ext/Iis/wixext/Symbols/IIsWebDirPropertiesSymbol.cs
new file mode 100644
index 00000000..42d2dead
--- /dev/null
+++ b/src/ext/Iis/wixext/Symbols/IIsWebDirPropertiesSymbol.cs
@@ -0,0 +1,151 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Iis
4{
5 using WixToolset.Data;
6 using WixToolset.Iis.Symbols;
7
8 public static partial class IisSymbolDefinitions
9 {
10 public static readonly IntermediateSymbolDefinition IIsWebDirProperties = new IntermediateSymbolDefinition(
11 IisSymbolDefinitionType.IIsWebDirProperties.ToString(),
12 new[]
13 {
14 new IntermediateFieldDefinition(nameof(IIsWebDirPropertiesSymbolFields.Access), IntermediateFieldType.Number),
15 new IntermediateFieldDefinition(nameof(IIsWebDirPropertiesSymbolFields.Authorization), IntermediateFieldType.Number),
16 new IntermediateFieldDefinition(nameof(IIsWebDirPropertiesSymbolFields.AnonymousUserRef), IntermediateFieldType.String),
17 new IntermediateFieldDefinition(nameof(IIsWebDirPropertiesSymbolFields.IIsControlledPassword), IntermediateFieldType.Number),
18 new IntermediateFieldDefinition(nameof(IIsWebDirPropertiesSymbolFields.LogVisits), IntermediateFieldType.Number),
19 new IntermediateFieldDefinition(nameof(IIsWebDirPropertiesSymbolFields.Index), IntermediateFieldType.Number),
20 new IntermediateFieldDefinition(nameof(IIsWebDirPropertiesSymbolFields.DefaultDoc), IntermediateFieldType.String),
21 new IntermediateFieldDefinition(nameof(IIsWebDirPropertiesSymbolFields.AspDetailedError), IntermediateFieldType.Number),
22 new IntermediateFieldDefinition(nameof(IIsWebDirPropertiesSymbolFields.HttpExpires), IntermediateFieldType.String),
23 new IntermediateFieldDefinition(nameof(IIsWebDirPropertiesSymbolFields.CacheControlMaxAge), IntermediateFieldType.Number),
24 new IntermediateFieldDefinition(nameof(IIsWebDirPropertiesSymbolFields.CacheControlCustom), IntermediateFieldType.String),
25 new IntermediateFieldDefinition(nameof(IIsWebDirPropertiesSymbolFields.NoCustomError), IntermediateFieldType.Number),
26 new IntermediateFieldDefinition(nameof(IIsWebDirPropertiesSymbolFields.AccessSSLFlags), IntermediateFieldType.Number),
27 new IntermediateFieldDefinition(nameof(IIsWebDirPropertiesSymbolFields.AuthenticationProviders), IntermediateFieldType.String),
28 },
29 typeof(IIsWebDirPropertiesSymbol));
30 }
31}
32
33namespace WixToolset.Iis.Symbols
34{
35 using WixToolset.Data;
36
37 public enum IIsWebDirPropertiesSymbolFields
38 {
39 Access,
40 Authorization,
41 AnonymousUserRef,
42 IIsControlledPassword,
43 LogVisits,
44 Index,
45 DefaultDoc,
46 AspDetailedError,
47 HttpExpires,
48 CacheControlMaxAge,
49 CacheControlCustom,
50 NoCustomError,
51 AccessSSLFlags,
52 AuthenticationProviders,
53 }
54
55 public class IIsWebDirPropertiesSymbol : IntermediateSymbol
56 {
57 public IIsWebDirPropertiesSymbol() : base(IisSymbolDefinitions.IIsWebDirProperties, null, null)
58 {
59 }
60
61 public IIsWebDirPropertiesSymbol(SourceLineNumber sourceLineNumber, Identifier id = null) : base(IisSymbolDefinitions.IIsWebDirProperties, sourceLineNumber, id)
62 {
63 }
64
65 public IntermediateField this[IIsWebDirPropertiesSymbolFields index] => this.Fields[(int)index];
66
67 public int? Access
68 {
69 get => this.Fields[(int)IIsWebDirPropertiesSymbolFields.Access].AsNullableNumber();
70 set => this.Set((int)IIsWebDirPropertiesSymbolFields.Access, value);
71 }
72
73 public int? Authorization
74 {
75 get => this.Fields[(int)IIsWebDirPropertiesSymbolFields.Authorization].AsNullableNumber();
76 set => this.Set((int)IIsWebDirPropertiesSymbolFields.Authorization, value);
77 }
78
79 public string AnonymousUserRef
80 {
81 get => this.Fields[(int)IIsWebDirPropertiesSymbolFields.AnonymousUserRef].AsString();
82 set => this.Set((int)IIsWebDirPropertiesSymbolFields.AnonymousUserRef, value);
83 }
84
85 public int? IIsControlledPassword
86 {
87 get => this.Fields[(int)IIsWebDirPropertiesSymbolFields.IIsControlledPassword].AsNullableNumber();
88 set => this.Set((int)IIsWebDirPropertiesSymbolFields.IIsControlledPassword, value);
89 }
90
91 public int? LogVisits
92 {
93 get => this.Fields[(int)IIsWebDirPropertiesSymbolFields.LogVisits].AsNullableNumber();
94 set => this.Set((int)IIsWebDirPropertiesSymbolFields.LogVisits, value);
95 }
96
97 public int? Index
98 {
99 get => this.Fields[(int)IIsWebDirPropertiesSymbolFields.Index].AsNullableNumber();
100 set => this.Set((int)IIsWebDirPropertiesSymbolFields.Index, value);
101 }
102
103 public string DefaultDoc
104 {
105 get => this.Fields[(int)IIsWebDirPropertiesSymbolFields.DefaultDoc].AsString();
106 set => this.Set((int)IIsWebDirPropertiesSymbolFields.DefaultDoc, value);
107 }
108
109 public int? AspDetailedError
110 {
111 get => this.Fields[(int)IIsWebDirPropertiesSymbolFields.AspDetailedError].AsNullableNumber();
112 set => this.Set((int)IIsWebDirPropertiesSymbolFields.AspDetailedError, value);
113 }
114
115 public string HttpExpires
116 {
117 get => this.Fields[(int)IIsWebDirPropertiesSymbolFields.HttpExpires].AsString();
118 set => this.Set((int)IIsWebDirPropertiesSymbolFields.HttpExpires, value);
119 }
120
121 public int? CacheControlMaxAge
122 {
123 get => this.Fields[(int)IIsWebDirPropertiesSymbolFields.CacheControlMaxAge].AsNullableNumber();
124 set => this.Set((int)IIsWebDirPropertiesSymbolFields.CacheControlMaxAge, value);
125 }
126
127 public string CacheControlCustom
128 {
129 get => this.Fields[(int)IIsWebDirPropertiesSymbolFields.CacheControlCustom].AsString();
130 set => this.Set((int)IIsWebDirPropertiesSymbolFields.CacheControlCustom, value);
131 }
132
133 public int? NoCustomError
134 {
135 get => this.Fields[(int)IIsWebDirPropertiesSymbolFields.NoCustomError].AsNullableNumber();
136 set => this.Set((int)IIsWebDirPropertiesSymbolFields.NoCustomError, value);
137 }
138
139 public int? AccessSSLFlags
140 {
141 get => this.Fields[(int)IIsWebDirPropertiesSymbolFields.AccessSSLFlags].AsNullableNumber();
142 set => this.Set((int)IIsWebDirPropertiesSymbolFields.AccessSSLFlags, value);
143 }
144
145 public string AuthenticationProviders
146 {
147 get => this.Fields[(int)IIsWebDirPropertiesSymbolFields.AuthenticationProviders].AsString();
148 set => this.Set((int)IIsWebDirPropertiesSymbolFields.AuthenticationProviders, value);
149 }
150 }
151} \ No newline at end of file
diff --git a/src/ext/Iis/wixext/Symbols/IIsWebDirSymbol.cs b/src/ext/Iis/wixext/Symbols/IIsWebDirSymbol.cs
new file mode 100644
index 00000000..7f257f14
--- /dev/null
+++ b/src/ext/Iis/wixext/Symbols/IIsWebDirSymbol.cs
@@ -0,0 +1,79 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Iis
4{
5 using WixToolset.Data;
6 using WixToolset.Iis.Symbols;
7
8 public static partial class IisSymbolDefinitions
9 {
10 public static readonly IntermediateSymbolDefinition IIsWebDir = new IntermediateSymbolDefinition(
11 IisSymbolDefinitionType.IIsWebDir.ToString(),
12 new[]
13 {
14 new IntermediateFieldDefinition(nameof(IIsWebDirSymbolFields.ComponentRef), IntermediateFieldType.String),
15 new IntermediateFieldDefinition(nameof(IIsWebDirSymbolFields.WebRef), IntermediateFieldType.String),
16 new IntermediateFieldDefinition(nameof(IIsWebDirSymbolFields.Path), IntermediateFieldType.String),
17 new IntermediateFieldDefinition(nameof(IIsWebDirSymbolFields.DirPropertiesRef), IntermediateFieldType.String),
18 new IntermediateFieldDefinition(nameof(IIsWebDirSymbolFields.ApplicationRef), IntermediateFieldType.String),
19 },
20 typeof(IIsWebDirSymbol));
21 }
22}
23
24namespace WixToolset.Iis.Symbols
25{
26 using WixToolset.Data;
27
28 public enum IIsWebDirSymbolFields
29 {
30 ComponentRef,
31 WebRef,
32 Path,
33 DirPropertiesRef,
34 ApplicationRef,
35 }
36
37 public class IIsWebDirSymbol : IntermediateSymbol
38 {
39 public IIsWebDirSymbol() : base(IisSymbolDefinitions.IIsWebDir, null, null)
40 {
41 }
42
43 public IIsWebDirSymbol(SourceLineNumber sourceLineNumber, Identifier id = null) : base(IisSymbolDefinitions.IIsWebDir, sourceLineNumber, id)
44 {
45 }
46
47 public IntermediateField this[IIsWebDirSymbolFields index] => this.Fields[(int)index];
48
49 public string ComponentRef
50 {
51 get => this.Fields[(int)IIsWebDirSymbolFields.ComponentRef].AsString();
52 set => this.Set((int)IIsWebDirSymbolFields.ComponentRef, value);
53 }
54
55 public string WebRef
56 {
57 get => this.Fields[(int)IIsWebDirSymbolFields.WebRef].AsString();
58 set => this.Set((int)IIsWebDirSymbolFields.WebRef, value);
59 }
60
61 public string Path
62 {
63 get => this.Fields[(int)IIsWebDirSymbolFields.Path].AsString();
64 set => this.Set((int)IIsWebDirSymbolFields.Path, value);
65 }
66
67 public string DirPropertiesRef
68 {
69 get => this.Fields[(int)IIsWebDirSymbolFields.DirPropertiesRef].AsString();
70 set => this.Set((int)IIsWebDirSymbolFields.DirPropertiesRef, value);
71 }
72
73 public string ApplicationRef
74 {
75 get => this.Fields[(int)IIsWebDirSymbolFields.ApplicationRef].AsString();
76 set => this.Set((int)IIsWebDirSymbolFields.ApplicationRef, value);
77 }
78 }
79} \ No newline at end of file
diff --git a/src/ext/Iis/wixext/Symbols/IIsWebErrorSymbol.cs b/src/ext/Iis/wixext/Symbols/IIsWebErrorSymbol.cs
new file mode 100644
index 00000000..f8488fed
--- /dev/null
+++ b/src/ext/Iis/wixext/Symbols/IIsWebErrorSymbol.cs
@@ -0,0 +1,87 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Iis
4{
5 using WixToolset.Data;
6 using WixToolset.Iis.Symbols;
7
8 public static partial class IisSymbolDefinitions
9 {
10 public static readonly IntermediateSymbolDefinition IIsWebError = new IntermediateSymbolDefinition(
11 IisSymbolDefinitionType.IIsWebError.ToString(),
12 new[]
13 {
14 new IntermediateFieldDefinition(nameof(IIsWebErrorSymbolFields.ErrorCode), IntermediateFieldType.Number),
15 new IntermediateFieldDefinition(nameof(IIsWebErrorSymbolFields.SubCode), IntermediateFieldType.Number),
16 new IntermediateFieldDefinition(nameof(IIsWebErrorSymbolFields.ParentType), IntermediateFieldType.Number),
17 new IntermediateFieldDefinition(nameof(IIsWebErrorSymbolFields.ParentValue), IntermediateFieldType.String),
18 new IntermediateFieldDefinition(nameof(IIsWebErrorSymbolFields.File), IntermediateFieldType.String),
19 new IntermediateFieldDefinition(nameof(IIsWebErrorSymbolFields.URL), IntermediateFieldType.String),
20 },
21 typeof(IIsWebErrorSymbol));
22 }
23}
24
25namespace WixToolset.Iis.Symbols
26{
27 using WixToolset.Data;
28
29 public enum IIsWebErrorSymbolFields
30 {
31 ErrorCode,
32 SubCode,
33 ParentType,
34 ParentValue,
35 File,
36 URL,
37 }
38
39 public class IIsWebErrorSymbol : IntermediateSymbol
40 {
41 public IIsWebErrorSymbol() : base(IisSymbolDefinitions.IIsWebError, null, null)
42 {
43 }
44
45 public IIsWebErrorSymbol(SourceLineNumber sourceLineNumber, Identifier id = null) : base(IisSymbolDefinitions.IIsWebError, sourceLineNumber, id)
46 {
47 }
48
49 public IntermediateField this[IIsWebErrorSymbolFields index] => this.Fields[(int)index];
50
51 public int ErrorCode
52 {
53 get => this.Fields[(int)IIsWebErrorSymbolFields.ErrorCode].AsNumber();
54 set => this.Set((int)IIsWebErrorSymbolFields.ErrorCode, value);
55 }
56
57 public int SubCode
58 {
59 get => this.Fields[(int)IIsWebErrorSymbolFields.SubCode].AsNumber();
60 set => this.Set((int)IIsWebErrorSymbolFields.SubCode, value);
61 }
62
63 public int ParentType
64 {
65 get => this.Fields[(int)IIsWebErrorSymbolFields.ParentType].AsNumber();
66 set => this.Set((int)IIsWebErrorSymbolFields.ParentType, value);
67 }
68
69 public string ParentValue
70 {
71 get => this.Fields[(int)IIsWebErrorSymbolFields.ParentValue].AsString();
72 set => this.Set((int)IIsWebErrorSymbolFields.ParentValue, value);
73 }
74
75 public string File
76 {
77 get => this.Fields[(int)IIsWebErrorSymbolFields.File].AsString();
78 set => this.Set((int)IIsWebErrorSymbolFields.File, value);
79 }
80
81 public string URL
82 {
83 get => this.Fields[(int)IIsWebErrorSymbolFields.URL].AsString();
84 set => this.Set((int)IIsWebErrorSymbolFields.URL, value);
85 }
86 }
87} \ No newline at end of file
diff --git a/src/ext/Iis/wixext/Symbols/IIsWebLogSymbol.cs b/src/ext/Iis/wixext/Symbols/IIsWebLogSymbol.cs
new file mode 100644
index 00000000..409dc673
--- /dev/null
+++ b/src/ext/Iis/wixext/Symbols/IIsWebLogSymbol.cs
@@ -0,0 +1,47 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Iis
4{
5 using WixToolset.Data;
6 using WixToolset.Iis.Symbols;
7
8 public static partial class IisSymbolDefinitions
9 {
10 public static readonly IntermediateSymbolDefinition IIsWebLog = new IntermediateSymbolDefinition(
11 IisSymbolDefinitionType.IIsWebLog.ToString(),
12 new[]
13 {
14 new IntermediateFieldDefinition(nameof(IIsWebLogSymbolFields.Format), IntermediateFieldType.String),
15 },
16 typeof(IIsWebLogSymbol));
17 }
18}
19
20namespace WixToolset.Iis.Symbols
21{
22 using WixToolset.Data;
23
24 public enum IIsWebLogSymbolFields
25 {
26 Format,
27 }
28
29 public class IIsWebLogSymbol : IntermediateSymbol
30 {
31 public IIsWebLogSymbol() : base(IisSymbolDefinitions.IIsWebLog, null, null)
32 {
33 }
34
35 public IIsWebLogSymbol(SourceLineNumber sourceLineNumber, Identifier id = null) : base(IisSymbolDefinitions.IIsWebLog, sourceLineNumber, id)
36 {
37 }
38
39 public IntermediateField this[IIsWebLogSymbolFields index] => this.Fields[(int)index];
40
41 public string Format
42 {
43 get => this.Fields[(int)IIsWebLogSymbolFields.Format].AsString();
44 set => this.Set((int)IIsWebLogSymbolFields.Format, value);
45 }
46 }
47} \ No newline at end of file
diff --git a/src/ext/Iis/wixext/Symbols/IIsWebServiceExtensionSymbol.cs b/src/ext/Iis/wixext/Symbols/IIsWebServiceExtensionSymbol.cs
new file mode 100644
index 00000000..44922357
--- /dev/null
+++ b/src/ext/Iis/wixext/Symbols/IIsWebServiceExtensionSymbol.cs
@@ -0,0 +1,79 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Iis
4{
5 using WixToolset.Data;
6 using WixToolset.Iis.Symbols;
7
8 public static partial class IisSymbolDefinitions
9 {
10 public static readonly IntermediateSymbolDefinition IIsWebServiceExtension = new IntermediateSymbolDefinition(
11 IisSymbolDefinitionType.IIsWebServiceExtension.ToString(),
12 new[]
13 {
14 new IntermediateFieldDefinition(nameof(IIsWebServiceExtensionSymbolFields.ComponentRef), IntermediateFieldType.String),
15 new IntermediateFieldDefinition(nameof(IIsWebServiceExtensionSymbolFields.File), IntermediateFieldType.String),
16 new IntermediateFieldDefinition(nameof(IIsWebServiceExtensionSymbolFields.Description), IntermediateFieldType.String),
17 new IntermediateFieldDefinition(nameof(IIsWebServiceExtensionSymbolFields.Group), IntermediateFieldType.String),
18 new IntermediateFieldDefinition(nameof(IIsWebServiceExtensionSymbolFields.Attributes), IntermediateFieldType.Number),
19 },
20 typeof(IIsWebServiceExtensionSymbol));
21 }
22}
23
24namespace WixToolset.Iis.Symbols
25{
26 using WixToolset.Data;
27
28 public enum IIsWebServiceExtensionSymbolFields
29 {
30 ComponentRef,
31 File,
32 Description,
33 Group,
34 Attributes,
35 }
36
37 public class IIsWebServiceExtensionSymbol : IntermediateSymbol
38 {
39 public IIsWebServiceExtensionSymbol() : base(IisSymbolDefinitions.IIsWebServiceExtension, null, null)
40 {
41 }
42
43 public IIsWebServiceExtensionSymbol(SourceLineNumber sourceLineNumber, Identifier id = null) : base(IisSymbolDefinitions.IIsWebServiceExtension, sourceLineNumber, id)
44 {
45 }
46
47 public IntermediateField this[IIsWebServiceExtensionSymbolFields index] => this.Fields[(int)index];
48
49 public string ComponentRef
50 {
51 get => this.Fields[(int)IIsWebServiceExtensionSymbolFields.ComponentRef].AsString();
52 set => this.Set((int)IIsWebServiceExtensionSymbolFields.ComponentRef, value);
53 }
54
55 public string File
56 {
57 get => this.Fields[(int)IIsWebServiceExtensionSymbolFields.File].AsString();
58 set => this.Set((int)IIsWebServiceExtensionSymbolFields.File, value);
59 }
60
61 public string Description
62 {
63 get => this.Fields[(int)IIsWebServiceExtensionSymbolFields.Description].AsString();
64 set => this.Set((int)IIsWebServiceExtensionSymbolFields.Description, value);
65 }
66
67 public string Group
68 {
69 get => this.Fields[(int)IIsWebServiceExtensionSymbolFields.Group].AsString();
70 set => this.Set((int)IIsWebServiceExtensionSymbolFields.Group, value);
71 }
72
73 public int Attributes
74 {
75 get => this.Fields[(int)IIsWebServiceExtensionSymbolFields.Attributes].AsNumber();
76 set => this.Set((int)IIsWebServiceExtensionSymbolFields.Attributes, value);
77 }
78 }
79} \ No newline at end of file
diff --git a/src/ext/Iis/wixext/Symbols/IIsWebSiteCertificatesSymbol.cs b/src/ext/Iis/wixext/Symbols/IIsWebSiteCertificatesSymbol.cs
new file mode 100644
index 00000000..851ce556
--- /dev/null
+++ b/src/ext/Iis/wixext/Symbols/IIsWebSiteCertificatesSymbol.cs
@@ -0,0 +1,55 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Iis
4{
5 using WixToolset.Data;
6 using WixToolset.Iis.Symbols;
7
8 public static partial class IisSymbolDefinitions
9 {
10 public static readonly IntermediateSymbolDefinition IIsWebSiteCertificates = new IntermediateSymbolDefinition(
11 IisSymbolDefinitionType.IIsWebSiteCertificates.ToString(),
12 new[]
13 {
14 new IntermediateFieldDefinition(nameof(IIsWebSiteCertificatesSymbolFields.WebRef), IntermediateFieldType.String),
15 new IntermediateFieldDefinition(nameof(IIsWebSiteCertificatesSymbolFields.CertificateRef), IntermediateFieldType.String),
16 },
17 typeof(IIsWebSiteCertificatesSymbol));
18 }
19}
20
21namespace WixToolset.Iis.Symbols
22{
23 using WixToolset.Data;
24
25 public enum IIsWebSiteCertificatesSymbolFields
26 {
27 WebRef,
28 CertificateRef,
29 }
30
31 public class IIsWebSiteCertificatesSymbol : IntermediateSymbol
32 {
33 public IIsWebSiteCertificatesSymbol() : base(IisSymbolDefinitions.IIsWebSiteCertificates, null, null)
34 {
35 }
36
37 public IIsWebSiteCertificatesSymbol(SourceLineNumber sourceLineNumber, Identifier id = null) : base(IisSymbolDefinitions.IIsWebSiteCertificates, sourceLineNumber, id)
38 {
39 }
40
41 public IntermediateField this[IIsWebSiteCertificatesSymbolFields index] => this.Fields[(int)index];
42
43 public string WebRef
44 {
45 get => this.Fields[(int)IIsWebSiteCertificatesSymbolFields.WebRef].AsString();
46 set => this.Set((int)IIsWebSiteCertificatesSymbolFields.WebRef, value);
47 }
48
49 public string CertificateRef
50 {
51 get => this.Fields[(int)IIsWebSiteCertificatesSymbolFields.CertificateRef].AsString();
52 set => this.Set((int)IIsWebSiteCertificatesSymbolFields.CertificateRef, value);
53 }
54 }
55} \ No newline at end of file
diff --git a/src/ext/Iis/wixext/Symbols/IIsWebSiteSymbol.cs b/src/ext/Iis/wixext/Symbols/IIsWebSiteSymbol.cs
new file mode 100644
index 00000000..ceba2ea0
--- /dev/null
+++ b/src/ext/Iis/wixext/Symbols/IIsWebSiteSymbol.cs
@@ -0,0 +1,135 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Iis
4{
5 using WixToolset.Data;
6 using WixToolset.Iis.Symbols;
7
8 public static partial class IisSymbolDefinitions
9 {
10 public static readonly IntermediateSymbolDefinition IIsWebSite = new IntermediateSymbolDefinition(
11 IisSymbolDefinitionType.IIsWebSite.ToString(),
12 new[]
13 {
14 new IntermediateFieldDefinition(nameof(IIsWebSiteSymbolFields.ComponentRef), IntermediateFieldType.String),
15 new IntermediateFieldDefinition(nameof(IIsWebSiteSymbolFields.Description), IntermediateFieldType.String),
16 new IntermediateFieldDefinition(nameof(IIsWebSiteSymbolFields.ConnectionTimeout), IntermediateFieldType.Number),
17 new IntermediateFieldDefinition(nameof(IIsWebSiteSymbolFields.DirectoryRef), IntermediateFieldType.String),
18 new IntermediateFieldDefinition(nameof(IIsWebSiteSymbolFields.State), IntermediateFieldType.Number),
19 new IntermediateFieldDefinition(nameof(IIsWebSiteSymbolFields.Attributes), IntermediateFieldType.Number),
20 new IntermediateFieldDefinition(nameof(IIsWebSiteSymbolFields.KeyAddressRef), IntermediateFieldType.String),
21 new IntermediateFieldDefinition(nameof(IIsWebSiteSymbolFields.DirPropertiesRef), IntermediateFieldType.String),
22 new IntermediateFieldDefinition(nameof(IIsWebSiteSymbolFields.ApplicationRef), IntermediateFieldType.String),
23 new IntermediateFieldDefinition(nameof(IIsWebSiteSymbolFields.Sequence), IntermediateFieldType.Number),
24 new IntermediateFieldDefinition(nameof(IIsWebSiteSymbolFields.LogRef), IntermediateFieldType.String),
25 new IntermediateFieldDefinition(nameof(IIsWebSiteSymbolFields.WebsiteId), IntermediateFieldType.String),
26 },
27 typeof(IIsWebSiteSymbol));
28 }
29}
30
31namespace WixToolset.Iis.Symbols
32{
33 using WixToolset.Data;
34
35 public enum IIsWebSiteSymbolFields
36 {
37 ComponentRef,
38 Description,
39 ConnectionTimeout,
40 DirectoryRef,
41 State,
42 Attributes,
43 KeyAddressRef,
44 DirPropertiesRef,
45 ApplicationRef,
46 Sequence,
47 LogRef,
48 WebsiteId,
49 }
50
51 public class IIsWebSiteSymbol : IntermediateSymbol
52 {
53 public IIsWebSiteSymbol() : base(IisSymbolDefinitions.IIsWebSite, null, null)
54 {
55 }
56
57 public IIsWebSiteSymbol(SourceLineNumber sourceLineNumber, Identifier id = null) : base(IisSymbolDefinitions.IIsWebSite, sourceLineNumber, id)
58 {
59 }
60
61 public IntermediateField this[IIsWebSiteSymbolFields index] => this.Fields[(int)index];
62
63 public string ComponentRef
64 {
65 get => this.Fields[(int)IIsWebSiteSymbolFields.ComponentRef].AsString();
66 set => this.Set((int)IIsWebSiteSymbolFields.ComponentRef, value);
67 }
68
69 public string Description
70 {
71 get => this.Fields[(int)IIsWebSiteSymbolFields.Description].AsString();
72 set => this.Set((int)IIsWebSiteSymbolFields.Description, value);
73 }
74
75 public int? ConnectionTimeout
76 {
77 get => this.Fields[(int)IIsWebSiteSymbolFields.ConnectionTimeout].AsNullableNumber();
78 set => this.Set((int)IIsWebSiteSymbolFields.ConnectionTimeout, value);
79 }
80
81 public string DirectoryRef
82 {
83 get => this.Fields[(int)IIsWebSiteSymbolFields.DirectoryRef].AsString();
84 set => this.Set((int)IIsWebSiteSymbolFields.DirectoryRef, value);
85 }
86
87 public int? State
88 {
89 get => this.Fields[(int)IIsWebSiteSymbolFields.State].AsNullableNumber();
90 set => this.Set((int)IIsWebSiteSymbolFields.State, value);
91 }
92
93 public int Attributes
94 {
95 get => this.Fields[(int)IIsWebSiteSymbolFields.Attributes].AsNumber();
96 set => this.Set((int)IIsWebSiteSymbolFields.Attributes, value);
97 }
98
99 public string KeyAddressRef
100 {
101 get => this.Fields[(int)IIsWebSiteSymbolFields.KeyAddressRef].AsString();
102 set => this.Set((int)IIsWebSiteSymbolFields.KeyAddressRef, value);
103 }
104
105 public string DirPropertiesRef
106 {
107 get => this.Fields[(int)IIsWebSiteSymbolFields.DirPropertiesRef].AsString();
108 set => this.Set((int)IIsWebSiteSymbolFields.DirPropertiesRef, value);
109 }
110
111 public string ApplicationRef
112 {
113 get => this.Fields[(int)IIsWebSiteSymbolFields.ApplicationRef].AsString();
114 set => this.Set((int)IIsWebSiteSymbolFields.ApplicationRef, value);
115 }
116
117 public int? Sequence
118 {
119 get => this.Fields[(int)IIsWebSiteSymbolFields.Sequence].AsNullableNumber();
120 set => this.Set((int)IIsWebSiteSymbolFields.Sequence, value);
121 }
122
123 public string LogRef
124 {
125 get => this.Fields[(int)IIsWebSiteSymbolFields.LogRef].AsString();
126 set => this.Set((int)IIsWebSiteSymbolFields.LogRef, value);
127 }
128
129 public string WebsiteId
130 {
131 get => this.Fields[(int)IIsWebSiteSymbolFields.WebsiteId].AsString();
132 set => this.Set((int)IIsWebSiteSymbolFields.WebsiteId, value);
133 }
134 }
135} \ No newline at end of file
diff --git a/src/ext/Iis/wixext/Symbols/IIsWebVirtualDirSymbol.cs b/src/ext/Iis/wixext/Symbols/IIsWebVirtualDirSymbol.cs
new file mode 100644
index 00000000..bfc29e84
--- /dev/null
+++ b/src/ext/Iis/wixext/Symbols/IIsWebVirtualDirSymbol.cs
@@ -0,0 +1,87 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Iis
4{
5 using WixToolset.Data;
6 using WixToolset.Iis.Symbols;
7
8 public static partial class IisSymbolDefinitions
9 {
10 public static readonly IntermediateSymbolDefinition IIsWebVirtualDir = new IntermediateSymbolDefinition(
11 IisSymbolDefinitionType.IIsWebVirtualDir.ToString(),
12 new[]
13 {
14 new IntermediateFieldDefinition(nameof(IIsWebVirtualDirSymbolFields.ComponentRef), IntermediateFieldType.String),
15 new IntermediateFieldDefinition(nameof(IIsWebVirtualDirSymbolFields.WebRef), IntermediateFieldType.String),
16 new IntermediateFieldDefinition(nameof(IIsWebVirtualDirSymbolFields.Alias), IntermediateFieldType.String),
17 new IntermediateFieldDefinition(nameof(IIsWebVirtualDirSymbolFields.DirectoryRef), IntermediateFieldType.String),
18 new IntermediateFieldDefinition(nameof(IIsWebVirtualDirSymbolFields.DirPropertiesRef), IntermediateFieldType.String),
19 new IntermediateFieldDefinition(nameof(IIsWebVirtualDirSymbolFields.ApplicationRef), IntermediateFieldType.String),
20 },
21 typeof(IIsWebVirtualDirSymbol));
22 }
23}
24
25namespace WixToolset.Iis.Symbols
26{
27 using WixToolset.Data;
28
29 public enum IIsWebVirtualDirSymbolFields
30 {
31 ComponentRef,
32 WebRef,
33 Alias,
34 DirectoryRef,
35 DirPropertiesRef,
36 ApplicationRef,
37 }
38
39 public class IIsWebVirtualDirSymbol : IntermediateSymbol
40 {
41 public IIsWebVirtualDirSymbol() : base(IisSymbolDefinitions.IIsWebVirtualDir, null, null)
42 {
43 }
44
45 public IIsWebVirtualDirSymbol(SourceLineNumber sourceLineNumber, Identifier id = null) : base(IisSymbolDefinitions.IIsWebVirtualDir, sourceLineNumber, id)
46 {
47 }
48
49 public IntermediateField this[IIsWebVirtualDirSymbolFields index] => this.Fields[(int)index];
50
51 public string ComponentRef
52 {
53 get => this.Fields[(int)IIsWebVirtualDirSymbolFields.ComponentRef].AsString();
54 set => this.Set((int)IIsWebVirtualDirSymbolFields.ComponentRef, value);
55 }
56
57 public string WebRef
58 {
59 get => this.Fields[(int)IIsWebVirtualDirSymbolFields.WebRef].AsString();
60 set => this.Set((int)IIsWebVirtualDirSymbolFields.WebRef, value);
61 }
62
63 public string Alias
64 {
65 get => this.Fields[(int)IIsWebVirtualDirSymbolFields.Alias].AsString();
66 set => this.Set((int)IIsWebVirtualDirSymbolFields.Alias, value);
67 }
68
69 public string DirectoryRef
70 {
71 get => this.Fields[(int)IIsWebVirtualDirSymbolFields.DirectoryRef].AsString();
72 set => this.Set((int)IIsWebVirtualDirSymbolFields.DirectoryRef, value);
73 }
74
75 public string DirPropertiesRef
76 {
77 get => this.Fields[(int)IIsWebVirtualDirSymbolFields.DirPropertiesRef].AsString();
78 set => this.Set((int)IIsWebVirtualDirSymbolFields.DirPropertiesRef, value);
79 }
80
81 public string ApplicationRef
82 {
83 get => this.Fields[(int)IIsWebVirtualDirSymbolFields.ApplicationRef].AsString();
84 set => this.Set((int)IIsWebVirtualDirSymbolFields.ApplicationRef, value);
85 }
86 }
87} \ No newline at end of file
diff --git a/src/ext/Iis/wixext/Symbols/IisSymbolDefinitions.cs b/src/ext/Iis/wixext/Symbols/IisSymbolDefinitions.cs
new file mode 100644
index 00000000..d6ed80a2
--- /dev/null
+++ b/src/ext/Iis/wixext/Symbols/IisSymbolDefinitions.cs
@@ -0,0 +1,107 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Iis
4{
5 using System;
6 using WixToolset.Data;
7
8 public enum IisSymbolDefinitionType
9 {
10 Certificate,
11 CertificateHash,
12 IIsAppPool,
13 IIsFilter,
14 IIsHttpHeader,
15 IIsMimeMap,
16 IIsProperty,
17 IIsWebAddress,
18 IIsWebApplication,
19 IIsWebApplicationExtension,
20 IIsWebDir,
21 IIsWebDirProperties,
22 IIsWebError,
23 IIsWebLog,
24 IIsWebServiceExtension,
25 IIsWebSite,
26 IIsWebSiteCertificates,
27 IIsWebVirtualDir,
28 }
29
30 public static partial class IisSymbolDefinitions
31 {
32 public static readonly Version Version = new Version("4.0.0");
33
34 public static IntermediateSymbolDefinition ByName(string name)
35 {
36 if (!Enum.TryParse(name, out IisSymbolDefinitionType type))
37 {
38 return null;
39 }
40
41 return ByType(type);
42 }
43
44 public static IntermediateSymbolDefinition ByType(IisSymbolDefinitionType type)
45 {
46 switch (type)
47 {
48 case IisSymbolDefinitionType.Certificate:
49 return IisSymbolDefinitions.Certificate;
50
51 case IisSymbolDefinitionType.CertificateHash:
52 return IisSymbolDefinitions.CertificateHash;
53
54 case IisSymbolDefinitionType.IIsAppPool:
55 return IisSymbolDefinitions.IIsAppPool;
56
57 case IisSymbolDefinitionType.IIsFilter:
58 return IisSymbolDefinitions.IIsFilter;
59
60 case IisSymbolDefinitionType.IIsHttpHeader:
61 return IisSymbolDefinitions.IIsHttpHeader;
62
63 case IisSymbolDefinitionType.IIsMimeMap:
64 return IisSymbolDefinitions.IIsMimeMap;
65
66 case IisSymbolDefinitionType.IIsProperty:
67 return IisSymbolDefinitions.IIsProperty;
68
69 case IisSymbolDefinitionType.IIsWebAddress:
70 return IisSymbolDefinitions.IIsWebAddress;
71
72 case IisSymbolDefinitionType.IIsWebApplication:
73 return IisSymbolDefinitions.IIsWebApplication;
74
75 case IisSymbolDefinitionType.IIsWebApplicationExtension:
76 return IisSymbolDefinitions.IIsWebApplicationExtension;
77
78 case IisSymbolDefinitionType.IIsWebDir:
79 return IisSymbolDefinitions.IIsWebDir;
80
81 case IisSymbolDefinitionType.IIsWebDirProperties:
82 return IisSymbolDefinitions.IIsWebDirProperties;
83
84 case IisSymbolDefinitionType.IIsWebError:
85 return IisSymbolDefinitions.IIsWebError;
86
87 case IisSymbolDefinitionType.IIsWebLog:
88 return IisSymbolDefinitions.IIsWebLog;
89
90 case IisSymbolDefinitionType.IIsWebServiceExtension:
91 return IisSymbolDefinitions.IIsWebServiceExtension;
92
93 case IisSymbolDefinitionType.IIsWebSite:
94 return IisSymbolDefinitions.IIsWebSite;
95
96 case IisSymbolDefinitionType.IIsWebSiteCertificates:
97 return IisSymbolDefinitions.IIsWebSiteCertificates;
98
99 case IisSymbolDefinitionType.IIsWebVirtualDir:
100 return IisSymbolDefinitions.IIsWebVirtualDir;
101
102 default:
103 throw new ArgumentOutOfRangeException(nameof(type));
104 }
105 }
106 }
107}
diff --git a/src/ext/Iis/wixext/WixToolset.Iis.wixext.csproj b/src/ext/Iis/wixext/WixToolset.Iis.wixext.csproj
new file mode 100644
index 00000000..81d41e77
--- /dev/null
+++ b/src/ext/Iis/wixext/WixToolset.Iis.wixext.csproj
@@ -0,0 +1,31 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3
4<Project Sdk="Microsoft.NET.Sdk">
5 <PropertyGroup>
6 <TargetFramework>netstandard2.0</TargetFramework>
7 <RootNamespace>WixToolset.Iis</RootNamespace>
8 <Description>WiX Toolset Iis Extension</Description>
9 <Title>WiX Toolset Iis Extension</Title>
10 <IsTool>true</IsTool>
11 <ContentTargetFolders>build</ContentTargetFolders>
12 </PropertyGroup>
13
14 <ItemGroup>
15 <Content Include="$(MSBuildThisFileName).targets" />
16 <EmbeddedResource Include="$(OutputPath)..\iis.wixlib" />
17 </ItemGroup>
18
19 <ItemGroup>
20 <PackageReference Include="WixToolset.Data" Version="4.0.*" PrivateAssets="all" />
21 <PackageReference Include="WixToolset.Extensibility" Version="4.0.*" PrivateAssets="all" />
22 </ItemGroup>
23
24 <ItemGroup>
25 <ProjectReference Include="..\wixlib\iis.wixproj" ReferenceOutputAssembly="false" Condition=" '$(NCrunch)'=='' " />
26 </ItemGroup>
27
28 <ItemGroup>
29 <PackageReference Include="Nerdbank.GitVersioning" Version="2.1.65" PrivateAssets="all" />
30 </ItemGroup>
31</Project>
diff --git a/src/ext/Iis/wixext/WixToolset.Iis.wixext.targets b/src/ext/Iis/wixext/WixToolset.Iis.wixext.targets
new file mode 100644
index 00000000..6398fce1
--- /dev/null
+++ b/src/ext/Iis/wixext/WixToolset.Iis.wixext.targets
@@ -0,0 +1,11 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3
4<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0">
5 <PropertyGroup>
6 <WixToolsetIisWixextPath Condition=" '$(WixToolsetIisWixextPath)' == '' ">$(MSBuildThisFileDirectory)..\tools\WixToolset.Iis.wixext.dll</WixToolsetIisWixextPath>
7 </PropertyGroup>
8 <ItemGroup>
9 <WixExtension Include="$(WixToolsetIisWixextPath)" />
10 </ItemGroup>
11</Project>
diff --git a/src/ext/Iis/wixlib/IIsExtension.wxs b/src/ext/Iis/wixlib/IIsExtension.wxs
new file mode 100644
index 00000000..18fc34ff
--- /dev/null
+++ b/src/ext/Iis/wixlib/IIsExtension.wxs
@@ -0,0 +1,58 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2
3
4<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
5 <?include caerr.wxi ?>
6
7 <Fragment>
8 <Property Id="IISMAJORVERSION">
9 <RegistrySearch Id="IIsMajorVersionSearch" Root="HKLM" Key="SOFTWARE\Microsoft\InetStp" Name="MajorVersion" Type="raw" />
10 </Property>
11
12 <Property Id="IISMINORVERSION">
13 <RegistrySearch Id="IIsMinorVersionSearch" Root="HKLM" Key="SOFTWARE\Microsoft\InetStp" Name="MinorVersion" Type="raw" />
14 </Property>
15 </Fragment>
16
17 <Fragment>
18 <UI Id="WixIIsErrors">
19 <Error Id="$(var.msierrIISCannotConnect)" Message="!(loc.msierrIISCannotConnect)" />
20 <Error Id="$(var.msierrIISFailedReadWebSite)" Message="!(loc.msierrIISFailedReadWebSite)" />
21 <Error Id="$(var.msierrIISFailedReadWebDirs)" Message="!(loc.msierrIISFailedReadWebDirs)" />
22 <Error Id="$(var.msierrIISFailedReadVDirs)" Message="!(loc.msierrIISFailedReadVDirs)" />
23 <Error Id="$(var.msierrIISFailedReadFilters)" Message="!(loc.msierrIISFailedReadFilters)" />
24 <Error Id="$(var.msierrIISFailedReadMimeMap)" Message="!(loc.msierrIISFailedReadMimeMap)" />
25 <Error Id="$(var.msierrIISFailedReadAppPool)" Message="!(loc.msierrIISFailedReadAppPool)" />
26 <Error Id="$(var.msierrIISFailedReadProp)" Message="!(loc.msierrIISFailedReadProp)" />
27 <Error Id="$(var.msierrIISFailedReadWebSvcExt)" Message="!(loc.msierrIISFailedReadWebSvcExt)" />
28 <Error Id="$(var.msierrIISFailedReadWebError)" Message="!(loc.msierrIISFailedReadWebError)" />
29 <Error Id="$(var.msierrIISFailedReadHttpHeader)" Message="!(loc.msierrIISFailedReadHttpHeader)" />
30
31 <Error Id="$(var.msierrIISFailedSchedTransaction)" Message="!(loc.msierrIISFailedSchedTransaction)" />
32 <Error Id="$(var.msierrIISFailedSchedInstallWebs)" Message="!(loc.msierrIISFailedSchedInstallWebs)" />
33 <Error Id="$(var.msierrIISFailedSchedInstallWebDirs)" Message="!(loc.msierrIISFailedSchedInstallWebDirs)" />
34 <Error Id="$(var.msierrIISFailedSchedInstallVDirs)" Message="!(loc.msierrIISFailedSchedInstallVDirs)" />
35 <Error Id="$(var.msierrIISFailedSchedInstallFilters)" Message="!(loc.msierrIISFailedSchedInstallFilters)" />
36 <Error Id="$(var.msierrIISFailedSchedInstallAppPool)" Message="!(loc.msierrIISFailedSchedInstallAppPool)" />
37 <Error Id="$(var.msierrIISFailedSchedInstallProp)" Message="!(loc.msierrIISFailedSchedInstallProp)" />
38 <Error Id="$(var.msierrIISFailedSchedInstallWebSvcExt)" Message="!(loc.msierrIISFailedSchedInstallWebSvcExt)" />
39
40 <Error Id="$(var.msierrIISFailedSchedUninstallWebs)" Message="!(loc.msierrIISFailedSchedUninstallWebs)" />
41 <Error Id="$(var.msierrIISFailedSchedUninstallWebDirs)" Message="!(loc.msierrIISFailedSchedUninstallWebDirs)" />
42 <Error Id="$(var.msierrIISFailedSchedUninstallVDirs)" Message="!(loc.msierrIISFailedSchedUninstallVDirs)" />
43 <Error Id="$(var.msierrIISFailedSchedUninstallFilters)" Message="!(loc.msierrIISFailedSchedUninstallFilters)" />
44 <Error Id="$(var.msierrIISFailedSchedUninstallAppPool)" Message="!(loc.msierrIISFailedSchedUninstallAppPool)" />
45 <Error Id="$(var.msierrIISFailedSchedUninstallProp)" Message="!(loc.msierrIISFailedSchedUninstallProp)" />
46 <Error Id="$(var.msierrIISFailedSchedUninstallWebSvcExt)" Message="!(loc.msierrIISFailedSchedUninstallWebSvcExt)" />
47
48 <Error Id="$(var.msierrIISFailedStartTransaction)" Message="!(loc.msierrIISFailedStartTransaction)" />
49 <Error Id="$(var.msierrIISFailedOpenKey)" Message="!(loc.msierrIISFailedOpenKey)" />
50 <Error Id="$(var.msierrIISFailedCreateKey)" Message="!(loc.msierrIISFailedCreateKey)" />
51 <Error Id="$(var.msierrIISFailedWriteData)" Message="!(loc.msierrIISFailedWriteData)" />
52 <Error Id="$(var.msierrIISFailedCreateApp)" Message="!(loc.msierrIISFailedCreateApp)" />
53 <Error Id="$(var.msierrIISFailedDeleteKey)" Message="!(loc.msierrIISFailedDeleteKey)" />
54 <Error Id="$(var.msierrIISFailedDeleteValue)" Message="!(loc.msierrIISFailedDeleteValue)" />
55 <Error Id="$(var.msierrIISFailedCommitInUse)" Message="!(loc.msierrIISFailedCommitInUse)" />
56 </UI>
57 </Fragment>
58</Wix>
diff --git a/src/ext/Iis/wixlib/IIsExtension_Platform.wxi b/src/ext/Iis/wixlib/IIsExtension_Platform.wxi
new file mode 100644
index 00000000..09562a69
--- /dev/null
+++ b/src/ext/Iis/wixlib/IIsExtension_Platform.wxi
@@ -0,0 +1,66 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2
3
4<Include xmlns="http://wixtoolset.org/schemas/v4/wxs">
5 <?include caDecor.wxi ?>
6
7 <Fragment>
8 <UIRef Id="WixIIsErrors" />
9 <UI>
10 <ProgressText Action="$(var.Prefix)ConfigureIIs$(var.Suffix)" Message="!(loc.ConfigureIIs)" />
11 <ProgressText Action="$(var.Prefix)ConfigureIIsExec$(var.Suffix)" Message="!(loc.ConfigureIIsExec)" />
12 <ProgressText Action="$(var.Prefix)StartMetabaseTransaction$(var.Suffix)" Message="!(loc.StartMetabaseTransaction)" />
13 <ProgressText Action="$(var.Prefix)RollbackMetabaseTransaction$(var.Suffix)" Message="!(loc.RollbackMetabaseTransaction)" />
14 <ProgressText Action="$(var.Prefix)CommitMetabaseTransaction$(var.Suffix)" Message="!(loc.CommitMetabaseTransaction)" />
15 <ProgressText Action="$(var.Prefix)WriteMetabaseChanges$(var.Suffix)" Message="!(loc.WriteMetabaseChanges)" />
16
17 <ProgressText Action="$(var.Prefix)ConfigureIIs7Exec$(var.Suffix)" Message="!(loc.ConfigureIIs7Exec)" />
18 <ProgressText Action="$(var.Prefix)StartIIS7ConfigTransaction$(var.Suffix)" Message="!(loc.StartIIS7ConfigTransaction)" />
19 <ProgressText Action="$(var.Prefix)RollbackIIS7ConfigTransaction$(var.Suffix)" Message="!(loc.RollbackIIS7ConfigTransaction)" />
20 <ProgressText Action="$(var.Prefix)CommitIIS7ConfigTransaction$(var.Suffix)" Message="!(loc.CommitIIS7ConfigTransaction)" />
21 <ProgressText Action="$(var.Prefix)WriteIIS7ConfigChanges$(var.Suffix)" Message="!(loc.WriteIIS7ConfigChanges)" />
22 </UI>
23
24 <CustomAction Id="$(var.Prefix)ConfigureIIs$(var.Suffix)" DllEntry="ConfigureIIs" Execute="immediate" Return="check" SuppressModularization="yes" BinaryRef="IisCA$(var.Suffix)" />
25 <CustomAction Id="$(var.Prefix)ConfigureIIsExec$(var.Suffix)" DllEntry="ConfigureIIsExec" Impersonate="no" Execute="deferred" Return="check" HideTarget="yes" SuppressModularization="yes" BinaryRef="IisCA$(var.Suffix)" />
26 <CustomAction Id="$(var.Prefix)StartMetabaseTransaction$(var.Suffix)" DllEntry="StartMetabaseTransaction" Impersonate="no" Execute="deferred" Return="check" HideTarget="yes" SuppressModularization="yes" BinaryRef="IisCA$(var.Suffix)" />
27 <CustomAction Id="$(var.Prefix)RollbackMetabaseTransaction$(var.Suffix)" DllEntry="RollbackMetabaseTransaction" Impersonate="no" Execute="rollback" Return="check" HideTarget="yes" SuppressModularization="yes" BinaryRef="IisCA$(var.Suffix)" />
28 <CustomAction Id="$(var.Prefix)CommitMetabaseTransaction$(var.Suffix)" DllEntry="CommitMetabaseTransaction" Impersonate="no" Execute="commit" Return="check" HideTarget="yes" SuppressModularization="yes" BinaryRef="IisCA$(var.Suffix)" />
29 <CustomAction Id="$(var.Prefix)WriteMetabaseChanges$(var.Suffix)" DllEntry="WriteMetabaseChanges" Impersonate="no" Execute="deferred" Return="check" HideTarget="yes" SuppressModularization="yes" BinaryRef="IisCA$(var.Suffix)" />
30
31 <CustomAction Id="$(var.Prefix)ConfigureIIs7Exec$(var.Suffix)" DllEntry="ConfigureIIs7Exec" Impersonate="no" Execute="deferred" Return="check" HideTarget="yes" SuppressModularization="yes" BinaryRef="IisCA$(var.Suffix)" />
32 <CustomAction Id="$(var.Prefix)StartIIS7ConfigTransaction$(var.Suffix)" DllEntry="StartIIS7ConfigTransaction" Impersonate="no" Execute="deferred" Return="check" HideTarget="yes" SuppressModularization="yes" BinaryRef="IisCA$(var.Suffix)" />
33 <CustomAction Id="$(var.Prefix)RollbackIIS7ConfigTransaction$(var.Suffix)" DllEntry="RollbackIIS7ConfigTransaction" Impersonate="no" Execute="rollback" Return="check" HideTarget="yes" SuppressModularization="yes" BinaryRef="IisCA$(var.Suffix)" />
34 <CustomAction Id="$(var.Prefix)CommitIIS7ConfigTransaction$(var.Suffix)" DllEntry="CommitIIS7ConfigTransaction" Impersonate="no" Execute="commit" Return="check" HideTarget="yes" SuppressModularization="yes" BinaryRef="IisCA$(var.Suffix)" />
35 <CustomAction Id="$(var.Prefix)WriteIIS7ConfigChanges$(var.Suffix)" DllEntry="WriteIIS7ConfigChanges" Impersonate="no" Execute="deferred" Return="check" HideTarget="yes" SuppressModularization="yes" BinaryRef="IisCA$(var.Suffix)" />
36
37 <InstallExecuteSequence>
38 <Custom Action="$(var.Prefix)ConfigureIIs$(var.Suffix)" Before="RegisterUser" Overridable="yes" Condition="NOT SKIPCONFIGUREIIS AND VersionNT &gt; 400" />
39 </InstallExecuteSequence>
40 </Fragment>
41
42 <Fragment>
43 <Binary Id="IisCA$(var.Suffix)" SourceFile="!(bindpath.$(var.platform))iisca.dll" />
44 </Fragment>
45
46 <Fragment>
47 <CustomAction Id="$(var.Prefix)InstallCertificates$(var.Suffix)" DllEntry="InstallCertificates" Execute="immediate" Return="check" SuppressModularization="yes" BinaryRef="IisCA$(var.Suffix)" />
48 <CustomAction Id="$(var.Prefix)UninstallCertificates$(var.Suffix)" DllEntry="UninstallCertificates" Execute="immediate" Return="check" SuppressModularization="yes" BinaryRef="IisCA$(var.Suffix)" />
49
50 <CustomAction Id="$(var.Prefix)AddUserCertificate$(var.Suffix)" DllEntry="AddUserCertificate" Impersonate="yes" Execute="deferred" Return="check" HideTarget="yes" SuppressModularization="yes" TerminalServerAware="yes" BinaryRef="IisCA$(var.Suffix)" />
51 <CustomAction Id="$(var.Prefix)AddMachineCertificate$(var.Suffix)" DllEntry="AddMachineCertificate" Impersonate="no" Execute="deferred" Return="check" HideTarget="yes" SuppressModularization="yes" BinaryRef="IisCA$(var.Suffix)" />
52 <CustomAction Id="$(var.Prefix)DeleteUserCertificate$(var.Suffix)" DllEntry="DeleteUserCertificate" Impersonate="yes" Execute="deferred" Return="check" HideTarget="yes" SuppressModularization="yes" TerminalServerAware="yes" BinaryRef="IisCA$(var.Suffix)" />
53 <CustomAction Id="$(var.Prefix)DeleteMachineCertificate$(var.Suffix)" DllEntry="DeleteMachineCertificate" Impersonate="no" Execute="deferred" Return="check" HideTarget="yes" SuppressModularization="yes" BinaryRef="IisCA$(var.Suffix)" />
54
55 <CustomAction Id="$(var.Prefix)RollbackAddUserCertificate$(var.Suffix)" DllEntry="DeleteUserCertificate" Impersonate="yes" Execute="rollback" Return="check" HideTarget="yes" SuppressModularization="yes" TerminalServerAware="yes" BinaryRef="IisCA$(var.Suffix)" />
56 <CustomAction Id="$(var.Prefix)RollbackAddMachineCertificate$(var.Suffix)" DllEntry="DeleteMachineCertificate" Impersonate="no" Execute="rollback" Return="check" HideTarget="yes" SuppressModularization="yes" BinaryRef="IisCA$(var.Suffix)" />
57 <CustomAction Id="$(var.Prefix)RollbackDeleteUserCertificate$(var.Suffix)" DllEntry="AddUserCertificate" Impersonate="yes" Execute="rollback" Return="check" HideTarget="yes" SuppressModularization="yes" TerminalServerAware="yes" BinaryRef="IisCA$(var.Suffix)" />
58 <CustomAction Id="$(var.Prefix)RollbackDeleteMachineCertificate$(var.Suffix)" DllEntry="AddMachineCertificate" Impersonate="no" Execute="rollback" Return="check" HideTarget="yes" SuppressModularization="yes" BinaryRef="IisCA$(var.Suffix)" />
59
60 <InstallExecuteSequence>
61 <Custom Action="UninstallCertificates$(var.Suffix)" Before="RemoveFiles" Overridable="yes" Condition="VersionNT &gt; 400" />
62 <Custom Action="InstallCertificates$(var.Suffix)" After="InstallFiles" Overridable="yes" Condition="VersionNT &gt; 400" />
63 </InstallExecuteSequence>
64 </Fragment>
65
66</Include>
diff --git a/src/ext/Iis/wixlib/IIsExtension_arm64.wxs b/src/ext/Iis/wixlib/IIsExtension_arm64.wxs
new file mode 100644
index 00000000..39ac048f
--- /dev/null
+++ b/src/ext/Iis/wixlib/IIsExtension_arm64.wxs
@@ -0,0 +1,7 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2
3
4<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
5 <?define platform=arm64 ?>
6 <?include IIsExtension_Platform.wxi ?>
7</Wix>
diff --git a/src/ext/Iis/wixlib/IIsExtension_x64.wxs b/src/ext/Iis/wixlib/IIsExtension_x64.wxs
new file mode 100644
index 00000000..553953b3
--- /dev/null
+++ b/src/ext/Iis/wixlib/IIsExtension_x64.wxs
@@ -0,0 +1,7 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2
3
4<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
5 <?define platform=x64 ?>
6 <?include IIsExtension_Platform.wxi ?>
7</Wix>
diff --git a/src/ext/Iis/wixlib/IIsExtension_x86.wxs b/src/ext/Iis/wixlib/IIsExtension_x86.wxs
new file mode 100644
index 00000000..c99a243b
--- /dev/null
+++ b/src/ext/Iis/wixlib/IIsExtension_x86.wxs
@@ -0,0 +1,7 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2
3
4<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
5 <?define platform=x86 ?>
6 <?include IIsExtension_Platform.wxi ?>
7</Wix>
diff --git a/src/ext/Iis/wixlib/caDecor.wxi b/src/ext/Iis/wixlib/caDecor.wxi
new file mode 100644
index 00000000..b1711518
--- /dev/null
+++ b/src/ext/Iis/wixlib/caDecor.wxi
@@ -0,0 +1,39 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2
3
4<Include xmlns="http://wixtoolset.org/schemas/v4/wxs">
5 <?ifdef Prefix ?>
6 <?undef Prefix ?>
7 <?endif?>
8
9 <?define Prefix="Wix4" ?>
10
11 <?ifndef platform ?>
12 <?define platform="x86" ?>
13 <?endif?>
14
15 <?if $(var.platform)="" ?>
16 <?undef platform ?>
17 <?define platform="x86" ?>
18 <?endif?>
19
20 <?ifdef Suffix ?>
21 <?undef Suffix ?>
22 <?endif?>
23
24 <?if $(var.platform)~="x86" ?>
25 <?define Suffix="_X86" ?>
26 <?endif?>
27
28 <?if $(var.platform)~="x64" ?>
29 <?define Suffix="_X64" ?>
30 <?endif?>
31
32 <?if $(var.platform)~="arm" ?>
33 <?define Suffix="_A32" ?>
34 <?endif?>
35
36 <?if $(var.platform)~="arm64" ?>
37 <?define Suffix="_A64" ?>
38 <?endif?>
39</Include>
diff --git a/src/ext/Iis/wixlib/caerr.wxi b/src/ext/Iis/wixlib/caerr.wxi
new file mode 100644
index 00000000..ff7ec121
--- /dev/null
+++ b/src/ext/Iis/wixlib/caerr.wxi
@@ -0,0 +1,96 @@
1<Include xmlns="http://wixtoolset.org/schemas/v4/wxs">
2 <?define msierrSecureObjectsFailedCreateSD = 25520?>
3 <?define msierrSecureObjectsFailedSet = 25521?>
4 <?define msierrSecureObjectsUnknownType = 25522?>
5 <?define msierrXmlFileFailedRead = 25530?>
6 <?define msierrXmlFileFailedOpen = 25531?>
7 <?define msierrXmlFileFailedSelect = 25532?>
8 <?define msierrXmlFileFailedSave = 25533?>
9 <?define msierrXmlConfigFailedRead = 25540?>
10 <?define msierrXmlConfigFailedOpen = 25541?>
11 <?define msierrXmlConfigFailedSelect = 25542?>
12 <?define msierrXmlConfigFailedSave = 25543?>
13 <?define msierrFirewallCannotConnect = 25580?>
14 <?define msierrIISCannotConnect = 26001?>
15 <?define msierrIISFailedReadWebSite = 26002?>
16 <?define msierrIISFailedReadWebDirs = 26003?>
17 <?define msierrIISFailedReadVDirs = 26004?>
18 <?define msierrIISFailedReadFilters = 26005?>
19 <?define msierrIISFailedReadAppPool = 26006?>
20 <?define msierrIISFailedReadMimeMap = 26007?>
21 <?define msierrIISFailedReadProp = 26008?>
22 <?define msierrIISFailedReadWebSvcExt = 26009?>
23 <?define msierrIISFailedReadWebError = 26010?>
24 <?define msierrIISFailedReadHttpHeader = 26011?>
25 <?define msierrIISFailedSchedTransaction = 26031?>
26 <?define msierrIISFailedSchedInstallWebs = 26032?>
27 <?define msierrIISFailedSchedInstallWebDirs = 26033?>
28 <?define msierrIISFailedSchedInstallVDirs = 26034?>
29 <?define msierrIISFailedSchedInstallFilters = 26035?>
30 <?define msierrIISFailedSchedInstallAppPool = 26036?>
31 <?define msierrIISFailedSchedInstallProp = 26037?>
32 <?define msierrIISFailedSchedInstallWebSvcExt = 26038?>
33 <?define msierrIISFailedSchedUninstallWebs = 26051?>
34 <?define msierrIISFailedSchedUninstallWebDirs = 26052?>
35 <?define msierrIISFailedSchedUninstallVDirs = 26053?>
36 <?define msierrIISFailedSchedUninstallFilters = 26054?>
37 <?define msierrIISFailedSchedUninstallAppPool = 26055?>
38 <?define msierrIISFailedSchedUninstallProp = 26056?>
39 <?define msierrIISFailedSchedUninstallWebSvcExt = 26057?>
40 <?define msierrIISFailedStartTransaction = 26101?>
41 <?define msierrIISFailedOpenKey = 26102?>
42 <?define msierrIISFailedCreateKey = 26103?>
43 <?define msierrIISFailedWriteData = 26104?>
44 <?define msierrIISFailedCreateApp = 26105?>
45 <?define msierrIISFailedDeleteKey = 26106?>
46 <?define msierrIISFailedDeleteApp = 26107?>
47 <?define msierrIISFailedDeleteValue = 26108?>
48 <?define msierrIISFailedCommitInUse = 26109?>
49 <?define msierrSQLFailedCreateDatabase = 26201?>
50 <?define msierrSQLFailedDropDatabase = 26202?>
51 <?define msierrSQLFailedConnectDatabase = 26203?>
52 <?define msierrSQLFailedExecString = 26204?>
53 <?define msierrSQLDatabaseAlreadyExists = 26205?>
54 <?define msierrPERFMONFailedRegisterDLL = 26251?>
55 <?define msierrPERFMONFailedUnregisterDLL = 26252?>
56 <?define msierrInstallPerfCounterData = 26253?>
57 <?define msierrUninstallPerfCounterData = 26254?>
58 <?define msierrSMBFailedCreate = 26301?>
59 <?define msierrSMBFailedDrop = 26302?>
60 <?define msierrCERTFailedOpen = 26351?>
61 <?define msierrCERTFailedAdd = 26352?>
62 <?define msierrUSRFailedUserCreate = 26401?>
63 <?define msierrUSRFailedUserCreatePswd = 26402?>
64 <?define msierrUSRFailedUserGroupAdd = 26403?>
65 <?define msierrUSRFailedUserCreateExists = 26404?>
66 <?define msierrUSRFailedGrantLogonAsService = 26405?>
67 <?define msierrDependencyMissingDependencies = 26451?>
68 <?define msierrDependencyHasDependents = 26452?>
69 <?define msierrDotNetRuntimeRequired = 27000?>
70 <?define msierrComPlusCannotConnect = 28001?>
71 <?define msierrComPlusPartitionReadFailed = 28002?>
72 <?define msierrComPlusPartitionRoleReadFailed = 28003?>
73 <?define msierrComPlusUserInPartitionRoleReadFailed = 28004?>
74 <?define msierrComPlusPartitionUserReadFailed = 28005?>
75 <?define msierrComPlusApplicationReadFailed = 28006?>
76 <?define msierrComPlusApplicationRoleReadFailed = 28007?>
77 <?define msierrComPlusUserInApplicationRoleReadFailed = 28008?>
78 <?define msierrComPlusAssembliesReadFailed = 28009?>
79 <?define msierrComPlusSubscriptionReadFailed = 28010?>
80 <?define msierrComPlusPartitionDependency = 28011?>
81 <?define msierrComPlusPartitionNotFound = 28012?>
82 <?define msierrComPlusPartitionIdConflict = 28013?>
83 <?define msierrComPlusPartitionNameConflict = 28014?>
84 <?define msierrComPlusApplicationDependency = 28015?>
85 <?define msierrComPlusApplicationNotFound = 28016?>
86 <?define msierrComPlusApplicationIdConflict = 28017?>
87 <?define msierrComPlusApplicationNameConflict = 28018?>
88 <?define msierrComPlusApplicationRoleDependency = 28019?>
89 <?define msierrComPlusApplicationRoleNotFound = 28020?>
90 <?define msierrComPlusApplicationRoleConflict = 28021?>
91 <?define msierrComPlusAssemblyDependency = 28022?>
92 <?define msierrComPlusSubscriptionIdConflict = 28023?>
93 <?define msierrComPlusSubscriptionNameConflict = 28024?>
94 <?define msierrComPlusFailedLookupNames = 28025?>
95 <?define msierrMsmqCannotConnect = 28101?>
96</Include> \ No newline at end of file
diff --git a/src/ext/Iis/wixlib/de-de.wxl b/src/ext/Iis/wixlib/de-de.wxl
new file mode 100644
index 00000000..5929f258
--- /dev/null
+++ b/src/ext/Iis/wixlib/de-de.wxl
@@ -0,0 +1,55 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2
3
4<WixLocalization Culture="de-de" xmlns="http://wixtoolset.org/schemas/v4/wxl">
5 <String Id="msierrIISCannotConnect" Overridable="yes">Konnte keine Verbindung mit dem Internet Information Server herstellen. ([2] [3] [4] [5])</String>
6 <String Id="msierrIISFailedReadWebSite" Overridable="yes">Fehler bei der Verarbeitung der WebSites. ([2] [3] [4] [5])</String>
7 <String Id="msierrIISFailedReadWebDirs" Overridable="yes">Fehler bei der Verarbeitung der WebDirs. ([2] [3] [4] [5])</String>
8 <String Id="msierrIISFailedReadVDirs" Overridable="yes">Fehler bei der Verarbeitung der WebVirtualDirs. ([2] [3] [4] [5])</String>
9 <String Id="msierrIISFailedReadFilters" Overridable="yes">Fehler bei der Verarbeitung der WebFilters. ([2] [3] [4] [5])</String>
10 <String Id="msierrIISFailedReadMimeMap" Overridable="yes">Fehler bei der Verarbeitung der MimeMaps. ([2] [3] [4] [5])</String>
11 <String Id="msierrIISFailedReadAppPool" Overridable="yes">Fehler bei der Verarbeitung der WebAppPools. ([2] [3] [4] [5])</String>
12 <String Id="msierrIISFailedReadProp" Overridable="yes">Fehler bei der Verarbeitung der WebProperties. ([2] [3] [4] [5])</String>
13 <String Id="msierrIISFailedReadWebSvcExt" Overridable="yes">Fehler bei der Verarbeitung der WebServiceExtensions. ([2] [3] [4] [5])</String>
14 <String Id="msierrIISFailedReadWebError" Overridable="yes">Fehler bei der Verarbeitung der WebErrors. ([2] [3] [4] [5])</String>
15 <String Id="msierrIISFailedReadHttpHeader" Overridable="yes">Fehler bei der Verarbeitung der HttpHeader. ([2] [3] [4] [5])</String>
16
17 <String Id="msierrIISFailedSchedTransaction" Overridable="yes">Die Transaktion für Änderungen am IIS konnte nicht geschedulded werden. ([2] [3] [4] [5])</String>
18 <String Id="msierrIISFailedSchedInstallWebs" Overridable="yes">Die Installation von IIS-Websites konnte nicht geschedulded werden. ([2] [3] [4] [5])</String>
19 <String Id="msierrIISFailedSchedInstallWebDirs" Overridable="yes">Die Installation von IIS Web Directories konnte nicht geschedulded werden. ([2] [3] [4] [5])</String>
20 <String Id="msierrIISFailedSchedInstallVDirs" Overridable="yes">Die Installation von IIS Virtual Directories konnte nicht geschedulded werden. ([2] [3] [4] [5])</String>
21 <String Id="msierrIISFailedSchedInstallFilters" Overridable="yes">Die Installation von IIS Filters konnte nicht geschedulded werden. ([2] [3] [4] [5])</String>
22 <String Id="msierrIISFailedSchedInstallAppPool" Overridable="yes">Die Installation von IIS AppPools konnte nicht geschedulded werden. ([2] [3] [4] [5])</String>
23 <String Id="msierrIISFailedSchedInstallProp" Overridable="yes">Die Installation von IIS Properties konnte nicht geschedulded werden. ([2] [3] [4] [5])</String>
24 <String Id="msierrIISFailedSchedInstallWebSvcExt" Overridable="yes">Die Installation von IIS Web Service Extensions konnte nicht geschedulded werden. ([2] [3] [4] [5])</String>
25
26 <String Id="msierrIISFailedSchedUninstallWebs" Overridable="yes">Die Deinstallation von IIS Web Sites konnte nicht geschedulded werden. ([2] [3] [4] [5])</String>
27 <String Id="msierrIISFailedSchedUninstallWebDirs" Overridable="yes">Die Deinstallation von IIS Web Directories konnte nicht geschedulded werden. ([2] [3] [4] [5])</String>
28 <String Id="msierrIISFailedSchedUninstallVDirs" Overridable="yes">Die Deinstallation von IIS Virtual Directories konnte nicht geschedulded werden. ([2] [3] [4] [5])</String>
29 <String Id="msierrIISFailedSchedUninstallFilters" Overridable="yes">Die Deinstallation von IIS Filters konnte nicht geschedulded werden. ([2] [3] [4] [5])</String>
30 <String Id="msierrIISFailedSchedUninstallAppPool" Overridable="yes">Die Deinstallation von IIS AppPools konnte nicht geschedulded werden. ([2] [3] [4] [5])</String>
31 <String Id="msierrIISFailedSchedUninstallProp" Overridable="yes">Die Deinstallation der IIS Properties konnte nicht geschedulded werden. ([2] [3] [4] [5])</String>
32 <String Id="msierrIISFailedSchedUninstallWebSvcExt" Overridable="yes">Die Deinstallation von IIS Web Service Extensions konnte nicht geschedulded werden. ([2] [3] [4] [5])</String>
33
34 <String Id="msierrIISFailedStartTransaction" Overridable="yes">Die IIS-Transaktion konnte nicht gestartet werden. ([2] [3] [4] [5])</String>
35 <String Id="msierrIISFailedOpenKey" Overridable="yes">Der Metabase Key konnte nicht geöffnet werden. ([2] [3] [4] [5])</String>
36 <String Id="msierrIISFailedCreateKey" Overridable="yes">Der Metabase Key konnte nicht erstellt werden. ([2] [3] [4] [5])</String>
37 <String Id="msierrIISFailedWriteData" Overridable="yes">Daten konnten nicht in den Metabase Key geschrieben werden. ([2] [3] [4] [5])</String>
38 <String Id="msierrIISFailedCreateApp" Overridable="yes">Webanwendung konnte nicht erstellt werden. ([2] [3] [4] [5])</String>
39 <String Id="msierrIISFailedDeleteKey" Overridable="yes">Der Metabase Key konnte nicht gelöscht werden. ([2] [3] [4] [5])</String>
40 <String Id="msierrIISFailedDeleteValue" Overridable="yes">Der Metabase Value konnte nicht gelöscht werden. ([2] [3] [4] [5])</String>
41 <String Id="msierrIISFailedCommitInUse" Overridable="yes">Die IIS Transaktion konnte aufgrund einer Freigabeverletzung nicht committed werden. Möglicherweise konfiguriert eine andere Anwendung derzeit IIS.</String>
42
43 <String Id="ConfigureIIs" Overridable="yes">Konfiguriere IIS</String>
44 <String Id="ConfigureIIsExec" Overridable="yes">Führe IIS Konfiguration aus</String>
45 <String Id="StartMetabaseTransaction" Overridable="yes">Starte IIS Metabase Transaktion</String>
46 <String Id="RollbackMetabaseTransaction" Overridable="yes">Mache IIS Metabase Transaktion rückgängig</String>
47 <String Id="CommitMetabaseTransaction" Overridable="yes">Committe IIS Metabase Transaktion</String>
48 <String Id="WriteMetabaseChanges" Overridable="yes">Installiere Metabase Keys und Values</String>
49
50 <String Id="ConfigureIIs7Exec" Overridable="yes">Konfiguriere IIS</String>
51 <String Id="StartIIS7ConfigTransaction" Overridable="yes">Starte IIS Konfigurationstransaktion</String>
52 <String Id="RollbackIIS7ConfigTransaction" Overridable="yes">Mache IIS Konfigurationstransaktion rückgängig</String>
53 <String Id="CommitIIS7ConfigTransaction" Overridable="yes">Committe IIS Konfigurationstransaktion</String>
54 <String Id="WriteIIS7ConfigChanges" Overridable="yes">Installiere Konfigurationskeys and -values</String>
55</WixLocalization>
diff --git a/src/ext/Iis/wixlib/en-us.wxl b/src/ext/Iis/wixlib/en-us.wxl
new file mode 100644
index 00000000..44949095
--- /dev/null
+++ b/src/ext/Iis/wixlib/en-us.wxl
@@ -0,0 +1,55 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2
3
4<WixLocalization Culture="en-us" xmlns="http://wixtoolset.org/schemas/v4/wxl">
5 <String Id="msierrIISCannotConnect" Overridable="yes">Cannot connect to Internet Information Server. ([2] [3] [4] [5])</String>
6 <String Id="msierrIISFailedReadWebSite" Overridable="yes">Failed while processing WebSites. ([2] [3] [4] [5])</String>
7 <String Id="msierrIISFailedReadWebDirs" Overridable="yes">Failed while processing WebDirs. ([2] [3] [4] [5])</String>
8 <String Id="msierrIISFailedReadVDirs" Overridable="yes">Failed while processing WebVirtualDirs. ([2] [3] [4] [5])</String>
9 <String Id="msierrIISFailedReadFilters" Overridable="yes">Failed while processing WebFilters. ([2] [3] [4] [5])</String>
10 <String Id="msierrIISFailedReadMimeMap" Overridable="yes">Failed while processing MimeMaps. ([2] [3] [4] [5])</String>
11 <String Id="msierrIISFailedReadAppPool" Overridable="yes">Failed while processing WebAppPools. ([2] [3] [4] [5])</String>
12 <String Id="msierrIISFailedReadProp" Overridable="yes">Failed while processing WebProperties. ([2] [3] [4] [5])</String>
13 <String Id="msierrIISFailedReadWebSvcExt" Overridable="yes">Failed while processing WebServiceExtensions. ([2] [3] [4] [5])</String>
14 <String Id="msierrIISFailedReadWebError" Overridable="yes">Failed while processing WebErrors. ([2] [3] [4] [5])</String>
15 <String Id="msierrIISFailedReadHttpHeader" Overridable="yes">Failed while processing HttpHeaders. ([2] [3] [4] [5])</String>
16
17 <String Id="msierrIISFailedSchedTransaction" Overridable="yes">Failed to schedule transaction for changes to IIS. ([2] [3] [4] [5])</String>
18 <String Id="msierrIISFailedSchedInstallWebs" Overridable="yes">Failed to schedule install of IIS Web Sites. ([2] [3] [4] [5])</String>
19 <String Id="msierrIISFailedSchedInstallWebDirs" Overridable="yes">Failed to schedule install of IIS Web Directories. ([2] [3] [4] [5])</String>
20 <String Id="msierrIISFailedSchedInstallVDirs" Overridable="yes">Failed to schedule install of IIS Virtual Directories. ([2] [3] [4] [5])</String>
21 <String Id="msierrIISFailedSchedInstallFilters" Overridable="yes">Failed to schedule install of IIS Filters. ([2] [3] [4] [5])</String>
22 <String Id="msierrIISFailedSchedInstallAppPool" Overridable="yes">Failed to schedule install of IIS AppPools. ([2] [3] [4] [5])</String>
23 <String Id="msierrIISFailedSchedInstallProp" Overridable="yes">Failed to schedule install of IIS Properties. ([2] [3] [4] [5])</String>
24 <String Id="msierrIISFailedSchedInstallWebSvcExt" Overridable="yes">Failed to schedule install of IIS Web Service Extensions. ([2] [3] [4] [5])</String>
25
26 <String Id="msierrIISFailedSchedUninstallWebs" Overridable="yes">Failed to schedule uninstall of IIS Web Sites. ([2] [3] [4] [5])</String>
27 <String Id="msierrIISFailedSchedUninstallWebDirs" Overridable="yes">Failed to schedule uninstall of IIS Web Directories. ([2] [3] [4] [5])</String>
28 <String Id="msierrIISFailedSchedUninstallVDirs" Overridable="yes">Failed to schedule uninstall of IIS Virtual Directories. ([2] [3] [4] [5])</String>
29 <String Id="msierrIISFailedSchedUninstallFilters" Overridable="yes">Failed to schedule uninstall of IIS Filters. ([2] [3] [4] [5])</String>
30 <String Id="msierrIISFailedSchedUninstallAppPool" Overridable="yes">Failed to schedule uninstall of IIS AppPools. ([2] [3] [4] [5])</String>
31 <String Id="msierrIISFailedSchedUninstallProp" Overridable="yes">Failed to schedule uninstall of IIS Properties. ([2] [3] [4] [5])</String>
32 <String Id="msierrIISFailedSchedUninstallWebSvcExt" Overridable="yes">Failed to schedule uninstall of IIS Web Service Extensions. ([2] [3] [4] [5])</String>
33
34 <String Id="msierrIISFailedStartTransaction" Overridable="yes">Failed to start IIS transaction. ([2] [3] [4] [5])</String>
35 <String Id="msierrIISFailedOpenKey" Overridable="yes">Failed to open metabase key. ([2] [3] [4] [5])</String>
36 <String Id="msierrIISFailedCreateKey" Overridable="yes">Failed to create metabase key. ([2] [3] [4] [5])</String>
37 <String Id="msierrIISFailedWriteData" Overridable="yes">Failed to write data to metabase key. ([2] [3] [4] [5])</String>
38 <String Id="msierrIISFailedCreateApp" Overridable="yes">Failed to create web application. ([2] [3] [4] [5])</String>
39 <String Id="msierrIISFailedDeleteKey" Overridable="yes">Failed to delete metabase key. ([2] [3] [4] [5])</String>
40 <String Id="msierrIISFailedDeleteValue" Overridable="yes">Failed to delete metabase value. ([2] [3] [4] [5])</String>
41 <String Id="msierrIISFailedCommitInUse" Overridable="yes">Failed to commit IIS transaction due to a sharing violation. Some other application may be configuring IIS.</String>
42
43 <String Id="ConfigureIIs" Overridable="yes">Configuring IIS</String>
44 <String Id="ConfigureIIsExec" Overridable="yes">Executing IIS Configuration</String>
45 <String Id="StartMetabaseTransaction" Overridable="yes">Starting IIS Metabase Transaction</String>
46 <String Id="RollbackMetabaseTransaction" Overridable="yes">Rolling back IIS Metabase Transaction</String>
47 <String Id="CommitMetabaseTransaction" Overridable="yes">Committing IIS Metabase Transaction</String>
48 <String Id="WriteMetabaseChanges" Overridable="yes">Installing Metabase Keys and Values</String>
49
50 <String Id="ConfigureIIs7Exec" Overridable="yes">Configuring IIS</String>
51 <String Id="StartIIS7ConfigTransaction" Overridable="yes">Starting IIS Config Transaction</String>
52 <String Id="RollbackIIS7ConfigTransaction" Overridable="yes">Rolling back IIS Config Transaction</String>
53 <String Id="CommitIIS7ConfigTransaction" Overridable="yes">Committing IIS Config Transaction</String>
54 <String Id="WriteIIS7ConfigChanges" Overridable="yes">Installing Config Keys and Values</String>
55</WixLocalization>
diff --git a/src/ext/Iis/wixlib/iis.v3.ncrunchproject b/src/ext/Iis/wixlib/iis.v3.ncrunchproject
new file mode 100644
index 00000000..319cd523
--- /dev/null
+++ b/src/ext/Iis/wixlib/iis.v3.ncrunchproject
@@ -0,0 +1,5 @@
1<ProjectConfiguration>
2 <Settings>
3 <IgnoreThisComponentCompletely>True</IgnoreThisComponentCompletely>
4 </Settings>
5</ProjectConfiguration> \ No newline at end of file
diff --git a/src/ext/Iis/wixlib/iis.wixproj b/src/ext/Iis/wixlib/iis.wixproj
new file mode 100644
index 00000000..89f9608f
--- /dev/null
+++ b/src/ext/Iis/wixlib/iis.wixproj
@@ -0,0 +1,26 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2<Project Sdk="WixToolset.Sdk">
3
4 <PropertyGroup>
5 <OutputType>Library</OutputType>
6 <BindFiles>true</BindFiles>
7 <Cultures>en-us</Cultures>
8 </PropertyGroup>
9
10 <ItemGroup>
11 <BindInputPaths Include="$(OutputPath)x86" BindName='x86' />
12 <BindInputPaths Include="$(OutputPath)x64" BindName='x64' />
13 <BindInputPaths Include="$(OutputPath)arm64" BindName='arm64' />
14 </ItemGroup>
15
16 <ItemGroup>
17 <ProjectReference Include="..\ca\iisca.vcxproj" Properties="Platform=ARM64" />
18 <ProjectReference Include="..\ca\iisca.vcxproj" Properties="Platform=x86" />
19 <ProjectReference Include="..\ca\iisca.vcxproj" Properties="Platform=x64" />
20 </ItemGroup>
21
22 <ItemGroup>
23 <PackageReference Include="Nerdbank.GitVersioning" Version="2.1.65" PrivateAssets="All" />
24 </ItemGroup>
25
26</Project>
diff --git a/src/ext/Iis/wixlib/ja-jp.wxl b/src/ext/Iis/wixlib/ja-jp.wxl
new file mode 100644
index 00000000..7fd6978a
--- /dev/null
+++ b/src/ext/Iis/wixlib/ja-jp.wxl
@@ -0,0 +1,47 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2
3
4<WixLocalization Culture="ja-jp" xmlns="http://wixtoolset.org/schemas/v4/wxl">
5 <String Id="msierrIISCannotConnect" Overridable="yes">IISへ接続できません。 ([2] [3] [4] [5])</String>
6 <String Id="msierrIISFailedReadWebSite" Overridable="yes">ウェブ サイト処理中に失敗しました。 ([2] [3] [4] [5])</String>
7 <String Id="msierrIISFailedReadWebDirs" Overridable="yes">ウェブ ディレクトリ処理中に失敗しました。 ([2] [3] [4] [5])</String>
8 <String Id="msierrIISFailedReadVDirs" Overridable="yes">ウェブ仮想ディレクトリ処理中に失敗しました。 ([2] [3] [4] [5])</String>
9 <String Id="msierrIISFailedReadFilters" Overridable="yes">ウェブ フィルタ処理中に失敗しました。 ([2] [3] [4] [5])</String>
10 <String Id="msierrIISFailedReadMimeMap" Overridable="yes">MIME マップ処理中に失敗しました。 ([2] [3] [4] [5])</String>
11 <String Id="msierrIISFailedReadAppPool" Overridable="yes">ウェブ アプリケーション プール処理中に失敗しました。 ([2] [3] [4] [5])</String>
12 <String Id="msierrIISFailedReadProp" Overridable="yes">ウェブ プロパティ処理中に失敗しました。 ([2] [3] [4] [5])</String>
13 <String Id="msierrIISFailedReadWebSvcExt" Overridable="yes">ウェブ サービス拡張処理中に失敗しました。 ([2] [3] [4] [5])</String>
14 <String Id="msierrIISFailedReadWebError" Overridable="yes">ウェブ エラー処理中に失敗しました。 ([2] [3] [4] [5])</String>
15 <String Id="msierrIISFailedReadHttpHeader" Overridable="yes">HTTP ヘッダ処理中に失敗しました。 ([2] [3] [4] [5])</String>
16
17 <String Id="msierrIISFailedSchedTransaction" Overridable="yes">IIS 変更トランザクションのスケジューリングに失敗しました。 ([2] [3] [4] [5])</String>
18 <String Id="msierrIISFailedSchedInstallWebs" Overridable="yes">IIS ウェブ サイト インストールのスケジューリングに失敗しました。 ([2] [3] [4] [5])</String>
19 <String Id="msierrIISFailedSchedInstallWebDirs" Overridable="yes">IIS ウェブ ディレクトリ インストールのスケジューリングに失敗しました。 ([2] [3] [4] [5])</String>
20 <String Id="msierrIISFailedSchedInstallVDirs" Overridable="yes">IIS 仮想ディレクトリ インストールのスケジューリングに失敗しました。 ([2] [3] [4] [5])</String>
21 <String Id="msierrIISFailedSchedInstallFilters" Overridable="yes">IIS フィルタ インストールのスケジューリングに失敗しました。 ([2] [3] [4] [5])</String>
22 <String Id="msierrIISFailedSchedInstallAppPool" Overridable="yes">IIS アプリケーション プール インストールのスケジューリングに失敗しました。 ([2] [3] [4] [5])</String>
23 <String Id="msierrIISFailedSchedInstallProp" Overridable="yes">IIS プロパティ インストールのスケジューリングに失敗しました。 ([2] [3] [4] [5])</String>
24 <String Id="msierrIISFailedSchedInstallWebSvcExt" Overridable="yes">IIS ウェブ サービス拡張インストールのスケジューリングに失敗しました。 ([2] [3] [4] [5])</String>
25
26 <String Id="msierrIISFailedSchedUninstallWebs" Overridable="yes">IISウェブ サイト アンインストールのスケジューリングに失敗しました。 ([2] [3] [4] [5])</String>
27 <String Id="msierrIISFailedSchedUninstallWebDirs" Overridable="yes">IIS ウェブ ディレクトリ アンインストールのスケジューリングに失敗しました。 ([2] [3] [4] [5])</String>
28 <String Id="msierrIISFailedSchedUninstallVDirs" Overridable="yes">IIS 仮想ディレクトリ アンインストールのスケジューリングに失敗しました。 ([2] [3] [4] [5])</String>
29 <String Id="msierrIISFailedSchedUninstallFilters" Overridable="yes">IIS フィルタ アンインストールのスケジューリングに失敗しました。 ([2] [3] [4] [5])</String>
30 <String Id="msierrIISFailedSchedUninstallAppPool" Overridable="yes">IIS アプリケーション プール アンインストールのスケジューリングに失敗しました。 ([2] [3] [4] [5])</String>
31 <String Id="msierrIISFailedSchedUninstallProp" Overridable="yes">IIS プロパティ アンインストールのスケジューリングに失敗しました。 ([2] [3] [4] [5])</String>
32 <String Id="msierrIISFailedSchedUninstallWebSvcExt" Overridable="yes">IIS ウェブ サービス拡張アンインストールのスケジューリングに失敗しました。 ([2] [3] [4] [5])</String>
33
34 <String Id="msierrIISFailedStartTransaction" Overridable="yes">IIS トランザクション開始に失敗しました。 ([2] [3] [4] [5])</String>
35 <String Id="msierrIISFailedOpenKey" Overridable="yes">メタベース キーのオープンに失敗しました。 ([2] [3] [4] [5])</String>
36 <String Id="msierrIISFailedCreateKey" Overridable="yes">メタベース キーの作成に失敗しました。 ([2] [3] [4] [5])</String>
37 <String Id="msierrIISFailedWriteData" Overridable="yes">メタベース キーの書き込みに失敗しました。 ([2] [3] [4] [5])</String>
38 <String Id="msierrIISFailedCreateApp" Overridable="yes">ウェブ アプリケーションの作成に失敗しました。 ([2] [3] [4] [5])</String>
39 <String Id="msierrIISFailedDeleteKey" Overridable="yes">メタベース キーの削除に失敗しました。 ([2] [3] [4] [5])</String>
40 <String Id="msierrIISFailedDeleteValue" Overridable="yes">メタベース値の削除に失敗しました。 ([2] [3] [4] [5])</String>
41
42 <String Id="ConfigureIIs" Overridable="yes">IIS を構成しています</String>
43 <String Id="StartMetabaseTransaction" Overridable="yes">IIS メタベース トランザクションを開始しています</String>
44 <String Id="RollbackMetabaseTransaction" Overridable="yes">IIS メタベース トランザクションをロールバックしています</String>
45 <String Id="CommitMetabaseTransaction" Overridable="yes">IIS メタベース トランザクションを確定しています</String>
46 <String Id="WriteMetabaseChanges" Overridable="yes">IIS メタベース キーと値をインストールしています</String>
47</WixLocalization>
diff --git a/src/ext/Iis/wixlib/pt-br.wxl b/src/ext/Iis/wixlib/pt-br.wxl
new file mode 100644
index 00000000..1fc0d768
--- /dev/null
+++ b/src/ext/Iis/wixlib/pt-br.wxl
@@ -0,0 +1,50 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2
3
4<WixLocalization Culture="pt-br" xmlns="http://wixtoolset.org/schemas/v4/wxl">
5 <String Id="msierrIISCannotConnect" Overridable="yes">Não foi possível conectar no Internet Information Server. ([2] [3] [4] [5])</String>
6 <String Id="msierrIISFailedReadWebSite" Overridable="yes">Erro ao processar WebSites. ([2] [3] [4] [5])</String>
7 <String Id="msierrIISFailedReadWebDirs" Overridable="yes">Erro ao processar WebDirs. ([2] [3] [4] [5])</String>
8 <String Id="msierrIISFailedReadVDirs" Overridable="yes">Erro ao processar WebVirtualDirs. ([2] [3] [4] [5])</String>
9 <String Id="msierrIISFailedReadFilters" Overridable="yes">Erro ao processar WebFilters. ([2] [3] [4] [5])</String>
10 <String Id="msierrIISFailedReadMimeMap" Overridable="yes">Erro ao processar MimeMaps. ([2] [3] [4] [5])</String>
11 <String Id="msierrIISFailedReadAppPool" Overridable="yes">Erro ao processar WebAppPools. ([2] [3] [4] [5])</String>
12 <String Id="msierrIISFailedReadProp" Overridable="yes">Erro ao processar WebProperties. ([2] [3] [4] [5])</String>
13 <String Id="msierrIISFailedReadWebSvcExt" Overridable="yes">Erro ao processar WebServiceExtensions. ([2] [3] [4] [5])</String>
14 <String Id="msierrIISFailedReadWebError" Overridable="yes">Erro ao processar WebErrors. ([2] [3] [4] [5])</String>
15 <String Id="msierrIISFailedReadHttpHeader" Overridable="yes">Erro ao processar HttpHeaders. ([2] [3] [4] [5])</String>
16 <String Id="msierrIISFailedSchedTransaction" Overridable="yes">Erro ao agendar transação para alterações no IIS. ([2] [3] [4] [5])</String>
17 <String Id="msierrIISFailedSchedInstallWebs" Overridable="yes">Erro ao agendar instalação de IIS Web Sites. ([2] [3] [4] [5])</String>
18 <String Id="msierrIISFailedSchedInstallWebDirs" Overridable="yes">Erro ao agendar instalação de IIS Web Directories. ([2] [3] [4] [5])</String>
19 <String Id="msierrIISFailedSchedInstallVDirs" Overridable="yes">Erro ao agendar instalação de IIS Virtual Directories. ([2] [3] [4] [5])</String>
20 <String Id="msierrIISFailedSchedInstallFilters" Overridable="yes">Erro ao agendar instalação de IIS Filters. ([2] [3] [4] [5])</String>
21 <String Id="msierrIISFailedSchedInstallAppPool" Overridable="yes">Erro ao agendar instalação de IIS AppPools. ([2] [3] [4] [5])</String>
22 <String Id="msierrIISFailedSchedInstallProp" Overridable="yes">Erro ao agendar instalação de IIS Properties. ([2] [3] [4] [5])</String>
23 <String Id="msierrIISFailedSchedInstallWebSvcExt" Overridable="yes">Erro ao agendar instalação de IIS Web Service Extensions. ([2] [3] [4] [5])</String>
24 <String Id="msierrIISFailedSchedUninstallWebs" Overridable="yes">Erro ao agendar desinstalação de IIS Web Sites. ([2] [3] [4] [5])</String>
25 <String Id="msierrIISFailedSchedUninstallWebDirs" Overridable="yes">Erro ao agendar desinstalação de IIS Web Directories. ([2] [3] [4] [5])</String>
26 <String Id="msierrIISFailedSchedUninstallVDirs" Overridable="yes">Erro ao agendar desinstalação de IIS Virtual Directories. ([2] [3] [4] [5])</String>
27 <String Id="msierrIISFailedSchedUninstallFilters" Overridable="yes">Erro ao agendar desinstalação de IIS Filters. ([2] [3] [4] [5])</String>
28 <String Id="msierrIISFailedSchedUninstallAppPool" Overridable="yes">Erro ao agendar desinstalação de IIS AppPools. ([2] [3] [4] [5])</String>
29 <String Id="msierrIISFailedSchedUninstallProp" Overridable="yes">Erro ao agendar desinstalação de IIS Properties. ([2] [3] [4] [5])</String>
30 <String Id="msierrIISFailedSchedUninstallWebSvcExt" Overridable="yes">Erro ao agendar desinstalação de IIS Web Service Extensions. ([2] [3] [4] [5])</String>
31 <String Id="msierrIISFailedStartTransaction" Overridable="yes">Erro ao iniciar transação do IIS . ([2] [3] [4] [5])</String>
32 <String Id="msierrIISFailedOpenKey" Overridable="yes">Erro ao abrir metabase key. ([2] [3] [4] [5])</String>
33 <String Id="msierrIISFailedCreateKey" Overridable="yes">Erro ao criar metabase key. ([2] [3] [4] [5])</String>
34 <String Id="msierrIISFailedWriteData" Overridable="yes">Erro ao escrever dados na metabase key. ([2] [3] [4] [5])</String>
35 <String Id="msierrIISFailedCreateApp" Overridable="yes">Erro ao criar aplicação Web. ([2] [3] [4] [5])</String>
36 <String Id="msierrIISFailedDeleteKey" Overridable="yes">Erro ao excluir metabase key. ([2] [3] [4] [5])</String>
37 <String Id="msierrIISFailedDeleteValue" Overridable="yes">Erro ao excluir valor da metabase. ([2] [3] [4] [5])</String>
38 <String Id="msierrIISFailedCommitInUse" Overridable="yes">Erro ao fazer commit de transação IIS por violação de compartilhamento. Alguma outra aplicação pode estar tentando configurar o ISS ao mesmo tempo.</String>
39 <String Id="ConfigureIIs" Overridable="yes">Configurando IIS</String>
40 <String Id="ConfigureIIsExec" Overridable="yes">Executando Configurações do IIS</String>
41 <String Id="StartMetabaseTransaction" Overridable="yes">Iniciando Transação de Metabase do IIS</String>
42 <String Id="RollbackMetabaseTransaction" Overridable="yes">Cancelando Transação de Metabase do IIS</String>
43 <String Id="CommitMetabaseTransaction" Overridable="yes">Efetivando Transação de Metabase do IIS</String>
44 <String Id="WriteMetabaseChanges" Overridable="yes">Instalando Chaves e Valores de Metabase do IIS</String>
45 <String Id="ConfigureIIs7Exec" Overridable="yes">Configurando IIS</String>
46 <String Id="StartIIS7ConfigTransaction" Overridable="yes">Iniciando Transação de Configuração do IIS</String>
47 <String Id="RollbackIIS7ConfigTransaction" Overridable="yes">Cancelando Transação de Configuração do IIS</String>
48 <String Id="CommitIIS7ConfigTransaction" Overridable="yes">Efetivando Transação de Configuração do IIS</String>
49 <String Id="WriteIIS7ConfigChanges" Overridable="yes">Instalando Chaves e Valores de Configurações do IIS</String>
50</WixLocalization>
diff --git a/src/ext/NetFx/CustomizedNativeRecommendedRules.ruleset b/src/ext/NetFx/CustomizedNativeRecommendedRules.ruleset
new file mode 100644
index 00000000..142b141c
--- /dev/null
+++ b/src/ext/NetFx/CustomizedNativeRecommendedRules.ruleset
@@ -0,0 +1,8 @@
1<?xml version="1.0" encoding="utf-8"?>
2<RuleSet Name="Customized Microsoft Native Recommended Rules" Description="Microsoft Native Recommended Rules, -C26812" ToolsVersion="16.0">
3 <Include Path="nativerecommendedrules.ruleset" Action="Default" />
4 <Rules AnalyzerId="Microsoft.Analyzers.NativeCodeAnalysis" RuleNamespace="Microsoft.Rules.Native">
5 <!-- We need C style enums since we support BAs written in C -->
6 <Rule Id="C26812" Action="None" />
7 </Rules>
8</RuleSet> \ No newline at end of file
diff --git a/src/ext/NetFx/Directory.Build.props b/src/ext/NetFx/Directory.Build.props
new file mode 100644
index 00000000..b3c6287c
--- /dev/null
+++ b/src/ext/NetFx/Directory.Build.props
@@ -0,0 +1,27 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3<!--
4 Do NOT modify this file. Update the canonical version in Home\repo-template\src\Directory.Build.props
5 then update all of the repos.
6-->
7<Project>
8 <PropertyGroup>
9 <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
10 <EnableSourceLink Condition=" '$(NCrunch)' == '1' ">false</EnableSourceLink>
11 <MSBuildWarningsAsMessages>MSB3246</MSBuildWarningsAsMessages>
12
13 <ProjectName Condition=" '$(ProjectName)' == '' ">$(MSBuildProjectName)</ProjectName>
14 <BaseOutputPath>$([System.IO.Path]::GetFullPath($(MSBuildThisFileDirectory)..\build\))</BaseOutputPath>
15 <BaseIntermediateOutputPath>$(BaseOutputPath)obj\$(ProjectName)\</BaseIntermediateOutputPath>
16 <OutputPath>$(BaseOutputPath)$(Configuration)\</OutputPath>
17
18 <Authors>WiX Toolset Team</Authors>
19 <Company>WiX Toolset</Company>
20 <Copyright>Copyright (c) .NET Foundation and contributors. All rights reserved.</Copyright>
21 <PackageLicenseExpression>MS-RL</PackageLicenseExpression>
22 <Product>WiX Toolset</Product>
23 </PropertyGroup>
24
25 <Import Project="Directory$(MSBuildProjectExtension).props" Condition=" Exists('Directory$(MSBuildProjectExtension).props') " />
26 <Import Project="Custom.Build.props" Condition=" Exists('Custom.Build.props') " />
27</Project>
diff --git a/src/ext/NetFx/Directory.Build.targets b/src/ext/NetFx/Directory.Build.targets
new file mode 100644
index 00000000..2fcc765a
--- /dev/null
+++ b/src/ext/NetFx/Directory.Build.targets
@@ -0,0 +1,51 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3<!--
4 Do NOT modify this file. Update the canonical version in Home\repo-template\src\Directory.Build.targets
5 then update all of the repos.
6-->
7<!--
8 Replace PackageReferences with ProjectReferences when the projects can be found in .sln.
9 See the original here: https://github.com/dotnet/sdk/issues/1151#issuecomment-385133284
10-->
11<Project>
12 <PropertyGroup>
13 <ReplacePackageReferences>true</ReplacePackageReferences>
14 <TheSolutionPath Condition=" '$(NCrunch)'=='' ">$(SolutionPath)</TheSolutionPath>
15 <TheSolutionPath Condition=" '$(NCrunch)'=='1' ">$(NCrunchOriginalSolutionPath)</TheSolutionPath>
16 </PropertyGroup>
17
18 <Choose>
19 <When Condition="$(ReplacePackageReferences) AND '$(TheSolutionPath)' != '' AND '$(TheSolutionPath)' != '*undefined*' AND Exists('$(TheSolutionPath)')">
20
21 <PropertyGroup>
22 <SolutionFileContent>$([System.IO.File]::ReadAllText($(TheSolutionPath)))</SolutionFileContent>
23 <SmartSolutionDir>$([System.IO.Path]::GetDirectoryName( $(TheSolutionPath) ))</SmartSolutionDir>
24 <RegexPattern>(?&lt;="[PackageName]", ")(.*)(?=", ")</RegexPattern>
25 </PropertyGroup>
26
27 <ItemGroup>
28 <!-- Keep the identity of the PackageReference -->
29 <SmartPackageReference Include="@(PackageReference)">
30 <PackageName>%(Identity)</PackageName>
31 <InSolution>$(SolutionFileContent.Contains('\%(Identity).csproj'))</InSolution>
32 </SmartPackageReference>
33
34 <!-- Filter them by mapping them to another ItemGroup using the WithMetadataValue item function -->
35 <PackageInSolution Include="@(SmartPackageReference->WithMetadataValue('InSolution', True))">
36 <Pattern>$(RegexPattern.Replace('[PackageName]','%(PackageName)') )</Pattern>
37 <SmartPath>$([System.Text.RegularExpressions.Regex]::Match('$(SolutionFileContent)', '%(Pattern)'))</SmartPath>
38 </PackageInSolution>
39
40 <ProjectReference Include="@(PackageInSolution->'$(SmartSolutionDir)\%(SmartPath)' )"/>
41
42 <!-- Remove the package references that are now referenced as projects -->
43 <PackageReference Remove="@(PackageInSolution->'%(PackageName)')"/>
44 </ItemGroup>
45
46 </When>
47 </Choose>
48
49 <Import Project="Directory$(MSBuildProjectExtension).targets" Condition=" Exists('Directory$(MSBuildProjectExtension).targets') " />
50 <Import Project="Custom.Build.targets" Condition=" Exists('Custom.Build.targets') " />
51</Project>
diff --git a/src/ext/NetFx/Directory.csproj.props b/src/ext/NetFx/Directory.csproj.props
new file mode 100644
index 00000000..81d24ad1
--- /dev/null
+++ b/src/ext/NetFx/Directory.csproj.props
@@ -0,0 +1,13 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2<!--
3 Do NOT modify this file. Update the canonical version in Home\repo-template\src\CSharp.Build.props
4 then update all of the repos.
5-->
6<Project>
7 <PropertyGroup>
8 <CheckForOverflowUnderflow>true</CheckForOverflowUnderflow>
9 <SignAssembly>true</SignAssembly>
10 <AssemblyOriginatorKeyFile>$([System.IO.Path]::GetFullPath($(MSBuildThisFileDirectory)wix.snk))</AssemblyOriginatorKeyFile>
11 <NBGV_EmitThisAssemblyClass>false</NBGV_EmitThisAssemblyClass>
12 </PropertyGroup>
13</Project>
diff --git a/src/ext/NetFx/Directory.csproj.targets b/src/ext/NetFx/Directory.csproj.targets
new file mode 100644
index 00000000..c3270426
--- /dev/null
+++ b/src/ext/NetFx/Directory.csproj.targets
@@ -0,0 +1,26 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2<!--
3 Do NOT modify this file. Update the canonical version in Home\repo-template\src\Directory.csproj.targets
4 then update all of the repos.
5-->
6<Project>
7 <PropertyGroup>
8 <CreateDocumentation Condition=" '$(CreateDocumentationFile)'!='true' ">false</CreateDocumentation>
9 <DocumentationFile Condition=" '$(CreateDocumentationFile)'=='true' ">$(OutputPath)\$(AssemblyName).xml</DocumentationFile>
10 </PropertyGroup>
11
12 <Target Name="SetNuspecProperties" DependsOnTargets="InitializeSourceControlInformation" AfterTargets="GetBuildVersion"
13 Condition=" Exists('$(MSBuildProjectName).nuspec') ">
14 <PropertyGroup>
15 <ProjectUrl Condition=" '$(ProjectUrl)'=='' and '$(PrivateRepositoryUrl)'!='' ">$(PrivateRepositoryUrl.Replace('.git',''))</ProjectUrl>
16
17 <NuspecFile>$(MSBuildProjectName).nuspec</NuspecFile>
18 <NuspecBasePath Condition=" '$(NuspecBasePath)'=='' ">$(OutputPath)..\</NuspecBasePath>
19 <NuspecProperties>$(NuspecProperties);Id=$(PackageId);Authors=$(Authors);Copyright=$(Copyright);Description=$(Description);Title=$(Title)</NuspecProperties>
20 <NuspecProperties>$(NuspecProperties);Version=$(PackageVersion);RepositoryCommit=$(SourceRevisionId);RepositoryType=$(RepositoryType);RepositoryUrl=$(PrivateRepositoryUrl);ProjectFolder=$(MSBuildProjectDirectory)\;ProjectUrl=$(ProjectUrl)</NuspecProperties>
21 <PublishRepositoryUrl>true</PublishRepositoryUrl>
22 <SymbolPackageFormat>snupkg</SymbolPackageFormat>
23 </PropertyGroup>
24 </Target>
25
26</Project>
diff --git a/src/ext/NetFx/Directory.vcxproj.props b/src/ext/NetFx/Directory.vcxproj.props
new file mode 100644
index 00000000..47c2c143
--- /dev/null
+++ b/src/ext/NetFx/Directory.vcxproj.props
@@ -0,0 +1,115 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3
4<Project>
5 <PropertyGroup>
6 <Platform Condition=" '$(Platform)' == '' OR '$(Platform)' == 'AnyCPU' ">Win32</Platform>
7 <IntDir>$(BaseIntermediateOutputPath)$(Configuration)\$(Platform)\</IntDir>
8 <OutDir>$(OutputPath)$(Platform)\</OutDir>
9
10 <!-- NBGV properties -->
11 <AssemblyCompany>$(Company)</AssemblyCompany>
12 <AssemblyCopyright>$(Copyright)</AssemblyCopyright>
13
14 <RuntimeIdentifiers>win-x86;win-x64;win-arm64</RuntimeIdentifiers>
15 <NuGetTargetMoniker>native,Version=v0.0</NuGetTargetMoniker>
16 </PropertyGroup>
17
18 <PropertyGroup Condition="'$(WindowsTargetPlatformVersion)'=='' AND '$(VisualStudioVersion)'>='15.0'">
19 <WindowsTargetPlatformVersion>$([Microsoft.Build.Utilities.ToolLocationHelper]::GetLatestSDKTargetPlatformVersion('Windows', '10.0'))</WindowsTargetPlatformVersion>
20 </PropertyGroup>
21
22 <PropertyGroup>
23 <CodeAnalysisRuleSet>$(MSBuildThisFileDirectory)CustomizedNativeRecommendedRules.ruleset</CodeAnalysisRuleSet>
24 </PropertyGroup>
25
26 <ItemDefinitionGroup>
27 <ClCompile>
28 <DisableSpecificWarnings>$(DisableSpecificCompilerWarnings)</DisableSpecificWarnings>
29 <WarningLevel>Level4</WarningLevel>
30 <AdditionalIncludeDirectories>$(ProjectDir)inc;$(MSBuildProjectDirectory);$(IntDir);$(SqlCESdkIncludePath);$(ProjectAdditionalIncludeDirectories);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
31 <PreprocessorDefinitions>WIN32;_WINDOWS;_WIN32_MSI=500;_WIN32_WINNT=0x0501;$(ArmPreprocessorDefinitions);$(UnicodePreprocessorDefinitions);_CRT_STDIO_LEGACY_WIDE_SPECIFIERS;_WINSOCK_DEPRECATED_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
32 <PrecompiledHeader>Use</PrecompiledHeader>
33 <PrecompiledHeaderFile>precomp.h</PrecompiledHeaderFile>
34 <CallingConvention Condition="'$(Platform)'=='Win32'">StdCall</CallingConvention>
35 <TreatWarningAsError>true</TreatWarningAsError>
36 <ExceptionHandling>false</ExceptionHandling>
37 <AdditionalOptions>-YlprecompDefine</AdditionalOptions>
38 <AdditionalOptions Condition=" $(PlatformToolset.StartsWith('v14')) ">/Zc:threadSafeInit- %(AdditionalOptions)</AdditionalOptions>
39 <MultiProcessorCompilation Condition=" $(NUMBER_OF_PROCESSORS) &gt; 4 ">true</MultiProcessorCompilation>
40 </ClCompile>
41 <ResourceCompile>
42 <PreprocessorDefinitions>$(ArmPreprocessorDefinitions);%(PreprocessorDefinitions)</PreprocessorDefinitions>
43 <AdditionalIncludeDirectories>$(ProjectAdditionalResourceIncludeDirectories);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
44 </ResourceCompile>
45 <Lib>
46 <AdditionalLibraryDirectories>$(OutDir);$(AdditionalMultiTargetLibraryPath);$(ProjectAdditionalLibraryDirectories);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
47 </Lib>
48 <Link>
49 <SubSystem>$(ProjectSubSystem)</SubSystem>
50 <ModuleDefinitionFile>$(ProjectModuleDefinitionFile)</ModuleDefinitionFile>
51 <NoEntryPoint>$(ResourceOnlyDll)</NoEntryPoint>
52 <GenerateDebugInformation>true</GenerateDebugInformation>
53 <AdditionalDependencies>$(ProjectAdditionalLinkLibraries);advapi32.lib;comdlg32.lib;user32.lib;oleaut32.lib;gdi32.lib;shell32.lib;ole32.lib;version.lib;%(AdditionalDependencies)</AdditionalDependencies>
54 <AdditionalLibraryDirectories>$(OutDir);$(AdditionalMultiTargetLibraryPath);$(ArmLibraryDirectories);$(ProjectAdditionalLinkLibraryDirectories);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
55 <AdditionalOptions Condition=" $(PlatformToolset.StartsWith('v14')) ">/IGNORE:4099 %(AdditionalOptions)</AdditionalOptions>
56 </Link>
57 </ItemDefinitionGroup>
58
59 <ItemDefinitionGroup Condition=" '$(Platform)'=='Win32' and '$(PlatformToolset)'!='v100'">
60 <ClCompile>
61 <EnableEnhancedInstructionSet>NoExtensions</EnableEnhancedInstructionSet>
62 </ClCompile>
63 </ItemDefinitionGroup>
64 <ItemDefinitionGroup Condition=" '$(Platform)'=='arm' ">
65 <ClCompile>
66 <CallingConvention>CDecl</CallingConvention>
67 </ClCompile>
68 </ItemDefinitionGroup>
69 <ItemDefinitionGroup Condition=" '$(ConfigurationType)'=='StaticLibrary' ">
70 <ClCompile>
71 <DebugInformationFormat>OldStyle</DebugInformationFormat>
72 <OmitDefaultLibName>true</OmitDefaultLibName>
73 <IgnoreAllDefaultLibraries>true</IgnoreAllDefaultLibraries>
74 </ClCompile>
75 </ItemDefinitionGroup>
76 <ItemDefinitionGroup Condition=" '$(Configuration)'=='Debug' ">
77 <ClCompile>
78 <Optimization>Disabled</Optimization>
79 <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
80 <PreprocessorDefinitions>_DEBUG;DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
81 <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
82 </ClCompile>
83 </ItemDefinitionGroup>
84 <ItemDefinitionGroup Condition=" '$(Configuration)'=='Debug' and '$(CLRSupport)'=='true' ">
85 <ClCompile>
86 <BasicRuntimeChecks></BasicRuntimeChecks>
87 <RuntimeLibrary>MultiThreadedDebugDll</RuntimeLibrary>
88 </ClCompile>
89 </ItemDefinitionGroup>
90 <ItemDefinitionGroup Condition=" '$(Configuration)'=='Release' ">
91 <ClCompile>
92 <Optimization>MinSpace</Optimization>
93 <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
94 <FunctionLevelLinking>true</FunctionLevelLinking>
95 <IntrinsicFunctions>true</IntrinsicFunctions>
96 <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
97 </ClCompile>
98 <Link>
99 <EnableCOMDATFolding>true</EnableCOMDATFolding>
100 <OptimizeReferences>true</OptimizeReferences>
101 </Link>
102 </ItemDefinitionGroup>
103 <ItemDefinitionGroup Condition=" '$(Configuration)'=='Release' and '$(CLRSupport)'=='true' ">
104 <ClCompile>
105 <BasicRuntimeChecks></BasicRuntimeChecks>
106 <RuntimeLibrary>MultiThreadedDll</RuntimeLibrary>
107 </ClCompile>
108 </ItemDefinitionGroup>
109 <ItemDefinitionGroup Condition=" '$(CLRSupport)'=='true' ">
110 <Link>
111 <KeyFile>$(LinkKeyFile)</KeyFile>
112 <DelaySign>$(LinkDelaySign)</DelaySign>
113 </Link>
114 </ItemDefinitionGroup>
115</Project>
diff --git a/src/ext/NetFx/NetFx.wixext.sln b/src/ext/NetFx/NetFx.wixext.sln
new file mode 100644
index 00000000..e830aeea
--- /dev/null
+++ b/src/ext/NetFx/NetFx.wixext.sln
@@ -0,0 +1,75 @@
1
2Microsoft Visual Studio Solution File, Format Version 12.00
3# Visual Studio 15
4VisualStudioVersion = 15.0.27130.2010
5MinimumVisualStudioVersion = 15.0.26124.0
6Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "netfxca", "src\ca\netfxca.vcxproj", "{F72D34CA-48DA-4DFD-91A9-A0C78BEF6981}"
7EndProject
8Project("{930C7802-8A8C-48F9-8165-68863BCCD9DD}") = "netfx", "src\wixlib\netfx.wixproj", "{45E4A6AC-3190-4E17-83F0-9935FFA5DC2B}"
9EndProject
10Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WixToolset.Netfx.wixext", "src\wixext\WixToolset.Netfx.wixext.csproj", "{F774E291-0563-4DDD-B873-F5C31683CF4B}"
11EndProject
12Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WixToolsetTest.Netfx", "src\test\WixToolsetTest.Netfx\WixToolsetTest.Netfx.csproj", "{AABEF178-D4A2-4EE1-8E00-3EBAB23A5548}"
13EndProject
14Global
15 GlobalSection(SolutionConfigurationPlatforms) = preSolution
16 Debug|Any CPU = Debug|Any CPU
17 Debug|x64 = Debug|x64
18 Debug|x86 = Debug|x86
19 Release|Any CPU = Release|Any CPU
20 Release|x64 = Release|x64
21 Release|x86 = Release|x86
22 EndGlobalSection
23 GlobalSection(ProjectConfigurationPlatforms) = postSolution
24 {F72D34CA-48DA-4DFD-91A9-A0C78BEF6981}.Debug|Any CPU.ActiveCfg = Debug|Win32
25 {F72D34CA-48DA-4DFD-91A9-A0C78BEF6981}.Debug|Any CPU.Build.0 = Debug|Win32
26 {F72D34CA-48DA-4DFD-91A9-A0C78BEF6981}.Debug|x64.ActiveCfg = Debug|Win32
27 {F72D34CA-48DA-4DFD-91A9-A0C78BEF6981}.Debug|x86.ActiveCfg = Debug|Win32
28 {F72D34CA-48DA-4DFD-91A9-A0C78BEF6981}.Debug|x86.Build.0 = Debug|Win32
29 {F72D34CA-48DA-4DFD-91A9-A0C78BEF6981}.Release|Any CPU.ActiveCfg = Release|Win32
30 {F72D34CA-48DA-4DFD-91A9-A0C78BEF6981}.Release|Any CPU.Build.0 = Release|Win32
31 {F72D34CA-48DA-4DFD-91A9-A0C78BEF6981}.Release|x64.ActiveCfg = Release|Win32
32 {F72D34CA-48DA-4DFD-91A9-A0C78BEF6981}.Release|x86.ActiveCfg = Release|Win32
33 {F72D34CA-48DA-4DFD-91A9-A0C78BEF6981}.Release|x86.Build.0 = Release|Win32
34 {45E4A6AC-3190-4E17-83F0-9935FFA5DC2B}.Debug|Any CPU.ActiveCfg = Debug|x86
35 {45E4A6AC-3190-4E17-83F0-9935FFA5DC2B}.Debug|Any CPU.Build.0 = Debug|x86
36 {45E4A6AC-3190-4E17-83F0-9935FFA5DC2B}.Debug|x64.ActiveCfg = Debug|x86
37 {45E4A6AC-3190-4E17-83F0-9935FFA5DC2B}.Debug|x86.ActiveCfg = Debug|x86
38 {45E4A6AC-3190-4E17-83F0-9935FFA5DC2B}.Debug|x86.Build.0 = Debug|x86
39 {45E4A6AC-3190-4E17-83F0-9935FFA5DC2B}.Release|Any CPU.ActiveCfg = Release|x86
40 {45E4A6AC-3190-4E17-83F0-9935FFA5DC2B}.Release|Any CPU.Build.0 = Release|x86
41 {45E4A6AC-3190-4E17-83F0-9935FFA5DC2B}.Release|x64.ActiveCfg = Release|x86
42 {45E4A6AC-3190-4E17-83F0-9935FFA5DC2B}.Release|x86.ActiveCfg = Release|x86
43 {45E4A6AC-3190-4E17-83F0-9935FFA5DC2B}.Release|x86.Build.0 = Release|x86
44 {F774E291-0563-4DDD-B873-F5C31683CF4B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
45 {F774E291-0563-4DDD-B873-F5C31683CF4B}.Debug|Any CPU.Build.0 = Debug|Any CPU
46 {F774E291-0563-4DDD-B873-F5C31683CF4B}.Debug|x64.ActiveCfg = Debug|Any CPU
47 {F774E291-0563-4DDD-B873-F5C31683CF4B}.Debug|x64.Build.0 = Debug|Any CPU
48 {F774E291-0563-4DDD-B873-F5C31683CF4B}.Debug|x86.ActiveCfg = Debug|Any CPU
49 {F774E291-0563-4DDD-B873-F5C31683CF4B}.Debug|x86.Build.0 = Debug|Any CPU
50 {F774E291-0563-4DDD-B873-F5C31683CF4B}.Release|Any CPU.ActiveCfg = Release|Any CPU
51 {F774E291-0563-4DDD-B873-F5C31683CF4B}.Release|Any CPU.Build.0 = Release|Any CPU
52 {F774E291-0563-4DDD-B873-F5C31683CF4B}.Release|x64.ActiveCfg = Release|Any CPU
53 {F774E291-0563-4DDD-B873-F5C31683CF4B}.Release|x64.Build.0 = Release|Any CPU
54 {F774E291-0563-4DDD-B873-F5C31683CF4B}.Release|x86.ActiveCfg = Release|Any CPU
55 {F774E291-0563-4DDD-B873-F5C31683CF4B}.Release|x86.Build.0 = Release|Any CPU
56 {AABEF178-D4A2-4EE1-8E00-3EBAB23A5548}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
57 {AABEF178-D4A2-4EE1-8E00-3EBAB23A5548}.Debug|Any CPU.Build.0 = Debug|Any CPU
58 {AABEF178-D4A2-4EE1-8E00-3EBAB23A5548}.Debug|x64.ActiveCfg = Debug|Any CPU
59 {AABEF178-D4A2-4EE1-8E00-3EBAB23A5548}.Debug|x64.Build.0 = Debug|Any CPU
60 {AABEF178-D4A2-4EE1-8E00-3EBAB23A5548}.Debug|x86.ActiveCfg = Debug|Any CPU
61 {AABEF178-D4A2-4EE1-8E00-3EBAB23A5548}.Debug|x86.Build.0 = Debug|Any CPU
62 {AABEF178-D4A2-4EE1-8E00-3EBAB23A5548}.Release|Any CPU.ActiveCfg = Release|Any CPU
63 {AABEF178-D4A2-4EE1-8E00-3EBAB23A5548}.Release|Any CPU.Build.0 = Release|Any CPU
64 {AABEF178-D4A2-4EE1-8E00-3EBAB23A5548}.Release|x64.ActiveCfg = Release|Any CPU
65 {AABEF178-D4A2-4EE1-8E00-3EBAB23A5548}.Release|x64.Build.0 = Release|Any CPU
66 {AABEF178-D4A2-4EE1-8E00-3EBAB23A5548}.Release|x86.ActiveCfg = Release|Any CPU
67 {AABEF178-D4A2-4EE1-8E00-3EBAB23A5548}.Release|x86.Build.0 = Release|Any CPU
68 EndGlobalSection
69 GlobalSection(SolutionProperties) = preSolution
70 HideSolutionNode = FALSE
71 EndGlobalSection
72 GlobalSection(ExtensibilityGlobals) = postSolution
73 SolutionGuid = {E4566A6B-47D0-4EA0-989A-D763AC39105D}
74 EndGlobalSection
75EndGlobal
diff --git a/src/ext/NetFx/README.md b/src/ext/NetFx/README.md
new file mode 100644
index 00000000..a31cfd1d
--- /dev/null
+++ b/src/ext/NetFx/README.md
@@ -0,0 +1,2 @@
1# NetFx.wixext
2WixToolset.NetFx.wixext - .NET Framework WiX Toolset Extension
diff --git a/src/ext/NetFx/appveyor.cmd b/src/ext/NetFx/appveyor.cmd
new file mode 100644
index 00000000..d7e705f0
--- /dev/null
+++ b/src/ext/NetFx/appveyor.cmd
@@ -0,0 +1,19 @@
1@setlocal
2@pushd %~dp0
3@set _C=Release
4@if /i "%1"=="debug" set _C=Debug
5
6:: Restore
7msbuild -p:Configuration=%_C% -t:Restore || exit /b
8
9:: Build
10msbuild -p:Configuration=%_C% src\test\WixToolsetTest.Netfx\WixToolsetTest.Netfx.csproj || exit /b
11
12:: Test
13dotnet test -c %_C% --no-build src\test\WixToolsetTest.Netfx || exit /b
14
15:: Pack
16msbuild -p:Configuration=%_C% -p:NoBuild=true -t:Pack src\wixext\WixToolset.Netfx.wixext.csproj || exit /b
17
18@popd
19@endlocal
diff --git a/src/ext/NetFx/appveyor.yml b/src/ext/NetFx/appveyor.yml
new file mode 100644
index 00000000..c53cc9cc
--- /dev/null
+++ b/src/ext/NetFx/appveyor.yml
@@ -0,0 +1,42 @@
1# Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2#
3# Do NOT modify this file. Update the canonical version in Home\repo-template\src\appveyor.yml
4# then update all of the repos.
5
6branches:
7 only:
8 - master
9 - develop
10
11image: Visual Studio 2019
12
13version: 0.0.0.{build}
14configuration: Release
15
16environment:
17 DOTNET_SKIP_FIRST_TIME_EXPERIENCE: true
18 DOTNET_CLI_TELEMETRY_OPTOUT: 1
19 NUGET_XMLDOC_MODE: skip
20
21build_script:
22 - appveyor.cmd
23
24pull_requests:
25 do_not_increment_build_number: true
26
27nuget:
28 disable_publish_on_pr: true
29
30skip_branch_with_pr: true
31skip_tags: true
32
33artifacts:
34- path: build\Release\**\*.nupkg
35 name: nuget
36- path: build\Release\**\*.snupkg
37 name: snupkg
38
39notifications:
40- provider: Slack
41 incoming_webhook:
42 secure: p5xuu+4x2JHfwGDMDe5KcG1k7gZxqYc4jWVwvyNZv5cvkubPD2waJs5yXMAXZNN7Z63/3PWHb7q4KoY/99AjauYa1nZ4c5qYqRPFRBKTHfA=
diff --git a/src/ext/NetFx/ca/caDecor.h b/src/ext/NetFx/ca/caDecor.h
new file mode 100644
index 00000000..da274650
--- /dev/null
+++ b/src/ext/NetFx/ca/caDecor.h
@@ -0,0 +1,13 @@
1#pragma once
2// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
3
4
5#if defined(_M_ARM64)
6#define CUSTOM_ACTION_DECORATION(f) L"Wix4" f L"_A64"
7#elif defined(_M_AMD64)
8#define CUSTOM_ACTION_DECORATION(f) L"Wix4" f L"_X64"
9#elif defined(_M_ARM)
10#define CUSTOM_ACTION_DECORATION(f) L"Wix4" f L"_ARM"
11#else
12#define CUSTOM_ACTION_DECORATION(f) L"Wix4" f L"_X86"
13#endif
diff --git a/src/ext/NetFx/ca/cost.h b/src/ext/NetFx/ca/cost.h
new file mode 100644
index 00000000..95368eba
--- /dev/null
+++ b/src/ext/NetFx/ca/cost.h
@@ -0,0 +1,7 @@
1#pragma once
2// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
3
4
5const UINT COST_NGEN_BLOCKING = 5000;
6const UINT COST_NGEN_NONBLOCKING = 500;
7
diff --git a/src/ext/NetFx/ca/dllmain.cpp b/src/ext/NetFx/ca/dllmain.cpp
new file mode 100644
index 00000000..df53f872
--- /dev/null
+++ b/src/ext/NetFx/ca/dllmain.cpp
@@ -0,0 +1,26 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3#include "precomp.h"
4
5/********************************************************************
6DllMain - standard entry point for all WiX CustomActions
7
8********************************************************************/
9extern "C" BOOL WINAPI DllMain(
10 IN HINSTANCE hInst,
11 IN ULONG ulReason,
12 IN LPVOID)
13{
14 switch(ulReason)
15 {
16 case DLL_PROCESS_ATTACH:
17 WcaGlobalInitialize(hInst);
18 break;
19
20 case DLL_PROCESS_DETACH:
21 WcaGlobalFinalize();
22 break;
23 }
24
25 return TRUE;
26}
diff --git a/src/ext/NetFx/ca/netfxca.cpp b/src/ext/NetFx/ca/netfxca.cpp
new file mode 100644
index 00000000..3a71babf
--- /dev/null
+++ b/src/ext/NetFx/ca/netfxca.cpp
@@ -0,0 +1,823 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3#include "precomp.h"
4
5#define NGEN_DEBUG 0x0001
6#define NGEN_NODEP 0x0002
7#define NGEN_PROFILE 0x0004
8#define NGEN_32BIT 0x0008
9#define NGEN_64BIT 0x0010
10
11#define NGEN_TIMEOUT 60000 // 60 seconds
12
13// If you change one of these strings, be sure to change the appropriate EmptyFormattedLength variable right below
14LPCWSTR vpwzUnformattedQuotedFile = L"\"[#%s]\"";
15LPCWSTR vpwzUnformattedQuotedDirectory = L"\"[%s]\\\"";
16
17// These represent the length of the above strings in the case that the property resolves to an empty string
18const DWORD EMPTY_FORMATTED_LENGTH_QUOTED_FILE = 2;
19const DWORD EMPTY_FORMATTED_LENGTH_QUOTED_DIRECTORY = 3;
20
21LPCWSTR vcsFileId =
22 L"SELECT `File` FROM `File` WHERE `File`=?";
23enum eFileId { fiFile = 1 };
24
25LPCWSTR vcsNgenQuery =
26 L"SELECT `Wix4NetFxNativeImage`.`File_`, `Wix4NetFxNativeImage`.`Wix4NetFxNativeImage`, `Wix4NetFxNativeImage`.`Priority`, `Wix4NetFxNativeImage`.`Attributes`, `Wix4NetFxNativeImage`.`File_Application`, `Wix4NetFxNativeImage`.`Directory_ApplicationBase`, `File`.`Component_` "
27 L"FROM `Wix4NetFxNativeImage`, `File` WHERE `File`.`File`=`Wix4NetFxNativeImage`.`File_`";
28enum eNgenQuery { ngqFile = 1, ngqId, ngqPriority, ngqAttributes, ngqFileApp, ngqDirAppBase, ngqComponent };
29
30LPCWSTR vcsNgenGac =
31 L"SELECT `MsiAssembly`.`File_Application` "
32 L"FROM `File`, `MsiAssembly` WHERE `File`.`Component_`=`MsiAssembly`.`Component_` AND `File`.`File`=?";
33enum eNgenGac { nggApplication = 1 };
34
35LPCWSTR vcsNgenStrongName =
36 L"SELECT `Name`,`Value` FROM `MsiAssemblyName` WHERE `Component_`=?";
37enum eNgenStrongName { ngsnName = 1, ngsnValue };
38
39// Searches subdirectories of the given path for the highest version of ngen.exe available
40static HRESULT GetNgenVersion(
41 __in LPWSTR pwzParentPath,
42 __out LPWSTR* ppwzVersion
43 )
44{
45 Assert(pwzParentPath);
46
47 HRESULT hr = S_OK;
48 DWORD dwError = 0;
49 DWORD dwNgenFileFlags = 0;
50
51 LPWSTR pwzVersionSearch = NULL;
52 LPWSTR pwzNgen = NULL;
53 LPWSTR pwzTemp = NULL;
54 LPWSTR pwzTempVersion = NULL;
55 DWORD dwMaxMajorVersion = 0; // This stores the highest major version we've seen so far
56 DWORD dwMaxMinorVersion = 0; // This stores the minor version of the highest major version we've seen so far
57 DWORD dwMajorVersion = 0; // This stores the major version of the directory we're currently considering
58 DWORD dwMinorVersion = 0; // This stores the minor version of the directory we're currently considering
59 BOOL fFound = TRUE;
60 WIN32_FIND_DATAW wfdVersionDirectories;
61 HANDLE hFind = INVALID_HANDLE_VALUE;
62
63 hr = StrAllocFormatted(&pwzVersionSearch, L"%s*", pwzParentPath);
64 ExitOnFailure(hr, "failed to create outer directory search string from string %ls", pwzParentPath);
65 hFind = FindFirstFileW(pwzVersionSearch, &wfdVersionDirectories);
66 if (hFind == INVALID_HANDLE_VALUE)
67 {
68 ExitWithLastError(hr, "failed to call FindFirstFileW with string %ls", pwzVersionSearch);
69 }
70
71 while (fFound)
72 {
73 pwzTempVersion = (LPWSTR)&(wfdVersionDirectories.cFileName);
74
75 // Explicitly exclude v1.1.4322, which isn't backwards compatible and is not supported
76 if (wfdVersionDirectories.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
77 {
78 if (0 != lstrcmpW(L"v1.1.4322", pwzTempVersion))
79 {
80 // A potential candidate directory was found to run ngen from - let's make sure ngen actually exists here
81 hr = StrAllocFormatted(&pwzNgen, L"%s%s\\ngen.exe", pwzParentPath, pwzTempVersion);
82 ExitOnFailure(hr, "failed to create inner ngen search string with strings %ls and %ls", pwzParentPath, pwzTempVersion);
83
84 // If Ngen.exe does exist as a file here, then let's check the file version
85 if (FileExistsEx(pwzNgen, &dwNgenFileFlags) && (0 == (dwNgenFileFlags & FILE_ATTRIBUTE_DIRECTORY)))
86 {
87 hr = FileVersion(pwzNgen, &dwMajorVersion, &dwMinorVersion);
88
89 if (FAILED(hr))
90 {
91 WcaLog(LOGMSG_VERBOSE, "Failed to get version of %ls - continuing", pwzNgen);
92 }
93 else if (dwMajorVersion > dwMaxMajorVersion || (dwMajorVersion == dwMaxMajorVersion && dwMinorVersion > dwMaxMinorVersion))
94 {
95 // If the version we found is the highest we've seen so far in this search, it will be our new best-so-far candidate
96 hr = StrAllocString(ppwzVersion, pwzTempVersion, 0);
97 ExitOnFailure(hr, "failed to copy temp version string %ls to version string", pwzTempVersion);
98 // Add one for the backslash after the directory name
99 WcaLog(LOGMSG_VERBOSE, "Found highest-so-far version of ngen.exe (in directory %ls, version %u.%u.%u.%u)", *ppwzVersion, (DWORD)HIWORD(dwMajorVersion), (DWORD)LOWORD(dwMajorVersion), (DWORD)HIWORD(dwMinorVersion), (DWORD)LOWORD(dwMinorVersion));
100
101 dwMaxMajorVersion = dwMajorVersion;
102 dwMaxMinorVersion = dwMinorVersion;
103 }
104 }
105 else
106 {
107 WcaLog(LOGMSG_VERBOSE, "Ignoring %ls because it doesn't contain the file ngen.exe", pwzTempVersion);
108 }
109 }
110 else
111 {
112 WcaLog(LOGMSG_VERBOSE, "Ignoring %ls because it is from .NET Framework v1.1, which is not backwards compatible with other versions of the Framework and thus is not supported by this custom action.", pwzTempVersion);
113 }
114 }
115 else
116 {
117 WcaLog(LOGMSG_VERBOSE, "Ignoring %ls because it isn't a directory", pwzTempVersion);
118 }
119
120 fFound = FindNextFileW(hFind, &wfdVersionDirectories);
121
122 if (!fFound)
123 {
124 dwError = ::GetLastError();
125 hr = (ERROR_NO_MORE_FILES == dwError) ? ERROR_SUCCESS : HRESULT_FROM_WIN32(dwError);
126 ExitOnFailure(hr, "Failed to call FindNextFileW() with query %ls", pwzVersionSearch);
127 }
128 }
129
130 if (NULL == *ppwzVersion)
131 {
132 hr = HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND);
133 ExitOnRootFailure(hr, "Searched through all subdirectories of %ls, but failed to find any version of ngen.exe", pwzParentPath);
134 }
135 else
136 {
137 WcaLog(LOGMSG_VERBOSE, "Using highest version of ngen found, located in this subdirectory: %ls, version %u.%u.%u.%u", *ppwzVersion, (DWORD)HIWORD(dwMajorVersion), (DWORD)LOWORD(dwMajorVersion), (DWORD)HIWORD(dwMinorVersion), (DWORD)LOWORD(dwMinorVersion));
138 }
139
140LExit:
141 if (hFind != INVALID_HANDLE_VALUE)
142 {
143 if (0 == FindClose(hFind))
144 {
145 dwError = ::GetLastError();
146 hr = HRESULT_FROM_WIN32(dwError);
147 WcaLog(LOGMSG_STANDARD, "Failed to close handle created by outer FindFirstFile with error %x - continuing", hr);
148 }
149 hFind = INVALID_HANDLE_VALUE;
150 }
151
152 ReleaseStr(pwzVersionSearch);
153 ReleaseStr(pwzNgen);
154 ReleaseStr(pwzTemp);
155 // Purposely don't release pwzTempVersion, because it wasn't allocated in this function, it's just a pointer to a string inside wfdVersionDirectories
156
157 return hr;
158}
159
160// Gets the path to ngen.exe
161static HRESULT GetNgenPath(
162 __out LPWSTR* ppwzNgenPath,
163 __in BOOL f64BitFramework
164 )
165{
166 Assert(ppwzNgenPath);
167 HRESULT hr = S_OK;
168
169 LPWSTR pwzVersion = NULL;
170 LPWSTR pwzWindowsFolder = NULL;
171
172 hr = WcaGetProperty(L"WindowsFolder", &pwzWindowsFolder);
173 ExitOnFailure(hr, "failed to get WindowsFolder property");
174
175 hr = StrAllocString(ppwzNgenPath, pwzWindowsFolder, 0);
176 ExitOnFailure(hr, "failed to copy to NgenPath windows folder: %ls", pwzWindowsFolder);
177
178 if (f64BitFramework)
179 {
180 WcaLog(LOGMSG_VERBOSE, "Searching for ngen under 64-bit framework path");
181
182 hr = StrAllocConcat(ppwzNgenPath, L"Microsoft.NET\\Framework64\\", 0);
183 ExitOnFailure(hr, "failed to copy platform portion of ngen path");
184 }
185 else
186 {
187 WcaLog(LOGMSG_VERBOSE, "Searching for ngen under 32-bit framework path");
188
189 hr = StrAllocConcat(ppwzNgenPath, L"Microsoft.NET\\Framework\\", 0);
190 ExitOnFailure(hr, "failed to copy platform portion of ngen path");
191 }
192
193 // We want to run the highest version of ngen possible, because they should be backwards compatible - so let's find the most appropriate directory now
194 hr = GetNgenVersion(*ppwzNgenPath, &pwzVersion);
195 ExitOnFailure(hr, "failed to search for ngen under path %ls", *ppwzNgenPath);
196
197 hr = StrAllocConcat(ppwzNgenPath, pwzVersion, 0);
198 ExitOnFailure(hr, "failed to copy version portion of ngen path");
199
200 hr = StrAllocConcat(ppwzNgenPath, L"\\ngen.exe", 0);
201 ExitOnFailure(hr, "failed to copy \"\\ngen.exe\" portion of ngen path");
202
203LExit:
204 ReleaseStr(pwzVersion);
205 ReleaseStr(pwzWindowsFolder);
206
207 return hr;
208}
209
210
211static HRESULT GetStrongName(
212 __out LPWSTR* ppwzStrongName,
213 __in LPCWSTR pwzComponent
214 )
215{
216 Assert(ppwzStrongName);
217 HRESULT hr = S_OK;
218
219 PMSIHANDLE hView = NULL;
220 PMSIHANDLE hComponentRec = NULL;
221 PMSIHANDLE hRec = NULL;
222
223 LPWSTR pwzData = NULL;
224 LPWSTR pwzName = NULL;
225 LPWSTR pwzVersion = NULL;
226 LPWSTR pwzCulture = NULL;
227 LPWSTR pwzPublicKeyToken = NULL;
228
229 hComponentRec = ::MsiCreateRecord(1);
230 hr = WcaSetRecordString(hComponentRec, 1, pwzComponent);
231 ExitOnFailure(hr, "failed to set component value in record to: %ls", pwzComponent);
232
233 // get the name value records for this component
234 hr = WcaOpenView(vcsNgenStrongName, &hView);
235 ExitOnFailure(hr, "failed to open view on Wix4NetFxNativeImage table");
236
237 hr = WcaExecuteView(hView, hComponentRec);
238 ExitOnFailure(hr, "failed to execute strong name view");
239
240 while (S_OK == (hr = WcaFetchRecord(hView, &hRec)))
241 {
242 hr = WcaGetRecordString(hRec, ngsnName, &pwzData);
243 ExitOnFailure(hr, "failed to get MsiAssemblyName.Name for component: %ls", pwzComponent);
244
245 if (0 == lstrcmpW(L"name", pwzData))
246 {
247 hr = WcaGetRecordString(hRec, ngsnValue, &pwzName);
248 ExitOnFailure(hr, "failed to get MsiAssemblyName.Value for component: %ls Name: %ls", pwzComponent, pwzData);
249 }
250 else if (0 == lstrcmpW(L"version", pwzData))
251 {
252 hr = WcaGetRecordString(hRec, ngsnValue, &pwzVersion);
253 ExitOnFailure(hr, "failed to get MsiAssemblyName.Value for component: %ls Name: %ls", pwzComponent, pwzData);
254 }
255 else if (0 == lstrcmpW(L"culture", pwzData))
256 {
257 hr = WcaGetRecordString(hRec, ngsnValue, &pwzCulture);
258 ExitOnFailure(hr, "failed to get MsiAssemblyName.Value for component: %ls Name: %ls", pwzComponent, pwzData);
259 }
260 else if (0 == lstrcmpW(L"publicKeyToken", pwzData))
261 {
262 hr = WcaGetRecordString(hRec, ngsnValue, &pwzPublicKeyToken);
263 ExitOnFailure(hr, "failed to get MsiAssemblyName.Value for component: %ls Name: %ls", pwzComponent, pwzData);
264 }
265 }
266 if (E_NOMOREITEMS == hr)
267 hr = S_OK;
268 ExitOnFailure(hr, "failed while looping through all names and values in MsiAssemblyName table for component: %ls", pwzComponent);
269
270 hr = StrAllocFormatted(ppwzStrongName, L"\"%s, Version=%s, Culture=%s, PublicKeyToken=%s\"", pwzName, pwzVersion, pwzCulture, pwzPublicKeyToken);
271 ExitOnFailure(hr, "failed to format strong name for component: %ls", pwzComponent);
272
273LExit:
274 ReleaseStr(pwzData);
275 ReleaseStr(pwzName);
276 ReleaseStr(pwzVersion);
277 ReleaseStr(pwzCulture);
278 ReleaseStr(pwzPublicKeyToken);
279
280 return hr;
281}
282
283static HRESULT CreateInstallCommand(
284 __out LPWSTR* ppwzCommandLine,
285 __in LPCWSTR pwzNgenPath,
286 __in LPCWSTR pwzFile,
287 __in int iPriority,
288 __in int iAttributes,
289 __in LPCWSTR pwzFileApp,
290 __in LPCWSTR pwzDirAppBase
291 )
292{
293 Assert(ppwzCommandLine && pwzNgenPath && *pwzNgenPath && pwzFile && *pwzFile&& pwzFileApp && pwzDirAppBase);
294 HRESULT hr = S_OK;
295
296 LPWSTR pwzQueueString = NULL;
297
298 hr = StrAllocFormatted(ppwzCommandLine, L"%s install %s", pwzNgenPath, pwzFile);
299 ExitOnFailure(hr, "failed to assemble install command line");
300
301 if (iPriority > 0)
302 {
303 hr = StrAllocFormatted(&pwzQueueString, L" /queue:%d", iPriority);
304 ExitOnFailure(hr, "failed to format queue string");
305
306 hr = StrAllocConcat(ppwzCommandLine, pwzQueueString, 0);
307 ExitOnFailure(hr, "failed to add queue string to NGEN command line");
308 }
309
310 if (NGEN_DEBUG & iAttributes)
311 {
312 hr = StrAllocConcat(ppwzCommandLine, L" /Debug", 0);
313 ExitOnFailure(hr, "failed to add debug to NGEN command line");
314 }
315
316 if (NGEN_PROFILE & iAttributes)
317 {
318 hr = StrAllocConcat(ppwzCommandLine, L" /Profile", 0);
319 ExitOnFailure(hr, "failed to add profile to NGEN command line");
320 }
321
322 if (NGEN_NODEP & iAttributes)
323 {
324 hr = StrAllocConcat(ppwzCommandLine, L" /NoDependencies", 0);
325 ExitOnFailure(hr, "failed to add no dependencies to NGEN command line");
326 }
327
328 // If it's more than just two quotes around an empty string
329 if (EMPTY_FORMATTED_LENGTH_QUOTED_FILE < lstrlenW(pwzFileApp))
330 {
331 hr = StrAllocConcat(ppwzCommandLine, L" /ExeConfig:", 0);
332 ExitOnFailure(hr, "failed to add exe config to NGEN command line");
333
334 hr = StrAllocConcat(ppwzCommandLine, pwzFileApp, 0);
335 ExitOnFailure(hr, "failed to add file app to NGEN command line");
336 }
337
338 // If it's more than just two quotes around a backslash
339 if (EMPTY_FORMATTED_LENGTH_QUOTED_DIRECTORY < lstrlenW(pwzDirAppBase))
340 {
341 hr = StrAllocConcat(ppwzCommandLine, L" /AppBase:", 0);
342 ExitOnFailure(hr, "failed to add app base to NGEN command line");
343
344 hr = StrAllocConcat(ppwzCommandLine, pwzDirAppBase, 0);
345 ExitOnFailure(hr, "failed to add dir app base to NGEN command line");
346 }
347
348LExit:
349 return hr;
350}
351
352/******************************************************************
353 FileIdExists - checks if the file ID is found in the File table
354
355 returns S_OK if the file exists; S_FALSE if not; otherwise, error
356********************************************************************/
357static HRESULT FileIdExists(
358 __in_opt LPCWSTR wzFile
359 )
360{
361 HRESULT hr = S_OK;
362 PMSIHANDLE hView = NULL;
363 PMSIHANDLE hRec = NULL;
364
365 if (!wzFile)
366 {
367 hr = S_FALSE;
368 ExitFunction();
369 }
370
371 hRec = ::MsiCreateRecord(1);
372 hr = WcaSetRecordString(hRec, fiFile, wzFile);
373 ExitOnFailure(hr, "failed to create a record with the file: %ls", wzFile);
374
375 hr = WcaTableExists(L"File");
376 if (S_OK == hr)
377 {
378 hr = WcaOpenView(vcsFileId, &hView);
379 ExitOnFailure(hr, "failed to open view on File table");
380
381 hr = WcaExecuteView(hView, hRec);
382 ExitOnFailure(hr, "failed to execute view on File table");
383
384 // Reuse the same record; the handle will be released.
385 hr = WcaFetchSingleRecord(hView, &hRec);
386 ExitOnFailure(hr, "failed to fetch File from File table");
387 }
388
389LExit:
390
391 return hr;
392}
393
394/******************************************************************
395 SchedNetFx - entry point for NetFx Custom Action
396
397********************************************************************/
398extern "C" UINT __stdcall SchedNetFx(
399 __in MSIHANDLE hInstall
400 )
401{
402 // AssertSz(FALSE, "debug SchedNetFx");
403
404 HRESULT hr = S_OK;
405 UINT er = ERROR_SUCCESS;
406
407 LPWSTR pwzInstallCustomActionData = NULL;
408 LPWSTR pwzUninstallCustomActionData = NULL;
409 UINT uiCost = 0;
410
411 PMSIHANDLE hView = NULL;
412 PMSIHANDLE hRec = NULL;
413 PMSIHANDLE hViewGac = NULL;
414 PMSIHANDLE hRecGac = NULL;
415
416 LPWSTR pwzId = NULL;
417 LPWSTR pwzData = NULL;
418 LPWSTR pwzTemp = NULL;
419 LPWSTR pwzFile = NULL;
420 int iPriority = 0;
421 int iAssemblyCost = 0;
422 int iAttributes = 0;
423 LPWSTR pwzFileApp = NULL;
424 LPWSTR pwzDirAppBase = NULL;
425 LPWSTR pwzComponent = NULL;
426
427 INSTALLSTATE isInstalled;
428 INSTALLSTATE isAction;
429
430 LPWSTR pwz32Ngen = NULL;
431 LPWSTR pwz64Ngen = NULL;
432
433 BOOL f32NgenExeExists = FALSE;
434 BOOL f64NgenExeExists = FALSE;
435
436 BOOL fNeedInstallUpdate32 = FALSE;
437 BOOL fNeedUninstallUpdate32 = FALSE;
438 BOOL fNeedInstallUpdate64 = FALSE;
439 BOOL fNeedUninstallUpdate64 = FALSE;
440
441 // initialize
442 hr = WcaInitialize(hInstall, "SchedNetFx");
443 ExitOnFailure(hr, "failed to initialize");
444
445 hr = GetNgenPath(&pwz32Ngen, FALSE);
446 f32NgenExeExists = SUCCEEDED(hr);
447 if (HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND) == hr || HRESULT_FROM_WIN32(ERROR_PATH_NOT_FOUND) == hr)
448 {
449 hr = ERROR_SUCCESS;
450 WcaLog(LOGMSG_STANDARD, "Failed to find 32bit ngen. No actions will be scheduled to create native images for 32bit.");
451 }
452 ExitOnFailure(hr, "failed to get 32bit ngen.exe path");
453
454 hr = GetNgenPath(&pwz64Ngen, TRUE);
455 f64NgenExeExists = SUCCEEDED(hr);
456 if (HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND) == hr || HRESULT_FROM_WIN32(ERROR_PATH_NOT_FOUND) == hr)
457 {
458 hr = ERROR_SUCCESS;
459 WcaLog(LOGMSG_STANDARD, "Failed to find 64bit ngen. No actions will be scheduled to create native images for 64bit.");
460 }
461 ExitOnFailure(hr, "failed to get 64bit ngen.exe path");
462
463 // loop through all the NetFx records
464 hr = WcaOpenExecuteView(vcsNgenQuery, &hView);
465 ExitOnFailure(hr, "failed to open view on Wix4NetFxNativeImage table");
466
467 while (S_OK == (hr = WcaFetchRecord(hView, &hRec)))
468 {
469 // Get Id
470 hr = WcaGetRecordString(hRec, ngqId, &pwzId);
471 ExitOnFailure(hr, "failed to get Wix4NetFxNativeImage.Wix4NetFxNativeImage");
472
473 // Get File
474 hr = WcaGetRecordString(hRec, ngqFile, &pwzData);
475 ExitOnFailure(hr, "failed to get Wix4NetFxNativeImage.File_ for record: %ls", pwzId);
476 hr = StrAllocFormatted(&pwzTemp, vpwzUnformattedQuotedFile, pwzData);
477 ExitOnFailure(hr, "failed to format file string for file: %ls", pwzData);
478 hr = WcaGetFormattedString(pwzTemp, &pwzFile);
479 ExitOnFailure(hr, "failed to get formatted string for file: %ls", pwzData);
480
481 // Get Priority
482 hr = WcaGetRecordInteger(hRec, ngqPriority, &iPriority);
483 ExitOnFailure(hr, "failed to get Wix4NetFxNativeImage.Priority for record: %ls", pwzId);
484
485 if (0 == iPriority)
486 iAssemblyCost = COST_NGEN_BLOCKING;
487 else
488 iAssemblyCost = COST_NGEN_NONBLOCKING;
489
490 // Get Attributes
491 hr = WcaGetRecordInteger(hRec, ngqAttributes, &iAttributes);
492 ExitOnFailure(hr, "failed to get Wix4NetFxNativeImage.Attributes for record: %ls", pwzId);
493
494 // Get File_Application or leave pwzFileApp NULL.
495 hr = WcaGetRecordFormattedString(hRec, ngqFileApp, &pwzData);
496 ExitOnFailure(hr, "failed to get Wix4NetFxNativeImage.File_Application for record: %ls", pwzId);
497
498 // Check if the value resolves to a valid file ID.
499 if (S_OK == FileIdExists(pwzData))
500 {
501 // Resolve the file ID to a path.
502 hr = StrAllocFormatted(&pwzTemp, vpwzUnformattedQuotedFile, pwzData);
503 ExitOnFailure(hr, "failed to format file application string for file: %ls", pwzData);
504
505 hr = WcaGetFormattedString(pwzTemp, &pwzFileApp);
506 ExitOnFailure(hr, "failed to get formatted string for file application: %ls", pwzData);
507 }
508 else
509 {
510 // Assume record formatted to a path already.
511 hr = StrAllocString(&pwzFileApp, pwzData, 0);
512 ExitOnFailure(hr, "failed to allocate string for file path: %ls", pwzData);
513
514 hr = PathEnsureQuoted(&pwzFileApp, FALSE);
515 ExitOnFailure(hr, "failed to quote file path: %ls", pwzData);
516 }
517
518 // Get Directory_ApplicationBase or leave pwzDirAppBase NULL.
519 hr = WcaGetRecordFormattedString(hRec, ngqDirAppBase, &pwzData);
520 ExitOnFailure(hr, "failed to get Wix4NetFxNativeImage.Directory_ApplicationBase for record: %ls", pwzId);
521
522 if (WcaIsUnicodePropertySet(pwzData))
523 {
524 // Resolve the directory ID to a path.
525 hr = StrAllocFormatted(&pwzTemp, vpwzUnformattedQuotedDirectory, pwzData);
526 ExitOnFailure(hr, "failed to format directory application base string for property: %ls", pwzData);
527
528 hr = WcaGetFormattedString(pwzTemp, &pwzDirAppBase);
529 ExitOnFailure(hr, "failed to get formatted string for directory application base: %ls", pwzData);
530 }
531 else
532 {
533 // Assume record formatted to a path already.
534 hr = StrAllocString(&pwzDirAppBase, pwzData, 0);
535 ExitOnFailure(hr, "failed to allocate string for directory path: %ls", pwzData);
536
537 hr = PathEnsureQuoted(&pwzDirAppBase, TRUE);
538 ExitOnFailure(hr, "failed to quote and backslashify directory: %ls", pwzData);
539 }
540
541 // Get Component
542 hr = WcaGetRecordString(hRec, ngqComponent, &pwzComponent);
543 ExitOnFailure(hr, "failed to get Wix4NetFxNativeImage.Directory_ApplicationBase for record: %ls", pwzId);
544 er = ::MsiGetComponentStateW(hInstall, pwzComponent, &isInstalled, &isAction);
545 ExitOnWin32Error(er, hr, "failed to get install state for Component: %ls", pwzComponent);
546
547 //
548 // Figure out if it's going to be GAC'd. The possibility exists that no assemblies are going to be GAC'd
549 // so we have to check for the MsiAssembly table first.
550 //
551 if (S_OK == WcaTableExists(L"MsiAssembly"))
552 {
553 hr = WcaOpenView(vcsNgenGac, &hViewGac);
554 ExitOnFailure(hr, "failed to open view on File/MsiAssembly table");
555
556 hr = WcaExecuteView(hViewGac, hRec);
557 ExitOnFailure(hr, "failed to execute view on File/MsiAssembly table");
558
559 hr = WcaFetchSingleRecord(hViewGac, &hRecGac);
560 ExitOnFailure(hr, "failed to fetch File_Assembly from File/MsiAssembly table");
561
562 if (S_FALSE != hr)
563 {
564 hr = WcaGetRecordString(hRecGac, nggApplication, &pwzData);
565 ExitOnFailure(hr, "failed to get MsiAssembly.File_Application");
566
567 // If it's in the GAC replace the file name with the strong name
568 if (L'\0' == pwzData[0])
569 {
570 hr = GetStrongName(&pwzFile, pwzComponent);
571 ExitOnFailure(hr, "failed to get strong name for component: %ls", pwzData);
572 }
573 }
574 }
575
576 //
577 // Schedule the work
578 //
579 if (!(iAttributes & NGEN_32BIT) && !(iAttributes & NGEN_64BIT))
580 ExitOnFailure(hr = E_INVALIDARG, "Neither 32bit nor 64bit is specified for NGEN of file: %ls", pwzFile);
581
582 if (WcaIsInstalling(isInstalled, isAction) || WcaIsReInstalling(isInstalled, isAction))
583 {
584 if (iAttributes & NGEN_32BIT && f32NgenExeExists)
585 {
586 // Assemble the install command line
587 hr = CreateInstallCommand(&pwzData, pwz32Ngen, pwzFile, iPriority, iAttributes, pwzFileApp, pwzDirAppBase);
588 ExitOnFailure(hr, "failed to create install command line");
589
590 hr = WcaWriteStringToCaData(pwzData, &pwzInstallCustomActionData);
591 ExitOnFailure(hr, "failed to add install command to custom action data: %ls", pwzData);
592
593 hr = WcaWriteIntegerToCaData(iAssemblyCost, &pwzInstallCustomActionData);
594 ExitOnFailure(hr, "failed to add cost to custom action data: %ls", pwzData);
595
596 uiCost += iAssemblyCost;
597
598 fNeedInstallUpdate32 = TRUE;
599 }
600
601 if (iAttributes & NGEN_64BIT && f64NgenExeExists)
602 {
603 // Assemble the install command line
604 hr = CreateInstallCommand(&pwzData, pwz64Ngen, pwzFile, iPriority, iAttributes, pwzFileApp, pwzDirAppBase);
605 ExitOnFailure(hr, "failed to create install command line");
606
607 hr = WcaWriteStringToCaData(pwzData, &pwzInstallCustomActionData); // command
608 ExitOnFailure(hr, "failed to add install command to custom action data: %ls", pwzData);
609
610 hr = WcaWriteIntegerToCaData(iAssemblyCost, &pwzInstallCustomActionData); // cost
611 ExitOnFailure(hr, "failed to add cost to custom action data: %ls", pwzData);
612
613 uiCost += iAssemblyCost;
614
615 fNeedInstallUpdate64 = TRUE;
616 }
617 }
618 else if (WcaIsUninstalling(isInstalled, isAction))
619 {
620 if (iAttributes & NGEN_32BIT && f32NgenExeExists)
621 {
622 hr = StrAllocFormatted(&pwzData, L"%s uninstall %s", pwz32Ngen, pwzFile);
623 ExitOnFailure(hr, "failed to create update 32 command line");
624
625 hr = WcaWriteStringToCaData(pwzData, &pwzUninstallCustomActionData); // command
626 ExitOnFailure(hr, "failed to add install command to custom action data: %ls", pwzData);
627
628 hr = WcaWriteIntegerToCaData(COST_NGEN_NONBLOCKING, &pwzUninstallCustomActionData); // cost
629 ExitOnFailure(hr, "failed to add cost to custom action data: %ls", pwzData);
630
631 uiCost += COST_NGEN_NONBLOCKING;
632
633 fNeedUninstallUpdate32 = TRUE;
634 }
635
636 if (iAttributes & NGEN_64BIT && f64NgenExeExists)
637 {
638 hr = StrAllocFormatted(&pwzData, L"%s uninstall %s", pwz64Ngen, pwzFile);
639 ExitOnFailure(hr, "failed to create update 64 command line");
640
641 hr = WcaWriteStringToCaData(pwzData, &pwzUninstallCustomActionData); // command
642 ExitOnFailure(hr, "failed to add install command to custom action data: %ls", pwzData);
643
644 hr = WcaWriteIntegerToCaData(COST_NGEN_NONBLOCKING, &pwzUninstallCustomActionData); // cost
645 ExitOnFailure(hr, "failed to add cost to custom action data: %ls", pwzData);
646
647 uiCost += COST_NGEN_NONBLOCKING;
648
649 fNeedUninstallUpdate64 = TRUE;
650 }
651 }
652 }
653 if (E_NOMOREITEMS == hr)
654 hr = S_OK;
655 ExitOnFailure(hr, "failed while looping through all files to create native images for");
656
657 // If we need 32 bit install update
658 if (fNeedInstallUpdate32)
659 {
660 hr = StrAllocFormatted(&pwzData, L"%s update /queue", pwz32Ngen);
661 ExitOnFailure(hr, "failed to create install update 32 command line");
662
663 hr = WcaWriteStringToCaData(pwzData, &pwzInstallCustomActionData); // command
664 ExitOnFailure(hr, "failed to add install command to install custom action data: %ls", pwzData);
665
666 hr = WcaWriteIntegerToCaData(COST_NGEN_NONBLOCKING, &pwzInstallCustomActionData); // cost
667 ExitOnFailure(hr, "failed to add cost to install custom action data: %ls", pwzData);
668
669 uiCost += COST_NGEN_NONBLOCKING;
670 }
671
672 // If we need 32 bit uninstall update
673 if (fNeedUninstallUpdate32)
674 {
675 hr = StrAllocFormatted(&pwzData, L"%s update /queue", pwz32Ngen);
676 ExitOnFailure(hr, "failed to create uninstall update 32 command line");
677
678 hr = WcaWriteStringToCaData(pwzData, &pwzUninstallCustomActionData); // command
679 ExitOnFailure(hr, "failed to add install command to uninstall custom action data: %ls", pwzData);
680
681 hr = WcaWriteIntegerToCaData(COST_NGEN_NONBLOCKING, &pwzUninstallCustomActionData); // cost
682 ExitOnFailure(hr, "failed to add cost to uninstall custom action data: %ls", pwzData);
683
684 uiCost += COST_NGEN_NONBLOCKING;
685 }
686
687 // If we need 64 bit install update
688 if (fNeedInstallUpdate64)
689 {
690 hr = StrAllocFormatted(&pwzData, L"%s update /queue", pwz64Ngen);
691 ExitOnFailure(hr, "failed to create install update 64 command line");
692
693 hr = WcaWriteStringToCaData(pwzData, &pwzInstallCustomActionData); // command
694 ExitOnFailure(hr, "failed to add install command to install custom action data: %ls", pwzData);
695
696 hr = WcaWriteIntegerToCaData(COST_NGEN_NONBLOCKING, &pwzInstallCustomActionData); // cost
697 ExitOnFailure(hr, "failed to add cost to install custom action data: %ls", pwzData);
698
699 uiCost += COST_NGEN_NONBLOCKING;
700 }
701
702 // If we need 64 bit install update
703 if (fNeedUninstallUpdate64)
704 {
705 hr = StrAllocFormatted(&pwzData, L"%s update /queue", pwz64Ngen);
706 ExitOnFailure(hr, "failed to create uninstall update 64 command line");
707
708 hr = WcaWriteStringToCaData(pwzData, &pwzUninstallCustomActionData); // command
709 ExitOnFailure(hr, "failed to add install command to uninstall custom action data: %ls", pwzData);
710
711 hr = WcaWriteIntegerToCaData(COST_NGEN_NONBLOCKING, &pwzUninstallCustomActionData); // cost
712 ExitOnFailure(hr, "failed to add cost to uninstall custom action data: %ls", pwzData);
713
714 uiCost += COST_NGEN_NONBLOCKING;
715 }
716
717 // Add to progress bar
718 if ((pwzInstallCustomActionData && *pwzInstallCustomActionData) || (pwzUninstallCustomActionData && *pwzUninstallCustomActionData))
719 {
720 hr = WcaProgressMessage(uiCost, TRUE);
721 ExitOnFailure(hr, "failed to extend progress bar for NetFxExecuteNativeImage");
722 }
723
724 // Schedule the install custom action
725 if (pwzInstallCustomActionData && *pwzInstallCustomActionData)
726 {
727 hr = WcaSetProperty(L"NetFxExecuteNativeImageInstall", pwzInstallCustomActionData);
728 ExitOnFailure(hr, "failed to schedule NetFxExecuteNativeImageInstall action");
729
730 hr = WcaSetProperty(L"NetFxExecuteNativeImageCommitInstall", pwzInstallCustomActionData);
731 ExitOnFailure(hr, "failed to schedule NetFxExecuteNativeImageCommitInstall action");
732 }
733
734 // Schedule the uninstall custom action
735 if (pwzUninstallCustomActionData && *pwzUninstallCustomActionData)
736 {
737 hr = WcaSetProperty(L"NetFxExecuteNativeImageUninstall", pwzUninstallCustomActionData);
738 ExitOnFailure(hr, "failed to schedule NetFxExecuteNativeImageUninstall action");
739
740 hr = WcaSetProperty(L"NetFxExecuteNativeImageCommitUninstall", pwzUninstallCustomActionData);
741 ExitOnFailure(hr, "failed to schedule NetFxExecuteNativeImageCommitUninstall action");
742 }
743
744
745LExit:
746 ReleaseStr(pwzInstallCustomActionData);
747 ReleaseStr(pwzUninstallCustomActionData);
748 ReleaseStr(pwzId);
749 ReleaseStr(pwzData);
750 ReleaseStr(pwzTemp);
751 ReleaseStr(pwzFile);
752 ReleaseStr(pwzFileApp);
753 ReleaseStr(pwzDirAppBase);
754 ReleaseStr(pwzComponent);
755 ReleaseStr(pwz32Ngen);
756 ReleaseStr(pwz64Ngen);
757
758 if (FAILED(hr))
759 er = ERROR_INSTALL_FAILURE;
760 return WcaFinalize(er);
761}
762
763
764/******************************************************************
765 ExecNetFx - entry point for NetFx Custom Action
766
767*******************************************************************/
768extern "C" UINT __stdcall ExecNetFx(
769 __in MSIHANDLE hInstall
770 )
771{
772// AssertSz(FALSE, "debug ExecNetFx");
773
774 HRESULT hr = S_OK;
775 UINT er = ERROR_SUCCESS;
776
777 LPWSTR pwzCustomActionData = NULL;
778 LPWSTR pwzData = NULL;
779 LPWSTR pwz = NULL;
780 int iCost = 0;
781
782 // initialize
783 hr = WcaInitialize(hInstall, "ExecNetFx");
784 ExitOnFailure(hr, "failed to initialize");
785
786 hr = WcaGetProperty( L"CustomActionData", &pwzCustomActionData);
787 ExitOnFailure(hr, "failed to get CustomActionData");
788
789 WcaLog(LOGMSG_TRACEONLY, "CustomActionData: %ls", pwzCustomActionData);
790
791 pwz = pwzCustomActionData;
792
793 // loop through all the passed in data
794 while (pwz && *pwz)
795 {
796 hr = WcaReadStringFromCaData(&pwz, &pwzData);
797 ExitOnFailure(hr, "failed to read command line from custom action data");
798
799 hr = WcaReadIntegerFromCaData(&pwz, &iCost);
800 ExitOnFailure(hr, "failed to read cost from custom action data");
801
802 hr = QuietExec(pwzData, NGEN_TIMEOUT, TRUE, TRUE);
803 // If we fail here it isn't critical - keep looping through to try to act on the other assemblies on our list
804 if (FAILED(hr))
805 {
806 WcaLog(LOGMSG_STANDARD, "failed to execute Ngen command (with error 0x%x): %ls, continuing anyway", hr, pwzData);
807 hr = S_OK;
808 }
809
810 // Tick the progress bar along for this assembly
811 hr = WcaProgressMessage(iCost, FALSE);
812 ExitOnFailure(hr, "failed to tick progress bar for command line: %ls", pwzData);
813 }
814
815LExit:
816 ReleaseStr(pwzCustomActionData);
817 ReleaseStr(pwzData);
818
819 if (FAILED(hr))
820 er = ERROR_INSTALL_FAILURE;
821 return WcaFinalize(er);
822}
823
diff --git a/src/ext/NetFx/ca/netfxca.def b/src/ext/NetFx/ca/netfxca.def
new file mode 100644
index 00000000..c1d01f5f
--- /dev/null
+++ b/src/ext/NetFx/ca/netfxca.def
@@ -0,0 +1,8 @@
1; Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3
4LIBRARY "netfxca"
5
6EXPORTS
7 SchedNetFx
8 ExecNetFx
diff --git a/src/ext/NetFx/ca/netfxca.vcxproj b/src/ext/NetFx/ca/netfxca.vcxproj
new file mode 100644
index 00000000..5e25b683
--- /dev/null
+++ b/src/ext/NetFx/ca/netfxca.vcxproj
@@ -0,0 +1,73 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3
4<Project DefaultTargets="Build" ToolsVersion="16.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
5 <ItemGroup Label="ProjectConfigurations">
6 <ProjectConfiguration Include="Debug|Win32">
7 <Configuration>Debug</Configuration>
8 <Platform>Win32</Platform>
9 </ProjectConfiguration>
10 <ProjectConfiguration Include="Release|Win32">
11 <Configuration>Release</Configuration>
12 <Platform>Win32</Platform>
13 </ProjectConfiguration>
14 <ProjectConfiguration Include="Debug|x64">
15 <Configuration>Debug</Configuration>
16 <Platform>x64</Platform>
17 </ProjectConfiguration>
18 <ProjectConfiguration Include="Release|x64">
19 <Configuration>Release</Configuration>
20 <Platform>x64</Platform>
21 </ProjectConfiguration>
22 <ProjectConfiguration Include="Debug|ARM64">
23 <Configuration>Debug</Configuration>
24 <Platform>ARM64</Platform>
25 </ProjectConfiguration>
26 <ProjectConfiguration Include="Release|ARM64">
27 <Configuration>Release</Configuration>
28 <Platform>ARM64</Platform>
29 </ProjectConfiguration>
30 </ItemGroup>
31
32 <PropertyGroup Label="Globals">
33 <ProjectGuid>{F72D34CA-48DA-4DFD-91A9-A0C78BEF6981}</ProjectGuid>
34 <ConfigurationType>DynamicLibrary</ConfigurationType>
35 <TargetName>netfxca</TargetName>
36 <PlatformToolset>v142</PlatformToolset>
37 <CharacterSet>Unicode</CharacterSet>
38 <ProjectModuleDefinitionFile>netfxca.def</ProjectModuleDefinitionFile>
39 <Description>WiX Toolset .NET Framework CustomAction</Description>
40 </PropertyGroup>
41
42 <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
43 <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
44
45 <PropertyGroup>
46 <ProjectAdditionalLinkLibraries>msi.lib</ProjectAdditionalLinkLibraries>
47 </PropertyGroup>
48
49 <ItemGroup>
50 <ClCompile Include="dllmain.cpp">
51 <PrecompiledHeader>Create</PrecompiledHeader>
52 </ClCompile>
53 <ClCompile Include="netfxca.cpp" />
54 </ItemGroup>
55
56 <ItemGroup>
57 <ClInclude Include="cost.h" />
58 <ClInclude Include="precomp.h" />
59 </ItemGroup>
60
61 <ItemGroup>
62 <None Include="netfxca.def" />
63 </ItemGroup>
64
65 <ItemGroup>
66 <PackageReference Include="WixToolset.Dutil" Version="4.0.72" />
67 <PackageReference Include="WixToolset.WcaUtil" Version="4.0.19" />
68 <PackageReference Include="Microsoft.SourceLink.GitHub" Version="1.0.0" />
69 <PackageReference Include="Nerdbank.GitVersioning" Version="3.3.37" />
70 </ItemGroup>
71
72 <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
73</Project>
diff --git a/src/ext/NetFx/ca/precomp.h b/src/ext/NetFx/ca/precomp.h
new file mode 100644
index 00000000..4a83c164
--- /dev/null
+++ b/src/ext/NetFx/ca/precomp.h
@@ -0,0 +1,14 @@
1#pragma once
2// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
3
4
5#include <windows.h>
6#include <msiquery.h>
7
8#include "wcautil.h"
9#include "fileutil.h"
10#include "strutil.h"
11#include "pathutil.h"
12
13#include "caDecor.h"
14#include "cost.h"
diff --git a/src/ext/NetFx/nuget.config b/src/ext/NetFx/nuget.config
new file mode 100644
index 00000000..7f258709
--- /dev/null
+++ b/src/ext/NetFx/nuget.config
@@ -0,0 +1,19 @@
1<?xml version="1.0" encoding="utf-8"?>
2<configuration>
3 <packageSources>
4 <clear />
5 <add key="wixtoolset-data" value="https://ci.appveyor.com/nuget/wixtoolset-data" />
6 <add key="wixtoolset-extensibility" value="https://ci.appveyor.com/nuget/wixtoolset-extensibility" />
7 <add key="wixtoolset-core" value="https://ci.appveyor.com/nuget/wixtoolset-core" />
8 <add key="wixtoolset-core-native" value="https://ci.appveyor.com/nuget/wixtoolset-core-native" />
9 <add key="wixtoolset-dtf" value="https://ci.appveyor.com/nuget/wixtoolset-dtf" />
10 <add key="wixtoolset-dutil" value="https://ci.appveyor.com/nuget/wixtoolset-dutil" />
11 <add key="wixtoolset-wcautil" value="https://ci.appveyor.com/nuget/wixtoolset-wcautil" />
12 <add key="wixtoolset-tools" value="https://ci.appveyor.com/nuget/wixtoolset-tools" />
13 <add key="wixtoolset-bal-wixext" value="https://ci.appveyor.com/nuget/wixtoolset-bal-wixext" />
14 <add key="wixtoolset-util-wixext" value="https://ci.appveyor.com/nuget/wixtoolset-util-wixext" />
15 <add key="wixburn" value="https://ci.appveyor.com/nuget/wixtoolset-burn" />
16 <add key="wixbuildtools" value="https://ci.appveyor.com/nuget/wixbuildtools" />
17 <add key="api.nuget.org" value="https://api.nuget.org/v3/index.json" protocolVersion="3" />
18 </packageSources>
19</configuration> \ No newline at end of file
diff --git a/src/ext/NetFx/test/WixToolsetTest.Netfx/NetfxExtensionFixture.cs b/src/ext/NetFx/test/WixToolsetTest.Netfx/NetfxExtensionFixture.cs
new file mode 100644
index 00000000..72d4a682
--- /dev/null
+++ b/src/ext/NetFx/test/WixToolsetTest.Netfx/NetfxExtensionFixture.cs
@@ -0,0 +1,147 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolsetTest.Netfx
4{
5 using System.IO;
6 using System.Linq;
7 using WixBuildTools.TestSupport;
8 using WixToolset.Core.TestPackage;
9 using WixToolset.Netfx;
10 using Xunit;
11
12 public class NetfxExtensionFixture
13 {
14 [Fact]
15 public void CanBuildUsingLatestDotNetCorePackages()
16 {
17 using (var fs = new DisposableFileSystem())
18 {
19 var baseFolder = fs.GetFolder();
20 var bundleFile = Path.Combine(baseFolder, "bin", "test.exe");
21 var bundleSourceFolder = TestData.Get(@"TestData\UsingDotNetCorePackages");
22 var intermediateFolder = Path.Combine(baseFolder, "obj");
23
24 var compileResult = WixRunner.Execute(new[]
25 {
26 "build",
27 Path.Combine(bundleSourceFolder, "BundleLatest.wxs"),
28 "-ext", TestData.Get(@"WixToolset.Bal.wixext.dll"),
29 "-ext", TestData.Get(@"WixToolset.Netfx.wixext.dll"),
30 "-intermediateFolder", intermediateFolder,
31 "-o", bundleFile,
32 });
33 compileResult.AssertSuccess();
34
35 Assert.True(File.Exists(bundleFile));
36 }
37 }
38
39 [Fact]
40 public void CanBuildUsingLatestDotNetCorePackages_X64()
41 {
42 using (var fs = new DisposableFileSystem())
43 {
44 var baseFolder = fs.GetFolder();
45 var bundleFile = Path.Combine(baseFolder, "bin", "test.exe");
46 var bundleSourceFolder = TestData.Get(@"TestData\UsingDotNetCorePackages");
47 var intermediateFolder = Path.Combine(baseFolder, "obj");
48
49 var compileResult = WixRunner.Execute(new[]
50 {
51 "build",
52 Path.Combine(bundleSourceFolder, "BundleLatest_x64.wxs"),
53 "-ext", TestData.Get(@"WixToolset.Bal.wixext.dll"),
54 "-ext", TestData.Get(@"WixToolset.Netfx.wixext.dll"),
55 "-intermediateFolder", intermediateFolder,
56 "-o", bundleFile,
57 });
58 compileResult.AssertSuccess();
59
60 Assert.True(File.Exists(bundleFile));
61 }
62 }
63
64 [Fact]
65 public void CanBuildUsingNativeImage()
66 {
67 var folder = TestData.Get(@"TestData\UsingNativeImage");
68 var build = new Builder(folder, typeof(NetfxExtensionFactory), new[] { folder });
69
70 var results = build.BuildAndQuery(Build, "Binary", "CustomAction", "Wix4NetFxNativeImage");
71 Assert.Equal(new[]
72 {
73 "Binary:Wix4NetFxCA_X86\t[Binary data]",
74 "CustomAction:Wix4NetFxExecuteNativeImageCommitInstall_X86\t3649\tWix4NetFxCA_X86\tExecNetFx\t",
75 "CustomAction:Wix4NetFxExecuteNativeImageCommitUninstall_X86\t3649\tWix4NetFxCA_X86\tExecNetFx\t",
76 "CustomAction:Wix4NetFxExecuteNativeImageInstall_X86\t3137\tWix4NetFxCA_X86\tExecNetFx\t",
77 "CustomAction:Wix4NetFxExecuteNativeImageUninstall_X86\t3137\tWix4NetFxCA_X86\tExecNetFx\t",
78 "CustomAction:Wix4NetFxScheduleNativeImage_X86\t1\tWix4NetFxCA_X86\tSchedNetFx\t",
79 "Wix4NetFxNativeImage:ExampleNgen\tfil6349_KNDJhqShNzVdHX3ihhvA6Y\t3\t8\t\t",
80 }, results.OrderBy(s => s).ToArray());
81 }
82
83 [Fact]
84 public void CanBuildUsingNativeImageX64()
85 {
86 var folder = TestData.Get(@"TestData\UsingNativeImage");
87 var build = new Builder(folder, typeof(NetfxExtensionFactory), new[] { folder });
88
89 var results = build.BuildAndQuery(BuildX64, "Binary", "CustomAction", "Wix4NetFxNativeImage");
90 Assert.Equal(new[]
91 {
92 "Binary:Wix4NetFxCA_X64\t[Binary data]",
93 "CustomAction:Wix4NetFxExecuteNativeImageCommitInstall_X64\t3649\tWix4NetFxCA_X64\tExecNetFx\t",
94 "CustomAction:Wix4NetFxExecuteNativeImageCommitUninstall_X64\t3649\tWix4NetFxCA_X64\tExecNetFx\t",
95 "CustomAction:Wix4NetFxExecuteNativeImageInstall_X64\t3137\tWix4NetFxCA_X64\tExecNetFx\t",
96 "CustomAction:Wix4NetFxExecuteNativeImageUninstall_X64\t3137\tWix4NetFxCA_X64\tExecNetFx\t",
97 "CustomAction:Wix4NetFxScheduleNativeImage_X64\t1\tWix4NetFxCA_X64\tSchedNetFx\t",
98 "Wix4NetFxNativeImage:ExampleNgen\tfil6349_KNDJhqShNzVdHX3ihhvA6Y\t3\t8\t\t",
99 }, results.OrderBy(s => s).ToArray());
100 }
101
102 [Fact]
103 public void CanBuildUsingNativeImageARM64()
104 {
105 var folder = TestData.Get(@"TestData\UsingNativeImage");
106 var build = new Builder(folder, typeof(NetfxExtensionFactory), new[] { folder });
107
108 var results = build.BuildAndQuery(BuildARM64, "Binary", "CustomAction", "Wix4NetFxNativeImage");
109 Assert.Equal(new[]
110 {
111 "Binary:Wix4NetFxCA_A64\t[Binary data]",
112 "CustomAction:Wix4NetFxExecuteNativeImageCommitInstall_A64\t3649\tWix4NetFxCA_A64\tExecNetFx\t",
113 "CustomAction:Wix4NetFxExecuteNativeImageCommitUninstall_A64\t3649\tWix4NetFxCA_A64\tExecNetFx\t",
114 "CustomAction:Wix4NetFxExecuteNativeImageInstall_A64\t3137\tWix4NetFxCA_A64\tExecNetFx\t",
115 "CustomAction:Wix4NetFxExecuteNativeImageUninstall_A64\t3137\tWix4NetFxCA_A64\tExecNetFx\t",
116 "CustomAction:Wix4NetFxScheduleNativeImage_A64\t1\tWix4NetFxCA_A64\tSchedNetFx\t",
117 "Wix4NetFxNativeImage:ExampleNgen\tfil6349_KNDJhqShNzVdHX3ihhvA6Y\t3\t8\t\t",
118 }, results.OrderBy(s => s).ToArray());
119 }
120
121 private static void Build(string[] args)
122 {
123 var result = WixRunner.Execute(args);
124 result.AssertSuccess();
125 }
126
127 private static void BuildX64(string[] args)
128 {
129 var newArgs = args.ToList();
130 newArgs.Add("-platform");
131 newArgs.Add("x64");
132
133 var result = WixRunner.Execute(newArgs.ToArray());
134 result.AssertSuccess();
135 }
136
137 private static void BuildARM64(string[] args)
138 {
139 var newArgs = args.ToList();
140 newArgs.Add("-platform");
141 newArgs.Add("arm64");
142
143 var result = WixRunner.Execute(newArgs.ToArray());
144 result.AssertSuccess();
145 }
146 }
147}
diff --git a/src/ext/NetFx/test/WixToolsetTest.Netfx/TestData/UsingDotNetCorePackages/BundleLatest.wxs b/src/ext/NetFx/test/WixToolsetTest.Netfx/TestData/UsingDotNetCorePackages/BundleLatest.wxs
new file mode 100644
index 00000000..8e3d2c30
--- /dev/null
+++ b/src/ext/NetFx/test/WixToolsetTest.Netfx/TestData/UsingDotNetCorePackages/BundleLatest.wxs
@@ -0,0 +1,12 @@
1<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs" xmlns:bal="http://wixtoolset.org/schemas/v4/wxs/bal">
2 <Bundle Name="WixStdBa" Version="1.0.0.0" Manufacturer="Example Corporation" UpgradeCode="75D5D534-E177-4689-AAE9-CAC1C39002C2">
3 <BootstrapperApplication>
4 <bal:WixStandardBootstrapperApplication LicenseUrl="http://wixtoolset.org/about/license/" Theme="hyperlinkLicense" />
5 </BootstrapperApplication>
6 <Chain>
7 <PackageGroupRef Id="AspNetCoreRuntime31Redist_x86" />
8 <PackageGroupRef Id="DesktopNetCoreRuntime31Redist_x86" />
9 <PackageGroupRef Id="DotNetCoreRuntime31Redist_x86" />
10 </Chain>
11 </Bundle>
12</Wix>
diff --git a/src/ext/NetFx/test/WixToolsetTest.Netfx/TestData/UsingDotNetCorePackages/BundleLatest_x64.wxs b/src/ext/NetFx/test/WixToolsetTest.Netfx/TestData/UsingDotNetCorePackages/BundleLatest_x64.wxs
new file mode 100644
index 00000000..fc42ac99
--- /dev/null
+++ b/src/ext/NetFx/test/WixToolsetTest.Netfx/TestData/UsingDotNetCorePackages/BundleLatest_x64.wxs
@@ -0,0 +1,12 @@
1<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs" xmlns:bal="http://wixtoolset.org/schemas/v4/wxs/bal">
2 <Bundle Name="WixStdBa" Version="1.0.0.0" Manufacturer="Example Corporation" UpgradeCode="75D5D534-E177-4689-AAE9-CAC1C39002C2">
3 <BootstrapperApplication>
4 <bal:WixStandardBootstrapperApplication LicenseUrl="http://wixtoolset.org/about/license/" Theme="hyperlinkLicense" />
5 </BootstrapperApplication>
6 <Chain>
7 <PackageGroupRef Id="AspNetCoreRuntime31Redist_x64" />
8 <PackageGroupRef Id="DesktopNetCoreRuntime31Redist_x64" />
9 <PackageGroupRef Id="DotNetCoreRuntime31Redist_x64" />
10 </Chain>
11 </Bundle>
12</Wix>
diff --git a/src/ext/NetFx/test/WixToolsetTest.Netfx/TestData/UsingNativeImage/Package.en-us.wxl b/src/ext/NetFx/test/WixToolsetTest.Netfx/TestData/UsingNativeImage/Package.en-us.wxl
new file mode 100644
index 00000000..5301bb1a
--- /dev/null
+++ b/src/ext/NetFx/test/WixToolsetTest.Netfx/TestData/UsingNativeImage/Package.en-us.wxl
@@ -0,0 +1,9 @@
1<!--
2This file contains the declaration of all the localizable strings.
3-->
4<WixLocalization xmlns="http://wixtoolset.org/schemas/v4/wxl" Culture="en-US">
5
6 <String Id="DowngradeError">A newer version of [ProductName] is already installed.</String>
7 <String Id="FeatureTitle">MsiPackage</String>
8
9</WixLocalization>
diff --git a/src/ext/NetFx/test/WixToolsetTest.Netfx/TestData/UsingNativeImage/Package.wxs b/src/ext/NetFx/test/WixToolsetTest.Netfx/TestData/UsingNativeImage/Package.wxs
new file mode 100644
index 00000000..ace73680
--- /dev/null
+++ b/src/ext/NetFx/test/WixToolsetTest.Netfx/TestData/UsingNativeImage/Package.wxs
@@ -0,0 +1,15 @@
1<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
2 <Package Name="MsiPackage" Language="1033" Version="1.0.0.0" Manufacturer="Example Corporation" UpgradeCode="047730a5-30fe-4a62-a520-da9381b8226a">
3 <MajorUpgrade DowngradeErrorMessage="!(loc.DowngradeError)" />
4
5 <Feature Id="ProductFeature" Title="!(loc.FeatureTitle)">
6 <ComponentGroupRef Id="ProductComponents" />
7 </Feature>
8 </Package>
9
10 <Fragment>
11 <StandardDirectory Id="ProgramFilesFolder">
12 <Directory Id="INSTALLFOLDER" Name="MsiPackage" />
13 </StandardDirectory>
14 </Fragment>
15</Wix>
diff --git a/src/ext/NetFx/test/WixToolsetTest.Netfx/TestData/UsingNativeImage/PackageComponents.wxs b/src/ext/NetFx/test/WixToolsetTest.Netfx/TestData/UsingNativeImage/PackageComponents.wxs
new file mode 100644
index 00000000..a1c806d9
--- /dev/null
+++ b/src/ext/NetFx/test/WixToolsetTest.Netfx/TestData/UsingNativeImage/PackageComponents.wxs
@@ -0,0 +1,11 @@
1<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs" xmlns:netfx="http://wixtoolset.org/schemas/v4/wxs/netfx">
2 <Fragment>
3 <ComponentGroup Id="ProductComponents" Directory="INSTALLFOLDER">
4 <Component>
5 <File Name="fake.ddl" Source="example.txt">
6 <netfx:NativeImage Id="ExampleNgen" />
7 </File>
8 </Component>
9 </ComponentGroup>
10 </Fragment>
11</Wix>
diff --git a/src/ext/NetFx/test/WixToolsetTest.Netfx/TestData/UsingNativeImage/example.txt b/src/ext/NetFx/test/WixToolsetTest.Netfx/TestData/UsingNativeImage/example.txt
new file mode 100644
index 00000000..1b4ffe8a
--- /dev/null
+++ b/src/ext/NetFx/test/WixToolsetTest.Netfx/TestData/UsingNativeImage/example.txt
@@ -0,0 +1 @@
This is example.txt. \ No newline at end of file
diff --git a/src/ext/NetFx/test/WixToolsetTest.Netfx/WixToolsetTest.Netfx.csproj b/src/ext/NetFx/test/WixToolsetTest.Netfx/WixToolsetTest.Netfx.csproj
new file mode 100644
index 00000000..1c41d176
--- /dev/null
+++ b/src/ext/NetFx/test/WixToolsetTest.Netfx/WixToolsetTest.Netfx.csproj
@@ -0,0 +1,40 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3
4<Project Sdk="Microsoft.NET.Sdk">
5 <PropertyGroup>
6 <TargetFramework>netcoreapp3.1</TargetFramework>
7 <DebugType>embedded</DebugType>
8 <IsPackable>false</IsPackable>
9 </PropertyGroup>
10
11 <ItemGroup>
12 <Content Include="TestData\**" CopyToOutputDirectory="PreserveNewest" />
13 </ItemGroup>
14
15 <ItemGroup>
16 <ProjectReference Include="..\..\wixext\WixToolset.Netfx.wixext.csproj" />
17 </ItemGroup>
18
19 <ItemGroup>
20 <PackageReference Include="WixToolset.Bal.wixext" Version="4.0.*" />
21 <PackageReference Include="WixToolset.Core" Version="4.0.*" />
22 <PackageReference Include="WixToolset.Core.Burn" Version="4.0.*" />
23 <PackageReference Include="WixToolset.Core.WindowsInstaller" Version="4.0.*" />
24 <PackageReference Include="WixToolset.Core.TestPackage" Version="4.0.*" />
25 </ItemGroup>
26
27 <ItemGroup>
28 <PackageReference Include="WixBuildTools.TestSupport" Version="4.0.*" />
29 </ItemGroup>
30
31 <ItemGroup>
32 <PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.3.0" />
33 <PackageReference Include="xunit" Version="2.4.1" />
34 <PackageReference Include="xunit.runner.visualstudio" Version="2.4.1" PrivateAssets="All" />
35 </ItemGroup>
36
37 <Target Name="CopyExtensions" AfterTargets="Build">
38 <Copy DestinationFolder="$(OutputPath)" SourceFiles="@(WixExtension)" />
39 </Target>
40</Project>
diff --git a/src/ext/NetFx/test/WixToolsetTest.Netfx/WixToolsetTest.Netfx.v3.ncrunchproject b/src/ext/NetFx/test/WixToolsetTest.Netfx/WixToolsetTest.Netfx.v3.ncrunchproject
new file mode 100644
index 00000000..7b5b2139
--- /dev/null
+++ b/src/ext/NetFx/test/WixToolsetTest.Netfx/WixToolsetTest.Netfx.v3.ncrunchproject
@@ -0,0 +1,5 @@
1<ProjectConfiguration>
2 <Settings>
3 <CopyReferencedAssembliesToWorkspace>True</CopyReferencedAssembliesToWorkspace>
4 </Settings>
5</ProjectConfiguration> \ No newline at end of file
diff --git a/src/ext/NetFx/wix.snk b/src/ext/NetFx/wix.snk
new file mode 100644
index 00000000..3908a66a
--- /dev/null
+++ b/src/ext/NetFx/wix.snk
Binary files differ
diff --git a/src/ext/NetFx/wixext/NetFxCompiler.cs b/src/ext/NetFx/wixext/NetFxCompiler.cs
new file mode 100644
index 00000000..90aa8bcb
--- /dev/null
+++ b/src/ext/NetFx/wixext/NetFxCompiler.cs
@@ -0,0 +1,163 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Netfx
4{
5 using System;
6 using System.Collections.Generic;
7 using System.Xml.Linq;
8 using WixToolset.Data;
9 using WixToolset.Extensibility;
10 using WixToolset.Extensibility.Data;
11 using WixToolset.Netfx.Symbols;
12
13 /// <summary>
14 /// The compiler for the WiX Toolset .NET Framework Extension.
15 /// </summary>
16 public sealed class NetfxCompiler : BaseCompilerExtension
17 {
18 public override XNamespace Namespace => "http://wixtoolset.org/schemas/v4/wxs/netfx";
19
20 /// <summary>
21 /// Processes an element for the Compiler.
22 /// </summary>
23 /// <param name="parentElement">Parent element of element to process.</param>
24 /// <param name="element">Element to process.</param>
25 /// <param name="contextValues">Extra information about the context in which this element is being parsed.</param>
26 public override void ParseElement(Intermediate intermediate, IntermediateSection section, XElement parentElement, XElement element, IDictionary<string, string> context)
27 {
28 switch (parentElement.Name.LocalName)
29 {
30 case "File":
31 string fileId = context["FileId"];
32
33 switch (element.Name.LocalName)
34 {
35 case "NativeImage":
36 this.ParseNativeImageElement(intermediate, section, element, fileId);
37 break;
38 default:
39 this.ParseHelper.UnexpectedElement(parentElement, element);
40 break;
41 }
42 break;
43 default:
44 this.ParseHelper.UnexpectedElement(parentElement, element);
45 break;
46 }
47 }
48
49 /// <summary>
50 /// Parses a NativeImage element.
51 /// </summary>
52 /// <param name="element">The element to parse.</param>
53 /// <param name="fileId">The file identifier of the parent element.</param>
54 private void ParseNativeImageElement(Intermediate intermediate, IntermediateSection section, XElement element, string fileId)
55 {
56 var sourceLineNumbers = this.ParseHelper.GetSourceLineNumbers(element);
57 Identifier id = null;
58 string appBaseDirectory = null;
59 string assemblyApplication = null;
60 int attributes = 0x8; // 32bit is on by default
61 int priority = 3;
62
63 foreach (var attrib in element.Attributes())
64 {
65 if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || this.Namespace == attrib.Name.Namespace)
66 {
67 switch (attrib.Name.LocalName)
68 {
69 case "Id":
70 id = this.ParseHelper.GetAttributeIdentifier(sourceLineNumbers, attrib);
71 break;
72 case "AppBaseDirectory":
73 appBaseDirectory = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
74
75 // See if a formatted value is specified.
76 if (-1 == appBaseDirectory.IndexOf("[", StringComparison.Ordinal))
77 {
78 this.ParseHelper.CreateSimpleReference(section, sourceLineNumbers, SymbolDefinitions.Directory, appBaseDirectory);
79 }
80 break;
81 case "AssemblyApplication":
82 assemblyApplication = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
83
84 // See if a formatted value is specified.
85 if (-1 == assemblyApplication.IndexOf("[", StringComparison.Ordinal))
86 {
87 this.ParseHelper.CreateSimpleReference(section, sourceLineNumbers, SymbolDefinitions.File, assemblyApplication);
88 }
89 break;
90 case "Debug":
91 if (YesNoType.Yes == this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib))
92 {
93 attributes |= 0x1;
94 }
95 break;
96 case "Dependencies":
97 if (YesNoType.No == this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib))
98 {
99 attributes |= 0x2;
100 }
101 break;
102 case "Platform":
103 string platformValue = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
104 if (0 < platformValue.Length)
105 {
106 switch (platformValue)
107 {
108 case "32bit":
109 // 0x8 is already on by default
110 break;
111 case "64bit":
112 attributes &= ~0x8;
113 attributes |= 0x10;
114 break;
115 case "all":
116 attributes |= 0x10;
117 break;
118 }
119 }
120 break;
121 case "Priority":
122 priority = this.ParseHelper.GetAttributeIntegerValue(sourceLineNumbers, attrib, 0, 3);
123 break;
124 case "Profile":
125 if (YesNoType.Yes == this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib))
126 {
127 attributes |= 0x4;
128 }
129 break;
130 default:
131 this.ParseHelper.UnexpectedAttribute(element, attrib);
132 break;
133 }
134 }
135 else
136 {
137 this.ParseHelper.ParseExtensionAttribute(this.Context.Extensions, intermediate, section, element, attrib);
138 }
139 }
140
141 if (null == id)
142 {
143 id = this.ParseHelper.CreateIdentifier("nni", fileId);
144 }
145
146 this.ParseHelper.ParseForExtensionElements(this.Context.Extensions, intermediate, section, element);
147
148 this.ParseHelper.CreateCustomActionReference(sourceLineNumbers, section, "Wix4NetFxScheduleNativeImage", this.Context.Platform, CustomActionPlatforms.ARM64 | CustomActionPlatforms.X64 | CustomActionPlatforms.X86);
149
150 if (!this.Messaging.EncounteredError)
151 {
152 section.AddSymbol(new NetFxNativeImageSymbol(sourceLineNumbers, id)
153 {
154 FileRef = fileId,
155 Priority = priority,
156 Attributes = attributes,
157 ApplicationFileRef = assemblyApplication,
158 ApplicationBaseDirectoryRef = appBaseDirectory,
159 });
160 }
161 }
162 }
163}
diff --git a/src/ext/NetFx/wixext/NetFxDecompiler.cs b/src/ext/NetFx/wixext/NetFxDecompiler.cs
new file mode 100644
index 00000000..e30905d1
--- /dev/null
+++ b/src/ext/NetFx/wixext/NetFxDecompiler.cs
@@ -0,0 +1,139 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Extensions
4{
5#if TODO_CONSIDER_DECOMPILER
6 using System;
7 using System.Collections;
8 using System.Diagnostics;
9 using System.Globalization;
10 using WixToolset.Data;
11 using WixToolset.Extensibility;
12 using NetFx = WixToolset.Extensions.Serialize.NetFx;
13 using Wix = WixToolset.Data.Serialize;
14
15 /// <summary>
16 /// The decompiler for the WiX Toolset .NET Framework Extension.
17 /// </summary>
18 public sealed class NetFxDecompiler : DecompilerExtension
19 {
20 /// <summary>
21 /// Creates a decompiler for NetFx Extension.
22 /// </summary>
23 public NetFxDecompiler()
24 {
25 this.TableDefinitions = NetFxExtensionData.GetExtensionTableDefinitions();
26 }
27
28 /// <summary>
29 /// Get the extensions library to be removed.
30 /// </summary>
31 /// <param name="tableDefinitions">Table definitions for library.</param>
32 /// <returns>Library to remove from decompiled output.</returns>
33 public override Library GetLibraryToRemove(TableDefinitionCollection tableDefinitions)
34 {
35 return NetFxExtensionData.GetExtensionLibrary(tableDefinitions);
36 }
37
38 /// <summary>
39 /// Decompiles an extension table.
40 /// </summary>
41 /// <param name="table">The table to decompile.</param>
42 public override void DecompileTable(Table table)
43 {
44 switch (table.Name)
45 {
46 case "NetFxNativeImage":
47 this.DecompileNetFxNativeImageTable(table);
48 break;
49 default:
50 base.DecompileTable(table);
51 break;
52 }
53 }
54
55 /// <summary>
56 /// Decompile the NetFxNativeImage table.
57 /// </summary>
58 /// <param name="table">The table to decompile.</param>
59 private void DecompileNetFxNativeImageTable(Table table)
60 {
61 foreach (Row row in table.Rows)
62 {
63 NetFx.NativeImage nativeImage = new NetFx.NativeImage();
64
65 nativeImage.Id = (string)row[0];
66
67 switch ((int)row[2])
68 {
69 case 0:
70 nativeImage.Priority = NetFx.NativeImage.PriorityType.Item0;
71 break;
72 case 1:
73 nativeImage.Priority = NetFx.NativeImage.PriorityType.Item1;
74 break;
75 case 2:
76 nativeImage.Priority = NetFx.NativeImage.PriorityType.Item2;
77 break;
78 case 3:
79 nativeImage.Priority = NetFx.NativeImage.PriorityType.Item3;
80 break;
81 }
82
83 if (null != row[3])
84 {
85 int attributes = (int)row[3];
86
87 if (0x1 == (attributes & 0x1))
88 {
89 nativeImage.Debug = NetFx.YesNoType.yes;
90 }
91
92 if (0x2 == (attributes & 0x2))
93 {
94 nativeImage.Dependencies = NetFx.YesNoType.no;
95 }
96
97 if (0x4 == (attributes & 0x4))
98 {
99 nativeImage.Profile = NetFx.YesNoType.yes;
100 }
101
102 if (0x8 == (attributes & 0x8) && 0x10 == (attributes & 0x10))
103 {
104 nativeImage.Platform = NetFx.NativeImage.PlatformType.all;
105 }
106 else if (0x8 == (attributes & 0x8))
107 {
108 nativeImage.Platform = NetFx.NativeImage.PlatformType.Item32bit;
109 }
110 else if (0x10 == (attributes & 0x10))
111 {
112 nativeImage.Platform = NetFx.NativeImage.PlatformType.Item64bit;
113 }
114 }
115
116 if (null != row[4])
117 {
118 nativeImage.AssemblyApplication = (string)row[4];
119 }
120
121 if (null != row[5])
122 {
123 nativeImage.AppBaseDirectory = (string)row[5];
124 }
125
126 Wix.File file = (Wix.File)this.Core.GetIndexedElement("File", (string)row[1]);
127 if (null != file)
128 {
129 file.AddChild(nativeImage);
130 }
131 else
132 {
133 this.Core.OnMessage(WixWarnings.ExpectedForeignRow(row.SourceLineNumbers, table.Name, row.GetPrimaryKey(DecompilerConstants.PrimaryKeyDelimiter), "File_", (string)row[1], "File"));
134 }
135 }
136 }
137 }
138#endif
139}
diff --git a/src/ext/NetFx/wixext/NetFxExtensionData.cs b/src/ext/NetFx/wixext/NetFxExtensionData.cs
new file mode 100644
index 00000000..0a24ef1e
--- /dev/null
+++ b/src/ext/NetFx/wixext/NetFxExtensionData.cs
@@ -0,0 +1,25 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Netfx
4{
5 using WixToolset.Data;
6 using WixToolset.Extensibility;
7 using WixToolset.Netfx.Symbols;
8
9 /// <summary>
10 /// The WiX Toolset .NET Framework Extension.
11 /// </summary>
12 public sealed class NetfxExtensionData : BaseExtensionData
13 {
14 public override bool TryGetSymbolDefinitionByName(string name, out IntermediateSymbolDefinition symbolDefinition)
15 {
16 symbolDefinition = (name == NetfxSymbolDefinitionNames.NetFxNativeImage) ? NetfxSymbolDefinitions.NetFxNativeImage : null;
17 return symbolDefinition != null;
18 }
19
20 public override Intermediate GetLibrary(ISymbolDefinitionCreator symbolDefinitions)
21 {
22 return Intermediate.Load(typeof(NetfxExtensionData).Assembly, "WixToolset.Netfx.netfx.wixlib", symbolDefinitions);
23 }
24 }
25}
diff --git a/src/ext/NetFx/wixext/NetfxExtensionFactory.cs b/src/ext/NetFx/wixext/NetfxExtensionFactory.cs
new file mode 100644
index 00000000..fe618460
--- /dev/null
+++ b/src/ext/NetFx/wixext/NetfxExtensionFactory.cs
@@ -0,0 +1,18 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Netfx
4{
5 using System;
6 using System.Collections.Generic;
7 using WixToolset.Extensibility;
8
9 public class NetfxExtensionFactory : BaseExtensionFactory
10 {
11 protected override IReadOnlyCollection<Type> ExtensionTypes => new[]
12 {
13 typeof(NetfxCompiler),
14 typeof(NetfxExtensionData),
15 typeof(NetfxWindowsInstallerBackendBinderExtension),
16 };
17 }
18}
diff --git a/src/ext/NetFx/wixext/NetfxTableDefinitions.cs b/src/ext/NetFx/wixext/NetfxTableDefinitions.cs
new file mode 100644
index 00000000..1b2a4d21
--- /dev/null
+++ b/src/ext/NetFx/wixext/NetfxTableDefinitions.cs
@@ -0,0 +1,30 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Netfx
4{
5 using WixToolset.Data.WindowsInstaller;
6 using WixToolset.Netfx.Symbols;
7
8 public static class NetfxTableDefinitions
9 {
10 public static readonly TableDefinition NetFxNativeImage = new TableDefinition(
11 "Wix4NetFxNativeImage",
12 NetfxSymbolDefinitions.NetFxNativeImage,
13 new[]
14 {
15 new ColumnDefinition("Wix4NetFxNativeImage", ColumnType.String, 72, primaryKey: true, nullable: false, ColumnCategory.Identifier, description: "The primary key, a non-localized token.", modularizeType: ColumnModularizeType.Column),
16 new ColumnDefinition("File_", ColumnType.String, 72, primaryKey: false, nullable: false, ColumnCategory.Identifier, keyTable: "File", keyColumn: 1, description: "The assembly for which a native image will be generated.", modularizeType: ColumnModularizeType.Column),
17 new ColumnDefinition("Priority", ColumnType.Number, 2, primaryKey: false, nullable: false, ColumnCategory.Integer, minValue: 0, maxValue: 3, description: "The priority for generating this native image: 0 is syncronous, 1-3 represent various levels of queued generation."),
18 new ColumnDefinition("Attributes", ColumnType.Number, 4, primaryKey: false, nullable: false, ColumnCategory.Integer, minValue: 0, maxValue: 2147483647, description: "Integer containing bit flags representing native image attributes."),
19 new ColumnDefinition("File_Application", ColumnType.String, 72, primaryKey: false, nullable: true, ColumnCategory.Formatted, description: "The application which loads this assembly.", modularizeType: ColumnModularizeType.Column),
20 new ColumnDefinition("Directory_ApplicationBase", ColumnType.String, 72, primaryKey: false, nullable: true, ColumnCategory.Formatted, description: "The directory containing the application which loads this assembly.", modularizeType: ColumnModularizeType.Column),
21 },
22 symbolIdIsPrimaryKey: true
23 );
24
25 public static readonly TableDefinition[] All = new[]
26 {
27 NetFxNativeImage,
28 };
29 }
30}
diff --git a/src/ext/NetFx/wixext/NetfxWindowsInstallerBackendExtension.cs b/src/ext/NetFx/wixext/NetfxWindowsInstallerBackendExtension.cs
new file mode 100644
index 00000000..7d4fe475
--- /dev/null
+++ b/src/ext/NetFx/wixext/NetfxWindowsInstallerBackendExtension.cs
@@ -0,0 +1,13 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Netfx
4{
5 using System.Collections.Generic;
6 using WixToolset.Data.WindowsInstaller;
7 using WixToolset.Extensibility;
8
9 public class NetfxWindowsInstallerBackendBinderExtension : BaseWindowsInstallerBackendBinderExtension
10 {
11 public override IReadOnlyCollection<TableDefinition> TableDefinitions => NetfxTableDefinitions.All;
12 }
13}
diff --git a/src/ext/NetFx/wixext/Symbols/NetFxNativeImageSymbol.cs b/src/ext/NetFx/wixext/Symbols/NetFxNativeImageSymbol.cs
new file mode 100644
index 00000000..3803abd6
--- /dev/null
+++ b/src/ext/NetFx/wixext/Symbols/NetFxNativeImageSymbol.cs
@@ -0,0 +1,58 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Netfx.Symbols
4{
5 using WixToolset.Data;
6
7 public enum NetFxNativeImageSymbolFields
8 {
9 FileRef,
10 Priority,
11 Attributes,
12 ApplicationFileRef,
13 ApplicationBaseDirectoryRef,
14 }
15
16 public class NetFxNativeImageSymbol : IntermediateSymbol
17 {
18 public NetFxNativeImageSymbol() : base(NetfxSymbolDefinitions.NetFxNativeImage, null, null)
19 {
20 }
21
22 public NetFxNativeImageSymbol(SourceLineNumber sourceLineNumber, Identifier id = null) : base(NetfxSymbolDefinitions.NetFxNativeImage, sourceLineNumber, id)
23 {
24 }
25
26 public IntermediateField this[NetFxNativeImageSymbolFields index] => this.Fields[(int)index];
27
28 public string FileRef
29 {
30 get => this.Fields[(int)NetFxNativeImageSymbolFields.FileRef].AsString();
31 set => this.Set((int)NetFxNativeImageSymbolFields.FileRef, value);
32 }
33
34 public int Priority
35 {
36 get => this.Fields[(int)NetFxNativeImageSymbolFields.Priority].AsNumber();
37 set => this.Set((int)NetFxNativeImageSymbolFields.Priority, value);
38 }
39
40 public int Attributes
41 {
42 get => this.Fields[(int)NetFxNativeImageSymbolFields.Attributes].AsNumber();
43 set => this.Set((int)NetFxNativeImageSymbolFields.Attributes, value);
44 }
45
46 public string ApplicationFileRef
47 {
48 get => this.Fields[(int)NetFxNativeImageSymbolFields.ApplicationFileRef].AsString();
49 set => this.Set((int)NetFxNativeImageSymbolFields.ApplicationFileRef, value);
50 }
51
52 public string ApplicationBaseDirectoryRef
53 {
54 get => this.Fields[(int)NetFxNativeImageSymbolFields.ApplicationBaseDirectoryRef].AsString();
55 set => this.Set((int)NetFxNativeImageSymbolFields.ApplicationBaseDirectoryRef, value);
56 }
57 }
58} \ No newline at end of file
diff --git a/src/ext/NetFx/wixext/Symbols/NetfxSymbolDefinitions.cs b/src/ext/NetFx/wixext/Symbols/NetfxSymbolDefinitions.cs
new file mode 100644
index 00000000..3c0f1176
--- /dev/null
+++ b/src/ext/NetFx/wixext/Symbols/NetfxSymbolDefinitions.cs
@@ -0,0 +1,26 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Netfx.Symbols
4{
5 using WixToolset.Data;
6
7 public static class NetfxSymbolDefinitionNames
8 {
9 public static string NetFxNativeImage { get; } = "NetFxNativeImage";
10 }
11
12 public static class NetfxSymbolDefinitions
13 {
14 public static readonly IntermediateSymbolDefinition NetFxNativeImage = new IntermediateSymbolDefinition(
15 NetfxSymbolDefinitionNames.NetFxNativeImage,
16 new[]
17 {
18 new IntermediateFieldDefinition(nameof(NetFxNativeImageSymbolFields.FileRef), IntermediateFieldType.String),
19 new IntermediateFieldDefinition(nameof(NetFxNativeImageSymbolFields.Priority), IntermediateFieldType.Number),
20 new IntermediateFieldDefinition(nameof(NetFxNativeImageSymbolFields.Attributes), IntermediateFieldType.Number),
21 new IntermediateFieldDefinition(nameof(NetFxNativeImageSymbolFields.ApplicationFileRef), IntermediateFieldType.String),
22 new IntermediateFieldDefinition(nameof(NetFxNativeImageSymbolFields.ApplicationBaseDirectoryRef), IntermediateFieldType.String),
23 },
24 typeof(NetFxNativeImageSymbol));
25 }
26}
diff --git a/src/ext/NetFx/wixext/WixToolset.Netfx.wixext.csproj b/src/ext/NetFx/wixext/WixToolset.Netfx.wixext.csproj
new file mode 100644
index 00000000..7c1d55c1
--- /dev/null
+++ b/src/ext/NetFx/wixext/WixToolset.Netfx.wixext.csproj
@@ -0,0 +1,31 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3
4<Project Sdk="Microsoft.NET.Sdk">
5 <PropertyGroup>
6 <TargetFramework>netstandard2.0</TargetFramework>
7 <DebugType>embedded</DebugType>
8 <RootNamespace>WixToolset.Netfx</RootNamespace>
9 <Description>WiX Toolset .NET Framework Extension</Description>
10 <Title>WiX Toolset .NET Framework Extension</Title>
11 <IncludeSymbols>true</IncludeSymbols>
12 </PropertyGroup>
13
14 <ItemGroup>
15 <EmbeddedResource Include="$(OutputPath)..\netfx.wixlib" />
16 </ItemGroup>
17
18 <ItemGroup>
19 <ProjectReference Include="..\wixlib\netfx.wixproj" ReferenceOutputAssembly="false" Condition=" '$(NCrunch)'=='' " />
20 </ItemGroup>
21
22 <ItemGroup>
23 <PackageReference Include="WixToolset.Data" Version="4.0.*" PrivateAssets="all" />
24 <PackageReference Include="WixToolset.Extensibility" Version="4.0.*" PrivateAssets="all" />
25 </ItemGroup>
26
27 <ItemGroup>
28 <PackageReference Include="Microsoft.SourceLink.GitHub" Version="1.0.0" PrivateAssets="all" />
29 <PackageReference Include="Nerdbank.GitVersioning" Version="3.3.37" PrivateAssets="all" />
30 </ItemGroup>
31</Project>
diff --git a/src/ext/NetFx/wixext/WixToolset.Netfx.wixext.nuspec b/src/ext/NetFx/wixext/WixToolset.Netfx.wixext.nuspec
new file mode 100644
index 00000000..ba3eaade
--- /dev/null
+++ b/src/ext/NetFx/wixext/WixToolset.Netfx.wixext.nuspec
@@ -0,0 +1,25 @@
1<?xml version="1.0"?>
2<package xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd">
3 <metadata minClientVersion="4.0">
4 <id>$id$</id>
5 <version>$version$</version>
6 <title>$title$</title>
7 <description>$description$</description>
8 <authors>$authors$</authors>
9 <license type="expression">MS-RL</license>
10 <requireLicenseAcceptance>false</requireLicenseAcceptance>
11 <copyright>$copyright$</copyright>
12 <projectUrl>$projectUrl$</projectUrl>
13 <repository type="$repositorytype$" url="$repositoryurl$" commit="$repositorycommit$" />
14 </metadata>
15
16 <files>
17 <file src="$projectFolder$$id$.targets" target="build" />
18
19 <file src="netstandard2.0\$id$.dll" target="tools" />
20
21 <file src="ARM64\*.pdb" target="pdbs\ARM64" />
22 <file src="x86\*.pdb" target="pdbs\x86" />
23 <file src="x64\*.pdb" target="pdbs\x64" />
24 </files>
25</package>
diff --git a/src/ext/NetFx/wixext/WixToolset.Netfx.wixext.targets b/src/ext/NetFx/wixext/WixToolset.Netfx.wixext.targets
new file mode 100644
index 00000000..2ed9c488
--- /dev/null
+++ b/src/ext/NetFx/wixext/WixToolset.Netfx.wixext.targets
@@ -0,0 +1,11 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3
4<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0">
5 <PropertyGroup>
6 <WixToolsetNetfxWixextPath Condition=" '$(WixToolsetNetfxWixextPath)' == '' ">$(MSBuildThisFileDirectory)..\tools\WixToolset.Netfx.wixext.dll</WixToolsetNetfxWixextPath>
7 </PropertyGroup>
8 <ItemGroup>
9 <WixExtension Include="$(WixToolsetNetfxWixextPath)" />
10 </ItemGroup>
11</Project>
diff --git a/src/ext/NetFx/wixext/WixToolset.Netfx.wixext.v3.ncrunchproject b/src/ext/NetFx/wixext/WixToolset.Netfx.wixext.v3.ncrunchproject
new file mode 100644
index 00000000..93e4df3d
--- /dev/null
+++ b/src/ext/NetFx/wixext/WixToolset.Netfx.wixext.v3.ncrunchproject
@@ -0,0 +1,7 @@
1<ProjectConfiguration>
2 <Settings>
3 <AdditionalFilesToIncludeForProject>
4 <Value>..\..\build\Debug\netfx.wixlib</Value>
5 </AdditionalFilesToIncludeForProject>
6 </Settings>
7</ProjectConfiguration> \ No newline at end of file
diff --git a/src/ext/NetFx/wixlib/NetCore3.1.12_x64.wxs b/src/ext/NetFx/wixlib/NetCore3.1.12_x64.wxs
new file mode 100644
index 00000000..990dc0bf
--- /dev/null
+++ b/src/ext/NetFx/wixlib/NetCore3.1.12_x64.wxs
@@ -0,0 +1,58 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2
3<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs" xmlns:util="http://wixtoolset.org/schemas/v4/wxs/util">
4
5 <?define NetCorePlatform = x64?>
6 <?define NetCoreIdVersion = 3112?>
7 <?define NetCoreVersion = 3.1.12?>
8 <?include NetCore3_Platform.wxi?>
9
10 <?define AspNetCoreRedistLink = https://download.visualstudio.microsoft.com/download/pr/20cf277c-2ccf-449f-a0b8-925ba0c175e7/aa50b052ceb8a8d36a5b4f9b8d0bd91c/aspnetcore-runtime-3.1.12-win-x64.exe?>
11 <?define DesktopNetCoreRedistLink = https://download.visualstudio.microsoft.com/download/pr/076a47e9-c65b-4b78-95a7-93eb988891a4/3574764590cfa650e0aa87c44d3fe384/windowsdesktop-runtime-3.1.12-win-x64.exe?>
12 <?define DotNetCoreRedistLink = https://download.visualstudio.microsoft.com/download/pr/2fdc3009-cf5c-4cf6-8f3b-a61e83200cbb/2c71ee04b48103a7464f4e28a8bf339b/dotnet-runtime-3.1.12-win-x64.exe?>
13
14 <Fragment>
15 <util:DirectorySearchRef Id="$(var.AspNetCoreId)" />
16
17 <WixVariable Id="AspNetCoreRuntime$(var.NetCoreIdVersion)Redist$(var.NetCorePlatform)DetectCondition" Value="$(var.AspNetCoreId)" Overridable="yes" />
18 <WixVariable Id="AspNetCoreRuntime$(var.NetCoreIdVersion)Redist$(var.NetCorePlatform)InstallCondition" Value="" Overridable="yes" />
19 <WixVariable Id="AspNetCoreRuntime$(var.NetCoreIdVersion)Redist$(var.NetCorePlatform)PackageDirectory" Value="redist\" Overridable="yes" />
20 <WixVariable Id="AspNetCoreRuntime$(var.NetCoreIdVersion)Redist$(var.NetCorePlatform)RepairArguments" Value="" Overridable="yes" />
21
22 <PackageGroup Id="$(var.AspNetCoreRedistId)">
23 <ExePackage InstallArguments="$(var.AspNetCoreRedistInstallArguments)" RepairArguments="!(wix.AspNetCoreRuntime$(var.NetCoreIdVersion)Redist$(var.NetCorePlatform)RepairArguments)" UninstallArguments="$(var.AspNetCoreRedistUninstallArguments)" PerMachine="yes" DetectCondition="!(wix.AspNetCoreRuntime$(var.NetCoreIdVersion)Redist$(var.NetCorePlatform)DetectCondition)" InstallCondition="!(wix.AspNetCoreRuntime$(var.NetCoreIdVersion)Redist$(var.NetCorePlatform)InstallCondition)" Id="$(var.AspNetCoreRedistId)" Vital="yes" Permanent="yes" Protocol="burn" LogPathVariable="$(var.AspNetCoreRedistLog)">
24 <ExePackagePayload Name="!(wix.AspNetCoreRuntime$(var.NetCoreIdVersion)Redist$(var.NetCorePlatform)PackageDirectory)aspnetcore-runtime-$(var.NetCoreVersion)-win-$(var.NetCorePlatform).exe" DownloadUrl="$(var.AspNetCoreRedistLink)" Description="Microsoft ASP.NET Core 3.1.12 - Shared Framework" Hash="5CE9839CAE90FB2936033431F2905E97C7DC080DC50108D58714939CCCC6A265694B8259A3BF742A68BF04D9CFFB0602B0306DD401C4CE644BDB96C7D1168E59" ProductName="Microsoft ASP.NET Core 3.1.12 - Shared Framework" Size="7841808" Version="3.1.12.21070" />
25 </ExePackage>
26 </PackageGroup>
27 </Fragment>
28
29 <Fragment>
30 <util:DirectorySearchRef Id="$(var.DesktopNetCoreId)" />
31
32 <WixVariable Id="DesktopNetCoreRuntime$(var.NetCoreIdVersion)Redist$(var.NetCorePlatform)DetectCondition" Value="$(var.DesktopNetCoreId)" Overridable="yes" />
33 <WixVariable Id="DesktopNetCoreRuntime$(var.NetCoreIdVersion)Redist$(var.NetCorePlatform)InstallCondition" Value="" Overridable="yes" />
34 <WixVariable Id="DesktopNetCoreRuntime$(var.NetCoreIdVersion)Redist$(var.NetCorePlatform)PackageDirectory" Value="redist\" Overridable="yes" />
35 <WixVariable Id="DesktopNetCoreRuntime$(var.NetCoreIdVersion)Redist$(var.NetCorePlatform)RepairArguments" Value="" Overridable="yes" />
36
37 <PackageGroup Id="$(var.DesktopNetCoreRedistId)">
38 <ExePackage InstallArguments="$(var.DesktopNetCoreRedistInstallArguments)" RepairArguments="!(wix.DesktopNetCoreRuntime$(var.NetCoreIdVersion)Redist$(var.NetCorePlatform)RepairArguments)" UninstallArguments="$(var.DesktopNetCoreRedistUninstallArguments)" PerMachine="yes" DetectCondition="!(wix.DesktopNetCoreRuntime$(var.NetCoreIdVersion)Redist$(var.NetCorePlatform)DetectCondition)" InstallCondition="!(wix.DesktopNetCoreRuntime$(var.NetCoreIdVersion)Redist$(var.NetCorePlatform)InstallCondition)" Id="$(var.DesktopNetCoreRedistId)" Vital="yes" Permanent="yes" Protocol="burn" LogPathVariable="$(var.DesktopNetCoreRedistLog)">
39 <ExePackagePayload Name="!(wix.DesktopNetCoreRuntime$(var.NetCoreIdVersion)Redist$(var.NetCorePlatform)PackageDirectory)windowsdesktop-runtime-$(var.NetCoreVersion)-win-$(var.NetCorePlatform).exe" DownloadUrl="$(var.DesktopNetCoreRedistLink)" Description="Microsoft Windows Desktop Runtime - 3.1.12 (x64)" Hash="CD69B8722B2FF175FADD6774AB6A97F89292FC57A15CEC95218E79FFF1E26F46A7EFFFB15CE0F6D22B83B991F7083BB5C04F5158F87D298EA0F204933F8ECD27" ProductName="Microsoft Windows Desktop Runtime - 3.1.12 (x64)" Size="54284816" Version="3.1.12.29719" />
40 </ExePackage>
41 </PackageGroup>
42 </Fragment>
43
44 <Fragment>
45 <util:DirectorySearchRef Id="$(var.DotNetCoreId)" />
46
47 <WixVariable Id="DotNetCoreRuntime$(var.NetCoreIdVersion)Redist$(var.NetCorePlatform)DetectCondition" Value="$(var.DotNetCoreId)" Overridable="yes" />
48 <WixVariable Id="DotNetCoreRuntime$(var.NetCoreIdVersion)Redist$(var.NetCorePlatform)InstallCondition" Value="" Overridable="yes" />
49 <WixVariable Id="DotNetCoreRuntime$(var.NetCoreIdVersion)Redist$(var.NetCorePlatform)PackageDirectory" Value="redist\" Overridable="yes" />
50 <WixVariable Id="DotNetCoreRuntime$(var.NetCoreIdVersion)Redist$(var.NetCorePlatform)RepairArguments" Value="" Overridable="yes" />
51
52 <PackageGroup Id="$(var.DotNetCoreRedistId)">
53 <ExePackage InstallArguments="$(var.DotNetCoreRedistInstallArguments)" RepairArguments="!(wix.DotNetCoreRuntime$(var.NetCoreIdVersion)Redist$(var.NetCorePlatform)RepairArguments)" UninstallArguments="$(var.DotNetCoreRedistUninstallArguments)" PerMachine="yes" DetectCondition="!(wix.DotNetCoreRuntime$(var.NetCoreIdVersion)Redist$(var.NetCorePlatform)DetectCondition)" InstallCondition="!(wix.DotNetCoreRuntime$(var.NetCoreIdVersion)Redist$(var.NetCorePlatform)InstallCondition)" Id="$(var.DotNetCoreRedistId)" Vital="yes" Permanent="yes" Protocol="burn" LogPathVariable="$(var.DotNetCoreRedistLog)">
54 <ExePackagePayload Name="!(wix.DotNetCoreRuntime$(var.NetCoreIdVersion)Redist$(var.NetCorePlatform)PackageDirectory)dotnet-runtime-$(var.NetCoreVersion)-win-$(var.NetCorePlatform).exe" DownloadUrl="$(var.DotNetCoreRedistLink)" Description="Microsoft .NET Core Runtime - 3.1.12 (x64)" Hash="9B3F882AE5DFDC8B50D3CEC4F3292292D658B2FECB84B3F73426FB3C16E6FC6B8E7118EF559CFAE25ED7A2C175FA4D89E18986CA3C05D15F706524FBB667F702" ProductName="Microsoft .NET Core Runtime - 3.1.12 (x64)" Size="26090616" Version="3.1.12.29719" />
55 </ExePackage>
56 </PackageGroup>
57 </Fragment>
58</Wix>
diff --git a/src/ext/NetFx/wixlib/NetCore3.1.12_x86.wxs b/src/ext/NetFx/wixlib/NetCore3.1.12_x86.wxs
new file mode 100644
index 00000000..b6d5d371
--- /dev/null
+++ b/src/ext/NetFx/wixlib/NetCore3.1.12_x86.wxs
@@ -0,0 +1,58 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2
3<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs" xmlns:util="http://wixtoolset.org/schemas/v4/wxs/util">
4
5 <?define NetCorePlatform = x86?>
6 <?define NetCoreIdVersion = 3112?>
7 <?define NetCoreVersion = 3.1.12?>
8 <?include NetCore3_Platform.wxi?>
9
10 <?define AspNetCoreRedistLink = https://download.visualstudio.microsoft.com/download/pr/55d6ff56-2725-4657-bffd-fdf35d6816fd/7431d1d3533f0b1ac97df734c45c33f2/aspnetcore-runtime-3.1.12-win-x86.exe?>
11 <?define DesktopNetCoreRedistLink = https://download.visualstudio.microsoft.com/download/pr/5d89a010-88bf-4e4e-ac12-a07258ddbf5f/1ff5dfe312c5bd9760f3b500b1b37597/windowsdesktop-runtime-3.1.12-win-x86.exe?>
12 <?define DotNetCoreRedistLink = https://download.visualstudio.microsoft.com/download/pr/cbdd1603-7fa9-4957-8869-94e24963ba6c/ca0b7d1be494882d5a7433accfa3c94c/dotnet-runtime-3.1.12-win-x86.exe?>
13
14 <Fragment>
15 <util:DirectorySearchRef Id="$(var.AspNetCoreId)" />
16
17 <WixVariable Id="AspNetCoreRuntime$(var.NetCoreIdVersion)Redist$(var.NetCorePlatform)DetectCondition" Value="$(var.AspNetCoreId)" Overridable="yes" />
18 <WixVariable Id="AspNetCoreRuntime$(var.NetCoreIdVersion)Redist$(var.NetCorePlatform)InstallCondition" Value="" Overridable="yes" />
19 <WixVariable Id="AspNetCoreRuntime$(var.NetCoreIdVersion)Redist$(var.NetCorePlatform)PackageDirectory" Value="redist\" Overridable="yes" />
20 <WixVariable Id="AspNetCoreRuntime$(var.NetCoreIdVersion)Redist$(var.NetCorePlatform)RepairArguments" Value="" Overridable="yes" />
21
22 <PackageGroup Id="$(var.AspNetCoreRedistId)">
23 <ExePackage InstallArguments="$(var.AspNetCoreRedistInstallArguments)" RepairArguments="!(wix.AspNetCoreRuntime$(var.NetCoreIdVersion)Redist$(var.NetCorePlatform)RepairArguments)" UninstallArguments="$(var.AspNetCoreRedistUninstallArguments)" PerMachine="yes" DetectCondition="!(wix.AspNetCoreRuntime$(var.NetCoreIdVersion)Redist$(var.NetCorePlatform)DetectCondition)" InstallCondition="!(wix.AspNetCoreRuntime$(var.NetCoreIdVersion)Redist$(var.NetCorePlatform)InstallCondition)" Id="$(var.AspNetCoreRedistId)" Vital="yes" Permanent="yes" Protocol="burn" LogPathVariable="$(var.AspNetCoreRedistLog)">
24 <ExePackagePayload Name="!(wix.AspNetCoreRuntime$(var.NetCoreIdVersion)Redist$(var.NetCorePlatform)PackageDirectory)aspnetcore-runtime-$(var.NetCoreVersion)-win-$(var.NetCorePlatform).exe" DownloadUrl="$(var.AspNetCoreRedistLink)" Description="Microsoft ASP.NET Core 3.1.12 - Shared Framework" Hash="03EE5F6D3B2AF8FFE2A5154BB05E50938E2D36E98D996D9E67A3C349DD0C8B3051D5A9628F48C51E006CEA0B1F4484B4BE51920FE5CA841060B0D2C6A12FD5D2" ProductName="Microsoft ASP.NET Core 3.1.12 - Shared Framework" Size="7841808" Version="3.1.12.21070" />
25 </ExePackage>
26 </PackageGroup>
27 </Fragment>
28
29 <Fragment>
30 <util:DirectorySearchRef Id="$(var.DesktopNetCoreId)" />
31
32 <WixVariable Id="DesktopNetCoreRuntime$(var.NetCoreIdVersion)Redist$(var.NetCorePlatform)DetectCondition" Value="$(var.DesktopNetCoreId)" Overridable="yes" />
33 <WixVariable Id="DesktopNetCoreRuntime$(var.NetCoreIdVersion)Redist$(var.NetCorePlatform)InstallCondition" Value="" Overridable="yes" />
34 <WixVariable Id="DesktopNetCoreRuntime$(var.NetCoreIdVersion)Redist$(var.NetCorePlatform)PackageDirectory" Value="redist\" Overridable="yes" />
35 <WixVariable Id="DesktopNetCoreRuntime$(var.NetCoreIdVersion)Redist$(var.NetCorePlatform)RepairArguments" Value="" Overridable="yes" />
36
37 <PackageGroup Id="$(var.DesktopNetCoreRedistId)">
38 <ExePackage InstallArguments="$(var.DesktopNetCoreRedistInstallArguments)" RepairArguments="!(wix.DesktopNetCoreRuntime$(var.NetCoreIdVersion)Redist$(var.NetCorePlatform)RepairArguments)" UninstallArguments="$(var.DesktopNetCoreRedistUninstallArguments)" PerMachine="yes" DetectCondition="!(wix.DesktopNetCoreRuntime$(var.NetCoreIdVersion)Redist$(var.NetCorePlatform)DetectCondition)" InstallCondition="!(wix.DesktopNetCoreRuntime$(var.NetCoreIdVersion)Redist$(var.NetCorePlatform)InstallCondition)" Id="$(var.DesktopNetCoreRedistId)" Vital="yes" Permanent="yes" Protocol="burn" LogPathVariable="$(var.DesktopNetCoreRedistLog)">
39 <ExePackagePayload Name="!(wix.DesktopNetCoreRuntime$(var.NetCoreIdVersion)Redist$(var.NetCorePlatform)PackageDirectory)windowsdesktop-runtime-$(var.NetCoreVersion)-win-$(var.NetCorePlatform).exe" DownloadUrl="$(var.DesktopNetCoreRedistLink)" Description="Microsoft Windows Desktop Runtime - 3.1.12 (x86)" Hash="C211A7F29D9B6FEEFCF0379B153FFBFB815157D3D494CFD7D0D84D619701EEA284BF12502094BCFF2BB2968213190454E7CE0E865FD623E78C2FCDAEBEF963DA" ProductName="Microsoft Windows Desktop Runtime - 3.1.12 (x86)" Size="48590696" Version="3.1.12.29719" />
40 </ExePackage>
41 </PackageGroup>
42 </Fragment>
43
44 <Fragment>
45 <util:DirectorySearchRef Id="$(var.DotNetCoreId)" />
46
47 <WixVariable Id="DotNetCoreRuntime$(var.NetCoreIdVersion)Redist$(var.NetCorePlatform)DetectCondition" Value="$(var.DotNetCoreId)" Overridable="yes" />
48 <WixVariable Id="DotNetCoreRuntime$(var.NetCoreIdVersion)Redist$(var.NetCorePlatform)InstallCondition" Value="" Overridable="yes" />
49 <WixVariable Id="DotNetCoreRuntime$(var.NetCoreIdVersion)Redist$(var.NetCorePlatform)PackageDirectory" Value="redist\" Overridable="yes" />
50 <WixVariable Id="DotNetCoreRuntime$(var.NetCoreIdVersion)Redist$(var.NetCorePlatform)RepairArguments" Value="" Overridable="yes" />
51
52 <PackageGroup Id="$(var.DotNetCoreRedistId)">
53 <ExePackage InstallArguments="$(var.DotNetCoreRedistInstallArguments)" RepairArguments="!(wix.DotNetCoreRuntime$(var.NetCoreIdVersion)Redist$(var.NetCorePlatform)RepairArguments)" UninstallArguments="$(var.DotNetCoreRedistUninstallArguments)" PerMachine="yes" DetectCondition="!(wix.DotNetCoreRuntime$(var.NetCoreIdVersion)Redist$(var.NetCorePlatform)DetectCondition)" InstallCondition="!(wix.DotNetCoreRuntime$(var.NetCoreIdVersion)Redist$(var.NetCorePlatform)InstallCondition)" Id="$(var.DotNetCoreRedistId)" Vital="yes" Permanent="yes" Protocol="burn" LogPathVariable="$(var.DotNetCoreRedistLog)">
54 <ExePackagePayload Name="!(wix.DotNetCoreRuntime$(var.NetCoreIdVersion)Redist$(var.NetCorePlatform)PackageDirectory)dotnet-runtime-$(var.NetCoreVersion)-win-$(var.NetCorePlatform).exe" DownloadUrl="$(var.DotNetCoreRedistLink)" Description="Microsoft .NET Core Runtime - 3.1.12 (x86)" Hash="BA18F9028B19630D91017BEACCD8D79388125C228A83B5A62306108F3BB283617A7ED9B98785BC73192EC00E5D186DA767E940DCAB388699FAF274E437D0C16F" ProductName="Microsoft .NET Core Runtime - 3.1.12 (x86)" Size="23392184" Version="3.1.12.29719" />
55 </ExePackage>
56 </PackageGroup>
57 </Fragment>
58</Wix>
diff --git a/src/ext/NetFx/wixlib/NetCore3.1_x64.wxs b/src/ext/NetFx/wixlib/NetCore3.1_x64.wxs
new file mode 100644
index 00000000..60d7c27f
--- /dev/null
+++ b/src/ext/NetFx/wixlib/NetCore3.1_x64.wxs
@@ -0,0 +1,22 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2
3<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
4
5 <Fragment>
6 <PackageGroup Id="AspNetCoreRuntime31Redist_x64">
7 <PackageGroupRef Id="AspNetCoreRuntime3112Redist_x64" />
8 </PackageGroup>
9 </Fragment>
10
11 <Fragment>
12 <PackageGroup Id="DesktopNetCoreRuntime31Redist_x64">
13 <PackageGroupRef Id="DesktopNetCoreRuntime3112Redist_x64" />
14 </PackageGroup>
15 </Fragment>
16
17 <Fragment>
18 <PackageGroup Id="DotNetCoreRuntime31Redist_x64">
19 <PackageGroupRef Id="DotNetCoreRuntime3112Redist_x64" />
20 </PackageGroup>
21 </Fragment>
22</Wix>
diff --git a/src/ext/NetFx/wixlib/NetCore3.1_x86.wxs b/src/ext/NetFx/wixlib/NetCore3.1_x86.wxs
new file mode 100644
index 00000000..cfff07b3
--- /dev/null
+++ b/src/ext/NetFx/wixlib/NetCore3.1_x86.wxs
@@ -0,0 +1,22 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2
3<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
4
5 <Fragment>
6 <PackageGroup Id="AspNetCoreRuntime31Redist_x86">
7 <PackageGroupRef Id="AspNetCoreRuntime3112Redist_x86" />
8 </PackageGroup>
9 </Fragment>
10
11 <Fragment>
12 <PackageGroup Id="DesktopNetCoreRuntime31Redist_x86">
13 <PackageGroupRef Id="DesktopNetCoreRuntime3112Redist_x86" />
14 </PackageGroup>
15 </Fragment>
16
17 <Fragment>
18 <PackageGroup Id="DotNetCoreRuntime31Redist_x86">
19 <PackageGroupRef Id="DotNetCoreRuntime3112Redist_x86" />
20 </PackageGroup>
21 </Fragment>
22</Wix>
diff --git a/src/ext/NetFx/wixlib/NetCore3_Platform.wxi b/src/ext/NetFx/wixlib/NetCore3_Platform.wxi
new file mode 100644
index 00000000..c7aaca50
--- /dev/null
+++ b/src/ext/NetFx/wixlib/NetCore3_Platform.wxi
@@ -0,0 +1,65 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2
3
4<Include xmlns="http://wixtoolset.org/schemas/v4/wxs" xmlns:bal="http://wixtoolset.org/schemas/v4/wxs/bal" xmlns:util="http://wixtoolset.org/schemas/v4/wxs/util">
5
6 <?define AspNetCoreId = ASPNETCORERUNTIME$(var.NetCoreIdVersion)_$(var.NetCorePlatform)?>
7 <?define AspNetCoreRedistId = AspNetCoreRuntime$(var.NetCoreIdVersion)Redist_$(var.NetCorePlatform)?>
8 <?define AspNetCoreRedistLog = AspNetCoreRuntime$(var.NetCoreIdVersion)RedistLog?>
9 <?define AspNetCoreRedistInstallArguments = /install /quiet /norestart /log &quot;[$(var.AspNetCoreRedistLog)]&quot;?>
10 <?define AspNetCoreRedistUninstallArguments = /uninstall /quiet /norestart /log &quot;[$(var.AspNetCoreRedistLog)]&quot;?>
11
12 <?define DesktopNetCoreId = DESKTOPNETCORERUNTIME$(var.NetCoreIdVersion)_$(var.NetCorePlatform)?>
13 <?define DesktopNetCoreRedistId = DesktopNetCoreRuntime$(var.NetCoreIdVersion)Redist_$(var.NetCorePlatform)?>
14 <?define DesktopNetCoreRedistLog = DesktopNetCoreRuntime$(var.NetCoreIdVersion)RedistLog?>
15 <?define DesktopNetCoreRedistInstallArguments = /install /quiet /norestart /log &quot;[$(var.DesktopNetCoreRedistLog)]&quot;?>
16 <?define DesktopNetCoreRedistUninstallArguments = /uninstall /quiet /norestart /log &quot;[$(var.DesktopNetCoreRedistLog)]&quot;?>
17
18 <?define DotNetCoreId = DOTNETCORERUNTIME$(var.NetCoreIdVersion)_$(var.NetCorePlatform)?>
19 <?define DotNetCoreRedistId = DotNetCoreRuntime$(var.NetCoreIdVersion)Redist_$(var.NetCorePlatform)?>
20 <?define DotNetCoreRedistLog = DotNetCoreRuntime$(var.NetCoreIdVersion)RedistLog?>
21 <?define DotNetCoreRedistInstallArguments = /install /quiet /norestart /log &quot;[$(var.DotNetCoreRedistLog)]&quot;?>
22 <?define DotNetCoreRedistUninstallArguments = /uninstall /quiet /norestart /log &quot;[$(var.DotNetCoreRedistLog)]&quot;?>
23
24 <?define DotNetHomeId = DOTNETHOME_$(var.NetCorePlatform)?>
25 <?define NetCoreEulaLink = https://go.microsoft.com/fwlink/?LinkId=329770?>
26
27 <Fragment>
28 <util:RegistrySearchRef Id="$(var.DotNetHomeId)" />
29 <util:DirectorySearch Id="$(var.AspNetCoreId)" Variable="$(var.AspNetCoreId)" Path="[$(var.DotNetHomeId)]\shared\Microsoft.AspNetCore.App\$(var.NetCoreVersion)" Result="exists" After="$(var.DotNetHomeId)" />
30 </Fragment>
31
32 <Fragment>
33 <util:RegistrySearchRef Id="$(var.DotNetHomeId)" />
34 <util:DirectorySearch Id="$(var.DesktopNetCoreId)" Variable="$(var.DesktopNetCoreId)" Path="[$(var.DotNetHomeId)]\shared\Microsoft.WindowsDesktop.App\$(var.NetCoreVersion)" Result="exists" After="$(var.DotNetHomeId)" />
35 </Fragment>
36
37 <Fragment>
38 <util:RegistrySearchRef Id="$(var.DotNetHomeId)" />
39 <util:DirectorySearch Id="$(var.DotNetCoreId)" Variable="$(var.DotNetCoreId)" Path="[$(var.DotNetHomeId)]\shared\Microsoft.NETCore.App\$(var.NetCoreVersion)" Result="exists" After="$(var.DotNetHomeId)" />
40 </Fragment>
41
42 <Fragment>
43 <PackageGroup Id="$(var.AspNetCoreRedistId)AsPrereq">
44 <PackageGroupRef Id="$(var.AspNetCoreRedistId)" />
45 </PackageGroup>
46
47 <bal:ManagedBootstrapperApplicationPrereqInformation PackageId="$(var.AspNetCoreRedistId)" LicenseUrl="$(var.NetCoreEulaLink)" />
48 </Fragment>
49
50 <Fragment>
51 <PackageGroup Id="$(var.DesktopNetCoreRedistId)AsPrereq">
52 <PackageGroupRef Id="$(var.DesktopNetCoreRedistId)" />
53 </PackageGroup>
54
55 <bal:ManagedBootstrapperApplicationPrereqInformation PackageId="$(var.DesktopNetCoreRedistId)" LicenseUrl="$(var.NetCoreEulaLink)" />
56 </Fragment>
57
58 <Fragment>
59 <PackageGroup Id="$(var.DotNetCoreRedistId)AsPrereq">
60 <PackageGroupRef Id="$(var.DotNetCoreRedistId)" />
61 </PackageGroup>
62
63 <bal:ManagedBootstrapperApplicationPrereqInformation PackageId="$(var.DotNetCoreRedistId)" LicenseUrl="$(var.NetCoreEulaLink)" />
64 </Fragment>
65</Include>
diff --git a/src/ext/NetFx/wixlib/NetCoreShared.wxs b/src/ext/NetFx/wixlib/NetCoreShared.wxs
new file mode 100644
index 00000000..0332041a
--- /dev/null
+++ b/src/ext/NetFx/wixlib/NetCoreShared.wxs
@@ -0,0 +1,11 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2
3
4<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs" xmlns:util="http://wixtoolset.org/schemas/v4/wxs/util">
5
6 <?foreach PLATFORM in x86;x64?>
7 <Fragment>
8 <util:RegistrySearch Id="DOTNETHOME_$(var.PLATFORM)" Variable="DOTNETHOME_$(var.PLATFORM)" Root="HKLM" Key="SOFTWARE\dotnet\Setup\InstalledVersions\$(var.PLATFORM)" Value="InstallLocation" Result="value" Bitness="always32" />
9 </Fragment>
10 <?endforeach?>
11</Wix>
diff --git a/src/ext/NetFx/wixlib/NetFx1.1.wxs b/src/ext/NetFx/wixlib/NetFx1.1.wxs
new file mode 100644
index 00000000..12f0a4e3
--- /dev/null
+++ b/src/ext/NetFx/wixlib/NetFx1.1.wxs
@@ -0,0 +1,191 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2
3
4<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
5
6 <!--
7 .NET Framework installation state properties
8
9 Official documentation can be found at the following location:
10
11 .NET Framework 1.1 - http://msdn.microsoft.com/library/ms994339.aspx
12 -->
13
14 <!-- set to #1 if the .NET Framework 1.1 is installed (not set otherwise) -->
15 <Fragment>
16 <Property Id="NETFRAMEWORK11" Secure="yes">
17 <RegistrySearch Id="NetFramework11" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v1.1.4322" Name="Install" Type="raw" />
18 </Property>
19 </Fragment>
20
21 <!-- Indicates the service pack level for the .NET Framework 1.1. -->
22 <Fragment>
23 <Property Id="NETFRAMEWORK11_SP_LEVEL" Secure="yes">
24 <RegistrySearch Id="NetFramework11SP" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v1.1.4322" Name="SP" Type="raw" />
25 </Property>
26 </Fragment>
27
28 <!-- Location of .NET Framework 1.1 redistributable install root directory -->
29 <Fragment>
30 <Property Id="NETFRAMEWORK11INSTALLROOTDIR" Secure="yes">
31 <RegistrySearch Id="NetFxInstallRootForNetfx11Search" Type="raw" Root="HKLM" Key="Software\Microsoft\.NETFramework" Name="InstallRoot">
32 <DirectorySearch Id="NetFx11InstallRootSearch" Path="v1.1.4322" Depth="0" />
33 </RegistrySearch>
34 </Property>
35 </Fragment>
36
37 <!-- set to #1 if the .NET Framework 1.1 Chinese (Simplified) language pack is installed (not set otherwise) -->
38 <Fragment>
39 <Property Id="NETFRAMEWORK11_ZH_CN_LANGPACK" Secure="yes">
40 <RegistrySearch Id="NetFramework11ZhCnLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v1.1.4322\2052" Name="Install" Type="raw" />
41 </Property>
42 </Fragment>
43
44 <!-- set to #1 if the .NET Framework 1.1 Chinese (Traditional) language pack is installed (not set otherwise) -->
45 <Fragment>
46 <Property Id="NETFRAMEWORK11_ZH_TW_LANGPACK" Secure="yes">
47 <RegistrySearch Id="NetFramework11ZhTwLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v1.1.4322\1028" Name="Install" Type="raw" />
48 </Property>
49 </Fragment>
50
51 <!-- set to #1 if the .NET Framework 1.1 Czech language pack is installed (not set otherwise) -->
52 <Fragment>
53 <Property Id="NETFRAMEWORK11_CS_CZ_LANGPACK" Secure="yes">
54 <RegistrySearch Id="NetFramework11CsCzLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v1.1.4322\1029" Name="Install" Type="raw" />
55 </Property>
56 </Fragment>
57
58 <!-- set to #1 if the .NET Framework 1.1 Danish language pack is installed (not set otherwise) -->
59 <Fragment>
60 <Property Id="NETFRAMEWORK11_DA_DK_LANGPACK" Secure="yes">
61 <RegistrySearch Id="NetFramework11DaDkLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v1.1.4322\1030" Name="Install" Type="raw" />
62 </Property>
63 </Fragment>
64
65 <!-- set to #1 if the .NET Framework 1.1 Dutch language pack is installed (not set otherwise) -->
66 <Fragment>
67 <Property Id="NETFRAMEWORK11_NL_NL_LANGPACK" Secure="yes">
68 <RegistrySearch Id="NetFramework11NlNlLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v1.1.4322\1043" Name="Install" Type="raw" />
69 </Property>
70 </Fragment>
71
72 <!-- set to #1 if the .NET Framework 1.1 Finnish language pack is installed (not set otherwise) -->
73 <Fragment>
74 <Property Id="NETFRAMEWORK11_FI_FI_LANGPACK" Secure="yes">
75 <RegistrySearch Id="NetFramework11FiFiLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v1.1.4322\1035" Name="Install" Type="raw" />
76 </Property>
77 </Fragment>
78
79 <!-- set to #1 if the .NET Framework 1.1 French language pack is installed (not set otherwise) -->
80 <Fragment>
81 <Property Id="NETFRAMEWORK11_FR_FR_LANGPACK" Secure="yes">
82 <RegistrySearch Id="NetFramework11FrFrLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v1.1.4322\1036" Name="Install" Type="raw" />
83 </Property>
84 </Fragment>
85
86 <!-- set to #1 if the .NET Framework 1.1 German language pack is installed (not set otherwise) -->
87 <Fragment>
88 <Property Id="NETFRAMEWORK11_DE_DE_LANGPACK" Secure="yes">
89 <RegistrySearch Id="NetFramework11DeDeLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v1.1.4322\1031" Name="Install" Type="raw" />
90 </Property>
91 </Fragment>
92
93 <!-- set to #1 if the .NET Framework 1.1 Greek language pack is installed (not set otherwise) -->
94 <Fragment>
95 <Property Id="NETFRAMEWORK11_EL_GR_LANGPACK" Secure="yes">
96 <RegistrySearch Id="NetFramework11ElGrLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v1.1.4322\1032" Name="Install" Type="raw" />
97 </Property>
98 </Fragment>
99
100 <!-- set to #1 if the .NET Framework 1.1 Hungarian language pack is installed (not set otherwise) -->
101 <Fragment>
102 <Property Id="NETFRAMEWORK11_HU_HU_LANGPACK" Secure="yes">
103 <RegistrySearch Id="NetFramework11HuHuLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v1.1.4322\1038" Name="Install" Type="raw" />
104 </Property>
105 </Fragment>
106
107 <!-- set to #1 if the .NET Framework 1.1 Italian language pack is installed (not set otherwise) -->
108 <Fragment>
109 <Property Id="NETFRAMEWORK11_IT_IT_LANGPACK" Secure="yes">
110 <RegistrySearch Id="NetFramework11ItItLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v1.1.4322\1040" Name="Install" Type="raw" />
111 </Property>
112 </Fragment>
113
114 <!-- set to #1 if the .NET Framework 1.1 Japanese language pack is installed (not set otherwise) -->
115 <Fragment>
116 <Property Id="NETFRAMEWORK11_JA_JP_LANGPACK" Secure="yes">
117 <RegistrySearch Id="NetFramework11JaJpLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v1.1.4322\1041" Name="Install" Type="raw" />
118 </Property>
119 </Fragment>
120
121 <!-- set to #1 if the .NET Framework 1.1 Korean language pack is installed (not set otherwise) -->
122 <Fragment>
123 <Property Id="NETFRAMEWORK11_KO_KR_LANGPACK" Secure="yes">
124 <RegistrySearch Id="NetFramework11KoKrLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v1.1.4322\1042" Name="Install" Type="raw" />
125 </Property>
126 </Fragment>
127
128 <!-- set to #1 if the .NET Framework 1.1 Norwegian language pack is installed (not set otherwise) -->
129 <Fragment>
130 <Property Id="NETFRAMEWORK11_NB_NO_LANGPACK" Secure="yes">
131 <RegistrySearch Id="NetFramework11NbNoLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v1.1.4322\1044" Name="Install" Type="raw" />
132 </Property>
133 </Fragment>
134
135 <!-- set to #1 if the .NET Framework 1.1 Polish language pack is installed (not set otherwise) -->
136 <Fragment>
137 <Property Id="NETFRAMEWORK11_PL_PL_LANGPACK" Secure="yes">
138 <RegistrySearch Id="NetFramework11PlPlLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v1.1.4322\1045" Name="Install" Type="raw" />
139 </Property>
140 </Fragment>
141
142 <!-- set to #1 if the .NET Framework 1.1 Portuguese (Brazil) language pack is installed (not set otherwise) -->
143 <Fragment>
144 <Property Id="NETFRAMEWORK11_PT_BR_LANGPACK" Secure="yes">
145 <RegistrySearch Id="NetFramework11PtBrLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v1.1.4322\1046" Name="Install" Type="raw" />
146 </Property>
147 </Fragment>
148
149 <!-- set to #1 if the .NET Framework 1.1 Portuguese (Portugal) language pack is installed (not set otherwise) -->
150 <Fragment>
151 <Property Id="NETFRAMEWORK11_PT_PT_LANGPACK" Secure="yes">
152 <RegistrySearch Id="NetFramework11PtPtLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v1.1.4322\2070" Name="Install" Type="raw" />
153 </Property>
154 </Fragment>
155
156 <!-- set to #1 if the .NET Framework 1.1 Russian language pack is installed (not set otherwise) -->
157 <Fragment>
158 <Property Id="NETFRAMEWORK11_RU_RU_LANGPACK" Secure="yes">
159 <RegistrySearch Id="NetFramework11RuRuLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v1.1.4322\1049" Name="Install" Type="raw" />
160 </Property>
161 </Fragment>
162
163 <!-- set to #1 if the .NET Framework 1.1 Spanish language pack is installed (not set otherwise) -->
164 <Fragment>
165 <Property Id="NETFRAMEWORK11_ES_ES_LANGPACK" Secure="yes">
166 <RegistrySearch Id="NetFramework11EsEsLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v1.1.4322\3082" Name="Install" Type="raw" />
167 </Property>
168 </Fragment>
169
170 <!-- set to #1 if the .NET Framework 1.1 Swedish language pack is installed (not set otherwise) -->
171 <Fragment>
172 <Property Id="NETFRAMEWORK11_SV_SE_LANGPACK" Secure="yes">
173 <RegistrySearch Id="NetFramework11SvSeLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v1.1.4322\1053" Name="Install" Type="raw" />
174 </Property>
175 </Fragment>
176
177 <!-- set to #1 if the .NET Framework 1.1 Turkish language pack is installed (not set otherwise) -->
178 <Fragment>
179 <Property Id="NETFRAMEWORK11_TR_TR_LANGPACK" Secure="yes">
180 <RegistrySearch Id="NetFramework11TrTrLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v1.1.4322\1055" Name="Install" Type="raw" />
181 </Property>
182 </Fragment>
183
184 <!-- location of the .NET Framework 1.1 SDK installation root -->
185 <Fragment>
186 <Property Id="NETFRAMEWORK11SDKDIR" Secure="yes">
187 <RegistrySearch Id="NetFramework11SDKDir" Root="HKLM" Key="Software\Microsoft\.NETFramework" Name="sdkInstallRootv1.1" Type="raw" />
188 </Property>
189 </Fragment>
190
191</Wix>
diff --git a/src/ext/NetFx/wixlib/NetFx1.wxs b/src/ext/NetFx/wixlib/NetFx1.wxs
new file mode 100644
index 00000000..68d6f13d
--- /dev/null
+++ b/src/ext/NetFx/wixlib/NetFx1.wxs
@@ -0,0 +1,30 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2
3
4<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
5
6 <!--
7 .NET Framework installation state properties
8
9 Official documentation can be found at the following location:
10
11 .NET Framework 1.0 - http://msdn.microsoft.com/library/ms994349.aspx
12 -->
13
14 <!-- set to 3321-3705 if the .NET Framework 1.0 is installed (not set otherwise) -->
15 <Fragment>
16 <Property Id="NETFRAMEWORK10" Secure="yes">
17 <RegistrySearch Id="NetFramework10" Root="HKLM" Key="SOFTWARE\Microsoft\.NETFramework\policy\v1.0" Name="3705" Type="raw" />
18 </Property>
19 </Fragment>
20
21 <!-- Location of .NET Framework 1.0 redistributable install root directory -->
22 <Fragment>
23 <Property Id="NETFRAMEWORK10INSTALLROOTDIR" Secure="yes">
24 <RegistrySearch Id="NetFxInstallRootForNetfx10Search" Type="raw" Root="HKLM" Key="Software\Microsoft\.NETFramework" Name="InstallRoot">
25 <DirectorySearch Id="NetFx10InstallRootSearch" Path="v1.0.3705" Depth="0" />
26 </RegistrySearch>
27 </Property>
28 </Fragment>
29
30</Wix>
diff --git a/src/ext/NetFx/wixlib/NetFx2.wxs b/src/ext/NetFx/wixlib/NetFx2.wxs
new file mode 100644
index 00000000..e5eef54b
--- /dev/null
+++ b/src/ext/NetFx/wixlib/NetFx2.wxs
@@ -0,0 +1,200 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2
3
4<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
5
6 <!--
7 .NET Framework installation state properties
8
9 Official documentation can be found at the following location:
10
11 .NET Framework 2.0 - http://msdn.microsoft.com/library/aa480243.aspx
12 -->
13
14 <!-- set to #1 if the .NET Framework 2.0 is installed (not set otherwise) -->
15 <Fragment>
16 <Property Id="NETFRAMEWORK20" Secure="yes">
17 <RegistrySearch Id="NetFramework20" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v2.0.50727" Name="Install" Type="raw" />
18 </Property>
19 </Fragment>
20
21 <!-- Indicates the service pack level for the .NET Framework 2.0. -->
22 <Fragment>
23 <Property Id="NETFRAMEWORK20_SP_LEVEL" Secure="yes">
24 <RegistrySearch Id="NetFramework20SP" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v2.0.50727" Name="SP" Type="raw" />
25 </Property>
26 </Fragment>
27
28 <!-- Location of .NET Framework 2.0 redistributable install root directory -->
29 <Fragment>
30 <Property Id="NETFRAMEWORK20INSTALLROOTDIR" Secure="yes">
31 <RegistrySearch Id="NetFxInstallRootForNetfx20Search" Type="raw" Root="HKLM" Key="Software\Microsoft\.NETFramework" Name="InstallRoot">
32 <DirectorySearch Id="NetFx20InstallRootSearch" Path="v2.0.50727" Depth="0" />
33 </RegistrySearch>
34 </Property>
35 </Fragment>
36
37 <!-- Location of .NET Framework 2.0 (64-bit) redistributable install root directory -->
38 <Fragment>
39 <Property Id="NETFRAMEWORK20INSTALLROOTDIR64" Secure="yes">
40 <RegistrySearch Id="NetFxInstallRootForNetfx20Search64" Type="raw" Root="HKLM" Key="Software\Microsoft\.NETFramework" Name="InstallRoot" Bitness="always64">
41 <DirectorySearch Id="NetFx20InstallRootSearch64" Path="v2.0.50727" Depth="0" />
42 </RegistrySearch>
43 </Property>
44 </Fragment>
45
46 <!-- set to #1 if the .NET Framework 2.0 Chinese (Simplified) language pack is installed (not set otherwise) -->
47 <Fragment>
48 <Property Id="NETFRAMEWORK20_ZH_CN_LANGPACK" Secure="yes">
49 <RegistrySearch Id="NETFRAMEWORK20ZhCnLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v2.0.50727\2052" Name="Install" Type="raw" />
50 </Property>
51 </Fragment>
52
53 <!-- set to #1 if the .NET Framework 2.0 Chinese (Traditional) language pack is installed (not set otherwise) -->
54 <Fragment>
55 <Property Id="NETFRAMEWORK20_ZH_TW_LANGPACK" Secure="yes">
56 <RegistrySearch Id="NETFRAMEWORK20ZhTwLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v2.0.50727\1028" Name="Install" Type="raw" />
57 </Property>
58 </Fragment>
59
60 <!-- set to #1 if the .NET Framework 2.0 Czech language pack is installed (not set otherwise) -->
61 <Fragment>
62 <Property Id="NETFRAMEWORK20_CS_CZ_LANGPACK" Secure="yes">
63 <RegistrySearch Id="NETFRAMEWORK20CsCzLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v2.0.50727\1029" Name="Install" Type="raw" />
64 </Property>
65 </Fragment>
66
67 <!-- set to #1 if the .NET Framework 2.0 Danish language pack is installed (not set otherwise) -->
68 <Fragment>
69 <Property Id="NETFRAMEWORK20_DA_DK_LANGPACK" Secure="yes">
70 <RegistrySearch Id="NETFRAMEWORK20DaDkLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v2.0.50727\1030" Name="Install" Type="raw" />
71 </Property>
72 </Fragment>
73
74 <!-- set to #1 if the .NET Framework 2.0 Dutch language pack is installed (not set otherwise) -->
75 <Fragment>
76 <Property Id="NETFRAMEWORK20_NL_NL_LANGPACK" Secure="yes">
77 <RegistrySearch Id="NETFRAMEWORK20NlNlLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v2.0.50727\1043" Name="Install" Type="raw" />
78 </Property>
79 </Fragment>
80
81 <!-- set to #1 if the .NET Framework 2.0 Finnish language pack is installed (not set otherwise) -->
82 <Fragment>
83 <Property Id="NETFRAMEWORK20_FI_FI_LANGPACK" Secure="yes">
84 <RegistrySearch Id="NETFRAMEWORK20FiFiLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v2.0.50727\1035" Name="Install" Type="raw" />
85 </Property>
86 </Fragment>
87
88 <!-- set to #1 if the .NET Framework 2.0 French language pack is installed (not set otherwise) -->
89 <Fragment>
90 <Property Id="NETFRAMEWORK20_FR_FR_LANGPACK" Secure="yes">
91 <RegistrySearch Id="NETFRAMEWORK20FrFrLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v2.0.50727\1036" Name="Install" Type="raw" />
92 </Property>
93 </Fragment>
94
95 <!-- set to #1 if the .NET Framework 2.0 German language pack is installed (not set otherwise) -->
96 <Fragment>
97 <Property Id="NETFRAMEWORK20_DE_DE_LANGPACK" Secure="yes">
98 <RegistrySearch Id="NETFRAMEWORK20DeDeLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v2.0.50727\1031" Name="Install" Type="raw" />
99 </Property>
100 </Fragment>
101
102 <!-- set to #1 if the .NET Framework 2.0 Greek language pack is installed (not set otherwise) -->
103 <Fragment>
104 <Property Id="NETFRAMEWORK20_EL_GR_LANGPACK" Secure="yes">
105 <RegistrySearch Id="NETFRAMEWORK20ElGrLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v2.0.50727\1032" Name="Install" Type="raw" />
106 </Property>
107 </Fragment>
108
109 <!-- set to #1 if the .NET Framework 2.0 Hungarian language pack is installed (not set otherwise) -->
110 <Fragment>
111 <Property Id="NETFRAMEWORK20_HU_HU_LANGPACK" Secure="yes">
112 <RegistrySearch Id="NETFRAMEWORK20HuHuLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v2.0.50727\1038" Name="Install" Type="raw" />
113 </Property>
114 </Fragment>
115
116 <!-- set to #1 if the .NET Framework 2.0 Italian language pack is installed (not set otherwise) -->
117 <Fragment>
118 <Property Id="NETFRAMEWORK20_IT_IT_LANGPACK" Secure="yes">
119 <RegistrySearch Id="NETFRAMEWORK20ItItLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v2.0.50727\1040" Name="Install" Type="raw" />
120 </Property>
121 </Fragment>
122
123 <!-- set to #1 if the .NET Framework 2.0 Japanese language pack is installed (not set otherwise) -->
124 <Fragment>
125 <Property Id="NETFRAMEWORK20_JA_JP_LANGPACK" Secure="yes">
126 <RegistrySearch Id="NETFRAMEWORK20JaJpLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v2.0.50727\1041" Name="Install" Type="raw" />
127 </Property>
128 </Fragment>
129
130 <!-- set to #1 if the .NET Framework 2.0 Korean language pack is installed (not set otherwise) -->
131 <Fragment>
132 <Property Id="NETFRAMEWORK20_KO_KR_LANGPACK" Secure="yes">
133 <RegistrySearch Id="NETFRAMEWORK20KoKrLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v2.0.50727\1042" Name="Install" Type="raw" />
134 </Property>
135 </Fragment>
136
137 <!-- set to #1 if the .NET Framework 2.0 Norwegian language pack is installed (not set otherwise) -->
138 <Fragment>
139 <Property Id="NETFRAMEWORK20_NB_NO_LANGPACK" Secure="yes">
140 <RegistrySearch Id="NETFRAMEWORK20NbNoLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v2.0.50727\1044" Name="Install" Type="raw" />
141 </Property>
142 </Fragment>
143
144 <!-- set to #1 if the .NET Framework 2.0 Polish language pack is installed (not set otherwise) -->
145 <Fragment>
146 <Property Id="NETFRAMEWORK20_PL_PL_LANGPACK" Secure="yes">
147 <RegistrySearch Id="NETFRAMEWORK20PlPlLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v2.0.50727\1045" Name="Install" Type="raw" />
148 </Property>
149 </Fragment>
150
151 <!-- set to #1 if the .NET Framework 2.0 Portuguese (Brazil) language pack is installed (not set otherwise) -->
152 <Fragment>
153 <Property Id="NETFRAMEWORK20_PT_BR_LANGPACK" Secure="yes">
154 <RegistrySearch Id="NETFRAMEWORK20PtBrLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v2.0.50727\1046" Name="Install" Type="raw" />
155 </Property>
156 </Fragment>
157
158 <!-- set to #1 if the .NET Framework 2.0 Portuguese (Portugal) language pack is installed (not set otherwise) -->
159 <Fragment>
160 <Property Id="NETFRAMEWORK20_PT_PT_LANGPACK" Secure="yes">
161 <RegistrySearch Id="NETFRAMEWORK20PtPtLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v2.0.50727\2070" Name="Install" Type="raw" />
162 </Property>
163 </Fragment>
164
165 <!-- set to #1 if the .NET Framework 2.0 Russian language pack is installed (not set otherwise) -->
166 <Fragment>
167 <Property Id="NETFRAMEWORK20_RU_RU_LANGPACK" Secure="yes">
168 <RegistrySearch Id="NETFRAMEWORK20RuRuLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v2.0.50727\1049" Name="Install" Type="raw" />
169 </Property>
170 </Fragment>
171
172 <!-- set to #1 if the .NET Framework 2.0 Spanish language pack is installed (not set otherwise) -->
173 <Fragment>
174 <Property Id="NETFRAMEWORK20_ES_ES_LANGPACK" Secure="yes">
175 <RegistrySearch Id="NETFRAMEWORK20EsEsLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v2.0.50727\3082" Name="Install" Type="raw" />
176 </Property>
177 </Fragment>
178
179 <!-- set to #1 if the .NET Framework 2.0 Swedish language pack is installed (not set otherwise) -->
180 <Fragment>
181 <Property Id="NETFRAMEWORK20_SV_SE_LANGPACK" Secure="yes">
182 <RegistrySearch Id="NETFRAMEWORK20SvSeLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v2.0.50727\1053" Name="Install" Type="raw" />
183 </Property>
184 </Fragment>
185
186 <!-- set to #1 if the .NET Framework 2.0 Turkish language pack is installed (not set otherwise) -->
187 <Fragment>
188 <Property Id="NETFRAMEWORK20_TR_TR_LANGPACK" Secure="yes">
189 <RegistrySearch Id="NETFRAMEWORK20TrTrLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v2.0.50727\1055" Name="Install" Type="raw" />
190 </Property>
191 </Fragment>
192
193 <!-- location of the .NET Framework 2.0 SDK installation root -->
194 <Fragment>
195 <Property Id="NETFRAMEWORK20SDKDIR" Secure="yes">
196 <RegistrySearch Id="NetFramework20SDKDir" Root="HKLM" Key="Software\Microsoft\.NETFramework" Name="sdkInstallRootv2.0" Type="raw" />
197 </Property>
198 </Fragment>
199
200</Wix>
diff --git a/src/ext/NetFx/wixlib/NetFx3.5.wxs b/src/ext/NetFx/wixlib/NetFx3.5.wxs
new file mode 100644
index 00000000..c1a80f50
--- /dev/null
+++ b/src/ext/NetFx/wixlib/NetFx3.5.wxs
@@ -0,0 +1,234 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2
3
4<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs" xmlns:util="http://wixtoolset.org/schemas/v4/wxs/util">
5
6 <!--
7 .NET Framework installation state properties
8
9 Official documentation can be found at the following locations:
10
11 .NET Framework 3.5 - http://msdn.microsoft.com/library/cc160716.aspx
12 .NET Framework 3.5 client profile - http://download.microsoft.com/download/5/a/a/5aa86d6c-969b-42d8-bc6b-30e02bfeccf0/NETFXClientProfile_DeploymentGuide.htm
13 -->
14
15 <!-- Indicates the service pack level for the .NET Framework 3.5 (for bundles). -->
16 <Fragment>
17 <util:RegistrySearch Id="NETFRAMEWORK35_SP_LEVEL" Variable="NETFRAMEWORK35_SP_LEVEL" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v3.5" Value="SP" Result="value" />
18 </Fragment>
19
20 <!-- set to #1 if the .NET Framework 3.5 is installed (not set otherwise) -->
21 <Fragment>
22 <Property Id="NETFRAMEWORK35" Secure="yes">
23 <RegistrySearch Id="NetFramework35" Root="HKLM" Key="SOFTWARE\Microsoft\NET Framework Setup\NDP\v3.5" Name="Install" Type="raw" />
24 </Property>
25 </Fragment>
26
27 <!-- Indicates the service pack level for the .NET Framework 3.5. -->
28 <Fragment>
29 <Property Id="NETFRAMEWORK35_SP_LEVEL" Secure="yes">
30 <RegistrySearch Id="NetFramework35SP" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v3.5" Name="SP" Type="raw" />
31 </Property>
32 </Fragment>
33
34 <!-- Location of .NET Framework 3.5 redistributable install root directory -->
35 <Fragment>
36 <Property Id="NETFRAMEWORK35INSTALLROOTDIR" Secure="yes">
37 <RegistrySearch Id="NetFxInstallRootForNetfx35Search" Type="raw" Root="HKLM" Key="Software\Microsoft\.NETFramework" Name="InstallRoot">
38 <DirectorySearch Id="NetFx35InstallRootSearch" Path="v3.5" Depth="0" />
39 </RegistrySearch>
40 </Property>
41 </Fragment>
42
43 <!-- Location of .NET Framework 3.5 (64-bit) redistributable install root directory -->
44 <Fragment>
45 <Property Id="NETFRAMEWORK35INSTALLROOTDIR64" Secure="yes">
46 <RegistrySearch Id="NetFxInstallRootForNetfx35Search64" Type="raw" Root="HKLM" Key="Software\Microsoft\.NETFramework" Name="InstallRoot" Bitness="always64">
47 <DirectorySearch Id="NetFx35InstallRootSearch64" Path="v3.5" Depth="0" />
48 </RegistrySearch>
49 </Property>
50 </Fragment>
51
52 <!-- set to #1 if the .NET Framework 3.5 Chinese (Simplified) language pack is installed (not set otherwise) -->
53 <Fragment>
54 <Property Id="NETFRAMEWORK35_ZH_CN_LANGPACK" Secure="yes">
55 <RegistrySearch Id="NETFRAMEWORK35ZhCnLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v3.5\2052" Name="Install" Type="raw" />
56 </Property>
57 </Fragment>
58
59 <!-- set to #1 if the .NET Framework 3.5 Chinese (Traditional) language pack is installed (not set otherwise) -->
60 <Fragment>
61 <Property Id="NETFRAMEWORK35_ZH_TW_LANGPACK" Secure="yes">
62 <RegistrySearch Id="NETFRAMEWORK35ZhTwLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v3.5\1028" Name="Install" Type="raw" />
63 </Property>
64 </Fragment>
65
66 <!-- set to #1 if the .NET Framework 3.5 Czech language pack is installed (not set otherwise) -->
67 <Fragment>
68 <Property Id="NETFRAMEWORK35_CS_CZ_LANGPACK" Secure="yes">
69 <RegistrySearch Id="NETFRAMEWORK35CsCzLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v3.5\1029" Name="Install" Type="raw" />
70 </Property>
71 </Fragment>
72
73 <!-- set to #1 if the .NET Framework 3.5 Danish language pack is installed (not set otherwise) -->
74 <Fragment>
75 <Property Id="NETFRAMEWORK35_DA_DK_LANGPACK" Secure="yes">
76 <RegistrySearch Id="NETFRAMEWORK35DaDkLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v3.5\1030" Name="Install" Type="raw" />
77 </Property>
78 </Fragment>
79
80 <!-- set to #1 if the .NET Framework 3.5 Dutch language pack is installed (not set otherwise) -->
81 <Fragment>
82 <Property Id="NETFRAMEWORK35_NL_NL_LANGPACK" Secure="yes">
83 <RegistrySearch Id="NETFRAMEWORK35NlNlLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v3.5\1043" Name="Install" Type="raw" />
84 </Property>
85 </Fragment>
86
87 <!-- set to #1 if the .NET Framework 3.5 Finnish language pack is installed (not set otherwise) -->
88 <Fragment>
89 <Property Id="NETFRAMEWORK35_FI_FI_LANGPACK" Secure="yes">
90 <RegistrySearch Id="NETFRAMEWORK35FiFiLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v3.5\1035" Name="Install" Type="raw" />
91 </Property>
92 </Fragment>
93
94 <!-- set to #1 if the .NET Framework 3.5 French language pack is installed (not set otherwise) -->
95 <Fragment>
96 <Property Id="NETFRAMEWORK35_FR_FR_LANGPACK" Secure="yes">
97 <RegistrySearch Id="NETFRAMEWORK35FrFrLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v3.5\1036" Name="Install" Type="raw" />
98 </Property>
99 </Fragment>
100
101 <!-- set to #1 if the .NET Framework 3.5 German language pack is installed (not set otherwise) -->
102 <Fragment>
103 <Property Id="NETFRAMEWORK35_DE_DE_LANGPACK" Secure="yes">
104 <RegistrySearch Id="NETFRAMEWORK35DeDeLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v3.5\1031" Name="Install" Type="raw" />
105 </Property>
106 </Fragment>
107
108 <!-- set to #1 if the .NET Framework 3.5 Greek language pack is installed (not set otherwise) -->
109 <Fragment>
110 <Property Id="NETFRAMEWORK35_EL_GR_LANGPACK" Secure="yes">
111 <RegistrySearch Id="NETFRAMEWORK35ElGrLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v3.5\1032" Name="Install" Type="raw" />
112 </Property>
113 </Fragment>
114
115 <!-- set to #1 if the .NET Framework 3.5 Hungarian language pack is installed (not set otherwise) -->
116 <Fragment>
117 <Property Id="NETFRAMEWORK35_HU_HU_LANGPACK" Secure="yes">
118 <RegistrySearch Id="NETFRAMEWORK35HuHuLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v3.5\1038" Name="Install" Type="raw" />
119 </Property>
120 </Fragment>
121
122 <!-- set to #1 if the .NET Framework 3.5 Italian language pack is installed (not set otherwise) -->
123 <Fragment>
124 <Property Id="NETFRAMEWORK35_IT_IT_LANGPACK" Secure="yes">
125 <RegistrySearch Id="NETFRAMEWORK35ItItLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v3.5\1040" Name="Install" Type="raw" />
126 </Property>
127 </Fragment>
128
129 <!-- set to #1 if the .NET Framework 3.5 Japanese language pack is installed (not set otherwise) -->
130 <Fragment>
131 <Property Id="NETFRAMEWORK35_JA_JP_LANGPACK" Secure="yes">
132 <RegistrySearch Id="NETFRAMEWORK35JaJpLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v3.5\1041" Name="Install" Type="raw" />
133 </Property>
134 </Fragment>
135
136 <!-- set to #1 if the .NET Framework 3.5 Korean language pack is installed (not set otherwise) -->
137 <Fragment>
138 <Property Id="NETFRAMEWORK35_KO_KR_LANGPACK" Secure="yes">
139 <RegistrySearch Id="NETFRAMEWORK35KoKrLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v3.5\1042" Name="Install" Type="raw" />
140 </Property>
141 </Fragment>
142
143 <!-- set to #1 if the .NET Framework 3.5 Norwegian language pack is installed (not set otherwise) -->
144 <Fragment>
145 <Property Id="NETFRAMEWORK35_NB_NO_LANGPACK" Secure="yes">
146 <RegistrySearch Id="NETFRAMEWORK35NbNoLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v3.5\1044" Name="Install" Type="raw" />
147 </Property>
148 </Fragment>
149
150 <!-- set to #1 if the .NET Framework 3.5 Polish language pack is installed (not set otherwise) -->
151 <Fragment>
152 <Property Id="NETFRAMEWORK35_PL_PL_LANGPACK" Secure="yes">
153 <RegistrySearch Id="NETFRAMEWORK35PlPlLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v3.5\1045" Name="Install" Type="raw" />
154 </Property>
155 </Fragment>
156
157 <!-- set to #1 if the .NET Framework 3.5 Portuguese (Brazil) language pack is installed (not set otherwise) -->
158 <Fragment>
159 <Property Id="NETFRAMEWORK35_PT_BR_LANGPACK" Secure="yes">
160 <RegistrySearch Id="NETFRAMEWORK35PtBrLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v3.5\1046" Name="Install" Type="raw" />
161 </Property>
162 </Fragment>
163
164 <!-- set to #1 if the .NET Framework 3.5 Portuguese (Portugal) language pack is installed (not set otherwise) -->
165 <Fragment>
166 <Property Id="NETFRAMEWORK35_PT_PT_LANGPACK" Secure="yes">
167 <RegistrySearch Id="NETFRAMEWORK35PtPtLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v3.5\2070" Name="Install" Type="raw" />
168 </Property>
169 </Fragment>
170
171 <!-- set to #1 if the .NET Framework 3.5 Russian language pack is installed (not set otherwise) -->
172 <Fragment>
173 <Property Id="NETFRAMEWORK35_RU_RU_LANGPACK" Secure="yes">
174 <RegistrySearch Id="NETFRAMEWORK35RuRuLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v3.5\1049" Name="Install" Type="raw" />
175 </Property>
176 </Fragment>
177
178 <!-- set to #1 if the .NET Framework 3.5 Spanish language pack is installed (not set otherwise) -->
179 <Fragment>
180 <Property Id="NETFRAMEWORK35_ES_ES_LANGPACK" Secure="yes">
181 <RegistrySearch Id="NETFRAMEWORK35EsEsLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v3.5\3082" Name="Install" Type="raw" />
182 </Property>
183 </Fragment>
184
185 <!-- set to #1 if the .NET Framework 3.5 Swedish language pack is installed (not set otherwise) -->
186 <Fragment>
187 <Property Id="NETFRAMEWORK35_SV_SE_LANGPACK" Secure="yes">
188 <RegistrySearch Id="NETFRAMEWORK35SvSeLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v3.5\1053" Name="Install" Type="raw" />
189 </Property>
190 </Fragment>
191
192 <!-- set to #1 if the .NET Framework 3.5 Turkish language pack is installed (not set otherwise) -->
193 <Fragment>
194 <Property Id="NETFRAMEWORK35_TR_TR_LANGPACK" Secure="yes">
195 <RegistrySearch Id="NETFRAMEWORK35TrTrLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v3.5\1055" Name="Install" Type="raw" />
196 </Property>
197 </Fragment>
198
199 <!-- set to #1 if the .NET Framework 3.5 client profile is installed (not set otherwise) -->
200 <Fragment>
201 <Property Id="NETFRAMEWORK35_CLIENT" Secure="yes">
202 <RegistrySearch Id="NETFRAMEWORK35ClientSearch" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\DotNetClient\v3.5" Name="Install" Type="raw" />
203 </Property>
204 </Fragment>
205
206 <!-- Indicates the service pack level for the .NET Framework 3.5 client profile -->
207 <Fragment>
208 <Property Id="NETFRAMEWORK35_CLIENT_SP_LEVEL" Secure="yes">
209 <RegistrySearch Id="NETFRAMEWORK35ClientSpSearch" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\DotNetClient\v3.5" Name="SP" Type="raw" />
210 </Property>
211 </Fragment>
212
213 <!-- location of the Windows SDK 6.0a installation root -->
214 <Fragment>
215 <Property Id="WINDOWSSDK60ADIR" Secure="yes">
216 <RegistrySearch Id="WindowsSdk60aDir" Root="HKLM" Key="Software\Microsoft\Microsoft SDKs\Windows\v6.0A" Name="InstallationFolder" Type="raw" />
217 </Property>
218 </Fragment>
219
220 <!-- location of the Windows SDK 6.1 installation root -->
221 <Fragment>
222 <Property Id="WINDOWSSDK61DIR" Secure="yes">
223 <RegistrySearch Id="WindowsSdk61Dir" Root="HKLM" Key="Software\Microsoft\Microsoft SDKs\Windows\v6.1" Name="InstallationFolder" Type="raw" />
224 </Property>
225 </Fragment>
226
227 <!-- location of the Windows SDK 7.0 installation root -->
228 <Fragment>
229 <Property Id="WINDOWSSDK70ADIR" Secure="yes">
230 <RegistrySearch Id="WindowsSdk70aDir" Root="HKLM" Key="Software\Microsoft\Microsoft SDKs\Windows\v7.0A" Name="InstallationFolder" Type="raw" />
231 </Property>
232 </Fragment>
233
234</Wix>
diff --git a/src/ext/NetFx/wixlib/NetFx3.wxs b/src/ext/NetFx/wixlib/NetFx3.wxs
new file mode 100644
index 00000000..5fb279ea
--- /dev/null
+++ b/src/ext/NetFx/wixlib/NetFx3.wxs
@@ -0,0 +1,194 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2
3
4<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
5
6 <!--
7 .NET Framework installation state properties
8
9 Official documentation can be found at the following location:
10
11 .NET Framework 3.0 - http://msdn.microsoft.com/library/aa964979.aspx
12 -->
13
14 <!-- set to #1 if the .NET Framework 3.0 is installed (not set otherwise) -->
15 <Fragment>
16 <Property Id="NETFRAMEWORK30" Secure="yes">
17 <RegistrySearch Id="NetFramework30" Root="HKLM" Key="SOFTWARE\Microsoft\NET Framework Setup\NDP\v3.0\Setup" Name="InstallSuccess" Type="raw" />
18 </Property>
19 </Fragment>
20
21 <!-- Indicates the service pack level for the .NET Framework 3.0. -->
22 <!-- This value will not exist until a service pack is installed. -->
23 <Fragment>
24 <Property Id="NETFRAMEWORK30_SP_LEVEL" Secure="yes">
25 <RegistrySearch Id="NetFramework30SP" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v3.0" Name="SP" Type="raw" />
26 </Property>
27 </Fragment>
28
29 <!-- Location of .NET Framework 3.0 redistributable install root directory -->
30 <Fragment>
31 <Property Id="NETFRAMEWORK30INSTALLROOTDIR" Secure="yes">
32 <RegistrySearch Id="NetFxInstallRootForNetfx30Search" Type="raw" Root="HKLM" Key="Software\Microsoft\.NETFramework" Name="InstallRoot">
33 <DirectorySearch Id="NetFx30InstallRootSearch" Path="v3.0" Depth="0" />
34 </RegistrySearch>
35 </Property>
36 </Fragment>
37
38 <!-- Location of .NET Framework 3.0 (64-bit) redistributable install root directory -->
39 <Fragment>
40 <Property Id="NETFRAMEWORK30INSTALLROOTDIR64" Secure="yes">
41 <RegistrySearch Id="NetFxInstallRootForNetfx30Search64" Type="raw" Root="HKLM" Key="Software\Microsoft\.NETFramework" Name="InstallRoot" Bitness="always64">
42 <DirectorySearch Id="NetFx30InstallRootSearch64" Path="v3.0" Depth="0" />
43 </RegistrySearch>
44 </Property>
45 </Fragment>
46
47 <!-- set to #1 if the .NET Framework 3.0 Chinese (Simplified) language pack is installed (not set otherwise) -->
48 <Fragment>
49 <Property Id="NETFRAMEWORK30_ZH_CN_LANGPACK" Secure="yes">
50 <RegistrySearch Id="NETFRAMEWORK30ZhCnLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v3.0\Setup\2052" Name="Install" Type="raw" />
51 </Property>
52 </Fragment>
53
54 <!-- set to #1 if the .NET Framework 3.0 Chinese (Traditional) language pack is installed (not set otherwise) -->
55 <Fragment>
56 <Property Id="NETFRAMEWORK30_ZH_TW_LANGPACK" Secure="yes">
57 <RegistrySearch Id="NETFRAMEWORK30ZhTwLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v3.0\Setup\1028" Name="Install" Type="raw" />
58 </Property>
59 </Fragment>
60
61 <!-- set to #1 if the .NET Framework 3.0 Czech language pack is installed (not set otherwise) -->
62 <Fragment>
63 <Property Id="NETFRAMEWORK30_CS_CZ_LANGPACK" Secure="yes">
64 <RegistrySearch Id="NETFRAMEWORK30CsCzLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v3.0\Setup\1029" Name="Install" Type="raw" />
65 </Property>
66 </Fragment>
67
68 <!-- set to #1 if the .NET Framework 3.0 Danish language pack is installed (not set otherwise) -->
69 <Fragment>
70 <Property Id="NETFRAMEWORK30_DA_DK_LANGPACK" Secure="yes">
71 <RegistrySearch Id="NETFRAMEWORK30DaDkLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v3.0\Setup\1030" Name="Install" Type="raw" />
72 </Property>
73 </Fragment>
74
75 <!-- set to #1 if the .NET Framework 3.0 Dutch language pack is installed (not set otherwise) -->
76 <Fragment>
77 <Property Id="NETFRAMEWORK30_NL_NL_LANGPACK" Secure="yes">
78 <RegistrySearch Id="NETFRAMEWORK30NlNlLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v3.0\Setup\1043" Name="Install" Type="raw" />
79 </Property>
80 </Fragment>
81
82 <!-- set to #1 if the .NET Framework 3.0 Finnish language pack is installed (not set otherwise) -->
83 <Fragment>
84 <Property Id="NETFRAMEWORK30_FI_FI_LANGPACK" Secure="yes">
85 <RegistrySearch Id="NETFRAMEWORK30FiFiLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v3.0\Setup\1035" Name="Install" Type="raw" />
86 </Property>
87 </Fragment>
88
89 <!-- set to #1 if the .NET Framework 3.0 French language pack is installed (not set otherwise) -->
90 <Fragment>
91 <Property Id="NETFRAMEWORK30_FR_FR_LANGPACK" Secure="yes">
92 <RegistrySearch Id="NETFRAMEWORK30FrFrLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v3.0\Setup\1036" Name="Install" Type="raw" />
93 </Property>
94 </Fragment>
95
96 <!-- set to #1 if the .NET Framework 3.0 German language pack is installed (not set otherwise) -->
97 <Fragment>
98 <Property Id="NETFRAMEWORK30_DE_DE_LANGPACK" Secure="yes">
99 <RegistrySearch Id="NETFRAMEWORK30DeDeLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v3.0\Setup\1031" Name="Install" Type="raw" />
100 </Property>
101 </Fragment>
102
103 <!-- set to #1 if the .NET Framework 3.0 Greek language pack is installed (not set otherwise) -->
104 <Fragment>
105 <Property Id="NETFRAMEWORK30_EL_GR_LANGPACK" Secure="yes">
106 <RegistrySearch Id="NETFRAMEWORK30ElGrLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v3.0\Setup\1032" Name="Install" Type="raw" />
107 </Property>
108 </Fragment>
109
110 <!-- set to #1 if the .NET Framework 3.0 Hungarian language pack is installed (not set otherwise) -->
111 <Fragment>
112 <Property Id="NETFRAMEWORK30_HU_HU_LANGPACK" Secure="yes">
113 <RegistrySearch Id="NETFRAMEWORK30HuHuLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v3.0\Setup\1038" Name="Install" Type="raw" />
114 </Property>
115 </Fragment>
116
117 <!-- set to #1 if the .NET Framework 3.0 Italian language pack is installed (not set otherwise) -->
118 <Fragment>
119 <Property Id="NETFRAMEWORK30_IT_IT_LANGPACK" Secure="yes">
120 <RegistrySearch Id="NETFRAMEWORK30ItItLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v3.0\Setup\1040" Name="Install" Type="raw" />
121 </Property>
122 </Fragment>
123
124 <!-- set to #1 if the .NET Framework 3.0 Japanese language pack is installed (not set otherwise) -->
125 <Fragment>
126 <Property Id="NETFRAMEWORK30_JA_JP_LANGPACK" Secure="yes">
127 <RegistrySearch Id="NETFRAMEWORK30JaJpLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v3.0\Setup\1041" Name="Install" Type="raw" />
128 </Property>
129 </Fragment>
130
131 <!-- set to #1 if the .NET Framework 3.0 Korean language pack is installed (not set otherwise) -->
132 <Fragment>
133 <Property Id="NETFRAMEWORK30_KO_KR_LANGPACK" Secure="yes">
134 <RegistrySearch Id="NETFRAMEWORK30KoKrLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v3.0\Setup\1042" Name="Install" Type="raw" />
135 </Property>
136 </Fragment>
137
138 <!-- set to #1 if the .NET Framework 3.0 Norwegian language pack is installed (not set otherwise) -->
139 <Fragment>
140 <Property Id="NETFRAMEWORK30_NB_NO_LANGPACK" Secure="yes">
141 <RegistrySearch Id="NETFRAMEWORK30NbNoLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v3.0\Setup\1044" Name="Install" Type="raw" />
142 </Property>
143 </Fragment>
144
145 <!-- set to #1 if the .NET Framework 3.0 Polish language pack is installed (not set otherwise) -->
146 <Fragment>
147 <Property Id="NETFRAMEWORK30_PL_PL_LANGPACK" Secure="yes">
148 <RegistrySearch Id="NETFRAMEWORK30PlPlLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v3.0\Setup\1045" Name="Install" Type="raw" />
149 </Property>
150 </Fragment>
151
152 <!-- set to #1 if the .NET Framework 3.0 Portuguese (Brazil) language pack is installed (not set otherwise) -->
153 <Fragment>
154 <Property Id="NETFRAMEWORK30_PT_BR_LANGPACK" Secure="yes">
155 <RegistrySearch Id="NETFRAMEWORK30PtBrLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v3.0\Setup\1046" Name="Install" Type="raw" />
156 </Property>
157 </Fragment>
158
159 <!-- set to #1 if the .NET Framework 3.0 Portuguese (Portugal) language pack is installed (not set otherwise) -->
160 <Fragment>
161 <Property Id="NETFRAMEWORK30_PT_PT_LANGPACK" Secure="yes">
162 <RegistrySearch Id="NETFRAMEWORK30PtPtLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v3.0\Setup\2070" Name="Install" Type="raw" />
163 </Property>
164 </Fragment>
165
166 <!-- set to #1 if the .NET Framework 3.0 Russian language pack is installed (not set otherwise) -->
167 <Fragment>
168 <Property Id="NETFRAMEWORK30_RU_RU_LANGPACK" Secure="yes">
169 <RegistrySearch Id="NETFRAMEWORK30RuRuLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v3.0\Setup\1049" Name="Install" Type="raw" />
170 </Property>
171 </Fragment>
172
173 <!-- set to #1 if the .NET Framework 3.0 Spanish language pack is installed (not set otherwise) -->
174 <Fragment>
175 <Property Id="NETFRAMEWORK30_ES_ES_LANGPACK" Secure="yes">
176 <RegistrySearch Id="NETFRAMEWORK30EsEsLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v3.0\Setup\3082" Name="Install" Type="raw" />
177 </Property>
178 </Fragment>
179
180 <!-- set to #1 if the .NET Framework 3.0 Swedish language pack is installed (not set otherwise) -->
181 <Fragment>
182 <Property Id="NETFRAMEWORK30_SV_SE_LANGPACK" Secure="yes">
183 <RegistrySearch Id="NETFRAMEWORK30SvSeLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v3.0\Setup\1053" Name="Install" Type="raw" />
184 </Property>
185 </Fragment>
186
187 <!-- set to #1 if the .NET Framework 3.0 Turkish language pack is installed (not set otherwise) -->
188 <Fragment>
189 <Property Id="NETFRAMEWORK30_TR_TR_LANGPACK" Secure="yes">
190 <RegistrySearch Id="NETFRAMEWORK30TrTrLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v3.0\Setup\1055" Name="Install" Type="raw" />
191 </Property>
192 </Fragment>
193
194</Wix>
diff --git a/src/ext/NetFx/wixlib/NetFx4.5.wxs b/src/ext/NetFx/wixlib/NetFx4.5.wxs
new file mode 100644
index 00000000..443235d4
--- /dev/null
+++ b/src/ext/NetFx/wixlib/NetFx4.5.wxs
@@ -0,0 +1,198 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2
3
4<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs" xmlns:util="http://wixtoolset.org/schemas/v4/wxs/util">
5
6 <!--
7 .NET Framework installation state properties
8
9 Official documentation can be found at the following location:
10
11 .NET Framework 4.5 - http://msdn.microsoft.com/en-us/library/5a4x27ek.aspx, http://msdn.microsoft.com/en-us/library/ee942965(v=VS.110).aspx
12 -->
13
14 <?define NetFx45MinRelease = 378389?>
15 <?define NetFx45WebLink = http://go.microsoft.com/fwlink/?LinkId=225704 ?>
16 <?define NetFx45RedistLink = http://go.microsoft.com/fwlink/?LinkId=225702 ?>
17 <?define NetFx45EulaLink = http://go.microsoft.com/fwlink/?LinkID=260867 ?>
18 <?define NetFx45WebId = NetFx45Web ?>
19 <?define NetFx45RedistId = NetFx45Redist ?>
20
21 <Fragment>
22 <PropertyRef Id="WIXNETFX4RELEASEINSTALLED" />
23 <Property Id="WIX_IS_NETFRAMEWORK_45_OR_LATER_INSTALLED" Secure="yes" />
24 <SetProperty Id="WIX_IS_NETFRAMEWORK_45_OR_LATER_INSTALLED" Value="1" After="AppSearch" Condition="WIXNETFX4RELEASEINSTALLED &gt;= &quot;#$(var.NetFx45MinRelease)&quot;" />
25 </Fragment>
26
27 <Fragment>
28 <util:RegistrySearch Id="NETFRAMEWORK45" Variable="NETFRAMEWORK45" Root="HKLM" Key="SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full" Value="Release" Result="value" />
29 </Fragment>
30
31 <!-- set to Release number of the .NET Framework 4.5 if installed (not set otherwise) -->
32 <Fragment>
33 <Property Id="NETFRAMEWORK45" Secure="yes">
34 <RegistrySearch Id="NetFramework45" Root="HKLM" Key="SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full" Name="Release" Type="raw" />
35 </Property>
36 </Fragment>
37
38 <!-- set to Release number of the .NET Framework 4.5 Arabic language pack if installed (not set otherwise) -->
39 <Fragment>
40 <Property Id="NETFRAMEWORK45_AR_SA_LANGPACK" Secure="yes">
41 <RegistrySearch Id="NETFRAMEWORK45ArSaLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\1025" Name="Release" Type="raw" />
42 </Property>
43 </Fragment>
44
45 <!-- set to Release number of the .NET Framework 4.5 Chinese (Simplified) language pack if installed (not set otherwise) -->
46 <Fragment>
47 <Property Id="NETFRAMEWORK45_ZH_CN_LANGPACK" Secure="yes">
48 <RegistrySearch Id="NETFRAMEWORK45ZhCnLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\2052" Name="Release" Type="raw" />
49 </Property>
50 </Fragment>
51
52 <!-- set to Release number of the .NET Framework 4.5 Chinese (Traditional) language pack if installed (not set otherwise) -->
53 <Fragment>
54 <Property Id="NETFRAMEWORK45_ZH_TW_LANGPACK" Secure="yes">
55 <RegistrySearch Id="NETFRAMEWORK45ZhTwLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\1028" Name="Release" Type="raw" />
56 </Property>
57 </Fragment>
58
59 <!-- set to Release number of the .NET Framework 4.5 Czech language pack if installed (not set otherwise) -->
60 <Fragment>
61 <Property Id="NETFRAMEWORK45_CS_CZ_LANGPACK" Secure="yes">
62 <RegistrySearch Id="NETFRAMEWORK45CsCzLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\1029" Name="Release" Type="raw" />
63 </Property>
64 </Fragment>
65
66 <!-- set to Release number of the .NET Framework 4.5 Danish language pack if installed (not set otherwise) -->
67 <Fragment>
68 <Property Id="NETFRAMEWORK45_DA_DK_LANGPACK" Secure="yes">
69 <RegistrySearch Id="NETFRAMEWORK45DaDkLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\1030" Name="Release" Type="raw" />
70 </Property>
71 </Fragment>
72
73 <!-- set to Release number of the .NET Framework 4.5 Dutch language pack if installed (not set otherwise) -->
74 <Fragment>
75 <Property Id="NETFRAMEWORK45_NL_NL_LANGPACK" Secure="yes">
76 <RegistrySearch Id="NETFRAMEWORK45NlNlLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\1043" Name="Release" Type="raw" />
77 </Property>
78 </Fragment>
79
80 <!-- set to Release number of the .NET Framework 4.5 Finnish language pack if installed (not set otherwise) -->
81 <Fragment>
82 <Property Id="NETFRAMEWORK45_FI_FI_LANGPACK" Secure="yes">
83 <RegistrySearch Id="NETFRAMEWORK45FiFiLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\1035" Name="Release" Type="raw" />
84 </Property>
85 </Fragment>
86
87 <!-- set to Release number of the .NET Framework 4.5 French language pack if installed (not set otherwise) -->
88 <Fragment>
89 <Property Id="NETFRAMEWORK45_FR_FR_LANGPACK" Secure="yes">
90 <RegistrySearch Id="NETFRAMEWORK45FrFrLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\1036" Name="Release" Type="raw" />
91 </Property>
92 </Fragment>
93
94 <!-- set to Release number of the .NET Framework 4.5 German language pack if installed (not set otherwise) -->
95 <Fragment>
96 <Property Id="NETFRAMEWORK45_DE_DE_LANGPACK" Secure="yes">
97 <RegistrySearch Id="NETFRAMEWORK45DeDeLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\1031" Name="Release" Type="raw" />
98 </Property>
99 </Fragment>
100
101 <!-- set to Release number of the .NET Framework 4.5 Greek language pack if installed (not set otherwise) -->
102 <Fragment>
103 <Property Id="NETFRAMEWORK45_EL_GR_LANGPACK" Secure="yes">
104 <RegistrySearch Id="NETFRAMEWORK45ElGrLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\1032" Name="Release" Type="raw" />
105 </Property>
106 </Fragment>
107
108 <!-- set to Release number of the .NET Framework 4.5 Hebrew language pack if installed (not set otherwise) -->
109 <Fragment>
110 <Property Id="NETFRAMEWORK45_HE_IL_LANGPACK" Secure="yes">
111 <RegistrySearch Id="NETFRAMEWORK45HeIlLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\1037" Name="Release" Type="raw" />
112 </Property>
113 </Fragment>
114
115 <!-- set to Release number of the .NET Framework 4.5 Hungarian language pack if installed (not set otherwise) -->
116 <Fragment>
117 <Property Id="NETFRAMEWORK45_HU_HU_LANGPACK" Secure="yes">
118 <RegistrySearch Id="NETFRAMEWORK45HuHuLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\1038" Name="Release" Type="raw" />
119 </Property>
120 </Fragment>
121
122 <!-- set to Release number of the .NET Framework 4.5 Italian language pack if installed (not set otherwise) -->
123 <Fragment>
124 <Property Id="NETFRAMEWORK45_IT_IT_LANGPACK" Secure="yes">
125 <RegistrySearch Id="NETFRAMEWORK45ItItLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\1040" Name="Release" Type="raw" />
126 </Property>
127 </Fragment>
128
129 <!-- set to Release number of the .NET Framework 4.5 Japanese language pack if installed (not set otherwise) -->
130 <Fragment>
131 <Property Id="NETFRAMEWORK45_JA_JP_LANGPACK" Secure="yes">
132 <RegistrySearch Id="NETFRAMEWORK45JaJpLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\1041" Name="Release" Type="raw" />
133 </Property>
134 </Fragment>
135
136 <!-- set to Release number of the .NET Framework 4.5 Korean language pack if installed (not set otherwise) -->
137 <Fragment>
138 <Property Id="NETFRAMEWORK45_KO_KR_LANGPACK" Secure="yes">
139 <RegistrySearch Id="NETFRAMEWORK45KoKrLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\1042" Name="Release" Type="raw" />
140 </Property>
141 </Fragment>
142
143 <!-- set to Release number of the .NET Framework 4.5 Norwegian language pack if installed (not set otherwise) -->
144 <Fragment>
145 <Property Id="NETFRAMEWORK45_NB_NO_LANGPACK" Secure="yes">
146 <RegistrySearch Id="NETFRAMEWORK45NbNoLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\1044" Name="Release" Type="raw" />
147 </Property>
148 </Fragment>
149
150 <!-- set to Release number of the .NET Framework 4.5 Polish language pack if installed (not set otherwise) -->
151 <Fragment>
152 <Property Id="NETFRAMEWORK45_PL_PL_LANGPACK" Secure="yes">
153 <RegistrySearch Id="NETFRAMEWORK45PlPlLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\1045" Name="Release" Type="raw" />
154 </Property>
155 </Fragment>
156
157 <!-- set to Release number of the .NET Framework 4.5 Portuguese (Brazil) language pack if installed (not set otherwise) -->
158 <Fragment>
159 <Property Id="NETFRAMEWORK45_PT_BR_LANGPACK" Secure="yes">
160 <RegistrySearch Id="NETFRAMEWORK45PtBrLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\1046" Name="Release" Type="raw" />
161 </Property>
162 </Fragment>
163
164 <!-- set to Release number of the .NET Framework 4.5 Portuguese (Portugal) language pack if installed (not set otherwise) -->
165 <Fragment>
166 <Property Id="NETFRAMEWORK45_PT_PT_LANGPACK" Secure="yes">
167 <RegistrySearch Id="NETFRAMEWORK45PtPtLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\2070" Name="Release" Type="raw" />
168 </Property>
169 </Fragment>
170
171 <!-- set to Release number of the .NET Framework 4.5 Russian language pack if installed (not set otherwise) -->
172 <Fragment>
173 <Property Id="NETFRAMEWORK45_RU_RU_LANGPACK" Secure="yes">
174 <RegistrySearch Id="NETFRAMEWORK45RuRuLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\1049" Name="Release" Type="raw" />
175 </Property>
176 </Fragment>
177
178 <!-- set to Release number of the .NET Framework 4.5 Spanish language pack if installed (not set otherwise) -->
179 <Fragment>
180 <Property Id="NETFRAMEWORK45_ES_ES_LANGPACK" Secure="yes">
181 <RegistrySearch Id="NETFRAMEWORK45EsEsLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\3082" Name="Release" Type="raw" />
182 </Property>
183 </Fragment>
184
185 <!-- set to Release number of the .NET Framework 4.5 Swedish language pack if installed (not set otherwise) -->
186 <Fragment>
187 <Property Id="NETFRAMEWORK45_SV_SE_LANGPACK" Secure="yes">
188 <RegistrySearch Id="NETFRAMEWORK45SvSeLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\1053" Name="Release" Type="raw" />
189 </Property>
190 </Fragment>
191
192 <!-- set to Release number of the .NET Framework 4.5 Turkish language pack if installed (not set otherwise) -->
193 <Fragment>
194 <Property Id="NETFRAMEWORK45_TR_TR_LANGPACK" Secure="yes">
195 <RegistrySearch Id="NETFRAMEWORK45TrTrLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\1055" Name="Release" Type="raw" />
196 </Property>
197 </Fragment>
198</Wix>
diff --git a/src/ext/NetFx/wixlib/NetFx4.wxs b/src/ext/NetFx/wixlib/NetFx4.wxs
new file mode 100644
index 00000000..295d8078
--- /dev/null
+++ b/src/ext/NetFx/wixlib/NetFx4.wxs
@@ -0,0 +1,416 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2
3
4<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs" xmlns:util="http://wixtoolset.org/schemas/v4/wxs/util">
5
6 <!--
7 .NET Framework installation state properties
8
9 Official documentation can be found at the following location:
10
11 .NET Framework 4.0 full & client - http://msdn.microsoft.com/en-us/library/ee942965.aspx
12 -->
13
14 <?define NetFx40WebLink = http://go.microsoft.com/fwlink/?linkid=182805 ?>
15 <?define NetFx40RedistLink = http://go.microsoft.com/fwlink/?LinkId=247729 ?>
16 <?define NetFx40ClientWebLink = http://go.microsoft.com/fwlink/?linkid=182804 ?>
17 <?define NetFx40ClientRedistLink = http://go.microsoft.com/fwlink/?LinkId=247730 ?>
18 <?define NetFx40EulaLink = http://go.microsoft.com/fwlink/?LinkID=188993 ?>
19 <?define NetFx40WebId = NetFx40Web ?>
20 <?define NetFx40RedistId = NetFx40Redist ?>
21 <?define NetFx40ClientWebId = NetFx40ClientWeb ?>
22 <?define NetFx40ClientRedistId = NetFx40ClientRedist ?>
23
24 <Fragment>
25 <PropertyRef Id="NETFRAMEWORK40FULL" />
26 <Property Id="WIX_IS_NETFRAMEWORK_40_OR_LATER_INSTALLED" Secure="yes" />
27 <SetProperty Id="WIX_IS_NETFRAMEWORK_40_OR_LATER_INSTALLED" Value="1" After="AppSearch" Condition="NETFRAMEWORK40FULL" />
28 </Fragment>
29
30 <Fragment>
31 <util:RegistrySearch Id="NETFRAMEWORK40" Variable="NETFRAMEWORK40" Root="HKLM" Key="SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full" Value="Install" Result="value" />
32 </Fragment>
33
34 <Fragment>
35 <util:RegistrySearch Id="NETFRAMEWORK40CLIENT" Variable="NETFRAMEWORK40CLIENT" Root="HKLM" Key="SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Client" Value="Install" Result="value" />
36 </Fragment>
37
38 <!-- set to #1 if the .NET Framework 4.0 client is installed (not set otherwise) -->
39 <Fragment>
40 <Property Id="NETFRAMEWORK40CLIENT" Secure="yes">
41 <RegistrySearch Id="NetFramework40Client" Root="HKLM" Key="SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Client" Name="Install" Type="raw" />
42 </Property>
43 </Fragment>
44
45 <!-- Indicates the servicing level for the .NET Framework 4.0 client. -->
46 <Fragment>
47 <Property Id="NETFRAMEWORK40CLIENT_SERVICING_LEVEL" Secure="yes">
48 <RegistrySearch Id="NetFramework40ClientServicing" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Client" Name="Servicing" Type="raw" />
49 </Property>
50 </Fragment>
51
52 <!-- Location of .NET Framework 4.0 client redistributable install root directory -->
53 <Fragment>
54 <Property Id="NETFRAMEWORK40CLIENTINSTALLROOTDIR" Secure="yes">
55 <RegistrySearch Id="NetFxInstallRootForNetfx40Client" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Client" Name="InstallPath" Type="raw" />
56 </Property>
57 </Fragment>
58
59 <!-- Location of .NET Framework 4.0 client (64-bit) redistributable install root directory -->
60 <Fragment>
61 <Property Id="NETFRAMEWORK40CLIENTINSTALLROOTDIR64" Secure="yes">
62 <RegistrySearch Id="NetFxInstallRootForNetfx40Client64" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Client" Name="InstallPath" Type="raw" Bitness="always64" />
63 </Property>
64 </Fragment>
65
66 <!-- set to #1 if the .NET Framework 4.0 full is installed (not set otherwise) -->
67 <Fragment>
68 <Property Id="NETFRAMEWORK40FULL" Secure="yes">
69 <RegistrySearch Id="NetFramework40Full" Root="HKLM" Key="SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full" Name="Install" Type="raw" />
70 </Property>
71 </Fragment>
72
73 <!-- Indicates the servicing level for the .NET Framework 4.0 full. -->
74 <Fragment>
75 <Property Id="NETFRAMEWORK40FULL_SERVICING_LEVEL" Secure="yes">
76 <RegistrySearch Id="NetFramework40FullServicing" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full" Name="Servicing" Type="raw" />
77 </Property>
78 </Fragment>
79
80 <!-- Location of .NET Framework 4.0 full redistributable install root directory -->
81 <Fragment>
82 <Property Id="NETFRAMEWORK40FULLINSTALLROOTDIR" Secure="yes">
83 <RegistrySearch Id="NetFxInstallRootForNetfx40Full" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full" Name="InstallPath" Type="raw" />
84 </Property>
85 </Fragment>
86
87 <!-- Location of .NET Framework 4.0 full (64-bit) redistributable install root directory -->
88 <Fragment>
89 <Property Id="NETFRAMEWORK40FULLINSTALLROOTDIR64" Secure="yes">
90 <RegistrySearch Id="NetFxInstallRootForNetfx40Full64" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full" Name="InstallPath" Type="raw" Bitness="always64" />
91 </Property>
92 </Fragment>
93
94 <!-- set to #1 if the .NET Framework 4.0 Client Arabic language pack is installed (not set otherwise) -->
95 <Fragment>
96 <Property Id="NETFRAMEWORK40CLIENT_AR_SA_LANGPACK" Secure="yes">
97 <RegistrySearch Id="NETFRAMEWORK40CLIENTArSaLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Client\1025" Name="Install" Type="raw" />
98 </Property>
99 </Fragment>
100
101 <!-- set to #1 if the .NET Framework 4.0 Client Chinese (Simplified) language pack is installed (not set otherwise) -->
102 <Fragment>
103 <Property Id="NETFRAMEWORK40CLIENT_ZH_CN_LANGPACK" Secure="yes">
104 <RegistrySearch Id="NETFRAMEWORK40CLIENTZhCnLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Client\2052" Name="Install" Type="raw" />
105 </Property>
106 </Fragment>
107
108 <!-- set to #1 if the .NET Framework 4.0 Client Chinese (Traditional) language pack is installed (not set otherwise) -->
109 <Fragment>
110 <Property Id="NETFRAMEWORK40CLIENT_ZH_TW_LANGPACK" Secure="yes">
111 <RegistrySearch Id="NETFRAMEWORK40CLIENTZhTwLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Client\1028" Name="Install" Type="raw" />
112 </Property>
113 </Fragment>
114
115 <!-- set to #1 if the .NET Framework 4.0 Client Czech language pack is installed (not set otherwise) -->
116 <Fragment>
117 <Property Id="NETFRAMEWORK40CLIENT_CS_CZ_LANGPACK" Secure="yes">
118 <RegistrySearch Id="NETFRAMEWORK40CLIENTCsCzLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Client\1029" Name="Install" Type="raw" />
119 </Property>
120 </Fragment>
121
122 <!-- set to #1 if the .NET Framework 4.0 Client Danish language pack is installed (not set otherwise) -->
123 <Fragment>
124 <Property Id="NETFRAMEWORK40CLIENT_DA_DK_LANGPACK" Secure="yes">
125 <RegistrySearch Id="NETFRAMEWORK40CLIENTDaDkLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Client\1030" Name="Install" Type="raw" />
126 </Property>
127 </Fragment>
128
129 <!-- set to #1 if the .NET Framework 4.0 Client Dutch language pack is installed (not set otherwise) -->
130 <Fragment>
131 <Property Id="NETFRAMEWORK40CLIENT_NL_NL_LANGPACK" Secure="yes">
132 <RegistrySearch Id="NETFRAMEWORK40CLIENTNlNlLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Client\1043" Name="Install" Type="raw" />
133 </Property>
134 </Fragment>
135
136 <!-- set to #1 if the .NET Framework 4.0 Client Finnish language pack is installed (not set otherwise) -->
137 <Fragment>
138 <Property Id="NETFRAMEWORK40CLIENT_FI_FI_LANGPACK" Secure="yes">
139 <RegistrySearch Id="NETFRAMEWORK40CLIENTFiFiLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Client\1035" Name="Install" Type="raw" />
140 </Property>
141 </Fragment>
142
143 <!-- set to #1 if the .NET Framework 4.0 Client French language pack is installed (not set otherwise) -->
144 <Fragment>
145 <Property Id="NETFRAMEWORK40CLIENT_FR_FR_LANGPACK" Secure="yes">
146 <RegistrySearch Id="NETFRAMEWORK40CLIENTFrFrLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Client\1036" Name="Install" Type="raw" />
147 </Property>
148 </Fragment>
149
150 <!-- set to #1 if the .NET Framework 4.0 Client German language pack is installed (not set otherwise) -->
151 <Fragment>
152 <Property Id="NETFRAMEWORK40CLIENT_DE_DE_LANGPACK" Secure="yes">
153 <RegistrySearch Id="NETFRAMEWORK40CLIENTDeDeLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Client\1031" Name="Install" Type="raw" />
154 </Property>
155 </Fragment>
156
157 <!-- set to #1 if the .NET Framework 4.0 Client Greek language pack is installed (not set otherwise) -->
158 <Fragment>
159 <Property Id="NETFRAMEWORK40CLIENT_EL_GR_LANGPACK" Secure="yes">
160 <RegistrySearch Id="NETFRAMEWORK40CLIENTElGrLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Client\1032" Name="Install" Type="raw" />
161 </Property>
162 </Fragment>
163
164 <!-- set to #1 if the .NET Framework 4.0 Client Hebrew language pack is installed (not set otherwise) -->
165 <Fragment>
166 <Property Id="NETFRAMEWORK40CLIENT_HE_IL_LANGPACK" Secure="yes">
167 <RegistrySearch Id="NETFRAMEWORK40CLIENTHeIlLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Client\1037" Name="Install" Type="raw" />
168 </Property>
169 </Fragment>
170
171 <!-- set to #1 if the .NET Framework 4.0 Client Hungarian language pack is installed (not set otherwise) -->
172 <Fragment>
173 <Property Id="NETFRAMEWORK40CLIENT_HU_HU_LANGPACK" Secure="yes">
174 <RegistrySearch Id="NETFRAMEWORK40CLIENTHuHuLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Client\1038" Name="Install" Type="raw" />
175 </Property>
176 </Fragment>
177
178 <!-- set to #1 if the .NET Framework 4.0 Client Italian language pack is installed (not set otherwise) -->
179 <Fragment>
180 <Property Id="NETFRAMEWORK40CLIENT_IT_IT_LANGPACK" Secure="yes">
181 <RegistrySearch Id="NETFRAMEWORK40CLIENTItItLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Client\1040" Name="Install" Type="raw" />
182 </Property>
183 </Fragment>
184
185 <!-- set to #1 if the .NET Framework 4.0 Client Japanese language pack is installed (not set otherwise) -->
186 <Fragment>
187 <Property Id="NETFRAMEWORK40CLIENT_JA_JP_LANGPACK" Secure="yes">
188 <RegistrySearch Id="NETFRAMEWORK40CLIENTJaJpLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Client\1041" Name="Install" Type="raw" />
189 </Property>
190 </Fragment>
191
192 <!-- set to #1 if the .NET Framework 4.0 Client Korean language pack is installed (not set otherwise) -->
193 <Fragment>
194 <Property Id="NETFRAMEWORK40CLIENT_KO_KR_LANGPACK" Secure="yes">
195 <RegistrySearch Id="NETFRAMEWORK40CLIENTKoKrLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Client\1042" Name="Install" Type="raw" />
196 </Property>
197 </Fragment>
198
199 <!-- set to #1 if the .NET Framework 4.0 Client Norwegian language pack is installed (not set otherwise) -->
200 <Fragment>
201 <Property Id="NETFRAMEWORK40CLIENT_NB_NO_LANGPACK" Secure="yes">
202 <RegistrySearch Id="NETFRAMEWORK40CLIENTNbNoLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Client\1044" Name="Install" Type="raw" />
203 </Property>
204 </Fragment>
205
206 <!-- set to #1 if the .NET Framework 4.0 Client Polish language pack is installed (not set otherwise) -->
207 <Fragment>
208 <Property Id="NETFRAMEWORK40CLIENT_PL_PL_LANGPACK" Secure="yes">
209 <RegistrySearch Id="NETFRAMEWORK40CLIENTPlPlLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Client\1045" Name="Install" Type="raw" />
210 </Property>
211 </Fragment>
212
213 <!-- set to #1 if the .NET Framework 4.0 Client Portuguese (Brazil) language pack is installed (not set otherwise) -->
214 <Fragment>
215 <Property Id="NETFRAMEWORK40CLIENT_PT_BR_LANGPACK" Secure="yes">
216 <RegistrySearch Id="NETFRAMEWORK40CLIENTPtBrLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Client\1046" Name="Install" Type="raw" />
217 </Property>
218 </Fragment>
219
220 <!-- set to #1 if the .NET Framework 4.0 Client Portuguese (Portugal) language pack is installed (not set otherwise) -->
221 <Fragment>
222 <Property Id="NETFRAMEWORK40CLIENT_PT_PT_LANGPACK" Secure="yes">
223 <RegistrySearch Id="NETFRAMEWORK40CLIENTPtPtLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Client\2070" Name="Install" Type="raw" />
224 </Property>
225 </Fragment>
226
227 <!-- set to #1 if the .NET Framework 4.0 Client Russian language pack is installed (not set otherwise) -->
228 <Fragment>
229 <Property Id="NETFRAMEWORK40CLIENT_RU_RU_LANGPACK" Secure="yes">
230 <RegistrySearch Id="NETFRAMEWORK40CLIENTRuRuLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Client\1049" Name="Install" Type="raw" />
231 </Property>
232 </Fragment>
233
234 <!-- set to #1 if the .NET Framework 4.0 Client Spanish language pack is installed (not set otherwise) -->
235 <Fragment>
236 <Property Id="NETFRAMEWORK40CLIENT_ES_ES_LANGPACK" Secure="yes">
237 <RegistrySearch Id="NETFRAMEWORK40CLIENTEsEsLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Client\3082" Name="Install" Type="raw" />
238 </Property>
239 </Fragment>
240
241 <!-- set to #1 if the .NET Framework 4.0 Client Swedish language pack is installed (not set otherwise) -->
242 <Fragment>
243 <Property Id="NETFRAMEWORK40CLIENT_SV_SE_LANGPACK" Secure="yes">
244 <RegistrySearch Id="NETFRAMEWORK40CLIENTSvSeLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Client\1053" Name="Install" Type="raw" />
245 </Property>
246 </Fragment>
247
248 <!-- set to #1 if the .NET Framework 4.0 Client Turkish language pack is installed (not set otherwise) -->
249 <Fragment>
250 <Property Id="NETFRAMEWORK40CLIENT_TR_TR_LANGPACK" Secure="yes">
251 <RegistrySearch Id="NETFRAMEWORK40CLIENTTrTrLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Client\1055" Name="Install" Type="raw" />
252 </Property>
253 </Fragment>
254
255 <!-- set to #1 if the .NET Framework 4.0 Full Arabic language pack is installed (not set otherwise) -->
256 <Fragment>
257 <Property Id="NETFRAMEWORK40FULL_AR_SA_LANGPACK" Secure="yes">
258 <RegistrySearch Id="NETFRAMEWORK40FULLArSaLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\1025" Name="Install" Type="raw" />
259 </Property>
260 </Fragment>
261
262 <!-- set to #1 if the .NET Framework 4.0 Full Chinese (Simplified) language pack is installed (not set otherwise) -->
263 <Fragment>
264 <Property Id="NETFRAMEWORK40FULL_ZH_CN_LANGPACK" Secure="yes">
265 <RegistrySearch Id="NETFRAMEWORK40FULLZhCnLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\2052" Name="Install" Type="raw" />
266 </Property>
267 </Fragment>
268
269 <!-- set to #1 if the .NET Framework 4.0 Full Chinese (Traditional) language pack is installed (not set otherwise) -->
270 <Fragment>
271 <Property Id="NETFRAMEWORK40FULL_ZH_TW_LANGPACK" Secure="yes">
272 <RegistrySearch Id="NETFRAMEWORK40FULLZhTwLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\1028" Name="Install" Type="raw" />
273 </Property>
274 </Fragment>
275
276 <!-- set to #1 if the .NET Framework 4.0 Full Czech language pack is installed (not set otherwise) -->
277 <Fragment>
278 <Property Id="NETFRAMEWORK40FULL_CS_CZ_LANGPACK" Secure="yes">
279 <RegistrySearch Id="NETFRAMEWORK40FULLCsCzLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\1029" Name="Install" Type="raw" />
280 </Property>
281 </Fragment>
282
283 <!-- set to #1 if the .NET Framework 4.0 Full Danish language pack is installed (not set otherwise) -->
284 <Fragment>
285 <Property Id="NETFRAMEWORK40FULL_DA_DK_LANGPACK" Secure="yes">
286 <RegistrySearch Id="NETFRAMEWORK40FULLDaDkLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\1030" Name="Install" Type="raw" />
287 </Property>
288 </Fragment>
289
290 <!-- set to #1 if the .NET Framework 4.0 Full Dutch language pack is installed (not set otherwise) -->
291 <Fragment>
292 <Property Id="NETFRAMEWORK40FULL_NL_NL_LANGPACK" Secure="yes">
293 <RegistrySearch Id="NETFRAMEWORK40FULLNlNlLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\1043" Name="Install" Type="raw" />
294 </Property>
295 </Fragment>
296
297 <!-- set to #1 if the .NET Framework 4.0 Full Finnish language pack is installed (not set otherwise) -->
298 <Fragment>
299 <Property Id="NETFRAMEWORK40FULL_FI_FI_LANGPACK" Secure="yes">
300 <RegistrySearch Id="NETFRAMEWORK40FULLFiFiLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\1035" Name="Install" Type="raw" />
301 </Property>
302 </Fragment>
303
304 <!-- set to #1 if the .NET Framework 4.0 Full French language pack is installed (not set otherwise) -->
305 <Fragment>
306 <Property Id="NETFRAMEWORK40FULL_FR_FR_LANGPACK" Secure="yes">
307 <RegistrySearch Id="NETFRAMEWORK40FULLFrFrLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\1036" Name="Install" Type="raw" />
308 </Property>
309 </Fragment>
310
311 <!-- set to #1 if the .NET Framework 4.0 Full German language pack is installed (not set otherwise) -->
312 <Fragment>
313 <Property Id="NETFRAMEWORK40FULL_DE_DE_LANGPACK" Secure="yes">
314 <RegistrySearch Id="NETFRAMEWORK40FULLDeDeLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\1031" Name="Install" Type="raw" />
315 </Property>
316 </Fragment>
317
318 <!-- set to #1 if the .NET Framework 4.0 Full Greek language pack is installed (not set otherwise) -->
319 <Fragment>
320 <Property Id="NETFRAMEWORK40FULL_EL_GR_LANGPACK" Secure="yes">
321 <RegistrySearch Id="NETFRAMEWORK40FULLElGrLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\1032" Name="Install" Type="raw" />
322 </Property>
323 </Fragment>
324
325 <!-- set to #1 if the .NET Framework 4.0 Full Hebrew language pack is installed (not set otherwise) -->
326 <Fragment>
327 <Property Id="NETFRAMEWORK40FULL_HE_IL_LANGPACK" Secure="yes">
328 <RegistrySearch Id="NETFRAMEWORK40FULLHeIlLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\1037" Name="Install" Type="raw" />
329 </Property>
330 </Fragment>
331
332 <!-- set to #1 if the .NET Framework 4.0 Full Hungarian language pack is installed (not set otherwise) -->
333 <Fragment>
334 <Property Id="NETFRAMEWORK40FULL_HU_HU_LANGPACK" Secure="yes">
335 <RegistrySearch Id="NETFRAMEWORK40FULLHuHuLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\1038" Name="Install" Type="raw" />
336 </Property>
337 </Fragment>
338
339 <!-- set to #1 if the .NET Framework 4.0 Full Italian language pack is installed (not set otherwise) -->
340 <Fragment>
341 <Property Id="NETFRAMEWORK40FULL_IT_IT_LANGPACK" Secure="yes">
342 <RegistrySearch Id="NETFRAMEWORK40FULLItItLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\1040" Name="Install" Type="raw" />
343 </Property>
344 </Fragment>
345
346 <!-- set to #1 if the .NET Framework 4.0 Full Japanese language pack is installed (not set otherwise) -->
347 <Fragment>
348 <Property Id="NETFRAMEWORK40FULL_JA_JP_LANGPACK" Secure="yes">
349 <RegistrySearch Id="NETFRAMEWORK40FULLJaJpLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\1041" Name="Install" Type="raw" />
350 </Property>
351 </Fragment>
352
353 <!-- set to #1 if the .NET Framework 4.0 Full Korean language pack is installed (not set otherwise) -->
354 <Fragment>
355 <Property Id="NETFRAMEWORK40FULL_KO_KR_LANGPACK" Secure="yes">
356 <RegistrySearch Id="NETFRAMEWORK40FULLKoKrLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\1042" Name="Install" Type="raw" />
357 </Property>
358 </Fragment>
359
360 <!-- set to #1 if the .NET Framework 4.0 Full Norwegian language pack is installed (not set otherwise) -->
361 <Fragment>
362 <Property Id="NETFRAMEWORK40FULL_NB_NO_LANGPACK" Secure="yes">
363 <RegistrySearch Id="NETFRAMEWORK40FULLNbNoLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\1044" Name="Install" Type="raw" />
364 </Property>
365 </Fragment>
366
367 <!-- set to #1 if the .NET Framework 4.0 Full Polish language pack is installed (not set otherwise) -->
368 <Fragment>
369 <Property Id="NETFRAMEWORK40FULL_PL_PL_LANGPACK" Secure="yes">
370 <RegistrySearch Id="NETFRAMEWORK40FULLPlPlLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\1045" Name="Install" Type="raw" />
371 </Property>
372 </Fragment>
373
374 <!-- set to #1 if the .NET Framework 4.0 Full Portuguese (Brazil) language pack is installed (not set otherwise) -->
375 <Fragment>
376 <Property Id="NETFRAMEWORK40FULL_PT_BR_LANGPACK" Secure="yes">
377 <RegistrySearch Id="NETFRAMEWORK40FULLPtBrLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\1046" Name="Install" Type="raw" />
378 </Property>
379 </Fragment>
380
381 <!-- set to #1 if the .NET Framework 4.0 Full Portuguese (Portugal) language pack is installed (not set otherwise) -->
382 <Fragment>
383 <Property Id="NETFRAMEWORK40FULL_PT_PT_LANGPACK" Secure="yes">
384 <RegistrySearch Id="NETFRAMEWORK40FULLPtPtLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\2070" Name="Install" Type="raw" />
385 </Property>
386 </Fragment>
387
388 <!-- set to #1 if the .NET Framework 4.0 Full Russian language pack is installed (not set otherwise) -->
389 <Fragment>
390 <Property Id="NETFRAMEWORK40FULL_RU_RU_LANGPACK" Secure="yes">
391 <RegistrySearch Id="NETFRAMEWORK40FULLRuRuLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\1049" Name="Install" Type="raw" />
392 </Property>
393 </Fragment>
394
395 <!-- set to #1 if the .NET Framework 4.0 Full Spanish language pack is installed (not set otherwise) -->
396 <Fragment>
397 <Property Id="NETFRAMEWORK40FULL_ES_ES_LANGPACK" Secure="yes">
398 <RegistrySearch Id="NETFRAMEWORK40FULLEsEsLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\3082" Name="Install" Type="raw" />
399 </Property>
400 </Fragment>
401
402 <!-- set to #1 if the .NET Framework 4.0 Full Swedish language pack is installed (not set otherwise) -->
403 <Fragment>
404 <Property Id="NETFRAMEWORK40FULL_SV_SE_LANGPACK" Secure="yes">
405 <RegistrySearch Id="NETFRAMEWORK40FULLSvSeLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\1053" Name="Install" Type="raw" />
406 </Property>
407 </Fragment>
408
409 <!-- set to #1 if the .NET Framework 4.0 Full Turkish language pack is installed (not set otherwise) -->
410 <Fragment>
411 <Property Id="NETFRAMEWORK40FULL_TR_TR_LANGPACK" Secure="yes">
412 <RegistrySearch Id="NETFRAMEWORK40FULLTrTrLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\1055" Name="Install" Type="raw" />
413 </Property>
414 </Fragment>
415
416</Wix>
diff --git a/src/ext/NetFx/wixlib/NetFx451.wxs b/src/ext/NetFx/wixlib/NetFx451.wxs
new file mode 100644
index 00000000..88363555
--- /dev/null
+++ b/src/ext/NetFx/wixlib/NetFx451.wxs
@@ -0,0 +1,26 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2
3
4<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
5
6 <!--
7 .NET Framework installation state properties
8
9 Official documentation can be found at the following location:
10
11 .NET Framework 4.5/4.5.1 - http://msdn.microsoft.com/en-us/library/5a4x27ek.aspx, http://msdn.microsoft.com/en-us/library/ee942965(v=VS.110).aspx
12 -->
13
14 <?define NetFx451MinRelease = 378675 ?>
15 <?define NetFx451WebLink = http://go.microsoft.com/fwlink/?LinkId=322115 ?>
16 <?define NetFx451RedistLink = http://go.microsoft.com/fwlink/?LinkId=322116 ?>
17 <?define NetFx451EulaLink = http://wixtoolset.org/licenses/netfx451 ?>
18 <?define NetFx451WebId = NetFx451Web ?>
19 <?define NetFx451RedistId = NetFx451Redist ?>
20
21 <Fragment>
22 <PropertyRef Id="WIXNETFX4RELEASEINSTALLED" />
23 <Property Id="WIX_IS_NETFRAMEWORK_451_OR_LATER_INSTALLED" Secure="yes" />
24 <SetProperty Id="WIX_IS_NETFRAMEWORK_451_OR_LATER_INSTALLED" Value="1" After="AppSearch" Condition="WIXNETFX4RELEASEINSTALLED &gt;= &quot;#$(var.NetFx451MinRelease)&quot;" />
25 </Fragment>
26</Wix>
diff --git a/src/ext/NetFx/wixlib/NetFx452.wxs b/src/ext/NetFx/wixlib/NetFx452.wxs
new file mode 100644
index 00000000..33f79db4
--- /dev/null
+++ b/src/ext/NetFx/wixlib/NetFx452.wxs
@@ -0,0 +1,69 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2
3<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs" xmlns:bal="http://wixtoolset.org/schemas/v4/wxs/bal" xmlns:util="http://wixtoolset.org/schemas/v4/wxs/util">
4
5 <!--
6 .NET Framework installation state properties
7
8 Official documentation can be found at the following location:
9
10 .NET Framework 4.5/4.5.1/4.5.2 - http://msdn.microsoft.com/en-us/library/w0x726c2(v=vs.110).aspx
11 -->
12
13 <?define NetFx452MinRelease = 379893 ?>
14 <?define NetFx452WebLink = https://go.microsoft.com/fwlink/?LinkId=397707 ?>
15 <?define NetFx452RedistLink = https://go.microsoft.com/fwlink/?LinkId=397708 ?>
16 <?define NetFx452EulaLink = https://wixtoolset.org/licenses/netfx452 ?>
17 <?define NetFx452WebId = NetFx452Web ?>
18 <?define NetFx452RedistId = NetFx452Redist ?>
19
20 <Fragment>
21 <PropertyRef Id="WIXNETFX4RELEASEINSTALLED" />
22 <Property Id="WIX_IS_NETFRAMEWORK_452_OR_LATER_INSTALLED" Secure="yes" />
23 <SetProperty Id="WIX_IS_NETFRAMEWORK_452_OR_LATER_INSTALLED" Value="1" After="AppSearch" Condition="WIXNETFX4RELEASEINSTALLED &gt;= &quot;#$(var.NetFx452MinRelease)&quot;" />
24 </Fragment>
25
26 <Fragment>
27 <util:RegistrySearchRef Id="NETFRAMEWORK45" />
28
29 <WixVariable Id="NetFx452WebDetectCondition" Value="NETFRAMEWORK45 &gt;= $(var.NetFx452MinRelease)" Overridable="yes" />
30 <WixVariable Id="NetFx452WebInstallCondition" Value="" Overridable="yes" />
31 <WixVariable Id="NetFx452WebPackageDirectory" Value="redist\" Overridable="yes" />
32
33 <PackageGroup Id="$(var.NetFx452WebId)">
34 <ExePackage InstallArguments="/q /norestart /log &quot;[NetFx452FullWebLog].html&quot;" UninstallArguments="/uninstall /q /norestart /log &quot;[NetFx452FullWebLog].html&quot;" PerMachine="yes" DetectCondition="!(wix.NetFx452WebDetectCondition)" InstallCondition="!(wix.NetFx452WebInstallCondition)" Id="$(var.NetFx452WebId)" Vital="yes" Permanent="yes" Protocol="netfx4" LogPathVariable="NetFx452FullWebLog">
35 <ExePackagePayload Name="!(wix.NetFx452WebPackageDirectory)NDP452-KB2901954-Web.exe" DownloadUrl="$(var.NetFx452WebLink)" Description="Microsoft .NET Framework 4.5.2 Setup" Hash="90A3A5A57EA8A6508EEE0D129303C7CB012AABF651DD9A6BEFC20DA3BBDB09FC47FD087645051D3D45BFF909DFC6E6039C22C4816FBC793A847E81701248639E" ProductName="Microsoft .NET Framework 4.5.2" Size="1118920" Version="4.5.51209.34209" />
36 </ExePackage>
37 </PackageGroup>
38 </Fragment>
39
40 <Fragment>
41 <PackageGroup Id="$(var.NetFx452WebId)AsPrereq">
42 <PackageGroupRef Id="$(var.NetFx452WebId)" />
43 </PackageGroup>
44
45 <bal:ManagedBootstrapperApplicationPrereqInformation PackageId="$(var.NetFx452WebId)" LicenseUrl="$(var.NetFx452EulaLink)" />
46 </Fragment>
47
48 <Fragment>
49 <util:RegistrySearchRef Id="NETFRAMEWORK45" />
50
51 <WixVariable Id="NetFx452RedistDetectCondition" Value="NETFRAMEWORK45 &gt;= $(var.NetFx452MinRelease)" Overridable="yes" />
52 <WixVariable Id="NetFx452RedistInstallCondition" Value="" Overridable="yes" />
53 <WixVariable Id="NetFx452RedistPackageDirectory" Value="redist\" Overridable="yes" />
54
55 <PackageGroup Id="$(var.NetFx452RedistId)">
56 <ExePackage InstallArguments="/q /norestart /log &quot;[NetFx452FullLog].html&quot;" UninstallArguments="/uninstall /q /norestart /log &quot;[NetFx452FullLog].html&quot;" PerMachine="yes" DetectCondition="!(wix.NetFx452RedistDetectCondition)" InstallCondition="!(wix.NetFx452RedistInstallCondition)" Id="$(var.NetFx452RedistId)" Vital="yes" Permanent="yes" Protocol="netfx4" LogPathVariable="NetFx452FullLog">
57 <ExePackagePayload Name="!(wix.NetFx452RedistPackageDirectory)NDP452-KB2901907-x86-x64-AllOS-ENU.exe" DownloadUrl="$(var.NetFx452RedistLink)" Description="Microsoft .NET Framework 4.5.2 Setup" Hash="033D457229C4FE6EEA7B1E42A3A39DD4CF6A054C5E996CE036942DD2FE9623FD3A0634BE5DCB88506C1C61BF9FF6076F27B4ECEC38F8CF85603AF018111E584D" ProductName="Microsoft .NET Framework 4.5.2" Size="69999448" Version="4.5.51209.34209" />
58 </ExePackage>
59 </PackageGroup>
60 </Fragment>
61
62 <Fragment>
63 <PackageGroup Id="$(var.NetFx452RedistId)AsPrereq">
64 <PackageGroupRef Id="$(var.NetFx452RedistId)" />
65 </PackageGroup>
66
67 <bal:ManagedBootstrapperApplicationPrereqInformation PackageId="$(var.NetFx452RedistId)" LicenseUrl="$(var.NetFx452EulaLink)" />
68 </Fragment>
69</Wix>
diff --git a/src/ext/NetFx/wixlib/NetFx46.wxs b/src/ext/NetFx/wixlib/NetFx46.wxs
new file mode 100644
index 00000000..cb53be2e
--- /dev/null
+++ b/src/ext/NetFx/wixlib/NetFx46.wxs
@@ -0,0 +1,70 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2
3
4<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs" xmlns:bal="http://wixtoolset.org/schemas/v4/wxs/bal" xmlns:util="http://wixtoolset.org/schemas/v4/wxs/util">
5
6 <!--
7 .NET Framework installation state properties
8
9 Official documentation can be found at the following location:
10
11 .NET Framework 4.5/4.5.1/4.5.2/4.6 - http://msdn.microsoft.com/en-us/library/w0x726c2(v=vs.110).aspx
12 -->
13
14 <?define NetFx46MinRelease = 393295 ?>
15 <?define NetFx46WebLink = https://go.microsoft.com/fwlink/?LinkId=560371 ?>
16 <?define NetFx46RedistLink = https://go.microsoft.com/fwlink/?LinkId=560369 ?>
17 <?define NetFx46EulaLink = https://go.microsoft.com/fwlink/?LinkID=558772 ?>
18 <?define NetFx46WebId = NetFx46Web ?>
19 <?define NetFx46RedistId = NetFx46Redist ?>
20
21 <Fragment>
22 <PropertyRef Id="WIXNETFX4RELEASEINSTALLED" />
23 <Property Id="WIX_IS_NETFRAMEWORK_46_OR_LATER_INSTALLED" Secure="yes" />
24 <SetProperty Id="WIX_IS_NETFRAMEWORK_46_OR_LATER_INSTALLED" Value="1" After="AppSearch" Condition="WIXNETFX4RELEASEINSTALLED &gt;= &quot;#$(var.NetFx46MinRelease)&quot;" />
25 </Fragment>
26
27 <Fragment>
28 <util:RegistrySearchRef Id="NETFRAMEWORK45" />
29
30 <WixVariable Id="NetFx46WebDetectCondition" Value="NETFRAMEWORK45 &gt;= $(var.NetFx46MinRelease)" Overridable="yes" />
31 <WixVariable Id="NetFx46WebInstallCondition" Value="" Overridable="yes" />
32 <WixVariable Id="NetFx46WebPackageDirectory" Value="redist\" Overridable="yes" />
33
34 <PackageGroup Id="$(var.NetFx46WebId)">
35 <ExePackage InstallArguments="/q /norestart /log &quot;[NetFx46FullLog].html&quot;" UninstallArguments="/uninstall /q /norestart /log &quot;[NetFx46FullLog].html&quot;" PerMachine="yes" DetectCondition="!(wix.NetFx46WebDetectCondition)" InstallCondition="!(wix.NetFx46WebInstallCondition)" Id="$(var.NetFx46WebId)" Vital="yes" Permanent="yes" Protocol="netfx4" LogPathVariable="NetFx46FullLog">
36 <ExePackagePayload Name="!(wix.NetFx46WebPackageDirectory)NDP46-KB3045560-Web.exe" DownloadUrl="$(var.NetFx46WebLink)" Description="Microsoft .NET Framework 4.6 Setup" Hash="CAA5F4D4DB0C9DF34252FCB74CF7762214F69D2419865EBC1E6717E6B1348E59A7599A8DECAAB5CEE6974E59D1AE5A749F8C4EC07C8E4C80C90E77B996B3B205" ProductName="Microsoft .NET Framework 4.6" Size="1497400" Version="4.6.81.0" />
37 </ExePackage>
38 </PackageGroup>
39 </Fragment>
40
41 <Fragment>
42 <PackageGroup Id="$(var.NetFx46WebId)AsPrereq">
43 <PackageGroupRef Id="$(var.NetFx46WebId)" />
44 </PackageGroup>
45
46 <bal:ManagedBootstrapperApplicationPrereqInformation PackageId="$(var.NetFx46WebId)" LicenseUrl="$(var.NetFx46EulaLink)" />
47 </Fragment>
48
49 <Fragment>
50 <util:RegistrySearchRef Id="NETFRAMEWORK45" />
51
52 <WixVariable Id="NetFx46RedistDetectCondition" Value="NETFRAMEWORK45 &gt;= $(var.NetFx46MinRelease)" Overridable="yes" />
53 <WixVariable Id="NetFx46RedistInstallCondition" Value="" Overridable="yes" />
54 <WixVariable Id="NetFx46RedistPackageDirectory" Value="redist\" Overridable="yes" />
55
56 <PackageGroup Id="$(var.NetFx46RedistId)">
57 <ExePackage InstallArguments="/q /norestart /log &quot;[NetFx46FullLog].html&quot;" UninstallArguments="/uninstall /q /norestart /log &quot;[NetFx46FullLog].html&quot;" PerMachine="yes" DetectCondition="!(wix.NetFx46RedistDetectCondition)" InstallCondition="!(wix.NetFx46RedistInstallCondition)" Id="$(var.NetFx46RedistId)" Vital="yes" Permanent="yes" Protocol="netfx4" LogPathVariable="NetFx46FullLog">
58 <ExePackagePayload Name="!(wix.NetFx46RedistPackageDirectory)NDP46-KB3045557-x86-x64-AllOS-ENU.exe" DownloadUrl="$(var.NetFx46RedistLink)" Description="Microsoft .NET Framework 4.6 Setup" Hash="C6FC54F648F822515ADACB4C27E0A6DBD6A3EAF2BA3F069C0002750894ECC453EBED8BC8D4FF2AFD73C7B3445C1DA18D43FE361EA5195AE8522249DF36B84B7E" ProductName="Microsoft .NET Framework 4.6" Size="65444688" Version="4.6.81.0" />
59 </ExePackage>
60 </PackageGroup>
61 </Fragment>
62
63 <Fragment>
64 <PackageGroup Id="$(var.NetFx46RedistId)AsPrereq">
65 <PackageGroupRef Id="$(var.NetFx46RedistId)" />
66 </PackageGroup>
67
68 <bal:ManagedBootstrapperApplicationPrereqInformation PackageId="$(var.NetFx46RedistId)" LicenseUrl="$(var.NetFx46EulaLink)" />
69 </Fragment>
70</Wix>
diff --git a/src/ext/NetFx/wixlib/NetFx461.wxs b/src/ext/NetFx/wixlib/NetFx461.wxs
new file mode 100644
index 00000000..95cc2876
--- /dev/null
+++ b/src/ext/NetFx/wixlib/NetFx461.wxs
@@ -0,0 +1,69 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2
3<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs" xmlns:bal="http://wixtoolset.org/schemas/v4/wxs/bal" xmlns:util="http://wixtoolset.org/schemas/v4/wxs/util">
4
5 <!--
6 .NET Framework installation state properties
7
8 Official documentation can be found at the following location:
9
10 .NET Framework 4.5/4.5.1/4.5.2/4.6/4.6.1 - http://msdn.microsoft.com/en-us/library/w0x726c2(v=vs.110).aspx
11 -->
12
13 <?define NetFx461MinRelease = 394254 ?>
14 <?define NetFx461WebLink = https://go.microsoft.com/fwlink/?LinkId=671728 ?>
15 <?define NetFx461RedistLink = https://go.microsoft.com/fwlink/?LinkId=671743 ?>
16 <?define NetFx461EulaLink = https://referencesource.microsoft.com/license.html ?>
17 <?define NetFx461WebId = NetFx461Web ?>
18 <?define NetFx461RedistId = NetFx461Redist ?>
19
20 <Fragment>
21 <PropertyRef Id="WIXNETFX4RELEASEINSTALLED" />
22 <Property Id="WIX_IS_NETFRAMEWORK_461_OR_LATER_INSTALLED" Secure="yes" />
23 <SetProperty Id="WIX_IS_NETFRAMEWORK_461_OR_LATER_INSTALLED" Value="1" After="AppSearch" Condition="WIXNETFX4RELEASEINSTALLED &gt;= &quot;#$(var.NetFx461MinRelease)&quot;" />
24 </Fragment>
25
26 <Fragment>
27 <util:RegistrySearchRef Id="NETFRAMEWORK45" />
28
29 <WixVariable Id="NetFx461WebDetectCondition" Value="NETFRAMEWORK45 &gt;= $(var.NetFx461MinRelease)" Overridable="yes" />
30 <WixVariable Id="NetFx461WebInstallCondition" Value="" Overridable="yes" />
31 <WixVariable Id="NetFx461WebPackageDirectory" Value="redist\" Overridable="yes" />
32
33 <PackageGroup Id="$(var.NetFx461WebId)">
34 <ExePackage InstallArguments="/q /norestart /log &quot;[NetFx461FullLog].html&quot;" UninstallArguments="/uninstall /q /norestart /log &quot;[NetFx461FullLog].html&quot;" PerMachine="yes" DetectCondition="!(wix.NetFx461WebDetectCondition)" InstallCondition="!(wix.NetFx461WebInstallCondition)" Id="$(var.NetFx461WebId)" Vital="yes" Permanent="yes" Protocol="netfx4" LogPathVariable="NetFx461FullLog">
35 <ExePackagePayload Name="!(wix.NetFx461WebPackageDirectory)NDP461-KB3102438-Web.exe" DownloadUrl="$(var.NetFx461WebLink)" Description="Microsoft .NET Framework 4.6.1 Setup" Hash="97C4DD638E2E0324D60BDD1D7BE85603EDBF969898469A524FB271EBA5E22B78CA67DB1F568F5C45393381F1E76408C366AD4A68A7BB00E23D1FB820E67DE99E" ProductName="Microsoft .NET Framework 4.6.1" Size="1424328" Version="4.6.1055.0" />
36 </ExePackage>
37 </PackageGroup>
38 </Fragment>
39
40 <Fragment>
41 <PackageGroup Id="$(var.NetFx461WebId)AsPrereq">
42 <PackageGroupRef Id="$(var.NetFx461WebId)" />
43 </PackageGroup>
44
45 <bal:ManagedBootstrapperApplicationPrereqInformation PackageId="$(var.NetFx461WebId)" LicenseUrl="$(var.NetFx461EulaLink)" />
46 </Fragment>
47
48 <Fragment>
49 <util:RegistrySearchRef Id="NETFRAMEWORK45" />
50
51 <WixVariable Id="NetFx461RedistDetectCondition" Value="NETFRAMEWORK45 &gt;= $(var.NetFx461MinRelease)" Overridable="yes" />
52 <WixVariable Id="NetFx461RedistInstallCondition" Value="" Overridable="yes" />
53 <WixVariable Id="NetFx461RedistPackageDirectory" Value="redist\" Overridable="yes" />
54
55 <PackageGroup Id="$(var.NetFx461RedistId)">
56 <ExePackage InstallArguments="/q /norestart /log &quot;[NetFx461FullLog].html&quot;" UninstallArguments="/uninstall /q /norestart /log &quot;[NetFx461FullLog].html&quot;" PerMachine="yes" DetectCondition="!(wix.NetFx461RedistDetectCondition)" InstallCondition="!(wix.NetFx461RedistInstallCondition)" Id="$(var.NetFx461RedistId)" Vital="yes" Permanent="yes" Protocol="netfx4" LogPathVariable="NetFx461FullLog">
57 <ExePackagePayload Name="!(wix.NetFx461RedistPackageDirectory)NDP461-KB3102436-x86-x64-AllOS-ENU.exe" DownloadUrl="$(var.NetFx461RedistLink)" Description="Microsoft .NET Framework 4.6.1 Setup" Hash="43BEF5EB278CF0954EAE1A6FEEC5A9852B932270508DD10647B9EA32DFD3832ECB58172B28707216709705BF0013FCEBB0B39DB31E38786FC2DAE219622EA00F" ProductName="Microsoft .NET Framework 4.6.1" Size="67681000" Version="4.6.1055.0" />
58 </ExePackage>
59 </PackageGroup>
60 </Fragment>
61
62 <Fragment>
63 <PackageGroup Id="$(var.NetFx461RedistId)AsPrereq">
64 <PackageGroupRef Id="$(var.NetFx461RedistId)" />
65 </PackageGroup>
66
67 <bal:ManagedBootstrapperApplicationPrereqInformation PackageId="$(var.NetFx461RedistId)" LicenseUrl="$(var.NetFx461EulaLink)" />
68 </Fragment>
69</Wix>
diff --git a/src/ext/NetFx/wixlib/NetFx462.wxs b/src/ext/NetFx/wixlib/NetFx462.wxs
new file mode 100644
index 00000000..146bae5f
--- /dev/null
+++ b/src/ext/NetFx/wixlib/NetFx462.wxs
@@ -0,0 +1,69 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2
3<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs" xmlns:bal="http://wixtoolset.org/schemas/v4/wxs/bal" xmlns:util="http://wixtoolset.org/schemas/v4/wxs/util">
4
5 <!--
6 .NET Framework installation state properties
7
8 Official documentation can be found at the following location:
9
10 .NET Framework 4.5/4.5.1/4.5.2/4.6/4.6.1/4.6.2 - http://msdn.microsoft.com/en-us/library/w0x726c2(v=vs.110).aspx
11 -->
12
13 <?define NetFx462MinRelease = 394802 ?>
14 <?define NetFx462WebLink = https://go.microsoft.com/fwlink/?LinkId=780596 ?>
15 <?define NetFx462RedistLink = https://go.microsoft.com/fwlink/?LinkId=780600 ?>
16 <?define NetFx462EulaLink = https://referencesource.microsoft.com/license.html ?>
17 <?define NetFx462WebId = NetFx462Web ?>
18 <?define NetFx462RedistId = NetFx462Redist ?>
19
20 <Fragment>
21 <PropertyRef Id="WIXNETFX4RELEASEINSTALLED" />
22 <Property Id="WIX_IS_NETFRAMEWORK_462_OR_LATER_INSTALLED" Secure="yes" />
23 <SetProperty Id="WIX_IS_NETFRAMEWORK_462_OR_LATER_INSTALLED" Value="1" After="AppSearch" Condition="WIXNETFX4RELEASEINSTALLED &gt;= &quot;#$(var.NetFx462MinRelease)&quot;" />
24 </Fragment>
25
26 <Fragment>
27 <util:RegistrySearchRef Id="NETFRAMEWORK45" />
28
29 <WixVariable Id="NetFx462WebDetectCondition" Value="NETFRAMEWORK45 &gt;= $(var.NetFx462MinRelease)" Overridable="yes" />
30 <WixVariable Id="NetFx462WebInstallCondition" Value="" Overridable="yes" />
31 <WixVariable Id="NetFx462WebPackageDirectory" Value="redist\" Overridable="yes" />
32
33 <PackageGroup Id="$(var.NetFx462WebId)">
34 <ExePackage InstallArguments="/q /norestart /log &quot;[NetFx462FullLog].html&quot;" UninstallArguments="/uninstall /q /norestart /log &quot;[NetFx462FullLog].html&quot;" PerMachine="yes" DetectCondition="!(wix.NetFx462WebDetectCondition)" InstallCondition="!(wix.NetFx462WebInstallCondition)" Id="$(var.NetFx462WebId)" Vital="yes" Permanent="yes" Protocol="netfx4" LogPathVariable="NetFx462FullLog">
35 <ExePackagePayload Name="!(wix.NetFx462WebPackageDirectory)NDP462-KB3151802-Web.exe" DownloadUrl="$(var.NetFx462WebLink)" Description="Microsoft .NET Framework 4.6.2 Setup" Hash="72CC8904EA9AC4248874FD888E2C63737DFFF920E4002EB1426318EFD2650D1D5055DFC80C1F398278F7246A3827FC0ED3C044471C67A40CDE66D3796F854DCE" ProductName="Microsoft .NET Framework 4.6.2" Size="1408232" Version="4.6.1590.0" />
36 </ExePackage>
37 </PackageGroup>
38 </Fragment>
39
40 <Fragment>
41 <PackageGroup Id="$(var.NetFx462WebId)AsPrereq">
42 <PackageGroupRef Id="$(var.NetFx462WebId)" />
43 </PackageGroup>
44
45 <bal:ManagedBootstrapperApplicationPrereqInformation PackageId="$(var.NetFx462WebId)" LicenseUrl="$(var.NetFx462EulaLink)" />
46 </Fragment>
47
48 <Fragment>
49 <util:RegistrySearchRef Id="NETFRAMEWORK45" />
50
51 <WixVariable Id="NetFx462RedistDetectCondition" Value="NETFRAMEWORK45 &gt;= $(var.NetFx462MinRelease)" Overridable="yes" />
52 <WixVariable Id="NetFx462RedistInstallCondition" Value="" Overridable="yes" />
53 <WixVariable Id="NetFx462RedistPackageDirectory" Value="redist\" Overridable="yes" />
54
55 <PackageGroup Id="$(var.NetFx462RedistId)">
56 <ExePackage InstallArguments="/q /norestart /log &quot;[NetFx462FullLog].html&quot;" UninstallArguments="/uninstall /q /norestart /log &quot;[NetFx462FullLog].html&quot;" PerMachine="yes" DetectCondition="!(wix.NetFx462RedistDetectCondition)" InstallCondition="!(wix.NetFx462RedistInstallCondition)" Id="$(var.NetFx462RedistId)" Vital="yes" Permanent="yes" Protocol="netfx4" LogPathVariable="NetFx462FullLog">
57 <ExePackagePayload Name="!(wix.NetFx462RedistPackageDirectory)NDP462-KB3151800-x86-x64-AllOS-ENU.exe" DownloadUrl="$(var.NetFx462RedistLink)" Description="Microsoft .NET Framework 4.6.2 Setup" Hash="5EFE9C21F355B91D12CB6B328737E8D01B6A7F8F815C477F6971A2267381B943BE6245E4B0021376EBE91C794812E93C7D4108348D837B2866FD86475F012908" ProductName="Microsoft .NET Framework 4.6.2" Size="62005552" Version="4.6.1590.0" />
58 </ExePackage>
59 </PackageGroup>
60 </Fragment>
61
62 <Fragment>
63 <PackageGroup Id="$(var.NetFx462RedistId)AsPrereq">
64 <PackageGroupRef Id="$(var.NetFx462RedistId)" />
65 </PackageGroup>
66
67 <bal:ManagedBootstrapperApplicationPrereqInformation PackageId="$(var.NetFx462RedistId)" LicenseUrl="$(var.NetFx462EulaLink)" />
68 </Fragment>
69</Wix>
diff --git a/src/ext/NetFx/wixlib/NetFx47.wxs b/src/ext/NetFx/wixlib/NetFx47.wxs
new file mode 100644
index 00000000..84f4a221
--- /dev/null
+++ b/src/ext/NetFx/wixlib/NetFx47.wxs
@@ -0,0 +1,20 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2
3<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
4
5 <!--
6 .NET Framework installation state properties
7
8 Official documentation can be found at the following location:
9
10 .NET Framework 4.5/4.5.1/4.5.2/4.6/4.6.1/4.6.2/4.7 - http://msdn.microsoft.com/en-us/library/w0x726c2(v=vs.110).aspx
11 -->
12
13 <?define NetFx47MinRelease = 460798 ?>
14
15 <Fragment>
16 <PropertyRef Id="WIXNETFX4RELEASEINSTALLED" />
17 <Property Id="WIX_IS_NETFRAMEWORK_47_OR_LATER_INSTALLED" Secure="yes" />
18 <SetProperty Id="WIX_IS_NETFRAMEWORK_47_OR_LATER_INSTALLED" Value="1" After="AppSearch" Condition="WIXNETFX4RELEASEINSTALLED &gt;= &quot;#$(var.NetFx47MinRelease)&quot;" />
19 </Fragment>
20</Wix>
diff --git a/src/ext/NetFx/wixlib/NetFx471.wxs b/src/ext/NetFx/wixlib/NetFx471.wxs
new file mode 100644
index 00000000..b5f825ab
--- /dev/null
+++ b/src/ext/NetFx/wixlib/NetFx471.wxs
@@ -0,0 +1,20 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2
3<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
4
5 <!--
6 .NET Framework installation state properties
7
8 Official documentation can be found at the following location:
9
10 .NET Framework 4.5/4.5.1/4.5.2/4.6/4.6.1/4.6.2/4.7/4.7.1 - http://msdn.microsoft.com/en-us/library/w0x726c2(v=vs.110).aspx
11 -->
12
13 <?define NetFx471MinRelease = 461308 ?>
14
15 <Fragment>
16 <PropertyRef Id="WIXNETFX4RELEASEINSTALLED" />
17 <Property Id="WIX_IS_NETFRAMEWORK_471_OR_LATER_INSTALLED" Secure="yes" />
18 <SetProperty Id="WIX_IS_NETFRAMEWORK_471_OR_LATER_INSTALLED" Value="1" After="AppSearch" Condition="WIXNETFX4RELEASEINSTALLED &gt;= &quot;#$(var.NetFx471MinRelease)&quot;" />
19 </Fragment>
20</Wix>
diff --git a/src/ext/NetFx/wixlib/NetFx472.wxs b/src/ext/NetFx/wixlib/NetFx472.wxs
new file mode 100644
index 00000000..57584a9e
--- /dev/null
+++ b/src/ext/NetFx/wixlib/NetFx472.wxs
@@ -0,0 +1,67 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2
3<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs" xmlns:bal="http://wixtoolset.org/schemas/v4/wxs/bal" xmlns:util="http://wixtoolset.org/schemas/v4/wxs/util">
4
5 <!--
6 .NET Framework installation state properties
7 Official documentation can be found at the following location:
8 .NET Framework 4.5/4.5.1/4.5.2/4.6/4.6.1/4.6.2/4.7/4.7.1/4.7.2 - https://msdn.microsoft.com/en-us/library/w0x726c2(v=vs.110).aspx
9 -->
10
11 <?define NetFx472MinRelease = 461808 ?>
12 <?define NetFx472WebLink = https://go.microsoft.com/fwlink/?LinkId=863262 ?>
13 <?define NetFx472RedistLink = https://go.microsoft.com/fwlink/?LinkId=863258 ?>
14 <?define NetFx472EulaLink = https://referencesource.microsoft.com/license.html ?>
15 <?define NetFx472WebId = NetFx472Web ?>
16 <?define NetFx472RedistId = NetFx472Redist ?>
17
18 <Fragment>
19 <PropertyRef Id="WIXNETFX4RELEASEINSTALLED" />
20 <Property Id="WIX_IS_NETFRAMEWORK_472_OR_LATER_INSTALLED" Secure="yes" />
21 <SetProperty Id="WIX_IS_NETFRAMEWORK_472_OR_LATER_INSTALLED" Value="1" After="AppSearch" Condition="WIXNETFX4RELEASEINSTALLED &gt;= &quot;#$(var.NetFx472MinRelease)&quot;" />
22 </Fragment>
23
24 <Fragment>
25 <util:RegistrySearchRef Id="NETFRAMEWORK45" />
26
27 <WixVariable Id="NetFx472WebDetectCondition" Value="NETFRAMEWORK45 &gt;= $(var.NetFx472MinRelease)" Overridable="yes" />
28 <WixVariable Id="NetFx472WebInstallCondition" Value="" Overridable="yes" />
29 <WixVariable Id="NetFx472WebPackageDirectory" Value="redist\" Overridable="yes" />
30
31 <PackageGroup Id="$(var.NetFx472WebId)">
32 <ExePackage InstallArguments="/q /norestart /log &quot;[NetFx472WebLog].html&quot;" UninstallArguments="/uninstall /q /norestart /log &quot;[NetFx472WebLog].html&quot;" PerMachine="yes" DetectCondition="!(wix.NetFx472WebDetectCondition)" InstallCondition="!(wix.NetFx472WebInstallCondition)" Id="$(var.NetFx472WebId)" Vital="yes" Permanent="yes" Protocol="netfx4" LogPathVariable="NetFx472WebLog">
33 <ExePackagePayload Name="!(wix.NetFx472WebPackageDirectory)NDP472-KB4054531-Web.exe" DownloadUrl="$(var.NetFx472WebLink)" Description="Microsoft .NET Framework 4.7.2 Setup" Hash="213CDEE35D320FE126CB64FE59963DB355062A14592E0B2FC4D45C2EDEF5F6A91305D0674D27152869202E3440090DFC207A0C5EB14D812F61E437907A81887E" ProductName="Microsoft .NET Framework 4.7.2" Size="1399888" Version="4.7.3081.0" />
34 </ExePackage>
35 </PackageGroup>
36 </Fragment>
37
38 <Fragment>
39 <PackageGroup Id="$(var.NetFx472WebId)AsPrereq">
40 <PackageGroupRef Id="$(var.NetFx472WebId)" />
41 </PackageGroup>
42
43 <bal:ManagedBootstrapperApplicationPrereqInformation PackageId="$(var.NetFx472WebId)" LicenseUrl="$(var.NetFx472EulaLink)" />
44 </Fragment>
45
46 <Fragment>
47 <util:RegistrySearchRef Id="NETFRAMEWORK45" />
48
49 <WixVariable Id="NetFx472RedistDetectCondition" Value="NETFRAMEWORK45 &gt;= $(var.NetFx472MinRelease)" Overridable="yes" />
50 <WixVariable Id="NetFx472RedistInstallCondition" Value="" Overridable="yes" />
51 <WixVariable Id="NetFx472RedistPackageDirectory" Value="redist\" Overridable="yes" />
52
53 <PackageGroup Id="$(var.NetFx472RedistId)">
54 <ExePackage InstallArguments="/q /norestart /log &quot;[NetFx472RedistLog].html&quot;" UninstallArguments="/uninstall /q /norestart /log &quot;[NetFx472RedistLog].html&quot;" PerMachine="yes" DetectCondition="!(wix.NetFx472RedistDetectCondition)" InstallCondition="!(wix.NetFx472RedistInstallCondition)" Id="$(var.NetFx472RedistId)" Vital="yes" Permanent="yes" Protocol="netfx4" LogPathVariable="NetFx472RedistLog">
55 <ExePackagePayload Name="!(wix.NetFx472RedistPackageDirectory)NDP472-KB4054530-x86-x64-AllOS-ENU.exe" DownloadUrl="$(var.NetFx472RedistLink)" Description="Microsoft .NET Framework 4.7.2 Setup" Hash="F4EA32D8189DD269FF02D68B39D7DE866AE5F46EEA5A71BF8F4715FB0E4F8B7AC64B274DFA7BFF69B52C719E65256906C8D92FDD355F52C977175AE3E1919098" ProductName="Microsoft .NET Framework 4.7.2" Size="83940592" Version="4.7.3081.0" />
56 </ExePackage>
57 </PackageGroup>
58 </Fragment>
59
60 <Fragment>
61 <PackageGroup Id="$(var.NetFx472RedistId)AsPrereq">
62 <PackageGroupRef Id="$(var.NetFx472RedistId)" />
63 </PackageGroup>
64
65 <bal:ManagedBootstrapperApplicationPrereqInformation PackageId="$(var.NetFx472RedistId)" LicenseUrl="$(var.NetFx472EulaLink)" />
66 </Fragment>
67</Wix>
diff --git a/src/ext/NetFx/wixlib/NetFx48.wxs b/src/ext/NetFx/wixlib/NetFx48.wxs
new file mode 100644
index 00000000..bfca5092
--- /dev/null
+++ b/src/ext/NetFx/wixlib/NetFx48.wxs
@@ -0,0 +1,67 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2
3<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs" xmlns:bal="http://wixtoolset.org/schemas/v4/wxs/bal" xmlns:util="http://wixtoolset.org/schemas/v4/wxs/util">
4
5 <!--
6 .NET Framework installation state properties
7 Official documentation can be found at the following location:
8 .NET Framework 4.5/4.5.1/4.5.2/4.6/4.6.1/4.6.2/4.7/4.7.1/4.7.2/4.8 - https://msdn.microsoft.com/en-us/library/w0x726c2(v=vs.110).aspx
9 -->
10
11 <?define NetFx48MinRelease = 528040 ?>
12 <?define NetFx48WebLink = https://go.microsoft.com/fwlink/?LinkId=2085155 ?>
13 <?define NetFx48RedistLink = https://go.microsoft.com/fwlink/?linkid=2088631 ?>
14 <?define NetFx48EulaLink = https://referencesource.microsoft.com/license.html ?>
15 <?define NetFx48WebId = NetFx48Web ?>
16 <?define NetFx48RedistId = NetFx48Redist ?>
17
18 <Fragment>
19 <PropertyRef Id="WIXNETFX4RELEASEINSTALLED" />
20 <Property Id="WIX_IS_NETFRAMEWORK_48_OR_LATER_INSTALLED" Secure="yes" />
21 <SetProperty Id="WIX_IS_NETFRAMEWORK_48_OR_LATER_INSTALLED" Value="1" After="AppSearch" Condition="WIXNETFX4RELEASEINSTALLED &gt;= &quot;#$(var.NetFx48MinRelease)&quot;" />
22 </Fragment>
23
24 <Fragment>
25 <util:RegistrySearchRef Id="NETFRAMEWORK45" />
26
27 <WixVariable Id="NetFx48WebDetectCondition" Value="NETFRAMEWORK45 &gt;= $(var.NetFx48MinRelease)" Overridable="yes" />
28 <WixVariable Id="NetFx48WebInstallCondition" Value="" Overridable="yes" />
29 <WixVariable Id="NetFx48WebPackageDirectory" Value="redist\" Overridable="yes" />
30
31 <PackageGroup Id="$(var.NetFx48WebId)">
32 <ExePackage InstallArguments="/q /norestart /log &quot;[NetFx48WebLog].html&quot;" UninstallArguments="/uninstall /q /norestart /log &quot;[NetFx48WebLog].html&quot;" PerMachine="yes" DetectCondition="!(wix.NetFx48WebDetectCondition)" InstallCondition="!(wix.NetFx48WebInstallCondition)" Id="$(var.NetFx48WebId)" Vital="yes" Permanent="yes" Protocol="netfx4" LogPathVariable="NetFx48WebLog">
33 <ExePackagePayload Name="!(wix.NetFx48WebPackageDirectory)ndp48-web.exe" DownloadUrl="$(var.NetFx48WebLink)" Description="Microsoft .NET Framework 4.8 Setup" Hash="B09A3F6802741BD5E4A9598FF3F890FEB760D865C98F33B3CF6951C3ADE396C9819D6ECA562CAD6C339C53FC1AF88F7936DD09CBBAC22EE16FC67BAE076646B6" ProductName="Microsoft .NET Framework 4.8" Size="1443272" Version="4.8.4115.0" />
34 </ExePackage>
35 </PackageGroup>
36 </Fragment>
37
38 <Fragment>
39 <PackageGroup Id="$(var.NetFx48WebId)AsPrereq">
40 <PackageGroupRef Id="$(var.NetFx48WebId)" />
41 </PackageGroup>
42
43 <bal:ManagedBootstrapperApplicationPrereqInformation PackageId="$(var.NetFx48WebId)" LicenseUrl="$(var.NetFx48EulaLink)" />
44 </Fragment>
45
46 <Fragment>
47 <util:RegistrySearchRef Id="NETFRAMEWORK45" />
48
49 <WixVariable Id="NetFx48RedistDetectCondition" Value="NETFRAMEWORK45 &gt;= $(var.NetFx48MinRelease)" Overridable="yes" />
50 <WixVariable Id="NetFx48RedistInstallCondition" Value="" Overridable="yes" />
51 <WixVariable Id="NetFx48RedistPackageDirectory" Value="redist\" Overridable="yes" />
52
53 <PackageGroup Id="$(var.NetFx48RedistId)">
54 <ExePackage InstallArguments="/q /norestart /log &quot;[NetFx48RedistLog].html&quot;" UninstallArguments="/uninstall /q /norestart /log &quot;[NetFx48RedistLog].html&quot;" PerMachine="yes" DetectCondition="!(wix.NetFx48RedistDetectCondition)" InstallCondition="!(wix.NetFx48RedistInstallCondition)" Id="$(var.NetFx48RedistId)" Vital="yes" Permanent="yes" Protocol="netfx4" LogPathVariable="NetFx48RedistLog">
55 <ExePackagePayload Name="!(wix.NetFx48RedistPackageDirectory)ndp48-x86-x64-allos-enu.exe" DownloadUrl="$(var.NetFx48RedistLink)" Description="Microsoft .NET Framework 4.8 Setup" Hash="DE7FD1B245BAAAC3A2BA1C2C650492AB71EB689902E281DDA02B069A441BAF9B1CF067D596C2E67C27EB58C341F572D8E7D481EC5D6E3A4CFB8D0C9AA7B55181" ProductName="Microsoft .NET Framework 4.8" Size="121319368" Version="4.8.4115.0" />
56 </ExePackage>
57 </PackageGroup>
58 </Fragment>
59
60 <Fragment>
61 <PackageGroup Id="$(var.NetFx48RedistId)AsPrereq">
62 <PackageGroupRef Id="$(var.NetFx48RedistId)" />
63 </PackageGroup>
64
65 <bal:ManagedBootstrapperApplicationPrereqInformation PackageId="$(var.NetFx48RedistId)" LicenseUrl="$(var.NetFx48EulaLink)" />
66 </Fragment>
67</Wix>
diff --git a/src/ext/NetFx/wixlib/NetFxExtension.wxs b/src/ext/NetFx/wixlib/NetFxExtension.wxs
new file mode 100644
index 00000000..63c79235
--- /dev/null
+++ b/src/ext/NetFx/wixlib/NetFxExtension.wxs
@@ -0,0 +1,38 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2
3
4<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
5
6 <!--
7 .NET Framework installation state properties
8 -->
9
10 <!-- Location of .NET Framework redistributable install root directory -->
11 <Fragment>
12 <Property Id="NETFRAMEWORKINSTALLROOTDIR" Secure="yes">
13 <RegistrySearch Id="NetFxInstallRootSearch" Type="raw" Root="HKLM" Key="Software\Microsoft\.NETFramework" Name="InstallRoot" />
14 </Property>
15 </Fragment>
16
17 <!-- location of the Windows SDK current active version installation root -->
18 <Fragment>
19 <Property Id="WINDOWSSDKCURRENTVERSIONDIR" Secure="yes">
20 <RegistrySearch Id="WindowsSdkCurrentVersionDir" Root="HKLM" Key="Software\Microsoft\Microsoft SDKs\Windows" Name="CurrentInstallFolder" Type="raw" />
21 </Property>
22 </Fragment>
23
24 <!-- The Windows SDK current active version -->
25 <Fragment>
26 <Property Id="WINDOWSSDKCURRENTVERSION" Secure="yes">
27 <RegistrySearch Id="WindowsSdkCurrentVersion" Root="HKLM" Key="Software\Microsoft\Microsoft SDKs\Windows" Name="CurrentVersion" Type="raw" />
28 </Property>
29 </Fragment>
30
31 <!-- Release value of .NET 4.5 and later -->
32 <Fragment>
33 <Property Id="WIXNETFX4RELEASEINSTALLED" Secure="yes">
34 <RegistrySearch Id="NetFx4ReleaseInstalled" Root="HKLM" Key="SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full" Name="Release" Type="raw" />
35 </Property>
36 </Fragment>
37
38</Wix>
diff --git a/src/ext/NetFx/wixlib/NetFxExtension_Platform.wxi b/src/ext/NetFx/wixlib/NetFxExtension_Platform.wxi
new file mode 100644
index 00000000..7bd727c5
--- /dev/null
+++ b/src/ext/NetFx/wixlib/NetFxExtension_Platform.wxi
@@ -0,0 +1,28 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2
3
4<Include xmlns="http://wixtoolset.org/schemas/v4/wxs">
5
6 <?include caDecor.wxi ?>
7
8 <Fragment>
9 <CustomAction Id="$(var.Prefix)NetFxScheduleNativeImage$(var.Suffix)" DllEntry="SchedNetFx" Execute="immediate" Return="check" SuppressModularization="yes" BinaryRef="$(var.Prefix)NetFxCA$(var.Suffix)" />
10 <CustomAction Id="$(var.Prefix)NetFxExecuteNativeImageInstall$(var.Suffix)" DllEntry="ExecNetFx" Execute="deferred" Impersonate="no" Return="ignore" SuppressModularization="yes" BinaryRef="$(var.Prefix)NetFxCA$(var.Suffix)" />
11 <CustomAction Id="$(var.Prefix)NetFxExecuteNativeImageCommitInstall$(var.Suffix)" DllEntry="ExecNetFx" Execute="commit" Impersonate="no" Return="ignore" SuppressModularization="yes" BinaryRef="$(var.Prefix)NetFxCA$(var.Suffix)" />
12 <CustomAction Id="$(var.Prefix)NetFxExecuteNativeImageUninstall$(var.Suffix)" DllEntry="ExecNetFx" Execute="deferred" Impersonate="no" Return="ignore" SuppressModularization="yes" BinaryRef="$(var.Prefix)NetFxCA$(var.Suffix)" />
13 <CustomAction Id="$(var.Prefix)NetFxExecuteNativeImageCommitUninstall$(var.Suffix)" DllEntry="ExecNetFx" Execute="commit" Impersonate="no" Return="ignore" SuppressModularization="yes" BinaryRef="$(var.Prefix)NetFxCA$(var.Suffix)" />
14
15 <InstallExecuteSequence>
16 <Custom Action="$(var.Prefix)NetFxScheduleNativeImage$(var.Suffix)" Before="InstallFiles" Overridable="yes" />
17 <Custom Action="$(var.Prefix)NetFxExecuteNativeImageCommitUninstall$(var.Suffix)" After="MsiPublishAssemblies" Overridable="yes" Condition="RollbackDisabled &lt;&gt; 1" />
18 <Custom Action="$(var.Prefix)NetFxExecuteNativeImageUninstall$(var.Suffix)" After="$(var.Prefix)NetFxExecuteNativeImageCommitUninstall$(var.Suffix)" Overridable="yes" Condition="RollbackDisabled = 1" />
19 <Custom Action="$(var.Prefix)NetFxExecuteNativeImageCommitInstall$(var.Suffix)" After="$(var.Prefix)NetFxExecuteNativeImageUninstall$(var.Suffix)" Overridable="yes" Condition="RollbackDisabled &lt;&gt; 1" />
20 <Custom Action="$(var.Prefix)NetFxExecuteNativeImageInstall$(var.Suffix)" After="$(var.Prefix)NetFxExecuteNativeImageCommitInstall$(var.Suffix)" Overridable="yes" Condition="RollbackDisabled = 1" />
21 </InstallExecuteSequence>
22 </Fragment>
23
24 <!-- NetFx Custom Action DLL Definitions -->
25 <Fragment>
26 <Binary Id="$(var.Prefix)NetFxCA$(var.Suffix)" SourceFile="!(bindpath.$(var.platform))netfxca.dll" />
27 </Fragment>
28</Include>
diff --git a/src/ext/NetFx/wixlib/NetFxExtension_arm64.wxs b/src/ext/NetFx/wixlib/NetFxExtension_arm64.wxs
new file mode 100644
index 00000000..a0492fde
--- /dev/null
+++ b/src/ext/NetFx/wixlib/NetFxExtension_arm64.wxs
@@ -0,0 +1,7 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2
3
4<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
5 <?define platform=arm64 ?>
6 <?include NetfxExtension_Platform.wxi ?>
7</Wix>
diff --git a/src/ext/NetFx/wixlib/NetFxExtension_x64.wxs b/src/ext/NetFx/wixlib/NetFxExtension_x64.wxs
new file mode 100644
index 00000000..81c9d768
--- /dev/null
+++ b/src/ext/NetFx/wixlib/NetFxExtension_x64.wxs
@@ -0,0 +1,7 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2
3
4<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
5 <?define platform=x64 ?>
6 <?include NetfxExtension_Platform.wxi ?>
7</Wix>
diff --git a/src/ext/NetFx/wixlib/NetFxExtension_x86.wxs b/src/ext/NetFx/wixlib/NetFxExtension_x86.wxs
new file mode 100644
index 00000000..b8ad1927
--- /dev/null
+++ b/src/ext/NetFx/wixlib/NetFxExtension_x86.wxs
@@ -0,0 +1,7 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2
3
4<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
5 <?define platform=x86 ?>
6 <?include NetfxExtension_Platform.wxi ?>
7</Wix>
diff --git a/src/ext/NetFx/wixlib/caDecor.wxi b/src/ext/NetFx/wixlib/caDecor.wxi
new file mode 100644
index 00000000..b1711518
--- /dev/null
+++ b/src/ext/NetFx/wixlib/caDecor.wxi
@@ -0,0 +1,39 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2
3
4<Include xmlns="http://wixtoolset.org/schemas/v4/wxs">
5 <?ifdef Prefix ?>
6 <?undef Prefix ?>
7 <?endif?>
8
9 <?define Prefix="Wix4" ?>
10
11 <?ifndef platform ?>
12 <?define platform="x86" ?>
13 <?endif?>
14
15 <?if $(var.platform)="" ?>
16 <?undef platform ?>
17 <?define platform="x86" ?>
18 <?endif?>
19
20 <?ifdef Suffix ?>
21 <?undef Suffix ?>
22 <?endif?>
23
24 <?if $(var.platform)~="x86" ?>
25 <?define Suffix="_X86" ?>
26 <?endif?>
27
28 <?if $(var.platform)~="x64" ?>
29 <?define Suffix="_X64" ?>
30 <?endif?>
31
32 <?if $(var.platform)~="arm" ?>
33 <?define Suffix="_A32" ?>
34 <?endif?>
35
36 <?if $(var.platform)~="arm64" ?>
37 <?define Suffix="_A64" ?>
38 <?endif?>
39</Include>
diff --git a/src/ext/NetFx/wixlib/netfx.v3.ncrunchproject b/src/ext/NetFx/wixlib/netfx.v3.ncrunchproject
new file mode 100644
index 00000000..319cd523
--- /dev/null
+++ b/src/ext/NetFx/wixlib/netfx.v3.ncrunchproject
@@ -0,0 +1,5 @@
1<ProjectConfiguration>
2 <Settings>
3 <IgnoreThisComponentCompletely>True</IgnoreThisComponentCompletely>
4 </Settings>
5</ProjectConfiguration> \ No newline at end of file
diff --git a/src/ext/NetFx/wixlib/netfx.wixproj b/src/ext/NetFx/wixlib/netfx.wixproj
new file mode 100644
index 00000000..937ed0d4
--- /dev/null
+++ b/src/ext/NetFx/wixlib/netfx.wixproj
@@ -0,0 +1,32 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3
4<Project Sdk="WixToolset.Sdk">
5
6 <PropertyGroup>
7 <OutputType>Library</OutputType>
8 <BindFiles>true</BindFiles>
9 </PropertyGroup>
10
11 <ItemGroup>
12 <BindInputPaths Include="$(OutputPath)x86" BindName='x86' />
13 <BindInputPaths Include="$(OutputPath)x64" BindName='x64' />
14 <BindInputPaths Include="$(OutputPath)arm64" BindName='arm64' />
15 </ItemGroup>
16
17 <ItemGroup>
18 <ProjectReference Include="..\ca\netfxca.vcxproj" Properties="Platform=ARM64" ReferenceOutputAssembly="false" />
19 <ProjectReference Include="..\ca\netfxca.vcxproj" Properties="Platform=x86" ReferenceOutputAssembly="false" />
20 <ProjectReference Include="..\ca\netfxca.vcxproj" Properties="Platform=x64" ReferenceOutputAssembly="false" />
21 </ItemGroup>
22
23 <ItemGroup>
24 <PackageReference Include="WixToolset.Bal.wixext" Version="4.0.*" />
25 <PackageReference Include="WixToolset.Util.wixext" Version="4.0.*" />
26 </ItemGroup>
27
28 <ItemGroup>
29 <PackageReference Include="Nerdbank.GitVersioning" Version="3.3.37" PrivateAssets="All" />
30 </ItemGroup>
31
32</Project>
diff --git a/src/ext/UI/Directory.Build.props b/src/ext/UI/Directory.Build.props
new file mode 100644
index 00000000..b3c6287c
--- /dev/null
+++ b/src/ext/UI/Directory.Build.props
@@ -0,0 +1,27 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3<!--
4 Do NOT modify this file. Update the canonical version in Home\repo-template\src\Directory.Build.props
5 then update all of the repos.
6-->
7<Project>
8 <PropertyGroup>
9 <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
10 <EnableSourceLink Condition=" '$(NCrunch)' == '1' ">false</EnableSourceLink>
11 <MSBuildWarningsAsMessages>MSB3246</MSBuildWarningsAsMessages>
12
13 <ProjectName Condition=" '$(ProjectName)' == '' ">$(MSBuildProjectName)</ProjectName>
14 <BaseOutputPath>$([System.IO.Path]::GetFullPath($(MSBuildThisFileDirectory)..\build\))</BaseOutputPath>
15 <BaseIntermediateOutputPath>$(BaseOutputPath)obj\$(ProjectName)\</BaseIntermediateOutputPath>
16 <OutputPath>$(BaseOutputPath)$(Configuration)\</OutputPath>
17
18 <Authors>WiX Toolset Team</Authors>
19 <Company>WiX Toolset</Company>
20 <Copyright>Copyright (c) .NET Foundation and contributors. All rights reserved.</Copyright>
21 <PackageLicenseExpression>MS-RL</PackageLicenseExpression>
22 <Product>WiX Toolset</Product>
23 </PropertyGroup>
24
25 <Import Project="Directory$(MSBuildProjectExtension).props" Condition=" Exists('Directory$(MSBuildProjectExtension).props') " />
26 <Import Project="Custom.Build.props" Condition=" Exists('Custom.Build.props') " />
27</Project>
diff --git a/src/ext/UI/Directory.Build.targets b/src/ext/UI/Directory.Build.targets
new file mode 100644
index 00000000..2fcc765a
--- /dev/null
+++ b/src/ext/UI/Directory.Build.targets
@@ -0,0 +1,51 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3<!--
4 Do NOT modify this file. Update the canonical version in Home\repo-template\src\Directory.Build.targets
5 then update all of the repos.
6-->
7<!--
8 Replace PackageReferences with ProjectReferences when the projects can be found in .sln.
9 See the original here: https://github.com/dotnet/sdk/issues/1151#issuecomment-385133284
10-->
11<Project>
12 <PropertyGroup>
13 <ReplacePackageReferences>true</ReplacePackageReferences>
14 <TheSolutionPath Condition=" '$(NCrunch)'=='' ">$(SolutionPath)</TheSolutionPath>
15 <TheSolutionPath Condition=" '$(NCrunch)'=='1' ">$(NCrunchOriginalSolutionPath)</TheSolutionPath>
16 </PropertyGroup>
17
18 <Choose>
19 <When Condition="$(ReplacePackageReferences) AND '$(TheSolutionPath)' != '' AND '$(TheSolutionPath)' != '*undefined*' AND Exists('$(TheSolutionPath)')">
20
21 <PropertyGroup>
22 <SolutionFileContent>$([System.IO.File]::ReadAllText($(TheSolutionPath)))</SolutionFileContent>
23 <SmartSolutionDir>$([System.IO.Path]::GetDirectoryName( $(TheSolutionPath) ))</SmartSolutionDir>
24 <RegexPattern>(?&lt;="[PackageName]", ")(.*)(?=", ")</RegexPattern>
25 </PropertyGroup>
26
27 <ItemGroup>
28 <!-- Keep the identity of the PackageReference -->
29 <SmartPackageReference Include="@(PackageReference)">
30 <PackageName>%(Identity)</PackageName>
31 <InSolution>$(SolutionFileContent.Contains('\%(Identity).csproj'))</InSolution>
32 </SmartPackageReference>
33
34 <!-- Filter them by mapping them to another ItemGroup using the WithMetadataValue item function -->
35 <PackageInSolution Include="@(SmartPackageReference->WithMetadataValue('InSolution', True))">
36 <Pattern>$(RegexPattern.Replace('[PackageName]','%(PackageName)') )</Pattern>
37 <SmartPath>$([System.Text.RegularExpressions.Regex]::Match('$(SolutionFileContent)', '%(Pattern)'))</SmartPath>
38 </PackageInSolution>
39
40 <ProjectReference Include="@(PackageInSolution->'$(SmartSolutionDir)\%(SmartPath)' )"/>
41
42 <!-- Remove the package references that are now referenced as projects -->
43 <PackageReference Remove="@(PackageInSolution->'%(PackageName)')"/>
44 </ItemGroup>
45
46 </When>
47 </Choose>
48
49 <Import Project="Directory$(MSBuildProjectExtension).targets" Condition=" Exists('Directory$(MSBuildProjectExtension).targets') " />
50 <Import Project="Custom.Build.targets" Condition=" Exists('Custom.Build.targets') " />
51</Project>
diff --git a/src/ext/UI/Directory.csproj.props b/src/ext/UI/Directory.csproj.props
new file mode 100644
index 00000000..81d24ad1
--- /dev/null
+++ b/src/ext/UI/Directory.csproj.props
@@ -0,0 +1,13 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2<!--
3 Do NOT modify this file. Update the canonical version in Home\repo-template\src\CSharp.Build.props
4 then update all of the repos.
5-->
6<Project>
7 <PropertyGroup>
8 <CheckForOverflowUnderflow>true</CheckForOverflowUnderflow>
9 <SignAssembly>true</SignAssembly>
10 <AssemblyOriginatorKeyFile>$([System.IO.Path]::GetFullPath($(MSBuildThisFileDirectory)wix.snk))</AssemblyOriginatorKeyFile>
11 <NBGV_EmitThisAssemblyClass>false</NBGV_EmitThisAssemblyClass>
12 </PropertyGroup>
13</Project>
diff --git a/src/ext/UI/Directory.csproj.targets b/src/ext/UI/Directory.csproj.targets
new file mode 100644
index 00000000..c3270426
--- /dev/null
+++ b/src/ext/UI/Directory.csproj.targets
@@ -0,0 +1,26 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2<!--
3 Do NOT modify this file. Update the canonical version in Home\repo-template\src\Directory.csproj.targets
4 then update all of the repos.
5-->
6<Project>
7 <PropertyGroup>
8 <CreateDocumentation Condition=" '$(CreateDocumentationFile)'!='true' ">false</CreateDocumentation>
9 <DocumentationFile Condition=" '$(CreateDocumentationFile)'=='true' ">$(OutputPath)\$(AssemblyName).xml</DocumentationFile>
10 </PropertyGroup>
11
12 <Target Name="SetNuspecProperties" DependsOnTargets="InitializeSourceControlInformation" AfterTargets="GetBuildVersion"
13 Condition=" Exists('$(MSBuildProjectName).nuspec') ">
14 <PropertyGroup>
15 <ProjectUrl Condition=" '$(ProjectUrl)'=='' and '$(PrivateRepositoryUrl)'!='' ">$(PrivateRepositoryUrl.Replace('.git',''))</ProjectUrl>
16
17 <NuspecFile>$(MSBuildProjectName).nuspec</NuspecFile>
18 <NuspecBasePath Condition=" '$(NuspecBasePath)'=='' ">$(OutputPath)..\</NuspecBasePath>
19 <NuspecProperties>$(NuspecProperties);Id=$(PackageId);Authors=$(Authors);Copyright=$(Copyright);Description=$(Description);Title=$(Title)</NuspecProperties>
20 <NuspecProperties>$(NuspecProperties);Version=$(PackageVersion);RepositoryCommit=$(SourceRevisionId);RepositoryType=$(RepositoryType);RepositoryUrl=$(PrivateRepositoryUrl);ProjectFolder=$(MSBuildProjectDirectory)\;ProjectUrl=$(ProjectUrl)</NuspecProperties>
21 <PublishRepositoryUrl>true</PublishRepositoryUrl>
22 <SymbolPackageFormat>snupkg</SymbolPackageFormat>
23 </PropertyGroup>
24 </Target>
25
26</Project>
diff --git a/src/ext/UI/Directory.vcxproj.props b/src/ext/UI/Directory.vcxproj.props
new file mode 100644
index 00000000..bcf26c57
--- /dev/null
+++ b/src/ext/UI/Directory.vcxproj.props
@@ -0,0 +1,111 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3
4<Project>
5 <PropertyGroup>
6 <Platform Condition=" '$(Platform)' == '' OR '$(Platform)' == 'AnyCPU' ">Win32</Platform>
7 <IntDir>$(BaseIntermediateOutputPath)$(Configuration)\$(Platform)\</IntDir>
8 <OutDir>$(OutputPath)$(Platform)\</OutDir>
9
10 <!-- NBGV properties -->
11 <AssemblyCompany>$(Company)</AssemblyCompany>
12 <AssemblyCopyright>$(Copyright)</AssemblyCopyright>
13
14 <RuntimeIdentifiers>win-x86;win-x64;win-arm64</RuntimeIdentifiers>
15 <NuGetTargetMoniker>native,Version=v0.0</NuGetTargetMoniker>
16 </PropertyGroup>
17
18 <PropertyGroup Condition="'$(WindowsTargetPlatformVersion)'=='' AND '$(VisualStudioVersion)'>='15.0'">
19 <WindowsTargetPlatformVersion>$([Microsoft.Build.Utilities.ToolLocationHelper]::GetLatestSDKTargetPlatformVersion('Windows', '10.0'))</WindowsTargetPlatformVersion>
20 </PropertyGroup>
21
22 <ItemDefinitionGroup>
23 <ClCompile>
24 <DisableSpecificWarnings>$(DisableSpecificCompilerWarnings)</DisableSpecificWarnings>
25 <WarningLevel>Level4</WarningLevel>
26 <AdditionalIncludeDirectories>$(ProjectDir)inc;$(MSBuildProjectDirectory);$(IntDir);$(SqlCESdkIncludePath);$(ProjectAdditionalIncludeDirectories);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
27 <PreprocessorDefinitions>WIN32;_WINDOWS;_WIN32_MSI=500;_WIN32_WINNT=0x0501;$(ArmPreprocessorDefinitions);$(UnicodePreprocessorDefinitions);_CRT_STDIO_LEGACY_WIDE_SPECIFIERS;_WINSOCK_DEPRECATED_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
28 <PrecompiledHeader>Use</PrecompiledHeader>
29 <PrecompiledHeaderFile>precomp.h</PrecompiledHeaderFile>
30 <CallingConvention Condition="'$(Platform)'=='Win32'">StdCall</CallingConvention>
31 <TreatWarningAsError>true</TreatWarningAsError>
32 <ExceptionHandling>false</ExceptionHandling>
33 <AdditionalOptions>-YlprecompDefine</AdditionalOptions>
34 <AdditionalOptions Condition=" $(PlatformToolset.StartsWith('v14')) ">/Zc:threadSafeInit- %(AdditionalOptions)</AdditionalOptions>
35 <MultiProcessorCompilation Condition=" $(NUMBER_OF_PROCESSORS) &gt; 4 ">true</MultiProcessorCompilation>
36 </ClCompile>
37 <ResourceCompile>
38 <PreprocessorDefinitions>$(ArmPreprocessorDefinitions);%(PreprocessorDefinitions)</PreprocessorDefinitions>
39 <AdditionalIncludeDirectories>$(ProjectAdditionalResourceIncludeDirectories);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
40 </ResourceCompile>
41 <Lib>
42 <AdditionalLibraryDirectories>$(OutDir);$(AdditionalMultiTargetLibraryPath);$(ProjectAdditionalLibraryDirectories);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
43 </Lib>
44 <Link>
45 <SubSystem>$(ProjectSubSystem)</SubSystem>
46 <ModuleDefinitionFile>$(ProjectModuleDefinitionFile)</ModuleDefinitionFile>
47 <NoEntryPoint>$(ResourceOnlyDll)</NoEntryPoint>
48 <GenerateDebugInformation>true</GenerateDebugInformation>
49 <AdditionalDependencies>$(ProjectAdditionalLinkLibraries);advapi32.lib;comdlg32.lib;user32.lib;oleaut32.lib;gdi32.lib;shell32.lib;ole32.lib;version.lib;%(AdditionalDependencies)</AdditionalDependencies>
50 <AdditionalLibraryDirectories>$(OutDir);$(AdditionalMultiTargetLibraryPath);$(ArmLibraryDirectories);$(ProjectAdditionalLinkLibraryDirectories);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
51 <AdditionalOptions Condition=" $(PlatformToolset.StartsWith('v14')) ">/IGNORE:4099 %(AdditionalOptions)</AdditionalOptions>
52 </Link>
53 </ItemDefinitionGroup>
54
55 <ItemDefinitionGroup Condition=" '$(Platform)'=='Win32' and '$(PlatformToolset)'!='v100'">
56 <ClCompile>
57 <EnableEnhancedInstructionSet>NoExtensions</EnableEnhancedInstructionSet>
58 </ClCompile>
59 </ItemDefinitionGroup>
60 <ItemDefinitionGroup Condition=" '$(Platform)'=='arm' ">
61 <ClCompile>
62 <CallingConvention>CDecl</CallingConvention>
63 </ClCompile>
64 </ItemDefinitionGroup>
65 <ItemDefinitionGroup Condition=" '$(ConfigurationType)'=='StaticLibrary' ">
66 <ClCompile>
67 <DebugInformationFormat>OldStyle</DebugInformationFormat>
68 <OmitDefaultLibName>true</OmitDefaultLibName>
69 <IgnoreAllDefaultLibraries>true</IgnoreAllDefaultLibraries>
70 </ClCompile>
71 </ItemDefinitionGroup>
72 <ItemDefinitionGroup Condition=" '$(Configuration)'=='Debug' ">
73 <ClCompile>
74 <Optimization>Disabled</Optimization>
75 <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
76 <PreprocessorDefinitions>_DEBUG;DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
77 <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
78 </ClCompile>
79 </ItemDefinitionGroup>
80 <ItemDefinitionGroup Condition=" '$(Configuration)'=='Debug' and '$(CLRSupport)'=='true' ">
81 <ClCompile>
82 <BasicRuntimeChecks></BasicRuntimeChecks>
83 <RuntimeLibrary>MultiThreadedDebugDll</RuntimeLibrary>
84 </ClCompile>
85 </ItemDefinitionGroup>
86 <ItemDefinitionGroup Condition=" '$(Configuration)'=='Release' ">
87 <ClCompile>
88 <Optimization>MinSpace</Optimization>
89 <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
90 <FunctionLevelLinking>true</FunctionLevelLinking>
91 <IntrinsicFunctions>true</IntrinsicFunctions>
92 <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
93 </ClCompile>
94 <Link>
95 <EnableCOMDATFolding>true</EnableCOMDATFolding>
96 <OptimizeReferences>true</OptimizeReferences>
97 </Link>
98 </ItemDefinitionGroup>
99 <ItemDefinitionGroup Condition=" '$(Configuration)'=='Release' and '$(CLRSupport)'=='true' ">
100 <ClCompile>
101 <BasicRuntimeChecks></BasicRuntimeChecks>
102 <RuntimeLibrary>MultiThreadedDll</RuntimeLibrary>
103 </ClCompile>
104 </ItemDefinitionGroup>
105 <ItemDefinitionGroup Condition=" '$(CLRSupport)'=='true' ">
106 <Link>
107 <KeyFile>$(LinkKeyFile)</KeyFile>
108 <DelaySign>$(LinkDelaySign)</DelaySign>
109 </Link>
110 </ItemDefinitionGroup>
111</Project>
diff --git a/src/ext/UI/README.md b/src/ext/UI/README.md
new file mode 100644
index 00000000..ebfefedd
--- /dev/null
+++ b/src/ext/UI/README.md
@@ -0,0 +1,2 @@
1# UI.wixext
2WixToolset.UI.wixext - UI WiX Toolset Extension
diff --git a/src/ext/UI/UI.wixext.sln b/src/ext/UI/UI.wixext.sln
new file mode 100644
index 00000000..bab6232e
--- /dev/null
+++ b/src/ext/UI/UI.wixext.sln
@@ -0,0 +1,75 @@
1
2Microsoft Visual Studio Solution File, Format Version 12.00
3# Visual Studio Version 16
4VisualStudioVersion = 16.0.30320.27
5MinimumVisualStudioVersion = 15.0.26124.0
6Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "uica", "src\ca\uica.vcxproj", "{F72D34CA-48DA-4DFD-91A9-A0C78BEF6981}"
7EndProject
8Project("{930C7802-8A8C-48F9-8165-68863BCCD9DD}") = "ui", "src\wixlib\ui.wixproj", "{2D4FF07B-26F8-4BEF-B41C-E4383F86DC32}"
9EndProject
10Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WixToolset.UI.wixext", "src\wixext\WixToolset.UI.wixext.csproj", "{33F6ABF5-FA13-4B73-99FA-F9BBA894DD9A}"
11EndProject
12Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WixToolsetTest.UI", "src\test\WixToolsetTest.UI\WixToolsetTest.UI.csproj", "{A37CC793-F659-4C77-A01C-D183023B6880}"
13EndProject
14Global
15 GlobalSection(SolutionConfigurationPlatforms) = preSolution
16 Debug|Any CPU = Debug|Any CPU
17 Debug|x64 = Debug|x64
18 Debug|x86 = Debug|x86
19 Release|Any CPU = Release|Any CPU
20 Release|x64 = Release|x64
21 Release|x86 = Release|x86
22 EndGlobalSection
23 GlobalSection(ProjectConfigurationPlatforms) = postSolution
24 {F72D34CA-48DA-4DFD-91A9-A0C78BEF6981}.Debug|Any CPU.ActiveCfg = Debug|Win32
25 {F72D34CA-48DA-4DFD-91A9-A0C78BEF6981}.Debug|Any CPU.Build.0 = Debug|Win32
26 {F72D34CA-48DA-4DFD-91A9-A0C78BEF6981}.Debug|x64.ActiveCfg = Debug|Win32
27 {F72D34CA-48DA-4DFD-91A9-A0C78BEF6981}.Debug|x86.ActiveCfg = Debug|Win32
28 {F72D34CA-48DA-4DFD-91A9-A0C78BEF6981}.Debug|x86.Build.0 = Debug|Win32
29 {F72D34CA-48DA-4DFD-91A9-A0C78BEF6981}.Release|Any CPU.ActiveCfg = Release|Win32
30 {F72D34CA-48DA-4DFD-91A9-A0C78BEF6981}.Release|Any CPU.Build.0 = Release|Win32
31 {F72D34CA-48DA-4DFD-91A9-A0C78BEF6981}.Release|x64.ActiveCfg = Release|Win32
32 {F72D34CA-48DA-4DFD-91A9-A0C78BEF6981}.Release|x86.ActiveCfg = Release|Win32
33 {F72D34CA-48DA-4DFD-91A9-A0C78BEF6981}.Release|x86.Build.0 = Release|Win32
34 {2D4FF07B-26F8-4BEF-B41C-E4383F86DC32}.Debug|Any CPU.ActiveCfg = Debug|x86
35 {2D4FF07B-26F8-4BEF-B41C-E4383F86DC32}.Debug|Any CPU.Build.0 = Debug|x86
36 {2D4FF07B-26F8-4BEF-B41C-E4383F86DC32}.Debug|x64.ActiveCfg = Debug|x86
37 {2D4FF07B-26F8-4BEF-B41C-E4383F86DC32}.Debug|x86.ActiveCfg = Debug|x86
38 {2D4FF07B-26F8-4BEF-B41C-E4383F86DC32}.Debug|x86.Build.0 = Debug|x86
39 {2D4FF07B-26F8-4BEF-B41C-E4383F86DC32}.Release|Any CPU.ActiveCfg = Release|x86
40 {2D4FF07B-26F8-4BEF-B41C-E4383F86DC32}.Release|Any CPU.Build.0 = Release|x86
41 {2D4FF07B-26F8-4BEF-B41C-E4383F86DC32}.Release|x64.ActiveCfg = Release|x86
42 {2D4FF07B-26F8-4BEF-B41C-E4383F86DC32}.Release|x86.ActiveCfg = Release|x86
43 {2D4FF07B-26F8-4BEF-B41C-E4383F86DC32}.Release|x86.Build.0 = Release|x86
44 {33F6ABF5-FA13-4B73-99FA-F9BBA894DD9A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
45 {33F6ABF5-FA13-4B73-99FA-F9BBA894DD9A}.Debug|Any CPU.Build.0 = Debug|Any CPU
46 {33F6ABF5-FA13-4B73-99FA-F9BBA894DD9A}.Debug|x64.ActiveCfg = Debug|Any CPU
47 {33F6ABF5-FA13-4B73-99FA-F9BBA894DD9A}.Debug|x64.Build.0 = Debug|Any CPU
48 {33F6ABF5-FA13-4B73-99FA-F9BBA894DD9A}.Debug|x86.ActiveCfg = Debug|Any CPU
49 {33F6ABF5-FA13-4B73-99FA-F9BBA894DD9A}.Debug|x86.Build.0 = Debug|Any CPU
50 {33F6ABF5-FA13-4B73-99FA-F9BBA894DD9A}.Release|Any CPU.ActiveCfg = Release|Any CPU
51 {33F6ABF5-FA13-4B73-99FA-F9BBA894DD9A}.Release|Any CPU.Build.0 = Release|Any CPU
52 {33F6ABF5-FA13-4B73-99FA-F9BBA894DD9A}.Release|x64.ActiveCfg = Release|Any CPU
53 {33F6ABF5-FA13-4B73-99FA-F9BBA894DD9A}.Release|x64.Build.0 = Release|Any CPU
54 {33F6ABF5-FA13-4B73-99FA-F9BBA894DD9A}.Release|x86.ActiveCfg = Release|Any CPU
55 {33F6ABF5-FA13-4B73-99FA-F9BBA894DD9A}.Release|x86.Build.0 = Release|Any CPU
56 {A37CC793-F659-4C77-A01C-D183023B6880}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
57 {A37CC793-F659-4C77-A01C-D183023B6880}.Debug|Any CPU.Build.0 = Debug|Any CPU
58 {A37CC793-F659-4C77-A01C-D183023B6880}.Debug|x64.ActiveCfg = Debug|Any CPU
59 {A37CC793-F659-4C77-A01C-D183023B6880}.Debug|x64.Build.0 = Debug|Any CPU
60 {A37CC793-F659-4C77-A01C-D183023B6880}.Debug|x86.ActiveCfg = Debug|Any CPU
61 {A37CC793-F659-4C77-A01C-D183023B6880}.Debug|x86.Build.0 = Debug|Any CPU
62 {A37CC793-F659-4C77-A01C-D183023B6880}.Release|Any CPU.ActiveCfg = Release|Any CPU
63 {A37CC793-F659-4C77-A01C-D183023B6880}.Release|Any CPU.Build.0 = Release|Any CPU
64 {A37CC793-F659-4C77-A01C-D183023B6880}.Release|x64.ActiveCfg = Release|Any CPU
65 {A37CC793-F659-4C77-A01C-D183023B6880}.Release|x64.Build.0 = Release|Any CPU
66 {A37CC793-F659-4C77-A01C-D183023B6880}.Release|x86.ActiveCfg = Release|Any CPU
67 {A37CC793-F659-4C77-A01C-D183023B6880}.Release|x86.Build.0 = Release|Any CPU
68 EndGlobalSection
69 GlobalSection(SolutionProperties) = preSolution
70 HideSolutionNode = FALSE
71 EndGlobalSection
72 GlobalSection(ExtensibilityGlobals) = postSolution
73 SolutionGuid = {1EB72678-984C-4F8F-9C3C-8D0FA2450E86}
74 EndGlobalSection
75EndGlobal
diff --git a/src/ext/UI/appveyor.cmd b/src/ext/UI/appveyor.cmd
new file mode 100644
index 00000000..2c727278
--- /dev/null
+++ b/src/ext/UI/appveyor.cmd
@@ -0,0 +1,14 @@
1@setlocal
2@pushd %~dp0
3
4nuget restore || exit /b
5
6msbuild -p:Configuration=Release -t:Restore || exit /b
7
8msbuild -p:Configuration=Release src\test\WixToolsetTest.UI\WixToolsetTest.UI.csproj || exit /b
9dotnet test -c Release --no-build src\test\WixToolsetTest.UI || exit /b
10
11msbuild -p:Configuration=Release -t:Pack src\wixext\WixToolset.UI.wixext.csproj || exit /b
12
13@popd
14@endlocal \ No newline at end of file
diff --git a/src/ext/UI/appveyor.yml b/src/ext/UI/appveyor.yml
new file mode 100644
index 00000000..7c686b04
--- /dev/null
+++ b/src/ext/UI/appveyor.yml
@@ -0,0 +1,40 @@
1# Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2#
3# Do NOT modify this file. Update the canonical version in Home\repo-template\src\appveyor.yml
4# then update all of the repos.
5
6branches:
7 only:
8 - master
9 - develop
10
11image: Visual Studio 2019
12
13version: 0.0.0.{build}
14configuration: Release
15
16environment:
17 DOTNET_SKIP_FIRST_TIME_EXPERIENCE: true
18 DOTNET_CLI_TELEMETRY_OPTOUT: 1
19 NUGET_XMLDOC_MODE: skip
20
21build_script:
22 - appveyor.cmd
23
24pull_requests:
25 do_not_increment_build_number: true
26
27nuget:
28 disable_publish_on_pr: true
29
30skip_branch_with_pr: true
31skip_tags: true
32
33artifacts:
34- path: build\Release\**\*.nupkg
35 name: nuget
36
37notifications:
38- provider: Slack
39 incoming_webhook:
40 secure: p5xuu+4x2JHfwGDMDe5KcG1k7gZxqYc4jWVwvyNZv5cvkubPD2waJs5yXMAXZNN7Z63/3PWHb7q4KoY/99AjauYa1nZ4c5qYqRPFRBKTHfA=
diff --git a/src/ext/UI/ca/CustomMsiErrors.h b/src/ext/UI/ca/CustomMsiErrors.h
new file mode 100644
index 00000000..b568d01c
--- /dev/null
+++ b/src/ext/UI/ca/CustomMsiErrors.h
@@ -0,0 +1,10 @@
1#pragma once
2// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
3
4#define msierrSQLFailedCreateDatabase 26201
5#define msierrSQLFailedDropDatabase 26202
6#define msierrSQLFailedConnectDatabase 26203
7#define msierrSQLFailedExecString 26204
8#define msierrSQLDatabaseAlreadyExists 26205
9
10//Last available is 26250 \ No newline at end of file
diff --git a/src/ext/UI/ca/DriveCheck.cpp b/src/ext/UI/ca/DriveCheck.cpp
new file mode 100644
index 00000000..fafd73c2
--- /dev/null
+++ b/src/ext/UI/ca/DriveCheck.cpp
@@ -0,0 +1,126 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3#include "precomp.h"
4
5static HRESULT PathIsRemote(__in LPCWSTR pTargetFolder, __inout BOOL* fPathRemote);
6static HRESULT PathIsRemovable(__in LPCWSTR pTargetFolder, __inout BOOL* fPathRemovable);
7
8/********************************************************************
9 ValidatePath - Custom Action entry point
10
11********************************************************************/
12UINT __stdcall ValidatePath(MSIHANDLE hInstall)
13{
14 HRESULT hr = S_OK;
15
16 LPWSTR pwszWixUIDir = NULL;
17 LPWSTR pwszInstallPath = NULL;
18 BOOL fInstallPathIsRemote = TRUE;
19 BOOL fInstallPathIsRemoveable = TRUE;
20
21 hr = WcaInitialize(hInstall, "ValidatePath");
22 ExitOnFailure(hr, "failed to initialize");
23
24 hr = WcaGetProperty(L"WIXUI_INSTALLDIR", &pwszWixUIDir);
25 ExitOnFailure(hr, "failed to get WixUI Installation Directory");
26
27 hr = WcaGetProperty(pwszWixUIDir, &pwszInstallPath);
28 ExitOnFailure(hr, "failed to get Installation Directory");
29
30 hr = PathIsRemote(pwszInstallPath, &fInstallPathIsRemote);
31 if (FAILED(hr))
32 {
33 TraceError(hr, "Unable to determine if path is remote");
34 //reset HR, as we need to continue and find out if is a UNC path
35 hr = S_OK;
36 }
37
38 hr = PathIsRemovable(pwszInstallPath, &fInstallPathIsRemoveable);
39 if (FAILED(hr))
40 {
41 TraceError(hr, "Unable to determine if path is removable");
42 //reset HR, as we need to continue and find out if is a UNC path
43 hr = S_OK;
44 }
45
46 // If the path does not point to a network drive, mapped drive, or removable drive,
47 // then set WIXUI_INSTALLDIR_VALID to "1" otherwise set it to 0
48 BOOL fInstallPathIsUnc = PathIsUNCW(pwszInstallPath);
49 if (!fInstallPathIsUnc && !fInstallPathIsRemote && !fInstallPathIsRemoveable)
50 {
51 // path is valid
52 hr = WcaSetProperty(L"WIXUI_INSTALLDIR_VALID", L"1");
53 ExitOnFailure(hr, "failed to set WIXUI_INSTALLDIR_VALID");
54 }
55 else
56 {
57 // path is invalid; we can't log it because we're being called from a DoAction control event
58 // but we can at least call WcaLog to get it to write to the debugger from a debug build
59 WcaLog(LOGMSG_STANDARD, "Installation path %ls is invalid: it is %s UNC path, %s remote path, or %s path on a removable drive, and must be none of these.",
60 pwszInstallPath, fInstallPathIsUnc ? "a" : "not a", fInstallPathIsRemote ? "a" : "not a", fInstallPathIsRemoveable ? "a" : "not a");
61 hr = WcaSetProperty(L"WIXUI_INSTALLDIR_VALID", L"0");
62 ExitOnFailure(hr, "failed to set WIXUI_INSTALLDIR_VALID");
63 }
64
65LExit:
66 ReleaseStr(pwszInstallPath);
67 ReleaseStr(pwszWixUIDir);
68
69 return WcaFinalize(SUCCEEDED(hr) ? ERROR_SUCCESS : ERROR_INSTALL_FAILURE);
70}
71
72/********************************************************************
73 PathIsRemote - helper function for ValidatePath
74
75********************************************************************/
76static HRESULT PathIsRemote(__in LPCWSTR pTargetFolder, __inout BOOL* fPathRemote)
77{
78 HRESULT hr = S_OK;
79 LPWSTR pStrippedTargetFolder = NULL;
80
81 hr = StrAllocString(&pStrippedTargetFolder, pTargetFolder, 0);
82
83 // Terminate the path at the root
84 if(!::PathStripToRootW(pStrippedTargetFolder))
85 {
86 hr = HRESULT_FROM_WIN32(ERROR_INVALID_DRIVE);
87 ExitOnFailure(hr, "failed to parse target folder");
88 }
89
90 UINT uResult = GetDriveTypeW(pStrippedTargetFolder);
91
92 *fPathRemote = (DRIVE_REMOTE == uResult) ;
93
94LExit:
95 ReleaseStr(pStrippedTargetFolder);
96
97 return hr;
98}
99
100/********************************************************************
101 PathIsRemovable - helper function for ValidatePath
102
103********************************************************************/
104static HRESULT PathIsRemovable(__in LPCWSTR pTargetFolder, __inout BOOL* fPathRemovable)
105{
106 HRESULT hr = S_OK;
107 LPWSTR pStrippedTargetFolder = NULL;
108
109 hr = StrAllocString(&pStrippedTargetFolder, pTargetFolder, 0);
110
111 // Terminate the path at the root
112 if(!::PathStripToRootW(pStrippedTargetFolder))
113 {
114 hr = HRESULT_FROM_WIN32(ERROR_INVALID_DRIVE);
115 ExitOnFailure(hr, "failed to parse target folder");
116 }
117
118 UINT uResult = GetDriveTypeW(pStrippedTargetFolder);
119
120 *fPathRemovable = ((DRIVE_CDROM == uResult) || (DRIVE_REMOVABLE == uResult) || (DRIVE_RAMDISK == uResult) || (DRIVE_UNKNOWN == uResult));
121
122LExit:
123 ReleaseStr(pStrippedTargetFolder);
124
125 return hr;
126}
diff --git a/src/ext/UI/ca/PrintEula.cpp b/src/ext/UI/ca/PrintEula.cpp
new file mode 100644
index 00000000..b19de9a6
--- /dev/null
+++ b/src/ext/UI/ca/PrintEula.cpp
@@ -0,0 +1,556 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3#include "precomp.h"
4
5// Constants
6LPCWSTR vcsEulaQuery = L"SELECT `Text` FROM `Control` WHERE `Control`='LicenseText'";
7
8
9enum eEulaQuery { eqText = 1};
10const int IDM_POPULATE = 100;
11const int IDM_PRINT = 101;
12const int CONTROL_X_COORDINATE = 0;
13const int CONTROL_Y_COORDINATE = 0;
14const int CONTROL_WIDTH = 500;
15const int CONTROL_HEIGHT = 500;
16const int ONE_INCH = 1440; // 1440 TWIPS = 1 inch.
17const int TEXT_RECORD_POS = 1;
18const int STRING_CAPACITY = 512;
19const int NO_OF_COPIES = 1;
20const LPWSTR WINDOW_CLASS = L"PrintEulaRichText";
21
22//Forward declarations of functions, check the function definitions for the comments
23static LRESULT CALLBACK WndProc(__in HWND hWnd, __in UINT message, __in WPARAM wParam, __in LPARAM lParam);
24static HRESULT ReadEulaText(__in MSIHANDLE hInstall, __out LPSTR* ppszEulaText);
25static DWORD CALLBACK ReadStreamCallback(__in DWORD Cookie, __out LPBYTE pbBuff, __in LONG cb, __out LONG FAR *pcb);
26static HRESULT CreateRichTextWindow(__out HWND* phWndMain, __out BOOL* pfRegisteredClass);
27static HRESULT PrintRichText(__in HWND hWndMain);
28static void Print(__in_opt HWND hWnd);
29static void LoadEulaText(__in_opt HWND hWnd);
30static void ShowErrorMessage(__in HRESULT hr);
31
32//Global variables
33PRINTDLGEXW* vpPrintDlg = NULL; //Parameters for print (needed on both sides of WndProc callbacks)
34LPSTR vpszEulaText = NULL;
35LPCWSTR vwzRichEditClass = NULL;
36HRESULT vhr = S_OK; //Global hr, used by the functions called from WndProc to set errorcode
37
38
39/********************************************************************
40 PrintEula - Custom Action entry point
41
42********************************************************************/
43extern "C" UINT __stdcall PrintEula(MSIHANDLE hInstall)
44{
45 //AssertSz(FALSE, "Debug PrintEula");
46
47 HRESULT hr = S_OK;
48 HWND hWndMain = NULL;
49 HMODULE hRichEdit = NULL;
50 BOOL fRegisteredClass = FALSE;
51
52 hr = WcaInitialize(hInstall, "PrintEula");
53 ExitOnFailure(hr, "failed to initialize");
54
55 // Initialize then display print dialog.
56 vpPrintDlg = (PRINTDLGEXW*)GlobalAlloc(GPTR, sizeof(PRINTDLGEXW)); // MSDN says to allocate on heap.
57 ExitOnNullWithLastError(vpPrintDlg, hr, "Failed to allocate memory for print dialog struct.");
58
59 vpPrintDlg->lStructSize = sizeof(PRINTDLGEX);
60 vpPrintDlg->hwndOwner = ::FindWindowW(L"MsiDialogCloseClass", NULL);
61 vpPrintDlg->Flags = PD_RETURNDC | PD_COLLATE | PD_NOCURRENTPAGE | PD_ALLPAGES | PD_NOPAGENUMS | PD_NOSELECTION;
62 vpPrintDlg->nCopies = NO_OF_COPIES;
63 vpPrintDlg->nStartPage = START_PAGE_GENERAL;
64
65 hr = ::PrintDlgExW(vpPrintDlg);
66 ExitOnFailure(hr, "Failed to show print dialog");
67
68 // If user said they want to print.
69 if (PD_RESULT_PRINT == vpPrintDlg->dwResultAction)
70 {
71 // Get the stream for Eula
72 hr = ReadEulaText(hInstall, &vpszEulaText);
73 ExitOnFailure(hr, "failed to read Eula text from MSI database");
74
75 // Have to load Rich Edit since we'll be creating a Rich Edit control in the window
76 hr = LoadSystemLibrary(L"Msftedit.dll", &hRichEdit);
77 if (SUCCEEDED(hr))
78 {
79 vwzRichEditClass = MSFTEDIT_CLASS;
80 }
81 else
82 {
83 hr = LoadSystemLibrary(L"Riched20.dll", &hRichEdit);
84 ExitOnFailure(hr, "failed to load rich edit 2.0 library");
85
86 vwzRichEditClass = RICHEDIT_CLASSW;
87 }
88
89 hr = CreateRichTextWindow(&hWndMain, &fRegisteredClass);
90 ExitOnFailure(hr, "failed to create rich text window for printing");
91
92 hr = PrintRichText(hWndMain);
93 if (FAILED(hr)) // Since we've already shown the print dialog, we better show them a dialog explaining why it didn't print
94 {
95 ShowErrorMessage(hr);
96 }
97 }
98
99LExit:
100 ReleaseNullStr(vpszEulaText);
101 if (vpPrintDlg)
102 {
103 if (vpPrintDlg->hDevMode)
104 {
105 ::GlobalFree(vpPrintDlg->hDevMode);
106 }
107
108 if (vpPrintDlg->hDevNames)
109 {
110 ::GlobalFree(vpPrintDlg->hDevNames);
111 }
112
113 if (vpPrintDlg->hDC)
114 {
115 ::DeleteDC(vpPrintDlg->hDC);
116 }
117
118 ::GlobalFree(vpPrintDlg);
119 vpPrintDlg = NULL;
120 }
121
122 if (fRegisteredClass)
123 {
124 ::UnregisterClassW(WINDOW_CLASS, NULL);
125 }
126
127 vwzRichEditClass = NULL;
128 if (NULL != hRichEdit)
129 {
130 ::FreeLibrary(hRichEdit);
131 }
132
133 // Always return success since we dont want to stop the
134 // installation even if the Eula printing fails.
135 return WcaFinalize(ERROR_SUCCESS);
136}
137
138
139
140/********************************************************************
141CreateRichTextWindow - Creates Window and Child RichText control.
142
143********************************************************************/
144HRESULT CreateRichTextWindow(
145 __out HWND* phWndMain,
146 __out BOOL* pfRegisteredClass
147 )
148{
149 HRESULT hr = S_OK;
150 HWND hWndMain = NULL;
151 WNDCLASSEXW wcex;
152
153 //
154 // Register the window class
155 //
156 wcex.cbSize = sizeof(WNDCLASSEXW);
157 wcex.style = CS_HREDRAW | CS_VREDRAW;
158 wcex.lpfnWndProc = (WNDPROC)WndProc;
159 wcex.cbClsExtra = 0;
160 wcex.cbWndExtra = 0;
161 wcex.hInstance = NULL;
162 wcex.hIcon = NULL;
163 wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
164 wcex.hbrBackground = (HBRUSH)(COLOR_BACKGROUND+1);
165 wcex.lpszMenuName = NULL;
166 wcex.lpszClassName = WINDOW_CLASS;
167 wcex.hIconSm = NULL;
168
169 if (0 == ::RegisterClassExW(&wcex))
170 {
171 DWORD dwResult = ::GetLastError();
172
173 // If we get "Class already exists" error ignore it. We might
174 // encounter this when the user tries to print more than once
175 // in the same setup instance and we are unable to clean up fully.
176 if (dwResult != ERROR_CLASS_ALREADY_EXISTS)
177 {
178 ExitOnFailure(hr = HRESULT_FROM_WIN32(dwResult), "failed to register window class");
179 }
180 }
181
182 *pfRegisteredClass = TRUE;
183
184 // Perform application initialization:
185 hWndMain = ::CreateWindowW(WINDOW_CLASS, NULL, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, NULL, NULL);
186 ExitOnNullWithLastError(hWndMain, hr, "failed to create window for printing");
187
188 ::ShowWindow(hWndMain, SW_HIDE);
189 if (!::UpdateWindow(hWndMain))
190 {
191 ExitWithLastError(hr, "failed to update window");
192 }
193
194 *phWndMain = hWndMain;
195
196LExit:
197 return hr;
198}
199
200
201/********************************************************************
202 PrintRichText - Sends messages to load the Eula text, print it, and
203 close the window.
204
205 NOTE: Returns errors that have occured while attempting to print,
206 which were saved in vhr by the print callbacks.
207********************************************************************/
208HRESULT PrintRichText(
209 __in HWND hWndMain
210 )
211{
212 MSG msg;
213
214 // Populate the RichEdit control
215 ::SendMessageW(hWndMain, WM_COMMAND, IDM_POPULATE, 0);
216
217 // Print Eula
218 ::SendMessageW(hWndMain, WM_COMMAND, IDM_PRINT, 0);
219
220 // Done! Lets close the Window
221 ::SendMessage(hWndMain, WM_CLOSE, 0, 0);
222 // Main message loop:
223 while (::GetMessageW(&msg, NULL, 0, 0))
224 {
225// if (!::TranslateAcceleratorW(msg.hwnd, NULL, &msg))
226// {
227// ::TranslateMessage(&msg);
228// ::DispatchMessageW(&msg);
229// }
230 }
231
232
233 // return any errors encountered in the print callbacks
234 return vhr;
235}
236
237
238/********************************************************************
239 WndProc - Windows callback procedure
240
241********************************************************************/
242LRESULT CALLBACK WndProc(
243 __in HWND hWnd,
244 __in UINT message,
245 __in WPARAM wParam,
246 __in LPARAM lParam
247 )
248{
249 static HWND hWndRichEdit = NULL;
250 int wmId, wmEvent;
251 PAINTSTRUCT ps;
252 HDC hdc;
253
254 switch (message)
255 {
256 case WM_CREATE:
257 hWndRichEdit = ::CreateWindowExW(WS_EX_CLIENTEDGE, vwzRichEditClass, L"", ES_MULTILINE | WS_CHILD | WS_VISIBLE | WS_VSCROLL, CONTROL_X_COORDINATE, CONTROL_Y_COORDINATE, CONTROL_WIDTH, CONTROL_HEIGHT, hWnd, NULL, NULL, NULL);
258 break;
259 case WM_COMMAND:
260 wmId = LOWORD(wParam);
261 wmEvent = HIWORD(wParam);
262 switch (wmId)
263 {
264 case IDM_POPULATE:
265 LoadEulaText(hWndRichEdit);
266 break;
267 case IDM_PRINT:
268 Print(hWndRichEdit);
269 break;
270 default:
271 return ::DefWindowProcW(hWnd, message, wParam, lParam);
272 break;
273 }
274 break;
275 case WM_PAINT:
276 hdc = ::BeginPaint(hWnd, &ps);
277 ::EndPaint(hWnd, &ps);
278 break;
279 case WM_DESTROY:
280 ::PostQuitMessage(0);
281 break;
282 default:
283 return ::DefWindowProcW(hWnd, message, wParam, lParam);
284 }
285
286 return 0;
287}
288
289
290/********************************************************************
291 ReadStreamCallback - Callback function to read data to the RichText control
292
293 NOTE: Richtext control uses this function to read data from the buffer
294********************************************************************/
295DWORD CALLBACK ReadStreamCallback(
296 __in DWORD /*Cookie*/,
297 __out LPBYTE pbBuff,
298 __in LONG cb,
299 __out LONG FAR *pcb
300 )
301{
302 static LPCSTR pszTextBuf = NULL;
303 DWORD er = ERROR_SUCCESS;
304
305 // If it's null set it to the beginning of the EULA buffer
306 if (pszTextBuf == NULL)
307 {
308 pszTextBuf = vpszEulaText;
309 }
310
311 LONG lTextLength = (LONG)lstrlen(pszTextBuf);
312
313 if (cb < 0)
314 {
315 *pcb = 0;
316 er = 1;
317 }
318 else if (lTextLength < cb ) // If the size to be written is less than then length of the buffer, write the rest
319 {
320 *pcb = lTextLength;
321 memcpy(pbBuff, pszTextBuf, *pcb);
322 pszTextBuf = NULL;
323 }
324 else // Only write the amount being asked for and move the pointer along
325 {
326 *pcb = cb;
327 memcpy(pbBuff, pszTextBuf, *pcb);
328 pszTextBuf = pszTextBuf + cb;
329 }
330
331 return er;
332}
333
334
335/********************************************************************
336 LoadEulaText - Reads data for Richedit control
337
338********************************************************************/
339void LoadEulaText(
340 __in HWND hWnd
341 )
342{
343 HRESULT hr = S_OK;
344
345 ExitOnNull(hWnd, hr, ERROR_INVALID_HANDLE, "Invalid Handle passed to LoadEulaText");
346
347 // Docs say this doesn't return any value
348 ::SendMessageW(hWnd, EM_LIMITTEXT, static_cast<WPARAM>(lstrlen(vpszEulaText)), 0);
349
350 EDITSTREAM es;
351 ::ZeroMemory(&es, sizeof(es));
352 es.pfnCallback = (EDITSTREAMCALLBACK)ReadStreamCallback;
353 es.dwCookie = (DWORD)0;
354 ::SendMessageW(hWnd, EM_STREAMIN, SF_RTF, (LPARAM)&es);
355
356 if (0 != es.dwError)
357 {
358 ExitOnLastError(hr, "failed to load the EULA into the control");
359 }
360
361LExit:
362 vhr = hr;
363}
364
365
366/********************************************************************
367 ReadEulaText - Reads Eula text from the MSI
368
369********************************************************************/
370HRESULT ReadEulaText(
371 __in MSIHANDLE /*hInstall*/,
372 __out LPSTR* ppszEulaText
373 )
374{
375 HRESULT hr = S_OK;
376 PMSIHANDLE hDB;
377 PMSIHANDLE hView;
378 PMSIHANDLE hRec;
379 LPWSTR pwzEula = NULL;
380
381 hr = WcaOpenExecuteView(vcsEulaQuery, &hView);
382 ExitOnFailure(hr, "failed to open and execute view for PrintEula query");
383
384 hr = WcaFetchSingleRecord(hView, &hRec);
385 ExitOnFailure(hr, "failed to fetch the row containing the LicenseText");
386
387 hr = WcaGetRecordString(hRec, 1, &pwzEula);
388 ExitOnFailure(hr, "failed to get LicenseText in PrintEula");
389
390 hr = StrAnsiAllocString(ppszEulaText, pwzEula, 0, CP_ACP);
391 ExitOnFailure(hr, "failed to convert LicenseText to ANSI code page");
392
393LExit:
394 return hr;
395}
396
397
398/********************************************************************
399 Print - Function that sends the data from richedit control to the printer
400
401 NOTE: Any errors encountered are saved to the vhr variable
402********************************************************************/
403void Print(
404 __in_opt HWND hRtfWnd
405 )
406{
407 HRESULT hr = S_OK;
408 FORMATRANGE fRange;
409 RECT rcPage;
410 RECT rcPrintablePage;
411 GETTEXTLENGTHEX gTxex;
412 HDC hPrinterDC = vpPrintDlg->hDC;
413 int nHorizRes = ::GetDeviceCaps(hPrinterDC, HORZRES);
414 int nVertRes = ::GetDeviceCaps(hPrinterDC, VERTRES);
415 int nLogPixelsX = ::GetDeviceCaps(hPrinterDC, LOGPIXELSX);
416 //int nLogPixelsY = ::GetDeviceCaps(hPrinterDC, LOGPIXELSY);
417 LONG_PTR lTextLength = 0; // Length of document.
418 LONG_PTR lTextPrinted = 0; // Amount of document printed.
419 DOCINFOW dInfo;
420 LPDEVNAMES pDevnames;
421 LPWSTR sczProductName = NULL;
422 BOOL fStartedDoc = FALSE;
423 BOOL fPrintedSomething = FALSE;
424
425 // Ensure the printer DC is in MM_TEXT mode.
426 if (0 == ::SetMapMode(hPrinterDC, MM_TEXT))
427 {
428 ExitWithLastError(hr, "failed to set map mode");
429 }
430
431 // Rendering to the same DC we are measuring.
432 ::ZeroMemory(&fRange, sizeof(fRange));
433 fRange.hdc = fRange.hdcTarget = hPrinterDC;
434
435 // Set up the page.
436 rcPage.left = rcPage.top = 0;
437 rcPage.right = MulDiv(nHorizRes, ONE_INCH, nLogPixelsX);
438 rcPage.bottom = MulDiv(nVertRes, ONE_INCH, nLogPixelsX);
439
440 // Set up 1" margins all around.
441 rcPrintablePage.left = rcPage.left + ONE_INCH;
442 rcPrintablePage.top = rcPage.top + ONE_INCH;
443 rcPrintablePage.right = rcPage.right - ONE_INCH;
444 rcPrintablePage.bottom = rcPage.bottom - ONE_INCH;
445
446 // Set up the print job (standard printing stuff here).
447 ::ZeroMemory(&dInfo, sizeof(dInfo));
448 dInfo.cbSize = sizeof(DOCINFO);
449 hr = WcaGetProperty(L"ProductName", &sczProductName);
450 if (FAILED(hr))
451 {
452 // If we fail to get the product name, don't fail, just leave it blank;
453 dInfo.lpszDocName = L"";
454 hr = S_OK;
455 }
456 else
457 {
458 dInfo.lpszDocName = sczProductName;
459 }
460
461 pDevnames = (LPDEVNAMES)::GlobalLock(vpPrintDlg->hDevNames);
462 ExitOnNullWithLastError(pDevnames, hr, "failed to get global lock");
463
464 dInfo.lpszOutput = (LPWSTR)pDevnames + pDevnames->wOutputOffset;
465
466 if (0 == ::GlobalUnlock(pDevnames))
467 {
468 ExitWithLastError(hr, "failed to release global lock");
469 }
470
471 // Start the document.
472 if (0 >= ::StartDocW(hPrinterDC, &dInfo))
473 {
474 ExitWithLastError(hr, "failed to start print document");
475 }
476
477 fStartedDoc = TRUE;
478
479 ::ZeroMemory(&gTxex, sizeof(gTxex));
480 gTxex.flags = GTL_NUMCHARS | GTL_PRECISE;
481 lTextLength = ::SendMessageW(hRtfWnd, EM_GETTEXTLENGTHEX, (LONG_PTR)&gTxex, 0);
482
483 while (lTextPrinted < lTextLength)
484 {
485 // Start the page.
486 if (0 >= ::StartPage(hPrinterDC))
487 {
488 ExitWithLastError(hr, "failed to start print page");
489 }
490
491 // Always reset to the full printable page and start where the
492 // last text left off (or zero at the beginning).
493 fRange.rc = rcPrintablePage;
494 fRange.rcPage = rcPage;
495 fRange.chrg.cpMin = (LONG)lTextPrinted;
496 fRange.chrg.cpMax = -1;
497
498 // Print as much text as can fit on a page. The return value is
499 // the index of the first character on the next page. Using TRUE
500 // for the wParam parameter causes the text to be printed.
501 lTextPrinted = ::SendMessageW(hRtfWnd, EM_FORMATRANGE, TRUE, (LPARAM)&fRange);
502 fPrintedSomething = TRUE;
503
504 // If text wasn't printed (i.e. we didn't move past the point we started) then
505 // something must have gone wrong.
506 if (lTextPrinted <= fRange.chrg.cpMin)
507 {
508 hr = E_FAIL;
509 ExitOnFailure(hr, "failed to print some text");
510 }
511
512 // Print last page.
513 if (0 >= ::EndPage(hPrinterDC))
514 {
515 ExitWithLastError(hr, "failed to end print page");
516 }
517 }
518
519LExit:
520 // Tell the control to release cached information, if we actually tried to
521 // print something.
522 if (fPrintedSomething)
523 {
524 ::SendMessageW(hRtfWnd, EM_FORMATRANGE, 0, (LPARAM)NULL);
525 }
526
527 if (fStartedDoc)
528 {
529 ::EndDoc(hPrinterDC);
530 }
531
532 ReleaseStr(sczProductName);
533
534 vhr = hr;
535}
536
537
538/********************************************************************
539 ShowErrorMessage - Display MessageBox showing the message for hr.
540
541********************************************************************/
542void ShowErrorMessage(
543 __in HRESULT hr
544 )
545{
546 WCHAR wzMsg[STRING_CAPACITY];
547
548#pragma prefast(push)
549#pragma prefast(disable:25028)
550 if (0 != ::FormatMessageW(FORMAT_MESSAGE_FROM_SYSTEM, 0, hr, 0, wzMsg, countof(wzMsg), 0))
551#pragma prefast(pop)
552 {
553 HWND hWnd = ::GetForegroundWindow();
554 ::MessageBoxW(hWnd, wzMsg, L"PrintEULA", MB_OK | MB_ICONWARNING);
555 }
556}
diff --git a/src/ext/UI/ca/cost.h b/src/ext/UI/ca/cost.h
new file mode 100644
index 00000000..8b8e8874
--- /dev/null
+++ b/src/ext/UI/ca/cost.h
@@ -0,0 +1,9 @@
1#pragma once
2// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
3
4
5const UINT COST_SECUREOBJECT = 1000;
6const UINT COST_SERVICECONFIG = 1000;
7const UINT COST_XMLFILE = 1000;
8const UINT COST_CLOSEAPP = 500;
9
diff --git a/src/ext/UI/ca/dllmain.cpp b/src/ext/UI/ca/dllmain.cpp
new file mode 100644
index 00000000..df53f872
--- /dev/null
+++ b/src/ext/UI/ca/dllmain.cpp
@@ -0,0 +1,26 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3#include "precomp.h"
4
5/********************************************************************
6DllMain - standard entry point for all WiX CustomActions
7
8********************************************************************/
9extern "C" BOOL WINAPI DllMain(
10 IN HINSTANCE hInst,
11 IN ULONG ulReason,
12 IN LPVOID)
13{
14 switch(ulReason)
15 {
16 case DLL_PROCESS_ATTACH:
17 WcaGlobalInitialize(hInst);
18 break;
19
20 case DLL_PROCESS_DETACH:
21 WcaGlobalFinalize();
22 break;
23 }
24
25 return TRUE;
26}
diff --git a/src/ext/UI/ca/precomp.h b/src/ext/UI/ca/precomp.h
new file mode 100644
index 00000000..e95240c6
--- /dev/null
+++ b/src/ext/UI/ca/precomp.h
@@ -0,0 +1,18 @@
1#pragma once
2// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
3
4
5#include <windows.h>
6#include <msiquery.h>
7#include <richedit.h>
8#include <shlwapi.h>
9
10#include "wcautil.h"
11#include "aclutil.h"
12#include "fileutil.h"
13#include "memutil.h"
14#include "strutil.h"
15#include "xmlutil.h"
16
17#include "CustomMsiErrors.h"
18#include "cost.h"
diff --git a/src/ext/UI/ca/uica.def b/src/ext/UI/ca/uica.def
new file mode 100644
index 00000000..62ce8135
--- /dev/null
+++ b/src/ext/UI/ca/uica.def
@@ -0,0 +1,8 @@
1; Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3
4LIBRARY "uica"
5
6EXPORTS
7 PrintEula
8 ValidatePath
diff --git a/src/ext/UI/ca/uica.v3.ncrunchproject b/src/ext/UI/ca/uica.v3.ncrunchproject
new file mode 100644
index 00000000..319cd523
--- /dev/null
+++ b/src/ext/UI/ca/uica.v3.ncrunchproject
@@ -0,0 +1,5 @@
1<ProjectConfiguration>
2 <Settings>
3 <IgnoreThisComponentCompletely>True</IgnoreThisComponentCompletely>
4 </Settings>
5</ProjectConfiguration> \ No newline at end of file
diff --git a/src/ext/UI/ca/uica.vcxproj b/src/ext/UI/ca/uica.vcxproj
new file mode 100644
index 00000000..5ded1266
--- /dev/null
+++ b/src/ext/UI/ca/uica.vcxproj
@@ -0,0 +1,58 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3
4<Project DefaultTargets="Build" ToolsVersion="16.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
5 <ItemGroup Label="ProjectConfigurations">
6 <ProjectConfiguration Include="Debug|Win32">
7 <Configuration>Debug</Configuration>
8 <Platform>Win32</Platform>
9 </ProjectConfiguration>
10 <ProjectConfiguration Include="Release|Win32">
11 <Configuration>Release</Configuration>
12 <Platform>Win32</Platform>
13 </ProjectConfiguration>
14 </ItemGroup>
15
16 <PropertyGroup Label="Globals">
17 <ProjectGuid>{F72D34CA-48DA-4DFD-91A9-A0C78BEF6981}</ProjectGuid>
18 <ConfigurationType>DynamicLibrary</ConfigurationType>
19 <TargetName>uica</TargetName>
20 <PlatformToolset>v142</PlatformToolset>
21 <CharacterSet>MultiByte</CharacterSet>
22 <ProjectModuleDefinitionFile>uica.def</ProjectModuleDefinitionFile>
23 <Description>WiX Toolset UI CustomAction</Description>
24 </PropertyGroup>
25
26 <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
27 <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
28
29 <PropertyGroup>
30 <ProjectAdditionalLinkLibraries>msi.lib;shlwapi.lib</ProjectAdditionalLinkLibraries>
31 </PropertyGroup>
32
33 <ItemGroup>
34 <ClCompile Include="dllmain.cpp">
35 <PrecompiledHeader>Create</PrecompiledHeader>
36 </ClCompile>
37 <ClCompile Include="DriveCheck.cpp" />
38 <ClCompile Include="PrintEula.cpp" />
39 </ItemGroup>
40
41 <ItemGroup>
42 <ClInclude Include="cost.h" />
43 <ClInclude Include="precomp.h" />
44 </ItemGroup>
45
46 <ItemGroup>
47 <None Include="uica.def" />
48 </ItemGroup>
49
50 <ItemGroup>
51 <PackageReference Include="WixToolset.Dutil" Version="4.0.72" />
52 <PackageReference Include="WixToolset.WcaUtil" Version="4.0.19" />
53 <PackageReference Include="Microsoft.SourceLink.GitHub" Version="1.0.0" />
54 <PackageReference Include="Nerdbank.GitVersioning" Version="3.3.37" />
55 </ItemGroup>
56
57 <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
58</Project>
diff --git a/src/ext/UI/nuget.config b/src/ext/UI/nuget.config
new file mode 100644
index 00000000..db7aba29
--- /dev/null
+++ b/src/ext/UI/nuget.config
@@ -0,0 +1,17 @@
1<?xml version="1.0" encoding="utf-8"?>
2<configuration>
3 <packageSources>
4 <clear />
5 <add key="wixtoolset-burn" value="https://ci.appveyor.com/nuget/wixtoolset-burn" />
6 <add key="wixtoolset-data" value="https://ci.appveyor.com/nuget/wixtoolset-data" />
7 <add key="wixtoolset-extensibility" value="https://ci.appveyor.com/nuget/wixtoolset-extensibility" />
8 <add key="wixtoolset-core" value="https://ci.appveyor.com/nuget/wixtoolset-core" />
9 <add key="wixtoolset-core-native" value="https://ci.appveyor.com/nuget/wixtoolset-core-native" />
10 <add key="wixtoolset-dtf" value="https://ci.appveyor.com/nuget/wixtoolset-dtf" />
11 <add key="wixtoolset-dutil" value="https://ci.appveyor.com/nuget/wixtoolset-dutil" />
12 <add key="wixtoolset-wcautil" value="https://ci.appveyor.com/nuget/wixtoolset-wcautil" />
13 <add key="wixtoolset-tools" value="https://ci.appveyor.com/nuget/wixtoolset-tools" />
14 <add key="wixbuildtools" value="https://ci.appveyor.com/nuget/wixbuildtools" />
15 <add key="api.nuget.org" value="https://api.nuget.org/v3/index.json" protocolVersion="3" />
16 </packageSources>
17</configuration> \ No newline at end of file
diff --git a/src/ext/UI/test/WixToolsetTest.UI/TestData/WixUI_Advanced/Package.wxs b/src/ext/UI/test/WixToolsetTest.UI/TestData/WixUI_Advanced/Package.wxs
new file mode 100644
index 00000000..5ce4b00f
--- /dev/null
+++ b/src/ext/UI/test/WixToolsetTest.UI/TestData/WixUI_Advanced/Package.wxs
@@ -0,0 +1,27 @@
1<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
2 <Package Name="MsiPackage" Language="1033" Version="1.0.0.0" Manufacturer="Example Corporation" UpgradeCode="047730a5-30fe-4a62-a520-da9381b8226a" InstallerVersion="200">
3 <MajorUpgrade DowngradeErrorMessage="A newer version of [ProductName] is already installed." />
4
5 <Feature Id="ProductFeature" Title="MsiPackage">
6 <ComponentGroupRef Id="ProductComponents" />
7 </Feature>
8
9 <ComponentGroup Id="ProductComponents" Directory="INSTALLFOLDER">
10 <Component>
11 <File Source="example.txt" />
12 </Component>
13 </ComponentGroup>
14
15 <UIRef Id="WixUI_Advanced" />
16 <Property Id="ApplicationFolderName" Value="MyProgram" />
17 <Property Id="WixAppFolder" Value="WixPerMachineFolder" />
18 </Package>
19
20 <Fragment>
21 <StandardDirectory Id="ProgramFilesFolder">
22 <Directory Id="INSTALLFOLDER" Name="MsiPackage">
23 <Directory Id="APPLICATIONFOLDER" />
24 </Directory>
25 </StandardDirectory>
26 </Fragment>
27</Wix>
diff --git a/src/ext/UI/test/WixToolsetTest.UI/TestData/WixUI_FeatureTree/Package.wxs b/src/ext/UI/test/WixToolsetTest.UI/TestData/WixUI_FeatureTree/Package.wxs
new file mode 100644
index 00000000..aff1c077
--- /dev/null
+++ b/src/ext/UI/test/WixToolsetTest.UI/TestData/WixUI_FeatureTree/Package.wxs
@@ -0,0 +1,23 @@
1<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
2 <Package Name="MsiPackage" Language="1033" Version="1.0.0.0" Manufacturer="Example Corporation" UpgradeCode="047730a5-30fe-4a62-a520-da9381b8226a" InstallerVersion="200">
3 <MajorUpgrade DowngradeErrorMessage="A newer version of [ProductName] is already installed." />
4
5 <Feature Id="ProductFeature" Title="MsiPackage">
6 <ComponentGroupRef Id="ProductComponents" />
7 </Feature>
8
9 <ComponentGroup Id="ProductComponents" Directory="INSTALLFOLDER">
10 <Component>
11 <File Source="example.txt" />
12 </Component>
13 </ComponentGroup>
14
15 <UIRef Id="WixUI_FeatureTree" />
16 </Package>
17
18 <Fragment>
19 <StandardDirectory Id="ProgramFilesFolder">
20 <Directory Id="INSTALLFOLDER" Name="MsiPackage" />
21 </StandardDirectory>
22 </Fragment>
23</Wix>
diff --git a/src/ext/UI/test/WixToolsetTest.UI/TestData/WixUI_InstallDir/Package.wxs b/src/ext/UI/test/WixToolsetTest.UI/TestData/WixUI_InstallDir/Package.wxs
new file mode 100644
index 00000000..7c2ceae0
--- /dev/null
+++ b/src/ext/UI/test/WixToolsetTest.UI/TestData/WixUI_InstallDir/Package.wxs
@@ -0,0 +1,23 @@
1<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
2 <Package Name="MsiPackage" Language="1033" Version="1.0.0.0" Manufacturer="Example Corporation" UpgradeCode="047730a5-30fe-4a62-a520-da9381b8226a" InstallerVersion="200">
3 <MajorUpgrade DowngradeErrorMessage="A newer version of [ProductName] is already installed." />
4
5 <Feature Id="ProductFeature" Title="MsiPackage">
6 <ComponentGroupRef Id="ProductComponents" />
7 </Feature>
8
9 <ComponentGroup Id="ProductComponents" Directory="INSTALLFOLDER">
10 <Component>
11 <File Source="example.txt" />
12 </Component>
13 </ComponentGroup>
14
15 <UIRef Id="WixUI_InstallDir" />
16 </Package>
17
18 <Fragment>
19 <StandardDirectory Id="ProgramFilesFolder">
20 <Directory Id="INSTALLFOLDER" Name="MsiPackage" />
21 </StandardDirectory>
22 </Fragment>
23</Wix>
diff --git a/src/ext/UI/test/WixToolsetTest.UI/TestData/WixUI_Minimal/Package.wxs b/src/ext/UI/test/WixToolsetTest.UI/TestData/WixUI_Minimal/Package.wxs
new file mode 100644
index 00000000..d2ff256c
--- /dev/null
+++ b/src/ext/UI/test/WixToolsetTest.UI/TestData/WixUI_Minimal/Package.wxs
@@ -0,0 +1,23 @@
1<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
2 <Package Name="MsiPackage" Language="1033" Version="1.0.0.0" Manufacturer="Example Corporation" UpgradeCode="047730a5-30fe-4a62-a520-da9381b8226a" InstallerVersion="200">
3 <MajorUpgrade DowngradeErrorMessage="A newer version of [ProductName] is already installed." />
4
5 <Feature Id="ProductFeature" Title="MsiPackage">
6 <ComponentGroupRef Id="ProductComponents" />
7 </Feature>
8
9 <ComponentGroup Id="ProductComponents" Directory="INSTALLFOLDER">
10 <Component>
11 <File Source="example.txt" />
12 </Component>
13 </ComponentGroup>
14
15 <UIRef Id="WixUI_Minimal" />
16 </Package>
17
18 <Fragment>
19 <StandardDirectory Id="ProgramFilesFolder">
20 <Directory Id="INSTALLFOLDER" Name="MsiPackage" />
21 </StandardDirectory>
22 </Fragment>
23</Wix>
diff --git a/src/ext/UI/test/WixToolsetTest.UI/TestData/WixUI_Mondo/Package.wxs b/src/ext/UI/test/WixToolsetTest.UI/TestData/WixUI_Mondo/Package.wxs
new file mode 100644
index 00000000..8d5a856a
--- /dev/null
+++ b/src/ext/UI/test/WixToolsetTest.UI/TestData/WixUI_Mondo/Package.wxs
@@ -0,0 +1,23 @@
1<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
2 <Package Name="MsiPackage" Language="1033" Version="1.0.0.0" Manufacturer="Example Corporation" UpgradeCode="047730a5-30fe-4a62-a520-da9381b8226a" InstallerVersion="200">
3 <MajorUpgrade DowngradeErrorMessage="A newer version of [ProductName] is already installed." />
4
5 <Feature Id="ProductFeature" Title="MsiPackage">
6 <ComponentGroupRef Id="ProductComponents" />
7 </Feature>
8
9 <ComponentGroup Id="ProductComponents" Directory="INSTALLFOLDER">
10 <Component>
11 <File Source="example.txt" />
12 </Component>
13 </ComponentGroup>
14
15 <UIRef Id="WixUI_Mondo" />
16 </Package>
17
18 <Fragment>
19 <StandardDirectory Id="ProgramFilesFolder">
20 <Directory Id="INSTALLFOLDER" Name="MsiPackage" />
21 </StandardDirectory>
22 </Fragment>
23</Wix>
diff --git a/src/ext/UI/test/WixToolsetTest.UI/TestData/data/example.txt b/src/ext/UI/test/WixToolsetTest.UI/TestData/data/example.txt
new file mode 100644
index 00000000..1b4ffe8a
--- /dev/null
+++ b/src/ext/UI/test/WixToolsetTest.UI/TestData/data/example.txt
@@ -0,0 +1 @@
This is example.txt. \ No newline at end of file
diff --git a/src/ext/UI/test/WixToolsetTest.UI/UIExtensionFixture.cs b/src/ext/UI/test/WixToolsetTest.UI/UIExtensionFixture.cs
new file mode 100644
index 00000000..54c4c788
--- /dev/null
+++ b/src/ext/UI/test/WixToolsetTest.UI/UIExtensionFixture.cs
@@ -0,0 +1,111 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolsetTest.UI
4{
5 using System.Linq;
6 using WixBuildTools.TestSupport;
7 using WixToolset.Core.TestPackage;
8 using WixToolset.UI;
9 using Xunit;
10
11 public class UIExtensionFixture
12 {
13 [Fact]
14 public void CanBuildUsingWixUIAdvanced()
15 {
16 var folder = TestData.Get(@"TestData\WixUI_Advanced");
17 var bindFolder = TestData.Get(@"TestData\data");
18 var build = new Builder(folder, typeof(UIExtensionFactory), new[] { bindFolder });
19
20 var results = build.BuildAndQuery(Build, "Property");
21 Assert.Equal(new[]
22 {
23 "Property:WixUI_Mode\tAdvanced",
24 }, results.Where(s => s.StartsWith("Property:WixUI_Mode")).ToArray());
25 }
26
27 [Fact]
28 public void CanBuildUsingWixUIFeatureTree()
29 {
30 var folder = TestData.Get(@"TestData\WixUI_FeatureTree");
31 var bindFolder = TestData.Get(@"TestData\data");
32 var build = new Builder(folder, typeof(UIExtensionFactory), new[] { bindFolder });
33
34 var results = build.BuildAndQuery(Build, "Property");
35 Assert.Equal(new[]
36 {
37 "Property:WixUI_Mode\tFeatureTree",
38 }, results.Where(s => s.StartsWith("Property:WixUI_Mode")).ToArray());
39 }
40
41 [Fact]
42 public void CanBuildUsingWixUIInstallDir()
43 {
44 var folder = TestData.Get(@"TestData\WixUI_InstallDir");
45 var bindFolder = TestData.Get(@"TestData\data");
46 var build = new Builder(folder, typeof(UIExtensionFactory), new[] { bindFolder });
47
48 var results = build.BuildAndQuery(Build, "Property");
49 Assert.Equal(new[]
50 {
51 "Property:WixUI_Mode\tInstallDir",
52 }, results.Where(s => s.StartsWith("Property:WixUI_Mode")).ToArray());
53 }
54
55 [Fact]
56 public void CanBuildUsingWixUIMinimal()
57 {
58 var folder = TestData.Get(@"TestData\WixUI_Minimal");
59 var bindFolder = TestData.Get(@"TestData\data");
60 var build = new Builder(folder, typeof(UIExtensionFactory), new[] { bindFolder });
61
62 var results = build.BuildAndQuery(Build, "Property");
63 Assert.Equal(new[]
64 {
65 "Property:WixUI_Mode\tMinimal",
66 }, results.Where(s => s.StartsWith("Property:WixUI_Mode")).ToArray());
67 }
68
69 [Fact]
70 public void CanBuildUsingWixUIMondo()
71 {
72 var folder = TestData.Get(@"TestData\WixUI_Mondo");
73 var bindFolder = TestData.Get(@"TestData\data");
74 var build = new Builder(folder, typeof(UIExtensionFactory), new[] { bindFolder });
75
76 var results = build.BuildAndQuery(Build, "Property");
77 Assert.Equal(new[]
78 {
79 "Property:WixUI_Mode\tMondo",
80 }, results.Where(s => s.StartsWith("Property:WixUI_Mode")).ToArray());
81 }
82
83 [Fact]
84 public void CanBuildUsingWixUIMondoLocalized()
85 {
86 var folder = TestData.Get(@"TestData\WixUI_Mondo");
87 var bindFolder = TestData.Get(@"TestData\data");
88 var build = new Builder(folder, typeof(UIExtensionFactory), new[] { bindFolder });
89
90 var results = build.BuildAndQuery(BuildInGerman, "Control");
91 Assert.Equal(new[]
92 {
93 "&Ja",
94 }, results.Where(s => s.StartsWith("Control:ErrorDlg\tY")).Select(s => s.Split('\t')[9]).ToArray());
95 }
96
97 private static void Build(string[] args)
98 {
99 var result = WixRunner.Execute(args)
100 .AssertSuccess();
101 }
102
103 private static void BuildInGerman(string[] args)
104 {
105 var localizedArgs = args.Append("-culture").Append("de-DE").ToArray();
106
107 var result = WixRunner.Execute(localizedArgs)
108 .AssertSuccess();
109 }
110 }
111}
diff --git a/src/ext/UI/test/WixToolsetTest.UI/WixToolsetTest.UI.csproj b/src/ext/UI/test/WixToolsetTest.UI/WixToolsetTest.UI.csproj
new file mode 100644
index 00000000..a61676dd
--- /dev/null
+++ b/src/ext/UI/test/WixToolsetTest.UI/WixToolsetTest.UI.csproj
@@ -0,0 +1,43 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3
4<Project Sdk="Microsoft.NET.Sdk">
5 <PropertyGroup>
6 <TargetFramework>netcoreapp3.1</TargetFramework>
7 <IsPackable>false</IsPackable>
8 </PropertyGroup>
9
10 <PropertyGroup>
11 <NoWarn>NU1701</NoWarn>
12 </PropertyGroup>
13
14 <ItemGroup>
15 <Content Include="TestData\data\example.txt" CopyToOutputDirectory="PreserveNewest" />
16 <Content Include="TestData\WixUI_Advanced\Package.wxs" CopyToOutputDirectory="PreserveNewest" />
17 <Content Include="TestData\WixUI_FeatureTree\Package.wxs" CopyToOutputDirectory="PreserveNewest" />
18 <Content Include="TestData\WixUI_InstallDir\Package.wxs" CopyToOutputDirectory="PreserveNewest" />
19 <Content Include="TestData\WixUI_Minimal\Package.wxs" CopyToOutputDirectory="PreserveNewest" />
20 <Content Include="TestData\WixUI_Mondo\Package.wxs" CopyToOutputDirectory="PreserveNewest" />
21 </ItemGroup>
22
23 <ItemGroup>
24 <ProjectReference Include="..\..\wixext\WixToolset.UI.wixext.csproj" />
25 </ItemGroup>
26
27 <ItemGroup>
28 <PackageReference Include="WixToolset.Core" Version="4.0.*" />
29 <PackageReference Include="WixToolset.Core.Burn" Version="4.0.*" />
30 <PackageReference Include="WixToolset.Core.WindowsInstaller" Version="4.0.*" />
31 <PackageReference Include="WixToolset.Core.TestPackage" Version="4.0.*" />
32 </ItemGroup>
33
34 <ItemGroup>
35 <PackageReference Include="WixBuildTools.TestSupport" Version="4.0.*" />
36 </ItemGroup>
37
38 <ItemGroup>
39 <PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.8.3" />
40 <PackageReference Include="xunit" Version="2.4.1" />
41 <PackageReference Include="xunit.runner.visualstudio" Version="2.4.3" PrivateAssets="All" />
42 </ItemGroup>
43</Project>
diff --git a/src/ext/UI/wix.snk b/src/ext/UI/wix.snk
new file mode 100644
index 00000000..3908a66a
--- /dev/null
+++ b/src/ext/UI/wix.snk
Binary files differ
diff --git a/src/ext/UI/wixext/UIDecompiler.cs b/src/ext/UI/wixext/UIDecompiler.cs
new file mode 100644
index 00000000..2493e7c7
--- /dev/null
+++ b/src/ext/UI/wixext/UIDecompiler.cs
@@ -0,0 +1,59 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Extensions
4{
5#if TODO_CONSIDER_DECOMPILER
6 using System;
7 using System.Collections;
8 using System.Diagnostics;
9 using System.Globalization;
10 using WixToolset.Data;
11 using WixToolset.Extensibility;
12 using Wix = WixToolset.Data.Serialize;
13
14 /// <summary>
15 /// The decompiler for the WiX Toolset UI Extension.
16 /// </summary>
17 public sealed class UIDecompiler : DecompilerExtension
18 {
19 private bool removeLibraryRows;
20
21 /// <summary>
22 /// Get the extensions library to be removed.
23 /// </summary>
24 /// <param name="tableDefinitions">Table definitions for library.</param>
25 /// <returns>Library to remove from decompiled output.</returns>
26 public override Library GetLibraryToRemove(TableDefinitionCollection tableDefinitions)
27 {
28 return removeLibraryRows ? UIExtensionData.GetExtensionLibrary(tableDefinitions) : null;
29 }
30
31 /// <summary>
32 /// Called at the beginning of the decompilation of a database.
33 /// </summary>
34 /// <param name="tables">The collection of all tables.</param>
35 public override void Initialize(TableIndexedCollection tables)
36 {
37 Table propertyTable = tables["Property"];
38
39 if (null != propertyTable)
40 {
41 foreach (Row row in propertyTable.Rows)
42 {
43 if ("WixUI_Mode" == (string)row[0])
44 {
45 Wix.UIRef uiRef = new Wix.UIRef();
46
47 uiRef.Id = String.Concat("WixUI_", (string)row[1]);
48
49 this.Core.RootElement.AddChild(uiRef);
50 this.removeLibraryRows = true;
51
52 break;
53 }
54 }
55 }
56 }
57 }
58#endif
59}
diff --git a/src/ext/UI/wixext/UIExtensionData.cs b/src/ext/UI/wixext/UIExtensionData.cs
new file mode 100644
index 00000000..32557029
--- /dev/null
+++ b/src/ext/UI/wixext/UIExtensionData.cs
@@ -0,0 +1,23 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.UI
4{
5 using WixToolset.Data;
6 using WixToolset.Extensibility;
7
8 public sealed class UIExtensionData : BaseExtensionData
9 {
10 public override string DefaultCulture => "en-US";
11
12 public override bool TryGetSymbolDefinitionByName(string name, out IntermediateSymbolDefinition symbolDefinition)
13 {
14 symbolDefinition = null;
15 return symbolDefinition != null;
16 }
17
18 public override Intermediate GetLibrary(ISymbolDefinitionCreator symbolDefinitions)
19 {
20 return Intermediate.Load(typeof(UIExtensionData).Assembly, "WixToolset.UI.ui.wixlib", symbolDefinitions);
21 }
22 }
23}
diff --git a/src/ext/UI/wixext/UIExtensionFactory.cs b/src/ext/UI/wixext/UIExtensionFactory.cs
new file mode 100644
index 00000000..141aa39f
--- /dev/null
+++ b/src/ext/UI/wixext/UIExtensionFactory.cs
@@ -0,0 +1,16 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.UI
4{
5 using System;
6 using System.Collections.Generic;
7 using WixToolset.Extensibility;
8
9 public class UIExtensionFactory : BaseExtensionFactory
10 {
11 protected override IReadOnlyCollection<Type> ExtensionTypes => new[]
12 {
13 typeof(UIExtensionData),
14 };
15 }
16}
diff --git a/src/ext/UI/wixext/WixToolset.UI.wixext.csproj b/src/ext/UI/wixext/WixToolset.UI.wixext.csproj
new file mode 100644
index 00000000..67c949b2
--- /dev/null
+++ b/src/ext/UI/wixext/WixToolset.UI.wixext.csproj
@@ -0,0 +1,30 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3
4<Project Sdk="Microsoft.NET.Sdk">
5 <PropertyGroup>
6 <TargetFramework>netstandard2.0</TargetFramework>
7 <RootNamespace>WixToolset.UI</RootNamespace>
8 <Description>WiX Toolset UI Extension</Description>
9 <Title>WiX Toolset UI Extension</Title>
10 <DebugType>embedded</DebugType>
11 <IncludeSymbols>true</IncludeSymbols>
12 </PropertyGroup>
13
14 <ItemGroup>
15 <EmbeddedResource Include="$(OutputPath)..\ui.wixlib" />
16 </ItemGroup>
17
18 <ItemGroup>
19 <ProjectReference Include="..\wixlib\ui.wixproj" ReferenceOutputAssembly="false" Condition=" '$(NCrunch)'=='' " />
20 </ItemGroup>
21
22 <ItemGroup>
23 <PackageReference Include="WixToolset.Extensibility" Version="4.0.*" PrivateAssets="all" />
24 </ItemGroup>
25
26 <ItemGroup>
27 <PackageReference Include="Microsoft.SourceLink.GitHub" Version="1.0.0" PrivateAssets="All" />
28 <PackageReference Include="Nerdbank.GitVersioning" Version="3.3.37" PrivateAssets="All" />
29 </ItemGroup>
30</Project>
diff --git a/src/ext/UI/wixext/WixToolset.UI.wixext.nuspec b/src/ext/UI/wixext/WixToolset.UI.wixext.nuspec
new file mode 100644
index 00000000..51c9708e
--- /dev/null
+++ b/src/ext/UI/wixext/WixToolset.UI.wixext.nuspec
@@ -0,0 +1,23 @@
1<?xml version="1.0"?>
2<package xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd">
3 <metadata minClientVersion="4.0">
4 <id>$id$</id>
5 <version>$version$</version>
6 <title>$title$</title>
7 <description>$description$</description>
8 <authors>$authors$</authors>
9 <license type="expression">MS-RL</license>
10 <requireLicenseAcceptance>false</requireLicenseAcceptance>
11 <copyright>$copyright$</copyright>
12 <projectUrl>$projectUrl$</projectUrl>
13 <repository type="$repositorytype$" url="$repositoryurl$" commit="$repositorycommit$" />
14 </metadata>
15
16 <files>
17 <file src="$projectFolder$$id$.targets" target="build" />
18
19 <file src="netstandard2.0\$id$.dll" target="tools" />
20
21 <file src="x86\*.pdb" target="pdbs\x86" />
22 </files>
23</package>
diff --git a/src/ext/UI/wixext/WixToolset.UI.wixext.targets b/src/ext/UI/wixext/WixToolset.UI.wixext.targets
new file mode 100644
index 00000000..b07a0886
--- /dev/null
+++ b/src/ext/UI/wixext/WixToolset.UI.wixext.targets
@@ -0,0 +1,11 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3
4<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0">
5 <PropertyGroup>
6 <WixToolsetUIWixextPath Condition=" '$(WixToolsetUIWixextPath)' == '' ">$(MSBuildThisFileDirectory)..\tools\WixToolset.UI.wixext.dll</WixToolsetUIWixextPath>
7 </PropertyGroup>
8 <ItemGroup>
9 <WixExtension Include="$(WixToolsetUIWixextPath)" />
10 </ItemGroup>
11</Project>
diff --git a/src/ext/UI/wixlib/AdvancedWelcomeEulaDlg.wxs b/src/ext/UI/wixlib/AdvancedWelcomeEulaDlg.wxs
new file mode 100644
index 00000000..96b22f1e
--- /dev/null
+++ b/src/ext/UI/wixlib/AdvancedWelcomeEulaDlg.wxs
@@ -0,0 +1,47 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2
3
4<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
5 <Fragment>
6 <UI>
7 <Dialog Id="AdvancedWelcomeEulaDlg" Width="370" Height="270" Title="!(loc.AdvancedWelcomeEulaDlg_Title)">
8 <Control Id="BannerBitmap" Type="Bitmap" X="0" Y="0" Width="370" Height="44" TabSkip="no" Text="!(loc.AdvancedWelcomeEulaDlgBannerBitmap)" />
9 <Control Id="BottomLine" Type="Line" X="0" Y="234" Width="370" Height="0" />
10 <Control Id="Title" Type="Text" X="20" Y="10" Width="300" Height="24" Transparent="yes" NoPrefix="yes" Text="!(loc.AdvancedWelcomeEulaDlgTitle)" />
11 <Control Id="DescriptionPerMachine" Type="Text" X="20" Y="202" Width="330" Height="31" Transparent="yes" NoPrefix="yes" Hidden="yes" Text="!(loc.AdvancedWelcomeEulaDlgDescriptionPerMachine)" ShowCondition="ALLUSERS" />
12 <Control Id="DescriptionPerUser" Type="Text" X="20" Y="202" Width="330" Height="31" Transparent="yes" NoPrefix="yes" Hidden="yes" Text="!(loc.AdvancedWelcomeEulaDlgDescriptionPerUser)" ShowCondition="NOT ALLUSERS" />
13 <Control Id="LicenseAcceptedCheckBox" Type="CheckBox" X="20" Y="180" Width="226" Height="18" CheckBoxValue="1" Property="LicenseAccepted" Text="!(loc.WelcomeEulaDlgLicenseAcceptedCheckBox)" />
14 <Control Id="Print" Type="PushButton" X="88" Y="243" Width="56" Height="17" Text="!(loc.WixUIPrint)">
15 <Publish Event="DoAction" Value="WixUIPrintEula" />
16 </Control>
17 <Control Id="Advanced" Type="PushButton" X="156" Y="243" Width="56" Height="17" Text="!(loc.AdvancedWelcomeEulaDlgAdvanced)" DisableCondition="LicenseAccepted &lt;&gt; &quot;1&quot;" EnableCondition="LicenseAccepted = &quot;1&quot;" />
18 <Control Id="Install" Type="PushButton" ElevationShield="yes" X="212" Y="243" Width="80" Height="17" Default="yes" Text="!(loc.AdvancedWelcomeEulaDlgInstall)" Hidden="yes" DisableCondition="LicenseAccepted &lt;&gt; &quot;1&quot;" EnableCondition="LicenseAccepted = &quot;1&quot;" ShowCondition="ALLUSERS">
19 <Publish Event="SpawnWaitDialog" Value="WaitForCostingDlg" Condition="!(wix.WixUICostingPopupOptOut) OR CostingComplete = 1" />
20 <Publish Event="EndDialog" Value="Return" Condition="OutOfDiskSpace &lt;&gt; 1" />
21 <Publish Event="SpawnDialog" Value="OutOfRbDiskDlg" Condition="OutOfDiskSpace = 1 AND OutOfNoRbDiskSpace = 0 AND (PROMPTROLLBACKCOST=&quot;P&quot; OR NOT PROMPTROLLBACKCOST)" />
22 <Publish Event="EndDialog" Value="Return" Condition="OutOfDiskSpace = 1 AND OutOfNoRbDiskSpace = 0 AND PROMPTROLLBACKCOST=&quot;D&quot;" />
23 <Publish Event="EnableRollback" Value="False" Condition="OutOfDiskSpace = 1 AND OutOfNoRbDiskSpace = 0 AND PROMPTROLLBACKCOST=&quot;D&quot;" />
24 <Publish Event="SpawnDialog" Value="OutOfDiskDlg" Condition="(OutOfDiskSpace = 1 AND OutOfNoRbDiskSpace = 1) OR (OutOfDiskSpace = 1 AND PROMPTROLLBACKCOST=&quot;F&quot;)" />
25 </Control>
26 <Control Id="InstallNoShield" Type="PushButton" ElevationShield="no" X="212" Y="243" Width="80" Height="17" Default="yes" Text="!(loc.AdvancedWelcomeEulaDlgInstall)" Hidden="yes" DisableCondition="LicenseAccepted &lt;&gt; &quot;1&quot;" EnableCondition="LicenseAccepted = &quot;1&quot;" ShowCondition="NOT ALLUSERS">
27 <Publish Event="SpawnWaitDialog" Value="WaitForCostingDlg" Condition="!(wix.WixUICostingPopupOptOut) OR CostingComplete = 1" />
28 <Publish Event="EndDialog" Value="Return" Condition="OutOfDiskSpace &lt;&gt; 1" />
29 <Publish Event="SpawnDialog" Value="OutOfRbDiskDlg" Condition="OutOfDiskSpace = 1 AND OutOfNoRbDiskSpace = 0 AND (PROMPTROLLBACKCOST=&quot;P&quot; OR NOT PROMPTROLLBACKCOST)" />
30 <Publish Event="EndDialog" Value="Return" Condition="OutOfDiskSpace = 1 AND OutOfNoRbDiskSpace = 0 AND PROMPTROLLBACKCOST=&quot;D&quot;" />
31 <Publish Event="EnableRollback" Value="False" Condition="OutOfDiskSpace = 1 AND OutOfNoRbDiskSpace = 0 AND PROMPTROLLBACKCOST=&quot;D&quot;" />
32 <Publish Event="SpawnDialog" Value="OutOfDiskDlg" Condition="(OutOfDiskSpace = 1 AND OutOfNoRbDiskSpace = 1) OR (OutOfDiskSpace = 1 AND PROMPTROLLBACKCOST=&quot;F&quot;)" />
33 </Control>
34 <Control Id="Cancel" Type="PushButton" X="304" Y="243" Width="56" Height="17" Cancel="yes" Text="!(loc.WixUICancel)">
35 <Publish Event="SpawnDialog" Value="CancelDlg" />
36 </Control>
37 <Control Id="LicenseText" Type="ScrollableText" X="20" Y="55" Width="330" Height="121" Sunken="yes" TabSkip="no">
38 <Text SourceFile="!(wix.WixUILicenseRtf=$(var.licenseRtf))" />
39 </Control>
40 </Dialog>
41 </UI>
42
43 <InstallUISequence>
44 <Show Dialog="AdvancedWelcomeEulaDlg" Before="ProgressDlg" Condition="NOT Installed" />
45 </InstallUISequence>
46 </Fragment>
47</Wix>
diff --git a/src/ext/UI/wixlib/Bitmaps/New.ico b/src/ext/UI/wixlib/Bitmaps/New.ico
new file mode 100644
index 00000000..27881dfe
--- /dev/null
+++ b/src/ext/UI/wixlib/Bitmaps/New.ico
Binary files differ
diff --git a/src/ext/UI/wixlib/Bitmaps/Up.ico b/src/ext/UI/wixlib/Bitmaps/Up.ico
new file mode 100644
index 00000000..86f6b5a8
--- /dev/null
+++ b/src/ext/UI/wixlib/Bitmaps/Up.ico
Binary files differ
diff --git a/src/ext/UI/wixlib/Bitmaps/bannrbmp.bmp b/src/ext/UI/wixlib/Bitmaps/bannrbmp.bmp
new file mode 100644
index 00000000..7401a39f
--- /dev/null
+++ b/src/ext/UI/wixlib/Bitmaps/bannrbmp.bmp
Binary files differ
diff --git a/src/ext/UI/wixlib/Bitmaps/dlgbmp.bmp b/src/ext/UI/wixlib/Bitmaps/dlgbmp.bmp
new file mode 100644
index 00000000..4bfa09d9
--- /dev/null
+++ b/src/ext/UI/wixlib/Bitmaps/dlgbmp.bmp
Binary files differ
diff --git a/src/ext/UI/wixlib/Bitmaps/exclamic.ico b/src/ext/UI/wixlib/Bitmaps/exclamic.ico
new file mode 100644
index 00000000..906ce324
--- /dev/null
+++ b/src/ext/UI/wixlib/Bitmaps/exclamic.ico
Binary files differ
diff --git a/src/ext/UI/wixlib/Bitmaps/info.ico b/src/ext/UI/wixlib/Bitmaps/info.ico
new file mode 100644
index 00000000..7e0ff7f1
--- /dev/null
+++ b/src/ext/UI/wixlib/Bitmaps/info.ico
Binary files differ
diff --git a/src/ext/UI/wixlib/BrowseDlg.wxs b/src/ext/UI/wixlib/BrowseDlg.wxs
new file mode 100644
index 00000000..dbb104fe
--- /dev/null
+++ b/src/ext/UI/wixlib/BrowseDlg.wxs
@@ -0,0 +1,37 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2
3
4<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
5 <Fragment>
6 <UI>
7 <Dialog Id="BrowseDlg" Width="370" Height="270" Title="!(loc.BrowseDlg_Title)">
8 <Control Id="PathEdit" Type="PathEdit" X="25" Y="202" Width="320" Height="18" Property="_BrowseProperty" Indirect="yes" />
9 <Control Id="OK" Type="PushButton" X="240" Y="243" Width="56" Height="17" Default="yes" Text="!(loc.WixUIOK)">
10 <Publish Event="SetTargetPath" Value="[_BrowseProperty]" />
11 <Publish Event="EndDialog" Value="Return" />
12 </Control>
13 <Control Id="Cancel" Type="PushButton" X="304" Y="243" Width="56" Height="17" Cancel="yes" Text="!(loc.WixUICancel)">
14 <Publish Event="Reset" Value="0" />
15 <Publish Event="EndDialog" Value="Return" />
16 </Control>
17 <Control Id="ComboLabel" Type="Text" X="25" Y="58" Width="44" Height="10" TabSkip="no" Text="!(loc.BrowseDlgComboLabel)" />
18 <Control Id="DirectoryCombo" Type="DirectoryCombo" X="70" Y="55" Width="220" Height="80" Property="_BrowseProperty" Indirect="yes" Fixed="yes" Remote="yes">
19 <Subscribe Event="IgnoreChange" Attribute="IgnoreChange" />
20 </Control>
21 <Control Id="WixUI_Bmp_Up" Type="PushButton" X="298" Y="55" Width="19" Height="19" ToolTip="!(loc.BrowseDlgWixUI_Bmp_UpTooltip)" Icon="yes" FixedSize="yes" IconSize="16" Text="!(loc.BrowseDlgWixUI_Bmp_Up)">
22 <Publish Event="DirectoryListUp" Value="0" />
23 </Control>
24 <Control Id="NewFolder" Type="PushButton" X="325" Y="55" Width="19" Height="19" ToolTip="!(loc.BrowseDlgNewFolderTooltip)" Icon="yes" FixedSize="yes" IconSize="16" Text="!(loc.BrowseDlgNewFolder)">
25 <Publish Event="DirectoryListNew" Value="0" />
26 </Control>
27 <Control Id="DirectoryList" Type="DirectoryList" X="25" Y="83" Width="320" Height="98" Property="_BrowseProperty" Sunken="yes" Indirect="yes" TabSkip="no" />
28 <Control Id="PathLabel" Type="Text" X="25" Y="190" Width="320" Height="10" TabSkip="no" Text="!(loc.BrowseDlgPathLabel)" />
29 <Control Id="BannerBitmap" Type="Bitmap" X="0" Y="0" Width="370" Height="44" TabSkip="no" Text="!(loc.BrowseDlgBannerBitmap)" />
30 <Control Id="BannerLine" Type="Line" X="0" Y="44" Width="370" Height="0" />
31 <Control Id="BottomLine" Type="Line" X="0" Y="234" Width="370" Height="0" />
32 <Control Id="Description" Type="Text" X="25" Y="23" Width="280" Height="15" Transparent="yes" NoPrefix="yes" Text="!(loc.BrowseDlgDescription)" />
33 <Control Id="Title" Type="Text" X="15" Y="6" Width="200" Height="15" Transparent="yes" NoPrefix="yes" Text="!(loc.BrowseDlgTitle)" />
34 </Dialog>
35 </UI>
36 </Fragment>
37</Wix>
diff --git a/src/ext/UI/wixlib/CancelDlg.wxs b/src/ext/UI/wixlib/CancelDlg.wxs
new file mode 100644
index 00000000..0a72a415
--- /dev/null
+++ b/src/ext/UI/wixlib/CancelDlg.wxs
@@ -0,0 +1,19 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2
3
4<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
5 <Fragment>
6 <UI>
7 <Dialog Id="CancelDlg" Width="260" Height="85" Title="!(loc.CancelDlg_Title)">
8 <Control Id="No" Type="PushButton" X="132" Y="57" Width="56" Height="17" Default="yes" Cancel="yes" Text="!(loc.WixUINo)">
9 <Publish Event="EndDialog" Value="Return" />
10 </Control>
11 <Control Id="Yes" Type="PushButton" X="72" Y="57" Width="56" Height="17" Text="!(loc.WixUIYes)">
12 <Publish Event="EndDialog" Value="Exit" />
13 </Control>
14 <Control Id="Text" Type="Text" X="48" Y="15" Width="194" Height="30" NoPrefix="yes" Text="!(loc.CancelDlgText)" />
15 <Control Id="Icon" Type="Icon" X="15" Y="15" Width="24" Height="24" ToolTip="!(loc.CancelDlgIconTooltip)" FixedSize="yes" IconSize="32" Text="!(loc.CancelDlgIcon)" />
16 </Dialog>
17 </UI>
18 </Fragment>
19</Wix>
diff --git a/src/ext/UI/wixlib/Common.wxs b/src/ext/UI/wixlib/Common.wxs
new file mode 100644
index 00000000..476b00da
--- /dev/null
+++ b/src/ext/UI/wixlib/Common.wxs
@@ -0,0 +1,69 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2
3
4<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
5 <Fragment>
6 <Binary Id="WixUI_Bmp_Banner" SourceFile="!(wix.WixUIBannerBmp=$(var.bannerBmp))" />
7 <Binary Id="WixUI_Bmp_Dialog" SourceFile="!(wix.WixUIDialogBmp=$(var.dialogBmp))" />
8 <Binary Id="WixUI_Ico_Exclam" SourceFile="!(wix.WixUIExclamationIco=$(var.exclamationIco))" />
9 <Binary Id="WixUI_Ico_Info" SourceFile="!(wix.WixUIInfoIco=$(var.infoIco))" />
10 <Binary Id="WixUI_Bmp_New" SourceFile="!(wix.WixUINewIco=$(var.newIco))" />
11 <Binary Id="WixUI_Bmp_Up" SourceFile="!(wix.WixUIUpIco=$(var.upIco))" />
12 <WixVariable Id="WixUICostingPopupOptOut" Value="1" Overridable="yes" />
13
14 <UI Id="WixUI_Common">
15 <!-- ui text -->
16 <UIText Id="AbsentPath" />
17 <UIText Id="bytes" Value="!(loc.UITextbytes)" />
18 <UIText Id="GB" Value="!(loc.UITextGB)" />
19 <UIText Id="KB" Value="!(loc.UITextKB)" />
20 <UIText Id="MB" Value="!(loc.UITextMB)" />
21 <UIText Id="MenuAbsent" Value="!(loc.UITextMenuAbsent)" />
22 <UIText Id="MenuAdvertise" Value="!(loc.UITextMenuAdvertise)" />
23 <UIText Id="MenuAllCD" Value="!(loc.UITextMenuAllCD)" />
24 <UIText Id="MenuAllLocal" Value="!(loc.UITextMenuAllLocal)" />
25 <UIText Id="MenuAllNetwork" Value="!(loc.UITextMenuAllNetwork)" />
26 <UIText Id="MenuCD" Value="!(loc.UITextMenuCD)" />
27 <UIText Id="MenuLocal" Value="!(loc.UITextMenuLocal)" />
28 <UIText Id="MenuNetwork" Value="!(loc.UITextMenuNetwork)" />
29 <UIText Id="NewFolder" Value="!(loc.UITextNewFolder)" />
30 <UIText Id="ScriptInProgress" Value="!(loc.UITextScriptInProgress)" />
31 <UIText Id="SelAbsentAbsent" Value="!(loc.UITextSelAbsentAbsent)" />
32 <UIText Id="SelAbsentAdvertise" Value="!(loc.UITextSelAbsentAdvertise)" />
33 <UIText Id="SelAbsentCD" Value="!(loc.UITextSelAbsentCD)" />
34 <UIText Id="SelAbsentLocal" Value="!(loc.UITextSelAbsentLocal)" />
35 <UIText Id="SelAbsentNetwork" Value="!(loc.UITextSelAbsentNetwork)" />
36 <UIText Id="SelAdvertiseAbsent" Value="!(loc.UITextSelAdvertiseAbsent)" />
37 <UIText Id="SelAdvertiseAdvertise" Value="!(loc.UITextSelAdvertiseAdvertise)" />
38 <UIText Id="SelAdvertiseCD" Value="!(loc.UITextSelAdvertiseCD)" />
39 <UIText Id="SelAdvertiseLocal" Value="!(loc.UITextSelAdvertiseLocal)" />
40 <UIText Id="SelAdvertiseNetwork" Value="!(loc.UITextSelAdvertiseNetwork)" />
41 <UIText Id="SelCDAbsent" Value="!(loc.UITextSelCDAbsent)" />
42 <UIText Id="SelCDAdvertise" Value="!(loc.UITextSelCDAdvertise)" />
43 <UIText Id="SelCDCD" Value="!(loc.UITextSelCDCD)" />
44 <UIText Id="SelCDLocal" Value="!(loc.UITextSelCDLocal)" />
45 <UIText Id="SelChildCostNeg" Value="!(loc.UITextSelChildCostNeg)" />
46 <UIText Id="SelChildCostPos" Value="!(loc.UITextSelChildCostPos)" />
47 <UIText Id="SelCostPending" Value="!(loc.UITextSelCostPending)" />
48 <UIText Id="SelLocalAbsent" Value="!(loc.UITextSelLocalAbsent)" />
49 <UIText Id="SelLocalAdvertise" Value="!(loc.UITextSelLocalAdvertise)" />
50 <UIText Id="SelLocalCD" Value="!(loc.UITextSelLocalCD)" />
51 <UIText Id="SelLocalLocal" Value="!(loc.UITextSelLocalLocal)" />
52 <UIText Id="SelLocalNetwork" Value="!(loc.UITextSelLocalNetwork)" />
53 <UIText Id="SelNetworkAbsent" Value="!(loc.UITextSelNetworkAbsent)" />
54 <UIText Id="SelNetworkAdvertise" Value="!(loc.UITextSelNetworkAdvertise)" />
55 <UIText Id="SelNetworkLocal" Value="!(loc.UITextSelNetworkLocal)" />
56 <UIText Id="SelNetworkNetwork" Value="!(loc.UITextSelNetworkNetwork)" />
57 <UIText Id="SelParentCostNegNeg" Value="!(loc.UITextSelParentCostNegNeg)" />
58 <UIText Id="SelParentCostNegPos" Value="!(loc.UITextSelParentCostNegPos)" />
59 <UIText Id="SelParentCostPosNeg" Value="!(loc.UITextSelParentCostPosNeg)" />
60 <UIText Id="SelParentCostPosPos" Value="!(loc.UITextSelParentCostPosPos)" />
61 <UIText Id="TimeRemaining" Value="!(loc.UITextTimeRemaining)" />
62 <UIText Id="VolumeCostAvailable" Value="!(loc.UITextVolumeCostAvailable)" />
63 <UIText Id="VolumeCostDifference" Value="!(loc.UITextVolumeCostDifference)" />
64 <UIText Id="VolumeCostRequired" Value="!(loc.UITextVolumeCostRequired)" />
65 <UIText Id="VolumeCostSize" Value="!(loc.UITextVolumeCostSize)" />
66 <UIText Id="VolumeCostVolume" Value="!(loc.UITextVolumeCostVolume)" />
67 </UI>
68 </Fragment>
69</Wix>
diff --git a/src/ext/UI/wixlib/Common_Platform.wxi b/src/ext/UI/wixlib/Common_Platform.wxi
new file mode 100644
index 00000000..ffaa7114
--- /dev/null
+++ b/src/ext/UI/wixlib/Common_Platform.wxi
@@ -0,0 +1,19 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2
3
4<Include xmlns="http://wixtoolset.org/schemas/v4/wxs">
5 <?include caSuffix.wxi ?>
6 <Fragment>
7 <!-- print EULA functionality -->
8 <CustomAction Id="WixUIPrintEula$(var.Suffix)" DllEntry="PrintEula" Return="ignore" Execute="immediate" BinaryRef="WixUIWixca$(var.Suffix)" />
9 </Fragment>
10
11 <Fragment>
12 <!-- Validate install directory -->
13 <CustomAction Id="WixUIValidatePath$(var.Suffix)" DllEntry="ValidatePath" Return="ignore" Execute="immediate" BinaryRef="WixUIWixca$(var.Suffix)" />
14 </Fragment>
15
16 <Fragment>
17 <Binary Id="WixUIWixca$(var.Suffix)" SourceFile="!(bindpath.$(var.platform))uica.dll" />
18 </Fragment>
19</Include>
diff --git a/src/ext/UI/wixlib/Common_x86.wxs b/src/ext/UI/wixlib/Common_x86.wxs
new file mode 100644
index 00000000..d5aa42c3
--- /dev/null
+++ b/src/ext/UI/wixlib/Common_x86.wxs
@@ -0,0 +1,7 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2
3
4<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
5 <?define platform=x86 ?>
6 <?include Common_Platform.wxi ?>
7</Wix>
diff --git a/src/ext/UI/wixlib/CustomizeDlg.wxs b/src/ext/UI/wixlib/CustomizeDlg.wxs
new file mode 100644
index 00000000..12541d5b
--- /dev/null
+++ b/src/ext/UI/wixlib/CustomizeDlg.wxs
@@ -0,0 +1,50 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2
3
4<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
5 <Fragment>
6 <UI>
7 <Dialog Id="CustomizeDlg" Width="370" Height="270" Title="!(loc.CustomizeDlg_Title)" TrackDiskSpace="yes">
8 <Control Id="Tree" Type="SelectionTree" X="25" Y="85" Width="175" Height="115" Property="_BrowseProperty" Sunken="yes" TabSkip="no" Text="!(loc.CustomizeDlgTree)" />
9 <Control Id="Browse" Type="PushButton" X="294" Y="210" Width="66" Height="17" Text="!(loc.CustomizeDlgBrowse)" HideCondition="Installed" DisableCondition="Installed">
10 <Publish Event="SelectionBrowse" Value="BrowseDlg" />
11 </Control>
12 <Control Id="Reset" Type="PushButton" X="10" Y="243" Width="81" Height="17" Text="!(loc.CustomizeDlgReset)">
13 <Publish Event="Reset" Value="0" />
14 <Subscribe Event="SelectionNoItems" Attribute="Enabled" />
15 </Control>
16 <Control Id="DiskCost" Type="PushButton" X="91" Y="243" Width="100" Height="17" Text="!(loc.CustomizeDlgDiskCost)">
17 <Publish Event="SpawnDialog" Value="DiskCostDlg" />
18 <Subscribe Event="SelectionNoItems" Attribute="Enabled" />
19 </Control>
20 <Control Id="Back" Type="PushButton" X="192" Y="243" Width="56" Height="17" Text="!(loc.WixUIBack)" />
21 <Control Id="Next" Type="PushButton" X="248" Y="243" Width="56" Height="17" Default="yes" Text="!(loc.WixUINext)">
22 <Subscribe Event="SelectionNoItems" Attribute="Enabled" />
23 </Control>
24 <Control Id="Cancel" Type="PushButton" X="304" Y="243" Width="56" Height="17" Cancel="yes" Text="!(loc.WixUICancel)">
25 <Publish Event="SpawnDialog" Value="CancelDlg" />
26 </Control>
27 <Control Id="BannerBitmap" Type="Bitmap" X="0" Y="0" Width="370" Height="44" TabSkip="no" Text="!(loc.CustomizeDlgBannerBitmap)" />
28 <Control Id="Text" Type="Text" X="25" Y="55" Width="320" Height="20" Text="!(loc.CustomizeDlgText)" />
29 <Control Id="BannerLine" Type="Line" X="0" Y="44" Width="370" Height="0" />
30 <Control Id="BottomLine" Type="Line" X="0" Y="234" Width="370" Height="0" />
31 <Control Id="Description" Type="Text" X="25" Y="23" Width="280" Height="15" Transparent="yes" NoPrefix="yes" Text="!(loc.CustomizeDlgDescription)" />
32 <Control Id="Title" Type="Text" X="15" Y="6" Width="210" Height="15" Transparent="yes" NoPrefix="yes" Text="!(loc.CustomizeDlgTitle)" />
33 <Control Id="Box" Type="GroupBox" X="210" Y="81" Width="150" Height="118" />
34 <Control Id="ItemDescription" Type="Text" X="215" Y="90" Width="131" Height="50" Text="!(loc.CustomizeDlgItemDescription)">
35 <Subscribe Event="SelectionDescription" Attribute="Text" />
36 </Control>
37 <Control Id="ItemSize" Type="Text" X="215" Y="140" Width="131" Height="50" Text="!(loc.CustomizeDlgItemSize)">
38 <Subscribe Event="SelectionSize" Attribute="Text" />
39 </Control>
40 <Control Id="Location" Type="Text" X="90" Y="210" Width="200" Height="20" Text="!(loc.CustomizeDlgLocation)" HideCondition="Installed">
41 <Subscribe Event="SelectionPath" Attribute="Text" />
42 <Subscribe Event="SelectionPathOn" Attribute="Visible" />
43 </Control>
44 <Control Id="LocationLabel" Type="Text" X="25" Y="210" Width="65" Height="10" Text="!(loc.CustomizeDlgLocationLabel)" HideCondition="Installed">
45 <Subscribe Event="SelectionPathOn" Attribute="Visible" />
46 </Control>
47 </Dialog>
48 </UI>
49 </Fragment>
50</Wix>
diff --git a/src/ext/UI/wixlib/DiskCostDlg.wxs b/src/ext/UI/wixlib/DiskCostDlg.wxs
new file mode 100644
index 00000000..e1ac90ec
--- /dev/null
+++ b/src/ext/UI/wixlib/DiskCostDlg.wxs
@@ -0,0 +1,21 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2
3
4<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
5 <Fragment>
6 <UI>
7 <Dialog Id="DiskCostDlg" Width="370" Height="270" Title="!(loc.DiskCostDlg_Title)">
8 <Control Id="OK" Type="PushButton" X="304" Y="243" Width="56" Height="17" Default="yes" Cancel="yes" Text="!(loc.WixUIOK)">
9 <Publish Event="EndDialog" Value="Return" />
10 </Control>
11 <Control Id="BannerBitmap" Type="Bitmap" X="0" Y="0" Width="370" Height="44" TabSkip="no" Text="!(loc.DiskCostDlgBannerBitmap)" />
12 <Control Id="Text" Type="Text" X="20" Y="53" Width="330" Height="50" Text="!(loc.DiskCostDlgText)" />
13 <Control Id="BannerLine" Type="Line" X="0" Y="44" Width="370" Height="0" />
14 <Control Id="BottomLine" Type="Line" X="0" Y="234" Width="370" Height="0" />
15 <Control Id="Description" Type="Text" X="20" Y="20" Width="280" Height="20" Transparent="yes" NoPrefix="yes" Text="!(loc.DiskCostDlgDescription)" />
16 <Control Id="Title" Type="Text" X="15" Y="6" Width="200" Height="15" Transparent="yes" NoPrefix="yes" Text="!(loc.DiskCostDlgTitle)" />
17 <Control Id="VolumeList" Type="VolumeCostList" X="20" Y="100" Width="330" Height="120" Sunken="yes" Fixed="yes" Remote="yes" Text="!(loc.DiskCostDlgVolumeList)" />
18 </Dialog>
19 </UI>
20 </Fragment>
21</Wix>
diff --git a/src/ext/UI/wixlib/ErrorDlg.wxs b/src/ext/UI/wixlib/ErrorDlg.wxs
new file mode 100644
index 00000000..ccad45fb
--- /dev/null
+++ b/src/ext/UI/wixlib/ErrorDlg.wxs
@@ -0,0 +1,36 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2
3
4<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
5 <Fragment>
6 <UI>
7 <Dialog Id="ErrorDlg" Width="270" Height="105" Title="!(loc.ErrorDlg_Title)" ErrorDialog="yes">
8 <Control Id="ErrorText" Type="Text" X="48" Y="15" Width="205" Height="60" TabSkip="no" NoPrefix="yes" Text="!(loc.ErrorDlgErrorText)" />
9 <Control Id="Y" Type="PushButton" X="100" Y="80" Width="56" Height="17" TabSkip="yes" Text="!(loc.WixUIYes)">
10 <Publish Event="EndDialog" Value="ErrorYes" />
11 </Control>
12 <Control Id="A" Type="PushButton" X="100" Y="80" Width="56" Height="17" TabSkip="yes" Text="!(loc.WixUICancel)">
13 <Publish Event="EndDialog" Value="ErrorAbort" />
14 </Control>
15 <Control Id="C" Type="PushButton" X="100" Y="80" Width="56" Height="17" TabSkip="yes" Text="!(loc.WixUICancel)">
16 <Publish Event="EndDialog" Value="ErrorCancel" />
17 </Control>
18 <Control Id="ErrorIcon" Type="Icon" X="15" Y="15" Width="24" Height="24" ToolTip="!(loc.ErrorDlgErrorIconTooltip)" FixedSize="yes" IconSize="32" Text="!(loc.ErrorDlgErrorIcon)" />
19 <Control Id="I" Type="PushButton" X="100" Y="80" Width="56" Height="17" TabSkip="yes" Text="!(loc.WixUIIgnore)">
20 <Publish Event="EndDialog" Value="ErrorIgnore" />
21 </Control>
22 <Control Id="N" Type="PushButton" X="100" Y="80" Width="56" Height="17" TabSkip="yes" Text="!(loc.WixUINo)">
23 <Publish Event="EndDialog" Value="ErrorNo" />
24 </Control>
25 <Control Id="O" Type="PushButton" X="100" Y="80" Width="56" Height="17" TabSkip="yes" Text="!(loc.WixUIOK)">
26 <Publish Event="EndDialog" Value="ErrorOk" />
27 </Control>
28 <Control Id="R" Type="PushButton" X="100" Y="80" Width="56" Height="17" TabSkip="yes" Text="!(loc.WixUIRetry)">
29 <Publish Event="EndDialog" Value="ErrorRetry" />
30 </Control>
31 </Dialog>
32
33 <Property Id="ErrorDialog" Value="ErrorDlg" />
34 </UI>
35 </Fragment>
36</Wix>
diff --git a/src/ext/UI/wixlib/ErrorProgressText.wxs b/src/ext/UI/wixlib/ErrorProgressText.wxs
new file mode 100644
index 00000000..8cc710f4
--- /dev/null
+++ b/src/ext/UI/wixlib/ErrorProgressText.wxs
@@ -0,0 +1,244 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2
3
4<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
5 <Fragment>
6 <UI Id="WixUI_ErrorProgressText">
7 <!-- action text -->
8 <ProgressText Action="InstallValidate" Message="!(loc.ProgressTextInstallValidate)" />
9 <ProgressText Action="InstallFiles" Template="!(loc.ProgressTextInstallFilesTemplate)" Message="!(loc.ProgressTextInstallFiles)" />
10 <ProgressText Action="InstallAdminPackage" Template="!(loc.ProgressTextInstallAdminPackageTemplate)" Message="!(loc.ProgressTextInstallAdminPackage)" />
11 <ProgressText Action="FileCost" Message="!(loc.ProgressTextFileCost)" />
12 <ProgressText Action="CostInitialize" Message="!(loc.ProgressTextCostInitialize)" />
13 <ProgressText Action="CostFinalize" Message="!(loc.ProgressTextCostFinalize)" />
14 <ProgressText Action="CreateShortcuts" Template="!(loc.ProgressTextCreateShortcutsTemplate)" Message="!(loc.ProgressTextCreateShortcuts)" />
15 <ProgressText Action="PublishComponents" Template="!(loc.ProgressTextPublishComponentsTemplate)" Message="!(loc.ProgressTextPublishComponents)" />
16 <ProgressText Action="PublishFeatures" Template="!(loc.ProgressTextPublishFeaturesTemplate)" Message="!(loc.ProgressTextPublishFeatures)" />
17 <ProgressText Action="PublishProduct" Message="!(loc.ProgressTextPublishProduct)" />
18 <ProgressText Action="RegisterClassInfo" Template="!(loc.ProgressTextRegisterClassInfoTemplate)" Message="!(loc.ProgressTextRegisterClassInfo)" />
19 <ProgressText Action="RegisterExtensionInfo" Template="!(loc.ProgressTextRegisterExtensionInfoTemplate)" Message="!(loc.ProgressTextRegisterExtensionInfo)" />
20 <ProgressText Action="RegisterMIMEInfo" Template="!(loc.ProgressTextRegisterMIMEInfoTemplate)" Message="!(loc.ProgressTextRegisterMIMEInfo)" />
21 <ProgressText Action="RegisterProgIdInfo" Template="!(loc.ProgressTextRegisterProgIdInfoTemplate)" Message="!(loc.ProgressTextRegisterProgIdInfo)" />
22 <ProgressText Action="AllocateRegistrySpace" Template="!(loc.ProgressTextAllocateRegistrySpaceTemplate)" Message="!(loc.ProgressTextAllocateRegistrySpace)" />
23 <ProgressText Action="AppSearch" Template="!(loc.ProgressTextAppSearchTemplate)" Message="!(loc.ProgressTextAppSearch)" />
24 <ProgressText Action="BindImage" Template="!(loc.ProgressTextBindImageTemplate)" Message="!(loc.ProgressTextBindImage)" />
25 <ProgressText Action="CCPSearch" Message="!(loc.ProgressTextCCPSearch)" />
26 <ProgressText Action="CreateFolders" Template="!(loc.ProgressTextCreateFoldersTemplate)" Message="!(loc.ProgressTextCreateFolders)" />
27 <ProgressText Action="DeleteServices" Template="!(loc.ProgressTextDeleteServicesTemplate)" Message="!(loc.ProgressTextDeleteServices)" />
28 <ProgressText Action="DuplicateFiles" Template="!(loc.ProgressTextDuplicateFilesTemplate)" Message="!(loc.ProgressTextDuplicateFiles)" />
29 <ProgressText Action="FindRelatedProducts" Template="!(loc.ProgressTextFindRelatedProductsTemplate)" Message="!(loc.ProgressTextFindRelatedProducts)" />
30 <ProgressText Action="InstallODBC" Message="!(loc.ProgressTextInstallODBC)" />
31 <ProgressText Action="InstallServices" Template="!(loc.ProgressTextInstallServicesTemplate)" Message="!(loc.ProgressTextInstallServices)" />
32 <ProgressText Action="LaunchConditions" Message="!(loc.ProgressTextLaunchConditions)" />
33 <ProgressText Action="MigrateFeatureStates" Template="!(loc.ProgressTextMigrateFeatureStatesTemplate)" Message="!(loc.ProgressTextMigrateFeatureStates)" />
34 <ProgressText Action="MoveFiles" Template="!(loc.ProgressTextMoveFilesTemplate)" Message="!(loc.ProgressTextMoveFiles)" />
35 <ProgressText Action="PatchFiles" Template="!(loc.ProgressTextPatchFilesTemplate)" Message="!(loc.ProgressTextPatchFiles)" />
36 <ProgressText Action="ProcessComponents" Message="!(loc.ProgressTextProcessComponents)" />
37 <ProgressText Action="RegisterComPlus" Template="!(loc.ProgressTextRegisterComPlusTemplate)" Message="!(loc.ProgressTextRegisterComPlus)" />
38 <ProgressText Action="RegisterFonts" Template="!(loc.ProgressTextRegisterFontsTemplate)" Message="!(loc.ProgressTextRegisterFonts)" />
39 <ProgressText Action="RegisterProduct" Template="!(loc.ProgressTextRegisterProductTemplate)" Message="!(loc.ProgressTextRegisterProduct)" />
40 <ProgressText Action="RegisterTypeLibraries" Template="!(loc.ProgressTextRegisterTypeLibrariesTemplate)" Message="!(loc.ProgressTextRegisterTypeLibraries)" />
41 <ProgressText Action="RegisterUser" Template="!(loc.ProgressTextRegisterUserTemplate)" Message="!(loc.ProgressTextRegisterUser)" />
42 <ProgressText Action="RemoveDuplicateFiles" Template="!(loc.ProgressTextRemoveDuplicateFilesTemplate)" Message="!(loc.ProgressTextRemoveDuplicateFiles)" />
43 <ProgressText Action="RemoveEnvironmentStrings" Template="!(loc.ProgressTextRemoveEnvironmentStringsTemplate)" Message="!(loc.ProgressTextRemoveEnvironmentStrings)" />
44 <ProgressText Action="RemoveExistingProducts" Template="!(loc.ProgressTextRemoveExistingProductsTemplate)" Message="!(loc.ProgressTextRemoveExistingProducts)" />
45 <ProgressText Action="RemoveFiles" Template="!(loc.ProgressTextRemoveFilesTemplate)" Message="!(loc.ProgressTextRemoveFiles)" />
46 <ProgressText Action="RemoveFolders" Template="!(loc.ProgressTextRemoveFoldersTemplate)" Message="!(loc.ProgressTextRemoveFolders)" />
47 <ProgressText Action="RemoveIniValues" Template="!(loc.ProgressTextRemoveIniValuesTemplate)" Message="!(loc.ProgressTextRemoveIniValues)" />
48 <ProgressText Action="RemoveODBC" Message="!(loc.ProgressTextRemoveODBC)" />
49 <ProgressText Action="RemoveRegistryValues" Template="!(loc.ProgressTextRemoveRegistryValuesTemplate)" Message="!(loc.ProgressTextRemoveRegistryValues)" />
50 <ProgressText Action="RemoveShortcuts" Template="!(loc.ProgressTextRemoveShortcutsTemplate)" Message="!(loc.ProgressTextRemoveShortcuts)" />
51 <ProgressText Action="RMCCPSearch" Message="!(loc.ProgressTextRMCCPSearch)" />
52 <ProgressText Action="SelfRegModules" Template="!(loc.ProgressTextSelfRegModulesTemplate)" Message="!(loc.ProgressTextSelfRegModules)" />
53 <ProgressText Action="SelfUnregModules" Template="!(loc.ProgressTextSelfUnregModulesTemplate)" Message="!(loc.ProgressTextSelfUnregModules)" />
54 <ProgressText Action="SetODBCFolders" Message="!(loc.ProgressTextSetODBCFolders)" />
55 <ProgressText Action="StartServices" Template="!(loc.ProgressTextStartServicesTemplate)" Message="!(loc.ProgressTextStartServices)" />
56 <ProgressText Action="StopServices" Template="!(loc.ProgressTextStopServicesTemplate)" Message="!(loc.ProgressTextStopServices)" />
57 <ProgressText Action="UnpublishComponents" Template="!(loc.ProgressTextUnpublishComponentsTemplate)" Message="!(loc.ProgressTextUnpublishComponents)" />
58 <ProgressText Action="UnpublishFeatures" Template="!(loc.ProgressTextUnpublishFeaturesTemplate)" Message="!(loc.ProgressTextUnpublishFeatures)" />
59 <ProgressText Action="UnregisterClassInfo" Template="!(loc.ProgressTextUnregisterClassInfoTemplate)" Message="!(loc.ProgressTextUnregisterClassInfo)" />
60 <ProgressText Action="UnregisterComPlus" Template="!(loc.ProgressTextUnregisterComPlusTemplate)" Message="!(loc.ProgressTextUnregisterComPlus)" />
61 <ProgressText Action="UnregisterExtensionInfo" Template="!(loc.ProgressTextUnregisterExtensionInfoTemplate)" Message="!(loc.ProgressTextUnregisterExtensionInfo)" />
62 <ProgressText Action="UnregisterFonts" Template="!(loc.ProgressTextUnregisterFontsTemplate)" Message="!(loc.ProgressTextUnregisterFonts)" />
63 <ProgressText Action="UnregisterMIMEInfo" Template="!(loc.ProgressTextUnregisterMIMEInfoTemplate)" Message="!(loc.ProgressTextUnregisterMIMEInfo)" />
64 <ProgressText Action="UnregisterProgIdInfo" Template="!(loc.ProgressTextUnregisterProgIdInfoTemplate)" Message="!(loc.ProgressTextUnregisterProgIdInfo)" />
65 <ProgressText Action="UnregisterTypeLibraries" Template="!(loc.ProgressTextUnregisterTypeLibrariesTemplate)" Message="!(loc.ProgressTextUnregisterTypeLibraries)" />
66 <ProgressText Action="WriteEnvironmentStrings" Template="!(loc.ProgressTextWriteEnvironmentStringsTemplate)" Message="!(loc.ProgressTextWriteEnvironmentStrings)" />
67 <ProgressText Action="WriteIniValues" Template="!(loc.ProgressTextWriteIniValuesTemplate)" Message="!(loc.ProgressTextWriteIniValues)" />
68 <ProgressText Action="WriteRegistryValues" Template="!(loc.ProgressTextWriteRegistryValuesTemplate)" Message="!(loc.ProgressTextWriteRegistryValues)" />
69 <ProgressText Action="Advertise" Message="!(loc.ProgressTextAdvertise)" />
70 <ProgressText Action="GenerateScript" Template="!(loc.ProgressTextGenerateScriptTemplate)" Message="!(loc.ProgressTextGenerateScript)" />
71 <ProgressText Action="InstallSFPCatalogFile" Template="!(loc.ProgressTextInstallSFPCatalogFileTemplate)" Message="!(loc.ProgressTextInstallSFPCatalogFile)" />
72 <ProgressText Action="MsiPublishAssemblies" Template="!(loc.ProgressTextMsiPublishAssembliesTemplate)" Message="!(loc.ProgressTextMsiPublishAssemblies)" />
73 <ProgressText Action="MsiUnpublishAssemblies" Template="!(loc.ProgressTextMsiUnpublishAssembliesTemplate)" Message="!(loc.ProgressTextMsiUnpublishAssemblies)" />
74 <ProgressText Action="Rollback" Template="!(loc.ProgressTextRollbackTemplate)" Message="!(loc.ProgressTextRollback)" />
75 <ProgressText Action="RollbackCleanup" Template="!(loc.ProgressTextRollbackCleanupTemplate)" Message="!(loc.ProgressTextRollbackCleanup)" />
76 <ProgressText Action="UnmoveFiles" Template="!(loc.ProgressTextUnmoveFilesTemplate)" Message="!(loc.ProgressTextUnmoveFiles)" />
77 <ProgressText Action="UnpublishProduct" Message="!(loc.ProgressTextUnpublishProduct)" />
78 <!-- error text -->
79 <Error Id="0" Message="!(loc.Error0)" />
80 <Error Id="1" Message="!(loc.Error1)" />
81 <Error Id="2" Message="!(loc.Error2)" />
82 <Error Id="3" />
83 <Error Id="4" Message="!(loc.Error4)" />
84 <Error Id="5" Message="!(loc.Error5)" />
85 <Error Id="6" />
86 <Error Id="7" Message="!(loc.Error7)" />
87 <Error Id="8" Message="!(loc.Error8)" />
88 <Error Id="9" Message="!(loc.Error9)" />
89 <Error Id="10" Message="!(loc.Error10)" />
90 <Error Id="11" Message="!(loc.Error11)" />
91 <Error Id="12" Message="!(loc.Error12)" />
92 <Error Id="13" Message="!(loc.Error13)" />
93 <Error Id="14" Message="!(loc.Error14)" />
94 <Error Id="15" Message="!(loc.Error15)" />
95 <Error Id="16" Message="!(loc.Error16)" />
96 <Error Id="17" Message="!(loc.Error17)" />
97 <Error Id="18" Message="!(loc.Error18)" />
98 <Error Id="19" Message="!(loc.Error19)" />
99 <Error Id="20" Message="!(loc.Error20)" />
100 <Error Id="21" Message="!(loc.Error21)" />
101 <Error Id="22" Message="!(loc.Error22)" />
102 <Error Id="23" Message="!(loc.Error23)" />
103 <Error Id="32" Message="!(loc.Error32)" />
104 <Error Id="33" Message="!(loc.Error33)" />
105 <Error Id="1101" Message="!(loc.Error1101)" />
106 <Error Id="1301" Message="!(loc.Error1301)" />
107 <Error Id="1302" Message="!(loc.Error1302)" />
108 <Error Id="1303" Message="!(loc.Error1303)" />
109 <Error Id="1304" Message="!(loc.Error1304)" />
110 <Error Id="1305" Message="!(loc.Error1305)" />
111 <Error Id="1306" Message="!(loc.Error1306)" />
112 <Error Id="1307" Message="!(loc.Error1307)" />
113 <Error Id="1308" Message="!(loc.Error1308)" />
114 <Error Id="1309" Message="!(loc.Error1309)" />
115 <Error Id="1310" Message="!(loc.Error1310)" />
116 <Error Id="1311" Message="!(loc.Error1311)" />
117 <Error Id="1312" Message="!(loc.Error1312)" />
118 <Error Id="1313" Message="!(loc.Error1313)" />
119 <Error Id="1314" Message="!(loc.Error1314)" />
120 <Error Id="1315" Message="!(loc.Error1315)" />
121 <Error Id="1316" Message="!(loc.Error1316)" />
122 <Error Id="1317" Message="!(loc.Error1317)" />
123 <Error Id="1318" Message="!(loc.Error1318)" />
124 <Error Id="1319" Message="!(loc.Error1319)" />
125 <Error Id="1320" Message="!(loc.Error1320)" />
126 <Error Id="1321" Message="!(loc.Error1321)" />
127 <Error Id="1322" Message="!(loc.Error1322)" />
128 <Error Id="1323" Message="!(loc.Error1323)" />
129 <Error Id="1324" Message="!(loc.Error1324)" />
130 <Error Id="1325" Message="!(loc.Error1325)" />
131 <Error Id="1326" Message="!(loc.Error1326)" />
132 <Error Id="1327" Message="!(loc.Error1327)" />
133 <Error Id="1328" Message="!(loc.Error1328)" />
134 <Error Id="1329" Message="!(loc.Error1329)" />
135 <Error Id="1330" Message="!(loc.Error1330)" />
136 <Error Id="1331" Message="!(loc.Error1331)" />
137 <Error Id="1332" Message="!(loc.Error1332)" />
138 <Error Id="1333" Message="!(loc.Error1333)" />
139 <Error Id="1334" Message="!(loc.Error1334)" />
140 <Error Id="1335" Message="!(loc.Error1335)" />
141 <Error Id="1336" Message="!(loc.Error1336)" />
142 <Error Id="1401" Message="!(loc.Error1401)" />
143 <Error Id="1402" Message="!(loc.Error1402)" />
144 <Error Id="1403" Message="!(loc.Error1403)" />
145 <Error Id="1404" Message="!(loc.Error1404)" />
146 <Error Id="1405" Message="!(loc.Error1405)" />
147 <Error Id="1406" Message="!(loc.Error1406)" />
148 <Error Id="1407" Message="!(loc.Error1407)" />
149 <Error Id="1408" Message="!(loc.Error1408)" />
150 <Error Id="1409" Message="!(loc.Error1409)" />
151 <Error Id="1410" Message="!(loc.Error1410)" />
152 <Error Id="1500" Message="!(loc.Error1500)" />
153 <Error Id="1501" Message="!(loc.Error1501)" />
154 <Error Id="1502" Message="!(loc.Error1502)" />
155 <Error Id="1503" Message="!(loc.Error1503)" />
156 <Error Id="1601" Message="!(loc.Error1601)" />
157 <Error Id="1602" Message="!(loc.Error1602)" />
158 <Error Id="1603" Message="!(loc.Error1603)" />
159 <Error Id="1604" Message="!(loc.Error1604)" />
160 <Error Id="1605" Message="!(loc.Error1605)" />
161 <Error Id="1606" Message="!(loc.Error1606)" />
162 <Error Id="1607" Message="!(loc.Error1607)" />
163 <Error Id="1608" Message="!(loc.Error1608)" />
164 <Error Id="1609" Message="!(loc.Error1609)" />
165 <Error Id="1701" Message="!(loc.Error1701)" />
166 <Error Id="1702" Message="!(loc.Error1702)" />
167 <Error Id="1703" Message="!(loc.Error1703)" />
168 <Error Id="1704" Message="!(loc.Error1704)" />
169 <Error Id="1705" Message="!(loc.Error1705)" />
170 <Error Id="1706" Message="!(loc.Error1706)" />
171 <Error Id="1707" Message="!(loc.Error1707)" />
172 <Error Id="1708" Message="!(loc.Error1708)" />
173 <Error Id="1709" Message="!(loc.Error1709)" />
174 <Error Id="1710" Message="!(loc.Error1710)" />
175 <Error Id="1711" Message="!(loc.Error1711)" />
176 <Error Id="1712" Message="!(loc.Error1712)" />
177 <Error Id="1713" Message="!(loc.Error1713)" />
178 <Error Id="1714" Message="!(loc.Error1714)" />
179 <Error Id="1715" Message="!(loc.Error1715)" />
180 <Error Id="1716" Message="!(loc.Error1716)" />
181 <Error Id="1717" Message="!(loc.Error1717)" />
182 <Error Id="1718" Message="!(loc.Error1718)" />
183 <Error Id="1719" Message="!(loc.Error1719)" />
184 <Error Id="1720" Message="!(loc.Error1720)" />
185 <Error Id="1721" Message="!(loc.Error1721)" />
186 <Error Id="1722" Message="!(loc.Error1722)" />
187 <Error Id="1723" Message="!(loc.Error1723)" />
188 <Error Id="1724" Message="!(loc.Error1724)" />
189 <Error Id="1725" Message="!(loc.Error1725)" />
190 <Error Id="1726" Message="!(loc.Error1726)" />
191 <Error Id="1727" Message="!(loc.Error1727)" />
192 <Error Id="1728" Message="!(loc.Error1728)" />
193 <Error Id="1729" Message="!(loc.Error1729)" />
194 <Error Id="1730" Message="!(loc.Error1730)" />
195 <Error Id="1731" Message="!(loc.Error1731)" />
196 <Error Id="1732" Message="!(loc.Error1732)" />
197 <Error Id="1801" Message="!(loc.Error1801)" />
198 <Error Id="1802" Message="!(loc.Error1802)" />
199 <Error Id="1803" Message="!(loc.Error1803)" />
200 <Error Id="1804" Message="!(loc.Error1804)" />
201 <Error Id="1805" Message="!(loc.Error1805)" />
202 <Error Id="1806" Message="!(loc.Error1806)" />
203 <Error Id="1807" Message="!(loc.Error1807)" />
204 <Error Id="1901" Message="!(loc.Error1901)" />
205 <Error Id="1902" Message="!(loc.Error1902)" />
206 <Error Id="1903" Message="!(loc.Error1903)" />
207 <Error Id="1904" Message="!(loc.Error1904)" />
208 <Error Id="1905" Message="!(loc.Error1905)" />
209 <Error Id="1906" Message="!(loc.Error1906)" />
210 <Error Id="1907" Message="!(loc.Error1907)" />
211 <Error Id="1908" Message="!(loc.Error1908)" />
212 <Error Id="1909" Message="!(loc.Error1909)" />
213 <Error Id="1910" Message="!(loc.Error1910)" />
214 <Error Id="1911" Message="!(loc.Error1911)" />
215 <Error Id="1912" Message="!(loc.Error1912)" />
216 <Error Id="1913" Message="!(loc.Error1913)" />
217 <Error Id="1914" Message="!(loc.Error1914)" />
218 <Error Id="1915" Message="!(loc.Error1915)" />
219 <Error Id="1916" Message="!(loc.Error1916)" />
220 <Error Id="1917" Message="!(loc.Error1917)" />
221 <Error Id="1918" Message="!(loc.Error1918)" />
222 <Error Id="1919" Message="!(loc.Error1919)" />
223 <Error Id="1920" Message="!(loc.Error1920)" />
224 <Error Id="1921" Message="!(loc.Error1921)" />
225 <Error Id="1922" Message="!(loc.Error1922)" />
226 <Error Id="1923" Message="!(loc.Error1923)" />
227 <Error Id="1924" Message="!(loc.Error1924)" />
228 <Error Id="1925" Message="!(loc.Error1925)" />
229 <Error Id="1926" Message="!(loc.Error1926)" />
230 <Error Id="1927" Message="!(loc.Error1927)" />
231 <Error Id="1928" Message="!(loc.Error1928)" />
232 <Error Id="1929" Message="!(loc.Error1929)" />
233 <Error Id="1930" Message="!(loc.Error1930)" />
234 <Error Id="1931" Message="!(loc.Error1931)" />
235 <Error Id="1932" Message="!(loc.Error1932)" />
236 <Error Id="1933" Message="!(loc.Error1933)" />
237 <Error Id="1934" Message="!(loc.Error1934)" />
238 <Error Id="1935" Message="!(loc.Error1935)" />
239 <Error Id="1936" Message="!(loc.Error1936)" />
240 <Error Id="1937" Message="!(loc.Error1937)" />
241 <Error Id="1938" Message="!(loc.Error1938)" />
242 </UI>
243 </Fragment>
244</Wix>
diff --git a/src/ext/UI/wixlib/ExitDialog.wxs b/src/ext/UI/wixlib/ExitDialog.wxs
new file mode 100644
index 00000000..8f7dec1f
--- /dev/null
+++ b/src/ext/UI/wixlib/ExitDialog.wxs
@@ -0,0 +1,28 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2
3
4<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
5 <Fragment>
6 <UI>
7 <Dialog Id="ExitDialog" Width="370" Height="270" Title="!(loc.ExitDialog_Title)">
8 <Control Id="Finish" Type="PushButton" X="236" Y="243" Width="56" Height="17" Default="yes" Cancel="yes" Text="!(loc.WixUIFinish)" />
9 <Control Id="Cancel" Type="PushButton" X="304" Y="243" Width="56" Height="17" Disabled="yes" Text="!(loc.WixUICancel)" />
10 <Control Id="Bitmap" Type="Bitmap" X="0" Y="0" Width="370" Height="234" TabSkip="no" Text="!(loc.ExitDialogBitmap)" />
11 <Control Id="Back" Type="PushButton" X="180" Y="243" Width="56" Height="17" Disabled="yes" Text="!(loc.WixUIBack)" />
12 <Control Id="BottomLine" Type="Line" X="0" Y="234" Width="370" Height="0" />
13 <Control Id="Description" Type="Text" X="135" Y="70" Width="220" Height="40" Transparent="yes" NoPrefix="yes" Text="!(loc.ExitDialogDescription)" />
14 <Control Id="Title" Type="Text" X="135" Y="20" Width="220" Height="60" Transparent="yes" NoPrefix="yes" Text="!(loc.ExitDialogTitle)" />
15 <Control Id="OptionalText" Type="Text" X="135" Y="110" Width="220" Height="80" Transparent="yes" NoPrefix="yes" Hidden="yes" Text="[WIXUI_EXITDIALOGOPTIONALTEXT]" ShowCondition="WIXUI_EXITDIALOGOPTIONALTEXT AND NOT Installed" />
16 <Control Id="OptionalCheckBox" Type="CheckBox" X="135" Y="190" Width="220" Height="40" Hidden="yes" Property="WIXUI_EXITDIALOGOPTIONALCHECKBOX" CheckBoxValue="1" Text="[WIXUI_EXITDIALOGOPTIONALCHECKBOXTEXT]" ShowCondition="WIXUI_EXITDIALOGOPTIONALCHECKBOXTEXT AND NOT Installed" />
17 </Dialog>
18
19 <InstallUISequence>
20 <Show Dialog="ExitDialog" OnExit="success" Overridable="yes" />
21 </InstallUISequence>
22
23 <AdminUISequence>
24 <Show Dialog="ExitDialog" OnExit="success" Overridable="yes" />
25 </AdminUISequence>
26 </UI>
27 </Fragment>
28</Wix>
diff --git a/src/ext/UI/wixlib/FatalError.wxs b/src/ext/UI/wixlib/FatalError.wxs
new file mode 100644
index 00000000..a383b9b3
--- /dev/null
+++ b/src/ext/UI/wixlib/FatalError.wxs
@@ -0,0 +1,28 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2
3
4<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
5 <Fragment>
6 <UI>
7 <Dialog Id="FatalError" Width="370" Height="270" Title="!(loc.FatalError_Title)">
8 <Control Id="Finish" Type="PushButton" X="236" Y="243" Width="56" Height="17" Default="yes" Cancel="yes" Text="!(loc.WixUIFinish)">
9 <Publish Event="EndDialog" Value="Exit" />
10 </Control>
11 <Control Id="Cancel" Type="PushButton" X="304" Y="243" Width="56" Height="17" Disabled="yes" Text="!(loc.WixUICancel)" />
12 <Control Id="Bitmap" Type="Bitmap" X="0" Y="0" Width="370" Height="234" TabSkip="no" Text="!(loc.FatalErrorBitmap)" />
13 <Control Id="Back" Type="PushButton" X="180" Y="243" Width="56" Height="17" Disabled="yes" Text="!(loc.WixUIBack)" />
14 <Control Id="BottomLine" Type="Line" X="0" Y="234" Width="370" Height="0" />
15 <Control Id="Title" Type="Text" X="135" Y="20" Width="220" Height="60" Transparent="yes" NoPrefix="yes" Text="!(loc.FatalErrorTitle)" />
16 <Control Id="Description" Type="Text" X="135" Y="70" Width="220" Height="80" Transparent="yes" NoPrefix="yes" Text="!(loc.FatalErrorDescription1) !(loc.FatalErrorDescription2)" />
17 </Dialog>
18
19 <InstallUISequence>
20 <Show Dialog="FatalError" OnExit="error" Overridable="yes" />
21 </InstallUISequence>
22
23 <AdminUISequence>
24 <Show Dialog="FatalError" OnExit="error" Overridable="yes" />
25 </AdminUISequence>
26 </UI>
27 </Fragment>
28</Wix>
diff --git a/src/ext/UI/wixlib/FeaturesDlg.wxs b/src/ext/UI/wixlib/FeaturesDlg.wxs
new file mode 100644
index 00000000..04a93154
--- /dev/null
+++ b/src/ext/UI/wixlib/FeaturesDlg.wxs
@@ -0,0 +1,57 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2
3
4<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
5 <Fragment>
6 <UI>
7 <Dialog Id="FeaturesDlg" Width="370" Height="270" Title="!(loc.FeaturesDlg_Title)" TrackDiskSpace="yes">
8 <Control Id="Tree" Type="SelectionTree" X="20" Y="55" Width="330" Height="121" Property="_BrowseProperty" TabSkip="no" Text="!(loc.FeaturesDlgTree)" />
9 <Control Id="Back" Type="PushButton" X="156" Y="243" Width="56" Height="17" Text="!(loc.WixUIBack)" />
10 <Control Id="Install" Type="PushButton" ElevationShield="yes" X="212" Y="243" Width="80" Height="17" Hidden="yes" Text="!(loc.FeaturesDlgInstall)" ShowCondition="NOT Installed AND ALLUSERS" DefaultCondition="NOT Installed">
11 <Publish Event="SpawnWaitDialog" Value="WaitForCostingDlg" Condition="!(wix.WixUICostingPopupOptOut) OR CostingComplete = 1" />
12 <Publish Event="EndDialog" Value="Return" Condition="OutOfDiskSpace &lt;&gt; 1" />
13 <Publish Event="SpawnDialog" Value="OutOfRbDiskDlg" Condition="OutOfDiskSpace = 1 AND OutOfNoRbDiskSpace = 0 AND (PROMPTROLLBACKCOST=&quot;P&quot; OR NOT PROMPTROLLBACKCOST)" />
14 <Publish Event="EndDialog" Value="Return" Condition="OutOfDiskSpace = 1 AND OutOfNoRbDiskSpace = 0 AND PROMPTROLLBACKCOST=&quot;D&quot;" />
15 <Publish Event="EnableRollback" Value="False" Condition="OutOfDiskSpace = 1 AND OutOfNoRbDiskSpace = 0 AND PROMPTROLLBACKCOST=&quot;D&quot;" />
16 <Publish Event="SpawnDialog" Value="OutOfDiskDlg" Condition="(OutOfDiskSpace = 1 AND OutOfNoRbDiskSpace = 1) OR (OutOfDiskSpace = 1 AND PROMPTROLLBACKCOST=&quot;F&quot;)" />
17 </Control>
18 <Control Id="InstallNoShield" Type="PushButton" ElevationShield="no" X="212" Y="243" Width="80" Height="17" Hidden="yes" Text="!(loc.FeaturesDlgInstall)" ShowCondition="NOT Installed AND NOT ALLUSERS" DefaultCondition="NOT Installed">
19 <Publish Event="SpawnWaitDialog" Value="WaitForCostingDlg" Condition="!(wix.WixUICostingPopupOptOut) OR CostingComplete = 1" />
20 <Publish Event="EndDialog" Value="Return" Condition="OutOfDiskSpace &lt;&gt; 1" />
21 <Publish Event="SpawnDialog" Value="OutOfRbDiskDlg" Condition="OutOfDiskSpace = 1 AND OutOfNoRbDiskSpace = 0 AND (PROMPTROLLBACKCOST=&quot;P&quot; OR NOT PROMPTROLLBACKCOST)" />
22 <Publish Event="EndDialog" Value="Return" Condition="OutOfDiskSpace = 1 AND OutOfNoRbDiskSpace = 0 AND PROMPTROLLBACKCOST=&quot;D&quot;" />
23 <Publish Event="EnableRollback" Value="False" Condition="OutOfDiskSpace = 1 AND OutOfNoRbDiskSpace = 0 AND PROMPTROLLBACKCOST=&quot;D&quot;" />
24 <Publish Event="SpawnDialog" Value="OutOfDiskDlg" Condition="(OutOfDiskSpace = 1 AND OutOfNoRbDiskSpace = 1) OR (OutOfDiskSpace = 1 AND PROMPTROLLBACKCOST=&quot;F&quot;)" />
25 </Control>
26 <Control Id="Change" Type="PushButton" ElevationShield="yes" X="212" Y="243" Width="80" Height="17" Hidden="yes" Text="!(loc.FeaturesDlgChange)" ShowCondition="Installed AND ALLUSERS AND (ADDLOCAL OR REMOVE)" DefaultCondition="Installed">
27 <Publish Event="EndDialog" Value="Return" Condition="OutOfDiskSpace &lt;&gt; 1" />
28 <Publish Event="SpawnDialog" Value="OutOfRbDiskDlg" Condition="OutOfDiskSpace = 1 AND OutOfNoRbDiskSpace = 0 AND (PROMPTROLLBACKCOST=&quot;P&quot; OR NOT PROMPTROLLBACKCOST)" />
29 <Publish Event="EndDialog" Value="Return" Condition="OutOfDiskSpace = 1 AND OutOfNoRbDiskSpace = 0 AND PROMPTROLLBACKCOST=&quot;D&quot;" />
30 <Publish Event="EnableRollback" Value="False" Condition="OutOfDiskSpace = 1 AND OutOfNoRbDiskSpace = 0 AND PROMPTROLLBACKCOST=&quot;D&quot;" />
31 <Publish Event="SpawnDialog" Value="OutOfDiskDlg" Condition="(OutOfDiskSpace = 1 AND OutOfNoRbDiskSpace = 1) OR (OutOfDiskSpace = 1 AND PROMPTROLLBACKCOST=&quot;F&quot;)" />
32 </Control>
33 <Control Id="ChangeNoShield" Type="PushButton" ElevationShield="no" X="212" Y="243" Width="80" Height="17" Hidden="yes" Text="!(loc.FeaturesDlgChange)" ShowCondition="Installed AND (NOT ALLUSERS OR (NOT ADDLOCAL AND NOT REMOVE))" DefaultCondition="Installed">
34 <Publish Event="EndDialog" Value="Return" Condition="OutOfDiskSpace &lt;&gt; 1" />
35 <Publish Event="SpawnDialog" Value="OutOfRbDiskDlg" Condition="OutOfDiskSpace = 1 AND OutOfNoRbDiskSpace = 0 AND (PROMPTROLLBACKCOST=&quot;P&quot; OR NOT PROMPTROLLBACKCOST)" />
36 <Publish Event="EndDialog" Value="Return" Condition="OutOfDiskSpace = 1 AND OutOfNoRbDiskSpace = 0 AND PROMPTROLLBACKCOST=&quot;D&quot;" />
37 <Publish Event="EnableRollback" Value="False" Condition="OutOfDiskSpace = 1 AND OutOfNoRbDiskSpace = 0 AND PROMPTROLLBACKCOST=&quot;D&quot;" />
38 <Publish Event="SpawnDialog" Value="OutOfDiskDlg" Condition="(OutOfDiskSpace = 1 AND OutOfNoRbDiskSpace = 1) OR (OutOfDiskSpace = 1 AND PROMPTROLLBACKCOST=&quot;F&quot;)" />
39 </Control>
40 <Control Id="Cancel" Type="PushButton" X="304" Y="243" Width="56" Height="17" Cancel="yes" Text="!(loc.WixUICancel)">
41 <Publish Event="SpawnDialog" Value="CancelDlg" />
42 </Control>
43 <Control Id="BannerBitmap" Type="Bitmap" X="0" Y="0" Width="370" Height="44" TabSkip="no" Text="!(loc.FeaturesDlgBannerBitmap)" />
44 <Control Id="BannerLine" Type="Line" X="0" Y="44" Width="370" Height="0" />
45 <Control Id="BottomLine" Type="Line" X="0" Y="234" Width="370" Height="0" />
46 <Control Id="Description" Type="Text" X="25" Y="23" Width="280" Height="15" Transparent="yes" NoPrefix="yes" Text="!(loc.FeaturesDlgDescription)" />
47 <Control Id="Title" Type="Text" X="15" Y="6" Width="210" Height="15" Transparent="yes" NoPrefix="yes" Text="!(loc.FeaturesDlgTitle)" />
48 <Control Id="ItemDescription" Type="Text" X="20" Y="180" Width="330" Height="24" Transparent="yes" NoPrefix="yes" Text="!(loc.FeaturesDlgItemDescription)">
49 <Subscribe Event="SelectionDescription" Attribute="Text" />
50 </Control>
51 <Control Id="ItemSize" Type="Text" X="20" Y="209" Width="330" Height="24" Transparent="yes" NoPrefix="yes" Text="!(loc.FeaturesDlgItemSize)">
52 <Subscribe Event="SelectionSize" Attribute="Text" />
53 </Control>
54 </Dialog>
55 </UI>
56 </Fragment>
57</Wix>
diff --git a/src/ext/UI/wixlib/FilesInUse.wxs b/src/ext/UI/wixlib/FilesInUse.wxs
new file mode 100644
index 00000000..7892a5d5
--- /dev/null
+++ b/src/ext/UI/wixlib/FilesInUse.wxs
@@ -0,0 +1,27 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2
3
4<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
5 <Fragment>
6 <UI>
7 <Dialog Id="FilesInUse" Width="370" Height="270" Title="!(loc.FilesInUse_Title)" KeepModeless="yes">
8 <Control Id="Retry" Type="PushButton" X="304" Y="243" Width="56" Height="17" Default="yes" Cancel="yes" Text="!(loc.WixUIRetry)">
9 <Publish Event="EndDialog" Value="Retry" />
10 </Control>
11 <Control Id="Ignore" Type="PushButton" X="235" Y="243" Width="56" Height="17" Text="!(loc.WixUIIgnore)">
12 <Publish Event="EndDialog" Value="Ignore" />
13 </Control>
14 <Control Id="Exit" Type="PushButton" X="166" Y="243" Width="56" Height="17" Text="!(loc.FilesInUseExit)">
15 <Publish Event="EndDialog" Value="Exit" />
16 </Control>
17 <Control Id="BannerBitmap" Type="Bitmap" X="0" Y="0" Width="370" Height="44" TabSkip="no" Text="!(loc.FilesInUseBannerBitmap)" />
18 <Control Id="Text" Type="Text" X="20" Y="55" Width="330" Height="30" Text="!(loc.FilesInUseText)" />
19 <Control Id="BannerLine" Type="Line" X="0" Y="44" Width="370" Height="0" />
20 <Control Id="BottomLine" Type="Line" X="0" Y="234" Width="370" Height="0" />
21 <Control Id="Description" Type="Text" X="20" Y="23" Width="280" Height="20" Transparent="yes" NoPrefix="yes" Text="!(loc.FilesInUseDescription)" />
22 <Control Id="Title" Type="Text" X="15" Y="6" Width="200" Height="15" Transparent="yes" NoPrefix="yes" Text="!(loc.FilesInUseTitle)" />
23 <Control Id="List" Type="ListBox" X="20" Y="87" Width="330" Height="130" Property="FileInUseProcess" Sunken="yes" TabSkip="yes" />
24 </Dialog>
25 </UI>
26 </Fragment>
27</Wix>
diff --git a/src/ext/UI/wixlib/InstallDirDlg.wxs b/src/ext/UI/wixlib/InstallDirDlg.wxs
new file mode 100644
index 00000000..9eea0a01
--- /dev/null
+++ b/src/ext/UI/wixlib/InstallDirDlg.wxs
@@ -0,0 +1,26 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2
3
4<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
5 <Fragment>
6 <UI>
7 <Dialog Id="InstallDirDlg" Width="370" Height="270" Title="!(loc.InstallDirDlg_Title)">
8 <Control Id="Next" Type="PushButton" X="236" Y="243" Width="56" Height="17" Default="yes" Text="!(loc.WixUINext)" />
9 <Control Id="Back" Type="PushButton" X="180" Y="243" Width="56" Height="17" Text="!(loc.WixUIBack)" />
10 <Control Id="Cancel" Type="PushButton" X="304" Y="243" Width="56" Height="17" Cancel="yes" Text="!(loc.WixUICancel)">
11 <Publish Event="SpawnDialog" Value="CancelDlg" />
12 </Control>
13
14 <Control Id="Description" Type="Text" X="25" Y="23" Width="280" Height="15" Transparent="yes" NoPrefix="yes" Text="!(loc.InstallDirDlgDescription)" />
15 <Control Id="Title" Type="Text" X="15" Y="6" Width="200" Height="15" Transparent="yes" NoPrefix="yes" Text="!(loc.InstallDirDlgTitle)" />
16 <Control Id="BannerBitmap" Type="Bitmap" X="0" Y="0" Width="370" Height="44" TabSkip="no" Text="!(loc.InstallDirDlgBannerBitmap)" />
17 <Control Id="BannerLine" Type="Line" X="0" Y="44" Width="370" Height="0" />
18 <Control Id="BottomLine" Type="Line" X="0" Y="234" Width="370" Height="0" />
19
20 <Control Id="FolderLabel" Type="Text" X="20" Y="60" Width="290" Height="30" NoPrefix="yes" Text="!(loc.InstallDirDlgFolderLabel)" />
21 <Control Id="Folder" Type="PathEdit" X="20" Y="100" Width="320" Height="18" Property="WIXUI_INSTALLDIR" Indirect="yes" />
22 <Control Id="ChangeFolder" Type="PushButton" X="20" Y="120" Width="56" Height="17" Text="!(loc.InstallDirDlgChange)" />
23 </Dialog>
24 </UI>
25 </Fragment>
26</Wix>
diff --git a/src/ext/UI/wixlib/InstallScopeDlg.wxs b/src/ext/UI/wixlib/InstallScopeDlg.wxs
new file mode 100644
index 00000000..cfcd1179
--- /dev/null
+++ b/src/ext/UI/wixlib/InstallScopeDlg.wxs
@@ -0,0 +1,30 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2
3
4<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
5 <Fragment>
6 <UI>
7 <Dialog Id="InstallScopeDlg" Width="370" Height="270" Title="!(loc.InstallScopeDlg_Title)" KeepModeless="yes">
8 <Control Id="BannerBitmap" Type="Bitmap" X="0" Y="0" Width="370" Height="44" TabSkip="no" Text="!(loc.InstallScopeDlgBannerBitmap)" />
9 <Control Id="BannerLine" Type="Line" X="0" Y="44" Width="370" Height="0" />
10 <Control Id="BottomLine" Type="Line" X="0" Y="234" Width="370" Height="0" />
11 <Control Id="Description" Type="Text" X="25" Y="23" Width="280" Height="20" Transparent="yes" NoPrefix="yes" Text="!(loc.InstallScopeDlgDescription)" />
12 <Control Id="Title" Type="Text" X="15" Y="6" Width="200" Height="15" Transparent="yes" NoPrefix="yes" Text="!(loc.InstallScopeDlgTitle)" />
13 <Control Id="BothScopes" Type="RadioButtonGroup" X="20" Y="55" Width="330" Height="120" Property="WixAppFolder" Hidden="yes" ShowCondition="Privileged AND (!(wix.WixUISupportPerUser) AND !(wix.WixUISupportPerMachine))">
14 <RadioButtonGroup Property="WixAppFolder">
15 <RadioButton Value="WixPerUserFolder" X="0" Y="0" Width="295" Height="16" Text="!(loc.InstallScopeDlgPerUser)" />
16 <RadioButton Value="WixPerMachineFolder" X="0" Y="60" Width="295" Height="16" Text="!(loc.InstallScopeDlgPerMachine)" />
17 </RadioButtonGroup>
18 </Control>
19 <Control Id="PerUserDescription" Type="Text" X="33" Y="70" Width="300" Height="36" Hidden="yes" NoPrefix="yes" Text="!(loc.InstallScopeDlgPerUserDescription)" ShowCondition="!(wix.WixUISupportPerUser)" />
20 <Control Id="NoPerUserDescription" Type="Text" X="33" Y="70" Width="300" Height="36" Hidden="yes" NoPrefix="yes" Text="!(loc.InstallScopeDlgNoPerUserDescription)" ShowCondition="NOT !(wix.WixUISupportPerUser)" />
21 <Control Id="PerMachineDescription" Type="Text" X="33" Y="131" Width="300" Height="36" Hidden="yes" NoPrefix="yes" Text="!(loc.InstallScopeDlgPerMachineDescription)" ShowCondition="Privileged" />
22 <Control Id="Back" Type="PushButton" X="180" Y="243" Width="56" Height="17" Text="!(loc.WixUIBack)" />
23 <Control Id="Next" Type="PushButton" X="236" Y="243" Width="56" Height="17" Default="yes" Text="!(loc.WixUINext)" />
24 <Control Id="Cancel" Type="PushButton" X="304" Y="243" Width="56" Height="17" Cancel="yes" Text="!(loc.WixUICancel)">
25 <Publish Event="SpawnDialog" Value="CancelDlg" />
26 </Control>
27 </Dialog>
28 </UI>
29 </Fragment>
30</Wix>
diff --git a/src/ext/UI/wixlib/InvalidDirDlg.wxs b/src/ext/UI/wixlib/InvalidDirDlg.wxs
new file mode 100644
index 00000000..8c3a6fc7
--- /dev/null
+++ b/src/ext/UI/wixlib/InvalidDirDlg.wxs
@@ -0,0 +1,16 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2
3
4<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
5 <Fragment>
6 <UI>
7 <Dialog Id="InvalidDirDlg" Width="260" Height="85" Title="!(loc.InvalidDirDlg_Title)">
8 <Control Id="OK" Type="PushButton" X="102" Y="57" Width="56" Height="17" Default="yes" Cancel="yes" Text="!(loc.WixUIOK)">
9 <Publish Event="EndDialog" Value="Return" />
10 </Control>
11 <Control Id="Text" Type="Text" X="48" Y="22" Width="194" Height="30" Text="!(loc.InvalidDirDlgText)" />
12 <Control Id="Icon" Type="Icon" X="15" Y="15" Width="24" Height="24" ToolTip="!(loc.InvalidDirDlgIconTooltip)" FixedSize="yes" IconSize="32" Text="!(loc.InvalidDirDlgIcon)" />
13 </Dialog>
14 </UI>
15 </Fragment>
16</Wix>
diff --git a/src/ext/UI/wixlib/License.rtf b/src/ext/UI/wixlib/License.rtf
new file mode 100644
index 00000000..044a0b05
--- /dev/null
+++ b/src/ext/UI/wixlib/License.rtf
Binary files differ
diff --git a/src/ext/UI/wixlib/LicenseAgreementDlg.wxs b/src/ext/UI/wixlib/LicenseAgreementDlg.wxs
new file mode 100644
index 00000000..aaa0611d
--- /dev/null
+++ b/src/ext/UI/wixlib/LicenseAgreementDlg.wxs
@@ -0,0 +1,30 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2
3
4<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
5 <Fragment>
6 <UI>
7 <Dialog Id="LicenseAgreementDlg" Width="370" Height="270" Title="!(loc.LicenseAgreementDlg_Title)">
8 <Control Id="BannerBitmap" Type="Bitmap" X="0" Y="0" Width="370" Height="44" TabSkip="no" Text="!(loc.LicenseAgreementDlgBannerBitmap)" />
9 <Control Id="BannerLine" Type="Line" X="0" Y="44" Width="370" Height="0" />
10 <Control Id="BottomLine" Type="Line" X="0" Y="234" Width="370" Height="0" />
11 <Control Id="Description" Type="Text" X="25" Y="23" Width="340" Height="15" Transparent="yes" NoPrefix="yes" Text="!(loc.LicenseAgreementDlgDescription)" />
12 <Control Id="Title" Type="Text" X="15" Y="6" Width="200" Height="15" Transparent="yes" NoPrefix="yes" Text="!(loc.LicenseAgreementDlgTitle)" />
13 <Control Id="LicenseAcceptedCheckBox" Type="CheckBox" X="20" Y="207" Width="330" Height="18" CheckBoxValue="1" Property="LicenseAccepted" Text="!(loc.LicenseAgreementDlgLicenseAcceptedCheckBox)" />
14 <Control Id="Print" Type="PushButton" X="112" Y="243" Width="56" Height="17" Text="!(loc.WixUIPrint)">
15 <Publish Event="DoAction" Value="WixUIPrintEula" />
16 </Control>
17 <Control Id="Back" Type="PushButton" X="180" Y="243" Width="56" Height="17" Text="!(loc.WixUIBack)" />
18 <Control Id="Next" Type="PushButton" X="236" Y="243" Width="56" Height="17" Default="yes" Text="!(loc.WixUINext)" DisableCondition="LicenseAccepted &lt;&gt; &quot;1&quot;" EnableCondition="LicenseAccepted = &quot;1&quot;">
19 <Publish Event="SpawnWaitDialog" Value="WaitForCostingDlg" Condition="!(wix.WixUICostingPopupOptOut) OR CostingComplete = 1" />
20 </Control>
21 <Control Id="Cancel" Type="PushButton" X="304" Y="243" Width="56" Height="17" Cancel="yes" Text="!(loc.WixUICancel)">
22 <Publish Event="SpawnDialog" Value="CancelDlg" />
23 </Control>
24 <Control Id="LicenseText" Type="ScrollableText" X="20" Y="60" Width="330" Height="140" Sunken="yes" TabSkip="no">
25 <Text SourceFile="!(wix.WixUILicenseRtf=$(var.licenseRtf))" />
26 </Control>
27 </Dialog>
28 </UI>
29 </Fragment>
30</Wix>
diff --git a/src/ext/UI/wixlib/MaintenanceTypeDlg.wxs b/src/ext/UI/wixlib/MaintenanceTypeDlg.wxs
new file mode 100644
index 00000000..b8cf6df0
--- /dev/null
+++ b/src/ext/UI/wixlib/MaintenanceTypeDlg.wxs
@@ -0,0 +1,58 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2
3
4<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
5 <Fragment>
6 <UI>
7 <Property Id="BURNMSIMODIFY" Secure="yes" />
8 <Property Id="BURNMSIREPAIR" Secure="yes" />
9 <Property Id="BURNMSIUNINSTALL" Secure="yes" />
10
11 <Dialog Id="MaintenanceTypeDlg" Width="370" Height="270" Title="!(loc.MaintenanceTypeDlg_Title)">
12
13 <Control Id="ChangeButton" Type="PushButton" X="40" Y="65" Width="80" Height="17" ToolTip="!(loc.MaintenanceTypeDlgChangeButtonTooltip)" Default="yes" Text="!(loc.MaintenanceTypeDlgChangeButton)"
14 DisableCondition="ARPNOMODIFY OR BURNMSIREPAIR OR BURNMSIUNINSTALL">
15 <Publish Property="WixUI_InstallMode" Value="Change" />
16 </Control>
17 <Control Id="ChangeText" Type="Text" X="60" Y="85" Width="280" Height="20" Text="!(loc.MaintenanceTypeDlgChangeText)"
18 HideCondition="ARPNOMODIFY OR BURNMSIREPAIR OR BURNMSIUNINSTALL"
19 />
20 <Control Id="ChangeDisabledText" Type="Text" X="60" Y="85" Width="280" Height="20" NoPrefix="yes" Text="!(loc.MaintenanceTypeDlgChangeDisabledText)"
21 Hidden="yes" ShowCondition="ARPNOMODIFY OR BURNMSIREPAIR OR BURNMSIUNINSTALL"
22 />
23
24 <Control Id="RepairButton" Type="PushButton" X="40" Y="118" Width="80" Height="17" ToolTip="!(loc.MaintenanceTypeDlgRepairButtonTooltip)" Text="!(loc.MaintenanceTypeDlgRepairButton)"
25 DisableCondition="ARPNOREPAIR OR BURNMSIMODIFY OR BURNMSIUNINSTALL">
26 <Publish Property="WixUI_InstallMode" Value="Repair" />
27 </Control>
28 <Control Id="RepairText" Type="Text" X="60" Y="138" Width="280" Height="30" Text="!(loc.MaintenanceTypeDlgRepairText)"
29 HideCondition="ARPNOREPAIR OR BURNMSIMODIFY OR BURNMSIUNINSTALL"
30 />
31 <Control Id="RepairDisabledText" Type="Text" X="60" Y="138" Width="280" Height="30" NoPrefix="yes" Text="!(loc.MaintenanceTypeDlgRepairDisabledText)"
32 Hidden="yes" ShowCondition="ARPNOREPAIR OR BURNMSIMODIFY OR BURNMSIUNINSTALL" />
33
34 <Control Id="RemoveButton" Type="PushButton" X="40" Y="171" Width="80" Height="17" ToolTip="!(loc.MaintenanceTypeDlgRemoveButtonTooltip)" Text="!(loc.MaintenanceTypeDlgRemoveButton)"
35 DisableCondition="ARPNOREMOVE OR BURNMSIREPAIR OR BURNMSIMODIFY">
36 <Publish Property="WixUI_InstallMode" Value="Remove" />
37 </Control>
38 <Control Id="RemoveText" Type="Text" X="60" Y="191" Width="280" Height="20" NoPrefix="yes" Text="!(loc.MaintenanceTypeDlgRemoveText)"
39 HideCondition="ARPNOREMOVE OR BURNMSIREPAIR OR BURNMSIMODIFY"
40 />
41 <Control Id="RemoveDisabledText" Type="Text" X="60" Y="191" Width="280" Height="20" NoPrefix="yes" Text="!(loc.MaintenanceTypeDlgRemoveDisabledText)" Hidden="yes"
42 ShowCondition="ARPNOREMOVE OR BURNMSIREPAIR OR BURNMSIMODIFY"
43 />
44
45 <Control Id="Back" Type="PushButton" X="180" Y="243" Width="56" Height="17" Text="!(loc.WixUIBack)" />
46 <Control Id="Next" Type="PushButton" X="236" Y="243" Width="56" Height="17" Disabled="yes" Text="!(loc.WixUINext)" />
47 <Control Id="Cancel" Type="PushButton" X="304" Y="243" Width="56" Height="17" Cancel="yes" Text="!(loc.WixUICancel)">
48 <Publish Event="SpawnDialog" Value="CancelDlg" />
49 </Control>
50 <Control Id="BannerBitmap" Type="Bitmap" X="0" Y="0" Width="370" Height="44" TabSkip="no" Text="!(loc.MaintenanceTypeDlgBannerBitmap)" />
51 <Control Id="BannerLine" Type="Line" X="0" Y="44" Width="370" Height="0" />
52 <Control Id="BottomLine" Type="Line" X="0" Y="234" Width="370" Height="0" />
53 <Control Id="Title" Type="Text" X="15" Y="6" Width="340" Height="15" Transparent="yes" NoPrefix="yes" Text="!(loc.MaintenanceTypeDlgTitle)" />
54 <Control Id="Description" Type="Text" X="25" Y="23" Width="340" Height="20" Transparent="yes" NoPrefix="yes" Text="!(loc.MaintenanceTypeDlgDescription)" />
55 </Dialog>
56 </UI>
57 </Fragment>
58</Wix>
diff --git a/src/ext/UI/wixlib/MaintenanceWelcomeDlg.wxs b/src/ext/UI/wixlib/MaintenanceWelcomeDlg.wxs
new file mode 100644
index 00000000..7208aff3
--- /dev/null
+++ b/src/ext/UI/wixlib/MaintenanceWelcomeDlg.wxs
@@ -0,0 +1,26 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2
3
4<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
5 <Fragment>
6 <UI>
7 <Dialog Id="MaintenanceWelcomeDlg" Width="370" Height="270" Title="!(loc.MaintenanceWelcomeDlg_Title)">
8 <Control Id="Next" Type="PushButton" X="236" Y="243" Width="56" Height="17" Default="yes" Text="!(loc.WixUINext)">
9 <Publish Event="SpawnWaitDialog" Value="WaitForCostingDlg" Condition="!(wix.WixUICostingPopupOptOut) OR CostingComplete = 1" />
10 </Control>
11 <Control Id="Cancel" Type="PushButton" X="304" Y="243" Width="56" Height="17" Cancel="yes" Text="!(loc.WixUICancel)">
12 <Publish Event="SpawnDialog" Value="CancelDlg" />
13 </Control>
14 <Control Id="Bitmap" Type="Bitmap" X="0" Y="0" Width="370" Height="234" TabSkip="no" Text="!(loc.MaintenanceWelcomeDlgBitmap)" />
15 <Control Id="Back" Type="PushButton" X="180" Y="243" Width="56" Height="17" Disabled="yes" Text="!(loc.WixUIBack)" />
16 <Control Id="BottomLine" Type="Line" X="0" Y="234" Width="370" Height="0" />
17 <Control Id="Title" Type="Text" X="135" Y="20" Width="220" Height="60" Transparent="yes" NoPrefix="yes" Text="!(loc.MaintenanceWelcomeDlgTitle)" />
18 <Control Id="Description" Type="Text" X="135" Y="70" Width="220" Height="60" Transparent="yes" NoPrefix="yes" Text="!(loc.MaintenanceWelcomeDlgDescription)" />
19 </Dialog>
20
21 <InstallUISequence>
22 <Show Dialog="MaintenanceWelcomeDlg" Before="ProgressDlg" Overridable="yes" Condition="Installed AND NOT RESUME AND NOT Preselected AND NOT PATCH" />
23 </InstallUISequence>
24 </UI>
25 </Fragment>
26</Wix>
diff --git a/src/ext/UI/wixlib/MsiRMFilesInUse.wxs b/src/ext/UI/wixlib/MsiRMFilesInUse.wxs
new file mode 100644
index 00000000..9881f0e6
--- /dev/null
+++ b/src/ext/UI/wixlib/MsiRMFilesInUse.wxs
@@ -0,0 +1,34 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2
3
4<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
5 <Fragment>
6 <UI>
7 <Property Id="WixUIRMOption" Value="UseRM" />
8 <Dialog Id="MsiRMFilesInUse" Width="370" Height="270" Title="!(loc.MsiRMFilesInUse_Title)" KeepModeless="yes">
9 <Control Id="OK" Type="PushButton" X="240" Y="243" Width="56" Height="17" Default="yes" Text="!(loc.WixUIOK)">
10 <Publish Event="EndDialog" Value="Return" />
11 <Publish Event="RMShutdownAndRestart" Value="0" Condition="WixUIRMOption~=&quot;UseRM&quot;" />
12 </Control>
13 <Control Id="Cancel" Type="PushButton" X="304" Y="243" Width="56" Height="17" Cancel="yes" Text="!(loc.WixUICancel)">
14 <Publish Event="EndDialog" Value="Exit" />
15 </Control>
16
17 <Control Id="ShutdownOption" Type="RadioButtonGroup" X="26" Y="190" Width="305" Height="45" Property="WixUIRMOption">
18 <RadioButtonGroup Property="WixUIRMOption">
19 <RadioButton Value="UseRM" X="0" Y="0" Width="295" Height="16" Text="!(loc.MsiRMFilesInUseUseRM)" />
20 <RadioButton Value="DontUseRM" X="0" Y="20" Width="295" Height="16" Text="!(loc.MsiRMFilesInUseDontUseRM)" />
21 </RadioButtonGroup>
22 </Control>
23
24 <Control Id="List" Type="ListBox" X="20" Y="100" Width="330" Height="80" Property="FileInUseProcess" Sunken="yes" TabSkip="yes" />
25 <Control Id="BannerBitmap" Type="Bitmap" X="0" Y="0" Width="370" Height="44" TabSkip="no" Text="!(loc.MsiRMFilesInUseBannerBitmap)" />
26 <Control Id="Text" Type="Text" X="20" Y="55" Width="330" Height="45" Text="!(loc.MsiRMFilesInUseText)" />
27 <Control Id="BannerLine" Type="Line" X="0" Y="44" Width="370" Height="0" />
28 <Control Id="BottomLine" Type="Line" X="0" Y="234" Width="370" Height="0" />
29 <Control Id="Description" Type="Text" X="20" Y="23" Width="280" Height="20" Transparent="yes" NoPrefix="yes" Text="!(loc.MsiRMFilesInUseDescription)" />
30 <Control Id="Title" Type="Text" X="15" Y="6" Width="200" Height="15" Transparent="yes" NoPrefix="yes" Text="!(loc.MsiRMFilesInUseTitle)" />
31 </Dialog>
32 </UI>
33 </Fragment>
34</Wix>
diff --git a/src/ext/UI/wixlib/OutOfDiskDlg.wxs b/src/ext/UI/wixlib/OutOfDiskDlg.wxs
new file mode 100644
index 00000000..e46c10b2
--- /dev/null
+++ b/src/ext/UI/wixlib/OutOfDiskDlg.wxs
@@ -0,0 +1,21 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2
3
4<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
5 <Fragment>
6 <UI>
7 <Dialog Id="OutOfDiskDlg" Width="370" Height="270" Title="!(loc.OutOfDiskDlg_Title)">
8 <Control Id="OK" Type="PushButton" X="304" Y="243" Width="56" Height="17" Default="yes" Cancel="yes" Text="!(loc.WixUIOK)">
9 <Publish Event="EndDialog" Value="Return" />
10 </Control>
11 <Control Id="BannerBitmap" Type="Bitmap" X="0" Y="0" Width="370" Height="44" TabSkip="no" Text="!(loc.OutOfDiskDlgBannerBitmap)" />
12 <Control Id="Text" Type="Text" X="20" Y="53" Width="330" Height="60" Text="!(loc.OutOfDiskDlgText)" />
13 <Control Id="BannerLine" Type="Line" X="0" Y="44" Width="370" Height="0" />
14 <Control Id="BottomLine" Type="Line" X="0" Y="234" Width="370" Height="0" />
15 <Control Id="Description" Type="Text" X="20" Y="20" Width="280" Height="20" Transparent="yes" NoPrefix="yes" Text="!(loc.OutOfDiskDlgDescription)" />
16 <Control Id="Title" Type="Text" X="15" Y="6" Width="200" Height="15" Transparent="yes" NoPrefix="yes" Text="!(loc.OutOfDiskDlgTitle)" />
17 <Control Id="VolumeList" Type="VolumeCostList" X="20" Y="120" Width="330" Height="100" Sunken="yes" Fixed="yes" Remote="yes" Text="!(loc.OutOfDiskDlgVolumeList)" />
18 </Dialog>
19 </UI>
20 </Fragment>
21</Wix>
diff --git a/src/ext/UI/wixlib/OutOfRbDiskDlg.wxs b/src/ext/UI/wixlib/OutOfRbDiskDlg.wxs
new file mode 100644
index 00000000..79a1470f
--- /dev/null
+++ b/src/ext/UI/wixlib/OutOfRbDiskDlg.wxs
@@ -0,0 +1,25 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2
3
4<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
5 <Fragment>
6 <UI>
7 <Dialog Id="OutOfRbDiskDlg" Width="370" Height="270" Title="!(loc.OutOfRbDiskDlg_Title)">
8 <Control Id="No" Type="PushButton" X="304" Y="243" Width="56" Height="17" Default="yes" Cancel="yes" Text="!(loc.WixUINo)">
9 <Publish Event="EndDialog" Value="Return" />
10 </Control>
11 <Control Id="Yes" Type="PushButton" X="240" Y="243" Width="56" Height="17" Text="!(loc.WixUIYes)">
12 <Publish Event="EnableRollback" Value="False" />
13 <Publish Event="EndDialog" Value="Return" />
14 </Control>
15 <Control Id="BannerBitmap" Type="Bitmap" X="0" Y="0" Width="370" Height="44" TabSkip="no" Text="!(loc.OutOfRbDiskDlgBannerBitmap)" />
16 <Control Id="Text" Type="Text" X="20" Y="53" Width="330" Height="90" Text="!(loc.OutOfRbDiskDlgText) !(loc.OutOfRbDiskDlgText2)" />
17 <Control Id="BannerLine" Type="Line" X="0" Y="44" Width="370" Height="0" />
18 <Control Id="BottomLine" Type="Line" X="0" Y="234" Width="370" Height="0" />
19 <Control Id="Description" Type="Text" X="20" Y="20" Width="280" Height="20" Transparent="yes" NoPrefix="yes" Text="!(loc.OutOfRbDiskDlgDescription)" />
20 <Control Id="Title" Type="Text" X="15" Y="6" Width="200" Height="15" Transparent="yes" NoPrefix="yes" Text="!(loc.OutOfRbDiskDlgTitle)" />
21 <Control Id="VolumeList" Type="VolumeCostList" X="20" Y="150" Width="330" Height="70" Sunken="yes" Fixed="yes" Remote="yes" ShowRollbackCost="yes" Text="!(loc.OutOfRbDiskDlgVolumeList)" />
22 </Dialog>
23 </UI>
24 </Fragment>
25</Wix>
diff --git a/src/ext/UI/wixlib/PrepareDlg.wxs b/src/ext/UI/wixlib/PrepareDlg.wxs
new file mode 100644
index 00000000..1b22b04f
--- /dev/null
+++ b/src/ext/UI/wixlib/PrepareDlg.wxs
@@ -0,0 +1,30 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2
3
4<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
5 <Fragment>
6 <UI>
7 <Dialog Id="PrepareDlg" Width="370" Height="270" Title="!(loc.PrepareDlg_Title)" Modeless="yes">
8 <Control Id="Cancel" Type="PushButton" X="304" Y="243" Width="56" Height="17" Default="yes" Cancel="yes" Text="!(loc.WixUICancel)">
9 <Publish Event="SpawnDialog" Value="CancelDlg" />
10 </Control>
11 <Control Id="Bitmap" Type="Bitmap" X="0" Y="0" Width="370" Height="234" TabSkip="no" Text="!(loc.PrepareDlgBitmap)" />
12 <Control Id="BottomLine" Type="Line" X="0" Y="234" Width="370" Height="0" />
13 <Control Id="Description" Type="Text" X="135" Y="70" Width="220" Height="20" Transparent="yes" NoPrefix="yes" Text="!(loc.PrepareDlgDescription)" />
14 <Control Id="Title" Type="Text" X="135" Y="20" Width="220" Height="60" Transparent="yes" NoPrefix="yes" Text="!(loc.PrepareDlgTitle)" />
15 <Control Id="Back" Type="PushButton" X="180" Y="243" Width="56" Height="17" Disabled="yes" TabSkip="yes" Text="!(loc.WixUIBack)" />
16 <Control Id="Next" Type="PushButton" X="236" Y="243" Width="56" Height="17" Disabled="yes" TabSkip="yes" Text="!(loc.WixUINext)" />
17 <Control Id="ActionData" Type="Text" X="135" Y="125" Width="220" Height="30" Transparent="yes" NoPrefix="yes">
18 <Subscribe Event="ActionData" Attribute="Text" />
19 </Control>
20 <Control Id="ActionText" Type="Text" X="135" Y="100" Width="220" Height="20" Transparent="yes" NoPrefix="yes">
21 <Subscribe Event="ActionText" Attribute="Text" />
22 </Control>
23 </Dialog>
24
25 <InstallUISequence>
26 <Show Dialog="PrepareDlg" Before="AppSearch" Overridable="yes" />
27 </InstallUISequence>
28 </UI>
29 </Fragment>
30</Wix>
diff --git a/src/ext/UI/wixlib/ProgressDlg.wxs b/src/ext/UI/wixlib/ProgressDlg.wxs
new file mode 100644
index 00000000..057b104f
--- /dev/null
+++ b/src/ext/UI/wixlib/ProgressDlg.wxs
@@ -0,0 +1,41 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2
3
4<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
5 <Fragment>
6 <UI>
7 <Dialog Id="ProgressDlg" Width="370" Height="270" Title="!(loc.ProgressDlg_Title)" Modeless="yes">
8 <Control Id="Cancel" Type="PushButton" X="304" Y="243" Width="56" Height="17" Default="yes" Cancel="yes" Text="!(loc.WixUICancel)">
9 <Publish Event="SpawnDialog" Value="CancelDlg" />
10 </Control>
11 <Control Id="BannerBitmap" Type="Bitmap" X="0" Y="0" Width="370" Height="44" TabSkip="no" Text="!(loc.ProgressDlgBannerBitmap)" />
12 <Control Id="Back" Type="PushButton" X="180" Y="243" Width="56" Height="17" Disabled="yes" Text="!(loc.WixUIBack)" />
13 <Control Id="Next" Type="PushButton" X="236" Y="243" Width="56" Height="17" Disabled="yes" Text="!(loc.WixUINext)" />
14 <Control Id="BannerLine" Type="Line" X="0" Y="44" Width="370" Height="0" />
15 <Control Id="BottomLine" Type="Line" X="0" Y="234" Width="370" Height="0" />
16 <!-- mutually exclusive title and description strings overlap -->
17 <Control Id="TextInstalling" Type="Text" X="20" Y="65" Width="330" Height="35" Hidden="yes" NoPrefix="yes" Text="!(loc.ProgressDlgTextInstalling)" ShowCondition="NOT Installed OR (Installed AND (RESUME OR Preselected) AND NOT PATCH)" />
18 <Control Id="TitleInstalling" Type="Text" X="20" Y="15" Width="330" Height="15" Transparent="yes" NoPrefix="yes" Hidden="yes" Text="!(loc.ProgressDlgTitleInstalling)" ShowCondition="NOT Installed OR (Installed AND (RESUME OR Preselected) AND NOT PATCH)" />
19 <Control Id="TextChanging" Type="Text" X="20" Y="65" Width="330" Height="35" Hidden="yes" NoPrefix="yes" Text="!(loc.ProgressDlgTextChanging)" ShowCondition="WixUI_InstallMode = &quot;Change&quot;" />
20 <Control Id="TitleChanging" Type="Text" X="20" Y="15" Width="330" Height="15" Transparent="yes" NoPrefix="yes" Hidden="yes" Text="!(loc.ProgressDlgTitleChanging)" ShowCondition="WixUI_InstallMode = &quot;Change&quot;" />
21 <Control Id="TextRepairing" Type="Text" X="20" Y="65" Width="330" Height="35" Hidden="yes" NoPrefix="yes" Text="!(loc.ProgressDlgTextRepairing)" ShowCondition="WixUI_InstallMode = &quot;Repair&quot;" />
22 <Control Id="TitleRepairing" Type="Text" X="20" Y="15" Width="330" Height="15" Transparent="yes" NoPrefix="yes" Hidden="yes" Text="!(loc.ProgressDlgTitleRepairing)" ShowCondition="WixUI_InstallMode = &quot;Repair&quot;" />
23 <Control Id="TextRemoving" Type="Text" X="20" Y="65" Width="330" Height="35" Hidden="yes" NoPrefix="yes" Text="!(loc.ProgressDlgTextRemoving)" ShowCondition="WixUI_InstallMode = &quot;Remove&quot;" />
24 <Control Id="TitleRemoving" Type="Text" X="20" Y="15" Width="330" Height="15" Transparent="yes" NoPrefix="yes" Hidden="yes" Text="!(loc.ProgressDlgTitleRemoving)" ShowCondition="WixUI_InstallMode = &quot;Remove&quot;" />
25 <Control Id="TextUpdating" Type="Text" X="20" Y="65" Width="330" Height="35" Hidden="yes" NoPrefix="yes" Text="!(loc.ProgressDlgTextUpdating)" ShowCondition="WixUI_InstallMode = &quot;Update&quot;" />
26 <Control Id="TitleUpdating" Type="Text" X="20" Y="15" Width="330" Height="15" Transparent="yes" NoPrefix="yes" Hidden="yes" Text="!(loc.ProgressDlgTitleUpdating)" ShowCondition="WixUI_InstallMode = &quot;Update&quot;" />
27 <Control Id="ActionText" Type="Text" X="70" Y="100" Width="285" Height="10">
28 <Subscribe Event="ActionText" Attribute="Text" />
29 </Control>
30 <Control Id="ProgressBar" Type="ProgressBar" X="20" Y="115" Width="330" Height="10" ProgressBlocks="yes" Text="!(loc.ProgressDlgProgressBar)">
31 <Subscribe Event="SetProgress" Attribute="Progress" />
32 </Control>
33 <Control Id="StatusLabel" Type="Text" X="20" Y="100" Width="50" Height="10" Text="!(loc.ProgressDlgStatusLabel)" />
34 </Dialog>
35
36 <InstallUISequence>
37 <Show Dialog="ProgressDlg" Before="ExecuteAction" Overridable="yes" />
38 </InstallUISequence>
39 </UI>
40 </Fragment>
41</Wix>
diff --git a/src/ext/UI/wixlib/ResumeDlg.wxs b/src/ext/UI/wixlib/ResumeDlg.wxs
new file mode 100644
index 00000000..67e1cc58
--- /dev/null
+++ b/src/ext/UI/wixlib/ResumeDlg.wxs
@@ -0,0 +1,39 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2
3
4<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
5 <Fragment>
6 <UI>
7 <Dialog Id="ResumeDlg" Width="370" Height="270" Title="!(loc.ResumeDlg_Title)">
8 <Control Id="Install" Type="PushButton" ElevationShield="yes" X="212" Y="243" Width="80" Height="17" Default="yes" Text="!(loc.ResumeDlgInstall)" Hidden="yes" ShowCondition="ALLUSERS">
9 <Publish Event="SpawnWaitDialog" Value="WaitForCostingDlg" Condition="!(wix.WixUICostingPopupOptOut) OR CostingComplete = 1" />
10 <Publish Event="EndDialog" Value="Return" Condition="OutOfDiskSpace &lt;&gt; 1" />
11 <Publish Event="SpawnDialog" Value="OutOfRbDiskDlg" Condition="OutOfDiskSpace = 1 AND OutOfNoRbDiskSpace = 0 AND (PROMPTROLLBACKCOST=&quot;P&quot; OR NOT PROMPTROLLBACKCOST)" />
12 <Publish Event="EndDialog" Value="Return" Condition="OutOfDiskSpace = 1 AND OutOfNoRbDiskSpace = 0 AND PROMPTROLLBACKCOST=&quot;D&quot;" />
13 <Publish Event="EnableRollback" Value="False" Condition="OutOfDiskSpace = 1 AND OutOfNoRbDiskSpace = 0 AND PROMPTROLLBACKCOST=&quot;D&quot;" />
14 <Publish Event="SpawnDialog" Value="OutOfDiskDlg" Condition="(OutOfDiskSpace = 1 AND OutOfNoRbDiskSpace = 1) OR (OutOfDiskSpace = 1 AND PROMPTROLLBACKCOST=&quot;F&quot;)" />
15 </Control>
16 <Control Id="InstallNoShield" Type="PushButton" ElevationShield="no" X="212" Y="243" Width="80" Height="17" Default="yes" Text="!(loc.ResumeDlgInstall)" Hidden="yes" ShowCondition="NOT ALLUSERS">
17 <Publish Event="SpawnWaitDialog" Value="WaitForCostingDlg" Condition="!(wix.WixUICostingPopupOptOut) OR CostingComplete = 1" />
18 <Publish Event="EndDialog" Value="Return" Condition="OutOfDiskSpace &lt;&gt; 1" />
19 <Publish Event="SpawnDialog" Value="OutOfRbDiskDlg" Condition="OutOfDiskSpace = 1 AND OutOfNoRbDiskSpace = 0 AND (PROMPTROLLBACKCOST=&quot;P&quot; OR NOT PROMPTROLLBACKCOST)" />
20 <Publish Event="EndDialog" Value="Return" Condition="OutOfDiskSpace = 1 AND OutOfNoRbDiskSpace = 0 AND PROMPTROLLBACKCOST=&quot;D&quot;" />
21 <Publish Event="EnableRollback" Value="False" Condition="OutOfDiskSpace = 1 AND OutOfNoRbDiskSpace = 0 AND PROMPTROLLBACKCOST=&quot;D&quot;" />
22 <Publish Event="SpawnDialog" Value="OutOfDiskDlg" Condition="(OutOfDiskSpace = 1 AND OutOfNoRbDiskSpace = 1) OR (OutOfDiskSpace = 1 AND PROMPTROLLBACKCOST=&quot;F&quot;)" />
23 </Control>
24 <Control Id="Cancel" Type="PushButton" X="304" Y="243" Width="56" Height="17" Cancel="yes" Text="!(loc.WixUICancel)">
25 <Publish Event="SpawnDialog" Value="CancelDlg" />
26 </Control>
27 <Control Id="Bitmap" Type="Bitmap" X="0" Y="0" Width="370" Height="234" TabSkip="no" Text="!(loc.ResumeDlgBitmap)" />
28 <Control Id="Back" Type="PushButton" X="156" Y="243" Width="56" Height="17" Disabled="yes" Text="!(loc.WixUIBack)" />
29 <Control Id="BottomLine" Type="Line" X="0" Y="234" Width="370" Height="0" />
30 <Control Id="Description" Type="Text" X="135" Y="80" Width="220" Height="60" Transparent="yes" NoPrefix="yes" Text="!(loc.ResumeDlgDescription)" />
31 <Control Id="Title" Type="Text" X="135" Y="20" Width="220" Height="60" Transparent="yes" NoPrefix="yes" Text="!(loc.ResumeDlgTitle)" />
32 </Dialog>
33
34 <InstallUISequence>
35 <Show Dialog="ResumeDlg" Before="ProgressDlg" Overridable="yes" Condition="Installed AND (RESUME OR Preselected)" />
36 </InstallUISequence>
37 </UI>
38 </Fragment>
39</Wix>
diff --git a/src/ext/UI/wixlib/SetupTypeDlg.wxs b/src/ext/UI/wixlib/SetupTypeDlg.wxs
new file mode 100644
index 00000000..214e440a
--- /dev/null
+++ b/src/ext/UI/wixlib/SetupTypeDlg.wxs
@@ -0,0 +1,35 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2
3
4<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
5 <Fragment>
6 <UI>
7 <Dialog Id="SetupTypeDlg" Width="370" Height="270" Title="!(loc.SetupTypeDlg_Title)">
8 <Control Id="TypicalButton" Type="PushButton" X="40" Y="65" Width="80" Height="17" ToolTip="!(loc.SetupTypeDlgTypicalButtonTooltip)" Default="yes" Text="!(loc.SetupTypeDlgTypicalButton)">
9 <Publish Property="WixUI_InstallMode" Value="InstallTypical" />
10 <Publish Event="SetInstallLevel" Value="3" />
11 </Control>
12 <Control Id="CustomButton" Type="PushButton" X="40" Y="118" Width="80" Height="17" ToolTip="!(loc.SetupTypeDlgCustomButtonTooltip)" Text="!(loc.SetupTypeDlgCustomButton)">
13 <Publish Property="WixUI_InstallMode" Value="InstallCustom" />
14 </Control>
15 <Control Id="CompleteButton" Type="PushButton" X="40" Y="171" Width="80" Height="17" ToolTip="!(loc.SetupTypeDlgCompleteButtonTooltip)" Text="!(loc.SetupTypeDlgCompleteButton)">
16 <Publish Property="WixUI_InstallMode" Value="InstallComplete" />
17 <Publish Event="SetInstallLevel" Value="1000" />
18 </Control>
19 <Control Id="Back" Type="PushButton" X="180" Y="243" Width="56" Height="17" Text="!(loc.WixUIBack)" />
20 <Control Id="Next" Type="PushButton" X="236" Y="243" Width="56" Height="17" Disabled="yes" Text="!(loc.WixUINext)" />
21 <Control Id="Cancel" Type="PushButton" X="304" Y="243" Width="56" Height="17" Cancel="yes" Text="!(loc.WixUICancel)">
22 <Publish Event="SpawnDialog" Value="CancelDlg" />
23 </Control>
24 <Control Id="BannerBitmap" Type="Bitmap" X="0" Y="0" Width="370" Height="44" TabSkip="no" Text="!(loc.SetupTypeDlgBannerBitmap)" />
25 <Control Id="BannerLine" Type="Line" X="0" Y="44" Width="370" Height="0" />
26 <Control Id="BottomLine" Type="Line" X="0" Y="234" Width="370" Height="0" />
27 <Control Id="Title" Type="Text" X="15" Y="6" Width="200" Height="15" Transparent="yes" NoPrefix="yes" Text="!(loc.SetupTypeDlgTitle)" />
28 <Control Id="Description" Type="Text" X="25" Y="23" Width="280" Height="15" Transparent="yes" NoPrefix="yes" Text="!(loc.SetupTypeDlgDescription)" />
29 <Control Id="TypicalText" Type="Text" X="60" Y="85" Width="280" Height="20" Text="!(loc.SetupTypeDlgTypicalText)" />
30 <Control Id="CustomText" Type="Text" X="60" Y="138" Width="280" Height="30" Text="!(loc.SetupTypeDlgCustomText)" />
31 <Control Id="CompleteText" Type="Text" X="60" Y="191" Width="280" Height="20" Text="!(loc.SetupTypeDlgCompleteText)" />
32 </Dialog>
33 </UI>
34 </Fragment>
35</Wix>
diff --git a/src/ext/UI/wixlib/UserExit.wxs b/src/ext/UI/wixlib/UserExit.wxs
new file mode 100644
index 00000000..7c3a07ed
--- /dev/null
+++ b/src/ext/UI/wixlib/UserExit.wxs
@@ -0,0 +1,28 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2
3
4<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
5 <Fragment>
6 <UI>
7 <Dialog Id="UserExit" Width="370" Height="270" Title="!(loc.UserExit_Title)">
8 <Control Id="Finish" Type="PushButton" X="236" Y="243" Width="56" Height="17" Default="yes" Cancel="yes" Text="!(loc.WixUIFinish)">
9 <Publish Event="EndDialog" Value="Exit" />
10 </Control>
11 <Control Id="Cancel" Type="PushButton" X="304" Y="243" Width="56" Height="17" Disabled="yes" Text="!(loc.WixUICancel)" />
12 <Control Id="Bitmap" Type="Bitmap" X="0" Y="0" Width="370" Height="234" TabSkip="no" Text="!(loc.UserExitBitmap)" />
13 <Control Id="Back" Type="PushButton" X="180" Y="243" Width="56" Height="17" Disabled="yes" Text="!(loc.WixUIBack)" />
14 <Control Id="BottomLine" Type="Line" X="0" Y="234" Width="370" Height="0" />
15 <Control Id="Title" Type="Text" X="135" Y="20" Width="220" Height="60" Transparent="yes" NoPrefix="yes" Text="!(loc.UserExitTitle)" />
16 <Control Id="Description" Type="Text" X="135" Y="80" Width="220" Height="80" Transparent="yes" NoPrefix="yes" Text="!(loc.UserExitDescription1) !(loc.UserExitDescription2)" />
17 </Dialog>
18
19 <InstallUISequence>
20 <Show Dialog="UserExit" OnExit="cancel" Overridable="yes" />
21 </InstallUISequence>
22
23 <AdminUISequence>
24 <Show Dialog="UserExit" OnExit="cancel" Overridable="yes" />
25 </AdminUISequence>
26 </UI>
27 </Fragment>
28</Wix>
diff --git a/src/ext/UI/wixlib/VerifyReadyDlg.wxs b/src/ext/UI/wixlib/VerifyReadyDlg.wxs
new file mode 100644
index 00000000..77e5512f
--- /dev/null
+++ b/src/ext/UI/wixlib/VerifyReadyDlg.wxs
@@ -0,0 +1,97 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2
3
4<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
5 <Fragment>
6 <UI>
7 <Dialog Id="VerifyReadyDlg" Width="370" Height="270" Title="!(loc.VerifyReadyDlg_Title)" TrackDiskSpace="yes">
8 <Control Id="Install" Type="PushButton" ElevationShield="yes" X="212" Y="243" Width="80" Height="17" Default="yes" Hidden="yes" Disabled="yes" Text="!(loc.VerifyReadyDlgInstall)" ShowCondition="NOT Installed AND ALLUSERS" EnableCondition="NOT Installed" DefaultCondition="NOT Installed">
9 <Publish Event="EndDialog" Value="Return" Condition="OutOfDiskSpace &lt;&gt; 1" />
10 <Publish Event="SpawnDialog" Value="OutOfRbDiskDlg" Condition="OutOfDiskSpace = 1 AND OutOfNoRbDiskSpace = 0 AND (PROMPTROLLBACKCOST=&quot;P&quot; OR NOT PROMPTROLLBACKCOST)" />
11 <Publish Event="EndDialog" Value="Return" Condition="OutOfDiskSpace = 1 AND OutOfNoRbDiskSpace = 0 AND PROMPTROLLBACKCOST=&quot;D&quot;" />
12 <Publish Event="EnableRollback" Value="False" Condition="OutOfDiskSpace = 1 AND OutOfNoRbDiskSpace = 0 AND PROMPTROLLBACKCOST=&quot;D&quot;" />
13 <Publish Event="SpawnDialog" Value="OutOfDiskDlg" Condition="(OutOfDiskSpace = 1 AND OutOfNoRbDiskSpace = 1) OR (OutOfDiskSpace = 1 AND PROMPTROLLBACKCOST=&quot;F&quot;)" />
14 </Control>
15 <Control Id="InstallNoShield" Type="PushButton" ElevationShield="no" X="212" Y="243" Width="80" Height="17" Default="yes" Hidden="yes" Disabled="yes" Text="!(loc.VerifyReadyDlgInstall)" ShowCondition="NOT Installed AND NOT ALLUSERS" EnableCondition="NOT Installed" DefaultCondition="NOT Installed">
16 <Publish Event="EndDialog" Value="Return" Condition="OutOfDiskSpace &lt;&gt; 1" />
17 <Publish Event="SpawnDialog" Value="OutOfRbDiskDlg" Condition="OutOfDiskSpace = 1 AND OutOfNoRbDiskSpace = 0 AND (PROMPTROLLBACKCOST=&quot;P&quot; OR NOT PROMPTROLLBACKCOST)" />
18 <Publish Event="EndDialog" Value="Return" Condition="OutOfDiskSpace = 1 AND OutOfNoRbDiskSpace = 0 AND PROMPTROLLBACKCOST=&quot;D&quot;" />
19 <Publish Event="EnableRollback" Value="False" Condition="OutOfDiskSpace = 1 AND OutOfNoRbDiskSpace = 0 AND PROMPTROLLBACKCOST=&quot;D&quot;" />
20 <Publish Event="SpawnDialog" Value="OutOfDiskDlg" Condition="(OutOfDiskSpace = 1 AND OutOfNoRbDiskSpace = 1) OR (OutOfDiskSpace = 1 AND PROMPTROLLBACKCOST=&quot;F&quot;)" />
21 </Control>
22 <Control Id="Change" Type="PushButton" ElevationShield="yes" X="212" Y="243" Width="80" Height="17" Default="yes" Hidden="yes" Disabled="yes" Text="!(loc.VerifyReadyDlgChange)" ShowCondition="WixUI_InstallMode = &quot;Change&quot; AND ALLUSERS AND (ADDLOCAL OR REMOVE)" EnableCondition="WixUI_InstallMode = &quot;Change&quot;" DefaultCondition="WixUI_InstallMode = &quot;Change&quot;">
23 <Publish Event="EndDialog" Value="Return" Condition="OutOfDiskSpace &lt;&gt; 1" />
24 <Publish Event="SpawnDialog" Value="OutOfRbDiskDlg" Condition="OutOfDiskSpace = 1 AND OutOfNoRbDiskSpace = 0 AND (PROMPTROLLBACKCOST=&quot;P&quot; OR NOT PROMPTROLLBACKCOST)" />
25 <Publish Event="EndDialog" Value="Return" Condition="OutOfDiskSpace = 1 AND OutOfNoRbDiskSpace = 0 AND PROMPTROLLBACKCOST=&quot;D&quot;" />
26 <Publish Event="EnableRollback" Value="False" Condition="OutOfDiskSpace = 1 AND OutOfNoRbDiskSpace = 0 AND PROMPTROLLBACKCOST=&quot;D&quot;" />
27 <Publish Event="SpawnDialog" Value="OutOfDiskDlg" Condition="(OutOfDiskSpace = 1 AND OutOfNoRbDiskSpace = 1) OR (OutOfDiskSpace = 1 AND PROMPTROLLBACKCOST=&quot;F&quot;)" />
28 </Control>
29 <Control Id="ChangeNoShield" Type="PushButton" ElevationShield="no" X="212" Y="243" Width="80" Height="17" Default="yes" Hidden="yes" Disabled="yes" Text="!(loc.VerifyReadyDlgChange)" ShowCondition="WixUI_InstallMode = &quot;Change&quot; AND (NOT ALLUSERS OR (NOT ADDLOCAL AND NOT REMOVE))" EnableCondition="WixUI_InstallMode = &quot;Change&quot;" DefaultCondition="WixUI_InstallMode = &quot;Change&quot;">
30 <Publish Event="EndDialog" Value="Return" Condition="OutOfDiskSpace &lt;&gt; 1" />
31 <Publish Event="SpawnDialog" Value="OutOfRbDiskDlg" Condition="OutOfDiskSpace = 1 AND OutOfNoRbDiskSpace = 0 AND (PROMPTROLLBACKCOST=&quot;P&quot; OR NOT PROMPTROLLBACKCOST)" />
32 <Publish Event="EndDialog" Value="Return" Condition="OutOfDiskSpace = 1 AND OutOfNoRbDiskSpace = 0 AND PROMPTROLLBACKCOST=&quot;D&quot;" />
33 <Publish Event="EnableRollback" Value="False" Condition="OutOfDiskSpace = 1 AND OutOfNoRbDiskSpace = 0 AND PROMPTROLLBACKCOST=&quot;D&quot;" />
34 <Publish Event="SpawnDialog" Value="OutOfDiskDlg" Condition="(OutOfDiskSpace = 1 AND OutOfNoRbDiskSpace = 1) OR (OutOfDiskSpace = 1 AND PROMPTROLLBACKCOST=&quot;F&quot;)" />
35 </Control>
36 <Control Id="Repair" Type="PushButton" X="212" Y="243" Width="80" Height="17" Default="yes" Hidden="yes" Disabled="yes" Text="!(loc.VerifyReadyDlgRepair)" ShowCondition="WixUI_InstallMode = &quot;Repair&quot;" EnableCondition="WixUI_InstallMode = &quot;Repair&quot;" DefaultCondition="WixUI_InstallMode = &quot;Repair&quot;">
37 <Publish Event="ReinstallMode" Value="ecmus" Condition="OutOfDiskSpace &lt;&gt; 1" />
38 <Publish Event="Reinstall" Value="All" Condition="OutOfDiskSpace &lt;&gt; 1" />
39 <Publish Event="EndDialog" Value="Return" Condition="OutOfDiskSpace &lt;&gt; 1" />
40 <Publish Event="SpawnDialog" Value="OutOfRbDiskDlg" Condition="OutOfDiskSpace = 1 AND OutOfNoRbDiskSpace = 0 AND (PROMPTROLLBACKCOST=&quot;P&quot; OR NOT PROMPTROLLBACKCOST)" />
41 <Publish Event="EndDialog" Value="Return" Condition="OutOfDiskSpace = 1 AND OutOfNoRbDiskSpace = 0 AND PROMPTROLLBACKCOST=&quot;D&quot;" />
42 <Publish Event="EnableRollback" Value="False" Condition="OutOfDiskSpace = 1 AND OutOfNoRbDiskSpace = 0 AND PROMPTROLLBACKCOST=&quot;D&quot;" />
43 <Publish Event="SpawnDialog" Value="OutOfDiskDlg" Condition="(OutOfDiskSpace = 1 AND OutOfNoRbDiskSpace = 1) OR (OutOfDiskSpace = 1 AND PROMPTROLLBACKCOST=&quot;F&quot;)" />
44 </Control>
45 <Control Id="Remove" Type="PushButton" ElevationShield="yes" X="212" Y="243" Width="80" Height="17" Hidden="yes" Disabled="yes" Text="!(loc.VerifyReadyDlgRemove)" ShowCondition="WixUI_InstallMode = &quot;Remove&quot; AND ALLUSERS" EnableCondition="WixUI_InstallMode = &quot;Remove&quot;">
46 <Publish Event="Remove" Value="All" Condition="OutOfDiskSpace &lt;&gt; 1" />
47 <Publish Event="EndDialog" Value="Return" Condition="OutOfDiskSpace &lt;&gt; 1" />
48 <Publish Event="SpawnDialog" Value="OutOfRbDiskDlg" Condition="OutOfDiskSpace = 1 AND OutOfNoRbDiskSpace = 0 AND (PROMPTROLLBACKCOST=&quot;P&quot; OR NOT PROMPTROLLBACKCOST)" />
49 <Publish Event="EndDialog" Value="Return" Condition="OutOfDiskSpace = 1 AND OutOfNoRbDiskSpace = 0 AND PROMPTROLLBACKCOST=&quot;D&quot;" />
50 <Publish Event="EnableRollback" Value="False" Condition="OutOfDiskSpace = 1 AND OutOfNoRbDiskSpace = 0 AND PROMPTROLLBACKCOST=&quot;D&quot;" />
51 <Publish Event="SpawnDialog" Value="OutOfDiskDlg" Condition="(OutOfDiskSpace = 1 AND OutOfNoRbDiskSpace = 1) OR (OutOfDiskSpace = 1 AND PROMPTROLLBACKCOST=&quot;F&quot;)" />
52 </Control>
53 <Control Id="RemoveNoShield" Type="PushButton" ElevationShield="no" X="212" Y="243" Width="80" Height="17" Hidden="yes" Disabled="yes" Text="!(loc.VerifyReadyDlgRemove)" ShowCondition="WixUI_InstallMode = &quot;Remove&quot; AND NOT ALLUSERS" EnableCondition="WixUI_InstallMode = &quot;Remove&quot;">
54 <Publish Event="Remove" Value="All" Condition="OutOfDiskSpace &lt;&gt; 1" />
55 <Publish Event="EndDialog" Value="Return" Condition="OutOfDiskSpace &lt;&gt; 1" />
56 <Publish Event="SpawnDialog" Value="OutOfRbDiskDlg" Condition="OutOfDiskSpace = 1 AND OutOfNoRbDiskSpace = 0 AND (PROMPTROLLBACKCOST=&quot;P&quot; OR NOT PROMPTROLLBACKCOST)" />
57 <Publish Event="EndDialog" Value="Return" Condition="OutOfDiskSpace = 1 AND OutOfNoRbDiskSpace = 0 AND PROMPTROLLBACKCOST=&quot;D&quot;" />
58 <Publish Event="EnableRollback" Value="False" Condition="OutOfDiskSpace = 1 AND OutOfNoRbDiskSpace = 0 AND PROMPTROLLBACKCOST=&quot;D&quot;" />
59 <Publish Event="SpawnDialog" Value="OutOfDiskDlg" Condition="(OutOfDiskSpace = 1 AND OutOfNoRbDiskSpace = 1) OR (OutOfDiskSpace = 1 AND PROMPTROLLBACKCOST=&quot;F&quot;)" />
60 </Control>
61 <Control Id="Update" Type="PushButton" ElevationShield="yes" X="212" Y="243" Width="80" Height="17" Hidden="yes" Disabled="yes" Text="!(loc.VerifyReadyDlgUpdate)" ShowCondition="WixUI_InstallMode = &quot;Update&quot; AND ALLUSERS" EnableCondition="WixUI_InstallMode = &quot;Update&quot;">
62 <Publish Event="EndDialog" Value="Return" Condition="OutOfDiskSpace &lt;&gt; 1" />
63 <Publish Event="SpawnDialog" Value="OutOfRbDiskDlg" Condition="OutOfDiskSpace = 1 AND OutOfNoRbDiskSpace = 0 AND (PROMPTROLLBACKCOST=&quot;P&quot; OR NOT PROMPTROLLBACKCOST)" />
64 <Publish Event="EndDialog" Value="Return" Condition="OutOfDiskSpace = 1 AND OutOfNoRbDiskSpace = 0 AND PROMPTROLLBACKCOST=&quot;D&quot;" />
65 <Publish Event="EnableRollback" Value="False" Condition="OutOfDiskSpace = 1 AND OutOfNoRbDiskSpace = 0 AND PROMPTROLLBACKCOST=&quot;D&quot;" />
66 <Publish Event="SpawnDialog" Value="OutOfDiskDlg" Condition="(OutOfDiskSpace = 1 AND OutOfNoRbDiskSpace = 1) OR (OutOfDiskSpace = 1 AND PROMPTROLLBACKCOST=&quot;F&quot;)" />
67 </Control>
68 <Control Id="UpdateNoShield" Type="PushButton" ElevationShield="no" X="212" Y="243" Width="80" Height="17" Hidden="yes" Disabled="yes" Text="!(loc.VerifyReadyDlgUpdate)" ShowCondition="WixUI_InstallMode = &quot;Update&quot; AND NOT ALLUSERS" EnableCondition="WixUI_InstallMode = &quot;Update&quot;">
69 <Publish Event="EndDialog" Value="Return" Condition="OutOfDiskSpace &lt;&gt; 1" />
70 <Publish Event="SpawnDialog" Value="OutOfRbDiskDlg" Condition="OutOfDiskSpace = 1 AND OutOfNoRbDiskSpace = 0 AND (PROMPTROLLBACKCOST=&quot;P&quot; OR NOT PROMPTROLLBACKCOST)" />
71 <Publish Event="EndDialog" Value="Return" Condition="OutOfDiskSpace = 1 AND OutOfNoRbDiskSpace = 0 AND PROMPTROLLBACKCOST=&quot;D&quot;" />
72 <Publish Event="EnableRollback" Value="False" Condition="OutOfDiskSpace = 1 AND OutOfNoRbDiskSpace = 0 AND PROMPTROLLBACKCOST=&quot;D&quot;" />
73 <Publish Event="SpawnDialog" Value="OutOfDiskDlg" Condition="(OutOfDiskSpace = 1 AND OutOfNoRbDiskSpace = 1) OR (OutOfDiskSpace = 1 AND PROMPTROLLBACKCOST=&quot;F&quot;)" />
74 </Control>
75
76 <Control Id="InstallTitle" Type="Text" X="15" Y="15" Width="300" Height="15" Transparent="yes" NoPrefix="yes" Hidden="yes" Text="!(loc.VerifyReadyDlgInstallTitle)" ShowCondition="NOT Installed" />
77 <Control Id="InstallText" Type="Text" X="25" Y="70" Width="320" Height="80" Hidden="yes" Text="!(loc.VerifyReadyDlgInstallText)" ShowCondition="NOT Installed" />
78 <Control Id="ChangeTitle" Type="Text" X="15" Y="15" Width="300" Height="15" Transparent="yes" NoPrefix="yes" Hidden="yes" Text="!(loc.VerifyReadyDlgChangeTitle)" ShowCondition="WixUI_InstallMode = &quot;Change&quot;" />
79 <Control Id="ChangeText" Type="Text" X="25" Y="70" Width="320" Height="80" Hidden="yes" Text="!(loc.VerifyReadyDlgChangeText)" ShowCondition="WixUI_InstallMode = &quot;Change&quot;" />
80 <Control Id="RepairTitle" Type="Text" X="15" Y="15" Width="300" Height="15" Transparent="yes" NoPrefix="yes" Hidden="yes" Text="!(loc.VerifyReadyDlgRepairTitle)" ShowCondition="WixUI_InstallMode = &quot;Repair&quot;" />
81 <Control Id="RepairText" Type="Text" X="25" Y="70" Width="320" Height="80" Hidden="yes" NoPrefix="yes" Text="!(loc.VerifyReadyDlgRepairText)" ShowCondition="WixUI_InstallMode = &quot;Repair&quot;" />
82 <Control Id="RemoveTitle" Type="Text" X="15" Y="15" Width="300" Height="15" Transparent="yes" NoPrefix="yes" Hidden="yes" Text="!(loc.VerifyReadyDlgRemoveTitle)" ShowCondition="WixUI_InstallMode = &quot;Remove&quot;" />
83 <Control Id="RemoveText" Type="Text" X="25" Y="70" Width="320" Height="80" Hidden="yes" NoPrefix="yes" Text="!(loc.VerifyReadyDlgRemoveText)" ShowCondition="WixUI_InstallMode = &quot;Remove&quot;" />
84 <Control Id="UpdateTitle" Type="Text" X="15" Y="15" Width="300" Height="15" Transparent="yes" NoPrefix="yes" Hidden="yes" Text="!(loc.VerifyReadyDlgUpdateTitle)" ShowCondition="WixUI_InstallMode = &quot;Update&quot;" />
85 <Control Id="UpdateText" Type="Text" X="25" Y="70" Width="320" Height="80" Hidden="yes" NoPrefix="yes" Text="!(loc.VerifyReadyDlgUpdateText)" ShowCondition="WixUI_InstallMode = &quot;Update&quot;" />
86
87 <Control Id="Cancel" Type="PushButton" X="304" Y="243" Width="56" Height="17" Cancel="yes" Text="!(loc.WixUICancel)">
88 <Publish Event="SpawnDialog" Value="CancelDlg" />
89 </Control>
90 <Control Id="Back" Type="PushButton" X="156" Y="243" Width="56" Height="17" Text="!(loc.WixUIBack)" DefaultCondition="WixUI_InstallMode = &quot;Remove&quot;" />
91 <Control Id="BannerBitmap" Type="Bitmap" X="0" Y="0" Width="370" Height="44" TabSkip="no" Text="!(loc.VerifyReadyDlgBannerBitmap)" />
92 <Control Id="BannerLine" Type="Line" X="0" Y="44" Width="370" Height="0" />
93 <Control Id="BottomLine" Type="Line" X="0" Y="234" Width="370" Height="0" />
94 </Dialog>
95 </UI>
96 </Fragment>
97</Wix>
diff --git a/src/ext/UI/wixlib/WaitForCostingDlg.wxs b/src/ext/UI/wixlib/WaitForCostingDlg.wxs
new file mode 100644
index 00000000..f7d5265c
--- /dev/null
+++ b/src/ext/UI/wixlib/WaitForCostingDlg.wxs
@@ -0,0 +1,16 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2
3
4<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
5 <Fragment>
6 <UI>
7 <Dialog Id="WaitForCostingDlg" Width="260" Height="85" Title="!(loc.WaitForCostingDlg_Title)">
8 <Control Id="Return" Type="PushButton" X="102" Y="57" Width="56" Height="17" Default="yes" Cancel="yes" Text="!(loc.WaitForCostingDlgReturn)">
9 <Publish Event="EndDialog" Value="Exit" />
10 </Control>
11 <Control Id="Text" Type="Text" X="48" Y="15" Width="194" Height="30" Text="!(loc.WaitForCostingDlgText)" />
12 <Control Id="Icon" Type="Icon" X="15" Y="15" Width="24" Height="24" ToolTip="!(loc.WaitForCostingDlgIconTooltip)" FixedSize="yes" IconSize="32" Text="!(loc.WaitForCostingDlgIcon)" />
13 </Dialog>
14 </UI>
15 </Fragment>
16</Wix>
diff --git a/src/ext/UI/wixlib/WelcomeDlg.wxs b/src/ext/UI/wixlib/WelcomeDlg.wxs
new file mode 100644
index 00000000..bb13f1dc
--- /dev/null
+++ b/src/ext/UI/wixlib/WelcomeDlg.wxs
@@ -0,0 +1,27 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2
3
4<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
5 <Fragment>
6 <UI>
7 <Dialog Id="WelcomeDlg" Width="370" Height="270" Title="!(loc.WelcomeDlg_Title)">
8 <Control Id="Next" Type="PushButton" X="236" Y="243" Width="56" Height="17" Default="yes" Text="!(loc.WixUINext)">
9 <Publish Property="WixUI_InstallMode" Value="Update" Condition="Installed AND PATCH" />
10 </Control>
11 <Control Id="Cancel" Type="PushButton" X="304" Y="243" Width="56" Height="17" Cancel="yes" Text="!(loc.WixUICancel)">
12 <Publish Event="SpawnDialog" Value="CancelDlg" />
13 </Control>
14 <Control Id="Bitmap" Type="Bitmap" X="0" Y="0" Width="370" Height="234" TabSkip="no" Text="!(loc.WelcomeDlgBitmap)" />
15 <Control Id="Back" Type="PushButton" X="180" Y="243" Width="56" Height="17" Disabled="yes" Text="!(loc.WixUIBack)" />
16 <Control Id="BottomLine" Type="Line" X="0" Y="234" Width="370" Height="0" />
17 <Control Id="Description" Type="Text" X="135" Y="80" Width="220" Height="60" Transparent="yes" NoPrefix="yes" Text="!(loc.WelcomeDlgDescription)" ShowCondition="NOT Installed OR NOT PATCH" HideCondition="Installed AND PATCH" />
18 <Control Id="PatchDescription" Type="Text" X="135" Y="80" Width="220" Height="60" Transparent="yes" NoPrefix="yes" Text="!(loc.WelcomeUpdateDlgDescriptionUpdate)" ShowCondition="Installed AND PATCH" HideCondition="NOT Installed OR NOT PATCH" />
19 <Control Id="Title" Type="Text" X="135" Y="20" Width="220" Height="60" Transparent="yes" NoPrefix="yes" Text="!(loc.WelcomeDlgTitle)" />
20 </Dialog>
21
22 <InstallUISequence>
23 <Show Dialog="WelcomeDlg" Before="ProgressDlg" Overridable="yes" Condition="NOT Installed OR PATCH" />
24 </InstallUISequence>
25 </UI>
26 </Fragment>
27</Wix>
diff --git a/src/ext/UI/wixlib/WelcomeEulaDlg.wxs b/src/ext/UI/wixlib/WelcomeEulaDlg.wxs
new file mode 100644
index 00000000..38868bcd
--- /dev/null
+++ b/src/ext/UI/wixlib/WelcomeEulaDlg.wxs
@@ -0,0 +1,45 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2
3
4<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
5 <Fragment>
6 <UI>
7 <Dialog Id="WelcomeEulaDlg" Width="370" Height="270" Title="!(loc.WelcomeEulaDlg_Title)">
8 <Control Id="Bitmap" Type="Bitmap" X="0" Y="0" Width="370" Height="234" TabSkip="no" Text="!(loc.WelcomeEulaDlgBitmap)" />
9 <Control Id="Title" Type="Text" X="130" Y="6" Width="225" Height="30" Transparent="yes" NoPrefix="yes" Text="!(loc.WelcomeEulaDlgTitle)" />
10 <Control Id="BottomLine" Type="Line" X="0" Y="234" Width="370" Height="0" />
11 <Control Id="LicenseAcceptedCheckBox" Type="CheckBox" X="130" Y="207" Width="226" Height="18" CheckBoxValue="1" Property="LicenseAccepted" Text="!(loc.WelcomeEulaDlgLicenseAcceptedCheckBox)" />
12 <Control Id="Print" Type="PushButton" X="88" Y="243" Width="56" Height="17" Text="!(loc.WixUIPrint)">
13 <Publish Event="DoAction" Value="WixUIPrintEula" />
14 </Control>
15 <Control Id="Back" Type="PushButton" X="156" Y="243" Width="56" Height="17" Disabled="yes" Text="!(loc.WixUIBack)" />
16 <Control Id="Install" Type="PushButton" ElevationShield="yes" X="212" Y="243" Width="80" Height="17" Default="yes" Text="!(loc.WelcomeEulaDlgInstall)" Hidden="yes" DisableCondition="LicenseAccepted &lt;&gt; &quot;1&quot;" EnableCondition="LicenseAccepted = &quot;1&quot;" ShowCondition="ALLUSERS">
17 <Publish Event="SpawnWaitDialog" Value="WaitForCostingDlg" Condition="!(wix.WixUICostingPopupOptOut) OR CostingComplete = 1" />
18 <Publish Event="EndDialog" Value="Return" Condition="OutOfDiskSpace &lt;&gt; 1" />
19 <Publish Event="SpawnDialog" Value="OutOfRbDiskDlg" Condition="OutOfDiskSpace = 1 AND OutOfNoRbDiskSpace = 0 AND (PROMPTROLLBACKCOST=&quot;P&quot; OR NOT PROMPTROLLBACKCOST)" />
20 <Publish Event="EndDialog" Value="Return" Condition="OutOfDiskSpace = 1 AND OutOfNoRbDiskSpace = 0 AND PROMPTROLLBACKCOST=&quot;D&quot;" />
21 <Publish Event="EnableRollback" Value="False" Condition="OutOfDiskSpace = 1 AND OutOfNoRbDiskSpace = 0 AND PROMPTROLLBACKCOST=&quot;D&quot;" />
22 <Publish Event="SpawnDialog" Value="OutOfDiskDlg" Condition="(OutOfDiskSpace = 1 AND OutOfNoRbDiskSpace = 1) OR (OutOfDiskSpace = 1 AND PROMPTROLLBACKCOST=&quot;F&quot;)" />
23 </Control>
24 <Control Id="InstallNoShield" Type="PushButton" ElevationShield="no" X="212" Y="243" Width="80" Height="17" Default="yes" Text="!(loc.WelcomeEulaDlgInstall)" Hidden="yes" DisableCondition="LicenseAccepted &lt;&gt; &quot;1&quot;" EnableCondition="LicenseAccepted = &quot;1&quot;" ShowCondition="NOT ALLUSERS">
25 <Publish Event="SpawnWaitDialog" Value="WaitForCostingDlg" Condition="!(wix.WixUICostingPopupOptOut) OR CostingComplete = 1" />
26 <Publish Event="EndDialog" Value="Return" Condition="OutOfDiskSpace &lt;&gt; 1" />
27 <Publish Event="SpawnDialog" Value="OutOfRbDiskDlg" Condition="OutOfDiskSpace = 1 AND OutOfNoRbDiskSpace = 0 AND (PROMPTROLLBACKCOST=&quot;P&quot; OR NOT PROMPTROLLBACKCOST)" />
28 <Publish Event="EndDialog" Value="Return" Condition="OutOfDiskSpace = 1 AND OutOfNoRbDiskSpace = 0 AND PROMPTROLLBACKCOST=&quot;D&quot;" />
29 <Publish Event="EnableRollback" Value="False" Condition="OutOfDiskSpace = 1 AND OutOfNoRbDiskSpace = 0 AND PROMPTROLLBACKCOST=&quot;D&quot;" />
30 <Publish Event="SpawnDialog" Value="OutOfDiskDlg" Condition="(OutOfDiskSpace = 1 AND OutOfNoRbDiskSpace = 1) OR (OutOfDiskSpace = 1 AND PROMPTROLLBACKCOST=&quot;F&quot;)" />
31 </Control>
32 <Control Id="Cancel" Type="PushButton" X="304" Y="243" Width="56" Height="17" Cancel="yes" Text="!(loc.WixUICancel)">
33 <Publish Event="SpawnDialog" Value="CancelDlg" />
34 </Control>
35 <Control Id="LicenseText" Type="ScrollableText" X="130" Y="36" Width="226" Height="162" Sunken="yes" TabSkip="no">
36 <Text SourceFile="!(wix.WixUILicenseRtf=$(var.licenseRtf))" />
37 </Control>
38 </Dialog>
39 </UI>
40
41 <InstallUISequence>
42 <Show Dialog="WelcomeEulaDlg" Before="ProgressDlg" Overridable="yes" Condition="NOT Installed" />
43 </InstallUISequence>
44 </Fragment>
45</Wix>
diff --git a/src/ext/UI/wixlib/WixExt_de-de.wxl b/src/ext/UI/wixlib/WixExt_de-de.wxl
new file mode 100644
index 00000000..80c75a0f
--- /dev/null
+++ b/src/ext/UI/wixlib/WixExt_de-de.wxl
@@ -0,0 +1,175 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3
4
5<WixLocalization Culture="de-de" xmlns="http://wixtoolset.org/schemas/v4/wxl">
6 <!--ComPlusExtension-->
7 <String Id="msierrComPlusCannotConnect" Overridable="yes">Verbindung zum COM+-Katalogmanager fehlgeschlagen. ([2] [3] [4] [5])</String>
8 <String Id="msierrComPlusPartitionReadFailed" Overridable="yes">Konnte COM+-Partitionen nicht lesen. ([2] [3] [4] [5])</String>
9 <String Id="msierrComPlusPartitionRoleReadFailed" Overridable="yes">Konnte COM+-Partitionsgruppen nicht lesen. ([2] [3] [4] [5])</String>
10 <String Id="msierrComPlusUserInPartitionRoleReadFailed" Overridable="yes">Konnte COM+-Benutzer in Partitionsgruppen nicht lesen. ([2] [3] [4] [5])</String>
11 <String Id="msierrComPlusPartitionUserReadFailed" Overridable="yes">Konnte Benutzer der COM+-Partition nicht lesen. ([2] [3] [4] [5])</String>
12 <String Id="msierrComPlusApplicationReadFailed" Overridable="yes">Konnte COM+-Anwendungen nicht lesen. ([2] [3] [4] [5])</String>
13 <String Id="msierrComPlusApplicationRoleReadFailed" Overridable="yes">Konnte COM+-Anwendungsgruppen nicht lesen. ([2] [3] [4] [5])</String>
14 <String Id="msierrComPlusUserInApplicationRoleReadFailed" Overridable="yes">Konnte COM+-Benutzer in Anwendungsgruppen nicht lesen. ([2] [3] [4] [5])</String>
15 <String Id="msierrComPlusAssembliesReadFailed" Overridable="yes">Konnte COM+-Assemblys nicht lesen. ([2] [3] [4] [5])</String>
16 <String Id="msierrComPlusSubscriptionReadFailed" Overridable="yes">Konnte Abonnements von COM+-Ereignissen nicht lesen. ([2] [3] [4] [5])</String>
17 <String Id="msierrComPlusPartitionDependency" Overridable="yes">Eine andere Entität ist von einer COM+-Partition abhängig, die nicht installiert ist. ([2] [3] [4] [5])</String>
18 <String Id="msierrComPlusPartitionNotFound" Overridable="yes">Die COM+-Partition wurde nicht gefunden. ([2] [3] [4] [5])</String>
19 <String Id="msierrComPlusPartitionIdConflict" Overridable="yes">Eine COM+-Partition mit der gleichen ID existiert bereits. ([2] [3] [4] [5])</String>
20 <String Id="msierrComPlusPartitionNameConflict" Overridable="yes">Eine COM+-Partition mit dem gleichen Namen existiert bereits. ([2] [3] [4] [5])</String>
21 <String Id="msierrComPlusApplicationDependency" Overridable="yes">Eine andere Entität ist von einer COM+-Anwendung abhängig, die nicht installiert ist. ([2] [3] [4] [5])</String>
22 <String Id="msierrComPlusApplicationNotFound" Overridable="yes">Die COM+-Anwendung wurde nicht gefunden. ([2] [3] [4] [5])</String>
23 <String Id="msierrComPlusApplicationIdConflict" Overridable="yes">Eine COM+-Anwendung mit der gleichen ID existiert bereits. ([2] [3] [4] [5])</String>
24 <String Id="msierrComPlusApplicationNameConflict" Overridable="yes">Eine COM+-Anwendung mit dem gleichen Namen existiert bereits. ([2] [3] [4] [5])</String>
25 <String Id="msierrComPlusApplicationRoleDependency" Overridable="yes">Eine andere Entität ist von einer COM+-Anwendungsgruppe abhängig, die nicht installiert ist. ([2] [3] [4] [5])</String>
26 <String Id="msierrComPlusApplicationRoleNotFound" Overridable="yes">Die COM+-Anwendungsgruppe wurde nicht gefunden. ([2] [3] [4] [5])</String>
27 <String Id="msierrComPlusApplicationRoleConflict" Overridable="yes">Eine COM+-Anwendungsgruppe mit dem gleichen Namen existiert bereits. ([2] [3] [4] [5])</String>
28 <String Id="msierrComPlusAssemblyDependency" Overridable="yes">Eine andere Entität ist von einem COM+-Assembly abhängig, das nicht installiert ist. ([2] [3] [4] [5])</String>
29 <String Id="msierrComPlusSubscriptionIdConflict" Overridable="yes">Ein COM+-Komponentenereignis-Abonnement mit der gleichen ID existiert bereits. ([2] [3] [4] [5])</String>
30 <String Id="msierrComPlusSubscriptionNameConflict" Overridable="yes">Ein COM+-Komponentenereignis-Abonnement mit dem gleichen Namen existiert bereits. ([2] [3] [4] [5])</String>
31 <String Id="msierrComPlusFailedLookupNames" Overridable="yes">Fehler beim Nachschlagen der Namen der Benutzerkonten. ([2] [3] [4] [5])</String>
32
33 <String Id="ComPlusInstallExecute" Overridable="yes">Registriere COM+-Komponenten</String>
34 <String Id="ComPlusUninstallExecute" Overridable="yes">Deregistriere COM+-Komponenten</String>
35
36 <String Id="CreateComPlusPartitions" Overridable="yes">Erstelle COM+-Partitionen</String>
37 <String Id="CreateComPlusPartitionsTemplate" Overridable="yes">Partition: [1]</String>
38 <String Id="RemoveComPlusPartitions" Overridable="yes">Lösche COM+-Partitionen</String>
39 <String Id="RemoveComPlusPartitionsTemplate" Overridable="yes">Partition: [1]</String>
40 <String Id="AddUsersToComPlusPartitionRoles" Overridable="yes">Füge Benutzer zu COM+-Partitionsgruppen hinzu.</String>
41 <String Id="AddUsersToComPlusPartitionRolesTemplate" Overridable="yes">Gruppe: [1]</String>
42 <String Id="RemoveUsersFromComPlusPartitionRoles" Overridable="yes">Entferne Benutzer aus COM+-Partitionsgruppen</String>
43 <String Id="RemoveUsersFromComPlusPartitionRolesTemplate" Overridable="yes">Gruppe: [1]</String>
44 <String Id="AddComPlusPartitionUsers" Overridable="yes">Setze Standard-COM+-Partitionen für Benutzer</String>
45 <String Id="AddComPlusPartitionUsersTemplate" Overridable="yes">Benutzer: [1]</String>
46 <String Id="RemoveComPlusPartitionUsers" Overridable="yes">Entferne Standard-COM+-Partitionen für Benutzer</String>
47 <String Id="RemoveComPlusPartitionUsersTemplate" Overridable="yes">Benutzer: [1]</String>
48 <String Id="CreateComPlusApplications" Overridable="yes">Erstelle COM+-Anwendungen</String>
49 <String Id="CreateComPlusApplicationsTemplate" Overridable="yes">Anwendung: [1]</String>
50 <String Id="RemoveComPlusApplications" Overridable="yes">Entferne COM+-Anwendungen</String>
51 <String Id="RemoveComPlusApplicationsTemplate" Overridable="yes">Anwendung: [1]</String>
52 <String Id="CreateComPlusApplicationRoles" Overridable="yes">Erstelle COM+-Anwendungsgruppen</String>
53 <String Id="CreateComPlusApplicationRolesTemplate" Overridable="yes">Gruppe: [1]</String>
54 <String Id="RemoveComPlusApplicationRoles" Overridable="yes">Entferne COM+-Anwendungsgruppen</String>
55 <String Id="RemoveComPlusApplicationRolesTemplate" Overridable="yes">Gruppe: [1]</String>
56 <String Id="AddUsersToComPlusApplicationRoles" Overridable="yes">Füge Benutzer zu COM+-Anwendungsgruppen hinzu</String>
57 <String Id="AddUsersToComPlusApplicationRolesTemplate" Overridable="yes">Benutzer: [1]</String>
58 <String Id="RemoveUsersFromComPlusApplicationRoles" Overridable="yes">Entferne Benutzer aus COM+-Anwendungsgruppen</String>
59 <String Id="RemoveUsersFromComPlusApplicationRolesTemplate" Overridable="yes">Benutzer: [1]</String>
60 <String Id="RegisterComPlusAssemblies" Overridable="yes">Registriere COM+-Komponenten</String>
61 <String Id="RegisterComPlusAssembliesTemplate" Overridable="yes">DLL: [1]</String>
62 <String Id="UnregisterComPlusAssemblies" Overridable="yes">Deregistriere COM+-Komponenten</String>
63 <String Id="UnregisterComPlusAssembliesTemplate" Overridable="yes">DLL: [1]</String>
64 <String Id="AddComPlusRoleAssignments" Overridable="yes">Weise Gruppen COM+-Komponenten zu</String>
65 <String Id="AddComPlusRoleAssignmentsTemplate" Overridable="yes">Komponente: [1]</String>
66 <String Id="RemoveComPlusRoleAssignments" Overridable="yes">Entferne Gruppen von COM+ Komponenten</String>
67 <String Id="RemoveComPlusRoleAssignmentsTemplate" Overridable="yes">Komponente: [1]</String>
68 <String Id="CreateSubscriptionsComPlusComponents" Overridable="yes">Erzeuge Abonnements für COM+-Komponenten</String>
69 <String Id="CreateSubscriptionsComPlusComponentsTemplate" Overridable="yes">Abonnement: [1]</String>
70 <String Id="RemoveSubscriptionsComPlusComponents" Overridable="yes">Entferne Abonnements für COM+-Komponenten</String>
71 <String Id="RemoveSubscriptionsComPlusComponentsTemplate" Overridable="yes">Abonnement: [1]</String>
72
73 <!--FirewallExtension-->
74 <String Id="msierrFirewallCannotConnect" Overridable="yes">Verbindung zur Windows Firewall fehlgeschlagen. ([2] [3] [4] [5])</String>
75
76 <String Id="WixSchedFirewallExceptionsInstall" Overridable="yes">Konfiguriere Windows Firewall</String>
77 <String Id="WixSchedFirewallExceptionsUninstall" Overridable="yes">Konfiguriere Windows Firewall</String>
78 <String Id="WixRollbackFirewallExceptionsInstall" Overridable="yes">Setze Konfiguration der Windows Firewall zurück</String>
79 <String Id="WixExecFirewallExceptionsInstall" Overridable="yes">Installiere Konfiguration der Windows Firewall</String>
80 <String Id="WixRollbackFirewallExceptionsUninstall" Overridable="yes">Setze Konfiguration der Windows Firewall zurück</String>
81 <String Id="WixExecFirewallExceptionsUninstall" Overridable="yes">Deinstalliere Konfiguration der Windows Firewall</String>
82
83 <!--IIsExtension-->
84 <String Id="msierrIISCannotConnect" Overridable="yes">Verbindung zu den Internetinformationsdiensten fehlgeschlagen. ([2] [3] [4] [5])</String>
85 <String Id="msierrIISFailedReadWebSite" Overridable="yes">Fehler beim Verarbeiten von 'WebSites'. ([2] [3] [4] [5])</String>
86 <String Id="msierrIISFailedReadWebDirs" Overridable="yes">Fehler beim Verarbeiten von 'WebDirs'. ([2] [3] [4] [5])</String>
87 <String Id="msierrIISFailedReadVDirs" Overridable="yes">Fehler beim Verarbeiten von 'WebVirtualDirs'. ([2] [3] [4] [5])</String>
88 <String Id="msierrIISFailedReadFilters" Overridable="yes">Fehler beim Verarbeiten von 'WebFilters'. ([2] [3] [4] [5])</String>
89 <String Id="msierrIISFailedReadMimeMap" Overridable="yes">Fehler beim Verarbeiten von 'MimeMaps'. ([2] [3] [4] [5])</String>
90 <String Id="msierrIISFailedReadAppPool" Overridable="yes">Fehler beim Verarbeiten von 'WebAppPools'. ([2] [3] [4] [5])</String>
91 <String Id="msierrIISFailedReadProp" Overridable="yes">Fehler beim Verarbeiten von 'WebProperties'. ([2] [3] [4] [5])</String>
92 <String Id="msierrIISFailedReadWebSvcExt" Overridable="yes">Fehler beim Verarbeiten von 'WebServiceExtensions'. ([2] [3] [4] [5])</String>
93 <String Id="msierrIISFailedReadWebError" Overridable="yes">Fehler beim Verarbeiten von 'WebErrors'. ([2] [3] [4] [5])</String>
94 <String Id="msierrIISFailedReadHttpHeader" Overridable="yes">Fehler beim Verarbeiten von 'HttpHeaders'. ([2] [3] [4] [5])</String>
95
96 <String Id="msierrIISFailedSchedTransaction" Overridable="yes">Fehler beim Scheduling der Transaktion für Änderungen am IIS. ([2] [3] [4] [5])</String>
97 <String Id="msierrIISFailedSchedInstallWebs" Overridable="yes">Fehler beim Scheduling der Installation von IIS Websites. ([2] [3] [4] [5])</String>
98 <String Id="msierrIISFailedSchedInstallWebDirs" Overridable="yes">Fehler beim Scheduling der Installation von IIS Webverzeichnissen. ([2] [3] [4] [5])</String>
99 <String Id="msierrIISFailedSchedInstallVDirs" Overridable="yes">Fehler beim Scheduling der Installation von virtuellen IIS-Verzeichnissen. ([2] [3] [4] [5])</String>
100 <String Id="msierrIISFailedSchedInstallFilters" Overridable="yes">Fehler beim Scheduling der Installation von IIS-Filtern. ([2] [3] [4] [5])</String>
101 <String Id="msierrIISFailedSchedInstallAppPool" Overridable="yes">Fehler beim Scheduling der Installation von IIS-Anwendungspools. ([2] [3] [4] [5])</String>
102 <String Id="msierrIISFailedSchedInstallProp" Overridable="yes">Fehler beim Scheduling der Installation von IIS-Eigenschaften. ([2] [3] [4] [5])</String>
103 <String Id="msierrIISFailedSchedInstallWebSvcExt" Overridable="yes">Fehler beim Scheduling der Installation von IIS Web-Service-Erweiterungen. ([2] [3] [4] [5])</String>
104
105 <String Id="msierrIISFailedSchedUninstallWebs" Overridable="yes">Fehler beim Scheduling der Deinstallation von IIS Websites. ([2] [3] [4] [5])</String>
106 <String Id="msierrIISFailedSchedUninstallWebDirs" Overridable="yes">Fehler beim Scheduling zur Deinstallation von IIS Webverzeichnissen. ([2] [3] [4] [5])</String>
107 <String Id="msierrIISFailedSchedUninstallVDirs" Overridable="yes">Fehler beim Scheduling zur Deinstallation von virtuellen IIS-Verzeichnissen. ([2] [3] [4] [5])</String>
108 <String Id="msierrIISFailedSchedUninstallFilters" Overridable="yes">Fehler beim Scheduling zur Deinstallation von IIS-Filtern. ([2] [3] [4] [5])</String>
109 <String Id="msierrIISFailedSchedUninstallAppPool" Overridable="yes">Fehler beim Scheduling zur Deinstallation von IIS-Anwendungspools. ([2] [3] [4] [5])</String>
110 <String Id="msierrIISFailedSchedUninstallProp" Overridable="yes">Fehler beim Scheduling zur Deinstalation von IIS-Eigenschaften. ([2] [3] [4] [5])</String>
111 <String Id="msierrIISFailedSchedUninstallWebSvcExt" Overridable="yes">Fehler beim Scheduling zur Deinstallation von IIS Web-Service-Erweiterungen. ([2] [3] [4] [5])</String>
112
113 <String Id="msierrIISFailedStartTransaction" Overridable="yes">Konnte IIS-Transaktion nicht starten. ([2] [3] [4] [5])</String>
114 <String Id="msierrIISFailedOpenKey" Overridable="yes">Konnte Metabasis-Schlüssel nicht öffnen. ([2] [3] [4] [5])</String>
115 <String Id="msierrIISFailedCreateKey" Overridable="yes">Konnte Metabasis-Schlüssel nicht anlegen. ([2] [3] [4] [5])</String>
116 <String Id="msierrIISFailedWriteData" Overridable="yes">Konnte Daten zu Metabasis-Schlüssel nicht schreiben. ([2] [3] [4] [5])</String>
117 <String Id="msierrIISFailedCreateApp" Overridable="yes">Konnte Web-Anwendung nicht anlegen. ([2] [3] [4] [5])</String>
118 <String Id="msierrIISFailedDeleteKey" Overridable="yes">Konnte Metabasis-Schlüssel nicht löschen. ([2] [3] [4] [5])</String>
119 <String Id="msierrIISFailedDeleteValue" Overridable="yes">Konnte Metabasis-Wert nicht löschen. ([2] [3] [4] [5])</String>
120
121 <String Id="ConfigureIIs" Overridable="yes">Konfiguriere IIS</String>
122 <String Id="StartMetabaseTransaction" Overridable="yes">Starte IIS Metabasis-Transaktion</String>
123 <String Id="RollbackMetabaseTransaction" Overridable="yes">Rollback von IIS Metabasis-Transaktion</String>
124 <String Id="CommitMetabaseTransaction" Overridable="yes">Commit von IIS Metabasis-Transaktion</String>
125 <String Id="WriteMetabaseChanges" Overridable="yes">Schreibe Metabasis-Schlüssel und -Werte</String>
126
127 <!--MsmqExtension-->
128 <String Id="MessageQueuingExecuteInstall" Overridable="yes">Konfiguriere Message-Queuing</String>
129 <String Id="MessageQueuingExecuteInstallTemplate" Overridable="yes">Queue: [1]</String>
130 <String Id="MessageQueuingExecuteUninstall" Overridable="yes">Konfiguriere Message-Queues</String>
131 <String Id="MessageQueuingExecuteUninstallTemplate" Overridable="yes">Queue: [1]</String>
132
133 <!--SqlExtension-->
134 <String Id="msierrSQLFailedCreateDatabase" Overridable="yes">Fehler [2]: Konnte SQL-Datenbank nicht anlegen: [3], Details: [4].</String>
135 <String Id="msierrSQLFailedDropDatabase" Overridable="yes">Fehler [2]: Konnte SQL-Datenbank nicht löschen: [3], Details: [4].</String>
136 <String Id="msierrSQLFailedConnectDatabase" Overridable="yes">Konnte keine Verbindung zur SQL-Datenbank herstellen. ([2] [3] [4] [5])</String>
137 <String Id="msierrSQLFailedExecString" Overridable="yes">Fehler [2]: Konnte SQL-Anweisung nicht ausführen, Details: [3], SQL-Schlüssel: [4] SQL-Befehl: [5]</String>
138 <String Id="msierrSQLDatabaseAlreadyExists" Overridable="yes">Die Datenbank [3] existiert bereits. Wollen Sie fortfahren?</String>
139
140 <String Id="ConfigureSql" Overridable="yes">Konfiguriere SQL-Server</String>
141 <String Id="CreateDatabase" Overridable="yes">Lege Datenbanken an</String>
142 <String Id="DropDatabase" Overridable="yes">Lösche Datenbanken</String>
143 <String Id="ExecuteSqlStrings" Overridable="yes">Führe SQL-Anweisungen aus</String>
144 <String Id="RollbackExecuteSqlStrings" Overridable="yes">Rollback von SQL-Anweisungen</String>
145
146 <!--UtilExtension - already translated-->
147 <String Id="msierrUSRFailedUserCreate" Overridable="yes">Konnte den Benutzer nicht anlegen. ([2] [3] [4] [5])</String>
148 <String Id="msierrUSRFailedUserCreatePswd" Overridable="yes">Konnte den Benutzer aufgrund eines falschen Passwortes nicht anlegen. ([2] [3] [4] [5])</String>
149 <String Id="msierrUSRFailedUserGroupAdd" Overridable="yes">Konnte Benutzer nicht zur Gruppe hinzufügen. ([2] [3] [4] [5])</String>
150 <String Id="msierrUSRFailedUserCreateExists" Overridable="yes">Konnte den Benutzer nicht anlegen, da er bereits existierte. ([2] [3] [4] [5])</String>
151
152 <String Id="msierrSMBFailedCreate" Overridable="yes">Konnte Netzwerkfreigabe nicht anlegen. ([2] [3] [4] [5])</String>
153 <String Id="msierrSMBFailedDrop" Overridable="yes">Konnte Netzwerkfreigabe nicht entfernen. ([2] [3] [4] [5])</String>
154
155 <String Id="msierrPERFMONFailedRegisterDLL" Overridable="yes">Konnte die DLL nicht für PerfMon registrieren. ([2] [3] [4] [5])</String>
156 <String Id="msierrPERFMONFailedUnregisterDLL" Overridable="yes">Konnte die DLL nicht für PerfMon deregistrieren. ([2] [3] [4] [5])</String>
157
158 <String Id="msierrInstallPerfCounterData" Overridable="yes">Konnte die Daten der Leistungsüberwachung (performance counters) nicht installieren. ([2] [3] [4] [5])</String>
159 <String Id="msierrUninstallPerfCounterData" Overridable="yes">Konnte die Daten der Leistungsüberwachung (performance counters) nicht deinstallieren. ([2] [3] [4] [5])</String>
160
161 <String Id="msierrSecureObjectsFailedCreateSD" Overridable="yes">Konnte keinen Security-Descriptor für [3]\[4] erstellen, Systemfehler: [2]</String>
162 <String Id="msierrSecureObjectsFailedSet" Overridable="yes">Konnte keinen Security-Descriptor für das Objekt [3] erstellen, Systemfehler: [2]</String>
163 <String Id="msierrSecureObjectsUnknownType" Overridable="yes">Unbekannter Objekt-Typ [3], System-Fehler: [2]</String>
164
165 <String Id="msierrXmlFileFailedRead" Overridable="yes">Beim Lesen der XML-Dateien trat ein Fehler auf.</String>
166 <String Id="msierrXmlFileFailedOpen" Overridable="yes">Konnte XML-Datei [3] nicht öffnen, Systemfehler: [2]</String>
167 <String Id="msierrXmlFileFailedSelect" Overridable="yes">Konnte Knoten [3] in der XML-Datei [4] nicht finden, Systemfehler: [2]</String>
168 <String Id="msierrXmlFileFailedSave" Overridable="yes">Beim Speichern der Änderungen an der XML-Datei [3] trat ein Fehler auf, Systemfehler: [2]</String>
169
170 <String Id="msierrXmlConfigFailedRead" Overridable="yes">Bei der Konfiguration der XML-Dateien trat ein Fehler auf.</String>
171 <String Id="msierrXmlConfigFailedOpen" Overridable="yes">Konnte XML Datei [3] nicht öffnen, Systemfehler: [2]</String>
172 <String Id="msierrXmlConfigFailedSelect" Overridable="yes">Konnte Knoten [3] in der XML-Datei [4] nicht finden, Systemfehler: [2]</String>
173 <String Id="msierrXmlConfigFailedSave" Overridable="yes">Beim Speichern der Änderungen an der XML-Datei [3] trat ein Fehler auf, Systemfehler: [2]</String>
174</WixLocalization>
175
diff --git a/src/ext/UI/wixlib/WixUI_Advanced.wxs b/src/ext/UI/wixlib/WixUI_Advanced.wxs
new file mode 100644
index 00000000..7d1f4df0
--- /dev/null
+++ b/src/ext/UI/wixlib/WixUI_Advanced.wxs
@@ -0,0 +1,121 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2
3
4
5<!--
6WixUI_Advanced offers a two-click install (EULA checkbox and Install button)
7and offers an Advanced button that lets users choose per-machine or per-user
8installs, install path, and features.
9
10WiX variables used:
11 - WixUISupportPerMachine
12 - WixUISupportPerUser
13
14Todo:
15 - Clicking Install doesn't work! - APPLICATIONFOLDER isn't set; need to accept another "incoming" property.
16 - Replace this dialog set UI fragment with the UI extension.
17 = This set is still in active development.
18 = Future releases are likely to be incompatible.
19 = Future releases are likely to be much easier to use.
20 = Use at your own risk.
21
22-->
23
24<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
25 <Fragment>
26 <WixVariable Id="WixUISupportPerUser" Value="1" Overridable="yes" />
27 <WixVariable Id="WixUISupportPerMachine" Value="1" Overridable="yes" />
28
29 <PropertyRef Id="ApplicationFolderName" />
30
31 <CustomAction Id="WixSetDefaultPerUserFolder" Property="WixPerUserFolder" Value="[LocalAppDataFolder]Apps\[ApplicationFolderName]" Execute="immediate" />
32 <CustomAction Id="WixSetDefaultPerMachineFolder" Property="WixPerMachineFolder" Value="[ProgramFilesFolder][ApplicationFolderName]" Execute="immediate" />
33 <CustomAction Id="WixSetPerUserFolder" Property="APPLICATIONFOLDER" Value="[WixPerUserFolder]" Execute="immediate" />
34 <CustomAction Id="WixSetPerMachineFolder" Property="APPLICATIONFOLDER" Value="[WixPerMachineFolder]" Execute="immediate" />
35
36 <InstallExecuteSequence>
37 <Custom Action="WixSetDefaultPerUserFolder" Before="CostFinalize" />
38 <Custom Action="WixSetDefaultPerMachineFolder" After="WixSetDefaultPerUserFolder" />
39 <Custom Action="WixSetPerUserFolder" After="WixSetDefaultPerMachineFolder" Condition="ACTION=&quot;INSTALL&quot; AND APPLICATIONFOLDER=&quot;&quot; AND (ALLUSERS=&quot;&quot; OR (ALLUSERS=2 AND (NOT Privileged)))" />
40 <Custom Action="WixSetPerMachineFolder" After="WixSetPerUserFolder" Condition="ACTION=&quot;INSTALL&quot; AND APPLICATIONFOLDER=&quot;&quot; AND (ALLUSERS=1 OR (ALLUSERS=2 AND Privileged))" />
41 </InstallExecuteSequence>
42 <InstallUISequence>
43 <Custom Action="WixSetDefaultPerUserFolder" Before="CostFinalize" />
44 <Custom Action="WixSetDefaultPerMachineFolder" After="WixSetDefaultPerUserFolder" />
45 <Custom Action="WixSetPerUserFolder" After="WixSetDefaultPerMachineFolder" Condition="ACTION=&quot;INSTALL&quot; AND APPLICATIONFOLDER=&quot;&quot; AND (ALLUSERS=&quot;&quot; OR (ALLUSERS=2 AND (NOT Privileged)))" />
46 <Custom Action="WixSetPerMachineFolder" After="WixSetPerUserFolder" Condition="ACTION=&quot;INSTALL&quot; AND APPLICATIONFOLDER=&quot;&quot; AND (ALLUSERS=1 OR (ALLUSERS=2 AND Privileged))" />
47 </InstallUISequence>
48
49 <UI Id="WixUI_Advanced">
50 <TextStyle Id="WixUI_Font_Normal" FaceName="!(loc.Advanced_Font_FaceName)" Size="!(loc.Advanced_Font_Normal_Size)" />
51 <TextStyle Id="WixUI_Font_Bigger" FaceName="!(loc.Advanced_Font_FaceName)" Size="!(loc.Advanced_Font_Bigger_Size)" />
52 <TextStyle Id="WixUI_Font_Title" FaceName="!(loc.Advanced_Font_FaceName)" Size="!(loc.Advanced_Font_Title_Size)" Bold="yes" />
53 <TextStyle Id="WixUI_Font_Emphasized" FaceName="!(loc.Advanced_Font_FaceName)" Size="!(loc.Advanced_Font_Emphasized_Size)" Bold="yes" />
54
55 <Property Id="DefaultUIFont" Value="WixUI_Font_Normal" />
56 <Property Id="WixUI_Mode" Value="Advanced" />
57
58 <DialogRef Id="BrowseDlg" />
59 <DialogRef Id="DiskCostDlg" />
60 <DialogRef Id="ErrorDlg" />
61 <DialogRef Id="FatalError" />
62 <DialogRef Id="FilesInUse" />
63 <DialogRef Id="MsiRMFilesInUse" />
64 <DialogRef Id="PrepareDlg" />
65 <DialogRef Id="ProgressDlg" />
66 <DialogRef Id="ResumeDlg" />
67 <DialogRef Id="UserExit" />
68 <DialogRef Id="WelcomeDlg" />
69
70 <Publish Dialog="ExitDialog" Control="Finish" Event="EndDialog" Value="Return" Order="999" />
71 <Publish Dialog="BrowseDlg" Control="OK" Event="DoAction" Value="WixUIValidatePath" Order="1" />
72 <Publish Dialog="BrowseDlg" Control="OK" Event="SpawnDialog" Value="InvalidDirDlg" Order="2" Condition="WIXUI_INSTALLDIR_VALID&lt;&gt;&quot;1&quot;" />
73
74 <Publish Dialog="AdvancedWelcomeEulaDlg" Control="Advanced" Event="NewDialog" Value="InstallScopeDlg" Order="1" Condition="!(wix.WixUISupportPerMachine) AND !(wix.WixUISupportPerUser)" />
75 <Publish Dialog="AdvancedWelcomeEulaDlg" Control="Advanced" Event="NewDialog" Value="FeaturesDlg" Order="2" Condition="NOT !(wix.WixUISupportPerMachine)" />
76 <Publish Dialog="AdvancedWelcomeEulaDlg" Control="Advanced" Event="NewDialog" Value="InstallDirDlg" Order="3" Condition="!(wix.WixUISupportPerMachine) AND NOT !(wix.WixUISupportPerUser)" />
77
78 <Publish Dialog="InstallScopeDlg" Control="Back" Event="NewDialog" Value="AdvancedWelcomeEulaDlg" />
79 <!-- override default WixAppFolder of WixPerMachineFolder as standard user won't be shown the radio group to set WixAppFolder -->
80 <Publish Dialog="InstallScopeDlg" Control="Next" Property="WixAppFolder" Value="WixPerUserFolder" Order="1" Condition="!(wix.WixUISupportPerUser) AND NOT Privileged" />
81 <Publish Dialog="InstallScopeDlg" Control="Next" Property="ALLUSERS" Value="{}" Order="2" Condition="WixAppFolder = &quot;WixPerUserFolder&quot;" />
82 <Publish Dialog="InstallScopeDlg" Control="Next" Property="ALLUSERS" Value="1" Order="3" Condition="WixAppFolder = &quot;WixPerMachineFolder&quot;" />
83 <Publish Dialog="InstallScopeDlg" Control="Next" Property="APPLICATIONFOLDER" Value="[WixPerUserFolder]" Order="4" Condition="WixAppFolder = &quot;WixPerUserFolder&quot;" />
84 <Publish Dialog="InstallScopeDlg" Control="Next" Property="APPLICATIONFOLDER" Value="[WixPerMachineFolder]" Order="5" Condition="WixAppFolder = &quot;WixPerMachineFolder&quot;" />
85 <Publish Dialog="InstallScopeDlg" Control="Next" Event="NewDialog" Value="FeaturesDlg" Order="6" Condition="WixAppFolder = &quot;WixPerUserFolder&quot;" />
86 <Publish Dialog="InstallScopeDlg" Control="Next" Event="NewDialog" Value="InstallDirDlg" Order="7" Condition="WixAppFolder = &quot;WixPerMachineFolder&quot;" />
87
88 <Publish Dialog="InstallDirDlg" Control="Back" Event="NewDialog" Value="InstallScopeDlg" Condition="!(wix.WixUISupportPerUser)" />
89 <Publish Dialog="InstallDirDlg" Control="Back" Event="NewDialog" Value="AdvancedWelcomeEulaDlg" Condition="NOT !(wix.WixUISupportPerUser)" />
90 <Publish Dialog="InstallDirDlg" Control="Next" Event="SetTargetPath" Value="[WIXUI_INSTALLDIR]" Order="1" />
91 <Publish Dialog="InstallDirDlg" Control="Next" Event="DoAction" Value="WixUIValidatePath" Order="2" Condition="NOT WIXUI_DONTVALIDATEPATH" />
92 <Publish Dialog="InstallDirDlg" Control="Next" Event="SpawnDialog" Value="InvalidDirDlg" Order="3" Condition="NOT WIXUI_DONTVALIDATEPATH AND WIXUI_INSTALLDIR_VALID&lt;&gt;&quot;1&quot;" />
93 <Publish Dialog="InstallDirDlg" Control="Next" Event="NewDialog" Value="FeaturesDlg" Order="4" Condition="WIXUI_DONTVALIDATEPATH OR WIXUI_INSTALLDIR_VALID=&quot;1&quot;" />
94 <Publish Dialog="InstallDirDlg" Control="ChangeFolder" Property="_BrowseProperty" Value="[WIXUI_INSTALLDIR]" Order="1" />
95 <Publish Dialog="InstallDirDlg" Control="ChangeFolder" Event="SpawnDialog" Value="BrowseDlg" Order="2" />
96
97 <Publish Dialog="FeaturesDlg" Control="Back" Event="NewDialog" Value="InstallScopeDlg" Condition="NOT Installed AND WixAppFolder = &quot;WixPerUserFolder&quot;" />
98 <Publish Dialog="FeaturesDlg" Control="Back" Event="NewDialog" Value="InstallDirDlg" Condition="NOT Installed AND WixAppFolder = &quot;WixPerMachineFolder&quot;" />
99 <Publish Dialog="FeaturesDlg" Control="Back" Event="NewDialog" Value="MaintenanceTypeDlg" Condition="Installed" />
100
101 <Publish Dialog="MaintenanceWelcomeDlg" Control="Next" Event="NewDialog" Value="MaintenanceTypeDlg" />
102
103 <Publish Dialog="MaintenanceTypeDlg" Control="ChangeButton" Event="NewDialog" Value="FeaturesDlg" />
104 <Publish Dialog="MaintenanceTypeDlg" Control="RepairButton" Event="NewDialog" Value="VerifyReadyDlg" />
105 <Publish Dialog="MaintenanceTypeDlg" Control="RemoveButton" Event="NewDialog" Value="VerifyReadyDlg" />
106 <Publish Dialog="MaintenanceTypeDlg" Control="Back" Event="NewDialog" Value="MaintenanceWelcomeDlg" />
107
108 <Publish Dialog="VerifyReadyDlg" Control="Back" Event="NewDialog" Value="MaintenanceTypeDlg" Order="2" Condition="Installed AND NOT PATCH" />
109 <Publish Dialog="VerifyReadyDlg" Control="Back" Event="NewDialog" Value="WelcomeDlg" Order="3" Condition="Installed AND PATCH" />
110
111 <Publish Dialog="WelcomeDlg" Control="Next" Event="NewDialog" Value="VerifyReadyDlg" Condition="Installed AND PATCH" />
112 </UI>
113
114 <InstallUISequence>
115 <Show Dialog="WelcomeDlg" Before="AdvancedWelcomeEulaDlg" Condition="Installed AND PATCH" />
116 </InstallUISequence>
117
118 <Property Id="WIXUI_INSTALLDIR" Value="APPLICATIONFOLDER" />
119 <UIRef Id="WixUI_Common" />
120 </Fragment>
121</Wix>
diff --git a/src/ext/UI/wixlib/WixUI_FeatureTree.wxs b/src/ext/UI/wixlib/WixUI_FeatureTree.wxs
new file mode 100644
index 00000000..e999f2fe
--- /dev/null
+++ b/src/ext/UI/wixlib/WixUI_FeatureTree.wxs
@@ -0,0 +1,69 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2
3
4
5<!--
6First-time install dialog sequence:
7 - WixUI_WelcomeDlg
8 - WixUI_LicenseAgreementDlg
9 - WixUI_CustomizeDlg
10 - WixUI_VerifyReadyDlg
11 - WixUI_DiskCostDlg
12
13Maintenance dialog sequence:
14 - WixUI_MaintenanceWelcomeDlg
15 - WixUI_MaintenanceTypeDlg
16 - WixUI_CustomizeDlg
17 - WixUI_VerifyReadyDlg
18
19Patch dialog sequence:
20 - WixUI_WelcomeDlg
21 - WixUI_VerifyReadyDlg
22-->
23
24<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
25 <Fragment>
26 <UI Id="WixUI_FeatureTree">
27 <TextStyle Id="WixUI_Font_Normal" FaceName="Tahoma" Size="8" />
28 <TextStyle Id="WixUI_Font_Bigger" FaceName="Tahoma" Size="12" />
29 <TextStyle Id="WixUI_Font_Title" FaceName="Tahoma" Size="9" Bold="yes" />
30
31 <Property Id="DefaultUIFont" Value="WixUI_Font_Normal" />
32 <Property Id="WixUI_Mode" Value="FeatureTree" />
33
34 <DialogRef Id="ErrorDlg" />
35 <DialogRef Id="FatalError" />
36 <DialogRef Id="FilesInUse" />
37 <DialogRef Id="MsiRMFilesInUse" />
38 <DialogRef Id="PrepareDlg" />
39 <DialogRef Id="ProgressDlg" />
40 <DialogRef Id="ResumeDlg" />
41 <DialogRef Id="UserExit" />
42
43 <Publish Dialog="ExitDialog" Control="Finish" Event="EndDialog" Value="Return" Order="999" />
44
45 <Publish Dialog="WelcomeDlg" Control="Next" Event="NewDialog" Value="LicenseAgreementDlg" Condition="NOT Installed" />
46 <Publish Dialog="WelcomeDlg" Control="Next" Event="NewDialog" Value="VerifyReadyDlg" Condition="Installed AND PATCH" />
47
48 <Publish Dialog="LicenseAgreementDlg" Control="Back" Event="NewDialog" Value="WelcomeDlg" />
49 <Publish Dialog="LicenseAgreementDlg" Control="Next" Event="NewDialog" Value="CustomizeDlg" Condition="LicenseAccepted = &quot;1&quot;" />
50
51 <Publish Dialog="CustomizeDlg" Control="Back" Event="NewDialog" Value="MaintenanceTypeDlg" Order="1" Condition="Installed" />
52 <Publish Dialog="CustomizeDlg" Control="Back" Event="NewDialog" Value="LicenseAgreementDlg" Order="2" Condition="NOT Installed" />
53 <Publish Dialog="CustomizeDlg" Control="Next" Event="NewDialog" Value="VerifyReadyDlg" />
54
55 <Publish Dialog="VerifyReadyDlg" Control="Back" Event="NewDialog" Value="CustomizeDlg" Order="1" Condition="NOT Installed OR WixUI_InstallMode = &quot;Change&quot;" />
56 <Publish Dialog="VerifyReadyDlg" Control="Back" Event="NewDialog" Value="MaintenanceTypeDlg" Order="2" Condition="Installed AND NOT PATCH" />
57 <Publish Dialog="VerifyReadyDlg" Control="Back" Event="NewDialog" Value="WelcomeDlg" Order="3" Condition="Installed AND PATCH" />
58
59 <Publish Dialog="MaintenanceWelcomeDlg" Control="Next" Event="NewDialog" Value="MaintenanceTypeDlg" />
60
61 <Publish Dialog="MaintenanceTypeDlg" Control="ChangeButton" Event="NewDialog" Value="CustomizeDlg" />
62 <Publish Dialog="MaintenanceTypeDlg" Control="RepairButton" Event="NewDialog" Value="VerifyReadyDlg" />
63 <Publish Dialog="MaintenanceTypeDlg" Control="RemoveButton" Event="NewDialog" Value="VerifyReadyDlg" />
64 <Publish Dialog="MaintenanceTypeDlg" Control="Back" Event="NewDialog" Value="MaintenanceWelcomeDlg" />
65 </UI>
66
67 <UIRef Id="WixUI_Common" />
68 </Fragment>
69</Wix>
diff --git a/src/ext/UI/wixlib/WixUI_InstallDir.wxs b/src/ext/UI/wixlib/WixUI_InstallDir.wxs
new file mode 100644
index 00000000..afe7820f
--- /dev/null
+++ b/src/ext/UI/wixlib/WixUI_InstallDir.wxs
@@ -0,0 +1,78 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2
3
4
5<!--
6First-time install dialog sequence:
7 - WixUI_WelcomeDlg
8 - WixUI_LicenseAgreementDlg
9 - WixUI_InstallDirDlg
10 - WixUI_VerifyReadyDlg
11 - WixUI_DiskCostDlg
12
13Maintenance dialog sequence:
14 - WixUI_MaintenanceWelcomeDlg
15 - WixUI_MaintenanceTypeDlg
16 - WixUI_InstallDirDlg
17 - WixUI_VerifyReadyDlg
18
19Patch dialog sequence:
20 - WixUI_WelcomeDlg
21 - WixUI_VerifyReadyDlg
22
23-->
24
25<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
26 <Fragment>
27 <UI Id="WixUI_InstallDir">
28 <TextStyle Id="WixUI_Font_Normal" FaceName="Tahoma" Size="8" />
29 <TextStyle Id="WixUI_Font_Bigger" FaceName="Tahoma" Size="12" />
30 <TextStyle Id="WixUI_Font_Title" FaceName="Tahoma" Size="9" Bold="yes" />
31
32 <Property Id="DefaultUIFont" Value="WixUI_Font_Normal" />
33 <Property Id="WixUI_Mode" Value="InstallDir" />
34
35 <DialogRef Id="BrowseDlg" />
36 <DialogRef Id="DiskCostDlg" />
37 <DialogRef Id="ErrorDlg" />
38 <DialogRef Id="FatalError" />
39 <DialogRef Id="FilesInUse" />
40 <DialogRef Id="MsiRMFilesInUse" />
41 <DialogRef Id="PrepareDlg" />
42 <DialogRef Id="ProgressDlg" />
43 <DialogRef Id="ResumeDlg" />
44 <DialogRef Id="UserExit" />
45 <Publish Dialog="BrowseDlg" Control="OK" Event="DoAction" Value="WixUIValidatePath" Order="3" />
46 <Publish Dialog="BrowseDlg" Control="OK" Event="SpawnDialog" Value="InvalidDirDlg" Order="4" Condition="NOT WIXUI_DONTVALIDATEPATH AND WIXUI_INSTALLDIR_VALID&lt;&gt;&quot;1&quot;" />
47
48 <Publish Dialog="ExitDialog" Control="Finish" Event="EndDialog" Value="Return" Order="999" />
49
50 <Publish Dialog="WelcomeDlg" Control="Next" Event="NewDialog" Value="LicenseAgreementDlg" Condition="NOT Installed" />
51 <Publish Dialog="WelcomeDlg" Control="Next" Event="NewDialog" Value="VerifyReadyDlg" Condition="Installed AND PATCH" />
52
53 <Publish Dialog="LicenseAgreementDlg" Control="Back" Event="NewDialog" Value="WelcomeDlg" />
54 <Publish Dialog="LicenseAgreementDlg" Control="Next" Event="NewDialog" Value="InstallDirDlg" Condition="LicenseAccepted = &quot;1&quot;" />
55
56 <Publish Dialog="InstallDirDlg" Control="Back" Event="NewDialog" Value="LicenseAgreementDlg" />
57 <Publish Dialog="InstallDirDlg" Control="Next" Event="SetTargetPath" Value="[WIXUI_INSTALLDIR]" Order="1" />
58 <Publish Dialog="InstallDirDlg" Control="Next" Event="DoAction" Value="WixUIValidatePath" Order="2" Condition="NOT WIXUI_DONTVALIDATEPATH" />
59 <Publish Dialog="InstallDirDlg" Control="Next" Event="SpawnDialog" Value="InvalidDirDlg" Order="3" Condition="NOT WIXUI_DONTVALIDATEPATH AND WIXUI_INSTALLDIR_VALID&lt;&gt;&quot;1&quot;" />
60 <Publish Dialog="InstallDirDlg" Control="Next" Event="NewDialog" Value="VerifyReadyDlg" Order="4" Condition="WIXUI_DONTVALIDATEPATH OR WIXUI_INSTALLDIR_VALID=&quot;1&quot;" />
61 <Publish Dialog="InstallDirDlg" Control="ChangeFolder" Property="_BrowseProperty" Value="[WIXUI_INSTALLDIR]" Order="1" />
62 <Publish Dialog="InstallDirDlg" Control="ChangeFolder" Event="SpawnDialog" Value="BrowseDlg" Order="2" />
63 <Publish Dialog="VerifyReadyDlg" Control="Back" Event="NewDialog" Value="InstallDirDlg" Order="1" Condition="NOT Installed" />
64 <Publish Dialog="VerifyReadyDlg" Control="Back" Event="NewDialog" Value="MaintenanceTypeDlg" Order="2" Condition="Installed AND NOT PATCH" />
65 <Publish Dialog="VerifyReadyDlg" Control="Back" Event="NewDialog" Value="WelcomeDlg" Order="2" Condition="Installed AND PATCH" />
66
67 <Publish Dialog="MaintenanceWelcomeDlg" Control="Next" Event="NewDialog" Value="MaintenanceTypeDlg" />
68
69 <Publish Dialog="MaintenanceTypeDlg" Control="RepairButton" Event="NewDialog" Value="VerifyReadyDlg" />
70 <Publish Dialog="MaintenanceTypeDlg" Control="RemoveButton" Event="NewDialog" Value="VerifyReadyDlg" />
71 <Publish Dialog="MaintenanceTypeDlg" Control="Back" Event="NewDialog" Value="MaintenanceWelcomeDlg" />
72
73 <Property Id="ARPNOMODIFY" Value="1" />
74 </UI>
75
76 <UIRef Id="WixUI_Common" />
77 </Fragment>
78</Wix>
diff --git a/src/ext/UI/wixlib/WixUI_Minimal.wxs b/src/ext/UI/wixlib/WixUI_Minimal.wxs
new file mode 100644
index 00000000..08dba96d
--- /dev/null
+++ b/src/ext/UI/wixlib/WixUI_Minimal.wxs
@@ -0,0 +1,63 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2
3
4
5<!--
6First-time install dialog sequence:
7 - WixUI_WelcomeEulaDlg
8
9Maintenance dialog sequence:
10 WixUI_MaintenanceWelcomeDlg
11 - WixUI_MaintenanceTypeDlg
12 - WixUI_VerifyReadyDlg
13
14Patch dialog sequence:
15 - WixUI_WelcomeDlg
16 - WixUI_VerifyReadyDlg
17-->
18
19<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
20 <Fragment>
21 <UI Id="WixUI_Minimal">
22 <TextStyle Id="WixUI_Font_Normal" FaceName="Tahoma" Size="8" />
23 <TextStyle Id="WixUI_Font_Bigger" FaceName="Tahoma" Size="12" />
24 <TextStyle Id="WixUI_Font_Title" FaceName="Tahoma" Size="9" Bold="yes" />
25
26 <Property Id="DefaultUIFont" Value="WixUI_Font_Normal" />
27 <Property Id="WixUI_Mode" Value="Minimal" />
28
29 <DialogRef Id="ErrorDlg" />
30 <DialogRef Id="FatalError" />
31 <DialogRef Id="FilesInUse" />
32 <DialogRef Id="MsiRMFilesInUse" />
33 <DialogRef Id="PrepareDlg" />
34 <DialogRef Id="ProgressDlg" />
35 <DialogRef Id="ResumeDlg" />
36 <DialogRef Id="UserExit" />
37 <DialogRef Id="WelcomeDlg" />
38 <DialogRef Id="WelcomeEulaDlg" />
39
40 <Publish Dialog="ExitDialog" Control="Finish" Event="EndDialog" Value="Return" Order="999" />
41
42 <Publish Dialog="VerifyReadyDlg" Control="Back" Event="NewDialog" Value="MaintenanceTypeDlg" />
43
44 <Publish Dialog="MaintenanceWelcomeDlg" Control="Next" Event="NewDialog" Value="MaintenanceTypeDlg" />
45
46 <Publish Dialog="MaintenanceTypeDlg" Control="RepairButton" Event="NewDialog" Value="VerifyReadyDlg" />
47 <Publish Dialog="MaintenanceTypeDlg" Control="RemoveButton" Event="NewDialog" Value="VerifyReadyDlg" />
48 <Publish Dialog="MaintenanceTypeDlg" Control="Back" Event="NewDialog" Value="MaintenanceWelcomeDlg" />
49
50 <Publish Dialog="WelcomeDlg" Control="Next" Event="NewDialog" Value="VerifyReadyDlg" Condition="Installed AND PATCH" />
51 <Publish Dialog="VerifyReadyDlg" Control="Back" Event="NewDialog" Value="WelcomeDlg" Order="2" Condition="Installed AND PATCH" />
52
53 <InstallUISequence>
54 <Show Dialog="WelcomeDlg" Before="WelcomeEulaDlg" Condition="Installed AND PATCH" />
55 <Show Dialog="WelcomeEulaDlg" Before="ProgressDlg" Condition="NOT Installed" />
56 </InstallUISequence>
57
58 <Property Id="ARPNOMODIFY" Value="1" />
59 </UI>
60
61 <UIRef Id="WixUI_Common" />
62 </Fragment>
63</Wix>
diff --git a/src/ext/UI/wixlib/WixUI_Mondo.wxs b/src/ext/UI/wixlib/WixUI_Mondo.wxs
new file mode 100644
index 00000000..2d53b9dd
--- /dev/null
+++ b/src/ext/UI/wixlib/WixUI_Mondo.wxs
@@ -0,0 +1,78 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2
3
4
5<!--
6First-time install dialog sequence:
7- WixUI_WelcomeDlg
8- WixUI_LicenseAgreementDlg
9- WixUI_SetupTypeDlg
10- WixUI_VerifyReadyDlg
11- WixUI_CustomizeDlg
12- WixUI_DiskCostDlg
13- WixUI_BrowseDlg
14
15Maintenance dialog sequence:
16- WixUI_MaintenanceWelcomeDlg
17- WixUI_MaintenanceTypeDlg
18- WixUI_CustomizeDlg
19- WixUI_VerifyReadyDlg
20
21Patch dialog sequence:
22 - WixUI_WelcomeDlg
23 - WixUI_VerifyReadyDlg
24-->
25
26<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
27 <Fragment>
28 <UI Id="WixUI_Mondo">
29 <TextStyle Id="WixUI_Font_Normal" FaceName="Tahoma" Size="8" />
30 <TextStyle Id="WixUI_Font_Bigger" FaceName="Tahoma" Size="12" />
31 <TextStyle Id="WixUI_Font_Title" FaceName="Tahoma" Size="9" Bold="yes" />
32
33 <Property Id="DefaultUIFont" Value="WixUI_Font_Normal" />
34 <Property Id="WixUI_Mode" Value="Mondo" />
35
36 <DialogRef Id="ErrorDlg" />
37 <DialogRef Id="FatalError" />
38 <DialogRef Id="FilesInUse" />
39 <DialogRef Id="MsiRMFilesInUse" />
40 <DialogRef Id="PrepareDlg" />
41 <DialogRef Id="ProgressDlg" />
42 <DialogRef Id="ResumeDlg" />
43 <DialogRef Id="UserExit" />
44
45 <Publish Dialog="ExitDialog" Control="Finish" Event="EndDialog" Value="Return" Order="999" />
46
47 <Publish Dialog="WelcomeDlg" Control="Next" Event="NewDialog" Value="LicenseAgreementDlg" Condition="NOT Installed AND NOT PATCH" />
48 <Publish Dialog="WelcomeDlg" Control="Next" Event="NewDialog" Value="VerifyReadyDlg" Condition="Installed AND PATCH" />
49
50 <Publish Dialog="LicenseAgreementDlg" Control="Back" Event="NewDialog" Value="WelcomeDlg" />
51 <Publish Dialog="LicenseAgreementDlg" Control="Next" Event="NewDialog" Value="SetupTypeDlg" Order="2" Condition="LicenseAccepted = &quot;1&quot;" />
52
53 <Publish Dialog="SetupTypeDlg" Control="Back" Event="NewDialog" Value="LicenseAgreementDlg" />
54 <Publish Dialog="SetupTypeDlg" Control="TypicalButton" Event="NewDialog" Value="VerifyReadyDlg" />
55 <Publish Dialog="SetupTypeDlg" Control="CustomButton" Event="NewDialog" Value="CustomizeDlg" />
56 <Publish Dialog="SetupTypeDlg" Control="CompleteButton" Event="NewDialog" Value="VerifyReadyDlg" />
57
58 <Publish Dialog="CustomizeDlg" Control="Back" Event="NewDialog" Value="MaintenanceTypeDlg" Order="1" Condition="WixUI_InstallMode = &quot;Change&quot;" />
59 <Publish Dialog="CustomizeDlg" Control="Back" Event="NewDialog" Value="SetupTypeDlg" Order="2" Condition="WixUI_InstallMode = &quot;InstallCustom&quot;" />
60 <Publish Dialog="CustomizeDlg" Control="Next" Event="NewDialog" Value="VerifyReadyDlg" />
61
62 <Publish Dialog="VerifyReadyDlg" Control="Back" Event="NewDialog" Value="CustomizeDlg" Order="1" Condition="WixUI_InstallMode = &quot;InstallCustom&quot;" />
63 <Publish Dialog="VerifyReadyDlg" Control="Back" Event="NewDialog" Value="SetupTypeDlg" Order="2" Condition="WixUI_InstallMode = &quot;InstallTypical&quot; OR WixUI_InstallMode = &quot;InstallComplete&quot;" />
64 <Publish Dialog="VerifyReadyDlg" Control="Back" Event="NewDialog" Value="CustomizeDlg" Order="3" Condition="WixUI_InstallMode = &quot;Change&quot;" />
65 <Publish Dialog="VerifyReadyDlg" Control="Back" Event="NewDialog" Value="MaintenanceTypeDlg" Order="4" Condition="WixUI_InstallMode = &quot;Repair&quot; OR WixUI_InstallMode = &quot;Remove&quot;" />
66 <Publish Dialog="VerifyReadyDlg" Control="Back" Event="NewDialog" Value="WelcomeDlg" Order="2" Condition="WixUI_InstallMode = &quot;Update&quot;" />
67
68 <Publish Dialog="MaintenanceWelcomeDlg" Control="Next" Event="NewDialog" Value="MaintenanceTypeDlg" />
69
70 <Publish Dialog="MaintenanceTypeDlg" Control="ChangeButton" Event="NewDialog" Value="CustomizeDlg" />
71 <Publish Dialog="MaintenanceTypeDlg" Control="RepairButton" Event="NewDialog" Value="VerifyReadyDlg" />
72 <Publish Dialog="MaintenanceTypeDlg" Control="RemoveButton" Event="NewDialog" Value="VerifyReadyDlg" />
73 <Publish Dialog="MaintenanceTypeDlg" Control="Back" Event="NewDialog" Value="MaintenanceWelcomeDlg" />
74 </UI>
75
76 <UIRef Id="WixUI_Common" />
77 </Fragment>
78</Wix>
diff --git a/src/ext/UI/wixlib/WixUI_ar-SA.wxl b/src/ext/UI/wixlib/WixUI_ar-SA.wxl
new file mode 100644
index 00000000..fa57db85
--- /dev/null
+++ b/src/ext/UI/wixlib/WixUI_ar-SA.wxl
@@ -0,0 +1,598 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3
4
5<WixLocalization Culture="ar-sa" Codepage="1256" xmlns="http://wixtoolset.org/schemas/v4/wxl">
6 <String Id="WixUIBack" Overridable="yes">ال&amp;سابق</String>
7 <String Id="WixUINext" Overridable="yes">التا&amp;لي</String>
8 <String Id="WixUICancel" Overridable="yes">إلغاء الأمر</String>
9 <String Id="WixUIFinish" Overridable="yes">إ&amp;نهاء</String>
10 <String Id="WixUIRetry" Overridable="yes">إ&amp;عادة المحاولة</String>
11 <String Id="WixUIIgnore" Overridable="yes">تجا&amp;هل</String>
12 <String Id="WixUIYes" Overridable="yes">ن&amp;عم</String>
13 <String Id="WixUINo" Overridable="yes">&amp;لا</String>
14 <String Id="WixUIOK" Overridable="yes">موافق</String>
15 <String Id="WixUIPrint" Overridable="yes">&amp;طباعة</String>
16
17 <String Id="AdvancedWelcomeEulaDlg_Title" Overridable="yes">إعداد [ProductName]</String>
18 <String Id="AdvancedWelcomeEulaDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
19 <String Id="AdvancedWelcomeEulaDlgTitle" Overridable="yes">{\WixUI_Font_Title}الرجاء قراءة اتفاقية ترخيص [ProductName]</String>
20 <String Id="AdvancedWelcomeEulaDlgLicenseAcceptedCheckBox" Overridable="yes">أوافق &amp;على الشروط الواردة في اتفاقية الترخيص</String>
21 <String Id="AdvancedWelcomeEulaDlgDescriptionPerMachine" Overridable="yes">انقر فوق "تثبيت" لتثبيت المنتج بالخيارات الافتراضية لجميع المستخدمين. انقر فوق "‏‏خيارات متقدمة" لتغيير خيارات التثبيت.</String>
22 <String Id="AdvancedWelcomeEulaDlgDescriptionPerUser" Overridable="yes">انقر فوق "تثبيت" لتثبيت المنتج بالخيارات الافتراضية لك فقط. انقر فوق "خيارات متقدمة" لتغيير خيارات التثبيت.</String>
23 <String Id="AdvancedWelcomeEulaDlgInstall" Overridable="yes">ت&amp;ثبيت</String>
24 <String Id="AdvancedWelcomeEulaDlgAdvanced" Overridable="yes">خيارات &amp;متقدمة</String>
25 <String Id="Advanced_Font_Normal_Size" Overridable="yes">8</String>
26 <String Id="Advanced_Font_Bigger_Size" Overridable="yes">12</String>
27 <String Id="Advanced_Font_Title_Size" Overridable="yes">9</String>
28 <String Id="Advanced_Font_Emphasized_Size" Overridable="yes">8</String>
29 <String Id="Advanced_Font_FaceName" Overridable="yes">Tahoma</String>
30
31 <String Id="BrowseDlg_Title" Overridable="yes">إعداد [ProductName]</String>
32 <String Id="BrowseDlgComboLabel" Overridable="yes">&amp;البحث في:</String>
33 <String Id="BrowseDlgWixUI_Bmp_Up" Overridable="yes">WixUI_Bmp_Up</String>
34 <String Id="BrowseDlgWixUI_Bmp_UpTooltip" Overridable="yes">مستوى واحد لأعلى</String>
35 <String Id="BrowseDlgNewFolder" Overridable="yes">WixUI_Bmp_New</String>
36 <String Id="BrowseDlgNewFolderTooltip" Overridable="yes">إنشاء مجلد جديد</String>
37 <String Id="BrowseDlgPathLabel" Overridable="yes">&amp;اسم المجلد:</String>
38 <String Id="BrowseDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
39 <String Id="BrowseDlgDescription" Overridable="yes">استعراض للوصول إلى المجلد الوجهة</String>
40 <String Id="BrowseDlgTitle" Overridable="yes">{\WixUI_Font_Title}تغيير المجلد الوجهة</String>
41
42 <String Id="CancelDlg_Title" Overridable="yes">إعداد [ProductName]</String>
43 <String Id="CancelDlgText" Overridable="yes">هل تريد بالتأكيد إلغاء تثبيت [ProductName]؟</String>
44 <String Id="CancelDlgIcon" Overridable="yes">WixUI_Ico_Info</String>
45 <String Id="CancelDlgIconTooltip" Overridable="yes">أيقونة المعلومات</String>
46
47 <String Id="CustomizeDlg_Title" Overridable="yes">إعداد [ProductName]</String>
48 <String Id="CustomizeDlgTree" Overridable="yes">شجرة التحديدات</String>
49 <String Id="CustomizeDlgBrowse" Overridable="yes">ا&amp;ستعراض...</String>
50 <String Id="CustomizeDlgReset" Overridable="yes">إ&amp;عادة تعيين</String>
51 <String Id="CustomizeDlgDiskCost" Overridable="yes">ا&amp;ستخدام القرص</String>
52 <String Id="CustomizeDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
53 <String Id="CustomizeDlgText" Overridable="yes">انقر فوق الأيقونات الموجودة في الشجرة أدناه لتغيير الطريقة التي سيتم بها تثبيت الميزات.</String>
54 <String Id="CustomizeDlgDescription" Overridable="yes">حدد الطريقة التي تريد بها تثبيت الميزات.</String>
55 <String Id="CustomizeDlgTitle" Overridable="yes">{\WixUI_Font_Title}إعداد مخصص</String>
56 <String Id="CustomizeDlgItemDescription" Overridable="yes">CustomizeDlgItemDescription-CustomizeDlgItemDescription</String>
57 <String Id="CustomizeDlgItemSize" Overridable="yes">CustomizeDlgItemSize-CustomizeDlgItemSize</String>
58 <String Id="CustomizeDlgLocation" Overridable="yes">CustomizeDlgLocation-CustomizeDlgLocation</String>
59 <String Id="CustomizeDlgLocationLabel" Overridable="yes">الموقع:</String>
60
61 <String Id="DiskCostDlg_Title" Overridable="yes">إعداد [ProductName]</String>
62 <String Id="DiskCostDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
63 <String Id="DiskCostDlgText" Overridable="yes">لا يتوفر في وحدات التخزين المميزة مساحة قرص كافية للميزات المحددة حاليًا. يمكنك إما إزالة بعض الملفات من وحدات التخزين المميزة، أو تثبيت ميزات أقل، أو تحديد محركات أقراص وجهة مختلفة.</String>
64 <String Id="DiskCostDlgDescription" Overridable="yes">مساحة القرص المطلوبة لتثبيت الميزات المحددة.</String>
65 <String Id="DiskCostDlgTitle" Overridable="yes">{\WixUI_Font_Title}متطلبات مساحة القرص</String>
66 <String Id="DiskCostDlgVolumeList" Overridable="yes">{120}{70}{70}{70}{70}</String>
67
68 <String Id="ErrorDlg_Title" Overridable="yes">إعداد [ProductName]</String>
69 <String Id="ErrorDlgErrorText" Overridable="yes">نص المعلومات</String>
70 <String Id="ErrorDlgErrorIcon" Overridable="yes">WixUI_Ico_Info</String>
71 <String Id="ErrorDlgErrorIconTooltip" Overridable="yes">أيقونة المعلومات</String>
72
73 <String Id="ExitDialog_Title" Overridable="yes">إعداد [ProductName]</String>
74 <String Id="ExitDialogBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
75 <String Id="ExitDialogDescription" Overridable="yes">انقر فوق الزر "إنهاء" لإنهاء "معالج الإعداد".</String>
76 <String Id="ExitDialogTitle" Overridable="yes">{\WixUI_Font_Bigger}اكتمل معالج إعداد [ProductName]</String>
77
78 <String Id="FatalError_Title" Overridable="yes">إعداد [ProductName]</String>
79 <String Id="FatalErrorBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
80 <String Id="FatalErrorTitle" Overridable="yes">{\WixUI_Font_Bigger}انتهى معالج إعداد [ProductName] قبل الأوان</String>
81 <String Id="FatalErrorDescription1" Overridable="yes">انتهى معالج إعداد [ProductName] قبل الأوان بسبب حدوث خطأ. لم يتم تعديل النظام الخاص بك. ولتثبيت هذا البرنامج في وقت لاحق، قم بتشغيل "معالج الإعداد" مرة أخرى.</String>
82 <String Id="FatalErrorDescription2" Overridable="yes">انقر فوق الزر "إنهاء" لإنهاء "معالج الإعداد".</String>
83
84 <String Id="FeaturesDlg_Title" Overridable="yes">إعداد [ProductName]</String>
85 <String Id="FeaturesDlgTree" Overridable="yes">ميزات المنتج</String>
86 <String Id="FeaturesDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
87 <String Id="FeaturesDlgDescription" Overridable="yes">حدد الطريقة التي تريد بها تثبيت الميزات.</String>
88 <String Id="FeaturesDlgTitle" Overridable="yes">{\WixUI_Font_Title}ميزات المنتج</String>
89 <String Id="FeaturesDlgItemDescription" Overridable="yes">FeaturesDlgItemDescription</String>
90 <String Id="FeaturesDlgItemSize" Overridable="yes">FeaturesDlgItemSize</String>
91 <String Id="FeaturesDlgInstall" Overridable="yes">ت&amp;ثبيت</String>
92 <String Id="FeaturesDlgChange" Overridable="yes">&amp;تغيير</String>
93
94 <String Id="FilesInUse_Title" Overridable="yes">إعداد [ProductName]</String>
95 <String Id="FilesInUseExit" Overridable="yes">إ&amp;نهاء</String>
96 <String Id="FilesInUseBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
97 <String Id="FilesInUseText" Overridable="yes">تستخدم التطبيقات التالية ملفات يلزم تحديثها من خلال هذا الإعداد. أغلق التطبيقات، ثم انقر فوق "إ&amp;عادة المحاولة" لمتابعة التثبيت، أو انقر فوق "إنهاء" لإنهائه.</String>
98 <String Id="FilesInUseDescription" Overridable="yes">بعض الملفات التي يلزم تحديثها قيد الاستخدام حاليًا.</String>
99 <String Id="FilesInUseTitle" Overridable="yes">{\WixUI_Font_Title}الملفات قيد الاستخدام</String>
100
101 <String Id="InstallDirDlg_Title" Overridable="yes">إعداد [ProductName]</String>
102 <String Id="InstallDirDlgChange" Overridable="yes">&amp;تغيير...</String>
103 <String Id="InstallDirDlgTitle" Overridable="yes">{\WixUI_Font_Title}المجلد الوجهة</String>
104 <String Id="InstallDirDlgDescription" Overridable="yes">انقر فوق "التالي" لتثبيت المجلد الافتراضي أو انقر فوق "تغيير" لاختيار مجلد آخر.</String>
105 <String Id="InstallDirDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
106 <String Id="InstallDirDlgFolderLabel" Overridable="yes">تثبيت [ProductName] على:</String>
107
108 <String Id="InstallScopeDlg_Title" Overridable="yes">إعداد [ProductName]</String>
109 <String Id="InstallScopeDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
110 <String Id="InstallScopeDlgDescription" Overridable="yes">اختر نطاق التثبيت والمجلد</String>
111 <String Id="InstallScopeDlgTitle" Overridable="yes">{\WixUI_Font_Title}نطاق التثبيت</String>
112 <String Id="InstallScopeDlgPerUser" Overridable="yes">{\WixUI_Font_Emphasized}التثبيت لك &amp;فقط ([LogonUser])</String>
113 <String Id="InstallScopeDlgPerUserDescription" Overridable="yes">سيتم تثبيت [ProductName] في مجلد لكل مستخدم ولن يكون متوفرًا سوى لحساب المستخدم الخاص بك. ولا تحتاج إلى امتيازات مسؤول محلي.</String>
114 <String Id="InstallScopeDlgNoPerUserDescription" Overridable="yes">لا يدعم [ProductName] التثبيت لكل مستخدم.</String>
115 <String Id="InstallScopeDlgPerMachine" Overridable="yes">{\WixUI_Font_Emphasized}التثبيت لجميع مستخدمي هذا &amp;الجهاز</String>
116 <String Id="InstallScopeDlgPerMachineDescription" Overridable="yes">سيتم تثبيت [ProductName] في مجلد لكل جهاز افتراضيًا ويكون متوفرًا لجميع المستخدمين. ويمكنك تغيير مجلد التثبيت الافتراضي. يجب أن تكون لديك امتيازات مسؤول محلي.</String>
117 <String Id="InstallScopeDlgFolderLabel" Overridable="yes">مجلد ال&amp;تثبيت:</String>
118 <String Id="InstallScopeDlgChange" Overridable="yes">&amp;تغيير...</String>
119
120 <String Id="InvalidDirDlg_Title" Overridable="yes">إعداد [ProductName]</String>
121 <String Id="InvalidDirDlgText" Overridable="yes">يجب أن يكون دليل التثبيت على محرك الأقراص الثابتة المحلي.</String>
122 <String Id="InvalidDirDlgIcon" Overridable="yes">WixUI_Ico_Info</String>
123 <String Id="InvalidDirDlgIconTooltip" Overridable="yes">أيقونة المعلومات</String>
124
125 <String Id="LicenseAgreementDlg_Title" Overridable="yes">إعداد [ProductName]</String>
126 <String Id="LicenseAgreementDlgLicenseAcceptedCheckBox" Overridable="yes">أوافق &amp;على الشروط الواردة في اتفاقية الترخيص</String>
127 <String Id="LicenseAgreementDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
128 <String Id="LicenseAgreementDlgDescription" Overridable="yes">الرجاء قراءة اتفاقية الترخيص التالية بعناية</String>
129 <String Id="LicenseAgreementDlgTitle" Overridable="yes">{\WixUI_Font_Title}اتفاقية ترخيص المستخدم</String>
130
131 <String Id="MaintenanceTypeDlg_Title" Overridable="yes">إعداد [ProductName]</String>
132 <String Id="MaintenanceTypeDlgChangeButton" Overridable="yes">&amp;تغيير</String>
133 <String Id="MaintenanceTypeDlgChangeButtonTooltip" Overridable="yes">تغيير التثبيت</String>
134 <String Id="MaintenanceTypeDlgRepairButton" Overridable="yes">إ&amp;صلاح</String>
135 <String Id="MaintenanceTypeDlgRepairButtonTooltip" Overridable="yes">إصلاح التثبيت</String>
136 <String Id="MaintenanceTypeDlgRemoveButton" Overridable="yes">إزا&amp;لة</String>
137 <String Id="MaintenanceTypeDlgRemoveButtonTooltip" Overridable="yes">إزالة التثبيت</String>
138 <String Id="MaintenanceTypeDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
139 <String Id="MaintenanceTypeDlgDescription" Overridable="yes">حدد العملية التي ترغب في تنفيذها.</String>
140 <String Id="MaintenanceTypeDlgTitle" Overridable="yes">{\WixUI_Font_Title}تغيير التثبيت أو إصلاحه أو إزالته</String>
141 <String Id="MaintenanceTypeDlgChangeText" Overridable="yes">للسماح لك بتغيير طريقة تثبيت الميزات.</String>
142 <String Id="MaintenanceTypeDlgChangeDisabledText" Overridable="yes">لا يحتوي [ProductName] على ميزات انتقائية بشكل مستقل.</String>
143 <String Id="MaintenanceTypeDlgRemoveText" Overridable="yes">لإزالة [ProductName] من الكمبيوتر.</String>
144 <String Id="MaintenanceTypeDlgRemoveDisabledText" Overridable="yes">لا يمكن إزالة [ProductName].</String>
145 <String Id="MaintenanceTypeDlgRepairText" Overridable="yes">لإصلاح الأخطاء في آخر تثبيت عن طريق إصلاح الملفات والاختصارات وإدخالات السجل المفقودة والتالفة.</String>
146 <String Id="MaintenanceTypeDlgRepairDisabledText" Overridable="yes">لا يمكن إصلاح [ProductName].</String>
147
148 <String Id="MaintenanceWelcomeDlg_Title" Overridable="yes">إعداد [ProductName]</String>
149 <String Id="MaintenanceWelcomeDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
150 <String Id="MaintenanceWelcomeDlgDescription" Overridable="yes">يتيح لك "معالج الإعداد" تغيير طريقة تثبيت ميزات [ProductName] على الكمبيوتر أو إزالتها من الكمبيوتر. انقر فوق "التالي" للمتابعة، أو انقر فوق "إلغاء الأمر" لإنهاء "معالج الإعداد".</String>
151 <String Id="MaintenanceWelcomeDlgTitle" Overridable="yes">{\WixUI_Font_Bigger}مرحبًا بك في معالج إعداد [ProductName]</String>
152
153 <String Id="MsiRMFilesInUse_Title" Overridable="yes">إعداد [ProductName]</String>
154 <String Id="MsiRMFilesInUseBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
155 <String Id="MsiRMFilesInUseText" Overridable="yes">تستخدم التطبيقات التالية ملفات يلزم تحديثها من خلال هذا الإعداد. يمكن السماح لمعالج الإعداد بإغلاقها ومحاولة إعادة تشغيلها أو إعادة تشغيل الجهاز لاحقًا.</String>
156 <String Id="MsiRMFilesInUseDescription" Overridable="yes">بعض الملفات التي يلزم تحديثها قيد الاستخدام حاليًا.</String>
157 <String Id="MsiRMFilesInUseTitle" Overridable="yes">{\WixUI_Font_Title}الملفات قيد الاستخدام</String>
158 <String Id="MsiRMFilesInUseUseRM" Overridable="yes">إ&amp;غلاق التطبيقات ومحاولة إعادة تشغيلها.</String>
159 <String Id="MsiRMFilesInUseDontUseRM" Overridable="yes">&amp;عدم إغلاق التطبيقات. يلزم إعادة تشغيل الكمبيوتر لاحقًا.</String>
160
161 <String Id="OutOfDiskDlg_Title" Overridable="yes">إعداد [ProductName]</String>
162 <String Id="OutOfDiskDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
163 <String Id="OutOfDiskDlgText" Overridable="yes">لا يتوفر في وحدات التخزين المميزة مساحة قرص كافية للميزات المحددة حاليًا. يمكنك إزالة بعض الملفات من وحدات التخزين المميزة أو تقليل عدد الميزات التي ترغب في تثبيتها أو تحديد محرك أقراص وجهة مختلف.</String>
164 <String Id="OutOfDiskDlgDescription" Overridable="yes">تجاوزت مساحة القرص المطلوبة للتثبيت مساحة القرص المتوفرة.</String>
165 <String Id="OutOfDiskDlgTitle" Overridable="yes">{\WixUI_Font_Title}نفدت مساحة القرص</String>
166 <String Id="OutOfDiskDlgVolumeList" Overridable="yes">{120}{70}{70}{70}{70}</String>
167
168 <String Id="OutOfRbDiskDlg_Title" Overridable="yes">إعداد [ProductName]</String>
169 <String Id="OutOfRbDiskDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
170 <String Id="OutOfRbDiskDlgText" Overridable="yes">لا يتوفر في وحدات التخزين المميزة مساحة قرص كافية للميزات المحددة حاليًا. يمكنك إزالة بعض الملفات من وحدات التخزين المميزة أو تقليل عدد الميزات التي ترغب في تثبيتها أو تحديد محرك أقراص وجهة مختلف.</String>
171 <String Id="OutOfRbDiskDlgDescription" Overridable="yes">تجاوزت مساحة القرص المطلوبة للتثبيت مساحة القرص المتوفرة.</String>
172 <String Id="OutOfRbDiskDlgTitle" Overridable="yes">{\WixUI_Font_Title}نفدت مساحة القرص</String>
173 <String Id="OutOfRbDiskDlgVolumeList" Overridable="yes">{120}{70}{70}{70}{70}</String>
174 <String Id="OutOfRbDiskDlgText2" Overridable="yes">بدلاً من ذلك، قد تختار تعطيل وظيفة ‏‏العودة إلى الحالة السابقة الخاصة بالمثبت. حيث يعمل تعطيل ‏‏العودة إلى الحالة السابقة على منع المثبت من إعادة الكمبيوتر إلى حالته الأصلية في حالة مقاطعة التثبيت بطريقة أو بأخرى. انقر فوق " نعم" إذا كنت ترغب في المخاطرة بتعطيل وظيفة العودة إلى الحالة السابقة.</String>
175
176 <String Id="PrepareDlg_Title" Overridable="yes">إعداد [ProductName]</String>
177 <String Id="PrepareDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
178 <String Id="PrepareDlgDescription" Overridable="yes">الرجاء الانتظار أثناء قيام "معالج الإعداد" بالتمهيد لإرشادك خلال عملية التثبيت.</String>
179 <String Id="PrepareDlgTitle" Overridable="yes">{\WixUI_Font_Bigger}مرحبًا بك في معالج إعداد [ProductName]</String>
180
181 <String Id="ProgressDlg_Title" Overridable="yes">إعداد [ProductName]</String>
182 <String Id="ProgressDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
183 <String Id="ProgressDlgTextInstalling" Overridable="yes">الرجاء الانتظار أثناء قيام "معالج الإعداد" بتثبيت [ProductName].</String>
184 <String Id="ProgressDlgTitleInstalling" Overridable="yes">{\WixUI_Font_Title}تثبيت [ProductName]</String>
185 <String Id="ProgressDlgTextChanging" Overridable="yes">الرجاء الانتظار أثناء قيام "معالج الإعداد" بتغيير [ProductName].</String>
186 <String Id="ProgressDlgTitleChanging" Overridable="yes">{\WixUI_Font_Title}تغيير [ProductName]</String>
187 <String Id="ProgressDlgTextRepairing" Overridable="yes">الرجاء الانتظار أثناء قيام "معالج الإعداد" بإصلاح [ProductName].</String>
188 <String Id="ProgressDlgTitleRepairing" Overridable="yes">{\WixUI_Font_Title}إصلاح [ProductName]</String>
189 <String Id="ProgressDlgTextRemoving" Overridable="yes">الرجاء الانتظار أثناء قيام "معالج الإعداد" بإزالة [ProductName].</String>
190 <String Id="ProgressDlgTitleRemoving" Overridable="yes">{\WixUI_Font_Title}إزالة [ProductName]</String>
191 <String Id="ProgressDlgTextUpdating" Overridable="yes">الرجاء الانتظار أثناء قيام معالج الإعداد بتحديث [ProductName].</String>
192 <String Id="ProgressDlgTitleUpdating" Overridable="yes">{\WixUI_Font_Title}تحديث [ProductName]</String>
193 <String Id="ProgressDlgProgressBar" Overridable="yes">نسبة التقدم</String>
194 <String Id="ProgressDlgStatusLabel" Overridable="yes">الحالة:</String>
195
196 <String Id="ResumeDlg_Title" Overridable="yes">إعداد [ProductName]</String>
197 <String Id="ResumeDlgInstall" Overridable="yes">ت&amp;ثبيت</String>
198 <String Id="ResumeDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
199 <String Id="ResumeDlgDescription" Overridable="yes">سيقوم "معالج الإعداد" بإكمال تثبيت [ProductName] على الكمبيوتر. انقر فوق "تثبيت" للمتابعة، أو انقر فوق "إلغاء الأمر" لإنهاء "معالج الإعداد".</String>
200 <String Id="ResumeDlgTitle" Overridable="yes">{\WixUI_Font_Bigger}استئناف معالج إعداد [ProductName]</String>
201
202 <String Id="SetupTypeDlg_Title" Overridable="yes">إعداد [ProductName]</String>
203 <String Id="SetupTypeDlgTypicalButton" Overridable="yes">&amp;نموذجي</String>
204 <String Id="SetupTypeDlgTypicalButtonTooltip" Overridable="yes">تثبيت نموذجي</String>
205 <String Id="SetupTypeDlgCustomButton" Overridable="yes">م&amp;خصص</String>
206 <String Id="SetupTypeDlgCustomButtonTooltip" Overridable="yes">تثبيت مخصص</String>
207 <String Id="SetupTypeDlgCompleteButton" Overridable="yes">&amp;كامل</String>
208 <String Id="SetupTypeDlgCompleteButtonTooltip" Overridable="yes">تثبيت كامل</String>
209 <String Id="SetupTypeDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
210 <String Id="SetupTypeDlgTitle" Overridable="yes">{\WixUI_Font_Title}اختيار نوع الإعداد</String>
211 <String Id="SetupTypeDlgDescription" Overridable="yes">اختر نوع الإعداد الأكثر ملاءمة لاحتياجاتك</String>
212 <String Id="SetupTypeDlgTypicalText" Overridable="yes">تثبيت ميزات البرنامج الأكثر شيوعًا. مستحسن لمعظم المستخدمين.</String>
213 <String Id="SetupTypeDlgCustomText" Overridable="yes">السماح للمستخدمين باختيار ميزات البرنامج التي سيتم تثبيتها وموقع تثبيتها. مستحسن للمستخدمين المتقدمين.</String>
214 <String Id="SetupTypeDlgCompleteText" Overridable="yes">سيتم تثبيت جميع ميزات البرنامج. وهذا يتطلب معظم مساحة القرص.</String>
215
216 <String Id="UserExit_Title" Overridable="yes">إعداد [ProductName]</String>
217 <String Id="UserExitBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
218 <String Id="UserExitTitle" Overridable="yes">{\WixUI_Font_Bigger}تمت مقاطعة معالج إعداد [ProductName]</String>
219 <String Id="UserExitDescription1" Overridable="yes">تمت مقاطعة إعداد [ProductName]. لم يتم تعديل النظام الخاص بك. الرجاء تشغيل التثبيت مرة أخرى لتثبيت هذا البرنامج في وقت لاحق.</String>
220 <String Id="UserExitDescription2" Overridable="yes">انقر فوق الزر "إنهاء" لإنهاء "معالج الإعداد".</String>
221
222 <String Id="VerifyReadyDlg_Title" Overridable="yes">إعداد [ProductName]</String>
223 <String Id="VerifyReadyDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
224 <String Id="VerifyReadyDlgInstall" Overridable="yes">ت&amp;ثبيت</String>
225 <String Id="VerifyReadyDlgInstallText" Overridable="yes">انقر فوق "تثبيت" لبدء التثبيت. وانقر فوق "السابق" لمراجعة أي من إعدادات التثبيت أو تغييرها. وانقر فوق "إلغاء الأمر" لإنهاء المعالج.</String>
226 <String Id="VerifyReadyDlgInstallTitle" Overridable="yes">{\WixUI_Font_Title}جاهز لتثبيت [ProductName]</String>
227 <String Id="VerifyReadyDlgChange" Overridable="yes">&amp;تغيير</String>
228 <String Id="VerifyReadyDlgChangeText" Overridable="yes">انقر فوق "تغيير" لبدء التثبيت. وانقر فوق "السابق" لمراجعة أي من إعدادات التثبيت أو تغييرها. وانقر فوق "إلغاء الأمر" لإنهاء المعالج.</String>
229 <String Id="VerifyReadyDlgChangeTitle" Overridable="yes">{\WixUI_Font_Title}جاهز لتغيير [ProductName]</String>
230 <String Id="VerifyReadyDlgRepair" Overridable="yes">إ&amp;صلاح</String>
231 <String Id="VerifyReadyDlgRepairText" Overridable="yes">انقر فوق "إصلاح" لإصلاح تثبيت [ProductName]. وانقر فوق "السابق" لمراجعة أي من إعدادات التثبيت أو تغييرها. وانقر فوق "إلغاء الأمر" لإنهاء المعالج.</String>
232 <String Id="VerifyReadyDlgRepairTitle" Overridable="yes">{\WixUI_Font_Title}جاهز لإصلاح [ProductName]</String>
233 <String Id="VerifyReadyDlgRemove" Overridable="yes">إزا&amp;لة</String>
234 <String Id="VerifyReadyDlgRemoveText" Overridable="yes">انقر فوق "إزالة" لإزالة [ProductName] من الكمبيوتر. وانقر فوق "السابق" لمراجعة أي من إعدادات التثبيت أو تغييرها. وانقر فوق "إلغاء الأمر" لإنهاء المعالج.</String>
235 <String Id="VerifyReadyDlgRemoveTitle" Overridable="yes">{\WixUI_Font_Title}جاهز لإزالة [ProductName]</String>
236 <String Id="VerifyReadyDlgUpdate" Overridable="yes">ت&amp;حديث</String>
237 <String Id="VerifyReadyDlgUpdateText" Overridable="yes">انقر فوق "تحديث" لتحديث [ProductName] من الكمبيوتر الخاص بك. وانقر فوق "السابق" لمراجعة أي من إعدادات التثبيت أو تغييرها. وانقر فوق "إلغاء الأمر" لإنهاء المعالج.</String>
238 <String Id="VerifyReadyDlgUpdateTitle" Overridable="yes">{\WixUI_Font_Title}جاهز لتحديث [ProductName]</String>
239
240 <String Id="WaitForCostingDlg_Title" Overridable="yes">إعداد [ProductName]</String>
241 <String Id="WaitForCostingDlgReturn" Overridable="yes">&amp;رجوع</String>
242 <String Id="WaitForCostingDlgText" Overridable="yes">الرجاء الانتظار حتى ينتهي المثبت من تحديد متطلبات مساحة القرص.</String>
243 <String Id="WaitForCostingDlgIcon" Overridable="yes">WixUI_Ico_Exclam</String>
244 <String Id="WaitForCostingDlgIconTooltip" Overridable="yes">أيقونة التعجب</String>
245
246 <String Id="WelcomeDlg_Title" Overridable="yes">إعداد [ProductName]</String>
247 <String Id="WelcomeDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
248 <String Id="WelcomeDlgDescription" Overridable="yes">سيقوم "معالج الإعداد" بتثبيت [ProductName] على الكمبيوتر. انقر فوق "التالي" للمتابعة، أو انقر فوق "إلغاء الأمر" لإنهاء "معالج الإعداد".</String>
249 <String Id="WelcomeUpdateDlgDescriptionUpdate" Overridable="yes">يتيح لك "معالج الإعداد" تغيير طريقة تثبيت ميزات [ProductName] على الكمبيوتر أو إزالتها من الكمبيوتر. انقر فوق "التالي" للمتابعة، أو انقر فوق "إلغاء الأمر" لإنهاء "معالج الإعداد".</String>
250 <String Id="WelcomeDlgTitle" Overridable="yes">{\WixUI_Font_Bigger}مرحبًا بك في معالج إعداد [ProductName]</String>
251
252 <String Id="WelcomeEulaDlg_Title" Overridable="yes">إعداد [ProductName]</String>
253 <String Id="WelcomeEulaDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
254 <String Id="WelcomeEulaDlgLicenseAcceptedCheckBox" Overridable="yes">أوافق &amp;على الشروط الواردة في اتفاقية الترخيص</String>
255 <String Id="WelcomeEulaDlgInstall" Overridable="yes">ت&amp;ثبيت</String>
256 <String Id="WelcomeEulaDlgUpdate" Overridable="yes">ت&amp;حديث</String>
257 <String Id="WelcomeEulaDlgTitle" Overridable="yes">{\WixUI_Font_Title}الرجاء قراءة اتفاقية ترخيص [ProductName]</String>
258
259 <String Id="ProgressTextInstallValidate" Overridable="yes">‏‏التحقق من صحة التثبيت</String>
260 <String Id="ProgressTextInstallFiles" Overridable="yes">‏‏نسخ الملفات الجديدة</String>
261 <String Id="ProgressTextInstallFilesTemplate" Overridable="yes">الملف: [1], الدليل: [9], الحجم: [6]</String>
262 <String Id="ProgressTextInstallAdminPackage" Overridable="yes">‏‏نسخ ملفات تثبيت الشبكة</String>
263 <String Id="ProgressTextInstallAdminPackageTemplate" Overridable="yes">الملف: [1], الدليل: [9], الحجم: [6]</String>
264 <String Id="ProgressTextFileCost" Overridable="yes">‏‏حساب متطلبات المساحة</String>
265 <String Id="ProgressTextCostInitialize" Overridable="yes">‏‏حساب متطلبات المساحة</String>
266 <String Id="ProgressTextCostFinalize" Overridable="yes">‏‏حساب متطلبات المساحة</String>
267 <String Id="ProgressTextCreateShortcuts" Overridable="yes">إنشاء الاختصارات</String>
268 <String Id="ProgressTextCreateShortcutsTemplate" Overridable="yes">‏‏الاختصار: [1]</String>
269 <String Id="ProgressTextPublishComponents" Overridable="yes">نشر المكونات المؤهلة</String>
270 <String Id="ProgressTextPublishComponentsTemplate" Overridable="yes">‏‏معرّف المكون: [1], المؤهل: [2]</String>
271 <String Id="ProgressTextPublishFeatures" Overridable="yes">نشر ميزات المنتج</String>
272 <String Id="ProgressTextPublishFeaturesTemplate" Overridable="yes">‏‏الميزة: [1]</String>
273 <String Id="ProgressTextPublishProduct" Overridable="yes">نشر معلومات المنتج</String>
274 <String Id="ProgressTextRegisterClassInfo" Overridable="yes">‏‏تسجيل خوادم الفئات</String>
275 <String Id="ProgressTextRegisterClassInfoTemplate" Overridable="yes">معرّف الفئة: [1]</String>
276 <String Id="ProgressTextRegisterExtensionInfo" Overridable="yes">تسجيل خوادم الملحقات</String>
277 <String Id="ProgressTextRegisterExtensionInfoTemplate" Overridable="yes">‏‏الملحق: [1]</String>
278 <String Id="ProgressTextRegisterMIMEInfo" Overridable="yes">تسجيل معلومات MIME</String>
279 <String Id="ProgressTextRegisterMIMEInfoTemplate" Overridable="yes">‏‏نوع محتويات MIME‏: [1], الملحق: [2]</String>
280 <String Id="ProgressTextRegisterProgIdInfo" Overridable="yes">تسجيل معرّفات البرامج</String>
281 <String Id="ProgressTextRegisterProgIdInfoTemplate" Overridable="yes">معرّف البرنامج: [1]</String>
282 <String Id="ProgressTextAllocateRegistrySpace" Overridable="yes">تخصيص مساحة السجل</String>
283 <String Id="ProgressTextAllocateRegistrySpaceTemplate" Overridable="yes">مساحة حرة: [1]</String>
284 <String Id="ProgressTextAppSearch" Overridable="yes">‏‏البحث عن تطبيقات مثبتة</String>
285 <String Id="ProgressTextAppSearchTemplate" Overridable="yes">‏‏الخاصية: [1], التوقيع: [2]</String>
286 <String Id="ProgressTextBindImage" Overridable="yes">‏‏عمليات الربط للملفات التنفيذية</String>
287 <String Id="ProgressTextBindImageTemplate" Overridable="yes">الملف: [1]</String>
288 <String Id="ProgressTextCCPSearch" Overridable="yes">‏‏البحث عن المنتجات المؤهلة</String>
289 <String Id="ProgressTextCreateFolders" Overridable="yes">‏‏إنشاء المجلدات</String>
290 <String Id="ProgressTextCreateFoldersTemplate" Overridable="yes">‏‏المجلد: [1]</String>
291 <String Id="ProgressTextDeleteServices" Overridable="yes">‏‏حذف الخدمات</String>
292 <String Id="ProgressTextDeleteServicesTemplate" Overridable="yes">الخدمة: [1]</String>
293 <String Id="ProgressTextDuplicateFiles" Overridable="yes">‏‏إنشاء ملفات مكررة</String>
294 <String Id="ProgressTextDuplicateFilesTemplate" Overridable="yes">الملف: [1], الدليل: [9], الحجم: [6]</String>
295 <String Id="ProgressTextFindRelatedProducts" Overridable="yes">البحث عن تطبيقات ذات صلة</String>
296 <String Id="ProgressTextFindRelatedProductsTemplate" Overridable="yes">‏‏العثور على التطبيق: [1]</String>
297 <String Id="ProgressTextInstallODBC" Overridable="yes">‏‏تثبيت مكونات ODBC</String>
298 <String Id="ProgressTextInstallServices" Overridable="yes">تثبيت الخدمات الجديدة</String>
299 <String Id="ProgressTextInstallServicesTemplate" Overridable="yes">الخدمة: [2]</String>
300 <String Id="ProgressTextLaunchConditions" Overridable="yes">تقييم شروط التشغيل</String>
301 <String Id="ProgressTextMigrateFeatureStates" Overridable="yes">ترحيل حالات الميزات من التطبيقات المرتبطة</String>
302 <String Id="ProgressTextMigrateFeatureStatesTemplate" Overridable="yes">‏‏التطبيق: [1]</String>
303 <String Id="ProgressTextMoveFiles" Overridable="yes">‏‏نقل الملفات</String>
304 <String Id="ProgressTextMoveFilesTemplate" Overridable="yes">الملف: [1], الدليل: [9], الحجم: [6]</String>
305 <String Id="ProgressTextPatchFiles" Overridable="yes">‏‏تصحيح الملفات</String>
306 <String Id="ProgressTextPatchFilesTemplate" Overridable="yes">الملف: [1], الدليل: [2], الحجم: [3]</String>
307 <String Id="ProgressTextProcessComponents" Overridable="yes">‏‏تحديث تسجيل المكونات</String>
308 <String Id="ProgressTextRegisterComPlus" Overridable="yes">تسجيل تطبيقات ومكونات +COM</String>
309 <String Id="ProgressTextRegisterComPlusTemplate" Overridable="yes">‏‏معرّف التطبيق: [1]{{, نوع التطبيق: [2], المستخدمون: [3], RSN: [4]}}</String>
310 <String Id="ProgressTextRegisterFonts" Overridable="yes">تسجيل الخطوط</String>
311 <String Id="ProgressTextRegisterFontsTemplate" Overridable="yes">‏‏الخط: [1]</String>
312 <String Id="ProgressTextRegisterProduct" Overridable="yes">‏‏تسجيل المنتج</String>
313 <String Id="ProgressTextRegisterProductTemplate" Overridable="yes">[1]</String>
314 <String Id="ProgressTextRegisterTypeLibraries" Overridable="yes">تسجيل مكتبات الأنواع</String>
315 <String Id="ProgressTextRegisterTypeLibrariesTemplate" Overridable="yes">معرّف المكتبة: [1]</String>
316 <String Id="ProgressTextRegisterUser" Overridable="yes">‏‏تسجيل المستخدم</String>
317 <String Id="ProgressTextRegisterUserTemplate" Overridable="yes">[1]</String>
318 <String Id="ProgressTextRemoveDuplicateFiles" Overridable="yes">‏‏إزالة الملفات المتكررة</String>
319 <String Id="ProgressTextRemoveDuplicateFilesTemplate" Overridable="yes">‏‏الملف: [1]، الدليل: [9]</String>
320 <String Id="ProgressTextRemoveEnvironmentStrings" Overridable="yes">‏‏تحديث سلاسل البيئة</String>
321 <String Id="ProgressTextRemoveEnvironmentStringsTemplate" Overridable="yes">‏‏الاسم: [1], القيمة: [2], الإجراء [3]</String>
322 <String Id="ProgressTextRemoveExistingProducts" Overridable="yes">‏‏إزالة التطبيقات</String>
323 <String Id="ProgressTextRemoveExistingProductsTemplate" Overridable="yes">‏‏التطبيق: [1], سطر الأوامر: [2]</String>
324 <String Id="ProgressTextRemoveFiles" Overridable="yes">‏‏إزالة الملفات</String>
325 <String Id="ProgressTextRemoveFilesTemplate" Overridable="yes">‏‏الملف: [1]، الدليل: [9]</String>
326 <String Id="ProgressTextRemoveFolders" Overridable="yes">‏‏إزالة المجلدات</String>
327 <String Id="ProgressTextRemoveFoldersTemplate" Overridable="yes">‏‏المجلد: [1]</String>
328 <String Id="ProgressTextRemoveIniValues" Overridable="yes">‏‏إزالة إدخالات ملفات INI</String>
329 <String Id="ProgressTextRemoveIniValuesTemplate" Overridable="yes">‏‏الملف: [1], المقطع: [2], المفتاح: [3], القيمة: [4]</String>
330 <String Id="ProgressTextRemoveODBC" Overridable="yes">‏‏إزالة مكونات ODBC</String>
331 <String Id="ProgressTextRemoveRegistryValues" Overridable="yes">‏‏إزالة قيم تسجيل النظام</String>
332 <String Id="ProgressTextRemoveRegistryValuesTemplate" Overridable="yes">‏‏المفتاح: [1]، الاسم: [2]</String>
333 <String Id="ProgressTextRemoveShortcuts" Overridable="yes">‏‏إزالة الاختصارات</String>
334 <String Id="ProgressTextRemoveShortcutsTemplate" Overridable="yes">‏‏الاختصار: [1]</String>
335 <String Id="ProgressTextRMCCPSearch" Overridable="yes">‏‏البحث عن المنتجات المؤهلة</String>
336 <String Id="ProgressTextSelfRegModules" Overridable="yes">تسجيل الوحدات النمطية</String>
337 <String Id="ProgressTextSelfRegModulesTemplate" Overridable="yes">‏‏الملف: [1], المجلد: [2]</String>
338 <String Id="ProgressTextSelfUnregModules" Overridable="yes">إلغاء تسجيل الوحدات النمطية</String>
339 <String Id="ProgressTextSelfUnregModulesTemplate" Overridable="yes">‏‏الملف: [1], المجلد: [2]</String>
340 <String Id="ProgressTextSetODBCFolders" Overridable="yes">‏‏تهيئة أدلة ODBC</String>
341 <String Id="ProgressTextStartServices" Overridable="yes">بدء تشغيل الخدمات</String>
342 <String Id="ProgressTextStartServicesTemplate" Overridable="yes">الخدمة: [1]</String>
343 <String Id="ProgressTextStopServices" Overridable="yes">إيقاف الخدمات</String>
344 <String Id="ProgressTextStopServicesTemplate" Overridable="yes">الخدمة: [1]</String>
345 <String Id="ProgressTextUnpublishComponents" Overridable="yes">‏‏إلغاء نشر المكونات المؤهلة</String>
346 <String Id="ProgressTextUnpublishComponentsTemplate" Overridable="yes">‏‏معرّف المكون: [1], المؤهل: [2]</String>
347 <String Id="ProgressTextUnpublishFeatures" Overridable="yes">‏‏إلغاء نشر ميزات المنتج</String>
348 <String Id="ProgressTextUnpublishFeaturesTemplate" Overridable="yes">‏‏الميزة: [1]</String>
349 <String Id="ProgressTextUnregisterClassInfo" Overridable="yes">إلغاء تسجيل خوادم الفئات</String>
350 <String Id="ProgressTextUnregisterClassInfoTemplate" Overridable="yes">معرّف الفئة: [1]</String>
351 <String Id="ProgressTextUnregisterComPlus" Overridable="yes">إلغاء تسجيل تطبيقات ومكونات +COM</String>
352 <String Id="ProgressTextUnregisterComPlusTemplate" Overridable="yes">معرّف التطبيق: [1]{{، نوع التطبيق: [2]}}</String>
353 <String Id="ProgressTextUnregisterExtensionInfo" Overridable="yes">إلغاء تسجيل خوادم الملحقات</String>
354 <String Id="ProgressTextUnregisterExtensionInfoTemplate" Overridable="yes">‏‏الملحق: [1]</String>
355 <String Id="ProgressTextUnregisterFonts" Overridable="yes">إلغاء تسجيل الخطوط</String>
356 <String Id="ProgressTextUnregisterFontsTemplate" Overridable="yes">‏‏الخط: [1]</String>
357 <String Id="ProgressTextUnregisterMIMEInfo" Overridable="yes">إلغاء تسجيل معلومات MIME</String>
358 <String Id="ProgressTextUnregisterMIMEInfoTemplate" Overridable="yes">‏‏نوع محتويات MIME‏: [1], الملحق: [2]</String>
359 <String Id="ProgressTextUnregisterProgIdInfo" Overridable="yes">إلغاء تسجيل معرّفات البرامج</String>
360 <String Id="ProgressTextUnregisterProgIdInfoTemplate" Overridable="yes">معرّف البرنامج: [1]</String>
361 <String Id="ProgressTextUnregisterTypeLibraries" Overridable="yes">إلغاء تسجيل مكتبات الأنواع</String>
362 <String Id="ProgressTextUnregisterTypeLibrariesTemplate" Overridable="yes">معرّف المكتبة: [1]</String>
363 <String Id="ProgressTextWriteEnvironmentStrings" Overridable="yes">‏‏تحديث سلاسل البيئة</String>
364 <String Id="ProgressTextWriteEnvironmentStringsTemplate" Overridable="yes">‏‏الاسم: [1], القيمة: [2], الإجراء [3]</String>
365 <String Id="ProgressTextWriteIniValues" Overridable="yes">‏‏كتابة قيم ملفات INI</String>
366 <String Id="ProgressTextWriteIniValuesTemplate" Overridable="yes">‏‏الملف: [1], المقطع: [2], المفتاح: [3], القيمة: [4]</String>
367 <String Id="ProgressTextWriteRegistryValues" Overridable="yes">‏‏كتابة قيم تسجيل النظام</String>
368 <String Id="ProgressTextWriteRegistryValuesTemplate" Overridable="yes">‏‏المفتاح: [1], الاسم: [2], القيمة: [3]</String>
369 <String Id="ProgressTextAdvertise" Overridable="yes">الإ‏علان عن التطبيق</String>
370 <String Id="ProgressTextGenerateScript" Overridable="yes">إنشاء عمليات برامج نصية للإجراء:</String>
371 <String Id="ProgressTextGenerateScriptTemplate" Overridable="yes">[1]</String>
372 <String Id="ProgressTextInstallSFPCatalogFile" Overridable="yes">‏‏تثبيت كتالوج النظام</String>
373 <String Id="ProgressTextInstallSFPCatalogFileTemplate" Overridable="yes">الملف: [1], التبعيات: [2]</String>
374 <String Id="ProgressTextMsiPublishAssemblies" Overridable="yes">نشر معلومات التجميع</String>
375 <String Id="ProgressTextMsiPublishAssembliesTemplate" Overridable="yes">سياق التطبيق: [1], اسم التجميع: [2]</String>
376 <String Id="ProgressTextMsiUnpublishAssemblies" Overridable="yes">‏‏إلغاء نشر معلومات التجميع</String>
377 <String Id="ProgressTextMsiUnpublishAssembliesTemplate" Overridable="yes">سياق التطبيق: [1], اسم التجميع: [2]</String>
378 <String Id="ProgressTextRollback" Overridable="yes">‏‏إجراء العودة إلى الحالة السابقة:</String>
379 <String Id="ProgressTextRollbackTemplate" Overridable="yes">[1]</String>
380 <String Id="ProgressTextRollbackCleanup" Overridable="yes">‏‏إزالة ملفات النسخ الاحتياطي</String>
381 <String Id="ProgressTextRollbackCleanupTemplate" Overridable="yes">الملف: [1]</String>
382 <String Id="ProgressTextUnmoveFiles" Overridable="yes">‏‏إزالة الملفات المنقولة</String>
383 <String Id="ProgressTextUnmoveFilesTemplate" Overridable="yes">‏‏الملف: [1]، الدليل: [9]</String>
384 <String Id="ProgressTextUnpublishProduct" Overridable="yes">‏‏إلغاء نشر معلومات المنتج</String>
385
386 <String Id="Error0" Overridable="yes">‏‏{{‏‏خطأ كبير: }}</String>
387 <String Id="Error1" Overridable="yes">‏‏{{خطأ [1]. }}</String>
388 <String Id="Error2" Overridable="yes">تحذير [1]. </String>
389 <String Id="Error4" Overridable="yes">معلومات [1]. </String>
390 <String Id="Error5" Overridable="yes">‏‏صادف المثبّت خطأ غير متوقع أثناء تثبيت هذه الحزمة. قد يشير هذا إلى وجود مشكلة تتعلق بهذه الحزمة. رمز الخطأ [1]. {{الوسيطات: [2], [3], [4]}}</String>
391 <String Id="Error7" Overridable="yes">‏‏{{القرص ممتلئ: }}</String>
392 <String Id="Error8" Overridable="yes">‏‏الإجراء [Time]: [1]. [2]</String>
393 <String Id="Error9" Overridable="yes">[ProductName]</String>
394 <String Id="Error10" Overridable="yes">{[2]}{, [3]}{, [4]}</String>
395 <String Id="Error11" Overridable="yes">‏‏نوع الرسالة: [1]، الوسيطة: [2]</String>
396 <String Id="Error12" Overridable="yes">‏‏=== بدء تسجيل الدخول: [Date] [Time] ===</String>
397 <String Id="Error13" Overridable="yes">‏‏=== إيقاف تسجيل الدخول: [Date] [Time] ===</String>
398 <String Id="Error14" Overridable="yes">‏‏بدء الإجراء [Time]: [1].</String>
399 <String Id="Error15" Overridable="yes">‏‏انتهى الإجراء [Time]: [1]. القيمة المرجعة [2].</String>
400 <String Id="Error16" Overridable="yes">‏‏الوقت المتبقي: {[1] دقيقة }{[2] ثانية}</String>
401 <String Id="Error17" Overridable="yes">‏‏نفدت الذاكرة. أغلق التطبيقات الأخرى قبل إعادة المحاولة.</String>
402 <String Id="Error18" Overridable="yes">‏‏لم يعد المثبّت قادرًا على الاستجابة.</String>
403 <String Id="Error19" Overridable="yes">‏‏تم إيقاف المثبّت قبل الأوان.</String>
404 <String Id="Error20" Overridable="yes">‏‏الرجاء الانتظار ريثما يقوم Windows بتكوين [ProductName]</String>
405 <String Id="Error21" Overridable="yes">‏‏يتم الآن ‏‏جمع المعلومات المطلوبة...</String>
406 <String Id="Error22" Overridable="yes">‏‏يتم الآن إزالة الإصدارات القديمة من هذا التطبيق...</String>
407 <String Id="Error23" Overridable="yes">‏‏يتم الآن التحضير لإزالة الإصدارات القديمة من هذا التطبيق...</String>
408 <String Id="Error32" Overridable="yes">‏‏اكتمل إعداد {[ProductName]} بنجاح.</String>
409 <String Id="Error33" Overridable="yes">‏‏فشل إعداد {[ProductName]}.</String>
410 <String Id="Error1101" Overridable="yes">حدث خطأ أثناء القراءة من الملف: [2]. {{ خطأ في النظام [3].}} تحقق من وجود الملف وإمكانية الوصول إليه.</String>
411 <String Id="Error1301" Overridable="yes">لا يمكن إنشاء الملف '[2]'. يوجد دليل يحمل هذا الاسم بالفعل. قم بإلغاء التثبيت، ثم حاول إجراء التثبيت في موقع مختلف.</String>
412 <String Id="Error1302" Overridable="yes">‏‏الرجاء إدراج القرص: [2]</String>
413 <String Id="Error1303" Overridable="yes">المثبت ليست لديه امتيازات كافية للوصول إلى هذا الدليل: [2]. تتعذر متابعة التثبيت. قم بتسجيل الدخول كمسؤول أو اتصل بمسؤول النظام.</String>
414 <String Id="Error1304" Overridable="yes">حدث خطأ أثناء الكتابة على الملف: [2]. تحقق من إمكانية الوصول إلى ذلك الدليل.</String>
415 <String Id="Error1305" Overridable="yes">حدث خطأ أثناء القراءة من الملف [2]. {{ خطأ في النظام [3].}} تحقق من وجود الملف وإمكانية الوصول إليه.</String>
416 <String Id="Error1306" Overridable="yes">لدى تطبيق آخر وصول خاص للملف '[2]'. الرجاء إيقاف تشغيل كافة التطبيقات الأخرى ثم النقر فوق "إعادة المحاولة".</String>
417 <String Id="Error1307" Overridable="yes">لا توجد مساحة كافية على القرص لتثبيت هذا الملف: [2]. حرر بعض المساحة على القرص ثم انقر فوق " إعادة المحاولة"، أو انقر فوق " إلغاء الأمر" للإنهاء.</String>
418 <String Id="Error1308" Overridable="yes">لم يتم العثور على الملف المصدر: [2]. تحقق من وجود الملف وإمكانية الوصول إليه.</String>
419 <String Id="Error1309" Overridable="yes">حدث خطأ أثناء القراءة من الملف: [3]. {{ خطأ في النظام [2].}} تحقق من وجود الملف وإمكانية الوصول إليه.</String>
420 <String Id="Error1310" Overridable="yes">حدث ‏‏خطأ أثناء الكتابة إلى الملف: [3]. {{ خطأ في النظام [2].}} تحقق من امتلاكك لحق الوصول إلى ذلك الدليل.</String>
421 <String Id="Error1311" Overridable="yes">لم يتم العثور على الملف المصدر{{(cabinet)}}: [2]. تحقق من وجود الملف وإمكانية الوصول إليه.</String>
422 <String Id="Error1312" Overridable="yes">لا يمكن إنشاء الدليل '[2]'. يوجد ملف يحمل نفس الاسم بالفعل. الرجاء إعادة تسمية الملف أو إزالته ثم النقر فوق "إعادة المحاولة"، أو النقر فوق "إلغاء الأمر" للإنهاء.</String>
423 <String Id="Error1313" Overridable="yes">وحدة التخزين [2] غير متوفرة حاليًا. الرجاء تحديد وحدة تخزين أخرى.</String>
424 <String Id="Error1314" Overridable="yes">‏‏المسار المحدد '[2]' غير متوفر.</String>
425 <String Id="Error1315" Overridable="yes">غير قادر على الكتابة إلى المجلد المحدد [2].</String>
426 <String Id="Error1316" Overridable="yes">‏‏حدث خطأ في الشبكة أثناء محاولة القراءة من الملف: [2]</String>
427 <String Id="Error1317" Overridable="yes">حدث خطأ أثناء محاولة إنشاء الدليل: [2]</String>
428 <String Id="Error1318" Overridable="yes">حدث خطأ في الشبكة أثناء محاولة إنشاء الدليل: [2]</String>
429 <String Id="Error1319" Overridable="yes">‏‏حدث خطأ في الشبكة أثناء محاولة فتح خزانة ملف المصدر: [2]</String>
430 <String Id="Error1320" Overridable="yes">‏‏المسار المحدد طويل جدًا: [2]</String>
431 <String Id="Error1321" Overridable="yes">‏‏لا يمتلك المثبّت امتيازات كافية لتعديل هذا الملف: [2].</String>
432 <String Id="Error1322" Overridable="yes">جزء من مسار المجلد '[2]' غير صالح. إما أنه خالٍ أو يتجاوز الطول الذي يسمح به النظام.</String>
433 <String Id="Error1323" Overridable="yes">‏‏يحتوي مسار المجلد '[2]' على كلمات غير صالحة في مسارات المجلدات.</String>
434 <String Id="Error1324" Overridable="yes">‏‏يحتوي مسار المجلد '[2]' على حرف غير صالح.</String>
435 <String Id="Error1325" Overridable="yes">‏‏الاسم '[2]' ليس بالاسم القصير الصالح للملف.</String>
436 <String Id="Error1326" Overridable="yes">‏‏حدث خطأ أثناء الحصول على أمان الملف: [3] GetLastError: [2]‎</String>
437 <String Id="Error1327" Overridable="yes">‏‏محرك الأقراص غير صالح: [2]</String>
438 <String Id="Error1328" Overridable="yes">‏‏حدث خطأ أثناء تطبيق التصحيح على الملف [2]. ربما تم تحديثه باستخدام طرق أخرى، ولم يعد بالإمكان تعديله بواسطة هذا التصحيح. لمزيد من المعلومات، اتصل بمورّد ملفات التصحيح. {{خطأ في النظام: [3]}}</String>
439 <String Id="Error1329" Overridable="yes">يتعذر تثبيت أحد الملفات المطلوبة، وذلك لأن ملف Cabinet [2] غير موقع رقميًا. قد يشير هذا إلى أن ملف Cabinet تالف.</String>
440 <String Id="Error1330" Overridable="yes">‏‏لا يمكن تثبيت أحد الملفات المطلوبة بسبب عدم صلاحية التوقيع الرقمي لملف Cabinet [2]. قد يشير هذا إلى أن ملف Cabinet تالف. {{ تم إرجاع الخطأ [3] بواسطة WinVerifyTrust.}}</String>
441 <String Id="Error1331" Overridable="yes">‏‏فشل نسخ الملف [2] بشكل صحيح: خطأ CRC.</String>
442 <String Id="Error1332" Overridable="yes">‏‏فشل نقل الملف [2] بشكل صحيح: خطأ CRC.</String>
443 <String Id="Error1333" Overridable="yes">‏‏فشل تصحيح الملف [2] بشكل صحيح: خطأ CRC.</String>
444 <String Id="Error1334" Overridable="yes">‏‏تعذر تثبيت الملف '[2]' بسبب عدم العثور عليه في ملف Cabinet '[3]'. قد يشير هذا إلى حدوث خطأ بالشبكة، أو خطأ أثناء القراءة من القرص المضغوط، أو مشكلة في هذه الحزمة.</String>
445 <String Id="Error1335" Overridable="yes">‏‏ملف Cabinet '[2]' المطلوب لعملية التثبيت هذه تالف ولا يصلح للاستخدام. قد يشير هذا إلى حدوث خطأ بالشبكة، أو خطأ أثناء القراءة من القرص المضغوط، أو مشكلة في هذه الحزمة.</String>
446 <String Id="Error1336" Overridable="yes">‏‏حدث خطأ أثناء إنشاء ملف مؤقت مطلوب لإتمام عملية التثبيت هذه. {{المجلد: [3]. رمز الخطأ في النظام: [2]}}</String>
447 <String Id="Error1401" Overridable="yes">تعذر إنشاء المفتاح: [2]. {{خطأ في النظام [3].}} تحقق من امتلاكك لحق وصول كافٍ إلى هذا المفتاح، أو اتصل بموظفي الدعم. </String>
448 <String Id="Error1402" Overridable="yes">‏‏تعذر فتح المفتاح: [2]. {{خطأ في النظام [3].}} تحقق من امتلاكك لحق وصول كافٍ إلى هذا المفتاح، أو اتصل بموظفي الدعم. </String>
449 <String Id="Error1403" Overridable="yes">تعذر حذف القيمة [2] من المفتاح [3]. {{خطأ في النظام [4].}} تحقق من امتلاكك لحق وصول كافٍ إلى هذا المفتاح، أو اتصل بموظفي الدعم. </String>
450 <String Id="Error1404" Overridable="yes">‏‏تعذر حذف المفتاح [2]. {{خطأ في النظام [3].}} تحقق من امتلاكك لحق وصول كافٍ إلى هذا المفتاح، أو اتصل بموظفي الدعم. </String>
451 <String Id="Error1405" Overridable="yes">تعذرت قراءة القيمة [2] من المفتاح [3]. {{خطأ في النظام [4].}} تحقق من امتلاكك لحق وصول كافٍ إلى هذا المفتاح، أو اتصل بموظفي الدعم. </String>
452 <String Id="Error1406" Overridable="yes">‏‏‏‏تعذرت كتابة القيمة [2] إلى المفتاح [3]. {{خطأ في النظام [4].}} تحقق من امتلاكك لحق وصول كافٍ إلى هذا المفتاح، أو اتصل بموظفي الدعم.</String>
453 <String Id="Error1407" Overridable="yes">‏‏‏‏تعذر الحصول على أسماء القيم للمفتاح [2]. {{خطأ في النظام [3].}} تحقق من امتلاكك لحق وصول كافٍ إلى هذا المفتاح، أو اتصل بموظفي الدعم.</String>
454 <String Id="Error1408" Overridable="yes">‏‏تعذر الحصول على أسماء المفاتيح الفرعية للمفتاح [2]. {{خطأ في النظام [3].}} تحقق من امتلاكك لحق وصول كافٍ إلى هذا المفتاح، أو اتصل بموظفي الدعم.</String>
455 <String Id="Error1409" Overridable="yes">‏‏تعذرت قراءة معلومات الأمان للمفتاح [2]. {{خطأ في النظام [3].}} تحقق من امتلاكك لحق وصول كافٍ إلى هذا المفتاح، أو اتصل بموظفي الدعم.</String>
456 <String Id="Error1410" Overridable="yes">‏‏تعذرت زيادة مساحة السجل المتوفرة. يجب توفر [2] كيلوبايت من مساحة السجل كمساحة حرة لتثبيت هذا التطبيق.</String>
457 <String Id="Error1500" Overridable="yes">‏‏يوجد تثبيت آخر قيد التقدم. يجب إكمال التثبيت الآخر قبل متابعة هذا التثبيت.</String>
458 <String Id="Error1501" Overridable="yes">‏‏حدث خطأ أثناء الوصول إلى البيانات الآمنة. الرجاء التأكد من تكوين Windows Installer بشكل صحيح، ثم حاول التثبيت مرة أخرى.</String>
459 <String Id="Error1502" Overridable="yes">قام المستخدم '[2]' ببدء تثبيت منتج '[3]' مسبقًا. على هذا المستخدم تشغيل ذلك التثبيت مرة أخرى قبل التمكن من استخدام ذلك المنتج. ستتم متابعة التثبيت الحالي الآن.</String>
460 <String Id="Error1503" Overridable="yes">قام المستخدم '[2]' ببدء تثبيت منتج '[3]' مسبقًا. يجب على هذا المستخدم تشغيل ذلك التثبيت مرة أخرى قبل التمكن من استخدام ذلك المنتج.</String>
461 <String Id="Error1601" Overridable="yes">نفدت مساحة القرص -- وحدة التخزين: '[2]'; المساحة المطلوبة: [3] كيلوبايت; المساحة المتوفرة: [4] كيلوبايت. حرر بعض المساحة على القرص، ثم أعد المحاولة.</String>
462 <String Id="Error1602" Overridable="yes">‏‏هل تريد بالتأكيد إلغاء الأمر؟</String>
463 <String Id="Error1603" Overridable="yes">‏‏الملف [2][3] قيد الاستخدام {بواسطة العملية التالية: الاسم: [4]، المعرّف: [5]، عنوان النافذة: '[6]'}. أغلق ذلك التطبيق، ثم أعد المحاولة.</String>
464 <String Id="Error1604" Overridable="yes">تم بالفعل تثبيت المنتج '[2]'، مما يمنع تثبيت هذا المنتج. المنتجان غير متوافقين.</String>
465 <String Id="Error1605" Overridable="yes">‏‏لا توجد مساحة على القرص بوحدة التخزين '[2]' تكفي للاستمرار في عملية التثبيت مع تمكين ميزة الاسترداد. المساحة المطلوبة هي [3] كيلوبايت ولا يتوفر حاليًا سوى [4] كيلوبايت. انقر فوق "تجاهل" للاستمرار في عملية التثبيت دون حفظ معلومات الاسترداد، أو انقر فوق "إعادة المحاولة" للبحث عن المساحة المتوفرة مرة أخرى، أو انقر فوق "إلغاء الأمر" لإنهاء عملية التثبيت.</String>
466 <String Id="Error1606" Overridable="yes">‏‏تعذر الوصول إلى موقع الشبكة [2].</String>
467 <String Id="Error1607" Overridable="yes">يجب إغلاق التطبيقات التالية قبل متابعة التثبيت:</String>
468 <String Id="Error1608" Overridable="yes">‏‏تعذر العثور على أية منتجات متوافقة مثبتة مسبقًا على الجهاز لتثبيت هذا المنتج.</String>
469 <String Id="Error1609" Overridable="yes">‏‏حدث خطأ أثناء تطبيق إعدادات الأمان. إن [2] ليس بمستخدم صالح أو مجموعة صالحة. قد توجد مشكلة في الحزمة، أو في الاتصال بوحدة التحكم بالمجال على الشبكة. تحقق من اتصالك بالشبكة وانقر فوق "إعادة المحاولة" أو "إلغاء الأمر" لإنهاء عملية التثبيت. {{يتعذر تحديد موقع SID الخاص بالمستخدم، خطأ في النظام [3]}}</String>
470 <String Id="Error1701" Overridable="yes">المفتاح [2] غير صالح. تأكد من إدخال المفتاح الصحيح.</String>
471 <String Id="Error1702" Overridable="yes">يجب على المثبت إعادة تشغيل النظام قبل متابعة تكوين [2]. انقر فوق "نعم" لإعادة التشغيل الآن، أو فوق "لا" إذا كنت تنوي القيام بإعادة التشغيل يدويًا في وقت لاحق.</String>
472 <String Id="Error1703" Overridable="yes">‏يجب إعادة تشغيل النظام حتى تسري تغييرات التكوين التي تمت على [2]. انقر فوق "نعم" لإعادة التشغيل الآن، أو فوق "لا" إذا كنت تنوي القيام بإعادة التشغيل يدويًا في وقت لاحق.</String>
473 <String Id="Error1704" Overridable="yes">‏‏تم تعليق تثبيت [2] في الوقت الحالي. يجب التراجع عن التغييرات التي أحدثها ذلك التثبيت حتى تتم المتابعة. هل ترغب في التراجع عن هذه التغييرات؟</String>
474 <String Id="Error1705" Overridable="yes">يوجد تثبيت سابق لهذا المنتج قيد التقدم الآن. يجب التراجع عن التغييرات التي أحدثها ذلك التثبيت حتى تتم المتابعة. هل ترغب في التراجع عن هذه التغييرات؟</String>
475 <String Id="Error1706" Overridable="yes">‏لا يمكن العثور على حزمة التثبيت للمنتج [2]. حاول إجراء التثبيت مرة أخرى باستخدام نسخة صالحة من حزمة التثبيت '[3]'.</String>
476 <String Id="Error1707" Overridable="yes">‏‏تمت عملية التثبيت بنجاح.</String>
477 <String Id="Error1708" Overridable="yes">‏‏فشلت عملية التثبيت.</String>
478 <String Id="Error1709" Overridable="yes">‏‏المنتج: [2] -- [3]</String>
479 <String Id="Error1710" Overridable="yes">‏‏يمكنك إما إعادة الكمبيوتر إلى حالته السابقة أو متابعة التثبيت فيما بعد. هل تريد الاستعادة؟</String>
480 <String Id="Error1711" Overridable="yes">‏‏حدث خطأ أثناء كتابة معلومات التثبيت على القرص. تأكّد من توفر مساحة قرص كافية، وانقر فوق "إعادة المحاولة"، أو انقر فوق "إلغاء الأمر" لإنهاء التثبيت.</String>
481 <String Id="Error1712" Overridable="yes">تعذر العثور على ملف واحد أو أكثر من الملفات المطلوبة لاستعادة الكمبيوتر لحالته السابقة. لا يمكن استعادة الكمبيوتر.</String>
482 <String Id="Error1713" Overridable="yes">لا يستطيع [2] تثبيت أحد منتجاته المطلوبة. اتصل بفريق الدعم الفني. {{خطأ في النظام: [3].}}</String>
483 <String Id="Error1714" Overridable="yes">لا يمكن إزالة النسخة القديمة من [2]. اتصل بفريق الدعم الفني. {{خطأ في النظام [3].}}</String>
484 <String Id="Error1715" Overridable="yes">‏‏تم تثبيت [2]</String>
485 <String Id="Error1716" Overridable="yes">‏‏تم تكوين [2]</String>
486 <String Id="Error1717" Overridable="yes">‏‏تمت إزالة [2]</String>
487 <String Id="Error1718" Overridable="yes">‏‏تم رفض الملف [2] من قِبل نهج التوقيع الرقمي.</String>
488 <String Id="Error1719" Overridable="yes">‏‏تعذر الوصول إلى خدمة Windows Installer. قد يحدث هذا إذا كنت تقوم بتشغيل Windows في الوضع الآمن، أو إذا لم يتم تثبيت Windows Installer بشكل صحيح. قم بالاتصال بموظفي الدعم للحصول على المساعدة.</String>
489 <String Id="Error1720" Overridable="yes">توجد مشكلة في حزمة Windows Installer هذه. تعذر تشغيل برنامج نصي مطلوب لإكمال هذا التثبيت. اتصل بموظفي الدعم أو مورّد الحزمة. {{الإجراء المخصص [2] خطأ البرنامج النصي [3]، [4]: [5] السطر [6]، العمود [7]، [8] }}</String>
490 <String Id="Error1721" Overridable="yes">‏‏توجد مشكلة في حزمة Windows Installer هذه. تعذر تشغيل برنامج مطلوب لإتمام عملية التثبيت هذه. قم بالاتصال بموظفي الدعم أو مورّد الحزمة. {{الإجراء [2]، الموقع [3]، الأمر [4]}}</String>
491 <String Id="Error1722" Overridable="yes">توجد مشكلة في حزمة Windows Installer هذه. تعذر إنهاء برنامج يتم تشغيله كجزء من عملية الإعداد بالشكل المتوقع. اتصل بموظفي الدعم أو مورّد الحزمة. {{الإجراء: [2]، الموقع: [3]، الأمر: [4]}}</String>
492 <String Id="Error1723" Overridable="yes">توجد مشكلة في حزمة Windows Installer هذه. تعذر تشغيل DLL مطلوب لإكمال هذا التثبيت. اتصل بموظفي الدعم أو مورّد الحزمة. {{الإجراء: [2]، الإدخال: [3]، المكتبة: [4] }}</String>
493 <String Id="Error1724" Overridable="yes">‏‏تمت عملية الإزالة بنجاح.</String>
494 <String Id="Error1725" Overridable="yes">‏‏فشلت عملية الإزالة.</String>
495 <String Id="Error1726" Overridable="yes">‏‏تمت عملية الإعلان بنجاح.</String>
496 <String Id="Error1727" Overridable="yes">‏‏فشلت عملية الإعلان.</String>
497 <String Id="Error1728" Overridable="yes">‏‏تمت عملية التكوين بنجاح.</String>
498 <String Id="Error1729" Overridable="yes">‏‏فشلت عملية التكوين.</String>
499 <String Id="Error1730" Overridable="yes">‏‏يجب أن تكون مسؤولاً لكي تتمكن من إزالة هذا التطبيق. لإزالة هذا التطبيق، يمكنك تسجيل الدخول كمسؤول، أو الاتصال بمجموعة الدعم التقني للحصول على المساعدة.</String>
500 <String Id="Error1731" Overridable="yes">حزمة التثبيت المصدر للمنتج [2] غير متزامنة مع حزمة العميل. حاول إجراء التثبيت مرة أخرى باستخدام نسخة صالحة من حزمة التثبيت '[3]'.</String>
501 <String Id="Error1732" Overridable="yes">لإكمال تثبيت [2]، يجب إعادة تشغيل الكمبيوتر. يوجد حاليًا مستخدمون آخرون قاموا بتسجيل الدخول إلى هذا الكمبيوتر، وقد ينتج عن إعادة التشغيل فقدانهم لعملهم. هل ترغب في إعادة التشغيل الآن؟</String>
502 <String Id="Error1801" Overridable="yes">المسار [2] غير صالح. الرجاء تحديد مسار صالح.</String>
503 <String Id="Error1802" Overridable="yes">‏‏نفدت الذاكرة. أغلق التطبيقات الأخرى قبل إعادة المحاولة.</String>
504 <String Id="Error1803" Overridable="yes">‏‏لا يوجد قرص داخل محرك الأقراص [2]. الرجاء إدراج قرص، ثم انقر فوق "إعادة المحاولة"، أو فوق "إلغاء الأمر" للرجوع إلى وحدة التخزين المحددة سابقًا.</String>
505 <String Id="Error1804" Overridable="yes">‏‏لا يوجد قرص داخل محرك الأقراص [2]. الرجاء إدراج قرص، ثم انقر فوق "إعادة المحاولة"، أو فوق "إلغاء الأمر" للرجوع إلى مربع حوار الاستعراض وتحديد وحدة تخزين أخرى.</String>
506 <String Id="Error1805" Overridable="yes">المجلد [2] غير موجود. الرجاء إدخال مسار لمجلد موجود.</String>
507 <String Id="Error1806" Overridable="yes">‏‏ليست لديك الامتيازات الكافية لقراءة هذا المجلد.</String>
508 <String Id="Error1807" Overridable="yes">‏‏تعذر تحديد مجلد وجهة صالح للتثبيت.</String>
509 <String Id="Error1901" Overridable="yes">‏‏حدث خطأ أثناء محاولة القراءة من قاعدة بيانات تثبيت المصدر: [2].</String>
510 <String Id="Error1902" Overridable="yes">‏‏جدولة عملية إعادة التمهيد: إعادة تسمية الملف [2] إلى [3]. يجب إعادة التمهيد لإتمام العملية.</String>
511 <String Id="Error1903" Overridable="yes">‏‏جدولة عملية إعادة التمهيد: حذف الملف [2]. يجب إعادة التمهيد لإتمام العملية.</String>
512 <String Id="Error1904" Overridable="yes">‏‏فشل تسجيل الوحدة النمطية [2]. HRESULT [3]‎. اتصل بموظفي الدعم.</String>
513 <String Id="Error1905" Overridable="yes">‏‏فشل إلغاء تسجيل الوحدة النمطية [2]. HRESULT [3]‎. اتصل بموظفي الدعم.</String>
514 <String Id="Error1906" Overridable="yes">‏‏فشل التخزين المؤقت للحزمة [2]. الخطأ: [3]. اتصل بموظفي الدعم.</String>
515 <String Id="Error1907" Overridable="yes">تعذر تسجيل الخط [2]. تحقق من توفر الأذونات الكافية لتثبيت الخطوط، وأن النظام يعتمد ذلك الخط.</String>
516 <String Id="Error1908" Overridable="yes">‏‏تعذر إلغاء تسجيل الخط [2]. تحقق من امتلاكك الأذونات الكافية لإزالة الخطوط.</String>
517 <String Id="Error1909" Overridable="yes">‏‏تعذر إنشاء الاختصار [2]. تحقق من وجود مجلد الوجهة وإمكانية الوصول إليه.</String>
518 <String Id="Error1910" Overridable="yes">‏‏تعذرت إزالة الاختصار [2]. تحقق من وجود ملف الاختصار وإمكانية الوصول إليه.</String>
519 <String Id="Error1911" Overridable="yes">‏‏تعذر تسجيل مكتبة الأنواع للملف [2]. اتصل بموظفي الدعم.</String>
520 <String Id="Error1912" Overridable="yes">‏‏تعذر إلغاء تسجيل مكتبة الأنواع للملف [2]. اتصل بموظفي الدعم.</String>
521 <String Id="Error1913" Overridable="yes">‏‏تعذر تحديث ملف ini ‏[2][3]. تحقق من وجود الملف وإمكانية الوصول إليه.</String>
522 <String Id="Error1914" Overridable="yes">تعذرت جدولة الملف [2] ليحل محل الملف [3] عند إعادة التشغيل. تحقق من توفر الأذونات اللازمة للكتابة إلى الملف [3].</String>
523 <String Id="Error1915" Overridable="yes">‏‏حدث خطأ أثناء إزالة إدارة برنامج تشغيل ODBC، خطأ ODBC‏ [2]: [3]. اتصل بموظفي الدعم.</String>
524 <String Id="Error1916" Overridable="yes">‏‏حدث خطأ أثناء تثبيت إدارة برنامج تشغيل ODBC، خطأ ODBC‏ [2]: [3]. اتصل بموظفي الدعم.</String>
525 <String Id="Error1917" Overridable="yes">‏‏حدث خطأ أثناء إزالة برنامج تشغيل ODBC:‏ [4]، خطأ ODBC [2]: [3]. تحقق من امتلاكك الامتيازات الكافية لإزالة برامج تشغيل ODBC.</String>
526 <String Id="Error1918" Overridable="yes">‏‏حدث خطأ أثناء تثبيت برنامج تشغيل ODBC:‏ [4]، خطأ ODBC [2]: [3]. تحقق من وجود الملف [4] وإمكانية الوصول إليه.</String>
527 <String Id="Error1919" Overridable="yes">‏‏حدث خطأ أثناء تكوين مصدر بيانات ODBC: [4]‎، خطأ ODBC [2]: [3]. تحقق من وجود الملف [4] وإمكانية الوصول إليه.</String>
528 <String Id="Error1920" Overridable="yes">فشل بدء الخدمة '[2]' ([3]). تحقق من توفر الامتيازات الكافية لبدء خدمات النظام.</String>
529 <String Id="Error1921" Overridable="yes">تعذر إيقاف الخدمة '[2]' ([3]). تحقق من توفر الامتيازات الكافية لإيقاف خدمات النظام.</String>
530 <String Id="Error1922" Overridable="yes">تعذر حذف الخدمة '[2]' ([3]). تحقق من توفر الامتيازات الكافية لإزالة خدمات النظام.</String>
531 <String Id="Error1923" Overridable="yes">تعذر تثبيت الخدمة '[2]' ([3]). تحقق من توفر الامتيازات الكافية لتثبيت خدمات النظام.</String>
532 <String Id="Error1924" Overridable="yes">تعذر تحديث متغير البيئة '[2]'. تحقق من توفر الامتيازات الكافية لتعديل متغيرات البيئة.</String>
533 <String Id="Error1925" Overridable="yes">‏‏ليست لديك امتيازات كافية لإكمال هذا التثبيت لكافة المستخدمين على هذا الجهاز. يجب تسجيل الدخول كمسؤول ثم إعادة محاولة إجراء هذا التثبيت.</String>
534 <String Id="Error1926" Overridable="yes">تعذر تعيين أمان الملف للملف '[3]'. الخطأ: [2]. تحقق من توفر الامتيازات الكافية لتعديل أذونات الأمان لهذا الملف.</String>
535 <String Id="Error1927" Overridable="yes">لم يتم تثبيت خدمات المكون (COM+ 1.0) على هذا الكمبيوتر. يتطلب هذا التثبيت خدمات المكون لكي يكتمل بنجاح. تتوفر خدمات المكون في نظام التشغيل Windows 2000.</String>
536 <String Id="Error1928" Overridable="yes">حدث خطأ أثناء تسجيل تطبيق +COM. اتصل بموظفي الدعم للحصول على المزيد من المعلومات.</String>
537 <String Id="Error1929" Overridable="yes">حدث خطأ أثناء إلغاء تسجيل تطبيق +COM. اتصل بموظفي الدعم للحصول على المزيد من المعلومات.</String>
538 <String Id="Error1930" Overridable="yes">‏‏تعذر تغيير وصف الخدمة '[2]' ([3]).</String>
539 <String Id="Error1931" Overridable="yes">لا يمكن لخدمة Windows Installer تحديث ملف النظام [2] لأن الملف محمي بواسطة Windows. قد تحتاج إلى تحديث نظام التشغيل لكي يعمل هذا البرنامج بشكل صحيح. {{إصدار الحزمة: [3]، إصدار نظام التشغيل المحمي: [4]}}</String>
540 <String Id="Error1932" Overridable="yes">‏‏لا يمكن لخدمة Windows Installer تحديث ملف Windows المحمي [2]. {{إصدار الحزمة: [3], إصدار نظام التشغيل المحمي: [4]، خطأ SFP: [5]}}</String>
541 <String Id="Error1933" Overridable="yes">لا يمكن لخدمة Windows Installer القيام بتحديث ملف واحد أو أكثر من ملفات Windows المحمية. {{خطأ SFP: [2]. قائمة الملفات المحمية:\r\n[3]}}</String>
542 <String Id="Error1934" Overridable="yes">‏‏تم تعطيل عمليات تثبيت المستخدم بواسطة النهج الموجود على الجهاز.</String>
543 <String Id="Error1935" Overridable="yes">حدث خطأ أثناء تثبيت التجميع '[6]'. لمزيد من المعلومات، الرجاء الرجوع إلى "التعليمات والدعم". ‎HRESULT‏: [3]. {{واجهة التجميع: [4]، الوظيفة: [5]، المكون: [2]}}</String>
544 <String Id="Error1936" Overridable="yes">حدث خطـأ أثناء تثبيت التجميع '[6]'. إما إنه لم تتم تسمية التجميع باسم مميز أو لم يتم التوقيع عليه بمفتاح يبلغ طوله الحد الأدنى. HRESULT: [3]. {{واجهة التجميع: [4], الوظيفة: [5], المكون: [2]}}</String>
545 <String Id="Error1937" Overridable="yes">حدث خطـأ أثناء تثبيت التجميع '[6]'. تعذر التحقق من صحة التوقيع أو الكتالوج أو أنهما غير صالحين. HRESULT: [3]. {{واجهة التجميع: [4], الوظيفة: [5], المكون: [2]}}</String>
546 <String Id="Error1938" Overridable="yes">حدث خطـأ أثناء تثبيت التجميع '[6]'. تعذر العثور على وحدة نمطية واحدة أو أكثر من وحدات التجميع النمطية. HRESULT: [3]. {{واجهة التجميع: [4], الوظيفة: [5], المكون: [2]}}</String>
547
548 <String Id="UITextbytes" Overridable="yes">بايت</String>
549 <String Id="UITextGB" Overridable="yes">غيغابايت</String>
550 <String Id="UITextKB" Overridable="yes">كيلوبايت</String>
551 <String Id="UITextMB" Overridable="yes">ميغابايت</String>
552 <String Id="UITextMenuAbsent" Overridable="yes">ستكون الميزة بأكملها غير متوفرة</String>
553 <String Id="UITextMenuAdvertise" Overridable="yes">سيتم تثبيت الميزة عند الحاجة</String>
554 <String Id="UITextMenuAllCD" Overridable="yes">‏‏سيتم تثبيت الميزة بأكملها لتشغيلها من القرص المضغوط</String>
555 <String Id="UITextMenuAllLocal" Overridable="yes">‏‏سيتم تثبيت الميزة بأكملها على محرك الأقراص الثابت المحلي</String>
556 <String Id="UITextMenuAllNetwork" Overridable="yes">‏‏سيتم تثبيت الميزة بأكملها لتشغيلها من الشبكة</String>
557 <String Id="UITextMenuCD" Overridable="yes">‏‏سيتم تثبيتها لتشغيلها من القرص المضغوط</String>
558 <String Id="UITextMenuLocal" Overridable="yes">‏‏سيتم تثبيتها على محرك الأقراص الثابت المحلي</String>
559 <String Id="UITextMenuNetwork" Overridable="yes">سيتم تثبيتها لتشغيلها من الشبكة</String>
560 <String Id="UITextNewFolder" Overridable="yes">مجلد|مجلد جديد</String>
561 <String Id="UITextScriptInProgress" Overridable="yes">‏‏يتم الآن ‏‏جمع المعلومات المطلوبة...</String>
562 <String Id="UITextSelAbsentAbsent" Overridable="yes">ستبقى هذه الميزة غير مثبتة</String>
563 <String Id="UITextSelAbsentAdvertise" Overridable="yes">سيتم تعيين هذه الميزة ليتم تثبيتها عند الحاجة</String>
564 <String Id="UITextSelAbsentCD" Overridable="yes">‏‏سيتم تثبيت هذه الميزة لتشغيلها من القرص المضغوط</String>
565 <String Id="UITextSelAbsentLocal" Overridable="yes">سيتم تثبيت هذه الميزة على محرك الأقراص الثابت المحلي</String>
566 <String Id="UITextSelAbsentNetwork" Overridable="yes">‏‏سيتم تثبيت هذه الميزة لتشغيلها من الشبكة</String>
567 <String Id="UITextSelAdvertiseAbsent" Overridable="yes">ستصبح هذه الميزة غير متوفرة</String>
568 <String Id="UITextSelAdvertiseAdvertise" Overridable="yes">سيتم تثبيتها عند الحاجة</String>
569 <String Id="UITextSelAdvertiseCD" Overridable="yes">‏‏ستتوفر هذه الميزة لتشغيلها من القرص المضغوط</String>
570 <String Id="UITextSelAdvertiseLocal" Overridable="yes">سيتم تثبيت هذه الميزة على محرك الأقراص الثابت المحلي</String>
571 <String Id="UITextSelAdvertiseNetwork" Overridable="yes">‏‏ستتوفر هذه الميزة لتشغيلها من الشبكة</String>
572 <String Id="UITextSelCDAbsent" Overridable="yes">ستتم إزالة تثبيت هذه الميزة بشكل كامل، ولن تتمكن من تشغيلها من القرص المضغوط</String>
573 <String Id="UITextSelCDAdvertise" Overridable="yes">سيتم تغيير تعيين هذه الميزة من حالة التشغيل من القرص المضغوط إلى التثبيت عند الطلب</String>
574 <String Id="UITextSelCDCD" Overridable="yes">‏‏ستبقى هذه الميزة ليتم تشغيلها من القرص المضغوط</String>
575 <String Id="UITextSelCDLocal" Overridable="yes">‏‏ستتغير هذه الميزة من حالة التشغيل من القرص المضغوط إلى التثبيت على محرك الأقراص الثابت المحلي</String>
576 <String Id="UITextSelChildCostNeg" Overridable="yes">تحرر هذه الميزة [1] على محرك الأقراص الثابت.</String>
577 <String Id="UITextSelChildCostPos" Overridable="yes">تتطلب هذه الميزة [1] على محرك الأقراص الثابت.</String>
578 <String Id="UITextSelCostPending" Overridable="yes">جارٍ حساب تكلفة هذه الميزة...</String>
579 <String Id="UITextSelLocalAbsent" Overridable="yes">‏‏ستتم إزالة هذه الميزة بشكل كامل</String>
580 <String Id="UITextSelLocalAdvertise" Overridable="yes">‏‏ستتم إزالة هذه الميزة من محرك الأقراص الثابت المحلي، ولكن سيتم تعيينها ليتم تثبيتها عند الطلب</String>
581 <String Id="UITextSelLocalCD" Overridable="yes">‏‏ستتم إزالة هذه الميزة من محرك الأقراص الثابت المحلي، ولكنها ستبقى متوفرةً ليتم تشغيلها من القرص المضغوط</String>
582 <String Id="UITextSelLocalLocal" Overridable="yes">ستبقى هذه الميزة على محرك الأقراص الثابت المحلي</String>
583 <String Id="UITextSelLocalNetwork" Overridable="yes">‏‏ستتم إزالة هذه الميزة من محرك الأقراص الثابت المحلي، ولكنها ستبقى متوفرةً ليتم تشغيلها من الشبكة</String>
584 <String Id="UITextSelNetworkAbsent" Overridable="yes">سيتم إزالة تثبيت هذه الميزة بشكل كامل، ولن تتمكن من تشغيلها من الشبكة</String>
585 <String Id="UITextSelNetworkAdvertise" Overridable="yes">ستتغير هذه الميزة من حالة التشغيل من الشبكة إلى تعيينها بحيث يتم تثبيتها عند الطلب</String>
586 <String Id="UITextSelNetworkLocal" Overridable="yes">ستتغير هذه الميزة من حالة التشغيل من الشبكة إلى التثبيت على محرك الأقراص الثابت المحلي</String>
587 <String Id="UITextSelNetworkNetwork" Overridable="yes">ستبقى هذه الميزة ليتم تشغيلها من الشبكة</String>
588 <String Id="UITextSelParentCostNegNeg" Overridable="yes">تحرر هذه الميزة [1] على محرك الأقراص الثابت. لديها [2] من [3] من الميزات الفرعية المحددة. تحرر الميزات الفرعية [4] على محرك الأقراص الثابت.</String>
589 <String Id="UITextSelParentCostNegPos" Overridable="yes">تحرر هذه الميزة [1] على محرك الأقراص الثابت. لديها [2] من [3] من الميزات الفرعية المحددة. تتطلب الميزات الفرعية [4] على محرك الأقراص الثابت.</String>
590 <String Id="UITextSelParentCostPosNeg" Overridable="yes">تتطلب هذه الميزة [1] على محرك الأقراص الثابت. لديها [2] من [3] من الميزات الفرعية المحددة. تحرر الميزات الفرعية [4] على محرك الأقراص الثابت.</String>
591 <String Id="UITextSelParentCostPosPos" Overridable="yes">تتطلب هذه الميزة [1] على محرك الأقراص الثابت. لديها [2] من [3] من الميزات الفرعية المحددة. تتطلب الميزات الفرعية [4] على محرك الأقراص الثابت.</String>
592 <String Id="UITextTimeRemaining" Overridable="yes">‏‏الوقت المتبقي: {[1] دقيقة }{[2] ثانية}</String>
593 <String Id="UITextVolumeCostAvailable" Overridable="yes">متوفر</String>
594 <String Id="UITextVolumeCostDifference" Overridable="yes">الفرق</String>
595 <String Id="UITextVolumeCostRequired" Overridable="yes">مطلوب</String>
596 <String Id="UITextVolumeCostSize" Overridable="yes">حجم القرص</String>
597 <String Id="UITextVolumeCostVolume" Overridable="yes">وحدة تخزين</String>
598</WixLocalization>
diff --git a/src/ext/UI/wixlib/WixUI_bg-BG.wxl b/src/ext/UI/wixlib/WixUI_bg-BG.wxl
new file mode 100644
index 00000000..c4f7a75f
--- /dev/null
+++ b/src/ext/UI/wixlib/WixUI_bg-BG.wxl
@@ -0,0 +1,598 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3
4
5<WixLocalization Culture="bg-bg" Codepage="1251" xmlns="http://wixtoolset.org/schemas/v4/wxl">
6 <String Id="WixUIBack" Overridable="yes">&amp;Назад</String>
7 <String Id="WixUINext" Overridable="yes">Н&amp;апред</String>
8 <String Id="WixUICancel" Overridable="yes">Отказ</String>
9 <String Id="WixUIFinish" Overridable="yes">&amp;Готово</String>
10 <String Id="WixUIRetry" Overridable="yes">&amp;Опитай пак</String>
11 <String Id="WixUIIgnore" Overridable="yes">&amp;Игнорирай</String>
12 <String Id="WixUIYes" Overridable="yes">&amp;Да</String>
13 <String Id="WixUINo" Overridable="yes">&amp;Не</String>
14 <String Id="WixUIOK" Overridable="yes">OK</String>
15 <String Id="WixUIPrint" Overridable="yes">Пе&amp;чат</String>
16
17 <String Id="AdvancedWelcomeEulaDlg_Title" Overridable="yes">Инсталиране на [ProductName]</String>
18 <String Id="AdvancedWelcomeEulaDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
19 <String Id="AdvancedWelcomeEulaDlgTitle" Overridable="yes">{\WixUI_Font_Title}Прочетете лицензионното споразумение за [ProductName]</String>
20 <String Id="AdvancedWelcomeEulaDlgLicenseAcceptedCheckBox" Overridable="yes">&amp;Приемам условията в лицензионното споразумение</String>
21 <String Id="AdvancedWelcomeEulaDlgDescriptionPerMachine" Overridable="yes">Щракнете върху "Инсталирай", за да инсталирате продукта с опции по подразбиране за всички потребители. Щракнете върху "Разширени", за да промените опциите за инсталиране.</String>
22 <String Id="AdvancedWelcomeEulaDlgDescriptionPerUser" Overridable="yes">Щракнете върху "Инсталирай", за да инсталирате продукта с опции по подразбиране само за вас. Щракнете върху "Разширени", за да промените опциите за инсталиране.</String>
23 <String Id="AdvancedWelcomeEulaDlgInstall" Overridable="yes">&amp;Инсталирай</String>
24 <String Id="AdvancedWelcomeEulaDlgAdvanced" Overridable="yes">Р&amp;азширени</String>
25 <String Id="Advanced_Font_Normal_Size" Overridable="yes">8</String>
26 <String Id="Advanced_Font_Bigger_Size" Overridable="yes">12</String>
27 <String Id="Advanced_Font_Title_Size" Overridable="yes">9</String>
28 <String Id="Advanced_Font_Emphasized_Size" Overridable="yes">8</String>
29 <String Id="Advanced_Font_FaceName" Overridable="yes">Tahoma</String>
30
31 <String Id="BrowseDlg_Title" Overridable="yes">Инсталиране на [ProductName]</String>
32 <String Id="BrowseDlgComboLabel" Overridable="yes">&amp;Търси в:</String>
33 <String Id="BrowseDlgWixUI_Bmp_Up" Overridable="yes">WixUI_Bmp_Up</String>
34 <String Id="BrowseDlgWixUI_Bmp_UpTooltip" Overridable="yes">Едно ниво нагоре</String>
35 <String Id="BrowseDlgNewFolder" Overridable="yes">WixUI_Bmp_New</String>
36 <String Id="BrowseDlgNewFolderTooltip" Overridable="yes">Създаване на нова папка</String>
37 <String Id="BrowseDlgPathLabel" Overridable="yes">&amp;Име на папката:</String>
38 <String Id="BrowseDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
39 <String Id="BrowseDlgDescription" Overridable="yes">Отидете до папката местоназначение</String>
40 <String Id="BrowseDlgTitle" Overridable="yes">{\WixUI_Font_Title}Промяна на папката местоназначение</String>
41
42 <String Id="CancelDlg_Title" Overridable="yes">Инсталиране на [ProductName]</String>
43 <String Id="CancelDlgText" Overridable="yes">Наистина ли искате да отмените инсталирането на [ProductName]?</String>
44 <String Id="CancelDlgIcon" Overridable="yes">WixUI_Ico_Info</String>
45 <String Id="CancelDlgIconTooltip" Overridable="yes">Информационна икона</String>
46
47 <String Id="CustomizeDlg_Title" Overridable="yes">Инсталиране на [ProductName]</String>
48 <String Id="CustomizeDlgTree" Overridable="yes">Дърво на възможностите за избор</String>
49 <String Id="CustomizeDlgBrowse" Overridable="yes">&amp;Преглед...</String>
50 <String Id="CustomizeDlgReset" Overridable="yes">Ну&amp;лирай</String>
51 <String Id="CustomizeDlgDiskCost" Overridable="yes">Използване на &amp;диска</String>
52 <String Id="CustomizeDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
53 <String Id="CustomizeDlgText" Overridable="yes">Щракнете върху иконите на дървото по-долу, за да промените начина на инсталиране на компонентите.</String>
54 <String Id="CustomizeDlgDescription" Overridable="yes">Изберете начина, по който искате да се инсталират компонентите.</String>
55 <String Id="CustomizeDlgTitle" Overridable="yes">{\WixUI_Font_Title}Инсталиране по избор</String>
56 <String Id="CustomizeDlgItemDescription" Overridable="yes">CustomizeDlgItemDescription-CustomizeDlgItemDescription</String>
57 <String Id="CustomizeDlgItemSize" Overridable="yes">CustomizeDlgItemSize-CustomizeDlgItemSize</String>
58 <String Id="CustomizeDlgLocation" Overridable="yes">CustomizeDlgLocation-CustomizeDlgLocation</String>
59 <String Id="CustomizeDlgLocationLabel" Overridable="yes">Местоположение:</String>
60
61 <String Id="DiskCostDlg_Title" Overridable="yes">Инсталиране на [ProductName]</String>
62 <String Id="DiskCostDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
63 <String Id="DiskCostDlgText" Overridable="yes">Маркираните томове нямат достатъчно свободно място за избраните компоненти. Можете да премахнете някои файлове от маркираните томове, да инсталирате по-малко компоненти или да изберете друго устройство за местоназначение.</String>
64 <String Id="DiskCostDlgDescription" Overridable="yes">Дисковото пространство, необходимо за инсталиране на избраните компоненти.</String>
65 <String Id="DiskCostDlgTitle" Overridable="yes">{\WixUI_Font_Title}Изисквания за дисковото пространство</String>
66 <String Id="DiskCostDlgVolumeList" Overridable="yes">{120}{70}{70}{70}{70}</String>
67
68 <String Id="ErrorDlg_Title" Overridable="yes">Инсталиране на [ProductName]</String>
69 <String Id="ErrorDlgErrorText" Overridable="yes">Информационен текст</String>
70 <String Id="ErrorDlgErrorIcon" Overridable="yes">WixUI_Ico_Info</String>
71 <String Id="ErrorDlgErrorIconTooltip" Overridable="yes">Информационна икона</String>
72
73 <String Id="ExitDialog_Title" Overridable="yes">Инсталиране на [ProductName]</String>
74 <String Id="ExitDialogBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
75 <String Id="ExitDialogDescription" Overridable="yes">Щракнете върху бутона "Готово", за да излезете от съветника за инсталиране.</String>
76 <String Id="ExitDialogTitle" Overridable="yes">{\WixUI_Font_Bigger}Съветникът за инсталиране на [ProductName] завърши</String>
77
78 <String Id="FatalError_Title" Overridable="yes">Инсталиране на [ProductName]</String>
79 <String Id="FatalErrorBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
80 <String Id="FatalErrorTitle" Overridable="yes">{\WixUI_Font_Bigger}Съветникът за инсталиране на [ProductName] завърши преждевременно</String>
81 <String Id="FatalErrorDescription1" Overridable="yes">Съветникът за инсталиране на [ProductName] завърши преждевременно поради грешка. Системата ви не е променена. За да инсталирате тази програма по-късно, изпълнете съветника за инсталиране отново.</String>
82 <String Id="FatalErrorDescription2" Overridable="yes">Щракнете върху бутона "Готово", за да излезете от съветника за инсталиране.</String>
83
84 <String Id="FeaturesDlg_Title" Overridable="yes">Инсталиране на [ProductName]</String>
85 <String Id="FeaturesDlgTree" Overridable="yes">Компоненти на продукта</String>
86 <String Id="FeaturesDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
87 <String Id="FeaturesDlgDescription" Overridable="yes">Изберете начина, по който искате да се инсталират компонентите.</String>
88 <String Id="FeaturesDlgTitle" Overridable="yes">{\WixUI_Font_Title}Компоненти на продукта</String>
89 <String Id="FeaturesDlgItemDescription" Overridable="yes">FeaturesDlgItemDescription</String>
90 <String Id="FeaturesDlgItemSize" Overridable="yes">FeaturesDlgItemSize</String>
91 <String Id="FeaturesDlgInstall" Overridable="yes">&amp;Инсталирай</String>
92 <String Id="FeaturesDlgChange" Overridable="yes">&amp;Промени</String>
93
94 <String Id="FilesInUse_Title" Overridable="yes">Инсталиране на [ProductName]</String>
95 <String Id="FilesInUseExit" Overridable="yes">И&amp;зход</String>
96 <String Id="FilesInUseBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
97 <String Id="FilesInUseText" Overridable="yes">Приложенията по-долу използват файлове, които трябва да се актуализират при това инсталиране. Затворете тези приложения, след което щракнете върху "&amp;Опитай пак", за да продължите инсталирането, или щракнете върху "Изход", за да излезете от него.</String>
98 <String Id="FilesInUseDescription" Overridable="yes">Някои от файловете, които трябва да се актуализират, в момента се използват.</String>
99 <String Id="FilesInUseTitle" Overridable="yes">{\WixUI_Font_Title}Използвани в момента файлове</String>
100
101 <String Id="InstallDirDlg_Title" Overridable="yes">Инсталиране на [ProductName]</String>
102 <String Id="InstallDirDlgChange" Overridable="yes">&amp;Промяна...</String>
103 <String Id="InstallDirDlgTitle" Overridable="yes">{\WixUI_Font_Title}Папка местоназначение</String>
104 <String Id="InstallDirDlgDescription" Overridable="yes">Щракнете върху "Напред", за да инсталирате в папката по подразбиране, или щракнете върху "Промяна", за да изберете друга.</String>
105 <String Id="InstallDirDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
106 <String Id="InstallDirDlgFolderLabel" Overridable="yes">Инсталиране на [ProductName] на:</String>
107
108 <String Id="InstallScopeDlg_Title" Overridable="yes">Инсталиране на [ProductName]</String>
109 <String Id="InstallScopeDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
110 <String Id="InstallScopeDlgDescription" Overridable="yes">Избор на обхвата и папката на инсталиране</String>
111 <String Id="InstallScopeDlgTitle" Overridable="yes">{\WixUI_Font_Title}Обхват на инсталиране</String>
112 <String Id="InstallScopeDlgPerUser" Overridable="yes">{\WixUI_Font_Emphasized}Инсталиране &amp;само за вас ([LogonUser])</String>
113 <String Id="InstallScopeDlgPerUserDescription" Overridable="yes">[ProductName] ще се инсталира в отделна папка за всеки потребител и ще бъде достъпно само за вашия потребителски акаунт. Не се нуждаете от привилегии на локален администратор.</String>
114 <String Id="InstallScopeDlgNoPerUserDescription" Overridable="yes">[ProductName] не поддържа инсталиране в отделна папка за всеки потребител.</String>
115 <String Id="InstallScopeDlgPerMachine" Overridable="yes">{\WixUI_Font_Emphasized}Инсталиране за всички потребители на &amp;машината</String>
116 <String Id="InstallScopeDlgPerMachineDescription" Overridable="yes">По подразбиране приложението [ProductName] ще се инсталира в отделна папка за всеки компютър и ще е достъпно за всички потребители. Можете да промените папката за инсталиране по подразбиране. Трябва да разполагате с привилегии на локален администратор.</String>
117 <String Id="InstallScopeDlgFolderLabel" Overridable="yes">Папка за &amp;инсталиране:</String>
118 <String Id="InstallScopeDlgChange" Overridable="yes">&amp;Промяна...</String>
119
120 <String Id="InvalidDirDlg_Title" Overridable="yes">Инсталиране на [ProductName]</String>
121 <String Id="InvalidDirDlgText" Overridable="yes">Директорията за инсталиране трябва да се намира на локалния твърд диск.</String>
122 <String Id="InvalidDirDlgIcon" Overridable="yes">WixUI_Ico_Info</String>
123 <String Id="InvalidDirDlgIconTooltip" Overridable="yes">Информационна икона</String>
124
125 <String Id="LicenseAgreementDlg_Title" Overridable="yes">Инсталиране на [ProductName]</String>
126 <String Id="LicenseAgreementDlgLicenseAcceptedCheckBox" Overridable="yes">&amp;Приемам условията в лицензионното споразумение</String>
127 <String Id="LicenseAgreementDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
128 <String Id="LicenseAgreementDlgDescription" Overridable="yes">Прочетете внимателно следното лицензионно споразумение</String>
129 <String Id="LicenseAgreementDlgTitle" Overridable="yes">{\WixUI_Font_Title}Лицензионно споразумение с краен потребител</String>
130
131 <String Id="MaintenanceTypeDlg_Title" Overridable="yes">Инсталиране на [ProductName]</String>
132 <String Id="MaintenanceTypeDlgChangeButton" Overridable="yes">&amp;Промени</String>
133 <String Id="MaintenanceTypeDlgChangeButtonTooltip" Overridable="yes">Промяна на инсталацията</String>
134 <String Id="MaintenanceTypeDlgRepairButton" Overridable="yes">Поп&amp;рави</String>
135 <String Id="MaintenanceTypeDlgRepairButtonTooltip" Overridable="yes">Поправяне на инсталацията</String>
136 <String Id="MaintenanceTypeDlgRemoveButton" Overridable="yes">&amp;Премахни</String>
137 <String Id="MaintenanceTypeDlgRemoveButtonTooltip" Overridable="yes">Премахване на инсталацията</String>
138 <String Id="MaintenanceTypeDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
139 <String Id="MaintenanceTypeDlgDescription" Overridable="yes">Изберете операцията, която желаете да изпълните.</String>
140 <String Id="MaintenanceTypeDlgTitle" Overridable="yes">{\WixUI_Font_Title}Промяна, поправяне или премахване на инсталация</String>
141 <String Id="MaintenanceTypeDlgChangeText" Overridable="yes">Позволява ви да промените начина на инсталиране на компонентите.</String>
142 <String Id="MaintenanceTypeDlgChangeDisabledText" Overridable="yes">[ProductName] няма компоненти, които да могат да се избират самостоятелно.</String>
143 <String Id="MaintenanceTypeDlgRemoveText" Overridable="yes">Премахва [ProductName] от компютъра.</String>
144 <String Id="MaintenanceTypeDlgRemoveDisabledText" Overridable="yes">[ProductName] не може да се премахне.</String>
145 <String Id="MaintenanceTypeDlgRepairText" Overridable="yes">Поправя грешки в последната инсталация, като коригира липсващи и повредени файлове, преки пътища и записи в системния регистър.</String>
146 <String Id="MaintenanceTypeDlgRepairDisabledText" Overridable="yes">[ProductName] не може да се поправи.</String>
147
148 <String Id="MaintenanceWelcomeDlg_Title" Overridable="yes">Инсталиране на [ProductName]</String>
149 <String Id="MaintenanceWelcomeDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
150 <String Id="MaintenanceWelcomeDlgDescription" Overridable="yes">Съветникът за инсталиране ви позволява да променяте начина, по който се инсталират компонентите на [ProductName] на вашия компютър, или да ги премахнете от него. Щракнете върху "Напред", за да продължите, или върху "Отказ", за да излезете от съветника за инсталиране.</String>
151 <String Id="MaintenanceWelcomeDlgTitle" Overridable="yes">{\WixUI_Font_Bigger}Добре дошли в съветника за инсталиране на [ProductName]</String>
152
153 <String Id="MsiRMFilesInUse_Title" Overridable="yes">Инсталиране на [ProductName]</String>
154 <String Id="MsiRMFilesInUseBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
155 <String Id="MsiRMFilesInUseText" Overridable="yes">Приложенията по-долу използват файлове, които трябва да се актуализират при това инсталиране. Можете да позволите на съветника за инсталиране да ги затвори и да се опита да ги стартира отново или да рестартирате компютъра по-късно.</String>
156 <String Id="MsiRMFilesInUseDescription" Overridable="yes">Някои от файловете, които трябва да се актуализират, в момента се използват.</String>
157 <String Id="MsiRMFilesInUseTitle" Overridable="yes">{\WixUI_Font_Title}Използвани в момента файлове</String>
158 <String Id="MsiRMFilesInUseUseRM" Overridable="yes">&amp;Затвори приложенията и направи опит за рестартирането им.</String>
159 <String Id="MsiRMFilesInUseDontUseRM" Overridable="yes">&amp;Не затваряй приложенията. Ще се изисква рестартиране.</String>
160
161 <String Id="OutOfDiskDlg_Title" Overridable="yes">Инсталиране на [ProductName]</String>
162 <String Id="OutOfDiskDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
163 <String Id="OutOfDiskDlgText" Overridable="yes">Маркираните томове нямат достатъчно свободно място на диска за текущо избраните компоненти. Можете да премахнете някои файлове от маркираните томове, да инсталирате по-малко компоненти или да изберете друго устройство за местоназначение.</String>
164 <String Id="OutOfDiskDlgDescription" Overridable="yes">Дисковото пространство, необходимо за инсталирането, надвишава свободното дисково пространство.</String>
165 <String Id="OutOfDiskDlgTitle" Overridable="yes">{\WixUI_Font_Title}Недостатъчно място на диска</String>
166 <String Id="OutOfDiskDlgVolumeList" Overridable="yes">{120}{70}{70}{70}{70}</String>
167
168 <String Id="OutOfRbDiskDlg_Title" Overridable="yes">Инсталиране на [ProductName]</String>
169 <String Id="OutOfRbDiskDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
170 <String Id="OutOfRbDiskDlgText" Overridable="yes">Маркираните томове нямат достатъчно свободно място на диска за текущо избраните компоненти. Можете да премахнете някои файлове от маркираните томове, да инсталирате по-малко компоненти или да изберете друго устройство за местоназначение.</String>
171 <String Id="OutOfRbDiskDlgDescription" Overridable="yes">Дисковото пространство, необходимо за инсталирането, надвишава свободното дисково пространство.</String>
172 <String Id="OutOfRbDiskDlgTitle" Overridable="yes">{\WixUI_Font_Title}Недостатъчно място на диска</String>
173 <String Id="OutOfRbDiskDlgVolumeList" Overridable="yes">{120}{70}{70}{70}{70}</String>
174 <String Id="OutOfRbDiskDlgText2" Overridable="yes">Също така можете да забраните функцията за възстановяване на инсталиращата програма. Забраняването на възстановяването не позволява на инсталиращата програма да възстанови първоначалното състояние на компютъра, ако инсталацията бъде прекъсната по някакъв начин. Щракнете върху "Да", ако искате да рискувате със забраняване на възстановяването.</String>
175
176 <String Id="PrepareDlg_Title" Overridable="yes">Инсталиране на [ProductName]</String>
177 <String Id="PrepareDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
178 <String Id="PrepareDlgDescription" Overridable="yes">Моля, изчакайте, докато съветникът за инсталиране се подготви да ви направлява в инсталирането.</String>
179 <String Id="PrepareDlgTitle" Overridable="yes">{\WixUI_Font_Bigger}Добре дошли в съветника за инсталиране на [ProductName]</String>
180
181 <String Id="ProgressDlg_Title" Overridable="yes">Инсталиране на [ProductName]</String>
182 <String Id="ProgressDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
183 <String Id="ProgressDlgTextInstalling" Overridable="yes">Моля, изчакайте, докато съветникът за инсталиране инсталира [ProductName].</String>
184 <String Id="ProgressDlgTitleInstalling" Overridable="yes">{\WixUI_Font_Title}Инсталиране на [ProductName]</String>
185 <String Id="ProgressDlgTextChanging" Overridable="yes">Моля, изчакайте, докато съветникът за инсталиране промени [ProductName].</String>
186 <String Id="ProgressDlgTitleChanging" Overridable="yes">{\WixUI_Font_Title}Промяна на [ProductName]</String>
187 <String Id="ProgressDlgTextRepairing" Overridable="yes">Моля, изчакайте, докато съветникът за инсталиране поправи [ProductName].</String>
188 <String Id="ProgressDlgTitleRepairing" Overridable="yes">{\WixUI_Font_Title}Поправяне на [ProductName]</String>
189 <String Id="ProgressDlgTextRemoving" Overridable="yes">Моля, изчакайте, докато съветникът за инсталиране премахне [ProductName].</String>
190 <String Id="ProgressDlgTitleRemoving" Overridable="yes">{\WixUI_Font_Title}Премахване на [ProductName]</String>
191 <String Id="ProgressDlgTextUpdating" Overridable="yes">Моля, изчакайте, докато съветникът за инсталиране актуализира [ProductName].</String>
192 <String Id="ProgressDlgTitleUpdating" Overridable="yes">{\WixUI_Font_Title}Актуализиране на [ProductName]</String>
193 <String Id="ProgressDlgProgressBar" Overridable="yes">Операцията завърши</String>
194 <String Id="ProgressDlgStatusLabel" Overridable="yes">Състояние:</String>
195
196 <String Id="ResumeDlg_Title" Overridable="yes">Инсталиране на [ProductName]</String>
197 <String Id="ResumeDlgInstall" Overridable="yes">&amp;Инсталирай</String>
198 <String Id="ResumeDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
199 <String Id="ResumeDlgDescription" Overridable="yes">Съветникът за инсталиране ще завърши инсталирането на [ProductName] на компютъра. Щракнете върху "Инсталирай", за да продължите, или върху "Отказ" за изход от съветника за инсталиране.</String>
200 <String Id="ResumeDlgTitle" Overridable="yes">{\WixUI_Font_Bigger}Възобновяване на съветника за инсталиране на [ProductName]</String>
201
202 <String Id="SetupTypeDlg_Title" Overridable="yes">Инсталиране на [ProductName]</String>
203 <String Id="SetupTypeDlgTypicalButton" Overridable="yes">&amp;Типична</String>
204 <String Id="SetupTypeDlgTypicalButtonTooltip" Overridable="yes">Типична инсталация</String>
205 <String Id="SetupTypeDlgCustomButton" Overridable="yes">П&amp;о избор</String>
206 <String Id="SetupTypeDlgCustomButtonTooltip" Overridable="yes">Инсталация по избор</String>
207 <String Id="SetupTypeDlgCompleteButton" Overridable="yes">П&amp;ълна</String>
208 <String Id="SetupTypeDlgCompleteButtonTooltip" Overridable="yes">Пълна инсталация</String>
209 <String Id="SetupTypeDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
210 <String Id="SetupTypeDlgTitle" Overridable="yes">{\WixUI_Font_Title}Избор на тип инсталация</String>
211 <String Id="SetupTypeDlgDescription" Overridable="yes">Избор на типа инсталация, който отговаря най-добре на вашите нужди</String>
212 <String Id="SetupTypeDlgTypicalText" Overridable="yes">Инсталира най-често използваните програмни компоненти. Препоръчва се за повечето потребители.</String>
213 <String Id="SetupTypeDlgCustomText" Overridable="yes">Позволява на потребителите да изберат кои компоненти на програмата ще се инсталират и къде ще се инсталират. Препоръчва се за опитни потребители.</String>
214 <String Id="SetupTypeDlgCompleteText" Overridable="yes">Всички програмни компоненти ще се инсталират. Изисква най-много дисково пространство.</String>
215
216 <String Id="UserExit_Title" Overridable="yes">Инсталиране на [ProductName]</String>
217 <String Id="UserExitBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
218 <String Id="UserExitTitle" Overridable="yes">{\WixUI_Font_Bigger}[ProductName] Съветникът за инсталиране беше прекъснат</String>
219 <String Id="UserExitDescription1" Overridable="yes">Инсталирането на [ProductName] е прекъснато. Системата ви не е променена. За да инсталирате тази програма по-късно, изпълнете отново инсталирането.</String>
220 <String Id="UserExitDescription2" Overridable="yes">Щракнете върху бутона "Готово", за да излезете от съветника за инсталиране.</String>
221
222 <String Id="VerifyReadyDlg_Title" Overridable="yes">Инсталиране на [ProductName]</String>
223 <String Id="VerifyReadyDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
224 <String Id="VerifyReadyDlgInstall" Overridable="yes">&amp;Инсталирай</String>
225 <String Id="VerifyReadyDlgInstallText" Overridable="yes">Щракнете върху "Инсталирай", за да започнете инсталирането. Щракнете върху "Назад", за да прегледате или промените настройките за инсталиране. Щракнете върху "Отказ", за да излезете от съветника.</String>
226 <String Id="VerifyReadyDlgInstallTitle" Overridable="yes">{\WixUI_Font_Title}Всичко е готово за инсталиране на [ProductName]</String>
227 <String Id="VerifyReadyDlgChange" Overridable="yes">&amp;Промени</String>
228 <String Id="VerifyReadyDlgChangeText" Overridable="yes">Щракнете върху "Промени", за да започнете инсталирането. Щракнете върху "Назад", за да прегледате или промените настройките за инсталиране. Щракнете върху "Отказ", за да излезете от съветника.</String>
229 <String Id="VerifyReadyDlgChangeTitle" Overridable="yes">{\WixUI_Font_Title}Всичко е готово за промяна на [ProductName]</String>
230 <String Id="VerifyReadyDlgRepair" Overridable="yes">Поп&amp;рави</String>
231 <String Id="VerifyReadyDlgRepairText" Overridable="yes">Щракнете върху "Поправи", за да поправите инсталацията на [ProductName]. Щракнете върху "Назад", за да прегледате или промените настройките за инсталиране. Щракнете върху "Отказ", за да излезете от съветника.</String>
232 <String Id="VerifyReadyDlgRepairTitle" Overridable="yes">{\WixUI_Font_Title}Всичко е готово за поправяне на [ProductName]</String>
233 <String Id="VerifyReadyDlgRemove" Overridable="yes">&amp;Премахни</String>
234 <String Id="VerifyReadyDlgRemoveText" Overridable="yes">Щракнете върху "Премахни", за да премахнете [ProductName] от компютъра си. Щракнете върху "Назад", за да прегледате или промените настройките за инсталиране. Щракнете върху "Отказ", за да излезете от съветника.</String>
235 <String Id="VerifyReadyDlgRemoveTitle" Overridable="yes">{\WixUI_Font_Title}Готовност за премахване на [ProductName]</String>
236 <String Id="VerifyReadyDlgUpdate" Overridable="yes">&amp;Актуализирай</String>
237 <String Id="VerifyReadyDlgUpdateText" Overridable="yes">Щракнете върху "Актуализирай", за да актуализирате [ProductName] от компютъра. Щракнете върху "Назад", за да прегледате или промените настройките за инсталиране. Щракнете върху "Отказ", за да излезете от съветника.</String>
238 <String Id="VerifyReadyDlgUpdateTitle" Overridable="yes">{\WixUI_Font_Title}Готовност за актуализиране на [ProductName]</String>
239
240 <String Id="WaitForCostingDlg_Title" Overridable="yes">Инсталиране на [ProductName]</String>
241 <String Id="WaitForCostingDlgReturn" Overridable="yes">&amp;Върни се</String>
242 <String Id="WaitForCostingDlgText" Overridable="yes">Моля, изчакайте, докато програмата за инсталиране определи изискванията за свободно пространство на вашия диск.</String>
243 <String Id="WaitForCostingDlgIcon" Overridable="yes">WixUI_Ico_Exclam</String>
244 <String Id="WaitForCostingDlgIconTooltip" Overridable="yes">Икона за възклицание</String>
245
246 <String Id="WelcomeDlg_Title" Overridable="yes">Инсталиране на [ProductName]</String>
247 <String Id="WelcomeDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
248 <String Id="WelcomeDlgDescription" Overridable="yes">Съветникът за инсталиране ще инсталира [ProductName] на компютъра. Щракнете върху "Напред", за да продължите, или върху "Отказ", за да излезете от съветника за инсталиране.</String>
249 <String Id="WelcomeUpdateDlgDescriptionUpdate" Overridable="yes">Съветникът за инсталиране ще актуализира [ProductName] на компютъра. Щракнете върху "Напред", за да продължите, или върху "Отказ", за да излезете от съветника за инсталиране.</String>
250 <String Id="WelcomeDlgTitle" Overridable="yes">{\WixUI_Font_Bigger}Добре дошли в съветника за инсталиране на [ProductName]</String>
251
252 <String Id="WelcomeEulaDlg_Title" Overridable="yes">Инсталиране на [ProductName]</String>
253 <String Id="WelcomeEulaDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
254 <String Id="WelcomeEulaDlgLicenseAcceptedCheckBox" Overridable="yes">&amp;Приемам условията в лицензионното споразумение</String>
255 <String Id="WelcomeEulaDlgInstall" Overridable="yes">&amp;Инсталирай</String>
256 <String Id="WelcomeEulaDlgUpdate" Overridable="yes">&amp;Актуализирай</String>
257 <String Id="WelcomeEulaDlgTitle" Overridable="yes">{\WixUI_Font_Title}Прочетете лицензионното споразумение за [ProductName]</String>
258
259 <String Id="ProgressTextInstallValidate" Overridable="yes">Проверка на инсталирането</String>
260 <String Id="ProgressTextInstallFiles" Overridable="yes">Копиране на нови файлове</String>
261 <String Id="ProgressTextInstallFilesTemplate" Overridable="yes">Файл: [1], директория: [9], размер: [6]</String>
262 <String Id="ProgressTextInstallAdminPackage" Overridable="yes">Копиране на файлове за инсталиране на мрежата</String>
263 <String Id="ProgressTextInstallAdminPackageTemplate" Overridable="yes">Файл: [1], директория: [9], размер: [6]</String>
264 <String Id="ProgressTextFileCost" Overridable="yes">Изчисляване на нужното свободно място</String>
265 <String Id="ProgressTextCostInitialize" Overridable="yes">Изчисляване на нужното свободно място</String>
266 <String Id="ProgressTextCostFinalize" Overridable="yes">Изчисляване на нужното свободно място</String>
267 <String Id="ProgressTextCreateShortcuts" Overridable="yes">Създаване на преки пътища</String>
268 <String Id="ProgressTextCreateShortcutsTemplate" Overridable="yes">Пряк път: [1]</String>
269 <String Id="ProgressTextPublishComponents" Overridable="yes">Публикуване на отговарящи на условията компоненти</String>
270 <String Id="ProgressTextPublishComponentsTemplate" Overridable="yes">ИД на компонент: [1], квалификатор: [2]</String>
271 <String Id="ProgressTextPublishFeatures" Overridable="yes">Публикуване на компонентите на продукта</String>
272 <String Id="ProgressTextPublishFeaturesTemplate" Overridable="yes">Компонент: [1]</String>
273 <String Id="ProgressTextPublishProduct" Overridable="yes">Публикуване на информацията за продукта</String>
274 <String Id="ProgressTextRegisterClassInfo" Overridable="yes">Регистриране на клас сървъри</String>
275 <String Id="ProgressTextRegisterClassInfoTemplate" Overridable="yes">ИД на клас: [1]</String>
276 <String Id="ProgressTextRegisterExtensionInfo" Overridable="yes">Регистриране на сървърите за разширения</String>
277 <String Id="ProgressTextRegisterExtensionInfoTemplate" Overridable="yes">Разширение: [1]</String>
278 <String Id="ProgressTextRegisterMIMEInfo" Overridable="yes">Регистриране на MIME информация</String>
279 <String Id="ProgressTextRegisterMIMEInfoTemplate" Overridable="yes">Тип MIME съдържание: [1], разширение: [2]</String>
280 <String Id="ProgressTextRegisterProgIdInfo" Overridable="yes">Регистриране на програмните идентификатори</String>
281 <String Id="ProgressTextRegisterProgIdInfoTemplate" Overridable="yes">ProgId: [1]</String>
282 <String Id="ProgressTextAllocateRegistrySpace" Overridable="yes">Заделяне на място в системния регистър</String>
283 <String Id="ProgressTextAllocateRegistrySpaceTemplate" Overridable="yes">Свободно място: [1]</String>
284 <String Id="ProgressTextAppSearch" Overridable="yes">Търсене на инсталирани приложения</String>
285 <String Id="ProgressTextAppSearchTemplate" Overridable="yes">Свойство: [1], подпис: [2]</String>
286 <String Id="ProgressTextBindImage" Overridable="yes">Обвързване на изпълнимите файлове</String>
287 <String Id="ProgressTextBindImageTemplate" Overridable="yes">Файл: [1]</String>
288 <String Id="ProgressTextCCPSearch" Overridable="yes">Търсене на отговарящи на условията продукти</String>
289 <String Id="ProgressTextCreateFolders" Overridable="yes">Създаване на папки</String>
290 <String Id="ProgressTextCreateFoldersTemplate" Overridable="yes">Папка: [1]</String>
291 <String Id="ProgressTextDeleteServices" Overridable="yes">Изтриване на услуги</String>
292 <String Id="ProgressTextDeleteServicesTemplate" Overridable="yes">Услуга: [1]</String>
293 <String Id="ProgressTextDuplicateFiles" Overridable="yes">Създаване на дублиращи се файлове</String>
294 <String Id="ProgressTextDuplicateFilesTemplate" Overridable="yes">Файл: [1], директория: [9], размер: [6]</String>
295 <String Id="ProgressTextFindRelatedProducts" Overridable="yes">Търсене на сродни приложения</String>
296 <String Id="ProgressTextFindRelatedProductsTemplate" Overridable="yes">Открито приложение: [1]</String>
297 <String Id="ProgressTextInstallODBC" Overridable="yes">Инсталиране на ODBC компоненти</String>
298 <String Id="ProgressTextInstallServices" Overridable="yes">Инсталиране на нови услуги</String>
299 <String Id="ProgressTextInstallServicesTemplate" Overridable="yes">Услуга: [2]</String>
300 <String Id="ProgressTextLaunchConditions" Overridable="yes">Оценка на условията за стартиране</String>
301 <String Id="ProgressTextMigrateFeatureStates" Overridable="yes">Преместване на състоянията на функциите от сродни приложения</String>
302 <String Id="ProgressTextMigrateFeatureStatesTemplate" Overridable="yes">Приложение: [1]</String>
303 <String Id="ProgressTextMoveFiles" Overridable="yes">Преместване на файлове</String>
304 <String Id="ProgressTextMoveFilesTemplate" Overridable="yes">Файл: [1], директория: [9], размер: [6]</String>
305 <String Id="ProgressTextPatchFiles" Overridable="yes">Коригиране на файлове</String>
306 <String Id="ProgressTextPatchFilesTemplate" Overridable="yes">Файл: [1], директория: [2], размер: [3]</String>
307 <String Id="ProgressTextProcessComponents" Overridable="yes">Актуализиране на регистрацията на компоненти</String>
308 <String Id="ProgressTextRegisterComPlus" Overridable="yes">Регистриране на COM+ приложения и компоненти</String>
309 <String Id="ProgressTextRegisterComPlusTemplate" Overridable="yes">AppId: [1]{{, AppType: [2], потребители: [3], RSN: [4]}}</String>
310 <String Id="ProgressTextRegisterFonts" Overridable="yes">Регистриране на шрифтове</String>
311 <String Id="ProgressTextRegisterFontsTemplate" Overridable="yes">Шрифт: [1]</String>
312 <String Id="ProgressTextRegisterProduct" Overridable="yes">Регистриране на продукта</String>
313 <String Id="ProgressTextRegisterProductTemplate" Overridable="yes">[1]</String>
314 <String Id="ProgressTextRegisterTypeLibraries" Overridable="yes">Регистриране на библиотеките с типове</String>
315 <String Id="ProgressTextRegisterTypeLibrariesTemplate" Overridable="yes">LibID: [1]</String>
316 <String Id="ProgressTextRegisterUser" Overridable="yes">Регистриране на потребителя</String>
317 <String Id="ProgressTextRegisterUserTemplate" Overridable="yes">[1]</String>
318 <String Id="ProgressTextRemoveDuplicateFiles" Overridable="yes">Премахване на дублиращите се файлове</String>
319 <String Id="ProgressTextRemoveDuplicateFilesTemplate" Overridable="yes">Файл: [1], директория: [9]</String>
320 <String Id="ProgressTextRemoveEnvironmentStrings" Overridable="yes">Актуализиране на низовете за средата</String>
321 <String Id="ProgressTextRemoveEnvironmentStringsTemplate" Overridable="yes">Име: [1], стойност: [2], действие [3]</String>
322 <String Id="ProgressTextRemoveExistingProducts" Overridable="yes">Премахване на приложенията</String>
323 <String Id="ProgressTextRemoveExistingProductsTemplate" Overridable="yes">Приложение: [1], команден ред: [2]</String>
324 <String Id="ProgressTextRemoveFiles" Overridable="yes">Премахване на файловете</String>
325 <String Id="ProgressTextRemoveFilesTemplate" Overridable="yes">Файл: [1], директория: [9]</String>
326 <String Id="ProgressTextRemoveFolders" Overridable="yes">Премахване на папките</String>
327 <String Id="ProgressTextRemoveFoldersTemplate" Overridable="yes">Папка: [1]</String>
328 <String Id="ProgressTextRemoveIniValues" Overridable="yes">Премахване на записи от INI файлове</String>
329 <String Id="ProgressTextRemoveIniValuesTemplate" Overridable="yes">Файл: [1], раздел: [2], ключ: [3], стойност: [4]</String>
330 <String Id="ProgressTextRemoveODBC" Overridable="yes">Премахване на ODBC компонентите</String>
331 <String Id="ProgressTextRemoveRegistryValues" Overridable="yes">Премахване на стойности от системния регистър</String>
332 <String Id="ProgressTextRemoveRegistryValuesTemplate" Overridable="yes">Ключ: [1], име: [2]</String>
333 <String Id="ProgressTextRemoveShortcuts" Overridable="yes">Премахване на преките пътища</String>
334 <String Id="ProgressTextRemoveShortcutsTemplate" Overridable="yes">Пряк път: [1]</String>
335 <String Id="ProgressTextRMCCPSearch" Overridable="yes">Търсене на отговарящи на условията продукти</String>
336 <String Id="ProgressTextSelfRegModules" Overridable="yes">Регистриране на модули</String>
337 <String Id="ProgressTextSelfRegModulesTemplate" Overridable="yes">Файл: [1], папка: [2]</String>
338 <String Id="ProgressTextSelfUnregModules" Overridable="yes">Дерегистриране на модулите</String>
339 <String Id="ProgressTextSelfUnregModulesTemplate" Overridable="yes">Файл: [1], папка: [2]</String>
340 <String Id="ProgressTextSetODBCFolders" Overridable="yes">Инициализиране на ODBC директории</String>
341 <String Id="ProgressTextStartServices" Overridable="yes">Стартиране на услугите</String>
342 <String Id="ProgressTextStartServicesTemplate" Overridable="yes">Услуга: [1]</String>
343 <String Id="ProgressTextStopServices" Overridable="yes">Спиране на услугите</String>
344 <String Id="ProgressTextStopServicesTemplate" Overridable="yes">Услуга: [1]</String>
345 <String Id="ProgressTextUnpublishComponents" Overridable="yes">Премахване на публикуваните отговарящи на условията компоненти</String>
346 <String Id="ProgressTextUnpublishComponentsTemplate" Overridable="yes">ИД на компонент: [1], квалификатор: [2]</String>
347 <String Id="ProgressTextUnpublishFeatures" Overridable="yes">Премахване на публикуваните компоненти на продукта</String>
348 <String Id="ProgressTextUnpublishFeaturesTemplate" Overridable="yes">Компонент: [1]</String>
349 <String Id="ProgressTextUnregisterClassInfo" Overridable="yes">Дерегистриране на клас сървърите</String>
350 <String Id="ProgressTextUnregisterClassInfoTemplate" Overridable="yes">ИД на клас: [1]</String>
351 <String Id="ProgressTextUnregisterComPlus" Overridable="yes">Дерегистриране на COM+ приложенията и компонентите</String>
352 <String Id="ProgressTextUnregisterComPlusTemplate" Overridable="yes">AppId: [1]{{, AppType: [2]}}</String>
353 <String Id="ProgressTextUnregisterExtensionInfo" Overridable="yes">Дерегистриране на сървърите за разширения</String>
354 <String Id="ProgressTextUnregisterExtensionInfoTemplate" Overridable="yes">Разширение: [1]</String>
355 <String Id="ProgressTextUnregisterFonts" Overridable="yes">Дерегистриране на шрифтовете</String>
356 <String Id="ProgressTextUnregisterFontsTemplate" Overridable="yes">Шрифт: [1]</String>
357 <String Id="ProgressTextUnregisterMIMEInfo" Overridable="yes">Дерегистриране на MIME информацията</String>
358 <String Id="ProgressTextUnregisterMIMEInfoTemplate" Overridable="yes">Тип MIME съдържание: [1], разширение: [2]</String>
359 <String Id="ProgressTextUnregisterProgIdInfo" Overridable="yes">Дерегистриране на програмните идентификатори</String>
360 <String Id="ProgressTextUnregisterProgIdInfoTemplate" Overridable="yes">ProgId: [1]</String>
361 <String Id="ProgressTextUnregisterTypeLibraries" Overridable="yes">Дерегистриране на библиотеките с типове</String>
362 <String Id="ProgressTextUnregisterTypeLibrariesTemplate" Overridable="yes">LibID: [1]</String>
363 <String Id="ProgressTextWriteEnvironmentStrings" Overridable="yes">Актуализиране на низовете за средата</String>
364 <String Id="ProgressTextWriteEnvironmentStringsTemplate" Overridable="yes">Име: [1], стойност: [2], действие [3]</String>
365 <String Id="ProgressTextWriteIniValues" Overridable="yes">Записване на стойности в INI файловете</String>
366 <String Id="ProgressTextWriteIniValuesTemplate" Overridable="yes">Файл: [1], раздел: [2], ключ: [3], стойност: [4]</String>
367 <String Id="ProgressTextWriteRegistryValues" Overridable="yes">Записване на стойности в системния регистър</String>
368 <String Id="ProgressTextWriteRegistryValuesTemplate" Overridable="yes">Ключ: [1], име: [2], стойност: [3]</String>
369 <String Id="ProgressTextAdvertise" Overridable="yes">Обявяване на приложението</String>
370 <String Id="ProgressTextGenerateScript" Overridable="yes">Генериране на операции със скриптове за действието:</String>
371 <String Id="ProgressTextGenerateScriptTemplate" Overridable="yes">[1]</String>
372 <String Id="ProgressTextInstallSFPCatalogFile" Overridable="yes">Инсталиране на системния каталог</String>
373 <String Id="ProgressTextInstallSFPCatalogFileTemplate" Overridable="yes">Файл: [1], зависимости: [2]</String>
374 <String Id="ProgressTextMsiPublishAssemblies" Overridable="yes">Публикуване на информация за блок</String>
375 <String Id="ProgressTextMsiPublishAssembliesTemplate" Overridable="yes">Контекст на приложението:[1], Име на блока:[2]</String>
376 <String Id="ProgressTextMsiUnpublishAssemblies" Overridable="yes">Премахване на публикуваната информация за блок</String>
377 <String Id="ProgressTextMsiUnpublishAssembliesTemplate" Overridable="yes">Контекст на приложението:[1], Име на блока:[2]</String>
378 <String Id="ProgressTextRollback" Overridable="yes">Връщане на процеса:</String>
379 <String Id="ProgressTextRollbackTemplate" Overridable="yes">[1]</String>
380 <String Id="ProgressTextRollbackCleanup" Overridable="yes">Премахване на архивните файлове</String>
381 <String Id="ProgressTextRollbackCleanupTemplate" Overridable="yes">Файл: [1]</String>
382 <String Id="ProgressTextUnmoveFiles" Overridable="yes">Премахване на преместените файлове</String>
383 <String Id="ProgressTextUnmoveFilesTemplate" Overridable="yes">Файл: [1], директория: [9]</String>
384 <String Id="ProgressTextUnpublishProduct" Overridable="yes">Премахване на публикуваната информация за продукта</String>
385
386 <String Id="Error0" Overridable="yes">{{Фатална грешка: }}</String>
387 <String Id="Error1" Overridable="yes">{{Грешка [1]. }}</String>
388 <String Id="Error2" Overridable="yes">Предупреждение [1]. </String>
389 <String Id="Error4" Overridable="yes">Информация [1]. </String>
390 <String Id="Error5" Overridable="yes">В програмата за инсталиране възникна неочаквана грешка по време на инсталиране на пакета. Това може да означава проблем в самия пакет. Кодът на грешката е [1]. {{Аргументите са: [2], [3], [4]}}</String>
391 <String Id="Error7" Overridable="yes">{{Дискът е пълен: }}</String>
392 <String Id="Error8" Overridable="yes">Действие [Time]: [1]. [2]</String>
393 <String Id="Error9" Overridable="yes">[ProductName]</String>
394 <String Id="Error10" Overridable="yes">{[2]}{, [3]}{, [4]}</String>
395 <String Id="Error11" Overridable="yes">Тип съобщение: [1], аргумент: [2]</String>
396 <String Id="Error12" Overridable="yes">=== Начало на регистрирането: [Date] [Time] ===</String>
397 <String Id="Error13" Overridable="yes">=== Край на регистрирането: [Date] [Time] ===</String>
398 <String Id="Error14" Overridable="yes">Стартиране на действието [Time]: [1].</String>
399 <String Id="Error15" Overridable="yes">Спиране на действието [Time]: [1]. Върната стойност [2].</String>
400 <String Id="Error16" Overridable="yes">Оставащо време: {[1] минути }{[2] секунди}</String>
401 <String Id="Error17" Overridable="yes">Няма достатъчно памет. Затворете останалите приложения, преди да опитате отново.</String>
402 <String Id="Error18" Overridable="yes">Програмата за инсталиране не отговаря.</String>
403 <String Id="Error19" Overridable="yes">Програмата за инсталиране спря преждевременно.</String>
404 <String Id="Error20" Overridable="yes">Моля, изчакайте, докато Windows конфигурира [ProductName]</String>
405 <String Id="Error21" Overridable="yes">Събиране на необходимата информация...</String>
406 <String Id="Error22" Overridable="yes">Премахване на по-старите версии на това приложение...</String>
407 <String Id="Error23" Overridable="yes">Подготовка за премахване на по-старите версии на това приложение...</String>
408 <String Id="Error32" Overridable="yes">Инсталирането на [ProductName] завърши успешно.</String>
409 <String Id="Error33" Overridable="yes">Инсталирането на {[ProductName] } е неуспешно.</String>
410 <String Id="Error1101" Overridable="yes">Грешка при четене от файл: [2]. {{ Системна грешка [3].}} Проверете дали файлът съществува и дали имате достъп до него.</String>
411 <String Id="Error1301" Overridable="yes">Файлът "[2]" не може да се създаде. Вече съществува директория с това име. Отменете инсталирането, след което опитайте да инсталирате на друго местоположение.</String>
412 <String Id="Error1302" Overridable="yes">Поставете диска: [2]</String>
413 <String Id="Error1303" Overridable="yes">Инсталиращата програма няма достатъчно привилегии за достъп до тази директория: [2]. Инсталирането не може да продължи. Влезте като администратор или се свържете със системния администратор.</String>
414 <String Id="Error1304" Overridable="yes">Грешка при записване във файла: [2]. Проверете дали имате достъп до тази директория.</String>
415 <String Id="Error1305" Overridable="yes">Грешка при четене от файла [2]. {{ Системна грешка [3].}} Проверете дали файлът съществува и дали имате достъп до него.</String>
416 <String Id="Error1306" Overridable="yes">Друго приложение има изключителен достъп до файла "[2]". Затворете всички останали приложения, след което щракнете върху "Опитай пак".</String>
417 <String Id="Error1307" Overridable="yes">Няма достатъчно свободно място на диска за инсталиране на следния файл: [2]. Освободете място, след което щракнете върху "Опитай пак" или върху "Отказ", за да излезете.</String>
418 <String Id="Error1308" Overridable="yes">Не е намерен файлът източник: [2]. Проверете дали файлът съществува и дали имате достъп до него.</String>
419 <String Id="Error1309" Overridable="yes">Грешка при четене от файл: [3]. {{ Системна грешка [2].}} Проверете дали файлът съществува и дали имате достъп до него.</String>
420 <String Id="Error1310" Overridable="yes">Грешка при записване във файла: [3]. {{ Системна грешка [2].}} Проверете дали имате достъп до тази директория.</String>
421 <String Id="Error1311" Overridable="yes">Не е намерен файлът източник {{(кабинетен файл)}}: [2]. Проверете дали файлът съществува и дали имате достъп до него.</String>
422 <String Id="Error1312" Overridable="yes">Директорията "[2]" не може да се създаде. Вече съществува файл с това име. Преименувайте или премахнете файла, след което щракнете върху "Опитай пак" или върху "Отказ", за да излезете.</String>
423 <String Id="Error1313" Overridable="yes">Том [2] е недостъпен в момента. Изберете друг том.</String>
424 <String Id="Error1314" Overridable="yes">Указаният път "[2]" е недостъпен.</String>
425 <String Id="Error1315" Overridable="yes">Не може да се записва в указаната папка: [2].</String>
426 <String Id="Error1316" Overridable="yes">Възникна грешка в мрежата при опит за четене от файла: [2]</String>
427 <String Id="Error1317" Overridable="yes">Възникна грешка при опит за създаване на директория: [2]</String>
428 <String Id="Error1318" Overridable="yes">Възникна грешка в мрежата при опит за създаване на директория: [2]</String>
429 <String Id="Error1319" Overridable="yes">Възникна грешка в мрежата при опит за отваряне на кабинетния файл източник: [2]</String>
430 <String Id="Error1320" Overridable="yes">Указаният път е твърде дълъг: [2]</String>
431 <String Id="Error1321" Overridable="yes">Програмата за инсталиране няма достатъчно привилегии за промяна на този файл: [2].</String>
432 <String Id="Error1322" Overridable="yes">Част от пътя към папката "[2]" е невалидна. Тя е празна или превишава позволената от системата дължина.</String>
433 <String Id="Error1323" Overridable="yes">Пътят на папката "[2]" съдържа думи, които не са валидни за пътища на папки.</String>
434 <String Id="Error1324" Overridable="yes">Пътят на папката "[2]" съдържа невалиден знак.</String>
435 <String Id="Error1325" Overridable="yes">"[2]" не е валидно кратко име за файл.</String>
436 <String Id="Error1326" Overridable="yes">Грешка при извличането на защитата на файлове: [3] GetLastError: [2]</String>
437 <String Id="Error1327" Overridable="yes">Невалидно устройство: [2]</String>
438 <String Id="Error1328" Overridable="yes">Грешка при прилагането на корекция във файл [2]. Файлът вероятно е актуализиран по друг начин и вече не може да се промени с тази корекция. За повече информация се свържете с доставчика на корекцията. {{Системна грешка: [3]}}</String>
439 <String Id="Error1329" Overridable="yes">Не може да се инсталира задължителен файл, тъй като кабинетният файл [2] няма цифров подпис. Това може да означава, че кабинетният файл е повреден.</String>
440 <String Id="Error1330" Overridable="yes">Не може да се инсталира задължителен файл, тъй като кабинетният файл [2] е с невалиден цифров подпис. Това може да означава, че кабинетният файл е повреден.{{ Върната е грешка [3] от WinVerifyTrust.}}</String>
441 <String Id="Error1331" Overridable="yes">Неуспешно копиране на файла [2]: CRC грешка.</String>
442 <String Id="Error1332" Overridable="yes">Неуспешно преместване на файла [2]: CRC грешка.</String>
443 <String Id="Error1333" Overridable="yes">Неуспешно коригиране на файла [2]: CRC грешка.</String>
444 <String Id="Error1334" Overridable="yes">Файлът "[2]" не може да се инсталира, тъй като не може да се намери в кабинетен файл "[3]". Това може да означава, че има грешка в мрежата, грешка при четене от компактдиска или проблем в самия пакет.</String>
445 <String Id="Error1335" Overridable="yes">Задължителният кабинетен файл "[2]" е повреден и не може да се използва. Това може да означава, че има грешка в мрежата, грешка при четене от компактдиска или проблем в самия пакет.</String>
446 <String Id="Error1336" Overridable="yes">Възникна грешка при създаването на временен файл, който е нужен за завършване на инсталирането.{{ Папка: [3]. Код на системната грешка: [2]}}</String>
447 <String Id="Error1401" Overridable="yes">Ключът не може да се създаде: [2]. {{ Системна грешка [3].}} Проверете дали имате достатъчно права за достъп до този ключ или се свържете с отдела за поддръжка. </String>
448 <String Id="Error1402" Overridable="yes">Ключът не може да се отвори: [2]. {{ Системна грешка [3].}} Проверете дали имате достатъчно права за достъп до този ключ или се свържете с отдела за поддръжка. </String>
449 <String Id="Error1403" Overridable="yes">Стойността [2] не може да се изтрие от ключа [3]. {{ Системна грешка [4].}} Проверете дали имате достатъчно права за достъп до този ключ или се свържете с отдела за поддръжка. </String>
450 <String Id="Error1404" Overridable="yes">Ключът [2] не може да се изтрие. {{ Системна грешка [3].}} Проверете дали имате достатъчно права за достъп до този ключ или се свържете с отдела за поддръжка. </String>
451 <String Id="Error1405" Overridable="yes">Стойността [2] не може да се прочете от ключа [3]. {{ Системна грешка [4].}} Проверете дали имате достатъчно права за достъп до този ключ или се свържете с отдела за поддръжка. </String>
452 <String Id="Error1406" Overridable="yes">Стойността [2] не може да се запише в ключа [3]. {{ Системна грешка [4].}} Проверете дали имате достатъчно права за достъп до този ключ или се свържете с отдела за поддръжка.</String>
453 <String Id="Error1407" Overridable="yes">Не могат да се извлекат имената на стойностите от ключа [2]. {{ Системна грешка [3].}} Проверете дали имате достатъчно права за достъп до този ключ или се свържете с отдела за поддръжка.</String>
454 <String Id="Error1408" Overridable="yes">Не могат да се извлекат имената на подключовете от ключа [2]. {{ Системна грешка [3].}} Проверете дали имате достатъчно права за достъп до този ключ или се свържете с отдела за поддръжка.</String>
455 <String Id="Error1409" Overridable="yes">Не може да се прочете информацията за защита за ключа [2]. {{ Системна грешка [3].}} Проверете дали имате достатъчно права за достъп до този ключ или се свържете с отдела за поддръжка.</String>
456 <String Id="Error1410" Overridable="yes">Не може да се увеличи наличното място за системния регистър. Нужни са [2] КБ свободно място в системния регистър за инсталирането на това приложение.</String>
457 <String Id="Error1500" Overridable="yes">В момента се изпълнява друго инсталиране. Трябва първо да го завършите, за да продължите с това.</String>
458 <String Id="Error1501" Overridable="yes">Грешка при достъп до защитени данни. Уверете се, че Windows Installer е правилно конфигуриран, след което опитайте инсталирането отново.</String>
459 <String Id="Error1502" Overridable="yes">Потребителят "[2]" е започнал инсталиране на продукта "[3]" в предишен момент. Този потребител ще трябва отново да стартира инсталирането, за да може да използва продукта. Текущото инсталиране ще продължи сега.</String>
460 <String Id="Error1503" Overridable="yes">Потребителят "[2]" е започнал инсталиране на продукта "[3]" в предишен момент. Този потребител ще трябва отново да стартира инсталирането, за да може да използва продукта.</String>
461 <String Id="Error1601" Overridable="yes">Няма достатъчно място на диска – Том: "[2]"; необходимо място: [3] КБ; свободно място: [4] КБ. Освободете място на диска, след което опитайте отново.</String>
462 <String Id="Error1602" Overridable="yes">Наистина ли искате да откажете?</String>
463 <String Id="Error1603" Overridable="yes">Файлът [2][3] се използва{ от следния процес: Име: [4], ИД: [5], Заглавие на прозореца: "[6]"}. Затворете съответното приложение, след което опитайте отново.</String>
464 <String Id="Error1604" Overridable="yes">Продуктът "[2]" е вече инсталиран, поради което инсталирането на този продукт не може да продължи. Двата продукта са несъвместими.</String>
465 <String Id="Error1605" Overridable="yes">Няма достатъчно свободно място на том "[2]", за да продължи инсталирането с разрешено възстановяване. Нужни са [3] КБ, но са свободни само [4] КБ. Щракнете върху "Игнорирай", за да продължите инсталирането, без да се записва информация за възстановяване, върху "Опитай пак", за да проверите свободното място отново, или върху "Отказ", за да прекратите инсталирането.</String>
466 <String Id="Error1606" Overridable="yes">Няма достъп до местоположението в мрежата [2].</String>
467 <String Id="Error1607" Overridable="yes">Следните приложения трябва да се затворят, преди да продължи инсталирането:</String>
468 <String Id="Error1608" Overridable="yes">Не са намерени предишно инсталирани съвместими продукти за инсталиране на продукта на машината.</String>
469 <String Id="Error1609" Overridable="yes">Възникна грешка при прилагането на настройките за защита. [2] не е валиден потребител или група. Вероятно има проблем в пакета или във връзката с домейн контролера по мрежата. Проверете връзката с мрежата, след което щракнете върху "Опитай пак" или върху "Отказ", за да прекратите инсталирането. {{Потребителският SID не може да се намери, системна грешка [3]}}</String>
470 <String Id="Error1701" Overridable="yes">Ключът [2] е невалиден. Проверете дали сте въвели правилния ключ.</String>
471 <String Id="Error1702" Overridable="yes">Инсталиращата програма трябва да рестартира компютъра, за да продължи конфигурирането на [2]. Щракнете върху "Да", за да рестартирате сега, или върху "Не", ако искате да рестартирате ръчно по-късно.</String>
472 <String Id="Error1703" Overridable="yes">Трябва да рестартирате системата, за да се активират конфигурационните промени в [2]. Щракнете върху "Да", за да рестартирате сега, или върху "Не", ако искате да рестартирате ръчно по-късно.</String>
473 <String Id="Error1704" Overridable="yes">Инсталирането на [2] е временно преустановено. Трябва да отмените направените от него промени, за да продължите това инсталиране. Искате ли да отмените тези промени?</String>
474 <String Id="Error1705" Overridable="yes">В момента се изпълнява друго инсталиране за този продукт. Трябва да отмените направените от него промени, за да продължите това инсталиране. Искате ли да отмените тези промени?</String>
475 <String Id="Error1706" Overridable="yes">Не може да се намери инсталационен пакет за продукта [2]. Опитайте отново инсталирането, като използвате валидно копие на инсталационния пакет "[3]".</String>
476 <String Id="Error1707" Overridable="yes">Инсталирането завърши успешно.</String>
477 <String Id="Error1708" Overridable="yes">Инсталирането е неуспешно.</String>
478 <String Id="Error1709" Overridable="yes">Продукт: [2] – [3]</String>
479 <String Id="Error1710" Overridable="yes">Можете да възстановите предишното състояние на компютъра или да продължите инсталирането по-късно. Искате ли да възстановите предишното състояние?</String>
480 <String Id="Error1711" Overridable="yes">Възникна грешка при запис на информацията за инсталиране върху диска. Проверете дали има достатъчно свободно място на диска, след което щракнете върху "Опитай пак" или върху "Отказ", за да прекратите инсталирането.</String>
481 <String Id="Error1712" Overridable="yes">Един или повече от нужните файлове за възстановяване на предишното състояние на компютъра не е намерен. Възстановяването не е възможно.</String>
482 <String Id="Error1713" Overridable="yes">[2] не може да инсталира някой от нужните продукти. Свържете се с отдела за техническа поддръжка. {{Системна грешка: [3].}}</String>
483 <String Id="Error1714" Overridable="yes">По-старата версия на [2] не може да се премахне. Свържете се с отдела за техническа поддръжка. {{Системна грешка [3].}}</String>
484 <String Id="Error1715" Overridable="yes">[2] е инсталиран</String>
485 <String Id="Error1716" Overridable="yes">[2] е конфигуриран</String>
486 <String Id="Error1717" Overridable="yes">[2] е премахнат</String>
487 <String Id="Error1718" Overridable="yes">Файлът [2] е отхвърлен от правилата за цифрови подписи.</String>
488 <String Id="Error1719" Overridable="yes">Няма достъп до услугата Windows Installer. Това е възможно, ако Windows работи в безопасен режим или ако Windows Installer не е правилно инсталиран. Свържете се с отдела за техническа поддръжка за повече помощ.</String>
489 <String Id="Error1720" Overridable="yes">Възникна проблем с този пакет с Windows Installer. Не може да се изпълни задължителен скрипт за това инсталиране. Свържете се с отдела за техническа поддръжка или с доставчика на пакета. {{Действие по избор [2] грешка в скрипт [3], [4]: [5] Ред [6], Колона [7], [8] }}</String>
490 <String Id="Error1721" Overridable="yes">Възникна проблем с този пакет с Windows Installer. Не може да се изпълни задължителна програма за това инсталиране. Свържете се с отдела за техническа поддръжка или с доставчика на пакета. {{Действие: [2], местоположение: [3], команда: [4] }}</String>
491 <String Id="Error1722" Overridable="yes">Възникна проблем с този пакет с Windows Installer. Програмата, която е изпълнена като част от инсталационния процес, не завърши нормално. Свържете се с отдела за техническа поддръжка или с доставчика на пакета. {{Действие [2], местоположение: [3], команда: [4] }}</String>
492 <String Id="Error1723" Overridable="yes">Възникна проблем с този пакет с Windows Installer. Не може да се изпълни задължителен DLL файл за това инсталиране. Свържете се с отдела за техническа поддръжка или с доставчика на пакета. {{Действие [2], запис: [3], библиотека: [4] }}</String>
493 <String Id="Error1724" Overridable="yes">Премахването завърши успешно.</String>
494 <String Id="Error1725" Overridable="yes">Премахването е неуспешно.</String>
495 <String Id="Error1726" Overridable="yes">Обявяването завърши успешно.</String>
496 <String Id="Error1727" Overridable="yes">Обявяването е неуспешно.</String>
497 <String Id="Error1728" Overridable="yes">Конфигурирането завърши успешно.</String>
498 <String Id="Error1729" Overridable="yes">Конфигурирането не е успешно.</String>
499 <String Id="Error1730" Overridable="yes">Трябва да сте администратор, за да премахнете това приложение. За да го премахнете, можете да влезете като администратор или да се свържете с отдела за техническа поддръжка за повече помощ.</String>
500 <String Id="Error1731" Overridable="yes">Инсталационният пакет източник на продукта [2] не е синхронизиран с клиентския пакет. Опитайте отново инсталирането, като използвате валидно копие на инсталационния пакет "[3]".</String>
501 <String Id="Error1732" Overridable="yes">За да завършите инсталирането на [2], трябва да рестартирате компютъра. В момента в компютъра са влезли други потребители и при рестартиране те могат да загубят работата си. Искате ли да рестартирате сега?</String>
502 <String Id="Error1801" Overridable="yes">Пътят [2] не е валиден. Укажете валиден път.</String>
503 <String Id="Error1802" Overridable="yes">Няма достатъчно памет. Затворете останалите приложения, преди да опитате отново.</String>
504 <String Id="Error1803" Overridable="yes">Няма диск в устройство [2]. Поставете диск и щракнете върху "Опитай пак" или върху "Отказ", за да се върнете към предишно избрания том.</String>
505 <String Id="Error1804" Overridable="yes">Няма диск в устройство [2]. Поставете диск, след което щракнете върху "Опитай пак", или върху "Отказ", за да се върнете в каталога за преглед и да изберете друг том.</String>
506 <String Id="Error1805" Overridable="yes">Папката [2] не съществува. Въведете път към съществуваща папка.</String>
507 <String Id="Error1806" Overridable="yes">Нямате достатъчно привилегии, за да четете тази папка.</String>
508 <String Id="Error1807" Overridable="yes">Не е намерена валидна папка местоназначение за инсталирането.</String>
509 <String Id="Error1901" Overridable="yes">Грешка при опит за четене от базата данни за инсталиране: [2].</String>
510 <String Id="Error1902" Overridable="yes">Планиране на операция за рестартиране: Преименуване на файла [2] на [3]. Компютърът трябва да се рестартира, за да завърши операцията.</String>
511 <String Id="Error1903" Overridable="yes">Планиране на операция за рестартиране: Изтриване на файла [2]. Компютърът трябва да се рестартира, за да завърши операцията.</String>
512 <String Id="Error1904" Overridable="yes">Неуспешно регистриране на модула [2]. HRESULT [3]. Свържете се с отдела за поддръжка.</String>
513 <String Id="Error1905" Overridable="yes">Неуспешно дерегистриране на модула [2]. HRESULT [3]. Свържете се с отдела за поддръжка.</String>
514 <String Id="Error1906" Overridable="yes">Неуспешно кеширане на пакета [2]. Грешка: [3]. Свържете се с отдела за поддръжка.</String>
515 <String Id="Error1907" Overridable="yes">Неуспешно регистриране на шрифта [2]. Проверете дали имате достатъчно разрешения да инсталирате шрифтове и дали системата поддържа този шрифт.</String>
516 <String Id="Error1908" Overridable="yes">Неуспешно дерегистриране на шрифта [2]. Проверете дали имате права да премахвате шрифтове.</String>
517 <String Id="Error1909" Overridable="yes">Неуспешно създаване на прекия път [2]. Проверете дали папката местоназначение съществува и дали имате достъп до нея.</String>
518 <String Id="Error1910" Overridable="yes">Неуспешно премахване на прекия път [2]. Проверете дали файлът на прекия път съществува и дали имате достъп до него.</String>
519 <String Id="Error1911" Overridable="yes">Неуспешно регистриране на библиотеката на типовете за файла [2]. Свържете се с отдела за поддръжка.</String>
520 <String Id="Error1912" Overridable="yes">Неуспешно премахване на регистрацията на библиотеката на типове за файла [2]. Свържете се с отдела за поддръжка.</String>
521 <String Id="Error1913" Overridable="yes">Неуспешно актуализиране на ini файла [2][3]. Проверете дали файлът съществува и дали имате достъп до него.</String>
522 <String Id="Error1914" Overridable="yes">Неуспешно планиране на заместването на файл [3] с файл [2] при рестартиране. Проверете дали имате разрешение за запис във файла [3].</String>
523 <String Id="Error1915" Overridable="yes">Неуспешно премахване на диспечера на ODBC драйвери, ODBC грешка [2]: [3]. Свържете се с отдела за поддръжка.</String>
524 <String Id="Error1916" Overridable="yes">Неуспешно инсталиране на диспечера на ODBC драйвери, ODBC грешка [2]: [3]. Свържете се с отдела за поддръжка.</String>
525 <String Id="Error1917" Overridable="yes">Грешка при премахване на ODBC драйвера: [4], ODBC грешка [2]: [3]. Проверете дали имате привилегии да премахвате ODBC драйвери.</String>
526 <String Id="Error1918" Overridable="yes">Грешка при инсталиране на ODBC драйвера: [4], ODBC грешка [2]: [3]. Проверете дали файлът [4] съществува и дали имате достъп до него.</String>
527 <String Id="Error1919" Overridable="yes">Грешка при конфигурирането на източника на ODBC данни: [4], ODBC грешка [2]: [3]. Проверете дали файлът [4] съществува и дали имате достъп до него.</String>
528 <String Id="Error1920" Overridable="yes">Неуспешно стартиране на услугата "[2]" ([3]). Проверете дали имате достатъчно привилегии, за да стартирате системни услуги.</String>
529 <String Id="Error1921" Overridable="yes">Услугата "[2]" ([3]) не може да бъде спряна. Проверете дали имате достатъчно привилегии, за да спирате системни услуги.</String>
530 <String Id="Error1922" Overridable="yes">Услугата "[2]" ([3]) не може да се изтрие. Проверете дали имате достатъчно привилегии, за да премахвате системни услуги.</String>
531 <String Id="Error1923" Overridable="yes">Услугата "[2]" ([3]) не може да се инсталира. Проверете дали имате достатъчно привилегии, за да инсталирате системни услуги.</String>
532 <String Id="Error1924" Overridable="yes">Променливата за средата "[2]" не може да се актуализира. Проверете дали имате достатъчно привилегии, за да променяте променливи за средата.</String>
533 <String Id="Error1925" Overridable="yes">Нямате достатъчно привилегии, за да завършите инсталирането за всички потребители на машината. Влезете като администратор, след което опитайте отново да инсталирате.</String>
534 <String Id="Error1926" Overridable="yes">Неуспешно задаване на защитата за файла "[3]". Грешка: [2]. Проверете дали имате достатъчно привилегии, за да променяте разрешенията за защита на файла.</String>
535 <String Id="Error1927" Overridable="yes">На компютъра няма инсталирани услуги за компоненти (COM+ 1.0). За да завърши успешно, това инсталиране изисква услуги за компоненти. Услуги за компоненти има в Windows 2000.</String>
536 <String Id="Error1928" Overridable="yes">Грешка при регистриране на COM+ приложението. Свържете се с отдела за поддръжка за повече информация.</String>
537 <String Id="Error1929" Overridable="yes">Грешка при премахване на регистрация на COM+ приложението. Свържете се с отдела за поддръжка за повече информация.</String>
538 <String Id="Error1930" Overridable="yes">Описанието на услугата "[2]" ([3]) не може да се промени.</String>
539 <String Id="Error1931" Overridable="yes">Услугата Windows Installer не може да актуализира системния файл [2], тъй като файлът е защитен от Windows. За да работи правилно програмата, трябва да актуализирате операционната система. {{Версия на пакета: [3], Версия на защитената операционна система: [4]}}</String>
540 <String Id="Error1932" Overridable="yes">Услугата Windows Installer не може да актуализира защитения файл на Windows [2]. {{Версия на пакета: [3], Версия на защитената операционна система: [4], SFP грешка: [5]}}</String>
541 <String Id="Error1933" Overridable="yes">Услугата Windows Installer не може да актуализира един или повече защитени файлове на Windows. {{SFP грешка: [2]. Списък със защитени файлове:\r\n[3]}}</String>
542 <String Id="Error1934" Overridable="yes">Потребителските инсталации са забранени от правила на компютъра.</String>
543 <String Id="Error1935" Overridable="yes">Възникна грешка при инсталиране на сбора "[6]". За повече информация вижте в "Помощ и поддръжка". HRESULT: [3]. {{интерфейс на сбора: [4], функция: [5], компонент [2]}}</String>
544 <String Id="Error1936" Overridable="yes">Възникна грешка при инсталиране на сбора "[6]". Сборът няма защитено име или не е подписан с ключ с минималната дължина. HRESULT: [3]. {{интерфейс на сбора: [4], функция: [5], компонент: [2]}}</String>
545 <String Id="Error1937" Overridable="yes">Възникна грешка при инсталиране на сбора "[6]". Подписът или каталогът не могат да се проверят или не са валидни. HRESULT: [3]. {{интерфейс на сбора: [4], функция: [5], компонент: [2]}}</String>
546 <String Id="Error1938" Overridable="yes">Възникна грешка при инсталиране на сбора "[6]". Един или повече модули не могат да се открият. HRESULT: [3]. {{интерфейс на сбора: [4], функция: [5], компонент: [2]}}</String>
547
548 <String Id="UITextbytes" Overridable="yes">байтове</String>
549 <String Id="UITextGB" Overridable="yes">ГБ</String>
550 <String Id="UITextKB" Overridable="yes">КБ</String>
551 <String Id="UITextMB" Overridable="yes">МБ</String>
552 <String Id="UITextMenuAbsent" Overridable="yes">Целият компонент няма да е наличен</String>
553 <String Id="UITextMenuAdvertise" Overridable="yes">Компонентът ще се инсталира, когато е необходимо</String>
554 <String Id="UITextMenuAllCD" Overridable="yes">Целият компонент ще бъде инсталиран така, че да се изпълнява от компактдиск</String>
555 <String Id="UITextMenuAllLocal" Overridable="yes">Целият компонент ще бъде инсталиран върху локалния твърд диск</String>
556 <String Id="UITextMenuAllNetwork" Overridable="yes">Целият компонент ще бъде инсталиран да се изпълнява от мрежата</String>
557 <String Id="UITextMenuCD" Overridable="yes">Ще се инсталира така, че да се изпълнява от компактдиск</String>
558 <String Id="UITextMenuLocal" Overridable="yes">Ще се инсталира върху локалния твърд диск</String>
559 <String Id="UITextMenuNetwork" Overridable="yes">Ще се инсталира да се изпълнява от мрежата</String>
560 <String Id="UITextNewFolder" Overridable="yes">Папка|Нова папка</String>
561 <String Id="UITextScriptInProgress" Overridable="yes">Събиране на необходимата информация...</String>
562 <String Id="UITextSelAbsentAbsent" Overridable="yes">Този компонент ще остане неинсталиран</String>
563 <String Id="UITextSelAbsentAdvertise" Overridable="yes">Този компонент ще се инсталира при нужда</String>
564 <String Id="UITextSelAbsentCD" Overridable="yes">Този компонент ще се инсталира така, че да се изпълнява от компактдиск</String>
565 <String Id="UITextSelAbsentLocal" Overridable="yes">Този компонент ще се инсталира на локалния твърд диск</String>
566 <String Id="UITextSelAbsentNetwork" Overridable="yes">Този компонент ще се инсталира да се изпълнява от мрежата</String>
567 <String Id="UITextSelAdvertiseAbsent" Overridable="yes">Този компонент няма да е достъпен</String>
568 <String Id="UITextSelAdvertiseAdvertise" Overridable="yes">Ще се инсталира при нужда</String>
569 <String Id="UITextSelAdvertiseCD" Overridable="yes">Този компонент ще се инсталира така, че да се изпълнява от компактдиск</String>
570 <String Id="UITextSelAdvertiseLocal" Overridable="yes">Този компонент ще се инсталира върху локалния твърд диск</String>
571 <String Id="UITextSelAdvertiseNetwork" Overridable="yes">Този компонент ще може да се изпълнява от мрежата</String>
572 <String Id="UITextSelCDAbsent" Overridable="yes">Този компонент ще се деинсталира изцяло, така че няма да можете да го изпълнявате от компактдиск</String>
573 <String Id="UITextSelCDAdvertise" Overridable="yes">Този компонент няма да се изпълнява от компактдиска, а ще се инсталира само при нужда</String>
574 <String Id="UITextSelCDCD" Overridable="yes">Този компонент ще продължава да се изпълнява от компактдиск</String>
575 <String Id="UITextSelCDLocal" Overridable="yes">Този компонент няма да може да се изпълнява от компактдиск, а ще бъде инсталиран на локалния твърд диск</String>
576 <String Id="UITextSelChildCostNeg" Overridable="yes">Този компонент освобождава [1] на твърдия диск.</String>
577 <String Id="UITextSelChildCostPos" Overridable="yes">Този компонент изисква [1] на твърдия диск.</String>
578 <String Id="UITextSelCostPending" Overridable="yes">Изчисляване на изискванията за този компонент...</String>
579 <String Id="UITextSelLocalAbsent" Overridable="yes">Този компонент ще се премахне изцяло</String>
580 <String Id="UITextSelLocalAdvertise" Overridable="yes">Този компонент ще се премахне от локалния твърд диск и ще се инсталира само при нужда</String>
581 <String Id="UITextSelLocalCD" Overridable="yes">Този компонент ще се премахне от локалния ви твърд диск, но все пак ще може да се изпълнява от компактдиск</String>
582 <String Id="UITextSelLocalLocal" Overridable="yes">Този компонент ще остане на вашия локален твърд диск</String>
583 <String Id="UITextSelLocalNetwork" Overridable="yes">Този компонент ще се премахне от локалния ви твърд диск, но все пак ще може да се изпълнява от мрежата</String>
584 <String Id="UITextSelNetworkAbsent" Overridable="yes">Този компонент ще се деинсталира изцяло, така че няма да можете да го изпълнявате от мрежата</String>
585 <String Id="UITextSelNetworkAdvertise" Overridable="yes">Този компонент няма да може да се изпълнява от мрежата, но ще може да се инсталира при необходимост</String>
586 <String Id="UITextSelNetworkLocal" Overridable="yes">Този компонент няма да може да се изпълнява от мрежата, а ще бъде инсталиран на локалния твърд диск</String>
587 <String Id="UITextSelNetworkNetwork" Overridable="yes">Този компонент ще продължава да се изпълнява от мрежата</String>
588 <String Id="UITextSelParentCostNegNeg" Overridable="yes">Този компонент освобождава [1] на твърдия диск. Избрани са [2] от [3] подкомпонента. Подкомпонентите освобождават [4] на твърдия диск.</String>
589 <String Id="UITextSelParentCostNegPos" Overridable="yes">Този компонент освобождава [1] на твърдия диск. Избрани са [2] от [3] подкомпонента. Подкомпонентите изискват [4] на твърдия диск.</String>
590 <String Id="UITextSelParentCostPosNeg" Overridable="yes">Този компонент изисква [1] на твърдия диск. Избрани са [2] от [3] подкомпонента. Подкомпонентите освобождават [4] на твърдия диск.</String>
591 <String Id="UITextSelParentCostPosPos" Overridable="yes">Този компонент изисква [1] на твърдия диск. Избрани са [2] от [3] подкомпонента. Подкомпонентите изискват [4] на твърдия диск.</String>
592 <String Id="UITextTimeRemaining" Overridable="yes">Оставащо време: {[1] минути }{[2] секунди}</String>
593 <String Id="UITextVolumeCostAvailable" Overridable="yes">Налично</String>
594 <String Id="UITextVolumeCostDifference" Overridable="yes">Разлика</String>
595 <String Id="UITextVolumeCostRequired" Overridable="yes">Задължителен</String>
596 <String Id="UITextVolumeCostSize" Overridable="yes">Размер на диска</String>
597 <String Id="UITextVolumeCostVolume" Overridable="yes">Том</String>
598</WixLocalization>
diff --git a/src/ext/UI/wixlib/WixUI_ca-ES.wxl b/src/ext/UI/wixlib/WixUI_ca-ES.wxl
new file mode 100644
index 00000000..6275f486
--- /dev/null
+++ b/src/ext/UI/wixlib/WixUI_ca-ES.wxl
@@ -0,0 +1,598 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3
4
5<WixLocalization Culture="ca-es" Codepage="1252" xmlns="http://wixtoolset.org/schemas/v4/wxl">
6 <String Id="WixUIBack" Overridable="yes">&amp;Endarrere</String>
7 <String Id="WixUINext" Overridable="yes">&amp;Endavant</String>
8 <String Id="WixUICancel" Overridable="yes">Cancel·la</String>
9 <String Id="WixUIFinish" Overridable="yes">&amp;Final</String>
10 <String Id="WixUIRetry" Overridable="yes">&amp;Torna-ho a provar</String>
11 <String Id="WixUIIgnore" Overridable="yes">&amp;Ignora-ho</String>
12 <String Id="WixUIYes" Overridable="yes">&amp;Sí</String>
13 <String Id="WixUINo" Overridable="yes">&amp;No</String>
14 <String Id="WixUIOK" Overridable="yes">D'acord</String>
15 <String Id="WixUIPrint" Overridable="yes">&amp;Imprimeix</String>
16
17 <String Id="AdvancedWelcomeEulaDlg_Title" Overridable="yes">Instal·lació del producte [ProductName]</String>
18 <String Id="AdvancedWelcomeEulaDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
19 <String Id="AdvancedWelcomeEulaDlgTitle" Overridable="yes">{\WixUI_Font_Title}Llegiu el contracte de llicència del producte [ProductName]</String>
20 <String Id="AdvancedWelcomeEulaDlgLicenseAcceptedCheckBox" Overridable="yes">&amp;Accepto les condicions del contracte de llicència</String>
21 <String Id="AdvancedWelcomeEulaDlgDescriptionPerMachine" Overridable="yes">Feu clic a Instal·la per instal·lar el producte amb opcions predeterminades per a tots els usuaris. Feu clic a Avançades per canviar les opcions d'instal·lació.</String>
22 <String Id="AdvancedWelcomeEulaDlgDescriptionPerUser" Overridable="yes">Feu clic a Instal·la per instal·lar el producte amb opcions predeterminades només per al vostre usuari. Feu clic a Avançades per canviar les opcions d'instal·lació.</String>
23 <String Id="AdvancedWelcomeEulaDlgInstall" Overridable="yes">&amp;Instal·la</String>
24 <String Id="AdvancedWelcomeEulaDlgAdvanced" Overridable="yes">A&amp;vançades</String>
25 <String Id="Advanced_Font_Normal_Size" Overridable="yes">8</String>
26 <String Id="Advanced_Font_Bigger_Size" Overridable="yes">12</String>
27 <String Id="Advanced_Font_Title_Size" Overridable="yes">9</String>
28 <String Id="Advanced_Font_Emphasized_Size" Overridable="yes">8</String>
29 <String Id="Advanced_Font_FaceName" Overridable="yes">Tahoma</String>
30
31 <String Id="BrowseDlg_Title" Overridable="yes">Instal·lació del producte [ProductName]</String>
32 <String Id="BrowseDlgComboLabel" Overridable="yes">&amp;Mira a:</String>
33 <String Id="BrowseDlgWixUI_Bmp_Up" Overridable="yes">WixUI_Bmp_Up</String>
34 <String Id="BrowseDlgWixUI_Bmp_UpTooltip" Overridable="yes">Un nivell amunt</String>
35 <String Id="BrowseDlgNewFolder" Overridable="yes">WixUI_Bmp_New</String>
36 <String Id="BrowseDlgNewFolderTooltip" Overridable="yes">Crea una carpeta nova</String>
37 <String Id="BrowseDlgPathLabel" Overridable="yes">&amp;Nom de la carpeta:</String>
38 <String Id="BrowseDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
39 <String Id="BrowseDlgDescription" Overridable="yes">Navega a la carpeta de destinació</String>
40 <String Id="BrowseDlgTitle" Overridable="yes">{\WixUI_Font_Title}Canvia la carpeta de destinació</String>
41
42 <String Id="CancelDlg_Title" Overridable="yes">Instal·lació del producte [ProductName]</String>
43 <String Id="CancelDlgText" Overridable="yes">Esteu segur que voleu cancel·lar la instal·lació del producte [ProductName]?</String>
44 <String Id="CancelDlgIcon" Overridable="yes">WixUI_Ico_Info</String>
45 <String Id="CancelDlgIconTooltip" Overridable="yes">Icona d'informació</String>
46
47 <String Id="CustomizeDlg_Title" Overridable="yes">Instal·lació del producte [ProductName]</String>
48 <String Id="CustomizeDlgTree" Overridable="yes">Arbre de seleccions</String>
49 <String Id="CustomizeDlgBrowse" Overridable="yes">N&amp;avega...</String>
50 <String Id="CustomizeDlgReset" Overridable="yes">Re&amp;stableix</String>
51 <String Id="CustomizeDlgDiskCost" Overridable="yes">&amp;Ús de disc</String>
52 <String Id="CustomizeDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
53 <String Id="CustomizeDlgText" Overridable="yes">Feu clic a les icones de l'arbre que apareix a continuació per canviar la manera en què s'instal·laran les característiques.</String>
54 <String Id="CustomizeDlgDescription" Overridable="yes">Seleccioneu la manera en què voleu que s'instal·lin les característiques.</String>
55 <String Id="CustomizeDlgTitle" Overridable="yes">{\WixUI_Font_Title}Configuració personalitzada</String>
56 <String Id="CustomizeDlgItemDescription" Overridable="yes">CustomizeDlgItemDescription-CustomizeDlgItemDescription</String>
57 <String Id="CustomizeDlgItemSize" Overridable="yes">CustomizeDlgItemSize-CustomizeDlgItemSize</String>
58 <String Id="CustomizeDlgLocation" Overridable="yes">CustomizeDlgLocation-CustomizeDlgLocation</String>
59 <String Id="CustomizeDlgLocationLabel" Overridable="yes">Ubicació:</String>
60
61 <String Id="DiskCostDlg_Title" Overridable="yes">Instal·lació del producte [ProductName]</String>
62 <String Id="DiskCostDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
63 <String Id="DiskCostDlgText" Overridable="yes">Els volums ressaltats no tenen prou espai disponible al disc per a les característiques seleccionades. Podeu suprimir alguns fitxers dels volums ressaltats, instal·lar menys característiques o seleccionar altres unitats de destinació.</String>
64 <String Id="DiskCostDlgDescription" Overridable="yes">L'espai de disc necessari per a la instal·lació de les característiques seleccionades.</String>
65 <String Id="DiskCostDlgTitle" Overridable="yes">{\WixUI_Font_Title}Requisits d'espai al disc</String>
66 <String Id="DiskCostDlgVolumeList" Overridable="yes">{120}{70}{70}{70}{70}</String>
67
68 <String Id="ErrorDlg_Title" Overridable="yes">Instal·lació del producte [ProductName]</String>
69 <String Id="ErrorDlgErrorText" Overridable="yes">Text informatiu</String>
70 <String Id="ErrorDlgErrorIcon" Overridable="yes">WixUI_Ico_Info</String>
71 <String Id="ErrorDlgErrorIconTooltip" Overridable="yes">Icona d'informació</String>
72
73 <String Id="ExitDialog_Title" Overridable="yes">Instal·lació del producte [ProductName]</String>
74 <String Id="ExitDialogBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
75 <String Id="ExitDialogDescription" Overridable="yes">Feu clic al botó Final per sortir de l'auxiliar d'instal·lació.</String>
76 <String Id="ExitDialogTitle" Overridable="yes">{\WixUI_Font_Bigger}S'ha completat l'auxiliar d'instal·lació del producte [ProductName]</String>
77
78 <String Id="FatalError_Title" Overridable="yes">Instal·lació del producte [ProductName]</String>
79 <String Id="FatalErrorBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
80 <String Id="FatalErrorTitle" Overridable="yes">{\WixUI_Font_Bigger}L'auxiliar d'instal·lació del producte [ProductName] ha finalitzat abans d'hora</String>
81 <String Id="FatalErrorDescription1" Overridable="yes">L'auxiliar d'instal·lació del producte [ProductName] ha finalitzat abans d'hora a causa d'un error. No s'ha modificat el sistema. Per instal·lar aquest programa en un altre moment, torneu a executar l'auxiliar d'instal·lació.</String>
82 <String Id="FatalErrorDescription2" Overridable="yes">Feu clic al botó Final per sortir de l'auxiliar d'instal·lació.</String>
83
84 <String Id="FeaturesDlg_Title" Overridable="yes">Instal·lació del producte [ProductName]</String>
85 <String Id="FeaturesDlgTree" Overridable="yes">Característiques del producte</String>
86 <String Id="FeaturesDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
87 <String Id="FeaturesDlgDescription" Overridable="yes">Seleccioneu la manera en què voleu que s'instal·lin les característiques.</String>
88 <String Id="FeaturesDlgTitle" Overridable="yes">{\WixUI_Font_Title}Característiques del producte</String>
89 <String Id="FeaturesDlgItemDescription" Overridable="yes">FeaturesDlgItemDescription</String>
90 <String Id="FeaturesDlgItemSize" Overridable="yes">FeaturesDlgItemSize</String>
91 <String Id="FeaturesDlgInstall" Overridable="yes">&amp;Instal·la</String>
92 <String Id="FeaturesDlgChange" Overridable="yes">&amp;Canvia</String>
93
94 <String Id="FilesInUse_Title" Overridable="yes">Instal·lació del producte [ProductName]</String>
95 <String Id="FilesInUseExit" Overridable="yes">&amp;Surt</String>
96 <String Id="FilesInUseBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
97 <String Id="FilesInUseText" Overridable="yes">Les següents aplicacions fan servir fitxers que cal actualitzar en aquesta instal·lació. Tanqueu aquestes aplicacions i feu clic a &amp;Torna-ho a provar per continuar amb la instal·lació o bé a Surt per sortir-ne.</String>
98 <String Id="FilesInUseDescription" Overridable="yes">S'estan utilitzant alguns fitxers que cal actualitzar.</String>
99 <String Id="FilesInUseTitle" Overridable="yes">{\WixUI_Font_Title}Fitxers en ús</String>
100
101 <String Id="InstallDirDlg_Title" Overridable="yes">Instal·lació del producte [ProductName]</String>
102 <String Id="InstallDirDlgChange" Overridable="yes">&amp;Canvia...</String>
103 <String Id="InstallDirDlgTitle" Overridable="yes">{\WixUI_Font_Title}Carpeta de destinació</String>
104 <String Id="InstallDirDlgDescription" Overridable="yes">Feu clic a Endavant per instal·lar a la carpeta predeterminada o feu clic a Canvia per triar-ne una altra.</String>
105 <String Id="InstallDirDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
106 <String Id="InstallDirDlgFolderLabel" Overridable="yes">Instal·la el producte [ProductName] a:</String>
107
108 <String Id="InstallScopeDlg_Title" Overridable="yes">Instal·lació del producte [ProductName]</String>
109 <String Id="InstallScopeDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
110 <String Id="InstallScopeDlgDescription" Overridable="yes">Trieu l'àmbit d'instal·lació i la carpeta</String>
111 <String Id="InstallScopeDlgTitle" Overridable="yes">{\WixUI_Font_Title}Àmbit d'instal·lació</String>
112 <String Id="InstallScopeDlgPerUser" Overridable="yes">{\WixUI_Font_Emphasized}Instal·la &amp;només per al vostre usuari ([LogonUser])</String>
113 <String Id="InstallScopeDlgPerUserDescription" Overridable="yes">El producte [ProductName] s'instal·larà en una carpeta per usuari i estarà disponible només per al compte del vostre usuari. No necessiteu privilegis locals d'administrador.</String>
114 <String Id="InstallScopeDlgNoPerUserDescription" Overridable="yes">El producte [ProductName] no admet la instal·lació per usuari.</String>
115 <String Id="InstallScopeDlgPerMachine" Overridable="yes">{\WixUI_Font_Emphasized}Instal·la per a tots els usuaris d'aquest &amp;ordinador</String>
116 <String Id="InstallScopeDlgPerMachineDescription" Overridable="yes">El producte [ProductName] s'instal·larà en una carpeta per ordinador de manera predeterminada i estarà disponible per a tots els usuaris. Podeu canviar la carpeta d'instal·lació predeterminada. Heu de tenir privilegis locals d'administrador.</String>
117 <String Id="InstallScopeDlgFolderLabel" Overridable="yes">Carpeta d'&amp;instal·lació:</String>
118 <String Id="InstallScopeDlgChange" Overridable="yes">&amp;Canvia...</String>
119
120 <String Id="InvalidDirDlg_Title" Overridable="yes">Instal·lació del producte [ProductName]</String>
121 <String Id="InvalidDirDlgText" Overridable="yes">El directori d'instal·lació ha de trobar-se en una unitat de disc dur local.</String>
122 <String Id="InvalidDirDlgIcon" Overridable="yes">WixUI_Ico_Info</String>
123 <String Id="InvalidDirDlgIconTooltip" Overridable="yes">Icona d'informació</String>
124
125 <String Id="LicenseAgreementDlg_Title" Overridable="yes">Instal·lació del producte [ProductName]</String>
126 <String Id="LicenseAgreementDlgLicenseAcceptedCheckBox" Overridable="yes">&amp;Accepto les condicions del contracte de llicència</String>
127 <String Id="LicenseAgreementDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
128 <String Id="LicenseAgreementDlgDescription" Overridable="yes">Llegiu el contracte de llicència següent atentament</String>
129 <String Id="LicenseAgreementDlgTitle" Overridable="yes">{\WixUI_Font_Title}Contracte de llicència de l'usuari final</String>
130
131 <String Id="MaintenanceTypeDlg_Title" Overridable="yes">Instal·lació del producte [ProductName]</String>
132 <String Id="MaintenanceTypeDlgChangeButton" Overridable="yes">&amp;Canvia</String>
133 <String Id="MaintenanceTypeDlgChangeButtonTooltip" Overridable="yes">Canvia la instal·lació</String>
134 <String Id="MaintenanceTypeDlgRepairButton" Overridable="yes">Re&amp;para</String>
135 <String Id="MaintenanceTypeDlgRepairButtonTooltip" Overridable="yes">Repara la instal·lació</String>
136 <String Id="MaintenanceTypeDlgRemoveButton" Overridable="yes">&amp;Suprimeix</String>
137 <String Id="MaintenanceTypeDlgRemoveButtonTooltip" Overridable="yes">Suprimeix la instal·lació</String>
138 <String Id="MaintenanceTypeDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
139 <String Id="MaintenanceTypeDlgDescription" Overridable="yes">Seleccioneu l'operació que voleu realitzar.</String>
140 <String Id="MaintenanceTypeDlgTitle" Overridable="yes">{\WixUI_Font_Title}Canvi, reparació o supressió de la instal·lació</String>
141 <String Id="MaintenanceTypeDlgChangeText" Overridable="yes">Permet canviar la manera com s'instal·len les característiques.</String>
142 <String Id="MaintenanceTypeDlgChangeDisabledText" Overridable="yes">El producte [ProductName] no té cap característica que es pugui seleccionar de manera independent.</String>
143 <String Id="MaintenanceTypeDlgRemoveText" Overridable="yes">Suprimeix el producte [ProductName] de l'ordinador.</String>
144 <String Id="MaintenanceTypeDlgRemoveDisabledText" Overridable="yes">No es pot suprimir el producte [ProductName].</String>
145 <String Id="MaintenanceTypeDlgRepairText" Overridable="yes">Repara els errors de la instal·lació més recent corregint fitxers, dreceres i entrades del registre perduts i malmesos.</String>
146 <String Id="MaintenanceTypeDlgRepairDisabledText" Overridable="yes">No es pot reparar el producte [ProductName].</String>
147
148 <String Id="MaintenanceWelcomeDlg_Title" Overridable="yes">Instal·lació del producte [ProductName]</String>
149 <String Id="MaintenanceWelcomeDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
150 <String Id="MaintenanceWelcomeDlgDescription" Overridable="yes">L'auxiliar d'instal·lació us permet canviar la manera com s'instal·len les característiques del producte [ProductName] a l'ordinador o bé suprimir el producte. Feu clic a Endavant per continuar, o a Cancel·la, per sortir de l'auxiliar d'instal·lació.</String>
151 <String Id="MaintenanceWelcomeDlgTitle" Overridable="yes">{\WixUI_Font_Bigger}Benvinguts a l'auxiliar d'instal·lació del producte [ProductName]</String>
152
153 <String Id="MsiRMFilesInUse_Title" Overridable="yes">Instal·lació del producte [ProductName]</String>
154 <String Id="MsiRMFilesInUseBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
155 <String Id="MsiRMFilesInUseText" Overridable="yes">Les següents aplicacions fan servir fitxers que cal actualitzar en aquesta instal·lació. Podeu deixar que l'auxiliar d'instal·lació les tanqui i intenti reiniciar-les o podeu reiniciar l'ordinador més tard.</String>
156 <String Id="MsiRMFilesInUseDescription" Overridable="yes">S'estan utilitzant alguns fitxers que cal actualitzar.</String>
157 <String Id="MsiRMFilesInUseTitle" Overridable="yes">{\WixUI_Font_Title}Fitxers en ús</String>
158 <String Id="MsiRMFilesInUseUseRM" Overridable="yes">&amp;Tanca les aplicacions i intenta reiniciar-les.</String>
159 <String Id="MsiRMFilesInUseDontUseRM" Overridable="yes">&amp;No tanquis les aplicacions. Caldrà reiniciar.</String>
160
161 <String Id="OutOfDiskDlg_Title" Overridable="yes">Instal·lació del producte [ProductName]</String>
162 <String Id="OutOfDiskDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
163 <String Id="OutOfDiskDlgText" Overridable="yes">Els volums marcats no tenen prou espai al disc per a les característiques que heu seleccionat. Podeu suprimir alguns fitxers dels volums marcats, instal·lar menys característiques o seleccionar una altra unitat de destinació.</String>
164 <String Id="OutOfDiskDlgDescription" Overridable="yes">L'espai de disc necessari per a la instal·lació supera l'espai disponible al disc.</String>
165 <String Id="OutOfDiskDlgTitle" Overridable="yes">{\WixUI_Font_Title}No hi ha prou espai al disc</String>
166 <String Id="OutOfDiskDlgVolumeList" Overridable="yes">{120}{70}{70}{70}{70}</String>
167
168 <String Id="OutOfRbDiskDlg_Title" Overridable="yes">Instal·lació del producte [ProductName]</String>
169 <String Id="OutOfRbDiskDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
170 <String Id="OutOfRbDiskDlgText" Overridable="yes">Els volums marcats no tenen prou espai al disc per a les característiques que heu seleccionat. Podeu suprimir alguns fitxers dels volums marcats, instal·lar menys característiques o seleccionar una altra unitat de destinació.</String>
171 <String Id="OutOfRbDiskDlgDescription" Overridable="yes">L'espai de disc necessari per a la instal·lació supera l'espai disponible al disc.</String>
172 <String Id="OutOfRbDiskDlgTitle" Overridable="yes">{\WixUI_Font_Title}No hi ha prou espai al disc</String>
173 <String Id="OutOfRbDiskDlgVolumeList" Overridable="yes">{120}{70}{70}{70}{70}</String>
174 <String Id="OutOfRbDiskDlgText2" Overridable="yes">També podeu inhabilitar la funcionalitat de reversió de l'instal·lador. D'aquesta manera, evitareu que l'instal·lador restauri l'estat original de l'ordinador si hi hagués qualsevol tipus d'interrupció durant la instal·lació. Feu clic a Sí si voleu assumir el risc d'inhabilitar la reversió.</String>
175
176 <String Id="PrepareDlg_Title" Overridable="yes">Instal·lació del producte [ProductName]</String>
177 <String Id="PrepareDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
178 <String Id="PrepareDlgDescription" Overridable="yes">Espereu mentre l'auxiliar d'instal·lació es prepara per guiar-vos pel procés d'instal·lació.</String>
179 <String Id="PrepareDlgTitle" Overridable="yes">{\WixUI_Font_Bigger}Benvinguts a l'auxiliar d'instal·lació del producte [ProductName]</String>
180
181 <String Id="ProgressDlg_Title" Overridable="yes">Instal·lació del producte [ProductName]</String>
182 <String Id="ProgressDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
183 <String Id="ProgressDlgTextInstalling" Overridable="yes">Espereu mentre l'auxiliar d'instal·lació instal·la el producte [ProductName].</String>
184 <String Id="ProgressDlgTitleInstalling" Overridable="yes">{\WixUI_Font_Title}S'està instal·lant el producte [ProductName]</String>
185 <String Id="ProgressDlgTextChanging" Overridable="yes">Espereu mentre l'auxiliar d'instal·lació canvia el producte [ProductName].</String>
186 <String Id="ProgressDlgTitleChanging" Overridable="yes">{\WixUI_Font_Title}S'està canviant el producte [ProductName]</String>
187 <String Id="ProgressDlgTextRepairing" Overridable="yes">Espereu mentre l'auxiliar d'instal·lació repara el producte [ProductName].</String>
188 <String Id="ProgressDlgTitleRepairing" Overridable="yes">{\WixUI_Font_Title}S'està reparant el producte [ProductName]</String>
189 <String Id="ProgressDlgTextRemoving" Overridable="yes">Espereu mentre l'auxiliar d'instal·lació suprimeix el producte [ProductName].</String>
190 <String Id="ProgressDlgTitleRemoving" Overridable="yes">{\WixUI_Font_Title}S'està suprimint el producte [ProductName]</String>
191 <String Id="ProgressDlgTextUpdating" Overridable="yes">Espereu mentre l'auxiliar d'instal·lació actualitza el producte [ProductName].</String>
192 <String Id="ProgressDlgTitleUpdating" Overridable="yes">{\WixUI_Font_Title}S'està actualitzant el producte [ProductName]</String>
193 <String Id="ProgressDlgProgressBar" Overridable="yes">Progrés</String>
194 <String Id="ProgressDlgStatusLabel" Overridable="yes">Estat:</String>
195
196 <String Id="ResumeDlg_Title" Overridable="yes">Instal·lació del producte [ProductName]</String>
197 <String Id="ResumeDlgInstall" Overridable="yes">&amp;Instal·la</String>
198 <String Id="ResumeDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
199 <String Id="ResumeDlgDescription" Overridable="yes">L'auxiliar d'instal·lació completarà la instal·lació del producte [ProductName] a l'ordinador. Feu clic a Instal·la per continuar o a Cancel·la per sortir de l'auxiliar d'instal·lació.</String>
200 <String Id="ResumeDlgTitle" Overridable="yes">{\WixUI_Font_Bigger}S'està reprenent l'auxiliar d'instal·lació del producte [ProductName]</String>
201
202 <String Id="SetupTypeDlg_Title" Overridable="yes">Instal·lació del producte [ProductName]</String>
203 <String Id="SetupTypeDlgTypicalButton" Overridable="yes">&amp;Típica</String>
204 <String Id="SetupTypeDlgTypicalButtonTooltip" Overridable="yes">Instal·lació típica</String>
205 <String Id="SetupTypeDlgCustomButton" Overridable="yes">P&amp;ersonalitzada</String>
206 <String Id="SetupTypeDlgCustomButtonTooltip" Overridable="yes">Instal·lació personalitzada</String>
207 <String Id="SetupTypeDlgCompleteButton" Overridable="yes">C&amp;ompleta</String>
208 <String Id="SetupTypeDlgCompleteButtonTooltip" Overridable="yes">Instal·lació completa</String>
209 <String Id="SetupTypeDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
210 <String Id="SetupTypeDlgTitle" Overridable="yes">{\WixUI_Font_Title}Trieu un tipus de configuració</String>
211 <String Id="SetupTypeDlgDescription" Overridable="yes">Trieu el tipus de configuració que més bé s'adapti a les vostres necessitats</String>
212 <String Id="SetupTypeDlgTypicalText" Overridable="yes">Instal·la les característiques del programa més comunes. Recomanat per a la majoria dels usuaris.</String>
213 <String Id="SetupTypeDlgCustomText" Overridable="yes">Permet que els usuaris triïn quines característiques del programa s'instal·laran i on s'instal·laran. Recomanat per a usuaris avançats.</String>
214 <String Id="SetupTypeDlgCompleteText" Overridable="yes">S'instal·laran totes les característiques del programa. Requereix la major part de l'espai al disc.</String>
215
216 <String Id="UserExit_Title" Overridable="yes">Instal·lació del producte [ProductName]</String>
217 <String Id="UserExitBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
218 <String Id="UserExitTitle" Overridable="yes">{\WixUI_Font_Bigger}S'ha interromput l'auxiliar d'instal·lació del producte [ProductName]</String>
219 <String Id="UserExitDescription1" Overridable="yes">S'ha interromput la configuració del producte [ProductName]. No s'ha modificat el sistema. Per instal·lar aquest programa en un altre moment, torneu a executar la instal·lació.</String>
220 <String Id="UserExitDescription2" Overridable="yes">Feu clic al botó Final per sortir de l'auxiliar d'instal·lació.</String>
221
222 <String Id="VerifyReadyDlg_Title" Overridable="yes">Instal·lació del producte [ProductName]</String>
223 <String Id="VerifyReadyDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
224 <String Id="VerifyReadyDlgInstall" Overridable="yes">&amp;Instal·la</String>
225 <String Id="VerifyReadyDlgInstallText" Overridable="yes">Feu clic a Instal·la per començar la instal·lació. Feu clic a Endarrere per revisar o canviar les opcions de configuració de la instal·lació. Feu clic a Cancel·la per sortir de l'auxiliar.</String>
226 <String Id="VerifyReadyDlgInstallTitle" Overridable="yes">{\WixUI_Font_Title}A punt per instal·lar el producte [ProductName]</String>
227 <String Id="VerifyReadyDlgChange" Overridable="yes">&amp;Canvia</String>
228 <String Id="VerifyReadyDlgChangeText" Overridable="yes">Feu clic a Canvia per començar la instal·lació. Feu clic a Endarrere per revisar o canviar les opcions de configuració de la instal·lació. Feu clic a Cancel·la per sortir de l'auxiliar.</String>
229 <String Id="VerifyReadyDlgChangeTitle" Overridable="yes">{\WixUI_Font_Title}A punt per canviar el producte [ProductName]</String>
230 <String Id="VerifyReadyDlgRepair" Overridable="yes">Re&amp;para</String>
231 <String Id="VerifyReadyDlgRepairText" Overridable="yes">Feu clic a Repara per reparar la instal·lació del producte [ProductName]. Feu clic a Endarrere per revisar o canviar les opcions de configuració de la instal·lació. Feu clic a Cancel·la per sortir de l'auxiliar.</String>
232 <String Id="VerifyReadyDlgRepairTitle" Overridable="yes">{\WixUI_Font_Title}A punt per reparar el producte [ProductName]</String>
233 <String Id="VerifyReadyDlgRemove" Overridable="yes">&amp;Suprimeix</String>
234 <String Id="VerifyReadyDlgRemoveText" Overridable="yes">Feu clic a Suprimeix per suprimir el producte [ProductName] de l'ordinador. Feu clic a Endarrere per revisar o canviar les opcions de configuració de la instal·lació. Feu clic a Cancel·la per sortir de l'auxiliar.</String>
235 <String Id="VerifyReadyDlgRemoveTitle" Overridable="yes">{\WixUI_Font_Title}A punt per suprimir el producte [ProductName]</String>
236 <String Id="VerifyReadyDlgUpdate" Overridable="yes">&amp;Actualitza</String>
237 <String Id="VerifyReadyDlgUpdateText" Overridable="yes">Feu clic a Actualitza per actualitzar el producte [ProductName] de l'ordinador. Feu clic a Endarrere per revisar o canviar les opcions de configuració de la instal·lació. Feu clic a Cancel·la per sortir de l'auxiliar.</String>
238 <String Id="VerifyReadyDlgUpdateTitle" Overridable="yes">{\WixUI_Font_Title}A punt per actualitzar el producte [ProductName]</String>
239
240 <String Id="WaitForCostingDlg_Title" Overridable="yes">Instal·lació del producte [ProductName]</String>
241 <String Id="WaitForCostingDlgReturn" Overridable="yes">&amp;Torna</String>
242 <String Id="WaitForCostingDlgText" Overridable="yes">Espereu mentre l'instal·lador determina els requisits d'espai al disc.</String>
243 <String Id="WaitForCostingDlgIcon" Overridable="yes">WixUI_Ico_Exclam</String>
244 <String Id="WaitForCostingDlgIconTooltip" Overridable="yes">Icona d'exclamació</String>
245
246 <String Id="WelcomeDlg_Title" Overridable="yes">Instal·lació del producte [ProductName]</String>
247 <String Id="WelcomeDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
248 <String Id="WelcomeDlgDescription" Overridable="yes">L'auxiliar d'instal·lació instal·larà el producte [ProductName] a l'ordinador. Feu clic a Endavant per continuar o a Cancel·la per sortir de l'auxiliar d'instal·lació.</String>
249 <String Id="WelcomeUpdateDlgDescriptionUpdate" Overridable="yes">L'auxiliar d'instal·lació actualitzarà el producte [ProductName] a l'ordinador. Feu clic a Endavant per continuar o a Cancel·la per sortir de l'auxiliar d'instal·lació.</String>
250 <String Id="WelcomeDlgTitle" Overridable="yes">{\WixUI_Font_Bigger}Benvinguts a l'auxiliar d'instal·lació del producte [ProductName]</String>
251
252 <String Id="WelcomeEulaDlg_Title" Overridable="yes">Instal·lació del producte [ProductName]</String>
253 <String Id="WelcomeEulaDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
254 <String Id="WelcomeEulaDlgLicenseAcceptedCheckBox" Overridable="yes">&amp;Accepto les condicions del contracte de llicència</String>
255 <String Id="WelcomeEulaDlgInstall" Overridable="yes">&amp;Instal·la</String>
256 <String Id="WelcomeEulaDlgUpdate" Overridable="yes">&amp;Actualitza</String>
257 <String Id="WelcomeEulaDlgTitle" Overridable="yes">{\WixUI_Font_Title}Llegiu el contracte de llicència del producte [ProductName]</String>
258
259 <String Id="ProgressTextInstallValidate" Overridable="yes">S'està validant la instal·lació</String>
260 <String Id="ProgressTextInstallFiles" Overridable="yes">S'estan copiant els fitxers nous</String>
261 <String Id="ProgressTextInstallFilesTemplate" Overridable="yes">Fitxer: [1], directori: [9], mida: [6]</String>
262 <String Id="ProgressTextInstallAdminPackage" Overridable="yes">S'estan copiant els fitxers d'instal·lació de xarxa</String>
263 <String Id="ProgressTextInstallAdminPackageTemplate" Overridable="yes">Fitxer: [1], directori: [9], mida: [6]</String>
264 <String Id="ProgressTextFileCost" Overridable="yes">S'estan calculant els requisits d'espai</String>
265 <String Id="ProgressTextCostInitialize" Overridable="yes">S'estan calculant els requisits d'espai</String>
266 <String Id="ProgressTextCostFinalize" Overridable="yes">S'estan calculant els requisits d'espai</String>
267 <String Id="ProgressTextCreateShortcuts" Overridable="yes">S'estan creant les dreceres</String>
268 <String Id="ProgressTextCreateShortcutsTemplate" Overridable="yes">Drecera: [1]</String>
269 <String Id="ProgressTextPublishComponents" Overridable="yes">S'estan publicant els components qualificats</String>
270 <String Id="ProgressTextPublishComponentsTemplate" Overridable="yes">ID de component: [1], qualificador: [2]</String>
271 <String Id="ProgressTextPublishFeatures" Overridable="yes">S'estan publicant les característiques del producte</String>
272 <String Id="ProgressTextPublishFeaturesTemplate" Overridable="yes">Característica: [1]</String>
273 <String Id="ProgressTextPublishProduct" Overridable="yes">S'està publicant la informació del producte</String>
274 <String Id="ProgressTextRegisterClassInfo" Overridable="yes">S'estan registrant els servidors de classes</String>
275 <String Id="ProgressTextRegisterClassInfoTemplate" Overridable="yes">ID de classe: [1]</String>
276 <String Id="ProgressTextRegisterExtensionInfo" Overridable="yes">S'estan registrant els servidors d'extensions</String>
277 <String Id="ProgressTextRegisterExtensionInfoTemplate" Overridable="yes">Extensió: [1]</String>
278 <String Id="ProgressTextRegisterMIMEInfo" Overridable="yes">S'està registrant la informació MIME</String>
279 <String Id="ProgressTextRegisterMIMEInfoTemplate" Overridable="yes">Tipus de contingut MIME: [1], extensió: [2]</String>
280 <String Id="ProgressTextRegisterProgIdInfo" Overridable="yes">S'estan registrant els identificadors de programa</String>
281 <String Id="ProgressTextRegisterProgIdInfoTemplate" Overridable="yes">Identificador del programa: [1]</String>
282 <String Id="ProgressTextAllocateRegistrySpace" Overridable="yes">S'està assignant l'espai del registre</String>
283 <String Id="ProgressTextAllocateRegistrySpaceTemplate" Overridable="yes">Espai lliure: [1]</String>
284 <String Id="ProgressTextAppSearch" Overridable="yes">S'estan cercant les aplicacions instal·lades</String>
285 <String Id="ProgressTextAppSearchTemplate" Overridable="yes">Propietat: [1], signatura: [2]</String>
286 <String Id="ProgressTextBindImage" Overridable="yes">S'estan vinculant els executables</String>
287 <String Id="ProgressTextBindImageTemplate" Overridable="yes">Fitxer: [1]</String>
288 <String Id="ProgressTextCCPSearch" Overridable="yes">S'estan cercant els productes necessaris</String>
289 <String Id="ProgressTextCreateFolders" Overridable="yes">S'estan creant les carpetes</String>
290 <String Id="ProgressTextCreateFoldersTemplate" Overridable="yes">Carpeta: [1]</String>
291 <String Id="ProgressTextDeleteServices" Overridable="yes">S'estan suprimint els serveis</String>
292 <String Id="ProgressTextDeleteServicesTemplate" Overridable="yes">Servei: [1]</String>
293 <String Id="ProgressTextDuplicateFiles" Overridable="yes">S'estan creant fitxers duplicats</String>
294 <String Id="ProgressTextDuplicateFilesTemplate" Overridable="yes">Fitxer: [1], directori: [9], mida: [6]</String>
295 <String Id="ProgressTextFindRelatedProducts" Overridable="yes">S'estan cercant les aplicacions relacionades</String>
296 <String Id="ProgressTextFindRelatedProductsTemplate" Overridable="yes">S'ha trobat una aplicació: [1]</String>
297 <String Id="ProgressTextInstallODBC" Overridable="yes">S'estan instal·lant els components ODBC</String>
298 <String Id="ProgressTextInstallServices" Overridable="yes">S'estan instal·lant els serveis nous</String>
299 <String Id="ProgressTextInstallServicesTemplate" Overridable="yes">Servei: [2]</String>
300 <String Id="ProgressTextLaunchConditions" Overridable="yes">S'estan avaluant les condicions d'inici</String>
301 <String Id="ProgressTextMigrateFeatureStates" Overridable="yes">S'estan migrant els estats de les característiques des d'aplicacions relacionades</String>
302 <String Id="ProgressTextMigrateFeatureStatesTemplate" Overridable="yes">Aplicació: [1]</String>
303 <String Id="ProgressTextMoveFiles" Overridable="yes">S'estan desplaçant els fitxers</String>
304 <String Id="ProgressTextMoveFilesTemplate" Overridable="yes">Fitxer: [1], directori: [9], mida: [6]</String>
305 <String Id="ProgressTextPatchFiles" Overridable="yes">S'estan aplicant revisions als fitxers</String>
306 <String Id="ProgressTextPatchFilesTemplate" Overridable="yes">Fitxer: [1], directori: [2], mida: [3]</String>
307 <String Id="ProgressTextProcessComponents" Overridable="yes">S'està actualitzant el registre de components</String>
308 <String Id="ProgressTextRegisterComPlus" Overridable="yes">S'estan registrant les aplicacions i els components COM+</String>
309 <String Id="ProgressTextRegisterComPlusTemplate" Overridable="yes">ID aplicació: [1]{{, tipus d'aplicació: [2], usuaris: [3], RSN: [4]}}</String>
310 <String Id="ProgressTextRegisterFonts" Overridable="yes">S'estan registrant els tipus de lletra</String>
311 <String Id="ProgressTextRegisterFontsTemplate" Overridable="yes">Tipus de lletra: [1]</String>
312 <String Id="ProgressTextRegisterProduct" Overridable="yes">S'està registrant el producte</String>
313 <String Id="ProgressTextRegisterProductTemplate" Overridable="yes">[1]</String>
314 <String Id="ProgressTextRegisterTypeLibraries" Overridable="yes">S'estan registrant les biblioteques de tipus</String>
315 <String Id="ProgressTextRegisterTypeLibrariesTemplate" Overridable="yes">Identificador de la biblioteca: [1]</String>
316 <String Id="ProgressTextRegisterUser" Overridable="yes">S'està registrant l'usuari</String>
317 <String Id="ProgressTextRegisterUserTemplate" Overridable="yes">[1]</String>
318 <String Id="ProgressTextRemoveDuplicateFiles" Overridable="yes">S'estan suprimint els fitxers duplicats</String>
319 <String Id="ProgressTextRemoveDuplicateFilesTemplate" Overridable="yes">Fitxer: [1], directori: [9]</String>
320 <String Id="ProgressTextRemoveEnvironmentStrings" Overridable="yes">S'estan actualitzant les cadenes de l'entorn</String>
321 <String Id="ProgressTextRemoveEnvironmentStringsTemplate" Overridable="yes">Nom: [1], valor: [2], acció: [3]</String>
322 <String Id="ProgressTextRemoveExistingProducts" Overridable="yes">S'estan suprimint les aplicacions</String>
323 <String Id="ProgressTextRemoveExistingProductsTemplate" Overridable="yes">Aplicació: [1], línia d'ordres: [2]</String>
324 <String Id="ProgressTextRemoveFiles" Overridable="yes">S'estan suprimint els fitxers</String>
325 <String Id="ProgressTextRemoveFilesTemplate" Overridable="yes">Fitxer: [1], directori: [9]</String>
326 <String Id="ProgressTextRemoveFolders" Overridable="yes">S'estan suprimint les carpetes</String>
327 <String Id="ProgressTextRemoveFoldersTemplate" Overridable="yes">Carpeta: [1]</String>
328 <String Id="ProgressTextRemoveIniValues" Overridable="yes">S'estan suprimint les entrades dels fitxers INI</String>
329 <String Id="ProgressTextRemoveIniValuesTemplate" Overridable="yes">Fitxer: [1], secció: [2], clau: [3], valor: [4]</String>
330 <String Id="ProgressTextRemoveODBC" Overridable="yes">S'estan suprimint els components ODBC</String>
331 <String Id="ProgressTextRemoveRegistryValues" Overridable="yes">S'estan suprimint els valors de registre del sistema</String>
332 <String Id="ProgressTextRemoveRegistryValuesTemplate" Overridable="yes">Clau: [1], nom: [2]</String>
333 <String Id="ProgressTextRemoveShortcuts" Overridable="yes">S'estan suprimint les dreceres</String>
334 <String Id="ProgressTextRemoveShortcutsTemplate" Overridable="yes">Drecera: [1]</String>
335 <String Id="ProgressTextRMCCPSearch" Overridable="yes">S'estan cercant els productes necessaris</String>
336 <String Id="ProgressTextSelfRegModules" Overridable="yes">S'estan registrant els mòduls</String>
337 <String Id="ProgressTextSelfRegModulesTemplate" Overridable="yes">Fitxer: [1], carpeta: [2]</String>
338 <String Id="ProgressTextSelfUnregModules" Overridable="yes">S'estan suprimint els mòduls del registre</String>
339 <String Id="ProgressTextSelfUnregModulesTemplate" Overridable="yes">Fitxer: [1], carpeta: [2]</String>
340 <String Id="ProgressTextSetODBCFolders" Overridable="yes">S'estan inicialitzant els directoris d'ODBC</String>
341 <String Id="ProgressTextStartServices" Overridable="yes">S'estan iniciant els serveis</String>
342 <String Id="ProgressTextStartServicesTemplate" Overridable="yes">Servei: [1]</String>
343 <String Id="ProgressTextStopServices" Overridable="yes">S'estan aturant els serveis</String>
344 <String Id="ProgressTextStopServicesTemplate" Overridable="yes">Servei: [1]</String>
345 <String Id="ProgressTextUnpublishComponents" Overridable="yes">S'està suprimint la publicació dels components qualificats</String>
346 <String Id="ProgressTextUnpublishComponentsTemplate" Overridable="yes">ID de component: [1], qualificador: [2]</String>
347 <String Id="ProgressTextUnpublishFeatures" Overridable="yes">S'està suprimint la publicació de les característiques del producte</String>
348 <String Id="ProgressTextUnpublishFeaturesTemplate" Overridable="yes">Característica: [1]</String>
349 <String Id="ProgressTextUnregisterClassInfo" Overridable="yes">Suprimeix del registre els servidors de classes</String>
350 <String Id="ProgressTextUnregisterClassInfoTemplate" Overridable="yes">ID de classe: [1]</String>
351 <String Id="ProgressTextUnregisterComPlus" Overridable="yes">S'estan suprimint del registre les aplicacions i els components COM+</String>
352 <String Id="ProgressTextUnregisterComPlusTemplate" Overridable="yes">Identificador de l'aplicació: [1]{{, tipus d'aplicació: [2]}}</String>
353 <String Id="ProgressTextUnregisterExtensionInfo" Overridable="yes">S'estan suprimint del registre els servidors d'extensions</String>
354 <String Id="ProgressTextUnregisterExtensionInfoTemplate" Overridable="yes">Extensió: [1]</String>
355 <String Id="ProgressTextUnregisterFonts" Overridable="yes">S'estan suprimint del registre els tipus de lletra</String>
356 <String Id="ProgressTextUnregisterFontsTemplate" Overridable="yes">Tipus de lletra: [1]</String>
357 <String Id="ProgressTextUnregisterMIMEInfo" Overridable="yes">S'està suprimint del registre la informació MIME</String>
358 <String Id="ProgressTextUnregisterMIMEInfoTemplate" Overridable="yes">Tipus de contingut MIME: [1], extensió: [2]</String>
359 <String Id="ProgressTextUnregisterProgIdInfo" Overridable="yes">S'estan suprimint del registre els identificadors de programa</String>
360 <String Id="ProgressTextUnregisterProgIdInfoTemplate" Overridable="yes">Identificador del programa: [1]</String>
361 <String Id="ProgressTextUnregisterTypeLibraries" Overridable="yes">S'estan suprimint del registre les biblioteques de classes</String>
362 <String Id="ProgressTextUnregisterTypeLibrariesTemplate" Overridable="yes">Identificador de la biblioteca: [1]</String>
363 <String Id="ProgressTextWriteEnvironmentStrings" Overridable="yes">S'estan actualitzant les cadenes de l'entorn</String>
364 <String Id="ProgressTextWriteEnvironmentStringsTemplate" Overridable="yes">Nom: [1], valor: [2], acció: [3]</String>
365 <String Id="ProgressTextWriteIniValues" Overridable="yes">S'estan escrivint els valors dels fitxers INI</String>
366 <String Id="ProgressTextWriteIniValuesTemplate" Overridable="yes">Fitxer: [1], secció: [2], clau: [3], valor: [4]</String>
367 <String Id="ProgressTextWriteRegistryValues" Overridable="yes">S'estan escrivint els valors del registre del sistema</String>
368 <String Id="ProgressTextWriteRegistryValuesTemplate" Overridable="yes">Clau: [1], nom: [2], valor: [3]</String>
369 <String Id="ProgressTextAdvertise" Overridable="yes">S'està anunciant l'aplicació</String>
370 <String Id="ProgressTextGenerateScript" Overridable="yes">S'estan generant les operacions de seqüència per a l'acció:</String>
371 <String Id="ProgressTextGenerateScriptTemplate" Overridable="yes">[1]</String>
372 <String Id="ProgressTextInstallSFPCatalogFile" Overridable="yes">S'està instal·lant el catàleg del sistema</String>
373 <String Id="ProgressTextInstallSFPCatalogFileTemplate" Overridable="yes">Fitxer: [1], dependències: [2]</String>
374 <String Id="ProgressTextMsiPublishAssemblies" Overridable="yes">S'està publicant la informació de l'assemblat</String>
375 <String Id="ProgressTextMsiPublishAssembliesTemplate" Overridable="yes">Context d'aplicació: [1], nom de l'assemblat: [2]</String>
376 <String Id="ProgressTextMsiUnpublishAssemblies" Overridable="yes">S'està suprimint la publicació de la informació de l'assemblat</String>
377 <String Id="ProgressTextMsiUnpublishAssembliesTemplate" Overridable="yes">Context d'aplicació: [1], nom de l'assemblat: [2]</String>
378 <String Id="ProgressTextRollback" Overridable="yes">S'està recuperant l'acció:</String>
379 <String Id="ProgressTextRollbackTemplate" Overridable="yes">[1]</String>
380 <String Id="ProgressTextRollbackCleanup" Overridable="yes">S'estan suprimint els fitxers de còpia de seguretat</String>
381 <String Id="ProgressTextRollbackCleanupTemplate" Overridable="yes">Fitxer: [1]</String>
382 <String Id="ProgressTextUnmoveFiles" Overridable="yes">S'estan suprimint els fitxers desplaçats</String>
383 <String Id="ProgressTextUnmoveFilesTemplate" Overridable="yes">Fitxer: [1], directori: [9]</String>
384 <String Id="ProgressTextUnpublishProduct" Overridable="yes">S'està suprimint la publicació de la informació del producte</String>
385
386 <String Id="Error0" Overridable="yes">{{Error greu: }}</String>
387 <String Id="Error1" Overridable="yes">{{Error [1]. }}</String>
388 <String Id="Error2" Overridable="yes">Advertiment [1]. </String>
389 <String Id="Error4" Overridable="yes">Informació [1]. </String>
390 <String Id="Error5" Overridable="yes">L'instal·lador ha detectat un error inesperat en instal·lar el paquet. Pot indicar un problema amb el paquet. El codi de l'error és: [1]. {{Els arguments són: [2], [3], [4]}}</String>
391 <String Id="Error7" Overridable="yes">{{Disc ple: }}</String>
392 <String Id="Error8" Overridable="yes">Acció [Time]: [1]. [2]</String>
393 <String Id="Error9" Overridable="yes">[ProductName]</String>
394 <String Id="Error10" Overridable="yes">{[2]}{, [3]}{, [4]}</String>
395 <String Id="Error11" Overridable="yes">Tipus de missatge: [1], argument: [2]</String>
396 <String Id="Error12" Overridable="yes">=== El registre ha començat: [Date] [Time] ===</String>
397 <String Id="Error13" Overridable="yes">=== El registre s'ha aturat: [Date] [Time] ===</String>
398 <String Id="Error14" Overridable="yes">L'acció ha començat a les [Time]: [1].</String>
399 <String Id="Error15" Overridable="yes">L'acció ha finalitzat a les [Time]: [1]. Valor retornat: [2].</String>
400 <String Id="Error16" Overridable="yes">Temps restant: {[1] minuts }{[2] segons}</String>
401 <String Id="Error17" Overridable="yes">No hi ha prou memòria. Tanqueu altres aplicacions i torneu-ho a provar.</String>
402 <String Id="Error18" Overridable="yes">L'instal·lador ja no respon.</String>
403 <String Id="Error19" Overridable="yes">L'instal·lador s'ha aturat abans d'hora.</String>
404 <String Id="Error20" Overridable="yes">Espereu mentre el Windows configura el producte [ProductName]</String>
405 <String Id="Error21" Overridable="yes">S'està recopilant la informació necessària...</String>
406 <String Id="Error22" Overridable="yes">S'estan suprimint les versions anteriors d'aquesta aplicació...</String>
407 <String Id="Error23" Overridable="yes">S'està preparant la supressió de les versions anteriors de l'aplicació...</String>
408 <String Id="Error32" Overridable="yes">La instal·lació del producte {[ProductName] }s'ha completat correctament.</String>
409 <String Id="Error33" Overridable="yes">S'ha produït un error a la instal·lació del producte {[ProductName]}.</String>
410 <String Id="Error1101" Overridable="yes">S'ha produït un error en llegir el fitxer: [2]. {{ Error del sistema [3].}} Comproveu que existeix i que hi podeu accedir.</String>
411 <String Id="Error1301" Overridable="yes">No es pot crear el fitxer "[2]". Hi ha un directori que té el mateix nom. Cancel·leu la instal·lació i torneu-ho a provar en una altra ubicació.</String>
412 <String Id="Error1302" Overridable="yes">Inseriu el disc: [2]</String>
413 <String Id="Error1303" Overridable="yes">L'instal·lador no té prou privilegis per accedir a aquest directori: [2]. La instal·lació no pot continuar. Inicieu sessió com a administrador o poseu-vos en contacte amb l'administrador del sistema.</String>
414 <String Id="Error1304" Overridable="yes">S'ha produït un error en escriure al fitxer: [2]. Comproveu que teniu accés a aquest directori.</String>
415 <String Id="Error1305" Overridable="yes">S'ha produït un error en llegir el fitxer [2]. {{ Error del sistema [3].}} Comproveu que el fitxer existeix i que hi podeu accedir.</String>
416 <String Id="Error1306" Overridable="yes">Hi ha una altra aplicació que té accés exclusiu al fitxer "[2]". Tanqueu totes les altres aplicacions i feu clic a Torna-ho a provar.</String>
417 <String Id="Error1307" Overridable="yes">No hi ha prou espai al disc per instal·lar el fitxer: [2]. Allibereu espai al disc i feu clic a Torna-ho a provar, o bé feu clic a Cancel·la per sortir.</String>
418 <String Id="Error1308" Overridable="yes">No s'ha trobat el fitxer d'origen: [2]. Comproveu que el fitxer existeix i que hi podeu accedir.</String>
419 <String Id="Error1309" Overridable="yes">S'ha produït un error en llegir el fitxer: [3]. {{ Error del sistema [2].}} Comproveu que el fitxer existeix i que hi podeu accedir.</String>
420 <String Id="Error1310" Overridable="yes">S'ha produït un error en escriure al fitxer: [3]. {{ Error del sistema [2].}} Comproveu que teniu accés al directori.</String>
421 <String Id="Error1311" Overridable="yes">No s'ha trobat el fitxer d'origen{{(cabinet)}}: [2]. Comproveu que el fitxer existeix i que hi podeu accedir.</String>
422 <String Id="Error1312" Overridable="yes">No es pot crear el directori "[2]". Hi ha un fitxer que té el mateix nom. Canvieu el nom del fitxer o suprimiu-lo i feu clic a Torna-ho a provar, o bé feu clic a Cancel·la per sortir.</String>
423 <String Id="Error1313" Overridable="yes">El volum [2] no està disponible en aquest moment. Seleccioneu-ne un altre.</String>
424 <String Id="Error1314" Overridable="yes">El camí especificat, "[2]", no està disponible.</String>
425 <String Id="Error1315" Overridable="yes">No es pot escriure a la carpeta especificada: [2].</String>
426 <String Id="Error1316" Overridable="yes">S'ha produït un error de xarxa en intentar llegir el fitxer: [2]</String>
427 <String Id="Error1317" Overridable="yes">S'ha produït un error en intentar crear el directori: [2]</String>
428 <String Id="Error1318" Overridable="yes">S'ha produït un error de xarxa en intentar crear el directori: [2]</String>
429 <String Id="Error1319" Overridable="yes">S'ha produït un error de xarxa en intentar obrir el CAB del fitxer d'origen: [2]</String>
430 <String Id="Error1320" Overridable="yes">El camí especificat és massa llarg: [2]</String>
431 <String Id="Error1321" Overridable="yes">L'instal·lador no té prou privilegis per modificar aquest fitxer: [2].</String>
432 <String Id="Error1322" Overridable="yes">Part del camí de la carpeta "[2]" no és vàlid. El valor és buit o supera la longitud permesa pel sistema.</String>
433 <String Id="Error1323" Overridable="yes">El camí de la carpeta "[2]" conté paraules no vàlides en camins de carpetes.</String>
434 <String Id="Error1324" Overridable="yes">El camí de la carpeta "[2]" conté un caràcter no vàlid.</String>
435 <String Id="Error1325" Overridable="yes">"[2]" no és un nom de fitxer curt vàlid.</String>
436 <String Id="Error1326" Overridable="yes">S'ha produït un error en obtenir la seguretat del fitxer: [3] GetLastError: [2]</String>
437 <String Id="Error1327" Overridable="yes">Unitat no vàlida: [2]</String>
438 <String Id="Error1328" Overridable="yes">S'ha produït un error en aplicar el pedaç al fitxer [2]. Pot ser que s'hagi actualitzat d'una altra manera i ja no es pot modificar amb aquest pedaç. Per obtenir més informació, poseu-vos en contacte amb el proveïdor del pedaç. {{Error del sistema: [3]}}</String>
439 <String Id="Error1329" Overridable="yes">No es pot instal·lar un fitxer necessari perquè el fitxer cabinet [2] no està signat electrònicament. Això pot indicar que el fitxer cabinet està malmès.</String>
440 <String Id="Error1330" Overridable="yes">No es pot instal·lar un fitxer necessari perquè el fitxer cabinet [2] té una signatura electrònica no vàlida. Això pot indicar que el fitxer cabinet està malmès.{{ WinVerifyTrust ha retornat l'error [3].}}</String>
441 <String Id="Error1331" Overridable="yes">No s'ha pogut copiar correctament el fitxer [2]: error de CRC.</String>
442 <String Id="Error1332" Overridable="yes">No s'ha pogut desplaçar correctament el fitxer [2]: error de CRC.</String>
443 <String Id="Error1333" Overridable="yes">No s'ha pogut aplicar el pedaç correctament al fitxer [2]: error de CRC.</String>
444 <String Id="Error1334" Overridable="yes">El fitxer "[2]" no es pot instal·lar perquè no es troba al fitxer CAB "[3]". Això podria indicar un error de xarxa, un error en llegir del CD-ROM, o bé un problema amb el paquet.</String>
445 <String Id="Error1335" Overridable="yes">El fitxer CAB "[2]" necessari per a aquesta instal·lació està malmès i no es pot utilitzar. Això podria indicar un error de xarxa, un error en llegir del CD-ROM, o bé un problema amb el paquet.</String>
446 <String Id="Error1336" Overridable="yes">S'ha produït un error en crear un fitxer temporal necessari per completar la instal·lació. {{ Carpeta: [3]. Codi d'error del sistema: [2]}}</String>
447 <String Id="Error1401" Overridable="yes">No s'ha pogut crear la clau: [2]. {{ Error del sistema [3].}} Comproveu que teniu l'accés necessari a la clau o poseu-vos en contacte amb el personal de suport tècnic. </String>
448 <String Id="Error1402" Overridable="yes">No s'ha pogut obrir la clau: [2]. {{ Error del sistema [3].}} Comproveu que teniu l'accés necessari a la clau o poseu-vos en contacte amb el personal de suport tècnic. </String>
449 <String Id="Error1403" Overridable="yes">No s'ha pogut suprimir el valor [2] de la clau [3]. {{ Error del sistema [4].}} Comproveu que teniu l'accés necessari a la clau o poseu-vos en contacte amb el personal de suport tècnic. </String>
450 <String Id="Error1404" Overridable="yes">No s'ha pogut suprimir la clau [2]. {{ Error del sistema [3].}} Comproveu que teniu l'accés necessari a la clau o poseu-vos en contacte amb el personal de suport tècnic. </String>
451 <String Id="Error1405" Overridable="yes">No s'ha pogut llegir el valor [2] de la clau [3]. {{ Error del sistema [4].}} Comproveu que teniu l'accés necessari a la clau o poseu-vos en contacte amb el personal de suport tècnic. </String>
452 <String Id="Error1406" Overridable="yes">No s'ha pogut escriure el valor [2] a la clau [3]. {{ Error del sistema [4].}} Comproveu que teniu l'accés necessari a la clau o poseu-vos en contacte amb el personal de suport tècnic.</String>
453 <String Id="Error1407" Overridable="yes">No s'han pogut obtenir els noms dels valors de la clau [2]. {{ Error del sistema [3].}} Comproveu que teniu l'accés necessari a la clau o poseu-vos en contacte amb el personal de suport tècnic.</String>
454 <String Id="Error1408" Overridable="yes">No s'han pogut obtenir els noms de les subclaus de la clau [2]. {{ Error del sistema [3].}} Comproveu que teniu l'accés necessari a la clau o poseu-vos en contacte amb el personal de suport tècnic.</String>
455 <String Id="Error1409" Overridable="yes">No s'ha pogut llegir la informació de seguretat de la clau [2]. {{ Error del sistema [3].}} Comproveu que teniu l'accés necessari a la clau o poseu-vos en contacte amb el personal de suport tècnic.</String>
456 <String Id="Error1410" Overridable="yes">No s'ha pogut augmentar l'espai disponible al registre. Cal tenir [2] kB d'espai lliure al registre per instal·lar aquesta aplicació.</String>
457 <String Id="Error1500" Overridable="yes">Hi ha una altra instal·lació en curs. Completeu l'altra instal·lació abans de continuar amb aquesta.</String>
458 <String Id="Error1501" Overridable="yes">S'ha produït un error en accedir a dades protegides. Assegureu-vos que el Windows Installer està configurat correctament i torneu a intentar portar a terme la instal·lació.</String>
459 <String Id="Error1502" Overridable="yes">L'usuari "[2]" ja ha iniciat prèviament una instal·lació del producte "[3]", però haurà de tornar a executar-la per poder utilitzar el producte. La instal·lació actual d'aquest producte continuarà.</String>
460 <String Id="Error1503" Overridable="yes">L'usuari "[2]" ja ha iniciat prèviament una instal·lació del producte "[3]", però haurà de tornar a executar-la per poder utilitzar el producte.</String>
461 <String Id="Error1601" Overridable="yes">No hi ha prou espai al disc -- Volum: "[2]"; espai necessari: [3] kB; espai disponible: [4] KB. Augmenteu l'espai disponible del disc i torneu a provar-ho.</String>
462 <String Id="Error1602" Overridable="yes">Esteu segur que voleu cancel·lar-ho?</String>
463 <String Id="Error1603" Overridable="yes">El fitxer [2][3] està en ús{ pel procés següent: nom: [4], identificador: [5], títol de la finestra: "[6]"}. Tanqueu aquesta aplicació i torneu a provar-ho.</String>
464 <String Id="Error1604" Overridable="yes">El producte "[2]" ja està instal·lat, la qual cosa impedeix instal·lar aquest producte. Aquests dos productes són incompatibles.</String>
465 <String Id="Error1605" Overridable="yes">No hi ha prou espai de disc disponible al volum "[2]" per continuar la instal·lació amb la recuperació habilitada. Cal tenir [3] kB disponibles, però només hi ha [4] kB. Feu clic a Ignora per continuar la instal·lació sense desar la informació de recuperació, feu clic a Torna-ho a provar per tornar a comprovar l'espai disponible o feu clic a Cancel·la per sortir de la instal·lació.</String>
466 <String Id="Error1606" Overridable="yes">No s'ha pogut accedir a la ubicació de xarxa [2].</String>
467 <String Id="Error1607" Overridable="yes">Tanqueu les aplicacions següents abans de continuar la instal·lació:</String>
468 <String Id="Error1608" Overridable="yes">No s'ha trobat cap producte compatible instal·lat anteriorment a l'ordinador per instal·lar aquest producte.</String>
469 <String Id="Error1609" Overridable="yes">S'ha produït un error en aplicar la configuració de seguretat. [2] no és un usuari o grup vàlid. Podria tractar-se d'un problema del paquet o d'un problema de connexió a un controlador de domini a la xarxa. Comproveu la connexió de xarxa i feu clic a Torna-ho a provar o feu clic a Cancel·la per finalitzar la instal·lació. {{No es troba l'SID de l'usuari, error del sistema [3]}}</String>
470 <String Id="Error1701" Overridable="yes">La clau [2] no és vàlida. Comproveu que heu introduït la clau correcta.</String>
471 <String Id="Error1702" Overridable="yes">Cal que l'instal·lador reiniciï el sistema perquè pugui continuar la instal·lació del producte [2]. Feu clic a Sí per reiniciar-lo ara o a No si teniu previst reiniciar-lo manualment més tard.</String>
472 <String Id="Error1703" Overridable="yes">Heu de reiniciar el sistema perquè els canvis de configuració realitzats al [2] tinguin efecte. Feu clic a Sí per reiniciar-lo ara o a No si teniu previst reiniciar-lo manualment més tard.</String>
473 <String Id="Error1704" Overridable="yes">S'ha suspès la instal·lació del producte [2]. Heu de desfer els canvis que hagi fet la instal·lació per poder continuar. Voleu desfer-los?</String>
474 <String Id="Error1705" Overridable="yes">Ja hi ha una instal·lació anterior d'aquest producte en curs. Heu de desfer els canvis que hagi fet la instal·lació per poder continuar. Voleu desfer-los?</String>
475 <String Id="Error1706" Overridable="yes">No es troba un paquet d'instal·lació per al producte [2]. Torneu a intentar la instal·lació amb una còpia vàlida del paquet d'instal·lació "[3]".</String>
476 <String Id="Error1707" Overridable="yes">La instal·lació s'ha completat correctament.</String>
477 <String Id="Error1708" Overridable="yes">S'ha produït un error a la instal·lació.</String>
478 <String Id="Error1709" Overridable="yes">Producte: [2] -- [3]</String>
479 <String Id="Error1710" Overridable="yes">Podeu restaurar l'ordinador a l'estat anterior o continuar amb la instal·lació més tard. Voleu restaurar-lo?</String>
480 <String Id="Error1711" Overridable="yes">S'ha produït un error en escriure la informació d'instal·lació al disc. Assegureu-vos que hi hagi prou espai al disc i feu clic a Torna-ho a provar, o feu clic a Cancel·la per finalitzar la instal·lació.</String>
481 <String Id="Error1712" Overridable="yes">No s'han trobat un o més dels fitxers necessaris per restaurar l'ordinador al seu estat anterior. No es podrà dur a terme la restauració.</String>
482 <String Id="Error1713" Overridable="yes">El producte [2] no pot instal·lar un dels seus productes relacionats. Poseu-vos en contacte amb el grup de suport tècnic. {{Error del sistema: [3].}}</String>
483 <String Id="Error1714" Overridable="yes">No es pot suprimir la versió anterior del producte [2]. Poseu-vos en contacte amb el grup de suport tècnic. {{Error del sistema: [3].}}</String>
484 <String Id="Error1715" Overridable="yes">S'ha instal·lat el [2]</String>
485 <String Id="Error1716" Overridable="yes">S'ha configurat el [2]</String>
486 <String Id="Error1717" Overridable="yes">S'ha suprimit el [2]</String>
487 <String Id="Error1718" Overridable="yes">La norma de signatura digital ha rebutjat el fitxer [2].</String>
488 <String Id="Error1719" Overridable="yes">No s'ha pogut accedir al servei del Windows Installer. Això pot succeir si executeu el Windows en mode de protecció o si el Windows Installer no està instal·lat correctament. Poseu-vos en contacte amb el personal de suport tècnic per obtenir ajuda.</String>
489 <String Id="Error1720" Overridable="yes">Hi ha un problema amb aquest paquet del Windows Installer. No s'ha pogut executar una seqüència necessària perquè pugui completar-se aquesta instal·lació. Poseu-vos en contacte amb el personal de suport tècnic o amb el proveïdor del paquet. {{Acció personalitzada [2], error de la seqüència [3], [4]: [5] línia [6], columna [7], [8] }}</String>
490 <String Id="Error1721" Overridable="yes">Hi ha un problema amb aquest paquet del Windows Installer. No s'ha pogut executar un programa necessari perquè es completi la instal·lació. Poseu-vos en contacte amb el personal de suport tècnic o amb el proveïdor del paquet. {{Acció: [2], ubicació: [3], ordre: [4] }}</String>
491 <String Id="Error1722" Overridable="yes">Hi ha un problema amb aquest paquet del Windows Installer. Un programa que s'ha executat com a part de la instal·lació no ha finalitzat com s'esperava. Poseu-vos en contacte amb el personal de suport tècnic o amb el proveïdor del paquet. {{Acció [2], ubicació: [3], ordre: [4] }}</String>
492 <String Id="Error1723" Overridable="yes">Hi ha un problema amb aquest paquet del Windows Installer. No s'ha pogut executar una DLL necessària perquè pugui completar-se aquesta instal·lació. Poseu-vos en contacte amb el personal de suport tècnic o amb el proveïdor del paquet. {{Acció: [2], entrada: [3], biblioteca: [4] }}</String>
493 <String Id="Error1724" Overridable="yes">S'ha suprimit correctament.</String>
494 <String Id="Error1725" Overridable="yes">S'ha produït un error a la supressió.</String>
495 <String Id="Error1726" Overridable="yes">L'anunci s'ha completat correctament.</String>
496 <String Id="Error1727" Overridable="yes">S'ha produït un error a l'anunci.</String>
497 <String Id="Error1728" Overridable="yes">La configuració s'ha completat correctament.</String>
498 <String Id="Error1729" Overridable="yes">S'ha produït un error a la configuració.</String>
499 <String Id="Error1730" Overridable="yes">Heu de ser administrador per suprimir aquesta aplicació. Per suprimir-la, podeu iniciar una sessió com a administrador o posar-vos en contacte amb el grup de suport tècnic per obtenir ajuda.</String>
500 <String Id="Error1731" Overridable="yes">El paquet d'instal·lació d'origen del producte [2] no està sincronitzat amb el paquet del client. Torneu a intentar la instal·lació amb una còpia vàlida del paquet d'instal·lació "[3]".</String>
501 <String Id="Error1732" Overridable="yes">Per poder completar la instal·lació del producte [2], cal que reinicieu l'ordinador. Hi ha altres usuaris amb una sessió iniciada en aquest ordinador i, si el reinicieu, pot ser que perdin la feina. Voleu reiniciar-lo ara?</String>
502 <String Id="Error1801" Overridable="yes">El camí [2] no és vàlid. Especifiqueu-ne un de vàlid.</String>
503 <String Id="Error1802" Overridable="yes">No hi ha prou memòria. Tanqueu altres aplicacions i torneu-ho a provar.</String>
504 <String Id="Error1803" Overridable="yes">No hi ha cap disc a la unitat [2]. Introduïu-ne un i feu clic a Torna-ho a provar o feu clic a Cancel·la per tornar al volum seleccionat anteriorment.</String>
505 <String Id="Error1804" Overridable="yes">No hi ha cap disc a la unitat [2]. Introduïu-ne un i feu clic a Torna-ho a provar o feu clic a Cancel·la per tornar al quadre de diàleg de navegació i seleccionar un volum diferent.</String>
506 <String Id="Error1805" Overridable="yes">La carpeta [2] no existeix. Especifiqueu un camí a una carpeta existent.</String>
507 <String Id="Error1806" Overridable="yes">No teniu prou privilegis per llegir aquesta carpeta.</String>
508 <String Id="Error1807" Overridable="yes">No s'ha pogut determinar una carpeta de destinació vàlida per a la instal·lació.</String>
509 <String Id="Error1901" Overridable="yes">S'ha produït un error en provar de llegir de la base de dades d'instal·lació d'origen: [2].</String>
510 <String Id="Error1902" Overridable="yes">S'està programant l'operació de reinici: s'està canviant el nom del fitxer [2] a [3]. Cal reiniciar per completar l'operació.</String>
511 <String Id="Error1903" Overridable="yes">S'està programant l'operació de reinici: s'està suprimint el fitxer [2]. Cal reiniciar per completar l'operació.</String>
512 <String Id="Error1904" Overridable="yes">No s'ha pogut registrar el mòdul [2]. HRESULT [3]. Poseu-vos en contacte amb el personal de suport tècnic.</String>
513 <String Id="Error1905" Overridable="yes">No s'ha pogut suprimir el registre del mòdul [2]. HRESULT [3]. Poseu-vos en contacte amb el personal de suport tècnic.</String>
514 <String Id="Error1906" Overridable="yes">No s'ha pogut emmagatzemar a la memòria cau el paquet [2]. Error: [3]. Poseu-vos en contacte amb el personal de suport tècnic.</String>
515 <String Id="Error1907" Overridable="yes">No s'ha pogut registrar el tipus de lletra [2]. Comproveu que teniu els permisos necessaris per instal·lar tipus de lletra i que el sistema admet aquest tipus.</String>
516 <String Id="Error1908" Overridable="yes">No s'ha pogut suprimir del registre el tipus de lletra [2]. Comproveu que teniu els permisos necessaris per suprimir tipus de lletra.</String>
517 <String Id="Error1909" Overridable="yes">No s'ha pogut crear la drecera [2]. Comproveu que la carpeta de destinació existeix i que hi podeu accedir.</String>
518 <String Id="Error1910" Overridable="yes">No s'ha pogut suprimir la drecera [2]. Comproveu que el fitxer de drecera existeix i que hi podeu accedir.</String>
519 <String Id="Error1911" Overridable="yes">No s'ha pogut registrar la biblioteca de tipus del fitxer [2]. Poseu-vos en contacte amb el personal de suport tècnic.</String>
520 <String Id="Error1912" Overridable="yes">No s'ha pogut suprimir el registre de la biblioteca de tipus del fitxer [2]. Poseu-vos en contacte amb el personal de suport tècnic.</String>
521 <String Id="Error1913" Overridable="yes">No s'ha pogut actualitzar el fitxer INI [2][3]. Comproveu que el fitxer existeix i que hi podeu accedir.</String>
522 <String Id="Error1914" Overridable="yes">No s'ha pogut planificar el fitxer [2] perquè substitueixi el fitxer [3] en reiniciar el sistema. Comproveu que teniu permisos d'escriptura al fitxer [3].</String>
523 <String Id="Error1915" Overridable="yes">S'ha produït un error en suprimir l'administrador de controladors ODBC; error d'ODBC [2]: [3]. Poseu-vos en contacte amb el personal de suport tècnic.</String>
524 <String Id="Error1916" Overridable="yes">S'ha produït un error en instal·lar l'administrador de controladors ODBC; error d'ODBC [2]: [3]. Poseu-vos en contacte amb el personal de suport tècnic.</String>
525 <String Id="Error1917" Overridable="yes">S'ha produït un error en suprimir el controlador ODBC: [4]; error d'ODBC [2]: [3]. Comproveu que teniu prou privilegis per suprimir controladors ODBC.</String>
526 <String Id="Error1918" Overridable="yes">S'ha produït un error en instal·lar el controlador ODBC: [4]; error d'ODBC [2]: [3]. Comproveu que el fitxer [4] existeix i que hi podeu accedir.</String>
527 <String Id="Error1919" Overridable="yes">S'ha produït un error en configurar l'origen de dades ODBC: [4]; error d'ODBC [2]: [3]. Comproveu que el fitxer [4] existeix i que hi podeu accedir.</String>
528 <String Id="Error1920" Overridable="yes">No s'ha pogut iniciar el servei "[2]" ([3]). Comproveu que teniu prou privilegis per iniciar els serveis del sistema.</String>
529 <String Id="Error1921" Overridable="yes">No s'ha pogut aturar el servei "[2]" ([3]). Comproveu que teniu prou privilegis per aturar els serveis del sistema.</String>
530 <String Id="Error1922" Overridable="yes">No s'ha pogut suprimir el servei "[2]" ([3]). Comproveu que teniu prou privilegis per suprimir els serveis del sistema.</String>
531 <String Id="Error1923" Overridable="yes">No s'ha pogut instal·lar el servei "[2]" ([3]). Comproveu que teniu prou privilegis per instal·lar els serveis del sistema.</String>
532 <String Id="Error1924" Overridable="yes">No s'ha pogut actualitzar la variable d'entorn "[2]". Comproveu que teniu prou privilegis per modificar variables d'entorn.</String>
533 <String Id="Error1925" Overridable="yes">No teniu prou privilegis per finalitzar aquesta instal·lació per a tots els usuaris de l'ordinador. Inicieu sessió com a administrador i torneu a intentar la instal·lació.</String>
534 <String Id="Error1926" Overridable="yes">No s'ha pogut definir la seguretat del fitxer "[3]". Error: [2]. Comproveu que teniu prou privilegis per modificar els permisos de seguretat d'aquest fitxer.</String>
535 <String Id="Error1927" Overridable="yes">Els Serveis de components (COM+ 1.0) no estan instal·lats en aquest ordinador. Aquesta instal·lació necessita els Serveis de components per completar-se correctament. Els Serveis de components estan disponibles al Windows 2000.</String>
536 <String Id="Error1928" Overridable="yes">S'ha produït un error en registrar l'aplicació COM+. Poseu-vos en contacte amb el personal de suport tècnic per obtenir més informació.</String>
537 <String Id="Error1929" Overridable="yes">S'ha produït un error en suprimir el registre de l'aplicació COM+. Poseu-vos en contacte amb el personal de suport tècnic per obtenir més informació.</String>
538 <String Id="Error1930" Overridable="yes">No s'ha pogut canviar la descripció del servei "[2]" ([3]).</String>
539 <String Id="Error1931" Overridable="yes">El servei Windows Installer no pot actualitzar el fitxer del sistema [2] perquè està protegit pel Windows. És possible que hàgiu d'actualitzar el sistema operatiu perquè aquest programa funcioni correctament. {{Versió del paquet: [3], versió protegida del sistema operatiu: [4]}}</String>
540 <String Id="Error1932" Overridable="yes">El servei del Windows Installer no pot actualitzar el fitxer protegit del Windows [2]. {{Versió del paquet: [3], versió protegida del sistema operatiu: [4], error d'SFP: [5]}}</String>
541 <String Id="Error1933" Overridable="yes">El servei del Windows Installer no pot actualitzar un o més fitxers protegits del Windows. {{Error d'SFP: [2]. Llista de fitxers protegits:\r\n[3]}}</String>
542 <String Id="Error1934" Overridable="yes">Les instal·lacions d'usuari estan inhabilitades per una norma de l'ordinador.</String>
543 <String Id="Error1935" Overridable="yes">S'ha produït un error durant la instal·lació de l'assemblat "[6]". Vegeu l'Ajuda i suport tècnic per obtenir més informació. HRESULT: [3]. {{Interfície de l'assemblat: [4], funció: [5], component: [2]}}</String>
544 <String Id="Error1936" Overridable="yes">S'ha produït un error durant la instal·lació de l'assemblat "[6]". L'assemblat no té un nom segur o no està signat amb la longitud de clau mínima. HRESULT: [3]. {{Interfície de l'assemblat: [4], funció: [5], component: [2]}}</String>
545 <String Id="Error1937" Overridable="yes">S'ha produït un error durant la instal·lació de l'assemblat "[6]". La signatura o el catàleg no s'han pogut comprovar o no són vàlids. HRESULT: [3]. {{Interfície de l'assemblat: [4], funció: [5], component: [2]}}</String>
546 <String Id="Error1938" Overridable="yes">S'ha produït un error durant la instal·lació de l'assemblat "[6]". No s'ha pogut trobar un o més mòduls de l'assemblat. HRESULT: [3]. {{Interfície de l'assemblat: [4], funció: [5], component: [2]}}</String>
547
548 <String Id="UITextbytes" Overridable="yes">bytes</String>
549 <String Id="UITextGB" Overridable="yes">GB</String>
550 <String Id="UITextKB" Overridable="yes">kB</String>
551 <String Id="UITextMB" Overridable="yes">MB</String>
552 <String Id="UITextMenuAbsent" Overridable="yes">Aquesta característica no estarà disponible</String>
553 <String Id="UITextMenuAdvertise" Overridable="yes">Aquesta característica s'instal·larà quan calgui</String>
554 <String Id="UITextMenuAllCD" Overridable="yes">Aquesta característica s'instal·larà en la seva totalitat per executar-se des del CD</String>
555 <String Id="UITextMenuAllLocal" Overridable="yes">Aquesta característica s'instal·larà en la seva totalitat al disc dur local</String>
556 <String Id="UITextMenuAllNetwork" Overridable="yes">Aquesta característica s'instal·larà en la seva totalitat per executar-se des de la xarxa</String>
557 <String Id="UITextMenuCD" Overridable="yes">S'instal·larà per executar-se des del CD</String>
558 <String Id="UITextMenuLocal" Overridable="yes">S'instal·larà al disc dur local</String>
559 <String Id="UITextMenuNetwork" Overridable="yes">S'instal·larà per executar-se des de la xarxa</String>
560 <String Id="UITextNewFolder" Overridable="yes">Carpeta|Crea una carpeta</String>
561 <String Id="UITextScriptInProgress" Overridable="yes">S'està recopilant la informació necessària...</String>
562 <String Id="UITextSelAbsentAbsent" Overridable="yes">Aquesta característica no s'instal·larà</String>
563 <String Id="UITextSelAbsentAdvertise" Overridable="yes">Aquesta característica es definirà per instal·lar-se quan calgui</String>
564 <String Id="UITextSelAbsentCD" Overridable="yes">Aquesta característica s'instal·larà per executar-se des del CD</String>
565 <String Id="UITextSelAbsentLocal" Overridable="yes">Aquesta característica s'instal·larà a la unitat de disc dur local</String>
566 <String Id="UITextSelAbsentNetwork" Overridable="yes">Aquesta característica s'instal·larà per executar-se des de la xarxa</String>
567 <String Id="UITextSelAdvertiseAbsent" Overridable="yes">Aquesta característica deixarà d'estar disponible</String>
568 <String Id="UITextSelAdvertiseAdvertise" Overridable="yes">S'instal·larà quan calgui</String>
569 <String Id="UITextSelAdvertiseCD" Overridable="yes">Aquesta característica estarà disponible per executar-se des del CD</String>
570 <String Id="UITextSelAdvertiseLocal" Overridable="yes">Aquesta característica s'instal·larà al disc dur local</String>
571 <String Id="UITextSelAdvertiseNetwork" Overridable="yes">Aquesta característica estarà disponible per executar-se des de la xarxa</String>
572 <String Id="UITextSelCDAbsent" Overridable="yes">Aquesta característica es desinstal·larà completament i no podreu executar-la des del CD</String>
573 <String Id="UITextSelCDAdvertise" Overridable="yes">Aquesta característica canviarà d'executar-se des del CD a definir-se per ésser instal·lada quan calgui</String>
574 <String Id="UITextSelCDCD" Overridable="yes">Aquesta característica es podrà executar des del CD</String>
575 <String Id="UITextSelCDLocal" Overridable="yes">Aquesta característica deixarà d'executar-se des del CD i s'instal·larà a la unitat de disc dur local</String>
576 <String Id="UITextSelChildCostNeg" Overridable="yes">Aquesta característica allibera [1] al disc dur.</String>
577 <String Id="UITextSelChildCostPos" Overridable="yes">Aquesta característica necessita [1] al disc dur.</String>
578 <String Id="UITextSelCostPending" Overridable="yes">S'està calculant el cost d'aquesta característica...</String>
579 <String Id="UITextSelLocalAbsent" Overridable="yes">Aquesta característica se suprimirà completament</String>
580 <String Id="UITextSelLocalAdvertise" Overridable="yes">Aquesta característica se suprimirà del disc dur local, però es definirà per instal·lar-se quan calgui</String>
581 <String Id="UITextSelLocalCD" Overridable="yes">Aquesta característica se suprimirà de la unitat de disc dur local, però encara es podrà executar des del CD</String>
582 <String Id="UITextSelLocalLocal" Overridable="yes">Aquesta característica romandrà a la unitat de disc dur local</String>
583 <String Id="UITextSelLocalNetwork" Overridable="yes">Aquesta característica se suprimirà de la unitat de disc dur local, però encara es podrà executar des de la xarxa</String>
584 <String Id="UITextSelNetworkAbsent" Overridable="yes">Aquesta característica es desinstal·larà completament i no podreu executar-la des de la xarxa</String>
585 <String Id="UITextSelNetworkAdvertise" Overridable="yes">Aquesta característica canviarà d'executar-se des de la xarxa a definir-se per instal·lar-se quan calgui</String>
586 <String Id="UITextSelNetworkLocal" Overridable="yes">Aquesta característica deixarà d'executar-se des de la xarxa i s'instal·larà a la unitat de disc dur local</String>
587 <String Id="UITextSelNetworkNetwork" Overridable="yes">Aquesta característica podrà executar-se des de la xarxa</String>
588 <String Id="UITextSelParentCostNegNeg" Overridable="yes">Aquesta característica allibera [1] al disc dur. Té [2] de [3] subcaracterístiques seleccionades. Les subcaracterístiques alliberen [4] al disc dur.</String>
589 <String Id="UITextSelParentCostNegPos" Overridable="yes">Aquesta característica allibera [1] al disc dur. Té [2] de [3] subcaracterístiques seleccionades. Les subcaracterístiques necessiten [4] al disc dur.</String>
590 <String Id="UITextSelParentCostPosNeg" Overridable="yes">Aquesta característica necessita [1] al disc dur. Té [2] de [3] subcaracterístiques seleccionades. Les subcaracterístiques alliberen [4] al disc dur.</String>
591 <String Id="UITextSelParentCostPosPos" Overridable="yes">Aquesta característica necessita [1] al disc dur. Té [2] de [3] subcaracterístiques seleccionades. Les subcaracterístiques necessiten [4] al disc dur.</String>
592 <String Id="UITextTimeRemaining" Overridable="yes">Temps restant: {[1] minuts }{[2] segons}</String>
593 <String Id="UITextVolumeCostAvailable" Overridable="yes">Disponible</String>
594 <String Id="UITextVolumeCostDifference" Overridable="yes">Diferència</String>
595 <String Id="UITextVolumeCostRequired" Overridable="yes">Obligatori</String>
596 <String Id="UITextVolumeCostSize" Overridable="yes">Mida del disc</String>
597 <String Id="UITextVolumeCostVolume" Overridable="yes">Volum</String>
598</WixLocalization>
diff --git a/src/ext/UI/wixlib/WixUI_cs-CZ.wxl b/src/ext/UI/wixlib/WixUI_cs-CZ.wxl
new file mode 100644
index 00000000..b25c8968
--- /dev/null
+++ b/src/ext/UI/wixlib/WixUI_cs-CZ.wxl
@@ -0,0 +1,598 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3
4
5<WixLocalization Culture="cs-cz" Codepage="1250" xmlns="http://wixtoolset.org/schemas/v4/wxl">
6 <String Id="WixUIBack" Overridable="yes">&amp;Zpět</String>
7 <String Id="WixUINext" Overridable="yes">&amp;Další</String>
8 <String Id="WixUICancel" Overridable="yes">Storno</String>
9 <String Id="WixUIFinish" Overridable="yes">&amp;Dokončit</String>
10 <String Id="WixUIRetry" Overridable="yes">&amp;Opakovat</String>
11 <String Id="WixUIIgnore" Overridable="yes">&amp;Ignorovat</String>
12 <String Id="WixUIYes" Overridable="yes">&amp;Ano</String>
13 <String Id="WixUINo" Overridable="yes">&amp;Ne</String>
14 <String Id="WixUIOK" Overridable="yes">OK</String>
15 <String Id="WixUIPrint" Overridable="yes">&amp;Tisk</String>
16
17 <String Id="AdvancedWelcomeEulaDlg_Title" Overridable="yes">Instalace produktu [ProductName]</String>
18 <String Id="AdvancedWelcomeEulaDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
19 <String Id="AdvancedWelcomeEulaDlgTitle" Overridable="yes">{\WixUI_Font_Title}Přečtěte si licenční smlouvu k produktu [ProductName].</String>
20 <String Id="AdvancedWelcomeEulaDlgLicenseAcceptedCheckBox" Overridable="yes">&amp;S podmínkami licenční smlouvy souhlasím</String>
21 <String Id="AdvancedWelcomeEulaDlgDescriptionPerMachine" Overridable="yes">Kliknutím na tlačítko Nainstalovat nainstalujete produkt s výchozími možnostmi pro všechny uživatele. Chcete-li změnit možnosti instalace, klikněte na tlačítko Upřesnit.</String>
22 <String Id="AdvancedWelcomeEulaDlgDescriptionPerUser" Overridable="yes">Kliknutím na tlačítko Nainstalovat nainstalujete produkt s výchozími možnostmi pouze pro vás. Chcete-li změnit možnosti instalace, klikněte na tlačítko Upřesnit.</String>
23 <String Id="AdvancedWelcomeEulaDlgInstall" Overridable="yes">&amp;Nainstalovat</String>
24 <String Id="AdvancedWelcomeEulaDlgAdvanced" Overridable="yes">&amp;Upřesnit</String>
25 <String Id="Advanced_Font_Normal_Size" Overridable="yes">8</String>
26 <String Id="Advanced_Font_Bigger_Size" Overridable="yes">12</String>
27 <String Id="Advanced_Font_Title_Size" Overridable="yes">9</String>
28 <String Id="Advanced_Font_Emphasized_Size" Overridable="yes">8</String>
29 <String Id="Advanced_Font_FaceName" Overridable="yes">Tahoma</String>
30
31 <String Id="BrowseDlg_Title" Overridable="yes">Instalace produktu [ProductName]</String>
32 <String Id="BrowseDlgComboLabel" Overridable="yes">&amp;Oblast hledání:</String>
33 <String Id="BrowseDlgWixUI_Bmp_Up" Overridable="yes">WixUI_Bmp_Up</String>
34 <String Id="BrowseDlgWixUI_Bmp_UpTooltip" Overridable="yes">O úroveň výš</String>
35 <String Id="BrowseDlgNewFolder" Overridable="yes">WixUI_Bmp_New</String>
36 <String Id="BrowseDlgNewFolderTooltip" Overridable="yes">Umožňuje vytvořit novou složku.</String>
37 <String Id="BrowseDlgPathLabel" Overridable="yes">&amp;Název složky:</String>
38 <String Id="BrowseDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
39 <String Id="BrowseDlgDescription" Overridable="yes">Umožňuje přejít do cílové složky.</String>
40 <String Id="BrowseDlgTitle" Overridable="yes">{\WixUI_Font_Title}Změnit cílovou složku</String>
41
42 <String Id="CancelDlg_Title" Overridable="yes">Instalace produktu [ProductName]</String>
43 <String Id="CancelDlgText" Overridable="yes">Opravdu chcete zrušit instalaci produktu [ProductName]?</String>
44 <String Id="CancelDlgIcon" Overridable="yes">WixUI_Ico_Info</String>
45 <String Id="CancelDlgIconTooltip" Overridable="yes">Informační ikona</String>
46
47 <String Id="CustomizeDlg_Title" Overridable="yes">Instalace produktu [ProductName]</String>
48 <String Id="CustomizeDlgTree" Overridable="yes">Stromová struktura výběrů</String>
49 <String Id="CustomizeDlgBrowse" Overridable="yes">P&amp;rocházet...</String>
50 <String Id="CustomizeDlgReset" Overridable="yes">&amp;Obnovit</String>
51 <String Id="CustomizeDlgDiskCost" Overridable="yes">&amp;Využití disku</String>
52 <String Id="CustomizeDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
53 <String Id="CustomizeDlgText" Overridable="yes">Kliknutím na ikony v následující stromové struktuře můžete změnit způsob instalace součástí.</String>
54 <String Id="CustomizeDlgDescription" Overridable="yes">Vyberte požadovaný způsob instalace součástí.</String>
55 <String Id="CustomizeDlgTitle" Overridable="yes">{\WixUI_Font_Title}Vlastní instalace</String>
56 <String Id="CustomizeDlgItemDescription" Overridable="yes">CustomizeDlgItemDescription-CustomizeDlgItemDescription</String>
57 <String Id="CustomizeDlgItemSize" Overridable="yes">CustomizeDlgItemSize-CustomizeDlgItemSize</String>
58 <String Id="CustomizeDlgLocation" Overridable="yes">CustomizeDlgLocation-CustomizeDlgLocation</String>
59 <String Id="CustomizeDlgLocationLabel" Overridable="yes">Umístění:</String>
60
61 <String Id="DiskCostDlg_Title" Overridable="yes">Instalace produktu [ProductName]</String>
62 <String Id="DiskCostDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
63 <String Id="DiskCostDlgText" Overridable="yes">Na zvýrazněných svazcích není dostatek místa pro vybrané součásti. Můžete odebrat některé soubory ze zvýrazněných svazků, nainstalovat méně součástí, nebo vybrat jiné cílové jednotky.</String>
64 <String Id="DiskCostDlgDescription" Overridable="yes">Místo na disku potřebné k instalaci vybraných součástí</String>
65 <String Id="DiskCostDlgTitle" Overridable="yes">{\WixUI_Font_Title}Požadavky na místo na disku</String>
66 <String Id="DiskCostDlgVolumeList" Overridable="yes">{120}{70}{70}{70}{70}</String>
67
68 <String Id="ErrorDlg_Title" Overridable="yes">Instalace produktu [ProductName]</String>
69 <String Id="ErrorDlgErrorText" Overridable="yes">Informační text</String>
70 <String Id="ErrorDlgErrorIcon" Overridable="yes">WixUI_Ico_Info</String>
71 <String Id="ErrorDlgErrorIconTooltip" Overridable="yes">Informační ikona</String>
72
73 <String Id="ExitDialog_Title" Overridable="yes">Instalace produktu [ProductName]</String>
74 <String Id="ExitDialogBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
75 <String Id="ExitDialogDescription" Overridable="yes">Kliknutím na tlačítko Dokončit Průvodce instalací ukončete.</String>
76 <String Id="ExitDialogTitle" Overridable="yes">{\WixUI_Font_Bigger}Průvodce instalací produktu [ProductName] byl dokončen.</String>
77
78 <String Id="FatalError_Title" Overridable="yes">Instalace produktu [ProductName]</String>
79 <String Id="FatalErrorBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
80 <String Id="FatalErrorTitle" Overridable="yes">{\WixUI_Font_Bigger}Průvodce instalací produktu [ProductName] byl předčasně ukončen.</String>
81 <String Id="FatalErrorDescription1" Overridable="yes">Průvodce instalací produktu [ProductName] byl předčasně ukončen z důvodu chyby. Systém nebyl změněn. Budete-li chtít tento program nainstalovat později, spusťte znovu Průvodce instalací.</String>
82 <String Id="FatalErrorDescription2" Overridable="yes">Kliknutím na tlačítko Dokončit Průvodce instalací ukončete.</String>
83
84 <String Id="FeaturesDlg_Title" Overridable="yes">Instalace produktu [ProductName]</String>
85 <String Id="FeaturesDlgTree" Overridable="yes">Součásti produktu</String>
86 <String Id="FeaturesDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
87 <String Id="FeaturesDlgDescription" Overridable="yes">Vyberte požadovaný způsob instalace součástí.</String>
88 <String Id="FeaturesDlgTitle" Overridable="yes">{\WixUI_Font_Title}Součásti produktu</String>
89 <String Id="FeaturesDlgItemDescription" Overridable="yes">FeaturesDlgItemDescription</String>
90 <String Id="FeaturesDlgItemSize" Overridable="yes">FeaturesDlgItemSize</String>
91 <String Id="FeaturesDlgInstall" Overridable="yes">&amp;Nainstalovat</String>
92 <String Id="FeaturesDlgChange" Overridable="yes">&amp;Změnit</String>
93
94 <String Id="FilesInUse_Title" Overridable="yes">Instalace produktu [ProductName]</String>
95 <String Id="FilesInUseExit" Overridable="yes">&amp;Konec</String>
96 <String Id="FilesInUseBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
97 <String Id="FilesInUseText" Overridable="yes">Následující aplikace používají soubory, které je třeba při instalaci aktualizovat. Ukončete tyto aplikace a pokračujte v instalaci kliknutím na tlačítko &amp;Opakovat, nebo kliknutím na tlačítko Storno instalaci ukončete.</String>
98 <String Id="FilesInUseDescription" Overridable="yes">Některé soubory, které je třeba aktualizovat, jsou právě používány.</String>
99 <String Id="FilesInUseTitle" Overridable="yes">{\WixUI_Font_Title}Používané soubory</String>
100
101 <String Id="InstallDirDlg_Title" Overridable="yes">Instalace produktu [ProductName]</String>
102 <String Id="InstallDirDlgChange" Overridable="yes">&amp;Změnit...</String>
103 <String Id="InstallDirDlgTitle" Overridable="yes">{\WixUI_Font_Title}Cílová složka</String>
104 <String Id="InstallDirDlgDescription" Overridable="yes">Kliknutím na tlačítko Další nainstalujete produkt do výchozí složky. Chcete-li zvolit jinou složku, klikněte na tlačítko Změnit.</String>
105 <String Id="InstallDirDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
106 <String Id="InstallDirDlgFolderLabel" Overridable="yes">Nainstalovat produkt [ProductName] do složky:</String>
107
108 <String Id="InstallScopeDlg_Title" Overridable="yes">Instalace produktu [ProductName]</String>
109 <String Id="InstallScopeDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
110 <String Id="InstallScopeDlgDescription" Overridable="yes">Umožňuje zvolit obor instalace a instalační složku.</String>
111 <String Id="InstallScopeDlgTitle" Overridable="yes">{\WixUI_Font_Title}Obor instalace</String>
112 <String Id="InstallScopeDlgPerUser" Overridable="yes">{\WixUI_Font_Emphasized}Nainstalovat &amp;pouze pro vás ([LogonUser])</String>
113 <String Id="InstallScopeDlgPerUserDescription" Overridable="yes">Produkt [ProductName] bude nainstalován do složky konkrétního uživatele a bude k dispozici pouze pro váš uživatelský účet. Nepotřebujete oprávnění místního správce.</String>
114 <String Id="InstallScopeDlgNoPerUserDescription" Overridable="yes">Produkt [ProductName] nepodporuje instalace vázané na uživatele.</String>
115 <String Id="InstallScopeDlgPerMachine" Overridable="yes">{\WixUI_Font_Emphasized}Nainstalovat pro všechny uživatele tohoto &amp;počítače</String>
116 <String Id="InstallScopeDlgPerMachineDescription" Overridable="yes">Produkt [ProductName] bude nainstalován do složky platné ve výchozím nastavení pro celý počítač a bude k dispozici pro všechny uživatele. Výchozí instalační složku můžete změnit. Je nutné, abyste měli oprávnění místního správce.</String>
117 <String Id="InstallScopeDlgFolderLabel" Overridable="yes">Instalační &amp;složka:</String>
118 <String Id="InstallScopeDlgChange" Overridable="yes">&amp;Změnit...</String>
119
120 <String Id="InvalidDirDlg_Title" Overridable="yes">Instalace produktu [ProductName]</String>
121 <String Id="InvalidDirDlgText" Overridable="yes">Instalační adresář se musí nacházet na místním pevném disku.</String>
122 <String Id="InvalidDirDlgIcon" Overridable="yes">WixUI_Ico_Info</String>
123 <String Id="InvalidDirDlgIconTooltip" Overridable="yes">Informační ikona</String>
124
125 <String Id="LicenseAgreementDlg_Title" Overridable="yes">Instalace produktu [ProductName]</String>
126 <String Id="LicenseAgreementDlgLicenseAcceptedCheckBox" Overridable="yes">&amp;S podmínkami licenční smlouvy souhlasím</String>
127 <String Id="LicenseAgreementDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
128 <String Id="LicenseAgreementDlgDescription" Overridable="yes">Přečtěte si pečlivě následující licenční smlouvu.</String>
129 <String Id="LicenseAgreementDlgTitle" Overridable="yes">{\WixUI_Font_Title}Licenční smlouva s koncovým uživatelem (EULA)</String>
130
131 <String Id="MaintenanceTypeDlg_Title" Overridable="yes">Instalace produktu [ProductName]</String>
132 <String Id="MaintenanceTypeDlgChangeButton" Overridable="yes">&amp;Změnit</String>
133 <String Id="MaintenanceTypeDlgChangeButtonTooltip" Overridable="yes">Změnit instalaci</String>
134 <String Id="MaintenanceTypeDlgRepairButton" Overridable="yes">O&amp;pravit</String>
135 <String Id="MaintenanceTypeDlgRepairButtonTooltip" Overridable="yes">Opravit instalaci</String>
136 <String Id="MaintenanceTypeDlgRemoveButton" Overridable="yes">&amp;Odebrat</String>
137 <String Id="MaintenanceTypeDlgRemoveButtonTooltip" Overridable="yes">Odebrat instalaci</String>
138 <String Id="MaintenanceTypeDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
139 <String Id="MaintenanceTypeDlgDescription" Overridable="yes">Vyberte operaci, kterou chcete provést.</String>
140 <String Id="MaintenanceTypeDlgTitle" Overridable="yes">{\WixUI_Font_Title}Změna, oprava nebo odebrání instalace</String>
141 <String Id="MaintenanceTypeDlgChangeText" Overridable="yes">Umožňuje změnit způsob instalace součástí.</String>
142 <String Id="MaintenanceTypeDlgChangeDisabledText" Overridable="yes">Produkt [ProductName] neobsahuje součásti, které lze vybírat samostatně.</String>
143 <String Id="MaintenanceTypeDlgRemoveText" Overridable="yes">Odebere z počítače produkt [ProductName].</String>
144 <String Id="MaintenanceTypeDlgRemoveDisabledText" Overridable="yes">Produkt [ProductName] nelze odebrat.</String>
145 <String Id="MaintenanceTypeDlgRepairText" Overridable="yes">Opraví chyby v nejnovější instalaci opravou chybějících a poškozených souborů, zástupců a položek registru.</String>
146 <String Id="MaintenanceTypeDlgRepairDisabledText" Overridable="yes">Produkt [ProductName] nelze opravit.</String>
147
148 <String Id="MaintenanceWelcomeDlg_Title" Overridable="yes">Instalace produktu [ProductName]</String>
149 <String Id="MaintenanceWelcomeDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
150 <String Id="MaintenanceWelcomeDlgDescription" Overridable="yes">Pomocí Průvodce instalací můžete změnit způsob instalace součástí produktu [ProductName] do počítače nebo odebrat tento produkt z počítače. Pokračujte kliknutím na tlačítko Další, nebo kliknutím na tlačítko Storno Průvodce instalací ukončete.</String>
151 <String Id="MaintenanceWelcomeDlgTitle" Overridable="yes">{\WixUI_Font_Bigger}Vítá vás Průvodce instalací produktu [ProductName].</String>
152
153 <String Id="MsiRMFilesInUse_Title" Overridable="yes">Instalace produktu [ProductName]</String>
154 <String Id="MsiRMFilesInUseBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
155 <String Id="MsiRMFilesInUseText" Overridable="yes">Následující aplikace používají soubory, které je třeba při instalaci aktualizovat. Můžete je nechat zavřít Průvodcem instalací a pokusit se je znovu spustit nebo restartovat počítač později.</String>
156 <String Id="MsiRMFilesInUseDescription" Overridable="yes">Některé soubory, které je třeba aktualizovat, jsou právě používány.</String>
157 <String Id="MsiRMFilesInUseTitle" Overridable="yes">{\WixUI_Font_Title}Používané soubory</String>
158 <String Id="MsiRMFilesInUseUseRM" Overridable="yes">&amp;Ukončit aplikace a pokusit se je znovu spustit</String>
159 <String Id="MsiRMFilesInUseDontUseRM" Overridable="yes">&amp;Neukončovat aplikace (bude nutné restartovat počítač)</String>
160
161 <String Id="OutOfDiskDlg_Title" Overridable="yes">Instalace produktu [ProductName]</String>
162 <String Id="OutOfDiskDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
163 <String Id="OutOfDiskDlgText" Overridable="yes">Na zvýrazněných svazcích není dostatek místa pro aktuálně vybrané součásti. Můžete odebrat některé soubory ze zvýrazněných svazků, nainstalovat méně součástí nebo vybrat jinou cílovou jednotku.</String>
164 <String Id="OutOfDiskDlgDescription" Overridable="yes">Velikost požadovaného místa na disku je větší než dostupné místo na disku.</String>
165 <String Id="OutOfDiskDlgTitle" Overridable="yes">{\WixUI_Font_Title}Nedostatek místa na disku</String>
166 <String Id="OutOfDiskDlgVolumeList" Overridable="yes">{120}{70}{70}{70}{70}</String>
167
168 <String Id="OutOfRbDiskDlg_Title" Overridable="yes">Instalace produktu [ProductName]</String>
169 <String Id="OutOfRbDiskDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
170 <String Id="OutOfRbDiskDlgText" Overridable="yes">Na zvýrazněných svazcích není dostatek místa pro aktuálně vybrané součásti. Můžete odebrat některé soubory ze zvýrazněných svazků, nainstalovat méně součástí nebo vybrat jinou cílovou jednotku.</String>
171 <String Id="OutOfRbDiskDlgDescription" Overridable="yes">Velikost požadovaného místa na disku je větší než dostupné místo na disku.</String>
172 <String Id="OutOfRbDiskDlgTitle" Overridable="yes">{\WixUI_Font_Title}Nedostatek místa na disku</String>
173 <String Id="OutOfRbDiskDlgVolumeList" Overridable="yes">{120}{70}{70}{70}{70}</String>
174 <String Id="OutOfRbDiskDlgText2" Overridable="yes">Alternativně můžete zakázat funkci vrácení změn instalačního programu. Zakázáním vrácení změn zabráníte obnovení původního stavu počítače v případě, že dojde k přerušení instalace. Pokud chcete riskovat zakázání vrácení změn, klikněte na tlačítko Ano.</String>
175
176 <String Id="PrepareDlg_Title" Overridable="yes">Instalace produktu [ProductName]</String>
177 <String Id="PrepareDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
178 <String Id="PrepareDlgDescription" Overridable="yes">Počkejte prosím, než se Průvodce instalací připraví na požadované kroky instalace.</String>
179 <String Id="PrepareDlgTitle" Overridable="yes">{\WixUI_Font_Bigger}Vítá vás Průvodce instalací produktu [ProductName].</String>
180
181 <String Id="ProgressDlg_Title" Overridable="yes">Instalace produktu [ProductName]</String>
182 <String Id="ProgressDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
183 <String Id="ProgressDlgTextInstalling" Overridable="yes">Počkejte prosím, než Průvodce instalací nainstaluje produkt [ProductName].</String>
184 <String Id="ProgressDlgTitleInstalling" Overridable="yes">{\WixUI_Font_Title}Instalace produktu [ProductName]</String>
185 <String Id="ProgressDlgTextChanging" Overridable="yes">Počkejte prosím, než Průvodce instalací změní produkt [ProductName].</String>
186 <String Id="ProgressDlgTitleChanging" Overridable="yes">{\WixUI_Font_Title}Změna produktu [ProductName]</String>
187 <String Id="ProgressDlgTextRepairing" Overridable="yes">Počkejte prosím, než Průvodce instalací opraví produkt [ProductName].</String>
188 <String Id="ProgressDlgTitleRepairing" Overridable="yes">{\WixUI_Font_Title}Oprava produktu [ProductName]</String>
189 <String Id="ProgressDlgTextRemoving" Overridable="yes">Počkejte prosím, než Průvodce instalací odebere produkt [ProductName].</String>
190 <String Id="ProgressDlgTitleRemoving" Overridable="yes">{\WixUI_Font_Title}Odebírání produktu [ProductName]</String>
191 <String Id="ProgressDlgTextUpdating" Overridable="yes">Počkejte prosím, než Průvodce instalací aktualizuje produkt [ProductName].</String>
192 <String Id="ProgressDlgTitleUpdating" Overridable="yes">{\WixUI_Font_Title}Aktualizace produktu [ProductName]</String>
193 <String Id="ProgressDlgProgressBar" Overridable="yes">Ukazatel průběhu</String>
194 <String Id="ProgressDlgStatusLabel" Overridable="yes">Stav:</String>
195
196 <String Id="ResumeDlg_Title" Overridable="yes">Instalace produktu [ProductName]</String>
197 <String Id="ResumeDlgInstall" Overridable="yes">&amp;Nainstalovat</String>
198 <String Id="ResumeDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
199 <String Id="ResumeDlgDescription" Overridable="yes">Průvodce instalací dokončí instalaci produktu [ProductName] do počítače. Pokračujte kliknutím na tlačítko Nainstalovat, nebo kliknutím na tlačítko Storno ukončete Průvodce instalací.</String>
200 <String Id="ResumeDlgTitle" Overridable="yes">{\WixUI_Font_Bigger}Pokračování Průvodce instalací produktu [ProductName]</String>
201
202 <String Id="SetupTypeDlg_Title" Overridable="yes">Instalace produktu [ProductName]</String>
203 <String Id="SetupTypeDlgTypicalButton" Overridable="yes">&amp;Typická</String>
204 <String Id="SetupTypeDlgTypicalButtonTooltip" Overridable="yes">Typická instalace</String>
205 <String Id="SetupTypeDlgCustomButton" Overridable="yes">Vl&amp;astní</String>
206 <String Id="SetupTypeDlgCustomButtonTooltip" Overridable="yes">Vlastní instalace</String>
207 <String Id="SetupTypeDlgCompleteButton" Overridable="yes">Ú&amp;plná</String>
208 <String Id="SetupTypeDlgCompleteButtonTooltip" Overridable="yes">Úplná instalace</String>
209 <String Id="SetupTypeDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
210 <String Id="SetupTypeDlgTitle" Overridable="yes">{\WixUI_Font_Title}Zvolit typ instalace</String>
211 <String Id="SetupTypeDlgDescription" Overridable="yes">Zvolte typ instalace, který nejlépe vyhovuje vašim potřebám.</String>
212 <String Id="SetupTypeDlgTypicalText" Overridable="yes">Nainstaluje nejběžnější součásti programu. Doporučeno pro většinu uživatelů.</String>
213 <String Id="SetupTypeDlgCustomText" Overridable="yes">Umožňuje uživatelům zvolit, které součásti programu budou nainstalovány a kam. Doporučeno pro zkušené uživatele.</String>
214 <String Id="SetupTypeDlgCompleteText" Overridable="yes">Budou nainstalovány všechny součásti programu. Požaduje nejvíce místa na pevném disku.</String>
215
216 <String Id="UserExit_Title" Overridable="yes">Instalace produktu [ProductName]</String>
217 <String Id="UserExitBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
218 <String Id="UserExitTitle" Overridable="yes">{\WixUI_Font_Bigger}Průvodce instalací produktu [ProductName] byl přerušen.</String>
219 <String Id="UserExitDescription1" Overridable="yes">Průvodce instalací produktu [ProductName] byl přerušen. Systém nebyl změněn. Chcete-li tento program nainstalovat později, spusťte znovu instalaci.</String>
220 <String Id="UserExitDescription2" Overridable="yes">Kliknutím na tlačítko Dokončit Průvodce instalací ukončete.</String>
221
222 <String Id="VerifyReadyDlg_Title" Overridable="yes">Instalace produktu [ProductName]</String>
223 <String Id="VerifyReadyDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
224 <String Id="VerifyReadyDlgInstall" Overridable="yes">&amp;Nainstalovat</String>
225 <String Id="VerifyReadyDlgInstallText" Overridable="yes">Chcete-li zahájit instalaci, klikněte na tlačítko Nainstalovat. Jestliže chcete zkontrolovat nebo změnit nastavení instalace, klikněte na tlačítko Zpět. Pokud chcete průvodce ukončit, klikněte na tlačítko Storno.</String>
226 <String Id="VerifyReadyDlgInstallTitle" Overridable="yes">{\WixUI_Font_Title}Instalace produktu [ProductName] je připravena.</String>
227 <String Id="VerifyReadyDlgChange" Overridable="yes">&amp;Změnit</String>
228 <String Id="VerifyReadyDlgChangeText" Overridable="yes">Chcete-li zahájit instalaci, klikněte na tlačítko Změnit. Jestliže chcete zkontrolovat nebo změnit nastavení instalace, klikněte na tlačítko Zpět. Pokud chcete průvodce ukončit, klikněte na tlačítko Storno.</String>
229 <String Id="VerifyReadyDlgChangeTitle" Overridable="yes">{\WixUI_Font_Title}Změna produktu [ProductName] je připravena.</String>
230 <String Id="VerifyReadyDlgRepair" Overridable="yes">O&amp;pravit</String>
231 <String Id="VerifyReadyDlgRepairText" Overridable="yes">Chcete-li opravit instalaci produktu [ProductName], klikněte na tlačítko Opravit. Jestliže chcete zkontrolovat nebo změnit nastavení instalace, klikněte na tlačítko Zpět. Pokud chcete průvodce ukončit, klikněte na tlačítko Storno.</String>
232 <String Id="VerifyReadyDlgRepairTitle" Overridable="yes">{\WixUI_Font_Title}Oprava produktu [ProductName] je připravena.</String>
233 <String Id="VerifyReadyDlgRemove" Overridable="yes">&amp;Odebrat</String>
234 <String Id="VerifyReadyDlgRemoveText" Overridable="yes">Chcete-li odebrat produkt [ProductName] z počítače, klikněte na tlačítko Odebrat. Jestliže chcete zkontrolovat nebo změnit nastavení instalace, klikněte na tlačítko Zpět. Pokud chcete průvodce ukončit, klikněte na tlačítko Storno.</String>
235 <String Id="VerifyReadyDlgRemoveTitle" Overridable="yes">{\WixUI_Font_Title}Odebrání produktu [ProductName] je připraveno.</String>
236 <String Id="VerifyReadyDlgUpdate" Overridable="yes">&amp;Aktualizovat</String>
237 <String Id="VerifyReadyDlgUpdateText" Overridable="yes">Chcete-li produkt [ProductName] v počítači aktualizovat, klikněte na tlačítko Aktualizovat. Jestliže chcete zkontrolovat nebo změnit nastavení instalace, klikněte na tlačítko Zpět. Pokud chcete průvodce ukončit, klikněte na tlačítko Storno.</String>
238 <String Id="VerifyReadyDlgUpdateTitle" Overridable="yes">{\WixUI_Font_Title}Připraveno k aktualizaci produktu [ProductName]</String>
239
240 <String Id="WaitForCostingDlg_Title" Overridable="yes">Instalace produktu [ProductName]</String>
241 <String Id="WaitForCostingDlgReturn" Overridable="yes">&amp;Vrátit</String>
242 <String Id="WaitForCostingDlgText" Overridable="yes">Počkejte prosím, než instalační program zjistí potřebné místo na disku.</String>
243 <String Id="WaitForCostingDlgIcon" Overridable="yes">WixUI_Ico_Exclam</String>
244 <String Id="WaitForCostingDlgIconTooltip" Overridable="yes">Ikona upozornění</String>
245
246 <String Id="WelcomeDlg_Title" Overridable="yes">Instalace produktu [ProductName]</String>
247 <String Id="WelcomeDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
248 <String Id="WelcomeDlgDescription" Overridable="yes">Průvodce instalací nainstaluje do počítače produkt [ProductName]. Pokračujte kliknutím na tlačítko Další, nebo kliknutím na tlačítko Storno Průvodce instalací ukončete.</String>
249 <String Id="WelcomeUpdateDlgDescriptionUpdate" Overridable="yes">Průvodce instalací aktualizuje v počítači produkt [ProductName]. Pokračujte kliknutím na tlačítko Další, nebo kliknutím na tlačítko Storno Průvodce instalací ukončete.</String>
250 <String Id="WelcomeDlgTitle" Overridable="yes">{\WixUI_Font_Bigger}Vítá vás Průvodce instalací produktu [ProductName].</String>
251
252 <String Id="WelcomeEulaDlg_Title" Overridable="yes">Instalace produktu [ProductName]</String>
253 <String Id="WelcomeEulaDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
254 <String Id="WelcomeEulaDlgLicenseAcceptedCheckBox" Overridable="yes">&amp;S podmínkami licenční smlouvy souhlasím</String>
255 <String Id="WelcomeEulaDlgInstall" Overridable="yes">&amp;Nainstalovat</String>
256 <String Id="WelcomeEulaDlgUpdate" Overridable="yes">&amp;Aktualizovat</String>
257 <String Id="WelcomeEulaDlgTitle" Overridable="yes">{\WixUI_Font_Title}Přečtěte si licenční smlouvu k produktu [ProductName].</String>
258
259 <String Id="ProgressTextInstallValidate" Overridable="yes">Ověřování instalace</String>
260 <String Id="ProgressTextInstallFiles" Overridable="yes">Kopírování nových souborů</String>
261 <String Id="ProgressTextInstallFilesTemplate" Overridable="yes">Soubor: [1], Adresář: [9], Velikost: [6]</String>
262 <String Id="ProgressTextInstallAdminPackage" Overridable="yes">Kopírování souborů síťové instalace</String>
263 <String Id="ProgressTextInstallAdminPackageTemplate" Overridable="yes">Soubor: [1], Adresář: [9], Velikost: [6]</String>
264 <String Id="ProgressTextFileCost" Overridable="yes">Výpočet požadovaného místa na disku</String>
265 <String Id="ProgressTextCostInitialize" Overridable="yes">Výpočet požadovaného místa na disku</String>
266 <String Id="ProgressTextCostFinalize" Overridable="yes">Výpočet požadovaného místa na disku</String>
267 <String Id="ProgressTextCreateShortcuts" Overridable="yes">Vytváření zástupců</String>
268 <String Id="ProgressTextCreateShortcutsTemplate" Overridable="yes">Zástupce: [1]</String>
269 <String Id="ProgressTextPublishComponents" Overridable="yes">Publikování kvalifikovaných součástí</String>
270 <String Id="ProgressTextPublishComponentsTemplate" Overridable="yes">ID součásti: [1], Kvalifikátor: [2]</String>
271 <String Id="ProgressTextPublishFeatures" Overridable="yes">Publikování součástí produktu</String>
272 <String Id="ProgressTextPublishFeaturesTemplate" Overridable="yes">Součást: [1]</String>
273 <String Id="ProgressTextPublishProduct" Overridable="yes">Publikování informací o produktu</String>
274 <String Id="ProgressTextRegisterClassInfo" Overridable="yes">Registrace serverů tříd</String>
275 <String Id="ProgressTextRegisterClassInfoTemplate" Overridable="yes">ID třídy: [1]</String>
276 <String Id="ProgressTextRegisterExtensionInfo" Overridable="yes">Registrace serverů rozšíření</String>
277 <String Id="ProgressTextRegisterExtensionInfoTemplate" Overridable="yes">Rozšíření: [1]</String>
278 <String Id="ProgressTextRegisterMIMEInfo" Overridable="yes">Registrace informací MIME</String>
279 <String Id="ProgressTextRegisterMIMEInfoTemplate" Overridable="yes">Typ obsahu MIME: [1], Rozšíření: [2]</String>
280 <String Id="ProgressTextRegisterProgIdInfo" Overridable="yes">Registrace identifikátorů programu</String>
281 <String Id="ProgressTextRegisterProgIdInfoTemplate" Overridable="yes">ID programu: [1]</String>
282 <String Id="ProgressTextAllocateRegistrySpace" Overridable="yes">Přidělování místa v registru</String>
283 <String Id="ProgressTextAllocateRegistrySpaceTemplate" Overridable="yes">Volné místo: [1]</String>
284 <String Id="ProgressTextAppSearch" Overridable="yes">Hledání nainstalovaných aplikací</String>
285 <String Id="ProgressTextAppSearchTemplate" Overridable="yes">Vlastnost: [1], Podpis: [2]</String>
286 <String Id="ProgressTextBindImage" Overridable="yes">Vytváření vazeb mezi spustitelnými soubory</String>
287 <String Id="ProgressTextBindImageTemplate" Overridable="yes">Soubor: [1]</String>
288 <String Id="ProgressTextCCPSearch" Overridable="yes">Hledání opravňujících produktů</String>
289 <String Id="ProgressTextCreateFolders" Overridable="yes">Vytváření složek</String>
290 <String Id="ProgressTextCreateFoldersTemplate" Overridable="yes">Složka: [1]</String>
291 <String Id="ProgressTextDeleteServices" Overridable="yes">Odstraňování služeb</String>
292 <String Id="ProgressTextDeleteServicesTemplate" Overridable="yes">Služba: [1]</String>
293 <String Id="ProgressTextDuplicateFiles" Overridable="yes">Vytváření duplicitních souborů</String>
294 <String Id="ProgressTextDuplicateFilesTemplate" Overridable="yes">Soubor: [1], Adresář: [9], Velikost: [6]</String>
295 <String Id="ProgressTextFindRelatedProducts" Overridable="yes">Hledání souvisejících aplikací</String>
296 <String Id="ProgressTextFindRelatedProductsTemplate" Overridable="yes">Nalezená aplikace: [1]</String>
297 <String Id="ProgressTextInstallODBC" Overridable="yes">Instalace součástí rozhraní ODBC</String>
298 <String Id="ProgressTextInstallServices" Overridable="yes">Instalace nových služeb</String>
299 <String Id="ProgressTextInstallServicesTemplate" Overridable="yes">Služba: [2]</String>
300 <String Id="ProgressTextLaunchConditions" Overridable="yes">Vyhodnocování podmínek pro spuštění</String>
301 <String Id="ProgressTextMigrateFeatureStates" Overridable="yes">Migrace stavů součástí ze souvisejících aplikací</String>
302 <String Id="ProgressTextMigrateFeatureStatesTemplate" Overridable="yes">Aplikace: [1]</String>
303 <String Id="ProgressTextMoveFiles" Overridable="yes">Přesouvání souborů</String>
304 <String Id="ProgressTextMoveFilesTemplate" Overridable="yes">Soubor: [1], Adresář: [9], Velikost: [6]</String>
305 <String Id="ProgressTextPatchFiles" Overridable="yes">Oprava souborů</String>
306 <String Id="ProgressTextPatchFilesTemplate" Overridable="yes">Soubor: [1], Adresář: [2], Velikost: [3]</String>
307 <String Id="ProgressTextProcessComponents" Overridable="yes">Aktualizace registrace součástí</String>
308 <String Id="ProgressTextRegisterComPlus" Overridable="yes">Registrace aplikací a součástí modelu COM+</String>
309 <String Id="ProgressTextRegisterComPlusTemplate" Overridable="yes">ID aplikace: [1]{{, Typ aplikace: [2], Uživatelé: [3], RSN: [4]}}</String>
310 <String Id="ProgressTextRegisterFonts" Overridable="yes">Registrace písem</String>
311 <String Id="ProgressTextRegisterFontsTemplate" Overridable="yes">Písmo: [1]</String>
312 <String Id="ProgressTextRegisterProduct" Overridable="yes">Registrace produktu</String>
313 <String Id="ProgressTextRegisterProductTemplate" Overridable="yes">[1]</String>
314 <String Id="ProgressTextRegisterTypeLibraries" Overridable="yes">Registrace knihoven typů</String>
315 <String Id="ProgressTextRegisterTypeLibrariesTemplate" Overridable="yes">ID knihovny: [1]</String>
316 <String Id="ProgressTextRegisterUser" Overridable="yes">Registrace uživatele</String>
317 <String Id="ProgressTextRegisterUserTemplate" Overridable="yes">[1]</String>
318 <String Id="ProgressTextRemoveDuplicateFiles" Overridable="yes">Odebírání duplicitních souborů</String>
319 <String Id="ProgressTextRemoveDuplicateFilesTemplate" Overridable="yes">Soubor: [1], Adresář: [9]</String>
320 <String Id="ProgressTextRemoveEnvironmentStrings" Overridable="yes">Aktualizace řetězců prostředí</String>
321 <String Id="ProgressTextRemoveEnvironmentStringsTemplate" Overridable="yes">Název: [1], Hodnota: [2], Akce [3]</String>
322 <String Id="ProgressTextRemoveExistingProducts" Overridable="yes">Odebírání aplikací</String>
323 <String Id="ProgressTextRemoveExistingProductsTemplate" Overridable="yes">Aplikace: [1], Příkazový řádek: [2]</String>
324 <String Id="ProgressTextRemoveFiles" Overridable="yes">Odebírání souborů</String>
325 <String Id="ProgressTextRemoveFilesTemplate" Overridable="yes">Soubor: [1], Adresář: [9]</String>
326 <String Id="ProgressTextRemoveFolders" Overridable="yes">Odebírání složek</String>
327 <String Id="ProgressTextRemoveFoldersTemplate" Overridable="yes">Složka: [1]</String>
328 <String Id="ProgressTextRemoveIniValues" Overridable="yes">Odebírání záznamů v souborech INI</String>
329 <String Id="ProgressTextRemoveIniValuesTemplate" Overridable="yes">Soubor: [1], Oddíl: [2], Klíč: [3], Hodnota: [4]</String>
330 <String Id="ProgressTextRemoveODBC" Overridable="yes">Odebírání součástí rozhraní ODBC</String>
331 <String Id="ProgressTextRemoveRegistryValues" Overridable="yes">Odebírání hodnot ze systémového registru</String>
332 <String Id="ProgressTextRemoveRegistryValuesTemplate" Overridable="yes">Klíč: [1], Název: [2]</String>
333 <String Id="ProgressTextRemoveShortcuts" Overridable="yes">Odebírání zástupců</String>
334 <String Id="ProgressTextRemoveShortcutsTemplate" Overridable="yes">Zástupce: [1]</String>
335 <String Id="ProgressTextRMCCPSearch" Overridable="yes">Hledání opravňujících produktů</String>
336 <String Id="ProgressTextSelfRegModules" Overridable="yes">Registrace modulů</String>
337 <String Id="ProgressTextSelfRegModulesTemplate" Overridable="yes">Soubor: [1], Složka: [2]</String>
338 <String Id="ProgressTextSelfUnregModules" Overridable="yes">Rušení registrace modulů</String>
339 <String Id="ProgressTextSelfUnregModulesTemplate" Overridable="yes">Soubor: [1], Složka: [2]</String>
340 <String Id="ProgressTextSetODBCFolders" Overridable="yes">Inicializace adresářů rozhraní ODBC</String>
341 <String Id="ProgressTextStartServices" Overridable="yes">Spouštění služeb</String>
342 <String Id="ProgressTextStartServicesTemplate" Overridable="yes">Služba: [1]</String>
343 <String Id="ProgressTextStopServices" Overridable="yes">Zastavování služeb</String>
344 <String Id="ProgressTextStopServicesTemplate" Overridable="yes">Služba: [1]</String>
345 <String Id="ProgressTextUnpublishComponents" Overridable="yes">Rušení publikování kvalifikovaných součástí</String>
346 <String Id="ProgressTextUnpublishComponentsTemplate" Overridable="yes">ID součásti: [1], Kvalifikátor: [2]</String>
347 <String Id="ProgressTextUnpublishFeatures" Overridable="yes">Rušení publikování součástí produktu</String>
348 <String Id="ProgressTextUnpublishFeaturesTemplate" Overridable="yes">Součást: [1]</String>
349 <String Id="ProgressTextUnregisterClassInfo" Overridable="yes">Rušení registrace serverů tříd</String>
350 <String Id="ProgressTextUnregisterClassInfoTemplate" Overridable="yes">ID třídy: [1]</String>
351 <String Id="ProgressTextUnregisterComPlus" Overridable="yes">Rušení registrace aplikací a součástí modelu COM+</String>
352 <String Id="ProgressTextUnregisterComPlusTemplate" Overridable="yes">ID aplikace: [1]{{, Typ aplikace: [2]}}</String>
353 <String Id="ProgressTextUnregisterExtensionInfo" Overridable="yes">Rušení registrace serverů rozšíření</String>
354 <String Id="ProgressTextUnregisterExtensionInfoTemplate" Overridable="yes">Rozšíření: [1]</String>
355 <String Id="ProgressTextUnregisterFonts" Overridable="yes">Rušení registrace písem</String>
356 <String Id="ProgressTextUnregisterFontsTemplate" Overridable="yes">Písmo: [1]</String>
357 <String Id="ProgressTextUnregisterMIMEInfo" Overridable="yes">Rušení registrace informací MIME</String>
358 <String Id="ProgressTextUnregisterMIMEInfoTemplate" Overridable="yes">Typ obsahu MIME: [1], Rozšíření: [2]</String>
359 <String Id="ProgressTextUnregisterProgIdInfo" Overridable="yes">Rušení registrace identifikátorů programů</String>
360 <String Id="ProgressTextUnregisterProgIdInfoTemplate" Overridable="yes">ID programu: [1]</String>
361 <String Id="ProgressTextUnregisterTypeLibraries" Overridable="yes">Rušení registrace knihoven typů</String>
362 <String Id="ProgressTextUnregisterTypeLibrariesTemplate" Overridable="yes">ID knihovny: [1]</String>
363 <String Id="ProgressTextWriteEnvironmentStrings" Overridable="yes">Aktualizace řetězců prostředí</String>
364 <String Id="ProgressTextWriteEnvironmentStringsTemplate" Overridable="yes">Název: [1], Hodnota: [2], Akce [3]</String>
365 <String Id="ProgressTextWriteIniValues" Overridable="yes">Zápis hodnot do souborů INI</String>
366 <String Id="ProgressTextWriteIniValuesTemplate" Overridable="yes">Soubor: [1], Oddíl: [2], Klíč: [3], Hodnota: [4]</String>
367 <String Id="ProgressTextWriteRegistryValues" Overridable="yes">Zápis hodnot do systémového registru</String>
368 <String Id="ProgressTextWriteRegistryValuesTemplate" Overridable="yes">Klíč: [1], Název: [2], Hodnota: [3]</String>
369 <String Id="ProgressTextAdvertise" Overridable="yes">Inzerování aplikace</String>
370 <String Id="ProgressTextGenerateScript" Overridable="yes">Generování operací skriptu pro akci:</String>
371 <String Id="ProgressTextGenerateScriptTemplate" Overridable="yes">[1]</String>
372 <String Id="ProgressTextInstallSFPCatalogFile" Overridable="yes">Instalace systémového katalogu</String>
373 <String Id="ProgressTextInstallSFPCatalogFileTemplate" Overridable="yes">Soubor: [1], Závislosti: [2]</String>
374 <String Id="ProgressTextMsiPublishAssemblies" Overridable="yes">Publikování informací o sestavení</String>
375 <String Id="ProgressTextMsiPublishAssembliesTemplate" Overridable="yes">Kontext aplikace: [1], Název sestavení: [2]</String>
376 <String Id="ProgressTextMsiUnpublishAssemblies" Overridable="yes">Rušení publikování informací o sestavení</String>
377 <String Id="ProgressTextMsiUnpublishAssembliesTemplate" Overridable="yes">Kontext aplikace: [1], Název sestavení: [2]</String>
378 <String Id="ProgressTextRollback" Overridable="yes">Vracení akce:</String>
379 <String Id="ProgressTextRollbackTemplate" Overridable="yes">[1]</String>
380 <String Id="ProgressTextRollbackCleanup" Overridable="yes">Odebírání záložních souborů</String>
381 <String Id="ProgressTextRollbackCleanupTemplate" Overridable="yes">Soubor: [1]</String>
382 <String Id="ProgressTextUnmoveFiles" Overridable="yes">Odebírání přesunutých souborů</String>
383 <String Id="ProgressTextUnmoveFilesTemplate" Overridable="yes">Soubor: [1], Adresář: [9]</String>
384 <String Id="ProgressTextUnpublishProduct" Overridable="yes">Rušení publikování informací o produktu</String>
385
386 <String Id="Error0" Overridable="yes">{{Závažná chyba: }}</String>
387 <String Id="Error1" Overridable="yes">{{Chyba [1]}}</String>
388 <String Id="Error2" Overridable="yes">Upozornění: [1] </String>
389 <String Id="Error4" Overridable="yes">Informace: [1] </String>
390 <String Id="Error5" Overridable="yes">Instalační služba zjistila při instalaci tohoto balíčku neočekávanou chybu. Tato chyba může značit problém s tímto balíčkem. Kód chyby: [1]. {{Argumenty: [2], [3], [4]}}</String>
391 <String Id="Error7" Overridable="yes">{{Disk je plný: }}</String>
392 <String Id="Error8" Overridable="yes">Akce [Time]: [1]. [2]</String>
393 <String Id="Error9" Overridable="yes">[ProductName]</String>
394 <String Id="Error10" Overridable="yes">{[2]}{, [3]}{, [4]}</String>
395 <String Id="Error11" Overridable="yes">Typ zprávy: [1], Argument: [2]</String>
396 <String Id="Error12" Overridable="yes">=== Začátek protokolování: [Date] [Time] ===</String>
397 <String Id="Error13" Overridable="yes">=== Konec protokolování: [Date] [Time] ===</String>
398 <String Id="Error14" Overridable="yes">Začátek akce [Time]: [1]</String>
399 <String Id="Error15" Overridable="yes">Akce ukončena [Time]: [1]. Návratová hodnota: [2]</String>
400 <String Id="Error16" Overridable="yes">Zbývající čas: {[1] min }{[2] s}</String>
401 <String Id="Error17" Overridable="yes">Nedostatek paměti. Ukončete jiné aplikace a opakujte akci.</String>
402 <String Id="Error18" Overridable="yes">Instalační služba nereaguje.</String>
403 <String Id="Error19" Overridable="yes">Instalační služba byla předčasně ukončena.</String>
404 <String Id="Error20" Overridable="yes">Počkejte na dokončení konfigurace produktu [ProductName] v systému Windows.</String>
405 <String Id="Error21" Overridable="yes">Shromažďování požadovaných informací...</String>
406 <String Id="Error22" Overridable="yes">Odebírání starších verzí této aplikace...</String>
407 <String Id="Error23" Overridable="yes">Příprava na odebrání starších verzí této aplikace...</String>
408 <String Id="Error32" Overridable="yes">Instalace produktu {[ProductName] }byla úspěšně dokončena.</String>
409 <String Id="Error33" Overridable="yes">Instalace produktu {[ProductName] }se nezdařila.</String>
410 <String Id="Error1101" Overridable="yes">Při čtení souboru došlo k chybě: [2]. {{ Systémová chyba [3].}} Ověřte, zda soubor existuje a máte k němu přístup.</String>
411 <String Id="Error1301" Overridable="yes">Nelze vytvořit soubor [2]. Již existuje adresář s tímto názvem. Zrušte instalaci a pokuste se produkt nainstalovat do jiného umístění.</String>
412 <String Id="Error1302" Overridable="yes">Vložte disk [2].</String>
413 <String Id="Error1303" Overridable="yes">Instalační služba nemá dostatečná oprávnění pro přístup k tomuto adresáři: [2]. V instalaci nelze pokračovat. Přihlaste se jako správce nebo se obraťte na správce systému.</String>
414 <String Id="Error1304" Overridable="yes">Při pokusu o zápis do souboru došlo k chybě: [2]. Ověřte, zda máte přístup k tomuto adresáři.</String>
415 <String Id="Error1305" Overridable="yes">Při čtení souboru [2] došlo k chybě. {{ Systémová chyba [3].}} Ověřte, zda soubor existuje a máte k němu přístup.</String>
416 <String Id="Error1306" Overridable="yes">K souboru [2] má výhradní přístup jiná aplikace. Ukončete všechny ostatní aplikace a klikněte na tlačítko Opakovat.</String>
417 <String Id="Error1307" Overridable="yes">K instalaci tohoto souboru není na disku dostatek místa: [2]. Uvolněte místo na disku a klikněte na tlačítko Opakovat, nebo akci ukončete kliknutím na tlačítko Storno.</String>
418 <String Id="Error1308" Overridable="yes">Zdrojový soubor nebyl nalezen: [2]. Ověřte, zda soubor existuje a máte k němu přístup.</String>
419 <String Id="Error1309" Overridable="yes">Při čtení souboru došlo k chybě: [3]. {{ Systémová chyba [2].}} Ověřte, zda soubor existuje a máte k němu přístup.</String>
420 <String Id="Error1310" Overridable="yes">Při pokusu o zápis do souboru došlo k chybě: [3]. {{ Systémová chyba [2].}} Ověřte, zda máte přístup k tomuto adresáři.</String>
421 <String Id="Error1311" Overridable="yes">Zdrojový soubor nebyl nalezen{{(cabinet)}}: [2]. Ověřte, zda soubor existuje a máte k němu přístup.</String>
422 <String Id="Error1312" Overridable="yes">Nelze vytvořit adresář [2]. Soubor s tímto názvem již existuje. Přejmenujte ho nebo odeberte a klikněte na tlačítko Opakovat, nebo akci zrušte kliknutím na tlačítko Storno.</String>
423 <String Id="Error1313" Overridable="yes">Jednotka [2] je momentálně nedostupná. Vyberte jinou jednotku.</String>
424 <String Id="Error1314" Overridable="yes">Zadaná cesta [2] je nedostupná.</String>
425 <String Id="Error1315" Overridable="yes">Do zadané složky nelze zapisovat: [2].</String>
426 <String Id="Error1316" Overridable="yes">Při pokusu o čtení ze souboru došlo k chybě v síti: [2].</String>
427 <String Id="Error1317" Overridable="yes">Při pokusu o vytvoření adresáře došlo k chybě: [2].</String>
428 <String Id="Error1318" Overridable="yes">Při pokusu o vytvoření adresáře došlo k chybě v síti: [2].</String>
429 <String Id="Error1319" Overridable="yes">Při pokusu o otevření zdrojového souboru CAB došlo k chybě v síti: [2].</String>
430 <String Id="Error1320" Overridable="yes">Zadaná cesta je příliš dlouhá: [2].</String>
431 <String Id="Error1321" Overridable="yes">Instalační služba nemá dostatečná oprávnění ke změně tohoto souboru: [2].</String>
432 <String Id="Error1322" Overridable="yes">Některá část cesty ke složce [2] je neplatná. Buď je prázdná, nebo přesahuje délku povolenou v systému.</String>
433 <String Id="Error1323" Overridable="yes">Cesta ke složce [2] obsahuje slova, která nelze do cesty ke složce zadat.</String>
434 <String Id="Error1324" Overridable="yes">Cesta ke složce [2] obsahuje neplatný znak.</String>
435 <String Id="Error1325" Overridable="yes">[2] není platný krátký název souboru.</String>
436 <String Id="Error1326" Overridable="yes">Při načítání informací o zabezpečení souboru [3] došlo k chybě. GetLastError: [2]</String>
437 <String Id="Error1327" Overridable="yes">Jednotka [2] není platná.</String>
438 <String Id="Error1328" Overridable="yes">Při instalaci opravy souboru [2] došlo k chybě. Soubor byl pravděpodobně aktualizován jiným způsobem a tuto opravu již u něj nelze použít. Další informace získáte od dodavatele opravy. {{Systémová chyba: [3]}}</String>
439 <String Id="Error1329" Overridable="yes">Požadovaný soubor nelze nainstalovat, protože soubor CAB [2] není digitálně podepsán. Soubor CAB je zřejmě poškozený.</String>
440 <String Id="Error1330" Overridable="yes">Požadovaný soubor nelze nainstalovat, protože soubor CAB [2] obsahuje neplatný digitální podpis. Soubor CAB je zřejmě poškozený.{{ Funkce WinVerifyTrust vrátila chybu [3].}}</String>
441 <String Id="Error1331" Overridable="yes">Soubor [2] nelze správně zkopírovat: Došlo k chybě CRC.</String>
442 <String Id="Error1332" Overridable="yes">Soubor [2] nelze správně přesunout: Došlo k chybě CRC.</String>
443 <String Id="Error1333" Overridable="yes">Soubor [2] nelze správně opravit: Došlo k chybě CRC.</String>
444 <String Id="Error1334" Overridable="yes">Soubor [2] nelze nainstalovat, protože nebyl v souboru CAB [3] nalezen. Může se jednat o chybu v síti, chybu při čtení z disku CD-ROM nebo problém s tímto balíčkem.</String>
445 <String Id="Error1335" Overridable="yes">Soubor CAB [2] požadovaný k instalaci je poškozen a nelze jej použít. Může se jednat o chybu v síti, chybu při čtení z disku CD-ROM nebo problém s tímto balíčkem.</String>
446 <String Id="Error1336" Overridable="yes">Při vytváření dočasného souboru potřebného k dokončení instalace došlo k chybě.{{ Složka: [3]. Kód systémové chyby: [2]}}</String>
447 <String Id="Error1401" Overridable="yes">Nelze vytvořit klíč: [2]. {{ Systémová chyba [3].}} Zkontrolujte, zda máte dostatečná oprávnění k přístupu ke klíči, nebo se obraťte na pracovníky podpory. </String>
448 <String Id="Error1402" Overridable="yes">Nelze otevřít klíč: [2]. {{ Systémová chyba [3].}} Zkontrolujte, zda máte dostatečná oprávnění k přístupu ke klíči, nebo se obraťte na pracovníky podpory. </String>
449 <String Id="Error1403" Overridable="yes">Nelze odstranit hodnotu [2] z klíče [3]. {{ Systémová chyba [4].}} Zkontrolujte, zda máte dostatečná oprávnění k přístupu ke klíči, nebo se obraťte na pracovníky podpory. </String>
450 <String Id="Error1404" Overridable="yes">Klíč [2] nelze odstranit. {{ Systémová chyba [3].}} Zkontrolujte, zda máte dostatečná oprávnění k přístupu ke klíči, nebo se obraťte na pracovníky podpory. </String>
451 <String Id="Error1405" Overridable="yes">Nelze číst hodnotu [2] z klíče [3]. {{ Systémová chyba [4].}} Zkontrolujte, zda máte dostatečná oprávnění k přístupu ke klíči, nebo se obraťte na pracovníky podpory. </String>
452 <String Id="Error1406" Overridable="yes">Nelze zapsat hodnotu [2] do klíče [3]. {{ Systémová chyba [4].}} Ověřte, zda máte dostatečný přístup k tomuto klíči, nebo se obraťte na pracovníky podpory.</String>
453 <String Id="Error1407" Overridable="yes">Nelze získat názvy hodnot klíče [2]. {{ Systémová chyba [3].}} Ověřte, zda máte dostatečný přístup k tomuto klíči, nebo se obraťte na pracovníky podpory.</String>
454 <String Id="Error1408" Overridable="yes">Nelze získat názvy podklíčů klíče [2]. {{ Systémová chyba [3].}} Ověřte, zda máte dostatečný přístup k tomuto klíči, nebo se obraťte na pracovníky podpory.</String>
455 <String Id="Error1409" Overridable="yes">Nelze číst informace o zabezpečení klíče [2]. {{ Systémová chyba [3].}} Ověřte, zda máte dostatečný přístup k tomuto klíči, nebo se obraťte na pracovníky podpory.</String>
456 <String Id="Error1410" Overridable="yes">Nelze zvětšit dostupné místo v registru. Instalace této aplikace vyžaduje [2] kB volného místa v registru.</String>
457 <String Id="Error1500" Overridable="yes">Probíhá jiná instalace. Před pokračováním této instalace je nutné druhou instalaci dokončit.</String>
458 <String Id="Error1501" Overridable="yes">Při přístupu k zabezpečeným datům došlo k chybě. Zkontrolujte, zda je Instalační služba systému Windows správně nakonfigurovaná, a opakujte instalaci.</String>
459 <String Id="Error1502" Overridable="yes">Uživatelem [2] byla již dříve spuštěna instalace produktu [3]. Před použitím produktu je třeba, aby tento uživatel spustil instalaci znovu. Aktuální instalace bude nyní pokračovat.</String>
460 <String Id="Error1503" Overridable="yes">Uživatelem [2] byla již dříve spuštěna instalace produktu [3]. Před použitím produktu je třeba, aby tento uživatel spustil instalaci znovu.</String>
461 <String Id="Error1601" Overridable="yes">Nedostatek místa na disku – Jednotka: [2]; Požadované místo: [3] kB; Dostupné místo: [4] kB. Uvolněte místo na disku a opakujte akci.</String>
462 <String Id="Error1602" Overridable="yes">Opravdu chcete akci zrušit?</String>
463 <String Id="Error1603" Overridable="yes">Soubor [2][3] je používán{ tímto procesem: Název: [4], ID: [5], Název okna: [6]}. Ukončete tuto aplikaci a opakujte akci.</String>
464 <String Id="Error1604" Overridable="yes">Již je nainstalován produkt [2], který zabraňuje instalaci tohoto produktu. Tyto dva produkty nejsou kompatibilní.</String>
465 <String Id="Error1605" Overridable="yes">K pokračování instalace s možností obnovení není na jednotce [2] dostatek místa. Je vyžadováno [3] kB, ale k dispozici je pouze [4] kB. Kliknutím na tlačítko Ignorovat pokračujte v instalaci bez uložení informací pro obnovení, kliknutím na tlačítko Opakovat znovu zkontrolujte volné místo nebo kliknutím na tlačítko Storno instalaci ukončete.</String>
466 <String Id="Error1606" Overridable="yes">Nelze získat přístup k umístění v síti [2].</String>
467 <String Id="Error1607" Overridable="yes">Před pokračováním v instalaci je třeba ukončit tyto aplikace:</String>
468 <String Id="Error1608" Overridable="yes">V počítači nelze najít žádné z dříve nainstalovaných opravňujících produktů potřebných k instalaci tohoto produktu.</String>
469 <String Id="Error1609" Overridable="yes">Při nastavování zabezpečení došlo k chybě. [2] není platná skupina ani uživatel. Může jít o problém s tímto balíčkem nebo o problém při připojování k řadiči domény v síti. Zkontrolujte síťové připojení a klikněte na tlačítko Opakovat, nebo kliknutím na tlačítko Storno instalaci ukončete. {{Nelze zjistit identifikátor SID uživatele, systémová chyba [3].}}</String>
470 <String Id="Error1701" Overridable="yes">Klíč [2] není platný. Ověřte, zda jste zadali správný klíč.</String>
471 <String Id="Error1702" Overridable="yes">Před pokračováním konfigurace produktu [2] je třeba, aby instalační služba restartovala počítač. Kliknete-li na tlačítko Ano, bude počítač restartován ihned. Pokud chcete počítač restartovat později ručně, klikněte na tlačítko Ne.</String>
472 <String Id="Error1703" Overridable="yes">Aby se projevily změny konfigurace produktu [2], je nutné počítač restartovat. Kliknete-li na tlačítko Ano, bude počítač restartován ihned. Pokud chcete počítač restartovat později ručně, klikněte na tlačítko Ne.</String>
473 <String Id="Error1704" Overridable="yes">Instalace produktu [2] je pozastavena. Chcete-li pokračovat, je nutné vrátit zpět změny provedené při instalaci. Chcete tyto změny vrátit zpět?</String>
474 <String Id="Error1705" Overridable="yes">Probíhá předchozí instalace tohoto produktu. Chcete-li pokračovat, je nutné vrátit zpět změny provedené při instalaci. Chcete tyto změny vrátit zpět?</String>
475 <String Id="Error1706" Overridable="yes">Instalační balíček pro produkt [2] nebyl nalezen. Spusťte instalaci znovu pomocí platné kopie instalačního balíčku [3].</String>
476 <String Id="Error1707" Overridable="yes">Instalace byla úspěšně dokončena.</String>
477 <String Id="Error1708" Overridable="yes">Instalace se nezdařila.</String>
478 <String Id="Error1709" Overridable="yes">Produkt: [2] – [3]</String>
479 <String Id="Error1710" Overridable="yes">Můžete se rozhodnout obnovit původní stav počítače nebo pokračovat v instalaci později. Chcete obnovit původní stav počítače?</String>
480 <String Id="Error1711" Overridable="yes">Při zápisu informací o instalaci na disk došlo k chybě. Zkontrolujte, zda je k dispozici dostatek místa, a klikněte na tlačítko Opakovat, nebo kliknutím na tlačítko Storno ukončete instalaci.</String>
481 <String Id="Error1712" Overridable="yes">Jeden nebo více souborů potřebných pro obnovení předchozího stavu počítače nelze najít. Předchozí stav počítače nelze obnovit.</String>
482 <String Id="Error1713" Overridable="yes">[2] nemůže nainstalovat některý z požadovaných produktů. Obraťte se na pracovníky podpory. {{Systémová chyba: [3]}}</String>
483 <String Id="Error1714" Overridable="yes">Starší verzi produktu [2] nelze odebrat. Obraťte se na pracovníky podpory. {{Systémová chyba [3]}}</String>
484 <String Id="Error1715" Overridable="yes">Byl nainstalován produkt [2].</String>
485 <String Id="Error1716" Overridable="yes">Byl nakonfigurován produkt [2].</String>
486 <String Id="Error1717" Overridable="yes">Byl odebrán produkt [2].</String>
487 <String Id="Error1718" Overridable="yes">Soubor [2] byl na základě zásad digitálních podpisů odmítnut.</String>
488 <String Id="Error1719" Overridable="yes">Instalační služba systému Windows není přístupná. K tomuto problému může dojít, pokud je systém Windows spuštěn v nouzovém režimu nebo pokud není Instalační služba systému Windows správně nainstalována. Obraťte se na pracovníky podpory.</String>
489 <String Id="Error1720" Overridable="yes">Došlo k problému s tímto balíčkem Instalační služby systému Windows. Nelze spustit skript potřebný pro tuto instalaci. Obraťte se na pracovníky podpory nebo na dodavatele balíčku. {{Vlastní akce [2], chyba skriptu [3], [4]: [5] řádek [6], sloupec [7], [8] }}</String>
490 <String Id="Error1721" Overridable="yes">Došlo k problému s tímto balíčkem Instalační služby systému Windows. Nelze spustit program potřebný pro tuto instalaci. Obraťte se na pracovníky podpory nebo na dodavatele balíčku. {{Akce: [2], umístění: [3], příkaz: [4] }}</String>
491 <String Id="Error1722" Overridable="yes">Došlo k problému s tímto balíčkem Instalační služby systému Windows. Program spuštěný jako součást instalace nebyl ukončen očekávaným způsobem. Obraťte se na pracovníky podpory nebo na dodavatele balíčku. {{Akce [2], umístění: [3], příkaz: [4] }}</String>
492 <String Id="Error1723" Overridable="yes">Došlo k problému s tímto balíčkem Instalační služby systému Windows. Nelze spustit knihovnu DLL potřebnou k dokončení této instalace. Obraťte se na pracovníky podpory nebo na dodavatele balíčku. {{Akce [2], položka: [3], knihovna: [4] }}</String>
493 <String Id="Error1724" Overridable="yes">Odebrání proběhlo úspěšně.</String>
494 <String Id="Error1725" Overridable="yes">Odebrání se nezdařilo.</String>
495 <String Id="Error1726" Overridable="yes">Inzerování proběhlo úspěšně.</String>
496 <String Id="Error1727" Overridable="yes">Inzerování se nezdařilo.</String>
497 <String Id="Error1728" Overridable="yes">Konfigurace proběhla úspěšně.</String>
498 <String Id="Error1729" Overridable="yes">Konfigurace se nezdařila.</String>
499 <String Id="Error1730" Overridable="yes">Tuto aplikaci může odebrat pouze správce. Pokud chcete tuto aplikaci odebrat, přihlaste se jako správce nebo se obraťte na pracovníky technické podpory.</String>
500 <String Id="Error1731" Overridable="yes">Zdrojový instalační balíček pro produkt [2] není synchronizován s klientským balíčkem. Spusťte instalaci znovu pomocí platné kopie instalačního balíčku [3].</String>
501 <String Id="Error1732" Overridable="yes">Dokončení instalace produktu [2] vyžaduje restartování počítače. K tomuto počítači jsou přihlášeni další uživatelé. Restartování může způsobit ztrátu jejich dat. Chcete počítač restartovat nyní?</String>
502 <String Id="Error1801" Overridable="yes">Cesta [2] není platná. Zadejte platnou cestu.</String>
503 <String Id="Error1802" Overridable="yes">Nedostatek paměti. Ukončete jiné aplikace a opakujte akci.</String>
504 <String Id="Error1803" Overridable="yes">V jednotce [2] není disk. Vložte disk a klikněte na tlačítko Opakovat. Kliknutím na tlačítko Storno se vrátíte k předchozí vybrané jednotce.</String>
505 <String Id="Error1804" Overridable="yes">V jednotce [2] není disk. Vložte disk a klikněte na tlačítko Opakovat. Kliknutím na tlačítko Storno se vrátíte do předchozího dialogového okna, ve kterém můžete vybrat jinou jednotku.</String>
506 <String Id="Error1805" Overridable="yes">Složka [2] neexistuje. Zadejte cestu k existující složce.</String>
507 <String Id="Error1806" Overridable="yes">Nemáte dostatečná oprávnění ke čtení z této složky.</String>
508 <String Id="Error1807" Overridable="yes">Nelze určit platnou cílovou složku pro tuto instalaci.</String>
509 <String Id="Error1901" Overridable="yes">Při pokusu o čtení ze zdrojové instalační databáze došlo k chybě: [2].</String>
510 <String Id="Error1902" Overridable="yes">Plánování restartování počítače: Přejmenovávání souboru [2] na [3]. Operaci je třeba dokončit restartováním počítače.</String>
511 <String Id="Error1903" Overridable="yes">Plánování restartování počítače: Odstraňování souboru [2]. Operaci je třeba dokončit restartováním počítače.</String>
512 <String Id="Error1904" Overridable="yes">Modul [2] nelze zaregistrovat. HRESULT [3]. Obraťte se na pracovníky podpory.</String>
513 <String Id="Error1905" Overridable="yes">Nelze zrušit registraci modulu [2]. HRESULT [3]. Obraťte se na pracovníky podpory.</String>
514 <String Id="Error1906" Overridable="yes">Balíček [2] nelze zapsat do mezipaměti. Chyba: [3]. Obraťte se na pracovníky podpory.</String>
515 <String Id="Error1907" Overridable="yes">Písmo [2] nelze zaregistrovat. Ověřte, zda máte dostatečná oprávnění k instalaci písem a zda systém toto písmo podporuje.</String>
516 <String Id="Error1908" Overridable="yes">Nelze zrušit registraci písma [2]. Ověřte, zda máte dostatečná oprávnění k odebírání písem.</String>
517 <String Id="Error1909" Overridable="yes">Nelze vytvořit zástupce [2]. Ověřte, zda cílová složka existuje a máte k ní přístup.</String>
518 <String Id="Error1910" Overridable="yes">Nelze odebrat zástupce [2]. Ověřte, zda zástupce existuje a máte k němu přístup.</String>
519 <String Id="Error1911" Overridable="yes">Nelze zaregistrovat knihovnu typů pro soubor [2]. Obraťte se na pracovníky podpory.</String>
520 <String Id="Error1912" Overridable="yes">Nelze zrušit registraci knihovny typů pro soubor [2]. Obraťte se na pracovníky podpory.</String>
521 <String Id="Error1913" Overridable="yes">Nelze aktualizovat soubor INI [2][3]. Ověřte, zda soubor existuje a máte k němu přístup.</String>
522 <String Id="Error1914" Overridable="yes">Nelze naplánovat nahrazení souboru [3] souborem [2] při restartování počítače. Ověřte, zda máte oprávnění k zápisu do souboru [3].</String>
523 <String Id="Error1915" Overridable="yes">Při odebírání správce ovladačů ODBC došlo k chybě. Chyba rozhraní ODBC [2]: [3]. Obraťte se na pracovníky podpory.</String>
524 <String Id="Error1916" Overridable="yes">Při instalaci správce ovladačů ODBC došlo k chybě. Chyba rozhraní ODBC [2]: [3]. Obraťte se na pracovníky podpory.</String>
525 <String Id="Error1917" Overridable="yes">Při odebírání ovladače ODBC došlo k chybě: [4]. Chyba rozhraní ODBC [2]: [3]. Ověřte, zda máte dostatečná oprávnění k odebírání ovladačů ODBC.</String>
526 <String Id="Error1918" Overridable="yes">Při instalaci ovladače ODBC došlo k chybě: [4]. Chyba rozhraní ODBC [2]: [3]. Ověřte, zda soubor [4] existuje a máte k němu přístup.</String>
527 <String Id="Error1919" Overridable="yes">Při konfiguraci zdroje dat ODBC došlo k chybě: [4]. Chyba rozhraní ODBC [2]: [3]. Ověřte, zda soubor [4] existuje a máte k němu přístup.</String>
528 <String Id="Error1920" Overridable="yes">Službu [2] ([3]) nelze spustit. Ověřte, zda máte dostatečná oprávnění ke spouštění systémových služeb.</String>
529 <String Id="Error1921" Overridable="yes">Službu [2] ([3]) nelze zastavit. Ověřte, zda máte dostatečná oprávnění k zastavování systémových služeb.</String>
530 <String Id="Error1922" Overridable="yes">Službu [2] ([3]) nelze odstranit. Ověřte, zda máte dostatečná oprávnění k odebírání systémových služeb.</String>
531 <String Id="Error1923" Overridable="yes">Službu [2] ([3]) nelze nainstalovat. Ověřte, zda máte dostatečná oprávnění k instalaci systémových služeb.</String>
532 <String Id="Error1924" Overridable="yes">Nelze aktualizovat proměnnou prostředí [2]. Ověřte, zda máte dostatečná oprávnění ke změnám proměnných prostředí.</String>
533 <String Id="Error1925" Overridable="yes">Nemáte dostatečná oprávnění k dokončení této instalace pro všechny uživatele tohoto počítače. Přihlaste se jako správce a instalaci opakujte.</String>
534 <String Id="Error1926" Overridable="yes">Nelze nastavit zabezpečení souboru [3]. Chyba: [2]. Ověřte, zda máte dostatečná oprávnění ke změnám bezpečnostních oprávnění pro tento soubor.</String>
535 <String Id="Error1927" Overridable="yes">V tomto počítači není nainstalována Služba komponent (COM+ 1.0). K úspěšnému dokončení této instalace je vyžadována Služba komponent. Služba komponent je k dispozici v systému Windows 2000.</String>
536 <String Id="Error1928" Overridable="yes">Při registraci aplikace modelu COM+ došlo k chybě. Další informace získáte u pracovníků podpory.</String>
537 <String Id="Error1929" Overridable="yes">Při rušení registrace aplikace modelu COM+ došlo k chybě. Další informace získáte u pracovníků podpory.</String>
538 <String Id="Error1930" Overridable="yes">Popis služby [2] ([3]) nelze změnit.</String>
539 <String Id="Error1931" Overridable="yes">Instalační služba systému Windows nemůže aktualizovat systémový soubor [2], protože je chráněn systémem Windows. Pro správnou funkci programu bude zřejmě nutné aktualizovat operační systém. {{Verze balíčku: [3], Verze chráněná operačním systémem: [4]}}</String>
540 <String Id="Error1932" Overridable="yes">Instalační služba systému Windows nemůže aktualizovat soubor [2] chráněný systémem Windows. {{Verze balíčku: [3], Verze chráněná operačním systémem: [4], Chyba ochrany systémových souborů: [5]}}</String>
541 <String Id="Error1933" Overridable="yes">Instalační služba systému Windows nemůže aktualizovat nejméně jeden soubor chráněný systémem Windows. {{Chyba SFP: [2]. Seznam chráněných souborů:\r\n[3]}}</String>
542 <String Id="Error1934" Overridable="yes">Uživatelské instalace jsou zakázány prostřednictvím zásad tohoto počítače.</String>
543 <String Id="Error1935" Overridable="yes">Při instalaci sestavení [6] došlo k chybě. Další informace získáte v nápovědě nebo od pracovníků podpory. HRESULT: [3]. {{rozhraní sestavení: [4], funkce: [5], součást: [2]}}</String>
544 <String Id="Error1936" Overridable="yes">Při instalaci sestavení [6] došlo k chybě. Sestavení nemá silný název nebo není podepsáno klíčem o minimální délce. HRESULT: [3]. {{rozhraní sestavení: [4], funkce: [5], součást: [2]}}</String>
545 <String Id="Error1937" Overridable="yes">Při instalaci sestavení [6] došlo k chybě. Podpis nebo katalog nelze ověřit nebo není platný. HRESULT: [3]. {{rozhraní sestavení: [4], funkce: [5], součást: [2]}}</String>
546 <String Id="Error1938" Overridable="yes">Při instalaci sestavení [6] došlo k chybě. Nejméně jeden modul sestavení nelze najít. HRESULT: [3]. {{rozhraní sestavení: [4], funkce: [5], součást: [2]}}</String>
547
548 <String Id="UITextbytes" Overridable="yes">bajtů</String>
549 <String Id="UITextGB" Overridable="yes">GB</String>
550 <String Id="UITextKB" Overridable="yes">kB</String>
551 <String Id="UITextMB" Overridable="yes">MB</String>
552 <String Id="UITextMenuAbsent" Overridable="yes">Celá součást nebude dostupná.</String>
553 <String Id="UITextMenuAdvertise" Overridable="yes">Součást bude nainstalována při požadavku na její použití.</String>
554 <String Id="UITextMenuAllCD" Overridable="yes">Celá součást bude nainstalována pro spouštění z disku CD.</String>
555 <String Id="UITextMenuAllLocal" Overridable="yes">Celá součást bude nainstalována na místní pevný disk.</String>
556 <String Id="UITextMenuAllNetwork" Overridable="yes">Celá součást bude nainstalována pro spouštění ze sítě.</String>
557 <String Id="UITextMenuCD" Overridable="yes">Bude nainstalována pro spouštění z disku CD.</String>
558 <String Id="UITextMenuLocal" Overridable="yes">Bude nainstalována na místní pevný disk.</String>
559 <String Id="UITextMenuNetwork" Overridable="yes">Bude nainstalována pro spouštění ze sítě.</String>
560 <String Id="UITextNewFolder" Overridable="yes">Složka|Nová složka</String>
561 <String Id="UITextScriptInProgress" Overridable="yes">Shromažďování požadovaných informací...</String>
562 <String Id="UITextSelAbsentAbsent" Overridable="yes">Tato součást nebude nainstalována.</String>
563 <String Id="UITextSelAbsentAdvertise" Overridable="yes">Tato součást bude nainstalována při požadavku na její použití.</String>
564 <String Id="UITextSelAbsentCD" Overridable="yes">Tato součást bude nainstalována pro spouštění z disku CD.</String>
565 <String Id="UITextSelAbsentLocal" Overridable="yes">Tato součást bude nainstalována na místní pevný disk.</String>
566 <String Id="UITextSelAbsentNetwork" Overridable="yes">Tato součást bude nainstalována pro spouštění ze sítě.</String>
567 <String Id="UITextSelAdvertiseAbsent" Overridable="yes">Tato součást přestane být dostupná.</String>
568 <String Id="UITextSelAdvertiseAdvertise" Overridable="yes">Bude nainstalována při požadavku na její použití.</String>
569 <String Id="UITextSelAdvertiseCD" Overridable="yes">Tato součást bude nainstalována pro spouštění z disku CD.</String>
570 <String Id="UITextSelAdvertiseLocal" Overridable="yes">Tato součást bude nainstalována na místní pevný disk.</String>
571 <String Id="UITextSelAdvertiseNetwork" Overridable="yes">Tato součást bude nainstalována pro spouštění ze sítě.</String>
572 <String Id="UITextSelCDAbsent" Overridable="yes">Tato součást bude zcela odinstalována a nebude možné ji spustit z disku CD.</String>
573 <String Id="UITextSelCDAdvertise" Overridable="yes">Tato součást se změní tak, že nebude spouštěna z disku CD, ale bude nainstalována v případě požadavku na její použití.</String>
574 <String Id="UITextSelCDCD" Overridable="yes">Tato součást zůstane spustitelná z disku CD.</String>
575 <String Id="UITextSelCDLocal" Overridable="yes">Tato součást se změní tak, že nebude spouštěna z disku CD, ale bude nainstalována na místní pevný disk.</String>
576 <String Id="UITextSelChildCostNeg" Overridable="yes">Tato součást uvolní [1] na pevném disku.</String>
577 <String Id="UITextSelChildCostPos" Overridable="yes">Tato součást vyžaduje [1] na pevném disku.</String>
578 <String Id="UITextSelCostPending" Overridable="yes">Zjišťování nároků této součásti...</String>
579 <String Id="UITextSelLocalAbsent" Overridable="yes">Tato součást bude zcela odebrána.</String>
580 <String Id="UITextSelLocalAdvertise" Overridable="yes">Tato součást bude odebrána z místního pevného disku, ale bude nastavena tak, aby byla nainstalována v případě požadavku na její použití.</String>
581 <String Id="UITextSelLocalCD" Overridable="yes">Tato součást bude odebrána z místního pevného disku, ale bude ji nadále možné spustit z disku CD.</String>
582 <String Id="UITextSelLocalLocal" Overridable="yes">Tato součást zůstane na místním pevném disku.</String>
583 <String Id="UITextSelLocalNetwork" Overridable="yes">Tato součást bude odebrána z místního pevného disku, ale bude ji nadále možné spustit ze sítě.</String>
584 <String Id="UITextSelNetworkAbsent" Overridable="yes">Tato součást bude zcela odinstalována a nebude možné ji spustit ze sítě.</String>
585 <String Id="UITextSelNetworkAdvertise" Overridable="yes">Tato součást se změní tak, že nebude spouštěna ze sítě, ale bude nainstalována v případě požadavku na její použití.</String>
586 <String Id="UITextSelNetworkLocal" Overridable="yes">Tato součást se změní tak, že nebude spouštěna ze sítě, ale bude nainstalována na místní pevný disk.</String>
587 <String Id="UITextSelNetworkNetwork" Overridable="yes">Tato součást bude nadále spouštěna ze sítě.</String>
588 <String Id="UITextSelParentCostNegNeg" Overridable="yes">Tato součást uvolní [1] na pevném disku. Je pro ni vybráno [2] z [3] dílčích součástí. Tyto dílčí součásti uvolní [4] na pevném disku.</String>
589 <String Id="UITextSelParentCostNegPos" Overridable="yes">Tato součást uvolní [1] na pevném disku. Je pro ni vybráno [2] z [3] dílčích součástí. Tyto dílčí součásti vyžadují [4] na pevném disku.</String>
590 <String Id="UITextSelParentCostPosNeg" Overridable="yes">Tato součást vyžaduje [1] na pevném disku. Je pro ni vybráno [2] z [3] dílčích součástí. Tyto dílčí součásti uvolní [4] na pevném disku.</String>
591 <String Id="UITextSelParentCostPosPos" Overridable="yes">Tato součást vyžaduje [1] na pevném disku. Je pro ni vybráno [2] z [3] dílčích součástí. Tyto dílčí součásti vyžadují [4] na pevném disku.</String>
592 <String Id="UITextTimeRemaining" Overridable="yes">Zbývající čas: {[1] min }{[2] s}</String>
593 <String Id="UITextVolumeCostAvailable" Overridable="yes">K dispozici</String>
594 <String Id="UITextVolumeCostDifference" Overridable="yes">Rozdíl</String>
595 <String Id="UITextVolumeCostRequired" Overridable="yes">Vyžadováno</String>
596 <String Id="UITextVolumeCostSize" Overridable="yes">Velikost disku</String>
597 <String Id="UITextVolumeCostVolume" Overridable="yes">Svazek</String>
598</WixLocalization>
diff --git a/src/ext/UI/wixlib/WixUI_da-DK.wxl b/src/ext/UI/wixlib/WixUI_da-DK.wxl
new file mode 100644
index 00000000..64b7778d
--- /dev/null
+++ b/src/ext/UI/wixlib/WixUI_da-DK.wxl
@@ -0,0 +1,598 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3
4
5<WixLocalization Culture="da-dk" Codepage="1252" xmlns="http://wixtoolset.org/schemas/v4/wxl">
6 <String Id="WixUIBack" Overridable="yes">&amp;Tilbage</String>
7 <String Id="WixUINext" Overridable="yes">&amp;Næste</String>
8 <String Id="WixUICancel" Overridable="yes">Annuller</String>
9 <String Id="WixUIFinish" Overridable="yes">&amp;Udfør</String>
10 <String Id="WixUIRetry" Overridable="yes">&amp;Prøv igen</String>
11 <String Id="WixUIIgnore" Overridable="yes">&amp;Ignorer</String>
12 <String Id="WixUIYes" Overridable="yes">&amp;Ja</String>
13 <String Id="WixUINo" Overridable="yes">&amp;Nej</String>
14 <String Id="WixUIOK" Overridable="yes">OK</String>
15 <String Id="WixUIPrint" Overridable="yes">&amp;Udskriv</String>
16
17 <String Id="AdvancedWelcomeEulaDlg_Title" Overridable="yes">[ProductName] Installation</String>
18 <String Id="AdvancedWelcomeEulaDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
19 <String Id="AdvancedWelcomeEulaDlgTitle" Overridable="yes">{\WixUI_Font_Title}Læs licensaftalen til [ProductName]</String>
20 <String Id="AdvancedWelcomeEulaDlgLicenseAcceptedCheckBox" Overridable="yes">Jeg &amp;accepterer vilkårene i licensaftalen</String>
21 <String Id="AdvancedWelcomeEulaDlgDescriptionPerMachine" Overridable="yes">Klik på Installer for at installere produktet med standardindstillingerne for alle brugere. Klik på Avanceret for at ændre installationsindstillingerne.</String>
22 <String Id="AdvancedWelcomeEulaDlgDescriptionPerUser" Overridable="yes">Klik på Installer for at installere produktet med standardindstillingerne kun for dig. Klik på Avanceret for at ændre installationsindstillingerne.</String>
23 <String Id="AdvancedWelcomeEulaDlgInstall" Overridable="yes">&amp;Installer</String>
24 <String Id="AdvancedWelcomeEulaDlgAdvanced" Overridable="yes">A&amp;vanceret</String>
25 <String Id="Advanced_Font_Normal_Size" Overridable="yes">8</String>
26 <String Id="Advanced_Font_Bigger_Size" Overridable="yes">12</String>
27 <String Id="Advanced_Font_Title_Size" Overridable="yes">9</String>
28 <String Id="Advanced_Font_Emphasized_Size" Overridable="yes">8</String>
29 <String Id="Advanced_Font_FaceName" Overridable="yes">Tahoma</String>
30
31 <String Id="BrowseDlg_Title" Overridable="yes">[ProductName] Installation</String>
32 <String Id="BrowseDlgComboLabel" Overridable="yes">&amp;Søg i:</String>
33 <String Id="BrowseDlgWixUI_Bmp_Up" Overridable="yes">WixUI_Bmp_Up</String>
34 <String Id="BrowseDlgWixUI_Bmp_UpTooltip" Overridable="yes">Ét niveau op</String>
35 <String Id="BrowseDlgNewFolder" Overridable="yes">WixUI_Bmp_New</String>
36 <String Id="BrowseDlgNewFolderTooltip" Overridable="yes">Opret en ny mappe</String>
37 <String Id="BrowseDlgPathLabel" Overridable="yes">&amp;Mappenavn:</String>
38 <String Id="BrowseDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
39 <String Id="BrowseDlgDescription" Overridable="yes">Gå til destinationsmappen</String>
40 <String Id="BrowseDlgTitle" Overridable="yes">{\WixUI_Font_Title}Skift destinationsmappe</String>
41
42 <String Id="CancelDlg_Title" Overridable="yes">[ProductName] Installation</String>
43 <String Id="CancelDlgText" Overridable="yes">Er du sikker på, at du vil annullere installationen af [ProductName]?</String>
44 <String Id="CancelDlgIcon" Overridable="yes">WixUI_Ico_Info</String>
45 <String Id="CancelDlgIconTooltip" Overridable="yes">Oplysningsikon</String>
46
47 <String Id="CustomizeDlg_Title" Overridable="yes">[ProductName] Installation</String>
48 <String Id="CustomizeDlgTree" Overridable="yes">Trævisning for markerede elementer</String>
49 <String Id="CustomizeDlgBrowse" Overridable="yes">&amp;Gennemse...</String>
50 <String Id="CustomizeDlgReset" Overridable="yes">Nul&amp;stil</String>
51 <String Id="CustomizeDlgDiskCost" Overridable="yes">Disk&amp;forbrug</String>
52 <String Id="CustomizeDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
53 <String Id="CustomizeDlgText" Overridable="yes">Klik på ikonerne i træstrukturen nedenfor for at ændre den måde, som funktioner installeres på.</String>
54 <String Id="CustomizeDlgDescription" Overridable="yes">Vælg den måde, som funktionerne skal installeres på.</String>
55 <String Id="CustomizeDlgTitle" Overridable="yes">{\WixUI_Font_Title}Brugerdefineret installation</String>
56 <String Id="CustomizeDlgItemDescription" Overridable="yes">CustomizeDlgItemDescription-CustomizeDlgItemDescription</String>
57 <String Id="CustomizeDlgItemSize" Overridable="yes">CustomizeDlgItemSize-CustomizeDlgItemSize</String>
58 <String Id="CustomizeDlgLocation" Overridable="yes">CustomizeDlgLocation-CustomizeDlgLocation</String>
59 <String Id="CustomizeDlgLocationLabel" Overridable="yes">Sted:</String>
60
61 <String Id="DiskCostDlg_Title" Overridable="yes">[ProductName] Installation</String>
62 <String Id="DiskCostDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
63 <String Id="DiskCostDlgText" Overridable="yes">De markerede diskenheder har ikke nok ledig diskplads til de valgte funktioner. Du kan vælge at fjerne nogle filer fra de markerede diskenheder, installere færre funktioner eller vælge et andet destinationsdrev.</String>
64 <String Id="DiskCostDlgDescription" Overridable="yes">Den krævede diskplads til installationen af de markerede funktioner.</String>
65 <String Id="DiskCostDlgTitle" Overridable="yes">{\WixUI_Font_Title}Krav til diskplads</String>
66 <String Id="DiskCostDlgVolumeList" Overridable="yes">{120}{70}{70}{70}{70}</String>
67
68 <String Id="ErrorDlg_Title" Overridable="yes">[ProductName] Installation</String>
69 <String Id="ErrorDlgErrorText" Overridable="yes">Oplysningstekst</String>
70 <String Id="ErrorDlgErrorIcon" Overridable="yes">WixUI_Ico_Info</String>
71 <String Id="ErrorDlgErrorIconTooltip" Overridable="yes">Oplysningsikon</String>
72
73 <String Id="ExitDialog_Title" Overridable="yes">[ProductName] Installation</String>
74 <String Id="ExitDialogBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
75 <String Id="ExitDialogDescription" Overridable="yes">Klik på knappen Udfør for at afslutte guiden Installation.</String>
76 <String Id="ExitDialogTitle" Overridable="yes">{\WixUI_Font_Bigger}Guiden [ProductName] Installation er fuldført</String>
77
78 <String Id="FatalError_Title" Overridable="yes">[ProductName] Installation</String>
79 <String Id="FatalErrorBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
80 <String Id="FatalErrorTitle" Overridable="yes">{\WixUI_Font_Bigger}Installationsprogrammet til [ProductName] blev afsluttet før tid</String>
81 <String Id="FatalErrorDescription1" Overridable="yes">Guiden [ProductName] Installation blev afsluttet før tid på grund af en fejl. Systemet er ikke blevet ændret. Hvis du vil installere programmet på et senere tidspunkt, skal du køre guiden Installation igen.</String>
82 <String Id="FatalErrorDescription2" Overridable="yes">Klik på knappen Udfør for at afslutte guiden Installation.</String>
83
84 <String Id="FeaturesDlg_Title" Overridable="yes">[ProductName] Installation</String>
85 <String Id="FeaturesDlgTree" Overridable="yes">Produktfunktioner</String>
86 <String Id="FeaturesDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
87 <String Id="FeaturesDlgDescription" Overridable="yes">Vælg den måde, som funktionerne skal installeres på.</String>
88 <String Id="FeaturesDlgTitle" Overridable="yes">{\WixUI_Font_Title}Produktfunktioner</String>
89 <String Id="FeaturesDlgItemDescription" Overridable="yes">FeaturesDlgItemDescription</String>
90 <String Id="FeaturesDlgItemSize" Overridable="yes">FeaturesDlgItemSize</String>
91 <String Id="FeaturesDlgInstall" Overridable="yes">&amp;Installer</String>
92 <String Id="FeaturesDlgChange" Overridable="yes">&amp;Skift</String>
93
94 <String Id="FilesInUse_Title" Overridable="yes">[ProductName] Installation</String>
95 <String Id="FilesInUseExit" Overridable="yes">&amp;Afslut</String>
96 <String Id="FilesInUseBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
97 <String Id="FilesInUseText" Overridable="yes">Følgende programmer bruger filer, der skal opdateres af installationsprogrammet. Luk programmerne, og klik derefter på &amp;Prøv igen for at fortsætte installationen, eller klik på Afslut for at afslutte den.</String>
98 <String Id="FilesInUseDescription" Overridable="yes">Visse filer, som skal opdateres, er i brug.</String>
99 <String Id="FilesInUseTitle" Overridable="yes">{\WixUI_Font_Title}Filer, der er i brug</String>
100
101 <String Id="InstallDirDlg_Title" Overridable="yes">[ProductName] Installation</String>
102 <String Id="InstallDirDlgChange" Overridable="yes">&amp;Skift...</String>
103 <String Id="InstallDirDlgTitle" Overridable="yes">{\WixUI_Font_Title}Destinationsmappe</String>
104 <String Id="InstallDirDlgDescription" Overridable="yes">Klik på Næste for at installere i standardmappen, eller klik på Skift for at vælge en anden mappe.</String>
105 <String Id="InstallDirDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
106 <String Id="InstallDirDlgFolderLabel" Overridable="yes">Installer [ProductName] i:</String>
107
108 <String Id="InstallScopeDlg_Title" Overridable="yes">[ProductName] Installation</String>
109 <String Id="InstallScopeDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
110 <String Id="InstallScopeDlgDescription" Overridable="yes">Vælg installationsområde og -mappe</String>
111 <String Id="InstallScopeDlgTitle" Overridable="yes">{\WixUI_Font_Title}Installationsområde</String>
112 <String Id="InstallScopeDlgPerUser" Overridable="yes">{\WixUI_Font_Emphasized}Installer &amp;kun for dig ([LogonUser])</String>
113 <String Id="InstallScopeDlgPerUserDescription" Overridable="yes">[ProductName] installeres i en mappe pr. bruger og er kun tilgængelig for din brugerkonto. Du behøver ikke lokale administratorrettigheder.</String>
114 <String Id="InstallScopeDlgNoPerUserDescription" Overridable="yes">[ProductName] understøtter ikke installation pr. bruger.</String>
115 <String Id="InstallScopeDlgPerMachine" Overridable="yes">{\WixUI_Font_Emphasized}Installer for alle brugere på denne &amp;computer</String>
116 <String Id="InstallScopeDlgPerMachineDescription" Overridable="yes">[ProductName] installeres som standard i en mappe pr. computer og er tilgængelig for alle brugere. Du kan ændre standardinstallationsmappen. Du skal have lokale administratorrettigheder.</String>
117 <String Id="InstallScopeDlgFolderLabel" Overridable="yes">Installations&amp;mappe:</String>
118 <String Id="InstallScopeDlgChange" Overridable="yes">&amp;Skift...</String>
119
120 <String Id="InvalidDirDlg_Title" Overridable="yes">[ProductName] Installation</String>
121 <String Id="InvalidDirDlgText" Overridable="yes">Installationsmappen skal være på en lokal harddisk.</String>
122 <String Id="InvalidDirDlgIcon" Overridable="yes">WixUI_Ico_Info</String>
123 <String Id="InvalidDirDlgIconTooltip" Overridable="yes">Oplysningsikon</String>
124
125 <String Id="LicenseAgreementDlg_Title" Overridable="yes">[ProductName] Installation</String>
126 <String Id="LicenseAgreementDlgLicenseAcceptedCheckBox" Overridable="yes">Jeg &amp;accepterer vilkårene i licensaftalen</String>
127 <String Id="LicenseAgreementDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
128 <String Id="LicenseAgreementDlgDescription" Overridable="yes">Læs følgende licensaftale grundigt</String>
129 <String Id="LicenseAgreementDlgTitle" Overridable="yes">{\WixUI_Font_Title}Slutbrugerlicensaftale</String>
130
131 <String Id="MaintenanceTypeDlg_Title" Overridable="yes">[ProductName] Installation</String>
132 <String Id="MaintenanceTypeDlgChangeButton" Overridable="yes">&amp;Skift</String>
133 <String Id="MaintenanceTypeDlgChangeButtonTooltip" Overridable="yes">Skift installationen</String>
134 <String Id="MaintenanceTypeDlgRepairButton" Overridable="yes">Re&amp;parer</String>
135 <String Id="MaintenanceTypeDlgRepairButtonTooltip" Overridable="yes">Reparer installationen</String>
136 <String Id="MaintenanceTypeDlgRemoveButton" Overridable="yes">&amp;Fjern</String>
137 <String Id="MaintenanceTypeDlgRemoveButtonTooltip" Overridable="yes">Fjern installationen</String>
138 <String Id="MaintenanceTypeDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
139 <String Id="MaintenanceTypeDlgDescription" Overridable="yes">Vælg den handling, som du vil udføre.</String>
140 <String Id="MaintenanceTypeDlgTitle" Overridable="yes">{\WixUI_Font_Title}Skift, reparer eller fjern installationen</String>
141 <String Id="MaintenanceTypeDlgChangeText" Overridable="yes">Gør det muligt at ændre den måde, som funktioner installeres på.</String>
142 <String Id="MaintenanceTypeDlgChangeDisabledText" Overridable="yes">[ProductName] indeholder ikke nogen funktioner, der kan vælges separat.</String>
143 <String Id="MaintenanceTypeDlgRemoveText" Overridable="yes">Fjerner [ProductName] fra computeren.</String>
144 <String Id="MaintenanceTypeDlgRemoveDisabledText" Overridable="yes">[ProductName] kan ikke fjernes.</String>
145 <String Id="MaintenanceTypeDlgRepairText" Overridable="yes">Reparerer fejl i den seneste installation ved at rette manglende og fejlbehæftede filer, genveje og poster i registreringsdatabasen.</String>
146 <String Id="MaintenanceTypeDlgRepairDisabledText" Overridable="yes">[ProductName] kan ikke repareres.</String>
147
148 <String Id="MaintenanceWelcomeDlg_Title" Overridable="yes">[ProductName] Installation</String>
149 <String Id="MaintenanceWelcomeDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
150 <String Id="MaintenanceWelcomeDlgDescription" Overridable="yes">Guiden Installation gør det muligt at ændre den måde, som funktioner i [ProductName] installeres på computeren på. Du kan også bruge guiden til at fjerne programmet fra computeren. Klik på Næste for at fortsætte, eller klik på Annuller for at afslutte guiden Installation.</String>
151 <String Id="MaintenanceWelcomeDlgTitle" Overridable="yes">{\WixUI_Font_Bigger}Velkommen til guiden [ProductName] Installation</String>
152
153 <String Id="MsiRMFilesInUse_Title" Overridable="yes">[ProductName] Installation</String>
154 <String Id="MsiRMFilesInUseBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
155 <String Id="MsiRMFilesInUseText" Overridable="yes">Følgende programmer bruger filer, der skal opdateres af installationsprogrammet. Du kan lade guiden Installation lukke dem og forsøge at genstarte dem eller genstarte computeren på et senere tidspunkt.</String>
156 <String Id="MsiRMFilesInUseDescription" Overridable="yes">Visse filer, som skal opdateres, er i brug.</String>
157 <String Id="MsiRMFilesInUseTitle" Overridable="yes">{\WixUI_Font_Title}Filer, der bruges</String>
158 <String Id="MsiRMFilesInUseUseRM" Overridable="yes">&amp;Luk programmerne, og forsøg at genstarte dem.</String>
159 <String Id="MsiRMFilesInUseDontUseRM" Overridable="yes">&amp;Luk ikke programmerne. Det er nødvendigt at genstarte.</String>
160
161 <String Id="OutOfDiskDlg_Title" Overridable="yes">[ProductName] Installation</String>
162 <String Id="OutOfDiskDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
163 <String Id="OutOfDiskDlgText" Overridable="yes">De markerede diskenheder har ikke nok ledig diskplads til de valgte funktioner. Du kan vælge at fjerne nogle filer fra de markerede diskenheder, installere færre funktioner eller vælge et andet destinationsdrev.</String>
164 <String Id="OutOfDiskDlgDescription" Overridable="yes">Installationen kræver mere diskplads, end der er til ledigt.</String>
165 <String Id="OutOfDiskDlgTitle" Overridable="yes">{\WixUI_Font_Title}Der er ikke mere ledig diskplads</String>
166 <String Id="OutOfDiskDlgVolumeList" Overridable="yes">{120}{70}{70}{70}{70}</String>
167
168 <String Id="OutOfRbDiskDlg_Title" Overridable="yes">[ProductName] Installation</String>
169 <String Id="OutOfRbDiskDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
170 <String Id="OutOfRbDiskDlgText" Overridable="yes">De markerede diskenheder har ikke nok ledig diskplads til de valgte funktioner. Du kan vælge at fjerne nogle filer fra de markerede diskenheder, installere færre funktioner eller vælge et andet destinationsdrev.</String>
171 <String Id="OutOfRbDiskDlgDescription" Overridable="yes">Installationen kræver mere diskplads, end der er til rådighed.</String>
172 <String Id="OutOfRbDiskDlgTitle" Overridable="yes">{\WixUI_Font_Title}Der er ikke mere ledig diskplads</String>
173 <String Id="OutOfRbDiskDlgVolumeList" Overridable="yes">{120}{70}{70}{70}{70}</String>
174 <String Id="OutOfRbDiskDlgText2" Overridable="yes">Du kan også vælge at deaktivere funktionen til annullering af opdateringen i installationsprogrammet. Hvis du deaktiverer annulleringen af opdateringen, forhindrer det, at installationsprogrammet gendanner computerens oprindelige tilstand, hvis installationen afbrydes. Klik på Ja, hvis du vil løbe risikoen ved at deaktivere annulleringen af opdateringen.</String>
175
176 <String Id="PrepareDlg_Title" Overridable="yes">[ProductName] Installation</String>
177 <String Id="PrepareDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
178 <String Id="PrepareDlgDescription" Overridable="yes">Vent, mens guiden Installation forbereder at vejlede dig gennem installationen.</String>
179 <String Id="PrepareDlgTitle" Overridable="yes">{\WixUI_Font_Bigger}Velkommen til guiden [ProductName] Installation</String>
180
181 <String Id="ProgressDlg_Title" Overridable="yes">[ProductName] Installation</String>
182 <String Id="ProgressDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
183 <String Id="ProgressDlgTextInstalling" Overridable="yes">Vent, mens guiden Installation installerer [ProductName].</String>
184 <String Id="ProgressDlgTitleInstalling" Overridable="yes">{\WixUI_Font_Title}Installerer [ProductName]</String>
185 <String Id="ProgressDlgTextChanging" Overridable="yes">Vent, mens guiden Installation ændrer [ProductName].</String>
186 <String Id="ProgressDlgTitleChanging" Overridable="yes">{\WixUI_Font_Title}Ændrer [ProductName]</String>
187 <String Id="ProgressDlgTextRepairing" Overridable="yes">Vent, mens guiden Installation reparerer [ProductName].</String>
188 <String Id="ProgressDlgTitleRepairing" Overridable="yes">{\WixUI_Font_Title}Reparerer [ProductName]</String>
189 <String Id="ProgressDlgTextRemoving" Overridable="yes">Vent, mens guiden Installation fjerner [ProductName].</String>
190 <String Id="ProgressDlgTitleRemoving" Overridable="yes">{\WixUI_Font_Title}Fjerner [ProductName]</String>
191 <String Id="ProgressDlgTextUpdating" Overridable="yes">Vent, mens guiden Installation opdaterer [ProductName].</String>
192 <String Id="ProgressDlgTitleUpdating" Overridable="yes">{\WixUI_Font_Title}Opdaterer [ProductName]</String>
193 <String Id="ProgressDlgProgressBar" Overridable="yes">Udførelsesstatus</String>
194 <String Id="ProgressDlgStatusLabel" Overridable="yes">Status:</String>
195
196 <String Id="ResumeDlg_Title" Overridable="yes">[ProductName] Installation</String>
197 <String Id="ResumeDlgInstall" Overridable="yes">&amp;Installer</String>
198 <String Id="ResumeDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
199 <String Id="ResumeDlgDescription" Overridable="yes">Guiden Installation fuldfører installationen af [ProductName] på computeren. Klik på Installer for at fortsætte, eller klik på Annuller for at afslutte guiden Installation.</String>
200 <String Id="ResumeDlgTitle" Overridable="yes">{\WixUI_Font_Bigger}Fortsætter guiden [ProductName] Installation</String>
201
202 <String Id="SetupTypeDlg_Title" Overridable="yes">[ProductName] Installation</String>
203 <String Id="SetupTypeDlgTypicalButton" Overridable="yes">&amp;Standard</String>
204 <String Id="SetupTypeDlgTypicalButtonTooltip" Overridable="yes">Standardinstallation</String>
205 <String Id="SetupTypeDlgCustomButton" Overridable="yes">&amp;Brugerdefineret</String>
206 <String Id="SetupTypeDlgCustomButtonTooltip" Overridable="yes">Brugerdefineret installation</String>
207 <String Id="SetupTypeDlgCompleteButton" Overridable="yes">&amp;Fuld</String>
208 <String Id="SetupTypeDlgCompleteButtonTooltip" Overridable="yes">Fuld installation</String>
209 <String Id="SetupTypeDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
210 <String Id="SetupTypeDlgTitle" Overridable="yes">{\WixUI_Font_Title}Vælg installationstype</String>
211 <String Id="SetupTypeDlgDescription" Overridable="yes">Vælg den installationstype, som passer bedst til dine behov</String>
212 <String Id="SetupTypeDlgTypicalText" Overridable="yes">Installerer de mest almindelige programfunktioner. Anbefales til de fleste brugere.</String>
213 <String Id="SetupTypeDlgCustomText" Overridable="yes">Giver brugerne mulighed for at vælge, hvilke programfunktioner der installeres, og hvor de installeres. Anbefales til avancerede brugere.</String>
214 <String Id="SetupTypeDlgCompleteText" Overridable="yes">Alle programfunktioner installeres. Kræver mest diskplads.</String>
215
216 <String Id="UserExit_Title" Overridable="yes">[ProductName] Installation</String>
217 <String Id="UserExitBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
218 <String Id="UserExitTitle" Overridable="yes">{\WixUI_Font_Bigger}Guiden [ProductName] Installation blev afbrudt</String>
219 <String Id="UserExitDescription1" Overridable="yes">Installationen af [ProductName] blev afbrudt. Systemet er ikke blevet ændret. Hvis du vil installere programmet på et senere tidspunkt, skal du køre installationsprogrammet igen.</String>
220 <String Id="UserExitDescription2" Overridable="yes">Klik på knappen Udfør for at afslutte guiden Installation.</String>
221
222 <String Id="VerifyReadyDlg_Title" Overridable="yes">[ProductName] Installation</String>
223 <String Id="VerifyReadyDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
224 <String Id="VerifyReadyDlgInstall" Overridable="yes">&amp;Installer</String>
225 <String Id="VerifyReadyDlgInstallText" Overridable="yes">Klik på Installer for at starte installationen. Klik på Tilbage for at gennemgå eller ændre installationsindstillingerne. Klik på Annuller for at afslutte guiden.</String>
226 <String Id="VerifyReadyDlgInstallTitle" Overridable="yes">{\WixUI_Font_Title}Klar til at installere [ProductName]</String>
227 <String Id="VerifyReadyDlgChange" Overridable="yes">&amp;Skift</String>
228 <String Id="VerifyReadyDlgChangeText" Overridable="yes">Klik på Skift for at starte installationen. Klik på Tilbage for at gennemgå eller ændre installationsindstillingerne. Klik på Annuller for at afslutte guiden.</String>
229 <String Id="VerifyReadyDlgChangeTitle" Overridable="yes">{\WixUI_Font_Title}Klar til at ændre [ProductName]</String>
230 <String Id="VerifyReadyDlgRepair" Overridable="yes">Re&amp;parer</String>
231 <String Id="VerifyReadyDlgRepairText" Overridable="yes">Klik på Reparer for at reparere installationen af [ProductName]. Klik på Tilbage for at gennemgå eller ændre installationsindstillingerne. Klik på Annuller for at afslutte guiden.</String>
232 <String Id="VerifyReadyDlgRepairTitle" Overridable="yes">{\WixUI_Font_Title}Klar til at reparere [ProductName]</String>
233 <String Id="VerifyReadyDlgRemove" Overridable="yes">&amp;Fjern</String>
234 <String Id="VerifyReadyDlgRemoveText" Overridable="yes">Klik på Fjern for at fjerne [ProductName] fra computeren. Klik på Tilbage for at gennemgå eller ændre installationsindstillingerne. Klik på Annuller for at afslutte guiden.</String>
235 <String Id="VerifyReadyDlgRemoveTitle" Overridable="yes">{\WixUI_Font_Title}Klar til at fjerne [ProductName]</String>
236 <String Id="VerifyReadyDlgUpdate" Overridable="yes">&amp;Opdater</String>
237 <String Id="VerifyReadyDlgUpdateText" Overridable="yes">Klik på Opdater for at opdatere [ProductName] på computeren. Klik på Tilbage for at gennemgå eller ændre installationsindstillingerne. Klik på Annuller for at afslutte guiden.</String>
238 <String Id="VerifyReadyDlgUpdateTitle" Overridable="yes">{\WixUI_Font_Title}Klar til at opdatere [ProductName]</String>
239
240 <String Id="WaitForCostingDlg_Title" Overridable="yes">[ProductName] Installation</String>
241 <String Id="WaitForCostingDlgReturn" Overridable="yes">&amp;Tilbage</String>
242 <String Id="WaitForCostingDlgText" Overridable="yes">Vent, mens installationsprogrammet bestemmer kravene til diskplads.</String>
243 <String Id="WaitForCostingDlgIcon" Overridable="yes">WixUI_Ico_Exclam</String>
244 <String Id="WaitForCostingDlgIconTooltip" Overridable="yes">Ikon for udråbstegn</String>
245
246 <String Id="WelcomeDlg_Title" Overridable="yes">[ProductName] Installation</String>
247 <String Id="WelcomeDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
248 <String Id="WelcomeDlgDescription" Overridable="yes">Guiden Installation installerer [ProductName] på computeren. Klik på Næste for at fortsætte, eller klik på Annuller for at afslutte guiden Installation.</String>
249 <String Id="WelcomeUpdateDlgDescriptionUpdate" Overridable="yes">Guiden Installation opdaterer [ProductName] på computeren. Klik på Næste for at fortsætte, eller klik på Annuller for at afslutte guiden Installation.</String>
250 <String Id="WelcomeDlgTitle" Overridable="yes">{\WixUI_Font_Bigger}Velkommen til guiden [ProductName] Installation</String>
251
252 <String Id="WelcomeEulaDlg_Title" Overridable="yes">[ProductName] Installation</String>
253 <String Id="WelcomeEulaDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
254 <String Id="WelcomeEulaDlgLicenseAcceptedCheckBox" Overridable="yes">Jeg &amp;accepterer vilkårene i licensaftalen</String>
255 <String Id="WelcomeEulaDlgInstall" Overridable="yes">&amp;Installer</String>
256 <String Id="WelcomeEulaDlgUpdate" Overridable="yes">&amp;Opdater</String>
257 <String Id="WelcomeEulaDlgTitle" Overridable="yes">{\WixUI_Font_Title}Læs licensaftalen til [ProductName]</String>
258
259 <String Id="ProgressTextInstallValidate" Overridable="yes">Kontrollerer installationen</String>
260 <String Id="ProgressTextInstallFiles" Overridable="yes">Kopierer nye filer</String>
261 <String Id="ProgressTextInstallFilesTemplate" Overridable="yes">Fil: [1], mappe: [9], størrelse: [6]</String>
262 <String Id="ProgressTextInstallAdminPackage" Overridable="yes">Kopierer netværksinstallationsfiler</String>
263 <String Id="ProgressTextInstallAdminPackageTemplate" Overridable="yes">Fil: [1], mappe: [9], størrelse: [6]</String>
264 <String Id="ProgressTextFileCost" Overridable="yes">Beregner pladskrav</String>
265 <String Id="ProgressTextCostInitialize" Overridable="yes">Beregner pladskrav</String>
266 <String Id="ProgressTextCostFinalize" Overridable="yes">Beregner pladskrav</String>
267 <String Id="ProgressTextCreateShortcuts" Overridable="yes">Opretter genveje</String>
268 <String Id="ProgressTextCreateShortcutsTemplate" Overridable="yes">Genvej: [1]</String>
269 <String Id="ProgressTextPublishComponents" Overridable="yes">Udgiver kvalificerede komponenter</String>
270 <String Id="ProgressTextPublishComponentsTemplate" Overridable="yes">Komponent-id: [1], operator: [2]</String>
271 <String Id="ProgressTextPublishFeatures" Overridable="yes">Udgiver produktfunktioner</String>
272 <String Id="ProgressTextPublishFeaturesTemplate" Overridable="yes">Funktion: [1]</String>
273 <String Id="ProgressTextPublishProduct" Overridable="yes">Udgiver produktoplysninger</String>
274 <String Id="ProgressTextRegisterClassInfo" Overridable="yes">Registrerer klasseservere</String>
275 <String Id="ProgressTextRegisterClassInfoTemplate" Overridable="yes">Klasse-id: [1]</String>
276 <String Id="ProgressTextRegisterExtensionInfo" Overridable="yes">Registrerer udvidelsesservere</String>
277 <String Id="ProgressTextRegisterExtensionInfoTemplate" Overridable="yes">Udvidelse: [1]</String>
278 <String Id="ProgressTextRegisterMIMEInfo" Overridable="yes">Registrerer MIME-oplysninger</String>
279 <String Id="ProgressTextRegisterMIMEInfoTemplate" Overridable="yes">MIME-indholdstype: [1], udvidelse: [2]</String>
280 <String Id="ProgressTextRegisterProgIdInfo" Overridable="yes">Registrerer program-id'er</String>
281 <String Id="ProgressTextRegisterProgIdInfoTemplate" Overridable="yes">Program-id: [1]</String>
282 <String Id="ProgressTextAllocateRegistrySpace" Overridable="yes">Allokerer plads i registreringsdatabasen</String>
283 <String Id="ProgressTextAllocateRegistrySpaceTemplate" Overridable="yes">Ledig plads: [1]</String>
284 <String Id="ProgressTextAppSearch" Overridable="yes">Søger efter installerede programmer</String>
285 <String Id="ProgressTextAppSearchTemplate" Overridable="yes">Egenskab: [1], signatur: [2]</String>
286 <String Id="ProgressTextBindImage" Overridable="yes">Binder eksekverbare filer</String>
287 <String Id="ProgressTextBindImageTemplate" Overridable="yes">Fil: [1]</String>
288 <String Id="ProgressTextCCPSearch" Overridable="yes">Søger efter kvalificerende produkter</String>
289 <String Id="ProgressTextCreateFolders" Overridable="yes">Opretter mapper</String>
290 <String Id="ProgressTextCreateFoldersTemplate" Overridable="yes">Mappe: [1]</String>
291 <String Id="ProgressTextDeleteServices" Overridable="yes">Sletter tjenester</String>
292 <String Id="ProgressTextDeleteServicesTemplate" Overridable="yes">Tjeneste: [1]</String>
293 <String Id="ProgressTextDuplicateFiles" Overridable="yes">Opretter kopier af filer</String>
294 <String Id="ProgressTextDuplicateFilesTemplate" Overridable="yes">Fil: [1], mappe: [9], størrelse: [6]</String>
295 <String Id="ProgressTextFindRelatedProducts" Overridable="yes">Søger efter relaterede programmer</String>
296 <String Id="ProgressTextFindRelatedProductsTemplate" Overridable="yes">Fandt programmet: [1]</String>
297 <String Id="ProgressTextInstallODBC" Overridable="yes">Installerer ODBC-komponenter</String>
298 <String Id="ProgressTextInstallServices" Overridable="yes">Installerer nye tjenester</String>
299 <String Id="ProgressTextInstallServicesTemplate" Overridable="yes">Tjeneste: [2]</String>
300 <String Id="ProgressTextLaunchConditions" Overridable="yes">Vurderer startbetingelser</String>
301 <String Id="ProgressTextMigrateFeatureStates" Overridable="yes">Overflytter funktionstilstande fra relaterede programmer</String>
302 <String Id="ProgressTextMigrateFeatureStatesTemplate" Overridable="yes">Program: [1]</String>
303 <String Id="ProgressTextMoveFiles" Overridable="yes">Flytter filer</String>
304 <String Id="ProgressTextMoveFilesTemplate" Overridable="yes">Fil: [1], mappe: [9], størrelse: [6]</String>
305 <String Id="ProgressTextPatchFiles" Overridable="yes">Udfører rettelser på filer</String>
306 <String Id="ProgressTextPatchFilesTemplate" Overridable="yes">Fil: [1], mappe: [2], størrelse: [3]</String>
307 <String Id="ProgressTextProcessComponents" Overridable="yes">Opdaterer komponentregistrering</String>
308 <String Id="ProgressTextRegisterComPlus" Overridable="yes">Registrerer COM+-programmer og -komponenter</String>
309 <String Id="ProgressTextRegisterComPlusTemplate" Overridable="yes">Program-id: [1]{{, programtype: [2], brugere: [3], RSN: [4]}}</String>
310 <String Id="ProgressTextRegisterFonts" Overridable="yes">Registrerer skrifttyper</String>
311 <String Id="ProgressTextRegisterFontsTemplate" Overridable="yes">Skrifttype: [1]</String>
312 <String Id="ProgressTextRegisterProduct" Overridable="yes">Registrerer produkt</String>
313 <String Id="ProgressTextRegisterProductTemplate" Overridable="yes">[1]</String>
314 <String Id="ProgressTextRegisterTypeLibraries" Overridable="yes">Registrerer typebiblioteker</String>
315 <String Id="ProgressTextRegisterTypeLibrariesTemplate" Overridable="yes">Lib-id: [1]</String>
316 <String Id="ProgressTextRegisterUser" Overridable="yes">Registrerer bruger</String>
317 <String Id="ProgressTextRegisterUserTemplate" Overridable="yes">[1]</String>
318 <String Id="ProgressTextRemoveDuplicateFiles" Overridable="yes">Fjerner identiske filer</String>
319 <String Id="ProgressTextRemoveDuplicateFilesTemplate" Overridable="yes">Fil: [1], mappe: [9]</String>
320 <String Id="ProgressTextRemoveEnvironmentStrings" Overridable="yes">Opdaterer miljøstrenge</String>
321 <String Id="ProgressTextRemoveEnvironmentStringsTemplate" Overridable="yes">Navn: [1], værdi: [2], handling [3]</String>
322 <String Id="ProgressTextRemoveExistingProducts" Overridable="yes">Fjerner programmer</String>
323 <String Id="ProgressTextRemoveExistingProductsTemplate" Overridable="yes">Program: [1], kommandolinje: [2]</String>
324 <String Id="ProgressTextRemoveFiles" Overridable="yes">Fjerner filer</String>
325 <String Id="ProgressTextRemoveFilesTemplate" Overridable="yes">Fil: [1], mappe: [9]</String>
326 <String Id="ProgressTextRemoveFolders" Overridable="yes">Fjerner mapper</String>
327 <String Id="ProgressTextRemoveFoldersTemplate" Overridable="yes">Mappe: [1]</String>
328 <String Id="ProgressTextRemoveIniValues" Overridable="yes">Fjerner poster i INI-filer</String>
329 <String Id="ProgressTextRemoveIniValuesTemplate" Overridable="yes">Fil: [1], sektion: [2], nøgle: [3], værdi: [4]</String>
330 <String Id="ProgressTextRemoveODBC" Overridable="yes">Fjerner ODBC-komponenter</String>
331 <String Id="ProgressTextRemoveRegistryValues" Overridable="yes">Fjerner værdier fra registreringsdatabasen</String>
332 <String Id="ProgressTextRemoveRegistryValuesTemplate" Overridable="yes">Nøgle: [1], navn: [2]</String>
333 <String Id="ProgressTextRemoveShortcuts" Overridable="yes">Fjerner genveje</String>
334 <String Id="ProgressTextRemoveShortcutsTemplate" Overridable="yes">Genvej: [1]</String>
335 <String Id="ProgressTextRMCCPSearch" Overridable="yes">Søger efter kvalificerende produkter</String>
336 <String Id="ProgressTextSelfRegModules" Overridable="yes">Registrerer moduler</String>
337 <String Id="ProgressTextSelfRegModulesTemplate" Overridable="yes">Fil: [1], mappe: [2]</String>
338 <String Id="ProgressTextSelfUnregModules" Overridable="yes">Fjerner registrering af moduler</String>
339 <String Id="ProgressTextSelfUnregModulesTemplate" Overridable="yes">Fil: [1], mappe: [2]</String>
340 <String Id="ProgressTextSetODBCFolders" Overridable="yes">Initialiserer ODBC-mapper</String>
341 <String Id="ProgressTextStartServices" Overridable="yes">Starter tjenester</String>
342 <String Id="ProgressTextStartServicesTemplate" Overridable="yes">Tjeneste: [1]</String>
343 <String Id="ProgressTextStopServices" Overridable="yes">Stopper tjenester</String>
344 <String Id="ProgressTextStopServicesTemplate" Overridable="yes">Tjeneste: [1]</String>
345 <String Id="ProgressTextUnpublishComponents" Overridable="yes">Fjerner udgivelse af kvalificerede komponenter</String>
346 <String Id="ProgressTextUnpublishComponentsTemplate" Overridable="yes">Komponent-id: [1], operator: [2]</String>
347 <String Id="ProgressTextUnpublishFeatures" Overridable="yes">Fjerner udgivelse af produktfunktioner</String>
348 <String Id="ProgressTextUnpublishFeaturesTemplate" Overridable="yes">Funktion: [1]</String>
349 <String Id="ProgressTextUnregisterClassInfo" Overridable="yes">Fjerner registrering af klasseservere</String>
350 <String Id="ProgressTextUnregisterClassInfoTemplate" Overridable="yes">Klasse-id: [1]</String>
351 <String Id="ProgressTextUnregisterComPlus" Overridable="yes">Fjerner registreringen af COM+-programmer og -komponenter</String>
352 <String Id="ProgressTextUnregisterComPlusTemplate" Overridable="yes">Program-id: [1]{{, Programtype: [2]}}</String>
353 <String Id="ProgressTextUnregisterExtensionInfo" Overridable="yes">Fjerner registreringen af udvidelsesservere</String>
354 <String Id="ProgressTextUnregisterExtensionInfoTemplate" Overridable="yes">Udvidelse: [1]</String>
355 <String Id="ProgressTextUnregisterFonts" Overridable="yes">Fjerner registrering af skrifttyper</String>
356 <String Id="ProgressTextUnregisterFontsTemplate" Overridable="yes">Skrifttype: [1]</String>
357 <String Id="ProgressTextUnregisterMIMEInfo" Overridable="yes">Fjerner registrering af MIME-oplysninger</String>
358 <String Id="ProgressTextUnregisterMIMEInfoTemplate" Overridable="yes">MIME-indholdstype: [1], udvidelse: [2]</String>
359 <String Id="ProgressTextUnregisterProgIdInfo" Overridable="yes">Fjerner registreringen af program-id'er</String>
360 <String Id="ProgressTextUnregisterProgIdInfoTemplate" Overridable="yes">Program-id: [1]</String>
361 <String Id="ProgressTextUnregisterTypeLibraries" Overridable="yes">Fjerner registreringen af typebiblioteker</String>
362 <String Id="ProgressTextUnregisterTypeLibrariesTemplate" Overridable="yes">Lib-id: [1]</String>
363 <String Id="ProgressTextWriteEnvironmentStrings" Overridable="yes">Opdaterer miljøstrenge</String>
364 <String Id="ProgressTextWriteEnvironmentStringsTemplate" Overridable="yes">Navn: [1], værdi: [2], handling [3]</String>
365 <String Id="ProgressTextWriteIniValues" Overridable="yes">Skriver værdier for INI-filer</String>
366 <String Id="ProgressTextWriteIniValuesTemplate" Overridable="yes">Fil: [1], sektion: [2], nøgle: [3], værdi: [4]</String>
367 <String Id="ProgressTextWriteRegistryValues" Overridable="yes">Skriver værdier i registreringsdatabasen</String>
368 <String Id="ProgressTextWriteRegistryValuesTemplate" Overridable="yes">Nøgle: [1], navn: [2], værdi: [3]</String>
369 <String Id="ProgressTextAdvertise" Overridable="yes">Annoncerer program</String>
370 <String Id="ProgressTextGenerateScript" Overridable="yes">Opretter scriptfunktioner til handlingen:</String>
371 <String Id="ProgressTextGenerateScriptTemplate" Overridable="yes">[1]</String>
372 <String Id="ProgressTextInstallSFPCatalogFile" Overridable="yes">Installerer systemkatalog</String>
373 <String Id="ProgressTextInstallSFPCatalogFileTemplate" Overridable="yes">Fil: [1], afhængigheder: [2]</String>
374 <String Id="ProgressTextMsiPublishAssemblies" Overridable="yes">Udgiver samlingsoplysninger</String>
375 <String Id="ProgressTextMsiPublishAssembliesTemplate" Overridable="yes">Programkontekst:[1], samlingsnavn:[2]</String>
376 <String Id="ProgressTextMsiUnpublishAssemblies" Overridable="yes">Fjerner udgivelse af samlingsoplysninger</String>
377 <String Id="ProgressTextMsiUnpublishAssembliesTemplate" Overridable="yes">Programkontekst:[1], samlingsnavn:[2]</String>
378 <String Id="ProgressTextRollback" Overridable="yes">Gendannelse:</String>
379 <String Id="ProgressTextRollbackTemplate" Overridable="yes">[1]</String>
380 <String Id="ProgressTextRollbackCleanup" Overridable="yes">Fjerner sikkerhedskopifiler</String>
381 <String Id="ProgressTextRollbackCleanupTemplate" Overridable="yes">Fil: [1]</String>
382 <String Id="ProgressTextUnmoveFiles" Overridable="yes">Fjerner flyttede filer</String>
383 <String Id="ProgressTextUnmoveFilesTemplate" Overridable="yes">Fil: [1], mappe: [9]</String>
384 <String Id="ProgressTextUnpublishProduct" Overridable="yes">Fjerner udgivelse af produktoplysninger</String>
385
386 <String Id="Error0" Overridable="yes">{{Alvorlig fejl: }}</String>
387 <String Id="Error1" Overridable="yes">{{Fejl [1]. }}</String>
388 <String Id="Error2" Overridable="yes">Advarsel [1]. </String>
389 <String Id="Error4" Overridable="yes">Oplysninger [1]. </String>
390 <String Id="Error5" Overridable="yes">Der opstod en fejl under installation af denne pakke. Dette skyldes muligvis et problem med denne pakke. Fejlkoden er [1]. {{Argumenterne er: [2], [3], [4]}}</String>
391 <String Id="Error7" Overridable="yes">{{Disken er fyldt: }}</String>
392 <String Id="Error8" Overridable="yes">Handling [Time]: [1]. [2]</String>
393 <String Id="Error9" Overridable="yes">[ProductName]</String>
394 <String Id="Error10" Overridable="yes">{[2]}{, [3]}{, [4]}</String>
395 <String Id="Error11" Overridable="yes">Meddelelsestype: [1], argument: [2]</String>
396 <String Id="Error12" Overridable="yes">=== Logføring startet: [Date] [Time] ===</String>
397 <String Id="Error13" Overridable="yes">=== Logføring afsluttet: [Date] [Time] ===</String>
398 <String Id="Error14" Overridable="yes">Handling startet [Time]: [1].</String>
399 <String Id="Error15" Overridable="yes">Handling afsluttet [Time]: [1]. Returværdi [2].</String>
400 <String Id="Error16" Overridable="yes">Resterende tid: {[1] minutter }{[2] sekunder}</String>
401 <String Id="Error17" Overridable="yes">Der er ikke mere hukommelse. Luk andre programmer, før du prøver igen.</String>
402 <String Id="Error18" Overridable="yes">Installationsprogrammet svarer ikke længere.</String>
403 <String Id="Error19" Overridable="yes">Installationsprogrammet stoppede for tid.</String>
404 <String Id="Error20" Overridable="yes">Vent, mens Windows konfigurerer [ProductName]</String>
405 <String Id="Error21" Overridable="yes">Indsamler nødvendige oplysninger...</String>
406 <String Id="Error22" Overridable="yes">Fjerner ældre versioner af dette program...</String>
407 <String Id="Error23" Overridable="yes">Forbereder fjernelse af ældre versioner af dette program...</String>
408 <String Id="Error32" Overridable="yes">Installationen af {[ProductName] } er fuldført.</String>
409 <String Id="Error33" Overridable="yes">{[ProductName] } blev ikke installeret.</String>
410 <String Id="Error1101" Overridable="yes">Der opstod en fejl under læsning fra filen: [2]. {{ Systemfejl [3].}} Kontrollér, at filen findes, og at du har adgang til den.</String>
411 <String Id="Error1301" Overridable="yes">Filen '[2]' kunne ikke oprettes. Der findes allerede en mappe med dette navn. Annuller installationsprogrammet, og forsøg at installere på en anden placering.</String>
412 <String Id="Error1302" Overridable="yes">Indsæt disken: [2]</String>
413 <String Id="Error1303" Overridable="yes">Installationsprogrammet har ikke tilstrækkelige rettigheder til at få adgang til mappen: [2]. Installationen kan ikke fortsætte. Log på som administrator, eller kontakt systemadministratoren.</String>
414 <String Id="Error1304" Overridable="yes">Der opstod en fejl under skrivning til filen: [2]. Kontrollér, at du har adgang til mappen.</String>
415 <String Id="Error1305" Overridable="yes">Der opstod en fejl under læsning fra filen [2]. {{ Systemfejl [3].}} Kontrollér, at filen findes, og at du har adgang til den.</String>
416 <String Id="Error1306" Overridable="yes">Der er et andet program, der har udelt adgang til filen '[2]'. Luk alle andre programmer, og klik derefter på Prøv igen.</String>
417 <String Id="Error1307" Overridable="yes">Der er ikke tilstrækkeligt med diskplads til at installere filen: [2]. Frigør noget diskplads, og klik på Prøv igen, eller klik på Annuller for at afslutte.</String>
418 <String Id="Error1308" Overridable="yes">Kildefilen blev ikke fundet: [2]. Kontrollér, at filen findes, og at du har adgang til den.</String>
419 <String Id="Error1309" Overridable="yes">Der opstod en fejl under læsning fra filen [3]. {{ Systemfejl [2].}} Kontrollér, at filen findes, og at du har adgang til den.</String>
420 <String Id="Error1310" Overridable="yes">Der opstod en fejl under skrivning til filen: [3]. {{ Systemfejl [2].}} Kontrollér, at du har adgang til denne mappe.</String>
421 <String Id="Error1311" Overridable="yes">Kildefilen blev ikke fundet{{(kabinet)}}: [2]. Kontrollér, at filen findes, og at du har adgang til den.</String>
422 <String Id="Error1312" Overridable="yes">Mappen '[2]' kunne ikke oprettes. Der findes allerede en fil med dette navn. Omdøb eller fjern filen, og klik på Prøv igen, eller klik på Annuller for at afslutte.</String>
423 <String Id="Error1313" Overridable="yes">Diskenheden [2] er ikke tilgængelig i øjeblikket. Vælg en anden diskenhed.</String>
424 <String Id="Error1314" Overridable="yes">Den angivne sti '[2]' er ikke tilgængelig.</String>
425 <String Id="Error1315" Overridable="yes">Systemet kunne ikke skrive til den angivne mappe: [2].</String>
426 <String Id="Error1316" Overridable="yes">Der opstod en netværksfejl under forsøg på at læse fra filen: [2]</String>
427 <String Id="Error1317" Overridable="yes">Der opstod en fejl under forsøg på at oprette mappen: [2]</String>
428 <String Id="Error1318" Overridable="yes">Der opstod en netværksfejl under forsøg på at oprette mappen: [2]</String>
429 <String Id="Error1319" Overridable="yes">Der opstod en netværksfejl under forsøg på at åbne kildefilkabinettet: [2]</String>
430 <String Id="Error1320" Overridable="yes">Den angivne sti er for lang: [2]</String>
431 <String Id="Error1321" Overridable="yes">Installationsprogrammet har ikke tilstrækkelige rettigheder til at ændre denne fil: [2].</String>
432 <String Id="Error1322" Overridable="yes">En del af mappestien '[2]' er ugyldig. Den er enten tom eller overstiger den længde, der tillades i systemet.</String>
433 <String Id="Error1323" Overridable="yes">Mappestien '[2]' indeholder ord, der ikke er gyldige i mappestier.</String>
434 <String Id="Error1324" Overridable="yes">Mappestien '[2]' indeholder et ugyldigt tegn.</String>
435 <String Id="Error1325" Overridable="yes">'[2]' er ikke et gyldigt kort filnavn.</String>
436 <String Id="Error1326" Overridable="yes">Der opstod en fejl under forsøg på at hente filsikkerhed: [3] GetLastError: [2]</String>
437 <String Id="Error1327" Overridable="yes">Ugyldigt drev: [2]</String>
438 <String Id="Error1328" Overridable="yes">Der opstod fejl under forsøg på at anvende programrettelsen på filen [2]. Den er muligvis blevet opdateret på en anden måde, og den kan ikke længere ændres af denne programrettelse. Du kan få flere oplysninger ved at kontakte forhandleren af programrettelsen. {{Systemfejl: [3]}}</String>
439 <String Id="Error1329" Overridable="yes">En påkrævet fil kan ikke installeres, da kabinetfilen [2] ikke er digitalt signeret. Dette kan angive, at kabinetfilen er fejlbehæftet.</String>
440 <String Id="Error1330" Overridable="yes">En påkrævet fil kan ikke installeres, da kabinetfilen [2] har en digital signatur, der er ugyldig. Dette kan angive, at kabinetfilen er fejlbehæftet.{{ Fejlen [3] blev returneret af WinVerifyTrust.}}</String>
441 <String Id="Error1331" Overridable="yes">Filen [2] kunne ikke kopieres korrekt: CRC-fejl.</String>
442 <String Id="Error1332" Overridable="yes">Filen [2] kunne ikke flyttes korrekt: CRC-fejl.</String>
443 <String Id="Error1333" Overridable="yes">Filen [2] kunne ikke rettes korrekt: CRC-fejl.</String>
444 <String Id="Error1334" Overridable="yes">Filen '[2]' kan ikke installeres, fordi filen ikke blev fundet i kabinetfilen '[3]'. Dette skyldes muligvis en netværksfejl, en fejl ved læsning fra cd'en eller et problem med denne pakke.</String>
445 <String Id="Error1335" Overridable="yes">Kabinetfilen '[2]', der er nødvendig til denne installation, er beskadiget og kan ikke bruges. Dette skyldes muligvis en netværksfejl, en fejl ved læsning fra cd'en eller et problem med denne pakke.</String>
446 <String Id="Error1336" Overridable="yes">Der opstod en fejl under oprettelse af en midlertidig fil, der er nødvendig for at kunne fuldføre denne installation.{{ Mappe: [3]. Systemfejlkode: [2]}}</String>
447 <String Id="Error1401" Overridable="yes">Nøglen kunne ikke oprettes: [2]. {{ Systemfejl [3].}} Kontrollér, at du har tilstrækkelig adgang til denne nøgle, eller kontakt supportteknikerne. </String>
448 <String Id="Error1402" Overridable="yes">Nøglen kunne ikke åbnes: [2]. {{ Systemfejl [3].}} Kontrollér, at du har tilstrækkelig adgang til denne nøgle, eller kontakt supportteknikerne. </String>
449 <String Id="Error1403" Overridable="yes">Værdien [2] kunne ikke slettes fra nøglen [3]. {{ Systemfejl [4].}} Kontrollér, at du har tilstrækkelig adgang til denne nøgle, eller kontakt supportteknikerne. </String>
450 <String Id="Error1404" Overridable="yes">Nøglen [2] kunne ikke slettes. {{ Systemfejl [3].}} Kontrollér, at du har tilstrækkelig adgang til denne nøgle, eller kontakt supportteknikerne. </String>
451 <String Id="Error1405" Overridable="yes">Værdien [2] kunne ikke læses fra nøglen [3]. {{ Systemfejl [4].}} Kontrollér, at du har tilstrækkelig adgang til denne nøgle, eller kontakt supportteknikerne. </String>
452 <String Id="Error1406" Overridable="yes">Værdien [2] kunne ikke skrives til nøglen [3]. {{ Systemfejl [4].}} Kontrollér, at du har tilstrækkelig adgang til denne nøgle, eller kontakt supportteknikerne.</String>
453 <String Id="Error1407" Overridable="yes">Systemet kunne ikke hente værdinavne for nøglen [2]. {{ Systemfejl [3].}} Kontrollér, at du har tilstrækkelig adgang til denne nøgle, eller kontakt supportteknikerne.</String>
454 <String Id="Error1408" Overridable="yes">Systemet kunne ikke hente undernøglenavne for nøglen [2]. {{ Systemfejl [3].}} Kontrollér, at du har tilstrækkelig adgang til denne nøgle, eller kontakt supportteknikerne.</String>
455 <String Id="Error1409" Overridable="yes">Systemet kunne ikke læse sikkerhedsoplysninger for nøglen [2]. {{ Systemfejl [3].}} Kontrollér, at du har tilstrækkelig adgang til denne nøgle, eller kontakt supportteknikerne.</String>
456 <String Id="Error1410" Overridable="yes">Systemet kunne ikke forøge den tilgængelige plads i registreringsdatabasen. Der kræves [2] KB ledig plads i registreringsdatabasen til installation af dette program.</String>
457 <String Id="Error1500" Overridable="yes">En anden installation er i gang. Du skal afslutte den pågældende installation, før du fortsætter med denne.</String>
458 <String Id="Error1501" Overridable="yes">Der opstod en fejl under forsøg på at få adgang til sikre data. Kontrollér, at Windows Installer er konfigureret korrekt, og prøv at installere igen.</String>
459 <String Id="Error1502" Overridable="yes">Brugeren '[2]' har tidligere startet en installation af programmet '[3]'. Den bruger skal køre installationen igen, før programmet kan bruges. Den aktuelle installation vil nu fortsætte.</String>
460 <String Id="Error1503" Overridable="yes">Brugeren '[2]' har tidligere startet en installation af programmet '[3]'. Den bruger skal køre installationen igen, før programmet kan bruges.</String>
461 <String Id="Error1601" Overridable="yes">Der er ikke mere ledig diskplads på diskenheden: '[2]'. Påkrævet plads: [3] KB. Ledig plads: [4] KB. Frigør noget diskplads, og prøv igen.</String>
462 <String Id="Error1602" Overridable="yes">Er du sikker på, at du vil annullere?</String>
463 <String Id="Error1603" Overridable="yes">Filen [2][3] bruges{ af følgende proces: Navn: [4], id: [5], vinduestitel: '[6]'}. Luk programmet, og forsøg igen.</String>
464 <String Id="Error1604" Overridable="yes">Programmet '[2]' er allerede installeret. Det forhindrer, at dette program installeres. De to programmer er ikke kompatible.</String>
465 <String Id="Error1605" Overridable="yes">Der er ikke nok ledig diskplads på diskenheden '[2]' til at fortsætte installationen med genoprettelse aktiveret. Der kræves [3] KB, men der er kun [4] KB ledig. Klik på Ignorer for at fortsætte installationen uden at gemme genoprettelsesoplysninger, klik på Forsøg igen for at undersøge mængden af ledig plads igen, eller klik på Annuller for at afslutte installationen.</String>
466 <String Id="Error1606" Overridable="yes">Der kunne ikke opnås adgang til netværksplaceringen [2].</String>
467 <String Id="Error1607" Overridable="yes">Følgende programmer skal lukkes, før du fortsætter med installationen:</String>
468 <String Id="Error1608" Overridable="yes">Systemet kunne ikke finde nogen tidligere installerede kompatible produkter på computeren til installation af dette produkt.</String>
469 <String Id="Error1609" Overridable="yes">Der opstod en fejl under anvendelsen af sikkerhedsindstillingerne. [2] er ikke en gyldig bruger eller gruppe. Dette kan skyldes et problem med pakken eller et problem med forbindelsen til en domænecontroller på netværket. Kontrollér netværksforbindelsen, og klik på Forsøg igen, eller klik på Annuller for at afslutte installationen. {{Brugerens SID blev ikke fundet. Systemfejl [3]}}</String>
470 <String Id="Error1701" Overridable="yes">Nøglen [2] er ugyldig. Kontrollér, at du har angivet den korrekte nøgle.</String>
471 <String Id="Error1702" Overridable="yes">Installationsprogrammet skal genstarte programmet, før konfigurationen af [2] kan fortsætte. Klik på Ja for at genstarte nu, eller klik på Nej, hvis du vil genstarte manuelt senere.</String>
472 <String Id="Error1703" Overridable="yes">Du skal genstarte systemet, for at de udførte konfigurationsændringer i [2] kan træde i kraft. Klik på Ja for at genstarte nu, eller klik på Nej, hvis du vil genstarte manuelt senere.</String>
473 <String Id="Error1704" Overridable="yes">En installation af [2] er i øjeblikket afbrudt. Du skal fortryde de ændringer, der er foretaget under den pågældende installation, for at fortsætte. Vil du fortryde disse ændringer?</String>
474 <String Id="Error1705" Overridable="yes">En tidligere installation af dette produkt er i gang. Du skal fortryde de ændringer, der er foretaget under den pågældende installation, for at fortsætte. Vil du fortryde disse ændringer?</String>
475 <String Id="Error1706" Overridable="yes">En installationspakke til produktet [2] blev ikke fundet. Prøv at installere igen ved hjælp af en gyldig kopi af installationspakken '[3]'.</String>
476 <String Id="Error1707" Overridable="yes">Installationen blev fuldført.</String>
477 <String Id="Error1708" Overridable="yes">Installationen mislykkedes.</String>
478 <String Id="Error1709" Overridable="yes">Produkt: [2] - [3]</String>
479 <String Id="Error1710" Overridable="yes">Du kan enten gendanne computeren til dens tidligere tilstand eller fortsætte installationen senere. Vil du gendanne?</String>
480 <String Id="Error1711" Overridable="yes">Der opstod fejl under skrivning af installationsoplysningerne til disken. Kontrollér, om der er nok ledig diskplads, og klik på Prøv igen, eller klik på Annuller for at afslutte installationen.</String>
481 <String Id="Error1712" Overridable="yes">En eller flere af de filer, der er påkrævede for at gendanne computeren til dens forrige tilstand, blev ikke fundet. Det er ikke muligt at gendanne computeren.</String>
482 <String Id="Error1713" Overridable="yes">[2] kan ikke installere et af de påkrævede produkter. Kontakt teknisk support. {{Systemfejl: [3].}}</String>
483 <String Id="Error1714" Overridable="yes">Den ældre version af [2] kan ikke fjernes. Kontakt teknisk support. {{Systemfejl [3].}}</String>
484 <String Id="Error1715" Overridable="yes">Installerede [2]</String>
485 <String Id="Error1716" Overridable="yes">Konfigurerede [2]</String>
486 <String Id="Error1717" Overridable="yes">Fjernede [2]</String>
487 <String Id="Error1718" Overridable="yes">Filen [2] blev afvist af politikken for digital signatur.</String>
488 <String Id="Error1719" Overridable="yes">Der kunne ikke opnås adgang til tjenesten Windows Installer. Denne fejl kan opstå, hvis du kører Windows i fejlsikret tilstand, eller hvis Windows Installer ikke er korrekt installeret. Kontakt supportteknikerne for at få hjælp.</String>
489 <String Id="Error1720" Overridable="yes">Denne Windows Installer-pakke er fejlbehæftet. Et script, der er påkrævet, for at installationen kan fuldføres, kunne ikke køres. Kontakt supportafdelingen eller forhandleren af pakken. {{Brugerdefineret handling [2] scriptfejl [3], [4]: [5], linje [6], kolonne [7], [8] }}</String>
490 <String Id="Error1721" Overridable="yes">Der er opstået et problem med denne Windows Installer-pakke. Et program, der er nødvendigt for at kunne fuldføre denne installation, kunne ikke køres. Kontakt supportteknikerne eller pakkens producent. {{Handling [2], placering: [3], kommando: [4] }}</String>
491 <String Id="Error1722" Overridable="yes">Denne Windows Installer-pakke er fejlbehæftet. Et program, der køres som en del af installationen, blev ikke fuldført som forventet. Kontakt supportafdelingen eller forhandleren af pakken. {{Handling [2], placering: [3], kommando: [4] }}</String>
492 <String Id="Error1723" Overridable="yes">Denne Windows Installer-pakke er fejlbehæftet. En DLL-fil, der er påkrævet, for at installationen kan fuldføres, kunne ikke køres. Kontakt supportafdelingen eller forhandleren af pakken. {{Handling [2], post: [3], bibliotek: [4] }}</String>
493 <String Id="Error1724" Overridable="yes">Fjernelsen blev fuldført.</String>
494 <String Id="Error1725" Overridable="yes">Fjernelsen mislykkedes.</String>
495 <String Id="Error1726" Overridable="yes">Annonceringen blev fuldført.</String>
496 <String Id="Error1727" Overridable="yes">Annonceringen mislykkedes.</String>
497 <String Id="Error1728" Overridable="yes">Konfigurationen blev fuldført.</String>
498 <String Id="Error1729" Overridable="yes">Konfigurationen mislykkedes.</String>
499 <String Id="Error1730" Overridable="yes">Du skal være administrator for at kunne fjerne dette program. Hvis du vil fjerne programmet, skal du logge på som administrator eller kontakte teknisk support for at få hjælp.</String>
500 <String Id="Error1731" Overridable="yes">Kildeinstallationspakken for produktet [2] er ikke synkroniseret med klientpakken. Prøv at installere igen ved hjælp af en gyldig kopi af installationspakken '[3]'.</String>
501 <String Id="Error1732" Overridable="yes">Du skal genstarte computeren for at kunne fuldføre installationen af [2]. Der er i øjeblikket andre brugere logget på denne computer, og hvis computeren genstartes, mister disse brugere muligvis de data, der ikke er gemt. Vil du genstarte computeren nu?</String>
502 <String Id="Error1801" Overridable="yes">Stien [2] er ugyldig. Angiv en gyldig sti.</String>
503 <String Id="Error1802" Overridable="yes">Der er ikke mere hukommelse. Luk andre programmer, før du prøver igen.</String>
504 <String Id="Error1803" Overridable="yes">Der er ingen disk i drev [2]. Indsæt en disk, og klik på Forsøg igen, eller klik på Annuller for at gå tilbage til den enhed, som blev brugt tidligere.</String>
505 <String Id="Error1804" Overridable="yes">Der er ingen disk i drev [2]. Indsæt en disk, og klik på Forsøg igen, eller klik på Annuller for at gå tilbage til dialogboksen til søgning og vælge en anden diskenhed.</String>
506 <String Id="Error1805" Overridable="yes">Mappen [2] findes ikke. Angiv en sti til en mappe, der findes.</String>
507 <String Id="Error1806" Overridable="yes">Du har ikke tilstrækkelige rettigheder til at læse denne mappe.</String>
508 <String Id="Error1807" Overridable="yes">Der blev ikke fundet en gyldig destinationsmappe til installationen.</String>
509 <String Id="Error1901" Overridable="yes">Der opstod en fejl under forsøg på at læse fra kildeinstallationsdatabasen: [2].</String>
510 <String Id="Error1902" Overridable="yes">Planlægger genstart: Omdøber filen [2] til [3]. Computeren skal genstartes, for at handlingen kan fuldføres.</String>
511 <String Id="Error1903" Overridable="yes">Planlægger genstart: Sletter filen [2]. Computeren skal genstartes, for at handlingen kan fuldføres.</String>
512 <String Id="Error1904" Overridable="yes">Modulet [2] blev ikke registreret. HRESULT [3]. Kontakt supportafdelingen.</String>
513 <String Id="Error1905" Overridable="yes">Annullering af registreringen af modulet [2] blev ikke fuldført. HRESULT [3]. Kontakt supportafdelingen.</String>
514 <String Id="Error1906" Overridable="yes">Systemet kunne ikke cachelagre pakken [2]. Fejl: [3]. Kontakt supportafdelingen.</String>
515 <String Id="Error1907" Overridable="yes">Skrifttypen [2] blev ikke registreret. Kontrollér, at du har de nødvendige rettigheder til at installere skrifttyper, og at skrifttypen understøttes af systemet.</String>
516 <String Id="Error1908" Overridable="yes">Registreringen af skrifttypen [2] kunne ikke fjernes. Kontrollér, at du har de nødvendige rettigheder til at fjerne skrifttyper.</String>
517 <String Id="Error1909" Overridable="yes">Det var ikke muligt at oprette genvejen [2]. Kontrollér, at destinationsmappen findes, og at du har adgang til den.</String>
518 <String Id="Error1910" Overridable="yes">Det var ikke muligt at fjerne genvejen [2]. Kontrollér, at genvejsfilen findes, og at du har adgang til den.</String>
519 <String Id="Error1911" Overridable="yes">Typebiblioteket for filen [2] blev ikke registreret. Kontakt supportafdelingen.</String>
520 <String Id="Error1912" Overridable="yes">Annullering af registreringen af typebiblioteket for filen [2] blev ikke fuldført. Kontakt supportafdelingen.</String>
521 <String Id="Error1913" Overridable="yes">INI-filen [2][3] blev ikke opdateret. Kontrollér, at filen findes, og at du har adgang til den.</String>
522 <String Id="Error1914" Overridable="yes">Det var ikke muligt at planlægge, at filen [2] skulle erstatte filen [3] ved genstart. Kontrollér, at du har skriverettigheder til filen [3].</String>
523 <String Id="Error1915" Overridable="yes">Der opstod en fejl under fjernelsen af ODBC-driverstyring, ODBC-fejl [2]: [3]. Kontakt supportafdelingen.</String>
524 <String Id="Error1916" Overridable="yes">Der opstod en fejl under installationen af ODBC-driverstyring, ODBC-fejl [2]: [3]. Kontakt supportafdelingen.</String>
525 <String Id="Error1917" Overridable="yes">Der opstod en fejl under fjernelse af ODBC-driveren: [4], ODBC-fejl [2]: [3]. Kontrollér, at du har de nødvendige rettigheder til at fjerne ODBC-drivere.</String>
526 <String Id="Error1918" Overridable="yes">Der opstod en fejl under installation af ODBC-driveren: [4], ODBC-fejl [2]: [3]. Kontrollér, at filen [4] findes, og at du kan få adgang til den.</String>
527 <String Id="Error1919" Overridable="yes">Der opstod en fejl under konfiguration af ODBC-datakilden: [4], ODBC-fejl [2]: [3]. Kontrollér, at filen [4] findes, og at du kan få adgang til den.</String>
528 <String Id="Error1920" Overridable="yes">Tjenesten '[2]' ([3]) kunne ikke starte. Kontrollér, at du har tilstrækkelige rettigheder til at starte systemtjenester.</String>
529 <String Id="Error1921" Overridable="yes">Tjenesten '[2]' ([3]) kunne ikke stoppes. Kontrollér, at du har tilstrækkelige rettigheder til at standse systemtjenester.</String>
530 <String Id="Error1922" Overridable="yes">Tjenesten '[2]' ([3]) kunne ikke slettes. Kontrollér, at du har tilstrækkelige rettigheder til at fjerne systemtjenester.</String>
531 <String Id="Error1923" Overridable="yes">Tjenesten '[2]' ([3]) kunne ikke installeres. Kontrollér, at du har tilstrækkelige rettigheder til at installere systemtjenester.</String>
532 <String Id="Error1924" Overridable="yes">Miljøvariablen '[2]' blev ikke opdateret. Kontrollér, at du har tilstrækkelige rettigheder til at ændre miljøvariabler.</String>
533 <String Id="Error1925" Overridable="yes">Du har ikke tilstrækkelige rettigheder til at fuldføre installationen for alle brugerne af computeren. Log på som administrator, og prøv derefter at installere igen.</String>
534 <String Id="Error1926" Overridable="yes">Filsikkerheden for filen '[3]' kunne ikke angives. Fejl: [2]. Kontrollér, at du har tilstrækkelige rettigheder til at ændre sikkerhedsindstillingerne for filen.</String>
535 <String Id="Error1927" Overridable="yes">Component Services (COM+ 1.0) er ikke installeret på computeren. Component Services er påkrævet, for at installationen kan fuldføres. Component Services findes på Windows 2000.</String>
536 <String Id="Error1928" Overridable="yes">Der opstod fejl under registrering af COM+-programmet. Kontakt supportafdelingen for at få flere oplysninger.</String>
537 <String Id="Error1929" Overridable="yes">Der opstod fejl under annullering af registreringen af COM+-programmet. Kontakt supportafdelingen for at få flere oplysninger.</String>
538 <String Id="Error1930" Overridable="yes">Beskrivelsen til tjenesten '[2]' ([3]) kunne ikke ændres.</String>
539 <String Id="Error1931" Overridable="yes">Tjenesten Windows Installer kan ikke opdatere systemfilen [2], da den er beskyttet af Windows. Du skal muligvis opgradere operativsystemet, for at programmet fungerer korrekt. {{Pakkeversion: [3], version beskyttet af operativsystemet: [4]}}</String>
540 <String Id="Error1932" Overridable="yes">Tjenesten Windows Installer kan ikke opdatere den beskyttede Windows-fil [2]. {{Pakkeversion: [3], version beskyttet af operativsystemet: [4], SFP-fejl: [5]}}</String>
541 <String Id="Error1933" Overridable="yes">Tjenesten Windows Installer kan ikke opdatere en eller flere beskyttede Windows-filer. {{SFP-fejl: [2]. Liste over beskyttede filer:\r\n[3]}}</String>
542 <String Id="Error1934" Overridable="yes">Brugerinstallationer er deaktiveret ved hjælp af en politik på computeren.</String>
543 <String Id="Error1935" Overridable="yes">Der opstod en fejl under installationen af samlingen '[6]'. Se i Hjælp og support for at få flere oplysninger. HRESULT: [3]. {{samlingsgrænseflade: [4], funktion: [5], komponent: [2]}}</String>
544 <String Id="Error1936" Overridable="yes">Der opstod en fejl under installationen af samlingen '[6]'. Samlingen er ikke navngivet med et sikkert navn eller er ikke signeret med den minimale nøglelængde. HRESULT: [3]. {{samlingsgrænseflade: [4], funktion: [5], komponent: [2]}}</String>
545 <String Id="Error1937" Overridable="yes">Der opstod en fejl under installationen af samlingen '[6]'. Signaturen eller kataloget kunne ikke bekræftes eller er ikke gyldigt. HRESULT: [3]. {{samlingsgrænseflade: [4], funktion: [5], komponent: [2]}}</String>
546 <String Id="Error1938" Overridable="yes">Der opstod en fejl under installationen af samlingen '[6]'. Et eller flere moduler i samlingen blev ikke fundet. HRESULT: [3]. {{samlingsgrænseflade: [4], funktion: [5], komponent: [2]}}</String>
547
548 <String Id="UITextbytes" Overridable="yes">byte</String>
549 <String Id="UITextGB" Overridable="yes">GB</String>
550 <String Id="UITextKB" Overridable="yes">KB</String>
551 <String Id="UITextMB" Overridable="yes">MB</String>
552 <String Id="UITextMenuAbsent" Overridable="yes">Hele funktionen vil være utilgængelig</String>
553 <String Id="UITextMenuAdvertise" Overridable="yes">Funktionen bliver installeret, når den kræves</String>
554 <String Id="UITextMenuAllCD" Overridable="yes">Hele funktionen installeres til at køre fra cd</String>
555 <String Id="UITextMenuAllLocal" Overridable="yes">Hele funktionen installeres på den lokale harddisk</String>
556 <String Id="UITextMenuAllNetwork" Overridable="yes">Hele funktionen installeres til at køre fra netværket</String>
557 <String Id="UITextMenuCD" Overridable="yes">Installeres til at køre fra cd</String>
558 <String Id="UITextMenuLocal" Overridable="yes">Installeres på den lokale harddisk</String>
559 <String Id="UITextMenuNetwork" Overridable="yes">Installeres til at køre fra netværket</String>
560 <String Id="UITextNewFolder" Overridable="yes">Mappe|Ny mappe</String>
561 <String Id="UITextScriptInProgress" Overridable="yes">Indsamler nødvendige oplysninger...</String>
562 <String Id="UITextSelAbsentAbsent" Overridable="yes">Denne funktion installeres ikke</String>
563 <String Id="UITextSelAbsentAdvertise" Overridable="yes">Denne funktion indstilles til at blive installeret, når den kræves</String>
564 <String Id="UITextSelAbsentCD" Overridable="yes">Denne funktion installeres til at køre fra cd</String>
565 <String Id="UITextSelAbsentLocal" Overridable="yes">Denne funktion installeres på den lokale harddisk</String>
566 <String Id="UITextSelAbsentNetwork" Overridable="yes">Denne funktion installeres til at køre fra netværket</String>
567 <String Id="UITextSelAdvertiseAbsent" Overridable="yes">Denne funktion bliver ikke tilgængelig</String>
568 <String Id="UITextSelAdvertiseAdvertise" Overridable="yes">Installeres, når den kræves</String>
569 <String Id="UITextSelAdvertiseCD" Overridable="yes">Denne funktion kan køres fra cd</String>
570 <String Id="UITextSelAdvertiseLocal" Overridable="yes">Denne funktion installeres på den lokale harddisk</String>
571 <String Id="UITextSelAdvertiseNetwork" Overridable="yes">Denne funktion kan køres fra netværket</String>
572 <String Id="UITextSelCDAbsent" Overridable="yes">Denne funktion fjernes helt, og du kan ikke køre den fra cd</String>
573 <String Id="UITextSelCDAdvertise" Overridable="yes">Denne funktion ændres fra at køre fra cd til at blive installeret, når det er påkrævet</String>
574 <String Id="UITextSelCDCD" Overridable="yes">Denne funktion køres fortsat fra cd</String>
575 <String Id="UITextSelCDLocal" Overridable="yes">Denne funktion ændres fra at køre fra cd til at køre fra den lokale harddisk</String>
576 <String Id="UITextSelChildCostNeg" Overridable="yes">Denne funktion frigiver [1] på harddisken.</String>
577 <String Id="UITextSelChildCostPos" Overridable="yes">Denne funktion kræver [1] på harddisken.</String>
578 <String Id="UITextSelCostPending" Overridable="yes">Kompilerer omkostninger for denne funktion...</String>
579 <String Id="UITextSelLocalAbsent" Overridable="yes">Denne funktion fjernes fuldstændigt</String>
580 <String Id="UITextSelLocalAdvertise" Overridable="yes">Denne funktion fjernes fra den lokale harddisk, men den indstilles til at blive installeret, når den kræves</String>
581 <String Id="UITextSelLocalCD" Overridable="yes">Denne funktion fjernes fra den lokale harddisk, men den kan stadig køres fra cd</String>
582 <String Id="UITextSelLocalLocal" Overridable="yes">Denne funktion bliver på den lokale harddisk</String>
583 <String Id="UITextSelLocalNetwork" Overridable="yes">Denne funktion fjernes fra den lokale harddisk, men den kan stadig køres fra netværket</String>
584 <String Id="UITextSelNetworkAbsent" Overridable="yes">Denne funktion fjernes fuldstændig. Den vil ikke kunne køres fra netværket</String>
585 <String Id="UITextSelNetworkAdvertise" Overridable="yes">Denne funktion skifter fra at køre fra netværkstilstand til at blive installeret, når den kræves</String>
586 <String Id="UITextSelNetworkLocal" Overridable="yes">Denne funktion ændres fra at køre fra netværkstilstand til at blive installeret på den lokale harddisk</String>
587 <String Id="UITextSelNetworkNetwork" Overridable="yes">Denne funktion køres fortsat fra netværket</String>
588 <String Id="UITextSelParentCostNegNeg" Overridable="yes">Denne funktion frigiver [1] på harddisken. [2] af [3] underfunktioner er valgt. Underfunktionerne frigiver [4] på harddisken.</String>
589 <String Id="UITextSelParentCostNegPos" Overridable="yes">Denne funktion frigiver [1] på harddisken. [2] af [3] underfunktioner er valgt. Underfunktionerne kræver [4] på harddisken.</String>
590 <String Id="UITextSelParentCostPosNeg" Overridable="yes">Denne funktion kræver [1] på harddisken. [2] af [3] underfunktioner er valgt. Underfunktionerne frigiver [4] på harddisken.</String>
591 <String Id="UITextSelParentCostPosPos" Overridable="yes">Denne funktion kræver [1] på harddisken. [2] af [3] underfunktioner er valgt. Underfunktionerne kræver [4] på harddisken.</String>
592 <String Id="UITextTimeRemaining" Overridable="yes">Resterende tid: {[1] minutter }{[2] sekunder}</String>
593 <String Id="UITextVolumeCostAvailable" Overridable="yes">Ledig</String>
594 <String Id="UITextVolumeCostDifference" Overridable="yes">Forskel</String>
595 <String Id="UITextVolumeCostRequired" Overridable="yes">Krævet</String>
596 <String Id="UITextVolumeCostSize" Overridable="yes">Diskstørrelse</String>
597 <String Id="UITextVolumeCostVolume" Overridable="yes">Drev</String>
598</WixLocalization>
diff --git a/src/ext/UI/wixlib/WixUI_de-de.wxl b/src/ext/UI/wixlib/WixUI_de-de.wxl
new file mode 100644
index 00000000..3b8edc59
--- /dev/null
+++ b/src/ext/UI/wixlib/WixUI_de-de.wxl
@@ -0,0 +1,598 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3
4
5<WixLocalization Culture="de-de" Codepage="1252" xmlns="http://wixtoolset.org/schemas/v4/wxl">
6 <String Id="WixUIBack" Overridable="yes">&amp;Zurück</String>
7 <String Id="WixUINext" Overridable="yes">&amp;Weiter</String>
8 <String Id="WixUICancel" Overridable="yes">Abbrechen</String>
9 <String Id="WixUIFinish" Overridable="yes">&amp;Fertig stellen</String>
10 <String Id="WixUIRetry" Overridable="yes">&amp;Wiederholen</String>
11 <String Id="WixUIIgnore" Overridable="yes">&amp;Ignorieren</String>
12 <String Id="WixUIYes" Overridable="yes">&amp;Ja</String>
13 <String Id="WixUINo" Overridable="yes">&amp;Nein</String>
14 <String Id="WixUIOK" Overridable="yes">OK</String>
15 <String Id="WixUIPrint" Overridable="yes">&amp;Drucken</String>
16
17 <String Id="AdvancedWelcomeEulaDlg_Title" Overridable="yes">[ProductName]-Setup</String>
18 <String Id="AdvancedWelcomeEulaDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
19 <String Id="AdvancedWelcomeEulaDlgTitle" Overridable="yes">{\WixUI_Font_Title}Lesen Sie die Lizenzbedingungen für [ProductName].</String>
20 <String Id="AdvancedWelcomeEulaDlgLicenseAcceptedCheckBox" Overridable="yes">Ich &amp;stimme den Bedingungen der Lizenzvereinbarung zu.</String>
21 <String Id="AdvancedWelcomeEulaDlgDescriptionPerMachine" Overridable="yes">Klicken Sie auf "Installieren", um das Produkt mit Standardoptionen für alle Benutzer zu installieren. Klicken Sie auf "Erweitert", um die Installationsoptionen zu ändern.</String>
22 <String Id="AdvancedWelcomeEulaDlgDescriptionPerUser" Overridable="yes">Klicken Sie auf "Installieren", um das Produkt mit Standardoptionen nur für Sie zu installieren. Klicken Sie auf "Erweitert", um die Installationsoptionen zu ändern.</String>
23 <String Id="AdvancedWelcomeEulaDlgInstall" Overridable="yes">&amp;Installieren</String>
24 <String Id="AdvancedWelcomeEulaDlgAdvanced" Overridable="yes">&amp;Erweitert</String>
25 <String Id="Advanced_Font_Normal_Size" Overridable="yes">8</String>
26 <String Id="Advanced_Font_Bigger_Size" Overridable="yes">12</String>
27 <String Id="Advanced_Font_Title_Size" Overridable="yes">9</String>
28 <String Id="Advanced_Font_Emphasized_Size" Overridable="yes">8</String>
29 <String Id="Advanced_Font_FaceName" Overridable="yes">Tahoma</String>
30
31 <String Id="BrowseDlg_Title" Overridable="yes">[ProductName]-Setup</String>
32 <String Id="BrowseDlgComboLabel" Overridable="yes">&amp;Suchen in:</String>
33 <String Id="BrowseDlgWixUI_Bmp_Up" Overridable="yes">WixUI_Bmp_Up</String>
34 <String Id="BrowseDlgWixUI_Bmp_UpTooltip" Overridable="yes">Eine Ebene nach oben</String>
35 <String Id="BrowseDlgNewFolder" Overridable="yes">WixUI_Bmp_New</String>
36 <String Id="BrowseDlgNewFolderTooltip" Overridable="yes">Neuen Ordner erstellen</String>
37 <String Id="BrowseDlgPathLabel" Overridable="yes">&amp;Ordnername:</String>
38 <String Id="BrowseDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
39 <String Id="BrowseDlgDescription" Overridable="yes">Zielordner suchen</String>
40 <String Id="BrowseDlgTitle" Overridable="yes">{\WixUI_Font_Title}Zielordner ändern</String>
41
42 <String Id="CancelDlg_Title" Overridable="yes">[ProductName]-Setup</String>
43 <String Id="CancelDlgText" Overridable="yes">Möchten Sie die Installation von [ProductName] wirklich abbrechen?</String>
44 <String Id="CancelDlgIcon" Overridable="yes">WixUI_Ico_Info</String>
45 <String Id="CancelDlgIconTooltip" Overridable="yes">Informationssymbol</String>
46
47 <String Id="CustomizeDlg_Title" Overridable="yes">[ProductName]-Setup</String>
48 <String Id="CustomizeDlgTree" Overridable="yes">Auswahlstruktur</String>
49 <String Id="CustomizeDlgBrowse" Overridable="yes">Du&amp;rchsuchen...</String>
50 <String Id="CustomizeDlgReset" Overridable="yes">Zurück&amp;setzen</String>
51 <String Id="CustomizeDlgDiskCost" Overridable="yes">Datenträger&amp;verwendung</String>
52 <String Id="CustomizeDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
53 <String Id="CustomizeDlgText" Overridable="yes">Klicken Sie in der Struktur unten auf die Symbole, um den Installationstyp der einzelnen Funktionen zu ändern.</String>
54 <String Id="CustomizeDlgDescription" Overridable="yes">Wählen Sie aus, wie die Funktionen installiert werden sollen.</String>
55 <String Id="CustomizeDlgTitle" Overridable="yes">{\WixUI_Font_Title}Benutzerdefiniertes Setup</String>
56 <String Id="CustomizeDlgItemDescription" Overridable="yes">CustomizeDlgItemDescription-CustomizeDlgItemDescription</String>
57 <String Id="CustomizeDlgItemSize" Overridable="yes">CustomizeDlgItemSize-CustomizeDlgItemSize</String>
58 <String Id="CustomizeDlgLocation" Overridable="yes">CustomizeDlgLocation-CustomizeDlgLocation</String>
59 <String Id="CustomizeDlgLocationLabel" Overridable="yes">Ort:</String>
60
61 <String Id="DiskCostDlg_Title" Overridable="yes">[ProductName]-Setup</String>
62 <String Id="DiskCostDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
63 <String Id="DiskCostDlgText" Overridable="yes">Die hervorgehobenen Laufwerke weisen nicht genügend Speicherplatz für die ausgewählten Funktionen auf. Sie können entweder Dateien von den hervorgehobenen Laufwerken entfernen, weniger Funktionen installieren oder andere Ziellaufwerke bestimmen.</String>
64 <String Id="DiskCostDlgDescription" Overridable="yes">Der für die Installation der ausgewählten Funktionen erforderliche Speicherplatz.</String>
65 <String Id="DiskCostDlgTitle" Overridable="yes">{\WixUI_Font_Title}Speicherplatzbedarf auf dem Datenträger</String>
66 <String Id="DiskCostDlgVolumeList" Overridable="yes">{120}{70}{70}{70}{70}</String>
67
68 <String Id="ErrorDlg_Title" Overridable="yes">[ProductName]-Setup</String>
69 <String Id="ErrorDlgErrorText" Overridable="yes">Informationstext</String>
70 <String Id="ErrorDlgErrorIcon" Overridable="yes">WixUI_Ico_Info</String>
71 <String Id="ErrorDlgErrorIconTooltip" Overridable="yes">Informationssymbol</String>
72
73 <String Id="ExitDialog_Title" Overridable="yes">[ProductName]-Setup</String>
74 <String Id="ExitDialogBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
75 <String Id="ExitDialogDescription" Overridable="yes">Klicken Sie auf "Fertig stellen", um den Setup-Assistenten zu beenden.</String>
76 <String Id="ExitDialogTitle" Overridable="yes">{\WixUI_Font_Bigger}Der Setup-Assistent für [ProductName] wurde abgeschlossen.</String>
77
78 <String Id="FatalError_Title" Overridable="yes">[ProductName]-Setup</String>
79 <String Id="FatalErrorBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
80 <String Id="FatalErrorTitle" Overridable="yes">{\WixUI_Font_Bigger}Der Setup-Assistent für [ProductName] wurde vorzeitig beendet.</String>
81 <String Id="FatalErrorDescription1" Overridable="yes">Der Setup-Assistent für [ProductName] wurde aufgrund eines Fehlers vorzeitig beendet. Das System wurde nicht verändert. Sie müssen den Setup-Assistenten erneut ausführen, um dieses Programm zu einem späteren Zeitpunkt zu installieren.</String>
82 <String Id="FatalErrorDescription2" Overridable="yes">Klicken Sie auf "Fertig stellen", um den Setup-Assistenten zu beenden.</String>
83
84 <String Id="FeaturesDlg_Title" Overridable="yes">[ProductName]-Setup</String>
85 <String Id="FeaturesDlgTree" Overridable="yes">Produktfunktionen</String>
86 <String Id="FeaturesDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
87 <String Id="FeaturesDlgDescription" Overridable="yes">Wählen Sie aus, wie die Funktionen installiert werden sollen.</String>
88 <String Id="FeaturesDlgTitle" Overridable="yes">{\WixUI_Font_Title}Produktfunktionen</String>
89 <String Id="FeaturesDlgItemDescription" Overridable="yes">FeaturesDlgItemDescription</String>
90 <String Id="FeaturesDlgItemSize" Overridable="yes">FeaturesDlgItemSize</String>
91 <String Id="FeaturesDlgInstall" Overridable="yes">&amp;Installieren</String>
92 <String Id="FeaturesDlgChange" Overridable="yes">&amp;Ändern</String>
93
94 <String Id="FilesInUse_Title" Overridable="yes">[ProductName]-Setup</String>
95 <String Id="FilesInUseExit" Overridable="yes">Be&amp;enden</String>
96 <String Id="FilesInUseBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
97 <String Id="FilesInUseText" Overridable="yes">Folgende Anwendungen verwenden Dateien, die aktualisiert werden müssen. Schließen Sie diese Anwendungen, und klicken Sie auf "&amp;Wiederholen", um die Installation fortzusetzen, oder auf "Beenden", um den Vorgang zu beenden.</String>
98 <String Id="FilesInUseDescription" Overridable="yes">Einige Dateien, die aktualisiert werden müssen, werden zurzeit verwendet.</String>
99 <String Id="FilesInUseTitle" Overridable="yes">{\WixUI_Font_Title}Dateien werden verwendet</String>
100
101 <String Id="InstallDirDlg_Title" Overridable="yes">[ProductName]-Setup</String>
102 <String Id="InstallDirDlgChange" Overridable="yes">&amp;Ändern...</String>
103 <String Id="InstallDirDlgTitle" Overridable="yes">{\WixUI_Font_Title}Zielordner</String>
104 <String Id="InstallDirDlgDescription" Overridable="yes">Klicken Sie auf "Weiter", um die Installation im Standardordner vorzunehmen, oder klicken Sie auf 'Ändern', um einen anderen Ordner auszuwählen.</String>
105 <String Id="InstallDirDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
106 <String Id="InstallDirDlgFolderLabel" Overridable="yes">[ProductName] installieren in:</String>
107
108 <String Id="InstallScopeDlg_Title" Overridable="yes">[ProductName]-Setup</String>
109 <String Id="InstallScopeDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
110 <String Id="InstallScopeDlgDescription" Overridable="yes">Wählen Sie Installationsumfang und -ordner</String>
111 <String Id="InstallScopeDlgTitle" Overridable="yes">{\WixUI_Font_Title}Installationsumfang</String>
112 <String Id="InstallScopeDlgPerUser" Overridable="yes">{\WixUI_Font_Emphasized}&amp;Nur für mich installieren ([LogonUser])</String>
113 <String Id="InstallScopeDlgPerUserDescription" Overridable="yes">[ProductName] wird in einem Benutzerordner installiert und steht nur unter Ihrem Benutzerkonto zur Verfügung. Sie benötigen keine Administratorberechtigungen.</String>
114 <String Id="InstallScopeDlgNoPerUserDescription" Overridable="yes">[ProductName] unterstützt keine Installation für einzelne Benutzer.</String>
115 <String Id="InstallScopeDlgPerMachine" Overridable="yes">{\WixUI_Font_Emphasized}Für alle Benutzer dieses &amp;Computers installieren</String>
116 <String Id="InstallScopeDlgPerMachineDescription" Overridable="yes">[ProductName] wird in einem Computerordner erstellt und steht allen Benutzern zur Verfügung. Sie können den Standardinstallationsordner ändern. Sie benötigen dazu lokale Administratorberechtigungen.</String>
117 <String Id="InstallScopeDlgFolderLabel" Overridable="yes">Installations&amp;ordner:</String>
118 <String Id="InstallScopeDlgChange" Overridable="yes">&amp;Ändern...</String>
119
120 <String Id="InvalidDirDlg_Title" Overridable="yes">[ProductName]-Setup</String>
121 <String Id="InvalidDirDlgText" Overridable="yes">Das Installationsverzeichnis muss sich auf einer lokalen Festplatte befinden.</String>
122 <String Id="InvalidDirDlgIcon" Overridable="yes">WixUI_Ico_Info</String>
123 <String Id="InvalidDirDlgIconTooltip" Overridable="yes">Informationssymbol</String>
124
125 <String Id="LicenseAgreementDlg_Title" Overridable="yes">[ProductName]-Setup</String>
126 <String Id="LicenseAgreementDlgLicenseAcceptedCheckBox" Overridable="yes">Ich &amp;stimme den Bedingungen der Lizenzvereinbarung zu.</String>
127 <String Id="LicenseAgreementDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
128 <String Id="LicenseAgreementDlgDescription" Overridable="yes">Lesen Sie die nachfolgenden Lizenzbedingungen aufmerksam durch</String>
129 <String Id="LicenseAgreementDlgTitle" Overridable="yes">{\WixUI_Font_Title}Lizenzbedingungen</String>
130
131 <String Id="MaintenanceTypeDlg_Title" Overridable="yes">[ProductName]-Setup</String>
132 <String Id="MaintenanceTypeDlgChangeButton" Overridable="yes">&amp;Ändern</String>
133 <String Id="MaintenanceTypeDlgChangeButtonTooltip" Overridable="yes">Installation ändern</String>
134 <String Id="MaintenanceTypeDlgRepairButton" Overridable="yes">Re&amp;parieren</String>
135 <String Id="MaintenanceTypeDlgRepairButtonTooltip" Overridable="yes">Installation reparieren</String>
136 <String Id="MaintenanceTypeDlgRemoveButton" Overridable="yes">&amp;Entfernen</String>
137 <String Id="MaintenanceTypeDlgRemoveButtonTooltip" Overridable="yes">Installation entfernen</String>
138 <String Id="MaintenanceTypeDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
139 <String Id="MaintenanceTypeDlgDescription" Overridable="yes">Wählen Sie den gewünschten Vorgang aus.</String>
140 <String Id="MaintenanceTypeDlgTitle" Overridable="yes">{\WixUI_Font_Title}Ändern, Reparieren oder Entfernen der Installation</String>
141 <String Id="MaintenanceTypeDlgChangeText" Overridable="yes">Ermöglicht eine benutzerspezifische Anpassung der installierten Funktionen.</String>
142 <String Id="MaintenanceTypeDlgChangeDisabledText" Overridable="yes">[ProductName] verfügt nicht über unabhängig voneinander auswählbare Funktionen.</String>
143 <String Id="MaintenanceTypeDlgRemoveText" Overridable="yes">Entfernt [ProductName] vom Computer.</String>
144 <String Id="MaintenanceTypeDlgRemoveDisabledText" Overridable="yes">[ProductName] kann nicht entfernt werden.</String>
145 <String Id="MaintenanceTypeDlgRepairText" Overridable="yes">Repariert das zuletzt installierte Programm durch Berichtigen von fehlenden und beschädigten Dateien, Verknüpfungen und Registrierungseinträgen.</String>
146 <String Id="MaintenanceTypeDlgRepairDisabledText" Overridable="yes">[ProductName] kann nicht repariert werden.</String>
147
148 <String Id="MaintenanceWelcomeDlg_Title" Overridable="yes">[ProductName]-Setup</String>
149 <String Id="MaintenanceWelcomeDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
150 <String Id="MaintenanceWelcomeDlgDescription" Overridable="yes">Mit dem Setup-Assistenten können Sie die Installationsart der [ProductName]-Funktionen auf dem Computer ändern oder das Produkt vom Computer entfernen. Klicken Sie auf "Weiter", um den Vorgang fortzusetzen, bzw. auf "Abbrechen", um den Setup-Assistenten zu beenden.</String>
151 <String Id="MaintenanceWelcomeDlgTitle" Overridable="yes">{\WixUI_Font_Bigger}Willkommen beim Setup-Assistenten von [ProductName]</String>
152
153 <String Id="MsiRMFilesInUse_Title" Overridable="yes">[ProductName]-Setup</String>
154 <String Id="MsiRMFilesInUseBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
155 <String Id="MsiRMFilesInUseText" Overridable="yes">Folgende Anwendungen verwenden Dateien, die aktualisiert werden müssen. Sie können diese vom Setup-Assistenten schließen lassen und versuchen, sie neu zu starten, oder Sie führen später einen Neustart des Computers aus.</String>
156 <String Id="MsiRMFilesInUseDescription" Overridable="yes">Einige Dateien, die aktualisiert werden müssen, werden zurzeit verwendet.</String>
157 <String Id="MsiRMFilesInUseTitle" Overridable="yes">{\WixUI_Font_Title}Dateien werden verwendet</String>
158 <String Id="MsiRMFilesInUseUseRM" Overridable="yes">&amp;Anwendungen zuerst schließen und dann neu starten</String>
159 <String Id="MsiRMFilesInUseDontUseRM" Overridable="yes">Anwendungen &amp;nicht schließen (späterer Neustart erforderlich)</String>
160
161 <String Id="OutOfDiskDlg_Title" Overridable="yes">[ProductName]-Setup</String>
162 <String Id="OutOfDiskDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
163 <String Id="OutOfDiskDlgText" Overridable="yes">Die hervorgehobenen Volumes verfügen nicht über genügend Speicherplatz für die aktuell ausgewählten Funktionen. Sie können einige Dateien von diesen Volumes entfernen, weniger Funktionen installieren oder ein anderes Ziellaufwerk auswählen.</String>
164 <String Id="OutOfDiskDlgDescription" Overridable="yes">Für die Installation ist nicht genügend Speicherplatz verfügbar.</String>
165 <String Id="OutOfDiskDlgTitle" Overridable="yes">{\WixUI_Font_Title}Nicht genügend Speicherplatz</String>
166 <String Id="OutOfDiskDlgVolumeList" Overridable="yes">{120}{70}{70}{70}{70}</String>
167
168 <String Id="OutOfRbDiskDlg_Title" Overridable="yes">[ProductName]-Setup</String>
169 <String Id="OutOfRbDiskDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
170 <String Id="OutOfRbDiskDlgText" Overridable="yes">Die hervorgehobenen Volumes verfügen nicht über genügend Speicherplatz für die aktuell ausgewählten Funktionen. Sie können einige Dateien von diesen Volumes entfernen, weniger Funktionen installieren oder ein anderes Ziellaufwerk auswählen.</String>
171 <String Id="OutOfRbDiskDlgDescription" Overridable="yes">Für die Installation ist nicht genügend Speicherplatz verfügbar.</String>
172 <String Id="OutOfRbDiskDlgTitle" Overridable="yes">{\WixUI_Font_Title}Nicht genügend Speicherplatz</String>
173 <String Id="OutOfRbDiskDlgVolumeList" Overridable="yes">{120}{70}{70}{70}{70}</String>
174 <String Id="OutOfRbDiskDlgText2" Overridable="yes">Alternativ können Sie die Rollbackfunktion des Installationsprogramms deaktivieren. Das Deaktivieren des Rollbacks verhindert, dass das Installationsprogramm den Ursprungszustand des Computers wiederherstellen kann, wenn die Installation unterbrochen werden sollte. Klicken Sie auf "Ja", wenn Sie das Risiko eingehen möchten, das Rollback zu deaktivieren.</String>
175
176 <String Id="PrepareDlg_Title" Overridable="yes">[ProductName]-Setup</String>
177 <String Id="PrepareDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
178 <String Id="PrepareDlgDescription" Overridable="yes">Warten Sie, während die Installation vorbereitet wird.</String>
179 <String Id="PrepareDlgTitle" Overridable="yes">{\WixUI_Font_Bigger}Willkommen beim Setup-Assistenten von [ProductName]</String>
180
181 <String Id="ProgressDlg_Title" Overridable="yes">[ProductName]-Setup</String>
182 <String Id="ProgressDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
183 <String Id="ProgressDlgTextInstalling" Overridable="yes">Warten Sie, während [ProductName] vom Setup-Assistenten installiert wird.</String>
184 <String Id="ProgressDlgTitleInstalling" Overridable="yes">{\WixUI_Font_Title}[ProductName] wird installiert</String>
185 <String Id="ProgressDlgTextChanging" Overridable="yes">Warten Sie, während [ProductName] vom Setup-Assistenten geändert wird.</String>
186 <String Id="ProgressDlgTitleChanging" Overridable="yes">{\WixUI_Font_Title}[ProductName] wird geändert</String>
187 <String Id="ProgressDlgTextRepairing" Overridable="yes">Warten Sie, während [ProductName] vom Setup-Assistenten repariert wird.</String>
188 <String Id="ProgressDlgTitleRepairing" Overridable="yes">{\WixUI_Font_Title}[ProductName] wird repariert</String>
189 <String Id="ProgressDlgTextRemoving" Overridable="yes">Warten Sie, während [ProductName] vom Setup-Assistenten entfernt wird.</String>
190 <String Id="ProgressDlgTitleRemoving" Overridable="yes">{\WixUI_Font_Title}[ProductName] wird entfernt</String>
191 <String Id="ProgressDlgTextUpdating" Overridable="yes">Der Setup-Assistent aktualisiert [ProductName]. Bitte warten Sie.</String>
192 <String Id="ProgressDlgTitleUpdating" Overridable="yes">{\WixUI_Font_Title}[ProductName] wird aktualisiert</String>
193 <String Id="ProgressDlgProgressBar" Overridable="yes">Ausgeführt</String>
194 <String Id="ProgressDlgStatusLabel" Overridable="yes">Status:</String>
195
196 <String Id="ResumeDlg_Title" Overridable="yes">[ProductName]-Setup</String>
197 <String Id="ResumeDlgInstall" Overridable="yes">&amp;Installieren</String>
198 <String Id="ResumeDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
199 <String Id="ResumeDlgDescription" Overridable="yes">Die Installation von [ProductName] wird vom Setup-Assistenten auf dem Computer abgeschlossen. Klicken Sie auf "Installieren", um den Vorgang fortzusetzen, bzw. auf "Abbrechen", um den Setup-Assistenten zu beenden.</String>
200 <String Id="ResumeDlgTitle" Overridable="yes">{\WixUI_Font_Bigger}Der Setup-Assistent für [ProductName] wird fortgesetzt</String>
201
202 <String Id="SetupTypeDlg_Title" Overridable="yes">[ProductName]-Setup</String>
203 <String Id="SetupTypeDlgTypicalButton" Overridable="yes">&amp;Standard</String>
204 <String Id="SetupTypeDlgTypicalButtonTooltip" Overridable="yes">Standardinstallation</String>
205 <String Id="SetupTypeDlgCustomButton" Overridable="yes">&amp;Benutzerdefiniert</String>
206 <String Id="SetupTypeDlgCustomButtonTooltip" Overridable="yes">Benutzerdefinierte Installation</String>
207 <String Id="SetupTypeDlgCompleteButton" Overridable="yes">&amp;Vollständig</String>
208 <String Id="SetupTypeDlgCompleteButtonTooltip" Overridable="yes">Vollständige Installation</String>
209 <String Id="SetupTypeDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
210 <String Id="SetupTypeDlgTitle" Overridable="yes">{\WixUI_Font_Title}Installationstyp wählen</String>
211 <String Id="SetupTypeDlgDescription" Overridable="yes">Wählen Sie die für Sie passende Installationsart aus</String>
212 <String Id="SetupTypeDlgTypicalText" Overridable="yes">Standardprogrammfunktionen werden installiert. Empfohlen für die meisten Benutzer.</String>
213 <String Id="SetupTypeDlgCustomText" Overridable="yes">Installiert die vom Benutzer festgelegten Programmfunktionen am vom Benutzer angegebenen Speicherort. Empfohlen für fortgeschrittene Benutzer.</String>
214 <String Id="SetupTypeDlgCompleteText" Overridable="yes">Alle Programmfunktionen werden installiert. Erfordert den meisten Speicherplatz.</String>
215
216 <String Id="UserExit_Title" Overridable="yes">[ProductName]-Setup</String>
217 <String Id="UserExitBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
218 <String Id="UserExitTitle" Overridable="yes">{\WixUI_Font_Bigger}Der Setup-Assistent für [ProductName] wurde unterbrochen.</String>
219 <String Id="UserExitDescription1" Overridable="yes">Die [ProductName]-Installation wurde unterbrochen. Das System wurde nicht verändert. Sie müssen die Installation erneut ausführen, wenn Sie dieses Programm zu einem späteren Zeitpunkt installieren möchten.</String>
220 <String Id="UserExitDescription2" Overridable="yes">Klicken Sie auf "Fertig stellen", um den Setup-Assistenten zu beenden.</String>
221
222 <String Id="VerifyReadyDlg_Title" Overridable="yes">[ProductName]-Setup</String>
223 <String Id="VerifyReadyDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
224 <String Id="VerifyReadyDlgInstall" Overridable="yes">&amp;Installieren</String>
225 <String Id="VerifyReadyDlgInstallText" Overridable="yes">Klicken Sie auf "Installieren", um die Installation zu starten. Klicken Sie auf "Zurück", um die Installationseinstellungen zu prüfen oder zu ändern. Klicken Sie auf "Abbrechen", um den Assistenten zu beenden.</String>
226 <String Id="VerifyReadyDlgInstallTitle" Overridable="yes">{\WixUI_Font_Title}Bereit zur Installation von [ProductName]</String>
227 <String Id="VerifyReadyDlgChange" Overridable="yes">&amp;Ändern</String>
228 <String Id="VerifyReadyDlgChangeText" Overridable="yes">Klicken Sie auf "Ändern", um die Installation zu starten. Klicken Sie auf "Zurück", um die Installationseinstellungen zu prüfen oder zu ändern. Klicken Sie auf "Abbrechen", um den Assistenten zu beenden.</String>
229 <String Id="VerifyReadyDlgChangeTitle" Overridable="yes">{\WixUI_Font_Title}Bereit zur Änderung von [ProductName]</String>
230 <String Id="VerifyReadyDlgRepair" Overridable="yes">Re&amp;parieren</String>
231 <String Id="VerifyReadyDlgRepairText" Overridable="yes">Klicken Sie auf "Reparieren", um die Installation von [ProductName] zu reparieren. Klicken Sie auf "Zurück", um die Installationseinstellungen zu prüfen oder zu ändern. Klicken Sie auf "Abbrechen", um den Assistenten zu beenden.</String>
232 <String Id="VerifyReadyDlgRepairTitle" Overridable="yes">{\WixUI_Font_Title}Bereit zur Reparatur von [ProductName]</String>
233 <String Id="VerifyReadyDlgRemove" Overridable="yes">&amp;Entfernen</String>
234 <String Id="VerifyReadyDlgRemoveText" Overridable="yes">Klicken Sie auf "Entfernen", um [ProductName] vom Computer zu entfernen. Klicken Sie auf "Zurück", um die Installationseinstellungen zu prüfen oder zu ändern. Klicken Sie auf "Abbrechen", um den Assistenten zu beenden.</String>
235 <String Id="VerifyReadyDlgRemoveTitle" Overridable="yes">{\WixUI_Font_Title}Bereit zum Entfernen von [ProductName]</String>
236 <String Id="VerifyReadyDlgUpdate" Overridable="yes">&amp;Aktualisieren</String>
237 <String Id="VerifyReadyDlgUpdateText" Overridable="yes">Klicken Sie auf "Aktualisieren", um [ProductName] auf Ihrem Computer zu aktualisieren. Klicken Sie auf "Zurück", um die Installationseinstellungen zu prüfen oder zu ändern. Klicken Sie auf "Abbrechen", um den Assistenten zu beenden.</String>
238 <String Id="VerifyReadyDlgUpdateTitle" Overridable="yes">{\WixUI_Font_Title}Bereit zum Aktualisieren von [ProductName]</String>
239
240 <String Id="WaitForCostingDlg_Title" Overridable="yes">[ProductName]-Setup</String>
241 <String Id="WaitForCostingDlgReturn" Overridable="yes">&amp;Zurückspringen</String>
242 <String Id="WaitForCostingDlgText" Overridable="yes">Das Installationsprogramm ermittelt den Speicherplatzbedarf. Bitte warten Sie.</String>
243 <String Id="WaitForCostingDlgIcon" Overridable="yes">WixUI_Ico_Exclam</String>
244 <String Id="WaitForCostingDlgIconTooltip" Overridable="yes">Hinweissymbol</String>
245
246 <String Id="WelcomeDlg_Title" Overridable="yes">[ProductName]-Setup</String>
247 <String Id="WelcomeDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
248 <String Id="WelcomeDlgDescription" Overridable="yes">[ProductName] wird auf dem Computer installiert. Klicken Sie auf "Weiter", um den Vorgang fortzusetzen, oder auf "Abbrechen", um den Setup-Assistenten zu beenden.</String>
249 <String Id="WelcomeUpdateDlgDescriptionUpdate" Overridable="yes">[ProductName] wird auf dem Computer aktualisiert. Klicken Sie auf "Weiter", um den Vorgang fortzusetzen, oder auf "Abbrechen", um den Setup-Assistenten zu beenden.</String>
250 <String Id="WelcomeDlgTitle" Overridable="yes">{\WixUI_Font_Bigger}Willkommen beim Setup-Assistenten von [ProductName]</String>
251
252 <String Id="WelcomeEulaDlg_Title" Overridable="yes">[ProductName]-Setup</String>
253 <String Id="WelcomeEulaDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
254 <String Id="WelcomeEulaDlgLicenseAcceptedCheckBox" Overridable="yes">Ich &amp;stimme den Bedingungen der Lizenzvereinbarung zu.</String>
255 <String Id="WelcomeEulaDlgInstall" Overridable="yes">&amp;Installieren</String>
256 <String Id="WelcomeEulaDlgUpdate" Overridable="yes">&amp;Aktualisieren</String>
257 <String Id="WelcomeEulaDlgTitle" Overridable="yes">{\WixUI_Font_Title}Lesen Sie die Lizenzbedingungen für [ProductName].</String>
258
259 <String Id="ProgressTextInstallValidate" Overridable="yes">Installation wird überprüft</String>
260 <String Id="ProgressTextInstallFiles" Overridable="yes">Neue Dateien werden kopiert</String>
261 <String Id="ProgressTextInstallFilesTemplate" Overridable="yes">Datei: [1], Verzeichnis: [9], Größe: [6]</String>
262 <String Id="ProgressTextInstallAdminPackage" Overridable="yes">Netzwerkinstallationsdateien werden kopiert</String>
263 <String Id="ProgressTextInstallAdminPackageTemplate" Overridable="yes">Datei: [1], Verzeichnis: [9], Größe: [6]</String>
264 <String Id="ProgressTextFileCost" Overridable="yes">Speicherplatzbedarf wird berechnet</String>
265 <String Id="ProgressTextCostInitialize" Overridable="yes">Speicherplatzbedarf wird berechnet</String>
266 <String Id="ProgressTextCostFinalize" Overridable="yes">Speicherplatzbedarf wird berechnet</String>
267 <String Id="ProgressTextCreateShortcuts" Overridable="yes">Verknüpfungen werden erstellt</String>
268 <String Id="ProgressTextCreateShortcutsTemplate" Overridable="yes">Verknüpfung: [1]</String>
269 <String Id="ProgressTextPublishComponents" Overridable="yes">Qualifizierte Komponenten werden veröffentlicht</String>
270 <String Id="ProgressTextPublishComponentsTemplate" Overridable="yes">Komponenten-ID: [1], Qualifizierer: [2]</String>
271 <String Id="ProgressTextPublishFeatures" Overridable="yes">Produktfunktionen werden veröffentlicht</String>
272 <String Id="ProgressTextPublishFeaturesTemplate" Overridable="yes">Funktion: [1]</String>
273 <String Id="ProgressTextPublishProduct" Overridable="yes">Produktinformationen werden veröffentlicht</String>
274 <String Id="ProgressTextRegisterClassInfo" Overridable="yes">Klassenserver werden registriert</String>
275 <String Id="ProgressTextRegisterClassInfoTemplate" Overridable="yes">Klassen-ID: [1]</String>
276 <String Id="ProgressTextRegisterExtensionInfo" Overridable="yes">Erweiterungsserver werden registriert</String>
277 <String Id="ProgressTextRegisterExtensionInfoTemplate" Overridable="yes">Erweiterung: [1]</String>
278 <String Id="ProgressTextRegisterMIMEInfo" Overridable="yes">MIME-Informationen werden registriert</String>
279 <String Id="ProgressTextRegisterMIMEInfoTemplate" Overridable="yes">MIME-Inhaltstyp: [1], Erweiterung: [2]</String>
280 <String Id="ProgressTextRegisterProgIdInfo" Overridable="yes">Programm-IDs werden registriert</String>
281 <String Id="ProgressTextRegisterProgIdInfoTemplate" Overridable="yes">Programmkennung: [1]</String>
282 <String Id="ProgressTextAllocateRegistrySpace" Overridable="yes">Registrierungsspeicher wird zugeordnet</String>
283 <String Id="ProgressTextAllocateRegistrySpaceTemplate" Overridable="yes">Freier Speicherplatz: [1]</String>
284 <String Id="ProgressTextAppSearch" Overridable="yes">Installierte Anwendungen werden gesucht</String>
285 <String Id="ProgressTextAppSearchTemplate" Overridable="yes">Eigenschaft: [1], Signatur: [2]</String>
286 <String Id="ProgressTextBindImage" Overridable="yes">Ausführbare Dateien werden gebunden</String>
287 <String Id="ProgressTextBindImageTemplate" Overridable="yes">Datei: [1]</String>
288 <String Id="ProgressTextCCPSearch" Overridable="yes">Berechtigende Produkte werden gesucht</String>
289 <String Id="ProgressTextCreateFolders" Overridable="yes">Ordner werden erstellt</String>
290 <String Id="ProgressTextCreateFoldersTemplate" Overridable="yes">Ordner: [1]</String>
291 <String Id="ProgressTextDeleteServices" Overridable="yes">Dienste werden gelöscht</String>
292 <String Id="ProgressTextDeleteServicesTemplate" Overridable="yes">Dienst: [1]</String>
293 <String Id="ProgressTextDuplicateFiles" Overridable="yes">Dateiduplikat wird erstellt</String>
294 <String Id="ProgressTextDuplicateFilesTemplate" Overridable="yes">Datei: [1], Verzeichnis: [9], Größe: [6]</String>
295 <String Id="ProgressTextFindRelatedProducts" Overridable="yes">Verwandte Anwendungen werden gesucht</String>
296 <String Id="ProgressTextFindRelatedProductsTemplate" Overridable="yes">Gefundene Anwendung: [1]</String>
297 <String Id="ProgressTextInstallODBC" Overridable="yes">ODBC-Komponenten werden installiert</String>
298 <String Id="ProgressTextInstallServices" Overridable="yes">Neue Dienste werden installiert</String>
299 <String Id="ProgressTextInstallServicesTemplate" Overridable="yes">Dienst: [2]</String>
300 <String Id="ProgressTextLaunchConditions" Overridable="yes">Die Startbedingungen werden überprüft</String>
301 <String Id="ProgressTextMigrateFeatureStates" Overridable="yes">Funktionsstatus verwandter Anwendungen wird migriert</String>
302 <String Id="ProgressTextMigrateFeatureStatesTemplate" Overridable="yes">Anwendung: [1]</String>
303 <String Id="ProgressTextMoveFiles" Overridable="yes">Dateien werden verschoben</String>
304 <String Id="ProgressTextMoveFilesTemplate" Overridable="yes">Datei: [1], Verzeichnis: [9], Größe: [6]</String>
305 <String Id="ProgressTextPatchFiles" Overridable="yes">Dateien werden gepatcht</String>
306 <String Id="ProgressTextPatchFilesTemplate" Overridable="yes">Datei: [1], Verzeichnis: [2], Größe: [3]</String>
307 <String Id="ProgressTextProcessComponents" Overridable="yes">Komponentenregistrierung wird aktualisiert</String>
308 <String Id="ProgressTextRegisterComPlus" Overridable="yes">COM+-Anwendungen und -Komponenten werden registriert</String>
309 <String Id="ProgressTextRegisterComPlusTemplate" Overridable="yes">Anwendungs-ID: [1]{{, Anwendungstyp: [2], Benutzer: [3], RSN: [4]}}</String>
310 <String Id="ProgressTextRegisterFonts" Overridable="yes">Schriftarten werden registriert</String>
311 <String Id="ProgressTextRegisterFontsTemplate" Overridable="yes">Schriftart: [1]</String>
312 <String Id="ProgressTextRegisterProduct" Overridable="yes">Produkt wird registriert</String>
313 <String Id="ProgressTextRegisterProductTemplate" Overridable="yes">[1]</String>
314 <String Id="ProgressTextRegisterTypeLibraries" Overridable="yes">Typbibliotheken werden registriert</String>
315 <String Id="ProgressTextRegisterTypeLibrariesTemplate" Overridable="yes">Bibliothekenkennung: [1]</String>
316 <String Id="ProgressTextRegisterUser" Overridable="yes">Benutzer wird registriert</String>
317 <String Id="ProgressTextRegisterUserTemplate" Overridable="yes">[1]</String>
318 <String Id="ProgressTextRemoveDuplicateFiles" Overridable="yes">Dateiduplikate werden entfernt</String>
319 <String Id="ProgressTextRemoveDuplicateFilesTemplate" Overridable="yes">Datei: [1], Verzeichnis: [9]</String>
320 <String Id="ProgressTextRemoveEnvironmentStrings" Overridable="yes">Umgebungszeichenfolgen werden aktualisiert</String>
321 <String Id="ProgressTextRemoveEnvironmentStringsTemplate" Overridable="yes">Name: [1], Wert: [2], Aktion [3]</String>
322 <String Id="ProgressTextRemoveExistingProducts" Overridable="yes">Anwendungen werden entfernt</String>
323 <String Id="ProgressTextRemoveExistingProductsTemplate" Overridable="yes">Anwendung: [1], Befehlszeile: [2]</String>
324 <String Id="ProgressTextRemoveFiles" Overridable="yes">Dateien werden entfernt</String>
325 <String Id="ProgressTextRemoveFilesTemplate" Overridable="yes">Datei: [1], Verzeichnis: [9]</String>
326 <String Id="ProgressTextRemoveFolders" Overridable="yes">Ordner werden entfernt</String>
327 <String Id="ProgressTextRemoveFoldersTemplate" Overridable="yes">Ordner: [1]</String>
328 <String Id="ProgressTextRemoveIniValues" Overridable="yes">INI-Dateieinträge werden entfernt</String>
329 <String Id="ProgressTextRemoveIniValuesTemplate" Overridable="yes">Datei: [1], Abschnitt: [2], Schlüssel: [3], Wert: [4]</String>
330 <String Id="ProgressTextRemoveODBC" Overridable="yes">ODBC-Komponenten werden entfernt</String>
331 <String Id="ProgressTextRemoveRegistryValues" Overridable="yes">Systemregistrierungswerte werden entfernt</String>
332 <String Id="ProgressTextRemoveRegistryValuesTemplate" Overridable="yes">Schlüssel: [1], Name: [2]</String>
333 <String Id="ProgressTextRemoveShortcuts" Overridable="yes">Verknüpfungen werden entfernt</String>
334 <String Id="ProgressTextRemoveShortcutsTemplate" Overridable="yes">Verknüpfung: [1]</String>
335 <String Id="ProgressTextRMCCPSearch" Overridable="yes">Berechtigende Produkte werden gesucht</String>
336 <String Id="ProgressTextSelfRegModules" Overridable="yes">Module werden registriert</String>
337 <String Id="ProgressTextSelfRegModulesTemplate" Overridable="yes">Datei: [1], Ordner: [2]</String>
338 <String Id="ProgressTextSelfUnregModules" Overridable="yes">Modulregistrierung wird aufgehoben</String>
339 <String Id="ProgressTextSelfUnregModulesTemplate" Overridable="yes">Datei: [1], Ordner: [2]</String>
340 <String Id="ProgressTextSetODBCFolders" Overridable="yes">ODBC-Verzeichnisse werden initialisiert</String>
341 <String Id="ProgressTextStartServices" Overridable="yes">Dienste werden gestartet</String>
342 <String Id="ProgressTextStartServicesTemplate" Overridable="yes">Dienst: [1]</String>
343 <String Id="ProgressTextStopServices" Overridable="yes">Dienste werden beendet</String>
344 <String Id="ProgressTextStopServicesTemplate" Overridable="yes">Dienst: [1]</String>
345 <String Id="ProgressTextUnpublishComponents" Overridable="yes">Veröffentlichung qualifizierter Komponenten wird aufgehoben</String>
346 <String Id="ProgressTextUnpublishComponentsTemplate" Overridable="yes">Komponenten-ID: [1], Qualifizierer: [2]</String>
347 <String Id="ProgressTextUnpublishFeatures" Overridable="yes">Veröffentlichung der Produktfunktionen wird aufgehoben</String>
348 <String Id="ProgressTextUnpublishFeaturesTemplate" Overridable="yes">Funktion: [1]</String>
349 <String Id="ProgressTextUnregisterClassInfo" Overridable="yes">Registrierung der Klassenserver wird aufgehoben</String>
350 <String Id="ProgressTextUnregisterClassInfoTemplate" Overridable="yes">Klassen-ID: [1]</String>
351 <String Id="ProgressTextUnregisterComPlus" Overridable="yes">Registrierung der COM+-Anwendungen und -Komponenten wird aufgehoben</String>
352 <String Id="ProgressTextUnregisterComPlusTemplate" Overridable="yes">Anwendungs-ID: [1]{{, Anwendungstyp: [2]}}</String>
353 <String Id="ProgressTextUnregisterExtensionInfo" Overridable="yes">Registrierung der Erweiterungsserver wird aufgehoben</String>
354 <String Id="ProgressTextUnregisterExtensionInfoTemplate" Overridable="yes">Erweiterung: [1]</String>
355 <String Id="ProgressTextUnregisterFonts" Overridable="yes">Registrierung der Schriftarten wird aufgehoben</String>
356 <String Id="ProgressTextUnregisterFontsTemplate" Overridable="yes">Schriftart: [1]</String>
357 <String Id="ProgressTextUnregisterMIMEInfo" Overridable="yes">Registrierung der MIME-Informationen wird aufgehoben</String>
358 <String Id="ProgressTextUnregisterMIMEInfoTemplate" Overridable="yes">MIME-Inhaltstyp: [1], Erweiterung: [2]</String>
359 <String Id="ProgressTextUnregisterProgIdInfo" Overridable="yes">Registrierung der Programm-IDs wird aufgehoben</String>
360 <String Id="ProgressTextUnregisterProgIdInfoTemplate" Overridable="yes">Programmkennung: [1]</String>
361 <String Id="ProgressTextUnregisterTypeLibraries" Overridable="yes">Registrierung der Typbibliotheken wird aufgehoben</String>
362 <String Id="ProgressTextUnregisterTypeLibrariesTemplate" Overridable="yes">Bibliothekenkennung: [1]</String>
363 <String Id="ProgressTextWriteEnvironmentStrings" Overridable="yes">Umgebungszeichenfolgen werden aktualisiert</String>
364 <String Id="ProgressTextWriteEnvironmentStringsTemplate" Overridable="yes">Name: [1], Wert: [2], Aktion [3]</String>
365 <String Id="ProgressTextWriteIniValues" Overridable="yes">INI-Dateiwerte werden geschrieben</String>
366 <String Id="ProgressTextWriteIniValuesTemplate" Overridable="yes">Datei: [1], Abschnitt: [2], Schlüssel: [3], Wert: [4]</String>
367 <String Id="ProgressTextWriteRegistryValues" Overridable="yes">Systemregistrierungswerte werden geschrieben</String>
368 <String Id="ProgressTextWriteRegistryValuesTemplate" Overridable="yes">Schlüssel: [1], Name: [2], Wert: [3]</String>
369 <String Id="ProgressTextAdvertise" Overridable="yes">Anwendung wird angekündigt</String>
370 <String Id="ProgressTextGenerateScript" Overridable="yes">Für folgende Aktion werden Skriptvorgänge erstellt:</String>
371 <String Id="ProgressTextGenerateScriptTemplate" Overridable="yes">[1]</String>
372 <String Id="ProgressTextInstallSFPCatalogFile" Overridable="yes">Systemkatalog wird installiert</String>
373 <String Id="ProgressTextInstallSFPCatalogFileTemplate" Overridable="yes">Datei: [1], Abhängigkeiten: [2]</String>
374 <String Id="ProgressTextMsiPublishAssemblies" Overridable="yes">Assemblyinformationen werden veröffentlicht</String>
375 <String Id="ProgressTextMsiPublishAssembliesTemplate" Overridable="yes">Anwendungskontext:[1], Assemblyname:[2]</String>
376 <String Id="ProgressTextMsiUnpublishAssemblies" Overridable="yes">Veröffentlichung der Assemblyinformationen wird aufgehoben</String>
377 <String Id="ProgressTextMsiUnpublishAssembliesTemplate" Overridable="yes">Anwendungskontext:[1], Assemblyname:[2]</String>
378 <String Id="ProgressTextRollback" Overridable="yes">Rollback für Aktion wird ausgeführt:</String>
379 <String Id="ProgressTextRollbackTemplate" Overridable="yes">[1]</String>
380 <String Id="ProgressTextRollbackCleanup" Overridable="yes">Sicherungsdateien werden entfernt</String>
381 <String Id="ProgressTextRollbackCleanupTemplate" Overridable="yes">Datei: [1]</String>
382 <String Id="ProgressTextUnmoveFiles" Overridable="yes">Verschobene Dateien werden entfernt</String>
383 <String Id="ProgressTextUnmoveFilesTemplate" Overridable="yes">Datei: [1], Verzeichnis: [9]</String>
384 <String Id="ProgressTextUnpublishProduct" Overridable="yes">Veröffentlichung der Produktinformationen wird aufgehoben</String>
385
386 <String Id="Error0" Overridable="yes">{{Schwerwiegender Fehler: }}</String>
387 <String Id="Error1" Overridable="yes">{{Fehler [1]. }}</String>
388 <String Id="Error2" Overridable="yes">Warnung [1]. </String>
389 <String Id="Error4" Overridable="yes">Informationen [1]. </String>
390 <String Id="Error5" Overridable="yes">Bei der Installation dieses Pakets ist ein unerwarteter Fehler aufgetreten. Es liegt eventuell ein das Paket betreffendes Problem vor. Der Fehlercode ist [1]. {{Argumente: [2], [3], [4]}}</String>
391 <String Id="Error7" Overridable="yes">{{Datenträger voll: }}</String>
392 <String Id="Error8" Overridable="yes">Aktion [Time]: [1]. [2]</String>
393 <String Id="Error9" Overridable="yes">[ProductName]</String>
394 <String Id="Error10" Overridable="yes">{[2]}{, [3]}{, [4]}</String>
395 <String Id="Error11" Overridable="yes">Meldungstyp: [1], Argument: [2]</String>
396 <String Id="Error12" Overridable="yes">=== Protokollierung gestartet: [Date] [Time] ===</String>
397 <String Id="Error13" Overridable="yes">=== Protokollierung beendet: [Date] [Time] ===</String>
398 <String Id="Error14" Overridable="yes">Aktion gestartet um [Time]: [1].</String>
399 <String Id="Error15" Overridable="yes">Aktion beendet um [Time]: [1]. Rückgabewert [2].</String>
400 <String Id="Error16" Overridable="yes">Restdauer: {[1] Minuten }{[2] Sekunden}</String>
401 <String Id="Error17" Overridable="yes">Nicht genügend Arbeitsspeicher. Beenden Sie andere Anwendungen, und wiederholen Sie den Vorgang.</String>
402 <String Id="Error18" Overridable="yes">Installationsprogramm reagiert nicht.</String>
403 <String Id="Error19" Overridable="yes">Installationsprogramm wurde vorzeitig abgebrochen.</String>
404 <String Id="Error20" Overridable="yes">Bitte warten Sie, während [ProductName] konfiguriert wird.</String>
405 <String Id="Error21" Overridable="yes">Erforderliche Daten werden ermittelt...</String>
406 <String Id="Error22" Overridable="yes">Ältere Versionen dieser Anwendung werden entfernt...</String>
407 <String Id="Error23" Overridable="yes">Das Entfernen älterer Versionen der Anwendung wird vorbereitet...</String>
408 <String Id="Error32" Overridable="yes">Das Setup für {[ProductName]} wurde erfolgreich abgeschlossen.</String>
409 <String Id="Error33" Overridable="yes">Fehler beim Setup für {[ProductName]}.</String>
410 <String Id="Error1101" Overridable="yes">Fehler beim Lesen der Datei: [2]. {{ Systemfehler [3].}} Überprüfen Sie, ob die Datei vorhanden ist und Sie darauf zugreifen können.</String>
411 <String Id="Error1301" Overridable="yes">Die Datei "[2]" kann nicht erstellt werden. Ein Verzeichnis mit diesem Namen ist bereits vorhanden. Brechen Sie die Installation ab, und versuchen Sie, an einem anderen Ort zu installieren.</String>
412 <String Id="Error1302" Overridable="yes">Legen Sie den Datenträger ein: [2]</String>
413 <String Id="Error1303" Overridable="yes">Die Berechtigungen des Installationsprogramms sind für den Zugriff auf dieses Verzeichnis unzureichend: [2]. Die Installation kann nicht fortgesetzt werden. Melden Sie sich als Administrator an, oder wenden Sie sich an den Systemadministrator.</String>
414 <String Id="Error1304" Overridable="yes">Fehler beim Schreiben in Datei: [2]. Überprüfen Sie, ob Sie auf das Verzeichnis zugreifen können.</String>
415 <String Id="Error1305" Overridable="yes">Fehler beim Lesen der Datei: [2]. {{ Systemfehler [3].}} Überprüfen Sie, ob die Datei vorhanden ist und Sie darauf zugreifen können.</String>
416 <String Id="Error1306" Overridable="yes">Eine andere Anwendung hat exklusiven Zugriff auf die Datei "[2]". Beenden Sie alle anderen Anwendungen, und klicken Sie anschließend auf "Wiederholen".</String>
417 <String Id="Error1307" Overridable="yes">Auf Ihrem Datenträger ist nicht genügend freier Speicherplatz vorhanden, um diese Datei zu installieren: "[2]". Geben Sie zusätzlichen Speicher frei, und klicken Sie auf "Wiederholen", oder klicken Sie auf "Abbrechen", um das Installationsprogramm zu beenden.</String>
418 <String Id="Error1308" Overridable="yes">Die Quelldatei wurde nicht gefunden: [2]. Überprüfen Sie, ob die Datei vorhanden ist, und ob Sie darauf zugreifen können.</String>
419 <String Id="Error1309" Overridable="yes">Fehler beim Lesen der Datei: [3]. {{ Systemfehler [2].}} Überprüfen Sie, ob die Datei vorhanden ist und Sie darauf zugreifen können.</String>
420 <String Id="Error1310" Overridable="yes">Fehler beim Schreiben in Datei: [3]. {{ Systemfehler [2].}} Überprüfen Sie, ob Sie auf das Verzeichnis zugreifen können.</String>
421 <String Id="Error1311" Overridable="yes">Die Quelldatei {{(CAB-Datei)}} wurde nicht gefunden: [2]. Überprüfen Sie, ob die Datei vorhanden ist, und ob Sie darauf zugreifen können.</String>
422 <String Id="Error1312" Overridable="yes">Das Verzeichnis "[2]" kann nicht erstellt werden. Eine Datei mit diesem Namen ist bereits vorhanden. Benennen Sie die Datei um, oder entfernen Sie sie, und klicken Sie dann auf "Wiederholen". Klicken Sie alternativ auf "Abbrechen", um das Programm zu beenden.</String>
423 <String Id="Error1313" Overridable="yes">Das Volume "[2]" ist zurzeit nicht verfügbar. Wählen Sie ein anderes Volume aus.</String>
424 <String Id="Error1314" Overridable="yes">Der angegebene Pfad "[2]" ist nicht verfügbar.</String>
425 <String Id="Error1315" Overridable="yes">In den angegebenen Ordner konnte nicht geschrieben werden: [2].</String>
426 <String Id="Error1316" Overridable="yes">Beim Lesen der Datei ist ein Netzwerkfehler aufgetreten: [2]</String>
427 <String Id="Error1317" Overridable="yes">Beim Erstellen des Verzeichnisses ist ein Fehler aufgetreten: [2]</String>
428 <String Id="Error1318" Overridable="yes">Beim Erstellen des Verzeichnisses ist ein Netzwerkfehler aufgetreten: [2]</String>
429 <String Id="Error1319" Overridable="yes">Beim Öffnen der CAB-Quelldatei [2] ist ein Fehler aufgetreten: [2]</String>
430 <String Id="Error1320" Overridable="yes">Der angegebene Pfad ist zu lang: [2]</String>
431 <String Id="Error1321" Overridable="yes">Das Installationsprogramm besitzt keine ausreichenden Berechtigungen, um diese Datei zu ändern: [2].</String>
432 <String Id="Error1322" Overridable="yes">Ein Teil des Ordnerpfads "[2]" ist ungültig. Er ist entweder leer, oder er überschreitet die im System zulässige Länge.</String>
433 <String Id="Error1323" Overridable="yes">Der Pfad "[2]" enthält ungültige Zeichenfolgen.</String>
434 <String Id="Error1324" Overridable="yes">Der Pfad "[2]" enthält ein ungültiges Zeichen.</String>
435 <String Id="Error1325" Overridable="yes">"[2]" ist kein gültiger kurzer Dateiname.</String>
436 <String Id="Error1326" Overridable="yes">Fehler beim Abrufen der Dateisicherheit: [3] GetLastError: [2]</String>
437 <String Id="Error1327" Overridable="yes">Ungültiges Laufwerk: [2]</String>
438 <String Id="Error1328" Overridable="yes">Fehler beim Anwenden eines Patches auf die Datei [2]. Die Datei wurde wahrscheinlich bereits anderweitig aktualisiert und kann von diesem Patch nicht mehr verändert werden. Weitere Informationen erhalten Sie vom Hersteller des Patches. {{Systemfehler: [3]}}</String>
439 <String Id="Error1329" Overridable="yes">Eine erforderliche Datei kann nicht installiert werden, da die CAB-Datei "[2]" nicht digital signiert wurde. Dies kann darauf hindeuten, dass die CAB-Datei fehlerhaft ist.</String>
440 <String Id="Error1330" Overridable="yes">Eine erforderliche Datei kann nicht installiert werden, da die CAB-Datei [2] eine ungültige digitale Signatur hat. Dies kann darauf hindeuten, dass die CAB-Datei fehlerhaft ist. {{Von WinVerifyTrust wurde der Fehler [3] zurückgegeben.}}</String>
441 <String Id="Error1331" Overridable="yes">Die Datei [2] konnte nicht kopiert werden: CRC-Fehler.</String>
442 <String Id="Error1332" Overridable="yes">Die Datei [2] konnte nicht verschoben werden: CRC-Fehler.</String>
443 <String Id="Error1333" Overridable="yes">Die Datei [2] konnte nicht gepatcht werden: CRC-Fehler.</String>
444 <String Id="Error1334" Overridable="yes">Die Datei "[2]" kann nicht installiert werden, da die Datei in der Kabinettdatei "[3]" nicht gefunden wurde. Dies deutet auf einen Netzwerkfehler, einen CD-Lesefehler oder auf ein das Paket betreffendes Problem hin.</String>
445 <String Id="Error1335" Overridable="yes">Die für die Installation erforderliche Datei "[2]" ist beschädigt und kann nicht verwendet werden. Dies deutet auf einen Netzwerkfehler, einen CD-Lesefehler oder auf ein das Paket betreffendes Problem hin.</String>
446 <String Id="Error1336" Overridable="yes">Beim Erstellen der für die Installation erforderlichen temporären Datei ist ein Fehler aufgetreten.{{ Ordner: [3]. Systemfehlercode: [2]}}</String>
447 <String Id="Error1401" Overridable="yes">Der Schlüssel konnte nicht erstellt werden: [2]. {{ Systemfehler [3].}} Überprüfen Sie, ob Sie ausreichende Zugriffsrechte für diesen Schlüssel besitzen, oder setzen Sie sich mit dem Support in Verbindung. </String>
448 <String Id="Error1402" Overridable="yes">Der Schlüssel konnte nicht geöffnet werden: [2]. {{ Systemfehler [3].}} Überprüfen Sie, ob Sie ausreichende Zugriffsrechte für diesen Schlüssel besitzen, oder setzen Sie sich mit dem Support in Verbindung. </String>
449 <String Id="Error1403" Overridable="yes">Der Wert [2] konnte nicht aus dem Schlüssel [3] gelöscht werden. {{ Systemfehler [4].}} Überprüfen Sie, ob Sie ausreichende Zugriffsrechte für diesen Schlüssel besitzen, oder setzen Sie sich mit dem Support in Verbindung. </String>
450 <String Id="Error1404" Overridable="yes">Der Schlüssel konnte nicht gelöscht werden: [2]. {{ Systemfehler [3].}} Überprüfen Sie, ob Sie ausreichende Zugriffsrechte für diesen Schlüssel besitzen, oder setzen Sie sich mit dem Support in Verbindung. </String>
451 <String Id="Error1405" Overridable="yes">Der Wert [2] konnte nicht aus dem Schlüssel [3] gelesen werden. {{ Systemfehler [4].}} Überprüfen Sie, ob Sie ausreichende Zugriffsrechte für diesen Schlüssel besitzen, oder setzen Sie sich mit dem Support in Verbindung. </String>
452 <String Id="Error1406" Overridable="yes">Der Wert [2] konnte nicht in den Schlüssel [3] geschrieben werden. {{ Systemfehler [4].}} Überprüfen Sie, ob Sie ausreichende Zugriffsrechte für diesen Schlüssel besitzen, oder setzen Sie sich mit dem Support in Verbindung.</String>
453 <String Id="Error1407" Overridable="yes">Die Wertnamen für den Schlüssel [2] konnten nicht gelesen werden. {{ Systemfehler [3].}} Überprüfen Sie, ob Sie ausreichende Zugriffsrechte für diesen Schlüssel besitzen, oder setzen Sie sich mit dem Support in Verbindung.</String>
454 <String Id="Error1408" Overridable="yes">Die Namen der untergeordneten Schlüssel des Schlüssels [2] konnten nicht bestimmt werden. {{ Systemfehler [3].}} Überprüfen Sie, ob Sie ausreichende Zugriffsrechte für diesen Schlüssel besitzen, oder setzen Sie sich mit dem Support in Verbindung.</String>
455 <String Id="Error1409" Overridable="yes">Die Sicherheitsinformationen für den Schlüssel [2] konnten nicht gelesen werden. {{ Systemfehler [3].}} Überprüfen Sie, ob Sie ausreichende Zugriffsrechte für diesen Schlüssel besitzen, oder setzen Sie sich mit dem Support in Verbindung.</String>
456 <String Id="Error1410" Overridable="yes">Der verfügbare Registrierungsspeicher konnte nicht vergrößert werden. [2] KB freier Registrierungsspeicher sind zum Installieren dieser Anwendung erforderlich.</String>
457 <String Id="Error1500" Overridable="yes">Es wird bereits eine weitere Installation ausgeführt. Sie müssen diese Installation abschließen, bevor Sie den Vorgang fortsetzen können.</String>
458 <String Id="Error1501" Overridable="yes">Fehler beim Zugriff auf gesicherte Daten. Stellen Sie sicher, dass Windows Installer ordnungsgemäß konfiguriert ist, und wiederholen Sie die Installation.</String>
459 <String Id="Error1502" Overridable="yes">Benutzer "[2]" hat bereits die Installation für das Produkt "[3]" initiiert. Dieser Benutzer muss die Installation erneut ausführen, bevor dieses Produkt verwendet werden kann. Ihre aktuelle Installation wird jetzt fortgesetzt.</String>
460 <String Id="Error1503" Overridable="yes">Benutzer "[2]" hat bereits die Installation für das Produkt "[3]" initiiert. Dieser Benutzer muss die Installation erneut ausführen, bevor dieses Produkt verwendet werden kann.</String>
461 <String Id="Error1601" Overridable="yes">Nicht genügend freier Speicher auf dem Laufwerk -- Volume: "[2]"; erforderlicher Speicher: [3] KB; verfügbarer Speicher: [4] KB. Geben Sie Datenträgerspeicher frei, und versuchen Sie es erneut.</String>
462 <String Id="Error1602" Overridable="yes">Möchten Sie den Vorgang wirklich abbrechen?</String>
463 <String Id="Error1603" Overridable="yes">Die Datei "[2][3]" ist zurzeit in Gebrauch {des folgenden Prozesses: Name: [4], ID: [5], Fenstertitel: "[6]"}. Schließen Sie die Anwendung, und wiederholen Sie den Vorgang.</String>
464 <String Id="Error1604" Overridable="yes">Das Produkt "[2]" ist bereits installiert und verhindert die Installation dieses Produkts. Die beiden Produkte sind inkompatibel.</String>
465 <String Id="Error1605" Overridable="yes">Auf Volume "[2]" steht nicht genügend Speicherplatz für die Installation bei aktivierter Wiederherstellungsoption zur Verfügung. [3] KB sind erforderlich, aber nur [4] KB sind verfügbar. Klicken Sie auf "Ignorieren", um die Installation ohne Speicherung von Wiederherstellungsinformationen fortzusetzen, klicken Sie auf "Wiederholen", um den verfügbaren Speicher erneut zu überprüfen, oder auf "Abbrechen", um die Installation abzubrechen.</String>
466 <String Id="Error1606" Overridable="yes">Auf die Netzwerkadresse [2] konnte nicht zugegriffen werden.</String>
467 <String Id="Error1607" Overridable="yes">Die folgenden Anwendungen sollten geschlossen werden, bevor Sie die Installation fortsetzen:</String>
468 <String Id="Error1608" Overridable="yes">Es konnte kein kompatibles Produkt auf dem Computer gefunden werden, das zur Installation dieses Produkts erforderlich ist.</String>
469 <String Id="Error1609" Overridable="yes">Fehler beim Anwenden der Sicherheitseinstellungen. "[2]" ist kein gültiger Benutzer und keine gültige Benutzergruppe. Möglicherweise besteht ein Problem mit dem Paket oder beim Herstellen einer Verbindung mit einem Domänencontroller im Netzwerk. Überprüfen Sie die Netzwerkverbindung, und klicken Sie dann auf ''Wiederholen". Wenn Sie die Installation beenden möchten, klicken Sie auf "Abbrechen". {{SID des Benutzers wurde nicht gefunden. Systemfehler [3]}}</String>
470 <String Id="Error1701" Overridable="yes">Der Schlüssel [2] ist ungültig. Überprüfen Sie, ob Sie den richtigen Schlüssel eingegeben haben.</String>
471 <String Id="Error1702" Overridable="yes">Das Installationsprogramm muss den Computer neu starten, damit die Konfiguration von [2] fortgesetzt werden kann. Klicken Sie auf "Ja", um den Computer jetzt neu zu starten, oder auf "Nein", um den Computer später manuell neu zu starten.</String>
472 <String Id="Error1703" Overridable="yes">Sie müssen den Computer neu starten, damit die geänderte Konfiguration von [2] wirksam wird. Klicken Sie auf "Ja", um den Computer jetzt neu zu starten, oder auf "Nein", um den Computer später manuell neu zu starten.</String>
473 <String Id="Error1704" Overridable="yes">Eine Installation von [2] ist im Augenblick ausgesetzt. Sie müssen zuerst die von dieser Installation vorgenommenen Änderungen rückgängig machen, damit Sie den Vorgang fortsetzen können. Möchten Sie diese Änderungen rückgängig machen?</String>
474 <String Id="Error1705" Overridable="yes">Zurzeit wird eine frühere Installation dieses Produkts durchgeführt. Sie müssen zuerst die von dieser Installation vorgenommenen Änderungen rückgängig machen, damit Sie den Vorgang fortsetzen können. Möchten Sie diese Änderungen rückgängig machen?</String>
475 <String Id="Error1706" Overridable="yes">Ein Installationspaket des Produkts [2] konnte nicht gefunden werden. Wiederholen Sie die Installation unter Verwendung einer gültigen Kopie des Installationspakets "[3]".</String>
476 <String Id="Error1707" Overridable="yes">Die Installation wurde erfolgreich abgeschlossen.</String>
477 <String Id="Error1708" Overridable="yes">Fehler bei der Installation.</String>
478 <String Id="Error1709" Overridable="yes">Produkt: [2] -- [3]</String>
479 <String Id="Error1710" Overridable="yes">Sie können den ursprünglichen Zustand des Computers wiederherstellen oder die Installation später fortsetzen. Möchten Sie wiederherstellen?</String>
480 <String Id="Error1711" Overridable="yes">Fehler beim Schreiben der Installationsinformationen auf den Datenträger. Überprüfen Sie, ob genügend Speicherplatz auf dem Datenträger verfügbar ist, und klicken Sie auf "Wiederholen", oder klicken Sie auf "Abbrechen", um die Installation zu beenden.</String>
481 <String Id="Error1712" Overridable="yes">Mindestens eine Datei, die zum Wiederherstellen des vorherigen Zustands des Computers erforderlich ist, wurde nicht gefunden. Eine Wiederherstellung ist nicht möglich.</String>
482 <String Id="Error1713" Overridable="yes">[2] kann eines der erforderlichen Produkte nicht installieren. Wenden Sie sich an den technischen Support. {{Systemfehler: [3].}}</String>
483 <String Id="Error1714" Overridable="yes">Die ältere Version von [2] kann nicht entfernt werden. Wenden Sie sich an den technischen Support. {{Systemfehler [3].}}</String>
484 <String Id="Error1715" Overridable="yes">[2] wird installiert</String>
485 <String Id="Error1716" Overridable="yes">[2] wird konfiguriert</String>
486 <String Id="Error1717" Overridable="yes">[2] wurde entfernt</String>
487 <String Id="Error1718" Overridable="yes">Die Datei "[2]" wurde von der Sicherheitsrichtlinie für digitale Signaturen zurückgewiesen.</String>
488 <String Id="Error1719" Overridable="yes">Auf den Dienst "Windows Installer" konnte nicht zugegriffen werden. Dies kann auftreten, wenn Windows im abgesicherten Modus ausgeführt wird oder wenn der Windows Installer nicht ordnungsgemäß installiert wurde. Setzen Sie sich mit dem Support in Verbindung, um weitere Unterstützung zu erhalten.</String>
489 <String Id="Error1720" Overridable="yes">Problem mit diesem Windows Installer-Paket. Ein für den Abschluss dieser Installation erforderliches Skript konnte nicht ausgeführt werden. Wenden Sie sich an den Support oder den Hersteller des Pakets. {{Benutzerdefinierte Aktion [2] Skriptfehler [3], [4]: [5] Zeile [6], Spalte [7], [8] }}</String>
490 <String Id="Error1721" Overridable="yes">Problem mit diesem Windows Installer-Paket. Ein für den Abschluss der Installation erforderliches Programm konnte nicht ausgeführt werden. Wenden Sie sich an den Support oder den Hersteller des Pakets. {{Aktion: [2], Pfad: [3], Befehl: [4] }}</String>
491 <String Id="Error1722" Overridable="yes">Es liegt ein Problem mit diesem Windows Installer-Paket vor. Ein Programm, das im Rahmen der Installation ausgeführt wurde, wurde nicht erfolgreich abgeschlossen. Wenden Sie sich an den Support oder den Hersteller des Pakets. {{Aktion: [2], Pfad: [3], Befehl: [4] }}</String>
492 <String Id="Error1723" Overridable="yes">Es liegt ein Problem mit diesem Windows Installer-Paket vor. Eine für den Abschluss der Installation erforderliche DLL konnte nicht ausgeführt werden. Wenden Sie sich an den Support oder den Hersteller des Pakets. {{Aktion: [2], Eintrag: [3], Bibliothek: [4] }}</String>
493 <String Id="Error1724" Overridable="yes">Das Entfernen wurde erfolgreich abgeschlossen.</String>
494 <String Id="Error1725" Overridable="yes">Fehler beim Entfernen.</String>
495 <String Id="Error1726" Overridable="yes">Die Ankündigung wurde erfolgreich abgeschlossen.</String>
496 <String Id="Error1727" Overridable="yes">Fehler bei der Ankündigung.</String>
497 <String Id="Error1728" Overridable="yes">Die Konfiguration wurde erfolgreich abgeschlossen.</String>
498 <String Id="Error1729" Overridable="yes">Fehler bei der Konfiguration.</String>
499 <String Id="Error1730" Overridable="yes">Zum Entfernen dieser Anwendung sind Administratorrechte erforderlich. Wenn Sie diese Anwendung entfernen möchten, melden Sie sich als Administrator an, oder wenden Sie sich an den technischen Support.</String>
500 <String Id="Error1731" Overridable="yes">Das Quellinstallationspaket für das Produkt [2] ist nicht mehr mit dem Clientpaket synchron. Wiederholen Sie die Installation unter Verwendung einer gültigen Kopie des Installationspakets "[3]".</String>
501 <String Id="Error1732" Overridable="yes">Zum Abschließen der Installation von [2] ist ein Neustart des Computers erforderlich. Es sind zurzeit andere Benutzer an diesem Computer angemeldet, deren Arbeit bei einem Neustart verloren gehen könnte. Möchten Sie den Neustart jetzt ausführen?</String>
502 <String Id="Error1801" Overridable="yes">Der Pfad "[2]" ist ungültig. Geben Sie einen gültigen Pfad an.</String>
503 <String Id="Error1802" Overridable="yes">Nicht genügend Arbeitsspeicher. Beenden Sie andere Anwendungen, und wiederholen Sie den Vorgang.</String>
504 <String Id="Error1803" Overridable="yes">In Laufwerk [2] ist kein Datenträger eingelegt. Legen Sie einen Datenträger ein und klicken Sie auf "Wiederholen", oder klicken Sie auf "Abbrechen", um zu dem zuvor ausgewählten Volume zurückzukehren.</String>
505 <String Id="Error1804" Overridable="yes">In Laufwerk [2] ist kein Datenträger eingelegt. Legen Sie einen Datenträger ein und klicken Sie auf "Wiederholen", oder klicken Sie auf "Abbrechen", um zum Dialog "Durchsuchen" zurückzukehren und ein anderes Volume auszuwählen.</String>
506 <String Id="Error1805" Overridable="yes">Der Ordner "[2]" ist nicht vorhanden. Geben Sie einen Pfad zu einem vorhandenen Ordner ein.</String>
507 <String Id="Error1806" Overridable="yes">Ihre Zugriffsrechte reichen nicht aus, um diesen Ordner zu lesen.</String>
508 <String Id="Error1807" Overridable="yes">Es konnte kein gültiger Zielordner für die Installation bestimmt werden.</String>
509 <String Id="Error1901" Overridable="yes">Fehler beim Lesen der Quellinstallationsdatenbank: [2].</String>
510 <String Id="Error1902" Overridable="yes">Computerneustart erforderlich: Die Datei [2] wird in [3] umbenannt. Der Computer muss neu gestartet werden, um den Vorgang abzuschließen.</String>
511 <String Id="Error1903" Overridable="yes">Computerneustart erforderlich: Die Datei [2] wird gelöscht. Der Computer muss neu gestartet werden, um den Vorgang abzuschließen.</String>
512 <String Id="Error1904" Overridable="yes">Fehler beim Registrieren des Moduls [2]. HRESULT [3]. Setzen Sie sich mit dem Support in Verbindung.</String>
513 <String Id="Error1905" Overridable="yes">Fehler beim Aufheben der Registrierung des Moduls [2]. HRESULT [3]. Setzen Sie sich mit dem Support in Verbindung.</String>
514 <String Id="Error1906" Overridable="yes">Fehler beim Zwischenspeichern von Paket [2]. Fehler: [3]. Setzen Sie sich mit dem Support in Verbindung.</String>
515 <String Id="Error1907" Overridable="yes">Die Schriftart [2] konnte nicht registriert werden. Stellen Sie sicher, dass Sie über ausreichende Berechtigungen zum Installieren von Schriftarten verfügen und dass diese Schriftart vom System unterstützt wird.</String>
516 <String Id="Error1908" Overridable="yes">Die Registrierung der Schriftart [2] konnte nicht aufgehoben werden. Überprüfen Sie, ob Sie ausreichende Berechtigungen zum Entfernen von Schriftarten besitzen.</String>
517 <String Id="Error1909" Overridable="yes">Die Verknüpfung [2] konnte nicht erstellt werden. Überprüfen Sie, ob der Zielordner vorhanden ist und Sie darauf zugreifen können.</String>
518 <String Id="Error1910" Overridable="yes">Die Verknüpfung [2] konnte nicht entfernt werden. Überprüfen Sie, ob die Verknüpfungsdatei vorhanden ist und Sie darauf zugreifen können.</String>
519 <String Id="Error1911" Overridable="yes">Die Typbibliothek für die Datei "[2]" konnte nicht registriert werden. Setzen Sie sich mit dem Support in Verbindung.</String>
520 <String Id="Error1912" Overridable="yes">Die Registrierung der Typbibliothek für die Datei "[2]" konnte nicht aufgehoben werden. Setzen Sie sich mit dem Support in Verbindung.</String>
521 <String Id="Error1913" Overridable="yes">Die INI-Datei "[2][3]" konnte nicht aktualisiert werden. Überprüfen Sie, ob die Datei vorhanden ist, und ob Sie darauf zugreifen können.</String>
522 <String Id="Error1914" Overridable="yes">Es konnte nicht festgelegt werden, dass die Datei "[3]" beim Neustart des Computers durch die Datei "[2]" ersetzt wird. Überprüfen Sie, ob Sie Schreibberechtigungen für die Datei "[3]" besitzen.</String>
523 <String Id="Error1915" Overridable="yes">Fehler beim Entfernen des ODBC-Treiber-Managers, ODBC-Fehler [2]: [3]. Setzen Sie sich mit dem Support in Verbindung.</String>
524 <String Id="Error1916" Overridable="yes">Fehler beim Installieren des ODBC-Treiber-Managers. ODBC-Fehler [2]: [3]. Setzen Sie sich mit dem Support in Verbindung.</String>
525 <String Id="Error1917" Overridable="yes">Fehler beim Entfernen des ODBC-Treibers [4], ODBC-Fehler [2]: [3]. Überprüfen Sie, ob Sie ausreichende Berechtigungen zum Entfernen von ODBC-Treibern besitzen.</String>
526 <String Id="Error1918" Overridable="yes">Fehler beim Installieren des ODBC-Treibers: [4]. ODBC-Fehler [2]: [3]. Überprüfen Sie, ob die Datei [4] vorhanden ist und Sie darauf zugreifen können.</String>
527 <String Id="Error1919" Overridable="yes">Fehler beim Konfigurieren der ODBC-Datenquelle: [4]. ODBC-Fehler [2]: [3]. Überprüfen Sie, ob die Datei [4] vorhanden ist und Sie darauf zugreifen können.</String>
528 <String Id="Error1920" Overridable="yes">Fehler beim Starten des Diensts "[2]" ([3]). Überprüfen Sie, ob Sie ausreichende Berechtigungen zum Starten von Systemdiensten besitzen.</String>
529 <String Id="Error1921" Overridable="yes">Fehler beim Beenden des Diensts "[2]" ([3]). Überprüfen Sie, ob Sie ausreichende Berechtigungen zum Beenden von Systemdiensten besitzen.</String>
530 <String Id="Error1922" Overridable="yes">Der Dienst "[2]" ([3]) konnte nicht gelöscht werden. Überprüfen Sie, ob Sie ausreichende Berechtigungen zum Entfernen von Systemdiensten besitzen.</String>
531 <String Id="Error1923" Overridable="yes">Der Dienst "[2]" ([3]) konnte nicht installiert werden. Überprüfen Sie, ob Sie ausreichende Berechtigungen zum Installieren von Systemdiensten besitzen.</String>
532 <String Id="Error1924" Overridable="yes">Die Umgebungsvariable "[2]" konnte nicht aktualisiert werden. Überprüfen Sie, ob Sie ausreichende Berechtigungen zum Ändern von Umgebungsvariablen besitzen.</String>
533 <String Id="Error1925" Overridable="yes">Sie besitzen keine ausreichenden Berechtigungen, um diese Installation für alle Benutzer dieses Computers auszuführen. Melden Sie sich als Administrator an, und wiederholen Sie diese Installation.</String>
534 <String Id="Error1926" Overridable="yes">Die Dateisicherheit für Datei "[3]" konnte nicht festgelegt werden. Fehler: [2]. Überprüfen Sie, ob Sie ausreichende Berechtigungen zum Ändern der Sicherheitsberechtigungen für diese Datei besitzen.</String>
535 <String Id="Error1927" Overridable="yes">Die Komponentendienste (COM+ 1.0) sind auf dem Computer nicht installiert. Für den erfolgreichen Abschluss dieser Installation sind die Komponentendienste erforderlich. Die Komponentendienste sind unter Windows 2000 verfügbar.</String>
536 <String Id="Error1928" Overridable="yes">Fehler beim Registrieren der COM+-Anwendung. Weitere Informationen erhalten Sie vom Support.</String>
537 <String Id="Error1929" Overridable="yes">Fehler beim Aufheben der Registrierung der COM+-Anwendung. Weitere Informationen erhalten Sie vom Support.</String>
538 <String Id="Error1930" Overridable="yes">Die Beschreibung für den Dienst "[2]" ([3]) konnte nicht geändert werden.</String>
539 <String Id="Error1931" Overridable="yes">Der Windows Installer-Dienst kann die Systemdatei "[2]" nicht aktualisieren, weil sie von Windows geschützt wird. Möglicherweise müssen Sie das Betriebssystem aktualisieren, damit dieses Programm ordnungsgemäß funktionieren kann. {{Paketversion: [3], geschützte Betriebssystemversion: [4]}}</String>
540 <String Id="Error1932" Overridable="yes">Der Dienst "Windows Installer" kann die geschützte Windows-Datei [2] nicht aktualisieren. {{Paketversion: [3], geschützte Betriebssystemversion: [4], Systemdateischutzfehler: [5]}}</String>
541 <String Id="Error1933" Overridable="yes">Der Windows Installer-Dienst kann mindestens eine geschützte Windows-Datei nicht aktualisieren. {{Systemdateischutzfehler: [2]. Liste der geschützten Dateien:\r\n[3]}}</String>
542 <String Id="Error1934" Overridable="yes">Installationen durch Benutzer werden durch Richtlinien für den Computer deaktiviert.</String>
543 <String Id="Error1935" Overridable="yes">Fehler bei der Installation der Assembly "[6]". Weitere Informationen erhalten Sie in der Hilfe und vom Support. HRESULT: [3]. {{Assemblyschnittstelle: [4], Funktion: [5], Komponente: [2]}}</String>
544 <String Id="Error1936" Overridable="yes">Fehler bei der Installation der Assembly "[6]". Die Assembly hat keinen starken Namen oder wurde nicht mit der minimalen Schlüssellänge signiert. HRESULT: [3]. {{Assemblyschnittstelle: [4], Funktion: [5], Komponente: [2]}}</String>
545 <String Id="Error1937" Overridable="yes">Fehler bei der Installation der Assembly "[6]". Die Signatur oder der Katalog konnte nicht überprüft werden bzw. ist ungültig. HRESULT: [3]. {{Assemblyschnittstelle: [4], Funktion: [5], Komponente: [2]}}</String>
546 <String Id="Error1938" Overridable="yes">Fehler bei der Installation der Assembly "[6]". Mindestens ein Modul der Assembly wurde nicht gefunden. HRESULT: [3]. {{Assemblyschnittstelle: [4], Funktion: [5], Komponente: [2]}}</String>
547
548 <String Id="UITextbytes" Overridable="yes">Bytes</String>
549 <String Id="UITextGB" Overridable="yes">GB</String>
550 <String Id="UITextKB" Overridable="yes">KB</String>
551 <String Id="UITextMB" Overridable="yes">MB</String>
552 <String Id="UITextMenuAbsent" Overridable="yes">Die gesamte Funktion wird nicht verfügbar sein</String>
553 <String Id="UITextMenuAdvertise" Overridable="yes">Die Funktion wird bei Bedarf installiert</String>
554 <String Id="UITextMenuAllCD" Overridable="yes">Die gesamte Funktion wird zum Ausführen von der CD installiert</String>
555 <String Id="UITextMenuAllLocal" Overridable="yes">Die Funktion wird vollständig auf der lokalen Festplatte installiert</String>
556 <String Id="UITextMenuAllNetwork" Overridable="yes">Die gesamte Funktion wird zum Ausführen vom Netzwerk installiert</String>
557 <String Id="UITextMenuCD" Overridable="yes">Wird zum Ausführen von der CD installiert</String>
558 <String Id="UITextMenuLocal" Overridable="yes">Wird auf der lokalen Festplatte installiert</String>
559 <String Id="UITextMenuNetwork" Overridable="yes">Wird zum Starten vom Netzwerk installiert</String>
560 <String Id="UITextNewFolder" Overridable="yes">Folder|Neuer Ordner</String>
561 <String Id="UITextScriptInProgress" Overridable="yes">Erforderliche Daten werden ermittelt...</String>
562 <String Id="UITextSelAbsentAbsent" Overridable="yes">Die Funktion wird nicht installiert</String>
563 <String Id="UITextSelAbsentAdvertise" Overridable="yes">Die Funktion wird bei Bedarf installiert</String>
564 <String Id="UITextSelAbsentCD" Overridable="yes">Die Funktion wird zum Starten von CD installiert</String>
565 <String Id="UITextSelAbsentLocal" Overridable="yes">Diese Funktion wird auf der lokalen Festplatte installiert</String>
566 <String Id="UITextSelAbsentNetwork" Overridable="yes">Diese Funktion wird zum Starten vom Netzwerk installiert</String>
567 <String Id="UITextSelAdvertiseAbsent" Overridable="yes">Die Funktion wird nicht verfügbar sein</String>
568 <String Id="UITextSelAdvertiseAdvertise" Overridable="yes">Wird bei Bedarf installiert</String>
569 <String Id="UITextSelAdvertiseCD" Overridable="yes">Die Funktion wird von der CD gestartet</String>
570 <String Id="UITextSelAdvertiseLocal" Overridable="yes">Diese Funktion wird auf der lokalen Festplatte installiert</String>
571 <String Id="UITextSelAdvertiseNetwork" Overridable="yes">Die Funktion wird vom Netzwerk gestartet</String>
572 <String Id="UITextSelCDAbsent" Overridable="yes">Die Funktion wird vollständig entfernt. Sie können sie auch nicht von der CD starten</String>
573 <String Id="UITextSelCDAdvertise" Overridable="yes">Die Funktion wird nicht mehr von der CD gestartet, sondern bei Bedarf installiert</String>
574 <String Id="UITextSelCDCD" Overridable="yes">Die Funktion wird weiterhin von der CD gestartet</String>
575 <String Id="UITextSelCDLocal" Overridable="yes">Diese Funktion wird nicht mehr von CD gestartet, sondern auf der lokalen Festplatte installiert.</String>
576 <String Id="UITextSelChildCostNeg" Overridable="yes">Die Funktion gibt [1] auf der Festplatte frei.</String>
577 <String Id="UITextSelChildCostPos" Overridable="yes">Die Funktion erfordert [1] auf der Festplatte.</String>
578 <String Id="UITextSelCostPending" Overridable="yes">Speicherplatzbedarf für diese Funktion wird ermittelt...</String>
579 <String Id="UITextSelLocalAbsent" Overridable="yes">Die Funktion wird vollständig entfernt</String>
580 <String Id="UITextSelLocalAdvertise" Overridable="yes">Diese Funktion wird von der lokalen Festplatte entfernt und bei der ersten Verwendung installiert</String>
581 <String Id="UITextSelLocalCD" Overridable="yes">Diese Funktion wird von der lokalen Festplatte entfernt, kann jedoch weiterhin von CD gestartet werden</String>
582 <String Id="UITextSelLocalLocal" Overridable="yes">Die Funktion bleibt weiterhin auf der lokalen Festplatte installiert</String>
583 <String Id="UITextSelLocalNetwork" Overridable="yes">Die Funktion wird von der lokalen Festplatte entfernt, bleibt aber zum Starten vom Netzwerk installiert</String>
584 <String Id="UITextSelNetworkAbsent" Overridable="yes">Diese Funktion wird vollständig entfernt. Sie können sie auch nicht vom Netzwerk starten</String>
585 <String Id="UITextSelNetworkAdvertise" Overridable="yes">Die Funktion wird nicht mehr vom Netzwerk gestartet, sondern bei Bedarf installiert</String>
586 <String Id="UITextSelNetworkLocal" Overridable="yes">Die Funktion wird nicht mehr vom Netzwerk gestartet, sondern auf der lokalen Festplatte installiert</String>
587 <String Id="UITextSelNetworkNetwork" Overridable="yes">Die Funktion wird weiterhin vom Netzwerk gestartet</String>
588 <String Id="UITextSelParentCostNegNeg" Overridable="yes">Die Funktion gibt [1] auf der Festplatte frei. Es sind [2] von [3] untergeordneten Funktionen ausgewählt, die [4] auf der Festplatte freigeben.</String>
589 <String Id="UITextSelParentCostNegPos" Overridable="yes">Die Funktion gibt [1] auf der Festplatte frei. Es sind [2] von [3] untergeordneten Funktionen ausgewählt, die [4] auf der Festplatte erfordern.</String>
590 <String Id="UITextSelParentCostPosNeg" Overridable="yes">Die Funktion erfordert [1] auf der Festplatte. Es sind [2] von [3] untergeordneten Funktionen ausgewählt, die [4] auf der Festplatte freigeben.</String>
591 <String Id="UITextSelParentCostPosPos" Overridable="yes">Die Funktion erfordert [1] auf der Festplatte. Es sind [2] von [3] untergeordneten Funktionen ausgewählt, die [4] auf der Festplatte erfordern.</String>
592 <String Id="UITextTimeRemaining" Overridable="yes">Restdauer: {[1] Minuten }{[2] Sekunden}</String>
593 <String Id="UITextVolumeCostAvailable" Overridable="yes">Verfügbar</String>
594 <String Id="UITextVolumeCostDifference" Overridable="yes">Differenz</String>
595 <String Id="UITextVolumeCostRequired" Overridable="yes">Erforderlich</String>
596 <String Id="UITextVolumeCostSize" Overridable="yes">Datenträgergröße</String>
597 <String Id="UITextVolumeCostVolume" Overridable="yes">Volume</String>
598</WixLocalization>
diff --git a/src/ext/UI/wixlib/WixUI_el-GR.wxl b/src/ext/UI/wixlib/WixUI_el-GR.wxl
new file mode 100644
index 00000000..78f3ba31
--- /dev/null
+++ b/src/ext/UI/wixlib/WixUI_el-GR.wxl
@@ -0,0 +1,598 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3
4
5<WixLocalization Culture="el-gr" Codepage="1253" xmlns="http://wixtoolset.org/schemas/v4/wxl">
6 <String Id="WixUIBack" Overridable="yes">&amp;Πίσω</String>
7 <String Id="WixUINext" Overridable="yes">Ε&amp;πόμενο</String>
8 <String Id="WixUICancel" Overridable="yes">Άκυρο</String>
9 <String Id="WixUIFinish" Overridable="yes">&amp;Τέλος</String>
10 <String Id="WixUIRetry" Overridable="yes">&amp;Επανάληψη</String>
11 <String Id="WixUIIgnore" Overridable="yes">&amp;Παράβλεψη</String>
12 <String Id="WixUIYes" Overridable="yes">&amp;Ναι</String>
13 <String Id="WixUINo" Overridable="yes">Όχ&amp;ι</String>
14 <String Id="WixUIOK" Overridable="yes">ΟΚ</String>
15 <String Id="WixUIPrint" Overridable="yes">&amp;Εκτύπωση</String>
16
17 <String Id="AdvancedWelcomeEulaDlg_Title" Overridable="yes">Πρόγραμμα εγκατάστασης του [ProductName]</String>
18 <String Id="AdvancedWelcomeEulaDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
19 <String Id="AdvancedWelcomeEulaDlgTitle" Overridable="yes">{\WixUI_Font_Title}Διαβάστε τη σύμβαση άδειας χρήσης του [ProductName]</String>
20 <String Id="AdvancedWelcomeEulaDlgLicenseAcceptedCheckBox" Overridable="yes">&amp;Αποδέχομαι τους όρους της άδειας χρήσης</String>
21 <String Id="AdvancedWelcomeEulaDlgDescriptionPerMachine" Overridable="yes">Επιλέξτε "Εγκατάσταση", για να εγκαταστήσετε το προϊόν με προεπιλογές για όλους τους χρήστες. Επιλέξτε "Για προχωρημένους", για να αλλάξετε τις επιλογές εγκατάστασης.</String>
22 <String Id="AdvancedWelcomeEulaDlgDescriptionPerUser" Overridable="yes">Επιλέξτε "Εγκατάσταση", για να εγκαταστήσετε το προϊόν με προεπιλογές μόνο για εσάς. Επιλέξτε "Για προχωρημένους", για να αλλάξετε τις επιλογές εγκατάστασης.</String>
23 <String Id="AdvancedWelcomeEulaDlgInstall" Overridable="yes">&amp;Εγκατάσταση</String>
24 <String Id="AdvancedWelcomeEulaDlgAdvanced" Overridable="yes">Γ&amp;ια προχωρημένους</String>
25 <String Id="Advanced_Font_Normal_Size" Overridable="yes">8</String>
26 <String Id="Advanced_Font_Bigger_Size" Overridable="yes">12</String>
27 <String Id="Advanced_Font_Title_Size" Overridable="yes">9</String>
28 <String Id="Advanced_Font_Emphasized_Size" Overridable="yes">8</String>
29 <String Id="Advanced_Font_FaceName" Overridable="yes">Tahoma</String>
30
31 <String Id="BrowseDlg_Title" Overridable="yes">Πρόγραμμα εγκατάστασης του [ProductName]</String>
32 <String Id="BrowseDlgComboLabel" Overridable="yes">&amp;Αναζήτηση σε:</String>
33 <String Id="BrowseDlgWixUI_Bmp_Up" Overridable="yes">WixUI_Bmp_Up</String>
34 <String Id="BrowseDlgWixUI_Bmp_UpTooltip" Overridable="yes">Ένα επίπεδο επάνω</String>
35 <String Id="BrowseDlgNewFolder" Overridable="yes">WixUI_Bmp_New</String>
36 <String Id="BrowseDlgNewFolderTooltip" Overridable="yes">Δημιουργία νέου φακέλου</String>
37 <String Id="BrowseDlgPathLabel" Overridable="yes">Ό&amp;νομα φακέλου:</String>
38 <String Id="BrowseDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
39 <String Id="BrowseDlgDescription" Overridable="yes">Αναζήτηση του φακέλου προορισμού</String>
40 <String Id="BrowseDlgTitle" Overridable="yes">{\WixUI_Font_Title}Αλλαγή φακέλου προορισμού</String>
41
42 <String Id="CancelDlg_Title" Overridable="yes">Πρόγραμμα εγκατάστασης του [ProductName]</String>
43 <String Id="CancelDlgText" Overridable="yes">Είστε βέβαιοι ότι θέλετε να ακυρώσετε την εγκατάσταση του [ProductName];</String>
44 <String Id="CancelDlgIcon" Overridable="yes">WixUI_Ico_Info</String>
45 <String Id="CancelDlgIconTooltip" Overridable="yes">Εικονίδιο πληροφοριών</String>
46
47 <String Id="CustomizeDlg_Title" Overridable="yes">Πρόγραμμα εγκατάστασης του [ProductName]</String>
48 <String Id="CustomizeDlgTree" Overridable="yes">Δέντρο επιλογών</String>
49 <String Id="CustomizeDlgBrowse" Overridable="yes">Α&amp;ναζήτηση...</String>
50 <String Id="CustomizeDlgReset" Overridable="yes">Επανα&amp;φορά</String>
51 <String Id="CustomizeDlgDiskCost" Overridable="yes">Χρήση &amp;δίσκου</String>
52 <String Id="CustomizeDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
53 <String Id="CustomizeDlgText" Overridable="yes">Κάντε κλικ στα εικονίδια στο παρακάτω δέντρο, για να αλλάξετε τον τρόπο εγκατάστασης των δυνατοτήτων.</String>
54 <String Id="CustomizeDlgDescription" Overridable="yes">Επιλέξτε τον τρόπο εγκατάστασης των δυνατοτήτων.</String>
55 <String Id="CustomizeDlgTitle" Overridable="yes">{\WixUI_Font_Title}Προσαρμοσμένη εγκατάσταση</String>
56 <String Id="CustomizeDlgItemDescription" Overridable="yes">CustomizeDlgItemDescription-CustomizeDlgItemDescription</String>
57 <String Id="CustomizeDlgItemSize" Overridable="yes">CustomizeDlgItemSize-CustomizeDlgItemSize</String>
58 <String Id="CustomizeDlgLocation" Overridable="yes">CustomizeDlgLocation-CustomizeDlgLocation</String>
59 <String Id="CustomizeDlgLocationLabel" Overridable="yes">Θέση:</String>
60
61 <String Id="DiskCostDlg_Title" Overridable="yes">Πρόγραμμα εγκατάστασης του [ProductName]</String>
62 <String Id="DiskCostDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
63 <String Id="DiskCostDlgText" Overridable="yes">Οι τόμοι που επισημαίνονται δεν έχουν αρκετό διαθέσιμο χώρο στο δίσκο για τις επιλεγμένες δυνατότητες. Μπορείτε να καταργήσετε μερικά αρχεία από τους τόμους που επισημαίνονται, να εγκαταστήσετε λιγότερες δυνατότητες ή να επιλέξετε μια διαφορετική μονάδα δίσκου προορισμού.</String>
64 <String Id="DiskCostDlgDescription" Overridable="yes">Ο χώρος στο δίσκο που απαιτείται για την εγκατάσταση των επιλεγμένων δυνατοτήτων.</String>
65 <String Id="DiskCostDlgTitle" Overridable="yes">{\WixUI_Font_Title}Απαιτήσεις χώρου στο δίσκο</String>
66 <String Id="DiskCostDlgVolumeList" Overridable="yes">{120}{70}{70}{70}{70}</String>
67
68 <String Id="ErrorDlg_Title" Overridable="yes">Πρόγραμμα εγκατάστασης του [ProductName]</String>
69 <String Id="ErrorDlgErrorText" Overridable="yes">Κείμενο πληροφοριών</String>
70 <String Id="ErrorDlgErrorIcon" Overridable="yes">WixUI_Ico_Info</String>
71 <String Id="ErrorDlgErrorIconTooltip" Overridable="yes">Εικονίδιο πληροφοριών</String>
72
73 <String Id="ExitDialog_Title" Overridable="yes">Πρόγραμμα εγκατάστασης του [ProductName]</String>
74 <String Id="ExitDialogBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
75 <String Id="ExitDialogDescription" Overridable="yes">Κάντε κλικ στο κουμπί "Τέλος", για να εξέλθετε από τον Οδηγό εγκατάστασης.</String>
76 <String Id="ExitDialogTitle" Overridable="yes">{\WixUI_Font_Bigger}Ο Οδηγός εγκατάστασης του [ProductName] ολοκληρώθηκε</String>
77
78 <String Id="FatalError_Title" Overridable="yes">Πρόγραμμα εγκατάστασης του [ProductName]</String>
79 <String Id="FatalErrorBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
80 <String Id="FatalErrorTitle" Overridable="yes">{\WixUI_Font_Bigger}Ο Οδηγός εγκατάστασης του [ProductName] τερματίστηκε πρόωρα</String>
81 <String Id="FatalErrorDescription1" Overridable="yes">Ο Οδηγός εγκατάστασης του [ProductName] τερματίστηκε πρόωρα λόγω σφάλματος. Το σύστημά σας δεν τροποποιήθηκε. Για να εγκαταστήσετε αυτό το πρόγραμμα αργότερα, εκτελέστε ξανά τον Οδηγό εγκατάστασης.</String>
82 <String Id="FatalErrorDescription2" Overridable="yes">Κάντε κλικ στο κουμπί "Τέλος", για να εξέλθετε από τον Οδηγό εγκατάστασης.</String>
83
84 <String Id="FeaturesDlg_Title" Overridable="yes">Πρόγραμμα εγκατάστασης του [ProductName]</String>
85 <String Id="FeaturesDlgTree" Overridable="yes">Δυνατότητες προϊόντος</String>
86 <String Id="FeaturesDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
87 <String Id="FeaturesDlgDescription" Overridable="yes">Επιλέξτε τον τρόπο εγκατάστασης των δυνατοτήτων.</String>
88 <String Id="FeaturesDlgTitle" Overridable="yes">{\WixUI_Font_Title}Δυνατότητες προϊόντος</String>
89 <String Id="FeaturesDlgItemDescription" Overridable="yes">FeaturesDlgItemDescription</String>
90 <String Id="FeaturesDlgItemSize" Overridable="yes">FeaturesDlgItemSize</String>
91 <String Id="FeaturesDlgInstall" Overridable="yes">&amp;Εγκατάσταση</String>
92 <String Id="FeaturesDlgChange" Overridable="yes">&amp;Αλλαγή</String>
93
94 <String Id="FilesInUse_Title" Overridable="yes">Πρόγραμμα εγκατάστασης του [ProductName]</String>
95 <String Id="FilesInUseExit" Overridable="yes">Έ&amp;ξοδος</String>
96 <String Id="FilesInUseBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
97 <String Id="FilesInUseText" Overridable="yes">Οι ακόλουθες εφαρμογές χρησιμοποιούν αρχεία που πρέπει να ενημερωθούν από αυτό το πρόγραμμα εγκατάστασης. Κλείστε αυτές τις εφαρμογές και μετά κάντε κλικ στο κουμπί "&amp;Επανάληψη" για να συνεχίσετε την εγκατάσταση ή στο κουμπί "Έξοδος" για να βγείτε από αυτήν.</String>
98 <String Id="FilesInUseDescription" Overridable="yes">Κάποια αρχεία που πρέπει να ενημερωθούν βρίσκονται σε χρήση αυτήν τη στιγμή.</String>
99 <String Id="FilesInUseTitle" Overridable="yes">{\WixUI_Font_Title}Αρχεία σε χρήση</String>
100
101 <String Id="InstallDirDlg_Title" Overridable="yes">Πρόγραμμα εγκατάστασης του [ProductName]</String>
102 <String Id="InstallDirDlgChange" Overridable="yes">&amp;Αλλαγή...</String>
103 <String Id="InstallDirDlgTitle" Overridable="yes">{\WixUI_Font_Title}Φάκελος προορισμού</String>
104 <String Id="InstallDirDlgDescription" Overridable="yes">Επιλέξτε "Επόμενο" για εγκατάσταση στον προεπιλεγμένο φάκελο ή "Αλλαγή", για επιλογή κάποιου άλλου φακέλου.</String>
105 <String Id="InstallDirDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
106 <String Id="InstallDirDlgFolderLabel" Overridable="yes">Εγκατάσταση του [ProductName] στη θέση:</String>
107
108 <String Id="InstallScopeDlg_Title" Overridable="yes">Πρόγραμμα εγκατάστασης του [ProductName]</String>
109 <String Id="InstallScopeDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
110 <String Id="InstallScopeDlgDescription" Overridable="yes">Επιλέξτε την εμβέλεια και το φάκελο εγκατάστασης</String>
111 <String Id="InstallScopeDlgTitle" Overridable="yes">{\WixUI_Font_Title}Εμβέλεια εγκατάστασης</String>
112 <String Id="InstallScopeDlgPerUser" Overridable="yes">{\WixUI_Font_Emphasized}Εγκατάσταση &amp;μόνο για εσάς, το χρήστη ([LogonUser])</String>
113 <String Id="InstallScopeDlgPerUserDescription" Overridable="yes">Το [ProductName] θα εγκατασταθεί σε ένα φάκελο ανά χρήστη και θα είναι διαθέσιμο μόνο για τον δικό σας λογαριασμό χρήστη. Δεν χρειάζεστε δικαιώματα τοπικού διαχειριστή.</String>
114 <String Id="InstallScopeDlgNoPerUserDescription" Overridable="yes">Το [ProductName] δεν υποστηρίζει την εγκατάσταση ανά χρήστη.</String>
115 <String Id="InstallScopeDlgPerMachine" Overridable="yes">{\WixUI_Font_Emphasized}Εγκατάσταση για όλους τους χρήστες αυτού του &amp;υπολογιστή</String>
116 <String Id="InstallScopeDlgPerMachineDescription" Overridable="yes">Το [ProductName] θα εγκατασταθεί από προεπιλογή σε ένα φάκελο ανά υπολογιστή και θα είναι διαθέσιμο σε όλους τους χρήστες. Μπορείτε να αλλάξετε τον προεπιλεγμένο φάκελο εγκατάστασης. Πρέπει να διαθέτετε δικαιώματα τοπικού διαχειριστή.</String>
117 <String Id="InstallScopeDlgFolderLabel" Overridable="yes">Φάκελος &amp;εγκατάστασης:</String>
118 <String Id="InstallScopeDlgChange" Overridable="yes">&amp;Αλλαγή...</String>
119
120 <String Id="InvalidDirDlg_Title" Overridable="yes">Πρόγραμμα εγκατάστασης του [ProductName]</String>
121 <String Id="InvalidDirDlgText" Overridable="yes">Ο κατάλογος εγκατάστασης πρέπει να βρίσκεται σε έναν τοπικό σκληρό δίσκο.</String>
122 <String Id="InvalidDirDlgIcon" Overridable="yes">WixUI_Ico_Info</String>
123 <String Id="InvalidDirDlgIconTooltip" Overridable="yes">Εικονίδιο πληροφοριών</String>
124
125 <String Id="LicenseAgreementDlg_Title" Overridable="yes">Πρόγραμμα εγκατάστασης του [ProductName]</String>
126 <String Id="LicenseAgreementDlgLicenseAcceptedCheckBox" Overridable="yes">&amp;Αποδέχομαι τους όρους της άδειας χρήσης</String>
127 <String Id="LicenseAgreementDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
128 <String Id="LicenseAgreementDlgDescription" Overridable="yes">Διαβάστε προσεκτικά την παρακάτω άδειας χρήσης</String>
129 <String Id="LicenseAgreementDlgTitle" Overridable="yes">{\WixUI_Font_Title}Άδεια χρήσης τελικού χρήστη</String>
130
131 <String Id="MaintenanceTypeDlg_Title" Overridable="yes">Πρόγραμμα εγκατάστασης του [ProductName]</String>
132 <String Id="MaintenanceTypeDlgChangeButton" Overridable="yes">&amp;Αλλαγή</String>
133 <String Id="MaintenanceTypeDlgChangeButtonTooltip" Overridable="yes">Αλλαγή εγκατάστασης</String>
134 <String Id="MaintenanceTypeDlgRepairButton" Overridable="yes">Επι&amp;διόρθωση</String>
135 <String Id="MaintenanceTypeDlgRepairButtonTooltip" Overridable="yes">Επιδιόρθωση εγκατάστασης</String>
136 <String Id="MaintenanceTypeDlgRemoveButton" Overridable="yes">&amp;Κατάργηση</String>
137 <String Id="MaintenanceTypeDlgRemoveButtonTooltip" Overridable="yes">Κατάργηση εγκατάστασης</String>
138 <String Id="MaintenanceTypeDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
139 <String Id="MaintenanceTypeDlgDescription" Overridable="yes">Επιλέξτε τη λειτουργία που θέλετε να εκτελέσετε.</String>
140 <String Id="MaintenanceTypeDlgTitle" Overridable="yes">{\WixUI_Font_Title}Αλλαγή, επιδιόρθωση ή κατάργηση εγκατάστασης</String>
141 <String Id="MaintenanceTypeDlgChangeText" Overridable="yes">Σας επιτρέπει να αλλάξετε τον τρόπο εγκατάστασης των δυνατοτήτων.</String>
142 <String Id="MaintenanceTypeDlgChangeDisabledText" Overridable="yes">Το [ProductName] δεν διαθέτει δυνατότητες που μπορούν να επιλεγούν ανεξάρτητα.</String>
143 <String Id="MaintenanceTypeDlgRemoveText" Overridable="yes">Καταργεί το [ProductName] από τον υπολογιστή σας.</String>
144 <String Id="MaintenanceTypeDlgRemoveDisabledText" Overridable="yes">Δεν είναι δυνατή η κατάργηση του [ProductName].</String>
145 <String Id="MaintenanceTypeDlgRepairText" Overridable="yes">Επιδιορθώνει σφάλματα στην πιο πρόσφατη εγκατάσταση, διορθώνοντας αρχεία, συντομεύσεις και καταχωρήσεις μητρώου που λείπουν ή που έχουν καταστραφεί.</String>
146 <String Id="MaintenanceTypeDlgRepairDisabledText" Overridable="yes">Δεν είναι δυνατή η επιδιόρθωση του [ProductName].</String>
147
148 <String Id="MaintenanceWelcomeDlg_Title" Overridable="yes">Πρόγραμμα εγκατάστασης του [ProductName]</String>
149 <String Id="MaintenanceWelcomeDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
150 <String Id="MaintenanceWelcomeDlgDescription" Overridable="yes">Ο Οδηγός εγκατάστασης σάς επιτρέπει να αλλάξετε τον τρόπο εγκατάστασης των δυνατοτήτων του [ProductName] στον υπολογιστή σας ή την κατάργησή του από τον υπολογιστή σας. Κάντε κλικ στο κουμπί "Επόμενο", για να συνεχίσετε ή στο κουμπί "Άκυρο", για να εξέλθετε από τον Οδηγό εγκατάστασης.</String>
151 <String Id="MaintenanceWelcomeDlgTitle" Overridable="yes">{\WixUI_Font_Bigger}Καλώς ορίσατε στον Οδηγό εγκατάστασης του [ProductName]</String>
152
153 <String Id="MsiRMFilesInUse_Title" Overridable="yes">Πρόγραμμα εγκατάστασης του [ProductName]</String>
154 <String Id="MsiRMFilesInUseBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
155 <String Id="MsiRMFilesInUseText" Overridable="yes">Οι ακόλουθες εφαρμογές χρησιμοποιούν αρχεία που πρέπει να ενημερωθούν από αυτό το πρόγραμμα εγκατάστασης. Μπορείτε να αφήσετε τον Οδηγό εγκατάστασης να τα κλείσει και να προσπαθήσει να τα επανεκκινήσει ή να κάνετε επανεκκίνηση του υπολογιστή αργότερα.</String>
156 <String Id="MsiRMFilesInUseDescription" Overridable="yes">Κάποια αρχεία που πρέπει να ενημερωθούν βρίσκονται σε χρήση αυτήν τη στιγμή.</String>
157 <String Id="MsiRMFilesInUseTitle" Overridable="yes">{\WixUI_Font_Title}Αρχεία σε χρήση</String>
158 <String Id="MsiRMFilesInUseUseRM" Overridable="yes">&amp;Κλείστε τις εφαρμογές και επιχειρήστε να τις επανεκκινήσετε.</String>
159 <String Id="MsiRMFilesInUseDontUseRM" Overridable="yes">&amp;Μην κλείνετε τις εφαρμογές. Θα απαιτηθεί επανεκκίνηση.</String>
160
161 <String Id="OutOfDiskDlg_Title" Overridable="yes">Πρόγραμμα εγκατάστασης του [ProductName]</String>
162 <String Id="OutOfDiskDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
163 <String Id="OutOfDiskDlgText" Overridable="yes">Οι τόμοι που επισημαίνονται δεν έχουν αρκετό διαθέσιμο χώρο στο δίσκο για τις επιλεγμένες δυνατότητες. Μπορείτε να καταργήσετε μερικά αρχεία από τους τόμους που επισημαίνονται, να εγκαταστήσετε λιγότερες δυνατότητες ή να επιλέξετε μια διαφορετική μονάδα δίσκου προορισμού.</String>
164 <String Id="OutOfDiskDlgDescription" Overridable="yes">Ο χώρος στο δίσκο που απαιτείται για την εγκατάσταση υπερβαίνει τον διαθέσιμο χώρο στο δίσκο.</String>
165 <String Id="OutOfDiskDlgTitle" Overridable="yes">{\WixUI_Font_Title}Ο χώρος στο δίσκο εξαντλήθηκε</String>
166 <String Id="OutOfDiskDlgVolumeList" Overridable="yes">{120}{70}{70}{70}{70}</String>
167
168 <String Id="OutOfRbDiskDlg_Title" Overridable="yes">Πρόγραμμα εγκατάστασης του [ProductName]</String>
169 <String Id="OutOfRbDiskDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
170 <String Id="OutOfRbDiskDlgText" Overridable="yes">Οι τόμοι που επισημαίνονται δεν έχουν αρκετό διαθέσιμο χώρο στο δίσκο για τις επιλεγμένες δυνατότητες. Μπορείτε να καταργήσετε μερικά αρχεία από τους τόμους που επισημαίνονται, να εγκαταστήσετε λιγότερες δυνατότητες ή να επιλέξετε μια διαφορετική μονάδα δίσκου προορισμού.</String>
171 <String Id="OutOfRbDiskDlgDescription" Overridable="yes">Ο χώρος στο δίσκο που απαιτείται για την εγκατάσταση υπερβαίνει τον διαθέσιμο χώρο στο δίσκο.</String>
172 <String Id="OutOfRbDiskDlgTitle" Overridable="yes">{\WixUI_Font_Title}Ο χώρος στο δίσκο εξαντλήθηκε</String>
173 <String Id="OutOfRbDiskDlgVolumeList" Overridable="yes">{120}{70}{70}{70}{70}</String>
174 <String Id="OutOfRbDiskDlgText2" Overridable="yes">Εναλλακτικά, μπορείτε να επιλέξετε να απενεργοποιήσετε τη λειτουργία επαναφοράς του προγράμματος εγκατάστασης. Η απενεργοποίηση της επαναφοράς δεν επιτρέπει στο πρόγραμμα εγκατάστασης να επαναφέρει το σύστημά σας στην αρχική του κατάσταση, εάν η εγκατάσταση διακοπεί για κάποιο λόγο. Κάντε κλικ στο κουμπί "Ναι", εάν θέλετε να διακινδυνεύσετε την απενεργοποίηση της επαναφοράς.</String>
175
176 <String Id="PrepareDlg_Title" Overridable="yes">Πρόγραμμα εγκατάστασης του [ProductName]</String>
177 <String Id="PrepareDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
178 <String Id="PrepareDlgDescription" Overridable="yes">Περιμένετε όσο ο Οδηγός εγκατάστασης προετοιμάζεται για να σας καθοδηγήσει στην εγκατάσταση.</String>
179 <String Id="PrepareDlgTitle" Overridable="yes">{\WixUI_Font_Bigger}Καλώς ορίσατε στον Οδηγό εγκατάστασης του [ProductName]</String>
180
181 <String Id="ProgressDlg_Title" Overridable="yes">Πρόγραμμα εγκατάστασης του [ProductName]</String>
182 <String Id="ProgressDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
183 <String Id="ProgressDlgTextInstalling" Overridable="yes">Περιμένετε όσο ο Οδηγός εγκατάστασης εγκαθιστά το [ProductName].</String>
184 <String Id="ProgressDlgTitleInstalling" Overridable="yes">{\WixUI_Font_Title}Εγκατάσταση του [ProductName]</String>
185 <String Id="ProgressDlgTextChanging" Overridable="yes">Περιμένετε όσο ο Οδηγός εγκατάστασης αλλάζει το [ProductName].</String>
186 <String Id="ProgressDlgTitleChanging" Overridable="yes">{\WixUI_Font_Title}Αλλαγή του [ProductName]</String>
187 <String Id="ProgressDlgTextRepairing" Overridable="yes">Περιμένετε όσο ο Οδηγός εγκατάστασης επιδιορθώνει το [ProductName].</String>
188 <String Id="ProgressDlgTitleRepairing" Overridable="yes">{\WixUI_Font_Title}Επιδιόρθωση του [ProductName]</String>
189 <String Id="ProgressDlgTextRemoving" Overridable="yes">Περιμένετε όσο ο Οδηγός εγκατάστασης καταργεί το [ProductName].</String>
190 <String Id="ProgressDlgTitleRemoving" Overridable="yes">{\WixUI_Font_Title}Κατάργηση του [ProductName]</String>
191 <String Id="ProgressDlgTextUpdating" Overridable="yes">Περιμένετε όσο ο Οδηγός εγκατάστασης ενημερώνει το [ProductName].</String>
192 <String Id="ProgressDlgTitleUpdating" Overridable="yes">{\WixUI_Font_Title}Ενημέρωση του [ProductName]</String>
193 <String Id="ProgressDlgProgressBar" Overridable="yes">Ποσοστό ολοκλήρωσης</String>
194 <String Id="ProgressDlgStatusLabel" Overridable="yes">Κατάσταση:</String>
195
196 <String Id="ResumeDlg_Title" Overridable="yes">Πρόγραμμα εγκατάστασης του [ProductName]</String>
197 <String Id="ResumeDlgInstall" Overridable="yes">&amp;Εγκατάσταση</String>
198 <String Id="ResumeDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
199 <String Id="ResumeDlgDescription" Overridable="yes">Ο Οδηγός εγκατάστασης θα ολοκληρώσει την εγκατάσταση του [ProductName] στον υπολογιστή σας. Κάντε κλικ στο κουμπί "Εγκατάσταση", για να συνεχίσετε ή στο κουμπί " Άκυρο", για να εξέλθετε από τον Οδηγό εγκατάστασης.</String>
200 <String Id="ResumeDlgTitle" Overridable="yes">{\WixUI_Font_Bigger}Συνέχιση του Οδηγού εγκατάστασης του [ProductName]</String>
201
202 <String Id="SetupTypeDlg_Title" Overridable="yes">Πρόγραμμα εγκατάστασης του [ProductName]</String>
203 <String Id="SetupTypeDlgTypicalButton" Overridable="yes">&amp;Τυπική</String>
204 <String Id="SetupTypeDlgTypicalButtonTooltip" Overridable="yes">Τυπική εγκατάσταση</String>
205 <String Id="SetupTypeDlgCustomButton" Overridable="yes">Π&amp;ροσαρμοσμένη</String>
206 <String Id="SetupTypeDlgCustomButtonTooltip" Overridable="yes">Προσαρμοσμένη εγκατάσταση</String>
207 <String Id="SetupTypeDlgCompleteButton" Overridable="yes">Π&amp;λήρης</String>
208 <String Id="SetupTypeDlgCompleteButtonTooltip" Overridable="yes">Πλήρης εγκατάσταση</String>
209 <String Id="SetupTypeDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
210 <String Id="SetupTypeDlgTitle" Overridable="yes">{\WixUI_Font_Title}Επιλογή τύπου εγκατάστασης</String>
211 <String Id="SetupTypeDlgDescription" Overridable="yes">Επιλέξτε τον τύπο εγκατάστασης που ταιριάζει καλύτερα στις ανάγκες σας</String>
212 <String Id="SetupTypeDlgTypicalText" Overridable="yes">Εγκαθιστά τις συνηθέστερες δυνατότητες του προγράμματος. Συνιστάται για τους περισσότερους χρήστες.</String>
213 <String Id="SetupTypeDlgCustomText" Overridable="yes">Επιτρέπει στους χρήστες να επιλέξουν τις δυνατότητες του προγράμματος που θα εγκατασταθούν και τη θέση στην οποία θα εγκατασταθούν. Συνιστάται για προχωρημένους χρήστες.</String>
214 <String Id="SetupTypeDlgCompleteText" Overridable="yes">Θα εγκατασταθούν όλες οι δυνατότητες του προγράμματος. Απαιτεί τον περισσότερο χώρο στο δίσκο.</String>
215
216 <String Id="UserExit_Title" Overridable="yes">Πρόγραμμα εγκατάστασης του [ProductName]</String>
217 <String Id="UserExitBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
218 <String Id="UserExitTitle" Overridable="yes">{\WixUI_Font_Bigger}Ο Οδηγός εγκατάστασης του [ProductName] διακόπηκε</String>
219 <String Id="UserExitDescription1" Overridable="yes">Η εγκατάσταση του [ProductName] διακόπηκε. Το σύστημά σας δεν τροποποιήθηκε. Για να εγκαταστήσετε αυτό το πρόγραμμα αργότερα, εκτελέστε ξανά το πρόγραμμα εγκατάστασης.</String>
220 <String Id="UserExitDescription2" Overridable="yes">Κάντε κλικ στο κουμπί "Τέλος", για να εξέλθετε από τον Οδηγό εγκατάστασης.</String>
221
222 <String Id="VerifyReadyDlg_Title" Overridable="yes">Πρόγραμμα εγκατάστασης του [ProductName]</String>
223 <String Id="VerifyReadyDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
224 <String Id="VerifyReadyDlgInstall" Overridable="yes">&amp;Εγκατάσταση</String>
225 <String Id="VerifyReadyDlgInstallText" Overridable="yes">Κάντε κλικ στο κουμπί "Εγκατάσταση", για να ξεκινήσει η εγκατάσταση. Κάντε κλικ στο κουμπί "Πίσω", για να ελέγξετε ή να αλλάξετε τις ρυθμίσεις της εγκατάστασης. Κάντε κλικ στο κουμπί "Άκυρο", για να πραγματοποιήσετε έξοδο από τον οδηγό.</String>
226 <String Id="VerifyReadyDlgInstallTitle" Overridable="yes">{\WixUI_Font_Title}Έτοιμο για εγκατάσταση του [ProductName]</String>
227 <String Id="VerifyReadyDlgChange" Overridable="yes">&amp;Αλλαγή</String>
228 <String Id="VerifyReadyDlgChangeText" Overridable="yes">Κάντε κλικ στο κουμπί "Αλλαγή", για να ξεκινήσει η εγκατάσταση. Κάντε κλικ στο κουμπί "Πίσω", για να ελέγξετε ή να αλλάξετε τις ρυθμίσεις της εγκατάστασης. Κάντε κλικ στο κουμπί "Άκυρο", για να πραγματοποιήσετε έξοδο από τον οδηγό.</String>
229 <String Id="VerifyReadyDlgChangeTitle" Overridable="yes">{\WixUI_Font_Title}Έτοιμο για αλλαγή του [ProductName]</String>
230 <String Id="VerifyReadyDlgRepair" Overridable="yes">Επι&amp;διόρθωση</String>
231 <String Id="VerifyReadyDlgRepairText" Overridable="yes">Κάντε κλικ στο κουμπί "Επιδιόρθωση" για να επιδιορθώσετε την εγκατάσταση του [ProductName]. Κάντε κλικ στο κουμπί "Πίσω", για να ελέγξετε ή να αλλάξετε τις ρυθμίσεις της εγκατάστασης. Κάντε κλικ στο κουμπί "Άκυρο", για να πραγματοποιήσετε έξοδο από τον οδηγό.</String>
232 <String Id="VerifyReadyDlgRepairTitle" Overridable="yes">{\WixUI_Font_Title}Έτοιμο για επιδιόρθωση του [ProductName]</String>
233 <String Id="VerifyReadyDlgRemove" Overridable="yes">&amp;Κατάργηση</String>
234 <String Id="VerifyReadyDlgRemoveText" Overridable="yes">Κάντε κλικ στο κουμπί "Κατάργηση", για να καταργήσετε το [ProductName] από τον υπολογιστή σας. Κάντε κλικ στο κουμπί "Πίσω", για να ελέγξετε ή να αλλάξετε τις ρυθμίσεις της εγκατάστασης. Κάντε κλικ στο κουμπί "Άκυρο", για να πραγματοποιήσετε έξοδο από τον οδηγό.</String>
235 <String Id="VerifyReadyDlgRemoveTitle" Overridable="yes">{\WixUI_Font_Title}Έτοιμο για κατάργηση του [ProductName]</String>
236 <String Id="VerifyReadyDlgUpdate" Overridable="yes">&amp;Ενημέρωση</String>
237 <String Id="VerifyReadyDlgUpdateText" Overridable="yes">Επιλέξτε "Ενημέρωση", για να ενημερώσετε το [ProductName] από τον υπολογιστή σας. Κάντε κλικ στο κουμπί "Πίσω", για να ελέγξετε ή να αλλάξετε τις ρυθμίσεις της εγκατάστασης. Κάντε κλικ στο κουμπί "Άκυρο", για να πραγματοποιήσετε έξοδο από τον οδηγό.</String>
238 <String Id="VerifyReadyDlgUpdateTitle" Overridable="yes">{\WixUI_Font_Title}Έτοιμο για ενημέρωση του [ProductName]</String>
239
240 <String Id="WaitForCostingDlg_Title" Overridable="yes">Πρόγραμμα εγκατάστασης του [ProductName]</String>
241 <String Id="WaitForCostingDlgReturn" Overridable="yes">&amp;Επιστροφή</String>
242 <String Id="WaitForCostingDlgText" Overridable="yes">Περιμένετε όσο το πρόγραμμα εγκατάστασης ολοκληρώνει τον προσδιορισμό των απαιτήσεων χώρου στο δίσκο.</String>
243 <String Id="WaitForCostingDlgIcon" Overridable="yes">WixUI_Ico_Exclam</String>
244 <String Id="WaitForCostingDlgIconTooltip" Overridable="yes">Εικονίδιο θαυμαστικού</String>
245
246 <String Id="WelcomeDlg_Title" Overridable="yes">Πρόγραμμα εγκατάστασης του [ProductName]</String>
247 <String Id="WelcomeDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
248 <String Id="WelcomeDlgDescription" Overridable="yes">Ο Οδηγός εγκατάστασης θα εγκαταστήσει το [ProductName] στον υπολογιστή σας. Κάντε κλικ στο κουμπί "Επόμενο", για να συνεχίσετε ή στο κουμπί "Άκυρο", για να εξέλθετε από τον Οδηγό εγκατάστασης.</String>
249 <String Id="WelcomeUpdateDlgDescriptionUpdate" Overridable="yes">Ο Οδηγός εγκατάστασης θα ενημερώσει το [ProductName] στον υπολογιστή σας. Κάντε κλικ στο κουμπί "Επόμενο", για να συνεχίσετε ή στο κουμπί "Άκυρο", για να εξέλθετε από τον Οδηγό εγκατάστασης.</String>
250 <String Id="WelcomeDlgTitle" Overridable="yes">{\WixUI_Font_Bigger}Καλώς ορίσατε στον Οδηγό εγκατάστασης του [ProductName]</String>
251
252 <String Id="WelcomeEulaDlg_Title" Overridable="yes">Πρόγραμμα εγκατάστασης του [ProductName]</String>
253 <String Id="WelcomeEulaDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
254 <String Id="WelcomeEulaDlgLicenseAcceptedCheckBox" Overridable="yes">&amp;Αποδέχομαι τους όρους της άδειας χρήσης</String>
255 <String Id="WelcomeEulaDlgInstall" Overridable="yes">&amp;Εγκατάσταση</String>
256 <String Id="WelcomeEulaDlgUpdate" Overridable="yes">&amp;Ενημέρωση</String>
257 <String Id="WelcomeEulaDlgTitle" Overridable="yes">{\WixUI_Font_Title}Διαβάστε την άδεια χρήσης του [ProductName]</String>
258
259 <String Id="ProgressTextInstallValidate" Overridable="yes">Επικύρωση εγκατάστασης</String>
260 <String Id="ProgressTextInstallFiles" Overridable="yes">Αντιγραφή νέων αρχείων</String>
261 <String Id="ProgressTextInstallFilesTemplate" Overridable="yes">Αρχείο: [1], Κατάλογος: [9], Μέγεθος: [6]</String>
262 <String Id="ProgressTextInstallAdminPackage" Overridable="yes">Αντιγραφή αρχείων εγκατάστασης δικτύου</String>
263 <String Id="ProgressTextInstallAdminPackageTemplate" Overridable="yes">Αρχείο: [1], Κατάλογος: [9], Μέγεθος: [6]</String>
264 <String Id="ProgressTextFileCost" Overridable="yes">Υπολογισμός απαιτούμενου χώρου</String>
265 <String Id="ProgressTextCostInitialize" Overridable="yes">Υπολογισμός απαιτούμενου χώρου</String>
266 <String Id="ProgressTextCostFinalize" Overridable="yes">Υπολογισμός απαιτούμενου χώρου</String>
267 <String Id="ProgressTextCreateShortcuts" Overridable="yes">Δημιουργία συντομεύσεων</String>
268 <String Id="ProgressTextCreateShortcutsTemplate" Overridable="yes">Συντόμευση: [1]</String>
269 <String Id="ProgressTextPublishComponents" Overridable="yes">Δημοσίευση προσδιορισμένων στοιχείων</String>
270 <String Id="ProgressTextPublishComponentsTemplate" Overridable="yes">Αναγνωριστικό στοιχείου: [1], Προσδιοριστικό: [2]</String>
271 <String Id="ProgressTextPublishFeatures" Overridable="yes">Δημοσίευση δυνατοτήτων προϊόντος</String>
272 <String Id="ProgressTextPublishFeaturesTemplate" Overridable="yes">Δυνατότητα: [1]</String>
273 <String Id="ProgressTextPublishProduct" Overridable="yes">Δημοσίευση πληροφοριών προϊόντος</String>
274 <String Id="ProgressTextRegisterClassInfo" Overridable="yes">Καταχώρηση διακομιστών κλάσης</String>
275 <String Id="ProgressTextRegisterClassInfoTemplate" Overridable="yes">Αναγνωριστικό κλάσης: [1]</String>
276 <String Id="ProgressTextRegisterExtensionInfo" Overridable="yes">Καταχώρηση διακομιστών επέκτασης</String>
277 <String Id="ProgressTextRegisterExtensionInfoTemplate" Overridable="yes">Επέκταση: [1]</String>
278 <String Id="ProgressTextRegisterMIMEInfo" Overridable="yes">Καταχώρηση πληροφοριών MIME</String>
279 <String Id="ProgressTextRegisterMIMEInfoTemplate" Overridable="yes">Τύπος περιεχομένου MIME: [1], Επέκταση: [2]</String>
280 <String Id="ProgressTextRegisterProgIdInfo" Overridable="yes">Καταχώρηση αναγνωριστικών προγράμματος</String>
281 <String Id="ProgressTextRegisterProgIdInfoTemplate" Overridable="yes">Αναγνωριστικό προγράμματος: [1]</String>
282 <String Id="ProgressTextAllocateRegistrySpace" Overridable="yes">Εκχώρηση χώρου στο μητρώο</String>
283 <String Id="ProgressTextAllocateRegistrySpaceTemplate" Overridable="yes">Ελεύθερος χώρος: [1]</String>
284 <String Id="ProgressTextAppSearch" Overridable="yes">Αναζήτηση εγκατεστημένων εφαρμογών</String>
285 <String Id="ProgressTextAppSearchTemplate" Overridable="yes">Ιδιότητα: [1], Υπογραφή: [2]</String>
286 <String Id="ProgressTextBindImage" Overridable="yes">Σύνδεση εκτελέσιμων αρχείων</String>
287 <String Id="ProgressTextBindImageTemplate" Overridable="yes">Αρχείο: [1]</String>
288 <String Id="ProgressTextCCPSearch" Overridable="yes">Αναζήτηση για κατάλληλα προϊόντα</String>
289 <String Id="ProgressTextCreateFolders" Overridable="yes">Δημιουργία φακέλων</String>
290 <String Id="ProgressTextCreateFoldersTemplate" Overridable="yes">Φάκελος: [1]</String>
291 <String Id="ProgressTextDeleteServices" Overridable="yes">Διαγραφή υπηρεσιών</String>
292 <String Id="ProgressTextDeleteServicesTemplate" Overridable="yes">Υπηρεσία: [1]</String>
293 <String Id="ProgressTextDuplicateFiles" Overridable="yes">Δημιουργία διπλότυπων αρχείων</String>
294 <String Id="ProgressTextDuplicateFilesTemplate" Overridable="yes">Αρχείο: [1], Κατάλογος: [9], Μέγεθος: [6]</String>
295 <String Id="ProgressTextFindRelatedProducts" Overridable="yes">Αναζήτηση σχετικών εφαρμογών</String>
296 <String Id="ProgressTextFindRelatedProductsTemplate" Overridable="yes">Βρέθηκε η εφαρμογή: [1]</String>
297 <String Id="ProgressTextInstallODBC" Overridable="yes">Εγκατάσταση στοιχείων ODBC</String>
298 <String Id="ProgressTextInstallServices" Overridable="yes">Εγκατάσταση νέων υπηρεσιών</String>
299 <String Id="ProgressTextInstallServicesTemplate" Overridable="yes">Υπηρεσία: [2]</String>
300 <String Id="ProgressTextLaunchConditions" Overridable="yes">Αξιολόγηση συνθηκών εκκίνησης</String>
301 <String Id="ProgressTextMigrateFeatureStates" Overridable="yes">Μετεγκατάσταση καταστάσεων δυνατοτήτων από σχετικές εφαρμογές</String>
302 <String Id="ProgressTextMigrateFeatureStatesTemplate" Overridable="yes">Εφαρμογή: [1]</String>
303 <String Id="ProgressTextMoveFiles" Overridable="yes">Μετακίνηση αρχείων</String>
304 <String Id="ProgressTextMoveFilesTemplate" Overridable="yes">Αρχείο: [1], Κατάλογος: [9], Μέγεθος: [6]</String>
305 <String Id="ProgressTextPatchFiles" Overridable="yes">Ενημέρωση κώδικα αρχείων</String>
306 <String Id="ProgressTextPatchFilesTemplate" Overridable="yes">Αρχείο: [1], Κατάλογος: [2], Μέγεθος: [3]</String>
307 <String Id="ProgressTextProcessComponents" Overridable="yes">Ενημέρωση καταχώρησης στοιχείου</String>
308 <String Id="ProgressTextRegisterComPlus" Overridable="yes">Καταχώρηση εφαρμογών και στοιχείων COM+</String>
309 <String Id="ProgressTextRegisterComPlusTemplate" Overridable="yes">Αναγνωριστικό εφαρμογής: [1]{{, Τύπος εφαρμογής: [2], Χρήστες: [3], RSN: [4]}}</String>
310 <String Id="ProgressTextRegisterFonts" Overridable="yes">Καταχώρηση γραμματοσειρών</String>
311 <String Id="ProgressTextRegisterFontsTemplate" Overridable="yes">Γραμματοσειρά: [1]</String>
312 <String Id="ProgressTextRegisterProduct" Overridable="yes">Δήλωση προϊόντος</String>
313 <String Id="ProgressTextRegisterProductTemplate" Overridable="yes">[1]</String>
314 <String Id="ProgressTextRegisterTypeLibraries" Overridable="yes">Καταχώρηση βιβλιοθηκών τύπων</String>
315 <String Id="ProgressTextRegisterTypeLibrariesTemplate" Overridable="yes">Αναγνωριστικό βιβλιοθήκης: [1]</String>
316 <String Id="ProgressTextRegisterUser" Overridable="yes">Καταχώρηση χρήστη</String>
317 <String Id="ProgressTextRegisterUserTemplate" Overridable="yes">[1]</String>
318 <String Id="ProgressTextRemoveDuplicateFiles" Overridable="yes">Κατάργηση διπλότυπων αρχείων</String>
319 <String Id="ProgressTextRemoveDuplicateFilesTemplate" Overridable="yes">Αρχείο: [1], Κατάλογος: [9]</String>
320 <String Id="ProgressTextRemoveEnvironmentStrings" Overridable="yes">Ενημέρωση συμβολοσειρών περιβάλλοντος</String>
321 <String Id="ProgressTextRemoveEnvironmentStringsTemplate" Overridable="yes">Όνομα: [1], Τιμή: [2], Ενέργεια [3]</String>
322 <String Id="ProgressTextRemoveExistingProducts" Overridable="yes">Κατάργηση εφαρμογών</String>
323 <String Id="ProgressTextRemoveExistingProductsTemplate" Overridable="yes">Εφαρμογή: [1], Γραμμή εντολών: [2]</String>
324 <String Id="ProgressTextRemoveFiles" Overridable="yes">Κατάργηση αρχείων</String>
325 <String Id="ProgressTextRemoveFilesTemplate" Overridable="yes">Αρχείο: [1], Κατάλογος: [9]</String>
326 <String Id="ProgressTextRemoveFolders" Overridable="yes">Κατάργηση φακέλων</String>
327 <String Id="ProgressTextRemoveFoldersTemplate" Overridable="yes">Φάκελος: [1]</String>
328 <String Id="ProgressTextRemoveIniValues" Overridable="yes">Κατάργηση καταχωρήσεων αρχείων INI</String>
329 <String Id="ProgressTextRemoveIniValuesTemplate" Overridable="yes">Αρχείο: [1], Ενότητα: [2], Κλειδί: [3], Τιμή: [4]</String>
330 <String Id="ProgressTextRemoveODBC" Overridable="yes">Κατάργηση στοιχείων ODBC</String>
331 <String Id="ProgressTextRemoveRegistryValues" Overridable="yes">Κατάργηση τιμών μητρώου συστήματος</String>
332 <String Id="ProgressTextRemoveRegistryValuesTemplate" Overridable="yes">Κλειδί: [1], Όνομα: [2]</String>
333 <String Id="ProgressTextRemoveShortcuts" Overridable="yes">Κατάργηση συντομεύσεων</String>
334 <String Id="ProgressTextRemoveShortcutsTemplate" Overridable="yes">Συντόμευση: [1]</String>
335 <String Id="ProgressTextRMCCPSearch" Overridable="yes">Αναζήτηση για κατάλληλα προϊόντα</String>
336 <String Id="ProgressTextSelfRegModules" Overridable="yes">Καταχώρηση λειτουργικών μονάδων</String>
337 <String Id="ProgressTextSelfRegModulesTemplate" Overridable="yes">Αρχείο: [1], Φάκελος: [2]</String>
338 <String Id="ProgressTextSelfUnregModules" Overridable="yes">Κατάργηση καταχώρησης λειτουργικών μονάδων</String>
339 <String Id="ProgressTextSelfUnregModulesTemplate" Overridable="yes">Αρχείο: [1], Φάκελος: [2]</String>
340 <String Id="ProgressTextSetODBCFolders" Overridable="yes">Προετοιμασία καταλόγων ODBC</String>
341 <String Id="ProgressTextStartServices" Overridable="yes">Εκκίνηση υπηρεσιών</String>
342 <String Id="ProgressTextStartServicesTemplate" Overridable="yes">Υπηρεσία: [1]</String>
343 <String Id="ProgressTextStopServices" Overridable="yes">Διακοπή υπηρεσιών</String>
344 <String Id="ProgressTextStopServicesTemplate" Overridable="yes">Υπηρεσία: [1]</String>
345 <String Id="ProgressTextUnpublishComponents" Overridable="yes">Κατάργηση δημοσίευσης προσδιορισμένων στοιχείων</String>
346 <String Id="ProgressTextUnpublishComponentsTemplate" Overridable="yes">Αναγνωριστικό στοιχείου: [1], Προσδιοριστικό: [2]</String>
347 <String Id="ProgressTextUnpublishFeatures" Overridable="yes">Κατάργηση δημοσίευσης δυνατοτήτων προϊόντος</String>
348 <String Id="ProgressTextUnpublishFeaturesTemplate" Overridable="yes">Δυνατότητα: [1]</String>
349 <String Id="ProgressTextUnregisterClassInfo" Overridable="yes">Κατάργηση καταχώρησης διακομιστών κλάσης</String>
350 <String Id="ProgressTextUnregisterClassInfoTemplate" Overridable="yes">Αναγνωριστικό κλάσης: [1]</String>
351 <String Id="ProgressTextUnregisterComPlus" Overridable="yes">Κατάργηση καταχώρησης εφαρμογών και στοιχείων COM+</String>
352 <String Id="ProgressTextUnregisterComPlusTemplate" Overridable="yes">Αναγνωριστικό εφαρμογής: [1]{{, Τύπος εφαρμογής: [2]}}</String>
353 <String Id="ProgressTextUnregisterExtensionInfo" Overridable="yes">Κατάργηση καταχώρησης διακομιστών επέκτασης</String>
354 <String Id="ProgressTextUnregisterExtensionInfoTemplate" Overridable="yes">Επέκταση: [1]</String>
355 <String Id="ProgressTextUnregisterFonts" Overridable="yes">Κατάργηση καταχώρησης γραμματοσειρών</String>
356 <String Id="ProgressTextUnregisterFontsTemplate" Overridable="yes">Γραμματοσειρά: [1]</String>
357 <String Id="ProgressTextUnregisterMIMEInfo" Overridable="yes">Κατάργηση καταχώρησης πληροφοριών MIME</String>
358 <String Id="ProgressTextUnregisterMIMEInfoTemplate" Overridable="yes">Τύπος περιεχομένου MIME: [1], Επέκταση: [2]</String>
359 <String Id="ProgressTextUnregisterProgIdInfo" Overridable="yes">Κατάργηση καταχώρησης αναγνωριστικών προγράμματος</String>
360 <String Id="ProgressTextUnregisterProgIdInfoTemplate" Overridable="yes">Αναγνωριστικό προγράμματος: [1]</String>
361 <String Id="ProgressTextUnregisterTypeLibraries" Overridable="yes">Κατάργηση καταχώρησης βιβλιοθηκών τύπων</String>
362 <String Id="ProgressTextUnregisterTypeLibrariesTemplate" Overridable="yes">Αναγνωριστικό βιβλιοθήκης: [1]</String>
363 <String Id="ProgressTextWriteEnvironmentStrings" Overridable="yes">Ενημέρωση συμβολοσειρών περιβάλλοντος</String>
364 <String Id="ProgressTextWriteEnvironmentStringsTemplate" Overridable="yes">Όνομα: [1], Τιμή: [2], Ενέργεια [3]</String>
365 <String Id="ProgressTextWriteIniValues" Overridable="yes">Εγγραφή τιμών αρχείων INI</String>
366 <String Id="ProgressTextWriteIniValuesTemplate" Overridable="yes">Αρχείο: [1], Ενότητα: [2], Κλειδί: [3], Τιμή: [4]</String>
367 <String Id="ProgressTextWriteRegistryValues" Overridable="yes">Εγγραφή τιμών μητρώου συστήματος</String>
368 <String Id="ProgressTextWriteRegistryValuesTemplate" Overridable="yes">Κλειδί: [1], Όνομα: [2], Τιμή: [3]</String>
369 <String Id="ProgressTextAdvertise" Overridable="yes">Κοινοποίηση εφαρμογής</String>
370 <String Id="ProgressTextGenerateScript" Overridable="yes">Δημιουργία ενεργειών δέσμης για την ενέργεια:</String>
371 <String Id="ProgressTextGenerateScriptTemplate" Overridable="yes">[1]</String>
372 <String Id="ProgressTextInstallSFPCatalogFile" Overridable="yes">Εγκατάσταση καταλόγου συστήματος</String>
373 <String Id="ProgressTextInstallSFPCatalogFileTemplate" Overridable="yes">Αρχείο: [1], Εξαρτήσεις: [2]</String>
374 <String Id="ProgressTextMsiPublishAssemblies" Overridable="yes">Δημοσίευση πληροφοριών συγκρότησης</String>
375 <String Id="ProgressTextMsiPublishAssembliesTemplate" Overridable="yes">Περιβάλλον εφαρμογής:[1], Όνομα συγκρότησης:[2]</String>
376 <String Id="ProgressTextMsiUnpublishAssemblies" Overridable="yes">Κατάργηση δημοσίευσης πληροφοριών συγκρότησης</String>
377 <String Id="ProgressTextMsiUnpublishAssembliesTemplate" Overridable="yes">Περιβάλλον εφαρμογής:[1], Όνομα συγκρότησης:[2]</String>
378 <String Id="ProgressTextRollback" Overridable="yes">Ενέργεια επαναφοράς:</String>
379 <String Id="ProgressTextRollbackTemplate" Overridable="yes">[1]</String>
380 <String Id="ProgressTextRollbackCleanup" Overridable="yes">Κατάργηση αρχείων αντιγράφων ασφαλείας</String>
381 <String Id="ProgressTextRollbackCleanupTemplate" Overridable="yes">Αρχείο: [1]</String>
382 <String Id="ProgressTextUnmoveFiles" Overridable="yes">Κατάργηση αρχείων που μετακινήθηκαν</String>
383 <String Id="ProgressTextUnmoveFilesTemplate" Overridable="yes">Αρχείο: [1], Κατάλογος: [9]</String>
384 <String Id="ProgressTextUnpublishProduct" Overridable="yes">Κατάργηση δημοσίευσης πληροφοριών προϊόντος</String>
385
386 <String Id="Error0" Overridable="yes">{{Ανεπανόρθωτο σφάλμα: }}</String>
387 <String Id="Error1" Overridable="yes">{{Σφάλμα [1]. }}</String>
388 <String Id="Error2" Overridable="yes">Προειδοποίηση [1]. </String>
389 <String Id="Error4" Overridable="yes">Πληροφορίες [1]. </String>
390 <String Id="Error5" Overridable="yes">Το πρόγραμμα εγκατάστασης αντιμετώπισε ένα μη αναμενόμενο σφάλμα κατά την εγκατάσταση αυτού του πακέτου. Αυτό μπορεί να αποτελεί ένδειξη προβλήματος σε αυτό το πακέτο. Ο κωδικός σφάλματος είναι [1]. {{Τα ορίσματα είναι: [2], [3], [4]}}</String>
391 <String Id="Error7" Overridable="yes">{{Ο δίσκος είναι πλήρης: }}</String>
392 <String Id="Error8" Overridable="yes">Ενέργεια [Time]: [1]. [2]</String>
393 <String Id="Error9" Overridable="yes">[ProductName]</String>
394 <String Id="Error10" Overridable="yes">{[2]}{, [3]}{, [4]}</String>
395 <String Id="Error11" Overridable="yes">Τύπος μηνύματος: [1], Όρισμα: [2]</String>
396 <String Id="Error12" Overridable="yes">=== Έναρξη καταγραφής: [Date] [Time] ===</String>
397 <String Id="Error13" Overridable="yes">=== Διακοπή καταγραφής: [Date] [Time] ===</String>
398 <String Id="Error14" Overridable="yes">Έναρξη ενέργειας [Time]: [1].</String>
399 <String Id="Error15" Overridable="yes">Τερματισμός ενέργειας [Time]: [1]. Τιμή επιστροφής [2].</String>
400 <String Id="Error16" Overridable="yes">Χρόνος που απομένει: {[1] λεπτά }{[2] δευτερόλεπτα}</String>
401 <String Id="Error17" Overridable="yes">Η μνήμη δεν επαρκεί. Τερματίστε τις άλλες εφαρμογές προτού προσπαθήσετε ξανά.</String>
402 <String Id="Error18" Overridable="yes">Το πρόγραμμα εγκατάστασης δεν αποκρίνεται πλέον.</String>
403 <String Id="Error19" Overridable="yes">Το πρόγραμμα εγκατάστασης τερματίστηκε πρόωρα.</String>
404 <String Id="Error20" Overridable="yes">Περιμένετε όσο τα Windows ρυθμίζουν τις παραμέτρους του [ProductName]</String>
405 <String Id="Error21" Overridable="yes">Συλλογή απαιτούμενων πληροφοριών...</String>
406 <String Id="Error22" Overridable="yes">Κατάργηση παλαιότερων εκδόσεων αυτής της εφαρμογής...</String>
407 <String Id="Error23" Overridable="yes">Προετοιμασία για κατάργηση παλαιότερων εκδόσεων της εφαρμογής...</String>
408 <String Id="Error32" Overridable="yes">Η εγκατάσταση του {[ProductName] }ολοκληρώθηκε με επιτυχία.</String>
409 <String Id="Error33" Overridable="yes">Η εγκατάσταση του {[ProductName] } απέτυχε.</String>
410 <String Id="Error1101" Overridable="yes">Παρουσιάστηκε σφάλμα κατά την ανάγνωση από το αρχείο: [2]. {{Σφάλμα συστήματος [3].}} Βεβαιωθείτε ότι το αρχείο υπάρχει και ότι έχετε πρόσβαση σε αυτό.</String>
411 <String Id="Error1301" Overridable="yes">Δεν είναι δυνατή η δημιουργία του αρχείου "[2]". Υπάρχει ήδη ένας κατάλογος με αυτό το όνομα. Ακυρώστε την εγκατάσταση και προσπαθήστε να κάνετε εγκατάσταση σε διαφορετική θέση.</String>
412 <String Id="Error1302" Overridable="yes">Τοποθετήστε το δίσκο: [2]</String>
413 <String Id="Error1303" Overridable="yes">Το πρόγραμμα εγκατάστασης δεν διαθέτει επαρκή δικαιώματα πρόσβασης σε αυτόν τον κατάλογο: [2]. Δεν είναι δυνατό να συνεχιστεί η εγκατάσταση. Συνδεθείτε ως διαχειριστής ή επικοινωνήστε με το διαχειριστή του συστήματός σας.</String>
414 <String Id="Error1304" Overridable="yes">Παρουσιάστηκε σφάλμα κατά την εγγραφή στο αρχείο: [2]. Βεβαιωθείτε ότι έχετε πρόσβαση σε αυτόν τον κατάλογο.</String>
415 <String Id="Error1305" Overridable="yes">Παρουσιάστηκε σφάλμα κατά την ανάγνωση από το αρχείο [2]. {{ Σφάλμα συστήματος [3].}} Βεβαιωθείτε ότι το αρχείο υπάρχει και ότι έχετε πρόσβαση σε αυτό.</String>
416 <String Id="Error1306" Overridable="yes">Μια άλλη εφαρμογή έχει αποκλειστικά δικαιώματα πρόσβασης στο αρχείο '[2]'. Τερματίστε όλες τις άλλες εφαρμογές και κάντε κλικ στο κουμπί "Επανάληψη".</String>
417 <String Id="Error1307" Overridable="yes">Δεν υπάρχει αρκετός χώρος στο δίσκο για την εγκατάσταση αυτού του αρχείου: [2]. Αποδεσμεύστε χώρο από το δίσκο και μετά κάντε κλικ στο κουμπί "Επανάληψη" ή στο κουμπί "Άκυρο" για έξοδο.</String>
418 <String Id="Error1308" Overridable="yes">Το αρχείο προέλευσης δεν βρέθηκε: [2]. Βεβαιωθείτε ότι το αρχείο υπάρχει και ότι έχετε πρόσβαση σε αυτό.</String>
419 <String Id="Error1309" Overridable="yes">Παρουσιάστηκε σφάλμα κατά την ανάγνωση από το αρχείο: [3]. {{ Σφάλμα συστήματος [2].}} Βεβαιωθείτε ότι το αρχείο υπάρχει και ότι έχετε πρόσβαση σε αυτό.</String>
420 <String Id="Error1310" Overridable="yes">Παρουσιάστηκε σφάλμα κατά την εγγραφή στο αρχείο: [3]. {{ Σφάλμα συστήματος [2].}} Βεβαιωθείτε ότι έχετε πρόσβαση σε αυτόν τον κατάλογο.</String>
421 <String Id="Error1311" Overridable="yes">Δεν βρέθηκε το αρχείο προέλευσης{{(αρχειοθήκη)}}: [2]. Βεβαιωθείτε ότι το αρχείο υπάρχει και ότι έχετε πρόσβαση σε αυτό.</String>
422 <String Id="Error1312" Overridable="yes">Δεν είναι δυνατή η δημιουργία του καταλόγου "[2]". Υπάρχει ήδη ένα αρχείο με αυτό το όνομα. Μετονομάστε ή καταργήστε το αρχείο και κάντε κλικ στο κουμπί "Επανάληψη" ή κάντε κλικ στο κουμπί "Άκυρο" για έξοδο.</String>
423 <String Id="Error1313" Overridable="yes">Ο τόμος [2] δεν είναι διαθέσιμος αυτήν τη στιγμή. Επιλέξτε έναν άλλον τόμο.</String>
424 <String Id="Error1314" Overridable="yes">Η καθορισμένη διαδρομή "[2]" δεν είναι διαθέσιμη.</String>
425 <String Id="Error1315" Overridable="yes">Δεν είναι δυνατή η εγγραφή στον καθορισμένο φάκελο: [2].</String>
426 <String Id="Error1316" Overridable="yes">Παρουσιάστηκε σφάλμα δικτύου κατά την προσπάθεια ανάγνωσης από το αρχείο: [2]</String>
427 <String Id="Error1317" Overridable="yes">Παρουσιάστηκε σφάλμα κατά την προσπάθεια δημιουργίας του καταλόγου: [2]</String>
428 <String Id="Error1318" Overridable="yes">Παρουσιάστηκε σφάλμα δικτύου κατά την προσπάθεια δημιουργίας του καταλόγου: [2]</String>
429 <String Id="Error1319" Overridable="yes">Παρουσιάστηκε σφάλμα δικτύου κατά την προσπάθεια ανοίγματος της αρχειοθήκης του αρχείου προέλευσης: [2]</String>
430 <String Id="Error1320" Overridable="yes">Η καθορισμένη διαδρομή είναι υπερβολικά μεγάλη: [2]</String>
431 <String Id="Error1321" Overridable="yes">Το πρόγραμμα εγκατάστασης δεν έχει επαρκή δικαιώματα για την τροποποίηση αυτού του αρχείου: [2].</String>
432 <String Id="Error1322" Overridable="yes">Ένα μέρος της διαδρομής φακέλου "[2]" δεν είναι έγκυρο. Είτε είναι κενό είτε υπερβαίνει το μέγιστο επιτρεπόμενο μήκος του συστήματος.</String>
433 <String Id="Error1323" Overridable="yes">Η διαδρομή φακέλου "[2]" περιέχει λέξεις που δεν είναι έγκυρες σε διαδρομές φακέλων.</String>
434 <String Id="Error1324" Overridable="yes">Η διαδρομή φακέλου "[2]" περιέχει ένα μη έγκυρο χαρακτήρα.</String>
435 <String Id="Error1325" Overridable="yes">Το "[2]" δεν είναι έγκυρο σύντομο όνομα αρχείου.</String>
436 <String Id="Error1326" Overridable="yes">Παρουσιάστηκε σφάλμα κατά τη λήψη της ασφάλειας του αρχείου: [3] GetLastError: [2]</String>
437 <String Id="Error1327" Overridable="yes">Η μονάδα δίσκου δεν είναι έγκυρη: [2]</String>
438 <String Id="Error1328" Overridable="yes">Παρουσιάστηκε σφάλμα κατά την εφαρμογή της ενημέρωσης κώδικα στο αρχείο [2]. Πιθανόν να έχει ενημερωθεί με άλλα μέσα και να μην είναι δυνατή η τροποποίησή του από αυτή την ενημέρωση κώδικα. Για περισσότερες πληροφορίες, επικοινωνήστε με τον προμηθευτή της ενημέρωσης κώδικα. {{Σφάλμα συστήματος: [3]}}</String>
439 <String Id="Error1329" Overridable="yes">Δεν είναι δυνατή η εγκατάσταση ενός απαιτούμενου αρχείου, επειδή η αρχειοθήκη [2] δεν είναι υπογεγραμμένη ψηφιακά. Αυτό μπορεί να σημαίνει ότι η αρχειοθήκη είναι κατεστραμμένη.</String>
440 <String Id="Error1330" Overridable="yes">Δεν είναι δυνατή η εγκατάσταση ενός απαιτούμενου αρχείου, επειδή η αρχειοθήκη [2] έχει μη έγκυρη ψηφιακή υπογραφή. Αυτό μπορεί να σημαίνει ότι η αρχειοθήκη είναι κατεστραμμένη.{{ Επιστράφηκε σφάλμα [3] από τη λειτουργία WinVerifyTrust.}}</String>
441 <String Id="Error1331" Overridable="yes">Αποτυχία σωστής αντιγραφής αρχείου [2]: Σφάλμα CRC.</String>
442 <String Id="Error1332" Overridable="yes">Αποτυχία σωστής μετακίνησης αρχείου [2]: Σφάλμα CRC.</String>
443 <String Id="Error1333" Overridable="yes">Αποτυχία σωστής ενημέρωσης αρχείου [2]: Σφάλμα CRC.</String>
444 <String Id="Error1334" Overridable="yes">Δεν είναι δυνατή η εγκατάσταση του αρχείου "[2]", επειδή δεν είναι δυνατή η εύρεση του αρχείου στην αρχειοθήκη "[3]". Αυτό μπορεί να σημαίνει σφάλμα δικτύου, σφάλμα ανάγνωσης από το CD-ROM ή πρόβλημα του πακέτου.</String>
445 <String Id="Error1335" Overridable="yes">Η αρχειοθήκη "[2]" που απαιτείται για αυτή την εγκατάσταση έχει καταστραφεί και δεν μπορεί να χρησιμοποιηθεί. Αυτό μπορεί να σημαίνει σφάλμα δικτύου, σφάλμα ανάγνωσης από το CD-ROM ή πρόβλημα του πακέτου.</String>
446 <String Id="Error1336" Overridable="yes">Παρουσιάστηκε σφάλμα κατά την απόπειρα δημιουργίας ενός προσωρινού αρχείου απαραίτητου για την ολοκλήρωση αυτής της εγκατάστασης.{{ Φάκελος: [3]. Κωδικός σφάλματος συστήματος: [2]}}</String>
447 <String Id="Error1401" Overridable="yes">Δεν ήταν δυνατή η δημιουργία του κλειδιού: [2]. {{ Σφάλμα συστήματος [3].}} Βεβαιωθείτε ότι έχετε επαρκή δικαιώματα πρόσβασης σε αυτό το κλειδί ή επικοινωνήστε με το προσωπικό υποστήριξης. </String>
448 <String Id="Error1402" Overridable="yes">Δεν ήταν δυνατό το άνοιγμα του κλειδιού: [2]. {{Σφάλμα συστήματος [3].}} Βεβαιωθείτε ότι έχετε επαρκή δικαιώματα πρόσβασης σε αυτό το κλειδί ή επικοινωνήστε με το προσωπικό υποστήριξης. </String>
449 <String Id="Error1403" Overridable="yes">Δεν ήταν δυνατή η διαγραφή της τιμής [2] από το κλειδί [3]. {{ Σφάλμα συστήματος [4].}} Βεβαιωθείτε ότι έχετε επαρκή δικαιώματα πρόσβασης σε αυτό το κλειδί ή επικοινωνήστε με το προσωπικό υποστήριξης. </String>
450 <String Id="Error1404" Overridable="yes">Δεν ήταν δυνατή η διαγραφή του κλειδιού [2]. {{ Σφάλμα συστήματος [3].}} Βεβαιωθείτε ότι έχετε επαρκή δικαιώματα πρόσβασης σε αυτό το κλειδί ή επικοινωνήστε με το προσωπικό υποστήριξης. </String>
451 <String Id="Error1405" Overridable="yes">Δεν ήταν δυνατή η ανάγνωση της τιμής [2] από το κλειδί [3]. {{ Σφάλμα συστήματος [4].}} Βεβαιωθείτε ότι έχετε επαρκή δικαιώματα πρόσβασης σε αυτό το κλειδί ή επικοινωνήστε με το προσωπικό υποστήριξης. </String>
452 <String Id="Error1406" Overridable="yes">Δεν ήταν δυνατή η εγγραφή της τιμής [2] στο κλειδί [3]. {{ Σφάλμα συστήματος [4].}} Βεβαιωθείτε ότι έχετε επαρκή δικαιώματα πρόσβασης σε αυτό το κλειδί ή επικοινωνήστε με το προσωπικό υποστήριξης.</String>
453 <String Id="Error1407" Overridable="yes">Δεν ήταν δυνατή η λήψη ονομάτων τιμών για το κλειδί [2]. {{ Σφάλμα συστήματος [3].}} Βεβαιωθείτε ότι έχετε επαρκή δικαιώματα πρόσβασης σε αυτό το κλειδί ή επικοινωνήστε με το προσωπικό υποστήριξης.</String>
454 <String Id="Error1408" Overridable="yes">Δεν ήταν δυνατή η λήψη ονομάτων δευτερευόντων κλειδιών για το κλειδί [2]. {{ Σφάλμα συστήματος [3].}} Βεβαιωθείτε ότι έχετε επαρκή δικαιώματα πρόσβασης σε αυτό το κλειδί ή επικοινωνήστε με το προσωπικό υποστήριξης.</String>
455 <String Id="Error1409" Overridable="yes">Δεν ήταν δυνατή η ανάγνωση πληροφοριών ασφαλείας για το κλειδί [2]. {{ Σφάλμα συστήματος [3].}} Βεβαιωθείτε ότι έχετε επαρκή δικαιώματα πρόσβασης σε αυτό το κλειδί ή επικοινωνήστε με το προσωπικό υποστήριξης.</String>
456 <String Id="Error1410" Overridable="yes">Δεν ήταν δυνατή η αύξηση του διαθέσιμου χώρου στο μητρώο. Απαιτούνται [2] KB ελεύθερου χώρου στο μητρώο για την εγκατάσταση αυτής της εφαρμογής.</String>
457 <String Id="Error1500" Overridable="yes">Μια άλλη εγκατάσταση είναι σε εξέλιξη. Ολοκληρώστε την εγκατάσταση που βρίσκεται σε εξέλιξη προτού συνεχίσετε με αυτή την εγκατάσταση.</String>
458 <String Id="Error1501" Overridable="yes">Παρουσιάστηκε σφάλμα κατά την πρόσβαση σε ασφαλή δεδομένα. Βεβαιωθείτε ότι οι παράμετροι του Windows Installer έχουν ρυθμιστεί σωστά και προσπαθήστε να επαναλάβετε την εγκατάσταση.</String>
459 <String Id="Error1502" Overridable="yes">Ο χρήστης "[2]" έχει προετοιμάσει ήδη μια εγκατάσταση για το προϊόν "[3]". Αυτός ο χρήστης θα πρέπει να εκτελέσει τη συγκεκριμένη εγκατάσταση ξανά, για να μπορέσει να χρησιμοποιήσει το προϊόν. Η τρέχουσα εγκατάσταση θα συνεχιστεί τώρα.</String>
460 <String Id="Error1503" Overridable="yes">Ο χρήστης "[2]" έχει προετοιμάσει ήδη μια εγκατάσταση για το προϊόν "[3]". Αυτός ο χρήστης θα πρέπει να εκτελέσει τη συγκεκριμένη εγκατάσταση ξανά, για να μπορέσει να χρησιμοποιήσει το προϊόν.</String>
461 <String Id="Error1601" Overridable="yes">Δεν επαρκεί ο χώρος στο δίσκο -- Τόμος: "[2]"; απαιτούμενος χώρος: [3] KB, διαθέσιμος χώρος: [4] KB. Αποδεσμεύστε χώρο στο δίσκο και δοκιμάστε ξανά.</String>
462 <String Id="Error1602" Overridable="yes">Είστε βέβαιοι ότι θέλετε να κάνετε ακύρωση;</String>
463 <String Id="Error1603" Overridable="yes">Το αρχείο [2][3] χρησιμοποιείται { από την ακόλουθη διεργασία: Όνομα: [4], Αναγνωριστικό: [5], Τίτλος παραθύρου: "[6]"}. Κλείστε αυτή την εφαρμογή και δοκιμάστε ξανά.</String>
464 <String Id="Error1604" Overridable="yes">Το προϊόν "[2]" είναι ήδη εγκατεστημένο, γεγονός που εμποδίζει την εγκατάσταση αυτού του προϊόντος. Τα δύο προϊόντα δεν είναι συμβατά.</String>
465 <String Id="Error1605" Overridable="yes">Δεν υπάρχει αρκετός χώρος δίσκου στον τόμο "[2]" για τη συνέχιση της εγκατάστασης με ενεργοποιημένη την ανάκτηση. Απαιτούνται [3] KB, αλλά είναι διαθέσιμα μόνο [4] KB. Κάντε κλικ στο κουμπί "Παράβλεψη", για να συνεχίσετε την εγκατάσταση χωρίς την αποθήκευση πληροφοριών ανάκτησης, κάντε κλικ στο κουμπί "Επανάληψη" για νέο έλεγχο του διαθέσιμου χώρου ή στο κουμπί "Άκυρο", για να τερματίσετε την εγκατάσταση.</String>
466 <String Id="Error1606" Overridable="yes">Δεν ήταν δυνατή η πρόσβαση στη θέση δικτύου [2].</String>
467 <String Id="Error1607" Overridable="yes">Πρέπει να κλείσετε τις παρακάτω εφαρμογές, για να συνεχίσετε την εγκατάσταση:</String>
468 <String Id="Error1608" Overridable="yes">Δεν ήταν δυνατή η εύρεση συμβατών προϊόντων που έχουν ήδη εγκατασταθεί στον υπολογιστή για την εγκατάσταση αυτού του προϊόντος.</String>
469 <String Id="Error1609" Overridable="yes">Παρουσιάστηκε σφάλμα κατά την εφαρμογή των ρυθμίσεων ασφαλείας. Ο χρήστης "[2]" δεν είναι έγκυρος χρήστης ή ομάδα χρηστών. Αυτό θα μπορούσε να σημαίνει πρόβλημα με το πακέτο ή πρόβλημα με τη σύνδεση σε ελεγκτή τομέα στο δίκτυο. Ελέγξτε τη σύνδεση δικτύου σας και κάντε κλικ στο κουμπί "Επανάληψη" ή κάντε κλικ στο κουμπί "Άκυρο", για να τερματίσετε την εγκατάσταση. {{Δεν ήταν δυνατός ο εντοπισμός του SID χρήστη, σφάλμα συστήματος [3]}}</String>
470 <String Id="Error1701" Overridable="yes">Το κλειδί [2] δεν είναι έγκυρο. Βεβαιωθείτε ότι εισαγάγατε το σωστό κλειδί.</String>
471 <String Id="Error1702" Overridable="yes">Το πρόγραμμα εγκατάστασης πρέπει να επανεκκινήσει το σύστημά σας, για να συνεχιστεί η ρύθμιση των παραμέτρων του [2]. Κάντε κλικ στο κουμπί "Ναι", για να γίνει επανεκκίνηση τώρα ή στο κουμπί "Όχι", εάν θέλετε να κάνετε επανεκκίνηση αργότερα με μη αυτόματο τρόπο.</String>
472 <String Id="Error1703" Overridable="yes">Πρέπει να κάνετε επανεκκίνηση του συστήματός σας για να ενεργοποιηθούν οι αλλαγές που έγιναν στις ρυθμίσεις των παραμέτρων του [2]. Κάντε κλικ στο κουμπί "Ναι" για να γίνει επανεκκίνηση τώρα ή στο κουμπί "Όχι" εάν θέλετε να κάνετε επανεκκίνηση αργότερα με μη αυτόματο τρόπο.</String>
473 <String Id="Error1704" Overridable="yes">Αυτήν τη στιγμή έχει ανασταλεί η εγκατάσταση του [2]. Πρέπει να αναιρέσετε τις αλλαγές που έγιναν από αυτή την εγκατάσταση για να συνεχίσετε. Θέλετε να αναιρέσετε αυτές τις αλλαγές;</String>
474 <String Id="Error1705" Overridable="yes">Μια προηγούμενη εγκατάσταση για αυτό το προϊόν βρίσκεται σε εξέλιξη. Πρέπει να αναιρέσετε τις αλλαγές που έγιναν από αυτή την εγκατάσταση για να συνεχίσετε. Θέλετε να αναιρέσετε αυτές τις αλλαγές;</String>
475 <String Id="Error1706" Overridable="yes">Δεν ήταν δυνατή η εύρεση ενός πακέτου εγκατάστασης για το προϊόν [2]. Επιχειρήστε εκ νέου εγκατάσταση χρησιμοποιώντας ένα έγκυρο αντίγραφο του πακέτου εγκατάστασης '[3]'.</String>
476 <String Id="Error1707" Overridable="yes">Η εγκατάσταση ολοκληρώθηκε με επιτυχία.</String>
477 <String Id="Error1708" Overridable="yes">Η εγκατάσταση απέτυχε.</String>
478 <String Id="Error1709" Overridable="yes">Προϊόν: [2] -- [3]</String>
479 <String Id="Error1710" Overridable="yes">Μπορείτε να επαναφέρετε τον υπολογιστή σας στην προηγούμενή του κατάσταση ή να συνεχίσετε την εγκατάσταση αργότερα. Θέλετε να γίνει επαναφορά;</String>
480 <String Id="Error1711" Overridable="yes">Παρουσιάστηκε σφάλμα κατά την εγγραφή των πληροφοριών εγκατάστασης στο δίσκο. Βεβαιωθείτε ότι υπάρχει αρκετός διαθέσιμος χώρος στο δίσκο και κάντε κλικ στο κουμπί "Επανάληψη" ή στο κουμπί "Άκυρο", για να τερματίσετε την εγκατάσταση.</String>
481 <String Id="Error1712" Overridable="yes">Δεν ήταν δυνατή η εύρεση ενός ή περισσότερων αρχείων που απαιτούνται για την επαναφορά του υπολογιστή σας στην προηγούμενή του κατάσταση. Δεν θα είναι δυνατή η επαναφορά.</String>
482 <String Id="Error1713" Overridable="yes">Το πρόγραμμα [2] δεν είναι δυνατό να εγκαταστήσει ένα από τα απαιτούμενα προϊόντα του. Επικοινωνήστε με την ομάδα τεχνικής υποστήριξης. {{Σφάλμα συστήματος: [3].}}</String>
483 <String Id="Error1714" Overridable="yes">Δεν είναι δυνατή η κατάργηση της παλαιότερης έκδοσης του προγράμματος [2]. Επικοινωνήστε με την ομάδα τεχνικής υποστήριξης. {{Σφάλμα συστήματος [3].}}</String>
484 <String Id="Error1715" Overridable="yes">Έγινε εγκατάσταση του [2]</String>
485 <String Id="Error1716" Overridable="yes">Έγινε ρύθμιση παραμέτρων του [2]</String>
486 <String Id="Error1717" Overridable="yes">Έγινε κατάργηση του [2]</String>
487 <String Id="Error1718" Overridable="yes">Το αρχείο [2] απορρίφθηκε από την πολιτική ψηφιακής υπογραφής.</String>
488 <String Id="Error1719" Overridable="yes">Δεν ήταν δυνατή η πρόσβαση στην υπηρεσία του Windows Installer. Αυτό μπορεί να συμβεί, εάν εκτελείτε τα Windows σε κατάσταση ασφαλούς λειτουργίας ή εάν το Windows Installer δεν έχει εγκατασταθεί σωστά. Επικοινωνήστε με το προσωπικό υποστήριξης για βοήθεια.</String>
489 <String Id="Error1720" Overridable="yes">Υπάρχει ένα πρόβλημα με αυτό το πακέτο του Windows Installer. Μια δέσμη ενεργειών που απαιτείται για να ολοκληρωθεί αυτή η εγκατάσταση δεν μπόρεσε να εκτελεστεί. Επικοινωνήστε με το προσωπικό υποστήριξης ή τον προμηθευτή του πακέτου. {{Προσαρμοσμένη ενέργεια [2] σφάλμα δέσμης ενεργειών [3], [4]: [5] Γραμμή [6], Στήλη [7], [8] }}</String>
490 <String Id="Error1721" Overridable="yes">Υπάρχει ένα πρόβλημα με αυτό το πακέτο του Windows Installer. Ένα πρόγραμμα που απαιτείται για να ολοκληρωθεί αυτή η εγκατάσταση δεν μπόρεσε να εκτελεστεί. Επικοινωνήστε με το προσωπικό υποστήριξης ή τον προμηθευτή του πακέτου. {{Ενέργεια: [2], θέση: [3], εντολή: [4] }}</String>
491 <String Id="Error1722" Overridable="yes">Υπάρχει ένα πρόβλημα με αυτό το πακέτο του Windows Installer. Ένα πρόγραμμα που εκτελείται ως μέρος αυτού του προγράμματος εγκατάστασης δεν ολοκληρώθηκε όπως αναμενόταν. Επικοινωνήστε με το προσωπικό υποστήριξης ή τον προμηθευτή του πακέτου. {{Ενέργεια [2], θέση: [3], εντολή: [4] }}</String>
492 <String Id="Error1723" Overridable="yes">Υπάρχει ένα πρόβλημα με αυτό το πακέτο του Windows Installer. Ένα αρχείο DLL που απαιτείται για να ολοκληρωθεί αυτή η εγκατάσταση δεν μπόρεσε να εκτελεστεί. Επικοινωνήστε με το προσωπικό υποστήριξης ή τον προμηθευτή του πακέτου. {{Ενέργεια [2], καταχώρηση: [3], βιβλιοθήκη: [4] }}</String>
493 <String Id="Error1724" Overridable="yes">Η κατάργηση ολοκληρώθηκε με επιτυχία.</String>
494 <String Id="Error1725" Overridable="yes">Η κατάργηση απέτυχε.</String>
495 <String Id="Error1726" Overridable="yes">Η κοινοποίηση ολοκληρώθηκε με επιτυχία.</String>
496 <String Id="Error1727" Overridable="yes">Η κοινοποίηση απέτυχε.</String>
497 <String Id="Error1728" Overridable="yes">Η ρύθμιση παραμέτρων ολοκληρώθηκε με επιτυχία.</String>
498 <String Id="Error1729" Overridable="yes">Η ρύθμιση παραμέτρων απέτυχε.</String>
499 <String Id="Error1730" Overridable="yes">Πρέπει να είστε διαχειριστής, για να καταργήσετε αυτή την εφαρμογή. Για την κατάργησή της θα πρέπει να συνδεθείτε στον υπολογιστή ως διαχειριστής ή να ζητήσετε βοήθεια από την ομάδα τεχνικής υποστήριξης.</String>
500 <String Id="Error1731" Overridable="yes">Το πακέτο εγκατάστασης του αρχείου προέλευσης για το προϊόν [2] είναι εκτός συγχρονισμού με το πακέτο του προγράμματος-πελάτη. Επιχειρήστε εκ νέου εγκατάσταση χρησιμοποιώντας ένα έγκυρο αντίγραφο του πακέτου εγκατάστασης '[3]'.</String>
501 <String Id="Error1732" Overridable="yes">Για να ολοκληρωθεί η εγκατάσταση του [2], πρέπει να κάνετε επανεκκίνηση του υπολογιστή. Αυτήν τη στιγμή είναι συνδεδεμένοι άλλοι χρήστες σε αυτόν τον υπολογιστή και με την επανεκκίνηση μπορεί να χάσουν τις εργασίες τους. Θέλετε να κάνετε επανεκκίνηση τώρα;</String>
502 <String Id="Error1801" Overridable="yes">Η διαδρομή [2] δεν είναι έγκυρη. Καθορίστε μια έγκυρη διαδρομή.</String>
503 <String Id="Error1802" Overridable="yes">Η μνήμη δεν επαρκεί. Τερματίστε τις άλλες εφαρμογές προτού προσπαθήσετε ξανά.</String>
504 <String Id="Error1803" Overridable="yes">Δεν υπάρχει δίσκος στη μονάδα δίσκου [2]. Τοποθετήστε ένα δίσκο και κάντε κλικ στο κουμπί "Επανάληψη" ή κάντε κλικ στο κουμπί "Άκυρο", για να επιστρέψετε στον τόμο που είχε επιλεγεί προηγουμένως.</String>
505 <String Id="Error1804" Overridable="yes">Δεν υπάρχει δίσκος στη μονάδα δίσκου [2]. Τοποθετήστε ένα δίσκο και κάντε κλικ στο κουμπί "Επανάληψη" ή κάντε κλικ στο κουμπί "Άκυρο" για να επιστρέψετε στο παράθυρο διαλόγου "Αναζήτηση" και να επιλέξετε έναν άλλον τόμο.</String>
506 <String Id="Error1805" Overridable="yes">Ο φάκελος [2] δεν υπάρχει. Πληκτρολογήστε μια διαδρομή προς ένα φάκελο που υπάρχει.</String>
507 <String Id="Error1806" Overridable="yes">Δεν έχετε επαρκή δικαιώματα για την ανάγνωση αυτού του φακέλου.</String>
508 <String Id="Error1807" Overridable="yes">Δεν ήταν δυνατός ο προσδιορισμός έγκυρου φακέλου προορισμού για την εγκατάσταση.</String>
509 <String Id="Error1901" Overridable="yes">Παρουσιάστηκε σφάλμα κατά την προσπάθεια ανάγνωσης από τη βάση δεδομένων εγκατάστασης προέλευσης: [2].</String>
510 <String Id="Error1902" Overridable="yes">Προγραμματισμός λειτουργίας επανεκκίνησης: Μετονομασία αρχείου [2] σε [3]. Πρέπει να γίνει επανεκκίνηση για να ολοκληρωθεί η λειτουργία.</String>
511 <String Id="Error1903" Overridable="yes">Προγραμματισμός λειτουργίας επανεκκίνησης: Διαγραφή αρχείου [2]. Πρέπει να γίνει επανεκκίνηση για να ολοκληρωθεί η λειτουργία.</String>
512 <String Id="Error1904" Overridable="yes">Η καταχώρηση της λειτουργικής μονάδας [2] απέτυχε. HRESULT [3]. Επικοινωνήστε με το προσωπικό υποστήριξης.</String>
513 <String Id="Error1905" Overridable="yes">Η κατάργηση της καταχώρησης της λειτουργικής μονάδας [2] απέτυχε. HRESULT [3]. Επικοινωνήστε με το προσωπικό υποστήριξης.</String>
514 <String Id="Error1906" Overridable="yes">Η εγγραφή του πακέτου [2] στη μνήμη cache απέτυχε. Σφάλμα: [3]. Επικοινωνήστε με το προσωπικό υποστήριξης.</String>
515 <String Id="Error1907" Overridable="yes">Δεν ήταν δυνατή η καταχώρηση της γραμματοσειράς [2]. Βεβαιωθείτε ότι έχετε επαρκή δικαιώματα για την εγκατάσταση γραμματοσειρών και ότι το σύστημα υποστηρίζει αυτήν τη γραμματοσειρά.</String>
516 <String Id="Error1908" Overridable="yes">Δεν ήταν δυνατή η κατάργηση της καταχώρησης της γραμματοσειράς [2]. Βεβαιωθείτε ότι έχετε επαρκή δικαιώματα για την κατάργηση γραμματοσειρών.</String>
517 <String Id="Error1909" Overridable="yes">Δεν ήταν δυνατή η δημιουργία της συντόμευσης [2]. Βεβαιωθείτε ότι ο φάκελος προορισμού υπάρχει και ότι έχετε πρόσβαση σε αυτόν.</String>
518 <String Id="Error1910" Overridable="yes">Δεν ήταν δυνατή η κατάργηση της συντόμευσης [2]. Βεβαιωθείτε ότι το αρχείο συντόμευσης υπάρχει και ότι έχετε πρόσβαση σε αυτό.</String>
519 <String Id="Error1911" Overridable="yes">Δεν ήταν δυνατή η καταχώρηση βιβλιοθήκης τύπων για το αρχείο [2]. Επικοινωνήστε με το προσωπικό υποστήριξης.</String>
520 <String Id="Error1912" Overridable="yes">Δεν ήταν δυνατή η κατάργηση της καταχώρησης βιβλιοθήκης τύπων για το αρχείο [2]. Επικοινωνήστε με το προσωπικό υποστήριξης.</String>
521 <String Id="Error1913" Overridable="yes">Δεν ήταν δυνατή η ενημέρωση του αρχείου ini [2][3]. Βεβαιωθείτε ότι το αρχείο υπάρχει και ότι έχετε πρόσβαση σε αυτό.</String>
522 <String Id="Error1914" Overridable="yes">Δεν ήταν δυνατός ο προγραμματισμός του αρχείου [2] ώστε να αντικαταστήσει το αρχείο [3] κατά την επανεκκίνηση. Βεβαιωθείτε ότι έχετε δικαιώματα εγγραφής στο αρχείο [3].</String>
523 <String Id="Error1915" Overridable="yes">Παρουσιάστηκε σφάλμα κατά την κατάργηση της διαχείρισης προγραμμάτων οδήγησης ODBC. Σφάλμα ODBC [2]: [3]. Επικοινωνήστε με το προσωπικό υποστήριξης.</String>
524 <String Id="Error1916" Overridable="yes">Παρουσιάστηκε σφάλμα κατά την εγκατάσταση της διαχείρισης προγραμμάτων οδήγησης ODBC. Σφάλμα ODBC [2]: [3]. Επικοινωνήστε με το προσωπικό υποστήριξης.</String>
525 <String Id="Error1917" Overridable="yes">Παρουσιάστηκε σφάλμα κατά την κατάργηση του προγράμματος οδήγησης ODBC: [4]. Σφάλμα ODBC [2]: [3]. Βεβαιωθείτε ότι έχετε επαρκή δικαιώματα για την κατάργηση προγραμμάτων οδήγησης ODBC.</String>
526 <String Id="Error1918" Overridable="yes">Παρουσιάστηκε σφάλμα κατά την εγκατάσταση του προγράμματος οδήγησης ODBC: [4]. Σφάλμα ODBC [2]: [3]. Βεβαιωθείτε ότι το αρχείο [4] υπάρχει και ότι έχετε πρόσβαση σε αυτό.</String>
527 <String Id="Error1919" Overridable="yes">Παρουσιάστηκε σφάλμα κατά τη ρύθμιση παραμέτρων της προέλευσης δεδομένων ODBC: [4]. Σφάλμα ODBC [2]: [3]. Βεβαιωθείτε ότι το αρχείο [4] υπάρχει και ότι έχετε πρόσβαση σε αυτό.</String>
528 <String Id="Error1920" Overridable="yes">Η εκκίνηση της υπηρεσίας "[2]" ([3]) απέτυχε. Βεβαιωθείτε ότι έχετε επαρκή δικαιώματα για την εκκίνηση υπηρεσιών συστήματος.</String>
529 <String Id="Error1921" Overridable="yes">Δεν ήταν δυνατή η διακοπή της υπηρεσίας "[2]" ([3]). Βεβαιωθείτε ότι έχετε επαρκή δικαιώματα για τη διακοπή υπηρεσιών συστήματος.</String>
530 <String Id="Error1922" Overridable="yes">Δεν ήταν δυνατή η διαγραφή της υπηρεσίας "[2]" ([3]). Βεβαιωθείτε ότι έχετε επαρκή δικαιώματα για την κατάργηση υπηρεσιών συστήματος.</String>
531 <String Id="Error1923" Overridable="yes">Δεν ήταν δυνατή η εγκατάσταση της υπηρεσίας "[2]" ([3]). Βεβαιωθείτε ότι έχετε επαρκή δικαιώματα για την εγκατάσταση υπηρεσιών συστήματος.</String>
532 <String Id="Error1924" Overridable="yes">Δεν ήταν δυνατή η ενημέρωση της μεταβλητής περιβάλλοντος "[2]". Βεβαιωθείτε ότι έχετε επαρκή δικαιώματα για την τροποποίηση μεταβλητών περιβάλλοντος.</String>
533 <String Id="Error1925" Overridable="yes">Δεν έχετε επαρκή δικαιώματα για την ολοκλήρωση αυτής της εγκατάστασης για όλους τους χρήστες του υπολογιστή. Συνδεθείτε ως διαχειριστής και προσπαθήστε ξανά να κάνετε εγκατάσταση.</String>
534 <String Id="Error1926" Overridable="yes">Δεν ήταν δυνατή η ρύθμιση ασφαλείας αρχείου για το αρχείο "[3]". Σφάλμα: [2]. Βεβαιωθείτε ότι έχετε επαρκή δικαιώματα για την τροποποίηση των δικαιωμάτων ασφαλείας για αυτό το αρχείο.</String>
535 <String Id="Error1927" Overridable="yes">Οι υπηρεσίες στοιχείων (COM+ 1.0) δεν έχουν εγκατασταθεί σε αυτόν τον υπολογιστή. Αυτή η εγκατάσταση απαιτεί τις υπηρεσίες στοιχείων για να ολοκληρωθεί με επιτυχία. Οι υπηρεσίες στοιχείων είναι διαθέσιμες στα Windows 2000.</String>
536 <String Id="Error1928" Overridable="yes">Παρουσιάστηκε σφάλμα κατά την καταχώρηση της εφαρμογής COM+. Για περισσότερες πληροφορίες, επικοινωνήστε με το προσωπικό υποστήριξης.</String>
537 <String Id="Error1929" Overridable="yes">Παρουσιάστηκε σφάλμα κατά την κατάργηση της καταχώρησης της εφαρμογής COM+. Για περισσότερες πληροφορίες, επικοινωνήστε με το προσωπικό υποστήριξης.</String>
538 <String Id="Error1930" Overridable="yes">Δεν ήταν δυνατή η αλλαγή της περιγραφής για την υπηρεσία "[2]" ([3]).</String>
539 <String Id="Error1931" Overridable="yes">Δεν είναι δυνατή η ενημέρωση του αρχείου συστήματος [2] από την υπηρεσία Windows Installer, επειδή το αρχείο προστατεύεται από τα Windows. Ίσως χρειαστεί να ενημερώσετε το λειτουργικό σας σύστημα, ώστε να λειτουργεί σωστά αυτό το πρόγραμμα. {{Έκδοση πακέτου: [3], Έκδοση προστατευμένου λειτουργικού συστήματος: [4]}}</String>
540 <String Id="Error1932" Overridable="yes">Δεν είναι δυνατή η ενημέρωση του προστατευμένου αρχείου των Windows [2] από την υπηρεσία του Windows Installer. {{Έκδοση πακέτου: [3], Έκδοση προστατευμένου λειτουργικού συστήματος: [4], Σφάλμα SFP: [5]}}</String>
541 <String Id="Error1933" Overridable="yes">Η υπηρεσία Windows Installer δεν μπορεί να ενημερώσει ένα ή περισσότερα προστατευμένα αρχεία των Windows. {{Σφάλμα SFP: [2]. Λίστα προστατευμένων αρχείων:\r\n[3]}}</String>
542 <String Id="Error1934" Overridable="yes">Οι εγκαταστάσεις χρηστών είναι απενεργοποιημένες μέσω πολιτικής στον υπολογιστή.</String>
543 <String Id="Error1935" Overridable="yes">Παρουσιάστηκε σφάλμα κατά την εγκατάσταση της συγκρότησης "[6]". Ανατρέξτε στη Βοήθεια και Υποστήριξη για περισσότερες πληροφορίες. HRESULT: [3]. {{διασύνδεση συγκρότησης: [4], λειτουργία: [5], στοιχείο: [2]}}</String>
544 <String Id="Error1936" Overridable="yes">Παρουσιάστηκε σφάλμα κατά την εγκατάσταση της συγκρότησης "[6]". Η συγκρότηση δεν έχει ισχυρό όνομα ή δεν διαθέτει υπογραφή με το ελάχιστο μήκος κλειδιού. HRESULT: [3]. {{διασύνδεση συγκρότησης: [4], λειτουργία: [5], στοιχείο: [2]}}</String>
545 <String Id="Error1937" Overridable="yes">Παρουσιάστηκε σφάλμα κατά την εγκατάσταση της συγκρότησης "[6]". Η υπογραφή ή ο κατάλογος δεν ήταν δυνατό να επαληθευτούν ή δεν είναι έγκυρα. HRESULT: [3]. {{διασύνδεση συγκρότησης: [4], λειτουργία: [5], στοιχείο: [2]}}</String>
546 <String Id="Error1938" Overridable="yes">Παρουσιάστηκε σφάλμα κατά την εγκατάσταση της συγκρότησης "[6]". Μία ή περισσότερες λειτουργικές μονάδες της συγκρότησης δεν ήταν δυνατό να βρεθούν. HRESULT: [3]. {{διασύνδεση συγκρότησης: [4], λειτουργία: [5], στοιχείο: [2]}}</String>
547
548 <String Id="UITextbytes" Overridable="yes">byte</String>
549 <String Id="UITextGB" Overridable="yes">GB</String>
550 <String Id="UITextKB" Overridable="yes">KB</String>
551 <String Id="UITextMB" Overridable="yes">MB</String>
552 <String Id="UITextMenuAbsent" Overridable="yes">Δεν θα είναι διαθέσιμη η πλήρης δυνατότητα</String>
553 <String Id="UITextMenuAdvertise" Overridable="yes">Η δυνατότητα θα εγκατασταθεί όταν ζητηθεί</String>
554 <String Id="UITextMenuAllCD" Overridable="yes">Η πλήρης δυνατότητα θα εγκατασταθεί για εκτέλεση από το CD</String>
555 <String Id="UITextMenuAllLocal" Overridable="yes">Η πλήρης δυνατότητα θα εγκατασταθεί στον τοπικό σκληρό δίσκο</String>
556 <String Id="UITextMenuAllNetwork" Overridable="yes">Η πλήρης δυνατότητα θα εγκατασταθεί για εκτέλεση από το δίκτυο</String>
557 <String Id="UITextMenuCD" Overridable="yes">Θα εγκατασταθεί για εκτέλεση από το CD</String>
558 <String Id="UITextMenuLocal" Overridable="yes">Θα εγκατασταθεί στον τοπικό σκληρό δίσκο</String>
559 <String Id="UITextMenuNetwork" Overridable="yes">Θα εγκατασταθεί για εκτέλεση από το δίκτυο</String>
560 <String Id="UITextNewFolder" Overridable="yes">Φάκελος|Νέος φάκελος</String>
561 <String Id="UITextScriptInProgress" Overridable="yes">Συλλογή απαιτούμενων πληροφοριών...</String>
562 <String Id="UITextSelAbsentAbsent" Overridable="yes">Αυτή η δυνατότητα δεν θα εγκατασταθεί</String>
563 <String Id="UITextSelAbsentAdvertise" Overridable="yes">Αυτή η δυνατότητα θα ρυθμιστεί έτσι ώστε να εγκατασταθεί όταν θα είναι απαραίτητη</String>
564 <String Id="UITextSelAbsentCD" Overridable="yes">Αυτή η δυνατότητα θα εγκατασταθεί ώστε να εκτελείται από CD</String>
565 <String Id="UITextSelAbsentLocal" Overridable="yes">Αυτή η δυνατότητα θα εγκατασταθεί στον τοπικό σκληρό δίσκο</String>
566 <String Id="UITextSelAbsentNetwork" Overridable="yes">Αυτή η δυνατότητα θα εγκατασταθεί ώστε να εκτελείται από το δίκτυο</String>
567 <String Id="UITextSelAdvertiseAbsent" Overridable="yes">Αυτή η δυνατότητα δεν θα είναι πλέον διαθέσιμη</String>
568 <String Id="UITextSelAdvertiseAdvertise" Overridable="yes">Θα εγκατασταθεί όταν ζητηθεί</String>
569 <String Id="UITextSelAdvertiseCD" Overridable="yes">Αυτή η δυνατότητα θα είναι διαθέσιμη για εκτέλεση από το CD</String>
570 <String Id="UITextSelAdvertiseLocal" Overridable="yes">Αυτή η δυνατότητα θα εγκατασταθεί στον τοπικό σκληρό δίσκο</String>
571 <String Id="UITextSelAdvertiseNetwork" Overridable="yes">Αυτή η δυνατότητα θα είναι διαθέσιμη για εκτέλεση από το δίκτυο</String>
572 <String Id="UITextSelCDAbsent" Overridable="yes">Η εγκατάσταση αυτής της δυνατότητας θα καταργηθεί πλήρως, δεν θα μπορείτε να την εκτελέσετε από CD</String>
573 <String Id="UITextSelCDAdvertise" Overridable="yes">Αυτή η δυνατότητα θα αλλάξει από την κατάσταση εκτέλεσης από CD, για να εγκατασταθεί όταν ζητηθεί</String>
574 <String Id="UITextSelCDCD" Overridable="yes">Αυτή η δυνατότητα θα εξακολουθήσει να εκτελείται από CD</String>
575 <String Id="UITextSelCDLocal" Overridable="yes">Αυτή η δυνατότητα θα αλλάξει από την κατάσταση εκτέλεσης από CD, για να εγκατασταθεί στον τοπικό σκληρό δίσκο</String>
576 <String Id="UITextSelChildCostNeg" Overridable="yes">Αυτή η δυνατότητα αποδεσμεύει [1] από το σκληρό δίσκο.</String>
577 <String Id="UITextSelChildCostPos" Overridable="yes">Αυτή η δυνατότητα απαιτεί [1] στο σκληρό δίσκο.</String>
578 <String Id="UITextSelCostPending" Overridable="yes">Υπολογισμός απαιτούμενου χώρου για αυτήν τη δυνατότητα...</String>
579 <String Id="UITextSelLocalAbsent" Overridable="yes">Αυτή η δυνατότητα θα καταργηθεί εντελώς</String>
580 <String Id="UITextSelLocalAdvertise" Overridable="yes">Αυτή η δυνατότητα θα καταργηθεί από τον τοπικό σκληρό σας δίσκο, αλλά θα ρυθμιστεί για να εγκατασταθεί όταν ζητηθεί</String>
581 <String Id="UITextSelLocalCD" Overridable="yes">Αυτή η δυνατότητα θα καταργηθεί από τον τοπικό σκληρό δίσκο, αλλά θα είναι ακόμη διαθέσιμη για εκτέλεση από CD</String>
582 <String Id="UITextSelLocalLocal" Overridable="yes">Αυτή η δυνατότητα θα παραμείνει στον τοπικό σκληρό σας δίσκο</String>
583 <String Id="UITextSelLocalNetwork" Overridable="yes">Αυτή η δυνατότητα θα καταργηθεί από τον τοπικό σκληρό δίσκο, αλλά θα είναι ακόμη διαθέσιμη για εκτέλεση από το δίκτυο</String>
584 <String Id="UITextSelNetworkAbsent" Overridable="yes">Η εγκατάσταση αυτής της δυνατότητας θα καταργηθεί πλήρως, δεν θα μπορείτε να την εκτελέσετε από το δίκτυο</String>
585 <String Id="UITextSelNetworkAdvertise" Overridable="yes">Αυτή η δυνατότητα θα αλλάξει από την κατάσταση εκτέλεσης από το δίκτυο, για να εγκατασταθεί όταν ζητηθεί</String>
586 <String Id="UITextSelNetworkLocal" Overridable="yes">Αυτή η δυνατότητα θα αλλάξει από την κατάσταση εκτέλεσης από το δίκτυο, για να εγκατασταθεί στον τοπικό σκληρό δίσκο</String>
587 <String Id="UITextSelNetworkNetwork" Overridable="yes">Αυτή η δυνατότητα θα εξακολουθήσει να εκτελείται από το δίκτυο</String>
588 <String Id="UITextSelParentCostNegNeg" Overridable="yes">Αυτή η δυνατότητα αποδεσμεύει [1] από το σκληρό δίσκο. Οι [2] από τις [3] δευτερεύουσες δυνατότητές της είναι επιλεγμένες. Οι δευτερεύουσες δυνατότητες αποδεσμεύουν έως [4] από το σκληρό δίσκο.</String>
589 <String Id="UITextSelParentCostNegPos" Overridable="yes">Αυτή η δυνατότητα αποδεσμεύει [1] από το σκληρό δίσκο. Οι [2] από τις [3] δευτερεύουσες δυνατότητές της είναι επιλεγμένες. Οι δευτερεύουσες δυνατότητες απαιτούν [4] στο σκληρό δίσκο.</String>
590 <String Id="UITextSelParentCostPosNeg" Overridable="yes">Αυτή η δυνατότητα απαιτεί [1] στο σκληρό δίσκο. Οι [2] από τις [3] δευτερεύουσες δυνατότητές της είναι επιλεγμένες. Οι δευτερεύουσες δυνατότητες αποδεσμεύουν έως [4] από το σκληρό δίσκο.</String>
591 <String Id="UITextSelParentCostPosPos" Overridable="yes">Αυτή η δυνατότητα απαιτεί [1] στο σκληρό δίσκο. Οι [2] από τις [3] δευτερεύουσες δυνατότητές της είναι επιλεγμένες. Οι δευτερεύουσες δυνατότητες απαιτούν [4] στο σκληρό δίσκο.</String>
592 <String Id="UITextTimeRemaining" Overridable="yes">Χρόνος που απομένει: {[1] λεπτά }{[2] δευτερόλεπτα}</String>
593 <String Id="UITextVolumeCostAvailable" Overridable="yes">Διαθέσιμο</String>
594 <String Id="UITextVolumeCostDifference" Overridable="yes">Διαφορά</String>
595 <String Id="UITextVolumeCostRequired" Overridable="yes">Απαιτούμενο</String>
596 <String Id="UITextVolumeCostSize" Overridable="yes">Μέγεθος δίσκου</String>
597 <String Id="UITextVolumeCostVolume" Overridable="yes">Τόμος</String>
598</WixLocalization>
diff --git a/src/ext/UI/wixlib/WixUI_en-us.wxl b/src/ext/UI/wixlib/WixUI_en-us.wxl
new file mode 100644
index 00000000..204a9b36
--- /dev/null
+++ b/src/ext/UI/wixlib/WixUI_en-us.wxl
@@ -0,0 +1,601 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3
4
5<WixLocalization Culture="en-US" Codepage="1252" xmlns="http://wixtoolset.org/schemas/v4/wxl">
6 <!-- _locID@Culture="en-US" _locComment="American English" -->
7 <!-- _locID@Codepage="1252" _locComment="Windows-1252" -->
8
9 <String Id="WixUIBack" Overridable="yes"><!-- _locID_text="WixUIBack" _locComment="WixUIBack" -->&amp;Back</String>
10 <String Id="WixUINext" Overridable="yes"><!-- _locID_text="WixUINext" _locComment="WixUINext" -->&amp;Next</String>
11 <String Id="WixUICancel" Overridable="yes"><!-- _locID_text="WixUICancel" _locComment="WixUICancel" -->Cancel</String>
12 <String Id="WixUIFinish" Overridable="yes"><!-- _locID_text="WixUIFinish" _locComment="WixUIFinish" -->&amp;Finish</String>
13 <String Id="WixUIRetry" Overridable="yes"><!-- _locID_text="WixUIRetry" _locComment="WixUIRetry" -->&amp;Retry</String>
14 <String Id="WixUIIgnore" Overridable="yes"><!-- _locID_text="WixUIIgnore" _locComment="WixUIIgnore" -->&amp;Ignore</String>
15 <String Id="WixUIYes" Overridable="yes"><!-- _locID_text="WixUIYes" _locComment="WixUIYes" -->&amp;Yes</String>
16 <String Id="WixUINo" Overridable="yes"><!-- _locID_text="WixUINo" _locComment="WixUINo" -->&amp;No</String>
17 <String Id="WixUIOK" Overridable="yes"><!-- _locID_text="WixUIOK" _locComment="WixUIOK" -->OK</String>
18 <String Id="WixUIPrint" Overridable="yes"><!-- _locID_text="WixUIPrint" _locComment="WixUIPrint" -->&amp;Print</String>
19
20 <String Id="AdvancedWelcomeEulaDlg_Title" Overridable="yes"><!-- _locID_text="AdvancedWelcomeEulaDlg_Title" _locComment="AdvancedWelcomeEulaDlg_Title" -->[ProductName] Setup</String>
21 <String Id="AdvancedWelcomeEulaDlgBannerBitmap" Overridable="yes"><!-- _locID_text="AdvancedWelcomeEulaDlgBannerBitmap" _locComment="AdvancedWelcomeEulaDlgBannerBitmap" -->WixUI_Bmp_Banner</String>
22 <String Id="AdvancedWelcomeEulaDlgTitle" Overridable="yes"><!-- _locID_text="AdvancedWelcomeEulaDlgTitle" _locComment="AdvancedWelcomeEulaDlgTitle" -->{\WixUI_Font_Title}Please read the [ProductName] License Agreement</String>
23 <String Id="AdvancedWelcomeEulaDlgLicenseAcceptedCheckBox" Overridable="yes"><!-- _locID_text="AdvancedWelcomeEulaDlgLicenseAcceptedCheckBox" _locComment="AdvancedWelcomeEulaDlgLicenseAcceptedCheckBox" -->I &amp;accept the terms in the License Agreement</String>
24 <String Id="AdvancedWelcomeEulaDlgDescriptionPerMachine" Overridable="yes"><!-- _locID_text="AdvancedWelcomeEulaDlgDescriptionPerMachine" _locComment="AdvancedWelcomeEulaDlgDescriptionPerMachine" -->Click Install to install the product with default options for all users. Click Advanced to change installation options.</String>
25 <String Id="AdvancedWelcomeEulaDlgDescriptionPerUser" Overridable="yes"><!-- _locID_text="AdvancedWelcomeEulaDlgDescriptionPerUser" _locComment="AdvancedWelcomeEulaDlgDescriptionPerUser" -->Click Install to install the product with default options just for you. Click Advanced to change installation options.</String>
26 <String Id="AdvancedWelcomeEulaDlgInstall" Overridable="yes"><!-- _locID_text="AdvancedWelcomeEulaDlgInstall" _locComment="AdvancedWelcomeEulaDlgInstall" -->&amp;Install</String>
27 <String Id="AdvancedWelcomeEulaDlgAdvanced" Overridable="yes"><!-- _locID_text="AdvancedWelcomeEulaDlgAdvanced" _locComment="AdvancedWelcomeEulaDlgAdvanced" -->A&amp;dvanced</String>
28 <String Id="Advanced_Font_Normal_Size" Overridable="yes"><!-- _locID_text="Advanced_Font_Normal_Size" _locComment="Advanced_Font_Normal_Size" -->8</String>
29 <String Id="Advanced_Font_Bigger_Size" Overridable="yes"><!-- _locID_text="Advanced_Font_Bigger_Size" _locComment="Advanced_Font_Bigger_Size" -->12</String>
30 <String Id="Advanced_Font_Title_Size" Overridable="yes"><!-- _locID_text="Advanced_Font_Title_Size" _locComment="Advanced_Font_Title_Size" -->9</String>
31 <String Id="Advanced_Font_Emphasized_Size" Overridable="yes"><!-- _locID_text="Advanced_Font_Emphasized_Size" _locComment="Advanced_Font_Emphasized_Size" -->8</String>
32 <String Id="Advanced_Font_FaceName" Overridable="yes"><!-- _locID_text="Advanced_Font_FaceName" _locComment="Advanced_Font_FaceName" -->Tahoma</String>
33
34 <String Id="BrowseDlg_Title" Overridable="yes"><!-- _locID_text="BrowseDlg_Title" _locComment="BrowseDlg_Title" -->[ProductName] Setup</String>
35 <String Id="BrowseDlgComboLabel" Overridable="yes"><!-- _locID_text="BrowseDlgComboLabel" _locComment="BrowseDlgComboLabel" -->&amp;Look in:</String>
36 <String Id="BrowseDlgWixUI_Bmp_Up" Overridable="yes"><!-- _locID_text="BrowseDlgWixUI_Bmp_Up" _locComment="BrowseDlgWixUI_Bmp_Up" -->WixUI_Bmp_Up</String>
37 <String Id="BrowseDlgWixUI_Bmp_UpTooltip" Overridable="yes"><!-- _locID_text="BrowseDlgWixUI_Bmp_UpTooltip" _locComment="BrowseDlgWixUI_Bmp_UpTooltip" -->Up one level</String>
38 <String Id="BrowseDlgNewFolder" Overridable="yes"><!-- _locID_text="BrowseDlgNewFolder" _locComment="BrowseDlgNewFolder" -->WixUI_Bmp_New</String>
39 <String Id="BrowseDlgNewFolderTooltip" Overridable="yes"><!-- _locID_text="BrowseDlgNewFolderTooltip" _locComment="BrowseDlgNewFolderTooltip" -->Create a new folder</String>
40 <String Id="BrowseDlgPathLabel" Overridable="yes"><!-- _locID_text="BrowseDlgPathLabel" _locComment="BrowseDlgPathLabel" -->&amp;Folder name:</String>
41 <String Id="BrowseDlgBannerBitmap" Overridable="yes"><!-- _locID_text="BrowseDlgBannerBitmap" _locComment="BrowseDlgBannerBitmap" -->WixUI_Bmp_Banner</String>
42 <String Id="BrowseDlgDescription" Overridable="yes"><!-- _locID_text="BrowseDlgDescription" _locComment="BrowseDlgDescription" -->Browse to the destination folder</String>
43 <String Id="BrowseDlgTitle" Overridable="yes"><!-- _locID_text="BrowseDlgTitle" _locComment="BrowseDlgTitle" -->{\WixUI_Font_Title}Change destination folder</String>
44
45 <String Id="CancelDlg_Title" Overridable="yes"><!-- _locID_text="CancelDlg_Title" _locComment="CancelDlg_Title" -->[ProductName] Setup</String>
46 <String Id="CancelDlgText" Overridable="yes"><!-- _locID_text="CancelDlgText" _locComment="CancelDlgText" -->Are you sure you want to cancel [ProductName] installation?</String>
47 <String Id="CancelDlgIcon" Overridable="yes"><!-- _locID_text="CancelDlgIcon" _locComment="CancelDlgIcon" -->WixUI_Ico_Info</String>
48 <String Id="CancelDlgIconTooltip" Overridable="yes"><!-- _locID_text="CancelDlgIconTooltip" _locComment="CancelDlgIconTooltip" -->Information icon</String>
49
50 <String Id="CustomizeDlg_Title" Overridable="yes"><!-- _locID_text="CustomizeDlg_Title" _locComment="CustomizeDlg_Title" -->[ProductName] Setup</String>
51 <String Id="CustomizeDlgTree" Overridable="yes"><!-- _locID_text="CustomizeDlgTree" _locComment="CustomizeDlgTree" -->Tree of selections</String>
52 <String Id="CustomizeDlgBrowse" Overridable="yes"><!-- _locID_text="CustomizeDlgBrowse" _locComment="CustomizeDlgBrowse" -->B&amp;rowse...</String>
53 <String Id="CustomizeDlgReset" Overridable="yes"><!-- _locID_text="CustomizeDlgReset" _locComment="CustomizeDlgReset" -->Re&amp;set</String>
54 <String Id="CustomizeDlgDiskCost" Overridable="yes"><!-- _locID_text="CustomizeDlgDiskCost" _locComment="CustomizeDlgDiskCost" -->Disk &amp;Usage</String>
55 <String Id="CustomizeDlgBannerBitmap" Overridable="yes"><!-- _locID_text="CustomizeDlgBannerBitmap" _locComment="CustomizeDlgBannerBitmap" -->WixUI_Bmp_Banner</String>
56 <String Id="CustomizeDlgText" Overridable="yes"><!-- _locID_text="CustomizeDlgText" _locComment="CustomizeDlgText" -->Click the icons in the tree below to change the way features will be installed.</String>
57 <String Id="CustomizeDlgDescription" Overridable="yes"><!-- _locID_text="CustomizeDlgDescription" _locComment="CustomizeDlgDescription" -->Select the way you want features to be installed.</String>
58 <String Id="CustomizeDlgTitle" Overridable="yes"><!-- _locID_text="CustomizeDlgTitle" _locComment="CustomizeDlgTitle" -->{\WixUI_Font_Title}Custom Setup</String>
59 <String Id="CustomizeDlgItemDescription" Overridable="yes"><!-- _locID_text="CustomizeDlgItemDescription" _locComment="CustomizeDlgItemDescription" -->CustomizeDlgItemDescription-CustomizeDlgItemDescription</String>
60 <String Id="CustomizeDlgItemSize" Overridable="yes"><!-- _locID_text="CustomizeDlgItemSize" _locComment="CustomizeDlgItemSize" -->CustomizeDlgItemSize-CustomizeDlgItemSize</String>
61 <String Id="CustomizeDlgLocation" Overridable="yes"><!-- _locID_text="CustomizeDlgLocation" _locComment="CustomizeDlgLocation" -->CustomizeDlgLocation-CustomizeDlgLocation</String>
62 <String Id="CustomizeDlgLocationLabel" Overridable="yes"><!-- _locID_text="CustomizeDlgLocationLabel" _locComment="CustomizeDlgLocationLabel" -->Location:</String>
63
64 <String Id="DiskCostDlg_Title" Overridable="yes"><!-- _locID_text="DiskCostDlg_Title" _locComment="DiskCostDlg_Title" -->[ProductName] Setup</String>
65 <String Id="DiskCostDlgBannerBitmap" Overridable="yes"><!-- _locID_text="DiskCostDlgBannerBitmap" _locComment="DiskCostDlgBannerBitmap" -->WixUI_Bmp_Banner</String>
66 <String Id="DiskCostDlgText" Overridable="yes"><!-- _locID_text="DiskCostDlgText" _locComment="DiskCostDlgText" -->Highlighted volumes do not have enough disk space available for selected features. You can either remove some files from the highlighted volumes, install fewer features, or select different destination drives.</String>
67 <String Id="DiskCostDlgDescription" Overridable="yes"><!-- _locID_text="DiskCostDlgDescription" _locComment="DiskCostDlgDescription" -->The disk space required for the installation of the selected features.</String>
68 <String Id="DiskCostDlgTitle" Overridable="yes"><!-- _locID_text="DiskCostDlgTitle" _locComment="DiskCostDlgTitle" -->{\WixUI_Font_Title}Disk Space Requirements</String>
69 <String Id="DiskCostDlgVolumeList" Overridable="yes"><!-- _locID_text="DiskCostDlgVolumeList" _locComment="DiskCostDlgVolumeList" -->{120}{70}{70}{70}{70}</String>
70
71 <String Id="ErrorDlg_Title" Overridable="yes"><!-- _locID_text="ErrorDlg_Title" _locComment="ErrorDlg_Title" -->[ProductName] Setup</String>
72 <String Id="ErrorDlgErrorText" Overridable="yes"><!-- _locID_text="ErrorDlgErrorText" _locComment="ErrorDlgErrorText" -->Information text</String>
73 <String Id="ErrorDlgErrorIcon" Overridable="yes"><!-- _locID_text="ErrorDlgErrorIcon" _locComment="ErrorDlgErrorIcon" -->WixUI_Ico_Info</String>
74 <String Id="ErrorDlgErrorIconTooltip" Overridable="yes"><!-- _locID_text="ErrorDlgErrorIconTooltip" _locComment="ErrorDlgErrorIconTooltip" -->Information icon</String>
75
76 <String Id="ExitDialog_Title" Overridable="yes"><!-- _locID_text="ExitDialog_Title" _locComment="ExitDialog_Title" -->[ProductName] Setup</String>
77 <String Id="ExitDialogBitmap" Overridable="yes"><!-- _locID_text="ExitDialogBitmap" _locComment="ExitDialogBitmap" -->WixUI_Bmp_Dialog</String>
78 <String Id="ExitDialogDescription" Overridable="yes"><!-- _locID_text="ExitDialogDescription" _locComment="ExitDialogDescription" -->Click the Finish button to exit the Setup Wizard.</String>
79 <String Id="ExitDialogTitle" Overridable="yes"><!-- _locID_text="ExitDialogTitle" _locComment="ExitDialogTitle" -->{\WixUI_Font_Bigger}Completed the [ProductName] Setup Wizard</String>
80
81 <String Id="FatalError_Title" Overridable="yes"><!-- _locID_text="FatalError_Title" _locComment="FatalError_Title" -->[ProductName] Setup</String>
82 <String Id="FatalErrorBitmap" Overridable="yes"><!-- _locID_text="FatalErrorBitmap" _locComment="FatalErrorBitmap" -->WixUI_Bmp_Dialog</String>
83 <String Id="FatalErrorTitle" Overridable="yes"><!-- _locID_text="FatalErrorTitle" _locComment="FatalErrorTitle" -->{\WixUI_Font_Bigger}[ProductName] Setup Wizard ended prematurely</String>
84 <String Id="FatalErrorDescription1" Overridable="yes"><!-- _locID_text="FatalErrorDescription1" _locComment="FatalErrorDescription1" -->[ProductName] Setup Wizard ended prematurely because of an error. Your system has not been modified. To install this program at a later time, run Setup Wizard again.</String>
85 <String Id="FatalErrorDescription2" Overridable="yes"><!-- _locID_text="FatalErrorDescription2" _locComment="FatalErrorDescription2" -->Click the Finish button to exit the Setup Wizard.</String>
86
87 <String Id="FeaturesDlg_Title" Overridable="yes"><!-- _locID_text="FeaturesDlg_Title" _locComment="FeaturesDlg_Title" -->[ProductName] Setup</String>
88 <String Id="FeaturesDlgTree" Overridable="yes"><!-- _locID_text="FeaturesDlgTree" _locComment="FeaturesDlgTree" -->Product features</String>
89 <String Id="FeaturesDlgBannerBitmap" Overridable="yes"><!-- _locID_text="FeaturesDlgBannerBitmap" _locComment="FeaturesDlgBannerBitmap" -->WixUI_Bmp_Banner</String>
90 <String Id="FeaturesDlgDescription" Overridable="yes"><!-- _locID_text="FeaturesDlgDescription" _locComment="FeaturesDlgDescription" -->Select the way you want features to be installed.</String>
91 <String Id="FeaturesDlgTitle" Overridable="yes"><!-- _locID_text="FeaturesDlgTitle" _locComment="FeaturesDlgTitle" -->{\WixUI_Font_Title}Product Features</String>
92 <String Id="FeaturesDlgItemDescription" Overridable="yes"><!-- _locID_text="FeaturesDlgItemDescription" _locComment="FeaturesDlgItemDescription" -->FeaturesDlgItemDescription</String>
93 <String Id="FeaturesDlgItemSize" Overridable="yes"><!-- _locID_text="FeaturesDlgItemSize" _locComment="FeaturesDlgItemSize" -->FeaturesDlgItemSize</String>
94 <String Id="FeaturesDlgInstall" Overridable="yes"><!-- _locID_text="FeaturesDlgInstall" _locComment="FeaturesDlgInstall" -->&amp;Install</String>
95 <String Id="FeaturesDlgChange" Overridable="yes"><!-- _locID_text="FeaturesDlgChange" _locComment="FeaturesDlgChange" -->&amp;Change</String>
96
97 <String Id="FilesInUse_Title" Overridable="yes"><!-- _locID_text="FilesInUse_Title" _locComment="FilesInUse_Title" -->[ProductName] Setup</String>
98 <String Id="FilesInUseExit" Overridable="yes"><!-- _locID_text="FilesInUseExit" _locComment="FilesInUseExit" -->E&amp;xit</String>
99 <String Id="FilesInUseBannerBitmap" Overridable="yes"><!-- _locID_text="FilesInUseBannerBitmap" _locComment="FilesInUseBannerBitmap" -->WixUI_Bmp_Banner</String>
100 <String Id="FilesInUseText" Overridable="yes"><!-- _locID_text="FilesInUseText" _locComment="FilesInUseText" -->The following applications are using files that need to be updated by this setup. Close these applications and then click &amp;Retry to continue setup or Exit to exit it.</String>
101 <String Id="FilesInUseDescription" Overridable="yes"><!-- _locID_text="FilesInUseDescription" _locComment="FilesInUseDescription" -->Some files that need to be updated are currently in use.</String>
102 <String Id="FilesInUseTitle" Overridable="yes"><!-- _locID_text="FilesInUseTitle" _locComment="FilesInUseTitle" -->{\WixUI_Font_Title}Files in Use</String>
103
104 <String Id="InstallDirDlg_Title" Overridable="yes"><!-- _locID_text="InstallDirDlg_Title" _locComment="InstallDirDlg_Title" -->[ProductName] Setup</String>
105 <String Id="InstallDirDlgChange" Overridable="yes"><!-- _locID_text="InstallDirDlgChange" _locComment="InstallDirDlgChange" -->&amp;Change...</String>
106 <String Id="InstallDirDlgTitle" Overridable="yes"><!-- _locID_text="InstallDirDlgTitle" _locComment="InstallDirDlgTitle" -->{\WixUI_Font_Title}Destination Folder</String>
107 <String Id="InstallDirDlgDescription" Overridable="yes"><!-- _locID_text="InstallDirDlgDescription" _locComment="InstallDirDlgDescription" -->Click Next to install to the default folder or click Change to choose another.</String>
108 <String Id="InstallDirDlgBannerBitmap" Overridable="yes"><!-- _locID_text="InstallDirDlgBannerBitmap" _locComment="InstallDirDlgBannerBitmap" -->WixUI_Bmp_Banner</String>
109 <String Id="InstallDirDlgFolderLabel" Overridable="yes"><!-- _locID_text="InstallDirDlgFolderLabel" _locComment="InstallDirDlgFolderLabel" -->Install [ProductName] to:</String>
110
111 <String Id="InstallScopeDlg_Title" Overridable="yes"><!-- _locID_text="InstallScopeDlg_Title" _locComment="InstallScopeDlg_Title" -->[ProductName] Setup</String>
112 <String Id="InstallScopeDlgBannerBitmap" Overridable="yes"><!-- _locID_text="InstallScopeDlgBannerBitmap" _locComment="InstallScopeDlgBannerBitmap" -->WixUI_Bmp_Banner</String>
113 <String Id="InstallScopeDlgDescription" Overridable="yes"><!-- _locID_text="InstallScopeDlgDescription" _locComment="InstallScopeDlgDescription" -->Choose the installation scope and folder</String>
114 <String Id="InstallScopeDlgTitle" Overridable="yes"><!-- _locID_text="InstallScopeDlgTitle" _locComment="InstallScopeDlgTitle" -->{\WixUI_Font_Title}Installation Scope</String>
115 <String Id="InstallScopeDlgPerUser" Overridable="yes"><!-- _locID_text="InstallScopeDlgPerUser" _locComment="InstallScopeDlgPerUser" -->{\WixUI_Font_Emphasized}Install &amp;just for you ([LogonUser])</String>
116 <String Id="InstallScopeDlgPerUserDescription" Overridable="yes"><!-- _locID_text="InstallScopeDlgPerUserDescription" _locComment="InstallScopeDlgPerUserDescription" -->[ProductName] will be installed in a per-user folder and be available just for your user account. You do not need local Administrator privileges.</String>
117 <String Id="InstallScopeDlgNoPerUserDescription" Overridable="yes"><!-- _locID_text="InstallScopeDlgNoPerUserDescription" _locComment="InstallScopeDlgNoPerUserDescription" -->[ProductName] does not support per-user installation.</String>
118 <String Id="InstallScopeDlgPerMachine" Overridable="yes"><!-- _locID_text="InstallScopeDlgPerMachine" _locComment="InstallScopeDlgPerMachine" -->{\WixUI_Font_Emphasized}Install for all users of this &amp;machine</String>
119 <String Id="InstallScopeDlgPerMachineDescription" Overridable="yes"><!-- _locID_text="InstallScopeDlgPerMachineDescription" _locComment="InstallScopeDlgPerMachineDescription" -->[ProductName] will be installed in a per-machine folder by default and be available for all users. You can change the default installation folder. You must have local Administrator privileges.</String>
120 <String Id="InstallScopeDlgFolderLabel" Overridable="yes"><!-- _locID_text="InstallScopeDlgFolderLabel" _locComment="InstallScopeDlgFolderLabel" -->Installation &amp;folder:</String>
121 <String Id="InstallScopeDlgChange" Overridable="yes"><!-- _locID_text="InstallScopeDlgChange" _locComment="InstallScopeDlgChange" -->&amp;Change...</String>
122
123 <String Id="InvalidDirDlg_Title" Overridable="yes"><!-- _locID_text="InvalidDirDlg_Title" _locComment="InvalidDirDlg_Title" -->[ProductName] Setup</String>
124 <String Id="InvalidDirDlgText" Overridable="yes"><!-- _locID_text="InvalidDirDlgText" _locComment="InvalidDirDlgText" -->Installation directory must be on a local hard drive.</String>
125 <String Id="InvalidDirDlgIcon" Overridable="yes"><!-- _locID_text="InvalidDirDlgIcon" _locComment="InvalidDirDlgIcon" -->WixUI_Ico_Info</String>
126 <String Id="InvalidDirDlgIconTooltip" Overridable="yes"><!-- _locID_text="InvalidDirDlgIconTooltip" _locComment="InvalidDirDlgIconTooltip" -->Information icon</String>
127
128 <String Id="LicenseAgreementDlg_Title" Overridable="yes"><!-- _locID_text="LicenseAgreementDlg_Title" _locComment="LicenseAgreementDlg_Title" -->[ProductName] Setup</String>
129 <String Id="LicenseAgreementDlgLicenseAcceptedCheckBox" Overridable="yes"><!-- _locID_text="LicenseAgreementDlgLicenseAcceptedCheckBox" _locComment="LicenseAgreementDlgLicenseAcceptedCheckBox" -->I &amp;accept the terms in the License Agreement</String>
130 <String Id="LicenseAgreementDlgBannerBitmap" Overridable="yes"><!-- _locID_text="LicenseAgreementDlgBannerBitmap" _locComment="LicenseAgreementDlgBannerBitmap" -->WixUI_Bmp_Banner</String>
131 <String Id="LicenseAgreementDlgDescription" Overridable="yes"><!-- _locID_text="LicenseAgreementDlgDescription" _locComment="LicenseAgreementDlgDescription" -->Please read the following license agreement carefully</String>
132 <String Id="LicenseAgreementDlgTitle" Overridable="yes"><!-- _locID_text="LicenseAgreementDlgTitle" _locComment="LicenseAgreementDlgTitle" -->{\WixUI_Font_Title}End-User License Agreement</String>
133
134 <String Id="MaintenanceTypeDlg_Title" Overridable="yes"><!-- _locID_text="MaintenanceTypeDlg_Title" _locComment="MaintenanceTypeDlg_Title" -->[ProductName] Setup</String>
135 <String Id="MaintenanceTypeDlgChangeButton" Overridable="yes"><!-- _locID_text="MaintenanceTypeDlgChangeButton" _locComment="MaintenanceTypeDlgChangeButton" -->&amp;Change</String>
136 <String Id="MaintenanceTypeDlgChangeButtonTooltip" Overridable="yes"><!-- _locID_text="MaintenanceTypeDlgChangeButtonTooltip" _locComment="MaintenanceTypeDlgChangeButtonTooltip" -->Change Installation</String>
137 <String Id="MaintenanceTypeDlgRepairButton" Overridable="yes"><!-- _locID_text="MaintenanceTypeDlgRepairButton" _locComment="MaintenanceTypeDlgRepairButton" -->Re&amp;pair</String>
138 <String Id="MaintenanceTypeDlgRepairButtonTooltip" Overridable="yes"><!-- _locID_text="MaintenanceTypeDlgRepairButtonTooltip" _locComment="MaintenanceTypeDlgRepairButtonTooltip" -->Repair Installation</String>
139 <String Id="MaintenanceTypeDlgRemoveButton" Overridable="yes"><!-- _locID_text="MaintenanceTypeDlgRemoveButton" _locComment="MaintenanceTypeDlgRemoveButton" -->&amp;Remove</String>
140 <String Id="MaintenanceTypeDlgRemoveButtonTooltip" Overridable="yes"><!-- _locID_text="MaintenanceTypeDlgRemoveButtonTooltip" _locComment="MaintenanceTypeDlgRemoveButtonTooltip" -->Remove Installation</String>
141 <String Id="MaintenanceTypeDlgBannerBitmap" Overridable="yes"><!-- _locID_text="MaintenanceTypeDlgBannerBitmap" _locComment="MaintenanceTypeDlgBannerBitmap" -->WixUI_Bmp_Banner</String>
142 <String Id="MaintenanceTypeDlgDescription" Overridable="yes"><!-- _locID_text="MaintenanceTypeDlgDescription" _locComment="MaintenanceTypeDlgDescription" -->Select the operation you wish to perform.</String>
143 <String Id="MaintenanceTypeDlgTitle" Overridable="yes"><!-- _locID_text="MaintenanceTypeDlgTitle" _locComment="MaintenanceTypeDlgTitle" -->{\WixUI_Font_Title}Change, repair, or remove installation</String>
144 <String Id="MaintenanceTypeDlgChangeText" Overridable="yes"><!-- _locID_text="MaintenanceTypeDlgChangeText" _locComment="MaintenanceTypeDlgChangeText" -->Lets you change the way features are installed.</String>
145 <String Id="MaintenanceTypeDlgChangeDisabledText" Overridable="yes"><!-- _locID_text="MaintenanceTypeDlgChangeDisabledText" _locComment="MaintenanceTypeDlgChangeDisabledText" -->[ProductName] has no independently selectable features.</String>
146 <String Id="MaintenanceTypeDlgRemoveText" Overridable="yes"><!-- _locID_text="MaintenanceTypeDlgRemoveText" _locComment="MaintenanceTypeDlgRemoveText" -->Removes [ProductName] from your computer.</String>
147 <String Id="MaintenanceTypeDlgRemoveDisabledText" Overridable="yes"><!-- _locID_text="MaintenanceTypeDlgRemoveDisabledText" _locComment="MaintenanceTypeDlgRemoveDisabledText" -->[ProductName] cannot be removed.</String>
148 <String Id="MaintenanceTypeDlgRepairText" Overridable="yes"><!-- _locID_text="MaintenanceTypeDlgRepairText" _locComment="MaintenanceTypeDlgRepairText" -->Repairs errors in the most recent installation by fixing missing and corrupt files, shortcuts, and registry entries.</String>
149 <String Id="MaintenanceTypeDlgRepairDisabledText" Overridable="yes"><!-- _locID_text="MaintenanceTypeDlgRepairDisabledText" _locComment="MaintenanceTypeDlgRepairDisabledText" -->[ProductName] cannot be repaired.</String>
150
151 <String Id="MaintenanceWelcomeDlg_Title" Overridable="yes"><!-- _locID_text="MaintenanceWelcomeDlg_Title" _locComment="MaintenanceWelcomeDlg_Title" -->[ProductName] Setup</String>
152 <String Id="MaintenanceWelcomeDlgBitmap" Overridable="yes"><!-- _locID_text="MaintenanceWelcomeDlgBitmap" _locComment="MaintenanceWelcomeDlgBitmap" -->WixUI_Bmp_Dialog</String>
153 <String Id="MaintenanceWelcomeDlgDescription" Overridable="yes"><!-- _locID_text="MaintenanceWelcomeDlgDescription" _locComment="MaintenanceWelcomeDlgDescription" -->The Setup Wizard allows you to change the way [ProductName] features are installed on your computer or to remove it from your computer. Click Next to continue or Cancel to exit the Setup Wizard.</String>
154 <String Id="MaintenanceWelcomeDlgTitle" Overridable="yes"><!-- _locID_text="MaintenanceWelcomeDlgTitle" _locComment="MaintenanceWelcomeDlgTitle" -->{\WixUI_Font_Bigger}Welcome to the [ProductName] Setup Wizard</String>
155
156 <String Id="MsiRMFilesInUse_Title" Overridable="yes"><!-- _locID_text="MsiRMFilesInUse_Title" _locComment="MsiRMFilesInUse_Title" -->[ProductName] Setup</String>
157 <String Id="MsiRMFilesInUseBannerBitmap" Overridable="yes"><!-- _locID_text="MsiRMFilesInUseBannerBitmap" _locComment="MsiRMFilesInUseBannerBitmap" -->WixUI_Bmp_Banner</String>
158 <String Id="MsiRMFilesInUseText" Overridable="yes"><!-- _locID_text="MsiRMFilesInUseText" _locComment="MsiRMFilesInUseText" -->The following applications are using files that need to be updated by this setup. You can let Setup Wizard close them and attempt to restart them or reboot the machine later.</String>
159 <String Id="MsiRMFilesInUseDescription" Overridable="yes"><!-- _locID_text="MsiRMFilesInUseDescription" _locComment="MsiRMFilesInUseDescription" -->Some files that need to be updated are currently in use.</String>
160 <String Id="MsiRMFilesInUseTitle" Overridable="yes"><!-- _locID_text="MsiRMFilesInUseTitle" _locComment="MsiRMFilesInUseTitle" -->{\WixUI_Font_Title}Files in Use</String>
161 <String Id="MsiRMFilesInUseUseRM" Overridable="yes"><!-- _locID_text="MsiRMFilesInUseUseRM" _locComment="MsiRMFilesInUseUseRM" -->&amp;Close the applications and attempt to restart them.</String>
162 <String Id="MsiRMFilesInUseDontUseRM" Overridable="yes"><!-- _locID_text="MsiRMFilesInUseDontUseRM" _locComment="MsiRMFilesInUseDontUseRM" -->&amp;Do not close applications. A reboot will be required.</String>
163
164 <String Id="OutOfDiskDlg_Title" Overridable="yes"><!-- _locID_text="OutOfDiskDlg_Title" _locComment="OutOfDiskDlg_Title" -->[ProductName] Setup</String>
165 <String Id="OutOfDiskDlgBannerBitmap" Overridable="yes"><!-- _locID_text="OutOfDiskDlgBannerBitmap" _locComment="OutOfDiskDlgBannerBitmap" -->WixUI_Bmp_Banner</String>
166 <String Id="OutOfDiskDlgText" Overridable="yes"><!-- _locID_text="OutOfDiskDlgText" _locComment="OutOfDiskDlgText" -->The highlighted volumes do not have enough disk space available for the currently selected features. You can remove some files from the highlighted volumes, install fewer features, or select a different destination drive.</String>
167 <String Id="OutOfDiskDlgDescription" Overridable="yes"><!-- _locID_text="OutOfDiskDlgDescription" _locComment="OutOfDiskDlgDescription" -->Disk space required for the installation exceeds available disk space.</String>
168 <String Id="OutOfDiskDlgTitle" Overridable="yes"><!-- _locID_text="OutOfDiskDlgTitle" _locComment="OutOfDiskDlgTitle" -->{\WixUI_Font_Title}Out of Disk Space</String>
169 <String Id="OutOfDiskDlgVolumeList" Overridable="yes"><!-- _locID_text="OutOfDiskDlgVolumeList" _locComment="OutOfDiskDlgVolumeList" -->{120}{70}{70}{70}{70}</String>
170
171 <String Id="OutOfRbDiskDlg_Title" Overridable="yes"><!-- _locID_text="OutOfRbDiskDlg_Title" _locComment="OutOfRbDiskDlg_Title" -->[ProductName] Setup</String>
172 <String Id="OutOfRbDiskDlgBannerBitmap" Overridable="yes"><!-- _locID_text="OutOfRbDiskDlgBannerBitmap" _locComment="OutOfRbDiskDlgBannerBitmap" -->WixUI_Bmp_Banner</String>
173 <String Id="OutOfRbDiskDlgText" Overridable="yes"><!-- _locID_text="OutOfRbDiskDlgText" _locComment="OutOfRbDiskDlgText" -->The highlighted volumes do not have enough disk space available for the currently selected features. You can remove some files from the highlighted volumes, install fewer features, or select a different destination drive.</String>
174 <String Id="OutOfRbDiskDlgDescription" Overridable="yes"><!-- _locID_text="OutOfRbDiskDlgDescription" _locComment="OutOfRbDiskDlgDescription" -->Disk space required for the installation exceeds available disk space.</String>
175 <String Id="OutOfRbDiskDlgTitle" Overridable="yes"><!-- _locID_text="OutOfRbDiskDlgTitle" _locComment="OutOfRbDiskDlgTitle" -->{\WixUI_Font_Title}Out of Disk Space</String>
176 <String Id="OutOfRbDiskDlgVolumeList" Overridable="yes"><!-- _locID_text="OutOfRbDiskDlgVolumeList" _locComment="OutOfRbDiskDlgVolumeList" -->{120}{70}{70}{70}{70}</String>
177 <String Id="OutOfRbDiskDlgText2" Overridable="yes"><!-- _locID_text="OutOfRbDiskDlgText2" _locComment="OutOfRbDiskDlgText2" -->Alternatively, you may choose to disable the installer's rollback functionality. Disabling rollback prevents the installer from restoring your computer's original state should the installation be interrupted in any way. Click Yes if you wish to take the risk of disabling rollback.</String>
178
179 <String Id="PrepareDlg_Title" Overridable="yes"><!-- _locID_text="PrepareDlg_Title" _locComment="PrepareDlg_Title" -->[ProductName] Setup</String>
180 <String Id="PrepareDlgBitmap" Overridable="yes"><!-- _locID_text="PrepareDlgBitmap" _locComment="PrepareDlgBitmap" -->WixUI_Bmp_Dialog</String>
181 <String Id="PrepareDlgDescription" Overridable="yes"><!-- _locID_text="PrepareDlgDescription" _locComment="PrepareDlgDescription" -->Please wait while the Setup Wizard prepares to guide you through the installation.</String>
182 <String Id="PrepareDlgTitle" Overridable="yes"><!-- _locID_text="PrepareDlgTitle" _locComment="PrepareDlgTitle" -->{\WixUI_Font_Bigger}Welcome to the [ProductName] Setup Wizard</String>
183
184 <String Id="ProgressDlg_Title" Overridable="yes"><!-- _locID_text="ProgressDlg_Title" _locComment="ProgressDlg_Title" -->[ProductName] Setup</String>
185 <String Id="ProgressDlgBannerBitmap" Overridable="yes"><!-- _locID_text="ProgressDlgBannerBitmap" _locComment="ProgressDlgBannerBitmap" -->WixUI_Bmp_Banner</String>
186 <String Id="ProgressDlgTextInstalling" Overridable="yes"><!-- _locID_text="ProgressDlgTextInstalling" _locComment="ProgressDlgTextInstalling" -->Please wait while the Setup Wizard installs [ProductName].</String>
187 <String Id="ProgressDlgTitleInstalling" Overridable="yes"><!-- _locID_text="ProgressDlgTitleInstalling" _locComment="ProgressDlgTitleInstalling" -->{\WixUI_Font_Title}Installing [ProductName]</String>
188 <String Id="ProgressDlgTextChanging" Overridable="yes"><!-- _locID_text="ProgressDlgTextChanging" _locComment="ProgressDlgTextChanging" -->Please wait while the Setup Wizard changes [ProductName].</String>
189 <String Id="ProgressDlgTitleChanging" Overridable="yes"><!-- _locID_text="ProgressDlgTitleChanging" _locComment="ProgressDlgTitleChanging" -->{\WixUI_Font_Title}Changing [ProductName]</String>
190 <String Id="ProgressDlgTextRepairing" Overridable="yes"><!-- _locID_text="ProgressDlgTextRepairing" _locComment="ProgressDlgTextRepairing" -->Please wait while the Setup Wizard repairs [ProductName].</String>
191 <String Id="ProgressDlgTitleRepairing" Overridable="yes"><!-- _locID_text="ProgressDlgTitleRepairing" _locComment="ProgressDlgTitleRepairing" -->{\WixUI_Font_Title}Repairing [ProductName]</String>
192 <String Id="ProgressDlgTextRemoving" Overridable="yes"><!-- _locID_text="ProgressDlgTextRemoving" _locComment="ProgressDlgTextRemoving" -->Please wait while the Setup Wizard removes [ProductName].</String>
193 <String Id="ProgressDlgTitleRemoving" Overridable="yes"><!-- _locID_text="ProgressDlgTitleRemoving" _locComment="ProgressDlgTitleRemoving" -->{\WixUI_Font_Title}Removing [ProductName]</String>
194 <String Id="ProgressDlgTextUpdating" Overridable="yes"><!-- _locID_text="ProgressDlgTextUpdating" _locComment="ProgressDlgTextUpdating" -->Please wait while the Setup Wizard updates [ProductName].</String>
195 <String Id="ProgressDlgTitleUpdating" Overridable="yes"><!-- _locID_text="ProgressDlgTitleUpdating" _locComment="ProgressDlgTitleUpdating" -->{\WixUI_Font_Title}Updating [ProductName]</String>
196 <String Id="ProgressDlgProgressBar" Overridable="yes"><!-- _locID_text="ProgressDlgProgressBar" _locComment="ProgressDlgProgressBar" -->Progress done</String>
197 <String Id="ProgressDlgStatusLabel" Overridable="yes"><!-- _locID_text="ProgressDlgStatusLabel" _locComment="ProgressDlgStatusLabel" -->Status:</String>
198
199 <String Id="ResumeDlg_Title" Overridable="yes"><!-- _locID_text="ResumeDlg_Title" _locComment="ResumeDlg_Title" -->[ProductName] Setup</String>
200 <String Id="ResumeDlgInstall" Overridable="yes"><!-- _locID_text="ResumeDlgInstall" _locComment="ResumeDlgInstall" -->&amp;Install</String>
201 <String Id="ResumeDlgBitmap" Overridable="yes"><!-- _locID_text="ResumeDlgBitmap" _locComment="ResumeDlgBitmap" -->WixUI_Bmp_Dialog</String>
202 <String Id="ResumeDlgDescription" Overridable="yes"><!-- _locID_text="ResumeDlgDescription" _locComment="ResumeDlgDescription" -->The Setup Wizard will complete the installation of [ProductName] on your computer. Click Install to continue or Cancel to exit the Setup Wizard.</String>
203 <String Id="ResumeDlgTitle" Overridable="yes"><!-- _locID_text="ResumeDlgTitle" _locComment="ResumeDlgTitle" -->{\WixUI_Font_Bigger}Resuming the [ProductName] Setup Wizard</String>
204
205 <String Id="SetupTypeDlg_Title" Overridable="yes"><!-- _locID_text="SetupTypeDlg_Title" _locComment="SetupTypeDlg_Title" -->[ProductName] Setup</String>
206 <String Id="SetupTypeDlgTypicalButton" Overridable="yes"><!-- _locID_text="SetupTypeDlgTypicalButton" _locComment="SetupTypeDlgTypicalButton" -->&amp;Typical</String>
207 <String Id="SetupTypeDlgTypicalButtonTooltip" Overridable="yes"><!-- _locID_text="SetupTypeDlgTypicalButtonTooltip" _locComment="SetupTypeDlgTypicalButtonTooltip" -->Typical Installation</String>
208 <String Id="SetupTypeDlgCustomButton" Overridable="yes"><!-- _locID_text="SetupTypeDlgCustomButton" _locComment="SetupTypeDlgCustomButton" -->C&amp;ustom</String>
209 <String Id="SetupTypeDlgCustomButtonTooltip" Overridable="yes"><!-- _locID_text="SetupTypeDlgCustomButtonTooltip" _locComment="SetupTypeDlgCustomButtonTooltip" -->Custom Installation</String>
210 <String Id="SetupTypeDlgCompleteButton" Overridable="yes"><!-- _locID_text="SetupTypeDlgCompleteButton" _locComment="SetupTypeDlgCompleteButton" -->C&amp;omplete</String>
211 <String Id="SetupTypeDlgCompleteButtonTooltip" Overridable="yes"><!-- _locID_text="SetupTypeDlgCompleteButtonTooltip" _locComment="SetupTypeDlgCompleteButtonTooltip" -->Complete Installation</String>
212 <String Id="SetupTypeDlgBannerBitmap" Overridable="yes"><!-- _locID_text="SetupTypeDlgBannerBitmap" _locComment="SetupTypeDlgBannerBitmap" -->WixUI_Bmp_Banner</String>
213 <String Id="SetupTypeDlgTitle" Overridable="yes"><!-- _locID_text="SetupTypeDlgTitle" _locComment="SetupTypeDlgTitle" -->{\WixUI_Font_Title}Choose Setup Type</String>
214 <String Id="SetupTypeDlgDescription" Overridable="yes"><!-- _locID_text="SetupTypeDlgDescription" _locComment="SetupTypeDlgDescription" -->Choose the setup type that best suits your needs</String>
215 <String Id="SetupTypeDlgTypicalText" Overridable="yes"><!-- _locID_text="SetupTypeDlgTypicalText" _locComment="SetupTypeDlgTypicalText" -->Installs the most common program features. Recommended for most users.</String>
216 <String Id="SetupTypeDlgCustomText" Overridable="yes"><!-- _locID_text="SetupTypeDlgCustomText" _locComment="SetupTypeDlgCustomText" -->Allows users to choose which program features will be installed and where they will be installed. Recommended for advanced users.</String>
217 <String Id="SetupTypeDlgCompleteText" Overridable="yes"><!-- _locID_text="SetupTypeDlgCompleteText" _locComment="SetupTypeDlgCompleteText" -->All program features will be installed. Requires the most disk space.</String>
218
219 <String Id="UserExit_Title" Overridable="yes"><!-- _locID_text="UserExit_Title" _locComment="UserExit_Title" -->[ProductName] Setup</String>
220 <String Id="UserExitBitmap" Overridable="yes"><!-- _locID_text="UserExitBitmap" _locComment="UserExitBitmap" -->WixUI_Bmp_Dialog</String>
221 <String Id="UserExitTitle" Overridable="yes"><!-- _locID_text="UserExitTitle" _locComment="UserExitTitle" -->{\WixUI_Font_Bigger}[ProductName] Setup Wizard was interrupted</String>
222 <String Id="UserExitDescription1" Overridable="yes"><!-- _locID_text="UserExitDescription1" _locComment="UserExitDescription1" -->[ProductName] setup was interrupted. Your system has not been modified. To install this program at a later time, please run the installation again.</String>
223 <String Id="UserExitDescription2" Overridable="yes"><!-- _locID_text="UserExitDescription2" _locComment="UserExitDescription2" -->Click the Finish button to exit the Setup Wizard.</String>
224
225 <String Id="VerifyReadyDlg_Title" Overridable="yes"><!-- _locID_text="VerifyReadyDlg_Title" _locComment="VerifyReadyDlg_Title" -->[ProductName] Setup</String>
226 <String Id="VerifyReadyDlgBannerBitmap" Overridable="yes"><!-- _locID_text="VerifyReadyDlgBannerBitmap" _locComment="VerifyReadyDlgBannerBitmap" -->WixUI_Bmp_Banner</String>
227 <String Id="VerifyReadyDlgInstall" Overridable="yes"><!-- _locID_text="VerifyReadyDlgInstall" _locComment="VerifyReadyDlgInstall" -->&amp;Install</String>
228 <String Id="VerifyReadyDlgInstallText" Overridable="yes"><!-- _locID_text="VerifyReadyDlgInstallText" _locComment="VerifyReadyDlgInstallText" -->Click Install to begin the installation. Click Back to review or change any of your installation settings. Click Cancel to exit the wizard.</String>
229 <String Id="VerifyReadyDlgInstallTitle" Overridable="yes"><!-- _locID_text="VerifyReadyDlgInstallTitle" _locComment="VerifyReadyDlgInstallTitle" -->{\WixUI_Font_Title}Ready to install [ProductName]</String>
230 <String Id="VerifyReadyDlgChange" Overridable="yes"><!-- _locID_text="VerifyReadyDlgChange" _locComment="VerifyReadyDlgChange" -->&amp;Change</String>
231 <String Id="VerifyReadyDlgChangeText" Overridable="yes"><!-- _locID_text="VerifyReadyDlgChangeText" _locComment="VerifyReadyDlgChangeText" -->Click Change to begin the installation. Click Back to review or change any of your installation settings. Click Cancel to exit the wizard.</String>
232 <String Id="VerifyReadyDlgChangeTitle" Overridable="yes"><!-- _locID_text="VerifyReadyDlgChangeTitle" _locComment="VerifyReadyDlgChangeTitle" -->{\WixUI_Font_Title}Ready to change [ProductName]</String>
233 <String Id="VerifyReadyDlgRepair" Overridable="yes"><!-- _locID_text="VerifyReadyDlgRepair" _locComment="VerifyReadyDlgRepair" -->Re&amp;pair</String>
234 <String Id="VerifyReadyDlgRepairText" Overridable="yes"><!-- _locID_text="VerifyReadyDlgRepairText" _locComment="VerifyReadyDlgRepairText" -->Click Repair to repair the installation of [ProductName]. Click Back to review or change any of your installation settings. Click Cancel to exit the wizard.</String>
235 <String Id="VerifyReadyDlgRepairTitle" Overridable="yes"><!-- _locID_text="VerifyReadyDlgRepairTitle" _locComment="VerifyReadyDlgRepairTitle" -->{\WixUI_Font_Title}Ready to repair [ProductName]</String>
236 <String Id="VerifyReadyDlgRemove" Overridable="yes"><!-- _locID_text="VerifyReadyDlgRemove" _locComment="VerifyReadyDlgRemove" -->&amp;Remove</String>
237 <String Id="VerifyReadyDlgRemoveText" Overridable="yes"><!-- _locID_text="VerifyReadyDlgRemoveText" _locComment="VerifyReadyDlgRemoveText" -->Click Remove to remove [ProductName] from your computer. Click Back to review or change any of your installation settings. Click Cancel to exit the wizard.</String>
238 <String Id="VerifyReadyDlgRemoveTitle" Overridable="yes"><!-- _locID_text="VerifyReadyDlgRemoveTitle" _locComment="VerifyReadyDlgRemoveTitle" -->{\WixUI_Font_Title}Ready to remove [ProductName]</String>
239 <String Id="VerifyReadyDlgUpdate" Overridable="yes"><!-- _locID_text="VerifyReadyDlgUpdate" _locComment="VerifyReadyDlgUpdate" -->&amp;Update</String>
240 <String Id="VerifyReadyDlgUpdateText" Overridable="yes"><!-- _locID_text="VerifyReadyDlgUpdateText" _locComment="VerifyReadyDlgUpdateText" -->Click Update to update [ProductName] from your computer. Click Back to review or change any of your installation settings. Click Cancel to exit the wizard.</String>
241 <String Id="VerifyReadyDlgUpdateTitle" Overridable="yes"><!-- _locID_text="VerifyReadyDlgUpdateTitle" _locComment="VerifyReadyDlgUpdateTitle" -->{\WixUI_Font_Title}Ready to update [ProductName]</String>
242
243 <String Id="WaitForCostingDlg_Title" Overridable="yes"><!-- _locID_text="WaitForCostingDlg_Title" _locComment="WaitForCostingDlg_Title" -->[ProductName] Setup</String>
244 <String Id="WaitForCostingDlgReturn" Overridable="yes"><!-- _locID_text="WaitForCostingDlgReturn" _locComment="WaitForCostingDlgReturn" -->&amp;Return</String>
245 <String Id="WaitForCostingDlgText" Overridable="yes"><!-- _locID_text="WaitForCostingDlgText" _locComment="WaitForCostingDlgText" -->Please wait while the installer finishes determining your disk space requirements.</String>
246 <String Id="WaitForCostingDlgIcon" Overridable="yes"><!-- _locID_text="WaitForCostingDlgIcon" _locComment="WaitForCostingDlgIcon" -->WixUI_Ico_Exclam</String>
247 <String Id="WaitForCostingDlgIconTooltip" Overridable="yes"><!-- _locID_text="WaitForCostingDlgIconTooltip" _locComment="WaitForCostingDlgIconTooltip" -->Exclamation icon</String>
248
249 <String Id="WelcomeDlg_Title" Overridable="yes"><!-- _locID_text="WelcomeDlg_Title" _locComment="WelcomeDlg_Title" -->[ProductName] Setup</String>
250 <String Id="WelcomeDlgBitmap" Overridable="yes"><!-- _locID_text="WelcomeDlgBitmap" _locComment="WelcomeDlgBitmap" -->WixUI_Bmp_Dialog</String>
251 <String Id="WelcomeDlgDescription" Overridable="yes"><!-- _locID_text="WelcomeDlgDescription" _locComment="WelcomeDlgDescription" -->The Setup Wizard will install [ProductName] on your computer. Click Next to continue or Cancel to exit the Setup Wizard.</String>
252 <String Id="WelcomeUpdateDlgDescriptionUpdate" Overridable="yes"><!-- _locID_text="WelcomeUpdateDlgDescriptionUpdate" _locComment="WelcomeUpdateDlgDescriptionUpdate" -->The Setup Wizard will update [ProductName] on your computer. Click Next to continue or Cancel to exit the Setup Wizard.</String>
253 <String Id="WelcomeDlgTitle" Overridable="yes"><!-- _locID_text="WelcomeDlgTitle" _locComment="WelcomeDlgTitle" -->{\WixUI_Font_Bigger}Welcome to the [ProductName] Setup Wizard</String>
254
255 <String Id="WelcomeEulaDlg_Title" Overridable="yes"><!-- _locID_text="WelcomeEulaDlg_Title" _locComment="WelcomeEulaDlg_Title" -->[ProductName] Setup</String>
256 <String Id="WelcomeEulaDlgBitmap" Overridable="yes"><!-- _locID_text="WelcomeEulaDlgBitmap" _locComment="WelcomeEulaDlgBitmap" -->WixUI_Bmp_Dialog</String>
257 <String Id="WelcomeEulaDlgLicenseAcceptedCheckBox" Overridable="yes"><!-- _locID_text="WelcomeEulaDlgLicenseAcceptedCheckBox" _locComment="WelcomeEulaDlgLicenseAcceptedCheckBox" -->I &amp;accept the terms in the License Agreement</String>
258 <String Id="WelcomeEulaDlgInstall" Overridable="yes"><!-- _locID_text="WelcomeEulaDlgInstall" _locComment="WelcomeEulaDlgInstall" -->&amp;Install</String>
259 <String Id="WelcomeEulaDlgUpdate" Overridable="yes"><!-- _locID_text="WelcomeEulaDlgUpdate" _locComment="WelcomeEulaDlgUpdate" -->&amp;Update</String>
260 <String Id="WelcomeEulaDlgTitle" Overridable="yes"><!-- _locID_text="WelcomeEulaDlgTitle" _locComment="WelcomeEulaDlgTitle" -->{\WixUI_Font_Title}Please read the [ProductName] License Agreement</String>
261
262 <String Id="ProgressTextInstallValidate" Overridable="yes"><!-- _locID_text="ProgressTextInstallValidate" _locComment="ProgressTextInstallValidate" -->Validating install</String>
263 <String Id="ProgressTextInstallFiles" Overridable="yes"><!-- _locID_text="ProgressTextInstallFiles" _locComment="ProgressTextInstallFiles" -->Copying new files</String>
264 <String Id="ProgressTextInstallFilesTemplate" Overridable="yes"><!-- _locID_text="ProgressTextInstallFilesTemplate" _locComment="ProgressTextInstallFilesTemplate" -->File: [1], Directory: [9], Size: [6]</String>
265 <String Id="ProgressTextInstallAdminPackage" Overridable="yes"><!-- _locID_text="ProgressTextInstallAdminPackage" _locComment="ProgressTextInstallAdminPackage" -->Copying network install files</String>
266 <String Id="ProgressTextInstallAdminPackageTemplate" Overridable="yes"><!-- _locID_text="ProgressTextInstallAdminPackageTemplate" _locComment="ProgressTextInstallAdminPackageTemplate" -->File: [1], Directory: [9], Size: [6]</String>
267 <String Id="ProgressTextFileCost" Overridable="yes"><!-- _locID_text="ProgressTextFileCost" _locComment="ProgressTextFileCost" -->Computing space requirements</String>
268 <String Id="ProgressTextCostInitialize" Overridable="yes"><!-- _locID_text="ProgressTextCostInitialize" _locComment="ProgressTextCostInitialize" -->Computing space requirements</String>
269 <String Id="ProgressTextCostFinalize" Overridable="yes"><!-- _locID_text="ProgressTextCostFinalize" _locComment="ProgressTextCostFinalize" -->Computing space requirements</String>
270 <String Id="ProgressTextCreateShortcuts" Overridable="yes"><!-- _locID_text="ProgressTextCreateShortcuts" _locComment="ProgressTextCreateShortcuts" -->Creating shortcuts</String>
271 <String Id="ProgressTextCreateShortcutsTemplate" Overridable="yes"><!-- _locID_text="ProgressTextCreateShortcutsTemplate" _locComment="ProgressTextCreateShortcutsTemplate" -->Shortcut: [1]</String>
272 <String Id="ProgressTextPublishComponents" Overridable="yes"><!-- _locID_text="ProgressTextPublishComponents" _locComment="ProgressTextPublishComponents" -->Publishing Qualified Components</String>
273 <String Id="ProgressTextPublishComponentsTemplate" Overridable="yes"><!-- _locID_text="ProgressTextPublishComponentsTemplate" _locComment="ProgressTextPublishComponentsTemplate" -->Component ID: [1], Qualifier: [2]</String>
274 <String Id="ProgressTextPublishFeatures" Overridable="yes"><!-- _locID_text="ProgressTextPublishFeatures" _locComment="ProgressTextPublishFeatures" -->Publishing Product Features</String>
275 <String Id="ProgressTextPublishFeaturesTemplate" Overridable="yes"><!-- _locID_text="ProgressTextPublishFeaturesTemplate" _locComment="ProgressTextPublishFeaturesTemplate" -->Feature: [1]</String>
276 <String Id="ProgressTextPublishProduct" Overridable="yes"><!-- _locID_text="ProgressTextPublishProduct" _locComment="ProgressTextPublishProduct" -->Publishing product information</String>
277 <String Id="ProgressTextRegisterClassInfo" Overridable="yes"><!-- _locID_text="ProgressTextRegisterClassInfo" _locComment="ProgressTextRegisterClassInfo" -->Registering Class servers</String>
278 <String Id="ProgressTextRegisterClassInfoTemplate" Overridable="yes"><!-- _locID_text="ProgressTextRegisterClassInfoTemplate" _locComment="ProgressTextRegisterClassInfoTemplate" -->Class Id: [1]</String>
279 <String Id="ProgressTextRegisterExtensionInfo" Overridable="yes"><!-- _locID_text="ProgressTextRegisterExtensionInfo" _locComment="ProgressTextRegisterExtensionInfo" -->Registering extension servers</String>
280 <String Id="ProgressTextRegisterExtensionInfoTemplate" Overridable="yes"><!-- _locID_text="ProgressTextRegisterExtensionInfoTemplate" _locComment="ProgressTextRegisterExtensionInfoTemplate" -->Extension: [1]</String>
281 <String Id="ProgressTextRegisterMIMEInfo" Overridable="yes"><!-- _locID_text="ProgressTextRegisterMIMEInfo" _locComment="ProgressTextRegisterMIMEInfo" -->Registering MIME info</String>
282 <String Id="ProgressTextRegisterMIMEInfoTemplate" Overridable="yes"><!-- _locID_text="ProgressTextRegisterMIMEInfoTemplate" _locComment="ProgressTextRegisterMIMEInfoTemplate" -->MIME Content Type: [1], Extension: [2]</String>
283 <String Id="ProgressTextRegisterProgIdInfo" Overridable="yes"><!-- _locID_text="ProgressTextRegisterProgIdInfo" _locComment="ProgressTextRegisterProgIdInfo" -->Registering program identifiers</String>
284 <String Id="ProgressTextRegisterProgIdInfoTemplate" Overridable="yes"><!-- _locID_text="ProgressTextRegisterProgIdInfoTemplate" _locComment="ProgressTextRegisterProgIdInfoTemplate" -->ProgId: [1]</String>
285 <String Id="ProgressTextAllocateRegistrySpace" Overridable="yes"><!-- _locID_text="ProgressTextAllocateRegistrySpace" _locComment="ProgressTextAllocateRegistrySpace" -->Allocating registry space</String>
286 <String Id="ProgressTextAllocateRegistrySpaceTemplate" Overridable="yes"><!-- _locID_text="ProgressTextAllocateRegistrySpaceTemplate" _locComment="ProgressTextAllocateRegistrySpaceTemplate" -->Free space: [1]</String>
287 <String Id="ProgressTextAppSearch" Overridable="yes"><!-- _locID_text="ProgressTextAppSearch" _locComment="ProgressTextAppSearch" -->Searching for installed applications</String>
288 <String Id="ProgressTextAppSearchTemplate" Overridable="yes"><!-- _locID_text="ProgressTextAppSearchTemplate" _locComment="ProgressTextAppSearchTemplate" -->Property: [1], Signature: [2]</String>
289 <String Id="ProgressTextBindImage" Overridable="yes"><!-- _locID_text="ProgressTextBindImage" _locComment="ProgressTextBindImage" -->Binding executables</String>
290 <String Id="ProgressTextBindImageTemplate" Overridable="yes"><!-- _locID_text="ProgressTextBindImageTemplate" _locComment="ProgressTextBindImageTemplate" -->File: [1]</String>
291 <String Id="ProgressTextCCPSearch" Overridable="yes"><!-- _locID_text="ProgressTextCCPSearch" _locComment="ProgressTextCCPSearch" -->Searching for qualifying products</String>
292 <String Id="ProgressTextCreateFolders" Overridable="yes"><!-- _locID_text="ProgressTextCreateFolders" _locComment="ProgressTextCreateFolders" -->Creating folders</String>
293 <String Id="ProgressTextCreateFoldersTemplate" Overridable="yes"><!-- _locID_text="ProgressTextCreateFoldersTemplate" _locComment="ProgressTextCreateFoldersTemplate" -->Folder: [1]</String>
294 <String Id="ProgressTextDeleteServices" Overridable="yes"><!-- _locID_text="ProgressTextDeleteServices" _locComment="ProgressTextDeleteServices" -->Deleting services</String>
295 <String Id="ProgressTextDeleteServicesTemplate" Overridable="yes"><!-- _locID_text="ProgressTextDeleteServicesTemplate" _locComment="ProgressTextDeleteServicesTemplate" -->Service: [1]</String>
296 <String Id="ProgressTextDuplicateFiles" Overridable="yes"><!-- _locID_text="ProgressTextDuplicateFiles" _locComment="ProgressTextDuplicateFiles" -->Creating duplicate files</String>
297 <String Id="ProgressTextDuplicateFilesTemplate" Overridable="yes"><!-- _locID_text="ProgressTextDuplicateFilesTemplate" _locComment="ProgressTextDuplicateFilesTemplate" -->File: [1], Directory: [9], Size: [6]</String>
298 <String Id="ProgressTextFindRelatedProducts" Overridable="yes"><!-- _locID_text="ProgressTextFindRelatedProducts" _locComment="ProgressTextFindRelatedProducts" -->Searching for related applications</String>
299 <String Id="ProgressTextFindRelatedProductsTemplate" Overridable="yes"><!-- _locID_text="ProgressTextFindRelatedProductsTemplate" _locComment="ProgressTextFindRelatedProductsTemplate" -->Found application: [1]</String>
300 <String Id="ProgressTextInstallODBC" Overridable="yes"><!-- _locID_text="ProgressTextInstallODBC" _locComment="ProgressTextInstallODBC" -->Installing ODBC components</String>
301 <String Id="ProgressTextInstallServices" Overridable="yes"><!-- _locID_text="ProgressTextInstallServices" _locComment="ProgressTextInstallServices" -->Installing new services</String>
302 <String Id="ProgressTextInstallServicesTemplate" Overridable="yes"><!-- _locID_text="ProgressTextInstallServicesTemplate" _locComment="ProgressTextInstallServicesTemplate" -->Service: [2]</String>
303 <String Id="ProgressTextLaunchConditions" Overridable="yes"><!-- _locID_text="ProgressTextLaunchConditions" _locComment="ProgressTextLaunchConditions" -->Evaluating launch conditions</String>
304 <String Id="ProgressTextMigrateFeatureStates" Overridable="yes"><!-- _locID_text="ProgressTextMigrateFeatureStates" _locComment="ProgressTextMigrateFeatureStates" -->Migrating feature states from related applications</String>
305 <String Id="ProgressTextMigrateFeatureStatesTemplate" Overridable="yes"><!-- _locID_text="ProgressTextMigrateFeatureStatesTemplate" _locComment="ProgressTextMigrateFeatureStatesTemplate" -->Application: [1]</String>
306 <String Id="ProgressTextMoveFiles" Overridable="yes"><!-- _locID_text="ProgressTextMoveFiles" _locComment="ProgressTextMoveFiles" -->Moving files</String>
307 <String Id="ProgressTextMoveFilesTemplate" Overridable="yes"><!-- _locID_text="ProgressTextMoveFilesTemplate" _locComment="ProgressTextMoveFilesTemplate" -->File: [1], Directory: [9], Size: [6]</String>
308 <String Id="ProgressTextPatchFiles" Overridable="yes"><!-- _locID_text="ProgressTextPatchFiles" _locComment="ProgressTextPatchFiles" -->Patching files</String>
309 <String Id="ProgressTextPatchFilesTemplate" Overridable="yes"><!-- _locID_text="ProgressTextPatchFilesTemplate" _locComment="ProgressTextPatchFilesTemplate" -->File: [1], Directory: [2], Size: [3]</String>
310 <String Id="ProgressTextProcessComponents" Overridable="yes"><!-- _locID_text="ProgressTextProcessComponents" _locComment="ProgressTextProcessComponents" -->Updating component registration</String>
311 <String Id="ProgressTextRegisterComPlus" Overridable="yes"><!-- _locID_text="ProgressTextRegisterComPlus" _locComment="ProgressTextRegisterComPlus" -->Registering COM+ Applications and Components</String>
312 <String Id="ProgressTextRegisterComPlusTemplate" Overridable="yes"><!-- _locID_text="ProgressTextRegisterComPlusTemplate" _locComment="ProgressTextRegisterComPlusTemplate" -->AppId: [1]{{, AppType: [2], Users: [3], RSN: [4]}}</String>
313 <String Id="ProgressTextRegisterFonts" Overridable="yes"><!-- _locID_text="ProgressTextRegisterFonts" _locComment="ProgressTextRegisterFonts" -->Registering fonts</String>
314 <String Id="ProgressTextRegisterFontsTemplate" Overridable="yes"><!-- _locID_text="ProgressTextRegisterFontsTemplate" _locComment="ProgressTextRegisterFontsTemplate" -->Font: [1]</String>
315 <String Id="ProgressTextRegisterProduct" Overridable="yes"><!-- _locID_text="ProgressTextRegisterProduct" _locComment="ProgressTextRegisterProduct" -->Registering product</String>
316 <String Id="ProgressTextRegisterProductTemplate" Overridable="yes"><!-- _locID_text="ProgressTextRegisterProductTemplate" _locComment="ProgressTextRegisterProductTemplate" -->[1]</String>
317 <String Id="ProgressTextRegisterTypeLibraries" Overridable="yes"><!-- _locID_text="ProgressTextRegisterTypeLibraries" _locComment="ProgressTextRegisterTypeLibraries" -->Registering type libraries</String>
318 <String Id="ProgressTextRegisterTypeLibrariesTemplate" Overridable="yes"><!-- _locID_text="ProgressTextRegisterTypeLibrariesTemplate" _locComment="ProgressTextRegisterTypeLibrariesTemplate" -->LibID: [1]</String>
319 <String Id="ProgressTextRegisterUser" Overridable="yes"><!-- _locID_text="ProgressTextRegisterUser" _locComment="ProgressTextRegisterUser" -->Registering user</String>
320 <String Id="ProgressTextRegisterUserTemplate" Overridable="yes"><!-- _locID_text="ProgressTextRegisterUserTemplate" _locComment="ProgressTextRegisterUserTemplate" -->[1]</String>
321 <String Id="ProgressTextRemoveDuplicateFiles" Overridable="yes"><!-- _locID_text="ProgressTextRemoveDuplicateFiles" _locComment="ProgressTextRemoveDuplicateFiles" -->Removing duplicated files</String>
322 <String Id="ProgressTextRemoveDuplicateFilesTemplate" Overridable="yes"><!-- _locID_text="ProgressTextRemoveDuplicateFilesTemplate" _locComment="ProgressTextRemoveDuplicateFilesTemplate" -->File: [1], Directory: [9]</String>
323 <String Id="ProgressTextRemoveEnvironmentStrings" Overridable="yes"><!-- _locID_text="ProgressTextRemoveEnvironmentStrings" _locComment="ProgressTextRemoveEnvironmentStrings" -->Updating environment strings</String>
324 <String Id="ProgressTextRemoveEnvironmentStringsTemplate" Overridable="yes"><!-- _locID_text="ProgressTextRemoveEnvironmentStringsTemplate" _locComment="ProgressTextRemoveEnvironmentStringsTemplate" -->Name: [1], Value: [2], Action [3]</String>
325 <String Id="ProgressTextRemoveExistingProducts" Overridable="yes"><!-- _locID_text="ProgressTextRemoveExistingProducts" _locComment="ProgressTextRemoveExistingProducts" -->Removing applications</String>
326 <String Id="ProgressTextRemoveExistingProductsTemplate" Overridable="yes"><!-- _locID_text="ProgressTextRemoveExistingProductsTemplate" _locComment="ProgressTextRemoveExistingProductsTemplate" -->Application: [1], Command line: [2]</String>
327 <String Id="ProgressTextRemoveFiles" Overridable="yes"><!-- _locID_text="ProgressTextRemoveFiles" _locComment="ProgressTextRemoveFiles" -->Removing files</String>
328 <String Id="ProgressTextRemoveFilesTemplate" Overridable="yes"><!-- _locID_text="ProgressTextRemoveFilesTemplate" _locComment="ProgressTextRemoveFilesTemplate" -->File: [1], Directory: [9]</String>
329 <String Id="ProgressTextRemoveFolders" Overridable="yes"><!-- _locID_text="ProgressTextRemoveFolders" _locComment="ProgressTextRemoveFolders" -->Removing folders</String>
330 <String Id="ProgressTextRemoveFoldersTemplate" Overridable="yes"><!-- _locID_text="ProgressTextRemoveFoldersTemplate" _locComment="ProgressTextRemoveFoldersTemplate" -->Folder: [1]</String>
331 <String Id="ProgressTextRemoveIniValues" Overridable="yes"><!-- _locID_text="ProgressTextRemoveIniValues" _locComment="ProgressTextRemoveIniValues" -->Removing INI files entries</String>
332 <String Id="ProgressTextRemoveIniValuesTemplate" Overridable="yes"><!-- _locID_text="ProgressTextRemoveIniValuesTemplate" _locComment="ProgressTextRemoveIniValuesTemplate" -->File: [1], Section: [2], Key: [3], Value: [4]</String>
333 <String Id="ProgressTextRemoveODBC" Overridable="yes"><!-- _locID_text="ProgressTextRemoveODBC" _locComment="ProgressTextRemoveODBC" -->Removing ODBC components</String>
334 <String Id="ProgressTextRemoveRegistryValues" Overridable="yes"><!-- _locID_text="ProgressTextRemoveRegistryValues" _locComment="ProgressTextRemoveRegistryValues" -->Removing system registry values</String>
335 <String Id="ProgressTextRemoveRegistryValuesTemplate" Overridable="yes"><!-- _locID_text="ProgressTextRemoveRegistryValuesTemplate" _locComment="ProgressTextRemoveRegistryValuesTemplate" -->Key: [1], Name: [2]</String>
336 <String Id="ProgressTextRemoveShortcuts" Overridable="yes"><!-- _locID_text="ProgressTextRemoveShortcuts" _locComment="ProgressTextRemoveShortcuts" -->Removing shortcuts</String>
337 <String Id="ProgressTextRemoveShortcutsTemplate" Overridable="yes"><!-- _locID_text="ProgressTextRemoveShortcutsTemplate" _locComment="ProgressTextRemoveShortcutsTemplate" -->Shortcut: [1]</String>
338 <String Id="ProgressTextRMCCPSearch" Overridable="yes"><!-- _locID_text="ProgressTextRMCCPSearch" _locComment="ProgressTextRMCCPSearch" -->Searching for qualifying products</String>
339 <String Id="ProgressTextSelfRegModules" Overridable="yes"><!-- _locID_text="ProgressTextSelfRegModules" _locComment="ProgressTextSelfRegModules" -->Registering modules</String>
340 <String Id="ProgressTextSelfRegModulesTemplate" Overridable="yes"><!-- _locID_text="ProgressTextSelfRegModulesTemplate" _locComment="ProgressTextSelfRegModulesTemplate" -->File: [1], Folder: [2]</String>
341 <String Id="ProgressTextSelfUnregModules" Overridable="yes"><!-- _locID_text="ProgressTextSelfUnregModules" _locComment="ProgressTextSelfUnregModules" -->Unregistering modules</String>
342 <String Id="ProgressTextSelfUnregModulesTemplate" Overridable="yes"><!-- _locID_text="ProgressTextSelfUnregModulesTemplate" _locComment="ProgressTextSelfUnregModulesTemplate" -->File: [1], Folder: [2]</String>
343 <String Id="ProgressTextSetODBCFolders" Overridable="yes"><!-- _locID_text="ProgressTextSetODBCFolders" _locComment="ProgressTextSetODBCFolders" -->Initializing ODBC directories</String>
344 <String Id="ProgressTextStartServices" Overridable="yes"><!-- _locID_text="ProgressTextStartServices" _locComment="ProgressTextStartServices" -->Starting services</String>
345 <String Id="ProgressTextStartServicesTemplate" Overridable="yes"><!-- _locID_text="ProgressTextStartServicesTemplate" _locComment="ProgressTextStartServicesTemplate" -->Service: [1]</String>
346 <String Id="ProgressTextStopServices" Overridable="yes"><!-- _locID_text="ProgressTextStopServices" _locComment="ProgressTextStopServices" -->Stopping services</String>
347 <String Id="ProgressTextStopServicesTemplate" Overridable="yes"><!-- _locID_text="ProgressTextStopServicesTemplate" _locComment="ProgressTextStopServicesTemplate" -->Service: [1]</String>
348 <String Id="ProgressTextUnpublishComponents" Overridable="yes"><!-- _locID_text="ProgressTextUnpublishComponents" _locComment="ProgressTextUnpublishComponents" -->Unpublishing Qualified Components</String>
349 <String Id="ProgressTextUnpublishComponentsTemplate" Overridable="yes"><!-- _locID_text="ProgressTextUnpublishComponentsTemplate" _locComment="ProgressTextUnpublishComponentsTemplate" -->Component ID: [1], Qualifier: [2]</String>
350 <String Id="ProgressTextUnpublishFeatures" Overridable="yes"><!-- _locID_text="ProgressTextUnpublishFeatures" _locComment="ProgressTextUnpublishFeatures" -->Unpublishing Product Features</String>
351 <String Id="ProgressTextUnpublishFeaturesTemplate" Overridable="yes"><!-- _locID_text="ProgressTextUnpublishFeaturesTemplate" _locComment="ProgressTextUnpublishFeaturesTemplate" -->Feature: [1]</String>
352 <String Id="ProgressTextUnregisterClassInfo" Overridable="yes"><!-- _locID_text="ProgressTextUnregisterClassInfo" _locComment="ProgressTextUnregisterClassInfo" -->Unregister Class servers</String>
353 <String Id="ProgressTextUnregisterClassInfoTemplate" Overridable="yes"><!-- _locID_text="ProgressTextUnregisterClassInfoTemplate" _locComment="ProgressTextUnregisterClassInfoTemplate" -->Class Id: [1]</String>
354 <String Id="ProgressTextUnregisterComPlus" Overridable="yes"><!-- _locID_text="ProgressTextUnregisterComPlus" _locComment="ProgressTextUnregisterComPlus" -->Unregistering COM+ Applications and Components</String>
355 <String Id="ProgressTextUnregisterComPlusTemplate" Overridable="yes"><!-- _locID_text="ProgressTextUnregisterComPlusTemplate" _locComment="ProgressTextUnregisterComPlusTemplate" -->AppId: [1]{{, AppType: [2]}}</String>
356 <String Id="ProgressTextUnregisterExtensionInfo" Overridable="yes"><!-- _locID_text="ProgressTextUnregisterExtensionInfo" _locComment="ProgressTextUnregisterExtensionInfo" -->Unregistering extension servers</String>
357 <String Id="ProgressTextUnregisterExtensionInfoTemplate" Overridable="yes"><!-- _locID_text="ProgressTextUnregisterExtensionInfoTemplate" _locComment="ProgressTextUnregisterExtensionInfoTemplate" -->Extension: [1]</String>
358 <String Id="ProgressTextUnregisterFonts" Overridable="yes"><!-- _locID_text="ProgressTextUnregisterFonts" _locComment="ProgressTextUnregisterFonts" -->Unregistering fonts</String>
359 <String Id="ProgressTextUnregisterFontsTemplate" Overridable="yes"><!-- _locID_text="ProgressTextUnregisterFontsTemplate" _locComment="ProgressTextUnregisterFontsTemplate" -->Font: [1]</String>
360 <String Id="ProgressTextUnregisterMIMEInfo" Overridable="yes"><!-- _locID_text="ProgressTextUnregisterMIMEInfo" _locComment="ProgressTextUnregisterMIMEInfo" -->Unregistering MIME info</String>
361 <String Id="ProgressTextUnregisterMIMEInfoTemplate" Overridable="yes"><!-- _locID_text="ProgressTextUnregisterMIMEInfoTemplate" _locComment="ProgressTextUnregisterMIMEInfoTemplate" -->MIME Content Type: [1], Extension: [2]</String>
362 <String Id="ProgressTextUnregisterProgIdInfo" Overridable="yes"><!-- _locID_text="ProgressTextUnregisterProgIdInfo" _locComment="ProgressTextUnregisterProgIdInfo" -->Unregistering program identifiers</String>
363 <String Id="ProgressTextUnregisterProgIdInfoTemplate" Overridable="yes"><!-- _locID_text="ProgressTextUnregisterProgIdInfoTemplate" _locComment="ProgressTextUnregisterProgIdInfoTemplate" -->ProgId: [1]</String>
364 <String Id="ProgressTextUnregisterTypeLibraries" Overridable="yes"><!-- _locID_text="ProgressTextUnregisterTypeLibraries" _locComment="ProgressTextUnregisterTypeLibraries" -->Unregistering type libraries</String>
365 <String Id="ProgressTextUnregisterTypeLibrariesTemplate" Overridable="yes"><!-- _locID_text="ProgressTextUnregisterTypeLibrariesTemplate" _locComment="ProgressTextUnregisterTypeLibrariesTemplate" -->LibID: [1]</String>
366 <String Id="ProgressTextWriteEnvironmentStrings" Overridable="yes"><!-- _locID_text="ProgressTextWriteEnvironmentStrings" _locComment="ProgressTextWriteEnvironmentStrings" -->Updating environment strings</String>
367 <String Id="ProgressTextWriteEnvironmentStringsTemplate" Overridable="yes"><!-- _locID_text="ProgressTextWriteEnvironmentStringsTemplate" _locComment="ProgressTextWriteEnvironmentStringsTemplate" -->Name: [1], Value: [2], Action [3]</String>
368 <String Id="ProgressTextWriteIniValues" Overridable="yes"><!-- _locID_text="ProgressTextWriteIniValues" _locComment="ProgressTextWriteIniValues" -->Writing INI files values</String>
369 <String Id="ProgressTextWriteIniValuesTemplate" Overridable="yes"><!-- _locID_text="ProgressTextWriteIniValuesTemplate" _locComment="ProgressTextWriteIniValuesTemplate" -->File: [1], Section: [2], Key: [3], Value: [4]</String>
370 <String Id="ProgressTextWriteRegistryValues" Overridable="yes"><!-- _locID_text="ProgressTextWriteRegistryValues" _locComment="ProgressTextWriteRegistryValues" -->Writing system registry values</String>
371 <String Id="ProgressTextWriteRegistryValuesTemplate" Overridable="yes"><!-- _locID_text="ProgressTextWriteRegistryValuesTemplate" _locComment="ProgressTextWriteRegistryValuesTemplate" -->Key: [1], Name: [2], Value: [3]</String>
372 <String Id="ProgressTextAdvertise" Overridable="yes"><!-- _locID_text="ProgressTextAdvertise" _locComment="ProgressTextAdvertise" -->Advertising application</String>
373 <String Id="ProgressTextGenerateScript" Overridable="yes"><!-- _locID_text="ProgressTextGenerateScript" _locComment="ProgressTextGenerateScript" -->Generating script operations for action:</String>
374 <String Id="ProgressTextGenerateScriptTemplate" Overridable="yes"><!-- _locID_text="ProgressTextGenerateScriptTemplate" _locComment="ProgressTextGenerateScriptTemplate" -->[1]</String>
375 <String Id="ProgressTextInstallSFPCatalogFile" Overridable="yes"><!-- _locID_text="ProgressTextInstallSFPCatalogFile" _locComment="ProgressTextInstallSFPCatalogFile" -->Installing system catalog</String>
376 <String Id="ProgressTextInstallSFPCatalogFileTemplate" Overridable="yes"><!-- _locID_text="ProgressTextInstallSFPCatalogFileTemplate" _locComment="ProgressTextInstallSFPCatalogFileTemplate" -->File: [1], Dependencies: [2]</String>
377 <String Id="ProgressTextMsiPublishAssemblies" Overridable="yes"><!-- _locID_text="ProgressTextMsiPublishAssemblies" _locComment="ProgressTextMsiPublishAssemblies" -->Publishing assembly information</String>
378 <String Id="ProgressTextMsiPublishAssembliesTemplate" Overridable="yes"><!-- _locID_text="ProgressTextMsiPublishAssembliesTemplate" _locComment="ProgressTextMsiPublishAssembliesTemplate" -->Application Context:[1], Assembly Name:[2]</String>
379 <String Id="ProgressTextMsiUnpublishAssemblies" Overridable="yes"><!-- _locID_text="ProgressTextMsiUnpublishAssemblies" _locComment="ProgressTextMsiUnpublishAssemblies" -->Unpublishing assembly information</String>
380 <String Id="ProgressTextMsiUnpublishAssembliesTemplate" Overridable="yes"><!-- _locID_text="ProgressTextMsiUnpublishAssembliesTemplate" _locComment="ProgressTextMsiUnpublishAssembliesTemplate" -->Application Context:[1], Assembly Name:[2]</String>
381 <String Id="ProgressTextRollback" Overridable="yes"><!-- _locID_text="ProgressTextRollback" _locComment="ProgressTextRollback" -->Rolling back action:</String>
382 <String Id="ProgressTextRollbackTemplate" Overridable="yes"><!-- _locID_text="ProgressTextRollbackTemplate" _locComment="ProgressTextRollbackTemplate" -->[1]</String>
383 <String Id="ProgressTextRollbackCleanup" Overridable="yes"><!-- _locID_text="ProgressTextRollbackCleanup" _locComment="ProgressTextRollbackCleanup" -->Removing backup files</String>
384 <String Id="ProgressTextRollbackCleanupTemplate" Overridable="yes"><!-- _locID_text="ProgressTextRollbackCleanupTemplate" _locComment="ProgressTextRollbackCleanupTemplate" -->File: [1]</String>
385 <String Id="ProgressTextUnmoveFiles" Overridable="yes"><!-- _locID_text="ProgressTextUnmoveFiles" _locComment="ProgressTextUnmoveFiles" -->Removing moved files</String>
386 <String Id="ProgressTextUnmoveFilesTemplate" Overridable="yes"><!-- _locID_text="ProgressTextUnmoveFilesTemplate" _locComment="ProgressTextUnmoveFilesTemplate" -->File: [1], Directory: [9]</String>
387 <String Id="ProgressTextUnpublishProduct" Overridable="yes"><!-- _locID_text="ProgressTextUnpublishProduct" _locComment="ProgressTextUnpublishProduct" -->Unpublishing product information</String>
388
389 <String Id="Error0" Overridable="yes"><!-- _locID_text="Error0" _locComment="Error0" -->{{Fatal error: }}</String>
390 <String Id="Error1" Overridable="yes"><!-- _locID_text="Error1" _locComment="Error1" -->{{Error [1]. }}</String>
391 <String Id="Error2" Overridable="yes"><!-- _locID_text="Error2" _locComment="Error2" -->Warning [1]. </String>
392 <String Id="Error4" Overridable="yes"><!-- _locID_text="Error4" _locComment="Error4" -->Info [1]. </String>
393 <String Id="Error5" Overridable="yes"><!-- _locID_text="Error5" _locComment="Error5" -->The installer has encountered an unexpected error installing this package. This may indicate a problem with this package. The error code is [1]. {{The arguments are: [2], [3], [4]}}</String>
394 <String Id="Error7" Overridable="yes"><!-- _locID_text="Error7" _locComment="Error7" -->{{Disk full: }}</String>
395 <String Id="Error8" Overridable="yes"><!-- _locID_text="Error8" _locComment="Error8" -->Action [Time]: [1]. [2]</String>
396 <String Id="Error9" Overridable="yes"><!-- _locID_text="Error9" _locComment="Error9" -->[ProductName]</String>
397 <String Id="Error10" Overridable="yes"><!-- _locID_text="Error10" _locComment="Error10" -->{[2]}{, [3]}{, [4]}</String>
398 <String Id="Error11" Overridable="yes"><!-- _locID_text="Error11" _locComment="Error11" -->Message type: [1], Argument: [2]</String>
399 <String Id="Error12" Overridable="yes"><!-- _locID_text="Error12" _locComment="Error12" -->=== Logging started: [Date] [Time] ===</String>
400 <String Id="Error13" Overridable="yes"><!-- _locID_text="Error13" _locComment="Error13" -->=== Logging stopped: [Date] [Time] ===</String>
401 <String Id="Error14" Overridable="yes"><!-- _locID_text="Error14" _locComment="Error14" -->Action start [Time]: [1].</String>
402 <String Id="Error15" Overridable="yes"><!-- _locID_text="Error15" _locComment="Error15" -->Action ended [Time]: [1]. Return value [2].</String>
403 <String Id="Error16" Overridable="yes"><!-- _locID_text="Error16" _locComment="Error16" -->Time remaining: {[1] minutes }{[2] seconds}</String>
404 <String Id="Error17" Overridable="yes"><!-- _locID_text="Error17" _locComment="Error17" -->Out of memory. Shut down other applications before retrying.</String>
405 <String Id="Error18" Overridable="yes"><!-- _locID_text="Error18" _locComment="Error18" -->Installer is no longer responding.</String>
406 <String Id="Error19" Overridable="yes"><!-- _locID_text="Error19" _locComment="Error19" -->Installer stopped prematurely.</String>
407 <String Id="Error20" Overridable="yes"><!-- _locID_text="Error20" _locComment="Error20" -->Please wait while Windows configures [ProductName]</String>
408 <String Id="Error21" Overridable="yes"><!-- _locID_text="Error21" _locComment="Error21" -->Gathering required information...</String>
409 <String Id="Error22" Overridable="yes"><!-- _locID_text="Error22" _locComment="Error22" -->Removing older versions of this application...</String>
410 <String Id="Error23" Overridable="yes"><!-- _locID_text="Error23" _locComment="Error23" -->Preparing to remove older versions of this application...</String>
411 <String Id="Error32" Overridable="yes"><!-- _locID_text="Error32" _locComment="Error32" -->{[ProductName] }Setup completed successfully.</String>
412 <String Id="Error33" Overridable="yes"><!-- _locID_text="Error33" _locComment="Error33" -->{[ProductName] }Setup failed.</String>
413 <String Id="Error1101" Overridable="yes"><!-- _locID_text="Error1101" _locComment="Error1101" -->Error reading from file: [2].{{ System error [3].}} Verify that the file exists and that you can access it.</String>
414 <String Id="Error1301" Overridable="yes"><!-- _locID_text="Error1301" _locComment="Error1301" -->Cannot create the file '[2]'. A directory with this name already exists. Cancel the install and try installing to a different location.</String>
415 <String Id="Error1302" Overridable="yes"><!-- _locID_text="Error1302" _locComment="Error1302" -->Please insert the disk: [2]</String>
416 <String Id="Error1303" Overridable="yes"><!-- _locID_text="Error1303" _locComment="Error1303" -->The installer has insufficient privileges to access this directory: [2]. The installation cannot continue. Log on as administrator or contact your system administrator.</String>
417 <String Id="Error1304" Overridable="yes"><!-- _locID_text="Error1304" _locComment="Error1304" -->Error writing to file: [2]. Verify that you have access to that directory.</String>
418 <String Id="Error1305" Overridable="yes"><!-- _locID_text="Error1305" _locComment="Error1305" -->Error reading from file [2].{{ System error [3].}} Verify that the file exists and that you can access it.</String>
419 <String Id="Error1306" Overridable="yes"><!-- _locID_text="Error1306" _locComment="Error1306" -->Another application has exclusive access to the file '[2]'. Please shut down all other applications, then click Retry.</String>
420 <String Id="Error1307" Overridable="yes"><!-- _locID_text="Error1307" _locComment="Error1307" -->There is not enough disk space to install this file: [2]. Free some disk space and click Retry, or click Cancel to exit.</String>
421 <String Id="Error1308" Overridable="yes"><!-- _locID_text="Error1308" _locComment="Error1308" -->Source file not found: [2]. Verify that the file exists and that you can access it.</String>
422 <String Id="Error1309" Overridable="yes"><!-- _locID_text="Error1309" _locComment="Error1309" -->Error reading from file: [3].{{ System error [2].}} Verify that the file exists and that you can access it.</String>
423 <String Id="Error1310" Overridable="yes"><!-- _locID_text="Error1310" _locComment="Error1310" -->Error writing to file: [3].{{ System error [2].}} Verify that you have access to that directory.</String>
424 <String Id="Error1311" Overridable="yes"><!-- _locID_text="Error1311" _locComment="Error1311" -->Source file not found{{(cabinet)}}: [2]. Verify that the file exists and that you can access it.</String>
425 <String Id="Error1312" Overridable="yes"><!-- _locID_text="Error1312" _locComment="Error1312" -->Cannot create the directory '[2]'. A file with this name already exists. Please rename or remove the file and click Retry, or click Cancel to exit.</String>
426 <String Id="Error1313" Overridable="yes"><!-- _locID_text="Error1313" _locComment="Error1313" -->The volume [2] is currently unavailable. Please select another.</String>
427 <String Id="Error1314" Overridable="yes"><!-- _locID_text="Error1314" _locComment="Error1314" -->The specified path '[2]' is unavailable.</String>
428 <String Id="Error1315" Overridable="yes"><!-- _locID_text="Error1315" _locComment="Error1315" -->Unable to write to the specified folder: [2].</String>
429 <String Id="Error1316" Overridable="yes"><!-- _locID_text="Error1316" _locComment="Error1316" -->A network error occurred while attempting to read from the file: [2]</String>
430 <String Id="Error1317" Overridable="yes"><!-- _locID_text="Error1317" _locComment="Error1317" -->An error occurred while attempting to create the directory: [2]</String>
431 <String Id="Error1318" Overridable="yes"><!-- _locID_text="Error1318" _locComment="Error1318" -->A network error occurred while attempting to create the directory: [2]</String>
432 <String Id="Error1319" Overridable="yes"><!-- _locID_text="Error1319" _locComment="Error1319" -->A network error occurred while attempting to open the source file cabinet: [2]</String>
433 <String Id="Error1320" Overridable="yes"><!-- _locID_text="Error1320" _locComment="Error1320" -->The specified path is too long: [2]</String>
434 <String Id="Error1321" Overridable="yes"><!-- _locID_text="Error1321" _locComment="Error1321" -->The Installer has insufficient privileges to modify this file: [2].</String>
435 <String Id="Error1322" Overridable="yes"><!-- _locID_text="Error1322" _locComment="Error1322" -->A portion of the folder path '[2]' is invalid. It is either empty or exceeds the length allowed by the system.</String>
436 <String Id="Error1323" Overridable="yes"><!-- _locID_text="Error1323" _locComment="Error1323" -->The folder path '[2]' contains words that are not valid in folder paths.</String>
437 <String Id="Error1324" Overridable="yes"><!-- _locID_text="Error1324" _locComment="Error1324" -->The folder path '[2]' contains an invalid character.</String>
438 <String Id="Error1325" Overridable="yes"><!-- _locID_text="Error1325" _locComment="Error1325" -->'[2]' is not a valid short file name.</String>
439 <String Id="Error1326" Overridable="yes"><!-- _locID_text="Error1326" _locComment="Error1326" -->Error getting file security: [3] GetLastError: [2]</String>
440 <String Id="Error1327" Overridable="yes"><!-- _locID_text="Error1327" _locComment="Error1327" -->Invalid Drive: [2]</String>
441 <String Id="Error1328" Overridable="yes"><!-- _locID_text="Error1328" _locComment="Error1328" -->Error applying patch to file [2]. It has probably been updated by other means, and can no longer be modified by this patch. For more information contact your patch vendor.{{ System Error: [3]}}</String>
442 <String Id="Error1329" Overridable="yes"><!-- _locID_text="Error1329" _locComment="Error1329" -->A file that is required cannot be installed because the cabinet file [2] is not digitally signed. This may indicate that the cabinet file is corrupt.</String>
443 <String Id="Error1330" Overridable="yes"><!-- _locID_text="Error1330" _locComment="Error1330" -->A file that is required cannot be installed because the cabinet file [2] has an invalid digital signature. This may indicate that the cabinet file is corrupt.{{ Error [3] was returned by WinVerifyTrust.}}</String>
444 <String Id="Error1331" Overridable="yes"><!-- _locID_text="Error1331" _locComment="Error1331" -->Failed to correctly copy [2] file: CRC error.</String>
445 <String Id="Error1332" Overridable="yes"><!-- _locID_text="Error1332" _locComment="Error1332" -->Failed to correctly move [2] file: CRC error.</String>
446 <String Id="Error1333" Overridable="yes"><!-- _locID_text="Error1333" _locComment="Error1333" -->Failed to correctly patch [2] file: CRC error.</String>
447 <String Id="Error1334" Overridable="yes"><!-- _locID_text="Error1334" _locComment="Error1334" -->The file '[2]' cannot be installed because the file cannot be found in cabinet file '[3]'. This could indicate a network error, an error reading from the CD-ROM, or a problem with this package.</String>
448 <String Id="Error1335" Overridable="yes"><!-- _locID_text="Error1335" _locComment="Error1335" -->The cabinet file '[2]' required for this installation is corrupt and cannot be used. This could indicate a network error, an error reading from the CD-ROM, or a problem with this package.</String>
449 <String Id="Error1336" Overridable="yes"><!-- _locID_text="Error1336" _locComment="Error1336" -->There was an error creating a temporary file that is needed to complete this installation.{{ Folder: [3]. System error code: [2]}}</String>
450 <String Id="Error1401" Overridable="yes"><!-- _locID_text="Error1401" _locComment="Error1401" -->Could not create key: [2].{{ System error [3].}} Verify that you have sufficient access to that key, or contact your support personnel. </String>
451 <String Id="Error1402" Overridable="yes"><!-- _locID_text="Error1402" _locComment="Error1402" -->Could not open key: [2].{{ System error [3].}} Verify that you have sufficient access to that key, or contact your support personnel. </String>
452 <String Id="Error1403" Overridable="yes"><!-- _locID_text="Error1403" _locComment="Error1403" -->Could not delete value [2] from key [3].{{ System error [4].}} Verify that you have sufficient access to that key, or contact your support personnel. </String>
453 <String Id="Error1404" Overridable="yes"><!-- _locID_text="Error1404" _locComment="Error1404" -->Could not delete key [2].{{ System error [3].}} Verify that you have sufficient access to that key, or contact your support personnel. </String>
454 <String Id="Error1405" Overridable="yes"><!-- _locID_text="Error1405" _locComment="Error1405" -->Could not read value [2] from key [3].{{ System error [4].}} Verify that you have sufficient access to that key, or contact your support personnel. </String>
455 <String Id="Error1406" Overridable="yes"><!-- _locID_text="Error1406" _locComment="Error1406" -->Could not write value [2] to key [3].{{ System error [4].}} Verify that you have sufficient access to that key, or contact your support personnel.</String>
456 <String Id="Error1407" Overridable="yes"><!-- _locID_text="Error1407" _locComment="Error1407" -->Could not get value names for key [2].{{ System error [3].}} Verify that you have sufficient access to that key, or contact your support personnel.</String>
457 <String Id="Error1408" Overridable="yes"><!-- _locID_text="Error1408" _locComment="Error1408" -->Could not get sub key names for key [2].{{ System error [3].}} Verify that you have sufficient access to that key, or contact your support personnel.</String>
458 <String Id="Error1409" Overridable="yes"><!-- _locID_text="Error1409" _locComment="Error1409" -->Could not read security information for key [2].{{ System error [3].}} Verify that you have sufficient access to that key, or contact your support personnel.</String>
459 <String Id="Error1410" Overridable="yes"><!-- _locID_text="Error1410" _locComment="Error1410" -->Could not increase the available registry space. [2] KB of free registry space is required for the installation of this application.</String>
460 <String Id="Error1500" Overridable="yes"><!-- _locID_text="Error1500" _locComment="Error1500" -->Another installation is in progress. You must complete that installation before continuing this one.</String>
461 <String Id="Error1501" Overridable="yes"><!-- _locID_text="Error1501" _locComment="Error1501" -->Error accessing secured data. Please make sure the Windows Installer is configured properly and try the install again.</String>
462 <String Id="Error1502" Overridable="yes"><!-- _locID_text="Error1502" _locComment="Error1502" -->User '[2]' has previously initiated an install for product '[3]'. That user will need to run that install again before they can use that product. Your current install will now continue.</String>
463 <String Id="Error1503" Overridable="yes"><!-- _locID_text="Error1503" _locComment="Error1503" -->User '[2]' has previously initiated an install for product '[3]'. That user will need to run that install again before they can use that product.</String>
464 <String Id="Error1601" Overridable="yes"><!-- _locID_text="Error1601" _locComment="Error1601" -->Out of disk space -- Volume: '[2]'; required space: [3] KB; available space: [4] KB. Free some disk space and retry.</String>
465 <String Id="Error1602" Overridable="yes"><!-- _locID_text="Error1602" _locComment="Error1602" -->Are you sure you want to cancel?</String>
466 <String Id="Error1603" Overridable="yes"><!-- _locID_text="Error1603" _locComment="Error1603" -->The file [2][3] is being held in use{ by the following process: Name: [4], Id: [5], Window Title: '[6]'}. Close that application and retry.</String>
467 <String Id="Error1604" Overridable="yes"><!-- _locID_text="Error1604" _locComment="Error1604" -->The product '[2]' is already installed, preventing the installation of this product. The two products are incompatible.</String>
468 <String Id="Error1605" Overridable="yes"><!-- _locID_text="Error1605" _locComment="Error1605" -->There is not enough disk space on the volume '[2]' to continue the install with recovery enabled. [3] KB are required, but only [4] KB are available. Click Ignore to continue the install without saving recovery information, click Retry to check for available space again, or click Cancel to quit the installation.</String>
469 <String Id="Error1606" Overridable="yes"><!-- _locID_text="Error1606" _locComment="Error1606" -->Could not access network location [2].</String>
470 <String Id="Error1607" Overridable="yes"><!-- _locID_text="Error1607" _locComment="Error1607" -->The following applications should be closed before continuing the install:</String>
471 <String Id="Error1608" Overridable="yes"><!-- _locID_text="Error1608" _locComment="Error1608" -->Could not find any previously installed compliant products on the machine for installing this product.</String>
472 <String Id="Error1609" Overridable="yes"><!-- _locID_text="Error1609" _locComment="Error1609" -->An error occurred while applying security settings. [2] is not a valid user or group. This could be a problem with the package, or a problem connecting to a domain controller on the network. Check your network connection and click Retry, or Cancel to end the install. {{Unable to locate the user's SID, system error [3]}}</String>
473 <String Id="Error1701" Overridable="yes"><!-- _locID_text="Error1701" _locComment="Error1701" -->The key [2] is not valid. Verify that you entered the correct key.</String>
474 <String Id="Error1702" Overridable="yes"><!-- _locID_text="Error1702" _locComment="Error1702" -->The installer must restart your system before configuration of [2] can continue. Click Yes to restart now or No if you plan to manually restart later.</String>
475 <String Id="Error1703" Overridable="yes"><!-- _locID_text="Error1703" _locComment="Error1703" -->You must restart your system for the configuration changes made to [2] to take effect. Click Yes to restart now or No if you plan to manually restart later.</String>
476 <String Id="Error1704" Overridable="yes"><!-- _locID_text="Error1704" _locComment="Error1704" -->An installation for [2] is currently suspended. You must undo the changes made by that installation to continue. Do you want to undo those changes?</String>
477 <String Id="Error1705" Overridable="yes"><!-- _locID_text="Error1705" _locComment="Error1705" -->A previous installation for this product is in progress. You must undo the changes made by that installation to continue. Do you want to undo those changes?</String>
478 <String Id="Error1706" Overridable="yes"><!-- _locID_text="Error1706" _locComment="Error1706" -->An installation package for the product [2] cannot be found. Try the installation again using a valid copy of the installation package '[3]'.</String>
479 <String Id="Error1707" Overridable="yes"><!-- _locID_text="Error1707" _locComment="Error1707" -->Installation completed successfully.</String>
480 <String Id="Error1708" Overridable="yes"><!-- _locID_text="Error1708" _locComment="Error1708" -->Installation failed.</String>
481 <String Id="Error1709" Overridable="yes"><!-- _locID_text="Error1709" _locComment="Error1709" -->Product: [2] -- [3]</String>
482 <String Id="Error1710" Overridable="yes"><!-- _locID_text="Error1710" _locComment="Error1710" -->You may either restore your computer to its previous state or continue the install later. Would you like to restore?</String>
483 <String Id="Error1711" Overridable="yes"><!-- _locID_text="Error1711" _locComment="Error1711" -->An error occurred while writing installation information to disk. Check to make sure enough disk space is available, and click Retry, or Cancel to end the install.</String>
484 <String Id="Error1712" Overridable="yes"><!-- _locID_text="Error1712" _locComment="Error1712" -->One or more of the files required to restore your computer to its previous state could not be found. Restoration will not be possible.</String>
485 <String Id="Error1713" Overridable="yes"><!-- _locID_text="Error1713" _locComment="Error1713" -->[2] cannot install one of its required products. Contact your technical support group.{{ System Error: [3].}}</String>
486 <String Id="Error1714" Overridable="yes"><!-- _locID_text="Error1714" _locComment="Error1714" -->The older version of [2] cannot be removed. Contact your technical support group.{{ System Error [3].}}</String>
487 <String Id="Error1715" Overridable="yes"><!-- _locID_text="Error1715" _locComment="Error1715" -->Installed [2]</String>
488 <String Id="Error1716" Overridable="yes"><!-- _locID_text="Error1716" _locComment="Error1716" -->Configured [2]</String>
489 <String Id="Error1717" Overridable="yes"><!-- _locID_text="Error1717" _locComment="Error1717" -->Removed [2]</String>
490 <String Id="Error1718" Overridable="yes"><!-- _locID_text="Error1718" _locComment="Error1718" -->File [2] was rejected by digital signature policy.</String>
491 <String Id="Error1719" Overridable="yes"><!-- _locID_text="Error1719" _locComment="Error1719" -->The Windows Installer Service could not be accessed. This can occur if you are running Windows in safe mode, or if the Windows Installer is not correctly installed. Contact your support personnel for assistance.</String>
492 <String Id="Error1720" Overridable="yes"><!-- _locID_text="Error1720" _locComment="Error1720" -->There is a problem with this Windows Installer package. A script required for this install to complete could not be run. Contact your support personnel or package vendor.{{ Custom action [2] script error [3], [4]: [5] Line [6], Column [7], [8]}}</String>
493 <String Id="Error1721" Overridable="yes"><!-- _locID_text="Error1721" _locComment="Error1721" -->There is a problem with this Windows Installer package. A program required for this install to complete could not be run. Contact your support personnel or package vendor.{{ Action: [2], location: [3], command: [4]}}</String>
494 <String Id="Error1722" Overridable="yes"><!-- _locID_text="Error1722" _locComment="Error1722" -->There is a problem with this Windows Installer package. A program run as part of the setup did not finish as expected. Contact your support personnel or package vendor.{{ Action [2], location: [3], command: [4]}}</String>
495 <String Id="Error1723" Overridable="yes"><!-- _locID_text="Error1723" _locComment="Error1723" -->There is a problem with this Windows Installer package. A DLL required for this install to complete could not be run. Contact your support personnel or package vendor.{{ Action [2], entry: [3], library: [4]}}</String>
496 <String Id="Error1724" Overridable="yes"><!-- _locID_text="Error1724" _locComment="Error1724" -->Removal completed successfully.</String>
497 <String Id="Error1725" Overridable="yes"><!-- _locID_text="Error1725" _locComment="Error1725" -->Removal failed.</String>
498 <String Id="Error1726" Overridable="yes"><!-- _locID_text="Error1726" _locComment="Error1726" -->Advertisement completed successfully.</String>
499 <String Id="Error1727" Overridable="yes"><!-- _locID_text="Error1727" _locComment="Error1727" -->Advertisement failed.</String>
500 <String Id="Error1728" Overridable="yes"><!-- _locID_text="Error1728" _locComment="Error1728" -->Configuration completed successfully.</String>
501 <String Id="Error1729" Overridable="yes"><!-- _locID_text="Error1729" _locComment="Error1729" -->Configuration failed.</String>
502 <String Id="Error1730" Overridable="yes"><!-- _locID_text="Error1730" _locComment="Error1730" -->You must be an Administrator to remove this application. To remove this application, you can log on as an Administrator, or contact your technical support group for assistance.</String>
503 <String Id="Error1731" Overridable="yes"><!-- _locID_text="Error1731" _locComment="Error1731" -->The source installation package for the product [2] is out of sync with the client package. Try the installation again using a valid copy of the installation package '[3]'.</String>
504 <String Id="Error1732" Overridable="yes"><!-- _locID_text="Error1732" _locComment="Error1732" -->In order to complete the installation of [2], you must restart the computer. Other users are currently logged on to this computer, and restarting may cause them to lose their work. Do you want to restart now?</String>
505 <String Id="Error1801" Overridable="yes"><!-- _locID_text="Error1801" _locComment="Error1801" -->The path [2] is not valid. Please specify a valid path.</String>
506 <String Id="Error1802" Overridable="yes"><!-- _locID_text="Error1802" _locComment="Error1802" -->Out of memory. Shut down other applications before retrying.</String>
507 <String Id="Error1803" Overridable="yes"><!-- _locID_text="Error1803" _locComment="Error1803" -->There is no disk in drive [2]. Please insert one and click Retry, or click Cancel to go back to the previously selected volume.</String>
508 <String Id="Error1804" Overridable="yes"><!-- _locID_text="Error1804" _locComment="Error1804" -->There is no disk in drive [2]. Please insert one and click Retry, or click Cancel to return to the browse dialog and select a different volume.</String>
509 <String Id="Error1805" Overridable="yes"><!-- _locID_text="Error1805" _locComment="Error1805" -->The folder [2] does not exist. Please enter a path to an existing folder.</String>
510 <String Id="Error1806" Overridable="yes"><!-- _locID_text="Error1806" _locComment="Error1806" -->You have insufficient privileges to read this folder.</String>
511 <String Id="Error1807" Overridable="yes"><!-- _locID_text="Error1807" _locComment="Error1807" -->A valid destination folder for the install could not be determined.</String>
512 <String Id="Error1901" Overridable="yes"><!-- _locID_text="Error1901" _locComment="Error1901" -->Error attempting to read from the source install database: [2].</String>
513 <String Id="Error1902" Overridable="yes"><!-- _locID_text="Error1902" _locComment="Error1902" -->Scheduling reboot operation: Renaming file [2] to [3]. Must reboot to complete operation.</String>
514 <String Id="Error1903" Overridable="yes"><!-- _locID_text="Error1903" _locComment="Error1903" -->Scheduling reboot operation: Deleting file [2]. Must reboot to complete operation.</String>
515 <String Id="Error1904" Overridable="yes"><!-- _locID_text="Error1904" _locComment="Error1904" -->Module [2] failed to register. HRESULT [3]. Contact your support personnel.</String>
516 <String Id="Error1905" Overridable="yes"><!-- _locID_text="Error1905" _locComment="Error1905" -->Module [2] failed to unregister. HRESULT [3]. Contact your support personnel.</String>
517 <String Id="Error1906" Overridable="yes"><!-- _locID_text="Error1906" _locComment="Error1906" -->Failed to cache package [2]. Error: [3]. Contact your support personnel.</String>
518 <String Id="Error1907" Overridable="yes"><!-- _locID_text="Error1907" _locComment="Error1907" -->Could not register font [2]. Verify that you have sufficient permissions to install fonts, and that the system supports this font.</String>
519 <String Id="Error1908" Overridable="yes"><!-- _locID_text="Error1908" _locComment="Error1908" -->Could not unregister font [2]. Verify that you that you have sufficient permissions to remove fonts.</String>
520 <String Id="Error1909" Overridable="yes"><!-- _locID_text="Error1909" _locComment="Error1909" -->Could not create Shortcut [2]. Verify that the destination folder exists and that you can access it.</String>
521 <String Id="Error1910" Overridable="yes"><!-- _locID_text="Error1910" _locComment="Error1910" -->Could not remove Shortcut [2]. Verify that the shortcut file exists and that you can access it.</String>
522 <String Id="Error1911" Overridable="yes"><!-- _locID_text="Error1911" _locComment="Error1911" -->Could not register type library for file [2]. Contact your support personnel.</String>
523 <String Id="Error1912" Overridable="yes"><!-- _locID_text="Error1912" _locComment="Error1912" -->Could not unregister type library for file [2]. Contact your support personnel.</String>
524 <String Id="Error1913" Overridable="yes"><!-- _locID_text="Error1913" _locComment="Error1913" -->Could not update the ini file [2][3]. Verify that the file exists and that you can access it.</String>
525 <String Id="Error1914" Overridable="yes"><!-- _locID_text="Error1914" _locComment="Error1914" -->Could not schedule file [2] to replace file [3] on reboot. Verify that you have write permissions to file [3].</String>
526 <String Id="Error1915" Overridable="yes"><!-- _locID_text="Error1915" _locComment="Error1915" -->Error removing ODBC driver manager, ODBC error [2]: [3]. Contact your support personnel.</String>
527 <String Id="Error1916" Overridable="yes"><!-- _locID_text="Error1916" _locComment="Error1916" -->Error installing ODBC driver manager, ODBC error [2]: [3]. Contact your support personnel.</String>
528 <String Id="Error1917" Overridable="yes"><!-- _locID_text="Error1917" _locComment="Error1917" -->Error removing ODBC driver: [4], ODBC error [2]: [3]. Verify that you have sufficient privileges to remove ODBC drivers.</String>
529 <String Id="Error1918" Overridable="yes"><!-- _locID_text="Error1918" _locComment="Error1918" -->Error installing ODBC driver: [4], ODBC error [2]: [3]. Verify that the file [4] exists and that you can access it.</String>
530 <String Id="Error1919" Overridable="yes"><!-- _locID_text="Error1919" _locComment="Error1919" -->Error configuring ODBC data source: [4], ODBC error [2]: [3]. Verify that the file [4] exists and that you can access it.</String>
531 <String Id="Error1920" Overridable="yes"><!-- _locID_text="Error1920" _locComment="Error1920" -->Service '[2]' ([3]) failed to start. Verify that you have sufficient privileges to start system services.</String>
532 <String Id="Error1921" Overridable="yes"><!-- _locID_text="Error1921" _locComment="Error1921" -->Service '[2]' ([3]) could not be stopped. Verify that you have sufficient privileges to stop system services.</String>
533 <String Id="Error1922" Overridable="yes"><!-- _locID_text="Error1922" _locComment="Error1922" -->Service '[2]' ([3]) could not be deleted. Verify that you have sufficient privileges to remove system services.</String>
534 <String Id="Error1923" Overridable="yes"><!-- _locID_text="Error1923" _locComment="Error1923" -->Service '[2]' ([3]) could not be installed. Verify that you have sufficient privileges to install system services.</String>
535 <String Id="Error1924" Overridable="yes"><!-- _locID_text="Error1924" _locComment="Error1924" -->Could not update environment variable '[2]'. Verify that you have sufficient privileges to modify environment variables.</String>
536 <String Id="Error1925" Overridable="yes"><!-- _locID_text="Error1925" _locComment="Error1925" -->You do not have sufficient privileges to complete this installation for all users of the machine. Log on as administrator and then retry this installation.</String>
537 <String Id="Error1926" Overridable="yes"><!-- _locID_text="Error1926" _locComment="Error1926" -->Could not set file security for file '[3]'. Error: [2]. Verify that you have sufficient privileges to modify the security permissions for this file.</String>
538 <String Id="Error1927" Overridable="yes"><!-- _locID_text="Error1927" _locComment="Error1927" -->Component Services (COM+ 1.0) are not installed on this computer. This installation requires Component Services in order to complete successfully. Component Services are available on Windows 2000.</String>
539 <String Id="Error1928" Overridable="yes"><!-- _locID_text="Error1928" _locComment="Error1928" -->Error registering COM+ Application. Contact your support personnel for more information.</String>
540 <String Id="Error1929" Overridable="yes"><!-- _locID_text="Error1929" _locComment="Error1929" -->Error unregistering COM+ Application. Contact your support personnel for more information.</String>
541 <String Id="Error1930" Overridable="yes"><!-- _locID_text="Error1930" _locComment="Error1930" -->The description for service '[2]' ([3]) could not be changed.</String>
542 <String Id="Error1931" Overridable="yes"><!-- _locID_text="Error1931" _locComment="Error1931" -->The Windows Installer service cannot update the system file [2] because the file is protected by Windows. You may need to update your operating system for this program to work correctly.{{ Package version: [3], OS Protected version: [4]}}</String>
543 <String Id="Error1932" Overridable="yes"><!-- _locID_text="Error1932" _locComment="Error1932" -->The Windows Installer service cannot update the protected Windows file [2].{{ Package version: [3], OS Protected version: [4], SFP Error: [5]}}</String>
544 <String Id="Error1933" Overridable="yes"><!-- _locID_text="Error1933" _locComment="Error1933" -->The Windows Installer service cannot update one or more protected Windows files.{{ SFP Error: [2]. List of protected files:\r\n[3]}}</String>
545 <String Id="Error1934" Overridable="yes"><!-- _locID_text="Error1934" _locComment="Error1934" -->User installations are disabled via policy on the machine.</String>
546 <String Id="Error1935" Overridable="yes"><!-- _locID_text="Error1935" _locComment="Error1935" -->An error occurred during the installation of assembly '[6]'. Please refer to Help and Support for more information. HRESULT: [3].{{ assembly interface: [4], function: [5], component: [2]}}</String>
547 <String Id="Error1936" Overridable="yes"><!-- _locID_text="Error1936" _locComment="Error1936" -->An error occurred during the installation of assembly '[6]'. The assembly is not strongly named or is not signed with the minimal key length. HRESULT: [3].{{ assembly interface: [4], function: [5], component: [2]}}</String>
548 <String Id="Error1937" Overridable="yes"><!-- _locID_text="Error1937" _locComment="Error1937" -->An error occurred during the installation of assembly '[6]'. The signature or catalog could not be verified or is not valid. HRESULT: [3].{{ assembly interface: [4], function: [5], component: [2]}}</String>
549 <String Id="Error1938" Overridable="yes"><!-- _locID_text="Error1938" _locComment="Error1938" -->An error occurred during the installation of assembly '[6]'. One or more modules of the assembly could not be found. HRESULT: [3].{{ assembly interface: [4], function: [5], component: [2]}}</String>
550
551 <String Id="UITextbytes" Overridable="yes"><!-- _locID_text="UITextbytes" _locComment="UITextbytes" -->bytes</String>
552 <String Id="UITextGB" Overridable="yes"><!-- _locID_text="UITextGB" _locComment="UITextGB" -->GB</String>
553 <String Id="UITextKB" Overridable="yes"><!-- _locID_text="UITextKB" _locComment="UITextKB" -->KB</String>
554 <String Id="UITextMB" Overridable="yes"><!-- _locID_text="UITextMB" _locComment="UITextMB" -->MB</String>
555 <String Id="UITextMenuAbsent" Overridable="yes"><!-- _locID_text="UITextMenuAbsent" _locComment="UITextMenuAbsent" -->Entire feature will be unavailable</String>
556 <String Id="UITextMenuAdvertise" Overridable="yes"><!-- _locID_text="UITextMenuAdvertise" _locComment="UITextMenuAdvertise" -->Feature will be installed when required</String>
557 <String Id="UITextMenuAllCD" Overridable="yes"><!-- _locID_text="UITextMenuAllCD" _locComment="UITextMenuAllCD" -->Entire feature will be installed to run from CD</String>
558 <String Id="UITextMenuAllLocal" Overridable="yes"><!-- _locID_text="UITextMenuAllLocal" _locComment="UITextMenuAllLocal" -->Entire feature will be installed on local hard drive</String>
559 <String Id="UITextMenuAllNetwork" Overridable="yes"><!-- _locID_text="UITextMenuAllNetwork" _locComment="UITextMenuAllNetwork" -->Entire feature will be installed to run from network</String>
560 <String Id="UITextMenuCD" Overridable="yes"><!-- _locID_text="UITextMenuCD" _locComment="UITextMenuCD" -->Will be installed to run from CD</String>
561 <String Id="UITextMenuLocal" Overridable="yes"><!-- _locID_text="UITextMenuLocal" _locComment="UITextMenuLocal" -->Will be installed on local hard drive</String>
562 <String Id="UITextMenuNetwork" Overridable="yes"><!-- _locID_text="UITextMenuNetwork" _locComment="UITextMenuNetwork" -->Will be installed to run from network</String>
563 <String Id="UITextNewFolder" Overridable="yes"><!-- _locID_text="UITextNewFolder" _locComment="UITextNewFolder" -->Folder|New Folder</String>
564 <String Id="UITextScriptInProgress" Overridable="yes"><!-- _locID_text="UITextScriptInProgress" _locComment="UITextScriptInProgress" -->Gathering required information...</String>
565 <String Id="UITextSelAbsentAbsent" Overridable="yes"><!-- _locID_text="UITextSelAbsentAbsent" _locComment="UITextSelAbsentAbsent" -->This feature will remain uninstalled</String>
566 <String Id="UITextSelAbsentAdvertise" Overridable="yes"><!-- _locID_text="UITextSelAbsentAdvertise" _locComment="UITextSelAbsentAdvertise" -->This feature will be set to be installed when required</String>
567 <String Id="UITextSelAbsentCD" Overridable="yes"><!-- _locID_text="UITextSelAbsentCD" _locComment="UITextSelAbsentCD" -->This feature will be installed to run from CD</String>
568 <String Id="UITextSelAbsentLocal" Overridable="yes"><!-- _locID_text="UITextSelAbsentLocal" _locComment="UITextSelAbsentLocal" -->This feature will be installed on the local hard drive</String>
569 <String Id="UITextSelAbsentNetwork" Overridable="yes"><!-- _locID_text="UITextSelAbsentNetwork" _locComment="UITextSelAbsentNetwork" -->This feature will be installed to run from the network</String>
570 <String Id="UITextSelAdvertiseAbsent" Overridable="yes"><!-- _locID_text="UITextSelAdvertiseAbsent" _locComment="UITextSelAdvertiseAbsent" -->This feature will become unavailable</String>
571 <String Id="UITextSelAdvertiseAdvertise" Overridable="yes"><!-- _locID_text="UITextSelAdvertiseAdvertise" _locComment="UITextSelAdvertiseAdvertise" -->Will be installed when required</String>
572 <String Id="UITextSelAdvertiseCD" Overridable="yes"><!-- _locID_text="UITextSelAdvertiseCD" _locComment="UITextSelAdvertiseCD" -->This feature will be available to run from CD</String>
573 <String Id="UITextSelAdvertiseLocal" Overridable="yes"><!-- _locID_text="UITextSelAdvertiseLocal" _locComment="UITextSelAdvertiseLocal" -->This feature will be installed on your local hard drive</String>
574 <String Id="UITextSelAdvertiseNetwork" Overridable="yes"><!-- _locID_text="UITextSelAdvertiseNetwork" _locComment="UITextSelAdvertiseNetwork" -->This feature will be available to run from the network</String>
575 <String Id="UITextSelCDAbsent" Overridable="yes"><!-- _locID_text="UITextSelCDAbsent" _locComment="UITextSelCDAbsent" -->This feature will be uninstalled completely, you won't be able to run it from CD</String>
576 <String Id="UITextSelCDAdvertise" Overridable="yes"><!-- _locID_text="UITextSelCDAdvertise" _locComment="UITextSelCDAdvertise" -->This feature will change from run from CD state to set to be installed when required</String>
577 <String Id="UITextSelCDCD" Overridable="yes"><!-- _locID_text="UITextSelCDCD" _locComment="UITextSelCDCD" -->This feature will remain to be run from CD</String>
578 <String Id="UITextSelCDLocal" Overridable="yes"><!-- _locID_text="UITextSelCDLocal" _locComment="UITextSelCDLocal" -->This feature will change from run from CD state to be installed on the local hard drive</String>
579 <String Id="UITextSelChildCostNeg" Overridable="yes"><!-- _locID_text="UITextSelChildCostNeg" _locComment="UITextSelChildCostNeg" -->This feature frees up [1] on your hard drive.</String>
580 <String Id="UITextSelChildCostPos" Overridable="yes"><!-- _locID_text="UITextSelChildCostPos" _locComment="UITextSelChildCostPos" -->This feature requires [1] on your hard drive.</String>
581 <String Id="UITextSelCostPending" Overridable="yes"><!-- _locID_text="UITextSelCostPending" _locComment="UITextSelCostPending" -->Compiling cost for this feature...</String>
582 <String Id="UITextSelLocalAbsent" Overridable="yes"><!-- _locID_text="UITextSelLocalAbsent" _locComment="UITextSelLocalAbsent" -->This feature will be completely removed</String>
583 <String Id="UITextSelLocalAdvertise" Overridable="yes"><!-- _locID_text="UITextSelLocalAdvertise" _locComment="UITextSelLocalAdvertise" -->This feature will be removed from your local hard drive, but will be set to be installed when required</String>
584 <String Id="UITextSelLocalCD" Overridable="yes"><!-- _locID_text="UITextSelLocalCD" _locComment="UITextSelLocalCD" -->This feature will be removed from your local hard drive, but will be still available to run from CD</String>
585 <String Id="UITextSelLocalLocal" Overridable="yes"><!-- _locID_text="UITextSelLocalLocal" _locComment="UITextSelLocalLocal" -->This feature will remain on your local hard drive</String>
586 <String Id="UITextSelLocalNetwork" Overridable="yes"><!-- _locID_text="UITextSelLocalNetwork" _locComment="UITextSelLocalNetwork" -->This feature will be removed from your local hard drive, but will be still available to run from the network</String>
587 <String Id="UITextSelNetworkAbsent" Overridable="yes"><!-- _locID_text="UITextSelNetworkAbsent" _locComment="UITextSelNetworkAbsent" -->This feature will be uninstalled completely, you won't be able to run it from the network</String>
588 <String Id="UITextSelNetworkAdvertise" Overridable="yes"><!-- _locID_text="UITextSelNetworkAdvertise" _locComment="UITextSelNetworkAdvertise" -->This feature will change from run from network state to set to be installed when required</String>
589 <String Id="UITextSelNetworkLocal" Overridable="yes"><!-- _locID_text="UITextSelNetworkLocal" _locComment="UITextSelNetworkLocal" -->This feature will change from run from network state to be installed on the local hard drive</String>
590 <String Id="UITextSelNetworkNetwork" Overridable="yes"><!-- _locID_text="UITextSelNetworkNetwork" _locComment="UITextSelNetworkNetwork" -->This feature will remain to be run from the network</String>
591 <String Id="UITextSelParentCostNegNeg" Overridable="yes"><!-- _locID_text="UITextSelParentCostNegNeg" _locComment="UITextSelParentCostNegNeg" -->This feature frees up [1] on your hard drive. It has [2] of [3] subfeatures selected. The subfeatures free up [4] on your hard drive.</String>
592 <String Id="UITextSelParentCostNegPos" Overridable="yes"><!-- _locID_text="UITextSelParentCostNegPos" _locComment="UITextSelParentCostNegPos" -->This feature frees up [1] on your hard drive. It has [2] of [3] subfeatures selected. The subfeatures require [4] on your hard drive.</String>
593 <String Id="UITextSelParentCostPosNeg" Overridable="yes"><!-- _locID_text="UITextSelParentCostPosNeg" _locComment="UITextSelParentCostPosNeg" -->This feature requires [1] on your hard drive. It has [2] of [3] subfeatures selected. The subfeatures free up [4] on your hard drive.</String>
594 <String Id="UITextSelParentCostPosPos" Overridable="yes"><!-- _locID_text="UITextSelParentCostPosPos" _locComment="UITextSelParentCostPosPos" -->This feature requires [1] on your hard drive. It has [2] of [3] subfeatures selected. The subfeatures require [4] on your hard drive.</String>
595 <String Id="UITextTimeRemaining" Overridable="yes"><!-- _locID_text="UITextTimeRemaining" _locComment="UITextTimeRemaining" -->Time remaining:{ [1] minutes}{ [2] seconds}</String>
596 <String Id="UITextVolumeCostAvailable" Overridable="yes"><!-- _locID_text="UITextVolumeCostAvailable" _locComment="UITextVolumeCostAvailable" -->Available</String>
597 <String Id="UITextVolumeCostDifference" Overridable="yes"><!-- _locID_text="UITextVolumeCostDifference" _locComment="UITextVolumeCostDifference" -->Difference</String>
598 <String Id="UITextVolumeCostRequired" Overridable="yes"><!-- _locID_text="UITextVolumeCostRequired" _locComment="UITextVolumeCostRequired" -->Required</String>
599 <String Id="UITextVolumeCostSize" Overridable="yes"><!-- _locID_text="UITextVolumeCostSize" _locComment="UITextVolumeCostSize" -->Disk Size</String>
600 <String Id="UITextVolumeCostVolume" Overridable="yes"><!-- _locID_text="UITextVolumeCostVolume" _locComment="UITextVolumeCostVolume" -->Volume</String>
601</WixLocalization>
diff --git a/src/ext/UI/wixlib/WixUI_es-es.wxl b/src/ext/UI/wixlib/WixUI_es-es.wxl
new file mode 100644
index 00000000..3068c146
--- /dev/null
+++ b/src/ext/UI/wixlib/WixUI_es-es.wxl
@@ -0,0 +1,598 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3
4
5<WixLocalization Culture="es-es" Codepage="1252" xmlns="http://wixtoolset.org/schemas/v4/wxl">
6 <String Id="WixUIBack" Overridable="yes">&amp;Atrás</String>
7 <String Id="WixUINext" Overridable="yes">&amp;Siguiente</String>
8 <String Id="WixUICancel" Overridable="yes">Cancelar</String>
9 <String Id="WixUIFinish" Overridable="yes">&amp;Finalizar</String>
10 <String Id="WixUIRetry" Overridable="yes">&amp;Reintentar</String>
11 <String Id="WixUIIgnore" Overridable="yes">&amp;Ignorar</String>
12 <String Id="WixUIYes" Overridable="yes">&amp;Sí</String>
13 <String Id="WixUINo" Overridable="yes">&amp;No</String>
14 <String Id="WixUIOK" Overridable="yes">Aceptar</String>
15 <String Id="WixUIPrint" Overridable="yes">I&amp;mprimir</String>
16
17 <String Id="AdvancedWelcomeEulaDlg_Title" Overridable="yes">Instalación de [ProductName]</String>
18 <String Id="AdvancedWelcomeEulaDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
19 <String Id="AdvancedWelcomeEulaDlgTitle" Overridable="yes">{\WixUI_Font_Title}Lea el Contrato de licencia de [ProductName]</String>
20 <String Id="AdvancedWelcomeEulaDlgLicenseAcceptedCheckBox" Overridable="yes">&amp;Acepto los términos del Contrato de licencia</String>
21 <String Id="AdvancedWelcomeEulaDlgDescriptionPerMachine" Overridable="yes">Haga clic en Instalar para instalar el producto con las opciones predeterminadas para todos los usuarios. Haga clic en Avanzada para cambiar las opciones de instalación.</String>
22 <String Id="AdvancedWelcomeEulaDlgDescriptionPerUser" Overridable="yes">Haga clic en Instalar para instalar el producto con las opciones predeterminadas solo para el usuario actual. Haga clic en Avanzada para cambiar las opciones de instalación.</String>
23 <String Id="AdvancedWelcomeEulaDlgInstall" Overridable="yes">&amp;Instalar</String>
24 <String Id="AdvancedWelcomeEulaDlgAdvanced" Overridable="yes">A&amp;vanzada</String>
25 <String Id="Advanced_Font_Normal_Size" Overridable="yes">8</String>
26 <String Id="Advanced_Font_Bigger_Size" Overridable="yes">12</String>
27 <String Id="Advanced_Font_Title_Size" Overridable="yes">9</String>
28 <String Id="Advanced_Font_Emphasized_Size" Overridable="yes">8</String>
29 <String Id="Advanced_Font_FaceName" Overridable="yes">Tahoma</String>
30
31 <String Id="BrowseDlg_Title" Overridable="yes">Instalación de [ProductName]</String>
32 <String Id="BrowseDlgComboLabel" Overridable="yes">&amp;Buscar en:</String>
33 <String Id="BrowseDlgWixUI_Bmp_Up" Overridable="yes">WixUI_Bmp_Up</String>
34 <String Id="BrowseDlgWixUI_Bmp_UpTooltip" Overridable="yes">Subir un nivel</String>
35 <String Id="BrowseDlgNewFolder" Overridable="yes">WixUI_Bmp_New</String>
36 <String Id="BrowseDlgNewFolderTooltip" Overridable="yes">Crea una nueva carpeta</String>
37 <String Id="BrowseDlgPathLabel" Overridable="yes">&amp;Nombre de carpeta:</String>
38 <String Id="BrowseDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
39 <String Id="BrowseDlgDescription" Overridable="yes">Buscar la carpeta de destino</String>
40 <String Id="BrowseDlgTitle" Overridable="yes">{\WixUI_Font_Title}Cambiar carpeta de destino</String>
41
42 <String Id="CancelDlg_Title" Overridable="yes">Instalación de [ProductName]</String>
43 <String Id="CancelDlgText" Overridable="yes">¿Está seguro de que desea cancelar la instalación de [ProductName]?</String>
44 <String Id="CancelDlgIcon" Overridable="yes">WixUI_Ico_Info</String>
45 <String Id="CancelDlgIconTooltip" Overridable="yes">Icono de información</String>
46
47 <String Id="CustomizeDlg_Title" Overridable="yes">Instalación de [ProductName]</String>
48 <String Id="CustomizeDlgTree" Overridable="yes">Árbol de selecciones</String>
49 <String Id="CustomizeDlgBrowse" Overridable="yes">E&amp;xaminar...</String>
50 <String Id="CustomizeDlgReset" Overridable="yes">Re&amp;stablecer</String>
51 <String Id="CustomizeDlgDiskCost" Overridable="yes">&amp;Uso del disco</String>
52 <String Id="CustomizeDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
53 <String Id="CustomizeDlgText" Overridable="yes">Haga clic en los iconos del árbol siguiente para cambiar el modo en que se instalan las características.</String>
54 <String Id="CustomizeDlgDescription" Overridable="yes">Seleccione el modo en que desea que se instalen las características.</String>
55 <String Id="CustomizeDlgTitle" Overridable="yes">{\WixUI_Font_Title}Instalación personalizada</String>
56 <String Id="CustomizeDlgItemDescription" Overridable="yes">CustomizeDlgItemDescription-CustomizeDlgItemDescription</String>
57 <String Id="CustomizeDlgItemSize" Overridable="yes">CustomizeDlgItemSize-CustomizeDlgItemSize</String>
58 <String Id="CustomizeDlgLocation" Overridable="yes">CustomizeDlgLocation-CustomizeDlgLocation</String>
59 <String Id="CustomizeDlgLocationLabel" Overridable="yes">Ubicación:</String>
60
61 <String Id="DiskCostDlg_Title" Overridable="yes">Instalación de [ProductName]</String>
62 <String Id="DiskCostDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
63 <String Id="DiskCostDlgText" Overridable="yes">Los volúmenes resaltados no tienen espacio en disco suficiente para las características seleccionadas. Puede quitar algunos archivos de estos volúmenes, instalar menos características o seleccionar otras unidades de destino.</String>
64 <String Id="DiskCostDlgDescription" Overridable="yes">Espacio en disco necesario para la instalación de las características seleccionadas.</String>
65 <String Id="DiskCostDlgTitle" Overridable="yes">{\WixUI_Font_Title}Requisitos de espacio en disco</String>
66 <String Id="DiskCostDlgVolumeList" Overridable="yes">{120}{70}{70}{70}{70}</String>
67
68 <String Id="ErrorDlg_Title" Overridable="yes">Instalación de [ProductName]</String>
69 <String Id="ErrorDlgErrorText" Overridable="yes">Texto informativo</String>
70 <String Id="ErrorDlgErrorIcon" Overridable="yes">WixUI_Ico_Info</String>
71 <String Id="ErrorDlgErrorIconTooltip" Overridable="yes">Icono de información</String>
72
73 <String Id="ExitDialog_Title" Overridable="yes">Instalación de [ProductName]</String>
74 <String Id="ExitDialogBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
75 <String Id="ExitDialogDescription" Overridable="yes">Haga clic en el botón Finalizar para salir del Asistente para la instalación.</String>
76 <String Id="ExitDialogTitle" Overridable="yes">{\WixUI_Font_Bigger}Ha completado el Asistente para la instalación de [ProductName]</String>
77
78 <String Id="FatalError_Title" Overridable="yes">Instalación de [ProductName]</String>
79 <String Id="FatalErrorBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
80 <String Id="FatalErrorTitle" Overridable="yes">{\WixUI_Font_Bigger}El Asistente para la instalación de [ProductName] finalizó antes de tiempo.</String>
81 <String Id="FatalErrorDescription1" Overridable="yes">El Asistente para la instalación de [ProductName] finalizó antes de tiempo debido a un error. El sistema no se ha modificado. Para instalar el programa más tarde, vuelva a ejecutar el Asistente para la instalación.</String>
82 <String Id="FatalErrorDescription2" Overridable="yes">Haga clic en el botón Finalizar para salir del Asistente para la instalación.</String>
83
84 <String Id="FeaturesDlg_Title" Overridable="yes">Instalación de [ProductName]</String>
85 <String Id="FeaturesDlgTree" Overridable="yes">Características del producto</String>
86 <String Id="FeaturesDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
87 <String Id="FeaturesDlgDescription" Overridable="yes">Seleccione el modo en que desea que se instalen las características.</String>
88 <String Id="FeaturesDlgTitle" Overridable="yes">{\WixUI_Font_Title}Características del producto</String>
89 <String Id="FeaturesDlgItemDescription" Overridable="yes">FeaturesDlgItemDescription</String>
90 <String Id="FeaturesDlgItemSize" Overridable="yes">FeaturesDlgItemSize</String>
91 <String Id="FeaturesDlgInstall" Overridable="yes">&amp;Instalar</String>
92 <String Id="FeaturesDlgChange" Overridable="yes">&amp;Cambiar</String>
93
94 <String Id="FilesInUse_Title" Overridable="yes">Instalación de [ProductName]</String>
95 <String Id="FilesInUseExit" Overridable="yes">S&amp;alir</String>
96 <String Id="FilesInUseBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
97 <String Id="FilesInUseText" Overridable="yes">Las siguientes aplicaciones están utilizando archivos que el programa de instalación debe actualizar. Cierre estas aplicaciones y haga clic en &amp;Reintentar para continuar con la instalación o en Salir para salir de ella.</String>
98 <String Id="FilesInUseDescription" Overridable="yes">Algunos archivos que es necesario actualizar se están utilizando en este momento.</String>
99 <String Id="FilesInUseTitle" Overridable="yes">{\WixUI_Font_Title}Archivos en uso</String>
100
101 <String Id="InstallDirDlg_Title" Overridable="yes">Instalación de [ProductName]</String>
102 <String Id="InstallDirDlgChange" Overridable="yes">&amp;Cambiar...</String>
103 <String Id="InstallDirDlgTitle" Overridable="yes">{\WixUI_Font_Title}Carpeta de destino</String>
104 <String Id="InstallDirDlgDescription" Overridable="yes">Haga clic en Siguiente para realizar la instalación en la carpeta predeterminada o en Cambiar para elegir otra carpeta.</String>
105 <String Id="InstallDirDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
106 <String Id="InstallDirDlgFolderLabel" Overridable="yes">Instalar [ProductName] en:</String>
107
108 <String Id="InstallScopeDlg_Title" Overridable="yes">Instalación de [ProductName]</String>
109 <String Id="InstallScopeDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
110 <String Id="InstallScopeDlgDescription" Overridable="yes">Elija el ámbito y la carpeta de instalación</String>
111 <String Id="InstallScopeDlgTitle" Overridable="yes">{\WixUI_Font_Title}Ámbito de la instalación</String>
112 <String Id="InstallScopeDlgPerUser" Overridable="yes">{\WixUI_Font_Emphasized}Instalar &amp;solo para el usuario actual ([LogonUser])</String>
113 <String Id="InstallScopeDlgPerUserDescription" Overridable="yes">[ProductName] se instalará en una carpeta por usuario y solo estará disponible para su cuenta de usuario. No se necesitan privilegios de administrador local.</String>
114 <String Id="InstallScopeDlgNoPerUserDescription" Overridable="yes">[ProductName] no admite la instalación por usuario.</String>
115 <String Id="InstallScopeDlgPerMachine" Overridable="yes">{\WixUI_Font_Emphasized}Instalar para todos los usuarios de este &amp;equipo</String>
116 <String Id="InstallScopeDlgPerMachineDescription" Overridable="yes">[ProductName] se instalará en una carpeta por equipo de forma predeterminada y estará disponible a todos los usuarios. Puede cambiar la carpeta de instalación predeterminada. Se necesitan privilegios de administrador local.</String>
117 <String Id="InstallScopeDlgFolderLabel" Overridable="yes">&amp;Carpeta de instalación:</String>
118 <String Id="InstallScopeDlgChange" Overridable="yes">&amp;Cambiar...</String>
119
120 <String Id="InvalidDirDlg_Title" Overridable="yes">Instalación de [ProductName]</String>
121 <String Id="InvalidDirDlgText" Overridable="yes">El directorio de instalación debe estar en una unidad de disco duro local.</String>
122 <String Id="InvalidDirDlgIcon" Overridable="yes">WixUI_Ico_Info</String>
123 <String Id="InvalidDirDlgIconTooltip" Overridable="yes">Icono de información</String>
124
125 <String Id="LicenseAgreementDlg_Title" Overridable="yes">Instalación de [ProductName]</String>
126 <String Id="LicenseAgreementDlgLicenseAcceptedCheckBox" Overridable="yes">A&amp;cepto los términos del Contrato de licencia</String>
127 <String Id="LicenseAgreementDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
128 <String Id="LicenseAgreementDlgDescription" Overridable="yes">Lea detenidamente el siguiente Contrato de licencia</String>
129 <String Id="LicenseAgreementDlgTitle" Overridable="yes">{\WixUI_Font_Title}Contrato de licencia para el usuario final</String>
130
131 <String Id="MaintenanceTypeDlg_Title" Overridable="yes">Instalación de [ProductName]</String>
132 <String Id="MaintenanceTypeDlgChangeButton" Overridable="yes">&amp;Cambiar</String>
133 <String Id="MaintenanceTypeDlgChangeButtonTooltip" Overridable="yes">Cambiar la instalación</String>
134 <String Id="MaintenanceTypeDlgRepairButton" Overridable="yes">Re&amp;parar</String>
135 <String Id="MaintenanceTypeDlgRepairButtonTooltip" Overridable="yes">Reparar la instalación</String>
136 <String Id="MaintenanceTypeDlgRemoveButton" Overridable="yes">&amp;Quitar</String>
137 <String Id="MaintenanceTypeDlgRemoveButtonTooltip" Overridable="yes">Quitar la instalación</String>
138 <String Id="MaintenanceTypeDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
139 <String Id="MaintenanceTypeDlgDescription" Overridable="yes">Seleccione la operación que desea realizar.</String>
140 <String Id="MaintenanceTypeDlgTitle" Overridable="yes">{\WixUI_Font_Title}Cambiar, reparar o quitar la instalación</String>
141 <String Id="MaintenanceTypeDlgChangeText" Overridable="yes">Permite cambiar el modo en que se instalan las características.</String>
142 <String Id="MaintenanceTypeDlgChangeDisabledText" Overridable="yes">[ProductName] no tiene características que puedan seleccionarse de manera independiente.</String>
143 <String Id="MaintenanceTypeDlgRemoveText" Overridable="yes">Quita [ProductName] de su equipo.</String>
144 <String Id="MaintenanceTypeDlgRemoveDisabledText" Overridable="yes">No se puede quitar [ProductName].</String>
145 <String Id="MaintenanceTypeDlgRepairText" Overridable="yes">Repara errores en la instalación más reciente corrigiendo archivos, accesos directos y entradas de Registro que faltan o que están dañados.</String>
146 <String Id="MaintenanceTypeDlgRepairDisabledText" Overridable="yes">No se puede reparar [ProductName].</String>
147
148 <String Id="MaintenanceWelcomeDlg_Title" Overridable="yes">Instalación de [ProductName]</String>
149 <String Id="MaintenanceWelcomeDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
150 <String Id="MaintenanceWelcomeDlgDescription" Overridable="yes">El Asistente para la instalación permite cambiar el modo en que se instalan las características de [ProductName] en el equipo o quitarlo de este. Haga clic en Siguiente para continuar o en Cancelar para salir del Asistente para la instalación.</String>
151 <String Id="MaintenanceWelcomeDlgTitle" Overridable="yes">{\WixUI_Font_Bigger}Asistente para la instalación de [ProductName]</String>
152
153 <String Id="MsiRMFilesInUse_Title" Overridable="yes">Instalación de [ProductName]</String>
154 <String Id="MsiRMFilesInUseBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
155 <String Id="MsiRMFilesInUseText" Overridable="yes">Las siguientes aplicaciones están utilizando archivos que el programa de instalación debe actualizar. Puede dejar que el Asistente para la instalación los cierre e intentar reiniciarlos o reiniciar el equipo más tarde.</String>
156 <String Id="MsiRMFilesInUseDescription" Overridable="yes">Algunos archivos que es necesario actualizar se están utilizando en este momento.</String>
157 <String Id="MsiRMFilesInUseTitle" Overridable="yes">{\WixUI_Font_Title}Archivos en uso</String>
158 <String Id="MsiRMFilesInUseUseRM" Overridable="yes">&amp;Cierre las aplicaciones e intente reiniciarlas.</String>
159 <String Id="MsiRMFilesInUseDontUseRM" Overridable="yes">&amp;No cierre las aplicaciones. Será necesario reiniciar.</String>
160
161 <String Id="OutOfDiskDlg_Title" Overridable="yes">Instalación de [ProductName]</String>
162 <String Id="OutOfDiskDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
163 <String Id="OutOfDiskDlgText" Overridable="yes">Los volúmenes resaltados no disponen de espacio en disco suficiente para las características seleccionadas. Puede quitar algunos archivos de dichos volúmenes, instalar menos características o seleccionar otra unidad de destino.</String>
164 <String Id="OutOfDiskDlgDescription" Overridable="yes">El espacio en disco necesario para la instalación supera el espacio disponible en el disco.</String>
165 <String Id="OutOfDiskDlgTitle" Overridable="yes">{\WixUI_Font_Title}Espacio en disco insuficiente</String>
166 <String Id="OutOfDiskDlgVolumeList" Overridable="yes">{120}{70}{70}{70}{70}</String>
167
168 <String Id="OutOfRbDiskDlg_Title" Overridable="yes">Instalación de [ProductName]</String>
169 <String Id="OutOfRbDiskDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
170 <String Id="OutOfRbDiskDlgText" Overridable="yes">Los volúmenes resaltados no disponen de espacio en disco suficiente para las características seleccionadas. Puede quitar algunos archivos de dichos volúmenes, instalar menos características o seleccionar otra unidad de destino.</String>
171 <String Id="OutOfRbDiskDlgDescription" Overridable="yes">El espacio en disco necesario para la instalación supera el espacio disponible en disco.</String>
172 <String Id="OutOfRbDiskDlgTitle" Overridable="yes">{\WixUI_Font_Title}Espacio en disco insuficiente</String>
173 <String Id="OutOfRbDiskDlgVolumeList" Overridable="yes">{120}{70}{70}{70}{70}</String>
174 <String Id="OutOfRbDiskDlgText2" Overridable="yes">También puede deshabilitar la funcionalidad de reversión del instalador. Esto impedirá que el instalador restaure el estado original del equipo en caso de que se interrumpa la instalación. Haga clic en Sí si desea correr el riesgo y deshabilitar la reversión.</String>
175
176 <String Id="PrepareDlg_Title" Overridable="yes">Instalación de [ProductName]</String>
177 <String Id="PrepareDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
178 <String Id="PrepareDlgDescription" Overridable="yes">Espere mientras el Asistente para la instalación se prepara para guiarlo durante la instalación.</String>
179 <String Id="PrepareDlgTitle" Overridable="yes">{\WixUI_Font_Bigger}Asistente para la instalación de [ProductName]</String>
180
181 <String Id="ProgressDlg_Title" Overridable="yes">Instalación de [ProductName]</String>
182 <String Id="ProgressDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
183 <String Id="ProgressDlgTextInstalling" Overridable="yes">Espere mientras el Asistente para la instalación instala [ProductName].</String>
184 <String Id="ProgressDlgTitleInstalling" Overridable="yes">{\WixUI_Font_Title}Instalando [ProductName]</String>
185 <String Id="ProgressDlgTextChanging" Overridable="yes">Espere mientras el Asistente para la instalación cambia [ProductName].</String>
186 <String Id="ProgressDlgTitleChanging" Overridable="yes">{\WixUI_Font_Title}Cambiando [ProductName]</String>
187 <String Id="ProgressDlgTextRepairing" Overridable="yes">Espere mientras el Asistente para la instalación repara [ProductName].</String>
188 <String Id="ProgressDlgTitleRepairing" Overridable="yes">{\WixUI_Font_Title}Reparando [ProductName]</String>
189 <String Id="ProgressDlgTextRemoving" Overridable="yes">Espere mientras el Asistente para la instalación quita [ProductName].</String>
190 <String Id="ProgressDlgTitleRemoving" Overridable="yes">{\WixUI_Font_Title}Quitando [ProductName]</String>
191 <String Id="ProgressDlgTextUpdating" Overridable="yes">Espere mientras el Asistente para la instalación actualiza [ProductName].</String>
192 <String Id="ProgressDlgTitleUpdating" Overridable="yes">{\WixUI_Font_Title}Actualizando [ProductName]</String>
193 <String Id="ProgressDlgProgressBar" Overridable="yes">Operación completada</String>
194 <String Id="ProgressDlgStatusLabel" Overridable="yes">Estado:</String>
195
196 <String Id="ResumeDlg_Title" Overridable="yes">Instalación de [ProductName]</String>
197 <String Id="ResumeDlgInstall" Overridable="yes">&amp;Instalar</String>
198 <String Id="ResumeDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
199 <String Id="ResumeDlgDescription" Overridable="yes">El Asistente para la instalación completará la instalación de [ProductName] en el equipo. Haga clic en Instalar para continuar o en Cancelar para salir del Asistente para la instalación.</String>
200 <String Id="ResumeDlgTitle" Overridable="yes">{\WixUI_Font_Bigger}Reanudando el Asistente para la instalación de [ProductName]</String>
201
202 <String Id="SetupTypeDlg_Title" Overridable="yes">Instalación de [ProductName]</String>
203 <String Id="SetupTypeDlgTypicalButton" Overridable="yes">&amp;Típica</String>
204 <String Id="SetupTypeDlgTypicalButtonTooltip" Overridable="yes">Instalación típica</String>
205 <String Id="SetupTypeDlgCustomButton" Overridable="yes">&amp;Personalizada</String>
206 <String Id="SetupTypeDlgCustomButtonTooltip" Overridable="yes">Instalación personalizada</String>
207 <String Id="SetupTypeDlgCompleteButton" Overridable="yes">&amp;Completa</String>
208 <String Id="SetupTypeDlgCompleteButtonTooltip" Overridable="yes">Instalación completa</String>
209 <String Id="SetupTypeDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
210 <String Id="SetupTypeDlgTitle" Overridable="yes">{\WixUI_Font_Title}Elija un tipo de instalación</String>
211 <String Id="SetupTypeDlgDescription" Overridable="yes">Elija el tipo de instalación que mejor se adapte a sus necesidades.</String>
212 <String Id="SetupTypeDlgTypicalText" Overridable="yes">Instala las características de programa más comunes. Recomendada para la mayoría de los usuarios.</String>
213 <String Id="SetupTypeDlgCustomText" Overridable="yes">El usuario podrá elegir las características de programa que se instalarán y dónde se instalarán. Recomendada para usuarios avanzados.</String>
214 <String Id="SetupTypeDlgCompleteText" Overridable="yes">Instalará todas las características del programa. Esta opción es la que más espacio en disco requiere.</String>
215
216 <String Id="UserExit_Title" Overridable="yes">Instalación de [ProductName]</String>
217 <String Id="UserExitBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
218 <String Id="UserExitTitle" Overridable="yes">{\WixUI_Font_Bigger}Se interrumpió el Asistente para la instalación de [ProductName].</String>
219 <String Id="UserExitDescription1" Overridable="yes">Se interrumpió la instalación de [ProductName]. El sistema no se ha modificado. Para instalar este programa más tarde, vuelva a ejecutar la instalación.</String>
220 <String Id="UserExitDescription2" Overridable="yes">Haga clic en el botón Finalizar para salir del Asistente para la instalación.</String>
221
222 <String Id="VerifyReadyDlg_Title" Overridable="yes">Instalación de [ProductName]</String>
223 <String Id="VerifyReadyDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
224 <String Id="VerifyReadyDlgInstall" Overridable="yes">&amp;Instalar</String>
225 <String Id="VerifyReadyDlgInstallText" Overridable="yes">Haga clic en Instalar para comenzar la instalación. Haga clic en Atrás para revisar o cambiar la configuración de la instalación. Haga clic en Cancelar para salir del asistente.</String>
226 <String Id="VerifyReadyDlgInstallTitle" Overridable="yes">{\WixUI_Font_Title}Listo para instalar [ProductName]</String>
227 <String Id="VerifyReadyDlgChange" Overridable="yes">&amp;Cambiar</String>
228 <String Id="VerifyReadyDlgChangeText" Overridable="yes">Haga clic en Cambiar para comenzar la instalación. Haga clic en Atrás para revisar o cambiar la configuración de la instalación. Haga clic en Cancelar para salir del asistente.</String>
229 <String Id="VerifyReadyDlgChangeTitle" Overridable="yes">{\WixUI_Font_Title}Listo para cambiar [ProductName]</String>
230 <String Id="VerifyReadyDlgRepair" Overridable="yes">Re&amp;parar</String>
231 <String Id="VerifyReadyDlgRepairText" Overridable="yes">Haga clic en Reparar para reparar la instalación de [ProductName]. Haga clic en Atrás para revisar o cambiar la configuración de la instalación. Haga clic en Cancelar para salir del asistente.</String>
232 <String Id="VerifyReadyDlgRepairTitle" Overridable="yes">{\WixUI_Font_Title}Listo para reparar [ProductName]</String>
233 <String Id="VerifyReadyDlgRemove" Overridable="yes">&amp;Quitar</String>
234 <String Id="VerifyReadyDlgRemoveText" Overridable="yes">Haga clic en Quitar para quitar [ProductName] de su equipo. Haga clic en Atrás para revisar o cambiar la configuración de la instalación. Haga clic en Cancelar para salir del asistente.</String>
235 <String Id="VerifyReadyDlgRemoveTitle" Overridable="yes">{\WixUI_Font_Title}Listo para quitar [ProductName]</String>
236 <String Id="VerifyReadyDlgUpdate" Overridable="yes">&amp;Actualizar</String>
237 <String Id="VerifyReadyDlgUpdateText" Overridable="yes">Haga clic en Actualizar para actualizar [ProductName] desde el equipo. Haga clic en Atrás para revisar o cambiar alguna de las opciones de instalación. Haga clic en Cancelar para salir del asistente.</String>
238 <String Id="VerifyReadyDlgUpdateTitle" Overridable="yes">{\WixUI_Font_Title}Listo para actualizar [ProductName]</String>
239
240 <String Id="WaitForCostingDlg_Title" Overridable="yes">Instalación de [ProductName]</String>
241 <String Id="WaitForCostingDlgReturn" Overridable="yes">&amp;Volver</String>
242 <String Id="WaitForCostingDlgText" Overridable="yes">Espere mientras el instalador determina los requisitos de espacio en disco.</String>
243 <String Id="WaitForCostingDlgIcon" Overridable="yes">WixUI_Ico_Exclam</String>
244 <String Id="WaitForCostingDlgIconTooltip" Overridable="yes">Icono de exclamación</String>
245
246 <String Id="WelcomeDlg_Title" Overridable="yes">Instalación de [ProductName]</String>
247 <String Id="WelcomeDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
248 <String Id="WelcomeDlgDescription" Overridable="yes">El Asistente para la instalación instalará [ProductName] en el equipo. Haga clic en Siguiente para continuar o en Cancelar para salir del asistente.</String>
249 <String Id="WelcomeUpdateDlgDescriptionUpdate" Overridable="yes">El Asistente para la instalación actualizará [ProductName] en el equipo. Haga clic en Siguiente para continuar o en Cancelar para salir del asistente.</String>
250 <String Id="WelcomeDlgTitle" Overridable="yes">{\WixUI_Font_Bigger}Asistente para la instalación de [ProductName]</String>
251
252 <String Id="WelcomeEulaDlg_Title" Overridable="yes">Instalación de [ProductName]</String>
253 <String Id="WelcomeEulaDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
254 <String Id="WelcomeEulaDlgLicenseAcceptedCheckBox" Overridable="yes">&amp;Acepto los términos del Contrato de licencia</String>
255 <String Id="WelcomeEulaDlgInstall" Overridable="yes">&amp;Instalar</String>
256 <String Id="WelcomeEulaDlgUpdate" Overridable="yes">&amp;Actualizar</String>
257 <String Id="WelcomeEulaDlgTitle" Overridable="yes">{\WixUI_Font_Title}Lea el Contrato de licencia de [ProductName]</String>
258
259 <String Id="ProgressTextInstallValidate" Overridable="yes">Validando la instalación</String>
260 <String Id="ProgressTextInstallFiles" Overridable="yes">Copiando archivos nuevos</String>
261 <String Id="ProgressTextInstallFilesTemplate" Overridable="yes">Archivo: [1], directorio: [9], tamaño: [6]</String>
262 <String Id="ProgressTextInstallAdminPackage" Overridable="yes">Copiando archivos de instalación de la red</String>
263 <String Id="ProgressTextInstallAdminPackageTemplate" Overridable="yes">Archivo: [1], directorio: [9], tamaño: [6]</String>
264 <String Id="ProgressTextFileCost" Overridable="yes">Calculando el espacio necesario</String>
265 <String Id="ProgressTextCostInitialize" Overridable="yes">Calculando el espacio necesario</String>
266 <String Id="ProgressTextCostFinalize" Overridable="yes">Calculando el espacio necesario</String>
267 <String Id="ProgressTextCreateShortcuts" Overridable="yes">Creando accesos directos</String>
268 <String Id="ProgressTextCreateShortcutsTemplate" Overridable="yes">Acceso directo: [1]</String>
269 <String Id="ProgressTextPublishComponents" Overridable="yes">Publicando componentes calificados</String>
270 <String Id="ProgressTextPublishComponentsTemplate" Overridable="yes">Id. de componente: [1], calificador: [2]</String>
271 <String Id="ProgressTextPublishFeatures" Overridable="yes">Publicando características del producto</String>
272 <String Id="ProgressTextPublishFeaturesTemplate" Overridable="yes">Característica: [1]</String>
273 <String Id="ProgressTextPublishProduct" Overridable="yes">Publicando información del producto</String>
274 <String Id="ProgressTextRegisterClassInfo" Overridable="yes">Registrando servidores de clases</String>
275 <String Id="ProgressTextRegisterClassInfoTemplate" Overridable="yes">Id. de clase: [1]</String>
276 <String Id="ProgressTextRegisterExtensionInfo" Overridable="yes">Registrando servidores de extensiones</String>
277 <String Id="ProgressTextRegisterExtensionInfoTemplate" Overridable="yes">Extensión: [1]</String>
278 <String Id="ProgressTextRegisterMIMEInfo" Overridable="yes">Registrando información MIME</String>
279 <String Id="ProgressTextRegisterMIMEInfoTemplate" Overridable="yes">Tipo de contenido MIME: [1], extensión: [2]</String>
280 <String Id="ProgressTextRegisterProgIdInfo" Overridable="yes">Registrando identificadores de programa</String>
281 <String Id="ProgressTextRegisterProgIdInfoTemplate" Overridable="yes">ProgID: [1]</String>
282 <String Id="ProgressTextAllocateRegistrySpace" Overridable="yes">Asignando espacio del Registro</String>
283 <String Id="ProgressTextAllocateRegistrySpaceTemplate" Overridable="yes">Espacio disponible: [1]</String>
284 <String Id="ProgressTextAppSearch" Overridable="yes">Buscando aplicaciones instaladas</String>
285 <String Id="ProgressTextAppSearchTemplate" Overridable="yes">Propiedad: [1], firma: [2]</String>
286 <String Id="ProgressTextBindImage" Overridable="yes">Enlazando archivos ejecutables</String>
287 <String Id="ProgressTextBindImageTemplate" Overridable="yes">Archivo: [1]</String>
288 <String Id="ProgressTextCCPSearch" Overridable="yes">Buscando productos certificados</String>
289 <String Id="ProgressTextCreateFolders" Overridable="yes">Creando carpetas</String>
290 <String Id="ProgressTextCreateFoldersTemplate" Overridable="yes">Carpeta: [1]</String>
291 <String Id="ProgressTextDeleteServices" Overridable="yes">Eliminando servicios</String>
292 <String Id="ProgressTextDeleteServicesTemplate" Overridable="yes">Servicio: [1]</String>
293 <String Id="ProgressTextDuplicateFiles" Overridable="yes">Creando archivos duplicados</String>
294 <String Id="ProgressTextDuplicateFilesTemplate" Overridable="yes">Archivo: [1], directorio: [9], tamaño: [6]</String>
295 <String Id="ProgressTextFindRelatedProducts" Overridable="yes">Buscando aplicaciones relacionadas</String>
296 <String Id="ProgressTextFindRelatedProductsTemplate" Overridable="yes">Se encontró la aplicación: [1]</String>
297 <String Id="ProgressTextInstallODBC" Overridable="yes">Instalando componentes ODBC</String>
298 <String Id="ProgressTextInstallServices" Overridable="yes">Instalando servicios nuevos</String>
299 <String Id="ProgressTextInstallServicesTemplate" Overridable="yes">Servicio: [2]</String>
300 <String Id="ProgressTextLaunchConditions" Overridable="yes">Evaluando las condiciones de inicio</String>
301 <String Id="ProgressTextMigrateFeatureStates" Overridable="yes">Migrando los estados de las características desde las aplicaciones relacionadas</String>
302 <String Id="ProgressTextMigrateFeatureStatesTemplate" Overridable="yes">Aplicación: [1]</String>
303 <String Id="ProgressTextMoveFiles" Overridable="yes">Moviendo archivos</String>
304 <String Id="ProgressTextMoveFilesTemplate" Overridable="yes">Archivo: [1], directorio: [9], tamaño: [6]</String>
305 <String Id="ProgressTextPatchFiles" Overridable="yes">Aplicando revisión a archivos</String>
306 <String Id="ProgressTextPatchFilesTemplate" Overridable="yes">Archivo: [1], directorio: [2], tamaño: [3]</String>
307 <String Id="ProgressTextProcessComponents" Overridable="yes">Actualizando el registro de componentes</String>
308 <String Id="ProgressTextRegisterComPlus" Overridable="yes">Registrando aplicaciones y componentes COM+</String>
309 <String Id="ProgressTextRegisterComPlusTemplate" Overridable="yes">Id. de aplicación: [1]{{, tipo de aplicación: [2], usuarios: [3], RSN: [4]}}</String>
310 <String Id="ProgressTextRegisterFonts" Overridable="yes">Registrando fuentes</String>
311 <String Id="ProgressTextRegisterFontsTemplate" Overridable="yes">Fuente: [1]</String>
312 <String Id="ProgressTextRegisterProduct" Overridable="yes">Registrando producto</String>
313 <String Id="ProgressTextRegisterProductTemplate" Overridable="yes">[1]</String>
314 <String Id="ProgressTextRegisterTypeLibraries" Overridable="yes">Registrando bibliotecas de tipos</String>
315 <String Id="ProgressTextRegisterTypeLibrariesTemplate" Overridable="yes">Id. de la biblioteca: [1]</String>
316 <String Id="ProgressTextRegisterUser" Overridable="yes">Registrando usuario</String>
317 <String Id="ProgressTextRegisterUserTemplate" Overridable="yes">[1]</String>
318 <String Id="ProgressTextRemoveDuplicateFiles" Overridable="yes">Quitando archivos duplicados</String>
319 <String Id="ProgressTextRemoveDuplicateFilesTemplate" Overridable="yes">Archivo: [1], directorio: [9]</String>
320 <String Id="ProgressTextRemoveEnvironmentStrings" Overridable="yes">Actualizando cadenas de entorno</String>
321 <String Id="ProgressTextRemoveEnvironmentStringsTemplate" Overridable="yes">Nombre: [1], valor: [2], acción [3]</String>
322 <String Id="ProgressTextRemoveExistingProducts" Overridable="yes">Quitando aplicaciones</String>
323 <String Id="ProgressTextRemoveExistingProductsTemplate" Overridable="yes">Aplicación: [1], línea de comandos: [2]</String>
324 <String Id="ProgressTextRemoveFiles" Overridable="yes">Quitando archivos</String>
325 <String Id="ProgressTextRemoveFilesTemplate" Overridable="yes">Archivo: [1], directorio: [9]</String>
326 <String Id="ProgressTextRemoveFolders" Overridable="yes">Quitando carpetas</String>
327 <String Id="ProgressTextRemoveFoldersTemplate" Overridable="yes">Carpeta: [1]</String>
328 <String Id="ProgressTextRemoveIniValues" Overridable="yes">Quitando entradas de archivos INI</String>
329 <String Id="ProgressTextRemoveIniValuesTemplate" Overridable="yes">Archivo: [1], sección: [2], clave: [3], valor: [4]</String>
330 <String Id="ProgressTextRemoveODBC" Overridable="yes">Quitando componentes ODBC</String>
331 <String Id="ProgressTextRemoveRegistryValues" Overridable="yes">Quitando valores del Registro del sistema</String>
332 <String Id="ProgressTextRemoveRegistryValuesTemplate" Overridable="yes">Clave: [1], nombre: [2]</String>
333 <String Id="ProgressTextRemoveShortcuts" Overridable="yes">Quitando accesos directos</String>
334 <String Id="ProgressTextRemoveShortcutsTemplate" Overridable="yes">Acceso directo: [1]</String>
335 <String Id="ProgressTextRMCCPSearch" Overridable="yes">Buscando productos certificados</String>
336 <String Id="ProgressTextSelfRegModules" Overridable="yes">Registrando módulos</String>
337 <String Id="ProgressTextSelfRegModulesTemplate" Overridable="yes">Archivo: [1], carpeta: [2]</String>
338 <String Id="ProgressTextSelfUnregModules" Overridable="yes">Eliminando módulos del Registro</String>
339 <String Id="ProgressTextSelfUnregModulesTemplate" Overridable="yes">Archivo: [1], carpeta: [2]</String>
340 <String Id="ProgressTextSetODBCFolders" Overridable="yes">Inicializando directorios ODBC</String>
341 <String Id="ProgressTextStartServices" Overridable="yes">Iniciando servicios</String>
342 <String Id="ProgressTextStartServicesTemplate" Overridable="yes">Servicio: [1]</String>
343 <String Id="ProgressTextStopServices" Overridable="yes">Deteniendo servicios</String>
344 <String Id="ProgressTextStopServicesTemplate" Overridable="yes">Servicio: [1]</String>
345 <String Id="ProgressTextUnpublishComponents" Overridable="yes">Cancelando la publicación de componentes calificados</String>
346 <String Id="ProgressTextUnpublishComponentsTemplate" Overridable="yes">Id. de componente: [1], calificador: [2]</String>
347 <String Id="ProgressTextUnpublishFeatures" Overridable="yes">Cancelando la publicación de características del producto</String>
348 <String Id="ProgressTextUnpublishFeaturesTemplate" Overridable="yes">Característica: [1]</String>
349 <String Id="ProgressTextUnregisterClassInfo" Overridable="yes">Eliminando del Registro los servidores de clases</String>
350 <String Id="ProgressTextUnregisterClassInfoTemplate" Overridable="yes">Id. de clase: [1]</String>
351 <String Id="ProgressTextUnregisterComPlus" Overridable="yes">Eliminando del Registro las aplicaciones y componentes COM+</String>
352 <String Id="ProgressTextUnregisterComPlusTemplate" Overridable="yes">Id. de aplicación: [1]{{, tipo de aplicación: [2]}}</String>
353 <String Id="ProgressTextUnregisterExtensionInfo" Overridable="yes">Eliminando del Registro los servidores de extensiones</String>
354 <String Id="ProgressTextUnregisterExtensionInfoTemplate" Overridable="yes">Extensión: [1]</String>
355 <String Id="ProgressTextUnregisterFonts" Overridable="yes">Eliminando del Registro las fuentes</String>
356 <String Id="ProgressTextUnregisterFontsTemplate" Overridable="yes">Fuente: [1]</String>
357 <String Id="ProgressTextUnregisterMIMEInfo" Overridable="yes">Eliminando del Registro la información MIME</String>
358 <String Id="ProgressTextUnregisterMIMEInfoTemplate" Overridable="yes">Tipo de contenido MIME: [1], extensión: [2]</String>
359 <String Id="ProgressTextUnregisterProgIdInfo" Overridable="yes">Eliminando del Registro los identificadores de programas</String>
360 <String Id="ProgressTextUnregisterProgIdInfoTemplate" Overridable="yes">ProgID: [1]</String>
361 <String Id="ProgressTextUnregisterTypeLibraries" Overridable="yes">Eliminando del Registro las bibliotecas de tipos</String>
362 <String Id="ProgressTextUnregisterTypeLibrariesTemplate" Overridable="yes">Id. de la biblioteca: [1]</String>
363 <String Id="ProgressTextWriteEnvironmentStrings" Overridable="yes">Actualizando cadenas de entorno</String>
364 <String Id="ProgressTextWriteEnvironmentStringsTemplate" Overridable="yes">Nombre: [1], valor: [2], acción [3]</String>
365 <String Id="ProgressTextWriteIniValues" Overridable="yes">Escribiendo valores de los archivos INI</String>
366 <String Id="ProgressTextWriteIniValuesTemplate" Overridable="yes">Archivo: [1], sección: [2], clave: [3], valor: [4]</String>
367 <String Id="ProgressTextWriteRegistryValues" Overridable="yes">Escribiendo valores del Registro del sistema</String>
368 <String Id="ProgressTextWriteRegistryValuesTemplate" Overridable="yes">Clave: [1], nombre: [2], valor: [3]</String>
369 <String Id="ProgressTextAdvertise" Overridable="yes">Anunciando aplicación</String>
370 <String Id="ProgressTextGenerateScript" Overridable="yes">Generando operaciones de script para la acción:</String>
371 <String Id="ProgressTextGenerateScriptTemplate" Overridable="yes">[1]</String>
372 <String Id="ProgressTextInstallSFPCatalogFile" Overridable="yes">Instalando catálogo del sistema</String>
373 <String Id="ProgressTextInstallSFPCatalogFileTemplate" Overridable="yes">Archivo: [1], dependencias: [2]</String>
374 <String Id="ProgressTextMsiPublishAssemblies" Overridable="yes">Publicando información de ensamblado</String>
375 <String Id="ProgressTextMsiPublishAssembliesTemplate" Overridable="yes">Contexto de aplicación:[1], nombre de ensamblado:[2]</String>
376 <String Id="ProgressTextMsiUnpublishAssemblies" Overridable="yes">Cancelando la publicación de información de ensamblado</String>
377 <String Id="ProgressTextMsiUnpublishAssembliesTemplate" Overridable="yes">Contexto de aplicación:[1], nombre de ensamblado:[2]</String>
378 <String Id="ProgressTextRollback" Overridable="yes">Revirtiendo la acción:</String>
379 <String Id="ProgressTextRollbackTemplate" Overridable="yes">[1]</String>
380 <String Id="ProgressTextRollbackCleanup" Overridable="yes">Quitando copias de seguridad</String>
381 <String Id="ProgressTextRollbackCleanupTemplate" Overridable="yes">Archivo: [1]</String>
382 <String Id="ProgressTextUnmoveFiles" Overridable="yes">Quitando archivos movidos</String>
383 <String Id="ProgressTextUnmoveFilesTemplate" Overridable="yes">Archivo: [1], directorio: [9]</String>
384 <String Id="ProgressTextUnpublishProduct" Overridable="yes">Cancelando la publicación de información del producto</String>
385
386 <String Id="Error0" Overridable="yes">{{Error irrecuperable: }}</String>
387 <String Id="Error1" Overridable="yes">{{Error [1]. }}</String>
388 <String Id="Error2" Overridable="yes">Advertencia [1]. </String>
389 <String Id="Error4" Overridable="yes">Información [1]. </String>
390 <String Id="Error5" Overridable="yes">El instalador encontró un error inesperado durante la instalación de este paquete. Esto puede indicar un problema con el paquete. El código de error es [1]. {{Los argumentos son: [2], [3], [4]}}</String>
391 <String Id="Error7" Overridable="yes">{{Disco lleno: }}</String>
392 <String Id="Error8" Overridable="yes">Acción [Time]: [1]. [2]</String>
393 <String Id="Error9" Overridable="yes">[ProductName]</String>
394 <String Id="Error10" Overridable="yes">{[2]}{, [3]}{, [4]}</String>
395 <String Id="Error11" Overridable="yes">Tipo de mensaje: [1], argumento: [2]</String>
396 <String Id="Error12" Overridable="yes">=== Registro iniciado: [Date] [Time] ===</String>
397 <String Id="Error13" Overridable="yes">=== Registro detenido: [Date] [Time] ===</String>
398 <String Id="Error14" Overridable="yes">La acción se inició a las [Time]: [1].</String>
399 <String Id="Error15" Overridable="yes">La acción terminó a las [Time]: [1]. Valor devuelto [2].</String>
400 <String Id="Error16" Overridable="yes">Quedan: {[1] minutos }{[2] segundos}</String>
401 <String Id="Error17" Overridable="yes">Memoria insuficiente. Cierre otras aplicaciones e inténtelo de nuevo.</String>
402 <String Id="Error18" Overridable="yes">El instalador no responde.</String>
403 <String Id="Error19" Overridable="yes">El instalador terminó antes de tiempo.</String>
404 <String Id="Error20" Overridable="yes">Espere mientras Windows configura [ProductName]</String>
405 <String Id="Error21" Overridable="yes">Obteniendo información necesaria...</String>
406 <String Id="Error22" Overridable="yes">Quitando versiones anteriores de esta aplicación...</String>
407 <String Id="Error23" Overridable="yes">Preparándose para quitar versiones anteriores de esta aplicación...</String>
408 <String Id="Error32" Overridable="yes">La instalación de {[ProductName] } se completó correctamente.</String>
409 <String Id="Error33" Overridable="yes">No se pudo instalar {[ProductName] }.</String>
410 <String Id="Error1101" Overridable="yes">Error al leer el archivo: [2]. {{ Error del sistema [3].}} Compruebe que el archivo existe y que puede obtener acceso a él.</String>
411 <String Id="Error1301" Overridable="yes">No se puede crear el archivo '[2]'. Ya existe un directorio con ese nombre. Cancele la instalación e intente realizarla en una ubicación distinta.</String>
412 <String Id="Error1302" Overridable="yes">Inserte el disco: [2]</String>
413 <String Id="Error1303" Overridable="yes">El instalador no dispone de privilegios suficientes para obtener acceso al directorio [2]. La instalación no puede continuar. Inicie sesión como administrador o póngase en contacto con el administrador del sistema.</String>
414 <String Id="Error1304" Overridable="yes">Error al escribir en el archivo [2]. Compruebe que dispone de acceso a ese directorio.</String>
415 <String Id="Error1305" Overridable="yes">Error al leer el archivo: [2]. {{ Error del sistema [3].}} Compruebe que el archivo existe y que puede obtener acceso a él.</String>
416 <String Id="Error1306" Overridable="yes">Otra aplicación tiene acceso exclusivo al archivo '[2]'. Cierre todas las demás aplicaciones y haga clic en Reintentar.</String>
417 <String Id="Error1307" Overridable="yes">No hay suficiente espacio en disco para instalar el archivo [2]. Libere espacio y haga clic en Reintentar, o bien haga clic en Cancelar para salir.</String>
418 <String Id="Error1308" Overridable="yes">No se encontró el archivo de origen [2]. Compruebe que el archivo existe y que tiene acceso a él.</String>
419 <String Id="Error1309" Overridable="yes">Error al leer el archivo: [3]. {{ Error del sistema [2].}} Compruebe que el archivo existe y que puede obtener acceso a él.</String>
420 <String Id="Error1310" Overridable="yes">Error al escribir en el archivo [3]. {{ Error del sistema [2].}} Compruebe que dispone de acceso a ese directorio.</String>
421 <String Id="Error1311" Overridable="yes">No se encontró el archivo de origen {{(archivo .CAB)}} [2]. Compruebe que el archivo existe y que tiene acceso a él.</String>
422 <String Id="Error1312" Overridable="yes">No se puede crear el directorio '[2]'. Ya existe un archivo con este nombre. Cambie el nombre del archivo o quítelo y haga clic en Reintentar, o bien haga clic en Cancelar para salir.</String>
423 <String Id="Error1313" Overridable="yes">El volumen [2] no está disponible en este momento. Seleccione otro volumen.</String>
424 <String Id="Error1314" Overridable="yes">La ruta de acceso especificada, '[2]', no está disponible.</String>
425 <String Id="Error1315" Overridable="yes">No se puede escribir en la carpeta especificada: [2].</String>
426 <String Id="Error1316" Overridable="yes">Error de red al intentar leer el archivo: [2]</String>
427 <String Id="Error1317" Overridable="yes">Error al intentar crear el directorio: [2]</String>
428 <String Id="Error1318" Overridable="yes">Error de red al intentar crear el directorio: [2]</String>
429 <String Id="Error1319" Overridable="yes">Error de red al intentar abrir el archivo .CAB de origen: [2]</String>
430 <String Id="Error1320" Overridable="yes">La ruta de acceso especificada es demasiado larga: [2]</String>
431 <String Id="Error1321" Overridable="yes">El instalador no tiene suficientes privilegios para modificar el archivo [2].</String>
432 <String Id="Error1322" Overridable="yes">Una parte de la ruta de acceso a la carpeta '[2]' no es válida. Puede que esté vacía o que supere la longitud máxima permitida por el sistema.</String>
433 <String Id="Error1323" Overridable="yes">La ruta de acceso a la carpeta '[2]' contiene palabras no válidas para rutas de acceso a carpetas.</String>
434 <String Id="Error1324" Overridable="yes">La ruta de acceso a la carpeta '[2]' contiene un carácter no válido.</String>
435 <String Id="Error1325" Overridable="yes">'[2]' no es un nombre corto de archivo válido.</String>
436 <String Id="Error1326" Overridable="yes">Error al obtener la seguridad del archivo: [3] GetLastError: [2]</String>
437 <String Id="Error1327" Overridable="yes">Unidad no válida: [2]</String>
438 <String Id="Error1328" Overridable="yes">Error al aplicar la revisión al archivo [2]. Probablemente el archivo se ha actualizado por otros medios y esta revisión ya no puede modificarlo. Para obtener más información, póngase en contacto con el proveedor de la revisión. {{Error del sistema: [3]}}</String>
439 <String Id="Error1329" Overridable="yes">No se puede instalar un archivo necesario porque el archivo .CAB [2] no está firmado digitalmente. Puede ser un síntoma de que el archivo .CAB está dañado.</String>
440 <String Id="Error1330" Overridable="yes">No se puede instalar un archivo necesario porque el archivo .CAB [2] tiene una firma digital no válida. Puede ser un síntoma de que el archivo .CAB está dañado.{{ WinVerifyTrust devolvió el error [3].}}</String>
441 <String Id="Error1331" Overridable="yes">No se pudo copiar correctamente el archivo [2]: error de CRC.</String>
442 <String Id="Error1332" Overridable="yes">No se pudo mover correctamente el archivo [2]: error de CRC.</String>
443 <String Id="Error1333" Overridable="yes">No se pudo aplicar correctamente la revisión al archivo [2]: error de CRC.</String>
444 <String Id="Error1334" Overridable="yes">No se puede instalar el archivo '[2]' porque no se encuentra en el archivo .CAB '[3]'. Esto puede indicar un error en la red, un error de lectura del CD-ROM o un problema con este paquete.</String>
445 <String Id="Error1335" Overridable="yes">El archivo .CAB '[2]' requerido por esta instalación está dañado y no puede usarse. Esto puede indicar un error en la red, un error de lectura del CD-ROM o un problema con este paquete.</String>
446 <String Id="Error1336" Overridable="yes">Error al crear un archivo temporal necesario para completar esta instalación.{{ Carpeta: [3]. Código de error del sistema: [2]}}</String>
447 <String Id="Error1401" Overridable="yes">No se pudo crear la clave [2]. {{ Error del sistema [3].}} Compruebe que dispone de suficientes permisos de acceso a esa clave o póngase en contacto con el personal de soporte técnico. </String>
448 <String Id="Error1402" Overridable="yes">No se pudo abrir la clave [2]. {{ Error del sistema [3].}} Compruebe que dispone de suficientes permisos de acceso a esa clave o póngase en contacto con el personal de soporte técnico. </String>
449 <String Id="Error1403" Overridable="yes">No se pudo eliminar el valor [2] de la clave [3]. {{Error del sistema [4].}} Compruebe que dispone de suficientes permisos de acceso a esa clave o póngase en contacto con el personal de soporte técnico. </String>
450 <String Id="Error1404" Overridable="yes">No se pudo eliminar la clave [2]. {{Error del sistema [3].}} Compruebe que dispone de suficientes permisos de acceso a esa clave o póngase en contacto con el personal de soporte técnico. </String>
451 <String Id="Error1405" Overridable="yes">No se pudo leer el valor [2] de la clave [3]. {{Error del sistema [4].}} Compruebe que dispone de suficientes permisos de acceso a esa clave o póngase en contacto con el personal de soporte técnico. </String>
452 <String Id="Error1406" Overridable="yes">No se pudo escribir el valor [2] en la clave [3]. {{Error del sistema [4].}} Compruebe que dispone de suficientes permisos de acceso a esa clave o póngase en contacto con el personal de soporte técnico.</String>
453 <String Id="Error1407" Overridable="yes">No se pudieron obtener los nombres de los valores para la clave [2]. {{Error del sistema [3].}} Compruebe que dispone de suficientes permisos de acceso a esa clave o póngase en contacto con el personal de soporte técnico.</String>
454 <String Id="Error1408" Overridable="yes">No se pudieron obtener los nombres de las subclaves de la clave [2]. {{Error del sistema [3].}} Compruebe que dispone de suficientes permisos de acceso a esa clave o póngase en contacto con el personal de soporte técnico.</String>
455 <String Id="Error1409" Overridable="yes">No se pudo leer la información de seguridad de la clave [2]. {{Error del sistema [3].}} Compruebe que dispone de suficientes permisos de acceso a esa clave o póngase en contacto con el personal de soporte técnico.</String>
456 <String Id="Error1410" Overridable="yes">No se pudo aumentar el espacio disponible en el Registro. Para instalar esta aplicación se requieren [2] KB de espacio disponible en el Registro.</String>
457 <String Id="Error1500" Overridable="yes">Ya hay otra instalación en curso. Debe completar esa instalación antes de continuar con esta.</String>
458 <String Id="Error1501" Overridable="yes">Error al obtener acceso a los datos protegidos. Asegúrese de que Windows Installer está configurado correctamente y vuelva a intentar la instalación.</String>
459 <String Id="Error1502" Overridable="yes">El usuario '[2]' ha iniciado previamente una instalación del producto '[3]'. Ese usuario deberá ejecutar de nuevo esa instalación para poder usar el producto. Ahora continuará la instalación actual.</String>
460 <String Id="Error1503" Overridable="yes">El usuario '[2]' ha iniciado previamente una instalación del producto '[3]'. Ese usuario deberá ejecutar de nuevo esa instalación para poder usar el producto.</String>
461 <String Id="Error1601" Overridable="yes">Espacio en disco insuficiente -- Volumen: '[2]'; espacio necesario: [3] KB; espacio disponible: [4] KB. Libere espacio en disco e inténtelo de nuevo.</String>
462 <String Id="Error1602" Overridable="yes">¿Está seguro de que desea cancelar?</String>
463 <String Id="Error1603" Overridable="yes">El archivo [2][3] está siendo utilizado{ por el siguiente proceso: nombre: [4], id.: [5], título de ventana: '[6]'}. Cierre la aplicación e inténtelo de nuevo.</String>
464 <String Id="Error1604" Overridable="yes">El producto [2] ya está instalado, lo que impide que se instale este producto, puesto que ambos son incompatibles entre sí.</String>
465 <String Id="Error1605" Overridable="yes">Espacio en disco insuficiente en el volumen '[2]' para continuar la instalación con recuperación habilitada. Se requieren [3] KB, pero solo [4] KB están disponibles. Haga clic en Ignorar para continuar con la instalación sin guardar la información de recuperación, haga clic en Reintentar para comprobar el espacio disponible de nuevo o haga clic en Cancelar para salir de la instalación.</String>
466 <String Id="Error1606" Overridable="yes">No se pudo obtener acceso a la ubicación de red [2].</String>
467 <String Id="Error1607" Overridable="yes">Se deben cerrar las siguientes aplicaciones antes de continuar con la instalación:</String>
468 <String Id="Error1608" Overridable="yes">No se encontró ningún producto compatible instalado en el equipo para poder instalar este producto.</String>
469 <String Id="Error1609" Overridable="yes">Error al aplicar la configuración de seguridad. [2] no es un usuario o grupo válido. Es posible que haya un problema con el paquete o no se pueda conectar al controlador de dominio en la red. Compruebe la conexión de red y haga clic en Reintentar, o haga clic en Cancelar para terminar la instalación. {{No se encuentra el SID del usuario, error del sistema [3]}}</String>
470 <String Id="Error1701" Overridable="yes">La clave [2] no es válida. Compruebe que ha escrito la clave correcta.</String>
471 <String Id="Error1702" Overridable="yes">El instalador debe reiniciar el sistema para que la configuración de [2] pueda continuar. Haga clic en Sí para reiniciar el sistema ahora o No si pretende reiniciarlo manualmente más tarde.</String>
472 <String Id="Error1703" Overridable="yes">Debe reiniciar el sistema para que los cambios de configuración efectuados en [2] surtan efecto. Haga clic en Sí para reiniciar el sistema ahora o elija No si tiene previsto reiniciarlo manualmente más tarde.</String>
473 <String Id="Error1704" Overridable="yes">Actualmente hay una instalación de [2] suspendida. Para continuar debe deshacer los cambios realizados por esa instalación. ¿Desea deshacer los cambios?</String>
474 <String Id="Error1705" Overridable="yes">Ya hay una instalación anterior de este producto en curso. Para continuar debe deshacer los cambios realizados por esa instalación. ¿Desea deshacer los cambios?</String>
475 <String Id="Error1706" Overridable="yes">No se encuentra un paquete de instalación del producto [2]. Vuelva a intentar la instalación usando una copia válida del paquete de instalación "[3]".</String>
476 <String Id="Error1707" Overridable="yes">La instalación se completó correctamente.</String>
477 <String Id="Error1708" Overridable="yes">No se puede realizar la instalación.</String>
478 <String Id="Error1709" Overridable="yes">Producto: [2] -- [3]</String>
479 <String Id="Error1710" Overridable="yes">Puede restaurar el equipo a su estado anterior o continuar con la instalación más tarde. ¿Desea restaurar el equipo?</String>
480 <String Id="Error1711" Overridable="yes">Error al escribir la información de instalación en el disco. Asegúrese de que dispone de suficiente espacio en disco y haga clic en Reintentar, o bien haga clic en Cancelar para terminar la instalación.</String>
481 <String Id="Error1712" Overridable="yes">No se encontraron uno o varios archivos necesarios para restaurar el equipo a su estado anterior. No es posible realizar la restauración.</String>
482 <String Id="Error1713" Overridable="yes">[2] no puede instalar uno de los productos necesarios. Póngase en contacto con el grupo de soporte técnico. {{Error del sistema: [3].}}</String>
483 <String Id="Error1714" Overridable="yes">No se puede quitar la versión anterior de [2]. Póngase en contacto con el grupo de soporte técnico. {{Error del sistema: [3].}}</String>
484 <String Id="Error1715" Overridable="yes">Instalado [2]</String>
485 <String Id="Error1716" Overridable="yes">Configurado [2]</String>
486 <String Id="Error1717" Overridable="yes">Quitado [2]</String>
487 <String Id="Error1718" Overridable="yes">La directiva de firmas digitales rechazó el archivo [2].</String>
488 <String Id="Error1719" Overridable="yes">No se pudo obtener acceso al servicio Windows Installer. Es posible que esto ocurra si está ejecutando Windows en modo seguro, o si Windows Installer no está correctamente instalado. Póngase en contacto con el personal de soporte técnico para obtener asistencia.</String>
489 <String Id="Error1720" Overridable="yes">Hay un problema con este paquete de Windows Installer. No se pudo ejecutar un script necesario para completar la instalación. Póngase en contacto con el personal de soporte técnico o con el proveedor del paquete. {{Acción personalizada [2], error de script [3], [4]: [5] línea [6], columna [7], [8] }}</String>
490 <String Id="Error1721" Overridable="yes">Hay un problema con este paquete de Windows Installer. No se pudo ejecutar un programa requerido para completar esta instalación. Póngase en contacto con el personal de soporte técnico o el proveedor del paquete. {{Acción: [2], ubicación: [3], comando: [4] }}</String>
491 <String Id="Error1722" Overridable="yes">Hay un problema con este paquete de Windows Installer. Un programa ejecutado como parte de la instalación no finalizó como se esperaba. Póngase en contacto con el personal de soporte técnico o con el proveedor del paquete. {{Acción [2], ubicación: [3], comando: [4] }}</String>
492 <String Id="Error1723" Overridable="yes">Hay un problema con este paquete de Windows Installer. No se pudo ejecutar un archivo DLL necesario para completar la instalación. Póngase en contacto con el personal de soporte técnico o con el proveedor del paquete. {{Acción: [2], entrada: [3], biblioteca: [4] }}</String>
493 <String Id="Error1724" Overridable="yes">La eliminación se completó correctamente.</String>
494 <String Id="Error1725" Overridable="yes">Error en la eliminación.</String>
495 <String Id="Error1726" Overridable="yes">El anuncio se completó correctamente.</String>
496 <String Id="Error1727" Overridable="yes">Error al anunciar.</String>
497 <String Id="Error1728" Overridable="yes">La configuración se completó correctamente.</String>
498 <String Id="Error1729" Overridable="yes">Error en la configuración.</String>
499 <String Id="Error1730" Overridable="yes">Debe ser un administrador para quitar esta aplicación. Para quitarla, inicie sesión como administrador o póngase en contacto con el grupo de soporte técnico para recibir ayuda.</String>
500 <String Id="Error1731" Overridable="yes">El paquete de instalación de origen del producto [2] no está sincronizado con el paquete del cliente. Vuelva a realizar la instalación utilizando una copia válida del paquete de instalación '[3]'.</String>
501 <String Id="Error1732" Overridable="yes">Debe reiniciar el equipo para completar la instalación de [2]. Otros usuarios tienen una sesión abierta en este equipo actualmente y es posible que pierdan su trabajo si lo reinicia. ¿Desea reiniciar ahora?</String>
502 <String Id="Error1801" Overridable="yes">La ruta de acceso [2] no es válida. Escriba una ruta de acceso válida.</String>
503 <String Id="Error1802" Overridable="yes">Memoria insuficiente. Cierre otras aplicaciones e inténtelo de nuevo.</String>
504 <String Id="Error1803" Overridable="yes">No hay ningún disco en la unidad [2]. Inserte uno y haga clic en Reintentar, o bien haga clic en Cancelar para volver al volumen previamente seleccionado.</String>
505 <String Id="Error1804" Overridable="yes">No hay ningún disco en la unidad [2]. Inserte uno y haga clic en Reintentar, o bien haga clic en Cancelar para volver al cuadro de diálogo Examinar y seleccionar un volumen distinto.</String>
506 <String Id="Error1805" Overridable="yes">La carpeta [2] no existe. Escriba una ruta de acceso a una carpeta existente.</String>
507 <String Id="Error1806" Overridable="yes">No dispone de privilegios suficientes para leer esta carpeta.</String>
508 <String Id="Error1807" Overridable="yes">No se pudo determinar una carpeta de destino válida para la instalación.</String>
509 <String Id="Error1901" Overridable="yes">Error al intentar leer la base de datos de instalación de origen: [2].</String>
510 <String Id="Error1902" Overridable="yes">Programando la operación de reinicio: se está cambiando el nombre del archivo [2] a [3]. Para completar la operación se debe reiniciar el equipo.</String>
511 <String Id="Error1903" Overridable="yes">Programando la operación de reinicio: se está eliminando el archivo [2]. Para completar la operación se debe reiniciar el equipo.</String>
512 <String Id="Error1904" Overridable="yes">No se pudo registrar el módulo [2]. HRESULT [3]. Póngase en contacto con el personal de soporte técnico.</String>
513 <String Id="Error1905" Overridable="yes">No se pudo eliminar el módulo [2] del Registro. HRESULT [3]. Póngase en contacto con el personal de soporte técnico.</String>
514 <String Id="Error1906" Overridable="yes">No se pudo almacenar el paquete [2] en la memoria caché. Error: [3]. Póngase en contacto con el personal de soporte técnico.</String>
515 <String Id="Error1907" Overridable="yes">No se pudo registrar la fuente [2]. Compruebe que dispone de suficientes permisos para instalar fuentes y que el sistema admite esta fuente.</String>
516 <String Id="Error1908" Overridable="yes">No se pudo eliminar del Registro la fuente [2]. Compruebe que dispone de suficientes permisos para quitar fuentes.</String>
517 <String Id="Error1909" Overridable="yes">No se pudo crear el acceso directo [2]. Compruebe que la carpeta de destino existe y que puede obtener acceso a ella.</String>
518 <String Id="Error1910" Overridable="yes">No se pudo quitar el acceso directo [2]. Compruebe que el archivo de acceso directo existe y que puede obtener acceso a él.</String>
519 <String Id="Error1911" Overridable="yes">No se pudo registrar la biblioteca de tipos para el archivo [2]. Póngase en contacto con el personal de soporte técnico.</String>
520 <String Id="Error1912" Overridable="yes">No se pudo eliminar del Registro la biblioteca de tipos del archivo [2]. Póngase en contacto con el personal de soporte técnico.</String>
521 <String Id="Error1913" Overridable="yes">No se pudo actualizar el archivo INI [2][3]. Compruebe que el archivo existe y que tiene acceso a él.</String>
522 <String Id="Error1914" Overridable="yes">No se pudo programar el archivo [2] para que reemplace al archivo [3] cuando se reinicie el sistema. Compruebe que dispone de permisos de escritura para el archivo [3].</String>
523 <String Id="Error1915" Overridable="yes">Error al quitar el administrador de controladores ODBC; error de ODBC [2]: [3]. Póngase en contacto con el personal de soporte técnico.</String>
524 <String Id="Error1916" Overridable="yes">Error al instalar el administrador de controladores ODBC; error de ODBC [2]: [3]. Póngase en contacto con el personal de soporte técnico.</String>
525 <String Id="Error1917" Overridable="yes">Error al quitar el controlador ODBC [4]; error de ODBC [2]: [3]. Compruebe que dispone de suficientes privilegios para quitar controladores ODBC.</String>
526 <String Id="Error1918" Overridable="yes">Error al instalar el controlador ODBC [4]; error de ODBC [2]: [3]. Compruebe que el archivo [4] existe y que puede obtener acceso a él.</String>
527 <String Id="Error1919" Overridable="yes">Error al configurar el origen de datos de ODBC [4]; error de ODBC [2]: [3]. Compruebe que el archivo [4] existe y que puede obtener acceso a él.</String>
528 <String Id="Error1920" Overridable="yes">No se pudo iniciar el servicio '[2]' ([3]). Compruebe que dispone de suficientes privilegios para iniciar servicios del sistema.</String>
529 <String Id="Error1921" Overridable="yes">No se pudo detener el servicio '[2]' ([3]). Compruebe que dispone de suficientes privilegios para detener servicios del sistema.</String>
530 <String Id="Error1922" Overridable="yes">No se pudo eliminar el servicio '[2]' ([3]). Compruebe que dispone de suficientes privilegios para quitar servicios del sistema.</String>
531 <String Id="Error1923" Overridable="yes">No se pudo instalar el servicio '[2]' ([3]). Compruebe que dispone de suficientes privilegios para instalar servicios del sistema.</String>
532 <String Id="Error1924" Overridable="yes">No se pudo actualizar la variable de entorno '[2]'. Compruebe que dispone de suficientes privilegios para modificar variables de entorno.</String>
533 <String Id="Error1925" Overridable="yes">No dispone de privilegios suficientes para completar esta instalación para todos los usuarios del equipo. Inicie sesión como administrador y vuelva a ejecutar la instalación.</String>
534 <String Id="Error1926" Overridable="yes">No se pudo establecer la seguridad del archivo '[3]'. Error: [2]. Compruebe que dispone de suficientes privilegios para modificar los permisos de seguridad de este archivo.</String>
535 <String Id="Error1927" Overridable="yes">Los servicios de componentes (COM+ 1.0) no están instalados en este sistema. Estos servicios de componentes son necesarios para que la instalación se complete correctamente. Encontrará dichos servicios en Windows 2000.</String>
536 <String Id="Error1928" Overridable="yes">Error al registrar la aplicación COM+. Póngase en contacto con el personal de soporte técnico para obtener más información.</String>
537 <String Id="Error1929" Overridable="yes">Error al eliminar la aplicación COM+ del Registro. Póngase en contacto con el personal de soporte técnico para obtener más información.</String>
538 <String Id="Error1930" Overridable="yes">No se pudo cambiar la descripción del servicio "[2]" ([3]).</String>
539 <String Id="Error1931" Overridable="yes">El servicio Windows Installer no puede actualizar el archivo de sistema [2] porque está protegido por Windows. Puede que necesite actualizar el sistema operativo para que este programa funcione correctamente. {{Versión de paquete: [3], versión protegida del sistema operativo: [4]}}</String>
540 <String Id="Error1932" Overridable="yes">El servicio Windows Installer no puede actualizar el archivo protegido de Windows [2]. {{Versión de paquete: [3], versión protegida del SO: [4], error SFP: [5]}}</String>
541 <String Id="Error1933" Overridable="yes">El servicio Windows Installer no puede actualizar uno o varios de los archivos protegidos de Windows. {{Error SFP: [2]. Lista de archivos protegidos:\r\n[3]}}</String>
542 <String Id="Error1934" Overridable="yes">Las instalaciones de usuario están deshabilitadas debido a la directiva del equipo.</String>
543 <String Id="Error1935" Overridable="yes">Error durante la instalación del ensamblado '[6]'. Consulte la Ayuda y soporte técnico para obtener más información. HRESULT: [3]. {{interfaz de ensamblado: [4], función: [5], componente: [2]}}</String>
544 <String Id="Error1936" Overridable="yes">Error al instalar el ensamblado '[6]'. El ensamblado no tiene un nombre seguro o no está firmado con la longitud de clave mínima. HRESULT: [3]. {{interfaz de ensamblado: [4], función: [5], componente: [2]}}</String>
545 <String Id="Error1937" Overridable="yes">Error al instalar el ensamblado '[6]'. No se pudo comprobar la firma o el catálogo, o no son válidos. HRESULT: [3]. {{interfaz de ensamblado: [4], función: [5], componente: [2]}}</String>
546 <String Id="Error1938" Overridable="yes">Error al instalar el ensamblado '[6]'. No se encontró uno o más módulos del ensamblado. HRESULT: [3]. {{interfaz de ensamblado: [4], función: [5], componente: [2]}}</String>
547
548 <String Id="UITextbytes" Overridable="yes">Bytes</String>
549 <String Id="UITextGB" Overridable="yes">GB</String>
550 <String Id="UITextKB" Overridable="yes">KB</String>
551 <String Id="UITextMB" Overridable="yes">MB</String>
552 <String Id="UITextMenuAbsent" Overridable="yes">La característica completa no estará disponible.</String>
553 <String Id="UITextMenuAdvertise" Overridable="yes">La característica se instalará cuando se solicite.</String>
554 <String Id="UITextMenuAllCD" Overridable="yes">La característica completa se instalará para ejecutarse desde el CD.</String>
555 <String Id="UITextMenuAllLocal" Overridable="yes">La característica completa se instalará en la unidad de disco duro local.</String>
556 <String Id="UITextMenuAllNetwork" Overridable="yes">La característica completa se instalará para ejecutarse desde la red.</String>
557 <String Id="UITextMenuCD" Overridable="yes">Se instalará para ejecutarse desde el CD.</String>
558 <String Id="UITextMenuLocal" Overridable="yes">Se instalará en la unidad de disco duro local.</String>
559 <String Id="UITextMenuNetwork" Overridable="yes">Se instalará para ejecutarse desde la red.</String>
560 <String Id="UITextNewFolder" Overridable="yes">Carpeta|Carpeta nueva</String>
561 <String Id="UITextScriptInProgress" Overridable="yes">Obteniendo información necesaria...</String>
562 <String Id="UITextSelAbsentAbsent" Overridable="yes">Esta característica no se instalará.</String>
563 <String Id="UITextSelAbsentAdvertise" Overridable="yes">Esta característica se configurará para instalarse cuando se solicite.</String>
564 <String Id="UITextSelAbsentCD" Overridable="yes">Esta característica se instalará para ejecutarse desde el CD.</String>
565 <String Id="UITextSelAbsentLocal" Overridable="yes">Esta característica se instalará en la unidad de disco duro local.</String>
566 <String Id="UITextSelAbsentNetwork" Overridable="yes">Esta característica se instalará para ejecutarse desde la red.</String>
567 <String Id="UITextSelAdvertiseAbsent" Overridable="yes">Esta característica dejará de estar disponible.</String>
568 <String Id="UITextSelAdvertiseAdvertise" Overridable="yes">Se instalará cuando se solicite.</String>
569 <String Id="UITextSelAdvertiseCD" Overridable="yes">Esta característica estará disponible para ejecutarse desde el CD.</String>
570 <String Id="UITextSelAdvertiseLocal" Overridable="yes">Esta característica se instalará en la unidad de disco duro local.</String>
571 <String Id="UITextSelAdvertiseNetwork" Overridable="yes">Esta característica estará disponible para ejecutarse desde la red.</String>
572 <String Id="UITextSelCDAbsent" Overridable="yes">Esta característica se desinstalará por completo y no podrá ejecutarla desde el CD.</String>
573 <String Id="UITextSelCDAdvertise" Overridable="yes">Esta característica dejará de ejecutarse desde el CD y se instalará cuando se solicite.</String>
574 <String Id="UITextSelCDCD" Overridable="yes">Esta característica continuará ejecutándose desde el CD.</String>
575 <String Id="UITextSelCDLocal" Overridable="yes">Esta característica dejará de ejecutarse desde el CD y se instalará en la unidad de disco duro local.</String>
576 <String Id="UITextSelChildCostNeg" Overridable="yes">Esta característica libera [1] del disco duro.</String>
577 <String Id="UITextSelChildCostPos" Overridable="yes">Esta característica necesita [1] del disco duro.</String>
578 <String Id="UITextSelCostPending" Overridable="yes">Calculando el espacio necesario para esta característica...</String>
579 <String Id="UITextSelLocalAbsent" Overridable="yes">Esta característica se quitará por completo.</String>
580 <String Id="UITextSelLocalAdvertise" Overridable="yes">Esta característica se quitará del disco duro local, pero se configurará para instalarse cuando se solicite.</String>
581 <String Id="UITextSelLocalCD" Overridable="yes">Esta característica se quitará de la unidad de disco duro local, pero podrá ejecutarse desde el CD.</String>
582 <String Id="UITextSelLocalLocal" Overridable="yes">Esta característica permanecerá en la unidad de disco duro local.</String>
583 <String Id="UITextSelLocalNetwork" Overridable="yes">Esta característica se quitará de la unidad de disco duro local, pero podrá ejecutarse desde la red.</String>
584 <String Id="UITextSelNetworkAbsent" Overridable="yes">Esta característica se desinstalará por completo y no podrá ejecutarla desde la red.</String>
585 <String Id="UITextSelNetworkAdvertise" Overridable="yes">Esta característica dejará de ejecutarse desde la red y se instalará cuando se solicite.</String>
586 <String Id="UITextSelNetworkLocal" Overridable="yes">Esta característica dejará de ejecutarse desde la red y se instalará en la unidad de disco duro local.</String>
587 <String Id="UITextSelNetworkNetwork" Overridable="yes">Esta característica se podrá ejecutar desde la red.</String>
588 <String Id="UITextSelParentCostNegNeg" Overridable="yes">Esta característica libera [1] del disco duro. Tiene [2] de [3] subcaracterísticas seleccionadas. Las subcaracterísticas liberan [4] del disco duro.</String>
589 <String Id="UITextSelParentCostNegPos" Overridable="yes">Esta característica libera [1] del disco duro. Tiene [2] de [3] subcaracterísticas seleccionadas. Las subcaracterísticas necesitan [4] del disco duro.</String>
590 <String Id="UITextSelParentCostPosNeg" Overridable="yes">Esta característica necesita [1] del disco duro. Tiene [2] de [3] subcaracterísticas seleccionadas. Las subcaracterísticas liberan [4] del disco duro.</String>
591 <String Id="UITextSelParentCostPosPos" Overridable="yes">Esta característica necesita [1] del disco duro. Tiene [2] de [3] subcaracterísticas seleccionadas. Las subcaracterísticas necesitan [4] del disco duro.</String>
592 <String Id="UITextTimeRemaining" Overridable="yes">Quedan: {[1] minutos }{[2] segundos}</String>
593 <String Id="UITextVolumeCostAvailable" Overridable="yes">Disponible</String>
594 <String Id="UITextVolumeCostDifference" Overridable="yes">Diferencia</String>
595 <String Id="UITextVolumeCostRequired" Overridable="yes">Necesario</String>
596 <String Id="UITextVolumeCostSize" Overridable="yes">Tamaño del disco</String>
597 <String Id="UITextVolumeCostVolume" Overridable="yes">Volumen</String>
598</WixLocalization>
diff --git a/src/ext/UI/wixlib/WixUI_et-EE.wxl b/src/ext/UI/wixlib/WixUI_et-EE.wxl
new file mode 100644
index 00000000..f437caf1
--- /dev/null
+++ b/src/ext/UI/wixlib/WixUI_et-EE.wxl
@@ -0,0 +1,598 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3
4
5<WixLocalization Culture="et-ee" Codepage="1257" xmlns="http://wixtoolset.org/schemas/v4/wxl">
6 <String Id="WixUIBack" Overridable="yes">&amp;Tagasi</String>
7 <String Id="WixUINext" Overridable="yes">&amp;Edasi</String>
8 <String Id="WixUICancel" Overridable="yes">Loobu</String>
9 <String Id="WixUIFinish" Overridable="yes">&amp;Lõpeta</String>
10 <String Id="WixUIRetry" Overridable="yes">&amp;Proovi uuesti</String>
11 <String Id="WixUIIgnore" Overridable="yes">&amp;Ignoreeri</String>
12 <String Id="WixUIYes" Overridable="yes">&amp;Jah</String>
13 <String Id="WixUINo" Overridable="yes">&amp;Ei</String>
14 <String Id="WixUIOK" Overridable="yes">OK</String>
15 <String Id="WixUIPrint" Overridable="yes">&amp;Prindi</String>
16
17 <String Id="AdvancedWelcomeEulaDlg_Title" Overridable="yes">Toote [ProductName] install</String>
18 <String Id="AdvancedWelcomeEulaDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
19 <String Id="AdvancedWelcomeEulaDlgTitle" Overridable="yes">{\WixUI_Font_Title}Lugege toote [ProductName] litsentsilepingut</String>
20 <String Id="AdvancedWelcomeEulaDlgLicenseAcceptedCheckBox" Overridable="yes">&amp;Nõustun litsentsilepingu tingimustega</String>
21 <String Id="AdvancedWelcomeEulaDlgDescriptionPerMachine" Overridable="yes">Klõpsake käsku Installi toote installimiseks vaikesätetega kõigile kasutajatele. Klõpsake suvandit Täpsemalt installimissuvandite muutmiseks.</String>
22 <String Id="AdvancedWelcomeEulaDlgDescriptionPerUser" Overridable="yes">Klõpsake Installi toote installimiseks vaikesätetega ainult teie jaoks. Klõpsake Täpsemalt installimissuvandite muutmiseks.</String>
23 <String Id="AdvancedWelcomeEulaDlgInstall" Overridable="yes">&amp;Installi</String>
24 <String Id="AdvancedWelcomeEulaDlgAdvanced" Overridable="yes">T&amp;äpsemalt</String>
25 <String Id="Advanced_Font_Normal_Size" Overridable="yes">8</String>
26 <String Id="Advanced_Font_Bigger_Size" Overridable="yes">12</String>
27 <String Id="Advanced_Font_Title_Size" Overridable="yes">9</String>
28 <String Id="Advanced_Font_Emphasized_Size" Overridable="yes">8</String>
29 <String Id="Advanced_Font_FaceName" Overridable="yes">tahoma</String>
30
31 <String Id="BrowseDlg_Title" Overridable="yes">Toote [ProductName] install</String>
32 <String Id="BrowseDlgComboLabel" Overridable="yes">&amp;Vaata:</String>
33 <String Id="BrowseDlgWixUI_Bmp_Up" Overridable="yes">WixUI_Bmp_Up</String>
34 <String Id="BrowseDlgWixUI_Bmp_UpTooltip" Overridable="yes">Taseme võrra üles</String>
35 <String Id="BrowseDlgNewFolder" Overridable="yes">WixUI_Bmp_New</String>
36 <String Id="BrowseDlgNewFolderTooltip" Overridable="yes">Loo uus kaust</String>
37 <String Id="BrowseDlgPathLabel" Overridable="yes">&amp;Kausta nimi:</String>
38 <String Id="BrowseDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
39 <String Id="BrowseDlgDescription" Overridable="yes">Liikuge sirvides soovitud sihtkausta juurde</String>
40 <String Id="BrowseDlgTitle" Overridable="yes">{\WixUI_Font_Title}Sihtkausta muutmine</String>
41
42 <String Id="CancelDlg_Title" Overridable="yes">Toote [ProductName] install</String>
43 <String Id="CancelDlgText" Overridable="yes">Kas soovite kindlasti rakenduse [ProductName] installist loobuda?</String>
44 <String Id="CancelDlgIcon" Overridable="yes">WixUI_Ico_Info</String>
45 <String Id="CancelDlgIconTooltip" Overridable="yes">Teabeikoon</String>
46
47 <String Id="CustomizeDlg_Title" Overridable="yes">Toote [ProductName] install</String>
48 <String Id="CustomizeDlgTree" Overridable="yes">Valikupuu</String>
49 <String Id="CustomizeDlgBrowse" Overridable="yes">S&amp;irvimine...</String>
50 <String Id="CustomizeDlgReset" Overridable="yes">Läh&amp;htestus</String>
51 <String Id="CustomizeDlgDiskCost" Overridable="yes">Ketta &amp;kasutus</String>
52 <String Id="CustomizeDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
53 <String Id="CustomizeDlgText" Overridable="yes">Klõpsake ikoone alloleval puul funktsioonide installimise viisi muutmiseks.</String>
54 <String Id="CustomizeDlgDescription" Overridable="yes">Valige soovitud funktsioonide installimise viis.</String>
55 <String Id="CustomizeDlgTitle" Overridable="yes">{\WixUI_Font_Title}Kohandatud install</String>
56 <String Id="CustomizeDlgItemDescription" Overridable="yes">CustomizeDlgItemDescription-CustomizeDlgItemDescription</String>
57 <String Id="CustomizeDlgItemSize" Overridable="yes">CustomizeDlgItemSize-CustomizeDlgItemSize</String>
58 <String Id="CustomizeDlgLocation" Overridable="yes">CustomizeDlgLocation-CustomizeDlgLocation</String>
59 <String Id="CustomizeDlgLocationLabel" Overridable="yes">Asukoht:</String>
60
61 <String Id="DiskCostDlg_Title" Overridable="yes">Toote [ProductName] install</String>
62 <String Id="DiskCostDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
63 <String Id="DiskCostDlgText" Overridable="yes">Esiletõstetud draividel pole valitud funktsioonide jaoks piisavalt vaba kettaruumi. Võite mõne faili esiletõstetud draividelt eemaldada, installida vähem funktsioone või valida mõne muu sihtdraivi.</String>
64 <String Id="DiskCostDlgDescription" Overridable="yes">Valitud funktsioonide installimiseks vajalik kettaruum.</String>
65 <String Id="DiskCostDlgTitle" Overridable="yes">{\WixUI_Font_Title}Kettaruumi nõuded</String>
66 <String Id="DiskCostDlgVolumeList" Overridable="yes">{120}{70}{70}{70}{70}</String>
67
68 <String Id="ErrorDlg_Title" Overridable="yes">Toote [ProductName] install</String>
69 <String Id="ErrorDlgErrorText" Overridable="yes">Teabetekst</String>
70 <String Id="ErrorDlgErrorIcon" Overridable="yes">WixUI_Ico_Info</String>
71 <String Id="ErrorDlgErrorIconTooltip" Overridable="yes">Teabeikoon</String>
72
73 <String Id="ExitDialog_Title" Overridable="yes">Toote [ProductName] install</String>
74 <String Id="ExitDialogBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
75 <String Id="ExitDialogDescription" Overridable="yes">Klõpsake installiviisardist väljumiseks nupul Lõpeta.</String>
76 <String Id="ExitDialogTitle" Overridable="yes">{\WixUI_Font_Bigger}Toote [ProductName] installiviisard on lõpetanud</String>
77
78 <String Id="FatalError_Title" Overridable="yes">Toote [ProductName] install</String>
79 <String Id="FatalErrorBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
80 <String Id="FatalErrorTitle" Overridable="yes">{\WixUI_Font_Bigger}Toote [ProductName] installiviisard peatus enneaegselt</String>
81 <String Id="FatalErrorDescription1" Overridable="yes">Toote [ProductName] installiviisard peatus tõrke tõttu enneaegselt. Teie süsteemi pole muudetud. Kui soovite programmi hiljem installida, käivitage installiviisard uuesti.</String>
82 <String Id="FatalErrorDescription2" Overridable="yes">Klõpsake installiviisardist väljumiseks nupul Lõpeta.</String>
83
84 <String Id="FeaturesDlg_Title" Overridable="yes">Toote [ProductName] install</String>
85 <String Id="FeaturesDlgTree" Overridable="yes">Toote funktsioonid</String>
86 <String Id="FeaturesDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
87 <String Id="FeaturesDlgDescription" Overridable="yes">Valige soovitud funktsioonide installimise viis.</String>
88 <String Id="FeaturesDlgTitle" Overridable="yes">{\WixUI_Font_Title}Toote funktsioonid</String>
89 <String Id="FeaturesDlgItemDescription" Overridable="yes">FeaturesDlgItemDescription</String>
90 <String Id="FeaturesDlgItemSize" Overridable="yes">FeaturesDlgItemSize</String>
91 <String Id="FeaturesDlgInstall" Overridable="yes">&amp;Installi</String>
92 <String Id="FeaturesDlgChange" Overridable="yes">&amp;Muuda</String>
93
94 <String Id="FilesInUse_Title" Overridable="yes">Toote [ProductName] install</String>
95 <String Id="FilesInUseExit" Overridable="yes">V&amp;älju</String>
96 <String Id="FilesInUseBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
97 <String Id="FilesInUseText" Overridable="yes">Järgmised rakendused kasutavad faile, mida see installiprogramm peab värskendama. Sulgege need rakendused ja klõpsake siis installimise jätkamiseks käsul &amp;Proovi uuesti või väljumiseks käsul Välju.</String>
98 <String Id="FilesInUseDescription" Overridable="yes">Mõni värskendamist vajav fail on praegu kasutusel.</String>
99 <String Id="FilesInUseTitle" Overridable="yes">{\WixUI_Font_Title}Kasutuses olevad failid</String>
100
101 <String Id="InstallDirDlg_Title" Overridable="yes">Toote [ProductName] install</String>
102 <String Id="InstallDirDlgChange" Overridable="yes">&amp;Muuda ...</String>
103 <String Id="InstallDirDlgTitle" Overridable="yes">{\WixUI_Font_Title}Sihtkaust</String>
104 <String Id="InstallDirDlgDescription" Overridable="yes">Klõpsake suvandit Järgmine vaikekausta installimiseks või suvandit Muuda teise sihtkoha valimiseks.</String>
105 <String Id="InstallDirDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
106 <String Id="InstallDirDlgFolderLabel" Overridable="yes">Installi toode [ProductName] asukohta:</String>
107
108 <String Id="InstallScopeDlg_Title" Overridable="yes">Toote [ProductName] install</String>
109 <String Id="InstallScopeDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
110 <String Id="InstallScopeDlgDescription" Overridable="yes">Valige installimise ulatus ja kaust</String>
111 <String Id="InstallScopeDlgTitle" Overridable="yes">{\WixUI_Font_Title}Installimise ulatus</String>
112 <String Id="InstallScopeDlgPerUser" Overridable="yes">{\WixUI_Font_Emphasized}Installimine &amp;ainult teie jaoks ([LogonUser])</String>
113 <String Id="InstallScopeDlgPerUserDescription" Overridable="yes">Toode [ProductName] installitakse kasutajapõhisesse kausta ja see on saadaval ainult teie kasutajakontole. Teil ei ole vaja kohaliku administraatori õigusi.</String>
114 <String Id="InstallScopeDlgNoPerUserDescription" Overridable="yes">Toode [ProductName] ei toeta kasutajapõhist installimist.</String>
115 <String Id="InstallScopeDlgPerMachine" Overridable="yes">{\WixUI_Font_Emphasized}Installi kõigile kasutajatele sellel &amp;seadmel</String>
116 <String Id="InstallScopeDlgPerMachineDescription" Overridable="yes">Toode [ProductName] installitakse vaikimisi seadmepõhisesse kausta ja see on saadaval kõigile kasutajatele. Saate vaikeinstalli kausta muuta. Teil peavad olema kohaliku administraatori õigused.</String>
117 <String Id="InstallScopeDlgFolderLabel" Overridable="yes">Installi&amp;kaust:</String>
118 <String Id="InstallScopeDlgChange" Overridable="yes">&amp;Muuda ...</String>
119
120 <String Id="InvalidDirDlg_Title" Overridable="yes">Toote [ProductName] install</String>
121 <String Id="InvalidDirDlgText" Overridable="yes">Installikaust peab asuma kohalikul kõvakettal.</String>
122 <String Id="InvalidDirDlgIcon" Overridable="yes">WixUI_Ico_Info</String>
123 <String Id="InvalidDirDlgIconTooltip" Overridable="yes">Teabeikoon</String>
124
125 <String Id="LicenseAgreementDlg_Title" Overridable="yes">Toote [ProductName] install</String>
126 <String Id="LicenseAgreementDlgLicenseAcceptedCheckBox" Overridable="yes">&amp;Nõustun litsentsilepingu tingimustega</String>
127 <String Id="LicenseAgreementDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
128 <String Id="LicenseAgreementDlgDescription" Overridable="yes">Palun lugege alltoodud litsentsileping hoolikalt läbi</String>
129 <String Id="LicenseAgreementDlgTitle" Overridable="yes">{\WixUI_Font_Title}Lõppkasutaja litsentsileping</String>
130
131 <String Id="MaintenanceTypeDlg_Title" Overridable="yes">Toote [ProductName] install</String>
132 <String Id="MaintenanceTypeDlgChangeButton" Overridable="yes">&amp;Muuda</String>
133 <String Id="MaintenanceTypeDlgChangeButtonTooltip" Overridable="yes">Muuda installi</String>
134 <String Id="MaintenanceTypeDlgRepairButton" Overridable="yes">&amp;Paranda</String>
135 <String Id="MaintenanceTypeDlgRepairButtonTooltip" Overridable="yes">Paranda install</String>
136 <String Id="MaintenanceTypeDlgRemoveButton" Overridable="yes">&amp;Eemalda</String>
137 <String Id="MaintenanceTypeDlgRemoveButtonTooltip" Overridable="yes">Eemalda install</String>
138 <String Id="MaintenanceTypeDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
139 <String Id="MaintenanceTypeDlgDescription" Overridable="yes">Valige toiming, mida soovite teha.</String>
140 <String Id="MaintenanceTypeDlgTitle" Overridable="yes">{\WixUI_Font_Title}Installi muutmine, parandamine või eemaldamine</String>
141 <String Id="MaintenanceTypeDlgChangeText" Overridable="yes">Saate muuta funktsioonide installimise viisi.</String>
142 <String Id="MaintenanceTypeDlgChangeDisabledText" Overridable="yes">Tootel [ProductName] pole sõltumatult valitavaid funktsioone.</String>
143 <String Id="MaintenanceTypeDlgRemoveText" Overridable="yes">Eemaldab toote [ProductName] teie arvutist.</String>
144 <String Id="MaintenanceTypeDlgRemoveDisabledText" Overridable="yes">Toodet [ProductName] ei saa eemaldada.</String>
145 <String Id="MaintenanceTypeDlgRepairText" Overridable="yes">Parandab viimase installimise tõrked, lahendades probleemid puuduvate või rikutud failide ja andmete, otseteede ja registrikirjete osas.</String>
146 <String Id="MaintenanceTypeDlgRepairDisabledText" Overridable="yes">Toodet [ProductName] ei saa parandada.</String>
147
148 <String Id="MaintenanceWelcomeDlg_Title" Overridable="yes">Toote [ProductName] install</String>
149 <String Id="MaintenanceWelcomeDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
150 <String Id="MaintenanceWelcomeDlgDescription" Overridable="yes">Installiviisard võimaldab muuta toote [ProductName] funktsioonide installimise viisi teie arvutis või selle arvutist eemaldada. Jätkamiseks klõpsake käsul Edasi või installiviisardist väljumiseks käsul Loobu.</String>
151 <String Id="MaintenanceWelcomeDlgTitle" Overridable="yes">{\WixUI_Font_Bigger}Tere tulemast toote [ProductName] installiviisardisse!</String>
152
153 <String Id="MsiRMFilesInUse_Title" Overridable="yes">Toote [ProductName] install</String>
154 <String Id="MsiRMFilesInUseBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
155 <String Id="MsiRMFilesInUseText" Overridable="yes">Järgmised rakendused kasutavad faile, mida see installiprogramm peab värskendama. Võite lasta installiviisardil need sulgeda ja uuesti käivitada või taaskäivitada arvuti hiljem.</String>
156 <String Id="MsiRMFilesInUseDescription" Overridable="yes">Mõni värskendamist vajav fail on praegu kasutusel.</String>
157 <String Id="MsiRMFilesInUseTitle" Overridable="yes">{\WixUI_Font_Title}Kasutuses olevad failid</String>
158 <String Id="MsiRMFilesInUseUseRM" Overridable="yes">&amp;Sulgege rakendused ja proovige need uuesti käivitada.</String>
159 <String Id="MsiRMFilesInUseDontUseRM" Overridable="yes">&amp;Ärge sulgege rakendusi. Arvuti tuleb taaskäivitada.</String>
160
161 <String Id="OutOfDiskDlg_Title" Overridable="yes">Toote [ProductName] install</String>
162 <String Id="OutOfDiskDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
163 <String Id="OutOfDiskDlgText" Overridable="yes">Esiletõstetud draividel pole praegu valitud funktsioonide jaoks piisavalt vaba kettaruumi. Võite mõne faili esiletõstetud draividelt eemaldada, installida vähem funktsioone või valida mõne muu sihtdraivi.</String>
164 <String Id="OutOfDiskDlgDescription" Overridable="yes">Installimiseks on vaja rohkem kettaruumi kui praegu saadaval.</String>
165 <String Id="OutOfDiskDlgTitle" Overridable="yes">{\WixUI_Font_Title}Kettaruum on otsas</String>
166 <String Id="OutOfDiskDlgVolumeList" Overridable="yes">{120}{70}{70}{70}{70}</String>
167
168 <String Id="OutOfRbDiskDlg_Title" Overridable="yes">Toote [ProductName] install</String>
169 <String Id="OutOfRbDiskDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
170 <String Id="OutOfRbDiskDlgText" Overridable="yes">Esiletõstetud draividel pole praegu valitud funktsioonide jaoks piisavalt vaba kettaruumi. Võite mõne faili esiletõstetud draividelt eemaldada, installida vähem funktsioone või valida mõne muu sihtdraivi.</String>
171 <String Id="OutOfRbDiskDlgDescription" Overridable="yes">Installimiseks on vaja rohkem kettaruumi kui praegu saadaval.</String>
172 <String Id="OutOfRbDiskDlgTitle" Overridable="yes">{\WixUI_Font_Title}Kettaruum on otsas</String>
173 <String Id="OutOfRbDiskDlgVolumeList" Overridable="yes">{120}{70}{70}{70}{70}</String>
174 <String Id="OutOfRbDiskDlgText2" Overridable="yes">Soovi korral võite installeri tagasipööramisfunktsiooni keelata. Tagasipööramise keelamisel ei saa installer teie arvuti algset olekut taastada, kui installimine peaks mingil põhjusel katkema. Kui soovite riskida ja tagasipööramise keelata, klõpsake käsul Jah.</String>
175
176 <String Id="PrepareDlg_Title" Overridable="yes">Toote [ProductName] install</String>
177 <String Id="PrepareDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
178 <String Id="PrepareDlgDescription" Overridable="yes">Palun oodake, kuni installiviisard valmistub teid installimisel juhendama.</String>
179 <String Id="PrepareDlgTitle" Overridable="yes">{\WixUI_Font_Bigger}Tere tulemast toote [ProductName] installiviisardisse!</String>
180
181 <String Id="ProgressDlg_Title" Overridable="yes">Toote [ProductName] install</String>
182 <String Id="ProgressDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
183 <String Id="ProgressDlgTextInstalling" Overridable="yes">Palun oodake, kuni installiviisard installib toodet [ProductName].</String>
184 <String Id="ProgressDlgTitleInstalling" Overridable="yes">{\WixUI_Font_Title}Toote [ProductName] installimine</String>
185 <String Id="ProgressDlgTextChanging" Overridable="yes">Palun oodake, kuni installiviisard muudab toodet [ProductName].</String>
186 <String Id="ProgressDlgTitleChanging" Overridable="yes">{\WixUI_Font_Title}Toote [ProductName] muutmine</String>
187 <String Id="ProgressDlgTextRepairing" Overridable="yes">Palun oodake, kuni installiviisard parandab toodet [ProductName].</String>
188 <String Id="ProgressDlgTitleRepairing" Overridable="yes">{\WixUI_Font_Title}Toote [ProductName] parandamine</String>
189 <String Id="ProgressDlgTextRemoving" Overridable="yes">Palun oodake, kuni installiviisard eemaldab toodet [ProductName].</String>
190 <String Id="ProgressDlgTitleRemoving" Overridable="yes">{\WixUI_Font_Title}Toote [ProductName] eemaldamine</String>
191 <String Id="ProgressDlgTextUpdating" Overridable="yes">Palun oodake, kuni installiviisard värskendab toodet [ProductName].</String>
192 <String Id="ProgressDlgTitleUpdating" Overridable="yes">{\WixUI_Font_Title}Toote [ProductName] värskendamine</String>
193 <String Id="ProgressDlgProgressBar" Overridable="yes">Edenemine</String>
194 <String Id="ProgressDlgStatusLabel" Overridable="yes">Olek:</String>
195
196 <String Id="ResumeDlg_Title" Overridable="yes">Toote [ProductName] install</String>
197 <String Id="ResumeDlgInstall" Overridable="yes">&amp;Installi</String>
198 <String Id="ResumeDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
199 <String Id="ResumeDlgDescription" Overridable="yes">Installiviisard viib toote [ProductName] teie arvutisse installimise lõpule. Jätkamiseks klõpsake käsul Installi, installiviisardist väljumiseks käsul Loobu.</String>
200 <String Id="ResumeDlgTitle" Overridable="yes">{\WixUI_Font_Bigger}Toote [ProductName] installiviisardi jätkamine</String>
201
202 <String Id="SetupTypeDlg_Title" Overridable="yes">Toote [ProductName] install</String>
203 <String Id="SetupTypeDlgTypicalButton" Overridable="yes">&amp;Tavaline</String>
204 <String Id="SetupTypeDlgTypicalButtonTooltip" Overridable="yes">Tavaline install</String>
205 <String Id="SetupTypeDlgCustomButton" Overridable="yes">K&amp;ohandatud</String>
206 <String Id="SetupTypeDlgCustomButtonTooltip" Overridable="yes">Kohandatud install</String>
207 <String Id="SetupTypeDlgCompleteButton" Overridable="yes">T&amp;äielik</String>
208 <String Id="SetupTypeDlgCompleteButtonTooltip" Overridable="yes">Täielik install</String>
209 <String Id="SetupTypeDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
210 <String Id="SetupTypeDlgTitle" Overridable="yes">{\WixUI_Font_Title}Installitüübi valimine</String>
211 <String Id="SetupTypeDlgDescription" Overridable="yes">Valige oma vajadustele vastav installitüüp</String>
212 <String Id="SetupTypeDlgTypicalText" Overridable="yes">Installitakse levinumad programmifunktsioonid. Soovitatav enamikule kasutajatele.</String>
213 <String Id="SetupTypeDlgCustomText" Overridable="yes">Võimaldab kasutajatel otsustada programmifunktsioonide installimise valiku ja koha üle. Soovitatav kogenud kasutajatele.</String>
214 <String Id="SetupTypeDlgCompleteText" Overridable="yes">Installitakse kõik programmifunktsioonid. Nõuab kõige rohkem kettaruumi.</String>
215
216 <String Id="UserExit_Title" Overridable="yes">Toote [ProductName] install</String>
217 <String Id="UserExitBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
218 <String Id="UserExitTitle" Overridable="yes">{\WixUI_Font_Bigger}Toote [ProductName] installiviisardi töö on katkestatud</String>
219 <String Id="UserExitDescription1" Overridable="yes">Toote [ProductName] installimine on katkestatud. Teie süsteemi pole muudetud. Kui soovite selle programmi hiljem installida, käivitage install uuesti.</String>
220 <String Id="UserExitDescription2" Overridable="yes">Klõpsake installiviisardist väljumiseks nupul Lõpeta.</String>
221
222 <String Id="VerifyReadyDlg_Title" Overridable="yes">Toote [ProductName] install</String>
223 <String Id="VerifyReadyDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
224 <String Id="VerifyReadyDlgInstall" Overridable="yes">&amp;Installi</String>
225 <String Id="VerifyReadyDlgInstallText" Overridable="yes">Installimise alustamiseks klõpsake käsul Installi. Installisätete läbivaatamiseks või muutmiseks klõpsake käsul Tagasi. Viisardist väljumiseks klõpsake käsul Loobu.</String>
226 <String Id="VerifyReadyDlgInstallTitle" Overridable="yes">{\WixUI_Font_Title}Toote [ProductName] installimiseks valmis</String>
227 <String Id="VerifyReadyDlgChange" Overridable="yes">&amp;Muuda</String>
228 <String Id="VerifyReadyDlgChangeText" Overridable="yes">Installimise alustamiseks klõpsake käsul Muuda. Installisätete läbivaatamiseks või muutmiseks klõpsake käsul Tagasi. Viisardist väljumiseks klõpsake käsul Loobu.</String>
229 <String Id="VerifyReadyDlgChangeTitle" Overridable="yes">{\WixUI_Font_Title}Toote [ProductName] muutmiseks valmis</String>
230 <String Id="VerifyReadyDlgRepair" Overridable="yes">&amp;Paranda</String>
231 <String Id="VerifyReadyDlgRepairText" Overridable="yes">Toote [ProductName] installi parandamiseks klõpsake käsul Paranda. Installisätete läbivaatamiseks või muutmiseks klõpsake käsul Tagasi. Viisardist väljumiseks klõpsake käsul Loobu.</String>
232 <String Id="VerifyReadyDlgRepairTitle" Overridable="yes">{\WixUI_Font_Title}Toote [ProductName] parandamiseks valmis</String>
233 <String Id="VerifyReadyDlgRemove" Overridable="yes">&amp;Eemalda</String>
234 <String Id="VerifyReadyDlgRemoveText" Overridable="yes">Toote [ProductName] arvutist eemaldamiseks klõpsake käsul Eemalda. Installisätete läbivaatamiseks või muutmiseks klõpsake käsul Tagasi. Viisardist väljumiseks klõpsake käsul Loobu.</String>
235 <String Id="VerifyReadyDlgRemoveTitle" Overridable="yes">{\WixUI_Font_Title}Toote [ProductName] eemaldamiseks valmis</String>
236 <String Id="VerifyReadyDlgUpdate" Overridable="yes">&amp;Värskendamine</String>
237 <String Id="VerifyReadyDlgUpdateText" Overridable="yes">Klõpsake käsul Värskenda toote [ProductName] värskendamiseks teie arvutis. Installisätete läbivaatamiseks või muutmiseks klõpsake käsul Tagasi. Viisardist väljumiseks klõpsake käsul Loobu.</String>
238 <String Id="VerifyReadyDlgUpdateTitle" Overridable="yes">{\WixUI_Font_Title}Toote [ProductName] värskendamiseks valmis</String>
239
240 <String Id="WaitForCostingDlg_Title" Overridable="yes">Toote [ProductName] install</String>
241 <String Id="WaitForCostingDlgReturn" Overridable="yes">&amp;Tagasi</String>
242 <String Id="WaitForCostingDlgText" Overridable="yes">Palun oodake, kuni installiprogramm lõpetab vajamineva kettaruumi kindlakstegemise.</String>
243 <String Id="WaitForCostingDlgIcon" Overridable="yes">WixUI_Ico_Exclam</String>
244 <String Id="WaitForCostingDlgIconTooltip" Overridable="yes">Hüüumärgi ikoon</String>
245
246 <String Id="WelcomeDlg_Title" Overridable="yes">Toote [ProductName] install</String>
247 <String Id="WelcomeDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
248 <String Id="WelcomeDlgDescription" Overridable="yes">Installiviisard installib toote [ProductName] teie arvutisse. Jätkamiseks klõpsake käsul Edasi või installiviisardist väljumiseks käsul Loobu.</String>
249 <String Id="WelcomeUpdateDlgDescriptionUpdate" Overridable="yes">Installiviisard värskendab toodet [ProductName] teie arvutis. Jätkamiseks klõpsake käsul Edasi või installiviisardist väljumiseks käsul Loobu.</String>
250 <String Id="WelcomeDlgTitle" Overridable="yes">{\WixUI_Font_Bigger}Tere tulemast toote [ProductName] installiviisardisse!</String>
251
252 <String Id="WelcomeEulaDlg_Title" Overridable="yes">Toote [ProductName] install</String>
253 <String Id="WelcomeEulaDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
254 <String Id="WelcomeEulaDlgLicenseAcceptedCheckBox" Overridable="yes">&amp;Nõustun litsentsilepingu tingimustega</String>
255 <String Id="WelcomeEulaDlgInstall" Overridable="yes">&amp;Installi</String>
256 <String Id="WelcomeEulaDlgUpdate" Overridable="yes">&amp;Värskendamine</String>
257 <String Id="WelcomeEulaDlgTitle" Overridable="yes">{\WixUI_Font_Title}Lugege toote [ProductName] litsentsilepingut</String>
258
259 <String Id="ProgressTextInstallValidate" Overridable="yes">Installi kinnitamine</String>
260 <String Id="ProgressTextInstallFiles" Overridable="yes">uute failide kopeerimine</String>
261 <String Id="ProgressTextInstallFilesTemplate" Overridable="yes">Fail: [1], kataloog: [9], maht: [6]</String>
262 <String Id="ProgressTextInstallAdminPackage" Overridable="yes">Võrguinstallifailide kopeerimine</String>
263 <String Id="ProgressTextInstallAdminPackageTemplate" Overridable="yes">Fail: [1], kataloog: [9], maht: [6]</String>
264 <String Id="ProgressTextFileCost" Overridable="yes">Ruuminõuete arvutamine</String>
265 <String Id="ProgressTextCostInitialize" Overridable="yes">Ruuminõuete arvutamine</String>
266 <String Id="ProgressTextCostFinalize" Overridable="yes">Ruuminõuete arvutamine</String>
267 <String Id="ProgressTextCreateShortcuts" Overridable="yes">Otseteede loomine</String>
268 <String Id="ProgressTextCreateShortcutsTemplate" Overridable="yes">Otsetee: [1]</String>
269 <String Id="ProgressTextPublishComponents" Overridable="yes">Sobivate komponentide avaldamine</String>
270 <String Id="ProgressTextPublishComponentsTemplate" Overridable="yes">Komponendi ID: [1], täpsusti: [2]</String>
271 <String Id="ProgressTextPublishFeatures" Overridable="yes">Tootefunktsioonide avaldamine</String>
272 <String Id="ProgressTextPublishFeaturesTemplate" Overridable="yes">Funktsioon: [1]</String>
273 <String Id="ProgressTextPublishProduct" Overridable="yes">Tooteteabe avaldamine</String>
274 <String Id="ProgressTextRegisterClassInfo" Overridable="yes">Klassiserverite registreerimine</String>
275 <String Id="ProgressTextRegisterClassInfoTemplate" Overridable="yes">Klassi ID: [1]</String>
276 <String Id="ProgressTextRegisterExtensionInfo" Overridable="yes">Laiendiserverite registreerimine</String>
277 <String Id="ProgressTextRegisterExtensionInfoTemplate" Overridable="yes">Laiend: [1]</String>
278 <String Id="ProgressTextRegisterMIMEInfo" Overridable="yes">MIME-teabe registreerimine</String>
279 <String Id="ProgressTextRegisterMIMEInfoTemplate" Overridable="yes">MIME-sisu tüüp: [1], laiend: [2]</String>
280 <String Id="ProgressTextRegisterProgIdInfo" Overridable="yes">Programmi-identifikaatorite registreerimine</String>
281 <String Id="ProgressTextRegisterProgIdInfoTemplate" Overridable="yes">ProgId: [1]</String>
282 <String Id="ProgressTextAllocateRegistrySpace" Overridable="yes">Registriruumi eraldamine</String>
283 <String Id="ProgressTextAllocateRegistrySpaceTemplate" Overridable="yes">Vaba ruum: [1]</String>
284 <String Id="ProgressTextAppSearch" Overridable="yes">Installitud rakenduste otsimine</String>
285 <String Id="ProgressTextAppSearchTemplate" Overridable="yes">Atribuut: [1], allkiri: [2]</String>
286 <String Id="ProgressTextBindImage" Overridable="yes">Täitmisfailide sidumine</String>
287 <String Id="ProgressTextBindImageTemplate" Overridable="yes">Fail: [1]</String>
288 <String Id="ProgressTextCCPSearch" Overridable="yes">Sobivate toodete otsimine</String>
289 <String Id="ProgressTextCreateFolders" Overridable="yes">Kaustade loomine</String>
290 <String Id="ProgressTextCreateFoldersTemplate" Overridable="yes">Kaust: [1]</String>
291 <String Id="ProgressTextDeleteServices" Overridable="yes">Teenuste kustutamine</String>
292 <String Id="ProgressTextDeleteServicesTemplate" Overridable="yes">Teenus: [1]</String>
293 <String Id="ProgressTextDuplicateFiles" Overridable="yes">Duplikaatfailide loomine</String>
294 <String Id="ProgressTextDuplicateFilesTemplate" Overridable="yes">Fail: [1], kataloog: [9], maht: [6]</String>
295 <String Id="ProgressTextFindRelatedProducts" Overridable="yes">Seotud rakenduste otsimine</String>
296 <String Id="ProgressTextFindRelatedProductsTemplate" Overridable="yes">Leitud rakendus: [1]</String>
297 <String Id="ProgressTextInstallODBC" Overridable="yes">ODBC-komponentide installimine</String>
298 <String Id="ProgressTextInstallServices" Overridable="yes">Uute teenuste installimine</String>
299 <String Id="ProgressTextInstallServicesTemplate" Overridable="yes">Teenus: [2]</String>
300 <String Id="ProgressTextLaunchConditions" Overridable="yes">Käivitustingimuste hindamine</String>
301 <String Id="ProgressTextMigrateFeatureStates" Overridable="yes">Funktsiooniolekute migreerimine seotud rakendustest</String>
302 <String Id="ProgressTextMigrateFeatureStatesTemplate" Overridable="yes">Rakendus: [1]</String>
303 <String Id="ProgressTextMoveFiles" Overridable="yes">Failide teisaldamine</String>
304 <String Id="ProgressTextMoveFilesTemplate" Overridable="yes">Fail: [1], kataloog: [9], maht: [6]</String>
305 <String Id="ProgressTextPatchFiles" Overridable="yes">Failide paikamine</String>
306 <String Id="ProgressTextPatchFilesTemplate" Overridable="yes">Fail: [1], kataloog: [2], maht: [3]</String>
307 <String Id="ProgressTextProcessComponents" Overridable="yes">Komponendi registreeringu värskendamine</String>
308 <String Id="ProgressTextRegisterComPlus" Overridable="yes">COM+ rakenduste ja komponentide registreerimine</String>
309 <String Id="ProgressTextRegisterComPlusTemplate" Overridable="yes">Rakenduse ID: [1]{{, rakenduse tüüp: [2], kasutajad: [3], RSN: [4]}}</String>
310 <String Id="ProgressTextRegisterFonts" Overridable="yes">Fontide registreerimine</String>
311 <String Id="ProgressTextRegisterFontsTemplate" Overridable="yes">Font: [1]</String>
312 <String Id="ProgressTextRegisterProduct" Overridable="yes">Toote registreerimine</String>
313 <String Id="ProgressTextRegisterProductTemplate" Overridable="yes">[1]</String>
314 <String Id="ProgressTextRegisterTypeLibraries" Overridable="yes">Tüübiteekide registreerimine</String>
315 <String Id="ProgressTextRegisterTypeLibrariesTemplate" Overridable="yes">LibID: [1]</String>
316 <String Id="ProgressTextRegisterUser" Overridable="yes">Kasutaja registreerimine</String>
317 <String Id="ProgressTextRegisterUserTemplate" Overridable="yes">[1]</String>
318 <String Id="ProgressTextRemoveDuplicateFiles" Overridable="yes">Duplikaatfailide eemaldamine</String>
319 <String Id="ProgressTextRemoveDuplicateFilesTemplate" Overridable="yes">Fail: [1], kataloog: [9]</String>
320 <String Id="ProgressTextRemoveEnvironmentStrings" Overridable="yes">Keskkonnastringide värskendamine</String>
321 <String Id="ProgressTextRemoveEnvironmentStringsTemplate" Overridable="yes">Nimi: [1], väärtus: [2], toiming [3]</String>
322 <String Id="ProgressTextRemoveExistingProducts" Overridable="yes">Rakenduste eemaldamine</String>
323 <String Id="ProgressTextRemoveExistingProductsTemplate" Overridable="yes">Rakendus: [1], käsurida: [2]</String>
324 <String Id="ProgressTextRemoveFiles" Overridable="yes">failide eemaldamine</String>
325 <String Id="ProgressTextRemoveFilesTemplate" Overridable="yes">Fail: [1], kataloog: [9]</String>
326 <String Id="ProgressTextRemoveFolders" Overridable="yes">Kaustade eemaldamine</String>
327 <String Id="ProgressTextRemoveFoldersTemplate" Overridable="yes">Kaust: [1]</String>
328 <String Id="ProgressTextRemoveIniValues" Overridable="yes">INI-failide kirjete eemaldamine</String>
329 <String Id="ProgressTextRemoveIniValuesTemplate" Overridable="yes">Fail: [1], sektsioon: [2], võti: [3], väärtus: [4]</String>
330 <String Id="ProgressTextRemoveODBC" Overridable="yes">ODBC-komponentide eemaldamine</String>
331 <String Id="ProgressTextRemoveRegistryValues" Overridable="yes">Süsteemiregistri väärtuste eemaldamine</String>
332 <String Id="ProgressTextRemoveRegistryValuesTemplate" Overridable="yes">Võti: [1], nimi: [2]</String>
333 <String Id="ProgressTextRemoveShortcuts" Overridable="yes">Otseteede eemaldamine</String>
334 <String Id="ProgressTextRemoveShortcutsTemplate" Overridable="yes">Otsetee: [1]</String>
335 <String Id="ProgressTextRMCCPSearch" Overridable="yes">Sobivate toodete otsimine</String>
336 <String Id="ProgressTextSelfRegModules" Overridable="yes">Moodulite registreerimine</String>
337 <String Id="ProgressTextSelfRegModulesTemplate" Overridable="yes">Fail: [1], kaust: [2]</String>
338 <String Id="ProgressTextSelfUnregModules" Overridable="yes">Moodulite registreeringu tühistamine</String>
339 <String Id="ProgressTextSelfUnregModulesTemplate" Overridable="yes">Fail: [1], kaust: [2]</String>
340 <String Id="ProgressTextSetODBCFolders" Overridable="yes">ODBC-kataloogide lähtestamine</String>
341 <String Id="ProgressTextStartServices" Overridable="yes">Teenuste käivitamine</String>
342 <String Id="ProgressTextStartServicesTemplate" Overridable="yes">Teenus: [1]</String>
343 <String Id="ProgressTextStopServices" Overridable="yes">Teenuste peatamine</String>
344 <String Id="ProgressTextStopServicesTemplate" Overridable="yes">Teenus: [1]</String>
345 <String Id="ProgressTextUnpublishComponents" Overridable="yes">Sobivate komponentide avaldamise tühistamine</String>
346 <String Id="ProgressTextUnpublishComponentsTemplate" Overridable="yes">Komponendi ID: [1], täpsusti: [2]</String>
347 <String Id="ProgressTextUnpublishFeatures" Overridable="yes">Tootefunktsioonide avaldamise tühistamine</String>
348 <String Id="ProgressTextUnpublishFeaturesTemplate" Overridable="yes">Funktsioon: [1]</String>
349 <String Id="ProgressTextUnregisterClassInfo" Overridable="yes">Klassiserverite registreeringu tühistamine</String>
350 <String Id="ProgressTextUnregisterClassInfoTemplate" Overridable="yes">Klassi ID: [1]</String>
351 <String Id="ProgressTextUnregisterComPlus" Overridable="yes">COM+ rakenduste ja komponentide registreeringu tühistamine</String>
352 <String Id="ProgressTextUnregisterComPlusTemplate" Overridable="yes">Rakenduse ID: [1]{{, rakenduse tüüp: [2]}}</String>
353 <String Id="ProgressTextUnregisterExtensionInfo" Overridable="yes">Laiendiserverite registreeringu tühistamine</String>
354 <String Id="ProgressTextUnregisterExtensionInfoTemplate" Overridable="yes">Laiend: [1]</String>
355 <String Id="ProgressTextUnregisterFonts" Overridable="yes">Fontide registreeringu tühistamine</String>
356 <String Id="ProgressTextUnregisterFontsTemplate" Overridable="yes">Font: [1]</String>
357 <String Id="ProgressTextUnregisterMIMEInfo" Overridable="yes">MIME-teabe registreeringu tühistamine</String>
358 <String Id="ProgressTextUnregisterMIMEInfoTemplate" Overridable="yes">MIME-sisu tüüp: [1], laiend: [2]</String>
359 <String Id="ProgressTextUnregisterProgIdInfo" Overridable="yes">Programmi-identifikaatorite registreeringu tühistamine</String>
360 <String Id="ProgressTextUnregisterProgIdInfoTemplate" Overridable="yes">ProgId: [1]</String>
361 <String Id="ProgressTextUnregisterTypeLibraries" Overridable="yes">Tüübiteekide registreeringu tühistamine</String>
362 <String Id="ProgressTextUnregisterTypeLibrariesTemplate" Overridable="yes">LibID: [1]</String>
363 <String Id="ProgressTextWriteEnvironmentStrings" Overridable="yes">Keskkonnastringide värskendamine</String>
364 <String Id="ProgressTextWriteEnvironmentStringsTemplate" Overridable="yes">Nimi: [1], väärtus: [2], toiming [3]</String>
365 <String Id="ProgressTextWriteIniValues" Overridable="yes">INI-failide väärtuste kirjutamine</String>
366 <String Id="ProgressTextWriteIniValuesTemplate" Overridable="yes">Fail: [1], sektsioon: [2], võti: [3], väärtus: [4]</String>
367 <String Id="ProgressTextWriteRegistryValues" Overridable="yes">Süsteemiregistri väärtuste kirjutamine</String>
368 <String Id="ProgressTextWriteRegistryValuesTemplate" Overridable="yes">Võti: [1], nimi: [2], väärtus: [3]</String>
369 <String Id="ProgressTextAdvertise" Overridable="yes">Rakenduse väljakuulutamine</String>
370 <String Id="ProgressTextGenerateScript" Overridable="yes">Skriptioperatsioonide loomine toimingule:</String>
371 <String Id="ProgressTextGenerateScriptTemplate" Overridable="yes">[1]</String>
372 <String Id="ProgressTextInstallSFPCatalogFile" Overridable="yes">Süsteemikataloogi installimine</String>
373 <String Id="ProgressTextInstallSFPCatalogFileTemplate" Overridable="yes">Fail: [1], sõltuvused: [2]</String>
374 <String Id="ProgressTextMsiPublishAssemblies" Overridable="yes">Paketi teabe avaldamine</String>
375 <String Id="ProgressTextMsiPublishAssembliesTemplate" Overridable="yes">Rakenduse kontekst: [1], paketi nimi: [2]</String>
376 <String Id="ProgressTextMsiUnpublishAssemblies" Overridable="yes">Paketi teabe avaldamise tühistamine</String>
377 <String Id="ProgressTextMsiUnpublishAssembliesTemplate" Overridable="yes">Rakenduse kontekst: [1], paketi nimi: [2]</String>
378 <String Id="ProgressTextRollback" Overridable="yes">Toimingu tagasipööramine:</String>
379 <String Id="ProgressTextRollbackTemplate" Overridable="yes">[1]</String>
380 <String Id="ProgressTextRollbackCleanup" Overridable="yes">Varufailide eemaldamine</String>
381 <String Id="ProgressTextRollbackCleanupTemplate" Overridable="yes">Fail: [1]</String>
382 <String Id="ProgressTextUnmoveFiles" Overridable="yes">Teisaldatud failide eemaldamine</String>
383 <String Id="ProgressTextUnmoveFilesTemplate" Overridable="yes">Fail: [1], kataloog: [9]</String>
384 <String Id="ProgressTextUnpublishProduct" Overridable="yes">Toote teabe avaldamise tühistamine</String>
385
386 <String Id="Error0" Overridable="yes">{{Pöördumatu tõrge: }}</String>
387 <String Id="Error1" Overridable="yes">{{Tõrge [1]. }}</String>
388 <String Id="Error2" Overridable="yes">Hoiatus [1]. </String>
389 <String Id="Error4" Overridable="yes">Teave [1]. </String>
390 <String Id="Error5" Overridable="yes">Installeril ilmnes selle paketi installimisel ootamatu tõrge. See võib viidata selle paketi probleemile. Tõrkekood on [1]. {{Argumendid on järgmised: [2], [3], [4]}}</String>
391 <String Id="Error7" Overridable="yes">{{Ketas täis: }}</String>
392 <String Id="Error8" Overridable="yes">Toiming [Time]: [1]. [2]</String>
393 <String Id="Error9" Overridable="yes">[ProductName]</String>
394 <String Id="Error10" Overridable="yes">{[2]}{, [3]}{, [4]}</String>
395 <String Id="Error11" Overridable="yes">Sõnumi tüüp: [1], argument: [2]</String>
396 <String Id="Error12" Overridable="yes">=== Logimise algus: [Date] [Time] ===</String>
397 <String Id="Error13" Overridable="yes">=== Logimise lõpp: [Date] [Time] ===</String>
398 <String Id="Error14" Overridable="yes">Toimingu algus [Time]: [1].</String>
399 <String Id="Error15" Overridable="yes">Toimingu lõpp [Time]: [1]. Tagastusväärtus [2].</String>
400 <String Id="Error16" Overridable="yes">Aega jäänud: {[1] minut(it) }{[2] sekund(it)}</String>
401 <String Id="Error17" Overridable="yes">Mälu pole piisavalt. Enne uuesti proovimist sulgege muud rakendused.</String>
402 <String Id="Error18" Overridable="yes">Installer ei reageeri enam.</String>
403 <String Id="Error19" Overridable="yes">Installer peatus enneaegselt.</String>
404 <String Id="Error20" Overridable="yes">Palun oodake, kuni Windows konfigureerib toodet [ProductName]</String>
405 <String Id="Error21" Overridable="yes">Vajaliku teabe kogumine ...</String>
406 <String Id="Error22" Overridable="yes">Selle rakenduse vanemate versioonide eemaldamine ...</String>
407 <String Id="Error23" Overridable="yes">Selle rakenduse varasemate versioonide eemaldamise ettevalmistamine ...</String>
408 <String Id="Error32" Overridable="yes">Toote {[ProductName] }installimine on edukalt lõpule viidud.</String>
409 <String Id="Error33" Overridable="yes">Toote {[ProductName] }installimine nurjus.</String>
410 <String Id="Error1101" Overridable="yes">Failist [2] lugemisel ilmnes tõrge. {{ Süsteemitõrge [3].}} Veenduge, et fail on olemas ja teil on sellele juurdepääs.</String>
411 <String Id="Error1301" Overridable="yes">Faili [2] ei saa luua. Samanimeline kaust on juba olemas. Tühistage install ja proovige installida mõnda teise asukohta.</String>
412 <String Id="Error1302" Overridable="yes">Palun sisestage ketas: [2]</String>
413 <String Id="Error1303" Overridable="yes">Installeril pole kaustale [2] juurdepääsuks piisavaid õigusi. Installimist ei saa jätkata. Logige sisse administraatorina või pöörduge süsteemiadministraatori poole.</String>
414 <String Id="Error1304" Overridable="yes">Tõrge faili [2] kirjutamisel. Veenduge, et teil oleks juurdepääs sellele kaustale.</String>
415 <String Id="Error1305" Overridable="yes">Failist [2] lugemisel ilmnes tõrge. {{ Süsteemitõrge [3].}} Veenduge, et fail on olemas ja teil on sellele juurdepääs.</String>
416 <String Id="Error1306" Overridable="yes">Fail [2] on mõnes muus rakenduses eksklusiivselt kasutusel. Sulgege kõik muud rakendused ja klõpsake siis käsul Proovi uuesti.</String>
417 <String Id="Error1307" Overridable="yes">Faili [2] installimiseks pole piisavalt kettaruumi. Vabastage kettal ruumi ja klõpsake käsul Proovi uuesti. Väljumiseks klõpsake käsul Loobu.</String>
418 <String Id="Error1308" Overridable="yes">Lähtefaili ei leitud: [2]. Veenduge, et fail oleks olemas ja pääsete sellele juurde.</String>
419 <String Id="Error1309" Overridable="yes">Failist [3] lugemisel ilmnes tõrge. {{ Süsteemitõrge [2].}} Veenduge, et fail on olemas ja pääsete sellele juurde.</String>
420 <String Id="Error1310" Overridable="yes">Faili [3] kirjutamisel ilmnes tõrge. {{ Süsteemitõrge [2].}} Veenduge, et teil on juurdepääs sellele kataloogile.</String>
421 <String Id="Error1311" Overridable="yes">Lähtefaili ei leitud{{(CAB-fail)}}: [2]. Veenduge, et fail on olemas ja pääsete sellele juurde.</String>
422 <String Id="Error1312" Overridable="yes">Kausta [2] ei saa luua. Samanimeline fail on juba olemas. Nimetage fail ümber või eemaldage see ja klõpsake siis käsul Proovi uuesti või klõpsake väljumiseks käsul Loobu.</String>
423 <String Id="Error1313" Overridable="yes">Draiv [2] pole praegu saadaval. Valige mõni muu draiv.</String>
424 <String Id="Error1314" Overridable="yes">Määratud tee [2] pole kättesaadav.</String>
425 <String Id="Error1315" Overridable="yes">Määratud kausta [2] ei saa kirjutada.</String>
426 <String Id="Error1316" Overridable="yes">Failist [2] lugemisel ilmnes võrgutõrge</String>
427 <String Id="Error1317" Overridable="yes">Kataloogi [2] loomisel ilmnes tõrge</String>
428 <String Id="Error1318" Overridable="yes">Kataloogi [2] loomisel ilmnes võrgutõrge</String>
429 <String Id="Error1319" Overridable="yes">Lähtefailikapi [2] avamisel ilmnes võrgutõrge</String>
430 <String Id="Error1320" Overridable="yes">Määratud tee on liiga pikk: [2]</String>
431 <String Id="Error1321" Overridable="yes">Installiprogrammil pole faili [2] muutmiseks piisavalt õigusi.</String>
432 <String Id="Error1322" Overridable="yes">Osa kaustateest [2] ei sobi. See on kas tühi või selle pikkus ületab süsteemi lubatu.</String>
433 <String Id="Error1323" Overridable="yes">Kaustatee [2] sisaldab sõnu, mis on kaustateede puhul sobimatud.</String>
434 <String Id="Error1324" Overridable="yes">Kaustatee [2] sisaldab sobimatut märki.</String>
435 <String Id="Error1325" Overridable="yes">[2] on faili lühinimena sobimatu.</String>
436 <String Id="Error1326" Overridable="yes">Faili turvalisuse toomisel ilmnes tõrge: [3] GetLastError: [2]</String>
437 <String Id="Error1327" Overridable="yes">Sobimatu draiv: [2]</String>
438 <String Id="Error1328" Overridable="yes">Paiga rakendamisel failile [2] ilmnes tõrge. Arvatavasti on seda juba mõnel muul viisil värskendatud ja seetõttu ei saa see paik seda enam muuta. Lisateavet saate paiga tarnijalt. {{Süsteemitõrge: [3]}}</String>
439 <String Id="Error1329" Overridable="yes">Mõnda nõutavat faili ei saa installida, kuna CAB-fail [2] pole digitaalselt allkirjastatud. CAB-fail võib olla rikutud.</String>
440 <String Id="Error1330" Overridable="yes">Mõnda nõutavat faili ei saa installida, kuna CAB-faili [2] digitaalne allkiri ei kehti. CAB-fail võib olla rikutud.{{ WinVerifyTrust tagastas tõrke [3].}}</String>
441 <String Id="Error1331" Overridable="yes">Faili [2] kopeerimine nurjus: CRC tõrge.</String>
442 <String Id="Error1332" Overridable="yes">Faili [2] teisaldamine nurjus: CRC tõrge.</String>
443 <String Id="Error1333" Overridable="yes">Faili [2] paikamine nurjus: CRC tõrge.</String>
444 <String Id="Error1334" Overridable="yes">Faili [2] ei saa installida, sest seda faili CAB-failist [3] ei leia. See võib viidata võrgutõrkele, tõrkele CD-ROM-i lugemisel või probleemile selle paketiga.</String>
445 <String Id="Error1335" Overridable="yes">Selle installi jaoks vajalik CAB-fail [2] on rikutud ja seda ei saa kasutada. See võib viidata võrgutõrkele, tõrkele CD-ROM-i lugemisel või probleemile selle paketiga.</String>
446 <String Id="Error1336" Overridable="yes">Selle installi lõpuleviimiseks vajaliku ajutise faili loomisel ilmnes tõrge.{{ Kaust: [3]. Süsteemi tõrkekood: [2]}}</String>
447 <String Id="Error1401" Overridable="yes">Võtit [2] ei saanud luua. {{ Süsteemitõrge [3].}} Veenduge, et teil on sellele võtmele piisav juurdepääs või pöörduge oma tugipersonali poole. </String>
448 <String Id="Error1402" Overridable="yes">Võtit [2] ei saanud avada. {{ Süsteemitõrge [3].}} Veenduge, et teil on sellele võtmele piisav juurdepääs või pöörduge oma tugipersonali poole. </String>
449 <String Id="Error1403" Overridable="yes">Väärtust [2] ei saanud võtmest [3] kustutada. {{ Süsteemitõrge [4].}} Veenduge, et teil on sellele võtmele piisav juurdepääs või pöörduge oma tugipersonali poole. </String>
450 <String Id="Error1404" Overridable="yes">Võtit [2] ei saanud kustutada. {{ Süsteemitõrge [3].}} Veenduge, et teil on sellele võtmele piisav juurdepääs või pöörduge oma tugipersonali poole. </String>
451 <String Id="Error1405" Overridable="yes">Väärtust [2] ei saanud võtmest [3] lugeda. {{ Süsteemitõrge [4].}} Veenduge, et teil on sellele võtmele piisav juurdepääs või pöörduge oma tugipersonali poole. </String>
452 <String Id="Error1406" Overridable="yes">Väärtust [2] ei saanud võtmesse [3] kirjutada. {{ Süsteemitõrge [4].}} Veenduge, et teil on sellele võtmele piisav juurdepääs või pöörduge oma tugipersonali poole.</String>
453 <String Id="Error1407" Overridable="yes">Võtme [2] väärtuste nimesid ei saanud hankida. {{ Süsteemitõrge [3].}} Veenduge, et teil on sellele võtmele piisav juurdepääs või pöörduge oma tugipersonali poole.</String>
454 <String Id="Error1408" Overridable="yes">Võtme [2] alamvõtmete nimesid ei saanud hankida. {{ Süsteemitõrge [3].}} Veenduge, et teil on sellele võtmele piisav juurdepääs või pöörduge oma tugipersonali poole.</String>
455 <String Id="Error1409" Overridable="yes">Võtme [2] turbeteavet ei saanud lugeda. {{ Süsteemitõrge [3].}} Veenduge, et teil on sellele võtmele piisav juurdepääs või pöörduge oma tugipersonali poole.</String>
456 <String Id="Error1410" Overridable="yes">Saadaolevat registriruumi ei saanud suurendada. Selle rakenduse installimiseks on vaja [2] kB vaba registriruumi.</String>
457 <String Id="Error1500" Overridable="yes">Teine install on pooleli. See install tuleb kõigepealt lõpule viia, enne kui saate jätkata uuega.</String>
458 <String Id="Error1501" Overridable="yes">Turvatud andmetele juurdepääsul ilmnes tõrge. Veenduge, et Windows Installer on õigesti konfigureeritud ja proovige uuesti installida.</String>
459 <String Id="Error1502" Overridable="yes">Kasutaja [2] on varem algatanud toote [3] installi. See kasutaja peab selle installi enne toote kasutamist uuesti käivitama. Teie praegune install jätkub nüüd.</String>
460 <String Id="Error1503" Overridable="yes">Kasutaja [2] on varem algatanud toote [3] installi. See kasutaja peab selle installi enne toote kasutamist uuesti käivitama.</String>
461 <String Id="Error1601" Overridable="yes">Kettaruum on otsas — draiv: [2]; vajalik ruum: [3] kB; saadaolev ruum: [4] kB. Vabastage kettaruumi ja proovige uuesti.</String>
462 <String Id="Error1602" Overridable="yes">Kas soovite kindlasti loobuda?</String>
463 <String Id="Error1603" Overridable="yes">Fail [2][3] on kasutusel{ järgmises protsessis: nimi: [4], ID: [5], aknatiitel: [6]}. Sulgege see rakendus ja proovige uuesti.</String>
464 <String Id="Error1604" Overridable="yes">Toode [2] on juba installitud, välistades käesoleva toote installimise. Need kaks toodet on ühildumatud.</String>
465 <String Id="Error1605" Overridable="yes">Draivil [2] pole installi jätkamiseks koos lubatud taastamisega piisavalt kettaruumi. [3] kB on vaja, aga ainult [4] kB on vaba. Kui soovite jätkata installi ilma taasteteavet salvestamata, klõpsake käsul Ignoreeri, kui soovite saadaolevat ruumi uuesti kontrollida, klõpsake käsul Proovi uuesti, või kui soovite installi katkestada, klõpsake käsul Loobu.</String>
466 <String Id="Error1606" Overridable="yes">Võrgukohale [2] ei pääse juurde.</String>
467 <String Id="Error1607" Overridable="yes">Järgmised rakendused tuleks enne installi jätkamist sulgeda:</String>
468 <String Id="Error1608" Overridable="yes">Selle toote installiks ei leia arvutist ühtki varem installitud sobivat toodet.</String>
469 <String Id="Error1609" Overridable="yes">Turbesätete rakendamisel ilmnes tõrge. [2] pole lubatud kasutaja või rühm. Probleem võib olla paketis või ühenduse loomisel võrgus oleva domeenikontrolleriga. Kontrollige oma võrguühendust ning klõpsake käsul Proovi uuesti või, kui soovite installi lõpetada, klõpsake käsul Loobu. {{Kasutaja SID leidmine nurjus, süsteemitõrge [3]}}</String>
470 <String Id="Error1701" Overridable="yes">Võti [2] on kehtetu. Veenduge, et sisestasite õige võtme.</String>
471 <String Id="Error1702" Overridable="yes">Enne toote [2] konfigureerimise jätkamist peab installer süsteemi taaskäivitama. Arvuti kohe taaskäivitamiseks klõpsake käsul Jah, hiljem käsitsi taaskäivitamiseks klõpsake käsul Ei.</String>
472 <String Id="Error1703" Overridable="yes">Muudatused toote [2] konfiguratsioonis jõustuvad alles pärast arvuti taaskäivitamist. Arvuti kohe taaskäivitamiseks klõpsake käsul Jah või hiljem käsitsi taaskäivitamiseks klõpsake käsul Ei.</String>
473 <String Id="Error1704" Overridable="yes">Toote [2] install on praegu peatatud. Jätkamiseks peate selle installi tehtud muudatused tühistama. Kas soovite need muudatused tühistada?</String>
474 <String Id="Error1705" Overridable="yes">Selle toote varasem install on pooleli. Jätkamiseks peate selle installi tehtud muudatused tühistama. Kas soovite need muudatused tühistada?</String>
475 <String Id="Error1706" Overridable="yes">Toote [2] installipaketti ei õnnestu leida. Proovige uuesti installida, kasutades installipaketi [3] kehtivat eksemplari.</String>
476 <String Id="Error1707" Overridable="yes">Install on edukalt lõpule viidud.</String>
477 <String Id="Error1708" Overridable="yes">Install nurjus.</String>
478 <String Id="Error1709" Overridable="yes">Toode: [2] -- [3]</String>
479 <String Id="Error1710" Overridable="yes">Võite taastada oma arvuti varasema seisundi või jätkata installimist hiljem. Kas soovite taastada?</String>
480 <String Id="Error1711" Overridable="yes">Installiteabe kirjutamisel kettale ilmnes tõrge. Kontrollige, kas kettal on piisavalt ruumi ja klõpsake käsul Proovi uuesti. Kui soovite installi katkestada, klõpsake käsul Loobu.</String>
481 <String Id="Error1712" Overridable="yes">Mõnda arvuti varasema oleku taastamiseks vajalikku faili ei leitud. Taastamine pole võimalik.</String>
482 <String Id="Error1713" Overridable="yes">[2] ei saa installida ühte oma vajalikest toodetest. Pöörduge tehnilise toe poole. {{Süsteemitõrge: [3].}}</String>
483 <String Id="Error1714" Overridable="yes">Toote [2] varasemat versiooni ei saa eemaldada. Pöörduge tehnilise toe poole. {{Süsteemitõrge [3].}}</String>
484 <String Id="Error1715" Overridable="yes">Installitud [2]</String>
485 <String Id="Error1716" Overridable="yes">Konfigureeritud [2]</String>
486 <String Id="Error1717" Overridable="yes">Eemaldatud [2]</String>
487 <String Id="Error1718" Overridable="yes">Digitaalallkirjapoliitika keeldus failist [2].</String>
488 <String Id="Error1719" Overridable="yes">Windows Installeri teenusele puudub juurdepääs. Nii võib juhtuda, kui Windows on turvarežiimis või Windows Installer pole õigesti installitud. Abi saamiseks pöörduge oma tugipersonali poole.</String>
489 <String Id="Error1720" Overridable="yes">Selle Windows Installeri paketiga ilmnes probleem. Installi lõpuleviimiseks vajalikku skripti ei saanud käivitada. Pöörduge oma tugipersonali või paketi tarnija poole. {{Kohandatud toimingu [2] skriptitõrge [3], [4]: [5] rida [6], veerg [7], [8] }}</String>
490 <String Id="Error1721" Overridable="yes">Selle Windows Installeri paketiga ilmnes probleem. Installi lõpuleviimiseks vajalikku programmi ei saanud käivitada. Pöörduge oma tugipersonali või paketi tarnija poole. {{Toiming: [2], asukoht: [3], käsk: [4] }}</String>
491 <String Id="Error1722" Overridable="yes">Selle Windows Installeri paketiga ilmnes probleem. Installi osana käivitatud programm ei jõudnud ootuspäraselt lõpule. Pöörduge oma tugipersonali või paketi tarnija poole. {{Toiming [2], asukoht: [3], käsk: [4] }}</String>
492 <String Id="Error1723" Overridable="yes">Selle Windows Installeri paketiga ilmnes probleem. Selle installi lõpuleviimiseks vajalikku DLL-i ei saanud käivitada. Pöörduge oma tugipersonali või paketi tarnija poole. {{Toiming [2], kirje: [3], teek: [4] }}</String>
493 <String Id="Error1724" Overridable="yes">Eemaldamine on edukalt lõpule viidud.</String>
494 <String Id="Error1725" Overridable="yes">Eemaldamine nurjus.</String>
495 <String Id="Error1726" Overridable="yes">Väljakuulutamine on edukalt lõpule viidud.</String>
496 <String Id="Error1727" Overridable="yes">Väljakuulutamine nurjus.</String>
497 <String Id="Error1728" Overridable="yes">Konfigureerimine on edukalt lõpule viidud.</String>
498 <String Id="Error1729" Overridable="yes">Konfigureerimine nurjus.</String>
499 <String Id="Error1730" Overridable="yes">Selle rakenduse eemaldamiseks peate olema administraator. Rakenduse eemaldamiseks peate administraatorina sisse logima või pöörduma abi saamiseks tehnilise toe poole.</String>
500 <String Id="Error1731" Overridable="yes">Toote [2] lähteinstallipakett pole kliendipaketiga sünkroonitud. Proovige uuesti installida, kasutades installipaketi [3] kehtivat eksemplari.</String>
501 <String Id="Error1732" Overridable="yes">Rakenduse [2] installi lõpuleviimiseks peate oma arvuti taaskäivitama. Teised kasutajad on praegu sellesse arvutisse sisse logitud ja taaskäivitamisel võib nende töö kaotsi minna. Kas soovite kohe taaskäivitada?</String>
502 <String Id="Error1801" Overridable="yes">Tee [2] ei sobi. Palun määrake sobiv tee.</String>
503 <String Id="Error1802" Overridable="yes">Mälu pole piisavalt. Enne uuesti proovimist sulgege muud rakendused.</String>
504 <String Id="Error1803" Overridable="yes">Draivis [2] pole ketast. Palun sisestage ketas ja klõpsake käsul Proovi uuesti või eelmisena valitud draivi juurde tagasi pöördumiseks käsul Loobu.</String>
505 <String Id="Error1804" Overridable="yes">Draivis [2] pole ketast. Palun sisestage ketas ja klõpsake käsul Proovi uuesti või sirvimisdialoogi tagasipöördumiseks ja muu draivi valimiseks käsul Loobu.</String>
506 <String Id="Error1805" Overridable="yes">Kausta [2] pole olemas. Sisestage mõne olemasoleva kausta tee.</String>
507 <String Id="Error1806" Overridable="yes">Teil pole selle kausta lugemiseks piisavaid õigusi.</String>
508 <String Id="Error1807" Overridable="yes">Installi jaoks sobivat sihtkausta ei saanud määrata.</String>
509 <String Id="Error1901" Overridable="yes">Installi lähteandmebaasist [2] lugemisel ilmnes tõrge.</String>
510 <String Id="Error1902" Overridable="yes">Taaskäivituse ajastamise toiming: faili [2] ümbernimetamine failiks [3]. Toimingu lõpuleviimiseks tuleb arvuti taaskäivitada.</String>
511 <String Id="Error1903" Overridable="yes">Taaskäivituse ajastamise toiming: faili [2] kustutamine. Toimingu lõpuleviimiseks tuleb arvuti taaskäivitada.</String>
512 <String Id="Error1904" Overridable="yes">Mooduli [2] registreerimine nurjus. HRESULT [3]. Pöörduge oma tugipersonali poole.</String>
513 <String Id="Error1905" Overridable="yes">Mooduli [2] registrist eemaldamine nurjus. HRESULT [3]. Pöörduge oma tugipersonali poole.</String>
514 <String Id="Error1906" Overridable="yes">Paketi [2] vahemällu salvestamine nurjus. Tõrge: [3]. Pöörduge oma tugipersonali poole.</String>
515 <String Id="Error1907" Overridable="yes">Fonti [2] ei saanud registreerida. Veenduge, et teil on fontide installimiseks piisavad õigused ja et teie süsteem toetab seda fonti.</String>
516 <String Id="Error1908" Overridable="yes">Fondi [2] registreeringut ei saanud tühistada. Veenduge, et teil on fontide eemaldamiseks piisavad õigused.</String>
517 <String Id="Error1909" Overridable="yes">Otseteed [2] ei saanud luua. Veenduge, et sihtkaust on olemas ja et teil on sellele juurdepääs.</String>
518 <String Id="Error1910" Overridable="yes">Otseteed [2] ei saanud eemaldada. Veenduge, et see otsetee on olemas ja et teil on sellele juurdepääs.</String>
519 <String Id="Error1911" Overridable="yes">Faili [2] tüübiteeki ei saanud registreerida. Pöörduge oma tugipersonali poole.</String>
520 <String Id="Error1912" Overridable="yes">Faili [2] tüübiteeki ei saanud registrist eemaldada. Pöörduge oma tugipersonali poole.</String>
521 <String Id="Error1913" Overridable="yes">INI-faili [2][3] ei saanud värskendada. Veenduge, et see fail on olemas ja et teil on sellele juurdepääs.</String>
522 <String Id="Error1914" Overridable="yes">Faili [2] ei saanud ajastada faili [3] taaskäivitamisel asendama. Veenduge, et teil on faili [3] kirjutusõigus.</String>
523 <String Id="Error1915" Overridable="yes">ODBC-draiverihalduri eemaldamisel ilmnes tõrge, ODBC tõrge [2]: [3]. Pöörduge oma tugipersonali poole.</String>
524 <String Id="Error1916" Overridable="yes">ODBC-draiverihalduri installimisel ilmnes tõrge, ODBC tõrge [2]: [3]. Pöörduge oma tugipersonali poole.</String>
525 <String Id="Error1917" Overridable="yes">ODBC-draiveri [4] eemaldamisel ilmnes tõrge, ODBC tõrge [2]: [3]. Veenduge, et teil on ODBC-draiverite eemaldamiseks piisavad õigused.</String>
526 <String Id="Error1918" Overridable="yes">ODBC-draiveri [4] installimisel ilmnes tõrge, ODBC tõrge [2]: [3]. Veenduge, et fail [4] on olemas ja et teil on sellele juurdepääs.</String>
527 <String Id="Error1919" Overridable="yes">ODBC-andmeallika [4] konfigureerimisel ilmnes tõrge, ODBC tõrge [2]: [3]. Veenduge, et fail [4] on olemas ja et teil on sellele juurdepääs.</String>
528 <String Id="Error1920" Overridable="yes">Teenuse [2] ([3]) käivitamine nurjus. Veenduge, et teil on süsteemiteenuste käivitamiseks piisavad õigused.</String>
529 <String Id="Error1921" Overridable="yes">Teenust [2] ([3]) ei saanud peatada. Veenduge, et teil on süsteemiteenuste peatamiseks piisavad õigused.</String>
530 <String Id="Error1922" Overridable="yes">Teenust [2] ([3]) ei saanud kustutada. Veenduge, et teil on süsteemiteenuste kustutamiseks piisavad õigused.</String>
531 <String Id="Error1923" Overridable="yes">Teenust [2] ([3]) ei saanud installida. Veenduge, et teil on süsteemiteenuste installimiseks piisavad õigused.</String>
532 <String Id="Error1924" Overridable="yes">Keskkonnamuutujat [2] ei saanud värskendada. Veenduge, et teil on keskkonnamuutujate muutmiseks piisavad õigused.</String>
533 <String Id="Error1925" Overridable="yes">Teil pole arvuti kõigi kasutajate jaoks vajaliku installiprotsessi lõpuleviimiseks piisavaid õigusi. Logige sisse administraatorina ja proovige siis uuesti installida.</String>
534 <String Id="Error1926" Overridable="yes">Faili [3] turbeteavet ei saanud määrata. Tõrge: [2]. Veenduge, et teil on selle faili turbeõiguste muutmiseks piisavad õigused.</String>
535 <String Id="Error1927" Overridable="yes">Component Services (COM+ 1.0) pole sellesse arvutisse installitud. Selle installi lõpuleviimiseks on Component Services nõutav. Component Services on olemas operatsioonisüsteemis Windows 2000.</String>
536 <String Id="Error1928" Overridable="yes">Rakenduse COM+ registreerimisel ilmnes tõrge. Lisateabe saamiseks pöörduge oma tugipersonali poole.</String>
537 <String Id="Error1929" Overridable="yes">Rakenduse COM+ registrist eemaldamisel ilmnes tõrge. Lisateabe saamiseks pöörduge oma tugipersonali poole.</String>
538 <String Id="Error1930" Overridable="yes">Teenuse [2] ([3]) kirjeldust ei saanud muuta.</String>
539 <String Id="Error1931" Overridable="yes">Windows Installeri teenus ei saa süsteemifaili [2] värskendada, kuna Windows kaitseb seda faili. On võimalik, et selle programmi õige töötamise tagamiseks peate oma operatsioonisüsteemi värskendama. {{Paketi versioon: [3], operatsioonisüsteemi kaitstud versioon: [4]}}</String>
540 <String Id="Error1932" Overridable="yes">Windows Installer ei saa kaitstud Windowsi faili [2] värskendada. {{Paketi versioon: [3], operatsioonisüsteemi kaitstud versioon: [4], SFP tõrge: [5]}}</String>
541 <String Id="Error1933" Overridable="yes">Windows Installer ei saanud värskendada ühte või mitut kaitstud Windowsi faili. {{SFP tõrge: [2]. Kaitstud failide loend:\r\n[3]}}</String>
542 <String Id="Error1934" Overridable="yes">Arvuti poliitika keelab kasutajapoolse installimise.</String>
543 <String Id="Error1935" Overridable="yes">Paketi [6] installi ajal ilmnes tõrge. Lisateavet leiate spikri- ja tugikeskusest. HRESULT: [3]. {{paketi liides: [4], funktsioon: [5], komponent: [2]}}</String>
544 <String Id="Error1936" Overridable="yes">Paketi [6] installi ajal ilmnes tõrge. Paketi nimi pole tugev või pakett pole allkirjastatud minimaalse võtmepikkusega. HRESULT: [3]. {{paketi liides: [4], funktsioon: [5], komponent: [2]}}</String>
545 <String Id="Error1937" Overridable="yes">Paketi [6] installi ajal ilmnes tõrge. Allkirja või kataloogi ei saanud kinnitada või see pole sobiv. HRESULT: [3]. {{paketi liides: [4], funktsioon: [5], komponent: [2]}}</String>
546 <String Id="Error1938" Overridable="yes">Paketi [6] installi ajal ilmnes tõrge. Ühte või mitut paketi moodulit ei leia. HRESULT: [3]. {{paketi liides: [4], funktsioon: [5], komponent: [2]}}</String>
547
548 <String Id="UITextbytes" Overridable="yes">baidid</String>
549 <String Id="UITextGB" Overridable="yes">GB</String>
550 <String Id="UITextKB" Overridable="yes">kB</String>
551 <String Id="UITextMB" Overridable="yes">MB</String>
552 <String Id="UITextMenuAbsent" Overridable="yes">Kogu funktsioon muutub kättesaamatuks</String>
553 <String Id="UITextMenuAdvertise" Overridable="yes">Funktsioon installitakse vajadusel</String>
554 <String Id="UITextMenuAllCD" Overridable="yes">Kogu funktsioon installitakse CD-lt käitatavana</String>
555 <String Id="UITextMenuAllLocal" Overridable="yes">Kogu funktsioon installitakse kohalikule kõvakettale</String>
556 <String Id="UITextMenuAllNetwork" Overridable="yes">Kogu funktsioon installitakse võrgust käitatavana</String>
557 <String Id="UITextMenuCD" Overridable="yes">Installitakse CD-lt käitatavana</String>
558 <String Id="UITextMenuLocal" Overridable="yes">Installitakse kohalikule kõvakettale</String>
559 <String Id="UITextMenuNetwork" Overridable="yes">Installitakse võrgust käitatavana</String>
560 <String Id="UITextNewFolder" Overridable="yes">Kaust|Uus kaust</String>
561 <String Id="UITextScriptInProgress" Overridable="yes">Vajaliku teabe kogumine ...</String>
562 <String Id="UITextSelAbsentAbsent" Overridable="yes">See funktsioon jääb installimata</String>
563 <String Id="UITextSelAbsentAdvertise" Overridable="yes">See funktsioon määratakse nõudmisel installitavaks</String>
564 <String Id="UITextSelAbsentCD" Overridable="yes">See funktsioon installitakse CD-lt käitatavana</String>
565 <String Id="UITextSelAbsentLocal" Overridable="yes">See funktsioon installitakse kohalikule kõvakettale</String>
566 <String Id="UITextSelAbsentNetwork" Overridable="yes">See funktsioon installitakse võrgust käitatavana</String>
567 <String Id="UITextSelAdvertiseAbsent" Overridable="yes">See funktsioon muutub kättesaamatuks</String>
568 <String Id="UITextSelAdvertiseAdvertise" Overridable="yes">Installitakse nõudmisel</String>
569 <String Id="UITextSelAdvertiseCD" Overridable="yes">Seda funktsiooni saab edaspidi käitada CD-lt</String>
570 <String Id="UITextSelAdvertiseLocal" Overridable="yes">See funktsioon installitakse kohalikule kõvakettale</String>
571 <String Id="UITextSelAdvertiseNetwork" Overridable="yes">Seda funktsiooni saab edaspidi käitada võrgust</String>
572 <String Id="UITextSelCDAbsent" Overridable="yes">See funktsioon desinstallitakse täielikult, te ei saa seda enam CD-lt käitada</String>
573 <String Id="UITextSelCDAdvertise" Overridable="yes">See senini CD-lt käitatav funktsioon määratakse vajadusel installitavaks</String>
574 <String Id="UITextSelCDCD" Overridable="yes">See funktsioon jääb CD-lt käitatavaks</String>
575 <String Id="UITextSelCDLocal" Overridable="yes">Funktsiooni olek muutub CD-l käitatavast kohalikule kõvakettale installitavaks</String>
576 <String Id="UITextSelChildCostNeg" Overridable="yes">See komponent vabastab teie kõvakettal [1].</String>
577 <String Id="UITextSelChildCostPos" Overridable="yes">See funktsioon nõuab [1] kõvakettaruumi.</String>
578 <String Id="UITextSelCostPending" Overridable="yes">Selle funktsiooni kulu arvutamine ...</String>
579 <String Id="UITextSelLocalAbsent" Overridable="yes">See funktsioon eemaldatakse täielikult</String>
580 <String Id="UITextSelLocalAdvertise" Overridable="yes">See funktsioon eemaldatakse kohalikult kõvakettalt, kuid määratakse installitavaks nõudmisel</String>
581 <String Id="UITextSelLocalCD" Overridable="yes">See funktsioon eemaldatakse teie kohalikult kõvakettalt, kuid on edaspidi siiski käitatav CD-lt</String>
582 <String Id="UITextSelLocalLocal" Overridable="yes">See funktsioon jääb kohalikule kõvakettale installituks</String>
583 <String Id="UITextSelLocalNetwork" Overridable="yes">See funktsioon eemaldatakse teie kohalikult kõvakettalt, kuid võrgust saab seda endiselt käitada</String>
584 <String Id="UITextSelNetworkAbsent" Overridable="yes">See funktsioon desinstallitakse täielikult, te ei saa seda enam võrgust käitada</String>
585 <String Id="UITextSelNetworkAdvertise" Overridable="yes">Funktsiooni olek muutub võrgus käitatavast nõudmisel installitavaks</String>
586 <String Id="UITextSelNetworkLocal" Overridable="yes">Funktsiooni olek muutub võrgus käitatavast kohalikule kõvakettale installitavaks</String>
587 <String Id="UITextSelNetworkNetwork" Overridable="yes">See funktsioon jääb võrgust käitatavaks</String>
588 <String Id="UITextSelParentCostNegNeg" Overridable="yes">See funktsioon vabastab [1] kõvakettaruumi. Valitud on [2] alamfunktsiooni [3]-st. Alamfunktsioonid vabastavad teie kõvakettal [4] ruumi.</String>
589 <String Id="UITextSelParentCostNegPos" Overridable="yes">See funktsioon vabastab [1] kõvakettaruumi. Valitud on [2] alamfunktsiooni [3]-st. Alamfunktsioonide jaoks on vaja kõvakettal [4] ruumi.</String>
590 <String Id="UITextSelParentCostPosNeg" Overridable="yes">Selle funktsiooni jaoks on vaja kõvakettal [1] ruumi. Valitud on [2] alamfunktsiooni [3]-st. Alamfunktsioonid vabastavad teie kõvakettal [4] ruumi.</String>
591 <String Id="UITextSelParentCostPosPos" Overridable="yes">Selle funktsiooni jaoks on vaja kõvakettal [1] ruumi. Valitud on [2] alamfunktsiooni [3]-st. Alamfunktsioonide jaoks on vaja kõvakettal [4] ruumi.</String>
592 <String Id="UITextTimeRemaining" Overridable="yes">Aega jäänud: {[1] minut(it) }{[2] sekund(it)}</String>
593 <String Id="UITextVolumeCostAvailable" Overridable="yes">Saadaval</String>
594 <String Id="UITextVolumeCostDifference" Overridable="yes">Erinevus</String>
595 <String Id="UITextVolumeCostRequired" Overridable="yes">Nõutav</String>
596 <String Id="UITextVolumeCostSize" Overridable="yes">Kettamaht</String>
597 <String Id="UITextVolumeCostVolume" Overridable="yes">Draiv</String>
598</WixLocalization>
diff --git a/src/ext/UI/wixlib/WixUI_fi-FI.wxl b/src/ext/UI/wixlib/WixUI_fi-FI.wxl
new file mode 100644
index 00000000..1b8eecae
--- /dev/null
+++ b/src/ext/UI/wixlib/WixUI_fi-FI.wxl
@@ -0,0 +1,603 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3
4
5<WixLocalization Culture="fi-fi" Codepage="1252" xmlns="http://wixtoolset.org/schemas/v4/wxl">
6 <UI Dialog="ErrorDlg" Control="R" Width="64" />
7 <UI Dialog="FilesInUse" Control="Retry" X="296" Width="64" />
8 <UI Dialog="FilesInUse" Control="Ignore" X="227" />
9 <UI Dialog="FilesInUse" Control="Exit" X="158" />
10
11 <String Id="WixUIBack" Overridable="yes">&amp;Edellinen</String>
12 <String Id="WixUINext" Overridable="yes">&amp;Seuraava</String>
13 <String Id="WixUICancel" Overridable="yes">Peruuta</String>
14 <String Id="WixUIFinish" Overridable="yes">&amp;Valmis</String>
15 <String Id="WixUIRetry" Overridable="yes">&amp;Yritä uudelleen</String>
16 <String Id="WixUIIgnore" Overridable="yes">&amp;Ohita</String>
17 <String Id="WixUIYes" Overridable="yes">&amp;Kyllä</String>
18 <String Id="WixUINo" Overridable="yes">&amp;Ei</String>
19 <String Id="WixUIOK" Overridable="yes">OK</String>
20 <String Id="WixUIPrint" Overridable="yes">&amp;Tulosta</String>
21
22 <String Id="AdvancedWelcomeEulaDlg_Title" Overridable="yes">Tuotteen [ProductName] asennus</String>
23 <String Id="AdvancedWelcomeEulaDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
24 <String Id="AdvancedWelcomeEulaDlgTitle" Overridable="yes">{\WixUI_Font_Title}Lue tuotteen [ProductName] käyttöoikeussopimus</String>
25 <String Id="AdvancedWelcomeEulaDlgLicenseAcceptedCheckBox" Overridable="yes">&amp;Hyväksyn käyttöoikeussopimuksen ehdot</String>
26 <String Id="AdvancedWelcomeEulaDlgDescriptionPerMachine" Overridable="yes">Valitse Asenna, jos haluat asentaa tuotteen käyttäen oletusasetuksia kaikille käyttäjille. Valitse Lisäasetukset, jos haluat muuttaa asennuksen asetuksia.</String>
27 <String Id="AdvancedWelcomeEulaDlgDescriptionPerUser" Overridable="yes">Valitse Asenna, jos haluat asentaa tuotteen käyttäen oletusasetuksia vain nykyiselle käyttäjälle. Valitse Lisäasetukset, jos haluat muuttaa asennuksen asetuksia.</String>
28 <String Id="AdvancedWelcomeEulaDlgInstall" Overridable="yes">&amp;Asenna</String>
29 <String Id="AdvancedWelcomeEulaDlgAdvanced" Overridable="yes">&amp;Lisäasetukset</String>
30 <String Id="Advanced_Font_Normal_Size" Overridable="yes">8</String>
31 <String Id="Advanced_Font_Bigger_Size" Overridable="yes">12</String>
32 <String Id="Advanced_Font_Title_Size" Overridable="yes">9</String>
33 <String Id="Advanced_Font_Emphasized_Size" Overridable="yes">8</String>
34 <String Id="Advanced_Font_FaceName" Overridable="yes">Tahoma</String>
35
36 <String Id="BrowseDlg_Title" Overridable="yes">Tuotteen [ProductName] asennus</String>
37 <String Id="BrowseDlgComboLabel" Overridable="yes">&amp;Kohde:</String>
38 <String Id="BrowseDlgWixUI_Bmp_Up" Overridable="yes">WixUI_Bmp_Up</String>
39 <String Id="BrowseDlgWixUI_Bmp_UpTooltip" Overridable="yes">Yksi taso ylöspäin</String>
40 <String Id="BrowseDlgNewFolder" Overridable="yes">WixUI_Bmp_New</String>
41 <String Id="BrowseDlgNewFolderTooltip" Overridable="yes">Luo uusi kansio</String>
42 <String Id="BrowseDlgPathLabel" Overridable="yes">&amp;Kansion nimi:</String>
43 <String Id="BrowseDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
44 <String Id="BrowseDlgDescription" Overridable="yes">Selaa kohdekansioon</String>
45 <String Id="BrowseDlgTitle" Overridable="yes">{\WixUI_Font_Title}Vaihda kohdekansiota</String>
46
47 <String Id="CancelDlg_Title" Overridable="yes">Tuotteen [ProductName] asennus</String>
48 <String Id="CancelDlgText" Overridable="yes">Haluatko varmasti peruuttaa tuotteen [ProductName] asennuksen?</String>
49 <String Id="CancelDlgIcon" Overridable="yes">WixUI_Ico_Info</String>
50 <String Id="CancelDlgIconTooltip" Overridable="yes">Tietokuvake</String>
51
52 <String Id="CustomizeDlg_Title" Overridable="yes">Tuotteen [ProductName] asennus</String>
53 <String Id="CustomizeDlgTree" Overridable="yes">Valintojen puu</String>
54 <String Id="CustomizeDlgBrowse" Overridable="yes">&amp;Selaa...</String>
55 <String Id="CustomizeDlgReset" Overridable="yes">P&amp;alauta</String>
56 <String Id="CustomizeDlgDiskCost" Overridable="yes">Levyn &amp;käyttö</String>
57 <String Id="CustomizeDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
58 <String Id="CustomizeDlgText" Overridable="yes">Napsauttamalla alla olevassa puussa olevia kuvakkeita voit muuttaa ominaisuuksien asennustapaa.</String>
59 <String Id="CustomizeDlgDescription" Overridable="yes">Valitse ominaisuuksien asennustapa.</String>
60 <String Id="CustomizeDlgTitle" Overridable="yes">{\WixUI_Font_Title}Mukautettu asennus</String>
61 <String Id="CustomizeDlgItemDescription" Overridable="yes">CustomizeDlgItemDescription-CustomizeDlgItemDescription</String>
62 <String Id="CustomizeDlgItemSize" Overridable="yes">CustomizeDlgItemSize-CustomizeDlgItemSize</String>
63 <String Id="CustomizeDlgLocation" Overridable="yes">CustomizeDlgLocation-CustomizeDlgLocation</String>
64 <String Id="CustomizeDlgLocationLabel" Overridable="yes">Sijainti:</String>
65
66 <String Id="DiskCostDlg_Title" Overridable="yes">Tuotteen [ProductName] asennus</String>
67 <String Id="DiskCostDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
68 <String Id="DiskCostDlgText" Overridable="yes">Korostetuissa asemissa ei ole tarpeeksi vapaata levytilaa valittuja ominaisuuksia varten. Voit poistaa tiedostoja korostetuista asemista, asentaa vähemmän ominaisuuksia tai valita eri kohdeasemat.</String>
69 <String Id="DiskCostDlgDescription" Overridable="yes">Valittujen ominaisuuksien asentamiseen vaadittava levytila.</String>
70 <String Id="DiskCostDlgTitle" Overridable="yes">{\WixUI_Font_Title}Levytilavaatimukset</String>
71 <String Id="DiskCostDlgVolumeList" Overridable="yes">{120}{70}{70}{70}{70}</String>
72
73 <String Id="ErrorDlg_Title" Overridable="yes">Tuotteen [ProductName] asennus</String>
74 <String Id="ErrorDlgErrorText" Overridable="yes">Tietoteksti</String>
75 <String Id="ErrorDlgErrorIcon" Overridable="yes">WixUI_Ico_Info</String>
76 <String Id="ErrorDlgErrorIconTooltip" Overridable="yes">Tietokuvake</String>
77
78 <String Id="ExitDialog_Title" Overridable="yes">Tuotteen [ProductName] asennus</String>
79 <String Id="ExitDialogBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
80 <String Id="ExitDialogDescription" Overridable="yes">Lopeta ohjattu asennus valitsemalla Valmis.</String>
81 <String Id="ExitDialogTitle" Overridable="yes">{\WixUI_Font_Bigger}Tuotteen [ProductName] ohjattu asennus on suoritettu</String>
82
83 <String Id="FatalError_Title" Overridable="yes">Tuotteen [ProductName] asennus</String>
84 <String Id="FatalErrorBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
85 <String Id="FatalErrorTitle" Overridable="yes">{\WixUI_Font_Bigger}Tuotteen [ProductName] ohjattu asennus päättyi ennenaikaisesti</String>
86 <String Id="FatalErrorDescription1" Overridable="yes">Tuotteen [ProductName] ohjattu asennus päättyi ennenaikaisesti virheen vuoksi. Järjestelmään ei ole tehty muutoksia. Voit asentaa tämän ohjelman myöhemmin suorittamalla ohjatun asennuksen uudelleen.</String>
87 <String Id="FatalErrorDescription2" Overridable="yes">Lopeta ohjattu asennus valitsemalla Valmis.</String>
88
89 <String Id="FeaturesDlg_Title" Overridable="yes">Tuotteen [ProductName] asennus</String>
90 <String Id="FeaturesDlgTree" Overridable="yes">Tuotteen ominaisuudet</String>
91 <String Id="FeaturesDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
92 <String Id="FeaturesDlgDescription" Overridable="yes">Valitse ominaisuuksien asennustapa.</String>
93 <String Id="FeaturesDlgTitle" Overridable="yes">{\WixUI_Font_Title}Tuotteen ominaisuudet</String>
94 <String Id="FeaturesDlgItemDescription" Overridable="yes">FeaturesDlgItemDescription</String>
95 <String Id="FeaturesDlgItemSize" Overridable="yes">FeaturesDlgItemSize</String>
96 <String Id="FeaturesDlgInstall" Overridable="yes">&amp;Asenna</String>
97 <String Id="FeaturesDlgChange" Overridable="yes">&amp;Muuta</String>
98
99 <String Id="FilesInUse_Title" Overridable="yes">Tuotteen [ProductName] asennus</String>
100 <String Id="FilesInUseExit" Overridable="yes">&amp;Lopeta</String>
101 <String Id="FilesInUseBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
102 <String Id="FilesInUseText" Overridable="yes">Seuraavat sovellukset käyttävät tiedostoja, jotka tämän asennuksen on päivitettävä. Sulje sovellukset ja jatka sitten asennusta valitsemalla &amp;Yritä uudelleen tai lopeta ohjattu toiminto valitsemalla Lopeta.</String>
103 <String Id="FilesInUseDescription" Overridable="yes">Jotkin päivitettävät tiedostot ovat tällä hetkellä käytössä.</String>
104 <String Id="FilesInUseTitle" Overridable="yes">{\WixUI_Font_Title}Tiedostoja on käytössä</String>
105
106 <String Id="InstallDirDlg_Title" Overridable="yes">Tuotteen [ProductName] asennus</String>
107 <String Id="InstallDirDlgChange" Overridable="yes">&amp;Muuta...</String>
108 <String Id="InstallDirDlgTitle" Overridable="yes">{\WixUI_Font_Title}Kohdekansio</String>
109 <String Id="InstallDirDlgDescription" Overridable="yes">Valitse Seuraava, jos haluat asentaa oletuskansioon, tai valitse Muuta, jos haluat valita toisen kansion.</String>
110 <String Id="InstallDirDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
111 <String Id="InstallDirDlgFolderLabel" Overridable="yes">Asenna [ProductName] seuraavaan sijaintiin:</String>
112
113 <String Id="InstallScopeDlg_Title" Overridable="yes">Tuotteen [ProductName] asennus</String>
114 <String Id="InstallScopeDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
115 <String Id="InstallScopeDlgDescription" Overridable="yes">Valitse asennuksen laajuus ja kansio</String>
116 <String Id="InstallScopeDlgTitle" Overridable="yes">{\WixUI_Font_Title}Asennuksen laajuus</String>
117 <String Id="InstallScopeDlgPerUser" Overridable="yes">{\WixUI_Font_Emphasized}Asenna &amp;vain nykyiselle käyttäjälle ([LogonUser])</String>
118 <String Id="InstallScopeDlgPerUserDescription" Overridable="yes">[ProductName] asennetaan käyttäjäkohtaiseen kansioon, ja se on vain nykyisen käyttäjätilin käytettävissä. Paikallisia järjestelmänvalvojaoikeuksia ei tarvita.</String>
119 <String Id="InstallScopeDlgNoPerUserDescription" Overridable="yes">[ProductName] ei tue käyttäjäkohtaista asennusta.</String>
120 <String Id="InstallScopeDlgPerMachine" Overridable="yes">{\WixUI_Font_Emphasized}Asenna kaikille tämän &amp;tietokoneen käyttäjille</String>
121 <String Id="InstallScopeDlgPerMachineDescription" Overridable="yes">[ProductName] asennetaan tietokonekohtaiseen kansioon oletusarvon mukaan, ja se on kaikkien käyttäjien käytettävissä. Oletusasennuskansiota voi muuttaa. Paikalliset järjestelmänvalvojaoikeudet tarvitaan.</String>
122 <String Id="InstallScopeDlgFolderLabel" Overridable="yes">Asennus&amp;kansio:</String>
123 <String Id="InstallScopeDlgChange" Overridable="yes">&amp;Muuta...</String>
124
125 <String Id="InvalidDirDlg_Title" Overridable="yes">Tuotteen [ProductName] asennus</String>
126 <String Id="InvalidDirDlgText" Overridable="yes">Asennushakemiston on oltava paikallisessa kiintolevyasemassa.</String>
127 <String Id="InvalidDirDlgIcon" Overridable="yes">WixUI_Ico_Info</String>
128 <String Id="InvalidDirDlgIconTooltip" Overridable="yes">Tietokuvake</String>
129
130 <String Id="LicenseAgreementDlg_Title" Overridable="yes">Tuotteen [ProductName] asennus</String>
131 <String Id="LicenseAgreementDlgLicenseAcceptedCheckBox" Overridable="yes">&amp;Hyväksyn käyttöoikeussopimuksen ehdot</String>
132 <String Id="LicenseAgreementDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
133 <String Id="LicenseAgreementDlgDescription" Overridable="yes">Lue seuraava käyttöoikeussopimus huolellisesti</String>
134 <String Id="LicenseAgreementDlgTitle" Overridable="yes">{\WixUI_Font_Title}Käyttöoikeussopimus</String>
135
136 <String Id="MaintenanceTypeDlg_Title" Overridable="yes">Tuotteen [ProductName] asennus</String>
137 <String Id="MaintenanceTypeDlgChangeButton" Overridable="yes">&amp;Muuta</String>
138 <String Id="MaintenanceTypeDlgChangeButtonTooltip" Overridable="yes">Muuta asennusta</String>
139 <String Id="MaintenanceTypeDlgRepairButton" Overridable="yes">&amp;Korjaa</String>
140 <String Id="MaintenanceTypeDlgRepairButtonTooltip" Overridable="yes">Korjaa asennus</String>
141 <String Id="MaintenanceTypeDlgRemoveButton" Overridable="yes">&amp;Poista</String>
142 <String Id="MaintenanceTypeDlgRemoveButtonTooltip" Overridable="yes">Poista asennus</String>
143 <String Id="MaintenanceTypeDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
144 <String Id="MaintenanceTypeDlgDescription" Overridable="yes">Valitse suoritettava toiminto.</String>
145 <String Id="MaintenanceTypeDlgTitle" Overridable="yes">{\WixUI_Font_Title}Korjaa tai poista asennus tai muuta sitä</String>
146 <String Id="MaintenanceTypeDlgChangeText" Overridable="yes">Antaa muuttaa asennettuja ominaisuuksia.</String>
147 <String Id="MaintenanceTypeDlgChangeDisabledText" Overridable="yes">Tuotteessa [ProductName] ei ole erikseen valittavia ominaisuuksia.</String>
148 <String Id="MaintenanceTypeDlgRemoveText" Overridable="yes">Poistaa tuotteen [ProductName] tietokoneesta.</String>
149 <String Id="MaintenanceTypeDlgRemoveDisabledText" Overridable="yes">Tuotetta [ProductName] ei voi poistaa.</String>
150 <String Id="MaintenanceTypeDlgRepairText" Overridable="yes">Korjaa uusimman asennuksen virheitä korjaamalla puuttuvia ja vioittuneita tiedostoja, pikakuvakkeita ja rekisterimerkintöjä.</String>
151 <String Id="MaintenanceTypeDlgRepairDisabledText" Overridable="yes">Tuotetta [ProductName] ei voi korjata.</String>
152
153 <String Id="MaintenanceWelcomeDlg_Title" Overridable="yes">Tuotteen [ProductName] asennus</String>
154 <String Id="MaintenanceWelcomeDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
155 <String Id="MaintenanceWelcomeDlgDescription" Overridable="yes">Ohjatun asennuksen avulla voit muuttaa sitä, miten tuotteen [ProductName] ominaisuudet asennetaan tietokoneeseen, tai poistaa tuotteen tietokoneesta. Voit jatkaa valitsemalla Seuraava tai poistua ohjatusta asennuksesta valitsemalla Peruuta.</String>
156 <String Id="MaintenanceWelcomeDlgTitle" Overridable="yes">{\WixUI_Font_Bigger}Tervetuloa tuotteen [ProductName] ohjattuun asennukseen</String>
157
158 <String Id="MsiRMFilesInUse_Title" Overridable="yes">Tuotteen [ProductName] asennus</String>
159 <String Id="MsiRMFilesInUseBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
160 <String Id="MsiRMFilesInUseText" Overridable="yes">Seuraavat sovellukset käyttävät tiedostoja, jotka tämän asennuksen on päivitettävä. Voit antaa ohjatun asennuksen sulkea ne ja yrittää käynnistää ne uudelleen tai käynnistää tietokoneen myöhemmin uudelleen.</String>
161 <String Id="MsiRMFilesInUseDescription" Overridable="yes">Jotkin päivitettävät tiedostot ovat tällä hetkellä käytössä.</String>
162 <String Id="MsiRMFilesInUseTitle" Overridable="yes">{\WixUI_Font_Title}Tiedostoja on käytössä</String>
163 <String Id="MsiRMFilesInUseUseRM" Overridable="yes">&amp;Sulje sovellukset ja yritä käynnistää ne uudelleen.</String>
164 <String Id="MsiRMFilesInUseDontUseRM" Overridable="yes">&amp;Älä sulje sovelluksia. Uudelleenkäynnistys tarvitaan.</String>
165
166 <String Id="OutOfDiskDlg_Title" Overridable="yes">Tuotteen [ProductName] asennus</String>
167 <String Id="OutOfDiskDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
168 <String Id="OutOfDiskDlgText" Overridable="yes">Korostetuissa asemissa ei ole tarpeeksi vapaata levytilaa valittuja ominaisuuksia varten. Voit poistaa tiedostoja korostetuista asemista, asentaa vähemmän ominaisuuksia tai valita toisen kohdeaseman.</String>
169 <String Id="OutOfDiskDlgDescription" Overridable="yes">Asennuksen vaatima levytila on suurempi kuin käytettävissä oleva levytila.</String>
170 <String Id="OutOfDiskDlgTitle" Overridable="yes">{\WixUI_Font_Title}Levytila lopussa</String>
171 <String Id="OutOfDiskDlgVolumeList" Overridable="yes">{120}{70}{70}{70}{70}</String>
172
173 <String Id="OutOfRbDiskDlg_Title" Overridable="yes">Tuotteen [ProductName] asennus</String>
174 <String Id="OutOfRbDiskDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
175 <String Id="OutOfRbDiskDlgText" Overridable="yes">Korostetuissa asemissa ei ole tarpeeksi vapaata levytilaa valittuja ominaisuuksia varten. Voit poistaa tiedostoja korostetuista asemista, asentaa vähemmän ominaisuuksia tai valita toisen kohdeaseman.</String>
176 <String Id="OutOfRbDiskDlgDescription" Overridable="yes">Asennuksen vaatima levytila on suurempi kuin käytettävissä oleva levytila.</String>
177 <String Id="OutOfRbDiskDlgTitle" Overridable="yes">{\WixUI_Font_Title}Levytila lopussa</String>
178 <String Id="OutOfRbDiskDlgVolumeList" Overridable="yes">{120}{70}{70}{70}{70}</String>
179 <String Id="OutOfRbDiskDlgText2" Overridable="yes">Voit myös poistaa asennusohjelman palautustoiminnon käytöstä. Palautuksen poistaminen käytöstä estää asennusohjelmaa palauttamasta tietokoneen alkuperäistä tilaa, jos asennus keskeytyy jollakin tavalla. Valitse Kyllä, jos haluat ottaa riskin ja poistaa palautuksen käytöstä.</String>
180
181 <String Id="PrepareDlg_Title" Overridable="yes">Tuotteen [ProductName] asennus</String>
182 <String Id="PrepareDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
183 <String Id="PrepareDlgDescription" Overridable="yes">Odota. Ohjattu asennus valmistautuu asennukseen.</String>
184 <String Id="PrepareDlgTitle" Overridable="yes">{\WixUI_Font_Bigger}Tervetuloa tuotteen [ProductName] ohjattuun asennukseen</String>
185
186 <String Id="ProgressDlg_Title" Overridable="yes">Tuotteen [ProductName] asennus</String>
187 <String Id="ProgressDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
188 <String Id="ProgressDlgTextInstalling" Overridable="yes">Odota. Ohjattu asennus asentaa tuotteen [ProductName].</String>
189 <String Id="ProgressDlgTitleInstalling" Overridable="yes">{\WixUI_Font_Title}Asennetaan tuotetta [ProductName]</String>
190 <String Id="ProgressDlgTextChanging" Overridable="yes">Odota. Ohjattu asennus muuttaa tuotteen [ProductName] asennusta.</String>
191 <String Id="ProgressDlgTitleChanging" Overridable="yes">{\WixUI_Font_Title}Muutetaan tuotetta [ProductName]</String>
192 <String Id="ProgressDlgTextRepairing" Overridable="yes">Odota. Ohjattu asennus korjaa tuotteen [ProductName].</String>
193 <String Id="ProgressDlgTitleRepairing" Overridable="yes">{\WixUI_Font_Title}Korjataan tuotetta [ProductName]</String>
194 <String Id="ProgressDlgTextRemoving" Overridable="yes">Odota. Ohjattu asennus poistaa tuotteen [ProductName].</String>
195 <String Id="ProgressDlgTitleRemoving" Overridable="yes">{\WixUI_Font_Title}Poistetaan tuotetta [ProductName]</String>
196 <String Id="ProgressDlgTextUpdating" Overridable="yes">Odota. Ohjattu asennus päivittää tuotteen [ProductName].</String>
197 <String Id="ProgressDlgTitleUpdating" Overridable="yes">{\WixUI_Font_Title}Päivitetään tuotetta [ProductName]</String>
198 <String Id="ProgressDlgProgressBar" Overridable="yes">Valmis</String>
199 <String Id="ProgressDlgStatusLabel" Overridable="yes">Tila:</String>
200
201 <String Id="ResumeDlg_Title" Overridable="yes">Tuotteen [ProductName] asennus</String>
202 <String Id="ResumeDlgInstall" Overridable="yes">&amp;Asenna</String>
203 <String Id="ResumeDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
204 <String Id="ResumeDlgDescription" Overridable="yes">Ohjattu asennus viimeistelee tuotteen [ProductName] asennuksen tietokoneeseen. Voit jatkaa valitsemalla Asenna tai lopettaa ohjatun asennuksen valitsemalla Peruuta.</String>
205 <String Id="ResumeDlgTitle" Overridable="yes">{\WixUI_Font_Bigger}Jatketaan tuotteen [ProductName] ohjattua asennusta</String>
206
207 <String Id="SetupTypeDlg_Title" Overridable="yes">Tuotteen [ProductName] asennus</String>
208 <String Id="SetupTypeDlgTypicalButton" Overridable="yes">&amp;Normaali</String>
209 <String Id="SetupTypeDlgTypicalButtonTooltip" Overridable="yes">Normaali asennus</String>
210 <String Id="SetupTypeDlgCustomButton" Overridable="yes">&amp;Mukautettu</String>
211 <String Id="SetupTypeDlgCustomButtonTooltip" Overridable="yes">Mukautettu asennus</String>
212 <String Id="SetupTypeDlgCompleteButton" Overridable="yes">&amp;Valmis</String>
213 <String Id="SetupTypeDlgCompleteButtonTooltip" Overridable="yes">Täydellinen asennus</String>
214 <String Id="SetupTypeDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
215 <String Id="SetupTypeDlgTitle" Overridable="yes">{\WixUI_Font_Title}Valitse asennustyyppi</String>
216 <String Id="SetupTypeDlgDescription" Overridable="yes">Valitse tarpeitasi parhaiten vastaava asennustyyppi</String>
217 <String Id="SetupTypeDlgTypicalText" Overridable="yes">Asentaa yleisimmät ohjelman ominaisuudet. Suositellaan useimmille käyttäjille.</String>
218 <String Id="SetupTypeDlgCustomText" Overridable="yes">Käyttäjä voi valita, mitkä ohjelman ominaisuudet asennetaan ja mihin ne asennetaan. Suositellaan kokeneille käyttäjille.</String>
219 <String Id="SetupTypeDlgCompleteText" Overridable="yes">Kaikki ohjelman ominaisuudet asennetaan. Vaatii eniten levytilaa.</String>
220
221 <String Id="UserExit_Title" Overridable="yes">Tuotteen [ProductName] asennus</String>
222 <String Id="UserExitBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
223 <String Id="UserExitTitle" Overridable="yes">{\WixUI_Font_Bigger}Tuotteen [ProductName] ohjattu asennus keskeytyi</String>
224 <String Id="UserExitDescription1" Overridable="yes">Tuotteen [ProductName] asennus on keskeytynyt. Järjestelmään ei ole tehty muutoksia. Voit asentaa tämän ohjelman myöhemmin suorittamalla asennuksen uudelleen.</String>
225 <String Id="UserExitDescription2" Overridable="yes">Lopeta ohjattu asennus valitsemalla Valmis.</String>
226
227 <String Id="VerifyReadyDlg_Title" Overridable="yes">Tuotteen [ProductName] asennus</String>
228 <String Id="VerifyReadyDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
229 <String Id="VerifyReadyDlgInstall" Overridable="yes">&amp;Asenna</String>
230 <String Id="VerifyReadyDlgInstallText" Overridable="yes">Voit aloittaa asennuksen valitsemalla Asenna. Voit tarkastella tai muuttaa asennuksen asetuksia valitsemalla Edellinen. Voit lopettaa ohjatun toiminnon valitsemalla Peruuta.</String>
231 <String Id="VerifyReadyDlgInstallTitle" Overridable="yes">{\WixUI_Font_Title}Valmiina asentamaan tuotteen [ProductName]</String>
232 <String Id="VerifyReadyDlgChange" Overridable="yes">&amp;Muuta</String>
233 <String Id="VerifyReadyDlgChangeText" Overridable="yes">Voit aloittaa asennuksen valitsemalla Muuta. Voit tarkastella ja muuttaa asennuksen asetuksia valitsemalla Edellinen. Voit lopettaa ohjatun toiminnon valitsemalla Peruuta.</String>
234 <String Id="VerifyReadyDlgChangeTitle" Overridable="yes">{\WixUI_Font_Title}Valmiina muuttamaan tuotetta [ProductName]</String>
235 <String Id="VerifyReadyDlgRepair" Overridable="yes">&amp;Korjaa</String>
236 <String Id="VerifyReadyDlgRepairText" Overridable="yes">Voit aloittaa tuotteen [ProductName] asennuksen korjauksen valitsemalla Korjaa. Voit tarkastella tai muuttaa asennuksen asetuksia valitsemalla Edellinen. Voit lopettaa ohjatun toiminnon valitsemalla Peruuta.</String>
237 <String Id="VerifyReadyDlgRepairTitle" Overridable="yes">{\WixUI_Font_Title}Valmiina korjaamaan tuotteen [ProductName]</String>
238 <String Id="VerifyReadyDlgRemove" Overridable="yes">&amp;Poista</String>
239 <String Id="VerifyReadyDlgRemoveText" Overridable="yes">Voit poistaa tuotteen [ProductName] tietokoneestasi valitsemalla Poista. Voit tarkastella tai muuttaa asennuksen asetuksia valitsemalla Edellinen. Voit lopettaa ohjatun toiminnon valitsemalla Peruuta.</String>
240 <String Id="VerifyReadyDlgRemoveTitle" Overridable="yes">{\WixUI_Font_Title}Valmiina poistamaan tuotteen [ProductName]</String>
241 <String Id="VerifyReadyDlgUpdate" Overridable="yes">&amp;Päivitä</String>
242 <String Id="VerifyReadyDlgUpdateText" Overridable="yes">Valitse Päivitä, jos haluat päivittää tietokoneessa olevan tuotteen [ProductName]. Valitse Edellinen, jos haluat tarkastella tai muuttaa asennuksen asetuksia. Valitse Peruuta, jos haluat lopettaa ohjatun toiminnon.</String>
243 <String Id="VerifyReadyDlgUpdateTitle" Overridable="yes">{\WixUI_Font_Title}Valmiina päivittämään tuotteen [ProductName]</String>
244
245 <String Id="WaitForCostingDlg_Title" Overridable="yes">Tuotteen [ProductName] asennus</String>
246 <String Id="WaitForCostingDlgReturn" Overridable="yes">&amp;Palaa</String>
247 <String Id="WaitForCostingDlgText" Overridable="yes">Odota hetki. Asennusohjelma viimeistelee levytilavaatimusten määrittämistä.</String>
248 <String Id="WaitForCostingDlgIcon" Overridable="yes">WixUI_Ico_Exclam</String>
249 <String Id="WaitForCostingDlgIconTooltip" Overridable="yes">Huutomerkkikuvake</String>
250
251 <String Id="WelcomeDlg_Title" Overridable="yes">Tuotteen [ProductName] asennus</String>
252 <String Id="WelcomeDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
253 <String Id="WelcomeDlgDescription" Overridable="yes">Ohjattu asennus asentaa tuotteen [ProductName] tietokoneeseen. Voit jatkaa valitsemalla Seuraava tai lopettaa ohjatun asennuksen valitsemalla Peruuta.</String>
254 <String Id="WelcomeUpdateDlgDescriptionUpdate" Overridable="yes">Ohjattu asennus päivittää tietokoneessa olevan tuotteen [ProductName]. Valitse Seuraava, jos haluat jatkaa, tai valitse Peruuta, jos haluat lopettaa ohjatun asennuksen.</String>
255 <String Id="WelcomeDlgTitle" Overridable="yes">{\WixUI_Font_Bigger}Tervetuloa tuotteen [ProductName] ohjattuun asennukseen</String>
256
257 <String Id="WelcomeEulaDlg_Title" Overridable="yes">Tuotteen [ProductName] asennus</String>
258 <String Id="WelcomeEulaDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
259 <String Id="WelcomeEulaDlgLicenseAcceptedCheckBox" Overridable="yes">&amp;Hyväksyn käyttöoikeussopimuksen ehdot</String>
260 <String Id="WelcomeEulaDlgInstall" Overridable="yes">&amp;Asenna</String>
261 <String Id="WelcomeEulaDlgUpdate" Overridable="yes">&amp;Päivitä</String>
262 <String Id="WelcomeEulaDlgTitle" Overridable="yes">{\WixUI_Font_Title}Lue tuotteen [ProductName] käyttöoikeussopimus</String>
263
264 <String Id="ProgressTextInstallValidate" Overridable="yes">Vahvistetaan asennusta</String>
265 <String Id="ProgressTextInstallFiles" Overridable="yes">Kopioidaan uusia tiedostoja</String>
266 <String Id="ProgressTextInstallFilesTemplate" Overridable="yes">Tiedosto: [1], hakemisto: [9], koko: [6]</String>
267 <String Id="ProgressTextInstallAdminPackage" Overridable="yes">Kopioidaan verkkoasennustiedostoja</String>
268 <String Id="ProgressTextInstallAdminPackageTemplate" Overridable="yes">Tiedosto: [1], hakemisto: [9], koko: [6]</String>
269 <String Id="ProgressTextFileCost" Overridable="yes">Lasketaan tilavaatimuksia</String>
270 <String Id="ProgressTextCostInitialize" Overridable="yes">Lasketaan tilavaatimuksia</String>
271 <String Id="ProgressTextCostFinalize" Overridable="yes">Lasketaan tilavaatimuksia</String>
272 <String Id="ProgressTextCreateShortcuts" Overridable="yes">Luodaan pikakuvakkeita</String>
273 <String Id="ProgressTextCreateShortcutsTemplate" Overridable="yes">Pikakuvake: [1]</String>
274 <String Id="ProgressTextPublishComponents" Overridable="yes">Julkaistaan valittuja osia</String>
275 <String Id="ProgressTextPublishComponentsTemplate" Overridable="yes">Osan tunnus: [1], tarkenne: [2]</String>
276 <String Id="ProgressTextPublishFeatures" Overridable="yes">Julkaistaan tuotteen ominaisuudet</String>
277 <String Id="ProgressTextPublishFeaturesTemplate" Overridable="yes">Toiminto: [1]</String>
278 <String Id="ProgressTextPublishProduct" Overridable="yes">Julkaistaan tuotetietoja</String>
279 <String Id="ProgressTextRegisterClassInfo" Overridable="yes">Rekisteröidään luokkapalvelimia</String>
280 <String Id="ProgressTextRegisterClassInfoTemplate" Overridable="yes">Luokkatunnus: [1]</String>
281 <String Id="ProgressTextRegisterExtensionInfo" Overridable="yes">Rekisteröidään laajennuspalvelimia</String>
282 <String Id="ProgressTextRegisterExtensionInfoTemplate" Overridable="yes">Laajennus: [1]</String>
283 <String Id="ProgressTextRegisterMIMEInfo" Overridable="yes">Rekisteröidään MIME-tietoja</String>
284 <String Id="ProgressTextRegisterMIMEInfoTemplate" Overridable="yes">MIME-sisältötyyppi: [1], laajennus: [2]</String>
285 <String Id="ProgressTextRegisterProgIdInfo" Overridable="yes">Rekisteröidään ohjelmatunnisteita</String>
286 <String Id="ProgressTextRegisterProgIdInfoTemplate" Overridable="yes">Ohjelmatunniste: [1]</String>
287 <String Id="ProgressTextAllocateRegistrySpace" Overridable="yes">Varataan rekisteritilaa</String>
288 <String Id="ProgressTextAllocateRegistrySpaceTemplate" Overridable="yes">Vapaa tila: [1]</String>
289 <String Id="ProgressTextAppSearch" Overridable="yes">Etsitään asennettuja sovelluksia</String>
290 <String Id="ProgressTextAppSearchTemplate" Overridable="yes">Ominaisuus: [1], allekirjoitus: [2]</String>
291 <String Id="ProgressTextBindImage" Overridable="yes">Sidotaan ohjelmatiedostoja</String>
292 <String Id="ProgressTextBindImageTemplate" Overridable="yes">Tiedosto: [1]</String>
293 <String Id="ProgressTextCCPSearch" Overridable="yes">Etsitään vaatimukset täyttäviä tuotteita</String>
294 <String Id="ProgressTextCreateFolders" Overridable="yes">Luodaan kansioita</String>
295 <String Id="ProgressTextCreateFoldersTemplate" Overridable="yes">Kansio: [1]</String>
296 <String Id="ProgressTextDeleteServices" Overridable="yes">Poistetaan palveluita</String>
297 <String Id="ProgressTextDeleteServicesTemplate" Overridable="yes">Palvelu: [1]</String>
298 <String Id="ProgressTextDuplicateFiles" Overridable="yes">Luodaan tiedostojen kaksoiskappaleita</String>
299 <String Id="ProgressTextDuplicateFilesTemplate" Overridable="yes">Tiedosto: [1], hakemisto: [9], koko: [6]</String>
300 <String Id="ProgressTextFindRelatedProducts" Overridable="yes">Etsitään yhteensopivia sovelluksia</String>
301 <String Id="ProgressTextFindRelatedProductsTemplate" Overridable="yes">Löydettiin sovellus: [1]</String>
302 <String Id="ProgressTextInstallODBC" Overridable="yes">Asennetaan ODBC-osia</String>
303 <String Id="ProgressTextInstallServices" Overridable="yes">Asennetaan uusia palveluita</String>
304 <String Id="ProgressTextInstallServicesTemplate" Overridable="yes">Palvelu: [2]</String>
305 <String Id="ProgressTextLaunchConditions" Overridable="yes">Arvioidaan käynnistysehtoja</String>
306 <String Id="ProgressTextMigrateFeatureStates" Overridable="yes">Siirretään ominaisuuksien tiloja muista sovelluksista</String>
307 <String Id="ProgressTextMigrateFeatureStatesTemplate" Overridable="yes">Sovellus: [1]</String>
308 <String Id="ProgressTextMoveFiles" Overridable="yes">Siirretään tiedostoja</String>
309 <String Id="ProgressTextMoveFilesTemplate" Overridable="yes">Tiedosto: [1], hakemisto: [9], koko: [6]</String>
310 <String Id="ProgressTextPatchFiles" Overridable="yes">Korjataan tiedostoja</String>
311 <String Id="ProgressTextPatchFilesTemplate" Overridable="yes">Tiedosto: [1], hakemisto: [2], koko: [3]</String>
312 <String Id="ProgressTextProcessComponents" Overridable="yes">Päivitetään osien rekisteröintiä</String>
313 <String Id="ProgressTextRegisterComPlus" Overridable="yes">Rekisteröidään COM+-sovelluksia ja -osia</String>
314 <String Id="ProgressTextRegisterComPlusTemplate" Overridable="yes">Sovellustunnus: [1]{{, Sovellustyyppi: [2], Käyttäjät: [3], RSN: [4]}}</String>
315 <String Id="ProgressTextRegisterFonts" Overridable="yes">Rekisteröidään fontteja</String>
316 <String Id="ProgressTextRegisterFontsTemplate" Overridable="yes">Fontti: [1]</String>
317 <String Id="ProgressTextRegisterProduct" Overridable="yes">Rekisteröidään tuote</String>
318 <String Id="ProgressTextRegisterProductTemplate" Overridable="yes">[1]</String>
319 <String Id="ProgressTextRegisterTypeLibraries" Overridable="yes">Rekisteröidään tyyppikirjastoja</String>
320 <String Id="ProgressTextRegisterTypeLibrariesTemplate" Overridable="yes">Kirjastotunniste: [1]</String>
321 <String Id="ProgressTextRegisterUser" Overridable="yes">Rekisteröidään käyttäjä</String>
322 <String Id="ProgressTextRegisterUserTemplate" Overridable="yes">[1]</String>
323 <String Id="ProgressTextRemoveDuplicateFiles" Overridable="yes">Poistetaan tiedostojen kaksoiskappaleita</String>
324 <String Id="ProgressTextRemoveDuplicateFilesTemplate" Overridable="yes">Tiedosto: [1], hakemisto: [9]</String>
325 <String Id="ProgressTextRemoveEnvironmentStrings" Overridable="yes">Päivitetään ympäristömerkkijonoja</String>
326 <String Id="ProgressTextRemoveEnvironmentStringsTemplate" Overridable="yes">Nimi: [1], arvo: [2], toiminto [3]</String>
327 <String Id="ProgressTextRemoveExistingProducts" Overridable="yes">Poistetaan sovelluksia</String>
328 <String Id="ProgressTextRemoveExistingProductsTemplate" Overridable="yes">Sovellus: [1], komentorivi: [2]</String>
329 <String Id="ProgressTextRemoveFiles" Overridable="yes">Poistetaan tiedostoja</String>
330 <String Id="ProgressTextRemoveFilesTemplate" Overridable="yes">Tiedosto: [1], hakemisto: [9]</String>
331 <String Id="ProgressTextRemoveFolders" Overridable="yes">Poistetaan kansioita</String>
332 <String Id="ProgressTextRemoveFoldersTemplate" Overridable="yes">Kansio: [1]</String>
333 <String Id="ProgressTextRemoveIniValues" Overridable="yes">Poistetaan INI-tiedostojen merkintöjä</String>
334 <String Id="ProgressTextRemoveIniValuesTemplate" Overridable="yes">Tiedosto: [1], osa: [2], avain: [3], arvo: [4]</String>
335 <String Id="ProgressTextRemoveODBC" Overridable="yes">Poistetaan ODBC-osia</String>
336 <String Id="ProgressTextRemoveRegistryValues" Overridable="yes">Poistetaan järjestelmärekisterin arvoja</String>
337 <String Id="ProgressTextRemoveRegistryValuesTemplate" Overridable="yes">Avain: [1], nimi: [2]</String>
338 <String Id="ProgressTextRemoveShortcuts" Overridable="yes">Poistetaan pikakuvakkeita</String>
339 <String Id="ProgressTextRemoveShortcutsTemplate" Overridable="yes">Pikakuvake: [1]</String>
340 <String Id="ProgressTextRMCCPSearch" Overridable="yes">Etsitään vaatimukset täyttäviä tuotteita</String>
341 <String Id="ProgressTextSelfRegModules" Overridable="yes">Rekisteröidään moduuleita</String>
342 <String Id="ProgressTextSelfRegModulesTemplate" Overridable="yes">Tiedosto: [1], kansio: [2]</String>
343 <String Id="ProgressTextSelfUnregModules" Overridable="yes">Poistetaan moduulien rekisteröintiä</String>
344 <String Id="ProgressTextSelfUnregModulesTemplate" Overridable="yes">Tiedosto: [1], kansio: [2]</String>
345 <String Id="ProgressTextSetODBCFolders" Overridable="yes">Alustetaan ODBC-hakemistoja</String>
346 <String Id="ProgressTextStartServices" Overridable="yes">Käynnistetään palveluita</String>
347 <String Id="ProgressTextStartServicesTemplate" Overridable="yes">Palvelu: [1]</String>
348 <String Id="ProgressTextStopServices" Overridable="yes">Pysäytetään palveluita</String>
349 <String Id="ProgressTextStopServicesTemplate" Overridable="yes">Palvelu: [1]</String>
350 <String Id="ProgressTextUnpublishComponents" Overridable="yes">Peruutetaan valittujen osien julkaisemista</String>
351 <String Id="ProgressTextUnpublishComponentsTemplate" Overridable="yes">Osan tunnus: [1], tarkenne: [2]</String>
352 <String Id="ProgressTextUnpublishFeatures" Overridable="yes">Peruutetaan tuotteen ominaisuuksien julkaisemista</String>
353 <String Id="ProgressTextUnpublishFeaturesTemplate" Overridable="yes">Toiminto: [1]</String>
354 <String Id="ProgressTextUnregisterClassInfo" Overridable="yes">Poista luokkapalvelinten rekisteröinti</String>
355 <String Id="ProgressTextUnregisterClassInfoTemplate" Overridable="yes">Luokkatunnus: [1]</String>
356 <String Id="ProgressTextUnregisterComPlus" Overridable="yes">Poistetaan COM+-sovellusten ja -osien rekisteröintiä</String>
357 <String Id="ProgressTextUnregisterComPlusTemplate" Overridable="yes">Sovellustunnus: [1]{{, sovelluksen tyyppi: [2]}}</String>
358 <String Id="ProgressTextUnregisterExtensionInfo" Overridable="yes">Poistetaan laajennuspalvelimien rekisteröintiä</String>
359 <String Id="ProgressTextUnregisterExtensionInfoTemplate" Overridable="yes">Laajennus: [1]</String>
360 <String Id="ProgressTextUnregisterFonts" Overridable="yes">Poistetaan fonttien rekisteröintiä</String>
361 <String Id="ProgressTextUnregisterFontsTemplate" Overridable="yes">Fontti: [1]</String>
362 <String Id="ProgressTextUnregisterMIMEInfo" Overridable="yes">Poistetaan MIME-rekisteröintiä</String>
363 <String Id="ProgressTextUnregisterMIMEInfoTemplate" Overridable="yes">MIME-sisältötyyppi: [1], laajennus: [2]</String>
364 <String Id="ProgressTextUnregisterProgIdInfo" Overridable="yes">Poistetaan ohjelmatunnisteiden rekisteröintiä</String>
365 <String Id="ProgressTextUnregisterProgIdInfoTemplate" Overridable="yes">Ohjelmatunniste: [1]</String>
366 <String Id="ProgressTextUnregisterTypeLibraries" Overridable="yes">Poistetaan tyyppikirjastojen rekisteröintiä</String>
367 <String Id="ProgressTextUnregisterTypeLibrariesTemplate" Overridable="yes">Kirjastotunniste: [1]</String>
368 <String Id="ProgressTextWriteEnvironmentStrings" Overridable="yes">Päivitetään ympäristömerkkijonoja</String>
369 <String Id="ProgressTextWriteEnvironmentStringsTemplate" Overridable="yes">Nimi: [1], arvo: [2], toiminto [3]</String>
370 <String Id="ProgressTextWriteIniValues" Overridable="yes">Kirjoitetaan INI-tiedoston arvoja</String>
371 <String Id="ProgressTextWriteIniValuesTemplate" Overridable="yes">Tiedosto: [1], osa: [2], avain: [3], arvo: [4]</String>
372 <String Id="ProgressTextWriteRegistryValues" Overridable="yes">Kirjoitetaan järjestelmärekisteriarvoja</String>
373 <String Id="ProgressTextWriteRegistryValuesTemplate" Overridable="yes">Avain: [1], nimi: [2], arvo: [3]</String>
374 <String Id="ProgressTextAdvertise" Overridable="yes">Ilmoitetaan sovelluksesta</String>
375 <String Id="ProgressTextGenerateScript" Overridable="yes">Muodostetaan komentosarjatoimintoja toiminnolle:</String>
376 <String Id="ProgressTextGenerateScriptTemplate" Overridable="yes">[1]</String>
377 <String Id="ProgressTextInstallSFPCatalogFile" Overridable="yes">Asennetaan järjestelmäluetteloa</String>
378 <String Id="ProgressTextInstallSFPCatalogFileTemplate" Overridable="yes">Tiedosto: [1], riippuvuudet: [2]</String>
379 <String Id="ProgressTextMsiPublishAssemblies" Overridable="yes">Julkaistaan kokoonpanotietoja</String>
380 <String Id="ProgressTextMsiPublishAssembliesTemplate" Overridable="yes">Sovellusyhteys:[1], kokoonpanon nimi:[2]</String>
381 <String Id="ProgressTextMsiUnpublishAssemblies" Overridable="yes">Peruutetaan kokoonpanotietojen julkaisemista</String>
382 <String Id="ProgressTextMsiUnpublishAssembliesTemplate" Overridable="yes">Sovellusyhteys:[1], kokoonpanon nimi:[2]</String>
383 <String Id="ProgressTextRollback" Overridable="yes">Palautetaan toimintoa:</String>
384 <String Id="ProgressTextRollbackTemplate" Overridable="yes">[1]</String>
385 <String Id="ProgressTextRollbackCleanup" Overridable="yes">Poistetaan varmuuskopiotiedostoja</String>
386 <String Id="ProgressTextRollbackCleanupTemplate" Overridable="yes">Tiedosto: [1]</String>
387 <String Id="ProgressTextUnmoveFiles" Overridable="yes">Poistetaan siirrettyjä tiedostoja</String>
388 <String Id="ProgressTextUnmoveFilesTemplate" Overridable="yes">Tiedosto: [1], hakemisto: [9]</String>
389 <String Id="ProgressTextUnpublishProduct" Overridable="yes">Peruutetaan tuotetietojen julkaisemista</String>
390
391 <String Id="Error0" Overridable="yes">{{Vakava virhe: }}</String>
392 <String Id="Error1" Overridable="yes">{{Virhe [1]. }}</String>
393 <String Id="Error2" Overridable="yes">Varoitus [1]. </String>
394 <String Id="Error4" Overridable="yes">Tiedot [1]. </String>
395 <String Id="Error5" Overridable="yes">Odottamaton virhe paketin asennuksessa. Paketissa saattaa olla virhe. Virhekoodi: [1]. {{Argumentit: [2], [3], [4]}}</String>
396 <String Id="Error7" Overridable="yes">{{Levy on täynnä: }}</String>
397 <String Id="Error8" Overridable="yes">Toiminto [Time]: [1]. [2]</String>
398 <String Id="Error9" Overridable="yes">[ProductName]</String>
399 <String Id="Error10" Overridable="yes">{[2]}{, [3]}{, [4]}</String>
400 <String Id="Error11" Overridable="yes">Sanomatyyppi: [1], argumentti: [2]</String>
401 <String Id="Error12" Overridable="yes">=== Kirjaaminen aloitettu: [Date] [Time] ===</String>
402 <String Id="Error13" Overridable="yes">=== Kirjaaminen lopetettu: [Date] [Time] ===</String>
403 <String Id="Error14" Overridable="yes">Toiminto alkoi [Time]: [1].</String>
404 <String Id="Error15" Overridable="yes">Toiminto päättyi [Time]: [1]. Palautusarvo [2].</String>
405 <String Id="Error16" Overridable="yes">Aikaa jäljellä: {[1] minuuttia }{[2] sekuntia}</String>
406 <String Id="Error17" Overridable="yes">Muisti ei riitä. Sulje muut sovellukset ja yritä uudelleen.</String>
407 <String Id="Error18" Overridable="yes">Asennusohjelma ei enää vastaa.</String>
408 <String Id="Error19" Overridable="yes">Asennusohjelma pysähtyi ennen valmistumista.</String>
409 <String Id="Error20" Overridable="yes">Odota, Windows määrittää tuotteen [ProductName]</String>
410 <String Id="Error21" Overridable="yes">Kerätään tarvittavia tietoja...</String>
411 <String Id="Error22" Overridable="yes">Poistetaan sovelluksen vanhempia versioita...</String>
412 <String Id="Error23" Overridable="yes">Valmistellaan sovelluksen vanhempien versioiden poistamista...</String>
413 <String Id="Error32" Overridable="yes">{[ProductName] }Asennus onnistui.</String>
414 <String Id="Error33" Overridable="yes">{[ProductName] }Asennus epäonnistui.</String>
415 <String Id="Error1101" Overridable="yes">Virhe luettaessa tiedostosta: [2]. {{ Järjestelmävirhe [3].}} Varmista, että tiedosto on olemassa ja että voit käyttää sitä.</String>
416 <String Id="Error1301" Overridable="yes">Tiedostoa [2] ei voi luoda. Samanniminen hakemisto on jo olemassa. Peruuta asennus ja yritä suorittaa asennus toiseen sijaintiin.</String>
417 <String Id="Error1302" Overridable="yes">Aseta asemaan levy: [2]</String>
418 <String Id="Error1303" Overridable="yes">Asennusohjelman oikeudet eivät riitä seuraavan hakemiston käyttämiseen: [2]. Asennusta ei voi jatkaa. Kirjaudu sisään järjestelmänvalvojana tai ota yhteyttä järjestelmänvalvojaan.</String>
419 <String Id="Error1304" Overridable="yes">Virhe kirjoitettaessa tiedostoon: [2]. Varmista, että sinulla on tarvittavan hakemiston käyttöoikeudet.</String>
420 <String Id="Error1305" Overridable="yes">Virhe luettaessa tiedostosta [2]. {{ Järjestelmävirhe [3].}} Varmista, että tiedosto on olemassa ja että käyttöoikeutesi ovat riittävät.</String>
421 <String Id="Error1306" Overridable="yes">Jollakin toisella sovelluksella on yksinomainen käyttöoikeus tiedostoon [2]. Sulje kaikki muut sovellukset ja valitse sitten Yritä uudelleen.</String>
422 <String Id="Error1307" Overridable="yes">Levytila ei riitä seuraavan tiedoston asentamiseen: [2]. Vapauta levytilaa ja valitse Yritä uudelleen tai lopeta valitsemalla Peruuta.</String>
423 <String Id="Error1308" Overridable="yes">Lähdetiedostoa ei löytynyt: [2]. Tarkista, että tiedosto on olemassa ja että voit käyttää sitä.</String>
424 <String Id="Error1309" Overridable="yes">Virhe luettaessa tiedostosta [3]. {{ Järjestelmävirhe [2].}} Varmista, että tiedosto on olemassa ja että käyttöoikeutesi ovat riittävät.</String>
425 <String Id="Error1310" Overridable="yes">Virhe kirjoitettaessa tiedostoon [3].{{ Järjestelmävirhe [2].}} Varmista, että sinulla on tarvittavan hakemiston käyttöoikeudet.</String>
426 <String Id="Error1311" Overridable="yes">Lähdetiedostoa ei löytynyt{{(CAB-tiedosto)}}: [2]. Tarkista, että tiedosto on olemassa ja että voit käyttää sitä.</String>
427 <String Id="Error1312" Overridable="yes">Hakemistoa [2] ei voi luoda. Samanniminen tiedosto on jo olemassa. Vaihda tiedoston nimi tai poista se järjestelmästä ja valitse Yritä uudelleen tai lopeta valitsemalla Peruuta.</String>
428 <String Id="Error1313" Overridable="yes">Asema [2] ei ole tällä hetkellä käytettävissä. Valitse toinen asema.</String>
429 <String Id="Error1314" Overridable="yes">Määritetty polku [2] ei ole käytettävissä.</String>
430 <String Id="Error1315" Overridable="yes">Määritettyyn kansioon [2] ei voi kirjoittaa.</String>
431 <String Id="Error1316" Overridable="yes">Verkkovirhe yritettäessä lukea tiedostoa: [2]</String>
432 <String Id="Error1317" Overridable="yes">Virhe yritettäessä luoda hakemistoa: [2]</String>
433 <String Id="Error1318" Overridable="yes">Verkkovirhe yritettäessä luoda hakemistoa: [2]</String>
434 <String Id="Error1319" Overridable="yes">Verkkovirhe yritettäessä avata lähdetiedoston .cab-tiedosto: [2]</String>
435 <String Id="Error1320" Overridable="yes">Määritetty polku on liian pitkä: [2]</String>
436 <String Id="Error1321" Overridable="yes">Asennusohjelmalla ei ole riittäviä oikeuksia tiedoston [2] muokkaamiseen.</String>
437 <String Id="Error1322" Overridable="yes">Kansiopolun [2] osa on virheellinen. Se on tyhjä tai ylittää järjestelmän salliman pituuden.</String>
438 <String Id="Error1323" Overridable="yes">Kansion polku [2] sisältää sanoja, jotka eivät ole kelvollisia kansioiden poluissa.</String>
439 <String Id="Error1324" Overridable="yes">Kansion polku [2] sisältää virheellisen merkin.</String>
440 <String Id="Error1325" Overridable="yes">[2] ei ole kelvollinen lyhyt tiedostonimi.</String>
441 <String Id="Error1326" Overridable="yes">Virhe haettaessa tiedoston suojauksia: [3] GetLastError: [2]</String>
442 <String Id="Error1327" Overridable="yes">Asema ei kelpaa: [2]</String>
443 <String Id="Error1328" Overridable="yes">Virhe otettaessa korjausta käyttöön tiedostossa [2]. Tiedosto on ehkä päivitetty muulla tavoin, joten sitä ei voi enää muuttaa tällä korjauksella. Saat lisätietoja korjauksen myyjältä. {{Järjestelmävirhe: [3]}}</String>
444 <String Id="Error1329" Overridable="yes">Tarvittavaa tiedostoa ei voi asentaa, koska .cab-tiedostoa [2] ei ole allekirjoitettu digitaalisesti. Tämä voi tarkoittaa, että .cab-tiedosto on vioittunut.</String>
445 <String Id="Error1330" Overridable="yes">Tarvittavaa tiedostoa ei voi asentaa, koska .cab-tiedostolla [2] on virheellinen digitaalinen allekirjoitus. Tämä voi tarkoittaa, että .cab-tiedosto on vioittunut.{{ WinVerifyTrust palautti virheen [3].}}</String>
446 <String Id="Error1331" Overridable="yes">Tiedoston [2] kopiointi ei onnistunut: CRC-virhe.</String>
447 <String Id="Error1332" Overridable="yes">Tiedoston [2] siirtäminen ei onnistunut: CRC-virhe.</String>
448 <String Id="Error1333" Overridable="yes">Tiedoston [2] päivittäminen ei onnistunut: CRC-virhe.</String>
449 <String Id="Error1334" Overridable="yes">Tiedostoa [2] ei voida asentaa, koska sitä ei löytynyt .cab-tiedostosta [3]. Tämä saattaa johtua verkkovirheestä, CD-levyn lukuvirheestä tai paketin viallisuudesta.</String>
450 <String Id="Error1335" Overridable="yes">Asennukseen tarvittava .cab-tiedosto [2] on viallinen, eikä sitä voida käyttää. Tämä saattaa johtua verkkovirheestä, CD-levyn lukuvirheestä tai paketin viallisuudesta.</String>
451 <String Id="Error1336" Overridable="yes">Virhe tarvittavan tilapäistiedoston luomisessa. {{ Kansio: [3]. Järjestelmävirhekoodi: [2]}}</String>
452 <String Id="Error1401" Overridable="yes">Avainta [2] ei voi luoda.{{ Järjestelmävirhe [3].}} Varmista, että käyttöoikeutesi riittävät avaimen käyttöön, tai ota yhteyttä tukihenkilöstöön. </String>
453 <String Id="Error1402" Overridable="yes">Avainta [2] ei voi avata.{{ Järjestelmävirhe [3].}} Varmista, että käyttöoikeutesi riittävät avaimen käyttöön, tai ota yhteyttä tukihenkilöstöön. </String>
454 <String Id="Error1403" Overridable="yes">Arvoa [2] ei voi poistaa avaimesta [3].{{ Järjestelmävirhe [4].}} Varmista, että käyttöoikeutesi riittävät avaimen käyttöön, tai ota yhteyttä tukihenkilöstöön. </String>
455 <String Id="Error1404" Overridable="yes">Avainta [2] ei voi poistaa.{{ Järjestelmävirhe [3].}} Varmista, että käyttöoikeutesi riittävät avaimen käyttöön, tai ota yhteyttä tukihenkilöstöön. </String>
456 <String Id="Error1405" Overridable="yes">Arvoa [2] ei voi lukea avaimesta [3].{{ Järjestelmävirhe [4].}} Varmista, että käyttöoikeutesi riittävät avaimen käyttöön, tai ota yhteyttä tukihenkilöstöön. </String>
457 <String Id="Error1406" Overridable="yes">Arvoa [2] ei voi kirjoittaa avaimeen [3].{{ Järjestelmävirhe [4].}} Varmista, että käyttöoikeutesi riittävät avaimen käyttöön, tai ota yhteyttä tukihenkilöstöön.</String>
458 <String Id="Error1407" Overridable="yes">Avaimen [2] arvojen nimiä ei voi hakea.{{ Järjestelmävirhe [3].}} Varmista, että käyttöoikeutesi riittävät avaimen käyttöön, tai ota yhteyttä tukihenkilöstöön.</String>
459 <String Id="Error1408" Overridable="yes">Avaimen [2] aliavainten nimiä ei voi hakea.{{ Järjestelmävirhe [3].}} Varmista, että käyttöoikeutesi riittävät avaimen käyttöön, tai ota yhteyttä tukihenkilöstöön.</String>
460 <String Id="Error1409" Overridable="yes">Avaimen [2] suojaustietoja ei voi lukea.{{ Järjestelmävirhe [3].}} Varmista, että käyttöoikeutesi riittävät avaimen käyttöön, tai ota yhteyttä tukihenkilöstöön.</String>
461 <String Id="Error1410" Overridable="yes">Vapaata rekisteritilaa ei voi lisätä. Tämän sovelluksen asentaminen vaatii [2] kilotavua vapaata rekisteritilaa.</String>
462 <String Id="Error1500" Overridable="yes">Toinen asennus on käynnissä. Se on suoritettava loppuun ennen tämän asennuksen jatkamista.</String>
463 <String Id="Error1501" Overridable="yes">Virhe käytettäessä suojattuja tietoja. Varmista, että Windows Installer on määritetty oikein, ja yritä sitten asennusta uudelleen.</String>
464 <String Id="Error1502" Overridable="yes">Käyttäjä [2] on aiemmin aloittanut tuotteen [3] asennuksen. Käyttäjän on suoritettava kyseinen asennus uudelleen, ennen kuin hän voi käyttää tuotetta. Nykyinen asennus jatkuu nyt.</String>
465 <String Id="Error1503" Overridable="yes">Käyttäjä [2] on aiemmin aloittanut tuotteen [3] asennuksen. Käyttäjän on suoritettava kyseinen asennus uudelleen, ennen kuin hän voi käyttää tuotetta.</String>
466 <String Id="Error1601" Overridable="yes">Levytila lopussa -- asema: [2]; tarvittava tila: [3] kt; käytettävissä oleva tila: [4] kt. Vapauta levytilaa ja yritä uudelleen.</String>
467 <String Id="Error1602" Overridable="yes">Haluatko varmasti peruuttaa?</String>
468 <String Id="Error1603" Overridable="yes">Tiedostoa [2][3] käyttää{ seuraava prosessi: nimi: [4], tunnus: [5], ikkunan otsikko: [6]}. Sulje kyseinen sovellus ja yritä uudelleen.</String>
469 <String Id="Error1604" Overridable="yes">Tuote [2] on jo asennettu, mikä estää tämän tuotteen asennuksen. Nämä kaksi tuotetta ovat toisensa poissulkevia.</String>
470 <String Id="Error1605" Overridable="yes">Asennuksen jatkamiseen ei ole tarpeeksi levytilaa asemassa [2] palautustoiminnon ollessa käytössä. [3] kt vaaditaan, mutta vain [4] kt on käytettävissä. Valitse Ohita jatkaaksesi asennusta ilman palautustietojen tallentamista, Yritä uudelleen tarkistaaksesi vapaa levytila uudelleen tai keskeytä asennus valitsemalla Peruuta.</String>
471 <String Id="Error1606" Overridable="yes">Verkon kohteeseen [2] ei voi muodostaa yhteyttä.</String>
472 <String Id="Error1607" Overridable="yes">Seuraavat sovellukset on suljettava ennen asennuksen jatkamista:</String>
473 <String Id="Error1608" Overridable="yes">Tietokoneesta ei löytynyt tämän tuotteen asennuksen edellyttämiä yhteensopivia tuotteita.</String>
474 <String Id="Error1609" Overridable="yes">Virhe suojausasetusten käyttöönotossa. [2] ei ole kelvollinen käyttäjä tai ryhmä. Ongelma saattaa olla paketissa tai yhteyden muodostamisessa toimialueen ohjauskoneeseen verkossa. Tarkista verkkoyhteys ja yritä uudelleen valitsemalla Yritä uudelleen. Voit keskeyttää asennuksen valitsemalla Peruuta. {{Käyttäjän SID-tunnusta ei löydy, järjestelmävirhe [3]}}</String>
475 <String Id="Error1701" Overridable="yes">Avain [2] ei kelpaa. Varmista, että olet antanut oikean avaimen.</String>
476 <String Id="Error1702" Overridable="yes">Asennusohjelman on käynnistettävä järjestelmä uudelleen, ennen kuin kohteen [2] määritys voi jatkua. Valitse Kyllä, jos haluat käynnistää järjestelmän uudelleen nyt, tai Ei, jos haluat käynnistää järjestelmän myöhemmin manuaalisesti.</String>
477 <String Id="Error1703" Overridable="yes">Sinun on käynnistettävä järjestelmä uudelleen, jotta tuotteen [2] määrityksiin tehdyt muutokset tulisivat voimaan. Käynnistä tietokone uudelleen valitsemalla Kyllä tai käynnistä tietokone itse uudelleen myöhemmin valitsemalla Ei.</String>
478 <String Id="Error1704" Overridable="yes">Kohteen [2] asennus on keskeytetty. Et voi jatkaa, ennen kuin kumoat asennuksessa tehdyt muutokset. Haluatko kumota muutokset?</String>
479 <String Id="Error1705" Overridable="yes">Tämän tuotteen aiempi asennus on kesken. Et voi jatkaa, ennen kuin kumoat asennuksessa tehdyt muutokset. Haluatko kumota muutokset?</String>
480 <String Id="Error1706" Overridable="yes">Tuotteen [2] asennuspakettia ei löydy. Yritä asennusta uudelleen käyttäen asennuspaketin [3] oikeaa versiota.</String>
481 <String Id="Error1707" Overridable="yes">Asennus onnistui.</String>
482 <String Id="Error1708" Overridable="yes">Asennus epäonnistui.</String>
483 <String Id="Error1709" Overridable="yes">Tuote: [2] -- [3]</String>
484 <String Id="Error1710" Overridable="yes">Voit joko palauttaa tietokoneen aiempaan tilaan tai jatkaa asennusta myöhemmin uudelleen. Haluatko palauttaa aiemman tilan?</String>
485 <String Id="Error1711" Overridable="yes">Kirjoitettaessa asennustietoja levylle ilmeni virhe. Tarkista, että käytettävissä on riittävästi levytilaa, ja valitse Yritä uudelleen. Jos haluat lopettaa asennuksen, valitse Peruuta.</String>
486 <String Id="Error1712" Overridable="yes">Joitakin tiedostoja, joita tarvitaan tietokoneen aiempaan tilaan palauttamiseen, ei löydy. Palautusta ei voi suorittaa.</String>
487 <String Id="Error1713" Overridable="yes">[2] ei voi asentaa yhtä tarvittavaa tuotetta. Ota yhteyttä tekniseen tukeen. {{Järjestelmävirhe: [3].}}</String>
488 <String Id="Error1714" Overridable="yes">Tuotteen [2] vanhempaa versiota ei voi poistaa. Ota yhteyttä tekniseen tukeen. {{Järjestelmävirhe [3].}}</String>
489 <String Id="Error1715" Overridable="yes">Asennettu [2]</String>
490 <String Id="Error1716" Overridable="yes">Määritetty [2]</String>
491 <String Id="Error1717" Overridable="yes">Poistettu [2]</String>
492 <String Id="Error1718" Overridable="yes">Digitaalisten allekirjoitusten käytäntö hylkäsi tiedoston [2].</String>
493 <String Id="Error1719" Overridable="yes">Windows Installer -palvelua ei voida käyttää. Tämä saattaa tapahtua, jos Windows on vikasietotilassa tai Windows Installeria ei ole asennettu oikein. Ota yhteys tukihenkilöön.</String>
494 <String Id="Error1720" Overridable="yes">Tähän Windows Installer -pakettiin liittyy jokin ongelma. Asennuksessa tarvittavaa komentosarjaa ei voitu suorittaa. Ota yhteyttä tukihenkilöstöön tai paketin myyjään. {{Mukautetun toiminnon [2] komentosarjan virhe [3], [4]: [5] rivi [6], sarake [7], [8] }}</String>
495 <String Id="Error1721" Overridable="yes">Tähän Windows Installer -pakettiin liittyy jokin ongelma. Asennukseen tarvittavaa ohjelmaa ei voitu käynnistää. Ota yhteyttä tukihenkilöön tai paketin myyjään. {{Toiminto: [2], sijainti: [3], komento: [4] }}</String>
496 <String Id="Error1722" Overridable="yes">Tähän Windows Installer -pakettiin liittyy jokin ongelma. Asennuksessa tarvittavan ohjelman suoritus ei päättynyt odotetulla tavalla. Ota yhteyttä tukihenkilöstöön tai paketin myyjään. {{Toiminto [2], sijainti: [3], komento: [4] }}</String>
497 <String Id="Error1723" Overridable="yes">Tähän Windows Installer -pakettiin liittyy jokin ongelma. Asennuksessa tarvittavaa DLL-tiedostoa ei voitu suorittaa. Ota yhteyttä tukihenkilöstöön tai paketin myyjään. {{Toiminto [2], merkintä: [3], kirjasto: [4] }}</String>
498 <String Id="Error1724" Overridable="yes">Poistaminen onnistui.</String>
499 <String Id="Error1725" Overridable="yes">Poistaminen epäonnistui.</String>
500 <String Id="Error1726" Overridable="yes">Ilmoittaminen onnistui</String>
501 <String Id="Error1727" Overridable="yes">Ilmoittaminen epäonnistui.</String>
502 <String Id="Error1728" Overridable="yes">Määrittäminen onnistui.</String>
503 <String Id="Error1729" Overridable="yes">Määrittäminen epäonnistui.</String>
504 <String Id="Error1730" Overridable="yes">Käyttäjällä, joka poistaa tämän sovelluksen, täytyy olla Järjestelmänvalvoja-oikeudet. Kirjaudu järjestelmään käyttäen Järjestelmänvalvoja-tiliä tai ota yhteyttä tukihenkilöstöön.</String>
505 <String Id="Error1731" Overridable="yes">Tuotteen [2] lähdeasennuspakettia ei ole synkronoitu asiakaspaketin kanssa. Yritä suorittaa asennus uudelleen käyttämällä kelvollista asennuspaketin [3] kopiota.</String>
506 <String Id="Error1732" Overridable="yes">Tuotteen [2] asennuksen viimeistely edellyttää tietokoneen käynnistämistä uudelleen. Tietokoneeseen on parhaillaan kirjautuneina muita käyttäjiä, jotka voivat menettää tietoja, jos tietokone käynnistetään uudelleen. Haluatko käynnistää tietokoneen uudelleen nyt?</String>
507 <String Id="Error1801" Overridable="yes">Polku [2] ei kelpaa. Määritä kelvollinen polku.</String>
508 <String Id="Error1802" Overridable="yes">Muisti ei riitä. Sulje muut sovellukset ja yritä uudelleen.</String>
509 <String Id="Error1803" Overridable="yes">Asemassa [2] ei ole levyä. Aseta levy asemaan ja valitse Yritä uudelleen tai palaa aiemmin valittuun asemaan valitsemalla Peruuta.</String>
510 <String Id="Error1804" Overridable="yes">Asemassa [2] ei ole levyä. Aseta levy asemaan ja valitse Yritä uudelleen tai palaa selausvalintaikkunaan ja valitse eri asema valitsemalla Peruuta.</String>
511 <String Id="Error1805" Overridable="yes">Kansiota [2] ei ole. Anna olemassa olevan kansion polku.</String>
512 <String Id="Error1806" Overridable="yes">Sinulla ei ole lukuoikeutta tähän kansioon.</String>
513 <String Id="Error1807" Overridable="yes">Asennusta varten ei voitu määrittää kelvollista kohdekansiota.</String>
514 <String Id="Error1901" Overridable="yes">Virhe yritettäessä lukea lähdeasennustietokannasta: [2].</String>
515 <String Id="Error1902" Overridable="yes">Ajoitetaan uudelleenkäynnistystoiminto: tiedosto [2] nimetään uudelleen tiedostoksi [3]. Tietokone on käynnistettävä uudelleen toiminnon viimeistelemiseksi.</String>
516 <String Id="Error1903" Overridable="yes">Ajoitetaan uudelleenkäynnistystoiminto: tiedosto [2] poistetaan. Tietokone on käynnistettävä uudelleen toiminnon viimeistelemiseksi.</String>
517 <String Id="Error1904" Overridable="yes">Moduulia [2] ei voitu rekisteröidä. HRESULT [3]. Ota yhteyttä tukihenkilöstöön.</String>
518 <String Id="Error1905" Overridable="yes">Moduulin [2] rekisteröintiä ei voitu poistaa. HRESULT [3]. Ota yhteyttä tukihenkilöstöön.</String>
519 <String Id="Error1906" Overridable="yes">Paketin [2] tallentaminen välimuistiin epäonnistui. Virhe: [3]. Ota yhteyttä tukeen.</String>
520 <String Id="Error1907" Overridable="yes">Fonttia [2] ei voitu rekisteröidä. Varmista, että oikeutesi riittävät fonttien asentamiseen ja että järjestelmä tukee kyseistä fonttia.</String>
521 <String Id="Error1908" Overridable="yes">Fontin [2] rekisteröintiä ei voi poistaa. Varmista, että sinulla on tarvittavat oikeudet fonttien rekisteröintien poistamiseen.</String>
522 <String Id="Error1909" Overridable="yes">Pikakuvaketta [2] ei voi luoda. Varmista, että kohdekansio on olemassa ja että voit käyttää sitä.</String>
523 <String Id="Error1910" Overridable="yes">Pikakuvaketta [2] ei voi poistaa. Varmista, että pikakuvaketiedosto on olemassa ja että voit käyttää sitä.</String>
524 <String Id="Error1911" Overridable="yes">Tiedoston [2] tyyppikirjastoa ei voitu rekisteröidä. Ota yhteyttä tukihenkilöstöön.</String>
525 <String Id="Error1912" Overridable="yes">Tiedoston [2] tyyppikirjaston rekisteröintiä ei voitu poistaa. Ota yhteyttä tukihenkilöstöön.</String>
526 <String Id="Error1913" Overridable="yes">INI-tiedostoa [2][3] ei voitu päivittää. Varmista, että tiedosto on olemassa ja että voit käyttää sitä.</String>
527 <String Id="Error1914" Overridable="yes">Tiedostoa [2] ei voitu ajoittaa korvaamaan tiedostoa [3] uudelleenkäynnistyksessä. Varmista, että sinulla on kirjoitusoikeudet tiedostoon [3].</String>
528 <String Id="Error1915" Overridable="yes">Virhe poistettaessa ODBC-ohjaimen hallintaohjelmaa, ODBC-virhe [2]: [3]. Ota yhteyttä tukeen.</String>
529 <String Id="Error1916" Overridable="yes">Virhe asennettaessa ODBC-ohjaimen hallintaohjelmaa, ODBC-virhe [2]: [3]. Ota yhteyttä tukeen.</String>
530 <String Id="Error1917" Overridable="yes">Virhe poistettaessa ODBC-ohjainta: [4], ODBC-virhe [2]: [3]. Varmista, että sinulla on riittävät oikeudet ODBC-ohjainten poistamiseen.</String>
531 <String Id="Error1918" Overridable="yes">Virhe asennettaessa ODBC-ohjainta: [4], ODBC-virhe [2]: [3]. Varmista, että tiedosto [4] on luotu aiemmin ja että voit käyttää sitä.</String>
532 <String Id="Error1919" Overridable="yes">Virhe määritettäessä ODBC-tietolähdettä: [4], ODBC-virhe [2]: [3]. Varmista, että tiedosto [4] on luotu aiemmin ja että voit käyttää sitä.</String>
533 <String Id="Error1920" Overridable="yes">Palvelua [2] ([3]) ei voitu käynnistää. Varmista, että oikeutesi riittävät järjestelmäpalvelujen käynnistämiseen.</String>
534 <String Id="Error1921" Overridable="yes">Palvelua [2] ([3]) ei voitu pysäyttää. Varmista, että oikeutesi riittävät järjestelmäpalvelujen pysäyttämiseen.</String>
535 <String Id="Error1922" Overridable="yes">Palvelua [2] ([3]) ei voitu poistaa. Varmista, että oikeutesi riittävät järjestelmäpalvelujen poistamiseen.</String>
536 <String Id="Error1923" Overridable="yes">Palvelua [2] ([3]) ei voitu asentaa. Varmista, että oikeutesi riittävät järjestelmäpalvelujen asentamiseen.</String>
537 <String Id="Error1924" Overridable="yes">Ympäristömuuttujaa [2] ei voitu päivittää. Varmista, että oikeutesi riittävät ympäristömuuttujien muokkaamiseen.</String>
538 <String Id="Error1925" Overridable="yes">Oikeutesi eivät riitä tämän asennuksen tekemiseen kaikkien tietokoneen käyttäjien puolesta. Kirjaudu sisään järjestelmänvalvojana ja yritä suorittaa asennus sitten uudelleen.</String>
539 <String Id="Error1926" Overridable="yes">Tiedoston [3] suojausta ei voitu määrittää. Virhe: [2]. Varmista, että oikeutesi riittävät tämän tiedoston suojausoikeuksien muokkaamiseen.</String>
540 <String Id="Error1927" Overridable="yes">Tämän tietokoneeseen ei ole asennettu Component Services (COM+ 1.0) -sovellusta. Component Services tarvitaan, jotta asennus onnistuisi. Component Services löytyy Windows 2000:sta.</String>
541 <String Id="Error1928" Overridable="yes">Virhe rekisteröitäessä COM+-sovellusta. Jos haluat lisätietoja, ota yhteyttä tukihenkilöstöön.</String>
542 <String Id="Error1929" Overridable="yes">Virhe poistettaessa COM+-sovelluksen rekisteröintiä. Jos haluat lisätietoja, ota yhteyttä tukihenkilöstöön.</String>
543 <String Id="Error1930" Overridable="yes">Palvelun [2] ([3]) kuvausta ei voi muuttaa.</String>
544 <String Id="Error1931" Overridable="yes">Windows Installer -palvelu ei voi päivittää järjestelmätiedostoa [2], koska Windows on suojannut sen. Käyttöjärjestelmä täytyy ehkä päivittää, jotta tämä ohjelma toimii oikein. {{Paketin versio: [3], käyttöjärjestelmän suojaama versio: [4]}}</String>
545 <String Id="Error1932" Overridable="yes">Windows Installer ei voi päivittää Windowsin suojaamaa tiedostoa [2]. {{Paketin versio: [3], käyttöjärjestelmän suojaama versio: [4], SFP-virhe: [5]}}</String>
546 <String Id="Error1933" Overridable="yes">Windows Installer -palvelu ei pysty päivittämään vähintään yhtä Windowsin suojaamaa tiedostoa. {{SFP-virhe: [2]. Suojattujen tiedostojen luettelo:\r\n[3]}}</String>
547 <String Id="Error1934" Overridable="yes">Tietokoneen käytäntö estää käyttäjäasennukset.</String>
548 <String Id="Error1935" Overridable="yes">Kokoonpanon [6] asennuksen aikana ilmeni virhe. Lisätietoja on ohje- ja tukipalveluissa. HRESULT: [3]. {{kokoonpanoliittymä: [4], toiminto: [5], osa: [2]}}</String>
549 <String Id="Error1936" Overridable="yes">Kokoonpanon [6] asennuksessa tapahtui virhe. Kokoonpanon nimi ei ole vahva, tai allekirjoitusta ei ole tehty vaadittavalla avainpituudella. HRESULT: [3]. {{kokoonpanoliittymä: [4], toiminto: [5], osa: [2]}}</String>
550 <String Id="Error1937" Overridable="yes">Kokoonpanon [6] asennuksessa tapahtui virhe. Allekirjoitusta tai luetteloa ei voitu vahvistaa, tai se ei ole kelvollinen. HRESULT: [3]. {{kokoonpanoliittymä: [4], toiminto: [5], osa: [2]}}</String>
551 <String Id="Error1938" Overridable="yes">Kokoonpanon [6] asennuksessa tapahtui virhe. Yhtä tai useampaa kokoonpanon moduulia ei löytynyt. HRESULT: [3]. {{kokoonpanoliittymä: [4], toiminto: [5], osa: [2]}}</String>
552
553 <String Id="UITextbytes" Overridable="yes">tavua</String>
554 <String Id="UITextGB" Overridable="yes">Gt</String>
555 <String Id="UITextKB" Overridable="yes">kt</String>
556 <String Id="UITextMB" Overridable="yes">Mt</String>
557 <String Id="UITextMenuAbsent" Overridable="yes">Ominaisuus poistetaan kokonaisuudessaan käytettävistä</String>
558 <String Id="UITextMenuAdvertise" Overridable="yes">Ominaisuus asennetaan tarvittaessa</String>
559 <String Id="UITextMenuAllCD" Overridable="yes">Ominaisuus asennetaan kokonaisuudessaan CD-levyltä suoritettavaksi</String>
560 <String Id="UITextMenuAllLocal" Overridable="yes">Ominaisuus asennetaan kokonaisuudessaan paikalliselle kiintolevylle</String>
561 <String Id="UITextMenuAllNetwork" Overridable="yes">Ominaisuus asennetaan kokonaisuudessaan verkosta suoritettavaksi</String>
562 <String Id="UITextMenuCD" Overridable="yes">Asennetaan suoritettavaksi CD-levyltä</String>
563 <String Id="UITextMenuLocal" Overridable="yes">Asennetaan paikalliselle kiintolevylle</String>
564 <String Id="UITextMenuNetwork" Overridable="yes">Asennetaan suoritettavaksi verkosta</String>
565 <String Id="UITextNewFolder" Overridable="yes">Kansio|Uusi kansio</String>
566 <String Id="UITextScriptInProgress" Overridable="yes">Kerätään tarvittavia tietoja...</String>
567 <String Id="UITextSelAbsentAbsent" Overridable="yes">Ominaisuutta ei asenneta</String>
568 <String Id="UITextSelAbsentAdvertise" Overridable="yes">Ominaisuus asennetaan tarvittaessa</String>
569 <String Id="UITextSelAbsentCD" Overridable="yes">Ominaisuus asennetaan CD-levyltä suoritettavaksi</String>
570 <String Id="UITextSelAbsentLocal" Overridable="yes">Ominaisuus asennetaan paikalliselle kiintolevylle</String>
571 <String Id="UITextSelAbsentNetwork" Overridable="yes">Ominaisuus asennetaan toimimaan verkosta</String>
572 <String Id="UITextSelAdvertiseAbsent" Overridable="yes">Ominaisuus poistetaan käytettävistä</String>
573 <String Id="UITextSelAdvertiseAdvertise" Overridable="yes">Asennetaan tarvittaessa</String>
574 <String Id="UITextSelAdvertiseCD" Overridable="yes">Ominaisuus voidaan suorittaa CD-levyltä</String>
575 <String Id="UITextSelAdvertiseLocal" Overridable="yes">Ominaisuus asennetaan paikalliselle kiintolevylle</String>
576 <String Id="UITextSelAdvertiseNetwork" Overridable="yes">Ominaisuus voidaan suorittaa verkosta</String>
577 <String Id="UITextSelCDAbsent" Overridable="yes">Ominaisuus poistetaan kokonaisuudessaan, jolloin sitä ei voi enää suorittaa CD-levyltä</String>
578 <String Id="UITextSelCDAdvertise" Overridable="yes">Ominaisuus muutetaan CD-levyltä suoritettavasta tarvittaessa asennettavaksi</String>
579 <String Id="UITextSelCDCD" Overridable="yes">Ominaisuus jää CD-levyltä suoritettavaksi</String>
580 <String Id="UITextSelCDLocal" Overridable="yes">Ominaisuus muutetaan CD-levyltä suoritettavasta paikalliselle kiintolevylle asennetuksi</String>
581 <String Id="UITextSelChildCostNeg" Overridable="yes">Tämä ominaisuus vapauttaa [1] kiintolevytilaa.</String>
582 <String Id="UITextSelChildCostPos" Overridable="yes">Tämä ominaisuus vaatii [1] kiintolevytilaa.</String>
583 <String Id="UITextSelCostPending" Overridable="yes">Lasketaan ominaisuuden tarvitsemaa levytilaa...</String>
584 <String Id="UITextSelLocalAbsent" Overridable="yes">Ominaisuus poistetaan kokonaan</String>
585 <String Id="UITextSelLocalAdvertise" Overridable="yes">Ominaisuus poistetaan paikalliselta kiintolevyltä, mutta se asennetaan tarvittaessa</String>
586 <String Id="UITextSelLocalCD" Overridable="yes">Ominaisuus poistetaan paikalliselta kiintolevyltä, mutta sen voi edelleen suorittaa CD-levyltä</String>
587 <String Id="UITextSelLocalLocal" Overridable="yes">Ominaisuus jätetään paikalliselle kiintolevylle</String>
588 <String Id="UITextSelLocalNetwork" Overridable="yes">Ominaisuus poistetaan paikalliselta kiintolevyltä, mutta sen voi edelleen suorittaa verkosta</String>
589 <String Id="UITextSelNetworkAbsent" Overridable="yes">Ominaisuus poistetaan kokonaisuudessaan, jolloin sitä ei voi enää suorittaa verkosta</String>
590 <String Id="UITextSelNetworkAdvertise" Overridable="yes">Ominaisuus muutetaan verkosta suoritettavasta tarvittaessa asennettavaksi</String>
591 <String Id="UITextSelNetworkLocal" Overridable="yes">Ominaisuus muutetaan verkosta suoritettavasta paikalliselle kiintolevylle asennetuksi</String>
592 <String Id="UITextSelNetworkNetwork" Overridable="yes">Ominaisuus voidaan edelleen suorittaa verkosta</String>
593 <String Id="UITextSelParentCostNegNeg" Overridable="yes">Ominaisuus vapauttaa [1] kiintolevytilaa. Siinä on valittuna [2] alitoimintoa. Alitoimintoja on [3]. Alitoiminnot vapauttavat [4] levytilaa.</String>
594 <String Id="UITextSelParentCostNegPos" Overridable="yes">Ominaisuus vapauttaa [1] kiintolevytilaa. Siinä on valittuna [2] alitoimintoa. Alitoimintoja on [3]. Alitoiminnot vaativat [4] levytilaa.</String>
595 <String Id="UITextSelParentCostPosNeg" Overridable="yes">Ominaisuus vaatii [1] kiintolevytilaa. Siinä on valittuna [2] alitoimintoa. Alitoimintoja on [3]. Alitoiminnot vapauttavat [4] levytilaa.</String>
596 <String Id="UITextSelParentCostPosPos" Overridable="yes">Ominaisuus vaatii [1] kiintolevytilaa. Siinä on valittuna [2] alitoimintoa. Alitoimintoja on [3]. Alitoiminnot vaativat [4] levytilaa.</String>
597 <String Id="UITextTimeRemaining" Overridable="yes">Aikaa jäljellä: {[1] minuuttia }{[2] sekuntia}</String>
598 <String Id="UITextVolumeCostAvailable" Overridable="yes">Käytettävissä</String>
599 <String Id="UITextVolumeCostDifference" Overridable="yes">Ero</String>
600 <String Id="UITextVolumeCostRequired" Overridable="yes">Tarvitaan</String>
601 <String Id="UITextVolumeCostSize" Overridable="yes">Levyn koko</String>
602 <String Id="UITextVolumeCostVolume" Overridable="yes">Levyasema</String>
603</WixLocalization>
diff --git a/src/ext/UI/wixlib/WixUI_fr-fr.wxl b/src/ext/UI/wixlib/WixUI_fr-fr.wxl
new file mode 100644
index 00000000..77b6bd8c
--- /dev/null
+++ b/src/ext/UI/wixlib/WixUI_fr-fr.wxl
@@ -0,0 +1,598 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3
4
5<WixLocalization Culture="fr-fr" Codepage="1252" xmlns="http://wixtoolset.org/schemas/v4/wxl">
6 <String Id="WixUIBack" Overridable="yes">&amp;Précédent</String>
7 <String Id="WixUINext" Overridable="yes">&amp;Suivant</String>
8 <String Id="WixUICancel" Overridable="yes">Annuler</String>
9 <String Id="WixUIFinish" Overridable="yes">&amp;Terminer</String>
10 <String Id="WixUIRetry" Overridable="yes">&amp;Réessayer</String>
11 <String Id="WixUIIgnore" Overridable="yes">&amp;Ignorer</String>
12 <String Id="WixUIYes" Overridable="yes">&amp;Oui</String>
13 <String Id="WixUINo" Overridable="yes">&amp;Non</String>
14 <String Id="WixUIOK" Overridable="yes">OK</String>
15 <String Id="WixUIPrint" Overridable="yes">&amp;Imprimer</String>
16
17 <String Id="AdvancedWelcomeEulaDlg_Title" Overridable="yes">Installation de [ProductName]</String>
18 <String Id="AdvancedWelcomeEulaDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
19 <String Id="AdvancedWelcomeEulaDlgTitle" Overridable="yes">{\WixUI_Font_Title}Lisez attentivement le contrat de licence de [ProductName]</String>
20 <String Id="AdvancedWelcomeEulaDlgLicenseAcceptedCheckBox" Overridable="yes">J'&amp;accepte les termes du contrat de licence</String>
21 <String Id="AdvancedWelcomeEulaDlgDescriptionPerMachine" Overridable="yes">Cliquez sur Installer pour installer le produit avec les options par défaut pour tous les utilisateurs. Cliquez sur Avancé pour modifier les options d'installation.</String>
22 <String Id="AdvancedWelcomeEulaDlgDescriptionPerUser" Overridable="yes">Cliquez sur Installer pour installer le produit avec les options par défaut uniquement pour vous. Cliquez sur Avancé pour modifier les options d'installation.</String>
23 <String Id="AdvancedWelcomeEulaDlgInstall" Overridable="yes">&amp;Installer</String>
24 <String Id="AdvancedWelcomeEulaDlgAdvanced" Overridable="yes">A&amp;vancé</String>
25 <String Id="Advanced_Font_Normal_Size" Overridable="yes">8</String>
26 <String Id="Advanced_Font_Bigger_Size" Overridable="yes">12</String>
27 <String Id="Advanced_Font_Title_Size" Overridable="yes">9</String>
28 <String Id="Advanced_Font_Emphasized_Size" Overridable="yes">8</String>
29 <String Id="Advanced_Font_FaceName" Overridable="yes">Tahoma</String>
30
31 <String Id="BrowseDlg_Title" Overridable="yes">Installation de [ProductName]</String>
32 <String Id="BrowseDlgComboLabel" Overridable="yes">&amp;Regarder dans :</String>
33 <String Id="BrowseDlgWixUI_Bmp_Up" Overridable="yes">WixUI_Bmp_Up</String>
34 <String Id="BrowseDlgWixUI_Bmp_UpTooltip" Overridable="yes">Remonter d'un niveau</String>
35 <String Id="BrowseDlgNewFolder" Overridable="yes">WixUI_Bmp_New</String>
36 <String Id="BrowseDlgNewFolderTooltip" Overridable="yes">Créer un dossier</String>
37 <String Id="BrowseDlgPathLabel" Overridable="yes">&amp;Nom du dossier :</String>
38 <String Id="BrowseDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
39 <String Id="BrowseDlgDescription" Overridable="yes">Sélectionner le dossier de destination</String>
40 <String Id="BrowseDlgTitle" Overridable="yes">{\WixUI_Font_Title}Modifier le dossier de destination</String>
41
42 <String Id="CancelDlg_Title" Overridable="yes">Installation de [ProductName]</String>
43 <String Id="CancelDlgText" Overridable="yes">Êtes-vous sûr de vouloir annuler l'installation de [ProductName] ?</String>
44 <String Id="CancelDlgIcon" Overridable="yes">WixUI_Ico_Info</String>
45 <String Id="CancelDlgIconTooltip" Overridable="yes">Icône d'information</String>
46
47 <String Id="CustomizeDlg_Title" Overridable="yes">Installation de [ProductName]</String>
48 <String Id="CustomizeDlgTree" Overridable="yes">Arborescence des sélections</String>
49 <String Id="CustomizeDlgBrowse" Overridable="yes">Pa&amp;rcourir...</String>
50 <String Id="CustomizeDlgReset" Overridable="yes">Réinitiali&amp;ser</String>
51 <String Id="CustomizeDlgDiskCost" Overridable="yes">&amp;Utilisation du disque</String>
52 <String Id="CustomizeDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
53 <String Id="CustomizeDlgText" Overridable="yes">Cliquez sur les icônes dans l'arborescence ci-dessous pour modifier la façon dont les composants sont installés.</String>
54 <String Id="CustomizeDlgDescription" Overridable="yes">Sélectionnez la façon d'installer les composants.</String>
55 <String Id="CustomizeDlgTitle" Overridable="yes">{\WixUI_Font_Title}Installation personnalisée</String>
56 <String Id="CustomizeDlgItemDescription" Overridable="yes">CustomizeDlgItemDescription-CustomizeDlgItemDescription</String>
57 <String Id="CustomizeDlgItemSize" Overridable="yes">CustomizeDlgItemSize-CustomizeDlgItemSize</String>
58 <String Id="CustomizeDlgLocation" Overridable="yes">CustomizeDlgLocation-CustomizeDlgLocation</String>
59 <String Id="CustomizeDlgLocationLabel" Overridable="yes">Emplacement :</String>
60
61 <String Id="DiskCostDlg_Title" Overridable="yes">Installation de [ProductName]</String>
62 <String Id="DiskCostDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
63 <String Id="DiskCostDlgText" Overridable="yes">Les volumes mis en surbrillance ne disposent pas de suffisamment d'espace disque pour les composants sélectionnés. Vous pouvez supprimer certains fichiers des volumes mis en surbrillance, installer moins de composants ou sélectionner d'autres lecteurs de destination.</String>
64 <String Id="DiskCostDlgDescription" Overridable="yes">Espace disque nécessaire pour l'installation des composants sélectionnés.</String>
65 <String Id="DiskCostDlgTitle" Overridable="yes">{\WixUI_Font_Title}Espace disque nécessaire</String>
66 <String Id="DiskCostDlgVolumeList" Overridable="yes">{120}{70}{70}{70}{70}</String>
67
68 <String Id="ErrorDlg_Title" Overridable="yes">Installation de [ProductName]</String>
69 <String Id="ErrorDlgErrorText" Overridable="yes">Texte d'information</String>
70 <String Id="ErrorDlgErrorIcon" Overridable="yes">WixUI_Ico_Info</String>
71 <String Id="ErrorDlgErrorIconTooltip" Overridable="yes">Icône d'information</String>
72
73 <String Id="ExitDialog_Title" Overridable="yes">Installation de [ProductName]</String>
74 <String Id="ExitDialogBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
75 <String Id="ExitDialogDescription" Overridable="yes">Cliquez sur le bouton Terminer pour quitter l'Assistant Installation.</String>
76 <String Id="ExitDialogTitle" Overridable="yes">{\WixUI_Font_Bigger}Assistant Installation de [ProductName] terminé</String>
77
78 <String Id="FatalError_Title" Overridable="yes">Installation de [ProductName]</String>
79 <String Id="FatalErrorBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
80 <String Id="FatalErrorTitle" Overridable="yes">{\WixUI_Font_Bigger}[ProductName] L'Assistant Installation a pris fin prématurément.</String>
81 <String Id="FatalErrorDescription1" Overridable="yes">Une erreur a causé la fin prématurée de l'Assistant Installation de [ProductName]. Votre système n'a pas été modifié. Pour installer ce programme ultérieurement, réexécutez l'Assistant Installation.</String>
82 <String Id="FatalErrorDescription2" Overridable="yes">Cliquez sur le bouton Terminer pour quitter l'Assistant Installation.</String>
83
84 <String Id="FeaturesDlg_Title" Overridable="yes">Installation de [ProductName]</String>
85 <String Id="FeaturesDlgTree" Overridable="yes">Composants du produit</String>
86 <String Id="FeaturesDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
87 <String Id="FeaturesDlgDescription" Overridable="yes">Sélectionnez la façon d'installer les composants.</String>
88 <String Id="FeaturesDlgTitle" Overridable="yes">{\WixUI_Font_Title}Composants du produit</String>
89 <String Id="FeaturesDlgItemDescription" Overridable="yes">FeaturesDlgItemDescription</String>
90 <String Id="FeaturesDlgItemSize" Overridable="yes">FeaturesDlgItemSize</String>
91 <String Id="FeaturesDlgInstall" Overridable="yes">&amp;Installer</String>
92 <String Id="FeaturesDlgChange" Overridable="yes">&amp;Modifier</String>
93
94 <String Id="FilesInUse_Title" Overridable="yes">Installation de [ProductName]</String>
95 <String Id="FilesInUseExit" Overridable="yes">&amp;Quitter</String>
96 <String Id="FilesInUseBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
97 <String Id="FilesInUseText" Overridable="yes">Les applications suivantes utilisent des fichiers qui doivent être mis à jour par ce programme d'installation. Fermez ces applications et cliquez sur Réessayer pour continuer l'installation, ou cliquez sur Quitter pour la quitter.</String>
98 <String Id="FilesInUseDescription" Overridable="yes">Certains fichiers qui doivent être mis à jour sont en cours d'utilisation.</String>
99 <String Id="FilesInUseTitle" Overridable="yes">{\WixUI_Font_Title}Fichiers en cours d'utilisation</String>
100
101 <String Id="InstallDirDlg_Title" Overridable="yes">Installation de [ProductName]</String>
102 <String Id="InstallDirDlgChange" Overridable="yes">&amp;Modifier...</String>
103 <String Id="InstallDirDlgTitle" Overridable="yes">{\WixUI_Font_Title}Dossier de destination</String>
104 <String Id="InstallDirDlgDescription" Overridable="yes">Cliquez sur Suivant pour effectuer l'installation dans le dossier par défaut, ou cliquez sur Modifier pour choisir un autre dossier.</String>
105 <String Id="InstallDirDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
106 <String Id="InstallDirDlgFolderLabel" Overridable="yes">Installer [ProductName] sur :</String>
107
108 <String Id="InstallScopeDlg_Title" Overridable="yes">Installation de [ProductName]</String>
109 <String Id="InstallScopeDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
110 <String Id="InstallScopeDlgDescription" Overridable="yes">Choisir l'étendue et le dossier d'installation</String>
111 <String Id="InstallScopeDlgTitle" Overridable="yes">{\WixUI_Font_Title}Étendue d'installation</String>
112 <String Id="InstallScopeDlgPerUser" Overridable="yes">{\WixUI_Font_Emphasized}Installer &amp;uniquement pour vous ([LogonUser])</String>
113 <String Id="InstallScopeDlgPerUserDescription" Overridable="yes">[ProductName] sera installé dans un dossier spécifique à chaque utilisateur et sera disponible uniquement pour votre compte d'utilisateur. Vous n'avez pas besoin de disposer de privilèges d'administrateur local.</String>
114 <String Id="InstallScopeDlgNoPerUserDescription" Overridable="yes">[ProductName] ne prend pas en charge l'installation spécifique à chaque utilisateur.</String>
115 <String Id="InstallScopeDlgPerMachine" Overridable="yes">{\WixUI_Font_Emphasized}Installer pour tous les utilisateurs de cet &amp;ordinateur</String>
116 <String Id="InstallScopeDlgPerMachineDescription" Overridable="yes">[ProductName] sera installé dans un dossier spécifique à chaque ordinateur par défaut et sera disponible pour tous les utilisateurs. Vous pouvez modifier le dossier d'installation par défaut. Vous devez disposer de privilèges d'administrateur local.</String>
117 <String Id="InstallScopeDlgFolderLabel" Overridable="yes">&amp;Dossier d'installation :</String>
118 <String Id="InstallScopeDlgChange" Overridable="yes">&amp;Modifier...</String>
119
120 <String Id="InvalidDirDlg_Title" Overridable="yes">Installation de [ProductName]</String>
121 <String Id="InvalidDirDlgText" Overridable="yes">Le répertoire d'installation doit se trouver sur un disque dur local.</String>
122 <String Id="InvalidDirDlgIcon" Overridable="yes">WixUI_Ico_Info</String>
123 <String Id="InvalidDirDlgIconTooltip" Overridable="yes">Icône d'information</String>
124
125 <String Id="LicenseAgreementDlg_Title" Overridable="yes">Installation de [ProductName]</String>
126 <String Id="LicenseAgreementDlgLicenseAcceptedCheckBox" Overridable="yes">J'&amp;accepte les termes du contrat de licence</String>
127 <String Id="LicenseAgreementDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
128 <String Id="LicenseAgreementDlgDescription" Overridable="yes">Lisez attentivement le contrat de licence suivant</String>
129 <String Id="LicenseAgreementDlgTitle" Overridable="yes">{\WixUI_Font_Title}Contrat de Licence Utilisateur Final</String>
130
131 <String Id="MaintenanceTypeDlg_Title" Overridable="yes">Installation de [ProductName]</String>
132 <String Id="MaintenanceTypeDlgChangeButton" Overridable="yes">&amp;Modifier</String>
133 <String Id="MaintenanceTypeDlgChangeButtonTooltip" Overridable="yes">Modifier l'installation</String>
134 <String Id="MaintenanceTypeDlgRepairButton" Overridable="yes">Ré&amp;parer</String>
135 <String Id="MaintenanceTypeDlgRepairButtonTooltip" Overridable="yes">Réparer l'installation</String>
136 <String Id="MaintenanceTypeDlgRemoveButton" Overridable="yes">&amp;Supprimer</String>
137 <String Id="MaintenanceTypeDlgRemoveButtonTooltip" Overridable="yes">Supprimer l'installation</String>
138 <String Id="MaintenanceTypeDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
139 <String Id="MaintenanceTypeDlgDescription" Overridable="yes">Sélectionnez l'opération à exécuter.</String>
140 <String Id="MaintenanceTypeDlgTitle" Overridable="yes">{\WixUI_Font_Title}Modifier, réparer ou supprimer l'installation</String>
141 <String Id="MaintenanceTypeDlgChangeText" Overridable="yes">Vous permet de modifier la façon dont les composants sont installés.</String>
142 <String Id="MaintenanceTypeDlgChangeDisabledText" Overridable="yes">[ProductName] n'a aucun composant individuellement sélectionnable.</String>
143 <String Id="MaintenanceTypeDlgRemoveText" Overridable="yes">Supprime [ProductName] de votre ordinateur.</String>
144 <String Id="MaintenanceTypeDlgRemoveDisabledText" Overridable="yes">[ProductName] ne peut pas être supprimé.</String>
145 <String Id="MaintenanceTypeDlgRepairText" Overridable="yes">Corrige les erreurs de l'installation la plus récente en réparant les fichiers, raccourcis et entrées de Registre manquants ou endommagés.</String>
146 <String Id="MaintenanceTypeDlgRepairDisabledText" Overridable="yes">[ProductName] ne peut pas être réparé.</String>
147
148 <String Id="MaintenanceWelcomeDlg_Title" Overridable="yes">Installation de [ProductName]</String>
149 <String Id="MaintenanceWelcomeDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
150 <String Id="MaintenanceWelcomeDlgDescription" Overridable="yes">L'Assistant Installation vous permet de modifier la façon dont les composants de [ProductName] sont installés sur votre ordinateur ou de supprimer celui-ci. Cliquez sur Suivant pour continuer ou sur Annuler pour quitter l'Assistant Installation.</String>
151 <String Id="MaintenanceWelcomeDlgTitle" Overridable="yes">{\WixUI_Font_Bigger}Bienvenue dans l'Assistant Installation de [ProductName]</String>
152
153 <String Id="MsiRMFilesInUse_Title" Overridable="yes">Installation de [ProductName]</String>
154 <String Id="MsiRMFilesInUseBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
155 <String Id="MsiRMFilesInUseText" Overridable="yes">Les applications suivantes utilisent des fichiers qui doivent être mis à jour au cours de cette installation. Vous pouvez laisser l'Assistant Installation se charger de les fermer et tenter de les redémarrer, ou redémarrer l'ordinateur ultérieurement.</String>
156 <String Id="MsiRMFilesInUseDescription" Overridable="yes">Certains fichiers qui doivent être mis à jour sont en cours d'utilisation.</String>
157 <String Id="MsiRMFilesInUseTitle" Overridable="yes">{\WixUI_Font_Title}Fichiers en cours d'utilisation</String>
158 <String Id="MsiRMFilesInUseUseRM" Overridable="yes">&amp;Fermer les applications et tenter de les redémarrer.</String>
159 <String Id="MsiRMFilesInUseDontUseRM" Overridable="yes">Ne pas fermer les applications. Vous devrez re&amp;démarrer l'ordinateur.</String>
160
161 <String Id="OutOfDiskDlg_Title" Overridable="yes">Installation de [ProductName]</String>
162 <String Id="OutOfDiskDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
163 <String Id="OutOfDiskDlgText" Overridable="yes">Les volumes mis en surbrillance ne disposent pas de suffisamment d'espace disque pour les composants actuellement sélectionnés. Vous pouvez supprimer certains fichiers des volumes mis en surbrillance, installer moins de composants ou sélectionner un lecteur de destination différent.</String>
164 <String Id="OutOfDiskDlgDescription" Overridable="yes">L'espace disque requis pour l'installation dépasse l'espace disponible.</String>
165 <String Id="OutOfDiskDlgTitle" Overridable="yes">{\WixUI_Font_Title}Espace disque insuffisant</String>
166 <String Id="OutOfDiskDlgVolumeList" Overridable="yes">{120}{70}{70}{70}{70}</String>
167
168 <String Id="OutOfRbDiskDlg_Title" Overridable="yes">Installation de [ProductName]</String>
169 <String Id="OutOfRbDiskDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
170 <String Id="OutOfRbDiskDlgText" Overridable="yes">Les volumes mis en surbrillance ne disposent pas de suffisamment d'espace disque pour les composants actuellement sélectionnés. Vous pouvez supprimer certains fichiers des volumes mis en surbrillance, installer moins de composants ou sélectionner un lecteur de destination différent.</String>
171 <String Id="OutOfRbDiskDlgDescription" Overridable="yes">L'espace disque requis pour l'installation dépasse l'espace disponible.</String>
172 <String Id="OutOfRbDiskDlgTitle" Overridable="yes">{\WixUI_Font_Title}Espace disque insuffisant</String>
173 <String Id="OutOfRbDiskDlgVolumeList" Overridable="yes">{120}{70}{70}{70}{70}</String>
174 <String Id="OutOfRbDiskDlgText2" Overridable="yes">Vous pouvez également désactiver la fonctionnalité de restauration du programme d'installation. La désactivation de la restauration empêche le programme d'installation de restaurer l'état d'origine de l'ordinateur en cas d'interruption de l'installation. Cliquez sur Oui si vous souhaitez prendre le risque de désactiver la restauration.</String>
175
176 <String Id="PrepareDlg_Title" Overridable="yes">Installation de [ProductName]</String>
177 <String Id="PrepareDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
178 <String Id="PrepareDlgDescription" Overridable="yes">Veuillez patienter pendant que l'Assistant Installation se prépare pour vous guider dans l'installation.</String>
179 <String Id="PrepareDlgTitle" Overridable="yes">{\WixUI_Font_Bigger}Bienvenue dans l'Assistant Installation de [ProductName]</String>
180
181 <String Id="ProgressDlg_Title" Overridable="yes">Installation de [ProductName]</String>
182 <String Id="ProgressDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
183 <String Id="ProgressDlgTextInstalling" Overridable="yes">Veuillez patienter pendant que l'Assistant Installation installe [ProductName].</String>
184 <String Id="ProgressDlgTitleInstalling" Overridable="yes">{\WixUI_Font_Title}Installation de [ProductName]</String>
185 <String Id="ProgressDlgTextChanging" Overridable="yes">Veuillez patienter pendant que l'Assistant Installation modifie [ProductName].</String>
186 <String Id="ProgressDlgTitleChanging" Overridable="yes">{\WixUI_Font_Title}Modification de [ProductName]</String>
187 <String Id="ProgressDlgTextRepairing" Overridable="yes">Veuillez patienter pendant que l'Assistant Installation répare [ProductName].</String>
188 <String Id="ProgressDlgTitleRepairing" Overridable="yes">{\WixUI_Font_Title}Réparation de [ProductName]</String>
189 <String Id="ProgressDlgTextRemoving" Overridable="yes">Veuillez patienter pendant que l'Assistant Installation supprime [ProductName].</String>
190 <String Id="ProgressDlgTitleRemoving" Overridable="yes">{\WixUI_Font_Title}Suppression de [ProductName]</String>
191 <String Id="ProgressDlgTextUpdating" Overridable="yes">Veuillez patienter pendant que l'Assistant Installation met à jour [ProductName].</String>
192 <String Id="ProgressDlgTitleUpdating" Overridable="yes">{\WixUI_Font_Title}Mise à jour de [ProductName]</String>
193 <String Id="ProgressDlgProgressBar" Overridable="yes">État d'avancement</String>
194 <String Id="ProgressDlgStatusLabel" Overridable="yes">Statut :</String>
195
196 <String Id="ResumeDlg_Title" Overridable="yes">Installation de [ProductName]</String>
197 <String Id="ResumeDlgInstall" Overridable="yes">&amp;Installer</String>
198 <String Id="ResumeDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
199 <String Id="ResumeDlgDescription" Overridable="yes">L'Assistant Installation va terminer l'installation de [ProductName] sur l'ordinateur. Cliquez sur Installer pour continuer, ou sur Annuler pour quitter l'Assistant Installation.</String>
200 <String Id="ResumeDlgTitle" Overridable="yes">{\WixUI_Font_Bigger}Reprise de l'installation de [ProductName]</String>
201
202 <String Id="SetupTypeDlg_Title" Overridable="yes">Installation de [ProductName]</String>
203 <String Id="SetupTypeDlgTypicalButton" Overridable="yes">Par &amp;défaut</String>
204 <String Id="SetupTypeDlgTypicalButtonTooltip" Overridable="yes">Installation par défaut</String>
205 <String Id="SetupTypeDlgCustomButton" Overridable="yes">Perso&amp;nnalisée</String>
206 <String Id="SetupTypeDlgCustomButtonTooltip" Overridable="yes">Installation personnalisée</String>
207 <String Id="SetupTypeDlgCompleteButton" Overridable="yes">C&amp;omplète</String>
208 <String Id="SetupTypeDlgCompleteButtonTooltip" Overridable="yes">Installation complète</String>
209 <String Id="SetupTypeDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
210 <String Id="SetupTypeDlgTitle" Overridable="yes">{\WixUI_Font_Title}Sélectionner le type d'installation</String>
211 <String Id="SetupTypeDlgDescription" Overridable="yes">Choisissez le type d'installation qui correspond le mieux à vos besoins.</String>
212 <String Id="SetupTypeDlgTypicalText" Overridable="yes">Installe les composants les plus courants du programme. Recommandé pour la plupart des utilisateurs.</String>
213 <String Id="SetupTypeDlgCustomText" Overridable="yes">Permet à l'utilisateur de sélectionner les composants du programme qui seront installés et l'emplacement d'installation. Ceci est recommandé pour les utilisateurs expérimentés.</String>
214 <String Id="SetupTypeDlgCompleteText" Overridable="yes">Tous les composants du programme vont être installés. Nécessite une quantité d’espace disque maximale.</String>
215
216 <String Id="UserExit_Title" Overridable="yes">Installation de [ProductName]</String>
217 <String Id="UserExitBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
218 <String Id="UserExitTitle" Overridable="yes">{\WixUI_Font_Bigger}L'Assistant Installation de [ProductName] a été interrompu</String>
219 <String Id="UserExitDescription1" Overridable="yes">L'installation de [ProductName] a été interrompue. Votre système n'a pas été modifié. Pour installer ce programme ultérieurement, réexécutez l'installation.</String>
220 <String Id="UserExitDescription2" Overridable="yes">Cliquez sur le bouton Terminer pour quitter l'Assistant Installation.</String>
221
222 <String Id="VerifyReadyDlg_Title" Overridable="yes">Installation de [ProductName]</String>
223 <String Id="VerifyReadyDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
224 <String Id="VerifyReadyDlgInstall" Overridable="yes">&amp;Installer</String>
225 <String Id="VerifyReadyDlgInstallText" Overridable="yes">Cliquez sur Installer pour commencer l'installation. Cliquez sur Précédent pour vérifier ou modifier vos paramètres d'installation. Cliquez sur Annuler pour quitter l'Assistant.</String>
226 <String Id="VerifyReadyDlgInstallTitle" Overridable="yes">{\WixUI_Font_Title}Prêt à installer [ProductName]</String>
227 <String Id="VerifyReadyDlgChange" Overridable="yes">&amp;Modifier</String>
228 <String Id="VerifyReadyDlgChangeText" Overridable="yes">Cliquez sur Modifier pour lancer l'installation. Cliquez sur Précédent pour consulter ou modifier vos paramètres d'installation. Cliquez sur Annuler pour quitter l'Assistant Installation.</String>
229 <String Id="VerifyReadyDlgChangeTitle" Overridable="yes">{\WixUI_Font_Title}Prêt à modifier [ProductName]</String>
230 <String Id="VerifyReadyDlgRepair" Overridable="yes">Ré&amp;parer</String>
231 <String Id="VerifyReadyDlgRepairText" Overridable="yes">Cliquez sur Réparer pour réparer l'installation de [ProductName]. Cliquez sur Précédent pour consulter ou modifier vos paramètres d'installation. Cliquez sur Annuler pour quitter l'Assistant Installation.</String>
232 <String Id="VerifyReadyDlgRepairTitle" Overridable="yes">{\WixUI_Font_Title}Prêt à réparer [ProductName]</String>
233 <String Id="VerifyReadyDlgRemove" Overridable="yes">&amp;Supprimer</String>
234 <String Id="VerifyReadyDlgRemoveText" Overridable="yes">Cliquez sur Supprimer pour supprimer [ProductName] de votre ordinateur. Cliquez sur Précédent pour vérifier ou modifier vos paramètres d'installation. Cliquez sur Annuler pour quitter l'Assistant.</String>
235 <String Id="VerifyReadyDlgRemoveTitle" Overridable="yes">{\WixUI_Font_Title}Prêt à supprimer [ProductName]</String>
236 <String Id="VerifyReadyDlgUpdate" Overridable="yes">Mettre à jo&amp;ur</String>
237 <String Id="VerifyReadyDlgUpdateText" Overridable="yes">Cliquez sur Mettre à jour pour mettre à jour [ProductName] sur votre ordinateur. Cliquez sur Précédent pour vérifier ou modifier vos paramètres d'installation. Cliquez sur Annuler pour quitter l'Assistant.</String>
238 <String Id="VerifyReadyDlgUpdateTitle" Overridable="yes">{\WixUI_Font_Title}Prêt à mettre à jour [ProductName]</String>
239
240 <String Id="WaitForCostingDlg_Title" Overridable="yes">Installation de [ProductName]</String>
241 <String Id="WaitForCostingDlgReturn" Overridable="yes">&amp;Retour</String>
242 <String Id="WaitForCostingDlgText" Overridable="yes">Veuillez patienter pendant que l'Assistant Installation finit de calculer l'espace disque nécessaire.</String>
243 <String Id="WaitForCostingDlgIcon" Overridable="yes">WixUI_Ico_Exclam</String>
244 <String Id="WaitForCostingDlgIconTooltip" Overridable="yes">Icône d'exclamation</String>
245
246 <String Id="WelcomeDlg_Title" Overridable="yes">Installation de [ProductName]</String>
247 <String Id="WelcomeDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
248 <String Id="WelcomeDlgDescription" Overridable="yes">L'Assistant Installation va installer [ProductName] sur l'ordinateur. Cliquez sur Suivant pour continuer, ou sur Annuler pour quitter l'Assistant Installation.</String>
249 <String Id="WelcomeUpdateDlgDescriptionUpdate" Overridable="yes">L'Assistant Installation va mettre à jour [ProductName] sur l'ordinateur. Cliquez sur Suivant pour continuer, ou sur Annuler pour quitter l'Assistant Installation.</String>
250 <String Id="WelcomeDlgTitle" Overridable="yes">{\WixUI_Font_Bigger}Bienvenue dans l'Assistant Installation de [ProductName]</String>
251
252 <String Id="WelcomeEulaDlg_Title" Overridable="yes">Installation de [ProductName]</String>
253 <String Id="WelcomeEulaDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
254 <String Id="WelcomeEulaDlgLicenseAcceptedCheckBox" Overridable="yes">J'&amp;accepte les termes du contrat de licence</String>
255 <String Id="WelcomeEulaDlgInstall" Overridable="yes">&amp;Installer</String>
256 <String Id="WelcomeEulaDlgUpdate" Overridable="yes">Mettre à jo&amp;ur</String>
257 <String Id="WelcomeEulaDlgTitle" Overridable="yes">{\WixUI_Font_Title}Lisez attentivement le contrat de licence de [ProductName]</String>
258
259 <String Id="ProgressTextInstallValidate" Overridable="yes">Validation de l'installation</String>
260 <String Id="ProgressTextInstallFiles" Overridable="yes">Copie des nouveaux fichiers</String>
261 <String Id="ProgressTextInstallFilesTemplate" Overridable="yes">Fichier : [1], répertoire : [9], taille : [6]</String>
262 <String Id="ProgressTextInstallAdminPackage" Overridable="yes">Copie des fichiers d'installation réseau</String>
263 <String Id="ProgressTextInstallAdminPackageTemplate" Overridable="yes">Fichier : [1], répertoire : [9], taille : [6]</String>
264 <String Id="ProgressTextFileCost" Overridable="yes">Calcul de l'espace nécessaire</String>
265 <String Id="ProgressTextCostInitialize" Overridable="yes">Calcul de l'espace nécessaire</String>
266 <String Id="ProgressTextCostFinalize" Overridable="yes">Calcul de l'espace nécessaire</String>
267 <String Id="ProgressTextCreateShortcuts" Overridable="yes">Création des raccourcis</String>
268 <String Id="ProgressTextCreateShortcutsTemplate" Overridable="yes">Raccourci : [1]</String>
269 <String Id="ProgressTextPublishComponents" Overridable="yes">Publication des composants qualifiés</String>
270 <String Id="ProgressTextPublishComponentsTemplate" Overridable="yes">Identificateur du composant : [1], qualificateur : [2]</String>
271 <String Id="ProgressTextPublishFeatures" Overridable="yes">Publication des composants du produit</String>
272 <String Id="ProgressTextPublishFeaturesTemplate" Overridable="yes">Composant : [1]</String>
273 <String Id="ProgressTextPublishProduct" Overridable="yes">Publication des informations sur le produit</String>
274 <String Id="ProgressTextRegisterClassInfo" Overridable="yes">Inscription des serveurs de classes</String>
275 <String Id="ProgressTextRegisterClassInfoTemplate" Overridable="yes">Identificateur de classe : [1]</String>
276 <String Id="ProgressTextRegisterExtensionInfo" Overridable="yes">Inscription des serveurs d'extensions</String>
277 <String Id="ProgressTextRegisterExtensionInfoTemplate" Overridable="yes">Extension : [1]</String>
278 <String Id="ProgressTextRegisterMIMEInfo" Overridable="yes">Inscription des informations MIME</String>
279 <String Id="ProgressTextRegisterMIMEInfoTemplate" Overridable="yes">Type de contenu MIME : [1], extension : [2]</String>
280 <String Id="ProgressTextRegisterProgIdInfo" Overridable="yes">Inscription des identificateurs de programmes</String>
281 <String Id="ProgressTextRegisterProgIdInfoTemplate" Overridable="yes">ID du programme : [1]</String>
282 <String Id="ProgressTextAllocateRegistrySpace" Overridable="yes">Allocation de l'espace du Registre</String>
283 <String Id="ProgressTextAllocateRegistrySpaceTemplate" Overridable="yes">Espace libre : [1]</String>
284 <String Id="ProgressTextAppSearch" Overridable="yes">Recherche des applications déjà installées</String>
285 <String Id="ProgressTextAppSearchTemplate" Overridable="yes">Propriété : [1], signature : [2]</String>
286 <String Id="ProgressTextBindImage" Overridable="yes">Liaison des exécutables</String>
287 <String Id="ProgressTextBindImageTemplate" Overridable="yes">Fichier : [1]</String>
288 <String Id="ProgressTextCCPSearch" Overridable="yes">Recherche des produits éligibles</String>
289 <String Id="ProgressTextCreateFolders" Overridable="yes">Création des dossiers</String>
290 <String Id="ProgressTextCreateFoldersTemplate" Overridable="yes">Dossier : [1]</String>
291 <String Id="ProgressTextDeleteServices" Overridable="yes">Suppression des services</String>
292 <String Id="ProgressTextDeleteServicesTemplate" Overridable="yes">Service : [1]</String>
293 <String Id="ProgressTextDuplicateFiles" Overridable="yes">Création de fichiers dupliqués</String>
294 <String Id="ProgressTextDuplicateFilesTemplate" Overridable="yes">Fichier : [1], répertoire : [9], taille : [6]</String>
295 <String Id="ProgressTextFindRelatedProducts" Overridable="yes">Recherche des applications associées</String>
296 <String Id="ProgressTextFindRelatedProductsTemplate" Overridable="yes">Application trouvée : [1]</String>
297 <String Id="ProgressTextInstallODBC" Overridable="yes">Installation des composants ODBC</String>
298 <String Id="ProgressTextInstallServices" Overridable="yes">Installation des nouveaux services</String>
299 <String Id="ProgressTextInstallServicesTemplate" Overridable="yes">Service : [2]</String>
300 <String Id="ProgressTextLaunchConditions" Overridable="yes">Évaluation des conditions de lancement</String>
301 <String Id="ProgressTextMigrateFeatureStates" Overridable="yes">Migration de l'état des composants à partir des applications associées</String>
302 <String Id="ProgressTextMigrateFeatureStatesTemplate" Overridable="yes">Application : [1]</String>
303 <String Id="ProgressTextMoveFiles" Overridable="yes">Déplacement des fichiers</String>
304 <String Id="ProgressTextMoveFilesTemplate" Overridable="yes">Fichier : [1], répertoire : [9], taille : [6]</String>
305 <String Id="ProgressTextPatchFiles" Overridable="yes">Mises à jour correctives des fichiers</String>
306 <String Id="ProgressTextPatchFilesTemplate" Overridable="yes">Fichier : [1], répertoire : [2], taille : [3]</String>
307 <String Id="ProgressTextProcessComponents" Overridable="yes">Mise à jour de l'inscription des composants</String>
308 <String Id="ProgressTextRegisterComPlus" Overridable="yes">Inscription des applications et des composants COM+</String>
309 <String Id="ProgressTextRegisterComPlusTemplate" Overridable="yes">ID d'application : [1]{{, Type application : [2], Utilisateurs : [3], RSN : [4]}}</String>
310 <String Id="ProgressTextRegisterFonts" Overridable="yes">Inscription des polices</String>
311 <String Id="ProgressTextRegisterFontsTemplate" Overridable="yes">Police : [1]</String>
312 <String Id="ProgressTextRegisterProduct" Overridable="yes">Inscription du produit</String>
313 <String Id="ProgressTextRegisterProductTemplate" Overridable="yes">[1]</String>
314 <String Id="ProgressTextRegisterTypeLibraries" Overridable="yes">Inscription des bibliothèques de types</String>
315 <String Id="ProgressTextRegisterTypeLibrariesTemplate" Overridable="yes">ID de la bibliothèque : [1]</String>
316 <String Id="ProgressTextRegisterUser" Overridable="yes">Inscription de l'utilisateur</String>
317 <String Id="ProgressTextRegisterUserTemplate" Overridable="yes">[1]</String>
318 <String Id="ProgressTextRemoveDuplicateFiles" Overridable="yes">Suppression des fichiers dupliqués</String>
319 <String Id="ProgressTextRemoveDuplicateFilesTemplate" Overridable="yes">Fichier : [1], répertoire : [9]</String>
320 <String Id="ProgressTextRemoveEnvironmentStrings" Overridable="yes">Mise à jour des chaînes d'environnement</String>
321 <String Id="ProgressTextRemoveEnvironmentStringsTemplate" Overridable="yes">Nom : [1], valeur : [2], action : [3]</String>
322 <String Id="ProgressTextRemoveExistingProducts" Overridable="yes">Suppression des applications</String>
323 <String Id="ProgressTextRemoveExistingProductsTemplate" Overridable="yes">Application : [1], ligne de commande : [2]</String>
324 <String Id="ProgressTextRemoveFiles" Overridable="yes">Suppression des fichiers</String>
325 <String Id="ProgressTextRemoveFilesTemplate" Overridable="yes">Fichier : [1], répertoire : [9]</String>
326 <String Id="ProgressTextRemoveFolders" Overridable="yes">Suppression des dossiers</String>
327 <String Id="ProgressTextRemoveFoldersTemplate" Overridable="yes">Dossier : [1]</String>
328 <String Id="ProgressTextRemoveIniValues" Overridable="yes">Suppression des entrées des fichiers INI</String>
329 <String Id="ProgressTextRemoveIniValuesTemplate" Overridable="yes">Fichier : [1] ; section : [2] ; clé : [3] ; valeur : [4]</String>
330 <String Id="ProgressTextRemoveODBC" Overridable="yes">Suppression des composants ODBC</String>
331 <String Id="ProgressTextRemoveRegistryValues" Overridable="yes">Suppression des valeurs du Registre système</String>
332 <String Id="ProgressTextRemoveRegistryValuesTemplate" Overridable="yes">Clé : [1] ; nom : [2]</String>
333 <String Id="ProgressTextRemoveShortcuts" Overridable="yes">Suppression des raccourcis</String>
334 <String Id="ProgressTextRemoveShortcutsTemplate" Overridable="yes">Raccourci : [1]</String>
335 <String Id="ProgressTextRMCCPSearch" Overridable="yes">Recherche des produits éligibles</String>
336 <String Id="ProgressTextSelfRegModules" Overridable="yes">Inscription des modules</String>
337 <String Id="ProgressTextSelfRegModulesTemplate" Overridable="yes">Fichier : [1] ; dossier : [2]</String>
338 <String Id="ProgressTextSelfUnregModules" Overridable="yes">Annulation de l'inscription des modules</String>
339 <String Id="ProgressTextSelfUnregModulesTemplate" Overridable="yes">Fichier : [1] ; dossier : [2]</String>
340 <String Id="ProgressTextSetODBCFolders" Overridable="yes">Initialisation des répertoires ODBC</String>
341 <String Id="ProgressTextStartServices" Overridable="yes">Démarrage des services</String>
342 <String Id="ProgressTextStartServicesTemplate" Overridable="yes">Service : [1]</String>
343 <String Id="ProgressTextStopServices" Overridable="yes">Arrêt des services</String>
344 <String Id="ProgressTextStopServicesTemplate" Overridable="yes">Service : [1]</String>
345 <String Id="ProgressTextUnpublishComponents" Overridable="yes">Annulation de la publication des composants qualifiés</String>
346 <String Id="ProgressTextUnpublishComponentsTemplate" Overridable="yes">Identificateur du composant : [1], qualificateur : [2]</String>
347 <String Id="ProgressTextUnpublishFeatures" Overridable="yes">Annulation de la publication des composants du produit</String>
348 <String Id="ProgressTextUnpublishFeaturesTemplate" Overridable="yes">Composant : [1]</String>
349 <String Id="ProgressTextUnregisterClassInfo" Overridable="yes">Annulation de l'inscription des serveurs de classes</String>
350 <String Id="ProgressTextUnregisterClassInfoTemplate" Overridable="yes">Identificateur de classe : [1]</String>
351 <String Id="ProgressTextUnregisterComPlus" Overridable="yes">Annulation de l'inscription des applications et des composants COM+</String>
352 <String Id="ProgressTextUnregisterComPlusTemplate" Overridable="yes">ID d'application : [1]{{, Type application : [2]}}</String>
353 <String Id="ProgressTextUnregisterExtensionInfo" Overridable="yes">Annulation de l'inscription des serveurs d'extensions</String>
354 <String Id="ProgressTextUnregisterExtensionInfoTemplate" Overridable="yes">Extension : [1]</String>
355 <String Id="ProgressTextUnregisterFonts" Overridable="yes">Annulation de l'inscription des polices</String>
356 <String Id="ProgressTextUnregisterFontsTemplate" Overridable="yes">Police : [1]</String>
357 <String Id="ProgressTextUnregisterMIMEInfo" Overridable="yes">Annulation de l'inscription des informations MIME</String>
358 <String Id="ProgressTextUnregisterMIMEInfoTemplate" Overridable="yes">Type de contenu MIME : [1], extension : [2]</String>
359 <String Id="ProgressTextUnregisterProgIdInfo" Overridable="yes">Annulation de l'inscription des identificateurs de programmes</String>
360 <String Id="ProgressTextUnregisterProgIdInfoTemplate" Overridable="yes">ID du programme : [1]</String>
361 <String Id="ProgressTextUnregisterTypeLibraries" Overridable="yes">Annulation de l'inscription des bibliothèques de types</String>
362 <String Id="ProgressTextUnregisterTypeLibrariesTemplate" Overridable="yes">ID de la bibliothèque : [1]</String>
363 <String Id="ProgressTextWriteEnvironmentStrings" Overridable="yes">Mise à jour des chaînes d'environnement</String>
364 <String Id="ProgressTextWriteEnvironmentStringsTemplate" Overridable="yes">Nom : [1], valeur : [2], action : [3]</String>
365 <String Id="ProgressTextWriteIniValues" Overridable="yes">Écriture des valeurs des fichiers INI</String>
366 <String Id="ProgressTextWriteIniValuesTemplate" Overridable="yes">Fichier : [1] ; section : [2] ; clé : [3] ; valeur : [4]</String>
367 <String Id="ProgressTextWriteRegistryValues" Overridable="yes">Écriture des valeurs du Registre système</String>
368 <String Id="ProgressTextWriteRegistryValuesTemplate" Overridable="yes">Clé : [1] ; nom : [2] ; valeur : [3]</String>
369 <String Id="ProgressTextAdvertise" Overridable="yes">Publication d'informations sur l'application</String>
370 <String Id="ProgressTextGenerateScript" Overridable="yes">Génération d'opérations de script pour l'action :</String>
371 <String Id="ProgressTextGenerateScriptTemplate" Overridable="yes">[1]</String>
372 <String Id="ProgressTextInstallSFPCatalogFile" Overridable="yes">Installation du catalogue système</String>
373 <String Id="ProgressTextInstallSFPCatalogFileTemplate" Overridable="yes">Fichier : [1] ; dépendances : [2]</String>
374 <String Id="ProgressTextMsiPublishAssemblies" Overridable="yes">Publication des informations d'assembly</String>
375 <String Id="ProgressTextMsiPublishAssembliesTemplate" Overridable="yes">Contexte de l'application : [1], nom de l'assembly : [2]</String>
376 <String Id="ProgressTextMsiUnpublishAssemblies" Overridable="yes">Annulation de la publication des informations d'assembly</String>
377 <String Id="ProgressTextMsiUnpublishAssembliesTemplate" Overridable="yes">Contexte de l'application : [1], nom de l'assembly : [2]</String>
378 <String Id="ProgressTextRollback" Overridable="yes">Annulation de l'action :</String>
379 <String Id="ProgressTextRollbackTemplate" Overridable="yes">[1]</String>
380 <String Id="ProgressTextRollbackCleanup" Overridable="yes">Suppression des fichiers de sauvegarde</String>
381 <String Id="ProgressTextRollbackCleanupTemplate" Overridable="yes">Fichier : [1]</String>
382 <String Id="ProgressTextUnmoveFiles" Overridable="yes">Suppression des fichiers déplacés</String>
383 <String Id="ProgressTextUnmoveFilesTemplate" Overridable="yes">Fichier : [1], répertoire : [9]</String>
384 <String Id="ProgressTextUnpublishProduct" Overridable="yes">Annulation de la publication des informations sur le produit</String>
385
386 <String Id="Error0" Overridable="yes">{{Erreur irrécupérable : }}</String>
387 <String Id="Error1" Overridable="yes">{{Erreur [1]. }}</String>
388 <String Id="Error2" Overridable="yes">Avertissement [1]. </String>
389 <String Id="Error4" Overridable="yes">Informations [1]. </String>
390 <String Id="Error5" Overridable="yes">Le programme d'installation a rencontré un problème lors de l'installation de ce package. Cette erreur peut indiquer un problème dans ce package. Le code d'erreur est [1]. {{Les arguments sont : [2], [3], [4]}}</String>
391 <String Id="Error7" Overridable="yes">{{Disque plein : }}</String>
392 <String Id="Error8" Overridable="yes">Action [Time] : [1]. [2]</String>
393 <String Id="Error9" Overridable="yes">[ProductName]</String>
394 <String Id="Error10" Overridable="yes">{[2]}{, [3]}{, [4]}</String>
395 <String Id="Error11" Overridable="yes">Type de message : [1] ; argument : [2]</String>
396 <String Id="Error12" Overridable="yes">=== Début de l'écriture dans le journal : [Date] [Time] ===</String>
397 <String Id="Error13" Overridable="yes">=== Fin de l'écriture dans le journal : [Date] [Time] ===</String>
398 <String Id="Error14" Overridable="yes">Début de l'action [Time] : [1].</String>
399 <String Id="Error15" Overridable="yes">Fin de l'action [Time] : [1]. Valeur renvoyée : [2].</String>
400 <String Id="Error16" Overridable="yes">Durée restante : {[1] minute(s) }{[2] seconde(s)}</String>
401 <String Id="Error17" Overridable="yes">Mémoire insuffisante. Fermez les autres applications avant de recommencer.</String>
402 <String Id="Error18" Overridable="yes">Le programme d'installation ne répond plus.</String>
403 <String Id="Error19" Overridable="yes">Le programme d'installation s'est arrêté prématurément.</String>
404 <String Id="Error20" Overridable="yes">Veuillez patienter pendant que Windows configure [ProductName]</String>
405 <String Id="Error21" Overridable="yes">Collecte des informations nécessaires...</String>
406 <String Id="Error22" Overridable="yes">Suppression des anciennes versions de cette application...</String>
407 <String Id="Error23" Overridable="yes">Préparation à la suppression des anciennes versions de cette application...</String>
408 <String Id="Error32" Overridable="yes">L'installation de [ProductName] s'est terminée correctement.</String>
409 <String Id="Error33" Overridable="yes">Échec de l'installation de [ProductName].</String>
410 <String Id="Error1101" Overridable="yes">Erreur lors de la lecture du fichier [2]. {{ Erreur système [3].}} Vérifiez que ce fichier existe et que vous êtes autorisé à y accéder.</String>
411 <String Id="Error1301" Overridable="yes">Impossible de créer le fichier « [2] ». Un répertoire du même nom existe déjà. Annulez l'installation et essayez d'effectuer l'installation dans un autre emplacement.</String>
412 <String Id="Error1302" Overridable="yes">Veuillez insérer le disque : [2]</String>
413 <String Id="Error1303" Overridable="yes">Le programme d'installation ne dispose pas des privilèges nécessaires pour accéder au répertoire [2]. Impossible de poursuivre l'installation. Ouvrez une session en tant qu'administrateur, ou contactez l'administrateur système.</String>
414 <String Id="Error1304" Overridable="yes">Erreur lors de l'écriture dans le fichier : [2]. Vérifiez que vous êtes autorisé à accéder à ce répertoire.</String>
415 <String Id="Error1305" Overridable="yes">Erreur lors de la lecture du fichier [2]. {{ Erreur système [3].}} Vérifiez que ce fichier existe et que vous êtes autorisé à y accéder.</String>
416 <String Id="Error1306" Overridable="yes">Une autre application a un accès exclusif au fichier « [2] ». Fermez toutes les autres applications, puis cliquez sur Réessayer.</String>
417 <String Id="Error1307" Overridable="yes">Espace disque insuffisant pour installer le fichier : [2]. Libérez de l'espace disque et cliquez sur Réessayer, ou cliquez sur Annuler pour abandonner l'opération.</String>
418 <String Id="Error1308" Overridable="yes">Fichier source [2] introuvable. Vérifiez que ce fichier existe et que vous êtes autorisé à y accéder.</String>
419 <String Id="Error1309" Overridable="yes">Erreur lors de la lecture du fichier [3].{{ Erreur système [2].}} Vérifiez que ce fichier existe et que vous êtes autorisé à y accéder.</String>
420 <String Id="Error1310" Overridable="yes">Erreur lors de l'écriture dans le fichier [3]. {{ Erreur système [2].}} Vérifiez que vous êtes autorisé à accéder à ce répertoire.</String>
421 <String Id="Error1311" Overridable="yes">Fichier source introuvable{{(cabinet)}} : [2]. Vérifiez que ce fichier existe et que vous êtes autorisé à y accéder.</String>
422 <String Id="Error1312" Overridable="yes">Impossible de créer le répertoire « [2] ». Un fichier portant ce nom existe déjà. Renommez ou supprimez le fichier et cliquez sur Réessayer, ou cliquez sur Annuler pour quitter.</String>
423 <String Id="Error1313" Overridable="yes">Le volume [2] n'est pas disponible actuellement. Veuillez en sélectionner un autre.</String>
424 <String Id="Error1314" Overridable="yes">Le chemin d'accès spécifié « [2] » n'est pas disponible.</String>
425 <String Id="Error1315" Overridable="yes">Impossible d'écrire dans le dossier spécifié : [2].</String>
426 <String Id="Error1316" Overridable="yes">Une erreur réseau s'est produite lors de la tentative de lecture à partir du fichier : [2]</String>
427 <String Id="Error1317" Overridable="yes">Erreur lors de la tentative de création du répertoire : [2]</String>
428 <String Id="Error1318" Overridable="yes">Une erreur réseau s'est produite lors de la tentative de création du répertoire : [2]</String>
429 <String Id="Error1319" Overridable="yes">Une erreur réseau s'est produite lors de la tentative d'ouverture du fichier CAB du source : [2]</String>
430 <String Id="Error1320" Overridable="yes">Le chemin d'accès spécifié est trop long : [2]</String>
431 <String Id="Error1321" Overridable="yes">Le programme d'installation ne dispose pas des privilèges nécessaires pour modifier le fichier [2].</String>
432 <String Id="Error1322" Overridable="yes">Une partie du chemin d'accès au dossier « [2] » n'est pas valide. Elle est vide, ou elle dépasse la longueur maximale autorisée par le système.</String>
433 <String Id="Error1323" Overridable="yes">Le chemin d'accès du dossier « [2] » contient des mots non valides.</String>
434 <String Id="Error1324" Overridable="yes">Le chemin d'accès du dossier « [2] » contient un caractère non valide.</String>
435 <String Id="Error1325" Overridable="yes">Le nom de fichier court « [2] » n'est pas valide.</String>
436 <String Id="Error1326" Overridable="yes">Erreur lors de l'obtention des informations sur la sécurité du fichier [3] GetLastError : [2]</String>
437 <String Id="Error1327" Overridable="yes">Lecteur non valide : [2]</String>
438 <String Id="Error1328" Overridable="yes">Erreur lors de l'application du correctif logiciel au fichier [2]. Celui-ci a probablement été mis à jour par d'autres moyens et ne peut plus être modifié par ce correctif logiciel. Pour plus d'informations, contactez le fournisseur du correctif logiciel. {{Erreur système : [3]}}</String>
439 <String Id="Error1329" Overridable="yes">Un fichier requis ne peut pas être installé, car le fichier CAB [2] n'est pas signé numériquement. Cela indique peut-être que le fichier CAB est endommagé.</String>
440 <String Id="Error1330" Overridable="yes">Un fichier requis ne peut pas être installé, car la signature numérique du fichier CAB [2] n'est pas valide. Ceci peut indiquer que le fichier CAB est endommagé. {{L'erreur [3] a été retournée par WinVerifyTrust.}}</String>
441 <String Id="Error1331" Overridable="yes">Échec de la copie du fichier [2] : erreur CRC.</String>
442 <String Id="Error1332" Overridable="yes">Échec du déplacement du fichier [2] : erreur CRC.</String>
443 <String Id="Error1333" Overridable="yes">Échec de la modification du fichier [2] : erreur CRC.</String>
444 <String Id="Error1334" Overridable="yes">Impossible d'installer le fichier « [2] », car il ne se trouve pas dans le fichier CAB « [3] ». Ceci peut venir d'une erreur réseau, d'une erreur de lecture du CD-ROM ou d'un problème lié à ce package.</String>
445 <String Id="Error1335" Overridable="yes">Le fichier CAB « [2] » requis pour cette installation est endommagé et inutilisable. Ceci peut venir d'une erreur réseau, d'une erreur de lecture du CD-ROM ou d'un problème lié à ce package.</String>
446 <String Id="Error1336" Overridable="yes">Une erreur s'est produite lors de la création d'un fichier temporaire requis par cette installation.{{ Dossier : [3]. Code d'erreur système : [2]}}</String>
447 <String Id="Error1401" Overridable="yes">Impossible de créer la clé [2]. {{ Erreur système [3].}} Vérifiez que vous disposez des droits d'accès nécessaires pour cette clé ou contactez votre service de support technique. </String>
448 <String Id="Error1402" Overridable="yes">Impossible d'ouvrir la clé [2].{{ Erreur système [3].}} Vérifiez que vous disposez des droits d'accès nécessaires pour cette clé ou contactez votre service de support technique. </String>
449 <String Id="Error1403" Overridable="yes">Impossible de supprimer la valeur [2] de la clé [3].{{ Erreur système [4].}} Vérifiez que vous disposez des droits d'accès nécessaires pour cette clé ou contactez votre service de support technique. </String>
450 <String Id="Error1404" Overridable="yes">Impossible de supprimer la clé [2].{{ Erreur système [3].}} Vérifiez que vous disposez des droits d'accès nécessaires pour cette clé ou contactez votre service de support technique. </String>
451 <String Id="Error1405" Overridable="yes">Impossible de lire la valeur [2] de la clé [3].{{ Erreur système [4].}} Vérifiez que vous disposez des droits d'accès nécessaires pour cette clé ou contactez votre service de support technique. </String>
452 <String Id="Error1406" Overridable="yes">Impossible d'écrire la valeur [2] dans la clé [3].{{ Erreur système [4].}} Vérifiez que vous disposez des droits d'accès nécessaires pour cette clé ou contactez votre service de support technique.</String>
453 <String Id="Error1407" Overridable="yes">Impossible d'obtenir le nom des valeurs de la clé [2].{{ Erreur système [3].}} Vérifiez que vous disposez des droits d'accès nécessaires pour cette clé ou contactez votre service de support technique.</String>
454 <String Id="Error1408" Overridable="yes">Impossible d'obtenir le nom des sous-clés de la clé [2].{{ Erreur système [3].}} Vérifiez que vous disposez des droits d'accès nécessaires pour cette clé ou contactez votre service de support technique.</String>
455 <String Id="Error1409" Overridable="yes">Impossible de lire les informations sur la sécurité de la clé [2].{{ Erreur système [3].}} Vérifiez que vous disposez des droits d'accès nécessaires pour cette clé ou contactez votre service de support technique.</String>
456 <String Id="Error1410" Overridable="yes">Impossible d'augmenter l'espace disponible dans le Registre. [2] Ko d'espace doivent être libres dans le Registre pour permettre l'installation de cette application.</String>
457 <String Id="Error1500" Overridable="yes">Une autre installation est en cours d'exécution. Vous devez la terminer avant de poursuivre cette installation.</String>
458 <String Id="Error1501" Overridable="yes">Erreur lors de l'accès aux données protégées. Vérifiez que Windows Installer est correctement configuré, puis recommencez l'installation.</String>
459 <String Id="Error1502" Overridable="yes">L'utilisateur « [2] » a précédemment lancé une installation du produit « [3] ». Il devra réexécuter cette installation avant de pouvoir utiliser ce produit. Votre installation va maintenant se poursuivre.</String>
460 <String Id="Error1503" Overridable="yes">L'utilisateur « [2] » a précédemment lancé une installation du produit « [3] ». Il devra réexécuter cette installation avant de pouvoir utiliser ce produit.</String>
461 <String Id="Error1601" Overridable="yes">Espace disque insuffisant - Volume : « [2] » ; espace nécessaire : [3] Ko ; espace disponible : [4] Ko. Libérez de l'espace sur le disque, puis réessayez.</String>
462 <String Id="Error1602" Overridable="yes">Êtes-vous sûr de vouloir annuler ?</String>
463 <String Id="Error1603" Overridable="yes">Le fichier [2][3] est en cours d'utilisation {par le processus suivant : nom : [4], ID : [5], titre de fenêtre : « [6] »}. Fermez cette application et réessayez.</String>
464 <String Id="Error1604" Overridable="yes">« [2] » est déjà installé, ce qui empêche l'installation de ce produit. Les deux produits sont incompatibles.</String>
465 <String Id="Error1605" Overridable="yes">Espace insuffisant sur le volume « [2] » pour continuer l'installation avec l'option de récupération. [3] Ko sont requis, alors que seuls [4] Ko sont disponibles. Cliquez sur Ignorer pour poursuivre l'installation sans enregistrer les informations de récupération, cliquez sur Réessayer pour revérifier l'espace disponible, ou cliquez sur Annuler pour arrêter.</String>
466 <String Id="Error1606" Overridable="yes">Impossible d'accéder à l'emplacement réseau [2].</String>
467 <String Id="Error1607" Overridable="yes">Fermez les applications suivantes avant de poursuivre l'installation :</String>
468 <String Id="Error1608" Overridable="yes">Impossible de trouver un produit compatible précédemment installé permettant l'installation de ce produit sur cet ordinateur.</String>
469 <String Id="Error1609" Overridable="yes">Une erreur s'est produite lors de l'activation des paramètres de sécurité. [2] n'est pas un nom de groupe ou d'utilisateur reconnu. Le problème peut venir du package ou de la connexion au contrôleur de domaine sur le réseau. Vérifiez vos connexions réseau et cliquez sur Réessayer, ou cliquez sur Annuler pour arrêter. {{Le SID de l'utilisateur est introuvable, erreur système [3]}}</String>
470 <String Id="Error1701" Overridable="yes">La clé [2] n'est pas valide. Vérifiez que vous avez entré la clé correcte.</String>
471 <String Id="Error1702" Overridable="yes">Le programme d'installation doit redémarrer l'ordinateur afin de poursuivre la configuration de [2]. Cliquez sur Oui pour redémarrer maintenant, ou sur Non pour redémarrer manuellement ultérieurement.</String>
472 <String Id="Error1703" Overridable="yes">Vous devez redémarrer votre système pour que les modifications apportées à la configuration de [2] prennent effet. Cliquez sur Oui pour redémarrer maintenant, ou sur Non pour redémarrer manuellement ultérieurement.</String>
473 <String Id="Error1704" Overridable="yes">L’installation de [2] est suspendue. Vous devez annuler les modifications apportées par cette installation pour continuer. Voulez-vous annuler les modifications ?</String>
474 <String Id="Error1705" Overridable="yes">Une installation de ce produit est déjà en cours. Vous devez annuler les modifications apportées par cette installation pour continuer. Voulez-vous annuler les modifications ?</String>
475 <String Id="Error1706" Overridable="yes">Aucun package d'installation pour le produit [2] n'a été trouvé. Recommencez l'installation en utilisant une copie valide du package d'installation « [3] ».</String>
476 <String Id="Error1707" Overridable="yes">Installation effectuée.</String>
477 <String Id="Error1708" Overridable="yes">Échec de l'installation.</String>
478 <String Id="Error1709" Overridable="yes">Produit : [2] -- [3]</String>
479 <String Id="Error1710" Overridable="yes">Vous pouvez restaurer l'état antérieur de votre ordinateur ou poursuivre l'installation ultérieurement. Voulez-vous restaurer votre ordinateur ?</String>
480 <String Id="Error1711" Overridable="yes">Erreur lors de l'écriture sur le disque des informations concernant l'installation. Vérifiez que l'espace disponible sur le disque est suffisant et cliquez sur Réessayer, ou cliquez sur Annuler pour mettre fin à l'installation.</String>
481 <String Id="Error1712" Overridable="yes">Impossible de trouver les fichiers requis pour restaurer l'état antérieur de votre ordinateur. Impossible de procéder à la restauration.</String>
482 <String Id="Error1713" Overridable="yes">[2] ne peut pas installer l'un des produits nécessaires. Contactez votre service de support technique. {{Erreur système : [3].}}</String>
483 <String Id="Error1714" Overridable="yes">La version précédente de [2] ne peut pas être supprimée. Contactez votre service de support technique. {{Erreur système : [3].}}</String>
484 <String Id="Error1715" Overridable="yes">[2] installé</String>
485 <String Id="Error1716" Overridable="yes">[2] configuré</String>
486 <String Id="Error1717" Overridable="yes">[2] supprimé</String>
487 <String Id="Error1718" Overridable="yes">Le fichier [2] a été rejeté par la stratégie de signature numérique.</String>
488 <String Id="Error1719" Overridable="yes">Impossible d'accéder au service Windows Installer. Ceci peut se produire si vous exécutez Windows en mode sans échec, ou si le programme d'installation de Windows n'est pas bien installé. Contactez votre service de support technique pour obtenir de l'assistance.</String>
489 <String Id="Error1720" Overridable="yes">Problème détecté dans ce package Windows Installer. Un script requis pour cette installation ne peut pas s'exécuter. Contactez votre service de support technique ou l'éditeur du package. {{Action personnalisée [2] erreur de script [3], [4] : [5] ligne [6], colonne [7], [8]}}</String>
490 <String Id="Error1721" Overridable="yes">Problème détecté dans ce package Windows Installer. Un programme requis pour cette installation n'a pas pu être exécuté. Contactez votre service de support technique ou l'éditeur du package. {{Action : [2], emplacement : [3], commande : [4] }}</String>
491 <String Id="Error1722" Overridable="yes">Problème détecté dans ce package Windows Installer. Un programme exécuté dans le cadre de l'installation ne s'est pas terminé normalement. Contactez votre service de support technique ou l'éditeur du package. {{Action [2], emplacement : [3], commande : [4]}}</String>
492 <String Id="Error1723" Overridable="yes">Problème détecté dans ce package Windows Installer. Un fichier DLL requis pour cette installation n'a pas pu être exécuté. Contactez votre service de support technique ou l'éditeur du package. {{Action [2], entrée : [3], bibliothèque : [4]}}</String>
493 <String Id="Error1724" Overridable="yes">Suppression effectuée.</String>
494 <String Id="Error1725" Overridable="yes">Échec de la suppression.</String>
495 <String Id="Error1726" Overridable="yes">Annonce effectuée.</String>
496 <String Id="Error1727" Overridable="yes">Échec de l'annonce.</String>
497 <String Id="Error1728" Overridable="yes">Configuration effectuée.</String>
498 <String Id="Error1729" Overridable="yes">Échec de la configuration.</String>
499 <String Id="Error1730" Overridable="yes">Vous devez être administrateur pour supprimer cette application. Pour la supprimer, ouvrez une session avec un compte d'administrateur ou contactez votre service de support technique pour obtenir de l'assistance.</String>
500 <String Id="Error1731" Overridable="yes">Le package d'installation source du produit [2] n'est pas synchronisé avec le package client. Recommencez l'installation en utilisant une copie valide du package d'installation « [3] ».</String>
501 <String Id="Error1732" Overridable="yes">Vous devez redémarrer l’ordinateur afin de terminer l’installation de [2], or d’autres utilisateurs sont actuellement connectés à cet ordinateur, et un redémarrage risque d’entraîner la perte de leurs données. Voulez-vous redémarrer maintenant ?</String>
502 <String Id="Error1801" Overridable="yes">Le chemin d'accès [2] n'est pas valide. Spécifiez un chemin d'accès valide.</String>
503 <String Id="Error1802" Overridable="yes">Mémoire insuffisante. Fermez les autres applications avant de recommencer.</String>
504 <String Id="Error1803" Overridable="yes">Le lecteur [2] est vide. Insérez un disque et cliquez sur Réessayer, ou cliquez sur Annuler pour revenir au volume sélectionné précédemment.</String>
505 <String Id="Error1804" Overridable="yes">Le lecteur [2] est vide. Insérez un disque et cliquez sur Réessayer, ou cliquez sur Annuler pour revenir à la boîte de dialogue de sélection de l'emplacement et sélectionner un autre volume.</String>
506 <String Id="Error1805" Overridable="yes">Le dossier [2] n'existe pas. Entrez un chemin d'accès à un dossier existant.</String>
507 <String Id="Error1806" Overridable="yes">Vous ne disposez pas des privilèges nécessaires pour lire le contenu de ce dossier.</String>
508 <String Id="Error1807" Overridable="yes">Impossible de trouver un dossier de destination valide pour l'installation.</String>
509 <String Id="Error1901" Overridable="yes">Une erreur s'est produite lors de la tentative de lecture de la base de données d'installation source : [2].</String>
510 <String Id="Error1902" Overridable="yes">Planification du redémarrage : le fichier [2] est renommé [3]. Pour terminer l'opération, votre système doit être redémarré.</String>
511 <String Id="Error1903" Overridable="yes">Planification du redémarrage : suppression du fichier [2]. Pour terminer l'opération, votre système doit être redémarré.</String>
512 <String Id="Error1904" Overridable="yes">Impossible d'inscrire le module [2]. HRESULT [3]. Contactez votre service de support technique.</String>
513 <String Id="Error1905" Overridable="yes">Impossible d'annuler l'inscription du module [2]. HRESULT [3]. Contactez votre service de support technique.</String>
514 <String Id="Error1906" Overridable="yes">Impossible de placer le package [2] dans le cache. Erreur : [3]. Contactez votre service de support technique.</String>
515 <String Id="Error1907" Overridable="yes">Impossible d'inscrire la police [2]. Vérifiez que vous disposez des autorisations nécessaires pour installer des polices et que le système prend en charge cette police en particulier.</String>
516 <String Id="Error1908" Overridable="yes">Impossible d'annuler l'inscription de la police [2]. Vérifiez que vous disposez des autorisations nécessaires pour supprimer des polices.</String>
517 <String Id="Error1909" Overridable="yes">Impossible de créer le raccourci [2]. Vérifiez que le dossier de destination existe et que vous êtes autorisé à y accéder.</String>
518 <String Id="Error1910" Overridable="yes">Impossible de supprimer le raccourci [2]. Vérifiez que le fichier de raccourcis existe et que vous êtes autorisé à y accéder.</String>
519 <String Id="Error1911" Overridable="yes">Impossible d'inscrire la bibliothèque de types pour le fichier [2]. Contactez votre service de support technique.</String>
520 <String Id="Error1912" Overridable="yes">Impossible d'annuler l'inscription de la bibliothèque de types pour le fichier [2]. Contactez votre service de support technique.</String>
521 <String Id="Error1913" Overridable="yes">Impossible de mettre à jour le fichier ini [2][3]. Vérifiez que ce fichier existe et que vous êtes autorisé à y accéder.</String>
522 <String Id="Error1914" Overridable="yes">Impossible de planifier le remplacement du fichier [3] par le fichier [2] au redémarrage. Vérifiez que vous disposez des autorisations d'écriture sur le fichier [3].</String>
523 <String Id="Error1915" Overridable="yes">Erreur lors de la suppression du gestionnaire de pilotes ODBC. Erreur ODBC [2] : [3]. Contactez votre service de support technique.</String>
524 <String Id="Error1916" Overridable="yes">Erreur lors de l'installation du gestionnaire de pilotes ODBC. Erreur ODBC [2] : [3]. Contactez votre service de support technique.</String>
525 <String Id="Error1917" Overridable="yes">Erreur lors de la suppression du pilote ODBC [4]. Erreur ODBC [2] : [3]. Vérifiez que vous disposez des privilèges nécessaires pour supprimer des pilotes ODBC.</String>
526 <String Id="Error1918" Overridable="yes">Erreur lors de l'installation du pilote ODBC [4]. Erreur ODBC [2] : [3]. Vérifiez que le fichier [4] existe et que vous êtes autorisé à y accéder.</String>
527 <String Id="Error1919" Overridable="yes">Erreur lors de la configuration de la source de données ODBC [4]. Erreur ODBC [2] : [3]. Vérifiez que le fichier [4] existe et que vous êtes autorisé à y accéder.</String>
528 <String Id="Error1920" Overridable="yes">Impossible de démarrer le service « [2] » ([3]). Vérifiez que vous disposez des privilèges nécessaires pour démarrer les services système.</String>
529 <String Id="Error1921" Overridable="yes">Impossible d'arrêter le service « [2] » ([3]). Vérifiez que vous disposez des privilèges nécessaires pour arrêter les services système.</String>
530 <String Id="Error1922" Overridable="yes">Impossible de supprimer le service « [2] » ([3]). Vérifiez que vous disposez des privilèges nécessaires pour supprimer les services système.</String>
531 <String Id="Error1923" Overridable="yes">Impossible d'installer le service « [2] » ([3]). Vérifiez que vous disposez des privilèges nécessaires pour installer les services système.</String>
532 <String Id="Error1924" Overridable="yes">Impossible de mettre à jour la variable d'environnement « [2] ». Vérifiez que vous disposez des privilèges nécessaires pour modifier les variables d'environnement.</String>
533 <String Id="Error1925" Overridable="yes">Vous ne disposez pas des privilèges nécessaires pour effectuer cette installation pour tous les utilisateurs de cet ordinateur. Ouvrez une session en tant qu'administrateur, puis réessayez.</String>
534 <String Id="Error1926" Overridable="yes">Impossible de définir la sécurité du fichier « [3] ». Erreur : [2]. Vérifiez que vous disposez des privilèges nécessaires pour modifier les autorisations de sécurité pour ce fichier.</String>
535 <String Id="Error1927" Overridable="yes">Les services de composants (COM+ 1.0) ne sont pas installés sur cet ordinateur. Cette installation nécessite les services de composants afin de se terminer correctement. Les services de composants sont disponibles dans Windows 2000.</String>
536 <String Id="Error1928" Overridable="yes">Erreur lors de l'inscription de l'application COM+. Contactez le support technique pour plus d'informations.</String>
537 <String Id="Error1929" Overridable="yes">Erreur lors de l'annulation de l'inscription de l'application COM+. Contactez le support technique pour plus d'informations.</String>
538 <String Id="Error1930" Overridable="yes">La description du service « [2] » ([3]) n'a pas pu être modifiée.</String>
539 <String Id="Error1931" Overridable="yes">Le service Windows Installer ne peut pas mettre à jour le fichier système [2], car celui-ci est protégé par Windows. Vous devrez peut-être mettre à jour votre système d'exploitation pour que ce programme fonctionne correctement. {{Version du package : [3], version protégée du système d'exploitation : [4]}}</String>
540 <String Id="Error1932" Overridable="yes">Le service Windows Installer ne peut pas mettre à jour le fichier Windows protégé [2]. {{Version du package : [3], version protégée du système d'exploitation : [4], erreur SFP : [5]}}</String>
541 <String Id="Error1933" Overridable="yes">Le service Windows Installer ne peut pas mettre à jour un ou plusieurs des fichiers Windows protégés. {{Erreur SFP : [2]. Liste des fichiers protégés :\r\n[3]}}</String>
542 <String Id="Error1934" Overridable="yes">Les installations utilisateur sont désactivées via une stratégie sur cet ordinateur.</String>
543 <String Id="Error1935" Overridable="yes">Une erreur s'est produite lors de l'installation de l'assembly « [6] ». Voir Aide et support pour plus d'informations. HRESULT : [3]. {{interface de l'assembly : [4], fonction : [5] composant : [2]}}</String>
544 <String Id="Error1936" Overridable="yes">Une erreur s'est produite lors de l'installation de l'assembly « [6] ». L'assembly n'a pas un nom fort ou n'est pas signé avec la longueur de clé minimale. HRESULT : [3]. {{interface de l'assembly : [4], fonction : [5], composant : [2]}}</String>
545 <String Id="Error1937" Overridable="yes">Une erreur s'est produite lors de l'installation de l'assembly « [6] ». La signature ou le catalogue n'a pas pu être vérifié ou n'est pas valide. HRESULT : [3]. {{interface de l'assembly : [4], fonction : [5], composant : [2]}}</String>
546 <String Id="Error1938" Overridable="yes">Une erreur s'est produite lors de l'installation de l'assembly « [6] ». Un ou plusieurs des modules de l'assembly sont introuvables. HRESULT : [3]. {{interface de l'assembly : [4], fonction : [5], composant : [2]}}</String>
547
548 <String Id="UITextbytes" Overridable="yes">octets</String>
549 <String Id="UITextGB" Overridable="yes">Go</String>
550 <String Id="UITextKB" Overridable="yes">Ko</String>
551 <String Id="UITextMB" Overridable="yes">Mo</String>
552 <String Id="UITextMenuAbsent" Overridable="yes">Ce composant ne sera pas disponible en totalité</String>
553 <String Id="UITextMenuAdvertise" Overridable="yes">Ce composant sera installé à la demande</String>
554 <String Id="UITextMenuAllCD" Overridable="yes">Ce composant sera installé pour être exécuté à partir du CD</String>
555 <String Id="UITextMenuAllLocal" Overridable="yes">Ce composant sera installé en totalité sur le disque dur local</String>
556 <String Id="UITextMenuAllNetwork" Overridable="yes">Ce composant sera installé en totalité pour être exécuté à partir du réseau</String>
557 <String Id="UITextMenuCD" Overridable="yes">Installation pour une exécution à partir du CD</String>
558 <String Id="UITextMenuLocal" Overridable="yes">Installation sur le disque dur local</String>
559 <String Id="UITextMenuNetwork" Overridable="yes">Installation pour une exécution à partir du réseau</String>
560 <String Id="UITextNewFolder" Overridable="yes">Folder|Nouveau dossier</String>
561 <String Id="UITextScriptInProgress" Overridable="yes">Collecte des informations nécessaires...</String>
562 <String Id="UITextSelAbsentAbsent" Overridable="yes">Ce composant ne sera pas installé</String>
563 <String Id="UITextSelAbsentAdvertise" Overridable="yes">Ce composant sera configuré pour être installé à la demande</String>
564 <String Id="UITextSelAbsentCD" Overridable="yes">Ce composant sera installé pour être exécuté à partir du CD</String>
565 <String Id="UITextSelAbsentLocal" Overridable="yes">Ce composant sera installé sur le disque dur local</String>
566 <String Id="UITextSelAbsentNetwork" Overridable="yes">Ce composant sera installé pour être exécuté à partir du réseau</String>
567 <String Id="UITextSelAdvertiseAbsent" Overridable="yes">Ce composant ne sera plus disponible</String>
568 <String Id="UITextSelAdvertiseAdvertise" Overridable="yes">Installation à la demande</String>
569 <String Id="UITextSelAdvertiseCD" Overridable="yes">Ce composant sera disponible pour être exécuté à partir du CD</String>
570 <String Id="UITextSelAdvertiseLocal" Overridable="yes">Ce composant sera installé sur le disque dur local</String>
571 <String Id="UITextSelAdvertiseNetwork" Overridable="yes">Ce composant sera disponible pour être exécuté à partir du réseau</String>
572 <String Id="UITextSelCDAbsent" Overridable="yes">Ce composant sera désinstallé en totalité et ne pourra plus être exécuté à partir du CD</String>
573 <String Id="UITextSelCDAdvertise" Overridable="yes">Ce composant ne pourra plus être exécuté à partir du CD et sera configuré pour être installé à la demande</String>
574 <String Id="UITextSelCDCD" Overridable="yes">Ce composant pourra encore être exécuté à partir du CD</String>
575 <String Id="UITextSelCDLocal" Overridable="yes">Ce composant ne pourra plus être exécuté à partir du CD et sera installé sur le disque dur local</String>
576 <String Id="UITextSelChildCostNeg" Overridable="yes">Ce composant libère [1] sur votre disque dur.</String>
577 <String Id="UITextSelChildCostPos" Overridable="yes">Ce composant requiert [1] sur votre disque dur.</String>
578 <String Id="UITextSelCostPending" Overridable="yes">Calcul de l'espace nécessaire pour ce composant...</String>
579 <String Id="UITextSelLocalAbsent" Overridable="yes">Ce composant sera supprimé en totalité</String>
580 <String Id="UITextSelLocalAdvertise" Overridable="yes">Ce composant sera supprimé du disque dur local, mais sera configuré pour être installé à la demande</String>
581 <String Id="UITextSelLocalCD" Overridable="yes">Ce composant sera supprimé du disque dur local, mais pourra encore être exécuté à partir du CD</String>
582 <String Id="UITextSelLocalLocal" Overridable="yes">Ce composant sera conservé sur le disque dur local</String>
583 <String Id="UITextSelLocalNetwork" Overridable="yes">Ce composant sera supprimé du disque dur local, mais pourra être exécuté à partir du réseau</String>
584 <String Id="UITextSelNetworkAbsent" Overridable="yes">Ce composant sera désinstallé en totalité et ne pourra plus être exécuté à partir du réseau</String>
585 <String Id="UITextSelNetworkAdvertise" Overridable="yes">Ce composant ne pourra plus être exécuté à partir du réseau et sera configuré pour être installé à la demande</String>
586 <String Id="UITextSelNetworkLocal" Overridable="yes">Ce composant ne pourra plus être exécuté à partir du réseau et sera installé sur le disque dur local</String>
587 <String Id="UITextSelNetworkNetwork" Overridable="yes">Ce composant pourra encore être exécuté à partir du réseau</String>
588 <String Id="UITextSelParentCostNegNeg" Overridable="yes">Ce composant libère [1] sur votre disque dur. [2] de ses [3] sous-composants sont sélectionnés. Les sous-composants libèrent [4] sur votre disque dur.</String>
589 <String Id="UITextSelParentCostNegPos" Overridable="yes">Ce composant libère [1] sur votre disque dur. [2] de ses [3] sous-composants sont sélectionnés. Les sous-composants requièrent [4] sur votre disque dur.</String>
590 <String Id="UITextSelParentCostPosNeg" Overridable="yes">Ce composant requiert [1] sur votre disque dur. [2] de ses [3] sous-composants sont sélectionnés. Les sous-composants libèrent [4] sur votre disque dur.</String>
591 <String Id="UITextSelParentCostPosPos" Overridable="yes">Ce composant requiert [1] sur votre disque dur. [2] de ses [3] sous-composants sont sélectionnés. Les sous-composants requièrent [4] sur votre disque dur.</String>
592 <String Id="UITextTimeRemaining" Overridable="yes">Durée restante : {[1] minute(s) }{[2] seconde(s)}</String>
593 <String Id="UITextVolumeCostAvailable" Overridable="yes">Disponible</String>
594 <String Id="UITextVolumeCostDifference" Overridable="yes">Différence</String>
595 <String Id="UITextVolumeCostRequired" Overridable="yes">Nécessaire</String>
596 <String Id="UITextVolumeCostSize" Overridable="yes">Taille du disque</String>
597 <String Id="UITextVolumeCostVolume" Overridable="yes">Volume</String>
598</WixLocalization>
diff --git a/src/ext/UI/wixlib/WixUI_he-IL.wxl b/src/ext/UI/wixlib/WixUI_he-IL.wxl
new file mode 100644
index 00000000..86049cb2
--- /dev/null
+++ b/src/ext/UI/wixlib/WixUI_he-IL.wxl
@@ -0,0 +1,598 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3
4
5<WixLocalization Culture="he-il" Codepage="1255" xmlns="http://wixtoolset.org/schemas/v4/wxl">
6 <String Id="WixUIBack" Overridable="yes">ה&amp;קודם</String>
7 <String Id="WixUINext" Overridable="yes">ה&amp;בא</String>
8 <String Id="WixUICancel" Overridable="yes">ביטול</String>
9 <String Id="WixUIFinish" Overridable="yes">&amp;סיום</String>
10 <String Id="WixUIRetry" Overridable="yes">&amp;נסה שוב</String>
11 <String Id="WixUIIgnore" Overridable="yes">ה&amp;תעלם</String>
12 <String Id="WixUIYes" Overridable="yes">&amp;כן</String>
13 <String Id="WixUINo" Overridable="yes">&amp;לא</String>
14 <String Id="WixUIOK" Overridable="yes">אישור</String>
15 <String Id="WixUIPrint" Overridable="yes">הדפ&amp;ס</String>
16
17 <String Id="AdvancedWelcomeEulaDlg_Title" Overridable="yes">תוכנית ההתקנה של [ProductName]</String>
18 <String Id="AdvancedWelcomeEulaDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
19 <String Id="AdvancedWelcomeEulaDlgTitle" Overridable="yes">{\WixUI_Font_Title}קרא את הסכם הרשיון של [ProductName]</String>
20 <String Id="AdvancedWelcomeEulaDlgLicenseAcceptedCheckBox" Overridable="yes">אני &amp;מקבל את תנאי הסכם הרשיון</String>
21 <String Id="AdvancedWelcomeEulaDlgDescriptionPerMachine" Overridable="yes">לחץ על 'התקן' כדי להתקין את המוצר עם אפשרויות ברירת מחדל עבור כל המשתמשים. לחץ על 'מתקדם' כדי לשנות אפשרויות התקנה.</String>
22 <String Id="AdvancedWelcomeEulaDlgDescriptionPerUser" Overridable="yes">לחץ על 'התקן' כדי להתקין את המוצר עם אפשרויות ברירת מחדל עבורך בלבד. לחץ על 'מתקדם' כדי לשנות אפשרויות התקנה.</String>
23 <String Id="AdvancedWelcomeEulaDlgInstall" Overridable="yes">ה&amp;תקן</String>
24 <String Id="AdvancedWelcomeEulaDlgAdvanced" Overridable="yes">&amp;מתקדם</String>
25 <String Id="Advanced_Font_Normal_Size" Overridable="yes">8</String>
26 <String Id="Advanced_Font_Bigger_Size" Overridable="yes">12</String>
27 <String Id="Advanced_Font_Title_Size" Overridable="yes">9</String>
28 <String Id="Advanced_Font_Emphasized_Size" Overridable="yes">8</String>
29 <String Id="Advanced_Font_FaceName" Overridable="yes">Times New Roman</String>
30
31 <String Id="BrowseDlg_Title" Overridable="yes">תוכנית ההתקנה של [ProductName]</String>
32 <String Id="BrowseDlgComboLabel" Overridable="yes">&amp;חפש ב:</String>
33 <String Id="BrowseDlgWixUI_Bmp_Up" Overridable="yes">WixUI_Bmp_Up</String>
34 <String Id="BrowseDlgWixUI_Bmp_UpTooltip" Overridable="yes">רמה אחת למעלה</String>
35 <String Id="BrowseDlgNewFolder" Overridable="yes">WixUI_Bmp_New</String>
36 <String Id="BrowseDlgNewFolderTooltip" Overridable="yes">צור תיקיה חדשה</String>
37 <String Id="BrowseDlgPathLabel" Overridable="yes">&amp;שם תיקיה:</String>
38 <String Id="BrowseDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
39 <String Id="BrowseDlgDescription" Overridable="yes">עבור אל תיקיית היעד</String>
40 <String Id="BrowseDlgTitle" Overridable="yes">{\WixUI_Font_Title}שינוי תיקיית יעד</String>
41
42 <String Id="CancelDlg_Title" Overridable="yes">תוכנית ההתקנה של [ProductName]</String>
43 <String Id="CancelDlgText" Overridable="yes">האם אתה בטוח שברצונך לבטל את ההתקנה של [ProductName]?</String>
44 <String Id="CancelDlgIcon" Overridable="yes">WixUI_Ico_Info</String>
45 <String Id="CancelDlgIconTooltip" Overridable="yes">סמל מידע</String>
46
47 <String Id="CustomizeDlg_Title" Overridable="yes">תוכנית ההתקנה של [ProductName]</String>
48 <String Id="CustomizeDlgTree" Overridable="yes">עץ בחירות</String>
49 <String Id="CustomizeDlgBrowse" Overridable="yes">&amp;עיון...</String>
50 <String Id="CustomizeDlgReset" Overridable="yes">אי&amp;פוס</String>
51 <String Id="CustomizeDlgDiskCost" Overridable="yes">&amp;שימוש בדיסק</String>
52 <String Id="CustomizeDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
53 <String Id="CustomizeDlgText" Overridable="yes">לחץ על הסמלים בעץ להלן כדי לשנות את אופן ההתקנה של תכונות.</String>
54 <String Id="CustomizeDlgDescription" Overridable="yes">בחר כיצד ברצונך להתקין את התכונות.</String>
55 <String Id="CustomizeDlgTitle" Overridable="yes">{\WixUI_Font_Title}התקנה מותאמת אישית</String>
56 <String Id="CustomizeDlgItemDescription" Overridable="yes">CustomizeDlgItemDescription-CustomizeDlgItemDescription</String>
57 <String Id="CustomizeDlgItemSize" Overridable="yes">CustomizeDlgItemSize-CustomizeDlgItemSize</String>
58 <String Id="CustomizeDlgLocation" Overridable="yes">CustomizeDlgLocation-CustomizeDlgLocation</String>
59 <String Id="CustomizeDlgLocationLabel" Overridable="yes">מיקום:</String>
60
61 <String Id="DiskCostDlg_Title" Overridable="yes">תוכנית ההתקנה של [ProductName]</String>
62 <String Id="DiskCostDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
63 <String Id="DiskCostDlgText" Overridable="yes">באמצעי האחסון המסומנים אין די שטח דיסק זמין עבור התכונות שנבחרו. באפשרותך להסיר חלק מהקבצים מאמצעי האחסון המסומנים, להתקין פחות תכונות או לבחור כונני יעד אחרים.</String>
64 <String Id="DiskCostDlgDescription" Overridable="yes">שטח הדיסק הנדרש להתקנת התכונות שנבחרו.</String>
65 <String Id="DiskCostDlgTitle" Overridable="yes">{\WixUI_Font_Title}דרישות שטח דיסק</String>
66 <String Id="DiskCostDlgVolumeList" Overridable="yes">{120}{70}{70}{70}{70}</String>
67
68 <String Id="ErrorDlg_Title" Overridable="yes">תוכנית ההתקנה של [ProductName]</String>
69 <String Id="ErrorDlgErrorText" Overridable="yes">טקסט מידע</String>
70 <String Id="ErrorDlgErrorIcon" Overridable="yes">WixUI_Ico_Info</String>
71 <String Id="ErrorDlgErrorIconTooltip" Overridable="yes">סמל מידע</String>
72
73 <String Id="ExitDialog_Title" Overridable="yes">תוכנית ההתקנה של [ProductName]</String>
74 <String Id="ExitDialogBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
75 <String Id="ExitDialogDescription" Overridable="yes">לחץ על לחצן 'סיום' כדי לצאת מאשף ההתקנה.</String>
76 <String Id="ExitDialogTitle" Overridable="yes">{\WixUI_Font_Bigger}פעולתו של אשף ההתקנה של [ProductName] הושלמה</String>
77
78 <String Id="FatalError_Title" Overridable="yes">תוכנית ההתקנה של [ProductName]</String>
79 <String Id="FatalErrorBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
80 <String Id="FatalErrorTitle" Overridable="yes">{\WixUI_Font_Bigger}פעולתו של אשף ההתקנה של [ProductName] הסתיימה מוקדם מהצפוי</String>
81 <String Id="FatalErrorDescription1" Overridable="yes">פעולתו של אשף ההתקנה של [ProductName] הסתיימה מוקדם מהצפוי עקב שגיאה. המערכת שלך לא השתנתה. כדי להתקין תוכנית זו במועד מאוחר יותר, הפעל שוב את אשף ההתקנה.</String>
82 <String Id="FatalErrorDescription2" Overridable="yes">לחץ על לחצן 'סיום' כדי לצאת מאשף ההתקנה.</String>
83
84 <String Id="FeaturesDlg_Title" Overridable="yes">תוכנית ההתקנה של [ProductName]</String>
85 <String Id="FeaturesDlgTree" Overridable="yes">תכונות מוצר</String>
86 <String Id="FeaturesDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
87 <String Id="FeaturesDlgDescription" Overridable="yes">בחר כיצד ברצונך להתקין את התכונות.</String>
88 <String Id="FeaturesDlgTitle" Overridable="yes">{\WixUI_Font_Title}תכונות מוצר</String>
89 <String Id="FeaturesDlgItemDescription" Overridable="yes">FeaturesDlgItemDescription</String>
90 <String Id="FeaturesDlgItemSize" Overridable="yes">FeaturesDlgItemSize</String>
91 <String Id="FeaturesDlgInstall" Overridable="yes">ה&amp;תקן</String>
92 <String Id="FeaturesDlgChange" Overridable="yes">&amp;שנה</String>
93
94 <String Id="FilesInUse_Title" Overridable="yes">תוכנית ההתקנה של [ProductName]</String>
95 <String Id="FilesInUseExit" Overridable="yes">י&amp;ציאה</String>
96 <String Id="FilesInUseBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
97 <String Id="FilesInUseText" Overridable="yes">היישומים הבאים עושים שימוש בקבצים שתוכנית התקנה זו חייבת לעדכן. סגור יישומים אלה ולאחר מכן לחץ על '&amp;נסה שוב' כדי להמשיך בהתקנה, או על 'יציאה' כדי לצאת ממנה.</String>
98 <String Id="FilesInUseDescription" Overridable="yes">חלק מהקבצים שיש לעדכן נמצאים כעת בשימוש.</String>
99 <String Id="FilesInUseTitle" Overridable="yes">{\WixUI_Font_Title}קבצים בשימוש</String>
100
101 <String Id="InstallDirDlg_Title" Overridable="yes">תוכנית ההתקנה של [ProductName]</String>
102 <String Id="InstallDirDlgChange" Overridable="yes">&amp;שינוי...</String>
103 <String Id="InstallDirDlgTitle" Overridable="yes">{\WixUI_Font_Title}תיקיית יעד</String>
104 <String Id="InstallDirDlgDescription" Overridable="yes">לחץ על 'הבא' כדי להתקין את תיקיית ברירת המחדל או לחץ על 'שנה' כדי לבחור תיקיה אחרת.</String>
105 <String Id="InstallDirDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
106 <String Id="InstallDirDlgFolderLabel" Overridable="yes">התקן את [ProductName] ב:</String>
107
108 <String Id="InstallScopeDlg_Title" Overridable="yes">תוכנית ההתקנה של [ProductName]</String>
109 <String Id="InstallScopeDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
110 <String Id="InstallScopeDlgDescription" Overridable="yes">בחר את הטווח והתיקיה להתקנה</String>
111 <String Id="InstallScopeDlgTitle" Overridable="yes">{\WixUI_Font_Title}טווח התקנה</String>
112 <String Id="InstallScopeDlgPerUser" Overridable="yes">{\WixUI_Font_Emphasized}התקן &amp;רק עבורך ([LogonUser])</String>
113 <String Id="InstallScopeDlgPerUserDescription" Overridable="yes">[ProductName] יותקן בתיקיה לפי משתמש ויהיה זמין רק עבור חשבון המשתמש שלך. אינך זקוק להרשאות מקומיות של מנהל מערכת.</String>
114 <String Id="InstallScopeDlgNoPerUserDescription" Overridable="yes">[ProductName] אינו תומך בהתקנה לפי משתמש.</String>
115 <String Id="InstallScopeDlgPerMachine" Overridable="yes">{\WixUI_Font_Emphasized}התקן עבור כל משתמשי &amp;מחשב זה</String>
116 <String Id="InstallScopeDlgPerMachineDescription" Overridable="yes">[ProductName] יותקן בתיקיה לפי מחשב כברירת מחדל ויהיה זמין עבור כל המשתמשים. באפשרותך לשנות את תיקיית היעד המהווה ברירת מחדל. יש צורך בהרשאות מקומיות של מנהל מערכת.</String>
117 <String Id="InstallScopeDlgFolderLabel" Overridable="yes">תיקיית &amp;התקנה:</String>
118 <String Id="InstallScopeDlgChange" Overridable="yes">&amp;שינוי...</String>
119
120 <String Id="InvalidDirDlg_Title" Overridable="yes">תוכנית ההתקנה של [ProductName]</String>
121 <String Id="InvalidDirDlgText" Overridable="yes">ספריית ההתקנה חייבת להימצא בכונן קשיח מקומי.</String>
122 <String Id="InvalidDirDlgIcon" Overridable="yes">WixUI_Ico_Info</String>
123 <String Id="InvalidDirDlgIconTooltip" Overridable="yes">סמל מידע</String>
124
125 <String Id="LicenseAgreementDlg_Title" Overridable="yes">תוכנית ההתקנה של [ProductName]</String>
126 <String Id="LicenseAgreementDlgLicenseAcceptedCheckBox" Overridable="yes">אני &amp;מקבל את תנאי הסכם הרשיון</String>
127 <String Id="LicenseAgreementDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
128 <String Id="LicenseAgreementDlgDescription" Overridable="yes">קרא בעיון את הסכם הרשיון שלהלן</String>
129 <String Id="LicenseAgreementDlgTitle" Overridable="yes">{\WixUI_Font_Title}הסכם רשיון למשתמש קצה</String>
130
131 <String Id="MaintenanceTypeDlg_Title" Overridable="yes">תוכנית ההתקנה של [ProductName]</String>
132 <String Id="MaintenanceTypeDlgChangeButton" Overridable="yes">&amp;שנה</String>
133 <String Id="MaintenanceTypeDlgChangeButtonTooltip" Overridable="yes">שנה התקנה</String>
134 <String Id="MaintenanceTypeDlgRepairButton" Overridable="yes">&amp;תקן</String>
135 <String Id="MaintenanceTypeDlgRepairButtonTooltip" Overridable="yes">תקן התקנה</String>
136 <String Id="MaintenanceTypeDlgRemoveButton" Overridable="yes">ה&amp;סר</String>
137 <String Id="MaintenanceTypeDlgRemoveButtonTooltip" Overridable="yes">הסר התקנה</String>
138 <String Id="MaintenanceTypeDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
139 <String Id="MaintenanceTypeDlgDescription" Overridable="yes">בחר את הפעולה שברצונך לבצע.</String>
140 <String Id="MaintenanceTypeDlgTitle" Overridable="yes">{\WixUI_Font_Title}שינוי, תיקון או הסרה של ההתקנה</String>
141 <String Id="MaintenanceTypeDlgChangeText" Overridable="yes">מתן אפשרות לשינוי אופן ההתקנה של תכונות.</String>
142 <String Id="MaintenanceTypeDlgChangeDisabledText" Overridable="yes">ל- [ProductName] אין תכונות הניתנות לבחירה באופן עצמאי.</String>
143 <String Id="MaintenanceTypeDlgRemoveText" Overridable="yes">הסרת [ProductName] מהמחשב.</String>
144 <String Id="MaintenanceTypeDlgRemoveDisabledText" Overridable="yes">אין אפשרות להסיר את [ProductName].</String>
145 <String Id="MaintenanceTypeDlgRepairText" Overridable="yes">תיקון שגיאות בהתקנה האחרונה על-ידי תיקון קבצים, קיצורי דרך וערכי רישום חסרים ופגומים.</String>
146 <String Id="MaintenanceTypeDlgRepairDisabledText" Overridable="yes">אין אפשרות לתקן את [ProductName].</String>
147
148 <String Id="MaintenanceWelcomeDlg_Title" Overridable="yes">תוכנית ההתקנה של [ProductName]</String>
149 <String Id="MaintenanceWelcomeDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
150 <String Id="MaintenanceWelcomeDlgDescription" Overridable="yes">אשף ההתקנה מאפשר לך לשנות את אופן ההתקנה של התכונות של [ProductName] במחשב או להסיר מוצר זה מהמחשב. לחץ על 'הבא' כדי להמשיך או על 'ביטול' כדי לצאת מאשף ההתקנה.</String>
151 <String Id="MaintenanceWelcomeDlgTitle" Overridable="yes">{\WixUI_Font_Bigger}ברוך הבא אל אשף ההתקנה של [ProductName]</String>
152
153 <String Id="MsiRMFilesInUse_Title" Overridable="yes">תוכנית ההתקנה של [ProductName]</String>
154 <String Id="MsiRMFilesInUseBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
155 <String Id="MsiRMFilesInUseText" Overridable="yes">היישומים הבאים משתמשים בקבצים שתוכנית התקנה זו צריכה לעדכן. באפשרותך לאפשר לאשף ההתקנה לסגור אותם ולנסות להפעיל אותם מחדש או לאתחל מחדש את המחשב מאוחר יותר.</String>
156 <String Id="MsiRMFilesInUseDescription" Overridable="yes">חלק מהקבצים שיש לעדכן נמצאים כעת בשימוש.</String>
157 <String Id="MsiRMFilesInUseTitle" Overridable="yes">{\WixUI_Font_Title}קבצים בשימוש</String>
158 <String Id="MsiRMFilesInUseUseRM" Overridable="yes">&amp;סגור את היישומים ונסה להפעיל אותם מחדש.</String>
159 <String Id="MsiRMFilesInUseDontUseRM" Overridable="yes">&amp;אל תסגור את היישומים. יידרש אתחול מחדש.</String>
160
161 <String Id="OutOfDiskDlg_Title" Overridable="yes">תוכנית ההתקנה של [ProductName]</String>
162 <String Id="OutOfDiskDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
163 <String Id="OutOfDiskDlgText" Overridable="yes">באמצעי האחסון המסומנים אין די שטח דיסק זמין עבור התכונות הנוכחיות שנבחרו. באפשרותך להסיר קבצים מסוימים מאמצעי האחסון המסומנים, להתקין פחות תכונות או לבחור כונן יעד אחר.</String>
164 <String Id="OutOfDiskDlgDescription" Overridable="yes">שטח הדיסק הנדרש עבור ההתקנה חורג משטח הדיסק הזמין.</String>
165 <String Id="OutOfDiskDlgTitle" Overridable="yes">{\WixUI_Font_Title}אזל השטח בדיסק</String>
166 <String Id="OutOfDiskDlgVolumeList" Overridable="yes">{120}{70}{70}{70}{70}</String>
167
168 <String Id="OutOfRbDiskDlg_Title" Overridable="yes">תוכנית ההתקנה של [ProductName]</String>
169 <String Id="OutOfRbDiskDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
170 <String Id="OutOfRbDiskDlgText" Overridable="yes">באמצעי האחסון המסומנים אין די שטח דיסק זמין עבור התכונות הנוכחיות שנבחרו. באפשרותך להסיר קבצים מסוימים מאמצעי האחסון המסומנים, להתקין פחות תכונות או לבחור כונן יעד אחר.</String>
171 <String Id="OutOfRbDiskDlgDescription" Overridable="yes">שטח הדיסק הנדרש עבור ההתקנה חורג משטח הדיסק הזמין.</String>
172 <String Id="OutOfRbDiskDlgTitle" Overridable="yes">{\WixUI_Font_Title}אזל השטח בדיסק</String>
173 <String Id="OutOfRbDiskDlgVolumeList" Overridable="yes">{120}{70}{70}{70}{70}</String>
174 <String Id="OutOfRbDiskDlgText2" Overridable="yes">לחלופין, תוכל לבחור להפוך ללא זמינה את פונקציונליות ההחזרה למצב קודם של המתקין. הפיכת ההחזרה למצב קודם ללא זמינה מונעת מהמתקין לשחזר את המצב המקורי של המחשב במקרה שההתקנה מופסקת בצורה כלשהי. לחץ על 'כן' אם ברצונך לקחת את הסיכון של הפיכת ההחזרה למצב קודם ללא זמינה.</String>
175
176 <String Id="PrepareDlg_Title" Overridable="yes">תוכנית ההתקנה של [ProductName]</String>
177 <String Id="PrepareDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
178 <String Id="PrepareDlgDescription" Overridable="yes">נא המתן בעת שאשף ההתקנה מתכונן להנחות אותך בתהליך ההתקנה.</String>
179 <String Id="PrepareDlgTitle" Overridable="yes">{\WixUI_Font_Bigger}ברוך הבא אל אשף ההתקנה של [ProductName]</String>
180
181 <String Id="ProgressDlg_Title" Overridable="yes">תוכנית ההתקנה של [ProductName]</String>
182 <String Id="ProgressDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
183 <String Id="ProgressDlgTextInstalling" Overridable="yes">נא המתן בזמן שאשף ההתקנה מתקין את [ProductName].</String>
184 <String Id="ProgressDlgTitleInstalling" Overridable="yes">{\WixUI_Font_Title}התקנת [ProductName]</String>
185 <String Id="ProgressDlgTextChanging" Overridable="yes">נא המתן בזמן שאשף ההתקנה משנה את [ProductName].</String>
186 <String Id="ProgressDlgTitleChanging" Overridable="yes">{\WixUI_Font_Title}שינוי [ProductName]</String>
187 <String Id="ProgressDlgTextRepairing" Overridable="yes">נא המתן בזמן שאשף ההתקנה מתקן את [ProductName].</String>
188 <String Id="ProgressDlgTitleRepairing" Overridable="yes">{\WixUI_Font_Title}תיקון [ProductName]</String>
189 <String Id="ProgressDlgTextRemoving" Overridable="yes">נא המתן בזמן שאשף ההתקנה מסיר את [ProductName].</String>
190 <String Id="ProgressDlgTitleRemoving" Overridable="yes">{\WixUI_Font_Title}הסרת [ProductName]</String>
191 <String Id="ProgressDlgTextUpdating" Overridable="yes">נא המתן בזמן שאשף ההתקנה מעדכן את [ProductName].</String>
192 <String Id="ProgressDlgTitleUpdating" Overridable="yes">{\WixUI_Font_Title}עדכון [ProductName]</String>
193 <String Id="ProgressDlgProgressBar" Overridable="yes">ההתקדמות הסתיימה</String>
194 <String Id="ProgressDlgStatusLabel" Overridable="yes">מצב:</String>
195
196 <String Id="ResumeDlg_Title" Overridable="yes">תוכנית ההתקנה של [ProductName]</String>
197 <String Id="ResumeDlgInstall" Overridable="yes">ה&amp;תקן</String>
198 <String Id="ResumeDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
199 <String Id="ResumeDlgDescription" Overridable="yes">אשף ההתקנה ישלים את התקנת [ProductName] במחשב שלך. לחץ על 'התקן' כדי להמשיך, או על 'ביטול' כדי לצאת מאשף ההתקנה.</String>
200 <String Id="ResumeDlgTitle" Overridable="yes">{\WixUI_Font_Bigger}חידוש פעולתו של אשף ההתקנה של [ProductName]</String>
201
202 <String Id="SetupTypeDlg_Title" Overridable="yes">תוכנית ההתקנה של [ProductName]</String>
203 <String Id="SetupTypeDlgTypicalButton" Overridable="yes">&amp;רגילה</String>
204 <String Id="SetupTypeDlgTypicalButtonTooltip" Overridable="yes">התקנה רגילה</String>
205 <String Id="SetupTypeDlgCustomButton" Overridable="yes">מ&amp;ותאמת אישית</String>
206 <String Id="SetupTypeDlgCustomButtonTooltip" Overridable="yes">התקנה מותאמת אישית</String>
207 <String Id="SetupTypeDlgCompleteButton" Overridable="yes">מ&amp;לאה</String>
208 <String Id="SetupTypeDlgCompleteButtonTooltip" Overridable="yes">התקנה מלאה</String>
209 <String Id="SetupTypeDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
210 <String Id="SetupTypeDlgTitle" Overridable="yes">{\WixUI_Font_Title}בחירת סוג התקנה</String>
211 <String Id="SetupTypeDlgDescription" Overridable="yes">בחר בסוג ההתקנה שמתאים ביותר לצרכיך</String>
212 <String Id="SetupTypeDlgTypicalText" Overridable="yes">התקנת תכונות התוכנית הנפוצות ביותר. מומלץ עבור מרבית המשתמשים.</String>
213 <String Id="SetupTypeDlgCustomText" Overridable="yes">מתן אפשרות למשתמשים לבחור אילו תכונות תוכנית יותקנו והיכן הן יותקנו. מומלץ עבור משתמשים מתקדמים.</String>
214 <String Id="SetupTypeDlgCompleteText" Overridable="yes">כל תכונות התוכנית יותקנו. האפשרות דורשת את שטח הדיסק הרב ביותר.</String>
215
216 <String Id="UserExit_Title" Overridable="yes">תוכנית ההתקנה של [ProductName]</String>
217 <String Id="UserExitBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
218 <String Id="UserExitTitle" Overridable="yes">{\WixUI_Font_Bigger}פעולתו של אשף ההתקנה של [ProductName] הופסקה</String>
219 <String Id="UserExitDescription1" Overridable="yes">התקנת [ProductName] הופסקה. המערכת שלך לא השתנתה. כדי להתקין תוכנית זו במועד מאוחר יותר, הפעל שוב את ההתקנה.</String>
220 <String Id="UserExitDescription2" Overridable="yes">לחץ על לחצן 'סיום' כדי לצאת מאשף ההתקנה.</String>
221
222 <String Id="VerifyReadyDlg_Title" Overridable="yes">תוכנית ההתקנה של [ProductName]</String>
223 <String Id="VerifyReadyDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
224 <String Id="VerifyReadyDlgInstall" Overridable="yes">ה&amp;תקן</String>
225 <String Id="VerifyReadyDlgInstallText" Overridable="yes">לחץ על 'התקן' כדי להתחיל בהתקנה. לחץ על 'הקודם' כדי לסקור או לשנות הגדרה כלשהי מהגדרות ההתקנה. לחץ על 'ביטול' כדי לצאת מהאשף.</String>
226 <String Id="VerifyReadyDlgInstallTitle" Overridable="yes">{\WixUI_Font_Title}מוכן להתקנת [ProductName]</String>
227 <String Id="VerifyReadyDlgChange" Overridable="yes">&amp;שנה</String>
228 <String Id="VerifyReadyDlgChangeText" Overridable="yes">לחץ על 'שנה' כדי להתחיל בהתקנה. לחץ על 'הקודם' כדי לסקור או לשנות הגדרה כלשהי מהגדרות ההתקנה. לחץ על 'ביטול' כדי לצאת מהאשף.</String>
229 <String Id="VerifyReadyDlgChangeTitle" Overridable="yes">{\WixUI_Font_Title}מוכן לשינוי [ProductName]</String>
230 <String Id="VerifyReadyDlgRepair" Overridable="yes">&amp;תקן</String>
231 <String Id="VerifyReadyDlgRepairText" Overridable="yes">לחץ על 'תקן' כדי לתקן את ההתקנה של [ProductName]. לחץ על 'הקודם' כדי לסקור או לשנות הגדרה כלשהי מהגדרות ההתקנה. לחץ על 'ביטול' כדי לצאת מהאשף.</String>
232 <String Id="VerifyReadyDlgRepairTitle" Overridable="yes">{\WixUI_Font_Title}מוכן לתיקון [ProductName]</String>
233 <String Id="VerifyReadyDlgRemove" Overridable="yes">ה&amp;סר</String>
234 <String Id="VerifyReadyDlgRemoveText" Overridable="yes">לחץ על 'הסר' כדי להסיר את [ProductName] מהמחשב. לחץ על 'הקודם' כדי לסקור או לשנות הגדרה כלשהי מהגדרות ההתקנה. לחץ על 'ביטול' כדי לצאת מהאשף.</String>
235 <String Id="VerifyReadyDlgRemoveTitle" Overridable="yes">{\WixUI_Font_Title}מוכן להסרת [ProductName]</String>
236 <String Id="VerifyReadyDlgUpdate" Overridable="yes">&amp;עדכן</String>
237 <String Id="VerifyReadyDlgUpdateText" Overridable="yes">לחץ על 'עדכן' כדי לעדכן את [ProductName] במחשב. לחץ על 'הקודם' כדי לסקור או לשנות הגדרה כלשהי מהגדרות ההתקנה. לחץ על 'ביטול' כדי לצאת מהאשף.</String>
238 <String Id="VerifyReadyDlgUpdateTitle" Overridable="yes">{\WixUI_Font_Title}מוכן לעדכון [ProductName]</String>
239
240 <String Id="WaitForCostingDlg_Title" Overridable="yes">תוכנית ההתקנה של [ProductName]</String>
241 <String Id="WaitForCostingDlgReturn" Overridable="yes">&amp;חזור</String>
242 <String Id="WaitForCostingDlgText" Overridable="yes">נא המתן בזמן שהמתקין מסיים להגדיר את דרישות שטח הדיסק שלך.</String>
243 <String Id="WaitForCostingDlgIcon" Overridable="yes">WixUI_Ico_Exclam</String>
244 <String Id="WaitForCostingDlgIconTooltip" Overridable="yes">סמל של סימן קריאה</String>
245
246 <String Id="WelcomeDlg_Title" Overridable="yes">תוכנית ההתקנה של [ProductName]</String>
247 <String Id="WelcomeDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
248 <String Id="WelcomeDlgDescription" Overridable="yes">אשף ההתקנה יתקין את [ProductName] במחשב שלך. לחץ על 'הבא' כדי להמשיך או על 'ביטול' כדי לצאת מאשף ההתקנה.</String>
249 <String Id="WelcomeUpdateDlgDescriptionUpdate" Overridable="yes">אשף ההתקנה יעדכן את [ProductName] במחשב. לחץ על 'הבא' כדי להמשיך או על 'ביטול' כדי לצאת מאשף ההתקנה.</String>
250 <String Id="WelcomeDlgTitle" Overridable="yes">{\WixUI_Font_Bigger}ברוך הבא אל אשף ההתקנה של [ProductName]</String>
251
252 <String Id="WelcomeEulaDlg_Title" Overridable="yes">תוכנית ההתקנה של [ProductName]</String>
253 <String Id="WelcomeEulaDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
254 <String Id="WelcomeEulaDlgLicenseAcceptedCheckBox" Overridable="yes">אני &amp;מקבל את תנאי הסכם הרשיון</String>
255 <String Id="WelcomeEulaDlgInstall" Overridable="yes">ה&amp;תקן</String>
256 <String Id="WelcomeEulaDlgUpdate" Overridable="yes">&amp;עדכן</String>
257 <String Id="WelcomeEulaDlgTitle" Overridable="yes">{\WixUI_Font_Title}קרא את הסכם הרשיון של [ProductName]</String>
258
259 <String Id="ProgressTextInstallValidate" Overridable="yes">מאמת התקנה</String>
260 <String Id="ProgressTextInstallFiles" Overridable="yes">מעתיק קבצים חדשים</String>
261 <String Id="ProgressTextInstallFilesTemplate" Overridable="yes">קובץ: [1], ספריה: [9], גודל: [6]</String>
262 <String Id="ProgressTextInstallAdminPackage" Overridable="yes">מעתיק קבצי התקנה ברשת</String>
263 <String Id="ProgressTextInstallAdminPackageTemplate" Overridable="yes">קובץ: [1], ספריה: [9], גודל: [6]</String>
264 <String Id="ProgressTextFileCost" Overridable="yes">מחשב דרישות שטח</String>
265 <String Id="ProgressTextCostInitialize" Overridable="yes">מחשב דרישות שטח</String>
266 <String Id="ProgressTextCostFinalize" Overridable="yes">מחשב דרישות שטח</String>
267 <String Id="ProgressTextCreateShortcuts" Overridable="yes">יוצר קיצורי דרך</String>
268 <String Id="ProgressTextCreateShortcutsTemplate" Overridable="yes">קיצור דרך: [1]</String>
269 <String Id="ProgressTextPublishComponents" Overridable="yes">מפרסם רכיבים העומדים בדרישות</String>
270 <String Id="ProgressTextPublishComponentsTemplate" Overridable="yes">מזהה רכיב: [1], מזהה: [2]</String>
271 <String Id="ProgressTextPublishFeatures" Overridable="yes">מפרסם תכונות מוצר</String>
272 <String Id="ProgressTextPublishFeaturesTemplate" Overridable="yes">תכונה: [1]</String>
273 <String Id="ProgressTextPublishProduct" Overridable="yes">מפרסם מידע אודות המוצר</String>
274 <String Id="ProgressTextRegisterClassInfo" Overridable="yes">רושם שרתי מחלקה</String>
275 <String Id="ProgressTextRegisterClassInfoTemplate" Overridable="yes">מזהה מחלקה: [1]</String>
276 <String Id="ProgressTextRegisterExtensionInfo" Overridable="yes">רושם שרתי הרחבה</String>
277 <String Id="ProgressTextRegisterExtensionInfoTemplate" Overridable="yes">הרחבה: [1]</String>
278 <String Id="ProgressTextRegisterMIMEInfo" Overridable="yes">רושם מידע MIME</String>
279 <String Id="ProgressTextRegisterMIMEInfoTemplate" Overridable="yes">סוג תוכן MIME‏: [1], הרחבה: [2]</String>
280 <String Id="ProgressTextRegisterProgIdInfo" Overridable="yes">רושם מזהי תוכנית</String>
281 <String Id="ProgressTextRegisterProgIdInfoTemplate" Overridable="yes">ProgID:‏ [1]‎</String>
282 <String Id="ProgressTextAllocateRegistrySpace" Overridable="yes">מקצה שטח רישום</String>
283 <String Id="ProgressTextAllocateRegistrySpaceTemplate" Overridable="yes">שטח פנוי: [1]</String>
284 <String Id="ProgressTextAppSearch" Overridable="yes">מחפש יישומים מותקנים</String>
285 <String Id="ProgressTextAppSearchTemplate" Overridable="yes">מאפיין: [1], חתימה: [2]</String>
286 <String Id="ProgressTextBindImage" Overridable="yes">מאגד קבצי הפעלה</String>
287 <String Id="ProgressTextBindImageTemplate" Overridable="yes">קובץ: [1]</String>
288 <String Id="ProgressTextCCPSearch" Overridable="yes">מחפש מוצרים שעומדים בדרישות</String>
289 <String Id="ProgressTextCreateFolders" Overridable="yes">יוצר תיקיות</String>
290 <String Id="ProgressTextCreateFoldersTemplate" Overridable="yes">תיקיה: [1]</String>
291 <String Id="ProgressTextDeleteServices" Overridable="yes">מוחק שירותים</String>
292 <String Id="ProgressTextDeleteServicesTemplate" Overridable="yes">שירות: [1]</String>
293 <String Id="ProgressTextDuplicateFiles" Overridable="yes">יוצר קבצים כפולים</String>
294 <String Id="ProgressTextDuplicateFilesTemplate" Overridable="yes">קובץ: [1], ספריה: [9], גודל: [6]</String>
295 <String Id="ProgressTextFindRelatedProducts" Overridable="yes">מחפש יישומים קשורים</String>
296 <String Id="ProgressTextFindRelatedProductsTemplate" Overridable="yes">נמצא יישום: [1]</String>
297 <String Id="ProgressTextInstallODBC" Overridable="yes">מתקין רכיבי ODBC</String>
298 <String Id="ProgressTextInstallServices" Overridable="yes">מתקין שירותים חדשים</String>
299 <String Id="ProgressTextInstallServicesTemplate" Overridable="yes">שירות: [2]</String>
300 <String Id="ProgressTextLaunchConditions" Overridable="yes">מעריך תנאי הפעלה</String>
301 <String Id="ProgressTextMigrateFeatureStates" Overridable="yes">מעביר מצבי תכונות מיישומים קשורים</String>
302 <String Id="ProgressTextMigrateFeatureStatesTemplate" Overridable="yes">יישום: [1]</String>
303 <String Id="ProgressTextMoveFiles" Overridable="yes">מעביר קבצים</String>
304 <String Id="ProgressTextMoveFilesTemplate" Overridable="yes">קובץ: [1], ספריה: [9], גודל: [6]</String>
305 <String Id="ProgressTextPatchFiles" Overridable="yes">מתקן קבצים</String>
306 <String Id="ProgressTextPatchFilesTemplate" Overridable="yes">קובץ: [1], ספריה: [2], גודל: [3]</String>
307 <String Id="ProgressTextProcessComponents" Overridable="yes">מעדכן רישום רכיבים</String>
308 <String Id="ProgressTextRegisterComPlus" Overridable="yes">מבצע רישום יישומים ורכיבים של COM+‎</String>
309 <String Id="ProgressTextRegisterComPlusTemplate" Overridable="yes">AppId‏: [1], {{AppType‏: [2], משתמשים: [3], RSN‏: [4]}}</String>
310 <String Id="ProgressTextRegisterFonts" Overridable="yes">מבצע רישום גופנים</String>
311 <String Id="ProgressTextRegisterFontsTemplate" Overridable="yes">גופן: [1]</String>
312 <String Id="ProgressTextRegisterProduct" Overridable="yes">רושם מוצר</String>
313 <String Id="ProgressTextRegisterProductTemplate" Overridable="yes">[1]</String>
314 <String Id="ProgressTextRegisterTypeLibraries" Overridable="yes">רושם ספריות סוגים</String>
315 <String Id="ProgressTextRegisterTypeLibrariesTemplate" Overridable="yes">LibID:‏ [1]‎</String>
316 <String Id="ProgressTextRegisterUser" Overridable="yes">רושם משתמש</String>
317 <String Id="ProgressTextRegisterUserTemplate" Overridable="yes">[1]</String>
318 <String Id="ProgressTextRemoveDuplicateFiles" Overridable="yes">מסיר קבצים כפולים</String>
319 <String Id="ProgressTextRemoveDuplicateFilesTemplate" Overridable="yes">קובץ: [1], ספריה: [9]</String>
320 <String Id="ProgressTextRemoveEnvironmentStrings" Overridable="yes">מעדכן מחרוזות סביבה</String>
321 <String Id="ProgressTextRemoveEnvironmentStringsTemplate" Overridable="yes">שם: [1], ערך: [2], פעולה [3]</String>
322 <String Id="ProgressTextRemoveExistingProducts" Overridable="yes">מסיר יישומים</String>
323 <String Id="ProgressTextRemoveExistingProductsTemplate" Overridable="yes">יישום: [1], שורת פקודה: [2]</String>
324 <String Id="ProgressTextRemoveFiles" Overridable="yes">מסיר קבצים</String>
325 <String Id="ProgressTextRemoveFilesTemplate" Overridable="yes">קובץ: [1], ספריה: [9]</String>
326 <String Id="ProgressTextRemoveFolders" Overridable="yes">מסיר תיקיות</String>
327 <String Id="ProgressTextRemoveFoldersTemplate" Overridable="yes">תיקיה: [1]</String>
328 <String Id="ProgressTextRemoveIniValues" Overridable="yes">‏‏מסיר ערכים בקבצי INI</String>
329 <String Id="ProgressTextRemoveIniValuesTemplate" Overridable="yes">קובץ: [1], סעיף: [2], מפתח: [3], ערך: [4]</String>
330 <String Id="ProgressTextRemoveODBC" Overridable="yes">מסיר רכיבי ODBC</String>
331 <String Id="ProgressTextRemoveRegistryValues" Overridable="yes">מסיר ערכי רישום של המערכת</String>
332 <String Id="ProgressTextRemoveRegistryValuesTemplate" Overridable="yes">מפתח: [1], שם: [2]</String>
333 <String Id="ProgressTextRemoveShortcuts" Overridable="yes">מסיר קיצורי דרך</String>
334 <String Id="ProgressTextRemoveShortcutsTemplate" Overridable="yes">קיצור דרך: [1]</String>
335 <String Id="ProgressTextRMCCPSearch" Overridable="yes">מחפש מוצרים שעומדים בדרישות</String>
336 <String Id="ProgressTextSelfRegModules" Overridable="yes">רושם מודולים</String>
337 <String Id="ProgressTextSelfRegModulesTemplate" Overridable="yes">קובץ: [1], תיקיה: [2]</String>
338 <String Id="ProgressTextSelfUnregModules" Overridable="yes">מבטל רישום מודולים</String>
339 <String Id="ProgressTextSelfUnregModulesTemplate" Overridable="yes">קובץ: [1], תיקיה: [2]</String>
340 <String Id="ProgressTextSetODBCFolders" Overridable="yes">מאתחל ספריות ODBC</String>
341 <String Id="ProgressTextStartServices" Overridable="yes">מפעיל שירותים</String>
342 <String Id="ProgressTextStartServicesTemplate" Overridable="yes">שירות: [1]</String>
343 <String Id="ProgressTextStopServices" Overridable="yes">מפסיק שירותים</String>
344 <String Id="ProgressTextStopServicesTemplate" Overridable="yes">שירות: [1]</String>
345 <String Id="ProgressTextUnpublishComponents" Overridable="yes">מבטל פרסום של רכיבים העומדים בדרישות</String>
346 <String Id="ProgressTextUnpublishComponentsTemplate" Overridable="yes">מזהה רכיב: [1], מזהה: [2]</String>
347 <String Id="ProgressTextUnpublishFeatures" Overridable="yes">מבטל פרסום של תכונות מוצר</String>
348 <String Id="ProgressTextUnpublishFeaturesTemplate" Overridable="yes">תכונה: [1]</String>
349 <String Id="ProgressTextUnregisterClassInfo" Overridable="yes">מסיר רישום של שרתי מחלקה</String>
350 <String Id="ProgressTextUnregisterClassInfoTemplate" Overridable="yes">מזהה מחלקה: [1]</String>
351 <String Id="ProgressTextUnregisterComPlus" Overridable="yes">מבטל רישום יישומים ורכיבים של +COM</String>
352 <String Id="ProgressTextUnregisterComPlusTemplate" Overridable="yes">‏AppId‏: [1] {{AppType: ‏[2]‏}}</String>
353 <String Id="ProgressTextUnregisterExtensionInfo" Overridable="yes">מבטל רישום של שרתי הרחבה</String>
354 <String Id="ProgressTextUnregisterExtensionInfoTemplate" Overridable="yes">הרחבה: [1]</String>
355 <String Id="ProgressTextUnregisterFonts" Overridable="yes">מבטל רישום גופנים</String>
356 <String Id="ProgressTextUnregisterFontsTemplate" Overridable="yes">גופן: [1]</String>
357 <String Id="ProgressTextUnregisterMIMEInfo" Overridable="yes">מבטל רישום של מידע MIME</String>
358 <String Id="ProgressTextUnregisterMIMEInfoTemplate" Overridable="yes">סוג תוכן MIME‏: [1], הרחבה: [2]</String>
359 <String Id="ProgressTextUnregisterProgIdInfo" Overridable="yes">מבטל רישום של מזהי תוכנית</String>
360 <String Id="ProgressTextUnregisterProgIdInfoTemplate" Overridable="yes">ProgID:‏ [1]‎</String>
361 <String Id="ProgressTextUnregisterTypeLibraries" Overridable="yes">מבטל רישום של ספריות סוגים</String>
362 <String Id="ProgressTextUnregisterTypeLibrariesTemplate" Overridable="yes">LibID:‏ [1]‎</String>
363 <String Id="ProgressTextWriteEnvironmentStrings" Overridable="yes">מעדכן מחרוזות סביבה</String>
364 <String Id="ProgressTextWriteEnvironmentStringsTemplate" Overridable="yes">שם: [1], ערך: [2], פעולה [3]</String>
365 <String Id="ProgressTextWriteIniValues" Overridable="yes">כותב ערכים בקבצי INI</String>
366 <String Id="ProgressTextWriteIniValuesTemplate" Overridable="yes">קובץ: [1], סעיף: [2], מפתח: [3], ערך: [4]</String>
367 <String Id="ProgressTextWriteRegistryValues" Overridable="yes">כותב ערכי רישום של המערכת</String>
368 <String Id="ProgressTextWriteRegistryValuesTemplate" Overridable="yes">מפתח: [1], שם: [2], ערך: [3]</String>
369 <String Id="ProgressTextAdvertise" Overridable="yes">מפרסם יישום</String>
370 <String Id="ProgressTextGenerateScript" Overridable="yes">יוצר פעולות Script עבור הפעולה:</String>
371 <String Id="ProgressTextGenerateScriptTemplate" Overridable="yes">[1]</String>
372 <String Id="ProgressTextInstallSFPCatalogFile" Overridable="yes">מתקין את קטלוג המערכת</String>
373 <String Id="ProgressTextInstallSFPCatalogFileTemplate" Overridable="yes">קובץ: [1], יחסי תלות: [2]</String>
374 <String Id="ProgressTextMsiPublishAssemblies" Overridable="yes">מפרסם מידע הרכבה</String>
375 <String Id="ProgressTextMsiPublishAssembliesTemplate" Overridable="yes">הקשר יישום: [1], שם הרכבה: [2]</String>
376 <String Id="ProgressTextMsiUnpublishAssemblies" Overridable="yes">מבטל פרסום של מידע הרכבה</String>
377 <String Id="ProgressTextMsiUnpublishAssembliesTemplate" Overridable="yes">הקשר יישום: [1], שם הרכבה: [2]</String>
378 <String Id="ProgressTextRollback" Overridable="yes">פעולת חזרה למצב קודם:</String>
379 <String Id="ProgressTextRollbackTemplate" Overridable="yes">[1]</String>
380 <String Id="ProgressTextRollbackCleanup" Overridable="yes">מסיר קבצי גיבוי</String>
381 <String Id="ProgressTextRollbackCleanupTemplate" Overridable="yes">קובץ: [1]</String>
382 <String Id="ProgressTextUnmoveFiles" Overridable="yes">מסיר קבצים שהועברו</String>
383 <String Id="ProgressTextUnmoveFilesTemplate" Overridable="yes">קובץ: [1], ספריה: [9]</String>
384 <String Id="ProgressTextUnpublishProduct" Overridable="yes">מבטל פרסום מידע אודות המוצר</String>
385
386 <String Id="Error0" Overridable="yes">{{שגיאה מכרעת: }}</String>
387 <String Id="Error1" Overridable="yes">{{שגיאה [1]. }}</String>
388 <String Id="Error2" Overridable="yes">אזהרה [1]. </String>
389 <String Id="Error4" Overridable="yes">‏‏מידע [1]. </String>
390 <String Id="Error5" Overridable="yes">‏‏המתקין נתקל בשגיאה בלתי צפויה בהתקנת חבילה זו. ייתכן ששגיאה זו מצביעה על בעיה בחבילה. קוד השגיאה הוא [1]. {{הארגומנטים הם: [2], [3], [4]}}</String>
391 <String Id="Error7" Overridable="yes">{{הדיסק מלא: }}</String>
392 <String Id="Error8" Overridable="yes">פעולה [Time]: [1]. [2]‏</String>
393 <String Id="Error9" Overridable="yes">[ProductName]</String>
394 <String Id="Error10" Overridable="yes">{[2]}{, [3]}{, [4]}</String>
395 <String Id="Error11" Overridable="yes">סוג הודעה: [1], ארגומנט: [2]‏</String>
396 <String Id="Error12" Overridable="yes">=== תחילת הרישום: [Date] ‏ [Time]‏ ===</String>
397 <String Id="Error13" Overridable="yes">=== סיום הרישום: [Date] ‏ [Time] ===</String>
398 <String Id="Error14" Overridable="yes">תחילת הפעולה [Time]‏: [1].</String>
399 <String Id="Error15" Overridable="yes">סיום הפעולה [Time]‏: [1]. ערך החזרה [2].</String>
400 <String Id="Error16" Overridable="yes">זמן נותר: {[1] דקות }{[2] שניות}</String>
401 <String Id="Error17" Overridable="yes">אין זיכרון פנוי. סגור יישומים אחרים לפני שתנסה שוב.</String>
402 <String Id="Error18" Overridable="yes">המתקין הפסיק להגיב.</String>
403 <String Id="Error19" Overridable="yes">פעולת המתקין הופסקה בטרם עת.</String>
404 <String Id="Error20" Overridable="yes">נא המתן בזמן ש- Windows קובע את תצורת [ProductName]</String>
405 <String Id="Error21" Overridable="yes">אוסף מידע נדרש...</String>
406 <String Id="Error22" Overridable="yes">מסיר גירסאות קודמות של יישום זה...</String>
407 <String Id="Error23" Overridable="yes">מתכונן להסרת גירסאות קודמות של יישום זה...</String>
408 <String Id="Error32" Overridable="yes">התקנת {[ProductName] }הסתיימה בהצלחה.</String>
409 <String Id="Error33" Overridable="yes">התקנת {[ProductName] }נכשלה.</String>
410 <String Id="Error1101" Overridable="yes">שגיאה בקריאה מקובץ: [2]. {{ שגיאת מערכת [3].}} ודא שהקובץ קיים ושבאפשרותך לגשת אליו.</String>
411 <String Id="Error1301" Overridable="yes">אין אפשרות ליצור את הקובץ '[2]'. ספריה בשם זה כבר קיימת. בטל את ההתקנה ונסה להתקין במיקום אחר.</String>
412 <String Id="Error1302" Overridable="yes">‏‏נא הכנס את הדיסק: [2]‏</String>
413 <String Id="Error1303" Overridable="yes">למתקין אין די הרשאות לגשת לספריה זו: [2]. אין אפשרות להמשיך בהתקנה. היכנס כמנהל מערכת, או פנה למנהל המערכת.</String>
414 <String Id="Error1304" Overridable="yes">שגיאה בכתיבה לקובץ: [2]. ודא שיש לך גישה לספריה זו.</String>
415 <String Id="Error1305" Overridable="yes">שגיאה בקריאה מקובץ ‎[2]‎. {{ שגיאת מערכת [3].}} ודא שהקובץ קיים ושבאפשרותך לגשת אליו.</String>
416 <String Id="Error1306" Overridable="yes">ליישום אחר יש גישה בלעדית לקובץ '[2]'. סגור את כל היישומים האחרים ולאחר מכן לחץ על 'נסה שוב'.</String>
417 <String Id="Error1307" Overridable="yes">אין די שטח דיסק להתקנת קובץ זה: [2]. פנה שטח דיסק ולחץ על 'נסה שוב', או לחץ על 'ביטול' כדי לצאת.</String>
418 <String Id="Error1308" Overridable="yes">קובץ המקור לא נמצא: [2]. ודא שהקובץ קיים ושבאפשרותך לגשת אליו.</String>
419 <String Id="Error1309" Overridable="yes">‏‏שגיאה בקריאה מקובץ: [3]. {{ שגיאת מערכת [2].}} ודא שהקובץ קיים ושבאפשרותך לגשת אליו.</String>
420 <String Id="Error1310" Overridable="yes">‏‏שגיאה בכתיבה לקובץ: [3]. {{ שגיאת מערכת [2].}} ודא שיש לך גישה לספריה זו.</String>
421 <String Id="Error1311" Overridable="yes">קובץ המקור לא נמצא {{(קובץ Cabinet‏)}}: [2]. ודא שהקובץ קיים ושבאפשרותך לגשת אליו.</String>
422 <String Id="Error1312" Overridable="yes">אין אפשרות ליצור את הספריה '[2]'. קובץ בשם זה קיים כבר. שנה את שם הקובץ או הסר אותו, ולחץ על 'נסה שוב', או לחץ על 'ביטול' כדי לצאת.</String>
423 <String Id="Error1313" Overridable="yes">אמצעי האחסון [2] אינו זמין כעת. בחר אמצעי אחסון אחר.</String>
424 <String Id="Error1314" Overridable="yes">הנתיב שצוין '[2]' אינו זמין.</String>
425 <String Id="Error1315" Overridable="yes">‏‏לא ניתן לכתוב לתיקיה שצוינה: [2].</String>
426 <String Id="Error1316" Overridable="yes">אירעה שגיאת רשת בעת הניסיון לקרוא מהקובץ: [2]</String>
427 <String Id="Error1317" Overridable="yes">אירעה שגיאה בעת הניסיון ליצור את הספריה: [2]</String>
428 <String Id="Error1318" Overridable="yes">‏‏אירעה שגיאת רשת בעת הניסיון ליצור את הספריה: [2]‏</String>
429 <String Id="Error1319" Overridable="yes">אירעה שגיאת רשת בעת הניסיון לפתוח את קובץ Cabinet של קובץ המקור: [2]</String>
430 <String Id="Error1320" Overridable="yes">הנתיב שצוין ארוך מדי: [2]</String>
431 <String Id="Error1321" Overridable="yes">‏‏למתקין אין הרשאות מספיקות לשינוי קובץ זה: [2].</String>
432 <String Id="Error1322" Overridable="yes">חלק מנתיב התיקיה '[2]' אינו חוקי. הוא ריק, או שהוא חורג מהאורך שהמערכת מתירה.</String>
433 <String Id="Error1323" Overridable="yes">נתיב התיקיה '[2]' מכיל מילים שאינן חוקיות עבור נתיבי תיקיות.</String>
434 <String Id="Error1324" Overridable="yes">נתיב התיקיה '[2]' מכיל תו לא חוקי.</String>
435 <String Id="Error1325" Overridable="yes">'[2]' אינו שם קובץ קצר חוקי.</String>
436 <String Id="Error1326" Overridable="yes">שגיאה בקבלת אבטחת הקובץ: [3] ‏GetLastError‏: [2]</String>
437 <String Id="Error1327" Overridable="yes">כונן לא חוקי: [2]</String>
438 <String Id="Error1328" Overridable="yes">שגיאה בהחלת תיקון על קובץ [2]. כנראה שהקובץ עודכן באמצעים אחרים, ולא ניתן עוד לשנותו באמצעות תיקון זה. לקבלת מידע נוסף, פנה לספק התיקון. {{שגיאת מערכת: [3]}}</String>
439 <String Id="Error1329" Overridable="yes">אין אפשרות להתקין קובץ נדרש מאחר שקובץ ה- Cabinet ‏[2] אינו חתום בחתימה דיגיטלית. דבר זה עשוי להצביע על כך שקובץ ה- Cabinet פגום.</String>
440 <String Id="Error1330" Overridable="yes">אין אפשרות להתקין קובץ נדרש מאחר שקובץ ה- Cabinet ‏[2] כולל חתימה דיגיטלית שאינה חוקית. דבר זה עשוי להצביע על כך שקובץ ה- Cabinet פגום.{{ WinVerifyTrust החזיר את שגיאה [3].}}</String>
441 <String Id="Error1331" Overridable="yes">העתקת קובץ [2] כראוי נכשלה: שגיאת CRC.</String>
442 <String Id="Error1332" Overridable="yes">העברת קובץ [2] כראוי נכשלה: שגיאת CRC.</String>
443 <String Id="Error1333" Overridable="yes">תיקון קובץ [2] כראוי נכשל: שגיאת CRC.</String>
444 <String Id="Error1334" Overridable="yes">אין אפשרות להתקין את הקובץ '[2]' מאחר שהקובץ אינו נמצא בקובץ Cabinet ‏'[3]'. מצב זה עשוי להצביע על שגיאת רשת, שגיאה בקריאה מכונן תקליטורים או בעיה בחבילה זו.</String>
445 <String Id="Error1335" Overridable="yes">אין אפשרות להשתמש בקובץ Cabinet ‏'[2]' הדרוש להתקנה זו, מאחר שהוא פגום. מצב זה עשוי להצביע על שגיאת רשת, שגיאה בקריאה מכונן תקליטורים או בעיה בחבילה זו.</String>
446 <String Id="Error1336" Overridable="yes">אירעה שגיאה בעת יצירת קובץ זמני הדרוש להשלמת התקנה זו. {{ תיקיה: [3]. קוד שגיאת מערכת: [2]}}</String>
447 <String Id="Error1401" Overridable="yes">לא ניתן ליצור את המפתח: [2]. {{ שגיאת מערכת [3].}} ודא שיש לך הרשאות גישה מספיקות למפתח זה או פנה לצוות התמיכה.‏ </String>
448 <String Id="Error1402" Overridable="yes">לא ניתן לפתוח את המפתח: [2]. {{ שגיאת מערכת [3].}} ודא שיש לך הרשאות גישה מספיקות למפתח זה או פנה לצוות התמיכה. </String>
449 <String Id="Error1403" Overridable="yes">לא ניתן למחוק את הערך [2] ממפתח [3]. {{ שגיאת מערכת [4].}} ודא שיש לך הרשאות גישה מספיקות למפתח זה או פנה לצוות התמיכה. </String>
450 <String Id="Error1404" Overridable="yes">‏‏‏‏לא ניתן למחוק את המפתח [2]. {{ שגיאת מערכת [3].}} ודא שיש לך הרשאות גישה מספיקות למפתח זה או פנה לצוות התמיכה. </String>
451 <String Id="Error1405" Overridable="yes">לא ניתן לקרוא את הערך [2] מהמפתח [3]. {{ שגיאת מערכת [4].}} ודא שיש לך הרשאות גישה מספיקות למפתח זה או פנה לצוות התמיכה. </String>
452 <String Id="Error1406" Overridable="yes">לא ניתן לכתוב את הערך [2] למפתח [3]. {{ שגיאת מערכת [4].}} ודא שיש לך הרשאות גישה מספיקות למפתח זה או פנה לצוות התמיכה.</String>
453 <String Id="Error1407" Overridable="yes">לא ניתן לקבל שמות ערכים עבור מפתח [2]. {{ שגיאת מערכת [3].}} ודא שיש לך הרשאות גישה מספיקות למפתח זה או פנה לצוות התמיכה.</String>
454 <String Id="Error1408" Overridable="yes">לא ניתן לקבל שמות מפתחות משנה עבור מפתח [2]. {{ שגיאת מערכת [3].}} ודא שיש לך הרשאות גישה מספיקות למפתח זה או פנה לצוות התמיכה.</String>
455 <String Id="Error1409" Overridable="yes">לא ניתן לקרוא מידע אבטחה עבור מפתח [2]. {{ שגיאת מערכת [3].}} ודא שיש לך הרשאות גישה מספיקות למפתח זה או פנה לצוות התמיכה.</String>
456 <String Id="Error1410" Overridable="yes">לא ניתן להגדיל את שטח הרישום הזמין. ‎[2] KB של שטח רישום פנוי דרושים להתקנת יישום זה.</String>
457 <String Id="Error1500" Overridable="yes">התקנה אחרת מתבצעת כעת. עליך להשלים התקנה זו לפני שתמשיך בהתקנה הנוכחית.</String>
458 <String Id="Error1501" Overridable="yes">שגיאה בגישה לנתונים מאובטחים. ודא ש- Windows Installer מוגדר כראוי ונסה להתקין שוב.</String>
459 <String Id="Error1502" Overridable="yes">משתמש '[2]' הפעיל בעבר התקנה של מוצר '[3]'. משתמש זה יצטרך להפעיל התקנה זו שוב בטרם יוכל להשתמש במוצר זה. ההתקנה הנוכחית שלך תמשיך כעת.</String>
460 <String Id="Error1503" Overridable="yes">משתמש '[2]' הפעיל בעבר התקנה של מוצר '[3]'. משתמש זה יצטרך להפעיל התקנה זו שוב בטרם יוכל להשתמש במוצר זה.</String>
461 <String Id="Error1601" Overridable="yes">אזל השטח בדיסק -- אמצעי אחסון: '[2]'; שטח נדרש: ‎[3] KB; שטח זמין: [4] KB. פנה שטח בדיסק ונסה שוב.</String>
462 <String Id="Error1602" Overridable="yes">‏‏האם אתה בטוח שברצונך לבטל?</String>
463 <String Id="Error1603" Overridable="yes">הקובץ [2][3] מוחזק בשימוש על-ידי ההליך הבא: {שם: [4], מזהה: [5], כותרת החלון: '[6]'}. סגור יישום זה ונסה שוב.</String>
464 <String Id="Error1604" Overridable="yes">המוצר '[2]' כבר מותקן, דבר המונע את התקנת מוצר זה. שני מוצרים אלה אינם תואמים.</String>
465 <String Id="Error1605" Overridable="yes">אין די שטח דיסק באמצעי אחסון '[2]' כדי להמשיך את ההתקנה עם אפשרות שחזור מופעלת. דרושים KB ‏[3], אבל רק KB ‏[4] פנויים. לחץ על 'התעלם' להמשך ההתקנה ללא אפשרות שמירת נתוני השחזור, לחץ על 'נסה שוב' לבדיקה חוזרת של שטח פנוי או לחץ על 'ביטול' ליציאה מתוכנית ההתקנה.</String>
466 <String Id="Error1606" Overridable="yes">לא ניתן לגשת למיקום הרשת [2].</String>
467 <String Id="Error1607" Overridable="yes">יש לסגור את היישומים הבאים לפני המשך ההתקנה:</String>
468 <String Id="Error1608" Overridable="yes">לא נמצאו מוצרים תואמים שהותקנו בעבר במחשב המיועד להתקנת מוצר זה.</String>
469 <String Id="Error1609" Overridable="yes">אירעה שגיאה בעת הקצאת הגדרות אבטחה. [2] אינו משתמש או קבוצה חוקיים. הבעיה עשויה להיות בחבילה או בעיה בהתחברות לבקר תחום ברשת. בדוק את חיבור הרשת ולחץ על 'נסה שוב', או לחץ על 'ביטול' כדי לסיים את ההתקנה. {{אין אפשרות לאתר את SID המשתמש, שגיאת מערכת [3]}}</String>
470 <String Id="Error1701" Overridable="yes">המפתח [2] אינו חוקי. ודא שהזנת את המפתח הנכון.</String>
471 <String Id="Error1702" Overridable="yes">המתקין חייב להפעיל מחדש את המערכת שלך כדי שניתן יהיה להמשיך עם קביעת התצורה של [2]. לחץ על 'כן' כדי להפעיל מחדש כעת, או על 'לא' אם בכוונתך להפעיל מחדש באופן ידני מאוחר יותר.</String>
472 <String Id="Error1703" Overridable="yes">עליך להפעיל מחדש את המערכת כדי ששינויי התצורה של [2] ייכנסו לתוקף. לחץ על 'כן', כדי להפעיל מחדש כעת, או על 'לא' אם בכוונתך להפעיל מחדש באופן ידני מאוחר יותר.</String>
473 <String Id="Error1704" Overridable="yes">התקנה של [2] מושעית כעת. כדי להמשיך, עליך לבטל את השינויים שביצעה התקנה זו. האם ברצונך לבטל שינויים אלה?</String>
474 <String Id="Error1705" Overridable="yes">מתבצעת כעת התקנה קודמת של מוצר זה. כדי להמשיך, עליך לבטל את השינויים שביצעה התקנה זו. האם ברצונך לבטל שינויים אלה?</String>
475 <String Id="Error1706" Overridable="yes">לא נמצאה חבילת התקנה עבור המוצר [2]. נסה את ההתקנה שוב באמצעות עותק חוקי של חבילת ההתקנה '[3]'.</String>
476 <String Id="Error1707" Overridable="yes">ההתקנה הושלמה בהצלחה.</String>
477 <String Id="Error1708" Overridable="yes">ההתקנה נכשלה.</String>
478 <String Id="Error1709" Overridable="yes">מוצר: [2] -- [3]</String>
479 <String Id="Error1710" Overridable="yes">באפשרותך לשחזר את המחשב למצבו הקודם או להמשיך בהתקנה במועד מאוחר יותר. האם ברצונך לבצע שחזור?</String>
480 <String Id="Error1711" Overridable="yes">אירעה שגיאה במהלך כתיבת מידע התקנה בדיסק. ודא שיש די שטח דיסק זמין ולחץ על 'נסה שוב, או לחץ על 'ביטול' כדי לסיים את ההתקנה.</String>
481 <String Id="Error1712" Overridable="yes">לא ניתן לאתר קובץ אחד או יותר מהקבצים הדרושים לשחזור המחשב שלך למצבו הקודם. לא ניתן יהיה לבצע שחזור.</String>
482 <String Id="Error1713" Overridable="yes">ל- [2] אין אפשרות להתקין אחד מהמוצרים הנדרשים שלו. פנה לקבוצת התמיכה הטכנית. {{שגיאת מערכת: [3].}}</String>
483 <String Id="Error1714" Overridable="yes">לא ניתן להסיר את הגירסה הקודמת של [2]. פנה לקבוצת התמיכה הטכנית. {{שגיאת מערכת [3].}}</String>
484 <String Id="Error1715" Overridable="yes">[2] הותקן</String>
485 <String Id="Error1716" Overridable="yes">[2] הוגדר</String>
486 <String Id="Error1717" Overridable="yes">[2] הוסר</String>
487 <String Id="Error1718" Overridable="yes">קובץ [2] נדחה על-ידי מדיניות חתימה דיגיטלית.</String>
488 <String Id="Error1719" Overridable="yes">לא ניתן לגשת לשירות Windows Installer. הדבר עשוי להתרחש אם Windows פועל במצב בטוח או אם Windows Installer אינו מותקן כראוי. פנה לצוות התמיכה לקבלת סיוע.</String>
489 <String Id="Error1720" Overridable="yes">קיימת בעיה בחבילה זו של Windows Installer. לא ניתן להפעיל קובץ Script שנדרש להשלמת התקנה זו. פנה לצוות התמיכה או לספק החבילה. {{פעולה מותאמת אישית [2] שגיאת Script ‏[3], [4]: [5] שורה [6], עמודה [7], [8] }}</String>
490 <String Id="Error1721" Overridable="yes">קיימת בעיה בחבילה זו של Windows Installer. לא ניתן להפעיל קובץ DLL שנדרש להשלמת התקנה זו. פנה לצוות התמיכה או לספק החבילה. {{פעולה [2], מיקום: [3], פקודה: [4] }}</String>
491 <String Id="Error1722" Overridable="yes">קיימת בעיה בחבילה זו של Windows Installer. תוכנית המופעלת כחלק מההתקנה לא סיימה את פעולתה כצפוי. פנה לצוות התמיכה או לספק החבילה. {{פעולה [2], מיקום: [3], פקודה: [4] }}</String>
492 <String Id="Error1723" Overridable="yes">קיימת בעיה בחבילה זו של Windows Installer. לא ניתן להפעיל קובץ DLL שנדרש להשלמת התקנה זו. פנה לצוות התמיכה או לספק החבילה. {{פעולה [2], ערך: [3], ספריה: [4] }}</String>
493 <String Id="Error1724" Overridable="yes">‏‏ההסרה הושלמה בהצלחה.</String>
494 <String Id="Error1725" Overridable="yes">‏‏ההסרה נכשלה.</String>
495 <String Id="Error1726" Overridable="yes">המודעה הושלמה בהצלחה.</String>
496 <String Id="Error1727" Overridable="yes">המודעה נכשלה.</String>
497 <String Id="Error1728" Overridable="yes">‏‏קביעת התצורה הושלמה בהצלחה.</String>
498 <String Id="Error1729" Overridable="yes">‏‏קביעת התצורה נכשלה.</String>
499 <String Id="Error1730" Overridable="yes">‏‏עליך להיות מנהל מערכת כדי להסיר יישום זה. להסרת יישום זה, היכנס למערכת עם הרשאות של מנהל מערכת או פנה לקבוצת התמיכה הטכנית לקבלת סיוע.</String>
500 <String Id="Error1731" Overridable="yes">חבילת ההתקנה המקורית של המוצר [2] אינה מסונכרנת עם חבילת הלקוח. נסה לבצע את ההתקנה שוב באמצעות עותק חוקי של חבילת ההתקנה '[3]'.</String>
501 <String Id="Error1732" Overridable="yes">כדי להשלים את ההתקנה של [2], עליך להפעיל מחדש את המחשב. משתמשים אחרים מחוברים כעת למחשב זה, והפעלה מחדש עלולה לגרום להם לאבד את עבודתם. האם ברצונך להפעיל מחדש כעת?</String>
502 <String Id="Error1801" Overridable="yes">הנתיב [2] אינו חוקי. נא ציין נתיב חוקי.</String>
503 <String Id="Error1802" Overridable="yes">אין זיכרון פנוי. סגור יישומים אחרים לפני שתנסה שוב.</String>
504 <String Id="Error1803" Overridable="yes">אין דיסק בכונן [2]. הכנס דיסק ולחץ על 'נסה שוב', או לחץ על 'ביטול' כדי לחזור אל אמצעי האחסון הקודם שנבחר.</String>
505 <String Id="Error1804" Overridable="yes">אין דיסק בכונן [2]. הכנס דיסק ולחץ על 'נסה שוב', או לחץ על 'ביטול' כדי לחזור אל תיבת העיון ולבחור אמצעי אחסון אחר.</String>
506 <String Id="Error1805" Overridable="yes">התיקיה [2] אינה קיימת. נא הזן נתיב לתיקיה קיימת.</String>
507 <String Id="Error1806" Overridable="yes">אין לך הרשאות מתאימות לקריאת תיקיה זו.</String>
508 <String Id="Error1807" Overridable="yes">לא ניתן לקבוע תיקיית יעד חוקית עבור ההתקנה.</String>
509 <String Id="Error1901" Overridable="yes">‏‏שגיאה בניסיון לקרוא ממסד הנתונים המקורי של ההתקנה: [2].</String>
510 <String Id="Error1902" Overridable="yes">מתזמן פעולת אתחול מחדש: משנה את שם הקובץ [2] ל- [3]. יש לבצע אתחול מחדש כדי להשלים את הפעולה.</String>
511 <String Id="Error1903" Overridable="yes">מתזמן פעולת אתחול מחדש: מוחק את הקובץ [2]. יש לבצע אתחול מחדש כדי להשלים את הפעולה.</String>
512 <String Id="Error1904" Overridable="yes">רישום מודול [2] נכשל. HRESULT ‏[3]. פנה לצוות התמיכה.</String>
513 <String Id="Error1905" Overridable="yes">ביטול הרישום של מודול [2] נכשל. HRESULT ‏[3]. פנה לצוות התמיכה.</String>
514 <String Id="Error1906" Overridable="yes">אחסון החבילה [2] במטמון נכשל. שגיאה: [3]. פנה לצוות התמיכה.</String>
515 <String Id="Error1907" Overridable="yes">לא ניתן לרשום את הגופן [2]. ודא שיש לך הרשאות מספיקות להתקנת גופנים ושהמערכת תומכת בגופן זה.</String>
516 <String Id="Error1908" Overridable="yes">ביטול רישום הגופן [2] נכשל. ודא שיש לך הרשאות מספיקות להסרת גופנים.</String>
517 <String Id="Error1909" Overridable="yes">לא ניתן ליצור את קיצור הדרך [2]. ודא שתיקיית היעד קיימת ושבאפשרותך לגשת אליה.</String>
518 <String Id="Error1910" Overridable="yes">‏‏לא ניתן להסיר את קיצור הדרך [2]. ודא שקיצור הדרך קיים ושבאפשרותך לגשת אליו.</String>
519 <String Id="Error1911" Overridable="yes">לא ניתן לרשום ספריית סוגים עבור הקובץ [2]. פנה לצוות התמיכה.</String>
520 <String Id="Error1912" Overridable="yes">לא ניתן לבטל את רישום ספריית הסוגים עבור הקובץ [2]. פנה לצוות התמיכה.</String>
521 <String Id="Error1913" Overridable="yes">לא ניתן לעדכן את קובץ ה- INI ‏[2][3]. ודא שהקובץ קיים ושבאפשרותך לגשת אליו.</String>
522 <String Id="Error1914" Overridable="yes">לא ניתן לתזמן את הקובץ [2] להחליף את הקובץ [3] במהלך אתחול מחדש. ודא שיש לך הרשאות כתיבה לקובץ [3].</String>
523 <String Id="Error1915" Overridable="yes">שגיאה בעת הסרת מנהל של מנהלי ההתקנים של ODBC, שגיאת ODBC‏ [2]: [3]. פנה לצוות התמיכה.</String>
524 <String Id="Error1916" Overridable="yes">שגיאה בעת התקנת מנהל של מנהלי ההתקנים של ODBC, שגיאת ODBC‏ [2]: [3]. פנה לצוות התמיכה.</String>
525 <String Id="Error1917" Overridable="yes">שגיאה בעת הסרת מנהל ההתקן של ODBC‏: [4], שגיאת ODBC‏ [2]: [3]. ודא שיש לך הרשאות מתאימות להסרת מנהלי התקן של ODBC.</String>
526 <String Id="Error1918" Overridable="yes">שגיאה בעת התקנת מנהל ההתקן של ODBC‏: [4], שגיאת ODBC‏ [2]: [3]. ודא שהקובץ [4] קיים ושבאפשרותך לגשת אליו.</String>
527 <String Id="Error1919" Overridable="yes">‏‏שגיאה בהגדרת תצורה של מקור נתוני ODBC: ‏[4], שגיאת ODBC ‏[2]:‏ [3]. ודא שהקובץ [4] קיים ושבאפשרותך לגשת אליו.</String>
528 <String Id="Error1920" Overridable="yes">הפעלת שירות '[2]' ([3]) נכשלה. ודא שברשותך הרשאות מספיקות להפעלת שירותי מערכת.</String>
529 <String Id="Error1921" Overridable="yes">לא ניתן להפסיק את שירות '[2]' ([3]). ודא שברשותך הרשאות מספיקות להפסקת שירותי מערכת.</String>
530 <String Id="Error1922" Overridable="yes">לא ניתן למחוק את שירות '[2]' ([3]). ודא שברשותך הרשאות מספיקות להסרת שירותי מערכת.</String>
531 <String Id="Error1923" Overridable="yes">לא ניתן להתקין את שירות '[2]' ([3]). ודא שברשותך הרשאות מספיקות להתקנת שירותי מערכת.</String>
532 <String Id="Error1924" Overridable="yes">לא ניתן לעדכן את משתנה הסביבה '[2]'. ודא שברשותך הרשאות מספיקות לשינוי משתני סביבה.</String>
533 <String Id="Error1925" Overridable="yes">אין לך הרשאות מספיקות להשלמת התקנה זו עבור כל משתמשי המחשב. היכנס כמנהל מערכת ולאחר מכן נסה שוב לבצע התקנה זו.</String>
534 <String Id="Error1926" Overridable="yes">לא ניתן להגדיר אבטחת קובץ עבור הקובץ '[3]'. שגיאה: [2]. ודא שברשותך הרשאות מספיקות לשינוי הרשאות האבטחה עבור קובץ זה.</String>
535 <String Id="Error1927" Overridable="yes">שירותי רכיבים (COM+ 1.0) אינם מותקנים במחשב זה. כדי שהתקנה זו תסתיים בהצלחה, יש צורך בשירותי רכיבים. שירותי רכיבים זמינים ב- Windows 2000.</String>
536 <String Id="Error1928" Overridable="yes">שגיאה ברישום יישום COM+‎‎. פנה לצוות התמיכה לקבלת מידע נוסף.</String>
537 <String Id="Error1929" Overridable="yes">שגיאה בביטול הרישום של יישום COM+‎‎. פנה לצוות התמיכה לקבלת מידע נוסף.</String>
538 <String Id="Error1930" Overridable="yes">לא ניתן לשנות את התיאור של שירות '[2]' ([3]).</String>
539 <String Id="Error1931" Overridable="yes">לשירות Windows Installer אין אפשרות לעדכן את קובץ המערכת [2] מאחר שהקובץ מוגן על-ידי Windows. ייתכן שתצטרך לעדכן את מערכת ההפעלה שלך כדי שתוכנית זו תפעל כהלכה. {{גירסת חבילה: [3], גירסה המוגנת על-ידי מערכת ההפעלה: [4]}}</String>
540 <String Id="Error1932" Overridable="yes">לשירות Windows Installer אין אפשרות לעדכן את קובץ Windows המוגן [2]. {{גירסת חבילה: [3], גירסה המוגנת על-ידי מערכת ההפעלה: [4], שגיאת SFP‏: [5]}}</String>
541 <String Id="Error1933" Overridable="yes">לשירות Windows Installer אין אפשרות לעדכן קובץ Windows מוגן אחד או יותר. {{שגיאת SFP: ‏[2]. רשימת קבצים מוגנים:\r\n[3]}}</String>
542 <String Id="Error1934" Overridable="yes">מדיניות במחשב אינה מאפשרת התקנות משתמש.</String>
543 <String Id="Error1935" Overridable="yes">אירעה שגיאה במהלך התקנת רכיב ההרכבה '[6]'. עיין בעזרה ותמיכה לקבלת מידע נוסף. HRESULT:‏ [3]. {{ממשק הרכבה: [4], פונקציה: [5], רכיב: [2]}}</String>
544 <String Id="Error1936" Overridable="yes">אירעה שגיאה במהלך התקנת ההרכבה '[6]'. להרכבה לא מוגדר שם חזק או שהיא אינה חתומה באמצעות מפתח באורך המינימלי הנדרש. HRESULT‏: [3]. {{ממשק הרכבה: [4], פונקציה: [5], רכיב: [2]}}</String>
545 <String Id="Error1937" Overridable="yes">אירעה שגיאה במהלך התקנת ההרכבה '[6]'. לא ניתן לאמת את החתימה או הקטלוג או שהפריט אינו חוקי. HRESULT‏: [3]. {{ממשק הרכבה: [4], פונקציה: [5], רכיב: [2]}}</String>
546 <String Id="Error1938" Overridable="yes">אירעה שגיאה במהלך התקנת ההרכבה '[6]'. לא ניתן לאתר מודול אחד או יותר של ההרכבה. HRESULT‏: [3]. {{ממשק הרכבה: [4], פונקציה: [5], רכיב: [2]}}</String>
547
548 <String Id="UITextbytes" Overridable="yes">בתים</String>
549 <String Id="UITextGB" Overridable="yes">GB</String>
550 <String Id="UITextKB" Overridable="yes">KB</String>
551 <String Id="UITextMB" Overridable="yes">MB</String>
552 <String Id="UITextMenuAbsent" Overridable="yes">התכונה כולה תהיה לא זמינה</String>
553 <String Id="UITextMenuAdvertise" Overridable="yes">התכונה תותקן לפי דרישה</String>
554 <String Id="UITextMenuAllCD" Overridable="yes">התכונה המלאה תותקן להפעלה מתקליטור</String>
555 <String Id="UITextMenuAllLocal" Overridable="yes">התכונה המלאה תותקן בכונן קשיח מקומי</String>
556 <String Id="UITextMenuAllNetwork" Overridable="yes">התכונה המלאה תותקן להפעלה מרשת</String>
557 <String Id="UITextMenuCD" Overridable="yes">תותקן להפעלה מתקליטור</String>
558 <String Id="UITextMenuLocal" Overridable="yes">תותקן בכונן קשיח מקומי</String>
559 <String Id="UITextMenuNetwork" Overridable="yes">תותקן להפעלה מרשת</String>
560 <String Id="UITextNewFolder" Overridable="yes">תיקיה|תיקיה חדשה</String>
561 <String Id="UITextScriptInProgress" Overridable="yes">אוסף מידע נדרש...</String>
562 <String Id="UITextSelAbsentAbsent" Overridable="yes">תכונה זו תישאר לא מותקנת</String>
563 <String Id="UITextSelAbsentAdvertise" Overridable="yes">תכונה זו תוגדר להתקנה לפי דרישה</String>
564 <String Id="UITextSelAbsentCD" Overridable="yes">תכונה זו תותקן להפעלה מתקליטור</String>
565 <String Id="UITextSelAbsentLocal" Overridable="yes">תכונה זו תותקן בכונן הקשיח המקומי</String>
566 <String Id="UITextSelAbsentNetwork" Overridable="yes">תכונה זו תותקן להפעלה מהרשת</String>
567 <String Id="UITextSelAdvertiseAbsent" Overridable="yes">תכונה זו תהפוך ללא זמינה</String>
568 <String Id="UITextSelAdvertiseAdvertise" Overridable="yes">תותקן לפי דרישה</String>
569 <String Id="UITextSelAdvertiseCD" Overridable="yes">תכונה זו תהיה זמינה להפעלה מתקליטור</String>
570 <String Id="UITextSelAdvertiseLocal" Overridable="yes">תכונה זו תותקן בכונן הקשיח המקומי שלך</String>
571 <String Id="UITextSelAdvertiseNetwork" Overridable="yes">תכונה זו תהיה זמינה להפעלה מהרשת</String>
572 <String Id="UITextSelCDAbsent" Overridable="yes">תכונה זו תוסר לחלוטין, לא תוכל להפעיל אותה מתקליטור</String>
573 <String Id="UITextSelCDAdvertise" Overridable="yes">תכונה זו תעבור ממצב הפעלה מתקליטור להגדרת התקנה לפי דרישה</String>
574 <String Id="UITextSelCDCD" Overridable="yes">תכונה זו תישאר במצב הפעלה מתקליטור</String>
575 <String Id="UITextSelCDLocal" Overridable="yes">תכונה זו תשתנה ממצב הפעלה מתקליטור למצב התקנה בכונן הקשיח המקומי</String>
576 <String Id="UITextSelChildCostNeg" Overridable="yes">תכונה זו מפנה עד [1] בכונן הקשיח.</String>
577 <String Id="UITextSelChildCostPos" Overridable="yes">תכונה זו דורשת [1] בכונן הקשיח.</String>
578 <String Id="UITextSelCostPending" Overridable="yes">מחשב דרישות עבור תכונה זו...</String>
579 <String Id="UITextSelLocalAbsent" Overridable="yes">תכונה זו תוסר לחלוטין</String>
580 <String Id="UITextSelLocalAdvertise" Overridable="yes">תכונה זו תוסר מהכונן הקשיח המקומי שלך, אך תוגדר להתקנה לפי דרישה</String>
581 <String Id="UITextSelLocalCD" Overridable="yes">תכונה זו תוסר מהכונן הקשיח המקומי שלך, אך עדיין תהיה זמינה להפעלה מתקליטור</String>
582 <String Id="UITextSelLocalLocal" Overridable="yes">תכונה זו תישאר בכונן הקשיח המקומי</String>
583 <String Id="UITextSelLocalNetwork" Overridable="yes">תכונה זו תוסר מהכונן הקשיח המקומי, אך עדיין תהיה זמינה להפעלה מהרשת</String>
584 <String Id="UITextSelNetworkAbsent" Overridable="yes">תכונה זו תוסר לחלוטין, לא תוכל להפעיל אותה מהרשת</String>
585 <String Id="UITextSelNetworkAdvertise" Overridable="yes">תכונה זו תשתנה ממצב הפעלה מהרשת להגדרה להתקנה לפי דרישה</String>
586 <String Id="UITextSelNetworkLocal" Overridable="yes">תכונה זו תשתנה ממצב הפעלה מהרשת למצב התקנה בכונן הקשיח המקומי</String>
587 <String Id="UITextSelNetworkNetwork" Overridable="yes">תכונה זו תישאר במצב הפעלה מהרשת</String>
588 <String Id="UITextSelParentCostNegNeg" Overridable="yes">תכונה זו מפנה [1] בכונן הקשיח. נבחרו [2] מתוך [3] תכונות המשנה שלה. תכונות המשנה מפנות [4] בכונן הקשיח.</String>
589 <String Id="UITextSelParentCostNegPos" Overridable="yes">תכונה זו מפנה [1] בכונן הקשיח. נבחרו [2] מתוך [3] תכונות המשנה שלה. תכונות המשנה דורשות [4] בכונן הקשיח.</String>
590 <String Id="UITextSelParentCostPosNeg" Overridable="yes">תכונה זו דורשת [1] בכונן הקשיח. נבחרו [2] מתוך [3] תכונות המשנה שלה. תכונות המשנה מפנות [4] בכונן הקשיח.</String>
591 <String Id="UITextSelParentCostPosPos" Overridable="yes">תכונה זו דורשת [1] בכונן הקשיח. נבחרו [2] מתוך [3] תכונות המשנה שלה. תכונות המשנה דורשות [4] בכונן הקשיח.</String>
592 <String Id="UITextTimeRemaining" Overridable="yes">זמן נותר: {[1] דקות }{[2] שניות}</String>
593 <String Id="UITextVolumeCostAvailable" Overridable="yes">זמין</String>
594 <String Id="UITextVolumeCostDifference" Overridable="yes">הבדל</String>
595 <String Id="UITextVolumeCostRequired" Overridable="yes">דרוש</String>
596 <String Id="UITextVolumeCostSize" Overridable="yes">גודל דיסק</String>
597 <String Id="UITextVolumeCostVolume" Overridable="yes">אמצעי אחסון</String>
598</WixLocalization>
diff --git a/src/ext/UI/wixlib/WixUI_hi-IN.wxl b/src/ext/UI/wixlib/WixUI_hi-IN.wxl
new file mode 100644
index 00000000..8a05c6a5
--- /dev/null
+++ b/src/ext/UI/wixlib/WixUI_hi-IN.wxl
@@ -0,0 +1,598 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3
4
5<WixLocalization Culture="hi-in" Codepage="0" xmlns="http://wixtoolset.org/schemas/v4/wxl">
6 <String Id="WixUIBack" Overridable="yes">&amp;पीछे</String>
7 <String Id="WixUINext" Overridable="yes">&amp;अगला</String>
8 <String Id="WixUICancel" Overridable="yes">रद्द करें</String>
9 <String Id="WixUIFinish" Overridable="yes">&amp;समाप्त करें</String>
10 <String Id="WixUIRetry" Overridable="yes">&amp;पुनर्प्रयास करें</String>
11 <String Id="WixUIIgnore" Overridable="yes">&amp;ध्यान न दें</String>
12 <String Id="WixUIYes" Overridable="yes">&amp;हाँ</String>
13 <String Id="WixUINo" Overridable="yes">&amp;नहीं</String>
14 <String Id="WixUIOK" Overridable="yes">ठीक</String>
15 <String Id="WixUIPrint" Overridable="yes">&amp;मुद्रण</String>
16
17 <String Id="AdvancedWelcomeEulaDlg_Title" Overridable="yes">[ProductName] सेटअप</String>
18 <String Id="AdvancedWelcomeEulaDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
19 <String Id="AdvancedWelcomeEulaDlgTitle" Overridable="yes">{\WixUI_Font_Title} कृपया [ProductName] लायसेंस एग्रीमेंट पढें</String>
20 <String Id="AdvancedWelcomeEulaDlgLicenseAcceptedCheckBox" Overridable="yes">मुझे &amp;लायसेंस एग्रीमेंट की शर्तें स्वीकार हैं</String>
21 <String Id="AdvancedWelcomeEulaDlgDescriptionPerMachine" Overridable="yes">उत्पाद को सभी उपयोगकर्ताओं के लिए डिफ़ॉल्ट विकल्पों के साथ स्थापित करने के लिए स्थापित करें क्लिक करें. स्थापना विकल्प बदलने के लिए उन्नत क्लिक करें.</String>
22 <String Id="AdvancedWelcomeEulaDlgDescriptionPerUser" Overridable="yes">उत्पाद को केवल आपके लिए डिफ़ॉल्ट विकल्पों के साथ स्थापित करने के लिए स्थापित करें क्लिक करें. स्थापना विकल्प बदलने के लिए उन्नत क्लिक करें.</String>
23 <String Id="AdvancedWelcomeEulaDlgInstall" Overridable="yes">&amp;स्थापित करें</String>
24 <String Id="AdvancedWelcomeEulaDlgAdvanced" Overridable="yes">&amp;उन्नत</String>
25 <String Id="Advanced_Font_Normal_Size" Overridable="yes">8</String>
26 <String Id="Advanced_Font_Bigger_Size" Overridable="yes">12</String>
27 <String Id="Advanced_Font_Title_Size" Overridable="yes">9</String>
28 <String Id="Advanced_Font_Emphasized_Size" Overridable="yes">8</String>
29 <String Id="Advanced_Font_FaceName" Overridable="yes">Tahoma</String>
30
31 <String Id="BrowseDlg_Title" Overridable="yes">[ProductName] सेटअप</String>
32 <String Id="BrowseDlgComboLabel" Overridable="yes">&amp;इसमें देखें:</String>
33 <String Id="BrowseDlgWixUI_Bmp_Up" Overridable="yes">WixUI_Bmp_Up</String>
34 <String Id="BrowseDlgWixUI_Bmp_UpTooltip" Overridable="yes">एक स्तर ऊपर</String>
35 <String Id="BrowseDlgNewFolder" Overridable="yes">WixUI_Bmp_New</String>
36 <String Id="BrowseDlgNewFolderTooltip" Overridable="yes">नया फ़ोल्डर बनाएँ</String>
37 <String Id="BrowseDlgPathLabel" Overridable="yes">&amp;फ़ोल्डर नाम:</String>
38 <String Id="BrowseDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
39 <String Id="BrowseDlgDescription" Overridable="yes">गंतव्य फ़ोल्डर ब्राउज़ करें</String>
40 <String Id="BrowseDlgTitle" Overridable="yes">{\WixUI_Font_Title}गंतव्य फ़ोल्डर बदलें</String>
41
42 <String Id="CancelDlg_Title" Overridable="yes">[ProductName] सेटअप</String>
43 <String Id="CancelDlgText" Overridable="yes">क्या आप वाकई [ProductName] की स्थापना रद्द करना चाहते है?</String>
44 <String Id="CancelDlgIcon" Overridable="yes">WixUI_Ico_Info</String>
45 <String Id="CancelDlgIconTooltip" Overridable="yes">जानकारी चिह्न</String>
46
47 <String Id="CustomizeDlg_Title" Overridable="yes">[ProductName] सेटअप</String>
48 <String Id="CustomizeDlgTree" Overridable="yes">चयनों का ट्री</String>
49 <String Id="CustomizeDlgBrowse" Overridable="yes">ब्रा&amp;उज़ करें...</String>
50 <String Id="CustomizeDlgReset" Overridable="yes">&amp;रीसेट करें</String>
51 <String Id="CustomizeDlgDiskCost" Overridable="yes">डिस्क &amp;उपयोग</String>
52 <String Id="CustomizeDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
53 <String Id="CustomizeDlgText" Overridable="yes">सुविधाओं की स्थापना का तरीका बदलने के लिए नीचे दिए ट्री में चिह्न क्लिक करें.</String>
54 <String Id="CustomizeDlgDescription" Overridable="yes">चुनें कि आप सुविधाओं को किस तरह स्थापित करना चाहते हैं.</String>
55 <String Id="CustomizeDlgTitle" Overridable="yes">{\WixUI_Font_Title}कस्टम सेटअप</String>
56 <String Id="CustomizeDlgItemDescription" Overridable="yes">CustomizeDlgItemDescription-CustomizeDlgItemDescription</String>
57 <String Id="CustomizeDlgItemSize" Overridable="yes">CustomizeDlgItemSize-CustomizeDlgItemSize</String>
58 <String Id="CustomizeDlgLocation" Overridable="yes">CustomizeDlgLocation-CustomizeDlgLocation</String>
59 <String Id="CustomizeDlgLocationLabel" Overridable="yes">स्‍थान:</String>
60
61 <String Id="DiskCostDlg_Title" Overridable="yes">[ProductName] सेटअप</String>
62 <String Id="DiskCostDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
63 <String Id="DiskCostDlgText" Overridable="yes">हाइलाइट किए गए वॉल्यूम में चयनित सुविधाओं के लिए पर्याप्त डिस्क स्थान उपलब्ध नहीं है. आप हाइलाइट किए गए वॉल्यूम से कुछ फ़ाइलें निकाल सकते हैं, कम सुविधाएँ स्थापित कर सकते हैं, या भिन्न गंतव्य ड्राइव चुन सकते हैं.</String>
64 <String Id="DiskCostDlgDescription" Overridable="yes">चयनित सुविधाओं की स्थापना के लिए आवश्यक डिस्क स्थान.</String>
65 <String Id="DiskCostDlgTitle" Overridable="yes">{\WixUI_Font_Title}डिस्क स्थान आवश्यकताएँ</String>
66 <String Id="DiskCostDlgVolumeList" Overridable="yes">{120}{70}{70}{70}{70}</String>
67
68 <String Id="ErrorDlg_Title" Overridable="yes">[ProductName] सेटअप</String>
69 <String Id="ErrorDlgErrorText" Overridable="yes">जानकारी पाठ</String>
70 <String Id="ErrorDlgErrorIcon" Overridable="yes">WixUI_Ico_Info</String>
71 <String Id="ErrorDlgErrorIconTooltip" Overridable="yes">जानकारी चिह्न</String>
72
73 <String Id="ExitDialog_Title" Overridable="yes">[ProductName] सेटअप</String>
74 <String Id="ExitDialogBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
75 <String Id="ExitDialogDescription" Overridable="yes">सेटअप विज़ार्ड से बाहर निकलने के लिए समाप्ति बटन क्लिक करें.</String>
76 <String Id="ExitDialogTitle" Overridable="yes">{\WixUI_Font_Bigger} ने [ProductName] सेटअप विज़ार्ड पूरा किया है</String>
77
78 <String Id="FatalError_Title" Overridable="yes">[ProductName] सेटअप</String>
79 <String Id="FatalErrorBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
80 <String Id="FatalErrorTitle" Overridable="yes">{\WixUI_Font_Bigger}[ProductName] सेटअप विज़ार्ड समय के पहले ही रुक गया</String>
81 <String Id="FatalErrorDescription1" Overridable="yes">किसी त्रुटि के कारण [ProductName] सेटअप विज़ार्ड समय के पहले ही रुक गया. आपका सिस्टम संशोधित नहीं किया गया है. यह प्रोग्राम बाद में स्थापित करने के लिए, सेटअप विज़ार्ड फिर से चलाएँ.</String>
82 <String Id="FatalErrorDescription2" Overridable="yes">सेटअप विज़ार्ड से बाहर निकलने के लिए समाप्ति बटन क्लिक करें.</String>
83
84 <String Id="FeaturesDlg_Title" Overridable="yes">[ProductName] सेटअप</String>
85 <String Id="FeaturesDlgTree" Overridable="yes">उत्पाद सुविधाएँ</String>
86 <String Id="FeaturesDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
87 <String Id="FeaturesDlgDescription" Overridable="yes">चुनें कि आप सुविधाओं को किस तरह स्थापित करना चाहते हैं.</String>
88 <String Id="FeaturesDlgTitle" Overridable="yes">{\WixUI_Font_Title}उत्पाद सुविधाएँ</String>
89 <String Id="FeaturesDlgItemDescription" Overridable="yes">FeaturesDlgItemDescription</String>
90 <String Id="FeaturesDlgItemSize" Overridable="yes">FeaturesDlgItemSize</String>
91 <String Id="FeaturesDlgInstall" Overridable="yes">&amp;स्थापित करें</String>
92 <String Id="FeaturesDlgChange" Overridable="yes">&amp;बदलें</String>
93
94 <String Id="FilesInUse_Title" Overridable="yes">[ProductName] सेटअप</String>
95 <String Id="FilesInUseExit" Overridable="yes">बा&amp;हर जाएँ</String>
96 <String Id="FilesInUseBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
97 <String Id="FilesInUseText" Overridable="yes">निम्न अनुप्रयोगों द्वारा उपयोग की जाने वाली फ़ाइलों का इस सेटअप से अद्यतन होना आवश्यक है. इन अनुप्रयोगों को बंद करें और बाद में स्थापना जारी रखने के लिए &amp;पुनर्प्रयास करें क्लिक करें या उससे बाहर निकलने के लिए बाहर जाएँ क्लिक करें.</String>
98 <String Id="FilesInUseDescription" Overridable="yes">कुछ ऐसी फ़ाइलें अभी उपयोग में हैं, जिन्हें अद्यतन करने की आवश्यकता है.</String>
99 <String Id="FilesInUseTitle" Overridable="yes">{\WixUI_Font_Title}फ़ाइलें उपयोग में</String>
100
101 <String Id="InstallDirDlg_Title" Overridable="yes">[ProductName] सेटअप</String>
102 <String Id="InstallDirDlgChange" Overridable="yes">&amp;बदलें...</String>
103 <String Id="InstallDirDlgTitle" Overridable="yes">{\WixUI_Font_Title}गंतव्य फ़ोल्डर</String>
104 <String Id="InstallDirDlgDescription" Overridable="yes">डिफ़ॉल्ट फ़ोल्डर में स्थापित करने के लिए अगला क्लिक करें या दूसरा फ़ोल्डर चुनने के लिए बदलें क्लिक करें.</String>
105 <String Id="InstallDirDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
106 <String Id="InstallDirDlgFolderLabel" Overridable="yes">[ProductName] को यहाँ स्थापित करें:</String>
107
108 <String Id="InstallScopeDlg_Title" Overridable="yes">[ProductName] सेटअप</String>
109 <String Id="InstallScopeDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
110 <String Id="InstallScopeDlgDescription" Overridable="yes">स्थापना क्षेत्र और फ़ोल्डर चुनें</String>
111 <String Id="InstallScopeDlgTitle" Overridable="yes">{\WixUI_Font_Title}स्थापना क्षेत्र</String>
112 <String Id="InstallScopeDlgPerUser" Overridable="yes">{\WixUI_Font_Emphasized}Install &amp;केवल आपके लिए ([USERNAME])</String>
113 <String Id="InstallScopeDlgPerUserDescription" Overridable="yes">[ProductName] को प्रति उपयोगकर्ता फ़ोल्डर में स्थापित किया जाएगा और केवल आपके लिए उपलब्ध होगा. आपको स्थानीय व्यवस्थापक विशेषाधिकारों की आवश्यकता नहीं होगी.</String>
114 <String Id="InstallScopeDlgNoPerUserDescription" Overridable="yes">[ProductName] प्रति उपयोगकर्ता स्थापना का समर्थन नहीं करता.</String>
115 <String Id="InstallScopeDlgPerMachine" Overridable="yes">{\WixUI_Font_Emphasized}इस मशीन के सभी उपयोगकर्ताओं के लिए &amp;स्थापित करें</String>
116 <String Id="InstallScopeDlgPerMachineDescription" Overridable="yes">[ProductName] डिफ़ॉल्ट रूप से प्रति मशीन फ़ोल्डर में स्थापित किया जाएगा और सभी उपयोगकर्ताओं के लिए उपलब्ध होगा. आप डिफ़ॉल्ट स्थापना फ़ोल्डर बदल सकते हैं. आपके पास स्थानीय व्यवस्थापक विशेषाधिकार होने चाहिए.</String>
117 <String Id="InstallScopeDlgFolderLabel" Overridable="yes">स्थापना &amp;फ़ोल्डर:</String>
118 <String Id="InstallScopeDlgChange" Overridable="yes">&amp;बदलें...</String>
119
120 <String Id="InvalidDirDlg_Title" Overridable="yes">[ProductName] सेटअप</String>
121 <String Id="InvalidDirDlgText" Overridable="yes">स्थापना निर्देशिका किसी स्थानीय हार्ड ड्राइव पर होना चाहिए.</String>
122 <String Id="InvalidDirDlgIcon" Overridable="yes">WixUI_Ico_Info</String>
123 <String Id="InvalidDirDlgIconTooltip" Overridable="yes">जानकारी चिह्न</String>
124
125 <String Id="LicenseAgreementDlg_Title" Overridable="yes">[ProductName] सेटअप</String>
126 <String Id="LicenseAgreementDlgLicenseAcceptedCheckBox" Overridable="yes">मुझे &amp;लायसेंस एग्रीमेंट की शर्तें स्वीकार हैं</String>
127 <String Id="LicenseAgreementDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
128 <String Id="LicenseAgreementDlgDescription" Overridable="yes">कृपया निम्न लाइसेंस अनुबंध को ध्यानपूर्वक पढ़ें</String>
129 <String Id="LicenseAgreementDlgTitle" Overridable="yes">{\WixUI_Font_Title}एंड-यूज़र लाइसेंस एग्रीमेंट</String>
130
131 <String Id="MaintenanceTypeDlg_Title" Overridable="yes">[ProductName] सेटअप</String>
132 <String Id="MaintenanceTypeDlgChangeButton" Overridable="yes">&amp;बदलें</String>
133 <String Id="MaintenanceTypeDlgChangeButtonTooltip" Overridable="yes">स्थापना बदलें</String>
134 <String Id="MaintenanceTypeDlgRepairButton" Overridable="yes">सु&amp;धारें</String>
135 <String Id="MaintenanceTypeDlgRepairButtonTooltip" Overridable="yes">स्थापना सुधारें</String>
136 <String Id="MaintenanceTypeDlgRemoveButton" Overridable="yes">&amp;निकालें</String>
137 <String Id="MaintenanceTypeDlgRemoveButtonTooltip" Overridable="yes">स्थापना निकालें</String>
138 <String Id="MaintenanceTypeDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
139 <String Id="MaintenanceTypeDlgDescription" Overridable="yes">आप जो कार्रवाई करना चाहते हैं, उसका चयन करें.</String>
140 <String Id="MaintenanceTypeDlgTitle" Overridable="yes">{\WixUI_Font_Title}स्थापना बदलें, सुधारें या निकालें</String>
141 <String Id="MaintenanceTypeDlgChangeText" Overridable="yes">आप को सुविधाओं की स्थापना का तरीका बदलने देता है.</String>
142 <String Id="MaintenanceTypeDlgChangeDisabledText" Overridable="yes">[ProductName] को स्वतंत्र रूप से चयन योग्य कोई सुविधाएँ नहीं हैं.</String>
143 <String Id="MaintenanceTypeDlgRemoveText" Overridable="yes">आपके कंप्‍यूटर से [ProductName] को निकालता है.</String>
144 <String Id="MaintenanceTypeDlgRemoveDisabledText" Overridable="yes">[ProductName] निकाला नहीं जा सकता.</String>
145 <String Id="MaintenanceTypeDlgRepairText" Overridable="yes">गुम तथा दूषित फ़ाइलें, शॉर्टकट और रजिस्ट्री प्रविष्टियाँ सुलझा कर नवीनतम स्थापना में होने वाली त्रुटियाँ सुधारता है.</String>
146 <String Id="MaintenanceTypeDlgRepairDisabledText" Overridable="yes">[ProductName] सुधारा नहीं जा सकता.</String>
147
148 <String Id="MaintenanceWelcomeDlg_Title" Overridable="yes">[ProductName] सेटअप</String>
149 <String Id="MaintenanceWelcomeDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
150 <String Id="MaintenanceWelcomeDlgDescription" Overridable="yes">सेटअप विज़ार्ड आप को [ProductName] सुविधाएँ जिस तरीके से आप के कंप्यूटर पर स्थापित हो उसे बदलने की या उसे आप के कंप्यूटर से निकालने की अनुमति देता है. जारी रखने के लिए अगला क्लिक करें या सेटअप विज़ार्ड से बाहर निकलने के लिए रद्द करें क्लिक करें.</String>
151 <String Id="MaintenanceWelcomeDlgTitle" Overridable="yes">{\WixUI_Font_Bigger} [ProductName] सेटअप विज़ार्ड में स्वागत है</String>
152
153 <String Id="MsiRMFilesInUse_Title" Overridable="yes">[ProductName] सेटअप</String>
154 <String Id="MsiRMFilesInUseBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
155 <String Id="MsiRMFilesInUseText" Overridable="yes">निम्न अनुप्रयोगों द्वारा उपयोग की जाने वाली फ़ाइलों का इस सेटअप से अद्यतन होना आवश्यक है. आप सेटअप विज़ार्ड को इन्हें बंद करने की अनुमति दे सकते हैं और फिर से प्रारंभ करने का प्रयास कर सकते हैं या बाद में मशीन रीबूट कर सकते हैं.</String>
156 <String Id="MsiRMFilesInUseDescription" Overridable="yes">कुछ ऐसी फ़ाइलें अभी उपयोग में हैं, जिन्हें अद्यतन करने की आवश्यकता है.</String>
157 <String Id="MsiRMFilesInUseTitle" Overridable="yes">{\WixUI_Font_Title}फ़ाइलें उपयोग में</String>
158 <String Id="MsiRMFilesInUseUseRM" Overridable="yes">अनुप्रयोग &amp;बंद करें और उन्हें फिर से प्रारंभ करने का प्रयास करें.</String>
159 <String Id="MsiRMFilesInUseDontUseRM" Overridable="yes">अनुप्रयोग बंद &amp;न करें. एक रीबूट की आवश्यकता होगी.</String>
160
161 <String Id="OutOfDiskDlg_Title" Overridable="yes">[ProductName] सेटअप</String>
162 <String Id="OutOfDiskDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
163 <String Id="OutOfDiskDlgText" Overridable="yes">हाइलाइट किए गए वॉल्यूम्स में वर्तमान में चयनित सुविधाओं के लिए पर्याप्त डिस्क स्थान उपलब्ध नहीं है. हाइलाइट किए गए वॉल्यूम्स में से आप कुछ फ़ाइलें निकाल सकते हैं, कम सुविधाएँ स्थापित कर सकते हैं या कोई अन्य गंतव्य ड्राइव का चयन कर सकते हैं.</String>
164 <String Id="OutOfDiskDlgDescription" Overridable="yes">प्रस्थापना के लिए आवश्यक डिस्क स्थान उपलब्ध डिस्क स्थान से ज्यादा है.</String>
165 <String Id="OutOfDiskDlgTitle" Overridable="yes">{\WixUI_Font_Title} डिस्क स्थान कम</String>
166 <String Id="OutOfDiskDlgVolumeList" Overridable="yes">{120}{70}{70}{70}{70}</String>
167
168 <String Id="OutOfRbDiskDlg_Title" Overridable="yes">[ProductName] सेटअप</String>
169 <String Id="OutOfRbDiskDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
170 <String Id="OutOfRbDiskDlgText" Overridable="yes">हाइलाइट किए गए वॉल्यूम्स में वर्तमान में चयनित सुविधाओं के लिए पर्याप्त डिस्क स्थान उपलब्ध नहीं है. हाइलाइट किए गए वॉल्यूम्स में से आप कुछ फ़ाइलें निकाल सकते हैं, कम सुविधाएँ स्थापित कर सकते हैं या कोई अन्य गंतव्य ड्राइव का चयन कर सकते हैं.</String>
171 <String Id="OutOfRbDiskDlgDescription" Overridable="yes">प्रस्थापना के लिए आवश्यक डिस्क स्थान उपलब्ध डिस्क स्थान से ज्यादा है.</String>
172 <String Id="OutOfRbDiskDlgTitle" Overridable="yes">{\WixUI_Font_Title} डिस्क स्थान कम</String>
173 <String Id="OutOfRbDiskDlgVolumeList" Overridable="yes">{120}{70}{70}{70}{70}</String>
174 <String Id="OutOfRbDiskDlgText2" Overridable="yes">वैकल्पिक रूप से, आप installer की रोलबैक कार्यक्षमता अक्षम करने का विकल्प चुन सकते हैं. रोलबैक अक्षम करने से, किसी भी वजह से स्थापना में व्यवधान उत्पन्न होने पर, installer द्वारा आपके कंप्यूटर की मूल स्थिति पुनर्स्थापित की जाना रोका जाता है. आप रोलबैक अक्षम करने का जोखिम उठाना चाहते हैं तो हाँ क्लिक करें.</String>
175
176 <String Id="PrepareDlg_Title" Overridable="yes">[ProductName] सेटअप</String>
177 <String Id="PrepareDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
178 <String Id="PrepareDlgDescription" Overridable="yes">सेट अप विज़ार्ड आपको स्थापना में सहायता करे, तब तक कृपया प्रतीक्षा करें.</String>
179 <String Id="PrepareDlgTitle" Overridable="yes">{\WixUI_Font_Bigger} [ProductName] सेटअप विज़ार्ड में स्वागत है</String>
180
181 <String Id="ProgressDlg_Title" Overridable="yes">[ProductName] सेटअप</String>
182 <String Id="ProgressDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
183 <String Id="ProgressDlgTextInstalling" Overridable="yes">सेटअप विज़ार्ड ने [ProductName] की स्थापना करने तक कृपया प्रतीक्षा करें.</String>
184 <String Id="ProgressDlgTitleInstalling" Overridable="yes">{\WixUI_Font_Title} [ProductName] को स्थापित कर रहा है</String>
185 <String Id="ProgressDlgTextChanging" Overridable="yes">सेटअप विज़ार्ड ने [ProductName] बदलने तक कृपया प्रतीक्षा करें.</String>
186 <String Id="ProgressDlgTitleChanging" Overridable="yes">{\WixUI_Font_Title} [ProductName] बदल रहा है</String>
187 <String Id="ProgressDlgTextRepairing" Overridable="yes">सेटअप विज़ार्ड ने [ProductName] सुधारने तक कृपया प्रतीक्षा करें.</String>
188 <String Id="ProgressDlgTitleRepairing" Overridable="yes">{\WixUI_Font_Title}[ProductName] सुधार रहा है</String>
189 <String Id="ProgressDlgTextRemoving" Overridable="yes">सेटअप विज़ार्ड ने [ProductName] निकालने तक कृपया प्रतीक्षा करें.</String>
190 <String Id="ProgressDlgTitleRemoving" Overridable="yes">{\WixUI_Font_Title} [ProductName] निकाल रहा है</String>
191 <String Id="ProgressDlgTextUpdating" Overridable="yes">कृपया सेटअप विज़ार्ड को [ProductName] को अद्यतन करते समय प्रतीक्षा करें.</String>
192 <String Id="ProgressDlgTitleUpdating" Overridable="yes">{\WixUI_Font_Title}[ProductName] को अद्यतन कर रहा है</String>
193 <String Id="ProgressDlgProgressBar" Overridable="yes">प्रगति पूर्ण</String>
194 <String Id="ProgressDlgStatusLabel" Overridable="yes">स्थिति:</String>
195
196 <String Id="ResumeDlg_Title" Overridable="yes">[ProductName] सेटअप</String>
197 <String Id="ResumeDlgInstall" Overridable="yes">&amp;स्थापित करें</String>
198 <String Id="ResumeDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
199 <String Id="ResumeDlgDescription" Overridable="yes">सेटअप विज़ार्ड आपके कंप्यूटर पर [ProductName] की स्थापना पूरी करेगा. जारी रखने के लिए स्थापित करें क्लिक करें या सेटअप विज़ार्ड से बाहर निकलने के लिए रद्द करें क्लिक करें.</String>
200 <String Id="ResumeDlgTitle" Overridable="yes">{\WixUI_Font_Bigger} [ProductName] सेटअप विज़ार्ड फिर से शुरु हो रहा है</String>
201
202 <String Id="SetupTypeDlg_Title" Overridable="yes">[ProductName] सेटअप</String>
203 <String Id="SetupTypeDlgTypicalButton" Overridable="yes">&amp;सामान्य</String>
204 <String Id="SetupTypeDlgTypicalButtonTooltip" Overridable="yes">सामान्य स्थापना</String>
205 <String Id="SetupTypeDlgCustomButton" Overridable="yes">&amp;कस्टम</String>
206 <String Id="SetupTypeDlgCustomButtonTooltip" Overridable="yes">कस्टम स्थापना</String>
207 <String Id="SetupTypeDlgCompleteButton" Overridable="yes">&amp;पूर्ण</String>
208 <String Id="SetupTypeDlgCompleteButtonTooltip" Overridable="yes">पूर्ण स्थापना</String>
209 <String Id="SetupTypeDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
210 <String Id="SetupTypeDlgTitle" Overridable="yes">{\WixUI_Font_Title}सेटअप प्रकार चुनें</String>
211 <String Id="SetupTypeDlgDescription" Overridable="yes">वह सेटअप प्रकार चुनें को आपकी आवश्यकताओं के लिए श्रेष्ठ हो</String>
212 <String Id="SetupTypeDlgTypicalText" Overridable="yes">सबसे सामान्य प्रोग्राम सुविधाएँ स्थापित करता है. अधिकांश उपयोगकर्ताओं के लिए अनुशंसित.</String>
213 <String Id="SetupTypeDlgCustomText" Overridable="yes">उपयोगकर्ताओं को यह चुनने देता है कि कौन सा प्रोग्राम स्थापित होगा और वे कहाँ स्थापित होंगे. उन्नत उपयोगकर्ताओं के लिए अनुशंसित.</String>
214 <String Id="SetupTypeDlgCompleteText" Overridable="yes">सभी प्रोग्राम स्थापित किए जाएँगे. अधिक डिस्क स्थान की आवश्यकता होती है.</String>
215
216 <String Id="UserExit_Title" Overridable="yes">[ProductName] सेटअप</String>
217 <String Id="UserExitBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
218 <String Id="UserExitTitle" Overridable="yes">{\WixUI_Font_Bigger}[ProductName] सेटअप विज़ार्ड बाधित हुआ था</String>
219 <String Id="UserExitDescription1" Overridable="yes">[ProductName] सेटअप बाधित हो गया था. आपका सिस्टम संशोधित नहीं किया गया है. यह प्रोग्राम बाद में स्थापित करने के लिए कृपया स्थापना फिर से चलाएँ.</String>
220 <String Id="UserExitDescription2" Overridable="yes">सेटअप विज़ार्ड से बाहर निकलने के लिए समाप्ति बटन क्लिक करें.</String>
221
222 <String Id="VerifyReadyDlg_Title" Overridable="yes">[ProductName] सेटअप</String>
223 <String Id="VerifyReadyDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
224 <String Id="VerifyReadyDlgInstall" Overridable="yes">&amp;स्थापित करें</String>
225 <String Id="VerifyReadyDlgInstallText" Overridable="yes">स्थापना प्रारंभ करने के लिए स्थापित करें क्लिक करें. अपनी स्थापना सेटिंग देखने या बदलने के लिए वापस क्लिक करें. विज़ार्ड से बाहर जाने के लिए रद्द करें क्लिक करें.</String>
226 <String Id="VerifyReadyDlgInstallTitle" Overridable="yes">{\WixUI_Font_Title} [ProductName] स्थापित करने के लिए तैयार</String>
227 <String Id="VerifyReadyDlgChange" Overridable="yes">&amp;बदलें</String>
228 <String Id="VerifyReadyDlgChangeText" Overridable="yes">स्थापना प्रारंभ करने के लिए बदलें क्लिक करें. अपनी स्थापना सेटिंग देखने या बदलने के लिए वापस क्लिक करें. विज़ार्ड से बाहर जाने के लिए रद्द करें क्लिक करें.</String>
229 <String Id="VerifyReadyDlgChangeTitle" Overridable="yes">{\WixUI_Font_Title} [ProductName] बदलने के लिए तैयार</String>
230 <String Id="VerifyReadyDlgRepair" Overridable="yes">सु&amp;धारें</String>
231 <String Id="VerifyReadyDlgRepairText" Overridable="yes">[ProductName] की स्थापना सुधारने के लिए सुधारें क्लिक करें. अपनी स्थापना सेटिंग देखने या बदलने के लिए वापस क्लिक करें. विज़ार्ड से बाहर जाने के लिए रद्द करें क्लिक करें.</String>
232 <String Id="VerifyReadyDlgRepairTitle" Overridable="yes">{\WixUI_Font_Title}[ProductName] सुधारने के लिए तैयार</String>
233 <String Id="VerifyReadyDlgRemove" Overridable="yes">&amp;निकालें</String>
234 <String Id="VerifyReadyDlgRemoveText" Overridable="yes">अपने कंप्यूटर से [ProductName] निकालने के लिए निकालें क्लिक करें. अपनी स्थापना सेटिंग देखने या बदलने के लिए वापस क्लिक करें. विज़ार्ड से बाहर जाने के लिए रद्द करें क्लिक करें.</String>
235 <String Id="VerifyReadyDlgRemoveTitle" Overridable="yes">{\WixUI_Font_Title} [ProductName] निकालने के लिए तैयार</String>
236 <String Id="VerifyReadyDlgUpdate" Overridable="yes">&amp;अद्यतन</String>
237 <String Id="VerifyReadyDlgUpdateText" Overridable="yes">अपने कंप्यूटर से [ProductName] को अद्यतन करने के लिए अद्यतन क्लिक करें. अपनी स्थापना सेटिंग देखने या बदलने के लिए वापस क्लिक करें. विज़ार्ड से बाहर जाने के लिए रद्द करें क्लिक करें.</String>
238 <String Id="VerifyReadyDlgUpdateTitle" Overridable="yes">{\WixUI_Font_Title}[ProductName] अद्यतन करने के लिए तैयार</String>
239
240 <String Id="WaitForCostingDlg_Title" Overridable="yes">[ProductName] सेटअप</String>
241 <String Id="WaitForCostingDlgReturn" Overridable="yes">&amp;वापस जाएँ</String>
242 <String Id="WaitForCostingDlgText" Overridable="yes">installer ने आपकी डिस्क स्थान आवश्यकताएँ निर्धारित करना समाप्त करने तक कृपया प्रतीक्षा करें.</String>
243 <String Id="WaitForCostingDlgIcon" Overridable="yes">WixUI_Ico_Exclam</String>
244 <String Id="WaitForCostingDlgIconTooltip" Overridable="yes">विस्मयादिबोधक चिह्न</String>
245
246 <String Id="WelcomeDlg_Title" Overridable="yes">[ProductName] सेटअप</String>
247 <String Id="WelcomeDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
248 <String Id="WelcomeDlgDescription" Overridable="yes">सेटअप विज़ार्ड [ProductName] को आपके कंप्यूटर पर स्थापित करेगा. जारी रखने के लिए अगला क्लिक करें या सेटअप विज़ार्ड से बाहर निकलने के लिए रद्द करें क्लिक करें.</String>
249 <String Id="WelcomeUpdateDlgDescriptionUpdate" Overridable="yes">सेटअप विज़ार्ड [ProductName] को आपके कंप्यूटर पर अद्यतन करेगा. जारी रखने के लिए अगला क्लिक करें या सेटअप विज़ार्ड से बाहर निकलने के लिए रद्द करें क्लिक करें.</String>
250 <String Id="WelcomeDlgTitle" Overridable="yes">{\WixUI_Font_Bigger} [ProductName] सेटअप विज़ार्ड में स्वागत है</String>
251
252 <String Id="WelcomeEulaDlg_Title" Overridable="yes">[ProductName] सेटअप</String>
253 <String Id="WelcomeEulaDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
254 <String Id="WelcomeEulaDlgLicenseAcceptedCheckBox" Overridable="yes">मुझे &amp;लायसेंस एग्रीमेंट की शर्तें स्वीकार हैं</String>
255 <String Id="WelcomeEulaDlgInstall" Overridable="yes">&amp;स्थापित करें</String>
256 <String Id="WelcomeEulaDlgUpdate" Overridable="yes">&amp;अद्यतन</String>
257 <String Id="WelcomeEulaDlgTitle" Overridable="yes">{\WixUI_Font_Title} कृपया [ProductName] लायसेंस एग्रीमेंट पढें</String>
258
259 <String Id="ProgressTextInstallValidate" Overridable="yes">स्‍थापना मान्य कर रहा है</String>
260 <String Id="ProgressTextInstallFiles" Overridable="yes">नई फ़ाइलों की प्रतिलिपि बना रहा है</String>
261 <String Id="ProgressTextInstallFilesTemplate" Overridable="yes">फ़ाइल: [1], निर्देशिका: [9], आकार: [6]</String>
262 <String Id="ProgressTextInstallAdminPackage" Overridable="yes">नेटवर्क स्‍थापना फ़ाइलों की प्रति‍लि‍पि‍ बना रहा है</String>
263 <String Id="ProgressTextInstallAdminPackageTemplate" Overridable="yes">फ़ाइल: [1], निर्देशिका: [9], आकार: [6]</String>
264 <String Id="ProgressTextFileCost" Overridable="yes">कंप्यूटिंग रिक्ति आवश्यकताएँ</String>
265 <String Id="ProgressTextCostInitialize" Overridable="yes">कंप्यूटिंग रिक्ति आवश्यकताएँ</String>
266 <String Id="ProgressTextCostFinalize" Overridable="yes">कंप्यूटिंग रिक्ति आवश्यकताएँ</String>
267 <String Id="ProgressTextCreateShortcuts" Overridable="yes">शॉर्टकट्स बना रहा है</String>
268 <String Id="ProgressTextCreateShortcutsTemplate" Overridable="yes">शॉर्टकट: [1]</String>
269 <String Id="ProgressTextPublishComponents" Overridable="yes">योग्‍य घटकों को प्रकाशि‍त कर रहा है</String>
270 <String Id="ProgressTextPublishComponentsTemplate" Overridable="yes">घटक ID: [1], क्‍वालिफ़ायर: [2]</String>
271 <String Id="ProgressTextPublishFeatures" Overridable="yes">उत्पाद सुविधाएँ प्रकाशित कर रहा है</String>
272 <String Id="ProgressTextPublishFeaturesTemplate" Overridable="yes">सुविधा: [1]</String>
273 <String Id="ProgressTextPublishProduct" Overridable="yes">उत्पाद जानकारी प्रकाशित कर रहा है</String>
274 <String Id="ProgressTextRegisterClassInfo" Overridable="yes">वर्ग सर्वर पंजीकृत कर रहा है</String>
275 <String Id="ProgressTextRegisterClassInfoTemplate" Overridable="yes">वर्ग Id: [1]</String>
276 <String Id="ProgressTextRegisterExtensionInfo" Overridable="yes">एक्सटेंशन सर्वर पंजीकृत कर रहा है</String>
277 <String Id="ProgressTextRegisterExtensionInfoTemplate" Overridable="yes">एक्सटेंशन: [1]</String>
278 <String Id="ProgressTextRegisterMIMEInfo" Overridable="yes">MIME जानकारी पंजीकृत कर रहा है</String>
279 <String Id="ProgressTextRegisterMIMEInfoTemplate" Overridable="yes">MIME सामग्री प्रकार: [1], एक्‍सटेंशन: [2]</String>
280 <String Id="ProgressTextRegisterProgIdInfo" Overridable="yes">प्रोग्राम पहचानकर्ता पंजीकृत कर रहा है</String>
281 <String Id="ProgressTextRegisterProgIdInfoTemplate" Overridable="yes">ProgId: [1]</String>
282 <String Id="ProgressTextAllocateRegistrySpace" Overridable="yes">रजिस्ट्री स्थान आबंटन</String>
283 <String Id="ProgressTextAllocateRegistrySpaceTemplate" Overridable="yes">रिक्त स्थान: [1]</String>
284 <String Id="ProgressTextAppSearch" Overridable="yes">स्थापित किए गए अनुप्रयोग ढूँढ रहा है</String>
285 <String Id="ProgressTextAppSearchTemplate" Overridable="yes">गुण: [1], हस्ताक्षर: [2]</String>
286 <String Id="ProgressTextBindImage" Overridable="yes">निष्पादन योग्य की बाइंडिंग</String>
287 <String Id="ProgressTextBindImageTemplate" Overridable="yes">फ़ाइल: [1]</String>
288 <String Id="ProgressTextCCPSearch" Overridable="yes">योग्यता वाले उत्पाद खोज रहा है</String>
289 <String Id="ProgressTextCreateFolders" Overridable="yes">फ़ोल्डर्स बना रहा है</String>
290 <String Id="ProgressTextCreateFoldersTemplate" Overridable="yes">फ़ोल्डर: [1]</String>
291 <String Id="ProgressTextDeleteServices" Overridable="yes">सेवाएँ हटा रहा है</String>
292 <String Id="ProgressTextDeleteServicesTemplate" Overridable="yes">सेवा: [1]</String>
293 <String Id="ProgressTextDuplicateFiles" Overridable="yes">डुप्लिकेट फ़ाइलें बना रहा है</String>
294 <String Id="ProgressTextDuplicateFilesTemplate" Overridable="yes">फ़ाइल: [1], निर्देशिका: [9], आकार: [6]</String>
295 <String Id="ProgressTextFindRelatedProducts" Overridable="yes">संबंधित अनुप्रयोगों को खोज रहा है</String>
296 <String Id="ProgressTextFindRelatedProductsTemplate" Overridable="yes">अनुप्रयोग मिला: [1]</String>
297 <String Id="ProgressTextInstallODBC" Overridable="yes">ODBC घटक स्थापित कर रहा है</String>
298 <String Id="ProgressTextInstallServices" Overridable="yes">नई सेवाएँ स्थापित कर रहा है</String>
299 <String Id="ProgressTextInstallServicesTemplate" Overridable="yes">सेवा: [2]</String>
300 <String Id="ProgressTextLaunchConditions" Overridable="yes">लॉन्च स्थितियों का मूल्यांकन कर रहा है</String>
301 <String Id="ProgressTextMigrateFeatureStates" Overridable="yes">संबंधि‍त अनुप्रयोगों से सुवि‍धा स्‍थि‍ति‍याँ माइग्रेट कर रहा है</String>
302 <String Id="ProgressTextMigrateFeatureStatesTemplate" Overridable="yes">अनुप्रयोग: [1]</String>
303 <String Id="ProgressTextMoveFiles" Overridable="yes">फ़ाइलें ले जाई जा रही हैं</String>
304 <String Id="ProgressTextMoveFilesTemplate" Overridable="yes">फ़ाइल: [1], निर्देशिका: [9], आकार: [6]</String>
305 <String Id="ProgressTextPatchFiles" Overridable="yes">पैचिंग फ़ाइलें</String>
306 <String Id="ProgressTextPatchFilesTemplate" Overridable="yes">फ़ाइल: [1], निर्देशिका: [2], आकार: [3]</String>
307 <String Id="ProgressTextProcessComponents" Overridable="yes">घटकों का पंजीकरण अद्यतन कर रहा है</String>
308 <String Id="ProgressTextRegisterComPlus" Overridable="yes">COM+ अनुप्रयोग और घटक पंजीकृत कर रहा है</String>
309 <String Id="ProgressTextRegisterComPlusTemplate" Overridable="yes">अनुप्रयोग Id: [1]{{, अनुप्रयोग प्रकार: [2], उपयोगकर्ता: [3], RSN: [4]}}</String>
310 <String Id="ProgressTextRegisterFonts" Overridable="yes">फ़ॉन्‍ट्स पंजीकृत कर रहा है</String>
311 <String Id="ProgressTextRegisterFontsTemplate" Overridable="yes">फ़ॉन्ट: [1]</String>
312 <String Id="ProgressTextRegisterProduct" Overridable="yes">उत्पाद पंजीकृत कर रहा है</String>
313 <String Id="ProgressTextRegisterProductTemplate" Overridable="yes">[1]</String>
314 <String Id="ProgressTextRegisterTypeLibraries" Overridable="yes">प्रकार लायब्रेरीज़ पंजीकृत कर रहा हैं</String>
315 <String Id="ProgressTextRegisterTypeLibrariesTemplate" Overridable="yes">LibID: [1]</String>
316 <String Id="ProgressTextRegisterUser" Overridable="yes">उपयोगकर्ता पंजीकृत किया जा रहा है</String>
317 <String Id="ProgressTextRegisterUserTemplate" Overridable="yes">[1]</String>
318 <String Id="ProgressTextRemoveDuplicateFiles" Overridable="yes">डुप्‍लि‍केट फ़ाइलें नि‍काल रहा है</String>
319 <String Id="ProgressTextRemoveDuplicateFilesTemplate" Overridable="yes">फ़ाइल: [1], निर्देशिका: [9]</String>
320 <String Id="ProgressTextRemoveEnvironmentStrings" Overridable="yes">परिवेश स्‍ट्रिंग्‍स अद्यतन कर रहा है</String>
321 <String Id="ProgressTextRemoveEnvironmentStringsTemplate" Overridable="yes">नाम: [1], मान: [2], क्रिया [3]</String>
322 <String Id="ProgressTextRemoveExistingProducts" Overridable="yes">अनुप्रयोगों को निकाल रहा है</String>
323 <String Id="ProgressTextRemoveExistingProductsTemplate" Overridable="yes">अनुप्रयोग: [1], आदेश पंक्ति: [2]</String>
324 <String Id="ProgressTextRemoveFiles" Overridable="yes">फ़ाइलें निकाल रहा है</String>
325 <String Id="ProgressTextRemoveFilesTemplate" Overridable="yes">फ़ाइल: [1], निर्देशिका: [9]</String>
326 <String Id="ProgressTextRemoveFolders" Overridable="yes">फ़ोल्डर्स निकाल रहा है</String>
327 <String Id="ProgressTextRemoveFoldersTemplate" Overridable="yes">फ़ोल्डर: [1]</String>
328 <String Id="ProgressTextRemoveIniValues" Overridable="yes">INI फ़ाइलों की प्रविष्टियाँ निकाल रहा है</String>
329 <String Id="ProgressTextRemoveIniValuesTemplate" Overridable="yes">फ़ाइल: [1], अनुभाग: [2], कुंजी: [3], मान: [4]</String>
330 <String Id="ProgressTextRemoveODBC" Overridable="yes">ODBC घटक निकाल रहा है</String>
331 <String Id="ProgressTextRemoveRegistryValues" Overridable="yes">सिस्टम रजिस्ट्री मान निकाले जा रहे हैं</String>
332 <String Id="ProgressTextRemoveRegistryValuesTemplate" Overridable="yes">कुंजी: [1], नाम: [2]</String>
333 <String Id="ProgressTextRemoveShortcuts" Overridable="yes">शॉर्टकट्स निकाल रहा है</String>
334 <String Id="ProgressTextRemoveShortcutsTemplate" Overridable="yes">शॉर्टकट: [1]</String>
335 <String Id="ProgressTextRMCCPSearch" Overridable="yes">योग्यता वाले उत्पाद खोज रहा है</String>
336 <String Id="ProgressTextSelfRegModules" Overridable="yes">मॉड्यूल पंजीकृत किए जा रहे हैं</String>
337 <String Id="ProgressTextSelfRegModulesTemplate" Overridable="yes">फ़ाइल: [1], फ़ोल्डर: [2]</String>
338 <String Id="ProgressTextSelfUnregModules" Overridable="yes">मॉड्यूल पंजीकरण रद्द किए जा रहे हैं</String>
339 <String Id="ProgressTextSelfUnregModulesTemplate" Overridable="yes">फ़ाइल: [1], फ़ोल्डर: [2]</String>
340 <String Id="ProgressTextSetODBCFolders" Overridable="yes">ODBC निर्देशिकाएँ प्रारंभ कर रहा है</String>
341 <String Id="ProgressTextStartServices" Overridable="yes">सेवाएँ प्रारंभ की जा रही है</String>
342 <String Id="ProgressTextStartServicesTemplate" Overridable="yes">सेवा: [1]</String>
343 <String Id="ProgressTextStopServices" Overridable="yes">सेवाएँ रोकी जा रही है</String>
344 <String Id="ProgressTextStopServicesTemplate" Overridable="yes">सेवा: [1]</String>
345 <String Id="ProgressTextUnpublishComponents" Overridable="yes">योग्‍य घटकों का प्रकाशन रद्द कर रहा है</String>
346 <String Id="ProgressTextUnpublishComponentsTemplate" Overridable="yes">घटक ID: [1], क्‍वालिफ़ायर: [2]</String>
347 <String Id="ProgressTextUnpublishFeatures" Overridable="yes">उत्पाद सुविधाओं का प्रकाशन रद्द किया जा रहा है</String>
348 <String Id="ProgressTextUnpublishFeaturesTemplate" Overridable="yes">सुविधा: [1]</String>
349 <String Id="ProgressTextUnregisterClassInfo" Overridable="yes">वर्ग सर्वर का पंजीकरण रद्द करें</String>
350 <String Id="ProgressTextUnregisterClassInfoTemplate" Overridable="yes">वर्ग Id: [1]</String>
351 <String Id="ProgressTextUnregisterComPlus" Overridable="yes">COM+ अनुप्रयोगों और घटकों का पंजीकरण रद्द कर रहा है</String>
352 <String Id="ProgressTextUnregisterComPlusTemplate" Overridable="yes">अनुप्रयोग Id: [1]{{, अनुप्रयोग प्रकार: [2]}}</String>
353 <String Id="ProgressTextUnregisterExtensionInfo" Overridable="yes">एक्‍सटेंशन सर्वर्स का पंजीकरण रद्द कर रहा है</String>
354 <String Id="ProgressTextUnregisterExtensionInfoTemplate" Overridable="yes">एक्सटेंशन: [1]</String>
355 <String Id="ProgressTextUnregisterFonts" Overridable="yes">फ़ॉन्‍ट्स का पंजीकरण रद्द कर रहा है</String>
356 <String Id="ProgressTextUnregisterFontsTemplate" Overridable="yes">फ़ॉन्ट: [1]</String>
357 <String Id="ProgressTextUnregisterMIMEInfo" Overridable="yes">MIME जानकारी का पंजीकरण रद्द कर रहा है</String>
358 <String Id="ProgressTextUnregisterMIMEInfoTemplate" Overridable="yes">MIME सामग्री प्रकार: [1], एक्‍सटेंशन: [2]</String>
359 <String Id="ProgressTextUnregisterProgIdInfo" Overridable="yes">प्रोग्राम पहचानकर्ताओं का पंजीकरण रद्द कर रहा है</String>
360 <String Id="ProgressTextUnregisterProgIdInfoTemplate" Overridable="yes">ProgId: [1]</String>
361 <String Id="ProgressTextUnregisterTypeLibraries" Overridable="yes">प्रकार लायब्रेरीज़ का पंजीकरण रद्द कर रहा है</String>
362 <String Id="ProgressTextUnregisterTypeLibrariesTemplate" Overridable="yes">LibID: [1]</String>
363 <String Id="ProgressTextWriteEnvironmentStrings" Overridable="yes">परिवेश स्‍ट्रिंग्‍स अद्यतन कर रहा है</String>
364 <String Id="ProgressTextWriteEnvironmentStringsTemplate" Overridable="yes">नाम: [1], मान: [2], क्रिया [3]</String>
365 <String Id="ProgressTextWriteIniValues" Overridable="yes">INI फ़ाइलों के मान लिख रहा है</String>
366 <String Id="ProgressTextWriteIniValuesTemplate" Overridable="yes">फ़ाइल: [1], अनुभाग: [2], कुंजी: [3], मान: [4]</String>
367 <String Id="ProgressTextWriteRegistryValues" Overridable="yes">सिस्टम रजिस्ट्री मान लिखे जा रहे हैं</String>
368 <String Id="ProgressTextWriteRegistryValuesTemplate" Overridable="yes">कुंजी: [1], नाम: [2], मान: [3]</String>
369 <String Id="ProgressTextAdvertise" Overridable="yes">विज्ञापन अनुप्रयोग</String>
370 <String Id="ProgressTextGenerateScript" Overridable="yes">क्रिया के लिए स्क्रिप्ट कार्रवाई जनरेट कर रहा है:</String>
371 <String Id="ProgressTextGenerateScriptTemplate" Overridable="yes">[1]</String>
372 <String Id="ProgressTextInstallSFPCatalogFile" Overridable="yes">सिस्टम कैटलॉग स्थापित कर रहा है</String>
373 <String Id="ProgressTextInstallSFPCatalogFileTemplate" Overridable="yes">फ़ाइल: [1], निर्भरताएँ: [2]</String>
374 <String Id="ProgressTextMsiPublishAssemblies" Overridable="yes">असेंबली जानकारी प्रकाशि‍त कर रहा है</String>
375 <String Id="ProgressTextMsiPublishAssembliesTemplate" Overridable="yes">अनुप्रयोग संदर्भ:[1], असेंबली नाम:[2]</String>
376 <String Id="ProgressTextMsiUnpublishAssemblies" Overridable="yes">असेंबली जानकारी का प्रकाशन रद्द कर रहा है</String>
377 <String Id="ProgressTextMsiUnpublishAssembliesTemplate" Overridable="yes">अनुप्रयोग संदर्भ:[1], असेंबली नाम:[2]</String>
378 <String Id="ProgressTextRollback" Overridable="yes">क्रिया रोलबैक की जा रही है:</String>
379 <String Id="ProgressTextRollbackTemplate" Overridable="yes">[1]</String>
380 <String Id="ProgressTextRollbackCleanup" Overridable="yes">बैकअप फ़ाइलें निकाली जा रही हैं</String>
381 <String Id="ProgressTextRollbackCleanupTemplate" Overridable="yes">फ़ाइल: [1]</String>
382 <String Id="ProgressTextUnmoveFiles" Overridable="yes">ले जाई गई फ़ाइलें निकाली जा रही हैं</String>
383 <String Id="ProgressTextUnmoveFilesTemplate" Overridable="yes">फ़ाइल: [1], निर्देशिका: [9]</String>
384 <String Id="ProgressTextUnpublishProduct" Overridable="yes">उत्पाद जानकारी का प्रकाशन रद्द कर रहा है</String>
385
386 <String Id="Error0" Overridable="yes">{{गंभीर त्रुटि: }}</String>
387 <String Id="Error1" Overridable="yes">{{त्रुटि [1]. }}</String>
388 <String Id="Error2" Overridable="yes">चेतावनी [1]. </String>
389 <String Id="Error4" Overridable="yes">जानकारी [1]. </String>
390 <String Id="Error5" Overridable="yes">इस पैकेज को स्‍थापित करते समय इंस्‍टॉलर के समक्ष एक अनपेक्षित त्रुटि आई. हो सकता है कि यह इस पैकेज के साथ किसी समस्‍या को दर्शाता हो. त्रुटि कोड [1] है. {{तर्क हैं: [2], [3], [4]}}</String>
391 <String Id="Error7" Overridable="yes">{{डिस्क भरी है: }}</String>
392 <String Id="Error8" Overridable="yes">क्रिया [Time]: [1]. [2]</String>
393 <String Id="Error9" Overridable="yes">[ProductName]</String>
394 <String Id="Error10" Overridable="yes">{[2]}{, [3]}{, [4]}</String>
395 <String Id="Error11" Overridable="yes">संदेश प्रकार: [1], तर्क: [2]</String>
396 <String Id="Error12" Overridable="yes">=== लॉगिंग प्रारंभ हुई: [Date] [Time] ===</String>
397 <String Id="Error13" Overridable="yes">=== लॉगिंग रोकी गई: [Date] [Time] ===</String>
398 <String Id="Error14" Overridable="yes">क्रिया प्रारंभ [Time]: [1].</String>
399 <String Id="Error15" Overridable="yes">क्रिया समाप्त [Time]: [1]. वापसी मूल्य [2].</String>
400 <String Id="Error16" Overridable="yes">शेष समय: {[1] मिनट }{[2] सेकंड}</String>
401 <String Id="Error17" Overridable="yes">स्मृति समाप्त. पुनर्प्रयास करने से पहले अन्य अनुप्रयोग बंद करें.</String>
402 <String Id="Error18" Overridable="yes">इंस्टॉलर अब प्रतिसाद नहीं दे रहा है.</String>
403 <String Id="Error19" Overridable="yes">इंस्‍टॉलर पूर्ण करने से पहले बंद हो गया.</String>
404 <String Id="Error20" Overridable="yes">जब तक Windows [ProductName] को कॉन्फ़िगर करता है, कृपया प्रतीक्षा करें</String>
405 <String Id="Error21" Overridable="yes">आवश्यक जानकारी एकत्र की जा रही है...</String>
406 <String Id="Error22" Overridable="yes">इस अनुप्रयोग के पुराने संस्करण निकाले जा रहे हैं...</String>
407 <String Id="Error23" Overridable="yes">इस अनुप्रयोग के पुराने संस्करणों को निकालने की तैयारी की जा रही है...</String>
408 <String Id="Error32" Overridable="yes">{[ProductName] }सेटअप सफलतापूर्वक पूर्ण.</String>
409 <String Id="Error33" Overridable="yes">{[ProductName] }सेटअप विफल रहा.</String>
410 <String Id="Error1101" Overridable="yes">फ़ाइल से पढ़ने में त्रुटि: [2]. {{ सिस्टम त्रुटि [3].}} सत्यापित करें कि फ़ाइल मौजूद है और आप इस तक पहुँच सकते हैं.</String>
411 <String Id="Error1301" Overridable="yes">फ़ाइल '[2]' नहीं बना सकता. इस नाम की निर्देशिका पहले से मौजूद है. स्थापना रद्द करें और किसी दूसरे स्थान पर स्थापना का प्रयास करें.</String>
412 <String Id="Error1302" Overridable="yes">कृपया डिस्क: [2] डालें</String>
413 <String Id="Error1303" Overridable="yes">इस निर्देशिका पर पहुँचने के लिए installer को अपर्याप्त विशेषाधिकार हैं: [2]. स्थापना जारी नहीं रखी जा सकती. व्यवस्थापक के रूप में लॉग-ऑन करें या अपने सिस्टम व्यवस्थापक से संपर्क करें.</String>
414 <String Id="Error1304" Overridable="yes">फ़ाइल: [2] में लिखने में त्रुटि. पुष्टि करें कि उस निर्देशिका तक आपकी पहुँच है.</String>
415 <String Id="Error1305" Overridable="yes">फ़ाइल: [2] से पढ़ने में त्रुटि. {{ सिस्टम त्रुटि [3].}} सत्यापित करें कि फ़ाइल मौजूद है और आप इस तक पहुँच सकते हैं.</String>
416 <String Id="Error1306" Overridable="yes">फ़ाइल '[2]' तक अन्य अनुप्रयोग की अनन्य पहुँच है. कृपया अन्य सभी अनुप्रयोगों को बंद करें, तब 'पुनर्प्रयास करें' क्लिक करें.</String>
417 <String Id="Error1307" Overridable="yes">फ़ाइल [2] स्थापित करने के लिए पर्याप्त डिस्क स्थान नहीं है. कुछ डिस्क स्थान रिक्त करें और 'पुनर्प्रयास करें' क्लिक करें, या बाहर निकलने के लिए 'रद्द करें' क्लिक करें.</String>
418 <String Id="Error1308" Overridable="yes">स्रोत फ़ाइल मिली नहीं: [2]. पुष्टि करें कि फ़ाइल मौजूद है और आप इस तक पहुँच सकते हैं.</String>
419 <String Id="Error1309" Overridable="yes">फ़ाइल से पढ़ने में त्रुटि: [3]. {{ सिस्‍टम त्रुटि [2].}} सत्यापित करें कि फ़ाइल मौजूद है और आप उस तक पहुँच प्राप्त कर सकते हैं.</String>
420 <String Id="Error1310" Overridable="yes">फ़ाइल में लिखने में त्रुटि: [3]. {{ सिस्‍टम त्रुटि [2].}} सत्यापित करें कि आपको उस निर्देशिका तक पहुँच प्राप्त है.</String>
421 <String Id="Error1311" Overridable="yes">स्रोत फ़ाइल नहीं मिली{{(cabinet)}}: [2]. पुष्टि करें कि फ़ाइल मौजूद है और आप इस तक पहुँच सकते हैं.</String>
422 <String Id="Error1312" Overridable="yes">निर्देशिका '[2]' नहीं बना सकता. इस नाम की कोई फ़ाइल पहले से मौजूद है. कृपया फ़ाइल का नाम बदलें या उसे निकालें और 'पुनर्प्रयास करें' क्लिक करें या बाहर निकलने के लिए 'रद्द करें' क्लिक करें.</String>
423 <String Id="Error1313" Overridable="yes">वॉल्यूम [2] वर्तमान में अनुपलब्ध है. कृपया किसी अन्य का चयन करें.</String>
424 <String Id="Error1314" Overridable="yes">निर्दिष्ट पथ '[2]' अनुपलब्ध है.</String>
425 <String Id="Error1315" Overridable="yes">निर्दिष्ट फ़ोल्‍डर में लिखने में असमर्थ: [2].</String>
426 <String Id="Error1316" Overridable="yes">फ़ाइल से पढ़ने का प्रयास करते समय कोई नेटवर्क त्रुटि उत्‍पन्‍न हुई: [2]</String>
427 <String Id="Error1317" Overridable="yes">निर्देशिका बनाने का प्रयास करते समय त्रुटि उत्‍पन्‍न हुई: [2]</String>
428 <String Id="Error1318" Overridable="yes">निर्देशिका बनाने का प्रयास करते समय एक नेटवर्क त्रुटि उत्‍पन्‍न हुई: [2]</String>
429 <String Id="Error1319" Overridable="yes">स्रोत फ़ाइल केबिनेट खोलने का प्रयास करते समय एक नेटवर्क त्रुटि उत्‍पन्‍न हुई: [2]</String>
430 <String Id="Error1320" Overridable="yes">निर्दिष्ट पथ बहुत लंबा है: [2]</String>
431 <String Id="Error1321" Overridable="yes">इंस्‍टॉलर के पास इस फ़ाइल को संशोधित करने के अपर्याप्त अधिकार हैं: [2].</String>
432 <String Id="Error1322" Overridable="yes">फ़ोल्डर पथ '[2]' का कुछ भाग अमान्य है. यह रिक्त है या उसकी लंबाई सिस्टम द्वारा अनुमतित लंबाई से अधिक है.</String>
433 <String Id="Error1323" Overridable="yes">फ़ोल्‍डर पथ '[2]' में ऐसे शब्‍द हैं जो फ़ोल्‍डर पथों के लिए मान्‍य नहीं हैं.</String>
434 <String Id="Error1324" Overridable="yes">फ़ोल्‍डर पथ '[2]' में अमान्‍य वर्ण है.</String>
435 <String Id="Error1325" Overridable="yes">'[2]' मान्‍य छोटा फ़ाइल नाम नहीं है.</String>
436 <String Id="Error1326" Overridable="yes">फ़ाइल सुरक्षा प्राप्त करने में त्रुटि: [3] GetLastError: [2]</String>
437 <String Id="Error1327" Overridable="yes">अमान्य ड्राइव: [2]</String>
438 <String Id="Error1328" Overridable="yes">फ़ाइल[2] को पैच लागू करने में त्रुटि. यह संभवतः अन्य तरीकों से अद्यतित की गई है, और अब इस पैच से संशोधित नहीं की जा सकती. अधिक जानकारी के लिए आपके पैच विक्रेता से संपर्क करें. {{सिस्टम त्रुटि: [3]}}</String>
439 <String Id="Error1329" Overridable="yes">आवश्यक फ़ाइल स्थापित नहीं की जा सकती क्योंकि कैबिनेट फ़ाइल [2] डिजिटल हस्ताक्षरित नहीं है. यह शायद कैबिनेट फ़ाइल दूषित होने का संकेत करेगा.</String>
440 <String Id="Error1330" Overridable="yes">आवश्यक फ़ाइल स्थापित नहीं की जा सकती क्योंकि कैबिनेट फ़ाइल [2] के डिजिटल हस्ताक्षर अमान्य हैं. यह शायद कैबिनेट फ़ाइल दूषित होने का संकेत होगा. {{ WinVerifyTrust द्वारा त्रुटि [3] दी गई.}}</String>
441 <String Id="Error1331" Overridable="yes">फ़ाइल की सही रूप में प्रतिलिपि बनाने [2] में विफल: CRC त्रुटि.</String>
442 <String Id="Error1332" Overridable="yes">फ़ाइल को सही रूप में ले जाने [2] में विफल: CRC त्रुटि.</String>
443 <String Id="Error1333" Overridable="yes">फ़ाइल को सही रूप में पैच करने [2] में विफल: CRC त्रुटि.</String>
444 <String Id="Error1334" Overridable="yes">फ़ाइल '[2]' स्‍थापित नहीं की जा सकती क्‍योंकि फ़ाइल केबिनेट फ़ाइल '[3]' में नहीं मिल सकती. संभवत: यह किसी नेटवर्क, CD-ROM से पढ़ने मे हुई त्रुटि, या इस पैकेज की किसी समस्‍या को दर्शाता है.</String>
445 <String Id="Error1335" Overridable="yes">इस स्थापना के लिए आवश्‍यक केबिनेट फ़ाइल '[2]' दूषित हो गई है और उपयोग नहीं की जा सकती. संभवत: यह किसी नेटवर्क, CD-ROM से पढ़ने मे हुई त्रुटि, या इस पैकेज की किसी समस्‍या को दर्शाता है.</String>
446 <String Id="Error1336" Overridable="yes">इस स्‍थापना को पूरा करने में आवश्‍यक अस्‍थायी फ़ाइल को बनाते हुए एक त्रुटि आई थी.{{ फ़ोल्‍डर: [3]. सिस्‍टम त्रुटि कोड: [2]}}</String>
447 <String Id="Error1401" Overridable="yes">कुंजी नहीं बना सका: [2]. {{ सिस्‍टम त्रुटि [3].}} सत्यापित करें कि आपके पास उस कुंजी तक पर्याप्त पहुँच है, या अपने समर्थन कर्मचारी से संपर्क करें. </String>
448 <String Id="Error1402" Overridable="yes">कुंजी नहीं खोल सका: [2]. {{ सिस्‍टम त्रुटि [3].}} सत्यापित करें कि आपके पास उस कुंजी तक पर्याप्त पहुँच है, या अपने समर्थन कर्मचारी से संपर्क करें. </String>
449 <String Id="Error1403" Overridable="yes">कुंजी [3] से मान [2] हटा नहीं सका. {{ सिस्‍टम त्रुटि [4].}} सत्यापित करें कि आपके पास उस कुंजी तक पर्याप्त पहुँच है, या अपने समर्थन कर्मचारी से संपर्क करें. </String>
450 <String Id="Error1404" Overridable="yes">कुंजी [2] हटा नहीं सका. {{ सिस्‍टम त्रुटि [3].}} सत्यापित करें कि आपके पास उस कुंजी तक पर्याप्त पहुँच है, या अपने समर्थन कर्मचारी से संपर्क करें. </String>
451 <String Id="Error1405" Overridable="yes">कुंजी [3] से मान [2] पढ़ नहीं सका. {{ सिस्‍टम त्रुटि [4].}} सत्यापित करें कि आपके पास उस कुंजी तक पर्याप्त पहुँच है, या अपने समर्थन कर्मचारी से संपर्क करें. </String>
452 <String Id="Error1406" Overridable="yes">कुंजी [3] में मान [2] नहीं लिख सका. {{ सिस्‍टम त्रुटि [4].}} सत्यापित करें कि आपके पास उस कुंजी तक पर्याप्त पहुँच है, या अपने समर्थन कर्मचारी से संपर्क करें.</String>
453 <String Id="Error1407" Overridable="yes">कुंजी [2] के लिए मान नाम प्राप्त नहीं हो सके. {{ सिस्‍टम त्रुटि [3].}} सत्यापित करें कि आपके पास उस कुंजी तक पर्याप्त पहुँच है, या अपने समर्थन कर्मचारी से संपर्क करें.</String>
454 <String Id="Error1408" Overridable="yes">कुंजी [2] के लिए उप कुंजी नाम प्राप्त नहीं हो सके. {{ सिस्‍टम त्रुटि [3].}} सत्यापित करें कि आपके पास उस कुंजी तक पर्याप्त पहुँच है, या अपने समर्थन कर्मचारी से संपर्क करें.</String>
455 <String Id="Error1409" Overridable="yes">कुंजी [2] के लिए सुरक्षा जानकारी पढ़ी नहीं जा सकी. {{ सिस्‍टम त्रुटि [3].}} सत्यापित करें कि आपके पास उस कुंजी तक पर्याप्त पहुँच है, या अपने समर्थन कर्मचारी से संपर्क करें.</String>
456 <String Id="Error1410" Overridable="yes">उपलब्‍ध रजिस्‍ट्री स्‍थान में वृद्धि नहीं कर सका. रिक्त रजिस्‍ट्री स्‍थान का [2] KB इस अनुप्रयोग की स्‍थापना के लिए आवश्‍यक है.</String>
457 <String Id="Error1500" Overridable="yes">एक अन्‍य स्‍थापना जारी है. आपको यह स्‍थापना जारी करने से पहले वह स्‍थापना पूर्ण करनी होगी.</String>
458 <String Id="Error1501" Overridable="yes">सुरक्षित डेटा एक्‍सेस करने में त्रुटि. कृपया सुनिश्चित करें कि Windows Installer ठीक तरह से कॉन्‍फ़िगर किया गया है और पुन: स्‍थापित करने का प्रयास करें.</String>
459 <String Id="Error1502" Overridable="yes">उत्पाद '[3]' के लिए उपयोगकर्ता '[2]' ने पहले एक स्थापना प्रारंभ की है. उस उपयोगकर्ता को उस उत्पाद का उपयोग करने से पहले वह स्थापना चलानी होगी. अब आपकी वर्तमान स्थापना जारी रहेगी.</String>
460 <String Id="Error1503" Overridable="yes">उत्पाद '[3]' के लिए उपयोगकर्ता '[2]' ने पहले एक स्थापना प्रारंभ की है. उस उपयोगकर्ता को उस उत्पाद का उपयोग करने से पहले वह स्थापना फिर से चलानी होगी.</String>
461 <String Id="Error1601" Overridable="yes">डिस्क में जगह नहीं है -- वॉल्यूम: '[2]'; आवश्यक जगह: [3] KB; उपलब्ध जगह: [4] KB. कुछ डिस्क जगह रिक्त करें और पुनर्प्रयास करें.</String>
462 <String Id="Error1602" Overridable="yes">क्या आप वाकई रद्द करना चाहते हैं?</String>
463 <String Id="Error1603" Overridable="yes">फ़ाइल [2][3] उपयोग की जा रही है{ निम्न प्रक्रिया द्वारा: नाम: [4], Id: [5], विंडो शीर्षक: '[6]'}. वह अनुप्रयोग बंद करें और पुनर्प्रयास करें.</String>
464 <String Id="Error1604" Overridable="yes">उत्पाद '[2]' पहले से स्थापित है, जिससे इस उत्पाद की स्थापना में रुकावट आ रही है. दोनों उत्पाद असंगत हैं.</String>
465 <String Id="Error1605" Overridable="yes">पुनर्प्राप्ति सक्षम रहते हुए स्‍थापना जारी रखने के लिए वॉल्‍यूम '[2]' पर पर्याप्त डिस्‍क स्‍थान नहीं है. [3] KB आवश्‍यक है, लेकिन केवल [4] KB ही उपलब्‍ध है. पुनर्प्राप्ति जानकारी को सहेजे बिना स्‍थापना को जारी रखने के लिए ध्‍यान न दें क्‍लिक करें, पुन: उपलब्‍ध स्‍थान की जाँच करने के लिए, पुन: प्रयास करें क्‍लिक करें, या स्‍थापना से बाहर निकलने के लिए रद्द करें क्लिक करें.</String>
466 <String Id="Error1606" Overridable="yes">नेटवर्क स्थान [2] तक नहीं पहुँच सका.</String>
467 <String Id="Error1607" Overridable="yes">स्थापना जारी रखने से पहले निम्न अनुप्रयोग बंद किए जाने चाहिए:</String>
468 <String Id="Error1608" Overridable="yes">इस उत्‍पाद की स्‍थापना के लिए मशीन पर कोई भी पूर्व में स्‍थापित संगत उत्‍पाद नहीं मिला.</String>
469 <String Id="Error1609" Overridable="yes">सुरक्षा सेटिंग लागू करते समय त्रुटि आई. [2] मान्‍य उपयोगकर्ता या समूह नहीं है. यह पैकेज की कोई समस्‍या हो सकती है, या नेटवर्क पर किसी डोमेन नियंत्रण से कनेक्‍ट करने में समस्‍या हो सकती है. अपने नेटवर्क कनेक्‍शन की जाँच करें और पुन: प्रयास करें क्‍लिक करें, या स्‍थापना समाप्त करने के लिए रद्द करें क्‍लिक करें. {{उपयोगकर्ता का SID ढूँढने में असमर्थ, सिस्‍टम त्रुटि [3]}}</String>
470 <String Id="Error1701" Overridable="yes">कुंजी [2] मान्य नहीं है. पुष्टि करें कि आप ने ठीक कुंजी दर्ज की है.</String>
471 <String Id="Error1702" Overridable="yes">[2] में किए गए कॉन्‍फ़िगरेशन परिवर्तनों को प्रभावी बनाने के लिए, आपको अपना सिस्‍टम पुनरारंभ करना होगा. अभी पुनरारंभ करने के लिए हाँ या यदि आप बाद में मैन्‍युअली पुनरारंभ करना चाहते हैं तो नहीं क्‍लिक करें.</String>
472 <String Id="Error1703" Overridable="yes">[2] में किए गए कॉन्‍फ़िगरेशन परिवर्तनों को प्रभावी बनाने के लिए, आपको अपना सिस्‍टम पुनरारंभ करना होगा. अभी पुनरारंभ करने के लिए हाँ या यदि आप बाद में मैन्‍युअली पुनरारंभ करना चाहते हैं तो नहीं क्‍लिक करें.</String>
473 <String Id="Error1704" Overridable="yes">[2] की कोई स्थापना वर्तमान में निलंबित है. जारी रखने के लिए आप को उस स्थापना द्वारा किए गए परिवर्तन पूर्ववत् करना आवश्यक है. क्या आप यह परिवर्तन पूर्ववत् करना चाहते हैं?</String>
474 <String Id="Error1705" Overridable="yes">इस उत्पाद के लिए एक पिछली स्थापना प्रगति पर है. जारी रखने के लिए आप को उस स्थापना द्वारा किए गए परिवर्तन पूर्ववत् करना आवश्यक है. क्या आप यह परिवर्तन पूर्ववत् करना चाहते हैं?</String>
475 <String Id="Error1706" Overridable="yes">उत्‍पाद [2] के लिए स्‍थापना पेकैज नहीं मिल सकता. स्‍थापना पेकैज '[3]' की मान्‍य प्रति का उपयोग करके पुन: स्‍थापना का प्रयास करें.</String>
476 <String Id="Error1707" Overridable="yes">स्‍थापना सफलतापूर्वक पूर्ण.</String>
477 <String Id="Error1708" Overridable="yes">स्‍थापना विफल.</String>
478 <String Id="Error1709" Overridable="yes">उत्पाद: [2] -- [3]</String>
479 <String Id="Error1710" Overridable="yes">आप या तो अपने कंप्‍यूटर को उसकी पूर्व स्‍थिति में पुनर्स्‍थापित कर सकते हैं या स्‍थापना को बाद में जारी रख सकते हैं. क्‍या आप पुनर्स्‍थापित करना चाहेंगे?</String>
480 <String Id="Error1711" Overridable="yes">स्थापना जानकारी डिस्क पर लिखते समय कोई त्रुटि आई. जाँचें कि पर्याप्त डिस्क स्थान उपलब्ध है, और पुनर्प्रयास करें क्लिक करें, या स्थापना बंद करने के लिए रद्द करें क्लिक करें.</String>
481 <String Id="Error1712" Overridable="yes">आपके कंप्यूटर को इसकी पिछली स्थिति पर पुनर्स्थापित करने के लिए आवश्यक एक या अधिक फ़ाइलें नहीं मिल सकी. पुनर्स्थापना संभव नहीं होगी.</String>
482 <String Id="Error1713" Overridable="yes">[2] उसके आवश्यक उत्पादों में से कोई एक स्थापित नहीं कर सकता. अपने तकनीकी सहायता समूह से संपर्क करें. {{सिस्टम त्रुटि: [3].}}</String>
483 <String Id="Error1714" Overridable="yes">[2] का पुराना संस्करण निकाला नहीं जा सकता. अपने तकनीकी सहायता समूह से संपर्क करें. {{सिस्टम त्रुटि [3].}}</String>
484 <String Id="Error1715" Overridable="yes">स्थापित [2]</String>
485 <String Id="Error1716" Overridable="yes">कॉन्फ़िगर किया गया [2]</String>
486 <String Id="Error1717" Overridable="yes">निकाला गया [2]</String>
487 <String Id="Error1718" Overridable="yes">फ़ाइल [2] डिजिटल हस्‍ताक्षर नीति द्वारा अस्वीकृत कर दी गई.</String>
488 <String Id="Error1719" Overridable="yes">Windows Installer सेवा एक्‍सेस नहीं की जा सकी. यदि आप Windows को सुरक्षित मोड में चला रहें हैं, या यदि Windows Installer ठीक तरह से स्‍थापित नहीं है, तो ऐसा हो सकता है. सहायता के लिए अपने समर्थन कर्मचारी से संपर्क करें.</String>
489 <String Id="Error1720" Overridable="yes">Windows Installer पैकेज में कोई समस्‍या है. यह स्थापना पूरी करने के लिए आवश्यक स्क्रिप्ट चलाया नहीं जा सका. अपने समर्थन कर्मचारी या पैकेज विक्रेता से संपर्क करें. {{कस्टम क्रिया [2] स्क्रिप्ट त्रुटि [3], [4]: [5] पंक्ति [6], स्तंभ [7], [8] }}</String>
490 <String Id="Error1721" Overridable="yes">Windows Installer पैकेज में कोई समस्‍या है. इस स्‍थापना को पूर्ण करने के लिए आवश्‍यक प्रोग्राम चलाया नहीं जा सका. अपने समर्थन कर्मचारी या पैकेज विक्रेता से संपर्क करें. {{क्रिया: [2] स्‍थान: [3], आदेश: [4] }}</String>
491 <String Id="Error1722" Overridable="yes">Windows Installer पैकेज में कोई समस्‍या है. सेटअप के भाग के रूप में चलाया गया प्रोग्राम अपेक्षित जैसे पूरा नहीं हुआ. अपने समर्थन कर्मचारी या पैकेज विक्रेता से संपर्क करें. {{क्रिया [2], स्थान: [3], आदेश: [4] }}</String>
492 <String Id="Error1723" Overridable="yes">Windows Installer पैकेज में कोई समस्‍या है. यह स्थापना पूरी करने के लिए आवश्यक DLL चलाई नहीं जा सकी. अपने समर्थन कर्मचारी या पैकेज विक्रेता से संपर्क करें. {{क्रिया [2], प्रविष्टि: [3], लायब्रेरी: [4] }}</String>
493 <String Id="Error1724" Overridable="yes">निकालना सफलतापूर्वक पूर्ण.</String>
494 <String Id="Error1725" Overridable="yes">निकालना विफल.</String>
495 <String Id="Error1726" Overridable="yes">विज्ञापन सफलतापूर्वक पूर्ण.</String>
496 <String Id="Error1727" Overridable="yes">विज्ञापन विफल.</String>
497 <String Id="Error1728" Overridable="yes">कॉन्‍फ़िगरेशन सफलतापूर्वक पूर्ण.</String>
498 <String Id="Error1729" Overridable="yes">कॉन्‍फ़िगरेशन विफल.</String>
499 <String Id="Error1730" Overridable="yes">इस अनुप्रयोग को निकालने के लिए आपका व्‍यवस्‍थापक होना आवश्‍यक है. इस अनुप्रयोग को निकालने के लिए, आप व्‍यवस्‍थापक के रूप में लॉग ऑन कर सकते हैं, या सहायता के लिए अपने तकनीकी सहायता समूह से संपर्क कर सकते हैं.</String>
500 <String Id="Error1731" Overridable="yes">उत्पाद [2] के लिए होने वाला स्रोत स्थापना पैकेज क्लाइंट पैकेज के साथ सिंक से बाहर है. स्थापना पैकेज '[3]' की मान्य प्रतिलिपि का उपयोग कर के फिर से स्थापना का प्रयास करें.</String>
501 <String Id="Error1732" Overridable="yes">[2] की स्थापना पूरी करने के लिए, आप को कंप्यूटर का पुनर्प्रारंभ करना होगा. वर्तमान में अन्य उपयोगकर्ता इस कंप्यूटर पर लॉग्ड्ऑन हैं, और पुनर्प्रारंभ करने से उनका कार्य नष्ट हो जाएगा. क्या आप अभी पुनर्स्थापना करना चाहते हैं?</String>
502 <String Id="Error1801" Overridable="yes">पथ [2] मान्य नहीं है. कृपया कोई मान्य पथ का निर्देश करें.</String>
503 <String Id="Error1802" Overridable="yes">स्मृति समाप्त. पुनर्प्रयास करने से पहले अन्य अनुप्रयोग बंद करें.</String>
504 <String Id="Error1803" Overridable="yes">ड्राइव [2] में कोई डिस्‍क नहीं है. कृपया डिस्‍क डालें और पुन: प्रयास करें क्‍लिक करें, या पहले चयनित वॉल्‍यूम पर वापस जाने के लिए रद्द करें क्‍लिक करें.</String>
505 <String Id="Error1804" Overridable="yes">ड्राइव [2] में कोई डिस्‍क नहीं है. कृपया डिस्‍क डालें और पुन: प्रयास करें क्‍लिक करें, या ब्राउज़ करें संवाद पर वापस जाने के लिए रद्द करें क्‍लिक करें और भिन्‍न वॉल्‍यूम का चयन करें.</String>
506 <String Id="Error1805" Overridable="yes">फ़ोल्डर [2] मौजूद नहीं है. कृपया किसी मौजूदा फ़ोल्डर का कोई पथ दर्ज करें.</String>
507 <String Id="Error1806" Overridable="yes">आपके पास फ़ोल्‍डर पढ़ने के लिए अपर्याप्त विशेषाधिकार हैं.</String>
508 <String Id="Error1807" Overridable="yes">स्थापना के लिए कोई मान्य गंतव्य फ़ोल्डर निर्धारित नहीं किया जा सका.</String>
509 <String Id="Error1901" Overridable="yes">स्रोत स्‍थापना डेटाबेस से पढ़ने के प्रयास में त्रुटि: [2].</String>
510 <String Id="Error1902" Overridable="yes">रीबूट की कार्रवाई शेड्यूल कर रहा है: फ़ाइल का नाम [2] से [3] में बदल रहा है. कार्रवाई पूर्ण करने के लिए रीबूट करना आवश्‍यक है.</String>
511 <String Id="Error1903" Overridable="yes">रीबूट की कार्रवाई शेड्यूल कर रहा है: फ़ाइल [2] हटा रहा है. कार्रवाई पूर्ण करने के लिए रीबूट करना आवश्‍यक है.</String>
512 <String Id="Error1904" Overridable="yes">मॉड्यूल [2] पंजीकृत होने में विफल. HRESULT [3]. अपने समर्थन कर्मचारी से संपर्क करें.</String>
513 <String Id="Error1905" Overridable="yes">मॉड्यूल [2] का पंजीकरण निरस्त होने में विफल. HRESULT [3]. अपने समर्थन कर्मचारी से संपर्क करें.</String>
514 <String Id="Error1906" Overridable="yes">पैकेज [2] कैश करने में विफल. त्रुटि: [3]. अपने समर्थन कर्मचारी से संपर्क करें.</String>
515 <String Id="Error1907" Overridable="yes">फ़ॉन्ट [2] पंजीकृत नहीं किया जा सका. पुष्टि करें कि आपके पास फ़ॉन्ट स्थापित करने के लिए पर्याप्त अनुमतियाँ हैं, और सिस्टम इस फ़ॉन्ट का समर्थन करता है.</String>
516 <String Id="Error1908" Overridable="yes">फ़ॉन्‍ट [2] का पंजीकरण रद्द न कर सका. सत्यापित करें कि आपके पास फ़ॉन्‍ट्‍स निकालने की पर्याप्त अनुमतियाँ हैं.</String>
517 <String Id="Error1909" Overridable="yes">शॉर्टकट [2] नहीं बना सका. सत्यापित करें कि गंतव्‍य फ़ोल्‍डर मौजूद है और आप उस तक पहुँच सकते हैं.</String>
518 <String Id="Error1910" Overridable="yes">शॉर्टकट [2] नहीं निकाल सका. सत्यापित करें कि शॉर्टकट फ़ाइल मौजूद हैं और आप उस तक पहुँच सकते हैं.</String>
519 <String Id="Error1911" Overridable="yes">फ़ाइल [2] के लिए प्रकार लायब्रेरी पंजीकृत नहीं की जा सकी. अपने समर्थन कर्मचारी से संपर्क करें.</String>
520 <String Id="Error1912" Overridable="yes">फ़ाइल [2] के लिए प्रकार लायब्रेरी का पंजीकरण निरस्त नहीं किया जा सका. अपने समर्थन कर्मचारी से संपर्क करें.</String>
521 <String Id="Error1913" Overridable="yes">ini फ़ाइल [2][3] अद्यतन नहीं की जा सकी. पुष्टि करें कि फ़ाइल मौजूद है और आप इस तक पहुँच सकते हैं.</String>
522 <String Id="Error1914" Overridable="yes">रीबूट पर फ़ाइल [2] द्वारा फ़ाइल [3] का बदलना शेड्यूल नहीं किया जा सका. पुष्टि करें कि आपको फ़ाइल [3] पर लेखन की अनुमतियाँ हैं.</String>
523 <String Id="Error1915" Overridable="yes">ODBC ड्राइवर प्रबंधक निकालने में त्रुटि, ODBC त्रुटि [2]: [3]. अपने समर्थन कर्मचारी से संपर्क करें.</String>
524 <String Id="Error1916" Overridable="yes">ODBC ड्राइवर प्रबंधक स्‍थापित करने में त्रुटि, ODBC त्रुटि [2]: [3]. अपने समर्थन कर्मचारी से संपर्क करें.</String>
525 <String Id="Error1917" Overridable="yes">ODBC ड्राइवर निकालने में त्रुटि: [4], ODBC त्रुटि [2]: [3]. सत्यापित करें कि आपके पास ODBC ड्राइवर्स निकालने के लिए पर्याप्त विशेषाधिकार है.</String>
526 <String Id="Error1918" Overridable="yes">ODBC ड्राइवर स्‍थापित करने में त्रुटि: [4], ODBC त्रुटि [2]: [3].सत्यापित करें कि फ़ाइल [4] मौजूद हैं और आप उस तक पहुँच सकते हैं.</String>
527 <String Id="Error1919" Overridable="yes">ODBC डेटा स्रोत कॉन्‍फ़िगर करने में त्रुटि: [4], ODBC त्रुटि [2]: [3]. सत्यापित करें कि फ़ाइल [4] मौजूद हैं और आप उस तक पहुँच सकते हैं.</String>
528 <String Id="Error1920" Overridable="yes">सेवा '[2]' ([3]) प्रारंभ होने में विफल. पुष्टि करें कि आपको सिस्टम सेवाएँ प्रारंभ करने के लिए पर्याप्त विशेषाधिकार हैं.</String>
529 <String Id="Error1921" Overridable="yes">सेवा '[2]' ([3])रोकी नहीं जा सकी. पुष्टि करें कि आपको सिस्टम सेवाएँ रोकने के लिए पर्याप्त विशेषाधिकार हैं.</String>
530 <String Id="Error1922" Overridable="yes">सेवा '[2]' ([3]) निकाली नहीं जा सकी. पुष्टि करें कि आपको सिस्टम सेवाएँ निकालने के लिए पर्याप्त विशेषाधिकार हैं.</String>
531 <String Id="Error1923" Overridable="yes">सेवा '[2]' ([3]) स्थापित नहीं की जा सकी. पुष्टि करें कि आपको सिस्टम सेवाएँ स्थापित करने के लिए पर्याप्त विशेषाधिकार हैं.</String>
532 <String Id="Error1924" Overridable="yes">वातावरणीय चर '[2]' का अद्यतन नहीं किया जा सका. पुष्टि करें कि आप को वातावरणीय चर संशोधित करने के लिए पर्याप्त विशेषाधिकार हैं.</String>
533 <String Id="Error1925" Overridable="yes">आप को मशीन के सभी उपयोगकर्ताओं के लिए यह स्थापना पूरी करने के लिए पर्याप्त विशेषाधिकार नहीं हैं. व्यवस्थापक के रूप में लॉगइन करें और फिर इस स्थापना का पुनर्प्रयास करें.</String>
534 <String Id="Error1926" Overridable="yes">फ़ाइल '[3]' के लिए फ़ाइल सुरक्षा सेट नहीं की जा सकी. त्रुटि: [2]. पुष्टि करें कि आपको इस फ़ाइल की सुरक्षा अनुमतियाँ संशोधित करने के लिए पर्याप्त विशेषाधिकार हैं.</String>
535 <String Id="Error1927" Overridable="yes">इस कंप्यूटर पर घटक सेवाएँ (COM+ 1.0) स्थापित नहीं हैं. यह स्थापना सफलतापूर्वक पूरी होने के लिए घटक सेवाओं की आवश्यकता है. Windows 2000 पर घटक सेवाएँ उपलब्ध हैं.</String>
536 <String Id="Error1928" Overridable="yes">COM+ अनुप्रयोग पंजीकृत करने में त्रुटि. अधिक जानकारी के लिए अपने समर्थन कर्मचारी से संपर्क करें.</String>
537 <String Id="Error1929" Overridable="yes">COM+ अनुप्रयोग का पंजीकरण निरस्त करने में त्रुटि. अधिक जानकारी के लिए अपने समर्थन कर्मचारी से संपर्क करें.</String>
538 <String Id="Error1930" Overridable="yes">सेवा '[2]' ([3]) के लिए विवरण बदला नहीं जा सका.</String>
539 <String Id="Error1931" Overridable="yes">Windows installer सेवा सिस्टम फ़ाइल [2] अद्यतन नहीं कर सकता क्योंकि यह फ़ाइल Windows द्वारा सुरक्षित है. वर्तमान में यह प्रोग्राम ठीक से चलाने के लिए आपको शायद अपना ऑपरेटिंग सिस्टम अद्यतन करना होगा. {{पैकेज संस्करण: [3], OS सुरक्षित संस्करण: [4]}}</String>
540 <String Id="Error1932" Overridable="yes">Windows Installer सेवा सुरक्षित Windows फ़ाइल [2] का अद्यतन नहीं कर सकता. {{पैकेज संस्‍करण: [3], OS सुरक्षित संस्‍करण: [4], SFP त्रुटि: [5]}}</String>
541 <String Id="Error1933" Overridable="yes">Windows Installer सेवा एक या अधिक सुरक्षित Windows फ़ाइलों को अद्यतन नहीं कर सकता. {{SFP Error: [2]. सुरक्षित फ़ाइलों की सूची:\r\n[3]}}</String>
542 <String Id="Error1934" Overridable="yes">मशीन पर स्‍थित नीति द्वारा उपयोगकर्ता स्‍थापनाएँ अक्षम की गई हैं.</String>
543 <String Id="Error1935" Overridable="yes">असेंबली '[6]' की स्थापना के दौरान एक उत्‍पन्‍न हुई. अधिक जानकारी के लिए कृपया मदद तथा समर्थन का संदर्भ लें. HRESULT: [3]. {{असेंबली इंटरफ़ेस: [4], फ़ंक्‍शन: [5], घटक: [2]}}</String>
544 <String Id="Error1936" Overridable="yes">असेंबली '[6]' की स्‍थापना के दौरान एक त्रुटि उत्‍पन्‍न हुई. असेंबली अच्‍छी तरह नामांकित नहीं है या सबसे कम कुंजी लंबाई से हस्‍ताक्षरित नहीं है. HRESULT: [3]. {{असेंबली इंटरफ़ेस: [4], फ़ंक्‍शन: [5], घटक: [2]}}</String>
545 <String Id="Error1937" Overridable="yes">असेंबली '[6]' की स्‍थापना के दौरान एक त्रुटि उत्‍पन्‍न हुई. हस्‍ताक्षर या सूचीपत्र की जाँच नहीं की जा सकी या वह मान्‍य नहीं है. HRESULT: [3]. {{असेंबली इंटरफ़ेस: [4], फ़ंक्‍शन: [5], घटक: [2]}}.</String>
546 <String Id="Error1938" Overridable="yes">असेंबली '[6]' की स्‍थापना के दौरान एक त्रुटि उत्‍पन्‍न हुई. असेंबली के एक या एक से अधिक मोड्यूल नहीं मिल सके. HRESULT: [3]. {{असेंबली इंटरफ़ेस: [4], फ़ंक्‍शन: [5], घटक: [2]}}</String>
547
548 <String Id="UITextbytes" Overridable="yes">बाइट्स</String>
549 <String Id="UITextGB" Overridable="yes">GB</String>
550 <String Id="UITextKB" Overridable="yes">KB</String>
551 <String Id="UITextMB" Overridable="yes">MB</String>
552 <String Id="UITextMenuAbsent" Overridable="yes">संपूर्ण सुविधा अनुपलब्ध होगी</String>
553 <String Id="UITextMenuAdvertise" Overridable="yes">आवश्यकता होने पर सुविधा स्थापित की जाएगी</String>
554 <String Id="UITextMenuAllCD" Overridable="yes">CD से चलने के लिए संपूर्ण सुविधा स्थापित की जाएगी</String>
555 <String Id="UITextMenuAllLocal" Overridable="yes">स्थानीय हार्ड ड्राइव पर संपूर्ण सुविधा स्थापित की जाएगी</String>
556 <String Id="UITextMenuAllNetwork" Overridable="yes">नेटवर्क से चलने के लिए संपूर्ण सुविधा स्थापित की जाएगी</String>
557 <String Id="UITextMenuCD" Overridable="yes">CD से चलने के लिए स्थापित किया जाएगा</String>
558 <String Id="UITextMenuLocal" Overridable="yes">स्थानीय हार्ड ड्राइव पर स्थापित किया जाएगा</String>
559 <String Id="UITextMenuNetwork" Overridable="yes">नेटवर्क से चलने के लिए स्थापित किया जाएगा</String>
560 <String Id="UITextNewFolder" Overridable="yes">Folder|नया फ़ोल्डर</String>
561 <String Id="UITextScriptInProgress" Overridable="yes">आवश्यक जानकारी एकत्र की जा रही है...</String>
562 <String Id="UITextSelAbsentAbsent" Overridable="yes">इस सुविधा की स्थापना रद्द रहेगी</String>
563 <String Id="UITextSelAbsentAdvertise" Overridable="yes">आवश्यकता होने पर स्थापित होने के लिए यह सुविधा सेट की जाएगी</String>
564 <String Id="UITextSelAbsentCD" Overridable="yes">यह सुविधा CD से चलने के लिए स्थापित की जाएगी</String>
565 <String Id="UITextSelAbsentLocal" Overridable="yes">यह सुविधा स्थानीय हार्ड ड्राइव पर स्थापित की जाएगी</String>
566 <String Id="UITextSelAbsentNetwork" Overridable="yes">यह सुविधा नेटवर्क से चलने के लिए स्थापित की जाएगी</String>
567 <String Id="UITextSelAdvertiseAbsent" Overridable="yes">यह सुविधा अनुपलब्ध हो जाएगी</String>
568 <String Id="UITextSelAdvertiseAdvertise" Overridable="yes">आवश्यकता होने पर स्थापित किया जाएगा</String>
569 <String Id="UITextSelAdvertiseCD" Overridable="yes">यह सुविधा CD से चलने के लिए उपलब्ध होगी</String>
570 <String Id="UITextSelAdvertiseLocal" Overridable="yes">यह सुविधा आपके स्थानीय हार्ड ड्राइव पर स्थापित की जाएगी</String>
571 <String Id="UITextSelAdvertiseNetwork" Overridable="yes">यह सुविधा नेटवर्क से चलने के लिए उपलब्ध होगी</String>
572 <String Id="UITextSelCDAbsent" Overridable="yes">इस सुविधा की स्थापना पूरी तरह रद्द की जाएगी, आप इसे CD से नहीं चला पाएँगे</String>
573 <String Id="UITextSelCDAdvertise" Overridable="yes">यह सुविधा CD से चलाएँ स्थिति से आवश्यकता होने पर स्थापित होने के लिए सेट किए जाने पर बदलेगी</String>
574 <String Id="UITextSelCDCD" Overridable="yes">यह सुविधा CD से चलाने के लिए शेष रहेगी</String>
575 <String Id="UITextSelCDLocal" Overridable="yes">यह सुविधा CD से चलाएँ स्थिति से स्थानीय हार्ड ड्राइव पर स्थापित होने पर परिवर्तित हो जाएगी</String>
576 <String Id="UITextSelChildCostNeg" Overridable="yes">यह सुविधा आपके हार्ड ड्राइव पर [1] खाली करती है.</String>
577 <String Id="UITextSelChildCostPos" Overridable="yes">इस सुविधा को आपके हार्ड ड्राइव पर [1] की आवश्यकता है.</String>
578 <String Id="UITextSelCostPending" Overridable="yes">इस सुविधा के लिए होने वाली लागत कंपाइल की जा रही है...</String>
579 <String Id="UITextSelLocalAbsent" Overridable="yes">यह सुविधा पूरी तरह से निकाल दी जाएगी</String>
580 <String Id="UITextSelLocalAdvertise" Overridable="yes">यह सुविधा आपके स्थानीय हार्ड ड्राइव से निकाल दी जाएगी, लेकिन आवश्यकता होने पर स्थापित होने के लिए सेट की जाएगी</String>
581 <String Id="UITextSelLocalCD" Overridable="yes">यह सुविधा आपके स्थानीय हार्ड ड्राइव से निकाल दी जाएगी, लेकिन फिर भी CD से चलने के लिए उपलब्ध होगी</String>
582 <String Id="UITextSelLocalLocal" Overridable="yes">यह सुविधा आपकी स्थानीय हार्ड ड्राइव पर मौजूद रहेगी</String>
583 <String Id="UITextSelLocalNetwork" Overridable="yes">यह सुविधा आपके स्थानीय हार्ड ड्राइव से निकाल दी जाएगी, लेकिन फिर भी नेटवर्क से चलने के लिए उपलब्ध होगी</String>
584 <String Id="UITextSelNetworkAbsent" Overridable="yes">यह सुविधा पूरी तरह से निकाल दी जाएगी, आप इसे नेटवर्क से चलाने में समर्थ नहीं होगे</String>
585 <String Id="UITextSelNetworkAdvertise" Overridable="yes">यह सुविधा नेटवर्क से चलाएँ स्थिति से आवश्यकता होने पर स्थापित होने के लिए सेट किए जाने पर बदलेगी</String>
586 <String Id="UITextSelNetworkLocal" Overridable="yes">यह सुविधा नेटवर्क से चलाएँ स्थिति से स्थानीय हार्ड ड्राइव पर स्थापित होने पर बदलेगी</String>
587 <String Id="UITextSelNetworkNetwork" Overridable="yes">यह सुविधा नेटवर्क से चलाए जाने के लिए शेष रहेगी</String>
588 <String Id="UITextSelParentCostNegNeg" Overridable="yes">यह सुविधा आपके हार्ड ड्राइव पर [1] खाली करती है. इसमें [3] में से [2] उपसुविधाएँ चयनित हैं. उपसुविधाएँ हार्ड ड्राइव पर [4] खाली करती हैं.</String>
589 <String Id="UITextSelParentCostNegPos" Overridable="yes">यह सुविधा आपके हार्ड ड्राइव पर [1] खाली करती है. इसमें [3] में से [2] उपसुविधाएँ चयनित हैं. इन उपसुविधाओं के लिए आपके हार्ड ड्राइव पर [4] की आवश्यकता है.</String>
590 <String Id="UITextSelParentCostPosNeg" Overridable="yes">इस सुविधा के लिए आपके हार्ड ड्राइव पर [1] की आवश्यकता है. इसमें [3] में से [2] उपसुविधाएँ चयनित हैं. उपसुविधाएँ हार्ड ड्राइव पर [4] खाली करती हैं.</String>
591 <String Id="UITextSelParentCostPosPos" Overridable="yes">इस सुविधा के लिए आपके हार्ड ड्राइव पर [1] की आवश्यकता है. इसमें [3] में से [2] उपसुविधाएँ चयनित हैं. इन उपसुविधाओं के लिए आपके हार्ड ड्राइव पर [4] की आवश्यकता है.</String>
592 <String Id="UITextTimeRemaining" Overridable="yes">शेष समय: {[1] मिनट }{[2] सेकंड}</String>
593 <String Id="UITextVolumeCostAvailable" Overridable="yes">उपलब्ध</String>
594 <String Id="UITextVolumeCostDifference" Overridable="yes">अंतर</String>
595 <String Id="UITextVolumeCostRequired" Overridable="yes">आवश्यक</String>
596 <String Id="UITextVolumeCostSize" Overridable="yes">डिस्क आकार</String>
597 <String Id="UITextVolumeCostVolume" Overridable="yes">वॉल्यूम</String>
598</WixLocalization>
diff --git a/src/ext/UI/wixlib/WixUI_hr-HR.wxl b/src/ext/UI/wixlib/WixUI_hr-HR.wxl
new file mode 100644
index 00000000..e61a37d8
--- /dev/null
+++ b/src/ext/UI/wixlib/WixUI_hr-HR.wxl
@@ -0,0 +1,598 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3
4
5<WixLocalization Culture="hr-hr" Codepage="1250" xmlns="http://wixtoolset.org/schemas/v4/wxl">
6 <String Id="WixUIBack" Overridable="yes">&amp;Natrag</String>
7 <String Id="WixUINext" Overridable="yes">&amp;Dalje</String>
8 <String Id="WixUICancel" Overridable="yes">Odustani</String>
9 <String Id="WixUIFinish" Overridable="yes">&amp;Dovrši</String>
10 <String Id="WixUIRetry" Overridable="yes">&amp;Pokušaj ponovo</String>
11 <String Id="WixUIIgnore" Overridable="yes">&amp;Zanemari</String>
12 <String Id="WixUIYes" Overridable="yes">&amp;Da</String>
13 <String Id="WixUINo" Overridable="yes">&amp;Ne</String>
14 <String Id="WixUIOK" Overridable="yes">U redu</String>
15 <String Id="WixUIPrint" Overridable="yes">&amp;Ispiši</String>
16
17 <String Id="AdvancedWelcomeEulaDlg_Title" Overridable="yes">Instalacija programa [ProductName]</String>
18 <String Id="AdvancedWelcomeEulaDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
19 <String Id="AdvancedWelcomeEulaDlgTitle" Overridable="yes">{\WixUI_Font_Title}Pročitajte licencni ugovor za proizvod [ProductName]</String>
20 <String Id="AdvancedWelcomeEulaDlgLicenseAcceptedCheckBox" Overridable="yes">&amp;Prihvaćam uvjete licencnog ugovora</String>
21 <String Id="AdvancedWelcomeEulaDlgDescriptionPerMachine" Overridable="yes">Kliknite "Instaliraj" da biste instalirali proizvod za sve korisnike uz zadane mogućnosti. Da biste promijenili mogućnosti instalacije, kliknite "Dodatno".</String>
22 <String Id="AdvancedWelcomeEulaDlgDescriptionPerUser" Overridable="yes">Kliknite "Instaliraj" da biste instalirali proizvod samo za sebe uz zadane mogućnosti. Da biste promijenili mogućnosti instalacije, kliknite "Dodatno".</String>
23 <String Id="AdvancedWelcomeEulaDlgInstall" Overridable="yes">&amp;Instaliraj</String>
24 <String Id="AdvancedWelcomeEulaDlgAdvanced" Overridable="yes">Do&amp;datno</String>
25 <String Id="Advanced_Font_Normal_Size" Overridable="yes">8</String>
26 <String Id="Advanced_Font_Bigger_Size" Overridable="yes">12</String>
27 <String Id="Advanced_Font_Title_Size" Overridable="yes">9</String>
28 <String Id="Advanced_Font_Emphasized_Size" Overridable="yes">8</String>
29 <String Id="Advanced_Font_FaceName" Overridable="yes">Tahoma</String>
30
31 <String Id="BrowseDlg_Title" Overridable="yes">Instalacija programa [ProductName]</String>
32 <String Id="BrowseDlgComboLabel" Overridable="yes">&amp;Traži u:</String>
33 <String Id="BrowseDlgWixUI_Bmp_Up" Overridable="yes">WixUI_Bmp_Up</String>
34 <String Id="BrowseDlgWixUI_Bmp_UpTooltip" Overridable="yes">Jedna razina gore</String>
35 <String Id="BrowseDlgNewFolder" Overridable="yes">WixUI_Bmp_New</String>
36 <String Id="BrowseDlgNewFolderTooltip" Overridable="yes">Stvaranje nove mape</String>
37 <String Id="BrowseDlgPathLabel" Overridable="yes">&amp;Naziv mape:</String>
38 <String Id="BrowseDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
39 <String Id="BrowseDlgDescription" Overridable="yes">Pregledavanje odredišne mape</String>
40 <String Id="BrowseDlgTitle" Overridable="yes">{\WixUI_Font_Title}Promjena odredišne mape</String>
41
42 <String Id="CancelDlg_Title" Overridable="yes">Instalacija programa [ProductName]</String>
43 <String Id="CancelDlgText" Overridable="yes">Jeste li sigurni da želite otkazati instalaciju programa [ProductName]?</String>
44 <String Id="CancelDlgIcon" Overridable="yes">WixUI_Ico_Info</String>
45 <String Id="CancelDlgIconTooltip" Overridable="yes">Ikona informacija</String>
46
47 <String Id="CustomizeDlg_Title" Overridable="yes">Instalacija programa [ProductName]</String>
48 <String Id="CustomizeDlgTree" Overridable="yes">Stablo odabira</String>
49 <String Id="CustomizeDlgBrowse" Overridable="yes">P&amp;regledaj...</String>
50 <String Id="CustomizeDlgReset" Overridable="yes">Ponovno po&amp;stavi</String>
51 <String Id="CustomizeDlgDiskCost" Overridable="yes">&amp;Korištenje diska</String>
52 <String Id="CustomizeDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
53 <String Id="CustomizeDlgText" Overridable="yes">Kliknite ikone na stablu u nastavku da biste promijenili način instalacije značajki.</String>
54 <String Id="CustomizeDlgDescription" Overridable="yes">Odaberite način na koji želite instalirati značajke.</String>
55 <String Id="CustomizeDlgTitle" Overridable="yes">{\WixUI_Font_Title}Prilagođena instalacija</String>
56 <String Id="CustomizeDlgItemDescription" Overridable="yes">CustomizeDlgItemDescription-CustomizeDlgItemDescription</String>
57 <String Id="CustomizeDlgItemSize" Overridable="yes">CustomizeDlgItemSize-CustomizeDlgItemSize</String>
58 <String Id="CustomizeDlgLocation" Overridable="yes">CustomizeDlgLocation-CustomizeDlgLocation</String>
59 <String Id="CustomizeDlgLocationLabel" Overridable="yes">Lokacija:</String>
60
61 <String Id="DiskCostDlg_Title" Overridable="yes">Instalacija programa [ProductName]</String>
62 <String Id="DiskCostDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
63 <String Id="DiskCostDlgText" Overridable="yes">Na označenim jedinica nema dovoljno slobodnog prostora na disku za odabrane značajke. Možete ukloniti neke datoteke s označenih jedinica, instalirati manje značajki ili odabrati druge odredišne pogone.</String>
64 <String Id="DiskCostDlgDescription" Overridable="yes">Potreban slobodan prostor na disku za instalaciju odabranih značajki.</String>
65 <String Id="DiskCostDlgTitle" Overridable="yes">{\WixUI_Font_Title}Potreban prostor na disku</String>
66 <String Id="DiskCostDlgVolumeList" Overridable="yes">{120}{70}{70}{70}{70}</String>
67
68 <String Id="ErrorDlg_Title" Overridable="yes">Instalacija programa [ProductName]</String>
69 <String Id="ErrorDlgErrorText" Overridable="yes">Tekst s informacijama</String>
70 <String Id="ErrorDlgErrorIcon" Overridable="yes">WixUI_Ico_Info</String>
71 <String Id="ErrorDlgErrorIconTooltip" Overridable="yes">Ikona informacija</String>
72
73 <String Id="ExitDialog_Title" Overridable="yes">Instalacija programa [ProductName]</String>
74 <String Id="ExitDialogBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
75 <String Id="ExitDialogDescription" Overridable="yes">Kliknite gumb "Dovrši" da biste izašli iz čarobnjaka za instalaciju.</String>
76 <String Id="ExitDialogTitle" Overridable="yes">{\WixUI_Font_Bigger}Dovršen je čarobnjak za instalaciju programa [ProductName]</String>
77
78 <String Id="FatalError_Title" Overridable="yes">Instalacija programa [ProductName]</String>
79 <String Id="FatalErrorBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
80 <String Id="FatalErrorTitle" Overridable="yes">{\WixUI_Font_Bigger}Čarobnjak za instalaciju programa [ProductName] završio je prerano</String>
81 <String Id="FatalErrorDescription1" Overridable="yes">Čarobnjak za instalaciju programa [ProductName] završio je prerano zbog pogreške. Sustav nije izmijenjen. Da biste proizvod naknadno instalirali, ponovno pokrenite čarobnjak za instalaciju.</String>
82 <String Id="FatalErrorDescription2" Overridable="yes">Kliknite gumb "Dovrši" da biste izašli iz čarobnjaka za instalaciju.</String>
83
84 <String Id="FeaturesDlg_Title" Overridable="yes">Instalacija programa [ProductName]</String>
85 <String Id="FeaturesDlgTree" Overridable="yes">Značajke proizvoda</String>
86 <String Id="FeaturesDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
87 <String Id="FeaturesDlgDescription" Overridable="yes">Odaberite način na koji želite instalirati značajke.</String>
88 <String Id="FeaturesDlgTitle" Overridable="yes">{\WixUI_Font_Title}Značajke proizvoda</String>
89 <String Id="FeaturesDlgItemDescription" Overridable="yes">FeaturesDlgItemDescription</String>
90 <String Id="FeaturesDlgItemSize" Overridable="yes">FeaturesDlgItemSize</String>
91 <String Id="FeaturesDlgInstall" Overridable="yes">&amp;Instaliraj</String>
92 <String Id="FeaturesDlgChange" Overridable="yes">&amp;Promijeni</String>
93
94 <String Id="FilesInUse_Title" Overridable="yes">Instalacija programa [ProductName]</String>
95 <String Id="FilesInUseExit" Overridable="yes">I&amp;zlaz</String>
96 <String Id="FilesInUseBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
97 <String Id="FilesInUseText" Overridable="yes">Sljedeće aplikacije koriste datoteke koje instalacija mora ažurirati. Zatvorite te aplikacije, a zatim kliknite "&amp;Pokušaj ponovno" da biste nastavili instalaciju ili "Izlaz" da biste izašli.</String>
98 <String Id="FilesInUseDescription" Overridable="yes">Neke datoteke koje je potrebno ažurirati trenutno se koriste.</String>
99 <String Id="FilesInUseTitle" Overridable="yes">{\WixUI_Font_Title}Datoteke se koriste</String>
100
101 <String Id="InstallDirDlg_Title" Overridable="yes">Instalacija programa [ProductName]</String>
102 <String Id="InstallDirDlgChange" Overridable="yes">&amp;Promijeni...</String>
103 <String Id="InstallDirDlgTitle" Overridable="yes">{\WixUI_Font_Title}Odredišna mapa</String>
104 <String Id="InstallDirDlgDescription" Overridable="yes">Kliknite "Dalje" da biste instalirali u zadanu mapu ili "Promijeni" da biste odabrali drugu.</String>
105 <String Id="InstallDirDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
106 <String Id="InstallDirDlgFolderLabel" Overridable="yes">Instaliraj [ProductName] u:</String>
107
108 <String Id="InstallScopeDlg_Title" Overridable="yes">Instalacija programa [ProductName]</String>
109 <String Id="InstallScopeDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
110 <String Id="InstallScopeDlgDescription" Overridable="yes">Odaberite opseg i mapu instalacije</String>
111 <String Id="InstallScopeDlgTitle" Overridable="yes">{\WixUI_Font_Title}Opseg instalacije</String>
112 <String Id="InstallScopeDlgPerUser" Overridable="yes">{\WixUI_Font_Emphasized}Instalacija &amp;samo za vas ([LogonUser])</String>
113 <String Id="InstallScopeDlgPerUserDescription" Overridable="yes">[ProductName] instalirat će se u korisničku mapu i bit će dostupan samo iz vašeg korisničkog računa. Nisu vam potrebne lokalne administratorske ovlasti.</String>
114 <String Id="InstallScopeDlgNoPerUserDescription" Overridable="yes">[ProductName] ne podržava instalaciju samo za određene korisnike.</String>
115 <String Id="InstallScopeDlgPerMachine" Overridable="yes">{\WixUI_Font_Emphasized}Instaliraj za sve korisnike ovog &amp;računala</String>
116 <String Id="InstallScopeDlgPerMachineDescription" Overridable="yes">[ProductName] po zadanom će se instalirati u mapu računala te će biti dostupan svim korisnicima. Zadanu mapu za instalaciju možete promijeniti. Morate imati lokalne administratorske ovlasti.</String>
117 <String Id="InstallScopeDlgFolderLabel" Overridable="yes">Instalacijska &amp;mapa:</String>
118 <String Id="InstallScopeDlgChange" Overridable="yes">&amp;Promijeni...</String>
119
120 <String Id="InvalidDirDlg_Title" Overridable="yes">Instalacija programa [ProductName]</String>
121 <String Id="InvalidDirDlgText" Overridable="yes">Instalacijski direktorij mora biti na lokalnom tvrdom disku.</String>
122 <String Id="InvalidDirDlgIcon" Overridable="yes">WixUI_Ico_Info</String>
123 <String Id="InvalidDirDlgIconTooltip" Overridable="yes">Ikona informacija</String>
124
125 <String Id="LicenseAgreementDlg_Title" Overridable="yes">Instalacija programa [ProductName]</String>
126 <String Id="LicenseAgreementDlgLicenseAcceptedCheckBox" Overridable="yes">&amp;Prihvaćam uvjete licencnog ugovora</String>
127 <String Id="LicenseAgreementDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
128 <String Id="LicenseAgreementDlgDescription" Overridable="yes">Pozorno pročitajte sljedeći licencni ugovor</String>
129 <String Id="LicenseAgreementDlgTitle" Overridable="yes">{\WixUI_Font_Title}Licencni ugovor za krajnjeg korisnika</String>
130
131 <String Id="MaintenanceTypeDlg_Title" Overridable="yes">Instalacija programa [ProductName]</String>
132 <String Id="MaintenanceTypeDlgChangeButton" Overridable="yes">&amp;Promijeni</String>
133 <String Id="MaintenanceTypeDlgChangeButtonTooltip" Overridable="yes">Promjena instalacije</String>
134 <String Id="MaintenanceTypeDlgRepairButton" Overridable="yes">Po&amp;pravi</String>
135 <String Id="MaintenanceTypeDlgRepairButtonTooltip" Overridable="yes">Popravak instalacije</String>
136 <String Id="MaintenanceTypeDlgRemoveButton" Overridable="yes">&amp;Ukloni</String>
137 <String Id="MaintenanceTypeDlgRemoveButtonTooltip" Overridable="yes">Uklanjanje instalacije</String>
138 <String Id="MaintenanceTypeDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
139 <String Id="MaintenanceTypeDlgDescription" Overridable="yes">Odaberite operaciju koju želite izvesti.</String>
140 <String Id="MaintenanceTypeDlgTitle" Overridable="yes">{\WixUI_Font_Title}Promjena, popravak i uklanjanje instalacije</String>
141 <String Id="MaintenanceTypeDlgChangeText" Overridable="yes">Omogućuje promjenu načina instalacije značajki.</String>
142 <String Id="MaintenanceTypeDlgChangeDisabledText" Overridable="yes">[ProductName] ne sadrži značajke koje je moguće pojedinačno odabrati.</String>
143 <String Id="MaintenanceTypeDlgRemoveText" Overridable="yes">Uklanja [ProductName] s računala.</String>
144 <String Id="MaintenanceTypeDlgRemoveDisabledText" Overridable="yes">[ProductName] nije moguće ukloniti.</String>
145 <String Id="MaintenanceTypeDlgRepairText" Overridable="yes">Otklanja pogreške najnovije instalacije popravljanjem oštećenih datoteka, prečaca i unosa u registar te dodavanjem onih koji nedostaju.</String>
146 <String Id="MaintenanceTypeDlgRepairDisabledText" Overridable="yes">[ProductName] nije moguće popraviti.</String>
147
148 <String Id="MaintenanceWelcomeDlg_Title" Overridable="yes">Instalacija programa [ProductName]</String>
149 <String Id="MaintenanceWelcomeDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
150 <String Id="MaintenanceWelcomeDlgDescription" Overridable="yes">Čarobnjak za instalaciju omogućuje promjenu načina na koji se značajke programa [ProductName] instaliraju na računalo te uklanjanje programa s računala. Kliknite "Dalje" da biste nastavili ili "Odustani" da biste izašli iz čarobnjaka za instalaciju.</String>
151 <String Id="MaintenanceWelcomeDlgTitle" Overridable="yes">{\WixUI_Font_Bigger}Dobro došli u čarobnjak za instalaciju programa [ProductName]</String>
152
153 <String Id="MsiRMFilesInUse_Title" Overridable="yes">Instalacija programa [ProductName]</String>
154 <String Id="MsiRMFilesInUseBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
155 <String Id="MsiRMFilesInUseText" Overridable="yes">Sljedeće aplikacije koriste datoteke koje instalacija mora ažurirati. Možete dopustiti čarobnjaku za instalaciju da ih zatvori te ih pokuša ponovno pokrenuti ili naknadno ponovno pokrenuti računalo.</String>
156 <String Id="MsiRMFilesInUseDescription" Overridable="yes">Neke datoteke koje je potrebno ažurirati trenutno se koriste.</String>
157 <String Id="MsiRMFilesInUseTitle" Overridable="yes">{\WixUI_Font_Title}Datoteke se koriste</String>
158 <String Id="MsiRMFilesInUseUseRM" Overridable="yes">&amp;Zatvori aplikacije i pokušaj ih ponovno pokrenuti.</String>
159 <String Id="MsiRMFilesInUseDontUseRM" Overridable="yes">&amp;Ne zatvaraj aplikacije. Potrebno će biti ponovno pokrenuti računalo.</String>
160
161 <String Id="OutOfDiskDlg_Title" Overridable="yes">Instalacija programa [ProductName]</String>
162 <String Id="OutOfDiskDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
163 <String Id="OutOfDiskDlgText" Overridable="yes">Na označenim jedinicama nema dovoljno slobodnog prostora na disku za trenutno odabrane značajke. Možete ukloniti neke datoteke s označenih jedinica, instalirati manje značajki ili odabrati neki drugi odredišni disk.</String>
164 <String Id="OutOfDiskDlgDescription" Overridable="yes">Za instalaciju je potrebno više prostora nego što je slobodno na disku.</String>
165 <String Id="OutOfDiskDlgTitle" Overridable="yes">{\WixUI_Font_Title}Nema dovoljno prostora na disku</String>
166 <String Id="OutOfDiskDlgVolumeList" Overridable="yes">{120}{70}{70}{70}{70}</String>
167
168 <String Id="OutOfRbDiskDlg_Title" Overridable="yes">Instalacija programa [ProductName]</String>
169 <String Id="OutOfRbDiskDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
170 <String Id="OutOfRbDiskDlgText" Overridable="yes">Na označenim jedinicama nema dovoljno slobodnog prostora na disku za trenutno odabrane značajke. Možete ukloniti neke datoteke s označenih jedinica, instalirati manje značajki ili odabrati neki drugi odredišni disk.</String>
171 <String Id="OutOfRbDiskDlgDescription" Overridable="yes">Za instalaciju je potrebno više prostora nego što je slobodno na disku.</String>
172 <String Id="OutOfRbDiskDlgTitle" Overridable="yes">{\WixUI_Font_Title}Nema dovoljno prostora na disku</String>
173 <String Id="OutOfRbDiskDlgVolumeList" Overridable="yes">{120}{70}{70}{70}{70}</String>
174 <String Id="OutOfRbDiskDlgText2" Overridable="yes">Druga je mogućnost da onemogućite funkciju vraćanja instalacijskog programa. Ako onemogućite vraćanje, instalacijski program neće moći vratiti računalo u izvorno stanje u slučaju da zbog bilo kojeg razloga dođe do prekida instalacije. Kliknite "Da" ako želite riskirati i onemogućiti vraćanje.</String>
175
176 <String Id="PrepareDlg_Title" Overridable="yes">Instalacija programa [ProductName]</String>
177 <String Id="PrepareDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
178 <String Id="PrepareDlgDescription" Overridable="yes">Pričekajte da se čarobnjak za instalaciju pripremi da bi vas vodio kroz instalaciju.</String>
179 <String Id="PrepareDlgTitle" Overridable="yes">{\WixUI_Font_Bigger}Dobro došli u čarobnjak za instalaciju programa [ProductName]</String>
180
181 <String Id="ProgressDlg_Title" Overridable="yes">Instalacija programa [ProductName]</String>
182 <String Id="ProgressDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
183 <String Id="ProgressDlgTextInstalling" Overridable="yes">Pričekajte da čarobnjak za instalaciju instalira [ProductName].</String>
184 <String Id="ProgressDlgTitleInstalling" Overridable="yes">{\WixUI_Font_Title}Instalacija programa [ProductName]</String>
185 <String Id="ProgressDlgTextChanging" Overridable="yes">Pričekajte da čarobnjak za instalaciju promijeni [ProductName].</String>
186 <String Id="ProgressDlgTitleChanging" Overridable="yes">{\WixUI_Font_Title}Promjena programa [ProductName]</String>
187 <String Id="ProgressDlgTextRepairing" Overridable="yes">Pričekajte da čarobnjak za instalaciju popravi [ProductName].</String>
188 <String Id="ProgressDlgTitleRepairing" Overridable="yes">{\WixUI_Font_Title}Popravak programa [ProductName]</String>
189 <String Id="ProgressDlgTextRemoving" Overridable="yes">Pričekajte da čarobnjak za instalaciju ukloni [ProductName].</String>
190 <String Id="ProgressDlgTitleRemoving" Overridable="yes">{\WixUI_Font_Title}Uklanjanje programa [ProductName]</String>
191 <String Id="ProgressDlgTextUpdating" Overridable="yes">Pričekajte da čarobnjak za instalaciju ažurira [ProductName].</String>
192 <String Id="ProgressDlgTitleUpdating" Overridable="yes">{\WixUI_Font_Title}Ažuriranje programa [ProductName]</String>
193 <String Id="ProgressDlgProgressBar" Overridable="yes">Postupak je dovršen</String>
194 <String Id="ProgressDlgStatusLabel" Overridable="yes">Status:</String>
195
196 <String Id="ResumeDlg_Title" Overridable="yes">Instalacija programa [ProductName]</String>
197 <String Id="ResumeDlgInstall" Overridable="yes">&amp;Instaliraj</String>
198 <String Id="ResumeDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
199 <String Id="ResumeDlgDescription" Overridable="yes">Čarobnjak za instalaciju dovršit će instalaciju programa [ProductName] na računalo. Kliknite "Instaliraj" da biste nastavili ili "Odustani" da biste izašli iz čarobnjaka za instalaciju.</String>
200 <String Id="ResumeDlgTitle" Overridable="yes">{\WixUI_Font_Bigger}Nastavljanje čarobnjaka za instalaciju programa [ProductName]</String>
201
202 <String Id="SetupTypeDlg_Title" Overridable="yes">Instalacija programa [ProductName]</String>
203 <String Id="SetupTypeDlgTypicalButton" Overridable="yes">&amp;Tipična</String>
204 <String Id="SetupTypeDlgTypicalButtonTooltip" Overridable="yes">Tipična instalacija</String>
205 <String Id="SetupTypeDlgCustomButton" Overridable="yes">Pr&amp;ilagođena</String>
206 <String Id="SetupTypeDlgCustomButtonTooltip" Overridable="yes">Prilagođena instalacija</String>
207 <String Id="SetupTypeDlgCompleteButton" Overridable="yes">P&amp;otpuna</String>
208 <String Id="SetupTypeDlgCompleteButtonTooltip" Overridable="yes">Potpuna instalacija</String>
209 <String Id="SetupTypeDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
210 <String Id="SetupTypeDlgTitle" Overridable="yes">{\WixUI_Font_Title}Odaberite vrstu instalacije</String>
211 <String Id="SetupTypeDlgDescription" Overridable="yes">Odaberite vrstu instalacije koja najbolje odgovara vašim potrebama</String>
212 <String Id="SetupTypeDlgTypicalText" Overridable="yes">Instalira najčešće značajke programa. Preporučuje se za većinu korisnika.</String>
213 <String Id="SetupTypeDlgCustomText" Overridable="yes">Korisniku omogućuje da odabere značajke programa koje želi instalirati te mjesto na koje će se instalirati. Preporučuje se za napredne korisnike.</String>
214 <String Id="SetupTypeDlgCompleteText" Overridable="yes">Instaliraju se sve značajke programa. Potrebno je najviše prostora na disku.</String>
215
216 <String Id="UserExit_Title" Overridable="yes">Instalacija programa [ProductName]</String>
217 <String Id="UserExitBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
218 <String Id="UserExitTitle" Overridable="yes">{\WixUI_Font_Bigger}Instalacija programa [ProductName] je prekinuta</String>
219 <String Id="UserExitDescription1" Overridable="yes">Instalacija programa [ProductName] je prekinuta. Sustav nije izmijenjen. Da biste naknadno instalirali program, ponovno pokrenite instalaciju.</String>
220 <String Id="UserExitDescription2" Overridable="yes">Kliknite gumb "Dovrši" da biste izašli iz čarobnjaka za instalaciju.</String>
221
222 <String Id="VerifyReadyDlg_Title" Overridable="yes">Instalacija programa [ProductName]</String>
223 <String Id="VerifyReadyDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
224 <String Id="VerifyReadyDlgInstall" Overridable="yes">&amp;Instaliraj</String>
225 <String Id="VerifyReadyDlgInstallText" Overridable="yes">Kliknite "Instaliraj" da biste započeli instalaciju. Kliknite "Natrag" da biste pregledali postavke instalacije ili ih promijenili. Kliknite "Odustani" da biste izašli iz čarobnjaka.</String>
226 <String Id="VerifyReadyDlgInstallTitle" Overridable="yes">{\WixUI_Font_Title}Spreman instalirati [ProductName]</String>
227 <String Id="VerifyReadyDlgChange" Overridable="yes">&amp;Promijeni</String>
228 <String Id="VerifyReadyDlgChangeText" Overridable="yes">Kliknite "Promijeni" da biste započeli instalaciju. Kliknite "Natrag" da biste pregledali postavke instalacije ili ih promijenili. Kliknite "Odustani" da biste izašli iz čarobnjaka.</String>
229 <String Id="VerifyReadyDlgChangeTitle" Overridable="yes">{\WixUI_Font_Title}Spreman promijeniti [ProductName]</String>
230 <String Id="VerifyReadyDlgRepair" Overridable="yes">Po&amp;pravi</String>
231 <String Id="VerifyReadyDlgRepairText" Overridable="yes">Kliknite "Popravi" da biste popravili instalaciju programa [ProductName]. Kliknite "Natrag" da biste pregledali postavke instalacije ili ih promijenili. Kliknite "Odustani" da biste izašli iz čarobnjaka.</String>
232 <String Id="VerifyReadyDlgRepairTitle" Overridable="yes">{\WixUI_Font_Title}Spreman popraviti [ProductName]</String>
233 <String Id="VerifyReadyDlgRemove" Overridable="yes">&amp;Ukloni</String>
234 <String Id="VerifyReadyDlgRemoveText" Overridable="yes">Kliknite "Ukloni" da biste uklonili [ProductName] s računala. Kliknite "Natrag" da biste pregledali postavke instalacije ili ih promijenili. Kliknite "Odustani" da biste izašli iz čarobnjaka.</String>
235 <String Id="VerifyReadyDlgRemoveTitle" Overridable="yes">{\WixUI_Font_Title}Spreman ukloniti [ProductName]</String>
236 <String Id="VerifyReadyDlgUpdate" Overridable="yes">&amp;Ažuriraj</String>
237 <String Id="VerifyReadyDlgUpdateText" Overridable="yes">Kliknite "Ažuriraj" da biste ažurirali [ProductName] s računala. Kliknite "Natrag" da biste pregledali postavke instalacije ili ih promijenili. Kliknite "Odustani" da biste izašli iz čarobnjaka.</String>
238 <String Id="VerifyReadyDlgUpdateTitle" Overridable="yes">{\WixUI_Font_Title}Spreman ažurirati [ProductName]</String>
239
240 <String Id="WaitForCostingDlg_Title" Overridable="yes">Instalacija programa [ProductName]</String>
241 <String Id="WaitForCostingDlgReturn" Overridable="yes">&amp;Povratak</String>
242 <String Id="WaitForCostingDlgText" Overridable="yes">Pričekajte da instalacijski program odredi potreban prostor na disku.</String>
243 <String Id="WaitForCostingDlgIcon" Overridable="yes">WixUI_Ico_Exclam</String>
244 <String Id="WaitForCostingDlgIconTooltip" Overridable="yes">Ikona uskličnika</String>
245
246 <String Id="WelcomeDlg_Title" Overridable="yes">Instalacija programa [ProductName]</String>
247 <String Id="WelcomeDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
248 <String Id="WelcomeDlgDescription" Overridable="yes">Čarobnjak za instalaciju instalirat će [ProductName] na računalo. Kliknite "Dalje" da biste nastavili ili "Odustani" da biste izašli iz čarobnjaka za instalaciju.</String>
249 <String Id="WelcomeUpdateDlgDescriptionUpdate" Overridable="yes">Čarobnjak za instalaciju ažurirat će [ProductName] na računalu. Kliknite "Dalje" da biste nastavili ili "Odustani" da biste izašli iz čarobnjaka za instalaciju.</String>
250 <String Id="WelcomeDlgTitle" Overridable="yes">{\WixUI_Font_Bigger}Dobro došli u čarobnjak za instalaciju programa [ProductName]</String>
251
252 <String Id="WelcomeEulaDlg_Title" Overridable="yes">Instalacija programa [ProductName]</String>
253 <String Id="WelcomeEulaDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
254 <String Id="WelcomeEulaDlgLicenseAcceptedCheckBox" Overridable="yes">&amp;Prihvaćam uvjete licencnog ugovora</String>
255 <String Id="WelcomeEulaDlgInstall" Overridable="yes">&amp;Instaliraj</String>
256 <String Id="WelcomeEulaDlgUpdate" Overridable="yes">&amp;Ažuriraj</String>
257 <String Id="WelcomeEulaDlgTitle" Overridable="yes">{\WixUI_Font_Title}Pročitajte licencni ugovor za proizvod [ProductName]</String>
258
259 <String Id="ProgressTextInstallValidate" Overridable="yes">Provjera valjanosti instalacije</String>
260 <String Id="ProgressTextInstallFiles" Overridable="yes">Kopiranje novih datoteka</String>
261 <String Id="ProgressTextInstallFilesTemplate" Overridable="yes">Datoteka: [1], direktorij: [9], veličina: [6]</String>
262 <String Id="ProgressTextInstallAdminPackage" Overridable="yes">Kopiranje datoteka za mrežnu instalaciju</String>
263 <String Id="ProgressTextInstallAdminPackageTemplate" Overridable="yes">Datoteka: [1], direktorij: [9], veličina: [6]</String>
264 <String Id="ProgressTextFileCost" Overridable="yes">Izračunavanje potrebnog prostora</String>
265 <String Id="ProgressTextCostInitialize" Overridable="yes">Izračunavanje potrebnog prostora</String>
266 <String Id="ProgressTextCostFinalize" Overridable="yes">Izračunavanje potrebnog prostora</String>
267 <String Id="ProgressTextCreateShortcuts" Overridable="yes">Stvaranje prečaca</String>
268 <String Id="ProgressTextCreateShortcutsTemplate" Overridable="yes">Prečac: [1]</String>
269 <String Id="ProgressTextPublishComponents" Overridable="yes">Objavljivanje odgovarajućih komponenti</String>
270 <String Id="ProgressTextPublishComponentsTemplate" Overridable="yes">ID komponente: [1], kvalifikator: [2]</String>
271 <String Id="ProgressTextPublishFeatures" Overridable="yes">Objavljivanje značajki proizvoda</String>
272 <String Id="ProgressTextPublishFeaturesTemplate" Overridable="yes">Značajka: [1]</String>
273 <String Id="ProgressTextPublishProduct" Overridable="yes">Objavljivanje informacija o proizvodu</String>
274 <String Id="ProgressTextRegisterClassInfo" Overridable="yes">Registracija poslužitelja klasa</String>
275 <String Id="ProgressTextRegisterClassInfoTemplate" Overridable="yes">ID klase: [1]</String>
276 <String Id="ProgressTextRegisterExtensionInfo" Overridable="yes">Registracija poslužitelja proširenja</String>
277 <String Id="ProgressTextRegisterExtensionInfoTemplate" Overridable="yes">Proširenje: [1]</String>
278 <String Id="ProgressTextRegisterMIMEInfo" Overridable="yes">Registracija MIME informacija</String>
279 <String Id="ProgressTextRegisterMIMEInfoTemplate" Overridable="yes">MIME vrsta sadržaja: [1], proširenje: [2]</String>
280 <String Id="ProgressTextRegisterProgIdInfo" Overridable="yes">Registracija programskih identifikatora</String>
281 <String Id="ProgressTextRegisterProgIdInfoTemplate" Overridable="yes">ID programa: [1]</String>
282 <String Id="ProgressTextAllocateRegistrySpace" Overridable="yes">Dodjeljivanje prostora registra</String>
283 <String Id="ProgressTextAllocateRegistrySpaceTemplate" Overridable="yes">Slobodan prostor: [1]</String>
284 <String Id="ProgressTextAppSearch" Overridable="yes">Traženje instaliranih aplikacija</String>
285 <String Id="ProgressTextAppSearchTemplate" Overridable="yes">Svojstvo: [1], potpis: [2]</String>
286 <String Id="ProgressTextBindImage" Overridable="yes">Povezivanje izvršnih programa</String>
287 <String Id="ProgressTextBindImageTemplate" Overridable="yes">Datoteka: [1]</String>
288 <String Id="ProgressTextCCPSearch" Overridable="yes">Traženje odgovarajućih proizvoda</String>
289 <String Id="ProgressTextCreateFolders" Overridable="yes">Stvaranje mapa</String>
290 <String Id="ProgressTextCreateFoldersTemplate" Overridable="yes">Mapa: [1]</String>
291 <String Id="ProgressTextDeleteServices" Overridable="yes">Brisanje servisa</String>
292 <String Id="ProgressTextDeleteServicesTemplate" Overridable="yes">Servis: [1]</String>
293 <String Id="ProgressTextDuplicateFiles" Overridable="yes">Stvaranje dupliciranih datoteka</String>
294 <String Id="ProgressTextDuplicateFilesTemplate" Overridable="yes">Datoteka: [1], direktorij: [9], veličina: [6]</String>
295 <String Id="ProgressTextFindRelatedProducts" Overridable="yes">Traženje povezanih aplikacija</String>
296 <String Id="ProgressTextFindRelatedProductsTemplate" Overridable="yes">Pronađena aplikacija: [1]</String>
297 <String Id="ProgressTextInstallODBC" Overridable="yes">Instaliranje ODBC komponenti</String>
298 <String Id="ProgressTextInstallServices" Overridable="yes">Instaliranje novih servisa</String>
299 <String Id="ProgressTextInstallServicesTemplate" Overridable="yes">Servis: [2]</String>
300 <String Id="ProgressTextLaunchConditions" Overridable="yes">Procjena uvjeta za pokretanje</String>
301 <String Id="ProgressTextMigrateFeatureStates" Overridable="yes">Migracija stanja značajki iz povezanih programa</String>
302 <String Id="ProgressTextMigrateFeatureStatesTemplate" Overridable="yes">Aplikacija: [1]</String>
303 <String Id="ProgressTextMoveFiles" Overridable="yes">Premještanje datoteka</String>
304 <String Id="ProgressTextMoveFilesTemplate" Overridable="yes">Datoteka: [1], direktorij: [9], veličina: [6]</String>
305 <String Id="ProgressTextPatchFiles" Overridable="yes">Zakrpavanje datoteka</String>
306 <String Id="ProgressTextPatchFilesTemplate" Overridable="yes">Datoteka: [1], direktorij: [2], veličina: [3]</String>
307 <String Id="ProgressTextProcessComponents" Overridable="yes">Ažuriranje registracije komponenti</String>
308 <String Id="ProgressTextRegisterComPlus" Overridable="yes">Registracija COM+ aplikacija i komponenti</String>
309 <String Id="ProgressTextRegisterComPlusTemplate" Overridable="yes">ID aplikacije: [1]{{, vrsta aplikacije: [2], korisnici: [3], RSN: [4]}}</String>
310 <String Id="ProgressTextRegisterFonts" Overridable="yes">Registracija fontova</String>
311 <String Id="ProgressTextRegisterFontsTemplate" Overridable="yes">Font: [1]</String>
312 <String Id="ProgressTextRegisterProduct" Overridable="yes">Registracija proizvoda</String>
313 <String Id="ProgressTextRegisterProductTemplate" Overridable="yes">[1]</String>
314 <String Id="ProgressTextRegisterTypeLibraries" Overridable="yes">Registracija biblioteka vrsta</String>
315 <String Id="ProgressTextRegisterTypeLibrariesTemplate" Overridable="yes">ID biblioteke: [1]</String>
316 <String Id="ProgressTextRegisterUser" Overridable="yes">Registracija korisnika</String>
317 <String Id="ProgressTextRegisterUserTemplate" Overridable="yes">[1]</String>
318 <String Id="ProgressTextRemoveDuplicateFiles" Overridable="yes">Uklanjanje dupliciranih datoteka</String>
319 <String Id="ProgressTextRemoveDuplicateFilesTemplate" Overridable="yes">Datoteka: [1], direktorij: [9]</String>
320 <String Id="ProgressTextRemoveEnvironmentStrings" Overridable="yes">Ažuriranje nizova okruženja</String>
321 <String Id="ProgressTextRemoveEnvironmentStringsTemplate" Overridable="yes">Naziv: [1], vrijednost: [2], akcija [3]</String>
322 <String Id="ProgressTextRemoveExistingProducts" Overridable="yes">Uklanjanje aplikacija</String>
323 <String Id="ProgressTextRemoveExistingProductsTemplate" Overridable="yes">Aplikacija: [1], naredbeni redak: [2]</String>
324 <String Id="ProgressTextRemoveFiles" Overridable="yes">Uklanjanje datoteka</String>
325 <String Id="ProgressTextRemoveFilesTemplate" Overridable="yes">Datoteka: [1], direktorij: [9]</String>
326 <String Id="ProgressTextRemoveFolders" Overridable="yes">Uklanjanje mapa</String>
327 <String Id="ProgressTextRemoveFoldersTemplate" Overridable="yes">Mapa: [1]</String>
328 <String Id="ProgressTextRemoveIniValues" Overridable="yes">Uklanjanje unosa INI datoteka</String>
329 <String Id="ProgressTextRemoveIniValuesTemplate" Overridable="yes">Datoteka: [1], odjeljak: [2], ključ: [3], vrijednost: [4]</String>
330 <String Id="ProgressTextRemoveODBC" Overridable="yes">Uklanjanje ODBC komponenti</String>
331 <String Id="ProgressTextRemoveRegistryValues" Overridable="yes">Uklanjanje vrijednosti iz registra sustava</String>
332 <String Id="ProgressTextRemoveRegistryValuesTemplate" Overridable="yes">Ključ: [1], naziv: [2]</String>
333 <String Id="ProgressTextRemoveShortcuts" Overridable="yes">Uklanjanje prečaca</String>
334 <String Id="ProgressTextRemoveShortcutsTemplate" Overridable="yes">Prečac: [1]</String>
335 <String Id="ProgressTextRMCCPSearch" Overridable="yes">Traženje odgovarajućih proizvoda</String>
336 <String Id="ProgressTextSelfRegModules" Overridable="yes">Registracija modula</String>
337 <String Id="ProgressTextSelfRegModulesTemplate" Overridable="yes">Datoteka: [1], mapa: [2]</String>
338 <String Id="ProgressTextSelfUnregModules" Overridable="yes">Poništavanje registracije modula</String>
339 <String Id="ProgressTextSelfUnregModulesTemplate" Overridable="yes">Datoteka: [1], mapa: [2]</String>
340 <String Id="ProgressTextSetODBCFolders" Overridable="yes">Inicijalizacija direktorija ODBC-a</String>
341 <String Id="ProgressTextStartServices" Overridable="yes">Pokretanje servisa</String>
342 <String Id="ProgressTextStartServicesTemplate" Overridable="yes">Servis: [1]</String>
343 <String Id="ProgressTextStopServices" Overridable="yes">Zaustavljanje servisa</String>
344 <String Id="ProgressTextStopServicesTemplate" Overridable="yes">Servis: [1]</String>
345 <String Id="ProgressTextUnpublishComponents" Overridable="yes">Poništavanje objavljivanja odgovarajućih komponenti</String>
346 <String Id="ProgressTextUnpublishComponentsTemplate" Overridable="yes">ID komponente: [1], kvalifikator: [2]</String>
347 <String Id="ProgressTextUnpublishFeatures" Overridable="yes">Poništavanje objavljivanja značajki proizvoda</String>
348 <String Id="ProgressTextUnpublishFeaturesTemplate" Overridable="yes">Značajka: [1]</String>
349 <String Id="ProgressTextUnregisterClassInfo" Overridable="yes">Poništavanje registracije poslužitelja klasa</String>
350 <String Id="ProgressTextUnregisterClassInfoTemplate" Overridable="yes">ID klase: [1]</String>
351 <String Id="ProgressTextUnregisterComPlus" Overridable="yes">Poništavanje registracije COM+ aplikacija i komponenti</String>
352 <String Id="ProgressTextUnregisterComPlusTemplate" Overridable="yes">ID aplikacije: [1]{{, vrsta aplikacije: [2]}}</String>
353 <String Id="ProgressTextUnregisterExtensionInfo" Overridable="yes">Poništavanje registracije poslužitelja proširenja</String>
354 <String Id="ProgressTextUnregisterExtensionInfoTemplate" Overridable="yes">Proširenje: [1]</String>
355 <String Id="ProgressTextUnregisterFonts" Overridable="yes">Poništavanje registracije fontova</String>
356 <String Id="ProgressTextUnregisterFontsTemplate" Overridable="yes">Font: [1]</String>
357 <String Id="ProgressTextUnregisterMIMEInfo" Overridable="yes">Poništavanje registracije MIME informacija</String>
358 <String Id="ProgressTextUnregisterMIMEInfoTemplate" Overridable="yes">MIME vrsta sadržaja: [1], proširenje: [2]</String>
359 <String Id="ProgressTextUnregisterProgIdInfo" Overridable="yes">Poništavanje registracije programskih identifikatora</String>
360 <String Id="ProgressTextUnregisterProgIdInfoTemplate" Overridable="yes">ID programa: [1]</String>
361 <String Id="ProgressTextUnregisterTypeLibraries" Overridable="yes">Poništavanje registracije biblioteka vrsta</String>
362 <String Id="ProgressTextUnregisterTypeLibrariesTemplate" Overridable="yes">ID biblioteke: [1]</String>
363 <String Id="ProgressTextWriteEnvironmentStrings" Overridable="yes">Ažuriranje nizova okruženja</String>
364 <String Id="ProgressTextWriteEnvironmentStringsTemplate" Overridable="yes">Naziv: [1], vrijednost: [2], akcija [3]</String>
365 <String Id="ProgressTextWriteIniValues" Overridable="yes">Pisanje vrijednosti INI datoteka</String>
366 <String Id="ProgressTextWriteIniValuesTemplate" Overridable="yes">Datoteka: [1], odjeljak: [2], ključ: [3], vrijednost: [4]</String>
367 <String Id="ProgressTextWriteRegistryValues" Overridable="yes">Pisanje vrijednosti registra sustava</String>
368 <String Id="ProgressTextWriteRegistryValuesTemplate" Overridable="yes">Ključ: [1], naziv: [2], vrijednost: [3]</String>
369 <String Id="ProgressTextAdvertise" Overridable="yes">Oglašavanje aplikacije</String>
370 <String Id="ProgressTextGenerateScript" Overridable="yes">Generiranje operacija skripti za akciju:</String>
371 <String Id="ProgressTextGenerateScriptTemplate" Overridable="yes">[1]</String>
372 <String Id="ProgressTextInstallSFPCatalogFile" Overridable="yes">Instalacija kataloga sustava</String>
373 <String Id="ProgressTextInstallSFPCatalogFileTemplate" Overridable="yes">Datoteka: [1], ovisnosti: [2]</String>
374 <String Id="ProgressTextMsiPublishAssemblies" Overridable="yes">Objavljivanje podataka o sklopu</String>
375 <String Id="ProgressTextMsiPublishAssembliesTemplate" Overridable="yes">Kontekst aplikacije:[1], naziv sklopa:[2]</String>
376 <String Id="ProgressTextMsiUnpublishAssemblies" Overridable="yes">Poništavanje objavljivanja podataka o sklopu</String>
377 <String Id="ProgressTextMsiUnpublishAssembliesTemplate" Overridable="yes">Kontekst aplikacije:[1], naziv sklopa:[2]</String>
378 <String Id="ProgressTextRollback" Overridable="yes">Akcija vraćanja:</String>
379 <String Id="ProgressTextRollbackTemplate" Overridable="yes">[1]</String>
380 <String Id="ProgressTextRollbackCleanup" Overridable="yes">Uklanjanje sigurnosnih kopija datoteka</String>
381 <String Id="ProgressTextRollbackCleanupTemplate" Overridable="yes">Datoteka: [1]</String>
382 <String Id="ProgressTextUnmoveFiles" Overridable="yes">Uklanjanje premještenih datoteka</String>
383 <String Id="ProgressTextUnmoveFilesTemplate" Overridable="yes">Datoteka: [1], direktorij: [9]</String>
384 <String Id="ProgressTextUnpublishProduct" Overridable="yes">Poništavanje objavljivanja informacija o proizvodu</String>
385
386 <String Id="Error0" Overridable="yes">{{Fatalna pogreška: }}</String>
387 <String Id="Error1" Overridable="yes">{{Pogreška [1]. }}</String>
388 <String Id="Error2" Overridable="yes">Upozorenje [1]. </String>
389 <String Id="Error4" Overridable="yes">Informacija [1]. </String>
390 <String Id="Error5" Overridable="yes">Instalacijski program naišao je na neočekivanu pogrešku pri instalaciji ovog paketa. To možda upućuje na problem s ovim paketom. Kod pogreške je [1]. {{Argumenti su: [2], [3], [4]}}</String>
391 <String Id="Error7" Overridable="yes">{{Disk pun: }}</String>
392 <String Id="Error8" Overridable="yes">Akcija [Time]: [1]. [2]</String>
393 <String Id="Error9" Overridable="yes">[ProductName]</String>
394 <String Id="Error10" Overridable="yes">{[2]}{, [3]}{, [4]}</String>
395 <String Id="Error11" Overridable="yes">Vrsta poruke: [1], argument: [2]</String>
396 <String Id="Error12" Overridable="yes">=== Početak zapisivanja: [Date] [Time] ===</String>
397 <String Id="Error13" Overridable="yes">=== Kraj zapisivanja: [Date] [Time] ===</String>
398 <String Id="Error14" Overridable="yes">Početak akcije [Time]: [1].</String>
399 <String Id="Error15" Overridable="yes">Završetak akcije [Time]: [1]. Povratna vrijednost [2].</String>
400 <String Id="Error16" Overridable="yes">Preostalo vrijeme: {[1] min }{[2] s}</String>
401 <String Id="Error17" Overridable="yes">Nedostatak memorije. Prije ponovnog pokušaja zatvorite druge aplikacije.</String>
402 <String Id="Error18" Overridable="yes">Instalacijski program više ne reagira.</String>
403 <String Id="Error19" Overridable="yes">Instalacijski je program završio prerano.</String>
404 <String Id="Error20" Overridable="yes">Pričekajte dok Windows konfigurira [ProductName]</String>
405 <String Id="Error21" Overridable="yes">Prikupljanje potrebnih informacija...</String>
406 <String Id="Error22" Overridable="yes">Uklanjanje starijih verzija aplikacije...</String>
407 <String Id="Error23" Overridable="yes">Priprema za uklanjanje starijih verzija aplikacije...</String>
408 <String Id="Error32" Overridable="yes">Instalacija programa {[ProductName] }uspješno je dovršena.</String>
409 <String Id="Error33" Overridable="yes">Instalacija programa {[ProductName] }nije uspjela.</String>
410 <String Id="Error1101" Overridable="yes">Pogreška pri čitanju iz datoteke: [2]. {{ Sistemska pogreška [3].}} Provjerite postoji li datoteka te možete li joj pristupiti.</String>
411 <String Id="Error1301" Overridable="yes">Nije moguće stvoriti datoteku "[2]". Već postoji direktorij pod tim nazivom. Odustanite od instalacije te pokušajte instalirati na drugo mjesto.</String>
412 <String Id="Error1302" Overridable="yes">Umetnite disk: [2]</String>
413 <String Id="Error1303" Overridable="yes">Instalacijski program nema dovoljno ovlasti da bi pristupio sljedećem direktoriju: [2]. Instalacija se ne može nastaviti. Prijavite se kao administrator ili se obratite administratoru sustava.</String>
414 <String Id="Error1304" Overridable="yes">Pogreška prilikom pisanja u datoteku: [2]. Provjerite imate li pristup tom direktoriju.</String>
415 <String Id="Error1305" Overridable="yes">Pogreška pri čitanju iz datoteke: [2]. {{ Sistemska pogreška [3].}} Provjerite postoji li datoteka te možete li joj pristupiti.</String>
416 <String Id="Error1306" Overridable="yes">Druga aplikacija ima ekskluzivan pristup datoteci "[2]". Zatvorite sve druge aplikacije te kliknite "Pokušaj ponovno".</String>
417 <String Id="Error1307" Overridable="yes">Nema dovoljno prostora na disku za instalaciju ove datoteke: [2]. Oslobodite prostor na disku te kliknite "Pokušaj ponovno" ili kliknite "Odustani" da biste izašli.</String>
418 <String Id="Error1308" Overridable="yes">Izvor nije pronađen: [2].Provjerite postoji li datoteka te možete li joj pristupiti.</String>
419 <String Id="Error1309" Overridable="yes">Pogreška pri čitanju iz datoteke: [3]. {{ Sistemska pogreška [2].}} Provjerite postoji li datoteka te možete li joj pristupiti.</String>
420 <String Id="Error1310" Overridable="yes">Pogreška prilikom pisanja u datoteku: [3]. {{ Sistemska pogreška [2].}} Provjerite imate li pristup tom direktoriju.</String>
421 <String Id="Error1311" Overridable="yes">Izvorna datoteka nije pronađena{{(kabinetska)}}: [2]. Provjerite postoji li datoteka te možete li joj pristupiti.</String>
422 <String Id="Error1312" Overridable="yes">Direktorij "[2]" nije moguće stvoriti. Već postoji datoteka pod tim nazivom. Preimenujte datoteku ili je premjestite te kliknite "Pokušaj ponovno" ili kliknite "Odustani" da biste izašli.</String>
423 <String Id="Error1313" Overridable="yes">Jedinica [2] trenutno nije dostupna. Odaberite drugu jedinicu.</String>
424 <String Id="Error1314" Overridable="yes">Navedeni put "[2]" nije dostupan.</String>
425 <String Id="Error1315" Overridable="yes">Nije moguće pisanje u navedenu mapu: [2].</String>
426 <String Id="Error1316" Overridable="yes">Došlo je do mrežne pogreške pri pokušaju čitanja iz datoteke: [2]</String>
427 <String Id="Error1317" Overridable="yes">Došlo je do pogreške pri pokušaju stvaranja direktorija: [2]</String>
428 <String Id="Error1318" Overridable="yes">Došlo je do mrežne pogreške pri pokušaju stvaranja direktorija: [2]</String>
429 <String Id="Error1319" Overridable="yes">Došlo je do mrežne pogreške pri pokušaju otvaranja izvorne kabinetske datoteke: [2]</String>
430 <String Id="Error1320" Overridable="yes">Navedeni je put predug: [2]</String>
431 <String Id="Error1321" Overridable="yes">Instalacijski program nema dovoljne ovlasti za izmjenu ove datoteke: [2].</String>
432 <String Id="Error1322" Overridable="yes">Dio puta mape "[2]" nije valjan. Put je prazan ili premašuje duljinu dopuštenu u sustavu.</String>
433 <String Id="Error1323" Overridable="yes">Put mape "[2]" sadrži riječi koje nisu valjane u putovima mapa.</String>
434 <String Id="Error1324" Overridable="yes">Put mape "[2]" sadrži znak koji nije valjan.</String>
435 <String Id="Error1325" Overridable="yes">"[2]" nije valjani kratki naziv datoteke.</String>
436 <String Id="Error1326" Overridable="yes">Pogreška pri dohvaćanju zaštite datoteke: [3] GetLastError: [2]</String>
437 <String Id="Error1327" Overridable="yes">Pogon nije valjan: [2]</String>
438 <String Id="Error1328" Overridable="yes">Pogreška prilikom primjene zakrpe na datoteku [2]. Datoteka je vjerojatno na drugi način ažurirana te je više nije moguće izmijeniti tom zakrpom. Dodatne informacije zatražite od dobavljača zakrpe. {{Pogreška sustava: [3]}}</String>
439 <String Id="Error1329" Overridable="yes">Potrebnu datoteku nije moguće instalirati jer kabinetska datoteka [2] nije digitalno potpisana. To može upućivati na oštećenost kabinetske datoteke.</String>
440 <String Id="Error1330" Overridable="yes">Potrebnu datoteku nije moguće instalirati jer kabinetska datoteka [2] sadrži digitalni potpis koji nije valjan. To može upućivati na oštećenost kabinetske datoteke.{{ WinVerifyTrust vratio je pogrešku [3].}}</String>
441 <String Id="Error1331" Overridable="yes">Kopiranje datoteke [2] nije uspjelo: CRC pogreška.</String>
442 <String Id="Error1332" Overridable="yes">Premještanje datoteke [2] nije uspjelo: CRC pogreška.</String>
443 <String Id="Error1333" Overridable="yes">Zakrpavanje datoteke [2] nije uspjelo: CRC pogreška.</String>
444 <String Id="Error1334" Overridable="yes">Datoteku "[2]" nije moguće instalirati jer se ne može pronaći moguće u kabinetskoj datoteci "[3]". To može upućivati na pogrešku mreže, pogrešku pri čitanju s CD-ROM-a ili na problem s paketom.</String>
445 <String Id="Error1335" Overridable="yes">Kabinetska datoteka "[2]" potrebna za ovu instalaciju oštećena je i ne može se koristiti. To može upućivati na pogrešku mreže, pogrešku pri čitanju s CD-ROM-a ili na problem s paketom.</String>
446 <String Id="Error1336" Overridable="yes">Došlo je do pogreške pri stvaranju privremene datoteke potrebne za dovršetak instalacije.{{ Mapa: [3]. Kod sistemske pogreške: [2]}}</String>
447 <String Id="Error1401" Overridable="yes">Nije moguće stvoriti ključ: [2]. {{ Sistemska pogreška [3].}} Provjerite imate li potreban pristup tom ključu ili se obratite osoblju za podršku. </String>
448 <String Id="Error1402" Overridable="yes">Nije moguće otvoriti ključ: [2]. {{ Sistemska pogreška [3].}} Provjerite imate li potreban pristup tom ključu ili se obratite osoblju za podršku. </String>
449 <String Id="Error1403" Overridable="yes">Nije moguće izbrisati vrijednost [2] iz ključa [3]. {{ Sistemska pogreška [4].}} Provjerite imate li potreban pristup tom ključu ili se obratite osoblju za podršku. </String>
450 <String Id="Error1404" Overridable="yes">Nije moguće izbrisati ključ [2]. {{ Sistemska pogreška [3].}} Provjerite imate li potreban pristup tom ključu ili se obratite osoblju za podršku. </String>
451 <String Id="Error1405" Overridable="yes">Nije moguće pročitati vrijednost [2] iz ključa [3]. {{ Sistemska pogreška [4].}} Provjerite imate li potreban pristup tom ključu ili se obratite osoblju za podršku. </String>
452 <String Id="Error1406" Overridable="yes">Nije moguće zapisati vrijednost [2] u ključ [3]. {{ Sistemska pogreška [4].}} Provjerite imate li potreban pristup tom ključu ili se obratite osoblju za podršku.</String>
453 <String Id="Error1407" Overridable="yes">Nije moguće dohvatiti nazive vrijednosti za ključ [2]. {{ Sistemska pogreška [3].}} Provjerite imate li potreban pristup tom ključu ili se obratite osoblju za podršku.</String>
454 <String Id="Error1408" Overridable="yes">Nije moguće dohvatiti nazive potključeva za ključ [2]. {{ Sistemska pogreška [3].}} Provjerite imate li potreban pristup tom ključu ili se obratite osoblju za podršku.</String>
455 <String Id="Error1409" Overridable="yes">Nije moguće pročitati sigurnosne informacije za ključ [2]. {{ Sistemska pogreška [3].}} Provjerite imate li potreban pristup tom ključu ili se obratite osoblju za podršku.</String>
456 <String Id="Error1410" Overridable="yes">Nije moguće povećati slobodan prostor registra. Za instalaciju aplikacije potrebno je najmanje [2] kB slobodnog prostora u registru.</String>
457 <String Id="Error1500" Overridable="yes">U tijeku je druga instalacija. Morate dovršiti tu instalaciju prije nastavka ove.</String>
458 <String Id="Error1501" Overridable="yes">Pogreška prilikom pristupa osiguranim podacima. Provjerite je li Windows Installer pravilno konfiguriran i pokušajte ponoviti instalaciju.</String>
459 <String Id="Error1502" Overridable="yes">Korisnik "[2]" već je započeo instalaciju proizvoda "[3]". Morat će ponovno pokrenuti instalaciju da bi mogao koristiti proizvod. Vaša će se trenutna instalacija sada nastaviti.</String>
460 <String Id="Error1503" Overridable="yes">Korisnik "[2]" već je započeo instalaciju proizvoda "[3]". Morat će ponovno pokrenuti instalaciju da bi mogao koristiti proizvod.</String>
461 <String Id="Error1601" Overridable="yes">Nema dovoljno prostora na disku -- jedinica: '[2]'; potreban prostor: [3] kB; slobodan prostor: [4] kB. Oslobodite prostor na disku i pokušajte ponovno.</String>
462 <String Id="Error1602" Overridable="yes">Jeste li sigurni da želite odustati?</String>
463 <String Id="Error1603" Overridable="yes">Datoteku [2][3] koristi{ sljedeći proces: naziv: [4], ID: [5], naslov prozora: "[6]"}. Zatvorite tu aplikaciju i pokušajte ponovno.</String>
464 <String Id="Error1604" Overridable="yes">Proizvod "[2]" već je instaliran te onemogućuje instalaciju ovog proizvoda. Ta dva proizvoda nisu kompatibilna.</String>
465 <String Id="Error1605" Overridable="yes">Nema dovoljno diskovnog prostora na jedinici "[2]" za nastavak instalacije s omogućenim oporavkom. Potrebno je [3] kB, a dostupno je samo [4] kB. Kliknite "Zanemari" da biste nastavili instalaciju bez spremanja podataka za oporavak, "Pokušaj ponovno" da biste ponovno provjerili količinu slobodnog prostora ili "Odustani" da biste izašli iz instalacije.</String>
466 <String Id="Error1606" Overridable="yes">Nije moguće pristupiti mrežnom mjestu [2].</String>
467 <String Id="Error1607" Overridable="yes">Prije nastavka instalacije potrebno je zatvoriti sljedeće aplikacije:</String>
468 <String Id="Error1608" Overridable="yes">Na računalu nije moguće pronaći prethodno instalirane kompatibilne proizvode za instalaciju ovog proizvoda.</String>
469 <String Id="Error1609" Overridable="yes">Došlo je do pogreške pri primjeni sigurnosnih postavki. [2] nije valjani korisnik ili grupa. To može upućivati na probleme s paketom ili pri povezivanju s kontrolorom domene na mreži. Provjerite mrežnu vezu i kliknite "Pokušaj ponovno" ili "Odustani" da biste prekinuli instalaciju. {{Nije moguće pronaći korisnički SID, sistemska pogreška [3]}}</String>
470 <String Id="Error1701" Overridable="yes">Ključ [2] nije valjan. Provjerite jeste li unijeli ispravan ključ.</String>
471 <String Id="Error1702" Overridable="yes">Instalacijski program mora ponovno pokrenuti sustav da bi se mogla nastaviti konfiguracija programa [2]. Kliknite "Da" da biste odmah ponovno pokrenuli računalo ili "Ne" ako ga namjeravate naknadno ponovno pokrenuti ručno.</String>
472 <String Id="Error1703" Overridable="yes">Morate ponovno pokrenuti sustav da bi promjene konfiguracije programa [2] stupile na snagu. Kliknite "Da" da biste odmah ponovno pokrenuli računalo ili "Ne" ako ga planirate ponovno pokrenuti ručno kasnije.</String>
473 <String Id="Error1704" Overridable="yes">Instalacija programa [2] trenutno je obustavljena. Da biste nastavili, morate poništiti promjene koje je napravila instalacija. Želite li poništiti promjene?</String>
474 <String Id="Error1705" Overridable="yes">U tijeku je prethodna instalacija tog proizvoda. Da biste nastavili, morate poništiti promjene koje je napravila instalacija. Želite li poništiti promjene?</String>
475 <String Id="Error1706" Overridable="yes">Nije moguće pronaći instalacijski paket za proizvod [2]. Pokušajte ponovno instalirati pomoću valjane kopije instalacijskog paketa "[3]".</String>
476 <String Id="Error1707" Overridable="yes">Instalacije je uspješno dovršena.</String>
477 <String Id="Error1708" Overridable="yes">Instalacija nije uspjela.</String>
478 <String Id="Error1709" Overridable="yes">Proizvod: [2] -- [3]</String>
479 <String Id="Error1710" Overridable="yes">Računalo možete vratiti u prethodno stanje ili naknadno nastaviti instalaciju. Želite li vratiti prethodno stanje?</String>
480 <String Id="Error1711" Overridable="yes">Prilikom pisanja informacija na disk došlo je do pogreške. Provjerite ima li na disku dovoljno slobodnog prostora te kliknite "Pokušaj ponovno" ili "Odustani" da biste zaustavili instalaciju.</String>
481 <String Id="Error1712" Overridable="yes">Nije moguće pronaći neke datoteke potrebne za vraćanje računala u prethodno stanje. Vraćanje neće biti moguće.</String>
482 <String Id="Error1713" Overridable="yes">[2] ne može instalirati jedan od obaveznih proizvoda. Obratite se službi za tehničku podršku. {{Pogreška sustava: [3].}}</String>
483 <String Id="Error1714" Overridable="yes">Nije moguće ukloniti stariju verziju programa [2]. Obratite se službi za tehničku podršku. {{Pogreška sustava [3].}}</String>
484 <String Id="Error1715" Overridable="yes">Instalirano [2]</String>
485 <String Id="Error1716" Overridable="yes">Konfigurirano [2]</String>
486 <String Id="Error1717" Overridable="yes">Uklonjeno [2]</String>
487 <String Id="Error1718" Overridable="yes">Datoteka [2] odbačena je zbog pravilnika o digitalnim potpisima.</String>
488 <String Id="Error1719" Overridable="yes">Nije moguće pristupiti servisu Windows Installer Service. Do toga može doći ako je Windows pokrenut u sigurnom načinu rada ili ako Windows Installer nije pravilno instaliran. Za pomoć se obratite osoblju za podršku.</String>
489 <String Id="Error1720" Overridable="yes">Postoji problem s paketom servisa Windows Installer. Nije moguće pokrenuti skriptu potrebnu za dovršetak ove instalacije. Obratite se osoblju za podršku ili dobavljaču paketa. {{Pogreška skripte [2] prilagođene akcije [3], [4]: [5] redak [6], stupac [7], [8] }}</String>
490 <String Id="Error1721" Overridable="yes">Postoji problem s paketom servisa Windows Installer. Program potreban za dovršetak instalacije nije moguće pokrenuti. Obratite se osoblju za podršku ili dobavljaču paketa. {{Akcija: [2], mjesto: [3], naredba: [4] }}</String>
491 <String Id="Error1722" Overridable="yes">Postoji problem s paketom servisa Windows Installer. Program pokrenut u sklopu instalacije nije završio na očekivan način. Obratite se osoblju za podršku ili dobavljaču paketa. {{Akcija [2], mjesto: [3], naredba: [4] }}</String>
492 <String Id="Error1723" Overridable="yes">Postoji problem s paketom servisa Windows Installer. DLL potreban za dovršetak instalacije nije moguće pokrenuti. Obratite se osoblju za podršku ili dobavljaču paketa. {{Akcija [2], unos: [3], biblioteka: [4] }}</String>
493 <String Id="Error1724" Overridable="yes">Uklanjanje je uspješno dovršeno.</String>
494 <String Id="Error1725" Overridable="yes">Uklanjanje nije uspjelo.</String>
495 <String Id="Error1726" Overridable="yes">Oglašavanje je uspješno dovršeno.</String>
496 <String Id="Error1727" Overridable="yes">Oglašavanje nije uspjelo.</String>
497 <String Id="Error1728" Overridable="yes">Konfiguracija je uspješno dovršena.</String>
498 <String Id="Error1729" Overridable="yes">Konfiguracija nije uspjela.</String>
499 <String Id="Error1730" Overridable="yes">Da biste uklonili tu aplikaciju, morate biti administrator. Da biste uklonili aplikaciju, prijavite se kao administrator ili se za pomoć obratite službi za tehničku podršku.</String>
500 <String Id="Error1731" Overridable="yes">Izvorišni instalacijski paket za proizvod [2] nije usklađen s klijentskim paketom. Pokušajte ponovno instalirati pomoću valjane kopije instalacijskog paketa "[3]".</String>
501 <String Id="Error1732" Overridable="yes">Da biste dovršili instalaciju programa [2], morate ponovno pokrenuti računalo. Na računalo su trenutno prijavljeni drugi korisnici koji bi mogli izgubiti to na čemu rade ako ponovno pokrenete računalo. Želite li odmah ponovno pokrenuti računalo?</String>
502 <String Id="Error1801" Overridable="yes">Put [2] nije valjan. Navedite valjani put.</String>
503 <String Id="Error1802" Overridable="yes">Nedostatak memorije. Prije ponovnog pokušaja zatvorite druge aplikacije.</String>
504 <String Id="Error1803" Overridable="yes">Nema diska u pogonu [2]. Umetnite disk i kliknite "Pokušaj ponovno" ili kliknite "Odustani" da biste se vratili na prethodno odabranu jedinicu.</String>
505 <String Id="Error1804" Overridable="yes">Nema diska u pogonu [2]. Umetnite disk i kliknite "Pokušaj ponovno" ili kliknite "Odustani" da biste se vratili na dijaloški okvir za pregledavanje te odabrali drugu jedinicu.</String>
506 <String Id="Error1805" Overridable="yes">Mapa [2] ne postoji. Unesite put do postojeće mape.</String>
507 <String Id="Error1806" Overridable="yes">Nemate dovoljno ovlasti za čitanje ove mape.</String>
508 <String Id="Error1807" Overridable="yes">Nije moguće odrediti valjanu odredišnu mapu za instalaciju.</String>
509 <String Id="Error1901" Overridable="yes">Pogreška pri čitanju iz izvorišne baze podataka za instalaciju: [2].</String>
510 <String Id="Error1902" Overridable="yes">Zakazivanje operacije ponovnog pokretanja: preimenovanje datoteke [2] u [3]. Računalo se mora ponovno pokrenuti da bi se operacija dovršila.</String>
511 <String Id="Error1903" Overridable="yes">Zakazivanje operacije ponovnog pokretanja: brisanje datoteke [2]. Računalo se mora ponovno pokrenuti da bi se operacija dovršila.</String>
512 <String Id="Error1904" Overridable="yes">Registracija modula [2] nije uspjela. HRESULT [3]. Obratite se osoblju za podršku.</String>
513 <String Id="Error1905" Overridable="yes">Poništavanje registracije modula [2] nije uspjelo. HRESULT [3]. Obratite se osoblju za podršku.</String>
514 <String Id="Error1906" Overridable="yes">Predmemoriranje paketa [2] nije uspjelo. Pogreška: [3]. Obratite se osoblju za podršku.</String>
515 <String Id="Error1907" Overridable="yes">Nije moguće registrirati font [2]. Provjerite imate li potrebne dozvole za instalaciju fontove te podržava li sustav taj font.</String>
516 <String Id="Error1908" Overridable="yes">Poništavanje registracije fonta [2] nije uspjelo. Provjerite imate li potrebne dozvole za uklanjanje fontova.</String>
517 <String Id="Error1909" Overridable="yes">Stvaranje prečaca [2] nije moguće. Provjerite postoji li odredišna mapa te možete li joj pristupiti.</String>
518 <String Id="Error1910" Overridable="yes">Uklanjanje prečaca [2] nije uspjelo. Provjerite postoji li datoteka prečaca te možete li joj pristupiti.</String>
519 <String Id="Error1911" Overridable="yes">Nije moguće registrirati biblioteku tipa za datoteku [2]. Obratite se osoblju za podršku.</String>
520 <String Id="Error1912" Overridable="yes">Nije moguće poništiti registraciju biblioteke tipa za datoteku [2]. Obratite se osoblju za podršku.</String>
521 <String Id="Error1913" Overridable="yes">Nije moguće ažurirati ini datoteku [2][3]. Provjerite postoji li datoteka te možete li joj pristupiti.</String>
522 <String Id="Error1914" Overridable="yes">Nije moguće zakazati zamjenu datoteke [3] datotekom [2] pri ponovnom pokretanju sustava. Provjerite imate li dozvole pisanja za datoteku [3].</String>
523 <String Id="Error1915" Overridable="yes">Pogreška pri uklanjanju ODBC upravitelja upravljačkim programima, ODBC pogreška [2]: [3]. Obratite se osoblju za podršku.</String>
524 <String Id="Error1916" Overridable="yes">Pogreška pri instaliranju ODBC upravitelja upravljačkim programima, ODBC pogreška [2]: [3]. Obratite se osoblju za podršku.</String>
525 <String Id="Error1917" Overridable="yes">Pogreška pri uklanjanju ODBC upravljačkog programa: [4], ODBC pogreška [2]: [3]. Provjerite imate li dovoljne ovlasti za uklanjanje ODBC upravljačkih programa.</String>
526 <String Id="Error1918" Overridable="yes">Pogreška pri instaliranju ODBC upravljačkog programa: [4], ODBC pogreška [2]: [3]. Provjerite postoji li datoteka [4] te možete li joj pristupiti.</String>
527 <String Id="Error1919" Overridable="yes">Pogreška pri konfiguriranju ODBC izvora podataka: [4], ODBC pogreška [2]: [3]. Provjerite postoji li datoteka [4] te možete li joj pristupiti.</String>
528 <String Id="Error1920" Overridable="yes">Servis "[2]" ([3]) nije se uspio pokrenuti. Provjerite imate li dovoljne ovlasti za pokretanje servisa sustava.</String>
529 <String Id="Error1921" Overridable="yes">Servis "[2]" ([3]) nije moguće zaustaviti. Provjerite imate li dovoljne ovlasti za zaustavljanje servisa sustava.</String>
530 <String Id="Error1922" Overridable="yes">Servis "[2]" ([3]) nije moguće izbrisati. Provjerite imate li dovoljne ovlasti za uklanjanje servisa sustava.</String>
531 <String Id="Error1923" Overridable="yes">Servis "[2]" ([3]) nije moguće instalirati. Provjerite imate li dovoljne ovlasti za instalaciju servisa sustava.</String>
532 <String Id="Error1924" Overridable="yes">Nije moguće ažurirati varijablu okruženja "[2]". Provjerite imate li dovoljne ovlasti za izmjenu varijabli okruženja.</String>
533 <String Id="Error1925" Overridable="yes">Nemate dovoljno ovlasti da biste dovršili instalaciju za sve korisnike računala. Prijavite se kao administrator, a zatim ponovno pokušajte instalirati.</String>
534 <String Id="Error1926" Overridable="yes">Nije moguće postaviti zaštitu datoteke za datoteku "[3]". Pogreška: [2]. Provjerite imate li dovoljne ovlasti za izmjenu sigurnosnih dozvola za tu datoteku.</String>
535 <String Id="Error1927" Overridable="yes">Na ovom računalu nije instalirana komponenta Component Services (COM+ 1.0). Da bi se ova instalacija uspješno dovršila, potrebna je komponenta Component Services. Komponenta Component Services dostupna je u sustavu Windows 2000.</String>
536 <String Id="Error1928" Overridable="yes">Pogreška pri registraciji aplikacije COM+. Dodatne informacije zatražite od osoblja za podršku.</String>
537 <String Id="Error1929" Overridable="yes">Pogreška pri poništavanju registracije aplikacije COM+. Dodatne informacije zatražite od osoblja za podršku.</String>
538 <String Id="Error1930" Overridable="yes">Opis za servis "[2]" ([3]) nije moguće promijeniti.</String>
539 <String Id="Error1931" Overridable="yes">Servis Windows Installer ne može ažurirati sistemsku datoteku [2] jer je ta datoteka zaštićena u sustavu Windows. Da bi ovaj program ispravno funkcionirao, možda ćete morati ažurirati operacijski sustav. {{Verzija paketa: [3], verzija zaštićena OS-om: [4]}}</String>
540 <String Id="Error1932" Overridable="yes">Servis Windows Installer nije uspio ažurirati zaštićenu datoteku sustava Windows [2]. {{Verzija paketa: [3], verzija zaštićena OS-om: [4], SFP pogreška: [5]}}</String>
541 <String Id="Error1933" Overridable="yes">Servis Windows Installer ne može ažurirati neke datoteke zaštićene datoteke sustava Windows. {{SFP pogreška: [2]. Popis zaštićenih datoteka:\r\n[3]}}</String>
542 <String Id="Error1934" Overridable="yes">Korisničke instalacije onemogućene su pravilnicima računala.</String>
543 <String Id="Error1935" Overridable="yes">Došlo je do pogreške prilikom instalacije sklopa "[6]". Dodatne informacije potražite u pomoći i podršci. HRESULT: [3]. {{sučelje sklopa: [4], funkcija: [5], komponenta: [2]}}</String>
544 <String Id="Error1936" Overridable="yes">Došlo je do pogreške prilikom instalacije sklopa "[6]". Sklop nema naziv ključa ili nije potpisan minimalnom duljinom ključa. HRESULT: [3]. {{sučelje sklopa: [4], funkcija: [5], komponenta: [2]}}</String>
545 <String Id="Error1937" Overridable="yes">Došlo je do pogreške prilikom instalacije sklopa "[6]". Potpis ili katalog nije moguće potvrditi ili nisu valjani. HRESULT: [3]. {{sučelje sklopa: [4], funkcija: [5], komponenta: [2]}}</String>
546 <String Id="Error1938" Overridable="yes">Došlo je do pogreške prilikom instalacije sklopa "[6]". Neke module sklopa nije moguće pronaći. HRESULT: [3]. {{sučelje sklopa: [4], funkcija: [5], komponenta: [2]}}</String>
547
548 <String Id="UITextbytes" Overridable="yes">bajtova</String>
549 <String Id="UITextGB" Overridable="yes">GB</String>
550 <String Id="UITextKB" Overridable="yes">kB</String>
551 <String Id="UITextMB" Overridable="yes">MB</String>
552 <String Id="UITextMenuAbsent" Overridable="yes">Nijedan dio značajke neće biti dostupan</String>
553 <String Id="UITextMenuAdvertise" Overridable="yes">Značajka će se instalirati po potrebi</String>
554 <String Id="UITextMenuAllCD" Overridable="yes">Cijela će se značajka instalirati za pokretanje s CD-a</String>
555 <String Id="UITextMenuAllLocal" Overridable="yes">Cijela će se značajka instalirati na lokalni tvrdi disk</String>
556 <String Id="UITextMenuAllNetwork" Overridable="yes">Cijela će se značajka instalirati za pokretanje s mreže</String>
557 <String Id="UITextMenuCD" Overridable="yes">Instalirat će se za pokretanje s CD-a</String>
558 <String Id="UITextMenuLocal" Overridable="yes">Instalirat će se na lokalni tvrdi disk</String>
559 <String Id="UITextMenuNetwork" Overridable="yes">Instalirat će se za pokretanje s mreže</String>
560 <String Id="UITextNewFolder" Overridable="yes">Mapa|Nova mapa</String>
561 <String Id="UITextScriptInProgress" Overridable="yes">Prikupljanje potrebnih informacija...</String>
562 <String Id="UITextSelAbsentAbsent" Overridable="yes">Značajka se neće instalirati</String>
563 <String Id="UITextSelAbsentAdvertise" Overridable="yes">Značajka će se postaviti za instaliranje po potrebi</String>
564 <String Id="UITextSelAbsentCD" Overridable="yes">Značajka će se instalirati za pokretanje s CD-a</String>
565 <String Id="UITextSelAbsentLocal" Overridable="yes">Značajka će se instalirati na lokalni tvrdi disk</String>
566 <String Id="UITextSelAbsentNetwork" Overridable="yes">Značajka će se instalirati za pokretanje s mreže</String>
567 <String Id="UITextSelAdvertiseAbsent" Overridable="yes">Značajka više neće biti dostupna</String>
568 <String Id="UITextSelAdvertiseAdvertise" Overridable="yes">Značajka će se instalirati po potrebi</String>
569 <String Id="UITextSelAdvertiseCD" Overridable="yes">Značajka će biti dostupna za pokretanje s CD-a</String>
570 <String Id="UITextSelAdvertiseLocal" Overridable="yes">Značajka će se instalirati na lokalni tvrdi disk</String>
571 <String Id="UITextSelAdvertiseNetwork" Overridable="yes">Značajka će biti dostupna za pokretanje s mreže</String>
572 <String Id="UITextSelCDAbsent" Overridable="yes">Značajka će se potpuno deinstalirati i nećete je moći pokrenuti s CD-a</String>
573 <String Id="UITextSelCDAdvertise" Overridable="yes">Stanje instalacije značajke promijenit će se s pokretanja s CD-a na instalaciju po potrebi</String>
574 <String Id="UITextSelCDCD" Overridable="yes">Značajka će se i dalje pokretati s CD-a</String>
575 <String Id="UITextSelCDLocal" Overridable="yes">Stanje instalacije značajke promijenit će se iz pokretanja s CD-a u instalaciju na lokalnom tvrdom disku</String>
576 <String Id="UITextSelChildCostNeg" Overridable="yes">Ta značajka oslobađa [1] na tvrdom disku.</String>
577 <String Id="UITextSelChildCostPos" Overridable="yes">Za tu je značajku potrebno [1] na tvrdom disku.</String>
578 <String Id="UITextSelCostPending" Overridable="yes">Izračunavanje potrošnje memorijskog prostora za tu značajku...</String>
579 <String Id="UITextSelLocalAbsent" Overridable="yes">Značajka će biti potpuno uklonjena</String>
580 <String Id="UITextSelLocalAdvertise" Overridable="yes">Značajka će se ukloniti s lokalnog tvrdog diska, ali će se postaviti na instalaciju po potrebi</String>
581 <String Id="UITextSelLocalCD" Overridable="yes">Značajka će se ukloniti s lokalnog tvrdog diska, ali će i dalje biti dostupna za pokretanje s CD-a</String>
582 <String Id="UITextSelLocalLocal" Overridable="yes">Značajka će ostati na lokalnom tvrdom disku</String>
583 <String Id="UITextSelLocalNetwork" Overridable="yes">Značajka će biti uklonjena s lokalnog tvrdog diska, ali će i dalje biti dostupna za pokretanje s mreže</String>
584 <String Id="UITextSelNetworkAbsent" Overridable="yes">Značajka će se potpuno deinstalirati i nećete je moći pokrenuti s mreže</String>
585 <String Id="UITextSelNetworkAdvertise" Overridable="yes">Stanje instalacije značajke promijenit će se iz pokretanja s mreže u instalaciju po potrebi</String>
586 <String Id="UITextSelNetworkLocal" Overridable="yes">Stanje instalacije značajke promijenit će se iz pokretanja s mreže u instalaciju na lokalnom tvrdom disku</String>
587 <String Id="UITextSelNetworkNetwork" Overridable="yes">Značajka će se i dalje pokretati s mreže</String>
588 <String Id="UITextSelParentCostNegNeg" Overridable="yes">Značajka oslobađa [1] na tvrdom disku. Odabrane podznačajke: [2] od [3]. Podznačajke oslobađaju [4] na tvrdom disku.</String>
589 <String Id="UITextSelParentCostNegPos" Overridable="yes">Značajka oslobađa [1] na tvrdom disku. Odabrane podznačajke: [2] od [3]. Za podznačajke je potrebno [4] na tvrdom disku.</String>
590 <String Id="UITextSelParentCostPosNeg" Overridable="yes">Za značajku je potrebno [1] na tvrdom disku. Odabrane podznačajke: [2] od [3]. Podznačajke oslobađaju [4] na tvrdom disku.</String>
591 <String Id="UITextSelParentCostPosPos" Overridable="yes">Za značajku je potrebno [1] na tvrdom disku. Odabrane podznačajke: [2] od [3]. Za podznačajke je potrebno [4] na tvrdom disku.</String>
592 <String Id="UITextTimeRemaining" Overridable="yes">Preostalo vrijeme: {[1] min }{[2] s}</String>
593 <String Id="UITextVolumeCostAvailable" Overridable="yes">Slobodno</String>
594 <String Id="UITextVolumeCostDifference" Overridable="yes">Razlika</String>
595 <String Id="UITextVolumeCostRequired" Overridable="yes">Potrebno</String>
596 <String Id="UITextVolumeCostSize" Overridable="yes">Veličina diska</String>
597 <String Id="UITextVolumeCostVolume" Overridable="yes">Jedinica</String>
598</WixLocalization>
diff --git a/src/ext/UI/wixlib/WixUI_hu-HU.wxl b/src/ext/UI/wixlib/WixUI_hu-HU.wxl
new file mode 100644
index 00000000..fb8064ea
--- /dev/null
+++ b/src/ext/UI/wixlib/WixUI_hu-HU.wxl
@@ -0,0 +1,598 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3
4
5<WixLocalization Culture="hu-hu" Codepage="1250" xmlns="http://wixtoolset.org/schemas/v4/wxl">
6 <String Id="WixUIBack" Overridable="yes">&amp;Vissza</String>
7 <String Id="WixUINext" Overridable="yes">&amp;Tovább</String>
8 <String Id="WixUICancel" Overridable="yes">Mégse</String>
9 <String Id="WixUIFinish" Overridable="yes">&amp;Befejezés</String>
10 <String Id="WixUIRetry" Overridable="yes">Újr&amp;a</String>
11 <String Id="WixUIIgnore" Overridable="yes">&amp;Mellőzés</String>
12 <String Id="WixUIYes" Overridable="yes">&amp;Igen</String>
13 <String Id="WixUINo" Overridable="yes">&amp;Nem</String>
14 <String Id="WixUIOK" Overridable="yes">OK</String>
15 <String Id="WixUIPrint" Overridable="yes">&amp;Nyomtatás</String>
16
17 <String Id="AdvancedWelcomeEulaDlg_Title" Overridable="yes">A(z) [ProductName] telepítése</String>
18 <String Id="AdvancedWelcomeEulaDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
19 <String Id="AdvancedWelcomeEulaDlgTitle" Overridable="yes">{\WixUI_Font_Title}Olvassa el a(z) [ProductName] licencszerződését</String>
20 <String Id="AdvancedWelcomeEulaDlgLicenseAcceptedCheckBox" Overridable="yes">&amp;Elfogadom a licencszerződés feltételeit.</String>
21 <String Id="AdvancedWelcomeEulaDlgDescriptionPerMachine" Overridable="yes">Ha az alapértelmezett beállításokkal, minden felhasználónak szeretné telepíteni a terméket, kattintson a Telepítés gombra. Ha módosítani szeretné a telepítési beállításokat, kattintson a Speciális gombra.</String>
22 <String Id="AdvancedWelcomeEulaDlgDescriptionPerUser" Overridable="yes">Ha az alapértelmezett beállításokkal, csak önmagának szeretné telepíteni a terméket, kattintson a Telepítés gombra. Ha módosítani szeretné a telepítési beállításokat, kattintson a Speciális gombra.</String>
23 <String Id="AdvancedWelcomeEulaDlgInstall" Overridable="yes">&amp;Telepítés</String>
24 <String Id="AdvancedWelcomeEulaDlgAdvanced" Overridable="yes">S&amp;peciális</String>
25 <String Id="Advanced_Font_Normal_Size" Overridable="yes">8</String>
26 <String Id="Advanced_Font_Bigger_Size" Overridable="yes">12</String>
27 <String Id="Advanced_Font_Title_Size" Overridable="yes">9</String>
28 <String Id="Advanced_Font_Emphasized_Size" Overridable="yes">8</String>
29 <String Id="Advanced_Font_FaceName" Overridable="yes">Tahoma</String>
30
31 <String Id="BrowseDlg_Title" Overridable="yes">A(z) [ProductName] telepítése</String>
32 <String Id="BrowseDlgComboLabel" Overridable="yes">&amp;Hely:</String>
33 <String Id="BrowseDlgWixUI_Bmp_Up" Overridable="yes">WixUI_Bmp_Up</String>
34 <String Id="BrowseDlgWixUI_Bmp_UpTooltip" Overridable="yes">Egy szinttel feljebb</String>
35 <String Id="BrowseDlgNewFolder" Overridable="yes">WixUI_Bmp_New</String>
36 <String Id="BrowseDlgNewFolderTooltip" Overridable="yes">Új mappa létrehozása</String>
37 <String Id="BrowseDlgPathLabel" Overridable="yes">&amp;Mappa neve:</String>
38 <String Id="BrowseDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
39 <String Id="BrowseDlgDescription" Overridable="yes">Tallózással keresse meg a célmappát.</String>
40 <String Id="BrowseDlgTitle" Overridable="yes">{\WixUI_Font_Title}Célmappa módosítása</String>
41
42 <String Id="CancelDlg_Title" Overridable="yes">A(z) [ProductName] telepítése</String>
43 <String Id="CancelDlgText" Overridable="yes">Biztosan megszakítja a(z) [ProductName] telepítését?</String>
44 <String Id="CancelDlgIcon" Overridable="yes">WixUI_Ico_Info</String>
45 <String Id="CancelDlgIconTooltip" Overridable="yes">Információs ikon</String>
46
47 <String Id="CustomizeDlg_Title" Overridable="yes">A(z) [ProductName] telepítése</String>
48 <String Id="CustomizeDlgTree" Overridable="yes">Kijelölőfa</String>
49 <String Id="CustomizeDlgBrowse" Overridable="yes">T&amp;allózás...</String>
50 <String Id="CustomizeDlgReset" Overridable="yes">&amp;Visszaállítás</String>
51 <String Id="CustomizeDlgDiskCost" Overridable="yes">&amp;Lemezfelhasználás</String>
52 <String Id="CustomizeDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
53 <String Id="CustomizeDlgText" Overridable="yes">Az alábbi faszerkezet ikonjaira kattintva módosíthatja, hogy miképpen települjenek a termék szolgáltatásai.</String>
54 <String Id="CustomizeDlgDescription" Overridable="yes">Ezen a lapon adhatja meg a szolgáltatások telepítésének módját.</String>
55 <String Id="CustomizeDlgTitle" Overridable="yes">{\WixUI_Font_Title}Egyéni telepítés</String>
56 <String Id="CustomizeDlgItemDescription" Overridable="yes">CustomizeDlgItemDescription-CustomizeDlgItemDescription</String>
57 <String Id="CustomizeDlgItemSize" Overridable="yes">CustomizeDlgItemSize-CustomizeDlgItemSize</String>
58 <String Id="CustomizeDlgLocation" Overridable="yes">CustomizeDlgLocation-CustomizeDlgLocation</String>
59 <String Id="CustomizeDlgLocationLabel" Overridable="yes">Helye:</String>
60
61 <String Id="DiskCostDlg_Title" Overridable="yes">A(z) [ProductName] telepítése</String>
62 <String Id="DiskCostDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
63 <String Id="DiskCostDlgText" Overridable="yes">A kijelölt köteteken nincs elég szabad lemezterület a megadott szolgáltatások telepítéséhez. A probléma megoldásához törölhet néhány fájlt a kijelölt kötetekről, telepíthet kevesebb szolgáltatást, vagy más célmeghajtókat választhat.</String>
64 <String Id="DiskCostDlgDescription" Overridable="yes">A kijelölt szolgáltatások telepítéséhez szükséges lemezterület.</String>
65 <String Id="DiskCostDlgTitle" Overridable="yes">{\WixUI_Font_Title}Lemezterület-szükséglet</String>
66 <String Id="DiskCostDlgVolumeList" Overridable="yes">{120}{70}{70}{70}{70}</String>
67
68 <String Id="ErrorDlg_Title" Overridable="yes">A(z) [ProductName] telepítése</String>
69 <String Id="ErrorDlgErrorText" Overridable="yes">Információs szöveg</String>
70 <String Id="ErrorDlgErrorIcon" Overridable="yes">WixUI_Ico_Info</String>
71 <String Id="ErrorDlgErrorIconTooltip" Overridable="yes">Információs ikon</String>
72
73 <String Id="ExitDialog_Title" Overridable="yes">A(z) [ProductName] telepítése</String>
74 <String Id="ExitDialogBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
75 <String Id="ExitDialogDescription" Overridable="yes">A telepítővarázslóból való kilépéshez kattintson a Befejezés gombra.</String>
76 <String Id="ExitDialogTitle" Overridable="yes">{\WixUI_Font_Bigger}A(z) [ProductName] telepítővarázsló futása befejeződött.</String>
77
78 <String Id="FatalError_Title" Overridable="yes">A(z) [ProductName] telepítése</String>
79 <String Id="FatalErrorBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
80 <String Id="FatalErrorTitle" Overridable="yes">{\WixUI_Font_Bigger}A(z) [ProductName] telepítővarázsló futása idő előtt véget ért.</String>
81 <String Id="FatalErrorDescription1" Overridable="yes">A(z) [ProductName] telepítővarázsló futása egy hiba miatt megszakadt. A rendszer nem módosult. A programot később a telepítővarázsló futtatásával telepítheti.</String>
82 <String Id="FatalErrorDescription2" Overridable="yes">A telepítővarázslóból való kilépéshez kattintson a Befejezés gombra.</String>
83
84 <String Id="FeaturesDlg_Title" Overridable="yes">A(z) [ProductName] telepítése</String>
85 <String Id="FeaturesDlgTree" Overridable="yes">A termék funkciói</String>
86 <String Id="FeaturesDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
87 <String Id="FeaturesDlgDescription" Overridable="yes">Ezen a lapon adhatja meg a szolgáltatások telepítésének módját.</String>
88 <String Id="FeaturesDlgTitle" Overridable="yes">{\WixUI_Font_Title}A termék funkciói</String>
89 <String Id="FeaturesDlgItemDescription" Overridable="yes">FeaturesDlgItemDescription</String>
90 <String Id="FeaturesDlgItemSize" Overridable="yes">FeaturesDlgItemSize</String>
91 <String Id="FeaturesDlgInstall" Overridable="yes">&amp;Telepítés</String>
92 <String Id="FeaturesDlgChange" Overridable="yes">&amp;Módosítás</String>
93
94 <String Id="FilesInUse_Title" Overridable="yes">A(z) [ProductName] telepítése</String>
95 <String Id="FilesInUseExit" Overridable="yes">&amp;Kilépés</String>
96 <String Id="FilesInUseBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
97 <String Id="FilesInUseText" Overridable="yes">A következő alkalmazások jelenleg használják a telepítő által frissítendő fájlokat. Zárja be ezeket az alkalmazásokat, majd az Újr&amp;a gombra kattintva folytassa a telepítést, vagy a Kilépés gombra kattintva lépjen ki a telepítőből.</String>
98 <String Id="FilesInUseDescription" Overridable="yes">Néhány frissítendő fájl jelenleg használatban van.</String>
99 <String Id="FilesInUseTitle" Overridable="yes">{\WixUI_Font_Title}Használatban lévő fájlok</String>
100
101 <String Id="InstallDirDlg_Title" Overridable="yes">A(z) [ProductName] telepítése</String>
102 <String Id="InstallDirDlgChange" Overridable="yes">&amp;Módosítás...</String>
103 <String Id="InstallDirDlgTitle" Overridable="yes">{\WixUI_Font_Title}Célmappa</String>
104 <String Id="InstallDirDlgDescription" Overridable="yes">Ha az alapértelmezett mappába kívánja telepíteni, kattintson a Tovább gombra, ha másikat szeretne választani, kattintson a Módosítás gombra.</String>
105 <String Id="InstallDirDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
106 <String Id="InstallDirDlgFolderLabel" Overridable="yes">A(z) [ProductName] telepítése ide:</String>
107
108 <String Id="InstallScopeDlg_Title" Overridable="yes">A(z) [ProductName] telepítése</String>
109 <String Id="InstallScopeDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
110 <String Id="InstallScopeDlgDescription" Overridable="yes">A telepítési hatókör és mappa kiválasztása</String>
111 <String Id="InstallScopeDlgTitle" Overridable="yes">{\WixUI_Font_Title}Telepítési hatókör</String>
112 <String Id="InstallScopeDlgPerUser" Overridable="yes">{\WixUI_Font_Emphasized}Telepítés &amp;csak önmaga számára ([LogonUser])</String>
113 <String Id="InstallScopeDlgPerUserDescription" Overridable="yes">A(z) [ProductName] egy felhasználói mappába települ, és csak az Ön felhasználói fiókjával lesz elérhető. Nem szükségesek rendszergazdai jogok.</String>
114 <String Id="InstallScopeDlgNoPerUserDescription" Overridable="yes">A(z) [ProductName] nem telepíthető felhasználónként.</String>
115 <String Id="InstallScopeDlgPerMachine" Overridable="yes">{\WixUI_Font_Emphasized}Telepítés a számítógép &amp;minden felhasználója számára</String>
116 <String Id="InstallScopeDlgPerMachineDescription" Overridable="yes">A(z) [ProductName] alapértelmezés szerint egy számítógépszintű mappába települ, és minden felhasználó számára elérhető lesz. Az alapértelmezett telepítési mappa módosítható. Helyi rendszergazdai jogok szükségesek.</String>
117 <String Id="InstallScopeDlgFolderLabel" Overridable="yes">Telepítési &amp;mappa:</String>
118 <String Id="InstallScopeDlgChange" Overridable="yes">&amp;Módosítás...</String>
119
120 <String Id="InvalidDirDlg_Title" Overridable="yes">A(z) [ProductName] telepítése</String>
121 <String Id="InvalidDirDlgText" Overridable="yes">A telepítési mappának egy helyi merevlemezen kell lennie.</String>
122 <String Id="InvalidDirDlgIcon" Overridable="yes">WixUI_Ico_Info</String>
123 <String Id="InvalidDirDlgIconTooltip" Overridable="yes">Információs ikon</String>
124
125 <String Id="LicenseAgreementDlg_Title" Overridable="yes">A(z) [ProductName] telepítése</String>
126 <String Id="LicenseAgreementDlgLicenseAcceptedCheckBox" Overridable="yes">&amp;Elfogadom a licencszerződés feltételeit.</String>
127 <String Id="LicenseAgreementDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
128 <String Id="LicenseAgreementDlgDescription" Overridable="yes">Figyelmesen olvassa el az alábbi licencszerződést.</String>
129 <String Id="LicenseAgreementDlgTitle" Overridable="yes">{\WixUI_Font_Title}Végfelhasználói licencszerződés</String>
130
131 <String Id="MaintenanceTypeDlg_Title" Overridable="yes">A(z) [ProductName] telepítése</String>
132 <String Id="MaintenanceTypeDlgChangeButton" Overridable="yes">&amp;Módosítás</String>
133 <String Id="MaintenanceTypeDlgChangeButtonTooltip" Overridable="yes">A telepítés módosítása</String>
134 <String Id="MaintenanceTypeDlgRepairButton" Overridable="yes">&amp;Javítás</String>
135 <String Id="MaintenanceTypeDlgRepairButtonTooltip" Overridable="yes">A telepítés kijavítása</String>
136 <String Id="MaintenanceTypeDlgRemoveButton" Overridable="yes">&amp;Eltávolítás</String>
137 <String Id="MaintenanceTypeDlgRemoveButtonTooltip" Overridable="yes">A telepítés eltávolítása</String>
138 <String Id="MaintenanceTypeDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
139 <String Id="MaintenanceTypeDlgDescription" Overridable="yes">Válasszon a rendelkezésre álló lehetőségek közül.</String>
140 <String Id="MaintenanceTypeDlgTitle" Overridable="yes">{\WixUI_Font_Title}A telepítés módosítása, kijavítása vagy eltávolítása</String>
141 <String Id="MaintenanceTypeDlgChangeText" Overridable="yes">Lehetővé teszi a telepített szolgáltatások telepítési módjának megváltoztatását.</String>
142 <String Id="MaintenanceTypeDlgChangeDisabledText" Overridable="yes">A(z) [ProductName] nem tartalmaz egymástól függetlenül választható szolgáltatásokat.</String>
143 <String Id="MaintenanceTypeDlgRemoveText" Overridable="yes">A(z) [ProductName] eltávolítása a számítógépről</String>
144 <String Id="MaintenanceTypeDlgRemoveDisabledText" Overridable="yes">A(z) [ProductName] nem távolítható el.</String>
145 <String Id="MaintenanceTypeDlgRepairText" Overridable="yes">Kijavítja a legutóbbi telepítés hibáit úgy, hogy helyreállítja a hiányzó és sérült fájlokat, parancsikonokat és beállításjegyzékbeli bejegyzéseket.</String>
146 <String Id="MaintenanceTypeDlgRepairDisabledText" Overridable="yes">A(z) [ProductName] nem javítható ki.</String>
147
148 <String Id="MaintenanceWelcomeDlg_Title" Overridable="yes">A(z) [ProductName] telepítése</String>
149 <String Id="MaintenanceWelcomeDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
150 <String Id="MaintenanceWelcomeDlgDescription" Overridable="yes">A telepítővarázslóval megváltoztathatja a(z) [ProductName] szolgáltatásainak telepítési módját, vagy eltávolíthatja a terméket a számítógépről. A folytatáshoz kattintson a Tovább gombra, a telepítővarázslóból való kilépéshez a Mégse gombra.</String>
151 <String Id="MaintenanceWelcomeDlgTitle" Overridable="yes">{\WixUI_Font_Bigger}A(z) [ProductName] telepítése – üdvözli a varázsló.</String>
152
153 <String Id="MsiRMFilesInUse_Title" Overridable="yes">A(z) [ProductName] telepítése</String>
154 <String Id="MsiRMFilesInUseBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
155 <String Id="MsiRMFilesInUseText" Overridable="yes">A következő alkalmazások jelenleg használják a telepítő által frissítendő fájlokat. Engedélyezheti, hogy a telepítővarázsló bezárja őket, és később kísérletet tegyen az újraindításukra vagy a számítógép újraindítására.</String>
156 <String Id="MsiRMFilesInUseDescription" Overridable="yes">Néhány frissítendő fájl jelenleg használatban van.</String>
157 <String Id="MsiRMFilesInUseTitle" Overridable="yes">{\WixUI_Font_Title}Fájlok vannak használatban</String>
158 <String Id="MsiRMFilesInUseUseRM" Overridable="yes">Az alkalmazások &amp;bezárása és későbbi újraindítása</String>
159 <String Id="MsiRMFilesInUseDontUseRM" Overridable="yes">Az alkalmazások bezárásának &amp;mellőzése. A számítógépet később újra kell indítani.</String>
160
161 <String Id="OutOfDiskDlg_Title" Overridable="yes">A(z) [ProductName] telepítése</String>
162 <String Id="OutOfDiskDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
163 <String Id="OutOfDiskDlgText" Overridable="yes">A kijelölt köteteken nincs elég szabad lemezterület a megadott szolgáltatások telepítéséhez. A probléma megoldásához törölhet néhány fájlt a kijelölt kötetekről, telepíthet kevesebb szolgáltatást, vagy más célmeghajtókat választhat.</String>
164 <String Id="OutOfDiskDlgDescription" Overridable="yes">A rendelkezésre álló lemezterület nem elegendő a telepítéshez.</String>
165 <String Id="OutOfDiskDlgTitle" Overridable="yes">{\WixUI_Font_Title}Kevés a szabad lemezterület.</String>
166 <String Id="OutOfDiskDlgVolumeList" Overridable="yes">{120}{70}{70}{70}{70}</String>
167
168 <String Id="OutOfRbDiskDlg_Title" Overridable="yes">A(z) [ProductName] telepítése</String>
169 <String Id="OutOfRbDiskDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
170 <String Id="OutOfRbDiskDlgText" Overridable="yes">A kijelölt köteteken nincs elég szabad lemezterület a megadott szolgáltatások telepítéséhez. A probléma megoldásához törölhet néhány fájlt a kijelölt kötetekről, telepíthet kevesebb szolgáltatást, vagy más célmeghajtókat választhat.</String>
171 <String Id="OutOfRbDiskDlgDescription" Overridable="yes">A rendelkezésre álló lemezterület nem elegendő a telepítéshez.</String>
172 <String Id="OutOfRbDiskDlgTitle" Overridable="yes">{\WixUI_Font_Title}Kevés a szabad lemezterület.</String>
173 <String Id="OutOfRbDiskDlgVolumeList" Overridable="yes">{120}{70}{70}{70}{70}</String>
174 <String Id="OutOfRbDiskDlgText2" Overridable="yes">Másik lehetőségként letilthatja a telepítőprogram visszaállítási funkcióját. A visszaállítás letiltása megakadályozza a számítógép eredeti állapotának visszaállítását, ha a telepítés valamiért megszakadna. Ha vállalja ennek kockázatát, kattintson az Igen gombra.</String>
175
176 <String Id="PrepareDlg_Title" Overridable="yes">A(z) [ProductName] telepítése</String>
177 <String Id="PrepareDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
178 <String Id="PrepareDlgDescription" Overridable="yes">Várjon, amíg a telepítővarázsló felkészül, hogy végigvezesse Önt a telepítés folyamatán.</String>
179 <String Id="PrepareDlgTitle" Overridable="yes">{\WixUI_Font_Bigger}A(z) [ProductName] telepítése – üdvözli a varázsló.</String>
180
181 <String Id="ProgressDlg_Title" Overridable="yes">A(z) [ProductName] telepítése</String>
182 <String Id="ProgressDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
183 <String Id="ProgressDlgTextInstalling" Overridable="yes">Várjon, amíg a telepítővarázsló telepíti a(z) [ProductName] terméket.</String>
184 <String Id="ProgressDlgTitleInstalling" Overridable="yes">{\WixUI_Font_Title}A(z) [ProductName] telepítése</String>
185 <String Id="ProgressDlgTextChanging" Overridable="yes">Várjon, amíg a telepítővarázsló módosítja a(z) [ProductName] terméket.</String>
186 <String Id="ProgressDlgTitleChanging" Overridable="yes">{\WixUI_Font_Title}A(z) [ProductName] módosítása</String>
187 <String Id="ProgressDlgTextRepairing" Overridable="yes">Várjon, amíg a telepítővarázsló kijavítja a(z) [ProductName] terméket.</String>
188 <String Id="ProgressDlgTitleRepairing" Overridable="yes">{\WixUI_Font_Title}A(z) [ProductName] kijavítása</String>
189 <String Id="ProgressDlgTextRemoving" Overridable="yes">Várjon, amíg a telepítővarázsló eltávolítja a(z) [ProductName] terméket.</String>
190 <String Id="ProgressDlgTitleRemoving" Overridable="yes">{\WixUI_Font_Title}A(z) [ProductName] eltávolítása</String>
191 <String Id="ProgressDlgTextUpdating" Overridable="yes">Kis türelmet, a telepítővarázsló a(z) [ProductName] frissítését végzi.</String>
192 <String Id="ProgressDlgTitleUpdating" Overridable="yes">{\WixUI_Font_Title}A(z) [ProductName] frissítése</String>
193 <String Id="ProgressDlgProgressBar" Overridable="yes">A folyamat állapota</String>
194 <String Id="ProgressDlgStatusLabel" Overridable="yes">Állapot:</String>
195
196 <String Id="ResumeDlg_Title" Overridable="yes">A(z) [ProductName] telepítése</String>
197 <String Id="ResumeDlgInstall" Overridable="yes">&amp;Telepítés</String>
198 <String Id="ResumeDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
199 <String Id="ResumeDlgDescription" Overridable="yes">A telepítővarázsló befejezi a(z) [ProductName] telepítését a számítógépre. A folytatáshoz kattintson a Telepítés gombra, a varázslóból való kilépéshez a Mégse gombra.</String>
200 <String Id="ResumeDlgTitle" Overridable="yes">{\WixUI_Font_Bigger}A(z) [ProductName] telepítővarázsló folytatása</String>
201
202 <String Id="SetupTypeDlg_Title" Overridable="yes">A(z) [ProductName] telepítése</String>
203 <String Id="SetupTypeDlgTypicalButton" Overridable="yes">&amp;Tipikus</String>
204 <String Id="SetupTypeDlgTypicalButtonTooltip" Overridable="yes">Tipikus telepítés</String>
205 <String Id="SetupTypeDlgCustomButton" Overridable="yes">&amp;Egyéni</String>
206 <String Id="SetupTypeDlgCustomButtonTooltip" Overridable="yes">Egyéni telepítés</String>
207 <String Id="SetupTypeDlgCompleteButton" Overridable="yes">Telje&amp;s</String>
208 <String Id="SetupTypeDlgCompleteButtonTooltip" Overridable="yes">Teljes telepítés</String>
209 <String Id="SetupTypeDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
210 <String Id="SetupTypeDlgTitle" Overridable="yes">{\WixUI_Font_Title}A telepítéstípus kiválasztása</String>
211 <String Id="SetupTypeDlgDescription" Overridable="yes">Ezen a lapon választhatja ki a telepítés típusát.</String>
212 <String Id="SetupTypeDlgTypicalText" Overridable="yes">A leggyakrabban használt szolgáltatások telepítése (a legtöbb esetben ez a lehetőség ajánlott).</String>
213 <String Id="SetupTypeDlgCustomText" Overridable="yes">A telepítendő szolgáltatások és azok helyének kiválasztása (tapasztalt felhasználóknak ajánlott).</String>
214 <String Id="SetupTypeDlgCompleteText" Overridable="yes">A program minden szolgáltatása települ. Ehhez szükséges a legtöbb lemezterület.</String>
215
216 <String Id="UserExit_Title" Overridable="yes">A(z) [ProductName] telepítése</String>
217 <String Id="UserExitBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
218 <String Id="UserExitTitle" Overridable="yes">{\WixUI_Font_Bigger}A(z) [ProductName] telepítővarázsló futása megszakadt.</String>
219 <String Id="UserExitDescription1" Overridable="yes">A(z) [ProductName] telepítése megszakadt. A rendszer nem módosult. A programot később a telepítés futtatásával telepítheti.</String>
220 <String Id="UserExitDescription2" Overridable="yes">A telepítővarázslóból való kilépéshez kattintson a Befejezés gombra.</String>
221
222 <String Id="VerifyReadyDlg_Title" Overridable="yes">A(z) [ProductName] telepítése</String>
223 <String Id="VerifyReadyDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
224 <String Id="VerifyReadyDlgInstall" Overridable="yes">&amp;Telepítés</String>
225 <String Id="VerifyReadyDlgInstallText" Overridable="yes">A telepítés megkezdéséhez válassza a Telepítés lehetőséget. A Vissza gombra kattintva áttekintheti és módosíthatja a telepítési beállításokat. A telepítővarázslóból való kilépéshez kattintson a Mégse gombra.</String>
226 <String Id="VerifyReadyDlgInstallTitle" Overridable="yes">{\WixUI_Font_Title}A telepítő készen áll a(z) [ProductName] telepítésére</String>
227 <String Id="VerifyReadyDlgChange" Overridable="yes">&amp;Módosítás</String>
228 <String Id="VerifyReadyDlgChangeText" Overridable="yes">A telepítés megkezdéséhez válassza a Módosítás lehetőséget. A Vissza gombra kattintva áttekintheti és módosíthatja a telepítési beállításokat. A telepítővarázslóból való kilépéshez kattintson a Mégse gombra.</String>
229 <String Id="VerifyReadyDlgChangeTitle" Overridable="yes">{\WixUI_Font_Title}A telepítő készen áll a(z) [ProductName] módosítására</String>
230 <String Id="VerifyReadyDlgRepair" Overridable="yes">&amp;Javítás</String>
231 <String Id="VerifyReadyDlgRepairText" Overridable="yes">A(z) [ProductName] telepítésének kijavításához válassza a Javítás lehetőséget. A Vissza gombra kattintva áttekintheti és módosíthatja a telepítési beállításokat. A telepítővarázslóból való kilépéshez kattintson a Mégse gombra.</String>
232 <String Id="VerifyReadyDlgRepairTitle" Overridable="yes">{\WixUI_Font_Title}A telepítő készen áll a(z) [ProductName] kijavítására</String>
233 <String Id="VerifyReadyDlgRemove" Overridable="yes">&amp;Eltávolítás</String>
234 <String Id="VerifyReadyDlgRemoveText" Overridable="yes">A(z) [ProductName] eltávolításához válassza az Eltávolítás lehetőséget. A Vissza gombra kattintva áttekintheti és módosíthatja a telepítési beállításokat. A telepítővarázslóból való kilépéshez kattintson a Mégse gombra.</String>
235 <String Id="VerifyReadyDlgRemoveTitle" Overridable="yes">{\WixUI_Font_Title}A telepítő készen áll a(z) [ProductName] eltávolítására</String>
236 <String Id="VerifyReadyDlgUpdate" Overridable="yes">&amp;Frissítés</String>
237 <String Id="VerifyReadyDlgUpdateText" Overridable="yes">Ha frissíteni szeretné a(z) [ProductName] terméket a számítógépen, kattintson a Frissítés lehetőségre. A Vissza gombra kattintva áttekintheti és módosíthatja a telepítési beállításokat. A telepítővarázslóból való kilépéshez kattintson a Mégse gombra.</String>
238 <String Id="VerifyReadyDlgUpdateTitle" Overridable="yes">{\WixUI_Font_Title}A telepítő készen áll a(z) [ProductName] frissítésére</String>
239
240 <String Id="WaitForCostingDlg_Title" Overridable="yes">A(z) [ProductName] telepítése</String>
241 <String Id="WaitForCostingDlgReturn" Overridable="yes">&amp;Vissza</String>
242 <String Id="WaitForCostingDlgText" Overridable="yes">Kis türelmet, a telepítő befejezi a lemezterület-szükséglet megállapítását.</String>
243 <String Id="WaitForCostingDlgIcon" Overridable="yes">WixUI_Ico_Exclam</String>
244 <String Id="WaitForCostingDlgIconTooltip" Overridable="yes">Felkiáltójel ikon</String>
245
246 <String Id="WelcomeDlg_Title" Overridable="yes">A(z) [ProductName] telepítése</String>
247 <String Id="WelcomeDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
248 <String Id="WelcomeDlgDescription" Overridable="yes">A telepítővarázsló telepíti a(z) [ProductName] alkalmazást a számítógépre. A folytatáshoz kattintson a Tovább gombra, a telepítővarázslóból való kilépéshez a Mégse gombra.</String>
249 <String Id="WelcomeUpdateDlgDescriptionUpdate" Overridable="yes">A telepítővarázsló frissíti a(z) [ProductName] terméket a számítógépen. A folytatáshoz kattintson a Tovább gombra, a telepítővarázslóból való kilépéshez a Mégse gombra.</String>
250 <String Id="WelcomeDlgTitle" Overridable="yes">{\WixUI_Font_Bigger}A(z) [ProductName] telepítése – üdvözli a varázsló.</String>
251
252 <String Id="WelcomeEulaDlg_Title" Overridable="yes">A(z) [ProductName] telepítése</String>
253 <String Id="WelcomeEulaDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
254 <String Id="WelcomeEulaDlgLicenseAcceptedCheckBox" Overridable="yes">&amp;Elfogadom a licencszerződés feltételeit.</String>
255 <String Id="WelcomeEulaDlgInstall" Overridable="yes">&amp;Telepítés</String>
256 <String Id="WelcomeEulaDlgUpdate" Overridable="yes">&amp;Frissítés</String>
257 <String Id="WelcomeEulaDlgTitle" Overridable="yes">{\WixUI_Font_Title}Olvassa el a(z) [ProductName] licencszerződését</String>
258
259 <String Id="ProgressTextInstallValidate" Overridable="yes">A telepítés ellenőrzése</String>
260 <String Id="ProgressTextInstallFiles" Overridable="yes">Új fájlok másolása</String>
261 <String Id="ProgressTextInstallFilesTemplate" Overridable="yes">Fájl: [1], könyvtár: [9], méret: [6]</String>
262 <String Id="ProgressTextInstallAdminPackage" Overridable="yes">Hálózati telepítőfájlok másolása</String>
263 <String Id="ProgressTextInstallAdminPackageTemplate" Overridable="yes">Fájl: [1], könyvtár: [9], méret: [6]</String>
264 <String Id="ProgressTextFileCost" Overridable="yes">A szükséges lemezterület kiszámítása</String>
265 <String Id="ProgressTextCostInitialize" Overridable="yes">A szükséges lemezterület kiszámítása</String>
266 <String Id="ProgressTextCostFinalize" Overridable="yes">A szükséges lemezterület kiszámítása</String>
267 <String Id="ProgressTextCreateShortcuts" Overridable="yes">Parancsikonok létrehozása</String>
268 <String Id="ProgressTextCreateShortcutsTemplate" Overridable="yes">Parancsikon: [1]</String>
269 <String Id="ProgressTextPublishComponents" Overridable="yes">Minősített összetevők közzététele</String>
270 <String Id="ProgressTextPublishComponentsTemplate" Overridable="yes">Összetevő-azonosító: [1], minősítő: [2]</String>
271 <String Id="ProgressTextPublishFeatures" Overridable="yes">A termék szolgáltatásainak közzététele</String>
272 <String Id="ProgressTextPublishFeaturesTemplate" Overridable="yes">Szolgáltatás: [1]</String>
273 <String Id="ProgressTextPublishProduct" Overridable="yes">A termék adatainak közzététele</String>
274 <String Id="ProgressTextRegisterClassInfo" Overridable="yes">Osztálykiszolgálók regisztrálása</String>
275 <String Id="ProgressTextRegisterClassInfoTemplate" Overridable="yes">Osztályazonosító: [1]</String>
276 <String Id="ProgressTextRegisterExtensionInfo" Overridable="yes">Kiterjesztésszolgáltatók regisztrálása</String>
277 <String Id="ProgressTextRegisterExtensionInfoTemplate" Overridable="yes">Kiterjesztés: [1]</String>
278 <String Id="ProgressTextRegisterMIMEInfo" Overridable="yes">MIME-információ regisztrálása</String>
279 <String Id="ProgressTextRegisterMIMEInfoTemplate" Overridable="yes">A MIME-tartalom típusa: [1], kiterjesztés: [2]</String>
280 <String Id="ProgressTextRegisterProgIdInfo" Overridable="yes">Programazonosítók regisztrálása</String>
281 <String Id="ProgressTextRegisterProgIdInfoTemplate" Overridable="yes">Programazonosító: [1]</String>
282 <String Id="ProgressTextAllocateRegistrySpace" Overridable="yes">Hely lefoglalása a beállításjegyzékben</String>
283 <String Id="ProgressTextAllocateRegistrySpaceTemplate" Overridable="yes">Szabad lemezterület: [1]</String>
284 <String Id="ProgressTextAppSearch" Overridable="yes">Telepített alkalmazások keresése</String>
285 <String Id="ProgressTextAppSearchTemplate" Overridable="yes">Tulajdonság: [1], aláírás: [2]</String>
286 <String Id="ProgressTextBindImage" Overridable="yes">Végrehajtható fájlok kötése</String>
287 <String Id="ProgressTextBindImageTemplate" Overridable="yes">Fájl: [1]</String>
288 <String Id="ProgressTextCCPSearch" Overridable="yes">Feljogosító termékek keresése</String>
289 <String Id="ProgressTextCreateFolders" Overridable="yes">Mappák létrehozása</String>
290 <String Id="ProgressTextCreateFoldersTemplate" Overridable="yes">Mappa: [1]</String>
291 <String Id="ProgressTextDeleteServices" Overridable="yes">Szolgáltatások törlése</String>
292 <String Id="ProgressTextDeleteServicesTemplate" Overridable="yes">Szolgáltatás: [1]</String>
293 <String Id="ProgressTextDuplicateFiles" Overridable="yes">Fájlok másodpéldányának létrehozása</String>
294 <String Id="ProgressTextDuplicateFilesTemplate" Overridable="yes">Fájl: [1], könyvtár: [9], méret: [6]</String>
295 <String Id="ProgressTextFindRelatedProducts" Overridable="yes">Kapcsolódó alkalmazások keresése</String>
296 <String Id="ProgressTextFindRelatedProductsTemplate" Overridable="yes">Talált alkalmazás: [1]</String>
297 <String Id="ProgressTextInstallODBC" Overridable="yes">ODBC-összetevők telepítése</String>
298 <String Id="ProgressTextInstallServices" Overridable="yes">Új szolgáltatások telepítése</String>
299 <String Id="ProgressTextInstallServicesTemplate" Overridable="yes">Szolgáltatás: [2]</String>
300 <String Id="ProgressTextLaunchConditions" Overridable="yes">Indítási feltételek kiértékelése</String>
301 <String Id="ProgressTextMigrateFeatureStates" Overridable="yes">Szolgáltatásállapotok áttelepítése kapcsolódó alkalmazásokból</String>
302 <String Id="ProgressTextMigrateFeatureStatesTemplate" Overridable="yes">Alkalmazás: [1]</String>
303 <String Id="ProgressTextMoveFiles" Overridable="yes">Fájlok áthelyezése</String>
304 <String Id="ProgressTextMoveFilesTemplate" Overridable="yes">Fájl: [1], könyvtár: [9], méret: [6]</String>
305 <String Id="ProgressTextPatchFiles" Overridable="yes">Fájlok javítása</String>
306 <String Id="ProgressTextPatchFilesTemplate" Overridable="yes">Fájl: [1], könyvtár: [2], méret: [3]</String>
307 <String Id="ProgressTextProcessComponents" Overridable="yes">Összetevők beállításbejegyzéseinek frissítése</String>
308 <String Id="ProgressTextRegisterComPlus" Overridable="yes">COM+-alkalmazások és -összetevők regisztrálása</String>
309 <String Id="ProgressTextRegisterComPlusTemplate" Overridable="yes">Alk. azonosítója: [1]{{, alk. típusa: [2], felhasználók: [3], sorozatsz.: [4]}}</String>
310 <String Id="ProgressTextRegisterFonts" Overridable="yes">Betűkészletek regisztrálása</String>
311 <String Id="ProgressTextRegisterFontsTemplate" Overridable="yes">Betűkészlet: [1]</String>
312 <String Id="ProgressTextRegisterProduct" Overridable="yes">A termék regisztrálása</String>
313 <String Id="ProgressTextRegisterProductTemplate" Overridable="yes">[1]</String>
314 <String Id="ProgressTextRegisterTypeLibraries" Overridable="yes">Típustárak regisztrálása</String>
315 <String Id="ProgressTextRegisterTypeLibrariesTemplate" Overridable="yes">Típustár-azonosító: [1]</String>
316 <String Id="ProgressTextRegisterUser" Overridable="yes">A felhasználó regisztrálása</String>
317 <String Id="ProgressTextRegisterUserTemplate" Overridable="yes">[1]</String>
318 <String Id="ProgressTextRemoveDuplicateFiles" Overridable="yes">Fájlok másodpéldányának eltávolítása</String>
319 <String Id="ProgressTextRemoveDuplicateFilesTemplate" Overridable="yes">Fájl: [1], könyvtár: [9]</String>
320 <String Id="ProgressTextRemoveEnvironmentStrings" Overridable="yes">A környezeti karakterláncok frissítése</String>
321 <String Id="ProgressTextRemoveEnvironmentStringsTemplate" Overridable="yes">Név: [1], érték: [2], művelet: [3]</String>
322 <String Id="ProgressTextRemoveExistingProducts" Overridable="yes">Alkalmazások eltávolítása</String>
323 <String Id="ProgressTextRemoveExistingProductsTemplate" Overridable="yes">Alkalmazás: [1], parancssor: [2]</String>
324 <String Id="ProgressTextRemoveFiles" Overridable="yes">Fájlok eltávolítása</String>
325 <String Id="ProgressTextRemoveFilesTemplate" Overridable="yes">Fájl: [1], könyvtár: [9]</String>
326 <String Id="ProgressTextRemoveFolders" Overridable="yes">Mappák eltávolítása</String>
327 <String Id="ProgressTextRemoveFoldersTemplate" Overridable="yes">Mappa: [1]</String>
328 <String Id="ProgressTextRemoveIniValues" Overridable="yes">INI-fájlbejegyzések eltávolítása</String>
329 <String Id="ProgressTextRemoveIniValuesTemplate" Overridable="yes">Fájl: [1], szakasz: [2], kulcs: [3], érték: [4]</String>
330 <String Id="ProgressTextRemoveODBC" Overridable="yes">ODBC-összetevők eltávolítása</String>
331 <String Id="ProgressTextRemoveRegistryValues" Overridable="yes">Értékek törlése a beállításjegyzékből</String>
332 <String Id="ProgressTextRemoveRegistryValuesTemplate" Overridable="yes">Kulcs: [1], név: [2]</String>
333 <String Id="ProgressTextRemoveShortcuts" Overridable="yes">Parancsikonok eltávolítása</String>
334 <String Id="ProgressTextRemoveShortcutsTemplate" Overridable="yes">Parancsikon: [1]</String>
335 <String Id="ProgressTextRMCCPSearch" Overridable="yes">Feljogosító termékek keresése</String>
336 <String Id="ProgressTextSelfRegModules" Overridable="yes">Modulok regisztrálása</String>
337 <String Id="ProgressTextSelfRegModulesTemplate" Overridable="yes">Fájl: [1], mappa: [2]</String>
338 <String Id="ProgressTextSelfUnregModules" Overridable="yes">Modulok törlése a beállításjegyzékből</String>
339 <String Id="ProgressTextSelfUnregModulesTemplate" Overridable="yes">Fájl: [1], mappa: [2]</String>
340 <String Id="ProgressTextSetODBCFolders" Overridable="yes">ODBC-könyvtárak inicializálása</String>
341 <String Id="ProgressTextStartServices" Overridable="yes">Szolgáltatások elindítása</String>
342 <String Id="ProgressTextStartServicesTemplate" Overridable="yes">Szolgáltatás: [1]</String>
343 <String Id="ProgressTextStopServices" Overridable="yes">Szolgáltatások leállítása</String>
344 <String Id="ProgressTextStopServicesTemplate" Overridable="yes">Szolgáltatás: [1]</String>
345 <String Id="ProgressTextUnpublishComponents" Overridable="yes">Minősített összetevők közzétételének visszavonása</String>
346 <String Id="ProgressTextUnpublishComponentsTemplate" Overridable="yes">Összetevő-azonosító: [1], minősítő: [2]</String>
347 <String Id="ProgressTextUnpublishFeatures" Overridable="yes">A termékszolgáltatások közzétételének visszavonása</String>
348 <String Id="ProgressTextUnpublishFeaturesTemplate" Overridable="yes">Szolgáltatás: [1]</String>
349 <String Id="ProgressTextUnregisterClassInfo" Overridable="yes">Osztálykiszolgálók törlése a beállításjegyzékből</String>
350 <String Id="ProgressTextUnregisterClassInfoTemplate" Overridable="yes">Osztályazonosító: [1]</String>
351 <String Id="ProgressTextUnregisterComPlus" Overridable="yes">COM+-alkalmazások és -összetevők törlése a beállításjegyzékből</String>
352 <String Id="ProgressTextUnregisterComPlusTemplate" Overridable="yes">Alkalmazásazonosító: [1] {{alkalmazástípus: [2]}}</String>
353 <String Id="ProgressTextUnregisterExtensionInfo" Overridable="yes">Kiterjesztésszolgáltatók törlése a beállításjegyzékből</String>
354 <String Id="ProgressTextUnregisterExtensionInfoTemplate" Overridable="yes">Kiterjesztés: [1]</String>
355 <String Id="ProgressTextUnregisterFonts" Overridable="yes">Betűkészletek törlése a beállításjegyzékből</String>
356 <String Id="ProgressTextUnregisterFontsTemplate" Overridable="yes">Betűkészlet: [1]</String>
357 <String Id="ProgressTextUnregisterMIMEInfo" Overridable="yes">MIME-információ törlése a beállításjegyzékből</String>
358 <String Id="ProgressTextUnregisterMIMEInfoTemplate" Overridable="yes">A MIME-tartalom típusa: [1], kiterjesztés: [2]</String>
359 <String Id="ProgressTextUnregisterProgIdInfo" Overridable="yes">Programazonosítók törlése a beállításjegyzékből</String>
360 <String Id="ProgressTextUnregisterProgIdInfoTemplate" Overridable="yes">Programazonosító: [1]</String>
361 <String Id="ProgressTextUnregisterTypeLibraries" Overridable="yes">Típustárak törlése a beállításjegyzékből</String>
362 <String Id="ProgressTextUnregisterTypeLibrariesTemplate" Overridable="yes">Típustár-azonosító: [1]</String>
363 <String Id="ProgressTextWriteEnvironmentStrings" Overridable="yes">A környezeti karakterláncok frissítése</String>
364 <String Id="ProgressTextWriteEnvironmentStringsTemplate" Overridable="yes">Név: [1], érték: [2], művelet: [3]</String>
365 <String Id="ProgressTextWriteIniValues" Overridable="yes">INI-fájlértékek írása</String>
366 <String Id="ProgressTextWriteIniValuesTemplate" Overridable="yes">Fájl: [1], szakasz: [2], kulcs: [3], érték: [4]</String>
367 <String Id="ProgressTextWriteRegistryValues" Overridable="yes">A beállításjegyzék értékeinek írása</String>
368 <String Id="ProgressTextWriteRegistryValuesTemplate" Overridable="yes">Kulcs: [1], név: [2], érték: [3]</String>
369 <String Id="ProgressTextAdvertise" Overridable="yes">Alkalmazás meghirdetése</String>
370 <String Id="ProgressTextGenerateScript" Overridable="yes">Végrehajtandó parancsfájl-műveletek generálása:</String>
371 <String Id="ProgressTextGenerateScriptTemplate" Overridable="yes">[1]</String>
372 <String Id="ProgressTextInstallSFPCatalogFile" Overridable="yes">Rendszerkatalógus telepítése</String>
373 <String Id="ProgressTextInstallSFPCatalogFileTemplate" Overridable="yes">Fájl: [1], függőségek: [2]</String>
374 <String Id="ProgressTextMsiPublishAssemblies" Overridable="yes">A szerelvény adatainak közzététele</String>
375 <String Id="ProgressTextMsiPublishAssembliesTemplate" Overridable="yes">Alkalmazáskörnyezet:[1], szerelvény neve:[2]</String>
376 <String Id="ProgressTextMsiUnpublishAssemblies" Overridable="yes">A szerelvényadatok közzétételének visszavonása</String>
377 <String Id="ProgressTextMsiUnpublishAssembliesTemplate" Overridable="yes">Alkalmazáskörnyezet:[1], szerelvény neve:[2]</String>
378 <String Id="ProgressTextRollback" Overridable="yes">Művelet visszavonása:</String>
379 <String Id="ProgressTextRollbackTemplate" Overridable="yes">[1]</String>
380 <String Id="ProgressTextRollbackCleanup" Overridable="yes">Fájlok biztonsági másolatának eltávolítása</String>
381 <String Id="ProgressTextRollbackCleanupTemplate" Overridable="yes">Fájl: [1]</String>
382 <String Id="ProgressTextUnmoveFiles" Overridable="yes">Áthelyezett fájlok eltávolítása</String>
383 <String Id="ProgressTextUnmoveFilesTemplate" Overridable="yes">Fájl: [1], könyvtár: [9]</String>
384 <String Id="ProgressTextUnpublishProduct" Overridable="yes">A termékadatok közzétételének visszavonása</String>
385
386 <String Id="Error0" Overridable="yes">{{Helyreállíthatatlan hiba: }}</String>
387 <String Id="Error1" Overridable="yes">{{Hiba: [1]. }}</String>
388 <String Id="Error2" Overridable="yes">Figyelmeztetés: [1]. </String>
389 <String Id="Error4" Overridable="yes">Információ: [1]. </String>
390 <String Id="Error5" Overridable="yes">Váratlan hiba történt a csomag telepítésekor. Lehet, hogy hibás a csomag. A hibakód a következő: [1]. {{Az argumentumok: [2], [3], [4]}}</String>
391 <String Id="Error7" Overridable="yes">{{A lemez megtelt: }}</String>
392 <String Id="Error8" Overridable="yes">Művelet [Time]: [1]. [2]</String>
393 <String Id="Error9" Overridable="yes">[ProductName]</String>
394 <String Id="Error10" Overridable="yes">{[2]}{, [3]}{, [4]}</String>
395 <String Id="Error11" Overridable="yes">Üzenet típusa: [1], argumentum: [2]</String>
396 <String Id="Error12" Overridable="yes">=== Naplózás kezdete: [Date] [Time] ===</String>
397 <String Id="Error13" Overridable="yes">=== Naplózás vége: [Date] [Time] ===</String>
398 <String Id="Error14" Overridable="yes">Művelet kezdete: [Time]: [1].</String>
399 <String Id="Error15" Overridable="yes">Művelet vége: [Time]: [1]. Visszatérési érték: [2].</String>
400 <String Id="Error16" Overridable="yes">Hátralévő idő: {[1] perc }{[2] másodperc}</String>
401 <String Id="Error17" Overridable="yes">Kevés a memória. Az újabb kísérlet előtt zárjon be néhány alkalmazást.</String>
402 <String Id="Error18" Overridable="yes">A telepítő nem válaszol.</String>
403 <String Id="Error19" Overridable="yes">A telepítés idő előtt leállt.</String>
404 <String Id="Error20" Overridable="yes">Kis türelmet, a Windows a(z) [ProductName] konfigurálását végzi.</String>
405 <String Id="Error21" Overridable="yes">A szükséges adatok összegyűjtése...</String>
406 <String Id="Error22" Overridable="yes">Az alkalmazás régebbi verzióinak eltávolítása...</String>
407 <String Id="Error23" Overridable="yes">Felkészülés az alkalmazás régebbi verzióinak eltávolítására...</String>
408 <String Id="Error32" Overridable="yes">{[ProductName] – }A telepítés sikeresen befejeződött.</String>
409 <String Id="Error33" Overridable="yes">{[ProductName] – }A telepítés sikertelen volt.</String>
410 <String Id="Error1101" Overridable="yes">Hiba történt a következő fájl olvasásakor: [2].{{ Rendszerhiba: [3].}} Ellenőrizze, hogy létezik-e a fájl, és hogy hozzá tud-e férni.</String>
411 <String Id="Error1301" Overridable="yes">Nem hozható létre „[2]” nevű fájl. Már létezik ilyen nevű könyvtár. Szakítsa meg a telepítést, és próbálja meg másik helyre telepíteni a szoftvert.</String>
412 <String Id="Error1302" Overridable="yes">Helyezze be a következő lemezt: [2].</String>
413 <String Id="Error1303" Overridable="yes">A telepítőnek nincs megfelelő jogosultsága a következő könyvtár eléréséhez: [2]. A telepítés nem folytatható. Jelentkezzen be rendszergazdaként, vagy forduljon a rendszergazdához.</String>
414 <String Id="Error1304" Overridable="yes">Hiba történt a következő fájl írásakor: [2]. Ellenőrizze, hogy hozzá tud-e férni a könyvtárhoz.</String>
415 <String Id="Error1305" Overridable="yes">Hiba történt a következő fájl olvasásakor: [2].{{ Rendszerhiba: [3].}} Ellenőrizze, hogy létezik-e a fájl, és hogy hozzá tud-e férni.</String>
416 <String Id="Error1306" Overridable="yes">Egy másik alkalmazásnak kizárólagos hozzáférése van a következő fájlhoz: „[2]”. Zárjon be minden más alkalmazást, majd kattintson az Újra gombra.</String>
417 <String Id="Error1307" Overridable="yes">Nincs elegendő lemezterület a következő fájl telepítéséhez: [2]. Szabadítson fel lemezterületet, majd kattintson az Újra gombra, vagy a kilépéshez kattintson a Mégse gombra.</String>
418 <String Id="Error1308" Overridable="yes">Nem található a forrásfájl: [2]. Ellenőrizze, hogy létezik-e a fájl, és hogy hozzá tud-e férni.</String>
419 <String Id="Error1309" Overridable="yes">Hiba történt a következő fájl olvasásakor: [3].{{ Rendszerhiba: [2].}} Ellenőrizze, hogy létezik-e a fájl, és hogy hozzá tud-e férni.</String>
420 <String Id="Error1310" Overridable="yes">Hiba történt a következő fájl írásakor: [3].{{ Rendszerhiba: [2].}} Ellenőrizze, hogy hozzá tud-e férni a könyvtárhoz.</String>
421 <String Id="Error1311" Overridable="yes">Nem található a forrásfájl: {{(kabinet)}}: [2]. Ellenőrizze, hogy létezik-e a fájl, és hogy hozzá tud-e férni.</String>
422 <String Id="Error1312" Overridable="yes">Nem hozható létre „[2]” nevű könyvtár. Már létezik ilyen nevű fájl. Nevezze át vagy távolítsa el a fájlt, majd kattintson az Újra gombra, vagy a kilépéshez kattintson a Mégse gombra.</String>
423 <String Id="Error1313" Overridable="yes">A következő kötet jelenleg nem érhető el: [2]. Válasszon másikat.</String>
424 <String Id="Error1314" Overridable="yes">A megadott elérési út („[2]”) nem érhető el.</String>
425 <String Id="Error1315" Overridable="yes">A rendszer nem tudott írni a megadott mappába: [2].</String>
426 <String Id="Error1316" Overridable="yes">Hálózati hiba történt a következő fájl olvasásakor: [2].</String>
427 <String Id="Error1317" Overridable="yes">Hiba történt a következő könyvtár létrehozásakor: [2].</String>
428 <String Id="Error1318" Overridable="yes">Hálózati hiba történt a következő könyvtár létrehozásakor: [2].</String>
429 <String Id="Error1319" Overridable="yes">Hálózati hiba történt a forrásként szolgáló kabinetfájl megnyitásakor: [2].</String>
430 <String Id="Error1320" Overridable="yes">A megadott elérési út túl hosszú: [2].</String>
431 <String Id="Error1321" Overridable="yes">A telepítőnek nincs megfelelő jogosultsága a következő fájl módosításához: [2].</String>
432 <String Id="Error1322" Overridable="yes">A mappa „[2]” elérési útjának egy része érvénytelen. Vagy üres, vagy meghaladja a rendszer által engedélyezett hosszúságot.</String>
433 <String Id="Error1323" Overridable="yes">A mappa „[2]” elérési útja olyan szavakat tartalmaz, amelyek nem használhatók elérési utakban.</String>
434 <String Id="Error1324" Overridable="yes">A mappa „[2]” elérési útja érvénytelen karaktert tartalmaz.</String>
435 <String Id="Error1325" Overridable="yes">A következő rövid fájlnév érvénytelen: „[2]”.</String>
436 <String Id="Error1326" Overridable="yes">Hiba történt a fájl biztonsági adatainak lekérdezésekor: [3]. GetLastError: [2]</String>
437 <String Id="Error1327" Overridable="yes">Érvénytelen meghajtó: [2]</String>
438 <String Id="Error1328" Overridable="yes">Hiba történt a javításnak a következő fájlra való alkalmazásakor: [2]. A fájlt valószínűleg más módon frissítették, és ezzel a javítókészlettel már nem módosítható. További információért forduljon a javítókészlet forgalmazójához. {{Rendszerhiba: [3]}}</String>
439 <String Id="Error1329" Overridable="yes">Egy szükséges fájl nem telepíthető, mert a következő kabinetfájl nincs digitálisan aláírva: [2]. Lehet, hogy a kabinetfájl sérült.</String>
440 <String Id="Error1330" Overridable="yes">Egy szükséges fájl nem telepíthető, mert a következő kabinetfájl aláírása érvénytelen: [2]. Lehet, hogy a kabinetfájl sérült.{{ A WinVerifyTrust a következő hibát adta vissza: [3].}}</String>
441 <String Id="Error1331" Overridable="yes">A következő fájl másolása sikertelen: [2]: CRC-hiba.</String>
442 <String Id="Error1332" Overridable="yes">A következő fájl áthelyezése sikertelen: [2]: CRC-hiba.</String>
443 <String Id="Error1333" Overridable="yes">A következő fájl javítása sikertelen: [2]: CRC-hiba.</String>
444 <String Id="Error1334" Overridable="yes">A(z) „[2]” fájl nem telepíthető, mert nem található a kabinetfájlban ([3]). Ennek oka lehet hálózati hiba, a CD-ROM-ról való olvasás hibája vagy a csomaggal kapcsolatos probléma.</String>
445 <String Id="Error1335" Overridable="yes">A telepítéshez szükséges kabinetfájl ([2]) sérült, ezért nem használható. Ennek oka lehet hálózati hiba, a CD-ROM-ról való olvasás hibája vagy a csomaggal kapcsolatos probléma.</String>
446 <String Id="Error1336" Overridable="yes">Hiba történt egy, a telepítés befejezéséhez szükséges ideiglenes fájl létrehozásakor.{{ Mappa: [3]. Rendszerhiba kódja: [2]}}</String>
447 <String Id="Error1401" Overridable="yes">A következő kulcs nem hozható létre: [2].{{ Rendszerhiba: [3].}} Ellenőrizze, hogy van-e megfelelő engedélye a kulcs eléréséhez, vagy forduljon a technikai tanácsadási csoporthoz. </String>
448 <String Id="Error1402" Overridable="yes">A következő kulcs nem nyitható meg: [2].{{ Rendszerhiba: [3].}} Ellenőrizze, hogy van-e megfelelő engedélye a kulcs eléréséhez, vagy forduljon a technikai tanácsadási csoporthoz. </String>
449 <String Id="Error1403" Overridable="yes">A(z) [2] érték nem törölhető a következő kulcsból: [3].{{ Rendszerhiba: [4].}} Ellenőrizze, hogy van-e megfelelő engedélye a kulcs eléréséhez, vagy forduljon a technikai tanácsadási csoporthoz. </String>
450 <String Id="Error1404" Overridable="yes">A következő kulcs nem törölhető: [2].{{ Rendszerhiba: [3].}} Ellenőrizze, hogy van-e megfelelő engedélye a kulcs eléréséhez, vagy forduljon a technikai tanácsadási csoporthoz. </String>
451 <String Id="Error1405" Overridable="yes">Az érték ([2]) nem olvasható ki a következő kulcsból: [3].{{ Rendszerhiba: [4].}} Ellenőrizze, hogy van-e megfelelő engedélye a kulcs eléréséhez, vagy forduljon a technikai tanácsadási csoporthoz. </String>
452 <String Id="Error1406" Overridable="yes">Az érték ([2]) nem írható a következő kulcsba: [3].{{ Rendszerhiba: [4].}} Ellenőrizze, hogy van-e megfelelő engedélye a kulcs eléréséhez, vagy forduljon a technikai tanácsadási csoporthoz.</String>
453 <String Id="Error1407" Overridable="yes">Nem kérdezhető le a következő kulcs értékeinek neve: [2].{{ Rendszerhiba: [3].}} Ellenőrizze, hogy van-e megfelelő engedélye a kulcs eléréséhez, vagy forduljon a technikai tanácsadási csoporthoz.</String>
454 <String Id="Error1408" Overridable="yes">Nem kérdezhető le a következő kulcs alkulcsainak neve: [2].{{ Rendszerhiba: [3].}} Ellenőrizze, hogy van-e megfelelő engedélye a kulcs eléréséhez, vagy forduljon a technikai tanácsadási csoporthoz.</String>
455 <String Id="Error1409" Overridable="yes">Nem olvasható be a következő kulcshoz tartozó biztonsági információ: [2].{{ Rendszerhiba: [3].}} Ellenőrizze, hogy van-e megfelelő engedélye a kulcs eléréséhez, vagy forduljon a technikai tanácsadási csoporthoz.</String>
456 <String Id="Error1410" Overridable="yes">Nem növelhető a beállításjegyzékhez igénybe vehető terület. Ennek az alkalmazásnak a telepítéséhez [2] KB szabad területre van szükség a beállításjegyzékben.</String>
457 <String Id="Error1500" Overridable="yes">Folyamatban van egy másik telepítés. Mielőtt folytatná ezt a telepítést, be kell fejeznie a másikat.</String>
458 <String Id="Error1501" Overridable="yes">Hiba történt a védett adatok elérésekor. Ellenőrizze, hogy a Windows Installer megfelelően van-e konfigurálva, és próbálja meg újból a telepítést.</String>
459 <String Id="Error1502" Overridable="yes">A(z) „[2]” nevű felhasználó korábban elindította a termék („[3]”) telepítését. Ez a felhasználó csak a telepítő újbóli futtatása után használhatja majd a terméket. Az Ön jelenlegi telepítése most folytatódik.</String>
460 <String Id="Error1503" Overridable="yes">A(z) „[2]” nevű felhasználó korábban elindította a termék („[3]”) telepítését. Ez a felhasználó csak a telepítő újbóli futtatása után használhatja majd a terméket.</String>
461 <String Id="Error1601" Overridable="yes">Nincs elegendő szabad lemezterület. Kötet: „[2]”; szükséges terület: [3] KB; szabad terület: [4] KB. Szabadítson fel lemezterületet, majd próbálkozzon újra.</String>
462 <String Id="Error1602" Overridable="yes">Biztosan megszakítja a telepítést?</String>
463 <String Id="Error1603" Overridable="yes">A(z) [2][3] fájl éppen használatban van{ a következő folyamat használja: név: [4], azonosító: [5], ablak címe: „[6]”}. Zárja be a fájlt használó alkalmazást, majd próbálkozzon újra.</String>
464 <String Id="Error1604" Overridable="yes">Az előzőleg telepített „[2]” termék megakadályozza ennek a terméknek a telepítését. A két termék nem kompatibilis.</String>
465 <String Id="Error1605" Overridable="yes">Nincs elég szabad lemezterület a következő köteten a visszaállítási lehetőséggel való telepítés folytatásához: „[2]”. [3] KB szükséges, de csak [4] KB szabad. A telepítés visszaállítási adatok mentése nélküli folytatásához kattintson a Mellőzés gombra, a szabad terület ismételt ellenőrzéséhez kattintson az Újra gombra, vagy a telepítés megszakításához kattintson a Mégse gombra.</String>
466 <String Id="Error1606" Overridable="yes">A következő hálózati hely nem érhető el: [2].</String>
467 <String Id="Error1607" Overridable="yes">A telepítés folytatása előtt be kell zárni a következő alkalmazásokat:</String>
468 <String Id="Error1608" Overridable="yes">Nem található a gépen olyan korábban telepített termék, amely lehetővé tenné ennek a terméknek a telepítését.</String>
469 <String Id="Error1609" Overridable="yes">Hiba történt a biztonsági beállítások alkalmazásakor. A(z) „[2]” nem érvényes felhasználó vagy csoport. Ezt okozhatja a csomag hibája vagy az, hogy nem lehet tartományvezérlőhöz kapcsolódni a hálózaton. Ellenőrizze a hálózati kapcsolatot, majd kattintson az Újra gombra, vagy a telepítés befejezéséhez kattintson a Mégse gombra. {{Nem található a felhasználó SID azonosítója. Rendszerhiba: [3]}}</String>
470 <String Id="Error1701" Overridable="yes">A következő kulcs érvénytelen: [2]. Ellenőrizze, hogy megfelelő kulcsot adott-e meg.</String>
471 <String Id="Error1702" Overridable="yes">A telepítőnek újra kell indítania a rendszert a(z) [2] konfigurálásának folytatása előtt. Kattintson az Igen gombra az azonnali újraindításhoz, vagy a Nem gombra, ha később kívánja újraindítani a számítógépet.</String>
472 <String Id="Error1703" Overridable="yes">A(z) [2] konfigurációjában végzett módosítások érvénybe lépéséhez újra kell indítani a rendszert. Kattintson az Igen gombra az azonnali újraindításhoz, vagy a Nem gombra, ha később kívánja újraindítani a számítógépet.</String>
473 <String Id="Error1704" Overridable="yes">A(z) [2] egy korábbi telepítése jelenleg fel van függesztve. A folytatáshoz vissza kell vonnia a másik telepítés által végzett változtatásokat. Visszavonja a változtatásokat?</String>
474 <String Id="Error1705" Overridable="yes">A termék egy korábban elindított telepítése még folyamatban van. A folytatáshoz vissza kell vonnia a másik telepítés által végzett változtatásokat. Visszavonja a változtatásokat?</String>
475 <String Id="Error1706" Overridable="yes">A termék ([2]) egyik telepítőcsomagja nem található. Próbálja meg újból a telepítést a telepítőcsomag („[3]”) érvényes másolatával.</String>
476 <String Id="Error1707" Overridable="yes">A telepítés sikeresen befejeződött.</String>
477 <String Id="Error1708" Overridable="yes">A telepítés sikertelen.</String>
478 <String Id="Error1709" Overridable="yes">Termék: [2] – [3]</String>
479 <String Id="Error1710" Overridable="yes">Visszaállíthatja a számítógép korábbi állapotát, vagy innen folytathatja a telepítést egy későbbi időpontban. Visszaállítja a korábbi állapotot?</String>
480 <String Id="Error1711" Overridable="yes">Hiba történt a telepítési adatok lemezre írásakor. Ellenőrizze, hogy van-e elég hely a lemezen, és kattintson az Újra gombra, vagy kattintson a Mégse gombra a telepítés befejezéséhez.</String>
481 <String Id="Error1712" Overridable="yes">Nem találhatók a számítógép korábbi állapotának visszaállításához szükséges fájlok. Nem lehet majd visszaállítást végezni.</String>
482 <String Id="Error1713" Overridable="yes">A(z) [2] nem tudja telepíteni az egyik szükséges terméket. Forduljon a technikai tanácsadási csoporthoz. {{Rendszerhiba: [3].}}</String>
483 <String Id="Error1714" Overridable="yes">A(z) [2] régebbi verziója nem távolítható el. Forduljon a technikai tanácsadási csoporthoz. {{Rendszerhiba: [3].}}</String>
484 <String Id="Error1715" Overridable="yes">A(z) [2] telepítése megtörtént.</String>
485 <String Id="Error1716" Overridable="yes">A(z) [2] konfigurálása megtörtént.</String>
486 <String Id="Error1717" Overridable="yes">A(z) [2] eltávolítása megtörtént.</String>
487 <String Id="Error1718" Overridable="yes">A digitális aláírásokra vonatkozó házirend elutasította a következő fájlt: [2].</String>
488 <String Id="Error1719" Overridable="yes">A Windows Installer szolgáltatás nem érhető el. Ez akkor fordulhat elő, ha a Windows csökkentett módban fut, vagy ha a Windows Installer nincs helyesen telepítve. Segítségért forduljon a technikai tanácsadási csoporthoz.</String>
489 <String Id="Error1720" Overridable="yes">Probléma merült fel ezzel a Windows Installer-csomaggal kapcsolatban. A telepítés befejezéséhez szükséges egyik parancsfájl nem futtatható. Forduljon a technikai tanácsadási csoporthoz vagy a csomag forgalmazójához. {{Egyéni művelet: [2], parancsfájlhiba: [3], [4]: [5], sor: [6], oszlop: [7], [8] }}</String>
490 <String Id="Error1721" Overridable="yes">Probléma merült fel ezzel a Windows Installer-csomaggal kapcsolatban. A telepítés befejezéséhez szükséges egyik program nem futtatható. Forduljon a technikai tanácsadási csoporthoz vagy a csomag forgalmazójához. {{Művelet: [2], hely: [3], parancs: [4] }}</String>
491 <String Id="Error1722" Overridable="yes">Probléma merült fel ezzel a Windows Installer-csomaggal kapcsolatban. A telepítés részeként futtatott programok egyike nem a várt módon fejeződött be. Forduljon a technikai tanácsadási csoporthoz vagy a csomag forgalmazójához. {{Művelet: [2], hely: [3], parancs: [4] }}</String>
492 <String Id="Error1723" Overridable="yes">Probléma merült fel ezzel a Windows Installer-csomaggal kapcsolatban. A telepítés befejezéséhez szükséges egyik DLL-fájl nem futtatható. Forduljon a technikai tanácsadási csoporthoz vagy a csomag forgalmazójához. {{Művelet: [2], bejegyzés: [3], függvénytár: [4] }}</String>
493 <String Id="Error1724" Overridable="yes">Az eltávolítás sikeresen befejeződött.</String>
494 <String Id="Error1725" Overridable="yes">Az eltávolítás sikertelen.</String>
495 <String Id="Error1726" Overridable="yes">A hirdetés sikeresen befejeződött.</String>
496 <String Id="Error1727" Overridable="yes">A hirdetés sikertelen.</String>
497 <String Id="Error1728" Overridable="yes">A konfigurálás sikeresen befejeződött.</String>
498 <String Id="Error1729" Overridable="yes">A konfigurálás sikertelen.</String>
499 <String Id="Error1730" Overridable="yes">Az alkalmazás eltávolításához rendszergazdai engedélyek szükségesek. Az alkalmazás eltávolításához jelentkezzen be rendszergazdaként, vagy kérjen segítséget a technikai tanácsadási csoporttól.</String>
500 <String Id="Error1731" Overridable="yes">A következő termék forrás telepítőcsomagja nem felel meg az ügyfél csomagjának: [2]. Próbálja megismételni a telepítést a telepítőcsomag („[3]”) érvényes példányával.</String>
501 <String Id="Error1732" Overridable="yes">A termék ([2]) telepítésének befejezéséhez újra kell indítani a számítógépet. A számítógépre jelenleg más felhasználók is be vannak jelentkezve, és az újraindítás adataik elvesztéséhez vezethet. Újraindítja most a rendszert?</String>
502 <String Id="Error1801" Overridable="yes">Az elérési út ([2]) érvénytelen. Adjon meg érvényes elérési utat.</String>
503 <String Id="Error1802" Overridable="yes">Kevés a memória. Az újabb kísérlet előtt zárja be a többi alkalmazást.</String>
504 <String Id="Error1803" Overridable="yes">Nincs lemez a(z) [2] meghajtóban. Helyezzen be egyet, és kattintson az Újra gombra, vagy kattintson a Mégse gombra, ha vissza kíván térni az előzőleg választott kötethez.</String>
505 <String Id="Error1804" Overridable="yes">Nincs lemez a(z) [2] meghajtóban. Helyezzen be egyet, és kattintson az Újra gombra, vagy kattintson a Mégse gombra, ha vissza kíván térni a Tallózás párbeszédpanelre, ahol másik kötetet választhat.</String>
506 <String Id="Error1805" Overridable="yes">A mappa ([2]) nem létezik. Adjon meg egy létező mappára mutató elérési utat.</String>
507 <String Id="Error1806" Overridable="yes">Nincs megfelelő jogosultsága a mappa olvasásához.</String>
508 <String Id="Error1807" Overridable="yes">Nem sikerült érvényes célmappát meghatározni a telepítéshez.</String>
509 <String Id="Error1901" Overridable="yes">Hiba történt a telepítési forrásadatbázis olvasásakor: [2].</String>
510 <String Id="Error1902" Overridable="yes">Újraindítási művelet ütemezése: fájl átnevezése [2] névről [3] névre. A művelet befejezéséhez újraindítás szükséges.</String>
511 <String Id="Error1903" Overridable="yes">Újraindítási művelet ütemezése: [2] nevű fájl törlése. A művelet befejezéséhez újraindítás szükséges.</String>
512 <String Id="Error1904" Overridable="yes">A modul ([2]) regisztrálása meghiúsult. HRESULT [3]. Forduljon a technikai tanácsadási csoporthoz.</String>
513 <String Id="Error1905" Overridable="yes">A modul ([2]) regisztrációjának törlése meghiúsult. HRESULT [3]. Forduljon a technikai tanácsadási csoporthoz.</String>
514 <String Id="Error1906" Overridable="yes">A csomag ([2]) gyorsítótárba írása sikertelen. Hiba: [3]. Forduljon a technikai tanácsadási csoporthoz.</String>
515 <String Id="Error1907" Overridable="yes">A(z) [2] betűkészlet regisztrálása meghiúsult. Ellenőrizze, hogy rendelkezik-e a betűkészletek telepítéséhez szükséges engedélyekkel, és hogy a rendszer támogatja-e ezt a betűkészletet.</String>
516 <String Id="Error1908" Overridable="yes">A következő betűkészletnek a beállításjegyzékből való törlése sikertelen: [2]. Ellenőrizze, hogy rendelkezik-e a betűkészletek eltávolításához szükséges engedélyekkel.</String>
517 <String Id="Error1909" Overridable="yes">A következő parancsikon nem hozható létre: [2]. Ellenőrizze, hogy létezik-e a célmappa, és hogy hozzá tud-e férni.</String>
518 <String Id="Error1910" Overridable="yes">A következő parancsikon nem távolítható el: [2]. Ellenőrizze, hogy létezik-e a parancsikonfájl, és hogy hozzá tud-e férni.</String>
519 <String Id="Error1911" Overridable="yes">A következő fájl típustára nem regisztrálható: [2]. Forduljon a technikai tanácsadási csoporthoz.</String>
520 <String Id="Error1912" Overridable="yes">A következő fájl típustárának regisztrációja nem törölhető: [2]. Forduljon a technikai tanácsadási csoporthoz.</String>
521 <String Id="Error1913" Overridable="yes">A következő INI-fájl nem frissíthető: [2][3]. Ellenőrizze, hogy létezik-e a fájl, és hogy hozzá tud-e férni.</String>
522 <String Id="Error1914" Overridable="yes">Nem ütemezhető be, hogy újraindításkor a(z) [2] fájl lecserélje a következőt: [3]. Ellenőrizze, hogy rendelkezik-e a fájl ([3]) írásához szükséges engedélyekkel.</String>
523 <String Id="Error1915" Overridable="yes">Hiba történt az ODBC-illesztőprogram kezelőjének eltávolításakor, ODBC-hiba: [2]: [3]. Forduljon a technikai tanácsadási csoporthoz.</String>
524 <String Id="Error1916" Overridable="yes">Hiba történt az ODBC-illesztőprogram kezelőjének telepítésekor, ODBC-hiba: [2]: [3]. Forduljon a technikai tanácsadási csoporthoz.</String>
525 <String Id="Error1917" Overridable="yes">Hiba történt az ODBC-illesztőprogram eltávolításakor: [4], ODBC-hiba: [2]: [3]. Ellenőrizze, hogy rendelkezik-e az ODBC-illesztőprogramok eltávolításához szükséges engedélyekkel.</String>
526 <String Id="Error1918" Overridable="yes">Hiba történt az ODBC-illesztőprogram telepítésekor: [4], ODBC-hiba: [2]: [3]. Ellenőrizze, hogy létezik-e a(z) [4] fájl, és hogy hozzá tud-e férni.</String>
527 <String Id="Error1919" Overridable="yes">Hiba történt az ODBC-adatforrás konfigurálásakor: [4], ODBC-hiba: [2]: [3]. Ellenőrizze, hogy létezik-e a(z) [4] fájl, és hogy hozzá tud-e férni.</String>
528 <String Id="Error1920" Overridable="yes">A következő szolgáltatás nem indult el: „[2]” ([3]). Ellenőrizze, hogy rendelkezik-e a rendszerszolgáltatások indításához szükséges engedélyekkel.</String>
529 <String Id="Error1921" Overridable="yes">A következő szolgáltatás nem állítható le: „[2]” ([3]). Ellenőrizze, hogy rendelkezik-e a rendszerszolgáltatások leállításához szükséges engedélyekkel.</String>
530 <String Id="Error1922" Overridable="yes">A következő szolgáltatás nem törölhető: „[2]” ([3]). Ellenőrizze, hogy rendelkezik-e a rendszerszolgáltatások eltávolításához szükséges engedélyekkel.</String>
531 <String Id="Error1923" Overridable="yes">A következő szolgáltatás nem telepíthető: „[2]” ([3]). Ellenőrizze, hogy rendelkezik-e a rendszerszolgáltatások telepítéséhez szükséges engedélyekkel.</String>
532 <String Id="Error1924" Overridable="yes">A következő környezeti változó nem frissíthető: „[2]”. Ellenőrizze, hogy rendelkezik-e a környezeti változók módosításához szükséges engedélyekkel.</String>
533 <String Id="Error1925" Overridable="yes">Nincs megfelelő jogosultsága ahhoz, hogy a telepítést a számítógép összes felhasználója számára elvégezze. Jelentkezzen be rendszergazdaként, és próbálja meg újból a telepítést.</String>
534 <String Id="Error1926" Overridable="yes">Nem állíthatók be a következő fájl biztonsági tulajdonságai: „[3]”. Hiba: [2]. Ellenőrizze, hogy rendelkezik-e megfelelő jogosultsággal a fájl biztonsági engedélyeinek módosításához.</String>
535 <String Id="Error1927" Overridable="yes">Nincsenek telepítve a számítógépen a komponensszolgáltatások (COM+ 1.0). A telepítés sikeres befejezéséhez szükség van a komponensszolgáltatásokra. A komponensszolgáltatások a Windows 2000 rendszeren érhetők el.</String>
536 <String Id="Error1928" Overridable="yes">Hiba történt egy COM+ alkalmazás regisztrálásakor. További tájékoztatásért forduljon a technikai tanácsadási csoporthoz.</String>
537 <String Id="Error1929" Overridable="yes">Hiba történt egy COM+ alkalmazás regisztrációjának törlésekor. További tájékoztatásért forduljon a technikai tanácsadási csoporthoz.</String>
538 <String Id="Error1930" Overridable="yes">A következő szolgáltatás leírása nem módosítható: „[2]” ([3]).</String>
539 <String Id="Error1931" Overridable="yes">A Windows Installer szolgáltatás nem tudja frissíteni a következő rendszerfájlt, mert azt a Windows védi: [2]. A program helyes működéséhez esetleg frissítenie kell az operációs rendszert. {{Csomag verziója: [3], az operációs rendszer által védett verzió: [4]}}</String>
540 <String Id="Error1932" Overridable="yes">A Windows Installer szolgáltatás nem tudja frissíteni a Windows által védett következő fájlt: [2]. {{Csomag verziója: [3], az operációs rendszer által védett verzió: [4], SFP-hiba: [5]}}</String>
541 <String Id="Error1933" Overridable="yes">A Windows Installer szolgáltatás nem tud frissíteni legalább egy védett Windows-fájlt. {{SFP-hiba: [2]. A védett fájlok listája:\r\n[3]}}</String>
542 <String Id="Error1934" Overridable="yes">Egy házirend tiltja, hogy a felhasználók programot telepítsenek a számítógépre.</String>
543 <String Id="Error1935" Overridable="yes">Hiba történt a következő szerelvény telepítése során: „[6]”. További információ a Súgó és támogatás szolgáltatásban található. HRESULT: [3]. {{szerelvény felülete: [4], függvény: [5], összetevő: [2]}}</String>
544 <String Id="Error1936" Overridable="yes">Hiba történt a következő szerelvény telepítésekor: „[6]”. A szerelvény elnevezése nem erős, vagy a minimális hosszúságnál rövidebb kulccsal van aláírva. HRESULT: [3]. {{szerelvény felülete: [4], függvény: [5], összetevő: [2]}}</String>
545 <String Id="Error1937" Overridable="yes">Hiba történt a következő szerelvény telepítésekor: „[6]”. Az aláírás vagy a katalógus nem ellenőrizhető vagy nem érvényes. HRESULT: [3]. {{szerelvény felülete: [4], függvény: [5], összetevő: [2]}}</String>
546 <String Id="Error1938" Overridable="yes">Hiba történt a következő szerelvény telepítésekor: „[6]”. A szerelvény egy vagy több modulja nem található. HRESULT: [3]. {{szerelvény felülete: [4], függvény: [5], összetevő: [2]}}</String>
547
548 <String Id="UITextbytes" Overridable="yes">bájt</String>
549 <String Id="UITextGB" Overridable="yes">GB</String>
550 <String Id="UITextKB" Overridable="yes">KB</String>
551 <String Id="UITextMB" Overridable="yes">MB</String>
552 <String Id="UITextMenuAbsent" Overridable="yes">A teljes szolgáltatás elérhetetlen lesz.</String>
553 <String Id="UITextMenuAdvertise" Overridable="yes">A szolgáltatás igény szerint lesz telepítve.</String>
554 <String Id="UITextMenuAllCD" Overridable="yes">A teljes szolgáltatás CD-ről történő futtatáshoz lesz telepítve.</String>
555 <String Id="UITextMenuAllLocal" Overridable="yes">A teljes szolgáltatás a helyi merevlemezre lesz telepítve.</String>
556 <String Id="UITextMenuAllNetwork" Overridable="yes">A teljes szolgáltatás hálózatról történő futtatáshoz lesz telepítve.</String>
557 <String Id="UITextMenuCD" Overridable="yes">Telepítés CD-ről történő futtatáshoz</String>
558 <String Id="UITextMenuLocal" Overridable="yes">Telepítés a helyi merevlemezre</String>
559 <String Id="UITextMenuNetwork" Overridable="yes">Telepítés hálózatról történő futtatáshoz</String>
560 <String Id="UITextNewFolder" Overridable="yes">Folder|Új mappa</String>
561 <String Id="UITextScriptInProgress" Overridable="yes">A szükséges adatok összegyűjtése...</String>
562 <String Id="UITextSelAbsentAbsent" Overridable="yes">Ez a szolgáltatás nem lesz telepítve.</String>
563 <String Id="UITextSelAbsentAdvertise" Overridable="yes">Ez a szolgáltatás úgy lesz beállítva, hogy szükség esetén legyen telepítve.</String>
564 <String Id="UITextSelAbsentCD" Overridable="yes">Ez a szolgáltatás úgy lesz telepítve, hogy CD-ről működjön.</String>
565 <String Id="UITextSelAbsentLocal" Overridable="yes">Ez a szolgáltatás a helyi merevlemezre lesz telepítve.</String>
566 <String Id="UITextSelAbsentNetwork" Overridable="yes">Ez a szolgáltatás úgy lesz telepítve, hogy a hálózatról működjön.</String>
567 <String Id="UITextSelAdvertiseAbsent" Overridable="yes">Ez a szolgáltatás a továbbiakban nem lesz elérhető.</String>
568 <String Id="UITextSelAdvertiseAdvertise" Overridable="yes">Szükség esetén lesz telepítve.</String>
569 <String Id="UITextSelAdvertiseCD" Overridable="yes">Ez a szolgáltatás CD-ről lesz elérhető.</String>
570 <String Id="UITextSelAdvertiseLocal" Overridable="yes">Ez a szolgáltatás a helyi merevlemezre lesz telepítve.</String>
571 <String Id="UITextSelAdvertiseNetwork" Overridable="yes">Ez a szolgáltatás a hálózatról lesz elérhető.</String>
572 <String Id="UITextSelCDAbsent" Overridable="yes">Ez a szolgáltatás teljesen el lesz távolítva, CD-ről sem lesz használható.</String>
573 <String Id="UITextSelCDAdvertise" Overridable="yes">Ez a szolgáltatás módosítva lett, hogy a CD-ről való működés helyett szükség esetén legyen telepítve.</String>
574 <String Id="UITextSelCDCD" Overridable="yes">Ez a szolgáltatás továbbra is CD-ről lesz elérhető.</String>
575 <String Id="UITextSelCDLocal" Overridable="yes">Ez a szolgáltatás módosítva lett, hogy a CD-ről való működés helyett a helyi merevlemezre legyen telepítve.</String>
576 <String Id="UITextSelChildCostNeg" Overridable="yes">A szolgáltatással felszabadítható hely a merevlemezen: [1].</String>
577 <String Id="UITextSelChildCostPos" Overridable="yes">A szolgáltatás helyigénye a merevlemezen: [1].</String>
578 <String Id="UITextSelCostPending" Overridable="yes">A szolgáltatás helyigényének kiszámítása...</String>
579 <String Id="UITextSelLocalAbsent" Overridable="yes">Ez a szolgáltatás teljesen el lesz távolítva.</String>
580 <String Id="UITextSelLocalAdvertise" Overridable="yes">Ez a szolgáltatás el lesz távolítva a helyi merevlemezről, de úgy lesz beállítva, hogy szükség esetén telepítve legyen.</String>
581 <String Id="UITextSelLocalCD" Overridable="yes">Ez a szolgáltatás el lesz távolítva a helyi merevlemezről, de CD-ről továbbra is elérhető marad.</String>
582 <String Id="UITextSelLocalLocal" Overridable="yes">A szolgáltatás a helyi merevlemez-meghajtón marad.</String>
583 <String Id="UITextSelLocalNetwork" Overridable="yes">Ez a szolgáltatás el lesz távolítva a helyi merevlemezről, de a hálózatról továbbra is elérhető marad.</String>
584 <String Id="UITextSelNetworkAbsent" Overridable="yes">Ez a szolgáltatás teljesen el lesz távolítva, a hálózatról sem lesz használható.</String>
585 <String Id="UITextSelNetworkAdvertise" Overridable="yes">Ez a szolgáltatás módosítva lett, hogy a hálózatról való működés helyett szükség esetén legyen telepítve.</String>
586 <String Id="UITextSelNetworkLocal" Overridable="yes">Ez a szolgáltatás módosítva lett, hogy a hálózatról való működés helyett a helyi merevlemezre legyen telepítve.</String>
587 <String Id="UITextSelNetworkNetwork" Overridable="yes">Ez a szolgáltatás továbbra is a hálózatról lesz elérhető.</String>
588 <String Id="UITextSelParentCostNegNeg" Overridable="yes">A szolgáltatással felszabadítható hely a merevlemezen: [1]. [3] részszolgáltatásból [2] van kijelölve. A részszolgáltatásokkal felszabadítható hely a merevlemezen: [4].</String>
589 <String Id="UITextSelParentCostNegPos" Overridable="yes">A szolgáltatással felszabadítható hely a merevlemezen: [1]. [3] részszolgáltatásból [2] van kijelölve. A részszolgáltatások helyigénye a merevlemezen: [4].</String>
590 <String Id="UITextSelParentCostPosNeg" Overridable="yes">A szolgáltatás helyigénye a merevlemezen: [1]. [3] részszolgáltatásból [2] van kijelölve. A részszolgáltatásokkal felszabadítható hely a merevlemezen: [4].</String>
591 <String Id="UITextSelParentCostPosPos" Overridable="yes">A szolgáltatás helyigénye a merevlemezen: [1]. [3] részszolgáltatásból [2] van kijelölve. A részszolgáltatások helyigénye a merevlemezen: [4].</String>
592 <String Id="UITextTimeRemaining" Overridable="yes">Hátralévő idő: {[1] perc }{[2] másodperc}</String>
593 <String Id="UITextVolumeCostAvailable" Overridable="yes">Szabad</String>
594 <String Id="UITextVolumeCostDifference" Overridable="yes">Különbség</String>
595 <String Id="UITextVolumeCostRequired" Overridable="yes">Szükséges</String>
596 <String Id="UITextVolumeCostSize" Overridable="yes">Lemez mérete</String>
597 <String Id="UITextVolumeCostVolume" Overridable="yes">Kötet</String>
598</WixLocalization>
diff --git a/src/ext/UI/wixlib/WixUI_it-it.wxl b/src/ext/UI/wixlib/WixUI_it-it.wxl
new file mode 100644
index 00000000..3c608810
--- /dev/null
+++ b/src/ext/UI/wixlib/WixUI_it-it.wxl
@@ -0,0 +1,598 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3
4
5<WixLocalization Culture="it-it" Codepage="1252" xmlns="http://wixtoolset.org/schemas/v4/wxl">
6 <String Id="WixUIBack" Overridable="yes">In&amp;dietro</String>
7 <String Id="WixUINext" Overridable="yes">&amp;Avanti</String>
8 <String Id="WixUICancel" Overridable="yes">Annulla</String>
9 <String Id="WixUIFinish" Overridable="yes">&amp;Fine</String>
10 <String Id="WixUIRetry" Overridable="yes">&amp;Riprova</String>
11 <String Id="WixUIIgnore" Overridable="yes">&amp;Ignora</String>
12 <String Id="WixUIYes" Overridable="yes">&amp;Sì</String>
13 <String Id="WixUINo" Overridable="yes">&amp;No</String>
14 <String Id="WixUIOK" Overridable="yes">OK</String>
15 <String Id="WixUIPrint" Overridable="yes">&amp;Stampa</String>
16
17 <String Id="AdvancedWelcomeEulaDlg_Title" Overridable="yes">Installazione di [ProductName]</String>
18 <String Id="AdvancedWelcomeEulaDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
19 <String Id="AdvancedWelcomeEulaDlgTitle" Overridable="yes">{\WixUI_Font_Title}Leggere il Contratto di Licenza di [ProductName]</String>
20 <String Id="AdvancedWelcomeEulaDlgLicenseAcceptedCheckBox" Overridable="yes">&amp;Accetto i termini del Contratto di Licenza</String>
21 <String Id="AdvancedWelcomeEulaDlgDescriptionPerMachine" Overridable="yes">Fare clic su Installa per installare il prodotto con le opzioni predefinite per tutti gli utenti. Fare clic su Avanzate per modificare le opzioni di installazione.</String>
22 <String Id="AdvancedWelcomeEulaDlgDescriptionPerUser" Overridable="yes">Fare clic su Installa per installare il prodotto con le opzioni predefinite solo per l'utente corrente. Fare clic su Avanzate per modificare le opzioni di installazione.</String>
23 <String Id="AdvancedWelcomeEulaDlgInstall" Overridable="yes">&amp;Installa</String>
24 <String Id="AdvancedWelcomeEulaDlgAdvanced" Overridable="yes">A&amp;vanzate</String>
25 <String Id="Advanced_Font_Normal_Size" Overridable="yes">8</String>
26 <String Id="Advanced_Font_Bigger_Size" Overridable="yes">12</String>
27 <String Id="Advanced_Font_Title_Size" Overridable="yes">9</String>
28 <String Id="Advanced_Font_Emphasized_Size" Overridable="yes">8</String>
29 <String Id="Advanced_Font_FaceName" Overridable="yes">Tahoma</String>
30
31 <String Id="BrowseDlg_Title" Overridable="yes">Installazione di [ProductName]</String>
32 <String Id="BrowseDlgComboLabel" Overridable="yes">&amp;Cerca in:</String>
33 <String Id="BrowseDlgWixUI_Bmp_Up" Overridable="yes">WixUI_Bmp_Up</String>
34 <String Id="BrowseDlgWixUI_Bmp_UpTooltip" Overridable="yes">Livello superiore</String>
35 <String Id="BrowseDlgNewFolder" Overridable="yes">WixUI_Bmp_New</String>
36 <String Id="BrowseDlgNewFolderTooltip" Overridable="yes">Crea una nuova cartella</String>
37 <String Id="BrowseDlgPathLabel" Overridable="yes">&amp;Nome cartella:</String>
38 <String Id="BrowseDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
39 <String Id="BrowseDlgDescription" Overridable="yes">Scegliere la cartella di destinazione</String>
40 <String Id="BrowseDlgTitle" Overridable="yes">{\WixUI_Font_Title}Modifica cartella di destinazione</String>
41
42 <String Id="CancelDlg_Title" Overridable="yes">Installazione di [ProductName]</String>
43 <String Id="CancelDlgText" Overridable="yes">Annullare l'installazione di [ProductName]?</String>
44 <String Id="CancelDlgIcon" Overridable="yes">WixUI_Ico_Info</String>
45 <String Id="CancelDlgIconTooltip" Overridable="yes">Icona informazioni</String>
46
47 <String Id="CustomizeDlg_Title" Overridable="yes">Installazione di [ProductName]</String>
48 <String Id="CustomizeDlgTree" Overridable="yes">Albero delle selezioni</String>
49 <String Id="CustomizeDlgBrowse" Overridable="yes">Sf&amp;oglia...</String>
50 <String Id="CustomizeDlgReset" Overridable="yes">Re&amp;imposta</String>
51 <String Id="CustomizeDlgDiskCost" Overridable="yes">&amp;Utilizzo disco</String>
52 <String Id="CustomizeDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
53 <String Id="CustomizeDlgText" Overridable="yes">Per modificare la modalità di installazione delle funzionalità, fare clic sulle icone nell'albero sottostante.</String>
54 <String Id="CustomizeDlgDescription" Overridable="yes">Selezionare la modalità di installazione delle funzionalità desiderata.</String>
55 <String Id="CustomizeDlgTitle" Overridable="yes">{\WixUI_Font_Title}Installazione personalizzata</String>
56 <String Id="CustomizeDlgItemDescription" Overridable="yes">CustomizeDlgItemDescription-CustomizeDlgItemDescription</String>
57 <String Id="CustomizeDlgItemSize" Overridable="yes">CustomizeDlgItemSize-CustomizeDlgItemSize</String>
58 <String Id="CustomizeDlgLocation" Overridable="yes">CustomizeDlgLocation-CustomizeDlgLocation</String>
59 <String Id="CustomizeDlgLocationLabel" Overridable="yes">Percorso:</String>
60
61 <String Id="DiskCostDlg_Title" Overridable="yes">Installazione di [ProductName]</String>
62 <String Id="DiskCostDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
63 <String Id="DiskCostDlgText" Overridable="yes">Lo spazio su disco disponibile nei volumi evidenziati non è sufficiente per installare le funzionalità selezionate. Rimuovere alcuni file dai volumi evidenziati, installare un numero minore di funzionalità oppure selezionare unità di destinazione diverse.</String>
64 <String Id="DiskCostDlgDescription" Overridable="yes">Spazio su disco necessario per l'installazione delle funzionalità selezionate.</String>
65 <String Id="DiskCostDlgTitle" Overridable="yes">{\WixUI_Font_Title}Requisiti di spazio su disco</String>
66 <String Id="DiskCostDlgVolumeList" Overridable="yes">{120}{70}{70}{70}{70}</String>
67
68 <String Id="ErrorDlg_Title" Overridable="yes">Installazione di [ProductName]</String>
69 <String Id="ErrorDlgErrorText" Overridable="yes">Testo informativo</String>
70 <String Id="ErrorDlgErrorIcon" Overridable="yes">WixUI_Ico_Info</String>
71 <String Id="ErrorDlgErrorIconTooltip" Overridable="yes">Icona informazioni</String>
72
73 <String Id="ExitDialog_Title" Overridable="yes">Installazione di [ProductName]</String>
74 <String Id="ExitDialogBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
75 <String Id="ExitDialogDescription" Overridable="yes">Fare clic sul pulsante Fine per uscire dall'Installazione guidata.</String>
76 <String Id="ExitDialogTitle" Overridable="yes">{\WixUI_Font_Bigger}Installazione guidata di [ProductName] completata</String>
77
78 <String Id="FatalError_Title" Overridable="yes">Installazione di [ProductName]</String>
79 <String Id="FatalErrorBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
80 <String Id="FatalErrorTitle" Overridable="yes">{\WixUI_Font_Bigger}Installazione guidata di [ProductName] terminata prima del completamento</String>
81 <String Id="FatalErrorDescription1" Overridable="yes">L'Installazione guidata di [ProductName] è terminata prima del completamento a causa di un errore. Il sistema non è stato modificato. Per installare il programma in un secondo momento, eseguire di nuovo l'Installazione guidata.</String>
82 <String Id="FatalErrorDescription2" Overridable="yes">Fare clic sul pulsante Fine per uscire dall'Installazione guidata.</String>
83
84 <String Id="FeaturesDlg_Title" Overridable="yes">Installazione di [ProductName]</String>
85 <String Id="FeaturesDlgTree" Overridable="yes">Funzionalità del prodotto</String>
86 <String Id="FeaturesDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
87 <String Id="FeaturesDlgDescription" Overridable="yes">Selezionare la modalità di installazione delle funzionalità desiderata.</String>
88 <String Id="FeaturesDlgTitle" Overridable="yes">{\WixUI_Font_Title}Funzionalità del prodotto</String>
89 <String Id="FeaturesDlgItemDescription" Overridable="yes">FeaturesDlgItemDescription</String>
90 <String Id="FeaturesDlgItemSize" Overridable="yes">FeaturesDlgItemSize</String>
91 <String Id="FeaturesDlgInstall" Overridable="yes">&amp;Installa</String>
92 <String Id="FeaturesDlgChange" Overridable="yes">&amp;Cambia</String>
93
94 <String Id="FilesInUse_Title" Overridable="yes">Installazione di [ProductName]</String>
95 <String Id="FilesInUseExit" Overridable="yes">E&amp;sci</String>
96 <String Id="FilesInUseBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
97 <String Id="FilesInUseText" Overridable="yes">Le applicazioni seguenti stanno utilizzando file che devono essere aggiornati da questa installazione. Chiudere le applicazioni, quindi fare clic su &amp;Riprova per continuare l'installazione. Per uscire dall'installazione, fare clic su Esci.</String>
98 <String Id="FilesInUseDescription" Overridable="yes">Alcuni file che richiedono l'aggiornamento sono attualmente in uso.</String>
99 <String Id="FilesInUseTitle" Overridable="yes">{\WixUI_Font_Title}File in uso</String>
100
101 <String Id="InstallDirDlg_Title" Overridable="yes">Installazione di [ProductName]</String>
102 <String Id="InstallDirDlgChange" Overridable="yes">&amp;Cambia...</String>
103 <String Id="InstallDirDlgTitle" Overridable="yes">{\WixUI_Font_Title}Cartella di destinazione</String>
104 <String Id="InstallDirDlgDescription" Overridable="yes">Fare clic su Avanti per eseguire l'installazione nella cartella predefinita o su Cambia per scegliere una cartella diversa.</String>
105 <String Id="InstallDirDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
106 <String Id="InstallDirDlgFolderLabel" Overridable="yes">Installazione di [ProductName] in:</String>
107
108 <String Id="InstallScopeDlg_Title" Overridable="yes">Installazione di [ProductName]</String>
109 <String Id="InstallScopeDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
110 <String Id="InstallScopeDlgDescription" Overridable="yes">Scegliere la cartella e l'ambito di installazione</String>
111 <String Id="InstallScopeDlgTitle" Overridable="yes">{\WixUI_Font_Title}Ambito di installazione</String>
112 <String Id="InstallScopeDlgPerUser" Overridable="yes">{\WixUI_Font_Emphasized}Installa solo per l'&amp;utente corrente ([LogonUser])</String>
113 <String Id="InstallScopeDlgPerUserDescription" Overridable="yes">[ProductName] verrà installato in una cartella per utente e sarà disponibile solo per l'account utente corrente. Non sono necessari privilegi di amministratore locale.</String>
114 <String Id="InstallScopeDlgNoPerUserDescription" Overridable="yes">[ProductName] non supporta l'installazione per utente.</String>
115 <String Id="InstallScopeDlgPerMachine" Overridable="yes">{\WixUI_Font_Emphasized}Installa per tutti gli utenti di questo co&amp;mputer</String>
116 <String Id="InstallScopeDlgPerMachineDescription" Overridable="yes">[ProductName] verrà installato in una cartella per computer per impostazione predefinita e sarà disponibile per tutti gli utenti. È possibile modificare la cartella di installazione predefinita. È necessario disporre dei privilegi di amministratore locale.</String>
117 <String Id="InstallScopeDlgFolderLabel" Overridable="yes">Cartella di i&amp;nstallazione:</String>
118 <String Id="InstallScopeDlgChange" Overridable="yes">&amp;Cambia...</String>
119
120 <String Id="InvalidDirDlg_Title" Overridable="yes">Installazione di [ProductName]</String>
121 <String Id="InvalidDirDlgText" Overridable="yes">La directory di installazione deve trovarsi su un disco rigido locale.</String>
122 <String Id="InvalidDirDlgIcon" Overridable="yes">WixUI_Ico_Info</String>
123 <String Id="InvalidDirDlgIconTooltip" Overridable="yes">Icona informazioni</String>
124
125 <String Id="LicenseAgreementDlg_Title" Overridable="yes">Installazione di [ProductName]</String>
126 <String Id="LicenseAgreementDlgLicenseAcceptedCheckBox" Overridable="yes">&amp;Accetto i termini del Contratto di Licenza</String>
127 <String Id="LicenseAgreementDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
128 <String Id="LicenseAgreementDlgDescription" Overridable="yes">Leggere attentamente il Contratto di Licenza</String>
129 <String Id="LicenseAgreementDlgTitle" Overridable="yes">{\WixUI_Font_Title}Contratto di Licenza con l'utente finale</String>
130
131 <String Id="MaintenanceTypeDlg_Title" Overridable="yes">Installazione di [ProductName]</String>
132 <String Id="MaintenanceTypeDlgChangeButton" Overridable="yes">&amp;Cambia</String>
133 <String Id="MaintenanceTypeDlgChangeButtonTooltip" Overridable="yes">Consente di modificare l'installazione</String>
134 <String Id="MaintenanceTypeDlgRepairButton" Overridable="yes">Ri&amp;para</String>
135 <String Id="MaintenanceTypeDlgRepairButtonTooltip" Overridable="yes">Consente di riparare l'installazione</String>
136 <String Id="MaintenanceTypeDlgRemoveButton" Overridable="yes">&amp;Rimuovi</String>
137 <String Id="MaintenanceTypeDlgRemoveButtonTooltip" Overridable="yes">Consente di rimuovere l'installazione</String>
138 <String Id="MaintenanceTypeDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
139 <String Id="MaintenanceTypeDlgDescription" Overridable="yes">Selezionare l'operazione che si desidera eseguire.</String>
140 <String Id="MaintenanceTypeDlgTitle" Overridable="yes">{\WixUI_Font_Title}Modifica, riparazione o rimozione installazione</String>
141 <String Id="MaintenanceTypeDlgChangeText" Overridable="yes">Cambia la modalità di installazione delle funzionalità.</String>
142 <String Id="MaintenanceTypeDlgChangeDisabledText" Overridable="yes">[ProductName] non dispone di funzionalità selezionabili separatamente.</String>
143 <String Id="MaintenanceTypeDlgRemoveText" Overridable="yes">Consente di rimuovere [ProductName] dal computer.</String>
144 <String Id="MaintenanceTypeDlgRemoveDisabledText" Overridable="yes">Impossibile rimuovere [ProductName].</String>
145 <String Id="MaintenanceTypeDlgRepairText" Overridable="yes">Corregge gli errori presenti nell'installazione più recente ripristinando file mancanti o danneggiati, collegamenti e voci del Registro di sistema.</String>
146 <String Id="MaintenanceTypeDlgRepairDisabledText" Overridable="yes">Impossibile riparare [ProductName].</String>
147
148 <String Id="MaintenanceWelcomeDlg_Title" Overridable="yes">Installazione di [ProductName]</String>
149 <String Id="MaintenanceWelcomeDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
150 <String Id="MaintenanceWelcomeDlgDescription" Overridable="yes">L'Installazione guidata consente di cambiare la modalità di installazione delle funzionalità di [ProductName] nel computer oppure di rimuovere il prodotto. Fare clic su Avanti per continuare oppure su Annulla per uscire dall'Installazione guidata.</String>
151 <String Id="MaintenanceWelcomeDlgTitle" Overridable="yes">{\WixUI_Font_Bigger}Installazione guidata di [ProductName]</String>
152
153 <String Id="MsiRMFilesInUse_Title" Overridable="yes">Installazione di [ProductName]</String>
154 <String Id="MsiRMFilesInUseBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
155 <String Id="MsiRMFilesInUseText" Overridable="yes">Le applicazioni seguenti utilizzano file che devono essere aggiornati da questa installazione. È possibile consentirne la chiusura e il successivo riavvio da parte dell'Installazione guidata oppure riavviare il computer in seguito.</String>
156 <String Id="MsiRMFilesInUseDescription" Overridable="yes">Alcuni file che richiedono l'aggiornamento sono attualmente in uso.</String>
157 <String Id="MsiRMFilesInUseTitle" Overridable="yes">{\WixUI_Font_Title}File in uso</String>
158 <String Id="MsiRMFilesInUseUseRM" Overridable="yes">&amp;Chiudi le applicazioni e tenta di riavviarle.</String>
159 <String Id="MsiRMFilesInUseDontUseRM" Overridable="yes">&amp;Non chiudere le applicazioni. Sarà necessario riavviare il sistema.</String>
160
161 <String Id="OutOfDiskDlg_Title" Overridable="yes">Installazione di [ProductName]</String>
162 <String Id="OutOfDiskDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
163 <String Id="OutOfDiskDlgText" Overridable="yes">Lo spazio su disco disponibile nei volumi evidenziati non è sufficiente per installare le funzionalità attualmente selezionate. Rimuovere alcuni file dai volumi evidenziati, installare un numero minore di funzionalità oppure selezionare un'unità di destinazione diversa.</String>
164 <String Id="OutOfDiskDlgDescription" Overridable="yes">Spazio su disco disponibile insufficiente per l'installazione.</String>
165 <String Id="OutOfDiskDlgTitle" Overridable="yes">{\WixUI_Font_Title}Spazio su disco insufficiente</String>
166 <String Id="OutOfDiskDlgVolumeList" Overridable="yes">{120}{70}{70}{70}{70}</String>
167
168 <String Id="OutOfRbDiskDlg_Title" Overridable="yes">Installazione di [ProductName]</String>
169 <String Id="OutOfRbDiskDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
170 <String Id="OutOfRbDiskDlgText" Overridable="yes">Lo spazio su disco disponibile nei volumi evidenziati non è sufficiente per installare le funzionalità attualmente selezionate. Rimuovere alcuni file dai volumi evidenziati, installare un numero minore di funzionalità oppure selezionare un'unità di destinazione diversa.</String>
171 <String Id="OutOfRbDiskDlgDescription" Overridable="yes">Spazio su disco disponibile insufficiente per l'installazione.</String>
172 <String Id="OutOfRbDiskDlgTitle" Overridable="yes">{\WixUI_Font_Title}Spazio su disco insufficiente</String>
173 <String Id="OutOfRbDiskDlgVolumeList" Overridable="yes">{120}{70}{70}{70}{70}</String>
174 <String Id="OutOfRbDiskDlgText2" Overridable="yes">In alternativa, è possibile scegliere di disabilitare la funzionalità di ripristino dello stato precedente all'installazione che consente, nel caso in cui l'installazione venga interrotta, di ripristinare lo stato originario del computer. Per disabilitare la funzionalità di ripristino dello stato precedente all'installazione, fare clic su Sì.</String>
175
176 <String Id="PrepareDlg_Title" Overridable="yes">Installazione di [ProductName]</String>
177 <String Id="PrepareDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
178 <String Id="PrepareDlgDescription" Overridable="yes">Attendere. È in corso la preparazione dell'Installazione guidata.</String>
179 <String Id="PrepareDlgTitle" Overridable="yes">{\WixUI_Font_Bigger}Installazione guidata di [ProductName]</String>
180
181 <String Id="ProgressDlg_Title" Overridable="yes">Installazione di [ProductName]</String>
182 <String Id="ProgressDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
183 <String Id="ProgressDlgTextInstalling" Overridable="yes">Attendere. È in corso l'installazione di [ProductName].</String>
184 <String Id="ProgressDlgTitleInstalling" Overridable="yes">{\WixUI_Font_Title}Installazione di [ProductName]</String>
185 <String Id="ProgressDlgTextChanging" Overridable="yes">Attendere. È in corso la modifica di [ProductName].</String>
186 <String Id="ProgressDlgTitleChanging" Overridable="yes">{\WixUI_Font_Title}Modifica di [ProductName]</String>
187 <String Id="ProgressDlgTextRepairing" Overridable="yes">Attendere. È in corso la riparazione di [ProductName].</String>
188 <String Id="ProgressDlgTitleRepairing" Overridable="yes">{\WixUI_Font_Title}Riparazione di [ProductName]</String>
189 <String Id="ProgressDlgTextRemoving" Overridable="yes">Attendere. È in corso la rimozione di [ProductName].</String>
190 <String Id="ProgressDlgTitleRemoving" Overridable="yes">{\WixUI_Font_Title}Rimozione di [ProductName]</String>
191 <String Id="ProgressDlgTextUpdating" Overridable="yes">Attendere. È in corso l'aggiornamento di [ProductName].</String>
192 <String Id="ProgressDlgTitleUpdating" Overridable="yes">{\WixUI_Font_Title}Aggiornamento di [ProductName]</String>
193 <String Id="ProgressDlgProgressBar" Overridable="yes">Stato</String>
194 <String Id="ProgressDlgStatusLabel" Overridable="yes">Stato:</String>
195
196 <String Id="ResumeDlg_Title" Overridable="yes">Installazione di [ProductName]</String>
197 <String Id="ResumeDlgInstall" Overridable="yes">&amp;Installa</String>
198 <String Id="ResumeDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
199 <String Id="ResumeDlgDescription" Overridable="yes">L'installazione di [ProductName] nel computer in uso verrà completata. Fare clic su Installa per continuare oppure su Annulla per uscire dall'Installazione guidata.</String>
200 <String Id="ResumeDlgTitle" Overridable="yes">{\WixUI_Font_Bigger}Ripresa dell'Installazione guidata di [ProductName]</String>
201
202 <String Id="SetupTypeDlg_Title" Overridable="yes">Installazione di [ProductName]</String>
203 <String Id="SetupTypeDlgTypicalButton" Overridable="yes">&amp;Tipica</String>
204 <String Id="SetupTypeDlgTypicalButtonTooltip" Overridable="yes">Installazione tipica</String>
205 <String Id="SetupTypeDlgCustomButton" Overridable="yes">P&amp;ersonalizzata</String>
206 <String Id="SetupTypeDlgCustomButtonTooltip" Overridable="yes">Installazione personalizzata</String>
207 <String Id="SetupTypeDlgCompleteButton" Overridable="yes">C&amp;ompleta</String>
208 <String Id="SetupTypeDlgCompleteButtonTooltip" Overridable="yes">Installazione completa</String>
209 <String Id="SetupTypeDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
210 <String Id="SetupTypeDlgTitle" Overridable="yes">{\WixUI_Font_Title}Scegliere il tipo di installazione</String>
211 <String Id="SetupTypeDlgDescription" Overridable="yes">Scegliere il tipo di installazione più adatto</String>
212 <String Id="SetupTypeDlgTypicalText" Overridable="yes">Vengono installate le funzionalità del programma più comuni. Opzione consigliata per la maggior parte degli utenti.</String>
213 <String Id="SetupTypeDlgCustomText" Overridable="yes">Consente agli utenti di scegliere le funzionalità del programma da installare e la posizione in cui verranno installate. Opzione consigliata per utenti esperti.</String>
214 <String Id="SetupTypeDlgCompleteText" Overridable="yes">Verranno installate tutte le funzionalità del programma. È necessaria la quantità massima di spazio su disco.</String>
215
216 <String Id="UserExit_Title" Overridable="yes">Installazione di [ProductName]</String>
217 <String Id="UserExitBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
218 <String Id="UserExitTitle" Overridable="yes">{\WixUI_Font_Bigger}Installazione guidata di [ProductName] interrotta</String>
219 <String Id="UserExitDescription1" Overridable="yes">L'installazione di [ProductName] è stata interrotta. Il sistema non è stato modificato. Per installare il programma in un secondo momento, eseguire di nuovo l'installazione.</String>
220 <String Id="UserExitDescription2" Overridable="yes">Fare clic sul pulsante Fine per uscire dall'Installazione guidata.</String>
221
222 <String Id="VerifyReadyDlg_Title" Overridable="yes">Installazione di [ProductName]</String>
223 <String Id="VerifyReadyDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
224 <String Id="VerifyReadyDlgInstall" Overridable="yes">&amp;Installa</String>
225 <String Id="VerifyReadyDlgInstallText" Overridable="yes">Fare clic su Installa per avviare l'installazione. Fare clic su Indietro per rivedere o modificare le impostazioni di installazione. Fare clic su Annulla per uscire dalla procedura guidata.</String>
226 <String Id="VerifyReadyDlgInstallTitle" Overridable="yes">{\WixUI_Font_Title}Inizio installazione di [ProductName]</String>
227 <String Id="VerifyReadyDlgChange" Overridable="yes">&amp;Cambia</String>
228 <String Id="VerifyReadyDlgChangeText" Overridable="yes">Fare clic su Cambia per avviare l'installazione. Fare clic su Indietro per rivedere o modificare le impostazioni di installazione. Fare clic su Annulla per uscire dalla procedura guidata.</String>
229 <String Id="VerifyReadyDlgChangeTitle" Overridable="yes">{\WixUI_Font_Title}Inizio modifica di [ProductName]</String>
230 <String Id="VerifyReadyDlgRepair" Overridable="yes">Ri&amp;para</String>
231 <String Id="VerifyReadyDlgRepairText" Overridable="yes">Fare clic su Ripara per riparare l'installazione di [ProductName]. Fare clic su Indietro per rivedere o modificare le impostazioni di installazione. Fare clic su Annulla per uscire dalla procedura guidata.</String>
232 <String Id="VerifyReadyDlgRepairTitle" Overridable="yes">{\WixUI_Font_Title}Inizio riparazione di [ProductName]</String>
233 <String Id="VerifyReadyDlgRemove" Overridable="yes">&amp;Rimuovi</String>
234 <String Id="VerifyReadyDlgRemoveText" Overridable="yes">Fare clic su Rimuovi per rimuovere [ProductName] dal computer. Fare clic su Indietro per rivedere o modificare le impostazioni di installazione. Fare clic su Annulla per uscire dalla procedura guidata.</String>
235 <String Id="VerifyReadyDlgRemoveTitle" Overridable="yes">{\WixUI_Font_Title}Inizio rimozione di [ProductName]</String>
236 <String Id="VerifyReadyDlgUpdate" Overridable="yes">A&amp;ggiorna</String>
237 <String Id="VerifyReadyDlgUpdateText" Overridable="yes">Fare clic su Aggiorna per eseguire l'aggiornamento di [ProductName] dal computer in uso. Fare clic su Indietro per rivedere o modificare le impostazioni di installazione. Fare clic su Annulla per uscire dalla procedura guidata.</String>
238 <String Id="VerifyReadyDlgUpdateTitle" Overridable="yes">{\WixUI_Font_Title}Inizio aggiornamento di [ProductName]</String>
239
240 <String Id="WaitForCostingDlg_Title" Overridable="yes">Installazione di [ProductName]</String>
241 <String Id="WaitForCostingDlgReturn" Overridable="yes">&amp;Torna indietro</String>
242 <String Id="WaitForCostingDlgText" Overridable="yes">Attendere. È in corso il calcolo dello spazio su disco richiesto.</String>
243 <String Id="WaitForCostingDlgIcon" Overridable="yes">WixUI_Ico_Exclam</String>
244 <String Id="WaitForCostingDlgIconTooltip" Overridable="yes">Icona punto esclamativo</String>
245
246 <String Id="WelcomeDlg_Title" Overridable="yes">Installazione di [ProductName]</String>
247 <String Id="WelcomeDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
248 <String Id="WelcomeDlgDescription" Overridable="yes">L'Installazione guidata consente di installare [ProductName] nel computer. Fare clic su Avanti per continuare oppure su Annulla per uscire dall'Installazione guidata.</String>
249 <String Id="WelcomeUpdateDlgDescriptionUpdate" Overridable="yes">Verrà eseguito l'aggiornamento di [ProductName] nel computer in uso. Fare clic su Avanti per continuare oppure su Annulla per uscire dall'Installazione guidata.</String>
250 <String Id="WelcomeDlgTitle" Overridable="yes">{\WixUI_Font_Bigger}Installazione guidata di [ProductName]</String>
251
252 <String Id="WelcomeEulaDlg_Title" Overridable="yes">Installazione di [ProductName]</String>
253 <String Id="WelcomeEulaDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
254 <String Id="WelcomeEulaDlgLicenseAcceptedCheckBox" Overridable="yes">&amp;Accetto i termini del Contratto di Licenza</String>
255 <String Id="WelcomeEulaDlgInstall" Overridable="yes">&amp;Installa</String>
256 <String Id="WelcomeEulaDlgUpdate" Overridable="yes">A&amp;ggiorna</String>
257 <String Id="WelcomeEulaDlgTitle" Overridable="yes">{\WixUI_Font_Title}Leggere il Contratto di Licenza di [ProductName]</String>
258
259 <String Id="ProgressTextInstallValidate" Overridable="yes">Convalida dell'installazione in corso...</String>
260 <String Id="ProgressTextInstallFiles" Overridable="yes">Copia dei nuovi file in corso...</String>
261 <String Id="ProgressTextInstallFilesTemplate" Overridable="yes">File: [1], directory: [9], dimensione: [6]</String>
262 <String Id="ProgressTextInstallAdminPackage" Overridable="yes">Copia dei file per l'installazione in rete in corso...</String>
263 <String Id="ProgressTextInstallAdminPackageTemplate" Overridable="yes">File: [1], directory: [9], dimensione: [6]</String>
264 <String Id="ProgressTextFileCost" Overridable="yes">Calcolo dello spazio necessario in corso...</String>
265 <String Id="ProgressTextCostInitialize" Overridable="yes">Calcolo dello spazio necessario in corso...</String>
266 <String Id="ProgressTextCostFinalize" Overridable="yes">Calcolo dello spazio necessario in corso...</String>
267 <String Id="ProgressTextCreateShortcuts" Overridable="yes">Creazione dei collegamenti in corso...</String>
268 <String Id="ProgressTextCreateShortcutsTemplate" Overridable="yes">Collegamento: [1]</String>
269 <String Id="ProgressTextPublishComponents" Overridable="yes">Pubblicazione dei componenti qualificati in corso...</String>
270 <String Id="ProgressTextPublishComponentsTemplate" Overridable="yes">ID componente: [1], qualificatore: [2]</String>
271 <String Id="ProgressTextPublishFeatures" Overridable="yes">Pubblicazione delle funzionalità del prodotto in corso...</String>
272 <String Id="ProgressTextPublishFeaturesTemplate" Overridable="yes">Funzionalità: [1]</String>
273 <String Id="ProgressTextPublishProduct" Overridable="yes">Pubblicazione delle informazioni sul prodotto in corso...</String>
274 <String Id="ProgressTextRegisterClassInfo" Overridable="yes">Registrazione dei server delle classi in corso...</String>
275 <String Id="ProgressTextRegisterClassInfoTemplate" Overridable="yes">ID classe: [1]</String>
276 <String Id="ProgressTextRegisterExtensionInfo" Overridable="yes">Registrazione dei server delle estensioni in corso...</String>
277 <String Id="ProgressTextRegisterExtensionInfoTemplate" Overridable="yes">Estensione: [1]</String>
278 <String Id="ProgressTextRegisterMIMEInfo" Overridable="yes">Registrazione delle informazioni MIME in corso...</String>
279 <String Id="ProgressTextRegisterMIMEInfoTemplate" Overridable="yes">Tipo di contenuto MIME: [1], estensione: [2]</String>
280 <String Id="ProgressTextRegisterProgIdInfo" Overridable="yes">Registrazione degli ID di programma in corso...</String>
281 <String Id="ProgressTextRegisterProgIdInfoTemplate" Overridable="yes">ID programma: [1]</String>
282 <String Id="ProgressTextAllocateRegistrySpace" Overridable="yes">Allocazione dello spazio nel Registro di sistema in corso...</String>
283 <String Id="ProgressTextAllocateRegistrySpaceTemplate" Overridable="yes">Spazio disponibile: [1]</String>
284 <String Id="ProgressTextAppSearch" Overridable="yes">Rilevamento delle applicazioni installate in corso...</String>
285 <String Id="ProgressTextAppSearchTemplate" Overridable="yes">Proprietà: [1], firma: [2]</String>
286 <String Id="ProgressTextBindImage" Overridable="yes">Binding dei file eseguibili in corso...</String>
287 <String Id="ProgressTextBindImageTemplate" Overridable="yes">File: [1]</String>
288 <String Id="ProgressTextCCPSearch" Overridable="yes">Ricerca del software originale richiesto in corso...</String>
289 <String Id="ProgressTextCreateFolders" Overridable="yes">Creazione delle cartelle in corso...</String>
290 <String Id="ProgressTextCreateFoldersTemplate" Overridable="yes">Cartella: [1]</String>
291 <String Id="ProgressTextDeleteServices" Overridable="yes">Eliminazione dei servizi in corso...</String>
292 <String Id="ProgressTextDeleteServicesTemplate" Overridable="yes">Servizio: [1]</String>
293 <String Id="ProgressTextDuplicateFiles" Overridable="yes">Creazione file duplicati in corso...</String>
294 <String Id="ProgressTextDuplicateFilesTemplate" Overridable="yes">File: [1], directory: [9], dimensione: [6]</String>
295 <String Id="ProgressTextFindRelatedProducts" Overridable="yes">Ricerca delle applicazioni correlate in corso...</String>
296 <String Id="ProgressTextFindRelatedProductsTemplate" Overridable="yes">Applicazione trovata: [1]</String>
297 <String Id="ProgressTextInstallODBC" Overridable="yes">Installazione dei componenti ODBC in corso...</String>
298 <String Id="ProgressTextInstallServices" Overridable="yes">Installazione dei nuovi servizi in corso...</String>
299 <String Id="ProgressTextInstallServicesTemplate" Overridable="yes">Servizio: [2]</String>
300 <String Id="ProgressTextLaunchConditions" Overridable="yes">Valutazione delle condizioni di avvio in corso...</String>
301 <String Id="ProgressTextMigrateFeatureStates" Overridable="yes">Migrazione degli stati delle funzionalità da applicazioni correlate in corso...</String>
302 <String Id="ProgressTextMigrateFeatureStatesTemplate" Overridable="yes">Applicazione: [1]</String>
303 <String Id="ProgressTextMoveFiles" Overridable="yes">Spostamento dei file in corso...</String>
304 <String Id="ProgressTextMoveFilesTemplate" Overridable="yes">File: [1], directory: [9], dimensione: [6]</String>
305 <String Id="ProgressTextPatchFiles" Overridable="yes">Installazione della patch in corso...</String>
306 <String Id="ProgressTextPatchFilesTemplate" Overridable="yes">File: [1], directory: [2], dimensione: [3]</String>
307 <String Id="ProgressTextProcessComponents" Overridable="yes">Aggiornamento della registrazione del componente in corso...</String>
308 <String Id="ProgressTextRegisterComPlus" Overridable="yes">Registrazione dei componenti e delle applicazioni COM+ in corso...</String>
309 <String Id="ProgressTextRegisterComPlusTemplate" Overridable="yes">ID applicazione: [1]{{, Tipo applicazione: [2], Utenti: [3], RSN: [4]}}</String>
310 <String Id="ProgressTextRegisterFonts" Overridable="yes">Registrazione dei tipi di carattere in corso...</String>
311 <String Id="ProgressTextRegisterFontsTemplate" Overridable="yes">Tipo di carattere: [1]</String>
312 <String Id="ProgressTextRegisterProduct" Overridable="yes">Registrazione del prodotto in corso...</String>
313 <String Id="ProgressTextRegisterProductTemplate" Overridable="yes">[1]</String>
314 <String Id="ProgressTextRegisterTypeLibraries" Overridable="yes">Registrazione delle librerie dei tipi in corso...</String>
315 <String Id="ProgressTextRegisterTypeLibrariesTemplate" Overridable="yes">ID libreria: [1]</String>
316 <String Id="ProgressTextRegisterUser" Overridable="yes">Registrazione dell'utente in corso...</String>
317 <String Id="ProgressTextRegisterUserTemplate" Overridable="yes">[1]</String>
318 <String Id="ProgressTextRemoveDuplicateFiles" Overridable="yes">Rimozione dei file duplicati in corso...</String>
319 <String Id="ProgressTextRemoveDuplicateFilesTemplate" Overridable="yes">File: [1], directory: [9]</String>
320 <String Id="ProgressTextRemoveEnvironmentStrings" Overridable="yes">Aggiornamento delle stringhe di ambiente in corso...</String>
321 <String Id="ProgressTextRemoveEnvironmentStringsTemplate" Overridable="yes">Nome: [1], valore: [2], azione [3]</String>
322 <String Id="ProgressTextRemoveExistingProducts" Overridable="yes">Rimozione delle applicazioni in corso...</String>
323 <String Id="ProgressTextRemoveExistingProductsTemplate" Overridable="yes">Applicazione: [1], riga di comando: [2]</String>
324 <String Id="ProgressTextRemoveFiles" Overridable="yes">Rimozione dei file in corso...</String>
325 <String Id="ProgressTextRemoveFilesTemplate" Overridable="yes">File: [1], directory: [9]</String>
326 <String Id="ProgressTextRemoveFolders" Overridable="yes">Rimozione delle cartelle in corso...</String>
327 <String Id="ProgressTextRemoveFoldersTemplate" Overridable="yes">Cartella: [1]</String>
328 <String Id="ProgressTextRemoveIniValues" Overridable="yes">Rimozione delle voci dei file INI in corso...</String>
329 <String Id="ProgressTextRemoveIniValuesTemplate" Overridable="yes">File: [1], sezione: [2], chiave: [3], valore: [4]</String>
330 <String Id="ProgressTextRemoveODBC" Overridable="yes">Rimozione dei componenti ODBC in corso...</String>
331 <String Id="ProgressTextRemoveRegistryValues" Overridable="yes">Rimozione dei valori del Registro di sistema in corso...</String>
332 <String Id="ProgressTextRemoveRegistryValuesTemplate" Overridable="yes">Chiave: [1], nome: [2]</String>
333 <String Id="ProgressTextRemoveShortcuts" Overridable="yes">Rimozione dei collegamenti in corso...</String>
334 <String Id="ProgressTextRemoveShortcutsTemplate" Overridable="yes">Collegamento: [1]</String>
335 <String Id="ProgressTextRMCCPSearch" Overridable="yes">Ricerca del software originale richiesto in corso...</String>
336 <String Id="ProgressTextSelfRegModules" Overridable="yes">Registrazione dei moduli in corso...</String>
337 <String Id="ProgressTextSelfRegModulesTemplate" Overridable="yes">File: [1], cartella: [2]</String>
338 <String Id="ProgressTextSelfUnregModules" Overridable="yes">Annullamento della registrazione dei moduli in corso...</String>
339 <String Id="ProgressTextSelfUnregModulesTemplate" Overridable="yes">File: [1], cartella: [2]</String>
340 <String Id="ProgressTextSetODBCFolders" Overridable="yes">Inizializzazione delle directory ODBC in corso...</String>
341 <String Id="ProgressTextStartServices" Overridable="yes">Avvio dei servizi in corso...</String>
342 <String Id="ProgressTextStartServicesTemplate" Overridable="yes">Servizio: [1]</String>
343 <String Id="ProgressTextStopServices" Overridable="yes">Arresto dei servizi in corso...</String>
344 <String Id="ProgressTextStopServicesTemplate" Overridable="yes">Servizio: [1]</String>
345 <String Id="ProgressTextUnpublishComponents" Overridable="yes">Annullamento della pubblicazione dei componenti qualificati in corso...</String>
346 <String Id="ProgressTextUnpublishComponentsTemplate" Overridable="yes">ID componente: [1], qualificatore: [2]</String>
347 <String Id="ProgressTextUnpublishFeatures" Overridable="yes">Annullamento della pubblicazione delle funzionalità del prodotto in corso...</String>
348 <String Id="ProgressTextUnpublishFeaturesTemplate" Overridable="yes">Funzionalità: [1]</String>
349 <String Id="ProgressTextUnregisterClassInfo" Overridable="yes">Annullamento della registrazione dei server delle classi in corso...</String>
350 <String Id="ProgressTextUnregisterClassInfoTemplate" Overridable="yes">ID classe: [1]</String>
351 <String Id="ProgressTextUnregisterComPlus" Overridable="yes">Annullamento della registrazione dei componenti e delle applicazioni COM+ in corso...</String>
352 <String Id="ProgressTextUnregisterComPlusTemplate" Overridable="yes">ID applicazione: [1]{{, Tipo applicazione: [2]}}</String>
353 <String Id="ProgressTextUnregisterExtensionInfo" Overridable="yes">Annullamento della registrazione dei server delle estensioni in corso...</String>
354 <String Id="ProgressTextUnregisterExtensionInfoTemplate" Overridable="yes">Estensione: [1]</String>
355 <String Id="ProgressTextUnregisterFonts" Overridable="yes">Annullamento della registrazione dei tipi di carattere in corso...</String>
356 <String Id="ProgressTextUnregisterFontsTemplate" Overridable="yes">Tipo di carattere: [1]</String>
357 <String Id="ProgressTextUnregisterMIMEInfo" Overridable="yes">Annullamento della registrazione delle informazioni MIME in corso...</String>
358 <String Id="ProgressTextUnregisterMIMEInfoTemplate" Overridable="yes">Tipo di contenuto MIME: [1], estensione: [2]</String>
359 <String Id="ProgressTextUnregisterProgIdInfo" Overridable="yes">Annullamento della registrazione degli ID di programma in corso...</String>
360 <String Id="ProgressTextUnregisterProgIdInfoTemplate" Overridable="yes">ID programma: [1]</String>
361 <String Id="ProgressTextUnregisterTypeLibraries" Overridable="yes">Annullamento della registrazione delle librerie dei tipi in corso...</String>
362 <String Id="ProgressTextUnregisterTypeLibrariesTemplate" Overridable="yes">ID libreria: [1]</String>
363 <String Id="ProgressTextWriteEnvironmentStrings" Overridable="yes">Aggiornamento delle stringhe di ambiente in corso...</String>
364 <String Id="ProgressTextWriteEnvironmentStringsTemplate" Overridable="yes">Nome: [1], valore: [2], azione [3]</String>
365 <String Id="ProgressTextWriteIniValues" Overridable="yes">Scrittura dei valori dei file INI in corso...</String>
366 <String Id="ProgressTextWriteIniValuesTemplate" Overridable="yes">File: [1], sezione: [2], chiave: [3], valore: [4]</String>
367 <String Id="ProgressTextWriteRegistryValues" Overridable="yes">Scrittura dei valori del Registro di sistema in corso...</String>
368 <String Id="ProgressTextWriteRegistryValuesTemplate" Overridable="yes">Chiave: [1], nome: [2], valore: [3]</String>
369 <String Id="ProgressTextAdvertise" Overridable="yes">Visualizzazione degli avvisi relativi all'applicazione in corso...</String>
370 <String Id="ProgressTextGenerateScript" Overridable="yes">Generazione delle operazioni di script per l'azione in corso:</String>
371 <String Id="ProgressTextGenerateScriptTemplate" Overridable="yes">[1]</String>
372 <String Id="ProgressTextInstallSFPCatalogFile" Overridable="yes">Installazione del catalogo di sistema in corso...</String>
373 <String Id="ProgressTextInstallSFPCatalogFileTemplate" Overridable="yes">File: [1], dipendenze: [2]</String>
374 <String Id="ProgressTextMsiPublishAssemblies" Overridable="yes">Pubblicazione delle informazioni sull'assembly in corso...</String>
375 <String Id="ProgressTextMsiPublishAssembliesTemplate" Overridable="yes">Contesto applicazione:[1], nome assembly:[2]</String>
376 <String Id="ProgressTextMsiUnpublishAssemblies" Overridable="yes">Annullamento della pubblicazione delle informazioni sull'assembly in corso...</String>
377 <String Id="ProgressTextMsiUnpublishAssembliesTemplate" Overridable="yes">Contesto applicazione:[1], nome assembly:[2]</String>
378 <String Id="ProgressTextRollback" Overridable="yes">Ripristino stato precedente in corso:</String>
379 <String Id="ProgressTextRollbackTemplate" Overridable="yes">[1]</String>
380 <String Id="ProgressTextRollbackCleanup" Overridable="yes">Rimozione dei file di backup in corso...</String>
381 <String Id="ProgressTextRollbackCleanupTemplate" Overridable="yes">File: [1]</String>
382 <String Id="ProgressTextUnmoveFiles" Overridable="yes">Rimozione dei file spostati in corso...</String>
383 <String Id="ProgressTextUnmoveFilesTemplate" Overridable="yes">File: [1], directory: [9]</String>
384 <String Id="ProgressTextUnpublishProduct" Overridable="yes">Annullamento della pubblicazione delle informazioni sul prodotto in corso...</String>
385
386 <String Id="Error0" Overridable="yes">{{Errore irreversibile: }}</String>
387 <String Id="Error1" Overridable="yes">{{Errore [1]. }}</String>
388 <String Id="Error2" Overridable="yes">Avviso [1]. </String>
389 <String Id="Error4" Overridable="yes">Informazioni [1]. </String>
390 <String Id="Error5" Overridable="yes">Errore imprevisto durante l'installazione del pacchetto. L'errore può essere dovuto a problemi del pacchetto. Il codice di errore è [1]. {{Gli argomenti sono: [2], [3], [4]}}</String>
391 <String Id="Error7" Overridable="yes">{{Disco pieno: }}</String>
392 <String Id="Error8" Overridable="yes">Azione [Time]: [1]. [2]</String>
393 <String Id="Error9" Overridable="yes">[ProductName]</String>
394 <String Id="Error10" Overridable="yes">{[2]}{, [3]}{, [4]}</String>
395 <String Id="Error11" Overridable="yes">Tipo messaggio: [1], argomento: [2]</String>
396 <String Id="Error12" Overridable="yes">=== Inizio registrazione: [Date] [Time] ===</String>
397 <String Id="Error13" Overridable="yes">=== Fine registrazione: [Date] [Time] ===</String>
398 <String Id="Error14" Overridable="yes">Inizio azione [Time]: [1].</String>
399 <String Id="Error15" Overridable="yes">Fine azione [Time]: [1]. Valore restituito [2].</String>
400 <String Id="Error16" Overridable="yes">Tempo rimanente: {[1] minuti }{[2] secondi}</String>
401 <String Id="Error17" Overridable="yes">Memoria esaurita. Chiudere alcune applicazioni, quindi riprovare.</String>
402 <String Id="Error18" Overridable="yes">Windows Installer non risponde.</String>
403 <String Id="Error19" Overridable="yes">Windows Installer arrestato in modo anomalo.</String>
404 <String Id="Error20" Overridable="yes">Attendere. È in corso la configurazione di [ProductName].</String>
405 <String Id="Error21" Overridable="yes">Raccolta delle informazioni necessarie in corso...</String>
406 <String Id="Error22" Overridable="yes">Rimozione delle versioni precedenti di questa applicazione in corso...</String>
407 <String Id="Error23" Overridable="yes">Preparazione alla rimozione delle versioni precedenti di questa applicazione in corso...</String>
408 <String Id="Error32" Overridable="yes">Installazione di {[ProductName] }completata.</String>
409 <String Id="Error33" Overridable="yes">Impossibile installare {[ProductName] }.</String>
410 <String Id="Error1101" Overridable="yes">Errore durante la lettura dal file [2]. {{ Errore di sistema [3].}} Verificare che il file esista e di disporre dei relativi diritti di accesso.</String>
411 <String Id="Error1301" Overridable="yes">Impossibile creare il file '[2]' perché esiste già una directory con questo nome. Annullare l'installazione e riprovare specificando un altro percorso.</String>
412 <String Id="Error1302" Overridable="yes">Inserire il disco: [2]</String>
413 <String Id="Error1303" Overridable="yes">Impossibile continuare l'installazione. Windows Installer non dispone di privilegi sufficienti per l'accesso alla directory [2]. Accedere come amministratore oppure contattare l'amministratore di sistema.</String>
414 <String Id="Error1304" Overridable="yes">Errore durante la scrittura nel file [2]. Verificare di disporre dei diritti di accesso alla directory.</String>
415 <String Id="Error1305" Overridable="yes">Errore durante la lettura dal file [2]. {{ Errore di sistema [3].}} Verificare che il file esista e di disporre dei relativi diritti di accesso.</String>
416 <String Id="Error1306" Overridable="yes">Il file '[2]' è aperto in modo esclusivo da un'altra applicazione. Chiudere tutte le applicazioni aperte, quindi fare clic su Riprova.</String>
417 <String Id="Error1307" Overridable="yes">Spazio su disco insufficiente per l'installazione del file [2]. Liberare spazio su disco e scegliere Riprova oppure scegliere Annulla per uscire dall'installazione.</String>
418 <String Id="Error1308" Overridable="yes">Impossibile trovare il file di origine [2]. Verificare che il file esista e di disporre dei relativi diritti di accesso.</String>
419 <String Id="Error1309" Overridable="yes">Errore durante la lettura dal file [3]. {{ Errore di sistema [2].}} Verificare che il file esista e di disporre dei relativi diritti di accesso.</String>
420 <String Id="Error1310" Overridable="yes">Errore durante la scrittura nel file [3]. {{ Errore di sistema [2].}} Verificare di disporre dei diritti di accesso alla directory.</String>
421 <String Id="Error1311" Overridable="yes">Impossibile trovare il file di origine{{ (file CAB)}} [2]. Verificare che il file esista e di disporre dei relativi diritti di accesso.</String>
422 <String Id="Error1312" Overridable="yes">Impossibile creare la directory '[2]' perché esiste già un file con questo nome. Rinominare o rimuovere il file, quindi scegliere Riprova oppure scegliere Annulla per uscire.</String>
423 <String Id="Error1313" Overridable="yes">Il volume [2] non è attualmente disponibile. Selezionarne un altro.</String>
424 <String Id="Error1314" Overridable="yes">Il percorso specificato '[2]' non è disponibile.</String>
425 <String Id="Error1315" Overridable="yes">Impossibile scrivere nella cartella specificata: [2].</String>
426 <String Id="Error1316" Overridable="yes">Errore di rete durante il tentativo di lettura dal file: [2]</String>
427 <String Id="Error1317" Overridable="yes">Errore durante il tentativo di creazione della directory: [2]</String>
428 <String Id="Error1318" Overridable="yes">Errore di rete durante il tentativo di creazione della directory: [2]</String>
429 <String Id="Error1319" Overridable="yes">Errore di rete durante il tentativo di apertura dei file CAB dell'origine [2].</String>
430 <String Id="Error1320" Overridable="yes">Il percorso specificato è troppo lungo: [2]</String>
431 <String Id="Error1321" Overridable="yes">Privilegi insufficienti per modificare il file [2].</String>
432 <String Id="Error1322" Overridable="yes">Una parte del percorso della cartella '[2]' non è valida, perché è vuota o supera la lunghezza consentita dal sistema.</String>
433 <String Id="Error1323" Overridable="yes">Il percorso della cartella '[2]' contiene parole non valide per i percorsi delle cartelle.</String>
434 <String Id="Error1324" Overridable="yes">Il percorso della cartella '[2]' contiene un carattere non valido.</String>
435 <String Id="Error1325" Overridable="yes">'[2]' non è un nome file breve valido.</String>
436 <String Id="Error1326" Overridable="yes">Errore durante la lettura dei dati di sicurezza del file [3]. GetLastError: [2]</String>
437 <String Id="Error1327" Overridable="yes">Unità non valida: [2]</String>
438 <String Id="Error1328" Overridable="yes">Errore durante l'applicazione dell'aggiornamento al file [2]. Probabilmente il file è già stato modificato con altri mezzi e non può più essere modificato da questa patch. Per ulteriori informazioni rivolgersi al fornitore. {{Errore di sistema: [3]}}</String>
439 <String Id="Error1329" Overridable="yes">Impossibile installare un file necessario. Il file CAB [2] non dispone di firma digitale. Il file CAB potrebbe essere danneggiato.</String>
440 <String Id="Error1330" Overridable="yes">Impossibile installare un file necessario. La firma digitale del file CAB [2] non è valida. Il file CAB potrebbe essere danneggiato.{{ WinVerifyTrust ha restituito l'errore [3].}}</String>
441 <String Id="Error1331" Overridable="yes">Impossibile copiare correttamente il file [2]: errore CRC.</String>
442 <String Id="Error1332" Overridable="yes">Impossibile spostare correttamente il file [2]: errore CRC.</String>
443 <String Id="Error1333" Overridable="yes">Impossibile correggere il file [2]: errore CRC.</String>
444 <String Id="Error1334" Overridable="yes">Impossibile installare il file '[2]'. Il file non è presente nel file CAB '[3]'. Il problema potrebbe essere dovuto a un errore di rete, un errore di lettura da CD-ROM o a un problema del pacchetto.</String>
445 <String Id="Error1335" Overridable="yes">Il file CAB '[2]' richiesto per l'installazione è danneggiato e non potrà essere utilizzato. Il problema potrebbe essere dovuto a un errore di rete, un errore di lettura da CD-ROM o a un problema del pacchetto.</String>
446 <String Id="Error1336" Overridable="yes">Errore durante la creazione di un file temporaneo necessario per il completamento dell'installazione.{{ Cartella: [3]. Codice errore di sistema: [2]}}</String>
447 <String Id="Error1401" Overridable="yes">Impossibile creare la chiave [2]. {{ Errore di sistema [3].}} Verificare di disporre di diritti di accesso sufficienti per tale chiave oppure contattare il personale di supporto. </String>
448 <String Id="Error1402" Overridable="yes">Impossibile aprire la chiave [2]. {{ Errore di sistema [3].}} Verificare di disporre di diritti di accesso sufficienti per tale chiave oppure contattare il personale di supporto. </String>
449 <String Id="Error1403" Overridable="yes">Impossibile eliminare il valore [2] dalla chiave [3]. {{ Errore di sistema [4].}} Verificare di disporre di diritti di accesso sufficienti per tale chiave oppure contattare il personale di supporto. </String>
450 <String Id="Error1404" Overridable="yes">Impossibile eliminare la chiave [2]. {{ Errore di sistema [3].}} Verificare di disporre di diritti di accesso sufficienti per tale chiave oppure contattare il personale di supporto. </String>
451 <String Id="Error1405" Overridable="yes">Impossibile leggere il valore [2] dalla chiave [3]. {{ Errore di sistema [4].}} Verificare di disporre di diritti di accesso sufficienti per tale chiave oppure contattare il personale di supporto. </String>
452 <String Id="Error1406" Overridable="yes">Impossibile scrivere il valore [2] nella chiave [3]. {{ Errore di sistema [4].}} Verificare di disporre di diritti di accesso sufficienti per tale chiave oppure contattare il personale di supporto.</String>
453 <String Id="Error1407" Overridable="yes">Impossibile ottenere nomi dei valori della chiave [2]. {{ Errore di sistema [3].}} Verificare di disporre di diritti di accesso sufficienti per tale chiave oppure contattare il personale di supporto.</String>
454 <String Id="Error1408" Overridable="yes">Impossibile ottenere i nomi delle chiavi secondarie per la chiave [2]. {{ Errore di sistema [3].}} Assicurarsi di disporre di diritti di accesso sufficienti per tale chiave oppure contattare il personale di supporto.</String>
455 <String Id="Error1409" Overridable="yes">Impossibile leggere le informazioni di sicurezza per la chiave [2]. {{Errore di sistema [3].}} Assicurarsi di disporre di diritti di accesso sufficienti per tale chiave oppure contattare il personale di supporto.</String>
456 <String Id="Error1410" Overridable="yes">Impossibile aumentare lo spazio disponibile nel Registro di sistema. Per installare l'applicazione sono necessari [2] KB di spazio disponibile nel Registro di sistema.</String>
457 <String Id="Error1500" Overridable="yes">È in corso un'altra installazione. Completarla, quindi continuare con l'installazione desiderata.</String>
458 <String Id="Error1501" Overridable="yes">Errore durante l'accesso a dati protetti. Assicurarsi che Windows Installer sia configurato correttamente e tentare di nuovo l'installazione.</String>
459 <String Id="Error1502" Overridable="yes">L'utente '[2]' ha avviato in precedenza l'installazione del prodotto '[3]'. Prima di utilizzare il prodotto, tale utente dovrà ripeterne l'installazione. L'installazione corrente verrà continuata.</String>
460 <String Id="Error1503" Overridable="yes">L'utente '[2]' ha avviato in precedenza l'installazione del prodotto '[3]'. Prima di utilizzare il prodotto, tale utente dovrà ripeterne l'installazione.</String>
461 <String Id="Error1601" Overridable="yes">Spazio su disco insufficiente -- Volume: '[2]', spazio richiesto: [3] KB, spazio disponibile: [4] KB. Liberare spazio su disco e riprovare.</String>
462 <String Id="Error1602" Overridable="yes">Annullare?</String>
463 <String Id="Error1603" Overridable="yes">Il file [2][3] è già utilizzato{ dal processo con nome: [4], ID: [5] e titolo finestra: '[6]'}. Chiudere tale applicazione e riprovare.</String>
464 <String Id="Error1604" Overridable="yes">Nel sistema è già installato il prodotto '[2]', che non consente l'installazione di questo prodotto perché incompatibile.</String>
465 <String Id="Error1605" Overridable="yes">Spazio su disco insufficiente sul volume '[2]' per continuare l'installazione con il recupero abilitato. Sono necessari [3] KB, ma solo [4] KB sono disponibili. Scegliere Ignora per continuare senza salvare le informazioni di recupero, scegliere Riprova per controllare nuovamente lo spazio disponibile o scegliere Annulla per uscire dall'installazione.</String>
466 <String Id="Error1606" Overridable="yes">Impossibile accedere al percorso di rete [2].</String>
467 <String Id="Error1607" Overridable="yes">È necessario chiudere le applicazioni seguenti prima di procedere con l'installazione:</String>
468 <String Id="Error1608" Overridable="yes">Impossibile trovare versioni precedenti del software originale richiesto nel computer in uso.</String>
469 <String Id="Error1609" Overridable="yes">Errore durante l'applicazione delle impostazioni di sicurezza. [2] non è un utente o un gruppo valido. L'errore potrebbe essere causato da un problema del pacchetto o da un problema durante la connessione a un controller di dominio in rete. Verificare la connessione di rete e scegliere Riprova. Altrimenti, scegliere Annulla per terminare l'installazione. {{Impossibile individuare il SID dell'utente. Errore di sistema [3]}}</String>
470 <String Id="Error1701" Overridable="yes">La chiave [2] non è valida. Verificare che la chiave immessa sia corretta.</String>
471 <String Id="Error1702" Overridable="yes">Prima di continuare la configurazione di [2], è necessario riavviare il sistema. Scegliere Sì per riavviarlo adesso oppure No per riavviarlo in un secondo momento.</String>
472 <String Id="Error1703" Overridable="yes">Per rendere effettive le modifiche apportate alla configurazione di [2], è necessario riavviare il sistema. Scegliere Sì per riavviarlo adesso oppure No per riavviarlo in un secondo momento.</String>
473 <String Id="Error1704" Overridable="yes">Un'istanza del programma di installazione di [2] è attualmente sospesa. Per continuare, è necessario annullare le modifiche effettuate da tale istanza del programma di installazione. Annullare le modifiche?</String>
474 <String Id="Error1705" Overridable="yes">È in esecuzione un'istanza del programma di installazione del prodotto avviata in precedenza. Per continuare, è necessario annullare le modifiche effettuate da tale istanza del programma di installazione. Annullare le modifiche?</String>
475 <String Id="Error1706" Overridable="yes">Impossibile trovare un pacchetto di installazione per [2]. Provare a ripetere l'installazione utilizzando una copia valida del pacchetto di installazione '[3]'.</String>
476 <String Id="Error1707" Overridable="yes">Installazione completata.</String>
477 <String Id="Error1708" Overridable="yes">Installazione non riuscita.</String>
478 <String Id="Error1709" Overridable="yes">Prodotto: [2] -- [3]</String>
479 <String Id="Error1710" Overridable="yes">È possibile ripristinare lo stato precedente del computer oppure continuare l'installazione in un secondo momento. Eseguire il ripristino?</String>
480 <String Id="Error1711" Overridable="yes">Errore durante la scrittura su disco delle informazioni di installazione. Verificare che lo spazio disponibile su disco sia sufficiente e scegliere Riprova oppure scegliere Annulla per terminare l'installazione.</String>
481 <String Id="Error1712" Overridable="yes">Impossibile trovare uno o più file necessari. Impossibile ripristinare lo stato precedente del computer.</String>
482 <String Id="Error1713" Overridable="yes">Impossibile installare uno dei prodotti necessari per [2]. Contattare il supporto tecnico. {{Errore di sistema: [3].}}</String>
483 <String Id="Error1714" Overridable="yes">Impossibile rimuovere la versione precedente di [2]. Contattare il supporto tecnico. {{Errore di sistema [3].}}</String>
484 <String Id="Error1715" Overridable="yes">Installazione di [2] completata</String>
485 <String Id="Error1716" Overridable="yes">Configurazione di [2] completata</String>
486 <String Id="Error1717" Overridable="yes">Rimozione di [2] completata</String>
487 <String Id="Error1718" Overridable="yes">Il file [2] è stato rifiutato dai criteri di firma digitale.</String>
488 <String Id="Error1719" Overridable="yes">Impossibile accedere al servizio Windows Installer. Windows potrebbe essere in esecuzione in modalità provvisoria o l'installazione di Windows Installer potrebbe non essere stata eseguita correttamente. Contattare il personale di supporto.</String>
489 <String Id="Error1720" Overridable="yes">Problema con il pacchetto Windows Installer. Impossibile eseguire uno degli script richiesti per il completamento dell'installazione. Contattare il personale di supporto o il fornitore del pacchetto. {{Azione personalizzata [2] errore script [3], [4]: [5] riga [6], colonna [7], [8] }}</String>
490 <String Id="Error1721" Overridable="yes">Problema con il pacchetto Windows Installer. Impossibile eseguire uno dei programmi richiesti per il completamento dell'installazione. Contattare il personale di supporto o il fornitore del pacchetto. {{Azione: [2], percorso: [3], comando: [4] }}</String>
491 <String Id="Error1722" Overridable="yes">Problema con il pacchetto Windows Installer. Uno dei programmi eseguiti come parte dell'installazione non è stato terminato correttamente. Contattare il personale di supporto o il fornitore del pacchetto. {{Azione: [2], percorso: [3], comando: [4] }}</String>
492 <String Id="Error1723" Overridable="yes">Problema con il pacchetto Windows Installer. Impossibile eseguire una DLL necessaria per il completamento dell'installazione. Contattare il personale di supporto o il fornitore del pacchetto. {{Azione [2], voce: [3], libreria: [4] }}</String>
493 <String Id="Error1724" Overridable="yes">Rimozione completata.</String>
494 <String Id="Error1725" Overridable="yes">Rimozione non riuscita.</String>
495 <String Id="Error1726" Overridable="yes">Annuncio completato.</String>
496 <String Id="Error1727" Overridable="yes">Annuncio non riuscito.</String>
497 <String Id="Error1728" Overridable="yes">Configurazione completata.</String>
498 <String Id="Error1729" Overridable="yes">Configurazione non riuscita.</String>
499 <String Id="Error1730" Overridable="yes">È necessario disporre di privilegi di amministratore per poter rimuovere questa applicazione. Accedere come amministratore o contattare il supporto tecnico.</String>
500 <String Id="Error1731" Overridable="yes">Il pacchetto di installazione di origine per il prodotto [2] non è sincronizzato con il pacchetto client. Riprovare a eseguire l'installazione utilizzando una copia valida del pacchetto di installazione '[3]'.</String>
501 <String Id="Error1732" Overridable="yes">Per completare l'installazione di [2] è necessario riavviare il computer. Altri utenti sono attualmente connessi al computer e il riavvio potrebbe causare la perdita dei dati non salvati. Riavviare il computer ora?</String>
502 <String Id="Error1801" Overridable="yes">Il percorso [2] non è valido. Specificare un percorso valido.</String>
503 <String Id="Error1802" Overridable="yes">Memoria esaurita. Chiudere alcune applicazioni, quindi riprovare.</String>
504 <String Id="Error1803" Overridable="yes">L'unità [2] non contiene alcun disco. Inserire un disco e scegliere Riprova oppure scegliere Annulla per tornare al volume selezionato in precedenza.</String>
505 <String Id="Error1804" Overridable="yes">L'unità [2] non contiene alcun disco. Inserire un disco e scegliere Riprova oppure scegliere Annulla per tornare alla finestra di ricerca e selezionare un altro volume.</String>
506 <String Id="Error1805" Overridable="yes">La cartella [2] non esiste. Immettere il percorso di una cartella esistente.</String>
507 <String Id="Error1806" Overridable="yes">Privilegi in lettura insufficienti per la cartella specificata.</String>
508 <String Id="Error1807" Overridable="yes">Impossibile determinare una cartella di destinazione valida per l'installazione.</String>
509 <String Id="Error1901" Overridable="yes">Errore durante il tentativo di lettura dal database di installazione di origine: [2].</String>
510 <String Id="Error1902" Overridable="yes">Pianificazione dell'operazione di riavvio. Il file [2] verrà rinominato [3]. Per completare l'operazione, è necessario riavviare il computer.</String>
511 <String Id="Error1903" Overridable="yes">Pianificazione dell'operazione di riavvio. Il file [2] verrà eliminato. Per completare l'operazione, è necessario riavviare il computer.</String>
512 <String Id="Error1904" Overridable="yes">Impossibile registrare il modulo [2]. HRESULT [3]. Contattare il personale di supporto.</String>
513 <String Id="Error1905" Overridable="yes">Impossibile annullare la registrazione del modulo [2]. HRESULT [3]. Contattare il personale di supporto.</String>
514 <String Id="Error1906" Overridable="yes">Impossibile memorizzare il pacchetto nella cache [2]. Errore: [3]. Contattare il personale di supporto.</String>
515 <String Id="Error1907" Overridable="yes">Impossibile registrare il tipo di carattere [2]. Assicurarsi di disporre di autorizzazioni sufficienti per l'installazione dei tipi di carattere e verificare che il sistema supporti il tipo di carattere specificato.</String>
516 <String Id="Error1908" Overridable="yes">Impossibile annullare la registrazione del tipo di carattere [2]. Assicurarsi di disporre di autorizzazioni sufficienti per l'eliminazione dei tipi di carattere.</String>
517 <String Id="Error1909" Overridable="yes">Impossibile creare il collegamento [2]. Verificare che la cartella di destinazione esista e di disporre dei relativi diritti di accesso.</String>
518 <String Id="Error1910" Overridable="yes">Impossibile rimuovere il collegamento [2]. Verificare che il file del collegamento esista e di disporre dei relativi diritti di accesso.</String>
519 <String Id="Error1911" Overridable="yes">Impossibile registrare la libreria dei tipi per il file [2]. Contattare il personale di supporto.</String>
520 <String Id="Error1912" Overridable="yes">Impossibile annullare la registrazione della libreria dei tipi per il file [2]. Contattare il personale di supporto.</String>
521 <String Id="Error1913" Overridable="yes">Impossibile aggiornare il file INI [2][3]. Verificare che il file esista e sia accessibile.</String>
522 <String Id="Error1914" Overridable="yes">Impossibile pianificare la sostituzione del file [3] con il file [2] durante il riavvio del sistema. Assicurarsi di disporre delle autorizzazioni di scrittura per il file [3].</String>
523 <String Id="Error1915" Overridable="yes">Errore durante la rimozione di Gestione driver ODBC. Errore ODBC [2]: [3]. Contattare il personale di supporto.</String>
524 <String Id="Error1916" Overridable="yes">Errore durante l'installazione di Gestione driver ODBC. Errore ODBC [2]: [3]. Contattare il personale di supporto.</String>
525 <String Id="Error1917" Overridable="yes">Errore durante la rimozione del driver ODBC [4]. Errore ODBC [2]: [3]. Verificare di disporre di privilegi sufficienti per la rimozione dei driver ODBC.</String>
526 <String Id="Error1918" Overridable="yes">Errore durante l'installazione del driver ODBC [4]. Errore ODBC [2]: [3]. Verificare che il file [4] esista e di disporre dei relativi diritti di accesso.</String>
527 <String Id="Error1919" Overridable="yes">Errore durante la configurazione dell'origine dati ODBC [4]. Errore ODBC [2]: [3]. Verificare che il file [4] esista e di disporre dei relativi diritti di accesso.</String>
528 <String Id="Error1920" Overridable="yes">Impossibile avviare il servizio '[2]' ([3]). Assicurarsi di disporre di privilegi sufficienti per l'avvio dei servizi di sistema.</String>
529 <String Id="Error1921" Overridable="yes">Impossibile arrestare il servizio '[2]' ([3]). Assicurarsi di disporre di privilegi sufficienti per l'arresto dei servizi di sistema.</String>
530 <String Id="Error1922" Overridable="yes">Impossibile eliminare il servizio '[2]' ([3]). Assicurarsi di disporre di privilegi sufficienti per la rimozione dei servizi di sistema.</String>
531 <String Id="Error1923" Overridable="yes">Impossibile installare il servizio '[2]' ([3]). Assicurarsi di disporre di privilegi sufficienti per l'installazione dei servizi di sistema.</String>
532 <String Id="Error1924" Overridable="yes">Impossibile aggiornare la variabile di ambiente '[2]'. Assicurarsi di disporre di privilegi sufficienti per modificare le variabili di ambiente.</String>
533 <String Id="Error1925" Overridable="yes">Privilegi insufficienti per completare l'installazione specificata per tutti gli utenti del computer. Accedere come amministratore, quindi ripetere l'installazione.</String>
534 <String Id="Error1926" Overridable="yes">Impossibile impostare la sicurezza per il file '[3]'. Errore: [2]. Verificare di disporre di privilegi sufficienti per modificare le autorizzazioni di sicurezza per il file specificato.</String>
535 <String Id="Error1927" Overridable="yes">Servizi componenti (COM+ 1.0) non è installato in questo computer. Per completare l'installazione è necessario disporre di Servizi componenti nel computer. Servizi componenti è disponibile in Windows 2000.</String>
536 <String Id="Error1928" Overridable="yes">Errore durante la registrazione dell'applicazione COM+. Contattare il personale di supporto per maggiori informazioni.</String>
537 <String Id="Error1929" Overridable="yes">Errore durante l'annullamento della registrazione dell'applicazione COM+. Contattare il personale di supporto per maggiori informazioni.</String>
538 <String Id="Error1930" Overridable="yes">Impossibile modificare la descrizione del servizio '[2]' ([3]).</String>
539 <String Id="Error1931" Overridable="yes">Il servizio Windows Installer non è in grado di aggiornare il file di sistema [2] in quanto è protetto da Windows. Potrebbe essere necessario eseguire l'aggiornamento del sistema operativo per consentire al programma di funzionare correttamente. {{Versione del pacchetto: [3], versione del sistema operativo protetto: [4]}}</String>
540 <String Id="Error1932" Overridable="yes">Il servizio Windows Installer non è in grado di aggiornare il file protetto di Windows [2]. {{Versione del pacchetto: [3], versione del sistema operativo protetto: [4], errore SFP: [5]}}</String>
541 <String Id="Error1933" Overridable="yes">Il servizio Windows Installer non è in grado di aggiornare uno o più file di Windows protetti. {{Errore SFP: [2]. Elenco file protetti:\r\n[3]}}</String>
542 <String Id="Error1934" Overridable="yes">Le installazioni utente sono state disabilitate tramite criteri sul computer.</String>
543 <String Id="Error1935" Overridable="yes">Errore durante l'installazione dell'assembly '[6]'. Per ulteriori informazioni, vedere Guida e supporto tecnico. HRESULT: [3]. {{interfaccia assembly: [4], funzione: [5], componente: [2]}}</String>
544 <String Id="Error1936" Overridable="yes">Errore durante l'installazione dell'assembly '[6]'. L'assembly non dispone di nome sicuro o la lunghezza di chiave utilizzata per la firma è inferiore alla lunghezza minima consentita. HRESULT: [3]. {{interfaccia assembly: [4], funzione: [5], componente: [2]}}</String>
545 <String Id="Error1937" Overridable="yes">Errore durante l'installazione dell'assembly '[6]'. Firma o catalogo non verificabili o non validi. HRESULT: [3]. {{interfaccia assembly: [4], funzione: [5], componente: [2]}}</String>
546 <String Id="Error1938" Overridable="yes">Errore durante l'installazione dell'assembly '[6]'. Impossibile trovare uno o più moduli dell'assembly. HRESULT: [3]. {{interfaccia assembly: [4], funzione: [5], componente: [2]}}</String>
547
548 <String Id="UITextbytes" Overridable="yes">byte</String>
549 <String Id="UITextGB" Overridable="yes">GB</String>
550 <String Id="UITextKB" Overridable="yes">KB</String>
551 <String Id="UITextMB" Overridable="yes">MB</String>
552 <String Id="UITextMenuAbsent" Overridable="yes">La funzionalità completa non sarà disponibile.</String>
553 <String Id="UITextMenuAdvertise" Overridable="yes">La funzionalità specificata verrà installata quando richiesto.</String>
554 <String Id="UITextMenuAllCD" Overridable="yes">La funzionalità completa verrà installata in modo da consentirne l'avvio da CD.</String>
555 <String Id="UITextMenuAllLocal" Overridable="yes">La funzionalità completa verrà installata sul disco rigido locale.</String>
556 <String Id="UITextMenuAllNetwork" Overridable="yes">La funzionalità completa verrà installata in modo da consentirne l'avvio dalla rete.</String>
557 <String Id="UITextMenuCD" Overridable="yes">Verrà installata in modo da consentirne l'avvio da CD.</String>
558 <String Id="UITextMenuLocal" Overridable="yes">Verrà installata sul disco rigido locale.</String>
559 <String Id="UITextMenuNetwork" Overridable="yes">Verrà installata in modo da consentirne l'avvio dalla rete.</String>
560 <String Id="UITextNewFolder" Overridable="yes">Folder|Nuova cartella</String>
561 <String Id="UITextScriptInProgress" Overridable="yes">Raccolta delle informazioni necessarie in corso...</String>
562 <String Id="UITextSelAbsentAbsent" Overridable="yes">La funzionalità specificata non verrà installata.</String>
563 <String Id="UITextSelAbsentAdvertise" Overridable="yes">La funzionalità specificata verrà impostata per essere installata quando richiesto.</String>
564 <String Id="UITextSelAbsentCD" Overridable="yes">La funzionalità specificata verrà installata in modo da consentirne l'avvio da CD.</String>
565 <String Id="UITextSelAbsentLocal" Overridable="yes">La funzionalità specificata verrà installata sul disco rigido locale.</String>
566 <String Id="UITextSelAbsentNetwork" Overridable="yes">La funzionalità specificata verrà installata in modo da consentirne l'avvio dalla rete.</String>
567 <String Id="UITextSelAdvertiseAbsent" Overridable="yes">La funzionalità specificata non sarà disponibile.</String>
568 <String Id="UITextSelAdvertiseAdvertise" Overridable="yes">Verrà installata quando richiesto.</String>
569 <String Id="UITextSelAdvertiseCD" Overridable="yes">La funzionalità specificata sarà disponibile per l'avvio da CD.</String>
570 <String Id="UITextSelAdvertiseLocal" Overridable="yes">La funzionalità specificata verrà installata sul disco rigido locale.</String>
571 <String Id="UITextSelAdvertiseNetwork" Overridable="yes">La funzionalità specificata sarà disponibile per l'avvio dalla rete.</String>
572 <String Id="UITextSelCDAbsent" Overridable="yes">La funzionalità specificata verrà rimossa completamente e non potrà più essere avviata da CD.</String>
573 <String Id="UITextSelCDAdvertise" Overridable="yes">La funzionalità specificata, correntemente impostata per l'avvio da CD, verrà impostata per essere installata quando richiesto.</String>
574 <String Id="UITextSelCDCD" Overridable="yes">La funzionalità specificata rimarrà impostata per l'avvio da CD.</String>
575 <String Id="UITextSelCDLocal" Overridable="yes">La funzionalità specificata, correntemente impostata per l'avvio da CD, verrà installata sul disco rigido locale.</String>
576 <String Id="UITextSelChildCostNeg" Overridable="yes">La funzionalità specificata consente di liberare [1] sul disco rigido.</String>
577 <String Id="UITextSelChildCostPos" Overridable="yes">La funzionalità specificata richiede [1] sul disco rigido.</String>
578 <String Id="UITextSelCostPending" Overridable="yes">Calcolo dello spazio necessario per la funzionalità specificata in corso...</String>
579 <String Id="UITextSelLocalAbsent" Overridable="yes">La funzionalità specificata verrà rimossa completamente.</String>
580 <String Id="UITextSelLocalAdvertise" Overridable="yes">La funzionalità specificata verrà rimossa dal disco rigido locale ma verrà impostata per essere installata quando richiesto.</String>
581 <String Id="UITextSelLocalCD" Overridable="yes">La funzionalità specificata verrà rimossa dal disco rigido locale ma sarà ancora disponibile per l'avvio da CD.</String>
582 <String Id="UITextSelLocalLocal" Overridable="yes">La funzionalità specificata rimarrà sul disco rigido locale.</String>
583 <String Id="UITextSelLocalNetwork" Overridable="yes">La funzionalità specificata verrà rimossa dal disco rigido locale ma sarà disponibile per l'avvio dalla rete.</String>
584 <String Id="UITextSelNetworkAbsent" Overridable="yes">La funzionalità specificata verrà completamente rimossa e non potrà più essere avviata dalla rete.</String>
585 <String Id="UITextSelNetworkAdvertise" Overridable="yes">La funzionalità specificata, correntemente impostata per l'avvio dalla rete, verrà impostata per essere installata quando richiesto.</String>
586 <String Id="UITextSelNetworkLocal" Overridable="yes">La funzionalità specificata, correntemente impostata per l'avvio dalla rete, verrà installata sul disco rigido locale.</String>
587 <String Id="UITextSelNetworkNetwork" Overridable="yes">La funzionalità specificata rimarrà impostata per l'avvio dalla rete.</String>
588 <String Id="UITextSelParentCostNegNeg" Overridable="yes">La funzionalità specificata consente di liberare [1] sul disco rigido. Sono selezionate [2] funzionalità secondarie su [3]. Le funzionalità secondarie consentono di liberare [4] sul disco rigido.</String>
589 <String Id="UITextSelParentCostNegPos" Overridable="yes">La funzionalità specificata consente di liberare [1] sul disco rigido. Sono selezionate [2] funzionalità secondarie su [3]. Le funzionalità secondarie richiedono [4] sul disco rigido.</String>
590 <String Id="UITextSelParentCostPosNeg" Overridable="yes">La funzionalità specificata richiede [1] sul disco rigido. Sono selezionate [2] funzionalità secondarie su [3]. Le funzionalità secondarie consentono di liberare [4] sul disco rigido.</String>
591 <String Id="UITextSelParentCostPosPos" Overridable="yes">La funzionalità specificata richiede [1] sul disco rigido. Sono selezionate [2] funzionalità secondarie su [3]. Le funzionalità secondarie richiedono [4] sul disco rigido.</String>
592 <String Id="UITextTimeRemaining" Overridable="yes">Tempo rimanente: {[1] minuti }{[2] secondi}</String>
593 <String Id="UITextVolumeCostAvailable" Overridable="yes">Disponibile</String>
594 <String Id="UITextVolumeCostDifference" Overridable="yes">Differenza</String>
595 <String Id="UITextVolumeCostRequired" Overridable="yes">Necessario</String>
596 <String Id="UITextVolumeCostSize" Overridable="yes">Dimensioni disco</String>
597 <String Id="UITextVolumeCostVolume" Overridable="yes">Volume</String>
598</WixLocalization>
diff --git a/src/ext/UI/wixlib/WixUI_ja-jp.wxl b/src/ext/UI/wixlib/WixUI_ja-jp.wxl
new file mode 100644
index 00000000..607edae9
--- /dev/null
+++ b/src/ext/UI/wixlib/WixUI_ja-jp.wxl
@@ -0,0 +1,598 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3
4
5<WixLocalization Culture="ja-jp" Codepage="932" xmlns="http://wixtoolset.org/schemas/v4/wxl">
6 <String Id="WixUIBack" Overridable="yes">戻る(&amp;B)</String>
7 <String Id="WixUINext" Overridable="yes">次へ(&amp;N)</String>
8 <String Id="WixUICancel" Overridable="yes">キャンセル</String>
9 <String Id="WixUIFinish" Overridable="yes">完了(&amp;F)</String>
10 <String Id="WixUIRetry" Overridable="yes">再試行(&amp;R)</String>
11 <String Id="WixUIIgnore" Overridable="yes">無視(&amp;I)</String>
12 <String Id="WixUIYes" Overridable="yes">はい(&amp;Y)</String>
13 <String Id="WixUINo" Overridable="yes">いいえ(&amp;N)</String>
14 <String Id="WixUIOK" Overridable="yes">OK</String>
15 <String Id="WixUIPrint" Overridable="yes">印刷(&amp;P)</String>
16
17 <String Id="AdvancedWelcomeEulaDlg_Title" Overridable="yes">[ProductName] セットアップ</String>
18 <String Id="AdvancedWelcomeEulaDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
19 <String Id="AdvancedWelcomeEulaDlgTitle" Overridable="yes">{\WixUI_Font_Title}[ProductName] の使用許諾契約書をお読みください</String>
20 <String Id="AdvancedWelcomeEulaDlgLicenseAcceptedCheckBox" Overridable="yes">使用許諾契約書に同意します(&amp;A)</String>
21 <String Id="AdvancedWelcomeEulaDlgDescriptionPerMachine" Overridable="yes">すべてのユーザーを対象に既定のオプションで製品をインストールする場合は [\[]インストール[\]] をクリックしてください。インストール オプションを変更する場合は [\[]詳細設定[\]] をクリックしてください。</String>
22 <String Id="AdvancedWelcomeEulaDlgDescriptionPerUser" Overridable="yes">自分のみを対象に既定のオプションで製品をインストールする場合は [\[]インストール[\]] をクリックしてください。インストール オプションを変更する場合は [\[]詳細設定[\]] をクリックしてください。</String>
23 <String Id="AdvancedWelcomeEulaDlgInstall" Overridable="yes">インストール(&amp;I)</String>
24 <String Id="AdvancedWelcomeEulaDlgAdvanced" Overridable="yes">詳細設定(&amp;D)</String>
25 <String Id="Advanced_Font_Normal_Size" Overridable="yes">8</String>
26 <String Id="Advanced_Font_Bigger_Size" Overridable="yes">12</String>
27 <String Id="Advanced_Font_Title_Size" Overridable="yes">9</String>
28 <String Id="Advanced_Font_Emphasized_Size" Overridable="yes">8</String>
29 <String Id="Advanced_Font_FaceName" Overridable="yes">"MS UI Gothic", "MS PGothic", "MS Pゴシック", "MS Gothic", "MS ゴシック", Osaka, Tahoma</String>
30
31 <String Id="BrowseDlg_Title" Overridable="yes">[ProductName] セットアップ</String>
32 <String Id="BrowseDlgComboLabel" Overridable="yes">場所(&amp;L):</String>
33 <String Id="BrowseDlgWixUI_Bmp_Up" Overridable="yes">WixUI_Bmp_Up</String>
34 <String Id="BrowseDlgWixUI_Bmp_UpTooltip" Overridable="yes">1 つ上のフォルダーへ移動</String>
35 <String Id="BrowseDlgNewFolder" Overridable="yes">WixUI_Bmp_New</String>
36 <String Id="BrowseDlgNewFolderTooltip" Overridable="yes">新しいフォルダーの作成</String>
37 <String Id="BrowseDlgPathLabel" Overridable="yes">フォルダー名(&amp;F):</String>
38 <String Id="BrowseDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
39 <String Id="BrowseDlgDescription" Overridable="yes">インストール先フォルダーを参照します。</String>
40 <String Id="BrowseDlgTitle" Overridable="yes">{\WixUI_Font_Title}インストール先フォルダーの変更</String>
41
42 <String Id="CancelDlg_Title" Overridable="yes">[ProductName] セットアップ</String>
43 <String Id="CancelDlgText" Overridable="yes">[ProductName] のインストールを取り消しますか?</String>
44 <String Id="CancelDlgIcon" Overridable="yes">WixUI_Ico_Info</String>
45 <String Id="CancelDlgIconTooltip" Overridable="yes">情報アイコン</String>
46
47 <String Id="CustomizeDlg_Title" Overridable="yes">[ProductName] セットアップ</String>
48 <String Id="CustomizeDlgTree" Overridable="yes">選択項目のツリー</String>
49 <String Id="CustomizeDlgBrowse" Overridable="yes">参照(&amp;R)...</String>
50 <String Id="CustomizeDlgReset" Overridable="yes">リセット(&amp;S)</String>
51 <String Id="CustomizeDlgDiskCost" Overridable="yes">ディスク使用量(&amp;U)</String>
52 <String Id="CustomizeDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
53 <String Id="CustomizeDlgText" Overridable="yes">下のツリーのアイコンをクリックして、機能をインストールする方法を変更してください。</String>
54 <String Id="CustomizeDlgDescription" Overridable="yes">機能をインストールする方法を選択してください。</String>
55 <String Id="CustomizeDlgTitle" Overridable="yes">{\WixUI_Font_Title}カスタム セットアップ</String>
56 <String Id="CustomizeDlgItemDescription" Overridable="yes">CustomizeDlgItemDescription-CustomizeDlgItemDescription</String>
57 <String Id="CustomizeDlgItemSize" Overridable="yes">CustomizeDlgItemSize-CustomizeDlgItemSize</String>
58 <String Id="CustomizeDlgLocation" Overridable="yes">CustomizeDlgLocation-CustomizeDlgLocation</String>
59 <String Id="CustomizeDlgLocationLabel" Overridable="yes">場所:</String>
60
61 <String Id="DiskCostDlg_Title" Overridable="yes">[ProductName] セットアップ</String>
62 <String Id="DiskCostDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
63 <String Id="DiskCostDlgText" Overridable="yes">強調表示されたボリュームには、選択した機能に利用できる十分な空き領域がありません。強調表示されたボリュームから一部のファイルを削除するか、インストールする機能を減らすか、別のインストール先ドライブを選択することができます。</String>
64 <String Id="DiskCostDlgDescription" Overridable="yes">選択された機能に必要なディスク領域です。</String>
65 <String Id="DiskCostDlgTitle" Overridable="yes">{\WixUI_Font_Title}必要なディスク領域</String>
66 <String Id="DiskCostDlgVolumeList" Overridable="yes">{120}{70}{70}{70}{70}</String>
67
68 <String Id="ErrorDlg_Title" Overridable="yes">[ProductName] セットアップ</String>
69 <String Id="ErrorDlgErrorText" Overridable="yes">情報テキスト</String>
70 <String Id="ErrorDlgErrorIcon" Overridable="yes">WixUI_Ico_Info</String>
71 <String Id="ErrorDlgErrorIconTooltip" Overridable="yes">情報アイコン</String>
72
73 <String Id="ExitDialog_Title" Overridable="yes">[ProductName] セットアップ</String>
74 <String Id="ExitDialogBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
75 <String Id="ExitDialogDescription" Overridable="yes">セットアップ ウィザードを終了するには、[\[]完了[\]] ボタンをクリックします。</String>
76 <String Id="ExitDialogTitle" Overridable="yes">{\WixUI_Font_Bigger}[ProductName] セットアップ ウィザードが完了しました</String>
77
78 <String Id="FatalError_Title" Overridable="yes">[ProductName] セットアップ</String>
79 <String Id="FatalErrorBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
80 <String Id="FatalErrorTitle" Overridable="yes">{\WixUI_Font_Bigger}[ProductName] セットアップ ウィザードを完了できませんでした</String>
81 <String Id="FatalErrorDescription1" Overridable="yes">エラーが発生したため、[ProductName] のセットアップ ウィザードは処理の途中で終了しました。システムは変更されていません。このプログラムを後でインストールするには、セットアップ ウィザードを再実行してください。</String>
82 <String Id="FatalErrorDescription2" Overridable="yes">セットアップ ウィザードを終了するには、[\[]完了[\]] ボタンをクリックします。</String>
83
84 <String Id="FeaturesDlg_Title" Overridable="yes">[ProductName] セットアップ</String>
85 <String Id="FeaturesDlgTree" Overridable="yes">製品機能</String>
86 <String Id="FeaturesDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
87 <String Id="FeaturesDlgDescription" Overridable="yes">機能をインストールする方法を選択してください。</String>
88 <String Id="FeaturesDlgTitle" Overridable="yes">{\WixUI_Font_Title}製品機能</String>
89 <String Id="FeaturesDlgItemDescription" Overridable="yes">FeaturesDlgItemDescription</String>
90 <String Id="FeaturesDlgItemSize" Overridable="yes">FeaturesDlgItemSize</String>
91 <String Id="FeaturesDlgInstall" Overridable="yes">インストール(&amp;I)</String>
92 <String Id="FeaturesDlgChange" Overridable="yes">変更(&amp;C)</String>
93
94 <String Id="FilesInUse_Title" Overridable="yes">[ProductName] セットアップ</String>
95 <String Id="FilesInUseExit" Overridable="yes">終了(&amp;X)</String>
96 <String Id="FilesInUseBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
97 <String Id="FilesInUseText" Overridable="yes">以下のアプリケーションが、このセットアップで更新する必要のあるファイルを使用しています。これらのアプリケーションを閉じてから [\[]再試行(&amp;R)[\]] をクリックしてインストールを続行するか、[\[]終了[\]] をクリックして終了してください。</String>
98 <String Id="FilesInUseDescription" Overridable="yes">更新する必要のある一部のファイルは現在使用中です。</String>
99 <String Id="FilesInUseTitle" Overridable="yes">{\WixUI_Font_Title}使用中のファイル</String>
100
101 <String Id="InstallDirDlg_Title" Overridable="yes">[ProductName] セットアップ</String>
102 <String Id="InstallDirDlgChange" Overridable="yes">変更(&amp;C)...</String>
103 <String Id="InstallDirDlgTitle" Overridable="yes">{\WixUI_Font_Title}インストール先フォルダー</String>
104 <String Id="InstallDirDlgDescription" Overridable="yes">既定のフォルダーにインストールするには [\[]次へ[\]] をクリックし、別のフォルダーを選択するには [\[]変更[\]] をクリックします。</String>
105 <String Id="InstallDirDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
106 <String Id="InstallDirDlgFolderLabel" Overridable="yes">[ProductName] のインストール先:</String>
107
108 <String Id="InstallScopeDlg_Title" Overridable="yes">[ProductName] セットアップ</String>
109 <String Id="InstallScopeDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
110 <String Id="InstallScopeDlgDescription" Overridable="yes">インストール範囲とフォルダーの選択</String>
111 <String Id="InstallScopeDlgTitle" Overridable="yes">{\WixUI_Font_Title}インストール範囲</String>
112 <String Id="InstallScopeDlgPerUser" Overridable="yes">{\WixUI_Font_Emphasized}自分のみを対象にインストール ([LogonUser])(&amp;J)</String>
113 <String Id="InstallScopeDlgPerUserDescription" Overridable="yes">[ProductName] はユーザーごとのフォルダーにインストールされ、そのユーザー アカウントでのみ使用できます。ローカル管理者の権限は必要ありません。</String>
114 <String Id="InstallScopeDlgNoPerUserDescription" Overridable="yes">[ProductName] はユーザーごとのインストールをサポートしていません。</String>
115 <String Id="InstallScopeDlgPerMachine" Overridable="yes">{\WixUI_Font_Emphasized}このコンピューターのすべてのユーザーを対象にインストール(&amp;M)</String>
116 <String Id="InstallScopeDlgPerMachineDescription" Overridable="yes">既定では、[ProductName] はコンピューターごとのフォルダーにインストールされ、すべてのユーザーが使用できます。既定のインストール フォルダーを変更できます。ローカル管理者の権限が必要です。</String>
117 <String Id="InstallScopeDlgFolderLabel" Overridable="yes">インストール フォルダー(&amp;F):</String>
118 <String Id="InstallScopeDlgChange" Overridable="yes">変更(&amp;C)...</String>
119
120 <String Id="InvalidDirDlg_Title" Overridable="yes">[ProductName] セットアップ</String>
121 <String Id="InvalidDirDlgText" Overridable="yes">インストール ディレクトリはローカル ハード ドライブにあることが必要です。</String>
122 <String Id="InvalidDirDlgIcon" Overridable="yes">WixUI_Ico_Info</String>
123 <String Id="InvalidDirDlgIconTooltip" Overridable="yes">情報アイコン</String>
124
125 <String Id="LicenseAgreementDlg_Title" Overridable="yes">[ProductName] セットアップ</String>
126 <String Id="LicenseAgreementDlgLicenseAcceptedCheckBox" Overridable="yes">使用許諾契約書に同意します(&amp;A)</String>
127 <String Id="LicenseAgreementDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
128 <String Id="LicenseAgreementDlgDescription" Overridable="yes">以下の使用許諾契約書をよくお読みください。</String>
129 <String Id="LicenseAgreementDlgTitle" Overridable="yes">{\WixUI_Font_Title}使用許諾契約書</String>
130
131 <String Id="MaintenanceTypeDlg_Title" Overridable="yes">[ProductName] セットアップ</String>
132 <String Id="MaintenanceTypeDlgChangeButton" Overridable="yes">変更(&amp;C)</String>
133 <String Id="MaintenanceTypeDlgChangeButtonTooltip" Overridable="yes">インストールの変更</String>
134 <String Id="MaintenanceTypeDlgRepairButton" Overridable="yes">修復(&amp;P)</String>
135 <String Id="MaintenanceTypeDlgRepairButtonTooltip" Overridable="yes">インストールの修復</String>
136 <String Id="MaintenanceTypeDlgRemoveButton" Overridable="yes">削除(&amp;R)</String>
137 <String Id="MaintenanceTypeDlgRemoveButtonTooltip" Overridable="yes">インストール内容の削除</String>
138 <String Id="MaintenanceTypeDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
139 <String Id="MaintenanceTypeDlgDescription" Overridable="yes">実行する操作を選択してください。</String>
140 <String Id="MaintenanceTypeDlgTitle" Overridable="yes">{\WixUI_Font_Title}インストールの変更、修復、または削除</String>
141 <String Id="MaintenanceTypeDlgChangeText" Overridable="yes">機能のインストール方法を変更できます。</String>
142 <String Id="MaintenanceTypeDlgChangeDisabledText" Overridable="yes">[ProductName] の機能は個別に選択できません。</String>
143 <String Id="MaintenanceTypeDlgRemoveText" Overridable="yes">[ProductName] をコンピューターから削除します。</String>
144 <String Id="MaintenanceTypeDlgRemoveDisabledText" Overridable="yes">[ProductName] を削除できません。</String>
145 <String Id="MaintenanceTypeDlgRepairText" Overridable="yes">不足している、または壊れたファイル、ショートカット、およびレジストリ エントリを修正して、現在のインストールに存在するエラーを修復します。</String>
146 <String Id="MaintenanceTypeDlgRepairDisabledText" Overridable="yes">[ProductName] を修復できません。</String>
147
148 <String Id="MaintenanceWelcomeDlg_Title" Overridable="yes">[ProductName] セットアップ</String>
149 <String Id="MaintenanceWelcomeDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
150 <String Id="MaintenanceWelcomeDlgDescription" Overridable="yes">セットアップ ウィザードでは、[ProductName] の機能をコンピューターにインストールする方法を変更したり、コンピューターから [ProductName] を削除したりできます。続行するには、[\[]次へ[\]] をクリックしてください。セットアップ ウィザードを終了するには、[\[]キャンセル[\]] をクリックしてください。</String>
151 <String Id="MaintenanceWelcomeDlgTitle" Overridable="yes">{\WixUI_Font_Bigger}[ProductName] セットアップ ウィザードへようこそ</String>
152
153 <String Id="MsiRMFilesInUse_Title" Overridable="yes">[ProductName] セットアップ</String>
154 <String Id="MsiRMFilesInUseBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
155 <String Id="MsiRMFilesInUseText" Overridable="yes">以下のアプリケーションが、このセットアップで更新する必要のあるファイルを使用しています。セットアップ ウィザードを使用してこれらのアプリケーションを終了して再起動するか、後でコンピューターを再起動することができます。</String>
156 <String Id="MsiRMFilesInUseDescription" Overridable="yes">更新する必要のある一部のファイルは現在使用中です。</String>
157 <String Id="MsiRMFilesInUseTitle" Overridable="yes">{\WixUI_Font_Title}使用中のファイル</String>
158 <String Id="MsiRMFilesInUseUseRM" Overridable="yes">アプリケーションを終了してから再起動する(&amp;C)</String>
159 <String Id="MsiRMFilesInUseDontUseRM" Overridable="yes">アプリケーションを終了しない (再起動が必要)(&amp;D)</String>
160
161 <String Id="OutOfDiskDlg_Title" Overridable="yes">[ProductName] セットアップ</String>
162 <String Id="OutOfDiskDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
163 <String Id="OutOfDiskDlgText" Overridable="yes">強調表示されたボリュームには、現在選択中の機能に利用できる十分なディスク領域がありません。強調表示されたボリュームから一部のファイルを削除するか、インストールする機能を減らすか、別のインストール先ドライブを選択することができます。</String>
164 <String Id="OutOfDiskDlgDescription" Overridable="yes">インストールに必要なディスク領域がディスクの空き領域を超えています。</String>
165 <String Id="OutOfDiskDlgTitle" Overridable="yes">{\WixUI_Font_Title}ディスク領域の不足</String>
166 <String Id="OutOfDiskDlgVolumeList" Overridable="yes">{120}{70}{70}{70}{70}</String>
167
168 <String Id="OutOfRbDiskDlg_Title" Overridable="yes">[ProductName] セットアップ</String>
169 <String Id="OutOfRbDiskDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
170 <String Id="OutOfRbDiskDlgText" Overridable="yes">強調表示されたボリュームには、現在選択中の機能に利用できる十分なディスク領域がありません。強調表示されたボリュームから一部のファイルを削除するか、インストールする機能を減らすか、別のインストール先ドライブを選択することができます。</String>
171 <String Id="OutOfRbDiskDlgDescription" Overridable="yes">インストールに必要なディスク領域がディスクの空き領域を超えています。</String>
172 <String Id="OutOfRbDiskDlgTitle" Overridable="yes">{\WixUI_Font_Title}ディスク領域の不足</String>
173 <String Id="OutOfRbDiskDlgVolumeList" Overridable="yes">{120}{70}{70}{70}{70}</String>
174 <String Id="OutOfRbDiskDlgText2" Overridable="yes">あるいは、インストーラーのロールバック機能を無効にすることもできます。ロールバックを無効にすると、インストールがなんらかの理由で中断されてもインストーラーによってコンピューターの元の状態が復元されません。リスクを認識したうえでロールバック機能を無効にする場合は [\[]はい[\]] をクリックしてください。</String>
175
176 <String Id="PrepareDlg_Title" Overridable="yes">[ProductName] セットアップ</String>
177 <String Id="PrepareDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
178 <String Id="PrepareDlgDescription" Overridable="yes">インストールの準備をしています。しばらくお待ちください。</String>
179 <String Id="PrepareDlgTitle" Overridable="yes">{\WixUI_Font_Bigger}[ProductName] セットアップ ウィザードへようこそ</String>
180
181 <String Id="ProgressDlg_Title" Overridable="yes">[ProductName] セットアップ</String>
182 <String Id="ProgressDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
183 <String Id="ProgressDlgTextInstalling" Overridable="yes">[ProductName] をインストールしています。しばらくお待ちください。</String>
184 <String Id="ProgressDlgTitleInstalling" Overridable="yes">{\WixUI_Font_Title}[ProductName] をインストール中</String>
185 <String Id="ProgressDlgTextChanging" Overridable="yes">[ProductName] を変更しています。しばらくお待ちください。</String>
186 <String Id="ProgressDlgTitleChanging" Overridable="yes">{\WixUI_Font_Title}[ProductName] を変更中</String>
187 <String Id="ProgressDlgTextRepairing" Overridable="yes">[ProductName] を修復しています。しばらくお待ちください。</String>
188 <String Id="ProgressDlgTitleRepairing" Overridable="yes">{\WixUI_Font_Title}[ProductName] を修復中</String>
189 <String Id="ProgressDlgTextRemoving" Overridable="yes">[ProductName] を削除しています。しばらくお待ちください。</String>
190 <String Id="ProgressDlgTitleRemoving" Overridable="yes">{\WixUI_Font_Title}[ProductName] を削除中</String>
191 <String Id="ProgressDlgTextUpdating" Overridable="yes">[ProductName] を更新しています。しばらくお待ちください。</String>
192 <String Id="ProgressDlgTitleUpdating" Overridable="yes">{\WixUI_Font_Title}[ProductName] を更新中</String>
193 <String Id="ProgressDlgProgressBar" Overridable="yes">進行状況</String>
194 <String Id="ProgressDlgStatusLabel" Overridable="yes">状態:</String>
195
196 <String Id="ResumeDlg_Title" Overridable="yes">[ProductName] セットアップ</String>
197 <String Id="ResumeDlgInstall" Overridable="yes">インストール(&amp;I)</String>
198 <String Id="ResumeDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
199 <String Id="ResumeDlgDescription" Overridable="yes">セットアップ ウィザードは [ProductName] のインストールを完了します。セットアップを続行する場合は [\[]インストール[\]] を、終了する場合は [\[]キャンセル[\]] をクリックしてください。</String>
200 <String Id="ResumeDlgTitle" Overridable="yes">{\WixUI_Font_Bigger}[ProductName] セットアップ ウィザードの再開</String>
201
202 <String Id="SetupTypeDlg_Title" Overridable="yes">[ProductName] セットアップ</String>
203 <String Id="SetupTypeDlgTypicalButton" Overridable="yes">標準(&amp;T)</String>
204 <String Id="SetupTypeDlgTypicalButtonTooltip" Overridable="yes">標準インストール</String>
205 <String Id="SetupTypeDlgCustomButton" Overridable="yes">カスタム(&amp;U)</String>
206 <String Id="SetupTypeDlgCustomButtonTooltip" Overridable="yes">カスタム インストール</String>
207 <String Id="SetupTypeDlgCompleteButton" Overridable="yes">完全(&amp;O)</String>
208 <String Id="SetupTypeDlgCompleteButtonTooltip" Overridable="yes">完全インストール</String>
209 <String Id="SetupTypeDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
210 <String Id="SetupTypeDlgTitle" Overridable="yes">{\WixUI_Font_Title}セットアップの種類の選択</String>
211 <String Id="SetupTypeDlgDescription" Overridable="yes">目的に合わせてセットアップの種類を選択してください。</String>
212 <String Id="SetupTypeDlgTypicalText" Overridable="yes">最も一般的に使われるプログラムの機能がインストールされます。通常は、こちらを選択してください。</String>
213 <String Id="SetupTypeDlgCustomText" Overridable="yes">ユーザーが、インストールするプログラムの機能やインストール先を選択することができます。詳しい知識のある方にお勧めします。</String>
214 <String Id="SetupTypeDlgCompleteText" Overridable="yes">すべてのプログラム機能をインストールします。最も多くのディスク領域が必要です。</String>
215
216 <String Id="UserExit_Title" Overridable="yes">[ProductName] セットアップ</String>
217 <String Id="UserExitBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
218 <String Id="UserExitTitle" Overridable="yes">{\WixUI_Font_Bigger}[ProductName] セットアップ ウィザードは中断されました</String>
219 <String Id="UserExitDescription1" Overridable="yes">[ProductName] のセットアップが中断されました。システムは変更されていません。このプログラムを後でインストールするには、インストールを再実行してください。</String>
220 <String Id="UserExitDescription2" Overridable="yes">セットアップ ウィザードを終了するには、[\[]完了[\]] ボタンをクリックします。</String>
221
222 <String Id="VerifyReadyDlg_Title" Overridable="yes">[ProductName] セットアップ</String>
223 <String Id="VerifyReadyDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
224 <String Id="VerifyReadyDlgInstall" Overridable="yes">インストール(&amp;I)</String>
225 <String Id="VerifyReadyDlgInstallText" Overridable="yes">インストールを開始するには [\[]インストール[\]] をクリックしてください。インストール設定を確認または変更するには [\[]戻る[\]] をクリックしてください。ウィザードを終了するには [\[]キャンセル[\]] をクリックしてください。</String>
226 <String Id="VerifyReadyDlgInstallTitle" Overridable="yes">{\WixUI_Font_Title}[ProductName] のインストール準備完了</String>
227 <String Id="VerifyReadyDlgChange" Overridable="yes">変更(&amp;C)</String>
228 <String Id="VerifyReadyDlgChangeText" Overridable="yes">インストールを開始するには [\[]変更[\]] をクリックしてください。インストール設定を確認または変更するには [\[]戻る[\]] をクリックしてください。ウィザードを終了するには [\[]キャンセル[\]] をクリックしてください。</String>
229 <String Id="VerifyReadyDlgChangeTitle" Overridable="yes">{\WixUI_Font_Title}[ProductName] の変更準備完了</String>
230 <String Id="VerifyReadyDlgRepair" Overridable="yes">修復(&amp;P)</String>
231 <String Id="VerifyReadyDlgRepairText" Overridable="yes">[ProductName] のインストールを修復するには [\[]修復[\]] をクリックしてください。インストール設定を確認または変更するには [\[]戻る[\]] をクリックしてください。ウィザードを終了するには [\[]キャンセル[\]] をクリックしてください。</String>
232 <String Id="VerifyReadyDlgRepairTitle" Overridable="yes">{\WixUI_Font_Title}[ProductName] の修復準備完了</String>
233 <String Id="VerifyReadyDlgRemove" Overridable="yes">削除(&amp;R)</String>
234 <String Id="VerifyReadyDlgRemoveText" Overridable="yes">コンピューターから [ProductName] を削除するには [\[]削除[\]] をクリックしてください。インストール設定を確認または変更するには [\[]戻る[\]] をクリックしてください。ウィザードを終了するには [\[]キャンセル[\]] をクリックしてください。</String>
235 <String Id="VerifyReadyDlgRemoveTitle" Overridable="yes">{\WixUI_Font_Title}[ProductName] の削除準備完了</String>
236 <String Id="VerifyReadyDlgUpdate" Overridable="yes">更新(&amp;U)</String>
237 <String Id="VerifyReadyDlgUpdateText" Overridable="yes">コンピューターの [ProductName] を更新するには [\[]更新[\]] をクリックしてください。インストール設定を確認または変更するには [\[]戻る[\]] をクリックしてください。ウィザードを終了するには [\[]キャンセル[\]] をクリックしてください。</String>
238 <String Id="VerifyReadyDlgUpdateTitle" Overridable="yes">{\WixUI_Font_Title}[ProductName] の更新準備完了</String>
239
240 <String Id="WaitForCostingDlg_Title" Overridable="yes">[ProductName] セットアップ</String>
241 <String Id="WaitForCostingDlgReturn" Overridable="yes">戻る(&amp;R)</String>
242 <String Id="WaitForCostingDlgText" Overridable="yes">インストーラーが必要なディスク領域を計算しています。しばらくお待ちください。</String>
243 <String Id="WaitForCostingDlgIcon" Overridable="yes">WixUI_Ico_Exclam</String>
244 <String Id="WaitForCostingDlgIconTooltip" Overridable="yes">感嘆符アイコン</String>
245
246 <String Id="WelcomeDlg_Title" Overridable="yes">[ProductName] セットアップ</String>
247 <String Id="WelcomeDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
248 <String Id="WelcomeDlgDescription" Overridable="yes">このセットアップ ウィザードでは、[ProductName] をコンピューターにインストールします。続行するには、[\[]次へ[\]] をクリックしてください。セットアップ ウィザードを終了するには、[\[]キャンセル[\]] をクリックしてください。</String>
249 <String Id="WelcomeUpdateDlgDescriptionUpdate" Overridable="yes">このセットアップ ウィザードでは、コンピューターにインストールされている [ProductName] を更新します。続行するには、[\[]次へ[\]] をクリックしてください。セットアップ ウィザードを終了するには、[\[]キャンセル[\]] をクリックしてください。</String>
250 <String Id="WelcomeDlgTitle" Overridable="yes">{\WixUI_Font_Bigger}[ProductName] セットアップ ウィザードへようこそ</String>
251
252 <String Id="WelcomeEulaDlg_Title" Overridable="yes">[ProductName] セットアップ</String>
253 <String Id="WelcomeEulaDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
254 <String Id="WelcomeEulaDlgLicenseAcceptedCheckBox" Overridable="yes">使用許諾契約書に同意します(&amp;A)</String>
255 <String Id="WelcomeEulaDlgInstall" Overridable="yes">インストール(&amp;I)</String>
256 <String Id="WelcomeEulaDlgUpdate" Overridable="yes">更新(&amp;U)</String>
257 <String Id="WelcomeEulaDlgTitle" Overridable="yes">{\WixUI_Font_Title}[ProductName] の使用許諾契約書をお読みください</String>
258
259 <String Id="ProgressTextInstallValidate" Overridable="yes">インストールを検証しています</String>
260 <String Id="ProgressTextInstallFiles" Overridable="yes">新しいファイルをコピーしています</String>
261 <String Id="ProgressTextInstallFilesTemplate" Overridable="yes">ファイル: [1]、ディレクトリ: [9]、サイズ: [6]</String>
262 <String Id="ProgressTextInstallAdminPackage" Overridable="yes">ネットワーク インストール ファイルをコピーしています</String>
263 <String Id="ProgressTextInstallAdminPackageTemplate" Overridable="yes">ファイル: [1]、ディレクトリ: [9]、サイズ: [6]</String>
264 <String Id="ProgressTextFileCost" Overridable="yes">必要な領域を計算しています</String>
265 <String Id="ProgressTextCostInitialize" Overridable="yes">必要な領域を計算しています</String>
266 <String Id="ProgressTextCostFinalize" Overridable="yes">必要な領域を計算しています</String>
267 <String Id="ProgressTextCreateShortcuts" Overridable="yes">ショートカットを作成しています</String>
268 <String Id="ProgressTextCreateShortcutsTemplate" Overridable="yes">ショートカット: [1]</String>
269 <String Id="ProgressTextPublishComponents" Overridable="yes">条件に合うコンポーネントを公開しています</String>
270 <String Id="ProgressTextPublishComponentsTemplate" Overridable="yes">コンポーネント ID: [1]、修飾子: [2]</String>
271 <String Id="ProgressTextPublishFeatures" Overridable="yes">製品機能を公開しています</String>
272 <String Id="ProgressTextPublishFeaturesTemplate" Overridable="yes">機能: [1]</String>
273 <String Id="ProgressTextPublishProduct" Overridable="yes">製品情報を公開しています</String>
274 <String Id="ProgressTextRegisterClassInfo" Overridable="yes">クラス サーバーを登録しています</String>
275 <String Id="ProgressTextRegisterClassInfoTemplate" Overridable="yes">クラス ID: [1]</String>
276 <String Id="ProgressTextRegisterExtensionInfo" Overridable="yes">エクステンション サーバーを登録しています</String>
277 <String Id="ProgressTextRegisterExtensionInfoTemplate" Overridable="yes">エクステンション: [1]</String>
278 <String Id="ProgressTextRegisterMIMEInfo" Overridable="yes">MIME 情報を登録しています</String>
279 <String Id="ProgressTextRegisterMIMEInfoTemplate" Overridable="yes">MIME コンテンツ タイプ: [1]、エクステンション: [2]</String>
280 <String Id="ProgressTextRegisterProgIdInfo" Overridable="yes">プログラム識別子を登録しています</String>
281 <String Id="ProgressTextRegisterProgIdInfoTemplate" Overridable="yes">プログラム ID: [1]</String>
282 <String Id="ProgressTextAllocateRegistrySpace" Overridable="yes">レジストリ領域を割り当てています</String>
283 <String Id="ProgressTextAllocateRegistrySpaceTemplate" Overridable="yes">空き領域: [1]</String>
284 <String Id="ProgressTextAppSearch" Overridable="yes">インストールされているアプリケーションを検索しています</String>
285 <String Id="ProgressTextAppSearchTemplate" Overridable="yes">プロパティ: [1] 署名: [2]</String>
286 <String Id="ProgressTextBindImage" Overridable="yes">実行ファイルをバインドしています</String>
287 <String Id="ProgressTextBindImageTemplate" Overridable="yes">ファイル: [1]</String>
288 <String Id="ProgressTextCCPSearch" Overridable="yes">条件に合う製品を検索しています</String>
289 <String Id="ProgressTextCreateFolders" Overridable="yes">フォルダーを作成しています</String>
290 <String Id="ProgressTextCreateFoldersTemplate" Overridable="yes">フォルダー: [1]</String>
291 <String Id="ProgressTextDeleteServices" Overridable="yes">サービスを削除しています</String>
292 <String Id="ProgressTextDeleteServicesTemplate" Overridable="yes">サービス: [1]</String>
293 <String Id="ProgressTextDuplicateFiles" Overridable="yes">ファイルを複製しています</String>
294 <String Id="ProgressTextDuplicateFilesTemplate" Overridable="yes">ファイル: [1]、ディレクトリ: [9]、サイズ: [6]</String>
295 <String Id="ProgressTextFindRelatedProducts" Overridable="yes">関連するアプリケーションを検索しています</String>
296 <String Id="ProgressTextFindRelatedProductsTemplate" Overridable="yes">見つかったアプリケーション: [1]</String>
297 <String Id="ProgressTextInstallODBC" Overridable="yes">ODBC コンポーネントをインストールしています</String>
298 <String Id="ProgressTextInstallServices" Overridable="yes">新しいサービスをインストールしています</String>
299 <String Id="ProgressTextInstallServicesTemplate" Overridable="yes">サービス: [2]</String>
300 <String Id="ProgressTextLaunchConditions" Overridable="yes">起動状態を検証しています</String>
301 <String Id="ProgressTextMigrateFeatureStates" Overridable="yes">関連アプリケーションから機能の状態を移行しています</String>
302 <String Id="ProgressTextMigrateFeatureStatesTemplate" Overridable="yes">アプリケーション: [1]</String>
303 <String Id="ProgressTextMoveFiles" Overridable="yes">ファイルを移動しています</String>
304 <String Id="ProgressTextMoveFilesTemplate" Overridable="yes">ファイル: [1]、ディレクトリ: [9]、サイズ: [6]</String>
305 <String Id="ProgressTextPatchFiles" Overridable="yes">ファイルを修正しています</String>
306 <String Id="ProgressTextPatchFilesTemplate" Overridable="yes">ファイル: [1]、ディレクトリ: [2]、サイズ: [3]</String>
307 <String Id="ProgressTextProcessComponents" Overridable="yes">コンポーネントの登録を更新しています</String>
308 <String Id="ProgressTextRegisterComPlus" Overridable="yes">COM+ アプリケーションとコンポーネントを登録しています</String>
309 <String Id="ProgressTextRegisterComPlusTemplate" Overridable="yes">アプリケーション ID: [1]{{、アプリケーションの種類: [2]、ユーザー: [3]、RSN: [4]}}</String>
310 <String Id="ProgressTextRegisterFonts" Overridable="yes">フォントを登録しています</String>
311 <String Id="ProgressTextRegisterFontsTemplate" Overridable="yes">フォント: [1]</String>
312 <String Id="ProgressTextRegisterProduct" Overridable="yes">製品を登録しています</String>
313 <String Id="ProgressTextRegisterProductTemplate" Overridable="yes">[1]</String>
314 <String Id="ProgressTextRegisterTypeLibraries" Overridable="yes">タイプ ライブラリを登録しています</String>
315 <String Id="ProgressTextRegisterTypeLibrariesTemplate" Overridable="yes">ライブラリ ID: [1]</String>
316 <String Id="ProgressTextRegisterUser" Overridable="yes">ユーザーを登録しています</String>
317 <String Id="ProgressTextRegisterUserTemplate" Overridable="yes">[1]</String>
318 <String Id="ProgressTextRemoveDuplicateFiles" Overridable="yes">重複するファイルを削除しています</String>
319 <String Id="ProgressTextRemoveDuplicateFilesTemplate" Overridable="yes">ファイル: [1]、ディレクトリ: [9]</String>
320 <String Id="ProgressTextRemoveEnvironmentStrings" Overridable="yes">環境文字列を更新しています</String>
321 <String Id="ProgressTextRemoveEnvironmentStringsTemplate" Overridable="yes">名前: [1]、値: [2]、アクション [3]</String>
322 <String Id="ProgressTextRemoveExistingProducts" Overridable="yes">アプリケーションを削除しています</String>
323 <String Id="ProgressTextRemoveExistingProductsTemplate" Overridable="yes">アプリケーション: [1]、コマンド ライン: [2]</String>
324 <String Id="ProgressTextRemoveFiles" Overridable="yes">ファイルを削除しています</String>
325 <String Id="ProgressTextRemoveFilesTemplate" Overridable="yes">ファイル: [1]、ディレクトリ: [9]</String>
326 <String Id="ProgressTextRemoveFolders" Overridable="yes">フォルダーを削除しています</String>
327 <String Id="ProgressTextRemoveFoldersTemplate" Overridable="yes">フォルダー: [1]</String>
328 <String Id="ProgressTextRemoveIniValues" Overridable="yes">INI ファイルのエントリを削除しています</String>
329 <String Id="ProgressTextRemoveIniValuesTemplate" Overridable="yes">ファイル: [1]、セクション: [2]、キー: [3]、値: [4]</String>
330 <String Id="ProgressTextRemoveODBC" Overridable="yes">ODBC コンポーネントを削除しています</String>
331 <String Id="ProgressTextRemoveRegistryValues" Overridable="yes">システム レジストリの値を削除しています</String>
332 <String Id="ProgressTextRemoveRegistryValuesTemplate" Overridable="yes">キー: [1]、名前: [2]</String>
333 <String Id="ProgressTextRemoveShortcuts" Overridable="yes">ショートカットを削除しています</String>
334 <String Id="ProgressTextRemoveShortcutsTemplate" Overridable="yes">ショートカット: [1]</String>
335 <String Id="ProgressTextRMCCPSearch" Overridable="yes">条件に合う製品を検索しています</String>
336 <String Id="ProgressTextSelfRegModules" Overridable="yes">モジュールを登録しています</String>
337 <String Id="ProgressTextSelfRegModulesTemplate" Overridable="yes">ファイル: [1]、フォルダー: [2]</String>
338 <String Id="ProgressTextSelfUnregModules" Overridable="yes">モジュールの登録を解除しています</String>
339 <String Id="ProgressTextSelfUnregModulesTemplate" Overridable="yes">ファイル: [1]、フォルダー: [2]</String>
340 <String Id="ProgressTextSetODBCFolders" Overridable="yes">ODBC ディレクトリを初期化しています</String>
341 <String Id="ProgressTextStartServices" Overridable="yes">サービスを開始しています</String>
342 <String Id="ProgressTextStartServicesTemplate" Overridable="yes">サービス: [1]</String>
343 <String Id="ProgressTextStopServices" Overridable="yes">サービスを停止しています</String>
344 <String Id="ProgressTextStopServicesTemplate" Overridable="yes">サービス: [1]</String>
345 <String Id="ProgressTextUnpublishComponents" Overridable="yes">条件に合うコンポーネントを非公開にしています</String>
346 <String Id="ProgressTextUnpublishComponentsTemplate" Overridable="yes">コンポーネント ID: [1]、修飾子: [2]</String>
347 <String Id="ProgressTextUnpublishFeatures" Overridable="yes">製品機能を非公開にしています</String>
348 <String Id="ProgressTextUnpublishFeaturesTemplate" Overridable="yes">機能: [1]</String>
349 <String Id="ProgressTextUnregisterClassInfo" Overridable="yes">クラス サーバーの登録を解除しています</String>
350 <String Id="ProgressTextUnregisterClassInfoTemplate" Overridable="yes">クラス ID: [1]</String>
351 <String Id="ProgressTextUnregisterComPlus" Overridable="yes">COM+ アプリケーションとコンポーネントの登録を解除しています</String>
352 <String Id="ProgressTextUnregisterComPlusTemplate" Overridable="yes">アプリケーション ID: [1]{{、アプリケーションの種類: [2]}}</String>
353 <String Id="ProgressTextUnregisterExtensionInfo" Overridable="yes">エクステンション サーバーの登録を解除しています</String>
354 <String Id="ProgressTextUnregisterExtensionInfoTemplate" Overridable="yes">エクステンション: [1]</String>
355 <String Id="ProgressTextUnregisterFonts" Overridable="yes">フォントの登録を解除しています</String>
356 <String Id="ProgressTextUnregisterFontsTemplate" Overridable="yes">フォント: [1]</String>
357 <String Id="ProgressTextUnregisterMIMEInfo" Overridable="yes">MIME 情報の登録を解除しています</String>
358 <String Id="ProgressTextUnregisterMIMEInfoTemplate" Overridable="yes">MIME コンテンツ タイプ: [1]、エクステンション: [2]</String>
359 <String Id="ProgressTextUnregisterProgIdInfo" Overridable="yes">プログラム識別子の登録を解除しています</String>
360 <String Id="ProgressTextUnregisterProgIdInfoTemplate" Overridable="yes">プログラム ID: [1]</String>
361 <String Id="ProgressTextUnregisterTypeLibraries" Overridable="yes">タイプ ライブラリの登録を解除しています</String>
362 <String Id="ProgressTextUnregisterTypeLibrariesTemplate" Overridable="yes">ライブラリ ID: [1]</String>
363 <String Id="ProgressTextWriteEnvironmentStrings" Overridable="yes">環境文字列を更新しています</String>
364 <String Id="ProgressTextWriteEnvironmentStringsTemplate" Overridable="yes">名前: [1]、値: [2]、アクション [3]</String>
365 <String Id="ProgressTextWriteIniValues" Overridable="yes">INI ファイルの値を書き込んでいます</String>
366 <String Id="ProgressTextWriteIniValuesTemplate" Overridable="yes">ファイル: [1]、セクション: [2]、キー: [3]、値: [4]</String>
367 <String Id="ProgressTextWriteRegistryValues" Overridable="yes">システム レジストリの値を書き込んでいます</String>
368 <String Id="ProgressTextWriteRegistryValuesTemplate" Overridable="yes">キー: [1]、名前: [2]、値: [3]</String>
369 <String Id="ProgressTextAdvertise" Overridable="yes">アプリケーションのインストール情報を通知しています</String>
370 <String Id="ProgressTextGenerateScript" Overridable="yes">操作のためのスクリプトの動作を作成しています:</String>
371 <String Id="ProgressTextGenerateScriptTemplate" Overridable="yes">[1]</String>
372 <String Id="ProgressTextInstallSFPCatalogFile" Overridable="yes">システム カタログをインストールしています</String>
373 <String Id="ProgressTextInstallSFPCatalogFileTemplate" Overridable="yes">ファイル: [1]、依存関係: [2]</String>
374 <String Id="ProgressTextMsiPublishAssemblies" Overridable="yes">アセンブリ情報を公開しています</String>
375 <String Id="ProgressTextMsiPublishAssembliesTemplate" Overridable="yes">アプリケーション コンテキスト:[1]、アセンブリ名:[2]</String>
376 <String Id="ProgressTextMsiUnpublishAssemblies" Overridable="yes">アセンブリ情報を非公開にしています</String>
377 <String Id="ProgressTextMsiUnpublishAssembliesTemplate" Overridable="yes">アプリケーション コンテキスト:[1]、アセンブリ名:[2]</String>
378 <String Id="ProgressTextRollback" Overridable="yes">操作を元に戻しています:</String>
379 <String Id="ProgressTextRollbackTemplate" Overridable="yes">[1]</String>
380 <String Id="ProgressTextRollbackCleanup" Overridable="yes">バックアップ ファイルを削除しています</String>
381 <String Id="ProgressTextRollbackCleanupTemplate" Overridable="yes">ファイル: [1]</String>
382 <String Id="ProgressTextUnmoveFiles" Overridable="yes">移動したファイルを削除しています</String>
383 <String Id="ProgressTextUnmoveFilesTemplate" Overridable="yes">ファイル: [1]、ディレクトリ: [9]</String>
384 <String Id="ProgressTextUnpublishProduct" Overridable="yes">製品情報を非公開にしています</String>
385
386 <String Id="Error0" Overridable="yes">{{致命的なエラー: }}</String>
387 <String Id="Error1" Overridable="yes">{{エラー [1]。}}</String>
388 <String Id="Error2" Overridable="yes">警告 [1]。</String>
389 <String Id="Error4" Overridable="yes">情報 [1]。</String>
390 <String Id="Error5" Overridable="yes">このパッケージをインストールしているときに、インストーラーに予期しないエラーが発生しました。このパッケージに問題がある可能性があります。エラー コードは、[1] です。{{引数: [2]、[3]、[4]}}</String>
391 <String Id="Error7" Overridable="yes">{{ディスクがいっぱいです: }}</String>
392 <String Id="Error8" Overridable="yes">アクション [Time]: [1]。[2]</String>
393 <String Id="Error9" Overridable="yes">[ProductName]</String>
394 <String Id="Error10" Overridable="yes">{[2]}{、[3]}{、[4]}</String>
395 <String Id="Error11" Overridable="yes">メッセージの種類: [1]、引数: [2]</String>
396 <String Id="Error12" Overridable="yes">=== ログ開始: [Date] [Time] ===</String>
397 <String Id="Error13" Overridable="yes">=== ログ終了: [Date] [Time] ===</String>
398 <String Id="Error14" Overridable="yes">アクション開始 [Time]: [1]。</String>
399 <String Id="Error15" Overridable="yes">アクション終了 [Time]: [1]。 戻り値 [2]。</String>
400 <String Id="Error16" Overridable="yes">残り時間: {[1] 分 }{[2] 秒}</String>
401 <String Id="Error17" Overridable="yes">メモリ不足です。他のアプリケーションを閉じてから、再試行してください。</String>
402 <String Id="Error18" Overridable="yes">インストーラーから応答がありません。</String>
403 <String Id="Error19" Overridable="yes">インストーラーは、完了前に停止しました。</String>
404 <String Id="Error20" Overridable="yes">[ProductName] を構成しています。しばらくお待ちください。</String>
405 <String Id="Error21" Overridable="yes">必要な情報を集めています...</String>
406 <String Id="Error22" Overridable="yes">このアプリケーションの古いバージョンを削除しています...</String>
407 <String Id="Error23" Overridable="yes">このアプリケーションの古いバージョンを削除する準備をしています...</String>
408 <String Id="Error32" Overridable="yes">[ProductName] のセットアップは正常に終了しました。</String>
409 <String Id="Error33" Overridable="yes">[ProductName] のセットアップに失敗しました。</String>
410 <String Id="Error1101" Overridable="yes">ファイル [2] を読み取るときにエラーが発生しました。{{ システム エラー [3]。}} ファイルが存在し、そのファイルにアクセスできることを確認してください。</String>
411 <String Id="Error1301" Overridable="yes">ファイル '[2]' を作成できません。同じ名前のディレクトリが既に存在します。インストールを取り消して、別の場所にインストールしてください。</String>
412 <String Id="Error1302" Overridable="yes">次のディスクを挿入してください: [2]</String>
413 <String Id="Error1303" Overridable="yes">このインストーラーにはディレクトリ [2] にアクセスできる十分な権限がないので、インストールを続行できません。管理者としてログオンするか、システム管理者に問い合わせてください。</String>
414 <String Id="Error1304" Overridable="yes">ファイル [2] への書き込み中にエラーが発生しました。このディレクトリへのアクセス権があることを確認してください。</String>
415 <String Id="Error1305" Overridable="yes">ファイル [2] を読み取るときにエラーが発生しました。{{ システム エラー [3]。}} ファイルが存在し、そのファイルにアクセスできることを確認してください。</String>
416 <String Id="Error1306" Overridable="yes">別のアプリケーションがファイル '[2]' を排他的に使用しています。他のアプリケーションをすべて終了してから、[\[]再試行[\]] をクリックしてください。</String>
417 <String Id="Error1307" Overridable="yes">ファイル [2] のインストールに必要なディスク領域が足りません。ディスクの空き領域を増やしてから、[\[]再試行[\]] をクリックしてください。終了する場合は [\[]キャンセル[\]] をクリックしてください。</String>
418 <String Id="Error1308" Overridable="yes">ソース ファイル [2] が見つかりませんでした。このファイルが存在し、アクセスできることを確認してください。</String>
419 <String Id="Error1309" Overridable="yes">ファイル [3] を読み取るときにエラーが発生しました。{{ システム エラー [2]。}} ファイルが存在し、そのファイルにアクセスできることを確認してください。</String>
420 <String Id="Error1310" Overridable="yes">ファイル [3] に書き込むときにエラーが発生しました。{{ システム エラー [2]。}} このディレクトリへのアクセス権があることを確認してください。</String>
421 <String Id="Error1311" Overridable="yes">ソース ファイルが見つかりません。{{(cabinet)}}: [2]。このファイルが存在し、アクセスできることを確認してください。</String>
422 <String Id="Error1312" Overridable="yes">ディレクトリ '[2]' を作成できません。同じ名前のファイルが既に存在します。このファイルの名前を変更するかファイルを削除してから、[\[]再試行[\]] をクリックしてください。終了する場合は [\[]キャンセル[\]] をクリックしてください。</String>
423 <String Id="Error1313" Overridable="yes">ボリューム [2] は現在使用できません。他のボリュームを選択してください。</String>
424 <String Id="Error1314" Overridable="yes">指定されたパス '[2]' は使用できません。</String>
425 <String Id="Error1315" Overridable="yes">指定されたフォルダー [2] に書き込めません。</String>
426 <String Id="Error1316" Overridable="yes">ファイル [2] の読み取り中にネットワーク エラーが発生しました</String>
427 <String Id="Error1317" Overridable="yes">ディレクトリ [2] の作成中にエラーが発生しました</String>
428 <String Id="Error1318" Overridable="yes">ディレクトリ [2] の作成中にネットワーク エラーが発生しました</String>
429 <String Id="Error1319" Overridable="yes">ソース ファイル キャビネット [2] を開くときに、ネットワーク エラーが発生しました</String>
430 <String Id="Error1320" Overridable="yes">指定されたパスは長すぎます: [2]</String>
431 <String Id="Error1321" Overridable="yes">インストーラーには、ファイル [2] を修正する権限が不足しています。</String>
432 <String Id="Error1322" Overridable="yes">フォルダー パス [2] の一部が無効です。空白かシステムで許容されている長さを超えています。</String>
433 <String Id="Error1323" Overridable="yes">フォルダー パス '[2]' にフォルダー パスで使用できない文字列が含まれています。</String>
434 <String Id="Error1324" Overridable="yes">フォルダー パス '[2]' に使用できない文字が含まれています。</String>
435 <String Id="Error1325" Overridable="yes">'[2]' は短いファイル名としては正しくありません。</String>
436 <String Id="Error1326" Overridable="yes">ファイル セキュリティを取得するときにエラーが発生しました: [3] GetLastError: [2]</String>
437 <String Id="Error1327" Overridable="yes">無効なドライブ: [2]</String>
438 <String Id="Error1328" Overridable="yes">ファイル [2] に修正プログラムを適用中にエラーが発生しました。このファイルは、別の方法で更新されていて、この修正プログラムでは変更できない可能性があります。詳細については、この修正プログラムの製造元に問い合わせてください。{{システム エラー: [3]}}</String>
439 <String Id="Error1329" Overridable="yes">キャビネット ファイル [2] がデジタル署名されていないため、必要なファイルをインストールできません。キャビネット ファイルが壊れている可能性があります。</String>
440 <String Id="Error1330" Overridable="yes">キャビネット ファイル [2] のデジタル署名が無効であるため、必要なファイルをインストールできません。キャビネット ファイルが壊れている可能性があります。{{ エラー [3] が WinVerifyTrust によって返されました。}}</String>
441 <String Id="Error1331" Overridable="yes">[2] ファイルを正しくコピーできませんでした: CRC エラー。</String>
442 <String Id="Error1332" Overridable="yes">[2] ファイルを正しく移動できませんでした: CRC エラー。</String>
443 <String Id="Error1333" Overridable="yes">[2] ファイルを正しく修正できませんでした: CRC エラー。</String>
444 <String Id="Error1334" Overridable="yes">ファイル '[2]' がキャビネット ファイル '[3]' で見つからなかったため、このファイルをインストールできません。ネットワーク エラーまたは CD-ROM からの読み取りエラーが発生したか、このパッケージに問題がある可能性があります。</String>
445 <String Id="Error1335" Overridable="yes">このインストールに必要なキャビネット ファイル '[2]' は壊れているため使用できません。ネットワーク エラーまたは CD-ROM からの読み取りエラーが発生したか、このパッケージに問題がある可能性があります。</String>
446 <String Id="Error1336" Overridable="yes">このインストールを完了するために必要な一時ファイルを作成しているときに、エラーが発生しました。{{ フォルダー: [3]。システム エラー コード: [2]}}</String>
447 <String Id="Error1401" Overridable="yes">キー [2] を作成できませんでした。{{システム エラー [3]。}} このキーへの十分なアクセス権があるか確認するか、サポート担当者へお問い合わせください。</String>
448 <String Id="Error1402" Overridable="yes">キー [2] を開くことができませんでした。{{システム エラー [3]。}} このキーへの十分なアクセス権があるか確認するか、サポート担当者へお問い合わせください。</String>
449 <String Id="Error1403" Overridable="yes">キー [3] から値 [2] を削除できませんでした。 {{システム エラー [4]。}} このキーへの十分なアクセス権があるか確認するか、サポート担当者へお問い合わせください。</String>
450 <String Id="Error1404" Overridable="yes">キー [2] を削除できませんでした。 {{システム エラー [3]。}} このキーへの十分なアクセス権があるか確認するか、サポート担当者へお問い合わせください。</String>
451 <String Id="Error1405" Overridable="yes">キー [3] から値 [2] を読み取れませんでした。 {{システム エラー [4]。}} このキーへの十分なアクセス権があるか確認するか、サポート担当者へお問い合わせください。</String>
452 <String Id="Error1406" Overridable="yes">値 [2] をキー [3] に書き込めませんでした。{{ システム エラー [4]。}} このキーへの十分なアクセス権があるか確認するか、サポート担当者へお問い合わせください。</String>
453 <String Id="Error1407" Overridable="yes">キー [2] の値の名前を取得できませんでした。{{ システム エラー [3]。}} このキーへの十分なアクセス権があるか確認するか、サポート担当者へお問い合わせください。</String>
454 <String Id="Error1408" Overridable="yes">キー [2] のサブ キー名を取得できませんでした。{{ システム エラー [3]。}} このキーへの十分なアクセス権があるか確認するか、サポート担当者へお問い合わせください。</String>
455 <String Id="Error1409" Overridable="yes">キー [2] のセキュリティ情報を読み取れませんでした。{{ システム エラー [3]。} }このキーへの十分なアクセス権があるか確認するか、サポート担当者へお問い合わせください。</String>
456 <String Id="Error1410" Overridable="yes">利用可能なレジストリ領域を増やすことができませんでした。このアプリケーションをインストールするには、[2] KB のレジストリ領域が必要です。</String>
457 <String Id="Error1500" Overridable="yes">別のインストールが現在行われています。新たにインストールを行うには、既に実行中のインストールを完了しなければなりません。</String>
458 <String Id="Error1501" Overridable="yes">セキュリティで保護されているデータにアクセスするときに、エラーが発生しました。Windows インストーラーが正しく構成されていることを確認してから、再度インストールを実行してください。</String>
459 <String Id="Error1502" Overridable="yes">ユーザー '[2]' は、製品 '[3]' のインストールを以前に実行したことがありますが、この製品を使用するにはインストールを再度実行する必要があります。現在のインストールはこのまま続行されます。</String>
460 <String Id="Error1503" Overridable="yes">ユーザー '[2]' は、製品 '[3]' のインストールを以前に実行したことがありますが、この製品を使用するにはインストールを再度実行する必要があります。</String>
461 <String Id="Error1601" Overridable="yes">ディスク領域が不足しています -- ボリューム: '[2]'、必要な領域: [3] KB、使用可能な領域: [4] KB。ディスクの領域を増やして再度実行してください。</String>
462 <String Id="Error1602" Overridable="yes">取り消しますか?</String>
463 <String Id="Error1603" Overridable="yes">ファイル [2][3] は次のプロセスで使用されています {プロセス名: [4]、ID: [5]、ウィンドウ タイトル: '[6]'}。このアプリケーションを終了してから、再度実行してください。</String>
464 <String Id="Error1604" Overridable="yes">'[2]' が既にインストールされているので、この製品をインストールできません。この 2 つの製品には互換性がありません。</String>
465 <String Id="Error1605" Overridable="yes">ボリューム '[2]' には、回復を有効にしてインストールを続行するための十分な空き領域がありません。[3] KB 必要ですが、[4] KB しか利用できません。回復情報を保存しないでインストールを続行するには、[\[]無視[\]] をクリックしてください。もう一度空き領域を確認するには、[\[]再試行[\]] をクリックしてください。また、インストールを中止するには、[\[]キャンセル[\]] をクリックしてください。</String>
466 <String Id="Error1606" Overridable="yes">ネットワーク上の場所 [2] へアクセスできませんでした。</String>
467 <String Id="Error1607" Overridable="yes">インストールを続行するには、次のアプリケーションを終了する必要があります:</String>
468 <String Id="Error1608" Overridable="yes">この製品をインストールするために必要なアプリケーションがインストールされていません。</String>
469 <String Id="Error1609" Overridable="yes">セキュリティ設定の適用中にエラーが発生しました。[2] は有効なユーザーまたはグループではありません。これはパッケージの問題であるか、ネットワーク上のドメイン コントローラーへの接続の問題である可能性があります。ネットワークの接続を確認し、[\[]再試行[\]] をクリックするか、[\[]キャンセル[\]] をクリックしてインストールを終了してください。{{ユーザーの SID を検出できません、システム エラー [3]}}</String>
470 <String Id="Error1701" Overridable="yes">キー [2] は有効ではありません。正しいキーを入力したか確認してください。</String>
471 <String Id="Error1702" Overridable="yes">[2] の構成を続行する前に、システムを再起動する必要があります。すぐに再起動する場合は [\[]はい[\]] を、後で手動で再起動する場合は [\[]いいえ[\]] をクリックしてください。</String>
472 <String Id="Error1703" Overridable="yes">[2] に行った構成の変更を有効にするには、システムを再起動する必要があります。すぐに再起動する場合は [\[]はい[\]] を、後で手動で再起動する場合は [\[]いいえ[\]] をクリックしてください。</String>
473 <String Id="Error1704" Overridable="yes">[2] のインストールは現在中断されています。続行するには、インストールによって行われた変更を取り消す必要があります。これらの変更を取り消しますか?</String>
474 <String Id="Error1705" Overridable="yes">この製品のインストールは現在進行中です。続行するには、インストールによって行われた変更を取り消す必要があります。これらの変更を取り消しますか?</String>
475 <String Id="Error1706" Overridable="yes">製品 [2] のインストール パッケージが見つかりません。インストール パッケージ '[3]' の有効なコピーを使って、もう一度インストールしてください。</String>
476 <String Id="Error1707" Overridable="yes">インストールは正常に終了しました。</String>
477 <String Id="Error1708" Overridable="yes">インストールに失敗しました。</String>
478 <String Id="Error1709" Overridable="yes">製品: [2] -- [3]</String>
479 <String Id="Error1710" Overridable="yes">コンピューターを直前の状態に復元するか、後でインストールを続行することができます。復元しますか?</String>
480 <String Id="Error1711" Overridable="yes">インストール情報をディスクに書き込み中にエラーが発生しました。十分なディスク領域があることを確認してから [\[]再試行[\]] をクリックして続行するか、[\[]キャンセル[\]] をクリックしてインストールを中止してください。</String>
481 <String Id="Error1712" Overridable="yes">コンピューターを以前の状態に復元するために必要なファイルの一部が見つかりませんでした。復元することができません。</String>
482 <String Id="Error1713" Overridable="yes">[2] に必要な製品の 1 つをインストールできません。テクニカル サポート グループに問い合わせてください。{{システム エラー: [3]。}}</String>
483 <String Id="Error1714" Overridable="yes">古いバージョンの [2] を削除できません。テクニカル サポート グループに問い合わせてください。{{システム エラー [3]。}}</String>
484 <String Id="Error1715" Overridable="yes">[2] をインストールしました</String>
485 <String Id="Error1716" Overridable="yes">[2] を構成しました</String>
486 <String Id="Error1717" Overridable="yes">[2] を削除しました</String>
487 <String Id="Error1718" Overridable="yes">ファイル [2] は、デジタル署名ポリシーによって拒否されました。</String>
488 <String Id="Error1719" Overridable="yes">Windows インストーラー サービスにアクセスできませんでした。これは、Windows をセーフ モードで実行している場合、または Windows インストーラーが正しくインストールされていない場合に発生することがあります。サポート担当者に問い合わせてください。</String>
489 <String Id="Error1720" Overridable="yes">この Windows インストーラー パッケージに問題があります。このインストールを完了するために必要なスクリプトを実行できませんでした。サポート担当者またはパッケージ開発元に問い合わせてください。{{カスタム アクション [2] スクリプト エラー [3]、[4]: [5] 行 [6]、列 [7]、[8] }}</String>
490 <String Id="Error1721" Overridable="yes">この Windows インストーラー パッケージに問題があります。このインストールを完了するために必要なプログラムを実行できませんでした。サポート担当者またはパッケージ開発元に問い合わせてください。{{アクション: [2]、場所: [3]、コマンド: [4] }}</String>
491 <String Id="Error1722" Overridable="yes">この Windows インストーラー パッケージに問題があります。セットアップの一部として実行されるプログラムが正常に完了しませんでした。サポート担当者またはパッケージ開発元に問い合わせてください。{{アクション [2]、場所: [3]、コマンド: [4] }}</String>
492 <String Id="Error1723" Overridable="yes">この Windows インストーラー パッケージに問題があります。このインストールを完了するために必要な DLL を実行できませんでした。サポート担当者またはパッケージ開発元に問い合わせてください。{{アクション: [2]、エントリ: [3]、ライブラリ: [4] }}</String>
493 <String Id="Error1724" Overridable="yes">削除を正常に完了しました。</String>
494 <String Id="Error1725" Overridable="yes">削除に失敗しました。</String>
495 <String Id="Error1726" Overridable="yes">アドバタイズを正しく完了しました。</String>
496 <String Id="Error1727" Overridable="yes">アドバタイズに失敗しました。</String>
497 <String Id="Error1728" Overridable="yes">構成を正常に完了しました。</String>
498 <String Id="Error1729" Overridable="yes">構成に失敗しました。</String>
499 <String Id="Error1730" Overridable="yes">このアプリケーションを削除するには、Administrator である必要があります。このアプリケーションを削除するには、Administrator としてログオンするか、テクニカル サポート グループに問い合わせてください。</String>
500 <String Id="Error1731" Overridable="yes">製品 [2] のソース インストール パッケージは、クライアント パッケージと同期していません。有効なインストール パッケージ '[3]' を使用して、インストールをやり直してください。</String>
501 <String Id="Error1732" Overridable="yes">[2] のインストールを完了するには、コンピューターを再起動する必要があります。現在、このコンピューターにログオンしているユーザーは他にもいます。再起動すると、ログオンしているユーザーの作業内容が失われる可能性があります。今すぐ再起動しますか?</String>
502 <String Id="Error1801" Overridable="yes">パス [2] が有効ではありません。有効なパスを指定してください。</String>
503 <String Id="Error1802" Overridable="yes">メモリ不足です。他のアプリケーションを閉じてから、再試行してください。</String>
504 <String Id="Error1803" Overridable="yes">ドライブ [2] にはディスクがありません。ディスクを挿入してから [\[]再試行[\]] をクリックしてください。既に選択されたボリュームに戻る場合は、[\[]キャンセル[\]] をクリックしてください。</String>
505 <String Id="Error1804" Overridable="yes">ドライブ [2] にはディスクがありません。ディスクを挿入してから [\[]再試行[\]] をクリックしてください。[\[]参照[\]] ダイアログ ボックスに戻って、別のボリュームを選択する場合は、[\[]キャンセル[\]] をクリックしてください。</String>
506 <String Id="Error1805" Overridable="yes">フォルダー [2] は存在しません。既存のフォルダーへのパスを入力してください。</String>
507 <String Id="Error1806" Overridable="yes">このフォルダーを読み取るための十分な権限がありません。</String>
508 <String Id="Error1807" Overridable="yes">インストールのための正しいコピー先を確定できませんでした。</String>
509 <String Id="Error1901" Overridable="yes">ソース インストール データベース [2] からの読み取りでエラーが発生しました。</String>
510 <String Id="Error1902" Overridable="yes">再起動操作のスケジュールを設定しています。ファイル [2] の名前を [3] に変更しています。操作を完了するには、再起動する必要があります。</String>
511 <String Id="Error1903" Overridable="yes">再起動操作のスケジュールを設定しています。[2] を削除しています。操作を完了するには、再起動する必要があります。</String>
512 <String Id="Error1904" Overridable="yes">モジュール [2] で登録に失敗しました。HRESULT [3]。サポート担当者に問い合わせてください。</String>
513 <String Id="Error1905" Overridable="yes">モジュール [2] で登録の解除に失敗しました。HRESULT [3]。サポート担当者に問い合わせてください。</String>
514 <String Id="Error1906" Overridable="yes">パッケージ [2] のキャッシュに失敗しました。エラー: [3]。サポート担当者に問い合わせてください。</String>
515 <String Id="Error1907" Overridable="yes">フォント [2] を登録できませんでした。フォントをインストールするための十分なアクセス許可があり、システムがこのフォントをサポートしていることを確認してください。</String>
516 <String Id="Error1908" Overridable="yes">フォント [2] の登録を解除できませんでした。フォントを削除するための十分なアクセス許可があることを確認してください。</String>
517 <String Id="Error1909" Overridable="yes">ショートカット [2] を作成できませんでした。目的のフォルダーが存在し、そのフォルダーにアクセスできることを確認してください。</String>
518 <String Id="Error1910" Overridable="yes">ショートカット [2] を削除できませんでした。ショートカット ファイルが存在し、そのショートカット ファイルにアクセスできることを確認してください。</String>
519 <String Id="Error1911" Overridable="yes">ファイル [2] のタイプ ライブラリを登録できませんでした。サポート担当者に問い合わせてください。</String>
520 <String Id="Error1912" Overridable="yes">ファイル [2] のタイプ ライブラリの登録を解除できませんでした。サポート担当者に問い合わせてください。</String>
521 <String Id="Error1913" Overridable="yes">INI ファイル [2][3] を更新できませんでした。ファイルが存在し、そのファイルにアクセスできることを確認してください。</String>
522 <String Id="Error1914" Overridable="yes">再起動時にファイル [3] を [2] で置き換えるようにスケジュール設定できませんでした。ファイル [3] に対する書き込みアクセス許可があることを確認してください。</String>
523 <String Id="Error1915" Overridable="yes">ODBC ドライバー マネージャーの削除でエラーが発生しました。ODBC エラー [2]: [3]。サポート担当者に問い合わせてください。</String>
524 <String Id="Error1916" Overridable="yes">ODBC ドライバー マネージャーのインストールでエラーが発生しました。ODBC エラー [2]: [3]。サポート担当者に問い合わせてください。</String>
525 <String Id="Error1917" Overridable="yes">ODBC ドライバー [4] の削除でエラーが発生しました。ODBC エラー [2]: [3]。ODBC ドライバーを削除できる十分な権限があることを確認してください。</String>
526 <String Id="Error1918" Overridable="yes">ODBC ドライバー [4] のインストールでエラーが発生しました。ODBC エラー [2]: [3]。ファイル [4] が存在し、そのファイルにアクセスできることを確認してください。</String>
527 <String Id="Error1919" Overridable="yes">ODBC データ ソースの構成でエラーが発生しました: [4]。ODBC エラー [2]: [3]。ファイル [4] が存在し、そのファイルにアクセスできることを確認してください。</String>
528 <String Id="Error1920" Overridable="yes">サービス '[2]' ([3]) を開始できませんでした。システム サービスを開始できる十分な権限があることを確認してください。</String>
529 <String Id="Error1921" Overridable="yes">サービス '[2]' ([3]) を停止できませんでした。システム サービスを停止できる十分な権限があることを確認してください。</String>
530 <String Id="Error1922" Overridable="yes">サービス '[2]' ([3]) を削除できませんでした。システム サービスを削除できる十分な権限があることを確認してください。</String>
531 <String Id="Error1923" Overridable="yes">サービス '[2]' ([3]) をインストールできませんでした。システム サービスをインストールできる十分な権限があることを確認してください。</String>
532 <String Id="Error1924" Overridable="yes">環境変数 '[2]' を更新できませんでした。環境変数を変更できる十分な権限があることを確認してください。</String>
533 <String Id="Error1925" Overridable="yes">十分な権限がないため、このコンピューターのすべてのユーザーが使用できるようにアプリケーションをインストールできません。管理者としてログオンして、インストールをやり直してください。</String>
534 <String Id="Error1926" Overridable="yes">ファイル '[3]' のファイル セキュリティを設定できませんでした。エラー: [2]。このファイルのセキュリティ アクセス許可を変更できる十分な権限があることを確認してください。</String>
535 <String Id="Error1927" Overridable="yes">コンポーネント サービス (COM+ 1.0) がこのコンピューターにインストールされていません。このインストールを完了するには、コンポーネント サービスが必要です。コンポーネント サービスは、Windows 2000 で利用できます。</String>
536 <String Id="Error1928" Overridable="yes">COM+ アプリケーションの登録中にエラーが発生しました。詳細については、サポート担当者に問い合わせてください。</String>
537 <String Id="Error1929" Overridable="yes">COM+ アプリケーションの登録解除中にエラーが発生しました。詳細については、サポート担当者に問い合わせてください。</String>
538 <String Id="Error1930" Overridable="yes">サービス '[2]' ([3]) の説明を変更できませんでした。</String>
539 <String Id="Error1931" Overridable="yes">Windows インストーラー サービスはシステム ファイル [2] を更新できません。ファイルは Windows によって保護されています。このプログラムを正しく動作させるには、オペレーティング システムの更新が必要な場合があります。{{パッケージ バージョン: [3]、OS の保護バージョン: [4]}}</String>
540 <String Id="Error1932" Overridable="yes">Windows インストーラー サービスは、保護された Windows ファイル [2] を更新できません。{{パッケージ バージョン: [3]、OS の保護バージョン: [4]、SFP エラー: [5]}}</String>
541 <String Id="Error1933" Overridable="yes">Windows インストーラー サービスは、1 つ以上の保護された Windows ファイルを更新できません。{{SFP エラー: [2]。保護されているファイルの一覧:\r\n[3]}}</String>
542 <String Id="Error1934" Overridable="yes">コンピューターのポリシーによって、ユーザー インストールは無効にされています。</String>
543 <String Id="Error1935" Overridable="yes">アセンブリ '[6]' のインストール中にエラーが発生しました。詳細については、ヘルプとサポートを参照してください。HRESULT: [3]。{{アセンブリ インターフェイス: [4]、関数: [5]、コンポーネント: [2]}}</String>
544 <String Id="Error1936" Overridable="yes">アセンブリ '[6]' のインストール中にエラーが発生しました。アセンブリは厳密な名前を持たないか、最小のキー長で署名されていません。HRESULT: [3]。{{アセンブリ インターフェイス: [4]、関数: [5]、コンポーネント: [2]}}</String>
545 <String Id="Error1937" Overridable="yes">アセンブリ '[6]' のインストール中にエラーが発生しました。署名またはカタログが検証できないか無効です。HRESULT: [3]。{{アセンブリ インターフェイス: [4]、関数: [5]、コンポーネント: [2]}}</String>
546 <String Id="Error1938" Overridable="yes">アセンブリ '[6]' のインストール中にエラーが発生しました。アセンブリの 1 つ以上のモジュールが見つかりませんでした。HRESULT: [3]。{{アセンブリ インターフェイス: [4]、関数: [5]、コンポーネント: [2]}}</String>
547
548 <String Id="UITextbytes" Overridable="yes">バイト</String>
549 <String Id="UITextGB" Overridable="yes">GB</String>
550 <String Id="UITextKB" Overridable="yes">KB</String>
551 <String Id="UITextMB" Overridable="yes">MB</String>
552 <String Id="UITextMenuAbsent" Overridable="yes">インストールしない</String>
553 <String Id="UITextMenuAdvertise" Overridable="yes">必要時にインストール</String>
554 <String Id="UITextMenuAllCD" Overridable="yes">CD からすべて実行</String>
555 <String Id="UITextMenuAllLocal" Overridable="yes">ローカル ハード ドライブにすべてインストール</String>
556 <String Id="UITextMenuAllNetwork" Overridable="yes">ネットワークからすべて実行</String>
557 <String Id="UITextMenuCD" Overridable="yes">CD から実行</String>
558 <String Id="UITextMenuLocal" Overridable="yes">ローカル ハード ドライブにインストール</String>
559 <String Id="UITextMenuNetwork" Overridable="yes">ネットワークから実行</String>
560 <String Id="UITextNewFolder" Overridable="yes">Folder|新しいフォルダー</String>
561 <String Id="UITextScriptInProgress" Overridable="yes">必要な情報を集めています...</String>
562 <String Id="UITextSelAbsentAbsent" Overridable="yes">この機能はインストールされません</String>
563 <String Id="UITextSelAbsentAdvertise" Overridable="yes">この機能は必要時にインストールされます</String>
564 <String Id="UITextSelAbsentCD" Overridable="yes">この機能は CD から実行されます</String>
565 <String Id="UITextSelAbsentLocal" Overridable="yes">この機能はローカル ハード ドライブにインストールされます</String>
566 <String Id="UITextSelAbsentNetwork" Overridable="yes">この機能はネットワークから実行されます</String>
567 <String Id="UITextSelAdvertiseAbsent" Overridable="yes">この機能は使用できなくなります</String>
568 <String Id="UITextSelAdvertiseAdvertise" Overridable="yes">必要な場合にインストールされます</String>
569 <String Id="UITextSelAdvertiseCD" Overridable="yes">この機能は CD から実行できるようになります</String>
570 <String Id="UITextSelAdvertiseLocal" Overridable="yes">この機能はローカル ハード ドライブにインストールされます</String>
571 <String Id="UITextSelAdvertiseNetwork" Overridable="yes">この機能はネットワークから実行されるようになります</String>
572 <String Id="UITextSelCDAbsent" Overridable="yes">この機能は完全にアンインストールされます。CD から実行することもできなくなります</String>
573 <String Id="UITextSelCDAdvertise" Overridable="yes">この機能は CD から実行される設定から、必要時にインストールされる設定に変更されます</String>
574 <String Id="UITextSelCDCD" Overridable="yes">この機能は今後も CD から実行されます</String>
575 <String Id="UITextSelCDLocal" Overridable="yes">この機能は CD から実行される設定から、ローカル ハード ドライブにインストールされる設定に変更されます</String>
576 <String Id="UITextSelChildCostNeg" Overridable="yes">この機能は、ハード ドライブの [1] を解放します。</String>
577 <String Id="UITextSelChildCostPos" Overridable="yes">この機能はハード ドライブの [1] を必要とします。</String>
578 <String Id="UITextSelCostPending" Overridable="yes">この機能のコストを計算しています...</String>
579 <String Id="UITextSelLocalAbsent" Overridable="yes">この機能は完全に削除されます</String>
580 <String Id="UITextSelLocalAdvertise" Overridable="yes">この機能はローカル ハード ドライブ上からは削除されますが、必要なときにインストールされるように設定されます</String>
581 <String Id="UITextSelLocalCD" Overridable="yes">この機能はローカル ハード ドライブから削除されますが、引き続き CD から実行できます</String>
582 <String Id="UITextSelLocalLocal" Overridable="yes">この機能はローカル ハード ドライブに残ります</String>
583 <String Id="UITextSelLocalNetwork" Overridable="yes">この機能はローカル ハード ドライブから削除されますが、ネットワークから実行することができます</String>
584 <String Id="UITextSelNetworkAbsent" Overridable="yes">この機能は完全にアンインストールされます。ネットワークから実行することもできなくなります</String>
585 <String Id="UITextSelNetworkAdvertise" Overridable="yes">この機能はネットワークから実行される設定から、必要時にインストールされる設定に変更されます</String>
586 <String Id="UITextSelNetworkLocal" Overridable="yes">この機能は、ネットワークから実行される設定から、ローカル ハード ドライブにインストールされる設定に変更されます</String>
587 <String Id="UITextSelNetworkNetwork" Overridable="yes">この機能は今後もネットワークから実行されます</String>
588 <String Id="UITextSelParentCostNegNeg" Overridable="yes">この機能ではハード ドライブが [1] 解放されます。[3] つのうち [2] つのサブ機能が選択されています。これらのサブ機能では、ハード ドライブが [4] 解放されます。</String>
589 <String Id="UITextSelParentCostNegPos" Overridable="yes">この機能ではハード ドライブが [1] 解放されます。[3] つのうち [2] つのサブ機能が選択されています。これらのサブ機能には、ハード ドライブ領域が [4] 必要です。</String>
590 <String Id="UITextSelParentCostPosNeg" Overridable="yes">この機能にはハード ドライブ領域が [1] 必要です。[3] つのうち [2] つのサブ機能が選択されています。これらのサブ機能では、ハード ドライブが [4] 解放されます。</String>
591 <String Id="UITextSelParentCostPosPos" Overridable="yes">この機能にはハード ドライブ領域が [1] 必要です。[3] つのうち [2] つのサブ機能が選択されています。これらのサブ機能には、ハード ドライブ領域が [4] 必要です。</String>
592 <String Id="UITextTimeRemaining" Overridable="yes">残り時間: {[1] 分 }{[2] 秒}</String>
593 <String Id="UITextVolumeCostAvailable" Overridable="yes">利用可能</String>
594 <String Id="UITextVolumeCostDifference" Overridable="yes">残領域</String>
595 <String Id="UITextVolumeCostRequired" Overridable="yes">必須</String>
596 <String Id="UITextVolumeCostSize" Overridable="yes">ディスク サイズ</String>
597 <String Id="UITextVolumeCostVolume" Overridable="yes">ボリューム</String>
598</WixLocalization>
diff --git a/src/ext/UI/wixlib/WixUI_kk-KZ.wxl b/src/ext/UI/wixlib/WixUI_kk-KZ.wxl
new file mode 100644
index 00000000..2e15277e
--- /dev/null
+++ b/src/ext/UI/wixlib/WixUI_kk-KZ.wxl
@@ -0,0 +1,598 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3
4
5<WixLocalization Culture="kk-kz" Codepage="1251" xmlns="http://wixtoolset.org/schemas/v4/wxl">
6 <String Id="WixUIBack" Overridable="yes">&amp;Артқа</String>
7 <String Id="WixUINext" Overridable="yes">&amp;Келесі</String>
8 <String Id="WixUICancel" Overridable="yes">Болдырмау</String>
9 <String Id="WixUIFinish" Overridable="yes">&amp;Аяқтау</String>
10 <String Id="WixUIRetry" Overridable="yes">&amp;Қайталау</String>
11 <String Id="WixUIIgnore" Overridable="yes">&amp;Елемеу</String>
12 <String Id="WixUIYes" Overridable="yes">&amp;Иә</String>
13 <String Id="WixUINo" Overridable="yes">&amp;Жоқ</String>
14 <String Id="WixUIOK" Overridable="yes">OK</String>
15 <String Id="WixUIPrint" Overridable="yes">&amp;Басып шығару</String>
16
17 <String Id="AdvancedWelcomeEulaDlg_Title" Overridable="yes">[ProductName] бағдарламасын орнату</String>
18 <String Id="AdvancedWelcomeEulaDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
19 <String Id="AdvancedWelcomeEulaDlgTitle" Overridable="yes">{\WixUI_Font_Title}[ProductName] бағдарламасының лицензиялық келісімін оқып шығыңыз</String>
20 <String Id="AdvancedWelcomeEulaDlgLicenseAcceptedCheckBox" Overridable="yes">Мен лицензиялық келісімнің шарттарын &amp;қабылдаймын</String>
21 <String Id="AdvancedWelcomeEulaDlgDescriptionPerMachine" Overridable="yes">Барлық пайдаланушыларға өнімді әдепкі параметрлерге орнату үшін "Орнату" түймешігін басыңыз. Орнату параметрлерін өзгерту үшін "Қосымша" түймешігін басыңыз.</String>
22 <String Id="AdvancedWelcomeEulaDlgDescriptionPerUser" Overridable="yes">Өзіңізге өнімді әдепкі параметрлерге орнату үшін "Орнату" түймешігін басыңыз. Орнату параметрлерін өзгерту үшін "Қосымша" түймешігін басыңыз.</String>
23 <String Id="AdvancedWelcomeEulaDlgInstall" Overridable="yes">&amp;Орнату</String>
24 <String Id="AdvancedWelcomeEulaDlgAdvanced" Overridable="yes">Қ&amp;осымша</String>
25 <String Id="Advanced_Font_Normal_Size" Overridable="yes">8</String>
26 <String Id="Advanced_Font_Bigger_Size" Overridable="yes">12</String>
27 <String Id="Advanced_Font_Title_Size" Overridable="yes">9</String>
28 <String Id="Advanced_Font_Emphasized_Size" Overridable="yes">8</String>
29 <String Id="Advanced_Font_FaceName" Overridable="yes">Tahoma</String>
30
31 <String Id="BrowseDlg_Title" Overridable="yes">[ProductName] бағдарламасын орнату</String>
32 <String Id="BrowseDlgComboLabel" Overridable="yes">&amp;Іздеу:</String>
33 <String Id="BrowseDlgWixUI_Bmp_Up" Overridable="yes">WixUI_Bmp_Up</String>
34 <String Id="BrowseDlgWixUI_Bmp_UpTooltip" Overridable="yes">Бір деңгей жоғары</String>
35 <String Id="BrowseDlgNewFolder" Overridable="yes">WixUI_Bmp_New</String>
36 <String Id="BrowseDlgNewFolderTooltip" Overridable="yes">Жаңа қалта жасау</String>
37 <String Id="BrowseDlgPathLabel" Overridable="yes">&amp;Қалта атауы:</String>
38 <String Id="BrowseDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
39 <String Id="BrowseDlgDescription" Overridable="yes">Тағайындалған қалтаны шолу</String>
40 <String Id="BrowseDlgTitle" Overridable="yes">{\WixUI_Font_Title}Тағайындау қалтасын өзгерту</String>
41
42 <String Id="CancelDlg_Title" Overridable="yes">[ProductName] бағдарламасын орнату</String>
43 <String Id="CancelDlgText" Overridable="yes">Шынымен [ProductName] бағдарламасын орнатудан бас тартқыңыз келе ме?</String>
44 <String Id="CancelDlgIcon" Overridable="yes">WixUI_Ico_Info</String>
45 <String Id="CancelDlgIconTooltip" Overridable="yes">Ақпарат белгішесі</String>
46
47 <String Id="CustomizeDlg_Title" Overridable="yes">[ProductName] бағдарламасын орнату</String>
48 <String Id="CustomizeDlgTree" Overridable="yes">Таңдаулар тармақтары</String>
49 <String Id="CustomizeDlgBrowse" Overridable="yes">Ш&amp;олу...</String>
50 <String Id="CustomizeDlgReset" Overridable="yes">Ыс&amp;ыру</String>
51 <String Id="CustomizeDlgDiskCost" Overridable="yes">Дискіні &amp;пайдалану</String>
52 <String Id="CustomizeDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
53 <String Id="CustomizeDlgText" Overridable="yes">Мүмкіндіктер орнатылатын жолды өзгерту үшін төмендегі тармақтағы белгішелерді нұқыңыз.</String>
54 <String Id="CustomizeDlgDescription" Overridable="yes">Мүмкіндіктер орнатылатын жолды таңдаңыз.</String>
55 <String Id="CustomizeDlgTitle" Overridable="yes">{\WixUI_Font_Title}Арнайы орнату</String>
56 <String Id="CustomizeDlgItemDescription" Overridable="yes">CustomizeDlgItemDescription-CustomizeDlgItemDescription</String>
57 <String Id="CustomizeDlgItemSize" Overridable="yes">CustomizeDlgItemSize-CustomizeDlgItemSize</String>
58 <String Id="CustomizeDlgLocation" Overridable="yes">CustomizeDlgLocation-CustomizeDlgLocation</String>
59 <String Id="CustomizeDlgLocationLabel" Overridable="yes">Орналасу:</String>
60
61 <String Id="DiskCostDlg_Title" Overridable="yes">[ProductName] бағдарламасын орнату</String>
62 <String Id="DiskCostDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
63 <String Id="DiskCostDlgText" Overridable="yes">Бөлектелген мәндерде таңдалған мүмкіндіктер үшін дискіде жеткілікті бос орын жоқ. Бөлектелген мәндерден кейбір файлдарды жоюға, азырақ мүмкіндіктер орнатуға немесе басқа тағайындау дискілерін таңдауыңызға болады.</String>
64 <String Id="DiskCostDlgDescription" Overridable="yes">Таңдалған мүмкіндіктерді орнату үшін дискіде бос орын қажет етіледі.</String>
65 <String Id="DiskCostDlgTitle" Overridable="yes">{\WixUI_Font_Title}Дискіде қажет етілетін бос орын</String>
66 <String Id="DiskCostDlgVolumeList" Overridable="yes">{120}{70}{70}{70}{70}</String>
67
68 <String Id="ErrorDlg_Title" Overridable="yes">[ProductName] бағдарламасын орнату</String>
69 <String Id="ErrorDlgErrorText" Overridable="yes">Ақпараттық мәтін</String>
70 <String Id="ErrorDlgErrorIcon" Overridable="yes">WixUI_Ico_Info</String>
71 <String Id="ErrorDlgErrorIconTooltip" Overridable="yes">Ақпарат белгішесі</String>
72
73 <String Id="ExitDialog_Title" Overridable="yes">[ProductName] бағдарламасын орнату</String>
74 <String Id="ExitDialogBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
75 <String Id="ExitDialogDescription" Overridable="yes">Орнату шеберінен шығу үшін "Аяқтау" түймешігін басыңыз.</String>
76 <String Id="ExitDialogTitle" Overridable="yes">{\WixUI_Font_Bigger}[ProductName] бағдарламасының орнату шебері жұмысын аяқтады</String>
77
78 <String Id="FatalError_Title" Overridable="yes">[ProductName] бағдарламасын орнату</String>
79 <String Id="FatalErrorBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
80 <String Id="FatalErrorTitle" Overridable="yes">{\WixUI_Font_Bigger}[ProductName] бағдарламасының орнату шебері жұмысын мерзімінен бұрын аяқтады</String>
81 <String Id="FatalErrorDescription1" Overridable="yes">[ProductName] бағдарламасының орнату шебері қатеге байланысты жұмысын мерзімінен бұрын аяқтады. Жүйеңіз өзгертілген жоқ. Бұл бағдарламаны кейінірек орнату үшін, орнату шеберін қайтадан іске қосыңыз.</String>
82 <String Id="FatalErrorDescription2" Overridable="yes">Орнату шеберінен шығу үшін "Аяқтау" түймешігін басыңыз.</String>
83
84 <String Id="FeaturesDlg_Title" Overridable="yes">[ProductName] бағдарламасын орнату</String>
85 <String Id="FeaturesDlgTree" Overridable="yes">Өнім мүмкіндіктері</String>
86 <String Id="FeaturesDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
87 <String Id="FeaturesDlgDescription" Overridable="yes">Мүмкіндіктер орнатылатын жолды таңдаңыз.</String>
88 <String Id="FeaturesDlgTitle" Overridable="yes">{\WixUI_Font_Title}Өнім мүмкіндіктері</String>
89 <String Id="FeaturesDlgItemDescription" Overridable="yes">FeaturesDlgItemDescription</String>
90 <String Id="FeaturesDlgItemSize" Overridable="yes">FeaturesDlgItemSize</String>
91 <String Id="FeaturesDlgInstall" Overridable="yes">&amp;Орнату</String>
92 <String Id="FeaturesDlgChange" Overridable="yes">&amp;Өзгерту</String>
93
94 <String Id="FilesInUse_Title" Overridable="yes">[ProductName] бағдарламасын орнату</String>
95 <String Id="FilesInUseExit" Overridable="yes">Ш&amp;ығу</String>
96 <String Id="FilesInUseBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
97 <String Id="FilesInUseText" Overridable="yes">Бұл орнату жаңартуы керек файлдарды келесі бағдарламалар пайдалануда. Бұл бағдарламаларды жабыңыз да, орнатуды жалғастыру үшін "Қ&amp;айталау" түймешігін немесе одан шығу үшін "Шығу" түймешігін басыңыз.</String>
98 <String Id="FilesInUseDescription" Overridable="yes">Жаңартылуы қажет кейбір файлдар қазір қолданыста.</String>
99 <String Id="FilesInUseTitle" Overridable="yes">{\WixUI_Font_Title}Қолданыстағы файлдар</String>
100
101 <String Id="InstallDirDlg_Title" Overridable="yes">[ProductName] бағдарламасын орнату</String>
102 <String Id="InstallDirDlgChange" Overridable="yes">&amp;Өзгерту...</String>
103 <String Id="InstallDirDlgTitle" Overridable="yes">{\WixUI_Font_Title}Тағайындау қалтасы</String>
104 <String Id="InstallDirDlgDescription" Overridable="yes">Әдепкі қалтаны орнату үшін "Келесі" түймешігін немесе басқасын таңдау үшін "Өзгерту" түймешігін басыңыз.</String>
105 <String Id="InstallDirDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
106 <String Id="InstallDirDlgFolderLabel" Overridable="yes">[ProductName] бағдарламасын мұнда орнату:</String>
107
108 <String Id="InstallScopeDlg_Title" Overridable="yes">[ProductName] бағдарламасын орнату</String>
109 <String Id="InstallScopeDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
110 <String Id="InstallScopeDlgDescription" Overridable="yes">Орнату ауқымын және қалтасын таңдау</String>
111 <String Id="InstallScopeDlgTitle" Overridable="yes">{\WixUI_Font_Title}Орнату ауқымы</String>
112 <String Id="InstallScopeDlgPerUser" Overridable="yes">{\WixUI_Font_Emphasized}&amp;Тек өзіңіз үшін орнату ([USERNAME])</String>
113 <String Id="InstallScopeDlgPerUserDescription" Overridable="yes">[ProductName] бағдарламасы әрбір пайдаланушы қалтасына орнатылады және тек пайдаланушы тіркелгіңізге қол жетімді болады. Әкімші құқықтары қажет емес.</String>
114 <String Id="InstallScopeDlgNoPerUserDescription" Overridable="yes">[ProductName] бағдарламасы әрбір пайдаланушы орнатуын қолдамайды.</String>
115 <String Id="InstallScopeDlgPerMachine" Overridable="yes">{\WixUI_Font_Emphasized}Осы &amp;компьютердің барлық пайдаланушылары үшін орнату</String>
116 <String Id="InstallScopeDlgPerMachineDescription" Overridable="yes">[ProductName] бағдарламасы әрбір компьютер қалтасына әдепкідей орнатылады және барлық пайдаланушылар үшін қол жетімді болады. Әдепкі орнату қалтасын өзгерте аласыз. Әкімші құқықтары болуы қажет.</String>
117 <String Id="InstallScopeDlgFolderLabel" Overridable="yes">Орнату &amp;қалтасы:</String>
118 <String Id="InstallScopeDlgChange" Overridable="yes">&amp;Өзгерту...</String>
119
120 <String Id="InvalidDirDlg_Title" Overridable="yes">[ProductName] бағдарламасын орнату</String>
121 <String Id="InvalidDirDlgText" Overridable="yes">Орнату каталогы жергілікті қатты дискіде болуы керек.</String>
122 <String Id="InvalidDirDlgIcon" Overridable="yes">WixUI_Ico_Info</String>
123 <String Id="InvalidDirDlgIconTooltip" Overridable="yes">Ақпарат белгішесі</String>
124
125 <String Id="LicenseAgreementDlg_Title" Overridable="yes">[ProductName] бағдарламасын орнату</String>
126 <String Id="LicenseAgreementDlgLicenseAcceptedCheckBox" Overridable="yes">Мен лицензиялық келісімнің шарттарын &amp;қабылдаймын</String>
127 <String Id="LicenseAgreementDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
128 <String Id="LicenseAgreementDlgDescription" Overridable="yes">Төмендегі лицензиялық келісімнің шарттарын мұқият оқып шығыңыз</String>
129 <String Id="LicenseAgreementDlgTitle" Overridable="yes">{\WixUI_Font_Title}соңғы тұтынушысына арналған лицензиялық келісім</String>
130
131 <String Id="MaintenanceTypeDlg_Title" Overridable="yes">[ProductName] бағдарламасын орнату</String>
132 <String Id="MaintenanceTypeDlgChangeButton" Overridable="yes">&amp;Өзгерту</String>
133 <String Id="MaintenanceTypeDlgChangeButtonTooltip" Overridable="yes">Орнатуды өзгерту</String>
134 <String Id="MaintenanceTypeDlgRepairButton" Overridable="yes">Қа&amp;лпына келтіру</String>
135 <String Id="MaintenanceTypeDlgRepairButtonTooltip" Overridable="yes">Орнатуды қалпына келтіру</String>
136 <String Id="MaintenanceTypeDlgRemoveButton" Overridable="yes">&amp;Жою</String>
137 <String Id="MaintenanceTypeDlgRemoveButtonTooltip" Overridable="yes">Орнатуды жою</String>
138 <String Id="MaintenanceTypeDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
139 <String Id="MaintenanceTypeDlgDescription" Overridable="yes">Орындағыңыз келген әрекетті таңдаңыз.</String>
140 <String Id="MaintenanceTypeDlgTitle" Overridable="yes">{\WixUI_Font_Title}Орнатуды өзгерту, қалпына келтіру немесе жою</String>
141 <String Id="MaintenanceTypeDlgChangeText" Overridable="yes">Сізге мүмкіндіктердің орнатылу жолын өзгертуге мүмкіндік береді.</String>
142 <String Id="MaintenanceTypeDlgChangeDisabledText" Overridable="yes">[ProductName] бағдарламасында бөлек таңдалатын мүмкіндіктер жоқ.</String>
143 <String Id="MaintenanceTypeDlgRemoveText" Overridable="yes">[ProductName] бағдарламасын компьютеріңізден жояды.</String>
144 <String Id="MaintenanceTypeDlgRemoveDisabledText" Overridable="yes">[ProductName] бағдарламасын жою мүмкін емес.</String>
145 <String Id="MaintenanceTypeDlgRepairText" Overridable="yes">Жоқ және бұзылған файлдарды, ендер мен тізбе жазбаларын түзету арқылы ең соңғы орнатудағы қателерді қалпына келтіреді.</String>
146 <String Id="MaintenanceTypeDlgRepairDisabledText" Overridable="yes">[ProductName] бағдарламасын қалпына келтіру мүмкін емес.</String>
147
148 <String Id="MaintenanceWelcomeDlg_Title" Overridable="yes">[ProductName] бағдарламасын орнату</String>
149 <String Id="MaintenanceWelcomeDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
150 <String Id="MaintenanceWelcomeDlgDescription" Overridable="yes">Орнату шебері [ProductName] бағдарламасының мүмкіндіктері компьютеріңізге қалай орнатылатынын өзгертуге немесе оны компьютеріңізден жоюға мүмкіндік береді. Жалғастыру үшін "Келесі" түймешігін немесе орнату шеберінен шығу үшін "Болдырмау" түймешігін басыңыз.</String>
151 <String Id="MaintenanceWelcomeDlgTitle" Overridable="yes">{\WixUI_Font_Bigger}[ProductName] бағдарламасының орнату шеберіне қош келдіңіз</String>
152
153 <String Id="MsiRMFilesInUse_Title" Overridable="yes">[ProductName] бағдарламасын орнату</String>
154 <String Id="MsiRMFilesInUseBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
155 <String Id="MsiRMFilesInUseText" Overridable="yes">Бұл орнату жаңартуы керек файлдарды келесі бағдарламалар пайдалануда. Орнату шеберіне оларды жауып, қайта қотаруға немесе компьютерді кейінірек қайта қотаруға мүмкіндік бере аласыз.</String>
156 <String Id="MsiRMFilesInUseDescription" Overridable="yes">Жаңартылуы қажет кейбір файлдар қазір қолданыста.</String>
157 <String Id="MsiRMFilesInUseTitle" Overridable="yes">{\WixUI_Font_Title}Қолданыстағы файлдар</String>
158 <String Id="MsiRMFilesInUseUseRM" Overridable="yes">&amp;Бағдарламаларды жауып, оларды қайта қотарып көріңіз.</String>
159 <String Id="MsiRMFilesInUseDontUseRM" Overridable="yes">&amp;Бағдарламаларды жаппаңыз. Компьютерді қайта қотару қажет болады.</String>
160
161 <String Id="OutOfDiskDlg_Title" Overridable="yes">[ProductName] бағдарламасын орнату</String>
162 <String Id="OutOfDiskDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
163 <String Id="OutOfDiskDlgText" Overridable="yes">Бөлектелген мәнедерде ағымдағы таңдалған мүмкіндіктер үшін дискте жеткілікті бос орын жоқ. Бөлектелген мәндерден кейбір файлдарды жоюға, азырақ мүмкіндіктер орнатуға немесе басқа тағайындау драйверін таңдауға болады.</String>
164 <String Id="OutOfDiskDlgDescription" Overridable="yes">Орнату үшін қажет етілетін дискідегі бос орын дискіде бар бос орыннан асады.</String>
165 <String Id="OutOfDiskDlgTitle" Overridable="yes">{\WixUI_Font_Title}Дискіде бос орын жоқ</String>
166 <String Id="OutOfDiskDlgVolumeList" Overridable="yes">{120}{70}{70}{70}{70}</String>
167
168 <String Id="OutOfRbDiskDlg_Title" Overridable="yes">[ProductName] бағдарламасын орнату</String>
169 <String Id="OutOfRbDiskDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
170 <String Id="OutOfRbDiskDlgText" Overridable="yes">Бөлектелген мәнедерде ағымдағы таңдалған мүмкіндіктер үшін дискте жеткілікті бос орын жоқ. Бөлектелген мәндерден кейбір файлдарды жоюға, азырақ мүмкіндіктер орнатуға немесе басқа тағайындау драйверін таңдауға болады.</String>
171 <String Id="OutOfRbDiskDlgDescription" Overridable="yes">Орнату үшін қажет етілетін дискідегі бос орын дискіде бар бос орыннан асады.</String>
172 <String Id="OutOfRbDiskDlgTitle" Overridable="yes">{\WixUI_Font_Title}Дискіде бос орын жоқ</String>
173 <String Id="OutOfRbDiskDlgVolumeList" Overridable="yes">{120}{70}{70}{70}{70}</String>
174 <String Id="OutOfRbDiskDlgText2" Overridable="yes">Сонымен қатар, орнатушының қалпына келтіру функциясын ажыратуға болады. Қалпына келтіру функциясын ажырату орнату процесі қандай да бір жағдайда үзілген кезде орнатушы бағдарламаның компьютеріңізді бастапқы күйге келтіруіне мүмкіндік бермейді. Тәуекелге барып, қалпына келтіру функциясын ажырату үшін "Иә" түймешігін басыңыз.</String>
175
176 <String Id="PrepareDlg_Title" Overridable="yes">[ProductName] бағдарламасын орнату</String>
177 <String Id="PrepareDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
178 <String Id="PrepareDlgDescription" Overridable="yes">Орнату шебері орнату барысында бағыт беруге дайын болғанша күтіңіз.</String>
179 <String Id="PrepareDlgTitle" Overridable="yes">{\WixUI_Font_Bigger}[ProductName] бағдарламасының орнату шеберіне қош келдіңіз</String>
180
181 <String Id="ProgressDlg_Title" Overridable="yes">[ProductName] бағдарламасын орнату</String>
182 <String Id="ProgressDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
183 <String Id="ProgressDlgTextInstalling" Overridable="yes">Орнату шебері [ProductName] бағдарламасын орнатқанға дейін күте тұрыңыз.</String>
184 <String Id="ProgressDlgTitleInstalling" Overridable="yes">{\WixUI_Font_Title}[ProductName] бағдарламасы орнатылуда</String>
185 <String Id="ProgressDlgTextChanging" Overridable="yes">Орнату шебері [ProductName] бағдарламасын өзгерткенге дейін күте тұрыңыз.</String>
186 <String Id="ProgressDlgTitleChanging" Overridable="yes">{\WixUI_Font_Title}[ProductName] бағдарламасы өзгертілуде</String>
187 <String Id="ProgressDlgTextRepairing" Overridable="yes">Орнату шебері [ProductName] бағдарламасын қалпына келтіргенге дейін күте тұрыңыз.</String>
188 <String Id="ProgressDlgTitleRepairing" Overridable="yes">{\WixUI_Font_Title}[ProductName] бағдарламасы қалпына келтірілуде</String>
189 <String Id="ProgressDlgTextRemoving" Overridable="yes">Орнату шебері [ProductName] бағдарламасын жойғанға дейін күте тұрыңыз.</String>
190 <String Id="ProgressDlgTitleRemoving" Overridable="yes">{\WixUI_Font_Title}[ProductName] бағдарламасы жойылуда</String>
191 <String Id="ProgressDlgTextUpdating" Overridable="yes">Орнату шебері [ProductName] бағдарламасын орнатқанға дейін күте тұрыңыз.</String>
192 <String Id="ProgressDlgTitleUpdating" Overridable="yes">{\WixUI_Font_Title} [ProductName] бағдарламасын жаңартуда</String>
193 <String Id="ProgressDlgProgressBar" Overridable="yes">Орындалды</String>
194 <String Id="ProgressDlgStatusLabel" Overridable="yes">Күйі:</String>
195
196 <String Id="ResumeDlg_Title" Overridable="yes">[ProductName] бағдарламасын орнату</String>
197 <String Id="ResumeDlgInstall" Overridable="yes">&amp;Орнату</String>
198 <String Id="ResumeDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
199 <String Id="ResumeDlgDescription" Overridable="yes">Орнату шебері [ProductName] бағдарламасын компьютеріңізге орнатуды аяқтайды. Жалғастыру үшін "Орнату" түймешігін немесе орнату шеберінен шығу үшін "Болдырмау" түймешігін басыңыз.</String>
200 <String Id="ResumeDlgTitle" Overridable="yes">{\WixUI_Font_Bigger}[ProductName] бағдарламасын орнату шебері жаңартылуда</String>
201
202 <String Id="SetupTypeDlg_Title" Overridable="yes">[ProductName] бағдарламасын орнату</String>
203 <String Id="SetupTypeDlgTypicalButton" Overridable="yes">&amp;Әдеттегі</String>
204 <String Id="SetupTypeDlgTypicalButtonTooltip" Overridable="yes">Әдеттегі орнату</String>
205 <String Id="SetupTypeDlgCustomButton" Overridable="yes">Т&amp;аңдамалы</String>
206 <String Id="SetupTypeDlgCustomButtonTooltip" Overridable="yes">Таңдамалы орнату</String>
207 <String Id="SetupTypeDlgCompleteButton" Overridable="yes">А&amp;яқтау</String>
208 <String Id="SetupTypeDlgCompleteButtonTooltip" Overridable="yes">Орнатуды аяқтау</String>
209 <String Id="SetupTypeDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
210 <String Id="SetupTypeDlgTitle" Overridable="yes">{\WixUI_Font_Title}Орнату түрін таңдау</String>
211 <String Id="SetupTypeDlgDescription" Overridable="yes">Қажеттіліктерге сәйкес келетін орнату түрін таңдау</String>
212 <String Id="SetupTypeDlgTypicalText" Overridable="yes">Көптеген жалпы бағдарлама мүмкіндіктерін орнатады. Көптеген пайдаланушыларға ұсынылады.</String>
213 <String Id="SetupTypeDlgCustomText" Overridable="yes">Пайдаланушыларға орнатылатын бағдарлама мүмкіндіктерін және олардың орнатылатын жерін таңдауға мүмкіндік береді. Тәжірибелі пайдаланушылар үшін ұсынылады.</String>
214 <String Id="SetupTypeDlgCompleteText" Overridable="yes">Барлық бағдарлама мүмкіндіктері орнатылады. Дискіде қосымша бос орын қажет.</String>
215
216 <String Id="UserExit_Title" Overridable="yes">[ProductName] бағдарламасын орнату</String>
217 <String Id="UserExitBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
218 <String Id="UserExitTitle" Overridable="yes">{\WixUI_Font_Bigger}[ProductName] бағдарламасының орнату шеберінің жұмысы үзілді</String>
219 <String Id="UserExitDescription1" Overridable="yes">[ProductName] бағдарламасын орнату үзілді. Жүйеңіз өзгертілген жоқ. Бұл бағдарламаны кейінірек орнату үшін, орнатуды қайтадан іске қосыңыз.</String>
220 <String Id="UserExitDescription2" Overridable="yes">Орнату шеберінен шығу үшін "Аяқтау" түймешігін басыңыз.</String>
221
222 <String Id="VerifyReadyDlg_Title" Overridable="yes">[ProductName] бағдарламасын орнату</String>
223 <String Id="VerifyReadyDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
224 <String Id="VerifyReadyDlgInstall" Overridable="yes">&amp;Орнату</String>
225 <String Id="VerifyReadyDlgInstallText" Overridable="yes">Орнатуды бастау үшін "Орнату" түймешігін басыңыз. Сараптау немесе кез келген орнату параметрлерін өзгерту үшін "Артқа" түймешігін басыңыз. Шеберден шығу үшін "Болдырмау" түймешігін басыңыз.</String>
226 <String Id="VerifyReadyDlgInstallTitle" Overridable="yes">{\WixUI_Font_Title}[ProductName] бағдарламасын орнатуға дайын</String>
227 <String Id="VerifyReadyDlgChange" Overridable="yes">&amp;Өзгерту</String>
228 <String Id="VerifyReadyDlgChangeText" Overridable="yes">Орнатуды бастау үшін "Өзгерту" түймешігін басыңыз. Сараптау немесе кез келген орнату параметрлерін өзгерту үшін "Артқа" түймешігін басыңыз. Шеберден шығу үшін "Болдырмау" түймешігін басыңыз.</String>
229 <String Id="VerifyReadyDlgChangeTitle" Overridable="yes">{\WixUI_Font_Title}[ProductName] бағдарламасын өзгертуге дайын</String>
230 <String Id="VerifyReadyDlgRepair" Overridable="yes">Қа&amp;лпына келтіру</String>
231 <String Id="VerifyReadyDlgRepairText" Overridable="yes">[ProductName] бағдарламасының орнатуын қалпына келтіру үшін "Қалпына келтіру" түймешігін басыңыз. Сараптау немесе кез келген орнату параметрлерін өзгерту үшін "Артқа" түймешігін басыңыз. Шеберден шығу үшін "Болдырмау" түймешігін басыңыз.</String>
232 <String Id="VerifyReadyDlgRepairTitle" Overridable="yes">{\WixUI_Font_Title}[ProductName] бағдарламасын қалпына келтіруге дайын</String>
233 <String Id="VerifyReadyDlgRemove" Overridable="yes">&amp;Жою</String>
234 <String Id="VerifyReadyDlgRemoveText" Overridable="yes">[ProductName] бағдарламасын компьютеріңізден жою үшін ”Жою” түймешігін басыңыз. Сараптау немесе кез келген орнату параметрлерін өзгерту үшін "Артқа" түймешігін басыңыз. Шеберден шығу үшін "Болдырмау" түймешігін басыңыз.</String>
235 <String Id="VerifyReadyDlgRemoveTitle" Overridable="yes">{\WixUI_Font_Title}[ProductName] бағдарламасын жоюға дайын</String>
236 <String Id="VerifyReadyDlgUpdate" Overridable="yes">&amp;Жаңарту</String>
237 <String Id="VerifyReadyDlgUpdateText" Overridable="yes">[ProductName] бағдарламасын компьютеріңізден жаңарту үшін "Жаңарту" түймешігін басыңыз. Сараптау немесе кез келген орнату параметрлерін өзгерту үшін "Артқа" түймешігін басыңыз. Шеберден шығу үшін "Болдырмау" түймешігін басыңыз.</String>
238 <String Id="VerifyReadyDlgUpdateTitle" Overridable="yes">{\WixUI_Font_Title}[ProductName] бағдарламасын жаңартуға дайын</String>
239
240 <String Id="WaitForCostingDlg_Title" Overridable="yes">[ProductName] бағдарламасын орнату</String>
241 <String Id="WaitForCostingDlgReturn" Overridable="yes">&amp;Қайтару</String>
242 <String Id="WaitForCostingDlgText" Overridable="yes">Орнатушы дискідегі бос орын талаптарын анықтап болғанша күте тұрыңыз.</String>
243 <String Id="WaitForCostingDlgIcon" Overridable="yes">WixUI_Ico_Exclam</String>
244 <String Id="WaitForCostingDlgIconTooltip" Overridable="yes">Леп белгішесі</String>
245
246 <String Id="WelcomeDlg_Title" Overridable="yes">[ProductName] бағдарламасын орнату</String>
247 <String Id="WelcomeDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
248 <String Id="WelcomeDlgDescription" Overridable="yes">Орнату шебері компьютеріңізге [ProductName] бағдарламасын орнатады. Жалғастыру үшін "Келесі" түймешігін немесе орнату шеберінен шығу үшін "Болдырмау" түймешігін басыңыз.</String>
249 <String Id="WelcomeUpdateDlgDescriptionUpdate" Overridable="yes">Орнату шебері компьютеріңіздегі [ProductName] бағдарламасын жаңартады. Жалғастыру үшін "Келесі" түймешігін немесе орнату шеберінен шығу үшін "Болдырмау" түймешігін басыңыз.</String>
250 <String Id="WelcomeDlgTitle" Overridable="yes">{\WixUI_Font_Bigger}[ProductName] бағдарламасының орнату шеберіне қош келдіңіз</String>
251
252 <String Id="WelcomeEulaDlg_Title" Overridable="yes">[ProductName] бағдарламасын орнату</String>
253 <String Id="WelcomeEulaDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
254 <String Id="WelcomeEulaDlgLicenseAcceptedCheckBox" Overridable="yes">Мен лицензиялық келісімнің шарттарын &amp;қабылдаймын</String>
255 <String Id="WelcomeEulaDlgInstall" Overridable="yes">&amp;Орнату</String>
256 <String Id="WelcomeEulaDlgUpdate" Overridable="yes">&amp;Жаңарту</String>
257 <String Id="WelcomeEulaDlgTitle" Overridable="yes">{\WixUI_Font_Title}[ProductName] бағдарламасының лицензиялық келісімін оқып шығыңыз</String>
258
259 <String Id="ProgressTextInstallValidate" Overridable="yes">Орнату тексерілуде</String>
260 <String Id="ProgressTextInstallFiles" Overridable="yes">Жаңа файлдар көшірілуде</String>
261 <String Id="ProgressTextInstallFilesTemplate" Overridable="yes">Файл: [1], каталог: [9], өлшем: [6]</String>
262 <String Id="ProgressTextInstallAdminPackage" Overridable="yes">Желілік орнату файлдары көшірілуде</String>
263 <String Id="ProgressTextInstallAdminPackageTemplate" Overridable="yes">Файл: [1], каталог: [9], өлшем: [6]</String>
264 <String Id="ProgressTextFileCost" Overridable="yes">Талап етілетін бос орын есептелуде</String>
265 <String Id="ProgressTextCostInitialize" Overridable="yes">Талап етілетін бос орын есептелуде</String>
266 <String Id="ProgressTextCostFinalize" Overridable="yes">Талап етілетін бос орын есептелуде</String>
267 <String Id="ProgressTextCreateShortcuts" Overridable="yes">Таңбашалар жасалуда</String>
268 <String Id="ProgressTextCreateShortcutsTemplate" Overridable="yes">Ен: [1]</String>
269 <String Id="ProgressTextPublishComponents" Overridable="yes">Сәйкес құрамдас бөліктер жариялануда</String>
270 <String Id="ProgressTextPublishComponentsTemplate" Overridable="yes">Құрамдас бөлік коды: [1], жіктегіш: [2]</String>
271 <String Id="ProgressTextPublishFeatures" Overridable="yes">Өнім мүмкіндіктері жариялануда</String>
272 <String Id="ProgressTextPublishFeaturesTemplate" Overridable="yes">Мүмкіндік: [1]</String>
273 <String Id="ProgressTextPublishProduct" Overridable="yes">Өнім туралы мәліметтер жариялануда</String>
274 <String Id="ProgressTextRegisterClassInfo" Overridable="yes">Сынып серверлері тіркелуде</String>
275 <String Id="ProgressTextRegisterClassInfoTemplate" Overridable="yes">Сынып коды: [1]</String>
276 <String Id="ProgressTextRegisterExtensionInfo" Overridable="yes">Кеңейтім серверлері тіркелуде</String>
277 <String Id="ProgressTextRegisterExtensionInfoTemplate" Overridable="yes">Кеңейтім: [1]</String>
278 <String Id="ProgressTextRegisterMIMEInfo" Overridable="yes">MIME мәліметтері тіркелуде</String>
279 <String Id="ProgressTextRegisterMIMEInfoTemplate" Overridable="yes">MIME мазмұнының түрі: [1], кеңейтім: [2]</String>
280 <String Id="ProgressTextRegisterProgIdInfo" Overridable="yes">Бағдарлама идентификаторлары тіркелуде</String>
281 <String Id="ProgressTextRegisterProgIdInfoTemplate" Overridable="yes">ProgId: [1]</String>
282 <String Id="ProgressTextAllocateRegistrySpace" Overridable="yes">Тізбе бос орны бөлектелуде</String>
283 <String Id="ProgressTextAllocateRegistrySpaceTemplate" Overridable="yes">Бос орын: [1]</String>
284 <String Id="ProgressTextAppSearch" Overridable="yes">Орнатылған бағдарламалар ізделуде</String>
285 <String Id="ProgressTextAppSearchTemplate" Overridable="yes">Сипат: [1], қолтаңба: [2]</String>
286 <String Id="ProgressTextBindImage" Overridable="yes">Атқарылатын файлдар біріктірілуде</String>
287 <String Id="ProgressTextBindImageTemplate" Overridable="yes">Файл: [1]</String>
288 <String Id="ProgressTextCCPSearch" Overridable="yes">Сәйкес өнімдер ізделуде</String>
289 <String Id="ProgressTextCreateFolders" Overridable="yes">Қалталар жасалуда</String>
290 <String Id="ProgressTextCreateFoldersTemplate" Overridable="yes">Қалта: [1]</String>
291 <String Id="ProgressTextDeleteServices" Overridable="yes">Қызметтер жойылуда</String>
292 <String Id="ProgressTextDeleteServicesTemplate" Overridable="yes">Қызмет: [1]</String>
293 <String Id="ProgressTextDuplicateFiles" Overridable="yes">Көшірме файлдары жасалуда</String>
294 <String Id="ProgressTextDuplicateFilesTemplate" Overridable="yes">Файл: [1], каталог: [9], өлшем: [6]</String>
295 <String Id="ProgressTextFindRelatedProducts" Overridable="yes">Байланысқан бағдарламалар ізделуде</String>
296 <String Id="ProgressTextFindRelatedProductsTemplate" Overridable="yes">Табылған бағдарлама: [1]</String>
297 <String Id="ProgressTextInstallODBC" Overridable="yes">ODBC құрамдас бөліктері орнатылуда</String>
298 <String Id="ProgressTextInstallServices" Overridable="yes">Жаңа қызметтер орнатылуда</String>
299 <String Id="ProgressTextInstallServicesTemplate" Overridable="yes">Қызмет: [2]</String>
300 <String Id="ProgressTextLaunchConditions" Overridable="yes">Іске қосу шарттары бағаланып жатыр</String>
301 <String Id="ProgressTextMigrateFeatureStates" Overridable="yes">Қатысты бағдарламалардан мүмкіндіктердің күйлері өткізілуде</String>
302 <String Id="ProgressTextMigrateFeatureStatesTemplate" Overridable="yes">Бағдарлама: [1]</String>
303 <String Id="ProgressTextMoveFiles" Overridable="yes">Файлдар жылжытылуда</String>
304 <String Id="ProgressTextMoveFilesTemplate" Overridable="yes">Файл: [1], каталог: [9], өлшем: [6]</String>
305 <String Id="ProgressTextPatchFiles" Overridable="yes">Файлдар жаңартылуда</String>
306 <String Id="ProgressTextPatchFilesTemplate" Overridable="yes">Файл: [1], каталог: [2], өлшем: [3]</String>
307 <String Id="ProgressTextProcessComponents" Overridable="yes">Құрамдас бөлік тіркемесі жаңартылуда</String>
308 <String Id="ProgressTextRegisterComPlus" Overridable="yes">COM+ бағдарламалары мен құрамдас бөліктері тіркелуде</String>
309 <String Id="ProgressTextRegisterComPlusTemplate" Overridable="yes">AppId: [1]{{, AppType: [2], пайдаланушылар: [3], RSN: [4]}}</String>
310 <String Id="ProgressTextRegisterFonts" Overridable="yes">Қаріптер тіркелуде</String>
311 <String Id="ProgressTextRegisterFontsTemplate" Overridable="yes">Қаріп: [1]</String>
312 <String Id="ProgressTextRegisterProduct" Overridable="yes">Өнім тіркелуде</String>
313 <String Id="ProgressTextRegisterProductTemplate" Overridable="yes">[1]</String>
314 <String Id="ProgressTextRegisterTypeLibraries" Overridable="yes">Түрлер кітапханалары тіркелуде</String>
315 <String Id="ProgressTextRegisterTypeLibrariesTemplate" Overridable="yes">LibID: [1]</String>
316 <String Id="ProgressTextRegisterUser" Overridable="yes">Пайдаланушы тіркелуде</String>
317 <String Id="ProgressTextRegisterUserTemplate" Overridable="yes">[1]</String>
318 <String Id="ProgressTextRemoveDuplicateFiles" Overridable="yes">Қайталанатын файлдар жойылуда</String>
319 <String Id="ProgressTextRemoveDuplicateFilesTemplate" Overridable="yes">Файл: [1], каталог: [9]</String>
320 <String Id="ProgressTextRemoveEnvironmentStrings" Overridable="yes">Орта жолдары жаңартылуда</String>
321 <String Id="ProgressTextRemoveEnvironmentStringsTemplate" Overridable="yes">Атау: [1], мән: [2], әрекет [3]</String>
322 <String Id="ProgressTextRemoveExistingProducts" Overridable="yes">Бағдарламалар жойылуда</String>
323 <String Id="ProgressTextRemoveExistingProductsTemplate" Overridable="yes">Бағдарлама: [1], пәрмен жолы: [2]</String>
324 <String Id="ProgressTextRemoveFiles" Overridable="yes">Файлдар жойылуда</String>
325 <String Id="ProgressTextRemoveFilesTemplate" Overridable="yes">Файл: [1], каталог: [9]</String>
326 <String Id="ProgressTextRemoveFolders" Overridable="yes">Қалталар жойылуда</String>
327 <String Id="ProgressTextRemoveFoldersTemplate" Overridable="yes">Қалта: [1]</String>
328 <String Id="ProgressTextRemoveIniValues" Overridable="yes">INI файлдарының жазбалары жойылуда</String>
329 <String Id="ProgressTextRemoveIniValuesTemplate" Overridable="yes">Файл: [1], бөлім: [2], перне: [3], мән: [4]</String>
330 <String Id="ProgressTextRemoveODBC" Overridable="yes">ODBC құрамдас бөліктері жойылуда</String>
331 <String Id="ProgressTextRemoveRegistryValues" Overridable="yes">Жүйелік тізбе мәндері жойылуда</String>
332 <String Id="ProgressTextRemoveRegistryValuesTemplate" Overridable="yes">Перне: [1], атау: [2]</String>
333 <String Id="ProgressTextRemoveShortcuts" Overridable="yes">Ендер жойылуда</String>
334 <String Id="ProgressTextRemoveShortcutsTemplate" Overridable="yes">Ен: [1]</String>
335 <String Id="ProgressTextRMCCPSearch" Overridable="yes">Сәйкес өнімдер ізделуде</String>
336 <String Id="ProgressTextSelfRegModules" Overridable="yes">Модульдер тіркелуде</String>
337 <String Id="ProgressTextSelfRegModulesTemplate" Overridable="yes">Файл: [1], қалта: [2]</String>
338 <String Id="ProgressTextSelfUnregModules" Overridable="yes">Модульдерді тіркеу болдырылмауда</String>
339 <String Id="ProgressTextSelfUnregModulesTemplate" Overridable="yes">Файл: [1], қалта: [2]</String>
340 <String Id="ProgressTextSetODBCFolders" Overridable="yes">ODBC каталогтары баптандырылуда</String>
341 <String Id="ProgressTextStartServices" Overridable="yes">Қызметтер іске қосылуда</String>
342 <String Id="ProgressTextStartServicesTemplate" Overridable="yes">Қызмет: [1]</String>
343 <String Id="ProgressTextStopServices" Overridable="yes">Қызметтер тоқтатылуда</String>
344 <String Id="ProgressTextStopServicesTemplate" Overridable="yes">Қызмет: [1]</String>
345 <String Id="ProgressTextUnpublishComponents" Overridable="yes">Жарамды құрамдас бөліктер жарияланбауда</String>
346 <String Id="ProgressTextUnpublishComponentsTemplate" Overridable="yes">Құрамдас бөлік коды: [1], жіктегіш: [2]</String>
347 <String Id="ProgressTextUnpublishFeatures" Overridable="yes">Өнім мүмкіндіктері жарияланбауда</String>
348 <String Id="ProgressTextUnpublishFeaturesTemplate" Overridable="yes">Мүмкіндік: [1]</String>
349 <String Id="ProgressTextUnregisterClassInfo" Overridable="yes">Сынып серверлерін тіркеуді болдырмау</String>
350 <String Id="ProgressTextUnregisterClassInfoTemplate" Overridable="yes">Сынып коды: [1]</String>
351 <String Id="ProgressTextUnregisterComPlus" Overridable="yes">COM+ бағдарламалары мен құрамдас бөліктерін тіркеу болдырылмауда</String>
352 <String Id="ProgressTextUnregisterComPlusTemplate" Overridable="yes">AppId: [1]{{, AppType: [2]}}</String>
353 <String Id="ProgressTextUnregisterExtensionInfo" Overridable="yes">Кеңейтім серверлерін тіркеу болдырылмауда</String>
354 <String Id="ProgressTextUnregisterExtensionInfoTemplate" Overridable="yes">Кеңейтім: [1]</String>
355 <String Id="ProgressTextUnregisterFonts" Overridable="yes">Қаріптерді тіркеу болдырылмауда</String>
356 <String Id="ProgressTextUnregisterFontsTemplate" Overridable="yes">Қаріп: [1]</String>
357 <String Id="ProgressTextUnregisterMIMEInfo" Overridable="yes">MIME мәліметтерін тіркеу болдырылмауда</String>
358 <String Id="ProgressTextUnregisterMIMEInfoTemplate" Overridable="yes">MIME мазмұнының түрі: [1], кеңейтім: [2]</String>
359 <String Id="ProgressTextUnregisterProgIdInfo" Overridable="yes">Бағдарлама идентификаторларын тіркеуді болдырмау</String>
360 <String Id="ProgressTextUnregisterProgIdInfoTemplate" Overridable="yes">ProgId: [1]</String>
361 <String Id="ProgressTextUnregisterTypeLibraries" Overridable="yes">Түрлер кітапханаларын тіркеу болдырылмауда</String>
362 <String Id="ProgressTextUnregisterTypeLibrariesTemplate" Overridable="yes">LibID: [1]</String>
363 <String Id="ProgressTextWriteEnvironmentStrings" Overridable="yes">Орта жолдары жаңартылуда</String>
364 <String Id="ProgressTextWriteEnvironmentStringsTemplate" Overridable="yes">Атау: [1], мән: [2], әрекет [3]</String>
365 <String Id="ProgressTextWriteIniValues" Overridable="yes">INI файлдарының мәндері жазылуда</String>
366 <String Id="ProgressTextWriteIniValuesTemplate" Overridable="yes">Файл: [1], бөлім: [2], перне: [3], мән: [4]</String>
367 <String Id="ProgressTextWriteRegistryValues" Overridable="yes">Жүйелік тізбе мәндері жазылуда</String>
368 <String Id="ProgressTextWriteRegistryValuesTemplate" Overridable="yes">Перне: [1], атау: [2], мән: [3]</String>
369 <String Id="ProgressTextAdvertise" Overridable="yes">Бағдарлама туралы мәлімет таратылуда</String>
370 <String Id="ProgressTextGenerateScript" Overridable="yes">Келесі әрекет үшін сценарий әрекеттері жасалуда:</String>
371 <String Id="ProgressTextGenerateScriptTemplate" Overridable="yes">[1]</String>
372 <String Id="ProgressTextInstallSFPCatalogFile" Overridable="yes">Жүйе каталогы орнатылуда</String>
373 <String Id="ProgressTextInstallSFPCatalogFileTemplate" Overridable="yes">Файл: [1], тәуелділіктер: [2]</String>
374 <String Id="ProgressTextMsiPublishAssemblies" Overridable="yes">Жиын туралы мәліметтер жариялануда</String>
375 <String Id="ProgressTextMsiPublishAssembliesTemplate" Overridable="yes">Бағдарлама мәтінмәні:[1], жиын атауы:[2]</String>
376 <String Id="ProgressTextMsiUnpublishAssemblies" Overridable="yes">Жиын туралы мәліметтер жарияланбауда</String>
377 <String Id="ProgressTextMsiUnpublishAssembliesTemplate" Overridable="yes">Бағдарлама мәтінмәні:[1], жиын атауы:[2]</String>
378 <String Id="ProgressTextRollback" Overridable="yes">Әрекет болдырылмауда:</String>
379 <String Id="ProgressTextRollbackTemplate" Overridable="yes">[1]</String>
380 <String Id="ProgressTextRollbackCleanup" Overridable="yes">Файлдардың сақтық көшірмелері жойылуда</String>
381 <String Id="ProgressTextRollbackCleanupTemplate" Overridable="yes">Файл: [1]</String>
382 <String Id="ProgressTextUnmoveFiles" Overridable="yes">Жылжытылған файлдар жойылуда</String>
383 <String Id="ProgressTextUnmoveFilesTemplate" Overridable="yes">Файл: [1], каталог: [9]</String>
384 <String Id="ProgressTextUnpublishProduct" Overridable="yes">Өнім туралы мәліметтер жарияланбауда</String>
385
386 <String Id="Error0" Overridable="yes">{{Түзетілмейтін қате: }}</String>
387 <String Id="Error1" Overridable="yes">{{[1]-қате. }}</String>
388 <String Id="Error2" Overridable="yes">Ескерту [1]. </String>
389 <String Id="Error4" Overridable="yes">Ақпарат [1]. </String>
390 <String Id="Error5" Overridable="yes">Орнатушы осы буманы орнату кезінде күтпеген қате тапты. Бұл бумада ақаулықтың бар екендігін білдіруі мүмкін. Қате коды: [1]. {{Дәлелдер: [2], [3], [4]}}</String>
391 <String Id="Error7" Overridable="yes">{{Дискі толық: }}</String>
392 <String Id="Error8" Overridable="yes">Әрекет [Time]: [1]. [2]</String>
393 <String Id="Error9" Overridable="yes">[ProductName]</String>
394 <String Id="Error10" Overridable="yes">{[2]}{, [3]}{, [4]}</String>
395 <String Id="Error11" Overridable="yes">Хабар түрі: [1], дәлел: [2]</String>
396 <String Id="Error12" Overridable="yes">=== Жұрнал жүргізу басталды: [күн] [уақыт] ===</String>
397 <String Id="Error13" Overridable="yes">=== Жұрнал жүргізу тоқтатылды: [күн] [уақыт] ===</String>
398 <String Id="Error14" Overridable="yes">Әрекеттің басталуы [уақыт]: [1].</String>
399 <String Id="Error15" Overridable="yes">Әрекеттің аяқталуы [уақыт]: [1]. Берілген мән: [2].</String>
400 <String Id="Error16" Overridable="yes">Қалған уақыт: {[1] минут }{[2] секунд}</String>
401 <String Id="Error17" Overridable="yes">Жад жеткіліксіз. Әрекетті қайталамастан бұрын, басқа бағдарламаларды жабыңыз.</String>
402 <String Id="Error18" Overridable="yes">Орнатушы енді жауап бермейді.</String>
403 <String Id="Error19" Overridable="yes">Орнатушы уақытынан бұрын тоқтады.</String>
404 <String Id="Error20" Overridable="yes">Windows жүйесі [ProductName] бағдарламасын теңшегенге дейін күте тұрыңыз</String>
405 <String Id="Error21" Overridable="yes">Қажетті мәліметтер жиналуда...</String>
406 <String Id="Error22" Overridable="yes">Осы бағдарламаның ескі нұсқалары жойылуда...</String>
407 <String Id="Error23" Overridable="yes">Осы бағдарламаның ескі нұсқалары жою үшін дайындалуда...</String>
408 <String Id="Error32" Overridable="yes">{[ProductName] }Орнату сәтті аяқталды.</String>
409 <String Id="Error33" Overridable="yes">{[ProductName] }Орнатылмады.</String>
410 <String Id="Error1101" Overridable="yes">Файлдан оқу кезіндегі қате: [2]. {{ [3]-жүйе қатесі.}} Файл бар екенін және онымен жұмыс жасай алатыныңызды тексеріңіз.</String>
411 <String Id="Error1301" Overridable="yes">'[2]' файлын жасау мүмкін болмады. Осы атпен каталог бар. Орнатуды болдырмаңыз да, басқа орынға орнатып көріңіз.</String>
412 <String Id="Error1302" Overridable="yes">Дискіні салыңыз: [2]</String>
413 <String Id="Error1303" Overridable="yes">Орнатушыда осы каталогқа кіру артықшылықтары жеткіліксіз: [2]. Орнату жалғастырылмайды. Әкімші ретінде кіріңіз немесе жүйе әкімшісімен хабарласыңыз.</String>
414 <String Id="Error1304" Overridable="yes">Файлға жазу кезіндегі қате: [2]. Сол каталогқа кіру мүмкіндігіңіз бар екенін тексеріңіз.</String>
415 <String Id="Error1305" Overridable="yes">[2] файлынан оқу кезіндегі қате. {{ [3]-жүйе қатесі.}} Файл бар екенін және онымен жұмыс жасай алатыныңызды тексеріңіз.</String>
416 <String Id="Error1306" Overridable="yes">'[2]' файлына басқа бағдарламаның жеке иелікпен кіру құқығы бар. Басқа бағдарламалардың барлығын жабыңыз да "Қайталау" түймешігін басыңыз.</String>
417 <String Id="Error1307" Overridable="yes">Бұл файлды орнатуға дискідегі бос орын жеткіліксіз: [2]. Біраз орын босатып, "Қайталау" түймешігін басыңыз немесе шығу үшін "Болдырмау" түймешігін басыңыз.</String>
418 <String Id="Error1308" Overridable="yes">Бастапқы файл табылмады: [2]. Файл бар екенін және онымен жұмыс жасай алатыныңызды тексеріңіз.</String>
419 <String Id="Error1309" Overridable="yes">Файлдан оқу кезіндегі қате: [3]. {{ [2]-жүйе қатесі.}} Файл бар екенін және онымен жұмыс жасай алатыныңызды тексеріңіз.</String>
420 <String Id="Error1310" Overridable="yes">Файлға жазу кезіндегі қате: [3]. {{ [2]-жүйе қатесі.}} Ол каталогқа рұқсатыңыздың бар екендігін тексеріңіз.</String>
421 <String Id="Error1311" Overridable="yes">Бастапқы файл табылмады{{(CAB файлы)}}: [2]. Файл бар екенін және онымен жұмыс жасай алатыныңызды тексеріңіз.</String>
422 <String Id="Error1312" Overridable="yes">'[2]' каталогын жасау мүмкін болмады. Мұндай атты файл бар. Файлдың атын ауыстырыңыз да немесе оны жойыңыз да, "Қайталау" түймешігін немесе шығу үшін "Болдырмау" түймешігін басыңыз.</String>
423 <String Id="Error1313" Overridable="yes">Қазір [2] мәні жоқ. Басқасын таңдаңыз.</String>
424 <String Id="Error1314" Overridable="yes">Көрсетілген '[2]' жолы жоқ.</String>
425 <String Id="Error1315" Overridable="yes">Көрсетілген қалтаға жазу мүмкін емес: [2].</String>
426 <String Id="Error1316" Overridable="yes">Файлдан оқу әрекеті кезінде желі қатесі орын алды: [2]</String>
427 <String Id="Error1317" Overridable="yes">Каталогты жасау әрекеті кезінде қате орын алды: [2]</String>
428 <String Id="Error1318" Overridable="yes">Каталогты жасау әрекеті кезінде желі қатесі орын алды: [2]</String>
429 <String Id="Error1319" Overridable="yes">Бастапқы CAB-файлын ашу әрекеті кезінде желі қатесі орын алды: [2]</String>
430 <String Id="Error1320" Overridable="yes">Көрсетілген жол тым ұзын: [2]</String>
431 <String Id="Error1321" Overridable="yes">Орнатушыда бұл файлды өзгерту үшін жеткілікті басымдылықтар жоқ: [2].</String>
432 <String Id="Error1322" Overridable="yes">'[2]' қалта жолының бөлігі жарамсыз. Ол бос немесе оның ұзындығы жүйеде рұқсат етілгеннен ұзынырақ.</String>
433 <String Id="Error1323" Overridable="yes">'[2]' қалтасының жолында қалта жолдарында жарамды болып табылмайтын сөздер бар.</String>
434 <String Id="Error1324" Overridable="yes">'[2]' қалтасының жолында жарамсыз таңба бар.</String>
435 <String Id="Error1325" Overridable="yes">'[2]' жарамды қысқа файл атауы емес.</String>
436 <String Id="Error1326" Overridable="yes">Файл қауіпсіздігін алу кезіндегі қате: [3] GetLastError: [2]</String>
437 <String Id="Error1327" Overridable="yes">Жарамсыз дискі: [2]</String>
438 <String Id="Error1328" Overridable="yes">[2] файлына жаңартуды қолдану кезіндегі қате. Мүмкін ол басқа жолмен жаңартылған болар, бұл жаңартумен енді өзгертілмейді. Қосымша ақпарат алу үшін жаңартудың сатушысына хабарласыңыз. {{Жүйелік қате: [3]}}</String>
439 <String Id="Error1329" Overridable="yes">[2] CAB файлына сандық қолтаңба қойылмағандықтан қажет файлды орнату мүмкін емес. Бұл CAB файлының бұзылғанын білдіруі мүмкін.</String>
440 <String Id="Error1330" Overridable="yes">Қажет файл орнатылмайды, себебі [2] кабинет файлындағы сандық қолтаңба жарамсыз. Бұл кабинет файлының бұзылғанын көрсетеді.{{ [3] қатесін WinVerifyTrust қайтарды.}}</String>
441 <String Id="Error1331" Overridable="yes">[2] файлы дұрыс көшірілмеді: CRC қатесі.</String>
442 <String Id="Error1332" Overridable="yes">[2] файлы дұрыс жылжытылмады: CRC қатесі.</String>
443 <String Id="Error1333" Overridable="yes">[2] файлын дұрыс жаңарту мүмкін болмады: CRC қатесі.</String>
444 <String Id="Error1334" Overridable="yes">'[2]' файлын орнату мүмкін емес, себебі файл '[3]' CAB-файлынан табылмайды. Бұл желі қатесін немесе CD-ROM ішінен оқу кезіндегі қатені, не болмаса бұл бумада ақаулықтың бар екендігін көрсетеді.</String>
445 <String Id="Error1335" Overridable="yes">Осы орнатым үшін қажет '[2]' CAB-файлы бүлінген және оны пайдалану мүмкін емес. Бұл желі қатесін немесе CD-ROM ішінен оқу кезіндегі қатені, не болмаса бұл бумада ақаулықтың бар екендігін көрсетеді.</String>
446 <String Id="Error1336" Overridable="yes">Осы орнатымды аяқтау үшін қажетті уақытша файлды жасау кезінде қате орын алды.{{ Қалта: [3]. Жүйелік қате коды: [2]}}</String>
447 <String Id="Error1401" Overridable="yes">Перне жасау мүмкін емес: [2]. {{ Жүйелік қате [3].}} Ол кілтке жеткілікті рұқсатыңыздың бар екенін тексеріңіз немесе қолдау көрсету орталығының қызметкеріне хабарласыңыз.</String>
448 <String Id="Error1402" Overridable="yes">Пернені ашу мүмкін болмады: [2]. {{ Жүйелік қате [3].}} Ол кілтке жеткілікті рұқсатыңыздың бар екенін тексеріңіз немесе қолдау көрсету орталығының қызметкеріне хабарласыңыз.</String>
449 <String Id="Error1403" Overridable="yes">[2] мәнін [3] пернесінен жою мүмкін болмады. {{ Жүйелік қате [4].}} Ол кілтке жеткілікті рұқсатыңыздың бар екенін тексеріңіз немесе қолдау көрсету орталығының қызметкеріне хабарласыңыз.</String>
450 <String Id="Error1404" Overridable="yes">[2] пернесі жою мүмкін болмады. {{ Жүйелік қате [3].}} Ол кілтке жеткілікті рұқсатыңыздың бар екенін тексеріңіз немесе қолдау көрсету орталығының қызметкеріне хабарласыңыз.</String>
451 <String Id="Error1405" Overridable="yes">[2] мәнін [3] пернесінен оқу мүмкін болмады. {{ Жүйелік қате [4].}} Ол кілтке жеткілікті рұқсатыңыздың бар екенін тексеріңіз немесе қолдау көрсету орталығының қызметкеріне хабарласыңыз. </String>
452 <String Id="Error1406" Overridable="yes">[3] бөліміне [2] мәнін жазу мүмкін болмады. {{ [4]-жүйелік қате.}} Ол кілтке жеткілікті рұқсатыңыздың бар екенін тексеріңіз немесе қолдау көрсету орталығының қызметкеріне хабарласыңыз.</String>
453 <String Id="Error1407" Overridable="yes">[2] бөлімі үшін мән атауларын алу мүмкін болмады. {{ [3]-жүйелік қате.}} Ол кілтке жеткілікті рұқсатыңыздың бар екенін тексеріңіз немесе қолдау көрсету орталығының қызметкеріне хабарласыңыз.</String>
454 <String Id="Error1408" Overridable="yes">[2] бөлімі үшін ішкі бөлім атауларын алу мүмкін болмады. {{ [3]-жүйелік қате.}} Ол кілтке жеткілікті рұқсатыңыздың бар екенін тексеріңіз немесе қолдау көрсету орталығының қызметкеріне хабарласыңыз.</String>
455 <String Id="Error1409" Overridable="yes">[2] бөлімінің қауіпсіздік туралы мәліметтерін оқу мүмкін болмады. {{ [3]-жүйелік қате.}} Ол кілтке жеткілікті рұқсатыңыздың бар екенін тексеріңіз немесе қолдау көрсету орталығының қызметкеріне хабарласыңыз.</String>
456 <String Id="Error1410" Overridable="yes">Қол жетімді тізбе орнын көбейту мүмкін болмады. Бұл бағдарламаны орнату үшін [2] Кбайт бос тізбе орны қажет.</String>
457 <String Id="Error1500" Overridable="yes">Басқа орнату орындалып жатыр. Бұл орнатуды жалғастырмастан бұрын, соны аяқтауыңыз керек.</String>
458 <String Id="Error1501" Overridable="yes">Қорғалған деректерге кіру кезіндегі қате. Windows орнатушысының дұрыс теңшелгендігін тексеріп, орнатуды қайталаңыз.</String>
459 <String Id="Error1502" Overridable="yes">'[2]' пайдаланушысы '[3]' өнімінің орнатылуын бұдан бұрын бастаған. Пайдаланушыға өнімді пайдалану үшін алдымен сол орнатқышты іске қосуы керек. Ал қазір ағымдағы орнатқыш жұмысы жалғасады.</String>
460 <String Id="Error1503" Overridable="yes">'[2]' пайдаланушысы '[3]' өнімінің орнатылуын бұдан бұрын бастаған. Өнімді пайдалану үшін сол пайдаланушы орнатуды қайта іске қосуы керек.</String>
461 <String Id="Error1601" Overridable="yes">Дискіде бос орын жоқ -- Бөлім: '[2]'; қажет етілетін бос орын: [3] Кбайт; бар бос орын: [4] Кбайт. Орын босатып, қайталаңыз.</String>
462 <String Id="Error1602" Overridable="yes">Шынымен бас тартқыңыз келе ме?</String>
463 <String Id="Error1603" Overridable="yes">[2][3] файлы пайдаланылуда { мына процесс бойынша: Атау: [4], идентификаторы: [5], терезе аты: '[6]'}. Ол қолданбаны жауып, қайта әрекеттеніңіз.</String>
464 <String Id="Error1604" Overridable="yes">Бұрын орнатылған '[2]' өнімі осы өнімнің орнатылуына бөгет болып отыр. Екі өнім бір-бірімен сыйыспайды.</String>
465 <String Id="Error1605" Overridable="yes">Қалпына келтіру мүмкіндігі қосылған орнатуды жалғастыру үшін "[2]" бөліміндегі дискіде жеткілікті бос орын жоқ. [3] Кбайт бос орын талап етіледі, бірақ тек [4] Кбайт бос орын бар. Қалпына келтіру мәліметтерін сақтаусыз орнатуды жалғастыру үшін, "Елемеу" түймешігін, бар бос орынды қайта тексеру үшін, "Қайталау" түймешігін, ал орнатуды тоқтату үшін, "Болдырмау" түймешігін басыңыз.</String>
466 <String Id="Error1606" Overridable="yes">[2] желілік орналасуды ашу мүмкін болмады.</String>
467 <String Id="Error1607" Overridable="yes">Орнату жалғастырылмастан бұрын, келесі бағдарламалар жабылуы керек:</String>
468 <String Id="Error1608" Overridable="yes">Осы өнімді орнату үшін компьютерде алдыңғы орнатылған сәйкес өнімдерді табу мүмкін емес.</String>
469 <String Id="Error1609" Overridable="yes">Қауіпсіздік параметрлерін қолдану кезінде қате орын алды. [2] жарамды пайдаланушы немесе топ емес. Бұл бумада орын алған немесе желідегі домен контроллеріне қосылу проблемасы болуы мүмкін. Желі қосылымын тексеріп, орнатуды аяқтау үшін, "Қайталау" немесе "Болдырмау" түймешігін басыңыз. {{Пайдаланушының қауіпсіздік идентификаторын табу мүмкін емес, [3]-жүйе қатесі}}</String>
470 <String Id="Error1701" Overridable="yes">[2] кілт жарамсыз. Дұрыс кілт енгізілгенін тексеріңіз.</String>
471 <String Id="Error1702" Overridable="yes">[2] өнімін теңшеуді жалғастыру үшін орнатушы жүйеңізді қайта қотаруы тиіс. Қазір қайта іске қосу үшін "Иә" түймешігін немесе кейінірек қолмен қайта icке қосуды жоспарласаңыз, "Жоқ" түймешігін басыңыз.</String>
472 <String Id="Error1703" Overridable="yes">[2] ішіне жасалған теңшелім өзгертулері күшіне енуі үшін, жүйе қайта іске қосылуы тиіс. Қазір қайта іске қосу үшін "Иә" түймешігін немесе кейінірек қолмен қайта icке қосуды жоспарласаңыз, "Жоқ" түймешігін басыңыз.</String>
473 <String Id="Error1704" Overridable="yes">[2] орнатпасы қазір уақытша тоқтатылған. Орнатуды жалғастыру үшін жасалған өзгерістерді қайтару керек. Сол өзгерістер қайтарылсын ба?</String>
474 <String Id="Error1705" Overridable="yes">Бұл өнімнің алдыңғы орнатылуы жасалуда. Орнатуды жалғастыру үшін жасалған өзгерістерді қайтару керек. Сол өзгерістер қайтарылсын ба?</String>
475 <String Id="Error1706" Overridable="yes">[2] өніміне арналған орнатым бумасын табу мүмкін емес. '[3]' орнатым бумасының жарамды көшірмесін пайдаланып, орнатуды қайталаңыз.</String>
476 <String Id="Error1707" Overridable="yes">Орнату сәтті аяқталды.</String>
477 <String Id="Error1708" Overridable="yes">Орнатылмады.</String>
478 <String Id="Error1709" Overridable="yes">Өнім: [2] -- [3]</String>
479 <String Id="Error1710" Overridable="yes">Компьютерді алдыңғы күйіне қалпына келтіруге немесе орнатуды кейінірек жалғастыруға болады. Қалпына келтірілсін бе?</String>
480 <String Id="Error1711" Overridable="yes">Орнату ақпаратын дискіге жазу кезінде қате орын алды. Жеткілікті бос орын бар болғанына көз жеткізіңіз де, "Қайталау" түймешігін немесе орнатуды аяқтау үшін "Болдырмау" түймешігін басыңыз.</String>
481 <String Id="Error1712" Overridable="yes">Компьютерді алдыңғы күйіне қалпына келтіру үшін қажет бір немесе бірнеше файл табылмады. Қалпына келтіру мүмкін емес.</String>
482 <String Id="Error1713" Overridable="yes">[2] өнімі қажетті өнімдерінің біреуін орната алмайды. Техникалық қолдау көрсету тобыңызға хабарласыңыз. {{Жүйелік қате: [3].}}</String>
483 <String Id="Error1714" Overridable="yes">[2] өнімінің алдыңғы нұсқасын жою мүмкін емес. Техникалық қолдау көрсету тобыңызға хабарласыңыз. {{[3] жүйелік қатесі.}}</String>
484 <String Id="Error1715" Overridable="yes">Орнатылған [2]</String>
485 <String Id="Error1716" Overridable="yes">Теңшелген [2]</String>
486 <String Id="Error1717" Overridable="yes">Жойылған [2]</String>
487 <String Id="Error1718" Overridable="yes">[2] файлын сандық қолтаңба саясаты қабылдамады.</String>
488 <String Id="Error1719" Overridable="yes">Windows орнатушысы қызметіне кіру мүмкін болмады. Бұл Windows жүйесі қауіпсіз күйде іске қосылса немесе Windows орнатушысы дұрыс орнатылмаса орын алады. Көмек алу үшін, қолдау көрсету орталығының қызметкеріне хабарласыңыз.</String>
489 <String Id="Error1720" Overridable="yes">Осы Windows орнатушы бумасында ақаулық бар. Орнатуды аяқтау үшін қажет сценарий іске қосылмайды. Қолдау көрсету қызметкерлеріне немесе буманың сатушысына хабарласыңыз. {{[2] таңдамалы әрекетінің сценарий қатесі [3], [4]: [5] [6], [7] бағаны, [8] бағаны}}</String>
490 <String Id="Error1721" Overridable="yes">Осы Windows орнатушы бумасында ақаулық бар. Осы орнатудың аяқталуы үшін қажетті бағдарламаны іске қосу мүмкін болмады. Қолдау көрсету қызметкерлеріне немесе буманың сатушысына хабарласыңыз. {{Әрекет: [2], орналасу: [3], пәрмен: [4] }}</String>
491 <String Id="Error1722" Overridable="yes">Осы Windows орнатушы бумасында ақаулық бар. Ақаулық осы орнатпа бөлігінін күткендегідей орнатылмағандығынан туындады. Қолдау көрсету қызметкерлеріне немесе буманың сатушысына хабарласыңыз. {{[2] әрекеті, орын: [3], пәрмен: [4] }}</String>
492 <String Id="Error1723" Overridable="yes">Осы Windows орнатушы бумасында ақаулық бар. Бұл орнатудың аяқталуы үшін қажет DLL файлы іске қосылмайды. Қолдау көрсету қызметкерлеріне немесе буманың сатушысына хабарласыңыз. {{Әрекет [2], жазба: [3], кітапхана: [4] }}</String>
493 <String Id="Error1724" Overridable="yes">Жою сәтті аяқталды.</String>
494 <String Id="Error1725" Overridable="yes">Жойылмады.</String>
495 <String Id="Error1726" Overridable="yes">Жариялау сәтті аяқталды.</String>
496 <String Id="Error1727" Overridable="yes">Хабарландыру сәтсіз аяқталды.</String>
497 <String Id="Error1728" Overridable="yes">Теңшелім сәтті аяқталды.</String>
498 <String Id="Error1729" Overridable="yes">Теңшелім орындалмады.</String>
499 <String Id="Error1730" Overridable="yes">Бұл бағдарламаны жою үшін, әкімші болуыңыз керек. Осы бағдарламаны жою үшін, әкімші ретінде жүйеге кіруіңізге немесе көмек алу үшін техникалық қолдау көрсету тобына хабарласуыңызға болады.</String>
500 <String Id="Error1731" Overridable="yes">[2] бағдарламасына арналған бастапқы орнату бумасы клиент бумасымен үндестірілмеген. '[3]' орнатым бумасының жарамды көшірмесін пайдаланып, орнатуды қайталаңыз.</String>
501 <String Id="Error1732" Overridable="yes">[2] бағдарламасын орнатуды аяқтау үшін, компьютерді қайта қосу керек. Қазір бұл компьютерге кірген басқа пайдаланушылар бар, ал қайта қосу олардың жұмысының жоғалуына себеп болуы мүмкін. Қазір қайта қосу керек пе?</String>
502 <String Id="Error1801" Overridable="yes">[2] жолы жарамсыз. Жарамды жолды көрсетіңіз.</String>
503 <String Id="Error1802" Overridable="yes">Жад жеткіліксіз. Әрекетті қайталамастан бұрын, басқа бағдарламаларды жабыңыз.</String>
504 <String Id="Error1803" Overridable="yes">[2] дискіенгізгісінде диск жоқ. Дискіні салып, "Қайталау" түймешігін, ал алдыңғы таңдалған бөлімге оралу үшін, "Болдырмау" түймешігін басыңыз.</String>
505 <String Id="Error1804" Overridable="yes">[2] дискіенгізгісінде диск жоқ. Дискіні салып, "Қайталау" түймешігін, ал алдыңғы таңдалған бөлімге оралу үшін, "Болдырмау" түймешігін басыңыз.</String>
506 <String Id="Error1805" Overridable="yes">[2] қалтасы жоқ. Бар қалта жолын енгізіңіз.</String>
507 <String Id="Error1806" Overridable="yes">Бұл қалтаны оқу үшін сізде жеткілікті басымдылықтар жоқ.</String>
508 <String Id="Error1807" Overridable="yes">Орнатуға тағайындалған жарамды қалтаны анықтау мүмкін болмады.</String>
509 <String Id="Error1901" Overridable="yes">Бастапқы орнату дерекқорынан оқу әрекеті кезіндегі қате: [2].</String>
510 <String Id="Error1902" Overridable="yes">Қайта іске қосу әрекеті жоспарлануда: [2] файлы [3] ретінде қайта аталуда. Әрекетті аяқтау үшін қайта іске қосу қажет.</String>
511 <String Id="Error1903" Overridable="yes">Қайта іске қосу әрекеті жоспарлануда: [2] файлы жойылуда. Әрекетті аяқтау үшін қайта іске қосу қажет.</String>
512 <String Id="Error1904" Overridable="yes">[2] модулі тіркелмеді. HRESULT [3]. Қолдау көрсету қызметкерлеріне хабарласыңыз.</String>
513 <String Id="Error1905" Overridable="yes">[2] модулі ажыратылмады. HRESULT [3]. Қолдау көрсету қызметкерлеріне хабарласыңыз.</String>
514 <String Id="Error1906" Overridable="yes">[2] бумасы кэштелмеді. Қате: [3]. Қолдау көрсету қызметкерлеріне хабарласыңыз.</String>
515 <String Id="Error1907" Overridable="yes">[2] қарпін тіркеу мүмкін болмады. Қаріптерді орнатуға жеткілікті рұқсаттардың болуын және жүйе бұл қаріпті қолдайтынын тексеріңіз.</String>
516 <String Id="Error1908" Overridable="yes">[2] қарпін тіркеуді болдырмау мүмкін болмады. Қаріптерді жою үшін жеткілікті рұқсаттарыңыздың бар екендігін тексеріңіз.</String>
517 <String Id="Error1909" Overridable="yes">[2] таңбашасын жасау мүмкін болмады. Тағайындалған қалтаның бар болуын және оны аша алатындығыңызды тексеріңіз.</String>
518 <String Id="Error1910" Overridable="yes">[2] таңбашасын жою мүмкін болмады. Таңбаша файлының бар болуын және оны аша алатындығыңызды тексеріңіз.</String>
519 <String Id="Error1911" Overridable="yes">[2] файлы үшін түр кітапханасын тіркеу мүмкін болмады. Қолдау көрсету қызметкерлеріне хабарласыңыз.</String>
520 <String Id="Error1912" Overridable="yes">[2] файлы үшін түр кітапханасын ажырату мүмкін болмады. Қолдау көрсету қызметкерлеріне хабарласыңыз.</String>
521 <String Id="Error1913" Overridable="yes">[2][3] ini файлын жаңарту мүмкін болмады. Файл бар екенін және онымен жұмыс жасай алатыныңызды тексеріңіз.</String>
522 <String Id="Error1914" Overridable="yes">Қайта қотарғанда [2] файлымен [3] файлын алмастыруды жоспарлау мүмкін болмады. [3] файлына жазу рұқсаттарыңыздың болуын тексеріңіз.</String>
523 <String Id="Error1915" Overridable="yes">ODBC драйверін реттеушіні жою кезіндегі қате, [2] -ODBC қатесі: [3]. Қолдау көрсету қызметкерлеріне хабарласыңыз.</String>
524 <String Id="Error1916" Overridable="yes">ODBC драйверін реттеушіні орнату кезіндегі қате, [2]-ODBC қатесі: [3]. Қолдау көрсету қызметкерлеріне хабарласыңыз.</String>
525 <String Id="Error1917" Overridable="yes">ODBC драйверін жою кезіндегі қате: [4], [2]-ODBC қатесі: [3]. ODBC драйверлерін жою үшін жеткілікті басымдылықтарыңыздың бар екендігін тексеріңіз.</String>
526 <String Id="Error1918" Overridable="yes">ODBC драйверін орнату кезіндегі қате: [4], [2]-ODBC қатесі: [3]. [4] файлының бар болуын және оны аша алатындығыңызды тексеріңіз.</String>
527 <String Id="Error1919" Overridable="yes">ODBC деректер көзін теңшеу кезіндегі қате: [4], [2]-ODBC қатесі: [3]. [4] файлының бар болуын және оны аша алатындығыңызды тексеріңіз.</String>
528 <String Id="Error1920" Overridable="yes">'[2]' ([3]) қызметі басталмады. Жүйелік қызметтерді бастауға жеткілікті құқықтың болуын тексеріңіз.</String>
529 <String Id="Error1921" Overridable="yes">'[2]' ([3]) қызметін тоқтату мүмкін болмады. Жүйелік қызметтерді тоқтатуға жеткілікті құқықтың болуын тексеріңіз.</String>
530 <String Id="Error1922" Overridable="yes">'[2]' ([3]) қызметін жою мүмкін болмады. Жүйелік қызметтерді жоюға жеткілікті құқықтың болуын тексеріңіз.</String>
531 <String Id="Error1923" Overridable="yes">'[2]' ([3]) қызметін орнату мүмкін болмады. Жүйелік қызметтерді орнатуға жеткілікті құқықтың болуын тексеріңіз.</String>
532 <String Id="Error1924" Overridable="yes">Ортаның '[2]' айнымалы мәнін жаңарту мүмкін болмады. Ортаның айнымалы мәндерін өзгертуге жеткілікті құқықтың болуын тексеріңіз.</String>
533 <String Id="Error1925" Overridable="yes">Бұл компьютердің пайдаланушыларының барлығы үшін орнатуды аяқтауға құқықтар жеткіліксіз. Жүйеге әкімші ретінде кіріңіз де, содан кейін бұл орнатуды қайтадан орындап көріңіз.</String>
534 <String Id="Error1926" Overridable="yes">'[3]' файлы үшін файл қауіпсіздігін қою мүмкін болмады. Қате: [2]. Осы файлдың қауіпсіздік рұқсаттарын өзгертуге құқықтардың жеткілікті екенін тексеріңіз.</String>
535 <String Id="Error1927" Overridable="yes">Құрамдас қызметтер (COM+ 1.0) бұл компьютерге орнатылмаған. Сәтті аяқталу үшін бұл орнату құрамдас қызметтерді қажет етеді. Құрамдас қызметтер Windows 2000 жүйесінде бар.</String>
536 <String Id="Error1928" Overridable="yes">COM+ бағдарламасын тіркеу қатесі. Қосымша ақпарат алу үшін қолдау көрсету қызметкерлеріне хабарласыңыз.</String>
537 <String Id="Error1929" Overridable="yes">COM+ бағдарламасын ажырату қатесі. Қосымша ақпарат алу үшін қолдау көрсету қызметкерлеріне хабарласыңыз.</String>
538 <String Id="Error1930" Overridable="yes">'[2]' қызметінің сипаттамасын ([3]) өзгерту мүмкін болмады.</String>
539 <String Id="Error1931" Overridable="yes">Windows орнатушы қызметі [2] жүйелік файлын жаңарта алмайды, өйткені ол Windows жүйесімен қорғалады. Бұл бағдарлама дұрыс жұмыс істеуі үшін амалдық жүйені жаңарту керек болуы мүмкін. {{Бума нұсқасы: [3], амалдық жүйемен қорғалған нұсқа: [4]}}</String>
540 <String Id="Error1932" Overridable="yes">Windows орнатушысы қызметі қорғалған [2] Windows файлын жаңарта алмайды. {{Бума нұсқасы: [3], амалдық жүйемен қорғалған нұсқа: [4], SFP қатесі: [5]}}</String>
541 <String Id="Error1933" Overridable="yes">Windows орнатушы қызметі бір немесе бірнеше қорғалған Windows файлдарын жаңарта алмады. {{SFP Қате: [2]. Қорғалған файлдар тізімі:\r\n[3]}}</String>
542 <String Id="Error1934" Overridable="yes">Пайдаланушы орнатымдары компьютердегі саясат арқылы ажыратылған.</String>
543 <String Id="Error1935" Overridable="yes">'[6]' жиынын орнату кезінде қате орын алды. Қосымша ақпаратты Анықтама және қолдау орталығынан қарай аласыз. HRESULT: [3]. {{жиын интерфейсі: [4], функция: [5], құрамдас: [2]}}</String>
544 <String Id="Error1936" Overridable="yes">'[6]' жиынын орнату кезінде қате орын алды. Жиынның аты күрделі емес немесе оған ең аз кілт ұзындығымен қол қойылмаған. HRESULT: [3]. {{жиын интерфейсі: [4], функция: [5], құрамдас: [2]}}</String>
545 <String Id="Error1937" Overridable="yes">'[6]' жиынын орнату кезінде қате орын алды. Қолтаңба мен каталог расталмады немесе олар жарамсыз. HRESULT: [3]. {{жиын интерфейсі: [4], функция: [5], құрамдас: [2]}}</String>
546 <String Id="Error1938" Overridable="yes">'[6]' жиынын орнату кезінде қате орын алды. Жиынның бір немесе бірнеше модульдері табылмады. HRESULT: [3]. {{жиын интерфейсі: [4], функция: [5], құрамдас: [2]}}</String>
547
548 <String Id="UITextbytes" Overridable="yes">байт</String>
549 <String Id="UITextGB" Overridable="yes">Гбайт</String>
550 <String Id="UITextKB" Overridable="yes">Кбайт</String>
551 <String Id="UITextMB" Overridable="yes">Мбайт</String>
552 <String Id="UITextMenuAbsent" Overridable="yes">Толық мүмкіндік қол жетімді болмайды</String>
553 <String Id="UITextMenuAdvertise" Overridable="yes">Мүмкіндік қажет болғанда орнатылады</String>
554 <String Id="UITextMenuAllCD" Overridable="yes">Ықшам дискіден іске қосылуы үшін толық мүмкіндік орнатылады</String>
555 <String Id="UITextMenuAllLocal" Overridable="yes">Толық мүмкіндік жергілікті қатты дискіде орнатылады</String>
556 <String Id="UITextMenuAllNetwork" Overridable="yes">Толық мүмкіндік желіден іске қосылуы үшін орнатылады</String>
557 <String Id="UITextMenuCD" Overridable="yes">Ықшам дискіден іске қосылуы үшін орнатылады</String>
558 <String Id="UITextMenuLocal" Overridable="yes">Жергілікті қатты дискіде орнатылады</String>
559 <String Id="UITextMenuNetwork" Overridable="yes">Желіден іске қосылуы үшін орнатылады</String>
560 <String Id="UITextNewFolder" Overridable="yes">Қалта|Жаңа қалта</String>
561 <String Id="UITextScriptInProgress" Overridable="yes">Қажетті мәліметтер жиналуда...</String>
562 <String Id="UITextSelAbsentAbsent" Overridable="yes">Бұл мүмкіндік жойылмаған күйі қалады</String>
563 <String Id="UITextSelAbsentAdvertise" Overridable="yes">Бұл мүмкіндік қажет болғанда орнатылуы үшін теңшеледі</String>
564 <String Id="UITextSelAbsentCD" Overridable="yes">Бұл мүмкіндік ықшам дискіден іске қосылуы үшін орнатылады</String>
565 <String Id="UITextSelAbsentLocal" Overridable="yes">Бұл мүмкіндік жергілікті қатты дискіде орнатылады</String>
566 <String Id="UITextSelAbsentNetwork" Overridable="yes">Бұл мүмкіндік желіден іске қосылуы үшін орнатылады</String>
567 <String Id="UITextSelAdvertiseAbsent" Overridable="yes">Бұл мүмкіндік қол жетімді емес болады</String>
568 <String Id="UITextSelAdvertiseAdvertise" Overridable="yes">Қажет болғанда орнатылады</String>
569 <String Id="UITextSelAdvertiseCD" Overridable="yes">Бұл мүмкіндік ықшам дискіден іске қосылу үшін қол жетімді болады</String>
570 <String Id="UITextSelAdvertiseLocal" Overridable="yes">Бұл мүмкіндік жергілікті қатты дискіде орнатылады</String>
571 <String Id="UITextSelAdvertiseNetwork" Overridable="yes">Бұл мүмкіндік желіден іске қосылу үшін қол жетімді болады</String>
572 <String Id="UITextSelCDAbsent" Overridable="yes">Бұл мүмкіндік толығымен жойылады, оны ықшам дискіден іске қосу мүмкін болмайды</String>
573 <String Id="UITextSelCDAdvertise" Overridable="yes">Бұл мүмкіндік қажет болғанда орнатылуға теңшелу үшін, ықшам дискі күйінен іске қосылудан өзгереді</String>
574 <String Id="UITextSelCDCD" Overridable="yes">Бұл мүмкіндік ықшам дискіден іске қосылатын болып қалады</String>
575 <String Id="UITextSelCDLocal" Overridable="yes">Бұл мүмкіндік жергілікті қатты дискіден орнатылу үшін, ықшам дискі күйінен іске қосылудан өзгереді</String>
576 <String Id="UITextSelChildCostNeg" Overridable="yes">Бұл мүмкіндік қатты дискіде [1] орынды босатады.</String>
577 <String Id="UITextSelChildCostPos" Overridable="yes">Бұл мүмкіндік үшін қатты дискіде [1] орын қажет.</String>
578 <String Id="UITextSelCostPending" Overridable="yes">Осы мүмкіндік құны есептелуде...</String>
579 <String Id="UITextSelLocalAbsent" Overridable="yes">Бұл мүмкіндік толығымен жойылады</String>
580 <String Id="UITextSelLocalAdvertise" Overridable="yes">Бұл мүмкіндік жергілікті қатты дискіден жойылады, бірақ қажет болғанда орнатылатын етіп теңшеледі</String>
581 <String Id="UITextSelLocalCD" Overridable="yes">Бұл мүмкіндік жергілікті қатты дискіден жойылады, бірақ әлі де ықшам дискіден іске қосылу үшін қол жетімді болады</String>
582 <String Id="UITextSelLocalLocal" Overridable="yes">Бұл мүмкіндік жергілікті қатты дискіде қалады</String>
583 <String Id="UITextSelLocalNetwork" Overridable="yes">Бұл мүмкіндік жергілікті қатты дискіден жойылады, бірақ желіден іске қосылу үшін әлі де қол жетімді болады.</String>
584 <String Id="UITextSelNetworkAbsent" Overridable="yes">Бұл мүмкіндік толығымен жойылады, оны желіден іске қосу мүмкін болмайды</String>
585 <String Id="UITextSelNetworkAdvertise" Overridable="yes">Бұл мүмкіндік қажет болғанда орнатылуға теңшелу үшін, желі күйінен іске қосылудан өзгереді</String>
586 <String Id="UITextSelNetworkLocal" Overridable="yes">Бұл мүмкіндік жергілікті қатты дискіде орнатылу үшін, желі күйінен іске қосылудан өзгереді</String>
587 <String Id="UITextSelNetworkNetwork" Overridable="yes">Бұл мүмкіндік желіден іске қосылатын болып қалады</String>
588 <String Id="UITextSelParentCostNegNeg" Overridable="yes">Бұл мүмкіндік қатты дискіде [1] орынды босатады. Онда [2]/[3] таңдалған ішкі мүмкіндіктер бар. Ішкі мүмкіндіктер қатты дискіде [4] орынды босатады.</String>
589 <String Id="UITextSelParentCostNegPos" Overridable="yes">Бұл мүмкіндік қатты дискіде [1] орынды босатады. Онда [2]/[3] таңдалған ішкі мүмкіндіктер бар. Ішкі мүмкіндіктер үшін қатты дискіде [4] орын қажет.</String>
590 <String Id="UITextSelParentCostPosNeg" Overridable="yes">Бұл мүмкіндік үшін қатты дискіде [1] орын қажет. Онда [2]/[3] таңдалған ішкі мүмкіндіктер бар. Ішкі мүмкіндіктер қатты дискіде [4] орынды босатады.</String>
591 <String Id="UITextSelParentCostPosPos" Overridable="yes">Бұл мүмкіндік үшін қатты дискіде [1] орын қажет. Онда [2]/[3] таңдалған ішкі мүмкіндіктер бар. Ішкі мүмкіндіктер үшін қатты дискіде [4] орын қажет.</String>
592 <String Id="UITextTimeRemaining" Overridable="yes">Қалған уақыт: {[1] минут }{[2] секунд}</String>
593 <String Id="UITextVolumeCostAvailable" Overridable="yes">Бар</String>
594 <String Id="UITextVolumeCostDifference" Overridable="yes">Айырмашылық</String>
595 <String Id="UITextVolumeCostRequired" Overridable="yes">Талап етілген</String>
596 <String Id="UITextVolumeCostSize" Overridable="yes">Дискі өлшемі</String>
597 <String Id="UITextVolumeCostVolume" Overridable="yes">Көлем</String>
598</WixLocalization>
diff --git a/src/ext/UI/wixlib/WixUI_ko-KR.wxl b/src/ext/UI/wixlib/WixUI_ko-KR.wxl
new file mode 100644
index 00000000..c27a7516
--- /dev/null
+++ b/src/ext/UI/wixlib/WixUI_ko-KR.wxl
@@ -0,0 +1,602 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3
4
5<WixLocalization Culture="ko-kr" Codepage="949" xmlns="http://wixtoolset.org/schemas/v4/wxl">
6 <String Id="WixUIBack" Overridable="yes">뒤로(&amp;B)</String>
7 <String Id="WixUINext" Overridable="yes">다음(&amp;N)</String>
8 <String Id="WixUICancel" Overridable="yes">취소</String>
9 <String Id="WixUIFinish" Overridable="yes">마침(&amp;F)</String>
10 <String Id="WixUIRetry" Overridable="yes">다시 시도(&amp;R)</String>
11 <String Id="WixUIIgnore" Overridable="yes">무시(&amp;I)</String>
12 <String Id="WixUIYes" Overridable="yes">예(&amp;Y)</String>
13 <String Id="WixUINo" Overridable="yes">아니요(&amp;N)</String>
14 <String Id="WixUIOK" Overridable="yes">확인</String>
15 <String Id="WixUIPrint" Overridable="yes">인쇄(&amp;P)</String>
16
17 <String Id="AdvancedWelcomeEulaDlg_Title" Overridable="yes">[ProductName] 설치</String>
18 <String Id="AdvancedWelcomeEulaDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
19 <String Id="AdvancedWelcomeEulaDlgTitle" Overridable="yes">{\WixUI_Font_Title}[ProductName] 사용 조건을 읽어 주십시오.</String>
20 <String Id="AdvancedWelcomeEulaDlgLicenseAcceptedCheckBox" Overridable="yes">동의함(&amp;A)</String>
21 <String Id="AdvancedWelcomeEulaDlgDescriptionPerMachine" Overridable="yes">모든 사용자에 대해 기본 옵션을 사용하여 제품을 설치하려면 "설치"를 클릭하십시오. 설치 옵션을 변경하려면 "고급"을 클릭하십시오.</String>
22 <String Id="AdvancedWelcomeEulaDlgDescriptionPerUser" Overridable="yes">사용자에 대해서만 기본 옵션을 사용하여 제품을 설치하려면 "설치"를 클릭하십시오. 설치 옵션을 변경하려면 "고급"을 클릭하십시오.</String>
23 <String Id="AdvancedWelcomeEulaDlgInstall" Overridable="yes">설치(&amp;I)</String>
24 <String Id="AdvancedWelcomeEulaDlgAdvanced" Overridable="yes">고급(&amp;D)</String>
25 <String Id="Advanced_Font_Normal_Size" Overridable="yes">8</String>
26 <String Id="Advanced_Font_Bigger_Size" Overridable="yes">12</String>
27 <String Id="Advanced_Font_Title_Size" Overridable="yes">9</String>
28 <String Id="Advanced_Font_Emphasized_Size" Overridable="yes">8</String>
29 <String Id="Advanced_Font_FaceName" Overridable="yes">돋움</String>
30
31 <String Id="BrowseDlg_Title" Overridable="yes">[ProductName] 설치</String>
32 <String Id="BrowseDlgComboLabel" Overridable="yes">찾는 위치(&amp;L):</String>
33 <String Id="BrowseDlgWixUI_Bmp_Up" Overridable="yes">WixUI_Bmp_Up</String>
34 <String Id="BrowseDlgWixUI_Bmp_UpTooltip" Overridable="yes">한 수준 위로</String>
35 <String Id="BrowseDlgNewFolder" Overridable="yes">WixUI_Bmp_New</String>
36 <String Id="BrowseDlgNewFolderTooltip" Overridable="yes">새 폴더 만들기</String>
37 <String Id="BrowseDlgPathLabel" Overridable="yes">폴더 이름(&amp;F):</String>
38 <String Id="BrowseDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
39 <String Id="BrowseDlgDescription" Overridable="yes">대상 폴더 찾아보기</String>
40 <String Id="BrowseDlgTitle" Overridable="yes">{\WixUI_Font_Title}대상 폴더 변경</String>
41
42 <String Id="CancelDlg_Title" Overridable="yes">[ProductName] 설치</String>
43 <String Id="CancelDlgText" Overridable="yes">[ProductName] 설치를 취소하시겠습니까?</String>
44 <String Id="CancelDlgIcon" Overridable="yes">WixUI_Ico_Info</String>
45 <String Id="CancelDlgIconTooltip" Overridable="yes">정보 아이콘</String>
46
47 <String Id="CustomizeDlg_Title" Overridable="yes">[ProductName] 설치</String>
48 <String Id="CustomizeDlgTree" Overridable="yes">선택 항목 트리</String>
49 <String Id="CustomizeDlgBrowse" Overridable="yes">찾아보기(&amp;R)...</String>
50 <String Id="CustomizeDlgReset" Overridable="yes">다시 설정(&amp;S)</String>
51 <String Id="CustomizeDlgDiskCost" Overridable="yes">디스크 사용량(&amp;U)</String>
52 <String Id="CustomizeDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
53 <String Id="CustomizeDlgText" Overridable="yes">기능 설치 방법을 변경하려면 아래 트리에 있는 아이콘을 클릭하십시오.</String>
54 <String Id="CustomizeDlgDescription" Overridable="yes">원하는 기능 설치 방법을 선택하십시오.</String>
55 <String Id="CustomizeDlgTitle" Overridable="yes">{\WixUI_Font_Title}사용자 지정 설치</String>
56 <String Id="CustomizeDlgItemDescription" Overridable="yes">CustomizeDlgItemDescription-CustomizeDlgItemDescription</String>
57 <String Id="CustomizeDlgItemSize" Overridable="yes">CustomizeDlgItemSize-CustomizeDlgItemSize</String>
58 <String Id="CustomizeDlgLocation" Overridable="yes">CustomizeDlgLocation-CustomizeDlgLocation</String>
59 <String Id="CustomizeDlgLocationLabel" Overridable="yes">위치:</String>
60
61 <String Id="DiskCostDlg_Title" Overridable="yes">[ProductName] 설치</String>
62 <String Id="DiskCostDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
63 <String Id="DiskCostDlgText" Overridable="yes">선택한 볼륨의 디스크 공간이 부족하여 선택한 기능을 설치할 수 없습니다. 선택한 볼륨에서 일부 파일을 제거하거나, 선택한 기능 중 일부를 취소하거나, 다른 대상 드라이브를 선택하십시오.</String>
64 <String Id="DiskCostDlgDescription" Overridable="yes">선택한 기능을 설치하는 데 필요한 디스크 공간입니다.</String>
65 <String Id="DiskCostDlgTitle" Overridable="yes">{\WixUI_Font_Title}필요한 디스크 공간</String>
66 <String Id="DiskCostDlgVolumeList" Overridable="yes">{120}{70}{70}{70}{70}</String>
67
68 <String Id="ErrorDlg_Title" Overridable="yes">[ProductName] 설치</String>
69 <String Id="ErrorDlgErrorText" Overridable="yes">정보 텍스트</String>
70 <String Id="ErrorDlgErrorIcon" Overridable="yes">WixUI_Ico_Info</String>
71 <String Id="ErrorDlgErrorIconTooltip" Overridable="yes">정보 아이콘</String>
72
73 <String Id="ExitDialog_Title" Overridable="yes">[ProductName] 설치</String>
74 <String Id="ExitDialogBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
75 <String Id="ExitDialogDescription" Overridable="yes">설치 마법사를 끝내려면 "마침" 단추를 클릭하십시오.</String>
76 <String Id="ExitDialogTitle" Overridable="yes">{\WixUI_Font_Bigger}[ProductName] 설치 마법사를 완료했습니다.</String>
77
78 <String Id="FatalError_Title" Overridable="yes">[ProductName] 설치</String>
79 <String Id="FatalErrorBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
80 <String Id="FatalErrorTitle" Overridable="yes">{\WixUI_Font_Bigger}[ProductName] 설치 마법사가 중간에 중단되었습니다.</String>
81 <String Id="FatalErrorDescription1" Overridable="yes">오류가 발생하여 [ProductName] 설치 마법사가 중간에 중단되었습니다. 시스템이 수정되지 않았습니다. 나중에 이 프로그램을 설치하려면 설치 마법사를 다시 실행하십시오.</String>
82 <String Id="FatalErrorDescription2" Overridable="yes">설치 마법사를 끝내려면 "마침" 단추를 클릭하십시오.</String>
83
84 <String Id="FeaturesDlg_Title" Overridable="yes">[ProductName] 설치</String>
85 <String Id="FeaturesDlgTree" Overridable="yes">제품 기능</String>
86 <String Id="FeaturesDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
87 <String Id="FeaturesDlgDescription" Overridable="yes">원하는 기능 설치 방법을 선택하십시오.</String>
88 <String Id="FeaturesDlgTitle" Overridable="yes">{\WixUI_Font_Title}제품 기능</String>
89 <String Id="FeaturesDlgItemDescription" Overridable="yes">FeaturesDlgItemDescription</String>
90 <String Id="FeaturesDlgItemSize" Overridable="yes">FeaturesDlgItemSize</String>
91 <String Id="FeaturesDlgInstall" Overridable="yes">설치(&amp;I)</String>
92 <String Id="FeaturesDlgChange" Overridable="yes">변경(&amp;C)</String>
93
94 <String Id="FilesInUse_Title" Overridable="yes">[ProductName] 설치</String>
95 <String Id="FilesInUseExit" Overridable="yes">끝내기(&amp;X)</String>
96 <String Id="FilesInUseBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
97 <String Id="FilesInUseText" Overridable="yes">이 설치를 통해 업데이트해야 하는 파일을 다음 응용 프로그램에서 사용하고 있습니다. 해당 응용 프로그램을 닫은 후 "다시 시도(&amp;R)"를 클릭하여 설치를 계속하거나 "끝내기"를 클릭하여 끝내십시오.</String>
98 <String Id="FilesInUseDescription" Overridable="yes">업데이트해야 할 일부 파일을 현재 사용하고 있습니다.</String>
99 <String Id="FilesInUseTitle" Overridable="yes">{\WixUI_Font_Title}사용 중인 파일</String>
100
101 <String Id="InstallDirDlg_Title" Overridable="yes">[ProductName] 설치</String>
102 <String Id="InstallDirDlgChange" Overridable="yes">변경(&amp;C)...</String>
103 <String Id="InstallDirDlgTitle" Overridable="yes">{\WixUI_Font_Title}대상 폴더</String>
104 <String Id="InstallDirDlgDescription" Overridable="yes">기본 폴더에 설치하려면 "다음"을 클릭하고 다른 폴더에 설치하려면 "변경"을 클릭하십시오.</String>
105 <String Id="InstallDirDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
106 <String Id="InstallDirDlgFolderLabel" Overridable="yes">다음 폴더에 [ProductName] 설치:</String>
107
108 <String Id="InstallScopeDlg_Title" Overridable="yes">[ProductName] 설치</String>
109 <String Id="InstallScopeDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
110 <String Id="InstallScopeDlgDescription" Overridable="yes">설치 범위 및 폴더 선택</String>
111 <String Id="InstallScopeDlgTitle" Overridable="yes">{\WixUI_Font_Title}설치 범위</String>
112 <String Id="InstallScopeDlgPerUser" Overridable="yes">{\WixUI_Font_Emphasized}사용자([LogonUser])에 대해서만(&amp;J)</String>
113 <String Id="InstallScopeDlgPerUserDescription" Overridable="yes">[ProductName]은(는) 사용자 단위 폴더에 설치되며 사용자 계정에 대해서만 사용 가능하게 됩니다. 이 설치에는 로컬 관리자 권한이 없어도 됩니다.</String>
114 <String Id="InstallScopeDlgNoPerUserDescription" Overridable="yes">[ProductName]은(는) 사용자 단위 설치를 지원하지 않습니다.</String>
115 <String Id="InstallScopeDlgPerMachine" Overridable="yes">{\WixUI_Font_Emphasized}이 컴퓨터의 모든 사용자에 대해 설치(&amp;M)</String>
116 <String Id="InstallScopeDlgPerMachineDescription" Overridable="yes">[ProductName]은(는) 기본적으로 컴퓨터 단위 폴더에 설치되며 모든 사용자에 대해 사용 가능하게 됩니다. 기본 설치 폴더는 변경할 수 있습니다. 이 설치에는 로컬 관리자 권한이 있어야 합니다.</String>
117 <String Id="InstallScopeDlgFolderLabel" Overridable="yes">설치 폴더(&amp;F):</String>
118 <String Id="InstallScopeDlgChange" Overridable="yes">변경(&amp;C)...</String>
119
120 <String Id="InvalidDirDlg_Title" Overridable="yes">[ProductName] 설치</String>
121 <String Id="InvalidDirDlgText" Overridable="yes">설치 디렉터리는 로컬 하드 드라이브에 있어야 합니다.</String>
122 <String Id="InvalidDirDlgIcon" Overridable="yes">WixUI_Ico_Info</String>
123 <String Id="InvalidDirDlgIconTooltip" Overridable="yes">정보 아이콘</String>
124
125 <String Id="LicenseAgreementDlg_Title" Overridable="yes">[ProductName] 설치</String>
126 <String Id="LicenseAgreementDlgLicenseAcceptedCheckBox" Overridable="yes">동의함(&amp;A)</String>
127 <String Id="LicenseAgreementDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
128 <String Id="LicenseAgreementDlgDescription" Overridable="yes">다음 사용 조건을 자세히 읽어 주십시오.</String>
129 <String Id="LicenseAgreementDlgTitle" Overridable="yes">{\WixUI_Font_Title}최종 사용자 사용권 계약</String>
130
131 <String Id="MaintenanceTypeDlg_Title" Overridable="yes">[ProductName] 설치</String>
132 <String Id="MaintenanceTypeDlgChangeButton" Overridable="yes">변경(&amp;C)</String>
133 <String Id="MaintenanceTypeDlgChangeButtonTooltip" Overridable="yes">설치 변경</String>
134 <String Id="MaintenanceTypeDlgRepairButton" Overridable="yes">복구(&amp;P)</String>
135 <String Id="MaintenanceTypeDlgRepairButtonTooltip" Overridable="yes">설치 복구</String>
136 <String Id="MaintenanceTypeDlgRemoveButton" Overridable="yes">제거(&amp;R)</String>
137 <String Id="MaintenanceTypeDlgRemoveButtonTooltip" Overridable="yes">설치 제거</String>
138 <String Id="MaintenanceTypeDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
139 <String Id="MaintenanceTypeDlgDescription" Overridable="yes">수행할 작업을 선택하십시오.</String>
140 <String Id="MaintenanceTypeDlgTitle" Overridable="yes">{\WixUI_Font_Title}설치 변경, 복구 또는 제거</String>
141 <String Id="MaintenanceTypeDlgChangeText" Overridable="yes">기능 설치 방법을 변경할 수 있습니다.</String>
142 <String Id="MaintenanceTypeDlgChangeDisabledText" Overridable="yes">[ProductName]에는 개별적으로 선택할 수 있는 기능이 없습니다.</String>
143 <String Id="MaintenanceTypeDlgRemoveText" Overridable="yes">[ProductName]을(를) 컴퓨터에서 제거합니다.</String>
144 <String Id="MaintenanceTypeDlgRemoveDisabledText" Overridable="yes">[ProductName]을(를) 제거할 수 없습니다.</String>
145 <String Id="MaintenanceTypeDlgRepairText" Overridable="yes">손실되거나 손상된 파일, 바로 가기 및 레지스트리 항목을 수정하여 가장 최근의 설치에서 발생한 오류를 복구합니다.</String>
146 <String Id="MaintenanceTypeDlgRepairDisabledText" Overridable="yes">[ProductName]을(를) 복구할 수 없습니다.</String>
147
148 <String Id="MaintenanceWelcomeDlg_Title" Overridable="yes">[ProductName] 설치</String>
149 <String Id="MaintenanceWelcomeDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
150 <String Id="MaintenanceWelcomeDlgDescription" Overridable="yes">설치 마법사로 [ProductName] 기능 설치 방법을 변경하거나 제거할 수 있습니다. 계속하려면 [\[]다음[\]]을 클릭하고 설치 마법사를 끝내려면 [\[]취소[\]]를 클릭하십시오.</String>
151 <String Id="MaintenanceWelcomeDlgTitle" Overridable="yes">{\WixUI_Font_Bigger}[ProductName] 설치 마법사 시작</String>
152
153 <String Id="MsiRMFilesInUse_Title" Overridable="yes">[ProductName] 설치</String>
154 <String Id="MsiRMFilesInUseBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
155 <String Id="MsiRMFilesInUseText" Overridable="yes">다음 응용 프로그램에서 이 설치 프로그램이 업데이트해야 하는 파일을 사용하고 있습니다. 설치 마법사를 통해 해당 응용 프로그램을 닫은 후 다시 시작하거나 나중에 컴퓨터를 다시 부팅할 수 있습니다.</String>
156 <String Id="MsiRMFilesInUseDescription" Overridable="yes">업데이트해야 할 일부 파일을 현재 사용하고 있습니다.</String>
157 <String Id="MsiRMFilesInUseTitle" Overridable="yes">{\WixUI_Font_Title}사용 중인 파일</String>
158 <String Id="MsiRMFilesInUseUseRM" Overridable="yes">응용 프로그램을 닫고 다시 시작합니다(&amp;C).</String>
159 <String Id="MsiRMFilesInUseDontUseRM" Overridable="yes">응용 프로그램을 닫지 않습니다(&amp;D). 나중에 다시 부팅해야 합니다.</String>
160
161 <String Id="OutOfDiskDlg_Title" Overridable="yes">[ProductName] 설치</String>
162 <String Id="OutOfDiskDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
163 <String Id="OutOfDiskDlgText" Overridable="yes">선택한 볼륨의 디스크 공간이 부족하여 현재 선택한 기능을 설치할 수 없습니다. 선택한 볼륨에서 일부 파일을 제거하거나, 선택한 기능 중 일부를 취소하거나, 다른 대상 드라이브를 선택하십시오.</String>
164 <String Id="OutOfDiskDlgDescription" Overridable="yes">설치에 필요한 디스크 공간이 사용 가능한 디스크 공간을 초과합니다.</String>
165 <String Id="OutOfDiskDlgTitle" Overridable="yes">{\WixUI_Font_Title}디스크 공간 부족</String>
166 <String Id="OutOfDiskDlgVolumeList" Overridable="yes">{120}{70}{70}{70}{70}</String>
167
168 <String Id="OutOfRbDiskDlg_Title" Overridable="yes">[ProductName] 설치</String>
169 <String Id="OutOfRbDiskDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
170 <String Id="OutOfRbDiskDlgText" Overridable="yes">선택한 볼륨의 디스크 공간이 부족하여 현재 선택한 기능을 설치할 수 없습니다. 선택한 볼륨에서 일부 파일을 제거하거나, 선택한 기능 중 일부를 취소하거나, 다른 대상 드라이브를 선택하십시오.</String>
171 <String Id="OutOfRbDiskDlgDescription" Overridable="yes">설치에 필요한 디스크 공간이 사용 가능한 디스크 공간을 초과합니다.</String>
172 <String Id="OutOfRbDiskDlgTitle" Overridable="yes">{\WixUI_Font_Title}디스크 공간 부족</String>
173 <String Id="OutOfRbDiskDlgVolumeList" Overridable="yes">{120}{70}{70}{70}{70}</String>
174 <String Id="OutOfRbDiskDlgText2" Overridable="yes">또는 설치 프로그램의 롤백 기능을 사용하지 않도록 선택할 수 있습니다. 이렇게 하면 설치가 중단될 경우 설치 관리자가 컴퓨터의 원래 상태를 복원할 수 없게 됩니다. 이러한 위험에도 불구하고 롤백 기능을 사용하지 않도록 하려면 "예"를 클릭하십시오.</String>
175
176 <String Id="PrepareDlg_Title" Overridable="yes">[ProductName] 설치</String>
177 <String Id="PrepareDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
178 <String Id="PrepareDlgDescription" Overridable="yes">설치 마법사가 설치 안내를 준비하는 동안 잠시 기다려 주십시오.</String>
179 <String Id="PrepareDlgTitle" Overridable="yes">{\WixUI_Font_Bigger}[ProductName] 설치 마법사 시작</String>
180
181 <String Id="ProgressDlg_Title" Overridable="yes">[ProductName] 설치</String>
182 <String Id="ProgressDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
183 <String Id="ProgressDlgTextInstalling" Overridable="yes">설치 마법사가 [ProductName]을(를) 설치하는 동안 잠시 기다려 주십시오.</String>
184 <String Id="ProgressDlgTitleInstalling" Overridable="yes">{\WixUI_Font_Title}[ProductName] 설치 중</String>
185 <String Id="ProgressDlgTextChanging" Overridable="yes">설치 마법사가 [ProductName]을(를) 변경하는 동안 잠시 기다려 주십시오.</String>
186 <String Id="ProgressDlgTitleChanging" Overridable="yes">{\WixUI_Font_Title}[ProductName] 변경 중</String>
187 <String Id="ProgressDlgTextRepairing" Overridable="yes">설치 마법사가 [ProductName]을(를) 복구하는 동안 잠시 기다려 주십시오.</String>
188 <String Id="ProgressDlgTitleRepairing" Overridable="yes">{\WixUI_Font_Title}[ProductName] 복구 중</String>
189 <String Id="ProgressDlgTextRemoving" Overridable="yes">설치 마법사가 [ProductName]을(를) 제거하는 동안 잠시 기다려 주십시오.</String>
190 <String Id="ProgressDlgTitleRemoving" Overridable="yes">{\WixUI_Font_Title}[ProductName] 제거 중</String>
191 <String Id="ProgressDlgTextUpdating" Overridable="yes">설치 마법사에서 [ProductName]을(를) 업데이트하는 동안 잠시 기다려 주십시오.</String>
192 <String Id="ProgressDlgTitleUpdating" Overridable="yes">{\WixUI_Font_Title}[ProductName] 업데이트하는 중</String>
193 <String Id="ProgressDlgProgressBar" Overridable="yes">완료</String>
194 <String Id="ProgressDlgStatusLabel" Overridable="yes">상태:</String>
195
196 <String Id="ResumeDlg_Title" Overridable="yes">[ProductName] 설치</String>
197 <String Id="ResumeDlgInstall" Overridable="yes">설치(&amp;I)</String>
198 <String Id="ResumeDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
199 <String Id="ResumeDlgDescription" Overridable="yes">[ProductName] 설치를 완료합니다. 계속하려면 "설치"를 클릭하고 설치 마법사를 끝내려면 "취소"를 클릭하십시오.</String>
200 <String Id="ResumeDlgTitle" Overridable="yes">{\WixUI_Font_Bigger}[ProductName] 설치 마법사를 계속하는 중</String>
201
202 <String Id="SetupTypeDlg_Title" Overridable="yes">[ProductName] 설치</String>
203 <String Id="SetupTypeDlgTypicalButton" Overridable="yes">표준 설치(&amp;T)</String>
204 <String Id="SetupTypeDlgTypicalButtonTooltip" Overridable="yes">표준 설치</String>
205 <String Id="SetupTypeDlgCustomButton" Overridable="yes">사용자 지정 설치(&amp;U)</String>
206 <String Id="SetupTypeDlgCustomButtonTooltip" Overridable="yes">사용자 지정 설치</String>
207 <String Id="SetupTypeDlgCompleteButton" Overridable="yes">전체 설치(&amp;O)</String>
208 <String Id="SetupTypeDlgCompleteButtonTooltip" Overridable="yes">전체 설치</String>
209 <String Id="SetupTypeDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
210 <String Id="SetupTypeDlgTitle" Overridable="yes">{\WixUI_Font_Title}설치 유형 선택</String>
211 <String Id="SetupTypeDlgDescription" Overridable="yes">사용자의 요구 사항에 가장 적합한 설치 유형을 선택하십시오.</String>
212 <String Id="SetupTypeDlgTypicalText" Overridable="yes">가장 일반적인 프로그램 기능을 설치합니다. 대부분의 사용자에게 권장합니다.</String>
213 <String Id="SetupTypeDlgCustomText" Overridable="yes">설치할 프로그램 기능과 위치를 선택할 수 있습니다. 고급 사용자에게 권장합니다.</String>
214 <String Id="SetupTypeDlgCompleteText" Overridable="yes">모든 프로그램 기능을 설치합니다. 가장 많은 디스크 공간이 필요합니다.</String>
215
216 <String Id="UserExit_Title" Overridable="yes">[ProductName] 설치</String>
217 <String Id="UserExitBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
218 <String Id="UserExitTitle" Overridable="yes">{\WixUI_Font_Bigger}[ProductName] 설치 마법사 중단됨</String>
219 <String Id="UserExitDescription1" Overridable="yes">[ProductName] 설치가 중단되었습니다. 시스템이 수정되지 않았습니다. 나중에 이 프로그램을 설치하려면 설치 프로그램을 다시 실행하십시오.</String>
220 <String Id="UserExitDescription2" Overridable="yes">설치 마법사를 끝내려면
221"마침" 단추를 클릭하십시오.</String>
222
223 <String Id="VerifyReadyDlg_Title" Overridable="yes">[ProductName] 설치</String>
224 <String Id="VerifyReadyDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
225 <String Id="VerifyReadyDlgInstall" Overridable="yes">설치(&amp;I)</String>
226 <String Id="VerifyReadyDlgInstallText" Overridable="yes">설치를 시작하려면 "설치"를 클릭하십시오. 설치 설정을 검토하거나 변경하려면
227"뒤로"를 클릭하십시오. 마법사를 끝내려면 "취소"를 클릭하십시오.</String>
228 <String Id="VerifyReadyDlgInstallTitle" Overridable="yes">{\WixUI_Font_Title}[ProductName] 설치 준비 완료</String>
229 <String Id="VerifyReadyDlgChange" Overridable="yes">변경(&amp;C)</String>
230 <String Id="VerifyReadyDlgChangeText" Overridable="yes">설치를 시작하려면 "변경"을 클릭하십시오. 설치 설정을 검토하거나 변경하려면
231"뒤로"를 클릭하십시오. 마법사를 끝내려면 "취소"를 클릭하십시오.</String>
232 <String Id="VerifyReadyDlgChangeTitle" Overridable="yes">{\WixUI_Font_Title}[ProductName] 변경 준비 완료</String>
233 <String Id="VerifyReadyDlgRepair" Overridable="yes">복구(&amp;P)</String>
234 <String Id="VerifyReadyDlgRepairText" Overridable="yes">[ProductName] 설치를 복구하려면 "복구"를 클릭하십시오. 설치 설정을 검토하거나 변경하려면 "뒤로"를 클릭하십시오. 마법사를 끝내려면 "취소"를 클릭하십시오.</String>
235 <String Id="VerifyReadyDlgRepairTitle" Overridable="yes">{\WixUI_Font_Title}[ProductName] 복구 준비 완료</String>
236 <String Id="VerifyReadyDlgRemove" Overridable="yes">제거(&amp;R)</String>
237 <String Id="VerifyReadyDlgRemoveText" Overridable="yes">[ProductName]을(를) 제거하려면 "제거"를 클릭하십시오. 설치 설정을 검토하거나 변경하려면
238"뒤로"를 클릭하십시오. 마법사를 끝내려면 "취소"를 클릭하십시오.</String>
239 <String Id="VerifyReadyDlgRemoveTitle" Overridable="yes">{\WixUI_Font_Title}[ProductName] 제거 준비 완료</String>
240 <String Id="VerifyReadyDlgUpdate" Overridable="yes">업데이트(&amp;U)</String>
241 <String Id="VerifyReadyDlgUpdateText" Overridable="yes">컴퓨터에서 [ProductName]을(를) 업데이트하려면 [\[]업데이트[\]]를 클릭하십시오. 설치 설정을 검토하거나 변경하려면 [\[]뒤로[\]]를 클릭하십시오. 마법사를 끝내려면 [\[]취소[\]]를 클릭하십시오.</String>
242 <String Id="VerifyReadyDlgUpdateTitle" Overridable="yes">{\WixUI_Font_Title}[ProductName] 업데이트 준비 완료</String>
243
244 <String Id="WaitForCostingDlg_Title" Overridable="yes">[ProductName] 설치</String>
245 <String Id="WaitForCostingDlgReturn" Overridable="yes">돌아가기(&amp;R)</String>
246 <String Id="WaitForCostingDlgText" Overridable="yes">필요한 디스크 공간을 확인하는 동안 잠시 기다려 주십시오.</String>
247 <String Id="WaitForCostingDlgIcon" Overridable="yes">WixUI_Ico_Exclam</String>
248 <String Id="WaitForCostingDlgIconTooltip" Overridable="yes">경고 아이콘</String>
249
250 <String Id="WelcomeDlg_Title" Overridable="yes">[ProductName] 설치</String>
251 <String Id="WelcomeDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
252 <String Id="WelcomeDlgDescription" Overridable="yes">컴퓨터에 [ProductName]을(를) 설치합니다. 계속하려면 "다음"을 클릭하고 설치 마법사를 끝내려면 "취소"를 클릭하십시오.</String>
253 <String Id="WelcomeUpdateDlgDescriptionUpdate" Overridable="yes">설치 마법사에서 컴퓨터에 설치되어 있는 [ProductName]을(를) 업데이트합니다. 계속하려면 [\[]다음[\]]을 클릭하고 설치 마법사를 끝내려면 [\[]취소[\]]를 클릭하십시오.</String>
254 <String Id="WelcomeDlgTitle" Overridable="yes">{\WixUI_Font_Bigger}[ProductName] 설치 마법사 시작</String>
255
256 <String Id="WelcomeEulaDlg_Title" Overridable="yes">[ProductName] 설치</String>
257 <String Id="WelcomeEulaDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
258 <String Id="WelcomeEulaDlgLicenseAcceptedCheckBox" Overridable="yes">동의함(&amp;A)</String>
259 <String Id="WelcomeEulaDlgInstall" Overridable="yes">설치(&amp;I)</String>
260 <String Id="WelcomeEulaDlgUpdate" Overridable="yes">업데이트(&amp;U)</String>
261 <String Id="WelcomeEulaDlgTitle" Overridable="yes">{\WixUI_Font_Title}[ProductName] 사용권 계약을 읽어 주십시오.</String>
262
263 <String Id="ProgressTextInstallValidate" Overridable="yes">설치 유효성을 확인하는 중</String>
264 <String Id="ProgressTextInstallFiles" Overridable="yes">새 파일을 복사하는 중</String>
265 <String Id="ProgressTextInstallFilesTemplate" Overridable="yes">파일: [1], 디렉터리: [9], 크기: [6]</String>
266 <String Id="ProgressTextInstallAdminPackage" Overridable="yes">네트워크 설치 파일을 복사하는 중</String>
267 <String Id="ProgressTextInstallAdminPackageTemplate" Overridable="yes">파일: [1], 디렉터리: [9], 크기: [6]</String>
268 <String Id="ProgressTextFileCost" Overridable="yes">필요한 공간을 확인하는 중</String>
269 <String Id="ProgressTextCostInitialize" Overridable="yes">필요한 공간을 확인하는 중</String>
270 <String Id="ProgressTextCostFinalize" Overridable="yes">필요한 공간을 확인하는 중</String>
271 <String Id="ProgressTextCreateShortcuts" Overridable="yes">바로 가기를 만드는 중</String>
272 <String Id="ProgressTextCreateShortcutsTemplate" Overridable="yes">바로 가기: [1]</String>
273 <String Id="ProgressTextPublishComponents" Overridable="yes">해당 구성 요소를 게시하는 중</String>
274 <String Id="ProgressTextPublishComponentsTemplate" Overridable="yes">구성 요소 ID: [1], 한정자: [2]</String>
275 <String Id="ProgressTextPublishFeatures" Overridable="yes">제품 기능을 게시하는 중</String>
276 <String Id="ProgressTextPublishFeaturesTemplate" Overridable="yes">기능: [1]</String>
277 <String Id="ProgressTextPublishProduct" Overridable="yes">제품 정보를 게시하는 중</String>
278 <String Id="ProgressTextRegisterClassInfo" Overridable="yes">클래스 서버를 등록하는 중</String>
279 <String Id="ProgressTextRegisterClassInfoTemplate" Overridable="yes">클래스 ID: [1]</String>
280 <String Id="ProgressTextRegisterExtensionInfo" Overridable="yes">확장 서버를 등록하는 중</String>
281 <String Id="ProgressTextRegisterExtensionInfoTemplate" Overridable="yes">확장: [1]</String>
282 <String Id="ProgressTextRegisterMIMEInfo" Overridable="yes">MIME 정보를 등록하는 중</String>
283 <String Id="ProgressTextRegisterMIMEInfoTemplate" Overridable="yes">MIME 콘텐츠 형식: [1], 확장: [2]</String>
284 <String Id="ProgressTextRegisterProgIdInfo" Overridable="yes">프로그램 ID를 등록하는 중</String>
285 <String Id="ProgressTextRegisterProgIdInfoTemplate" Overridable="yes">ProgId: [1]</String>
286 <String Id="ProgressTextAllocateRegistrySpace" Overridable="yes">레지스트리 공간을 할당하는 중</String>
287 <String Id="ProgressTextAllocateRegistrySpaceTemplate" Overridable="yes">사용 가능한 공간: [1]</String>
288 <String Id="ProgressTextAppSearch" Overridable="yes">설치한 응용 프로그램을 찾는 중</String>
289 <String Id="ProgressTextAppSearchTemplate" Overridable="yes">속성: [1], 서명: [2]</String>
290 <String Id="ProgressTextBindImage" Overridable="yes">실행 파일을 연결하는 중</String>
291 <String Id="ProgressTextBindImageTemplate" Overridable="yes">파일: [1]</String>
292 <String Id="ProgressTextCCPSearch" Overridable="yes">정품을 찾는 중</String>
293 <String Id="ProgressTextCreateFolders" Overridable="yes">폴더를 만드는 중</String>
294 <String Id="ProgressTextCreateFoldersTemplate" Overridable="yes">폴더: [1]</String>
295 <String Id="ProgressTextDeleteServices" Overridable="yes">서비스를 삭제하는 중</String>
296 <String Id="ProgressTextDeleteServicesTemplate" Overridable="yes">서비스: [1]</String>
297 <String Id="ProgressTextDuplicateFiles" Overridable="yes">중복 파일을 만드는 중</String>
298 <String Id="ProgressTextDuplicateFilesTemplate" Overridable="yes">파일: [1], 디렉터리: [9], 크기: [6]</String>
299 <String Id="ProgressTextFindRelatedProducts" Overridable="yes">관련 응용 프로그램을 찾는 중</String>
300 <String Id="ProgressTextFindRelatedProductsTemplate" Overridable="yes">찾은 응용 프로그램: [1]</String>
301 <String Id="ProgressTextInstallODBC" Overridable="yes">ODBC 구성 요소를 설치하는 중</String>
302 <String Id="ProgressTextInstallServices" Overridable="yes">새 서비스를 설치하는 중</String>
303 <String Id="ProgressTextInstallServicesTemplate" Overridable="yes">서비스: [2]</String>
304 <String Id="ProgressTextLaunchConditions" Overridable="yes">시작 조건을 평가하는 중</String>
305 <String Id="ProgressTextMigrateFeatureStates" Overridable="yes">관련 응용 프로그램에서 기능 상태를 마이그레이션하는 중</String>
306 <String Id="ProgressTextMigrateFeatureStatesTemplate" Overridable="yes">응용 프로그램: [1]</String>
307 <String Id="ProgressTextMoveFiles" Overridable="yes">파일을 옮기는 중</String>
308 <String Id="ProgressTextMoveFilesTemplate" Overridable="yes">파일: [1], 디렉터리: [9], 크기: [6]</String>
309 <String Id="ProgressTextPatchFiles" Overridable="yes">파일을 패치하는 중</String>
310 <String Id="ProgressTextPatchFilesTemplate" Overridable="yes">파일: [1], 디렉터리: [2], 크기: [3]</String>
311 <String Id="ProgressTextProcessComponents" Overridable="yes">구성 요소 등록을 업데이트하는 중</String>
312 <String Id="ProgressTextRegisterComPlus" Overridable="yes">COM+ 응용 프로그램 및 구성 요소를 등록하는 중</String>
313 <String Id="ProgressTextRegisterComPlusTemplate" Overridable="yes">AppId: [1]{{, AppType: [2], Users: [3], RSN: [4]}}</String>
314 <String Id="ProgressTextRegisterFonts" Overridable="yes">글꼴을 등록하는 중</String>
315 <String Id="ProgressTextRegisterFontsTemplate" Overridable="yes">글꼴: [1]</String>
316 <String Id="ProgressTextRegisterProduct" Overridable="yes">제품을 등록하는 중</String>
317 <String Id="ProgressTextRegisterProductTemplate" Overridable="yes">[1]</String>
318 <String Id="ProgressTextRegisterTypeLibraries" Overridable="yes">형식 라이브러리를 등록하는 중</String>
319 <String Id="ProgressTextRegisterTypeLibrariesTemplate" Overridable="yes">LibID: [1]</String>
320 <String Id="ProgressTextRegisterUser" Overridable="yes">사용자를 등록하는 중</String>
321 <String Id="ProgressTextRegisterUserTemplate" Overridable="yes">[1]</String>
322 <String Id="ProgressTextRemoveDuplicateFiles" Overridable="yes">중복 파일을 제거하는 중</String>
323 <String Id="ProgressTextRemoveDuplicateFilesTemplate" Overridable="yes">파일: [1], 디렉터리: [9]</String>
324 <String Id="ProgressTextRemoveEnvironmentStrings" Overridable="yes">환경 문자열을 업데이트하는 중</String>
325 <String Id="ProgressTextRemoveEnvironmentStringsTemplate" Overridable="yes">이름: [1], 값: [2], 작업 [3]</String>
326 <String Id="ProgressTextRemoveExistingProducts" Overridable="yes">응용 프로그램을 제거하는 중</String>
327 <String Id="ProgressTextRemoveExistingProductsTemplate" Overridable="yes">응용 프로그램: [1], 명령줄: [2]</String>
328 <String Id="ProgressTextRemoveFiles" Overridable="yes">파일을 제거하는 중</String>
329 <String Id="ProgressTextRemoveFilesTemplate" Overridable="yes">파일: [1], 디렉터리: [9]</String>
330 <String Id="ProgressTextRemoveFolders" Overridable="yes">폴더를 제거하는 중</String>
331 <String Id="ProgressTextRemoveFoldersTemplate" Overridable="yes">폴더: [1]</String>
332 <String Id="ProgressTextRemoveIniValues" Overridable="yes">INI 파일 항목을 제거하는 중</String>
333 <String Id="ProgressTextRemoveIniValuesTemplate" Overridable="yes">파일: [1], 섹션: [2], 키: [3], 값: [4]</String>
334 <String Id="ProgressTextRemoveODBC" Overridable="yes">ODBC 구성 요소를 제거하는 중</String>
335 <String Id="ProgressTextRemoveRegistryValues" Overridable="yes">시스템 레지스트리 값을 제거하는 중</String>
336 <String Id="ProgressTextRemoveRegistryValuesTemplate" Overridable="yes">키: [1], 이름: [2]</String>
337 <String Id="ProgressTextRemoveShortcuts" Overridable="yes">바로 가기를 제거하는 중</String>
338 <String Id="ProgressTextRemoveShortcutsTemplate" Overridable="yes">바로 가기: [1]</String>
339 <String Id="ProgressTextRMCCPSearch" Overridable="yes">정품을 찾는 중</String>
340 <String Id="ProgressTextSelfRegModules" Overridable="yes">모듈을 등록하는 중</String>
341 <String Id="ProgressTextSelfRegModulesTemplate" Overridable="yes">파일: [1], 폴더: [2]</String>
342 <String Id="ProgressTextSelfUnregModules" Overridable="yes">모듈의 등록을 취소하는 중</String>
343 <String Id="ProgressTextSelfUnregModulesTemplate" Overridable="yes">파일: [1], 폴더: [2]</String>
344 <String Id="ProgressTextSetODBCFolders" Overridable="yes">ODBC 디렉터리를 초기화하는 중</String>
345 <String Id="ProgressTextStartServices" Overridable="yes">서비스를 시작하는 중</String>
346 <String Id="ProgressTextStartServicesTemplate" Overridable="yes">서비스: [1]</String>
347 <String Id="ProgressTextStopServices" Overridable="yes">서비스를 중지하는 중</String>
348 <String Id="ProgressTextStopServicesTemplate" Overridable="yes">서비스: [1]</String>
349 <String Id="ProgressTextUnpublishComponents" Overridable="yes">해당 구성 요소의 게시를 취소하는 중</String>
350 <String Id="ProgressTextUnpublishComponentsTemplate" Overridable="yes">구성 요소 ID: [1], 한정자: [2]</String>
351 <String Id="ProgressTextUnpublishFeatures" Overridable="yes">제품 기능의 게시를 취소하는 중</String>
352 <String Id="ProgressTextUnpublishFeaturesTemplate" Overridable="yes">기능: [1]</String>
353 <String Id="ProgressTextUnregisterClassInfo" Overridable="yes">클래스 서버 등록 취소</String>
354 <String Id="ProgressTextUnregisterClassInfoTemplate" Overridable="yes">클래스 ID: [1]</String>
355 <String Id="ProgressTextUnregisterComPlus" Overridable="yes">COM+ 응용 프로그램 및 구성 요소의 등록을 취소하는 중</String>
356 <String Id="ProgressTextUnregisterComPlusTemplate" Overridable="yes">AppId: [1]{{, AppType: [2]}}</String>
357 <String Id="ProgressTextUnregisterExtensionInfo" Overridable="yes">확장 서버의 등록을 취소하는 중</String>
358 <String Id="ProgressTextUnregisterExtensionInfoTemplate" Overridable="yes">확장: [1]</String>
359 <String Id="ProgressTextUnregisterFonts" Overridable="yes">글꼴 등록을 취소하는 중</String>
360 <String Id="ProgressTextUnregisterFontsTemplate" Overridable="yes">글꼴: [1]</String>
361 <String Id="ProgressTextUnregisterMIMEInfo" Overridable="yes">MIME 정보의 등록을 취소하는 중</String>
362 <String Id="ProgressTextUnregisterMIMEInfoTemplate" Overridable="yes">MIME 콘텐츠 형식: [1], 확장: [2]</String>
363 <String Id="ProgressTextUnregisterProgIdInfo" Overridable="yes">프로그램 식별자의 등록을 취소하는 중</String>
364 <String Id="ProgressTextUnregisterProgIdInfoTemplate" Overridable="yes">ProgId: [1]</String>
365 <String Id="ProgressTextUnregisterTypeLibraries" Overridable="yes">형식 라이브러리의 등록을 취소하는 중</String>
366 <String Id="ProgressTextUnregisterTypeLibrariesTemplate" Overridable="yes">LibID: [1]</String>
367 <String Id="ProgressTextWriteEnvironmentStrings" Overridable="yes">환경 문자열을 업데이트하는 중</String>
368 <String Id="ProgressTextWriteEnvironmentStringsTemplate" Overridable="yes">이름: [1], 값: [2], 작업 [3]</String>
369 <String Id="ProgressTextWriteIniValues" Overridable="yes">INI 파일 값을 쓰는 중</String>
370 <String Id="ProgressTextWriteIniValuesTemplate" Overridable="yes">파일: [1], 섹션: [2], 키: [3], 값: [4]</String>
371 <String Id="ProgressTextWriteRegistryValues" Overridable="yes">시스템 레지스트리 값을 쓰는 중</String>
372 <String Id="ProgressTextWriteRegistryValuesTemplate" Overridable="yes">키: [1], 이름: [2], 값: [3]</String>
373 <String Id="ProgressTextAdvertise" Overridable="yes">응용 프로그램을 보급하는 중</String>
374 <String Id="ProgressTextGenerateScript" Overridable="yes">실행할 스크립트 작업을 생성하는 중:</String>
375 <String Id="ProgressTextGenerateScriptTemplate" Overridable="yes">[1]</String>
376 <String Id="ProgressTextInstallSFPCatalogFile" Overridable="yes">시스템 카탈로그를 설치하는 중</String>
377 <String Id="ProgressTextInstallSFPCatalogFileTemplate" Overridable="yes">파일: [1], 종속성: [2]</String>
378 <String Id="ProgressTextMsiPublishAssemblies" Overridable="yes">어셈블리 정보를 게시하는 중</String>
379 <String Id="ProgressTextMsiPublishAssembliesTemplate" Overridable="yes">응용 프로그램 컨텍스트:[1], 어셈블리 이름:[2]</String>
380 <String Id="ProgressTextMsiUnpublishAssemblies" Overridable="yes">어셈블리 정보의 게시를 취소하는 중</String>
381 <String Id="ProgressTextMsiUnpublishAssembliesTemplate" Overridable="yes">응용 프로그램 컨텍스트:[1], 어셈블리 이름:[2]</String>
382 <String Id="ProgressTextRollback" Overridable="yes">작업을 롤백하는 중:</String>
383 <String Id="ProgressTextRollbackTemplate" Overridable="yes">[1]</String>
384 <String Id="ProgressTextRollbackCleanup" Overridable="yes">백업 파일을 제거하는 중</String>
385 <String Id="ProgressTextRollbackCleanupTemplate" Overridable="yes">파일: [1]</String>
386 <String Id="ProgressTextUnmoveFiles" Overridable="yes">옮긴 파일을 제거하는 중</String>
387 <String Id="ProgressTextUnmoveFilesTemplate" Overridable="yes">파일: [1], 디렉터리: [9]</String>
388 <String Id="ProgressTextUnpublishProduct" Overridable="yes">제품 정보의 게시를 취소하는 중</String>
389
390 <String Id="Error0" Overridable="yes">{{오류: }}</String>
391 <String Id="Error1" Overridable="yes">{{오류 [1]. }}</String>
392 <String Id="Error2" Overridable="yes">경고 [1]. </String>
393 <String Id="Error4" Overridable="yes">정보 [1]. </String>
394 <String Id="Error5" Overridable="yes">이 패키지를 설치하는 동안 예기치 못한 오류가 발생했습니다. 패키지에 문제가 있을 수 있습니다. 오류 코드: [1]. {{인수: [2], [3], [4]}}</String>
395 <String Id="Error7" Overridable="yes">{{디스크 꽉 참: }}</String>
396 <String Id="Error8" Overridable="yes">작업 [Time]: [1]. [2]</String>
397 <String Id="Error9" Overridable="yes">[ProductName]</String>
398 <String Id="Error10" Overridable="yes">{[2]}{, [3]}{, [4]}</String>
399 <String Id="Error11" Overridable="yes">메시지 유형: [1], 인수: [2]</String>
400 <String Id="Error12" Overridable="yes">=== 로깅 시작: [Date] [Time] ===</String>
401 <String Id="Error13" Overridable="yes">=== 로깅 중지: [Date] [Time] ===</String>
402 <String Id="Error14" Overridable="yes">작업 시작 [Time]: [1].</String>
403 <String Id="Error15" Overridable="yes">작업 끝 [Time]: [1]. 반환 값 [2].</String>
404 <String Id="Error16" Overridable="yes">남은 시간: {[1]분 }{[2]초}</String>
405 <String Id="Error17" Overridable="yes">메모리가 부족합니다. 다른 응용 프로그램을 종료한 후 다시 시도하십시오.</String>
406 <String Id="Error18" Overridable="yes">설치 관리자가 더 이상 응답하지 않습니다.</String>
407 <String Id="Error19" Overridable="yes">설치가 중단되었습니다.</String>
408 <String Id="Error20" Overridable="yes">[ProductName]을(를) 구성하는 동안 잠시 기다려 주십시오.</String>
409 <String Id="Error21" Overridable="yes">필요한 정보를 모으는 중...</String>
410 <String Id="Error22" Overridable="yes">이 응용 프로그램의 이전 버전을 제거하는 중...</String>
411 <String Id="Error23" Overridable="yes">이 응용 프로그램의 이전 버전을 제거하기 위해 준비하는 중...</String>
412 <String Id="Error32" Overridable="yes">{[ProductName] }이(가) 설치되었습니다.</String>
413 <String Id="Error33" Overridable="yes">{[ProductName] }이(가) 설치되지 않았습니다.</String>
414 <String Id="Error1101" Overridable="yes">파일 읽기 오류: [2]. {{ 시스템 오류 [3].}} 파일이 있는지, 그리고 해당 파일에 액세스할 수 있는지 확인하십시오.</String>
415 <String Id="Error1301" Overridable="yes">'[2]' 파일을 만들 수 없습니다. 이름이 같은 디렉터리가 이미 있습니다. 설치를 취소하고 다른 위치에 설치해 보십시오.</String>
416 <String Id="Error1302" Overridable="yes">다음 디스크를 넣으십시오. [2]</String>
417 <String Id="Error1303" Overridable="yes">[2] 디렉터리에 액세스할 수 있는 권한이 없어 설치를 계속할 수 없습니다. Administrator로 로그온하거나 시스템 관리자에게 문의하십시오.</String>
418 <String Id="Error1304" Overridable="yes">파일 쓰기 오류: [2]. 해당 디렉터리에 액세스할 수 있는지 확인하십시오.</String>
419 <String Id="Error1305" Overridable="yes">파일 읽기 오류: [2]. {{ 시스템 오류 [3].}} 파일이 있는지, 그리고 해당 파일에 액세스할 수 있는지 확인하십시오.</String>
420 <String Id="Error1306" Overridable="yes">다른 응용 프로그램에서 '[2]' 파일을 단독으로 사용하고 있습니다. 다른 응용 프로그램을 모두 닫은 후 "다시 시도"를 클릭하십시오.</String>
421 <String Id="Error1307" Overridable="yes">디스크 공간이 부족하여 [2] 파일을 설치할 수 없습니다. 필요한 디스크 공간을 확보하고 "다시 시도"를 클릭하거나 "취소"를 클릭하여 끝내십시오.</String>
422 <String Id="Error1308" Overridable="yes">원본 파일이 없습니다. [2]. 파일이 있는지, 그리고 해당 파일에 액세스할 수 있는지 확인하십시오.</String>
423 <String Id="Error1309" Overridable="yes">파일 읽기 오류: [3]. {{ 시스템 오류 [2].}} 파일이 있는지, 그리고 해당 파일에 액세스할 수 있는지 확인하십시오.</String>
424 <String Id="Error1310" Overridable="yes">파일 쓰기 오류: [3]. {{ 시스템 오류 [2].}} 해당 디렉터리에 액세스할 수 있는지 확인하십시오.</String>
425 <String Id="Error1311" Overridable="yes">원본 파일이 없습니다. {{(cabinet)}}: [2]. 파일이 있는지, 그리고 해당 파일에 액세스할 수 있는지 확인하십시오.</String>
426 <String Id="Error1312" Overridable="yes">'[2]' 디렉터리를 만들 수 없습니다. 이 이름을 가진 파일이 이미 있습니다. 파일 이름을 변경하거나 파일을 제거한 후 "다시 시도"를 클릭하거나 "취소"를 클릭하여 끝내십시오.</String>
427 <String Id="Error1313" Overridable="yes">[2] 볼륨을 현재 사용할 수 없습니다. 다른 볼륨을 선택하십시오.</String>
428 <String Id="Error1314" Overridable="yes">지정한 경로 '[2]'을(를) 사용할 수 없습니다.</String>
429 <String Id="Error1315" Overridable="yes">지정한 폴더 [2]에 쓸 수 없습니다.</String>
430 <String Id="Error1316" Overridable="yes">파일 [2]을(를) 읽는 동안 네트워크 오류가 발생했습니다.</String>
431 <String Id="Error1317" Overridable="yes">디렉터리 [2]을(를) 만드는 동안 오류가 발생했습니다.</String>
432 <String Id="Error1318" Overridable="yes">디렉터리 [2]을(를) 만드는 동안 네트워크 오류가 발생했습니다.</String>
433 <String Id="Error1319" Overridable="yes">원본 파일 캐비닛 [2]을(를) 여는 동안 네트워크 오류가 발생했습니다.</String>
434 <String Id="Error1320" Overridable="yes">지정한 경로 [2]이(가) 너무 깁니다.</String>
435 <String Id="Error1321" Overridable="yes">파일 [2]을(를) 수정할 수 있는 권한이 없습니다.</String>
436 <String Id="Error1322" Overridable="yes">폴더 경로 '[2]'의 일부가 잘못되었습니다. 비어 있거나 시스템에서 허용하는 길이를 초과합니다.</String>
437 <String Id="Error1323" Overridable="yes">폴더 경로 '[2]'에 폴더 경로에 사용할 수 없는 단어가 들어 있습니다.</String>
438 <String Id="Error1324" Overridable="yes">폴더 경로 '[2]'에 사용할 수 없는 문자가 들어 있습니다.</String>
439 <String Id="Error1325" Overridable="yes">'[2]'은(는) 유효한 약식 파일 이름이 아닙니다.</String>
440 <String Id="Error1326" Overridable="yes">파일 보안 오류: [3] GetLastError: [2]</String>
441 <String Id="Error1327" Overridable="yes">유효하지 않은 드라이브: [2]</String>
442 <String Id="Error1328" Overridable="yes">[2] 파일에 패치를 적용하는 동안 오류가 발생했습니다. 다른 방법으로 업데이트되었으므로 더 이상 이 패치를 사용하여 수정할 수 없습니다. 자세한 내용은 패치 공급업체에 문의하십시오. {{시스템 오류: [3]}}</String>
443 <String Id="Error1329" Overridable="yes">캐비닛 파일 [2]에 디지털 서명이 되어 있지 않으므로 필요한 파일을 설치할 수 없습니다. 캐비닛 파일이 손상되었을 수 있습니다.</String>
444 <String Id="Error1330" Overridable="yes">캐비닛 파일 [2]의 디지털 서명이 유효하지 않으므로 필요한 파일을 설치할 수 없습니다. 캐비닛 파일이 손상되었을 수 있습니다. {{WinVerifyTrust에서 [3] 오류가 반환되었습니다.}}</String>
445 <String Id="Error1331" Overridable="yes">[2] 파일을 올바로 복사하지 못했습니다. CRC 오류입니다.</String>
446 <String Id="Error1332" Overridable="yes">[2] 파일을 올바로 이동하지 못했습니다. CRC 오류입니다.</String>
447 <String Id="Error1333" Overridable="yes">[2] 파일을 올바로 패치하지 못했습니다. CRC 오류입니다.</String>
448 <String Id="Error1334" Overridable="yes">캐비닛 파일 '[3]'에서 찾을 수 없어서 '[2]' 파일을 설치할 수 없습니다. 네트워크 오류이거나, CD-ROM에서 읽기 오류이거나, 이 패키지에 문제가 있을 수 있습니다.</String>
449 <String Id="Error1335" Overridable="yes">설치에 필요한 캐비닛 파일 '[2]'이(가) 손상되어 사용할 수 없습니다. 네트워크 오류이거나, CD-ROM에서 읽기 오류이거나, 이 패키지에 문제가 있을 수 있습니다.</String>
450 <String Id="Error1336" Overridable="yes">설치를 마치는데 필요한 임시 파일을 만드는 동안 오류가 발생했습니다.{{ 폴더: [3]. 시스템 오류 코드: [2]}}</String>
451 <String Id="Error1401" Overridable="yes">키 [2]을(를) 만들지 못했습니다. {{ 시스템 오류 [3].}} 해당 키에 대한 액세스 권한이 충분한지 확인하거나 고객 지원 담당자에게 문의하십시오. </String>
452 <String Id="Error1402" Overridable="yes">키 [2]을(를) 열지 못했습니다. {{ 시스템 오류 [3].}} 해당 키에 대한 액세스 권한이 충분한지 확인하거나 고객 지원 담당자에게 문의하십시오. </String>
453 <String Id="Error1403" Overridable="yes">키 [3]에서 값 [2]을(를) 삭제하지 못했습니다. {{ 시스템 오류 [4].}} 해당 키에 대한 액세스 권한이 충분한지 확인하거나 고객 지원 담당자에게 문의하십시오. </String>
454 <String Id="Error1404" Overridable="yes">키 [2]을(를) 삭제하지 못했습니다. {{ 시스템 오류 [3].}} 해당 키에 대한 액세스 권한이 충분한지 확인하거나 고객 지원 담당자에게 문의하십시오. </String>
455 <String Id="Error1405" Overridable="yes">키 [3]에서 값 [2]을(를) 읽지 못했습니다. {{ 시스템 오류 [4].}} 해당 키에 대한 액세스 권한이 충분한지 확인하거나 고객 지원 담당자에게 문의하십시오. </String>
456 <String Id="Error1406" Overridable="yes">키 [3]에 값 [2]을(를) 쓰지 못했습니다. {{ 시스템 오류 [4].}} 해당 키에 대한 액세스 권한이 충분한지 확인하거나 고객 지원 담당자에게 문의하십시오.</String>
457 <String Id="Error1407" Overridable="yes">키 [2]의 값 이름을 가져오지 못했습니다. {{ 시스템 오류 [3].}} 해당 키에 대한 액세스 권한이 충분한지 확인하거나 고객 지원 담당자에게 문의하십시오.</String>
458 <String Id="Error1408" Overridable="yes">키 [2]의 하위 키 이름을 가져오지 못했습니다. {{ 시스템 오류 [3].}} 해당 키에 대한 액세스 권한이 충분한지 확인하거나 고객 지원 담당자에게 문의하십시오.</String>
459 <String Id="Error1409" Overridable="yes">키 [2]의 보안 정보를 읽지 못했습니다. {{ 시스템 오류 [3].}} 해당 키에 대한 액세스 권한이 충분한지 확인하거나 고객 지원 담당자에게 문의하십시오.</String>
460 <String Id="Error1410" Overridable="yes">사용 가능한 레지스트리 공간을 늘리지 못했습니다. [2]KB의 사용 가능한 레지스트리 공간이 있어야 이 응용 프로그램을 설치할 수 있습니다.</String>
461 <String Id="Error1500" Overridable="yes">다른 프로그램을 설치하고 있습니다. 해당 프로그램의 설치를 끝낸 후 이 작업을 계속하십시오.</String>
462 <String Id="Error1501" Overridable="yes">보안 데이터에 액세스하는 동안 오류가 발생했습니다. Windows Installer 구성을 올바르게 설정했는지 확인하고 다시 설치하십시오.</String>
463 <String Id="Error1502" Overridable="yes">사용자 '[2]'이(가) 제품 '[3]'의 설치를 시작한 적이 있습니다. 이 사용자가 다시 설치 프로그램을 실행해야 해당 제품을 사용할 수 있습니다. 현재 설치는 계속됩니다.</String>
464 <String Id="Error1503" Overridable="yes">사용자 '[2]'이(가) 제품 '[3]'의 설치를 시작한 적이 있습니다. 이 사용자가 다시 설치 프로그램을 실행해야 해당 제품을 사용할 수 있습니다.</String>
465 <String Id="Error1601" Overridable="yes">디스크 공간 부족 -- 볼륨: '[2]', 필요한 공간: [3]KB, 사용 가능한 공간: [4]KB. 디스크 공간을 늘린 후 다시 시도하십시오.</String>
466 <String Id="Error1602" Overridable="yes">취소하시겠습니까?</String>
467 <String Id="Error1603" Overridable="yes">파일 [2][3]을(를) 다른 프로세스{이름: [4], ID: [5], 창 제목: '[6]'}에서 사용하고 있습니다. 해당 응용 프로그램을 닫은 후 다시 시도하십시오.</String>
468 <String Id="Error1604" Overridable="yes">제품 '[2]'이(가) 이미 설치되어 있어서 이 제품을 설치할 수 없습니다. 두 제품은 호환되지 않습니다.</String>
469 <String Id="Error1605" Overridable="yes">복구를 사용하여 설치를 계속하기에는 '[2]' 볼륨에 디스크 공간이 부족합니다. [3]KB가 필요하나, [4]KB만 사용 가능합니다. 복구 정보를 저장하지 않고 설치를 계속하려면 "무시"를 클릭하고, 사용 가능한 공간을 다시 확인하려면 "다시 시도"를 클릭하십시오. 설치를 끝내려면 "취소"를 클릭하십시오.</String>
470 <String Id="Error1606" Overridable="yes">네트워크 위치 [2]에 액세스하지 못했습니다.</String>
471 <String Id="Error1607" Overridable="yes">설치를 계속하려면 다음 응용 프로그램을 닫아야 합니다.</String>
472 <String Id="Error1608" Overridable="yes">지금 설치하려는 제품의 이전 버전이 이 시스템에 설치되어 있지 않습니다.</String>
473 <String Id="Error1609" Overridable="yes">보안 설정을 적용하는 동안 오류가 발생했습니다. [2]은(는) 유효한 사용자 또는 그룹이 아닙니다. 패키지에 문제가 있거나, 네트워크의 도메인 컨트롤러에 연결하는 데 문제가 있을 수 있습니다. 네트워크 연결을 확인하고 "다시 시도"를 클릭하거나, 설치를 마치려면 "취소"를 클릭하십시오. {{사용자 SID를 찾을 수 없습니다. 시스템 오류 [3]}}</String>
474 <String Id="Error1701" Overridable="yes">키 [2]이(가) 유효하지 않습니다. 정확한 키를 입력했는지 확인하십시오.</String>
475 <String Id="Error1702" Overridable="yes">시스템을 다시 시작한 후에 [2] 구성을 계속할 수 있습니다. 지금 다시 시작하려면 "예"를 클릭하고, 나중에 수동으로 다시 시작하려면 "아니요"를 클릭하십시오.</String>
476 <String Id="Error1703" Overridable="yes">변경된 구성 설정을 [2]에 적용하려면 시스템을 다시 시작해야 합니다. 지금 다시 시작하려면 "예"를 클릭하고, 나중에 수동으로 다시 시작하려면 "아니요"를 클릭하십시오.</String>
477 <String Id="Error1704" Overridable="yes">[2]의 설치가 현재 중지된 상태입니다. 작업을 계속하려면 설치하면서 변경된 내용을 취소해야 합니다. 변경된 내용을 취소하시겠습니까?</String>
478 <String Id="Error1705" Overridable="yes">이전에 실행했던 이 제품의 설치 작업이 진행 중인 상태입니다. 작업을 계속하려면 설치하면서 변경된 내용을 취소해야 합니다. 변경된 내용을 취소하시겠습니까?</String>
479 <String Id="Error1706" Overridable="yes">제품 [2]의 설치 패키지가 없습니다. 설치 패키지 '[3]'의 올바른 복사본을 사용하여 설치를 다시 시도하십시오.</String>
480 <String Id="Error1707" Overridable="yes">설치가 완료되었습니다.</String>
481 <String Id="Error1708" Overridable="yes">설치하지 못했습니다.</String>
482 <String Id="Error1709" Overridable="yes">제품: [2] -- [3]</String>
483 <String Id="Error1710" Overridable="yes">컴퓨터를 이전 상태로 복원하거나 나중에 다시 설치해야 합니다. 복원하시겠습니까?</String>
484 <String Id="Error1711" Overridable="yes">설치 정보를 디스크에 쓰는 동안 오류가 발생했습니다. 디스크 공간이 충분한지 확인하고 "다시 시도"를 클릭하거나, 설치를 끝내려면 "취소"를 클릭하십시오.</String>
485 <String Id="Error1712" Overridable="yes">컴퓨터를 이전 상태로 복원하는 데 필요한 일부 파일을 찾을 수 없습니다. 복원할 수 없습니다.</String>
486 <String Id="Error1713" Overridable="yes">[2]이(가) 필요한 제품 중의 하나를 설치할 수 없습니다. 기술 지원 부서에 문의하십시오. {{시스템 오류: [3].}}</String>
487 <String Id="Error1714" Overridable="yes">이전 버전의 [2]을(를) 제거할 수 없습니다. 기술 지원 부서에 문의하십시오. {{시스템 오류 [3].}}</String>
488 <String Id="Error1715" Overridable="yes">[2] 설치됨</String>
489 <String Id="Error1716" Overridable="yes">[2] 구성됨</String>
490 <String Id="Error1717" Overridable="yes">[2] 제거됨</String>
491 <String Id="Error1718" Overridable="yes">디지털 서명 정책이 [2] 파일을 거부했습니다.</String>
492 <String Id="Error1719" Overridable="yes">Windows Installer Service에 액세스할 수 없습니다. Windows를 안전 모드에서 실행 중이거나, Windows Installer가 올바로 설치되지 않은 경우 발생할 수 있습니다. 고객 지원 담당자에게 문의하십시오.</String>
493 <String Id="Error1720" Overridable="yes">Windows Installer 패키지에 문제가 있습니다. 설치를 완료하는 데 필요한 스크립트를 실행할 수 없습니다. 고객 지원 담당자 또는 패키지 공급업체에 문의하십시오. {{사용자 지정 작업: [2] 스크립트 오류: [3], [4]: [5], 줄: [6], 열: [7], [8] }}</String>
494 <String Id="Error1721" Overridable="yes">Windows Installer 패키지에 문제가 있습니다. 설치를 완료하는 데 필요한 프로그램을 실행할 수 없습니다. 고객 지원 담당자 또는 패키지 공급업체에 문의하십시오. {{작업: [2], 위치: [3], 명령: [4] }}</String>
495 <String Id="Error1722" Overridable="yes">Windows Installer 패키지에 문제가 있습니다. 설치 프로그램의 일부로 실행되는 프로그램이 예상대로 완료되지 않았습니다. 고객 지원 담당자 또는 패키지 공급업체에 문의하십시오. {{작업: [2], 위치: [3], 명령: [4] }}</String>
496 <String Id="Error1723" Overridable="yes">Windows Installer 패키지에 문제가 있습니다. 설치를 완료하는 데 필요한 DLL을 실행할 수 없습니다. 고객 지원 담당자 또는 패키지 공급업체에 문의하십시오. {{작업: [2], 항목: [3], 라이브러리: [4] }}</String>
497 <String Id="Error1724" Overridable="yes">제거가 완료되었습니다.</String>
498 <String Id="Error1725" Overridable="yes">제거하지 못했습니다.</String>
499 <String Id="Error1726" Overridable="yes">보급이 완료되었습니다.</String>
500 <String Id="Error1727" Overridable="yes">보급하지 못했습니다.</String>
501 <String Id="Error1728" Overridable="yes">구성이 완료되었습니다.</String>
502 <String Id="Error1729" Overridable="yes">구성하지 못했습니다.</String>
503 <String Id="Error1730" Overridable="yes">Administrator만 이 응용 프로그램을 제거할 수 있습니다. 이 응용 프로그램을 제거하려면 Administrator로 로그온하거나 기술 지원 부서에 문의하십시오.</String>
504 <String Id="Error1731" Overridable="yes">제품 [2]의 원본 설치 패키지가 클라이언트 패키지와 동기화되어 있지 않습니다. 설치 패키지 '[3]'의 올바른 복사본을 사용하여 설치를 다시 시도하십시오.</String>
505 <String Id="Error1732" Overridable="yes">[2]의 설치를 완료하려면 컴퓨터를 다시 시작해야 합니다. 다른 사용자가 현재 이 컴퓨터에 로그온해 있으며 컴퓨터를 다시 시작하면 다른 사용자의 작업 내용이 손실될 수 있습니다. 지금 다시 시작하시겠습니까?</String>
506 <String Id="Error1801" Overridable="yes">경로 [2]이(가) 유효하지 않습니다. 올바른 경로를 지정하십시오.</String>
507 <String Id="Error1802" Overridable="yes">메모리가 부족합니다. 다른 응용 프로그램을 종료한 후 다시 시도하십시오.</String>
508 <String Id="Error1803" Overridable="yes">드라이브 [2]에 디스크가 없습니다. 디스크를 넣은 후 "다시 시도"를 클릭하거나, "취소"를 클릭하여 이전에 선택한 볼륨으로 다시 돌아가십시오.</String>
509 <String Id="Error1804" Overridable="yes">드라이브 [2]에 디스크가 없습니다. 디스크를 넣은 후 "다시 시도"를 클릭하거나, "취소"를 클릭하여 "찾아보기" 대화 상자로 간 후 다른 볼륨을 선택하십시오.</String>
510 <String Id="Error1805" Overridable="yes">[2] 폴더가 없습니다. 기존 폴더 경로를 입력하십시오.</String>
511 <String Id="Error1806" Overridable="yes">이 폴더를 읽을 수 있는 권한이 없습니다.</String>
512 <String Id="Error1807" Overridable="yes">설치할 대상 폴더를 결정하지 못했습니다.</String>
513 <String Id="Error1901" Overridable="yes">원본 설치 데이터베이스를 읽는 동안 오류 발생: [2].</String>
514 <String Id="Error1902" Overridable="yes">다시 부팅 작업을 예약하고 있습니다. [2] 파일의 이름을 [3](으)로 바꿉니다. 작업을 완료하려면 다시 부팅해야 합니다.</String>
515 <String Id="Error1903" Overridable="yes">다시 부팅 작업을 예약하고 있습니다. [2] 파일을 삭제합니다. 작업을 완료하려면 다시 부팅해야 합니다.</String>
516 <String Id="Error1904" Overridable="yes">모듈 [2]을(를) 등록하지 못했습니다. HRESULT [3]. 고객 지원 담당자에게 문의하십시오.</String>
517 <String Id="Error1905" Overridable="yes">모듈 [2]의 등록을 취소하지 못했습니다. HRESULT [3]. 고객 지원 담당자에게 문의하십시오.</String>
518 <String Id="Error1906" Overridable="yes">[2] 패키지를 캐시하지 못했습니다. 오류: [3]. 고객 지원 담당자에게 문의하십시오.</String>
519 <String Id="Error1907" Overridable="yes">[2] 글꼴을 등록하지 못했습니다. 글꼴을 설치할 수 있는 권한이 있는지, 그리고 이 글꼴을 시스템에서 지원하는지 확인하십시오.</String>
520 <String Id="Error1908" Overridable="yes">[2] 글꼴의 등록을 취소하지 못했습니다. 글꼴을 제거할 수 있는 권한이 있는지 확인하십시오.</String>
521 <String Id="Error1909" Overridable="yes">바로 가기 [2]을(를) 만들지 못했습니다. 대상 폴더가 있는지, 그리고 해당 폴더에 액세스할 수 있는지 확인하십시오.</String>
522 <String Id="Error1910" Overridable="yes">[2] 바로 가기를 제거하지 못했습니다. 바로 가기 파일이 있는지, 그리고 해당 파일에 액세스할 수 있는지 확인하십시오.</String>
523 <String Id="Error1911" Overridable="yes">[2] 파일의 형식 라이브러리를 등록하지 못했습니다. 고객 지원 담당자에게 문의하십시오.</String>
524 <String Id="Error1912" Overridable="yes">[2] 파일의 형식 라이브러리 등록을 취소하지 못했습니다. 고객 지원 담당자에게 문의하십시오.</String>
525 <String Id="Error1913" Overridable="yes">ini 파일 [2][3]을(를) 업데이트하지 못했습니다. 파일이 있는지, 그리고 해당 파일에 액세스할 수 있는지 확인하십시오.</String>
526 <String Id="Error1914" Overridable="yes">시스템을 다시 부팅할 때 파일 [3]을(를) [2](으)로 바꾸도록 지정하지 못했습니다. 파일 [3]에 대한 쓰기 권한이 있는지 확인하십시오.</String>
527 <String Id="Error1915" Overridable="yes">ODBC 드라이버 관리자를 제거하는 동안 오류가 발생했습니다. ODBC 오류 [2]: [3]. 고객 지원 담당자에게 문의하십시오.</String>
528 <String Id="Error1916" Overridable="yes">ODBC 드라이버 관리자를 설치하는 동안 오류가 발생했습니다. ODBC 오류 [2]: [3]. 고객 지원 담당자에게 문의하십시오.</String>
529 <String Id="Error1917" Overridable="yes">ODBC 드라이버 [4]을(를) 제거하는 동안 오류가 발생했습니다. ODBC 오류 [2]: [3]. ODBC 드라이버를 제거할 수 있는 권한이 있는지 확인하십시오.</String>
530 <String Id="Error1918" Overridable="yes">ODBC 드라이버 [4]을(를) 설치하는 동안 오류가 발생했습니다. ODBC 오류 [2]: [3]. 파일 [4]이(가) 있는지, 그리고 해당 파일에 액세스할 수 있는지 확인하십시오.</String>
531 <String Id="Error1919" Overridable="yes">ODBC 데이터 원본 [4]을(를) 구성하는 동안 오류가 발생했습니다. ODBC 오류 [2]: [3]. 파일 [4]이(가) 있는지, 그리고 해당 파일에 액세스할 수 있는지 확인하십시오.</String>
532 <String Id="Error1920" Overridable="yes">서비스 '[2]'([3])을(를) 시작하지 못했습니다. 시스템 서비스를 시작할 수 있는 권한이 있는지 확인하십시오.</String>
533 <String Id="Error1921" Overridable="yes">서비스 '[2]'([3])을(를) 중지하지 못했습니다. 시스템 서비스를 중지할 수 있는 권한이 있는지 확인하십시오.</String>
534 <String Id="Error1922" Overridable="yes">서비스 '[2]'([3])을(를) 삭제하지 못했습니다. 시스템 서비스를 제거할 수 있는 권한이 있는지 확인하십시오.</String>
535 <String Id="Error1923" Overridable="yes">서비스 '[2]'([3])을(를) 설치하지 못했습니다. 시스템 서비스를 설치할 수 있는 권한이 있는지 확인하십시오.</String>
536 <String Id="Error1924" Overridable="yes">환경 변수 '[2]'을(를) 업데이트하지 못했습니다. 환경 변수를 수정할 수 있는 권한이 있는지 확인하십시오.</String>
537 <String Id="Error1925" Overridable="yes">이 시스템의 모든 사용자가 사용하도록 제품을 설치할 권한이 없습니다. Administrator로 로그온한 후 다시 설치하십시오.</String>
538 <String Id="Error1926" Overridable="yes">파일 '[3]'에 대해 파일 보안을 설정하지 못했습니다. 오류: [2]. 이 파일의 보안 권한을 수정할 수 있는 권한이 있는지 확인하십시오.</String>
539 <String Id="Error1927" Overridable="yes">이 컴퓨터에 구성 요소 서비스(COM+ 1.0)가 설치되어 있지 않습니다. 설치를 완료하려면 구성 요소 서비스가 있어야 합니다. 구성 요소 서비스는 Windows 2000에서 사용할 수 있습니다.</String>
540 <String Id="Error1928" Overridable="yes">COM+ 응용 프로그램을 등록하는 동안 오류가 발생했습니다. 자세한 내용은 고객 지원 담당자에게 문의하십시오.</String>
541 <String Id="Error1929" Overridable="yes">COM+ 응용 프로그램 등록을 취소하는 동안 오류가 발생했습니다. 자세한 내용은 고객 지원 담당자에게 문의하십시오.</String>
542 <String Id="Error1930" Overridable="yes">서비스 '[2]' ([3])의 설명을 변경할 수 없습니다.</String>
543 <String Id="Error1931" Overridable="yes">Windows에서 시스템 파일 [2]을(를) 보호하고 있어 업데이트할 수 없습니다. 이 프로그램이 제대로 작동하려면 운영 체제를 업데이트해야 합니다. {{패키지 버전: [3], OS 보호된 버전: [4]}}</String>
544 <String Id="Error1932" Overridable="yes">Windows Installer 서비스가 보호된 Windows 파일 [2]을(를) 업데이트할 수 없습니다. {{패키지 버전: [3], OS 보호된 버전: [4], SFP 오류: [5]}}</String>
545 <String Id="Error1933" Overridable="yes">Windows Installer 서비스에서 하나 이상의 보호된 Windows 파일을 업데이트할 수 없습니다. {{SFP 오류: [2]. 보호된 파일 목록:\r\n[3]}}</String>
546 <String Id="Error1934" Overridable="yes">컴퓨터의 정책에 의해 사용자 설치를 할 수 없습니다.</String>
547 <String Id="Error1935" Overridable="yes">'[6]' 어셈블리를 설치하는 동안 오류가 발생했습니다. 자세한 내용은 도움말 및 지원을 참조하십시오. HRESULT: [3]. {{어셈블리 인터페이스: [4], 함수: [5], 구성 요소: [2]}}</String>
548 <String Id="Error1936" Overridable="yes">'[6]' 어셈블리를 설치하는 동안 오류가 발생했습니다. 강력한 이름의 어셈블리가 아니거나 최소 키 길이로 서명되지 않았습니다. HRESULT: [3]. {{어셈블리 인터페이스: [4], 함수: [5], 구성 요소: [2]}}</String>
549 <String Id="Error1937" Overridable="yes">'[6]' 어셈블리를 설치하는 동안 오류가 발생했습니다. 서명 또는 카탈로그를 확인할 수 없거나 서명 또는 카탈로그가 올바르지 않습니다. HRESULT: [3]. {{어셈블리 인터페이스: [4], 함수: [5], 구성 요소: [2]}}</String>
550 <String Id="Error1938" Overridable="yes">'[6]' 어셈블리를 설치하는 동안 오류가 발생했습니다. 하나 이상의 어셈블리 모듈을 찾을 수 없습니다. HRESULT: [3]. {{어셈블리 인터페이스: [4], 함수: [5], 구성 요소: [2]}}</String>
551
552 <String Id="UITextbytes" Overridable="yes">바이트</String>
553 <String Id="UITextGB" Overridable="yes">GB</String>
554 <String Id="UITextKB" Overridable="yes">KB</String>
555 <String Id="UITextMB" Overridable="yes">MB</String>
556 <String Id="UITextMenuAbsent" Overridable="yes">모든 기능을 사용할 수 없습니다.</String>
557 <String Id="UITextMenuAdvertise" Overridable="yes">필요할 때 기능을 설치합니다.</String>
558 <String Id="UITextMenuAllCD" Overridable="yes">모든 기능이 CD에서 실행되도록 설치됩니다.</String>
559 <String Id="UITextMenuAllLocal" Overridable="yes">모든 기능이 로컬 하드 드라이브에 설치됩니다.</String>
560 <String Id="UITextMenuAllNetwork" Overridable="yes">모든 기능이 네트워크에서 실행되도록 설치됩니다.</String>
561 <String Id="UITextMenuCD" Overridable="yes">CD에서 실행되도록 설치됩니다.</String>
562 <String Id="UITextMenuLocal" Overridable="yes">로컬 하드 드라이브에 설치됩니다.</String>
563 <String Id="UITextMenuNetwork" Overridable="yes">네트워크에서 실행되도록 설치됩니다.</String>
564 <String Id="UITextNewFolder" Overridable="yes">Folder|새 폴더</String>
565 <String Id="UITextScriptInProgress" Overridable="yes">필요한 정보를 모으는 중...</String>
566 <String Id="UITextSelAbsentAbsent" Overridable="yes">이 기능은 설치되지 않습니다.</String>
567 <String Id="UITextSelAbsentAdvertise" Overridable="yes">이 기능은 필요할 때 설치하도록 설정됩니다.</String>
568 <String Id="UITextSelAbsentCD" Overridable="yes">이 기능은 CD에서 실행되도록 설치됩니다.</String>
569 <String Id="UITextSelAbsentLocal" Overridable="yes">이 기능은 로컬 하드 드라이브에 설치됩니다.</String>
570 <String Id="UITextSelAbsentNetwork" Overridable="yes">이 기능은 네트워크에서 실행되도록 설치됩니다.</String>
571 <String Id="UITextSelAdvertiseAbsent" Overridable="yes">이 기능을 사용할 수 없게 됩니다.</String>
572 <String Id="UITextSelAdvertiseAdvertise" Overridable="yes">필요할 때 설치합니다.</String>
573 <String Id="UITextSelAdvertiseCD" Overridable="yes">이 기능은 CD에서 실행할 수 있습니다.</String>
574 <String Id="UITextSelAdvertiseLocal" Overridable="yes">이 기능은 로컬 하드 드라이브에 설치됩니다.</String>
575 <String Id="UITextSelAdvertiseNetwork" Overridable="yes">이 기능은 네트워크에서 실행할 수 있습니다.</String>
576 <String Id="UITextSelCDAbsent" Overridable="yes">이 기능은 완전히 제거되며, CD에서 실행할 수 없게 됩니다.</String>
577 <String Id="UITextSelCDAdvertise" Overridable="yes">이 기능은 CD에서 실행되던 상태에서 필요할 때 설치되는 것으로 변경됩니다.</String>
578 <String Id="UITextSelCDCD" Overridable="yes">이 기능은 그대로 CD에서 실행됩니다.</String>
579 <String Id="UITextSelCDLocal" Overridable="yes">이 기능은 CD에서 실행되던 상태에서 로컬 하드 드라이브에 설치되는 것으로 변경됩니다.</String>
580 <String Id="UITextSelChildCostNeg" Overridable="yes">이 기능은 하드 드라이브에 [1]의 공간을 만듭니다.</String>
581 <String Id="UITextSelChildCostPos" Overridable="yes">이 기능을 사용하려면 하드 드라이브에 [1]이(가) 있어야 합니다.</String>
582 <String Id="UITextSelCostPending" Overridable="yes">이 기능에 대한 공간을 계산하는 중...</String>
583 <String Id="UITextSelLocalAbsent" Overridable="yes">이 기능은 완전히 제거됩니다.</String>
584 <String Id="UITextSelLocalAdvertise" Overridable="yes">이 기능은 로컬 하드 드라이브에서 제거되지만 필요할 때 설치하도록 설정됩니다.</String>
585 <String Id="UITextSelLocalCD" Overridable="yes">이 기능은 로컬 하드 드라이브에서 제거되지만 CD에서는 실행할 수 있습니다.</String>
586 <String Id="UITextSelLocalLocal" Overridable="yes">이 기능은 로컬 하드 드라이브에 그대로 남아 있게 됩니다.</String>
587 <String Id="UITextSelLocalNetwork" Overridable="yes">이 기능은 로컬 하드 드라이브에서 제거되지만 네트워크에서 실행할 수 있습니다.</String>
588 <String Id="UITextSelNetworkAbsent" Overridable="yes">이 기능은 완전히 제거되며, 네트워크에서 실행할 수 없게 됩니다.</String>
589 <String Id="UITextSelNetworkAdvertise" Overridable="yes">이 기능은 네트워크에서 실행되던 상태에서 필요할 때 설치되는 것으로 변경됩니다.</String>
590 <String Id="UITextSelNetworkLocal" Overridable="yes">이 기능은 네트워크에서 실행되던 상태에서 로컬 하드 드라이브에 설치되는 것으로 변경됩니다.</String>
591 <String Id="UITextSelNetworkNetwork" Overridable="yes">이 기능은 그대로 네트워크에서 실행됩니다.</String>
592 <String Id="UITextSelParentCostNegNeg" Overridable="yes">이 기능은 하드 드라이브에 [1]의 공간을 만듭니다. [3]개의 하위 기능 중 [2]개가 선택되었습니다. 하위 기능은 하드 드라이브에 [4]의 공간을 만듭니다.</String>
593 <String Id="UITextSelParentCostNegPos" Overridable="yes">이 기능은 하드 드라이브에 [1]의 공간을 만듭니다. [3]개의 하위 기능 중 [2]개가 선택되었습니다. 하위 기능을 사용하려면 하드 드라이브에 [4]이(가) 있어야 합니다.</String>
594 <String Id="UITextSelParentCostPosNeg" Overridable="yes">이 기능을 사용하려면 하드 드라이브에 [1]이(가) 있어야 합니다. [3]개의 하위 기능 중 [2]개가 선택되었습니다. 하위 기능은 하드 드라이브에 [4]의 공간을 만듭니다.</String>
595 <String Id="UITextSelParentCostPosPos" Overridable="yes">이 기능을 사용하려면 하드 드라이브에 [1]이(가) 있어야 합니다. [3]개의 하위 기능 중 [2]개가 선택되었습니다. 하위 기능을 사용하려면 하드 드라이브에 [4]이(가) 있어야 합니다.</String>
596 <String Id="UITextTimeRemaining" Overridable="yes">남은 시간: {[1]분 }{[2]초}</String>
597 <String Id="UITextVolumeCostAvailable" Overridable="yes">사용 가능한 공간</String>
598 <String Id="UITextVolumeCostDifference" Overridable="yes">차이</String>
599 <String Id="UITextVolumeCostRequired" Overridable="yes">필요한 공간</String>
600 <String Id="UITextVolumeCostSize" Overridable="yes">디스크 크기</String>
601 <String Id="UITextVolumeCostVolume" Overridable="yes">볼륨</String>
602</WixLocalization>
diff --git a/src/ext/UI/wixlib/WixUI_lt-LT.wxl b/src/ext/UI/wixlib/WixUI_lt-LT.wxl
new file mode 100644
index 00000000..80ce72a9
--- /dev/null
+++ b/src/ext/UI/wixlib/WixUI_lt-LT.wxl
@@ -0,0 +1,598 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3
4
5<WixLocalization Culture="lt-lt" Codepage="1257" xmlns="http://wixtoolset.org/schemas/v4/wxl">
6 <String Id="WixUIBack" Overridable="yes">&amp;Atgal</String>
7 <String Id="WixUINext" Overridable="yes">&amp;Pirmyn</String>
8 <String Id="WixUICancel" Overridable="yes">Atšaukti</String>
9 <String Id="WixUIFinish" Overridable="yes">&amp;Baigti</String>
10 <String Id="WixUIRetry" Overridable="yes">&amp;Kartoti</String>
11 <String Id="WixUIIgnore" Overridable="yes">&amp;Nepaisyti</String>
12 <String Id="WixUIYes" Overridable="yes">&amp;Taip</String>
13 <String Id="WixUINo" Overridable="yes">&amp;Ne</String>
14 <String Id="WixUIOK" Overridable="yes">Gerai</String>
15 <String Id="WixUIPrint" Overridable="yes">&amp;Spausdinti</String>
16
17 <String Id="AdvancedWelcomeEulaDlg_Title" Overridable="yes">[ProductName] sąranka</String>
18 <String Id="AdvancedWelcomeEulaDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
19 <String Id="AdvancedWelcomeEulaDlgTitle" Overridable="yes">{\WixUI_Font_Title}Perskaitykite [ProductName] licencijos sutartį</String>
20 <String Id="AdvancedWelcomeEulaDlgLicenseAcceptedCheckBox" Overridable="yes">&amp;Sutinku su licencijos sutarties sąlygomis</String>
21 <String Id="AdvancedWelcomeEulaDlgDescriptionPerMachine" Overridable="yes">Spustelėkite Diegti, norėdami įdiegti produktą visiems vartotojams su numatytosiomis parinktimis. Spustelėkite Išsamiau, norėdami pakeisti diegimo parinktis.</String>
22 <String Id="AdvancedWelcomeEulaDlgDescriptionPerUser" Overridable="yes">Spustelėkite Diegti, norėdami įdiegti produktą su numatytosiomis parinktimis tik sau. Spustelėkite Išsamiau, norėdami pakeisti diegimo parinktis.</String>
23 <String Id="AdvancedWelcomeEulaDlgInstall" Overridable="yes">&amp;Diegti</String>
24 <String Id="AdvancedWelcomeEulaDlgAdvanced" Overridable="yes">I&amp;šsamiau</String>
25 <String Id="Advanced_Font_Normal_Size" Overridable="yes">8</String>
26 <String Id="Advanced_Font_Bigger_Size" Overridable="yes">12</String>
27 <String Id="Advanced_Font_Title_Size" Overridable="yes">9</String>
28 <String Id="Advanced_Font_Emphasized_Size" Overridable="yes">8</String>
29 <String Id="Advanced_Font_FaceName" Overridable="yes">„Tahoma“</String>
30
31 <String Id="BrowseDlg_Title" Overridable="yes">[ProductName] sąranka</String>
32 <String Id="BrowseDlgComboLabel" Overridable="yes">&amp;Kur ieškoti:</String>
33 <String Id="BrowseDlgWixUI_Bmp_Up" Overridable="yes">WixUI_Bmp_Up</String>
34 <String Id="BrowseDlgWixUI_Bmp_UpTooltip" Overridable="yes">Vienu lygiu aukščiau</String>
35 <String Id="BrowseDlgNewFolder" Overridable="yes">WixUI_Bmp_New</String>
36 <String Id="BrowseDlgNewFolderTooltip" Overridable="yes">Kurti naują aplanką</String>
37 <String Id="BrowseDlgPathLabel" Overridable="yes">&amp;Aplanko pavadinimas:</String>
38 <String Id="BrowseDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
39 <String Id="BrowseDlgDescription" Overridable="yes">Eiti į paskirties aplanką</String>
40 <String Id="BrowseDlgTitle" Overridable="yes">{\WixUI_Font_Title}Keisti paskirties aplanką</String>
41
42 <String Id="CancelDlg_Title" Overridable="yes">[ProductName] sąranka</String>
43 <String Id="CancelDlgText" Overridable="yes">Ar tikrai norite atšaukti [ProductName] diegimą?</String>
44 <String Id="CancelDlgIcon" Overridable="yes">WixUI_Ico_Info</String>
45 <String Id="CancelDlgIconTooltip" Overridable="yes">Informacijos piktograma</String>
46
47 <String Id="CustomizeDlg_Title" Overridable="yes">[ProductName] sąranka</String>
48 <String Id="CustomizeDlgTree" Overridable="yes">Parinkčių medis</String>
49 <String Id="CustomizeDlgBrowse" Overridable="yes">N&amp;aršyti...</String>
50 <String Id="CustomizeDlgReset" Overridable="yes">Nu&amp;statyti iš naujo</String>
51 <String Id="CustomizeDlgDiskCost" Overridable="yes">Disko &amp;naudojimas</String>
52 <String Id="CustomizeDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
53 <String Id="CustomizeDlgText" Overridable="yes">Spustelėkite toliau medyje esančias piktogramas, norėdami pakeisti priemonių diegimo būdą.</String>
54 <String Id="CustomizeDlgDescription" Overridable="yes">Pažymėkite, kaip norite įdiegti priemones.</String>
55 <String Id="CustomizeDlgTitle" Overridable="yes">{\WixUI_Font_Title}Pasirinktinė sąranka</String>
56 <String Id="CustomizeDlgItemDescription" Overridable="yes">CustomizeDlgItemDescription-CustomizeDlgItemDescription</String>
57 <String Id="CustomizeDlgItemSize" Overridable="yes">CustomizeDlgItemSize-CustomizeDlgItemSize</String>
58 <String Id="CustomizeDlgLocation" Overridable="yes">CustomizeDlgLocation-CustomizeDlgLocation</String>
59 <String Id="CustomizeDlgLocationLabel" Overridable="yes">Vieta:</String>
60
61 <String Id="DiskCostDlg_Title" Overridable="yes">[ProductName] sąranka</String>
62 <String Id="DiskCostDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
63 <String Id="DiskCostDlgText" Overridable="yes">Paryškintuose tomuose nepakanka vietos pasirinktoms priemonėms. Galite pašalinti kai kuriuos failus iš paryškintų tomų, įdiegti naujų priemonių arba pasirinkti kitus paskirties diskus.</String>
64 <String Id="DiskCostDlgDescription" Overridable="yes">Reikalinga vieta diske pažymėtoms priemonėms diegti.</String>
65 <String Id="DiskCostDlgTitle" Overridable="yes">{\WixUI_Font_Title}Diske reikalinga vieta</String>
66 <String Id="DiskCostDlgVolumeList" Overridable="yes">{120}{70}{70}{70}{70}</String>
67
68 <String Id="ErrorDlg_Title" Overridable="yes">[ProductName] sąranka</String>
69 <String Id="ErrorDlgErrorText" Overridable="yes">Informacinis tekstas</String>
70 <String Id="ErrorDlgErrorIcon" Overridable="yes">WixUI_Ico_Info</String>
71 <String Id="ErrorDlgErrorIconTooltip" Overridable="yes">Informacijos piktograma</String>
72
73 <String Id="ExitDialog_Title" Overridable="yes">[ProductName] sąranka</String>
74 <String Id="ExitDialogBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
75 <String Id="ExitDialogDescription" Overridable="yes">Norėdami uždaryti sąrankos vedlį, spustelėkite mygtuką Baigti.</String>
76 <String Id="ExitDialogTitle" Overridable="yes">{\WixUI_Font_Bigger}Atlikti [ProductName] sąrankos vedlio nurodymai</String>
77
78 <String Id="FatalError_Title" Overridable="yes">[ProductName] sąranka</String>
79 <String Id="FatalErrorBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
80 <String Id="FatalErrorTitle" Overridable="yes">{\WixUI_Font_Bigger}[ProductName] sąrankos vedlys nutrūko per anksti</String>
81 <String Id="FatalErrorDescription1" Overridable="yes">[ProductName] sąrankos vedlys nustojo dirbti per anksti dėl klaidos. Sistema nebuvo modifikuota. Norėdami įdiegti šią programą vėliau, vėl paleiskite sąrankos vedlį.</String>
82 <String Id="FatalErrorDescription2" Overridable="yes">Norėdami uždaryti sąrankos vedlį, spustelėkite mygtuką Baigti.</String>
83
84 <String Id="FeaturesDlg_Title" Overridable="yes">[ProductName] sąranka</String>
85 <String Id="FeaturesDlgTree" Overridable="yes">Produkto priemonės</String>
86 <String Id="FeaturesDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
87 <String Id="FeaturesDlgDescription" Overridable="yes">Pažymėkite, kaip norite įdiegti priemones.</String>
88 <String Id="FeaturesDlgTitle" Overridable="yes">{\WixUI_Font_Title}Produkto priemonės</String>
89 <String Id="FeaturesDlgItemDescription" Overridable="yes">FeaturesDlgItemDescription</String>
90 <String Id="FeaturesDlgItemSize" Overridable="yes">FeaturesDlgItemSize</String>
91 <String Id="FeaturesDlgInstall" Overridable="yes">&amp;Diegti</String>
92 <String Id="FeaturesDlgChange" Overridable="yes">&amp;Keisti</String>
93
94 <String Id="FilesInUse_Title" Overridable="yes">[ProductName] sąranka</String>
95 <String Id="FilesInUseExit" Overridable="yes">I&amp;šeiti</String>
96 <String Id="FilesInUseBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
97 <String Id="FilesInUseText" Overridable="yes">Šios programos naudoja sąrankos metu būtinus atnaujinti failus. Uždarykite šias programas, tada norėdami tęsti diegimą spustelėkite mygtuką &amp;Kartoti arba norėdami iš jo išeiti spustelėkite mygtuką Išeiti.</String>
98 <String Id="FilesInUseDescription" Overridable="yes">Kai kurie failai, kuriuos reikia atnaujinti, šiuo metu naudojami.</String>
99 <String Id="FilesInUseTitle" Overridable="yes">{\WixUI_Font_Title}Naudojami failai</String>
100
101 <String Id="InstallDirDlg_Title" Overridable="yes">[ProductName] sąranka</String>
102 <String Id="InstallDirDlgChange" Overridable="yes">&amp;Keisti...</String>
103 <String Id="InstallDirDlgTitle" Overridable="yes">{\WixUI_Font_Title}Paskirties aplankas</String>
104 <String Id="InstallDirDlgDescription" Overridable="yes">Spustelėkite Pirmyn, norėdami įdiegti numatytajame aplanke, arba spustelėkite Keisti, norėdami pasirinkti kitą.</String>
105 <String Id="InstallDirDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
106 <String Id="InstallDirDlgFolderLabel" Overridable="yes">Diegti „[ProductName]“ į:</String>
107
108 <String Id="InstallScopeDlg_Title" Overridable="yes">[ProductName] sąranka</String>
109 <String Id="InstallScopeDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
110 <String Id="InstallScopeDlgDescription" Overridable="yes">Pasirinkite diegimo aprėptį ir aplanką</String>
111 <String Id="InstallScopeDlgTitle" Overridable="yes">{\WixUI_Font_Title}Diegimo aprėptis</String>
112 <String Id="InstallScopeDlgPerUser" Overridable="yes">{\WixUI_Font_Emphasized}Diegti &amp;tik sau ([LogonUser])</String>
113 <String Id="InstallScopeDlgPerUserDescription" Overridable="yes">[ProductName] bus įdiegta vartotojo aplanke ir bus pasiekiama tik jūsų vartotojo abonementui. Nereikia turėti vietinio administratoriaus teisių.</String>
114 <String Id="InstallScopeDlgNoPerUserDescription" Overridable="yes">[ProductName] nepalaiko vartotojo įdiegties.</String>
115 <String Id="InstallScopeDlgPerMachine" Overridable="yes">{\WixUI_Font_Emphasized}Diegti visiems šio &amp;kompiuterio vartotojams</String>
116 <String Id="InstallScopeDlgPerMachineDescription" Overridable="yes">[ProductName] bus pagal numatytuosius nustatymus įdiegta kompiuterio aplanke ir pasiekiama visiems vartotojams. Galite pakeisti numatytąjį diegimo aplanką.</String>
117 <String Id="InstallScopeDlgFolderLabel" Overridable="yes">Diegimo &amp;aplankas:</String>
118 <String Id="InstallScopeDlgChange" Overridable="yes">&amp;Keisti...</String>
119
120 <String Id="InvalidDirDlg_Title" Overridable="yes">[ProductName] sąranka</String>
121 <String Id="InvalidDirDlgText" Overridable="yes">Diegimo katalogas turi būti vietiniame standžiajame diske.</String>
122 <String Id="InvalidDirDlgIcon" Overridable="yes">WixUI_Ico_Info</String>
123 <String Id="InvalidDirDlgIconTooltip" Overridable="yes">Informacijos piktograma</String>
124
125 <String Id="LicenseAgreementDlg_Title" Overridable="yes">[ProductName] sąranka</String>
126 <String Id="LicenseAgreementDlgLicenseAcceptedCheckBox" Overridable="yes">&amp;Sutinku su licencijos sutarties sąlygomis</String>
127 <String Id="LicenseAgreementDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
128 <String Id="LicenseAgreementDlgDescription" Overridable="yes">Atidžiai perskaitykite šią licencijos sutartį</String>
129 <String Id="LicenseAgreementDlgTitle" Overridable="yes">{\WixUI_Font_Title}Galutinio vartotojo licencijos sutartis</String>
130
131 <String Id="MaintenanceTypeDlg_Title" Overridable="yes">[ProductName] sąranka</String>
132 <String Id="MaintenanceTypeDlgChangeButton" Overridable="yes">&amp;Keisti</String>
133 <String Id="MaintenanceTypeDlgChangeButtonTooltip" Overridable="yes">Keisti įdiegtį</String>
134 <String Id="MaintenanceTypeDlgRepairButton" Overridable="yes">Ta&amp;isyti</String>
135 <String Id="MaintenanceTypeDlgRepairButtonTooltip" Overridable="yes">Taisyti įdiegtį</String>
136 <String Id="MaintenanceTypeDlgRemoveButton" Overridable="yes">&amp;Šalinti</String>
137 <String Id="MaintenanceTypeDlgRemoveButtonTooltip" Overridable="yes">Šalinti įdiegtį</String>
138 <String Id="MaintenanceTypeDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
139 <String Id="MaintenanceTypeDlgDescription" Overridable="yes">Pažymėkite norimą atlikti operaciją.</String>
140 <String Id="MaintenanceTypeDlgTitle" Overridable="yes">{\WixUI_Font_Title}Įdiegties keitimas, taisymas arba šalinimas</String>
141 <String Id="MaintenanceTypeDlgChangeText" Overridable="yes">Leidžia keisti priemonių diegimo būdą.</String>
142 <String Id="MaintenanceTypeDlgChangeDisabledText" Overridable="yes">[ProductName] nėra atskirai pasirenkamų priemonių.</String>
143 <String Id="MaintenanceTypeDlgRemoveText" Overridable="yes">Pašalina [ProductName] iš kompiuterio.</String>
144 <String Id="MaintenanceTypeDlgRemoveDisabledText" Overridable="yes">[ProductName] negalima pašalinti.</String>
145 <String Id="MaintenanceTypeDlgRepairText" Overridable="yes">Ištaiso naujausios įdiegties klaidas pataisydama trūkstamus ir sugadintus failus, sparčiąsias nuorodas ir registro įrašus.</String>
146 <String Id="MaintenanceTypeDlgRepairDisabledText" Overridable="yes">[ProductName] negalima pataisyti.</String>
147
148 <String Id="MaintenanceWelcomeDlg_Title" Overridable="yes">[ProductName] sąranka</String>
149 <String Id="MaintenanceWelcomeDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
150 <String Id="MaintenanceWelcomeDlgDescription" Overridable="yes">Sąrankos vedlys leidžia keisti būdą, kuriuo [ProductName] priemonės yra diegiamos jūsų kompiuteryje, ar pašalinti jas iš jūsų kompiuterio. Norėdami, kad sąrankos vedlys tęstų savo darbą, spustelėkite mygtuką Pirmyn, o norėdami išeiti iš jo, spustelėkite mygtuką Atšaukti.</String>
151 <String Id="MaintenanceWelcomeDlgTitle" Overridable="yes">{\WixUI_Font_Bigger}Sveiki! Čia [ProductName] sąrankos vedlys</String>
152
153 <String Id="MsiRMFilesInUse_Title" Overridable="yes">[ProductName] sąranka</String>
154 <String Id="MsiRMFilesInUseBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
155 <String Id="MsiRMFilesInUseText" Overridable="yes">Šios programos naudoja sąrankos metu būtinus atnaujinti failus. Galite leisti sąrankos vedliui juos uždaryti ir bandyti paleisti iš naujo arba vėliau perkrauti kompiuterį.</String>
156 <String Id="MsiRMFilesInUseDescription" Overridable="yes">Kai kurie failai, kuriuos reikia atnaujinti, šiuo metu naudojami.</String>
157 <String Id="MsiRMFilesInUseTitle" Overridable="yes">{\WixUI_Font_Title}Naudojami failai</String>
158 <String Id="MsiRMFilesInUseUseRM" Overridable="yes">&amp;Uždarykite programas ir pabandykite paleisti jas iš naujo.</String>
159 <String Id="MsiRMFilesInUseDontUseRM" Overridable="yes">&amp;Neuždarykite programų. Reikės iš naujo paleisti kompiuterį.</String>
160
161 <String Id="OutOfDiskDlg_Title" Overridable="yes">[ProductName] sąranka</String>
162 <String Id="OutOfDiskDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
163 <String Id="OutOfDiskDlgText" Overridable="yes">Pažymėtuose tomuose nėra pakankamai vietos, kurią būtų galima panaudoti nurodytoms priemonėms įdiegti. Galite pašalinti kai kuriuos failus iš pažymėtų tomų, įdiegti mažiau priemonių arba pasirinkti kitą paskirties diską.</String>
164 <String Id="OutOfDiskDlgDescription" Overridable="yes">Įdiegčiai reikia daugiau vietos, nei jos yra diske.</String>
165 <String Id="OutOfDiskDlgTitle" Overridable="yes">{\WixUI_Font_Title}Diske neliko vietos</String>
166 <String Id="OutOfDiskDlgVolumeList" Overridable="yes">{120}{70}{70}{70}{70}</String>
167
168 <String Id="OutOfRbDiskDlg_Title" Overridable="yes">[ProductName] sąranka</String>
169 <String Id="OutOfRbDiskDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
170 <String Id="OutOfRbDiskDlgText" Overridable="yes">Pažymėtuose tomuose nėra pakankamai vietos, kurią būtų galima panaudoti nurodytoms priemonėms įdiegti. Galite pašalinti kai kuriuos failus iš pažymėtų tomų, įdiegti mažiau priemonių arba pasirinkti kitą paskirties diską.</String>
171 <String Id="OutOfRbDiskDlgDescription" Overridable="yes">Įdiegčiai reikia daugiau vietos, nei jos yra diske.</String>
172 <String Id="OutOfRbDiskDlgTitle" Overridable="yes">{\WixUI_Font_Title}Diske neliko vietos</String>
173 <String Id="OutOfRbDiskDlgVolumeList" Overridable="yes">{120}{70}{70}{70}{70}</String>
174 <String Id="OutOfRbDiskDlgText2" Overridable="yes">Arba galite pasirinkti išjungti diegimo programos keitimų atšaukimo funkcijas. Išjungus keitimų atšaukimą, diegimo programa negalės atkurti kompiuterio pradinės būsenos, jei diegimas būtų kaip nors nutrauktas. Spustelėkite Taip, jei norite surizikuoti ir išjungti keitimų atšaukimą.</String>
175
176 <String Id="PrepareDlg_Title" Overridable="yes">[ProductName] sąranka</String>
177 <String Id="PrepareDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
178 <String Id="PrepareDlgDescription" Overridable="yes">Palaukite, kol sąrankos vedlys pasiruoš vadovauti diegimo procesui.</String>
179 <String Id="PrepareDlgTitle" Overridable="yes">{\WixUI_Font_Bigger}Sveiki! Čia [ProductName] sąrankos vedlys</String>
180
181 <String Id="ProgressDlg_Title" Overridable="yes">[ProductName] sąranka</String>
182 <String Id="ProgressDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
183 <String Id="ProgressDlgTextInstalling" Overridable="yes">Palaukite, kol sąrankos vedlys įdiegs [ProductName].</String>
184 <String Id="ProgressDlgTitleInstalling" Overridable="yes">{\WixUI_Font_Title}[ProductName] diegimas</String>
185 <String Id="ProgressDlgTextChanging" Overridable="yes">Palaukite, kol sąrankos vedlys pakeis [ProductName].</String>
186 <String Id="ProgressDlgTitleChanging" Overridable="yes">{\WixUI_Font_Title}[ProductName] keitimas</String>
187 <String Id="ProgressDlgTextRepairing" Overridable="yes">Palaukite, kol sąrankos vedlys pataisys [ProductName].</String>
188 <String Id="ProgressDlgTitleRepairing" Overridable="yes">{\WixUI_Font_Title}[ProductName] taisymass</String>
189 <String Id="ProgressDlgTextRemoving" Overridable="yes">Palaukite, kol sąrankos vedlys pašalins [ProductName].</String>
190 <String Id="ProgressDlgTitleRemoving" Overridable="yes">{\WixUI_Font_Title}[ProductName] šalinimas</String>
191 <String Id="ProgressDlgTextUpdating" Overridable="yes">Palaukite, kol sąrankos vedlys atnaujins [ProductName].</String>
192 <String Id="ProgressDlgTitleUpdating" Overridable="yes">{\WixUI_Font_Title}[ProductName] naujinimas</String>
193 <String Id="ProgressDlgProgressBar" Overridable="yes">Atlikta</String>
194 <String Id="ProgressDlgStatusLabel" Overridable="yes">Būsena:</String>
195
196 <String Id="ResumeDlg_Title" Overridable="yes">[ProductName] sąranka</String>
197 <String Id="ResumeDlgInstall" Overridable="yes">&amp;Diegti</String>
198 <String Id="ResumeDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
199 <String Id="ResumeDlgDescription" Overridable="yes">Sąrankos vedlys baigs diegti [ProductName] jūsų kompiuteryje. Norėdami tęsti spustelėkite mygtuką Diegti, o norėdami išeiti iš sąrankos vedlio, spustelėkite mygtuką Atšaukti.</String>
200 <String Id="ResumeDlgTitle" Overridable="yes">{\WixUI_Font_Bigger}[ProductName] sąrankos vedlys tęsia darbą</String>
201
202 <String Id="SetupTypeDlg_Title" Overridable="yes">[ProductName] sąranka</String>
203 <String Id="SetupTypeDlgTypicalButton" Overridable="yes">&amp;Įprastas</String>
204 <String Id="SetupTypeDlgTypicalButtonTooltip" Overridable="yes">Įprastas diegimas</String>
205 <String Id="SetupTypeDlgCustomButton" Overridable="yes">P&amp;asirinktinis</String>
206 <String Id="SetupTypeDlgCustomButtonTooltip" Overridable="yes">Pasirinktinis diegimas</String>
207 <String Id="SetupTypeDlgCompleteButton" Overridable="yes">V&amp;isas</String>
208 <String Id="SetupTypeDlgCompleteButtonTooltip" Overridable="yes">Visas diegimas</String>
209 <String Id="SetupTypeDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
210 <String Id="SetupTypeDlgTitle" Overridable="yes">{\WixUI_Font_Title}Pasirinkite sąrankos tipą</String>
211 <String Id="SetupTypeDlgDescription" Overridable="yes">Pasirinkite sąrankos tipą, kuris geriausiai atitinka jūsų poreikius</String>
212 <String Id="SetupTypeDlgTypicalText" Overridable="yes">Diegia dažniausias programos priemones. Rekomenduojama daugumai vartotojų.</String>
213 <String Id="SetupTypeDlgCustomText" Overridable="yes">Leidžia vartotojams pasirinkti, kurias programos priemones diegti ir diegimo vietą. Rekomenduojama pažengusiems vartotojams.</String>
214 <String Id="SetupTypeDlgCompleteText" Overridable="yes">Bus įdiegtos visos programos priemonės. Reikia daugiausia disko vietos.</String>
215
216 <String Id="UserExit_Title" Overridable="yes">[ProductName] sąranka</String>
217 <String Id="UserExitBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
218 <String Id="UserExitTitle" Overridable="yes">{\WixUI_Font_Bigger}[ProductName] sąrankos vedlio darbas nutrūko</String>
219 <String Id="UserExitDescription1" Overridable="yes">[ProductName] sąranka nutrūko. Sistema nebuvo modifikuota. Norėdami įdiegti šią programą vėliau, vėl paleiskite diegimą.</String>
220 <String Id="UserExitDescription2" Overridable="yes">Norėdami uždaryti sąrankos vedlį, spustelėkite mygtuką Baigti.</String>
221
222 <String Id="VerifyReadyDlg_Title" Overridable="yes">[ProductName] sąranka</String>
223 <String Id="VerifyReadyDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
224 <String Id="VerifyReadyDlgInstall" Overridable="yes">&amp;Diegti</String>
225 <String Id="VerifyReadyDlgInstallText" Overridable="yes">Norėdami pradėti diegti, spustelėkite mygtuką Diegti. Norėdami peržiūrėti ar pakeisti bet kurį diegimo parametrą spustelėkite mygtuką Atgal. Norėdami išeiti iš vedlio spustelėkite mygtuką Atšaukti.</String>
226 <String Id="VerifyReadyDlgInstallTitle" Overridable="yes">{\WixUI_Font_Title}Parengta diegti [ProductName]</String>
227 <String Id="VerifyReadyDlgChange" Overridable="yes">&amp;Keisti</String>
228 <String Id="VerifyReadyDlgChangeText" Overridable="yes">Norėdami pradėti diegti spustelėkite mygtuką Keisti. Norėdami peržiūrėti ar pakeisti bet kurį diegimo parametrą spustelėkite mygtuką Atgal. Norėdami išeiti iš vedlio spustelėkite mygtuką Atšaukti.</String>
229 <String Id="VerifyReadyDlgChangeTitle" Overridable="yes">{\WixUI_Font_Title}Parengta keisti [ProductName]</String>
230 <String Id="VerifyReadyDlgRepair" Overridable="yes">Ta&amp;isyti</String>
231 <String Id="VerifyReadyDlgRepairText" Overridable="yes">Norėdami taisyti [ProductName] įdiegtį, spustelėkite mygtuką Taisyti. Norėdami peržiūrėti ar pakeisti bet kurį diegimo parametrą, spustelėkite mygtuką Atgal. Norėdami išeiti iš vedlio spustelėkite mygtuką Atšaukti.</String>
232 <String Id="VerifyReadyDlgRepairTitle" Overridable="yes">{\WixUI_Font_Title}Parengta taisyti [ProductName]</String>
233 <String Id="VerifyReadyDlgRemove" Overridable="yes">&amp;Šalinti</String>
234 <String Id="VerifyReadyDlgRemoveText" Overridable="yes">Norėdami pašalinti [ProductName] iš savo kompiuterio, spustelėkite mygtuką Pašalinti. Norėdami peržiūrėti ar pakeisti bet kurį diegimo parametrą spustelėkite mygtuką Atgal. Norėdami išeiti iš vedlio spustelėkite mygtuką Atšaukti.</String>
235 <String Id="VerifyReadyDlgRemoveTitle" Overridable="yes">{\WixUI_Font_Title}Parengta pašalinti [ProductName]</String>
236 <String Id="VerifyReadyDlgUpdate" Overridable="yes">&amp;Naujinti</String>
237 <String Id="VerifyReadyDlgUpdateText" Overridable="yes">Spustelėkite Naujinti, norėdami atnaujinti [ProductName] iš savo kompiuterio. Spustelėkite Atgal, norėdami peržiūrėti arba pakeisti kuriuos nors diegimo parametrus. Spustelėkite Atšaukti, norėdami uždaryti vedlį.</String>
238 <String Id="VerifyReadyDlgUpdateTitle" Overridable="yes">{\WixUI_Font_Title}Parengta naujinti [ProductName]</String>
239
240 <String Id="WaitForCostingDlg_Title" Overridable="yes">[ProductName] sąranka</String>
241 <String Id="WaitForCostingDlgReturn" Overridable="yes">&amp;Grįžti</String>
242 <String Id="WaitForCostingDlgText" Overridable="yes">Palaukite, kol diegimo programa nustatys jūsų disko vietos reikalavimus.</String>
243 <String Id="WaitForCostingDlgIcon" Overridable="yes">WixUI_Ico_Exclam</String>
244 <String Id="WaitForCostingDlgIconTooltip" Overridable="yes">Šauktuko piktograma</String>
245
246 <String Id="WelcomeDlg_Title" Overridable="yes">[ProductName] sąranka</String>
247 <String Id="WelcomeDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
248 <String Id="WelcomeDlgDescription" Overridable="yes">Sąrankos vedlys įdiegs [ProductName] jūsų kompiuteryje. Jei norite tęsti, spustelėkite Pirmyn, jei norite baigti darbą su sąrankos vedliu, spustelėkite Atšaukti.</String>
249 <String Id="WelcomeUpdateDlgDescriptionUpdate" Overridable="yes">Sąrankos vedlys atnaujins [ProductName] jūsų kompiuteryje. Spustelėkite Pirmyn, norėdami tęsti, arba spustelėkite Atšaukti, norėdami uždaryti sąrankos vedlį.</String>
250 <String Id="WelcomeDlgTitle" Overridable="yes">{\WixUI_Font_Bigger}Sąrankos vedlys atnaujins [ProductName]</String>
251
252 <String Id="WelcomeEulaDlg_Title" Overridable="yes">[ProductName] sąranka</String>
253 <String Id="WelcomeEulaDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
254 <String Id="WelcomeEulaDlgLicenseAcceptedCheckBox" Overridable="yes">&amp;Sutinku su licencijos sutarties sąlygomis</String>
255 <String Id="WelcomeEulaDlgInstall" Overridable="yes">&amp;Diegti</String>
256 <String Id="WelcomeEulaDlgUpdate" Overridable="yes">&amp;Naujinti</String>
257 <String Id="WelcomeEulaDlgTitle" Overridable="yes">{\WixUI_Font_Title}Perskaitykite [ProductName] licencijos sutartį</String>
258
259 <String Id="ProgressTextInstallValidate" Overridable="yes">Tikrinama įdiegtis</String>
260 <String Id="ProgressTextInstallFiles" Overridable="yes">Kopijuojami nauji failai</String>
261 <String Id="ProgressTextInstallFilesTemplate" Overridable="yes">Failas: [1], katalogas: [9], dydis: [6]</String>
262 <String Id="ProgressTextInstallAdminPackage" Overridable="yes">Kopijuojami diegimo failai iš tinklo</String>
263 <String Id="ProgressTextInstallAdminPackageTemplate" Overridable="yes">Failas: [1], katalogas: [9], dydis: [6]</String>
264 <String Id="ProgressTextFileCost" Overridable="yes">Skaičiuojama, kiek reikia vietos</String>
265 <String Id="ProgressTextCostInitialize" Overridable="yes">Skaičiuojama, kiek reikia vietos</String>
266 <String Id="ProgressTextCostFinalize" Overridable="yes">Skaičiuojama, kiek reikia vietos</String>
267 <String Id="ProgressTextCreateShortcuts" Overridable="yes">Kuriamos nuorodos</String>
268 <String Id="ProgressTextCreateShortcutsTemplate" Overridable="yes">Nuoroda: [1]</String>
269 <String Id="ProgressTextPublishComponents" Overridable="yes">Skelbiami sąlyginiai komponentai</String>
270 <String Id="ProgressTextPublishComponentsTemplate" Overridable="yes">Komponento ID: [1], kvalifikatorius: [2]</String>
271 <String Id="ProgressTextPublishFeatures" Overridable="yes">Skelbiamos produkto priemonės</String>
272 <String Id="ProgressTextPublishFeaturesTemplate" Overridable="yes">Priemonė: [1]</String>
273 <String Id="ProgressTextPublishProduct" Overridable="yes">Skelbiama produkto informacija</String>
274 <String Id="ProgressTextRegisterClassInfo" Overridable="yes">Registruojami klasės serveriai</String>
275 <String Id="ProgressTextRegisterClassInfoTemplate" Overridable="yes">Klasės ID: [1]</String>
276 <String Id="ProgressTextRegisterExtensionInfo" Overridable="yes">Registruojami plėtinių serveriai</String>
277 <String Id="ProgressTextRegisterExtensionInfoTemplate" Overridable="yes">Plėtinys: [1]</String>
278 <String Id="ProgressTextRegisterMIMEInfo" Overridable="yes">Registruojama MIME informacija</String>
279 <String Id="ProgressTextRegisterMIMEInfoTemplate" Overridable="yes">MIME turinio tipas: [1], plėtinys: [2]</String>
280 <String Id="ProgressTextRegisterProgIdInfo" Overridable="yes">Registruojami programos identifikatoriai</String>
281 <String Id="ProgressTextRegisterProgIdInfoTemplate" Overridable="yes">ProgId: [1]</String>
282 <String Id="ProgressTextAllocateRegistrySpace" Overridable="yes">Priskiriama vieta registre</String>
283 <String Id="ProgressTextAllocateRegistrySpaceTemplate" Overridable="yes">Laisva vieta: [1]</String>
284 <String Id="ProgressTextAppSearch" Overridable="yes">Ieškoma įdiegtų taikomųjų programų</String>
285 <String Id="ProgressTextAppSearchTemplate" Overridable="yes">Ypatybė: [1], parašas: [2]</String>
286 <String Id="ProgressTextBindImage" Overridable="yes">Susietosios vykdomosios programos</String>
287 <String Id="ProgressTextBindImageTemplate" Overridable="yes">Failas: [1]</String>
288 <String Id="ProgressTextCCPSearch" Overridable="yes">Ieškoma tinkamų produktų</String>
289 <String Id="ProgressTextCreateFolders" Overridable="yes">Kuriami aplankai</String>
290 <String Id="ProgressTextCreateFoldersTemplate" Overridable="yes">Aplankas: [1]</String>
291 <String Id="ProgressTextDeleteServices" Overridable="yes">Naikinamos tarnybos</String>
292 <String Id="ProgressTextDeleteServicesTemplate" Overridable="yes">Tarnyba: [1]</String>
293 <String Id="ProgressTextDuplicateFiles" Overridable="yes">Kuriamos failų kopijos</String>
294 <String Id="ProgressTextDuplicateFilesTemplate" Overridable="yes">Failas: [1], katalogas: [9], dydis: [6]</String>
295 <String Id="ProgressTextFindRelatedProducts" Overridable="yes">Ieškoma susijusių taikomųjų programų</String>
296 <String Id="ProgressTextFindRelatedProductsTemplate" Overridable="yes">Rasta taikomoji programa: [1]</String>
297 <String Id="ProgressTextInstallODBC" Overridable="yes">Diegiami ODBC komponentai</String>
298 <String Id="ProgressTextInstallServices" Overridable="yes">Diegiamos naujos tarnybos</String>
299 <String Id="ProgressTextInstallServicesTemplate" Overridable="yes">Tarnyba: [2]</String>
300 <String Id="ProgressTextLaunchConditions" Overridable="yes">Vertinamos paleidimo sąlygos</String>
301 <String Id="ProgressTextMigrateFeatureStates" Overridable="yes">Perkeliamos priemonių būsenos iš susijusių taikomųjų programų</String>
302 <String Id="ProgressTextMigrateFeatureStatesTemplate" Overridable="yes">Taikomoji programa: [1]</String>
303 <String Id="ProgressTextMoveFiles" Overridable="yes">Perkeliami failai</String>
304 <String Id="ProgressTextMoveFilesTemplate" Overridable="yes">Failas: [1], katalogas: [9], dydis: [6]</String>
305 <String Id="ProgressTextPatchFiles" Overridable="yes">Failams taikomos pataisos</String>
306 <String Id="ProgressTextPatchFilesTemplate" Overridable="yes">Failas: [1], katalogas: [2], dydis: [3]</String>
307 <String Id="ProgressTextProcessComponents" Overridable="yes">Naujinama komponento registracija</String>
308 <String Id="ProgressTextRegisterComPlus" Overridable="yes">Registruojamos COM+ taikomosios programos ir komponentai</String>
309 <String Id="ProgressTextRegisterComPlusTemplate" Overridable="yes">AppId: [1]{{, AppType: [2], vartotojai: [3], RSN: [4]}}</String>
310 <String Id="ProgressTextRegisterFonts" Overridable="yes">Registruojami šriftai</String>
311 <String Id="ProgressTextRegisterFontsTemplate" Overridable="yes">Šriftas: [1]</String>
312 <String Id="ProgressTextRegisterProduct" Overridable="yes">Registruojamas produktas</String>
313 <String Id="ProgressTextRegisterProductTemplate" Overridable="yes">[1]</String>
314 <String Id="ProgressTextRegisterTypeLibraries" Overridable="yes">Registruojamos tipų bibliotekos</String>
315 <String Id="ProgressTextRegisterTypeLibrariesTemplate" Overridable="yes">LibID: [1]</String>
316 <String Id="ProgressTextRegisterUser" Overridable="yes">Registruojamas vartotojas</String>
317 <String Id="ProgressTextRegisterUserTemplate" Overridable="yes">[1]</String>
318 <String Id="ProgressTextRemoveDuplicateFiles" Overridable="yes">Šalinamos failų kopijos</String>
319 <String Id="ProgressTextRemoveDuplicateFilesTemplate" Overridable="yes">Failas: [1], katalogas: [9]</String>
320 <String Id="ProgressTextRemoveEnvironmentStrings" Overridable="yes">Naujinamos aplinkos eilutės</String>
321 <String Id="ProgressTextRemoveEnvironmentStringsTemplate" Overridable="yes">Pavadinimas: [1], reikšmė: [2], veiksmas [3]</String>
322 <String Id="ProgressTextRemoveExistingProducts" Overridable="yes">Šalinamos taikomosios programos</String>
323 <String Id="ProgressTextRemoveExistingProductsTemplate" Overridable="yes">Taikomoji programa: [1], komandos eilutė: [2]</String>
324 <String Id="ProgressTextRemoveFiles" Overridable="yes">Šalinami failai</String>
325 <String Id="ProgressTextRemoveFilesTemplate" Overridable="yes">Failas: [1], katalogas: [9]</String>
326 <String Id="ProgressTextRemoveFolders" Overridable="yes">Šalinami aplankai</String>
327 <String Id="ProgressTextRemoveFoldersTemplate" Overridable="yes">Aplankas: [1]</String>
328 <String Id="ProgressTextRemoveIniValues" Overridable="yes">Šalinami INI failų įrašai</String>
329 <String Id="ProgressTextRemoveIniValuesTemplate" Overridable="yes">Failas: [1], sekcija: [2], raktas: [3], reikšmė: [4]</String>
330 <String Id="ProgressTextRemoveODBC" Overridable="yes">Šalinami ODBC komponentai</String>
331 <String Id="ProgressTextRemoveRegistryValues" Overridable="yes">Šalinamos sistemos registro reikšmės</String>
332 <String Id="ProgressTextRemoveRegistryValuesTemplate" Overridable="yes">Raktas: [1], pavadinimas: [2]</String>
333 <String Id="ProgressTextRemoveShortcuts" Overridable="yes">Šalinamos nuorodos</String>
334 <String Id="ProgressTextRemoveShortcutsTemplate" Overridable="yes">Nuoroda: [1]</String>
335 <String Id="ProgressTextRMCCPSearch" Overridable="yes">Ieškoma tinkamų produktų</String>
336 <String Id="ProgressTextSelfRegModules" Overridable="yes">Registruojami moduliai</String>
337 <String Id="ProgressTextSelfRegModulesTemplate" Overridable="yes">Failas [1], aplankas: [2]</String>
338 <String Id="ProgressTextSelfUnregModules" Overridable="yes">Atšaukiamas modulių registravimas</String>
339 <String Id="ProgressTextSelfUnregModulesTemplate" Overridable="yes">Failas [1], aplankas: [2]</String>
340 <String Id="ProgressTextSetODBCFolders" Overridable="yes">Inicijuojami ODBC katalogai</String>
341 <String Id="ProgressTextStartServices" Overridable="yes">Paleidžiamos tarnybos</String>
342 <String Id="ProgressTextStartServicesTemplate" Overridable="yes">Tarnyba: [1]</String>
343 <String Id="ProgressTextStopServices" Overridable="yes">Sustabdomos tarnybos</String>
344 <String Id="ProgressTextStopServicesTemplate" Overridable="yes">Tarnyba: [1]</String>
345 <String Id="ProgressTextUnpublishComponents" Overridable="yes">Atšaukiamas tinkamų komponentų skelbimas</String>
346 <String Id="ProgressTextUnpublishComponentsTemplate" Overridable="yes">Komponento ID: [1], kvalifikatorius: [2]</String>
347 <String Id="ProgressTextUnpublishFeatures" Overridable="yes">Atšaukiamas produkto priemonių skelbimas</String>
348 <String Id="ProgressTextUnpublishFeaturesTemplate" Overridable="yes">Priemonė: [1]</String>
349 <String Id="ProgressTextUnregisterClassInfo" Overridable="yes">Atšaukiamas klasės serverių registravimas</String>
350 <String Id="ProgressTextUnregisterClassInfoTemplate" Overridable="yes">Klasės ID: [1]</String>
351 <String Id="ProgressTextUnregisterComPlus" Overridable="yes">Atšaukiamas COM+ taikomųjų programų ir komponentų registravimas</String>
352 <String Id="ProgressTextUnregisterComPlusTemplate" Overridable="yes">AppId: [1]{{, AppType: [2]}}</String>
353 <String Id="ProgressTextUnregisterExtensionInfo" Overridable="yes">Atšaukiamas plėtinių serverių registravimas</String>
354 <String Id="ProgressTextUnregisterExtensionInfoTemplate" Overridable="yes">Plėtinys: [1]</String>
355 <String Id="ProgressTextUnregisterFonts" Overridable="yes">Atšaukiamas šriftų registravimas</String>
356 <String Id="ProgressTextUnregisterFontsTemplate" Overridable="yes">Šriftas: [1]</String>
357 <String Id="ProgressTextUnregisterMIMEInfo" Overridable="yes">Atšaukiamas MIME informacijos registravimas</String>
358 <String Id="ProgressTextUnregisterMIMEInfoTemplate" Overridable="yes">MIME turinio tipas: [1], plėtinys: [2]</String>
359 <String Id="ProgressTextUnregisterProgIdInfo" Overridable="yes">Atšaukiamas programos identifikatorių registravimas</String>
360 <String Id="ProgressTextUnregisterProgIdInfoTemplate" Overridable="yes">ProgId: [1]</String>
361 <String Id="ProgressTextUnregisterTypeLibraries" Overridable="yes">Atšaukiamas tipų bibliotekų registravimas</String>
362 <String Id="ProgressTextUnregisterTypeLibrariesTemplate" Overridable="yes">LibID: [1]</String>
363 <String Id="ProgressTextWriteEnvironmentStrings" Overridable="yes">Naujinamos aplinkos eilutės</String>
364 <String Id="ProgressTextWriteEnvironmentStringsTemplate" Overridable="yes">Pavadinimas: [1], reikšmė: [2], veiksmas [3]</String>
365 <String Id="ProgressTextWriteIniValues" Overridable="yes">Rašomos INI failų reikšmės</String>
366 <String Id="ProgressTextWriteIniValuesTemplate" Overridable="yes">Failas: [1], sekcija: [2], raktas: [3], reikšmė: [4]</String>
367 <String Id="ProgressTextWriteRegistryValues" Overridable="yes">Rašomos sistemos registro reikšmės</String>
368 <String Id="ProgressTextWriteRegistryValuesTemplate" Overridable="yes">Raktas: [1], pavadinimas: [2], reikšmė: [3]</String>
369 <String Id="ProgressTextAdvertise" Overridable="yes">Taikomoji reklamos programa</String>
370 <String Id="ProgressTextGenerateScript" Overridable="yes">Generuojamos veiksmo scenarijaus operacijos:</String>
371 <String Id="ProgressTextGenerateScriptTemplate" Overridable="yes">[1]</String>
372 <String Id="ProgressTextInstallSFPCatalogFile" Overridable="yes">Diegiamas sistemos katalogas</String>
373 <String Id="ProgressTextInstallSFPCatalogFileTemplate" Overridable="yes">Failas: [1], priklausomybės: [2]</String>
374 <String Id="ProgressTextMsiPublishAssemblies" Overridable="yes">Skelbiama rinkinio informacija</String>
375 <String Id="ProgressTextMsiPublishAssembliesTemplate" Overridable="yes">Taikomosios programos kontekstas:[1], rinkinio pavadinimas:[2]</String>
376 <String Id="ProgressTextMsiUnpublishAssemblies" Overridable="yes">Atšaukiamas rinkinio informacijos skelbimas</String>
377 <String Id="ProgressTextMsiUnpublishAssembliesTemplate" Overridable="yes">Taikomosios programos kontekstas:[1], rinkinio pavadinimas:[2]</String>
378 <String Id="ProgressTextRollback" Overridable="yes">Atšaukiamas keitimas</String>
379 <String Id="ProgressTextRollbackTemplate" Overridable="yes">[1]</String>
380 <String Id="ProgressTextRollbackCleanup" Overridable="yes">Šalinamos atsarginės failų kopijos</String>
381 <String Id="ProgressTextRollbackCleanupTemplate" Overridable="yes">Failas: [1]</String>
382 <String Id="ProgressTextUnmoveFiles" Overridable="yes">Šalinami perkelti failai</String>
383 <String Id="ProgressTextUnmoveFilesTemplate" Overridable="yes">Failas: [1], katalogas: [9]</String>
384 <String Id="ProgressTextUnpublishProduct" Overridable="yes">Atšaukiamas produkto informacijos skelbimas</String>
385
386 <String Id="Error0" Overridable="yes">{{Lemtinga klaida: }}</String>
387 <String Id="Error1" Overridable="yes">{{Klaida [1]. }}</String>
388 <String Id="Error2" Overridable="yes">Įspėjimas [1]. </String>
389 <String Id="Error4" Overridable="yes">Informacija [1]. </String>
390 <String Id="Error5" Overridable="yes">Diegiant šį paketą įvyko nenumatyta klaida. Tai gali būti dėl šio paketo problemos. Klaidos kodas yra [1]. {{Argumentai: [2], [3], [4]}}</String>
391 <String Id="Error7" Overridable="yes">{{Diskas pilnas: }}</String>
392 <String Id="Error8" Overridable="yes">Veiksmas [Time]: [1]. [2]</String>
393 <String Id="Error9" Overridable="yes">„[ProductName]“</String>
394 <String Id="Error10" Overridable="yes">{[2]}{, [3]}{, [4]}</String>
395 <String Id="Error11" Overridable="yes">Pranešimo tipas: [1], argumentas: [2]</String>
396 <String Id="Error12" Overridable="yes">=== Registravimas pradėtas: [Date] [Time] ===</String>
397 <String Id="Error13" Overridable="yes">=== Registravimas baigtas: [Date] [Time] ===</String>
398 <String Id="Error14" Overridable="yes">Veiksmo pradžia [Time]: [1].</String>
399 <String Id="Error15" Overridable="yes">Veiksmo pabaiga [Time]: [1]. Grąžinta reikšmė [2].</String>
400 <String Id="Error16" Overridable="yes">Liko laiko: {[1] min. }{[2] sek.}</String>
401 <String Id="Error17" Overridable="yes">Nepakanka atminties. Uždarykite kitas taikomąsias programas ir bandykite dar kartą.</String>
402 <String Id="Error18" Overridable="yes">Diegimo programa neatsiliepia.</String>
403 <String Id="Error19" Overridable="yes">Diegimas nutrūko per anksti.</String>
404 <String Id="Error20" Overridable="yes">Palaukite, kol „Windows“ sukonfigūruos [ProductName]</String>
405 <String Id="Error21" Overridable="yes">Renkama reikalinga informacija...</String>
406 <String Id="Error22" Overridable="yes">Šalinamos senesnės šios taikomosios programos versijos...</String>
407 <String Id="Error23" Overridable="yes">Ruošiamasi pašalinti senesnes šios taikomosios programos versijas...</String>
408 <String Id="Error32" Overridable="yes">{[ProductName] }sąranka atlikta sėkmingai.</String>
409 <String Id="Error33" Overridable="yes">{[ProductName] }sąranka nepavyko.</String>
410 <String Id="Error1101" Overridable="yes">Klaida skaitant failą: [2]. {{ Sistemos klaida [3].}} Patikrinkite, ar tikrai šis failas yra ir ar turite prieigą prie jo.</String>
411 <String Id="Error1301" Overridable="yes">Neįmanoma sukurti failo [2]. Katalogas tokiu pavadinimu jau yra. Atšaukite diegimą ir pamėginkite diegti kitoje vietoje.</String>
412 <String Id="Error1302" Overridable="yes">Įdėkite diską: [2]</String>
413 <String Id="Error1303" Overridable="yes">Diegimo programa neturi pakankamai teisių naudotis šiuo katalogu: [2]. Diegimo tęsti negalima. Užsiregistruokite kaip administratorius arba kreipkitės į savo sistemos administratorių.</String>
414 <String Id="Error1304" Overridable="yes">Failo rašymo klaida: [2]. Patikrinkite, ar turite prieigą prie to katalogo.</String>
415 <String Id="Error1305" Overridable="yes">Klaida skaitant failą: [2]. {{ Sistemos klaida [3].}} Patikrinkite, ar tikrai šis failas yra ir ar turite prieigą prie jo.</String>
416 <String Id="Error1306" Overridable="yes">Kita programa turi išskirtines teises į failą [2]. Baikite darbą su visomis kitomis programomis ir spustelėkite Kartoti.</String>
417 <String Id="Error1307" Overridable="yes">Diske nepakanka vietos šiam failui įdiegti: [2]. Atlaisvinkite vietos diske ir spustelėkite Kartoti arba išeikite spustelėdami Atšaukti.</String>
418 <String Id="Error1308" Overridable="yes">Šaltinio failas nerastas: [2]. Patikrinkite, ar failas tikrai yra ir ar galite jį pasiekti.</String>
419 <String Id="Error1309" Overridable="yes">Klaida skaitant failą: [3]. {{ Sistemos klaida [2].}} Patikrinkite, ar tikrai šis failas yra ir ar turite prieigą prie jo.</String>
420 <String Id="Error1310" Overridable="yes">Klaida rašant į failą: [3]. {{Sistemos klaida [2].}} Patikrinkite, ar tikrai turite prieigą prie šio katalogo.</String>
421 <String Id="Error1311" Overridable="yes">Šaltinio failas nerastas{{(cabinet)}}: [2]. Patikrinkite, ar šis failas yra ir ar turite prieigą prie jo.</String>
422 <String Id="Error1312" Overridable="yes">Nepavyko sukurti katalogo [2]. Failas tokiu pavadinimu jau yra. Pervardykite ar pašalinkite failą ir spustelėkite Kartoti arba išeikite spustelėdami Atšaukti.</String>
423 <String Id="Error1313" Overridable="yes">Tomas [2] šiuo metu nepasiekiamas. Pasirinkite kitą.</String>
424 <String Id="Error1314" Overridable="yes">Nurodytas kelias [2] nepasiekiamas.</String>
425 <String Id="Error1315" Overridable="yes">Nepavyksta įrašyti į nurodytą aplanką: [2].</String>
426 <String Id="Error1316" Overridable="yes">Bandant skaityti failą įvyko tinklo klaida: [2]</String>
427 <String Id="Error1317" Overridable="yes">Bandant sukurti katalogą įvyko klaida: [2]</String>
428 <String Id="Error1318" Overridable="yes">Bandant sukurti katalogą įvyko tinklo klaida: [2]</String>
429 <String Id="Error1319" Overridable="yes">Bandant atidaryti pirminį kabinetinio formato failą įvyko tinklo klaida: [2]</String>
430 <String Id="Error1320" Overridable="yes">Nurodytas kelias yra per ilgas: [2]</String>
431 <String Id="Error1321" Overridable="yes">Diegimo programa turi per mažai teisių, kad galėtų modifikuoti šį failą: [2].</String>
432 <String Id="Error1322" Overridable="yes">Dalis aplanko kelio [2] netinkama. Ji tuščia arba viršija sistemos leidžiamą ilgį.</String>
433 <String Id="Error1323" Overridable="yes">Aplanko kelyje [2] yra žodžių, netinkamų aplankų keliams.</String>
434 <String Id="Error1324" Overridable="yes">Aplanko kelyje [2] yra netinkamas simbolis.</String>
435 <String Id="Error1325" Overridable="yes">[2] nėra tinkamas trumpasis failo vardas.</String>
436 <String Id="Error1326" Overridable="yes">Failo saugos klaida: [3] GetLastError: [2]</String>
437 <String Id="Error1327" Overridable="yes">Netinkamas diskas: [2]</String>
438 <String Id="Error1328" Overridable="yes">Klaida taikant pataisas failui [2]. Tikriausiai jis buvo atnaujintas kitu būdu, todėl ši pataisa nebegali jo modifikuoti. Dėl išsamesnės informacijos kreipkitės į savo pataisų teikėją. {{Sistemos klaida: [3]}}</String>
439 <String Id="Error1329" Overridable="yes">Reikiamo failo negalima įdiegti, nes kabinetinio formato failas [2] nepasirašytas skaitmeniniu būdu. Tai gali rodyti, kad kabinetinio formato failas yra sugadintas.</String>
440 <String Id="Error1330" Overridable="yes">Reikiamo failo negalima įdiegti, nes kabinetinio formato failas [2] pasirašytas netinkamu skaitmeniniu parašu. Tai gali rodyti, kad kabinetinio formato failas yra sugadintas.{{ WinVerifyTrust pateikė klaidą [3].}}</String>
441 <String Id="Error1331" Overridable="yes">Nepavyko tinkamai nukopijuoti failo [2]: CRC klaida.</String>
442 <String Id="Error1332" Overridable="yes">Nepavyko tinkamai perkelti failo [2]: CRC klaida.</String>
443 <String Id="Error1333" Overridable="yes">Nepavyko tinkamai pritaikyti pataisų failui [2]: CRC klaida.</String>
444 <String Id="Error1334" Overridable="yes">Negalima įdiegti failo [2], nes failo nėra kabinetinio formato faile [3]. Tai gali reikšti tinklo klaidą, skaitymo iš kompaktinio disko klaidą arba šio paketo problemą.</String>
445 <String Id="Error1335" Overridable="yes">Diegimui reikalingas kabinetinio formato failas [2] yra sugadintas ir negali būti naudojamas. Tai gali reikšti tinklo klaidą, skaitymo iš kompaktinio disko klaidą arba šio paketo problemą.</String>
446 <String Id="Error1336" Overridable="yes">Įvyko klaida kuriant diegimui baigti reikalingą laikinąjį failą.{{ Aplankas: [3]. Sistemos klaidos kodas: [2]}}</String>
447 <String Id="Error1401" Overridable="yes">Nepavyko sukurti rakto: [2]. {{ Sistemos klaida [3].}} Patikrinkite, ar tikrai turite pakankamą prieigą prie šio rakto, arba kreipkitės į techninės pagalbos personalą. </String>
448 <String Id="Error1402" Overridable="yes">Nepavyko atidaryti rakto: [2]. {{ Sistemos klaida [3].}} Patikrinkite, ar tikrai turite pakankamą prieigą prie šio rakto, arba kreipkitės į techninės pagalbos personalą. </String>
449 <String Id="Error1403" Overridable="yes">Nepavyko panaikinti rakto [3] reikšmės [2]. {{ Sistemos klaida [4].}} Patikrinkite, ar tikrai turite pakankamą prieigą prie šio rakto, arba kreipkitės į techninės pagalbos personalą. </String>
450 <String Id="Error1404" Overridable="yes">Nepavyko panaikinti rakto: [2]. {{ Sistemos klaida [3].}} Patikrinkite, ar tikrai turite pakankamą prieigą prie šio rakto, arba kreipkitės į techninės pagalbos personalą. </String>
451 <String Id="Error1405" Overridable="yes">Nepavyko nuskaityti rakto [3] reikšmės [2]. {{ Sistemos klaida [4].}} Patikrinkite, ar tikrai turite pakankamą prieigą prie šio rakto, arba kreipkitės į techninės pagalbos personalą. </String>
452 <String Id="Error1406" Overridable="yes">Nepavyko įrašyti reikšmės [2] į raktą [3]. {{ Sistemos klaida [4].}} Patikrinkite, ar tikrai turite pakankamą prieigą prie šio rakto, arba kreipkitės į techninės pagalbos personalą.</String>
453 <String Id="Error1407" Overridable="yes">Nepavyko nuskaityti rakto [2] reikšmės pavadinimų. {{ Sistemos klaida [3].}} Patikrinkite, ar tikrai turite pakankamą prieigą prie šio rakto, arba kreipkitės į techninės pagalbos personalą.</String>
454 <String Id="Error1408" Overridable="yes">Nepavyko nuskaityti rakto [2] antrinių raktų pavadinimų. {{ Sistemos klaida [3].}} Patikrinkite, ar tikrai turite pakankamą prieigą prie šio rakto, arba kreipkitės į techninės pagalbos personalą.</String>
455 <String Id="Error1409" Overridable="yes">Nepavyko nuskaityti rakto [2] saugos informacijos. {{ Sistemos klaida [3].}} Patikrinkite, ar tikrai turite pakankamą prieigą prie šio rakto, arba kreipkitės į techninės pagalbos personalą.</String>
456 <String Id="Error1410" Overridable="yes">Nepavyko padaryti daugiau laisvos vietos registre. Šiai taikomajai programai įdiegti reikia [2] KB laisvos registro vietos.</String>
457 <String Id="Error1500" Overridable="yes">Vyksta kitos programos diegimas. Turite jį užbaigti, kad galėtumėte toliau diegti šią programą.</String>
458 <String Id="Error1501" Overridable="yes">Klaida kreipiantis į apsaugotus duomenis. Įsitikinkite, kad programa „Windows Installer“ yra tinkamai sukonfigūruota, ir bandykite diegti dar kartą.</String>
459 <String Id="Error1502" Overridable="yes">Vartotojas [2] anksčiau pradėjo diegti produktą [3]. Šis vartotojas turės pakartoti diegimą, kad galėtų naudoti šį produktą. Jūsų pradėtas diegimas dabar bus tęsiamas.</String>
460 <String Id="Error1503" Overridable="yes">Vartotojas [2] anksčiau pradėjo diegti produktą [3]. Šis vartotojas turės pakartoti diegimą, kad galėtų naudoti šį produktą.</String>
461 <String Id="Error1601" Overridable="yes">Diske nebėra vietos -- tomas: [2]; reikia vietos: [3] KB; laisvos vietos: [4] KB. Atlaisvinkite vietos diske ir bandykite dar kartą.</String>
462 <String Id="Error1602" Overridable="yes">Ar tikrai norite atšaukti?</String>
463 <String Id="Error1603" Overridable="yes">Failą [2][3] naudoja { šis procesas: pavadinimas: [4], ID: [5], lango pavadinimas: [6]}. Uždarykite šią taikomąją programą ir bandykite dar kartą.</String>
464 <String Id="Error1604" Overridable="yes">[2] produktas jau įdiegtas ir neleidžia diegti šio produkto. Šie du produktai nesuderinami.</String>
465 <String Id="Error1605" Overridable="yes">Nepakanka disko tomo [2] vietos toliau diegti su atkūrimo galimybe. Reikia [3] KB, o yra tik [4] KB laisvos vietos. Spustelėkite Nepaisyti ir diekite toliau, neįrašydami atkūrimo informacijos, spustelėkite Kartoti ir dar kartą patikrinkite, kiek yra laisvos vietos, arba spustelėkite Atšaukti ir nutraukite diegimą.</String>
466 <String Id="Error1606" Overridable="yes">Nepavyko pasiekti tinklo vietos [2].</String>
467 <String Id="Error1607" Overridable="yes">Prieš tęsiant diegimą reikia uždaryti šias taikomąsias programas:</String>
468 <String Id="Error1608" Overridable="yes">Nepavyko rasti jokių anksčiau kompiuteryje įdiegtų reikalavimus atitinkančių produktų, kad būtų galima diegti šį produktą.</String>
469 <String Id="Error1609" Overridable="yes">Klaida pritaikant saugos parametrus. [2] nėra tinkamas vartotojas ar grupė. Tai gali būti paketo problema arba ryšio klaida, kreipiantis į tinklo domeno valdiklį. Patikrinkite tinklo ryšį ir spustelėkite Kartoti arba spustelėkite Atšaukti ir nutraukite diegimą. {{Nepavyko rasti vartotojo SID, sistemos klaida [3]}}</String>
470 <String Id="Error1701" Overridable="yes">Raktas [2] negalioja. Patikrinkite, ar įvedėte teisingą raktą.</String>
471 <String Id="Error1702" Overridable="yes">Diegimo programa turi paleisti sistemą iš naujo, kad būtų galima tęsti [2] konfigūravimą. Spustelėkite Taip ir paleiskite iš naujo dabar arba spustelėkite Ne ir paleiskite iš naujo vėliau neautomatiškai.</String>
472 <String Id="Error1703" Overridable="yes">Turite paleisti sistemą iš naujo, kad [2] konfigūravimo metu padaryti keitimai įsigaliotų. Spustelėkite Taip ir paleiskite iš naujo dabar arba spustelėkite Ne ir paleiskite iš naujo vėliau.</String>
473 <String Id="Error1704" Overridable="yes">[2] diegimas šiuo metu sustabdytas. Norėdami tęsti, turite anuliuoti diegiant padarytus keitimus. Ar norite anuliuoti šiuos keitimus?</String>
474 <String Id="Error1705" Overridable="yes">Vykdomas ankstesnis šio produkto diegimas. Norėdami tęsti, turite anuliuoti diegiant padarytus keitimus. Ar norite anuliuoti šiuos keitimus?</String>
475 <String Id="Error1706" Overridable="yes">Nepavyko rasti produkto [2] diegimo paketo. Bandykite diegti dar kartą, naudodami tinkamą diegimo paketo [3] kopiją.</String>
476 <String Id="Error1707" Overridable="yes">Sėkmingai įdiegta.</String>
477 <String Id="Error1708" Overridable="yes">Nepavyko įdiegti.</String>
478 <String Id="Error1709" Overridable="yes">Produktas: [2] -- [3]</String>
479 <String Id="Error1710" Overridable="yes">Galite atkurti ankstesnę kompiuterio būseną arba tęsti diegimą vėliau. Ar norėtumėte atkurti?</String>
480 <String Id="Error1711" Overridable="yes">Klaida įrašant diegimo informaciją į diską. Patikrinkite, ar diske yra pakankamai vietos, ir spustelėkite mygtuką Kartoti arba spustelėkite Atšaukti ir nutraukite diegimą.</String>
481 <String Id="Error1712" Overridable="yes">Nepavyko rasti vieno ar daugiau failų, reikalingų ankstesnei kompiuterio būsenai atkurti. Atkūrimas neįmanomas.</String>
482 <String Id="Error1713" Overridable="yes">[2] negali įdiegti vieno iš būtinų produktų. Kreipkitės į techninės pagalbos grupę. {{Sistemos klaida: [3].}}</String>
483 <String Id="Error1714" Overridable="yes">Ankstesnės [2] versijos negalima pašalinti. Kreipkitės į techninės pagalbos grupę. {{Sistemos klaida [3].}}</String>
484 <String Id="Error1715" Overridable="yes">[2] įdiegta</String>
485 <String Id="Error1716" Overridable="yes">[2] sukonfigūruota</String>
486 <String Id="Error1717" Overridable="yes">[2] pašalinta</String>
487 <String Id="Error1718" Overridable="yes">Skaitmeninio parašo strategija atmetė failą [2].</String>
488 <String Id="Error1719" Overridable="yes">Nepavyko pasiekti „Windows Installer“ tarnybos. Taip gali įvykti, jei naudojate sistemą „Windows“ saugos režimu arba jei „Windows Installer“ nėra tinkamai įdiegta. Kreipkitės pagalbos į palaikymo personalą.</String>
489 <String Id="Error1720" Overridable="yes">„Windows Installer“ paketo problema. Scenarijaus, reikalingo šiam diegimui užbaigti, paleisti nepavyko. Kreipkitės į techninės pagalbos darbuotojus arba į paketo tiekėją. {{Pasirinktinis veiksmas [2] scenarijaus klaida [3], [4]: [5] eilutė [6], stulpelis [7], [8] }}</String>
490 <String Id="Error1721" Overridable="yes">„Windows Installer“ paketo problema. Nepavyko paleisti programos, reikalingos diegimui baigti. Kreipkitės į techninės pagalbos darbuotojus arba paketo tiekėją. {{Veiksmas: [2], vieta: [3], komanda: [4] }}</String>
491 <String Id="Error1722" Overridable="yes">„Windows Installer“ paketo problema. Programa, paleista kaip sąrankos dalis, baigė darbą ne taip, kaip tikėtasi. Kreipkitės į techninės pagalbos darbuotojus arba į paketo tiekėją. {{Veiksmas [2], vieta: [3], komanda: [4] }}</String>
492 <String Id="Error1723" Overridable="yes">„Windows Installer“ paketo problema. Nepavyko paleisti DLL, reikalingo šiam diegimui atlikti. Kreipkitės į techninės pagalbos darbuotojus arba į paketo tiekėją. {{Veiksmas [2], įrašas: [3], biblioteka: [4] }}</String>
493 <String Id="Error1724" Overridable="yes">Pašalinta sėkmingai.</String>
494 <String Id="Error1725" Overridable="yes">Pašalinti nepavyko.</String>
495 <String Id="Error1726" Overridable="yes">Reklama sėkminga.</String>
496 <String Id="Error1727" Overridable="yes">Reklama nepavyko.</String>
497 <String Id="Error1728" Overridable="yes">Konfigūravimas sėkmingas.</String>
498 <String Id="Error1729" Overridable="yes">Sukonfigūruoti nepavyko.</String>
499 <String Id="Error1730" Overridable="yes">Turite būti administratorius, kad galėtumėte pašalinti šią taikomąją programą. Įeikite kaip administratorius arba kreipkitės pagalbos į techninio palaikymo skyrių.</String>
500 <String Id="Error1731" Overridable="yes">Produkto [2] šaltinio diegimo paketas nesusinchronizuotas su kliento paketu. Bandykite diegti iš naujo naudodami tinkamą diegimo paketo [3] kopiją.</String>
501 <String Id="Error1732" Overridable="yes">Jei norite baigti diegti [2], turite iš naujo paleisti kompiuterį. Prie kompiuterio šiuo metu yra prisiregistravę kiti vartotojai ir paleidus iš naujo gali būti prarastas jų darbas. Ar norite paleisti iš naujo dabar?</String>
502 <String Id="Error1801" Overridable="yes">Kelias [2] negalioja. Nurodykite galiojantį kelią.</String>
503 <String Id="Error1802" Overridable="yes">Nepakanka atminties. Uždarykite kitas taikomąsias programas ir bandykite dar kartą.</String>
504 <String Id="Error1803" Overridable="yes">Įrenginyje [2] nėra disko. Įdėkite diską ir spustelėkite Kartoti arba spustelėkite Atšaukti ir grįžkite į anksčiau pasirinktą tomą.</String>
505 <String Id="Error1804" Overridable="yes">Įrenginyje [2] nėra disko. Įdėkite diską ir spustelėkite Kartoti arba spustelėkite Atšaukti ir grįžkite į naršyklės dialogo langą ir pasirinkite kitą tomą.</String>
506 <String Id="Error1805" Overridable="yes">Aplanko [2] nėra. Įveskite kelią į esantį aplanką.</String>
507 <String Id="Error1806" Overridable="yes">Neturite pakankamai teisių skaityti šį aplanką.</String>
508 <String Id="Error1807" Overridable="yes">Nepavyko nustatyti tinkamo šio diegimo paskirties aplanko.</String>
509 <String Id="Error1901" Overridable="yes">Klaida bandant skaityti diegimo duomenų bazės šaltinį: [2].</String>
510 <String Id="Error1902" Overridable="yes">Planuojama perkrovimo operacija: keičiamas failo vardas iš [2] į [3]. Būtina perkrauti, kad operacija būtų atlikta iki galo.</String>
511 <String Id="Error1903" Overridable="yes">Planuojama perkrovimo operacija: naikinamas failas [2]. Būtina perkrauti, kad operacija būtų atlikta iki galo.</String>
512 <String Id="Error1904" Overridable="yes">[2] modulio įregistruoti nepavyko. HRESULT [3]. Kreipkitės į techninės pagalbos personalą.</String>
513 <String Id="Error1905" Overridable="yes">[2] modulio išregistruoti nepavyko. HRESULT [3]. Kreipkitės į techninės pagalbos personalą.</String>
514 <String Id="Error1906" Overridable="yes">Nepavyko perkelti paketo [2] į talpyklą. Klaida: [3]. Kreipkitės į techninės pagalbos personalą.</String>
515 <String Id="Error1907" Overridable="yes">Nepavyko užregistruoti šrifto [2]. Patikrinkite, ar tikrai turite pakankamai teisių diegti šriftus ir ar sistema palaiko šį šriftą.</String>
516 <String Id="Error1908" Overridable="yes">Nepavyko išregistruoti šrifto [2]. Patikrinkite, ar tikrai turite pakankamai teisių šalinti šriftus.</String>
517 <String Id="Error1909" Overridable="yes">Nepavyko sukurti nuorodos [2]. Patikrinkite, ar tikrai paskirties aplankas yra ir ar turite prie jo prieigą.</String>
518 <String Id="Error1910" Overridable="yes">Nepavyko pašalinti nuorodos [2]. Patikrinkite, ar tikrai nuorodos failas yra ir ar turite prie jo prieigą.</String>
519 <String Id="Error1911" Overridable="yes">Nepavyko užregistruoti [2] failui skirtos tipų bibliotekos. Kreipkitės į techninės pagalbos personalą.</String>
520 <String Id="Error1912" Overridable="yes">Nepavyko išregistruoti [2] failui skirtos tipų bibliotekos. Kreipkitės į techninės pagalbos personalą.</String>
521 <String Id="Error1913" Overridable="yes">Nepavyko atnaujinti ini failo [2][3]. Patikrinkite, ar failas tikrai yra ir ar galite jį naudoti.</String>
522 <String Id="Error1914" Overridable="yes">Nepavyko suplanuoti [2] failo pakeisti failu [3] perkraunant. Patikrinkite, ar turite įrašymo į [3] failą teises.</String>
523 <String Id="Error1915" Overridable="yes">Klaida šalinant ODBC tvarkyklės tvarkytuvą, ODBC klaida [2]: [3]. Kreipkitės į techninės pagalbos personalą.</String>
524 <String Id="Error1916" Overridable="yes">Klaida diegiant ODBC tvarkyklės tvarkytuvą, ODBC klaida [2]: [3]. Kreipkitės į techninės pagalbos personalą.</String>
525 <String Id="Error1917" Overridable="yes">Klaida šalinant ODBC tvarkyklę: [4], ODBC klaida [2]: [3]. Patikrinkite, ar tikrai turite pakankamai teisių ODBC tvarkyklėms šalinti.</String>
526 <String Id="Error1918" Overridable="yes">Klaida diegiant ODBC tvarkyklę: [4], ODBC klaida [2]: [3]. Patikrinkite, ar tikrai šis failas [4] yra ir ar turite prie jo prieigą.</String>
527 <String Id="Error1919" Overridable="yes">Klaida konfigūruojant ODBC duomenų šaltinį: [4], ODBC klaida [2]: [3]. Patikrinkite, ar tikrai failas [4] yra ir ar turite prie jo prieigą.</String>
528 <String Id="Error1920" Overridable="yes">Nepavyko paleisti paslaugos [2] ([3]). Patikrinkite, ar turite pakankamai teisių sistemos tarnyboms paleisti.</String>
529 <String Id="Error1921" Overridable="yes">Nepavyko sustabdyti tarnybos [2] ([3]). Patikrinkite, ar turite pakankamai teisių sistemos tarnyboms sustabdyti.</String>
530 <String Id="Error1922" Overridable="yes">Nepavyko panaikinti tarnybos [2] ([3]). Patikrinkite, ar turite pakankamai teisių sistemos tarnyboms pašalinti.</String>
531 <String Id="Error1923" Overridable="yes">Nepavyko įdiegti tarnybos [2] ([3]). Patikrinkite, ar turite pakankamai teisių sistemos tarnyboms diegti.</String>
532 <String Id="Error1924" Overridable="yes">Nepavyko atnaujinti aplinkos kintamojo [2]. Patikrinkite, ar turite pakankamai teisių aplinkos kintamiesiems modifikuoti.</String>
533 <String Id="Error1925" Overridable="yes">Neturite pakankamai teisių šiam diegimui baigti visiems kompiuterio vartotojams. Prisiregistruokite kaip administratorius ir pakartokite diegimą.</String>
534 <String Id="Error1926" Overridable="yes">Failui [3] nepavyko nustatyti failo apsaugos. Klaida: [2]. Patikrinkite, ar turite pakankamai teisių šio failo saugos leidimams modifikuoti.</String>
535 <String Id="Error1927" Overridable="yes">Komponento tarnybos (COM+ 1.0) šiame kompiuteryje neįdiegtos. Diegimui sėkmingai užbaigti reikalingos komponento tarnybos. Komponento tarnybas galima rasti operacinėje sistemoje „Windows 2000“.</String>
536 <String Id="Error1928" Overridable="yes">Klaida registruojant COM+ taikomąją programą. Dėl išsamesnės informacijos kreipkitės į techninės pagalbos personalą.</String>
537 <String Id="Error1929" Overridable="yes">Klaida išregistruojant COM+ taikomąją programą. Dėl išsamesnės informacijos kreipkitės į techninės pagalbos personalą.</String>
538 <String Id="Error1930" Overridable="yes">Nepavyko pakeisti tarnybos [2] ([3]) aprašo.</String>
539 <String Id="Error1931" Overridable="yes">„Windows Installer“ tarnyba negali atnaujinti sistemos failo [2], nes failą saugo sistema „Windows“. Kad ši programa tinkamai veiktų, gali tekti atnaujinti savo operacinę sistemą. {{Paketo versija: [3], OS apsaugota versija: [4]}}</String>
540 <String Id="Error1932" Overridable="yes">„Windows Installer“ tarnybai nepavyko atnaujinti apsaugoto sistemos „Windows“ failo [2]. {{Paketo versija: [3], OS apsaugota versija: [4], SFP klaida: [5]}}</String>
541 <String Id="Error1933" Overridable="yes">„Windows Installer“ tarnyba negali atnaujinti vieno arba daugiau apsaugotų „Windows“ failų. {{SFP klaida: [2]. Apsaugotų failų sąrašas:\r\n[3]}}</String>
542 <String Id="Error1934" Overridable="yes">Kompiuterio sistemos strategija draudžia vartotojams diegti.</String>
543 <String Id="Error1935" Overridable="yes">Klaida diegiant rinkinio komponentą [6]. Išsamesnės informacijos ieškokite žinyne ir palaikymo informacijoje. HRESULT: [3]. {{rinkinio sąsaja: [4], funkcija: [5], komponentas: [2]}}</String>
544 <String Id="Error1936" Overridable="yes">Klaida diegiant rinkinį [6]. Rinkinys nėra griežtai įvardytas arba pasirašytas minimalaus ilgio raktu. HRESULT: [3]. {{rinkinio sąsaja: [4], funkcija: [5], komponentas: [2]}}</String>
545 <String Id="Error1937" Overridable="yes">Klaida diegiant rinkinį [6]. Parašas arba katalogas negalioja arba jo nepavyko patikrinti. HRESULT: [3]. {{rinkinio sąsaja: [4], funkcija: [5], komponentas: [2]}}</String>
546 <String Id="Error1938" Overridable="yes">Klaida diegiant rinkinį [6]. Nepavyko rasti vieno ar daugiau rinkinio modulių. HRESULT: [3]. {{rinkinio sąsaja: [4], funkcija: [5], komponentas: [2]}}</String>
547
548 <String Id="UITextbytes" Overridable="yes">baitai</String>
549 <String Id="UITextGB" Overridable="yes">GB</String>
550 <String Id="UITextKB" Overridable="yes">KB</String>
551 <String Id="UITextMB" Overridable="yes">MB</String>
552 <String Id="UITextMenuAbsent" Overridable="yes">Visa priemonė bus nepasiekiama</String>
553 <String Id="UITextMenuAdvertise" Overridable="yes">Priemonė bus įdiegta prireikus</String>
554 <String Id="UITextMenuAllCD" Overridable="yes">Visa priemonė bus įdiegta vykdyti iš kompaktinio disko</String>
555 <String Id="UITextMenuAllLocal" Overridable="yes">Visa priemonė bus įdiegta vietiniame standžiajame diske</String>
556 <String Id="UITextMenuAllNetwork" Overridable="yes">Visa priemonė bus įdiegta vykdyti iš tinklo</String>
557 <String Id="UITextMenuCD" Overridable="yes">Bus įdiegta vykdyti iš kompaktinio disko</String>
558 <String Id="UITextMenuLocal" Overridable="yes">Bus įdiegta vietiniame standžiajame diske</String>
559 <String Id="UITextMenuNetwork" Overridable="yes">Bus įdiegta vykdyti iš tinklo</String>
560 <String Id="UITextNewFolder" Overridable="yes">Aplankas|Naujas aplankas</String>
561 <String Id="UITextScriptInProgress" Overridable="yes">Renkama reikalinga informacija...</String>
562 <String Id="UITextSelAbsentAbsent" Overridable="yes">Ši priemonė liks neįdiegta</String>
563 <String Id="UITextSelAbsentAdvertise" Overridable="yes">Ši priemonė bus nustatyta, kad būtų įdiegta prireikus</String>
564 <String Id="UITextSelAbsentCD" Overridable="yes">Ši priemonė bus įdiegta vykdyti iš kompaktinio disko</String>
565 <String Id="UITextSelAbsentLocal" Overridable="yes">Ši priemonė bus įdiegta vietiniame standžiajame diske</String>
566 <String Id="UITextSelAbsentNetwork" Overridable="yes">Ši priemonė bus įdiegta vykdyti iš tinklo</String>
567 <String Id="UITextSelAdvertiseAbsent" Overridable="yes">Ši priemonė taps nepasiekiama</String>
568 <String Id="UITextSelAdvertiseAdvertise" Overridable="yes">Bus įdiegta prireikus</String>
569 <String Id="UITextSelAdvertiseCD" Overridable="yes">Šią priemonę bus galima vykdyti iš kompaktinio disko</String>
570 <String Id="UITextSelAdvertiseLocal" Overridable="yes">Ši priemonė bus įdiegta jūsų vietiniame standžiajame diske</String>
571 <String Id="UITextSelAdvertiseNetwork" Overridable="yes">Šią priemonę bus galima vykdyti iš tinklo</String>
572 <String Id="UITextSelCDAbsent" Overridable="yes">Ši priemonė bus visiškai pašalinta ir jūs nebegalėsite jos vykdyti iš kompaktinio disko</String>
573 <String Id="UITextSelCDAdvertise" Overridable="yes">Šios priemonės būsena bus pakeista iš vykdomos iš kompaktinio disko į diegiamą prireikus</String>
574 <String Id="UITextSelCDCD" Overridable="yes">Ši priemonė liks vykdoma iš kompaktinio disko</String>
575 <String Id="UITextSelCDLocal" Overridable="yes">Šios priemonės būsena pasikeis iš vykdomos iš kompaktinio disko į diegiamą vietiniame standžiajame diske</String>
576 <String Id="UITextSelChildCostNeg" Overridable="yes">Ši priemonė atlaisvina [1] vietos jūsų standžiajame diske.</String>
577 <String Id="UITextSelChildCostPos" Overridable="yes">Šiai priemonei reikia [1] vietos jūsų standžiajame diske.</String>
578 <String Id="UITextSelCostPending" Overridable="yes">Kompiliuojamos šios priemonės išlaidos...</String>
579 <String Id="UITextSelLocalAbsent" Overridable="yes">Ši priemonė bus visiškai pašalinta</String>
580 <String Id="UITextSelLocalAdvertise" Overridable="yes">Ši priemonė bus pašalinta iš jūsų vietinio standžiojo disko, tačiau bus nustatyta įdiegti prireikus</String>
581 <String Id="UITextSelLocalCD" Overridable="yes">Ši priemonė bus pašalinta iš jūsų vietinio standžiojo disko, tačiau ją vis dar bus galima vykdyti iš kompaktinio disko</String>
582 <String Id="UITextSelLocalLocal" Overridable="yes">Ši priemonė liks jūsų vietiniame standžiajame diske</String>
583 <String Id="UITextSelLocalNetwork" Overridable="yes">Ši priemonė bus pašalinta iš jūsų vietinio standžiojo disko, tačiau ją vis dar bus galima vykdyti iš tinklo</String>
584 <String Id="UITextSelNetworkAbsent" Overridable="yes">Ši priemonė bus visiškai pašalinta ir jūs nebegalėsite jos vykdyti iš tinklo</String>
585 <String Id="UITextSelNetworkAdvertise" Overridable="yes">Šios priemonės būsena pasikeis iš vykdomos iš tinklo į diegiamą prireikus</String>
586 <String Id="UITextSelNetworkLocal" Overridable="yes">Šios priemonės būsena pasikeis iš vykdomos iš tinklo į diegiamą vietiniame standžiajame diske</String>
587 <String Id="UITextSelNetworkNetwork" Overridable="yes">Ši priemonė tebebus vykdoma iš tinklo</String>
588 <String Id="UITextSelParentCostNegNeg" Overridable="yes">Ši priemonė atlaisvina [1] vietos jūsų standžiajame diske. Jai priskirta [2] iš [3] pažymėtų papildomų priemonių. Papildomos priemonės atlaisvina [4] vietos jūsų standžiajame diske.</String>
589 <String Id="UITextSelParentCostNegPos" Overridable="yes">Ši priemonė atlaisvina [1] vietos jūsų standžiajame diske. Jai priskirta [2] iš [3] pažymėtų papildomų priemonių. Papildomoms priemonėms reikia [4] vietos jūsų standžiajame diske.</String>
590 <String Id="UITextSelParentCostPosNeg" Overridable="yes">Šiai priemonei reikia [1] vietos jūsų standžiajame diske. Jai priskirta [2] iš [3] pažymėtų papildomų priemonių. Papildomos priemonės atlaisvina [4] vietos jūsų standžiajame diske.</String>
591 <String Id="UITextSelParentCostPosPos" Overridable="yes">Šiai priemonei reikia [1] vietos jūsų standžiajame diske. Jai priskirta [2] iš [3] pažymėtų papildomų priemonių. Papildomoms priemonėms reikia [4] vietos jūsų standžiajame diske.</String>
592 <String Id="UITextTimeRemaining" Overridable="yes">Liko laiko: {[1] min. }{[2] sek.}</String>
593 <String Id="UITextVolumeCostAvailable" Overridable="yes">Pasiekiama</String>
594 <String Id="UITextVolumeCostDifference" Overridable="yes">Skirtumas</String>
595 <String Id="UITextVolumeCostRequired" Overridable="yes">Reikalinga</String>
596 <String Id="UITextVolumeCostSize" Overridable="yes">Disko talpa</String>
597 <String Id="UITextVolumeCostVolume" Overridable="yes">Tomas</String>
598</WixLocalization>
diff --git a/src/ext/UI/wixlib/WixUI_lv-LV.wxl b/src/ext/UI/wixlib/WixUI_lv-LV.wxl
new file mode 100644
index 00000000..af48cc97
--- /dev/null
+++ b/src/ext/UI/wixlib/WixUI_lv-LV.wxl
@@ -0,0 +1,598 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3
4
5<WixLocalization Culture="lv-lv" Codepage="1257" xmlns="http://wixtoolset.org/schemas/v4/wxl">
6 <String Id="WixUIBack" Overridable="yes">&amp;Atpakaļ</String>
7 <String Id="WixUINext" Overridable="yes">&amp;Tālāk</String>
8 <String Id="WixUICancel" Overridable="yes">Atcelt</String>
9 <String Id="WixUIFinish" Overridable="yes">&amp;Pabeigt</String>
10 <String Id="WixUIRetry" Overridable="yes">&amp;Mēģināt vēlreiz</String>
11 <String Id="WixUIIgnore" Overridable="yes">&amp;Ignorēt</String>
12 <String Id="WixUIYes" Overridable="yes">&amp;Jā</String>
13 <String Id="WixUINo" Overridable="yes">&amp;Nē</String>
14 <String Id="WixUIOK" Overridable="yes">Labi</String>
15 <String Id="WixUIPrint" Overridable="yes">&amp;Drukāt</String>
16
17 <String Id="AdvancedWelcomeEulaDlg_Title" Overridable="yes">[ProductName] uzstādīšana</String>
18 <String Id="AdvancedWelcomeEulaDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
19 <String Id="AdvancedWelcomeEulaDlgTitle" Overridable="yes">{\WixUI_Font_Title}Lūdzu, izlasiet [ProductName] licences līgumu</String>
20 <String Id="AdvancedWelcomeEulaDlgLicenseAcceptedCheckBox" Overridable="yes">Es &amp;piekrītu licences līguma nosacījumiem</String>
21 <String Id="AdvancedWelcomeEulaDlgDescriptionPerMachine" Overridable="yes">Noklikšķiniet uz Instalēt, lai instalētu produktu, visiem lietotājiem izmantojot noklusējuma opcijas. Noklikšķiniet uz Papildu, lai mainītu instalēšanas opcijas.</String>
22 <String Id="AdvancedWelcomeEulaDlgDescriptionPerUser" Overridable="yes">Noklikšķiniet uz Instalēt, lai instalētu produktu, izmantojot noklusējuma opcijas tikai savam kontam. Noklikšķiniet uz Papildu, lai mainītu instalēšanas opcijas.</String>
23 <String Id="AdvancedWelcomeEulaDlgInstall" Overridable="yes">&amp;Instalēt</String>
24 <String Id="AdvancedWelcomeEulaDlgAdvanced" Overridable="yes">P&amp;apildu</String>
25 <String Id="Advanced_Font_Normal_Size" Overridable="yes">8</String>
26 <String Id="Advanced_Font_Bigger_Size" Overridable="yes">12</String>
27 <String Id="Advanced_Font_Title_Size" Overridable="yes">9</String>
28 <String Id="Advanced_Font_Emphasized_Size" Overridable="yes">8</String>
29 <String Id="Advanced_Font_FaceName" Overridable="yes">Tahoma</String>
30
31 <String Id="BrowseDlg_Title" Overridable="yes">[ProductName] uzstādīšana</String>
32 <String Id="BrowseDlgComboLabel" Overridable="yes">&amp;Skatīt šeit:</String>
33 <String Id="BrowseDlgWixUI_Bmp_Up" Overridable="yes">WixUI_Bmp_Up</String>
34 <String Id="BrowseDlgWixUI_Bmp_UpTooltip" Overridable="yes">Vienu līmeni augstāk</String>
35 <String Id="BrowseDlgNewFolder" Overridable="yes">WixUI_Bmp_New</String>
36 <String Id="BrowseDlgNewFolderTooltip" Overridable="yes">Izveidot jaunu mapi</String>
37 <String Id="BrowseDlgPathLabel" Overridable="yes">&amp;Mapes nosaukums:</String>
38 <String Id="BrowseDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
39 <String Id="BrowseDlgDescription" Overridable="yes">Meklēt mērķa mapi</String>
40 <String Id="BrowseDlgTitle" Overridable="yes">{\WixUI_Font_Title}Mērķa mapes maiņa</String>
41
42 <String Id="CancelDlg_Title" Overridable="yes">[ProductName] uzstādīšana</String>
43 <String Id="CancelDlgText" Overridable="yes">Vai tiešām vēlaties atcelt [ProductName] instalēšanu?</String>
44 <String Id="CancelDlgIcon" Overridable="yes">WixUI_Ico_Info</String>
45 <String Id="CancelDlgIconTooltip" Overridable="yes">Informācijas ikona</String>
46
47 <String Id="CustomizeDlg_Title" Overridable="yes">[ProductName] uzstādīšana</String>
48 <String Id="CustomizeDlgTree" Overridable="yes">Atlases iespēju koks</String>
49 <String Id="CustomizeDlgBrowse" Overridable="yes">Pā&amp;rlūkot...</String>
50 <String Id="CustomizeDlgReset" Overridable="yes">Atie&amp;statīt</String>
51 <String Id="CustomizeDlgDiskCost" Overridable="yes">Diska lietoj&amp;ums</String>
52 <String Id="CustomizeDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
53 <String Id="CustomizeDlgText" Overridable="yes">Noklikšķiniet uz ikonām kokā, lai mainītu līdzekļu instalēšanas veidu.</String>
54 <String Id="CustomizeDlgDescription" Overridable="yes">Atlasiet vajadzīgo līdzekļu instalēšanas veidu.</String>
55 <String Id="CustomizeDlgTitle" Overridable="yes">{\WixUI_Font_Title}Pielāgota uzstādīšana</String>
56 <String Id="CustomizeDlgItemDescription" Overridable="yes">CustomizeDlgItemDescription-CustomizeDlgItemDescription</String>
57 <String Id="CustomizeDlgItemSize" Overridable="yes">CustomizeDlgItemSize-CustomizeDlgItemSize</String>
58 <String Id="CustomizeDlgLocation" Overridable="yes">CustomizeDlgLocation-CustomizeDlgLocation</String>
59 <String Id="CustomizeDlgLocationLabel" Overridable="yes">Atrašanās vieta:</String>
60
61 <String Id="DiskCostDlg_Title" Overridable="yes">[ProductName] uzstādīšana</String>
62 <String Id="DiskCostDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
63 <String Id="DiskCostDlgText" Overridable="yes">Iezīmētajiem sējumiem nepietiek vietas diskā, lai instalētu atlasītos līdzekļus. Varat noņemt dažus failus no iezīmētajiem sējumiem, instalēt mazāk līdzekļu vai atlasīt citus mērķa diskdziņus.</String>
64 <String Id="DiskCostDlgDescription" Overridable="yes">Atlasīto līdzekļu instalēšanai nepieciešamā vieta diskā.</String>
65 <String Id="DiskCostDlgTitle" Overridable="yes">{\WixUI_Font_Title}Nepieciešamā vieta diskā</String>
66 <String Id="DiskCostDlgVolumeList" Overridable="yes">{120}{70}{70}{70}{70}</String>
67
68 <String Id="ErrorDlg_Title" Overridable="yes">[ProductName] uzstādīšana</String>
69 <String Id="ErrorDlgErrorText" Overridable="yes">Informācijas teksts</String>
70 <String Id="ErrorDlgErrorIcon" Overridable="yes">WixUI_Ico_Info</String>
71 <String Id="ErrorDlgErrorIconTooltip" Overridable="yes">Informācijas ikona</String>
72
73 <String Id="ExitDialog_Title" Overridable="yes">[ProductName] uzstādīšana</String>
74 <String Id="ExitDialogBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
75 <String Id="ExitDialogDescription" Overridable="yes">Noklikšķiniet uz pogas Pabeigt, lai izietu no Uzstādīšanas vedņa.</String>
76 <String Id="ExitDialogTitle" Overridable="yes">{\WixUI_Font_Bigger}[ProductName] uzstādīšanas vednis ir pabeigts</String>
77
78 <String Id="FatalError_Title" Overridable="yes">[ProductName] uzstādīšana</String>
79 <String Id="FatalErrorBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
80 <String Id="FatalErrorTitle" Overridable="yes">{\WixUI_Font_Bigger}[ProductName] uzstādīšanas vednis darbību beidza priekšlaikus</String>
81 <String Id="FatalErrorDescription1" Overridable="yes">[ProductName] uzstādīšanas vednis darbību pabeidza priekšlaikus kļūdas dēļ. Sistēma nav modificēta. Lai šo programmu instalētu vēlāk, vēlreiz palaidiet Uzstādīšanas vedni.</String>
82 <String Id="FatalErrorDescription2" Overridable="yes">Noklikšķiniet uz pogas Pabeigt, lai izietu no Uzstādīšanas vedņa.</String>
83
84 <String Id="FeaturesDlg_Title" Overridable="yes">[ProductName] uzstādīšana</String>
85 <String Id="FeaturesDlgTree" Overridable="yes">Produkta līdzekļi</String>
86 <String Id="FeaturesDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
87 <String Id="FeaturesDlgDescription" Overridable="yes">Atlasiet vajadzīgo līdzekļu instalēšanas veidu.</String>
88 <String Id="FeaturesDlgTitle" Overridable="yes">{\WixUI_Font_Title}Produkta līdzekļi</String>
89 <String Id="FeaturesDlgItemDescription" Overridable="yes">FeaturesDlgItemDescription</String>
90 <String Id="FeaturesDlgItemSize" Overridable="yes">FeaturesDlgItemSize</String>
91 <String Id="FeaturesDlgInstall" Overridable="yes">&amp;Instalēt</String>
92 <String Id="FeaturesDlgChange" Overridable="yes">&amp;Mainīt</String>
93
94 <String Id="FilesInUse_Title" Overridable="yes">[ProductName] uzstādīšana</String>
95 <String Id="FilesInUseExit" Overridable="yes">I&amp;ziet</String>
96 <String Id="FilesInUseBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
97 <String Id="FilesInUseText" Overridable="yes">Tālāk norādītās lietojumprogrammas izmanto failus, kas ir jāatjaunina uzstādīšanas laikā. Aizveriet šīs lietojumprogrammas un pēc tam noklikšķiniet uz &amp;Mēģināt vēlreiz, lai turpinātu instalēšanu, vai uz Iziet, lai izietu no tās.</String>
98 <String Id="FilesInUseDescription" Overridable="yes">Daži no failiem, kas jāatjaunina, pašlaik tiek lietoti.</String>
99 <String Id="FilesInUseTitle" Overridable="yes">{\WixUI_Font_Title}Faili, kas tiek lietoti</String>
100
101 <String Id="InstallDirDlg_Title" Overridable="yes">[ProductName] uzstādīšana</String>
102 <String Id="InstallDirDlgChange" Overridable="yes">&amp;Mainīt...</String>
103 <String Id="InstallDirDlgTitle" Overridable="yes">{\WixUI_Font_Title}Mērķa mape</String>
104 <String Id="InstallDirDlgDescription" Overridable="yes">Noklikšķiniet uz Tālāk, lai instalētu noklusējuma mapi, vai noklikšķiniet uz Mainīt, lai izvēlētos citu mapi.</String>
105 <String Id="InstallDirDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
106 <String Id="InstallDirDlgFolderLabel" Overridable="yes">Instalēt [ProductName] šeit:</String>
107
108 <String Id="InstallScopeDlg_Title" Overridable="yes">[ProductName] uzstādīšana</String>
109 <String Id="InstallScopeDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
110 <String Id="InstallScopeDlgDescription" Overridable="yes">Izvēlieties instalēšanas tvērumu un mapi</String>
111 <String Id="InstallScopeDlgTitle" Overridable="yes">{\WixUI_Font_Title}Instalēšanas tvērums</String>
112 <String Id="InstallScopeDlgPerUser" Overridable="yes">{\WixUI_Font_Emphasized}Instalēt &amp;tikai sev ([LogonUser])</String>
113 <String Id="InstallScopeDlgPerUserDescription" Overridable="yes">[ProductName] tiks instalēts lietotājam paredzētā mapē un būs pieejams tikai jūsu lietotāja kontam. Nav nepieciešamas lokālā administratora atļaujas.</String>
114 <String Id="InstallScopeDlgNoPerUserDescription" Overridable="yes">[ProductName] neatbalsta lietotājam paredzētu instalēšanu.</String>
115 <String Id="InstallScopeDlgPerMachine" Overridable="yes">{\WixUI_Font_Emphasized}Instalēt visiem šī &amp;datora lietotājiem</String>
116 <String Id="InstallScopeDlgPerMachineDescription" Overridable="yes">Pēc noklusējuma [ProductName] tiks instalēts datoram paredzētā mapē un būs pieejams visiem lietotājiem. Noklusējuma instalācijas mapi var mainīt. Jums ir nepieciešamas lokālā administratora atļaujas.</String>
117 <String Id="InstallScopeDlgFolderLabel" Overridable="yes">Instalācijas &amp;mape:</String>
118 <String Id="InstallScopeDlgChange" Overridable="yes">&amp;Mainīt...</String>
119
120 <String Id="InvalidDirDlg_Title" Overridable="yes">[ProductName] uzstādīšana</String>
121 <String Id="InvalidDirDlgText" Overridable="yes">Instalācijas direktorijam ir jāatrodas lokālajā cietajā diskā.</String>
122 <String Id="InvalidDirDlgIcon" Overridable="yes">WixUI_Ico_Info</String>
123 <String Id="InvalidDirDlgIconTooltip" Overridable="yes">Informācijas ikona</String>
124
125 <String Id="LicenseAgreementDlg_Title" Overridable="yes">[ProductName] uzstādīšana</String>
126 <String Id="LicenseAgreementDlgLicenseAcceptedCheckBox" Overridable="yes">Es &amp;piekrītu licences līguma nosacījumiem</String>
127 <String Id="LicenseAgreementDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
128 <String Id="LicenseAgreementDlgDescription" Overridable="yes">Lūdzu, uzmanīgi izlasiet šo licences līgumu</String>
129 <String Id="LicenseAgreementDlgTitle" Overridable="yes">{\WixUI_Font_Title}Lietotāja licences līgums</String>
130
131 <String Id="MaintenanceTypeDlg_Title" Overridable="yes">[ProductName] uzstādīšana</String>
132 <String Id="MaintenanceTypeDlgChangeButton" Overridable="yes">&amp;Mainīt</String>
133 <String Id="MaintenanceTypeDlgChangeButtonTooltip" Overridable="yes">Mainīt instalāciju</String>
134 <String Id="MaintenanceTypeDlgRepairButton" Overridable="yes">La&amp;bot</String>
135 <String Id="MaintenanceTypeDlgRepairButtonTooltip" Overridable="yes">Labot instalāciju</String>
136 <String Id="MaintenanceTypeDlgRemoveButton" Overridable="yes">&amp;Noņemt</String>
137 <String Id="MaintenanceTypeDlgRemoveButtonTooltip" Overridable="yes">Noņemt instalāciju</String>
138 <String Id="MaintenanceTypeDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
139 <String Id="MaintenanceTypeDlgDescription" Overridable="yes">Atlasiet veicamo darbību.</String>
140 <String Id="MaintenanceTypeDlgTitle" Overridable="yes">{\WixUI_Font_Title}Instalācijas maiņa, labošana vai noņemšana</String>
141 <String Id="MaintenanceTypeDlgChangeText" Overridable="yes">Ļauj mainīt līdzekļu instalēšanas veidu.</String>
142 <String Id="MaintenanceTypeDlgChangeDisabledText" Overridable="yes">Produktam [ProductName] nav neatkarīgi atlasāmu līdzekļu.</String>
143 <String Id="MaintenanceTypeDlgRemoveText" Overridable="yes">Noņem produktu [ProductName] no datora.</String>
144 <String Id="MaintenanceTypeDlgRemoveDisabledText" Overridable="yes">Nevar noņemt [ProductName].</String>
145 <String Id="MaintenanceTypeDlgRepairText" Overridable="yes">Jaunākajā instalācijā labo kļūdas, labojot trūkstošos un bojātos failus, saīsnes un reģistra ierakstus.</String>
146 <String Id="MaintenanceTypeDlgRepairDisabledText" Overridable="yes">Nevar labot [ProductName].</String>
147
148 <String Id="MaintenanceWelcomeDlg_Title" Overridable="yes">[ProductName] uzstādīšana</String>
149 <String Id="MaintenanceWelcomeDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
150 <String Id="MaintenanceWelcomeDlgDescription" Overridable="yes">Izmantojot uzstādīšanas vedni, varat mainīt veidu, kā [ProductName] līdzekļi tiek instalēti datorā, vai noņemt to no datora. Noklikšķiniet uz Tālāk, lai turpinātu, vai uz Atcelt, lai izietu no uzstādīšanas vedņa.</String>
151 <String Id="MaintenanceWelcomeDlgTitle" Overridable="yes">{\WixUI_Font_Bigger}Esiet sveicināts [ProductName] uzstādīšanas vednī!</String>
152
153 <String Id="MsiRMFilesInUse_Title" Overridable="yes">[ProductName] uzstādīšana</String>
154 <String Id="MsiRMFilesInUseBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
155 <String Id="MsiRMFilesInUseText" Overridable="yes">Tālāk norādītās lietojumprogrammas izmanto failus, kas ir jāatjaunina uzstādīšanas laikā. Varat ļaut uzstādīšanas vednim tās aizvērt un mēģināt restartēt vai vēlāk atkārtoti sāknēt ierīci.</String>
156 <String Id="MsiRMFilesInUseDescription" Overridable="yes">Daži no failiem, kas jāatjaunina, pašlaik tiek lietoti.</String>
157 <String Id="MsiRMFilesInUseTitle" Overridable="yes">{\WixUI_Font_Title}Faili, kas tiek lietoti</String>
158 <String Id="MsiRMFilesInUseUseRM" Overridable="yes">&amp;Aizveriet lietojumprogrammas un mēģiniet tās restartēt.</String>
159 <String Id="MsiRMFilesInUseDontUseRM" Overridable="yes">&amp;Neaizveriet lietojumprogrammas. Būs jāveic atkārtota sāknēšana.</String>
160
161 <String Id="OutOfDiskDlg_Title" Overridable="yes">[ProductName] uzstādīšana</String>
162 <String Id="OutOfDiskDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
163 <String Id="OutOfDiskDlgText" Overridable="yes">Iezīmētajiem sējumiem nepietiek vietas diskā, lai instalētu pašreiz atlasītos līdzekļus. Varat noņemt dažus failus no iezīmētajiem sējumiem, instalēt mazāk līdzekļu vai norādīt citu mērķa diskdzini.</String>
164 <String Id="OutOfDiskDlgDescription" Overridable="yes">Instalēšanai nepieciešamā vieta diskā pārsniedz diskā pieejamo vietu.</String>
165 <String Id="OutOfDiskDlgTitle" Overridable="yes">{\WixUI_Font_Title}Nepietiek vietas diskā</String>
166 <String Id="OutOfDiskDlgVolumeList" Overridable="yes">{120}{70}{70}{70}{70}</String>
167
168 <String Id="OutOfRbDiskDlg_Title" Overridable="yes">[ProductName] uzstādīšana</String>
169 <String Id="OutOfRbDiskDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
170 <String Id="OutOfRbDiskDlgText" Overridable="yes">Iezīmētajiem sējumiem nepietiek vietas diskā, lai instalētu pašreiz atlasītos līdzekļus. Varat noņemt dažus failus no iezīmētajiem sējumiem, instalēt mazāk līdzekļu vai norādīt citu mērķa diskdzini.</String>
171 <String Id="OutOfRbDiskDlgDescription" Overridable="yes">Instalēšanai nepieciešamā vieta diskā pārsniedz diskā pieejamo vietu.</String>
172 <String Id="OutOfRbDiskDlgTitle" Overridable="yes">{\WixUI_Font_Title}Nepietiek vietas diskā</String>
173 <String Id="OutOfRbDiskDlgVolumeList" Overridable="yes">{120}{70}{70}{70}{70}</String>
174 <String Id="OutOfRbDiskDlgText2" Overridable="yes">Vai arī varat izvēlēties instalēšanas programmas atrites funkcionalitātes atspējošanu. Izvēloties atrites atspējošanu, tiek novērsts, ka jebkādā instalēšanas pārtraukšanas gadījumā instalēšanas programma atjauno datora sākotnējo stāvokli. Noklikšķiniet uz Jā, ja vēlaties riskēt un atspējot atriti.</String>
175
176 <String Id="PrepareDlg_Title" Overridable="yes">[ProductName] uzstādīšana</String>
177 <String Id="PrepareDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
178 <String Id="PrepareDlgDescription" Overridable="yes">Uzgaidiet, līdz Uzstādīšanas vednī tiek sagatavoti instalēšanas norādījumi.</String>
179 <String Id="PrepareDlgTitle" Overridable="yes">{\WixUI_Font_Bigger}Esiet sveicināts [ProductName] uzstādīšanas vednī!</String>
180
181 <String Id="ProgressDlg_Title" Overridable="yes">[ProductName] uzstādīšana</String>
182 <String Id="ProgressDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
183 <String Id="ProgressDlgTextInstalling" Overridable="yes">Lūdzu, uzgaidiet, kamēr uzstādīšanas vednis instalē [ProductName].</String>
184 <String Id="ProgressDlgTitleInstalling" Overridable="yes">{\WixUI_Font_Title}Notiek [ProductName] instalēšana</String>
185 <String Id="ProgressDlgTextChanging" Overridable="yes">Lūdzu, uzgaidiet, kamēr uzstādīšanas vednis maina [ProductName].</String>
186 <String Id="ProgressDlgTitleChanging" Overridable="yes">{\WixUI_Font_Title}Notiek [ProductName] maiņa</String>
187 <String Id="ProgressDlgTextRepairing" Overridable="yes">Lūdzu, uzgaidiet, kamēr uzstādīšanas vednis labo [ProductName].</String>
188 <String Id="ProgressDlgTitleRepairing" Overridable="yes">{\WixUI_Font_Title}Notiek [ProductName] labošana</String>
189 <String Id="ProgressDlgTextRemoving" Overridable="yes">Lūdzu, uzgaidiet, kamēr uzstādīšanas vednis noņem [ProductName].</String>
190 <String Id="ProgressDlgTitleRemoving" Overridable="yes">{\WixUI_Font_Title}Notiek [ProductName] noņemšana</String>
191 <String Id="ProgressDlgTextUpdating" Overridable="yes">Lūdzu, uzgaidiet, kamēr uzstādīšanas vednis atjaunina produktu [ProductName].</String>
192 <String Id="ProgressDlgTitleUpdating" Overridable="yes">{\WixUI_Font_Title}Notiek [ProductName] atjaunināšana</String>
193 <String Id="ProgressDlgProgressBar" Overridable="yes">Norises progress</String>
194 <String Id="ProgressDlgStatusLabel" Overridable="yes">Statuss:</String>
195
196 <String Id="ResumeDlg_Title" Overridable="yes">[ProductName] uzstādīšana</String>
197 <String Id="ResumeDlgInstall" Overridable="yes">&amp;Instalēt</String>
198 <String Id="ResumeDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
199 <String Id="ResumeDlgDescription" Overridable="yes">Izmantojot uzstādīšanas vedni, datorā tiks pabeigta [ProductName] instalēšana. Noklikšķiniet uz Instalēt, lai turpinātu, vai uz Atcelt, lai izietu no uzstādīšanas vedņa.</String>
200 <String Id="ResumeDlgTitle" Overridable="yes">{\WixUI_Font_Bigger}Notiek [ProductName] uzstādīšanas vedņa atsākšana</String>
201
202 <String Id="SetupTypeDlg_Title" Overridable="yes">[ProductName] uzstādīšana</String>
203 <String Id="SetupTypeDlgTypicalButton" Overridable="yes">&amp;Parasta</String>
204 <String Id="SetupTypeDlgTypicalButtonTooltip" Overridable="yes">Parasta instalācija</String>
205 <String Id="SetupTypeDlgCustomButton" Overridable="yes">P&amp;ielāgota</String>
206 <String Id="SetupTypeDlgCustomButtonTooltip" Overridable="yes">Pielāgota instalācija</String>
207 <String Id="SetupTypeDlgCompleteButton" Overridable="yes">&amp;Pilna</String>
208 <String Id="SetupTypeDlgCompleteButtonTooltip" Overridable="yes">Pilna instalācija</String>
209 <String Id="SetupTypeDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
210 <String Id="SetupTypeDlgTitle" Overridable="yes">{\WixUI_Font_Title}Uzstādīšanas tipa izvēle</String>
211 <String Id="SetupTypeDlgDescription" Overridable="yes">Izvēlieties savām vajadzībām visatbilstošāko uzstādīšanas tipu</String>
212 <String Id="SetupTypeDlgTypicalText" Overridable="yes">Tiek instalēti visbiežāk lietotie programmas līdzekļi. Ieteicams lielākajai daļai lietotāju.</String>
213 <String Id="SetupTypeDlgCustomText" Overridable="yes">Lietotāji var izvēlēties instalēšanas vietu un instalējamos programmas līdzekļus. Ieteicams pieredzējušiem lietotājiem.</String>
214 <String Id="SetupTypeDlgCompleteText" Overridable="yes">Tiks instalēti visi programmas līdzekļi. Aizņem visvairāk vietas diskā.</String>
215
216 <String Id="UserExit_Title" Overridable="yes">[ProductName] uzstādīšana</String>
217 <String Id="UserExitBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
218 <String Id="UserExitTitle" Overridable="yes">{\WixUI_Font_Bigger}[ProductName] uzstādīšanas vedņa darbība tika pārtraukta</String>
219 <String Id="UserExitDescription1" Overridable="yes">[ProductName] uzstādīšana tika pārtraukta. Sistēma netika modificēta. Lai instalētu šo programmu vēlāk, atkārtoti palaidiet instalēšanu.</String>
220 <String Id="UserExitDescription2" Overridable="yes">Noklikšķiniet uz pogas Pabeigt, lai izietu no Uzstādīšanas vedņa.</String>
221
222 <String Id="VerifyReadyDlg_Title" Overridable="yes">[ProductName] uzstādīšana</String>
223 <String Id="VerifyReadyDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
224 <String Id="VerifyReadyDlgInstall" Overridable="yes">&amp;Instalēt</String>
225 <String Id="VerifyReadyDlgInstallText" Overridable="yes">Noklikšķiniet uz Instalēt, lai sāktu instalēšanu. Noklikšķiniet uz Atpakaļ, lai pārskatītu vai mainītu jebkuru instalēšanas iestatījumu. Noklikšķiniet uz Atcelt, lai izietu no vedņa.</String>
226 <String Id="VerifyReadyDlgInstallTitle" Overridable="yes">{\WixUI_Font_Title}Gatavs [ProductName] instalēšanai</String>
227 <String Id="VerifyReadyDlgChange" Overridable="yes">&amp;Mainīt</String>
228 <String Id="VerifyReadyDlgChangeText" Overridable="yes">Noklikšķiniet uz Mainīt, lai sāktu instalēšanu. Noklikšķiniet uz Atpakaļ, lai pārskatītu vai mainītu jebkuru instalēšanas iestatījumu. Noklikšķiniet uz Atcelt, lai izietu no vedņa.</String>
229 <String Id="VerifyReadyDlgChangeTitle" Overridable="yes">{\WixUI_Font_Title}Gatavs [ProductName] mainīšanai</String>
230 <String Id="VerifyReadyDlgRepair" Overridable="yes">La&amp;bot</String>
231 <String Id="VerifyReadyDlgRepairText" Overridable="yes">Noklikšķiniet uz Labot, lai labotu [ProductName] instalāciju. Noklikšķiniet uz Atpakaļ, lai pārskatītu vai mainītu jebkuru instalēšanas iestatījumu. Noklikšķiniet uz Atcelt, lai izietu no vedņa.</String>
232 <String Id="VerifyReadyDlgRepairTitle" Overridable="yes">{\WixUI_Font_Title}Gatavs [ProductName] labošanai</String>
233 <String Id="VerifyReadyDlgRemove" Overridable="yes">&amp;Noņemt</String>
234 <String Id="VerifyReadyDlgRemoveText" Overridable="yes">Noklikšķiniet uz Noņemt, lai noņemtu produktu [ProductName] no datora. Noklikšķiniet uz Atpakaļ, lai pārskatītu vai mainītu jebkuru instalēšanas iestatījumu. Noklikšķiniet uz Atcelt, lai izietu no vedņa.</String>
235 <String Id="VerifyReadyDlgRemoveTitle" Overridable="yes">{\WixUI_Font_Title}Gatavs [ProductName] noņemšanai</String>
236 <String Id="VerifyReadyDlgUpdate" Overridable="yes">Atja&amp;unināt</String>
237 <String Id="VerifyReadyDlgUpdateText" Overridable="yes">Noklikšķiniet uz Atjaunināt, lai atjauninātu [ProductName] no datora. Noklikšķiniet uz Atpakaļ, lai pārskatītu vai mainītu jebkuru instalēšanas iestatījumu. Noklikšķiniet uz Atcelt, lai izietu no vedņa.</String>
238 <String Id="VerifyReadyDlgUpdateTitle" Overridable="yes">{\WixUI_Font_Title}Gatavs [ProductName] atjaunināšanai</String>
239
240 <String Id="WaitForCostingDlg_Title" Overridable="yes">[ProductName] uzstādīšana</String>
241 <String Id="WaitForCostingDlgReturn" Overridable="yes">&amp;Atgriezt</String>
242 <String Id="WaitForCostingDlgText" Overridable="yes">Lūdzu, uzgaidiet, kamēr instalēšanas programma pabeidz noteikt nepieciešamo vietu diskā.</String>
243 <String Id="WaitForCostingDlgIcon" Overridable="yes">WixUI_Ico_Exclam</String>
244 <String Id="WaitForCostingDlgIconTooltip" Overridable="yes">Izsaukuma zīmes ikona</String>
245
246 <String Id="WelcomeDlg_Title" Overridable="yes">[ProductName] uzstādīšana</String>
247 <String Id="WelcomeDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
248 <String Id="WelcomeDlgDescription" Overridable="yes">Izmantojot uzstādīšanas vedni, datorā tiks instalēts [ProductName]. Noklikšķiniet uz Tālāk, lai turpinātu, vai uz Atcelt, lai izietu no uzstādīšanas vedņa.</String>
249 <String Id="WelcomeUpdateDlgDescriptionUpdate" Overridable="yes">Izmantojot uzstādīšanas vedni, datorā tiks atjaunināts [ProductName]. Noklikšķiniet uz Tālāk, lai turpinātu, vai uz Atcelt, lai izietu no uzstādīšanas vedņa.</String>
250 <String Id="WelcomeDlgTitle" Overridable="yes">{\WixUI_Font_Bigger}Esiet sveicināts [ProductName] uzstādīšanas vednī!</String>
251
252 <String Id="WelcomeEulaDlg_Title" Overridable="yes">[ProductName] uzstādīšana</String>
253 <String Id="WelcomeEulaDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
254 <String Id="WelcomeEulaDlgLicenseAcceptedCheckBox" Overridable="yes">Es &amp;piekrītu licences līguma nosacījumiem</String>
255 <String Id="WelcomeEulaDlgInstall" Overridable="yes">&amp;Instalēt</String>
256 <String Id="WelcomeEulaDlgUpdate" Overridable="yes">Atja&amp;unināt</String>
257 <String Id="WelcomeEulaDlgTitle" Overridable="yes">{\WixUI_Font_Title}Lūdzu, izlasiet [ProductName] licences līgumu</String>
258
259 <String Id="ProgressTextInstallValidate" Overridable="yes">Notiek instalācijas validācija</String>
260 <String Id="ProgressTextInstallFiles" Overridable="yes">Notiek jauno failu kopēšana</String>
261 <String Id="ProgressTextInstallFilesTemplate" Overridable="yes">Fails: [1], direktorijs: [9], lielums: [6]</String>
262 <String Id="ProgressTextInstallAdminPackage" Overridable="yes">Notiek tīkla instalācijas failu kopēšana</String>
263 <String Id="ProgressTextInstallAdminPackageTemplate" Overridable="yes">Fails: [1], direktorijs: [9], lielums: [6]</String>
264 <String Id="ProgressTextFileCost" Overridable="yes">Notiek nepieciešamās vietas aprēķināšana</String>
265 <String Id="ProgressTextCostInitialize" Overridable="yes">Notiek nepieciešamās vietas aprēķināšana</String>
266 <String Id="ProgressTextCostFinalize" Overridable="yes">Notiek nepieciešamās vietas aprēķināšana</String>
267 <String Id="ProgressTextCreateShortcuts" Overridable="yes">Notiek saīšņu izveide</String>
268 <String Id="ProgressTextCreateShortcutsTemplate" Overridable="yes">Saīsne: [1]</String>
269 <String Id="ProgressTextPublishComponents" Overridable="yes">Notiek atbilstošo komponentu publicēšana</String>
270 <String Id="ProgressTextPublishComponentsTemplate" Overridable="yes">Komponenta ID: [1], kvalifikators: [2]</String>
271 <String Id="ProgressTextPublishFeatures" Overridable="yes">Notiek produkta līdzekļu publicēšana</String>
272 <String Id="ProgressTextPublishFeaturesTemplate" Overridable="yes">Līdzeklis: [1]</String>
273 <String Id="ProgressTextPublishProduct" Overridable="yes">Notiek produkta informācijas publicēšana</String>
274 <String Id="ProgressTextRegisterClassInfo" Overridable="yes">Notiek klašu serveru reģistrēšana</String>
275 <String Id="ProgressTextRegisterClassInfoTemplate" Overridable="yes">Klases ID: [1]</String>
276 <String Id="ProgressTextRegisterExtensionInfo" Overridable="yes">Notiek paplašinājumu serveru reģistrēšana</String>
277 <String Id="ProgressTextRegisterExtensionInfoTemplate" Overridable="yes">Paplašinājums: [1]</String>
278 <String Id="ProgressTextRegisterMIMEInfo" Overridable="yes">Notiek MIME informācijas reģistrēšana</String>
279 <String Id="ProgressTextRegisterMIMEInfoTemplate" Overridable="yes">MIME satura tips: [1], paplašinājums: [2]</String>
280 <String Id="ProgressTextRegisterProgIdInfo" Overridable="yes">Notiek programmu identifikatoru reģistrēšana</String>
281 <String Id="ProgressTextRegisterProgIdInfoTemplate" Overridable="yes">ProgId: [1]</String>
282 <String Id="ProgressTextAllocateRegistrySpace" Overridable="yes">Notiek reģistra vietas piešķiršana</String>
283 <String Id="ProgressTextAllocateRegistrySpaceTemplate" Overridable="yes">Brīva vieta: [1]</String>
284 <String Id="ProgressTextAppSearch" Overridable="yes">Notiek instalēto lietojumprogrammu meklēšana</String>
285 <String Id="ProgressTextAppSearchTemplate" Overridable="yes">Rekvizīts: [1], paraksts: [2]</String>
286 <String Id="ProgressTextBindImage" Overridable="yes">Notiek izpildāmo failu saistīšana</String>
287 <String Id="ProgressTextBindImageTemplate" Overridable="yes">Fails: [1]</String>
288 <String Id="ProgressTextCCPSearch" Overridable="yes">Notiek atbilstošu produktu meklēšana</String>
289 <String Id="ProgressTextCreateFolders" Overridable="yes">Notiek mapju izveide</String>
290 <String Id="ProgressTextCreateFoldersTemplate" Overridable="yes">Mape: [1]</String>
291 <String Id="ProgressTextDeleteServices" Overridable="yes">Notiek pakalpojumu dzēšana</String>
292 <String Id="ProgressTextDeleteServicesTemplate" Overridable="yes">Pakalpojums: [1]</String>
293 <String Id="ProgressTextDuplicateFiles" Overridable="yes">Notiek failu dublikātu izveide</String>
294 <String Id="ProgressTextDuplicateFilesTemplate" Overridable="yes">Fails: [1], direktorijs: [9], lielums: [6]</String>
295 <String Id="ProgressTextFindRelatedProducts" Overridable="yes">Notiek saistīto lietojumprogrammu meklēšana</String>
296 <String Id="ProgressTextFindRelatedProductsTemplate" Overridable="yes">Atrasta lietojumprogramma: [1]</String>
297 <String Id="ProgressTextInstallODBC" Overridable="yes">Notiek ODBC komponentu instalēšana</String>
298 <String Id="ProgressTextInstallServices" Overridable="yes">Notiek jauno pakalpojumu instalēšana</String>
299 <String Id="ProgressTextInstallServicesTemplate" Overridable="yes">Pakalpojums: [2]</String>
300 <String Id="ProgressTextLaunchConditions" Overridable="yes">Notiek palaišanas nosacījumu novērtēšana</String>
301 <String Id="ProgressTextMigrateFeatureStates" Overridable="yes">Notiek līdzekļu stāvokļu migrēšana no saistītajām lietojumprogrammām</String>
302 <String Id="ProgressTextMigrateFeatureStatesTemplate" Overridable="yes">Lietojumprogramma: [1]</String>
303 <String Id="ProgressTextMoveFiles" Overridable="yes">Notiek failu pārvietošana</String>
304 <String Id="ProgressTextMoveFilesTemplate" Overridable="yes">Fails: [1], direktorijs: [9], lielums: [6]</String>
305 <String Id="ProgressTextPatchFiles" Overridable="yes">Notiek failu pielabošana</String>
306 <String Id="ProgressTextPatchFilesTemplate" Overridable="yes">Fails: [1], direktorijs: [2], lielums: [3]</String>
307 <String Id="ProgressTextProcessComponents" Overridable="yes">Notiek komponentu reģistrācijas atjaunināšana</String>
308 <String Id="ProgressTextRegisterComPlus" Overridable="yes">Notiek COM+ lietojumprogrammu un komponentu reģistrēšana</String>
309 <String Id="ProgressTextRegisterComPlusTemplate" Overridable="yes">AppId: [1]{{, AppType: [2], lietotāji: [3], RSN: [4]}}</String>
310 <String Id="ProgressTextRegisterFonts" Overridable="yes">Notiek fontu reģistrēšana</String>
311 <String Id="ProgressTextRegisterFontsTemplate" Overridable="yes">Fonts: [1]</String>
312 <String Id="ProgressTextRegisterProduct" Overridable="yes">Notiek produkta reģistrēšana</String>
313 <String Id="ProgressTextRegisterProductTemplate" Overridable="yes">[1]</String>
314 <String Id="ProgressTextRegisterTypeLibraries" Overridable="yes">Notiek tipu bibliotēku reģistrēšana</String>
315 <String Id="ProgressTextRegisterTypeLibrariesTemplate" Overridable="yes">LibID: [1]</String>
316 <String Id="ProgressTextRegisterUser" Overridable="yes">Notiek lietotāja reģistrēšana</String>
317 <String Id="ProgressTextRegisterUserTemplate" Overridable="yes">[1]</String>
318 <String Id="ProgressTextRemoveDuplicateFiles" Overridable="yes">Notiek failu dublikātu noņemšana</String>
319 <String Id="ProgressTextRemoveDuplicateFilesTemplate" Overridable="yes">Fails: [1], direktorijs: [9]</String>
320 <String Id="ProgressTextRemoveEnvironmentStrings" Overridable="yes">Notiek vides virkņu atjaunināšana</String>
321 <String Id="ProgressTextRemoveEnvironmentStringsTemplate" Overridable="yes">Nosaukums: [1], vērtība: [2], darbība [3]</String>
322 <String Id="ProgressTextRemoveExistingProducts" Overridable="yes">Notiek lietojumprogrammu noņemšana</String>
323 <String Id="ProgressTextRemoveExistingProductsTemplate" Overridable="yes">Lietojumprogramma: [1], komandrinda: [2]</String>
324 <String Id="ProgressTextRemoveFiles" Overridable="yes">Notiek failu noņemšana</String>
325 <String Id="ProgressTextRemoveFilesTemplate" Overridable="yes">Fails: [1], direktorijs: [9]</String>
326 <String Id="ProgressTextRemoveFolders" Overridable="yes">Notiek mapju noņemšana</String>
327 <String Id="ProgressTextRemoveFoldersTemplate" Overridable="yes">Mape: [1]</String>
328 <String Id="ProgressTextRemoveIniValues" Overridable="yes">Notiek INI failu ierakstu noņemšana</String>
329 <String Id="ProgressTextRemoveIniValuesTemplate" Overridable="yes">Fails: [1], sadaļa: [2], atslēga: [3], vērtība: [4]</String>
330 <String Id="ProgressTextRemoveODBC" Overridable="yes">Notiek ODBC komponentu noņemšana</String>
331 <String Id="ProgressTextRemoveRegistryValues" Overridable="yes">Notiek sistēmas reģistra vērtību noņemšana</String>
332 <String Id="ProgressTextRemoveRegistryValuesTemplate" Overridable="yes">Atslēga: [1], nosaukums: [2]</String>
333 <String Id="ProgressTextRemoveShortcuts" Overridable="yes">Notiek saīšņu noņemšana</String>
334 <String Id="ProgressTextRemoveShortcutsTemplate" Overridable="yes">Saīsne: [1]</String>
335 <String Id="ProgressTextRMCCPSearch" Overridable="yes">Notiek atbilstošu produktu meklēšana</String>
336 <String Id="ProgressTextSelfRegModules" Overridable="yes">Notiek moduļu reģistrēšana</String>
337 <String Id="ProgressTextSelfRegModulesTemplate" Overridable="yes">Fails: [1], mape: [2]</String>
338 <String Id="ProgressTextSelfUnregModules" Overridable="yes">Notiek moduļu reģistrācijas noņemšana</String>
339 <String Id="ProgressTextSelfUnregModulesTemplate" Overridable="yes">Fails: [1], mape: [2]</String>
340 <String Id="ProgressTextSetODBCFolders" Overridable="yes">Notiek ODBC direktoriju inicializēšana</String>
341 <String Id="ProgressTextStartServices" Overridable="yes">Notiek pakalpojumu startēšana</String>
342 <String Id="ProgressTextStartServicesTemplate" Overridable="yes">Pakalpojums: [1]</String>
343 <String Id="ProgressTextStopServices" Overridable="yes">Notiek pakalpojumu apturēšana</String>
344 <String Id="ProgressTextStopServicesTemplate" Overridable="yes">Pakalpojums: [1]</String>
345 <String Id="ProgressTextUnpublishComponents" Overridable="yes">Notiek atbilstošo komponentu publicēšanas atcelšana</String>
346 <String Id="ProgressTextUnpublishComponentsTemplate" Overridable="yes">Komponenta ID: [1], kvalifikators: [2]</String>
347 <String Id="ProgressTextUnpublishFeatures" Overridable="yes">Notiek produkta līdzekļu publicēšanas atcelšana</String>
348 <String Id="ProgressTextUnpublishFeaturesTemplate" Overridable="yes">Līdzeklis: [1]</String>
349 <String Id="ProgressTextUnregisterClassInfo" Overridable="yes">Notiek klašu serveru reģistrācijas noņemšana</String>
350 <String Id="ProgressTextUnregisterClassInfoTemplate" Overridable="yes">Klases ID: [1]</String>
351 <String Id="ProgressTextUnregisterComPlus" Overridable="yes">Notiek COM+ lietojumprogrammu un komponentu reģistrācijas noņemšana</String>
352 <String Id="ProgressTextUnregisterComPlusTemplate" Overridable="yes">AppId: [1]{{, AppType: [2]}}</String>
353 <String Id="ProgressTextUnregisterExtensionInfo" Overridable="yes">Notiek paplašinājumu serveru reģistrācijas noņemšana</String>
354 <String Id="ProgressTextUnregisterExtensionInfoTemplate" Overridable="yes">Paplašinājums: [1]</String>
355 <String Id="ProgressTextUnregisterFonts" Overridable="yes">Notiek fontu reģistrācijas noņemšana</String>
356 <String Id="ProgressTextUnregisterFontsTemplate" Overridable="yes">Fonts: [1]</String>
357 <String Id="ProgressTextUnregisterMIMEInfo" Overridable="yes">Notiek MIME informācijas reģistrācijas noņemšana</String>
358 <String Id="ProgressTextUnregisterMIMEInfoTemplate" Overridable="yes">MIME satura tips: [1], paplašinājums: [2]</String>
359 <String Id="ProgressTextUnregisterProgIdInfo" Overridable="yes">Notiek programmu identifikatoru reģistrācijas noņemšana</String>
360 <String Id="ProgressTextUnregisterProgIdInfoTemplate" Overridable="yes">ProgId: [1]</String>
361 <String Id="ProgressTextUnregisterTypeLibraries" Overridable="yes">Notiek tipu bibliotēku reģistrācijas noņemšana</String>
362 <String Id="ProgressTextUnregisterTypeLibrariesTemplate" Overridable="yes">LibID: [1]</String>
363 <String Id="ProgressTextWriteEnvironmentStrings" Overridable="yes">Notiek vides virkņu atjaunināšana</String>
364 <String Id="ProgressTextWriteEnvironmentStringsTemplate" Overridable="yes">Nosaukums: [1], vērtība: [2], darbība [3]</String>
365 <String Id="ProgressTextWriteIniValues" Overridable="yes">Notiek INI failu vērtību rakstīšana</String>
366 <String Id="ProgressTextWriteIniValuesTemplate" Overridable="yes">Fails: [1], sadaļa: [2], atslēga: [3], vērtība: [4]</String>
367 <String Id="ProgressTextWriteRegistryValues" Overridable="yes">Notiek sistēmas reģistra vērtību rakstīšana</String>
368 <String Id="ProgressTextWriteRegistryValuesTemplate" Overridable="yes">Atslēga [1], nosaukums: [2], vērtība: [3]</String>
369 <String Id="ProgressTextAdvertise" Overridable="yes">Notiek lietojumprogrammas reklamēšana</String>
370 <String Id="ProgressTextGenerateScript" Overridable="yes">Notiek skriptu operāciju ģenerēšana darbībai:</String>
371 <String Id="ProgressTextGenerateScriptTemplate" Overridable="yes">[1]</String>
372 <String Id="ProgressTextInstallSFPCatalogFile" Overridable="yes">Notiek sistēmas kataloga instalēšana</String>
373 <String Id="ProgressTextInstallSFPCatalogFileTemplate" Overridable="yes">Fails: [1], atkarības: [2]</String>
374 <String Id="ProgressTextMsiPublishAssemblies" Overridable="yes">Notiek montāžas informācijas publicēšana</String>
375 <String Id="ProgressTextMsiPublishAssembliesTemplate" Overridable="yes">Lietojumprogrammas konteksts:[1], montāžas nosaukums:[2]</String>
376 <String Id="ProgressTextMsiUnpublishAssemblies" Overridable="yes">Notiek montāžas informācijas publicēšanas atcelšana</String>
377 <String Id="ProgressTextMsiUnpublishAssembliesTemplate" Overridable="yes">Lietojumprogrammas konteksts:[1], montāžas nosaukums:[2]</String>
378 <String Id="ProgressTextRollback" Overridable="yes">Notiek darbības atrite:</String>
379 <String Id="ProgressTextRollbackTemplate" Overridable="yes">[1]</String>
380 <String Id="ProgressTextRollbackCleanup" Overridable="yes">Notiek dublējuma failu noņemšana</String>
381 <String Id="ProgressTextRollbackCleanupTemplate" Overridable="yes">Fails: [1]</String>
382 <String Id="ProgressTextUnmoveFiles" Overridable="yes">Notiek pārvietoto failu noņemšana</String>
383 <String Id="ProgressTextUnmoveFilesTemplate" Overridable="yes">Fails: [1], direktorijs: [9]</String>
384 <String Id="ProgressTextUnpublishProduct" Overridable="yes">Notiek produkta informācijas publicēšanas atcelšana</String>
385
386 <String Id="Error0" Overridable="yes">{{Fatāla kļūda: }}</String>
387 <String Id="Error1" Overridable="yes">{{Kļūda [1]. }}</String>
388 <String Id="Error2" Overridable="yes">Brīdinājums [1]. </String>
389 <String Id="Error4" Overridable="yes">Informācija [1]. </String>
390 <String Id="Error5" Overridable="yes">Instalējot šo pakotni, instalēšanas programmā radās neparedzēta kļūda. Tas var norādīt uz problēmu, kas saistīta ar šo pakotni. Kļūdas kods ir [1]. {{Argumenti ir šādi: [2], [3], [4]}}</String>
391 <String Id="Error7" Overridable="yes">{{Disks ir pilns: }}</String>
392 <String Id="Error8" Overridable="yes">Darbība [Time]: [1]. [2]</String>
393 <String Id="Error9" Overridable="yes">[ProductName]</String>
394 <String Id="Error10" Overridable="yes">{[2]}{, [3]}{, [4]}</String>
395 <String Id="Error11" Overridable="yes">Ziņojuma tips: [1], arguments: [2]</String>
396 <String Id="Error12" Overridable="yes">=== Reģistrēšana sākta: [Date] [Time] ===</String>
397 <String Id="Error13" Overridable="yes">=== Reģistrēšana apturēta: [Date] [Time] ===</String>
398 <String Id="Error14" Overridable="yes">Darbība sākta [Time]: [1].</String>
399 <String Id="Error15" Overridable="yes">Darbība pabeigta [Time]: [1]. Atgrieztā vērtība [2].</String>
400 <String Id="Error16" Overridable="yes">Atlikušais laiks: {[1] minūtes }{[2] sekundes}</String>
401 <String Id="Error17" Overridable="yes">Nepietiek atmiņas. Pirms mēģināt vēlreiz, aizveriet pārējās lietojumprogrammas.</String>
402 <String Id="Error18" Overridable="yes">Instalēšanas programma vairs nereaģē.</String>
403 <String Id="Error19" Overridable="yes">Instalēšanas programma tika priekšlaikus apturēta.</String>
404 <String Id="Error20" Overridable="yes">Lūdzu, gaidiet, kamēr sistēma Windows konfigurē produktu [ProductName].</String>
405 <String Id="Error21" Overridable="yes">Notiek nepieciešamās informācijas apkopošana...</String>
406 <String Id="Error22" Overridable="yes">Notiek vecāku šīs lietojumprogrammas versiju noņemšana...</String>
407 <String Id="Error23" Overridable="yes">Notiek gatavošanās noņemt vecākas šīs lietojumprogrammas versijas...</String>
408 <String Id="Error32" Overridable="yes">Produkta {[ProductName] }uzstādīšana ir sekmīgi pabeigta.</String>
409 <String Id="Error33" Overridable="yes">Produkta {[ProductName] } uzstādīšana neizdevās.</String>
410 <String Id="Error1101" Overridable="yes">Lasot no faila, radās kļūda: [2]. {{ Sistēmas kļūda [3].}} Pārbaudiet, vai šis fails pastāv un vai varat tam piekļūt.</String>
411 <String Id="Error1301" Overridable="yes">Nevarēja izveidot failu '[2]'. Direktorijs ar šādu nosaukumu jau pastāv. Atceliet instalēšanu un mēģiniet instalēt citā atrašanās vietā.</String>
412 <String Id="Error1302" Overridable="yes">Lūdzu, ievietojiet disku: [2]</String>
413 <String Id="Error1303" Overridable="yes">Instalēšanas programmai nav vajadzīgo atļauju, lai piekļūtu šim direktorijam: [2]. Instalēšanu nevar turpināt. Piesakieties kā administrators vai arī sazinieties ar sistēmas administratoru.</String>
414 <String Id="Error1304" Overridable="yes">Rakstot failā, radās kļūda: [2]. Pārbaudiet, vai jums ir piekļuve šim direktorijam.</String>
415 <String Id="Error1305" Overridable="yes">Lasot no faila, radās kļūda: [2]. {{ Sistēmas kļūda [3].}} Pārbaudiet, vai šis fails pastāv un vai varat tam piekļūt.</String>
416 <String Id="Error1306" Overridable="yes">Citai lietojumprogrammai ir ekskluzīvas tiesības piekļūt failam '[2]'. Aizveriet visas pārējās lietojumprogrammas un pēc tam noklikšķiniet uz Mēģināt vēlreiz.</String>
417 <String Id="Error1307" Overridable="yes">Faila [2] instalēšanai nepietiek vietas diskā. Atbrīvojiet vietu diskā un noklikšķiniet uz Mēģināt vēlreiz, vai noklikšķiniet uz Atcelt, lai izietu.</String>
418 <String Id="Error1308" Overridable="yes">Avota fails netika atrasts: [2]. Pārbaudiet, vai šis fails pastāv un vai varat tam piekļūt.</String>
419 <String Id="Error1309" Overridable="yes">Lasot no faila, radās kļūda: [3]. {{ Sistēmas kļūda [2].}} Pārbaudiet, vai šis fails pastāv un vai varat tam piekļūt.</String>
420 <String Id="Error1310" Overridable="yes">Rakstot failā, radās kļūda: [3]. {{ Sistēmas kļūda [2].}} Pārbaudiet, vai jums ir piekļuve šim direktorijam.</String>
421 <String Id="Error1311" Overridable="yes">Avota fails netika atrasts{{(kabinetfails)}}: [2]. Pārbaudiet, vai šis fails pastāv un vai varat tam piekļūt.</String>
422 <String Id="Error1312" Overridable="yes">Nevar izveidot direktoriju [2]. Jau pastāv fails ar tādu pašu nosaukumu. Pārdēvējiet vai izdzēsiet failu un noklikšķiniet uz Mēģināt vēlreiz vai noklikšķiniet uz Atcelt, lai izietu.</String>
423 <String Id="Error1313" Overridable="yes">Sējums [2] pašlaik nav pieejams. Atlasiet citu.</String>
424 <String Id="Error1314" Overridable="yes">Norādītais ceļš '[2]' nav pieejams.</String>
425 <String Id="Error1315" Overridable="yes">Nevar rakstīt norādītajā mapē: [2].</String>
426 <String Id="Error1316" Overridable="yes">Mēģinot lasīt šo failu, radās tīkla kļūda: [2]</String>
427 <String Id="Error1317" Overridable="yes">Mēģinot izveidot direktoriju, radās kļūda: [2]</String>
428 <String Id="Error1318" Overridable="yes">Mēģinot izveidot direktoriju, radās tīkla kļūda: [2]</String>
429 <String Id="Error1319" Overridable="yes">Mēģinot atvērt avota faila kabinetfailu, radās tīkla kļūda: [2]</String>
430 <String Id="Error1320" Overridable="yes">Norādītais ceļš ir pārāk garš: [2]</String>
431 <String Id="Error1321" Overridable="yes">Instalēšanas programmai nav vajadzīgo atļauju, lai modificētu šo failu: [2].</String>
432 <String Id="Error1322" Overridable="yes">Mapes ceļa '[2]' daļa nav derīga. Tā ir tukša vai arī pārsniedz sistēmas atļauto garumu.</String>
433 <String Id="Error1323" Overridable="yes">Mapes ceļā '[2]' ir ietverti vārdi, kas nav derīgi izmantošanai mapes ceļā.</String>
434 <String Id="Error1324" Overridable="yes">Mapes ceļā '[2]' ir ietverta nederīga rakstzīme.</String>
435 <String Id="Error1325" Overridable="yes">'[2]' nav derīgs īsais faila nosaukums.</String>
436 <String Id="Error1326" Overridable="yes">Iegūstot faila drošību, radās kļūda: [3] GetLastError: [2]</String>
437 <String Id="Error1327" Overridable="yes">Nederīgs diskdzinis: [2]</String>
438 <String Id="Error1328" Overridable="yes">Lietojot ielāpu failam [2], radās kļūda. Iespējams, ka šis fails ir atjaunināts citā veidā un to vairs nevar modificēt, lietojot šo ielāpu. Lai iegūtu papildinformāciju, sazinieties ar ielāpa piegādātāju. {{Sistēmas kļūda: [3]}}</String>
439 <String Id="Error1329" Overridable="yes">Nepieciešamo failu nevar instalēt, jo kabinetfailam [2] nav ciparparaksta. Tas var norādīt, ka kabinetfails ir bojāts.</String>
440 <String Id="Error1330" Overridable="yes">Nevar instalēt nepieciešamu failu, jo kabinetfaila [2] ciparparaksts nav derīgs. Tas var norādīt, ka kabinetfails ir bojāts.{{ Kļūdu [3] atgrieza WinVerifyTrust.}}</String>
441 <String Id="Error1331" Overridable="yes">Neizdevās pareizi kopēt [2] failu: CRC kļūda.</String>
442 <String Id="Error1332" Overridable="yes">Neizdevās pareizi pārvietot [2] failu: CRC kļūda.</String>
443 <String Id="Error1333" Overridable="yes">Neizdevās pareizi pielabot [2] failu: CRC kļūda.</String>
444 <String Id="Error1334" Overridable="yes">Failu '[2]' nevar instalēt, jo tas nav atrodams kabinetfailā '[3]'. Tas var norādīt, ka ir radusies tīkla kļūda, CD-ROM lasīšanas kļūda vai ar šo pakotni saistīta problēma.</String>
445 <String Id="Error1335" Overridable="yes">Šai instalācijai nepieciešamais kabinetfails '[2]' ir bojāts, un to nevar izmantot. Tas var norādīt, ka ir radusies tīkla kļūda, kompaktdiska lasīšanas kļūda vai ar šo pakotni saistīta problēma.</String>
446 <String Id="Error1336" Overridable="yes">Veidojot pagaidu failu, kas nepieciešams šīs instalācijas pabeigšanai, radās kļūda.{{ Mape: [3]. Sistēmas kļūdas kods: [2]}}</String>
447 <String Id="Error1401" Overridable="yes">Nevarēja izveidot atslēgu: [2].{{ Sistēmas kļūda [3].}} Pārbaudiet, vai jums ir nepieciešamā piekļuve šai atslēgai, vai sazinieties ar atbalsta dienestu. </String>
448 <String Id="Error1402" Overridable="yes">Nevarēja atvērt atslēgu: [2].{{ Sistēmas kļūda [3].}} Pārbaudiet, vai jums ir nepieciešamā piekļuve šai atslēgai, vai sazinieties ar atbalsta dienestu. </String>
449 <String Id="Error1403" Overridable="yes">Nevarēja dzēst atslēgas [3] vērtību [2]. {{ Sistēmas kļūda [4].}} Pārbaudiet, vai jums ir nepieciešamā piekļuve šai atslēgai, vai sazinieties ar atbalsta dienestu. </String>
450 <String Id="Error1404" Overridable="yes">Nevarēja dzēst atslēgu [2].{{ Sistēmas kļūda [3].}} Pārbaudiet, vai jums ir nepieciešamā piekļuve šai atslēgai, vai sazinieties ar atbalsta dienestu. </String>
451 <String Id="Error1405" Overridable="yes">Nevarēja nolasīt atslēgas [3] vērtību [2].{{ Sistēmas kļūda [4].}} Pārbaudiet, vai jums ir nepieciešamā piekļuve šai atslēgai, vai sazinieties ar atbalsta dienestu. </String>
452 <String Id="Error1406" Overridable="yes">Atslēgā [3] nevarēja ierakstīt vērtību [2].{{ Sistēmas kļūda [4].}} Pārbaudiet, vai jums ir nepieciešamā piekļuve šai atslēgai, vai sazinieties ar atbalsta dienestu.</String>
453 <String Id="Error1407" Overridable="yes">Nevarēja iegūt atslēgas [2] vērtību nosaukumus.{{ Sistēmas kļūda [3].}} Pārbaudiet, vai jums ir nepieciešamā piekļuve šai atslēgai, vai sazinieties ar atbalsta dienestu.</String>
454 <String Id="Error1408" Overridable="yes">Nevarēja iegūt atslēgas [2] apakšatslēgu nosaukumus.{{ Sistēmas kļūda [3].}} Pārbaudiet, vai jums ir nepieciešamā piekļuve šai atslēgai, vai sazinieties ar atbalsta dienestu.</String>
455 <String Id="Error1409" Overridable="yes">Nevarēja izlasīt atslēgas [2] drošības informāciju.{{ Sistēmas kļūda [3].}} Pārbaudiet, vai jums ir nepieciešamā piekļuve šai atslēgai, vai sazinieties ar atbalsta dienestu.</String>
456 <String Id="Error1410" Overridable="yes">Nevarēja palielināt pieejamo reģistra vietu. Lai instalētu šo lietojumprogrammu, ir nepieciešami [2] KB brīvas reģistra vietas.</String>
457 <String Id="Error1500" Overridable="yes">Notiek cits instalēšanas process. Tas ir jāpabeidz, pirms turpināt šo instalēšanu.</String>
458 <String Id="Error1501" Overridable="yes">Piekļūstot drošiem datiem, radās kļūda. Pārliecinieties, vai līdzeklis Windows Installer ir konfigurēts pareizi, un mēģiniet to instalēt vēlreiz.</String>
459 <String Id="Error1502" Overridable="yes">Lietotājs '[2]' iepriekš uzsāka produkta [3] instalēšanu. Lai produktu varētu izmantot, šim lietotājam ir vēlreiz jāpalaiž norādītā instalēšana. Tūlīt tiks turpināta pašreizējā instalēšana.</String>
460 <String Id="Error1503" Overridable="yes">Lietotājs '[2]' iepriekš uzsāka produkta [3] instalēšanu. Lai produktu varētu izmantot, šim lietotājam ir vēlreiz jāpalaiž norādītā instalēšana.</String>
461 <String Id="Error1601" Overridable="yes">Nepietiek vietas diskā -- sējums: '[2]'; nepieciešamā vieta: [3] KB; pieejamā vieta: [4] KB. Atbrīvojiet vietu diskā un mēģiniet vēlreiz.</String>
462 <String Id="Error1602" Overridable="yes">Vai tiešām vēlaties atcelt?</String>
463 <String Id="Error1603" Overridable="yes">Failu [2][3] jau izmanto{ šāds process: nosaukums: [4], ID: [5], loga nosaukums: [6]}. Aizveriet šo lietojumprogrammu un mēģiniet vēlreiz.</String>
464 <String Id="Error1604" Overridable="yes">Produkts [2] jau ir instalēts, un tas neļauj instalēt šo produktu. Šie divi produkti nav saderīgi.</String>
465 <String Id="Error1605" Overridable="yes">Sējumā '[2]' nepietiek vietas diskā, lai turpinātu instalēšanu ar iespējotu atkopšanu. Nepieciešami [3] KB, bet ir pieejami tikai [4] KB. Noklikšķiniet uz Ignorēt, lai turpinātu instalēšanu, nesaglabājot atkopšanas informāciju, noklikšķiniet uz Mēģināt vēlreiz, lai vēlreiz pārbaudītu vietas pieejamību, vai noklikšķiniet uz Atcelt, lai beigtu instalēšanu.</String>
466 <String Id="Error1606" Overridable="yes">Nevarēja piekļūt tīkla vietai [2].</String>
467 <String Id="Error1607" Overridable="yes">Lai varētu turpināt instalēšanu, ir jāaizver šīs lietojumprogrammas:</String>
468 <String Id="Error1608" Overridable="yes">Datorā, kurā paredzēta šī produkta instalēšana, nevarēja atrast nevienu agrāk instalētu atbilstošu produktu.</String>
469 <String Id="Error1609" Overridable="yes">Lietojot drošības iestatījumus, radās kļūda. [2] nav derīgs lietotājs vai grupa. Iespējams, ka problēma saistīta ar šo pakotni vai savienojuma izveidi ar domēna kontrolleri tīklā. Pārbaudiet tīkla savienojumu un noklikšķiniet uz Mēģināt vēlreiz vai noklikšķiniet uz Atcelt, lai beigtu instalēšanu. {{Nevar atrast lietotāja SID, sistēmas kļūda [3]}}</String>
470 <String Id="Error1701" Overridable="yes">Atslēga [2] nav derīga. Pārbaudiet, vai ievadījāt pareizo atslēgu.</String>
471 <String Id="Error1702" Overridable="yes">Lai varētu tupināt [2] konfigurēšanu, instalēšanas programmai ir jārestartē sistēma. Noklikšķiniet uz Jā, lai restartētu tūlīt, vai uz Nē, ja vēlaties manuāli restartēt vēlāk.</String>
472 <String Id="Error1703" Overridable="yes">Lai [2] konfigurācijas izmaiņas stātos spēkā, ir jārestartē sistēma. Noklikšķiniet uz Jā, lai restartētu tūlīt, vai uz Nē, ja vēlaties manuāli restartēt vēlāk.</String>
473 <String Id="Error1704" Overridable="yes">Produkta [2] instalēšana pašlaik ir aizturēta. Lai turpinātu, ir jāatsauc šīs instalēšanas laikā veiktās izmaiņas. Vai vēlaties atsaukt šīs izmaiņas?</String>
474 <String Id="Error1705" Overridable="yes">Notiek iepriekš uzsākta šī produkta instalēšana. Lai turpinātu, ir jāatsauc šīs instalēšanas laikā veiktās izmaiņas. Vai vēlaties atsaukt šīs izmaiņas?</String>
475 <String Id="Error1706" Overridable="yes">Nevar atrast produkta [2] instalācijas pakotni. Mēģiniet to instalēt vēlreiz, izmantojot derīgu instalācijas pakotnes '[3]' kopiju.</String>
476 <String Id="Error1707" Overridable="yes">Instalēšana ir sekmīgi pabeigta.</String>
477 <String Id="Error1708" Overridable="yes">Instalēšana neizdevās.</String>
478 <String Id="Error1709" Overridable="yes">Produkts: [2] -- [3]</String>
479 <String Id="Error1710" Overridable="yes">Varat atjaunot datora iepriekšējo stāvokli vai turpināt instalēšanu vēlāk. Vai vēlaties veikt atjaunošanu?</String>
480 <String Id="Error1711" Overridable="yes">Rakstot diskā instalācijas informāciju, radās kļūda. Pārbaudiet, vai diskā ir pietiekami daudz vietas, un noklikšķiniet uz Mēģināt vēlreiz vai noklikšķiniet uz Atcelt, lai beigtu instalēšanu.</String>
481 <String Id="Error1712" Overridable="yes">Nevarēja atrast vienu vai vairākus failus, kas nepieciešami datora iepriekšējā stāvokļa atjaunošanai. Atjaunošana nav iespējama.</String>
482 <String Id="Error1713" Overridable="yes">[2] nevarēja instalēt vienu no nepieciešamajiem produktiem. Sazinieties ar tehniskā atbalsta grupu. {{Sistēmas kļūda: [3].}}</String>
483 <String Id="Error1714" Overridable="yes">Nevarēja noņemt produkta [2] iepriekšējo versiju. Sazinieties ar tehniskā atbalsta grupu. {{Sistēmas kļūda [3].}}</String>
484 <String Id="Error1715" Overridable="yes">[2] ir instalēts</String>
485 <String Id="Error1716" Overridable="yes">[2] ir konfigurēts</String>
486 <String Id="Error1717" Overridable="yes">[2] ir noņemts</String>
487 <String Id="Error1718" Overridable="yes">Saskaņā ar ciparparakstu politiku fails [2] tika noraidīts.</String>
488 <String Id="Error1719" Overridable="yes">Nevarēja piekļūt pakalpojumam Windows Installer. Tā var notikt, ja Windows darbojas drošajā režīmā vai arī pakalpojums Windows Installer nav pareizi instalēts. Lai iegūtu papildinformāciju, sazinieties ar atbalsta dienestu.</String>
489 <String Id="Error1720" Overridable="yes">Pastāv ar šo Windows Installer pakotni saistīta problēma. Nevarēja palaist šīs instalēšanas pabeigšanai nepieciešamo skriptu. Sazinieties ar atbalsta dienestu vai pakotnes piegādātāju. {{Pielāgotas darbības [2] skripta kļūda [3], [4]: [5] rinda [6], kolonna [7], [8] }}</String>
490 <String Id="Error1721" Overridable="yes">Pastāv ar šo Windows Installer pakotni saistīta problēma. Nevarēja palaist šīs instalācijas pabeigšanai nepieciešamo programmu. Sazinieties ar atbalsta dienestu vai pakotnes piegādātāju. {{Darbība: [2], atrašanās vieta: [3], komanda: [4] }}</String>
491 <String Id="Error1722" Overridable="yes">Pastāv ar šo Windows Installer pakotni saistīta problēma. Programma, kas tika palaista kā uzstādīšanas daļa, netika pabeigta, kā paredzēts. Sazinieties ar atbalsta dienestu vai pakotnes piegādātāju. {{Darbība [2], atrašanās vieta: [3], komanda: [4] }}</String>
492 <String Id="Error1723" Overridable="yes">Pastāv ar šo Windows Installer pakotni saistīta problēma. Nevar palaist šīs instalēšanas pabeigšanai nepieciešamo DDL. Sazinieties ar atbalsta dienestu vai pakotnes piegādātāju. {{Darbība: [2], atrašanās vieta: [3], komanda: [4] }}</String>
493 <String Id="Error1724" Overridable="yes">Noņemšana ir sekmīgi pabeigta.</String>
494 <String Id="Error1725" Overridable="yes">Noņemšana neizdevās.</String>
495 <String Id="Error1726" Overridable="yes">Reklamēšana ir sekmīgi pabeigta.</String>
496 <String Id="Error1727" Overridable="yes">Reklamēšana neizdevās.</String>
497 <String Id="Error1728" Overridable="yes">Konfigurēšana ir sekmīgi pabeigta.</String>
498 <String Id="Error1729" Overridable="yes">Konfigurēšana neizdevās.</String>
499 <String Id="Error1730" Overridable="yes">Lai noņemtu šo lietojumprogrammu, jums ir jābūt administratora tiesībām. Lai noņemtu šo lietojumprogrammu, piesakieties kā administrators vai sazinieties ar tehniskā atbalsta grupu, lai saņemtu palīdzību.</String>
500 <String Id="Error1731" Overridable="yes">Produkta [2] avota instalācijas pakotne nav sinhronizēta ar klienta pakotni. Mēģiniet instalēt vēlreiz, izmantojot derīgu instalācijas pakotnes '[3]' kopiju.</String>
501 <String Id="Error1732" Overridable="yes">Lai pabeigtu produkta [2] instalēšanu, ir jārestartē dators. Šajā datorā pašlaik ir pieteikušies citi lietotāji, un restartējot, iespējams, zudīs viņu padarītais. Vai vēlaties restartēt tūlīt?</String>
502 <String Id="Error1801" Overridable="yes">Ceļš [2] nav derīgs. Norādiet derīgu ceļu.</String>
503 <String Id="Error1802" Overridable="yes">Nepietiek atmiņas. Pirms mēģināt vēlreiz, aizveriet pārējās lietojumprogrammas.</String>
504 <String Id="Error1803" Overridable="yes">Diskdzinī [2] nav diska. Lūdzu, ievietojiet disku un noklikšķiniet uz Mēģināt vēlreiz vai noklikšķiniet uz Atcelt, lai atgrieztos pie iepriekš atlasītā sējuma.</String>
505 <String Id="Error1804" Overridable="yes">Diskdzinī [2] nav diska. Lūdzu, ievietojiet disku un noklikšķiniet uz Mēģināt vēlreiz vai noklikšķiniet uz Atcelt, lai atgrieztos pārlūkošanas dialoglodziņā un atlasītu citu sējumu.</String>
506 <String Id="Error1805" Overridable="yes">Mape [2] nepastāv. Lūdzu, ievadiet ceļu uz esošu mapi.</String>
507 <String Id="Error1806" Overridable="yes">Jums nav vajadzīgo atļauju, lai lasītu šo mapi.</String>
508 <String Id="Error1807" Overridable="yes">Nevarēja noteikt derīgu instalācijas mērķa mapi.</String>
509 <String Id="Error1901" Overridable="yes">Mēģinot lasīt no avota instalācijas datu bāzes, radās kļūda: [2].</String>
510 <String Id="Error1902" Overridable="yes">Notiek atsāknēšanas operācijas plānošana: fails [2] tiek pārdēvēts par [3]. Lai pabeigtu operāciju, ir jāveic atkārtota sāknēšana.</String>
511 <String Id="Error1903" Overridable="yes">Notiek atsāknēšanas operācijas plānošana: tiek dzēsts fails [2]. Lai pabeigtu operāciju, ir jāveic atkārtota sāknēšana.</String>
512 <String Id="Error1904" Overridable="yes">Neizdevās reģistrēt moduli [2]. HRESULT [3]. Sazinieties ar atbalsta dienestu.</String>
513 <String Id="Error1905" Overridable="yes">Neizdevās noņemt moduļa [2] reģistrāciju. HRESULT [3]. Sazinieties ar atbalsta dienestu.</String>
514 <String Id="Error1906" Overridable="yes">Pakotni [2] neizdevās ierakstīt kešatmiņā. Kļūda: [3]. Sazinieties ar tehniskā atbalsta dienestu.</String>
515 <String Id="Error1907" Overridable="yes">Nevarēja reģistrēt fontu [2]. Pārbaudiet, vai jums ir vajadzīgās atļaujas, lai instalētu fontus, un vai sistēma atbalsta šo fontu.</String>
516 <String Id="Error1908" Overridable="yes">Nevarēja noņemt fonta [2] reģistrāciju. Pārbaudiet, vai jums ir vajadzīgās atļaujas, lai noņemtu fontus.</String>
517 <String Id="Error1909" Overridable="yes">Nevarēja izveidot saīsni [2]. Pārbaudiet, vai adresāta mape pastāv un vai varat tai piekļūt.</String>
518 <String Id="Error1910" Overridable="yes">Nevarēja noņemt saīsni [2]. Pārbaudiet, vai šīs saīsnes fails pastāv un vai varat tam piekļūt.</String>
519 <String Id="Error1911" Overridable="yes">Nevarēja reģistrēt faila [2] tipu bibliotēku. Sazinieties ar atbalsta dienestu.</String>
520 <String Id="Error1912" Overridable="yes">Nevarēja noņemt faila [2] tipu bibliotēkas reģistrāciju. Sazinieties ar atbalsta dienestu.</String>
521 <String Id="Error1913" Overridable="yes">Nevarēja atjaunināt INI failu [2][3]. Pārbaudiet, vai šis fails pastāv un vai varat tam piekļūt.</String>
522 <String Id="Error1914" Overridable="yes">Nevarēja ieplānot, lai atkārtotas sāknēšanas laikā fails [3] tiktu aizstāts ar failu [2]. Pārbaudiet, vai jums ir atļauja rakstīt failā [3].</String>
523 <String Id="Error1915" Overridable="yes">Noņemot ODBC draivera pārvaldnieku, radās ODBC kļūda [2]: [3]. Sazinieties ar tehniskā atbalsta dienestu.</String>
524 <String Id="Error1916" Overridable="yes">Instalējot ODBC draivera pārvaldnieku, radās ODBC kļūda [2]: [3]. Sazinieties ar tehniskā atbalsta dienestu.</String>
525 <String Id="Error1917" Overridable="yes">Noņemot ODBC draiveri [4], radās kļūda; ODBC kļūda [2]: [3]. Pārbaudiet, vai jums ir vajadzīgās atļaujas, lai noņemtu ODBC draiverus.</String>
526 <String Id="Error1918" Overridable="yes">Instalējot ODBC draiveri [4], radās kļūda; ODBC kļūda [2]: [3]. Pārbaudiet, vai fails [4] pastāv un vai varat tam piekļūt.</String>
527 <String Id="Error1919" Overridable="yes">Konfigurējot ODBC datu avotu [4], radās kļūda; ODBC kļūda [2]: [3]. Pārbaudiet, vai fails [4] pastāv un vai varat tam piekļūt.</String>
528 <String Id="Error1920" Overridable="yes">Neizdevās startēt pakalpojumu '[2]' ([3]). Pārbaudiet, vai jums ir vajadzīgās atļaujas, lai startētu sistēmas pakalpojumus.</String>
529 <String Id="Error1921" Overridable="yes">Nevarēja apturēt pakalpojumu '[2]' ([3]). Pārbaudiet, vai jums ir vajadzīgās atļaujas, lai apturētu sistēmas pakalpojumus.</String>
530 <String Id="Error1922" Overridable="yes">Nevarēja izdzēst pakalpojumu '[2]' ([3]). Pārbaudiet, vai jums ir vajadzīgās atļaujas, lai noņemtu sistēmas pakalpojumus.</String>
531 <String Id="Error1923" Overridable="yes">Nevarēja instalēt pakalpojumu '[2]' ([3]). Pārbaudiet, vai jums ir vajadzīgās atļaujas, lai instalētu sistēmas pakalpojumus.</String>
532 <String Id="Error1924" Overridable="yes">Nevarēja atjaunināt vides mainīgo '[2]'. Pārbaudiet, vai jums ir nepieciešamās atļaujas, lai modificētu vides mainīgos.</String>
533 <String Id="Error1925" Overridable="yes">Jums nav vajadzīgo atļauju, lai pabeigtu visiem datora lietotājiem paredzēto instalēšanu. Piesakieties sistēmā kā administrators un mēģiniet instalēt vēlreiz.</String>
534 <String Id="Error1926" Overridable="yes">Failam '[3]' nevarēja iestatīt faila drošību. Kļūda: [2]. Pārbaudiet, vai jums ir vajadzīgās atļaujas, lai modificētu šī faila drošības atļaujas.</String>
535 <String Id="Error1927" Overridable="yes">Šajā datorā nav instalēti komponentu pakalpojumi (COM+ 1.0). Lai veiksmīgi pabeigtu šo instalēšanu, ir nepieciešami komponentu pakalpojumi. Komponentu pakalpojumi ir pieejami sistēmā Windows 2000.</String>
536 <String Id="Error1928" Overridable="yes">Reģistrējot COM+ lietojumprogrammu, radās kļūda. Lai iegūtu papildinformāciju, sazinieties ar atbalsta dienestu.</String>
537 <String Id="Error1929" Overridable="yes">Noņemot COM+ lietojumprogrammas reģistrāciju, radās kļūda. Lai iegūtu papildinformāciju, sazinieties ar atbalsta dienestu.</String>
538 <String Id="Error1930" Overridable="yes">Nevarēja mainīt pakalpojuma '[2]' ([3]) aprakstu.</String>
539 <String Id="Error1931" Overridable="yes">Pakalpojums Windows Installer nevar atjaunināt sistēmas failu [2], jo šo failu aizsargā sistēma Windows. Lai šī programma darbotos pareizi, iespējams, ir jāatjaunina operētājsistēma. {{Pakotnes versija: [3], operētājsistēmas aizsargātā versija: [4]}}</String>
540 <String Id="Error1932" Overridable="yes">Pakalpojums Windows Installer nevar atjaunināt aizsargātu sistēmas Windows failu [2]. {{Pakotnes versija: [3], OS aizsargātā faila versija: [4], SFP kļūda: [5].}}</String>
541 <String Id="Error1933" Overridable="yes">Pakalpojums Windows Installer nevar atjaunināt vienu vai vairākus aizsargātos Windows failus. {{SFP kļūda: [2]. Aizsargāto failu saraksts:\r\n[3]}}</String>
542 <String Id="Error1934" Overridable="yes">Izmantojot politiku, datorā ir atspējotas lietotāja instalācijas.</String>
543 <String Id="Error1935" Overridable="yes">Instalējot montāžu '[6]', radās kļūda. Papildinformāciju skatiet palīdzības un atbalsta centrā. HRESULT: [3]. {{montāžas interfeiss: [4], funkcija: [5], komponents: [2]}}</String>
544 <String Id="Error1936" Overridable="yes">Instalējot montāžu '[6]', radās kļūda. Montāžai nav spēcīga nosaukuma, vai tā nav parakstīta, izmantojot minimālo atslēgas garumu. HRESULT: [3]. {{montāžas interfeiss: [4], funkcija: [5], komponents: [2]}}</String>
545 <String Id="Error1937" Overridable="yes">Instalējot montāžu '[6]', radās kļūda. Nevarēja pārbaudīt parakstu vai katalogu, vai tas nav derīgs. HRESULT: [3]. {{montāžas interfeiss: [4], funkcija: [5], komponents: [2]}}</String>
546 <String Id="Error1938" Overridable="yes">Instalējot montāžu '[6]', radās kļūda. Nevarēja atrast vienu vai vairākus montāžas moduļus. HRESULT: [3]. {{montāžas interfeiss: [4], funkcija: [5], komponents: [2]}}</String>
547
548 <String Id="UITextbytes" Overridable="yes">baiti</String>
549 <String Id="UITextGB" Overridable="yes">GB</String>
550 <String Id="UITextKB" Overridable="yes">KB</String>
551 <String Id="UITextMB" Overridable="yes">MB</String>
552 <String Id="UITextMenuAbsent" Overridable="yes">Viss līdzeklis nebūs pieejams</String>
553 <String Id="UITextMenuAdvertise" Overridable="yes">Šis līdzeklis tiks instalēts nepieciešamības gadījumā</String>
554 <String Id="UITextMenuAllCD" Overridable="yes">Tiks instalēts viss līdzeklis, un to varēs palaist no kompaktdiska</String>
555 <String Id="UITextMenuAllLocal" Overridable="yes">Viss līdzeklis tiks instalēts lokālajā cietajā diskā</String>
556 <String Id="UITextMenuAllNetwork" Overridable="yes">Tiks instalēts viss līdzeklis, un to varēs palaist no tīkla</String>
557 <String Id="UITextMenuCD" Overridable="yes">Tiks instalēts, lai varētu palaist no kompaktdiska</String>
558 <String Id="UITextMenuLocal" Overridable="yes">Tiks instalēts lokālajā cietajā diskā</String>
559 <String Id="UITextMenuNetwork" Overridable="yes">Tiks instalēts, lai varētu palaist no tīkla</String>
560 <String Id="UITextNewFolder" Overridable="yes">Mape|Jauna mape</String>
561 <String Id="UITextScriptInProgress" Overridable="yes">Notiek nepieciešamās informācijas apkopošana...</String>
562 <String Id="UITextSelAbsentAbsent" Overridable="yes">Šis līdzeklis netiks instalēts</String>
563 <String Id="UITextSelAbsentAdvertise" Overridable="yes">Šis līdzeklis tiks iestatīts, lai to varētu instalēt nepieciešamības gadījumā</String>
564 <String Id="UITextSelAbsentCD" Overridable="yes">Šis līdzeklis tiks instalēts, lai to varētu palaist no kompaktdiska</String>
565 <String Id="UITextSelAbsentLocal" Overridable="yes">Šis līdzeklis tiks instalēts lokālajā cietajā diskā</String>
566 <String Id="UITextSelAbsentNetwork" Overridable="yes">Šis līdzeklis tiks instalēts, lai to varētu palaist no tīkla</String>
567 <String Id="UITextSelAdvertiseAbsent" Overridable="yes">Šis līdzeklis kļūs nepieejams</String>
568 <String Id="UITextSelAdvertiseAdvertise" Overridable="yes">Tiks instalēts nepieciešamības gadījumā</String>
569 <String Id="UITextSelAdvertiseCD" Overridable="yes">Šo līdzekli varēs palaist no kompaktdiska</String>
570 <String Id="UITextSelAdvertiseLocal" Overridable="yes">Šis līdzeklis tiks instalēts lokālajā cietajā diskā</String>
571 <String Id="UITextSelAdvertiseNetwork" Overridable="yes">Šo līdzekli varēs palaist no tīkla</String>
572 <String Id="UITextSelCDAbsent" Overridable="yes">Šis līdzeklis tiks pilnībā atinstalēts, un to nevarēs palaist no kompaktdiska</String>
573 <String Id="UITextSelCDAdvertise" Overridable="yes">Šī līdzekļa iestatījums tiks mainīts no iespējas palaist no kompaktdiska uz iespēju instalēt nepieciešamības gadījumā</String>
574 <String Id="UITextSelCDCD" Overridable="yes">Šo līdzekli joprojām varēs palaist no kompaktdiska</String>
575 <String Id="UITextSelCDLocal" Overridable="yes">Šī līdzekļa iestatījums tiks mainīts no iespējas palaist no kompaktdiska uz iespēju instalēt lokālajā cietajā diskā</String>
576 <String Id="UITextSelChildCostNeg" Overridable="yes">Šis līdzeklis cietajā diskā atbrīvo [1].</String>
577 <String Id="UITextSelChildCostPos" Overridable="yes">Šim līdzeklim cietajā diskā nepieciešams: [1].</String>
578 <String Id="UITextSelCostPending" Overridable="yes">Notiek šī līdzekļa maksas aprēķināšana...</String>
579 <String Id="UITextSelLocalAbsent" Overridable="yes">Šis līdzeklis tiks pilnībā noņemts</String>
580 <String Id="UITextSelLocalAdvertise" Overridable="yes">Šis līdzeklis tiks noņemts no lokālā cietā diska, taču tiks iestatīts, lai to varētu instalēt nepieciešamības gadījumā</String>
581 <String Id="UITextSelLocalCD" Overridable="yes">Šis līdzeklis tiks noņemts no lokālā cietā diska, taču to joprojām varēs palaist no kompaktdiska</String>
582 <String Id="UITextSelLocalLocal" Overridable="yes">Šis līdzeklis joprojām atradīsies lokālajā cietajā diskā</String>
583 <String Id="UITextSelLocalNetwork" Overridable="yes">Šis līdzeklis tiks noņemts no lokālā cietā diska, taču to joprojām varēs palaist no tīkla</String>
584 <String Id="UITextSelNetworkAbsent" Overridable="yes">Šis līdzeklis tiks pilnībā atinstalēts, un to nevarēs palaist no tīkla</String>
585 <String Id="UITextSelNetworkAdvertise" Overridable="yes">Šī līdzekļa iestatījums tiks mainīts no iespējas palaist no tīkla uz iespēju instalēt nepieciešamības gadījumā</String>
586 <String Id="UITextSelNetworkLocal" Overridable="yes">Šī līdzekļa iestatījums tiks mainīts no iespējas palaist no tīkla uz instalēšanu lokālajā cietajā diskā</String>
587 <String Id="UITextSelNetworkNetwork" Overridable="yes">Šo līdzekli joprojām varēs palaist no tīkla</String>
588 <String Id="UITextSelParentCostNegNeg" Overridable="yes">Šis līdzeklis cietajā diskā atbrīvo [1]. Tajā ir atlasīti [2] no [3] apakšlīdzekļiem. Šie apakšlīdzekļi cietajā diskā atbrīvo [4].</String>
589 <String Id="UITextSelParentCostNegPos" Overridable="yes">Šis līdzeklis cietajā diskā atbrīvo [1]. Tajā ir atlasīti [2] no [3] apakšlīdzekļiem. Šiem apakšlīdzekļiem cietajā diskā ir nepieciešams: [4].</String>
590 <String Id="UITextSelParentCostPosNeg" Overridable="yes">Šim līdzeklim cietajā diskā ir nepieciešams: [1]. Tajā ir atlasīti [2] no [3] apakšlīdzekļiem. Šie apakšlīdzekļi cietajā diskā atbrīvo [4].</String>
591 <String Id="UITextSelParentCostPosPos" Overridable="yes">Šim līdzeklim cietajā diskā ir nepieciešams: [1]. Tajā ir atlasīti [2] no [3] apakšlīdzekļiem. Šiem apakšlīdzekļiem cietajā diskā ir nepieciešams: [4].</String>
592 <String Id="UITextTimeRemaining" Overridable="yes">Atlikušais laiks: {[1] minūtes }{[2] sekundes}</String>
593 <String Id="UITextVolumeCostAvailable" Overridable="yes">Pieejams</String>
594 <String Id="UITextVolumeCostDifference" Overridable="yes">Atšķirība</String>
595 <String Id="UITextVolumeCostRequired" Overridable="yes">Obligāts</String>
596 <String Id="UITextVolumeCostSize" Overridable="yes">Diska lielums</String>
597 <String Id="UITextVolumeCostVolume" Overridable="yes">Apjoms</String>
598</WixLocalization>
diff --git a/src/ext/UI/wixlib/WixUI_nb-NO.wxl b/src/ext/UI/wixlib/WixUI_nb-NO.wxl
new file mode 100644
index 00000000..51ce9982
--- /dev/null
+++ b/src/ext/UI/wixlib/WixUI_nb-NO.wxl
@@ -0,0 +1,598 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3
4
5<WixLocalization Culture="nb-no" Codepage="1252" xmlns="http://wixtoolset.org/schemas/v4/wxl">
6 <String Id="WixUIBack" Overridable="yes">&amp;Tilbake</String>
7 <String Id="WixUINext" Overridable="yes">&amp;Neste</String>
8 <String Id="WixUICancel" Overridable="yes">Avbryt</String>
9 <String Id="WixUIFinish" Overridable="yes">&amp;Fullfør</String>
10 <String Id="WixUIRetry" Overridable="yes">&amp;Prøv på nytt</String>
11 <String Id="WixUIIgnore" Overridable="yes">&amp;Ignorer</String>
12 <String Id="WixUIYes" Overridable="yes">&amp;Ja</String>
13 <String Id="WixUINo" Overridable="yes">&amp;Nei</String>
14 <String Id="WixUIOK" Overridable="yes">OK</String>
15 <String Id="WixUIPrint" Overridable="yes">&amp;Skriv ut</String>
16
17 <String Id="AdvancedWelcomeEulaDlg_Title" Overridable="yes">Installere [ProductName]</String>
18 <String Id="AdvancedWelcomeEulaDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
19 <String Id="AdvancedWelcomeEulaDlgTitle" Overridable="yes">{\WixUI_Font_Title}Les lisensavtalen for [ProductName]</String>
20 <String Id="AdvancedWelcomeEulaDlgLicenseAcceptedCheckBox" Overridable="yes">Jeg &amp;godtar vilkårene i lisensavtalen</String>
21 <String Id="AdvancedWelcomeEulaDlgDescriptionPerMachine" Overridable="yes">Klikk Installer for å installere produktet med standardalternativer for alle brukere. Klikk Avansert for å endre installasjonsalternativer.</String>
22 <String Id="AdvancedWelcomeEulaDlgDescriptionPerUser" Overridable="yes">Klikk Installer for å installere produktet med standardalternativer bare for deg. Klikk Avansert for å endre installasjonsalternativer.</String>
23 <String Id="AdvancedWelcomeEulaDlgInstall" Overridable="yes">&amp;Installer</String>
24 <String Id="AdvancedWelcomeEulaDlgAdvanced" Overridable="yes">A&amp;vansert</String>
25 <String Id="Advanced_Font_Normal_Size" Overridable="yes">8</String>
26 <String Id="Advanced_Font_Bigger_Size" Overridable="yes">12</String>
27 <String Id="Advanced_Font_Title_Size" Overridable="yes">9</String>
28 <String Id="Advanced_Font_Emphasized_Size" Overridable="yes">8</String>
29 <String Id="Advanced_Font_FaceName" Overridable="yes">Tahoma</String>
30
31 <String Id="BrowseDlg_Title" Overridable="yes">Installere [ProductName]</String>
32 <String Id="BrowseDlgComboLabel" Overridable="yes">&amp;Søk i:</String>
33 <String Id="BrowseDlgWixUI_Bmp_Up" Overridable="yes">WixUI_Bmp_Up</String>
34 <String Id="BrowseDlgWixUI_Bmp_UpTooltip" Overridable="yes">Opp ett nivå</String>
35 <String Id="BrowseDlgNewFolder" Overridable="yes">WixUI_Bmp_New</String>
36 <String Id="BrowseDlgNewFolderTooltip" Overridable="yes">Opprett en ny mappe</String>
37 <String Id="BrowseDlgPathLabel" Overridable="yes">&amp;Mappenavn:</String>
38 <String Id="BrowseDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
39 <String Id="BrowseDlgDescription" Overridable="yes">Søk etter målmappen</String>
40 <String Id="BrowseDlgTitle" Overridable="yes">{\WixUI_Font_Title}Endre målmappe</String>
41
42 <String Id="CancelDlg_Title" Overridable="yes">Installere [ProductName]</String>
43 <String Id="CancelDlgText" Overridable="yes">Er du sikker på at du vil avbryte installasjonen av [ProductName]?</String>
44 <String Id="CancelDlgIcon" Overridable="yes">WixUI_Ico_Info</String>
45 <String Id="CancelDlgIconTooltip" Overridable="yes">Informasjonsikon</String>
46
47 <String Id="CustomizeDlg_Title" Overridable="yes">Installere [ProductName]</String>
48 <String Id="CustomizeDlgTree" Overridable="yes">Tre med valg</String>
49 <String Id="CustomizeDlgBrowse" Overridable="yes">B&amp;la gjennom...</String>
50 <String Id="CustomizeDlgReset" Overridable="yes">&amp;Tilbakestill</String>
51 <String Id="CustomizeDlgDiskCost" Overridable="yes">&amp;Diskbruk</String>
52 <String Id="CustomizeDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
53 <String Id="CustomizeDlgText" Overridable="yes">Klikk ikonene i treet nedenfor for å endre måten funksjonene installeres på.</String>
54 <String Id="CustomizeDlgDescription" Overridable="yes">Velg hvordan du vil at funksjoner skal installeres.</String>
55 <String Id="CustomizeDlgTitle" Overridable="yes">{\WixUI_Font_Title}Tilpasset installasjon</String>
56 <String Id="CustomizeDlgItemDescription" Overridable="yes">CustomizeDlgItemDescription-CustomizeDlgItemDescription</String>
57 <String Id="CustomizeDlgItemSize" Overridable="yes">CustomizeDlgItemSize-CustomizeDlgItemSize</String>
58 <String Id="CustomizeDlgLocation" Overridable="yes">CustomizeDlgLocation-CustomizeDlgLocation</String>
59 <String Id="CustomizeDlgLocationLabel" Overridable="yes">Plassering:</String>
60
61 <String Id="DiskCostDlg_Title" Overridable="yes">Installere [ProductName]</String>
62 <String Id="DiskCostDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
63 <String Id="DiskCostDlgText" Overridable="yes">De merkede volumene har ikke nok diskplass tilgjengelig for de valgte funksjonene. Du kan fjerne noen filer fra de merkede volumene, installere færre funksjoner eller velge en annen målstasjon.</String>
64 <String Id="DiskCostDlgDescription" Overridable="yes">Diskplass som kreves for installasjon av de valgte funksjonene.</String>
65 <String Id="DiskCostDlgTitle" Overridable="yes">{\WixUI_Font_Title}Krav til diskplass</String>
66 <String Id="DiskCostDlgVolumeList" Overridable="yes">{120}{70}{70}{70}{70}</String>
67
68 <String Id="ErrorDlg_Title" Overridable="yes">Installere [ProductName]</String>
69 <String Id="ErrorDlgErrorText" Overridable="yes">Informasjonstekst</String>
70 <String Id="ErrorDlgErrorIcon" Overridable="yes">WixUI_Ico_Info</String>
71 <String Id="ErrorDlgErrorIconTooltip" Overridable="yes">Informasjonsikon</String>
72
73 <String Id="ExitDialog_Title" Overridable="yes">Installere [ProductName]</String>
74 <String Id="ExitDialogBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
75 <String Id="ExitDialogDescription" Overridable="yes">Klikk Fullfør for å avslutte installasjonsveiviseren.</String>
76 <String Id="ExitDialogTitle" Overridable="yes">{\WixUI_Font_Bigger}Installasjonsveiviseren for [ProductName] er fullført</String>
77
78 <String Id="FatalError_Title" Overridable="yes">Installere [ProductName]</String>
79 <String Id="FatalErrorBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
80 <String Id="FatalErrorTitle" Overridable="yes">{\WixUI_Font_Bigger} Installasjonsveiviser for [ProductName] ble avsluttet for tidlig</String>
81 <String Id="FatalErrorDescription1" Overridable="yes">Installasjonsveiviser for [ProductName] ble avsluttet for tidlig på grunn av en feil. Systemet har ikke blitt endret. Hvis du vil installere dette programmet senere, kan du kjøre installasjonsveiviseren på nytt.</String>
82 <String Id="FatalErrorDescription2" Overridable="yes">Klikk Fullfør for å avslutte installasjonsveiviseren.</String>
83
84 <String Id="FeaturesDlg_Title" Overridable="yes">Installere [ProductName]</String>
85 <String Id="FeaturesDlgTree" Overridable="yes">Produktfunksjoner</String>
86 <String Id="FeaturesDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
87 <String Id="FeaturesDlgDescription" Overridable="yes">Velg hvordan du vil at funksjoner skal installeres.</String>
88 <String Id="FeaturesDlgTitle" Overridable="yes">{\WixUI_Font_Title}Produktfunksjoner</String>
89 <String Id="FeaturesDlgItemDescription" Overridable="yes">FeaturesDlgItemDescription</String>
90 <String Id="FeaturesDlgItemSize" Overridable="yes">FeaturesDlgItemSize</String>
91 <String Id="FeaturesDlgInstall" Overridable="yes">&amp;Installer</String>
92 <String Id="FeaturesDlgChange" Overridable="yes">&amp;Endre</String>
93
94 <String Id="FilesInUse_Title" Overridable="yes">Installere [ProductName]</String>
95 <String Id="FilesInUseExit" Overridable="yes">&amp;Avslutt</String>
96 <String Id="FilesInUseBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
97 <String Id="FilesInUseText" Overridable="yes">Følgende programmer bruker filer som må oppdateres av dette installasjonsprogrammet. Lukk disse programmene, og velg deretter &amp;Prøv på nytt for å fortsette installasjonen eller Avslutt for å avslutte den.</String>
98 <String Id="FilesInUseDescription" Overridable="yes">Noen av filene som må oppdateres, er for tiden i bruk.</String>
99 <String Id="FilesInUseTitle" Overridable="yes">{\WixUI_Font_Title}Filer i bruk</String>
100
101 <String Id="InstallDirDlg_Title" Overridable="yes">Installere [ProductName]</String>
102 <String Id="InstallDirDlgChange" Overridable="yes">&amp;Endre...</String>
103 <String Id="InstallDirDlgTitle" Overridable="yes">{\WixUI_Font_Title}Målmappe</String>
104 <String Id="InstallDirDlgDescription" Overridable="yes">Klikk Neste for å installere i standardmappen, eller klikk Endre for å velge en annen mappe.</String>
105 <String Id="InstallDirDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
106 <String Id="InstallDirDlgFolderLabel" Overridable="yes">Installer [ProductName] i:</String>
107
108 <String Id="InstallScopeDlg_Title" Overridable="yes">Installere [ProductName]</String>
109 <String Id="InstallScopeDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
110 <String Id="InstallScopeDlgDescription" Overridable="yes">Velg installasjonsomfang og -mappe</String>
111 <String Id="InstallScopeDlgTitle" Overridable="yes">{\WixUI_Font_Title}Installasjonsomfang</String>
112 <String Id="InstallScopeDlgPerUser" Overridable="yes">{\WixUI_Font_Emphasized}Installer &amp;bare for deg ([LogonUser])</String>
113 <String Id="InstallScopeDlgPerUserDescription" Overridable="yes">[ProductName] blir installert i en mappe per bruker og blir bare tilgjengelig for din brukerkonto. Du trenger ikke lokale administratorrettigheter.</String>
114 <String Id="InstallScopeDlgNoPerUserDescription" Overridable="yes">[ProductName] støtter ikke installasjon per bruker.</String>
115 <String Id="InstallScopeDlgPerMachine" Overridable="yes">{\WixUI_Font_Emphasized}Installer for alle brukere av denne &amp;maskinen</String>
116 <String Id="InstallScopeDlgPerMachineDescription" Overridable="yes">[ProductName] blir installert som standard i en mappe per maskin og blir tilgjengelig for alle brukere. Du kan endre standard installasjonsmappe. Du må ha lokale administratorrettigheter.</String>
117 <String Id="InstallScopeDlgFolderLabel" Overridable="yes">&amp;Installasjonsmappe:</String>
118 <String Id="InstallScopeDlgChange" Overridable="yes">&amp;Endre...</String>
119
120 <String Id="InvalidDirDlg_Title" Overridable="yes">Installere [ProductName]</String>
121 <String Id="InvalidDirDlgText" Overridable="yes">Installasjonsmappen må være på en lokal harddisk.</String>
122 <String Id="InvalidDirDlgIcon" Overridable="yes">WixUI_Ico_Info</String>
123 <String Id="InvalidDirDlgIconTooltip" Overridable="yes">Informasjonsikon</String>
124
125 <String Id="LicenseAgreementDlg_Title" Overridable="yes">Installere [ProductName]</String>
126 <String Id="LicenseAgreementDlgLicenseAcceptedCheckBox" Overridable="yes">Jeg &amp;godtar vilkårene i lisensavtalen</String>
127 <String Id="LicenseAgreementDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
128 <String Id="LicenseAgreementDlgDescription" Overridable="yes">Les nøye gjennom lisensavtalen nedenfor</String>
129 <String Id="LicenseAgreementDlgTitle" Overridable="yes">{\WixUI_Font_Title}Lisensavtale for sluttbrukere</String>
130
131 <String Id="MaintenanceTypeDlg_Title" Overridable="yes">Installere [ProductName]</String>
132 <String Id="MaintenanceTypeDlgChangeButton" Overridable="yes">&amp;Endre</String>
133 <String Id="MaintenanceTypeDlgChangeButtonTooltip" Overridable="yes">Endre installasjonen</String>
134 <String Id="MaintenanceTypeDlgRepairButton" Overridable="yes">&amp;Reparer</String>
135 <String Id="MaintenanceTypeDlgRepairButtonTooltip" Overridable="yes">Reparer installasjonen</String>
136 <String Id="MaintenanceTypeDlgRemoveButton" Overridable="yes">&amp;Fjern</String>
137 <String Id="MaintenanceTypeDlgRemoveButtonTooltip" Overridable="yes">Fjern installasjonen</String>
138 <String Id="MaintenanceTypeDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
139 <String Id="MaintenanceTypeDlgDescription" Overridable="yes">Angi operasjonen du vil utføre.</String>
140 <String Id="MaintenanceTypeDlgTitle" Overridable="yes">{\WixUI_Font_Title}Endre, reparer eller fjern installasjonen</String>
141 <String Id="MaintenanceTypeDlgChangeText" Overridable="yes">Lar deg endre måten funksjonene skal installeres på.</String>
142 <String Id="MaintenanceTypeDlgChangeDisabledText" Overridable="yes">[ProductName] har ingen funksjoner som kan velges for seg.</String>
143 <String Id="MaintenanceTypeDlgRemoveText" Overridable="yes">Fjerner [ProductName] fra datamaskinen.</String>
144 <String Id="MaintenanceTypeDlgRemoveDisabledText" Overridable="yes">[ProductName] kan ikke fjernes.</String>
145 <String Id="MaintenanceTypeDlgRepairText" Overridable="yes">Reparerer feil i den siste installasjonen ved å rette opp manglende og skadede filer, snarveier og registeroppføringer.</String>
146 <String Id="MaintenanceTypeDlgRepairDisabledText" Overridable="yes">Kan ikke reparere [ProductName].</String>
147
148 <String Id="MaintenanceWelcomeDlg_Title" Overridable="yes">Installere [ProductName]</String>
149 <String Id="MaintenanceWelcomeDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
150 <String Id="MaintenanceWelcomeDlgDescription" Overridable="yes">Installasjonsveiviseren lar deg endre hvordan [ProductName]-funksjoner er installert på datamaskinen, eller angi at de skal fjernes fra datamaskinen. Klikk Neste for å fortsette eller Avbryt for å avslutte installasjonsveiviseren.</String>
151 <String Id="MaintenanceWelcomeDlgTitle" Overridable="yes">{\WixUI_Font_Bigger}Velkommen til installasjonsveiviseren for [ProductName]</String>
152
153 <String Id="MsiRMFilesInUse_Title" Overridable="yes">Installere [ProductName]</String>
154 <String Id="MsiRMFilesInUseBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
155 <String Id="MsiRMFilesInUseText" Overridable="yes">Følgende programmer bruker filer som må oppdateres av dette installasjonsprogrammet. Du kan la installasjonsveiviseren lukke dem og prøve å starte dem på nytt, eller starte datamaskinen på nytt senere.</String>
156 <String Id="MsiRMFilesInUseDescription" Overridable="yes">Noen av filene som må oppdateres, er for tiden i bruk.</String>
157 <String Id="MsiRMFilesInUseTitle" Overridable="yes">{\WixUI_Font_Title}Filer i bruk</String>
158 <String Id="MsiRMFilesInUseUseRM" Overridable="yes">&amp;Lukk programmene, og prøv å starte dem på nytt.</String>
159 <String Id="MsiRMFilesInUseDontUseRM" Overridable="yes">&amp;Ikke lukk programmer. Maskinen vil måtte startes på nytt.</String>
160
161 <String Id="OutOfDiskDlg_Title" Overridable="yes">Installere [ProductName]</String>
162 <String Id="OutOfDiskDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
163 <String Id="OutOfDiskDlgText" Overridable="yes">De merkede volumene har ikke nok ledig diskplass til de merkede funksjonene. Du kan fjerne noen filer fra de merkede volumene, installere færre funksjoner eller velge en annen målstasjon.</String>
164 <String Id="OutOfDiskDlgDescription" Overridable="yes">Diskplassen som kreves for installasjonen, overskrider tilgjengelig diskplass.</String>
165 <String Id="OutOfDiskDlgTitle" Overridable="yes">{\WixUI_Font_Title}For lite diskplass</String>
166 <String Id="OutOfDiskDlgVolumeList" Overridable="yes">{120}{70}{70}{70}{70}</String>
167
168 <String Id="OutOfRbDiskDlg_Title" Overridable="yes">Installere [ProductName]</String>
169 <String Id="OutOfRbDiskDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
170 <String Id="OutOfRbDiskDlgText" Overridable="yes">De merkede volumene har ikke nok ledig diskplass til de merkede funksjonene. Du kan fjerne noen filer fra de merkede volumene, installere færre funksjoner eller velge en annen målstasjon.</String>
171 <String Id="OutOfRbDiskDlgDescription" Overridable="yes">Diskplassen som kreves for installasjonen, overskrider tilgjengelig diskplass.</String>
172 <String Id="OutOfRbDiskDlgTitle" Overridable="yes">{\WixUI_Font_Title}For lite diskplass</String>
173 <String Id="OutOfRbDiskDlgVolumeList" Overridable="yes">{120}{70}{70}{70}{70}</String>
174 <String Id="OutOfRbDiskDlgText2" Overridable="yes">Du kan også velge å deaktivere installasjonsprogrammets funksjonalitet for tilbakerulling. Hvis tilbakerulling deaktiveres, kan ikke installasjonsprogrammet gjenopprette datamaskinens opprinnelige tilstand hvis installasjonen forstyrres på noen måte. Klikk Ja hvis du tar sjansen på å deaktivere tilbakeføring.</String>
175
176 <String Id="PrepareDlg_Title" Overridable="yes">Installere [ProductName]</String>
177 <String Id="PrepareDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
178 <String Id="PrepareDlgDescription" Overridable="yes">Vent mens installasjonsveiviseren gjør klar for å lede deg gjennom installasjonen.</String>
179 <String Id="PrepareDlgTitle" Overridable="yes">{\WixUI_Font_Bigger}Velkommen til installasjonsveiviseren for [ProductName]</String>
180
181 <String Id="ProgressDlg_Title" Overridable="yes">Installere [ProductName]</String>
182 <String Id="ProgressDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
183 <String Id="ProgressDlgTextInstalling" Overridable="yes">Vent mens installasjonsveiviseren installerer [ProductName].</String>
184 <String Id="ProgressDlgTitleInstalling" Overridable="yes">{\WixUI_Font_Title}Installerer [ProductName]</String>
185 <String Id="ProgressDlgTextChanging" Overridable="yes">Vent mens installasjonsveiviseren endrer [ProductName].</String>
186 <String Id="ProgressDlgTitleChanging" Overridable="yes">{\WixUI_Font_Title}Endrer [ProductName]</String>
187 <String Id="ProgressDlgTextRepairing" Overridable="yes">Vent mens installasjonsveiviseren reparerer [ProductName].</String>
188 <String Id="ProgressDlgTitleRepairing" Overridable="yes">{\WixUI_Font_Title}Reparerer [ProductName]</String>
189 <String Id="ProgressDlgTextRemoving" Overridable="yes">Vent mens installasjonsveiviseren fjerner [ProductName].</String>
190 <String Id="ProgressDlgTitleRemoving" Overridable="yes">{\WixUI_Font_Title}Fjerner [ProductName]</String>
191 <String Id="ProgressDlgTextUpdating" Overridable="yes">Vent mens installasjonsveiviseren oppdaterer [ProductName].</String>
192 <String Id="ProgressDlgTitleUpdating" Overridable="yes">{\WixUI_Font_Title}Oppdaterer [ProductName]</String>
193 <String Id="ProgressDlgProgressBar" Overridable="yes">Fremdrift</String>
194 <String Id="ProgressDlgStatusLabel" Overridable="yes">Status:</String>
195
196 <String Id="ResumeDlg_Title" Overridable="yes">Installere [ProductName]</String>
197 <String Id="ResumeDlgInstall" Overridable="yes">&amp;Installer</String>
198 <String Id="ResumeDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
199 <String Id="ResumeDlgDescription" Overridable="yes">Installasjonsveiviseren vil fullføre installasjonen av [ProductName] på datamaskinen. Klikk Installer for å fortsette eller Avbryt for å avslutte installasjonsveiviseren.</String>
200 <String Id="ResumeDlgTitle" Overridable="yes">{\WixUI_Font_Bigger}Gjenopptar installasjonsveiviseren for [ProductName]</String>
201
202 <String Id="SetupTypeDlg_Title" Overridable="yes">Installere [ProductName]</String>
203 <String Id="SetupTypeDlgTypicalButton" Overridable="yes">&amp;Vanlig</String>
204 <String Id="SetupTypeDlgTypicalButtonTooltip" Overridable="yes">Vanlig installasjon</String>
205 <String Id="SetupTypeDlgCustomButton" Overridable="yes">&amp;Tilpasset</String>
206 <String Id="SetupTypeDlgCustomButtonTooltip" Overridable="yes">Tilpasset installasjon</String>
207 <String Id="SetupTypeDlgCompleteButton" Overridable="yes">&amp;Fullstendig</String>
208 <String Id="SetupTypeDlgCompleteButtonTooltip" Overridable="yes">Fullstendig installasjon</String>
209 <String Id="SetupTypeDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
210 <String Id="SetupTypeDlgTitle" Overridable="yes">{\WixUI_Font_Title}Velg installasjonstype</String>
211 <String Id="SetupTypeDlgDescription" Overridable="yes">Velg installasjonstypen som passer best til dine behov</String>
212 <String Id="SetupTypeDlgTypicalText" Overridable="yes">Installerer de vanligste programfunksjonene. Anbefales for de fleste brukere.</String>
213 <String Id="SetupTypeDlgCustomText" Overridable="yes">Gjør det mulig for brukere å velge hvilke programfunksjoner som installeres, og hvor de installeres. Anbefales for avanserte brukere.</String>
214 <String Id="SetupTypeDlgCompleteText" Overridable="yes">Alle programfunksjoner blir installert. Krever mest diskplass.</String>
215
216 <String Id="UserExit_Title" Overridable="yes">Installere [ProductName]</String>
217 <String Id="UserExitBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
218 <String Id="UserExitTitle" Overridable="yes">{\WixUI_Font_Bigger}Installasjonsveiviseren for [ProductName] ble avbrutt</String>
219 <String Id="UserExitDescription1" Overridable="yes">Installasjonen av [ProductName] ble avbrutt. Systemet har ikke blitt endret. Kjør installasjonsprogrammet på nytt for å installere dette programmet på et senere tidspunkt.</String>
220 <String Id="UserExitDescription2" Overridable="yes">Klikk Fullfør for å avslutte installasjonsveiviseren.</String>
221
222 <String Id="VerifyReadyDlg_Title" Overridable="yes">Installere [ProductName]</String>
223 <String Id="VerifyReadyDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
224 <String Id="VerifyReadyDlgInstall" Overridable="yes">&amp;Installer</String>
225 <String Id="VerifyReadyDlgInstallText" Overridable="yes">Klikk Installer for å starte installasjonen. Klikk Tilbake for å kontrollere eller endre noen av installasjonsinnstillingene. Klikk Avbryt for å avslutte veiviseren.</String>
226 <String Id="VerifyReadyDlgInstallTitle" Overridable="yes">{\WixUI_Font_Title}Klar til å installere [ProductName]</String>
227 <String Id="VerifyReadyDlgChange" Overridable="yes">&amp;Endre</String>
228 <String Id="VerifyReadyDlgChangeText" Overridable="yes">Klikk Endre for å starte installasjonen. Klikk Tilbake for å kontrollere eller endre noen av installasjonsinnstillingene. Klikk Avbryt for å avslutte veiviseren.</String>
229 <String Id="VerifyReadyDlgChangeTitle" Overridable="yes">{\WixUI_Font_Title}Klar til å endre [ProductName]</String>
230 <String Id="VerifyReadyDlgRepair" Overridable="yes">&amp;Reparer</String>
231 <String Id="VerifyReadyDlgRepairText" Overridable="yes">Klikk Reparer for å reparere installasjonen av [ProductName]. Klikk Tilbake for å kontrollere eller endre noen av installasjonsinnstillingene. Klikk Avbryt for å avslutte veiviseren.</String>
232 <String Id="VerifyReadyDlgRepairTitle" Overridable="yes">{\WixUI_Font_Title}Klar til å reparere [ProductName]</String>
233 <String Id="VerifyReadyDlgRemove" Overridable="yes">&amp;Fjern</String>
234 <String Id="VerifyReadyDlgRemoveText" Overridable="yes">Klikk Fjern for å fjerne [ProductName] fra datamaskinen. Klikk Tilbake for å kontrollere eller endre noen av installasjonsinnstillingene. Klikk Avbryt for å avslutte veiviseren.</String>
235 <String Id="VerifyReadyDlgRemoveTitle" Overridable="yes">{\WixUI_Font_Title}Klar til å fjerne [ProductName]</String>
236 <String Id="VerifyReadyDlgUpdate" Overridable="yes">&amp;Oppdater</String>
237 <String Id="VerifyReadyDlgUpdateText" Overridable="yes">Klikk Oppdater for å oppdatere [ProductName] fra datamaskinen. Klikk Tilbake for å kontrollere eller endre installasjonsinnstillinger. Klikk Avbryt for å avslutte veiviseren.</String>
238 <String Id="VerifyReadyDlgUpdateTitle" Overridable="yes">{\WixUI_Font_Title}Klar til å oppdatere [ProductName]</String>
239
240 <String Id="WaitForCostingDlg_Title" Overridable="yes">Installere [ProductName]</String>
241 <String Id="WaitForCostingDlgReturn" Overridable="yes">&amp;Gå tilbake</String>
242 <String Id="WaitForCostingDlgText" Overridable="yes">Vent mens installasjonsprogrammet beregner krav til diskplass.</String>
243 <String Id="WaitForCostingDlgIcon" Overridable="yes">WixUI_Ico_Exclam</String>
244 <String Id="WaitForCostingDlgIconTooltip" Overridable="yes">Utropstegnikon</String>
245
246 <String Id="WelcomeDlg_Title" Overridable="yes">Installere [ProductName]</String>
247 <String Id="WelcomeDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
248 <String Id="WelcomeDlgDescription" Overridable="yes">Installasjonsveiviseren installerer [ProductName] på datamaskinen din. Klikk Neste for å gå videre eller Avbryt for å avslutte installasjonsveiviseren.</String>
249 <String Id="WelcomeUpdateDlgDescriptionUpdate" Overridable="yes">Installasjonsveiviseren er klar til å oppdatere [ProductName] på datamaskinen. Klikk Neste for å fortsette eller Avbryt for å avslutte veiviseren.</String>
250 <String Id="WelcomeDlgTitle" Overridable="yes">{\WixUI_Font_Bigger}Velkommen til installasjonsveiviseren for [ProductName]</String>
251
252 <String Id="WelcomeEulaDlg_Title" Overridable="yes">Installere [ProductName]</String>
253 <String Id="WelcomeEulaDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
254 <String Id="WelcomeEulaDlgLicenseAcceptedCheckBox" Overridable="yes">Jeg &amp;godtar vilkårene i lisensavtalen</String>
255 <String Id="WelcomeEulaDlgInstall" Overridable="yes">&amp;Installer</String>
256 <String Id="WelcomeEulaDlgUpdate" Overridable="yes">&amp;Oppdater</String>
257 <String Id="WelcomeEulaDlgTitle" Overridable="yes">{\WixUI_Font_Title}Les lisensavtalen for [ProductName]</String>
258
259 <String Id="ProgressTextInstallValidate" Overridable="yes">Bekrefter installasjon</String>
260 <String Id="ProgressTextInstallFiles" Overridable="yes">Kopierer nye filer</String>
261 <String Id="ProgressTextInstallFilesTemplate" Overridable="yes">Fil: [1], Mappe: [9], Størrelse: [6]</String>
262 <String Id="ProgressTextInstallAdminPackage" Overridable="yes">Kopierer filer for nettverksinstallasjon</String>
263 <String Id="ProgressTextInstallAdminPackageTemplate" Overridable="yes">Fil: [1], Mappe: [9], Størrelse: [6]</String>
264 <String Id="ProgressTextFileCost" Overridable="yes">Beregner plassbehov</String>
265 <String Id="ProgressTextCostInitialize" Overridable="yes">Beregner plassbehov</String>
266 <String Id="ProgressTextCostFinalize" Overridable="yes">Beregner plassbehov</String>
267 <String Id="ProgressTextCreateShortcuts" Overridable="yes">Oppretter snarveier</String>
268 <String Id="ProgressTextCreateShortcutsTemplate" Overridable="yes">Snarvei: [1]</String>
269 <String Id="ProgressTextPublishComponents" Overridable="yes">Publiserer kvalifiserte komponenter</String>
270 <String Id="ProgressTextPublishComponentsTemplate" Overridable="yes">Komponent-ID: [1], Kvalifikator: [2]</String>
271 <String Id="ProgressTextPublishFeatures" Overridable="yes">Publiserer produktfunksjoner</String>
272 <String Id="ProgressTextPublishFeaturesTemplate" Overridable="yes">Funksjon: [1]</String>
273 <String Id="ProgressTextPublishProduct" Overridable="yes">Publiserer produktinformasjon</String>
274 <String Id="ProgressTextRegisterClassInfo" Overridable="yes">Registrerer klasseservere</String>
275 <String Id="ProgressTextRegisterClassInfoTemplate" Overridable="yes">Klasse-ID: [1]</String>
276 <String Id="ProgressTextRegisterExtensionInfo" Overridable="yes">Registrerer tilleggsservere</String>
277 <String Id="ProgressTextRegisterExtensionInfoTemplate" Overridable="yes">Tillegg: [1]</String>
278 <String Id="ProgressTextRegisterMIMEInfo" Overridable="yes">Registrerer MIME-informasjon</String>
279 <String Id="ProgressTextRegisterMIMEInfoTemplate" Overridable="yes">MIME-innholdstype: [1], Tillegg: [2]</String>
280 <String Id="ProgressTextRegisterProgIdInfo" Overridable="yes">Registrerer programidentifikatorer</String>
281 <String Id="ProgressTextRegisterProgIdInfoTemplate" Overridable="yes">Prog-ID: [1]</String>
282 <String Id="ProgressTextAllocateRegistrySpace" Overridable="yes">Tildeler registerplass</String>
283 <String Id="ProgressTextAllocateRegistrySpaceTemplate" Overridable="yes">Ledig plass: [1]</String>
284 <String Id="ProgressTextAppSearch" Overridable="yes">Søker etter installerte programmer</String>
285 <String Id="ProgressTextAppSearchTemplate" Overridable="yes">Egenskap: [1], Signatur: [2]</String>
286 <String Id="ProgressTextBindImage" Overridable="yes">Binder kjørbare filer</String>
287 <String Id="ProgressTextBindImageTemplate" Overridable="yes">Fil: [1]</String>
288 <String Id="ProgressTextCCPSearch" Overridable="yes">Søker etter kvalifiserte produkter</String>
289 <String Id="ProgressTextCreateFolders" Overridable="yes">Oppretter mapper</String>
290 <String Id="ProgressTextCreateFoldersTemplate" Overridable="yes">Mappe: [1]</String>
291 <String Id="ProgressTextDeleteServices" Overridable="yes">Sletter tjenester</String>
292 <String Id="ProgressTextDeleteServicesTemplate" Overridable="yes">Tjeneste: [1]</String>
293 <String Id="ProgressTextDuplicateFiles" Overridable="yes">Oppretter duplikatfiler</String>
294 <String Id="ProgressTextDuplicateFilesTemplate" Overridable="yes">Fil: [1], Mappe: [9], Størrelse: [6]</String>
295 <String Id="ProgressTextFindRelatedProducts" Overridable="yes">Søker etter relaterte programmer</String>
296 <String Id="ProgressTextFindRelatedProductsTemplate" Overridable="yes">Fant program: [1]</String>
297 <String Id="ProgressTextInstallODBC" Overridable="yes">Installerer ODBC-komponenter</String>
298 <String Id="ProgressTextInstallServices" Overridable="yes">Installerer nye tjenester</String>
299 <String Id="ProgressTextInstallServicesTemplate" Overridable="yes">Tjeneste: [2]</String>
300 <String Id="ProgressTextLaunchConditions" Overridable="yes">Vurderer oppstartsbetingelser</String>
301 <String Id="ProgressTextMigrateFeatureStates" Overridable="yes">Overfører funksjonsinnstillinger fra relaterte programmer</String>
302 <String Id="ProgressTextMigrateFeatureStatesTemplate" Overridable="yes">Program: [1]</String>
303 <String Id="ProgressTextMoveFiles" Overridable="yes">Flytter filer</String>
304 <String Id="ProgressTextMoveFilesTemplate" Overridable="yes">Fil: [1], Mappe: [9], Størrelse: [6]</String>
305 <String Id="ProgressTextPatchFiles" Overridable="yes">Oppdaterer filer</String>
306 <String Id="ProgressTextPatchFilesTemplate" Overridable="yes">Fil: [1], Mappe: [2], Størrelse: [3]</String>
307 <String Id="ProgressTextProcessComponents" Overridable="yes">Oppdaterer registrering av komponenter</String>
308 <String Id="ProgressTextRegisterComPlus" Overridable="yes">Registrerer COM+-programmer og -komponenter</String>
309 <String Id="ProgressTextRegisterComPlusTemplate" Overridable="yes">ProgID: [1]{{, ProgType: [2], Brukere: [3], RSN: [4]}}</String>
310 <String Id="ProgressTextRegisterFonts" Overridable="yes">Registrerer skrifter</String>
311 <String Id="ProgressTextRegisterFontsTemplate" Overridable="yes">Skrift: [1]</String>
312 <String Id="ProgressTextRegisterProduct" Overridable="yes">Registrerer produkt</String>
313 <String Id="ProgressTextRegisterProductTemplate" Overridable="yes">[1]</String>
314 <String Id="ProgressTextRegisterTypeLibraries" Overridable="yes">Registrerer typebiblioteker</String>
315 <String Id="ProgressTextRegisterTypeLibrariesTemplate" Overridable="yes">Bibl-ID: [1]</String>
316 <String Id="ProgressTextRegisterUser" Overridable="yes">Registrerer bruker</String>
317 <String Id="ProgressTextRegisterUserTemplate" Overridable="yes">[1]</String>
318 <String Id="ProgressTextRemoveDuplicateFiles" Overridable="yes">Fjerner dupliserte filer</String>
319 <String Id="ProgressTextRemoveDuplicateFilesTemplate" Overridable="yes">Fil: [1], Mappe: [9]</String>
320 <String Id="ProgressTextRemoveEnvironmentStrings" Overridable="yes">Oppdaterer miljøstrenger</String>
321 <String Id="ProgressTextRemoveEnvironmentStringsTemplate" Overridable="yes">Navn: [1], Verdi: [2], Handling: [3]</String>
322 <String Id="ProgressTextRemoveExistingProducts" Overridable="yes">Fjerner programmer</String>
323 <String Id="ProgressTextRemoveExistingProductsTemplate" Overridable="yes">Program: [1], Kommandolinje: [2]</String>
324 <String Id="ProgressTextRemoveFiles" Overridable="yes">Fjerner filer</String>
325 <String Id="ProgressTextRemoveFilesTemplate" Overridable="yes">Fil: [1], Mappe: [9]</String>
326 <String Id="ProgressTextRemoveFolders" Overridable="yes">Fjerner mapper</String>
327 <String Id="ProgressTextRemoveFoldersTemplate" Overridable="yes">Mappe: [1]</String>
328 <String Id="ProgressTextRemoveIniValues" Overridable="yes">Fjerner INI-filoppføringer</String>
329 <String Id="ProgressTextRemoveIniValuesTemplate" Overridable="yes">Fil: [1], Avsnitt: [2], Nøkkel: [3], Verdi: [4]</String>
330 <String Id="ProgressTextRemoveODBC" Overridable="yes">Fjerner ODBC-komponenter</String>
331 <String Id="ProgressTextRemoveRegistryValues" Overridable="yes">Fjerner systemregisterverdier</String>
332 <String Id="ProgressTextRemoveRegistryValuesTemplate" Overridable="yes">Nøkkel: [1], Navn: [2]</String>
333 <String Id="ProgressTextRemoveShortcuts" Overridable="yes">Fjerner snarveier</String>
334 <String Id="ProgressTextRemoveShortcutsTemplate" Overridable="yes">Snarvei: [1]</String>
335 <String Id="ProgressTextRMCCPSearch" Overridable="yes">Søker etter kvalifiserte produkter</String>
336 <String Id="ProgressTextSelfRegModules" Overridable="yes">Registrerer moduler</String>
337 <String Id="ProgressTextSelfRegModulesTemplate" Overridable="yes">Fil: [1], Mappe: [2]</String>
338 <String Id="ProgressTextSelfUnregModules" Overridable="yes">Avregistrerer moduler</String>
339 <String Id="ProgressTextSelfUnregModulesTemplate" Overridable="yes">Fil: [1], Mappe: [2]</String>
340 <String Id="ProgressTextSetODBCFolders" Overridable="yes">Initialiserer ODBC-mapper</String>
341 <String Id="ProgressTextStartServices" Overridable="yes">Starter tjenester</String>
342 <String Id="ProgressTextStartServicesTemplate" Overridable="yes">Tjeneste: [1]</String>
343 <String Id="ProgressTextStopServices" Overridable="yes">Stopper tjenester</String>
344 <String Id="ProgressTextStopServicesTemplate" Overridable="yes">Tjeneste: [1]</String>
345 <String Id="ProgressTextUnpublishComponents" Overridable="yes">Fjerner publisering av kvalifiserte komponenter</String>
346 <String Id="ProgressTextUnpublishComponentsTemplate" Overridable="yes">Komponent-ID: [1], Kvalifikator: [2]</String>
347 <String Id="ProgressTextUnpublishFeatures" Overridable="yes">Fjerner publisering av produktfunksjoner</String>
348 <String Id="ProgressTextUnpublishFeaturesTemplate" Overridable="yes">Funksjon: [1]</String>
349 <String Id="ProgressTextUnregisterClassInfo" Overridable="yes">Avregistrerer klasseservere</String>
350 <String Id="ProgressTextUnregisterClassInfoTemplate" Overridable="yes">Klasse-ID: [1]</String>
351 <String Id="ProgressTextUnregisterComPlus" Overridable="yes">Avregistrerer COM+-programmer og -komponenter</String>
352 <String Id="ProgressTextUnregisterComPlusTemplate" Overridable="yes">Prog-ID: [1] {{, Progtype: [2]}}</String>
353 <String Id="ProgressTextUnregisterExtensionInfo" Overridable="yes">Avregistrerer tilleggsservere</String>
354 <String Id="ProgressTextUnregisterExtensionInfoTemplate" Overridable="yes">Tillegg: [1]</String>
355 <String Id="ProgressTextUnregisterFonts" Overridable="yes">Avregistrerer skrifter</String>
356 <String Id="ProgressTextUnregisterFontsTemplate" Overridable="yes">Skrift: [1]</String>
357 <String Id="ProgressTextUnregisterMIMEInfo" Overridable="yes">Avregistrerer MIME-informasjon</String>
358 <String Id="ProgressTextUnregisterMIMEInfoTemplate" Overridable="yes">MIME-innholdstype: [1], Tillegg: [2]</String>
359 <String Id="ProgressTextUnregisterProgIdInfo" Overridable="yes">Avregistrerer programidentifikatorer</String>
360 <String Id="ProgressTextUnregisterProgIdInfoTemplate" Overridable="yes">Prog-ID: [1]</String>
361 <String Id="ProgressTextUnregisterTypeLibraries" Overridable="yes">Avregistrerer typebiblioteker</String>
362 <String Id="ProgressTextUnregisterTypeLibrariesTemplate" Overridable="yes">Bibl-ID: [1]</String>
363 <String Id="ProgressTextWriteEnvironmentStrings" Overridable="yes">Oppdaterer miljøstrenger</String>
364 <String Id="ProgressTextWriteEnvironmentStringsTemplate" Overridable="yes">Navn: [1], Verdi: [2], Handling: [3]</String>
365 <String Id="ProgressTextWriteIniValues" Overridable="yes">Skriver INI-filverdier</String>
366 <String Id="ProgressTextWriteIniValuesTemplate" Overridable="yes">Fil: [1], Avsnitt: [2], Nøkkel: [3], Verdi: [4]</String>
367 <String Id="ProgressTextWriteRegistryValues" Overridable="yes">Skriver verdier til systemregistret</String>
368 <String Id="ProgressTextWriteRegistryValuesTemplate" Overridable="yes">Nøkkel: [1], Navn: [2], Verdi: [3]</String>
369 <String Id="ProgressTextAdvertise" Overridable="yes">Annonseprogram</String>
370 <String Id="ProgressTextGenerateScript" Overridable="yes">Genererer skriptoperasjoner for handlingen:</String>
371 <String Id="ProgressTextGenerateScriptTemplate" Overridable="yes">[1]</String>
372 <String Id="ProgressTextInstallSFPCatalogFile" Overridable="yes">Installerer systemmappe</String>
373 <String Id="ProgressTextInstallSFPCatalogFileTemplate" Overridable="yes">Fil: [1], Avhengigheter: [2]</String>
374 <String Id="ProgressTextMsiPublishAssemblies" Overridable="yes">Publiserer samlingsinformasjon</String>
375 <String Id="ProgressTextMsiPublishAssembliesTemplate" Overridable="yes">Programkontekst:[1], Samlingsnavn:[2]</String>
376 <String Id="ProgressTextMsiUnpublishAssemblies" Overridable="yes">Fjerner publisering av samlingsinformasjon</String>
377 <String Id="ProgressTextMsiUnpublishAssembliesTemplate" Overridable="yes">Programkontekst:[1], Samlingsnavn:[2]</String>
378 <String Id="ProgressTextRollback" Overridable="yes">Ruller tilbake handling:</String>
379 <String Id="ProgressTextRollbackTemplate" Overridable="yes">[1]</String>
380 <String Id="ProgressTextRollbackCleanup" Overridable="yes">Fjerner sikkerhetskopifiler</String>
381 <String Id="ProgressTextRollbackCleanupTemplate" Overridable="yes">Fil: [1]</String>
382 <String Id="ProgressTextUnmoveFiles" Overridable="yes">Fjerner flyttede filer</String>
383 <String Id="ProgressTextUnmoveFilesTemplate" Overridable="yes">Fil: [1], Mappe: [9]</String>
384 <String Id="ProgressTextUnpublishProduct" Overridable="yes">Fjerner publisering av produktinformasjon</String>
385
386 <String Id="Error0" Overridable="yes">{{Uopprettelig feil: }}</String>
387 <String Id="Error1" Overridable="yes">{{Feil [1]. }}</String>
388 <String Id="Error2" Overridable="yes">Advarsel [1]. </String>
389 <String Id="Error4" Overridable="yes">Informasjon [1]. </String>
390 <String Id="Error5" Overridable="yes">Installasjonsprogrammet har støtt på en uventet feil under installasjon av denne pakken. Det kan bety at det er en feil med pakken. Feilkoden er [1]. {{Argumentene er: [2], [3], [4]}}</String>
391 <String Id="Error7" Overridable="yes">{{Disken er full: }}</String>
392 <String Id="Error8" Overridable="yes">Hendelse [Time]: [1]. [2]</String>
393 <String Id="Error9" Overridable="yes">[ProductName]</String>
394 <String Id="Error10" Overridable="yes">{[2]}{, [3]}{, [4]}</String>
395 <String Id="Error11" Overridable="yes">Meldingstype: [1], Argument: [2]</String>
396 <String Id="Error12" Overridable="yes">=== Logging startet: [Date] [Time] ===</String>
397 <String Id="Error13" Overridable="yes">=== Logging stanset: [Date] [Time] ===</String>
398 <String Id="Error14" Overridable="yes">Hendelse startet [Time]: [1].</String>
399 <String Id="Error15" Overridable="yes">Hendelse stoppet [Time]: [1]. Returverdi [2].</String>
400 <String Id="Error16" Overridable="yes">Tid som gjenstår: {[1] minutter }{[2] sekunder}</String>
401 <String Id="Error17" Overridable="yes">Ikke nok minne. Lukk andre programmer før du prøver på nytt.</String>
402 <String Id="Error18" Overridable="yes">Installasjonsprogrammet svarer ikke lenger.</String>
403 <String Id="Error19" Overridable="yes">Installasjonsprogrammet stoppet før tiden.</String>
404 <String Id="Error20" Overridable="yes">Vent mens Windows konfigurerer [ProductName]</String>
405 <String Id="Error21" Overridable="yes">Samler inn nødvendig informasjon ...</String>
406 <String Id="Error22" Overridable="yes">Sletter eldre versjoner av programmet ...</String>
407 <String Id="Error23" Overridable="yes">Forbereder sletting av eldre versjoner av programmet ...</String>
408 <String Id="Error32" Overridable="yes">Installasjonen av {[ProductName] }er fullført.</String>
409 <String Id="Error33" Overridable="yes">Installasjonen av {[ProductName] }mislyktes.</String>
410 <String Id="Error1101" Overridable="yes">Feil ved lesing fra filen: [2]. {{ Systemfeil [3].}} Kontroller at filen finnes, og at du har tilgang til den.</String>
411 <String Id="Error1301" Overridable="yes">Kan ikke opprette filen [2]. Det finnes allerede en mappe med dette navnet. Avbryt installasjonen, og prøv å installere på en annen plassering.</String>
412 <String Id="Error1302" Overridable="yes">Sett inn disken: [2]</String>
413 <String Id="Error1303" Overridable="yes">Installasjonsprogrammet har ikke tilgang til denne mappen: [2]. Installasjonen kan ikke fortsette. Logg på som administrator eller ta kontakt med systemansvarlig.</String>
414 <String Id="Error1304" Overridable="yes">Feil ved skriving til filen: [2]. Kontroller at du har tilgang til den mappen.</String>
415 <String Id="Error1305" Overridable="yes">Feil ved lesing fra filen: [2]. {{ Systemfeil [3].}} Kontroller at filen finnes, og at du har tilgang til den.</String>
416 <String Id="Error1306" Overridable="yes">Et annet program har eksklusiv tilgang til filen [2]. Lukk alle andre programmer, og klikk deretter Prøv på nytt.</String>
417 <String Id="Error1307" Overridable="yes">Ikke nok diskplass til å installere denne filen: [2]. Frigjør litt diskplass og klikk Prøv på nytt, eller klikk Avbryt for å avslutte.</String>
418 <String Id="Error1308" Overridable="yes">Finner ikke kildefil: [2]. Kontroller at filen finnes, og at du har tilgang til den.</String>
419 <String Id="Error1309" Overridable="yes">Feil ved lesing fra fil: [3]. {{ Systemfeil [2].}} Kontroller at filen finnes, og at du har tilgang til den.</String>
420 <String Id="Error1310" Overridable="yes">Feil ved skriving til fil: [3]. {{ Systemfeil [2].}} Kontroller at du har tilgang til den mappen.</String>
421 <String Id="Error1311" Overridable="yes">Finner ikke kildefil{{(kabinettfil)}}: [2]. Kontroller at filen finnes, og at du har tilgang til den.</String>
422 <String Id="Error1312" Overridable="yes">Kan ikke opprette mappen [2]. Det finnes allerede en fil med dette navnet. Gi filen nytt navn eller fjern den og klikk Prøv på nytt, eller klikk Avbryt for å avslutte.</String>
423 <String Id="Error1313" Overridable="yes">Volumet [2] er ikke tilgjengelig. Velg et annet.</String>
424 <String Id="Error1314" Overridable="yes">Den angitte banen [2] er ikke tilgjengelig.</String>
425 <String Id="Error1315" Overridable="yes">Kan ikke skrive til den angitte mappen [2].</String>
426 <String Id="Error1316" Overridable="yes">Det oppstod en nettverksfeil ved forsøk på lesing fra filen: [2]</String>
427 <String Id="Error1317" Overridable="yes">Det oppstod en feil ved forsøk på å opprette mappen: [2]</String>
428 <String Id="Error1318" Overridable="yes">Det oppstod en nettverksfeil ved forsøk på å opprette mappen: [2]</String>
429 <String Id="Error1319" Overridable="yes">Det oppstod en nettverksfeil ved forsøk på å åpne kildefilkabinettet: [2]</String>
430 <String Id="Error1320" Overridable="yes">Den angitte banen er for lang: [2]</String>
431 <String Id="Error1321" Overridable="yes">Installasjonsprogrammet har ikke tilgang til å endre denne filen: [2].</String>
432 <String Id="Error1322" Overridable="yes">En del av mappebanen [2] er ugyldig. Den er enten tom eller overskrider lengden som tillates av systemet.</String>
433 <String Id="Error1323" Overridable="yes">Mappebanen [2] inneholder ord som ikke er gyldige i mappebaner.</String>
434 <String Id="Error1324" Overridable="yes">Mappebanen [2] inneholder et ugyldig tegn.</String>
435 <String Id="Error1325" Overridable="yes">[2] er ikke et gyldig kort filnavn.</String>
436 <String Id="Error1326" Overridable="yes">Feil ved henting av filsikkerhet: [3] GetLastError: [2]</String>
437 <String Id="Error1327" Overridable="yes">Ugyldig stasjon: [2]</String>
438 <String Id="Error1328" Overridable="yes">Feil ved oppdatering av filen [2]. Den er sannsynligvis oppdatert på andre måter, og kan ikke lenger endres av denne oppdateringen. Kontakt oppdateringsleverandøren for mer informasjon. {{Systemfeil: [3]}}</String>
439 <String Id="Error1329" Overridable="yes">En nødvendig fil kan ikke installeres fordi kabinettfilen [2] ikke er signert digitalt. Dette kan bety at kabinettfilen er skadet.</String>
440 <String Id="Error1330" Overridable="yes">En nødvendig fil kan ikke installeres fordi kabinettfilen [2] har en ugyldig digital signatur. Dette kan bety at kabinettfilen er skadet.{{ Feilen [3] ble returnert av WinVerifyTrust.}}</String>
441 <String Id="Error1331" Overridable="yes">Kan ikke kopiere [2]-filen: CRC-feil.</String>
442 <String Id="Error1332" Overridable="yes">Kan ikke flytte [2]-filen: CRC-feil.</String>
443 <String Id="Error1333" Overridable="yes">Kan ikke oppdatere [2]-filen: CRC-feil.</String>
444 <String Id="Error1334" Overridable="yes">Filen [2] kan ikke installeres fordi filen ikke finnes i kabinettfilen [3]. Dette kan indikere nettverksfeil, feil under lesing fra CD-ROMen eller et problem med denne pakken.</String>
445 <String Id="Error1335" Overridable="yes">Kabinettfilen [2] som kreves for denne installasjonen, er skadet og kan ikke brukes. Dette kan indikere nettverksfeil, feil under lesing fra CD-ROMen eller et problem med denne pakken.</String>
446 <String Id="Error1336" Overridable="yes">Det oppstod en feil under oppretting av en midlertidig fil som er nødvendig for å fullføre installasjonen.{{ Mappe: [3]. Systemfeilkode: [2]}}</String>
447 <String Id="Error1401" Overridable="yes">Kan ikke opprette nøkkelen [2]. {{ Systemfeil [3].}} Kontroller at du har tilgang til nøkkelen, eller kontakt støttepersonell. </String>
448 <String Id="Error1402" Overridable="yes">Kan ikke åpne nøkkelen [2]. {{ Systemfeil [3].}} Kontroller at du har tilgang til nøkkelen, eller kontakt støttepersonell. </String>
449 <String Id="Error1403" Overridable="yes">Kan ikke slette verdien [2] fra nøkkelen [3]. {{ Systemfeil [4].}} Kontroller at du har tilgang til nøkkelen, eller kontakt støttepersonell. </String>
450 <String Id="Error1404" Overridable="yes">Kan ikke slette nøkkelen [2]. {{ Systemfeil [3].}} Kontroller at du har tilgang til nøkkelen, eller kontakt støttepersonell. </String>
451 <String Id="Error1405" Overridable="yes">Kan ikke lese verdien [2] fra nøkkelen [3]. {{ Systemfeil [4].}} Kontroller at du har tilgang til nøkkelen, eller kontakt støttepersonell. </String>
452 <String Id="Error1406" Overridable="yes">Kan ikke skrive verdien [2] til nøkkelen [3]. {{ Systemfeil [4].}} Kontroller at du har tilgang til nøkkelen, eller kontakt støttepersonell.</String>
453 <String Id="Error1407" Overridable="yes">Kan ikke hente verdinavn for nøkkelen [2]. {{ Systemfeil [3].}} Kontroller at du har tilgang til nøkkelen, eller kontakt støttepersonell.</String>
454 <String Id="Error1408" Overridable="yes">Kan ikke hente undernøkkelnavn for nøkkelen [2]. {{ Systemfeil [3].}} Kontroller at du har tilgang til nøkkelen, eller kontakt støttepersonell.</String>
455 <String Id="Error1409" Overridable="yes">Kan ikke lese sikkerhetsinformasjon for nøkkelen [2]. {{ Systemfeil [3].}} Kontroller at du har tilgang til nøkkelen, eller kontakt støttepersonell.</String>
456 <String Id="Error1410" Overridable="yes">Kan ikke øke tilgjengelig registerplass. [2] kB ledig registerplass er nødvendig for å installere dette programmet.</String>
457 <String Id="Error1500" Overridable="yes">En annen installasjon kjører. Du må fullføre den installasjonen før du fortsetter med denne.</String>
458 <String Id="Error1501" Overridable="yes">Feil under tilgang til sikrede data. Kontroller at Windows Installer er riktig konfigurert, og prøv å installere på nytt.</String>
459 <String Id="Error1502" Overridable="yes">Brukeren [2] har tidligere startet en installasjon av produktet [3]. Denne brukeren må kjøre installasjonsprogrammet på nytt før produktet kan brukes. Installasjonen vil nå fortsette.</String>
460 <String Id="Error1503" Overridable="yes">Brukeren [2] har tidligere startet en installasjon av produktet [3]. Denne brukeren må kjøre installasjonsprogrammet på nytt før produktet kan brukes.</String>
461 <String Id="Error1601" Overridable="yes">Ikke nok diskplass - Volum: [2]. Nødvendig plass: [3] kB. Tilgjengelig plass: [4] kB. Frigjør diskplass, og prøv på nytt.</String>
462 <String Id="Error1602" Overridable="yes">Er du sikker på at du vil avbryte?</String>
463 <String Id="Error1603" Overridable="yes">Filen [2][3] brukes allerede av{ følgende prosess: Navn: [4], ID: [5], Vindustittel: [6]}. Lukk programmet, og prøv på nytt.</String>
464 <String Id="Error1604" Overridable="yes">Produktet [2] er allerede installert, og hindrer dermed installasjonen av dette produktet. De to produktene er ikke kompatible.</String>
465 <String Id="Error1605" Overridable="yes">Det er ikke nok diskplass på volumet [2] til å fortsette installasjonen med gjenoppretting aktivert. [3] kB kreves, men det er bare [4] kB tilgjengelig. Klikk Ignorer for å fortsette installasjonen uten å lagre gjenopprettingsinformasjon, klikk Prøv på nytt for å se etter tilgjengelig plass igjen, eller klikk Avbryt for å avbryte installasjonen.</String>
466 <String Id="Error1606" Overridable="yes">Får ikke tilgang til nettverksplasseringen [2].</String>
467 <String Id="Error1607" Overridable="yes">Følgende programmer bør lukkes før du fortsetter installasjonen:</String>
468 <String Id="Error1608" Overridable="yes">Finner ingen tidligere installerte kompatible produkter på maskinen for å installere dette produktet.</String>
469 <String Id="Error1609" Overridable="yes">Det oppstod en feil under bruk av sikkerhetsinnstillinger. [2] er ikke en gyldig bruker eller gruppe. Det kan være et problem med pakken eller et problem med tilkobling til en domenekontroller på nettverket. Kontroller nettverkstilkoblingen og klikk Prøv på nytt, eller klikk Avbryt for å avbryte installasjonen. {{Finner ikke brukerens SID, systemfeil [3]}}</String>
470 <String Id="Error1701" Overridable="yes">Nøkkelen [2] er ikke gyldig. Kontroller at du har angitt riktig nøkkel.</String>
471 <String Id="Error1702" Overridable="yes">Du må starte systemet på nytt før konfigurasjonen av [2] kan fortsette. Velg Ja hvis du vil starte på nytt nå, eller Nei for å starte på nytt manuelt senere.</String>
472 <String Id="Error1703" Overridable="yes">Du må starte systemet på nytt før konfigurasjonsendringene for [2] trer i kraft. Velg Ja for å starte på nytt nå, eller Nei for å starte på nytt manuelt senere.</String>
473 <String Id="Error1704" Overridable="yes">En installasjon av [2] er stoppet. Du må angre endringene som ble gjort i den installasjonen, for å fortsette. Vil du angre endringene?</String>
474 <String Id="Error1705" Overridable="yes">En tidligere installasjon av dette produktet kjører allerede. Du må angre endringene som ble gjort i den installasjonen, for å fortsette. Vil du angre endringene?</String>
475 <String Id="Error1706" Overridable="yes">Finner ingen installasjonspakke for produktet [2]. Prøv installasjonen på nytt med en gyldig kopi av installasjonspakken [3].</String>
476 <String Id="Error1707" Overridable="yes">Installasjonen er fullført.</String>
477 <String Id="Error1708" Overridable="yes">Installasjonen mislyktes.</String>
478 <String Id="Error1709" Overridable="yes">Produkt: [2] - [3]</String>
479 <String Id="Error1710" Overridable="yes">Du kan enten gjenopprette datamaskinen til sin opprinnelige tilstand, eller fortsette installasjonen senere. Vil du gjenopprette?</String>
480 <String Id="Error1711" Overridable="yes">Det oppstod en feil under skriving av installasjonsinformasjon til disken. Kontroller at nok diskplass er tilgjengelig, og klikk Prøv på nytt. Du kan også klikke Avbryt for å avslutte installasjonen.</String>
481 <String Id="Error1712" Overridable="yes">Finner ikke en eller flere filer som kreves for å gjenopprette datamaskinen til sin tidligere tilstand. Gjenoppretting er ikke mulig.</String>
482 <String Id="Error1713" Overridable="yes">[2] kan ikke installere et av de påkrevde produktene. Kontakt kundestøttegruppen. {{Systemfeil: [3].}}</String>
483 <String Id="Error1714" Overridable="yes">Kan ikke fjerne den eldre versjonen av [2]. Kontakt kundestøttegruppen. {{Systemfeil [3].}}</String>
484 <String Id="Error1715" Overridable="yes">Installerte [2]</String>
485 <String Id="Error1716" Overridable="yes">Konfigurerte [2]</String>
486 <String Id="Error1717" Overridable="yes">Fjernet [2]</String>
487 <String Id="Error1718" Overridable="yes">Filen [2] ble avvist av en policy for digital signatur.</String>
488 <String Id="Error1719" Overridable="yes">Ikke tilgang til tjenesten Windows Installer. Dette kan skje hvis du kjører Windows i sikker modus, eller hvis Windows Installer ikke er riktig installert. Kontakt støttepersonell for hjelp.</String>
489 <String Id="Error1720" Overridable="yes">Det er et problem med denne Windows Installer-pakken. Et skript som kreves for å fullføre installasjonen, kan ikke kjøres. Kontakt støttepersonell eller pakkeleverandøren. {{Egendefinert handling [2] skriptfeil [3], [4]: [5] Linje [6], Kolonne [7], [8] }}</String>
490 <String Id="Error1721" Overridable="yes">Det er problemer med denne Windows Installer-pakken. Et program som er nødvendig for å fullføre installasjonen, kan ikke kjøres. Kontakt støttepersonell eller pakkeleverandøren. {{Handling: [2], plassering: [3], kommando: [4] }}</String>
491 <String Id="Error1722" Overridable="yes">Det er et problem med denne Windows Installer-pakken. Et program som ble kjørt i forbindelse med installasjonen, ble ikke fullført som forventet. Kontakt støttepersonell eller pakkeleverandøren. {{Handling [2], plassering: [3], kommando: [4] }}</String>
492 <String Id="Error1723" Overridable="yes">Det er et problem med denne Windows Installer-pakken. En DLL som er nødvendig for at denne installasjonen skal fullføres, kan ikke kjøres. Kontakt støttepersonell eller pakkeleverandøren. {{Handling [2], oppføring: [3], bibliotek: [4] }}</String>
493 <String Id="Error1724" Overridable="yes">Fjerning er fullført.</String>
494 <String Id="Error1725" Overridable="yes">Fjerning mislyktes.</String>
495 <String Id="Error1726" Overridable="yes">Annonsering er fullført.</String>
496 <String Id="Error1727" Overridable="yes">Annonsering mislyktes.</String>
497 <String Id="Error1728" Overridable="yes">Konfigurasjon er fullført.</String>
498 <String Id="Error1729" Overridable="yes">Konfigurasjon mislyktes.</String>
499 <String Id="Error1730" Overridable="yes">Du må være administrator for å fjerne dette programmet. Logg på som administrator eller kontakt kundestøttegruppen for hjelp til å fjerne dette programmet.</String>
500 <String Id="Error1731" Overridable="yes">Kildeinstallasjonspakken for produktet [2] er ikke synkronisert med klientpakken. Prøv å installere på nytt med en gyldig kopi av installasjonspakken [3].</String>
501 <String Id="Error1732" Overridable="yes">Datamaskinen må startes på nytt for å fullføre installasjonen av [2]. Andre brukere er for øyeblikket pålogget datamaskinen og kan miste arbeid hvis den startes på nytt. Vil du starte på nytt nå?</String>
502 <String Id="Error1801" Overridable="yes">Banen [2] er ikke gyldig. Angi en gyldig bane.</String>
503 <String Id="Error1802" Overridable="yes">Ikke nok minne. Lukk andre programmer før du prøver på nytt.</String>
504 <String Id="Error1803" Overridable="yes">Det er ingen disk i stasjon [2]. Sett inn en disk, og velg Prøv på nytt. Du kan også velge Avbryt for å gå tilbake til det tidligere valgte volumet.</String>
505 <String Id="Error1804" Overridable="yes">Det er ingen disk i stasjon [2]. Sett inn en disk, og velg Prøv på nytt. Du kan også velge Avbryt for å returnere til søkedialogboksen og velge et annet volum.</String>
506 <String Id="Error1805" Overridable="yes">Mappen [2] finnes ikke. Angi en bane til en eksisterende mappe.</String>
507 <String Id="Error1806" Overridable="yes">Du har ikke tilgang til å lese i denne mappen.</String>
508 <String Id="Error1807" Overridable="yes">Finner ikke en gyldig målmappe for installasjonen.</String>
509 <String Id="Error1901" Overridable="yes">Feil under forsøk på å lese fra kildedatabasen for installasjonen: [2].</String>
510 <String Id="Error1902" Overridable="yes">Planlegger omstart: Gir filen [2] det nye navnet [3]. Maskinen må startes på nytt for å fullføre operasjonen.</String>
511 <String Id="Error1903" Overridable="yes">Planlegger omstart: Sletter filen [2]. Maskinen må startes på nytt for å fullføre operasjonen.</String>
512 <String Id="Error1904" Overridable="yes">Kan ikke registrere modulen [2]. HRESULT [3]. Kontakt støttepersonell.</String>
513 <String Id="Error1905" Overridable="yes">Kan ikke fjerne registreringen av modulen [2]. HRESULT [3]. Kontakt støttepersonell.</String>
514 <String Id="Error1906" Overridable="yes">Kan ikke hurtigbufre pakken [2]. Feil: [3]. Kontakt støttepersonell.</String>
515 <String Id="Error1907" Overridable="yes">Kan ikke registrere skriften [2]. Kontroller at du har tilstrekkelige tillatelser til å installere skrifter, og at systemet støtter denne skriften.</String>
516 <String Id="Error1908" Overridable="yes">Kan ikke fjerne registreringen av skriften [2]. Kontroller at du har tilstrekkelige tillatelser til å fjerne skrifter.</String>
517 <String Id="Error1909" Overridable="yes">Kan ikke lage snarveien [2]. Kontroller at målmappen finnes, og at du har tilgang til den.</String>
518 <String Id="Error1910" Overridable="yes">Kan ikke fjerne snarveien [2]. Kontroller at snarveisfilen finnes, og at du har tilgang til den.</String>
519 <String Id="Error1911" Overridable="yes">Kan ikke registrere typebibliotek for filen [2]. Kontakt støttepersonell.</String>
520 <String Id="Error1912" Overridable="yes">Kan ikke fjerne registreringen av typebibliotek for filen [2]. Kontakt støttepersonell.</String>
521 <String Id="Error1913" Overridable="yes">Kan ikke oppdatere INI-filen [2][3]. Kontroller at filen finnes, og at du har tilgang til den.</String>
522 <String Id="Error1914" Overridable="yes">Kan ikke planlegge at filen [2] skal erstatte filen [3] ved omstart. Kontroller at du har skrivetillatelse til filen [3].</String>
523 <String Id="Error1915" Overridable="yes">Feil under fjerning av ODBC Driverbehandling, ODBC-feil [2]: [3]. Kontakt støttepersonell.</String>
524 <String Id="Error1916" Overridable="yes">Feil under installasjon av ODBC Driverbehandling, ODBC-feil [2]: [3]. Kontakt støttepersonell.</String>
525 <String Id="Error1917" Overridable="yes">Feil under fjerning av ODBC-driver: [4], ODBC-feil [2]: [3]. Kontroller at du har tilstrekkelig tilgang til å fjerne ODBC-drivere.</String>
526 <String Id="Error1918" Overridable="yes">Feil under installasjon av ODBC-driver: [4], ODBC-feil [2]: [3]. Kontroller at filen [4] finnes, og at du har tilgang til den.</String>
527 <String Id="Error1919" Overridable="yes">Feil under konfigurasjon av ODBC-datakilde: [4], ODBC-feil [2]: [3]. Kontroller at filen [4] finnes, og at du har tilgang til den.</String>
528 <String Id="Error1920" Overridable="yes">Kan ikke starte tjenesten [2] ([3]). Kontroller at du har tilstrekkelig tilgang til å starte systemtjenester.</String>
529 <String Id="Error1921" Overridable="yes">Kan ikke stanse tjenesten [2] ([3]). Kontroller at du har tilstrekkelig tilgang til å stanse systemtjenester.</String>
530 <String Id="Error1922" Overridable="yes">Kan ikke slette tjenesten [2] ([3]). Kontroller at du har tilstrekkelig tilgang til å fjerne systemtjenester.</String>
531 <String Id="Error1923" Overridable="yes">Kan ikke installere tjenesten [2] ([3]). Kontroller at du har tilstrekkelig tilgang til å installere systemtjenester.</String>
532 <String Id="Error1924" Overridable="yes">Kan ikke oppdatere miljøvariabelen [2]. Kontroller at du har tilstrekkelig tilgang til å endre miljøvariabler.</String>
533 <String Id="Error1925" Overridable="yes">Du har ikke tilstrekkelige tilgangsrettigheter til å fullføre denne installasjonen for alle brukere av maskinen. Logg på som administrator, og prøv deretter å installere på nytt.</String>
534 <String Id="Error1926" Overridable="yes">Kan ikke angi filsikkerhet for filen [3]. Feil: [2]. Kontroller at du har tilstrekkelig tilgang til å endre sikkerhetstillatelsene for denne filen.</String>
535 <String Id="Error1927" Overridable="yes">Component Services (COM+ 1.0) er ikke installert på denne datamaskinen. Denne installasjonen krever Component Services for å kunne fullføres. Component Services er tilgjengelig i Windows 2000.</String>
536 <String Id="Error1928" Overridable="yes">Feil under registrering av COM+-programmet. Kontakt støttepersonell for mer informasjon.</String>
537 <String Id="Error1929" Overridable="yes">Feil under avregistrering av COM+-programmet. Kontakt støttepersonell for mer informasjon.</String>
538 <String Id="Error1930" Overridable="yes">Beskrivelsen for tjenesten [2] ([3]) kan ikke endres.</String>
539 <String Id="Error1931" Overridable="yes">Windows Installer-tjenesten kan ikke oppdatere systemfilen [2] fordi filen er beskyttet av Windows. Du må kanskje oppdatere operativsystemet for at programmet skal fungere riktig. {{Pakkeversjon: [3], OS-beskyttet versjon: [4]}}</String>
540 <String Id="Error1932" Overridable="yes">Windows Installer-tjenesten kan ikke oppdatere den beskyttede Windows-filen [2]. {{Pakkeversjon: [3], OS-beskyttet versjon: [4], SFP-feil: [5]}}</String>
541 <String Id="Error1933" Overridable="yes">Windows Installer-tjenesten kan ikke oppdatere en eller flere beskyttede Windows-filer. {{SFP-feil: [2]. Liste over beskyttede filer:\r\n[3]}}</String>
542 <String Id="Error1934" Overridable="yes">Brukerinstallasjoner er deaktivert ved hjelp av en policy på denne maskinen.</String>
543 <String Id="Error1935" Overridable="yes">Det oppstod en feil under installasjon av samlingen [6]. Slå opp i Hjelp og støtte for mer informasjon. HRESULT: [3]. {{samlingsgrensesnitt: [4], funksjon: [5], komponent: [2]}}</String>
544 <String Id="Error1936" Overridable="yes">Det oppstod en feil under installasjonen av samlingen [6]. Samlingen har ikke fått et sterkt navn eller er ikke signert med minimum nøkkellengde. HRESULT: [3]. {{samlingsgrensesnitt: [4], funksjon: [5], komponent: [2]}}</String>
545 <String Id="Error1937" Overridable="yes">Det oppstod en feil under installasjonen av samlingen [6]. Signaturen eller mappen kan ikke bekreftes eller er ikke gyldig. HRESULT: [3]. {{samlingsgrensesnitt: [4], funksjon: [5], komponent: [2]}}</String>
546 <String Id="Error1938" Overridable="yes">Det oppstod en feil under installasjonen av samlingen [6]. En eller flere av samlingens moduler ble ikke funnet. HRESULT: [3]. {{samlingsgrensesnitt: [4], funksjon: [5], komponent: [2]}}</String>
547
548 <String Id="UITextbytes" Overridable="yes">Byte</String>
549 <String Id="UITextGB" Overridable="yes">GB</String>
550 <String Id="UITextKB" Overridable="yes">kB</String>
551 <String Id="UITextMB" Overridable="yes">MB</String>
552 <String Id="UITextMenuAbsent" Overridable="yes">Hele funksjonen vil være utilgjengelig</String>
553 <String Id="UITextMenuAdvertise" Overridable="yes">Funksjonen installeres når dette er nødvendig</String>
554 <String Id="UITextMenuAllCD" Overridable="yes">Hele funksjonen installeres for å kjøres fra CD</String>
555 <String Id="UITextMenuAllLocal" Overridable="yes">Hele funksjonen installeres på den lokale harddisken</String>
556 <String Id="UITextMenuAllNetwork" Overridable="yes">Hele funksjonen installeres for å kjøres fra nettverket</String>
557 <String Id="UITextMenuCD" Overridable="yes">Installeres for å kjøres fra CD</String>
558 <String Id="UITextMenuLocal" Overridable="yes">Installeres på den lokale harddisken</String>
559 <String Id="UITextMenuNetwork" Overridable="yes">Installeres for å kjøres fra nettverket</String>
560 <String Id="UITextNewFolder" Overridable="yes">Mappe|Ny mappe</String>
561 <String Id="UITextScriptInProgress" Overridable="yes">Samler inn nødvendig informasjon ...</String>
562 <String Id="UITextSelAbsentAbsent" Overridable="yes">Denne funksjonen installeres ikke</String>
563 <String Id="UITextSelAbsentAdvertise" Overridable="yes">Denne funksjonen vil bli installert når det er nødvendig</String>
564 <String Id="UITextSelAbsentCD" Overridable="yes">Denne funksjonen installeres for å kjøres fra CD</String>
565 <String Id="UITextSelAbsentLocal" Overridable="yes">Denne funksjonen installeres på den lokale harddisken</String>
566 <String Id="UITextSelAbsentNetwork" Overridable="yes">Denne funksjonen installeres for å kjøres fra nettverket</String>
567 <String Id="UITextSelAdvertiseAbsent" Overridable="yes">Denne funksjonen vil bli utilgjengelig</String>
568 <String Id="UITextSelAdvertiseAdvertise" Overridable="yes">Installeres når det er nødvendig</String>
569 <String Id="UITextSelAdvertiseCD" Overridable="yes">Denne funksjonen blir tilgjengelig for kjøring fra CD</String>
570 <String Id="UITextSelAdvertiseLocal" Overridable="yes">Denne funksjonen installeres på den lokale harddisken</String>
571 <String Id="UITextSelAdvertiseNetwork" Overridable="yes">Denne funksjonen blir tilgjengelig for kjøring fra nettverket</String>
572 <String Id="UITextSelCDAbsent" Overridable="yes">Denne funksjonen vil bli fullstendig avinstallert, og du vil ikke kunne kjøre den fra CD</String>
573 <String Id="UITextSelCDAdvertise" Overridable="yes">Denne funksjonen vil endres fra å bli kjørt fra CD til å bli installert når nødvendig</String>
574 <String Id="UITextSelCDCD" Overridable="yes">Denne funksjonen vil fortsatt kjøres fra CD</String>
575 <String Id="UITextSelCDLocal" Overridable="yes">Denne funksjonen vil bli endret fra å bli kjørt fra CD til å bli installert på den lokale harddisken</String>
576 <String Id="UITextSelChildCostNeg" Overridable="yes">Denne funksjonen frigjør [1] på harddisken.</String>
577 <String Id="UITextSelChildCostPos" Overridable="yes">Denne funksjonen krever [1] på harddisken.</String>
578 <String Id="UITextSelCostPending" Overridable="yes">Beregner kostnaden for denne funksjonen ...</String>
579 <String Id="UITextSelLocalAbsent" Overridable="yes">Denne funksjonen fjernes fullstendig</String>
580 <String Id="UITextSelLocalAdvertise" Overridable="yes">Denne funksjonen vil bli fjernet fra den lokale harddisken, men vil bli installert når nødvendig</String>
581 <String Id="UITextSelLocalCD" Overridable="yes">Denne funksjonen vil bli fjernet fra den lokale harddisken, men vil fremdeles være tilgjengelig for kjøring fra CD</String>
582 <String Id="UITextSelLocalLocal" Overridable="yes">Denne funksjonen vil fortsatt finnes på den lokale harddisken</String>
583 <String Id="UITextSelLocalNetwork" Overridable="yes">Denne funksjonen vil bli fjernet fra den lokale harddisken, men vil fremdeles være tilgjengelig for kjøring fra nettverket</String>
584 <String Id="UITextSelNetworkAbsent" Overridable="yes">Denne funksjonen vil bli fullstendig avinstallert, og du vil ikke kunne kjøre den fra nettverket</String>
585 <String Id="UITextSelNetworkAdvertise" Overridable="yes">Denne funksjonen vil endres fra å bli kjørt fra nettverket til å bli installert når nødvendig</String>
586 <String Id="UITextSelNetworkLocal" Overridable="yes">Denne funksjonen vil endres fra å bli kjørt fra nettverket til å bli installert på den lokale harddisken</String>
587 <String Id="UITextSelNetworkNetwork" Overridable="yes">Denne funksjonen vil fortsatt kjøres fra nettverket</String>
588 <String Id="UITextSelParentCostNegNeg" Overridable="yes">Denne funksjonen frigjør [1] på harddisken. [2] av [3] underfunksjoner er valgt. Underfunksjonene frigjør [4] på harddisken.</String>
589 <String Id="UITextSelParentCostNegPos" Overridable="yes">Denne funksjonen frigjør [1] på harddisken. [2] av [3] underfunksjoner er valgt. Underfunksjonene krever [4] på harddisken.</String>
590 <String Id="UITextSelParentCostPosNeg" Overridable="yes">Denne funksjonen krever [1] på harddisken. [2] av [3] underfunksjoner er valgt. Underfunksjonene frigjør [4] på harddisken.</String>
591 <String Id="UITextSelParentCostPosPos" Overridable="yes">Denne funksjonen krever [1] på harddisken. [2] av [3] underfunksjoner er valgt. Underfunksjonene krever [4] på harddisken.</String>
592 <String Id="UITextTimeRemaining" Overridable="yes">Tid som gjenstår: {[1] minutter }{[2] sekunder}</String>
593 <String Id="UITextVolumeCostAvailable" Overridable="yes">Tilgjengelig</String>
594 <String Id="UITextVolumeCostDifference" Overridable="yes">Forskjell</String>
595 <String Id="UITextVolumeCostRequired" Overridable="yes">Nødvendig</String>
596 <String Id="UITextVolumeCostSize" Overridable="yes">Diskstørrelse</String>
597 <String Id="UITextVolumeCostVolume" Overridable="yes">Volum</String>
598</WixLocalization>
diff --git a/src/ext/UI/wixlib/WixUI_nl-NL.wxl b/src/ext/UI/wixlib/WixUI_nl-NL.wxl
new file mode 100644
index 00000000..d2ca3249
--- /dev/null
+++ b/src/ext/UI/wixlib/WixUI_nl-NL.wxl
@@ -0,0 +1,598 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3
4
5<WixLocalization Culture="nl-nl" Codepage="1252" xmlns="http://wixtoolset.org/schemas/v4/wxl">
6 <String Id="WixUIBack" Overridable="yes">V&amp;orige</String>
7 <String Id="WixUINext" Overridable="yes">V&amp;olgende</String>
8 <String Id="WixUICancel" Overridable="yes">Annuleren</String>
9 <String Id="WixUIFinish" Overridable="yes">&amp;Voltooien</String>
10 <String Id="WixUIRetry" Overridable="yes">&amp;Opnieuw</String>
11 <String Id="WixUIIgnore" Overridable="yes">&amp;Negeren</String>
12 <String Id="WixUIYes" Overridable="yes">&amp;Ja</String>
13 <String Id="WixUINo" Overridable="yes">&amp;Nee</String>
14 <String Id="WixUIOK" Overridable="yes">OK</String>
15 <String Id="WixUIPrint" Overridable="yes">A&amp;fdrukken</String>
16
17 <String Id="AdvancedWelcomeEulaDlg_Title" Overridable="yes">[ProductName] Setup</String>
18 <String Id="AdvancedWelcomeEulaDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
19 <String Id="AdvancedWelcomeEulaDlgTitle" Overridable="yes">{\WixUI_Font_Title}Lees de gebruiksrechtovereenkomst van [ProductName]</String>
20 <String Id="AdvancedWelcomeEulaDlgLicenseAcceptedCheckBox" Overridable="yes">Ik ga &amp;akkoord met de voorwaarden in de overeenkomst</String>
21 <String Id="AdvancedWelcomeEulaDlgDescriptionPerMachine" Overridable="yes">Klik op Installeren om het product voor alle gebruikers te installeren met de standaardopties. Klik op Geavanceerd als u de installatieopties wilt wijzigen.</String>
22 <String Id="AdvancedWelcomeEulaDlgDescriptionPerUser" Overridable="yes">Klik op Installeren om het product alleen voor uzelf te installeren met de standaardopties. Klik op Geavanceerd als u de installatieopties wilt wijzigen.</String>
23 <String Id="AdvancedWelcomeEulaDlgInstall" Overridable="yes">&amp;Installeren</String>
24 <String Id="AdvancedWelcomeEulaDlgAdvanced" Overridable="yes">&amp;Geavanceerd</String>
25 <String Id="Advanced_Font_Normal_Size" Overridable="yes">8</String>
26 <String Id="Advanced_Font_Bigger_Size" Overridable="yes">12</String>
27 <String Id="Advanced_Font_Title_Size" Overridable="yes">9</String>
28 <String Id="Advanced_Font_Emphasized_Size" Overridable="yes">8</String>
29 <String Id="Advanced_Font_FaceName" Overridable="yes">Tahoma</String>
30
31 <String Id="BrowseDlg_Title" Overridable="yes">[ProductName] Setup</String>
32 <String Id="BrowseDlgComboLabel" Overridable="yes">&amp;Zoeken in:</String>
33 <String Id="BrowseDlgWixUI_Bmp_Up" Overridable="yes">WixUI_Bmp_Up</String>
34 <String Id="BrowseDlgWixUI_Bmp_UpTooltip" Overridable="yes">Eén niveau naar boven</String>
35 <String Id="BrowseDlgNewFolder" Overridable="yes">WixUI_Bmp_New</String>
36 <String Id="BrowseDlgNewFolderTooltip" Overridable="yes">Een nieuwe map maken</String>
37 <String Id="BrowseDlgPathLabel" Overridable="yes">&amp;Mapnaam:</String>
38 <String Id="BrowseDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
39 <String Id="BrowseDlgDescription" Overridable="yes">Naar de doelmap bladeren</String>
40 <String Id="BrowseDlgTitle" Overridable="yes">{\WixUI_Font_Title}Doelmap wijzigen</String>
41
42 <String Id="CancelDlg_Title" Overridable="yes">[ProductName] Setup</String>
43 <String Id="CancelDlgText" Overridable="yes">Weet u zeker dat u de installatie van [ProductName] wilt annuleren?</String>
44 <String Id="CancelDlgIcon" Overridable="yes">WixUI_Ico_Info</String>
45 <String Id="CancelDlgIconTooltip" Overridable="yes">Informatiepictogram</String>
46
47 <String Id="CustomizeDlg_Title" Overridable="yes">[ProductName] Setup</String>
48 <String Id="CustomizeDlgTree" Overridable="yes">Structuur van selecties</String>
49 <String Id="CustomizeDlgBrowse" Overridable="yes">B&amp;laderen...</String>
50 <String Id="CustomizeDlgReset" Overridable="yes">&amp;Beginwaarden</String>
51 <String Id="CustomizeDlgDiskCost" Overridable="yes">Schijf&amp;gebruik</String>
52 <String Id="CustomizeDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
53 <String Id="CustomizeDlgText" Overridable="yes">Klik op de pictogrammen in de onderstaande structuur als u wilt wijzigen hoe onderdelen worden geïnstalleerd.</String>
54 <String Id="CustomizeDlgDescription" Overridable="yes">Selecteer de manier waarop u onderdelen wilt installeren.</String>
55 <String Id="CustomizeDlgTitle" Overridable="yes">{\WixUI_Font_Title}Aangepaste installatie</String>
56 <String Id="CustomizeDlgItemDescription" Overridable="yes">CustomizeDlgItemDescription-CustomizeDlgItemDescription</String>
57 <String Id="CustomizeDlgItemSize" Overridable="yes">CustomizeDlgItemSize-CustomizeDlgItemSize</String>
58 <String Id="CustomizeDlgLocation" Overridable="yes">CustomizeDlgLocation-CustomizeDlgLocation</String>
59 <String Id="CustomizeDlgLocationLabel" Overridable="yes">Locatie:</String>
60
61 <String Id="DiskCostDlg_Title" Overridable="yes">[ProductName] Setup</String>
62 <String Id="DiskCostDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
63 <String Id="DiskCostDlgText" Overridable="yes">De gemarkeerde volumes beschikken niet over voldoende schijfruimte voor de geselecteerde onderdelen. U kunt bestanden van de gemarkeerde volumes verwijderen, minder onderdelen installeren of andere doelstations selecteren.</String>
64 <String Id="DiskCostDlgDescription" Overridable="yes">De benodigde schijfruimte voor de installatie van de geselecteerde onderdelen.</String>
65 <String Id="DiskCostDlgTitle" Overridable="yes">{\WixUI_Font_Title}Vereiste schijfruimte</String>
66 <String Id="DiskCostDlgVolumeList" Overridable="yes">{120}{70}{70}{70}{70}</String>
67
68 <String Id="ErrorDlg_Title" Overridable="yes">[ProductName] Setup</String>
69 <String Id="ErrorDlgErrorText" Overridable="yes">Informatietekst</String>
70 <String Id="ErrorDlgErrorIcon" Overridable="yes">WixUI_Ico_Info</String>
71 <String Id="ErrorDlgErrorIconTooltip" Overridable="yes">Informatiepictogram</String>
72
73 <String Id="ExitDialog_Title" Overridable="yes">[ProductName] Setup</String>
74 <String Id="ExitDialogBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
75 <String Id="ExitDialogDescription" Overridable="yes">Klik op de knop Voltooien om de installatiewizard af te sluiten.</String>
76 <String Id="ExitDialogTitle" Overridable="yes">{\WixUI_Font_Bigger}De wizard Setup van [ProductName] is voltooid</String>
77
78 <String Id="FatalError_Title" Overridable="yes">[ProductName] Setup</String>
79 <String Id="FatalErrorBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
80 <String Id="FatalErrorTitle" Overridable="yes">{\WixUI_Font_Bigger} De wizard Setup van [ProductName] is voortijdig beëindigd</String>
81 <String Id="FatalErrorDescription1" Overridable="yes">De installatiewizard van [ProductName] is voortijdig beëindigd vanwege een fout. Het systeem is niet gewijzigd. Als u dit programma op een later tijdstip wilt installeren, voert u de installatiewizard nogmaals uit.</String>
82 <String Id="FatalErrorDescription2" Overridable="yes">Klik op de knop Voltooien om de installatiewizard af te sluiten.</String>
83
84 <String Id="FeaturesDlg_Title" Overridable="yes">[ProductName] Setup</String>
85 <String Id="FeaturesDlgTree" Overridable="yes">Productonderdelen</String>
86 <String Id="FeaturesDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
87 <String Id="FeaturesDlgDescription" Overridable="yes">Selecteer de manier waarop u onderdelen wilt installeren.</String>
88 <String Id="FeaturesDlgTitle" Overridable="yes">{\WixUI_Font_Title}Productonderdelen</String>
89 <String Id="FeaturesDlgItemDescription" Overridable="yes">FeaturesDlgItemDescription</String>
90 <String Id="FeaturesDlgItemSize" Overridable="yes">FeaturesDlgItemSize</String>
91 <String Id="FeaturesDlgInstall" Overridable="yes">&amp;Installeren</String>
92 <String Id="FeaturesDlgChange" Overridable="yes">&amp;Wijzigen</String>
93
94 <String Id="FilesInUse_Title" Overridable="yes">[ProductName] Setup</String>
95 <String Id="FilesInUseExit" Overridable="yes">&amp;Afsluiten</String>
96 <String Id="FilesInUseBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
97 <String Id="FilesInUseText" Overridable="yes">De volgende toepassingen gebruiken bestanden die moeten worden bijgewerkt door deze installatie. Sluit deze toepassingen en klik op &amp;Opnieuw als u de installatie wilt voorzetten of op Afsluiten als u de installatie wilt afsluiten.</String>
98 <String Id="FilesInUseDescription" Overridable="yes">Bepaalde bestanden die moeten worden bijgewerkt, zijn momenteel in gebruik.</String>
99 <String Id="FilesInUseTitle" Overridable="yes">{\WixUI_Font_Title}Bestanden in gebruik</String>
100
101 <String Id="InstallDirDlg_Title" Overridable="yes">[ProductName] Setup</String>
102 <String Id="InstallDirDlgChange" Overridable="yes">&amp;Wijzigen...</String>
103 <String Id="InstallDirDlgTitle" Overridable="yes">{\WixUI_Font_Title}Doelmap</String>
104 <String Id="InstallDirDlgDescription" Overridable="yes">Klik op Volgende om in de standaardmap te installeren of klik op Wijzigen om een andere map te kiezen.</String>
105 <String Id="InstallDirDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
106 <String Id="InstallDirDlgFolderLabel" Overridable="yes">[ProductName] installeren in:</String>
107
108 <String Id="InstallScopeDlg_Title" Overridable="yes">[ProductName] Setup</String>
109 <String Id="InstallScopeDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
110 <String Id="InstallScopeDlgDescription" Overridable="yes">Kies het installatiebereik en de installatiemap</String>
111 <String Id="InstallScopeDlgTitle" Overridable="yes">{\WixUI_Font_Title}Installatiebereik</String>
112 <String Id="InstallScopeDlgPerUser" Overridable="yes">{\WixUI_Font_Emphasized}Alleen voor &amp;uzelf installeren ([LogonUser])</String>
113 <String Id="InstallScopeDlgPerUserDescription" Overridable="yes">[ProductName] wordt geïnstalleerd in een map per gebruiker en is alleen voor dit gebruikersaccount beschikbaar. U hebt geen lokale Administrator-bevoegdheden nodig.</String>
114 <String Id="InstallScopeDlgNoPerUserDescription" Overridable="yes">[ProductName] ondersteunt installatie per gebruiker niet.</String>
115 <String Id="InstallScopeDlgPerMachine" Overridable="yes">{\WixUI_Font_Emphasized}Installeren voor &amp;alle gebruikers van deze computer</String>
116 <String Id="InstallScopeDlgPerMachineDescription" Overridable="yes">[ProductName] wordt standaard geïnstalleerd in een map per computer en is beschikbaar voor alle gebruikers. U kunt de standaardinstallatiemap wijzigen. U moet lokale Administrator-bevoegdheden hebben.</String>
117 <String Id="InstallScopeDlgFolderLabel" Overridable="yes">Installatie&amp;map:</String>
118 <String Id="InstallScopeDlgChange" Overridable="yes">&amp;Wijzigen...</String>
119
120 <String Id="InvalidDirDlg_Title" Overridable="yes">[ProductName] Setup</String>
121 <String Id="InvalidDirDlgText" Overridable="yes">De installatiemap moet op een lokale harde schijf staan.</String>
122 <String Id="InvalidDirDlgIcon" Overridable="yes">WixUI_Ico_Info</String>
123 <String Id="InvalidDirDlgIconTooltip" Overridable="yes">Informatiepictogram</String>
124
125 <String Id="LicenseAgreementDlg_Title" Overridable="yes">[ProductName] Setup</String>
126 <String Id="LicenseAgreementDlgLicenseAcceptedCheckBox" Overridable="yes">Ik ga &amp;akkoord met de voorwaarden in de overeenkomst</String>
127 <String Id="LicenseAgreementDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
128 <String Id="LicenseAgreementDlgDescription" Overridable="yes">Lees de volgende gebruiksrechtovereenkomst aandachtig door</String>
129 <String Id="LicenseAgreementDlgTitle" Overridable="yes">{\WixUI_Font_Title}Gebruiksrechtovereenkomst</String>
130
131 <String Id="MaintenanceTypeDlg_Title" Overridable="yes">[ProductName] Setup</String>
132 <String Id="MaintenanceTypeDlgChangeButton" Overridable="yes">&amp;Wijzigen</String>
133 <String Id="MaintenanceTypeDlgChangeButtonTooltip" Overridable="yes">Installatie wijzigen</String>
134 <String Id="MaintenanceTypeDlgRepairButton" Overridable="yes">&amp;Herstellen</String>
135 <String Id="MaintenanceTypeDlgRepairButtonTooltip" Overridable="yes">Installatie herstellen</String>
136 <String Id="MaintenanceTypeDlgRemoveButton" Overridable="yes">&amp;Verwijderen</String>
137 <String Id="MaintenanceTypeDlgRemoveButtonTooltip" Overridable="yes">Installatie verwijderen</String>
138 <String Id="MaintenanceTypeDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
139 <String Id="MaintenanceTypeDlgDescription" Overridable="yes">Selecteer de bewerking die u wilt uitvoeren.</String>
140 <String Id="MaintenanceTypeDlgTitle" Overridable="yes">{\WixUI_Font_Title}Installatie wijzigen, herstellen of verwijderen</String>
141 <String Id="MaintenanceTypeDlgChangeText" Overridable="yes">Hiermee kunt u wijzigen hoe onderdelen worden geïnstalleerd.</String>
142 <String Id="MaintenanceTypeDlgChangeDisabledText" Overridable="yes">[ProductName] heeft geen functies die afzonderlijk kunnen worden geselecteerd.</String>
143 <String Id="MaintenanceTypeDlgRemoveText" Overridable="yes">Hiermee wordt [ProductName] van de computer verwijderd.</String>
144 <String Id="MaintenanceTypeDlgRemoveDisabledText" Overridable="yes">[ProductName] kan niet worden verwijderd.</String>
145 <String Id="MaintenanceTypeDlgRepairText" Overridable="yes">Hiermee worden fouten in de meest recente installatie hersteld door ontbrekende of beschadigde bestanden, snelkoppelingen en registervermeldingen te repareren.</String>
146 <String Id="MaintenanceTypeDlgRepairDisabledText" Overridable="yes">[ProductName] kan niet worden hersteld.</String>
147
148 <String Id="MaintenanceWelcomeDlg_Title" Overridable="yes">[ProductName] Setup</String>
149 <String Id="MaintenanceWelcomeDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
150 <String Id="MaintenanceWelcomeDlgDescription" Overridable="yes">Met de installatiewizard kunt u de manier wijzigen waarop onderdelen van [ProductName] op uw computer worden geïnstalleerd of kunt u [ProductName] van uw computer verwijderen. Klik op Volgende om door te gaan of op Annuleren als u de installatiewizard wilt sluiten.</String>
151 <String Id="MaintenanceWelcomeDlgTitle" Overridable="yes">{\WixUI_Font_Bigger}Wizard Setup van [ProductName]</String>
152
153 <String Id="MsiRMFilesInUse_Title" Overridable="yes">[ProductName] Setup</String>
154 <String Id="MsiRMFilesInUseBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
155 <String Id="MsiRMFilesInUseText" Overridable="yes">De volgende toepassingen gebruiken bestanden die door deze installatie moeten worden bijgewerkt. U kunt deze toepassingen met behulp van de installatiewizard sluiten en ze later opnieuw starten of u kunt de computer later opnieuw opstarten.</String>
156 <String Id="MsiRMFilesInUseDescription" Overridable="yes">Bepaalde bestanden die moeten worden bijgewerkt, zijn momenteel in gebruik.</String>
157 <String Id="MsiRMFilesInUseTitle" Overridable="yes">{\WixUI_Font_Title}Bestanden in gebruik</String>
158 <String Id="MsiRMFilesInUseUseRM" Overridable="yes">De toepassingen &amp;sluiten en opnieuw starten.</String>
159 <String Id="MsiRMFilesInUseDontUseRM" Overridable="yes">&amp;Toepassingen niet sluiten. Opnieuw opstarten is vereist.</String>
160
161 <String Id="OutOfDiskDlg_Title" Overridable="yes">[ProductName] Setup</String>
162 <String Id="OutOfDiskDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
163 <String Id="OutOfDiskDlgText" Overridable="yes">De gemarkeerde volumes beschikken niet over voldoende schijfruimte voor de momenteel geselecteerde onderdelen. U kunt bestanden van de gemarkeerde volumes verwijderen, minder onderdelen installeren of een ander doelstation selecteren.</String>
164 <String Id="OutOfDiskDlgDescription" Overridable="yes">De benodigde schijfruimte voor de installatie is groter dan de beschikbare schijfruimte.</String>
165 <String Id="OutOfDiskDlgTitle" Overridable="yes">{\WixUI_Font_Title}Onvoldoende schijfruimte</String>
166 <String Id="OutOfDiskDlgVolumeList" Overridable="yes">{120}{70}{70}{70}{70}</String>
167
168 <String Id="OutOfRbDiskDlg_Title" Overridable="yes">[ProductName] Setup</String>
169 <String Id="OutOfRbDiskDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
170 <String Id="OutOfRbDiskDlgText" Overridable="yes">De gemarkeerde volumes beschikken niet over voldoende schijfruimte voor de momenteel geselecteerde onderdelen. U kunt bestanden van de gemarkeerde volumes verwijderen, minder onderdelen installeren of een ander doelstation selecteren.</String>
171 <String Id="OutOfRbDiskDlgDescription" Overridable="yes">De benodigde schijfruimte voor de installatie is groter dan de beschikbare schijfruimte.</String>
172 <String Id="OutOfRbDiskDlgTitle" Overridable="yes">{\WixUI_Font_Title}Onvoldoende schijfruimte</String>
173 <String Id="OutOfRbDiskDlgVolumeList" Overridable="yes">{120}{70}{70}{70}{70}</String>
174 <String Id="OutOfRbDiskDlgText2" Overridable="yes">U kunt ook de terugdraaifunctie van het installatieprogramma uitschakelen. Als u terugdraaien uitschakelt, kan het installatieprogramma de oorspronkelijke staat van uw computer niet meer herstellen als de installatie wordt onderbroken. Klik op Ja als u het risico wilt nemen dat terugdraaien niet meer mogelijk is.</String>
175
176 <String Id="PrepareDlg_Title" Overridable="yes">[ProductName] Setup</String>
177 <String Id="PrepareDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
178 <String Id="PrepareDlgDescription" Overridable="yes">De installatiewizard wordt voorbereid. Een ogenblik geduld.</String>
179 <String Id="PrepareDlgTitle" Overridable="yes">{\WixUI_Font_Bigger}Wizard Setup van [ProductName]</String>
180
181 <String Id="ProgressDlg_Title" Overridable="yes">[ProductName] Setup</String>
182 <String Id="ProgressDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
183 <String Id="ProgressDlgTextInstalling" Overridable="yes">[ProductName] wordt geïnstalleerd. Een ogenblik geduld.</String>
184 <String Id="ProgressDlgTitleInstalling" Overridable="yes">{\WixUI_Font_Title}[ProductName] installeren</String>
185 <String Id="ProgressDlgTextChanging" Overridable="yes">De installatie van [ProductName] wordt gewijzigd. Een ogenblik geduld.</String>
186 <String Id="ProgressDlgTitleChanging" Overridable="yes">{\WixUI_Font_Title}[ProductName] wijzigen</String>
187 <String Id="ProgressDlgTextRepairing" Overridable="yes">De installatie van [ProductName] wordt hersteld. Een ogenblik geduld.</String>
188 <String Id="ProgressDlgTitleRepairing" Overridable="yes">{\WixUI_Font_Title}[ProductName] herstellen</String>
189 <String Id="ProgressDlgTextRemoving" Overridable="yes">[ProductName] wordt verwijderd. Een ogenblik geduld.</String>
190 <String Id="ProgressDlgTitleRemoving" Overridable="yes">{\WixUI_Font_Title}[ProductName] verwijderen</String>
191 <String Id="ProgressDlgTextUpdating" Overridable="yes">Een ogenblik geduld. [ProductName] wordt bijgewerkt.</String>
192 <String Id="ProgressDlgTitleUpdating" Overridable="yes">{\WixUI_Font_Title}[ProductName] bijwerken</String>
193 <String Id="ProgressDlgProgressBar" Overridable="yes">Voortgang gereed</String>
194 <String Id="ProgressDlgStatusLabel" Overridable="yes">Status:</String>
195
196 <String Id="ResumeDlg_Title" Overridable="yes">[ProductName] Setup</String>
197 <String Id="ResumeDlgInstall" Overridable="yes">&amp;Installeren</String>
198 <String Id="ResumeDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
199 <String Id="ResumeDlgDescription" Overridable="yes">De installatie van [ProductName] op uw computer wordt voltooid. Klik op Installeren om door te gaan of op Annuleren als u de installatiewizard wilt sluiten.</String>
200 <String Id="ResumeDlgTitle" Overridable="yes">{\WixUI_Font_Bigger}De wizard Setup van [ProductName] hervatten</String>
201
202 <String Id="SetupTypeDlg_Title" Overridable="yes">[ProductName] Setup</String>
203 <String Id="SetupTypeDlgTypicalButton" Overridable="yes">S&amp;tandaard</String>
204 <String Id="SetupTypeDlgTypicalButtonTooltip" Overridable="yes">Standaardinstallatie</String>
205 <String Id="SetupTypeDlgCustomButton" Overridable="yes">Aa&amp;ngepast</String>
206 <String Id="SetupTypeDlgCustomButtonTooltip" Overridable="yes">Aangepaste installatie</String>
207 <String Id="SetupTypeDlgCompleteButton" Overridable="yes">V&amp;olledig</String>
208 <String Id="SetupTypeDlgCompleteButtonTooltip" Overridable="yes">Volledige installatie</String>
209 <String Id="SetupTypeDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
210 <String Id="SetupTypeDlgTitle" Overridable="yes">{\WixUI_Font_Title}Installatietype kiezen</String>
211 <String Id="SetupTypeDlgDescription" Overridable="yes">Kies het meest geschikte installatietype</String>
212 <String Id="SetupTypeDlgTypicalText" Overridable="yes">De meest gebruikte programmaonderdelen worden geïnstalleerd. Aanbevolen voor de meeste gebruikers.</String>
213 <String Id="SetupTypeDlgCustomText" Overridable="yes">Gebruikers kunnen kiezen welke programmaonderdelen worden geïnstalleerd en waar ze worden geïnstalleerd. Aanbevolen voor ervaren gebruikers.</String>
214 <String Id="SetupTypeDlgCompleteText" Overridable="yes">Alle programmaonderdelen worden geïnstalleerd. Hiervoor is de meeste schijfruimte vereist.</String>
215
216 <String Id="UserExit_Title" Overridable="yes">[ProductName] Setup</String>
217 <String Id="UserExitBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
218 <String Id="UserExitTitle" Overridable="yes">{\WixUI_Font_Bigger}De wizard Setup van [ProductName] is onderbroken</String>
219 <String Id="UserExitDescription1" Overridable="yes">De installatie van [ProductName] is onderbroken. Het systeem is niet gewijzigd. Als u dit programma op een later tijdstip wilt installeren, voert u de installatie opnieuw uit.</String>
220 <String Id="UserExitDescription2" Overridable="yes">Klik op de knop Voltooien om de installatiewizard af te sluiten.</String>
221
222 <String Id="VerifyReadyDlg_Title" Overridable="yes">[ProductName] Setup</String>
223 <String Id="VerifyReadyDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
224 <String Id="VerifyReadyDlgInstall" Overridable="yes">&amp;Installeren</String>
225 <String Id="VerifyReadyDlgInstallText" Overridable="yes">Klik op Installeren om de installatie te starten. Klik op Vorige om uw installatie-instellingen te bekijken of te wijzigen. Klik op Annuleren als u de wizard wilt afsluiten.</String>
226 <String Id="VerifyReadyDlgInstallTitle" Overridable="yes">{\WixUI_Font_Title}Gereed om [ProductName] te installeren</String>
227 <String Id="VerifyReadyDlgChange" Overridable="yes">&amp;Wijzigen</String>
228 <String Id="VerifyReadyDlgChangeText" Overridable="yes">Klik op Wijzigen om de installatie te starten. Klik op Vorige om uw installatie-instellingen te bekijken of te wijzigen. Klik op Annuleren als u de wizard wilt afsluiten.</String>
229 <String Id="VerifyReadyDlgChangeTitle" Overridable="yes">{\WixUI_Font_Title}Gereed om [ProductName] te wijzigen</String>
230 <String Id="VerifyReadyDlgRepair" Overridable="yes">&amp;Herstellen</String>
231 <String Id="VerifyReadyDlgRepairText" Overridable="yes">Klik op Herstellen om de installatie van [ProductName] te herstellen. Klik op Vorige om uw installatie-instellingen te bekijken of te wijzigen. Klik op Annuleren als u de wizard wilt afsluiten.</String>
232 <String Id="VerifyReadyDlgRepairTitle" Overridable="yes">{\WixUI_Font_Title}Gereed om [ProductName] te herstellen</String>
233 <String Id="VerifyReadyDlgRemove" Overridable="yes">&amp;Verwijderen</String>
234 <String Id="VerifyReadyDlgRemoveText" Overridable="yes">Klik op Verwijderen om [ProductName] van uw computer te verwijderen. Klik op Vorige om uw installatie-instellingen te bekijken of te wijzigen. Klik op Annuleren als u de wizard wilt afsluiten.</String>
235 <String Id="VerifyReadyDlgRemoveTitle" Overridable="yes">{\WixUI_Font_Title}Gereed om [ProductName] te verwijderen</String>
236 <String Id="VerifyReadyDlgUpdate" Overridable="yes">&amp;Bijwerken</String>
237 <String Id="VerifyReadyDlgUpdateText" Overridable="yes">Klik op Bijwerken om [ProductName] bij te werken vanaf uw computer. Klik op Vorige om een willekeurige installatie-instelling te controleren. Klik op Annuleren om de wizard af te sluiten.</String>
238 <String Id="VerifyReadyDlgUpdateTitle" Overridable="yes">{\WixUI_Font_Title}Gereed om [ProductName] bij te werken</String>
239
240 <String Id="WaitForCostingDlg_Title" Overridable="yes">[ProductName] Setup</String>
241 <String Id="WaitForCostingDlgReturn" Overridable="yes">&amp;Terug</String>
242 <String Id="WaitForCostingDlgText" Overridable="yes">De vereiste schijfruimte wordt bepaald. Een ogenblik geduld.</String>
243 <String Id="WaitForCostingDlgIcon" Overridable="yes">WixUI_Ico_Exclam</String>
244 <String Id="WaitForCostingDlgIconTooltip" Overridable="yes">Uitroepteken</String>
245
246 <String Id="WelcomeDlg_Title" Overridable="yes">[ProductName] Setup</String>
247 <String Id="WelcomeDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
248 <String Id="WelcomeDlgDescription" Overridable="yes">[ProductName] wordt geïnstalleerd op uw computer. Klik op Volgende om door te gaan of op Annuleren als u de installatiewizard wilt afsluiten.</String>
249 <String Id="WelcomeUpdateDlgDescriptionUpdate" Overridable="yes">Met deze wizard wordt [ProductName] op uw computer bijgewerkt. Klik op Volgende als u wilt doorgaan of op Annuleren als u de wizard wilt afsluiten.</String>
250 <String Id="WelcomeDlgTitle" Overridable="yes">{\WixUI_Font_Bigger}Wizard Setup van [ProductName]</String>
251
252 <String Id="WelcomeEulaDlg_Title" Overridable="yes">[ProductName] Setup</String>
253 <String Id="WelcomeEulaDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
254 <String Id="WelcomeEulaDlgLicenseAcceptedCheckBox" Overridable="yes">Ik ga &amp;akkoord met de voorwaarden in de overeenkomst</String>
255 <String Id="WelcomeEulaDlgInstall" Overridable="yes">&amp;Installeren</String>
256 <String Id="WelcomeEulaDlgUpdate" Overridable="yes">&amp;Bijwerken</String>
257 <String Id="WelcomeEulaDlgTitle" Overridable="yes">{\WixUI_Font_Title}Lees de gebruiksrechtovereenkomst van [ProductName]</String>
258
259 <String Id="ProgressTextInstallValidate" Overridable="yes">Installatie valideren</String>
260 <String Id="ProgressTextInstallFiles" Overridable="yes">Nieuwe bestanden kopiëren</String>
261 <String Id="ProgressTextInstallFilesTemplate" Overridable="yes">Bestand: [1], map: [9], grootte: [6]</String>
262 <String Id="ProgressTextInstallAdminPackage" Overridable="yes">Netwerkinstallatiebestanden kopiëren</String>
263 <String Id="ProgressTextInstallAdminPackageTemplate" Overridable="yes">Bestand: [1], map: [9], grootte: [6]</String>
264 <String Id="ProgressTextFileCost" Overridable="yes">Vereiste ruimte berekenen</String>
265 <String Id="ProgressTextCostInitialize" Overridable="yes">Vereiste ruimte berekenen</String>
266 <String Id="ProgressTextCostFinalize" Overridable="yes">Vereiste ruimte berekenen</String>
267 <String Id="ProgressTextCreateShortcuts" Overridable="yes">Snelkoppelingen maken</String>
268 <String Id="ProgressTextCreateShortcutsTemplate" Overridable="yes">Snelkoppeling: [1]</String>
269 <String Id="ProgressTextPublishComponents" Overridable="yes">In aanmerking komende onderdelen publiceren</String>
270 <String Id="ProgressTextPublishComponentsTemplate" Overridable="yes">Onderdeel-id: [1], kwalificatie: [2]</String>
271 <String Id="ProgressTextPublishFeatures" Overridable="yes">Productonderdelen publiceren</String>
272 <String Id="ProgressTextPublishFeaturesTemplate" Overridable="yes">Onderdeel: [1]</String>
273 <String Id="ProgressTextPublishProduct" Overridable="yes">Productinformatie publiceren</String>
274 <String Id="ProgressTextRegisterClassInfo" Overridable="yes">Klassenservers registreren</String>
275 <String Id="ProgressTextRegisterClassInfoTemplate" Overridable="yes">Klasse-id: [1]</String>
276 <String Id="ProgressTextRegisterExtensionInfo" Overridable="yes">Uitbreidingsservers registreren</String>
277 <String Id="ProgressTextRegisterExtensionInfoTemplate" Overridable="yes">Extensie: [1]</String>
278 <String Id="ProgressTextRegisterMIMEInfo" Overridable="yes">MIME-gegevens registreren</String>
279 <String Id="ProgressTextRegisterMIMEInfoTemplate" Overridable="yes">MIME-inhoudtype: [1], extensie: [2]</String>
280 <String Id="ProgressTextRegisterProgIdInfo" Overridable="yes">Programma-id's registreren</String>
281 <String Id="ProgressTextRegisterProgIdInfoTemplate" Overridable="yes">Programma-id: [1]</String>
282 <String Id="ProgressTextAllocateRegistrySpace" Overridable="yes">Registerruimte toewijzen</String>
283 <String Id="ProgressTextAllocateRegistrySpaceTemplate" Overridable="yes">Vrije ruimte: [1]</String>
284 <String Id="ProgressTextAppSearch" Overridable="yes">Naar geïnstalleerde toepassingen zoeken</String>
285 <String Id="ProgressTextAppSearchTemplate" Overridable="yes">Eigenschap: [1], handtekening: [2]</String>
286 <String Id="ProgressTextBindImage" Overridable="yes">Binding van uitvoerbare bestanden</String>
287 <String Id="ProgressTextBindImageTemplate" Overridable="yes">Bestand: [1]</String>
288 <String Id="ProgressTextCCPSearch" Overridable="yes">Naar in aanmerking komende producten zoeken</String>
289 <String Id="ProgressTextCreateFolders" Overridable="yes">Mappen maken</String>
290 <String Id="ProgressTextCreateFoldersTemplate" Overridable="yes">Map: [1]</String>
291 <String Id="ProgressTextDeleteServices" Overridable="yes">Services verwijderen</String>
292 <String Id="ProgressTextDeleteServicesTemplate" Overridable="yes">Service: [1]</String>
293 <String Id="ProgressTextDuplicateFiles" Overridable="yes">Dubbele bestanden maken</String>
294 <String Id="ProgressTextDuplicateFilesTemplate" Overridable="yes">Bestand: [1], map: [9], grootte: [6]</String>
295 <String Id="ProgressTextFindRelatedProducts" Overridable="yes">Naar verwante toepassingen zoeken</String>
296 <String Id="ProgressTextFindRelatedProductsTemplate" Overridable="yes">Toepassing gevonden: [1]</String>
297 <String Id="ProgressTextInstallODBC" Overridable="yes">ODBC-onderdelen installeren</String>
298 <String Id="ProgressTextInstallServices" Overridable="yes">Nieuwe services installeren</String>
299 <String Id="ProgressTextInstallServicesTemplate" Overridable="yes">Service: [2]</String>
300 <String Id="ProgressTextLaunchConditions" Overridable="yes">Startvoorwaarden evalueren</String>
301 <String Id="ProgressTextMigrateFeatureStates" Overridable="yes">Onderdeelstatussen van verwante toepassingen worden gemigreerd</String>
302 <String Id="ProgressTextMigrateFeatureStatesTemplate" Overridable="yes">Toepassing: [1]</String>
303 <String Id="ProgressTextMoveFiles" Overridable="yes">Bestanden verplaatsen</String>
304 <String Id="ProgressTextMoveFilesTemplate" Overridable="yes">Bestand: [1], map: [9], grootte: [6]</String>
305 <String Id="ProgressTextPatchFiles" Overridable="yes">Bestanden bijwerken</String>
306 <String Id="ProgressTextPatchFilesTemplate" Overridable="yes">Bestand: [1], map: [2], grootte: [3]</String>
307 <String Id="ProgressTextProcessComponents" Overridable="yes">Registratie van onderdelen bijwerken</String>
308 <String Id="ProgressTextRegisterComPlus" Overridable="yes">COM+-toepassingen en -onderdelen registreren</String>
309 <String Id="ProgressTextRegisterComPlusTemplate" Overridable="yes">Toepassings-id: [1]{{, toepassingstype: [2], gebruikers: [3], RSN: [4]}}</String>
310 <String Id="ProgressTextRegisterFonts" Overridable="yes">Lettertypen registreren</String>
311 <String Id="ProgressTextRegisterFontsTemplate" Overridable="yes">Lettertype: [1]</String>
312 <String Id="ProgressTextRegisterProduct" Overridable="yes">Product registreren</String>
313 <String Id="ProgressTextRegisterProductTemplate" Overridable="yes">[1]</String>
314 <String Id="ProgressTextRegisterTypeLibraries" Overridable="yes">Typebibliotheken registreren</String>
315 <String Id="ProgressTextRegisterTypeLibrariesTemplate" Overridable="yes">Bibliotheek-id: [1]</String>
316 <String Id="ProgressTextRegisterUser" Overridable="yes">Gebruiker registreren</String>
317 <String Id="ProgressTextRegisterUserTemplate" Overridable="yes">[1]</String>
318 <String Id="ProgressTextRemoveDuplicateFiles" Overridable="yes">Dubbele bestanden verwijderen</String>
319 <String Id="ProgressTextRemoveDuplicateFilesTemplate" Overridable="yes">Bestand: [1], map: [9]</String>
320 <String Id="ProgressTextRemoveEnvironmentStrings" Overridable="yes">Omgevingstekenreeksen bijwerken</String>
321 <String Id="ProgressTextRemoveEnvironmentStringsTemplate" Overridable="yes">Naam: [1], waarde: [2], actie: [3]</String>
322 <String Id="ProgressTextRemoveExistingProducts" Overridable="yes">Toepassingen verwijderen</String>
323 <String Id="ProgressTextRemoveExistingProductsTemplate" Overridable="yes">Toepassing: [1], opdrachtregel: [2]</String>
324 <String Id="ProgressTextRemoveFiles" Overridable="yes">Bestanden verwijderen</String>
325 <String Id="ProgressTextRemoveFilesTemplate" Overridable="yes">Bestand: [1], map: [9]</String>
326 <String Id="ProgressTextRemoveFolders" Overridable="yes">Mappen verwijderen</String>
327 <String Id="ProgressTextRemoveFoldersTemplate" Overridable="yes">Map: [1]</String>
328 <String Id="ProgressTextRemoveIniValues" Overridable="yes">Vermeldingen in INI-bestanden verwijderen</String>
329 <String Id="ProgressTextRemoveIniValuesTemplate" Overridable="yes">Bestand: [1], sectie: [2], sleutel: [3], waarde: [4]</String>
330 <String Id="ProgressTextRemoveODBC" Overridable="yes">ODBC-onderdelen verwijderen</String>
331 <String Id="ProgressTextRemoveRegistryValues" Overridable="yes">Systeemregisterwaarden verwijderen</String>
332 <String Id="ProgressTextRemoveRegistryValuesTemplate" Overridable="yes">Sleutel: [1], naam: [2]</String>
333 <String Id="ProgressTextRemoveShortcuts" Overridable="yes">Snelkoppelingen verwijderen</String>
334 <String Id="ProgressTextRemoveShortcutsTemplate" Overridable="yes">Snelkoppeling: [1]</String>
335 <String Id="ProgressTextRMCCPSearch" Overridable="yes">Naar in aanmerking komende producten zoeken</String>
336 <String Id="ProgressTextSelfRegModules" Overridable="yes">Modules registreren</String>
337 <String Id="ProgressTextSelfRegModulesTemplate" Overridable="yes">Bestand: [1], map: [2]</String>
338 <String Id="ProgressTextSelfUnregModules" Overridable="yes">Registratie van modules ongedaan maken</String>
339 <String Id="ProgressTextSelfUnregModulesTemplate" Overridable="yes">Bestand: [1], map: [2]</String>
340 <String Id="ProgressTextSetODBCFolders" Overridable="yes">ODBC-mappen initialiseren</String>
341 <String Id="ProgressTextStartServices" Overridable="yes">Services worden gestart</String>
342 <String Id="ProgressTextStartServicesTemplate" Overridable="yes">Service: [1]</String>
343 <String Id="ProgressTextStopServices" Overridable="yes">Services worden gestopt</String>
344 <String Id="ProgressTextStopServicesTemplate" Overridable="yes">Service: [1]</String>
345 <String Id="ProgressTextUnpublishComponents" Overridable="yes">Publicatie van in aanmerking komende onderdelen ongedaan maken</String>
346 <String Id="ProgressTextUnpublishComponentsTemplate" Overridable="yes">Onderdeel-id: [1], kwalificatie: [2]</String>
347 <String Id="ProgressTextUnpublishFeatures" Overridable="yes">Publicatie van productonderdelen ongedaan maken</String>
348 <String Id="ProgressTextUnpublishFeaturesTemplate" Overridable="yes">Onderdeel: [1]</String>
349 <String Id="ProgressTextUnregisterClassInfo" Overridable="yes">Registratie van klassenservers ongedaan maken</String>
350 <String Id="ProgressTextUnregisterClassInfoTemplate" Overridable="yes">Klasse-id: [1]</String>
351 <String Id="ProgressTextUnregisterComPlus" Overridable="yes">Registratie van COM+-toepassingen en -onderdelen ongedaan maken</String>
352 <String Id="ProgressTextUnregisterComPlusTemplate" Overridable="yes">Toepassings-id: [1]{{, toepassingstype: [2]}}</String>
353 <String Id="ProgressTextUnregisterExtensionInfo" Overridable="yes">Registratie van uitbreidingsservers ongedaan maken</String>
354 <String Id="ProgressTextUnregisterExtensionInfoTemplate" Overridable="yes">Extensie: [1]</String>
355 <String Id="ProgressTextUnregisterFonts" Overridable="yes">Registratie van lettertypen ongedaan maken</String>
356 <String Id="ProgressTextUnregisterFontsTemplate" Overridable="yes">Lettertype: [1]</String>
357 <String Id="ProgressTextUnregisterMIMEInfo" Overridable="yes">Registratie van MIME-gegevens ongedaan maken</String>
358 <String Id="ProgressTextUnregisterMIMEInfoTemplate" Overridable="yes">MIME-inhoudtype: [1], extensie: [2]</String>
359 <String Id="ProgressTextUnregisterProgIdInfo" Overridable="yes">Registratie van programma-id's ongedaan maken</String>
360 <String Id="ProgressTextUnregisterProgIdInfoTemplate" Overridable="yes">Programma-id: [1]</String>
361 <String Id="ProgressTextUnregisterTypeLibraries" Overridable="yes">Registratie van typebibliotheken ongedaan maken</String>
362 <String Id="ProgressTextUnregisterTypeLibrariesTemplate" Overridable="yes">Bibliotheek-id: [1]</String>
363 <String Id="ProgressTextWriteEnvironmentStrings" Overridable="yes">Omgevingstekenreeksen bijwerken</String>
364 <String Id="ProgressTextWriteEnvironmentStringsTemplate" Overridable="yes">Naam: [1], waarde: [2], actie: [3]</String>
365 <String Id="ProgressTextWriteIniValues" Overridable="yes">INI-bestandswaarden schrijven</String>
366 <String Id="ProgressTextWriteIniValuesTemplate" Overridable="yes">Bestand: [1], sectie: [2], sleutel: [3], waarde: [4]</String>
367 <String Id="ProgressTextWriteRegistryValues" Overridable="yes">Systeemregisterwaarden schrijven</String>
368 <String Id="ProgressTextWriteRegistryValuesTemplate" Overridable="yes">Sleutel: [1], naam: [2], waarde: [3]</String>
369 <String Id="ProgressTextAdvertise" Overridable="yes">Toepassing adverteren</String>
370 <String Id="ProgressTextGenerateScript" Overridable="yes">Scriptbewerkingen genereren voor actie:</String>
371 <String Id="ProgressTextGenerateScriptTemplate" Overridable="yes">[1]</String>
372 <String Id="ProgressTextInstallSFPCatalogFile" Overridable="yes">Systeemcatalogus installeren</String>
373 <String Id="ProgressTextInstallSFPCatalogFileTemplate" Overridable="yes">Bestand: [1], afhankelijkheden: [2]</String>
374 <String Id="ProgressTextMsiPublishAssemblies" Overridable="yes">Assemblyinformatie publiceren</String>
375 <String Id="ProgressTextMsiPublishAssembliesTemplate" Overridable="yes">Toepassingscontext:[1], assemblynaam:[2]</String>
376 <String Id="ProgressTextMsiUnpublishAssemblies" Overridable="yes">Publicatie van assemblyinformatie ongedaan maken</String>
377 <String Id="ProgressTextMsiUnpublishAssembliesTemplate" Overridable="yes">Toepassingscontext:[1], assemblynaam:[2]</String>
378 <String Id="ProgressTextRollback" Overridable="yes">Terugdraaibewerking:</String>
379 <String Id="ProgressTextRollbackTemplate" Overridable="yes">[1]</String>
380 <String Id="ProgressTextRollbackCleanup" Overridable="yes">Back-upbestanden verwijderen</String>
381 <String Id="ProgressTextRollbackCleanupTemplate" Overridable="yes">Bestand: [1]</String>
382 <String Id="ProgressTextUnmoveFiles" Overridable="yes">Verplaatste bestanden verwijderen</String>
383 <String Id="ProgressTextUnmoveFilesTemplate" Overridable="yes">Bestand: [1], map: [9]</String>
384 <String Id="ProgressTextUnpublishProduct" Overridable="yes">Publicatie van productgegevens ongedaan maken</String>
385
386 <String Id="Error0" Overridable="yes">{{Onherstelbare fout: }}</String>
387 <String Id="Error1" Overridable="yes">{{Fout [1]. }}</String>
388 <String Id="Error2" Overridable="yes">Waarschuwing [1]. </String>
389 <String Id="Error4" Overridable="yes">Info [1]. </String>
390 <String Id="Error5" Overridable="yes">Er is een onverwachte fout opgetreden tijdens het installeren van dit pakket. Dit kan duiden op een probleem met het pakket. Foutcode [1]. {{Argumenten: [2], [3], [4]}}</String>
391 <String Id="Error7" Overridable="yes">{{Schijf vol: }}</String>
392 <String Id="Error8" Overridable="yes">Actie [Time]: [1]. [2]</String>
393 <String Id="Error9" Overridable="yes">[ProductName]</String>
394 <String Id="Error10" Overridable="yes">{[2]}{, [3]}{, [4]}</String>
395 <String Id="Error11" Overridable="yes">Berichttype: [1], argument: [2]</String>
396 <String Id="Error12" Overridable="yes">=== Logboekfunctie gestart: [Date], [Time] ===</String>
397 <String Id="Error13" Overridable="yes">=== Logboekfunctie beëindigd: [Date], [Time] ===</String>
398 <String Id="Error14" Overridable="yes">Actie gestart [Time]: [1].</String>
399 <String Id="Error15" Overridable="yes">Actie beëindigd [Time]: [1]. Retourwaarde [2].</String>
400 <String Id="Error16" Overridable="yes">Resterende tijd: {[1] minuten } en {[2] seconden}</String>
401 <String Id="Error17" Overridable="yes">Onvoldoende geheugen. Sluit de andere toepassingen af voordat u het opnieuw probeert.</String>
402 <String Id="Error18" Overridable="yes">Installatieprogramma reageert niet meer.</String>
403 <String Id="Error19" Overridable="yes">Installatieprogramma is voortijdig beëindigd.</String>
404 <String Id="Error20" Overridable="yes">[ProductName] wordt nu geconfigureerd. Een ogenblik geduld</String>
405 <String Id="Error21" Overridable="yes">Benodigde gegevens verzamelen...</String>
406 <String Id="Error22" Overridable="yes">Oudere versies van deze toepassing verwijderen...</String>
407 <String Id="Error23" Overridable="yes">Het verwijderen van oudere versies van deze toepassing voorbereiden...</String>
408 <String Id="Error32" Overridable="yes">De installatie van {[ProductName] } is voltooid.</String>
409 <String Id="Error33" Overridable="yes">De installatie van {[ProductName] } is mislukt.</String>
410 <String Id="Error1101" Overridable="yes">Fout bij het lezen van bestand: [2]. {{ Systeemfout [3].}} Controleer of het bestand bestaat en of u toegang tot het bestand hebt.</String>
411 <String Id="Error1301" Overridable="yes">Kan het bestand [2] niet maken. Er bestaat al een map met deze naam. Annuleer de installatie en probeer op een andere locatie te installeren.</String>
412 <String Id="Error1302" Overridable="yes">Plaats de schijf: [2]</String>
413 <String Id="Error1303" Overridable="yes">U hebt onvoldoende bevoegdheden voor deze map: [2]. De installatie kan niet worden voortgezet. Meld u als Administrator aan of neem contact op met de systeembeheerder.</String>
414 <String Id="Error1304" Overridable="yes">Fout bij het schrijven naar bestand: [2]. Controleer of u toegang tot de map hebt.</String>
415 <String Id="Error1305" Overridable="yes">Fout bij het lezen van het bestand: [2]. {{ Systeemfout [3].}} Controleer of het bestand bestaat en of u toegang tot het bestand hebt.</String>
416 <String Id="Error1306" Overridable="yes">Een andere toepassing heeft momenteel exclusief toegang tot het bestand [2]. Sluit alle andere toepassingen af en klik op Opnieuw.</String>
417 <String Id="Error1307" Overridable="yes">Er is onvoldoende schijfruimte voor de installatie van het bestand [2]. Maak schijfruimte vrij en klik op Opnieuw. Klik op Annuleren als u de installatie wilt beëindigen.</String>
418 <String Id="Error1308" Overridable="yes">Bronbestand niet gevonden: [2]. Controleer of het bestand bestaat en of u toegang tot het bestand hebt.</String>
419 <String Id="Error1309" Overridable="yes">Fout bij het lezen van bestand: [3]. {{ Systeemfout [2].}} Controleer of het bestand bestaat en of u toegang tot het bestand hebt.</String>
420 <String Id="Error1310" Overridable="yes">Fout bij het schrijven naar bestand: [3]. {{ Systeemfout [2].}} Controleer of u toegang tot de map hebt.</String>
421 <String Id="Error1311" Overridable="yes">Het bronbestand is niet gevonden {{(cabinet)}}: [2]. Controleer of het bestand bestaat en of u toegang tot het bestand hebt.</String>
422 <String Id="Error1312" Overridable="yes">Kan de map [2] niet maken. Er bestaat al een bestand met deze naam. Wijzig de naam of verwijder het bestand en klik op Opnieuw, of klik op Annuleren als u wilt stoppen.</String>
423 <String Id="Error1313" Overridable="yes">Het volume [2] is momenteel niet beschikbaar. Selecteer een ander volume.</String>
424 <String Id="Error1314" Overridable="yes">Het opgegeven pad [2] is niet beschikbaar.</String>
425 <String Id="Error1315" Overridable="yes">Kan niet naar de opgegeven map schrijven: [2].</String>
426 <String Id="Error1316" Overridable="yes">Er is een netwerkfout opgetreden bij het lezen van het bestand [2]</String>
427 <String Id="Error1317" Overridable="yes">Er is een fout opgetreden bij het maken van de map [2]</String>
428 <String Id="Error1318" Overridable="yes">Er is een netwerkfout opgetreden bij het maken van de map [2]</String>
429 <String Id="Error1319" Overridable="yes">Er is een netwerkfout opgetreden bij het openen van het CAB-bronbestand [2]</String>
430 <String Id="Error1320" Overridable="yes">Het opgegeven pad is te lang: [2]</String>
431 <String Id="Error1321" Overridable="yes">Het installatieprogramma heeft niet voldoende rechten om het bestand [2] te kunnen wijzigen.</String>
432 <String Id="Error1322" Overridable="yes">Een gedeelte van het mappad [2] is ongeldig. Het is leeg of langer dan de toegestane maximumlengte.</String>
433 <String Id="Error1323" Overridable="yes">In het pad [2] staan woorden die niet in paden zijn toegestaan.</String>
434 <String Id="Error1324" Overridable="yes">Het pad [2] bevat een ongeldig teken.</String>
435 <String Id="Error1325" Overridable="yes">[2] is een ongeldige korte bestandsnaam.</String>
436 <String Id="Error1326" Overridable="yes">Fout bij het opvragen van bestandsbeveiliging: [3] GetLastError: [2]</String>
437 <String Id="Error1327" Overridable="yes">Ongeldig station: [2]</String>
438 <String Id="Error1328" Overridable="yes">Fout tijdens het toepassen van een patch op bestand [2]. Het bestand is waarschijnlijk op een andere manier bijgewerkt en kan niet meer worden gewijzigd door deze patch. Neem voor meer informatie contact op met de leverancier van de patch. {{Systeemfout [3]}}</String>
439 <String Id="Error1329" Overridable="yes">Kan een benodigd bestand niet installeren omdat het CAB-bestand [2] niet digitaal is ondertekend. Dit kan duiden op een beschadigd CAB-bestand.</String>
440 <String Id="Error1330" Overridable="yes">Kan een benodigd bestand niet installeren omdat het CAB-bestand [2] een ongeldige digitale handtekening heeft. Dit kan duiden op een beschadigd CAB-bestand. {{ Fout [3] is geretourneerd door WinVerifyTrust.}}</String>
441 <String Id="Error1331" Overridable="yes">Kan het [2]-bestand niet kopiëren: CRC-fout.</String>
442 <String Id="Error1332" Overridable="yes">Kan het [2]-bestand niet verplaatsen: CRC-fout.</String>
443 <String Id="Error1333" Overridable="yes">Kan het [2]-bestand niet bijwerken met patch: CRC-fout.</String>
444 <String Id="Error1334" Overridable="yes">Kan het bestand [2] niet installeren omdat het bestand niet is gevonden in CAB-bestand [3]. Dit kan duiden op een netwerkfout, een fout tijdens het lezen vanaf de cd-rom of een probleem met het pakket.</String>
445 <String Id="Error1335" Overridable="yes">Het CAB-bestand [2] dat benodigd is voor deze installatie, is beschadigd en kan niet worden gebruikt. Dit kan duiden op een netwerkfout, een fout tijdens het lezen vanaf de cd-rom of een probleem met het pakket.</String>
446 <String Id="Error1336" Overridable="yes">Er is een fout opgetreden tijdens het maken van een tijdelijk bestand dat benodigd is om de installatie te voltooien.{{ Map: [3]. Systeemfoutcode: [2]}}</String>
447 <String Id="Error1401" Overridable="yes">Kan de sleutel [2] niet maken. {{ Systeemfout [3].}} Controleer of u voldoende toegangsrechten voor deze sleutel hebt of neem contact op met iemand van Ondersteuning. </String>
448 <String Id="Error1402" Overridable="yes">Kan de sleutel [2] niet openen. {{ Systeemfout [3].}} Controleer of u voldoende toegangsrechten voor deze sleutel hebt of neem contact op met iemand van Ondersteuning. </String>
449 <String Id="Error1403" Overridable="yes">Kan de waarde [2] niet uit de sleutel [3] verwijderen. {{ Systeemfout [4].}} Controleer of u voldoende toegangsrechten voor deze sleutel hebt of neem contact op met iemand van Ondersteuning. </String>
450 <String Id="Error1404" Overridable="yes">Kan de sleutel [2] niet verwijderen. {{ Systeemfout [3].}} Controleer of u voldoende toegangsrechten voor deze sleutel hebt of neem contact op met iemand van Ondersteuning. </String>
451 <String Id="Error1405" Overridable="yes">Kan de waarde [2] niet lezen in de sleutel [3]. {{ Systeemfout [4].}} Controleer of u voldoende toegangsrechten voor deze sleutel hebt of neem contact op met iemand van Ondersteuning. </String>
452 <String Id="Error1406" Overridable="yes">Kan de waarde [2] niet schrijven naar de sleutel [3]. {{ Systeemfout [4].}} Controleer of u voldoende toegangsrechten voor deze sleutel hebt of neem contact op met iemand van Ondersteuning.</String>
453 <String Id="Error1407" Overridable="yes">Kan geen waardenamen voor de sleutel [2] opvragen. {{ Systeemfout [3].}} Controleer of u voldoende toegangsrechten voor deze sleutel hebt of neem contact op met iemand van Ondersteuning.</String>
454 <String Id="Error1408" Overridable="yes">Kan geen subsleutelnamen voor de sleutel [2] opvragen. {{ Systeemfout [3].}} Controleer of u voldoende toegangsrechten voor deze sleutel hebt of neem contact op met iemand van Ondersteuning.</String>
455 <String Id="Error1409" Overridable="yes">Kan geen beveiligingsgegevens voor de sleutel [2] lezen. {{ Systeemfout [3].}} Controleer of u voldoende toegangsrechten voor deze sleutel hebt of neem contact op met iemand van Ondersteuning.</String>
456 <String Id="Error1410" Overridable="yes">Kan de beschikbare ruimte in het register niet vergroten. Voor de installatie van deze toepassing is [2] kB aan ruimte in het register nodig.</String>
457 <String Id="Error1500" Overridable="yes">Er wordt al een andere installatie uitgevoerd. Voordat u met de installatie kunt doorgaan, moet u de andere installatie eerst voltooien.</String>
458 <String Id="Error1501" Overridable="yes">Fout bij een poging toegang tot beveiligde gegevens te krijgen. Controleer of Windows Installer juist is geconfigureerd en probeer de installatie daarna opnieuw uit te voeren.</String>
459 <String Id="Error1502" Overridable="yes">Gebruiker [2] heeft eerder een installatie gestart voor product [3]. Deze gebruiker moet die installatie nogmaals uitvoeren voordat het product kan worden gebruikt. De huidige installatie wordt voortgezet.</String>
460 <String Id="Error1503" Overridable="yes">Gebruiker [2] heeft eerder een installatie gestart voor product [3]. Deze gebruiker moet die installatie nogmaals uitvoeren voordat het product kan worden gebruikt.</String>
461 <String Id="Error1601" Overridable="yes">Onvoldoende schijfruimte -- volume: [2]; benodigde schijfruimte: [3] kB; beschikbare schijfruimte: [4] kB. Maak schijfruimte vrij en probeer het opnieuw.</String>
462 <String Id="Error1602" Overridable="yes">Weet u zeker dat u de installatie wilt annuleren?</String>
463 <String Id="Error1603" Overridable="yes">Het bestand [2][3] wordt gebruikt{ door het volgende proces: naam: [4], id: [5], venstertitel: [6]}. Sluit die toepassing en probeer het opnieuw.</String>
464 <String Id="Error1604" Overridable="yes">Het product [2] is al geïnstalleerd. Hierdoor kan dit product niet worden geïnstalleerd. De twee producten zijn niet compatibel.</String>
465 <String Id="Error1605" Overridable="yes">Er is onvoldoende schijfruimte beschikbaar op volume [2] om door te gaan met de installatie met herstel ingeschakeld. [3] kB is benodigd, maar slechts [4] kB is beschikbaar. Klik op Negeren om door te gaan met de installatie zonder herstelinformatie op te slaan, klik op Opnieuw om de schijfruimte opnieuw te controleren, of klik op Annuleren om de installatie af te sluiten.</String>
466 <String Id="Error1606" Overridable="yes">Krijg geen toegang tot de netwerklocatie [2].</String>
467 <String Id="Error1607" Overridable="yes">U moet de volgende toepassingen sluiten voordat u kunt doorgaan met de installatie:</String>
468 <String Id="Error1608" Overridable="yes">Kan geen eerder geïnstalleerde in aanmerking komende producten op de computer vinden om dit product te installeren.</String>
469 <String Id="Error1609" Overridable="yes">Er is een fout opgetreden tijdens het toepassen van beveiligingsinstellingen. [2] is geen geldige gebruiker of groep. Dit kan duiden op een probleem met het pakket of op een probleem met de verbinding met een domeincontroller in het netwerk. Controleer de netwerkverbinding en klik op Opnieuw, of klik op Annuleren om de installatie te stoppen. {{Kan de SID van de gebruiker niet vinden, systeemfout [3]}}</String>
470 <String Id="Error1701" Overridable="yes">De sleutel [2] is ongeldig. Controleer of u de juiste sleutel hebt opgegeven.</String>
471 <String Id="Error1702" Overridable="yes">Het systeem moet opnieuw worden opgestart voordat de configuratie van [2] kan doorgaan. Klik op Ja als u de computer nu opnieuw wilt opstarten of op Nee als u de computer later handmatig opnieuw wilt opstarten.</String>
472 <String Id="Error1703" Overridable="yes">De wijzigingen in de configuratie van [2] worden pas van kracht als u de computer opnieuw opstart. Klik op Ja als u de computer nu opnieuw wilt opstarten of op Nee als u de computer later handmatig opnieuw wilt opstarten.</String>
473 <String Id="Error1704" Overridable="yes">De installatie van [2] is onderbroken. Als u wilt doorgaan, moet u de wijzigingen die door die installatie zijn aangebracht, ongedaan maken. Wilt u die wijzigingen ongedaan maken?</String>
474 <String Id="Error1705" Overridable="yes">Er wordt al een installatie van dit product uitgevoerd. Als u wilt doorgaan, moet u de wijzigingen die door die installatie zijn aangebracht, ongedaan maken. Wilt u die wijzigingen ongedaan maken?</String>
475 <String Id="Error1706" Overridable="yes">Kan geen installatiepakket vinden voor het product [2]. Probeer de installatie opnieuw uit te voeren met een geldig exemplaar van het installatiepakket [3].</String>
476 <String Id="Error1707" Overridable="yes">De installatie is voltooid.</String>
477 <String Id="Error1708" Overridable="yes">De installatie is mislukt.</String>
478 <String Id="Error1709" Overridable="yes">Product: [2] -- [3]</String>
479 <String Id="Error1710" Overridable="yes">U kunt de computer terugbrengen in de oorspronkelijke staat of later verdergaan met de installatie. Wilt u de configuratie herstellen?</String>
480 <String Id="Error1711" Overridable="yes">Er is een fout opgetreden bij het schrijven van installatiegegevens naar de harde schijf. Controleer of er voldoende schijfruimte beschikbaar is en klik op Opnieuw. Klik op Annuleren als u de installatie wilt beëindigen.</String>
481 <String Id="Error1712" Overridable="yes">Kan een of meer bestanden die nodig zijn om de computer in de oorspronkelijke staat terug te brengen, niet vinden. Herstel is niet mogelijk.</String>
482 <String Id="Error1713" Overridable="yes">Een van de benodigde producten kan niet worden geïnstalleerd door [2]. Neem contact op met de technische ondersteuning. {{Systeemfout: [3].}}</String>
483 <String Id="Error1714" Overridable="yes">De oudere versie van [2] kan niet worden verwijderd. Neem contact op met de technische ondersteuning. {{Systeemfout: [3].}}</String>
484 <String Id="Error1715" Overridable="yes">Geïnstalleerd [2]</String>
485 <String Id="Error1716" Overridable="yes">Geconfigureerd [2]</String>
486 <String Id="Error1717" Overridable="yes">Verwijderd [2]</String>
487 <String Id="Error1718" Overridable="yes">Bestand [2] is geweigerd vanwege een beleidsinstelling voor digitale handtekeningen.</String>
488 <String Id="Error1719" Overridable="yes">Geen toegang tot de Windows Installer-service. Dit kan gebeuren als Windows in veilige modus wordt uitgevoerd of als Windows Installer niet correct is geïnstalleerd. Neem contact op met iemand van Ondersteuning.</String>
489 <String Id="Error1720" Overridable="yes">Er is een probleem met dit Windows Installer-pakket. Een script dat nodig is voor het voltooien van deze installatie, kan niet worden uitgevoerd. Neem contact op met iemand van Ondersteuning of met de leverancier van het pakket. {{Aangepaste actie [2], scriptfout [3], [4]: [5], regel [6], kolom [7], [8] }}</String>
490 <String Id="Error1721" Overridable="yes">Er is een probleem met dit Windows Installer-pakket. Een programma dat nodig is voor het voltooien van deze installatie, kan niet worden uitgevoerd. Neem contact op met iemand van Ondersteuning of met de leverancier van het pakket. {{Actie: [2], locatie: [3], opdracht: [4] }}</String>
491 <String Id="Error1722" Overridable="yes">Er is een probleem met dit Windows Installer-pakket. Een programma dat wordt uitgevoerd tijdens de installatie is onverwachts beëindigd. Neem contact op met iemand van Ondersteuning of met de leverancier van het pakket. {{Actie [2], locatie: [3], opdracht: [4] }}</String>
492 <String Id="Error1723" Overridable="yes">Er is een probleem met dit Windows Installer-pakket. Een DLL-bestand dat nodig is voor het voltooien van deze installatie, kan niet worden uitgevoerd. Neem contact op met iemand van Ondersteuning of met de leverancier van het pakket. {{Actie: [2], vermelding: [3], bibliotheek: [4] }}</String>
493 <String Id="Error1724" Overridable="yes">Het verwijderen is voltooid.</String>
494 <String Id="Error1725" Overridable="yes">Het verwijderen is mislukt.</String>
495 <String Id="Error1726" Overridable="yes">Het adverteren is voltooid.</String>
496 <String Id="Error1727" Overridable="yes">Het adverteren is mislukt.</String>
497 <String Id="Error1728" Overridable="yes">Het configureren is voltooid.</String>
498 <String Id="Error1729" Overridable="yes">Het configureren is mislukt.</String>
499 <String Id="Error1730" Overridable="yes">U moet Administrator-rechten hebben om deze toepassing te kunnen verwijderen. Als u deze toepassing wilt verwijderen, kunt u zich aanmelden als Administrator of contact opnemen met de technische ondersteuning.</String>
500 <String Id="Error1731" Overridable="yes">Het broninstallatiepakket voor het product [2] is niet in overeenstemming met het clientpakket. Probeer de installatie opnieuw uit te voeren met een geldig exemplaar van het installatiepakket [3].</String>
501 <String Id="Error1732" Overridable="yes">U moet de computer opnieuw opstarten om de installatie van [2] te voltooien. Er zijn andere gebruikers aangemeld op deze computer. Opnieuw opstarten kan tot gevolg hebben dat deze gebruikers gegevens verliezen. Wilt u de computer nu opnieuw opstarten?</String>
502 <String Id="Error1801" Overridable="yes">Het pad [2] is ongeldig. Geef een geldig pad op.</String>
503 <String Id="Error1802" Overridable="yes">Onvoldoende geheugen. Sluit de andere toepassingen af voordat u het opnieuw probeert.</String>
504 <String Id="Error1803" Overridable="yes">Er bevindt zich geen schijf in station [2]. Plaats een schijf in het station en klik op Opnieuw. Klik op Annuleren als u naar het eerder geselecteerde volume wilt terugkeren.</String>
505 <String Id="Error1804" Overridable="yes">Er bevindt zich geen schijf in station [2]. Plaats een schijf in het station en klik op Opnieuw. Klik op Annuleren als u een ander volume wilt selecteren.</String>
506 <String Id="Error1805" Overridable="yes">De map [2] bestaat niet. Geef het pad naar een bestaande map op.</String>
507 <String Id="Error1806" Overridable="yes">U hebt onvoldoende rechten om deze map te kunnen lezen.</String>
508 <String Id="Error1807" Overridable="yes">Kan geen geldige doelmap voor de installatie bepalen.</String>
509 <String Id="Error1901" Overridable="yes">Fout bij het lezen van de broninstallatiedatabase: [2].</String>
510 <String Id="Error1902" Overridable="yes">Er wordt een opstartbewerking gepland: de naam van het bestand [2] wordt gewijzigd in [3]. De computer moet opnieuw worden opgestart om de bewerking te voltooien.</String>
511 <String Id="Error1903" Overridable="yes">Er wordt een opstartbewerking gepland: het bestand [2] wordt verwijderd. De computer moet opnieuw worden opgestart om de bewerking te voltooien.</String>
512 <String Id="Error1904" Overridable="yes">De registratie van de module [2] is mislukt. HRESULT [3]. Neem contact op met iemand van Ondersteuning.</String>
513 <String Id="Error1905" Overridable="yes">Het ongedaan maken van de registratie van de module [2] is mislukt. HRESULT [3]. Neem contact op met iemand van Ondersteuning.</String>
514 <String Id="Error1906" Overridable="yes">Kan het pakket [2] niet in de cache opslaan. Fout: [3]. Neem contact op met iemand van Ondersteuning.</String>
515 <String Id="Error1907" Overridable="yes">Kan het lettertype [2] niet registreren. Controleer of u voldoende machtigingen hebt voor het installeren van lettertypen en of dit lettertype door het systeem wordt ondersteund.</String>
516 <String Id="Error1908" Overridable="yes">Kan de registratie van het lettertype [2] niet ongedaan maken. Controleer of u voldoende rechten hebt om lettertypen te verwijderen.</String>
517 <String Id="Error1909" Overridable="yes">Kan de snelkoppeling [2] niet maken. Controleer of de doelmap bestaat en of u toegang tot deze map hebt.</String>
518 <String Id="Error1910" Overridable="yes">Kan de snelkoppeling [2] niet verwijderen. Controleer of het snelkoppelingsbestand bestaat en of u toegang tot dit bestand hebt.</String>
519 <String Id="Error1911" Overridable="yes">Kan de typebibliotheek voor het bestand [2] niet registreren. Neem contact op met iemand van Ondersteuning.</String>
520 <String Id="Error1912" Overridable="yes">Kan de registratie van de typebibliotheek voor het bestand [2] niet ongedaan maken. Neem contact op met iemand van Ondersteuning.</String>
521 <String Id="Error1913" Overridable="yes">Kan het INI-bestand [2][3] niet bijwerken. Controleer of het bestand bestaat en of u toegang tot het bestand hebt.</String>
522 <String Id="Error1914" Overridable="yes">Kan het vervangen van het bestand [3] door het bestand [2] tijdens het opstarten niet plannen. Controleer of u schrijfmachtigingen voor het bestand [3] hebt.</String>
523 <String Id="Error1915" Overridable="yes">Fout bij het verwijderen van het beheerprogramma voor ODBC-stuurprogramma's. ODBC-fout [2]: [3]. Neem contact op met iemand van Ondersteuning.</String>
524 <String Id="Error1916" Overridable="yes">Fout bij het installeren van het beheerprogramma voor ODBC-stuurprogramma's. ODBC-fout [2]: [3]. Neem contact op met iemand van Ondersteuning.</String>
525 <String Id="Error1917" Overridable="yes">Fout bij het verwijderen van het ODBC-stuurprogramma [4]. ODBC-fout [2]: [3]. Controleer of u voldoende rechten hebt om ODBC-stuurprogramma's te verwijderen.</String>
526 <String Id="Error1918" Overridable="yes">Fout bij het installeren van het ODBC-stuurprogramma [4]. ODBC-fout [2]: [3]. Controleer of het bestand [4] bestaat en of u toegang tot dit bestand hebt.</String>
527 <String Id="Error1919" Overridable="yes">Fout bij het configureren van de ODBC-gegevensbron [4]. ODBC-fout [2]: [3]. Controleer of het bestand [4] bestaat en of u toegang tot dit bestand hebt.</String>
528 <String Id="Error1920" Overridable="yes">Kan de service [2] ([3]) niet starten. Controleer of u voldoende bevoegdheden hebt om systeemservices te starten.</String>
529 <String Id="Error1921" Overridable="yes">Kan de service [2] ([3]) niet stoppen. Controleer of u voldoende bevoegdheden hebt om systeemservices te stoppen.</String>
530 <String Id="Error1922" Overridable="yes">Kan de service [2] ([3]) niet verwijderen. Controleer of u voldoende bevoegdheden hebt om systeemservices te verwijderen.</String>
531 <String Id="Error1923" Overridable="yes">Kan de service [2] ([3]) niet installeren. Controleer of u voldoende bevoegdheden hebt om systeemservices te installeren.</String>
532 <String Id="Error1924" Overridable="yes">Kan de omgevingsvariabele [2] niet bijwerken. Controleer of u voldoende bevoegdheden hebt om omgevingsvariabelen te wijzigen.</String>
533 <String Id="Error1925" Overridable="yes">U hebt onvoldoende bevoegdheden om deze installatie voor alle gebruikers van de computer uit te voeren. Meld u als Administrator aan en voer de installatie opnieuw uit.</String>
534 <String Id="Error1926" Overridable="yes">Kan geen bestandsbeveiliging instellen voor het bestand [3]. Fout: [2]. Controleer of u voldoende bevoegdheden hebt om de beveiligingsmachtigingen voor dit bestand te wijzigen.</String>
535 <String Id="Error1927" Overridable="yes">Component Services (COM+ 1.0) is niet op deze computer geïnstalleerd. Component Services is nodig om de installatie te kunnen voltooien. Component Services is beschikbaar in Windows 2000.</String>
536 <String Id="Error1928" Overridable="yes">Fout tijdens het registreren van de COM+-toepassing. Neem voor meer informatie contact op met iemand van Ondersteuning.</String>
537 <String Id="Error1929" Overridable="yes">Fout tijdens het ongedaan maken van de registratie van de COM+-toepassing. Neem voor meer informatie contact op met iemand van Ondersteuning.</String>
538 <String Id="Error1930" Overridable="yes">Kan de beschrijving voor de service [2] ([3]) niet wijzigen.</String>
539 <String Id="Error1931" Overridable="yes">Het systeembestand [2] kan niet worden bijgewerkt door de Windows Installer-service omdat het bestand door Windows is beveiligd. Mogelijk moet u het besturingssysteem bijwerken voordat dit programma juist werkt. {{Pakketversie: [3], door besturingssysteem beveiligde versie: [4]}}</String>
540 <String Id="Error1932" Overridable="yes">Het beveiligde Windows-bestand [2] kan niet worden bijgewerkt door de Windows Installer-service. {{Pakketversie: [3], door besturingssysteem beveiligde versie: [4], SFP-fout: [5]}}</String>
541 <String Id="Error1933" Overridable="yes">Een of meer beveiligde Windows-bestanden kunnen niet worden bijgewerkt door de Windows Installer-service. {{SFP-fout: [2]. Lijst met beveiligde bestanden:\r\n[3]}}</String>
542 <String Id="Error1934" Overridable="yes">Gebruikers kunnen vanwege het ingestelde beleid geen toepassingen op deze computer installeren.</String>
543 <String Id="Error1935" Overridable="yes">Er is een fout opgetreden tijdens het installeren van de assembly [6]. Raadpleeg Help en ondersteuning voor meer informatie. HRESULT: [3]. {{Assemblyinterface: [4], functie: [5], onderdeel: [2]}}</String>
544 <String Id="Error1936" Overridable="yes">Er is een fout opgetreden tijdens het installeren van de assembly [6]. De assembly heeft geen sterke naam of is niet ondertekend met de minimale sleutellengte. HRESULT: [3]. {{Assemblyinterface: [4], functie: [5], onderdeel: [2]}}</String>
545 <String Id="Error1937" Overridable="yes">Er is een fout opgetreden tijdens het installeren van de assembly [6]. De handtekening of catalogus kan niet worden geverifieerd of is ongeldig. HRESULT: [3]. {{Assemblyinterface: [4], functie: [5], onderdeel: [2]}}</String>
546 <String Id="Error1938" Overridable="yes">Er is een fout opgetreden tijdens het installeren van de assembly [6]. Een of meer modules van de assembly zijn niet gevonden. HRESULT: [3]. {{Assemblyinterface: [4], functie: [5], onderdeel: [2]}}</String>
547
548 <String Id="UITextbytes" Overridable="yes">Bytes</String>
549 <String Id="UITextGB" Overridable="yes">GB</String>
550 <String Id="UITextKB" Overridable="yes">kB</String>
551 <String Id="UITextMB" Overridable="yes">MB</String>
552 <String Id="UITextMenuAbsent" Overridable="yes">Het volledige onderdeel is niet beschikbaar</String>
553 <String Id="UITextMenuAdvertise" Overridable="yes">Het onderdeel wordt indien nodig geïnstalleerd</String>
554 <String Id="UITextMenuAllCD" Overridable="yes">Het volledige onderdeel wordt geïnstalleerd voor uitvoering vanaf cd</String>
555 <String Id="UITextMenuAllLocal" Overridable="yes">Het volledige onderdeel wordt op de lokale harde schijf geïnstalleerd</String>
556 <String Id="UITextMenuAllNetwork" Overridable="yes">Het volledige onderdeel wordt geïnstalleerd voor uitvoering vanaf het netwerk</String>
557 <String Id="UITextMenuCD" Overridable="yes">Wordt geïnstalleerd voor uitvoering vanaf cd</String>
558 <String Id="UITextMenuLocal" Overridable="yes">Wordt op de lokale harde schijf geïnstalleerd</String>
559 <String Id="UITextMenuNetwork" Overridable="yes">Wordt geïnstalleerd voor uitvoering vanaf het netwerk</String>
560 <String Id="UITextNewFolder" Overridable="yes">Map|Nieuwe map</String>
561 <String Id="UITextScriptInProgress" Overridable="yes">Benodigde gegevens verzamelen...</String>
562 <String Id="UITextSelAbsentAbsent" Overridable="yes">Dit onderdeel wordt niet geïnstalleerd</String>
563 <String Id="UITextSelAbsentAdvertise" Overridable="yes">Dit onderdeel wordt indien nodig geïnstalleerd</String>
564 <String Id="UITextSelAbsentCD" Overridable="yes">Dit onderdeel wordt geïnstalleerd voor uitvoering vanaf cd</String>
565 <String Id="UITextSelAbsentLocal" Overridable="yes">Dit onderdeel wordt op de lokale harde schijf geïnstalleerd</String>
566 <String Id="UITextSelAbsentNetwork" Overridable="yes">Dit onderdeel wordt geïnstalleerd voor uitvoering vanaf het netwerk</String>
567 <String Id="UITextSelAdvertiseAbsent" Overridable="yes">Dit onderdeel zal niet meer beschikbaar zijn</String>
568 <String Id="UITextSelAdvertiseAdvertise" Overridable="yes">Wordt indien nodig geïnstalleerd</String>
569 <String Id="UITextSelAdvertiseCD" Overridable="yes">Dit onderdeel kan vanaf cd worden uitgevoerd</String>
570 <String Id="UITextSelAdvertiseLocal" Overridable="yes">Dit onderdeel wordt op de lokale harde schijf geïnstalleerd</String>
571 <String Id="UITextSelAdvertiseNetwork" Overridable="yes">Dit onderdeel kan vanaf het netwerk worden uitgevoerd</String>
572 <String Id="UITextSelCDAbsent" Overridable="yes">De installatie van dit onderdeel wordt volledig ongedaan gemaakt. U kunt het onderdeel niet meer vanaf cd uitvoeren</String>
573 <String Id="UITextSelCDAdvertise" Overridable="yes">De status van dit onderdeel wordt gewijzigd van uitvoeren vanaf cd naar installeren indien nodig</String>
574 <String Id="UITextSelCDCD" Overridable="yes">Dit onderdeel blijft beschikbaar voor uitvoering vanaf cd</String>
575 <String Id="UITextSelCDLocal" Overridable="yes">De status van dit onderdeel wordt gewijzigd van uitvoerbaar vanaf cd naar geïnstalleerd op de lokale harde schijf</String>
576 <String Id="UITextSelChildCostNeg" Overridable="yes">Dit onderdeel maakt [1] vrij op de harde schijf.</String>
577 <String Id="UITextSelChildCostPos" Overridable="yes">Voor dit onderdeel is [1] op de harde schijf nodig.</String>
578 <String Id="UITextSelCostPending" Overridable="yes">Vereiste schijfruimte voor dit onderdeel berekenen...</String>
579 <String Id="UITextSelLocalAbsent" Overridable="yes">Dit onderdeel wordt volledig verwijderd</String>
580 <String Id="UITextSelLocalAdvertise" Overridable="yes">Dit onderdeel wordt van de lokale harde schijf verwijderd, maar kan indien nodig nog wel worden geïnstalleerd</String>
581 <String Id="UITextSelLocalCD" Overridable="yes">Dit onderdeel wordt van de lokale harde schijf verwijderd, maar kan nog wel vanaf cd worden uitgevoerd</String>
582 <String Id="UITextSelLocalLocal" Overridable="yes">Dit onderdeel blijft beschikbaar op de lokale harde schijf</String>
583 <String Id="UITextSelLocalNetwork" Overridable="yes">Dit onderdeel wordt van de lokale harde schijf verwijderd, maar kan nog wel vanaf het netwerk worden uitgevoerd</String>
584 <String Id="UITextSelNetworkAbsent" Overridable="yes">De installatie van dit onderdeel wordt volledig ongedaan gemaakt. U kunt het onderdeel niet meer vanaf het netwerk uitvoeren</String>
585 <String Id="UITextSelNetworkAdvertise" Overridable="yes">De status van dit onderdeel wordt gewijzigd van uitvoeren vanaf het netwerk naar installeren indien nodig</String>
586 <String Id="UITextSelNetworkLocal" Overridable="yes">De status van dit onderdeel wordt gewijzigd van uitvoerbaar vanaf het netwerk naar geïnstalleerd op de lokale harde schijf</String>
587 <String Id="UITextSelNetworkNetwork" Overridable="yes">Dit onderdeel blijft beschikbaar voor uitvoering vanaf het netwerk</String>
588 <String Id="UITextSelParentCostNegNeg" Overridable="yes">Dit onderdeel maakt [1] vrij op de harde schijf. Er is/zijn [2] van de [3] subonderdelen geselecteerd. De subonderdelen maken [4] vrij op de harde schijf.</String>
589 <String Id="UITextSelParentCostNegPos" Overridable="yes">Dit onderdeel maakt [1] vrij op de harde schijf. Er is/zijn [2] van de [3] subonderdelen geselecteerd. Voor de subonderdelen is [4] op de harde schijf nodig.</String>
590 <String Id="UITextSelParentCostPosNeg" Overridable="yes">Voor dit onderdeel is [1] op de harde schijf nodig. Er is/zijn [2] van de [3] subonderdelen geselecteerd. De subonderdelen maken [4] vrij op de harde schijf.</String>
591 <String Id="UITextSelParentCostPosPos" Overridable="yes">Voor dit onderdeel is [1] op de harde schijf nodig. Er is/zijn [2] van de [3] subonderdelen geselecteerd. Voor de subonderdelen is [4] op de harde schijf nodig.</String>
592 <String Id="UITextTimeRemaining" Overridable="yes">Resterende tijd: {[1] minuten } en {[2] seconden}</String>
593 <String Id="UITextVolumeCostAvailable" Overridable="yes">Beschikbaar</String>
594 <String Id="UITextVolumeCostDifference" Overridable="yes">Verschil</String>
595 <String Id="UITextVolumeCostRequired" Overridable="yes">Vereist</String>
596 <String Id="UITextVolumeCostSize" Overridable="yes">Schijfgrootte</String>
597 <String Id="UITextVolumeCostVolume" Overridable="yes">Volume</String>
598</WixLocalization>
diff --git a/src/ext/UI/wixlib/WixUI_pl-pl.wxl b/src/ext/UI/wixlib/WixUI_pl-pl.wxl
new file mode 100644
index 00000000..b8a2a902
--- /dev/null
+++ b/src/ext/UI/wixlib/WixUI_pl-pl.wxl
@@ -0,0 +1,598 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3
4
5<WixLocalization Culture="pl-pl" Codepage="1250" xmlns="http://wixtoolset.org/schemas/v4/wxl">
6 <String Id="WixUIBack" Overridable="yes">&amp;Wstecz</String>
7 <String Id="WixUINext" Overridable="yes">&amp;Dalej</String>
8 <String Id="WixUICancel" Overridable="yes">Anuluj</String>
9 <String Id="WixUIFinish" Overridable="yes">&amp;Zakończ</String>
10 <String Id="WixUIRetry" Overridable="yes">&amp;Ponów próbę</String>
11 <String Id="WixUIIgnore" Overridable="yes">&amp;Ignoruj</String>
12 <String Id="WixUIYes" Overridable="yes">&amp;Tak</String>
13 <String Id="WixUINo" Overridable="yes">&amp;Nie</String>
14 <String Id="WixUIOK" Overridable="yes">OK</String>
15 <String Id="WixUIPrint" Overridable="yes">D&amp;rukuj</String>
16
17 <String Id="AdvancedWelcomeEulaDlg_Title" Overridable="yes">Instalator produktu [ProductName]</String>
18 <String Id="AdvancedWelcomeEulaDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
19 <String Id="AdvancedWelcomeEulaDlgTitle" Overridable="yes">{\WixUI_Font_Title}Przeczytaj Umowę licencyjną produktu [ProductName]</String>
20 <String Id="AdvancedWelcomeEulaDlgLicenseAcceptedCheckBox" Overridable="yes">&amp;Akceptuję warunki Umowy licencyjnej</String>
21 <String Id="AdvancedWelcomeEulaDlgDescriptionPerMachine" Overridable="yes">Kliknij przycisk Zainstaluj, aby zainstalować produkt z opcjami domyślnymi dla wszystkich użytkowników. Kliknij przycisk Zaawansowane, aby zmienić opcje instalacji.</String>
22 <String Id="AdvancedWelcomeEulaDlgDescriptionPerUser" Overridable="yes">Kliknij przycisk Zainstaluj, aby zainstalować produkt z opcjami domyślnymi tylko dla siebie. Kliknij przycisk Zaawansowane, aby zmienić opcje instalacji.</String>
23 <String Id="AdvancedWelcomeEulaDlgInstall" Overridable="yes">&amp;Zainstaluj</String>
24 <String Id="AdvancedWelcomeEulaDlgAdvanced" Overridable="yes">Z&amp;aawansowane</String>
25 <String Id="Advanced_Font_Normal_Size" Overridable="yes">8</String>
26 <String Id="Advanced_Font_Bigger_Size" Overridable="yes">12</String>
27 <String Id="Advanced_Font_Title_Size" Overridable="yes">9</String>
28 <String Id="Advanced_Font_Emphasized_Size" Overridable="yes">8</String>
29 <String Id="Advanced_Font_FaceName" Overridable="yes">Tahoma</String>
30
31 <String Id="BrowseDlg_Title" Overridable="yes">Instalator produktu [ProductName]</String>
32 <String Id="BrowseDlgComboLabel" Overridable="yes">&amp;Szukaj w:</String>
33 <String Id="BrowseDlgWixUI_Bmp_Up" Overridable="yes">WixUI_Bmp_Up</String>
34 <String Id="BrowseDlgWixUI_Bmp_UpTooltip" Overridable="yes">Do góry o jeden poziom</String>
35 <String Id="BrowseDlgNewFolder" Overridable="yes">WixUI_Bmp_New</String>
36 <String Id="BrowseDlgNewFolderTooltip" Overridable="yes">Utwórz nowy folder</String>
37 <String Id="BrowseDlgPathLabel" Overridable="yes">Nazwa &amp;folderu:</String>
38 <String Id="BrowseDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
39 <String Id="BrowseDlgDescription" Overridable="yes">Przejdź do folderu docelowego</String>
40 <String Id="BrowseDlgTitle" Overridable="yes">{\WixUI_Font_Title}Zmień folder docelowy</String>
41
42 <String Id="CancelDlg_Title" Overridable="yes">Instalator produktu [ProductName]</String>
43 <String Id="CancelDlgText" Overridable="yes">Czy na pewno chcesz anulować instalację produktu [ProductName]?</String>
44 <String Id="CancelDlgIcon" Overridable="yes">WixUI_Ico_Info</String>
45 <String Id="CancelDlgIconTooltip" Overridable="yes">Ikona informacji</String>
46
47 <String Id="CustomizeDlg_Title" Overridable="yes">Instalator produktu [ProductName]</String>
48 <String Id="CustomizeDlgTree" Overridable="yes">Drzewo wyborów</String>
49 <String Id="CustomizeDlgBrowse" Overridable="yes">&amp;Przeglądaj...</String>
50 <String Id="CustomizeDlgReset" Overridable="yes">Re&amp;setuj</String>
51 <String Id="CustomizeDlgDiskCost" Overridable="yes">Użycie dysk&amp;u</String>
52 <String Id="CustomizeDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
53 <String Id="CustomizeDlgText" Overridable="yes">Kliknij ikony w poniższym drzewie, aby zmienić sposób instalowania funkcji.</String>
54 <String Id="CustomizeDlgDescription" Overridable="yes">Wybierz żądany sposób instalowania funkcji.</String>
55 <String Id="CustomizeDlgTitle" Overridable="yes">{\WixUI_Font_Title}Instalacja niestandardowa</String>
56 <String Id="CustomizeDlgItemDescription" Overridable="yes">CustomizeDlgItemDescription-CustomizeDlgItemDescription</String>
57 <String Id="CustomizeDlgItemSize" Overridable="yes">CustomizeDlgItemSize-CustomizeDlgItemSize</String>
58 <String Id="CustomizeDlgLocation" Overridable="yes">CustomizeDlgLocation-CustomizeDlgLocation</String>
59 <String Id="CustomizeDlgLocationLabel" Overridable="yes">Lokalizacja:</String>
60
61 <String Id="DiskCostDlg_Title" Overridable="yes">Instalator produktu [ProductName]</String>
62 <String Id="DiskCostDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
63 <String Id="DiskCostDlgText" Overridable="yes">Wyróżnione woluminy nie mają wystarczająco dużo dostępnego miejsca na dysku na wybrane funkcje. Możesz usunąć niektóre pliki z wyróżnionych woluminów, zainstalować mniej funkcji lub wybrać inne dyski docelowe.</String>
64 <String Id="DiskCostDlgDescription" Overridable="yes">Miejsce na dysku wymagane do zainstalowania wybranych funkcji.</String>
65 <String Id="DiskCostDlgTitle" Overridable="yes">{\WixUI_Font_Title}Wymagane miejsce na dysku</String>
66 <String Id="DiskCostDlgVolumeList" Overridable="yes">{120}{70}{70}{70}{70}</String>
67
68 <String Id="ErrorDlg_Title" Overridable="yes">Instalator produktu [ProductName]</String>
69 <String Id="ErrorDlgErrorText" Overridable="yes">Tekst informacyjny</String>
70 <String Id="ErrorDlgErrorIcon" Overridable="yes">WixUI_Ico_Info</String>
71 <String Id="ErrorDlgErrorIconTooltip" Overridable="yes">Ikona informacji</String>
72
73 <String Id="ExitDialog_Title" Overridable="yes">Instalator produktu [ProductName]</String>
74 <String Id="ExitDialogBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
75 <String Id="ExitDialogDescription" Overridable="yes">Kliknij przycisk Zakończ, aby zakończyć pracę Kreatora instalacji.</String>
76 <String Id="ExitDialogTitle" Overridable="yes">{\WixUI_Font_Bigger}Kreator instalacji produktu [ProductName] ukończył pracę</String>
77
78 <String Id="FatalError_Title" Overridable="yes">Instalator produktu [ProductName]</String>
79 <String Id="FatalErrorBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
80 <String Id="FatalErrorTitle" Overridable="yes">{\WixUI_Font_Bigger}Kreator instalacji produktu [ProductName] przedwcześnie zakończył pracę</String>
81 <String Id="FatalErrorDescription1" Overridable="yes">Kreator instalacji produktu [ProductName] przedwcześnie zakończył pracę z powodu błędu. System nie został zmodyfikowany. Aby zainstalować ten program później, ponownie uruchom Kreatora instalacji.</String>
82 <String Id="FatalErrorDescription2" Overridable="yes">Kliknij przycisk Zakończ, aby zakończyć pracę Kreatora instalacji.</String>
83
84 <String Id="FeaturesDlg_Title" Overridable="yes">Instalator produktu [ProductName]</String>
85 <String Id="FeaturesDlgTree" Overridable="yes">Funkcje produktu</String>
86 <String Id="FeaturesDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
87 <String Id="FeaturesDlgDescription" Overridable="yes">Wybierz żądany sposób instalowania funkcji.</String>
88 <String Id="FeaturesDlgTitle" Overridable="yes">{\WixUI_Font_Title}Funkcje produktu</String>
89 <String Id="FeaturesDlgItemDescription" Overridable="yes">FeaturesDlgItemDescription</String>
90 <String Id="FeaturesDlgItemSize" Overridable="yes">FeaturesDlgItemSize</String>
91 <String Id="FeaturesDlgInstall" Overridable="yes">&amp;Zainstaluj</String>
92 <String Id="FeaturesDlgChange" Overridable="yes">Z&amp;mień</String>
93
94 <String Id="FilesInUse_Title" Overridable="yes">Instalator produktu [ProductName]</String>
95 <String Id="FilesInUseExit" Overridable="yes">&amp;Zakończ</String>
96 <String Id="FilesInUseBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
97 <String Id="FilesInUseText" Overridable="yes">Poniższe aplikacje korzystają z plików, które wymagają zaktualizowania za pomocą tego instalatora. Zamknij te aplikacje, a następnie kliknij przycisk &amp;Ponów próbę, aby kontynuować instalację, lub kliknij przycisk Zakończ, aby ją zakończyć.</String>
98 <String Id="FilesInUseDescription" Overridable="yes">Niektóre pliki wymagające aktualizacji są obecnie używane.</String>
99 <String Id="FilesInUseTitle" Overridable="yes">{\WixUI_Font_Title}Pliki w użyciu</String>
100
101 <String Id="InstallDirDlg_Title" Overridable="yes">Instalator produktu [ProductName]</String>
102 <String Id="InstallDirDlgChange" Overridable="yes">Z&amp;mień...</String>
103 <String Id="InstallDirDlgTitle" Overridable="yes">{\WixUI_Font_Title}Folder docelowy</String>
104 <String Id="InstallDirDlgDescription" Overridable="yes">Kliknij przycisk Dalej, aby zainstalować w folderze domyślnym, lub kliknij przycisk Zmień, aby wybrać inny folder.</String>
105 <String Id="InstallDirDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
106 <String Id="InstallDirDlgFolderLabel" Overridable="yes">Zainstaluj produkt [ProductName] w folderze:</String>
107
108 <String Id="InstallScopeDlg_Title" Overridable="yes">Instalator produktu [ProductName]</String>
109 <String Id="InstallScopeDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
110 <String Id="InstallScopeDlgDescription" Overridable="yes">Wybierz zakres i folder instalacji</String>
111 <String Id="InstallScopeDlgTitle" Overridable="yes">{\WixUI_Font_Title}Zakres instalacji</String>
112 <String Id="InstallScopeDlgPerUser" Overridable="yes">{\WixUI_Font_Emphasized}Zainstaluj tylko dla &amp;siebie ([LogonUser])</String>
113 <String Id="InstallScopeDlgPerUserDescription" Overridable="yes">Produkt [ProductName] zostanie zainstalowany w folderze przypisanym do użytkownika i będzie dostępny tylko na Twoim koncie użytkownika. Nie potrzebujesz uprawnień administratora lokalnego.</String>
114 <String Id="InstallScopeDlgNoPerUserDescription" Overridable="yes">Produkt [ProductName] nie obsługuje instalacji przypisanej do użytkownika.</String>
115 <String Id="InstallScopeDlgPerMachine" Overridable="yes">{\WixUI_Font_Emphasized}Zainstaluj dla wszystkich użytkowników tego &amp;komputera</String>
116 <String Id="InstallScopeDlgPerMachineDescription" Overridable="yes">Produkt [ProductName] zostanie domyślnie zainstalowany w folderze przypisanym do komputera i będzie dostępny dla wszystkich użytkowników. Domyślny folder instalacji możesz zmienić. Musisz mieć uprawnienia administratora lokalnego.</String>
117 <String Id="InstallScopeDlgFolderLabel" Overridable="yes">&amp;Folder instalacji:</String>
118 <String Id="InstallScopeDlgChange" Overridable="yes">Z&amp;mień...</String>
119
120 <String Id="InvalidDirDlg_Title" Overridable="yes">Instalator produktu [ProductName]</String>
121 <String Id="InvalidDirDlgText" Overridable="yes">Katalog instalacji musi się znajdować na lokalnym dysku twardym.</String>
122 <String Id="InvalidDirDlgIcon" Overridable="yes">WixUI_Ico_Info</String>
123 <String Id="InvalidDirDlgIconTooltip" Overridable="yes">Ikona informacji</String>
124
125 <String Id="LicenseAgreementDlg_Title" Overridable="yes">Instalator produktu [ProductName]</String>
126 <String Id="LicenseAgreementDlgLicenseAcceptedCheckBox" Overridable="yes">&amp;Akceptuję warunki Umowy licencyjnej</String>
127 <String Id="LicenseAgreementDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
128 <String Id="LicenseAgreementDlgDescription" Overridable="yes">Przeczytaj uważnie poniższą umowę licencyjną</String>
129 <String Id="LicenseAgreementDlgTitle" Overridable="yes">{\WixUI_Font_Title}Umowa licencyjna użytkownika oprogramowania</String>
130
131 <String Id="MaintenanceTypeDlg_Title" Overridable="yes">Instalator produktu [ProductName]</String>
132 <String Id="MaintenanceTypeDlgChangeButton" Overridable="yes">Z&amp;mień</String>
133 <String Id="MaintenanceTypeDlgChangeButtonTooltip" Overridable="yes">Zmień instalację</String>
134 <String Id="MaintenanceTypeDlgRepairButton" Overridable="yes">&amp;Napraw</String>
135 <String Id="MaintenanceTypeDlgRepairButtonTooltip" Overridable="yes">Napraw instalację</String>
136 <String Id="MaintenanceTypeDlgRemoveButton" Overridable="yes">&amp;Usuń</String>
137 <String Id="MaintenanceTypeDlgRemoveButtonTooltip" Overridable="yes">Usuń instalację</String>
138 <String Id="MaintenanceTypeDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
139 <String Id="MaintenanceTypeDlgDescription" Overridable="yes">Wybierz operację, którą chcesz wykonać.</String>
140 <String Id="MaintenanceTypeDlgTitle" Overridable="yes">{\WixUI_Font_Title}Zmienianie, naprawa lub usuwanie instalacji</String>
141 <String Id="MaintenanceTypeDlgChangeText" Overridable="yes">Pozwala zmienić sposób, w jaki są zainstalowane funkcje.</String>
142 <String Id="MaintenanceTypeDlgChangeDisabledText" Overridable="yes">Produkt [ProductName] nie ma niezależnie wybieranych funkcji.</String>
143 <String Id="MaintenanceTypeDlgRemoveText" Overridable="yes">Usuwa produkt [ProductName] z tego komputera.</String>
144 <String Id="MaintenanceTypeDlgRemoveDisabledText" Overridable="yes">Nie można usunąć produktu [ProductName].</String>
145 <String Id="MaintenanceTypeDlgRepairText" Overridable="yes">Naprawia błędy w najnowszej instalacji, rozwiązując problemy z brakującymi i uszkodzonymi plikami, skrótami i wpisami rejestru.</String>
146 <String Id="MaintenanceTypeDlgRepairDisabledText" Overridable="yes">Nie można naprawić produktu [ProductName].</String>
147
148 <String Id="MaintenanceWelcomeDlg_Title" Overridable="yes">Instalator produktu [ProductName]</String>
149 <String Id="MaintenanceWelcomeDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
150 <String Id="MaintenanceWelcomeDlgDescription" Overridable="yes">Kreator instalacji pozwala zmienić sposób, w jaki funkcje produktu [ProductName] są zainstalowane na komputerze, lub usunąć go z komputera. Kliknij przycisk Dalej, aby kontynuować, lub Anuluj, aby zakończyć pracę Kreatora instalacji.</String>
151 <String Id="MaintenanceWelcomeDlgTitle" Overridable="yes">{\WixUI_Font_Bigger}Kreator instalacji produktu [ProductName] — Zapraszamy!</String>
152
153 <String Id="MsiRMFilesInUse_Title" Overridable="yes">Instalator produktu [ProductName]</String>
154 <String Id="MsiRMFilesInUseBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
155 <String Id="MsiRMFilesInUseText" Overridable="yes">Poniższe aplikacje korzystają z plików, które wymagają zaktualizowania za pomocą tego instalatora. Możesz zezwolić, aby Kreator instalacji zakończył ich działanie, a następnie spróbował uruchomić je ponownie lub uruchomił ponownie komputer.</String>
156 <String Id="MsiRMFilesInUseDescription" Overridable="yes">Niektóre pliki wymagające aktualizacji są obecnie używane.</String>
157 <String Id="MsiRMFilesInUseTitle" Overridable="yes">{\WixUI_Font_Title}Pliki w użyciu</String>
158 <String Id="MsiRMFilesInUseUseRM" Overridable="yes">&amp;Zamknij aplikacje i spróbuj uruchomić je ponownie.</String>
159 <String Id="MsiRMFilesInUseDontUseRM" Overridable="yes">&amp;Nie zamykaj aplikacji (będzie wymagany ponowny rozruch komputera).</String>
160
161 <String Id="OutOfDiskDlg_Title" Overridable="yes">Instalator produktu [ProductName]</String>
162 <String Id="OutOfDiskDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
163 <String Id="OutOfDiskDlgText" Overridable="yes">W wyróżnionych woluminach jest za mało miejsca na dysku dla obecnie wybranych funkcji. Możesz usunąć niektóre pliki z wyróżnionych woluminów, zainstalować mniej funkcji lub wybrać inny dysk docelowy.</String>
164 <String Id="OutOfDiskDlgDescription" Overridable="yes">Ilość miejsca na dysku wymagana do instalacji przekracza ilość dostępnego miejsca na dysku.</String>
165 <String Id="OutOfDiskDlgTitle" Overridable="yes">{\WixUI_Font_Title}Za mało miejsca na dysku</String>
166 <String Id="OutOfDiskDlgVolumeList" Overridable="yes">{120}{70}{70}{70}{70}</String>
167
168 <String Id="OutOfRbDiskDlg_Title" Overridable="yes">Instalator produktu [ProductName]</String>
169 <String Id="OutOfRbDiskDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
170 <String Id="OutOfRbDiskDlgText" Overridable="yes">W wyróżnionych woluminach jest za mało miejsca na dysku dla obecnie wybranych funkcji. Możesz usunąć niektóre pliki z wyróżnionych woluminów, zainstalować mniej funkcji lub wybrać inny dysk docelowy.</String>
171 <String Id="OutOfRbDiskDlgDescription" Overridable="yes">Ilość miejsca na dysku wymagana do instalacji przekracza ilość dostępnego miejsca na dysku.</String>
172 <String Id="OutOfRbDiskDlgTitle" Overridable="yes">{\WixUI_Font_Title}Za mało miejsca na dysku</String>
173 <String Id="OutOfRbDiskDlgVolumeList" Overridable="yes">{120}{70}{70}{70}{70}</String>
174 <String Id="OutOfRbDiskDlgText2" Overridable="yes">Alternatywnie możesz wyłączyć funkcję wycofywania Instalatora. Wyłączenie wycofywania uniemożliwi Instalatorowi przywrócenie oryginalnego stanu komputera w przypadku przerwania instalacji. Kliknij przycisk Tak, jeśli chcesz podjąć to ryzyko i wyłączyć funkcję wycofywania.</String>
175
176 <String Id="PrepareDlg_Title" Overridable="yes">Instalator produktu [ProductName]</String>
177 <String Id="PrepareDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
178 <String Id="PrepareDlgDescription" Overridable="yes">Zaczekaj, aż Kreator instalacji zakończy przygotowania do przeprowadzenia instalacji.</String>
179 <String Id="PrepareDlgTitle" Overridable="yes">{\WixUI_Font_Bigger}Kreator instalacji produktu [ProductName] — Zapraszamy!</String>
180
181 <String Id="ProgressDlg_Title" Overridable="yes">Instalator produktu [ProductName]</String>
182 <String Id="ProgressDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
183 <String Id="ProgressDlgTextInstalling" Overridable="yes">Czekaj, aż Kreator instalacji zainstaluje produkt [ProductName].</String>
184 <String Id="ProgressDlgTitleInstalling" Overridable="yes">{\WixUI_Font_Title}Instalowanie produktu [ProductName]</String>
185 <String Id="ProgressDlgTextChanging" Overridable="yes">Czekaj, aż Kreator instalacji wprowadzi zmiany w produkcie [ProductName].</String>
186 <String Id="ProgressDlgTitleChanging" Overridable="yes">{\WixUI_Font_Title}Wprowadzanie zmian w produkcie [ProductName]</String>
187 <String Id="ProgressDlgTextRepairing" Overridable="yes">Czekaj, aż Kreator instalacji naprawi produkt [ProductName].</String>
188 <String Id="ProgressDlgTitleRepairing" Overridable="yes">{\WixUI_Font_Title}Naprawianie produktu [ProductName]</String>
189 <String Id="ProgressDlgTextRemoving" Overridable="yes">Czekaj, aż Kreator instalacji usunie produkt [ProductName].</String>
190 <String Id="ProgressDlgTitleRemoving" Overridable="yes">{\WixUI_Font_Title}Usuwanie produktu [ProductName]</String>
191 <String Id="ProgressDlgTextUpdating" Overridable="yes">Czekaj, aż Kreator instalacji zaktualizuje produkt [ProductName].</String>
192 <String Id="ProgressDlgTitleUpdating" Overridable="yes">{\WixUI_Font_Title}Aktualizowanie produktu [ProductName]</String>
193 <String Id="ProgressDlgProgressBar" Overridable="yes">Postęp</String>
194 <String Id="ProgressDlgStatusLabel" Overridable="yes">Status:</String>
195
196 <String Id="ResumeDlg_Title" Overridable="yes">Instalator produktu [ProductName]</String>
197 <String Id="ResumeDlgInstall" Overridable="yes">&amp;Zainstaluj</String>
198 <String Id="ResumeDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
199 <String Id="ResumeDlgDescription" Overridable="yes">Kreator instalacji wykona instalację produktu [ProductName] na tym komputerze. Kliknij przycisk Zainstaluj, aby kontynuować, lub kliknij przycisk Anuluj, aby zakończyć pracę Kreatora instalacji.</String>
200 <String Id="ResumeDlgTitle" Overridable="yes">{\WixUI_Font_Bigger}Wznawianie pracy Kreatora instalacji produktu [ProductName]</String>
201
202 <String Id="SetupTypeDlg_Title" Overridable="yes">Instalator produktu [ProductName]</String>
203 <String Id="SetupTypeDlgTypicalButton" Overridable="yes">&amp;Typowa</String>
204 <String Id="SetupTypeDlgTypicalButtonTooltip" Overridable="yes">Instalacja typowa</String>
205 <String Id="SetupTypeDlgCustomButton" Overridable="yes">Ni&amp;estandardowa</String>
206 <String Id="SetupTypeDlgCustomButtonTooltip" Overridable="yes">Instalacja niestandardowa</String>
207 <String Id="SetupTypeDlgCompleteButton" Overridable="yes">&amp;Pełna</String>
208 <String Id="SetupTypeDlgCompleteButtonTooltip" Overridable="yes">Instalacja pełna</String>
209 <String Id="SetupTypeDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
210 <String Id="SetupTypeDlgTitle" Overridable="yes">{\WixUI_Font_Title}Wybierz typ instalacji</String>
211 <String Id="SetupTypeDlgDescription" Overridable="yes">Wybierz typ instalacji, który najlepiej odpowiada Twoim potrzebom</String>
212 <String Id="SetupTypeDlgTypicalText" Overridable="yes">Instaluje najczęściej używane funkcje programu. Zalecana w przypadku większości użytkowników.</String>
213 <String Id="SetupTypeDlgCustomText" Overridable="yes">Umożliwia użytkownikom wybranie funkcji programu do zainstalowania i lokalizacji, w której zostaną zainstalowane. Zalecana w przypadku użytkowników zaawansowanych.</String>
214 <String Id="SetupTypeDlgCompleteText" Overridable="yes">Zostaną zainstalowane wszystkie funkcje programu. Wymaga najwięcej miejsca na dysku.</String>
215
216 <String Id="UserExit_Title" Overridable="yes">Instalator produktu [ProductName]</String>
217 <String Id="UserExitBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
218 <String Id="UserExitTitle" Overridable="yes">{\WixUI_Font_Bigger}Działanie Kreatora instalacji produktu [ProductName] zostało przerwane</String>
219 <String Id="UserExitDescription1" Overridable="yes">Instalacja produktu [ProductName] została przerwana. System nie został zmodyfikowany. Aby zainstalować ten program później, ponownie uruchom instalację.</String>
220 <String Id="UserExitDescription2" Overridable="yes">Kliknij przycisk Zakończ, aby zakończyć pracę Kreatora instalacji.</String>
221
222 <String Id="VerifyReadyDlg_Title" Overridable="yes">Instalator produktu [ProductName]</String>
223 <String Id="VerifyReadyDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
224 <String Id="VerifyReadyDlgInstall" Overridable="yes">&amp;Zainstaluj</String>
225 <String Id="VerifyReadyDlgInstallText" Overridable="yes">Kliknij przycisk Zainstaluj, aby rozpocząć instalację. Kliknij przycisk Wstecz, aby przejrzeć lub zmienić dowolne ustawienia instalacji. Kliknij przycisk Anuluj, aby zakończyć pracę kreatora.</String>
226 <String Id="VerifyReadyDlgInstallTitle" Overridable="yes">{\WixUI_Font_Title}Wszystko gotowe do zainstalowania produktu [ProductName]</String>
227 <String Id="VerifyReadyDlgChange" Overridable="yes">Z&amp;mień</String>
228 <String Id="VerifyReadyDlgChangeText" Overridable="yes">Kliknij przycisk Zmień, aby rozpocząć instalację. Kliknij przycisk Wstecz, aby przejrzeć lub zmienić dowolne ustawienia instalacji. Kliknij przycisk Anuluj, aby zakończyć pracę kreatora.</String>
229 <String Id="VerifyReadyDlgChangeTitle" Overridable="yes">{\WixUI_Font_Title}Wszystko gotowe do wprowadzenia zmian w produkcie [ProductName]</String>
230 <String Id="VerifyReadyDlgRepair" Overridable="yes">&amp;Napraw</String>
231 <String Id="VerifyReadyDlgRepairText" Overridable="yes">Kliknij przycisk Napraw, aby naprawić instalację produktu [ProductName]. Kliknij przycisk Wstecz, aby przejrzeć lub zmienić dowolne ustawienia instalacji. Kliknij przycisk Anuluj, aby zakończyć pracę kreatora.</String>
232 <String Id="VerifyReadyDlgRepairTitle" Overridable="yes">{\WixUI_Font_Title}Wszystko gotowe do naprawienia produktu [ProductName]</String>
233 <String Id="VerifyReadyDlgRemove" Overridable="yes">&amp;Usuń</String>
234 <String Id="VerifyReadyDlgRemoveText" Overridable="yes">Kliknij przycisk Usuń, aby usunąć produkt [ProductName] z tego komputera. Kliknij przycisk Wstecz, aby przejrzeć lub zmienić dowolne ustawienia instalacji. Kliknij przycisk Anuluj, aby zakończyć pracę kreatora.</String>
235 <String Id="VerifyReadyDlgRemoveTitle" Overridable="yes">{\WixUI_Font_Title}Wszystko gotowe do usunięcia produktu [ProductName]</String>
236 <String Id="VerifyReadyDlgUpdate" Overridable="yes">Akt&amp;ualizuj</String>
237 <String Id="VerifyReadyDlgUpdateText" Overridable="yes">Kliknij przycisk Aktualizuj, aby zaktualizować produkt [ProductName] na tym komputerze. Kliknij przycisk Wstecz, aby przejrzeć lub zmienić dowolne ustawienia instalacji. Kliknij przycisk Anuluj, aby zakończyć pracę kreatora.</String>
238 <String Id="VerifyReadyDlgUpdateTitle" Overridable="yes">{\WixUI_Font_Title}Wszystko gotowe do zaktualizowania produktu [ProductName]</String>
239
240 <String Id="WaitForCostingDlg_Title" Overridable="yes">Instalator produktu [ProductName]</String>
241 <String Id="WaitForCostingDlgReturn" Overridable="yes">&amp;Powrót</String>
242 <String Id="WaitForCostingDlgText" Overridable="yes">Zaczekaj, aż Instalator zakończy określanie wymaganej ilości miejsca na dysku.</String>
243 <String Id="WaitForCostingDlgIcon" Overridable="yes">WixUI_Ico_Exclam</String>
244 <String Id="WaitForCostingDlgIconTooltip" Overridable="yes">Ikona wykrzyknika</String>
245
246 <String Id="WelcomeDlg_Title" Overridable="yes">Instalator produktu [ProductName]</String>
247 <String Id="WelcomeDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
248 <String Id="WelcomeDlgDescription" Overridable="yes">Kreator instalacji zainstaluje produkt [ProductName] na tym komputerze. Kliknij przycisk Dalej, aby kontynuować, lub Anuluj, aby zakończyć pracę Kreatora instalacji.</String>
249 <String Id="WelcomeUpdateDlgDescriptionUpdate" Overridable="yes">Kreator instalacji zaktualizuje produkt [ProductName] na tym komputerze. Kliknij przycisk Dalej, aby kontynuować, lub Anuluj, aby zakończyć pracę Kreatora instalacji.</String>
250 <String Id="WelcomeDlgTitle" Overridable="yes">{\WixUI_Font_Bigger}Kreator instalacji produktu [ProductName] — Zapraszamy!</String>
251
252 <String Id="WelcomeEulaDlg_Title" Overridable="yes">Instalator produktu [ProductName]</String>
253 <String Id="WelcomeEulaDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
254 <String Id="WelcomeEulaDlgLicenseAcceptedCheckBox" Overridable="yes">&amp;Akceptuję warunki Umowy licencyjnej</String>
255 <String Id="WelcomeEulaDlgInstall" Overridable="yes">&amp;Zainstaluj</String>
256 <String Id="WelcomeEulaDlgUpdate" Overridable="yes">Akt&amp;ualizuj</String>
257 <String Id="WelcomeEulaDlgTitle" Overridable="yes">{\WixUI_Font_Title}Przeczytaj umowę licencyjną produktu [ProductName]</String>
258
259 <String Id="ProgressTextInstallValidate" Overridable="yes">Sprawdzanie poprawności instalacji</String>
260 <String Id="ProgressTextInstallFiles" Overridable="yes">Kopiowanie nowych plików</String>
261 <String Id="ProgressTextInstallFilesTemplate" Overridable="yes">Plik: [1], katalog: [9], rozmiar: [6]</String>
262 <String Id="ProgressTextInstallAdminPackage" Overridable="yes">Kopiowanie plików instalacji sieciowej</String>
263 <String Id="ProgressTextInstallAdminPackageTemplate" Overridable="yes">Plik: [1], katalog: [9], rozmiar: [6]</String>
264 <String Id="ProgressTextFileCost" Overridable="yes">Obliczanie wymaganego miejsca</String>
265 <String Id="ProgressTextCostInitialize" Overridable="yes">Obliczanie wymaganego miejsca</String>
266 <String Id="ProgressTextCostFinalize" Overridable="yes">Obliczanie wymaganego miejsca</String>
267 <String Id="ProgressTextCreateShortcuts" Overridable="yes">Tworzenie skrótów</String>
268 <String Id="ProgressTextCreateShortcutsTemplate" Overridable="yes">Skrót: [1]</String>
269 <String Id="ProgressTextPublishComponents" Overridable="yes">Publikowanie składników kwalifikowanych</String>
270 <String Id="ProgressTextPublishComponentsTemplate" Overridable="yes">Identyfikator składnika: [1], kwalifikator: [2]</String>
271 <String Id="ProgressTextPublishFeatures" Overridable="yes">Publikowanie funkcji produktu</String>
272 <String Id="ProgressTextPublishFeaturesTemplate" Overridable="yes">Funkcja: [1]</String>
273 <String Id="ProgressTextPublishProduct" Overridable="yes">Publikowanie informacji o produkcie</String>
274 <String Id="ProgressTextRegisterClassInfo" Overridable="yes">Rejestrowanie serwerów klas</String>
275 <String Id="ProgressTextRegisterClassInfoTemplate" Overridable="yes">Identyfikator klasy: [1]</String>
276 <String Id="ProgressTextRegisterExtensionInfo" Overridable="yes">Rejestrowanie serwerów rozszerzeń</String>
277 <String Id="ProgressTextRegisterExtensionInfoTemplate" Overridable="yes">Rozszerzenie: [1]</String>
278 <String Id="ProgressTextRegisterMIMEInfo" Overridable="yes">Rejestrowanie informacji MIME</String>
279 <String Id="ProgressTextRegisterMIMEInfoTemplate" Overridable="yes">Typ zawartości MIME: [1], rozszerzenie: [2]</String>
280 <String Id="ProgressTextRegisterProgIdInfo" Overridable="yes">Rejestrowanie identyfikatorów programu</String>
281 <String Id="ProgressTextRegisterProgIdInfoTemplate" Overridable="yes">Identyfikator programu: [1]</String>
282 <String Id="ProgressTextAllocateRegistrySpace" Overridable="yes">Przydzielanie przestrzeni rejestru</String>
283 <String Id="ProgressTextAllocateRegistrySpaceTemplate" Overridable="yes">Wolne miejsce: [1]</String>
284 <String Id="ProgressTextAppSearch" Overridable="yes">Wyszukiwanie zainstalowanych aplikacji</String>
285 <String Id="ProgressTextAppSearchTemplate" Overridable="yes">Właściwość: [1], podpis: [2]</String>
286 <String Id="ProgressTextBindImage" Overridable="yes">Wiązanie plików wykonywalnych</String>
287 <String Id="ProgressTextBindImageTemplate" Overridable="yes">Plik: [1]</String>
288 <String Id="ProgressTextCCPSearch" Overridable="yes">Wyszukiwanie kwalifikujących produktów</String>
289 <String Id="ProgressTextCreateFolders" Overridable="yes">Tworzenie folderów</String>
290 <String Id="ProgressTextCreateFoldersTemplate" Overridable="yes">Folder: [1]</String>
291 <String Id="ProgressTextDeleteServices" Overridable="yes">Usuwanie usług</String>
292 <String Id="ProgressTextDeleteServicesTemplate" Overridable="yes">Usługa: [1]</String>
293 <String Id="ProgressTextDuplicateFiles" Overridable="yes">Tworzenie duplikatów plików</String>
294 <String Id="ProgressTextDuplicateFilesTemplate" Overridable="yes">Plik: [1], katalog: [9], rozmiar: [6]</String>
295 <String Id="ProgressTextFindRelatedProducts" Overridable="yes">Wyszukiwanie aplikacji pokrewnych</String>
296 <String Id="ProgressTextFindRelatedProductsTemplate" Overridable="yes">Znaleziono aplikację: [1]</String>
297 <String Id="ProgressTextInstallODBC" Overridable="yes">Instalowanie składników ODBC</String>
298 <String Id="ProgressTextInstallServices" Overridable="yes">Instalowanie nowych usług</String>
299 <String Id="ProgressTextInstallServicesTemplate" Overridable="yes">Usługa: [2]</String>
300 <String Id="ProgressTextLaunchConditions" Overridable="yes">Sprawdzanie warunków uruchamiania</String>
301 <String Id="ProgressTextMigrateFeatureStates" Overridable="yes">Migracja stanów funkcji z pokrewnych aplikacji</String>
302 <String Id="ProgressTextMigrateFeatureStatesTemplate" Overridable="yes">Aplikacja: [1]</String>
303 <String Id="ProgressTextMoveFiles" Overridable="yes">Przenoszenie plików</String>
304 <String Id="ProgressTextMoveFilesTemplate" Overridable="yes">Plik: [1], katalog: [9], rozmiar: [6]</String>
305 <String Id="ProgressTextPatchFiles" Overridable="yes">Poprawianie plików</String>
306 <String Id="ProgressTextPatchFilesTemplate" Overridable="yes">Plik: [1], katalog: [2], rozmiar: [3]</String>
307 <String Id="ProgressTextProcessComponents" Overridable="yes">Aktualizowanie rejestracji składników</String>
308 <String Id="ProgressTextRegisterComPlus" Overridable="yes">Rejestrowanie aplikacji i składników COM+</String>
309 <String Id="ProgressTextRegisterComPlusTemplate" Overridable="yes">Identyfikator aplikacji: [1]{{, typ aplikacji: [2], użytkownicy: [3], RSN: [4]}}</String>
310 <String Id="ProgressTextRegisterFonts" Overridable="yes">Rejestrowanie czcionek</String>
311 <String Id="ProgressTextRegisterFontsTemplate" Overridable="yes">Czcionka: [1]</String>
312 <String Id="ProgressTextRegisterProduct" Overridable="yes">Rejestrowanie produktu</String>
313 <String Id="ProgressTextRegisterProductTemplate" Overridable="yes">[1]</String>
314 <String Id="ProgressTextRegisterTypeLibraries" Overridable="yes">Rejestrowanie bibliotek typów</String>
315 <String Id="ProgressTextRegisterTypeLibrariesTemplate" Overridable="yes">Identyfikator biblioteki: [1]</String>
316 <String Id="ProgressTextRegisterUser" Overridable="yes">Rejestrowanie użytkownika</String>
317 <String Id="ProgressTextRegisterUserTemplate" Overridable="yes">[1]</String>
318 <String Id="ProgressTextRemoveDuplicateFiles" Overridable="yes">Usuwanie zduplikowanych plików</String>
319 <String Id="ProgressTextRemoveDuplicateFilesTemplate" Overridable="yes">Plik: [1], katalog: [9]</String>
320 <String Id="ProgressTextRemoveEnvironmentStrings" Overridable="yes">Aktualizowanie ciągów środowiska</String>
321 <String Id="ProgressTextRemoveEnvironmentStringsTemplate" Overridable="yes">Nazwa: [1], wartość: [2], akcja [3]</String>
322 <String Id="ProgressTextRemoveExistingProducts" Overridable="yes">Usuwanie aplikacji</String>
323 <String Id="ProgressTextRemoveExistingProductsTemplate" Overridable="yes">Aplikacja: [1], wiersz polecenia: [2]</String>
324 <String Id="ProgressTextRemoveFiles" Overridable="yes">Usuwanie plików</String>
325 <String Id="ProgressTextRemoveFilesTemplate" Overridable="yes">Plik: [1], katalog: [9]</String>
326 <String Id="ProgressTextRemoveFolders" Overridable="yes">Usuwanie folderów</String>
327 <String Id="ProgressTextRemoveFoldersTemplate" Overridable="yes">Folder: [1]</String>
328 <String Id="ProgressTextRemoveIniValues" Overridable="yes">Usuwanie wpisów plików INI</String>
329 <String Id="ProgressTextRemoveIniValuesTemplate" Overridable="yes">Plik: [1], sekcja: [2], klucz: [3], wartość: [4]</String>
330 <String Id="ProgressTextRemoveODBC" Overridable="yes">Usuwanie składników ODBC</String>
331 <String Id="ProgressTextRemoveRegistryValues" Overridable="yes">Usuwanie wartości rejestru systemowego</String>
332 <String Id="ProgressTextRemoveRegistryValuesTemplate" Overridable="yes">Klucz: [1], nazwa: [2]</String>
333 <String Id="ProgressTextRemoveShortcuts" Overridable="yes">Usuwanie skrótów</String>
334 <String Id="ProgressTextRemoveShortcutsTemplate" Overridable="yes">Skrót: [1]</String>
335 <String Id="ProgressTextRMCCPSearch" Overridable="yes">Wyszukiwanie kwalifikujących produktów</String>
336 <String Id="ProgressTextSelfRegModules" Overridable="yes">Rejestrowanie modułów</String>
337 <String Id="ProgressTextSelfRegModulesTemplate" Overridable="yes">Plik: [1], folder: [2]</String>
338 <String Id="ProgressTextSelfUnregModules" Overridable="yes">Wyrejestrowywanie modułów</String>
339 <String Id="ProgressTextSelfUnregModulesTemplate" Overridable="yes">Plik: [1], folder: [2]</String>
340 <String Id="ProgressTextSetODBCFolders" Overridable="yes">Inicjowanie katalogów ODBC</String>
341 <String Id="ProgressTextStartServices" Overridable="yes">Uruchamianie usług</String>
342 <String Id="ProgressTextStartServicesTemplate" Overridable="yes">Usługa: [1]</String>
343 <String Id="ProgressTextStopServices" Overridable="yes">Zatrzymywanie usług</String>
344 <String Id="ProgressTextStopServicesTemplate" Overridable="yes">Usługa: [1]</String>
345 <String Id="ProgressTextUnpublishComponents" Overridable="yes">Cofanie publikowania składników kwalifikowanych</String>
346 <String Id="ProgressTextUnpublishComponentsTemplate" Overridable="yes">Identyfikator składnika: [1], kwalifikator: [2]</String>
347 <String Id="ProgressTextUnpublishFeatures" Overridable="yes">Cofanie publikowania funkcji produktu</String>
348 <String Id="ProgressTextUnpublishFeaturesTemplate" Overridable="yes">Funkcja: [1]</String>
349 <String Id="ProgressTextUnregisterClassInfo" Overridable="yes">Wyrejestrowywanie serwerów klas</String>
350 <String Id="ProgressTextUnregisterClassInfoTemplate" Overridable="yes">Identyfikator klasy: [1]</String>
351 <String Id="ProgressTextUnregisterComPlus" Overridable="yes">Wyrejestrowywanie aplikacji i składników COM+</String>
352 <String Id="ProgressTextUnregisterComPlusTemplate" Overridable="yes">Identyfikator aplikacji: [1]{{, typ aplikacji: [2]}}</String>
353 <String Id="ProgressTextUnregisterExtensionInfo" Overridable="yes">Wyrejestrowywanie serwerów rozszerzeń</String>
354 <String Id="ProgressTextUnregisterExtensionInfoTemplate" Overridable="yes">Rozszerzenie: [1]</String>
355 <String Id="ProgressTextUnregisterFonts" Overridable="yes">Wyrejestrowywanie czcionek</String>
356 <String Id="ProgressTextUnregisterFontsTemplate" Overridable="yes">Czcionka: [1]</String>
357 <String Id="ProgressTextUnregisterMIMEInfo" Overridable="yes">Wyrejestrowywanie informacji MIME</String>
358 <String Id="ProgressTextUnregisterMIMEInfoTemplate" Overridable="yes">Typ zawartości MIME: [1], rozszerzenie: [2]</String>
359 <String Id="ProgressTextUnregisterProgIdInfo" Overridable="yes">Wyrejestrowywanie identyfikatorów programów</String>
360 <String Id="ProgressTextUnregisterProgIdInfoTemplate" Overridable="yes">Identyfikator programu: [1]</String>
361 <String Id="ProgressTextUnregisterTypeLibraries" Overridable="yes">Wyrejestrowywanie bibliotek typów</String>
362 <String Id="ProgressTextUnregisterTypeLibrariesTemplate" Overridable="yes">Identyfikator biblioteki: [1]</String>
363 <String Id="ProgressTextWriteEnvironmentStrings" Overridable="yes">Aktualizowanie ciągów środowiska</String>
364 <String Id="ProgressTextWriteEnvironmentStringsTemplate" Overridable="yes">Nazwa: [1], wartość: [2], akcja [3]</String>
365 <String Id="ProgressTextWriteIniValues" Overridable="yes">Zapisywanie wartości plików INI</String>
366 <String Id="ProgressTextWriteIniValuesTemplate" Overridable="yes">Plik: [1], sekcja: [2], klucz: [3], wartość: [4]</String>
367 <String Id="ProgressTextWriteRegistryValues" Overridable="yes">Zapisywanie wartości rejestru systemowego</String>
368 <String Id="ProgressTextWriteRegistryValuesTemplate" Overridable="yes">Klucz: [1], nazwa: [2], wartość: [3]</String>
369 <String Id="ProgressTextAdvertise" Overridable="yes">Aplikacja anonsująca</String>
370 <String Id="ProgressTextGenerateScript" Overridable="yes">Generowanie operacji skryptu dla akcji:</String>
371 <String Id="ProgressTextGenerateScriptTemplate" Overridable="yes">[1]</String>
372 <String Id="ProgressTextInstallSFPCatalogFile" Overridable="yes">Instalowanie wykazu systemu</String>
373 <String Id="ProgressTextInstallSFPCatalogFileTemplate" Overridable="yes">Plik: [1], zależności: [2]</String>
374 <String Id="ProgressTextMsiPublishAssemblies" Overridable="yes">Publikowanie informacji o asemblerze</String>
375 <String Id="ProgressTextMsiPublishAssembliesTemplate" Overridable="yes">Kontekst aplikacji: [1], nazwa asemblera: [2]</String>
376 <String Id="ProgressTextMsiUnpublishAssemblies" Overridable="yes">Cofanie publikowania informacji o asemblerze</String>
377 <String Id="ProgressTextMsiUnpublishAssembliesTemplate" Overridable="yes">Kontekst aplikacji: [1], nazwa asemblera: [2]</String>
378 <String Id="ProgressTextRollback" Overridable="yes">Powrót do poprzedniej akcji:</String>
379 <String Id="ProgressTextRollbackTemplate" Overridable="yes">[1]</String>
380 <String Id="ProgressTextRollbackCleanup" Overridable="yes">Usuwanie plików kopii zapasowej</String>
381 <String Id="ProgressTextRollbackCleanupTemplate" Overridable="yes">Plik: [1]</String>
382 <String Id="ProgressTextUnmoveFiles" Overridable="yes">Usuwanie plików przeniesionych</String>
383 <String Id="ProgressTextUnmoveFilesTemplate" Overridable="yes">Plik: [1], katalog: [9]</String>
384 <String Id="ProgressTextUnpublishProduct" Overridable="yes">Cofanie publikowania informacji o produkcie</String>
385
386 <String Id="Error0" Overridable="yes">{{Błąd krytyczny: }}</String>
387 <String Id="Error1" Overridable="yes">{{Błąd [1]. }}</String>
388 <String Id="Error2" Overridable="yes">Ostrzeżenie [1]. </String>
389 <String Id="Error4" Overridable="yes">Informacja [1]. </String>
390 <String Id="Error5" Overridable="yes">Instalator napotkał nieoczekiwany błąd podczas instalowania tego pakietu. To może wskazywać na problem z tym pakietem. Kod błędu to [1]. {{Argumenty: [2], [3], [4]}}</String>
391 <String Id="Error7" Overridable="yes">{{Dysk zapełniony: }}</String>
392 <String Id="Error8" Overridable="yes">Akcja [Time]: [1]. [2]</String>
393 <String Id="Error9" Overridable="yes">[ProductName]</String>
394 <String Id="Error10" Overridable="yes">{[2]}{, [3]}{, [4]}</String>
395 <String Id="Error11" Overridable="yes">Typ komunikatu: [1], argument: [2]</String>
396 <String Id="Error12" Overridable="yes">=== Logowanie rozpoczęte: [Date] [Time] ===</String>
397 <String Id="Error13" Overridable="yes">=== Logowanie zatrzymane: [Date] [Time] ===</String>
398 <String Id="Error14" Overridable="yes">Uruchomienie akcji [Time]: [1].</String>
399 <String Id="Error15" Overridable="yes">Zakończenie akcji [Time]: [1]. Wartość zwrócona [2].</String>
400 <String Id="Error16" Overridable="yes">Pozostało czasu: {[1] min }{[2] s}</String>
401 <String Id="Error17" Overridable="yes">Za mało pamięci. Zamknij inne aplikacje przed ponowną próbą.</String>
402 <String Id="Error18" Overridable="yes">Instalator nie odpowiada.</String>
403 <String Id="Error19" Overridable="yes">Instalator przedwcześnie zakończył pracę.</String>
404 <String Id="Error20" Overridable="yes">Czekaj, system Windows konfiguruje produkt [ProductName]</String>
405 <String Id="Error21" Overridable="yes">Trwa zbieranie wymaganych informacji...</String>
406 <String Id="Error22" Overridable="yes">Trwa usuwanie starszych wersji tej aplikacji...</String>
407 <String Id="Error23" Overridable="yes">Trwa przygotowywanie do usunięcia starszych wersji tej aplikacji...</String>
408 <String Id="Error32" Overridable="yes">Instalacja produktu {[ProductName] } została ukończona pomyślnie.</String>
409 <String Id="Error33" Overridable="yes">Instalacja produktu {[ProductName]} nie powiodła się.</String>
410 <String Id="Error1101" Overridable="yes">Błąd podczas odczytu z pliku: [2]. {{ Błąd systemu [3].}} Sprawdź, czy plik istnieje i czy masz do niego dostęp.</String>
411 <String Id="Error1301" Overridable="yes">Nie można utworzyć pliku „[2]”. Istnieje już katalog o tej nazwie. Anuluj instalację i spróbuj przeprowadzić ją w innej lokalizacji.</String>
412 <String Id="Error1302" Overridable="yes">Włóż dysk: [2]</String>
413 <String Id="Error1303" Overridable="yes">Instalator ma niewystarczające uprawnienia dostępu do tego katalogu: [2]. Nie można kontynuować instalacji. Zaloguj się jako administrator lub skontaktuj się z administratorem systemu.</String>
414 <String Id="Error1304" Overridable="yes">Błąd przy zapisywaniu do pliku: [2]. Sprawdź, czy masz dostęp do tego katalogu.</String>
415 <String Id="Error1305" Overridable="yes">Błąd odczytu z pliku [2]. {{ Błąd systemu [3].}} Sprawdź, czy plik istnieje i czy masz do niego dostęp.</String>
416 <String Id="Error1306" Overridable="yes">Inna aplikacja ma wyłączny dostęp do pliku „[2]”. Zamknij wszystkie inne aplikacje, a następnie kliknij przycisk Ponów próbę.</String>
417 <String Id="Error1307" Overridable="yes">Za mało miejsca na dysku, aby zainstalować ten plik: [2]. Zwolnij nieco miejsca na dysku i kliknij przycisk Ponów próbę lub kliknij przycisk Anuluj, aby zakończyć.</String>
418 <String Id="Error1308" Overridable="yes">Nie znaleziono pliku źródłowego: [2]. Sprawdź, czy plik istnieje i czy masz do niego dostęp.</String>
419 <String Id="Error1309" Overridable="yes">Błąd podczas odczytu z pliku [3]. {{ Błąd systemu [2].}} Sprawdź, czy plik istnieje i czy masz do niego dostęp.</String>
420 <String Id="Error1310" Overridable="yes">Błąd zapisu w pliku: [3]. {{ Błąd systemu [2].}} Sprawdź, czy masz dostęp do tego katalogu.</String>
421 <String Id="Error1311" Overridable="yes">Nie znaleziono pliku źródłowego{{(plik cab)}}: [2]. Sprawdź, czy plik istnieje i czy masz do niego dostęp.</String>
422 <String Id="Error1312" Overridable="yes">Nie można utworzyć katalogu „[2]”. Plik o tej nazwie już istnieje. Zmień nazwę pliku lub usuń go i kliknij przycisk Ponów próbę lub Anuluj, aby zakończyć pracę.</String>
423 <String Id="Error1313" Overridable="yes">Wolumin [2] jest obecnie niedostępny. Wybierz inny wolumin.</String>
424 <String Id="Error1314" Overridable="yes">Określona ścieżka „[2]” jest niedostępna.</String>
425 <String Id="Error1315" Overridable="yes">Nie można przeprowadzić zapisu w określonym folderze: [2].</String>
426 <String Id="Error1316" Overridable="yes">Wystąpił błąd sieciowy podczas próby odczytu z pliku: [2]</String>
427 <String Id="Error1317" Overridable="yes">Wystąpił błąd podczas próby utworzenia katalogu: [2]</String>
428 <String Id="Error1318" Overridable="yes">Wystąpił błąd sieciowy podczas próby utworzenia katalogu: [2]</String>
429 <String Id="Error1319" Overridable="yes">Wystąpił błąd sieciowy podczas próby otwarcia pliku źródłowego cab: [2]</String>
430 <String Id="Error1320" Overridable="yes">Określona ścieżka jest za długa: [2]</String>
431 <String Id="Error1321" Overridable="yes">Instalator ma niewystarczające uprawnienia do modyfikowania tego pliku: [2].</String>
432 <String Id="Error1322" Overridable="yes">Część ścieżki folderu „[2]” jest nieprawidłowa. Jest ona pusta lub przekracza długość dozwoloną w systemie.</String>
433 <String Id="Error1323" Overridable="yes">Ścieżka folderu „[2]” zawiera słowa, które nie są dozwolone w ścieżkach folderów.</String>
434 <String Id="Error1324" Overridable="yes">Ścieżka folderu „[2]” zawiera nieprawidłowy znak.</String>
435 <String Id="Error1325" Overridable="yes">„[2]” nie jest prawidłową krótką nazwą pliku.</String>
436 <String Id="Error1326" Overridable="yes">Błąd pobierania zabezpieczeń pliku: [3] GetLastError: [2]</String>
437 <String Id="Error1327" Overridable="yes">Nieprawidłowy dysk: [2]</String>
438 <String Id="Error1328" Overridable="yes">Błąd podczas stosowania poprawki do pliku [2]. Prawdopodobnie plik został zaktualizowany w inny sposób i nie może być już modyfikowany przez tę poprawkę. Aby uzyskać więcej informacji, skontaktuj się z dostawcą poprawki. {{Błąd systemu: [3]}}</String>
439 <String Id="Error1329" Overridable="yes">Wymagany plik nie może być zainstalowany, ponieważ plik cab [2] nie jest podpisany cyfrowo. To może wskazywać na uszkodzenie pliku cab.</String>
440 <String Id="Error1330" Overridable="yes">Wymagany plik nie może być zainstalowany, ponieważ plik cab [2] ma nieprawidłowy podpis cyfrowy. To może wskazywać na uszkodzenie pliku cab.{{ Błąd [3] został zwrócony przez moduł WinVerifyTrust.}}</String>
441 <String Id="Error1331" Overridable="yes">Nie można poprawnie skopiować pliku [2]: błąd CRC.</String>
442 <String Id="Error1332" Overridable="yes">Nie można poprawnie przenieść pliku [2]: błąd CRC.</String>
443 <String Id="Error1333" Overridable="yes">Nie można poprawnie zastosować poprawki do pliku [2]: błąd CRC.</String>
444 <String Id="Error1334" Overridable="yes">Nie można zainstalować pliku „[2]”, ponieważ nie można go odnaleźć w pliku cab „[3]”. To może wskazywać na błąd sieciowy, błąd odczytu z dysku CD-ROM lub problem z tym pakietem.</String>
445 <String Id="Error1335" Overridable="yes">Plik cab „[2]” wymagany dla tej instalacji jest uszkodzony i nie może być użyty. To może wskazywać na błąd sieciowy, błąd odczytu z dysku CD-ROM lub problem z tym pakietem.</String>
446 <String Id="Error1336" Overridable="yes">Wystąpił błąd podczas tworzenia pliku tymczasowego wymaganego do ukończenia tej instalacji.{{ Folder: [3]. Kod błędu systemu: [2]}}</String>
447 <String Id="Error1401" Overridable="yes">Nie można utworzyć klucza: [2]. {{ Błąd systemu [3].}} Sprawdź, czy masz wystarczające prawa dostępu do tego klucza, lub skontaktuj się z pomocą techniczną. </String>
448 <String Id="Error1402" Overridable="yes">Nie można otworzyć klucza: [2]. {{ Błąd systemu [3].}} Sprawdź, czy masz wystarczające prawa dostępu do tego klucza, lub skontaktuj się z pomocą techniczną. </String>
449 <String Id="Error1403" Overridable="yes">Nie można usunąć wartości [2] z klucza [3]. {{ Błąd systemu [4].}} Sprawdź, czy masz wystarczające prawa dostępu do tego klucza, lub skontaktuj się z pomocą techniczną. </String>
450 <String Id="Error1404" Overridable="yes">Nie można usunąć klucza: [2]. {{ Błąd systemu [3].}} Sprawdź, czy masz wystarczające prawa dostępu do tego klucza, lub skontaktuj się z pomocą techniczną. </String>
451 <String Id="Error1405" Overridable="yes">Nie można odczytać wartości [2] z klucza [3]. {{ Błąd systemu [4].}} Sprawdź, czy masz wystarczające prawa dostępu do tego klucza, lub skontaktuj się z pomocą techniczną. </String>
452 <String Id="Error1406" Overridable="yes">Nie można zapisać wartości [2] do klucza [3]. {{ Błąd systemu [4].}} Sprawdź, czy masz wystarczające prawa dostępu do tego klucza, lub skontaktuj się z pomocą techniczną.</String>
453 <String Id="Error1407" Overridable="yes">Nie można pobrać nazw wartości dla klucza [2]. {{ Błąd systemu [3].}} Sprawdź, czy masz wystarczające prawa dostępu do tego klucza, lub skontaktuj się z pomocą techniczną.</String>
454 <String Id="Error1408" Overridable="yes">Nie można pobrać nazw podkluczy dla klucza [2]. {{ Błąd systemu [3].}} Sprawdź, czy masz wystarczające prawa dostępu do tego klucza, lub skontaktuj się z pomocą techniczną.</String>
455 <String Id="Error1409" Overridable="yes">Nie można odczytać informacji o zabezpieczeniach dla klucza [2]. {{ Błąd systemu [3].}} Sprawdź, czy masz wystarczające prawa dostępu do tego klucza, lub skontaktuj się z pomocą techniczną.</String>
456 <String Id="Error1410" Overridable="yes">Nie można zwiększyć dostępnego miejsca dla rejestru. Do zainstalowania tej aplikacji wymagane jest [2] KB wolnego miejsca dla rejestru.</String>
457 <String Id="Error1500" Overridable="yes">Inna instalacja jest w toku. Musisz ukończyć tamtą instalację przed kontynuowaniem tej instalacji.</String>
458 <String Id="Error1501" Overridable="yes">Błąd dostępu do zabezpieczonych danych. Upewnij się, że Instalator Windows jest skonfigurowany prawidłowo, i spróbuj ponownie przeprowadzić instalację.</String>
459 <String Id="Error1502" Overridable="yes">Użytkownik „[2]” zainicjował poprzednio instalację dla produktu „[3]”. Użytkownik ten będzie musiał uruchomić tę instalację ponownie, aby używać tego produktu. Bieżąca instalacja będzie kontynuowana.</String>
460 <String Id="Error1503" Overridable="yes">Użytkownik „[2]” zainicjował poprzednio instalację dla produktu „[3]”. Użytkownik ten będzie musiał uruchomić tę instalację ponownie, aby używać tego produktu.</String>
461 <String Id="Error1601" Overridable="yes">Za mało miejsca na dysku — wolumin: „[2]”; wymagane miejsce: [3] KB; dostępne miejsce: [4] KB. Zwolnij nieco miejsca na dysku i ponów próbę.</String>
462 <String Id="Error1602" Overridable="yes">Czy na pewno chcesz anulować operację?</String>
463 <String Id="Error1603" Overridable="yes">Plik [2][3] jest używany{ przez następujący proces: Nazwa: [4], Id: [5], Nazwa okna: „[6]”}. Zamknij aplikację i ponów próbę.</String>
464 <String Id="Error1604" Overridable="yes">Jest już zainstalowany produkt „[2]”, co uniemożliwia instalację tego produktu. Te dwa produkty nie są zgodne.</String>
465 <String Id="Error1605" Overridable="yes">Za mało miejsca na dysku na woluminie [2], aby kontynuować instalację z włączoną opcją odzyskiwania. Dostępna ilość miejsca: [3] KB; wymagana ilość miejsca: [4] KB. Kliknij przycisk Ignoruj, aby kontynuować instalację bez zapisywania informacji odzyskiwania, kliknij przycisk Ponów próbę, aby ponownie sprawdzić dostępne miejsce lub kliknij przycisk Anuluj, aby zakończyć instalację.</String>
466 <String Id="Error1606" Overridable="yes">Nie można uzyskać dostępu do lokalizacji sieciowej [2].</String>
467 <String Id="Error1607" Overridable="yes">Następujące aplikacje należy zamknąć przed kontynuowaniem instalacji:</String>
468 <String Id="Error1608" Overridable="yes">Nie można znaleźć na tym komputerze żadnego poprzednio zainstalowanego produktu zgodnego, który umożliwiałby instalację tego produktu.</String>
469 <String Id="Error1609" Overridable="yes">Wystąpił błąd podczas stosowania ustawień zabezpieczeń. [2] nie jest prawidłowym użytkownikiem lub grupą. Może być to problem z pakietem lub problem z łączeniem się z kontrolerem domeny w sieci. Sprawdź połączenie sieciowe i kliknij przycisk Ponów próbę lub kliknij przycisk Anuluj, aby zakończyć instalację. {{Nie można zlokalizować identyfikatora SID użytkownika, błąd systemu [3]}}</String>
470 <String Id="Error1701" Overridable="yes">Klucz [2] nie jest prawidłowy. Sprawdź, czy wprowadzono poprawny klucz.</String>
471 <String Id="Error1702" Overridable="yes">Instalator musi ponownie uruchomić system przed kontynuowaniem konfiguracji [2]. Kliknij przycisk Tak, aby uruchomić system ponownie, lub przycisk Nie, jeśli planujesz ręczne ponowne uruchomienie systemu później.</String>
472 <String Id="Error1703" Overridable="yes">Musisz ponownie uruchomić system, aby zmiany konfiguracji [2] zostały wprowadzone. Kliknij przycisk Tak, aby uruchomić system ponownie lub przycisk Nie, jeśli planujesz ręczne ponowne uruchomienie systemu później.</String>
473 <String Id="Error1704" Overridable="yes">Instalacja [2] jest obecnie wstrzymana. Aby kontynuować, musisz cofnąć zmiany wprowadzone przez tę instalację. Czy chcesz cofnąć te zmiany?</String>
474 <String Id="Error1705" Overridable="yes">Poprzednia instalacja tego produktu już trwa. Aby kontynuować, musisz cofnąć zmiany wprowadzone przez tę instalację. Czy chcesz cofnąć te zmiany?</String>
475 <String Id="Error1706" Overridable="yes">Nie można odnaleźć pakietu instalacyjnego dla produktu [2]. Ponów próbę instalacji, używając prawidłowej kopii pakietu instalacyjnego „[3]”.</String>
476 <String Id="Error1707" Overridable="yes">Instalacja została pomyślnie ukończona.</String>
477 <String Id="Error1708" Overridable="yes">Instalacja nie powiodła się.</String>
478 <String Id="Error1709" Overridable="yes">Produkt: [2] - [3]</String>
479 <String Id="Error1710" Overridable="yes">Możesz przywrócić komputer do poprzedniego stanu lub kontynuować instalację później. Czy chcesz przywrócić poprzedni stan komputera?</String>
480 <String Id="Error1711" Overridable="yes">Wystąpił błąd podczas zapisywania informacji o instalacji na dysku. Sprawdź, czy na dysku jest dostępna wystarczająca ilość miejsca, i kliknij przycisk Ponów próbę lub kliknij przycisk Anuluj, aby zakończyć instalację.</String>
481 <String Id="Error1712" Overridable="yes">Nie można znaleźć co najmniej jednego z plików wymaganych do przywrócenia komputera do jego poprzedniego stanu. Przywrócenie stanu nie będzie możliwe.</String>
482 <String Id="Error1713" Overridable="yes">[2] nie może zainstalować jednego z wymaganych produktów. Skontaktuj się z grupą pomocy technicznej. {{Błąd systemu: [3].}}</String>
483 <String Id="Error1714" Overridable="yes">Nie można usunąć starszej wersji programu [2]. Skontaktuj się z grupą pomocy technicznej. {{Błąd systemu [3].}}</String>
484 <String Id="Error1715" Overridable="yes">Zainstalowano [2]</String>
485 <String Id="Error1716" Overridable="yes">Skonfigurowano [2]</String>
486 <String Id="Error1717" Overridable="yes">Usunięto [2]</String>
487 <String Id="Error1718" Overridable="yes">Plik [2] został odrzucony przez zasadę podpisu cyfrowego.</String>
488 <String Id="Error1719" Overridable="yes">Nie można uzyskać dostępu do usługi Instalator Windows. Może mieć to miejsce, jeśli system Windows jest uruchomiony w trybie awaryjnym lub Instalator Windows jest niepoprawnie zainstalowany. Skontaktuj się z działem Pomocy technicznej, aby uzyskać pomoc.</String>
489 <String Id="Error1720" Overridable="yes">Wystąpił problem z tym pakietem Instalatora Windows. Nie można uruchomić skryptu wymaganego do ukończenia tej instalacji. Skontaktuj się z pomocą techniczną lub dostawcą pakietu. {{Akcja niestandardowa [2], błąd skryptu [3], [4]: [5] wiersz [6], kolumna [7], [8]}}</String>
490 <String Id="Error1721" Overridable="yes">Wystąpił problem z tym pakietem Instalatora Windows. Nie można uruchomić programu wymaganego do ukończenia tej instalacji. Skontaktuj się z pomocą techniczną lub dostawcą pakietu. {{Akcja: [2], lokalizacja: [3], polecenie: [4] }}</String>
491 <String Id="Error1722" Overridable="yes">Wystąpił problem z tym pakietem Instalatora Windows. Program uruchomiony jako część instalacji nie zakończył pracy w oczekiwany sposób. Skontaktuj się z pomocą techniczną lub dostawcą pakietu. {{Akcja [2], lokalizacja: [3], polecenie: [4] }}</String>
492 <String Id="Error1723" Overridable="yes">Wystąpił problem z tym pakietem Instalatora Windows. Nie można uruchomić biblioteki DLL wymaganej do ukończenia tej instalacji. Skontaktuj się z pomocą techniczną lub dostawcą pakietu. {{Akcja [2], wpis: [3], biblioteka: [4] }}</String>
493 <String Id="Error1724" Overridable="yes">Usunięcie zostało pomyślnie ukończone.</String>
494 <String Id="Error1725" Overridable="yes">Usunięcie nie powiodło się.</String>
495 <String Id="Error1726" Overridable="yes">Anonsowanie zostało pomyślnie ukończone.</String>
496 <String Id="Error1727" Overridable="yes">Anonsowanie nie powiodło się.</String>
497 <String Id="Error1728" Overridable="yes">Konfiguracja została pomyślnie ukończona.</String>
498 <String Id="Error1729" Overridable="yes">Konfiguracja nie powiodła się.</String>
499 <String Id="Error1730" Overridable="yes">Musisz być administratorem, aby usunąć tę aplikację. Aby usunąć tę aplikację, zaloguj się jako Administrator lub skontaktuj się z obsługą techniczną w celu uzyskania pomocy.</String>
500 <String Id="Error1731" Overridable="yes">Źródłowy pakiet instalacyjny dla produktu [2] nie jest zsynchronizowany z pakietem klienckim. Ponów próbę instalacji, używając prawidłowej kopii pakietu instalacyjnego „[3]”.</String>
501 <String Id="Error1732" Overridable="yes">W celu ukończenia instalacji produktu [2] musisz ponownie uruchomić komputer. Na tym komputerze są obecnie zalogowani inni użytkownicy i ponowne uruchomienie komputera może spowodować utratę danych przez tych użytkowników. Czy chcesz teraz ponownie uruchomić komputer?</String>
502 <String Id="Error1801" Overridable="yes">Ścieżka [2] nie jest prawidłowa. Określ prawidłową ścieżkę.</String>
503 <String Id="Error1802" Overridable="yes">Za mało pamięci. Zamknij inne aplikacje przed ponowną próbą.</String>
504 <String Id="Error1803" Overridable="yes">Brak dysku w stacji [2]. Włóż dysk i kliknij przycisk Ponów próbę lub kliknij przycisk Anuluj, aby wrócić do poprzednio wybranego woluminu.</String>
505 <String Id="Error1804" Overridable="yes">Brak dysku w stacji [2]. Włóż dysk i kliknij przycisk Ponów próbę lub kliknij przycisk Anuluj, aby wrócić do okna dialogowego przeglądania i wybrać inny wolumin.</String>
506 <String Id="Error1805" Overridable="yes">Folder [2] nie istnieje. Wprowadź ścieżkę do istniejącego folderu.</String>
507 <String Id="Error1806" Overridable="yes">Masz niewystarczające uprawnienia do odczytu tego folderu.</String>
508 <String Id="Error1807" Overridable="yes">Nie można określić prawidłowego folderu docelowego dla instalacji.</String>
509 <String Id="Error1901" Overridable="yes">Błąd podczas próby odczytu źródłowej bazy danych instalacji: [2].</String>
510 <String Id="Error1902" Overridable="yes">Planowanie operacji ponownego uruchamiania: zmiana nazwy pliku z [2] na [3]. W celu ukończenia operacji należy ponownie uruchomić system.</String>
511 <String Id="Error1903" Overridable="yes">Planowanie operacji ponownego uruchamiania: usuwanie pliku [2]. W celu ukończenia operacji należy ponownie uruchomić system.</String>
512 <String Id="Error1904" Overridable="yes">Nie można zarejestrować modułu [2]. Wynik HRESULT [3]. Skontaktuj się z pomocą techniczną.</String>
513 <String Id="Error1905" Overridable="yes">Nie można wyrejestrować modułu [2]. Wynik HRESULT [3]. Skontaktuj się z pomocą techniczną.</String>
514 <String Id="Error1906" Overridable="yes">Nie można przechować pakietu [2] w pamięci podręcznej. Błąd: [3]. Skontaktuj się z pomocą techniczną.</String>
515 <String Id="Error1907" Overridable="yes">Nie można zarejestrować czcionki [2]. Sprawdź, czy masz wystarczające uprawnienia do instalacji czcionek i czy system obsługuje tę czcionkę.</String>
516 <String Id="Error1908" Overridable="yes">Nie można wyrejestrować czcionki [2]. Sprawdź, czy masz wystarczające uprawnienia do usuwania czcionek.</String>
517 <String Id="Error1909" Overridable="yes">Nie można utworzyć skrótu [2]. Sprawdź, czy folder docelowy istnieje i czy masz do niego dostęp.</String>
518 <String Id="Error1910" Overridable="yes">Nie można usunąć skrótu [2]. Sprawdź, czy plik skrótu istnieje i czy masz do niego dostęp.</String>
519 <String Id="Error1911" Overridable="yes">Nie można zarejestrować biblioteki typów dla pliku [2]. Skontaktuj się z pomocą techniczną.</String>
520 <String Id="Error1912" Overridable="yes">Nie można wyrejestrować biblioteki typów dla pliku [2]. Skontaktuj się z pomocą techniczną.</String>
521 <String Id="Error1913" Overridable="yes">Nie można zaktualizować pliku ini [2][3]. Sprawdź, czy plik istnieje i czy masz do niego dostęp.</String>
522 <String Id="Error1914" Overridable="yes">Nie można zaplanować, aby plik [2] zastąpił plik [3] przy ponownym uruchomieniu. Sprawdź, czy masz uprawnienia do zapisu pliku [3].</String>
523 <String Id="Error1915" Overridable="yes">Błąd usuwania menedżera sterownika ODBC, błąd ODBC [2]: [3]. Skontaktuj się z pomocą techniczną.</String>
524 <String Id="Error1916" Overridable="yes">Błąd instalowania menedżera sterownika ODBC, błąd ODBC [2]: [3]. Skontaktuj się z pomocą techniczną.</String>
525 <String Id="Error1917" Overridable="yes">Błąd usuwania sterownika ODBC: [4], błąd ODBC [2]: [3]. Sprawdź, czy masz wystarczające uprawnienia do usuwania sterowników ODBC.</String>
526 <String Id="Error1918" Overridable="yes">Błąd instalowania sterownika ODBC: [4], błąd ODBC [2]: [3]. Sprawdź, czy plik [4] istnieje i czy masz do niego dostęp.</String>
527 <String Id="Error1919" Overridable="yes">Błąd konfiguracji źródła danych ODBC: [4], błąd ODBC [2]: [3]. Sprawdź, czy plik [4] istnieje i czy masz do niego dostęp.</String>
528 <String Id="Error1920" Overridable="yes">Nie można uruchomić usługi „[2]” ([3]). Sprawdź, czy masz wystarczające uprawnienia do uruchamiania usług systemowych.</String>
529 <String Id="Error1921" Overridable="yes">Nie można zatrzymać usługi „[2]” ([3]). Sprawdź, czy masz wystarczające uprawnienia do zatrzymywania usług systemowych.</String>
530 <String Id="Error1922" Overridable="yes">Nie można usunąć usługi „[2]” ([3]). Sprawdź, czy masz wystarczające uprawnienia do usuwania usług systemowych.</String>
531 <String Id="Error1923" Overridable="yes">Nie można zainstalować usługi „[2]” ([3]). Sprawdź, czy masz wystarczające uprawnienia do instalowania usług systemowych.</String>
532 <String Id="Error1924" Overridable="yes">Nie można zaktualizować zmiennej środowiskowej „[2]”. Sprawdź, czy masz wystarczające uprawnienia do modyfikacji zmiennych środowiskowych.</String>
533 <String Id="Error1925" Overridable="yes">Nie masz wystarczających uprawnień do zakończenia tej instalacji dla wszystkich użytkowników na tym komputerze. Zaloguj się jako administrator, a następnie ponów próbę tej instalacji.</String>
534 <String Id="Error1926" Overridable="yes">Nie można ustawić zabezpieczeń pliku „[3]”. Błąd: [2]. Sprawdź, czy masz wystarczające uprawnienia do modyfikowania uprawnień zabezpieczeń dla tego pliku.</String>
535 <String Id="Error1927" Overridable="yes">Na tym komputerze nie są zainstalowane usługi składowe (COM+ 1.0). W celu prawidłowego wykonania instalacji wymagane są usługi składowe. Usługi składowe są dostępne w systemie Windows 2000.</String>
536 <String Id="Error1928" Overridable="yes">Wystąpił błąd podczas rejestrowania aplikacji COM+. Aby uzyskać więcej informacji, skontaktuj się z pomocą techniczną.</String>
537 <String Id="Error1929" Overridable="yes">Wystąpił błąd podczas wyrejestrowywania aplikacji COM+. Aby uzyskać więcej informacji, skontaktuj się z pomocą techniczną.</String>
538 <String Id="Error1930" Overridable="yes">Zmiana opisu dla usługi „[2]” ([3]) nie jest możliwa.</String>
539 <String Id="Error1931" Overridable="yes">Usługa Instalator Windows nie może zaktualizować pliku systemowego [2], ponieważ plik jest chroniony przez system Windows. Aby program działał prawidłowo, należy zaktualizować system operacyjny. {{Wersja pakietu: [3], wersja chroniona systemu operacyjnego: [4]}}</String>
540 <String Id="Error1932" Overridable="yes">Usługa Instalator Windows nie może zaktualizować chronionego przez system Windows pliku [2]. {{Wersja pakietu: [3], wersja chroniona systemu operacyjnego: [4], błąd SFP: [5]}}</String>
541 <String Id="Error1933" Overridable="yes">Usługa Instalator Windows nie może zaktualizować jednego lub kilku chronionych plików Windows. {{Błąd SFP: [2]. Lista chronionych plików:\r\n[3]}}</String>
542 <String Id="Error1934" Overridable="yes">Instalacje użytkownika są wyłączone ze względu na zasady obowiązujące na tym komputerze.</String>
543 <String Id="Error1935" Overridable="yes">Wystąpił błąd podczas instalacji zestawu „[6]”. Zobacz Pomoc i obsługę techniczną, aby uzyskać więcej informacji. Wynik HRESULT: [3]. {{Interfejs zestawu: [4], funkcja: [5], składnik: [2]}}</String>
544 <String Id="Error1936" Overridable="yes">Wystąpił błąd podczas instalacji zestawu „[6]”. Zestaw nie ma silnej nazwy lub nie jest podpisany za pomocą klucza o minimalnej długości. Wynik HRESULT: [3]. {{Interfejs zestawu: [4], funkcja: [5], składnik: [2]}}</String>
545 <String Id="Error1937" Overridable="yes">Wystąpił błąd podczas instalacji zestawu „[6]”. Nie można zweryfikować podpisu lub wykazu albo jest on nieprawidłowy. Wynik HRESULT: [3]. {{Interfejs zestawu: [4], funkcja: [5], składnik: [2]}}</String>
546 <String Id="Error1938" Overridable="yes">Wystąpił błąd podczas instalacji zestawu „[6]”. Nie można odnaleźć jednego lub większej liczby modułów zestawu. Wynik HRESULT: [3]. {{Interfejs zestawu: [4], funkcja: [5], składnik: [2]}}</String>
547
548 <String Id="UITextbytes" Overridable="yes">Bajtów</String>
549 <String Id="UITextGB" Overridable="yes">GB</String>
550 <String Id="UITextKB" Overridable="yes">KB</String>
551 <String Id="UITextMB" Overridable="yes">MB</String>
552 <String Id="UITextMenuAbsent" Overridable="yes">Cała funkcja będzie niedostępna</String>
553 <String Id="UITextMenuAdvertise" Overridable="yes">Funkcja zostanie zainstalowana w razie potrzeby</String>
554 <String Id="UITextMenuAllCD" Overridable="yes">Cała funkcja zostanie zainstalowana do uruchamiania z dysku CD</String>
555 <String Id="UITextMenuAllLocal" Overridable="yes">Cała funkcja zostanie zainstalowana na lokalnym dysku twardym</String>
556 <String Id="UITextMenuAllNetwork" Overridable="yes">Cała funkcja zostanie zainstalowana do uruchamiania z sieci</String>
557 <String Id="UITextMenuCD" Overridable="yes">Zostanie zainstalowana do uruchamiania z dysku CD</String>
558 <String Id="UITextMenuLocal" Overridable="yes">Zostanie zainstalowana na lokalnym dysku twardym</String>
559 <String Id="UITextMenuNetwork" Overridable="yes">Zostanie zainstalowana do uruchamiania z sieci</String>
560 <String Id="UITextNewFolder" Overridable="yes">Folder|Nowy folder</String>
561 <String Id="UITextScriptInProgress" Overridable="yes">Trwa zbieranie wymaganych informacji...</String>
562 <String Id="UITextSelAbsentAbsent" Overridable="yes">Ta funkcja pozostanie niezainstalowana</String>
563 <String Id="UITextSelAbsentAdvertise" Overridable="yes">Ta funkcja zostanie ustawiona do zainstalowania w razie potrzeby</String>
564 <String Id="UITextSelAbsentCD" Overridable="yes">Ta funkcja zostanie zainstalowana do uruchamiania z dysku CD</String>
565 <String Id="UITextSelAbsentLocal" Overridable="yes">Ta funkcja zostanie zainstalowana na lokalnym dysku twardym</String>
566 <String Id="UITextSelAbsentNetwork" Overridable="yes">Ta funkcja zostanie zainstalowana do uruchamiania z sieci</String>
567 <String Id="UITextSelAdvertiseAbsent" Overridable="yes">Ta funkcja stanie się niedostępna</String>
568 <String Id="UITextSelAdvertiseAdvertise" Overridable="yes">Zostanie zainstalowana w razie potrzeby</String>
569 <String Id="UITextSelAdvertiseCD" Overridable="yes">Ta funkcja będzie dostępna do uruchamiania z dysku CD</String>
570 <String Id="UITextSelAdvertiseLocal" Overridable="yes">Ta funkcja zostanie zainstalowana na lokalnym dysku twardym</String>
571 <String Id="UITextSelAdvertiseNetwork" Overridable="yes">Ta funkcja będzie dostępna do uruchamiania z sieci</String>
572 <String Id="UITextSelCDAbsent" Overridable="yes">Ta funkcja zostanie całkowicie odinstalowana, nie będzie można uruchamiać jej z dysku CD</String>
573 <String Id="UITextSelCDAdvertise" Overridable="yes">Stan tej funkcji zostanie zmieniony z uruchamiania z dysku CD na zainstalowanie w razie potrzeby</String>
574 <String Id="UITextSelCDCD" Overridable="yes">Ta funkcja będzie dalej uruchamiana z dysku CD</String>
575 <String Id="UITextSelCDLocal" Overridable="yes">Stan tej funkcji zostanie zmieniony z uruchamiania z dysku CD na zainstalowanie na lokalnym dysku twardym</String>
576 <String Id="UITextSelChildCostNeg" Overridable="yes">Ta funkcja zwolni [1] miejsca na dysku twardym.</String>
577 <String Id="UITextSelChildCostPos" Overridable="yes">Ta funkcja wymaga [1] miejsca na dysku twardym.</String>
578 <String Id="UITextSelCostPending" Overridable="yes">Trwa kompilowanie kosztu dla tej funkcji...</String>
579 <String Id="UITextSelLocalAbsent" Overridable="yes">Ta funkcja zostanie całkowicie usunięta</String>
580 <String Id="UITextSelLocalAdvertise" Overridable="yes">Ta funkcja zostanie usunięta z lokalnego dysku twardego, ale zostanie ustawiona do zainstalowania w razie potrzeby</String>
581 <String Id="UITextSelLocalCD" Overridable="yes">Ta funkcja zostanie usunięta z lokalnego dysku twardego, ale nadal będzie można uruchamiać ją z dysku CD</String>
582 <String Id="UITextSelLocalLocal" Overridable="yes">Ta funkcja pozostanie na lokalnym dysku twardym</String>
583 <String Id="UITextSelLocalNetwork" Overridable="yes">Ta funkcja zostanie usunięta z lokalnego dysku twardego, ale nadal będzie można uruchamiać ją z sieci</String>
584 <String Id="UITextSelNetworkAbsent" Overridable="yes">Ta funkcja zostanie odinstalowana całkowicie, nie będzie można uruchamiać jej z sieci</String>
585 <String Id="UITextSelNetworkAdvertise" Overridable="yes">Stan tej funkcji zostanie zmieniony z uruchamiania z sieci na zainstalowanie w razie potrzeby</String>
586 <String Id="UITextSelNetworkLocal" Overridable="yes">Stan tej funkcji zostanie zmieniony z uruchamiania z sieci na zainstalowanie na lokalnym dysku twardym</String>
587 <String Id="UITextSelNetworkNetwork" Overridable="yes">Ta funkcja pozostanie uruchamiana z sieci</String>
588 <String Id="UITextSelParentCostNegNeg" Overridable="yes">Ta funkcja zwolni [1] na dysku twardym. Wybrano w niej [2] z [3] podfunkcji. Wybrane podfunkcje zwolnią [4] na dysku twardym.</String>
589 <String Id="UITextSelParentCostNegPos" Overridable="yes">Ta funkcja zwolni [1] na dysku twardym. Wybrano w niej [2] z [3] podfunkcji. Wybrane podfunkcje wymagają [4] na dysku twardym.</String>
590 <String Id="UITextSelParentCostPosNeg" Overridable="yes">Ta funkcja wymaga [1] na dysku twardym. Wybrano w niej [2] z [3] podfunkcji. Wybrane podfunkcje zwolnią [4] na dysku twardym.</String>
591 <String Id="UITextSelParentCostPosPos" Overridable="yes">Ta funkcja wymaga [1] na dysku twardym. Wybrano w niej [2] z [3] podfunkcji. Wybrane podfunkcje wymagają [4] na dysku twardym.</String>
592 <String Id="UITextTimeRemaining" Overridable="yes">Pozostało czasu: {[1] min }{[2] s}</String>
593 <String Id="UITextVolumeCostAvailable" Overridable="yes">Dostępne</String>
594 <String Id="UITextVolumeCostDifference" Overridable="yes">Różnica</String>
595 <String Id="UITextVolumeCostRequired" Overridable="yes">Wymagane</String>
596 <String Id="UITextVolumeCostSize" Overridable="yes">Rozmiar dysku</String>
597 <String Id="UITextVolumeCostVolume" Overridable="yes">Wolumin</String>
598</WixLocalization>
diff --git a/src/ext/UI/wixlib/WixUI_pt-BR.wxl b/src/ext/UI/wixlib/WixUI_pt-BR.wxl
new file mode 100644
index 00000000..b8668e28
--- /dev/null
+++ b/src/ext/UI/wixlib/WixUI_pt-BR.wxl
@@ -0,0 +1,603 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3
4
5<WixLocalization Culture="pt-br" Codepage="1252" xmlns="http://wixtoolset.org/schemas/v4/wxl">
6 <UI Dialog="ErrorDlg" Control="R" Width="80" />
7 <UI Dialog="FilesInUse" Control="Retry" X="280" Width="80" />
8 <UI Dialog="FilesInUse" Control="Ignore" X="211" />
9 <UI Dialog="FilesInUse" Control="Exit" X="142" />
10
11 <String Id="WixUIBack" Overridable="yes">&amp;Voltar</String>
12 <String Id="WixUINext" Overridable="yes">&amp;Avançar</String>
13 <String Id="WixUICancel" Overridable="yes">Cancelar</String>
14 <String Id="WixUIFinish" Overridable="yes">&amp;Concluir</String>
15 <String Id="WixUIRetry" Overridable="yes">Tenta&amp;r Novamente</String>
16 <String Id="WixUIIgnore" Overridable="yes">&amp;Ignorar</String>
17 <String Id="WixUIYes" Overridable="yes">&amp;Sim</String>
18 <String Id="WixUINo" Overridable="yes">&amp;Não</String>
19 <String Id="WixUIOK" Overridable="yes">OK</String>
20 <String Id="WixUIPrint" Overridable="yes">Im&amp;primir</String>
21
22 <String Id="AdvancedWelcomeEulaDlg_Title" Overridable="yes">Instalação do [ProductName]</String>
23 <String Id="AdvancedWelcomeEulaDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
24 <String Id="AdvancedWelcomeEulaDlgTitle" Overridable="yes">{\WixUI_Font_Title}Leia o Contrato de Licença do [ProductName]</String>
25 <String Id="AdvancedWelcomeEulaDlgLicenseAcceptedCheckBox" Overridable="yes">&amp;Aceito os termos do Contrato de Licença</String>
26 <String Id="AdvancedWelcomeEulaDlgDescriptionPerMachine" Overridable="yes">Clique em Instalar para instalar o produto com as opções padrão para todos os usuários. Clique em Avançado para alterar as opções de instalação.</String>
27 <String Id="AdvancedWelcomeEulaDlgDescriptionPerUser" Overridable="yes">Clique em Instalar para instalar o produto com as opções padrão apenas para você. Clique em Avançado para alterar as opções de instalação.</String>
28 <String Id="AdvancedWelcomeEulaDlgInstall" Overridable="yes">&amp;Instalar</String>
29 <String Id="AdvancedWelcomeEulaDlgAdvanced" Overridable="yes">A&amp;vançado</String>
30 <String Id="Advanced_Font_Normal_Size" Overridable="yes">8</String>
31 <String Id="Advanced_Font_Bigger_Size" Overridable="yes">12</String>
32 <String Id="Advanced_Font_Title_Size" Overridable="yes">9</String>
33 <String Id="Advanced_Font_Emphasized_Size" Overridable="yes">8</String>
34 <String Id="Advanced_Font_FaceName" Overridable="yes">Tahoma</String>
35
36 <String Id="BrowseDlg_Title" Overridable="yes">Instalação do [ProductName]</String>
37 <String Id="BrowseDlgComboLabel" Overridable="yes">&amp;Examinar:</String>
38 <String Id="BrowseDlgWixUI_Bmp_Up" Overridable="yes">WixUI_Bmp_Up</String>
39 <String Id="BrowseDlgWixUI_Bmp_UpTooltip" Overridable="yes">Um nível acima</String>
40 <String Id="BrowseDlgNewFolder" Overridable="yes">WixUI_Bmp_New</String>
41 <String Id="BrowseDlgNewFolderTooltip" Overridable="yes">Criar uma nova pasta</String>
42 <String Id="BrowseDlgPathLabel" Overridable="yes">&amp;Nome da pasta:</String>
43 <String Id="BrowseDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
44 <String Id="BrowseDlgDescription" Overridable="yes">Procurar a pasta de destino</String>
45 <String Id="BrowseDlgTitle" Overridable="yes">{\WixUI_Font_Title}Alterar pasta de destino</String>
46
47 <String Id="CancelDlg_Title" Overridable="yes">Instalação do [ProductName]</String>
48 <String Id="CancelDlgText" Overridable="yes">Tem certeza de que deseja cancelar a instalação do [ProductName]?</String>
49 <String Id="CancelDlgIcon" Overridable="yes">WixUI_Ico_Info</String>
50 <String Id="CancelDlgIconTooltip" Overridable="yes">Ícone de informações</String>
51
52 <String Id="CustomizeDlg_Title" Overridable="yes">Instalação do [ProductName]</String>
53 <String Id="CustomizeDlgTree" Overridable="yes">Árvore de seleções</String>
54 <String Id="CustomizeDlgBrowse" Overridable="yes">P&amp;rocurar...</String>
55 <String Id="CustomizeDlgReset" Overridable="yes">Re&amp;definir</String>
56 <String Id="CustomizeDlgDiskCost" Overridable="yes">&amp;Uso do Disco</String>
57 <String Id="CustomizeDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
58 <String Id="CustomizeDlgText" Overridable="yes">Clique nos ícones da árvore abaixo para alterar a forma como os recursos serão instalados.</String>
59 <String Id="CustomizeDlgDescription" Overridable="yes">Selecione de que forma os recursos devem ser instalados.</String>
60 <String Id="CustomizeDlgTitle" Overridable="yes">{\WixUI_Font_Title}Instalação Personalizada</String>
61 <String Id="CustomizeDlgItemDescription" Overridable="yes">CustomizeDlgItemDescription-CustomizeDlgItemDescription</String>
62 <String Id="CustomizeDlgItemSize" Overridable="yes">CustomizeDlgItemSize-CustomizeDlgItemSize</String>
63 <String Id="CustomizeDlgLocation" Overridable="yes">CustomizeDlgLocation-CustomizeDlgLocation</String>
64 <String Id="CustomizeDlgLocationLabel" Overridable="yes">Local:</String>
65
66 <String Id="DiskCostDlg_Title" Overridable="yes">Instalação do [ProductName]</String>
67 <String Id="DiskCostDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
68 <String Id="DiskCostDlgText" Overridable="yes">Os volumes realçados não possuem espaço em disco suficiente disponível para os recursos selecionados. Você pode remover arquivos dos volumes realçados, instalar menos recursos ou selecionar unidades de destino diferentes.</String>
69 <String Id="DiskCostDlgDescription" Overridable="yes">Espaço em disco necessário para a instalação dos recursos selecionados.</String>
70 <String Id="DiskCostDlgTitle" Overridable="yes">{\WixUI_Font_Title}Requisitos de Espaço em Disco</String>
71 <String Id="DiskCostDlgVolumeList" Overridable="yes">{120}{70}{70}{70}{70}</String>
72
73 <String Id="ErrorDlg_Title" Overridable="yes">Instalação do [ProductName]</String>
74 <String Id="ErrorDlgErrorText" Overridable="yes">Texto informativo</String>
75 <String Id="ErrorDlgErrorIcon" Overridable="yes">WixUI_Ico_Info</String>
76 <String Id="ErrorDlgErrorIconTooltip" Overridable="yes">Ícone de informações</String>
77
78 <String Id="ExitDialog_Title" Overridable="yes">Instalação do [ProductName]</String>
79 <String Id="ExitDialogBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
80 <String Id="ExitDialogDescription" Overridable="yes">Clique no botão Concluir para sair do Assistente para Instalação.</String>
81 <String Id="ExitDialogTitle" Overridable="yes">{\WixUI_Font_Bigger}Concluído o Assistente para Instalação do [ProductName]</String>
82
83 <String Id="FatalError_Title" Overridable="yes">Instalação do [ProductName]</String>
84 <String Id="FatalErrorBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
85 <String Id="FatalErrorTitle" Overridable="yes">{\WixUI_Font_Bigger}O Assistente para Instalação do [ProductName] foi encerrado prematuramente</String>
86 <String Id="FatalErrorDescription1" Overridable="yes">O Assistente para Instalação do [ProductName] foi encerrado prematuramente devido a um erro. O sistema não foi modificado. Para instalar este programa mais tarde, execute novamente o Assistente para Instalação.</String>
87 <String Id="FatalErrorDescription2" Overridable="yes">Clique no botão Concluir para sair do Assistente para Instalação.</String>
88
89 <String Id="FeaturesDlg_Title" Overridable="yes">Instalação do [ProductName]</String>
90 <String Id="FeaturesDlgTree" Overridable="yes">Recursos do produto</String>
91 <String Id="FeaturesDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
92 <String Id="FeaturesDlgDescription" Overridable="yes">Selecione de que forma os recursos devem ser instalados.</String>
93 <String Id="FeaturesDlgTitle" Overridable="yes">{\WixUI_Font_Title}Recursos do Produto</String>
94 <String Id="FeaturesDlgItemDescription" Overridable="yes">FeaturesDlgItemDescription</String>
95 <String Id="FeaturesDlgItemSize" Overridable="yes">FeaturesDlgItemSize</String>
96 <String Id="FeaturesDlgInstall" Overridable="yes">&amp;Instalar</String>
97 <String Id="FeaturesDlgChange" Overridable="yes">&amp;Alterar</String>
98
99 <String Id="FilesInUse_Title" Overridable="yes">Instalação do [ProductName]</String>
100 <String Id="FilesInUseExit" Overridable="yes">Sai&amp;r</String>
101 <String Id="FilesInUseBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
102 <String Id="FilesInUseText" Overridable="yes">Os aplicativos a seguir estão usando arquivos que precisam ser atualizados por esta instalação. Feche os aplicativos e clique em Tenta&amp;r Novamente para continuar a instalação ou em Sair para encerrá-la.</String>
103 <String Id="FilesInUseDescription" Overridable="yes">Alguns arquivos que precisam ser atualizados estão em uso.</String>
104 <String Id="FilesInUseTitle" Overridable="yes">{\WixUI_Font_Title}Arquivos em Uso</String>
105
106 <String Id="InstallDirDlg_Title" Overridable="yes">Instalação do [ProductName]</String>
107 <String Id="InstallDirDlgChange" Overridable="yes">A&amp;lterar...</String>
108 <String Id="InstallDirDlgTitle" Overridable="yes">{\WixUI_Font_Title}Pasta de Destino</String>
109 <String Id="InstallDirDlgDescription" Overridable="yes">Clique em Avançar para instalar na pasta padrão ou clique em Alterar para escolher outra.</String>
110 <String Id="InstallDirDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
111 <String Id="InstallDirDlgFolderLabel" Overridable="yes">Instalar o [ProductName] em:</String>
112
113 <String Id="InstallScopeDlg_Title" Overridable="yes">Instalação do [ProductName]</String>
114 <String Id="InstallScopeDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
115 <String Id="InstallScopeDlgDescription" Overridable="yes">Escolha o escopo e a pasta de instalação</String>
116 <String Id="InstallScopeDlgTitle" Overridable="yes">{\WixUI_Font_Title}Escopo de Instalação</String>
117 <String Id="InstallScopeDlgPerUser" Overridable="yes">{\WixUI_Font_Emphasized}Instalar ape&amp;nas para você ([LogonUser])</String>
118 <String Id="InstallScopeDlgPerUserDescription" Overridable="yes">O [ProductName] será instalado em uma pasta por usuário e estará disponível apenas para a sua conta de usuário. Não é necessário ter privilégios de Administrador local.</String>
119 <String Id="InstallScopeDlgNoPerUserDescription" Overridable="yes">O [ProductName] não oferece suporte à instalação por usuário.</String>
120 <String Id="InstallScopeDlgPerMachine" Overridable="yes">{\WixUI_Font_Emphasized}Instalar para todos os usuários deste co&amp;mputador</String>
121 <String Id="InstallScopeDlgPerMachineDescription" Overridable="yes">O [ProductName] será instalado em uma pasta por computador por padrão e estará disponível para todos os usuários. Você pode alterar a pasta de instalação padrão. É necessário ter privilégios de Administrador local.</String>
122 <String Id="InstallScopeDlgFolderLabel" Overridable="yes">Pa&amp;sta de instalação:</String>
123 <String Id="InstallScopeDlgChange" Overridable="yes">A&amp;lterar...</String>
124
125 <String Id="InvalidDirDlg_Title" Overridable="yes">Instalação do [ProductName]</String>
126 <String Id="InvalidDirDlgText" Overridable="yes">O diretório de instalação deve estar em um disco rígido local.</String>
127 <String Id="InvalidDirDlgIcon" Overridable="yes">WixUI_Ico_Info</String>
128 <String Id="InvalidDirDlgIconTooltip" Overridable="yes">Ícone de informações</String>
129
130 <String Id="LicenseAgreementDlg_Title" Overridable="yes">Instalação do [ProductName]</String>
131 <String Id="LicenseAgreementDlgLicenseAcceptedCheckBox" Overridable="yes">&amp;Aceito os termos do Contrato de Licença</String>
132 <String Id="LicenseAgreementDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
133 <String Id="LicenseAgreementDlgDescription" Overridable="yes">Leia atenciosamente o contrato de licença a seguir</String>
134 <String Id="LicenseAgreementDlgTitle" Overridable="yes">{\WixUI_Font_Title}Contrato de Licença de Usuário Final</String>
135
136 <String Id="MaintenanceTypeDlg_Title" Overridable="yes">Instalação do [ProductName]</String>
137 <String Id="MaintenanceTypeDlgChangeButton" Overridable="yes">&amp;Alterar</String>
138 <String Id="MaintenanceTypeDlgChangeButtonTooltip" Overridable="yes">Alterar Instalação</String>
139 <String Id="MaintenanceTypeDlgRepairButton" Overridable="yes">Re&amp;parar</String>
140 <String Id="MaintenanceTypeDlgRepairButtonTooltip" Overridable="yes">Reparar Instalação</String>
141 <String Id="MaintenanceTypeDlgRemoveButton" Overridable="yes">&amp;Remover</String>
142 <String Id="MaintenanceTypeDlgRemoveButtonTooltip" Overridable="yes">Remover Instalação</String>
143 <String Id="MaintenanceTypeDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
144 <String Id="MaintenanceTypeDlgDescription" Overridable="yes">Selecione a operação que você deseja executar.</String>
145 <String Id="MaintenanceTypeDlgTitle" Overridable="yes">{\WixUI_Font_Title}Alterar, reparar ou remover a instalação</String>
146 <String Id="MaintenanceTypeDlgChangeText" Overridable="yes">Permite que você altere a forma como os recursos são instalados.</String>
147 <String Id="MaintenanceTypeDlgChangeDisabledText" Overridable="yes">O [ProductName] não tem nenhum recurso que possa ser selecionado de maneira independente.</String>
148 <String Id="MaintenanceTypeDlgRemoveText" Overridable="yes">Remove o [ProductName] do computador.</String>
149 <String Id="MaintenanceTypeDlgRemoveDisabledText" Overridable="yes">Não é possível remover o [ProductName].</String>
150 <String Id="MaintenanceTypeDlgRepairText" Overridable="yes">Repara erros da instalação mais recente, corrigindo arquivos, atalhos e entradas do Registro ausentes ou corrompidos.</String>
151 <String Id="MaintenanceTypeDlgRepairDisabledText" Overridable="yes">Não é possível reparar o [ProductName].</String>
152
153 <String Id="MaintenanceWelcomeDlg_Title" Overridable="yes">Instalação do [ProductName]</String>
154 <String Id="MaintenanceWelcomeDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
155 <String Id="MaintenanceWelcomeDlgDescription" Overridable="yes">O Assistente para Instalação permite alterar a forma como os recursos do [ProductName] são instalados ou removê-lo do computador. Clique em Avançar para continuar ou em Cancelar para sair do Assistente para Instalação.</String>
156 <String Id="MaintenanceWelcomeDlgTitle" Overridable="yes">{\WixUI_Font_Bigger}Bem-vindo ao Assistente para Instalação do [ProductName]</String>
157
158 <String Id="MsiRMFilesInUse_Title" Overridable="yes">Instalação do [ProductName]</String>
159 <String Id="MsiRMFilesInUseBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
160 <String Id="MsiRMFilesInUseText" Overridable="yes">Os aplicativos a seguir estão usando arquivos que precisam ser atualizados por esta instalação. Você pode permitir que o Assistente para Instalação feche esses aplicativos e tente reiniciá-los ou reinicializar o computador mais tarde.</String>
161 <String Id="MsiRMFilesInUseDescription" Overridable="yes">Alguns arquivos que precisam ser atualizados estão em uso.</String>
162 <String Id="MsiRMFilesInUseTitle" Overridable="yes">{\WixUI_Font_Title}Arquivos em Uso</String>
163 <String Id="MsiRMFilesInUseUseRM" Overridable="yes">&amp;Fechar os aplicativos e tentar reiniciá-los.</String>
164 <String Id="MsiRMFilesInUseDontUseRM" Overridable="yes">&amp;Não fechar os aplicativos. Será necessário reinicializar.</String>
165
166 <String Id="OutOfDiskDlg_Title" Overridable="yes">Instalação do [ProductName]</String>
167 <String Id="OutOfDiskDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
168 <String Id="OutOfDiskDlgText" Overridable="yes">Os volumes realçados não têm espaço em disco suficiente disponível para os recursos selecionados. Você pode remover alguns arquivos dos volumes realçados, instalar menos recursos ou selecionar outra unidade de destino.</String>
169 <String Id="OutOfDiskDlgDescription" Overridable="yes">O espaço em disco necessário para a instalação excede o espaço em disco disponível.</String>
170 <String Id="OutOfDiskDlgTitle" Overridable="yes">{\WixUI_Font_Title}Espaço em Disco Insuficiente</String>
171 <String Id="OutOfDiskDlgVolumeList" Overridable="yes">{120}{70}{70}{70}{70}</String>
172
173 <String Id="OutOfRbDiskDlg_Title" Overridable="yes">Instalação do [ProductName]</String>
174 <String Id="OutOfRbDiskDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
175 <String Id="OutOfRbDiskDlgText" Overridable="yes">Os volumes realçados não têm espaço em disco suficiente disponível para os recursos selecionados. Você pode remover alguns arquivos dos volumes realçados, instalar menos recursos ou selecionar outra unidade de destino.</String>
176 <String Id="OutOfRbDiskDlgDescription" Overridable="yes">O espaço em disco necessário para a instalação excede o espaço em disco disponível.</String>
177 <String Id="OutOfRbDiskDlgTitle" Overridable="yes">{\WixUI_Font_Title}Espaço em Disco Insuficiente</String>
178 <String Id="OutOfRbDiskDlgVolumeList" Overridable="yes">{120}{70}{70}{70}{70}</String>
179 <String Id="OutOfRbDiskDlgText2" Overridable="yes">Alternativamente, é possível desabilitar a funcionalidade de reversão do instalador. Isso evita que o instalador restaure seu computador ao estado original quando a instalação é interrompida por qualquer motivo. Clique em Sim se quiser assumir o risco de desabilitar a reversão.</String>
180
181 <String Id="PrepareDlg_Title" Overridable="yes">Instalação do [ProductName]</String>
182 <String Id="PrepareDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
183 <String Id="PrepareDlgDescription" Overridable="yes">Aguarde enquanto o Assistente para Instalação se prepara para orientar você durante a instalação.</String>
184 <String Id="PrepareDlgTitle" Overridable="yes">{\WixUI_Font_Bigger}Bem-vindo ao Assistente para Instalação do [ProductName]</String>
185
186 <String Id="ProgressDlg_Title" Overridable="yes">Instalação do [ProductName]</String>
187 <String Id="ProgressDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
188 <String Id="ProgressDlgTextInstalling" Overridable="yes">Aguarde enquanto o Assistente para Instalação instala o [ProductName].</String>
189 <String Id="ProgressDlgTitleInstalling" Overridable="yes">{\WixUI_Font_Title}Instalando o [ProductName]</String>
190 <String Id="ProgressDlgTextChanging" Overridable="yes">Aguarde enquanto o Assistente para Instalação altera o [ProductName].</String>
191 <String Id="ProgressDlgTitleChanging" Overridable="yes">{\WixUI_Font_Title}Alterando o [ProductName]</String>
192 <String Id="ProgressDlgTextRepairing" Overridable="yes">Aguarde enquanto o Assistente para Instalação repara o [ProductName].</String>
193 <String Id="ProgressDlgTitleRepairing" Overridable="yes">{\WixUI_Font_Title}Reparando o [ProductName]</String>
194 <String Id="ProgressDlgTextRemoving" Overridable="yes">Aguarde enquanto o Assistente para Instalação remove o [ProductName].</String>
195 <String Id="ProgressDlgTitleRemoving" Overridable="yes">{\WixUI_Font_Title}Removendo o [ProductName]</String>
196 <String Id="ProgressDlgTextUpdating" Overridable="yes">Aguarde enquanto o Assistente para Instalação atualiza o [ProductName].</String>
197 <String Id="ProgressDlgTitleUpdating" Overridable="yes">{\WixUI_Font_Title}Atualizando o [ProductName]</String>
198 <String Id="ProgressDlgProgressBar" Overridable="yes">Andamento da operação</String>
199 <String Id="ProgressDlgStatusLabel" Overridable="yes">Status:</String>
200
201 <String Id="ResumeDlg_Title" Overridable="yes">Instalação do [ProductName]</String>
202 <String Id="ResumeDlgInstall" Overridable="yes">&amp;Instalar</String>
203 <String Id="ResumeDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
204 <String Id="ResumeDlgDescription" Overridable="yes">O Assistente para Instalação concluirá a instalação do [ProductName] no seu computador. Clique em Instalar para continuar ou em Cancelar para sair do Assistente para Instalação.</String>
205 <String Id="ResumeDlgTitle" Overridable="yes">{\WixUI_Font_Bigger}Continuando o Assistente para Instalação do [ProductName]</String>
206
207 <String Id="SetupTypeDlg_Title" Overridable="yes">Instalação do [ProductName]</String>
208 <String Id="SetupTypeDlgTypicalButton" Overridable="yes">&amp;Típica</String>
209 <String Id="SetupTypeDlgTypicalButtonTooltip" Overridable="yes">Instalação Típica</String>
210 <String Id="SetupTypeDlgCustomButton" Overridable="yes">P&amp;ersonalizada</String>
211 <String Id="SetupTypeDlgCustomButtonTooltip" Overridable="yes">Instalação Personalizada</String>
212 <String Id="SetupTypeDlgCompleteButton" Overridable="yes">C&amp;ompleta</String>
213 <String Id="SetupTypeDlgCompleteButtonTooltip" Overridable="yes">Instalação Completa</String>
214 <String Id="SetupTypeDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
215 <String Id="SetupTypeDlgTitle" Overridable="yes">{\WixUI_Font_Title}Escolher o Tipo de Instalação</String>
216 <String Id="SetupTypeDlgDescription" Overridable="yes">Escolha o tipo de instalação mais adequado às suas necessidades</String>
217 <String Id="SetupTypeDlgTypicalText" Overridable="yes">Instala os recursos mais comuns do programa. Recomendável para a maioria dos usuários.</String>
218 <String Id="SetupTypeDlgCustomText" Overridable="yes">Permite que os usuários escolham os recursos a serem instalados e onde devem ser instalados. Recomendável para usuários avançados.</String>
219 <String Id="SetupTypeDlgCompleteText" Overridable="yes">Todos os recursos do programa serão instalados. É necessário mais espaço em disco.</String>
220
221 <String Id="UserExit_Title" Overridable="yes">Instalação do [ProductName]</String>
222 <String Id="UserExitBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
223 <String Id="UserExitTitle" Overridable="yes">{\WixUI_Font_Bigger}O Assistente para Instalação do [ProductName] foi interrompido</String>
224 <String Id="UserExitDescription1" Overridable="yes">A instalação do [ProductName] foi interrompida. O sistema não foi modificado. Para instalar este programa mais tarde, execute a instalação novamente.</String>
225 <String Id="UserExitDescription2" Overridable="yes">Clique no botão Concluir para sair do Assistente para Instalação.</String>
226
227 <String Id="VerifyReadyDlg_Title" Overridable="yes">Instalação do [ProductName]</String>
228 <String Id="VerifyReadyDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
229 <String Id="VerifyReadyDlgInstall" Overridable="yes">&amp;Instalar</String>
230 <String Id="VerifyReadyDlgInstallText" Overridable="yes">Clique em Instalar para iniciar a instalação. Clique em Voltar para rever ou alterar as configurações de instalação. Clique em Cancelar para sair do assistente.</String>
231 <String Id="VerifyReadyDlgInstallTitle" Overridable="yes">{\WixUI_Font_Title}Pronto para instalar o [ProductName]</String>
232 <String Id="VerifyReadyDlgChange" Overridable="yes">&amp;Alterar</String>
233 <String Id="VerifyReadyDlgChangeText" Overridable="yes">Clique em Alterar para iniciar a instalação. Clique em Voltar para rever ou alterar as configurações de instalação. Clique em Cancelar para sair do assistente.</String>
234 <String Id="VerifyReadyDlgChangeTitle" Overridable="yes">{\WixUI_Font_Title}Pronto para alterar o [ProductName]</String>
235 <String Id="VerifyReadyDlgRepair" Overridable="yes">Re&amp;parar</String>
236 <String Id="VerifyReadyDlgRepairText" Overridable="yes">Clique em Reparar para reparar a instalação do [ProductName]. Clique em Voltar para rever ou alterar as configurações de instalação. Clique em Cancelar para sair do assistente.</String>
237 <String Id="VerifyReadyDlgRepairTitle" Overridable="yes">{\WixUI_Font_Title}Pronto para reparar o [ProductName]</String>
238 <String Id="VerifyReadyDlgRemove" Overridable="yes">&amp;Remover</String>
239 <String Id="VerifyReadyDlgRemoveText" Overridable="yes">Clique em Remover para remover o [ProductName] do seu computador. Clique em Voltar para rever ou alterar as configurações de instalação. Clique em Cancelar para sair do assistente.</String>
240 <String Id="VerifyReadyDlgRemoveTitle" Overridable="yes">{\WixUI_Font_Title}Pronto para remover o [ProductName]</String>
241 <String Id="VerifyReadyDlgUpdate" Overridable="yes">At&amp;ualizar</String>
242 <String Id="VerifyReadyDlgUpdateText" Overridable="yes">Clique em Atualizar para atualizar o [ProductName] no seu computador. Clique em Voltar para rever ou alterar as configurações de instalação. Clique em Cancelar para sair do assistente.</String>
243 <String Id="VerifyReadyDlgUpdateTitle" Overridable="yes">{\WixUI_Font_Title}Pronto para atualizar o [ProductName]</String>
244
245 <String Id="WaitForCostingDlg_Title" Overridable="yes">Instalação do [ProductName]</String>
246 <String Id="WaitForCostingDlgReturn" Overridable="yes">&amp;Retornar</String>
247 <String Id="WaitForCostingDlgText" Overridable="yes">Aguarde enquanto o instalador determina os requisitos de espaço em disco.</String>
248 <String Id="WaitForCostingDlgIcon" Overridable="yes">WixUI_Ico_Exclam</String>
249 <String Id="WaitForCostingDlgIconTooltip" Overridable="yes">Ícone de exclamação</String>
250
251 <String Id="WelcomeDlg_Title" Overridable="yes">Instalação do [ProductName]</String>
252 <String Id="WelcomeDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
253 <String Id="WelcomeDlgDescription" Overridable="yes">O Assistente para Instalação vai instalar o [ProductName] no seu computador. Clique em Avançar para continuar ou em Cancelar para sair do Assistente para Instalação.</String>
254 <String Id="WelcomeUpdateDlgDescriptionUpdate" Overridable="yes">O Assistente para Instalação atualizará o [ProductName] no seu computador. Clique em Avançar para continuar ou em Cancelar para sair do Assistente para Instalação.</String>
255 <String Id="WelcomeDlgTitle" Overridable="yes">{\WixUI_Font_Bigger}Bem-vindo ao Assistente para Instalação do [ProductName]</String>
256
257 <String Id="WelcomeEulaDlg_Title" Overridable="yes">Instalação do [ProductName]</String>
258 <String Id="WelcomeEulaDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
259 <String Id="WelcomeEulaDlgLicenseAcceptedCheckBox" Overridable="yes">&amp;Aceito os termos do Contrato de Licença</String>
260 <String Id="WelcomeEulaDlgInstall" Overridable="yes">&amp;Instalar</String>
261 <String Id="WelcomeEulaDlgUpdate" Overridable="yes">At&amp;ualizar</String>
262 <String Id="WelcomeEulaDlgTitle" Overridable="yes">{\WixUI_Font_Title}Leia o Contrato de Licença do [ProductName]</String>
263
264 <String Id="ProgressTextInstallValidate" Overridable="yes">Validando a instalação</String>
265 <String Id="ProgressTextInstallFiles" Overridable="yes">Copiando novos arquivos</String>
266 <String Id="ProgressTextInstallFilesTemplate" Overridable="yes">Arquivo: [1], Diretório: [9], Tamanho: [6]</String>
267 <String Id="ProgressTextInstallAdminPackage" Overridable="yes">Copiando arquivos de instalação de rede</String>
268 <String Id="ProgressTextInstallAdminPackageTemplate" Overridable="yes">Arquivo: [1], Diretório: [9], Tamanho: [6]</String>
269 <String Id="ProgressTextFileCost" Overridable="yes">Calculando requisitos de espaço</String>
270 <String Id="ProgressTextCostInitialize" Overridable="yes">Calculando requisitos de espaço</String>
271 <String Id="ProgressTextCostFinalize" Overridable="yes">Calculando requisitos de espaço</String>
272 <String Id="ProgressTextCreateShortcuts" Overridable="yes">Criando atalhos</String>
273 <String Id="ProgressTextCreateShortcutsTemplate" Overridable="yes">Atalho: [1]</String>
274 <String Id="ProgressTextPublishComponents" Overridable="yes">Publicando Componentes Qualificados</String>
275 <String Id="ProgressTextPublishComponentsTemplate" Overridable="yes">ID do Componente: [1], Qualificador: [2]</String>
276 <String Id="ProgressTextPublishFeatures" Overridable="yes">Publicando Recursos do Produto</String>
277 <String Id="ProgressTextPublishFeaturesTemplate" Overridable="yes">Recurso: [1]</String>
278 <String Id="ProgressTextPublishProduct" Overridable="yes">Publicando informações do produto</String>
279 <String Id="ProgressTextRegisterClassInfo" Overridable="yes">Registrando servidores de Classes</String>
280 <String Id="ProgressTextRegisterClassInfoTemplate" Overridable="yes">ID da Classe: [1]</String>
281 <String Id="ProgressTextRegisterExtensionInfo" Overridable="yes">Registrando servidores de extensão</String>
282 <String Id="ProgressTextRegisterExtensionInfoTemplate" Overridable="yes">Extensão: [1]</String>
283 <String Id="ProgressTextRegisterMIMEInfo" Overridable="yes">Registrando informações de MIME</String>
284 <String Id="ProgressTextRegisterMIMEInfoTemplate" Overridable="yes">Tipo de Conteúdo MIME: [1], Extensão: [2]</String>
285 <String Id="ProgressTextRegisterProgIdInfo" Overridable="yes">Registrando identificadores de programas</String>
286 <String Id="ProgressTextRegisterProgIdInfoTemplate" Overridable="yes">ProgId: [1]</String>
287 <String Id="ProgressTextAllocateRegistrySpace" Overridable="yes">Alocando espaço no Registro</String>
288 <String Id="ProgressTextAllocateRegistrySpaceTemplate" Overridable="yes">Espaço livre: [1]</String>
289 <String Id="ProgressTextAppSearch" Overridable="yes">Procurando aplicativos instalados</String>
290 <String Id="ProgressTextAppSearchTemplate" Overridable="yes">Propriedade: [1], Assinatura: [2]</String>
291 <String Id="ProgressTextBindImage" Overridable="yes">Associando executáveis</String>
292 <String Id="ProgressTextBindImageTemplate" Overridable="yes">Arquivo: [1]</String>
293 <String Id="ProgressTextCCPSearch" Overridable="yes">Procurando produtos qualificados</String>
294 <String Id="ProgressTextCreateFolders" Overridable="yes">Criando pastas</String>
295 <String Id="ProgressTextCreateFoldersTemplate" Overridable="yes">Pasta: [1]</String>
296 <String Id="ProgressTextDeleteServices" Overridable="yes">Excluindo serviços</String>
297 <String Id="ProgressTextDeleteServicesTemplate" Overridable="yes">Serviço: [1]</String>
298 <String Id="ProgressTextDuplicateFiles" Overridable="yes">Criando arquivos duplicados</String>
299 <String Id="ProgressTextDuplicateFilesTemplate" Overridable="yes">Arquivo: [1], Diretório: [9], Tamanho: [6]</String>
300 <String Id="ProgressTextFindRelatedProducts" Overridable="yes">Procurando aplicativos relacionados</String>
301 <String Id="ProgressTextFindRelatedProductsTemplate" Overridable="yes">Aplicativo encontrado: [1]</String>
302 <String Id="ProgressTextInstallODBC" Overridable="yes">Instalando componentes ODBC</String>
303 <String Id="ProgressTextInstallServices" Overridable="yes">Instalando novos serviços</String>
304 <String Id="ProgressTextInstallServicesTemplate" Overridable="yes">Serviço: [2]</String>
305 <String Id="ProgressTextLaunchConditions" Overridable="yes">Avaliando as condições de inicialização</String>
306 <String Id="ProgressTextMigrateFeatureStates" Overridable="yes">Migrando estados de recursos de aplicativos relacionados</String>
307 <String Id="ProgressTextMigrateFeatureStatesTemplate" Overridable="yes">Aplicativo: [1]</String>
308 <String Id="ProgressTextMoveFiles" Overridable="yes">Movendo arquivos</String>
309 <String Id="ProgressTextMoveFilesTemplate" Overridable="yes">Arquivo: [1], Diretório: [9], Tamanho: [6]</String>
310 <String Id="ProgressTextPatchFiles" Overridable="yes">Corrigindo arquivos</String>
311 <String Id="ProgressTextPatchFilesTemplate" Overridable="yes">Arquivo: [1], Diretório: [2], Tamanho: [3]</String>
312 <String Id="ProgressTextProcessComponents" Overridable="yes">Atualizando registro do componente</String>
313 <String Id="ProgressTextRegisterComPlus" Overridable="yes">Registrando Componentes e Aplicativos COM+</String>
314 <String Id="ProgressTextRegisterComPlusTemplate" Overridable="yes">AppId: [1]{{, AppType: [2], Usuários: [3], RSN: [4]}}</String>
315 <String Id="ProgressTextRegisterFonts" Overridable="yes">Registrando fontes</String>
316 <String Id="ProgressTextRegisterFontsTemplate" Overridable="yes">Fonte: [1]</String>
317 <String Id="ProgressTextRegisterProduct" Overridable="yes">Registrando o produto</String>
318 <String Id="ProgressTextRegisterProductTemplate" Overridable="yes">[1]</String>
319 <String Id="ProgressTextRegisterTypeLibraries" Overridable="yes">Registrando bibliotecas de tipos</String>
320 <String Id="ProgressTextRegisterTypeLibrariesTemplate" Overridable="yes">LibID: [1]</String>
321 <String Id="ProgressTextRegisterUser" Overridable="yes">Registrando o usuário</String>
322 <String Id="ProgressTextRegisterUserTemplate" Overridable="yes">[1]</String>
323 <String Id="ProgressTextRemoveDuplicateFiles" Overridable="yes">Removendo arquivos duplicados</String>
324 <String Id="ProgressTextRemoveDuplicateFilesTemplate" Overridable="yes">Arquivo: [1], Diretório: [9]</String>
325 <String Id="ProgressTextRemoveEnvironmentStrings" Overridable="yes">Atualizando cadeias de caracteres de ambiente</String>
326 <String Id="ProgressTextRemoveEnvironmentStringsTemplate" Overridable="yes">Nome: [1], Valor: [2], Ação [3]</String>
327 <String Id="ProgressTextRemoveExistingProducts" Overridable="yes">Removendo aplicativos</String>
328 <String Id="ProgressTextRemoveExistingProductsTemplate" Overridable="yes">Aplicativo: [1], Linha de comando: [2]</String>
329 <String Id="ProgressTextRemoveFiles" Overridable="yes">Removendo arquivos</String>
330 <String Id="ProgressTextRemoveFilesTemplate" Overridable="yes">Arquivo: [1], Diretório: [9]</String>
331 <String Id="ProgressTextRemoveFolders" Overridable="yes">Removendo pastas</String>
332 <String Id="ProgressTextRemoveFoldersTemplate" Overridable="yes">Pasta: [1]</String>
333 <String Id="ProgressTextRemoveIniValues" Overridable="yes">Removendo entradas de arquivos INI</String>
334 <String Id="ProgressTextRemoveIniValuesTemplate" Overridable="yes">Arquivo: [1], Seção: [2], Chave: [3], Valor: [4]</String>
335 <String Id="ProgressTextRemoveODBC" Overridable="yes">Removendo componentes ODBC</String>
336 <String Id="ProgressTextRemoveRegistryValues" Overridable="yes">Removendo valores do Registro do sistema</String>
337 <String Id="ProgressTextRemoveRegistryValuesTemplate" Overridable="yes">Chave: [1], Nome: [2]</String>
338 <String Id="ProgressTextRemoveShortcuts" Overridable="yes">Removendo atalhos</String>
339 <String Id="ProgressTextRemoveShortcutsTemplate" Overridable="yes">Atalho: [1]</String>
340 <String Id="ProgressTextRMCCPSearch" Overridable="yes">Procurando produtos qualificados</String>
341 <String Id="ProgressTextSelfRegModules" Overridable="yes">Registrando módulos</String>
342 <String Id="ProgressTextSelfRegModulesTemplate" Overridable="yes">Arquivo: [1], Pasta: [2]</String>
343 <String Id="ProgressTextSelfUnregModules" Overridable="yes">Cancelando o registro de módulos</String>
344 <String Id="ProgressTextSelfUnregModulesTemplate" Overridable="yes">Arquivo: [1], Pasta: [2]</String>
345 <String Id="ProgressTextSetODBCFolders" Overridable="yes">Inicializando diretórios ODBC</String>
346 <String Id="ProgressTextStartServices" Overridable="yes">Iniciando serviços</String>
347 <String Id="ProgressTextStartServicesTemplate" Overridable="yes">Serviço: [1]</String>
348 <String Id="ProgressTextStopServices" Overridable="yes">Interrompendo serviços</String>
349 <String Id="ProgressTextStopServicesTemplate" Overridable="yes">Serviço: [1]</String>
350 <String Id="ProgressTextUnpublishComponents" Overridable="yes">Cancelando a Publicação de Componentes Qualificados</String>
351 <String Id="ProgressTextUnpublishComponentsTemplate" Overridable="yes">ID do Componente: [1], Qualificador: [2]</String>
352 <String Id="ProgressTextUnpublishFeatures" Overridable="yes">Cancelando a Publicação de Recursos do Produto</String>
353 <String Id="ProgressTextUnpublishFeaturesTemplate" Overridable="yes">Recurso: [1]</String>
354 <String Id="ProgressTextUnregisterClassInfo" Overridable="yes">Cancelar o registro de servidores de Classes</String>
355 <String Id="ProgressTextUnregisterClassInfoTemplate" Overridable="yes">ID da Classe: [1]</String>
356 <String Id="ProgressTextUnregisterComPlus" Overridable="yes">Cancelando o Registro de Componentes e Aplicativos COM+</String>
357 <String Id="ProgressTextUnregisterComPlusTemplate" Overridable="yes">AppId: [1]{{, AppType: [2]}}</String>
358 <String Id="ProgressTextUnregisterExtensionInfo" Overridable="yes">Cancelando o registro de servidores de extensão</String>
359 <String Id="ProgressTextUnregisterExtensionInfoTemplate" Overridable="yes">Extensão: [1]</String>
360 <String Id="ProgressTextUnregisterFonts" Overridable="yes">Cancelando o registro de fontes</String>
361 <String Id="ProgressTextUnregisterFontsTemplate" Overridable="yes">Fonte: [1]</String>
362 <String Id="ProgressTextUnregisterMIMEInfo" Overridable="yes">Cancelando o registro de informações de MIME</String>
363 <String Id="ProgressTextUnregisterMIMEInfoTemplate" Overridable="yes">Tipo de Conteúdo MIME: [1], Extensão: [2]</String>
364 <String Id="ProgressTextUnregisterProgIdInfo" Overridable="yes">Cancelando o registro de identificadores de programas</String>
365 <String Id="ProgressTextUnregisterProgIdInfoTemplate" Overridable="yes">ProgId: [1]</String>
366 <String Id="ProgressTextUnregisterTypeLibraries" Overridable="yes">Cancelando o registro de bibliotecas de tipos</String>
367 <String Id="ProgressTextUnregisterTypeLibrariesTemplate" Overridable="yes">LibID: [1]</String>
368 <String Id="ProgressTextWriteEnvironmentStrings" Overridable="yes">Atualizando cadeias de caracteres de ambiente</String>
369 <String Id="ProgressTextWriteEnvironmentStringsTemplate" Overridable="yes">Nome: [1], Valor: [2], Ação [3]</String>
370 <String Id="ProgressTextWriteIniValues" Overridable="yes">Gravando valores de arquivos INI</String>
371 <String Id="ProgressTextWriteIniValuesTemplate" Overridable="yes">Arquivo: [1], Seção: [2], Chave: [3], Valor: [4]</String>
372 <String Id="ProgressTextWriteRegistryValues" Overridable="yes">Gravando valores do Registro do sistema</String>
373 <String Id="ProgressTextWriteRegistryValuesTemplate" Overridable="yes">Chave: [1], Nome: [2], Valor: [3]</String>
374 <String Id="ProgressTextAdvertise" Overridable="yes">Anunciando aplicativo</String>
375 <String Id="ProgressTextGenerateScript" Overridable="yes">Gerando operações de script para a ação:</String>
376 <String Id="ProgressTextGenerateScriptTemplate" Overridable="yes">[1]</String>
377 <String Id="ProgressTextInstallSFPCatalogFile" Overridable="yes">Instalando catálogo do sistema</String>
378 <String Id="ProgressTextInstallSFPCatalogFileTemplate" Overridable="yes">Arquivo: [1], Dependências: [2]</String>
379 <String Id="ProgressTextMsiPublishAssemblies" Overridable="yes">Publicando informações do assembly</String>
380 <String Id="ProgressTextMsiPublishAssembliesTemplate" Overridable="yes">Contexto do Aplicativo:[1], Nome do Assembly:[2]</String>
381 <String Id="ProgressTextMsiUnpublishAssemblies" Overridable="yes">Cancelando a publicação de informações do assembly</String>
382 <String Id="ProgressTextMsiUnpublishAssembliesTemplate" Overridable="yes">Contexto do Aplicativo:[1], Nome do Assembly:[2]</String>
383 <String Id="ProgressTextRollback" Overridable="yes">Revertendo ação:</String>
384 <String Id="ProgressTextRollbackTemplate" Overridable="yes">[1]</String>
385 <String Id="ProgressTextRollbackCleanup" Overridable="yes">Removendo arquivos de backup</String>
386 <String Id="ProgressTextRollbackCleanupTemplate" Overridable="yes">Arquivo: [1]</String>
387 <String Id="ProgressTextUnmoveFiles" Overridable="yes">Removendo arquivos movidos</String>
388 <String Id="ProgressTextUnmoveFilesTemplate" Overridable="yes">Arquivo: [1], Diretório: [9]</String>
389 <String Id="ProgressTextUnpublishProduct" Overridable="yes">Cancelando a publicação de informações do produto</String>
390
391 <String Id="Error0" Overridable="yes">{{Erro fatal: }}</String>
392 <String Id="Error1" Overridable="yes">{{Erro [1]. }}</String>
393 <String Id="Error2" Overridable="yes">Aviso [1]. </String>
394 <String Id="Error4" Overridable="yes">Informações [1]. </String>
395 <String Id="Error5" Overridable="yes">O instalador encontrou um erro inesperado ao instalar este pacote. Isso pode indicar que há um problema com o pacote. Código de erro: [1]. {{Os argumentos são: [2], [3], [4]}}</String>
396 <String Id="Error7" Overridable="yes">{{Disco cheio: }}</String>
397 <String Id="Error8" Overridable="yes">Ação [Time]: [1]. [2]</String>
398 <String Id="Error9" Overridable="yes">[ProductName]</String>
399 <String Id="Error10" Overridable="yes">{[2]}{, [3]}{, [4]}</String>
400 <String Id="Error11" Overridable="yes">Tipo de mensagem: [1], Argumento: [2]</String>
401 <String Id="Error12" Overridable="yes">=== Início do registro em log: [Date] [Time] ===</String>
402 <String Id="Error13" Overridable="yes">=== Fim do registro em log: [Date] [Time] ===</String>
403 <String Id="Error14" Overridable="yes">Início da ação [Time]: [1].</String>
404 <String Id="Error15" Overridable="yes">Término da ação [Time]: [1]. Valor de retorno [2].</String>
405 <String Id="Error16" Overridable="yes">Tempo restante: {[1] minutos }{[2] segundos}</String>
406 <String Id="Error17" Overridable="yes">Memória insuficiente. Desligue outros aplicativos antes de tentar novamente.</String>
407 <String Id="Error18" Overridable="yes">O instalador não está respondendo.</String>
408 <String Id="Error19" Overridable="yes">O instalador foi interrompido prematuramente.</String>
409 <String Id="Error20" Overridable="yes">Aguarde enquanto o Windows configura o [ProductName]</String>
410 <String Id="Error21" Overridable="yes">Coletando informações necessárias...</String>
411 <String Id="Error22" Overridable="yes">Removendo versões anteriores deste aplicativo...</String>
412 <String Id="Error23" Overridable="yes">Preparando para remover versões anteriores deste aplicativo...</String>
413 <String Id="Error32" Overridable="yes">A instalação do {[ProductName] }foi concluída com êxito.</String>
414 <String Id="Error33" Overridable="yes">Falha na instalação do {[ProductName] }.</String>
415 <String Id="Error1101" Overridable="yes">Erro ao ler do arquivo: [2]. {{ Erro do sistema [3].}} Verifique se o arquivo existe e se você pode acessá-lo.</String>
416 <String Id="Error1301" Overridable="yes">Não é possível criar o arquivo '[2]'. Já existe um diretório com este nome. Cancele a instalação e tente instalar em outro local.</String>
417 <String Id="Error1302" Overridable="yes">Insira o disco: [2]</String>
418 <String Id="Error1303" Overridable="yes">O instalador não tem privilégios suficientes para acessar este diretório: [2]. Não é possível dar continuidade à instalação. Faça logon como administrador ou contate o administrador do sistema.</String>
419 <String Id="Error1304" Overridable="yes">Erro ao gravar no arquivo: [2]. Verifique se você tem acesso a este diretório.</String>
420 <String Id="Error1305" Overridable="yes">Erro ao ler do arquivo [2]. {{ Erro do sistema [3].}} Verifique se o arquivo existe e se você pode acessá-lo.</String>
421 <String Id="Error1306" Overridable="yes">Outro aplicativo tem acesso exclusivo ao arquivo '[2]'. Desligue todos os outros aplicativos e clique em Tentar Novamente.</String>
422 <String Id="Error1307" Overridable="yes">Não há espaço em disco suficiente para instalar este arquivo: [2]. Libere algum espaço em disco e clique em Tentar Novamente, ou clique em Cancelar para sair.</String>
423 <String Id="Error1308" Overridable="yes">Arquivo de origem não encontrado: [2]. Verifique se o arquivo existe e se você pode acessá-lo.</String>
424 <String Id="Error1309" Overridable="yes">Erro ao ler do arquivo: [3]. {{ Erro do sistema [2].}} Verifique se o arquivo existe e se você pode acessá-lo.</String>
425 <String Id="Error1310" Overridable="yes">Erro ao gravar no arquivo: [3]. {{ Erro do sistema [2].}} Verifique se você tem acesso a esse diretório.</String>
426 <String Id="Error1311" Overridable="yes">Arquivo de origem não encontrado{{(gabinete)}}: [2]. Verifique se o arquivo existe e se você pode acessá-lo.</String>
427 <String Id="Error1312" Overridable="yes">Não é possível criar o diretório '[2]'. Já existe um arquivo com este nome. Forneça um novo nome ou remova o arquivo e clique em Tentar Novamente, ou clique em Cancelar para sair.</String>
428 <String Id="Error1313" Overridable="yes">O volume [2] não está disponível no momento. Selecione outro volume.</String>
429 <String Id="Error1314" Overridable="yes">O caminho especificado '[2]' não está disponível.</String>
430 <String Id="Error1315" Overridable="yes">Não é possível gravar na pasta especificada: [2].</String>
431 <String Id="Error1316" Overridable="yes">Erro de rede ao tentar ler do arquivo: [2]</String>
432 <String Id="Error1317" Overridable="yes">Erro ao tentar criar o diretório: [2]</String>
433 <String Id="Error1318" Overridable="yes">Erro de rede ao tentar criar o diretório: [2]</String>
434 <String Id="Error1319" Overridable="yes">Erro de rede ao tentar abrir o gabinete do arquivo de origem: [2]</String>
435 <String Id="Error1320" Overridable="yes">O caminho especificado é muito longo: [2]</String>
436 <String Id="Error1321" Overridable="yes">O Instalador não tem privilégios suficientes para modificar este arquivo: [2].</String>
437 <String Id="Error1322" Overridable="yes">Uma parte do caminho da pasta '[2]' não é válida. Essa parte está vazia ou excede o tamanho permitido pelo sistema.</String>
438 <String Id="Error1323" Overridable="yes">O caminho da pasta '[2]' contém palavras que não são válidas em caminhos de pastas.</String>
439 <String Id="Error1324" Overridable="yes">O caminho da pasta '[2]' contém um caractere inválido.</String>
440 <String Id="Error1325" Overridable="yes">'[2]' não é um nome de arquivo curto válido.</String>
441 <String Id="Error1326" Overridable="yes">Erro ao obter segurança do arquivo: [3] GetLastError: [2]</String>
442 <String Id="Error1327" Overridable="yes">Unidade inválida: [2]</String>
443 <String Id="Error1328" Overridable="yes">Erro ao aplicar patch ao arquivo [2]. É provável que o arquivo tenha sido atualizado por outros meios e não possa mais ser modificado por esse patch. Para obter mais informações, contate o fornecedor do patch. {{Erro do Sistema: [3]}}</String>
444 <String Id="Error1329" Overridable="yes">Não é possível instalar um arquivo necessário porque o arquivo de gabinete [2] não está assinado digitalmente. Isso pode indicar que o arquivo de gabinete está corrompido.</String>
445 <String Id="Error1330" Overridable="yes">Não é possível instalar um arquivo necessário porque o arquivo de gabinete [2] tem uma assinatura digital inválida. Isso pode indicar que o arquivo de gabinete está corrompido.{{ Erro [3] retornado pelo WinVerifyTrust.}}</String>
446 <String Id="Error1331" Overridable="yes">Falha ao copiar corretamente o arquivo [2]: erro de CRC.</String>
447 <String Id="Error1332" Overridable="yes">Falha ao mover corretamente o arquivo [2]: erro de CRC.</String>
448 <String Id="Error1333" Overridable="yes">Falha ao corrigir corretamente o arquivo [2]: erro de CRC.</String>
449 <String Id="Error1334" Overridable="yes">O arquivo '[2]' não pode ser instalado porque não foi encontrado no arquivo de gabinete '[3]'. Isso pode indicar um erro de rede, um erro de leitura do CD-ROM ou um problema com este pacote.</String>
450 <String Id="Error1335" Overridable="yes">O arquivo de gabinete '[2]' necessário para esta instalação está corrompido e não pode ser usado. Isso pode indicar um erro de rede, um erro de leitura do CD-ROM ou um problema com este pacote.</String>
451 <String Id="Error1336" Overridable="yes">Erro ao criar um arquivo temporário necessário para concluir esta instalação.{{ Pasta: [3]. Código de erro do sistema: [2]}}</String>
452 <String Id="Error1401" Overridable="yes">Não foi possível criar a chave: [2]. {{ Erro do sistema [3].}} Verifique se você tem acesso suficiente a essa chave ou contate a equipe de suporte. </String>
453 <String Id="Error1402" Overridable="yes">Não foi possível abrir a chave: [2]. {{ Erro do sistema [3].}} Verifique se você tem acesso suficiente a essa chave ou contate a equipe de suporte. </String>
454 <String Id="Error1403" Overridable="yes">Não foi possível excluir o valor [2] da chave [3]. {{ Erro do sistema [4].}} Verifique se você tem acesso suficiente a essa chave ou contate a equipe de suporte. </String>
455 <String Id="Error1404" Overridable="yes">Não foi possível excluir a chave [2]. {{ Erro do sistema [3].}} Verifique se você tem acesso suficiente a essa chave ou contate a equipe de suporte. </String>
456 <String Id="Error1405" Overridable="yes">Não foi possível ler o valor [2] da chave [3]. {{ Erro do sistema [4].}} Verifique se você tem acesso suficiente a essa chave ou contate a equipe de suporte. </String>
457 <String Id="Error1406" Overridable="yes">Não foi possível gravar o valor [2] na chave [3]. {{ Erro do sistema [4].}} Verifique se você tem acesso suficiente a essa chave ou contate a equipe de suporte.</String>
458 <String Id="Error1407" Overridable="yes">Não foi possível obter nomes de valores para a chave [2]. {{ Erro do sistema [3].}} Verifique se você tem acesso suficiente a essa chave ou contate a equipe de suporte.</String>
459 <String Id="Error1408" Overridable="yes">Não foi possível obter nomes de subchaves para a chave [2]. {{ Erro do sistema [3].}} Verifique se você tem acesso suficiente a essa chave ou contate a equipe de suporte.</String>
460 <String Id="Error1409" Overridable="yes">Não foi possível ler informações de segurança para a chave [2]. {{ Erro do sistema [3].}} Verifique se você tem acesso suficiente a essa chave ou contate a equipe de suporte.</String>
461 <String Id="Error1410" Overridable="yes">Não foi possível aumentar o espaço disponível do Registro. São necessários [2] KB de espaço livre no Registro para a instalação deste aplicativo.</String>
462 <String Id="Error1500" Overridable="yes">Outra instalação está em andamento. Você deve concluir a instalação anterior antes de continuar a instalação atual.</String>
463 <String Id="Error1501" Overridable="yes">Erro ao acessar dados protegidos. Verifique se o Windows Installer está configurado corretamente e tente repetir a instalação.</String>
464 <String Id="Error1502" Overridable="yes">O usuário '[2]' já havia iniciado uma instalação do produto '[3]'. Esse usuário precisará executar novamente a instalação para poder usar o produto. A instalação atual continuará agora.</String>
465 <String Id="Error1503" Overridable="yes">O usuário '[2]' já havia iniciado uma instalação do produto '[3]'. Esse usuário precisará executar novamente a instalação para poder usar o produto.</String>
466 <String Id="Error1601" Overridable="yes">Espaço em disco insuficiente - Volume: '[2]'; espaço necessário: [3] KB; espaço disponível: [4] KB. Libere espaço em disco e tente novamente.</String>
467 <String Id="Error1602" Overridable="yes">Tem certeza de que deseja cancelar?</String>
468 <String Id="Error1603" Overridable="yes">O arquivo [2][3] está em uso{ pelo seguinte processo: Nome: [4], ID: [5], Título da Janela: '[6]'}. Feche o aplicativo e tente novamente.</String>
469 <String Id="Error1604" Overridable="yes">O produto '[2]' já foi instalado e isso impede a instalação deste produto. Os dois produtos são incompatíveis.</String>
470 <String Id="Error1605" Overridable="yes">Não há espaço suficiente em disco no volume '[2]' para continuar a instalação com recuperação habilitada. [3] KB são necessários, mas apenas [4] KB estão disponíveis. Clique em Ignorar para continuar a instalação sem salvar informações de recuperação, clique em Tentar Novamente para verificar o espaço disponível novamente ou clique em Cancelar para sair da instalação.</String>
471 <String Id="Error1606" Overridable="yes">Não foi possível acessar o local da rede [2].</String>
472 <String Id="Error1607" Overridable="yes">Os aplicativos a seguir devem ser fechados antes que a instalação continue:</String>
473 <String Id="Error1608" Overridable="yes">Não foi possível localizar os produtos compatíveis instalados previamente no computador para a instalação deste produto.</String>
474 <String Id="Error1609" Overridable="yes">Erro ao aplicar configurações de segurança. [2] não é um usuário ou grupo válido. Isso pode ser um problema com o pacote ou de conexão com um controlador de domínio na rede. Verifique sua conexão de rede e clique em Tentar Novamente ou em Cancelar para encerrar a instalação. {{Não é possível localizar o SID de usuário, erro do sistema [3]}}</String>
475 <String Id="Error1701" Overridable="yes">A chave [2] não é válida. Verifique se você digitou a chave correta.</String>
476 <String Id="Error1702" Overridable="yes">O instalador deve reiniciar o sistema para que a configuração do [2] possa continuar. Clique em Sim para reiniciar agora ou em Não se quiser reiniciar manualmente mais tarde.</String>
477 <String Id="Error1703" Overridable="yes">Você deve reiniciar o sistema para que as alterações da configuração do [2] tenham efeito. Clique em Sim para reiniciar agora ou em Não se desejar reiniciá-lo manualmente mais tarde.</String>
478 <String Id="Error1704" Overridable="yes">Uma instalação do [2] está suspensa no momento. Você precisa desfazer as alterações aplicadas por essa instalação para poder continuar. Deseja desfazer as alterações?</String>
479 <String Id="Error1705" Overridable="yes">Uma instalação anterior deste produto está em andamento. Você precisa desfazer as alterações aplicadas por essa instalação para poder continuar. Deseja desfazer as alterações?</String>
480 <String Id="Error1706" Overridable="yes">Não foi possível encontrar o pacote de instalação para o produto [2]. Tente instalar novamente usando uma cópia válida do pacote de instalação '[3]'.</String>
481 <String Id="Error1707" Overridable="yes">Instalação concluída com êxito.</String>
482 <String Id="Error1708" Overridable="yes">Falha na instalação.</String>
483 <String Id="Error1709" Overridable="yes">Produto: [2] -- [3]</String>
484 <String Id="Error1710" Overridable="yes">Você pode restaurar o computador ao seu estado anterior ou continuar a instalação mais tarde. Deseja restaurá-lo?</String>
485 <String Id="Error1711" Overridable="yes">Erro ao gravar as informações de instalação no disco. Verifique se o espaço disponível em disco é suficiente e clique em Tentar Novamente, ou clique em Cancelar para finalizar a instalação.</String>
486 <String Id="Error1712" Overridable="yes">Não foi possível localizar um ou mais dos arquivos necessários para restaurar o computador ao estado anterior. A restauração não será realizada.</String>
487 <String Id="Error1713" Overridable="yes">[2] não pode instalar um dos produtos necessários. Contate o grupo de suporte técnico. {{Erro do sistema: [3].}}</String>
488 <String Id="Error1714" Overridable="yes">Não é possível remover a versão antiga do [2]. Contate o grupo de suporte técnico. {{Erro do sistema: [3].}}</String>
489 <String Id="Error1715" Overridable="yes">Instalado [2]</String>
490 <String Id="Error1716" Overridable="yes">Configurado [2]</String>
491 <String Id="Error1717" Overridable="yes">Removido [2]</String>
492 <String Id="Error1718" Overridable="yes">O arquivo [2] foi rejeitado pela política de assinatura digital.</String>
493 <String Id="Error1719" Overridable="yes">Não foi possível acessar o Serviço Windows Installer. Isso poderá ocorrer se você estiver executando o Windows no modo de segurança ou se o Windows Installer não estiver corretamente instalado. Contate a equipe de suporte para obter ajuda.</String>
494 <String Id="Error1720" Overridable="yes">Há um problema neste pacote do Windows Installer. Não foi possível executar um script necessário para concluir a instalação. Contate a equipe de suporte ou o fornecedor do pacote. {{Ação personalizada [2] erro de script [3], [4]:[5] Linha [6], Coluna [7], [8] }}</String>
495 <String Id="Error1721" Overridable="yes">Há um problema com este pacote do Windows Installer. Um programa necessário para que esta instalação seja concluída não pôde ser executado. Contate a equipe de suporte ou o fornecedor do pacote. {{Ação: [2], local: [3], comando: [4] }}</String>
496 <String Id="Error1722" Overridable="yes">Há um problema neste pacote do Windows Installer. A execução de um programa como parte da instalação não foi concluída conforme o esperado. Contate a equipe de suporte ou o fornecedor do pacote. {{Ação: [2], local: [3], comando: [4] }}</String>
497 <String Id="Error1723" Overridable="yes">Há um problema neste pacote do Windows Installer. Não foi possível executar uma DLL necessária para concluir a instalação. Contate a equipe de suporte ou o fornecedor do pacote. {{Ação: [2], entrada: [3], biblioteca: [4] }}</String>
498 <String Id="Error1724" Overridable="yes">Remoção concluída com êxito.</String>
499 <String Id="Error1725" Overridable="yes">Falha de remoção.</String>
500 <String Id="Error1726" Overridable="yes">Anúncio concluído com êxito.</String>
501 <String Id="Error1727" Overridable="yes">Falha no anúncio.</String>
502 <String Id="Error1728" Overridable="yes">Configuração concluída com êxito.</String>
503 <String Id="Error1729" Overridable="yes">Falha na configuração.</String>
504 <String Id="Error1730" Overridable="yes">Você precisa ser um Administrador para remover este aplicativo. Para removê-lo, faça logon como Administrador ou contate a equipe de suporte técnico para obter ajuda.</String>
505 <String Id="Error1731" Overridable="yes">O pacote de instalação de origem do produto [2] não está sincronizado com o pacote cliente. Tente instalar novamente, usando uma cópia válida do pacote de instalação '[3]'.</String>
506 <String Id="Error1732" Overridable="yes">Para concluir a instalação do [2], reinicie o computador. No momento, outros usuários estão conectados ao computador e a reinicialização poderá fazer com que eles percam seus trabalhos. Deseja reiniciar agora?</String>
507 <String Id="Error1801" Overridable="yes">O caminho [2] não é válido. Especifique um caminho válido.</String>
508 <String Id="Error1802" Overridable="yes">Memória insuficiente. Desligue outros aplicativos antes de tentar novamente.</String>
509 <String Id="Error1803" Overridable="yes">Não há nenhum disco na unidade [2]. Insira um disco e clique em Tentar Novamente ou em Cancelar para voltar ao volume selecionado anteriormente.</String>
510 <String Id="Error1804" Overridable="yes">Não há nenhum disco na unidade [2]. Insira um disco e clique em Tentar Novamente ou em Cancelar para retornar à caixa de procura e selecione um volume diferente.</String>
511 <String Id="Error1805" Overridable="yes">A pasta [2] não existe. Especifique um caminho para uma pasta existente.</String>
512 <String Id="Error1806" Overridable="yes">Você não tem privilégios suficientes para ler esta pasta.</String>
513 <String Id="Error1807" Overridable="yes">Uma pasta de destino válida não pôde ser determinada para a instalação.</String>
514 <String Id="Error1901" Overridable="yes">Erro ao tentar ler do banco de dados de instalação de origem: [2].</String>
515 <String Id="Error1902" Overridable="yes">Agendando operação de reinicialização: renomeando o arquivo [2] para [3]. É preciso reinicializar o computador para concluir a operação.</String>
516 <String Id="Error1903" Overridable="yes">Agendando operação de reinicialização: excluindo o arquivo [2]. É preciso reinicializar o computador para concluir a operação.</String>
517 <String Id="Error1904" Overridable="yes">Falha ao registrar o módulo [2]. HRESULT [3]. Contate a equipe de suporte.</String>
518 <String Id="Error1905" Overridable="yes">Falha ao cancelar o registro do módulo [2]. HRESULT [3]. Contate a equipe de suporte.</String>
519 <String Id="Error1906" Overridable="yes">Falha ao armazenar em cache o pacote [2]. Erro: [3]. Contate a equipe de suporte.</String>
520 <String Id="Error1907" Overridable="yes">Não foi possível registrar a fonte [2]. Verifique se você tem permissões suficientes para instalar fontes e se o sistema oferece suporte para essa fonte.</String>
521 <String Id="Error1908" Overridable="yes">Não foi possível cancelar o registro da fonte [2]. Verifique se você tem permissões suficientes para remover fontes.</String>
522 <String Id="Error1909" Overridable="yes">Não foi possível criar o atalho [2]. Verifique se a pasta de destino existe e se você pode acessá-la.</String>
523 <String Id="Error1910" Overridable="yes">Não foi possível remover o atalho [2]. Verifique se o arquivo de atalho existe e se você pode acessá-lo.</String>
524 <String Id="Error1911" Overridable="yes">Não foi possível registrar a biblioteca de tipos para o arquivo [2]. Contate a equipe de suporte.</String>
525 <String Id="Error1912" Overridable="yes">Não foi possível cancelar o registro da biblioteca de tipos para o arquivo [2]. Contate a equipe de suporte.</String>
526 <String Id="Error1913" Overridable="yes">Não foi possível atualizar o arquivo ini [2][3]. Verifique se o arquivo existe e se você pode acessá-lo.</String>
527 <String Id="Error1914" Overridable="yes">Não foi possível agendar a substituição do arquivo [3] pelo [2] na reinicialização. Verifique se você tem permissões de gravação para o arquivo [3].</String>
528 <String Id="Error1915" Overridable="yes">Erro ao remover o gerenciador de driver ODBC; erro de ODBC [2]: [3]. Contate a equipe de suporte.</String>
529 <String Id="Error1916" Overridable="yes">Erro ao instalar o gerenciador de driver ODBC; erro de ODBC [2]: [3]. Contate a equipe de suporte.</String>
530 <String Id="Error1917" Overridable="yes">Erro ao remover o driver ODBC: [4]; erro de ODBC [2]: [3]. Verifique se você tem privilégios suficientes para remover drivers ODBC.</String>
531 <String Id="Error1918" Overridable="yes">Erro ao instalar o driver ODBC: [4]; erro de ODBC [2]: [3]. Verifique se o arquivo [4] existe e se você pode acessá-lo.</String>
532 <String Id="Error1919" Overridable="yes">Erro ao configurar fonte de dados ODBC: [4]; erro de ODBC [2]: [3]. Verifique se o arquivo [4] existe e se você pode acessá-lo.</String>
533 <String Id="Error1920" Overridable="yes">Falha ao iniciar o serviço '[2]' ([3]). Verifique se você tem privilégios suficientes para iniciar serviços do sistema.</String>
534 <String Id="Error1921" Overridable="yes">Não foi possível interromper o serviço '[2]' ([3]). Verifique se você tem privilégios suficientes para interromper serviços do sistema.</String>
535 <String Id="Error1922" Overridable="yes">Não foi possível excluir o serviço '[2]' ([3]). Verifique se você tem privilégios suficientes para remover serviços do sistema.</String>
536 <String Id="Error1923" Overridable="yes">Não foi possível instalar o serviço '[2]' ([3]). Verifique se você tem privilégios suficientes para instalar serviços do sistema.</String>
537 <String Id="Error1924" Overridable="yes">Não foi possível atualizar a variável de ambiente '[2]'. Verifique se você tem privilégios suficientes para modificar variáveis de ambiente.</String>
538 <String Id="Error1925" Overridable="yes">Você não tem privilégios suficientes para concluir esta instalação para todos os usuários do computador. Faça logon como administrador e tente instalar novamente.</String>
539 <String Id="Error1926" Overridable="yes">Não foi possível configurar a segurança para o arquivo '[3]'. Erro: [2]. Verifique se você tem privilégios suficientes para modificar as permissões de segurança desse arquivo.</String>
540 <String Id="Error1927" Overridable="yes">Os Serviços de Componentes (COM+ 1.0) não estão instalados neste computador. Esta instalação exige os Serviços de Componentes para ser concluída com êxito. Os Serviços de Componentes estão disponíveis no Windows 2000.</String>
541 <String Id="Error1928" Overridable="yes">Erro ao registrar o Aplicativo COM+. Contate a equipe de suporte para obter mais informações.</String>
542 <String Id="Error1929" Overridable="yes">Erro ao cancelar o registro do Aplicativo COM+. Contate a equipe de suporte para obter mais informações.</String>
543 <String Id="Error1930" Overridable="yes">Não foi possível alterar a descrição do serviço '[2]' ([3]).</String>
544 <String Id="Error1931" Overridable="yes">O serviço Windows Installer não pode atualizar o arquivo do sistema [2] porque ele está protegido pelo Windows. Talvez você precise atualizar o sistema operacional para que o programa funcione corretamente. {{Versão do pacote: [3], Versão protegida do sistema operacional: [4]}}</String>
545 <String Id="Error1932" Overridable="yes">O serviço Windows Installer não pode atualizar o arquivo protegido do Windows [2]. {{Versão do pacote: [3], Versão protegida do sistema operacional: [4], Erro da SFP: [5]}}</String>
546 <String Id="Error1933" Overridable="yes">O serviço Windows Installer não pode atualizar um ou mais arquivos protegidos do Windows. {{Erro da SFP: [2]. Lista de arquivos protegidos:\r\n[3]}}</String>
547 <String Id="Error1934" Overridable="yes">As instalações de usuários são desabilitadas através de políticas no computador.</String>
548 <String Id="Error1935" Overridable="yes">Erro durante a instalação do assembly '[6]'. Consulte a Ajuda e Suporte para obter mais informações. HRESULT: [3]. {{interface de assembly: [4]; função: [5]; componente: [2]}}</String>
549 <String Id="Error1936" Overridable="yes">Erro durante a instalação do assembly '[6]'. O assembly não possui um nome forte ou não foi assinado com o comprimento mínimo de chave. HRESULT: [3]. {{interface de assembly: [4], função: [5], componente: [2]}}</String>
550 <String Id="Error1937" Overridable="yes">Erro durante a instalação do assembly '[6]'. A assinatura ou o catálogo não puderam ser verificados ou não são válidos. HRESULT: [3]. {{interface de assembly: [4], função: [5], componente: [2]}}</String>
551 <String Id="Error1938" Overridable="yes">Erro durante a instalação do assembly '[6]'. Um ou mais módulos do assembly não puderam ser encontrados. HRESULT: [3]. {{interface de assembly: [4], função: [5], componente: [2]}}</String>
552
553 <String Id="UITextbytes" Overridable="yes">bytes</String>
554 <String Id="UITextGB" Overridable="yes">GB</String>
555 <String Id="UITextKB" Overridable="yes">KB</String>
556 <String Id="UITextMB" Overridable="yes">MB</String>
557 <String Id="UITextMenuAbsent" Overridable="yes">O recurso inteiro estará indisponível</String>
558 <String Id="UITextMenuAdvertise" Overridable="yes">O recurso será instalado quando necessário</String>
559 <String Id="UITextMenuAllCD" Overridable="yes">O recurso inteiro será instalado para ser executado do CD</String>
560 <String Id="UITextMenuAllLocal" Overridable="yes">O recurso inteiro será instalado no disco rígido local</String>
561 <String Id="UITextMenuAllNetwork" Overridable="yes">O recurso inteiro será instalado para ser executado da rede</String>
562 <String Id="UITextMenuCD" Overridable="yes">Será instalado para ser executado do CD</String>
563 <String Id="UITextMenuLocal" Overridable="yes">Será instalado no disco rígido local</String>
564 <String Id="UITextMenuNetwork" Overridable="yes">Será instalado para ser executado da rede</String>
565 <String Id="UITextNewFolder" Overridable="yes">Pasta|Nova Pasta</String>
566 <String Id="UITextScriptInProgress" Overridable="yes">Coletando informações necessárias...</String>
567 <String Id="UITextSelAbsentAbsent" Overridable="yes">Este recurso permanecerá desinstalado</String>
568 <String Id="UITextSelAbsentAdvertise" Overridable="yes">Este recurso será configurado para ser instalado quando necessário</String>
569 <String Id="UITextSelAbsentCD" Overridable="yes">Este recurso será instalado para ser executado do CD</String>
570 <String Id="UITextSelAbsentLocal" Overridable="yes">Este recurso será instalado no disco rígido local</String>
571 <String Id="UITextSelAbsentNetwork" Overridable="yes">Este recurso será instalado para ser executado da rede</String>
572 <String Id="UITextSelAdvertiseAbsent" Overridable="yes">Este recurso ficará indisponível</String>
573 <String Id="UITextSelAdvertiseAdvertise" Overridable="yes">Será instalado quando necessário</String>
574 <String Id="UITextSelAdvertiseCD" Overridable="yes">Este recurso estará disponível para ser executado do CD</String>
575 <String Id="UITextSelAdvertiseLocal" Overridable="yes">Este recurso será instalado no disco rígido local</String>
576 <String Id="UITextSelAdvertiseNetwork" Overridable="yes">Este recurso ficará disponível para ser executado da rede</String>
577 <String Id="UITextSelCDAbsent" Overridable="yes">Este recurso será totalmente desinstalado e você não poderá executá-lo do CD</String>
578 <String Id="UITextSelCDAdvertise" Overridable="yes">Este recurso deixará de ser executado do CD e será configurado para ser instalado quando necessário</String>
579 <String Id="UITextSelCDCD" Overridable="yes">Este recurso continuará a ser executado do CD</String>
580 <String Id="UITextSelCDLocal" Overridable="yes">Este recurso deixará de ser executado do CD para ser instalado no disco rígido local</String>
581 <String Id="UITextSelChildCostNeg" Overridable="yes">Este recurso libera [1] no disco rígido.</String>
582 <String Id="UITextSelChildCostPos" Overridable="yes">Este recurso requer [1] no disco rígido.</String>
583 <String Id="UITextSelCostPending" Overridable="yes">Compilando custo para este recurso...</String>
584 <String Id="UITextSelLocalAbsent" Overridable="yes">Este recurso será completamente removido</String>
585 <String Id="UITextSelLocalAdvertise" Overridable="yes">Este recurso será removido do disco rígido local, mas será configurado para ser instalado quando necessário</String>
586 <String Id="UITextSelLocalCD" Overridable="yes">Este recurso será removido do disco rígido local, mas continuará disponível para ser executado do CD</String>
587 <String Id="UITextSelLocalLocal" Overridable="yes">Este recurso permanecerá no disco rígido local</String>
588 <String Id="UITextSelLocalNetwork" Overridable="yes">Este recurso será removido do disco rígido local, mas ainda ficará disponível para ser executado da rede</String>
589 <String Id="UITextSelNetworkAbsent" Overridable="yes">Este recurso será totalmente desinstalado e você não poderá executá-lo da rede</String>
590 <String Id="UITextSelNetworkAdvertise" Overridable="yes">Este recurso deixará de ser executado da rede e será configurado para ser instalado quando necessário</String>
591 <String Id="UITextSelNetworkLocal" Overridable="yes">Este recurso deixará de ser executado da rede e será instalado no disco rígido local</String>
592 <String Id="UITextSelNetworkNetwork" Overridable="yes">Este recurso continuará a ser executado da rede</String>
593 <String Id="UITextSelParentCostNegNeg" Overridable="yes">Este recurso libera [1] no disco rígido. [2] de [3] sub-recursos estão selecionados. Os sub-recursos liberam [4] no disco rígido.</String>
594 <String Id="UITextSelParentCostNegPos" Overridable="yes">Este recurso libera [1] no disco rígido. [2] de [3] sub-recursos estão selecionados. Os sub-recursos requerem [4] no disco rígido.</String>
595 <String Id="UITextSelParentCostPosNeg" Overridable="yes">Este recurso requer [1] no disco rígido. [2] de [3] sub-recursos estão selecionados. Os sub-recursos liberam [4] no disco rígido.</String>
596 <String Id="UITextSelParentCostPosPos" Overridable="yes">Este recurso requer [1] no disco rígido. [2] de [3] sub-recursos estão selecionados. Os sub-recursos requerem [4] no disco rígido.</String>
597 <String Id="UITextTimeRemaining" Overridable="yes">Tempo restante: {[1] minutos }{[2] segundos}</String>
598 <String Id="UITextVolumeCostAvailable" Overridable="yes">Disponível(is)</String>
599 <String Id="UITextVolumeCostDifference" Overridable="yes">Diferença</String>
600 <String Id="UITextVolumeCostRequired" Overridable="yes">Necessário(s)</String>
601 <String Id="UITextVolumeCostSize" Overridable="yes">Tamanho do Disco</String>
602 <String Id="UITextVolumeCostVolume" Overridable="yes">Volume</String>
603</WixLocalization>
diff --git a/src/ext/UI/wixlib/WixUI_pt-PT.wxl b/src/ext/UI/wixlib/WixUI_pt-PT.wxl
new file mode 100644
index 00000000..e6a229d7
--- /dev/null
+++ b/src/ext/UI/wixlib/WixUI_pt-PT.wxl
@@ -0,0 +1,598 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3
4
5<WixLocalization Culture="pt-pt" Codepage="1252" xmlns="http://wixtoolset.org/schemas/v4/wxl">
6 <String Id="WixUIBack" Overridable="yes">&amp;Anterior</String>
7 <String Id="WixUINext" Overridable="yes">&amp;Seguinte</String>
8 <String Id="WixUICancel" Overridable="yes">Cancelar</String>
9 <String Id="WixUIFinish" Overridable="yes">&amp;Concluir</String>
10 <String Id="WixUIRetry" Overridable="yes">&amp;Repetir</String>
11 <String Id="WixUIIgnore" Overridable="yes">&amp;Ignorar</String>
12 <String Id="WixUIYes" Overridable="yes">&amp;Sim</String>
13 <String Id="WixUINo" Overridable="yes">&amp;Não</String>
14 <String Id="WixUIOK" Overridable="yes">OK</String>
15 <String Id="WixUIPrint" Overridable="yes">Im&amp;primir</String>
16
17 <String Id="AdvancedWelcomeEulaDlg_Title" Overridable="yes">Programa de Configuração do [ProductName]</String>
18 <String Id="AdvancedWelcomeEulaDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
19 <String Id="AdvancedWelcomeEulaDlgTitle" Overridable="yes">{\WixUI_Font_Title}Leia o Contrato de Licença do [ProductName]</String>
20 <String Id="AdvancedWelcomeEulaDlgLicenseAcceptedCheckBox" Overridable="yes">&amp;Aceito os termos do Contrato de Licença</String>
21 <String Id="AdvancedWelcomeEulaDlgDescriptionPerMachine" Overridable="yes">Clique em Instalar para instalar o produto com as opções predefinidas para todos os utilizadores. Clique em Avançadas para alterar as opções de instalação.</String>
22 <String Id="AdvancedWelcomeEulaDlgDescriptionPerUser" Overridable="yes">Clique em Instalar para instalar o produto com as opções predefinidas apenas para si. Clique em Avançadas para alterar as opções de instalação.</String>
23 <String Id="AdvancedWelcomeEulaDlgInstall" Overridable="yes">&amp;Instalar</String>
24 <String Id="AdvancedWelcomeEulaDlgAdvanced" Overridable="yes">A&amp;vançadas</String>
25 <String Id="Advanced_Font_Normal_Size" Overridable="yes">8</String>
26 <String Id="Advanced_Font_Bigger_Size" Overridable="yes">12</String>
27 <String Id="Advanced_Font_Title_Size" Overridable="yes">9</String>
28 <String Id="Advanced_Font_Emphasized_Size" Overridable="yes">8</String>
29 <String Id="Advanced_Font_FaceName" Overridable="yes">Tahoma</String>
30
31 <String Id="BrowseDlg_Title" Overridable="yes">Programa de Configuração do [ProductName]</String>
32 <String Id="BrowseDlgComboLabel" Overridable="yes">&amp;Procurar em:</String>
33 <String Id="BrowseDlgWixUI_Bmp_Up" Overridable="yes">WixUI_Bmp_Up</String>
34 <String Id="BrowseDlgWixUI_Bmp_UpTooltip" Overridable="yes">Subir um nível</String>
35 <String Id="BrowseDlgNewFolder" Overridable="yes">WixUI_Bmp_New</String>
36 <String Id="BrowseDlgNewFolderTooltip" Overridable="yes">Criar uma nova pasta</String>
37 <String Id="BrowseDlgPathLabel" Overridable="yes">&amp;Nome da pasta:</String>
38 <String Id="BrowseDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
39 <String Id="BrowseDlgDescription" Overridable="yes">Navegar para a pasta de destino</String>
40 <String Id="BrowseDlgTitle" Overridable="yes">{\WixUI_Font_Title}Alterar a pasta de destino</String>
41
42 <String Id="CancelDlg_Title" Overridable="yes">Programa de Configuração do [ProductName]</String>
43 <String Id="CancelDlgText" Overridable="yes">Tem a certeza de que pretende cancelar a instalação do [ProductName]?</String>
44 <String Id="CancelDlgIcon" Overridable="yes">WixUI_Ico_Info</String>
45 <String Id="CancelDlgIconTooltip" Overridable="yes">Ícone de informações</String>
46
47 <String Id="CustomizeDlg_Title" Overridable="yes">Programa de Configuração do [ProductName]</String>
48 <String Id="CustomizeDlgTree" Overridable="yes">Árvore de selecções</String>
49 <String Id="CustomizeDlgBrowse" Overridable="yes">P&amp;rocurar...</String>
50 <String Id="CustomizeDlgReset" Overridable="yes">Re&amp;por</String>
51 <String Id="CustomizeDlgDiskCost" Overridable="yes">&amp;Utilização do Disco</String>
52 <String Id="CustomizeDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
53 <String Id="CustomizeDlgText" Overridable="yes">Clique nos ícones na árvore abaixo para alterar a forma como as funcionalidades serão instaladas.</String>
54 <String Id="CustomizeDlgDescription" Overridable="yes">Seleccione a forma como pretende que as funcionalidades sejam instaladas.</String>
55 <String Id="CustomizeDlgTitle" Overridable="yes">{\WixUI_Font_Title}Configuração Personalizada</String>
56 <String Id="CustomizeDlgItemDescription" Overridable="yes">CustomizeDlgItemDescription-CustomizeDlgItemDescription</String>
57 <String Id="CustomizeDlgItemSize" Overridable="yes">CustomizeDlgItemSize-CustomizeDlgItemSize</String>
58 <String Id="CustomizeDlgLocation" Overridable="yes">CustomizeDlgLocation-CustomizeDlgLocation</String>
59 <String Id="CustomizeDlgLocationLabel" Overridable="yes">Localização:</String>
60
61 <String Id="DiskCostDlg_Title" Overridable="yes">Programa de Configuração do [ProductName]</String>
62 <String Id="DiskCostDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
63 <String Id="DiskCostDlgText" Overridable="yes">Os volumes realçados não têm espaço em disco suficiente disponível para as funcionalidades seleccionadas. Tem de remover alguns ficheiros dos volumes realçados, instalar menos funcionalidades ou seleccionar unidades de destino diferentes.</String>
64 <String Id="DiskCostDlgDescription" Overridable="yes">O espaço em disco necessário para a instalação das funcionalidades seleccionadas.</String>
65 <String Id="DiskCostDlgTitle" Overridable="yes">{\WixUI_Font_Title}Requisitos de Espaço em Disco</String>
66 <String Id="DiskCostDlgVolumeList" Overridable="yes">{120}{70}{70}{70}{70}</String>
67
68 <String Id="ErrorDlg_Title" Overridable="yes">Programa de Configuração do [ProductName]</String>
69 <String Id="ErrorDlgErrorText" Overridable="yes">Texto informativo</String>
70 <String Id="ErrorDlgErrorIcon" Overridable="yes">WixUI_Ico_Info</String>
71 <String Id="ErrorDlgErrorIconTooltip" Overridable="yes">Ícone de informações</String>
72
73 <String Id="ExitDialog_Title" Overridable="yes">Programa de Configuração do [ProductName]</String>
74 <String Id="ExitDialogBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
75 <String Id="ExitDialogDescription" Overridable="yes">Clique no botão Concluir para sair do Assistente de Configuração.</String>
76 <String Id="ExitDialogTitle" Overridable="yes">{\WixUI_Font_Bigger}Concluiu o Assistente de Configuração do [ProductName]</String>
77
78 <String Id="FatalError_Title" Overridable="yes">Programa de Configuração do [ProductName]</String>
79 <String Id="FatalErrorBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
80 <String Id="FatalErrorTitle" Overridable="yes">{\WixUI_Font_Bigger}O Assistente de Configuração do [ProductName] terminou prematuramente</String>
81 <String Id="FatalErrorDescription1" Overridable="yes">O Assistente de Configuração do [ProductName] terminou prematuramente devido a um erro. O seu sistema não foi modificado. Para instalar este programa mais tarde, execute novamente o Assistente de Configuração.</String>
82 <String Id="FatalErrorDescription2" Overridable="yes">Clique no botão Concluir para sair do Assistente de Configuração.</String>
83
84 <String Id="FeaturesDlg_Title" Overridable="yes">Programa de Configuração do [ProductName]</String>
85 <String Id="FeaturesDlgTree" Overridable="yes">Funcionalidades do produto</String>
86 <String Id="FeaturesDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
87 <String Id="FeaturesDlgDescription" Overridable="yes">Seleccione a forma como pretende que as funcionalidades sejam instaladas.</String>
88 <String Id="FeaturesDlgTitle" Overridable="yes">{\WixUI_Font_Title}Funcionalidades do Produto</String>
89 <String Id="FeaturesDlgItemDescription" Overridable="yes">FeaturesDlgItemDescription</String>
90 <String Id="FeaturesDlgItemSize" Overridable="yes">FeaturesDlgItemSize</String>
91 <String Id="FeaturesDlgInstall" Overridable="yes">&amp;Instalar</String>
92 <String Id="FeaturesDlgChange" Overridable="yes">Alt&amp;erar</String>
93
94 <String Id="FilesInUse_Title" Overridable="yes">Programa de Configuração do [ProductName]</String>
95 <String Id="FilesInUseExit" Overridable="yes">Sai&amp;r</String>
96 <String Id="FilesInUseBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
97 <String Id="FilesInUseText" Overridable="yes">As aplicações seguintes estão a utilizar ficheiros que necessitam de ser actualizados por esta configuração. Feche estas aplicações e, em seguida, clique em &amp;Repetir para continuar a instalação ou em Sair para sair.</String>
98 <String Id="FilesInUseDescription" Overridable="yes">Alguns ficheiros que é necessário actualizar estão actualmente em utilização.</String>
99 <String Id="FilesInUseTitle" Overridable="yes">{\WixUI_Font_Title}Ficheiros em Utilização</String>
100
101 <String Id="InstallDirDlg_Title" Overridable="yes">Programa de Configuração do [ProductName]</String>
102 <String Id="InstallDirDlgChange" Overridable="yes">Alt&amp;erar...</String>
103 <String Id="InstallDirDlgTitle" Overridable="yes">{\WixUI_Font_Title}Pasta de Destino</String>
104 <String Id="InstallDirDlgDescription" Overridable="yes">Clique em Seguinte para instalar na pasta predefinida ou clique em Alterar para escolher outra.</String>
105 <String Id="InstallDirDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
106 <String Id="InstallDirDlgFolderLabel" Overridable="yes">Instalar o [ProductName] em:</String>
107
108 <String Id="InstallScopeDlg_Title" Overridable="yes">Programa de Configuração do [ProductName]</String>
109 <String Id="InstallScopeDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
110 <String Id="InstallScopeDlgDescription" Overridable="yes">Escolha o âmbito e a pasta de instalação</String>
111 <String Id="InstallScopeDlgTitle" Overridable="yes">{\WixUI_Font_Title}Âmbito de Instalação</String>
112 <String Id="InstallScopeDlgPerUser" Overridable="yes">{\WixUI_Font_Emphasized}In&amp;stalar apenas para mim ([LogonUser])</String>
113 <String Id="InstallScopeDlgPerUserDescription" Overridable="yes">O [ProductName] será instalado numa pasta por utilizador e estará disponível apenas para a sua conta de utilizador. Não é necessário ter privilégios de Administrador locais.</String>
114 <String Id="InstallScopeDlgNoPerUserDescription" Overridable="yes">O [ProductName] não suporta a instalação por utilizador.</String>
115 <String Id="InstallScopeDlgPerMachine" Overridable="yes">{\WixUI_Font_Emphasized}Instalar para todos os utilizadores deste &amp;computador</String>
116 <String Id="InstallScopeDlgPerMachineDescription" Overridable="yes">Por predefinição, o [ProductName] será instalado numa pasta por computador e estará disponível para todos os utilizadores. Pode alterar a pasta de instalação predefinida. É necessário ter privilégios de Administrador locais.</String>
117 <String Id="InstallScopeDlgFolderLabel" Overridable="yes">Pasta de &amp;instalação:</String>
118 <String Id="InstallScopeDlgChange" Overridable="yes">Alt&amp;erar...</String>
119
120 <String Id="InvalidDirDlg_Title" Overridable="yes">Programa de Configuração do [ProductName]</String>
121 <String Id="InvalidDirDlgText" Overridable="yes">O directório de instalação tem de ser numa unidade de disco rígido.</String>
122 <String Id="InvalidDirDlgIcon" Overridable="yes">WixUI_Ico_Info</String>
123 <String Id="InvalidDirDlgIconTooltip" Overridable="yes">Ícone de informações</String>
124
125 <String Id="LicenseAgreementDlg_Title" Overridable="yes">Programa de Configuração do [ProductName]</String>
126 <String Id="LicenseAgreementDlgLicenseAcceptedCheckBox" Overridable="yes">&amp;Aceito os termos do Contrato de Licença</String>
127 <String Id="LicenseAgreementDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
128 <String Id="LicenseAgreementDlgDescription" Overridable="yes">Leia atentamente o seguinte contrato de licença</String>
129 <String Id="LicenseAgreementDlgTitle" Overridable="yes">{\WixUI_Font_Title}Contrato de Licença do Utilizador Final</String>
130
131 <String Id="MaintenanceTypeDlg_Title" Overridable="yes">Programa de Configuração do [ProductName]</String>
132 <String Id="MaintenanceTypeDlgChangeButton" Overridable="yes">Alt&amp;erar</String>
133 <String Id="MaintenanceTypeDlgChangeButtonTooltip" Overridable="yes">Alterar a Instalação</String>
134 <String Id="MaintenanceTypeDlgRepairButton" Overridable="yes">Re&amp;parar</String>
135 <String Id="MaintenanceTypeDlgRepairButtonTooltip" Overridable="yes">Reparar Instalação</String>
136 <String Id="MaintenanceTypeDlgRemoveButton" Overridable="yes">&amp;Remover</String>
137 <String Id="MaintenanceTypeDlgRemoveButtonTooltip" Overridable="yes">Remover Instalação</String>
138 <String Id="MaintenanceTypeDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
139 <String Id="MaintenanceTypeDlgDescription" Overridable="yes">Seleccione a operação que pretende executar.</String>
140 <String Id="MaintenanceTypeDlgTitle" Overridable="yes">{\WixUI_Font_Title}Alterar, reparar ou remover a instalação</String>
141 <String Id="MaintenanceTypeDlgChangeText" Overridable="yes">Permite-lhe alterar a forma como as funcionalidades estão instaladas.</String>
142 <String Id="MaintenanceTypeDlgChangeDisabledText" Overridable="yes">O [ProductName] não tem funcionalidades seleccionáveis de forma independente.</String>
143 <String Id="MaintenanceTypeDlgRemoveText" Overridable="yes">Remove o [ProductName] do computador.</String>
144 <String Id="MaintenanceTypeDlgRemoveDisabledText" Overridable="yes">Não é possível remover o [ProductName].</String>
145 <String Id="MaintenanceTypeDlgRepairText" Overridable="yes">Repara erros na instalação mais recente corrigindo ficheiros, atalhos e entradas do registo em falta ou danificados.</String>
146 <String Id="MaintenanceTypeDlgRepairDisabledText" Overridable="yes">Não é possível reparar o [ProductName].</String>
147
148 <String Id="MaintenanceWelcomeDlg_Title" Overridable="yes">Programa de Configuração do [ProductName]</String>
149 <String Id="MaintenanceWelcomeDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
150 <String Id="MaintenanceWelcomeDlgDescription" Overridable="yes">O Assistente de Configuração permite-lhe alterar o modo como as funcionalidades do [ProductName] são instaladas no computador ou removê-lo do seu computador. Clique em Seguinte para continuar ou em Cancelar para sair do Assistente de Configuração.</String>
151 <String Id="MaintenanceWelcomeDlgTitle" Overridable="yes">{\WixUI_Font_Bigger}Bem-vindo ao Assistente de Configuração do [ProductName]</String>
152
153 <String Id="MsiRMFilesInUse_Title" Overridable="yes">Programa de Configuração do [ProductName]</String>
154 <String Id="MsiRMFilesInUseBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
155 <String Id="MsiRMFilesInUseText" Overridable="yes">As aplicações seguintes estão a utilizar ficheiros que necessitam de ser actualizados por esta configuração. Pode deixar o Assistente de Configuração fechá-las e tentar reiniciá-las ou reiniciar o computador mais tarde.</String>
156 <String Id="MsiRMFilesInUseDescription" Overridable="yes">Alguns ficheiros que é necessário actualizar estão actualmente em utilização.</String>
157 <String Id="MsiRMFilesInUseTitle" Overridable="yes">{\WixUI_Font_Title}Ficheiros em Utilização</String>
158 <String Id="MsiRMFilesInUseUseRM" Overridable="yes">&amp;Fechar as aplicações e tentar reiniciá-las.</String>
159 <String Id="MsiRMFilesInUseDontUseRM" Overridable="yes">&amp;Não fechar as aplicações. Será necessário reiniciar o computador.</String>
160
161 <String Id="OutOfDiskDlg_Title" Overridable="yes">Programa de Configuração do [ProductName]</String>
162 <String Id="OutOfDiskDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
163 <String Id="OutOfDiskDlgText" Overridable="yes">Os volumes realçados não têm espaço em disco suficiente para as funcionalidades actualmente seleccionadas. Pode remover alguns ficheiros dos volumes realçados, instalar menos funcionalidades ou seleccionar outra unidade de destino.</String>
164 <String Id="OutOfDiskDlgDescription" Overridable="yes">O espaço em disco necessário para a instalação excede o espaço disponível no disco.</String>
165 <String Id="OutOfDiskDlgTitle" Overridable="yes">{\WixUI_Font_Title}Espaço em Disco Esgotado</String>
166 <String Id="OutOfDiskDlgVolumeList" Overridable="yes">{120}{70}{70}{70}{70}</String>
167
168 <String Id="OutOfRbDiskDlg_Title" Overridable="yes">Programa de Configuração do [ProductName]</String>
169 <String Id="OutOfRbDiskDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
170 <String Id="OutOfRbDiskDlgText" Overridable="yes">Os volumes realçados não têm espaço em disco suficiente para as funcionalidades actualmente seleccionadas. Pode remover alguns ficheiros dos volumes realçados, instalar menos funcionalidades ou seleccionar outra unidade de destino.</String>
171 <String Id="OutOfRbDiskDlgDescription" Overridable="yes">O espaço em disco necessário para a instalação excede o espaço disponível no disco.</String>
172 <String Id="OutOfRbDiskDlgTitle" Overridable="yes">{\WixUI_Font_Title}Espaço em Disco Esgotado</String>
173 <String Id="OutOfRbDiskDlgVolumeList" Overridable="yes">{120}{70}{70}{70}{70}</String>
174 <String Id="OutOfRbDiskDlgText2" Overridable="yes">Alternativamente, poderá optar por desactivar a funcionalidade de reversão do programa de instalação. Desactivar a reversão impede que o instalador restaure o estado original do computador se a instalação for interrompida de alguma forma. Clique em Sim se pretender assumir o risco de desactivar a reversão.</String>
175
176 <String Id="PrepareDlg_Title" Overridable="yes">Programa de Configuração do [ProductName]</String>
177 <String Id="PrepareDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
178 <String Id="PrepareDlgDescription" Overridable="yes">Aguarde enquanto o Assistente de Configuração se prepara para o orientar através da instalação.</String>
179 <String Id="PrepareDlgTitle" Overridable="yes">{\WixUI_Font_Bigger}Bem-vindo ao Assistente de Configuração do [ProductName]</String>
180
181 <String Id="ProgressDlg_Title" Overridable="yes">Programa de Configuração do [ProductName]</String>
182 <String Id="ProgressDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
183 <String Id="ProgressDlgTextInstalling" Overridable="yes">Aguarde enquanto o Assistente de Configuração instala o [ProductName].</String>
184 <String Id="ProgressDlgTitleInstalling" Overridable="yes">{\WixUI_Font_Title}A instalar o [ProductName]</String>
185 <String Id="ProgressDlgTextChanging" Overridable="yes">Aguarde enquanto o Assistente de Configuração altera o [ProductName].</String>
186 <String Id="ProgressDlgTitleChanging" Overridable="yes">{\WixUI_Font_Title}A alterar o [ProductName]</String>
187 <String Id="ProgressDlgTextRepairing" Overridable="yes">Aguarde enquanto o Assistente de Configuração repara o [ProductName].</String>
188 <String Id="ProgressDlgTitleRepairing" Overridable="yes">{\WixUI_Font_Title}A reparar o [ProductName]</String>
189 <String Id="ProgressDlgTextRemoving" Overridable="yes">Aguarde enquanto o Assistente de Configuração remove o [ProductName].</String>
190 <String Id="ProgressDlgTitleRemoving" Overridable="yes">{\WixUI_Font_Title}A remover o [ProductName]</String>
191 <String Id="ProgressDlgTextUpdating" Overridable="yes">Aguarde enquanto o Assistente de Configuração actualiza o [ProductName].</String>
192 <String Id="ProgressDlgTitleUpdating" Overridable="yes">{\WixUI_Font_Title}A actualizar o [ProductName]</String>
193 <String Id="ProgressDlgProgressBar" Overridable="yes">Progresso concluído</String>
194 <String Id="ProgressDlgStatusLabel" Overridable="yes">Estado:</String>
195
196 <String Id="ResumeDlg_Title" Overridable="yes">Programa de Configuração do [ProductName]</String>
197 <String Id="ResumeDlgInstall" Overridable="yes">&amp;Instalar</String>
198 <String Id="ResumeDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
199 <String Id="ResumeDlgDescription" Overridable="yes">O Assistente de Configuração irá concluir a instalação do [ProductName] no seu computador. Clique em Instalar para continuar ou em Cancelar para sair do Assistente de Configuração.</String>
200 <String Id="ResumeDlgTitle" Overridable="yes">{\WixUI_Font_Bigger}A retomar o Assistente de Configuração do [ProductName]</String>
201
202 <String Id="SetupTypeDlg_Title" Overridable="yes">Programa de Configuração do [ProductName]</String>
203 <String Id="SetupTypeDlgTypicalButton" Overridable="yes">&amp;Típica</String>
204 <String Id="SetupTypeDlgTypicalButtonTooltip" Overridable="yes">Instalação Típica</String>
205 <String Id="SetupTypeDlgCustomButton" Overridable="yes">P&amp;ersonalizada</String>
206 <String Id="SetupTypeDlgCustomButtonTooltip" Overridable="yes">Instalação Personalizada</String>
207 <String Id="SetupTypeDlgCompleteButton" Overridable="yes">C&amp;ompleta</String>
208 <String Id="SetupTypeDlgCompleteButtonTooltip" Overridable="yes">Instalação Completa</String>
209 <String Id="SetupTypeDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
210 <String Id="SetupTypeDlgTitle" Overridable="yes">{\WixUI_Font_Title}Escolher o Tipo de Configuração</String>
211 <String Id="SetupTypeDlgDescription" Overridable="yes">Escolha o tipo de configuração mais adequado às suas necessidades</String>
212 <String Id="SetupTypeDlgTypicalText" Overridable="yes">Instala as funcionalidades mais comuns do programa. Recomendado para a maioria dos utilizadores.</String>
213 <String Id="SetupTypeDlgCustomText" Overridable="yes">Permite aos utilizadores escolher as funcionalidades do programa que serão instaladas e onde serão instaladas. Recomendado para utilizadores avançados.</String>
214 <String Id="SetupTypeDlgCompleteText" Overridable="yes">Todas as funcionalidades do programa serão instaladas. Requer a maior quantidade de espaço em disco.</String>
215
216 <String Id="UserExit_Title" Overridable="yes">Programa de Configuração do [ProductName]</String>
217 <String Id="UserExitBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
218 <String Id="UserExitTitle" Overridable="yes">{\WixUI_Font_Bigger}O Assistente de Configuração do [ProductName] foi interrompido</String>
219 <String Id="UserExitDescription1" Overridable="yes">A configuração do [ProductName] foi interrompida. O seu sistema não foi modificado. Para instalar este programa mais tarde, execute novamente a instalação.</String>
220 <String Id="UserExitDescription2" Overridable="yes">Clique no botão Concluir para sair do Assistente de Configuração.</String>
221
222 <String Id="VerifyReadyDlg_Title" Overridable="yes">Programa de Configuração do [ProductName]</String>
223 <String Id="VerifyReadyDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
224 <String Id="VerifyReadyDlgInstall" Overridable="yes">&amp;Instalar</String>
225 <String Id="VerifyReadyDlgInstallText" Overridable="yes">Clique em Instalar para iniciar a instalação. Clique em Anterior para rever ou alterar qualquer uma das definições de instalação. Clique em Cancelar para sair do assistente.</String>
226 <String Id="VerifyReadyDlgInstallTitle" Overridable="yes">{\WixUI_Font_Title}Pronto para instalar o [ProductName]</String>
227 <String Id="VerifyReadyDlgChange" Overridable="yes">Alt&amp;erar</String>
228 <String Id="VerifyReadyDlgChangeText" Overridable="yes">Clique em Alterar para iniciar a instalação. Clique em Anterior para rever ou alterar qualquer uma das definições de instalação. Clique em Cancelar para sair do assistente.</String>
229 <String Id="VerifyReadyDlgChangeTitle" Overridable="yes">{\WixUI_Font_Title}Pronto para alterar o [ProductName]</String>
230 <String Id="VerifyReadyDlgRepair" Overridable="yes">Re&amp;parar</String>
231 <String Id="VerifyReadyDlgRepairText" Overridable="yes">Clique em Reparar para reparar a instalação do [ProductName]. Clique em Anterior para rever ou alterar qualquer uma das definições de instalação. Clique em Cancelar para sair do assistente.</String>
232 <String Id="VerifyReadyDlgRepairTitle" Overridable="yes">{\WixUI_Font_Title}Pronto para reparar o [ProductName]</String>
233 <String Id="VerifyReadyDlgRemove" Overridable="yes">&amp;Remover</String>
234 <String Id="VerifyReadyDlgRemoveText" Overridable="yes">Clique em Remover para remover o [ProductName] do seu computador. Clique em Anterior para rever ou alterar qualquer uma das definições de instalação. Clique em Cancelar para sair do assistente.</String>
235 <String Id="VerifyReadyDlgRemoveTitle" Overridable="yes">{\WixUI_Font_Title}Pronto para remover o [ProductName]</String>
236 <String Id="VerifyReadyDlgUpdate" Overridable="yes">&amp;Actualizar</String>
237 <String Id="VerifyReadyDlgUpdateText" Overridable="yes">Clique em Actualizar para actualizar o [ProductName] a partir do seu computador. Clique em Anterior para rever ou alterar qualquer uma das definições de instalação. Clique em Cancelar para sair do assistente.</String>
238 <String Id="VerifyReadyDlgUpdateTitle" Overridable="yes">{\WixUI_Font_Title}Pronto para actualizar o [ProductName]</String>
239
240 <String Id="WaitForCostingDlg_Title" Overridable="yes">Programa de Configuração do [ProductName]</String>
241 <String Id="WaitForCostingDlgReturn" Overridable="yes">&amp;Regressar</String>
242 <String Id="WaitForCostingDlgText" Overridable="yes">Aguarde enquanto o instalador acaba de determinar os requisitos de espaço em disco.</String>
243 <String Id="WaitForCostingDlgIcon" Overridable="yes">WixUI_Ico_Exclam</String>
244 <String Id="WaitForCostingDlgIconTooltip" Overridable="yes">Ícone de exclamação</String>
245
246 <String Id="WelcomeDlg_Title" Overridable="yes">Programa de Configuração do [ProductName]</String>
247 <String Id="WelcomeDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
248 <String Id="WelcomeDlgDescription" Overridable="yes">O Assistente de Configuração vai instalar o [ProductName] no seu computador. Clique em Seguinte para continuar ou em Cancelar para sair do Assistente de Configuração.</String>
249 <String Id="WelcomeUpdateDlgDescriptionUpdate" Overridable="yes">O Assistente de Configuração actualizará o [ProductName] no computador. Clique em Seguinte para continuar ou em Cancelar para sair do Assistente de Configuração.</String>
250 <String Id="WelcomeDlgTitle" Overridable="yes">{\WixUI_Font_Bigger}Bem-vindo ao Assistente de Configuração do [ProductName]</String>
251
252 <String Id="WelcomeEulaDlg_Title" Overridable="yes">Programa de Configuração do [ProductName]</String>
253 <String Id="WelcomeEulaDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
254 <String Id="WelcomeEulaDlgLicenseAcceptedCheckBox" Overridable="yes">&amp;Aceito os termos do Contrato de Licença</String>
255 <String Id="WelcomeEulaDlgInstall" Overridable="yes">&amp;Instalar</String>
256 <String Id="WelcomeEulaDlgUpdate" Overridable="yes">&amp;Actualizar</String>
257 <String Id="WelcomeEulaDlgTitle" Overridable="yes">{\WixUI_Font_Title}Leia o Contrato de Licença do [ProductName]</String>
258
259 <String Id="ProgressTextInstallValidate" Overridable="yes">A validar instalação</String>
260 <String Id="ProgressTextInstallFiles" Overridable="yes">A copiar novos ficheiros</String>
261 <String Id="ProgressTextInstallFilesTemplate" Overridable="yes">Ficheiro: [1], Directório: [9], Tamanho: [6]</String>
262 <String Id="ProgressTextInstallAdminPackage" Overridable="yes">A copiar ficheiros de instalação via rede</String>
263 <String Id="ProgressTextInstallAdminPackageTemplate" Overridable="yes">Ficheiro: [1], Directório: [9], Tamanho: [6]</String>
264 <String Id="ProgressTextFileCost" Overridable="yes">A calcular os requisitos de espaço</String>
265 <String Id="ProgressTextCostInitialize" Overridable="yes">A calcular os requisitos de espaço</String>
266 <String Id="ProgressTextCostFinalize" Overridable="yes">A calcular os requisitos de espaço</String>
267 <String Id="ProgressTextCreateShortcuts" Overridable="yes">A criar atalhos</String>
268 <String Id="ProgressTextCreateShortcutsTemplate" Overridable="yes">Atalho: [1]</String>
269 <String Id="ProgressTextPublishComponents" Overridable="yes">A Publicar Componentes Qualificados</String>
270 <String Id="ProgressTextPublishComponentsTemplate" Overridable="yes">ID de Componente: [1], Qualificador: [2]</String>
271 <String Id="ProgressTextPublishFeatures" Overridable="yes">A Publicar Funcionalidades do Produto</String>
272 <String Id="ProgressTextPublishFeaturesTemplate" Overridable="yes">Funcionalidade: [1]</String>
273 <String Id="ProgressTextPublishProduct" Overridable="yes">A publicar informações do produto</String>
274 <String Id="ProgressTextRegisterClassInfo" Overridable="yes">A Registar Servidores de Classes</String>
275 <String Id="ProgressTextRegisterClassInfoTemplate" Overridable="yes">ID de Classe: [1]</String>
276 <String Id="ProgressTextRegisterExtensionInfo" Overridable="yes">A registar servidores de extensões</String>
277 <String Id="ProgressTextRegisterExtensionInfoTemplate" Overridable="yes">Extensão: [1]</String>
278 <String Id="ProgressTextRegisterMIMEInfo" Overridable="yes">A registar informações MIME</String>
279 <String Id="ProgressTextRegisterMIMEInfoTemplate" Overridable="yes">Tipo de Conteúdo MIME: [1], Extensão: [2]</String>
280 <String Id="ProgressTextRegisterProgIdInfo" Overridable="yes">A registar identificadores de programas</String>
281 <String Id="ProgressTextRegisterProgIdInfoTemplate" Overridable="yes">IDProg: [1].</String>
282 <String Id="ProgressTextAllocateRegistrySpace" Overridable="yes">A alocar espaço de registo</String>
283 <String Id="ProgressTextAllocateRegistrySpaceTemplate" Overridable="yes">Espaço livre: [1]</String>
284 <String Id="ProgressTextAppSearch" Overridable="yes">A procurar aplicações instaladas</String>
285 <String Id="ProgressTextAppSearchTemplate" Overridable="yes">Propriedade: [1], Assinatura: [2]</String>
286 <String Id="ProgressTextBindImage" Overridable="yes">A vincular executáveis</String>
287 <String Id="ProgressTextBindImageTemplate" Overridable="yes">Ficheiro: [1]</String>
288 <String Id="ProgressTextCCPSearch" Overridable="yes">A procurar produtos qualificados</String>
289 <String Id="ProgressTextCreateFolders" Overridable="yes">A criar pastas</String>
290 <String Id="ProgressTextCreateFoldersTemplate" Overridable="yes">Pasta: [1]</String>
291 <String Id="ProgressTextDeleteServices" Overridable="yes">A eliminar serviços</String>
292 <String Id="ProgressTextDeleteServicesTemplate" Overridable="yes">Serviço: [1]</String>
293 <String Id="ProgressTextDuplicateFiles" Overridable="yes">A criar ficheiros duplicados</String>
294 <String Id="ProgressTextDuplicateFilesTemplate" Overridable="yes">Ficheiro: [1], Directório: [9], Tamanho: [6]</String>
295 <String Id="ProgressTextFindRelatedProducts" Overridable="yes">A procurar aplicações relacionadas</String>
296 <String Id="ProgressTextFindRelatedProductsTemplate" Overridable="yes">Aplicação localizada: [1]</String>
297 <String Id="ProgressTextInstallODBC" Overridable="yes">A instalar componentes ODBC</String>
298 <String Id="ProgressTextInstallServices" Overridable="yes">A instalar novos serviços</String>
299 <String Id="ProgressTextInstallServicesTemplate" Overridable="yes">Serviço: [2]</String>
300 <String Id="ProgressTextLaunchConditions" Overridable="yes">A avaliar condições de iniciação</String>
301 <String Id="ProgressTextMigrateFeatureStates" Overridable="yes">A migrar estados de funcionalidades de aplicações relacionadas</String>
302 <String Id="ProgressTextMigrateFeatureStatesTemplate" Overridable="yes">Aplicação: [1]</String>
303 <String Id="ProgressTextMoveFiles" Overridable="yes">A mover ficheiros</String>
304 <String Id="ProgressTextMoveFilesTemplate" Overridable="yes">Ficheiro: [1], Directório: [9], Tamanho: [6]</String>
305 <String Id="ProgressTextPatchFiles" Overridable="yes">A aplicar patches a ficheiros</String>
306 <String Id="ProgressTextPatchFilesTemplate" Overridable="yes">Ficheiro: [1], Directório: [2], Tamanho: [3]</String>
307 <String Id="ProgressTextProcessComponents" Overridable="yes">A actualizar o registo do componente</String>
308 <String Id="ProgressTextRegisterComPlus" Overridable="yes">A Registar Aplicações e Componentes COM+</String>
309 <String Id="ProgressTextRegisterComPlusTemplate" Overridable="yes">IDAplic: [1]{{, TipoAplic: [2], Utilizadores: [3], RSN: [4]}}</String>
310 <String Id="ProgressTextRegisterFonts" Overridable="yes">A registar tipos de letra</String>
311 <String Id="ProgressTextRegisterFontsTemplate" Overridable="yes">Tipo de Letra: [1]</String>
312 <String Id="ProgressTextRegisterProduct" Overridable="yes">A registar produto</String>
313 <String Id="ProgressTextRegisterProductTemplate" Overridable="yes">[1]</String>
314 <String Id="ProgressTextRegisterTypeLibraries" Overridable="yes">A registar bibliotecas de tipos</String>
315 <String Id="ProgressTextRegisterTypeLibrariesTemplate" Overridable="yes">IDBibl: [1].</String>
316 <String Id="ProgressTextRegisterUser" Overridable="yes">A registar utilizador</String>
317 <String Id="ProgressTextRegisterUserTemplate" Overridable="yes">[1]</String>
318 <String Id="ProgressTextRemoveDuplicateFiles" Overridable="yes">A remover ficheiros duplicados</String>
319 <String Id="ProgressTextRemoveDuplicateFilesTemplate" Overridable="yes">Ficheiro: [1], Directório: [9]</String>
320 <String Id="ProgressTextRemoveEnvironmentStrings" Overridable="yes">A actualizar cadeias de caracteres de ambiente</String>
321 <String Id="ProgressTextRemoveEnvironmentStringsTemplate" Overridable="yes">Nome: [1], Valor: [2], Acção [3]</String>
322 <String Id="ProgressTextRemoveExistingProducts" Overridable="yes">A remover aplicações</String>
323 <String Id="ProgressTextRemoveExistingProductsTemplate" Overridable="yes">Aplicação: [1], Linha de comandos: [2]</String>
324 <String Id="ProgressTextRemoveFiles" Overridable="yes">A remover ficheiros</String>
325 <String Id="ProgressTextRemoveFilesTemplate" Overridable="yes">Ficheiro: [1], Directório: [9]</String>
326 <String Id="ProgressTextRemoveFolders" Overridable="yes">A remover pastas</String>
327 <String Id="ProgressTextRemoveFoldersTemplate" Overridable="yes">Pasta: [1]</String>
328 <String Id="ProgressTextRemoveIniValues" Overridable="yes">A remover entradas de ficheiros INI</String>
329 <String Id="ProgressTextRemoveIniValuesTemplate" Overridable="yes">Ficheiro: [1], Secção: [2], Chave: [3], Valor: [4]</String>
330 <String Id="ProgressTextRemoveODBC" Overridable="yes">A remover os componentes ODBC</String>
331 <String Id="ProgressTextRemoveRegistryValues" Overridable="yes">A remover valores do registo de sistema</String>
332 <String Id="ProgressTextRemoveRegistryValuesTemplate" Overridable="yes">Chave: [1], Nome: [2]</String>
333 <String Id="ProgressTextRemoveShortcuts" Overridable="yes">A remover atalhos</String>
334 <String Id="ProgressTextRemoveShortcutsTemplate" Overridable="yes">Atalho: [1]</String>
335 <String Id="ProgressTextRMCCPSearch" Overridable="yes">A procurar produtos qualificados</String>
336 <String Id="ProgressTextSelfRegModules" Overridable="yes">A registar módulos</String>
337 <String Id="ProgressTextSelfRegModulesTemplate" Overridable="yes">Ficheiro: [1], Pasta: [2]</String>
338 <String Id="ProgressTextSelfUnregModules" Overridable="yes">A anular o registo de módulos</String>
339 <String Id="ProgressTextSelfUnregModulesTemplate" Overridable="yes">Ficheiro: [1], Pasta: [2]</String>
340 <String Id="ProgressTextSetODBCFolders" Overridable="yes">A inicializar directórios de ODBC</String>
341 <String Id="ProgressTextStartServices" Overridable="yes">A iniciar serviços</String>
342 <String Id="ProgressTextStartServicesTemplate" Overridable="yes">Serviço: [1]</String>
343 <String Id="ProgressTextStopServices" Overridable="yes">A parar serviços</String>
344 <String Id="ProgressTextStopServicesTemplate" Overridable="yes">Serviço: [1]</String>
345 <String Id="ProgressTextUnpublishComponents" Overridable="yes">A Anular a Publicação de Componentes Qualificados</String>
346 <String Id="ProgressTextUnpublishComponentsTemplate" Overridable="yes">ID de Componente: [1], Qualificador: [2]</String>
347 <String Id="ProgressTextUnpublishFeatures" Overridable="yes">A Anular a Publicação de Funcionalidades do Produto</String>
348 <String Id="ProgressTextUnpublishFeaturesTemplate" Overridable="yes">Funcionalidade: [1]</String>
349 <String Id="ProgressTextUnregisterClassInfo" Overridable="yes">Anular o Registo de Servidores de Classes</String>
350 <String Id="ProgressTextUnregisterClassInfoTemplate" Overridable="yes">ID de Classe: [1]</String>
351 <String Id="ProgressTextUnregisterComPlus" Overridable="yes">A Anular o Registo de Aplicações e Componentes COM+</String>
352 <String Id="ProgressTextUnregisterComPlusTemplate" Overridable="yes">IDAplic: [1]{{, TipoAplic: [2]}}</String>
353 <String Id="ProgressTextUnregisterExtensionInfo" Overridable="yes">A anular o registo de servidores de extensões</String>
354 <String Id="ProgressTextUnregisterExtensionInfoTemplate" Overridable="yes">Extensão: [1]</String>
355 <String Id="ProgressTextUnregisterFonts" Overridable="yes">A anular o registo de tipos de letra</String>
356 <String Id="ProgressTextUnregisterFontsTemplate" Overridable="yes">Tipo de Letra: [1]</String>
357 <String Id="ProgressTextUnregisterMIMEInfo" Overridable="yes">A anular o registo de informações MIME</String>
358 <String Id="ProgressTextUnregisterMIMEInfoTemplate" Overridable="yes">Tipo de Conteúdo MIME: [1], Extensão: [2]</String>
359 <String Id="ProgressTextUnregisterProgIdInfo" Overridable="yes">A anular o registo de identificadores de programas</String>
360 <String Id="ProgressTextUnregisterProgIdInfoTemplate" Overridable="yes">IDProg: [1].</String>
361 <String Id="ProgressTextUnregisterTypeLibraries" Overridable="yes">A anular o registo de bibliotecas de tipos</String>
362 <String Id="ProgressTextUnregisterTypeLibrariesTemplate" Overridable="yes">IDBibl: [1].</String>
363 <String Id="ProgressTextWriteEnvironmentStrings" Overridable="yes">A actualizar cadeias de caracteres de ambiente</String>
364 <String Id="ProgressTextWriteEnvironmentStringsTemplate" Overridable="yes">Nome: [1], Valor: [2], Acção [3]</String>
365 <String Id="ProgressTextWriteIniValues" Overridable="yes">A escrever valores de ficheiros INI</String>
366 <String Id="ProgressTextWriteIniValuesTemplate" Overridable="yes">Ficheiro: [1], Secção: [2], Chave: [3], Valor: [4]</String>
367 <String Id="ProgressTextWriteRegistryValues" Overridable="yes">A escrever valores do registo de sistema</String>
368 <String Id="ProgressTextWriteRegistryValuesTemplate" Overridable="yes">Chave: [1], Nome: [2], Valor: [3]</String>
369 <String Id="ProgressTextAdvertise" Overridable="yes">A anunciar a aplicação</String>
370 <String Id="ProgressTextGenerateScript" Overridable="yes">A gerar operações de script para a acção:</String>
371 <String Id="ProgressTextGenerateScriptTemplate" Overridable="yes">[1]</String>
372 <String Id="ProgressTextInstallSFPCatalogFile" Overridable="yes">A instalar o catálogo de sistema</String>
373 <String Id="ProgressTextInstallSFPCatalogFileTemplate" Overridable="yes">Ficheiro: [1], Dependências: [2]</String>
374 <String Id="ProgressTextMsiPublishAssemblies" Overridable="yes">A publicar informações de assemblagem</String>
375 <String Id="ProgressTextMsiPublishAssembliesTemplate" Overridable="yes">Contexto de Aplicação: [1], Nome de Assemblagem: [2]</String>
376 <String Id="ProgressTextMsiUnpublishAssemblies" Overridable="yes">A anular a publicação de informações de assemblagem</String>
377 <String Id="ProgressTextMsiUnpublishAssembliesTemplate" Overridable="yes">Contexto de Aplicação: [1], Nome de Assemblagem: [2]</String>
378 <String Id="ProgressTextRollback" Overridable="yes">A reverter acção:</String>
379 <String Id="ProgressTextRollbackTemplate" Overridable="yes">[1]</String>
380 <String Id="ProgressTextRollbackCleanup" Overridable="yes">A remover ficheiros de cópia de segurança</String>
381 <String Id="ProgressTextRollbackCleanupTemplate" Overridable="yes">Ficheiro: [1]</String>
382 <String Id="ProgressTextUnmoveFiles" Overridable="yes">A remover ficheiros movidos</String>
383 <String Id="ProgressTextUnmoveFilesTemplate" Overridable="yes">Ficheiro: [1], Directório: [9]</String>
384 <String Id="ProgressTextUnpublishProduct" Overridable="yes">A anular a publicação de informações do produto</String>
385
386 <String Id="Error0" Overridable="yes">{{Erro fatal: }}</String>
387 <String Id="Error1" Overridable="yes">{{Erro [1]. }}</String>
388 <String Id="Error2" Overridable="yes">Aviso [1]. </String>
389 <String Id="Error4" Overridable="yes">Informações [1]. </String>
390 <String Id="Error5" Overridable="yes">O instalador encontrou um erro inesperado ao instalar este pacote. Esta situação pode indicar um problema com este pacote. O código de erro é [1]. {{Os argumentos são: [2], [3], [4]}}</String>
391 <String Id="Error7" Overridable="yes">{{Disco cheio: }}</String>
392 <String Id="Error8" Overridable="yes">Acção [Time]: [1]. [2]</String>
393 <String Id="Error9" Overridable="yes">[ProductName]</String>
394 <String Id="Error10" Overridable="yes">{[2]}{, [3]}{, [4]}</String>
395 <String Id="Error11" Overridable="yes">Tipo de mensagem: [1], Argumento: [2]</String>
396 <String Id="Error12" Overridable="yes">=== Registo iniciado: [Date] [Time] ===</String>
397 <String Id="Error13" Overridable="yes">=== Registo terminado: [Date] [Time] ===</String>
398 <String Id="Error14" Overridable="yes">Acção iniciada [Time]: [1].</String>
399 <String Id="Error15" Overridable="yes">Acção terminada [Time]: [1]. Valor devolvido [2].</String>
400 <String Id="Error16" Overridable="yes">Tempo restante: {[1] minutos }{[2] segundos}</String>
401 <String Id="Error17" Overridable="yes">Memória esgotada. Encerre outras aplicações antes de tentar novamente.</String>
402 <String Id="Error18" Overridable="yes">O instalador deixou de responder.</String>
403 <String Id="Error19" Overridable="yes">O instalador parou prematuramente.</String>
404 <String Id="Error20" Overridable="yes">Aguarde enquanto o Windows configura o [ProductName]</String>
405 <String Id="Error21" Overridable="yes">A recolher as informações necessárias...</String>
406 <String Id="Error22" Overridable="yes">A remover versões antigas desta aplicação...</String>
407 <String Id="Error23" Overridable="yes">A preparar para remover as versões antigas desta aplicação...</String>
408 <String Id="Error32" Overridable="yes">O Programa de Configuração do {[ProductName] }foi concluído com êxito.</String>
409 <String Id="Error33" Overridable="yes">O Programa de Configuração do {[ProductName] }falhou.</String>
410 <String Id="Error1101" Overridable="yes">Erro ao ler a partir do ficheiro: [2]. {{ Erro de sistema [3].}} Verifique se o ficheiro existe e se pode aceder ao mesmo.</String>
411 <String Id="Error1301" Overridable="yes">Não é possível criar o ficheiro '[2]'. Já existe um directório com esse nome. Cancele a instalação e tente instalar numa localização diferente.</String>
412 <String Id="Error1302" Overridable="yes">Insira o disco: [2]</String>
413 <String Id="Error1303" Overridable="yes">O instalador não tem privilégios suficientes para aceder a este directório: [2]. A instalação não pode continuar. Inicie sessão como administrador ou contacte o administrador do sistema.</String>
414 <String Id="Error1304" Overridable="yes">Erro ao escrever no ficheiro: [2]. Verifique se tem acesso a esse directório.</String>
415 <String Id="Error1305" Overridable="yes">Erro ao ler a partir do ficheiro [2]. {{ Erro de sistema [3].}} Verifique se o ficheiro existe e se pode aceder ao mesmo.</String>
416 <String Id="Error1306" Overridable="yes">Outra aplicação tem acesso exclusivo ao ficheiro '[2]'. Encerre todas as outras aplicações e clique em Repetir.</String>
417 <String Id="Error1307" Overridable="yes">Não existe espaço suficiente em disco para instalar este ficheiro: [2]. Liberte algum espaço em disco e clique em Repetir ou clique em Cancelar para sair.</String>
418 <String Id="Error1308" Overridable="yes">Ficheiro de origem não localizado: [2]. Verifique se o ficheiro existe e se consegue aceder ao mesmo.</String>
419 <String Id="Error1309" Overridable="yes">Erro ao ler a partir do ficheiro: [3]. {{ Erro de sistema [2].}} Verifique se o ficheiro existe e se pode aceder ao mesmo.</String>
420 <String Id="Error1310" Overridable="yes">Erro ao escrever no ficheiro: [3]. {{ Erro de sistema [2].}} Verifique se tem acesso a esse directório.</String>
421 <String Id="Error1311" Overridable="yes">Ficheiro de origem não localizado{{(cabinet)}}: [2]. Verifique se o ficheiro existe e se consegue aceder ao mesmo.</String>
422 <String Id="Error1312" Overridable="yes">Não é possível criar o directório '[2]'. Já existe um ficheiro com este nome. Mude o nome ou remova o ficheiro e clique em Repetir ou clique em Cancelar para sair.</String>
423 <String Id="Error1313" Overridable="yes">O volume [2] está actualmente indisponível. Seleccione outro volume.</String>
424 <String Id="Error1314" Overridable="yes">O caminho especificado '[2]' está indisponível.</String>
425 <String Id="Error1315" Overridable="yes">Não é possível escrever na pasta especificada: [2].</String>
426 <String Id="Error1316" Overridable="yes">Ocorreu um erro de rede ao tentar ler a partir do ficheiro: [2]</String>
427 <String Id="Error1317" Overridable="yes">Ocorreu um erro ao tentar criar o directório: [2]</String>
428 <String Id="Error1318" Overridable="yes">Ocorreu um erro de rede ao tentar criar o directório: [2]</String>
429 <String Id="Error1319" Overridable="yes">Ocorreu um erro de rede ao tentar abrir o ficheiro CAB de origem: [2]</String>
430 <String Id="Error1320" Overridable="yes">O caminho especificado é demasiado longo: [2]</String>
431 <String Id="Error1321" Overridable="yes">O Instalador não tem privilégios suficientes para modificar este ficheiro: [2].</String>
432 <String Id="Error1322" Overridable="yes">Uma parte do caminho da pasta '[2]' é inválida. Está em branco ou excede o comprimento permitido pelo sistema.</String>
433 <String Id="Error1323" Overridable="yes">O caminho para a pasta '[2]' contém palavras que não são válidas em caminhos de pastas.</String>
434 <String Id="Error1324" Overridable="yes">O caminho da pasta '[2]' contém um carácter inválido.</String>
435 <String Id="Error1325" Overridable="yes">'[2]' não é um nome abreviado de ficheiro válido.</String>
436 <String Id="Error1326" Overridable="yes">Erro ao obter a segurança do ficheiro: [3] GetLastError: [2]</String>
437 <String Id="Error1327" Overridable="yes">Unidade Inválida: [2]</String>
438 <String Id="Error1328" Overridable="yes">Erro ao aplicar o patch ao ficheiro [2]. O ficheiro foi provavelmente actualizado por outros meios e já não pode ser modificado por este patch. Para mais informações, contacte o fornecedor do patch. {{Erro de Sistema: [3]}}</String>
439 <String Id="Error1329" Overridable="yes">Não é possível instalar um ficheiro necessário porque o ficheiro CAB [2] não tem assinatura digital. Isto pode indicar que o ficheiro CAB está danificado.</String>
440 <String Id="Error1330" Overridable="yes">Não é possível instalar um ficheiro necessário porque o ficheiro CAB [2] tem uma assinatura digital inválida. Isto pode indicar que o ficheiro CAB está danificado.{{ O erro [3] foi devolvido por WinVerifyTrust.}}</String>
441 <String Id="Error1331" Overridable="yes">Falha na cópia correcta do ficheiro [2]: erro de CRC.</String>
442 <String Id="Error1332" Overridable="yes">Falha na movimentação correcta do ficheiro [2]: erro de CRC.</String>
443 <String Id="Error1333" Overridable="yes">Falha na aplicação correcta do ficheiro de patch [2]: erro de CRC.</String>
444 <String Id="Error1334" Overridable="yes">O ficheiro '[2]' não pode ser instalado porque não foi possível localizá-lo no ficheiro CAB [3]. Esta situação pode indicar um erro de rede, um erro ao ler a partir do CD-ROM ou um problema com este pacote.</String>
445 <String Id="Error1335" Overridable="yes">O ficheiro CAB '[2]' que é necessário para esta instalação está danificado e não pode ser utilizado. Esta situação pode indicar um erro de rede, um erro ao ler a partir do CD-ROM ou um problema com este pacote.</String>
446 <String Id="Error1336" Overridable="yes">Ocorreu um erro ao criar um ficheiro temporário que é necessário para concluir esta instalação.{{ Pasta: [3]. Código de erro de sistema: [2]}}</String>
447 <String Id="Error1401" Overridable="yes">Não foi possível criar a chave: [2]. {{ Erro de sistema [3].}} Verifique se tem acesso suficiente a essa chave ou contacte o suporte técnico. </String>
448 <String Id="Error1402" Overridable="yes">Não foi possível abrir a chave: [2]. {{ Erro de sistema [3].}} Verifique se tem acesso suficiente a essa chave ou contacte o suporte técnico. </String>
449 <String Id="Error1403" Overridable="yes">Não foi possível eliminar o valor [2] da chave [3]. {{ Erro de sistema [4].}} Verifique se tem acesso suficiente a essa chave ou contacte o suporte técnico. </String>
450 <String Id="Error1404" Overridable="yes">Não foi possível eliminar a chave [2]. {{ Erro de sistema [3].}} Verifique se tem acesso suficiente a essa chave ou contacte o suporte técnico. </String>
451 <String Id="Error1405" Overridable="yes">Não foi possível ler o valor [2] da chave [3]. {{ Erro de sistema [4].}} Verifique se tem acesso suficiente a essa chave ou contacte o suporte técnico. </String>
452 <String Id="Error1406" Overridable="yes">Não foi possível escrever o valor [2] na chave [3]. {{ Erro de sistema [4].}} Verifique se tem acesso suficiente a essa chave ou contacte o suporte técnico.</String>
453 <String Id="Error1407" Overridable="yes">Não foi possível obter nomes de valor para a chave [2]. {{ Erro de sistema [3].}} Verifique se tem acesso suficiente a essa chave ou contacte o suporte técnico.</String>
454 <String Id="Error1408" Overridable="yes">Não foi possível obter nomes de subchave para a chave [2]. {{ Erro de sistema [3].}} Verifique se tem acesso suficiente a essa chave ou contacte o suporte técnico.</String>
455 <String Id="Error1409" Overridable="yes">Não foi possível ler as informações de segurança para a chave [2]. {{ Erro de sistema [3].}} Verifique se tem acesso suficiente a essa chave ou contacte o suporte técnico.</String>
456 <String Id="Error1410" Overridable="yes">Não foi possível aumentar o espaço de registo disponível. São necessários [2] KB de espaço livre no registo para a instalação desta aplicação.</String>
457 <String Id="Error1500" Overridable="yes">Está em curso uma outra instalação. Deverá concluir essa instalação antes de continuar esta.</String>
458 <String Id="Error1501" Overridable="yes">Erro ao aceder a dados protegidos. Certifique-se de que o Windows Installer está correctamente configurado e tente instalar de novo.</String>
459 <String Id="Error1502" Overridable="yes">O utilizador '[2]' iniciou anteriormente uma instalação do produto '[3]'. Esse utilizador terá de executar essa instalação novamente antes de poder utilizar esse produto. A instalação actual irá agora continuar.</String>
460 <String Id="Error1503" Overridable="yes">O utilizador '[2]' iniciou anteriormente uma instalação do produto '[3]'. Esse utilizador terá de executar essa instalação novamente antes de poder utilizar esse produto.</String>
461 <String Id="Error1601" Overridable="yes">Espaço em disco esgotado -- Volume: '[2]'; espaço necessário: [3] KB; espaço disponível: [4] KB. Liberte algum espaço em disco e tente novamente.</String>
462 <String Id="Error1602" Overridable="yes">Tem a certeza de que pretende cancelar?</String>
463 <String Id="Error1603" Overridable="yes">O ficheiro [2][3] está a ser utilizado{ pelo seguinte processo: Nome: [4], ID: [5], Título da Janela: '[6]'}. Feche essa aplicação e tente novamente.</String>
464 <String Id="Error1604" Overridable="yes">O produto '[2]' já está instalado, impedindo a instalação deste produto. Os dois produtos são incompatíveis.</String>
465 <String Id="Error1605" Overridable="yes">Não existe espaço em disco suficiente no volume '[2]' para continuar a instalação com a recuperação activada. São necessários [3] KB, mas apenas estão disponíveis [4] KB. Clique em Ignorar para continuar com a instalação sem guardar as informações de recuperação, clique em Repetir para procurar espaço disponível de novo ou clique em Cancelar para sair da instalação.</String>
466 <String Id="Error1606" Overridable="yes">Não foi possível aceder à localização de rede [2].</String>
467 <String Id="Error1607" Overridable="yes">As aplicações seguintes devem ser fechadas antes de continuar a instalação:</String>
468 <String Id="Error1608" Overridable="yes">Não foi possível localizar nenhum produto compatível anteriormente instalado no computador para instalar este produto.</String>
469 <String Id="Error1609" Overridable="yes">Ocorreu um erro ao aplicar as definições de segurança. [2] não é um utilizador nem um grupo válido. Esta situação pode dever-se a um problema com o pacote ou a um problema ao ligar a um controlador de domínio na rede. Verifique a sua ligação de rede e clique em Repetir ou em Cancelar para terminar a instalação. {{Não é possível localizar o SID do utilizador, erro de sistema [3]}}</String>
470 <String Id="Error1701" Overridable="yes">A chave [2] não é válida. Verifique se introduziu a chave correcta.</String>
471 <String Id="Error1702" Overridable="yes">O instalador tem de reiniciar o sistema para que a configuração de [2] possa continuar. Clique em Sim para reiniciar agora ou em Não se pretender reiniciar manualmente mais tarde.</String>
472 <String Id="Error1703" Overridable="yes">Terá de reiniciar o sistema para que as alterações de configuração efectuadas em [2] produzam efeito. Clique em Sim para reiniciar agora ou em Não se pretender reiniciar manualmente mais tarde.</String>
473 <String Id="Error1704" Overridable="yes">Uma instalação do [2] está actualmente suspensa. Tem de anular as alterações efectuadas por essa instalação para continuar. Pretende anular essas alterações?</String>
474 <String Id="Error1705" Overridable="yes">Uma instalação anterior para este produto está em curso. Tem de anular as alterações efectuadas por essa instalação para continuar. Pretende anular essas alterações?</String>
475 <String Id="Error1706" Overridable="yes">Não é possível localizar um pacote de instalação para o produto [2]. Experimente instalar novamente utilizando uma cópia válida do pacote de instalação '[3]'.</String>
476 <String Id="Error1707" Overridable="yes">A instalação foi concluída com êxito.</String>
477 <String Id="Error1708" Overridable="yes">A instalação falhou.</String>
478 <String Id="Error1709" Overridable="yes">Produto: [2] -- [3]</String>
479 <String Id="Error1710" Overridable="yes">Pode restaurar o computador para o estado anterior ou continuar mais tarde a instalação. Pretende restaurar?</String>
480 <String Id="Error1711" Overridable="yes">Ocorreu um erro ao escrever as informações de instalação no disco. Verifique se existe espaço em disco suficiente disponível e clique em Repetir ou clique em Cancelar para terminar a instalação.</String>
481 <String Id="Error1712" Overridable="yes">Não foi possível localizar um ou mais dos ficheiros necessários para restaurar o estado anterior do computador. O restauro não será possível.</String>
482 <String Id="Error1713" Overridable="yes">O [2] não consegue instalar um dos produtos necessários. Contacte o grupo de suporte técnico. {{Erro de Sistema: [3].}}</String>
483 <String Id="Error1714" Overridable="yes">Não é possível remover a versão anterior do [2]. Contacte o grupo de suporte técnico. {{Erro de Sistema [3].}}</String>
484 <String Id="Error1715" Overridable="yes">[2] instalado</String>
485 <String Id="Error1716" Overridable="yes">[2] configurado</String>
486 <String Id="Error1717" Overridable="yes">[2] removido</String>
487 <String Id="Error1718" Overridable="yes">O ficheiro [2] foi rejeitado pela política de assinaturas digitais.</String>
488 <String Id="Error1719" Overridable="yes">Não foi possível aceder ao serviço Windows Installer. Esta situação pode ocorrer se estiver a executar o Windows em modo de segurança ou se o Windows Installer não estiver correctamente instalado. Contacte o suporte técnico para obter assistência.</String>
489 <String Id="Error1720" Overridable="yes">Existe um problema com este pacote do Windows Installer. Não foi possível executar um script necessário para concluir esta instalação. Contacte o suporte técnico ou o fornecedor do pacote. {{Acção personalizada [2] erro de script [3], [4]: [5] Linha [6], Coluna [7], [8] }}</String>
490 <String Id="Error1721" Overridable="yes">Existe um problema com este pacote do Windows Installer. Não foi possível executar um programa necessário para concluir esta instalação. Contacte o suporte técnico ou o fornecedor do pacote. {{Acção: [2], localização: [3], comando: [4] }}</String>
491 <String Id="Error1722" Overridable="yes">Existe um problema com este pacote do Windows Installer. Um programa executado como parte da configuração não terminou conforme esperado. Contacte o suporte técnico ou o fornecedor do pacote. {{Acção [2], localização: [3], comando: [4] }}</String>
492 <String Id="Error1723" Overridable="yes">Existe um problema com este pacote do Windows Installer. Não foi possível executar uma DLL necessária para concluir esta instalação. Contacte o suporte técnico ou o fornecedor do pacote. {{Acção [2], entrada: [3], biblioteca: [4] }}</String>
493 <String Id="Error1724" Overridable="yes">A remoção foi concluída com êxito.</String>
494 <String Id="Error1725" Overridable="yes">A remoção falhou.</String>
495 <String Id="Error1726" Overridable="yes">O anúncio foi concluído com êxito.</String>
496 <String Id="Error1727" Overridable="yes">O anúncio falhou.</String>
497 <String Id="Error1728" Overridable="yes">A configuração foi concluída com êxito.</String>
498 <String Id="Error1729" Overridable="yes">A configuração falhou.</String>
499 <String Id="Error1730" Overridable="yes">Tem de ser Administrador para remover esta aplicação. Para remover esta aplicação, pode iniciar sessão como Administrador ou contactar o grupo de suporte técnico para assistência.</String>
500 <String Id="Error1731" Overridable="yes">O pacote de instalação de origem do produto [2] não está sincronizado com o pacote cliente. Experimente instalar novamente utilizando uma cópia válida do pacote de instalação '[3]'.</String>
501 <String Id="Error1732" Overridable="yes">Para concluir a instalação do [2], tem de reiniciar o computador. Outros utilizadores têm actualmente sessão iniciada neste computador e o reinício poderá originar a perda do respectivo trabalho. Pretende reiniciar agora?</String>
502 <String Id="Error1801" Overridable="yes">O caminho [2] não é válido. Especifique um caminho válido.</String>
503 <String Id="Error1802" Overridable="yes">Memória esgotada. Encerre outras aplicações antes de tentar novamente.</String>
504 <String Id="Error1803" Overridable="yes">Não existe nenhum disco na unidade [2]. Insira um disco e clique em Repetir ou clique em Cancelar para voltar ao volume seleccionado anteriormente.</String>
505 <String Id="Error1804" Overridable="yes">Não existe nenhum disco na unidade [2]. Insira um disco e clique em Repetir ou clique em Cancelar para voltar à caixa de diálogo de procura e seleccionar um volume diferente.</String>
506 <String Id="Error1805" Overridable="yes">A pasta [2] não existe. Introduza um caminho para uma pasta existente.</String>
507 <String Id="Error1806" Overridable="yes">Não tem privilégios suficientes para ler esta pasta.</String>
508 <String Id="Error1807" Overridable="yes">Não foi possível determinar uma pasta de destino válida para a instalação.</String>
509 <String Id="Error1901" Overridable="yes">Erro ao tentar ler a partir da base de dados de instalação de origem: [2].</String>
510 <String Id="Error1902" Overridable="yes">A agendar uma operação de reinício: a mudar o nome do ficheiro [2] para [3]. Tem de reiniciar para concluir a operação.</String>
511 <String Id="Error1903" Overridable="yes">A agendar uma operação de reinício: a eliminar o ficheiro [2] Tem de reiniciar para concluir a operação.</String>
512 <String Id="Error1904" Overridable="yes">Não foi possível registar o módulo [2]. HRESULT [3]. Contacte o suporte técnico.</String>
513 <String Id="Error1905" Overridable="yes">Não foi possível anular o registo do módulo [2]. HRESULT [3]. Contacte o suporte técnico.</String>
514 <String Id="Error1906" Overridable="yes">Falha ao colocar em cache o pacote [2]. Erro: [3]. Contacte o suporte técnico.</String>
515 <String Id="Error1907" Overridable="yes">Não foi possível registar o tipo de letra [2]. Verifique se tem permissões suficientes para instalar tipos de letra e se o sistema suporta este tipo de letra.</String>
516 <String Id="Error1908" Overridable="yes">Não foi possível anular o registo do tipo de letra [2]. Verifique se tem permissões suficientes para remover tipos de letra.</String>
517 <String Id="Error1909" Overridable="yes">Não foi possível criar o Atalho [2]. Certifique-se de que a pasta de destino existe e que pode aceder à mesma.</String>
518 <String Id="Error1910" Overridable="yes">Não foi possível remover o Atalho [2]. Verifique se o ficheiro de atalho existe e se pode aceder ao mesmo.</String>
519 <String Id="Error1911" Overridable="yes">Não foi possível registar a biblioteca de tipos para o ficheiro [2]. Contacte o suporte técnico.</String>
520 <String Id="Error1912" Overridable="yes">Não foi possível anular o registo da biblioteca de tipos para o ficheiro [2]. Contacte o suporte técnico.</String>
521 <String Id="Error1913" Overridable="yes">Não foi possível actualizar o ficheiro ini [2][3]. Verifique se o ficheiro existe e se consegue aceder ao mesmo.</String>
522 <String Id="Error1914" Overridable="yes">Não foi possível agendar o ficheiro [2] para substituir o ficheiro [3] ao reiniciar. Verifique se tem permissões de escrita para o ficheiro [3].</String>
523 <String Id="Error1915" Overridable="yes">Erro ao remover o gestor do controlador ODBC, erro de ODBC [2]: [3]. Contacte o suporte técnico.</String>
524 <String Id="Error1916" Overridable="yes">Erro ao instalar o gestor do controlador ODBC, erro de ODBC [2]: [3]. Contacte o suporte técnico.</String>
525 <String Id="Error1917" Overridable="yes">Erro ao remover o controlador ODBC: [4], erro de ODBC [2]: [3]. Verifique se tem privilégios suficientes para remover controladores ODBC.</String>
526 <String Id="Error1918" Overridable="yes">Erro ao instalar o controlador ODBC: [4], erro de ODBC [2]: [3]. Verifique se o ficheiro [4] existe e se pode aceder ao mesmo.</String>
527 <String Id="Error1919" Overridable="yes">Erro ao configurar a origem dos dados ODBC: [4], erro de ODBC [2]: [3]. Verifique se o ficheiro [4] existe e se pode aceder ao mesmo.</String>
528 <String Id="Error1920" Overridable="yes">Não foi possível iniciar o serviço '[2]' ([3]). Verifique se tem privilégios suficientes para iniciar serviços de sistema.</String>
529 <String Id="Error1921" Overridable="yes">Não foi possível interromper o serviço '[2]' ([3]). Verifique se tem privilégios suficientes para interromper serviços de sistema.</String>
530 <String Id="Error1922" Overridable="yes">Não foi possível eliminar o serviço '[2]' ([3]). Verifique se tem privilégios suficientes para remover serviços de sistema.</String>
531 <String Id="Error1923" Overridable="yes">Não foi possível instalar o serviço '[2]' ([3]). Verifique se tem privilégios suficientes para instalar serviços de sistema.</String>
532 <String Id="Error1924" Overridable="yes">Não foi possível actualizar a variável de ambiente '[2]'. Verifique se tem privilégios suficientes para modificar variáveis de ambiente.</String>
533 <String Id="Error1925" Overridable="yes">Não tem privilégios suficientes para concluir esta instalação para todos os utilizadores do computador. Inicie sessão como administrador e repita esta instalação.</String>
534 <String Id="Error1926" Overridable="yes">Não foi possível definir a segurança para o ficheiro '[3]'. Erro: [2]. Verifique se tem privilégios suficientes para modificar as permissões de segurança para este ficheiro.</String>
535 <String Id="Error1927" Overridable="yes">O COM+ 1.0 (Serviços de Componentes) não está instalado neste computador. Esta instalação necessita do COM+ para ser concluída com êxito. O COM+ está disponível no Windows 2000.</String>
536 <String Id="Error1928" Overridable="yes">Erro ao registar a Aplicação COM+. Contacte o suporte técnico para obter mais informações.</String>
537 <String Id="Error1929" Overridable="yes">Erro ao anular o registo da Aplicação COM+. Contacte o suporte técnico para obter mais informações.</String>
538 <String Id="Error1930" Overridable="yes">Não foi possível alterar a descrição do serviço'[2]' ([3]).</String>
539 <String Id="Error1931" Overridable="yes">O serviço Windows Installer não consegue actualizar o ficheiro de sistema [2] porque este está protegido pelo Windows. Poderá necessitar de actualizar o sistema operativo para que este programa funcione correctamente. {{Versão do pacote: [3], Versão protegida pelo Sistema Operativo: [4]}}</String>
540 <String Id="Error1932" Overridable="yes">O serviço Windows Installer não consegue actualizar o ficheiro protegido do Windows [2]. {{Versão do pacote: [3], Versão protegida pelo Sistema Operativo: [4], Erro de SFP: [5]}}</String>
541 <String Id="Error1933" Overridable="yes">O serviço Windows Installer não pode actualizar um ou mais ficheiros do Windows protegidos. {{Erro de SFP: [2]. Lista de ficheiros protegidos:\r\n[3]}}</String>
542 <String Id="Error1934" Overridable="yes">As instalações de utilizador são desactivadas por política neste computador.</String>
543 <String Id="Error1935" Overridable="yes">Ocorreu um erro durante a instalação da assemblagem '[6]'. Consulte a Ajuda e Suporte para obter mais informações. HRESULT: [3]. {{interface de assemblagem: [4], função: [5], componente: [2]}}</String>
544 <String Id="Error1936" Overridable="yes">Ocorreu um erro durante a instalação da assemblagem '[6]'. A assemblagem não tem um nome forte nem está assinada com o comprimento mínimo de chave. HRESULT: [3]. {{interface de assemblagem: [4], função: [5], componente: [2]}}</String>
545 <String Id="Error1937" Overridable="yes">Ocorreu um erro durante a instalação da assemblagem '[6]'. Não foi possível verificar a assinatura ou o catálogo ou não é válida. HRESULT: [3]. {{interface de assemblagem: [4], função: [5], componente: [2]}}</String>
546 <String Id="Error1938" Overridable="yes">Ocorreu um erro durante a instalação da assemblagem '[6]'. Não foi possível localizar um ou mais módulos da assemblagem. HRESULT: [3]. {{interface de assemblagem: [4], função: [5], componente: [2]}}</String>
547
548 <String Id="UITextbytes" Overridable="yes">Bytes</String>
549 <String Id="UITextGB" Overridable="yes">GB</String>
550 <String Id="UITextKB" Overridable="yes">KB</String>
551 <String Id="UITextMB" Overridable="yes">MB</String>
552 <String Id="UITextMenuAbsent" Overridable="yes">A funcionalidade completa não estará disponível</String>
553 <String Id="UITextMenuAdvertise" Overridable="yes">A funcionalidade será instalada quando necessário</String>
554 <String Id="UITextMenuAllCD" Overridable="yes">A funcionalidade completa será instalada para ser executada a partir do CD</String>
555 <String Id="UITextMenuAllLocal" Overridable="yes">A funcionalidade completa será instalada no disco rígido local</String>
556 <String Id="UITextMenuAllNetwork" Overridable="yes">A funcionalidade completa será instalada para ser executada a partir da rede</String>
557 <String Id="UITextMenuCD" Overridable="yes">Será instalada para ser executada a partir do CD</String>
558 <String Id="UITextMenuLocal" Overridable="yes">Será instalada no disco rígido local</String>
559 <String Id="UITextMenuNetwork" Overridable="yes">Será instalada para ser executada a partir da rede</String>
560 <String Id="UITextNewFolder" Overridable="yes">Pasta|Nova Pasta</String>
561 <String Id="UITextScriptInProgress" Overridable="yes">A recolher as informações necessárias...</String>
562 <String Id="UITextSelAbsentAbsent" Overridable="yes">Esta funcionalidade permanecerá desinstalada</String>
563 <String Id="UITextSelAbsentAdvertise" Overridable="yes">Esta funcionalidade será definida para ser instalada quando necessário</String>
564 <String Id="UITextSelAbsentCD" Overridable="yes">Esta funcionalidade será instalada para ser executada a partir do CD</String>
565 <String Id="UITextSelAbsentLocal" Overridable="yes">Esta funcionalidade será instalada no disco rígido local</String>
566 <String Id="UITextSelAbsentNetwork" Overridable="yes">Esta funcionalidade será instalada para ser executada a partir da rede</String>
567 <String Id="UITextSelAdvertiseAbsent" Overridable="yes">Esta funcionalidade deixará de estar disponível</String>
568 <String Id="UITextSelAdvertiseAdvertise" Overridable="yes">Será instalada quando necessário</String>
569 <String Id="UITextSelAdvertiseCD" Overridable="yes">Esta funcionalidade estará disponível para ser executada a partir do CD</String>
570 <String Id="UITextSelAdvertiseLocal" Overridable="yes">Esta funcionalidade será instalada no disco rígido local</String>
571 <String Id="UITextSelAdvertiseNetwork" Overridable="yes">Esta funcionalidade estará disponível para ser executada a partir da rede</String>
572 <String Id="UITextSelCDAbsent" Overridable="yes">Esta funcionalidade será completamente desinstalada, não poderá executá-la a partir do CD</String>
573 <String Id="UITextSelCDAdvertise" Overridable="yes">Esta funcionalidade deixará de ser executada a partir do CD para ser instalada quando necessário</String>
574 <String Id="UITextSelCDCD" Overridable="yes">Esta funcionalidade continuará a ser executada a partir do CD</String>
575 <String Id="UITextSelCDLocal" Overridable="yes">Esta funcionalidade deixará de ser executada a partir do CD para ser instalada no disco rígido local</String>
576 <String Id="UITextSelChildCostNeg" Overridable="yes">Esta funcionalidade liberta [1] no disco rígido.</String>
577 <String Id="UITextSelChildCostPos" Overridable="yes">Esta funcionalidade necessita de [1] no disco rígido.</String>
578 <String Id="UITextSelCostPending" Overridable="yes">A compilar o custo desta funcionalidade...</String>
579 <String Id="UITextSelLocalAbsent" Overridable="yes">Esta funcionalidade será completamente removida</String>
580 <String Id="UITextSelLocalAdvertise" Overridable="yes">Esta funcionalidade será removida do disco rígido local, mas será definida para ser instalada quando necessário</String>
581 <String Id="UITextSelLocalCD" Overridable="yes">Esta funcionalidade será removida do disco rígido local, mas continuará disponível para ser executada a partir do CD</String>
582 <String Id="UITextSelLocalLocal" Overridable="yes">Esta funcionalidade permanecerá no disco rígido local</String>
583 <String Id="UITextSelLocalNetwork" Overridable="yes">Esta funcionalidade será removida do disco rígido local, mas continuará disponível para ser executada a partir da rede</String>
584 <String Id="UITextSelNetworkAbsent" Overridable="yes">Esta funcionalidade será completamente desinstalada, não poderá executá-la a partir da rede</String>
585 <String Id="UITextSelNetworkAdvertise" Overridable="yes">Esta funcionalidade deixará de ser executada a partir da rede para ser instalada quando necessário</String>
586 <String Id="UITextSelNetworkLocal" Overridable="yes">Esta funcionalidade deixará de ser executada a partir da rede para ser instalada no disco rígido local</String>
587 <String Id="UITextSelNetworkNetwork" Overridable="yes">Esta funcionalidade continuará a ser executada a partir da rede</String>
588 <String Id="UITextSelParentCostNegNeg" Overridable="yes">Esta funcionalidade liberta [1] no disco rígido. Tem [2] de [3] subfuncionalidades seleccionadas. As subfuncionalidades libertam [4] no disco rígido.</String>
589 <String Id="UITextSelParentCostNegPos" Overridable="yes">Esta funcionalidade liberta [1] no disco rígido. Tem [2] de [3] subfuncionalidades seleccionadas. As subfuncionalidades necessitam de [4] no disco rígido.</String>
590 <String Id="UITextSelParentCostPosNeg" Overridable="yes">Esta funcionalidade necessita de [1] no disco rígido. Tem [2] de [3] subfuncionalidades seleccionadas. As subfuncionalidades libertam [4] no disco rígido.</String>
591 <String Id="UITextSelParentCostPosPos" Overridable="yes">Esta funcionalidade necessita de [1] no disco rígido. Tem [2] de [3] subfuncionalidades seleccionadas. As subfuncionalidades necessitam de [4] no disco rígido.</String>
592 <String Id="UITextTimeRemaining" Overridable="yes">Tempo restante: {[1] minutos }{[2] segundos}</String>
593 <String Id="UITextVolumeCostAvailable" Overridable="yes">Disponível</String>
594 <String Id="UITextVolumeCostDifference" Overridable="yes">Diferença</String>
595 <String Id="UITextVolumeCostRequired" Overridable="yes">Necessário</String>
596 <String Id="UITextVolumeCostSize" Overridable="yes">Tamanho do Disco</String>
597 <String Id="UITextVolumeCostVolume" Overridable="yes">Volume</String>
598</WixLocalization>
diff --git a/src/ext/UI/wixlib/WixUI_ro-RO.wxl b/src/ext/UI/wixlib/WixUI_ro-RO.wxl
new file mode 100644
index 00000000..c5ffb2ae
--- /dev/null
+++ b/src/ext/UI/wixlib/WixUI_ro-RO.wxl
@@ -0,0 +1,598 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3
4
5<WixLocalization Culture="ro-ro" Codepage="1250" xmlns="http://wixtoolset.org/schemas/v4/wxl">
6 <String Id="WixUIBack" Overridable="yes">Î&amp;napoi</String>
7 <String Id="WixUINext" Overridable="yes">&amp;Următorul</String>
8 <String Id="WixUICancel" Overridable="yes">Revocare</String>
9 <String Id="WixUIFinish" Overridable="yes">&amp;Terminare</String>
10 <String Id="WixUIRetry" Overridable="yes">&amp;Reîncercare</String>
11 <String Id="WixUIIgnore" Overridable="yes">&amp;Ignorare</String>
12 <String Id="WixUIYes" Overridable="yes">&amp;Da</String>
13 <String Id="WixUINo" Overridable="yes">&amp;Nu</String>
14 <String Id="WixUIOK" Overridable="yes">OK</String>
15 <String Id="WixUIPrint" Overridable="yes">Im&amp;primare</String>
16
17 <String Id="AdvancedWelcomeEulaDlg_Title" Overridable="yes">Programul de instalare [ProductName]</String>
18 <String Id="AdvancedWelcomeEulaDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
19 <String Id="AdvancedWelcomeEulaDlgTitle" Overridable="yes">{\WixUI_Font_Title}Citiţi Acordul de licenţă pentru [ProductName]</String>
20 <String Id="AdvancedWelcomeEulaDlgLicenseAcceptedCheckBox" Overridable="yes">&amp;Accept termenii din Acordul de licenţă</String>
21 <String Id="AdvancedWelcomeEulaDlgDescriptionPerMachine" Overridable="yes">Faceţi clic pe Instalare dacă doriţi să instalaţi produsul cu opţiunile implicite pentru toţi utilizatorii. Faceţi clic pe Complex pentru a modifica opţiunile de instalare.</String>
22 <String Id="AdvancedWelcomeEulaDlgDescriptionPerUser" Overridable="yes">Faceţi clic pe Instalare dacă doriţi să instalaţi produsul cu opţiunile implicite numai pentru dvs. Faceţi clic pe Complex pentru a modifica opţiunile de instalare.</String>
23 <String Id="AdvancedWelcomeEulaDlgInstall" Overridable="yes">&amp;Instalare</String>
24 <String Id="AdvancedWelcomeEulaDlgAdvanced" Overridable="yes">C&amp;omplex</String>
25 <String Id="Advanced_Font_Normal_Size" Overridable="yes">8</String>
26 <String Id="Advanced_Font_Bigger_Size" Overridable="yes">12</String>
27 <String Id="Advanced_Font_Title_Size" Overridable="yes">9</String>
28 <String Id="Advanced_Font_Emphasized_Size" Overridable="yes">8</String>
29 <String Id="Advanced_Font_FaceName" Overridable="yes">Tahoma</String>
30
31 <String Id="BrowseDlg_Title" Overridable="yes">Programul de instalare [ProductName]</String>
32 <String Id="BrowseDlgComboLabel" Overridable="yes">&amp;Privire în:</String>
33 <String Id="BrowseDlgWixUI_Bmp_Up" Overridable="yes">WixUI_Bmp_Up</String>
34 <String Id="BrowseDlgWixUI_Bmp_UpTooltip" Overridable="yes">Mai sus cu un nivel</String>
35 <String Id="BrowseDlgNewFolder" Overridable="yes">WixUI_Bmp_New</String>
36 <String Id="BrowseDlgNewFolderTooltip" Overridable="yes">Creare folder nou</String>
37 <String Id="BrowseDlgPathLabel" Overridable="yes">&amp;Nume folder:</String>
38 <String Id="BrowseDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
39 <String Id="BrowseDlgDescription" Overridable="yes">Răsfoire la folderul destinaţie</String>
40 <String Id="BrowseDlgTitle" Overridable="yes">{\WixUI_Font_Title}Modificarea folderului de destinaţie</String>
41
42 <String Id="CancelDlg_Title" Overridable="yes">Programul de instalare [ProductName]</String>
43 <String Id="CancelDlgText" Overridable="yes">Sigur revocaţi instalarea [ProductName]?</String>
44 <String Id="CancelDlgIcon" Overridable="yes">WixUI_Ico_Info</String>
45 <String Id="CancelDlgIconTooltip" Overridable="yes">Pictogramă informaţii</String>
46
47 <String Id="CustomizeDlg_Title" Overridable="yes">Programul de instalare [ProductName]</String>
48 <String Id="CustomizeDlgTree" Overridable="yes">Arbore de selecţii</String>
49 <String Id="CustomizeDlgBrowse" Overridable="yes">&amp;Răsfoire...</String>
50 <String Id="CustomizeDlgReset" Overridable="yes">Re&amp;setare</String>
51 <String Id="CustomizeDlgDiskCost" Overridable="yes">&amp;Utilizare disc</String>
52 <String Id="CustomizeDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
53 <String Id="CustomizeDlgText" Overridable="yes">Faceţi clic pe pictogramele din arborele de mai jos pentru a modifica modul de instalare a caracteristicilor.</String>
54 <String Id="CustomizeDlgDescription" Overridable="yes">Selectaţi modalitatea în care doriţi să se instaleze caracteristicile.</String>
55 <String Id="CustomizeDlgTitle" Overridable="yes">{\WixUI_Font_Title}Instalare particularizată</String>
56 <String Id="CustomizeDlgItemDescription" Overridable="yes">CustomizeDlgItemDescription-CustomizeDlgItemDescription</String>
57 <String Id="CustomizeDlgItemSize" Overridable="yes">CustomizeDlgItemSize-CustomizeDlgItemSize</String>
58 <String Id="CustomizeDlgLocation" Overridable="yes">CustomizeDlgLocation-CustomizeDlgLocation</String>
59 <String Id="CustomizeDlgLocationLabel" Overridable="yes">Locaţie:</String>
60
61 <String Id="DiskCostDlg_Title" Overridable="yes">Programul de instalare [ProductName]</String>
62 <String Id="DiskCostDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
63 <String Id="DiskCostDlgText" Overridable="yes">Pe volumele evidenţiate nu există suficient spaţiu-disc disponibil pentru caracteristicile selectate. Puteţi să eliminaţi câteva fişiere de pe volumele evidenţiate, să instalaţi mai puţine caracteristici sau să selectaţi alte unităţi de destinaţie.</String>
64 <String Id="DiskCostDlgDescription" Overridable="yes">Spaţiul-disc necesar instalării caracteristicilor selectate.</String>
65 <String Id="DiskCostDlgTitle" Overridable="yes">{\WixUI_Font_Title}Cerinţe de spaţiu-disc</String>
66 <String Id="DiskCostDlgVolumeList" Overridable="yes">{120}{70}{70}{70}{70}</String>
67
68 <String Id="ErrorDlg_Title" Overridable="yes">Programul de instalare [ProductName]</String>
69 <String Id="ErrorDlgErrorText" Overridable="yes">Text informativ</String>
70 <String Id="ErrorDlgErrorIcon" Overridable="yes">WixUI_Ico_Info</String>
71 <String Id="ErrorDlgErrorIconTooltip" Overridable="yes">Pictogramă informaţii</String>
72
73 <String Id="ExitDialog_Title" Overridable="yes">Programul de instalare [ProductName]</String>
74 <String Id="ExitDialogBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
75 <String Id="ExitDialogDescription" Overridable="yes">Faceţi clic pe Terminare pentru a ieşi din Expertul de instalare.</String>
76 <String Id="ExitDialogTitle" Overridable="yes">{\WixUI_Font_Bigger}Expertul de instalare [ProductName] s-a încheiat</String>
77
78 <String Id="FatalError_Title" Overridable="yes">Programul de instalare [ProductName]</String>
79 <String Id="FatalErrorBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
80 <String Id="FatalErrorTitle" Overridable="yes">{\WixUI_Font_Bigger}Expertul de instalare [ProductName] s-a încheiat prematur</String>
81 <String Id="FatalErrorDescription1" Overridable="yes">Expertul de instalare [ProductName] s-a încheiat prematur, din cauza unei erori. Sistemul nu a fost modificat. Pentru a instala acest program ulterior, executaţi din nou Expertul de instalare.</String>
82 <String Id="FatalErrorDescription2" Overridable="yes">Faceţi clic pe Terminare pentru a ieşi din Expertul de instalare.</String>
83
84 <String Id="FeaturesDlg_Title" Overridable="yes">Programul de instalare [ProductName]</String>
85 <String Id="FeaturesDlgTree" Overridable="yes">Caracteristici produs</String>
86 <String Id="FeaturesDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
87 <String Id="FeaturesDlgDescription" Overridable="yes">Selectaţi modalitatea în care doriţi să se instaleze caracteristicile.</String>
88 <String Id="FeaturesDlgTitle" Overridable="yes">{\WixUI_Font_Title}Caracteristicile produsului</String>
89 <String Id="FeaturesDlgItemDescription" Overridable="yes">FeaturesDlgItemDescription</String>
90 <String Id="FeaturesDlgItemSize" Overridable="yes">FeaturesDlgItemSize</String>
91 <String Id="FeaturesDlgInstall" Overridable="yes">&amp;Instalare</String>
92 <String Id="FeaturesDlgChange" Overridable="yes">&amp;Modificare</String>
93
94 <String Id="FilesInUse_Title" Overridable="yes">Programul de instalare [ProductName]</String>
95 <String Id="FilesInUseExit" Overridable="yes">I&amp;eşire</String>
96 <String Id="FilesInUseBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
97 <String Id="FilesInUseText" Overridable="yes">Aplicaţiile următoare utilizează fişiere care trebuie actualizate de această instalare. Închideţi aceste aplicaţii şi faceţi clic pe &amp;Reîncercare pentru a continua instalarea sau pe Ieşire pentru a ieşi.</String>
98 <String Id="FilesInUseDescription" Overridable="yes">Unele fişiere care trebuie actualizate sunt momentan în uz.</String>
99 <String Id="FilesInUseTitle" Overridable="yes">{\WixUI_Font_Title}Fişiere în uz</String>
100
101 <String Id="InstallDirDlg_Title" Overridable="yes">Programul de instalare [ProductName]</String>
102 <String Id="InstallDirDlgChange" Overridable="yes">&amp;Modificare...</String>
103 <String Id="InstallDirDlgTitle" Overridable="yes">{\WixUI_Font_Title}Folderul de destinaţie</String>
104 <String Id="InstallDirDlgDescription" Overridable="yes">Faceţi clic pe Următorul pentru a instala în folderul implicit sau pe Modificare pentru a selecta un alt folder.</String>
105 <String Id="InstallDirDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
106 <String Id="InstallDirDlgFolderLabel" Overridable="yes">Instalare [ProductName] la:</String>
107
108 <String Id="InstallScopeDlg_Title" Overridable="yes">Programul de instalare [ProductName]</String>
109 <String Id="InstallScopeDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
110 <String Id="InstallScopeDlgDescription" Overridable="yes">Alegeţi aria de instalare şi folderul</String>
111 <String Id="InstallScopeDlgTitle" Overridable="yes">{\WixUI_Font_Title}Aria de instalare</String>
112 <String Id="InstallScopeDlgPerUser" Overridable="yes">{\WixUI_Font_Emphasized}Se instalează &amp;numai pentru dvs. ([USERNAME])</String>
113 <String Id="InstallScopeDlgPerUserDescription" Overridable="yes">[ProductName] va fi instalat într-un folder la nivel de utilizator şi va fi disponibil numai pentru contul dvs. de utilizator. Nu sunt necesare privilegii de administrator local.</String>
114 <String Id="InstallScopeDlgNoPerUserDescription" Overridable="yes">[ProductName] nu acceptă instalarea la nivel de utilizator.</String>
115 <String Id="InstallScopeDlgPerMachine" Overridable="yes">{\WixUI_Font_Emphasized}Se instalează pentru toţi utilizatorii acestui co&amp;mputer</String>
116 <String Id="InstallScopeDlgPerMachineDescription" Overridable="yes">[ProductName] va fi instalat implicit într-un folder la nivel de computer şi va fi disponibil pentru toţi utilizatorii. Aveţi posibilitatea să modificaţi folderul de instalare implicit. Sunt necesare privilegii de administrator local.</String>
117 <String Id="InstallScopeDlgFolderLabel" Overridable="yes">&amp;Folder de instalare:</String>
118 <String Id="InstallScopeDlgChange" Overridable="yes">&amp;Modificare...</String>
119
120 <String Id="InvalidDirDlg_Title" Overridable="yes">Programul de instalare [ProductName]</String>
121 <String Id="InvalidDirDlgText" Overridable="yes">Directorul de instalare trebuie să fie pe o unitate de disc locală.</String>
122 <String Id="InvalidDirDlgIcon" Overridable="yes">WixUI_Ico_Info</String>
123 <String Id="InvalidDirDlgIconTooltip" Overridable="yes">Pictogramă informaţii</String>
124
125 <String Id="LicenseAgreementDlg_Title" Overridable="yes">Programul de instalare [ProductName]</String>
126 <String Id="LicenseAgreementDlgLicenseAcceptedCheckBox" Overridable="yes">&amp;Accept termenii din Acordul de licenţă</String>
127 <String Id="LicenseAgreementDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
128 <String Id="LicenseAgreementDlgDescription" Overridable="yes">Citiţi cu atenţie următorul acord de licenţă</String>
129 <String Id="LicenseAgreementDlgTitle" Overridable="yes">{\WixUI_Font_Title}Termenii licenţei pentru software Microsoft</String>
130
131 <String Id="MaintenanceTypeDlg_Title" Overridable="yes">Programul de instalare [ProductName]</String>
132 <String Id="MaintenanceTypeDlgChangeButton" Overridable="yes">&amp;Modificare</String>
133 <String Id="MaintenanceTypeDlgChangeButtonTooltip" Overridable="yes">Modificare instalare</String>
134 <String Id="MaintenanceTypeDlgRepairButton" Overridable="yes">Re&amp;parare</String>
135 <String Id="MaintenanceTypeDlgRepairButtonTooltip" Overridable="yes">Reparare instalare</String>
136 <String Id="MaintenanceTypeDlgRemoveButton" Overridable="yes">&amp;Eliminare</String>
137 <String Id="MaintenanceTypeDlgRemoveButtonTooltip" Overridable="yes">Eliminare instalare</String>
138 <String Id="MaintenanceTypeDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
139 <String Id="MaintenanceTypeDlgDescription" Overridable="yes">Selectaţi operaţia pe care doriţi să o efectuaţi.</String>
140 <String Id="MaintenanceTypeDlgTitle" Overridable="yes">{\WixUI_Font_Title}Modificaţi, reparaţi sau eliminaţi instalarea</String>
141 <String Id="MaintenanceTypeDlgChangeText" Overridable="yes">Vă permite să modificaţi modul în care sunt instalate caracteristicile.</String>
142 <String Id="MaintenanceTypeDlgChangeDisabledText" Overridable="yes">[ProductName] nu are caracteristici ce se pot selecta în mod independent.</String>
143 <String Id="MaintenanceTypeDlgRemoveText" Overridable="yes">Elimină [ProductName] de pe computer.</String>
144 <String Id="MaintenanceTypeDlgRemoveDisabledText" Overridable="yes">[ProductName] nu poate fi eliminat.</String>
145 <String Id="MaintenanceTypeDlgRepairText" Overridable="yes">Repară erorile celei mai recente instalări, prin remedierea fişierelor, comenzilor rapide şi intrărilor de registry care lipsesc sau sunt deteriorate.</String>
146 <String Id="MaintenanceTypeDlgRepairDisabledText" Overridable="yes">[ProductName] nu poate fi reparat.</String>
147
148 <String Id="MaintenanceWelcomeDlg_Title" Overridable="yes">Programul de instalare [ProductName]</String>
149 <String Id="MaintenanceWelcomeDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
150 <String Id="MaintenanceWelcomeDlgDescription" Overridable="yes">Expertul de instalare vă permite să modificaţi modul în care sunt instalate caracteristicile [ProductName] pe computer sau să eliminaţi produsul de pe computer. Faceţi clic pe Următorul pentru a continua sau pe Revocare pentru a ieşi din Expertul de instalare.</String>
151 <String Id="MaintenanceWelcomeDlgTitle" Overridable="yes">{\WixUI_Font_Bigger}Bun venit la Expertul de instalare [ProductName]</String>
152
153 <String Id="MsiRMFilesInUse_Title" Overridable="yes">Programul de instalare [ProductName]</String>
154 <String Id="MsiRMFilesInUseBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
155 <String Id="MsiRMFilesInUseText" Overridable="yes">Aplicaţiile următoare utilizează fişiere care trebuie actualizate de această instalare. Lăsaţi Expertul de instalare să le închidă, apoi încercaţi să le reporniţi sau reporniţi computerul mai târziu.</String>
156 <String Id="MsiRMFilesInUseDescription" Overridable="yes">Unele fişiere care trebuie actualizate sunt momentan în uz.</String>
157 <String Id="MsiRMFilesInUseTitle" Overridable="yes">{\WixUI_Font_Title}Fişiere în uz</String>
158 <String Id="MsiRMFilesInUseUseRM" Overridable="yes">&amp;Se închid aplicaţiile şi se încearcă repornirea lor.</String>
159 <String Id="MsiRMFilesInUseDontUseRM" Overridable="yes">&amp;Nu se închid aplicaţiile. Va fi necesară o repornire.</String>
160
161 <String Id="OutOfDiskDlg_Title" Overridable="yes">Programul de instalare [ProductName]</String>
162 <String Id="OutOfDiskDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
163 <String Id="OutOfDiskDlgText" Overridable="yes">Volumele evidenţiate nu au suficient spaţiu-disc disponibil pentru caracteristicile selectate momentan. Aveţi posibilitatea să eliminaţi unele fişiere din volumele evidenţiate, să instalaţi mai puţine caracteristici sau să selectaţi altă unitate de destinaţie.</String>
164 <String Id="OutOfDiskDlgDescription" Overridable="yes">Spaţiul-disc necesar instalării depăşeşte spaţiul disponibil pe disc.</String>
165 <String Id="OutOfDiskDlgTitle" Overridable="yes">{\WixUI_Font_Title}Spaţiu-disc insuficient</String>
166 <String Id="OutOfDiskDlgVolumeList" Overridable="yes">{120}{70}{70}{70}{70}</String>
167
168 <String Id="OutOfRbDiskDlg_Title" Overridable="yes">Programul de instalare [ProductName]</String>
169 <String Id="OutOfRbDiskDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
170 <String Id="OutOfRbDiskDlgText" Overridable="yes">Volumele evidenţiate nu au suficient spaţiu-disc disponibil pentru caracteristicile selectate momentan. Aveţi posibilitatea să eliminaţi unele fişiere din volumele evidenţiate, să instalaţi mai puţine caracteristici sau să selectaţi altă unitate de destinaţie.</String>
171 <String Id="OutOfRbDiskDlgDescription" Overridable="yes">Spaţiul-disc necesar instalării depăşeşte spaţiul disponibil pe disc.</String>
172 <String Id="OutOfRbDiskDlgTitle" Overridable="yes">{\WixUI_Font_Title}Spaţiu-disc insuficient</String>
173 <String Id="OutOfRbDiskDlgVolumeList" Overridable="yes">{120}{70}{70}{70}{70}</String>
174 <String Id="OutOfRbDiskDlgText2" Overridable="yes">De asemenea, puteţi opta pentru dezactivarea funcţionalităţii de revenire a programului de instalare. Dezactivarea funcţionalităţii de revenire împiedică programul de instalare să restaureze starea originală a computerului în cazul în care instalarea este întreruptă din vreun motiv. Faceţi clic pe Da dacă vă asumaţi riscul de a dezactiva revenirea.</String>
175
176 <String Id="PrepareDlg_Title" Overridable="yes">Programul de instalare [ProductName]</String>
177 <String Id="PrepareDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
178 <String Id="PrepareDlgDescription" Overridable="yes">Aşteptaţi. Expertul de instalare se pregăteşte să vă ghideze pe parcursul instalării.</String>
179 <String Id="PrepareDlgTitle" Overridable="yes">{\WixUI_Font_Bigger}Bun venit la Expertul de instalare [ProductName]</String>
180
181 <String Id="ProgressDlg_Title" Overridable="yes">Programul de instalare [ProductName]</String>
182 <String Id="ProgressDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
183 <String Id="ProgressDlgTextInstalling" Overridable="yes">Aşteptaţi, Expertul de instalare instalează [ProductName].</String>
184 <String Id="ProgressDlgTitleInstalling" Overridable="yes">{\WixUI_Font_Title}Se instalează [ProductName]</String>
185 <String Id="ProgressDlgTextChanging" Overridable="yes">Aşteptaţi, Expertul de instalare modifică [ProductName].</String>
186 <String Id="ProgressDlgTitleChanging" Overridable="yes">{\WixUI_Font_Title}Se modifică [ProductName]</String>
187 <String Id="ProgressDlgTextRepairing" Overridable="yes">Aşteptaţi, Expertul de instalare repară [ProductName].</String>
188 <String Id="ProgressDlgTitleRepairing" Overridable="yes">{\WixUI_Font_Title}Se repară [ProductName]</String>
189 <String Id="ProgressDlgTextRemoving" Overridable="yes">Aşteptaţi, Expertul de instalare elimină [ProductName].</String>
190 <String Id="ProgressDlgTitleRemoving" Overridable="yes">{\WixUI_Font_Title}Se elimină [ProductName]</String>
191 <String Id="ProgressDlgTextUpdating" Overridable="yes">Aşteptaţi, Expertul de instalare actualizează [ProductName].</String>
192 <String Id="ProgressDlgTitleUpdating" Overridable="yes">{\WixUI_Font_Title}Se actualizează [ProductName]</String>
193 <String Id="ProgressDlgProgressBar" Overridable="yes">Etapă finalizată</String>
194 <String Id="ProgressDlgStatusLabel" Overridable="yes">Stare:</String>
195
196 <String Id="ResumeDlg_Title" Overridable="yes">Programul de instalare [ProductName]</String>
197 <String Id="ResumeDlgInstall" Overridable="yes">&amp;Instalare</String>
198 <String Id="ResumeDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
199 <String Id="ResumeDlgDescription" Overridable="yes">Expertul de instalare va finaliza instalarea [ProductName] pe computer. Faceţi clic pe Instalare pentru a continua sau pe Revocare pentru a ieşi din Expertul de instalare.</String>
200 <String Id="ResumeDlgTitle" Overridable="yes">{\WixUI_Font_Bigger}Se reia Expertul de instalare [ProductName]</String>
201
202 <String Id="SetupTypeDlg_Title" Overridable="yes">Programul de instalare [ProductName]</String>
203 <String Id="SetupTypeDlgTypicalButton" Overridable="yes">&amp;Tipică</String>
204 <String Id="SetupTypeDlgTypicalButtonTooltip" Overridable="yes">Instalare tipică</String>
205 <String Id="SetupTypeDlgCustomButton" Overridable="yes">Partic&amp;ularizată</String>
206 <String Id="SetupTypeDlgCustomButtonTooltip" Overridable="yes">Instalare particularizată</String>
207 <String Id="SetupTypeDlgCompleteButton" Overridable="yes">C&amp;ompletă</String>
208 <String Id="SetupTypeDlgCompleteButtonTooltip" Overridable="yes">Instalare completă</String>
209 <String Id="SetupTypeDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
210 <String Id="SetupTypeDlgTitle" Overridable="yes">{\WixUI_Font_Title}Alegeţi tipul instalării</String>
211 <String Id="SetupTypeDlgDescription" Overridable="yes">Alegeţi tipul de instalare care corespunde cel mai bine necesităţilor dvs.</String>
212 <String Id="SetupTypeDlgTypicalText" Overridable="yes">Instalează cele mai utilizate caracteristici ale programului. Recomandat pentru majoritatea utilizatorilor.</String>
213 <String Id="SetupTypeDlgCustomText" Overridable="yes">Permite utilizatorilor să aleagă ce caracteristici de program să se instaleze şi unde să se instaleze. Recomandat utilizatorilor avansaţi.</String>
214 <String Id="SetupTypeDlgCompleteText" Overridable="yes">Se vor instala toate caracteristicile programului. Necesită cel mai mult spaţiu pe disc.</String>
215
216 <String Id="UserExit_Title" Overridable="yes">Programul de instalare [ProductName]</String>
217 <String Id="UserExitBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
218 <String Id="UserExitTitle" Overridable="yes">{\WixUI_Font_Bigger}Expertul de instalare [ProductName] a fost întrerupt</String>
219 <String Id="UserExitDescription1" Overridable="yes">Instalarea [ProductName] a fost întreruptă. Sistemul nu a fost modificat. Pentru a instala ulterior acest program, executaţi din nou instalarea.</String>
220 <String Id="UserExitDescription2" Overridable="yes">Faceţi clic pe Terminare pentru a ieşi din Expertul de instalare.</String>
221
222 <String Id="VerifyReadyDlg_Title" Overridable="yes">Programul de instalare [ProductName]</String>
223 <String Id="VerifyReadyDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
224 <String Id="VerifyReadyDlgInstall" Overridable="yes">&amp;Instalare</String>
225 <String Id="VerifyReadyDlgInstallText" Overridable="yes">Faceţi clic pe Instalare pentru a începe instalarea. Faceţi clic pe Înapoi pentru a examina sau a modifica oricare dintre setările de instalare. Faceţi clic pe Revocare pentru a ieşi din expert.</String>
226 <String Id="VerifyReadyDlgInstallTitle" Overridable="yes">{\WixUI_Font_Title}Pregătit pentru instalarea [ProductName]</String>
227 <String Id="VerifyReadyDlgChange" Overridable="yes">&amp;Modificare</String>
228 <String Id="VerifyReadyDlgChangeText" Overridable="yes">Faceţi clic pe Modificare pentru a începe instalarea. Faceţi clic pe Înapoi pentru a examina sau a modifica oricare dintre setările de instalare. Faceţi clic pe Revocare pentru a ieşi din expert.</String>
229 <String Id="VerifyReadyDlgChangeTitle" Overridable="yes">{\WixUI_Font_Title}Pregătit pentru modificarea [ProductName]</String>
230 <String Id="VerifyReadyDlgRepair" Overridable="yes">Re&amp;parare</String>
231 <String Id="VerifyReadyDlgRepairText" Overridable="yes">Faceţi clic pe Reparare pentru a repara instalarea [ProductName]. Faceţi clic pe Înapoi pentru a examina sau a modifica oricare dintre setările de instalare. Faceţi clic pe Revocare pentru a ieşi din expert.</String>
232 <String Id="VerifyReadyDlgRepairTitle" Overridable="yes">{\WixUI_Font_Title}Pregătit pentru repararea [ProductName]</String>
233 <String Id="VerifyReadyDlgRemove" Overridable="yes">&amp;Eliminare</String>
234 <String Id="VerifyReadyDlgRemoveText" Overridable="yes">Faceţi clic pe Eliminare pentru a elimina [ProductName] de pe computer. Faceţi clic pe Înapoi pentru a examina sau a modifica oricare dintre setările de instalare. Faceţi clic pe Revocare pentru a ieşi din expert.</String>
235 <String Id="VerifyReadyDlgRemoveTitle" Overridable="yes">{\WixUI_Font_Title}Pregătit pentru eliminarea [ProductName]</String>
236 <String Id="VerifyReadyDlgUpdate" Overridable="yes">Act&amp;ualizare</String>
237 <String Id="VerifyReadyDlgUpdateText" Overridable="yes">Faceţi clic pe Actualizare pentru a actualiza [ProductName] de pe computer. Faceţi clic pe Înapoi pentru a examina sau a modifica oricare dintre setările de instalare. Faceţi clic pe Revocare pentru a ieşi din expert.</String>
238 <String Id="VerifyReadyDlgUpdateTitle" Overridable="yes">{\WixUI_Font_Title}Pregătit pentru actualizarea [ProductName]</String>
239
240 <String Id="WaitForCostingDlg_Title" Overridable="yes">Programul de instalare [ProductName]</String>
241 <String Id="WaitForCostingDlgReturn" Overridable="yes">&amp;Revenire</String>
242 <String Id="WaitForCostingDlgText" Overridable="yes">Aşteptaţi, programul de instalare stabileşte cerinţele de spaţiu-disc.</String>
243 <String Id="WaitForCostingDlgIcon" Overridable="yes">WixUI_Ico_Exclam</String>
244 <String Id="WaitForCostingDlgIconTooltip" Overridable="yes">Pictogramă semn de exclamare</String>
245
246 <String Id="WelcomeDlg_Title" Overridable="yes">Programul de instalare [ProductName]</String>
247 <String Id="WelcomeDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
248 <String Id="WelcomeDlgDescription" Overridable="yes">Expertul de instalare va instala [ProductName] pe computer. Faceţi clic pe Următorul pentru a continua sau pe Revocare pentru a ieşi din Expertul de instalare.</String>
249 <String Id="WelcomeUpdateDlgDescriptionUpdate" Overridable="yes">Expertul de instalare va actualiza [ProductName] pe computer. Faceţi clic pe Următorul pentru a continua sau pe Revocare pentru a ieşi din Expertul de instalare.</String>
250 <String Id="WelcomeDlgTitle" Overridable="yes">{\WixUI_Font_Bigger}Bun venit la Expertul de instalare [ProductName]</String>
251
252 <String Id="WelcomeEulaDlg_Title" Overridable="yes">Programul de instalare [ProductName]</String>
253 <String Id="WelcomeEulaDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
254 <String Id="WelcomeEulaDlgLicenseAcceptedCheckBox" Overridable="yes">&amp;Accept termenii din Acordul de licenţă</String>
255 <String Id="WelcomeEulaDlgInstall" Overridable="yes">&amp;Instalare</String>
256 <String Id="WelcomeEulaDlgUpdate" Overridable="yes">Act&amp;ualizare</String>
257 <String Id="WelcomeEulaDlgTitle" Overridable="yes">{\WixUI_Font_Title}Citiţi Acordul de licenţă pentru [ProductName]</String>
258
259 <String Id="ProgressTextInstallValidate" Overridable="yes">Se validează instalarea</String>
260 <String Id="ProgressTextInstallFiles" Overridable="yes">Se copiază fişierele noi</String>
261 <String Id="ProgressTextInstallFilesTemplate" Overridable="yes">Fişier: [1], Director: [9], Dimensiune: [6]</String>
262 <String Id="ProgressTextInstallAdminPackage" Overridable="yes">Se copiază fişierele de instalare în reţea</String>
263 <String Id="ProgressTextInstallAdminPackageTemplate" Overridable="yes">Fişier: [1], Director: [9], Dimensiune: [6]</String>
264 <String Id="ProgressTextFileCost" Overridable="yes">Se calculează cerinţele de spaţiu</String>
265 <String Id="ProgressTextCostInitialize" Overridable="yes">Se calculează cerinţele de spaţiu</String>
266 <String Id="ProgressTextCostFinalize" Overridable="yes">Se calculează cerinţele de spaţiu</String>
267 <String Id="ProgressTextCreateShortcuts" Overridable="yes">Se creează comenzile rapide</String>
268 <String Id="ProgressTextCreateShortcutsTemplate" Overridable="yes">Comandă rapidă: [1]</String>
269 <String Id="ProgressTextPublishComponents" Overridable="yes">Se efectuează publicarea componentelor calificate</String>
270 <String Id="ProgressTextPublishComponentsTemplate" Overridable="yes">ID componentă: [1], Calificator: [2]</String>
271 <String Id="ProgressTextPublishFeatures" Overridable="yes">Se efectuează publicarea caracteristicilor produsului</String>
272 <String Id="ProgressTextPublishFeaturesTemplate" Overridable="yes">Caracteristică: [1]</String>
273 <String Id="ProgressTextPublishProduct" Overridable="yes">Se publică informaţiile despre produs</String>
274 <String Id="ProgressTextRegisterClassInfo" Overridable="yes">Se înregistrează serverele de clasă</String>
275 <String Id="ProgressTextRegisterClassInfoTemplate" Overridable="yes">ID clasă: [1]</String>
276 <String Id="ProgressTextRegisterExtensionInfo" Overridable="yes">Se înregistrează serverele de extensie</String>
277 <String Id="ProgressTextRegisterExtensionInfoTemplate" Overridable="yes">Extensie: [1]</String>
278 <String Id="ProgressTextRegisterMIMEInfo" Overridable="yes">Se înregistrează informaţiile MIME</String>
279 <String Id="ProgressTextRegisterMIMEInfoTemplate" Overridable="yes">Tip conţinut MIME: [1], Extensie: [2]</String>
280 <String Id="ProgressTextRegisterProgIdInfo" Overridable="yes">Se înregistrează identificatorii de program</String>
281 <String Id="ProgressTextRegisterProgIdInfoTemplate" Overridable="yes">ID program: [1]</String>
282 <String Id="ProgressTextAllocateRegistrySpace" Overridable="yes">Se alocă spaţiu în registry</String>
283 <String Id="ProgressTextAllocateRegistrySpaceTemplate" Overridable="yes">Spaţiu liber: [1]</String>
284 <String Id="ProgressTextAppSearch" Overridable="yes">Se caută aplicaţiile instalate</String>
285 <String Id="ProgressTextAppSearchTemplate" Overridable="yes">Proprietate: [1], Semnătură: [2]</String>
286 <String Id="ProgressTextBindImage" Overridable="yes">Se leagă fişierele executabile</String>
287 <String Id="ProgressTextBindImageTemplate" Overridable="yes">Fişier: [1]</String>
288 <String Id="ProgressTextCCPSearch" Overridable="yes">Se caută produsele calificate</String>
289 <String Id="ProgressTextCreateFolders" Overridable="yes">Se creează folderele</String>
290 <String Id="ProgressTextCreateFoldersTemplate" Overridable="yes">Folder: [1]</String>
291 <String Id="ProgressTextDeleteServices" Overridable="yes">Se şterg serviciile</String>
292 <String Id="ProgressTextDeleteServicesTemplate" Overridable="yes">Serviciu: [1]</String>
293 <String Id="ProgressTextDuplicateFiles" Overridable="yes">Se creează fişierele duplicat</String>
294 <String Id="ProgressTextDuplicateFilesTemplate" Overridable="yes">Fişier: [1], Director: [9], Dimensiune: [6]</String>
295 <String Id="ProgressTextFindRelatedProducts" Overridable="yes">Se caută aplicaţiile corelate</String>
296 <String Id="ProgressTextFindRelatedProductsTemplate" Overridable="yes">Aplicaţie găsită: [1]</String>
297 <String Id="ProgressTextInstallODBC" Overridable="yes">Se instalează componentele ODBC</String>
298 <String Id="ProgressTextInstallServices" Overridable="yes">Se instalează serviciile noi</String>
299 <String Id="ProgressTextInstallServicesTemplate" Overridable="yes">Serviciu: [2]</String>
300 <String Id="ProgressTextLaunchConditions" Overridable="yes">Se evaluează condiţiile de lansare</String>
301 <String Id="ProgressTextMigrateFeatureStates" Overridable="yes">Se migrează stările caracteristicilor din aplicaţiile corelate</String>
302 <String Id="ProgressTextMigrateFeatureStatesTemplate" Overridable="yes">Aplicaţie: [1]</String>
303 <String Id="ProgressTextMoveFiles" Overridable="yes">Se mută fişierele</String>
304 <String Id="ProgressTextMoveFilesTemplate" Overridable="yes">Fişier: [1], Director: [9], Dimensiune: [6]</String>
305 <String Id="ProgressTextPatchFiles" Overridable="yes">Se corectează fişierele</String>
306 <String Id="ProgressTextPatchFilesTemplate" Overridable="yes">Fişier: [1], Director: [2], Dimensiune: [3]</String>
307 <String Id="ProgressTextProcessComponents" Overridable="yes">Se actualizează înregistrarea componentelor</String>
308 <String Id="ProgressTextRegisterComPlus" Overridable="yes">Se înregistrează componentele şi aplicaţiile COM+</String>
309 <String Id="ProgressTextRegisterComPlusTemplate" Overridable="yes">ID aplicaţie: [1]{{, Tip aplicaţie: [2], Utilizatori: [3], RSN: [4]}}</String>
310 <String Id="ProgressTextRegisterFonts" Overridable="yes">Se înregistrează fonturile</String>
311 <String Id="ProgressTextRegisterFontsTemplate" Overridable="yes">Font: [1]</String>
312 <String Id="ProgressTextRegisterProduct" Overridable="yes">Se înregistrează produsul</String>
313 <String Id="ProgressTextRegisterProductTemplate" Overridable="yes">[1]</String>
314 <String Id="ProgressTextRegisterTypeLibraries" Overridable="yes">Se înregistrează bibliotecile de tipuri</String>
315 <String Id="ProgressTextRegisterTypeLibrariesTemplate" Overridable="yes">ID bibliotecă: [1]</String>
316 <String Id="ProgressTextRegisterUser" Overridable="yes">Se înregistrează utilizatorul</String>
317 <String Id="ProgressTextRegisterUserTemplate" Overridable="yes">[1]</String>
318 <String Id="ProgressTextRemoveDuplicateFiles" Overridable="yes">Se elimină fişierele duplicat</String>
319 <String Id="ProgressTextRemoveDuplicateFilesTemplate" Overridable="yes">Fişier: [1], Director: [9]</String>
320 <String Id="ProgressTextRemoveEnvironmentStrings" Overridable="yes">Se actualizează şirurile de mediu</String>
321 <String Id="ProgressTextRemoveEnvironmentStringsTemplate" Overridable="yes">Nume: [1], Valoare: [2], Acţiune [3]</String>
322 <String Id="ProgressTextRemoveExistingProducts" Overridable="yes">Se elimină aplicaţiile</String>
323 <String Id="ProgressTextRemoveExistingProductsTemplate" Overridable="yes">Aplicaţie: [1], Linie de comandă: [2]</String>
324 <String Id="ProgressTextRemoveFiles" Overridable="yes">Se elimină fişierele</String>
325 <String Id="ProgressTextRemoveFilesTemplate" Overridable="yes">Fişier: [1], Director: [9]</String>
326 <String Id="ProgressTextRemoveFolders" Overridable="yes">Se elimină folderele</String>
327 <String Id="ProgressTextRemoveFoldersTemplate" Overridable="yes">Folder: [1]</String>
328 <String Id="ProgressTextRemoveIniValues" Overridable="yes">Se elimină intrările fişierelor INI</String>
329 <String Id="ProgressTextRemoveIniValuesTemplate" Overridable="yes">Fişier: [1], Secţiune: [2], Cheie: [3], Valoare: [4]</String>
330 <String Id="ProgressTextRemoveODBC" Overridable="yes">Se elimină componentele ODBC</String>
331 <String Id="ProgressTextRemoveRegistryValues" Overridable="yes">Se elimină valorile din registry de sistem</String>
332 <String Id="ProgressTextRemoveRegistryValuesTemplate" Overridable="yes">Cheie: [1], Nume: [2]</String>
333 <String Id="ProgressTextRemoveShortcuts" Overridable="yes">Se elimină comenzile rapide</String>
334 <String Id="ProgressTextRemoveShortcutsTemplate" Overridable="yes">Comandă rapidă: [1]</String>
335 <String Id="ProgressTextRMCCPSearch" Overridable="yes">Se caută produsele calificate</String>
336 <String Id="ProgressTextSelfRegModules" Overridable="yes">Se înregistrează modulele</String>
337 <String Id="ProgressTextSelfRegModulesTemplate" Overridable="yes">Fişier: [1], Folder: [2]</String>
338 <String Id="ProgressTextSelfUnregModules" Overridable="yes">Se anulează înregistrarea modulelor</String>
339 <String Id="ProgressTextSelfUnregModulesTemplate" Overridable="yes">Fişier: [1], Folder: [2]</String>
340 <String Id="ProgressTextSetODBCFolders" Overridable="yes">Se iniţializează directoarele ODBC</String>
341 <String Id="ProgressTextStartServices" Overridable="yes">Se pornesc serviciile</String>
342 <String Id="ProgressTextStartServicesTemplate" Overridable="yes">Serviciu: [1]</String>
343 <String Id="ProgressTextStopServices" Overridable="yes">Se opresc serviciile</String>
344 <String Id="ProgressTextStopServicesTemplate" Overridable="yes">Serviciu: [1]</String>
345 <String Id="ProgressTextUnpublishComponents" Overridable="yes">Se anulează publicarea componentelor calificate</String>
346 <String Id="ProgressTextUnpublishComponentsTemplate" Overridable="yes">ID componentă: [1], Calificator: [2]</String>
347 <String Id="ProgressTextUnpublishFeatures" Overridable="yes">Se anulează publicarea caracteristicilor produsului</String>
348 <String Id="ProgressTextUnpublishFeaturesTemplate" Overridable="yes">Caracteristică: [1]</String>
349 <String Id="ProgressTextUnregisterClassInfo" Overridable="yes">Se anulează înregistrarea serverelor de clasă</String>
350 <String Id="ProgressTextUnregisterClassInfoTemplate" Overridable="yes">ID clasă: [1]</String>
351 <String Id="ProgressTextUnregisterComPlus" Overridable="yes">Se anulează înregistrarea aplicaţiilor şi componentelor COM+</String>
352 <String Id="ProgressTextUnregisterComPlusTemplate" Overridable="yes">ID aplicaţie: [1]{{, Tip aplicaţie: [2]}}</String>
353 <String Id="ProgressTextUnregisterExtensionInfo" Overridable="yes">Se anulează înregistrarea serverelor de extensie</String>
354 <String Id="ProgressTextUnregisterExtensionInfoTemplate" Overridable="yes">Extensie: [1]</String>
355 <String Id="ProgressTextUnregisterFonts" Overridable="yes">Se anulează înregistrarea fonturilor</String>
356 <String Id="ProgressTextUnregisterFontsTemplate" Overridable="yes">Font: [1]</String>
357 <String Id="ProgressTextUnregisterMIMEInfo" Overridable="yes">Se anulează înregistrarea informaţiilor MIME</String>
358 <String Id="ProgressTextUnregisterMIMEInfoTemplate" Overridable="yes">Tip conţinut MIME: [1], Extensie: [2]</String>
359 <String Id="ProgressTextUnregisterProgIdInfo" Overridable="yes">Se anulează înregistrarea identificatorilor de program</String>
360 <String Id="ProgressTextUnregisterProgIdInfoTemplate" Overridable="yes">ID program: [1]</String>
361 <String Id="ProgressTextUnregisterTypeLibraries" Overridable="yes">Se anulează înregistrarea bibliotecilor de tipuri</String>
362 <String Id="ProgressTextUnregisterTypeLibrariesTemplate" Overridable="yes">ID bibliotecă: [1]</String>
363 <String Id="ProgressTextWriteEnvironmentStrings" Overridable="yes">Se actualizează şirurile de mediu</String>
364 <String Id="ProgressTextWriteEnvironmentStringsTemplate" Overridable="yes">Nume: [1], Valoare: [2], Acţiune [3]</String>
365 <String Id="ProgressTextWriteIniValues" Overridable="yes">Se scriu valorile fişierelor INI</String>
366 <String Id="ProgressTextWriteIniValuesTemplate" Overridable="yes">Fişier: [1], Secţiune: [2], Cheie: [3], Valoare: [4]</String>
367 <String Id="ProgressTextWriteRegistryValues" Overridable="yes">Se scriu valorile în registry de sistem</String>
368 <String Id="ProgressTextWriteRegistryValuesTemplate" Overridable="yes">Cheie: [1], Nume: [2], Valoare: [3]</String>
369 <String Id="ProgressTextAdvertise" Overridable="yes">Se anunţă aplicaţia</String>
370 <String Id="ProgressTextGenerateScript" Overridable="yes">Se generează operaţii de script pentru acţiune:</String>
371 <String Id="ProgressTextGenerateScriptTemplate" Overridable="yes">[1]</String>
372 <String Id="ProgressTextInstallSFPCatalogFile" Overridable="yes">Se instalează catalogul de sistem</String>
373 <String Id="ProgressTextInstallSFPCatalogFileTemplate" Overridable="yes">Fişier: [1], Dependenţe: [2]</String>
374 <String Id="ProgressTextMsiPublishAssemblies" Overridable="yes">Se publică informaţiile de asamblare</String>
375 <String Id="ProgressTextMsiPublishAssembliesTemplate" Overridable="yes">Context aplicaţie:[1], Nume asamblare:[2]</String>
376 <String Id="ProgressTextMsiUnpublishAssemblies" Overridable="yes">Se anulează publicarea informaţiilor de asamblare</String>
377 <String Id="ProgressTextMsiUnpublishAssembliesTemplate" Overridable="yes">Context aplicaţie:[1], Nume asamblare:[2]</String>
378 <String Id="ProgressTextRollback" Overridable="yes">Se anulează acţiunea:</String>
379 <String Id="ProgressTextRollbackTemplate" Overridable="yes">[1]</String>
380 <String Id="ProgressTextRollbackCleanup" Overridable="yes">Se elimină fişierele de rezervă</String>
381 <String Id="ProgressTextRollbackCleanupTemplate" Overridable="yes">Fişier: [1]</String>
382 <String Id="ProgressTextUnmoveFiles" Overridable="yes">Se elimină fişierele mutate</String>
383 <String Id="ProgressTextUnmoveFilesTemplate" Overridable="yes">Fişier: [1], Director: [9]</String>
384 <String Id="ProgressTextUnpublishProduct" Overridable="yes">Se anulează publicarea informaţiilor despre produs</String>
385
386 <String Id="Error0" Overridable="yes">{{Eroare fatală: }}</String>
387 <String Id="Error1" Overridable="yes">{{Eroare [1]. }}</String>
388 <String Id="Error2" Overridable="yes">Avertisment [1]. </String>
389 <String Id="Error4" Overridable="yes">Informaţii [1]. </String>
390 <String Id="Error5" Overridable="yes">Programul de instalare a întâlnit o eroare neaşteptată la instalarea acestui pachet. Acest lucru poate indica o problemă cu pachetul. Codul de eroare este [1]. {{Argumentele sunt: [2], [3], [4]}}</String>
391 <String Id="Error7" Overridable="yes">{{Disc plin: }}</String>
392 <String Id="Error8" Overridable="yes">Acţiune [Time]: [1]. [2]</String>
393 <String Id="Error9" Overridable="yes">[ProductName]</String>
394 <String Id="Error10" Overridable="yes">{[2]}{, [3]}{, [4]}</String>
395 <String Id="Error11" Overridable="yes">Tip mesaj: [1], Argument: [2]</String>
396 <String Id="Error12" Overridable="yes">=== Înregistrarea în jurnal a început: [Date] [Time] ===</String>
397 <String Id="Error13" Overridable="yes">=== Înregistrarea în jurnal s-a oprit: [Date] [Time] ===</String>
398 <String Id="Error14" Overridable="yes">Acţiune începută la [Time]: [1].</String>
399 <String Id="Error15" Overridable="yes">Acţiune terminată la [Time]: [1]. Valoare întoarsă [2].</String>
400 <String Id="Error16" Overridable="yes">Timp rămas: {[1] minute }{[2] secunde}</String>
401 <String Id="Error17" Overridable="yes">Memorie insuficientă. Închideţi celelalte aplicaţii înainte de a încerca din nou.</String>
402 <String Id="Error18" Overridable="yes">Programul de instalare nu mai răspunde.</String>
403 <String Id="Error19" Overridable="yes">Programul de instalare s-a oprit prematur.</String>
404 <String Id="Error20" Overridable="yes">Aşteptaţi, Windows configurează [ProductName]</String>
405 <String Id="Error21" Overridable="yes">Se colectează informaţiile necesare...</String>
406 <String Id="Error22" Overridable="yes">Se elimină versiunile anterioare ale acestei aplicaţii...</String>
407 <String Id="Error23" Overridable="yes">Se pregăteşte eliminarea versiunilor anterioare ale acestei aplicaţii...</String>
408 <String Id="Error32" Overridable="yes">Instalarea {[ProductName] } s-a finalizat cu succes.</String>
409 <String Id="Error33" Overridable="yes">Instalarea {[ProductName] } nu a reuşit.</String>
410 <String Id="Error1101" Overridable="yes">Eroare la citirea din fişierul: [2]. {{ Eroare de sistem [3].}} Verificaţi dacă fişierul există şi dacă îl puteţi accesa.</String>
411 <String Id="Error1301" Overridable="yes">Imposibil de creat fişierul „[2]”. Există deja un director cu acest nume. Revocaţi instalarea şi încercaţi să instalaţi la o locaţie diferită.</String>
412 <String Id="Error1302" Overridable="yes">Introduceţi discul: [2]</String>
413 <String Id="Error1303" Overridable="yes">Programul de instalare nu are privilegii suficiente pentru accesarea acestui director: [2]. Instalarea nu poate continua. Faceţi log on ca administrator sau contactaţi administratorul de sistem.</String>
414 <String Id="Error1304" Overridable="yes">Eroare la scrierea în fişierul: [2]. Verificaţi dacă aveţi acces la acel director.</String>
415 <String Id="Error1305" Overridable="yes">Eroare la citirea din fişierul [2]. {{ Eroare de sistem [3].}} Verificaţi dacă fişierul există şi dacă îl puteţi accesa.</String>
416 <String Id="Error1306" Overridable="yes">O altă aplicaţie are acces exclusiv la fişierul „[2]”. Închideţi toate celelalte aplicaţii, apoi faceţi clic pe Reîncercare.</String>
417 <String Id="Error1307" Overridable="yes">Nu există suficient spaţiu-disc pentru instalarea acestui fişier: [2]. Eliberaţi spaţiu-disc şi faceţi clic pe Reîncercare, sau faceţi clic pe Revocare pentru a ieşi.</String>
418 <String Id="Error1308" Overridable="yes">Imposibil de găsit fişierul sursă: [2]. Verificaţi dacă fişierul există şi dacă îl puteţi accesa.</String>
419 <String Id="Error1309" Overridable="yes">Eroare la citirea din fişierul: [3]. {{ Eroare de sistem [2].}} Verificaţi dacă fişierul există şi dacă îl puteţi accesa.</String>
420 <String Id="Error1310" Overridable="yes">Eroare la scrierea în fişierul: [3]. {{ Eroare de sistem [2].}} Verificaţi dacă aveţi acces la director.</String>
421 <String Id="Error1311" Overridable="yes">Imposibil de găsit fişierul sursă{{(cabinet)}}: [2]. Verificaţi dacă fişierul există şi dacă îl puteţi accesa.</String>
422 <String Id="Error1312" Overridable="yes">Imposibil de creat directorul „[2]”. Există deja un fişier cu acest nume. Redenumiţi sau eliminaţi fişierul şi faceţi clic pe Reîncercare, sau faceţi clic pe Revocare pentru a ieşi.</String>
423 <String Id="Error1313" Overridable="yes">Volumul [2] nu este disponibil în acest moment. Selectaţi altul.</String>
424 <String Id="Error1314" Overridable="yes">Calea specificată „[2]” este indisponibilă.</String>
425 <String Id="Error1315" Overridable="yes">Imposibil de scris în folderul specificat: [2].</String>
426 <String Id="Error1316" Overridable="yes">Eroare de reţea la încercarea de citire din fişierul: [2]</String>
427 <String Id="Error1317" Overridable="yes">Eroare la încercarea de creare a directorului: [2]</String>
428 <String Id="Error1318" Overridable="yes">Eroare de reţea la încercarea de creare a directorului: [2]</String>
429 <String Id="Error1319" Overridable="yes">Eroare de reţea la încercarea de deschidere a fişierului cabinet sursă: [2]</String>
430 <String Id="Error1320" Overridable="yes">Calea specificată este prea lungă: [2]</String>
431 <String Id="Error1321" Overridable="yes">Programul de instalare nu are privilegii suficiente pentru a modifica fişierul: [2].</String>
432 <String Id="Error1322" Overridable="yes">O parte din calea folderului „[2]” este nevalidă. Fie este goală, fie depăşeşte lungimea permisă de sistem.</String>
433 <String Id="Error1323" Overridable="yes">Calea folderului „[2]” conţine cuvinte care nu sunt valide în căile de foldere.</String>
434 <String Id="Error1324" Overridable="yes">Calea folderului „[2]” conţine un caracter nevalid.</String>
435 <String Id="Error1325" Overridable="yes">„[2]” nu este un nume scurt valid de fişier.</String>
436 <String Id="Error1326" Overridable="yes">Eroare la preluarea datelor de securitate pentru fişier: [3] GetLastError: [2]</String>
437 <String Id="Error1327" Overridable="yes">Unitate nevalidă: [2]</String>
438 <String Id="Error1328" Overridable="yes">Eroare la aplicarea corecţiei pentru fişierul [2]. Probabil a fost actualizat prin alte mijloace şi nu mai poate fi modificat prin această corecţie. Pentru mai multe informaţii, contactaţi furnizorul corecţiei. {{Eroare de sistem: [3]}}</String>
439 <String Id="Error1329" Overridable="yes">Un fişier necesar nu poate fi instalat, deoarece fişierul cabinet [2] nu este semnat digital. Aceasta poate indica faptul că fişierul cabinet este deteriorat.</String>
440 <String Id="Error1330" Overridable="yes">Un fişier necesar nu poate fi instalat, deoarece fişierul cabinet [2] are o semnătură digitală nevalidă. Aceasta poate indica faptul că fişierul cabinet este deteriorat.{{Eroare [3] returnată de WinVerifyTrust.}}</String>
441 <String Id="Error1331" Overridable="yes">Fişierul [2] nu a fost copiat corect: eroare CRC.</String>
442 <String Id="Error1332" Overridable="yes">Fişierul [2] nu a fost mutat corect: eroare CRC.</String>
443 <String Id="Error1333" Overridable="yes">Corecţia la fişierul [2] nu s-a aplicat corect: eroare CRC.</String>
444 <String Id="Error1334" Overridable="yes">Fişierul „[2]” nu se poate instala, deoarece nu a fost găsit în fişierul cabinet „[3]”. Acest lucru poate indica o eroare de reţea, o eroare la citirea de pe CD-ROM sau o problemă cu acest pachet.</String>
445 <String Id="Error1335" Overridable="yes">Fişierul cabinet „[2]” necesar pentru această instalare este deteriorat şi nu poate fi utilizat. Acest lucru poate indica o eroare de reţea, o eroare la citirea de pe CD-ROM sau o problemă cu acest pachet.</String>
446 <String Id="Error1336" Overridable="yes">Eroare la crearea unui fişier temporar necesar pentru finalizarea instalării.{{ Folder: [3]. Cod eroare de sistem: [2]}}</String>
447 <String Id="Error1401" Overridable="yes">Imposibil de creat cheia: [2]. {{ Eroare de sistem [3].}} Verificaţi dacă aveţi drepturi suficiente de acces la acea cheie sau contactaţi personalul de asistenţă. </String>
448 <String Id="Error1402" Overridable="yes">Imposibil de deschis cheia: [2]. {{ Eroare de sistem [3].}} Verificaţi dacă aveţi drepturi suficiente de acces la acea cheie sau contactaţi personalul de asistenţă. </String>
449 <String Id="Error1403" Overridable="yes">Imposibil de şters valoarea [2] din cheia [3]. {{ Eroare de sistem [4].}} Verificaţi dacă aveţi drepturi suficiente de acces la acea cheie sau contactaţi personalul de asistenţă. </String>
450 <String Id="Error1404" Overridable="yes">Imposibil de şters cheia [2]. {{ Eroare de sistem [3].}} Verificaţi dacă aveţi drepturi suficiente de acces la acea cheie sau contactaţi personalul de asistenţă. </String>
451 <String Id="Error1405" Overridable="yes">Imposibil de citit valoarea [2] din cheia [3]. {{ Eroare de sistem [4].}} Verificaţi dacă aveţi drepturi suficiente de acces la acea cheie sau contactaţi personalul de asistenţă. </String>
452 <String Id="Error1406" Overridable="yes">Imposibil de scris valoarea [2] în cheia [3]. {{ Eroare de sistem [4].}} Verificaţi dacă aveţi drepturi suficiente de acces la acea cheie sau contactaţi personalul de asistenţă.</String>
453 <String Id="Error1407" Overridable="yes">Imposibil de preluat numele valorilor pentru cheia [2]. {{ Eroare de sistem [3].}} Verificaţi dacă aveţi drepturi suficiente de acces la acea cheie sau contactaţi personalul de asistenţă.</String>
454 <String Id="Error1408" Overridable="yes">Imposibil de preluat numele subcheilor pentru cheia [2]. {{ Eroare de sistem [3].}} Verificaţi dacă aveţi drepturi suficiente de acces la acea cheie sau contactaţi personalul de asistenţă.</String>
455 <String Id="Error1409" Overridable="yes">Imposibil de citit informaţiile de securitate pentru cheia [2]. {{ Eroare de sistem [3].}} Verificaţi dacă aveţi drepturi suficiente de acces la acea cheie sau contactaţi personalul de asistenţă.</String>
456 <String Id="Error1410" Overridable="yes">Imposibil de mărit spaţiul disponibil pentru registry. Este necesar un spaţiu liber de [2] KO în registry pentru instalarea acestei aplicaţii.</String>
457 <String Id="Error1500" Overridable="yes">O altă instalare este în curs. Trebuie să finalizaţi acea instalare înainte de a o continua pe aceasta.</String>
458 <String Id="Error1501" Overridable="yes">Eroare de accesare a datelor securizate. Asiguraţi-vă că Windows Installer este corect configurat şi încercaţi instalarea încă o dată.</String>
459 <String Id="Error1502" Overridable="yes">Utilizatorul „[2]” a iniţiat anterior o instalare a produsului „[3]”. Acel utilizator va trebui să execute din nou instalarea pentru a utiliza produsul. Instalarea dvs. curentă va continua.</String>
460 <String Id="Error1503" Overridable="yes">Utilizatorul „[2]” a iniţiat anterior o instalare a produsului „[3]”. Acel utilizator va trebui să execute din nou instalarea pentru a utiliza produsul.</String>
461 <String Id="Error1601" Overridable="yes">Spaţiu-disc insuficient - Volum: „[2]”; spaţiu necesar: [3] KO; spaţiu disponibil: [4] KO. Eliberaţi spaţiu-disc şi reîncercaţi.</String>
462 <String Id="Error1602" Overridable="yes">Sigur revocaţi?</String>
463 <String Id="Error1603" Overridable="yes">Fişierul [2][3] este reţinut în utilizare {de următorul proces: Nume: [4], ID: [5], Titlu fereastră: „[6]”}. Închideţi acea aplicaţie şi reîncercaţi.</String>
464 <String Id="Error1604" Overridable="yes">Produsul „[2]” este deja instalat, ceea ce împiedică instalarea acestui produs. Cele două produse sunt incompatibile.</String>
465 <String Id="Error1605" Overridable="yes">Spaţiu-disc insuficient pe volumul „[2]” pentru a continua instalarea cu opţiunea de recuperare activată. Este necesar un spaţiu de [3] KO, dar este disponibil doar un spaţiu de [4] KO. Faceţi clic pe Ignorare pentru a continua instalarea fără a salva informaţiile de recuperare, faceţi clic pe Reîncercare pentru a verifica din nou spaţiul disponibil sau faceţi clic pe Revocare pentru a părăsi instalarea.</String>
466 <String Id="Error1606" Overridable="yes">Imposibil de accesat locaţia din reţea [2].</String>
467 <String Id="Error1607" Overridable="yes">Următoarele aplicaţii trebuie închise înainte de a continua instalarea:</String>
468 <String Id="Error1608" Overridable="yes">Imposibil de găsit produse conforme instalate anterior pe computer pentru instalarea acestui produs.</String>
469 <String Id="Error1609" Overridable="yes">Eroare la aplicarea setărilor de securitate. [2] nu este un utilizator sau un grup valid. Aceasta poate indica o problemă cu pachetul sau o problemă de conectare la un controler de domeniu din reţea. Verificaţi conexiunea la reţea şi faceţi clic pe Reîncercare sau pe Revocare pentru a finaliza instalarea. {{Imposibil de localizat identificatorul SID al utilizatorului, eroare de sistem [3]}}</String>
470 <String Id="Error1701" Overridable="yes">Cheia [2] nu este validă. Verificaţi dacă aţi introdus cheia corectă.</String>
471 <String Id="Error1702" Overridable="yes">Programul de instalare trebuie să repornească sistemul înainte de a continua configurarea [2]. Faceţi clic pe Da pentru a reporni acum sau pe Nu dacă intenţionaţi să reporniţi manual mai târziu.</String>
472 <String Id="Error1703" Overridable="yes">Trebuie să reporniţi sistemul pentru ca modificările de configurare efectuate la [2] să fie aplicate. Faceţi clic pe Da pentru a reporni acum sau pe Nu dacă intenţionaţi să reporniţi manual mai târziu.</String>
473 <String Id="Error1704" Overridable="yes">O instalare pentru [2] este suspendată momentan. Pentru a continua, trebuie să anulaţi modificările făcute de acea instalare. Anulaţi aceste modificări?</String>
474 <String Id="Error1705" Overridable="yes">O instalare anterioară a acestui produs este în curs. Pentru a continua, trebuie să anulaţi modificările făcute de acea instalare. Anulaţi aceste modificări?</String>
475 <String Id="Error1706" Overridable="yes">Imposibil de găsit un pachet de instalare pentru produsul [2]. Încercaţi să instalaţi din nou utilizând o copie validă a pachetului de instalare „[3]”.</String>
476 <String Id="Error1707" Overridable="yes">Instalare finalizată cu succes.</String>
477 <String Id="Error1708" Overridable="yes">Instalarea nu a reuşit.</String>
478 <String Id="Error1709" Overridable="yes">Produs: [2] - [3]</String>
479 <String Id="Error1710" Overridable="yes">Aveţi posibilitatea să restauraţi starea anterioară a computerului sau să continuaţi instalarea mai târziu. Restauraţi starea anterioară?</String>
480 <String Id="Error1711" Overridable="yes">Eroare la scrierea informaţiilor de instalare pe disc. Asiguraţi-vă că este disponibil suficient spaţiu-disc, apoi faceţi clic pe Reîncercare, sau faceţi clic pe Revocare pentru a încheia instalarea.</String>
481 <String Id="Error1712" Overridable="yes">Unul sau mai multe fişiere necesare pentru a restaura starea iniţială a computerului nu au fost găsite. Restaurarea este imposibilă.</String>
482 <String Id="Error1713" Overridable="yes">[2] nu poate instala unul din produsele sale necesare. Contactaţi grupul de asistenţă tehnică. {{Eroare de sistem: [3].}}</String>
483 <String Id="Error1714" Overridable="yes">Versiunea anterioară de [2] nu poate fi eliminată. Contactaţi grupul de asistenţă tehnică. {{Eroare de sistem [3].}}</String>
484 <String Id="Error1715" Overridable="yes">S-a instalat [2]</String>
485 <String Id="Error1716" Overridable="yes">S-a configurat [2]</String>
486 <String Id="Error1717" Overridable="yes">S-a eliminat [2]</String>
487 <String Id="Error1718" Overridable="yes">Fişierul [2] a fost respins de politica de semnături digitale.</String>
488 <String Id="Error1719" Overridable="yes">Serviciul Windows Installer nu poate fi accesat. Aceasta situaţie poate să apară dacă Windows se execută în modul de siguranţă sau dacă Windows Installer nu este instalat corect. Luaţi legătura cu personalul de asistenţă pentru ajutor.</String>
489 <String Id="Error1720" Overridable="yes">Există o problemă cu acest pachet Windows Installer. Un script necesar pentru finalizarea acestei instalări nu poate fi executat. Contactaţi personalul de asistenţă sau furnizorul pachetului. {{Acţiune particularizată [2] - eroare script [3], [4]: [5] linie [6], coloană [7], [8] }}</String>
490 <String Id="Error1721" Overridable="yes">Există o problemă cu acest pachet Windows Installer. Un program necesar pentru finalizarea acestei instalări nu poate fi executat. Contactaţi personalul de asistenţă sau furnizorul pachetului. {{Acţiune: [2], locaţie: [3], comandă: [4] }}</String>
491 <String Id="Error1722" Overridable="yes">Există o problemă cu acest pachet Windows Installer. O executare de program ca parte a instalării nu s-a finalizat conform aşteptării. Contactaţi personalul de asistenţă sau furnizorul pachetului. {{Acţiune [2], locaţie: [3], comandă: [4] }}</String>
492 <String Id="Error1723" Overridable="yes">Există o problemă cu acest pachet Windows Installer. Un DLL necesar pentru finalizarea acestei instalări nu poate fi executat. Contactaţi personalul de asistenţă sau furnizorul pachetului. {{Acţiune [2], intrare: [3], bibliotecă: [4] }}</String>
493 <String Id="Error1724" Overridable="yes">Eliminarea s-a finalizat cu succes.</String>
494 <String Id="Error1725" Overridable="yes">Eliminarea nu a reuşit.</String>
495 <String Id="Error1726" Overridable="yes">Anunţul s-a finalizat cu succes.</String>
496 <String Id="Error1727" Overridable="yes">Anunţul nu a reuşit.</String>
497 <String Id="Error1728" Overridable="yes">Configurarea s-a finalizat cu succes.</String>
498 <String Id="Error1729" Overridable="yes">Configurarea nu a reuşit.</String>
499 <String Id="Error1730" Overridable="yes">Pentru a elimina această aplicaţie, trebuie să fiţi administrator. Pentru a elimina această aplicaţie, aveţi posibilitatea să faceţi log on ca administrator sau să luaţi legătura cu grupul de asistenţă tehnică pentru ajutor.</String>
500 <String Id="Error1731" Overridable="yes">Pachetul de instalare sursă pentru produsul [2] nu este sincronizat cu pachetul client. Încercaţi să instalaţi din nou utilizând o copie validă a pachetului de instalare „[3]”.</String>
501 <String Id="Error1732" Overridable="yes">Pentru a finaliza instalarea [2], trebuie să reporniţi computerul. Alţi utilizatori sunt conectaţi în prezent la computer, iar repornirea poate cauza pierderea muncii acestora. Reporniţi acum?</String>
502 <String Id="Error1801" Overridable="yes">Calea [2] nu este validă. Specificaţi o cale validă.</String>
503 <String Id="Error1802" Overridable="yes">Memorie insuficientă. Închideţi celelalte aplicaţii înainte de a încerca din nou.</String>
504 <String Id="Error1803" Overridable="yes">Niciun disc în unitatea [2]. Introduceţi un disc şi faceţi clic pe Reîncercare, sau faceţi clic pe Revocare pentru a reveni la volumul selectat anterior.</String>
505 <String Id="Error1804" Overridable="yes">Niciun disc în unitatea [2]. Introduceţi un disc şi faceţi clic pe Reîncercare, sau faceţi clic pe Revocare pentru a reveni la dialogul de răsfoire şi selectaţi un alt volum.</String>
506 <String Id="Error1805" Overridable="yes">Folderul [2] nu există. Introduceţi o cale către un folder existent.</String>
507 <String Id="Error1806" Overridable="yes">Nu aveţi privilegii suficiente pentru a citi acest folder.</String>
508 <String Id="Error1807" Overridable="yes">Imposibil de determinat un folder de destinaţie valid pentru instalare.</String>
509 <String Id="Error1901" Overridable="yes">Eroare la încercarea de citire din baza de date sursă de instalare: [2].</String>
510 <String Id="Error1902" Overridable="yes">Se programează operaţia de repornire a sistemului: se redenumeşte fişierul din [2] în [3]. Este necesară repornirea sistemului pentru a finaliza operaţia.</String>
511 <String Id="Error1903" Overridable="yes">Se programează operaţia de repornire a sistemului: se şterge fişierul [2]. Este necesară repornirea sistemului pentru a finaliza operaţia.</String>
512 <String Id="Error1904" Overridable="yes">Înregistrarea modulului [2] nu a reuşit. HRESULT [3]. Contactaţi personalul de asistenţă.</String>
513 <String Id="Error1905" Overridable="yes">Anularea înregistrării modulului [2] nu a reuşit. HRESULT [3]. Contactaţi personalul de asistenţă.</String>
514 <String Id="Error1906" Overridable="yes">Memorarea în cache a pachetului [2] nu a reuşit. Eroare: [3]. Contactaţi personalul de asistenţă.</String>
515 <String Id="Error1907" Overridable="yes">Imposibil de înregistrat fontul [2]. Verificaţi dacă deţineţi suficiente permisiuni pentru a instala fonturi şi dacă sistemul acceptă acest font.</String>
516 <String Id="Error1908" Overridable="yes">Imposibil de anulat înregistrarea fontului [2]. Verificaţi dacă aveţi suficiente permisiuni pentru a elimina fonturi.</String>
517 <String Id="Error1909" Overridable="yes">Imposibil de creat comanda rapidă [2]. Verificaţi dacă folderul destinaţie există şi dacă îl puteţi accesa.</String>
518 <String Id="Error1910" Overridable="yes">Imposibil de eliminat comanda rapidă [2]. Verificaţi dacă fişierul comenzii rapide există şi dacă îl puteţi accesa.</String>
519 <String Id="Error1911" Overridable="yes">Imposibil de înregistrat biblioteca de tipuri pentru fişierul [2]. Contactaţi personalul de asistenţă.</String>
520 <String Id="Error1912" Overridable="yes">Imposibil de anulat înregistrarea bibliotecii de tipuri pentru fişierul [2]. Contactaţi personalul de asistenţă.</String>
521 <String Id="Error1913" Overridable="yes">Imposibil de actualizat fişierul ini [2][3]. Verificaţi dacă fişierul există şi dacă îl puteţi accesa.</String>
522 <String Id="Error1914" Overridable="yes">Imposibil de programat fişierul [2] pentru înlocuirea fişierului [3] la repornire. Verificaţi dacă aveţi permisiuni de scriere pentru fişierul [3].</String>
523 <String Id="Error1915" Overridable="yes">Eroare la eliminarea managerului de drivere ODBC, eroare ODBC [2]: [3]. Contactaţi personalul de asistenţă.</String>
524 <String Id="Error1916" Overridable="yes">Eroare la instalarea managerului de drivere ODBC, eroare ODBC [2]: [3]. Contactaţi personalul de asistenţă.</String>
525 <String Id="Error1917" Overridable="yes">Eroare la eliminarea driverului ODBC: [4], eroare ODBC [2]: [3]. Verificaţi dacă aveţi privilegii suficiente pentru a elimina drivere ODBC.</String>
526 <String Id="Error1918" Overridable="yes">Eroare la instalarea driverului ODBC: [4], eroare ODBC [2]: [3]. Verificaţi dacă fişierul [4] există şi dacă îl puteţi accesa.</String>
527 <String Id="Error1919" Overridable="yes">Eroare la configurarea sursei de date ODBC: [4], eroare ODBC [2]: [3]. Verificaţi dacă fişierul [4] există şi dacă îl puteţi accesa.</String>
528 <String Id="Error1920" Overridable="yes">Pornirea serviciului „[2]” ([3]) nu a reuşit. Verificaţi dacă aveţi suficiente privilegii pentru a porni serviciile de sistem.</String>
529 <String Id="Error1921" Overridable="yes">Imposibil de oprit serviciul „[2]” ([3]). Verificaţi dacă aveţi suficiente privilegii pentru a opri serviciile de sistem.</String>
530 <String Id="Error1922" Overridable="yes">Imposibil de şters serviciul „[2]” ([3]). Verificaţi dacă aveţi suficiente privilegii pentru a elimina serviciile de sistem.</String>
531 <String Id="Error1923" Overridable="yes">Imposibil de instalat serviciul „[2]” ([3]). Verificaţi dacă aveţi suficiente privilegii pentru a instala serviciile de sistem.</String>
532 <String Id="Error1924" Overridable="yes">Imposibil de actualizat variabila de mediu „[2]”. Verificaţi dacă aveţi suficiente privilegii pentru a modifica variabilele de mediu.</String>
533 <String Id="Error1925" Overridable="yes">Nu aveţi suficiente privilegii pentru a finaliza această instalare pentru toţi utilizatorii computerului. Conectaţi-vă ca administrator şi reîncercaţi această instalare.</String>
534 <String Id="Error1926" Overridable="yes">Imposibil de setat securitatea fişierului pentru fişierul „[3]”. Eroare: [2]. Verificaţi dacă aveţi suficiente privilegii pentru a modifica permisiunile de securitate pentru acest fişier.</String>
535 <String Id="Error1927" Overridable="yes">Serviciile componente (COM+ 1.0) nu sunt instalate pe acest computer. Serviciile componente sunt necesare pentru ca această instalare să se finalizeze cu succes. Serviciile componente sunt disponibile în Windows 2000.</String>
536 <String Id="Error1928" Overridable="yes">Eroare la înregistrarea aplicaţiei COM+. Contactaţi personalul de asistenţă pentru informaţii suplimentare.</String>
537 <String Id="Error1929" Overridable="yes">Eroare la anularea înregistrării aplicaţiei COM+. Contactaţi personalul de asistenţă pentru informaţii suplimentare.</String>
538 <String Id="Error1930" Overridable="yes">Imposibil de modificat descrierea serviciului „[2]” ([3]).</String>
539 <String Id="Error1931" Overridable="yes">Serviciul Windows Installer nu poate actualiza fişierul de sistem [2], deoarece fişierul este protejat de Windows. Poate fi necesară actualizarea sistemului de operare pentru ca acest program să funcţioneze corect. {{Versiune pachet: [3], versiune protejată SO: [4]}}</String>
540 <String Id="Error1932" Overridable="yes">Serviciul Windows Installer nu poate actualiza fişierul Windows [2] protejat. {{Versiune pachet: [3], Versiune protejată SO: [4], Eroare SFP: [5]}}</String>
541 <String Id="Error1933" Overridable="yes">Serviciul Windows Installer nu poate actualiza unul sau mai multe fişiere Windows protejate. {{Eroare SFP: [2]. Lista fişierelor protejate:\r\n[3]}}</String>
542 <String Id="Error1934" Overridable="yes">Instalările efectuate de utilizatori sunt dezactivate prin politica de pe acest computer.</String>
543 <String Id="Error1935" Overridable="yes">Eroare la instalarea asamblării „[6]”. Pentru mai multe informaţii, consultaţi Ajutor şi asistenţă. HRESULT: [3]. {{interfaţă asamblare: [4], funcţie: [5], componentă: [2]}}</String>
544 <String Id="Error1936" Overridable="yes">Eroare la instalarea asamblării „[6]”. Asamblarea nu este denumită corespunzător sau nu este semnată cu lungimea de cheie minimă. HRESULT: [3]. {{interfaţă asamblare: [4], funcţie: [5], componentă: [2]}}</String>
545 <String Id="Error1937" Overridable="yes">Eroare la instalarea asamblării „[6]”. Semnătura sau catalogul sunt imposibil de verificat sau nu sunt valide. HRESULT: [3]. {{interfaţă asamblare: [4], funcţie: [5], componentă: [2]}}</String>
546 <String Id="Error1938" Overridable="yes">Eroare la instalarea asamblării „[6]”. Unul sau mai multe module ale asamblării nu au fost găsite. HRESULT: [3]. {{interfaţă asamblare: [4], funcţie: [5], componentă: [2]}}</String>
547
548 <String Id="UITextbytes" Overridable="yes">octeţi</String>
549 <String Id="UITextGB" Overridable="yes">GO</String>
550 <String Id="UITextKB" Overridable="yes">KO</String>
551 <String Id="UITextMB" Overridable="yes">MO</String>
552 <String Id="UITextMenuAbsent" Overridable="yes">Întreaga caracteristică va fi indisponibilă</String>
553 <String Id="UITextMenuAdvertise" Overridable="yes">Caracteristica se va instala când va fi necesar</String>
554 <String Id="UITextMenuAllCD" Overridable="yes">Întreaga caracteristică se va instala pentru executare de pe CD</String>
555 <String Id="UITextMenuAllLocal" Overridable="yes">Întreaga caracteristică se va instala pe unitatea de disc locală</String>
556 <String Id="UITextMenuAllNetwork" Overridable="yes">Întreaga caracteristică se va instala pentru executare din reţea</String>
557 <String Id="UITextMenuCD" Overridable="yes">Se va instala pentru executare de pe CD</String>
558 <String Id="UITextMenuLocal" Overridable="yes">Se va instala pe unitatea de disc locală</String>
559 <String Id="UITextMenuNetwork" Overridable="yes">Se va instala pentru executare din reţea</String>
560 <String Id="UITextNewFolder" Overridable="yes">Folder|Folder nou</String>
561 <String Id="UITextScriptInProgress" Overridable="yes">Se colectează informaţiile necesare...</String>
562 <String Id="UITextSelAbsentAbsent" Overridable="yes">Această caracteristică va rămâne neinstalată</String>
563 <String Id="UITextSelAbsentAdvertise" Overridable="yes">Această caracteristică se va seta pentru a fi instalată când va fi necesar</String>
564 <String Id="UITextSelAbsentCD" Overridable="yes">Această caracteristică se va instala pentru executare de pe CD</String>
565 <String Id="UITextSelAbsentLocal" Overridable="yes">Această caracteristică se va instala pe unitatea de disc locală</String>
566 <String Id="UITextSelAbsentNetwork" Overridable="yes">Această caracteristică se va instala pentru executare din reţea</String>
567 <String Id="UITextSelAdvertiseAbsent" Overridable="yes">Această caracteristică va deveni indisponibilă</String>
568 <String Id="UITextSelAdvertiseAdvertise" Overridable="yes">Se va instala când va fi necesar</String>
569 <String Id="UITextSelAdvertiseCD" Overridable="yes">Această caracteristică va fi disponibilă pentru executare de pe CD</String>
570 <String Id="UITextSelAdvertiseLocal" Overridable="yes">Această caracteristică se va instala pe unitatea de disc locală</String>
571 <String Id="UITextSelAdvertiseNetwork" Overridable="yes">Această caracteristică va fi disponibilă pentru executare din reţea</String>
572 <String Id="UITextSelCDAbsent" Overridable="yes">Această caracteristică se va dezinstala complet, va fi imposibil de executat de pe CD</String>
573 <String Id="UITextSelCDAdvertise" Overridable="yes">Această caracteristică se va modifica de la starea de executare de pe CD la instalare când va fi necesar</String>
574 <String Id="UITextSelCDCD" Overridable="yes">Această caracteristică va rămâne executabilă de pe CD</String>
575 <String Id="UITextSelCDLocal" Overridable="yes">Această caracteristică se va modifica de la starea de executare de pe CD la instalare pe unitatea de disc locală</String>
576 <String Id="UITextSelChildCostNeg" Overridable="yes">Această caracteristică eliberează [1] pe unitatea de disc.</String>
577 <String Id="UITextSelChildCostPos" Overridable="yes">Această caracteristică necesită [1] pe unitatea de disc.</String>
578 <String Id="UITextSelCostPending" Overridable="yes">Se calculează costul acestei caracteristici...</String>
579 <String Id="UITextSelLocalAbsent" Overridable="yes">Această caracteristică va fi eliminată complet</String>
580 <String Id="UITextSelLocalAdvertise" Overridable="yes">Această caracteristică va fi eliminată de pe unitatea de disc locală, dar va fi setată să se instaleze când este necesar</String>
581 <String Id="UITextSelLocalCD" Overridable="yes">Această caracteristică se va elimina de pe unitatea de disc locală, dar va fi disponibilă pentru executare de pe CD</String>
582 <String Id="UITextSelLocalLocal" Overridable="yes">Această caracteristică va rămâne pe unitatea de disc locală</String>
583 <String Id="UITextSelLocalNetwork" Overridable="yes">Această caracteristică se va elimina de pe unitatea de disc locală, dar va fi disponibilă pentru executare din reţea</String>
584 <String Id="UITextSelNetworkAbsent" Overridable="yes">Această caracteristică se va dezinstala complet, va fi imposibil de executat din reţea</String>
585 <String Id="UITextSelNetworkAdvertise" Overridable="yes">Această caracteristică se va modifica de la starea de executare din reţea la instalare când va fi necesar</String>
586 <String Id="UITextSelNetworkLocal" Overridable="yes">Această caracteristică se va modifica de la starea de executare din reţea la instalare pe unitatea de disc locală</String>
587 <String Id="UITextSelNetworkNetwork" Overridable="yes">Această caracteristică va rămâne executabilă din reţea</String>
588 <String Id="UITextSelParentCostNegNeg" Overridable="yes">Această caracteristică eliberează [1] pe unitatea de disc. [2] din [3] caracteristici secundare sunt selectate. Caracteristicile secundare eliberează [4] pe unitatea de disc.</String>
589 <String Id="UITextSelParentCostNegPos" Overridable="yes">Această caracteristică eliberează [1] pe unitatea de disc. [2] din [3] caracteristici secundare sunt selectate. Caracteristicile secundare necesită [4] pe unitatea de disc.</String>
590 <String Id="UITextSelParentCostPosNeg" Overridable="yes">Această caracteristică necesită [1] pe unitatea de disc. [2] din [3] caracteristici secundare sunt selectate. Caracteristicile secundare eliberează [4] pe unitatea de disc.</String>
591 <String Id="UITextSelParentCostPosPos" Overridable="yes">Această caracteristică necesită [1] pe unitatea de disc. [2] din [3] caracteristici secundare sunt selectate. Caracteristicile secundare necesită [4] pe unitatea de disc.</String>
592 <String Id="UITextTimeRemaining" Overridable="yes">Timp rămas: {[1] minute }{[2] secunde}</String>
593 <String Id="UITextVolumeCostAvailable" Overridable="yes">Disponibil</String>
594 <String Id="UITextVolumeCostDifference" Overridable="yes">Diferenţă</String>
595 <String Id="UITextVolumeCostRequired" Overridable="yes">Necesar</String>
596 <String Id="UITextVolumeCostSize" Overridable="yes">Dimensiune disc</String>
597 <String Id="UITextVolumeCostVolume" Overridable="yes">Volum</String>
598</WixLocalization>
diff --git a/src/ext/UI/wixlib/WixUI_ru-ru.wxl b/src/ext/UI/wixlib/WixUI_ru-ru.wxl
new file mode 100644
index 00000000..c2d9dbd4
--- /dev/null
+++ b/src/ext/UI/wixlib/WixUI_ru-ru.wxl
@@ -0,0 +1,602 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3
4
5<WixLocalization Culture="ru-ru" Codepage="1251" xmlns="http://wixtoolset.org/schemas/v4/wxl">
6 <UI Dialog="AdvancedWelcomeEulaDlg" Control="Print" X="50" />
7 <UI Dialog="AdvancedWelcomeEulaDlg" Control="Advanced" X="124" Width="85" />
8 <UI Dialog="InstallDirDlg" Control="Description" Y="20" Height="30" />
9
10 <String Id="WixUIBack" Overridable="yes">&amp;Назад</String>
11 <String Id="WixUINext" Overridable="yes">Д&amp;алее</String>
12 <String Id="WixUICancel" Overridable="yes">Отмена</String>
13 <String Id="WixUIFinish" Overridable="yes">&amp;Готово</String>
14 <String Id="WixUIRetry" Overridable="yes">П&amp;овторить</String>
15 <String Id="WixUIIgnore" Overridable="yes">&amp;Пропустить</String>
16 <String Id="WixUIYes" Overridable="yes">&amp;Да</String>
17 <String Id="WixUINo" Overridable="yes">&amp;Нет</String>
18 <String Id="WixUIOK" Overridable="yes">ОК</String>
19 <String Id="WixUIPrint" Overridable="yes">&amp;Печать</String>
20
21 <String Id="AdvancedWelcomeEulaDlg_Title" Overridable="yes">Установка [ProductName]</String>
22 <String Id="AdvancedWelcomeEulaDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
23 <String Id="AdvancedWelcomeEulaDlgTitle" Overridable="yes">{\WixUI_Font_Title}Прочитайте лицензионное соглашение на использование [ProductName]</String>
24 <String Id="AdvancedWelcomeEulaDlgLicenseAcceptedCheckBox" Overridable="yes">&amp;Я принимаю условия лицензионного соглашения</String>
25 <String Id="AdvancedWelcomeEulaDlgDescriptionPerMachine" Overridable="yes">Нажмите кнопку "Установить", чтобы установить продукт с параметрами по умолчанию для всех пользователей. Нажмите кнопку "Дополнительно", чтобы изменить параметры установки.</String>
26 <String Id="AdvancedWelcomeEulaDlgDescriptionPerUser" Overridable="yes">Нажмите кнопку "Установить", чтобы установить продукт с параметрами по умолчанию для текущего пользователя. Нажмите кнопку "Дополнительно", чтобы изменить параметры установки.</String>
27 <String Id="AdvancedWelcomeEulaDlgInstall" Overridable="yes">&amp;Установить</String>
28 <String Id="AdvancedWelcomeEulaDlgAdvanced" Overridable="yes">Д&amp;ополнительно</String>
29 <String Id="Advanced_Font_Normal_Size" Overridable="yes">8</String>
30 <String Id="Advanced_Font_Bigger_Size" Overridable="yes">12</String>
31 <String Id="Advanced_Font_Title_Size" Overridable="yes">9</String>
32 <String Id="Advanced_Font_Emphasized_Size" Overridable="yes">8</String>
33 <String Id="Advanced_Font_FaceName" Overridable="yes">Tahoma</String>
34
35 <String Id="BrowseDlg_Title" Overridable="yes">Установка [ProductName]</String>
36 <String Id="BrowseDlgComboLabel" Overridable="yes">&amp;Искать в:</String>
37 <String Id="BrowseDlgWixUI_Bmp_Up" Overridable="yes">WixUI_Bmp_Up</String>
38 <String Id="BrowseDlgWixUI_Bmp_UpTooltip" Overridable="yes">Переход на уровень вверх</String>
39 <String Id="BrowseDlgNewFolder" Overridable="yes">WixUI_Bmp_New</String>
40 <String Id="BrowseDlgNewFolderTooltip" Overridable="yes">Создание новой папки</String>
41 <String Id="BrowseDlgPathLabel" Overridable="yes">&amp;Имя папки:</String>
42 <String Id="BrowseDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
43 <String Id="BrowseDlgDescription" Overridable="yes">Перейдите в конечную папку</String>
44 <String Id="BrowseDlgTitle" Overridable="yes">{\WixUI_Font_Title}Изменить конечную папку</String>
45
46 <String Id="CancelDlg_Title" Overridable="yes">Установка [ProductName]</String>
47 <String Id="CancelDlgText" Overridable="yes">Действительно отменить установку [ProductName]?</String>
48 <String Id="CancelDlgIcon" Overridable="yes">WixUI_Ico_Info</String>
49 <String Id="CancelDlgIconTooltip" Overridable="yes">Значок информации</String>
50
51 <String Id="CustomizeDlg_Title" Overridable="yes">Установка [ProductName]</String>
52 <String Id="CustomizeDlgTree" Overridable="yes">Дерево выбора</String>
53 <String Id="CustomizeDlgBrowse" Overridable="yes">Об&amp;зор...</String>
54 <String Id="CustomizeDlgReset" Overridable="yes">С&amp;брос</String>
55 <String Id="CustomizeDlgDiskCost" Overridable="yes">Использование д&amp;иска</String>
56 <String Id="CustomizeDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
57 <String Id="CustomizeDlgText" Overridable="yes">Для изменения параметров установки какого-либо компонента щелкните соответствующий значок в расположенном ниже дереве.</String>
58 <String Id="CustomizeDlgDescription" Overridable="yes">Укажите конфигурацию установки компонентов.</String>
59 <String Id="CustomizeDlgTitle" Overridable="yes">{\WixUI_Font_Title}Выборочная установка</String>
60 <String Id="CustomizeDlgItemDescription" Overridable="yes">CustomizeDlgItemDescription-CustomizeDlgItemDescription</String>
61 <String Id="CustomizeDlgItemSize" Overridable="yes">CustomizeDlgItemSize-CustomizeDlgItemSize</String>
62 <String Id="CustomizeDlgLocation" Overridable="yes">CustomizeDlgLocation-CustomizeDlgLocation</String>
63 <String Id="CustomizeDlgLocationLabel" Overridable="yes">Местоположение:</String>
64
65 <String Id="DiskCostDlg_Title" Overridable="yes">Установка [ProductName]</String>
66 <String Id="DiskCostDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
67 <String Id="DiskCostDlgText" Overridable="yes">На выделенных томах недостаточно свободного места для выбранных компонентов. Удалите несколько файлов с выделенных томов, установите меньшее количество компонентов либо выберите другие конечные диски.</String>
68 <String Id="DiskCostDlgDescription" Overridable="yes">Необходимое дисковое пространство для установки выбранных компонентов.</String>
69 <String Id="DiskCostDlgTitle" Overridable="yes">{\WixUI_Font_Title}Требования к свободному месту на диске</String>
70 <String Id="DiskCostDlgVolumeList" Overridable="yes">{120}{70}{70}{70}{70}</String>
71
72 <String Id="ErrorDlg_Title" Overridable="yes">Установка [ProductName]</String>
73 <String Id="ErrorDlgErrorText" Overridable="yes">Текстовая информация</String>
74 <String Id="ErrorDlgErrorIcon" Overridable="yes">WixUI_Ico_Info</String>
75 <String Id="ErrorDlgErrorIconTooltip" Overridable="yes">Значок информации</String>
76
77 <String Id="ExitDialog_Title" Overridable="yes">Установка [ProductName]</String>
78 <String Id="ExitDialogBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
79 <String Id="ExitDialogDescription" Overridable="yes">Нажмите кнопку "Готово", чтобы выйти из мастера установки.</String>
80 <String Id="ExitDialogTitle" Overridable="yes">{\WixUI_Font_Bigger}Установка [ProductName] завершена</String>
81
82 <String Id="FatalError_Title" Overridable="yes">Установка [ProductName]</String>
83 <String Id="FatalErrorBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
84 <String Id="FatalErrorTitle" Overridable="yes">{\WixUI_Font_Bigger}Работа мастера установки [ProductName] преждевременно завершена</String>
85 <String Id="FatalErrorDescription1" Overridable="yes">Работа мастера установки [ProductName] преждевременно завершена из-за ошибки. Система не была изменена. Чтобы установить эту программу позднее, запустите мастер установки еще раз.</String>
86 <String Id="FatalErrorDescription2" Overridable="yes">Для выхода из мастера установки нажмите кнопку "Готово".</String>
87
88 <String Id="FeaturesDlg_Title" Overridable="yes">Установка [ProductName]</String>
89 <String Id="FeaturesDlgTree" Overridable="yes">Компоненты продукта</String>
90 <String Id="FeaturesDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
91 <String Id="FeaturesDlgDescription" Overridable="yes">Укажите конфигурацию установки компонентов.</String>
92 <String Id="FeaturesDlgTitle" Overridable="yes">{\WixUI_Font_Title}Компоненты продукта</String>
93 <String Id="FeaturesDlgItemDescription" Overridable="yes">FeaturesDlgItemDescription</String>
94 <String Id="FeaturesDlgItemSize" Overridable="yes">FeaturesDlgItemSize</String>
95 <String Id="FeaturesDlgInstall" Overridable="yes">&amp;Установить</String>
96 <String Id="FeaturesDlgChange" Overridable="yes">&amp;Изменить</String>
97
98 <String Id="FilesInUse_Title" Overridable="yes">Установка [ProductName]</String>
99 <String Id="FilesInUseExit" Overridable="yes">В&amp;ыход</String>
100 <String Id="FilesInUseBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
101 <String Id="FilesInUseText" Overridable="yes">Следующие приложения используют файлы, нуждающиеся в обновлении. Закройте эти приложения, а затем нажмите кнопку "&amp;Повторить" для продолжения установки или "Выход" для ее завершения.</String>
102 <String Id="FilesInUseDescription" Overridable="yes">Некоторые файлы, которые должны быть обновлены, в данный момент используются.</String>
103 <String Id="FilesInUseTitle" Overridable="yes">{\WixUI_Font_Title}Используемые файлы</String>
104
105 <String Id="InstallDirDlg_Title" Overridable="yes">Установка [ProductName]</String>
106 <String Id="InstallDirDlgChange" Overridable="yes">&amp;Изменить...</String>
107 <String Id="InstallDirDlgTitle" Overridable="yes">{\WixUI_Font_Title}Конечная папка</String>
108 <String Id="InstallDirDlgDescription" Overridable="yes">Нажмите кнопку "Далее", чтобы выполнить установку в папке по умолчанию, или кнопку "Изменить", чтобы выбрать другую папку.</String>
109 <String Id="InstallDirDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
110 <String Id="InstallDirDlgFolderLabel" Overridable="yes">Установить [ProductName] в:</String>
111
112 <String Id="InstallScopeDlg_Title" Overridable="yes">Установка [ProductName]</String>
113 <String Id="InstallScopeDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
114 <String Id="InstallScopeDlgDescription" Overridable="yes">Выберите область и папку для установки</String>
115 <String Id="InstallScopeDlgTitle" Overridable="yes">{\WixUI_Font_Title}Область установки</String>
116 <String Id="InstallScopeDlgPerUser" Overridable="yes">{\WixUI_Font_Emphasized}Установка для &amp;текущего пользователя ([LogonUser])</String>
117 <String Id="InstallScopeDlgPerUserDescription" Overridable="yes">Продукт [ProductName] будет установлен в папке пользователя и доступен только для текущего пользователя. Привилегии локального администратора не требуются.</String>
118 <String Id="InstallScopeDlgNoPerUserDescription" Overridable="yes">[ProductName] не поддерживает установку для отдельных пользователей.</String>
119 <String Id="InstallScopeDlgPerMachine" Overridable="yes">{\WixUI_Font_Emphasized}Установка для всех пользователей &amp;компьютера</String>
120 <String Id="InstallScopeDlgPerMachineDescription" Overridable="yes">Продукт [ProductName] будет установлен в папке, используемой на компьютере по умолчанию, и доступен для всех пользователей. Папку установки по умолчанию можно изменить. Необходимы привилегии локального администратора.</String>
121 <String Id="InstallScopeDlgFolderLabel" Overridable="yes">Папка у&amp;становки:</String>
122 <String Id="InstallScopeDlgChange" Overridable="yes">&amp;Изменить...</String>
123
124 <String Id="InvalidDirDlg_Title" Overridable="yes">Установка [ProductName]</String>
125 <String Id="InvalidDirDlgText" Overridable="yes">Каталог установки должен находиться на локальном жестком диске.</String>
126 <String Id="InvalidDirDlgIcon" Overridable="yes">WixUI_Ico_Info</String>
127 <String Id="InvalidDirDlgIconTooltip" Overridable="yes">Значок информации</String>
128
129 <String Id="LicenseAgreementDlg_Title" Overridable="yes">Установка [ProductName]</String>
130 <String Id="LicenseAgreementDlgLicenseAcceptedCheckBox" Overridable="yes">&amp;Я принимаю условия лицензионного соглашения</String>
131 <String Id="LicenseAgreementDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
132 <String Id="LicenseAgreementDlgDescription" Overridable="yes">Внимательно прочитайте следующее лицензионное соглашение</String>
133 <String Id="LicenseAgreementDlgTitle" Overridable="yes">{\WixUI_Font_Title}Лицензионное соглашение</String>
134
135 <String Id="MaintenanceTypeDlg_Title" Overridable="yes">Установка [ProductName]</String>
136 <String Id="MaintenanceTypeDlgChangeButton" Overridable="yes">&amp;Изменить</String>
137 <String Id="MaintenanceTypeDlgChangeButtonTooltip" Overridable="yes">Изменение установки</String>
138 <String Id="MaintenanceTypeDlgRepairButton" Overridable="yes">&amp;Восстановить</String>
139 <String Id="MaintenanceTypeDlgRepairButtonTooltip" Overridable="yes">Восстановление установки</String>
140 <String Id="MaintenanceTypeDlgRemoveButton" Overridable="yes">&amp;Удалить</String>
141 <String Id="MaintenanceTypeDlgRemoveButtonTooltip" Overridable="yes">Удаление установки</String>
142 <String Id="MaintenanceTypeDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
143 <String Id="MaintenanceTypeDlgDescription" Overridable="yes">Выберите операцию, которую следует выполнить.</String>
144 <String Id="MaintenanceTypeDlgTitle" Overridable="yes">{\WixUI_Font_Title}Изменение, восстановление или удаление установки</String>
145 <String Id="MaintenanceTypeDlgChangeText" Overridable="yes">Позволяет изменить параметры установки компонентов.</String>
146 <String Id="MaintenanceTypeDlgChangeDisabledText" Overridable="yes">У [ProductName] нет независимо выбираемых компонентов.</String>
147 <String Id="MaintenanceTypeDlgRemoveText" Overridable="yes">Удаление [ProductName] с компьютера.</String>
148 <String Id="MaintenanceTypeDlgRemoveDisabledText" Overridable="yes">Невозможно удалить [ProductName].</String>
149 <String Id="MaintenanceTypeDlgRepairText" Overridable="yes">Исправление ошибок в последней установке путем восстановления отсутствующих и поврежденных файлов, ярлыков и записей реестра.</String>
150 <String Id="MaintenanceTypeDlgRepairDisabledText" Overridable="yes">Невозможно восстановить [ProductName].</String>
151
152 <String Id="MaintenanceWelcomeDlg_Title" Overridable="yes">Установка [ProductName]</String>
153 <String Id="MaintenanceWelcomeDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
154 <String Id="MaintenanceWelcomeDlgDescription" Overridable="yes">Мастер установки позволяет изменить способ установки или удаления компонентов [ProductName] на компьютере. Нажмите кнопку "Далее", чтобы продолжить, или кнопку "Отмена", чтобы выйти из мастера установки.</String>
155 <String Id="MaintenanceWelcomeDlgTitle" Overridable="yes">{\WixUI_Font_Bigger}Вас приветствует мастер установки [ProductName]</String>
156
157 <String Id="MsiRMFilesInUse_Title" Overridable="yes">Установка [ProductName]</String>
158 <String Id="MsiRMFilesInUseBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
159 <String Id="MsiRMFilesInUseText" Overridable="yes">Следующие приложения используют файлы, нуждающиеся в обновлении. Мастер установки может закрыть их и попробовать перезапустить их; также можно перезагрузить компьютер позднее.</String>
160 <String Id="MsiRMFilesInUseDescription" Overridable="yes">Некоторые файлы, которые должны быть обновлены, в данный момент используются.</String>
161 <String Id="MsiRMFilesInUseTitle" Overridable="yes">{\WixUI_Font_Title}Используемые файлы</String>
162 <String Id="MsiRMFilesInUseUseRM" Overridable="yes">&amp;Закрыть приложения и попытаться перезапустить их.</String>
163 <String Id="MsiRMFilesInUseDontUseRM" Overridable="yes">&amp;Не закрывать приложения. Потребуется перезагрузка.</String>
164
165 <String Id="OutOfDiskDlg_Title" Overridable="yes">Установка [ProductName]</String>
166 <String Id="OutOfDiskDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
167 <String Id="OutOfDiskDlgText" Overridable="yes">На выделенных томах недостаточно свободного места для выбранных сейчас компонентов. Удалите несколько файлов с выделенных томов, установите меньшее количество компонентов либо выберите другой конечный диск.</String>
168 <String Id="OutOfDiskDlgDescription" Overridable="yes">На диске недостаточно места для установки.</String>
169 <String Id="OutOfDiskDlgTitle" Overridable="yes">{\WixUI_Font_Title}Недостаточно места на диске</String>
170 <String Id="OutOfDiskDlgVolumeList" Overridable="yes">{120}{70}{70}{70}{70}</String>
171
172 <String Id="OutOfRbDiskDlg_Title" Overridable="yes">Установка [ProductName]</String>
173 <String Id="OutOfRbDiskDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
174 <String Id="OutOfRbDiskDlgText" Overridable="yes">На выделенных томах недостаточно свободного места для установки выбранных компонентов. Можно удалить некоторые файлы с выделенных томов, установить меньшее количество компонентов или выбрать другой диск для установки.</String>
175 <String Id="OutOfRbDiskDlgDescription" Overridable="yes">На диске недостаточно места для установки.</String>
176 <String Id="OutOfRbDiskDlgTitle" Overridable="yes">{\WixUI_Font_Title}Недостаточно места на диске</String>
177 <String Id="OutOfRbDiskDlgVolumeList" Overridable="yes">{120}{70}{70}{70}{70}</String>
178 <String Id="OutOfRbDiskDlgText2" Overridable="yes">Также можно отключить возможность отмены установки. Отключение возможности отмены установки не позволит установщику восстановить исходное состояние компьютера в случае сбоя или прерывания установки. Для отключения возможности отмены установки нажмите кнопку "Да".</String>
179
180 <String Id="PrepareDlg_Title" Overridable="yes">Установка [ProductName]</String>
181 <String Id="PrepareDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
182 <String Id="PrepareDlgDescription" Overridable="yes">Подождите, пока мастер выполняет подготовку к установке.</String>
183 <String Id="PrepareDlgTitle" Overridable="yes">{\WixUI_Font_Bigger}Вас приветствует мастер установки [ProductName]</String>
184
185 <String Id="ProgressDlg_Title" Overridable="yes">Установка [ProductName]</String>
186 <String Id="ProgressDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
187 <String Id="ProgressDlgTextInstalling" Overridable="yes">Подождите, пока мастер установки устанавливает [ProductName].</String>
188 <String Id="ProgressDlgTitleInstalling" Overridable="yes">{\WixUI_Font_Title}Установка [ProductName]</String>
189 <String Id="ProgressDlgTextChanging" Overridable="yes">Подождите, пока мастер установки изменяет [ProductName].</String>
190 <String Id="ProgressDlgTitleChanging" Overridable="yes">{\WixUI_Font_Title}Изменение [ProductName]</String>
191 <String Id="ProgressDlgTextRepairing" Overridable="yes">Подождите, пока мастер установки восстанавливает [ProductName].</String>
192 <String Id="ProgressDlgTitleRepairing" Overridable="yes">{\WixUI_Font_Title}Восстановление [ProductName]</String>
193 <String Id="ProgressDlgTextRemoving" Overridable="yes">Подождите, пока мастер установки удаляет [ProductName].</String>
194 <String Id="ProgressDlgTitleRemoving" Overridable="yes">{\WixUI_Font_Title}Удаление [ProductName]</String>
195 <String Id="ProgressDlgTextUpdating" Overridable="yes">Подождите, пока мастер установки обновляет [ProductName].</String>
196 <String Id="ProgressDlgTitleUpdating" Overridable="yes">{\WixUI_Font_Title}Идет обновление [ProductName]</String>
197 <String Id="ProgressDlgProgressBar" Overridable="yes">Выполнено</String>
198 <String Id="ProgressDlgStatusLabel" Overridable="yes">Состояние:</String>
199
200 <String Id="ResumeDlg_Title" Overridable="yes">Установка [ProductName]</String>
201 <String Id="ResumeDlgInstall" Overridable="yes">&amp;Установить</String>
202 <String Id="ResumeDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
203 <String Id="ResumeDlgDescription" Overridable="yes">Мастер установки завершит установку [ProductName] на компьютер. Нажмите кнопку "Установить", чтобы продолжить, или кнопку "Отмена", чтобы выйти из мастера установки.</String>
204 <String Id="ResumeDlgTitle" Overridable="yes">{\WixUI_Font_Bigger}Продолжение работы мастера установки [ProductName]</String>
205
206 <String Id="SetupTypeDlg_Title" Overridable="yes">Установка [ProductName]</String>
207 <String Id="SetupTypeDlgTypicalButton" Overridable="yes">&amp;Обычная</String>
208 <String Id="SetupTypeDlgTypicalButtonTooltip" Overridable="yes">Обычная установка</String>
209 <String Id="SetupTypeDlgCustomButton" Overridable="yes">В&amp;ыборочная</String>
210 <String Id="SetupTypeDlgCustomButtonTooltip" Overridable="yes">Выборочная установка</String>
211 <String Id="SetupTypeDlgCompleteButton" Overridable="yes">По&amp;лная</String>
212 <String Id="SetupTypeDlgCompleteButtonTooltip" Overridable="yes">Полная установка</String>
213 <String Id="SetupTypeDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
214 <String Id="SetupTypeDlgTitle" Overridable="yes">{\WixUI_Font_Title}Выберите тип установки</String>
215 <String Id="SetupTypeDlgDescription" Overridable="yes">Укажите наиболее подходящий тип установки</String>
216 <String Id="SetupTypeDlgTypicalText" Overridable="yes">Устанавливает самые распространенные компоненты программ. Рекомендуется для большинства пользователей.</String>
217 <String Id="SetupTypeDlgCustomText" Overridable="yes">Позволяет выбирать для установки отдельные компоненты и задавать их местонахождение. Рекомендуется для опытных пользователей.</String>
218 <String Id="SetupTypeDlgCompleteText" Overridable="yes">Устанавливает все компоненты программы. Этот вариант требует больше всего места на диске.</String>
219
220 <String Id="UserExit_Title" Overridable="yes">Установка [ProductName]</String>
221 <String Id="UserExitBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
222 <String Id="UserExitTitle" Overridable="yes">{\WixUI_Font_Bigger}Работа мастера установки [ProductName] была прервана</String>
223 <String Id="UserExitDescription1" Overridable="yes">Установка [ProductName] была прервана. Система не была изменена. Чтобы установить эту программу позднее, запустите программу установки еще раз.</String>
224 <String Id="UserExitDescription2" Overridable="yes">Для выхода из мастера установки нажмите кнопку "Готово".</String>
225
226 <String Id="VerifyReadyDlg_Title" Overridable="yes">Установка [ProductName]</String>
227 <String Id="VerifyReadyDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
228 <String Id="VerifyReadyDlgInstall" Overridable="yes">&amp;Установить</String>
229 <String Id="VerifyReadyDlgInstallText" Overridable="yes">Нажмите кнопку "Установить", чтобы начать установку. Нажмите кнопку "Назад", чтобы проверить или изменить параметры установки. Нажмите кнопку "Отмена", чтобы выйти из мастера.</String>
230 <String Id="VerifyReadyDlgInstallTitle" Overridable="yes">{\WixUI_Font_Title}Все готово к установке [ProductName]</String>
231 <String Id="VerifyReadyDlgChange" Overridable="yes">&amp;Изменить</String>
232 <String Id="VerifyReadyDlgChangeText" Overridable="yes">Нажмите кнопку "Изменить", чтобы начать установку. Нажмите кнопку "Назад", чтобы проверить или изменить параметры установки. Нажмите кнопку "Отмена", чтобы выйти из мастера.</String>
233 <String Id="VerifyReadyDlgChangeTitle" Overridable="yes">{\WixUI_Font_Title}Все готово к изменению [ProductName]</String>
234 <String Id="VerifyReadyDlgRepair" Overridable="yes">&amp;Восстановить</String>
235 <String Id="VerifyReadyDlgRepairText" Overridable="yes">Нажмите кнопку "Восстановить", чтобы восстановить установку [ProductName]. Нажмите кнопку "Назад", чтобы проверить или изменить параметры установки. Нажмите кнопку "Отмена", чтобы выйти из мастера.</String>
236 <String Id="VerifyReadyDlgRepairTitle" Overridable="yes">{\WixUI_Font_Title}Все готово к восстановлению [ProductName]</String>
237 <String Id="VerifyReadyDlgRemove" Overridable="yes">&amp;Удалить</String>
238 <String Id="VerifyReadyDlgRemoveText" Overridable="yes">Нажмите кнопку "Удалить", чтобы удалить [ProductName] с компьютера. Нажмите кнопку "Назад", чтобы проверить или изменить параметры установки. Нажмите кнопку "Отмена", чтобы выйти из мастера.</String>
239 <String Id="VerifyReadyDlgRemoveTitle" Overridable="yes">{\WixUI_Font_Title}Все готово к удалению [ProductName]</String>
240 <String Id="VerifyReadyDlgUpdate" Overridable="yes">&amp;Обновить</String>
241 <String Id="VerifyReadyDlgUpdateText" Overridable="yes">Нажмите кнопку "Обновить", чтобы обновить [ProductName] на компьютере. Нажмите кнопку "Назад", чтобы проверить или изменить параметры установки. Нажмите кнопку "Отмена", чтобы выйти из мастера.</String>
242 <String Id="VerifyReadyDlgUpdateTitle" Overridable="yes">{\WixUI_Font_Title}Все готово к обновлению [ProductName]</String>
243
244 <String Id="WaitForCostingDlg_Title" Overridable="yes">Установка [ProductName]</String>
245 <String Id="WaitForCostingDlgReturn" Overridable="yes">&amp;Возврат</String>
246 <String Id="WaitForCostingDlgText" Overridable="yes">Подождите, пока установщик определяет требования к свободному месту на диске.</String>
247 <String Id="WaitForCostingDlgIcon" Overridable="yes">WixUI_Ico_Exclam</String>
248 <String Id="WaitForCostingDlgIconTooltip" Overridable="yes">Восклицательный знак</String>
249
250 <String Id="WelcomeDlg_Title" Overridable="yes">Установка [ProductName]</String>
251 <String Id="WelcomeDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
252 <String Id="WelcomeDlgDescription" Overridable="yes">Мастер установки установит [ProductName] на компьютере. Нажмите кнопку "Далее", чтобы продолжить, или кнопку "Отмена", чтобы выйти из мастера установки.</String>
253 <String Id="WelcomeUpdateDlgDescriptionUpdate" Overridable="yes">Мастер установки обновит [ProductName] на компьютере. Нажмите кнопку "Далее", чтобы продолжить, или кнопку "Отмена", чтобы выйти из мастера установки.</String>
254 <String Id="WelcomeDlgTitle" Overridable="yes">{\WixUI_Font_Bigger}Вас приветствует мастер установки [ProductName]</String>
255
256 <String Id="WelcomeEulaDlg_Title" Overridable="yes">Установка [ProductName]</String>
257 <String Id="WelcomeEulaDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
258 <String Id="WelcomeEulaDlgLicenseAcceptedCheckBox" Overridable="yes">&amp;Я принимаю условия лицензионного соглашения</String>
259 <String Id="WelcomeEulaDlgInstall" Overridable="yes">&amp;Установить</String>
260 <String Id="WelcomeEulaDlgUpdate" Overridable="yes">&amp;Обновить</String>
261 <String Id="WelcomeEulaDlgTitle" Overridable="yes">{\WixUI_Font_Title}Прочитайте лицензионное соглашение на использование [ProductName]</String>
262
263 <String Id="ProgressTextInstallValidate" Overridable="yes">Проверка установки</String>
264 <String Id="ProgressTextInstallFiles" Overridable="yes">Копирование новых файлов</String>
265 <String Id="ProgressTextInstallFilesTemplate" Overridable="yes">Файл: [1], папка: [9], размер: [6]</String>
266 <String Id="ProgressTextInstallAdminPackage" Overridable="yes">Копирование сетевых файлов установки</String>
267 <String Id="ProgressTextInstallAdminPackageTemplate" Overridable="yes">Файл: [1], папка: [9], размер: [6]</String>
268 <String Id="ProgressTextFileCost" Overridable="yes">Вычисление требуемого места</String>
269 <String Id="ProgressTextCostInitialize" Overridable="yes">Вычисление требуемого места</String>
270 <String Id="ProgressTextCostFinalize" Overridable="yes">Вычисление требуемого места</String>
271 <String Id="ProgressTextCreateShortcuts" Overridable="yes">Создание ярлыков</String>
272 <String Id="ProgressTextCreateShortcutsTemplate" Overridable="yes">Ярлык: [1]</String>
273 <String Id="ProgressTextPublishComponents" Overridable="yes">Публикация подходящих компонентов</String>
274 <String Id="ProgressTextPublishComponentsTemplate" Overridable="yes">Код компонента: [1], квалификатор: [2]</String>
275 <String Id="ProgressTextPublishFeatures" Overridable="yes">Публикация компонентов продукта</String>
276 <String Id="ProgressTextPublishFeaturesTemplate" Overridable="yes">Компонент: [1]</String>
277 <String Id="ProgressTextPublishProduct" Overridable="yes">Публикация сведений о продукте</String>
278 <String Id="ProgressTextRegisterClassInfo" Overridable="yes">Регистрация серверов классов</String>
279 <String Id="ProgressTextRegisterClassInfoTemplate" Overridable="yes">Код класса: [1]</String>
280 <String Id="ProgressTextRegisterExtensionInfo" Overridable="yes">Регистрация расширительных серверов</String>
281 <String Id="ProgressTextRegisterExtensionInfoTemplate" Overridable="yes">Расширение: [1]</String>
282 <String Id="ProgressTextRegisterMIMEInfo" Overridable="yes">Регистрация сведений MIME</String>
283 <String Id="ProgressTextRegisterMIMEInfoTemplate" Overridable="yes">Тип содержимого MIME: [1], расширение: [2]</String>
284 <String Id="ProgressTextRegisterProgIdInfo" Overridable="yes">Регистрация программных идентификаторов</String>
285 <String Id="ProgressTextRegisterProgIdInfoTemplate" Overridable="yes">Программный идентификатор: [1]</String>
286 <String Id="ProgressTextAllocateRegistrySpace" Overridable="yes">Выделение места в реестре</String>
287 <String Id="ProgressTextAllocateRegistrySpaceTemplate" Overridable="yes">Свободное пространство: [1]</String>
288 <String Id="ProgressTextAppSearch" Overridable="yes">Поиск установленных приложений</String>
289 <String Id="ProgressTextAppSearchTemplate" Overridable="yes">Свойство: [1], подпись: [2]</String>
290 <String Id="ProgressTextBindImage" Overridable="yes">Связывание исполняемых файлов</String>
291 <String Id="ProgressTextBindImageTemplate" Overridable="yes">Файл: [1]</String>
292 <String Id="ProgressTextCCPSearch" Overridable="yes">Поиск соответствующих продуктов</String>
293 <String Id="ProgressTextCreateFolders" Overridable="yes">Создание папок</String>
294 <String Id="ProgressTextCreateFoldersTemplate" Overridable="yes">Папка: [1]</String>
295 <String Id="ProgressTextDeleteServices" Overridable="yes">Удаление служб</String>
296 <String Id="ProgressTextDeleteServicesTemplate" Overridable="yes">Служба: [1]</String>
297 <String Id="ProgressTextDuplicateFiles" Overridable="yes">Создание копий файлов</String>
298 <String Id="ProgressTextDuplicateFilesTemplate" Overridable="yes">Файл: [1], папка: [9], размер: [6]</String>
299 <String Id="ProgressTextFindRelatedProducts" Overridable="yes">Поиск связанных приложений</String>
300 <String Id="ProgressTextFindRelatedProductsTemplate" Overridable="yes">Найдено приложение: [1]</String>
301 <String Id="ProgressTextInstallODBC" Overridable="yes">Установка компонентов ODBC</String>
302 <String Id="ProgressTextInstallServices" Overridable="yes">Установка новых служб</String>
303 <String Id="ProgressTextInstallServicesTemplate" Overridable="yes">Служба: [2]</String>
304 <String Id="ProgressTextLaunchConditions" Overridable="yes">Проверка условий запуска</String>
305 <String Id="ProgressTextMigrateFeatureStates" Overridable="yes">Перенос параметров компонентов из связанных приложений</String>
306 <String Id="ProgressTextMigrateFeatureStatesTemplate" Overridable="yes">Приложение: [1]</String>
307 <String Id="ProgressTextMoveFiles" Overridable="yes">Перемещение файлов</String>
308 <String Id="ProgressTextMoveFilesTemplate" Overridable="yes">Файл: [1], папка: [9], размер: [6]</String>
309 <String Id="ProgressTextPatchFiles" Overridable="yes">Идет исправление файлов</String>
310 <String Id="ProgressTextPatchFilesTemplate" Overridable="yes">Файл: [1], папка: [2], размер: [3]</String>
311 <String Id="ProgressTextProcessComponents" Overridable="yes">Идет обновление регистрации компонентов</String>
312 <String Id="ProgressTextRegisterComPlus" Overridable="yes">Идет регистрация приложений и компонентов COM+</String>
313 <String Id="ProgressTextRegisterComPlusTemplate" Overridable="yes">Код приложения: [1]{{, тип: [2], пользователи: [3], RSN: [4]}}</String>
314 <String Id="ProgressTextRegisterFonts" Overridable="yes">Идет регистрация шрифтов</String>
315 <String Id="ProgressTextRegisterFontsTemplate" Overridable="yes">Шрифт: [1]</String>
316 <String Id="ProgressTextRegisterProduct" Overridable="yes">Идет регистрация продукта</String>
317 <String Id="ProgressTextRegisterProductTemplate" Overridable="yes">[1]</String>
318 <String Id="ProgressTextRegisterTypeLibraries" Overridable="yes">Идет регистрация библиотек типов</String>
319 <String Id="ProgressTextRegisterTypeLibrariesTemplate" Overridable="yes">Идентификатор библиотеки: [1]</String>
320 <String Id="ProgressTextRegisterUser" Overridable="yes">Идет регистрация пользователя</String>
321 <String Id="ProgressTextRegisterUserTemplate" Overridable="yes">[1]</String>
322 <String Id="ProgressTextRemoveDuplicateFiles" Overridable="yes">Идет удаление дублирующих файлов</String>
323 <String Id="ProgressTextRemoveDuplicateFilesTemplate" Overridable="yes">Файл: [1], папка: [9]</String>
324 <String Id="ProgressTextRemoveEnvironmentStrings" Overridable="yes">Обновление переменных среды</String>
325 <String Id="ProgressTextRemoveEnvironmentStringsTemplate" Overridable="yes">Имя: [1], значение: [2], действие [3]</String>
326 <String Id="ProgressTextRemoveExistingProducts" Overridable="yes">Удаление приложений</String>
327 <String Id="ProgressTextRemoveExistingProductsTemplate" Overridable="yes">Приложение: [1], командная строка: [2]</String>
328 <String Id="ProgressTextRemoveFiles" Overridable="yes">Удаление файлов</String>
329 <String Id="ProgressTextRemoveFilesTemplate" Overridable="yes">Файл: [1], папка: [9]</String>
330 <String Id="ProgressTextRemoveFolders" Overridable="yes">Удаление папок</String>
331 <String Id="ProgressTextRemoveFoldersTemplate" Overridable="yes">Папка: [1]</String>
332 <String Id="ProgressTextRemoveIniValues" Overridable="yes">Удаление записей INI-файлов</String>
333 <String Id="ProgressTextRemoveIniValuesTemplate" Overridable="yes">Файл: [1], раздел: [2], подраздел: [3], значение: [4]</String>
334 <String Id="ProgressTextRemoveODBC" Overridable="yes">Удаление компонентов ODBC</String>
335 <String Id="ProgressTextRemoveRegistryValues" Overridable="yes">Удаление значений системного реестра</String>
336 <String Id="ProgressTextRemoveRegistryValuesTemplate" Overridable="yes">Раздел: [1], имя: [2]</String>
337 <String Id="ProgressTextRemoveShortcuts" Overridable="yes">Удаление ярлыков</String>
338 <String Id="ProgressTextRemoveShortcutsTemplate" Overridable="yes">Ярлык: [1]</String>
339 <String Id="ProgressTextRMCCPSearch" Overridable="yes">Поиск соответствующих продуктов</String>
340 <String Id="ProgressTextSelfRegModules" Overridable="yes">Регистрация модулей</String>
341 <String Id="ProgressTextSelfRegModulesTemplate" Overridable="yes">Файл: [1], папка: [2]</String>
342 <String Id="ProgressTextSelfUnregModules" Overridable="yes">Отмена регистрации модулей</String>
343 <String Id="ProgressTextSelfUnregModulesTemplate" Overridable="yes">Файл: [1], папка: [2]</String>
344 <String Id="ProgressTextSetODBCFolders" Overridable="yes">Инициализация папок ODBC</String>
345 <String Id="ProgressTextStartServices" Overridable="yes">Запуск служб</String>
346 <String Id="ProgressTextStartServicesTemplate" Overridable="yes">Служба: [1]</String>
347 <String Id="ProgressTextStopServices" Overridable="yes">Остановка служб</String>
348 <String Id="ProgressTextStopServicesTemplate" Overridable="yes">Служба: [1]</String>
349 <String Id="ProgressTextUnpublishComponents" Overridable="yes">Отмена публикации подходящих компонентов</String>
350 <String Id="ProgressTextUnpublishComponentsTemplate" Overridable="yes">Код компонента: [1], квалификатор: [2]</String>
351 <String Id="ProgressTextUnpublishFeatures" Overridable="yes">Отмена публикации компонентов продукта</String>
352 <String Id="ProgressTextUnpublishFeaturesTemplate" Overridable="yes">Компонент: [1]</String>
353 <String Id="ProgressTextUnregisterClassInfo" Overridable="yes">Отмена регистрации серверов классов</String>
354 <String Id="ProgressTextUnregisterClassInfoTemplate" Overridable="yes">Код класса: [1]</String>
355 <String Id="ProgressTextUnregisterComPlus" Overridable="yes">Отмена регистрации приложений и компонентов COM+</String>
356 <String Id="ProgressTextUnregisterComPlusTemplate" Overridable="yes">Идентификатор приложения: [1]{{, тип приложения: [2]}}</String>
357 <String Id="ProgressTextUnregisterExtensionInfo" Overridable="yes">Отмена регистрации расширительных серверов</String>
358 <String Id="ProgressTextUnregisterExtensionInfoTemplate" Overridable="yes">Расширение: [1]</String>
359 <String Id="ProgressTextUnregisterFonts" Overridable="yes">Отмена регистрации шрифтов</String>
360 <String Id="ProgressTextUnregisterFontsTemplate" Overridable="yes">Шрифт: [1]</String>
361 <String Id="ProgressTextUnregisterMIMEInfo" Overridable="yes">Отмена регистрации сведений MIME</String>
362 <String Id="ProgressTextUnregisterMIMEInfoTemplate" Overridable="yes">Тип содержимого MIME: [1], расширение: [2]</String>
363 <String Id="ProgressTextUnregisterProgIdInfo" Overridable="yes">Отмена регистрации программных идентификаторов</String>
364 <String Id="ProgressTextUnregisterProgIdInfoTemplate" Overridable="yes">Программный идентификатор: [1]</String>
365 <String Id="ProgressTextUnregisterTypeLibraries" Overridable="yes">Отмена регистрации библиотек типов</String>
366 <String Id="ProgressTextUnregisterTypeLibrariesTemplate" Overridable="yes">Идентификатор библиотеки: [1]</String>
367 <String Id="ProgressTextWriteEnvironmentStrings" Overridable="yes">Обновление переменных среды</String>
368 <String Id="ProgressTextWriteEnvironmentStringsTemplate" Overridable="yes">Имя: [1], значение: [2], действие [3]</String>
369 <String Id="ProgressTextWriteIniValues" Overridable="yes">Запись значений INI-файлов</String>
370 <String Id="ProgressTextWriteIniValuesTemplate" Overridable="yes">Файл: [1], раздел: [2], подраздел: [3], значение: [4]</String>
371 <String Id="ProgressTextWriteRegistryValues" Overridable="yes">Запись значений системного реестра</String>
372 <String Id="ProgressTextWriteRegistryValuesTemplate" Overridable="yes">Раздел: [1], имя: [2], значение: [3]</String>
373 <String Id="ProgressTextAdvertise" Overridable="yes">Объявление о приложениях</String>
374 <String Id="ProgressTextGenerateScript" Overridable="yes">Создание сценария операций для действия:</String>
375 <String Id="ProgressTextGenerateScriptTemplate" Overridable="yes">[1]</String>
376 <String Id="ProgressTextInstallSFPCatalogFile" Overridable="yes">Установка системного каталога</String>
377 <String Id="ProgressTextInstallSFPCatalogFileTemplate" Overridable="yes">Файл: [1], зависимости: [2]</String>
378 <String Id="ProgressTextMsiPublishAssemblies" Overridable="yes">Публикация сведений о сборке</String>
379 <String Id="ProgressTextMsiPublishAssembliesTemplate" Overridable="yes">Контекст приложения:[1], имя сборки:[2]</String>
380 <String Id="ProgressTextMsiUnpublishAssemblies" Overridable="yes">Отмена публикации сведений о сборке</String>
381 <String Id="ProgressTextMsiUnpublishAssembliesTemplate" Overridable="yes">Контекст приложения:[1], имя сборки:[2]</String>
382 <String Id="ProgressTextRollback" Overridable="yes">Откат действия:</String>
383 <String Id="ProgressTextRollbackTemplate" Overridable="yes">[1]</String>
384 <String Id="ProgressTextRollbackCleanup" Overridable="yes">Удаление резервных файлов</String>
385 <String Id="ProgressTextRollbackCleanupTemplate" Overridable="yes">Файл: [1]</String>
386 <String Id="ProgressTextUnmoveFiles" Overridable="yes">Удаление перемещенных файлов</String>
387 <String Id="ProgressTextUnmoveFilesTemplate" Overridable="yes">Файл: [1], папка: [9]</String>
388 <String Id="ProgressTextUnpublishProduct" Overridable="yes">Отмена публикации сведений о продукте</String>
389
390 <String Id="Error0" Overridable="yes">{{Неустранимая ошибка: }}</String>
391 <String Id="Error1" Overridable="yes">{{Ошибка [1]. }}</String>
392 <String Id="Error2" Overridable="yes">Предупреждение [1]. </String>
393 <String Id="Error4" Overridable="yes">Информация [1]. </String>
394 <String Id="Error5" Overridable="yes">Произошла непредвиденная ошибка при установке этого пакета. Возможно, пакет содержит ошибки. Код ошибки: [1]. {{Аргументы: [2], [3], [4]}}</String>
395 <String Id="Error7" Overridable="yes">{{Диск заполнен: }}</String>
396 <String Id="Error8" Overridable="yes">Действие [Time]: [1]. [2]</String>
397 <String Id="Error9" Overridable="yes">[ProductName]</String>
398 <String Id="Error10" Overridable="yes">{[2]}{, [3]}{, [4]}</String>
399 <String Id="Error11" Overridable="yes">Тип сообщения: [1], аргумент: [2]</String>
400 <String Id="Error12" Overridable="yes">=== Журнал начат: [Date] [Time] ===</String>
401 <String Id="Error13" Overridable="yes">=== Журнал остановлен: [Date] [Time] ===</String>
402 <String Id="Error14" Overridable="yes">Начало действия [Time]: [1].</String>
403 <String Id="Error15" Overridable="yes">Действие закончено [Time]: [1]. Код возврата [2].</String>
404 <String Id="Error16" Overridable="yes">Осталось: {[1] мин. }{[2] сек.}</String>
405 <String Id="Error17" Overridable="yes">Недостаточно памяти. Закройте другие приложения и повторите попытку.</String>
406 <String Id="Error18" Overridable="yes">Установщик не отвечает.</String>
407 <String Id="Error19" Overridable="yes">Установщик преждевременно завершил работу.</String>
408 <String Id="Error20" Overridable="yes">Подождите, пока Windows настроит программу [ProductName]</String>
409 <String Id="Error21" Overridable="yes">Идет сбор необходимых данных...</String>
410 <String Id="Error22" Overridable="yes">Удаление старых версий этого приложения...</String>
411 <String Id="Error23" Overridable="yes">Подготовка к удалению старых версий этого приложения...</String>
412 <String Id="Error32" Overridable="yes">Установка {[ProductName]} успешно завершена.</String>
413 <String Id="Error33" Overridable="yes">Не удалось установить {[ProductName]}.</String>
414 <String Id="Error1101" Overridable="yes">Ошибка чтения файла: [2]. {{ Системная ошибка [3].}} Убедитесь, что файл существует и доступен.</String>
415 <String Id="Error1301" Overridable="yes">Невозможно создать файл "[2]". Каталог с таким именем уже существует. Отмените установку и попытайтесь выполнить установку в другой каталог.</String>
416 <String Id="Error1302" Overridable="yes">Вставьте диск: [2]</String>
417 <String Id="Error1303" Overridable="yes">У установщика недостаточно привилегий для доступа к этому каталогу: [2]. Продолжение установки невозможно. Войдите в систему как администратор или обратитесь к администратору.</String>
418 <String Id="Error1304" Overridable="yes">Ошибка при записи в файл: [2]. Убедитесь в наличии доступа к этому каталогу.</String>
419 <String Id="Error1305" Overridable="yes">Ошибка чтения файла: [2]. {{ Системная ошибка [3].}} Убедитесь, что файл существует и доступен.</String>
420 <String Id="Error1306" Overridable="yes">К файлу "[2]" в монопольном режиме обращается другое приложение. Завершите все другие приложения и нажмите кнопку "Повторить".</String>
421 <String Id="Error1307" Overridable="yes">Для установки данного файла недостаточно дискового пространства. [2]. Освободите место на диске и нажмите кнопку "Повторить" либо нажмите кнопку "Отмена" для выхода.</String>
422 <String Id="Error1308" Overridable="yes">Не найден исходный файл: [2]. Убедитесь, что этот файл существует и доступен.</String>
423 <String Id="Error1309" Overridable="yes">Ошибка чтения файла: [3]. {{ Системная ошибка [2].}} Убедитесь, что файл существует и доступен.</String>
424 <String Id="Error1310" Overridable="yes">Ошибка записи в файл: [3]. {{ Системная ошибка [2].}} Проверьте наличие доступа к папке.</String>
425 <String Id="Error1311" Overridable="yes">Исходный файл не найден{{(cabinet)}}: [2]. Убедитесь, что этот файл существует и доступен.</String>
426 <String Id="Error1312" Overridable="yes">Невозможно создать каталог "[2]". Файл с таким именем уже существует. Переименуйте или удалите этот файл и нажмите кнопку "Повторить", либо нажмите кнопку "Отмена" для выхода.</String>
427 <String Id="Error1313" Overridable="yes">Том [2] сейчас недоступен. Выберите другой том.</String>
428 <String Id="Error1314" Overridable="yes">Указанный путь "[2]" недоступен.</String>
429 <String Id="Error1315" Overridable="yes">Не удается произвести запись в указанную папку: [2].</String>
430 <String Id="Error1316" Overridable="yes">Сетевая ошибка при попытке чтения из файла: [2]</String>
431 <String Id="Error1317" Overridable="yes">Ошибка при попытке создать папку: [2]</String>
432 <String Id="Error1318" Overridable="yes">Сетевая ошибка при попытке создать папку: [2]</String>
433 <String Id="Error1319" Overridable="yes">Сетевая ошибка при попытке открытия исходного CAB-файла: [2]</String>
434 <String Id="Error1320" Overridable="yes">Указан слишком длинный путь: [2]</String>
435 <String Id="Error1321" Overridable="yes">У установщика недостаточно привилегий для изменения этого файла: [2].</String>
436 <String Id="Error1322" Overridable="yes">Недопустимая часть пути к папке "[2]". Она либо пустая, либо превышает максимально допустимую длину.</String>
437 <String Id="Error1323" Overridable="yes">Путь к папке "[2]" содержит слова, недопустимые для использования в пути к папке.</String>
438 <String Id="Error1324" Overridable="yes">Путь к папке "[2]" содержит недопустимый знак.</String>
439 <String Id="Error1325" Overridable="yes">"[2]" является недопустимым коротким именем файла.</String>
440 <String Id="Error1326" Overridable="yes">Ошибка при получении сведений о безопасности: [3] GetLastError: [2]</String>
441 <String Id="Error1327" Overridable="yes">Недопустимое устройство: [2]</String>
442 <String Id="Error1328" Overridable="yes">Ошибка применения исправления к файлу "[2]". Возможно, файл уже был обновлен другим способом и не может быть обновлен с помощью этого исправления. За дополнительными сведениями обратитесь к поставщику исправления. {{Системная ошибка: [3]}}</String>
443 <String Id="Error1329" Overridable="yes">Невозможно установить нужный файл, так как в CAB-файле [2] отсутствует цифровая подпись. Возможно, САВ-файл поврежден.</String>
444 <String Id="Error1330" Overridable="yes">Невозможно установить нужный файл, так как CAB-файл [2] имеет недопустимую цифровую подпись. Возможно, САВ-файл поврежден. {{Ошибка [3] возвращена методом WinVerifyTrust.}}</String>
445 <String Id="Error1331" Overridable="yes">Не удалось должным образом скопировать файл [2]: ошибка CRC.</String>
446 <String Id="Error1332" Overridable="yes">Не удалось должным образом переместить файл [2]: ошибка CRC.</String>
447 <String Id="Error1333" Overridable="yes">Не удалось должным образом исправить файл [2]: ошибка CRC.</String>
448 <String Id="Error1334" Overridable="yes">Невозможно установить файл "[2]", так как он не найден в CAB-файле "[3]". Возможно, произошла ошибка сети, ошибка чтения с компакт-диска или пакет содержит ошибки.</String>
449 <String Id="Error1335" Overridable="yes">CAB-файл "[2]", необходимый для этой установки, поврежден и не может быть использован. Возможно, произошла ошибка сети, ошибка чтения с компакт-диска или пакет содержит ошибки.</String>
450 <String Id="Error1336" Overridable="yes">Произошла ошибка при создании временного файла, необходимого для выполнения установки. {{Папка: [3]. Код системной ошибки: [2]}}</String>
451 <String Id="Error1401" Overridable="yes">Не удалось создать раздел: [2]. {{Системная ошибка [3].}} Убедитесь в наличии необходимых прав доступа к разделу или обратитесь в службу поддержки. </String>
452 <String Id="Error1402" Overridable="yes">Не удалось открыть раздел: [2]. {{Системная ошибка [3].}} Убедитесь в наличии необходимых прав доступа к разделу или обратитесь в службу поддержки. </String>
453 <String Id="Error1403" Overridable="yes">Не удалось удалить значение [2] из раздела [3]. {{Системная ошибка [4].}} Убедитесь в наличии необходимых прав доступа к разделу или обратитесь в службу поддержки. </String>
454 <String Id="Error1404" Overridable="yes">Не удалось удалить раздел: [2]. {{Системная ошибка [3].}} Убедитесь в наличии необходимых прав доступа к разделу или обратитесь в службу поддержки. </String>
455 <String Id="Error1405" Overridable="yes">Не удалось считать значение [2] из раздела [3]. {{Системная ошибка [4].}} Убедитесь в наличии необходимых прав доступа к разделу или обратитесь в службу поддержки. </String>
456 <String Id="Error1406" Overridable="yes">Не удалось записать значение [2] в раздел [3]. {{Системная ошибка [4].}} Убедитесь в наличии необходимых прав доступа к разделу или обратитесь в службу поддержки.</String>
457 <String Id="Error1407" Overridable="yes">Не удалось получить имена значений для раздела [2]. {{Системная ошибка [3].}} Убедитесь в наличии необходимых прав доступа к разделу или обратитесь в службу поддержки.</String>
458 <String Id="Error1408" Overridable="yes">Не удалось получить имена подразделов для раздела [2]. {{Системная ошибка [3].}} Убедитесь в наличии необходимых прав доступа к разделу или обратитесь в службу поддержки.</String>
459 <String Id="Error1409" Overridable="yes">Не удалось прочесть информацию о безопасности для раздела [2]. {{Системная ошибка [3].}} Убедитесь в наличии необходимых прав доступа к разделу или обратитесь в службу поддержки.</String>
460 <String Id="Error1410" Overridable="yes">Не удалось увеличить доступное пространство реестра. Для установки этого приложения требуется [2] КБ свободного места в реестре.</String>
461 <String Id="Error1500" Overridable="yes">Производится другая установка. Необходимо завершить ее перед продолжением этой.</String>
462 <String Id="Error1501" Overridable="yes">Ошибка доступа к защищенным данным. Убедитесь, что установщик Windows правильно настроен, и повторите попытку.</String>
463 <String Id="Error1502" Overridable="yes">Пользователь "[2]" ранее начал установку продукта "[3]". Этот пользователь должен будет повторно выполнить установку прежде, чем сможет использовать данный продукт. Текущая установка будет продолжена.</String>
464 <String Id="Error1503" Overridable="yes">Пользователь "[2]" ранее начал установку продукта "[3]". Этот пользователь должен будет повторно выполнить установку прежде, чем сможет использовать данный продукт.</String>
465 <String Id="Error1601" Overridable="yes">Недостаточно места на диске -- том: "[2]"; требуется: [3] КБ; свободно: [4] КБ. Освободите место на диске и повторите попытку.</String>
466 <String Id="Error1602" Overridable="yes">Отменить установку?</String>
467 <String Id="Error1603" Overridable="yes">Файл [2][3] сейчас используется{ следующим процессом: имя: [4], идентификатор: [5], заголовок окна: "[6]"}. Закройте это приложение и повторите попытку.</String>
468 <String Id="Error1604" Overridable="yes">Продукт "[2]" уже установлен, что препятствует установке данного продукта. Эти продукты несовместимы.</String>
469 <String Id="Error1605" Overridable="yes">Недостаточно места на томе "[2]". Невозможно продолжить установку с включенным восстановлением системы. Требуется [3] КБ, а доступно только [4] КБ. Нажмите кнопку "Пропустить", чтобы продолжить установку без сохранения информации о восстановлении, "Повтор", чтобы снова проверить наличие свободного места на диске, или "Отмена" для выхода из программы установки.</String>
470 <String Id="Error1606" Overridable="yes">Нет доступа к сетевой папке "[2]".</String>
471 <String Id="Error1607" Overridable="yes">Для продолжения установки необходимо закрыть следующие приложения:</String>
472 <String Id="Error1608" Overridable="yes">Не удалось обнаружить ранее установленные совместимые продукты, необходимые для установки этого продукта.</String>
473 <String Id="Error1609" Overridable="yes">Произошла ошибка при применении параметров безопасности. [2] не является допустимым пользователем или группой. Возможно, пакет содержит ошибки или произошла ошибка при подключении к контроллеру домена сети. Проверьте сетевое подключение и нажмите кнопку "Повтор" или нажмите кнопку "Отмена" для выхода из программы установки. {{Не удается найти SID пользователя, системная ошибка [3]}}</String>
474 <String Id="Error1701" Overridable="yes">Недопустимый раздел: [2]. Проверьте, что раздел указан правильно.</String>
475 <String Id="Error1702" Overridable="yes">Перед продолжением настройки [2] установщик должен перезагрузить компьютер. Чтобы перезагрузить компьютер сейчас, нажмите кнопку "Да". Чтобы отложить перезагрузку, нажмите кнопку "Нет".</String>
476 <String Id="Error1703" Overridable="yes">Для вступления в силу изменений, сделанных в "[2]", необходимо перезагрузить компьютер. Чтобы перезагрузить компьютер сейчас, нажмите кнопку "Да". Чтобы выполнить перезагрузку позже вручную, нажмите кнопку "Нет".</String>
477 <String Id="Error1704" Overridable="yes">В данный момент установка [2] приостановлена. Перед продолжением установки требуется отменить выполненные изменения. Отменить изменения?</String>
478 <String Id="Error1705" Overridable="yes">Выполняется запущенная ранее установка этого продукта. Для продолжения требуется отменить изменения, выполненные в процессе той установки. Отменить эти изменения?</String>
479 <String Id="Error1706" Overridable="yes">Пакет установки продукта [2] не найден. Попробуйте повторить установку, используя работоспособную копию пакета установки "[3]".</String>
480 <String Id="Error1707" Overridable="yes">Установка успешно завершена.</String>
481 <String Id="Error1708" Overridable="yes">Сбой установки.</String>
482 <String Id="Error1709" Overridable="yes">Продукт: [2] — [3]</String>
483 <String Id="Error1710" Overridable="yes">Можно либо восстановить предыдущее состояние компьютера, либо продолжить установку позже. Восстановить предыдущее состояние?</String>
484 <String Id="Error1711" Overridable="yes">При записи информации об установке на диск возникла ошибка. Убедитесь в наличии требуемого свободного места на диске и нажмите кнопку "Повторить" либо нажмите кнопку "Отмена" для прекращения установки.</String>
485 <String Id="Error1712" Overridable="yes">Не удалось найти один или несколько файлов, необходимых для восстановления предыдущего состояния компьютера. Восстановление невозможно.</String>
486 <String Id="Error1713" Overridable="yes">[2] не удается установить один из требуемых продуктов. Обратитесь в службу технической поддержки. {{Системная ошибка: [3].}}</String>
487 <String Id="Error1714" Overridable="yes">Не удается удалить старую версию [2]. Обратитесь в службу технической поддержки. {{Системная ошибка [3].}}</String>
488 <String Id="Error1715" Overridable="yes">Установлено: [2]</String>
489 <String Id="Error1716" Overridable="yes">Настроено: [2]</String>
490 <String Id="Error1717" Overridable="yes">Удалено: [2]</String>
491 <String Id="Error1718" Overridable="yes">Файл [2] отвергнут политикой цифровой подписи.</String>
492 <String Id="Error1719" Overridable="yes">Служба установщика Windows недоступна. Возможно, система работает в безопасном режиме или установщик Windows установлен неправильно. За помощью обратитесь в службу поддержки.</String>
493 <String Id="Error1720" Overridable="yes">Обнаружена неполадка, связанная с пакетом установщика Windows. Не удалось выполнить сценарий, требуемый для завершения текущей установки. Обратитесь в службу поддержки или к поставщику пакета. {{Настраиваемое действие [2], ошибка сценария [3], [4]: [5], строка [6], столбец [7], [8] }}</String>
494 <String Id="Error1721" Overridable="yes">Ошибка пакета установщика Windows. Не удается запустить программу, необходимую для выполнения установки. Обратитесь в службу поддержки или к поставщику пакета. {{Действие: [2], расположение: [3], команда: [4] }}</String>
495 <String Id="Error1722" Overridable="yes">Обнаружена неполадка, связанная с пакетом установщика Windows. Программа, запущенная как часть установки, не завершилась ожидаемым образом. Обратитесь в службу поддержки или к поставщику пакета. {{Действие: [2], расположение: [3], команда: [4] }}</String>
496 <String Id="Error1723" Overridable="yes">Обнаружена неполадка, связанная с пакетом установщика Windows. Не удалось выполнить библиотеку DLL, требуемую для завершения текущей установки. Обратитесь в службу поддержки или к поставщику пакета. {{Действие: [2], запись: [3], библиотека: [4] }}</String>
497 <String Id="Error1724" Overridable="yes">Удаление успешно завершено.</String>
498 <String Id="Error1725" Overridable="yes">Сбой удаления.</String>
499 <String Id="Error1726" Overridable="yes">Объявление успешно выполнено.</String>
500 <String Id="Error1727" Overridable="yes">Сбой объявления.</String>
501 <String Id="Error1728" Overridable="yes">Настройка успешно завершена.</String>
502 <String Id="Error1729" Overridable="yes">Сбой настройки.</String>
503 <String Id="Error1730" Overridable="yes">Для удаления этого приложения требуются права администратора. Чтобы удалить приложение, войдите в систему как администратор или обратитесь в службу технической поддержки.</String>
504 <String Id="Error1731" Overridable="yes">Исходный пакет установки для продукта [2] не соответствует клиентскому пакету. Повторите установку, используя работоспособную копию пакета установки "[3]".</String>
505 <String Id="Error1732" Overridable="yes">Для завершения установки [2] необходимо перезагрузить компьютер. В настоящий момент к этому компьютеру подключены другие пользователи, при перезагрузке результаты их работы могут быть потеряны. Выполнить перезагрузку сейчас?</String>
506 <String Id="Error1801" Overridable="yes">Недопустимый путь [2]. Укажите допустимый путь.</String>
507 <String Id="Error1802" Overridable="yes">Недостаточно памяти. Закройте другие приложения и повторите попытку.</String>
508 <String Id="Error1803" Overridable="yes">Отсутствует диск в устройстве [2]. Вставьте диск и нажмите кнопку "Повтор" или нажмите кнопку "Отмена" для возврата к ранее выбранному тому.</String>
509 <String Id="Error1804" Overridable="yes">Отсутствует диск в устройстве [2]. Вставьте диск и нажмите кнопку "Повтор" или нажмите кнопку "Отмена" для возврата к диалоговому окну обзора и выберите другой том.</String>
510 <String Id="Error1805" Overridable="yes">Папка [2] не существует. Укажите путь к существующей папке.</String>
511 <String Id="Error1806" Overridable="yes">Отсутствуют привилегии для чтения из этой папки.</String>
512 <String Id="Error1807" Overridable="yes">Не удалось определить правильную конечную папку для установки.</String>
513 <String Id="Error1901" Overridable="yes">Ошибка при попытке чтения из базы данных источника установки: [2].</String>
514 <String Id="Error1902" Overridable="yes">Планирование операции перезагрузки: переименование файла [2] в [3]. Для завершения операции требуется перезагрузка.</String>
515 <String Id="Error1903" Overridable="yes">Планирование операции перезагрузки: удаление файла [2]. Для завершения операции требуется перезагрузка.</String>
516 <String Id="Error1904" Overridable="yes">Не удалось зарегистрировать модуль [2]. HRESULT [3]. Обратитесь в службу поддержки.</String>
517 <String Id="Error1905" Overridable="yes">Не удалось отменить регистрацию модуля [2]. HRESULT [3]. Обратитесь в службу поддержки.</String>
518 <String Id="Error1906" Overridable="yes">Не удалось поместить пакет [2] в кэш. Ошибка: [3]. Обратитесь в службу поддержки.</String>
519 <String Id="Error1907" Overridable="yes">Не удалось зарегистрировать шрифт [2]. Убедитесь в наличии необходимых разрешений для установки шрифтов и в том, что система поддерживает этот шрифт.</String>
520 <String Id="Error1908" Overridable="yes">Не удалось отменить регистрацию шрифта [2]. Убедитесь в наличии необходимых разрешений на удаление шрифтов.</String>
521 <String Id="Error1909" Overridable="yes">Не удалось создать ярлык [2]. Убедитесь в существовании конечной папки и в наличии необходимых прав доступа.</String>
522 <String Id="Error1910" Overridable="yes">Не удалось удалить ярлык [2]. Убедитесь в существовании файла ярлыка и в наличии необходимых прав доступа.</String>
523 <String Id="Error1911" Overridable="yes">Не удалось зарегистрировать библиотеку типов для файла [2]. Обратитесь в службу поддержки.</String>
524 <String Id="Error1912" Overridable="yes">Не удалось отменить регистрацию библиотеки типов для файла [2]. Обратитесь в службу поддержки.</String>
525 <String Id="Error1913" Overridable="yes">Не удалось обновить INI-файл [2][3]. Убедитесь, что этот файл существует и доступен.</String>
526 <String Id="Error1914" Overridable="yes">Не удалось запланировать замену файла [3] файлом [2] при перезагрузке. Убедитесь в наличии необходимых разрешений для записи в файл [3].</String>
527 <String Id="Error1915" Overridable="yes">Ошибка удаления диспетчера драйверов ODBC, ошибка ODBC [2]: [3]. Обратитесь в службу поддержки.</String>
528 <String Id="Error1916" Overridable="yes">Ошибка установки диспетчера драйверов ODBC, ошибка ODBC [2]: [3]. Обратитесь в службу поддержки.</String>
529 <String Id="Error1917" Overridable="yes">Ошибка удаления драйвера ODBC: [4], ошибка ODBC [2]: [3]. Убедитесь в наличии необходимых привилегий на удаление драйверов ODBC.</String>
530 <String Id="Error1918" Overridable="yes">Ошибка установки ODBC-драйвера: [4], ошибка ODBC [2]: [3]. Убедитесь, что файл [4] существует и доступен.</String>
531 <String Id="Error1919" Overridable="yes">Ошибка настройки источника данных ODBC: [4], ошибка ODBC [2]: [3]. Убедитесь, что файл [4] существует и доступен.</String>
532 <String Id="Error1920" Overridable="yes">Не удалось запустить службу "[2]" ([3]). Убедитесь в наличии необходимых привилегий для запуска системных служб.</String>
533 <String Id="Error1921" Overridable="yes">Не удалось остановить службу "[2]" ([3]). Убедитесь в наличии необходимых привилегий для остановки системных служб.</String>
534 <String Id="Error1922" Overridable="yes">Не удалось удалить службу "[2]" ([3]). Убедитесь в наличии необходимых привилегий для удаления системных служб.</String>
535 <String Id="Error1923" Overridable="yes">Не удалось установить службу "[2]" ([3]). Убедитесь в наличии необходимых привилегий для установки системных служб.</String>
536 <String Id="Error1924" Overridable="yes">Не удалось обновить переменную среды "[2]". Убедитесь в наличии необходимых привилегий для изменения переменных среды.</String>
537 <String Id="Error1925" Overridable="yes">У вас недостаточно привилегий для завершения этой установки для всех пользователей компьютера. Войдите в систему как администратор и повторите попытку.</String>
538 <String Id="Error1926" Overridable="yes">Не удалось установить разрешения для файла "[3]". Ошибка: [2]. Убедитесь в наличии необходимых привилегий для изменения разрешений для этого файла.</String>
539 <String Id="Error1927" Overridable="yes">На компьютере не установлены службы компонентов (COM+ 1.0). Они необходимы для успешного завершения этой установки. Службы компонентов доступны в операционной системе Windows 2000.</String>
540 <String Id="Error1928" Overridable="yes">Ошибка при регистрации приложения COM+. За дополнительными сведениями обратитесь в службу поддержки.</String>
541 <String Id="Error1929" Overridable="yes">Ошибка при отмене регистрации приложения COM+. За дополнительными сведениями обратитесь в службу поддержки.</String>
542 <String Id="Error1930" Overridable="yes">Не удалось изменить описание для службы "[2]" ([3]).</String>
543 <String Id="Error1931" Overridable="yes">Службе установщика Windows не удается обновить системный файл [2], защищенный Windows. Возможно, для правильной работы программы необходимо выполнить обновление операционной системы. {{Версия пакета: [3], защищенная версия ОС: [4]}}</String>
544 <String Id="Error1932" Overridable="yes">Службе установщика Windows не удается обновить файл [2], защищенный Windows. {{Версия пакета: [3], версия, защищенная ОС: [4], ошибка SFP: [5]}}</String>
545 <String Id="Error1933" Overridable="yes">Службе установщика Windows не удается обновить один или несколько защищенных файлов Windows. {{Ошибка SFP: [2]. Список защищенных файлов:\r\n[3]}}</String>
546 <String Id="Error1934" Overridable="yes">Пользовательские установки не разрешены политикой данного компьютера.</String>
547 <String Id="Error1935" Overridable="yes">Произошла ошибка при установке компонента сборки "[6]". Дополнительные сведения см. в центре справки и поддержки. HRESULT: [3]. {{Интерфейс сборки: [4], функция: [5], компонент: [2]}}</String>
548 <String Id="Error1936" Overridable="yes">Во время установки сборки "[6]" произошла ошибка. Сборка не имеет строгого имени или не подписана ключом минимальной длины. HRESULT: [3]. {{Интерфейс сборки: [4], функция: [5], компонент: [2]}}</String>
549 <String Id="Error1937" Overridable="yes">Во время установки сборки "[6]" произошла ошибка. Не удалось проверить подпись или каталог, или они недопустимы. HRESULT: [3]. {{Интерфейс сборки: [4], функция: [5], компонент: [2]}}</String>
550 <String Id="Error1938" Overridable="yes">Во время установки сборки "[6]" произошла ошибка. Не удалось найти один или несколько модулей сборки. HRESULT: [3]. {{Интерфейс сборки: [4], функция: [5], компонент: [2]}}</String>
551
552 <String Id="UITextbytes" Overridable="yes">байт</String>
553 <String Id="UITextGB" Overridable="yes">ГБ</String>
554 <String Id="UITextKB" Overridable="yes">КБ</String>
555 <String Id="UITextMB" Overridable="yes">МБ</String>
556 <String Id="UITextMenuAbsent" Overridable="yes">Компонент будет полностью недоступен</String>
557 <String Id="UITextMenuAdvertise" Overridable="yes">Компонент будет установлен при необходимости</String>
558 <String Id="UITextMenuAllCD" Overridable="yes">Компонент будет полностью установлен для запуска с компакт-диска</String>
559 <String Id="UITextMenuAllLocal" Overridable="yes">Компонент будет полностью установлен на локальный жесткий диск</String>
560 <String Id="UITextMenuAllNetwork" Overridable="yes">Компонент будет полностью установлен для запуска из сети</String>
561 <String Id="UITextMenuCD" Overridable="yes">Будет установлен для запуска с компакт-диска</String>
562 <String Id="UITextMenuLocal" Overridable="yes">Будет установлен на локальный жесткий диск</String>
563 <String Id="UITextMenuNetwork" Overridable="yes">Будет установлен для запуска из сети</String>
564 <String Id="UITextNewFolder" Overridable="yes">Папка|Новая папка</String>
565 <String Id="UITextScriptInProgress" Overridable="yes">Идет сбор необходимых данных...</String>
566 <String Id="UITextSelAbsentAbsent" Overridable="yes">Компонент не будет установлен</String>
567 <String Id="UITextSelAbsentAdvertise" Overridable="yes">Компонент будет установлен при необходимости</String>
568 <String Id="UITextSelAbsentCD" Overridable="yes">Компонент будет установлен для запуска с компакт-диска</String>
569 <String Id="UITextSelAbsentLocal" Overridable="yes">Компонент будет установлен на локальный жесткий диск</String>
570 <String Id="UITextSelAbsentNetwork" Overridable="yes">Компонент будет установлен для запуска из сети</String>
571 <String Id="UITextSelAdvertiseAbsent" Overridable="yes">Компонент будет полностью недоступен</String>
572 <String Id="UITextSelAdvertiseAdvertise" Overridable="yes">Будет установлен при необходимости</String>
573 <String Id="UITextSelAdvertiseCD" Overridable="yes">Компонент будет доступен для запуска с компакт-диска</String>
574 <String Id="UITextSelAdvertiseLocal" Overridable="yes">Компонент будет установлен на локальный жесткий диск</String>
575 <String Id="UITextSelAdvertiseNetwork" Overridable="yes">Компонент будет доступен для запуска из сети</String>
576 <String Id="UITextSelCDAbsent" Overridable="yes">Компонент будет полностью удален, его нельзя будет запустить с компакт-диска</String>
577 <String Id="UITextSelCDAdvertise" Overridable="yes">Компонент нельзя будет запустить с компакт-диска, он будет установлен при необходимости</String>
578 <String Id="UITextSelCDCD" Overridable="yes">Компонент можно будет запустить с компакт-диска</String>
579 <String Id="UITextSelCDLocal" Overridable="yes">Компонент нельзя будет запустить с компакт-диска, он будет установлен на локальный жесткий диск</String>
580 <String Id="UITextSelChildCostNeg" Overridable="yes">Компонент освободит [1] на жестком диске.</String>
581 <String Id="UITextSelChildCostPos" Overridable="yes">Для компонента требуется [1] на жестком диске.</String>
582 <String Id="UITextSelCostPending" Overridable="yes">Идет подсчет затрат для этого компонента...</String>
583 <String Id="UITextSelLocalAbsent" Overridable="yes">Компонент будет полностью удален</String>
584 <String Id="UITextSelLocalAdvertise" Overridable="yes">Компонент будет удален с локального жесткого диска, но будет доступен для установки при необходимости</String>
585 <String Id="UITextSelLocalCD" Overridable="yes">Компонент будет удален с локального жесткого диска, но будет доступен для запуска с компакт-диска</String>
586 <String Id="UITextSelLocalLocal" Overridable="yes">Компонент будет доступен на локальном жестком диске</String>
587 <String Id="UITextSelLocalNetwork" Overridable="yes">Компонент будет удален с локального жесткого диска, но будет доступен для запуска из сети</String>
588 <String Id="UITextSelNetworkAbsent" Overridable="yes">Компонент будет полностью удален, его нельзя будет запустить из сети</String>
589 <String Id="UITextSelNetworkAdvertise" Overridable="yes">Компонент больше нельзя будет запустить из сети, он будет установлен при необходимости</String>
590 <String Id="UITextSelNetworkLocal" Overridable="yes">Компонент нельзя будет запустить из сети, он будет установлен на локальный жесткий диск</String>
591 <String Id="UITextSelNetworkNetwork" Overridable="yes">Компонент можно будет запустить из сети</String>
592 <String Id="UITextSelParentCostNegNeg" Overridable="yes">Компонент освободит [1] на жестком диске. Выбрано подкомпонентов: [2] из [3]. Подкомпоненты освободят [4] на жестком диске.</String>
593 <String Id="UITextSelParentCostNegPos" Overridable="yes">Компонент освободит [1] на жестком диске. Выбрано подкомпонентов: [2] из [3]. Для подкомпонентов требуется [4] на жестком диске.</String>
594 <String Id="UITextSelParentCostPosNeg" Overridable="yes">Для компонента требуется [1] на жестком диске. Выбрано подкомпонентов: [2] из [3]. Подкомпоненты освободят [4] на жестком диске.</String>
595 <String Id="UITextSelParentCostPosPos" Overridable="yes">Для компонента требуется [1] на жестком диске. Выбрано подкомпонентов: [2] из [3]. Для подкомпонентов требуется [4] на жестком диске.</String>
596 <String Id="UITextTimeRemaining" Overridable="yes">Осталось: {[1] мин. }{[2] сек.}</String>
597 <String Id="UITextVolumeCostAvailable" Overridable="yes">Доступно</String>
598 <String Id="UITextVolumeCostDifference" Overridable="yes">Разница</String>
599 <String Id="UITextVolumeCostRequired" Overridable="yes">Требуется</String>
600 <String Id="UITextVolumeCostSize" Overridable="yes">Размер диска</String>
601 <String Id="UITextVolumeCostVolume" Overridable="yes">Объем</String>
602</WixLocalization>
diff --git a/src/ext/UI/wixlib/WixUI_sk-SK.wxl b/src/ext/UI/wixlib/WixUI_sk-SK.wxl
new file mode 100644
index 00000000..380197bf
--- /dev/null
+++ b/src/ext/UI/wixlib/WixUI_sk-SK.wxl
@@ -0,0 +1,598 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3
4
5<WixLocalization Culture="sk-sk" Codepage="1250" xmlns="http://wixtoolset.org/schemas/v4/wxl">
6 <String Id="WixUIBack" Overridable="yes">&amp;Späť</String>
7 <String Id="WixUINext" Overridable="yes">Ď&amp;alej</String>
8 <String Id="WixUICancel" Overridable="yes">Zrušiť</String>
9 <String Id="WixUIFinish" Overridable="yes">&amp;Dokončiť</String>
10 <String Id="WixUIRetry" Overridable="yes">Z&amp;nova</String>
11 <String Id="WixUIIgnore" Overridable="yes">&amp;Ignorovať</String>
12 <String Id="WixUIYes" Overridable="yes">Án&amp;o</String>
13 <String Id="WixUINo" Overridable="yes">&amp;Nie</String>
14 <String Id="WixUIOK" Overridable="yes">OK</String>
15 <String Id="WixUIPrint" Overridable="yes">&amp;Tlačiť</String>
16
17 <String Id="AdvancedWelcomeEulaDlg_Title" Overridable="yes">[ProductName] – inštalácia</String>
18 <String Id="AdvancedWelcomeEulaDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
19 <String Id="AdvancedWelcomeEulaDlgTitle" Overridable="yes">{\WixUI_Font_Title}Prečítajte si licenčnú zmluvu vzťahujúcu sa na program [ProductName]</String>
20 <String Id="AdvancedWelcomeEulaDlgLicenseAcceptedCheckBox" Overridable="yes">&amp;Súhlasím s podmienkami licenčnej zmluvy</String>
21 <String Id="AdvancedWelcomeEulaDlgDescriptionPerMachine" Overridable="yes">Kliknutím na tlačidlo Inštalovať nainštalujete produkt s predvolenými možnosťami pre všetkých používateľov. Ak chcete zmeniť možnosti inštalácie, kliknite na tlačidlo Spresniť.</String>
22 <String Id="AdvancedWelcomeEulaDlgDescriptionPerUser" Overridable="yes">Kliknutím na tlačidlo Inštalovať nainštalujete produkt s predvolenými možnosťami len pre seba. Ak chcete zmeniť možnosti inštalácie, kliknite na tlačidlo Spresniť.</String>
23 <String Id="AdvancedWelcomeEulaDlgInstall" Overridable="yes">I&amp;nštalovať</String>
24 <String Id="AdvancedWelcomeEulaDlgAdvanced" Overridable="yes">&amp;Spresniť</String>
25 <String Id="Advanced_Font_Normal_Size" Overridable="yes">8</String>
26 <String Id="Advanced_Font_Bigger_Size" Overridable="yes">12</String>
27 <String Id="Advanced_Font_Title_Size" Overridable="yes">9</String>
28 <String Id="Advanced_Font_Emphasized_Size" Overridable="yes">8</String>
29 <String Id="Advanced_Font_FaceName" Overridable="yes">Tahoma</String>
30
31 <String Id="BrowseDlg_Title" Overridable="yes">[ProductName] – inštalácia</String>
32 <String Id="BrowseDlgComboLabel" Overridable="yes">&amp;Kde hľadať:</String>
33 <String Id="BrowseDlgWixUI_Bmp_Up" Overridable="yes">WixUI_Bmp_Up</String>
34 <String Id="BrowseDlgWixUI_Bmp_UpTooltip" Overridable="yes">O úroveň vyššie</String>
35 <String Id="BrowseDlgNewFolder" Overridable="yes">WixUI_Bmp_New</String>
36 <String Id="BrowseDlgNewFolderTooltip" Overridable="yes">Vytvoriť nový priečinok</String>
37 <String Id="BrowseDlgPathLabel" Overridable="yes">&amp;Názov priečinka:</String>
38 <String Id="BrowseDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
39 <String Id="BrowseDlgDescription" Overridable="yes">Vyhľadať cieľový priečinok</String>
40 <String Id="BrowseDlgTitle" Overridable="yes">{\WixUI_Font_Title}Zmena cieľového priečinka</String>
41
42 <String Id="CancelDlg_Title" Overridable="yes">[ProductName] – inštalácia</String>
43 <String Id="CancelDlgText" Overridable="yes">Naozaj chcete zrušiť inštaláciu programu [ProductName]?</String>
44 <String Id="CancelDlgIcon" Overridable="yes">WixUI_Ico_Info</String>
45 <String Id="CancelDlgIconTooltip" Overridable="yes">Informačná ikona</String>
46
47 <String Id="CustomizeDlg_Title" Overridable="yes">[ProductName] – inštalácia</String>
48 <String Id="CustomizeDlgTree" Overridable="yes">Strom výberov</String>
49 <String Id="CustomizeDlgBrowse" Overridable="yes">P&amp;rehľadávať...</String>
50 <String Id="CustomizeDlgReset" Overridable="yes">&amp;Obnoviť</String>
51 <String Id="CustomizeDlgDiskCost" Overridable="yes">Vy&amp;užitie disku</String>
52 <String Id="CustomizeDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
53 <String Id="CustomizeDlgText" Overridable="yes">Klikaním na ikony v strome nižšie môžete zmeniť spôsob inštalácie súčastí.</String>
54 <String Id="CustomizeDlgDescription" Overridable="yes">Vyberte spôsob inštalácie súčastí.</String>
55 <String Id="CustomizeDlgTitle" Overridable="yes">{\WixUI_Font_Title}Vlastná inštalácia</String>
56 <String Id="CustomizeDlgItemDescription" Overridable="yes">CustomizeDlgItemDescription-CustomizeDlgItemDescription</String>
57 <String Id="CustomizeDlgItemSize" Overridable="yes">CustomizeDlgItemSize-CustomizeDlgItemSize</String>
58 <String Id="CustomizeDlgLocation" Overridable="yes">CustomizeDlgLocation-CustomizeDlgLocation</String>
59 <String Id="CustomizeDlgLocationLabel" Overridable="yes">Umiestnenie:</String>
60
61 <String Id="DiskCostDlg_Title" Overridable="yes">[ProductName] – inštalácia</String>
62 <String Id="DiskCostDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
63 <String Id="DiskCostDlgText" Overridable="yes">Označené zväzky nemajú dostatok miesta na disku na vybraté súčasti. Môžete odstrániť niektoré súbory z vyznačených zväzkov, nainštalovať menej súčastí alebo vybrať iné cieľové jednotky.</String>
64 <String Id="DiskCostDlgDescription" Overridable="yes">Požadované miesto na disku na inštaláciu vybratých súčastí.</String>
65 <String Id="DiskCostDlgTitle" Overridable="yes">{\WixUI_Font_Title}Požiadavky na miesto na disku</String>
66 <String Id="DiskCostDlgVolumeList" Overridable="yes">{120}{70}{70}{70}{70}</String>
67
68 <String Id="ErrorDlg_Title" Overridable="yes">[ProductName] – inštalácia</String>
69 <String Id="ErrorDlgErrorText" Overridable="yes">Informačný text</String>
70 <String Id="ErrorDlgErrorIcon" Overridable="yes">WixUI_Ico_Info</String>
71 <String Id="ErrorDlgErrorIconTooltip" Overridable="yes">Informačná ikona</String>
72
73 <String Id="ExitDialog_Title" Overridable="yes">[ProductName] – inštalácia</String>
74 <String Id="ExitDialogBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
75 <String Id="ExitDialogDescription" Overridable="yes">Kliknutím na tlačidlo Dokončiť ukončíte Sprievodcu inštaláciou.</String>
76 <String Id="ExitDialogTitle" Overridable="yes">{\WixUI_Font_Bigger}Sprievodca inštaláciou programu [ProductName] bol dokončený</String>
77
78 <String Id="FatalError_Title" Overridable="yes">[ProductName] – inštalácia</String>
79 <String Id="FatalErrorBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
80 <String Id="FatalErrorTitle" Overridable="yes">{\WixUI_Font_Bigger}Sprievodca inštaláciou programu [ProductName] sa predčasne ukončil</String>
81 <String Id="FatalErrorDescription1" Overridable="yes">Sprievodca inštaláciou programu [ProductName] sa predčasne ukončil pre chybu. Nastavenie systému sa nezmenilo. Ak budete chcieť tento program nainštalovať neskôr, znova spustite Sprievodcu inštaláciou.</String>
82 <String Id="FatalErrorDescription2" Overridable="yes">Kliknutím na tlačidlo Dokončiť ukončíte Sprievodcu inštaláciou.</String>
83
84 <String Id="FeaturesDlg_Title" Overridable="yes">[ProductName] – inštalácia</String>
85 <String Id="FeaturesDlgTree" Overridable="yes">Súčasti produktu</String>
86 <String Id="FeaturesDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
87 <String Id="FeaturesDlgDescription" Overridable="yes">Vyberte spôsob inštalácie súčastí.</String>
88 <String Id="FeaturesDlgTitle" Overridable="yes">{\WixUI_Font_Title}Súčasti produktu</String>
89 <String Id="FeaturesDlgItemDescription" Overridable="yes">FeaturesDlgItemDescription</String>
90 <String Id="FeaturesDlgItemSize" Overridable="yes">FeaturesDlgItemSize</String>
91 <String Id="FeaturesDlgInstall" Overridable="yes">I&amp;nštalovať</String>
92 <String Id="FeaturesDlgChange" Overridable="yes">Z&amp;meniť</String>
93
94 <String Id="FilesInUse_Title" Overridable="yes">[ProductName] – inštalácia</String>
95 <String Id="FilesInUseExit" Overridable="yes">Sk&amp;ončiť</String>
96 <String Id="FilesInUseBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
97 <String Id="FilesInUseText" Overridable="yes">Nasledujúce aplikácie používajú súbory, ktoré musí táto inštalácia aktualizovať. Zavrite tieto aplikácie, kliknite na tlačidlo &amp;Znova a pokračujte v inštalácii. Ak chcete skončiť, kliknite na tlačidlo Skončiť.</String>
98 <String Id="FilesInUseDescription" Overridable="yes">Niektoré súbory určené na aktualizáciu sa momentálne používajú.</String>
99 <String Id="FilesInUseTitle" Overridable="yes">{\WixUI_Font_Title}Používané súbory</String>
100
101 <String Id="InstallDirDlg_Title" Overridable="yes">[ProductName] – inštalácia</String>
102 <String Id="InstallDirDlgChange" Overridable="yes">Z&amp;meniť...</String>
103 <String Id="InstallDirDlgTitle" Overridable="yes">{\WixUI_Font_Title}Cieľový priečinok</String>
104 <String Id="InstallDirDlgDescription" Overridable="yes">Ak chcete program nainštalovať do predvoleného priečinka, kliknite na tlačidlo Ďalej. Ak chcete vybrať iný priečinok, kliknite na tlačidlo Zmeniť.</String>
105 <String Id="InstallDirDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
106 <String Id="InstallDirDlgFolderLabel" Overridable="yes">Inštalovať program [ProductName] do priečinka:</String>
107
108 <String Id="InstallScopeDlg_Title" Overridable="yes">[ProductName] – inštalácia</String>
109 <String Id="InstallScopeDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
110 <String Id="InstallScopeDlgDescription" Overridable="yes">Vyberte rozsah a priečinok inštalácie</String>
111 <String Id="InstallScopeDlgTitle" Overridable="yes">{\WixUI_Font_Title}Rozsah inštalácie</String>
112 <String Id="InstallScopeDlgPerUser" Overridable="yes">{\WixUI_Font_Emphasized}Inštalovať len pre &amp;seba ([LogonUser])</String>
113 <String Id="InstallScopeDlgPerUserDescription" Overridable="yes">Program [ProductName] sa nainštaluje do priečinka pre konkrétneho používateľa a bude k dispozícii len pre vaše používateľské konto. Nepotrebujete lokálne oprávnenia správcu.</String>
114 <String Id="InstallScopeDlgNoPerUserDescription" Overridable="yes">Program [ProductName] nepodporuje inštaláciu pre konkrétneho používateľa.</String>
115 <String Id="InstallScopeDlgPerMachine" Overridable="yes">{\WixUI_Font_Emphasized}Inštalovať pre všetkých používateľov tohto &amp;počítača</String>
116 <String Id="InstallScopeDlgPerMachineDescription" Overridable="yes">Program [ProductName] sa predvolene nainštaluje do priečinka pre konkrétne zariadenie a bude k dispozícii pre všetkých používateľov. Predvolený inštalačný priečinok môžete zmeniť. Musíte mať lokálne oprávnenia správcu.</String>
117 <String Id="InstallScopeDlgFolderLabel" Overridable="yes">Inštalačný &amp;priečinok:</String>
118 <String Id="InstallScopeDlgChange" Overridable="yes">Z&amp;meniť...</String>
119
120 <String Id="InvalidDirDlg_Title" Overridable="yes">[ProductName] – inštalácia</String>
121 <String Id="InvalidDirDlgText" Overridable="yes">Inštalačný adresár sa musí nachádzať na lokálnom pevnom disku.</String>
122 <String Id="InvalidDirDlgIcon" Overridable="yes">WixUI_Ico_Info</String>
123 <String Id="InvalidDirDlgIconTooltip" Overridable="yes">Informačná ikona</String>
124
125 <String Id="LicenseAgreementDlg_Title" Overridable="yes">[ProductName] – inštalácia</String>
126 <String Id="LicenseAgreementDlgLicenseAcceptedCheckBox" Overridable="yes">&amp;Súhlasím s podmienkami licenčnej zmluvy</String>
127 <String Id="LicenseAgreementDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
128 <String Id="LicenseAgreementDlgDescription" Overridable="yes">Pozorne si prečítajte nasledujúcu licenčnú zmluvu</String>
129 <String Id="LicenseAgreementDlgTitle" Overridable="yes">{\WixUI_Font_Title}Licenčná zmluva koncového používateľa</String>
130
131 <String Id="MaintenanceTypeDlg_Title" Overridable="yes">[ProductName] – inštalácia</String>
132 <String Id="MaintenanceTypeDlgChangeButton" Overridable="yes">Z&amp;meniť</String>
133 <String Id="MaintenanceTypeDlgChangeButtonTooltip" Overridable="yes">Zmeniť inštaláciu</String>
134 <String Id="MaintenanceTypeDlgRepairButton" Overridable="yes">Opr&amp;aviť</String>
135 <String Id="MaintenanceTypeDlgRepairButtonTooltip" Overridable="yes">Opraviť inštaláciu</String>
136 <String Id="MaintenanceTypeDlgRemoveButton" Overridable="yes">&amp;Odstrániť</String>
137 <String Id="MaintenanceTypeDlgRemoveButtonTooltip" Overridable="yes">Odstrániť inštaláciu</String>
138 <String Id="MaintenanceTypeDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
139 <String Id="MaintenanceTypeDlgDescription" Overridable="yes">Vyberte operáciu, ktorú chcete vykonať.</String>
140 <String Id="MaintenanceTypeDlgTitle" Overridable="yes">{\WixUI_Font_Title}Zmena, oprava alebo odstránenie inštalácie</String>
141 <String Id="MaintenanceTypeDlgChangeText" Overridable="yes">Umožňuje zmeniť spôsob inštalácie súčastí.</String>
142 <String Id="MaintenanceTypeDlgChangeDisabledText" Overridable="yes">Program [ProductName] neobsahuje žiadne súčasti, ktoré možno nezávisle vybrať.</String>
143 <String Id="MaintenanceTypeDlgRemoveText" Overridable="yes">Odstráni program [ProductName] z počítača.</String>
144 <String Id="MaintenanceTypeDlgRemoveDisabledText" Overridable="yes">Program [ProductName] nemožno odstrániť.</String>
145 <String Id="MaintenanceTypeDlgRepairText" Overridable="yes">Slúži na opravu chýb poslednej inštalácie prostredníctvom opravy chýbajúcich a poškodených súborov, odkazov a položiek databázy Registry.</String>
146 <String Id="MaintenanceTypeDlgRepairDisabledText" Overridable="yes">Program [ProductName] nemožno opraviť.</String>
147
148 <String Id="MaintenanceWelcomeDlg_Title" Overridable="yes">[ProductName] – inštalácia</String>
149 <String Id="MaintenanceWelcomeDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
150 <String Id="MaintenanceWelcomeDlgDescription" Overridable="yes">Sprievodca inštaláciou umožňuje zmeniť spôsob inštalácie súčastí programu [ProductName] v počítači alebo odstrániť tento program z počítača. Ak chcete pokračovať, kliknite na tlačidlo Ďalej. Ak chcete Sprievodcu inštaláciou ukončiť, kliknite na tlačidlo Zrušiť.</String>
151 <String Id="MaintenanceWelcomeDlgTitle" Overridable="yes">{\WixUI_Font_Bigger}Víta vás Sprievodca inštaláciou programu [ProductName]</String>
152
153 <String Id="MsiRMFilesInUse_Title" Overridable="yes">[ProductName] – inštalácia</String>
154 <String Id="MsiRMFilesInUseBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
155 <String Id="MsiRMFilesInUseText" Overridable="yes">Nasledujúce aplikácie používajú súbory, ktoré musí táto inštalácia aktualizovať. Sprievodca inštaláciou ich môže ukončiť a potom sa ich pokúsiť reštartovať alebo môže zariadenie reštartovať neskôr.</String>
156 <String Id="MsiRMFilesInUseDescription" Overridable="yes">Niektoré súbory určené na aktualizáciu sa momentálne používajú.</String>
157 <String Id="MsiRMFilesInUseTitle" Overridable="yes">{\WixUI_Font_Title}Používané súbory</String>
158 <String Id="MsiRMFilesInUseUseRM" Overridable="yes">Ukončiť apliká&amp;cie a pokúsiť sa o ich opätovné spustenie.</String>
159 <String Id="MsiRMFilesInUseDontUseRM" Overridable="yes">&amp;Neukončiť aplikácie. Bude sa vyžadovať reštartovanie počítača.</String>
160
161 <String Id="OutOfDiskDlg_Title" Overridable="yes">[ProductName] – inštalácia</String>
162 <String Id="OutOfDiskDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
163 <String Id="OutOfDiskDlgText" Overridable="yes">Označené zväzky nemajú dostatok miesta na disku na aktuálne vybraté súčasti. Môžete odstrániť niektoré súbory z vyznačených zväzkov, nainštalovať menej súčastí alebo vybrať inú cieľovú jednotku.</String>
164 <String Id="OutOfDiskDlgDescription" Overridable="yes">Miesto na disku požadované na inštaláciu prekračuje dostupné miesto na disku.</String>
165 <String Id="OutOfDiskDlgTitle" Overridable="yes">{\WixUI_Font_Title}Nedostatok miesta na disku</String>
166 <String Id="OutOfDiskDlgVolumeList" Overridable="yes">{120}{70}{70}{70}{70}</String>
167
168 <String Id="OutOfRbDiskDlg_Title" Overridable="yes">[ProductName] – inštalácia</String>
169 <String Id="OutOfRbDiskDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
170 <String Id="OutOfRbDiskDlgText" Overridable="yes">Označené zväzky nemajú dostatok miesta na disku na aktuálne vybraté súčasti. Môžete odstrániť niektoré súbory z vyznačených zväzkov, nainštalovať menej súčastí alebo vybrať inú cieľovú jednotku.</String>
171 <String Id="OutOfRbDiskDlgDescription" Overridable="yes">Miesto na disku požadované na inštaláciu prekračuje dostupné miesto na disku.</String>
172 <String Id="OutOfRbDiskDlgTitle" Overridable="yes">{\WixUI_Font_Title}Nedostatok miesta na disku</String>
173 <String Id="OutOfRbDiskDlgVolumeList" Overridable="yes">{120}{70}{70}{70}{70}</String>
174 <String Id="OutOfRbDiskDlgText2" Overridable="yes">Prípadne môžete zakázať funkciu vrátenia zmien inštalátora. Zakázanie funkcie vrátenia zmien zabráni inštalátoru obnoviť pôvodný stav počítača, ak by sa inštalácia akýmkoľvek spôsobom prerušila. Ak chcete zakázať funkciu vrátenia zmien, kliknite na tlačidlo Áno.</String>
175
176 <String Id="PrepareDlg_Title" Overridable="yes">[ProductName] – inštalácia</String>
177 <String Id="PrepareDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
178 <String Id="PrepareDlgDescription" Overridable="yes">Počkajte, kým sa Sprievodca inštaláciou pripraví na prevádzanie inštaláciou.</String>
179 <String Id="PrepareDlgTitle" Overridable="yes">{\WixUI_Font_Bigger}Víta vás Sprievodca inštaláciou programu [ProductName]</String>
180
181 <String Id="ProgressDlg_Title" Overridable="yes">[ProductName] – inštalácia</String>
182 <String Id="ProgressDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
183 <String Id="ProgressDlgTextInstalling" Overridable="yes">Počkajte, kým Sprievodca inštaláciou nainštaluje program [ProductName].</String>
184 <String Id="ProgressDlgTitleInstalling" Overridable="yes">{\WixUI_Font_Title}Inštaluje sa program [ProductName]</String>
185 <String Id="ProgressDlgTextChanging" Overridable="yes">Počkajte, kým Sprievodca inštaláciou zmení program [ProductName].</String>
186 <String Id="ProgressDlgTitleChanging" Overridable="yes">{\WixUI_Font_Title}Mení sa program [ProductName]</String>
187 <String Id="ProgressDlgTextRepairing" Overridable="yes">Počkajte, kým Sprievodca inštaláciou opraví program [ProductName].</String>
188 <String Id="ProgressDlgTitleRepairing" Overridable="yes">{\WixUI_Font_Title}Opravuje sa program [ProductName]</String>
189 <String Id="ProgressDlgTextRemoving" Overridable="yes">Počkajte, kým Sprievodca inštaláciou odstráni program [ProductName].</String>
190 <String Id="ProgressDlgTitleRemoving" Overridable="yes">{\WixUI_Font_Title}Odstraňuje sa program [ProductName]</String>
191 <String Id="ProgressDlgTextUpdating" Overridable="yes">Počkajte, kým Sprievodca inštaláciou dokončí aktualizáciu programu [ProductName].</String>
192 <String Id="ProgressDlgTitleUpdating" Overridable="yes">{\WixUI_Font_Title}Aktualizuje sa program [ProductName]</String>
193 <String Id="ProgressDlgProgressBar" Overridable="yes">Priebeh</String>
194 <String Id="ProgressDlgStatusLabel" Overridable="yes">Stav:</String>
195
196 <String Id="ResumeDlg_Title" Overridable="yes">[ProductName] – inštalácia</String>
197 <String Id="ResumeDlgInstall" Overridable="yes">I&amp;nštalovať</String>
198 <String Id="ResumeDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
199 <String Id="ResumeDlgDescription" Overridable="yes">Sprievodca inštaláciou dokončí inštaláciu programu [ProductName] v počítači. Ak chcete pokračovať, kliknite na tlačidlo Inštalovať. Ak chcete Sprievodcu inštaláciou ukončiť, kliknite na tlačidlo Zrušiť.</String>
200 <String Id="ResumeDlgTitle" Overridable="yes">{\WixUI_Font_Bigger}Obnovuje sa Sprievodca inštaláciou programu [ProductName]</String>
201
202 <String Id="SetupTypeDlg_Title" Overridable="yes">[ProductName] – inštalácia</String>
203 <String Id="SetupTypeDlgTypicalButton" Overridable="yes">&amp;Typická</String>
204 <String Id="SetupTypeDlgTypicalButtonTooltip" Overridable="yes">Typická inštalácia</String>
205 <String Id="SetupTypeDlgCustomButton" Overridable="yes">&amp;Vlastná</String>
206 <String Id="SetupTypeDlgCustomButtonTooltip" Overridable="yes">Vlastná inštalácia</String>
207 <String Id="SetupTypeDlgCompleteButton" Overridable="yes">Ú&amp;plná</String>
208 <String Id="SetupTypeDlgCompleteButtonTooltip" Overridable="yes">Úplná inštalácia</String>
209 <String Id="SetupTypeDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
210 <String Id="SetupTypeDlgTitle" Overridable="yes">{\WixUI_Font_Title}Výber typu inštalácie</String>
211 <String Id="SetupTypeDlgDescription" Overridable="yes">Vyberte typ inštalácie zodpovedajúci vašim potrebám</String>
212 <String Id="SetupTypeDlgTypicalText" Overridable="yes">Nainštaluje najčastejšie používané funkcie programu. Odporúča sa pre väčšinu používateľov.</String>
213 <String Id="SetupTypeDlgCustomText" Overridable="yes">Umožňuje používateľom vybrať súčasti programu, ktoré sa majú nainštalovať, a miesto, kam sa majú nainštalovať. Odporúča sa pre skúsených používateľov.</String>
214 <String Id="SetupTypeDlgCompleteText" Overridable="yes">Nainštalujú sa všetky súčasti programu. Vyžaduje najviac miesta na disku.</String>
215
216 <String Id="UserExit_Title" Overridable="yes">[ProductName] – inštalácia</String>
217 <String Id="UserExitBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
218 <String Id="UserExitTitle" Overridable="yes">{\WixUI_Font_Bigger}Sprievodca inštaláciou programu [ProductName] sa prerušil</String>
219 <String Id="UserExitDescription1" Overridable="yes">Inštalácia programu [ProductName] sa prerušila. Nastavenie systému sa nezmenilo. Ak budete chcieť tento program nainštalovať neskôr, znova spustite inštaláciu.</String>
220 <String Id="UserExitDescription2" Overridable="yes">Kliknutím na tlačidlo Dokončiť ukončíte Sprievodcu inštaláciou.</String>
221
222 <String Id="VerifyReadyDlg_Title" Overridable="yes">[ProductName] – inštalácia</String>
223 <String Id="VerifyReadyDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
224 <String Id="VerifyReadyDlgInstall" Overridable="yes">I&amp;nštalovať</String>
225 <String Id="VerifyReadyDlgInstallText" Overridable="yes">Ak chcete spustiť inštaláciu, kliknite na tlačidlo Inštalovať. Ak chcete skontrolovať alebo zmeniť niektoré z nastavení inštalácie, kliknite na tlačidlo Späť. Kliknutím na tlačidlo Zrušiť ukončíte sprievodcu.</String>
226 <String Id="VerifyReadyDlgInstallTitle" Overridable="yes">{\WixUI_Font_Title}Pripravený na inštaláciu programu [ProductName]</String>
227 <String Id="VerifyReadyDlgChange" Overridable="yes">Z&amp;meniť</String>
228 <String Id="VerifyReadyDlgChangeText" Overridable="yes">Ak chcete spustiť inštaláciu, kliknite na tlačidlo Zmeniť. Ak chcete skontrolovať alebo zmeniť niektoré z nastavení inštalácie, kliknite na tlačidlo Späť. Kliknutím na tlačidlo Zrušiť ukončíte sprievodcu.</String>
229 <String Id="VerifyReadyDlgChangeTitle" Overridable="yes">{\WixUI_Font_Title}Pripravený na zmenu programu [ProductName]</String>
230 <String Id="VerifyReadyDlgRepair" Overridable="yes">Opr&amp;aviť</String>
231 <String Id="VerifyReadyDlgRepairText" Overridable="yes">Kliknutím na tlačidlo Opraviť môžete opraviť inštaláciu programu [ProductName]. Ak chcete skontrolovať alebo zmeniť niektoré z nastavení inštalácie, kliknite na tlačidlo Späť. Kliknutím na tlačidlo Zrušiť ukončíte sprievodcu.</String>
232 <String Id="VerifyReadyDlgRepairTitle" Overridable="yes">{\WixUI_Font_Title}Pripravený na opravu programu [ProductName]</String>
233 <String Id="VerifyReadyDlgRemove" Overridable="yes">&amp;Odstrániť</String>
234 <String Id="VerifyReadyDlgRemoveText" Overridable="yes">Kliknutím na tlačidlo Odstrániť odstránite program [ProductName] z počítača. Ak chcete skontrolovať alebo zmeniť niektoré z nastavení inštalácie, kliknite na tlačidlo Späť. Kliknutím na tlačidlo Zrušiť ukončíte sprievodcu.</String>
235 <String Id="VerifyReadyDlgRemoveTitle" Overridable="yes">{\WixUI_Font_Title}Pripravený na odstránenie programu [ProductName]</String>
236 <String Id="VerifyReadyDlgUpdate" Overridable="yes">&amp;Aktualizovať</String>
237 <String Id="VerifyReadyDlgUpdateText" Overridable="yes">Kliknutím na tlačidlo Aktualizovať vykonáte aktualizáciu programu [ProductName] v počítači. Ak chcete skontrolovať alebo zmeniť niektoré z nastavení inštalácie, kliknite na tlačidlo Späť. Kliknutím na tlačidlo Zrušiť ukončíte sprievodcu.</String>
238 <String Id="VerifyReadyDlgUpdateTitle" Overridable="yes">{\WixUI_Font_Title}Pripravený na aktualizáciu programu [ProductName]</String>
239
240 <String Id="WaitForCostingDlg_Title" Overridable="yes">[ProductName] – inštalácia</String>
241 <String Id="WaitForCostingDlgReturn" Overridable="yes">&amp;Návrat</String>
242 <String Id="WaitForCostingDlgText" Overridable="yes">Počkajte, kým inštalátor určí požiadavky na miesto na disku.</String>
243 <String Id="WaitForCostingDlgIcon" Overridable="yes">WixUI_Ico_Exclam</String>
244 <String Id="WaitForCostingDlgIconTooltip" Overridable="yes">Ikona výkričníka</String>
245
246 <String Id="WelcomeDlg_Title" Overridable="yes">[ProductName] – inštalácia</String>
247 <String Id="WelcomeDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
248 <String Id="WelcomeDlgDescription" Overridable="yes">Sprievodca inštaláciou nainštaluje program [ProductName] v počítači. Ak chcete pokračovať, kliknite na tlačidlo Ďalej. Ak chcete Sprievodcu inštaláciou ukončiť, kliknite na tlačidlo Zrušiť.</String>
249 <String Id="WelcomeUpdateDlgDescriptionUpdate" Overridable="yes">Sprievodca inštaláciou vykoná aktualizáciu programu [ProductName] v počítači. Ak chcete pokračovať, kliknite na tlačidlo Ďalej. Ak chcete Sprievodcu inštaláciou ukončiť, kliknite na tlačidlo Zrušiť.</String>
250 <String Id="WelcomeDlgTitle" Overridable="yes">{\WixUI_Font_Bigger}Víta vás Sprievodca inštaláciou programu [ProductName]</String>
251
252 <String Id="WelcomeEulaDlg_Title" Overridable="yes">[ProductName] – inštalácia</String>
253 <String Id="WelcomeEulaDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
254 <String Id="WelcomeEulaDlgLicenseAcceptedCheckBox" Overridable="yes">&amp;Súhlasím s podmienkami licenčnej zmluvy</String>
255 <String Id="WelcomeEulaDlgInstall" Overridable="yes">I&amp;nštalovať</String>
256 <String Id="WelcomeEulaDlgUpdate" Overridable="yes">&amp;Aktualizovať</String>
257 <String Id="WelcomeEulaDlgTitle" Overridable="yes">{\WixUI_Font_Title}Prečítajte si licenčnú zmluvu vzťahujúcu sa na program [ProductName]</String>
258
259 <String Id="ProgressTextInstallValidate" Overridable="yes">Overuje sa inštalácia</String>
260 <String Id="ProgressTextInstallFiles" Overridable="yes">Kopírujú sa nové súbory</String>
261 <String Id="ProgressTextInstallFilesTemplate" Overridable="yes">Súbor: [1], adresár: [9], veľkosť: [6]</String>
262 <String Id="ProgressTextInstallAdminPackage" Overridable="yes">Kopírujú sa sieťové inštalačné súbory</String>
263 <String Id="ProgressTextInstallAdminPackageTemplate" Overridable="yes">Súbor: [1], adresár: [9], veľkosť: [6]</String>
264 <String Id="ProgressTextFileCost" Overridable="yes">Počíta sa požadované voľné miesto</String>
265 <String Id="ProgressTextCostInitialize" Overridable="yes">Počíta sa požadované voľné miesto</String>
266 <String Id="ProgressTextCostFinalize" Overridable="yes">Počíta sa požadované voľné miesto</String>
267 <String Id="ProgressTextCreateShortcuts" Overridable="yes">Vytvárajú sa odkazy</String>
268 <String Id="ProgressTextCreateShortcutsTemplate" Overridable="yes">Odkaz: [1]</String>
269 <String Id="ProgressTextPublishComponents" Overridable="yes">Publikujú sa oprávňujúce súčasti</String>
270 <String Id="ProgressTextPublishComponentsTemplate" Overridable="yes">Identifikácia súčasti: [1], kvalifikátor: [2]</String>
271 <String Id="ProgressTextPublishFeatures" Overridable="yes">Publikujú sa funkcie produktu</String>
272 <String Id="ProgressTextPublishFeaturesTemplate" Overridable="yes">Súčasť: [1]</String>
273 <String Id="ProgressTextPublishProduct" Overridable="yes">Publikujú sa informácie o produkte</String>
274 <String Id="ProgressTextRegisterClassInfo" Overridable="yes">Registrujú sa servery tried</String>
275 <String Id="ProgressTextRegisterClassInfoTemplate" Overridable="yes">Identifikácia triedy: [1]</String>
276 <String Id="ProgressTextRegisterExtensionInfo" Overridable="yes">Registrujú sa servery rozšírení</String>
277 <String Id="ProgressTextRegisterExtensionInfoTemplate" Overridable="yes">Rozšírenie: [1]</String>
278 <String Id="ProgressTextRegisterMIMEInfo" Overridable="yes">Registrujú sa informácie MIME</String>
279 <String Id="ProgressTextRegisterMIMEInfoTemplate" Overridable="yes">Typ obsahu MIME: [1], rozšírenie: [2]</String>
280 <String Id="ProgressTextRegisterProgIdInfo" Overridable="yes">Registrujú sa identifikátory programov</String>
281 <String Id="ProgressTextRegisterProgIdInfoTemplate" Overridable="yes">Identifikátor programu: [1]</String>
282 <String Id="ProgressTextAllocateRegistrySpace" Overridable="yes">Vyhradzuje sa miesto v databáze Registry</String>
283 <String Id="ProgressTextAllocateRegistrySpaceTemplate" Overridable="yes">Voľné miesto: [1]</String>
284 <String Id="ProgressTextAppSearch" Overridable="yes">Hľadajú sa nainštalované aplikácie</String>
285 <String Id="ProgressTextAppSearchTemplate" Overridable="yes">Vlastnosť: [1], podpis: [2]</String>
286 <String Id="ProgressTextBindImage" Overridable="yes">Vytvárajú sa väzby spustiteľných súborov</String>
287 <String Id="ProgressTextBindImageTemplate" Overridable="yes">Súbor: [1]</String>
288 <String Id="ProgressTextCCPSearch" Overridable="yes">Hľadajú sa oprávňujúce produkty</String>
289 <String Id="ProgressTextCreateFolders" Overridable="yes">Vytvárajú sa priečinky</String>
290 <String Id="ProgressTextCreateFoldersTemplate" Overridable="yes">Priečinok: [1]</String>
291 <String Id="ProgressTextDeleteServices" Overridable="yes">Odstraňujú sa služby</String>
292 <String Id="ProgressTextDeleteServicesTemplate" Overridable="yes">Služba: [1]</String>
293 <String Id="ProgressTextDuplicateFiles" Overridable="yes">Vytvárajú sa duplicitné súbory</String>
294 <String Id="ProgressTextDuplicateFilesTemplate" Overridable="yes">Súbor: [1], adresár: [9], veľkosť: [6]</String>
295 <String Id="ProgressTextFindRelatedProducts" Overridable="yes">Hľadajú sa súvisiace aplikácie</String>
296 <String Id="ProgressTextFindRelatedProductsTemplate" Overridable="yes">Nájdená aplikácia: [1]</String>
297 <String Id="ProgressTextInstallODBC" Overridable="yes">Inštalujú sa súčasti ODBC</String>
298 <String Id="ProgressTextInstallServices" Overridable="yes">Inštalujú sa nové služby</String>
299 <String Id="ProgressTextInstallServicesTemplate" Overridable="yes">Služba: [2]</String>
300 <String Id="ProgressTextLaunchConditions" Overridable="yes">Vyhodnocujú sa podmienky spustenia</String>
301 <String Id="ProgressTextMigrateFeatureStates" Overridable="yes">Presúvajú sa stavy funkcie zo súvisiacich aplikácií</String>
302 <String Id="ProgressTextMigrateFeatureStatesTemplate" Overridable="yes">Aplikácia: [1]</String>
303 <String Id="ProgressTextMoveFiles" Overridable="yes">Premiestňujú sa súbory</String>
304 <String Id="ProgressTextMoveFilesTemplate" Overridable="yes">Súbor: [1], adresár: [9], veľkosť: [6]</String>
305 <String Id="ProgressTextPatchFiles" Overridable="yes">Opravujú sa súbory</String>
306 <String Id="ProgressTextPatchFilesTemplate" Overridable="yes">Súbor: [1], adresár: [2], veľkosť: [3]</String>
307 <String Id="ProgressTextProcessComponents" Overridable="yes">Aktualizuje sa registrácia súčasti</String>
308 <String Id="ProgressTextRegisterComPlus" Overridable="yes">Registrujú sa aplikácie a súčasti COM+</String>
309 <String Id="ProgressTextRegisterComPlusTemplate" Overridable="yes">Identifikácia aplikácie: [1]{{, typ aplikácie: [2], používatelia: [3], RSN: [4]}}</String>
310 <String Id="ProgressTextRegisterFonts" Overridable="yes">Registrujú sa písma</String>
311 <String Id="ProgressTextRegisterFontsTemplate" Overridable="yes">Písmo: [1]</String>
312 <String Id="ProgressTextRegisterProduct" Overridable="yes">Registruje sa produkt</String>
313 <String Id="ProgressTextRegisterProductTemplate" Overridable="yes">[1]</String>
314 <String Id="ProgressTextRegisterTypeLibraries" Overridable="yes">Registrujú sa knižnice typov</String>
315 <String Id="ProgressTextRegisterTypeLibrariesTemplate" Overridable="yes">Identifikácia knižnice: [1]</String>
316 <String Id="ProgressTextRegisterUser" Overridable="yes">Registruje sa používateľ</String>
317 <String Id="ProgressTextRegisterUserTemplate" Overridable="yes">[1]</String>
318 <String Id="ProgressTextRemoveDuplicateFiles" Overridable="yes">Odstraňujú sa duplicitné súbory</String>
319 <String Id="ProgressTextRemoveDuplicateFilesTemplate" Overridable="yes">Súbor: [1], adresár: [9]</String>
320 <String Id="ProgressTextRemoveEnvironmentStrings" Overridable="yes">Aktualizujú sa reťazce prostredia</String>
321 <String Id="ProgressTextRemoveEnvironmentStringsTemplate" Overridable="yes">Názov: [1], hodnota: [2], akcia [3]</String>
322 <String Id="ProgressTextRemoveExistingProducts" Overridable="yes">Odstraňujú sa aplikácie</String>
323 <String Id="ProgressTextRemoveExistingProductsTemplate" Overridable="yes">Aplikácia: [1], príkazový riadok: [2]</String>
324 <String Id="ProgressTextRemoveFiles" Overridable="yes">Odstraňujú sa súbory</String>
325 <String Id="ProgressTextRemoveFilesTemplate" Overridable="yes">Súbor: [1], adresár: [9]</String>
326 <String Id="ProgressTextRemoveFolders" Overridable="yes">Odstraňujú sa priečinky</String>
327 <String Id="ProgressTextRemoveFoldersTemplate" Overridable="yes">Priečinok: [1]</String>
328 <String Id="ProgressTextRemoveIniValues" Overridable="yes">Odstraňujú sa položky súborov INI</String>
329 <String Id="ProgressTextRemoveIniValuesTemplate" Overridable="yes">Súbor: [1], sekcia: [2], kľúč: [3], hodnota: [4]</String>
330 <String Id="ProgressTextRemoveODBC" Overridable="yes">Odstraňujú sa súčasti ODBC</String>
331 <String Id="ProgressTextRemoveRegistryValues" Overridable="yes">Odstraňujú sa hodnoty zo systémovej databázy Registry</String>
332 <String Id="ProgressTextRemoveRegistryValuesTemplate" Overridable="yes">Kľúč: [1], názov: [2]</String>
333 <String Id="ProgressTextRemoveShortcuts" Overridable="yes">Odstraňujú sa odkazy</String>
334 <String Id="ProgressTextRemoveShortcutsTemplate" Overridable="yes">Odkaz: [1]</String>
335 <String Id="ProgressTextRMCCPSearch" Overridable="yes">Hľadajú sa oprávňujúce produkty</String>
336 <String Id="ProgressTextSelfRegModules" Overridable="yes">Registrujú sa moduly</String>
337 <String Id="ProgressTextSelfRegModulesTemplate" Overridable="yes">Súbor: [1], priečinok: [2]</String>
338 <String Id="ProgressTextSelfUnregModules" Overridable="yes">Ruší sa registrácia modulov</String>
339 <String Id="ProgressTextSelfUnregModulesTemplate" Overridable="yes">Súbor: [1], priečinok: [2]</String>
340 <String Id="ProgressTextSetODBCFolders" Overridable="yes">Inicializujú sa adresáre ODBC</String>
341 <String Id="ProgressTextStartServices" Overridable="yes">Spúšťajú sa služby</String>
342 <String Id="ProgressTextStartServicesTemplate" Overridable="yes">Služba: [1]</String>
343 <String Id="ProgressTextStopServices" Overridable="yes">Zastavujú sa služby</String>
344 <String Id="ProgressTextStopServicesTemplate" Overridable="yes">Služba: [1]</String>
345 <String Id="ProgressTextUnpublishComponents" Overridable="yes">Ruší sa publikovanie oprávňujúcich súčastí</String>
346 <String Id="ProgressTextUnpublishComponentsTemplate" Overridable="yes">Identifikácia súčasti: [1], kvalifikátor: [2]</String>
347 <String Id="ProgressTextUnpublishFeatures" Overridable="yes">Ruší sa publikovanie funkcií produktu</String>
348 <String Id="ProgressTextUnpublishFeaturesTemplate" Overridable="yes">Súčasť: [1]</String>
349 <String Id="ProgressTextUnregisterClassInfo" Overridable="yes">Ruší sa registrácia serverov tried</String>
350 <String Id="ProgressTextUnregisterClassInfoTemplate" Overridable="yes">Identifikácia triedy: [1]</String>
351 <String Id="ProgressTextUnregisterComPlus" Overridable="yes">Ruší sa registrácia aplikácií a súčastí COM+</String>
352 <String Id="ProgressTextUnregisterComPlusTemplate" Overridable="yes">Identifikácia aplikácie: [1]{{, typ aplikácie: [2]}}</String>
353 <String Id="ProgressTextUnregisterExtensionInfo" Overridable="yes">Ruší sa registrácia serverov rozšírení</String>
354 <String Id="ProgressTextUnregisterExtensionInfoTemplate" Overridable="yes">Rozšírenie: [1]</String>
355 <String Id="ProgressTextUnregisterFonts" Overridable="yes">Ruší sa registrácia písiem</String>
356 <String Id="ProgressTextUnregisterFontsTemplate" Overridable="yes">Písmo: [1]</String>
357 <String Id="ProgressTextUnregisterMIMEInfo" Overridable="yes">Ruší sa registrácia informácií MIME</String>
358 <String Id="ProgressTextUnregisterMIMEInfoTemplate" Overridable="yes">Typ obsahu MIME: [1], rozšírenie: [2]</String>
359 <String Id="ProgressTextUnregisterProgIdInfo" Overridable="yes">Ruší sa registrácia identifikátorov programov</String>
360 <String Id="ProgressTextUnregisterProgIdInfoTemplate" Overridable="yes">Identifikátor programu: [1]</String>
361 <String Id="ProgressTextUnregisterTypeLibraries" Overridable="yes">Ruší sa registrácia knižníc typov</String>
362 <String Id="ProgressTextUnregisterTypeLibrariesTemplate" Overridable="yes">Identifikácia knižnice: [1]</String>
363 <String Id="ProgressTextWriteEnvironmentStrings" Overridable="yes">Aktualizujú sa reťazce prostredia</String>
364 <String Id="ProgressTextWriteEnvironmentStringsTemplate" Overridable="yes">Názov: [1], hodnota: [2], akcia [3]</String>
365 <String Id="ProgressTextWriteIniValues" Overridable="yes">Zapisujú sa hodnoty do súborov INI</String>
366 <String Id="ProgressTextWriteIniValuesTemplate" Overridable="yes">Súbor: [1], sekcia: [2], kľúč: [3], hodnota: [4]</String>
367 <String Id="ProgressTextWriteRegistryValues" Overridable="yes">Zapisujú sa hodnoty do systémovej databázy Registry</String>
368 <String Id="ProgressTextWriteRegistryValuesTemplate" Overridable="yes">Kľúč: [1], názov: [2], hodnota: [3]</String>
369 <String Id="ProgressTextAdvertise" Overridable="yes">Zverejňuje sa aplikácia</String>
370 <String Id="ProgressTextGenerateScript" Overridable="yes">Vytvárajú sa operácie skriptu pre akciu:</String>
371 <String Id="ProgressTextGenerateScriptTemplate" Overridable="yes">[1]</String>
372 <String Id="ProgressTextInstallSFPCatalogFile" Overridable="yes">Inštaluje sa systémový katalóg</String>
373 <String Id="ProgressTextInstallSFPCatalogFileTemplate" Overridable="yes">Súbor: [1], závislosti: [2]</String>
374 <String Id="ProgressTextMsiPublishAssemblies" Overridable="yes">Publikujú sa informácie o zostave</String>
375 <String Id="ProgressTextMsiPublishAssembliesTemplate" Overridable="yes">Kontext aplikácie: [1], názov zostavy: [2]</String>
376 <String Id="ProgressTextMsiUnpublishAssemblies" Overridable="yes">Ruší sa publikovanie informácií o zostave</String>
377 <String Id="ProgressTextMsiUnpublishAssembliesTemplate" Overridable="yes">Kontext aplikácie: [1], názov zostavy: [2]</String>
378 <String Id="ProgressTextRollback" Overridable="yes">Vracajú sa zmeny:</String>
379 <String Id="ProgressTextRollbackTemplate" Overridable="yes">[1]</String>
380 <String Id="ProgressTextRollbackCleanup" Overridable="yes">Odstraňujú sa záložné súbory</String>
381 <String Id="ProgressTextRollbackCleanupTemplate" Overridable="yes">Súbor: [1]</String>
382 <String Id="ProgressTextUnmoveFiles" Overridable="yes">Odstraňujú sa premiestnené súbory</String>
383 <String Id="ProgressTextUnmoveFilesTemplate" Overridable="yes">Súbor: [1], adresár: [9]</String>
384 <String Id="ProgressTextUnpublishProduct" Overridable="yes">Ruší sa publikovanie informácií o produkte</String>
385
386 <String Id="Error0" Overridable="yes">{{Závažná chyba: }}</String>
387 <String Id="Error1" Overridable="yes">{{Chyba [1]. }}</String>
388 <String Id="Error2" Overridable="yes">Upozornenie [1]. </String>
389 <String Id="Error4" Overridable="yes">Informácia [1]. </String>
390 <String Id="Error5" Overridable="yes">Inštalátor zistil neočakávanú chybu pri inštalácii tohto balíka. Príčinou môže byť problém s týmto balíkom. Kód chyby je [1]. {{Argumenty sú: [2], [3], [4]}}</String>
391 <String Id="Error7" Overridable="yes">{{Disk je plný: }}</String>
392 <String Id="Error8" Overridable="yes">Akcia [Time]: [1]. [2]</String>
393 <String Id="Error9" Overridable="yes">[ProductName]</String>
394 <String Id="Error10" Overridable="yes">{[2]}{, [3]}{, [4]}</String>
395 <String Id="Error11" Overridable="yes">Typ správy: [1], argument: [2]</String>
396 <String Id="Error12" Overridable="yes">=== Začiatok zapisovania do denníka: [Date] [Time] ===</String>
397 <String Id="Error13" Overridable="yes">=== Zastavenie zapisovania do denníka: [Date] [Time] ===</String>
398 <String Id="Error14" Overridable="yes">Začiatok akcie [Time]: [1].</String>
399 <String Id="Error15" Overridable="yes">Ukončenie akcie [Time]: [1]. Vrátená hodnota [2].</String>
400 <String Id="Error16" Overridable="yes">Zostávajúci čas: {[1] min. }{[2] s}</String>
401 <String Id="Error17" Overridable="yes">Nedostatok pamäte. Pred opakovaním operácie ukončite ostatné aplikácie.</String>
402 <String Id="Error18" Overridable="yes">Inštalátor neodpovedá.</String>
403 <String Id="Error19" Overridable="yes">Inštalátor sa predčasne zastavil.</String>
404 <String Id="Error20" Overridable="yes">Počkajte, kým systém Windows nakonfiguruje program [ProductName]</String>
405 <String Id="Error21" Overridable="yes">Zhromažďujú sa požadované informácie...</String>
406 <String Id="Error22" Overridable="yes">Odstraňujú sa staršie verzie tejto aplikácie...</String>
407 <String Id="Error23" Overridable="yes">Pripravuje sa odstránenie starších verzií tejto aplikácie...</String>
408 <String Id="Error32" Overridable="yes">Inštalácia programu {[ProductName] }bola úspešne dokončená.</String>
409 <String Id="Error33" Overridable="yes">Inštalácia programu {[ProductName] }zlyhala.</String>
410 <String Id="Error1101" Overridable="yes">Chyba pri čítaní zo súboru: [2]. {{ Systémová chyba [3].}} Overte, či súbor existuje a či máte k nemu prístup.</String>
411 <String Id="Error1301" Overridable="yes">Nemožno vytvoriť súbor [2]. Adresár s týmto názvom už existuje. Zrušte inštaláciu a skúste vykonať inštaláciu do iného cieľového umiestnenia.</String>
412 <String Id="Error1302" Overridable="yes">Vložte disk: [2]</String>
413 <String Id="Error1303" Overridable="yes">Inštalátor nemá dostatočné oprávnenia na prístup k adresáru [2]. Inštalácia nemôže pokračovať. Prihláste sa ako správca alebo sa obráťte na správcu systému.</String>
414 <String Id="Error1304" Overridable="yes">Chyba pri zápise do súboru: [2]. Overte, či máte prístup do tohto adresára.</String>
415 <String Id="Error1305" Overridable="yes">Chyba pri čítaní zo súboru [2]. {{ Systémová chyba [3].}} Overte, či súbor existuje a či máte k nemu prístup.</String>
416 <String Id="Error1306" Overridable="yes">K súboru [2] má výhradný prístup iná aplikácia. Ukončite všetky ostatné aplikácie a kliknite na tlačidlo Znova.</String>
417 <String Id="Error1307" Overridable="yes">Na inštaláciu súboru [2] nie je dostatok voľného miesta na disku. Uvoľnite miesto na disku a kliknite na tlačidlo Znova. Ak chcete skončiť, kliknite na tlačidlo Zrušiť.</String>
418 <String Id="Error1308" Overridable="yes">Zdrojový súbor sa nenašiel: [2]. Overte, či súbor existuje a či k nemu máte prístup.</String>
419 <String Id="Error1309" Overridable="yes">Chyba pri čítaní zo súboru: [3]. {{ Systémová chyba [2].}} Overte, či súbor existuje a či máte k nemu prístup.</String>
420 <String Id="Error1310" Overridable="yes">Chyba pri zápise do súboru: [3]. {{ Systémová chyba [2].}} Overte, či máte prístup k adresáru.</String>
421 <String Id="Error1311" Overridable="yes">Zdrojový súbor sa nenašiel {{(kabinet)}}: [2]. Overte, či súbor existuje a či k nemu máte prístup.</String>
422 <String Id="Error1312" Overridable="yes">Nemožno vytvoriť adresár [2]. Súbor s týmto názvom už existuje. Premenujte alebo odstráňte súbor a kliknite na tlačidlo Znova. Ak chcete skončiť, kliknite na tlačidlo Zrušiť.</String>
423 <String Id="Error1313" Overridable="yes">Zväzok [2] momentálne nie je k dispozícii. Vyberte iný zväzok.</String>
424 <String Id="Error1314" Overridable="yes">Zadaná cesta [2] nie je k dispozícii.</String>
425 <String Id="Error1315" Overridable="yes">Do zadaného priečinka [2] nemožno zapisovať.</String>
426 <String Id="Error1316" Overridable="yes">Pri pokuse čítať súbor [2] sa vyskytla chyba siete.</String>
427 <String Id="Error1317" Overridable="yes">Pri pokuse vytvoriť adresár [2] sa vyskytla chyba.</String>
428 <String Id="Error1318" Overridable="yes">Pri pokuse vytvoriť adresár [2] sa vyskytla chyba siete.</String>
429 <String Id="Error1319" Overridable="yes">Pri pokuse otvoriť kabinet [2] zdrojového súboru sa vyskytla chyba siete.</String>
430 <String Id="Error1320" Overridable="yes">Zadaná cesta [2] je príliš dlhá.</String>
431 <String Id="Error1321" Overridable="yes">Inštalátor nemá dostatočné oprávnenia na zmenu súboru [2].</String>
432 <String Id="Error1322" Overridable="yes">Časť cesty k priečinku [2] je neplatná. Cesta je prázdna alebo prekračuje dĺžku povolenú systémom.</String>
433 <String Id="Error1323" Overridable="yes">Cesta k priečinku [2] obsahuje slová, ktoré nie sú platné pre cesty k priečinkom.</String>
434 <String Id="Error1324" Overridable="yes">Cesta k priečinku [2] obsahuje neplatný znak.</String>
435 <String Id="Error1325" Overridable="yes">[2] nie je platný krátky názov súboru.</String>
436 <String Id="Error1326" Overridable="yes">Chyba pri zisťovaní zabezpečenia súboru: [3] GetLastError: [2]</String>
437 <String Id="Error1327" Overridable="yes">Neplatná jednotka: [2]</String>
438 <String Id="Error1328" Overridable="yes">Vyskytla sa chyba pri opravovaní súboru [2]. Súbor bol možno aktualizovaný iným spôsobom a týmto opravným súborom ho už nemožno opraviť. Ďalšie informácie získate od dodávateľa opravy. {{Systémová chyba: [3]}}</String>
439 <String Id="Error1329" Overridable="yes">Požadovaný súbor nemožno nainštalovať, pretože súbor kabinetu [2] nie je digitálne podpísaný. Môže to znamenať, že súbor kabinetu je poškodený.</String>
440 <String Id="Error1330" Overridable="yes">Požadovaný súbor nemožno nainštalovať, pretože súbor kabinetu [2] má neplatný digitálny podpis. Môže to znamenať, že súbor kabinetu je poškodený.{{ Funkcia WinVerifyTrust vrátila chybu [3].}}</String>
441 <String Id="Error1331" Overridable="yes">Súbor [2] sa nepodarilo správne skopírovať: chyba CRC.</String>
442 <String Id="Error1332" Overridable="yes">Súbor [2] sa nepodarilo správne premiestniť: chyba CRC.</String>
443 <String Id="Error1333" Overridable="yes">Súbor [2] sa nepodarilo správne opraviť: chyba CRC.</String>
444 <String Id="Error1334" Overridable="yes">Súbor [2] nemožno nainštalovať, pretože sa nenachádza v súbore kabinetu [3]. Príčinou môže byť chyba siete, chyba pri čítaní disku CD-ROM alebo problém s týmto balíkom.</String>
445 <String Id="Error1335" Overridable="yes">Súbor kabinetu [2] požadovaný pre inštaláciu je poškodený a nemožno ho používať. Príčinou môže byť chyba siete, chyba pri čítaní disku CD-ROM alebo problém s týmto balíkom.</String>
446 <String Id="Error1336" Overridable="yes">Pri vytváraní dočasného súboru požadovaného na dokončenie inštalácie sa vyskytla chyba.{{ Priečinok: [3]. Kód systémovej chyby: [2]}}</String>
447 <String Id="Error1401" Overridable="yes">Nepodarilo sa vytvoriť kľúč: [2]. {{ Systémová chyba [3].}} Overte, či máte pre daný kľúč dostatočné prístupové práva, alebo sa obráťte na pracovníkov technickej podpory. </String>
448 <String Id="Error1402" Overridable="yes">Nepodarilo sa otvoriť kľúč: [2]. {{ Systémová chyba [3].}} Overte, či máte pre daný kľúč dostatočné prístupové práva, alebo sa obráťte na pracovníkov technickej podpory. </String>
449 <String Id="Error1403" Overridable="yes">Nepodarilo sa odstrániť hodnotu [2] z kľúča [3]. {{ Systémová chyba [4].}} Overte, či máte pre daný kľúč dostatočné prístupové práva, alebo sa obráťte na pracovníkov technickej podpory. </String>
450 <String Id="Error1404" Overridable="yes">Nepodarilo sa odstrániť kľúč [2]. {{ Systémová chyba [3].}} Overte, či máte pre daný kľúč dostatočné prístupové práva, alebo sa obráťte na pracovníkov technickej podpory. </String>
451 <String Id="Error1405" Overridable="yes">Nepodarilo sa prečítať hodnotu [2] z kľúča [3]. {{ Systémová chyba [4].}} Overte, či máte pre daný kľúč dostatočné prístupové práva, alebo sa obráťte na pracovníkov technickej podpory. </String>
452 <String Id="Error1406" Overridable="yes">Nepodarilo sa zapísať hodnotu [2] do kľúča [3]. {{ Systémová chyba [4].}} Overte, či máte pre daný kľúč dostatočné prístupové práva, alebo sa obráťte na pracovníkov technickej podpory.</String>
453 <String Id="Error1407" Overridable="yes">Nepodarilo sa získať názvy hodnôt pre kľúč [2]. {{ Systémová chyba [3].}} Overte, či máte pre daný kľúč dostatočné prístupové práva, alebo sa obráťte na pracovníkov technickej podpory.</String>
454 <String Id="Error1408" Overridable="yes">Nepodarilo sa získať názvy podkľúčov pre kľúč [2]. {{ Systémová chyba [3].}} Overte, či máte pre daný kľúč dostatočné prístupové práva, alebo sa obráťte na pracovníkov technickej podpory.</String>
455 <String Id="Error1409" Overridable="yes">Nepodarilo sa prečítať informácie o zabezpečení pre kľúč [2]. {{ Systémová chyba [3].}} Overte, či máte pre daný kľúč dostatočné prístupové práva, alebo sa obráťte na pracovníkov technickej podpory.</String>
456 <String Id="Error1410" Overridable="yes">Voľné miesto v databáze Registry nemožno zväčšiť. Na inštaláciu tejto aplikácie sa vyžaduje [2] kB voľného miesta v databáze Registry.</String>
457 <String Id="Error1500" Overridable="yes">Prebieha iná inštalácia. Skôr ako budete pokračovať v tejto inštalácii, musíte dokončiť prebiehajúcu inštaláciu.</String>
458 <String Id="Error1501" Overridable="yes">Chyba pri prístupe k zabezpečeným údajom. Skontrolujte, či je Inštalátor systému Windows správne nakonfigurovaný, a zopakujte inštaláciu.</String>
459 <String Id="Error1502" Overridable="yes">Používateľ [2] už skôr inicioval inštaláciu produktu [3]. Pred použitím tohto produktu bude musieť znova spustiť inštaláciu. Teraz bude pokračovať aktuálna inštalácia.</String>
460 <String Id="Error1503" Overridable="yes">Používateľ [2] už skôr inicioval inštaláciu produktu [3]. Pred použitím tohto produktu bude musieť znova spustiť inštaláciu.</String>
461 <String Id="Error1601" Overridable="yes">Nedostatok voľného miesta na disku vo zväzku [2]; požadované miesto: [3] kB; voľné miesto: [4] kB. Uvoľnite miesto na disku a skúste to znova.</String>
462 <String Id="Error1602" Overridable="yes">Naozaj chcete zrušiť operáciu?</String>
463 <String Id="Error1603" Overridable="yes">Súbor [2][3] používa{ nasledujúci proces: názov: [4], identifikácia: [5], názov okna: [6]}. Ukončite túto aplikáciu a skúste to znova.</String>
464 <String Id="Error1604" Overridable="yes">Tento produkt nemožno nainštalovať, pretože už je nainštalovaný produkt [2]. Tieto dva produkty sú nekompatibilné.</String>
465 <String Id="Error1605" Overridable="yes">Na disku vo zväzku [2] nie je dostatok voľného miesta, aby bolo možné pokračovať v inštalácii so zapnutou funkciou obnovenia. Požadované miesto je [3] kB, ale k dispozícii je iba [4] kB. Ak chcete pokračovať v inštalácii bez ukladania informácií na obnovenie, kliknite na tlačidlo Ignorovať. Ak chcete znova skontrolovať voľné miesto, kliknite na tlačidlo Znova. Ak chcete ukončiť inštaláciu, kliknite na tlačidlo Zrušiť.</String>
466 <String Id="Error1606" Overridable="yes">Nepodarilo sa získať prístup k umiestneniu v sieti [2].</String>
467 <String Id="Error1607" Overridable="yes">Pred pokračovaním v inštalácii by ste mali ukončiť nasledujúce aplikácie:</String>
468 <String Id="Error1608" Overridable="yes">V počítači sa nenašli žiadne vyhovujúce nainštalované produkty na inštaláciu tohto produktu.</String>
469 <String Id="Error1609" Overridable="yes">Pri použití nastavení zabezpečenia sa vyskytla chyba. [2] nie je platný používateľ alebo skupina. Príčinou môže byť problém s balíkom alebo pripojením k radiču domény siete. Skontrolujte pripojenie k sieti a kliknite na tlačidlo Znova. Ak chcete ukončiť inštaláciu, kliknite na tlačidlo Zrušiť. {{Nemožno nájsť identifikátor zabezpečenia SID používateľa. Systémová chyba [3]}}</String>
470 <String Id="Error1701" Overridable="yes">Kľúč [2] nie je platný. Overte, či ste zadali správny kľúč.</String>
471 <String Id="Error1702" Overridable="yes">Konfigurácia programu [2] môže pokračovať až po reštartovaní systému inštalátorom. Ak chcete reštartovať počítač, kliknite na tlačidlo Áno. Ak chcete reštartovať počítač neskôr manuálne, kliknite na tlačidlo Nie.</String>
472 <String Id="Error1703" Overridable="yes">Zmeny konfigurácie programu [2] sa prejavia až po reštartovaní systému. Ak chcete reštartovať počítač, kliknite na tlačidlo Áno. Ak chcete reštartovať počítač neskôr manuálne, kliknite na tlačidlo Nie.</String>
473 <String Id="Error1704" Overridable="yes">Inštalácia programu [2] je momentálne prerušená. Ak chcete pokračovať, musíte vrátiť zmeny uskutočnené pri inštalácii. Chcete vrátiť zmeny?</String>
474 <String Id="Error1705" Overridable="yes">Prebieha predchádzajúca inštalácia tohto produktu. Ak chcete pokračovať, musíte vrátiť zmeny uskutočnené pri inštalácii. Chcete vrátiť zmeny?</String>
475 <String Id="Error1706" Overridable="yes">Inštalačný balík pre produkt [2] nemožno nájsť. Skúste zopakovať inštaláciu pomocou platnej kópie inštalačného balíka [3].</String>
476 <String Id="Error1707" Overridable="yes">Inštalácia bola úspešne dokončená.</String>
477 <String Id="Error1708" Overridable="yes">Inštalácia zlyhala.</String>
478 <String Id="Error1709" Overridable="yes">Produkt: [2] – [3]</String>
479 <String Id="Error1710" Overridable="yes">Môžete obnoviť pôvodný stav počítača alebo pokračovať v inštalácii neskôr. Chcete obnoviť pôvodný stav?</String>
480 <String Id="Error1711" Overridable="yes">Pri zapisovaní informácií o inštalácii na disk sa vyskytla chyba. Skontrolujte, či je na disku dostatok voľného miesta, a potom kliknite na tlačidlo Znova. Ak chcete ukončiť inštaláciu, kliknite na tlačidlo Zrušiť.</String>
481 <String Id="Error1712" Overridable="yes">Niektoré súbory potrebné na obnovenie predchádzajúceho stavu počítača sa nenašli. Obnovenie nie je možné.</String>
482 <String Id="Error1713" Overridable="yes">Program [2] nemôže nainštalovať jeden z požadovaných produktov. Obráťte sa na pracovníkov technickej podpory. {{Systémová chyba: [3].}}</String>
483 <String Id="Error1714" Overridable="yes">Nemožno odstrániť staršiu verziu programu [2]. Obráťte sa na pracovníkov technickej podpory. {{Systémová chyba [3].}}</String>
484 <String Id="Error1715" Overridable="yes">Nainštalované: [2]</String>
485 <String Id="Error1716" Overridable="yes">Nakonfigurované: [2]</String>
486 <String Id="Error1717" Overridable="yes">Odstránené: [2]</String>
487 <String Id="Error1718" Overridable="yes">Súbor [2] bol odmietnutý politikou digitálnych podpisov.</String>
488 <String Id="Error1719" Overridable="yes">Službu Inštalátora systému Windows nemožno spustiť. Táto chyba sa môže vyskytnúť, ak systém Windows pracuje v núdzovom režime alebo ak Inštalátor systému Windows nie je správne nainštalovaný. O pomoc požiadajte pracovníkov technickej podpory.</String>
489 <String Id="Error1720" Overridable="yes">Vyskytol sa problém s balíkom Inštalátora systému Windows. Skript požadovaný na dokončenie inštalácie sa nepodarilo spustiť. Obráťte sa na pracovníkov technickej podpory alebo dodávateľa balíka. {{Vlastná akcia [2], chyba skriptu [3], [4]: [5] riadok [6], stĺpec [7], [8] }}</String>
490 <String Id="Error1721" Overridable="yes">Vyskytol sa problém s balíkom Inštalátora systému Windows. Program požadovaný na dokončenie inštalácie sa nepodarilo spustiť. Obráťte sa na pracovníkov technickej podpory alebo dodávateľa balíka. {{Akcia: [2], umiestnenie: [3], príkaz: [4] }}</String>
491 <String Id="Error1722" Overridable="yes">Vyskytol sa problém s balíkom Inštalátora systému Windows. Program spustený ako súčasť inštalácie sa nedokončil podľa očakávania. Obráťte sa na pracovníkov technickej podpory alebo dodávateľa balíka. {{Akcia: [2], umiestnenie: [3], príkaz: [4] }}</String>
492 <String Id="Error1723" Overridable="yes">Vyskytol sa problém s balíkom Inštalátora systému Windows. Nepodarilo sa spustiť knižnicu DLL požadovanú na dokončenie inštalácie. Obráťte sa na pracovníkov technickej podpory alebo dodávateľa balíka. {{Akcia: [2], položka: [3], knižnica: [4] }}</String>
493 <String Id="Error1724" Overridable="yes">Odstránenie bolo úspešne dokončené.</String>
494 <String Id="Error1725" Overridable="yes">Odstránenie zlyhalo.</String>
495 <String Id="Error1726" Overridable="yes">Uverejnenie oznámenia bolo úspešne dokončené.</String>
496 <String Id="Error1727" Overridable="yes">Uverejnenie oznámenia zlyhalo.</String>
497 <String Id="Error1728" Overridable="yes">Konfigurácia bola úspešne dokončená.</String>
498 <String Id="Error1729" Overridable="yes">Konfigurácia zlyhala.</String>
499 <String Id="Error1730" Overridable="yes">Túto aplikáciu môžete odstrániť, iba ak ste správca. Ak chcete odstrániť túto aplikáciu, môžete sa prihlásiť ako správca alebo sa obráťte na pracovníkov technickej podpory.</String>
500 <String Id="Error1731" Overridable="yes">Zdrojový inštalačný balík pre produkt [2] nie je zosynchronizovaný s klientskym balíkom. Skúste zopakovať inštaláciu pomocou platnej kópie inštalačného balíka [3].</String>
501 <String Id="Error1732" Overridable="yes">Ak chcete dokončiť inštaláciu produktu [2], musíte reštartovať počítač. V tomto počítači sú momentálne prihlásení ďalší používatelia a reštartovaním by mohli stratiť svoju prácu. Chcete reštartovať počítač?</String>
502 <String Id="Error1801" Overridable="yes">Cesta [2] nie je platná. Zadajte platnú cestu.</String>
503 <String Id="Error1802" Overridable="yes">Nedostatok pamäte. Pred opakovaním operácie ukončite ostatné aplikácie.</String>
504 <String Id="Error1803" Overridable="yes">V jednotke [2] nie je disk. Vložte disk a kliknite na tlačidlo Znova. Ak sa chcete vrátiť na predchádzajúci zväzok, kliknite na tlačidlo Zrušiť.</String>
505 <String Id="Error1804" Overridable="yes">V jednotke [2] nie je disk. Vložte disk a kliknite na tlačidlo Znova. Ak sa chcete vrátiť do dialógového okna pre prehľadávanie a vybrať iný zväzok, kliknite na tlačidlo Zrušiť.</String>
506 <String Id="Error1805" Overridable="yes">Priečinok [2] neexistuje. Zadajte cestu k existujúcemu priečinku.</String>
507 <String Id="Error1806" Overridable="yes">Nemáte dostatočné oprávnenia na čítanie tohto priečinka.</String>
508 <String Id="Error1807" Overridable="yes">Nepodarilo sa určiť platný cieľový priečinok pre inštaláciu.</String>
509 <String Id="Error1901" Overridable="yes">Chyba pri pokuse o čítanie zo zdrojovej inštalačnej databázy [2].</String>
510 <String Id="Error1902" Overridable="yes">Plánuje sa operácia reštartovania: názov súboru sa mení z [2] na [3]. Ak chcete dokončiť operáciu, musíte reštartovať počítač.</String>
511 <String Id="Error1903" Overridable="yes">Plánuje sa operácia reštartovania: odstraňuje sa súbor [2]. Ak chcete dokončiť operáciu, musíte reštartovať počítač.</String>
512 <String Id="Error1904" Overridable="yes">Nepodarilo sa zaregistrovať modul [2]. HRESULT [3]. Obráťte sa na pracovníkov technickej podpory.</String>
513 <String Id="Error1905" Overridable="yes">Nepodarilo sa zrušiť registráciu modulu [2]. HRESULT [3]. Obráťte sa na pracovníkov technickej podpory.</String>
514 <String Id="Error1906" Overridable="yes">Uloženie balíka [2] do vyrovnávacej pamäte zlyhalo. Chyba: [3]. Obráťte sa na pracovníkov technickej podpory.</String>
515 <String Id="Error1907" Overridable="yes">Písmo [2] nemožno zaregistrovať. Overte, či máte dostatočné povolenia na inštaláciu písiem a či systém podporuje toto písmo.</String>
516 <String Id="Error1908" Overridable="yes">Nepodarilo sa zrušiť registráciu písma [2]. Overte, či máte dostatočné povolenia na odstraňovanie písiem.</String>
517 <String Id="Error1909" Overridable="yes">Odkaz [2] nemožno vytvoriť. Overte, či cieľový priečinok existuje a či k nemu máte prístup.</String>
518 <String Id="Error1910" Overridable="yes">Odkaz [2] nemožno odstrániť. Overte, či súbor odkazu existuje a či k nemu máte prístup.</String>
519 <String Id="Error1911" Overridable="yes">Nepodarilo sa zaregistrovať knižnicu typov pre súbor [2]. Obráťte sa na pracovníkov technickej podpory.</String>
520 <String Id="Error1912" Overridable="yes">Nepodarilo sa zrušiť registráciu knižnice typov pre súbor [2]. Obráťte sa na pracovníkov technickej podpory.</String>
521 <String Id="Error1913" Overridable="yes">Súbor INI [2][3] sa nepodarilo aktualizovať. Overte, či súbor existuje a či k nemu máte prístup.</String>
522 <String Id="Error1914" Overridable="yes">Nahradenie súboru [3] súborom [2] pri reštartovaní sa nepodarilo naplánovať. Overte, či máte povolenia na zápis do súboru [3].</String>
523 <String Id="Error1915" Overridable="yes">Pri odstraňovaní správcu ovládačov ODBC sa vyskytla chyba ODBC [2]: [3]. Obráťte sa na pracovníkov technickej podpory.</String>
524 <String Id="Error1916" Overridable="yes">Pri inštalácii správcu ovládačov ODBC sa vyskytla chyba ODBC [2]: [3]. Obráťte sa na pracovníkov technickej podpory.</String>
525 <String Id="Error1917" Overridable="yes">Pri odstraňovaní ovládača ODBC [4] sa vyskytla chyba ODBC [2]: [3]. Overte, či máte dostatočné oprávnenia na odstraňovanie ovládačov ODBC.</String>
526 <String Id="Error1918" Overridable="yes">Pri inštalácii ovládača ODBC [4] sa vyskytla chyba ODBC [2]: [3]. Overte, či súbor [4] existuje a či k nemu máte prístup.</String>
527 <String Id="Error1919" Overridable="yes">Pri konfigurácii zdroja údajov ODBC [4] sa vyskytla chyba ODBC [2]: [3]. Overte, či súbor [4] existuje a či k nemu máte prístup.</String>
528 <String Id="Error1920" Overridable="yes">Službu [2] ([3]) sa nepodarilo spustiť. Overte, či máte dostatočné oprávnenia na spustenie systémových služieb.</String>
529 <String Id="Error1921" Overridable="yes">Službu [2] ([3]) sa nepodarilo zastaviť. Overte, či máte dostatočné oprávnenia na zastavenie systémových služieb.</String>
530 <String Id="Error1922" Overridable="yes">Službu [2] ([3]) sa nepodarilo odstrániť. Overte, či máte dostatočné oprávnenia na odstraňovanie systémových služieb.</String>
531 <String Id="Error1923" Overridable="yes">Službu [2] ([3]) sa nepodarilo nainštalovať. Overte, či máte dostatočné oprávnenia na inštaláciu systémových služieb.</String>
532 <String Id="Error1924" Overridable="yes">Premennú prostredia [2] sa nepodarilo aktualizovať. Overte, či máte dostatočné oprávnenia na zmenu premenných prostredia.</String>
533 <String Id="Error1925" Overridable="yes">Nemáte dostatočné oprávnenia na dokončenie inštalácie pre všetkých používateľov tohto počítača. Prihláste sa ako správca a zopakujte túto inštaláciu.</String>
534 <String Id="Error1926" Overridable="yes">Nepodarilo sa nastaviť zabezpečenie súboru [3]. Chyba: [2]. Overte, či máte dostatočné oprávnenia na zmenu povolení zabezpečenia pre tento súbor.</String>
535 <String Id="Error1927" Overridable="yes">V tomto počítači nie sú nainštalované služby súčastí (COM+ 1.0), ktoré sa požadujú na úspešné dokončenie inštalácie. Služby súčastí sú k dispozícii v systéme Windows 2000.</String>
536 <String Id="Error1928" Overridable="yes">Chyba pri registrácii aplikácie COM+. Ďalšie informácie vám poskytnú pracovníci technickej podpory.</String>
537 <String Id="Error1929" Overridable="yes">Chyba pri rušení registrácie aplikácie COM+. Ďalšie informácie vám poskytnú pracovníci technickej podpory.</String>
538 <String Id="Error1930" Overridable="yes">Popis služby [2] ([3]) nemožno zmeniť.</String>
539 <String Id="Error1931" Overridable="yes">Služba Inštalátora systému Windows nemôže aktualizovať systémový súbor [2], pretože je chránený systémom Windows. Pravdepodobne budete musieť aktualizovať operačný systém, aby tento program správne pracoval. {{Verzia balíka: [3], verzia chránená operačným systémom: [4]}}</String>
540 <String Id="Error1932" Overridable="yes">Služba Inštalátora systému Windows nemôže aktualizovať chránený súbor [2] systému Windows. {{Verzia balíka: [3], verzia chránená operačným systémom: [4], chyba SFP: [5]}}</String>
541 <String Id="Error1933" Overridable="yes">Služba Inštalátora systému Windows nemôže aktualizovať niektoré chránené súbory systému Windows. {{Chyba SFP: [2]. Zoznam chránených súborov:\r\n[3]}}</String>
542 <String Id="Error1934" Overridable="yes">Používateľské inštalácie sú zakázané politikou v počítači.</String>
543 <String Id="Error1935" Overridable="yes">Počas inštalácie zostavy [6] sa vyskytla chyba. Ďalšie informácie nájdete v časti Pomoc a technická podpora. HRESULT: [3]. {{Rozhranie zostavy: [4], funkcia: [5], súčasť: [2]}}</String>
544 <String Id="Error1936" Overridable="yes">Počas inštalácie zostavy [6] sa vyskytla chyba. Zostava nemá silný názov alebo na jej podpísanie nebol použitý kľúč s požadovanou minimálnou dĺžkou. HRESULT: [3]. {{Rozhranie zostavy: [4], funkcia: [5], súčasť: [2]}}</String>
545 <String Id="Error1937" Overridable="yes">Počas inštalácie zostavy [6] sa vyskytla chyba. Podpis alebo katalóg sa nepodarilo overiť alebo nie je platný. HRESULT: [3]. {{Rozhranie zostavy: [4], funkcia: [5], súčasť: [2]}}</String>
546 <String Id="Error1938" Overridable="yes">Počas inštalácie zostavy [6] sa vyskytla chyba. Nenašli sa niektoré moduly zostavy. HRESULT: [3]. {{Rozhranie zostavy: [4], funkcia: [5], súčasť: [2]}}</String>
547
548 <String Id="UITextbytes" Overridable="yes">B</String>
549 <String Id="UITextGB" Overridable="yes">GB</String>
550 <String Id="UITextKB" Overridable="yes">kB</String>
551 <String Id="UITextMB" Overridable="yes">MB</String>
552 <String Id="UITextMenuAbsent" Overridable="yes">Celá súčasť bude nedostupná</String>
553 <String Id="UITextMenuAdvertise" Overridable="yes">Súčasť sa nainštaluje v prípade potreby</String>
554 <String Id="UITextMenuAllCD" Overridable="yes">Celá súčasť sa nainštaluje na spúšťanie z disku CD</String>
555 <String Id="UITextMenuAllLocal" Overridable="yes">Celá súčasť sa nainštaluje na lokálny pevný disk</String>
556 <String Id="UITextMenuAllNetwork" Overridable="yes">Celá súčasť sa nainštaluje na spúšťanie zo siete</String>
557 <String Id="UITextMenuCD" Overridable="yes">Nainštaluje sa na spúšťanie z disku CD</String>
558 <String Id="UITextMenuLocal" Overridable="yes">Nainštaluje sa na lokálny pevný disk</String>
559 <String Id="UITextMenuNetwork" Overridable="yes">Nainštaluje sa na spúšťanie zo siete</String>
560 <String Id="UITextNewFolder" Overridable="yes">Priečinok|Nový priečinok</String>
561 <String Id="UITextScriptInProgress" Overridable="yes">Zhromažďujú sa požadované informácie...</String>
562 <String Id="UITextSelAbsentAbsent" Overridable="yes">Táto súčasť zostane nenainštalovaná</String>
563 <String Id="UITextSelAbsentAdvertise" Overridable="yes">Táto súčasť sa nainštaluje v prípade potreby</String>
564 <String Id="UITextSelAbsentCD" Overridable="yes">Táto súčasť sa nainštaluje na spúšťanie z disku CD</String>
565 <String Id="UITextSelAbsentLocal" Overridable="yes">Táto súčasť sa nainštaluje na lokálny pevný disk</String>
566 <String Id="UITextSelAbsentNetwork" Overridable="yes">Táto súčasť sa nainštaluje na spúšťanie zo siete</String>
567 <String Id="UITextSelAdvertiseAbsent" Overridable="yes">Táto súčasť nebude k dispozícii</String>
568 <String Id="UITextSelAdvertiseAdvertise" Overridable="yes">Nainštaluje sa v prípade potreby</String>
569 <String Id="UITextSelAdvertiseCD" Overridable="yes">Táto súčasť sa bude spúšťať z disku CD</String>
570 <String Id="UITextSelAdvertiseLocal" Overridable="yes">Táto súčasť sa nainštaluje na lokálny pevný disk</String>
571 <String Id="UITextSelAdvertiseNetwork" Overridable="yes">Táto súčasť sa bude spúšťať zo siete</String>
572 <String Id="UITextSelCDAbsent" Overridable="yes">Táto súčasť sa úplne odinštaluje a nebudete ju môcť spúšťať z disku CD</String>
573 <String Id="UITextSelCDAdvertise" Overridable="yes">Táto súčasť sa už nebude spúšťať z disku CD, ale sa nainštaluje v prípade potreby</String>
574 <String Id="UITextSelCDCD" Overridable="yes">Táto súčasť sa bude dať spúšťať z disku CD</String>
575 <String Id="UITextSelCDLocal" Overridable="yes">Táto súčasť sa už nebude spúšťať z disku CD, ale sa nainštaluje na lokálny pevný disk</String>
576 <String Id="UITextSelChildCostNeg" Overridable="yes">Táto súčasť uvoľní [1] na pevnom disku.</String>
577 <String Id="UITextSelChildCostPos" Overridable="yes">Táto súčasť vyžaduje [1] na pevnom disku.</String>
578 <String Id="UITextSelCostPending" Overridable="yes">Kompilujú sa údaje o prostriedkoch požadovaných pre túto súčasť...</String>
579 <String Id="UITextSelLocalAbsent" Overridable="yes">Táto súčasť sa úplne odstráni</String>
580 <String Id="UITextSelLocalAdvertise" Overridable="yes">Táto súčasť sa odstráni z lokálneho pevného disku, v prípade potreby sa však nainštaluje</String>
581 <String Id="UITextSelLocalCD" Overridable="yes">Táto súčasť sa odstráni z lokálneho pevného disku, ale bude sa dať spúšťať z disku CD</String>
582 <String Id="UITextSelLocalLocal" Overridable="yes">Táto súčasť zostane na lokálnom pevnom disku</String>
583 <String Id="UITextSelLocalNetwork" Overridable="yes">Táto súčasť sa odstráni z lokálneho pevného disku, ale bude sa dať spúšťať zo siete</String>
584 <String Id="UITextSelNetworkAbsent" Overridable="yes">Táto súčasť sa úplne odinštaluje a nebudete ju môcť spúšťať zo siete</String>
585 <String Id="UITextSelNetworkAdvertise" Overridable="yes">Táto súčasť sa už nebude spúšťať zo siete, v prípade potreby sa však nainštaluje</String>
586 <String Id="UITextSelNetworkLocal" Overridable="yes">Táto súčasť sa už nebude spúšťať zo siete, ale sa nainštaluje na lokálny pevný disk</String>
587 <String Id="UITextSelNetworkNetwork" Overridable="yes">Táto súčasť sa bude dať spúšťať zo siete</String>
588 <String Id="UITextSelParentCostNegNeg" Overridable="yes">Táto súčasť uvoľní [1] na pevnom disku. Obsahuje [2] z [3] vybratých vedľajších súčastí. Vedľajšie súčasti uvoľnia [4] na pevnom disku.</String>
589 <String Id="UITextSelParentCostNegPos" Overridable="yes">Táto súčasť uvoľní [1] na pevnom disku. Obsahuje [2] z [3] vybratých vedľajších súčastí. Vedľajšie súčasti vyžadujú [4] na pevnom disku.</String>
590 <String Id="UITextSelParentCostPosNeg" Overridable="yes">Táto súčasť vyžaduje [1] na pevnom disku. Obsahuje [2] z [3] vybratých vedľajších súčastí. Vedľajšie súčasti uvoľnia [4] na pevnom disku.</String>
591 <String Id="UITextSelParentCostPosPos" Overridable="yes">Táto súčasť vyžaduje [1] na pevnom disku. Obsahuje [2] z [3] vybratých vedľajších súčastí. Vedľajšie súčasti vyžadujú [4] na pevnom disku.</String>
592 <String Id="UITextTimeRemaining" Overridable="yes">Zostávajúci čas: {[1] min. }{[2] s}</String>
593 <String Id="UITextVolumeCostAvailable" Overridable="yes">K dispozícii</String>
594 <String Id="UITextVolumeCostDifference" Overridable="yes">Rozdiel</String>
595 <String Id="UITextVolumeCostRequired" Overridable="yes">Požadované</String>
596 <String Id="UITextVolumeCostSize" Overridable="yes">Veľkosť disku</String>
597 <String Id="UITextVolumeCostVolume" Overridable="yes">Zväzok</String>
598</WixLocalization>
diff --git a/src/ext/UI/wixlib/WixUI_sl-SI.wxl b/src/ext/UI/wixlib/WixUI_sl-SI.wxl
new file mode 100644
index 00000000..492e2252
--- /dev/null
+++ b/src/ext/UI/wixlib/WixUI_sl-SI.wxl
@@ -0,0 +1,598 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3
4
5<WixLocalization Culture="sl-si" Codepage="1250" xmlns="http://wixtoolset.org/schemas/v4/wxl">
6 <String Id="WixUIBack" Overridable="yes">&amp;Nazaj</String>
7 <String Id="WixUINext" Overridable="yes">&amp;Naprej</String>
8 <String Id="WixUICancel" Overridable="yes">Prekliči</String>
9 <String Id="WixUIFinish" Overridable="yes">&amp;Dokončaj</String>
10 <String Id="WixUIRetry" Overridable="yes">&amp;Poskusi znova</String>
11 <String Id="WixUIIgnore" Overridable="yes">&amp;Prezri</String>
12 <String Id="WixUIYes" Overridable="yes">&amp;Da</String>
13 <String Id="WixUINo" Overridable="yes">&amp;Ne</String>
14 <String Id="WixUIOK" Overridable="yes">V redu</String>
15 <String Id="WixUIPrint" Overridable="yes">&amp;Natisni</String>
16
17 <String Id="AdvancedWelcomeEulaDlg_Title" Overridable="yes">Namestitev programa [ProductName]</String>
18 <String Id="AdvancedWelcomeEulaDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
19 <String Id="AdvancedWelcomeEulaDlgTitle" Overridable="yes">{\WixUI_Font_Title}Preberite licenčno pogodbo za [ProductName]</String>
20 <String Id="AdvancedWelcomeEulaDlgLicenseAcceptedCheckBox" Overridable="yes">Sprejmem &amp;pogoje licenčne pogodbe</String>
21 <String Id="AdvancedWelcomeEulaDlgDescriptionPerMachine" Overridable="yes">Kliknite »Namesti«, da namestite izdelek s privzetimi možnostmi za vse uporabnike. Kliknite »Dodatno«, če želite spremeniti možnosti namestitve.</String>
22 <String Id="AdvancedWelcomeEulaDlgDescriptionPerUser" Overridable="yes">Kliknite »Namesti«, da namestite izdelek s privzetimi možnostmi le zase. Kliknite »Dodatno«, če želite spremeniti možnosti namestitve.</String>
23 <String Id="AdvancedWelcomeEulaDlgInstall" Overridable="yes">&amp;Namesti</String>
24 <String Id="AdvancedWelcomeEulaDlgAdvanced" Overridable="yes">D&amp;odatno</String>
25 <String Id="Advanced_Font_Normal_Size" Overridable="yes">8</String>
26 <String Id="Advanced_Font_Bigger_Size" Overridable="yes">12</String>
27 <String Id="Advanced_Font_Title_Size" Overridable="yes">9</String>
28 <String Id="Advanced_Font_Emphasized_Size" Overridable="yes">8</String>
29 <String Id="Advanced_Font_FaceName" Overridable="yes">Tahoma</String>
30
31 <String Id="BrowseDlg_Title" Overridable="yes">Namestitev programa [ProductName]</String>
32 <String Id="BrowseDlgComboLabel" Overridable="yes">&amp;Išči v:</String>
33 <String Id="BrowseDlgWixUI_Bmp_Up" Overridable="yes">WixUI_Bmp_Up</String>
34 <String Id="BrowseDlgWixUI_Bmp_UpTooltip" Overridable="yes">V nadrejeno mapo</String>
35 <String Id="BrowseDlgNewFolder" Overridable="yes">WixUI_Bmp_New</String>
36 <String Id="BrowseDlgNewFolderTooltip" Overridable="yes">Ustvari novo mapo</String>
37 <String Id="BrowseDlgPathLabel" Overridable="yes">&amp;Ime mape:</String>
38 <String Id="BrowseDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
39 <String Id="BrowseDlgDescription" Overridable="yes">Prebrskajte do ciljne mape</String>
40 <String Id="BrowseDlgTitle" Overridable="yes">{\WixUI_Font_Title}Spremeni ciljno mapo</String>
41
42 <String Id="CancelDlg_Title" Overridable="yes">Namestitev programa [ProductName]</String>
43 <String Id="CancelDlgText" Overridable="yes">Ali ste prepričani, da želite preklicati namestitev programa [ProductName]?</String>
44 <String Id="CancelDlgIcon" Overridable="yes">WixUI_Ico_Info</String>
45 <String Id="CancelDlgIconTooltip" Overridable="yes">Ikona informacij</String>
46
47 <String Id="CustomizeDlg_Title" Overridable="yes">Namestitev programa [ProductName]</String>
48 <String Id="CustomizeDlgTree" Overridable="yes">Drevo z izbirami</String>
49 <String Id="CustomizeDlgBrowse" Overridable="yes">Preb&amp;rskaj ...</String>
50 <String Id="CustomizeDlgReset" Overridable="yes">Po&amp;nastavi</String>
51 <String Id="CustomizeDlgDiskCost" Overridable="yes">Uporaba disk&amp;a</String>
52 <String Id="CustomizeDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
53 <String Id="CustomizeDlgText" Overridable="yes">Kliknite ikone v spodnji drevesni strukturi, da spremenite način namestitve funkcij.</String>
54 <String Id="CustomizeDlgDescription" Overridable="yes">Izberite način namestitve funkcij.</String>
55 <String Id="CustomizeDlgTitle" Overridable="yes">{\WixUI_Font_Title}Namestitev po meri</String>
56 <String Id="CustomizeDlgItemDescription" Overridable="yes">CustomizeDlgItemDescription-CustomizeDlgItemDescription</String>
57 <String Id="CustomizeDlgItemSize" Overridable="yes">CustomizeDlgItemSize-CustomizeDlgItemSize</String>
58 <String Id="CustomizeDlgLocation" Overridable="yes">CustomizeDlgLocation-CustomizeDlgLocation</String>
59 <String Id="CustomizeDlgLocationLabel" Overridable="yes">Lokacija:</String>
60
61 <String Id="DiskCostDlg_Title" Overridable="yes">Namestitev programa [ProductName]</String>
62 <String Id="DiskCostDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
63 <String Id="DiskCostDlgText" Overridable="yes">Za označene nosilce ni na voljo dovolj prostora na disku za izbrane funkcije. Z označenih nosilcev lahko odstranite nekatere datoteke ali nanje namestite manj funkcij ali pa izberete druge pogone.</String>
64 <String Id="DiskCostDlgDescription" Overridable="yes">Prostor na disku, ki ga potrebujete za namestitev izbranih funkcij.</String>
65 <String Id="DiskCostDlgTitle" Overridable="yes">{\WixUI_Font_Title}Potreben prostor na disku</String>
66 <String Id="DiskCostDlgVolumeList" Overridable="yes">{120}{70}{70}{70}{70}</String>
67
68 <String Id="ErrorDlg_Title" Overridable="yes">Namestitev programa [ProductName]</String>
69 <String Id="ErrorDlgErrorText" Overridable="yes">Besedilo z informacijami</String>
70 <String Id="ErrorDlgErrorIcon" Overridable="yes">WixUI_Ico_Info</String>
71 <String Id="ErrorDlgErrorIconTooltip" Overridable="yes">Ikona informacij</String>
72
73 <String Id="ExitDialog_Title" Overridable="yes">Namestitev programa [ProductName]</String>
74 <String Id="ExitDialogBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
75 <String Id="ExitDialogDescription" Overridable="yes">Če želite zapreti čarovnika za namestitev, kliknite gumb »Dokončaj«.</String>
76 <String Id="ExitDialogTitle" Overridable="yes">{\WixUI_Font_Bigger}Čarovnik za namestitev programa [ProductName] je dokončan</String>
77
78 <String Id="FatalError_Title" Overridable="yes">Namestitev programa [ProductName]</String>
79 <String Id="FatalErrorBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
80 <String Id="FatalErrorTitle" Overridable="yes">{\WixUI_Font_Bigger}Čarovnik za namestitev programa [ProductName] se je predčasno končal</String>
81 <String Id="FatalErrorDescription1" Overridable="yes">Čarovnik za namestitev programa [ProductName] se je zaradi napake predčasno končal. Sistem ni bil spremenjen. Če želite program namestiti pozneje, znova zaženite čarovnika za namestitev.</String>
82 <String Id="FatalErrorDescription2" Overridable="yes">Če želite zapreti čarovnika za namestitev, kliknite gumb »Dokončaj«.</String>
83
84 <String Id="FeaturesDlg_Title" Overridable="yes">Namestitev programa [ProductName]</String>
85 <String Id="FeaturesDlgTree" Overridable="yes">Funkcije izdelka</String>
86 <String Id="FeaturesDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
87 <String Id="FeaturesDlgDescription" Overridable="yes">Izberite način namestitve funkcij.</String>
88 <String Id="FeaturesDlgTitle" Overridable="yes">{\WixUI_Font_Title}Funkcije izdelka</String>
89 <String Id="FeaturesDlgItemDescription" Overridable="yes">FeaturesDlgItemDescription</String>
90 <String Id="FeaturesDlgItemSize" Overridable="yes">FeaturesDlgItemSize</String>
91 <String Id="FeaturesDlgInstall" Overridable="yes">&amp;Namesti</String>
92 <String Id="FeaturesDlgChange" Overridable="yes">&amp;Spremeni</String>
93
94 <String Id="FilesInUse_Title" Overridable="yes">Namestitev programa [ProductName]</String>
95 <String Id="FilesInUseExit" Overridable="yes">I&amp;zhod</String>
96 <String Id="FilesInUseBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
97 <String Id="FilesInUseText" Overridable="yes">Te programi uporabljajo datoteke, ki jih je treba posodobiti pri tej namestitvi. Zaprite te programe in nato kliknite »&amp;Poskusi znova«, da nadaljujete z namestitvijo, ali »Izhod«, če jo želite zapreti.</String>
98 <String Id="FilesInUseDescription" Overridable="yes">Nekatere datoteke, ki jih je treba posodobiti, so trenutno v uporabi.</String>
99 <String Id="FilesInUseTitle" Overridable="yes">{\WixUI_Font_Title}Datoteke v uporabi</String>
100
101 <String Id="InstallDirDlg_Title" Overridable="yes">Namestitev programa [ProductName]</String>
102 <String Id="InstallDirDlgChange" Overridable="yes">&amp;Spremeni...</String>
103 <String Id="InstallDirDlgTitle" Overridable="yes">{\WixUI_Font_Title}Ciljna mapa</String>
104 <String Id="InstallDirDlgDescription" Overridable="yes">Kliknite »Naprej«, da izvedete namestitev v privzeto mapo ali kliknite »Spremeni«, če želite izbrati drugo mapo.</String>
105 <String Id="InstallDirDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
106 <String Id="InstallDirDlgFolderLabel" Overridable="yes">Namesti [ProductName] v:</String>
107
108 <String Id="InstallScopeDlg_Title" Overridable="yes">Namestitev programa [ProductName]</String>
109 <String Id="InstallScopeDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
110 <String Id="InstallScopeDlgDescription" Overridable="yes">Izberite obseg namestitve in mapo</String>
111 <String Id="InstallScopeDlgTitle" Overridable="yes">{\WixUI_Font_Title}Obseg namestitve</String>
112 <String Id="InstallScopeDlgPerUser" Overridable="yes">{\WixUI_Font_Emphasized}Namestitev &amp;le za osebo ([LogonUser])</String>
113 <String Id="InstallScopeDlgPerUserDescription" Overridable="yes">[ProductName] bo nameščen v mapo za posameznega uporabnika in bo na voljo le za vaš uporabniški račun. Ne potrebujete lokalnih skrbniških pravic.</String>
114 <String Id="InstallScopeDlgNoPerUserDescription" Overridable="yes">[ProductName] ne podpira namestitve za posamezne uporabnike.</String>
115 <String Id="InstallScopeDlgPerMachine" Overridable="yes">{\WixUI_Font_Emphasized}Namesti za vse uporabnike tega &amp;računalnika</String>
116 <String Id="InstallScopeDlgPerMachineDescription" Overridable="yes">[ProductName] bo privzeto nameščen v mapo za računalnike in bo na voljo vsem uporabnikom. Privzeto mapo namestitve lahko spremenite. Potrebujete lokalne skrbniške pravice.</String>
117 <String Id="InstallScopeDlgFolderLabel" Overridable="yes">Namestitvena &amp;mapa:</String>
118 <String Id="InstallScopeDlgChange" Overridable="yes">&amp;Spremeni...</String>
119
120 <String Id="InvalidDirDlg_Title" Overridable="yes">Namestitev programa [ProductName]</String>
121 <String Id="InvalidDirDlgText" Overridable="yes">Namestitveni imenik mora biti na lokalnem trdem disku.</String>
122 <String Id="InvalidDirDlgIcon" Overridable="yes">WixUI_Ico_Info</String>
123 <String Id="InvalidDirDlgIconTooltip" Overridable="yes">Ikona informacij</String>
124
125 <String Id="LicenseAgreementDlg_Title" Overridable="yes">Namestitev programa [ProductName]</String>
126 <String Id="LicenseAgreementDlgLicenseAcceptedCheckBox" Overridable="yes">Sprejmem &amp;pogoje licenčne pogodbe</String>
127 <String Id="LicenseAgreementDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
128 <String Id="LicenseAgreementDlgDescription" Overridable="yes">Pozorno preberite to licenčno pogodbo</String>
129 <String Id="LicenseAgreementDlgTitle" Overridable="yes">{\WixUI_Font_Title}Licenčna pogodba za končnega uporabnika</String>
130
131 <String Id="MaintenanceTypeDlg_Title" Overridable="yes">Namestitev programa [ProductName]</String>
132 <String Id="MaintenanceTypeDlgChangeButton" Overridable="yes">&amp;Spremeni</String>
133 <String Id="MaintenanceTypeDlgChangeButtonTooltip" Overridable="yes">Spremeni namestitev</String>
134 <String Id="MaintenanceTypeDlgRepairButton" Overridable="yes">Po&amp;pravi</String>
135 <String Id="MaintenanceTypeDlgRepairButtonTooltip" Overridable="yes">Popravi namestitev</String>
136 <String Id="MaintenanceTypeDlgRemoveButton" Overridable="yes">&amp;Odstrani</String>
137 <String Id="MaintenanceTypeDlgRemoveButtonTooltip" Overridable="yes">Odstrani namestitev</String>
138 <String Id="MaintenanceTypeDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
139 <String Id="MaintenanceTypeDlgDescription" Overridable="yes">Izberite postopek, ki ga želite izvesti.</String>
140 <String Id="MaintenanceTypeDlgTitle" Overridable="yes">{\WixUI_Font_Title}Spreminjanje, popravljanje ali odstranjevanje namestitve</String>
141 <String Id="MaintenanceTypeDlgChangeText" Overridable="yes">Omogoča spreminjanje načina namestitve funkcij.</String>
142 <String Id="MaintenanceTypeDlgChangeDisabledText" Overridable="yes">[ProductName] nima funkcij, ki bi jih bilo mogoče izbirati neodvisno.</String>
143 <String Id="MaintenanceTypeDlgRemoveText" Overridable="yes">Odstrani program [ProductName] iz računalnika.</String>
144 <String Id="MaintenanceTypeDlgRemoveDisabledText" Overridable="yes">Programa [ProductName] ni mogoče odstraniti.</String>
145 <String Id="MaintenanceTypeDlgRepairText" Overridable="yes">Odpravi napake pri nedavni namestitvi, tako da popravi manjkajoče in poškodovane datoteke, bližnjice in vnose v register.</String>
146 <String Id="MaintenanceTypeDlgRepairDisabledText" Overridable="yes">Programa [ProductName] ni mogoče popraviti.</String>
147
148 <String Id="MaintenanceWelcomeDlg_Title" Overridable="yes">Namestitev programa [ProductName]</String>
149 <String Id="MaintenanceWelcomeDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
150 <String Id="MaintenanceWelcomeDlgDescription" Overridable="yes">S čarovnikom za namestitev lahko spremenite način namestitve funkcij programa [ProductName] v računalnik ali jih odstranite iz računalnika. Če želite nadaljevati, kliknite »Naprej« ali »Prekliči«, če želite zapreti čarovnika za namestitev.</String>
151 <String Id="MaintenanceWelcomeDlgTitle" Overridable="yes">{\WixUI_Font_Bigger}Dobrodošli v čarovniku za namestitev programa [ProductName]</String>
152
153 <String Id="MsiRMFilesInUse_Title" Overridable="yes">Namestitev programa [ProductName]</String>
154 <String Id="MsiRMFilesInUseBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
155 <String Id="MsiRMFilesInUseText" Overridable="yes">Navedeni programi uporabljajo datoteke, ki jih je med to namestitvijo treba posodobiti. Lahko jih zaprete s čarovnikom za namestitev in jih pozneje poskusite znova zagnati ali pa znova zaženete računalnik pozneje.</String>
156 <String Id="MsiRMFilesInUseDescription" Overridable="yes">Nekatere datoteke, ki jih je treba posodobiti, so trenutno v uporabi.</String>
157 <String Id="MsiRMFilesInUseTitle" Overridable="yes">{\WixUI_Font_Title}Datoteke v uporabi</String>
158 <String Id="MsiRMFilesInUseUseRM" Overridable="yes">&amp;Zapri programe in jih poskusi znova zagnati.</String>
159 <String Id="MsiRMFilesInUseDontUseRM" Overridable="yes">&amp;Ne zapri programov. Računalnik bo treba zagnati znova.</String>
160
161 <String Id="OutOfDiskDlg_Title" Overridable="yes">Namestitev programa [ProductName]</String>
162 <String Id="OutOfDiskDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
163 <String Id="OutOfDiskDlgText" Overridable="yes">Na označenih nosilcih ni na voljo dovolj prostora za trenutno izbrane funkcije. Z označenih nosilcev lahko odstranite nekatere datoteke, namestite manj funkcij ali izberite drugi ciljni pogon.</String>
164 <String Id="OutOfDiskDlgDescription" Overridable="yes">Prostor, ki je potreben za namestitev, presega prostor, ki je na voljo na disku.</String>
165 <String Id="OutOfDiskDlgTitle" Overridable="yes">{\WixUI_Font_Title}Zmanjkalo je prostora na disku</String>
166 <String Id="OutOfDiskDlgVolumeList" Overridable="yes">{120}{70}{70}{70}{70}</String>
167
168 <String Id="OutOfRbDiskDlg_Title" Overridable="yes">Namestitev programa [ProductName]</String>
169 <String Id="OutOfRbDiskDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
170 <String Id="OutOfRbDiskDlgText" Overridable="yes">Na označenih nosilcih ni na voljo dovolj prostora za trenutno izbrane funkcije. Z označenih nosilcev lahko odstranite nekatere datoteke, namestite manj funkcij ali izberite drugi ciljni pogon.</String>
171 <String Id="OutOfRbDiskDlgDescription" Overridable="yes">Prostor, ki je potreben za namestitev, presega prostor, ki je na voljo na disku.</String>
172 <String Id="OutOfRbDiskDlgTitle" Overridable="yes">{\WixUI_Font_Title}Zmanjkalo je prostora na disku</String>
173 <String Id="OutOfRbDiskDlgVolumeList" Overridable="yes">{120}{70}{70}{70}{70}</String>
174 <String Id="OutOfRbDiskDlgText2" Overridable="yes">Lahko tudi onemogočite funkcijo razveljavitve namestitvenega programa. Če onemogočite razveljavitev, namestitvenemu programu preprečite obnovitev prvotnega stanja vašega računalnika, če bi prišlo do kakršne koli prekinitve med namestitvijo. Kliknite »Da«, če želite kljub temu onemogočiti razveljavitev.</String>
175
176 <String Id="PrepareDlg_Title" Overridable="yes">Namestitev programa [ProductName]</String>
177 <String Id="PrepareDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
178 <String Id="PrepareDlgDescription" Overridable="yes">Počakajte, da se čarovnik za namestitev pripravi za vodenje po namestitvi.</String>
179 <String Id="PrepareDlgTitle" Overridable="yes">{\WixUI_Font_Bigger}Dobrodošli v čarovniku za namestitev programa [ProductName]</String>
180
181 <String Id="ProgressDlg_Title" Overridable="yes">Namestitev programa [ProductName]</String>
182 <String Id="ProgressDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
183 <String Id="ProgressDlgTextInstalling" Overridable="yes">Počakajte, da čarovnik za namestitev namesti program [ProductName].</String>
184 <String Id="ProgressDlgTitleInstalling" Overridable="yes">{\WixUI_Font_Title}Namestitev programa [ProductName]</String>
185 <String Id="ProgressDlgTextChanging" Overridable="yes">Počakajte, da čarovnik za namestitev spremeni program [ProductName].</String>
186 <String Id="ProgressDlgTitleChanging" Overridable="yes">{\WixUI_Font_Title}Spreminjanje programa [ProductName]</String>
187 <String Id="ProgressDlgTextRepairing" Overridable="yes">Počakajte, da čarovnik za namestitev popravi program [ProductName].</String>
188 <String Id="ProgressDlgTitleRepairing" Overridable="yes">{\WixUI_Font_Title}Popravljanje programa [ProductName]</String>
189 <String Id="ProgressDlgTextRemoving" Overridable="yes">Počakajte, da čarovnik za namestitev odstrani program [ProductName].</String>
190 <String Id="ProgressDlgTitleRemoving" Overridable="yes">{\WixUI_Font_Title}Odstranjevanje programa [ProductName]</String>
191 <String Id="ProgressDlgTextUpdating" Overridable="yes">Počakajte, da čarovnik za namestitev posodobi program [ProductName].</String>
192 <String Id="ProgressDlgTitleUpdating" Overridable="yes">{\WixUI_Font_Title}Posodabljanje programa [ProductName]</String>
193 <String Id="ProgressDlgProgressBar" Overridable="yes">Dokončano</String>
194 <String Id="ProgressDlgStatusLabel" Overridable="yes">Stanje:</String>
195
196 <String Id="ResumeDlg_Title" Overridable="yes">Namestitev programa [ProductName]</String>
197 <String Id="ResumeDlgInstall" Overridable="yes">&amp;Namesti</String>
198 <String Id="ResumeDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
199 <String Id="ResumeDlgDescription" Overridable="yes">Čarovnik za namestitev bo dokončal namestitev programa [ProductName] v računalnik. Če želite nadaljevati, kliknite »Namesti« ali »Prekliči«, če želite zapreti čarovnika za namestitev.</String>
200 <String Id="ResumeDlgTitle" Overridable="yes">{\WixUI_Font_Bigger}Nadaljevanje izvajanja čarovnika za namestitev programa [ProductName]</String>
201
202 <String Id="SetupTypeDlg_Title" Overridable="yes">Namestitev programa [ProductName]</String>
203 <String Id="SetupTypeDlgTypicalButton" Overridable="yes">&amp;Običajna</String>
204 <String Id="SetupTypeDlgTypicalButtonTooltip" Overridable="yes">Običajna namestitev</String>
205 <String Id="SetupTypeDlgCustomButton" Overridable="yes">P&amp;o meri</String>
206 <String Id="SetupTypeDlgCustomButtonTooltip" Overridable="yes">Namestitev po meri</String>
207 <String Id="SetupTypeDlgCompleteButton" Overridable="yes">P&amp;opolna namestitev</String>
208 <String Id="SetupTypeDlgCompleteButtonTooltip" Overridable="yes">Popolna namestitev</String>
209 <String Id="SetupTypeDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
210 <String Id="SetupTypeDlgTitle" Overridable="yes">{\WixUI_Font_Title}Izbira vrste namestitve</String>
211 <String Id="SetupTypeDlgDescription" Overridable="yes">Izberite vrsto namestitve, ki najbolj ustrezna vašim potrebam</String>
212 <String Id="SetupTypeDlgTypicalText" Overridable="yes">Namesti najbolj običajne funkcije programa. Priporočeno za večino uporabnikov.</String>
213 <String Id="SetupTypeDlgCustomText" Overridable="yes">Uporabniku omogoča, da izbere, katere funkcije programa bodo nameščene in kam bodo nameščene. Priporočeno za izkušene uporabnike.</String>
214 <String Id="SetupTypeDlgCompleteText" Overridable="yes">Nameščene bodo vse funkcije programa. Potrebujete največ prostora na disku.</String>
215
216 <String Id="UserExit_Title" Overridable="yes">Namestitev programa [ProductName]</String>
217 <String Id="UserExitBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
218 <String Id="UserExitTitle" Overridable="yes">{\WixUI_Font_Bigger}Čarovnik za namestitev programa [ProductName] je bil prekinjen</String>
219 <String Id="UserExitDescription1" Overridable="yes">Namestitev programa [ProductName] je bila prekinjena. Sistem ni bil spremenjen. Če želite ta program namestiti pozneje, znova zaženite namestitev.</String>
220 <String Id="UserExitDescription2" Overridable="yes">Če želite zapreti čarovnika za namestitev, kliknite gumb »Dokončaj«.</String>
221
222 <String Id="VerifyReadyDlg_Title" Overridable="yes">Namestitev programa [ProductName]</String>
223 <String Id="VerifyReadyDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
224 <String Id="VerifyReadyDlgInstall" Overridable="yes">&amp;Namesti</String>
225 <String Id="VerifyReadyDlgInstallText" Overridable="yes">Kliknite »Namesti«, če želite začeti namestitev. Kliknite »Nazaj«, če želite pregledati ali spremeniti nastavitve namestitve. Kliknite »Prekliči«, če želite zapreti čarovnika.</String>
226 <String Id="VerifyReadyDlgInstallTitle" Overridable="yes">{\WixUI_Font_Title}Pripravljen na namestitev programa [ProductName]</String>
227 <String Id="VerifyReadyDlgChange" Overridable="yes">&amp;Spremeni</String>
228 <String Id="VerifyReadyDlgChangeText" Overridable="yes">Kliknite »Spremeni«, če želite začeti namestitev. Kliknite »Nazaj«, če želite pregledati ali spremeniti nastavitve namestitve. Kliknite »Prekliči«, če želite zapreti čarovnika.</String>
229 <String Id="VerifyReadyDlgChangeTitle" Overridable="yes">{\WixUI_Font_Title}Pripravljen na spreminjanje programa [ProductName]</String>
230 <String Id="VerifyReadyDlgRepair" Overridable="yes">Po&amp;pravi</String>
231 <String Id="VerifyReadyDlgRepairText" Overridable="yes">Kliknite »Popravi«, če želite popraviti namestitev programa [ProductName]. Kliknite »Nazaj«, če želite pregledati ali spremeniti nastavitve namestitve. Kliknite »Prekliči«, če želite zapreti čarovnika.</String>
232 <String Id="VerifyReadyDlgRepairTitle" Overridable="yes">{\WixUI_Font_Title}Pripravljen na popravljanje programa [ProductName]</String>
233 <String Id="VerifyReadyDlgRemove" Overridable="yes">&amp;Odstrani</String>
234 <String Id="VerifyReadyDlgRemoveText" Overridable="yes">Kliknite »Odstrani«, če želite odstraniti program [ProductName] iz računalnika. Kliknite »Nazaj«, če želite pregledati ali spremeniti nastavitve namestitve. Kliknite »Prekliči«, če želite zapreti čarovnika.</String>
235 <String Id="VerifyReadyDlgRemoveTitle" Overridable="yes">{\WixUI_Font_Title}Pripravljen na odstranjevanje programa [ProductName]</String>
236 <String Id="VerifyReadyDlgUpdate" Overridable="yes">&amp;Posodobitev</String>
237 <String Id="VerifyReadyDlgUpdateText" Overridable="yes">Kliknite »Posodobi«, da posodobite [ProductName] v računalniku. Kliknite »Nazaj«, če želite pregledati ali spremeniti katero koli nastavitev namestitve. Kliknite »Prekliči«, če želite zapreti čarovnika.</String>
238 <String Id="VerifyReadyDlgUpdateTitle" Overridable="yes">{\WixUI_Font_Title}Pripravljen na posodobitev programa [ProductName]</String>
239
240 <String Id="WaitForCostingDlg_Title" Overridable="yes">Namestitev programa [ProductName]</String>
241 <String Id="WaitForCostingDlgReturn" Overridable="yes">&amp;Vrni</String>
242 <String Id="WaitForCostingDlgText" Overridable="yes">Počakajte, da namestitveni program ugotovi, koliko prostora na disku bo potrebno.</String>
243 <String Id="WaitForCostingDlgIcon" Overridable="yes">WixUI_Ico_Exclam</String>
244 <String Id="WaitForCostingDlgIconTooltip" Overridable="yes">Ikona klicaja</String>
245
246 <String Id="WelcomeDlg_Title" Overridable="yes">Namestitev programa [ProductName]</String>
247 <String Id="WelcomeDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
248 <String Id="WelcomeDlgDescription" Overridable="yes">Čarovnik za namestitev bo v računalnik namestil [ProductName]. Kliknite »Naprej« za nadaljevanje ali »Prekliči« za izhod iz čarovnika za namestitev.</String>
249 <String Id="WelcomeUpdateDlgDescriptionUpdate" Overridable="yes">Čarovnik za namestitev bo posodobil [ProductName] v računalniku. Kliknite »Naprej«, če želite nadaljevati ali »Prekliči«, če želite zapreti čarovnika za namestitev.</String>
250 <String Id="WelcomeDlgTitle" Overridable="yes">{\WixUI_Font_Bigger}Dobrodošli v čarovniku za namestitev programa [ProductName]</String>
251
252 <String Id="WelcomeEulaDlg_Title" Overridable="yes">Namestitev programa [ProductName]</String>
253 <String Id="WelcomeEulaDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
254 <String Id="WelcomeEulaDlgLicenseAcceptedCheckBox" Overridable="yes">Sprejmem &amp;pogoje licenčne pogodbe</String>
255 <String Id="WelcomeEulaDlgInstall" Overridable="yes">&amp;Namesti</String>
256 <String Id="WelcomeEulaDlgUpdate" Overridable="yes">&amp;Posodobitev</String>
257 <String Id="WelcomeEulaDlgTitle" Overridable="yes">{\WixUI_Font_Title}Preberite licenčno pogodbo za [ProductName]</String>
258
259 <String Id="ProgressTextInstallValidate" Overridable="yes">Preverjanje namestitve</String>
260 <String Id="ProgressTextInstallFiles" Overridable="yes">Kopiranje novih datotek</String>
261 <String Id="ProgressTextInstallFilesTemplate" Overridable="yes">Datoteka: [1], Imenik: [9], Velikost: [6]</String>
262 <String Id="ProgressTextInstallAdminPackage" Overridable="yes">Kopiranje datotek omrežne namestitve</String>
263 <String Id="ProgressTextInstallAdminPackageTemplate" Overridable="yes">Datoteka: [1], Imenik: [9], Velikost: [6]</String>
264 <String Id="ProgressTextFileCost" Overridable="yes">Izračunavanje prostorskih zahtev</String>
265 <String Id="ProgressTextCostInitialize" Overridable="yes">Izračunavanje prostorskih zahtev</String>
266 <String Id="ProgressTextCostFinalize" Overridable="yes">Izračunavanje prostorskih zahtev</String>
267 <String Id="ProgressTextCreateShortcuts" Overridable="yes">Ustvarjanje bližnjic</String>
268 <String Id="ProgressTextCreateShortcutsTemplate" Overridable="yes">Bližnjica: [1]</String>
269 <String Id="ProgressTextPublishComponents" Overridable="yes">Objavljanje kvalificiranih komponent</String>
270 <String Id="ProgressTextPublishComponentsTemplate" Overridable="yes">ID komponente: [1], kvalifikator: [2]</String>
271 <String Id="ProgressTextPublishFeatures" Overridable="yes">Objavljanje funkcij izdelka</String>
272 <String Id="ProgressTextPublishFeaturesTemplate" Overridable="yes">Funkcija: [1]</String>
273 <String Id="ProgressTextPublishProduct" Overridable="yes">Objavljanje informacij o izdelku</String>
274 <String Id="ProgressTextRegisterClassInfo" Overridable="yes">Registracija strežnikov razreda</String>
275 <String Id="ProgressTextRegisterClassInfoTemplate" Overridable="yes">ID strežnika razreda: [1]</String>
276 <String Id="ProgressTextRegisterExtensionInfo" Overridable="yes">Registracija razširitvenih strežnikov</String>
277 <String Id="ProgressTextRegisterExtensionInfoTemplate" Overridable="yes">Razširitev: [1]</String>
278 <String Id="ProgressTextRegisterMIMEInfo" Overridable="yes">Registracija informacij MIME</String>
279 <String Id="ProgressTextRegisterMIMEInfoTemplate" Overridable="yes">Vrsta vsebine MIME: [1], Razširitev: [2]</String>
280 <String Id="ProgressTextRegisterProgIdInfo" Overridable="yes">Registracija identifikatorjev programa</String>
281 <String Id="ProgressTextRegisterProgIdInfoTemplate" Overridable="yes">IDProg: [1]</String>
282 <String Id="ProgressTextAllocateRegistrySpace" Overridable="yes">Dodeljevanje prostora v registru</String>
283 <String Id="ProgressTextAllocateRegistrySpaceTemplate" Overridable="yes">Nezasedeni prostor: [1]</String>
284 <String Id="ProgressTextAppSearch" Overridable="yes">Iskanje nameščenih programov</String>
285 <String Id="ProgressTextAppSearchTemplate" Overridable="yes">Lastnost: [1], Podpis: [2]</String>
286 <String Id="ProgressTextBindImage" Overridable="yes">Povezovanje izvedljivih datotek</String>
287 <String Id="ProgressTextBindImageTemplate" Overridable="yes">Datoteka: [1]</String>
288 <String Id="ProgressTextCCPSearch" Overridable="yes">Iskanje ustreznih izdelkov</String>
289 <String Id="ProgressTextCreateFolders" Overridable="yes">Ustvarjanje map</String>
290 <String Id="ProgressTextCreateFoldersTemplate" Overridable="yes">Mapa: [1]</String>
291 <String Id="ProgressTextDeleteServices" Overridable="yes">Brisanje storitev</String>
292 <String Id="ProgressTextDeleteServicesTemplate" Overridable="yes">Storitev: [1]</String>
293 <String Id="ProgressTextDuplicateFiles" Overridable="yes">Ustvarjanje podvojenih datotek</String>
294 <String Id="ProgressTextDuplicateFilesTemplate" Overridable="yes">Datoteka: [1], Imenik: [9], Velikost: [6]</String>
295 <String Id="ProgressTextFindRelatedProducts" Overridable="yes">Iskanje sorodnih programov</String>
296 <String Id="ProgressTextFindRelatedProductsTemplate" Overridable="yes">Najdeni program: [1]</String>
297 <String Id="ProgressTextInstallODBC" Overridable="yes">Nameščanje komponent ODBC</String>
298 <String Id="ProgressTextInstallServices" Overridable="yes">Nameščanje novih storitev</String>
299 <String Id="ProgressTextInstallServicesTemplate" Overridable="yes">Storitev: [2]</String>
300 <String Id="ProgressTextLaunchConditions" Overridable="yes">Ocenjevanje pogojev zagona</String>
301 <String Id="ProgressTextMigrateFeatureStates" Overridable="yes">Selitev stanj funkcij iz sorodnih programov</String>
302 <String Id="ProgressTextMigrateFeatureStatesTemplate" Overridable="yes">Program: [1]</String>
303 <String Id="ProgressTextMoveFiles" Overridable="yes">Premikanje datotek</String>
304 <String Id="ProgressTextMoveFilesTemplate" Overridable="yes">Datoteka: [1], Imenik: [9], Velikost: [6]</String>
305 <String Id="ProgressTextPatchFiles" Overridable="yes">Nameščanje popravka za datoteke</String>
306 <String Id="ProgressTextPatchFilesTemplate" Overridable="yes">Datoteka: [1], Imenik: [2], Velikost: [3]</String>
307 <String Id="ProgressTextProcessComponents" Overridable="yes">Posodabljanje registracije komponente</String>
308 <String Id="ProgressTextRegisterComPlus" Overridable="yes">Registracija programov in komponent COM+</String>
309 <String Id="ProgressTextRegisterComPlusTemplate" Overridable="yes">IDProg: [1]{{, VrstaProg: [2], Uporabniki: [3], RSN: [4]}}</String>
310 <String Id="ProgressTextRegisterFonts" Overridable="yes">Registracija pisav</String>
311 <String Id="ProgressTextRegisterFontsTemplate" Overridable="yes">Pisava: [1]</String>
312 <String Id="ProgressTextRegisterProduct" Overridable="yes">Registracija izdelka</String>
313 <String Id="ProgressTextRegisterProductTemplate" Overridable="yes">[1]</String>
314 <String Id="ProgressTextRegisterTypeLibraries" Overridable="yes">Registracija knjižnic tipov</String>
315 <String Id="ProgressTextRegisterTypeLibrariesTemplate" Overridable="yes">IDKnjiž: [1]</String>
316 <String Id="ProgressTextRegisterUser" Overridable="yes">Registracija uporabnikov</String>
317 <String Id="ProgressTextRegisterUserTemplate" Overridable="yes">[1]</String>
318 <String Id="ProgressTextRemoveDuplicateFiles" Overridable="yes">Odstranjevanje podvojenih datotek</String>
319 <String Id="ProgressTextRemoveDuplicateFilesTemplate" Overridable="yes">Datoteka: [1], Imenik: [9]</String>
320 <String Id="ProgressTextRemoveEnvironmentStrings" Overridable="yes">Posodabljanje nizov okolja</String>
321 <String Id="ProgressTextRemoveEnvironmentStringsTemplate" Overridable="yes">Ime: [1], Vrednost: [2], Dejanje [3]</String>
322 <String Id="ProgressTextRemoveExistingProducts" Overridable="yes">Odstranjevanje programov</String>
323 <String Id="ProgressTextRemoveExistingProductsTemplate" Overridable="yes">Program: [1], Ukazna vrstica: [2]</String>
324 <String Id="ProgressTextRemoveFiles" Overridable="yes">Odstranjevanje datotek</String>
325 <String Id="ProgressTextRemoveFilesTemplate" Overridable="yes">Datoteka: [1], Imenik: [9]</String>
326 <String Id="ProgressTextRemoveFolders" Overridable="yes">Odstranjevanje map</String>
327 <String Id="ProgressTextRemoveFoldersTemplate" Overridable="yes">Mapa: [1]</String>
328 <String Id="ProgressTextRemoveIniValues" Overridable="yes">Odstranjevanje vnosov v datoteke INI</String>
329 <String Id="ProgressTextRemoveIniValuesTemplate" Overridable="yes">Datoteka: [1], Odsek: [2], Ključ: [3], Vrednost: [4]</String>
330 <String Id="ProgressTextRemoveODBC" Overridable="yes">Odstranjevanje komponent ODBC</String>
331 <String Id="ProgressTextRemoveRegistryValues" Overridable="yes">Odstranjevanje vrednosti sistemskega registra</String>
332 <String Id="ProgressTextRemoveRegistryValuesTemplate" Overridable="yes">Ključ: [1], Ime: [2]</String>
333 <String Id="ProgressTextRemoveShortcuts" Overridable="yes">Odstranjevanje bližnjic</String>
334 <String Id="ProgressTextRemoveShortcutsTemplate" Overridable="yes">Bližnjica: [1]</String>
335 <String Id="ProgressTextRMCCPSearch" Overridable="yes">Iskanje ustreznih izdelkov</String>
336 <String Id="ProgressTextSelfRegModules" Overridable="yes">Registracija modulov</String>
337 <String Id="ProgressTextSelfRegModulesTemplate" Overridable="yes">Datoteka: [1], Mapa: [2]</String>
338 <String Id="ProgressTextSelfUnregModules" Overridable="yes">Preklic registracije modulov</String>
339 <String Id="ProgressTextSelfUnregModulesTemplate" Overridable="yes">Datoteka: [1], Mapa: [2]</String>
340 <String Id="ProgressTextSetODBCFolders" Overridable="yes">Inicializiranje imenikov ODBC</String>
341 <String Id="ProgressTextStartServices" Overridable="yes">Zagon storitev</String>
342 <String Id="ProgressTextStartServicesTemplate" Overridable="yes">Storitev: [1]</String>
343 <String Id="ProgressTextStopServices" Overridable="yes">Ustavljanje storitev</String>
344 <String Id="ProgressTextStopServicesTemplate" Overridable="yes">Storitev: [1]</String>
345 <String Id="ProgressTextUnpublishComponents" Overridable="yes">Odjavljanje kvalificiranih komponent</String>
346 <String Id="ProgressTextUnpublishComponentsTemplate" Overridable="yes">ID komponente: [1], kvalifikator: [2]</String>
347 <String Id="ProgressTextUnpublishFeatures" Overridable="yes">Odjavljanje funkcij izdelka</String>
348 <String Id="ProgressTextUnpublishFeaturesTemplate" Overridable="yes">Funkcija: [1]</String>
349 <String Id="ProgressTextUnregisterClassInfo" Overridable="yes">Preklic registracije strežnikov razreda</String>
350 <String Id="ProgressTextUnregisterClassInfoTemplate" Overridable="yes">ID strežnika razreda: [1]</String>
351 <String Id="ProgressTextUnregisterComPlus" Overridable="yes">Preklic registracije programov in komponent COM+</String>
352 <String Id="ProgressTextUnregisterComPlusTemplate" Overridable="yes">IDProg: [1]{{, VrstaProg: [2]}}</String>
353 <String Id="ProgressTextUnregisterExtensionInfo" Overridable="yes">Preklic registracije razširitvenih strežnikov</String>
354 <String Id="ProgressTextUnregisterExtensionInfoTemplate" Overridable="yes">Razširitev: [1]</String>
355 <String Id="ProgressTextUnregisterFonts" Overridable="yes">Preklic registracije pisav</String>
356 <String Id="ProgressTextUnregisterFontsTemplate" Overridable="yes">Pisava: [1]</String>
357 <String Id="ProgressTextUnregisterMIMEInfo" Overridable="yes">Preklic registracije informacij MIME</String>
358 <String Id="ProgressTextUnregisterMIMEInfoTemplate" Overridable="yes">Vrsta vsebine MIME: [1], Razširitev: [2]</String>
359 <String Id="ProgressTextUnregisterProgIdInfo" Overridable="yes">Preklic registracije identifikatorjev programa</String>
360 <String Id="ProgressTextUnregisterProgIdInfoTemplate" Overridable="yes">IDProg: [1]</String>
361 <String Id="ProgressTextUnregisterTypeLibraries" Overridable="yes">Preklic registracije knjižnic tipov</String>
362 <String Id="ProgressTextUnregisterTypeLibrariesTemplate" Overridable="yes">IDKnjiž: [1]</String>
363 <String Id="ProgressTextWriteEnvironmentStrings" Overridable="yes">Posodabljanje nizov okolja</String>
364 <String Id="ProgressTextWriteEnvironmentStringsTemplate" Overridable="yes">Ime: [1], Vrednost: [2], Dejanje [3]</String>
365 <String Id="ProgressTextWriteIniValues" Overridable="yes">Pisanje vrednosti datotek INI</String>
366 <String Id="ProgressTextWriteIniValuesTemplate" Overridable="yes">Datoteka: [1], Odsek: [2], Ključ: [3], Vrednost: [4]</String>
367 <String Id="ProgressTextWriteRegistryValues" Overridable="yes">Pisanje vrednosti sistemskega registra</String>
368 <String Id="ProgressTextWriteRegistryValuesTemplate" Overridable="yes">Ključ: [1], Ime: [2], Vrednost: [3]</String>
369 <String Id="ProgressTextAdvertise" Overridable="yes">Oglaševanje programa</String>
370 <String Id="ProgressTextGenerateScript" Overridable="yes">Ustvarjanje skriptnih postopkov za dejanje:</String>
371 <String Id="ProgressTextGenerateScriptTemplate" Overridable="yes">[1]</String>
372 <String Id="ProgressTextInstallSFPCatalogFile" Overridable="yes">Nameščanje sistemskega kataloga</String>
373 <String Id="ProgressTextInstallSFPCatalogFileTemplate" Overridable="yes">Datoteka: [1], Odvisnosti: [2]</String>
374 <String Id="ProgressTextMsiPublishAssemblies" Overridable="yes">Objavljanje informacij zbirnika</String>
375 <String Id="ProgressTextMsiPublishAssembliesTemplate" Overridable="yes">Kontekst programa:[1], Ime zbirnika:[2]</String>
376 <String Id="ProgressTextMsiUnpublishAssemblies" Overridable="yes">Preklic objavljanja informacij zbirnika</String>
377 <String Id="ProgressTextMsiUnpublishAssembliesTemplate" Overridable="yes">Kontekst programa:[1], Ime zbirnika:[2]</String>
378 <String Id="ProgressTextRollback" Overridable="yes">Razveljavljanje dejanja:</String>
379 <String Id="ProgressTextRollbackTemplate" Overridable="yes">[1]</String>
380 <String Id="ProgressTextRollbackCleanup" Overridable="yes">Odstranjevanje varnostnih kopij datotek</String>
381 <String Id="ProgressTextRollbackCleanupTemplate" Overridable="yes">Datoteka: [1]</String>
382 <String Id="ProgressTextUnmoveFiles" Overridable="yes">Odstranjevanje premaknjenih datotek</String>
383 <String Id="ProgressTextUnmoveFilesTemplate" Overridable="yes">Datoteka: [1], Imenik: [9]</String>
384 <String Id="ProgressTextUnpublishProduct" Overridable="yes">Preklic objavljanja informacij o izdelku</String>
385
386 <String Id="Error0" Overridable="yes">{{Usodna napaka: }}</String>
387 <String Id="Error1" Overridable="yes">{{Napaka [1]. }}</String>
388 <String Id="Error2" Overridable="yes">Opozorilo [1]. </String>
389 <String Id="Error4" Overridable="yes">Informacije [1]. </String>
390 <String Id="Error5" Overridable="yes">Namestitveni program je pri nameščanju programske opreme naletel na nepričakovano napako. To je lahko znak težave s tem paketom. Koda napake je [1]. {{Argumenti so: [2], [3], [4]}}</String>
391 <String Id="Error7" Overridable="yes">{{Disk je poln: }}</String>
392 <String Id="Error8" Overridable="yes">Dejanje [Time]: [1]. [2]</String>
393 <String Id="Error9" Overridable="yes">[ProductName]</String>
394 <String Id="Error10" Overridable="yes">{[2]}{, [3]}{, [4]}</String>
395 <String Id="Error11" Overridable="yes">Vrsta sporočila: [1], Argument: [2]</String>
396 <String Id="Error12" Overridable="yes">=== Začetek pisanja dnevnika: [Date] [Time] ===</String>
397 <String Id="Error13" Overridable="yes">=== Konec pisanja dnevnika: [Date] [Time] ===</String>
398 <String Id="Error14" Overridable="yes">Začetek dejanja [Time]: [1].</String>
399 <String Id="Error15" Overridable="yes">Konec dejanja [Time]: [1]. Vrnjena vrednost [2].</String>
400 <String Id="Error16" Overridable="yes">Preostali čas: {[1] min. }{[2] s}</String>
401 <String Id="Error17" Overridable="yes">Ni dovolj pomnilnika. Zaprite druge programe in nato poskusite znova.</String>
402 <String Id="Error18" Overridable="yes">Namestitveni program se ne odziva več.</String>
403 <String Id="Error19" Overridable="yes">Namestitveni program se je predčasno prekinil.</String>
404 <String Id="Error20" Overridable="yes">Počakajte, da Windows konfigurira [ProductName]</String>
405 <String Id="Error21" Overridable="yes">Zbiranje potrebnih informacij ...</String>
406 <String Id="Error22" Overridable="yes">Odstranjevanje starejših različic tega programa ...</String>
407 <String Id="Error23" Overridable="yes">Priprava na odstranjevanje starejših različic tega programa ...</String>
408 <String Id="Error32" Overridable="yes">Namestitev programa {[ProductName] }se je uspešno dokončala.</String>
409 <String Id="Error33" Overridable="yes">Namestitev programa {[ProductName] }ni uspela.</String>
410 <String Id="Error1101" Overridable="yes">Prišlo je do napake pri branju iz datoteke. [2]. {{ Sistemska napaka [3].}} Preverite, ali datoteka obstaja in ali imate dostop do nje.</String>
411 <String Id="Error1301" Overridable="yes">Datoteke »[2]« ni mogoče ustvariti. Imenik s tem imenom že obstaja. Prekličite namestitev in jo poskusite izvesti na drugo mesto.</String>
412 <String Id="Error1302" Overridable="yes">Vstavite disk: [2]</String>
413 <String Id="Error1303" Overridable="yes">Namestitveni program nima ustreznih pravic za dostop do tega imenika: [2]. Namestitev se ne more nadaljevati. Prijavite se kot skrbnik ali pa se obrnite na skrbnika sistema.</String>
414 <String Id="Error1304" Overridable="yes">Prišlo je do napake pri pisanju v datoteko: [2]. Preverite, ali imate dostop do tega imenika.</String>
415 <String Id="Error1305" Overridable="yes">Prišlo je do napake pri branju iz datoteke [2]. {{ Sistemska napaka [3].}} Preverite, ali datoteka obstaja in ali imate dostop do nje.</String>
416 <String Id="Error1306" Overridable="yes">Drug program ima izključni dostop do datoteke »[2]«. Zaprite vse druge programe in kliknite »Poskusi znova«.</String>
417 <String Id="Error1307" Overridable="yes">Na disku ni dovolj prostora za namestitev te datoteke: [2]. Sprostite nekaj prostora na disku in kliknite »Poskusi znova« ali kliknite »Prekliči«, če želite preklicati namestitev.</String>
418 <String Id="Error1308" Overridable="yes">Ni bilo mogoče najti izvorne datoteke: [2]. Preverite, ali datoteka obstaja in ali imate dostop do nje.</String>
419 <String Id="Error1309" Overridable="yes">Prišlo je do napake pri branju iz datoteke: [3]. {{ Sistemska napaka [2].}} Preverite, ali datoteka obstaja in ali imate dostop do nje.</String>
420 <String Id="Error1310" Overridable="yes">Prišlo je do napake pri pisanju v datoteko: [3]. {{ Sistemska napaka [2].}} Preverite, ali imate dostop do tega imenika.</String>
421 <String Id="Error1311" Overridable="yes">Ni bilo mogoče najti izvorne datoteke{{(cabinet)}}: [2]. Preverite, ali datoteka obstaja in ali imate dostop do nje.</String>
422 <String Id="Error1312" Overridable="yes">Imenika »[2]« ni mogoče ustvariti. Datoteka s tem imenom že obstaja. Preimenujte jo ali pa datoteko odstranite in kliknite »Poskusi znova«. Če želite prekiniti postopek, kliknite »Prekliči«.</String>
423 <String Id="Error1313" Overridable="yes">Nosilec [2] trenutno ni na voljo. Izberite drugega.</String>
424 <String Id="Error1314" Overridable="yes">Navedena pot »[2]« ni na voljo.</String>
425 <String Id="Error1315" Overridable="yes">Ni mogoče pisati v navedeno mapo: [2].</String>
426 <String Id="Error1316" Overridable="yes">Prišlo je do napake omrežja pri poskusu branja datoteke: [2]</String>
427 <String Id="Error1317" Overridable="yes">Prišlo je do napake pri poskusu ustvarjanja imenika: [2]</String>
428 <String Id="Error1318" Overridable="yes">Prišlo je do napake omrežja pri poskusu ustvarjanja imenika: [2]</String>
429 <String Id="Error1319" Overridable="yes">Prišlo je do napake omrežja pri poskusu odpiranja izvorne kabinetne datoteke: [2]</String>
430 <String Id="Error1320" Overridable="yes">Navedena pot je predolga: [2]</String>
431 <String Id="Error1321" Overridable="yes">Namestitveni program nima ustreznih pravic za spreminjanje te datoteke: [2].</String>
432 <String Id="Error1322" Overridable="yes">Del poti mape »[2]« ni veljaven. Pot je prazna ali pa presega dolžino, ki jo dovoljuje sistem.</String>
433 <String Id="Error1323" Overridable="yes">Pot mape »[2]« vsebuje besede, ki v poteh niso veljavne.</String>
434 <String Id="Error1324" Overridable="yes">Pot do mape »[2]« vsebuje neveljaven znak.</String>
435 <String Id="Error1325" Overridable="yes">»[2]« ni veljavno kratko ime datoteke.</String>
436 <String Id="Error1326" Overridable="yes">Prišlo je do napake pri pridobivanju podatkov o zaščiti datoteke: [3] GetLastError: [2]</String>
437 <String Id="Error1327" Overridable="yes">Neveljaven pogon: [2]</String>
438 <String Id="Error1328" Overridable="yes">Pri uporabi popravka za datoteko [2] je prišlo do napake. Verjetno ste jo posodobili z drugimi sredstvi, tako da je ne morete spremeniti s tem popravkom. Če želite več informacij, se obrnite na dobavitelja popravka. {{Sistemska napaka: [3]}}</String>
439 <String Id="Error1329" Overridable="yes">Zahtevane datoteke ni mogoče namestiti, ker kabinetna datoteka [2] ni digitalno podpisana. To morda kaže na to, da je kabinetna datoteka poškodovana.</String>
440 <String Id="Error1330" Overridable="yes">Zahtevane datoteke ni mogoče namestiti, ker kabinetna datoteka [2] nima veljavnega digitalnega podpisa. To morda kaže na to, da je kabinetna datoteka poškodovana.{{ WinVerifyTrust je vrnil napako [3].}}</String>
441 <String Id="Error1331" Overridable="yes">Datoteke [2] ni bilo mogoče pravilno kopirati: napaka CRC.</String>
442 <String Id="Error1332" Overridable="yes">Datoteke [2] ni bilo mogoče pravilno premakniti: napaka CRC.</String>
443 <String Id="Error1333" Overridable="yes">Datoteke [2] ni bilo mogoče pravilno popraviti: napaka CRC.</String>
444 <String Id="Error1334" Overridable="yes">Datoteke »[2]« ni mogoče namestiti, ker je ni mogoče najti v kabinetni datoteki »[3]«. To lahko kaže na napako v omrežju, napako pri branju s CD-ROM-a ali na težavo s tem paketom.</String>
445 <String Id="Error1335" Overridable="yes">Kabinetna datoteka »[2]«, ki jo potrebujete za to namestitev, je poškodovana in je ne morete uporabiti. To lahko kaže na napako v omrežju, napako pri branju s CD-ROM-a ali na težavo s tem paketom.</String>
446 <String Id="Error1336" Overridable="yes">Prišlo je do napake pri ustvarjanju začasne datoteke, ki jo potrebujete za dokončanje te namestitve.{{ Mapa: [3]. Koda napake sistema [2]}}</String>
447 <String Id="Error1401" Overridable="yes">Ni mogoče ustvariti ključa: [2]. {{ Sistemska napaka [3].}} Preverite, ali imate zadosten dostop do tega ključa, ali pa se obrnite na osebje za podporo. </String>
448 <String Id="Error1402" Overridable="yes">Ni mogoče ustvariti ključa: [2]. {{ Sistemska napaka [3].}} Preverite, ali imate zadosten dostop do tega ključa, ali pa se obrnite na osebje za podporo. </String>
449 <String Id="Error1403" Overridable="yes">Vrednosti [2] ni bilo mogoče izbrisati iz ključa [3]. {{ Sistemska napaka [4].}} Preverite, ali imate zadosten dostop do tega ključa, ali pa se obrnite na osebje za podporo. </String>
450 <String Id="Error1404" Overridable="yes">Ključa [2] ni mogoče izbrisati. {{ Sistemska napaka [3].}} Preverite, ali imate zadosten dostop do tega ključa, ali pa se obrnite na osebje za podporo. </String>
451 <String Id="Error1405" Overridable="yes">Vrednosti [2] ni bilo mogoče prebrati iz ključa [3]. {{ Sistemska napaka [4].}} Preverite, ali imate zadosten dostop do tega ključa, ali pa se obrnite na osebje za podporo. </String>
452 <String Id="Error1406" Overridable="yes">Vrednosti [2] ni bilo mogoče zapisati v ključ [3]. {{ Sistemska napaka [4].}} Preverite, ali imate zadosten dostop do tega ključa, ali pa se obrnite na osebje za podporo.</String>
453 <String Id="Error1407" Overridable="yes">Za ključ [2] ni bilo mogoče dobiti imen vrednosti. {{ Sistemska napaka [3].}} Preverite, ali imate zadosten dostop do tega ključa, ali pa se obrnite na osebje za podporo.</String>
454 <String Id="Error1408" Overridable="yes">Za ključ [2] ni bilo mogoče dobiti imena podključev. {{ Sistemska napaka [3].}} Preverite, ali imate zadosten dostop do tega ključa, ali pa se obrnite na osebje za podporo.</String>
455 <String Id="Error1409" Overridable="yes">Za ključ [2] ni bilo mogoče prebrati varnostnih informacij. {{ Sistemska napaka [3].}} Preverite, ali imate zadosten dostop do tega ključa, ali pa se obrnite na osebje za podporo.</String>
456 <String Id="Error1410" Overridable="yes">Prostora, ki je na voljo za register, ni bilo mogoče povečati. Če želite namestiti ta program, mora biti v registru [2] KB nezasedenega prostora.</String>
457 <String Id="Error1500" Overridable="yes">Izvaja se še ena namestitev. Preden nadaljujete to namestitev, morate dokončati prvo.</String>
458 <String Id="Error1501" Overridable="yes">Pri dostopu do zavarovanih podatkov je prišlo do napake. Preverite, ali je Windows Installer pravilno konfiguriran, in nato poskusite znova zagnati namestitev.</String>
459 <String Id="Error1502" Overridable="yes">Uporabnik »[2]« je prej že sprožil namestitev izdelka »[3]«. Omenjeni uporabnik bo moral znova zagnati namestitev, če bo želel uporabljati ta izdelek. Trenutna namestitev se bo nadaljevala.</String>
460 <String Id="Error1503" Overridable="yes">Uporabnik »[2]« je prej že sprožil namestitev izdelka »[3]«. Omenjeni uporabnik bo moral znova zagnati namestitev, če bo želel uporabljati ta izdelek.</String>
461 <String Id="Error1601" Overridable="yes">Zmanjkalo je prostora na disku – Nosilec: »[2]«; Potreben prostor: [3] KB; prostor na voljo: [4] KB. Sprostite nekaj prostora na disku in poskusite znova.</String>
462 <String Id="Error1602" Overridable="yes">Ali ste prepričani, da ga želite preklicati?</String>
463 <String Id="Error1603" Overridable="yes">Datoteko [2][3] uporablja{ ta proces: Ime: [4], ID: [5], Naslov okna: »[6]«}. Zaprite ta program in poskusite znova.</String>
464 <String Id="Error1604" Overridable="yes">Izdelek »[2]« je že nameščen in preprečuje nameščanje tega izdelka. Izdelka nista združljiva.</String>
465 <String Id="Error1605" Overridable="yes">Na nosilcu »[2]« ni dovolj prostora za nadaljevanje namestitve z omogočeno obnovitvijo. Potrebno je [3] KB, na voljo je le [4] KB. Kliknite »Prezri«, če želite nadaljevati namestitev, ne da bi shranili obnovitvene informacije; kliknite »Poskusi znova«, če želite znova preveriti, ali je na voljo prostor; kliknite »Prekliči«, če želite končati namestitev.</String>
466 <String Id="Error1606" Overridable="yes">Dostop do omrežnega mesta [2] ni bil mogoč.</String>
467 <String Id="Error1607" Overridable="yes">Preden nadaljujete namestitev, zaprite te programe:</String>
468 <String Id="Error1608" Overridable="yes">Za namestitev tega izdelka v računalniku ni bilo mogoče najti prej nameščenih ustreznih izdelkov.</String>
469 <String Id="Error1609" Overridable="yes">Med uveljavljanjem varnostnih nastavitev je prišlo do napake. [2] ni veljaven uporabnik ali skupina. Težava je lahko s paketom oz. z vzpostavljanjem povezave s kontrolnikom domene v omrežju. Preverite povezavo z omrežjem in kliknite »Poskusi znova« oz. »Prekliči«, če želite končati namestitev. {{Ni mogoče najti uporabnikov SID, sistemska napaka [3]}}</String>
470 <String Id="Error1701" Overridable="yes">Ključ [2] ni veljaven. Preverite, ali ste vnesli pravi ključ, in poskusite znova.</String>
471 <String Id="Error1702" Overridable="yes">Namestitveni program mora znova zagnati sistem, preden lahko nadaljuje konfiguracijo [2]. Kliknite »Da«, da sistem takoj zaženete znova, če pa želite to sami storiti pozneje, kliknite »Ne«.</String>
472 <String Id="Error1703" Overridable="yes">Če želite uveljaviti spremembe v konfiguraciji za [2], znova zaženite računalnik. Kliknite »Da«, če želite računalnik znova zagnati zdaj, če pa želite to sami storiti pozneje, kliknite »Ne«.</String>
473 <String Id="Error1704" Overridable="yes">Namestitev za [2] je trenutno ustavljena. Če želite nadaljevati, morate razveljaviti spremembe, ki jih je povzročila omenjena namestitev. Ali jih želite razveljaviti?</String>
474 <String Id="Error1705" Overridable="yes">Prejšnja namestitev tega izdelka se še izvaja. Če želite nadaljevati, morate razveljaviti spremembe, ki jih je povzročila omenjena namestitev. Ali želite razveljaviti spremembe?</String>
475 <String Id="Error1706" Overridable="yes">Namestitvenega paketa za izdelek [2] ni mogoče najti. Poskusite znova zagnati namestitev z uporabo veljavne kopije namestitvenega paketa »[3]«.</String>
476 <String Id="Error1707" Overridable="yes">Namestitev je uspešno dokončana.</String>
477 <String Id="Error1708" Overridable="yes">Namestitev ni uspela.</String>
478 <String Id="Error1709" Overridable="yes">Izdelek: [2] -- [3]</String>
479 <String Id="Error1710" Overridable="yes">Računalnik lahko povrnete v prejšnje stanje ali pa nadaljujete namestitev pozneje. Ali želite obnoviti prejšnje stanje?</String>
480 <String Id="Error1711" Overridable="yes">Med zapisovanjem namestitvenih informacij na disk je prišlo do napake. Preverite, ali je na disku dovolj prostora, in kliknite »Poskusi znova«. Če želite namestitev prekiniti, kliknite »Prekliči«.</String>
481 <String Id="Error1712" Overridable="yes">Ene ali več datotek, potrebnih za obnovitev prejšnjega stanja računalnika, ni bilo mogoče najti. Obnovitev ne bo mogoča.</String>
482 <String Id="Error1713" Overridable="yes">[2] ne more namestiti enega od potrebnih izdelkov. Obrnite se na skupino za tehnično podporo. {{Sistemska napaka: [3].}}</String>
483 <String Id="Error1714" Overridable="yes">Starejše različice [2] ni mogoče odstraniti. Obrnite se na skupino za tehnično podporo. {{ Sistemska napaka [3].}}</String>
484 <String Id="Error1715" Overridable="yes">Nameščen [2]</String>
485 <String Id="Error1716" Overridable="yes">Konfiguriran [2]</String>
486 <String Id="Error1717" Overridable="yes">Odstranjen [2]</String>
487 <String Id="Error1718" Overridable="yes">Pravilnik o digitalnem podpisu je zavrnil datoteko [2].</String>
488 <String Id="Error1719" Overridable="yes">Dostop do storitve Windows Installer ni mogoč. Do tega lahko pride, če se Windows izvaja v varnem načinu in če Windows Installer ni pravilno nameščen. Za pomoč se obrnite na osebje za podporo.</String>
489 <String Id="Error1720" Overridable="yes">Ta paket programa Windows Installer povzroča težave. Skripte, potrebne za zaključitev namestitve, ni mogoče zagnati. Obrnite se na osebje za podporo ali prodajalca paketa. {{Prilagojeno dejanje [2] napaka skripte [3], [4]: [5] Vrstica [6], Stolpec [7], [8] }}</String>
490 <String Id="Error1721" Overridable="yes">Ta paket programa Windows Installer povzroča težave. Programa, potrebnega za zaključitev namestitve, ni mogoče zagnati. Obrnite se na osebje za podporo ali prodajalca paketa. {{Dejanje: [2], Mesto: [3], Ukaz: [4] }}</String>
491 <String Id="Error1722" Overridable="yes">Ta paket programa Windows Installer povzroča težave. Program, ki se izvaja kot del namestitve, se ni končal po pričakovanjih. Obrnite se na osebje za podporo ali prodajalca paketa. {{Dejanje [2], Mesto: [3], Ukaz: [4] }}</String>
492 <String Id="Error1723" Overridable="yes">Ta paket programa Windows Installer povzroča težave. Datoteke DLL, ki je potrebna za dokončanje namestitve, ni mogoče zagnati. Obrnite se na osebje za podporo ali prodajalca paketa. {{Dejanje [2], Vnos: [3], Knjižnica: [4] }}</String>
493 <String Id="Error1724" Overridable="yes">Odstranitev je uspešno dokončana.</String>
494 <String Id="Error1725" Overridable="yes">Odstranitev ni uspela.</String>
495 <String Id="Error1726" Overridable="yes">Oglaševanje je uspešno dokončano.</String>
496 <String Id="Error1727" Overridable="yes">Oglaševanje ni uspelo.</String>
497 <String Id="Error1728" Overridable="yes">Konfiguriranje je uspešno dokončano.</String>
498 <String Id="Error1729" Overridable="yes">Konfiguriranje ni uspelo.</String>
499 <String Id="Error1730" Overridable="yes">Če želite odstraniti ta program, morate biti skrbnik. Če želite odstraniti ta program, se prijavite kot skrbnik ali pa se za pomoč obrnite na skupino za tehnično podporo.</String>
500 <String Id="Error1731" Overridable="yes">Izvorni namestitveni paket izdelka [2] ni sinhroniziran z odjemalskim paketom. Uporabite veljavno kopijo namestitvenega paketa »[3]« in izdelek poskusite znova namestiti.</String>
501 <String Id="Error1732" Overridable="yes">Če želite dokončati namestitev [2], morate računalnik znova zagnati. V računalnik so trenutno prijavljeni tudi drugi uporabniki. Vnovični zagon lahko povzroči izgubo podatkov. Ali ste prepričani, da želite računalnik znova zagnati?</String>
502 <String Id="Error1801" Overridable="yes">Pot [2] ni veljavna. Navedite veljavno pot.</String>
503 <String Id="Error1802" Overridable="yes">Ni dovolj pomnilnika. Zaprite druge programe in nato poskusite znova.</String>
504 <String Id="Error1803" Overridable="yes">V pogonu [2] ni diska. Vstavite disk in kliknite »Ponovi« ali pa kliknite »Prekliči«, če se želite vrniti na prej izbrani nosilec.</String>
505 <String Id="Error1804" Overridable="yes">V pogonu [2] ni diska. Vstavite disk in kliknite »Ponovi« ali pa kliknite »Prekliči«, če se želite vrniti v pogovorno okno za brskanje in izbrati drug nosilec.</String>
506 <String Id="Error1805" Overridable="yes">Mapa [2] ne obstaja. Vnesite pot do obstoječe mape.</String>
507 <String Id="Error1806" Overridable="yes">Za branje te mape nimate ustreznih pravic.</String>
508 <String Id="Error1807" Overridable="yes">Veljavne ciljne mape za namestitev ni bilo mogoče določiti.</String>
509 <String Id="Error1901" Overridable="yes">Napaka pri poskusu branja iz izvirne namestitvene zbirke podatkov: [2].</String>
510 <String Id="Error1902" Overridable="yes">Razporejanje vnovičnega zagona: Preimenovanje datoteke [2] v [3]. Če želite dokončati postopek, znova zaženite računalnik.</String>
511 <String Id="Error1903" Overridable="yes">Razporejanje vnovičnega zagona: brisanje datoteke [2]. Če želite dokončati postopek, znova zaženite računalnik.</String>
512 <String Id="Error1904" Overridable="yes">Modula [2] ni bilo mogoče registrirati. HRESULT [3]. Obrnite se na osebje za podporo.</String>
513 <String Id="Error1905" Overridable="yes">Registracije modula [2] ni bilo mogoče preklicati. HRESULT [3]. Obrnite se na osebje za podporo.</String>
514 <String Id="Error1906" Overridable="yes">Predpomnjenje paketa [2] ni uspelo. Napaka: [3]. Obrnite se na osebje za podporo.</String>
515 <String Id="Error1907" Overridable="yes">Pisave [2] ni mogoče registrirati. Preverite, ali imate ustrezna dovoljenja za namestitev pisav in ali sistem podpira to pisavo.</String>
516 <String Id="Error1908" Overridable="yes">Pisave [2] ni bilo mogoče odstraniti iz registra. Preverite, ali imate ustrezna dovoljenja za odstranjevanje pisav.</String>
517 <String Id="Error1909" Overridable="yes">Bližnjice [2] ni bilo mogoče ustvariti. Preverite, ali ciljna mapa obstaja in ali imate dostop do nje.</String>
518 <String Id="Error1910" Overridable="yes">Bližnjice [2] ni bilo mogoče odstraniti. Preverite, ali datoteka z bližnjico obstaja in ali imate dostop do nje.</String>
519 <String Id="Error1911" Overridable="yes">Za datoteko [2] ni bilo mogoče registrirati knjižnice tipov. Obrnite se na osebje za podporo.</String>
520 <String Id="Error1912" Overridable="yes">Registracije knjižnice tipov za datoteko [2] ni bilo mogoče preklicati. Obrnite se na osebje za podporo.</String>
521 <String Id="Error1913" Overridable="yes">Datoteke ini [2][3] ni mogoče posodobiti. Preverite, ali datoteka obstaja in ali imate dostop do nje.</String>
522 <String Id="Error1914" Overridable="yes">Datoteke [2] ni bilo mogoče razporediti tako, da bi ob zagonu zamenjala datoteko [3]. Preverite, ali imate dovoljenje za pisanje v datoteko [3].</String>
523 <String Id="Error1915" Overridable="yes">Prišlo je do napake pri odstranjevanju upravitelja gonilnika ODBC, napaka ODBC [2]: [3]. Obrnite se na osebje za podporo.</String>
524 <String Id="Error1916" Overridable="yes">Prišlo je do napake pri nameščanju upravitelja gonilnika ODBC, napaka ODBC [2]: [3]. Obrnite se na osebje za podporo.</String>
525 <String Id="Error1917" Overridable="yes">Prišlo je do napake pri odstranjevanju gonilnika ODBC: [4], napaka ODBC [2]: [3]. Preverite, ali imate ustrezne pravice za odstranjevanje gonilnikov ODBC.</String>
526 <String Id="Error1918" Overridable="yes">Prišlo je do napake pri nameščanju gonilnika ODBC: [4], napaka ODBC [2]: [3]. Preverite, ali datoteka [4] obstaja in ali imate dostop do nje.</String>
527 <String Id="Error1919" Overridable="yes">Prišlo je do napake pri konfiguriranju vira podatkov ODBC: [4], napaka ODBC [2]: [3]. Preverite, ali datoteka [4] obstaja in ali imate dostop do nje.</String>
528 <String Id="Error1920" Overridable="yes">Storitve »[2]« ([3]) ni bilo mogoče zagnati. Preverite, ali imate ustrezne pravice za zagon sistemskih storitev.</String>
529 <String Id="Error1921" Overridable="yes">Storitve »[2]« ([3]) ni bilo mogoče zaustaviti. Preverite, ali imate ustrezne pravice za zaustavljanje sistemskih storitev.</String>
530 <String Id="Error1922" Overridable="yes">Storitve »[2]« ([3]) ni bilo mogoče izbrisati. Preverite, ali imate ustrezne pravice za odstranjevanje sistemskih storitev.</String>
531 <String Id="Error1923" Overridable="yes">Storitve »[2]« ([3]) ni bilo mogoče namestiti. Preverite, ali imate ustrezne pravice za nameščanje sistemskih storitev.</String>
532 <String Id="Error1924" Overridable="yes">Spremenljivke okolja »[2]« ni bilo mogoče posodobiti. Preverite, ali imate ustrezne pravice za spreminjanje spremenljivk okolja.</String>
533 <String Id="Error1925" Overridable="yes">Nimate ustreznih pravic za dokončanje te namestitve za vse uporabnike tega računalnika. Prijavite se kot skrbnik in nato ponovite namestitev.</String>
534 <String Id="Error1926" Overridable="yes">Za datoteko »[3]« ni bilo mogoče nastaviti varnosti. Napaka: [2]. Preverite, ali imate ustrezne pravice za spreminjanje varnostnih dovoljenj te datoteke.</String>
535 <String Id="Error1927" Overridable="yes">Storitve Component Services (COM+ 1.0) niso nameščene v tem računalniku, vendar jih za to namestitev potrebujete. Na voljo so v operacijskem sistemu Windows 2000.</String>
536 <String Id="Error1928" Overridable="yes">Prišlo je do napake pri registraciji programa COM+. Če želite več informacij, se obrnite na osebje za podporo.</String>
537 <String Id="Error1929" Overridable="yes">Prišlo je do napake pri odstranjevanju programa COM+ iz registra. Če želite več informacij, se obrnite na osebje za podporo.</String>
538 <String Id="Error1930" Overridable="yes">Opisa za storitev »[2]« ([3]) ni bilo mogoče spremeniti.</String>
539 <String Id="Error1931" Overridable="yes">Storitev Windows Installer ne more posodobiti sistemske datoteke [2], ker jo je operacijski sistem Windows zaščitil. Če želite omogočiti pravilno delovanja programa, boste morda morali posodobiti operacijski sistem. {{Različica paketa: [3], Zaščitena različica OS: [4]}}</String>
540 <String Id="Error1932" Overridable="yes">Storitev Windows Installer ne more posodobiti datoteke [2], ker jo je operacijski sistem Windows zaščitil. {{Različica paketa: [3], Zaščitena različica OS: [4], Napaka SFP: [5]}}</String>
541 <String Id="Error1933" Overridable="yes">Storitev Windows Installer ne omogoča posodobitve ene ali več zaščitenih datotek sistema Windows. {{SFP Error: [2]. List of protected files:\r\n[3]}}</String>
542 <String Id="Error1934" Overridable="yes">Uporabniške namestitve onemogoča pravilnik v računalniku.</String>
543 <String Id="Error1935" Overridable="yes">Prišlo je do napake med namestitvijo komponente zbira »[6]«. Za več informacij se obrnite na pomoč in podporo. HRESULT: [3]. {{zbirni vmesnik: [4], funkcija: [5], komponente: [2]}}</String>
544 <String Id="Error1936" Overridable="yes">Prišlo je do napake med namestitvijo zbira »[6]«. Zbir ni močno poimenovan oz. ni podpisan z najkrajšo dolžino ključa. HRESULT: [3]. {{zbirni vmesnik: [4], funkcija: [5], komponenta: [2]}}</String>
545 <String Id="Error1937" Overridable="yes">Prišlo je do napake med namestitvijo zbira »[6]«. Podpisa oz. kataloga ni bilo mogoče preveriti oz. ni veljaven. HRESULT: [3]. {{zbirni vmesnik: [4], funkcija: [5], komponenta: [2]}}</String>
546 <String Id="Error1938" Overridable="yes">Prišlo je do napake med namestitvijo zbira »[6]«. Enega ali več modulov zbira ni bilo mogoče najti. HRESULT: [3]. {{zbirni vmesnik: [4], funkcija: [5], komponenta: [2]}}</String>
547
548 <String Id="UITextbytes" Overridable="yes">bajtov</String>
549 <String Id="UITextGB" Overridable="yes">GB</String>
550 <String Id="UITextKB" Overridable="yes">KB</String>
551 <String Id="UITextMB" Overridable="yes">MB</String>
552 <String Id="UITextMenuAbsent" Overridable="yes">Celotna funkcija ne bo na voljo</String>
553 <String Id="UITextMenuAdvertise" Overridable="yes">Funkcija bo nameščena po potrebi</String>
554 <String Id="UITextMenuAllCD" Overridable="yes">Celotna funkcija bo nameščena tako, da jo bo mogoče zagnati s CD-ja</String>
555 <String Id="UITextMenuAllLocal" Overridable="yes">Celotna funkcija bo nameščena na lokalni trdi disk</String>
556 <String Id="UITextMenuAllNetwork" Overridable="yes">Celotna funkcija bo nameščena tako, da jo bo mogoče zagnati iz omrežja</String>
557 <String Id="UITextMenuCD" Overridable="yes">Bo nameščena za zagon s CD-ja</String>
558 <String Id="UITextMenuLocal" Overridable="yes">Bo nameščena na lokalni disk</String>
559 <String Id="UITextMenuNetwork" Overridable="yes">Bo nameščena za zagon iz omrežja</String>
560 <String Id="UITextNewFolder" Overridable="yes">Mapa|Nova mapa</String>
561 <String Id="UITextScriptInProgress" Overridable="yes">Zbiranje potrebnih informacij ...</String>
562 <String Id="UITextSelAbsentAbsent" Overridable="yes">Ta funkcija bo ostala nenameščena</String>
563 <String Id="UITextSelAbsentAdvertise" Overridable="yes">Funkcija bo nastavljena tako, da bo nameščena po potrebi</String>
564 <String Id="UITextSelAbsentCD" Overridable="yes">Ta funkcija bo nameščena tako, da jo bo mogoče zagnati s CD-ja</String>
565 <String Id="UITextSelAbsentLocal" Overridable="yes">Ta funkcija bo nameščena na lokalni trdi disk</String>
566 <String Id="UITextSelAbsentNetwork" Overridable="yes">Ta funkcija bo nameščena tako, da jo bo mogoče zagnati iz omrežja</String>
567 <String Id="UITextSelAdvertiseAbsent" Overridable="yes">Ta funkcija ne bo na voljo</String>
568 <String Id="UITextSelAdvertiseAdvertise" Overridable="yes">Bo nameščena po potrebi</String>
569 <String Id="UITextSelAdvertiseCD" Overridable="yes">To funkcijo bo mogoče zagnati s CD-ja</String>
570 <String Id="UITextSelAdvertiseLocal" Overridable="yes">Ta funkcija bo nameščena na lokalni trdi disk</String>
571 <String Id="UITextSelAdvertiseNetwork" Overridable="yes">To funkcijo bo mogoče zagnati iz omrežja</String>
572 <String Id="UITextSelCDAbsent" Overridable="yes">Ta funkcija bo popolnoma odstranjena in je tudi s CD-ja ne bo mogoče zagnati</String>
573 <String Id="UITextSelCDAdvertise" Overridable="yes">Ta funkcija bo iz stanja zagona s CD-ja spremenjena na stanje namestitve po potrebi</String>
574 <String Id="UITextSelCDCD" Overridable="yes">To funkcijo bo še vedno mogoče zagnati s CD-ja</String>
575 <String Id="UITextSelCDLocal" Overridable="yes">Te funkcije ne bo več mogoče zagnati s CD-ja, ker bo nameščena na lokalni trdi disk</String>
576 <String Id="UITextSelChildCostNeg" Overridable="yes">Ta funkcija sprosti [1] prostora na trdem disku.</String>
577 <String Id="UITextSelChildCostPos" Overridable="yes">Za to funkcijo potrebujete [1] prostora na trdem disku.</String>
578 <String Id="UITextSelCostPending" Overridable="yes">Zbiranje zahtev za to funkcijo ...</String>
579 <String Id="UITextSelLocalAbsent" Overridable="yes">Ta funkcija bo popolnoma odstranjena</String>
580 <String Id="UITextSelLocalAdvertise" Overridable="yes">Ta funkcija bo odstranjena z lokalnega trdega diska, vendar bo nastavljena tako, da bo nameščena po potrebi</String>
581 <String Id="UITextSelLocalCD" Overridable="yes">Ta funkcija bo odstranjena z lokalnega trdega diska, vendar jo bo še vedno mogoče zagnati s CD-ja</String>
582 <String Id="UITextSelLocalLocal" Overridable="yes">Ta funkcija bo ostala na lokalnem trdem disku</String>
583 <String Id="UITextSelLocalNetwork" Overridable="yes">Ta funkcija bo odstranjena z lokalnega trdega diska, vendar jo bo še vedno mogoče zagnati iz omrežja</String>
584 <String Id="UITextSelNetworkAbsent" Overridable="yes">Ta funkcija bo popolnoma odstranjena in je tudi iz omrežja ne bo mogoče zagnati</String>
585 <String Id="UITextSelNetworkAdvertise" Overridable="yes">Funkcija bo iz stanja zagona iz omrežja spremenjena v stanje namestitve po potrebi</String>
586 <String Id="UITextSelNetworkLocal" Overridable="yes">Te funkcije ne bo več mogoče zagnati iz omrežja, ker bo nameščena na lokalni trdi disk</String>
587 <String Id="UITextSelNetworkNetwork" Overridable="yes">To funkcijo bo še vedno mogoče zagnati iz omrežja</String>
588 <String Id="UITextSelParentCostNegNeg" Overridable="yes">Ta funkcija sprosti [1] prostora na trdem disku. Izbrali ste [2] od [3] podfunkcij, ki sprostijo [4] prostora na trdem disku.</String>
589 <String Id="UITextSelParentCostNegPos" Overridable="yes">Ta funkcija sprosti [1] prostora na trdem disku. Izbrali ste [2] od [3] podfunkcij, ki potrebujejo [4] prostora na trdem disku.</String>
590 <String Id="UITextSelParentCostPosNeg" Overridable="yes">Za to funkcijo potrebujete [1] prostora na trdem disku. Izbrali ste [2] od [3] podfunkcij, ki sprostijo [4] prostora na trdem disku.</String>
591 <String Id="UITextSelParentCostPosPos" Overridable="yes">Za to funkcijo potrebujete [1] prostora na trdem disku. Izbrali ste [2] od [3] podfunkcij, ki potrebujejo [4] prostora na trdem disku.</String>
592 <String Id="UITextTimeRemaining" Overridable="yes">Preostali čas: {[1] min. }{[2] s}</String>
593 <String Id="UITextVolumeCostAvailable" Overridable="yes">Na voljo</String>
594 <String Id="UITextVolumeCostDifference" Overridable="yes">Razlika</String>
595 <String Id="UITextVolumeCostRequired" Overridable="yes">Zahtevano</String>
596 <String Id="UITextVolumeCostSize" Overridable="yes">Velikost diska</String>
597 <String Id="UITextVolumeCostVolume" Overridable="yes">Nosilec</String>
598</WixLocalization>
diff --git a/src/ext/UI/wixlib/WixUI_sq-AL.wxl b/src/ext/UI/wixlib/WixUI_sq-AL.wxl
new file mode 100644
index 00000000..cc06b1e8
--- /dev/null
+++ b/src/ext/UI/wixlib/WixUI_sq-AL.wxl
@@ -0,0 +1,601 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3
4
5<WixLocalization Culture="sq-SQ" Codepage="1252" xmlns="http://wixtoolset.org/schemas/v4/wxl">
6 <!-- _locID@Culture="sq-SQ" _locComment="Shqip" -->
7 <!-- _locID@Codepage="1252" _locComment="Windows-1252" -->
8
9 <String Id="WixUIBack" Overridable="yes"><!-- _locID_text="WixUIBack" _locComment="WixUIBack" -->&amp;Mbrapsht</String>
10 <String Id="WixUINext" Overridable="yes"><!-- _locID_text="WixUINext" _locComment="WixUINext" -->P&amp;asuesi</String>
11 <String Id="WixUICancel" Overridable="yes"><!-- _locID_text="WixUICancel" _locComment="WixUICancel" -->Anuloje</String>
12 <String Id="WixUIFinish" Overridable="yes"><!-- _locID_text="WixUIFinish" _locComment="WixUIFinish" -->Për&amp;fundoje</String>
13 <String Id="WixUIRetry" Overridable="yes"><!-- _locID_text="WixUIRetry" _locComment="WixUIRetry" -->&amp;Riprovoni</String>
14 <String Id="WixUIIgnore" Overridable="yes"><!-- _locID_text="WixUIIgnore" _locComment="WixUIIgnore" -->&amp;Shpërfille</String>
15 <String Id="WixUIYes" Overridable="yes"><!-- _locID_text="WixUIYes" _locComment="WixUIYes" -->&amp;Po</String>
16 <String Id="WixUINo" Overridable="yes"><!-- _locID_text="WixUINo" _locComment="WixUINo" -->&amp;Jo</String>
17 <String Id="WixUIOK" Overridable="yes"><!-- _locID_text="WixUIOK" _locComment="WixUIOK" -->OK</String>
18 <String Id="WixUIPrint" Overridable="yes"><!-- _locID_text="WixUIPrint" _locComment="WixUIPrint" -->Sht&amp;ype</String>
19
20 <String Id="AdvancedWelcomeEulaDlg_Title" Overridable="yes"><!-- _locID_text="AdvancedWelcomeEulaDlg_Title" _locComment="AdvancedWelcomeEulaDlg_Title" -->Rregullim i [ProductName]</String>
21 <String Id="AdvancedWelcomeEulaDlgBannerBitmap" Overridable="yes"><!-- _locID_text="AdvancedWelcomeEulaDlgBannerBitmap" _locComment="AdvancedWelcomeEulaDlgBannerBitmap" -->WixUI_Bmp_Banner</String>
22 <String Id="AdvancedWelcomeEulaDlgTitle" Overridable="yes"><!-- _locID_text="AdvancedWelcomeEulaDlgTitle" _locComment="AdvancedWelcomeEulaDlgTitle" -->{\WixUI_Font_Title}Ju lutemi, lexoni Marrëveshjen e Licencës për [ProductName]</String>
23 <String Id="AdvancedWelcomeEulaDlgLicenseAcceptedCheckBox" Overridable="yes"><!-- _locID_text="AdvancedWelcomeEulaDlgLicenseAcceptedCheckBox" _locComment="AdvancedWelcomeEulaDlgLicenseAcceptedCheckBox" -->I &amp;pranoj kushtet e Marrëveshjes së Licencës</String>
24 <String Id="AdvancedWelcomeEulaDlgDescriptionPerMachine" Overridable="yes"><!-- _locID_text="AdvancedWelcomeEulaDlgDescriptionPerMachine" _locComment="AdvancedWelcomeEulaDlgDescriptionPerMachine" -->Klikoni mbi Instaloje që të instalohet produkti me mundësitë parazgjedhje për krejt përdoruesit. Klikoni Të mëtejshme që të ndryshoni mundësitë e instalimit.</String>
25 <String Id="AdvancedWelcomeEulaDlgDescriptionPerUser" Overridable="yes"><!-- _locID_text="AdvancedWelcomeEulaDlgDescriptionPerUser" _locComment="AdvancedWelcomeEulaDlgDescriptionPerUser" -->Klikoni mbi Instaloje që të instalohet produkti me mundësitë parazgjedhje vetëm për ju. Klikoni Të mëtejshme që të ndryshoni mundësitë e instalimit.</String>
26 <String Id="AdvancedWelcomeEulaDlgInstall" Overridable="yes"><!-- _locID_text="AdvancedWelcomeEulaDlgInstall" _locComment="AdvancedWelcomeEulaDlgInstall" -->&amp;Instaloje</String>
27 <String Id="AdvancedWelcomeEulaDlgAdvanced" Overridable="yes"><!-- _locID_text="AdvancedWelcomeEulaDlgAdvanced" _locComment="AdvancedWelcomeEulaDlgAdvanced" -->Të &amp;mëtejshme</String>
28 <String Id="Advanced_Font_Normal_Size" Overridable="yes"><!-- _locID_text="Advanced_Font_Normal_Size" _locComment="Advanced_Font_Normal_Size" -->8</String>
29 <String Id="Advanced_Font_Bigger_Size" Overridable="yes"><!-- _locID_text="Advanced_Font_Bigger_Size" _locComment="Advanced_Font_Bigger_Size" -->12</String>
30 <String Id="Advanced_Font_Title_Size" Overridable="yes"><!-- _locID_text="Advanced_Font_Title_Size" _locComment="Advanced_Font_Title_Size" -->9</String>
31 <String Id="Advanced_Font_Emphasized_Size" Overridable="yes"><!-- _locID_text="Advanced_Font_Emphasized_Size" _locComment="Advanced_Font_Emphasized_Size" -->8</String>
32 <String Id="Advanced_Font_FaceName" Overridable="yes"><!-- _locID_text="Advanced_Font_FaceName" _locComment="Advanced_Font_FaceName" -->Tahoma</String>
33
34 <String Id="BrowseDlg_Title" Overridable="yes"><!-- _locID_text="BrowseDlg_Title" _locComment="BrowseDlg_Title" -->Rregullim i [ProductName] </String>
35 <String Id="BrowseDlgComboLabel" Overridable="yes"><!-- _locID_text="BrowseDlgComboLabel" _locComment="BrowseDlgComboLabel" -->&amp;Shih te:</String>
36 <String Id="BrowseDlgWixUI_Bmp_Up" Overridable="yes"><!-- _locID_text="BrowseDlgWixUI_Bmp_Up" _locComment="BrowseDlgWixUI_Bmp_Up" -->WixUI_Bmp_Up</String>
37 <String Id="BrowseDlgWixUI_Bmp_UpTooltip" Overridable="yes"><!-- _locID_text="BrowseDlgWixUI_Bmp_UpTooltip" _locComment="BrowseDlgWixUI_Bmp_UpTooltip" -->Një nivel më sipër</String>
38 <String Id="BrowseDlgNewFolder" Overridable="yes"><!-- _locID_text="BrowseDlgNewFolder" _locComment="BrowseDlgNewFolder" -->WixUI_Bmp_New</String>
39 <String Id="BrowseDlgNewFolderTooltip" Overridable="yes"><!-- _locID_text="BrowseDlgNewFolderTooltip" _locComment="BrowseDlgNewFolderTooltip" -->Krijo një dosje të re</String>
40 <String Id="BrowseDlgPathLabel" Overridable="yes"><!-- _locID_text="BrowseDlgPathLabel" _locComment="BrowseDlgPathLabel" -->Emër &amp;dosjeje:</String>
41 <String Id="BrowseDlgBannerBitmap" Overridable="yes"><!-- _locID_text="BrowseDlgBannerBitmap" _locComment="BrowseDlgBannerBitmap" -->WixUI_Bmp_Banner</String>
42 <String Id="BrowseDlgDescription" Overridable="yes"><!-- _locID_text="BrowseDlgDescription" _locComment="BrowseDlgDescription" -->Kaloni te dosja destinacion</String>
43 <String Id="BrowseDlgTitle" Overridable="yes"><!-- _locID_text="BrowseDlgTitle" _locComment="BrowseDlgTitle" -->{\WixUI_Font_Title}Ndryshoni dosjen destinacion</String>
44
45 <String Id="CancelDlg_Title" Overridable="yes"><!-- _locID_text="CancelDlg_Title" _locComment="CancelDlg_Title" -->Rregullim i [ProductName] </String>
46 <String Id="CancelDlgText" Overridable="yes"><!-- _locID_text="CancelDlgText" _locComment="CancelDlgText" -->Jeni i sigurt se doni të anulohet instalimi i [ProductName]?</String>
47 <String Id="CancelDlgIcon" Overridable="yes"><!-- _locID_text="CancelDlgIcon" _locComment="CancelDlgIcon" -->WixUI_Ico_Info</String>
48 <String Id="CancelDlgIconTooltip" Overridable="yes"><!-- _locID_text="CancelDlgIconTooltip" _locComment="CancelDlgIconTooltip" -->Ikonë informacioni</String>
49
50 <String Id="CustomizeDlg_Title" Overridable="yes"><!-- _locID_text="CustomizeDlg_Title" _locComment="CustomizeDlg_Title" -->Rregullim i [ProductName]</String>
51 <String Id="CustomizeDlgTree" Overridable="yes"><!-- _locID_text="CustomizeDlgTree" _locComment="CustomizeDlgTree" -->Pemë përzgjedhjesh</String>
52 <String Id="CustomizeDlgBrowse" Overridable="yes"><!-- _locID_text="CustomizeDlgBrowse" _locComment="CustomizeDlgBrowse" -->Shfle&amp;oni...</String>
53 <String Id="CustomizeDlgReset" Overridable="yes"><!-- _locID_text="CustomizeDlgReset" _locComment="CustomizeDlgReset" -->&amp;Riktheje në fillimet</String>
54 <String Id="CustomizeDlgDiskCost" Overridable="yes"><!-- _locID_text="CustomizeDlgDiskCost" _locComment="CustomizeDlgDiskCost" -->&amp;Përdorim Disku</String>
55 <String Id="CustomizeDlgBannerBitmap" Overridable="yes"><!-- _locID_text="CustomizeDlgBannerBitmap" _locComment="CustomizeDlgBannerBitmap" -->WixUI_Bmp_Banner</String>
56 <String Id="CustomizeDlgText" Overridable="yes"><!-- _locID_text="CustomizeDlgText" _locComment="CustomizeDlgText" -->Klikoni mbi ikonën te pema më poshtë që të ndryshoni mënyrën se si instalohen veçoritë.</String>
57 <String Id="CustomizeDlgDescription" Overridable="yes"><!-- _locID_text="CustomizeDlgDescription" _locComment="CustomizeDlgDescription" -->Përzgjidhni mënyrën se si instalohen veçoritë.</String>
58 <String Id="CustomizeDlgTitle" Overridable="yes"><!-- _locID_text="CustomizeDlgTitle" _locComment="CustomizeDlgTitle" -->{\WixUI_Font_Title}Rregullim Vetjak</String>
59 <String Id="CustomizeDlgItemDescription" Overridable="yes"><!-- _locID_text="CustomizeDlgItemDescription" _locComment="CustomizeDlgItemDescription" -->CustomizeDlgItemDescription-CustomizeDlgItemDescription</String>
60 <String Id="CustomizeDlgItemSize" Overridable="yes"><!-- _locID_text="CustomizeDlgItemSize" _locComment="CustomizeDlgItemSize" -->CustomizeDlgItemSize-CustomizeDlgItemSize</String>
61 <String Id="CustomizeDlgLocation" Overridable="yes"><!-- _locID_text="CustomizeDlgLocation" _locComment="CustomizeDlgLocation" -->CustomizeDlgLocation-CustomizeDlgLocation</String>
62 <String Id="CustomizeDlgLocationLabel" Overridable="yes"><!-- _locID_text="CustomizeDlgLocationLabel" _locComment="CustomizeDlgLocationLabel" -->Vend:</String>
63
64 <String Id="DiskCostDlg_Title" Overridable="yes"><!-- _locID_text="DiskCostDlg_Title" _locComment="DiskCostDlg_Title" -->Rregullim i [ProductName]</String>
65 <String Id="DiskCostDlgBannerBitmap" Overridable="yes"><!-- _locID_text="DiskCostDlgBannerBitmap" _locComment="DiskCostDlgBannerBitmap" -->WixUI_Bmp_Banner</String>
66 <String Id="DiskCostDlgText" Overridable="yes"><!-- _locID_text="DiskCostDlgText" _locComment="DiskCostDlgText" -->Vëllimet e theksuar nuk kanë në disk hapësirë të mjaftueshme për veçoritë e përzgjedhura. Ose mund të hiqni skedarë prej vëllimeve të theksuar, ose të instaloni më pak veçori, ose të përzgjidhni disqe të tjerë destinacion.</String>
67 <String Id="DiskCostDlgDescription" Overridable="yes"><!-- _locID_text="DiskCostDlgDescription" _locComment="DiskCostDlgDescription" -->Hapësira e domosdoshme në disk për instalimin e veçorive të përzgjedhura.</String>
68 <String Id="DiskCostDlgTitle" Overridable="yes"><!-- _locID_text="DiskCostDlgTitle" _locComment="DiskCostDlgTitle" -->{\WixUI_Font_Title}Domosdoshmëri Hapësire Disku</String>
69 <String Id="DiskCostDlgVolumeList" Overridable="yes"><!-- _locID_text="DiskCostDlgVolumeList" _locComment="DiskCostDlgVolumeList" -->{120}{70}{70}{70}{70}</String>
70
71 <String Id="ErrorDlg_Title" Overridable="yes"><!-- _locID_text="ErrorDlg_Title" _locComment="ErrorDlg_Title" -->Rregullim i [ProductName]</String>
72 <String Id="ErrorDlgErrorText" Overridable="yes"><!-- _locID_text="ErrorDlgErrorText" _locComment="ErrorDlgErrorText" -->Tekst informacioni</String>
73 <String Id="ErrorDlgErrorIcon" Overridable="yes"><!-- _locID_text="ErrorDlgErrorIcon" _locComment="ErrorDlgErrorIcon" -->WixUI_Ico_Info</String>
74 <String Id="ErrorDlgErrorIconTooltip" Overridable="yes"><!-- _locID_text="ErrorDlgErrorIconTooltip" _locComment="ErrorDlgErrorIconTooltip" -->Ikonë informacioni</String>
75
76 <String Id="ExitDialog_Title" Overridable="yes"><!-- _locID_text="ExitDialog_Title" _locComment="ExitDialog_Title" -->Rregullim i [ProductName]</String>
77 <String Id="ExitDialogBitmap" Overridable="yes"><!-- _locID_text="ExitDialogBitmap" _locComment="ExitDialogBitmap" -->WixUI_Bmp_Dialog</String>
78 <String Id="ExitDialogDescription" Overridable="yes"><!-- _locID_text="ExitDialogDescription" _locComment="ExitDialogDescription" -->Klikoni mbi butonin Përfundoje që të dilet nga Ndihmësi i Rregullimit.</String>
79 <String Id="ExitDialogTitle" Overridable="yes"><!-- _locID_text="ExitDialogTitle" _locComment="ExitDialogTitle" -->{\WixUI_Font_Bigger}U plotësua Rregullimi i [ProductName] </String>
80
81 <String Id="FatalError_Title" Overridable="yes"><!-- _locID_text="FatalError_Title" _locComment="FatalError_Title" -->Rregullim i [ProductName]</String>
82 <String Id="FatalErrorBitmap" Overridable="yes"><!-- _locID_text="FatalErrorBitmap" _locComment="FatalErrorBitmap" -->WixUI_Bmp_Dialog</String>
83 <String Id="FatalErrorTitle" Overridable="yes"><!-- _locID_text="FatalErrorTitle" _locComment="FatalErrorTitle" -->{\WixUI_Font_Bigger}Ndihmësi i Rregullimit të [ProductName] përfundoi para kohe</String>
84 <String Id="FatalErrorDescription1" Overridable="yes"><!-- _locID_text="FatalErrorDescription1" _locComment="FatalErrorDescription1" -->Ndihmësi i Rregullimit të [ProductName] përfundoi para kohe, për shkak të një gabimi. Sistemi juaj nuk u modifikua. Që të instaloni këtë program në një kohë tjetër, rixhironi Ndihmësin e Rregullimit.</String>
85 <String Id="FatalErrorDescription2" Overridable="yes"><!-- _locID_text="FatalErrorDescription2" _locComment="FatalErrorDescription2" -->Klikoni butonin Përfundoje që të dilni nga Ndihmësi i Rregullimit.</String>
86
87 <String Id="FeaturesDlg_Title" Overridable="yes"><!-- _locID_text="FeaturesDlg_Title" _locComment="FeaturesDlg_Title" -->Rregullim i [ProductName]</String>
88 <String Id="FeaturesDlgTree" Overridable="yes"><!-- _locID_text="FeaturesDlgTree" _locComment="FeaturesDlgTree" -->Veçori produkti</String>
89 <String Id="FeaturesDlgBannerBitmap" Overridable="yes"><!-- _locID_text="FeaturesDlgBannerBitmap" _locComment="FeaturesDlgBannerBitmap" -->WixUI_Bmp_Banner</String>
90 <String Id="FeaturesDlgDescription" Overridable="yes"><!-- _locID_text="FeaturesDlgDescription" _locComment="FeaturesDlgDescription" -->Përzgjidhni mënyrën se si instalohen veçoritë.</String>
91 <String Id="FeaturesDlgTitle" Overridable="yes"><!-- _locID_text="FeaturesDlgTitle" _locComment="FeaturesDlgTitle" -->{\WixUI_Font_Title}Veçori Produkti</String>
92 <String Id="FeaturesDlgItemDescription" Overridable="yes"><!-- _locID_text="FeaturesDlgItemDescription" _locComment="FeaturesDlgItemDescription" -->FeaturesDlgItemDescription</String>
93 <String Id="FeaturesDlgItemSize" Overridable="yes"><!-- _locID_text="FeaturesDlgItemSize" _locComment="FeaturesDlgItemSize" -->FeaturesDlgItemSize</String>
94 <String Id="FeaturesDlgInstall" Overridable="yes"><!-- _locID_text="FeaturesDlgInstall" _locComment="FeaturesDlgInstall" -->&amp;Instaloje</String>
95 <String Id="FeaturesDlgChange" Overridable="yes"><!-- _locID_text="FeaturesDlgChange" _locComment="FeaturesDlgChange" -->&amp;Ndryshojini</String>
96
97 <String Id="FilesInUse_Title" Overridable="yes"><!-- _locID_text="FilesInUse_Title" _locComment="FilesInUse_Title" -->Rregullim i [ProductName]</String>
98 <String Id="FilesInUseExit" Overridable="yes"><!-- _locID_text="FilesInUseExit" _locComment="FilesInUseExit" -->&amp;Dilni</String>
99 <String Id="FilesInUseBannerBitmap" Overridable="yes"><!-- _locID_text="FilesInUseBannerBitmap" _locComment="FilesInUseBannerBitmap" -->WixUI_Bmp_Banner</String>
100 <String Id="FilesInUseText" Overridable="yes"><!-- _locID_text="FilesInUseText" _locComment="FilesInUseText" -->Aplikacionet vijuese po përdorin skedarë që lypset të përditësohen nga ky rregullim. Mbyllini këto aplikacione dhe mandej klikoni mbi &amp;Riprovoni që të vazhdohet rregullimi, ose mbi Dilni që të dilet.</String>
101 <String Id="FilesInUseDescription" Overridable="yes"><!-- _locID_text="FilesInUseDescription" _locComment="FilesInUseDescription" -->Disa skedarë që lypset të përditësohen janë hëpërhë në përdorim e sipër.</String>
102 <String Id="FilesInUseTitle" Overridable="yes"><!-- _locID_text="FilesInUseTitle" _locComment="FilesInUseTitle" -->{\WixUI_Font_Title}Skedarë në Përdorim</String>
103
104 <String Id="InstallDirDlg_Title" Overridable="yes"><!-- _locID_text="InstallDirDlg_Title" _locComment="InstallDirDlg_Title" -->Rregullim i [ProductName]</String>
105 <String Id="InstallDirDlgChange" Overridable="yes"><!-- _locID_text="InstallDirDlgChange" _locComment="InstallDirDlgChange" -->&amp;Ndryshojini...</String>
106 <String Id="InstallDirDlgTitle" Overridable="yes"><!-- _locID_text="InstallDirDlgTitle" _locComment="InstallDirDlgTitle" -->{\WixUI_Font_Title}Dosje destinacion</String>
107 <String Id="InstallDirDlgDescription" Overridable="yes"><!-- _locID_text="InstallDirDlgDescription" _locComment="InstallDirDlgDescription" -->Klikoni mbi Pasuesi që të instalohet te dosja e parazgjedhje, ose klikoni mbi Ndryshojini që të zgjidhni një tjetër.</String>
108 <String Id="InstallDirDlgBannerBitmap" Overridable="yes"><!-- _locID_text="InstallDirDlgBannerBitmap" _locComment="InstallDirDlgBannerBitmap" -->WixUI_Bmp_Banner</String>
109 <String Id="InstallDirDlgFolderLabel" Overridable="yes"><!-- _locID_text="InstallDirDlgFolderLabel" _locComment="InstallDirDlgFolderLabel" -->Instaloje [ProductName] te:</String>
110
111 <String Id="InstallScopeDlg_Title" Overridable="yes"><!-- _locID_text="InstallScopeDlg_Title" _locComment="InstallScopeDlg_Title" -->Rregullim i [ProductName]</String>
112 <String Id="InstallScopeDlgBannerBitmap" Overridable="yes"><!-- _locID_text="InstallScopeDlgBannerBitmap" _locComment="InstallScopeDlgBannerBitmap" -->WixUI_Bmp_Banner</String>
113 <String Id="InstallScopeDlgDescription" Overridable="yes"><!-- _locID_text="InstallScopeDlgDescription" _locComment="InstallScopeDlgDescription" -->Zgjidhni shtrirjen dhe dosjen e instalimit</String>
114 <String Id="InstallScopeDlgTitle" Overridable="yes"><!-- _locID_text="InstallScopeDlgTitle" _locComment="InstallScopeDlgTitle" -->{\WixUI_Font_Title}Shtrirje Instalimi</String>
115 <String Id="InstallScopeDlgPerUser" Overridable="yes"><!-- _locID_text="InstallScopeDlgPerUser" _locComment="InstallScopeDlgPerUser" -->{\WixUI_Font_Emphasized}Instalojeni &amp;vetëm për ju ([LogonUser])</String>
116 <String Id="InstallScopeDlgPerUserDescription" Overridable="yes"><!-- _locID_text="InstallScopeDlgPerUserDescription" _locComment="InstallScopeDlgPerUserDescription" -->[ProductName] do të instalohet në një dosje përdoruesi dhe do të mund ta përdorni thjesht nga llogaria juaj e përdoruesit. S’keni nevojë për privilegje Administratori lokal.</String>
117 <String Id="InstallScopeDlgNoPerUserDescription" Overridable="yes"><!-- _locID_text="InstallScopeDlgNoPerUserDescription" _locComment="InstallScopeDlgNoPerUserDescription" -->[ProductName] nuk e mbulon instalimin me bazë përdoruesit.</String>
118 <String Id="InstallScopeDlgPerMachine" Overridable="yes"><!-- _locID_text="InstallScopeDlgPerMachine" _locComment="InstallScopeDlgPerMachine" -->{\WixUI_Font_Emphasized}Instaloje për krejt përdoruesit e kësaj &amp;makine</String>
119 <String Id="InstallScopeDlgPerMachineDescription" Overridable="yes"><!-- _locID_text="InstallScopeDlgPerMachineDescription" _locComment="InstallScopeDlgPerMachineDescription" -->[ProductName] do të instalohet, si parazgjedhje, në një dosje për krejt makinën dhe do të mund të përdoret nga krejt përdoruesit. Dosjen parazgjedhje të instalimit mund ta ndryshoni. Duhet të keni privilegje Administratori lokal.</String>
120 <String Id="InstallScopeDlgFolderLabel" Overridable="yes"><!-- _locID_text="InstallScopeDlgFolderLabel" _locComment="InstallScopeDlgFolderLabel" -->&amp;Dosje instalimi:</String>
121 <String Id="InstallScopeDlgChange" Overridable="yes"><!-- _locID_text="InstallScopeDlgChange" _locComment="InstallScopeDlgChange" -->&amp;Ndryshojini...</String>
122
123 <String Id="InvalidDirDlg_Title" Overridable="yes"><!-- _locID_text="InvalidDirDlg_Title" _locComment="InvalidDirDlg_Title" -->Rregullim i [ProductName]</String>
124 <String Id="InvalidDirDlgText" Overridable="yes"><!-- _locID_text="InvalidDirDlgText" _locComment="InvalidDirDlgText" -->Direktoria e instalimit duhet të gjenden në disk lokal.</String>
125 <String Id="InvalidDirDlgIcon" Overridable="yes"><!-- _locID_text="InvalidDirDlgIcon" _locComment="InvalidDirDlgIcon" -->WixUI_Ico_Info</String>
126 <String Id="InvalidDirDlgIconTooltip" Overridable="yes"><!-- _locID_text="InvalidDirDlgIconTooltip" _locComment="InvalidDirDlgIconTooltip" -->Ikonë informacioni</String>
127
128 <String Id="LicenseAgreementDlg_Title" Overridable="yes"><!-- _locID_text="LicenseAgreementDlg_Title" _locComment="LicenseAgreementDlg_Title" -->Rregullim i [ProductName]</String>
129 <String Id="LicenseAgreementDlgLicenseAcceptedCheckBox" Overridable="yes"><!-- _locID_text="LicenseAgreementDlgLicenseAcceptedCheckBox" _locComment="LicenseAgreementDlgLicenseAcceptedCheckBox" -->I &amp;pranoj kushtet e Marrëveshjesh së Licencës</String>
130 <String Id="LicenseAgreementDlgBannerBitmap" Overridable="yes"><!-- _locID_text="LicenseAgreementDlgBannerBitmap" _locComment="LicenseAgreementDlgBannerBitmap" -->WixUI_Bmp_Banner</String>
131 <String Id="LicenseAgreementDlgDescription" Overridable="yes"><!-- _locID_text="LicenseAgreementDlgDescription" _locComment="LicenseAgreementDlgDescription" -->Ju lutemi, lexojeni me kujdes marrëveshjen vijuese për licencën</String>
132 <String Id="LicenseAgreementDlgTitle" Overridable="yes"><!-- _locID_text="LicenseAgreementDlgTitle" _locComment="LicenseAgreementDlgTitle" -->{\WixUI_Font_Title}Marrëveshje Licence Përdoruesi të Fundmë</String>
133
134 <String Id="MaintenanceTypeDlg_Title" Overridable="yes"><!-- _locID_text="MaintenanceTypeDlg_Title" _locComment="MaintenanceTypeDlg_Title" -->Rregullim i [ProductName]</String>
135 <String Id="MaintenanceTypeDlgChangeButton" Overridable="yes"><!-- _locID_text="MaintenanceTypeDlgChangeButton" _locComment="MaintenanceTypeDlgChangeButton" -->&amp;Ndryshoje</String>
136 <String Id="MaintenanceTypeDlgChangeButtonTooltip" Overridable="yes"><!-- _locID_text="MaintenanceTypeDlgChangeButtonTooltip" _locComment="MaintenanceTypeDlgChangeButtonTooltip" -->Ndryshoni Instalimin</String>
137 <String Id="MaintenanceTypeDlgRepairButton" Overridable="yes"><!-- _locID_text="MaintenanceTypeDlgRepairButton" _locComment="MaintenanceTypeDlgRepairButton" -->Ri&amp;paroje</String>
138 <String Id="MaintenanceTypeDlgRepairButtonTooltip" Overridable="yes"><!-- _locID_text="MaintenanceTypeDlgRepairButtonTooltip" _locComment="MaintenanceTypeDlgRepairButtonTooltip" -->Riparoni Instalimin</String>
139 <String Id="MaintenanceTypeDlgRemoveButton" Overridable="yes"><!-- _locID_text="MaintenanceTypeDlgRemoveButton" _locComment="MaintenanceTypeDlgRemoveButton" -->&amp;Hiqe</String>
140 <String Id="MaintenanceTypeDlgRemoveButtonTooltip" Overridable="yes"><!-- _locID_text="MaintenanceTypeDlgRemoveButtonTooltip" _locComment="MaintenanceTypeDlgRemoveButtonTooltip" -->Hiqeni Instalimin</String>
141 <String Id="MaintenanceTypeDlgBannerBitmap" Overridable="yes"><!-- _locID_text="MaintenanceTypeDlgBannerBitmap" _locComment="MaintenanceTypeDlgBannerBitmap" -->WixUI_Bmp_Banner</String>
142 <String Id="MaintenanceTypeDlgDescription" Overridable="yes"><!-- _locID_text="MaintenanceTypeDlgDescription" _locComment="MaintenanceTypeDlgDescription" -->Përzgjidhni veprimin që dëshironi të kryhet.</String>
143 <String Id="MaintenanceTypeDlgTitle" Overridable="yes"><!-- _locID_text="MaintenanceTypeDlgTitle" _locComment="MaintenanceTypeDlgTitle" -->{\WixUI_Font_Title}Ndryshoni, riparoni, ose hiqni një instalim</String>
144 <String Id="MaintenanceTypeDlgChangeText" Overridable="yes"><!-- _locID_text="MaintenanceTypeDlgChangeText" _locComment="MaintenanceTypeDlgChangeText" -->Ju lejon të ndryshoni mënyrën se si instalohen veçoritë.</String>
145 <String Id="MaintenanceTypeDlgChangeDisabledText" Overridable="yes"><!-- _locID_text="MaintenanceTypeDlgChangeDisabledText" _locComment="MaintenanceTypeDlgChangeDisabledText" -->[ProductName] nuk ka veçori që mund të përzgjidhen në mënyrë të pavarur.</String>
146 <String Id="MaintenanceTypeDlgRemoveText" Overridable="yes"><!-- _locID_text="MaintenanceTypeDlgRemoveText" _locComment="MaintenanceTypeDlgRemoveText" -->E heq [ProductName] nga kompjuteri juaj.</String>
147 <String Id="MaintenanceTypeDlgRemoveDisabledText" Overridable="yes"><!-- _locID_text="MaintenanceTypeDlgRemoveDisabledText" _locComment="MaintenanceTypeDlgRemoveDisabledText" -->[ProductName] s’hiqet dot.</String>
148 <String Id="MaintenanceTypeDlgRepairText" Overridable="yes"><!-- _locID_text="MaintenanceTypeDlgRepairText" _locComment="MaintenanceTypeDlgRepairText" -->Ndreq gabimet në instalimin më të freskët duke riparuar skedarë që mungojnë ose janë të dëmtuar, shkurtore tastiere, dhe zëra regjistri.</String>
149 <String Id="MaintenanceTypeDlgRepairDisabledText" Overridable="yes"><!-- _locID_text="MaintenanceTypeDlgRepairDisabledText" _locComment="MaintenanceTypeDlgRepairDisabledText" -->[ProductName] s’riparohet dot.</String>
150
151 <String Id="MaintenanceWelcomeDlg_Title" Overridable="yes"><!-- _locID_text="MaintenanceWelcomeDlg_Title" _locComment="MaintenanceWelcomeDlg_Title" -->Rregullim i [ProductName]</String>
152 <String Id="MaintenanceWelcomeDlgBitmap" Overridable="yes"><!-- _locID_text="MaintenanceWelcomeDlgBitmap" _locComment="MaintenanceWelcomeDlgBitmap" -->WixUI_Bmp_Dialog</String>
153 <String Id="MaintenanceWelcomeDlgDescription" Overridable="yes"><!-- _locID_text="MaintenanceWelcomeDlgDescription" _locComment="MaintenanceWelcomeDlgDescription" -->Ndihmësi i Rregullimit ju lejon të ndryshoni mënyrën se si instalohen veçoritë e [ProductName] në kompjuterin tuaj, ose ta hiqni nga kompjuteri juaj. Klikoni mbi Pasuesi që të vazhdohet, ose mbi Anuloje që të dilet nga Ndihmësi i Rregullimit.</String>
154 <String Id="MaintenanceWelcomeDlgTitle" Overridable="yes"><!-- _locID_text="MaintenanceWelcomeDlgTitle" _locComment="MaintenanceWelcomeDlgTitle" -->{\WixUI_Font_Bigger}Mirë se vini te Ndihmësi i Rregullimit të [ProductName]</String>
155
156 <String Id="MsiRMFilesInUse_Title" Overridable="yes"><!-- _locID_text="MsiRMFilesInUse_Title" _locComment="MsiRMFilesInUse_Title" -->Rregullim i [ProductName]</String>
157 <String Id="MsiRMFilesInUseBannerBitmap" Overridable="yes"><!-- _locID_text="MsiRMFilesInUseBannerBitmap" _locComment="MsiRMFilesInUseBannerBitmap" -->WixUI_Bmp_Banner</String>
158 <String Id="MsiRMFilesInUseText" Overridable="yes"><!-- _locID_text="MsiRMFilesInUseText" _locComment="MsiRMFilesInUseText" -->Aplikacionet vijuese po përdorin skedarë që lypset të përditësohen nga ky rregullim. Mund të lini Ndihmësin e Rregulluesit t’i mbyllë dhe t’i rinisë ato, ose të rinisë makinën më vonë.</String>
159 <String Id="MsiRMFilesInUseDescription" Overridable="yes"><!-- _locID_text="MsiRMFilesInUseDescription" _locComment="MsiRMFilesInUseDescription" -->Disa skedarë që lypset të përditësohen janë hëpërhë në përdorim e sipër.</String>
160 <String Id="MsiRMFilesInUseTitle" Overridable="yes"><!-- _locID_text="MsiRMFilesInUseTitle" _locComment="MsiRMFilesInUseTitle" -->{\WixUI_Font_Title}Skedarë në Përdorim</String>
161 <String Id="MsiRMFilesInUseUseRM" Overridable="yes"><!-- _locID_text="MsiRMFilesInUseUseRM" _locComment="MsiRMFilesInUseUseRM" -->&amp;Mbylli aplikacionet dhe provo t’i rinisësh.</String>
162 <String Id="MsiRMFilesInUseDontUseRM" Overridable="yes"><!-- _locID_text="MsiRMFilesInUseDontUseRM" _locComment="MsiRMFilesInUseDontUseRM" -->M&amp;os i mbyll aplikacionet. Do të kërkohet një rinisje.</String>
163
164 <String Id="OutOfDiskDlg_Title" Overridable="yes"><!-- _locID_text="OutOfDiskDlg_Title" _locComment="OutOfDiskDlg_Title" -->Rregullim i [ProductName]</String>
165 <String Id="OutOfDiskDlgBannerBitmap" Overridable="yes"><!-- _locID_text="OutOfDiskDlgBannerBitmap" _locComment="OutOfDiskDlgBannerBitmap" -->WixUI_Bmp_Banner</String>
166 <String Id="OutOfDiskDlgText" Overridable="yes"><!-- _locID_text="OutOfDiskDlgText" _locComment="OutOfDiskDlgText" -->Vëllimet e theksuar nuk kanë në disk hapësirë të mjaftueshme për veçoritë e përzgjedhura. Ose mund të hiqni skedarë prej vëllimeve të theksuar, ose të instaloni më pak veçori, ose të përzgjidhni një tjetër disk destinacion.</String>
167 <String Id="OutOfDiskDlgDescription" Overridable="yes"><!-- _locID_text="OutOfDiskDlgDescription" _locComment="OutOfDiskDlgDescription" -->Hapësira e diskut e domosdoshme për instalim e tejkalon hapësirën e mundshme në disk.</String>
168 <String Id="OutOfDiskDlgTitle" Overridable="yes"><!-- _locID_text="OutOfDiskDlgTitle" _locComment="OutOfDiskDlgTitle" -->{\WixUI_Font_Title}Pa Hapësirë Disku</String>
169 <String Id="OutOfDiskDlgVolumeList" Overridable="yes"><!-- _locID_text="OutOfDiskDlgVolumeList" _locComment="OutOfDiskDlgVolumeList" -->{120}{70}{70}{70}{70}</String>
170
171 <String Id="OutOfRbDiskDlg_Title" Overridable="yes"><!-- _locID_text="OutOfRbDiskDlg_Title" _locComment="OutOfRbDiskDlg_Title" -->Rregullim i [ProductName]</String>
172 <String Id="OutOfRbDiskDlgBannerBitmap" Overridable="yes"><!-- _locID_text="OutOfRbDiskDlgBannerBitmap" _locComment="OutOfRbDiskDlgBannerBitmap" -->WixUI_Bmp_Banner</String>
173 <String Id="OutOfRbDiskDlgText" Overridable="yes"><!-- _locID_text="OutOfRbDiskDlgText" _locComment="OutOfRbDiskDlgText" -->Vëllimet e theksuar nuk kanë në disk hapësirë të mjaftueshme për veçoritë e përzgjedhura. Ose mund të hiqni skedarë prej vëllimeve të theksuar, ose të instaloni më pak veçori, ose të përzgjidhni një tjetër disk destinacion.</String>
174 <String Id="OutOfRbDiskDlgDescription" Overridable="yes"><!-- _locID_text="OutOfRbDiskDlgDescription" _locComment="OutOfRbDiskDlgDescription" -->Hapësira e diskut e domosdoshme për instalim e tejkalon hapësirën e mundshme në disk..</String>
175 <String Id="OutOfRbDiskDlgTitle" Overridable="yes"><!-- _locID_text="OutOfRbDiskDlgTitle" _locComment="OutOfRbDiskDlgTitle" -->{\WixUI_Font_Title}Pa Hapësirë Disku</String>
176 <String Id="OutOfRbDiskDlgVolumeList" Overridable="yes"><!-- _locID_text="OutOfRbDiskDlgVolumeList" _locComment="OutOfRbDiskDlgVolumeList" -->{120}{70}{70}{70}{70}</String>
177 <String Id="OutOfRbDiskDlgText2" Overridable="yes"><!-- _locID_text="OutOfRbDiskDlgText2" _locComment="OutOfRbDiskDlgText2" -->Ndryshe, mund të zgjidhni të çaktivizohet funksioni i prapakthimit të instaluesit. Çaktivizimi i prapakthimit ia bën të pamundur instaluesit të rikthejë kompjuterin në gjendjen origjinale, në rastet kur instalimi ndërpritet për çfarëdo arsye. Klikoni mbi Po, nëse dëshironi të rrezikoni duke çaktivizuar prapakthimet.</String>
178
179 <String Id="PrepareDlg_Title" Overridable="yes"><!-- _locID_text="PrepareDlg_Title" _locComment="PrepareDlg_Title" -->Rregullim i [ProductName]</String>
180 <String Id="PrepareDlgBitmap" Overridable="yes"><!-- _locID_text="PrepareDlgBitmap" _locComment="PrepareDlgBitmap" -->WixUI_Bmp_Dialog</String>
181 <String Id="PrepareDlgDescription" Overridable="yes"><!-- _locID_text="PrepareDlgDescription" _locComment="PrepareDlgDescription" -->Ju lutemi, pritni teksa Ndihmësi i Rregullimit përgatitet t’ju udhëheqë përmes instalimit.</String>
182 <String Id="PrepareDlgTitle" Overridable="yes"><!-- _locID_text="PrepareDlgTitle" _locComment="PrepareDlgTitle" -->{\WixUI_Font_Bigger}Mirë se vini te Ndihmësi i Rregullimit të [ProductName]</String>
183
184 <String Id="ProgressDlg_Title" Overridable="yes"><!-- _locID_text="ProgressDlg_Title" _locComment="ProgressDlg_Title" -->Rregullim i [ProductName]</String>
185 <String Id="ProgressDlgBannerBitmap" Overridable="yes"><!-- _locID_text="ProgressDlgBannerBitmap" _locComment="ProgressDlgBannerBitmap" -->WixUI_Bmp_Banner</String>
186 <String Id="ProgressDlgTextInstalling" Overridable="yes"><!-- _locID_text="ProgressDlgTextInstalling" _locComment="ProgressDlgTextInstalling" -->Ju lutemi, pritni teksa Ndihmësi i Rregullimit instalon [ProductName].</String>
187 <String Id="ProgressDlgTitleInstalling" Overridable="yes"><!-- _locID_text="ProgressDlgTitleInstalling" _locComment="ProgressDlgTitleInstalling" -->{\WixUI_Font_Title}Po instalohet [ProductName]</String>
188 <String Id="ProgressDlgTextChanging" Overridable="yes"><!-- _locID_text="ProgressDlgTextChanging" _locComment="ProgressDlgTextChanging" -->Ju lutemi, pritni teksa Ndihmësi i Rregullimit ndryshon [ProductName].</String>
189 <String Id="ProgressDlgTitleChanging" Overridable="yes"><!-- _locID_text="ProgressDlgTitleChanging" _locComment="ProgressDlgTitleChanging" -->{\WixUI_Font_Title}Po ndryshohet [ProductName]</String>
190 <String Id="ProgressDlgTextRepairing" Overridable="yes"><!-- _locID_text="ProgressDlgTextRepairing" _locComment="ProgressDlgTextRepairing" -->Ju lutemi, pritni teksa Ndihmësi i Rregullimit riparon [ProductName].</String>
191 <String Id="ProgressDlgTitleRepairing" Overridable="yes"><!-- _locID_text="ProgressDlgTitleRepairing" _locComment="ProgressDlgTitleRepairing" -->{\WixUI_Font_Title}Po riparohet [ProductName]</String>
192 <String Id="ProgressDlgTextRemoving" Overridable="yes"><!-- _locID_text="ProgressDlgTextRemoving" _locComment="ProgressDlgTextRemoving" -->Ju lutemi, pritni teksa Ndihmësi i Rregullimit heq [ProductName].</String>
193 <String Id="ProgressDlgTitleRemoving" Overridable="yes"><!-- _locID_text="ProgressDlgTitleRemoving" _locComment="ProgressDlgTitleRemoving" -->{\WixUI_Font_Title}Po hiqet [ProductName]</String>
194 <String Id="ProgressDlgTextUpdating" Overridable="yes"><!-- _locID_text="ProgressDlgTextUpdating" _locComment="ProgressDlgTextUpdating" -->Ju lutemi, pritni teksa Ndihmësi i Rregullimit përditëson [ProductName].</String>
195 <String Id="ProgressDlgTitleUpdating" Overridable="yes"><!-- _locID_text="ProgressDlgTitleUpdating" _locComment="ProgressDlgTitleUpdating" -->{\WixUI_Font_Title}Po përditësohet [ProductName]</String>
196 <String Id="ProgressDlgProgressBar" Overridable="yes"><!-- _locID_text="ProgressDlgProgressBar" _locComment="ProgressDlgProgressBar" -->Ecuria deri tani</String>
197 <String Id="ProgressDlgStatusLabel" Overridable="yes"><!-- _locID_text="ProgressDlgStatusLabel" _locComment="ProgressDlgStatusLabel" -->Gjendje:</String>
198
199 <String Id="ResumeDlg_Title" Overridable="yes"><!-- _locID_text="ResumeDlg_Title" _locComment="ResumeDlg_Title" -->Rregullim i [ProductName]</String>
200 <String Id="ResumeDlgInstall" Overridable="yes"><!-- _locID_text="ResumeDlgInstall" _locComment="ResumeDlgInstall" -->&amp;Instaloje</String>
201 <String Id="ResumeDlgBitmap" Overridable="yes"><!-- _locID_text="ResumeDlgBitmap" _locComment="ResumeDlgBitmap" -->WixUI_Bmp_Dialog</String>
202 <String Id="ResumeDlgDescription" Overridable="yes"><!-- _locID_text="ResumeDlgDescription" _locComment="ResumeDlgDescription" -->Ndihmësi i Rregullimit do të plotësojë instalimin e [ProductName] në kompjuterin tuaj. Klikoni mbi Instaloje që të vazhdohet ose mbi Anuloje që të dilet nga Ndihmësi i Rregullimit.</String>
203 <String Id="ResumeDlgTitle" Overridable="yes"><!-- _locID_text="ResumeDlgTitle" _locComment="ResumeDlgTitle" -->{\WixUI_Font_Bigger}Po rimerret Ndihmësi i Rregullimit të [ProductName]</String>
204
205 <String Id="SetupTypeDlg_Title" Overridable="yes"><!-- _locID_text="SetupTypeDlg_Title" _locComment="SetupTypeDlg_Title" -->Rregullim i [ProductName]</String>
206 <String Id="SetupTypeDlgTypicalButton" Overridable="yes"><!-- _locID_text="SetupTypeDlgTypicalButton" _locComment="SetupTypeDlgTypicalButton" -->I &amp;zakonshëm</String>
207 <String Id="SetupTypeDlgTypicalButtonTooltip" Overridable="yes"><!-- _locID_text="SetupTypeDlgTypicalButtonTooltip" _locComment="SetupTypeDlgTypicalButtonTooltip" -->Instalim i zakonshëm</String>
208 <String Id="SetupTypeDlgCustomButton" Overridable="yes"><!-- _locID_text="SetupTypeDlgCustomButton" _locComment="SetupTypeDlgCustomButton" -->&amp;Vetjak</String>
209 <String Id="SetupTypeDlgCustomButtonTooltip" Overridable="yes"><!-- _locID_text="SetupTypeDlgCustomButtonTooltip" _locComment="SetupTypeDlgCustomButtonTooltip" -->Instalim Vetjak</String>
210 <String Id="SetupTypeDlgCompleteButton" Overridable="yes"><!-- _locID_text="SetupTypeDlgCompleteButton" _locComment="SetupTypeDlgCompleteButton" -->I &amp;plotë</String>
211 <String Id="SetupTypeDlgCompleteButtonTooltip" Overridable="yes"><!-- _locID_text="SetupTypeDlgCompleteButtonTooltip" _locComment="SetupTypeDlgCompleteButtonTooltip" -->Instalim i Plotë</String>
212 <String Id="SetupTypeDlgBannerBitmap" Overridable="yes"><!-- _locID_text="SetupTypeDlgBannerBitmap" _locComment="SetupTypeDlgBannerBitmap" -->WixUI_Bmp_Banner</String>
213 <String Id="SetupTypeDlgTitle" Overridable="yes"><!-- _locID_text="SetupTypeDlgTitle" _locComment="SetupTypeDlgTitle" -->{\WixUI_Font_Title}Zgjidhni Lloj Rregulllimi</String>
214 <String Id="SetupTypeDlgDescription" Overridable="yes"><!-- _locID_text="SetupTypeDlgDescription" _locComment="SetupTypeDlgDescription" -->Zgjidhni llojin e rregullimit që i përshtatet më mirë nevojave tuaja</String>
215 <String Id="SetupTypeDlgTypicalText" Overridable="yes"><!-- _locID_text="SetupTypeDlgTypicalText" _locComment="SetupTypeDlgTypicalText" -->Instalon veçoritë më të zakonshme të programit. I këshillueshëm për shumicën e përdoruesve.</String>
216 <String Id="SetupTypeDlgCustomText" Overridable="yes"><!-- _locID_text="SetupTypeDlgCustomText" _locComment="SetupTypeDlgCustomText" -->U lejon përdoruesve të zgjedhin cilat veçori të programit të instalohen dhe ku të instalohen. I këshillueshëm për përdorues të përparuar.</String>
217 <String Id="SetupTypeDlgCompleteText" Overridable="yes"><!-- _locID_text="SetupTypeDlgCompleteText" _locComment="SetupTypeDlgCompleteText" -->Do të instalohen krejt veçoritë e programit. Lyp më shumë hapësirë disku se të tjerët.</String>
218
219 <String Id="UserExit_Title" Overridable="yes"><!-- _locID_text="UserExit_Title" _locComment="UserExit_Title" -->Rregullim i [ProductName]</String>
220 <String Id="UserExitBitmap" Overridable="yes"><!-- _locID_text="UserExitBitmap" _locComment="UserExitBitmap" -->WixUI_Bmp_Dialog</String>
221 <String Id="UserExitTitle" Overridable="yes"><!-- _locID_text="UserExitTitle" _locComment="UserExitTitle" -->{\WixUI_Font_Bigger}Puna e Ndihmësi i Rregullimit të [ProductName] u ndërpre</String>
222 <String Id="UserExitDescription1" Overridable="yes"><!-- _locID_text="UserExitDescription1" _locComment="UserExitDescription1" -->Rregullimi i [ProductName] u ndërpre. Sistemi juaj nuk u modifikua. Që të instaloni këtë program në një kohë tjetër, ju lutemi, xhironi sërish instalimin.</String>
223 <String Id="UserExitDescription2" Overridable="yes"><!-- _locID_text="UserExitDescription2" _locComment="UserExitDescription2" -->Klikoni mbi butonin Përfundoje që të dilet nga Ndihmësi i Rregullimit.</String>
224
225 <String Id="VerifyReadyDlg_Title" Overridable="yes"><!-- _locID_text="VerifyReadyDlg_Title" _locComment="VerifyReadyDlg_Title" -->Rregullim i [ProductName]</String>
226 <String Id="VerifyReadyDlgBannerBitmap" Overridable="yes"><!-- _locID_text="VerifyReadyDlgBannerBitmap" _locComment="VerifyReadyDlgBannerBitmap" -->WixUI_Bmp_Banner</String>
227 <String Id="VerifyReadyDlgInstall" Overridable="yes"><!-- _locID_text="VerifyReadyDlgInstall" _locComment="VerifyReadyDlgInstall" -->&amp;Instaloje</String>
228 <String Id="VerifyReadyDlgInstallText" Overridable="yes"><!-- _locID_text="VerifyReadyDlgInstallText" _locComment="VerifyReadyDlgInstallText" -->Klikoni mbi Instaloje që të fillojë instalimi. Klikoni mbi Mbrapsht që të rishihni ose ndryshoni çfarëdo rregullimi tuajin për instalimin.</String>
229 <String Id="VerifyReadyDlgInstallTitle" Overridable="yes"><!-- _locID_text="VerifyReadyDlgInstallTitle" _locComment="VerifyReadyDlgInstallTitle" -->{\WixUI_Font_Title}Gati për të instaluar [ProductName]</String>
230 <String Id="VerifyReadyDlgChange" Overridable="yes"><!-- _locID_text="VerifyReadyDlgChange" _locComment="VerifyReadyDlgChange" -->&amp;Ndryshoje</String>
231 <String Id="VerifyReadyDlgChangeText" Overridable="yes"><!-- _locID_text="VerifyReadyDlgChangeText" _locComment="VerifyReadyDlgChangeText" -->Klikoni mbi Ndryshoje që të fillojë instalimi. Klikoni mbi Mbrapsht që të rishihni ose ndryshoni çfarëdo rregullimi tuajin për instalimin. Klikoni mbi Anuloje që të dilet nga ndihmësi.</String>
232 <String Id="VerifyReadyDlgChangeTitle" Overridable="yes"><!-- _locID_text="VerifyReadyDlgChangeTitle" _locComment="VerifyReadyDlgChangeTitle" -->{\WixUI_Font_Title}Gati për të ndryshuar [ProductName]</String>
233 <String Id="VerifyReadyDlgRepair" Overridable="yes"><!-- _locID_text="VerifyReadyDlgRepair" _locComment="VerifyReadyDlgRepair" -->Ri&amp;paroje</String>
234 <String Id="VerifyReadyDlgRepairText" Overridable="yes"><!-- _locID_text="VerifyReadyDlgRepairText" _locComment="VerifyReadyDlgRepairText" -->Klikoni mbi Riparoje që të riparohet instalimi i [ProductName]. Klikoni mbi Mbrapsht që të rishihni ose ndryshoni çfarëdo rregullimi tuajin për instalimin. Klikoni mbi Anuloje që të dilet nga ndihmësi.</String>
235 <String Id="VerifyReadyDlgRepairTitle" Overridable="yes"><!-- _locID_text="VerifyReadyDlgRepairTitle" _locComment="VerifyReadyDlgRepairTitle" -->{\WixUI_Font_Title}Gati për të riparuar [ProductName]</String>
236 <String Id="VerifyReadyDlgRemove" Overridable="yes"><!-- _locID_text="VerifyReadyDlgRemove" _locComment="VerifyReadyDlgRemove" -->&amp;Hiqe</String>
237 <String Id="VerifyReadyDlgRemoveText" Overridable="yes"><!-- _locID_text="VerifyReadyDlgRemoveText" _locComment="VerifyReadyDlgRemoveText" -->Klikoni mbi Hiqe që të hiqet [ProductName] prej kompjuterit tuaj. Klikoni mbi Mbrapsht që të rishihni ose ndryshoni çfarëdo rregullimi tuajin për instalimin. Klikoni mbi Anuloje që të dilet nga ndihmësi.</String>
238 <String Id="VerifyReadyDlgRemoveTitle" Overridable="yes"><!-- _locID_text="VerifyReadyDlgRemoveTitle" _locComment="VerifyReadyDlgRemoveTitle" -->{\WixUI_Font_Title}Gati për të hequr [ProductName]</String>
239 <String Id="VerifyReadyDlgUpdate" Overridable="yes"><!-- _locID_text="VerifyReadyDlgUpdate" _locComment="VerifyReadyDlgUpdate" -->&amp;Update</String>
240 <String Id="VerifyReadyDlgUpdateText" Overridable="yes"><!-- _locID_text="VerifyReadyDlgUpdateText" _locComment="VerifyReadyDlgUpdateText" -->Klikoni mbi Përditësoje që të përditësohet [ProductName] në kompjuterin tuaj. Klikoni mbi Mbrapsht që të rishihni ose ndryshoni çfarëdo rregullimi tuajin për instalimin. Klikoni mbi Anuloje që të dilet nga ndihmësi.</String>
241 <String Id="VerifyReadyDlgUpdateTitle" Overridable="yes"><!-- _locID_text="VerifyReadyDlgUpdateTitle" _locComment="VerifyReadyDlgUpdateTitle" -->{\WixUI_Font_Title}Gati për të përditësuar [ProductName]</String>
242
243 <String Id="WaitForCostingDlg_Title" Overridable="yes"><!-- _locID_text="WaitForCostingDlg_Title" _locComment="WaitForCostingDlg_Title" -->Rregullim i [ProductName]</String>
244 <String Id="WaitForCostingDlgReturn" Overridable="yes"><!-- _locID_text="WaitForCostingDlgReturn" _locComment="WaitForCostingDlgReturn" -->&amp;Kthehuni</String>
245 <String Id="WaitForCostingDlgText" Overridable="yes"><!-- _locID_text="WaitForCostingDlgText" _locComment="WaitForCostingDlgText" -->Ju lutemi, prisni që instaluesi të përfundojë përcaktimin e hapësirës së domosdoshme në hard diskun tuaj.</String>
246 <String Id="WaitForCostingDlgIcon" Overridable="yes"><!-- _locID_text="WaitForCostingDlgIcon" _locComment="WaitForCostingDlgIcon" -->WixUI_Ico_Exclam</String>
247 <String Id="WaitForCostingDlgIconTooltip" Overridable="yes"><!-- _locID_text="WaitForCostingDlgIconTooltip" _locComment="WaitForCostingDlgIconTooltip" -->Ikonë e pikës çuditëse</String>
248
249 <String Id="WelcomeDlg_Title" Overridable="yes"><!-- _locID_text="WelcomeDlg_Title" _locComment="WelcomeDlg_Title" -->Rregullim i [ProductName]</String>
250 <String Id="WelcomeDlgBitmap" Overridable="yes"><!-- _locID_text="WelcomeDlgBitmap" _locComment="WelcomeDlgBitmap" -->WixUI_Bmp_Dialog</String>
251 <String Id="WelcomeDlgDescription" Overridable="yes"><!-- _locID_text="WelcomeDlgDescription" _locComment="WelcomeDlgDescription" -->Ndihmësi i Rregullimit do të instalojë [ProductName] në kompjuterin tuaj. Klikoni mbi Pasuesin që të vazhdohet, ose mbi Anuloje që të dilet nga Ndihmësi i Rregullimit.</String>
252 <String Id="WelcomeUpdateDlgDescriptionUpdate" Overridable="yes"><!-- _locID_text="WelcomeUpdateDlgDescriptionUpdate" _locComment="WelcomeUpdateDlgDescriptionUpdate" -->Ndihmësi i Rregullimit do të përditësojë [ProductName] në kompjuterin tuaj. Klikoni mbi Pasuesin që të vazhdohet, ose mbi Anuloje që të dilet nga Ndihmësi i Rregullimit.</String>
253 <String Id="WelcomeDlgTitle" Overridable="yes"><!-- _locID_text="WelcomeDlgTitle" _locComment="WelcomeDlgTitle" -->{\WixUI_Font_Bigger}Mirë se vini te Ndihmësi i Rregullimit të [ProductName]</String>
254
255 <String Id="WelcomeEulaDlg_Title" Overridable="yes"><!-- _locID_text="WelcomeEulaDlg_Title" _locComment="WelcomeEulaDlg_Title" -->Rregullim i [ProductName]</String>
256 <String Id="WelcomeEulaDlgBitmap" Overridable="yes"><!-- _locID_text="WelcomeEulaDlgBitmap" _locComment="WelcomeEulaDlgBitmap" -->WixUI_Bmp_Dialog</String>
257 <String Id="WelcomeEulaDlgLicenseAcceptedCheckBox" Overridable="yes"><!-- _locID_text="WelcomeEulaDlgLicenseAcceptedCheckBox" _locComment="WelcomeEulaDlgLicenseAcceptedCheckBox" -->I &amp;pranoj kushtet e Marrëveshjes së Licencës</String>
258 <String Id="WelcomeEulaDlgInstall" Overridable="yes"><!-- _locID_text="WelcomeEulaDlgInstall" _locComment="WelcomeEulaDlgInstall" -->&amp;Instaloje</String>
259 <String Id="WelcomeEulaDlgUpdate" Overridable="yes"><!-- _locID_text="WelcomeEulaDlgUpdate" _locComment="WelcomeEulaDlgUpdate" -->&amp;Përditësoje</String>
260 <String Id="WelcomeEulaDlgTitle" Overridable="yes"><!-- _locID_text="WelcomeEulaDlgTitle" _locComment="WelcomeEulaDlgTitle" -->{\WixUI_Font_Title}Ju lutemi, lexoni Marrëveshjen e Licencës për [ProductName]</String>
261
262 <String Id="ProgressTextInstallValidate" Overridable="yes"><!-- _locID_text="ProgressTextInstallValidate" _locComment="ProgressTextInstallValidate" -->Po vleftësohet instalimi</String>
263 <String Id="ProgressTextInstallFiles" Overridable="yes"><!-- _locID_text="ProgressTextInstallFiles" _locComment="ProgressTextInstallFiles" -->Po kopjohen skedarë të rinj</String>
264 <String Id="ProgressTextInstallFilesTemplate" Overridable="yes"><!-- _locID_text="ProgressTextInstallFilesTemplate" _locComment="ProgressTextInstallFilesTemplate" -->Skedar: [1], Direktori: [9], Madhësi: [6]</String>
265 <String Id="ProgressTextInstallAdminPackage" Overridable="yes"><!-- _locID_text="ProgressTextInstallAdminPackage" _locComment="ProgressTextInstallAdminPackage" -->Po kopjohen skedarë instalimi përmes rrjeti</String>
266 <String Id="ProgressTextInstallAdminPackageTemplate" Overridable="yes"><!-- _locID_text="ProgressTextInstallAdminPackageTemplate" _locComment="ProgressTextInstallAdminPackageTemplate" -->Skedar: [1], Direktori: [9], Madhësi: [6]</String>
267 <String Id="ProgressTextFileCost" Overridable="yes"><!-- _locID_text="ProgressTextFileCost" _locComment="ProgressTextFileCost" -->Po përllogariten hapësirat e domosdoshme</String>
268 <String Id="ProgressTextCostInitialize" Overridable="yes"><!-- _locID_text="ProgressTextCostInitialize" _locComment="ProgressTextCostInitialize" -->Po përllogariten hapësirat e domosdoshme</String>
269 <String Id="ProgressTextCostFinalize" Overridable="yes"><!-- _locID_text="ProgressTextCostFinalize" _locComment="ProgressTextCostFinalize" -->Po përllogariten hapësirat e domosdoshme</String>
270 <String Id="ProgressTextCreateShortcuts" Overridable="yes"><!-- _locID_text="ProgressTextCreateShortcuts" _locComment="ProgressTextCreateShortcuts" -->Po krijohen shkurtore tastiere</String>
271 <String Id="ProgressTextCreateShortcutsTemplate" Overridable="yes"><!-- _locID_text="ProgressTextCreateShortcutsTemplate" _locComment="ProgressTextCreateShortcutsTemplate" -->Shkurtore: [1]</String>
272 <String Id="ProgressTextPublishComponents" Overridable="yes"><!-- _locID_text="ProgressTextPublishComponents" _locComment="ProgressTextPublishComponents" -->Po publikohen Përbërës të Kualifikuar</String>
273 <String Id="ProgressTextPublishComponentsTemplate" Overridable="yes"><!-- _locID_text="ProgressTextPublishComponentsTemplate" _locComment="ProgressTextPublishComponentsTemplate" -->ID Përbërësi: [1], Kualifikues: [2]</String>
274 <String Id="ProgressTextPublishFeatures" Overridable="yes"><!-- _locID_text="ProgressTextPublishFeatures" _locComment="ProgressTextPublishFeatures" -->Po publikohen Veçori Produkti</String>
275 <String Id="ProgressTextPublishFeaturesTemplate" Overridable="yes"><!-- _locID_text="ProgressTextPublishFeaturesTemplate" _locComment="ProgressTextPublishFeaturesTemplate" -->Veçori: [1]</String>
276 <String Id="ProgressTextPublishProduct" Overridable="yes"><!-- _locID_text="ProgressTextPublishProduct" _locComment="ProgressTextPublishProduct" -->Po publikohet informacion produkti</String>
277 <String Id="ProgressTextRegisterClassInfo" Overridable="yes"><!-- _locID_text="ProgressTextRegisterClassInfo" _locComment="ProgressTextRegisterClassInfo" -->Po regjistrohen shërbyes Klasash</String>
278 <String Id="ProgressTextRegisterClassInfoTemplate" Overridable="yes"><!-- _locID_text="ProgressTextRegisterClassInfoTemplate" _locComment="ProgressTextRegisterClassInfoTemplate" -->ID Klase: [1]</String>
279 <String Id="ProgressTextRegisterExtensionInfo" Overridable="yes"><!-- _locID_text="ProgressTextRegisterExtensionInfo" _locComment="ProgressTextRegisterExtensionInfo" -->Po regjistrohen shërbyes zgjerimesh</String>
280 <String Id="ProgressTextRegisterExtensionInfoTemplate" Overridable="yes"><!-- _locID_text="ProgressTextRegisterExtensionInfoTemplate" _locComment="ProgressTextRegisterExtensionInfoTemplate" -->Zgjerim: [1]</String>
281 <String Id="ProgressTextRegisterMIMEInfo" Overridable="yes"><!-- _locID_text="ProgressTextRegisterMIMEInfo" _locComment="ProgressTextRegisterMIMEInfo" -->Po regjistrohen të dhëna MIME</String>
282 <String Id="ProgressTextRegisterMIMEInfoTemplate" Overridable="yes"><!-- _locID_text="ProgressTextRegisterMIMEInfoTemplate" _locComment="ProgressTextRegisterMIMEInfoTemplate" -->Lloj Lënde MIME: [1], Zgjerim: [2]</String>
283 <String Id="ProgressTextRegisterProgIdInfo" Overridable="yes"><!-- _locID_text="ProgressTextRegisterProgIdInfo" _locComment="ProgressTextRegisterProgIdInfo" -->Po regjistrohen identifikues programi</String>
284 <String Id="ProgressTextRegisterProgIdInfoTemplate" Overridable="yes"><!-- _locID_text="ProgressTextRegisterProgIdInfoTemplate" _locComment="ProgressTextRegisterProgIdInfoTemplate" -->ProgId: [1]</String>
285 <String Id="ProgressTextAllocateRegistrySpace" Overridable="yes"><!-- _locID_text="ProgressTextAllocateRegistrySpace" _locComment="ProgressTextAllocateRegistrySpace" -->Po caktohet hapësirë regjistri</String>
286 <String Id="ProgressTextAllocateRegistrySpaceTemplate" Overridable="yes"><!-- _locID_text="ProgressTextAllocateRegistrySpaceTemplate" _locComment="ProgressTextAllocateRegistrySpaceTemplate" -->Hapësirë e lirë: [1]</String>
287 <String Id="ProgressTextAppSearch" Overridable="yes"><!-- _locID_text="ProgressTextAppSearch" _locComment="ProgressTextAppSearch" -->Po kërkohet për aplikacione të instaluar</String>
288 <String Id="ProgressTextAppSearchTemplate" Overridable="yes"><!-- _locID_text="ProgressTextAppSearchTemplate" _locComment="ProgressTextAppSearchTemplate" -->Veti: [1], Nënshkrim: [2]</String>
289 <String Id="ProgressTextBindImage" Overridable="yes"><!-- _locID_text="ProgressTextBindImage" _locComment="ProgressTextBindImage" -->Po krijohen lidhjet për të ekzekuteshmit</String>
290 <String Id="ProgressTextBindImageTemplate" Overridable="yes"><!-- _locID_text="ProgressTextBindImageTemplate" _locComment="ProgressTextBindImageTemplate" -->Skedar: [1]</String>
291 <String Id="ProgressTextCCPSearch" Overridable="yes"><!-- _locID_text="ProgressTextCCPSearch" _locComment="ProgressTextCCPSearch" -->Po kërkohet për produkte të kualifikueshëm</String>
292 <String Id="ProgressTextCreateFolders" Overridable="yes"><!-- _locID_text="ProgressTextCreateFolders" _locComment="ProgressTextCreateFolders" -->Po krijohen dosje</String>
293 <String Id="ProgressTextCreateFoldersTemplate" Overridable="yes"><!-- _locID_text="ProgressTextCreateFoldersTemplate" _locComment="ProgressTextCreateFoldersTemplate" -->Dosje: [1]</String>
294 <String Id="ProgressTextDeleteServices" Overridable="yes"><!-- _locID_text="ProgressTextDeleteServices" _locComment="ProgressTextDeleteServices" -->Po fshihen shërbimet</String>
295 <String Id="ProgressTextDeleteServicesTemplate" Overridable="yes"><!-- _locID_text="ProgressTextDeleteServicesTemplate" _locComment="ProgressTextDeleteServicesTemplate" -->Shërbim: [1]</String>
296 <String Id="ProgressTextDuplicateFiles" Overridable="yes"><!-- _locID_text="ProgressTextDuplicateFiles" _locComment="ProgressTextDuplicateFiles" -->Po krijohen skedarë të përsëdytur</String>
297 <String Id="ProgressTextDuplicateFilesTemplate" Overridable="yes"><!-- _locID_text="ProgressTextDuplicateFilesTemplate" _locComment="ProgressTextDuplicateFilesTemplate" -->Skedar: [1], Direktori: [9], Madhësi: [6]</String>
298 <String Id="ProgressTextFindRelatedProducts" Overridable="yes"><!-- _locID_text="ProgressTextFindRelatedProducts" _locComment="ProgressTextFindRelatedProducts" -->Po kërkohet për aplikacione që kanë lidhje</String>
299 <String Id="ProgressTextFindRelatedProductsTemplate" Overridable="yes"><!-- _locID_text="ProgressTextFindRelatedProductsTemplate" _locComment="ProgressTextFindRelatedProductsTemplate" -->U gjet aplikacion: [1]</String>
300 <String Id="ProgressTextInstallODBC" Overridable="yes"><!-- _locID_text="ProgressTextInstallODBC" _locComment="ProgressTextInstallODBC" -->Po instalohen përbërës ODBC</String>
301 <String Id="ProgressTextInstallServices" Overridable="yes"><!-- _locID_text="ProgressTextInstallServices" _locComment="ProgressTextInstallServices" -->Po instalohen shërbime të reja</String>
302 <String Id="ProgressTextInstallServicesTemplate" Overridable="yes"><!-- _locID_text="ProgressTextInstallServicesTemplate" _locComment="ProgressTextInstallServicesTemplate" -->Shërbim: [2]</String>
303 <String Id="ProgressTextLaunchConditions" Overridable="yes"><!-- _locID_text="ProgressTextLaunchConditions" _locComment="ProgressTextLaunchConditions" -->Po vlerësohen kushte për nisje</String>
304 <String Id="ProgressTextMigrateFeatureStates" Overridable="yes"><!-- _locID_text="ProgressTextMigrateFeatureStates" _locComment="ProgressTextMigrateFeatureStates" -->Po migrohen gjendje veçorish prej aplikacionesh që kanë lidhje</String>
305 <String Id="ProgressTextMigrateFeatureStatesTemplate" Overridable="yes"><!-- _locID_text="ProgressTextMigrateFeatureStatesTemplate" _locComment="ProgressTextMigrateFeatureStatesTemplate" -->Aplikacion: [1]</String>
306 <String Id="ProgressTextMoveFiles" Overridable="yes"><!-- _locID_text="ProgressTextMoveFiles" _locComment="ProgressTextMoveFiles" -->Moving files</String>
307 <String Id="ProgressTextMoveFilesTemplate" Overridable="yes"><!-- _locID_text="ProgressTextMoveFilesTemplate" _locComment="ProgressTextMoveFilesTemplate" -->Skedar: [1], Direktori: [9], Madhësi: [6]</String>
308 <String Id="ProgressTextPatchFiles" Overridable="yes"><!-- _locID_text="ProgressTextPatchFiles" _locComment="ProgressTextPatchFiles" -->Patching files</String>
309 <String Id="ProgressTextPatchFilesTemplate" Overridable="yes"><!-- _locID_text="ProgressTextPatchFilesTemplate" _locComment="ProgressTextPatchFilesTemplate" -->Skedar: [1], Direktori: [2], Madhësi: [3]</String>
310 <String Id="ProgressTextProcessComponents" Overridable="yes"><!-- _locID_text="ProgressTextProcessComponents" _locComment="ProgressTextProcessComponents" -->Po përditësohet regjistrim përbërësi</String>
311 <String Id="ProgressTextRegisterComPlus" Overridable="yes"><!-- _locID_text="ProgressTextRegisterComPlus" _locComment="ProgressTextRegisterComPlus" -->Po regjistrohen Aplikacione dhe Përbërës COM+</String>
312 <String Id="ProgressTextRegisterComPlusTemplate" Overridable="yes"><!-- _locID_text="ProgressTextRegisterComPlusTemplate" _locComment="ProgressTextRegisterComPlusTemplate" -->AppId: [1]{{, AppType: [2], Përdorues: [3], RSN: [4]}}</String>
313 <String Id="ProgressTextRegisterFonts" Overridable="yes"><!-- _locID_text="ProgressTextRegisterFonts" _locComment="ProgressTextRegisterFonts" -->Po regjistrohen shkronja</String>
314 <String Id="ProgressTextRegisterFontsTemplate" Overridable="yes"><!-- _locID_text="ProgressTextRegisterFontsTemplate" _locComment="ProgressTextRegisterFontsTemplate" -->Shkronja: [1]</String>
315 <String Id="ProgressTextRegisterProduct" Overridable="yes"><!-- _locID_text="ProgressTextRegisterProduct" _locComment="ProgressTextRegisterProduct" -->Po regjistrohet produkt</String>
316 <String Id="ProgressTextRegisterProductTemplate" Overridable="yes"><!-- _locID_text="ProgressTextRegisterProductTemplate" _locComment="ProgressTextRegisterProductTemplate" -->[1]</String>
317 <String Id="ProgressTextRegisterTypeLibraries" Overridable="yes"><!-- _locID_text="ProgressTextRegisterTypeLibraries" _locComment="ProgressTextRegisterTypeLibraries" -->Po regjistrohen lloje librarish</String>
318 <String Id="ProgressTextRegisterTypeLibrariesTemplate" Overridable="yes"><!-- _locID_text="ProgressTextRegisterTypeLibrariesTemplate" _locComment="ProgressTextRegisterTypeLibrariesTemplate" -->LibID: [1]</String>
319 <String Id="ProgressTextRegisterUser" Overridable="yes"><!-- _locID_text="ProgressTextRegisterUser" _locComment="ProgressTextRegisterUser" -->Po regjistrohet përdorues</String>
320 <String Id="ProgressTextRegisterUserTemplate" Overridable="yes"><!-- _locID_text="ProgressTextRegisterUserTemplate" _locComment="ProgressTextRegisterUserTemplate" -->[1]</String>
321 <String Id="ProgressTextRemoveDuplicateFiles" Overridable="yes"><!-- _locID_text="ProgressTextRemoveDuplicateFiles" _locComment="ProgressTextRemoveDuplicateFiles" -->Po hiqen skedarë të përsëdytur</String>
322 <String Id="ProgressTextRemoveDuplicateFilesTemplate" Overridable="yes"><!-- _locID_text="ProgressTextRemoveDuplicateFilesTemplate" _locComment="ProgressTextRemoveDuplicateFilesTemplate" -->Skedar: [1], Direktori: [9]</String>
323 <String Id="ProgressTextRemoveEnvironmentStrings" Overridable="yes"><!-- _locID_text="ProgressTextRemoveEnvironmentStrings" _locComment="ProgressTextRemoveEnvironmentStrings" -->Po përditësohen vargje mjedisi</String>
324 <String Id="ProgressTextRemoveEnvironmentStringsTemplate" Overridable="yes"><!-- _locID_text="ProgressTextRemoveEnvironmentStringsTemplate" _locComment="ProgressTextRemoveEnvironmentStringsTemplate" -->Emër: [1], Vlerë: [2], Veprim [3]</String>
325 <String Id="ProgressTextRemoveExistingProducts" Overridable="yes"><!-- _locID_text="ProgressTextRemoveExistingProducts" _locComment="ProgressTextRemoveExistingProducts" -->Po hiqen aplikacione</String>
326 <String Id="ProgressTextRemoveExistingProductsTemplate" Overridable="yes"><!-- _locID_text="ProgressTextRemoveExistingProductsTemplate" _locComment="ProgressTextRemoveExistingProductsTemplate" -->Aplikacion: [1], Rresht urdhri: [2]</String>
327 <String Id="ProgressTextRemoveFiles" Overridable="yes"><!-- _locID_text="ProgressTextRemoveFiles" _locComment="ProgressTextRemoveFiles" -->Po hiqen skedarë</String>
328 <String Id="ProgressTextRemoveFilesTemplate" Overridable="yes"><!-- _locID_text="ProgressTextRemoveFilesTemplate" _locComment="ProgressTextRemoveFilesTemplate" -->Skedar: [1], Direktori: [9]</String>
329 <String Id="ProgressTextRemoveFolders" Overridable="yes"><!-- _locID_text="ProgressTextRemoveFolders" _locComment="ProgressTextRemoveFolders" -->Po hiqen dosje</String>
330 <String Id="ProgressTextRemoveFoldersTemplate" Overridable="yes"><!-- _locID_text="ProgressTextRemoveFoldersTemplate" _locComment="ProgressTextRemoveFoldersTemplate" -->Dosje: [1]</String>
331 <String Id="ProgressTextRemoveIniValues" Overridable="yes"><!-- _locID_text="ProgressTextRemoveIniValues" _locComment="ProgressTextRemoveIniValues" -->Po hiqen zëra skedarësh INI</String>
332 <String Id="ProgressTextRemoveIniValuesTemplate" Overridable="yes"><!-- _locID_text="ProgressTextRemoveIniValuesTemplate" _locComment="ProgressTextRemoveIniValuesTemplate" -->Skedar: [1], Seksion: [2], Kyç: [3], Vlerë: [4]</String>
333 <String Id="ProgressTextRemoveODBC" Overridable="yes"><!-- _locID_text="ProgressTextRemoveODBC" _locComment="ProgressTextRemoveODBC" -->Po hiqen përbërës ODBC</String>
334 <String Id="ProgressTextRemoveRegistryValues" Overridable="yes"><!-- _locID_text="ProgressTextRemoveRegistryValues" _locComment="ProgressTextRemoveRegistryValues" -->Po hiqen vlera regjistri sistemi</String>
335 <String Id="ProgressTextRemoveRegistryValuesTemplate" Overridable="yes"><!-- _locID_text="ProgressTextRemoveRegistryValuesTemplate" _locComment="ProgressTextRemoveRegistryValuesTemplate" -->Kyç: [1], Emër: [2]</String>
336 <String Id="ProgressTextRemoveShortcuts" Overridable="yes"><!-- _locID_text="ProgressTextRemoveShortcuts" _locComment="ProgressTextRemoveShortcuts" -->Po hiqen shkurtore tastiere</String>
337 <String Id="ProgressTextRemoveShortcutsTemplate" Overridable="yes"><!-- _locID_text="ProgressTextRemoveShortcutsTemplate" _locComment="ProgressTextRemoveShortcutsTemplate" -->Shkurtore: [1]</String>
338 <String Id="ProgressTextRMCCPSearch" Overridable="yes"><!-- _locID_text="ProgressTextRMCCPSearch" _locComment="ProgressTextRMCCPSearch" -->Po kërkohet për produkte të kualifikueshëm</String>
339 <String Id="ProgressTextSelfRegModules" Overridable="yes"><!-- _locID_text="ProgressTextSelfRegModules" _locComment="ProgressTextSelfRegModules" -->Po regjistrohen module</String>
340 <String Id="ProgressTextSelfRegModulesTemplate" Overridable="yes"><!-- _locID_text="ProgressTextSelfRegModulesTemplate" _locComment="ProgressTextSelfRegModulesTemplate" -->Skedar: [1], Dosje: [2]</String>
341 <String Id="ProgressTextSelfUnregModules" Overridable="yes"><!-- _locID_text="ProgressTextSelfUnregModules" _locComment="ProgressTextSelfUnregModules" -->Po çregjistrohen module</String>
342 <String Id="ProgressTextSelfUnregModulesTemplate" Overridable="yes"><!-- _locID_text="ProgressTextSelfUnregModulesTemplate" _locComment="ProgressTextSelfUnregModulesTemplate" -->Skedar: [1], Dosje: [2]</String>
343 <String Id="ProgressTextSetODBCFolders" Overridable="yes"><!-- _locID_text="ProgressTextSetODBCFolders" _locComment="ProgressTextSetODBCFolders" -->Po gatiten direktori ODBC</String>
344 <String Id="ProgressTextStartServices" Overridable="yes"><!-- _locID_text="ProgressTextStartServices" _locComment="ProgressTextStartServices" -->Po nisen shërbime</String>
345 <String Id="ProgressTextStartServicesTemplate" Overridable="yes"><!-- _locID_text="ProgressTextStartServicesTemplate" _locComment="ProgressTextStartServicesTemplate" -->Shërbime: [1]</String>
346 <String Id="ProgressTextStopServices" Overridable="yes"><!-- _locID_text="ProgressTextStopServices" _locComment="ProgressTextStopServices" -->Po ndalen shërbime</String>
347 <String Id="ProgressTextStopServicesTemplate" Overridable="yes"><!-- _locID_text="ProgressTextStopServicesTemplate" _locComment="ProgressTextStopServicesTemplate" -->Shërbim: [1]</String>
348 <String Id="ProgressTextUnpublishComponents" Overridable="yes"><!-- _locID_text="ProgressTextUnpublishComponents" _locComment="ProgressTextUnpublishComponents" -->Po hiqen nga publikimi Përbërës të Kualifikuar</String>
349 <String Id="ProgressTextUnpublishComponentsTemplate" Overridable="yes"><!-- _locID_text="ProgressTextUnpublishComponentsTemplate" _locComment="ProgressTextUnpublishComponentsTemplate" -->ID Përbërësi: [1], Kualifikues: [2]</String>
350 <String Id="ProgressTextUnpublishFeatures" Overridable="yes"><!-- _locID_text="ProgressTextUnpublishFeatures" _locComment="ProgressTextUnpublishFeatures" -->Po hiqen nga publikimi Veçori Produkti</String>
351 <String Id="ProgressTextUnpublishFeaturesTemplate" Overridable="yes"><!-- _locID_text="ProgressTextUnpublishFeaturesTemplate" _locComment="ProgressTextUnpublishFeaturesTemplate" -->Veçori: [1]</String>
352 <String Id="ProgressTextUnregisterClassInfo" Overridable="yes"><!-- _locID_text="ProgressTextUnregisterClassInfo" _locComment="ProgressTextUnregisterClassInfo" -->Po çregjistrohen shërbyes Klasash</String>
353 <String Id="ProgressTextUnregisterClassInfoTemplate" Overridable="yes"><!-- _locID_text="ProgressTextUnregisterClassInfoTemplate" _locComment="ProgressTextUnregisterClassInfoTemplate" -->ID Klase: [1]</String>
354 <String Id="ProgressTextUnregisterComPlus" Overridable="yes"><!-- _locID_text="ProgressTextUnregisterComPlus" _locComment="ProgressTextUnregisterComPlus" -->Po çregjistrohen Aplikacione dhe Përbërës COM+</String>
355 <String Id="ProgressTextUnregisterComPlusTemplate" Overridable="yes"><!-- _locID_text="ProgressTextUnregisterComPlusTemplate" _locComment="ProgressTextUnregisterComPlusTemplate" -->AppId: [1]{{, AppType: [2]}}</String>
356 <String Id="ProgressTextUnregisterExtensionInfo" Overridable="yes"><!-- _locID_text="ProgressTextUnregisterExtensionInfo" _locComment="ProgressTextUnregisterExtensionInfo" -->Po çregjistrohen shërbyes zgjerimesh</String>
357 <String Id="ProgressTextUnregisterExtensionInfoTemplate" Overridable="yes"><!-- _locID_text="ProgressTextUnregisterExtensionInfoTemplate" _locComment="ProgressTextUnregisterExtensionInfoTemplate" -->Zgjerim: [1]</String>
358 <String Id="ProgressTextUnregisterFonts" Overridable="yes"><!-- _locID_text="ProgressTextUnregisterFonts" _locComment="ProgressTextUnregisterFonts" -->Po çregjistrohen shkronja</String>
359 <String Id="ProgressTextUnregisterFontsTemplate" Overridable="yes"><!-- _locID_text="ProgressTextUnregisterFontsTemplate" _locComment="ProgressTextUnregisterFontsTemplate" -->Shkronja: [1]</String>
360 <String Id="ProgressTextUnregisterMIMEInfo" Overridable="yes"><!-- _locID_text="ProgressTextUnregisterMIMEInfo" _locComment="ProgressTextUnregisterMIMEInfo" -->Po çregjistrohen të dhëna MIME</String>
361 <String Id="ProgressTextUnregisterMIMEInfoTemplate" Overridable="yes"><!-- _locID_text="ProgressTextUnregisterMIMEInfoTemplate" _locComment="ProgressTextUnregisterMIMEInfoTemplate" -->Lloj Lënde MIME: [1], Zgjerim: [2]</String>
362 <String Id="ProgressTextUnregisterProgIdInfo" Overridable="yes"><!-- _locID_text="ProgressTextUnregisterProgIdInfo" _locComment="ProgressTextUnregisterProgIdInfo" -->Po çregjistrohen identifikues programi</String>
363 <String Id="ProgressTextUnregisterProgIdInfoTemplate" Overridable="yes"><!-- _locID_text="ProgressTextUnregisterProgIdInfoTemplate" _locComment="ProgressTextUnregisterProgIdInfoTemplate" -->ProgId: [1]</String>
364 <String Id="ProgressTextUnregisterTypeLibraries" Overridable="yes"><!-- _locID_text="ProgressTextUnregisterTypeLibraries" _locComment="ProgressTextUnregisterTypeLibraries" -->Po çregjistrohen lloje librarish</String>
365 <String Id="ProgressTextUnregisterTypeLibrariesTemplate" Overridable="yes"><!-- _locID_text="ProgressTextUnregisterTypeLibrariesTemplate" _locComment="ProgressTextUnregisterTypeLibrariesTemplate" -->LibID: [1]</String>
366 <String Id="ProgressTextWriteEnvironmentStrings" Overridable="yes"><!-- _locID_text="ProgressTextWriteEnvironmentStrings" _locComment="ProgressTextWriteEnvironmentStrings" -->Po përditësohen vargje mjedisi</String>
367 <String Id="ProgressTextWriteEnvironmentStringsTemplate" Overridable="yes"><!-- _locID_text="ProgressTextWriteEnvironmentStringsTemplate" _locComment="ProgressTextWriteEnvironmentStringsTemplate" -->Emër: [1], Vlerë: [2], Veprim [3]</String>
368 <String Id="ProgressTextWriteIniValues" Overridable="yes"><!-- _locID_text="ProgressTextWriteIniValues" _locComment="ProgressTextWriteIniValues" -->Po shkruhen vlera skedarësh INI</String>
369 <String Id="ProgressTextWriteIniValuesTemplate" Overridable="yes"><!-- _locID_text="ProgressTextWriteIniValuesTemplate" _locComment="ProgressTextWriteIniValuesTemplate" -->Skedar: [1], Seksion: [2], Kyç: [3], Vlerë: [4]</String>
370 <String Id="ProgressTextWriteRegistryValues" Overridable="yes"><!-- _locID_text="ProgressTextWriteRegistryValues" _locComment="ProgressTextWriteRegistryValues" -->Po shkruhen vlera regjistri sistemi</String>
371 <String Id="ProgressTextWriteRegistryValuesTemplate" Overridable="yes"><!-- _locID_text="ProgressTextWriteRegistryValuesTemplate" _locComment="ProgressTextWriteRegistryValuesTemplate" -->Kyç: [1], Emër: [2], Vlerë: [3]</String>
372 <String Id="ProgressTextAdvertise" Overridable="yes"><!-- _locID_text="ProgressTextAdvertise" _locComment="ProgressTextAdvertise" -->Po reklamohet aplikacioni</String>
373 <String Id="ProgressTextGenerateScript" Overridable="yes"><!-- _locID_text="ProgressTextGenerateScript" _locComment="ProgressTextGenerateScript" -->Po prodhohen operacione skripti për veprim:</String>
374 <String Id="ProgressTextGenerateScriptTemplate" Overridable="yes"><!-- _locID_text="ProgressTextGenerateScriptTemplate" _locComment="ProgressTextGenerateScriptTemplate" -->[1]</String>
375 <String Id="ProgressTextInstallSFPCatalogFile" Overridable="yes"><!-- _locID_text="ProgressTextInstallSFPCatalogFile" _locComment="ProgressTextInstallSFPCatalogFile" -->Po instalohet katalog sistemi</String>
376 <String Id="ProgressTextInstallSFPCatalogFileTemplate" Overridable="yes"><!-- _locID_text="ProgressTextInstallSFPCatalogFileTemplate" _locComment="ProgressTextInstallSFPCatalogFileTemplate" -->Skedar: [1], Varësi: [2]</String>
377 <String Id="ProgressTextMsiPublishAssemblies" Overridable="yes"><!-- _locID_text="ProgressTextMsiPublishAssemblies" _locComment="ProgressTextMsiPublishAssemblies" -->Po publikohet informacion asembli</String>
378 <String Id="ProgressTextMsiPublishAssembliesTemplate" Overridable="yes"><!-- _locID_text="ProgressTextMsiPublishAssembliesTemplate" _locComment="ProgressTextMsiPublishAssembliesTemplate" -->Kontekst Aplikacioni:[1], Emër Assembly:[2]</String>
379 <String Id="ProgressTextMsiUnpublishAssemblies" Overridable="yes"><!-- _locID_text="ProgressTextMsiUnpublishAssemblies" _locComment="ProgressTextMsiUnpublishAssemblies" -->Po hiqet publikim informacion asembli</String>
380 <String Id="ProgressTextMsiUnpublishAssembliesTemplate" Overridable="yes"><!-- _locID_text="ProgressTextMsiUnpublishAssembliesTemplate" _locComment="ProgressTextMsiUnpublishAssembliesTemplate" -->Kontekst Aplikacioni:[1], Emër Asembli:[2]</String>
381 <String Id="ProgressTextRollback" Overridable="yes"><!-- _locID_text="ProgressTextRollback" _locComment="ProgressTextRollback" -->Veprim anulimi:</String>
382 <String Id="ProgressTextRollbackTemplate" Overridable="yes"><!-- _locID_text="ProgressTextRollbackTemplate" _locComment="ProgressTextRollbackTemplate" -->[1]</String>
383 <String Id="ProgressTextRollbackCleanup" Overridable="yes"><!-- _locID_text="ProgressTextRollbackCleanup" _locComment="ProgressTextRollbackCleanup" -->Po hiqen skedarë kopjeruajtjesh</String>
384 <String Id="ProgressTextRollbackCleanupTemplate" Overridable="yes"><!-- _locID_text="ProgressTextRollbackCleanupTemplate" _locComment="ProgressTextRollbackCleanupTemplate" -->Skedar: [1]</String>
385 <String Id="ProgressTextUnmoveFiles" Overridable="yes"><!-- _locID_text="ProgressTextUnmoveFiles" _locComment="ProgressTextUnmoveFiles" -->Po hiqen skedarë të zhvendosur</String>
386 <String Id="ProgressTextUnmoveFilesTemplate" Overridable="yes"><!-- _locID_text="ProgressTextUnmoveFilesTemplate" _locComment="ProgressTextUnmoveFilesTemplate" -->Skedar: [1], Direktori: [9]</String>
387 <String Id="ProgressTextUnpublishProduct" Overridable="yes"><!-- _locID_text="ProgressTextUnpublishProduct" _locComment="ProgressTextUnpublishProduct" -->Po hiqet publikim informacioni produkti</String>
388
389 <String Id="Error0" Overridable="yes"><!-- _locID_text="Error0" _locComment="Error0" -->{{Gabim fatal: }}</String>
390 <String Id="Error1" Overridable="yes"><!-- _locID_text="Error1" _locComment="Error1" -->{{Gabim [1]. }}</String>
391 <String Id="Error2" Overridable="yes"><!-- _locID_text="Error2" _locComment="Error2" -->Kujdes [1]. </String>
392 <String Id="Error4" Overridable="yes"><!-- _locID_text="Error4" _locComment="Error4" -->Info [1]. </String>
393 <String Id="Error5" Overridable="yes"><!-- _locID_text="Error5" _locComment="Error5" -->Instaluesi hasi një gabim të papritur teksa instalonte këtë paketë. Kjo mund të jetë shenjë e një problemi me këtë paketë. Kodi i gabimit është [1]. {{Argumentet janë: [2], [3], [4]}}</String>
394 <String Id="Error7" Overridable="yes"><!-- _locID_text="Error7" _locComment="Error7" -->{{Disku plot: }}</String>
395 <String Id="Error8" Overridable="yes"><!-- _locID_text="Error8" _locComment="Error8" -->Veprim [Kohë]: [1]. [2]</String>
396 <String Id="Error9" Overridable="yes"><!-- _locID_text="Error9" _locComment="Error9" -->[ProductName]</String>
397 <String Id="Error10" Overridable="yes"><!-- _locID_text="Error10" _locComment="Error10" -->{[2]}{, [3]}{, [4]}</String>
398 <String Id="Error11" Overridable="yes"><!-- _locID_text="Error11" _locComment="Error11" -->Lloj mesazhi: [1], Argument: [2]</String>
399 <String Id="Error12" Overridable="yes"><!-- _locID_text="Error12" _locComment="Error12" -->=== Regjistrimi filloi më: [Date] [Time] ===</String>
400 <String Id="Error13" Overridable="yes"><!-- _locID_text="Error13" _locComment="Error13" -->=== Regjistrimi ndali më: [Date] [Time] ===</String>
401 <String Id="Error14" Overridable="yes"><!-- _locID_text="Error14" _locComment="Error14" -->Veprimi nisi më [Time]: [1].</String>
402 <String Id="Error15" Overridable="yes"><!-- _locID_text="Error15" _locComment="Error15" -->Veprimi mbaroi më [Time]: [1]. Vlera që dha [2].</String>
403 <String Id="Error16" Overridable="yes"><!-- _locID_text="Error16" _locComment="Error16" -->Kohë e mbetur: {[1] minuta }{[2] sekonda}</String>
404 <String Id="Error17" Overridable="yes"><!-- _locID_text="Error17" _locComment="Error17" -->Kujtesë e pamjaftueshme. Mbyllni aplikacione të tjera, përpara se të riprovoni.</String>
405 <String Id="Error18" Overridable="yes"><!-- _locID_text="Error18" _locComment="Error18" -->Instaluesi nuk po përgjigjet më.</String>
406 <String Id="Error19" Overridable="yes"><!-- _locID_text="Error19" _locComment="Error19" -->Instaluesi u ndal para kohe.</String>
407 <String Id="Error20" Overridable="yes"><!-- _locID_text="Error20" _locComment="Error20" -->Ju lutemi, prisni teksa Windows formëson [ProductName]</String>
408 <String Id="Error21" Overridable="yes"><!-- _locID_text="Error21" _locComment="Error21" -->Po grumbullohet informacion i domosdoshëm...</String>
409 <String Id="Error22" Overridable="yes"><!-- _locID_text="Error22" _locComment="Error22" -->Po hiqen versione të vjetër të këtij aplikacioni...</String>
410 <String Id="Error23" Overridable="yes"><!-- _locID_text="Error23" _locComment="Error23" -->Po përgatitet heqja e versioneve të vjetër të këtij aplikacioni...</String>
411 <String Id="Error32" Overridable="yes"><!-- _locID_text="Error32" _locComment="Error32" -->{[ProductName] }Rregullimi u plotësua me sukses.</String>
412 <String Id="Error33" Overridable="yes"><!-- _locID_text="Error33" _locComment="Error33" -->{[ProductName] }Rregullimi dështoi.</String>
413 <String Id="Error1101" Overridable="yes"><!-- _locID_text="Error1101" _locComment="Error1101" -->Gabim në leximin nga skedari: [2]. {{ Gabim sistemi [3].}} Verifikoni që skedari ekziston dhe se ju lejohet ta përdorni.</String>
414 <String Id="Error1301" Overridable="yes"><!-- _locID_text="Error1301" _locComment="Error1301" -->S’krijohet dot skedari '[2]'. Ka tashmë një direktori me këtë emër. Anuloni instalimin dhe provoni ta instaloni në një vend tjetër.</String>
415 <String Id="Error1302" Overridable="yes"><!-- _locID_text="Error1302" _locComment="Error1302" -->Ju lutemi futni diskun: [2]</String>
416 <String Id="Error1303" Overridable="yes"><!-- _locID_text="Error1303" _locComment="Error1303" -->Instaluesi ka privilegje të pamjaftueshme hyrjeje në këtë direktori: [2]. Instalimi nuk mund të vazhdojë. Bëni hyrjen si administrator, ose lidhuni me administratorin e sistemit tuaj.</String>
417 <String Id="Error1304" Overridable="yes"><!-- _locID_text="Error1304" _locComment="Error1304" -->Gabim në shkrimin te skedari: [2]. Verifikoni që keni leje përdorimi mbi atë direktori.</String>
418 <String Id="Error1305" Overridable="yes"><!-- _locID_text="Error1305" _locComment="Error1305" -->Gabim në leximin nga skedari [2]. {{ Gabim sistemi [3].}} Verifikoni që skedari ekziston dhe se keni leje ta përdorni.</String>
419 <String Id="Error1306" Overridable="yes"><!-- _locID_text="Error1306" _locComment="Error1306" -->Një tjetër aplikacion ka të drejta ekskluzive mbi skedarin '[2]'. Ju lutemi, mbyllni krejt aplikacionet e tjera, mandej klikoni mbi Riprovo.</String>
420 <String Id="Error1307" Overridable="yes"><!-- _locID_text="Error1307" _locComment="Error1307" -->Nuk ka hapësirë të mjaftueshme në disk që të instalohet ky skedar: [2]. Lironi ca hapësirë disku dhe klikoni mbi Riprovo, ose klikoni mbi Anuloje që të dilet.</String>
421 <String Id="Error1308" Overridable="yes"><!-- _locID_text="Error1308" _locComment="Error1308" -->S’u gjet skedari burim: [2]. Verifikoni që skedari ekziston dhe se keni leje ta përdorni.</String>
422 <String Id="Error1309" Overridable="yes"><!-- _locID_text="Error1309" _locComment="Error1309" -->Gabim në leximin nga skedari: [3]. {{ Gabim sistemi [2].}} Verifikoni që skedari ekziston dhe se keni leje ta përdorni.</String>
423 <String Id="Error1310" Overridable="yes"><!-- _locID_text="Error1310" _locComment="Error1310" -->Gabim në shkrimin te skedari: [3]. {{ Gabim sistemi [2].}} Verifikoni që keni leje ta përdorni atë direktori.</String>
424 <String Id="Error1311" Overridable="yes"><!-- _locID_text="Error1311" _locComment="Error1311" -->S’u gjet skedari burim{{(cabinet)}}: [2]. Verifikoni që skedari ekziston dhe se keni leje ta përdorni.</String>
425 <String Id="Error1312" Overridable="yes"><!-- _locID_text="Error1312" _locComment="Error1312" -->S’krijohet dot drejtoria '[2]'. Ka tashmë një skedar me këtë emër. Ju lutemi, riemërtojeni ose hiqeni skedarin dhe klikoni mbi Riprovo, ose klikoni mbi Anuloje që të dilet.</String>
426 <String Id="Error1313" Overridable="yes"><!-- _locID_text="Error1313" _locComment="Error1313" -->Volumi [2] hëpërhë është i pakapshëm. Ju lutemi, përzgjidhni një tjetër.</String>
427 <String Id="Error1314" Overridable="yes"><!-- _locID_text="Error1314" _locComment="Error1314" -->Shtegu i treguar '[2]' është i pakapshëm.</String>
428 <String Id="Error1315" Overridable="yes"><!-- _locID_text="Error1315" _locComment="Error1315" -->S’arrihet të shkruhet te dosja e treguar: [2].</String>
429 <String Id="Error1316" Overridable="yes"><!-- _locID_text="Error1316" _locComment="Error1316" -->Ndodhi një gabim rrjeti teksa provohej të lexohej prej skedari: [2]</String>
430 <String Id="Error1317" Overridable="yes"><!-- _locID_text="Error1317" _locComment="Error1317" -->Ndodhi një gabim rrjeti teksa provohej të përpiqej të krijohej direktoria: [2]</String>
431 <String Id="Error1318" Overridable="yes"><!-- _locID_text="Error1318" _locComment="Error1318" -->Ndodhi një gabim rrjeti teksa provohej të krijohej direktoria: [2]</String>
432 <String Id="Error1319" Overridable="yes"><!-- _locID_text="Error1319" _locComment="Error1319" -->Ndodhi një gabim rrjeti teksa provohej të hapej skedari burim cab: [2]</String>
433 <String Id="Error1320" Overridable="yes"><!-- _locID_text="Error1320" _locComment="Error1320" -->Shtegu i treguar është shumë i gjatë: [2]</String>
434 <String Id="Error1321" Overridable="yes"><!-- _locID_text="Error1321" _locComment="Error1321" -->Instaluesi ka privilegje të pamjaftueshme për modifikimin e këtij skedari: [2].</String>
435 <String Id="Error1322" Overridable="yes"><!-- _locID_text="Error1322" _locComment="Error1322" -->Një pjesë e shtegut të dosjes '[2]' është e pavlefshme. Ose është e zbrazët, ose e tejkalon gjatësinë e lejuar nga sistemi.</String>
436 <String Id="Error1323" Overridable="yes"><!-- _locID_text="Error1323" _locComment="Error1323" -->Shtegu i dosjes '[2]' përmban fjalë që s’janë të vlefshme në shtigje dosjesh.</String>
437 <String Id="Error1324" Overridable="yes"><!-- _locID_text="Error1324" _locComment="Error1324" -->Shtegu i dosjes '[2]' përmban një shenjë të pavlefshme.</String>
438 <String Id="Error1325" Overridable="yes"><!-- _locID_text="Error1325" _locComment="Error1325" -->'[2]' s’është emër i shkurtër skedarësh i vlefshëm.</String>
439 <String Id="Error1326" Overridable="yes"><!-- _locID_text="Error1326" _locComment="Error1326" -->Gabim në marrje sigurie skedari: [3] GetLastError: [2]</String>
440 <String Id="Error1327" Overridable="yes"><!-- _locID_text="Error1327" _locComment="Error1327" -->Disk i Pavlefshëm: [2]</String>
441 <String Id="Error1328" Overridable="yes"><!-- _locID_text="Error1328" _locComment="Error1328" -->Gabim në aplikim arnimi mbi skedarin [2]. Ka gjasa të jetë përditësuar në rrugë të tjera, dhe s’mund të përditësohet më përmes këtij arnimi. Për më tepër të dhëna lidhuni me shitësin e arnimit tuaj. {{Gabim Sistemi: [3]}}</String>
442 <String Id="Error1329" Overridable="yes"><!-- _locID_text="Error1329" _locComment="Error1329" -->S’instalohet dot një skedar që është i domosdoshëm, ngaqë skedari cab [2] s’është nënshkruar në mënyrë dixhitale. Kjo mund të jetë shenjë që skedari cab të jetë i dëmtuar.</String>
443 <String Id="Error1330" Overridable="yes"><!-- _locID_text="Error1330" _locComment="Error1330" -->S’instalohet dot një skedar që është i domosdoshëm, ngaqë skedari cab [2] ka një nënshkrim dixhital të pavlefshëm. Kjo mund të jetë shenjë që skedari cab të jetë i dëmtuar.{{ Gabimi [3] u dha nga WinVerifyTrust.}}</String>
444 <String Id="Error1331" Overridable="yes"><!-- _locID_text="Error1331" _locComment="Error1331" -->U dështua të kopjohet saktë skedari [2]: Gabim CRC.</String>
445 <String Id="Error1332" Overridable="yes"><!-- _locID_text="Error1332" _locComment="Error1332" -->U dështua të zhvendoset saktë skedari [2]: Gabim CRC.</String>
446 <String Id="Error1333" Overridable="yes"><!-- _locID_text="Error1333" _locComment="Error1333" -->U dështua të arnohej saktë skedari [2]: Gabim CRC.</String>
447 <String Id="Error1334" Overridable="yes"><!-- _locID_text="Error1334" _locComment="Error1334" -->Skedari '[2]' s’mund të instalohet, ngaqë s’u gjet dot në skedar cab '[3]'. Kjo mund të jetë shenjë e një gabimi rrjeti, e një gabimi leximi nga CD-ROM-i, ose i një problemi me këtë paketë.</String>
448 <String Id="Error1335" Overridable="yes"><!-- _locID_text="Error1335" _locComment="Error1335" -->Skedari cab '[2]' i domosdoshëm për këtë instalim është i dëmtuar dhe nuk mund të përdoret. Kjo mund të jetë shenjë e një gabimi rrjeti, e një gabimi leximi nga CD-ROM-i, ose i një problemi me këtë paketë.</String>
449 <String Id="Error1336" Overridable="yes"><!-- _locID_text="Error1336" _locComment="Error1336" -->Pati një gabim me krijimin e një skedari të përkohshëm që është i nevojshëm për plotësimin e instalimit.{{ Dosje: [3]. Kod gabimi sistemi: [2]}}</String>
450 <String Id="Error1401" Overridable="yes"><!-- _locID_text="Error1401" _locComment="Error1401" -->Kyçi s’u krijua dot: [2]. {{ Gabim sistemi [3].}} Verifikoni që keni leje të mjaftueshme përdorimi të atij kyçi, ose lidhuni me personelin tuaj të asistencës. </String>
451 <String Id="Error1402" Overridable="yes"><!-- _locID_text="Error1402" _locComment="Error1402" -->Kyçi s’u hap dot: [2]. {{ Gabim sistemi [3].}} Verifikoni që keni leje të mjaftueshme përdorimi të atij kyçi, ose lidhuni me personelin tuaj të asistencës. </String>
452 <String Id="Error1403" Overridable="yes"><!-- _locID_text="Error1403" _locComment="Error1403" -->Vlera s’ u fshi dot [2] prej kyçit [3]. {{ Gabim sistemi [4].}} Verifikoni që keni leje të mjaftueshme përdorimi të atij kyçi, ose lidhuni me personelin tuaj të asistencës. </String>
453 <String Id="Error1404" Overridable="yes"><!-- _locID_text="Error1404" _locComment="Error1404" -->Kyçi s’u fshi dot [2]. {{ Gabim sistemi [3].}} Verifikoni që keni leje të mjaftueshme përdorimi të atij kyçi, ose lidhuni me personelin tuaj të asistencës. </String>
454 <String Id="Error1405" Overridable="yes"><!-- _locID_text="Error1405" _locComment="Error1405" -->S’u lexua dot vlera [2] prej kyçit [3]. {{ Gabim sistemi [4].}} Verifikoni që keni leje të mjaftueshme përdorimi të atij kyçi, ose lidhuni me personelin tuaj të asistencës. </String>
455 <String Id="Error1406" Overridable="yes"><!-- _locID_text="Error1406" _locComment="Error1406" -->S’u shkrua dot vlera [2] te kyçi [3]. {{ Gabim sistemi [4].}} Verifikoni që keni leje të mjaftueshme përdorimi të atij kyçi, ose lidhuni me personelin tuaj të asistencës.</String>
456 <String Id="Error1407" Overridable="yes"><!-- _locID_text="Error1407" _locComment="Error1407" -->S’u morën dot emra vlerash për kyçin [2]. {{ Gabim sistemi [3].}} Verifikoni që keni leje të mjaftueshme përdorimi të atij kyçi, ose lidhuni me personelin tuaj të asistencës.</String>
457 <String Id="Error1408" Overridable="yes"><!-- _locID_text="Error1408" _locComment="Error1408" -->S’u morën dot emra nënkyçash për kyçin [2]. {{ Gabim sistemi [3].}} Verifikoni që keni leje të mjaftueshme përdorimi të atij kyçi, ose lidhuni me personelin tuaj të asistencës.</String>
458 <String Id="Error1409" Overridable="yes"><!-- _locID_text="Error1409" _locComment="Error1409" -->S’u lexua dot informacion sigurie për kyçin [2]. {{ Gabim sistemi [3].}} Verifikoni që keni leje të mjaftueshme përdorimi të atij kyçi, ose lidhuni me personelin tuaj të asistencës.</String>
459 <String Id="Error1410" Overridable="yes"><!-- _locID_text="Error1410" _locComment="Error1410" -->S’u rrit dot hapësira e përdorshme nga regjistri. Për instalimin e këtij aplikacioni lypsen [2] KB hapësirë regjistri e lirë.</String>
460 <String Id="Error1500" Overridable="yes"><!-- _locID_text="Error1500" _locComment="Error1500" -->Ka në punë e sipër një tjetër instalim. Duhet të plotësoni atë instalim, përpara se të vazhdoni me këtë të riun.</String>
461 <String Id="Error1501" Overridable="yes"><!-- _locID_text="Error1501" _locComment="Error1501" -->Gabim hyrjeje në të dhëna të siguruara. Ju lutemi, sigurohuni që Windows Installer është formësuar si duhet dhe riprovoni instalimin.</String>
462 <String Id="Error1502" Overridable="yes"><!-- _locID_text="Error1502" _locComment="Error1502" -->Përdoruesi '[2]' ka nisur më parë një instalim për produktin '[3]'. Atij përdoruesi do t’i duhet ta xhirojë sërish instalimin, përpara se të mund të përdoret prej tyre ky produkt. Tani do të vazhdojë instalimi juaj.</String>
463 <String Id="Error1503" Overridable="yes"><!-- _locID_text="Error1503" _locComment="Error1503" -->Përdoruesi '[2]' ka nisur më parë një instalim për produktin '[3]'. Atij përdoruesi do t’i duhet ta xhirojë sërish instalimin, përpara se të mund të përdoret prej tyre ky produkt.</String>
464 <String Id="Error1601" Overridable="yes"><!-- _locID_text="Error1601" _locComment="Error1601" -->Pa hapësirë në disk -- Volum: '[2]'; hapësirë e domosdoshme: [3] KB; hapësirë e përdorshme: [4] KB. Lironi ca hapësirë në disk dhe riprovoni.</String>
465 <String Id="Error1602" Overridable="yes"><!-- _locID_text="Error1602" _locComment="Error1602" -->Jeni i sigurt se doni ta anuloni?</String>
466 <String Id="Error1603" Overridable="yes"><!-- _locID_text="Error1603" _locComment="Error1603" -->Skedari [2][3] po mbahet në përdorim{ nga procesi vijues: Emër: [4], Id: [5], Titull Dritareje: '[6]'}. Mbylleni atë aplikacion dhe riprovoni.</String>
467 <String Id="Error1604" Overridable="yes"><!-- _locID_text="Error1604" _locComment="Error1604" -->Produkti '[2]' është i instaluar tashmë, çka pengon instalim e këtij produkti. Dy produktet janë të papërputhshëm.</String>
468 <String Id="Error1605" Overridable="yes"><!-- _locID_text="Error1605" _locComment="Error1605" -->Në volumin '[2]' s’ka hapësirë të mjaftueshme për të vazhduar instalimin me proces rikthimi të aktivizuar. Janë të domosdoshëm [3] KB, por mund të përdoren vetëm [4] KB. Klikoni mbi Shpërfille që të vazhdohet instalimi pa ruajtur të dhëna procesi rikthimi, klikoni mbi Riprovo që të rikontrollohet për hapësirë të përdorshme, ose Anuloje për të dalë nga instalimi.</String>
469 <String Id="Error1606" Overridable="yes"><!-- _locID_text="Error1606" _locComment="Error1606" -->S’u hy dot në vend rrjeti [2].</String>
470 <String Id="Error1607" Overridable="yes"><!-- _locID_text="Error1607" _locComment="Error1607" -->Aplikacionet vijuese do të duheshin mbyllur përpara vazhdimit të instalimit:</String>
471 <String Id="Error1608" Overridable="yes"><!-- _locID_text="Error1608" _locComment="Error1608" -->S’u gjet dot ndonjë produkt i përshtatshëm i instaluar më parë te makina për instalimin e këtij produkti.</String>
472 <String Id="Error1609" Overridable="yes"><!-- _locID_text="Error1609" _locComment="Error1609" -->Ndodhi një gabim teksa zbatoheshin rregullime sigurie. [2] s’është përdorues ose grup i vlefshëm. Ky mund të jetë një problem me paketën, ose një problem lidhjeje me një kontrollor përkatësish te rrjeti. Kontrolloni lidhjen tuaj në rrjet dhe klikoni mbi Riprovo, ose Anulojeni që të përfundohet instalimi. {{S’arrihet të lokalizohet SID përdoruesi, gabim sistemi [3]}}</String>
473 <String Id="Error1701" Overridable="yes"><!-- _locID_text="Error1701" _locComment="Error1701" -->Kyçi [2] s’është i vlefshëm. Verifikoni në dhatë kyçin e saktë.</String>
474 <String Id="Error1702" Overridable="yes"><!-- _locID_text="Error1702" _locComment="Error1702" -->Instaluesi duhet të rinisë sistemin tuaj, përpara se të mund të vazhdohet me formësimin e [2]. Klikoni mbi Po, që të riniset tani, ose mbi Jo, nëse keni në plan ta rinisni dorazi më vonë.</String>
475 <String Id="Error1703" Overridable="yes"><!-- _locID_text="Error1703" _locComment="Error1703" -->Që të hyjnë në fuqi ndryshimet e formësimit të bëra te [2], duhet të rinisni sistemin tuaj. Klikoni mbi Po, që të riniset tani, ose mbi Jo, nëse keni në plan ta rinisni dorazi më vonë.</String>
476 <String Id="Error1704" Overridable="yes"><!-- _locID_text="Error1704" _locComment="Error1704" -->Ka të pezulluar një instalim për [2]. Që të vazhdohet, duhet të zhbëni ndryshimet e bëra nga ai instalim. Doni të zhbëhen ato ndryshime?</String>
477 <String Id="Error1705" Overridable="yes"><!-- _locID_text="Error1705" _locComment="Error1705" -->Ka në punë e sipër një instalim të mëparshëm të këtij produkti. Që të vazhdohet, duhet të zhbëni ndryshimet e bëra nga ai instalim. Doni të zhbëhen ato ndryshime?</String>
478 <String Id="Error1706" Overridable="yes"><!-- _locID_text="Error1706" _locComment="Error1706" -->S’gjendet dot një paketë instalimi për produktin [2]. Riprovoni instalimin duke përdorur një kopje të vlefshme të paketës së instalimit '[3]'.</String>
479 <String Id="Error1707" Overridable="yes"><!-- _locID_text="Error1707" _locComment="Error1707" -->Instalimi u plotësua me sukses.</String>
480 <String Id="Error1708" Overridable="yes"><!-- _locID_text="Error1708" _locComment="Error1708" -->Instalimi dështoi.</String>
481 <String Id="Error1709" Overridable="yes"><!-- _locID_text="Error1709" _locComment="Error1709" -->Produkt: [2] -- [3]</String>
482 <String Id="Error1710" Overridable="yes"><!-- _locID_text="Error1710" _locComment="Error1710" -->Ose mund ta riktheni kompjuterin tuaj në gjendjen e vet të mëparshme, ose të vazhdoni instalimin më vonë. Do të donit të rikthehet?</String>
483 <String Id="Error1711" Overridable="yes"><!-- _locID_text="Error1711" _locComment="Error1711" -->Ndodhi një gabim teksa shkruheshin në disk të dhëna instalimi. Kontrolloni për t’u siguruar se ka të përdorshme hapësirë disku të mjaftueshme, dhe klikoni mbi Riprovo, ose Anuloje që të përfundohet instalimi.</String>
484 <String Id="Error1712" Overridable="yes"><!-- _locID_text="Error1712" _locComment="Error1712" -->S’u gjet dot një ose më tepër skedarë të domosdoshëm për rikthimin e kompjuterit tuaj në gjendjen e vet të mëparshme. Rikthimi s’është i mundshëm.</String>
485 <String Id="Error1713" Overridable="yes"><!-- _locID_text="Error1713" _locComment="Error1713" -->[2] s’instalon dot një nga produktet e veta të domosdoshme. Lidhuni me grupin tuaj të asistencës teknike. {{Gabim Sistemi: [3].}}</String>
486 <String Id="Error1714" Overridable="yes"><!-- _locID_text="Error1714" _locComment="Error1714" -->Versioni i vjetër i [2] s’mund të hiqet. Lidhuni me grupin tuaj të asistencës teknike. {{Gabim Sistemi [3].}}</String>
487 <String Id="Error1715" Overridable="yes"><!-- _locID_text="Error1715" _locComment="Error1715" -->U instalua [2]</String>
488 <String Id="Error1716" Overridable="yes"><!-- _locID_text="Error1716" _locComment="Error1716" -->U formësua [2]</String>
489 <String Id="Error1717" Overridable="yes"><!-- _locID_text="Error1717" _locComment="Error1717" -->U hoq [2]</String>
490 <String Id="Error1718" Overridable="yes"><!-- _locID_text="Error1718" _locComment="Error1718" -->Skedari [2] u hodh poshtë nga rregullat mbi nënshkrimet dixhitale.</String>
491 <String Id="Error1719" Overridable="yes"><!-- _locID_text="Error1719" _locComment="Error1719" -->S’u hy dot te Windows Installer Service. Kjo mund të ngjasë kur Windows-in e xhironi nën mënyrën e sigurt, ose Windows Installer s’është instaluar si duhet. Për asistencë lidhuni me personelin tuaj të asistencës.</String>
492 <String Id="Error1720" Overridable="yes"><!-- _locID_text="Error1720" _locComment="Error1720" -->Ka një problem me këtë paketë Windows Installer. S’xhirohet dot një skript i domosdoshëm për plotësimin e këtij instalimi. Lidhuni me personelin tuaj të asistencës ose me shitësin e paketës. {{Veprim [2] gabim skripti [3], [4]: [5] Rresht [6], Shtyllë [7], [8] }}</String>
493 <String Id="Error1721" Overridable="yes"><!-- _locID_text="Error1721" _locComment="Error1721" -->Ka një problem me këtë paketë Windows Installer. S’xhirohet dot një program i domosdoshëm për plotësimin e këtij instalimi. Lidhuni me personelin tuaj të asistencës ose me shitësin e paketës. {{Veprim: [2], vend: [3], urdhër: [4] }}</String>
494 <String Id="Error1722" Overridable="yes"><!-- _locID_text="Error1722" _locComment="Error1722" -->Ka një problem me këtë paketë Windows Installer. Një program i xhiruar si pjesë e rregullimit s’përfundoi siç pritej. Lidhuni me personelin tuaj të asistencës ose me shitësin e paketës. {{Veprim [2], vend: [3], urdhër: [4] }}</String>
495 <String Id="Error1723" Overridable="yes"><!-- _locID_text="Error1723" _locComment="Error1723" -->Ka një problem me këtë paketë Windows Installer. S’u xhirua dot një DLL e domosdoshme për plotësimin e këtij instalimi. Lidhuni me personelin tuaj të asistencës ose me shitësin e paketës. {{Veprim [2], zë: [3], librari: [4] }}</String>
496 <String Id="Error1724" Overridable="yes"><!-- _locID_text="Error1724" _locComment="Error1724" -->Heqja u plotësua me sukses.</String>
497 <String Id="Error1725" Overridable="yes"><!-- _locID_text="Error1725" _locComment="Error1725" -->Heqja dështoi.</String>
498 <String Id="Error1726" Overridable="yes"><!-- _locID_text="Error1726" _locComment="Error1726" -->Lajmërimi u plotësua me sukses.</String>
499 <String Id="Error1727" Overridable="yes"><!-- _locID_text="Error1727" _locComment="Error1727" -->Lajmërimi dështoi.</String>
500 <String Id="Error1728" Overridable="yes"><!-- _locID_text="Error1728" _locComment="Error1728" -->Formësimi u plotësua me sukses.</String>
501 <String Id="Error1729" Overridable="yes"><!-- _locID_text="Error1729" _locComment="Error1729" -->Formësimi dështoi.</String>
502 <String Id="Error1730" Overridable="yes"><!-- _locID_text="Error1730" _locComment="Error1730" -->Që ta hiqni këtë aplikacion, duhet të jeni Administrator. Që ta hiqni këtë aplikacion, mund të hyni si Administrator, ose të lidheni për asistencë me grupin tuaj të asistencës teknike.</String>
503 <String Id="Error1731" Overridable="yes"><!-- _locID_text="Error1731" _locComment="Error1731" -->Paketa burim e instalimit për produktin [2] s’është e sinkronizuar me paketën klient. Riprovoni instalimin duke përdorur një kopje të vlefshme të paketës së instalimit '[3]'.</String>
504 <String Id="Error1732" Overridable="yes"><!-- _locID_text="Error1732" _locComment="Error1732" -->Që të mund të plotësohet instalimi i [2], kompjuteri duhet të riniset. Hëpërhë ka përdorues të tjerë që kanë bërë hyrjen në këtë kompjuter, dhe rinisja e tij mund të shkaktojë për ta humbjen e asaj që po bënin. Doni të riniset tani?</String>
505 <String Id="Error1801" Overridable="yes"><!-- _locID_text="Error1801" _locComment="Error1801" -->Shtegu [2] s’është i vlefshëm. Ju lutemi, përcaktoni një shteg të vlefshëm.</String>
506 <String Id="Error1802" Overridable="yes"><!-- _locID_text="Error1802" _locComment="Error1802" -->Kujtesë e pamjaftueshme. Para se të riprovoni, mbyllni aplikacione të tjera.</String>
507 <String Id="Error1803" Overridable="yes"><!-- _locID_text="Error1803" _locComment="Error1803" -->S’ka disk në pajisje [2]. Ju lutemi, futni një të tillë dhe klikoni mbi Riprovo, ose klikoni mbi Anulo që të kalohet mbrapsht te volumi i përzgjedhur më parë.</String>
508 <String Id="Error1804" Overridable="yes"><!-- _locID_text="Error1804" _locComment="Error1804" -->S’ka disk në pajisje [2]. Ju lutemi, futni një të tillë dhe klikoni mbi Riprovo, ose klikoni mbi Anulojeni që të rikthehet dialogu i shfletuesit dhe të përzgjidhni një volum tjetër.</String>
509 <String Id="Error1805" Overridable="yes"><!-- _locID_text="Error1805" _locComment="Error1805" -->Dosja [2] nuk ekziston. Ju lutemi, jepni një shteg për te një dosje që ekziston.</String>
510 <String Id="Error1806" Overridable="yes"><!-- _locID_text="Error1806" _locComment="Error1806" -->Keni privilegje të pamjaftueshme për leximin e kësaj dosjeje.</String>
511 <String Id="Error1807" Overridable="yes"><!-- _locID_text="Error1807" _locComment="Error1807" -->S’u përcaktua dot një dosje e vlefshme për instalimin.</String>
512 <String Id="Error1901" Overridable="yes"><!-- _locID_text="Error1901" _locComment="Error1901" -->Gabim në përpjekjen për të lexuar prej bazës së të dhënave burim të instalimit: [2].</String>
513 <String Id="Error1902" Overridable="yes"><!-- _locID_text="Error1902" _locComment="Error1902" -->Po planifikohet operacion rinisjeje: Po emërtohet skedari [2] si [3]. Që të plotësohet operacioni, duhet bërë rinisja.</String>
514 <String Id="Error1903" Overridable="yes"><!-- _locID_text="Error1903" _locComment="Error1903" -->Po planifikohet operacion rinisjeje: Po fshihet skedari [2]. Që të plotësohet operacioni, duhet bërë rinisja.</String>
515 <String Id="Error1904" Overridable="yes"><!-- _locID_text="Error1904" _locComment="Error1904" -->Dështoi regjistrimi i modulit [2]. HRESULT [3]. Lidhuni me personelin tuaj të asistencës.</String>
516 <String Id="Error1905" Overridable="yes"><!-- _locID_text="Error1905" _locComment="Error1905" -->Dështoi çregjistrimi i modulit [2]. HRESULT [3]. Lidhuni me personelin tuaj të asistencës.</String>
517 <String Id="Error1906" Overridable="yes"><!-- _locID_text="Error1906" _locComment="Error1906" -->Dështoi ruajtja në fshehtinë e paketës [2]. Gabim: [3]. Lidhuni me personelin tuaj të asistencës.</String>
518 <String Id="Error1907" Overridable="yes"><!-- _locID_text="Error1907" _locComment="Error1907" -->S’u regjistruan dot shkronjat [2]. Verifikoni se keni leje të mjaftueshme për instalim shkronjash, dhe se këto shkronja mbulohen nga sistemi.</String>
519 <String Id="Error1908" Overridable="yes"><!-- _locID_text="Error1908" _locComment="Error1908" -->S’u çregjistruan dot shkronjat [2]. Verifikoni se keni leje të mjaftueshme për heqje shkronjash.</String>
520 <String Id="Error1909" Overridable="yes"><!-- _locID_text="Error1909" _locComment="Error1909" -->S’u krijua dot shkurtore tastiere [2]. Verifikoni që dosja destinacion ekziston dhe se keni leje ta përdorni.</String>
521 <String Id="Error1910" Overridable="yes"><!-- _locID_text="Error1910" _locComment="Error1910" -->S’u hoq dot shkurtore tastiere [2]. Verifikoni që skedari i shkurtores ekziston dhe se keni leje ta përdorni.</String>
522 <String Id="Error1911" Overridable="yes"><!-- _locID_text="Error1911" _locComment="Error1911" -->S’u regjistrua dot lloj librarie për skedarin [2]. Lidhuni me personelin e asistencës tuaj.</String>
523 <String Id="Error1912" Overridable="yes"><!-- _locID_text="Error1912" _locComment="Error1912" -->S’u çregjistrua dot lloj librarie për skedarin [2]. Lidhuni me personelin e asistencës tuaj.</String>
524 <String Id="Error1913" Overridable="yes"><!-- _locID_text="Error1913" _locComment="Error1913" -->S’u përditësua dot skedari ini [2][3]. Verifikoni që skedari ekziston dhe se keni leje ta përdorni atë.</String>
525 <String Id="Error1914" Overridable="yes"><!-- _locID_text="Error1914" _locComment="Error1914" -->S’u planifikua dot zëvendësimi me skedarin [2] i skedarit [3] gjatë rinisjes. Verifikoni se keni leje shkrimi mbi skedarin [3].</String>
526 <String Id="Error1915" Overridable="yes"><!-- _locID_text="Error1915" _locComment="Error1915" -->Gabim në heqje përgjegjësi përudhësi ODBC, gabim ODBC [2]: [3]. Lidhuni me personelin tuaj të asistencës.</String>
527 <String Id="Error1916" Overridable="yes"><!-- _locID_text="Error1916" _locComment="Error1916" -->Gabim në instalim përgjegjësi përudhësi ODBC, gabim ODBC [2]: [3]. Lidhuni me personelin tuaj të asistencës.</String>
528 <String Id="Error1917" Overridable="yes"><!-- _locID_text="Error1917" _locComment="Error1917" -->Gabim në heqje përudhësi ODBC: [4], gabim ODBC [2]: [3]. Verifikoni se keni privilegje të mjaftueshme për heqje përudhësish ODBC.</String>
529 <String Id="Error1918" Overridable="yes"><!-- _locID_text="Error1918" _locComment="Error1918" -->Gabim në instalim përudhësi ODBC: [4], gabim ODBC [2]: [3]. Verifikoni se skedari [4] ekziston dhe se keni leje ta përdorni.</String>
530 <String Id="Error1919" Overridable="yes"><!-- _locID_text="Error1919" _locComment="Error1919" -->Gabim në formësim burimi ODBC të dhënash: [4], gabim ODBC [2]: [3]. Verifikoni se skedari [4] ekziston dhe se keni leje ta përdorni.</String>
531 <String Id="Error1920" Overridable="yes"><!-- _locID_text="Error1920" _locComment="Error1920" -->Shërbimi '[2]' ([3]) dështoi të nisej. Verifikoni se keni privilegje të mjaftueshme për nisje shërbimesh sistemi.</String>
532 <String Id="Error1921" Overridable="yes"><!-- _locID_text="Error1921" _locComment="Error1921" -->Shërbimi '[2]' ([3]) s’u ndal dot. Verifikoni se keni privilegje të mjaftueshme për ndalje shërbimesh sistemi.</String>
533 <String Id="Error1922" Overridable="yes"><!-- _locID_text="Error1922" _locComment="Error1922" -->Shërbimi '[2]' ([3]) s’u fshi dot. Verifikoni se keni privilegje të mjaftueshme për heqje shërbimesh sistemi.</String>
534 <String Id="Error1923" Overridable="yes"><!-- _locID_text="Error1923" _locComment="Error1923" -->Shërbimi '[2]' ([3]) s’u instalua dot. Verifikoni se keni privilegje të mjaftueshme për instalim shërbimesh sistemi.</String>
535 <String Id="Error1924" Overridable="yes"><!-- _locID_text="Error1924" _locComment="Error1924" -->S’u përditësua dot ndryshore mjedisi '[2]'. Verifikoni se keni privilegje të mjaftueshme për modifikim ndryshoresh mjedisi.</String>
536 <String Id="Error1925" Overridable="yes"><!-- _locID_text="Error1925" _locComment="Error1925" -->Nuk keni privilegje të mjaftueshme për plotësimin e këtij instalimi për krejt përdoruesit e makinës. Bëni hyrjen si administrator dhe mandej riprovoni këtë instalim.</String>
537 <String Id="Error1926" Overridable="yes"><!-- _locID_text="Error1926" _locComment="Error1926" -->S’u caktua dot siguri skedari për skedarin '[3]'. Gabim: [2]. Verifikoni se keni privilegje të mjaftueshme për modifikim lejesh sigurie për këtë skedar.</String>
538 <String Id="Error1927" Overridable="yes"><!-- _locID_text="Error1927" _locComment="Error1927" -->Shërbime Përbërësish (COM+ 1.0) nuk janë të instaluar në këtë kompjuter. Ky instalim lyp Shërbime Përbërësish që të mund të plotësohet me sukses. Shërbime Përbërësish gjenden te Windows 2000.</String>
539 <String Id="Error1928" Overridable="yes"><!-- _locID_text="Error1928" _locComment="Error1928" -->Gabim në regjistrim Aplikacioni COM+. Për më tepër të dhëna lidhuni me personelin tuaj të asistencës.</String>
540 <String Id="Error1929" Overridable="yes"><!-- _locID_text="Error1929" _locComment="Error1929" -->Gabim në çregjistrim Aplikacioni COM+. Për më tepër të dhëna lidhuni me personelin tuaj të asistencës.</String>
541 <String Id="Error1930" Overridable="yes"><!-- _locID_text="Error1930" _locComment="Error1930" -->S’u ndryshua dot përshkrimi për shërbimin '[2]' ([3]).</String>
542 <String Id="Error1931" Overridable="yes"><!-- _locID_text="Error1931" _locComment="Error1931" -->Shërbimi Windows Installer s’përditëson dot skedarin e sistemit [2], ngaqë skedari është i mbrojtur nga Windows-i. Që ky program të punojë si duhet, mund t’ju duhet të përditësoni sistemin tuaj operativ. {{Version pakete: [3], version OS i Mbrojtur: [4]}}</String>
543 <String Id="Error1932" Overridable="yes"><!-- _locID_text="Error1932" _locComment="Error1932" -->Shërbimi Windows Installer s’përditëson dot skedarin Windows të mbrojtur [2]. {{Version pakete: [3], version OS i Mbrojtur: [4], Gabim SFP: [5]}}</String>
544 <String Id="Error1933" Overridable="yes"><!-- _locID_text="Error1933" _locComment="Error1933" -->Shërbimi Windows Installer s’përditëson dot një ose më shumë skedarë Windows të mbrojtur. {{Gabim SFP: [2]. Listë skedarësh të mbrojtur:\r\n[3]}}</String>
545 <String Id="Error1934" Overridable="yes"><!-- _locID_text="Error1934" _locComment="Error1934" -->Instalimet nga përdorues janë çaktivizuar nga rregulla te makina.</String>
546 <String Id="Error1935" Overridable="yes"><!-- _locID_text="Error1935" _locComment="Error1935" -->Ndodhi një gabim gjatë instalimit të asemblit '[6]'. Për më tepër të dhëna, ju lutemi, referojuni Ndihmës dhe Asistencës. HRESULT: [3]. {{ndërfaqe asembli: [4], funksion: [5], përbërës: [2]}}</String>
547 <String Id="Error1936" Overridable="yes"><!-- _locID_text="Error1936" _locComment="Error1936" -->Ndodhi një gabim gjatë instalimit të asemblit '[6]'. Asembli s’është emërtuar fort, ose s’është nënshkruar me gjatësinë minimum për kyça. HRESULT: [3]. {{ndërfaqe asembli: [4], funksion: [5], përbërës: [2]}}</String>
548 <String Id="Error1937" Overridable="yes"><!-- _locID_text="Error1937" _locComment="Error1937" -->Ndodhi një gabim gjatë instalimit të asemblit '[6]'. Nënshkrimi ose katalogu s’u verifikuan dot, ose s’janë të vlefshëm. HRESULT: [3]. {{ndërfaqe asembli: [4], funksion: [5], përbërës: [2]}}</String>
549 <String Id="Error1938" Overridable="yes"><!-- _locID_text="Error1938" _locComment="Error1938" -->Ndodhi një gabim gjatë instalimit të asemblit '[6]'. S’u gjetën dot një ose më shumë module asembli. HRESULT: [3]. {{ndërfaqe asembli: [4], funksion: [5], përbërës: [2]}}</String>
550
551 <String Id="UITextbytes" Overridable="yes"><!-- _locID_text="UITextbytes" _locComment="UITextbytes" -->bajte</String>
552 <String Id="UITextGB" Overridable="yes"><!-- _locID_text="UITextGB" _locComment="UITextGB" -->GB</String>
553 <String Id="UITextKB" Overridable="yes"><!-- _locID_text="UITextKB" _locComment="UITextKB" -->KB</String>
554 <String Id="UITextMB" Overridable="yes"><!-- _locID_text="UITextMB" _locComment="UITextMB" -->MB</String>
555 <String Id="UITextMenuAbsent" Overridable="yes"><!-- _locID_text="UITextMenuAbsent" _locComment="UITextMenuAbsent" -->S’do të mund të përdoret dot krejt veçoria</String>
556 <String Id="UITextMenuAdvertise" Overridable="yes"><!-- _locID_text="UITextMenuAdvertise" _locComment="UITextMenuAdvertise" -->Veçoria do të instalohet kur kjo të jetë e domosdoshme</String>
557 <String Id="UITextMenuAllCD" Overridable="yes"><!-- _locID_text="UITextMenuAllCD" _locComment="UITextMenuAllCD" -->Krejt veçoria do të instalohet për t’u xhiruar që nga CD-ja</String>
558 <String Id="UITextMenuAllLocal" Overridable="yes"><!-- _locID_text="UITextMenuAllLocal" _locComment="UITextMenuAllLocal" -->Krejt veçoria do të instalohet në hard disk lokal</String>
559 <String Id="UITextMenuAllNetwork" Overridable="yes"><!-- _locID_text="UITextMenuAllNetwork" _locComment="UITextMenuAllNetwork" -->Krejt veçoria do të instalohet për t’u xhiruar që nga rrjeti</String>
560 <String Id="UITextMenuCD" Overridable="yes"><!-- _locID_text="UITextMenuCD" _locComment="UITextMenuCD" -->Do të instalohet për t’u xhiruar që nga CD-ja</String>
561 <String Id="UITextMenuLocal" Overridable="yes"><!-- _locID_text="UITextMenuLocal" _locComment="UITextMenuLocal" -->Do të instalohet në hard disk lokal</String>
562 <String Id="UITextMenuNetwork" Overridable="yes"><!-- _locID_text="UITextMenuNetwork" _locComment="UITextMenuNetwork" -->Do të instalohet për t’u xhiruar që nga rrjeti</String>
563 <String Id="UITextNewFolder" Overridable="yes"><!-- _locID_text="UITextNewFolder" _locComment="UITextNewFolder" -->Dosje|Dosje e Re</String>
564 <String Id="UITextScriptInProgress" Overridable="yes"><!-- _locID_text="UITextScriptInProgress" _locComment="UITextScriptInProgress" -->Po grumbullohen të dhëna të domosdoshme…</String>
565 <String Id="UITextSelAbsentAbsent" Overridable="yes"><!-- _locID_text="UITextSelAbsentAbsent" _locComment="UITextSelAbsentAbsent" -->Kjo veçori do të mbesë e çinstaluar</String>
566 <String Id="UITextSelAbsentAdvertise" Overridable="yes"><!-- _locID_text="UITextSelAbsentAdvertise" _locComment="UITextSelAbsentAdvertise" -->Kjo veçori do të instalohet kur kjo të jetë e domosdoshme</String>
567 <String Id="UITextSelAbsentCD" Overridable="yes"><!-- _locID_text="UITextSelAbsentCD" _locComment="UITextSelAbsentCD" -->Kjo veçori do të instalohet për t’u xhiruar që nga CD-ja</String>
568 <String Id="UITextSelAbsentLocal" Overridable="yes"><!-- _locID_text="UITextSelAbsentLocal" _locComment="UITextSelAbsentLocal" -->Kjo veçori do të instalohet në hard diskun</String>
569 <String Id="UITextSelAbsentNetwork" Overridable="yes"><!-- _locID_text="UITextSelAbsentNetwork" _locComment="UITextSelAbsentNetwork" -->Kjo veçori do të instalohet për t’u xhiruar që nga rrjeti</String>
570 <String Id="UITextSelAdvertiseAbsent" Overridable="yes"><!-- _locID_text="UITextSelAdvertiseAbsent" _locComment="UITextSelAdvertiseAbsent" -->Kjo veçori do të bëhet e papërdorshme</String>
571 <String Id="UITextSelAdvertiseAdvertise" Overridable="yes"><!-- _locID_text="UITextSelAdvertiseAdvertise" _locComment="UITextSelAdvertiseAdvertise" -->Do të instalohet kur kjo të jetë e domosdoshme</String>
572 <String Id="UITextSelAdvertiseCD" Overridable="yes"><!-- _locID_text="UITextSelAdvertiseCD" _locComment="UITextSelAdvertiseCD" -->Kjo veçori do të jetë e përdorshme si xhirim që nga CD-ja</String>
573 <String Id="UITextSelAdvertiseLocal" Overridable="yes"><!-- _locID_text="UITextSelAdvertiseLocal" _locComment="UITextSelAdvertiseLocal" -->Kjo veçori do të instalohet hard diskun tuaj lokal</String>
574 <String Id="UITextSelAdvertiseNetwork" Overridable="yes"><!-- _locID_text="UITextSelAdvertiseNetwork" _locComment="UITextSelAdvertiseNetwork" -->Kjo veçori do të jetë e përdorshme si xhirim që nga rrjeti</String>
575 <String Id="UITextSelCDAbsent" Overridable="yes"><!-- _locID_text="UITextSelCDAbsent" _locComment="UITextSelCDAbsent" -->Kjo veçori do të çinstalohet plotësisht, s’do të jeni në gjendje ta xhironi që nga CD-ja</String>
576 <String Id="UITextSelCDAdvertise" Overridable="yes"><!-- _locID_text="UITextSelCDAdvertise" _locComment="UITextSelCDAdvertise" -->Kësaj veçorie do t’i ndryshohet gjendja nga xhirimi që nga CD-ja, në instalim kur kjo të jetë e domosdoshme</String>
577 <String Id="UITextSelCDCD" Overridable="yes"><!-- _locID_text="UITextSelCDCD" _locComment="UITextSelCDCD" -->Kjo veçori do të mbesë për xhirim që nga CD-ja</String>
578 <String Id="UITextSelCDLocal" Overridable="yes"><!-- _locID_text="UITextSelCDLocal" _locComment="UITextSelCDLocal" -->Kësaj veçorie do t’i ndryshohet gjendja nga xhirimi që nga CD-ja në instalim te hard disku lokal</String>
579 <String Id="UITextSelChildCostNeg" Overridable="yes"><!-- _locID_text="UITextSelChildCostNeg" _locComment="UITextSelChildCostNeg" -->Kjo veçori liron [1] në hard diskun tuaj.</String>
580 <String Id="UITextSelChildCostPos" Overridable="yes"><!-- _locID_text="UITextSelChildCostPos" _locComment="UITextSelChildCostPos" -->Kjo veçori lyp [1] në hard diskun tuaj.</String>
581 <String Id="UITextSelCostPending" Overridable="yes"><!-- _locID_text="UITextSelCostPending" _locComment="UITextSelCostPending" -->Po përpilohen kostot për këtë veçori…</String>
582 <String Id="UITextSelLocalAbsent" Overridable="yes"><!-- _locID_text="UITextSelLocalAbsent" _locComment="UITextSelLocalAbsent" -->Kjo veçori do të hiqet plotësisht</String>
583 <String Id="UITextSelLocalAdvertise" Overridable="yes"><!-- _locID_text="UITextSelLocalAdvertise" _locComment="UITextSelLocalAdvertise" -->Kjo veçori do të hiqet nga hard disku juaj vendor, por do t’i caktohet gjendja si e instalueshme kur kjo të jetë e domosdoshme</String>
584 <String Id="UITextSelLocalCD" Overridable="yes"><!-- _locID_text="UITextSelLocalCD" _locComment="UITextSelLocalCD" -->Kjo veçori do të hiqet nga hard disku juaj vendor, por do të jetë prapëseprapë e përdorshme si xhirim që nga CD-ja</String>
585 <String Id="UITextSelLocalLocal" Overridable="yes"><!-- _locID_text="UITextSelLocalLocal" _locComment="UITextSelLocalLocal" -->Kjo veçori do të mbesë në hard diskun tuaj lokal</String>
586 <String Id="UITextSelLocalNetwork" Overridable="yes"><!-- _locID_text="UITextSelLocalNetwork" _locComment="UITextSelLocalNetwork" -->Kjo veçori do të hiqet nga hard disku juaj vendor, por do të jetë prapëseprapë e përdorshme si xhirim që nga rrjeti</String>
587 <String Id="UITextSelNetworkAbsent" Overridable="yes"><!-- _locID_text="UITextSelNetworkAbsent" _locComment="UITextSelNetworkAbsent" -->Kjo veçori do të çinstalohet plotësisht, s’do të jeni në gjendje ta xhironi që nga rrjeti</String>
588 <String Id="UITextSelNetworkAdvertise" Overridable="yes"><!-- _locID_text="UITextSelNetworkAdvertise" _locComment="UITextSelNetworkAdvertise" -->Kësaj veçorie do t’i ndryshohet gjendja nga xhirimi që nga rrjeti, në instalim kur kjo të jetë e domosdoshme</String>
589 <String Id="UITextSelNetworkLocal" Overridable="yes"><!-- _locID_text="UITextSelNetworkLocal" _locComment="UITextSelNetworkLocal" -->Kësaj veçorie do t’i ndryshohet gjendja nga xhirimi që nga rrjeti, në instalim te hard disku lokal</String>
590 <String Id="UITextSelNetworkNetwork" Overridable="yes"><!-- _locID_text="UITextSelNetworkNetwork" _locComment="UITextSelNetworkNetwork" -->Kjo veçori do të mbesë për xhirim që nga rrjeti</String>
591 <String Id="UITextSelParentCostNegNeg" Overridable="yes"><!-- _locID_text="UITextSelParentCostNegNeg" _locComment="UITextSelParentCostNegNeg" -->Kjo veçori liron [1] në hard diskun tuaj. Ka të përzgjedhura [2] nga [3] nënveçori gjithsej. Nënveçoritë lirojnë [4] në hard diskun tuaj.</String>
592 <String Id="UITextSelParentCostNegPos" Overridable="yes"><!-- _locID_text="UITextSelParentCostNegPos" _locComment="UITextSelParentCostNegPos" -->Kjo veçori liron [1] në hard diskun tuaj. Ka të përzgjedhura [2] nga [3] nënveçori gjithsej. Nënveçoritë lypin [4] në hard diskun tuaj.</String>
593 <String Id="UITextSelParentCostPosNeg" Overridable="yes"><!-- _locID_text="UITextSelParentCostPosNeg" _locComment="UITextSelParentCostPosNeg" -->Kjo veçori lyp [1] në hard diskun tuaj. Ka të përzgjedhura [2] nga [3] nënveçori gjithsej. Nënveçoritë lirojnë [4] në hard diskun tuaj.</String>
594 <String Id="UITextSelParentCostPosPos" Overridable="yes"><!-- _locID_text="UITextSelParentCostPosPos" _locComment="UITextSelParentCostPosPos" -->Kjo veçori lyp [1] në hard diskun tuaj. Ka të përzgjedhura [2] nga [3] nënveçori gjithsej. Nënveçoritë lypin [4] në hard diskun tuaj.</String>
595 <String Id="UITextTimeRemaining" Overridable="yes"><!-- _locID_text="UITextTimeRemaining" _locComment="UITextTimeRemaining" -->Kohë e mbetur: {[1] minuta }{[2] sekonda}</String>
596 <String Id="UITextVolumeCostAvailable" Overridable="yes"><!-- _locID_text="UITextVolumeCostAvailable" _locComment="UITextVolumeCostAvailable" -->E gatshme</String>
597 <String Id="UITextVolumeCostDifference" Overridable="yes"><!-- _locID_text="UITextVolumeCostDifference" _locComment="UITextVolumeCostDifference" -->Diferencë</String>
598 <String Id="UITextVolumeCostRequired" Overridable="yes"><!-- _locID_text="UITextVolumeCostRequired" _locComment="UITextVolumeCostRequired" -->E domosdoshme</String>
599 <String Id="UITextVolumeCostSize" Overridable="yes"><!-- _locID_text="UITextVolumeCostSize" _locComment="UITextVolumeCostSize" -->Madhësi Disku</String>
600 <String Id="UITextVolumeCostVolume" Overridable="yes"><!-- _locID_text="UITextVolumeCostVolume" _locComment="UITextVolumeCostVolume" -->Volum</String>
601</WixLocalization>
diff --git a/src/ext/UI/wixlib/WixUI_sr-Latn-CS.wxl b/src/ext/UI/wixlib/WixUI_sr-Latn-CS.wxl
new file mode 100644
index 00000000..f7b7fa52
--- /dev/null
+++ b/src/ext/UI/wixlib/WixUI_sr-Latn-CS.wxl
@@ -0,0 +1,598 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3
4
5<WixLocalization Culture="sr-latn-cs" Codepage="1250" xmlns="http://wixtoolset.org/schemas/v4/wxl">
6 <String Id="WixUIBack" Overridable="yes">&amp;Nazad</String>
7 <String Id="WixUINext" Overridable="yes">&amp;Dalje</String>
8 <String Id="WixUICancel" Overridable="yes">Otkaži</String>
9 <String Id="WixUIFinish" Overridable="yes">&amp;Završi</String>
10 <String Id="WixUIRetry" Overridable="yes">&amp;Pokušaj opet</String>
11 <String Id="WixUIIgnore" Overridable="yes">Zanemar&amp;i</String>
12 <String Id="WixUIYes" Overridable="yes">&amp;Da</String>
13 <String Id="WixUINo" Overridable="yes">&amp;Ne</String>
14 <String Id="WixUIOK" Overridable="yes">U redu</String>
15 <String Id="WixUIPrint" Overridable="yes">Odštam&amp;paj</String>
16
17 <String Id="AdvancedWelcomeEulaDlg_Title" Overridable="yes">Instalacija programa [ProductName]</String>
18 <String Id="AdvancedWelcomeEulaDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
19 <String Id="AdvancedWelcomeEulaDlgTitle" Overridable="yes">{\WixUI_Font_Title}Pročitajte ugovor o licenciranju za [ProductName]</String>
20 <String Id="AdvancedWelcomeEulaDlgLicenseAcceptedCheckBox" Overridable="yes">Prihv&amp;atam uslove navedene u ugovoru o licenciranju</String>
21 <String Id="AdvancedWelcomeEulaDlgDescriptionPerMachine" Overridable="yes">Kliknite na dugme „Instaliraj“ da biste instalirali proizvod sa podrazumevanim opcijama za sve korisnike. Kliknite na dugme „Više opcija“ da biste promenili opcije instalacije.</String>
22 <String Id="AdvancedWelcomeEulaDlgDescriptionPerUser" Overridable="yes">Kliknite na dugme „Instaliraj“ da biste instalirali proizvod sa podrazumevanim opcijama samo za sebe. Kliknite na dugme „Više opcija“ da biste promenili opcije instalacije.</String>
23 <String Id="AdvancedWelcomeEulaDlgInstall" Overridable="yes">&amp;Instaliraj</String>
24 <String Id="AdvancedWelcomeEulaDlgAdvanced" Overridable="yes">V&amp;iše opcija</String>
25 <String Id="Advanced_Font_Normal_Size" Overridable="yes">8</String>
26 <String Id="Advanced_Font_Bigger_Size" Overridable="yes">12</String>
27 <String Id="Advanced_Font_Title_Size" Overridable="yes">9</String>
28 <String Id="Advanced_Font_Emphasized_Size" Overridable="yes">8</String>
29 <String Id="Advanced_Font_FaceName" Overridable="yes">Tahoma</String>
30
31 <String Id="BrowseDlg_Title" Overridable="yes">Instalacija programa [ProductName]</String>
32 <String Id="BrowseDlgComboLabel" Overridable="yes">&amp;Pogledaj u:</String>
33 <String Id="BrowseDlgWixUI_Bmp_Up" Overridable="yes">WixUI_Bmp_Up</String>
34 <String Id="BrowseDlgWixUI_Bmp_UpTooltip" Overridable="yes">Nagore za jedan nivo</String>
35 <String Id="BrowseDlgNewFolder" Overridable="yes">WixUI_Bmp_New</String>
36 <String Id="BrowseDlgNewFolderTooltip" Overridable="yes">Kreirajte novu fasciklu</String>
37 <String Id="BrowseDlgPathLabel" Overridable="yes">Ime &amp;fascikle:</String>
38 <String Id="BrowseDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
39 <String Id="BrowseDlgDescription" Overridable="yes">Potražite odredišnu fasciklu</String>
40 <String Id="BrowseDlgTitle" Overridable="yes">{\WixUI_Font_Title}Promena odredišne fascikle</String>
41
42 <String Id="CancelDlg_Title" Overridable="yes">Instalacija programa [ProductName]</String>
43 <String Id="CancelDlgText" Overridable="yes">Želite li zaista da otkažete instalaciju proizvoda [ProductName]?</String>
44 <String Id="CancelDlgIcon" Overridable="yes">WixUI_Ico_Info</String>
45 <String Id="CancelDlgIconTooltip" Overridable="yes">Ikona informacija</String>
46
47 <String Id="CustomizeDlg_Title" Overridable="yes">Instalacija programa [ProductName]</String>
48 <String Id="CustomizeDlgTree" Overridable="yes">Stablo izbora</String>
49 <String Id="CustomizeDlgBrowse" Overridable="yes">P&amp;otraži…</String>
50 <String Id="CustomizeDlgReset" Overridable="yes">U&amp;spostavi početne vrednosti</String>
51 <String Id="CustomizeDlgDiskCost" Overridable="yes">&amp;Upotreba diska</String>
52 <String Id="CustomizeDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
53 <String Id="CustomizeDlgText" Overridable="yes">Kliknite na ikone u okviru stabla ispod da biste promenili način na koji će funkcije biti instalirane.</String>
54 <String Id="CustomizeDlgDescription" Overridable="yes">Izaberite način na koji želite da instalirate funkcije.</String>
55 <String Id="CustomizeDlgTitle" Overridable="yes">{\WixUI_Font_Title}Prilagođena instalacija</String>
56 <String Id="CustomizeDlgItemDescription" Overridable="yes">CustomizeDlgItemDescription-CustomizeDlgItemDescription</String>
57 <String Id="CustomizeDlgItemSize" Overridable="yes">CustomizeDlgItemSize-CustomizeDlgItemSize</String>
58 <String Id="CustomizeDlgLocation" Overridable="yes">CustomizeDlgLocation-CustomizeDlgLocation</String>
59 <String Id="CustomizeDlgLocationLabel" Overridable="yes">Lokacija:</String>
60
61 <String Id="DiskCostDlg_Title" Overridable="yes">Instalacija programa [ProductName]</String>
62 <String Id="DiskCostDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
63 <String Id="DiskCostDlgText" Overridable="yes">Na markiranim volumenima nema dovoljno dostupnog prostora za izabrane funkcije. Možete ukloniti neke datoteke iz markiranih volumena, instalirati manje funkcija ili izabrati druge odredišne disk jedinice.</String>
64 <String Id="DiskCostDlgDescription" Overridable="yes">Prostor na disku koji je potreban za instalaciju izabranih funkcija.</String>
65 <String Id="DiskCostDlgTitle" Overridable="yes">{\WixUI_Font_Title}Zahtevi za prostor na disku</String>
66 <String Id="DiskCostDlgVolumeList" Overridable="yes">{120}{70}{70}{70}{70}</String>
67
68 <String Id="ErrorDlg_Title" Overridable="yes">Instalacija programa [ProductName]</String>
69 <String Id="ErrorDlgErrorText" Overridable="yes">Tekst informacija</String>
70 <String Id="ErrorDlgErrorIcon" Overridable="yes">WixUI_Ico_Info</String>
71 <String Id="ErrorDlgErrorIconTooltip" Overridable="yes">Ikona informacija</String>
72
73 <String Id="ExitDialog_Title" Overridable="yes">Instalacija programa [ProductName]</String>
74 <String Id="ExitDialogBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
75 <String Id="ExitDialogDescription" Overridable="yes">Kliknite na dugme „Završi“ da biste izašli iz čarobnjaka za instalaciju.</String>
76 <String Id="ExitDialogTitle" Overridable="yes">{\WixUI_Font_Bigger}Dovršen je čarobnjak za instalaciju proizvoda [ProductName]</String>
77
78 <String Id="FatalError_Title" Overridable="yes">Instalacija programa [ProductName]</String>
79 <String Id="FatalErrorBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
80 <String Id="FatalErrorTitle" Overridable="yes">{\WixUI_Font_Bigger}Čarobnjak za instalaciju proizvoda [ProductName] je pre vremena završio sa radom</String>
81 <String Id="FatalErrorDescription1" Overridable="yes">Čarobnjak za instalaciju proizvoda [ProductName] je pre vremena završio sa radom zbog greške. Sistem nije izmenjen. Da biste kasnije instalirali ovaj program, ponovo pokrenite čarobnjak za instalaciju.</String>
82 <String Id="FatalErrorDescription2" Overridable="yes">Kliknite na dugme „Završi“ da biste izašli iz čarobnjaka za instalaciju.</String>
83
84 <String Id="FeaturesDlg_Title" Overridable="yes">Instalacija programa [ProductName]</String>
85 <String Id="FeaturesDlgTree" Overridable="yes">Funkcije proizvoda</String>
86 <String Id="FeaturesDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
87 <String Id="FeaturesDlgDescription" Overridable="yes">Izaberite način na koji želite da instalirate funkcije.</String>
88 <String Id="FeaturesDlgTitle" Overridable="yes">{\WixUI_Font_Title}Funkcije proizvoda</String>
89 <String Id="FeaturesDlgItemDescription" Overridable="yes">FeaturesDlgItemDescription</String>
90 <String Id="FeaturesDlgItemSize" Overridable="yes">FeaturesDlgItemSize</String>
91 <String Id="FeaturesDlgInstall" Overridable="yes">&amp;Instaliraj</String>
92 <String Id="FeaturesDlgChange" Overridable="yes">&amp;Promeni</String>
93
94 <String Id="FilesInUse_Title" Overridable="yes">Instalacija programa [ProductName]</String>
95 <String Id="FilesInUseExit" Overridable="yes">I&amp;zađi</String>
96 <String Id="FilesInUseBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
97 <String Id="FilesInUseText" Overridable="yes">Sledeće aplikacije koriste datoteke koje ova instalacija treba da ažurira. Zatvorite ove aplikacije, a zatim kliknite na dugme „&amp;Pokušaj opet“ da biste nastavili sa instalacijom ili na dugme „Izađi“ da biste izašli iz nje.</String>
98 <String Id="FilesInUseDescription" Overridable="yes">Neke datoteke koje treba ažurirati trenutno se koriste.</String>
99 <String Id="FilesInUseTitle" Overridable="yes">{\WixUI_Font_Title}Datoteke u upotrebi</String>
100
101 <String Id="InstallDirDlg_Title" Overridable="yes">Instalacija programa [ProductName]</String>
102 <String Id="InstallDirDlgChange" Overridable="yes">&amp;Promeni...</String>
103 <String Id="InstallDirDlgTitle" Overridable="yes">{\WixUI_Font_Title}Odredišna fascikla</String>
104 <String Id="InstallDirDlgDescription" Overridable="yes">Kliknite na dugme „Dalje“ da biste instalaciju izvršili u podrazumevanoj fascikli ili na dugme „Promeni“ da biste odabrali drugu fasciklu.</String>
105 <String Id="InstallDirDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
106 <String Id="InstallDirDlgFolderLabel" Overridable="yes">Instaliraj [ProductName] u:</String>
107
108 <String Id="InstallScopeDlg_Title" Overridable="yes">Instalacija programa [ProductName]</String>
109 <String Id="InstallScopeDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
110 <String Id="InstallScopeDlgDescription" Overridable="yes">Odaberite opseg instalacije i instalacionu fasciklu</String>
111 <String Id="InstallScopeDlgTitle" Overridable="yes">{\WixUI_Font_Title}Opseg instalacije</String>
112 <String Id="InstallScopeDlgPerUser" Overridable="yes">{\WixUI_Font_Emphasized}Instalirajte &amp;samo za sebe ([LogonUser])</String>
113 <String Id="InstallScopeDlgPerUserDescription" Overridable="yes">[ProductName] će biti instaliran u fascikli po korisniku i biće dostupan samo za vaš korisnički nalog. Nisu vam potrebne lokalne administratorske privilegije.</String>
114 <String Id="InstallScopeDlgNoPerUserDescription" Overridable="yes">[ProductName] ne podržava instalaciju po korisniku.</String>
115 <String Id="InstallScopeDlgPerMachine" Overridable="yes">{\WixUI_Font_Emphasized}Instalirajte za sve korisnike ovog &amp;računara</String>
116 <String Id="InstallScopeDlgPerMachineDescription" Overridable="yes">[ProductName] će podrazumevano biti instaliran u fascikli po računaru i biće dostupan svim korisnicima. Možete promeniti podrazumevanu instalacionu fasciklu. Morate imati lokalne administratorske privilegije.</String>
117 <String Id="InstallScopeDlgFolderLabel" Overridable="yes">Instalaciona &amp;fascikla:</String>
118 <String Id="InstallScopeDlgChange" Overridable="yes">&amp;Promeni...</String>
119
120 <String Id="InvalidDirDlg_Title" Overridable="yes">Instalacija programa [ProductName]</String>
121 <String Id="InvalidDirDlgText" Overridable="yes">Instalacioni direktorijum mora da se nalazi na lokalnom čvrstom disku.</String>
122 <String Id="InvalidDirDlgIcon" Overridable="yes">WixUI_Ico_Info</String>
123 <String Id="InvalidDirDlgIconTooltip" Overridable="yes">Ikona informacija</String>
124
125 <String Id="LicenseAgreementDlg_Title" Overridable="yes">Instalacija programa [ProductName]</String>
126 <String Id="LicenseAgreementDlgLicenseAcceptedCheckBox" Overridable="yes">Prihv&amp;atam uslove navedene u ugovoru o licenciranju</String>
127 <String Id="LicenseAgreementDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
128 <String Id="LicenseAgreementDlgDescription" Overridable="yes">Pažljivo pročitajte sledeći ugovor o licenciranju</String>
129 <String Id="LicenseAgreementDlgTitle" Overridable="yes">{\WixUI_Font_Title}Ugovor o licenciranju sa krajnjim korisnikom</String>
130
131 <String Id="MaintenanceTypeDlg_Title" Overridable="yes">Instalacija programa [ProductName]</String>
132 <String Id="MaintenanceTypeDlgChangeButton" Overridable="yes">&amp;Promeni</String>
133 <String Id="MaintenanceTypeDlgChangeButtonTooltip" Overridable="yes">Promenite instalaciju</String>
134 <String Id="MaintenanceTypeDlgRepairButton" Overridable="yes">Po&amp;pravi</String>
135 <String Id="MaintenanceTypeDlgRepairButtonTooltip" Overridable="yes">Popravite instalaciju</String>
136 <String Id="MaintenanceTypeDlgRemoveButton" Overridable="yes">&amp;Ukloni</String>
137 <String Id="MaintenanceTypeDlgRemoveButtonTooltip" Overridable="yes">Uklonite instalaciju</String>
138 <String Id="MaintenanceTypeDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
139 <String Id="MaintenanceTypeDlgDescription" Overridable="yes">Izaberite operaciju koju želite da izvršite.</String>
140 <String Id="MaintenanceTypeDlgTitle" Overridable="yes">{\WixUI_Font_Title}Promena, popravka ili uklanjanje instalacije</String>
141 <String Id="MaintenanceTypeDlgChangeText" Overridable="yes">Omogućava vam da promenite način instalacije funkcija.</String>
142 <String Id="MaintenanceTypeDlgChangeDisabledText" Overridable="yes">[ProductName] ne sadrži funkcije koje je moguće nezavisno izabrati.</String>
143 <String Id="MaintenanceTypeDlgRemoveText" Overridable="yes">Uklanja [ProductName] sa računara.</String>
144 <String Id="MaintenanceTypeDlgRemoveDisabledText" Overridable="yes">[ProductName] nije moguće ukloniti.</String>
145 <String Id="MaintenanceTypeDlgRepairText" Overridable="yes">Popravlja greške u najnovijoj instalaciji tako što popravlja datoteke, prečice i stavke registratora koje nedostaju i koje su oštećene.</String>
146 <String Id="MaintenanceTypeDlgRepairDisabledText" Overridable="yes">[ProductName] nije moguće popraviti.</String>
147
148 <String Id="MaintenanceWelcomeDlg_Title" Overridable="yes">Instalacija programa [ProductName]</String>
149 <String Id="MaintenanceWelcomeDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
150 <String Id="MaintenanceWelcomeDlgDescription" Overridable="yes">Čarobnjak za instalaciju vam omogućava da promenite način na koji će funkcije proizvoda [ProductName] biti instalirane na računar ili da ih uklonite sa računara. Kliknite na dugme „Dalje“ da biste nastavili ili na dugme „Otkaži“ da biste izašli iz čarobnjaka za instalaciju.</String>
151 <String Id="MaintenanceWelcomeDlgTitle" Overridable="yes">{\WixUI_Font_Bigger}Dobro došli u čarobnjak za instalaciju proizvoda [ProductName]</String>
152
153 <String Id="MsiRMFilesInUse_Title" Overridable="yes">Instalacija programa [ProductName]</String>
154 <String Id="MsiRMFilesInUseBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
155 <String Id="MsiRMFilesInUseText" Overridable="yes">Sledeće aplikacije koriste datoteke koje ova instalacija treba da ažurira. Možete dozvoliti čarobnjaku za instalaciju da ih zatvori i pokuša ponovo da ih pokrene ili kasnije ponovo pokrenuti računar.</String>
156 <String Id="MsiRMFilesInUseDescription" Overridable="yes">Neke datoteke koje treba ažurirati trenutno se koriste.</String>
157 <String Id="MsiRMFilesInUseTitle" Overridable="yes">{\WixUI_Font_Title}Datoteke u upotrebi</String>
158 <String Id="MsiRMFilesInUseUseRM" Overridable="yes">&amp;Zatvori aplikacije i pokušaj ponovo da ih pokreneš.</String>
159 <String Id="MsiRMFilesInUseDontUseRM" Overridable="yes">&amp;Ne zatvaraj aplikacije. Biće potrebno ponovno pokretanje sistema.</String>
160
161 <String Id="OutOfDiskDlg_Title" Overridable="yes">Instalacija programa [ProductName]</String>
162 <String Id="OutOfDiskDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
163 <String Id="OutOfDiskDlgText" Overridable="yes">Na markiranim volumenima nema dovoljno dostupnog prostora za trenutno izabrane funkcije. Možete ukloniti neke datoteke iz markiranih volumena, instalirati manje funkcija ili izabrati drugu odredišnu disk jedinicu.</String>
164 <String Id="OutOfDiskDlgDescription" Overridable="yes">Prostor na disku potreban za instalaciju premašuje dostupni prostor na disku.</String>
165 <String Id="OutOfDiskDlgTitle" Overridable="yes">{\WixUI_Font_Title}Nema prostora na disku</String>
166 <String Id="OutOfDiskDlgVolumeList" Overridable="yes">{120}{70}{70}{70}{70}</String>
167
168 <String Id="OutOfRbDiskDlg_Title" Overridable="yes">Instalacija programa [ProductName]</String>
169 <String Id="OutOfRbDiskDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
170 <String Id="OutOfRbDiskDlgText" Overridable="yes">Na markiranim volumenima nema dovoljno dostupnog prostora za trenutno izabrane funkcije. Možete ukloniti neke datoteke iz markiranih volumena, instalirati manje funkcija ili izabrati drugu odredišnu disk jedinicu.</String>
171 <String Id="OutOfRbDiskDlgDescription" Overridable="yes">Prostor na disku potreban za instalaciju premašuje dostupni prostor na disku.</String>
172 <String Id="OutOfRbDiskDlgTitle" Overridable="yes">{\WixUI_Font_Title}Nema prostora na disku</String>
173 <String Id="OutOfRbDiskDlgVolumeList" Overridable="yes">{120}{70}{70}{70}{70}</String>
174 <String Id="OutOfRbDiskDlgText2" Overridable="yes">Druga mogućnost je da odaberete da onemogućite funkcionalnost vraćanja instalacionog programa. Ako onemogućite vraćanje, sprečićete da instalacioni program vrati prvobitno stanje računara ukoliko instalacija bude prekinuta na bilo koji način. Kliknite na dugme „Da“ ako želite da preuzmete rizik onemogućavanja vraćanja.</String>
175
176 <String Id="PrepareDlg_Title" Overridable="yes">Instalacija programa [ProductName]</String>
177 <String Id="PrepareDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
178 <String Id="PrepareDlgDescription" Overridable="yes">Sačekajte dok se čarobnjak za instalaciju pripremi da vas vodi kroz instalaciju.</String>
179 <String Id="PrepareDlgTitle" Overridable="yes">{\WixUI_Font_Bigger}Dobro došli u čarobnjak za instalaciju proizvoda [ProductName]</String>
180
181 <String Id="ProgressDlg_Title" Overridable="yes">Instalacija programa [ProductName]</String>
182 <String Id="ProgressDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
183 <String Id="ProgressDlgTextInstalling" Overridable="yes">Sačekajte dok čarobnjak za instalaciju instalira [ProductName].</String>
184 <String Id="ProgressDlgTitleInstalling" Overridable="yes">{\WixUI_Font_Title}Instalacija proizvoda [ProductName]</String>
185 <String Id="ProgressDlgTextChanging" Overridable="yes">Sačekajte dok čarobnjak za instalaciju promeni [ProductName].</String>
186 <String Id="ProgressDlgTitleChanging" Overridable="yes">{\WixUI_Font_Title}Promena proizvoda [ProductName]</String>
187 <String Id="ProgressDlgTextRepairing" Overridable="yes">Sačekajte dok čarobnjak za instalaciju popravi [ProductName].</String>
188 <String Id="ProgressDlgTitleRepairing" Overridable="yes">{\WixUI_Font_Title}Popravka proizvoda [ProductName]</String>
189 <String Id="ProgressDlgTextRemoving" Overridable="yes">Sačekajte dok čarobnjak za instalaciju ukloni [ProductName].</String>
190 <String Id="ProgressDlgTitleRemoving" Overridable="yes">{\WixUI_Font_Title}Uklanjanje proizvoda [ProductName]</String>
191 <String Id="ProgressDlgTextUpdating" Overridable="yes">Sačekajte dok čarobnjak za instalaciju ažurira [ProductName].</String>
192 <String Id="ProgressDlgTitleUpdating" Overridable="yes">{\WixUI_Font_Title}Ažuriranje proizvoda [ProductName]</String>
193 <String Id="ProgressDlgProgressBar" Overridable="yes">Tok je završen</String>
194 <String Id="ProgressDlgStatusLabel" Overridable="yes">Status:</String>
195
196 <String Id="ResumeDlg_Title" Overridable="yes">Instalacija programa [ProductName]</String>
197 <String Id="ResumeDlgInstall" Overridable="yes">&amp;Instaliraj</String>
198 <String Id="ResumeDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
199 <String Id="ResumeDlgDescription" Overridable="yes">Čarobnjak za instalaciju će dovršiti instalaciju proizvoda [ProductName] na računaru. Kliknite na dugme „Instaliraj“ da biste nastavili ili na dugme „Otkaži“ da biste izašli iz čarobnjaka za instalaciju.</String>
200 <String Id="ResumeDlgTitle" Overridable="yes">{\WixUI_Font_Bigger}Nastavak rada čarobnjaka za instalaciju proizvoda [ProductName]</String>
201
202 <String Id="SetupTypeDlg_Title" Overridable="yes">Instalacija programa [ProductName]</String>
203 <String Id="SetupTypeDlgTypicalButton" Overridable="yes">&amp;Tipična</String>
204 <String Id="SetupTypeDlgTypicalButtonTooltip" Overridable="yes">Tipična instalacija</String>
205 <String Id="SetupTypeDlgCustomButton" Overridable="yes">P&amp;rilagođena</String>
206 <String Id="SetupTypeDlgCustomButtonTooltip" Overridable="yes">Prilagođena instalacija</String>
207 <String Id="SetupTypeDlgCompleteButton" Overridable="yes">P&amp;otpuna</String>
208 <String Id="SetupTypeDlgCompleteButtonTooltip" Overridable="yes">Potpuna instalacija</String>
209 <String Id="SetupTypeDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
210 <String Id="SetupTypeDlgTitle" Overridable="yes">{\WixUI_Font_Title}Izbor tipa instalacije</String>
211 <String Id="SetupTypeDlgDescription" Overridable="yes">Odaberite tip instalacije koji najviše odgovara vašim potrebama</String>
212 <String Id="SetupTypeDlgTypicalText" Overridable="yes">Instalirajte funkcije programa koje se najčešće koriste. Preporučuje se za većinu korisnika.</String>
213 <String Id="SetupTypeDlgCustomText" Overridable="yes">Omogućava korisnicima da odaberu koje će funkcije programa biti instalirane i gde će biti instalirane. Preporučuje se za napredne korisnike.</String>
214 <String Id="SetupTypeDlgCompleteText" Overridable="yes">Biće instalirane sve funkcije programa. Zahteva najviše prostora na disku.</String>
215
216 <String Id="UserExit_Title" Overridable="yes">Instalacija programa [ProductName]</String>
217 <String Id="UserExitBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
218 <String Id="UserExitTitle" Overridable="yes">{\WixUI_Font_Bigger}Čarobnjak za instalaciju proizvoda [ProductName] je prekinut</String>
219 <String Id="UserExitDescription1" Overridable="yes">Instalacija proizvoda [ProductName] je prekinuta. Sistem nije izmenjen. Da biste ovaj program instalirali kasnije, ponovo pokrenite instalaciju.</String>
220 <String Id="UserExitDescription2" Overridable="yes">Kliknite na dugme „Završi“ da biste izašli iz čarobnjaka za instalaciju.</String>
221
222 <String Id="VerifyReadyDlg_Title" Overridable="yes">Instalacija programa [ProductName]</String>
223 <String Id="VerifyReadyDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
224 <String Id="VerifyReadyDlgInstall" Overridable="yes">&amp;Instaliraj</String>
225 <String Id="VerifyReadyDlgInstallText" Overridable="yes">Kliknite na dugme „Instaliraj“ da biste započeli instalaciju. Kliknite na dugme „Nazad“ da biste pregledali ili promenili bilo koju postavku instalacije. Kliknite na dugme „Otkaži“ da biste izašli iz čarobnjaka.</String>
226 <String Id="VerifyReadyDlgInstallTitle" Overridable="yes">{\WixUI_Font_Title}Spremno za instalaciju proizvoda [ProductName]</String>
227 <String Id="VerifyReadyDlgChange" Overridable="yes">&amp;Promeni</String>
228 <String Id="VerifyReadyDlgChangeText" Overridable="yes">Kliknite na dugme „Promeni“ da biste započeli instalaciju. Kliknite na dugme „Nazad“ da biste pregledali ili promenili bilo koju postavku instalacije. Kliknite na dugme „Otkaži“ da biste izašli iz čarobnjaka.</String>
229 <String Id="VerifyReadyDlgChangeTitle" Overridable="yes">{\WixUI_Font_Title}Spremno za promenu proizvoda [ProductName]</String>
230 <String Id="VerifyReadyDlgRepair" Overridable="yes">Po&amp;pravi</String>
231 <String Id="VerifyReadyDlgRepairText" Overridable="yes">Kliknite na dugme „Popravi“ da biste popravili instalaciju proizvoda [ProductName]. Kliknite na dugme „Nazad“ da biste pregledali ili promenili bilo koju postavku instalacije. Kliknite na dugme „Otkaži“ da biste izašli iz čarobnjaka.</String>
232 <String Id="VerifyReadyDlgRepairTitle" Overridable="yes">{\WixUI_Font_Title}Spremno za popravku proizvoda [ProductName]</String>
233 <String Id="VerifyReadyDlgRemove" Overridable="yes">&amp;Ukloni</String>
234 <String Id="VerifyReadyDlgRemoveText" Overridable="yes">Kliknite na dugme „Ukloni“ da biste uklonili [ProductName] sa računara. Kliknite na dugme „Nazad“ da biste pregledali ili promenili bilo koju postavku instalacije. Kliknite na dugme „Otkaži“ da biste izašli iz čarobnjaka.</String>
235 <String Id="VerifyReadyDlgRemoveTitle" Overridable="yes">{\WixUI_Font_Title}Spremno za uklanjanje proizvoda [ProductName]</String>
236 <String Id="VerifyReadyDlgUpdate" Overridable="yes">Až&amp;uriraj</String>
237 <String Id="VerifyReadyDlgUpdateText" Overridable="yes">Kliknite na dugme „Ažuriraj“ da biste ažurirali [ProductName] na računaru. Kliknite na dugme „Nazad“ da biste pregledali ili promenili bilo koju postavku instalacije. Kliknite na dugme „Otkaži“ da biste izašli iz čarobnjaka.</String>
238 <String Id="VerifyReadyDlgUpdateTitle" Overridable="yes">{\WixUI_Font_Title}Spremno za ažuriranje proizvoda [ProductName]</String>
239
240 <String Id="WaitForCostingDlg_Title" Overridable="yes">Instalacija programa [ProductName]</String>
241 <String Id="WaitForCostingDlgReturn" Overridable="yes">V&amp;rati</String>
242 <String Id="WaitForCostingDlgText" Overridable="yes">Sačekajte da instalacioni program odredi potreban prostor na disku.</String>
243 <String Id="WaitForCostingDlgIcon" Overridable="yes">WixUI_Ico_Exclam</String>
244 <String Id="WaitForCostingDlgIconTooltip" Overridable="yes">Ikona sa znakom uzvika</String>
245
246 <String Id="WelcomeDlg_Title" Overridable="yes">Instalacija programa [ProductName]</String>
247 <String Id="WelcomeDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
248 <String Id="WelcomeDlgDescription" Overridable="yes">Čarobnjak za instalaciju će instalirati [ProductName] na računar. Kliknite na dugme „Dalje“ da biste nastavili ili na dugme „Otkaži“ da biste izašli iz čarobnjaka za instalaciju.</String>
249 <String Id="WelcomeUpdateDlgDescriptionUpdate" Overridable="yes">Čarobnjak za instalaciju će ažurirati [ProductName] na računaru. Kliknite na dugme „Dalje“ da biste nastavili ili na dugme „Otkaži“ da biste izašli iz čarobnjaka za instalaciju.</String>
250 <String Id="WelcomeDlgTitle" Overridable="yes">{\WixUI_Font_Bigger}Dobro došli u čarobnjak za instalaciju proizvoda [ProductName]</String>
251
252 <String Id="WelcomeEulaDlg_Title" Overridable="yes">Instalacija programa [ProductName]</String>
253 <String Id="WelcomeEulaDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
254 <String Id="WelcomeEulaDlgLicenseAcceptedCheckBox" Overridable="yes">Prihv&amp;atam uslove navedene u ugovoru o licenciranju</String>
255 <String Id="WelcomeEulaDlgInstall" Overridable="yes">&amp;Instaliraj</String>
256 <String Id="WelcomeEulaDlgUpdate" Overridable="yes">Až&amp;uriraj</String>
257 <String Id="WelcomeEulaDlgTitle" Overridable="yes">{\WixUI_Font_Title}Pročitajte ugovor o licenciranju za [ProductName]</String>
258
259 <String Id="ProgressTextInstallValidate" Overridable="yes">Provera valjanosti instalacije</String>
260 <String Id="ProgressTextInstallFiles" Overridable="yes">Kopiranje novih datoteka</String>
261 <String Id="ProgressTextInstallFilesTemplate" Overridable="yes">Datoteka: [1], direktorijum: [9], veličina: [6]</String>
262 <String Id="ProgressTextInstallAdminPackage" Overridable="yes">Kopiranje datoteka za mrežnu instalaciju</String>
263 <String Id="ProgressTextInstallAdminPackageTemplate" Overridable="yes">Datoteka: [1], direktorijum: [9], veličina: [6]</String>
264 <String Id="ProgressTextFileCost" Overridable="yes">Izračunavanje potrebnog prostora</String>
265 <String Id="ProgressTextCostInitialize" Overridable="yes">Izračunavanje potrebnog prostora</String>
266 <String Id="ProgressTextCostFinalize" Overridable="yes">Izračunavanje potrebnog prostora</String>
267 <String Id="ProgressTextCreateShortcuts" Overridable="yes">Kreiranje prečica</String>
268 <String Id="ProgressTextCreateShortcutsTemplate" Overridable="yes">Prečica: [1]</String>
269 <String Id="ProgressTextPublishComponents" Overridable="yes">Objavljivanje kvalifikovanih komponenti</String>
270 <String Id="ProgressTextPublishComponentsTemplate" Overridable="yes">ID komponente: [1], kvalifikator: [2]</String>
271 <String Id="ProgressTextPublishFeatures" Overridable="yes">Objavljivanje informacija o funkcijama proizvoda</String>
272 <String Id="ProgressTextPublishFeaturesTemplate" Overridable="yes">Funkcija: [1]</String>
273 <String Id="ProgressTextPublishProduct" Overridable="yes">Objavljivanje informacija o proizvodu</String>
274 <String Id="ProgressTextRegisterClassInfo" Overridable="yes">Registracija servera klase</String>
275 <String Id="ProgressTextRegisterClassInfoTemplate" Overridable="yes">Id klase: [1]</String>
276 <String Id="ProgressTextRegisterExtensionInfo" Overridable="yes">Registracija servera proširenja</String>
277 <String Id="ProgressTextRegisterExtensionInfoTemplate" Overridable="yes">Proširenje: [1]</String>
278 <String Id="ProgressTextRegisterMIMEInfo" Overridable="yes">Registracija MIME informacija</String>
279 <String Id="ProgressTextRegisterMIMEInfoTemplate" Overridable="yes">MIME tip sadržaja: [1], proširenje: [2]</String>
280 <String Id="ProgressTextRegisterProgIdInfo" Overridable="yes">Registracija identifikatora programa</String>
281 <String Id="ProgressTextRegisterProgIdInfoTemplate" Overridable="yes">ProgId: [1]</String>
282 <String Id="ProgressTextAllocateRegistrySpace" Overridable="yes">Dodeljivanje prostora u registratoru</String>
283 <String Id="ProgressTextAllocateRegistrySpaceTemplate" Overridable="yes">Slobodan prostor: [1]</String>
284 <String Id="ProgressTextAppSearch" Overridable="yes">Traženje instaliranih aplikacija</String>
285 <String Id="ProgressTextAppSearchTemplate" Overridable="yes">Svojstvo: [1], potpis: [2]</String>
286 <String Id="ProgressTextBindImage" Overridable="yes">Povezivanje izvršnih datoteka</String>
287 <String Id="ProgressTextBindImageTemplate" Overridable="yes">Datoteka: [1]</String>
288 <String Id="ProgressTextCCPSearch" Overridable="yes">Traženje kvalifikovanih proizvoda</String>
289 <String Id="ProgressTextCreateFolders" Overridable="yes">Kreiranje fascikli</String>
290 <String Id="ProgressTextCreateFoldersTemplate" Overridable="yes">Fascikla: [1]</String>
291 <String Id="ProgressTextDeleteServices" Overridable="yes">Brisanje usluga</String>
292 <String Id="ProgressTextDeleteServicesTemplate" Overridable="yes">Usluga: [1]</String>
293 <String Id="ProgressTextDuplicateFiles" Overridable="yes">Kreiranje dupliranih datoteka</String>
294 <String Id="ProgressTextDuplicateFilesTemplate" Overridable="yes">Datoteka: [1], direktorijum: [9], veličina: [6]</String>
295 <String Id="ProgressTextFindRelatedProducts" Overridable="yes">Traženje povezanih aplikacija</String>
296 <String Id="ProgressTextFindRelatedProductsTemplate" Overridable="yes">Pronađena aplikacija: [1]</String>
297 <String Id="ProgressTextInstallODBC" Overridable="yes">Instaliranje ODBC komponenti</String>
298 <String Id="ProgressTextInstallServices" Overridable="yes">Instaliranje novih usluga</String>
299 <String Id="ProgressTextInstallServicesTemplate" Overridable="yes">Usluga: [2]</String>
300 <String Id="ProgressTextLaunchConditions" Overridable="yes">Procenjivanje uslova za pokretanje</String>
301 <String Id="ProgressTextMigrateFeatureStates" Overridable="yes">Premeštanje stanja funkcija iz povezanih aplikacija</String>
302 <String Id="ProgressTextMigrateFeatureStatesTemplate" Overridable="yes">Aplikacija: [1]</String>
303 <String Id="ProgressTextMoveFiles" Overridable="yes">Premeštanje datoteka</String>
304 <String Id="ProgressTextMoveFilesTemplate" Overridable="yes">Datoteka: [1], direktorijum: [9], veličina: [6]</String>
305 <String Id="ProgressTextPatchFiles" Overridable="yes">Krpljenje datoteka</String>
306 <String Id="ProgressTextPatchFilesTemplate" Overridable="yes">Datoteka: [1], direktorijum: [2], veličina: [3]</String>
307 <String Id="ProgressTextProcessComponents" Overridable="yes">Ažuriranje registracije komponenti</String>
308 <String Id="ProgressTextRegisterComPlus" Overridable="yes">Registracija COM+ aplikacija i komponenti</String>
309 <String Id="ProgressTextRegisterComPlusTemplate" Overridable="yes">AppId: [1]{{, AppType: [2], korisnici: [3], RSN: [4]}}</String>
310 <String Id="ProgressTextRegisterFonts" Overridable="yes">Registracija fontova</String>
311 <String Id="ProgressTextRegisterFontsTemplate" Overridable="yes">Font: [1]</String>
312 <String Id="ProgressTextRegisterProduct" Overridable="yes">Registracija proizvoda</String>
313 <String Id="ProgressTextRegisterProductTemplate" Overridable="yes">[1]</String>
314 <String Id="ProgressTextRegisterTypeLibraries" Overridable="yes">Registracija biblioteka tipova</String>
315 <String Id="ProgressTextRegisterTypeLibrariesTemplate" Overridable="yes">LibID: [1]</String>
316 <String Id="ProgressTextRegisterUser" Overridable="yes">Registracija korisnika</String>
317 <String Id="ProgressTextRegisterUserTemplate" Overridable="yes">[1]</String>
318 <String Id="ProgressTextRemoveDuplicateFiles" Overridable="yes">Uklanjanje dupliranih datoteka</String>
319 <String Id="ProgressTextRemoveDuplicateFilesTemplate" Overridable="yes">Datoteka: [1], direktorijum: [9]</String>
320 <String Id="ProgressTextRemoveEnvironmentStrings" Overridable="yes">Ažuriranje niski okruženja</String>
321 <String Id="ProgressTextRemoveEnvironmentStringsTemplate" Overridable="yes">Ime: [1], vrednost: [2], radnja [3]</String>
322 <String Id="ProgressTextRemoveExistingProducts" Overridable="yes">Uklanjanje aplikacija</String>
323 <String Id="ProgressTextRemoveExistingProductsTemplate" Overridable="yes">Aplikacija: [1], komandna linija: [2]</String>
324 <String Id="ProgressTextRemoveFiles" Overridable="yes">Uklanjanje datoteka</String>
325 <String Id="ProgressTextRemoveFilesTemplate" Overridable="yes">Datoteka: [1], direktorijum: [9]</String>
326 <String Id="ProgressTextRemoveFolders" Overridable="yes">Uklanjanje fascikli</String>
327 <String Id="ProgressTextRemoveFoldersTemplate" Overridable="yes">Fascikla: [1]</String>
328 <String Id="ProgressTextRemoveIniValues" Overridable="yes">Uklanjanje stavki INI datoteka</String>
329 <String Id="ProgressTextRemoveIniValuesTemplate" Overridable="yes">Datoteka: [1], odeljak: [2], ključ: [3], vrednost: [4]</String>
330 <String Id="ProgressTextRemoveODBC" Overridable="yes">Uklanjanje ODBC komponenti</String>
331 <String Id="ProgressTextRemoveRegistryValues" Overridable="yes">Uklanjanje vrednosti sistemskog registratora</String>
332 <String Id="ProgressTextRemoveRegistryValuesTemplate" Overridable="yes">Ključ: [1], ime: [2]</String>
333 <String Id="ProgressTextRemoveShortcuts" Overridable="yes">Uklanjanje prečica</String>
334 <String Id="ProgressTextRemoveShortcutsTemplate" Overridable="yes">Prečica: [1]</String>
335 <String Id="ProgressTextRMCCPSearch" Overridable="yes">Traženje kvalifikovanih proizvoda</String>
336 <String Id="ProgressTextSelfRegModules" Overridable="yes">Registracija modula</String>
337 <String Id="ProgressTextSelfRegModulesTemplate" Overridable="yes">Datoteka: [1], fascikla: [2]</String>
338 <String Id="ProgressTextSelfUnregModules" Overridable="yes">Opoziv registracije modula</String>
339 <String Id="ProgressTextSelfUnregModulesTemplate" Overridable="yes">Datoteka: [1], fascikla: [2]</String>
340 <String Id="ProgressTextSetODBCFolders" Overridable="yes">Pokretanje ODBC direktorijuma</String>
341 <String Id="ProgressTextStartServices" Overridable="yes">Pokretanje usluga</String>
342 <String Id="ProgressTextStartServicesTemplate" Overridable="yes">Usluga: [1]</String>
343 <String Id="ProgressTextStopServices" Overridable="yes">Zaustavljanje usluga</String>
344 <String Id="ProgressTextStopServicesTemplate" Overridable="yes">Usluga: [1]</String>
345 <String Id="ProgressTextUnpublishComponents" Overridable="yes">Opoziv objavljivanja kvalifikovanih komponenti</String>
346 <String Id="ProgressTextUnpublishComponentsTemplate" Overridable="yes">ID komponente: [1], kvalifikator: [2]</String>
347 <String Id="ProgressTextUnpublishFeatures" Overridable="yes">Opoziv objavljivanja funkcija proizvoda</String>
348 <String Id="ProgressTextUnpublishFeaturesTemplate" Overridable="yes">Funkcija: [1]</String>
349 <String Id="ProgressTextUnregisterClassInfo" Overridable="yes">Opoziv registracije servera klase</String>
350 <String Id="ProgressTextUnregisterClassInfoTemplate" Overridable="yes">Id klase: [1]</String>
351 <String Id="ProgressTextUnregisterComPlus" Overridable="yes">Opoziv registracije COM+ aplikacija i komponenti</String>
352 <String Id="ProgressTextUnregisterComPlusTemplate" Overridable="yes">AppId: [1]{{, AppType: [2]}}</String>
353 <String Id="ProgressTextUnregisterExtensionInfo" Overridable="yes">Opoziv registracije servera proširenja</String>
354 <String Id="ProgressTextUnregisterExtensionInfoTemplate" Overridable="yes">Proširenje: [1]</String>
355 <String Id="ProgressTextUnregisterFonts" Overridable="yes">Opoziv registracije fontova</String>
356 <String Id="ProgressTextUnregisterFontsTemplate" Overridable="yes">Font: [1]</String>
357 <String Id="ProgressTextUnregisterMIMEInfo" Overridable="yes">Opoziv registracije MIME informacija</String>
358 <String Id="ProgressTextUnregisterMIMEInfoTemplate" Overridable="yes">MIME tip sadržaja: [1], proširenje: [2]</String>
359 <String Id="ProgressTextUnregisterProgIdInfo" Overridable="yes">Opoziv registracije identifikatora programa</String>
360 <String Id="ProgressTextUnregisterProgIdInfoTemplate" Overridable="yes">ProgId: [1]</String>
361 <String Id="ProgressTextUnregisterTypeLibraries" Overridable="yes">Opoziv registracije biblioteka tipova</String>
362 <String Id="ProgressTextUnregisterTypeLibrariesTemplate" Overridable="yes">LibID: [1]</String>
363 <String Id="ProgressTextWriteEnvironmentStrings" Overridable="yes">Ažuriranje niski okruženja</String>
364 <String Id="ProgressTextWriteEnvironmentStringsTemplate" Overridable="yes">Ime: [1], vrednost: [2], radnja [3]</String>
365 <String Id="ProgressTextWriteIniValues" Overridable="yes">Upisivanje vrednosti INI datoteka</String>
366 <String Id="ProgressTextWriteIniValuesTemplate" Overridable="yes">Datoteka: [1], odeljak: [2], ključ: [3], vrednost: [4]</String>
367 <String Id="ProgressTextWriteRegistryValues" Overridable="yes">Upisivanje vrednosti sistemskog registratora</String>
368 <String Id="ProgressTextWriteRegistryValuesTemplate" Overridable="yes">Ključ: [1], ime: [2], vrednost: [3]</String>
369 <String Id="ProgressTextAdvertise" Overridable="yes">Aplikacija za reklamiranje</String>
370 <String Id="ProgressTextGenerateScript" Overridable="yes">Generisanje operacija sa skriptom za radnju:</String>
371 <String Id="ProgressTextGenerateScriptTemplate" Overridable="yes">[1]</String>
372 <String Id="ProgressTextInstallSFPCatalogFile" Overridable="yes">Instaliranje sistemskog kataloga</String>
373 <String Id="ProgressTextInstallSFPCatalogFileTemplate" Overridable="yes">Datoteka: [1], zavisni elementi: [2]</String>
374 <String Id="ProgressTextMsiPublishAssemblies" Overridable="yes">Objavljivanje informacija o asembleru</String>
375 <String Id="ProgressTextMsiPublishAssembliesTemplate" Overridable="yes">Kontekst aplikacije: [1], ime asemblera: [2]</String>
376 <String Id="ProgressTextMsiUnpublishAssemblies" Overridable="yes">Opoziv objavljivanja informacija o asembleru</String>
377 <String Id="ProgressTextMsiUnpublishAssembliesTemplate" Overridable="yes">Kontekst aplikacije: [1], ime asemblera: [2]</String>
378 <String Id="ProgressTextRollback" Overridable="yes">Vraćanje radnje:</String>
379 <String Id="ProgressTextRollbackTemplate" Overridable="yes">[1]</String>
380 <String Id="ProgressTextRollbackCleanup" Overridable="yes">Uklanjanje rezervnih datoteka</String>
381 <String Id="ProgressTextRollbackCleanupTemplate" Overridable="yes">Datoteka: [1]</String>
382 <String Id="ProgressTextUnmoveFiles" Overridable="yes">Uklanjanje premeštenih datoteka</String>
383 <String Id="ProgressTextUnmoveFilesTemplate" Overridable="yes">Datoteka: [1], direktorijum: [9]</String>
384 <String Id="ProgressTextUnpublishProduct" Overridable="yes">Opoziv objavljenih informacija o proizvodu</String>
385
386 <String Id="Error0" Overridable="yes">{{Fatalna greška: }}</String>
387 <String Id="Error1" Overridable="yes">{{Greška [1]. }}</String>
388 <String Id="Error2" Overridable="yes">Upozorenje [1]. </String>
389 <String Id="Error4" Overridable="yes">Informacije [1]. </String>
390 <String Id="Error5" Overridable="yes">Instalacioni program je naišao na neočekivanu grešku prilikom instalacije ovog paketa. To možda ukazuje na problem sa ovim paketom. Kôd greške je [1]. {{Argumenti su: [2], [3], [4]}}</String>
391 <String Id="Error7" Overridable="yes">{{Disk je pun: }}</String>
392 <String Id="Error8" Overridable="yes">Radnja [Time]: [1]. [2]</String>
393 <String Id="Error9" Overridable="yes">[ProductName]</String>
394 <String Id="Error10" Overridable="yes">{[2]}{, [3]}{, [4]}</String>
395 <String Id="Error11" Overridable="yes">Tip poruke: [1], argument: [2]</String>
396 <String Id="Error12" Overridable="yes">=== Vođenje evidencije započeto: [Date] [Time] ===</String>
397 <String Id="Error13" Overridable="yes">=== Vođenje evidencije zaustavljeno: [Date] [Time] ===</String>
398 <String Id="Error14" Overridable="yes">Početak radnje [Time]: [1].</String>
399 <String Id="Error15" Overridable="yes">Kraj radnje [Time]: [1]. Povratna vrednost [2].</String>
400 <String Id="Error16" Overridable="yes">Preostalo vreme: {[1] minuta }{[2] sekundi}</String>
401 <String Id="Error17" Overridable="yes">Nema dovoljno memorije. Zatvorite ostale aplikacije pre nego što pokušate ponovo.</String>
402 <String Id="Error18" Overridable="yes">Instalacioni program se ne odaziva.</String>
403 <String Id="Error19" Overridable="yes">Instalacioni program je pre vremena zaustavljen.</String>
404 <String Id="Error20" Overridable="yes">Sačekajte dok Windows konfiguriše [ProductName]</String>
405 <String Id="Error21" Overridable="yes">Prikupljanje potrebnih informacija...</String>
406 <String Id="Error22" Overridable="yes">Uklanjanje starijih verzija ove aplikacije...</String>
407 <String Id="Error23" Overridable="yes">Priprema za uklanjanje starijih verzija ove aplikacije...</String>
408 <String Id="Error32" Overridable="yes">Uspešno je dovršena instalacija proizvoda {[ProductName] }.</String>
409 <String Id="Error33" Overridable="yes">Nije uspela instalacija proizvoda {[ProductName] }.</String>
410 <String Id="Error1101" Overridable="yes">Greška tokom čitanja iz datoteke: [2]. {{ Sistemska greška [3].}} Proverite da li datoteka postoji i da li joj možete pristupiti.</String>
411 <String Id="Error1301" Overridable="yes">Nije moguće kreirati datoteku „[2]“. Već postoji direktorijum sa tim imenom. Otkažite instalaciju i pokušajte da je izvršite na drugoj lokaciji.</String>
412 <String Id="Error1302" Overridable="yes">Stavite disk: [2]</String>
413 <String Id="Error1303" Overridable="yes">Instalacioni program nema dovoljno privilegija za pristup ovom direktorijumu: [2]. Nije moguće nastaviti instalaciju. Prijavite se kao administrator ili se obratite administratoru sistema.</String>
414 <String Id="Error1304" Overridable="yes">Greška tokom upisivanja u datoteku: [2]. Proverite da li imate pristup tom direktorijumu.</String>
415 <String Id="Error1305" Overridable="yes">Greška tokom čitanja iz datoteke [2]. {{ Sistemska greška [3].}} Proverite da li datoteka postoji i da li joj možete pristupiti.</String>
416 <String Id="Error1306" Overridable="yes">Druga aplikacija ima isključivi pristup datoteci „[2]“. Zatvorite sve ostale aplikacije, a zatim kliknite na dugme „Pokušaj opet“.</String>
417 <String Id="Error1307" Overridable="yes">Nema dovoljno prostora na disku za instaliranje ove datoteke: [2]. Oslobodite prostor na disku i kliknite na dugme „Pokušaj opet“ ili kliknite na dugme „Otkaži“ da biste izašli.</String>
418 <String Id="Error1308" Overridable="yes">Izvorna datoteka nije pronađena: [2]. Proverite da li datoteka postoji i da li joj možete pristupiti.</String>
419 <String Id="Error1309" Overridable="yes">Greška tokom čitanja iz datoteke: [3]. {{ Sistemska greška [2].}} Proverite da li datoteka postoji i da li joj možete pristupiti.</String>
420 <String Id="Error1310" Overridable="yes">Greška tokom upisivanja u datoteku: [3]. {{ Sistemska greška [2].}} Proverite da li imate pristup tom direktorijumu.</String>
421 <String Id="Error1311" Overridable="yes">Izvorna datoteka nije pronađena{{(datoteka pakovanja)}}: [2]. Proverite da li datoteka postoji i da li joj možete pristupiti.</String>
422 <String Id="Error1312" Overridable="yes">Nije moguće kreirati direktorijum „[2]“. Datoteka sa ovim imenom već postoji. Preimenujte ili uklonite datoteku i kliknite na dugme „Pokušaj opet“ ili na dugme „Otkaži“ da biste izašli.</String>
423 <String Id="Error1313" Overridable="yes">Volumen [2] trenutno nije dostupan. Izaberite drugi volumen.</String>
424 <String Id="Error1314" Overridable="yes">Navedena putanja „[2]“ nije dostupna.</String>
425 <String Id="Error1315" Overridable="yes">Nije moguće upisivati u navedenu fasciklu: [2].</String>
426 <String Id="Error1316" Overridable="yes">Došlo je do mrežne greške pri pokušaju čitanja iz datoteke: [2]</String>
427 <String Id="Error1317" Overridable="yes">Došlo je do greške pri pokušaju kreiranja direktorijuma: [2]</String>
428 <String Id="Error1318" Overridable="yes">Došlo je do mrežne greške pri pokušaju kreiranja direktorijuma: [2]</String>
429 <String Id="Error1319" Overridable="yes">Došlo je do mrežne greške pri pokušaju otvaranja pakovanja izvorne datoteke: [2]</String>
430 <String Id="Error1320" Overridable="yes">Navedena putanja je predugačka: [2]</String>
431 <String Id="Error1321" Overridable="yes">Instalacioni program nema dovoljno privilegija da bi izmenio ovu datoteku: [2].</String>
432 <String Id="Error1322" Overridable="yes">Deo putanje fascikle „[2]“ je nevažeći. On je prazan ili prekoračuje dužinu koju sistem dozvoljava.</String>
433 <String Id="Error1323" Overridable="yes">Putanja fascikle „[2]“ sadrži reči koje nisu važeće u putanji fascikle.</String>
434 <String Id="Error1324" Overridable="yes">Putanja fascikle „[2]“ sadrži nevažeći znak.</String>
435 <String Id="Error1325" Overridable="yes">„[2]“ nije važeće kratko ime datoteke.</String>
436 <String Id="Error1326" Overridable="yes">Greška tokom preuzimanja bezbednosti datoteke: [3] GetLastError: [2]</String>
437 <String Id="Error1327" Overridable="yes">Nevažeća disk jedinica: [2]</String>
438 <String Id="Error1328" Overridable="yes">Došlo je do greške tokom primenjivanja zakrpe na datoteku [2]. Datoteka je verovatno već ažurirana na neki drugi način i ne može se više menjati ovom zakrpom. Za više informacija obratite se prodavcu zakrpe. {{Sistemska greška: [3]}}</String>
439 <String Id="Error1329" Overridable="yes">Potrebna datoteka se ne može instalirati zato što datoteka pakovanja [2] nije digitalno potpisana. Ovo može da ukazuje na to da je datoteka pakovanja oštećena.</String>
440 <String Id="Error1330" Overridable="yes">Potrebna datoteka se ne može instalirati zato što datoteka pakovanja [2] ima nevažeći digitalni potpis. Ovo može da ukazuje na to da je datoteka pakovanja oštećena.{{ Grešku [3] je vratila funkcija WinVerifyTrust.}}</String>
441 <String Id="Error1331" Overridable="yes">Nije uspelo ispravno kopiranje datoteke [2]: CRC greška.</String>
442 <String Id="Error1332" Overridable="yes">Nije uspelo ispravno premeštanje datoteke [2]: CRC greška.</String>
443 <String Id="Error1333" Overridable="yes">Nije uspelo ispravno krpljenje datoteke [2]: CRC greška.</String>
444 <String Id="Error1334" Overridable="yes">Nije moguće instalirati datoteku „[2]“ zato što ona ne može da se pronađe u datoteci pakovanja „[3]“. Ovo može da ukazuje na mrežnu grešku, grešku prilikom čitanja sa CD-ROM-a ili problem sa ovim paketom.</String>
445 <String Id="Error1335" Overridable="yes">Datoteka pakovanja „[2]“ neophodna za ovu instalaciju je oštećena i ne može da se koristi. Ovo može da ukazuje na mrežnu grešku, grešku prilikom čitanja sa CD-ROM-a ili problem sa ovim paketom.</String>
446 <String Id="Error1336" Overridable="yes">Došlo je do greške tokom kreiranja privremene datoteke koja je potrebna da bi se dovršila ova instalacija.{{ Fascikla: [3]. Kôd sistemske greške: [2]}}</String>
447 <String Id="Error1401" Overridable="yes">Nije bilo moguće kreirati ključ: [2]. {{ Sistemska greška [3].}} Proverite da li imate odgovarajući pristup tom ključu ili se obratite osoblju za podršku. </String>
448 <String Id="Error1402" Overridable="yes">Nije bilo moguće otvoriti ključ: [2]. {{ Sistemska greška [3].}} Proverite da li imate odgovarajući pristup tom ključu ili se obratite osoblju za podršku. </String>
449 <String Id="Error1403" Overridable="yes">Nije bilo moguće izbrisati vrednost [2] iz ključa [3]. {{ Sistemska greška [4].}} Proverite da li imate odgovarajući pristup tom ključu ili se obratite osoblju za podršku. </String>
450 <String Id="Error1404" Overridable="yes">Nije bilo moguće izbrisati ključ [2]. {{ Sistemska greška [3].}} Proverite da li imate odgovarajući pristup tom ključu ili se obratite osoblju za podršku. </String>
451 <String Id="Error1405" Overridable="yes">Nije bilo moguće pročitati vrednost [2] iz ključa [3]. {{ Sistemska greška [4].}} Proverite da li imate odgovarajući pristup tom ključu ili se obratite osoblju za podršku. </String>
452 <String Id="Error1406" Overridable="yes">Nije bilo moguće upisati vrednost [2] u ključ [3]. {{ Sistemska greška [4].}} Proverite da li imate odgovarajući pristup tom ključu ili se obratite osoblju za podršku.</String>
453 <String Id="Error1407" Overridable="yes">Nije bilo moguće preuzeti imena vrednosti za ključ [2]. {{ Sistemska greška [3].}} Proverite da li imate odgovarajući pristup tom ključu ili se obratite osoblju za podršku.</String>
454 <String Id="Error1408" Overridable="yes">Nije bilo moguće preuzeti imena potključeva za ključ [2]. {{ Sistemska greška [3].}} Proverite da li imate odgovarajući pristup tom ključu ili se obratite osoblju za podršku.</String>
455 <String Id="Error1409" Overridable="yes">Nije bilo moguće pročitati bezbednosne informacije za ključ [2]. {{ Sistemska greška [3].}} Proverite da li imate odgovarajući pristup tom ključu ili se obratite osoblju za podršku.</String>
456 <String Id="Error1410" Overridable="yes">Nije bilo moguće povećati dostupni prostor registratora. Potrebno je [2] kB slobodnog prostora registratora za instalaciju ove aplikacije.</String>
457 <String Id="Error1500" Overridable="yes">Neka druga instalacija je u toku. Morate dovršiti tu instalaciju da biste mogli da nastavite sa ovom.</String>
458 <String Id="Error1501" Overridable="yes">Greška tokom pristupanja zaštićenim podacima. Uverite se da je Windows Installer ispravno konfigurisan i pokušajte ponovo da izvršite instalaciju.</String>
459 <String Id="Error1502" Overridable="yes">Korisnik „[2]“ je prethodno pokrenuo instalaciju proizvoda „[3]“. Korisnik će morati ponovo da pokrene tu instalaciju da bi mogao da koristi taj proizvod. Trenutna instalacija će se nastaviti.</String>
460 <String Id="Error1503" Overridable="yes">Korisnik „[2]“ je prethodno pokrenuo instalaciju proizvoda „[3]“. Korisnik će morati ponovo da pokrene tu instalaciju da bi mogao da koristi taj proizvod.</String>
461 <String Id="Error1601" Overridable="yes">Nema prostora na disku -- volumen: „[2]“; potreban prostor: [3] kB; dostupan prostor: [4] kB. Oslobodite prostor na disku i pokušajte ponovo.</String>
462 <String Id="Error1602" Overridable="yes">Želite li zaista da otkažete ovu radnju?</String>
463 <String Id="Error1603" Overridable="yes">Datoteku [2][3] koristi{ sledeći proces: ime: [4], Id: [5], naslov prozora: „[6]“}. Zatvorite tu aplikaciju i pokušajte ponovo.</String>
464 <String Id="Error1604" Overridable="yes">Proizvod „[2]“ je već instaliran i sprečava instalaciju ovog proizvoda. Ova dva proizvoda su nekompatibilna.</String>
465 <String Id="Error1605" Overridable="yes">Nema dovoljno prostora na disku na volumenu „[2]“ da bi se nastavila instalacija sa omogućenim oporavkom. Potrebno je [3] kB, a dostupno je samo [4] kB. Kliknite na dugme „Zanemari“ da biste nastavili instalaciju bez čuvanja informacija za oporavak, kliknite na dugme „Pokušaj opet“ da biste ponovo proverili dostupan prostor ili na dugme „Otkaži“ da biste odustali od instaliranja.</String>
466 <String Id="Error1606" Overridable="yes">Nije bilo moguće pristupiti mrežnoj lokaciji [2].</String>
467 <String Id="Error1607" Overridable="yes">Sledeće aplikacije moraju biti zatvorene pre nego što nastavite sa instaliranjem:</String>
468 <String Id="Error1608" Overridable="yes">Na računaru nije bilo moguće pronaći nijedan prethodno instalirani usaglašeni proizvod za instaliranje ovog proizvoda.</String>
469 <String Id="Error1609" Overridable="yes">Došlo je do greške tokom primene bezbednosnih postavki. [2] nije važeći korisnik ili grupa. Ovo može biti problem sa paketom ili problem pri povezivanju sa kontrolerom domena na mreži. Proverite mrežnu vezu i kliknite na dugme „Pokušaj opet“ ili na dugme „Otkaži“ da biste završili instalaciju. {{Nije moguće pronaći korisnički SID, sistemska greška [3]}}</String>
470 <String Id="Error1701" Overridable="yes">Šifra [2] nije važeća. Proverite da li ste uneli ispravnu šifru.</String>
471 <String Id="Error1702" Overridable="yes">Instalacioni program mora ponovo da pokrene sistem da bi moglo da se nastavi sa konfigurisanjem programa [2]. Kliknite na dugme „Da“ da biste odmah ponovo pokrenuli računar ili na dugme „Ne“ ako planirate da kasnije ručno ponovo pokrenete računar.</String>
472 <String Id="Error1703" Overridable="yes">Morate ponovo da pokrenete sistem da bi promene napravljene u konfiguraciji proizvoda [2] stupile na snagu. Kliknite na dugme „Da“ da biste odmah ponovo pokrenuli računar ili na dugme „Ne“ ako planirate kasnije ručno da ponovo pokrenete računar.</String>
473 <String Id="Error1704" Overridable="yes">Instalacija proizvoda [2] je trenutno obustavljena. Morate da opozovete promene koje je napravila ta instalacija da biste nastavili. Želite li da opozovete te promene?</String>
474 <String Id="Error1705" Overridable="yes">Prethodno započeta instalacija ovog proizvoda je u toku. Morate da opozovete promene koje je napravila ta instalacija da biste nastavili. Želite li da opozovete te promene?</String>
475 <String Id="Error1706" Overridable="yes">Nije moguće pronaći instalacioni paket za proizvod [2]. Ponovo pokušajte da izvršite instalaciju pomoću važeće kopije instalacionog paketa „[3]“.</String>
476 <String Id="Error1707" Overridable="yes">Instaliranje je uspešno dovršeno.</String>
477 <String Id="Error1708" Overridable="yes">Instaliranje nije uspelo.</String>
478 <String Id="Error1709" Overridable="yes">Proizvod: [2] -- [3]</String>
479 <String Id="Error1710" Overridable="yes">Možete da vratite računar u prethodno stanje ili da nastavite instaliranje kasnije. Želite li da vratite računar u prethodno stanje?</String>
480 <String Id="Error1711" Overridable="yes">Došlo je do greške tokom upisivanja informacija o instalaciji na disk. Uverite se da imate dovoljno dostupnog prostora na disku i kliknite na dugme „Pokušaj opet“ ili na dugme „Otkaži“ da biste završili instalaciju.</String>
481 <String Id="Error1712" Overridable="yes">Nije bilo moguće pronaći neke datoteke potrebne da se vaš računar vrati u prethodno stanje. Vraćanje računara u prethodno stanje neće biti moguće.</String>
482 <String Id="Error1713" Overridable="yes">[2] ne može da instalira jedan od potrebnih proizvoda. Obratite se grupi za tehničku podršku. {{Sistemska greška: [3].}}</String>
483 <String Id="Error1714" Overridable="yes">Nije moguće ukloniti stariju verziju programa [2]. Obratite se grupi za tehničku podršku. {{Sistemska greška [3].}}</String>
484 <String Id="Error1715" Overridable="yes">Proizvod [2] je instaliran</String>
485 <String Id="Error1716" Overridable="yes">Proizvod [2] je konfigurisan</String>
486 <String Id="Error1717" Overridable="yes">Proizvod [2] je uklonjen</String>
487 <String Id="Error1718" Overridable="yes">Smernice digitalnog potpisa su odbacile datoteku [2].</String>
488 <String Id="Error1719" Overridable="yes">Nije bilo moguće pristupiti usluzi Windows Installer. Ovo može da se dogodi ako Windows radi u bezbednom režimu ili ako Windows Installer nije ispravno instaliran. Obratite se osoblju za podršku za pomoć.</String>
489 <String Id="Error1720" Overridable="yes">Postoji problem sa ovim paketom programa Windows Installer. Nije bilo moguće pokrenuti skriptu koja je potrebna za dovršavanje ove instalacije. Obratite se osoblju za podršku ili prodavcu paketa. {{Prilagođena radnja [2] greška u skripti [3], [4]: [5] red [6], kolona [7], [8] }}</String>
490 <String Id="Error1721" Overridable="yes">Postoji problem sa ovim paketom programa Windows Installer. Nije moguće pokrenuti skriptu koja je potrebna za dovršavanje ove instalacije. Obratite se osoblju za podršku ili prodavcu paketa. {{Radnja: [2], lokacija: [3], komanda: [4] }}</String>
491 <String Id="Error1722" Overridable="yes">Postoji problem sa ovim paketom programa Windows Installer. Program koji je pokrenut kao deo instalacije nije se završio na očekivani način. Obratite se osoblju za podršku ili prodavcu paketa. {{Radnja [2], lokacija: [3], komanda: [4] }}</String>
492 <String Id="Error1723" Overridable="yes">Postoji problem sa ovim paketom programa Windows Installer. Nije bilo moguće pokrenuti DLL datoteku koja je potrebna za dovršavanje ove instalacije. Obratite se osoblju za podršku ili prodavcu paketa. {{Radnja [2], stavka: [3], biblioteka: [4] }}</String>
493 <String Id="Error1724" Overridable="yes">Uklanjanje je uspešno dovršeno.</String>
494 <String Id="Error1725" Overridable="yes">Uklanjanje nije uspelo.</String>
495 <String Id="Error1726" Overridable="yes">Oglas je uspešno dovršen.</String>
496 <String Id="Error1727" Overridable="yes">Oglas nije uspeo.</String>
497 <String Id="Error1728" Overridable="yes">Konfigurisanje je uspešno dovršeno.</String>
498 <String Id="Error1729" Overridable="yes">Konfigurisanje nije uspelo.</String>
499 <String Id="Error1730" Overridable="yes">Morate biti administrator da biste mogli da uklonite ovu aplikaciju. Da biste uklonili ovu aplikaciju, možete se prijaviti kao administrator ili se obratiti grupi za tehničku podršku za pomoć.</String>
500 <String Id="Error1731" Overridable="yes">Izvorni instalacioni paket proizvoda [2] nije sinhronizovan sa paketom klijenta. Ponovo pokušajte da izvršite instalaciju pomoću važeće kopije instalacionog paketa „[3]“.</String>
501 <String Id="Error1732" Overridable="yes">Da biste dovršili instalaciju proizvoda [2], morate ponovo pokrenuti računar. Na ovaj računar su trenutno prijavljeni drugi korisnici, koji zbog ponovnog pokretanja mogu izgubiti ono što su uradili. Želite li da odmah ponovo pokrenete računar?</String>
502 <String Id="Error1801" Overridable="yes">Putanja [2] nije važeća. Navedite važeću putanju.</String>
503 <String Id="Error1802" Overridable="yes">Nema dovoljno memorije. Zatvorite ostale aplikacije pre nego što pokušate ponovo.</String>
504 <String Id="Error1803" Overridable="yes">Ne postoji disk u disk jedinici [2]. Stavite disk i kliknite na dugme „Pokušaj opet“ ili na dugme „Otkaži“ da biste se vratili na prethodno izabrani volumen.</String>
505 <String Id="Error1804" Overridable="yes">Ne postoji disk u disk jedinici [2]. Stavite disk i kliknite na dugme „Pokušaj opet“ ili na dugme „Otkaži“ da biste se vratili u dijalog za pretraživanje i izabrali neki drugi volumen.</String>
506 <String Id="Error1805" Overridable="yes">Fascikla [2] ne postoji. Unesite putanju do postojeće fascikle.</String>
507 <String Id="Error1806" Overridable="yes">Nemate odgovarajuće privilegije za čitanje iz ove datoteke.</String>
508 <String Id="Error1807" Overridable="yes">Nije bilo moguće odrediti važeću odredišnu fasciklu za instalaciju.</String>
509 <String Id="Error1901" Overridable="yes">Greška pri pokušaju čitanja iz izvorne baze podataka instalacije: [2].</String>
510 <String Id="Error1902" Overridable="yes">Planiranje ponovnog pokretanja sistema: preimenovanje datoteke [2] u [3]. Morate ponovo pokrenuti sistem da biste dovršili operaciju.</String>
511 <String Id="Error1903" Overridable="yes">Planiranje ponovnog pokretanja sistema: brisanje datoteke [2]. Morate ponovo pokrenuti sistem da biste dovršili operaciju.</String>
512 <String Id="Error1904" Overridable="yes">Registracija modula [2] nije uspela. HRESULT [3]. Obratite se osoblju za podršku.</String>
513 <String Id="Error1905" Overridable="yes">Opoziv registracije modula [2] nije uspeo. HRESULT [3]. Obratite se osoblju za podršku.</String>
514 <String Id="Error1906" Overridable="yes">Keširanje paketa [2] nije uspelo. Greška: [3]. Obratite se osoblju za podršku.</String>
515 <String Id="Error1907" Overridable="yes">Nije bilo moguće registrovati font [2]. Proverite da li imate odgovarajuće dozvole za instaliranje fontova i da li sistem podržava ovaj font.</String>
516 <String Id="Error1908" Overridable="yes">Nije bilo moguće opozvati registraciju fonta [2]. Proverite da li imate odgovarajuće dozvole za uklanjanje fontova.</String>
517 <String Id="Error1909" Overridable="yes">Nije bilo moguće kreirati prečicu [2]. Proverite da li odredišna fascikla postoji i da li joj možete pristupiti.</String>
518 <String Id="Error1910" Overridable="yes">Nije bilo moguće ukloniti prečicu [2]. Proverite da li datoteka prečice postoji i da li joj možete pristupiti.</String>
519 <String Id="Error1911" Overridable="yes">Nije bilo moguće registrovati biblioteku tipova za datoteku [2]. Obratite se osoblju za podršku.</String>
520 <String Id="Error1912" Overridable="yes">Nije bilo moguće opozvati registraciju biblioteke tipova za datoteku [2]. Obratite se osoblju za podršku.</String>
521 <String Id="Error1913" Overridable="yes">Nije bilo moguće ažurirati ini datoteku [2][3]. Proverite da li datoteka postoji i da li joj možete pristupiti.</String>
522 <String Id="Error1914" Overridable="yes">Nije bilo moguće isplanirati da datoteka [2] zameni datoteku [3] pri ponovnom pokretanju sistema. Proverite da li imate dozvole za upisivanje u datoteku [3].</String>
523 <String Id="Error1915" Overridable="yes">Greška tokom uklanjanja menadžera ODBC upravljačkog programa, ODBC greška [2]: [3]. Obratite se osoblju za podršku.</String>
524 <String Id="Error1916" Overridable="yes">Greška tokom instaliranja menadžera ODBC upravljačkog programa, ODBC greška [2]: [3]. Obratite se osoblju za podršku.</String>
525 <String Id="Error1917" Overridable="yes">Greška tokom uklanjanja ODBC upravljačkog programa: [4], ODBC greška [2]: [3]. Proverite da li imate odgovarajuće privilegije za uklanjanje ODBC upravljačkih programa.</String>
526 <String Id="Error1918" Overridable="yes">Greška tokom instaliranja ODBC upravljačkog programa: [4], ODBC greška [2]: [3]. Proverite da li datoteka [4] postoji i da li joj možete pristupiti.</String>
527 <String Id="Error1919" Overridable="yes">Greška tokom konfigurisanja izvora ODBC podataka: [4], ODBC greška [2]: [3]. Proverite da li datoteka [4] postoji i da li joj možete pristupiti.</String>
528 <String Id="Error1920" Overridable="yes">Pokretanje usluge „[2]“ ([3]) nije uspelo. Proverite da li imate odgovarajuće privilegije za pokretanje sistemskih usluga.</String>
529 <String Id="Error1921" Overridable="yes">Nije bilo moguće zaustaviti uslugu „[2]“ ([3]). Proverite da li imate odgovarajuće privilegije za zaustavljanje sistemskih usluga.</String>
530 <String Id="Error1922" Overridable="yes">Nije bilo moguće izbrisati uslugu „[2]“ ([3]). Proverite da li imate odgovarajuće privilegije za uklanjanje sistemskih usluga.</String>
531 <String Id="Error1923" Overridable="yes">Nije bilo moguće instalirati uslugu „[2]“ ([3]). Proverite da li imate odgovarajuće privilegije za instaliranje sistemskih usluga.</String>
532 <String Id="Error1924" Overridable="yes">Nije bilo moguće ažurirati promenljivu okruženja „[2]“. Proverite da li imate odgovarajuće privilegije za izmenu promenljivih okruženja.</String>
533 <String Id="Error1925" Overridable="yes">Nemate odgovarajuće privilegije da biste dovršili ovu instalaciju za sve korisnike ovog računara. Prijavite se kao administrator i ponovo pokušajte da izvršite ovu instalaciju.</String>
534 <String Id="Error1926" Overridable="yes">Nije bilo moguće podesiti bezbednost datoteke za datoteku „[3]“. Greška: [2]. Proverite da li imate odgovarajuće privilegije za izmenu bezbednosnih dozvola za ovu datoteku.</String>
535 <String Id="Error1927" Overridable="yes">Usluge Component Services (COM+ 1.0) nisu instalirane na ovom računaru, a one su potrebne za uspešno dovršavanje ove instalacije. Usluge Component Services su dostupne u operativnom sistemu Windows 2000.</String>
536 <String Id="Error1928" Overridable="yes">Greška tokom registracije COM+ aplikacije. Za više informacija obratite se osoblju za podršku.</String>
537 <String Id="Error1929" Overridable="yes">Greška tokom opoziva registracije COM+ aplikacije. Za više informacija obratite se osoblju za podršku.</String>
538 <String Id="Error1930" Overridable="yes">Opis usluge „[2]“ ([3]) ne može da se menja.</String>
539 <String Id="Error1931" Overridable="yes">Usluga Windows Installer ne može da ažurira sistemsku datoteku [2] zato što je Windows zaštitio datoteku. Možda ćete morati da ažurirate operativni sistem da bi ovaj program radio ispravno. {{Verzija paketa: [3], verzija koju štiti operativni sistem: [4]}}</String>
540 <String Id="Error1932" Overridable="yes">Usluga Windows Installer ne može da ažurira zaštićenu Windows datoteku [2]. {{Verzija paketa: [3], verzija koju štiti operativni sistem: [4], SFP greška: [5]}}</String>
541 <String Id="Error1933" Overridable="yes">Usluga Windows Installer ne može da ažurira neke zaštićene Windows datoteke. {{SFP greška: [2]. Lista zaštićenih datoteka:\r\n[3]}}</String>
542 <String Id="Error1934" Overridable="yes">Korisničke instalacije su onemogućene putem smernica na računaru.</String>
543 <String Id="Error1935" Overridable="yes">Došlo je do greške prilikom instaliranja asemblera „[6]“. Za više informacija pogledajte Pomoć i podršku. HRESULT: [3]. {{interfejs asemblera: [4], funkcija: [5], komponenta: [2]}}</String>
544 <String Id="Error1936" Overridable="yes">Došlo je do greške prilikom instaliranja asemblera „[6]“. Asembler nema dovoljno jako ime ili nije potpisan minimalnom dužinom ključa. HRESULT: [3]. {{interfejs asemblera: [4], funkcija: [5], komponenta: [2]}}</String>
545 <String Id="Error1937" Overridable="yes">Došlo je do greške prilikom instaliranja asemblera „[6]“. Nije bilo moguće verifikovati potpis ili katalog ili su oni nevažeći. HRESULT: [3]. {{interfejs asemblera: [4], funkcija: [5], komponenta: [2]}}</String>
546 <String Id="Error1938" Overridable="yes">Došlo je do greške prilikom instaliranja asemblera „[6]“. Nije bilo moguće pronaći neke module asemblera. HRESULT: [3]. {{interfejs asemblera: [4], funkcija: [5], komponenta: [2]}}</String>
547
548 <String Id="UITextbytes" Overridable="yes">bajtova</String>
549 <String Id="UITextGB" Overridable="yes">GB</String>
550 <String Id="UITextKB" Overridable="yes">kB</String>
551 <String Id="UITextMB" Overridable="yes">MB</String>
552 <String Id="UITextMenuAbsent" Overridable="yes">Čitava funkcija će biti nedostupna</String>
553 <String Id="UITextMenuAdvertise" Overridable="yes">Funkcija će biti instalirana po potrebi</String>
554 <String Id="UITextMenuAllCD" Overridable="yes">Čitava funkcija će biti instalirana za pokretanje sa CD-a</String>
555 <String Id="UITextMenuAllLocal" Overridable="yes">Čitava funkcija će biti instalirana na lokalni čvrsti disk</String>
556 <String Id="UITextMenuAllNetwork" Overridable="yes">Čitava funkcija će biti instalirana za pokretanje sa mreže</String>
557 <String Id="UITextMenuCD" Overridable="yes">Biće instalirano za pokretanje sa CD-a</String>
558 <String Id="UITextMenuLocal" Overridable="yes">Biće instalirano na lokalni čvrsti disk</String>
559 <String Id="UITextMenuNetwork" Overridable="yes">Biće instalirano za pokretanje sa mreže</String>
560 <String Id="UITextNewFolder" Overridable="yes">Fascikla|Nova fascikla</String>
561 <String Id="UITextScriptInProgress" Overridable="yes">Prikupljanje potrebnih informacija...</String>
562 <String Id="UITextSelAbsentAbsent" Overridable="yes">Ova funkcija će ostati neinstalirana</String>
563 <String Id="UITextSelAbsentAdvertise" Overridable="yes">Ova funkcija će biti podešena tako da se instalira po potrebi</String>
564 <String Id="UITextSelAbsentCD" Overridable="yes">Ova funkcija će biti instalirana za pokretanje sa CD-a</String>
565 <String Id="UITextSelAbsentLocal" Overridable="yes">Ova funkcija će biti instalirana na lokalni čvrsti disk</String>
566 <String Id="UITextSelAbsentNetwork" Overridable="yes">Ova funkcija će biti instalirana za pokretanje sa mreže</String>
567 <String Id="UITextSelAdvertiseAbsent" Overridable="yes">Ova funkcija će postati nedostupna</String>
568 <String Id="UITextSelAdvertiseAdvertise" Overridable="yes">Biće instalirano po potrebi</String>
569 <String Id="UITextSelAdvertiseCD" Overridable="yes">Ova funkcija će biti dostupna za pokretanje sa CD-a</String>
570 <String Id="UITextSelAdvertiseLocal" Overridable="yes">Ova funkcija će biti instalirana na lokalni čvrsti disk</String>
571 <String Id="UITextSelAdvertiseNetwork" Overridable="yes">Ova funkcija će biti dostupna za pokretanje sa mreže</String>
572 <String Id="UITextSelCDAbsent" Overridable="yes">Ova funkcija će biti deinstalirana u potpunosti, nećete moći da je pokrećete sa CD-a</String>
573 <String Id="UITextSelCDAdvertise" Overridable="yes">Ova funkcija će biti promenjena tako da se instalira po potrebi umesto da se pokreće sa CD-a</String>
574 <String Id="UITextSelCDCD" Overridable="yes">Ova funkcija će se i ubuduće pokretati sa CD-a</String>
575 <String Id="UITextSelCDLocal" Overridable="yes">Ova funkcija će biti promenjena tako da se instalira na lokalni čvrsti disk umesto da se pokreće sa CD-a</String>
576 <String Id="UITextSelChildCostNeg" Overridable="yes">Ova funkcija oslobađa [1] na čvrstom disku.</String>
577 <String Id="UITextSelChildCostPos" Overridable="yes">Ova funkcija zahteva [1] na čvrstom disku.</String>
578 <String Id="UITextSelCostPending" Overridable="yes">Proračun utroška za ovu funkciju...</String>
579 <String Id="UITextSelLocalAbsent" Overridable="yes">Ova funkcija će biti u potpunosti uklonjena</String>
580 <String Id="UITextSelLocalAdvertise" Overridable="yes">Ova funkcija će biti uklonjena sa lokalnog čvrstog diska, ali će biti podešena tako da se instalira po potrebi</String>
581 <String Id="UITextSelLocalCD" Overridable="yes">Ova funkcija će biti uklonjena sa lokalnog čvrstog diska, ali će i dalje biti dostupna za pokretanje sa CD-a</String>
582 <String Id="UITextSelLocalLocal" Overridable="yes">Ova funkcija će ostati na lokalnom čvrstom disku</String>
583 <String Id="UITextSelLocalNetwork" Overridable="yes">Ova funkcija će biti uklonjena sa lokalnog čvrstog diska, ali će i dalje biti dostupna za pokretanje sa mreže</String>
584 <String Id="UITextSelNetworkAbsent" Overridable="yes">Ova funkcija će biti deinstalirana u potpunosti, nećete moći da je pokrećete sa mreže</String>
585 <String Id="UITextSelNetworkAdvertise" Overridable="yes">Ova funkcija će biti promenjena tako da se instalira po potrebi umesto da se pokreće sa mreže</String>
586 <String Id="UITextSelNetworkLocal" Overridable="yes">Ova funkcija će biti promenjena tako da se instalira na lokalni čvrsti disk umesto da se pokreće sa mreže</String>
587 <String Id="UITextSelNetworkNetwork" Overridable="yes">Ova funkcija će se i ubuduće pokretati sa mreže</String>
588 <String Id="UITextSelParentCostNegNeg" Overridable="yes">Ova funkcija oslobađa [1] na čvrstom disku. Izabrano je [2] od [3] njenih potfunkcija. Potfunkcije oslobađaju [4] na čvrstom disku.</String>
589 <String Id="UITextSelParentCostNegPos" Overridable="yes">Ova funkcija oslobađa [1] na čvrstom disku. Izabrano je [2] od [3] njenih potfunkcija. Potfunkcije zahtevaju [4] na čvrstom disku.</String>
590 <String Id="UITextSelParentCostPosNeg" Overridable="yes">Ova funkcija zahteva [1] na čvrstom disku. Izabrano je [2] od [3] njenih potfunkcija. Potfunkcije oslobađaju [4] na čvrstom disku.</String>
591 <String Id="UITextSelParentCostPosPos" Overridable="yes">Ova funkcija zahteva [1] na čvrstom disku. Izabrano je [2] od [3] njenih potfunkcija. Potfunkcije zahtevaju [4] na čvrstom disku.</String>
592 <String Id="UITextTimeRemaining" Overridable="yes">Preostalo vreme: {[1] minuta }{[2] sekundi}</String>
593 <String Id="UITextVolumeCostAvailable" Overridable="yes">Dostupan</String>
594 <String Id="UITextVolumeCostDifference" Overridable="yes">Razlika</String>
595 <String Id="UITextVolumeCostRequired" Overridable="yes">Potrebno</String>
596 <String Id="UITextVolumeCostSize" Overridable="yes">Veličina diska</String>
597 <String Id="UITextVolumeCostVolume" Overridable="yes">Volumen</String>
598</WixLocalization>
diff --git a/src/ext/UI/wixlib/WixUI_sv-SE.wxl b/src/ext/UI/wixlib/WixUI_sv-SE.wxl
new file mode 100644
index 00000000..280adb33
--- /dev/null
+++ b/src/ext/UI/wixlib/WixUI_sv-SE.wxl
@@ -0,0 +1,598 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3
4
5<WixLocalization Culture="sv-se" Codepage="1252" xmlns="http://wixtoolset.org/schemas/v4/wxl">
6 <String Id="WixUIBack" Overridable="yes">&amp;Föregående</String>
7 <String Id="WixUINext" Overridable="yes">&amp;Nästa</String>
8 <String Id="WixUICancel" Overridable="yes">Avbryt</String>
9 <String Id="WixUIFinish" Overridable="yes">&amp;Slutför</String>
10 <String Id="WixUIRetry" Overridable="yes">F&amp;örsök igen</String>
11 <String Id="WixUIIgnore" Overridable="yes">Ign&amp;orera</String>
12 <String Id="WixUIYes" Overridable="yes">&amp;Ja</String>
13 <String Id="WixUINo" Overridable="yes">N&amp;ej</String>
14 <String Id="WixUIOK" Overridable="yes">OK</String>
15 <String Id="WixUIPrint" Overridable="yes">&amp;Skriv ut</String>
16
17 <String Id="AdvancedWelcomeEulaDlg_Title" Overridable="yes">Installationsguiden för [ProductName]</String>
18 <String Id="AdvancedWelcomeEulaDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
19 <String Id="AdvancedWelcomeEulaDlgTitle" Overridable="yes">{\WixUI_Font_Title}Läs licensavtalet för [ProductName]</String>
20 <String Id="AdvancedWelcomeEulaDlgLicenseAcceptedCheckBox" Overridable="yes">Jag &amp;accepterar villkoren i licensavtalet</String>
21 <String Id="AdvancedWelcomeEulaDlgDescriptionPerMachine" Overridable="yes">Klicka på Installera om du vill installera produkten med standardalternativ för alla användare. Klicka på Avancerat om du vill ändra installationsalternativen.</String>
22 <String Id="AdvancedWelcomeEulaDlgDescriptionPerUser" Overridable="yes">Klicka på Installera om du vill installera produkten med standardalternativ bara för dig. Klicka på Avancerat om du vill ändra installationsalternativen.</String>
23 <String Id="AdvancedWelcomeEulaDlgInstall" Overridable="yes">&amp;Installera</String>
24 <String Id="AdvancedWelcomeEulaDlgAdvanced" Overridable="yes">Avan&amp;cerat</String>
25 <String Id="Advanced_Font_Normal_Size" Overridable="yes">8</String>
26 <String Id="Advanced_Font_Bigger_Size" Overridable="yes">12</String>
27 <String Id="Advanced_Font_Title_Size" Overridable="yes">9</String>
28 <String Id="Advanced_Font_Emphasized_Size" Overridable="yes">8</String>
29 <String Id="Advanced_Font_FaceName" Overridable="yes">Tahoma</String>
30
31 <String Id="BrowseDlg_Title" Overridable="yes">Installationsguiden för [ProductName]</String>
32 <String Id="BrowseDlgComboLabel" Overridable="yes">&amp;Sök i:</String>
33 <String Id="BrowseDlgWixUI_Bmp_Up" Overridable="yes">WixUI_Bmp_Up</String>
34 <String Id="BrowseDlgWixUI_Bmp_UpTooltip" Overridable="yes">Upp en nivå</String>
35 <String Id="BrowseDlgNewFolder" Overridable="yes">WixUI_Bmp_New</String>
36 <String Id="BrowseDlgNewFolderTooltip" Overridable="yes">Skapa en ny mapp</String>
37 <String Id="BrowseDlgPathLabel" Overridable="yes">&amp;Mappnamn:</String>
38 <String Id="BrowseDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
39 <String Id="BrowseDlgDescription" Overridable="yes">Bläddra till målmappen</String>
40 <String Id="BrowseDlgTitle" Overridable="yes">{\WixUI_Font_Title}Byt målmapp</String>
41
42 <String Id="CancelDlg_Title" Overridable="yes">Installationsguiden för [ProductName]</String>
43 <String Id="CancelDlgText" Overridable="yes">Vill du avbryta installationen av [ProductName]?</String>
44 <String Id="CancelDlgIcon" Overridable="yes">WixUI_Ico_Info</String>
45 <String Id="CancelDlgIconTooltip" Overridable="yes">Informationsikon</String>
46
47 <String Id="CustomizeDlg_Title" Overridable="yes">Installationsguiden för [ProductName]</String>
48 <String Id="CustomizeDlgTree" Overridable="yes">Träd med installationsalternativ</String>
49 <String Id="CustomizeDlgBrowse" Overridable="yes">&amp;Bläddra...</String>
50 <String Id="CustomizeDlgReset" Overridable="yes">&amp;Återställ</String>
51 <String Id="CustomizeDlgDiskCost" Overridable="yes">&amp;Diskanvändning</String>
52 <String Id="CustomizeDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
53 <String Id="CustomizeDlgText" Overridable="yes">Klicka på ikonerna i trädet nedan om du vill ändra hur funktionerna installeras.</String>
54 <String Id="CustomizeDlgDescription" Overridable="yes">Ange hur funktionerna ska installeras.</String>
55 <String Id="CustomizeDlgTitle" Overridable="yes">{\WixUI_Font_Title}Anpassad installation</String>
56 <String Id="CustomizeDlgItemDescription" Overridable="yes">CustomizeDlgItemDescription-CustomizeDlgItemDescription</String>
57 <String Id="CustomizeDlgItemSize" Overridable="yes">CustomizeDlgItemSize-CustomizeDlgItemSize</String>
58 <String Id="CustomizeDlgLocation" Overridable="yes">CustomizeDlgLocation-CustomizeDlgLocation</String>
59 <String Id="CustomizeDlgLocationLabel" Overridable="yes">Plats:</String>
60
61 <String Id="DiskCostDlg_Title" Overridable="yes">Installationsguiden för [ProductName]</String>
62 <String Id="DiskCostDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
63 <String Id="DiskCostDlgText" Overridable="yes">De markerade volymerna har inte tillräckligt med diskutrymme för de valda funktionerna. Du kan antingen ta bort några filer från de markerade volymerna, installera färre funktioner eller välja andra målenheter.</String>
64 <String Id="DiskCostDlgDescription" Overridable="yes">Det hårddiskutrymme som krävs för att installera de valda funktionerna.</String>
65 <String Id="DiskCostDlgTitle" Overridable="yes">{\WixUI_Font_Title}Diskutrymmeskrav</String>
66 <String Id="DiskCostDlgVolumeList" Overridable="yes">{120}{70}{70}{70}{70}</String>
67
68 <String Id="ErrorDlg_Title" Overridable="yes">Installationsguiden för [ProductName]</String>
69 <String Id="ErrorDlgErrorText" Overridable="yes">Informationstext</String>
70 <String Id="ErrorDlgErrorIcon" Overridable="yes">WixUI_Ico_Info</String>
71 <String Id="ErrorDlgErrorIconTooltip" Overridable="yes">Informationsikon</String>
72
73 <String Id="ExitDialog_Title" Overridable="yes">Installationsguiden för [ProductName]</String>
74 <String Id="ExitDialogBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
75 <String Id="ExitDialogDescription" Overridable="yes">Klicka på Slutför om du vill avsluta installationsguiden.</String>
76 <String Id="ExitDialogTitle" Overridable="yes">{\WixUI_Font_Bigger}Installationsguiden för [ProductName] slutfördes</String>
77
78 <String Id="FatalError_Title" Overridable="yes">Installationsguiden för [ProductName]</String>
79 <String Id="FatalErrorBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
80 <String Id="FatalErrorTitle" Overridable="yes">{\WixUI_Font_Bigger}Installationsguiden för [ProductName] avslutades för tidigt</String>
81 <String Id="FatalErrorDescription1" Overridable="yes">Installationsguiden för [ProductName] avslutades för tidigt på grund av ett fel. Systemet har inte ändrats. Om du vill installera programmet vid ett senare tillfälle kan du köra installationsguiden igen.</String>
82 <String Id="FatalErrorDescription2" Overridable="yes">Klicka på Slutför om du vill avsluta installationsguiden.</String>
83
84 <String Id="FeaturesDlg_Title" Overridable="yes">Installationsguiden för [ProductName]</String>
85 <String Id="FeaturesDlgTree" Overridable="yes">Produktfunktioner</String>
86 <String Id="FeaturesDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
87 <String Id="FeaturesDlgDescription" Overridable="yes">Ange hur funktionerna ska installeras.</String>
88 <String Id="FeaturesDlgTitle" Overridable="yes">{\WixUI_Font_Title}Produktfunktioner</String>
89 <String Id="FeaturesDlgItemDescription" Overridable="yes">FeaturesDlgItemDescription</String>
90 <String Id="FeaturesDlgItemSize" Overridable="yes">FeaturesDlgItemSize</String>
91 <String Id="FeaturesDlgInstall" Overridable="yes">&amp;Installera</String>
92 <String Id="FeaturesDlgChange" Overridable="yes">&amp;Ändra</String>
93
94 <String Id="FilesInUse_Title" Overridable="yes">Installationsguiden för [ProductName]</String>
95 <String Id="FilesInUseExit" Overridable="yes">A&amp;vsluta</String>
96 <String Id="FilesInUseBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
97 <String Id="FilesInUseText" Overridable="yes">Följande program använder filer som behöver uppdateras under installationen. Stäng programmen och klicka på &amp;Försök igen om du vill fortsätta eller Avsluta om du vill avsluta installationen.</String>
98 <String Id="FilesInUseDescription" Overridable="yes">Några filer som måste uppdateras används just nu.</String>
99 <String Id="FilesInUseTitle" Overridable="yes">{\WixUI_Font_Title}Filer som används</String>
100
101 <String Id="InstallDirDlg_Title" Overridable="yes">Installationsguiden för [ProductName]</String>
102 <String Id="InstallDirDlgChange" Overridable="yes">&amp;Ändra...</String>
103 <String Id="InstallDirDlgTitle" Overridable="yes">{\WixUI_Font_Title}Målmapp</String>
104 <String Id="InstallDirDlgDescription" Overridable="yes">Klicka på Nästa om du vill installera i standardmappen eller klicka på Ändra om du vill byta mapp.</String>
105 <String Id="InstallDirDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
106 <String Id="InstallDirDlgFolderLabel" Overridable="yes">Installera [ProductName] i:</String>
107
108 <String Id="InstallScopeDlg_Title" Overridable="yes">Installationsguiden för [ProductName]</String>
109 <String Id="InstallScopeDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
110 <String Id="InstallScopeDlgDescription" Overridable="yes">Välj installationsomfattning och mapp</String>
111 <String Id="InstallScopeDlgTitle" Overridable="yes">{\WixUI_Font_Title}Installationsomfattning</String>
112 <String Id="InstallScopeDlgPerUser" Overridable="yes">{\WixUI_Font_Emphasized}Installera &amp;bara för mig: ([LogonUser])</String>
113 <String Id="InstallScopeDlgPerUserDescription" Overridable="yes">[ProductName] installeras i en mapp per användare och blir bara tillgängligt för ditt användarkonto. Du behöver inte lokala administratörsprivilegier.</String>
114 <String Id="InstallScopeDlgNoPerUserDescription" Overridable="yes">[ProductName] stöder inte installation per användare.</String>
115 <String Id="InstallScopeDlgPerMachine" Overridable="yes">{\WixUI_Font_Emphasized}Installera för alla användare av den här &amp;datorn</String>
116 <String Id="InstallScopeDlgPerMachineDescription" Overridable="yes">[ProductName] installeras som en datorinstallation (standard) och blir tillgängligt för alla användare. Du kan ändra standardmappen för installationen. Du måste ha lokala administratörsprivilegier.</String>
117 <String Id="InstallScopeDlgFolderLabel" Overridable="yes">Installations&amp;mapp:</String>
118 <String Id="InstallScopeDlgChange" Overridable="yes">&amp;Ändra...</String>
119
120 <String Id="InvalidDirDlg_Title" Overridable="yes">Installationsguiden för [ProductName]</String>
121 <String Id="InvalidDirDlgText" Overridable="yes">Installationskatalogen måste vara på den lokala hårddisken.</String>
122 <String Id="InvalidDirDlgIcon" Overridable="yes">WixUI_Ico_Info</String>
123 <String Id="InvalidDirDlgIconTooltip" Overridable="yes">Informationsikon</String>
124
125 <String Id="LicenseAgreementDlg_Title" Overridable="yes">Installationsguiden för [ProductName]</String>
126 <String Id="LicenseAgreementDlgLicenseAcceptedCheckBox" Overridable="yes">Jag &amp;accepterar villkoren i licensavtalet</String>
127 <String Id="LicenseAgreementDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
128 <String Id="LicenseAgreementDlgDescription" Overridable="yes">Läs följande licensavtal noggrant</String>
129 <String Id="LicenseAgreementDlgTitle" Overridable="yes">{\WixUI_Font_Title}Licensavtal</String>
130
131 <String Id="MaintenanceTypeDlg_Title" Overridable="yes">Installationsguiden för [ProductName]</String>
132 <String Id="MaintenanceTypeDlgChangeButton" Overridable="yes">&amp;Ändra</String>
133 <String Id="MaintenanceTypeDlgChangeButtonTooltip" Overridable="yes">Ändra installationen</String>
134 <String Id="MaintenanceTypeDlgRepairButton" Overridable="yes">Re&amp;parera</String>
135 <String Id="MaintenanceTypeDlgRepairButtonTooltip" Overridable="yes">Reparera installationen</String>
136 <String Id="MaintenanceTypeDlgRemoveButton" Overridable="yes">&amp;Ta bort</String>
137 <String Id="MaintenanceTypeDlgRemoveButtonTooltip" Overridable="yes">Ta bort installationen</String>
138 <String Id="MaintenanceTypeDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
139 <String Id="MaintenanceTypeDlgDescription" Overridable="yes">Välj den åtgärd som du vill utföra.</String>
140 <String Id="MaintenanceTypeDlgTitle" Overridable="yes">{\WixUI_Font_Title}Ändra, reparera eller ta bort installationen</String>
141 <String Id="MaintenanceTypeDlgChangeText" Overridable="yes">Här kan du ändra hur olika funktioner är installerade.</String>
142 <String Id="MaintenanceTypeDlgChangeDisabledText" Overridable="yes">Det finns inga funktioner som kan väljas separat i [ProductName].</String>
143 <String Id="MaintenanceTypeDlgRemoveText" Overridable="yes">Tar bort [ProductName] från datorn.</String>
144 <String Id="MaintenanceTypeDlgRemoveDisabledText" Overridable="yes">Det går inte att ta bort [ProductName].</String>
145 <String Id="MaintenanceTypeDlgRepairText" Overridable="yes">Reparerar fel i den senaste installationen genom att åtgärda saknade och skadade filer, genvägar och registerposter.</String>
146 <String Id="MaintenanceTypeDlgRepairDisabledText" Overridable="yes">Det går inte att reparera [ProductName].</String>
147
148 <String Id="MaintenanceWelcomeDlg_Title" Overridable="yes">Installationsguiden för [ProductName]</String>
149 <String Id="MaintenanceWelcomeDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
150 <String Id="MaintenanceWelcomeDlgDescription" Overridable="yes">Med installationsguiden kan du ändra hur olika funktioner i [ProductName] installeras på datorn, eller ta bort det helt från datorn. Klicka på Nästa om du vill fortsätta eller på Avbryt om du vill avsluta installationsguiden.</String>
151 <String Id="MaintenanceWelcomeDlgTitle" Overridable="yes">{\WixUI_Font_Bigger}Välkommen till installationsguiden för [ProductName]</String>
152
153 <String Id="MsiRMFilesInUse_Title" Overridable="yes">Installationsguiden för [ProductName]</String>
154 <String Id="MsiRMFilesInUseBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
155 <String Id="MsiRMFilesInUseText" Overridable="yes">Följande program använder filer som behöver uppdateras under installationen. Du kan låta installationsguiden stänga dem och försöka starta om dem, eller starta om datorn senare.</String>
156 <String Id="MsiRMFilesInUseDescription" Overridable="yes">Några filer som måste uppdateras används just nu.</String>
157 <String Id="MsiRMFilesInUseTitle" Overridable="yes">{\WixUI_Font_Title}Filer som används</String>
158 <String Id="MsiRMFilesInUseUseRM" Overridable="yes">St&amp;äng programmen och försök starta om dem.</String>
159 <String Id="MsiRMFilesInUseDontUseRM" Overridable="yes">Stäng &amp;inte programmen. En omstart kommer att krävas.</String>
160
161 <String Id="OutOfDiskDlg_Title" Overridable="yes">Installationsguiden för [ProductName]</String>
162 <String Id="OutOfDiskDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
163 <String Id="OutOfDiskDlgText" Overridable="yes">De markerade volymerna har inte tillräckligt med ledigt diskutrymme för de funktioner som valts. Du kan ta bort filer från de markerade volymerna, installera färre funktioner eller markera en annan målenhet.</String>
164 <String Id="OutOfDiskDlgDescription" Overridable="yes">Mängden diskutrymme som krävs överskrider mängden tillgängligt diskutrymme.</String>
165 <String Id="OutOfDiskDlgTitle" Overridable="yes">{\WixUI_Font_Title}Slut på diskutrymme</String>
166 <String Id="OutOfDiskDlgVolumeList" Overridable="yes">{120}{70}{70}{70}{70}</String>
167
168 <String Id="OutOfRbDiskDlg_Title" Overridable="yes">Installationsguiden för [ProductName]</String>
169 <String Id="OutOfRbDiskDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
170 <String Id="OutOfRbDiskDlgText" Overridable="yes">De markerade volymerna har inte tillräckligt med ledigt diskutrymme för de funktioner som valts. Du kan ta bort filer från de markerade volymerna, installera färre funktioner eller markera en annan målenhet.</String>
171 <String Id="OutOfRbDiskDlgDescription" Overridable="yes">Mängden diskutrymme som krävs överskrider mängden tillgängligt diskutrymme.</String>
172 <String Id="OutOfRbDiskDlgTitle" Overridable="yes">{\WixUI_Font_Title}Slut på diskutrymme</String>
173 <String Id="OutOfRbDiskDlgVolumeList" Overridable="yes">{120}{70}{70}{70}{70}</String>
174 <String Id="OutOfRbDiskDlgText2" Overridable="yes">Du kan även välja att stänga av installationsprogrammets återställningsfunktion. Återställningsfunktionen gör det möjligt för installationsprogrammet att återställa datorn om installationen avbryts. Klicka på Ja om du vill ta risken att stänga av återställningsfunktionen.</String>
175
176 <String Id="PrepareDlg_Title" Overridable="yes">Installationsguiden för [ProductName]</String>
177 <String Id="PrepareDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
178 <String Id="PrepareDlgDescription" Overridable="yes">Vänta medan installationsguiden förbereder installationen.</String>
179 <String Id="PrepareDlgTitle" Overridable="yes">{\WixUI_Font_Bigger}Välkommen till installationsguiden för [ProductName]</String>
180
181 <String Id="ProgressDlg_Title" Overridable="yes">Installationsguiden för [ProductName]</String>
182 <String Id="ProgressDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
183 <String Id="ProgressDlgTextInstalling" Overridable="yes">Vänta medan [ProductName] installeras.</String>
184 <String Id="ProgressDlgTitleInstalling" Overridable="yes">{\WixUI_Font_Title}[ProductName] installeras</String>
185 <String Id="ProgressDlgTextChanging" Overridable="yes">Vänta medan [ProductName] ändras av installationsguiden.</String>
186 <String Id="ProgressDlgTitleChanging" Overridable="yes">{\WixUI_Font_Title}Ändrar [ProductName]</String>
187 <String Id="ProgressDlgTextRepairing" Overridable="yes">Vänta medan [ProductName] repareras.</String>
188 <String Id="ProgressDlgTitleRepairing" Overridable="yes">{\WixUI_Font_Title}[ProductName] repareras</String>
189 <String Id="ProgressDlgTextRemoving" Overridable="yes">Vänta medan [ProductName] tas bort av installationsguiden.</String>
190 <String Id="ProgressDlgTitleRemoving" Overridable="yes">{\WixUI_Font_Title}[ProductName] tas bort</String>
191 <String Id="ProgressDlgTextUpdating" Overridable="yes">Vänta medan [ProductName] uppdateras.</String>
192 <String Id="ProgressDlgTitleUpdating" Overridable="yes">{\WixUI_Font_Title}[ProductName] uppdateras</String>
193 <String Id="ProgressDlgProgressBar" Overridable="yes">Filöverföringen är klar</String>
194 <String Id="ProgressDlgStatusLabel" Overridable="yes">Status:</String>
195
196 <String Id="ResumeDlg_Title" Overridable="yes">Installationsguiden för [ProductName]</String>
197 <String Id="ResumeDlgInstall" Overridable="yes">&amp;Installera</String>
198 <String Id="ResumeDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
199 <String Id="ResumeDlgDescription" Overridable="yes">Installationsguiden slutför installationen av [ProductName] på datorn. Klicka på Installera om du vill fortsätta eller på Avbryt om du vill avsluta installationsguiden.</String>
200 <String Id="ResumeDlgTitle" Overridable="yes">{\WixUI_Font_Bigger}Installationen av [ProductName] återupptas</String>
201
202 <String Id="SetupTypeDlg_Title" Overridable="yes">Installationsguiden för [ProductName]</String>
203 <String Id="SetupTypeDlgTypicalButton" Overridable="yes">S&amp;tandard</String>
204 <String Id="SetupTypeDlgTypicalButtonTooltip" Overridable="yes">Standardinstallation</String>
205 <String Id="SetupTypeDlgCustomButton" Overridable="yes">Anpassa&amp;d</String>
206 <String Id="SetupTypeDlgCustomButtonTooltip" Overridable="yes">Anpassad installation</String>
207 <String Id="SetupTypeDlgCompleteButton" Overridable="yes">F&amp;ullständig</String>
208 <String Id="SetupTypeDlgCompleteButtonTooltip" Overridable="yes">Fullständig installation</String>
209 <String Id="SetupTypeDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
210 <String Id="SetupTypeDlgTitle" Overridable="yes">{\WixUI_Font_Title}Välj installationstyp</String>
211 <String Id="SetupTypeDlgDescription" Overridable="yes">Välj den installationstyp som passar dig bäst</String>
212 <String Id="SetupTypeDlgTypicalText" Overridable="yes">Installerar de vanligaste programfunktionerna. Rekommenderas för de flesta användare.</String>
213 <String Id="SetupTypeDlgCustomText" Overridable="yes">Användaren kan välja vilka programfunktioner som ska installeras och var de ska installeras. Rekommenderas för avancerade användare.</String>
214 <String Id="SetupTypeDlgCompleteText" Overridable="yes">Alla program installeras. Kräver mest diskutrymme.</String>
215
216 <String Id="UserExit_Title" Overridable="yes">Installationsguiden för [ProductName]</String>
217 <String Id="UserExitBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
218 <String Id="UserExitTitle" Overridable="yes">{\WixUI_Font_Bigger}Installationsguiden för [ProductName] avbröts</String>
219 <String Id="UserExitDescription1" Overridable="yes">Installationen av [ProductName] avbröts. Systemet har inte ändrats. Om du vill installera programmet vid ett senare tillfälle kan du köra installationsprogrammet igen.</String>
220 <String Id="UserExitDescription2" Overridable="yes">Klicka på Slutför om du vill avsluta installationsguiden.</String>
221
222 <String Id="VerifyReadyDlg_Title" Overridable="yes">Installationsguiden för [ProductName]</String>
223 <String Id="VerifyReadyDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
224 <String Id="VerifyReadyDlgInstall" Overridable="yes">&amp;Installera</String>
225 <String Id="VerifyReadyDlgInstallText" Overridable="yes">Klicka på Installera om du vill påbörja installationen. Klicka på Föregående om du vill granska eller ändra någon installationsinställning. Klicka på Avbryt om du vill avsluta guiden.</String>
226 <String Id="VerifyReadyDlgInstallTitle" Overridable="yes">{\WixUI_Font_Title}Klart för installation av [ProductName]</String>
227 <String Id="VerifyReadyDlgChange" Overridable="yes">&amp;Ändra</String>
228 <String Id="VerifyReadyDlgChangeText" Overridable="yes">Klicka på Ändra om du vill påbörja installationen. Klicka på Föregående om du vill granska eller ändra någon installationsinställning. Klicka på Avbryt om du vill avsluta guiden.</String>
229 <String Id="VerifyReadyDlgChangeTitle" Overridable="yes">{\WixUI_Font_Title}Klart för ändring av [ProductName]</String>
230 <String Id="VerifyReadyDlgRepair" Overridable="yes">Re&amp;parera</String>
231 <String Id="VerifyReadyDlgRepairText" Overridable="yes">Klicka på Reparera om du vill reparera installationen av [ProductName]. Klicka på Föregående om du vill granska eller ändra någon installationsinställning. Klicka på Avbryt om du vill avsluta guiden.</String>
232 <String Id="VerifyReadyDlgRepairTitle" Overridable="yes">{\WixUI_Font_Title}Klart för reparation av [ProductName]</String>
233 <String Id="VerifyReadyDlgRemove" Overridable="yes">&amp;Ta bort</String>
234 <String Id="VerifyReadyDlgRemoveText" Overridable="yes">Klicka på Ta bort om du vill ta bort [ProductName] från datorn. Klicka på Föregående om du vill granska eller ändra någon installationsinställning. Klicka på Avbryt om du vill avsluta guiden.</String>
235 <String Id="VerifyReadyDlgRemoveTitle" Overridable="yes">{\WixUI_Font_Title}Klart för borttagning av [ProductName]</String>
236 <String Id="VerifyReadyDlgUpdate" Overridable="yes">&amp;Uppdatera</String>
237 <String Id="VerifyReadyDlgUpdateText" Overridable="yes">Klicka på Uppdatera om du vill uppdatera [ProductName] på datorn. Klicka på Föregående om du vill granska eller ändra någon installationsinställning. Klicka på Avbryt om du vill avsluta guiden.</String>
238 <String Id="VerifyReadyDlgUpdateTitle" Overridable="yes">{\WixUI_Font_Title}Klart för uppdatering av [ProductName]</String>
239
240 <String Id="WaitForCostingDlg_Title" Overridable="yes">Installationsguiden för [ProductName]</String>
241 <String Id="WaitForCostingDlgReturn" Overridable="yes">&amp;Återgå</String>
242 <String Id="WaitForCostingDlgText" Overridable="yes">Vänta medan installationsprogrammet kontrollerar hur mycket diskutrymme som krävs.</String>
243 <String Id="WaitForCostingDlgIcon" Overridable="yes">WixUI_Ico_Exclam</String>
244 <String Id="WaitForCostingDlgIconTooltip" Overridable="yes">Utropstecken</String>
245
246 <String Id="WelcomeDlg_Title" Overridable="yes">Installationsguiden för [ProductName]</String>
247 <String Id="WelcomeDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
248 <String Id="WelcomeDlgDescription" Overridable="yes">[ProductName] installeras på datorn. Klicka på Nästa om du vill fortsätta eller på Avbryt om du vill avsluta installationsguiden.</String>
249 <String Id="WelcomeUpdateDlgDescriptionUpdate" Overridable="yes">[ProductName] uppdateras på datorn. Klicka på Nästa om du vill fortsätta eller på Avbryt om du vill avsluta installationsguiden.</String>
250 <String Id="WelcomeDlgTitle" Overridable="yes">{\WixUI_Font_Bigger}Välkommen till installationsguiden för [ProductName]</String>
251
252 <String Id="WelcomeEulaDlg_Title" Overridable="yes">Installationsguiden för [ProductName]</String>
253 <String Id="WelcomeEulaDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
254 <String Id="WelcomeEulaDlgLicenseAcceptedCheckBox" Overridable="yes">Jag &amp;accepterar villkoren i licensavtalet</String>
255 <String Id="WelcomeEulaDlgInstall" Overridable="yes">&amp;Installera</String>
256 <String Id="WelcomeEulaDlgUpdate" Overridable="yes">&amp;Uppdatera</String>
257 <String Id="WelcomeEulaDlgTitle" Overridable="yes">{\WixUI_Font_Title}Läs licensavtalet för [ProductName]</String>
258
259 <String Id="ProgressTextInstallValidate" Overridable="yes">Installationen kontrolleras</String>
260 <String Id="ProgressTextInstallFiles" Overridable="yes">Nya filer kopieras</String>
261 <String Id="ProgressTextInstallFilesTemplate" Overridable="yes">Fil: [1], katalog: [9], storlek: [6]</String>
262 <String Id="ProgressTextInstallAdminPackage" Overridable="yes">Filer för nätverksinstallation kopieras</String>
263 <String Id="ProgressTextInstallAdminPackageTemplate" Overridable="yes">Fil: [1], katalog: [9], storlek: [6]</String>
264 <String Id="ProgressTextFileCost" Overridable="yes">Utrymmeskrav beräknas</String>
265 <String Id="ProgressTextCostInitialize" Overridable="yes">Utrymmeskrav beräknas</String>
266 <String Id="ProgressTextCostFinalize" Overridable="yes">Utrymmeskrav beräknas</String>
267 <String Id="ProgressTextCreateShortcuts" Overridable="yes">Genvägar skapas</String>
268 <String Id="ProgressTextCreateShortcutsTemplate" Overridable="yes">Genväg: [1]</String>
269 <String Id="ProgressTextPublishComponents" Overridable="yes">Kvalificerade komponenter publiceras</String>
270 <String Id="ProgressTextPublishComponentsTemplate" Overridable="yes">Komponent-ID: [1], kvalificerare: [2]</String>
271 <String Id="ProgressTextPublishFeatures" Overridable="yes">Produktfunktioner publiceras</String>
272 <String Id="ProgressTextPublishFeaturesTemplate" Overridable="yes">Funktion: [1]</String>
273 <String Id="ProgressTextPublishProduct" Overridable="yes">Produktinformation publiceras</String>
274 <String Id="ProgressTextRegisterClassInfo" Overridable="yes">Klasservrar registreras</String>
275 <String Id="ProgressTextRegisterClassInfoTemplate" Overridable="yes">Klass-ID: [1]</String>
276 <String Id="ProgressTextRegisterExtensionInfo" Overridable="yes">Tilläggsservrar registreras</String>
277 <String Id="ProgressTextRegisterExtensionInfoTemplate" Overridable="yes">Tillägg: [1]</String>
278 <String Id="ProgressTextRegisterMIMEInfo" Overridable="yes">MIME-information registreras</String>
279 <String Id="ProgressTextRegisterMIMEInfoTemplate" Overridable="yes">MIME-innehållstyp: [1], tillägg: [2]</String>
280 <String Id="ProgressTextRegisterProgIdInfo" Overridable="yes">Programidentifierare registreras</String>
281 <String Id="ProgressTextRegisterProgIdInfoTemplate" Overridable="yes">Program-ID: [1]</String>
282 <String Id="ProgressTextAllocateRegistrySpace" Overridable="yes">Registerutrymme allokeras</String>
283 <String Id="ProgressTextAllocateRegistrySpaceTemplate" Overridable="yes">Tillgängligt utrymme: [1]</String>
284 <String Id="ProgressTextAppSearch" Overridable="yes">Sökning efter installerade program sker</String>
285 <String Id="ProgressTextAppSearchTemplate" Overridable="yes">Egenskap: [1], signatur: [2]</String>
286 <String Id="ProgressTextBindImage" Overridable="yes">Körbara filer binds</String>
287 <String Id="ProgressTextBindImageTemplate" Overridable="yes">Fil: [1]</String>
288 <String Id="ProgressTextCCPSearch" Overridable="yes">Söker efter kvalificerande produkter</String>
289 <String Id="ProgressTextCreateFolders" Overridable="yes">Mappar skapas</String>
290 <String Id="ProgressTextCreateFoldersTemplate" Overridable="yes">Mapp: [1]</String>
291 <String Id="ProgressTextDeleteServices" Overridable="yes">Tjänster tas bort</String>
292 <String Id="ProgressTextDeleteServicesTemplate" Overridable="yes">Tjänst: [1]</String>
293 <String Id="ProgressTextDuplicateFiles" Overridable="yes">Dubblettfiler skapas</String>
294 <String Id="ProgressTextDuplicateFilesTemplate" Overridable="yes">Fil: [1], katalog: [9], storlek: [6]</String>
295 <String Id="ProgressTextFindRelatedProducts" Overridable="yes">Söker efter relaterade program</String>
296 <String Id="ProgressTextFindRelatedProductsTemplate" Overridable="yes">Följande program hittades: [1]</String>
297 <String Id="ProgressTextInstallODBC" Overridable="yes">ODBC-komponenter installeras</String>
298 <String Id="ProgressTextInstallServices" Overridable="yes">Nya tjänster installeras</String>
299 <String Id="ProgressTextInstallServicesTemplate" Overridable="yes">Tjänst: [2]</String>
300 <String Id="ProgressTextLaunchConditions" Overridable="yes">Startförhållanden utvärderas</String>
301 <String Id="ProgressTextMigrateFeatureStates" Overridable="yes">Funktionstillstånd flyttas över från relaterade program</String>
302 <String Id="ProgressTextMigrateFeatureStatesTemplate" Overridable="yes">Program: [1]</String>
303 <String Id="ProgressTextMoveFiles" Overridable="yes">Filer flyttas</String>
304 <String Id="ProgressTextMoveFilesTemplate" Overridable="yes">Fil: [1], katalog: [9], storlek: [6]</String>
305 <String Id="ProgressTextPatchFiles" Overridable="yes">Filer korrigeras</String>
306 <String Id="ProgressTextPatchFilesTemplate" Overridable="yes">Fil: [1], katalog: [2], storlek: [3]</String>
307 <String Id="ProgressTextProcessComponents" Overridable="yes">Komponentregistrering uppdateras</String>
308 <String Id="ProgressTextRegisterComPlus" Overridable="yes">Program och komponenter för COM+ registreras</String>
309 <String Id="ProgressTextRegisterComPlusTemplate" Overridable="yes">Program-ID: [1]{{, programtyp: [2], användare: [3], RSN: [4]}}</String>
310 <String Id="ProgressTextRegisterFonts" Overridable="yes">Teckensnitt registreras</String>
311 <String Id="ProgressTextRegisterFontsTemplate" Overridable="yes">Teckensnitt: [1]</String>
312 <String Id="ProgressTextRegisterProduct" Overridable="yes">Produkten registreras</String>
313 <String Id="ProgressTextRegisterProductTemplate" Overridable="yes">[1]</String>
314 <String Id="ProgressTextRegisterTypeLibraries" Overridable="yes">Typbibliotek registreras</String>
315 <String Id="ProgressTextRegisterTypeLibrariesTemplate" Overridable="yes">Biblioteks-ID: [1]</String>
316 <String Id="ProgressTextRegisterUser" Overridable="yes">Användare registreras</String>
317 <String Id="ProgressTextRegisterUserTemplate" Overridable="yes">[1]</String>
318 <String Id="ProgressTextRemoveDuplicateFiles" Overridable="yes">Dubblettfiler tas bort</String>
319 <String Id="ProgressTextRemoveDuplicateFilesTemplate" Overridable="yes">Fil: [1], katalog: [9]</String>
320 <String Id="ProgressTextRemoveEnvironmentStrings" Overridable="yes">Miljövariabler uppdateras</String>
321 <String Id="ProgressTextRemoveEnvironmentStringsTemplate" Overridable="yes">Namn: [1], värde: [2], åtgärd: [3]</String>
322 <String Id="ProgressTextRemoveExistingProducts" Overridable="yes">Program tas bort</String>
323 <String Id="ProgressTextRemoveExistingProductsTemplate" Overridable="yes">Program: [1], kommandorad: [2]</String>
324 <String Id="ProgressTextRemoveFiles" Overridable="yes">Filer tas bort</String>
325 <String Id="ProgressTextRemoveFilesTemplate" Overridable="yes">Fil: [1], katalog: [9]</String>
326 <String Id="ProgressTextRemoveFolders" Overridable="yes">Mappar tas bort</String>
327 <String Id="ProgressTextRemoveFoldersTemplate" Overridable="yes">Mapp: [1]</String>
328 <String Id="ProgressTextRemoveIniValues" Overridable="yes">INI-filsposter tas bort</String>
329 <String Id="ProgressTextRemoveIniValuesTemplate" Overridable="yes">Fil: [1], avsnitt: [2], nyckel: [3], värde: [4]</String>
330 <String Id="ProgressTextRemoveODBC" Overridable="yes">ODBC-komponenter tas bort</String>
331 <String Id="ProgressTextRemoveRegistryValues" Overridable="yes">Systemregistervärden tas bort</String>
332 <String Id="ProgressTextRemoveRegistryValuesTemplate" Overridable="yes">Nyckel: [1], namn: [2]</String>
333 <String Id="ProgressTextRemoveShortcuts" Overridable="yes">Genvägar tas bort</String>
334 <String Id="ProgressTextRemoveShortcutsTemplate" Overridable="yes">Genväg: [1]</String>
335 <String Id="ProgressTextRMCCPSearch" Overridable="yes">Söker efter kvalificerande produkter</String>
336 <String Id="ProgressTextSelfRegModules" Overridable="yes">Moduler registreras</String>
337 <String Id="ProgressTextSelfRegModulesTemplate" Overridable="yes">Fil: [1], mapp: [2]</String>
338 <String Id="ProgressTextSelfUnregModules" Overridable="yes">Moduler avregistreras</String>
339 <String Id="ProgressTextSelfUnregModulesTemplate" Overridable="yes">Fil: [1], mapp: [2]</String>
340 <String Id="ProgressTextSetODBCFolders" Overridable="yes">ODBC-kataloger initieras</String>
341 <String Id="ProgressTextStartServices" Overridable="yes">Tjänster startas</String>
342 <String Id="ProgressTextStartServicesTemplate" Overridable="yes">Tjänst: [1]</String>
343 <String Id="ProgressTextStopServices" Overridable="yes">Tjänster stoppas</String>
344 <String Id="ProgressTextStopServicesTemplate" Overridable="yes">Tjänst: [1]</String>
345 <String Id="ProgressTextUnpublishComponents" Overridable="yes">Kvalificerade komponenter avpubliceras</String>
346 <String Id="ProgressTextUnpublishComponentsTemplate" Overridable="yes">Komponent-ID: [1], kvalificerare: [2]</String>
347 <String Id="ProgressTextUnpublishFeatures" Overridable="yes">Produktfunktioner avpubliceras</String>
348 <String Id="ProgressTextUnpublishFeaturesTemplate" Overridable="yes">Funktion: [1]</String>
349 <String Id="ProgressTextUnregisterClassInfo" Overridable="yes">Klasservrar avregistreras</String>
350 <String Id="ProgressTextUnregisterClassInfoTemplate" Overridable="yes">Klass-ID: [1]</String>
351 <String Id="ProgressTextUnregisterComPlus" Overridable="yes">COM+-program och -komponenter avregistreras</String>
352 <String Id="ProgressTextUnregisterComPlusTemplate" Overridable="yes">Program-Id: [1]{{, Programtyp: [2]}}</String>
353 <String Id="ProgressTextUnregisterExtensionInfo" Overridable="yes">Tilläggsservrar avregistreras</String>
354 <String Id="ProgressTextUnregisterExtensionInfoTemplate" Overridable="yes">Tillägg: [1]</String>
355 <String Id="ProgressTextUnregisterFonts" Overridable="yes">Teckensnitt avregistreras</String>
356 <String Id="ProgressTextUnregisterFontsTemplate" Overridable="yes">Teckensnitt: [1]</String>
357 <String Id="ProgressTextUnregisterMIMEInfo" Overridable="yes">MIME-information avregistreras</String>
358 <String Id="ProgressTextUnregisterMIMEInfoTemplate" Overridable="yes">MIME-innehållstyp: [1], tillägg: [2]</String>
359 <String Id="ProgressTextUnregisterProgIdInfo" Overridable="yes">Programidentifierare avregistreras</String>
360 <String Id="ProgressTextUnregisterProgIdInfoTemplate" Overridable="yes">Program-ID: [1]</String>
361 <String Id="ProgressTextUnregisterTypeLibraries" Overridable="yes">Typbibliotek avregistreras</String>
362 <String Id="ProgressTextUnregisterTypeLibrariesTemplate" Overridable="yes">Biblioteks-ID: [1]</String>
363 <String Id="ProgressTextWriteEnvironmentStrings" Overridable="yes">Miljövariabler uppdateras</String>
364 <String Id="ProgressTextWriteEnvironmentStringsTemplate" Overridable="yes">Namn: [1], värde: [2], åtgärd: [3]</String>
365 <String Id="ProgressTextWriteIniValues" Overridable="yes">Värden i INI-filer skrivs</String>
366 <String Id="ProgressTextWriteIniValuesTemplate" Overridable="yes">Fil: [1], avsnitt: [2], nyckel: [3], värde: [4]</String>
367 <String Id="ProgressTextWriteRegistryValues" Overridable="yes">Värden skrivs till systemregistret</String>
368 <String Id="ProgressTextWriteRegistryValuesTemplate" Overridable="yes">Nyckel: [1], namn: [2], värde: [3]</String>
369 <String Id="ProgressTextAdvertise" Overridable="yes">Programmet annonseras</String>
370 <String Id="ProgressTextGenerateScript" Overridable="yes">Skriptåtgärder skapas:</String>
371 <String Id="ProgressTextGenerateScriptTemplate" Overridable="yes">[1]</String>
372 <String Id="ProgressTextInstallSFPCatalogFile" Overridable="yes">Installerar systemkatalog</String>
373 <String Id="ProgressTextInstallSFPCatalogFileTemplate" Overridable="yes">Fil: [1], Beroenden:[2]</String>
374 <String Id="ProgressTextMsiPublishAssemblies" Overridable="yes">Sammansättningsinformation publiceras</String>
375 <String Id="ProgressTextMsiPublishAssembliesTemplate" Overridable="yes">Programkontext:[1], sammansättningsnamn:[2]</String>
376 <String Id="ProgressTextMsiUnpublishAssemblies" Overridable="yes">Sammansättningsinformation avpubliceras</String>
377 <String Id="ProgressTextMsiUnpublishAssembliesTemplate" Overridable="yes">Programkontext:[1], sammansättningsnamn:[2]</String>
378 <String Id="ProgressTextRollback" Overridable="yes">Följande åtgärd ångras:</String>
379 <String Id="ProgressTextRollbackTemplate" Overridable="yes">[1]</String>
380 <String Id="ProgressTextRollbackCleanup" Overridable="yes">Säkerhetskopierade filer tas bort</String>
381 <String Id="ProgressTextRollbackCleanupTemplate" Overridable="yes">Fil: [1]</String>
382 <String Id="ProgressTextUnmoveFiles" Overridable="yes">Flyttade filer tas bort</String>
383 <String Id="ProgressTextUnmoveFilesTemplate" Overridable="yes">Fil: [1], katalog: [9]</String>
384 <String Id="ProgressTextUnpublishProduct" Overridable="yes">Produktinformation avpubliceras</String>
385
386 <String Id="Error0" Overridable="yes">{{Oåterkalleligt fel: }}</String>
387 <String Id="Error1" Overridable="yes">{{Fel [1]. }}</String>
388 <String Id="Error2" Overridable="yes">Varning [1]. </String>
389 <String Id="Error4" Overridable="yes">Information [1]. </String>
390 <String Id="Error5" Overridable="yes">Ett oväntat fel uppstod när det här paketet installerades. Detta kan tyda på ett problem med paketet. Felkod: [1]. {{Argument: [2], [3], [4]}}</String>
391 <String Id="Error7" Overridable="yes">{{Disken är full: }}</String>
392 <String Id="Error8" Overridable="yes">Åtgärd [Time]: [1]. [2]</String>
393 <String Id="Error9" Overridable="yes">[ProductName]</String>
394 <String Id="Error10" Overridable="yes">{[2]}{, [3]}{, [4]}</String>
395 <String Id="Error11" Overridable="yes">Meddelandetyp: [1], Argument: [2]</String>
396 <String Id="Error12" Overridable="yes">=== Loggningen startades: [Date] [Time] ===</String>
397 <String Id="Error13" Overridable="yes">=== Loggningen avslutades: [Date] [Time] ===</String>
398 <String Id="Error14" Overridable="yes">Åtgärden startades [Time]: [1].</String>
399 <String Id="Error15" Overridable="yes">Åtgärden avslutades [Time]: [1]. Returvärde [2].</String>
400 <String Id="Error16" Overridable="yes">Återstående tid: {[1] minuter }{[2] sekunder}</String>
401 <String Id="Error17" Overridable="yes">Slut på minne. Stäng andra program innan du försöker igen.</String>
402 <String Id="Error18" Overridable="yes">Installationsprogrammet svarar inte.</String>
403 <String Id="Error19" Overridable="yes">Installationsprogrammet stoppades för tidigt.</String>
404 <String Id="Error20" Overridable="yes">Vänta medan [ProductName] konfigureras</String>
405 <String Id="Error21" Overridable="yes">Nödvändig information samlas in...</String>
406 <String Id="Error22" Overridable="yes">Äldre versioner av programmet tas bort...</String>
407 <String Id="Error23" Overridable="yes">Borttagning av äldre versioner av programmet förbereds...</String>
408 <String Id="Error32" Overridable="yes">Installationen av {[ProductName] } slutfördes.</String>
409 <String Id="Error33" Overridable="yes">Installationen av {[ProductName] } misslyckades.</String>
410 <String Id="Error1101" Overridable="yes">Det gick inte att läsa från filen: [2]. {{Systemfel [3].}} Kontrollera att filen finns och att du har behörighet till den.</String>
411 <String Id="Error1301" Overridable="yes">Det går inte att skapa filen [2]. Det finns redan en katalog med det namnet. Avbryt installationen och försök installera på en annan plats.</String>
412 <String Id="Error1302" Overridable="yes">Sätt i disken: [2]</String>
413 <String Id="Error1303" Overridable="yes">Användaren som installerar har otillräckliga privilegier till den här katalogen: [2]. Det går inte att fortsätta installationen. Logga in som administratör eller kontakta systemadministratören.</String>
414 <String Id="Error1304" Overridable="yes">Det gick inte att skriva till filen: [2]. Kontrollera att du har behörighet till katalogen.</String>
415 <String Id="Error1305" Overridable="yes">Det gick inte att läsa från filen: [2]. {{Systemfel [3].}} Kontrollera att filen finns och att du har behörighet till den.</String>
416 <String Id="Error1306" Overridable="yes">Ett annat program har exklusiv åtkomst till filen [2]. Stäng alla andra program och klicka sedan på Försök igen.</String>
417 <String Id="Error1307" Overridable="yes">Det finns inte tillräckligt med diskutrymme för att installera filen [2]. Frigör diskutrymme och klicka på Försök igen eller klicka på Avbryt om du vill avsluta.</String>
418 <String Id="Error1308" Overridable="yes">Det gick inte att hitta källfilen: [2]. Kontrollera att filen finns och att du har behörighet till den.</String>
419 <String Id="Error1309" Overridable="yes">Det gick inte att läsa från filen: [3]. {{Systemfel [2].}} Kontrollera att filen finns och att du har behörighet till den.</String>
420 <String Id="Error1310" Overridable="yes">Det gick inte att skriva till filen: [3]. {{Systemfel [2].}} Kontrollera att du har behörighet till den katalogen.</String>
421 <String Id="Error1311" Overridable="yes">Det gick inte att hitta källfilen{{(kabinett)}}: [2]. Kontrollera att filen finns och att du har behörighet till den.</String>
422 <String Id="Error1312" Overridable="yes">Det går inte att skapa katalogen [2]. En fil med det namnet finns redan. Byt namn eller ta bort filen och klicka på Försök igen eller klicka på Avbryt om du vill avsluta.</String>
423 <String Id="Error1313" Overridable="yes">Volymen [2] är inte tillgänglig. Välj en annan volym.</String>
424 <String Id="Error1314" Overridable="yes">Den angivna sökvägen [2] är inte tillgänglig.</String>
425 <String Id="Error1315" Overridable="yes">Det går inte att skriva till den angivna mappen: [2].</String>
426 <String Id="Error1316" Overridable="yes">Ett nätverksfel uppstod vid försök att läsa från följande fil: [2]</String>
427 <String Id="Error1317" Overridable="yes">Ett fel uppstod när följande katalog skulle skapas: [2]</String>
428 <String Id="Error1318" Overridable="yes">Ett nätverksfel uppstod vid försök att skapa följande katalog: [2]</String>
429 <String Id="Error1319" Overridable="yes">Ett nätverksfel uppstod vid försök att öppna följande källfilskabinett: [2]</String>
430 <String Id="Error1320" Overridable="yes">Den angivna sökvägen är för lång: [2]</String>
431 <String Id="Error1321" Overridable="yes">Den användare som installerar har inte privilegier att ändra den här filen: [2].</String>
432 <String Id="Error1322" Overridable="yes">En del av sökvägen [2] är ogiltig. Antingen så är den tom eller så överskrids den tillåtna maxlängden för systemet.</String>
433 <String Id="Error1323" Overridable="yes">Mappsökvägen [2] innehåller ord som är ogiltiga i mappsökvägar.</String>
434 <String Id="Error1324" Overridable="yes">Mappsökvägen [2] innehåller ett ogiltigt tecken.</String>
435 <String Id="Error1325" Overridable="yes">[2] är inte ett giltigt kort filnamn.</String>
436 <String Id="Error1326" Overridable="yes">Det gick inte att läsa filsäkerhet: [3] GetLastError: [2]</String>
437 <String Id="Error1327" Overridable="yes">Ogiltig enhet: [2]</String>
438 <String Id="Error1328" Overridable="yes">Det gick inte att tillämpa en korrigering på filen [2]. Antagligen har den redan uppdaterats på annat sätt och kan därför inte längre uppdateras av den här snabbkorrigeringen. Kontakta utgivaren av korrigeringen för mer information. {{Systemfel: [3]}}</String>
439 <String Id="Error1329" Overridable="yes">En fil som krävs kan inte installeras eftersom kabinettfilen [2] inte är digitalt signerad. Detta kan betyda att kabinettfilen är skadad.</String>
440 <String Id="Error1330" Overridable="yes">En fil som krävs kan inte installeras eftersom kabinettfilen [2] har en ogiltig digital signatur. Detta kan tyda på att kabinettfilen är skadad.{{ Fel [3] returnerades av WinVerifyTrust.}}</String>
441 <String Id="Error1331" Overridable="yes">Det gick inte att kopiera filen [2]: CRC-fel.</String>
442 <String Id="Error1332" Overridable="yes">Det gick inte att flytta filen [2]: CRC-fel.</String>
443 <String Id="Error1333" Overridable="yes">Det gick inte att korrigera filen [2]: CRC-fel.</String>
444 <String Id="Error1334" Overridable="yes">Filen [2] kan inte installeras eftersom filen inte kan hittas i kabinettfilen [3]. Detta kan tyda på ett nätverksfel, ett problem med att läsa från CD:n eller ett fel i paketet.</String>
445 <String Id="Error1335" Overridable="yes">Kabinettfilen [2] som krävs för installationen är skadad och kan inte användas. Detta kan tyda på ett nätverksfel, ett problem med att läsa från CD:n eller ett fel i paketet.</String>
446 <String Id="Error1336" Overridable="yes">Ett fel uppstod när en temporär fil som krävs för att slutföra installationen skulle skapas.{{ Mapp: [3]. Systemfel: [2]}}</String>
447 <String Id="Error1401" Overridable="yes">Det gick inte att skapa nyckeln [2]. {{Systemfel [3].}} Kontrollera att du har tillräcklig behörighet till nyckeln eller kontakta support. </String>
448 <String Id="Error1402" Overridable="yes">Det gick inte att öppna nyckeln: [2]. {{Systemfel [3].}} Kontrollera att du har behörighet till nyckeln eller kontakta support. </String>
449 <String Id="Error1403" Overridable="yes">Det gick inte att ta bort värdet [2] från nyckeln [3]. {{Systemfel [4].}} Kontrollera att du har behörighet till nyckeln eller kontakta support. </String>
450 <String Id="Error1404" Overridable="yes">Det gick inte att ta bort nyckeln [2]. {{Systemfel [3].}} Kontrollera att du har behörighet till nyckeln eller kontakta support. </String>
451 <String Id="Error1405" Overridable="yes">Det gick inte att läsa värdet [2] i nyckeln [3]. {{Systemfel [4].}} Kontrollera att du har behörighet till nyckeln eller kontakta support. </String>
452 <String Id="Error1406" Overridable="yes">Det gick inte att skriva värdet [2] till nyckeln [3]. {{Systemfel [4].}} Kontrollera att du har behörighet till nyckeln eller kontakta support.</String>
453 <String Id="Error1407" Overridable="yes">Det gick inte att hämta värdenamn för nyckeln [2]. {{Systemfel [3].}} Kontrollera att du har behörighet till nyckeln eller kontakta support.</String>
454 <String Id="Error1408" Overridable="yes">Det gick inte att hämta undernyckelnamn för nyckeln [2]. {{Systemfel [3].}} Kontrollera att du har behörighet till nyckeln eller kontakta support.</String>
455 <String Id="Error1409" Overridable="yes">Det gick inte att hämta säkerhetsinformation för nyckeln [2]. {{Systemfel [3].}} Kontrollera att du har behörighet till nyckeln eller kontakta support.</String>
456 <String Id="Error1410" Overridable="yes">Det gick inte att öka registerutrymmet. Det krävs [2] kB ledigt registerutrymme för att installera det här programmet.</String>
457 <String Id="Error1500" Overridable="yes">En annan installation pågår. Du måste slutföra den installationen innan du fortsätter med den här.</String>
458 <String Id="Error1501" Overridable="yes">Det gick inte att komma åt säkerställda data. Kontrollera att installationsprogrammet Windows Installer är korrekt konfigurerat och försök installera igen.</String>
459 <String Id="Error1502" Overridable="yes">Användaren [2] har tidigare påbörjat en installation av produkten [3]. Den användaren måste köra installationen igen för att kunna använda produkten. Den aktuella installationen fortsätter nu.</String>
460 <String Id="Error1503" Overridable="yes">Användaren [2] har tidigare påbörjat en installation av produkten [3]. Den användaren måste köra installationen igen för att kunna använda produkten.</String>
461 <String Id="Error1601" Overridable="yes">Slut på diskutrymme -- Volym: [2]; nödvändigt utrymme: [3] kB; tillgängligt utrymme: [4] kB. Frigör diskutrymme och försök igen.</String>
462 <String Id="Error1602" Overridable="yes">Vill du avbryta?</String>
463 <String Id="Error1603" Overridable="yes">Filen [2][3] används{ av följande process: Namn: [4], ID: [5], fönsternamn: [6]}. Stäng programmet och försök igen.</String>
464 <String Id="Error1604" Overridable="yes">Det går inte att installera den här produkten eftersom produkten [2] redan är installerad. De här två produkterna är inkompatibla.</String>
465 <String Id="Error1605" Overridable="yes">Det finns inte tillräckligt med diskutrymme på volymen [2] för att fortsätta installera med återställning aktiverat. [3] kB krävs men bara [4] kB är tillgängligt. Klicka på Ignorera om du vill fortsätta installera utan att spara återställningsinformation, klicka på Försök igen om du vill kontrollera nödvändigt diskutrymme igen eller klicka på Avbryt om du vill avbryta installationen.</String>
466 <String Id="Error1606" Overridable="yes">Det gick inte att komma åt nätverksplatsen [2].</String>
467 <String Id="Error1607" Overridable="yes">Du bör stänga följande program innan du fortsätter med installationen:</String>
468 <String Id="Error1608" Overridable="yes">Det går inte att hitta några tidigare installerade kompatibla produkter på datorn för installation av den här produkten.</String>
469 <String Id="Error1609" Overridable="yes">Ett fel uppstod när säkerhetsinställningar skulle tillämpas. [2] är inte en giltig användare eller grupp. Detta kan tyda på ett problem med paketet eller med att ansluta till en domänkontrollant i nätverket. Kontrollera att nätverksanslutningen fungerar och klicka därefter på Försök igen eller klicka på Avbryt om du vill avbryta installationen. {{Det gick inte att hitta användarens SID, systemfel [3]}}</String>
470 <String Id="Error1701" Overridable="yes">Nyckeln [2] är ogiltig. Kontrollera att rätt nyckel har angetts.</String>
471 <String Id="Error1702" Overridable="yes">Datorn måste startas om innan konfigurationen av [2] kan fortsätta. Klicka på Ja om du vill starta om nu, eller på Nej om du vill starta om manuellt senare.</String>
472 <String Id="Error1703" Overridable="yes">Du måste starta om systemet för att konfigurationsändringarna som gjorts för [2] ska börja gälla. Klicka på Ja om du vill starta om nu, eller på Nej om du vill starta om manuellt senare.</String>
473 <String Id="Error1704" Overridable="yes">Installationen av [2] är tillfälligt avbruten. Du måste återställa de ändringar som har gjorts under den installationen för att kunna fortsätta. Vill du återställa ändringarna?</String>
474 <String Id="Error1705" Overridable="yes">En tidigare installation av den här produkten pågår. Du måste återställa de ändringar som har gjorts under den installationen för att kunna fortsätta. Vill du återställa ändringarna?</String>
475 <String Id="Error1706" Overridable="yes">Det gick inte att hitta ett installationspaket för produkten [2]. Försök installera igen med ett giltigt exemplar av installationspaketet [3].</String>
476 <String Id="Error1707" Overridable="yes">Installationen har slutförts.</String>
477 <String Id="Error1708" Overridable="yes">Installationen misslyckades.</String>
478 <String Id="Error1709" Overridable="yes">Produkt: [2] -- [3]</String>
479 <String Id="Error1710" Overridable="yes">Du kan antingen återställa datorn till dess tidigare tillstånd eller fortsätta installationen senare. Vill du återställa datorn?</String>
480 <String Id="Error1711" Overridable="yes">Ett fel uppstod när installationsinformation skrevs till disken. Kontrollera att det finns tillräckligt med diskutrymme och klicka på Försök igen eller klicka på Avbryt om du vill avsluta installationen.</String>
481 <String Id="Error1712" Overridable="yes">Det gick inte att hitta en eller flera av de filer som krävs för att återställa datorn. Det går inte att återställa.</String>
482 <String Id="Error1713" Overridable="yes">[2] kan inte installera en av de produkter som krävs. Kontakta teknisk support. {{Systemfel: [3].}}</String>
483 <String Id="Error1714" Overridable="yes">Den tidigare versionen av [2] kan inte tas bort. Kontakta teknisk support. {{Systemfel [3].}}</String>
484 <String Id="Error1715" Overridable="yes">[2] installerades</String>
485 <String Id="Error1716" Overridable="yes">[2] konfigurerades</String>
486 <String Id="Error1717" Overridable="yes">[2] togs bort</String>
487 <String Id="Error1718" Overridable="yes">Filen [2] nekades på grund av en princip för digitala signaturer.</String>
488 <String Id="Error1719" Overridable="yes">Tjänsten Windows Installer kunde inte användas. Detta kan ske om Windows körs i felsäkert läge eller om Windows Installer inte har installerats korrekt. Kontakta supportpersonal om du behöver hjälp.</String>
489 <String Id="Error1720" Overridable="yes">Ett problem har uppstått med det här Windows Installer-paketet. Ett skript som krävs för installationen kunde inte köras. Kontakta support eller paketleverantören. {{Egen åtgärd: [2], skriptfel: [3], [4]: [5] rad [6], kolumn [7], [8] }}</String>
490 <String Id="Error1721" Overridable="yes">Ett problem har uppstått med det här Windows Installer-paketet. Ett program som krävs för installationen kunde inte köras. Kontakta support eller paketets återförsäljare. {{Åtgärd: [2], plats: [3], kommando: [4] }}</String>
491 <String Id="Error1722" Overridable="yes">Ett problem har uppstått med det här Windows Installer-paketet. Ett program som körs under installationen slutfördes inte korrekt. Kontakta support eller paketleverantören. {{Åtgärd: [2], plats: [3], kommando: [4] }}</String>
492 <String Id="Error1723" Overridable="yes">Ett problem har uppstått med det här Windows Installer-paketet. En DLL-fil som krävs för installationen kunde inte köras. Kontakta support eller paketleverantören. {{Åtgärd: [2], plats: [3], bibliotek: [4] }}</String>
493 <String Id="Error1724" Overridable="yes">Borttagning har slutförts.</String>
494 <String Id="Error1725" Overridable="yes">Borttagning misslyckades.</String>
495 <String Id="Error1726" Overridable="yes">Annonsering har slutförts.</String>
496 <String Id="Error1727" Overridable="yes">Annonsering misslyckades.</String>
497 <String Id="Error1728" Overridable="yes">Konfigureringen har slutförts.</String>
498 <String Id="Error1729" Overridable="yes">Konfigureringen misslyckades.</String>
499 <String Id="Error1730" Overridable="yes">Du måste vara administratör för att kunna ta bort det här programmet. Logga in som administratör och försök igen eller kontakta teknisk support.</String>
500 <String Id="Error1731" Overridable="yes">Källinstallationspaketet för produkten [2] är inte synkroniserat med klientpaketet. Försök installera igen med ett giltigt exemplar av installationspaket [3].</String>
501 <String Id="Error1732" Overridable="yes">Du måste starta om datorn för att slutföra installationen av [2]. Andra användare är för tillfället inloggade på den här datorn. En omstart kan göra att hela eller delar av deras arbete går förlorat. Vill du starta om datorn nu?</String>
502 <String Id="Error1801" Overridable="yes">Sökvägen [2] är ogiltig. Ange en giltig sökväg.</String>
503 <String Id="Error1802" Overridable="yes">Slut på minne. Stäng andra program innan du försöker igen.</String>
504 <String Id="Error1803" Overridable="yes">Det finns ingen disk i enhet [2]. Sätt i en disk och klicka på Försök igen eller klicka på Avbryt om du vill gå tillbaka till den volym som angavs tidigare.</String>
505 <String Id="Error1804" Overridable="yes">Det finns ingen disk i enhet [2]. Sätt i en disk och klicka på Försök igen eller klicka på Avbryt om du vill gå tillbaka och välja en annan volym.</String>
506 <String Id="Error1805" Overridable="yes">Mappen [2] finns inte. Ange en sökväg till en befintlig mapp.</String>
507 <String Id="Error1806" Overridable="yes">Du har inte behörighet att läsa den här mappen.</String>
508 <String Id="Error1807" Overridable="yes">Det gick inte att bestämma en giltig målmapp för installationen.</String>
509 <String Id="Error1901" Overridable="yes">Det gick inte att läsa från källdatabasen för installation: [2].</String>
510 <String Id="Error1902" Overridable="yes">Omstart schemaläggs: ett filnamn ändras från [2] till [3]. En omstart krävs för att åtgärden ska slutföras.</String>
511 <String Id="Error1903" Overridable="yes">Omstart schemaläggs: filen [2] tas bort. En omstart krävs för att åtgärden ska slutföras.</String>
512 <String Id="Error1904" Overridable="yes">Det gick inte att registrera modulen [2]. HRESULT [3]. Kontakta support.</String>
513 <String Id="Error1905" Overridable="yes">Det gick inte att avregistrera modulen [2]. HRESULT [3]. Kontakta support.</String>
514 <String Id="Error1906" Overridable="yes">Det gick inte att cachelagra paketet [2]. Fel: [3]. Kontakta support.</String>
515 <String Id="Error1907" Overridable="yes">Det gick inte att registrera teckensnittet [2]. Kontrollera att du har behörighet att installera teckensnitt och att datorn stöder det här teckensnittet.</String>
516 <String Id="Error1908" Overridable="yes">Det gick inte att avregistrera teckensnittet [2]. Kontrollera att du har behörighet att ta bort teckensnitt.</String>
517 <String Id="Error1909" Overridable="yes">Det gick inte att skapa genvägen [2]. Kontrollera att målmappen finns och att du har behörighet till den.</String>
518 <String Id="Error1910" Overridable="yes">Det gick inte att ta bort genvägen [2]. Kontrollera att genvägsfilen finns och att du kan komma åt den.</String>
519 <String Id="Error1911" Overridable="yes">Det gick inte att registrera typbiblioteket för filen [2]. Kontakta support.</String>
520 <String Id="Error1912" Overridable="yes">Det gick inte att avregistrera typbiblioteket för filen [2]. Kontakta support.</String>
521 <String Id="Error1913" Overridable="yes">Det gick inte att uppdatera INI-filen [2][3]. Kontrollera att filen finns och att du har behörighet till den.</String>
522 <String Id="Error1914" Overridable="yes">Det gick inte att schemalägga att filen [2] ska ersätta filen [3] vid omstart. Kontrollera att du har behörighet att skriva till filen [3].</String>
523 <String Id="Error1915" Overridable="yes">Det gick inte att ta bort ODBC-drivrutinshanteraren, ODBC-fel [2]: [3]. Kontakta support.</String>
524 <String Id="Error1916" Overridable="yes">Det gick inte att installera ODBC-drivrutinshanteraren, ODBC-fel [2]: [3]. Kontakta support.</String>
525 <String Id="Error1917" Overridable="yes">Det gick inte att ta bort ODBC-drivrutinen [4], ODBC-fel [2]: [3]. Kontrollera att du har behörighet att ta bort ODBC-drivrutiner.</String>
526 <String Id="Error1918" Overridable="yes">Det gick inte att installera ODBC-drivrutinen [4], ODBC-fel [2]: [3]. Kontrollera att filen [4] finns och att du har behörighet till den.</String>
527 <String Id="Error1919" Overridable="yes">Det gick inte att konfigurera ODBC-datakällan [4], ODBC-fel [2]: [3]. Kontrollera att filen [4] finns och att du har behörighet till den.</String>
528 <String Id="Error1920" Overridable="yes">Det gick inte att starta tjänsten [2] ([3]). Kontrollera att du har tillräckliga privilegier för att starta systemtjänster.</String>
529 <String Id="Error1921" Overridable="yes">Det gick inte att stoppa tjänsten [2] ([3]). Kontrollera att du har tillräckliga privilegier för att stoppa systemtjänster.</String>
530 <String Id="Error1922" Overridable="yes">Det gick inte att ta bort tjänsten [2] ([3]). Kontrollera att du har tillräckliga privilegier för att ta bort systemtjänster.</String>
531 <String Id="Error1923" Overridable="yes">Det gick inte att installera tjänsten [2] ([3]). Kontrollera att du har tillräckliga privilegier för att installera systemtjänster.</String>
532 <String Id="Error1924" Overridable="yes">Det gick inte att uppdatera miljövariabeln [2]. Kontrollera att du har tillräckliga privilegier för att ändra miljövariabler.</String>
533 <String Id="Error1925" Overridable="yes">Du har inte tillräckliga privilegier för att slutföra installationen för alla användare på datorn. Logga in som administratör och försök installera igen.</String>
534 <String Id="Error1926" Overridable="yes">Det gick inte att ange filsäkerhet för filen [3]. Fel: [2]. Kontrollera att du har tillräckliga privilegier för att ändra säkerhetsbehörigheten för den här filen.</String>
535 <String Id="Error1927" Overridable="yes">Komponenttjänsterna (COM+ 1.0) har inte installerats på datorn. Den här installationen kan inte slutföras utan komponenttjänsterna. Komponenttjänsterna ingår i Windows 2000.</String>
536 <String Id="Error1928" Overridable="yes">Fel uppstod när COM+-programmet skulle registreras. Kontakta support för mer information.</String>
537 <String Id="Error1929" Overridable="yes">Fel uppstod när COM+-programmet skulle avregistreras. Kontakta support för mer information.</String>
538 <String Id="Error1930" Overridable="yes">Beskrivningen för tjänsten [2] ([3]) kunde inte ändras.</String>
539 <String Id="Error1931" Overridable="yes">Tjänsten Windows Installer kan inte uppdatera systemfilen [2] eftersom den skyddas av Windows. Du kanske måste uppdatera operativsystemet för att det här programmet ska fungera korrekt. {{Paketversion: [3], OS-skyddad version: [4]}}</String>
540 <String Id="Error1932" Overridable="yes">Tjänsten Windows Installer kan inte uppdatera den skyddade Windows-filen [2]. {{Paketversion: [3], OS-skyddad version: [4], SFP-fel: [5]}}</String>
541 <String Id="Error1933" Overridable="yes">Tjänsten Windows Installer kunde inte uppdatera en eller fler skyddade Windows-filer. {{SFP-fel: [2]. Skyddade filer:\r\n[3]}}</String>
542 <String Id="Error1934" Overridable="yes">Användarinstallationer har inaktiverats av en princip på datorn.</String>
543 <String Id="Error1935" Overridable="yes">Ett fel uppstod när paketet [6] skulle installeras. Se Hjälp och support för mer information. HRESULT: [3]. {{paketets gränssnitt: [4], funktion: [5], komponent: [2]}}</String>
544 <String Id="Error1936" Overridable="yes">Ett fel uppstod när paketet [6] skulle installeras. Paketet har inte ett starkt namn eller är inte signerad med minsta nyckellängd. HRESULT: [3]. {{paketets gränssnitt: [4], funktion: [5], komponent: [2]}}</String>
545 <String Id="Error1937" Overridable="yes">Ett fel uppstod när paketet [6] skulle installeras. Signaturen och/eller katalogen kunde inte bekräftas eller är inte giltiga. HRESULT: [3]. {{paketets gränssnitt: [4], funktion: [5], komponent: [2]}}</String>
546 <String Id="Error1938" Overridable="yes">Ett fel uppstod när paketet [6] skulle installeras. Det gick inte att hitta en eller flera moduler. HRESULT: [3]. {{paketets gränssnitt: [4], funktion: [5], komponent: [2]}}</String>
547
548 <String Id="UITextbytes" Overridable="yes">byte</String>
549 <String Id="UITextGB" Overridable="yes">GB</String>
550 <String Id="UITextKB" Overridable="yes">kB</String>
551 <String Id="UITextMB" Overridable="yes">MB</String>
552 <String Id="UITextMenuAbsent" Overridable="yes">Hela funktionen kommer att vara otillgänglig</String>
553 <String Id="UITextMenuAdvertise" Overridable="yes">Funktionen installeras vid behov</String>
554 <String Id="UITextMenuAllCD" Overridable="yes">Hela funktionen installeras för att köras från CD:n</String>
555 <String Id="UITextMenuAllLocal" Overridable="yes">Hela funktionen installeras på den lokala hårddisken</String>
556 <String Id="UITextMenuAllNetwork" Overridable="yes">Hela funktionen installeras för att köras från nätverket</String>
557 <String Id="UITextMenuCD" Overridable="yes">Installeras för att köras från CD:n</String>
558 <String Id="UITextMenuLocal" Overridable="yes">Installeras på den lokala hårddisken</String>
559 <String Id="UITextMenuNetwork" Overridable="yes">Installeras för att köras från nätverket</String>
560 <String Id="UITextNewFolder" Overridable="yes">Mapp|Ny mapp</String>
561 <String Id="UITextScriptInProgress" Overridable="yes">Nödvändig information samlas in...</String>
562 <String Id="UITextSelAbsentAbsent" Overridable="yes">Funktionen installeras inte</String>
563 <String Id="UITextSelAbsentAdvertise" Overridable="yes">Funktionen installeras vid behov</String>
564 <String Id="UITextSelAbsentCD" Overridable="yes">Funktionen installeras för att köras från CD:n</String>
565 <String Id="UITextSelAbsentLocal" Overridable="yes">Funktionen installeras på den lokala hårddisken</String>
566 <String Id="UITextSelAbsentNetwork" Overridable="yes">Funktionen installeras för att köras från nätverket</String>
567 <String Id="UITextSelAdvertiseAbsent" Overridable="yes">Funktionen kommer inte att vara tillgänglig</String>
568 <String Id="UITextSelAdvertiseAdvertise" Overridable="yes">Installeras vid behov</String>
569 <String Id="UITextSelAdvertiseCD" Overridable="yes">Funktionen kommer att kunna köras från CD:n</String>
570 <String Id="UITextSelAdvertiseLocal" Overridable="yes">Funktionen installeras på den lokala hårddisken</String>
571 <String Id="UITextSelAdvertiseNetwork" Overridable="yes">Funktionen kommer att kunna köras från nätverket</String>
572 <String Id="UITextSelCDAbsent" Overridable="yes">Funktionen avinstalleras fullständigt och du kommer inte att kunna köra den från CD:n</String>
573 <String Id="UITextSelCDAdvertise" Overridable="yes">Funktionen ändras från att kunna köras från CD:n till att installeras vid behov</String>
574 <String Id="UITextSelCDCD" Overridable="yes">Funktionen kommer även fortsättningsvis att köras från CD:n</String>
575 <String Id="UITextSelCDLocal" Overridable="yes">Funktionen ändras från att kunna köras från CD:n till att installeras på den lokala hårddisken</String>
576 <String Id="UITextSelChildCostNeg" Overridable="yes">Funktionen frigör [1] på hårddisken.</String>
577 <String Id="UITextSelChildCostPos" Overridable="yes">Funktionen kräver [1] på hårddisken.</String>
578 <String Id="UITextSelCostPending" Overridable="yes">Kostnaderna för funktionen kompileras...</String>
579 <String Id="UITextSelLocalAbsent" Overridable="yes">Funktionen tas bort helt</String>
580 <String Id="UITextSelLocalAdvertise" Overridable="yes">Funktionen tas bort från den lokala hårddisken men kommer att installeras vid behov</String>
581 <String Id="UITextSelLocalCD" Overridable="yes">Funktionen tas bort från den lokala hårddisken men kan även fortsättningsvis köras från CD:n</String>
582 <String Id="UITextSelLocalLocal" Overridable="yes">Funktionen kommer även fortsättningsvis att finnas på den lokala hårddisken</String>
583 <String Id="UITextSelLocalNetwork" Overridable="yes">Funktionen tas bort från den lokala hårddisken men kan även fortsättningsvis köras från nätverket</String>
584 <String Id="UITextSelNetworkAbsent" Overridable="yes">Funktionen avinstalleras helt och kan inte köras från nätverket</String>
585 <String Id="UITextSelNetworkAdvertise" Overridable="yes">Funktionen ändras från att kunna köras från nätverket till att installeras vid behov</String>
586 <String Id="UITextSelNetworkLocal" Overridable="yes">Funktionen ändras från att kunna köras från nätverket till att installeras på den lokala hårddisken</String>
587 <String Id="UITextSelNetworkNetwork" Overridable="yes">Funktionen kommer även fortsättningsvis att köras från nätverket</String>
588 <String Id="UITextSelParentCostNegNeg" Overridable="yes">Funktionen frigör [1] på den lokala hårddisken. [2] av [3] underfunktioner har valts. Underfunktionerna frigör [4] på hårddisken.</String>
589 <String Id="UITextSelParentCostNegPos" Overridable="yes">Funktionen frigör [1] på den lokala hårddisken. [2] av [3] underfunktioner har valts. Underfunktionerna kräver [4] på hårddisken.</String>
590 <String Id="UITextSelParentCostPosNeg" Overridable="yes">Funktionen kräver [1] på den lokala hårddisken. [2] av [3] underfunktioner har valts. Underfunktionerna frigör [4] på hårddisken.</String>
591 <String Id="UITextSelParentCostPosPos" Overridable="yes">Funktionen kräver [1] på den lokala hårddisken. [2] av [3] underfunktioner har valts. Underfunktionerna kräver [4] på hårddisken.</String>
592 <String Id="UITextTimeRemaining" Overridable="yes">Återstående tid: {[1] minuter }{[2] sekunder}</String>
593 <String Id="UITextVolumeCostAvailable" Overridable="yes">Tillgängligt</String>
594 <String Id="UITextVolumeCostDifference" Overridable="yes">Skillnad</String>
595 <String Id="UITextVolumeCostRequired" Overridable="yes">Nödvändigt</String>
596 <String Id="UITextVolumeCostSize" Overridable="yes">Diskstorlek</String>
597 <String Id="UITextVolumeCostVolume" Overridable="yes">Volym</String>
598</WixLocalization>
diff --git a/src/ext/UI/wixlib/WixUI_th-TH.wxl b/src/ext/UI/wixlib/WixUI_th-TH.wxl
new file mode 100644
index 00000000..53b8b918
--- /dev/null
+++ b/src/ext/UI/wixlib/WixUI_th-TH.wxl
@@ -0,0 +1,598 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3
4
5<WixLocalization Culture="th-th" Codepage="874" xmlns="http://wixtoolset.org/schemas/v4/wxl">
6 <String Id="WixUIBack" Overridable="yes">ย้อน&amp;กลับ</String>
7 <String Id="WixUINext" Overridable="yes">ถัด&amp;ไป</String>
8 <String Id="WixUICancel" Overridable="yes">ยกเลิก</String>
9 <String Id="WixUIFinish" Overridable="yes">เ&amp;สร็จสิ้น</String>
10 <String Id="WixUIRetry" Overridable="yes">&amp;ลองใหม่</String>
11 <String Id="WixUIIgnore" Overridable="yes">&amp;ละเว้น</String>
12 <String Id="WixUIYes" Overridable="yes">&amp;ใช่</String>
13 <String Id="WixUINo" Overridable="yes">&amp;ไม่</String>
14 <String Id="WixUIOK" Overridable="yes">ตกลง</String>
15 <String Id="WixUIPrint" Overridable="yes">&amp;พิมพ์</String>
16
17 <String Id="AdvancedWelcomeEulaDlg_Title" Overridable="yes">การติดตั้ง [ProductName]</String>
18 <String Id="AdvancedWelcomeEulaDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
19 <String Id="AdvancedWelcomeEulaDlgTitle" Overridable="yes">{\WixUI_Font_Title}โปรดอ่านข้อตกลงสิทธิ์การใช้งานของ [ProductName]</String>
20 <String Id="AdvancedWelcomeEulaDlgLicenseAcceptedCheckBox" Overridable="yes">ฉัน&amp;ยอมรับเงื่อนไขในข้อตกลงสิทธิ์การใช้งาน</String>
21 <String Id="AdvancedWelcomeEulaDlgDescriptionPerMachine" Overridable="yes">คลิก ติดตั้ง เพื่อติดตั้งผลิตภัณฑ์ด้วยตัวเลือกเริ่มต้นสำหรับผู้ใช้ทุกราย คลิก ขั้นสูง เพื่อเปลี่ยนแปลงตัวเลือกการติดตั้ง</String>
22 <String Id="AdvancedWelcomeEulaDlgDescriptionPerUser" Overridable="yes">คลิก ติดตั้ง เพื่อติดตั้งผลิตภัณฑ์ด้วยตัวเลือกเริ่มต้นสำหรับคุณเท่านั้น คลิก ขั้นสูง เพื่อเปลี่ยนแปลงตัวเลือกการติดตั้ง</String>
23 <String Id="AdvancedWelcomeEulaDlgInstall" Overridable="yes">&amp;ติดตั้ง</String>
24 <String Id="AdvancedWelcomeEulaDlgAdvanced" Overridable="yes">&amp;ขั้นสูง</String>
25 <String Id="Advanced_Font_Normal_Size" Overridable="yes">8</String>
26 <String Id="Advanced_Font_Bigger_Size" Overridable="yes">12</String>
27 <String Id="Advanced_Font_Title_Size" Overridable="yes">9</String>
28 <String Id="Advanced_Font_Emphasized_Size" Overridable="yes">8</String>
29 <String Id="Advanced_Font_FaceName" Overridable="yes">tahoma</String>
30
31 <String Id="BrowseDlg_Title" Overridable="yes">การติดตั้ง [ProductName]</String>
32 <String Id="BrowseDlgComboLabel" Overridable="yes">&amp;มองหาใน:</String>
33 <String Id="BrowseDlgWixUI_Bmp_Up" Overridable="yes">WixUI_Bmp_Up</String>
34 <String Id="BrowseDlgWixUI_Bmp_UpTooltip" Overridable="yes">เลื่อนขึ้นหนึ่งระดับ</String>
35 <String Id="BrowseDlgNewFolder" Overridable="yes">WixUI_Bmp_New</String>
36 <String Id="BrowseDlgNewFolderTooltip" Overridable="yes">สร้างโฟลเดอร์ใหม่</String>
37 <String Id="BrowseDlgPathLabel" Overridable="yes">&amp;ชื่อโฟลเดอร์:</String>
38 <String Id="BrowseDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
39 <String Id="BrowseDlgDescription" Overridable="yes">เรียกดูโฟลเดอร์ปลายทาง</String>
40 <String Id="BrowseDlgTitle" Overridable="yes">{\WixUI_Font_Title}เปลี่ยนโฟลเดอร์ปลายทาง</String>
41
42 <String Id="CancelDlg_Title" Overridable="yes">การติดตั้ง [ProductName]</String>
43 <String Id="CancelDlgText" Overridable="yes">คุณแน่ใจหรือไม่ว่าคุณต้องการยกเลิกการติดตั้ง [ProductName]</String>
44 <String Id="CancelDlgIcon" Overridable="yes">WixUI_Ico_Info</String>
45 <String Id="CancelDlgIconTooltip" Overridable="yes">ไอคอนข้อมูล</String>
46
47 <String Id="CustomizeDlg_Title" Overridable="yes">การติดตั้ง [ProductName]</String>
48 <String Id="CustomizeDlgTree" Overridable="yes">ทรีของสิ่งที่เลือก</String>
49 <String Id="CustomizeDlgBrowse" Overridable="yes">เรีย&amp;กดู...</String>
50 <String Id="CustomizeDlgReset" Overridable="yes">ตั้ง&amp;ค่าใหม่</String>
51 <String Id="CustomizeDlgDiskCost" Overridable="yes">การใช้&amp;ดิสก์</String>
52 <String Id="CustomizeDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
53 <String Id="CustomizeDlgText" Overridable="yes">คลิกไอคอนในทรีด้านล่างเพื่อเปลี่ยนแปลงวิธีการติดตั้งคุณลักษณะ</String>
54 <String Id="CustomizeDlgDescription" Overridable="yes">เลือกวิธีการติดตั้งคุณลักษณะที่คุณต้องการ</String>
55 <String Id="CustomizeDlgTitle" Overridable="yes">{\WixUI_Font_Title}การติดตั้งแบบกำหนดเอง</String>
56 <String Id="CustomizeDlgItemDescription" Overridable="yes">CustomizeDlgItemDescription-CustomizeDlgItemDescription</String>
57 <String Id="CustomizeDlgItemSize" Overridable="yes">CustomizeDlgItemSize-CustomizeDlgItemSize</String>
58 <String Id="CustomizeDlgLocation" Overridable="yes">CustomizeDlgLocation-CustomizeDlgLocation</String>
59 <String Id="CustomizeDlgLocationLabel" Overridable="yes">ตำแหน่งที่ตั้ง:</String>
60
61 <String Id="DiskCostDlg_Title" Overridable="yes">การติดตั้ง [ProductName]</String>
62 <String Id="DiskCostDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
63 <String Id="DiskCostDlgText" Overridable="yes">ไดรฟ์ข้อมูลที่เลือกมีเนื้อที่ว่างดิสก์ไม่เพียงพอสำหรับคุณลักษณะที่เลือก คุณสามารถเอาแฟ้มบางแฟ้มออกจากไดรฟ์ข้อมูลที่เลือก ติดตั้งคุณลักษณะน้อยลง หรือเลือกไดรฟ์ปลายทางอื่น</String>
64 <String Id="DiskCostDlgDescription" Overridable="yes">เนื้อที่ดิสก์ที่ต้องการสำหรับการติดตั้งคุณลักษณะที่เลือก</String>
65 <String Id="DiskCostDlgTitle" Overridable="yes">{\WixUI_Font_Title}ความต้องการเนื้อที่ดิสก์</String>
66 <String Id="DiskCostDlgVolumeList" Overridable="yes">{120}{70}{70}{70}{70}</String>
67
68 <String Id="ErrorDlg_Title" Overridable="yes">การติดตั้ง [ProductName]</String>
69 <String Id="ErrorDlgErrorText" Overridable="yes">ข้อความข้อมูล</String>
70 <String Id="ErrorDlgErrorIcon" Overridable="yes">WixUI_Ico_Info</String>
71 <String Id="ErrorDlgErrorIconTooltip" Overridable="yes">ไอคอนข้อมูล</String>
72
73 <String Id="ExitDialog_Title" Overridable="yes">การติดตั้ง [ProductName]</String>
74 <String Id="ExitDialogBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
75 <String Id="ExitDialogDescription" Overridable="yes">คลิกปุ่ม เสร็จสิ้น เพื่อออกจากตัวช่วยสร้างการติดตั้ง</String>
76 <String Id="ExitDialogTitle" Overridable="yes">{\WixUI_Font_Bigger}ตัวช่วยสร้างการติดตั้ง [ProductName] ดำเนินการเสร็จสมบูรณ์</String>
77
78 <String Id="FatalError_Title" Overridable="yes">การติดตั้ง [ProductName]</String>
79 <String Id="FatalErrorBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
80 <String Id="FatalErrorTitle" Overridable="yes">{\WixUI_Font_Bigger}ตัวช่วยสร้างการติดตั้ง [ProductName] สิ้นสุดลงก่อนเสร็จสมบูรณ์</String>
81 <String Id="FatalErrorDescription1" Overridable="yes">ตัวช่วยสร้างการติดตั้ง [ProductName] สิ้นสุดลงก่อนเสร็จสมบูรณ์เนื่องจากมีข้อผิดพลาด ระบบของคุณยังไม่ได้ถูกปรับเปลี่ยน เมื่อต้องการติดตั้งโปรแกรมนี้ในภายหลัง ให้เรียกใช้ตัวช่วยสร้างการติดตั้งอีกครั้ง</String>
82 <String Id="FatalErrorDescription2" Overridable="yes">คลิกปุ่ม เสร็จสิ้น เพื่อออกจากตัวช่วยสร้างการติดตั้ง</String>
83
84 <String Id="FeaturesDlg_Title" Overridable="yes">การติดตั้ง [ProductName]</String>
85 <String Id="FeaturesDlgTree" Overridable="yes">คุณลักษณะผลิตภัณฑ์</String>
86 <String Id="FeaturesDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
87 <String Id="FeaturesDlgDescription" Overridable="yes">เลือกวิธีการติดตั้งคุณลักษณะที่คุณต้องการ</String>
88 <String Id="FeaturesDlgTitle" Overridable="yes">{\WixUI_Font_Title}คุณลักษณะผลิตภัณฑ์</String>
89 <String Id="FeaturesDlgItemDescription" Overridable="yes">FeaturesDlgItemDescription</String>
90 <String Id="FeaturesDlgItemSize" Overridable="yes">FeaturesDlgItemSize</String>
91 <String Id="FeaturesDlgInstall" Overridable="yes">&amp;ติดตั้ง</String>
92 <String Id="FeaturesDlgChange" Overridable="yes">เ&amp;ปลี่ยน</String>
93
94 <String Id="FilesInUse_Title" Overridable="yes">การติดตั้ง [ProductName]</String>
95 <String Id="FilesInUseExit" Overridable="yes">&amp;จบการทำงาน</String>
96 <String Id="FilesInUseBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
97 <String Id="FilesInUseText" Overridable="yes">โปรแกรมประยุกต์ต่อไปนี้กำลังใช้งานแฟ้มที่จำเป็นต้องได้รับการปรับปรุงโดยโปรแกรมติดตั้งนี้ ให้ปิดโปรแกรมประยุกต์เหล่านี้แล้วคลิก ลอ&amp;งใหม่ เพื่อทำการติดตั้งต่อไปหรือคลิก จบการทำงาน เพื่อออกจากการติดตั้ง</String>
98 <String Id="FilesInUseDescription" Overridable="yes">แฟ้มที่จำเป็นต้องปรับปรุงมีการใช้งานอยู่แล้วในขณะนี้</String>
99 <String Id="FilesInUseTitle" Overridable="yes">{\WixUI_Font_Title}แฟ้มถูกใช้งานอยู่</String>
100
101 <String Id="InstallDirDlg_Title" Overridable="yes">การติดตั้ง [ProductName]</String>
102 <String Id="InstallDirDlgChange" Overridable="yes">เ&amp;ปลี่ยน...</String>
103 <String Id="InstallDirDlgTitle" Overridable="yes">{\WixUI_Font_Title}โฟลเดอร์ปลายทาง</String>
104 <String Id="InstallDirDlgDescription" Overridable="yes">คลิก ถัดไป เพื่อติดตั้งในโฟลเดอร์เริ่มต้น หรือคลิก เปลี่ยน เพื่อเลือกโฟลเดอร์อื่น</String>
105 <String Id="InstallDirDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
106 <String Id="InstallDirDlgFolderLabel" Overridable="yes">ติดตั้ง [ProductName] ใน:</String>
107
108 <String Id="InstallScopeDlg_Title" Overridable="yes">การติดตั้ง [ProductName]</String>
109 <String Id="InstallScopeDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
110 <String Id="InstallScopeDlgDescription" Overridable="yes">เลือกขอบเขตการติดตั้งและโฟลเดอร์</String>
111 <String Id="InstallScopeDlgTitle" Overridable="yes">{\WixUI_Font_Title}ขอบเขตการติดตั้ง</String>
112 <String Id="InstallScopeDlgPerUser" Overridable="yes">{\WixUI_Font_Emphasized}ติดตั้งสำหรับ&amp;คุณเท่านั้น ([LogonUser])</String>
113 <String Id="InstallScopeDlgPerUserDescription" Overridable="yes">[ProductName] จะได้รับการติดตั้งในโฟลเดอร์ต่อผู้ใช้และจะพร้อมใช้งานสำหรับบัญชีผู้ใช้ของคุณเท่านั้น คุณไม่จำเป็นต้องมีสิทธิ์ผู้ดูแลระบบของเครื่อง</String>
114 <String Id="InstallScopeDlgNoPerUserDescription" Overridable="yes">[ProductName] ไม่สนับสนุนการติดตั้งต่อผู้ใช้</String>
115 <String Id="InstallScopeDlgPerMachine" Overridable="yes">{\WixUI_Font_Emphasized}ติดตั้งสำหรับผู้ใช้&amp;ทุกรายของเครื่องนี้</String>
116 <String Id="InstallScopeDlgPerMachineDescription" Overridable="yes">[ProductName] จะได้รับการติดตั้งในโฟลเดอร์ต่อเครื่องโดยค่าเริ่มต้น และจะพร้อมใช้งานสำหรับผู้ใช้ทุกราย คุณสามารถเปลี่ยนแปลงโฟลเดอร์การติดตั้งเริ่มต้นได้ คุณต้องมีสิทธิ์ผู้ดูแลระบบของเครื่อง</String>
117 <String Id="InstallScopeDlgFolderLabel" Overridable="yes">โ&amp;ฟลเดอร์การติดตั้ง:</String>
118 <String Id="InstallScopeDlgChange" Overridable="yes">เ&amp;ปลี่ยน...</String>
119
120 <String Id="InvalidDirDlg_Title" Overridable="yes">การติดตั้ง [ProductName]</String>
121 <String Id="InvalidDirDlgText" Overridable="yes">ไดเรกทอรีการติดตั้งต้องอยู่ในฮาร์ดไดรฟ์ภายในเครื่อง</String>
122 <String Id="InvalidDirDlgIcon" Overridable="yes">WixUI_Ico_Info</String>
123 <String Id="InvalidDirDlgIconTooltip" Overridable="yes">ไอคอนข้อมูล</String>
124
125 <String Id="LicenseAgreementDlg_Title" Overridable="yes">การติดตั้ง [ProductName]</String>
126 <String Id="LicenseAgreementDlgLicenseAcceptedCheckBox" Overridable="yes">ฉัน&amp;ยอมรับเงื่อนไขในข้อตกลงสิทธิ์การใช้งาน</String>
127 <String Id="LicenseAgreementDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
128 <String Id="LicenseAgreementDlgDescription" Overridable="yes">โปรดอ่านข้อตกลงสิทธิ์การใช้งานต่อไปนี้อย่างถี่ถ้วน</String>
129 <String Id="LicenseAgreementDlgTitle" Overridable="yes">{\WixUI_Font_Title}ข้อตกลงสิทธิ์การใช้งานสำหรับผู้ใช้</String>
130
131 <String Id="MaintenanceTypeDlg_Title" Overridable="yes">การติดตั้ง [ProductName]</String>
132 <String Id="MaintenanceTypeDlgChangeButton" Overridable="yes">เ&amp;ปลี่ยน</String>
133 <String Id="MaintenanceTypeDlgChangeButtonTooltip" Overridable="yes">เปลี่ยนแปลงการติดตั้ง</String>
134 <String Id="MaintenanceTypeDlgRepairButton" Overridable="yes">ซ่อ&amp;มแซม</String>
135 <String Id="MaintenanceTypeDlgRepairButtonTooltip" Overridable="yes">ซ่อมแซมการติดตั้ง</String>
136 <String Id="MaintenanceTypeDlgRemoveButton" Overridable="yes">เอ&amp;าออก</String>
137 <String Id="MaintenanceTypeDlgRemoveButtonTooltip" Overridable="yes">เอาการติดตั้งออก</String>
138 <String Id="MaintenanceTypeDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
139 <String Id="MaintenanceTypeDlgDescription" Overridable="yes">เลือกการดำเนินการที่คุณต้องการกระทำ</String>
140 <String Id="MaintenanceTypeDlgTitle" Overridable="yes">{\WixUI_Font_Title}เปลี่ยนแปลง ซ่อมแซม หรือเอาการติดตั้งออก</String>
141 <String Id="MaintenanceTypeDlgChangeText" Overridable="yes">ให้คุณเปลี่ยนแปลงวิธีการติดตั้งคุณลักษณะ</String>
142 <String Id="MaintenanceTypeDlgChangeDisabledText" Overridable="yes">[ProductName] ไม่มีคุณลักษณะที่เลือกได้โดยอิสระ</String>
143 <String Id="MaintenanceTypeDlgRemoveText" Overridable="yes">เอา [ProductName] ออกจากคอมพิวเตอร์ของคุณ</String>
144 <String Id="MaintenanceTypeDlgRemoveDisabledText" Overridable="yes">ไม่สามารถเอา [ProductName] ออกได้</String>
145 <String Id="MaintenanceTypeDlgRepairText" Overridable="yes">ซ่อมแซมข้อผิดพลาดในการติดตั้งครั้งล่าสุด โดยแก้ไขแฟ้มที่ขาดหายและเสียหาย ทางลัด และรายการรีจิสทรี</String>
146 <String Id="MaintenanceTypeDlgRepairDisabledText" Overridable="yes">ไม่สามารถซ่อมแซม [ProductName] ได้</String>
147
148 <String Id="MaintenanceWelcomeDlg_Title" Overridable="yes">การติดตั้ง [ProductName]</String>
149 <String Id="MaintenanceWelcomeDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
150 <String Id="MaintenanceWelcomeDlgDescription" Overridable="yes">ตัวช่วยสร้างการติดตั้งให้คุณสามารถเปลี่ยนวิธีการติดตั้งคุณลักษณะของ [ProductName] บนคอมพิวเตอร์ของคุณ หรือเอาคุณลักษณะออกจากคอมพิวเตอร์ของคุณ ให้คลิก ถัดไป เพื่อทำต่อไป หรือคลิก ยกเลิก เพื่อออกจากตัวช่วยสร้างการติดตั้ง</String>
151 <String Id="MaintenanceWelcomeDlgTitle" Overridable="yes">{\WixUI_Font_Bigger}ยินดีต้อนรับสู่ตัวช่วยสร้างการติดตั้ง [ProductName]</String>
152
153 <String Id="MsiRMFilesInUse_Title" Overridable="yes">การติดตั้ง [ProductName]</String>
154 <String Id="MsiRMFilesInUseBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
155 <String Id="MsiRMFilesInUseText" Overridable="yes">โปรแกรมประยุกต์ต่อไปนี้กำลังใช้แฟ้มที่จำเป็นต้องได้รับการปรับปรุงโดยโปรแกรมติดตั้งนี้ คุณสามารถปล่อยให้ตัวช่วยสร้างการติดตั้งปิดโปรแกรมประยุกต์เหล่านี้และเริ่มโปรแกรมประยุกต์ใหม่ หรือเริ่มระบบของเครื่องใหม่ในภายหลัง</String>
156 <String Id="MsiRMFilesInUseDescription" Overridable="yes">แฟ้มที่จำเป็นต้องปรับปรุงมีการใช้งานอยู่แล้วในขณะนี้</String>
157 <String Id="MsiRMFilesInUseTitle" Overridable="yes">{\WixUI_Font_Title}แฟ้มถูกใช้งานอยู่</String>
158 <String Id="MsiRMFilesInUseUseRM" Overridable="yes">ปิ&amp;ดโปรแกรมประยุกต์และเริ่มการทำงานใหม่</String>
159 <String Id="MsiRMFilesInUseDontUseRM" Overridable="yes">&amp;อย่าปิดโปรแกรมประยุกต์ คุณจำเป็นต้องเริ่มระบบคอมพิวเตอร์ใหม่</String>
160
161 <String Id="OutOfDiskDlg_Title" Overridable="yes">การติดตั้ง [ProductName]</String>
162 <String Id="OutOfDiskDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
163 <String Id="OutOfDiskDlgText" Overridable="yes">ไดรฟ์ข้อมูลที่เลือกมีเนื้อที่ดิสก์ไม่เพียงพอสำหรับคุณลักษณะที่เลือกอยู่ในขณะนี้ คุณสามารถเอาบางแฟ้มออกจากไดรฟ์ข้อมูลที่เลือก ติดตั้งคุณลักษณะน้อยลง หรือเลือกไดรฟ์ปลายทางอื่น</String>
164 <String Id="OutOfDiskDlgDescription" Overridable="yes">เนื้อที่ดิสก์ที่ต้องการใช้สำหรับการติดตั้งนั้นมากเกินกว่าเนื้อที่ดิสก์ที่เหลืออยู่</String>
165 <String Id="OutOfDiskDlgTitle" Overridable="yes">{\WixUI_Font_Title}เนื้อที่ดิสก์ไม่เพียงพอ</String>
166 <String Id="OutOfDiskDlgVolumeList" Overridable="yes">{120}{70}{70}{70}{70}</String>
167
168 <String Id="OutOfRbDiskDlg_Title" Overridable="yes">การติดตั้ง [ProductName]</String>
169 <String Id="OutOfRbDiskDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
170 <String Id="OutOfRbDiskDlgText" Overridable="yes">ไดรฟ์ข้อมูลที่เลือกมีเนื้อที่ดิสก์ไม่เพียงพอสำหรับคุณลักษณะที่เลือกอยู่ในขณะนี้ คุณสามารถเอาบางแฟ้มออกจากไดรฟ์ข้อมูลที่เลือก ติดตั้งคุณลักษณะน้อยลง หรือเลือกไดรฟ์ปลายทางอื่น</String>
171 <String Id="OutOfRbDiskDlgDescription" Overridable="yes">เนื้อที่ดิสก์ที่ต้องการใช้สำหรับการติดตั้งนั้นมากเกินกว่าเนื้อที่ดิสก์ที่เหลืออยู่</String>
172 <String Id="OutOfRbDiskDlgTitle" Overridable="yes">{\WixUI_Font_Title}เนื้อที่ดิสก์ไม่เพียงพอ</String>
173 <String Id="OutOfRbDiskDlgVolumeList" Overridable="yes">{120}{70}{70}{70}{70}</String>
174 <String Id="OutOfRbDiskDlgText2" Overridable="yes">อีกทางเลือกหนึ่ง คุณสามารถเลือกปิดใช้งานการดำเนินการย้อนกลับของโปรแกรมติดตั้งได้ การปิดใช้งานการดำเนินการย้อนกลับป้องกันไม่ให้โปรแกรมติดตั้งคืนค่าสถานะดั้งเดิมของคอมพิวเตอร์ของคุณหากโปรแกรมติดตั้งถูกขัดจังหวะไม่ว่าด้วยเหตุใด ให้คลิก ใช่ หากคุณต้องการยอมรับความเสี่ยงจากการปิดใช้งานการดำเนินการย้อนกลับ</String>
175
176 <String Id="PrepareDlg_Title" Overridable="yes">การติดตั้ง [ProductName]</String>
177 <String Id="PrepareDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
178 <String Id="PrepareDlgDescription" Overridable="yes">โปรดรอสักครู่ขณะที่ตัวช่วยสร้างการติดตั้งเตรียมการที่จะแนะนำคุณตลอดขั้นตอนการติดตั้ง</String>
179 <String Id="PrepareDlgTitle" Overridable="yes">{\WixUI_Font_Bigger}ยินดีต้อนรับสู่ตัวช่วยสร้างการติดตั้ง [ProductName]</String>
180
181 <String Id="ProgressDlg_Title" Overridable="yes">การติดตั้ง [ProductName]</String>
182 <String Id="ProgressDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
183 <String Id="ProgressDlgTextInstalling" Overridable="yes">โปรดรอสักครู่ขณะที่ตัวช่วยสร้างการติดตั้งทำการติดตั้ง [ProductName]</String>
184 <String Id="ProgressDlgTitleInstalling" Overridable="yes">{\WixUI_Font_Title}กำลังติดตั้ง [ProductName]</String>
185 <String Id="ProgressDlgTextChanging" Overridable="yes">โปรดรอสักครู่ขณะที่ตัวช่วยสร้างการติดตั้งทำการเปลี่ยนแปลง [ProductName]</String>
186 <String Id="ProgressDlgTitleChanging" Overridable="yes">{\WixUI_Font_Title}กำลังเปลี่ยนแปลง [ProductName]</String>
187 <String Id="ProgressDlgTextRepairing" Overridable="yes">โปรดรอสักครู่ขณะที่ตัวช่วยสร้างการติดตั้งทำการซ่อมแซม [ProductName]</String>
188 <String Id="ProgressDlgTitleRepairing" Overridable="yes">{\WixUI_Font_Title}กำลังซ่อมแซม [ProductName]</String>
189 <String Id="ProgressDlgTextRemoving" Overridable="yes">โปรดรอสักครู่ขณะที่ตัวช่วยสร้างการติดตั้งทำการเอา [ProductName] ออก</String>
190 <String Id="ProgressDlgTitleRemoving" Overridable="yes">{\WixUI_Font_Title}กำลังเอา [ProductName] ออก</String>
191 <String Id="ProgressDlgTextUpdating" Overridable="yes">โปรดรอสักครู่ขณะที่ตัวช่วยสร้างการติดตั้งปรับปรุง [ProductName]</String>
192 <String Id="ProgressDlgTitleUpdating" Overridable="yes">{\WixUI_Font_Title}กำลังปรับปรุง [ProductName]</String>
193 <String Id="ProgressDlgProgressBar" Overridable="yes">การดำเนินการเสร็จสิ้น</String>
194 <String Id="ProgressDlgStatusLabel" Overridable="yes">สถานะ:</String>
195
196 <String Id="ResumeDlg_Title" Overridable="yes">การติดตั้ง [ProductName]</String>
197 <String Id="ResumeDlgInstall" Overridable="yes">&amp;ติดตั้ง</String>
198 <String Id="ResumeDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
199 <String Id="ResumeDlgDescription" Overridable="yes">ตัวช่วยสร้างการติดตั้งจะทำการติดตั้ง [ProductName] ลงบนคอมพิวเตอร์ของคุณ ให้คลิก ติดตั้ง เพื่อดำเนินการต่อหรือคลิก ยกเลิก เพื่อออกจากตัวช่วยสร้างการติดตั้ง</String>
200 <String Id="ResumeDlgTitle" Overridable="yes">{\WixUI_Font_Bigger}กำลังดำเนินการตัวช่วยสร้างการติดตั้ง [ProductName] ต่อ</String>
201
202 <String Id="SetupTypeDlg_Title" Overridable="yes">การติดตั้ง [ProductName]</String>
203 <String Id="SetupTypeDlgTypicalButton" Overridable="yes">&amp;ทั่วไป</String>
204 <String Id="SetupTypeDlgTypicalButtonTooltip" Overridable="yes">การติดตั้งแบบทั่วไป</String>
205 <String Id="SetupTypeDlgCustomButton" Overridable="yes">กำหนด&amp;เอง</String>
206 <String Id="SetupTypeDlgCustomButtonTooltip" Overridable="yes">การติดตั้งแบบกำหนดเอง</String>
207 <String Id="SetupTypeDlgCompleteButton" Overridable="yes">&amp;สมบูรณ์</String>
208 <String Id="SetupTypeDlgCompleteButtonTooltip" Overridable="yes">การติดตั้งแบบสมบูรณ์</String>
209 <String Id="SetupTypeDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
210 <String Id="SetupTypeDlgTitle" Overridable="yes">{\WixUI_Font_Title}เลือกชนิดการติดตั้ง</String>
211 <String Id="SetupTypeDlgDescription" Overridable="yes">เลือกชนิดการติดตั้งที่ตรงกับความต้องการของคุณมากที่สุด</String>
212 <String Id="SetupTypeDlgTypicalText" Overridable="yes">ติดตั้งคุณลักษณะของโปรแกรมโดยทั่วไป แนะนำสำหรับผู้ใช้ส่วนใหญ่</String>
213 <String Id="SetupTypeDlgCustomText" Overridable="yes">อนุญาตให้ผู้ใช้เลือกคุณลักษณะของโปรแกรมที่จะติดตั้ง รวมไปถึงตำแหน่งที่จะติดตั้ง แนะนำสำหรับผู้ใช้ขั้นสูง</String>
214 <String Id="SetupTypeDlgCompleteText" Overridable="yes">คุณลักษณะทั้งหมดของโปแกรมจะได้รับการติดตั้ง จำเป็นต้องใช้เนื้อที่ว่างดิสก์มากที่สุด</String>
215
216 <String Id="UserExit_Title" Overridable="yes">การติดตั้ง [ProductName]</String>
217 <String Id="UserExitBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
218 <String Id="UserExitTitle" Overridable="yes">{\WixUI_Font_Bigger}ตัวช่วยสร้างการติดตั้ง [ProductName] ถูกขัดจังหวะ</String>
219 <String Id="UserExitDescription1" Overridable="yes">การติดตั้ง [ProductName] ถูกขัดจังหวะ ยังไม่มีการปรับเปลี่ยนระบบของคุณ เมื่อต้องการติดตั้งโปรแกรมนี้ในภายหลัง โปรดเรียกใช้การติดตั้งอีกครั้ง</String>
220 <String Id="UserExitDescription2" Overridable="yes">คลิกปุ่ม เสร็จสิ้น เพื่อออกจากตัวช่วยสร้างการติดตั้ง</String>
221
222 <String Id="VerifyReadyDlg_Title" Overridable="yes">การติดตั้ง [ProductName]</String>
223 <String Id="VerifyReadyDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
224 <String Id="VerifyReadyDlgInstall" Overridable="yes">&amp;ติดตั้ง</String>
225 <String Id="VerifyReadyDlgInstallText" Overridable="yes">คลิก ติดตั้ง เพื่อเริ่มการติดตั้ง คลิก ย้อนกลับ เพื่อตรวจทานหรือเปลี่ยนแปลงการตั้งค่าการติดตั้งของคุณ คลิก ยกเลิก เพื่อออกจากตัวช่วยสร้าง</String>
226 <String Id="VerifyReadyDlgInstallTitle" Overridable="yes">{\WixUI_Font_Title}พร้อมทำการติดตั้ง [ProductName]</String>
227 <String Id="VerifyReadyDlgChange" Overridable="yes">เ&amp;ปลี่ยน</String>
228 <String Id="VerifyReadyDlgChangeText" Overridable="yes">คลิก เปลี่ยน เพื่อเริ่มการติดตั้ง คลิก ย้อนกลับ เพื่อตรวจทานหรือเปลี่ยนแปลงการตั้งค่าการติดตั้งของคุณ คลิก ยกเลิก เพื่อออกจากตัวช่วยสร้าง</String>
229 <String Id="VerifyReadyDlgChangeTitle" Overridable="yes">{\WixUI_Font_Title}พร้อมทำการเปลี่ยนแปลง [ProductName]</String>
230 <String Id="VerifyReadyDlgRepair" Overridable="yes">ซ่อ&amp;มแซม</String>
231 <String Id="VerifyReadyDlgRepairText" Overridable="yes">คลิก ซ่อมแซม เพื่อทำการซ่อมแซมการติดตั้ง [ProductName] คลิก ย้อนกลับ เพื่อตรวจทานหรือเปลี่ยนแปลงการตั้งค่าการติดตั้งของคุณ คลิก ยกเลิก เพื่อออกจากตัวช่วยสร้าง</String>
232 <String Id="VerifyReadyDlgRepairTitle" Overridable="yes">{\WixUI_Font_Title}พร้อมทำการซ่อมแซม [ProductName]</String>
233 <String Id="VerifyReadyDlgRemove" Overridable="yes">เอ&amp;าออก</String>
234 <String Id="VerifyReadyDlgRemoveText" Overridable="yes">คลิก เอาออก เพื่อเอา [ProductName] ออกจากคอมพิวเตอร์ของคุณ คลิก ย้อนกลับ เพื่อตรวจทานหรือเปลี่ยนแปลงการตั้งค่าการติดตั้งของคุณ คลิก ยกเลิก เพื่อออกจากตัวช่วยสร้าง</String>
235 <String Id="VerifyReadyDlgRemoveTitle" Overridable="yes">{\WixUI_Font_Title}พร้อมทำการเอา [ProductName] ออก</String>
236 <String Id="VerifyReadyDlgUpdate" Overridable="yes">&amp;ปรับปรุง</String>
237 <String Id="VerifyReadyDlgUpdateText" Overridable="yes">คลิก ปรับปรุง เพื่อปรับปรุง [ProductName] จากคอมพิวเตอร์ของคุณ คลิก ย้อนกลับ เพื่อตรวจทานหรือเปลี่ยนแปลงการตั้งค่าการติดตั้งใดๆ ของคุณ คลิก ยกเลิก เพื่อออกจากตัวช่วยสร้าง</String>
238 <String Id="VerifyReadyDlgUpdateTitle" Overridable="yes">{\WixUI_Font_Title}พร้อมทำการปรับปรุง [ProductName]</String>
239
240 <String Id="WaitForCostingDlg_Title" Overridable="yes">การติดตั้ง [ProductName]</String>
241 <String Id="WaitForCostingDlgReturn" Overridable="yes">&amp;กลับ</String>
242 <String Id="WaitForCostingDlgText" Overridable="yes">โปรดรอสักครู่ขณะโปรแกรมติดตั้งเสร็จสิ้นการกำหนดความต้องการเนื้อที่ดิสก์ของคุณ</String>
243 <String Id="WaitForCostingDlgIcon" Overridable="yes">WixUI_Ico_Exclam</String>
244 <String Id="WaitForCostingDlgIconTooltip" Overridable="yes">ไอคอนเครื่องหมายอัศเจรีย์</String>
245
246 <String Id="WelcomeDlg_Title" Overridable="yes">การติดตั้ง [ProductName]</String>
247 <String Id="WelcomeDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
248 <String Id="WelcomeDlgDescription" Overridable="yes">ตัวช่วยสร้างการติดตั้งจะติดตั้ง [ProductName] บนเครื่องคอมพิวเตอร์ของคุณ คลิก ถัดไป เพื่อดำเนินการต่อ หรือ ยกเลิก เพื่อออกจากตัวช่วยสร้างการติดตั้ง</String>
249 <String Id="WelcomeUpdateDlgDescriptionUpdate" Overridable="yes">ตัวช่วยสร้างการติดตั้งจะปรับปรุง [ProductName] บนคอมพิวเตอร์ของคุณ คลิก ถัดไป เพื่อดำเนินการต่อ หรือ ยกเลิก เพื่อออกจากตัวช่วยสร้างการติดตั้ง</String>
250 <String Id="WelcomeDlgTitle" Overridable="yes">{\WixUI_Font_Bigger}ยินดีต้อนรับสู่ตัวช่วยสร้างการติดตั้ง [ProductName]</String>
251
252 <String Id="WelcomeEulaDlg_Title" Overridable="yes">การติดตั้ง [ProductName]</String>
253 <String Id="WelcomeEulaDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
254 <String Id="WelcomeEulaDlgLicenseAcceptedCheckBox" Overridable="yes">ฉัน&amp;ยอมรับตามข้อความในข้อตกลงสิทธิ์การใช้งานนี้</String>
255 <String Id="WelcomeEulaDlgInstall" Overridable="yes">&amp;ติดตั้ง</String>
256 <String Id="WelcomeEulaDlgUpdate" Overridable="yes">&amp;ปรับปรุง</String>
257 <String Id="WelcomeEulaDlgTitle" Overridable="yes">{\WixUI_Font_Title}โปรดอ่านข้อตกลงสิทธิ์การใช้งานของ [ProductName]</String>
258
259 <String Id="ProgressTextInstallValidate" Overridable="yes">กำลังตรวจสอบความถูกต้องของการติดตั้ง</String>
260 <String Id="ProgressTextInstallFiles" Overridable="yes">กำลังคัดลอกแฟ้มใหม่</String>
261 <String Id="ProgressTextInstallFilesTemplate" Overridable="yes">แฟ้ม: [1] ไดเรกทอรี: [9] ขนาด: [6]</String>
262 <String Id="ProgressTextInstallAdminPackage" Overridable="yes">กำลังคัดลอกแฟ้มติดตั้งเครือข่าย</String>
263 <String Id="ProgressTextInstallAdminPackageTemplate" Overridable="yes">แฟ้ม: [1] ไดเรกทอรี: [9] ขนาด: [6]</String>
264 <String Id="ProgressTextFileCost" Overridable="yes">กำลังคำนวณเนื้อที่ที่ต้องการ</String>
265 <String Id="ProgressTextCostInitialize" Overridable="yes">กำลังคำนวณเนื้อที่ที่ต้องการ</String>
266 <String Id="ProgressTextCostFinalize" Overridable="yes">กำลังคำนวณเนื้อที่ที่ต้องการ</String>
267 <String Id="ProgressTextCreateShortcuts" Overridable="yes">กำลังสร้างทางลัด</String>
268 <String Id="ProgressTextCreateShortcutsTemplate" Overridable="yes">ทางลัด: [1]</String>
269 <String Id="ProgressTextPublishComponents" Overridable="yes">กำลังเผยแพร่คอมโพเนนต์ที่เหมาะสม</String>
270 <String Id="ProgressTextPublishComponentsTemplate" Overridable="yes">รหัสคอมโพเนนต์: [1] ตัวระบุ: [2]</String>
271 <String Id="ProgressTextPublishFeatures" Overridable="yes">กำลังเผยแพร่คุณลักษณะของผลิตภัณฑ์</String>
272 <String Id="ProgressTextPublishFeaturesTemplate" Overridable="yes">คุณลักษณะ: [1]</String>
273 <String Id="ProgressTextPublishProduct" Overridable="yes">กำลังเผยแพร่ข้อมูลผลิตภัณฑ์</String>
274 <String Id="ProgressTextRegisterClassInfo" Overridable="yes">กำลังลงทะเบียนเซิร์ฟเวอร์คลาส</String>
275 <String Id="ProgressTextRegisterClassInfoTemplate" Overridable="yes">รหัสคลาส: [1]</String>
276 <String Id="ProgressTextRegisterExtensionInfo" Overridable="yes">กำลังลงทะเบียนเซิร์ฟเวอร์ส่วนขยาย</String>
277 <String Id="ProgressTextRegisterExtensionInfoTemplate" Overridable="yes">ส่วนขยาย: [1]</String>
278 <String Id="ProgressTextRegisterMIMEInfo" Overridable="yes">กำลังลงทะเบียนข้อมูล MIME</String>
279 <String Id="ProgressTextRegisterMIMEInfoTemplate" Overridable="yes">ชนิดเนื้อหา MIME: [1] ส่วนขยาย: [2]</String>
280 <String Id="ProgressTextRegisterProgIdInfo" Overridable="yes">กำลังลงทะเบียนรหัสโปรแกรม</String>
281 <String Id="ProgressTextRegisterProgIdInfoTemplate" Overridable="yes">ProgId: [1]</String>
282 <String Id="ProgressTextAllocateRegistrySpace" Overridable="yes">กำลังจัดสรรเนื้อที่รีจิสทรี</String>
283 <String Id="ProgressTextAllocateRegistrySpaceTemplate" Overridable="yes">เนื้อที่ว่าง: [1]</String>
284 <String Id="ProgressTextAppSearch" Overridable="yes">กำลังค้นหาโปรแกรมประยุกต์ที่ติดตั้งไว้</String>
285 <String Id="ProgressTextAppSearchTemplate" Overridable="yes">คุณสมบัติ: [1] ลายเซ็น: [2]</String>
286 <String Id="ProgressTextBindImage" Overridable="yes">กำลังเชื่อมต่อแฟ้มแบบปฏิบัติการได้</String>
287 <String Id="ProgressTextBindImageTemplate" Overridable="yes">แฟ้ม: [1]</String>
288 <String Id="ProgressTextCCPSearch" Overridable="yes">กำลังค้นหาผลิตภัณฑ์ที่เหมาะสม</String>
289 <String Id="ProgressTextCreateFolders" Overridable="yes">กำลังสร้างโฟลเดอร์</String>
290 <String Id="ProgressTextCreateFoldersTemplate" Overridable="yes">โฟลเดอร์: [1]</String>
291 <String Id="ProgressTextDeleteServices" Overridable="yes">กำลังลบบริการ</String>
292 <String Id="ProgressTextDeleteServicesTemplate" Overridable="yes">บริการ: [1]</String>
293 <String Id="ProgressTextDuplicateFiles" Overridable="yes">กำลังสร้างแฟ้มสำเนา</String>
294 <String Id="ProgressTextDuplicateFilesTemplate" Overridable="yes">แฟ้ม: [1] ไดเรกทอรี: [9] ขนาด: [6]</String>
295 <String Id="ProgressTextFindRelatedProducts" Overridable="yes">กำลังค้นหาโปรแกรมประยุกต์ที่เกี่ยวข้อง</String>
296 <String Id="ProgressTextFindRelatedProductsTemplate" Overridable="yes">โปรแกรมประยุกต์ที่พบ: [1]</String>
297 <String Id="ProgressTextInstallODBC" Overridable="yes">กำลังติดตั้งคอมโพเนนต์ ODBC</String>
298 <String Id="ProgressTextInstallServices" Overridable="yes">กำลังติดตั้งบริการใหม่</String>
299 <String Id="ProgressTextInstallServicesTemplate" Overridable="yes">บริการ: [2]</String>
300 <String Id="ProgressTextLaunchConditions" Overridable="yes">กำลังประเมินเงื่อนไขการเปิดใช้</String>
301 <String Id="ProgressTextMigrateFeatureStates" Overridable="yes">กำลังย้ายสถานะของคุณลักษณะจากโปรแกรมประยุกต์ที่เกี่ยวข้อง</String>
302 <String Id="ProgressTextMigrateFeatureStatesTemplate" Overridable="yes">โปรแกรมประยุกต์: [1]</String>
303 <String Id="ProgressTextMoveFiles" Overridable="yes">กำลังย้ายแฟ้ม</String>
304 <String Id="ProgressTextMoveFilesTemplate" Overridable="yes">แฟ้ม: [1] ไดเรกทอรี: [9] ขนาด: [6]</String>
305 <String Id="ProgressTextPatchFiles" Overridable="yes">กำลังแก้ไขแฟ้ม</String>
306 <String Id="ProgressTextPatchFilesTemplate" Overridable="yes">แฟ้ม: [1] ไดเรกทอรี: [2] ขนาด: [3]</String>
307 <String Id="ProgressTextProcessComponents" Overridable="yes">กำลังปรับปรุงการลงทะเบียนคอมโพเนนต์</String>
308 <String Id="ProgressTextRegisterComPlus" Overridable="yes">กำลังลงทะเบียนโปรแกรมประยุกต์และคอมโพเนนต์ COM+</String>
309 <String Id="ProgressTextRegisterComPlusTemplate" Overridable="yes">AppId: [1]{{, AppType: [2] ผู้ใช้: [3] RSN: [4]}}</String>
310 <String Id="ProgressTextRegisterFonts" Overridable="yes">กำลังลงทะเบียนแบบอักษร</String>
311 <String Id="ProgressTextRegisterFontsTemplate" Overridable="yes">แบบอักษร: [1]</String>
312 <String Id="ProgressTextRegisterProduct" Overridable="yes">กำลังลงทะเบียนผลิตภัณฑ์</String>
313 <String Id="ProgressTextRegisterProductTemplate" Overridable="yes">[1]</String>
314 <String Id="ProgressTextRegisterTypeLibraries" Overridable="yes">กำลังลงทะเบียนไลบรารีชนิด</String>
315 <String Id="ProgressTextRegisterTypeLibrariesTemplate" Overridable="yes">LibID: [1]</String>
316 <String Id="ProgressTextRegisterUser" Overridable="yes">กำลังลงทะเบียนผู้ใช้</String>
317 <String Id="ProgressTextRegisterUserTemplate" Overridable="yes">[1]</String>
318 <String Id="ProgressTextRemoveDuplicateFiles" Overridable="yes">กำลังเอาแฟ้มที่ซ้ำกันออก</String>
319 <String Id="ProgressTextRemoveDuplicateFilesTemplate" Overridable="yes">แฟ้ม: [1] ไดเรกทอรี: [9]</String>
320 <String Id="ProgressTextRemoveEnvironmentStrings" Overridable="yes">กำลังปรับปรุงสตริงสภาพแวดล้อม</String>
321 <String Id="ProgressTextRemoveEnvironmentStringsTemplate" Overridable="yes">ชื่อ: [1] ค่า: [2] การกระทำ [3]</String>
322 <String Id="ProgressTextRemoveExistingProducts" Overridable="yes">กำลังเอาโปรแกรมประยุกต์ออก</String>
323 <String Id="ProgressTextRemoveExistingProductsTemplate" Overridable="yes">โปรแกรมประยุกต์: [1] บรรทัดคำสั่ง: [2]</String>
324 <String Id="ProgressTextRemoveFiles" Overridable="yes">กำลังเอาแฟ้มออก</String>
325 <String Id="ProgressTextRemoveFilesTemplate" Overridable="yes">แฟ้ม: [1] ไดเรกทอรี: [9]</String>
326 <String Id="ProgressTextRemoveFolders" Overridable="yes">กำลังเอาโฟลเดอร์ออก</String>
327 <String Id="ProgressTextRemoveFoldersTemplate" Overridable="yes">โฟลเดอร์: [1]</String>
328 <String Id="ProgressTextRemoveIniValues" Overridable="yes">กำลังเอารายการแฟ้ม INI ออก</String>
329 <String Id="ProgressTextRemoveIniValuesTemplate" Overridable="yes">แฟ้ม: [1] ส่วน: [2] คีย์: [3] ค่า: [4]</String>
330 <String Id="ProgressTextRemoveODBC" Overridable="yes">กำลังเอาคอมโพเนนต์ ODBC ออก</String>
331 <String Id="ProgressTextRemoveRegistryValues" Overridable="yes">กำลังเอาค่ารีจิสทรีของระบบออก</String>
332 <String Id="ProgressTextRemoveRegistryValuesTemplate" Overridable="yes">คีย์: [1] ชื่อ: [2]</String>
333 <String Id="ProgressTextRemoveShortcuts" Overridable="yes">กำลังเอาทางลัดออก</String>
334 <String Id="ProgressTextRemoveShortcutsTemplate" Overridable="yes">ทางลัด: [1]</String>
335 <String Id="ProgressTextRMCCPSearch" Overridable="yes">กำลังค้นหาผลิตภัณฑ์ที่เหมาะสม</String>
336 <String Id="ProgressTextSelfRegModules" Overridable="yes">กำลังลงทะเบียนโมดูล</String>
337 <String Id="ProgressTextSelfRegModulesTemplate" Overridable="yes">แฟ้ม: [1] โฟลเดอร์: [2]</String>
338 <String Id="ProgressTextSelfUnregModules" Overridable="yes">กำลังยกเลิกการลงทะเบียนโมดูล</String>
339 <String Id="ProgressTextSelfUnregModulesTemplate" Overridable="yes">แฟ้ม: [1] โฟลเดอร์: [2]</String>
340 <String Id="ProgressTextSetODBCFolders" Overridable="yes">กำลังเตรียมใช้งานไดเรกทอรี ODBC</String>
341 <String Id="ProgressTextStartServices" Overridable="yes">กำลังเริ่มต้นบริการ</String>
342 <String Id="ProgressTextStartServicesTemplate" Overridable="yes">บริการ: [1]</String>
343 <String Id="ProgressTextStopServices" Overridable="yes">กำลังหยุดบริการ</String>
344 <String Id="ProgressTextStopServicesTemplate" Overridable="yes">บริการ: [1]</String>
345 <String Id="ProgressTextUnpublishComponents" Overridable="yes">กำลังยกเลิกการเผยแพร่คอมโพเนนต์ที่เหมาะสม</String>
346 <String Id="ProgressTextUnpublishComponentsTemplate" Overridable="yes">รหัสคอมโพเนนต์: [1] ตัวระบุ: [2]</String>
347 <String Id="ProgressTextUnpublishFeatures" Overridable="yes">กำลังยกเลิกการเผยแพร่คุณลักษณะของผลิตภัณฑ์</String>
348 <String Id="ProgressTextUnpublishFeaturesTemplate" Overridable="yes">คุณลักษณะ: [1]</String>
349 <String Id="ProgressTextUnregisterClassInfo" Overridable="yes">กำลังยกเลิกการลงทะเบียนเซิร์ฟเวอร์คลาส</String>
350 <String Id="ProgressTextUnregisterClassInfoTemplate" Overridable="yes">รหัสคลาส: [1]</String>
351 <String Id="ProgressTextUnregisterComPlus" Overridable="yes">กำลังยกเลิกการลงทะเบียนโปรแกรมประยุกต์และคอมโพเนนต์ COM+</String>
352 <String Id="ProgressTextUnregisterComPlusTemplate" Overridable="yes">AppId: [1]{{, AppType: [2]}}</String>
353 <String Id="ProgressTextUnregisterExtensionInfo" Overridable="yes">กำลังยกเลิกการลงทะเบียนเซิร์ฟเวอร์ส่วนขยาย</String>
354 <String Id="ProgressTextUnregisterExtensionInfoTemplate" Overridable="yes">ส่วนขยาย: [1]</String>
355 <String Id="ProgressTextUnregisterFonts" Overridable="yes">กำลังยกเลิกการลงทะเบียนแบบอักษร</String>
356 <String Id="ProgressTextUnregisterFontsTemplate" Overridable="yes">แบบอักษร: [1]</String>
357 <String Id="ProgressTextUnregisterMIMEInfo" Overridable="yes">กำลังยกเลิกการลงทะเบียนข้อมูล MIME</String>
358 <String Id="ProgressTextUnregisterMIMEInfoTemplate" Overridable="yes">ชนิดเนื้อหา MIME: [1] ส่วนขยาย: [2]</String>
359 <String Id="ProgressTextUnregisterProgIdInfo" Overridable="yes">กำลังยกเลิกการลงทะเบียนตัวระบุโปรแกรม</String>
360 <String Id="ProgressTextUnregisterProgIdInfoTemplate" Overridable="yes">ProgId: [1]</String>
361 <String Id="ProgressTextUnregisterTypeLibraries" Overridable="yes">กำลังยกเลิกการลงทะเบียนไลบรารีชนิด</String>
362 <String Id="ProgressTextUnregisterTypeLibrariesTemplate" Overridable="yes">LibID: [1]</String>
363 <String Id="ProgressTextWriteEnvironmentStrings" Overridable="yes">กำลังปรับปรุงสตริงสภาพแวดล้อม</String>
364 <String Id="ProgressTextWriteEnvironmentStringsTemplate" Overridable="yes">ชื่อ: [1] ค่า: [2] การกระทำ [3]</String>
365 <String Id="ProgressTextWriteIniValues" Overridable="yes">กำลังเขียนค่าของแฟ้ม INI</String>
366 <String Id="ProgressTextWriteIniValuesTemplate" Overridable="yes">แฟ้ม: [1] ส่วน: [2] คีย์: [3] ค่า: [4]</String>
367 <String Id="ProgressTextWriteRegistryValues" Overridable="yes">กำลังเขียนค่ารีจิสทรีของระบบ</String>
368 <String Id="ProgressTextWriteRegistryValuesTemplate" Overridable="yes">คีย์: [1] ชื่อ: [2] ค่า: [3]</String>
369 <String Id="ProgressTextAdvertise" Overridable="yes">กำลังโฆษณาโปรแกรมประยุกต์</String>
370 <String Id="ProgressTextGenerateScript" Overridable="yes">กำลังสร้างการดำเนินการสคริปต์สำหรับการกระทำ:</String>
371 <String Id="ProgressTextGenerateScriptTemplate" Overridable="yes">[1]</String>
372 <String Id="ProgressTextInstallSFPCatalogFile" Overridable="yes">กำลังติดตั้งแค็ตตาล็อกระบบ</String>
373 <String Id="ProgressTextInstallSFPCatalogFileTemplate" Overridable="yes">แฟ้ม: [1] การขึ้นต่อกัน: [2]</String>
374 <String Id="ProgressTextMsiPublishAssemblies" Overridable="yes">กำลังเผยแพร่ข้อมูลแอสเซมบลี</String>
375 <String Id="ProgressTextMsiPublishAssembliesTemplate" Overridable="yes">บริบทของโปรแกรมประยุกต์:[1] ชื่อแอสเซมบลี:[2]</String>
376 <String Id="ProgressTextMsiUnpublishAssemblies" Overridable="yes">กำลังยกเลิกการเผยแพร่ข้อมูลแอสเซมบลี</String>
377 <String Id="ProgressTextMsiUnpublishAssembliesTemplate" Overridable="yes">บริบทของโปรแกรมประยุกต์:[1] ชื่อแอสเซมบลี:[2]</String>
378 <String Id="ProgressTextRollback" Overridable="yes">กำลังย้อนกลับการกระทำ:</String>
379 <String Id="ProgressTextRollbackTemplate" Overridable="yes">[1]</String>
380 <String Id="ProgressTextRollbackCleanup" Overridable="yes">กำลังเอาแฟ้มสำรองออก</String>
381 <String Id="ProgressTextRollbackCleanupTemplate" Overridable="yes">แฟ้ม: [1]</String>
382 <String Id="ProgressTextUnmoveFiles" Overridable="yes">กำลังเอาแฟ้มที่ย้ายออก</String>
383 <String Id="ProgressTextUnmoveFilesTemplate" Overridable="yes">แฟ้ม: [1] ไดเรกทอรี: [9]</String>
384 <String Id="ProgressTextUnpublishProduct" Overridable="yes">กำลังยกเลิกการเผยแพร่ข้อมูลผลิตภัณฑ์</String>
385
386 <String Id="Error0" Overridable="yes">{{ข้อผิดพลาดร้ายแรง: }}</String>
387 <String Id="Error1" Overridable="yes">{{ข้อผิดพลาด [1] }}</String>
388 <String Id="Error2" Overridable="yes">คำเตือน [1] </String>
389 <String Id="Error4" Overridable="yes">ข้อมูล [1] </String>
390 <String Id="Error5" Overridable="yes">โปรแกรมติดตั้งพบข้อผิดพลาดที่ไม่คาดคิดในการติดตั้งแพคเกจนี้ ซึ่งอาจชี้ให้เห็นถึงปัญหาที่เกิดขึ้นกับแพคเกจนี้ รหัสข้อผิดพลาดคือ [1] {{อาร์กิวเมนต์คือ: [2], [3], [4]}}</String>
391 <String Id="Error7" Overridable="yes">{{ดิสก์เต็ม: }}</String>
392 <String Id="Error8" Overridable="yes">การกระทำ [Time]: [1]. [2]</String>
393 <String Id="Error9" Overridable="yes">[ProductName]</String>
394 <String Id="Error10" Overridable="yes">{[2]}{, [3]}{, [4]}</String>
395 <String Id="Error11" Overridable="yes">ชนิดข้อความ: [1] อาร์กิวเมนต์: [2]</String>
396 <String Id="Error12" Overridable="yes">=== การบันทึกเริ่มทำงาน: [Date] [Time] ===</String>
397 <String Id="Error13" Overridable="yes">=== การบันทึกหยุดทำงาน: [Date] [Time] ===</String>
398 <String Id="Error14" Overridable="yes">การกระทำเริ่มทำงาน [Time]: [1]</String>
399 <String Id="Error15" Overridable="yes">การกระทำสิ้นสุด [Time]: [1] ค่าที่ส่งกลับ [2]</String>
400 <String Id="Error16" Overridable="yes">เวลาที่เหลือ: {[1] นาที }{[2] วินาที}</String>
401 <String Id="Error17" Overridable="yes">หน่วยความจำไม่เพียงพอ ให้ปิดโปรแกรมประยุกต์อื่นๆ ก่อน แล้วลองใหม่อีกครั้ง</String>
402 <String Id="Error18" Overridable="yes">โปรแกรมติดตั้งไม่ตอบสนองอีกต่อไป</String>
403 <String Id="Error19" Overridable="yes">โปรแกรมติดตั้งหยุดทำงานก่อนกำหนด</String>
404 <String Id="Error20" Overridable="yes">โปรดรอขณะที่ Windows ทำการกำหนดค่า [ProductName]</String>
405 <String Id="Error21" Overridable="yes">กำลังรวบรวมข้อมูลที่จำเป็น...</String>
406 <String Id="Error22" Overridable="yes">กำลังเอารุ่นที่เก่ากว่าของโปรแกรมประยุกต์นี้ออก...</String>
407 <String Id="Error23" Overridable="yes">กำลังเตรียมเอารุ่นที่เก่ากว่าของโปรแกรมประยุกต์นี้ออก...</String>
408 <String Id="Error32" Overridable="yes">การติดตั้ง {[ProductName] }เสร็จสมบูรณ์</String>
409 <String Id="Error33" Overridable="yes">การติดตั้ง {[ProductName] }ล้มเหลว</String>
410 <String Id="Error1101" Overridable="yes">ข้อผิดพลาดในการอ่านจากแฟ้ม: [2] {{ ข้อผิดพลาดของระบบ [3]}} ให้ตรวจสอบว่ามีแฟ้มอยู่และคุณสามารถเข้าถึงได้</String>
411 <String Id="Error1301" Overridable="yes">ไม่สามารถสร้างแฟ้ม '[2]' ได้ มีไดเรกทอรีที่มีชื่อนี้อยู่แล้ว ให้ยกเลิกการติดตั้งและลองติดตั้งไปที่ตำแหน่งที่ตั้งอื่น</String>
412 <String Id="Error1302" Overridable="yes">โปรดใส่ดิสก์: [2]</String>
413 <String Id="Error1303" Overridable="yes">โปรแกรมติดตั้งมีสิทธิ์ไม่เพียงพอที่จะเข้าถึงไดเรกทอรีนี้: [2] ไม่สามารถทำการติดตั้งต่อไปได้ ให้เข้าสู่ระบบในฐานะผู้ดูแล หรือติดต่อผู้ดูแลระบบของคุณ</String>
414 <String Id="Error1304" Overridable="yes">ข้อผิดพลาดในการเขียนไปยังแฟ้ม: [2] ให้ตรวจสอบว่าคุณสามารถเข้าถึงไดเรกทอรีนั้นได้</String>
415 <String Id="Error1305" Overridable="yes">ข้อผิดพลาดในการอ่านจากแฟ้ม [2] {{ ข้อผิดพลาดของระบบ [3]}} ให้ตรวจสอบว่ามีแฟ้มอยู่และคุณสามารถเข้าถึงได้</String>
416 <String Id="Error1306" Overridable="yes">โปรแกรมประยุกต์อีกโปรแกรมหนึ่งมีเอกสิทธิ์เฉพาะบุคคลในการเข้าถึงแฟ้ม '[2]' โปรดปิดโปรแกรมอื่นทั้งหมดก่อน จากนั้นคลิก ลองใหม่</String>
417 <String Id="Error1307" Overridable="yes">มีเนื้อที่ว่างบนดิสก์ไม่เพียงพอที่จะติดตั้งแฟ้มนี้: [2] ให้เพิ่มพื้นที่ว่างดิสก์ และคลิก ลองใหม่ หรือคลิก ยกเลิก เพื่อออกจากการติดตั้ง</String>
418 <String Id="Error1308" Overridable="yes">ไม่พบแฟ้มต้นฉบับ: [2] ให้ตรวจสอบว่ามีแฟ้มดังกล่าวอยู่และคุณสามารถเข้าถึงแฟ้มนั้นได้</String>
419 <String Id="Error1309" Overridable="yes">ข้อผิดพลาดในการอ่านจากแฟ้ม: [3] {{ ข้อผิดพลาดของระบบ [2]}} ให้ตรวจสอบว่ามีแฟ้มอยู่และคุณสามารถเข้าถึงได้</String>
420 <String Id="Error1310" Overridable="yes">ข้อผิดพลาดในการเขียนไปยังแฟ้ม: [3] {{ ข้อผิดพลาดของระบบ [2]}} ให้ตรวจสอบว่าคุณสามารถเข้าถึงไดเรกทอรีนั้นได้</String>
421 <String Id="Error1311" Overridable="yes">ไม่พบแฟ้มต้นฉบับ{{(cabinet)}}: [2] ให้ตรวจสอบว่ามีแฟ้มนั้นอยู่และคุณสามารถเข้าถึงแฟ้มนั้นได้</String>
422 <String Id="Error1312" Overridable="yes">ไม่สามารถสร้างไดเรกทอรี '[2]' ได้ มีแฟ้มที่มีชื่อนี้อยู่แล้ว โปรดเปลี่ยนชื่อหรือเอาแฟ้มนี้ออกก่อน และคลิก ลองใหม่ หรือคลิก ยกเลิก เพื่อจบการทำงาน</String>
423 <String Id="Error1313" Overridable="yes">ไดรฟ์ข้อมูล [2] ไม่พร้อมใช้งานในขณะนี้ โปรดเลือกไดรฟ์ข้อมูลอื่น</String>
424 <String Id="Error1314" Overridable="yes">เส้นทางที่ระบุ '[2]' ไม่พร้อมใช้งาน</String>
425 <String Id="Error1315" Overridable="yes">ไม่สามารถเขียนไปยังโฟลเดอร์ที่ระบุ: [2]</String>
426 <String Id="Error1316" Overridable="yes">เกิดข้อผิดพลาดเครือข่ายขณะพยายามอ่านจากแฟ้ม: [2]</String>
427 <String Id="Error1317" Overridable="yes">เกิดข้อผิดพลาดขณะพยายามสร้างไดเรกทอรี: [2]</String>
428 <String Id="Error1318" Overridable="yes">เกิดข้อผิดพลาดเครือข่ายขณะพยายามสร้างไดเรกทอรี: [2]</String>
429 <String Id="Error1319" Overridable="yes">เกิดข้อผิดพลาดเครือข่ายขณะพยายามเปิด cabinet ของแฟ้มต้นฉบับ: [2]</String>
430 <String Id="Error1320" Overridable="yes">เส้นทางที่ระบุยาวเกินไป: [2]</String>
431 <String Id="Error1321" Overridable="yes">โปรแกรมติดตั้งมีสิทธิ์ไม่เพียงพอที่จะปรับเปลี่ยนแฟ้มนี้: [2]</String>
432 <String Id="Error1322" Overridable="yes">มีส่วนของเส้นทางโฟลเดอร์ '[2]' ที่ไม่ถูกต้อง ซึ่งอาจว่างเปล่าหรือมีความยาวเกินกว่าที่ระบบอนุญาต</String>
433 <String Id="Error1323" Overridable="yes">เส้นทางโฟลเดอร์ '[2]' มีคำที่ไม่ถูกต้องอยู่ในเส้นทางโฟลเดอร์</String>
434 <String Id="Error1324" Overridable="yes">เส้นทางโฟลเดอร์ '[2]' มีอักขระที่ไม่ถูกต้อง</String>
435 <String Id="Error1325" Overridable="yes">'[2]' ไม่ใช่ชื่อแฟ้มแบบสั้นที่ถูกต้อง</String>
436 <String Id="Error1326" Overridable="yes">ข้อผิดพลาดในการรับความปลอดภัยของแฟ้ม: [3] GetLastError: [2]</String>
437 <String Id="Error1327" Overridable="yes">ไดรฟ์ที่ไม่ถูกต้อง: [2]</String>
438 <String Id="Error1328" Overridable="yes">เกิดข้อผิดพลาดขณะนำโปรแกรมแก้ไขไปใช้กับแฟ้ม [2] แฟ้มอาจถูกปรับปรุงโดยวิธีอื่น และไม่สามารถปรับเปลี่ยนได้โดยโปรแกรมแก้ไขนี้ สำหรับข้อมูลเพิ่มเติม ให้ติดต่อผู้จำหน่ายโปรแกรมแก้ไข {{ข้อผิดพลาดของระบบ: [3]}}</String>
439 <String Id="Error1329" Overridable="yes">ไม่สามารถติดตั้งแฟ้มที่จำเป็นได้ เนื่องจากแฟ้ม cabinet [2] ไม่มีการเซ็นชื่อแบบดิจิทัล ซึ่งอาจชี้ว่าแฟ้ม cabinet เสียหาย</String>
440 <String Id="Error1330" Overridable="yes">ไม่สามารถติดตั้งแฟ้มที่จำเป็นได้ เนื่องจากแฟ้ม cabinet [2] มีลายเซ็นดิจิทัลที่ไม่ถูกต้อง ซึ่งอาจชี้ว่าแฟ้ม cabinet เสียหาย{{ ข้อผิดพลาด [3] ถูกส่งกลับมาโดย WinVerifyTrust}}</String>
441 <String Id="Error1331" Overridable="yes">ไม่สามารถคัดลอกแฟ้ม [2] ได้อย่างถูกต้อง: ข้อผิดพลาด CRC</String>
442 <String Id="Error1332" Overridable="yes">ไม่สามารถย้ายแฟ้ม [2] ได้อย่างถูกต้อง: ข้อผิดพลาด CRC</String>
443 <String Id="Error1333" Overridable="yes">ไม่สามารถแก้ไขแฟ้ม [2] ได้อย่างถูกต้อง: ข้อผิดพลาด CRC</String>
444 <String Id="Error1334" Overridable="yes">ไม่สามารถติดตั้งแฟ้ม '[2]' ได้เนื่องจากไม่พบแฟ้มในแฟ้ม Cabinet '[3]' ซึ่งอาจชี้ให้เห็นถึงข้อผิดพลาดเครือข่าย ข้อผิดพลาดในการอ่านจากซีดีรอม หรือปัญหาที่เกิดกับแพคเกจนี้</String>
445 <String Id="Error1335" Overridable="yes">แฟ้ม Cabinet '[2]' ที่จำเป็นสำหรับการติดตั้งนี้เสียหายและไม่สามารถใช้ได้ ซึ่งอาจชี้ให้เห็นถึงข้อผิดพลาดเครือข่าย ข้อผิดพลาดในการอ่านจากซีดีรอม หรือปัญหาที่เกิดกับแพคเกจนี้</String>
446 <String Id="Error1336" Overridable="yes">มีข้อผิดพลาดในการสร้างแฟ้มชั่วคราวที่จำเป็นสำหรับการดำเนินการติดตั้งนี้ให้เสร็จสมบูรณ์{{ โฟลเดอร์: [3] รหัสข้อผิดพลาดของระบบ: [2]}}</String>
447 <String Id="Error1401" Overridable="yes">ไม่สามารถสร้างคีย์: [2] {{ ข้อผิดพลาดของระบบ [3]}} ให้ตรวจสอบว่าคุณมีสิทธิ์เพียงพอที่จะเข้าถึงคีย์นั้น หรือติดต่อเจ้าหน้าที่ฝ่ายสนับสนุนของคุณ </String>
448 <String Id="Error1402" Overridable="yes">ไม่สามารถเปิดคีย์: [2] {{ ข้อผิดพลาดของระบบ [3]}} ให้ตรวจสอบว่าคุณมีสิทธิ์เพียงพอที่จะเข้าถึงคีย์นั้น หรือติดต่อเจ้าหน้าที่ฝ่ายสนับสนุนของคุณ </String>
449 <String Id="Error1403" Overridable="yes">ไม่สามารถลบค่า [2] จากคีย์ [3] {{ ข้อผิดพลาดของระบบ [4]}} ให้ตรวจสอบว่าคุณมีสิทธิ์เพียงพอที่จะเข้าถึงคีย์นั้น หรือติดต่อเจ้าหน้าที่ฝ่ายสนับสนุนของคุณ </String>
450 <String Id="Error1404" Overridable="yes">ไม่สามารถลบคีย์ [2] {{ ข้อผิดพลาดของระบบ [3]}} ให้ตรวจสอบว่าคุณมีสิทธิ์เพียงพอที่จะเข้าถึงคีย์นั้น หรือติดต่อเจ้าหน้าที่ฝ่ายสนับสนุนของคุณ </String>
451 <String Id="Error1405" Overridable="yes">ไม่สามารถอ่านค่า [2] จากคีย์ [3] {{ ข้อผิดพลาดของระบบ [4]}} ให้ตรวจสอบว่าคุณมีสิทธิ์เพียงพอที่จะเข้าถึงคีย์นั้น หรือติดต่อเจ้าหน้าที่ฝ่ายสนับสนุนของคุณ </String>
452 <String Id="Error1406" Overridable="yes">ไม่สามารถเขียนค่า [2] ไปยังคีย์ [3] {{ ข้อผิดพลาดของระบบ [4]}} ให้ตรวจสอบว่าคุณมีสิทธิ์เพียงพอที่จะเข้าถึงคีย์นั้น หรือติดต่อเจ้าหน้าที่ฝ่ายสนับสนุนของคุณ</String>
453 <String Id="Error1407" Overridable="yes">ไม่สามารถรับชื่อค่าสำหรับคีย์ [2] {{ ข้อผิดพลาดของระบบ [3]}} ให้ตรวจสอบว่าคุณมีสิทธิ์เพียงพอที่จะเข้าถึงคีย์นั้น หรือติดต่อเจ้าหน้าที่ฝ่ายสนับสนุนของคุณ</String>
454 <String Id="Error1408" Overridable="yes">ไม่สามารถรับชื่อคีย์ย่อยสำหรับคีย์ [2] {{ ข้อผิดพลาดของระบบ [3]}} ให้ตรวจสอบว่าคุณมีสิทธิ์เพียงพอที่จะเข้าถึงคีย์นั้น หรือติดต่อเจ้าหน้าที่ฝ่ายสนับสนุนของคุณ</String>
455 <String Id="Error1409" Overridable="yes">ไม่สามารถอ่านข้อมูลความปลอดภัยสำหรับคีย์ [2] {{ ข้อผิดพลาดของระบบ [3]}} ให้ตรวจสอบว่าคุณมีสิทธิ์เพียงพอที่จะเข้าถึงคีย์นั้น หรือติดต่อเจ้าหน้าที่ฝ่ายสนับสนุนของคุณ</String>
456 <String Id="Error1410" Overridable="yes">ไม่สามารถเพิ่มเนื้อที่รีจิสทรีที่พร้อมใช้งาน จำเป็นต้องใช้เนื้อที่รีจิสทรีว่าง [2] กิโลไบต์สำหรับการติดตั้งโปรแกรมประยุกต์นี้</String>
457 <String Id="Error1500" Overridable="yes">กำลังดำเนินการติดตั้งอื่นอยู่ คุณต้องดำเนินการติดตั้งนั้นให้เสร็จสมบูรณ์ก่อนที่จะทำการติดตั้งนี้ต่อไป</String>
458 <String Id="Error1501" Overridable="yes">ข้อผิดพลาดในการเข้าถึงข้อมูลที่มีการรักษาความปลอดภัย โปรดตรวจสอบให้แน่ใจว่ามีการกำหนดค่า Windows Installer อย่างถูกต้อง และลองติดตั้งอีกครั้ง</String>
459 <String Id="Error1502" Overridable="yes">ผู้ใช้ '[2]' ได้เริ่มต้นการติดตั้งผลิตภัณฑ์ '[3]' แล้วก่อนหน้านี้ ผู้ใช้ดังกล่าวต้องเรียกใช้การติดตั้งนั้นอีกครั้งก่อนจึงจะสามารถใช้ผลิตภัณฑ์นั้นได้ การติดตั้งปัจจุบันของคุณจะดำเนินการต่อไปในขณะนี้</String>
460 <String Id="Error1503" Overridable="yes">ผู้ใช้ '[2]' ได้เริ่มต้นการติดตั้งผลิตภัณฑ์ '[3]' แล้วก่อนหน้านี้ ผู้ใช้ดังกล่าวต้องเรียกใช้การติดตั้งนั้นอีกครั้งก่อนจึงจะสามารถใช้ผลิตภัณฑ์นั้นได้</String>
461 <String Id="Error1601" Overridable="yes">เนื้อที่ว่างบนดิสก์ไม่เพียงพอ -- ไดรฟ์ข้อมูล: '[2]'; พื้นที่ที่ต้องการ: [3] กิโลไบต์; พื้นที่ที่มีอยู่: [4] กิโลไบต์ ให้เพิ่มเนื้อที่ว่างบนดิสก์แล้วลองใหม่</String>
462 <String Id="Error1602" Overridable="yes">คุณแน่ใจหรือไม่ว่าคุณต้องการยกเลิก</String>
463 <String Id="Error1603" Overridable="yes">แฟ้ม [2][3] กำลังถูกนำไปใช้งาน{ โดยขั้นตอนต่อไปนี้: ชื่อ: [4], Id: [5], ชื่อหน้าต่าง: '[6]'} ให้ปิดโปรแกรมประยุกต์นั้นแล้วลองใหม่</String>
464 <String Id="Error1604" Overridable="yes">ผลิตภัณฑ์ '[2]' ถูกติดตั้งไว้แล้ว ซึ่งจะป้องกันไม่ให้มีการติดตั้งผลิตภัณฑ์นี้ ผลิตภัณฑ์ทั้งสองไม่สามารถทำงานร่วมกันได้</String>
465 <String Id="Error1605" Overridable="yes">มีเนื้อที่ดิสก์บนไดรฟ์ข้อมูล '[2]' ไม่เพียงพอที่จะทำการติดตั้งต่อไปโดยที่เปิดใช้งานการกู้คืน เนื้อที่ที่ต้องการคือ [3] กิโลไบต์ แต่มีเนื้อที่ที่พร้อมใช้งานเพียง [4] กิโลไบต์ คลิก ละเว้น เพื่อทำการติดตั้งต่อไปโดยไม่บันทึกข้อมูลการกู้คืน คลิก ลองใหม่ เพื่อตรวจสอบเนื้อที่ที่พร้อมใช้งานอีกครั้ง หรือคลิก ยกเลิก เพื่อออกจากการติดตั้ง</String>
466 <String Id="Error1606" Overridable="yes">ไม่สามารถเข้าถึงตำแหน่งบนเครือข่าย [2]</String>
467 <String Id="Error1607" Overridable="yes">ควรปิดโปรแกรมประยุกต์ต่อไปนี้ก่อนทำการติดตั้งต่อไป:</String>
468 <String Id="Error1608" Overridable="yes">ไม่พบผลิตภัณฑ์ที่เข้ากันได้ถูกติดตั้งไว้ก่อนหน้านี้บนเครื่องที่จะติดตั้งผลิตภัณฑ์นี้</String>
469 <String Id="Error1609" Overridable="yes">เกิดข้อผิดพลาดขณะใช้การตั้งค่าความปลอดภัย [2] ไม่ใช่ผู้ใช้หรือกลุ่มที่ถูกต้อง อาจเป็นปัญหาที่เกิดขึ้นกับแพคเกจ หรือปัญหาที่เกี่ยวข้องกับตัวควบคุมโดเมนบนเครือข่าย ให้ตรวจสอบการเชื่อมต่อเครือข่ายของคุณ แล้วคลิก ลองใหม่ หรือ ยกเลิก เพื่อจบการติดตั้ง {{ไม่สามารถค้นหาตำแหน่ง SID ของผู้ใช้ ข้อผิดพลาดของระบบ [3]}}</String>
470 <String Id="Error1701" Overridable="yes">คีย์ [2] ไม่ถูกต้อง ให้ตรวจสอบว่าคุณได้ใส่คีย์ที่ถูกต้อง</String>
471 <String Id="Error1702" Overridable="yes">โปรแกรมติดตั้งต้องเริ่มการทำงานของระบบของคุณใหม่ ก่อนจึงจะสามารถกำหนดค่า [2] ต่อไปได้ คลิก ใช่ เพื่อเริ่มการทำงานใหม่เดี๋ยวนี้ หรือ ไม่ใช่ หากคุณวางแผนที่จะเริ่มการทำงานใหม่ด้วยตนเองในภายหลัง</String>
472 <String Id="Error1703" Overridable="yes">คุณต้องเริ่มการทำงานของระบบของคุณใหม่เพื่อให้การเปลี่ยนแปลงการกำหนดค่าที่ทำไว้กับ [2] มีผล คลิก ใช่ เพื่อเริ่มการทำงานใหม่เดี๋ยวนี้ หรือ ไม่ใช่ หากคุณวางแผนที่จะเริ่มการทำงานใหม่ด้วยตนเองในภายหลัง</String>
473 <String Id="Error1704" Overridable="yes">ในขณะนี้การติดตั้งสำหรับ [2] ถูกหยุดชั่วคราว คุณต้องเลิกทำการเปลี่ยนแปลงที่เกิดจากการติดตั้งนั้นจึงจะทำต่อไปได้ คุณต้องการเลิกทำการเปลี่ยนแปลงเหล่านั้นหรือไม่</String>
474 <String Id="Error1705" Overridable="yes">การติดตั้งครั้งก่อนหน้าของผลิตภัณฑ์นี้ยังอยู่ในระหว่างการดำเนินการ คุณต้องเลิกทำการเปลี่ยนแปลงที่เกิดจากการติดตั้งนั้นก่อนจึงจะทำต่อไปได้ คุณต้องการเลิกทำการเปลี่ยนแปลงเหล่านั้นหรือไม่</String>
475 <String Id="Error1706" Overridable="yes">ไม่พบแพคเกจการติดตั้งสำหรับผลิตภัณฑ์ [2] ลองติดตั้งอีกครั้งโดยใช้สำเนาที่ถูกต้องของแพคเกจการติดตั้ง '[3]'</String>
476 <String Id="Error1707" Overridable="yes">การติดตั้งเสร็จสมบูรณ์</String>
477 <String Id="Error1708" Overridable="yes">การติดตั้งล้มเหลว</String>
478 <String Id="Error1709" Overridable="yes">ผลิตภัณฑ์: [2] -- [3]</String>
479 <String Id="Error1710" Overridable="yes">คุณอาจคืนค่าคอมพิวเตอร์ของคุณกลับสู่สถานะก่อนหน้า หรือทำการติดตั้งต่อในภายหลัง คุณต้องการคืนค่าหรือไม่</String>
480 <String Id="Error1711" Overridable="yes">เกิดข้อผิดพลาดขณะเขียนข้อมูลการติดตั้งลงในดิสก์ ให้ตรวจสอบให้แน่ใจว่ามีเนื้อที่ว่างในดิสก์เพียงพอ แล้วคลิก ลองใหม่ หรือ ยกเลิก เพื่อจบการติดตั้ง</String>
481 <String Id="Error1712" Overridable="yes">ไม่พบแฟ้มที่จำเป็นในการคืนค่าให้กับคอมพิวเตอร์ของคุณให้กลับสู่สถานะก่อนหน้า การคืนค่าไม่สามารถทำได้</String>
482 <String Id="Error1713" Overridable="yes">[2] ไม่สามารถติดตั้งหนึ่งในผลิตภัณฑ์ที่จำเป็นได้ ให้ติดต่อกลุ่มสนับสนุนด้านเทคนิคของคุณ {{ข้อผิดพลาดของระบบ: [3]}}</String>
483 <String Id="Error1714" Overridable="yes">ไม่สามารถเอา [2] รุ่นที่เก่ากว่าออกได้ ให้ติดต่อกลุ่มสนับสนุนด้านเทคนิคของคุณ {{ข้อผิดพลาดของระบบ [3]}}</String>
484 <String Id="Error1715" Overridable="yes">ติดตั้ง [2] แล้ว</String>
485 <String Id="Error1716" Overridable="yes">กำหนดค่า [2] แล้ว</String>
486 <String Id="Error1717" Overridable="yes">เอา [2] ออกแล้ว</String>
487 <String Id="Error1718" Overridable="yes">แฟ้ม [2] ถูกปฏิเสธโดยนโยบายลายเซ็นดิจิทัล</String>
488 <String Id="Error1719" Overridable="yes">ไม่สามารถเข้าถึงบริการ Windows Installer ซึ่งอาจเกิดขึ้นหากคุณกำลังเรียกใช้ Windows ในเซฟโหมด หรือหากไม่ได้ติดตั้ง Windows Installer ไว้อย่างถูกต้อง ให้ติดต่อเจ้าหน้าที่ฝ่ายสนับสนุนของคุณเพื่อขอความช่วยเหลือ</String>
489 <String Id="Error1720" Overridable="yes">มีปัญหากับแพคเกจ Windows Installer นี้ ไม่สามารถเรียกใช้สคริปต์ที่จำเป็นสำหรับการติดตั้งนี้ให้เสร็จสมบูรณ์ได้ ให้ติดต่อเจ้าหน้าที่ฝ่ายสนับสนุนหรือผู้จำหน่ายแพคเกจของคุณ {{การกระทำที่กำหนดเอง [2] ข้อผิดพลาดสคริปต์ [3], [4]: [5] บรรทัด [6], คอลัมน์ [7], [8] }}</String>
490 <String Id="Error1721" Overridable="yes">มีปัญหากับแพคเกจ Windows Installer นี้ ไม่สามารถเรียกใช้โปรแกรมที่จำเป็นสำหรับการดำเนินการติดตั้งนี้ให้เสร็จสมบูรณ์ได้ ให้ติดต่อเจ้าหน้าที่ฝ่ายสนับสนุนหรือผู้ขายแพคเกจของคุณ {{การกระทำ: [2] ตำแหน่ง: [3] คำสั่ง: [4] }}</String>
491 <String Id="Error1722" Overridable="yes">มีปัญหากับแพคเกจ Windows Installer นี้ โปรแกรมที่เรียกใช้ซึ่งเป็นส่วนหนึ่งของการติดตั้งยังไม่เสร็จสิ้นตามที่คาดไว้ ให้ติดต่อเจ้าหน้าที่ฝ่ายสนับสนุนหรือผู้จำหน่ายแพคเกจของคุณ {{การกระทำ [2], ตำแหน่ง: [3], คำสั่ง: [4] }}</String>
492 <String Id="Error1723" Overridable="yes">มีปัญหากับแพคเกจ Windows Installer นี้ ไม่สามารถเรียกใช้ DLL ที่จำเป็นสำหรับการติดตั้งนี้ให้เสร็จสมบูรณ์ได้ ให้ติดต่อเจ้าหน้าที่ฝ่ายสนับสนุนหรือผู้จำหน่ายแพคเกจของคุณ {{การกระทำ [2], รายการ: [3], ไลบรารี: [4] }}</String>
493 <String Id="Error1724" Overridable="yes">การเอาออกเสร็จสมบูรณ์</String>
494 <String Id="Error1725" Overridable="yes">การเอาออกล้มเหลว</String>
495 <String Id="Error1726" Overridable="yes">การโฆษณาเสร็จสมบูรณ์</String>
496 <String Id="Error1727" Overridable="yes">การโฆษณาล้มเหลว</String>
497 <String Id="Error1728" Overridable="yes">การกำหนดค่าเสร็จสมบูรณ์</String>
498 <String Id="Error1729" Overridable="yes">การกำหนดค่าล้มเหลว</String>
499 <String Id="Error1730" Overridable="yes">คุณต้องเป็นผู้ดูแลจึงจะสามารถเอาโปรแกรมประยุกต์นี้ออกได้ เมื่อต้องการเอาโปรแกรมประยุกต์นี้ออก คุณสามารถเข้าสู่ระบบในฐานะผู้ดูแล หรือติดต่อกลุ่มสนับสนุนด้านเทคนิคของคุณเพื่อขอความช่วยเหลือ</String>
500 <String Id="Error1731" Overridable="yes">แพคเกจการติดตั้งต้นทางสำหรับผลิตภัณฑ์ [2] มีข้อมูลไม่ตรงกับแพคเกจของไคลเอ็นต์ ให้ลองติดตั้งใหม่อีกครั้งโดยใช้แพคเกจการติดตั้งที่ถูกต้อง '[3]'</String>
501 <String Id="Error1732" Overridable="yes">ในการติดตั้ง [2] ให้เสร็จสมบูรณ์ คุณต้องเริ่มการทำงานของคอมพิวเตอร์ใหม่ ผู้ใช้อื่นอาจเข้าสู่ระบบคอมพิวเตอร์เครื่องนี้อยู่ในขณะนี้ และการเริ่มการทำงานใหม่อาจทำให้ผู้ใช้อื่นสูญเสียงานที่กระทำอยู่ คุณต้องการเริ่มการทำงานของคอมพิวเตอร์ใหม่เดี๋ยวนี้หรือไม่</String>
502 <String Id="Error1801" Overridable="yes">เส้นทาง [2] ไม่ถูกต้อง โปรดระบุเส้นทางที่ถูกต้อง</String>
503 <String Id="Error1802" Overridable="yes">หน่วยความจำไม่เพียงพอ ให้ปิดโปรแกรมประยุกต์อื่นๆ ก่อน แล้วลองใหม่อีกครั้ง</String>
504 <String Id="Error1803" Overridable="yes">ไม่มีดิสก์ในไดรฟ์ [2] โปรดใส่ดิสก์แล้วคลิก ลองใหม่ หรือคลิก ยกเลิก เพื่อกลับไปยังไดรฟ์ข้อมูลที่เลือกไว้ก่อนหน้านี้</String>
505 <String Id="Error1804" Overridable="yes">ไม่มีดิสก์ในไดรฟ์ [2] โปรดใส่ดิสก์แล้วคลิก ลองใหม่ หรือคลิก ยกเลิก เพื่อกลับไปยังกล่องโต้ตอบการเรียกดู และเลือกไดรฟ์ข้อมูลอื่น</String>
506 <String Id="Error1805" Overridable="yes">ไม่มีโฟลเดอร์ [2] อยู่ โปรดป้อนเส้นทางไปยังโฟลเดอร์ที่มีอยู่</String>
507 <String Id="Error1806" Overridable="yes">คุณมีสิทธิ์ไม่เพียงพอที่จะอ่านโฟลเดอร์นี้</String>
508 <String Id="Error1807" Overridable="yes">ไม่สามารถระบุโฟลเดอร์ปลายทางที่ถูกต้องสำหรับการติดตั้งได้</String>
509 <String Id="Error1901" Overridable="yes">ข้อผิดพลาดในการพยายามอ่านจากฐานข้อมูลการติดตั้งแฟ้มต้นฉบับ: [2]</String>
510 <String Id="Error1902" Overridable="yes">การจัดกำหนดการดำเนินการเริ่มระบบของคอมพิวเตอร์ใหม่: การเปลี่ยนชื่อแฟ้ม [2] เป็น [3] จะต้องเริ่มระบบของคอมพิวเตอร์ใหม่เพื่อให้การดำเนินการเสร็จสมบูรณ์</String>
511 <String Id="Error1903" Overridable="yes">การจัดกำหนดการดำเนินการเริ่มระบบของคอมพิวเตอร์ใหม่: การลบแฟ้ม [2] จะต้องเริ่มระบบของคอมพิวเตอร์ใหม่เพื่อให้การดำเนินการเสร็จสมบูรณ์</String>
512 <String Id="Error1904" Overridable="yes">ไม่สามารถลงทะเบียนมอดูล [2] HRESULT [3] ให้ติดต่อเจ้าหน้าที่ฝ่ายสนับสนุนของคุณ</String>
513 <String Id="Error1905" Overridable="yes">ไม่สามารถยกเลิกการลงทะเบียนมอดูล [2] HRESULT [3] ให้ติดต่อเจ้าหน้าที่ฝ่ายสนับสนุนของคุณ</String>
514 <String Id="Error1906" Overridable="yes">ไม่สามารถแคชแพคเกจ [2] ข้อผิดพลาด: [3] ให้ติดต่อเจ้าหน้าที่ฝ่ายสนับสนุนของคุณ</String>
515 <String Id="Error1907" Overridable="yes">ไม่สามารถลงทะเบียนแบบอักษร [2] ได้ ให้ตรวจสอบว่าคุณมีสิทธิ์เพียงพอในการติดตั้งแบบอักษร และระบบที่ใช้สนับสนุนแบบอักษรนี้</String>
516 <String Id="Error1908" Overridable="yes">ไม่สามารถยกเลิกการลงทะเบียนแบบอักษร [2] ให้ตรวจสอบว่าคุณมีสิทธิ์เพียงพอที่จะเอาแบบอักษรออก</String>
517 <String Id="Error1909" Overridable="yes">ไม่สามารถสร้างทางลัด [2] ให้ตรวจสอบว่ามีโฟลเดอร์ปลายทางอยู่และคุณสามารถเข้าถึงได้</String>
518 <String Id="Error1910" Overridable="yes">ไม่สามารถเอาทางลัด [2] ออกได้ ให้ตรวจสอบว่ามีแฟ้มทางลัดอยู่และคุณสามารถเข้าถึงได้</String>
519 <String Id="Error1911" Overridable="yes">ไม่สามารถลงทะเบียนไลบรารีชนิดสำหรับแฟ้ม [2] ให้ติดต่อเจ้าหน้าที่ฝ่ายสนับสนุนของคุณ</String>
520 <String Id="Error1912" Overridable="yes">ไม่สามารถยกเลิกการลงทะเบียนไลบรารีชนิดสำหรับแฟ้ม [2] ให้ติดต่อเจ้าหน้าที่ฝ่ายสนับสนุนของคุณ</String>
521 <String Id="Error1913" Overridable="yes">ไม่สามารถปรับปรุงแฟ้ม ini [2][3] ให้ตรวจสอบว่ามีแฟ้มดังกล่าวอยู่ และคุณสามารถเข้าถึงแฟ้มนี้ได้</String>
522 <String Id="Error1914" Overridable="yes">ไม่สามารถจัดกำหนดการแฟ้ม [2] เพื่อแทนที่แฟ้ม [3] เมื่อเริ่มระบบของคอมพิวเตอร์ใหม่ ให้ตรวจสอบว่าคุณมีสิทธิ์ในการเขียนไปยังแฟ้ม [3]</String>
523 <String Id="Error1915" Overridable="yes">ข้อผิดพลาดในการเอาตัวจัดการโปรแกรมควบคุม ODBC ออก ข้อผิดพลาด ODBC [2]: [3] ให้ติดต่อเจ้าหน้าที่ฝ่ายสนับสนุนของคุณ</String>
524 <String Id="Error1916" Overridable="yes">ข้อผิดพลาดในการติดตั้งตัวจัดการโปรแกรมควบคุม ODBC ข้อผิดพลาด ODBC [2]: [3] ให้ติดต่อเจ้าหน้าที่ฝ่ายสนับสนุนของคุณ</String>
525 <String Id="Error1917" Overridable="yes">ข้อผิดพลาดในการเอาโปรแกรมควบคุม ODBC ออก: [4] ข้อผิดพลาด ODBC [2]: [3] ให้ตรวจสอบว่าคุณมีสิทธิ์เพียงพอในการเอาโปรแกรมควบคุม ODBC ออก</String>
526 <String Id="Error1918" Overridable="yes">ข้อผิดพลาดในการติดตั้งโปรแกรมควบคุม ODBC: [4] ข้อผิดพลาด ODBC [2]: [3] ให้ตรวจสอบว่ามีแฟ้ม [4] อยู่และคุณสามารถเข้าถึงได้</String>
527 <String Id="Error1919" Overridable="yes">ข้อผิดพลาดในการกำหนดค่าแหล่งข้อมูล ODBC: [4] ข้อผิดพลาด ODBC [2]: [3] ให้ตรวจสอบว่ามีแฟ้ม [4] อยู่และคุณสามารถเข้าถึงได้</String>
528 <String Id="Error1920" Overridable="yes">บริการ '[2]' ([3]) ไม่สามารถเริ่มทำงาน ให้ตรวจสอบว่าคุณมีสิทธิ์เพียงพอในการเริ่มบริการของระบบได้</String>
529 <String Id="Error1921" Overridable="yes">ไม่สามารถหยุดบริการ '[2]' ([3]) ได้ ให้ตรวจสอบว่าคุณมีสิทธิ์เพียงพอที่จะหยุดบริการของระบบได้</String>
530 <String Id="Error1922" Overridable="yes">ไม่สามารถลบบริการ '[2]' ([3]) ออกได้ ให้ตรวจสอบว่าคุณมีสิทธิ์เพียงพอที่จะเอาบริการของระบบออกได้</String>
531 <String Id="Error1923" Overridable="yes">ไม่สามารถติดตั้งบริการ '[2]' ([3]) ได้ ให้ตรวจสอบว่าคุณมีสิทธิ์เพียงพอที่จะติดตั้งบริการของระบบได้</String>
532 <String Id="Error1924" Overridable="yes">ไม่สามารถปรับปรุงตัวแปรสภาพแวดล้อม '[2]' ได้ ให้ตรวจสอบว่าคุณมีสิทธิ์เพียงพอที่จะปรับเปลี่ยนตัวแปรสภาพแวดล้อมได้</String>
533 <String Id="Error1925" Overridable="yes">คุณไม่มีสิทธิ์เพียงพอที่จะดำเนินการติดตั้งนี้ให้เสร็จสมบูรณ์สำหรับผู้ใช้เครื่องนี้ทุกราย ให้เข้าสู่ระบบในฐานะผู้ดูแลระบบ แล้วลองทำการติดตั้งนี้อีกครั้ง</String>
534 <String Id="Error1926" Overridable="yes">ไม่สามารถตั้งค่าความปลอดภัยสำหรับแฟ้ม '[3]' ได้ ข้อผิดพลาด: [2] ให้ตรวจสอบว่าคุณมีสิทธิ์เพียงพอที่จะปรับเปลี่ยนสิทธิด้านความปลอดภัย (security permission) สำหรับแฟ้มนี้ได้</String>
535 <String Id="Error1927" Overridable="yes">ไม่มีการติดตั้งบริการคอมโพเนนต์ (COM+ 1.0) บนคอมพิวเตอร์นี้ การติดตั้งนี้จำเป็นต้องใช้บริการคอมโพเนนต์เพื่อดำเนินการให้เสร็จสมบูรณ์ บริการคอมโพเนนต์มีอยู่บน Windows 2000</String>
536 <String Id="Error1928" Overridable="yes">ข้อผิดพลาดในการลงทะเบียนโปรแกรมประยุกต์ COM+ สำหรับข้อมูลเพิ่มเติม ให้ติดต่อเจ้าหน้าที่ฝ่ายสนับสนุนของคุณ</String>
537 <String Id="Error1929" Overridable="yes">ข้อผิดพลาดในการยกเลิกการลงทะเบียนโปรแกรมประยุกต์ COM+ สำหรับข้อมูลเพิ่มเติม ให้ติดต่อเจ้าหน้าที่ฝ่ายสนับสนุนของคุณ</String>
538 <String Id="Error1930" Overridable="yes">ไม่สามารถเปลี่ยนคำอธิบายสำหรับบริการ '[2]' ([3])</String>
539 <String Id="Error1931" Overridable="yes">บริการ Windows Installer ไม่สามารถปรับปรุงแฟ้มระบบ [2] ได้ เนื่องจากแฟ้มได้รับการป้องกันโดย Windows คุณอาจต้องปรับปรุงระบบปฏิบัติการของคุณเพื่อให้โปรแกรมนี้ทำงานอย่างถูกต้อง {{รุ่นของแพคเกจ: [3], รุ่นที่ได้รับการป้องกันโดย OS: [4]}}</String>
540 <String Id="Error1932" Overridable="yes">บริการ Windows Installer ไม่สามารถปรับปรุงแฟ้ม Windows [2] ที่ได้รับการป้องกันได้ {{รุ่นของแพคเกจ: [3] รุ่นที่ได้รับการป้องกันโดย OS: [4] ข้อผิดพลาด SFP: [5]}}</String>
541 <String Id="Error1933" Overridable="yes">บริการ Windows Installer ไม่สามารถปรับปรุงแฟ้ม Windows ที่ได้รับการป้องกันอย่างน้อยหนึ่งแฟ้ม {{ข้อผิดพลาด SFP: [2] รายการแฟ้มที่ได้รับการป้องกัน:\r\n[3]}}</String>
542 <String Id="Error1934" Overridable="yes">การติดตั้งของผู้ใช้ถูกปิดใช้งานโดยนโยบายของเครื่อง</String>
543 <String Id="Error1935" Overridable="yes">เกิดข้อผิดพลาดระหว่างการติดตั้งแอสเซมบลี '[6]' โปรดดูวิธีใช้และการสนับสนุนสำหรับข้อมูลเพิ่มเติม HRESULT: [3] {{ส่วนติดต่อแอสเซมบลี: [4] ฟังก์ชัน: [5] คอมโพเนนต์: [2]}}</String>
544 <String Id="Error1936" Overridable="yes">เกิดข้อผิดพลาดระหว่างการติดตั้งแอสเซมบลี '[6]' แอสเซมบลีไม่มีการตั้งชื่ออย่างชัดเจน หรือไม่มีการลงชื่อโดยมีความยาวคีย์ขั้นต่ำ HRESULT: [3] {{ส่วนติดต่อแอสเซมบลี: [4] ฟังก์ชัน: [5] คอมโพเนนต์: [2]}}</String>
545 <String Id="Error1937" Overridable="yes">เกิดข้อผิดพลาดระหว่างการติดตั้งแอสเซมบลี '[6]' ไม่สามารถตรวจสอบลายเซ็นหรือแค็ตตาล็อกได้ หรือไม่ถูกต้อง HRESULT: [3] {{ส่วนติดต่อแอสเซมบลี: [4] ฟังก์ชัน: [5] คอมโพเนนต์: [2]}}</String>
546 <String Id="Error1938" Overridable="yes">เกิดข้อผิดพลาดระหว่างการติดตั้งแอสเซมบลี '[6]' ไม่พบโมดูลอย่างน้อยหนึ่งโมดูลของแอสเซมบลี HRESULT: [3]. {{ส่วนติดต่อแอสเซมบลี: [4] ฟังก์ชัน: [5] คอมโพเนนต์: [2]}}</String>
547
548 <String Id="UITextbytes" Overridable="yes">ไบต์</String>
549 <String Id="UITextGB" Overridable="yes">กิกะไบต์</String>
550 <String Id="UITextKB" Overridable="yes">กิโลไบต์</String>
551 <String Id="UITextMB" Overridable="yes">เมกะไบต์</String>
552 <String Id="UITextMenuAbsent" Overridable="yes">คุณลักษณะทั้งหมดจะไม่พร้อมใช้งาน</String>
553 <String Id="UITextMenuAdvertise" Overridable="yes">คุณลักษณะจะได้รับการติดตั้งเมื่อต้องการ</String>
554 <String Id="UITextMenuAllCD" Overridable="yes">คุณลักษณะทั้งหมดจะได้รับการติดตั้งให้เรียกใช้จากซีดี</String>
555 <String Id="UITextMenuAllLocal" Overridable="yes">คุณลักษณะทั้งหมดจะได้รับการติดตั้งลงบนฮาร์ดไดรฟ์ภายในเครื่อง</String>
556 <String Id="UITextMenuAllNetwork" Overridable="yes">คุณลักษณะทั้งหมดจะได้รับการติดตั้งให้เรียกใช้จากเครือข่าย</String>
557 <String Id="UITextMenuCD" Overridable="yes">จะทำการติดตั้งให้เรียกใช้จากซีดี</String>
558 <String Id="UITextMenuLocal" Overridable="yes">จะทำการติดตั้งลงบนฮาร์ดไดรฟ์ภายในเครื่อง</String>
559 <String Id="UITextMenuNetwork" Overridable="yes">จะทำการติดตั้งให้เรียกใช้จากเครือข่าย</String>
560 <String Id="UITextNewFolder" Overridable="yes">โฟลเดอร์|สร้างโฟลเดอร์</String>
561 <String Id="UITextScriptInProgress" Overridable="yes">กำลังรวบรวมข้อมูลที่จำเป็น...</String>
562 <String Id="UITextSelAbsentAbsent" Overridable="yes">คุณลักษณะนี้จะยังคงไม่ได้รับการติดตั้ง</String>
563 <String Id="UITextSelAbsentAdvertise" Overridable="yes">คุณลักษณะนี้จะถูกตั้งค่าให้ติดตั้งเมื่อต้องการ</String>
564 <String Id="UITextSelAbsentCD" Overridable="yes">คุณลักษณะนี้จะได้รับการติดตั้งให้เรียกใช้จากซีดี</String>
565 <String Id="UITextSelAbsentLocal" Overridable="yes">คุณลักษณะนี้จะได้รับการติดตั้งลงบนฮาร์ดไดรฟ์ภายในเครื่อง</String>
566 <String Id="UITextSelAbsentNetwork" Overridable="yes">คุณลักษณะนี้จะได้รับการติดตั้งให้เรียกใช้จากเครือข่าย</String>
567 <String Id="UITextSelAdvertiseAbsent" Overridable="yes">คุณลักษณะนี้จะไม่พร้อมใช้งาน</String>
568 <String Id="UITextSelAdvertiseAdvertise" Overridable="yes">จะทำการติดตั้งเมื่อต้องการ</String>
569 <String Id="UITextSelAdvertiseCD" Overridable="yes">คุณลักษณะนี้จะพร้อมให้เรียกใช้จากซีดี</String>
570 <String Id="UITextSelAdvertiseLocal" Overridable="yes">คุณลักษณะนี้จะได้รับการติดตั้งลงบนฮาร์ดไดรฟ์ภายในเครื่องของคุณ</String>
571 <String Id="UITextSelAdvertiseNetwork" Overridable="yes">คุณลักษณะนี้จะพร้อมให้เรียกใช้จากเครือข่าย</String>
572 <String Id="UITextSelCDAbsent" Overridable="yes">คุณลักษณะนี้จะถูกถอนการติดตั้งโดยสมบูรณ์ คุณจะไม่สามารถเรียกใช้จากซีดีได้อีก</String>
573 <String Id="UITextSelCDAdvertise" Overridable="yes">คุณลักษณะนี้จะเปลี่ยนจากสถานะเรียกใช้จากซีดีเป็นตั้งค่าให้ติดตั้งเมื่อต้องการ</String>
574 <String Id="UITextSelCDCD" Overridable="yes">คุณลักษณะนี้จะยังคงให้เรียกใช้จากซีดี</String>
575 <String Id="UITextSelCDLocal" Overridable="yes">คุณลักษณะนี้จะเปลี่ยนจากสถานะเรียกใช้จากซีดีเป็นทำการติดตั้งลงบนฮาร์ดไดรฟ์ภายในเครื่อง</String>
576 <String Id="UITextSelChildCostNeg" Overridable="yes">คุณลักษณะนี้เพิ่มพื้นที่ [1] บนฮาร์ดไดรฟ์ของคุณ</String>
577 <String Id="UITextSelChildCostPos" Overridable="yes">คุณลักษณะนี้ต้องการ [1] บนฮาร์ดไดรฟ์ของคุณ</String>
578 <String Id="UITextSelCostPending" Overridable="yes">กำลังรวบรวมความต้องการของคุณลักษณะนี้...</String>
579 <String Id="UITextSelLocalAbsent" Overridable="yes">คุณลักษณะนี้จะถูกเอาออกโดยสมบูรณ์</String>
580 <String Id="UITextSelLocalAdvertise" Overridable="yes">คุณลักษณะนี้จะถูกเอาออกจากฮาร์ดไดรฟ์ภายในเครื่องของคุณ แต่จะถูกตั้งค่าให้ติดตั้งเมื่อต้องการ</String>
581 <String Id="UITextSelLocalCD" Overridable="yes">คุณลักษณะนี้จะถูกเอาออกจากฮาร์ดไดรฟ์ภายในเครื่องของคุณ แต่จะยังคงพร้อมให้เรียกใช้จากซีดี</String>
582 <String Id="UITextSelLocalLocal" Overridable="yes">คุณลักษณะนี้จะยังคงอยู่บนฮาร์ดไดรฟ์ภายในเครื่องของคุณ</String>
583 <String Id="UITextSelLocalNetwork" Overridable="yes">คุณลักษณะนี้จะถูกเอาออกจากฮาร์ดไดรฟ์ภายในเครื่องของคุณ แต่จะยังคงพร้อมให้เรียกใช้ได้จากเครือข่าย</String>
584 <String Id="UITextSelNetworkAbsent" Overridable="yes">คุณลักษณะนี้จะถูกถอนการติดตั้งโดยสมบูรณ์ คุณจะไม่สามารถเรียกใช้จากเครือข่ายได้</String>
585 <String Id="UITextSelNetworkAdvertise" Overridable="yes">คุณลักษณะนี้จะเปลี่ยนจากสถานะเรียกใช้จากเครือข่ายเป็นตั้งค่าให้ติดตั้งเมื่อต้องการ</String>
586 <String Id="UITextSelNetworkLocal" Overridable="yes">คุณลักษณะนี้จะเปลี่ยนจากสถานะเรียกใช้จากเครือข่ายเป็นทำการติดตั้งลงบนฮาร์ดไดรฟ์ภายในเครื่อง</String>
587 <String Id="UITextSelNetworkNetwork" Overridable="yes">คุณลักษณะนี้จะยังคงให้เรียกใช้จากเครือข่าย</String>
588 <String Id="UITextSelParentCostNegNeg" Overridable="yes">คุณลักษณะนี้เพิ่มพื้นที่ว่าง [1] บนฮาร์ดไดรฟ์ของคุณ โดยมี [2] จาก [3] คุณลักษณะย่อยที่ถูกเลือก คุณลักษณะย่อยเพิ่มพื้นที่ว่าง [4] บนฮาร์ดไดรฟ์ของคุณ</String>
589 <String Id="UITextSelParentCostNegPos" Overridable="yes">คุณลักษณะนี้เพิ่มพื้นที่ว่าง [1] บนฮาร์ดไดรฟ์ของคุณ โดยมี [2] จาก [3] คุณลักษณะย่อยที่ถูกเลือก คุณลักษณะย่อยต้องการ [4] บนฮาร์ดไดรฟ์ของคุณ</String>
590 <String Id="UITextSelParentCostPosNeg" Overridable="yes">คุณลักษณะนี้ต้องการ [1] บนฮาร์ดไดรฟ์ของคุณ โดยมี [2] จาก [3] คุณลักษณะย่อยที่ถูกเลือก คุณลักษณะย่อยเพิ่มพื้นที่ [4] บนฮาร์ดไดรฟ์ของคุณ</String>
591 <String Id="UITextSelParentCostPosPos" Overridable="yes">คุณลักษณะนี้ต้องการ [1] บนฮาร์ดไดรฟ์ของคุณ โดยมี [2] จาก [3] คุณลักษณะย่อยที่ถูกเลือก คุณลักษณะย่อยต้องการ [4] บนฮาร์ดไดรฟ์ของคุณ</String>
592 <String Id="UITextTimeRemaining" Overridable="yes">เวลาที่เหลือ: {[1] นาที }{[2] วินาที}</String>
593 <String Id="UITextVolumeCostAvailable" Overridable="yes">ว่าง</String>
594 <String Id="UITextVolumeCostDifference" Overridable="yes">ความแตกต่าง</String>
595 <String Id="UITextVolumeCostRequired" Overridable="yes">จำเป็น</String>
596 <String Id="UITextVolumeCostSize" Overridable="yes">ขนาดดิสก์</String>
597 <String Id="UITextVolumeCostVolume" Overridable="yes">ไดรฟ์ข้อมูล</String>
598</WixLocalization>
diff --git a/src/ext/UI/wixlib/WixUI_tr-TR.wxl b/src/ext/UI/wixlib/WixUI_tr-TR.wxl
new file mode 100644
index 00000000..69439ace
--- /dev/null
+++ b/src/ext/UI/wixlib/WixUI_tr-TR.wxl
@@ -0,0 +1,598 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3
4
5<WixLocalization Culture="tr-tr" Codepage="1254" xmlns="http://wixtoolset.org/schemas/v4/wxl">
6 <String Id="WixUIBack" Overridable="yes">&amp;Geri</String>
7 <String Id="WixUINext" Overridable="yes">İ&amp;leri</String>
8 <String Id="WixUICancel" Overridable="yes">İptal</String>
9 <String Id="WixUIFinish" Overridable="yes">&amp;Son</String>
10 <String Id="WixUIRetry" Overridable="yes">Yeniden &amp;Dene</String>
11 <String Id="WixUIIgnore" Overridable="yes">&amp;Yoksay</String>
12 <String Id="WixUIYes" Overridable="yes">&amp;Evet</String>
13 <String Id="WixUINo" Overridable="yes">&amp;Hayır</String>
14 <String Id="WixUIOK" Overridable="yes">Tamam</String>
15 <String Id="WixUIPrint" Overridable="yes">&amp;Yazdır</String>
16
17 <String Id="AdvancedWelcomeEulaDlg_Title" Overridable="yes">[ProductName] Kurulumu</String>
18 <String Id="AdvancedWelcomeEulaDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
19 <String Id="AdvancedWelcomeEulaDlgTitle" Overridable="yes">{\WixUI_Font_Title}Lütfen [ProductName] Lisans Sözleşmesi'ni okuyun</String>
20 <String Id="AdvancedWelcomeEulaDlgLicenseAcceptedCheckBox" Overridable="yes">Lisans Sözleşmesi'nin koşullarını kabul &amp;ediyorum</String>
21 <String Id="AdvancedWelcomeEulaDlgDescriptionPerMachine" Overridable="yes">Ürünü tüm kullanıcılar için varsayılan seçeneklerle yüklemek istiyorsanız Yükle'yi tıklatın. Yükleme seçeneklerini değiştirmek için Gelişmiş'i tıklatın.</String>
22 <String Id="AdvancedWelcomeEulaDlgDescriptionPerUser" Overridable="yes">Ürünü yalnızca sizin için varsayılan seçeneklerle yüklemek istiyorsanız Yükle'yi tıklatın. Yükleme seçeneklerini değiştirmek için Gelişmiş'i tıklatın.</String>
23 <String Id="AdvancedWelcomeEulaDlgInstall" Overridable="yes">Yü&amp;kle</String>
24 <String Id="AdvancedWelcomeEulaDlgAdvanced" Overridable="yes">&amp;Gelişmiş</String>
25 <String Id="Advanced_Font_Normal_Size" Overridable="yes">8</String>
26 <String Id="Advanced_Font_Bigger_Size" Overridable="yes">12</String>
27 <String Id="Advanced_Font_Title_Size" Overridable="yes">9</String>
28 <String Id="Advanced_Font_Emphasized_Size" Overridable="yes">8</String>
29 <String Id="Advanced_Font_FaceName" Overridable="yes">Tahoma</String>
30
31 <String Id="BrowseDlg_Title" Overridable="yes">[ProductName] Kurulumu</String>
32 <String Id="BrowseDlgComboLabel" Overridable="yes">K&amp;onum:</String>
33 <String Id="BrowseDlgWixUI_Bmp_Up" Overridable="yes">WixUI_Bmp_Up</String>
34 <String Id="BrowseDlgWixUI_Bmp_UpTooltip" Overridable="yes">Bir düzey yukarı</String>
35 <String Id="BrowseDlgNewFolder" Overridable="yes">WixUI_Bmp_New</String>
36 <String Id="BrowseDlgNewFolderTooltip" Overridable="yes">Yeni bir klasör oluştur</String>
37 <String Id="BrowseDlgPathLabel" Overridable="yes">K&amp;lasör adı:</String>
38 <String Id="BrowseDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
39 <String Id="BrowseDlgDescription" Overridable="yes">Hedef klasöre gözat</String>
40 <String Id="BrowseDlgTitle" Overridable="yes">{\WixUI_Font_Title}Hedef klasörü değiştir</String>
41
42 <String Id="CancelDlg_Title" Overridable="yes">[ProductName] Kurulumu</String>
43 <String Id="CancelDlgText" Overridable="yes">[ProductName] yükleme işlemini iptal etmek istediğinizden emin misiniz?</String>
44 <String Id="CancelDlgIcon" Overridable="yes">WixUI_Ico_Info</String>
45 <String Id="CancelDlgIconTooltip" Overridable="yes">Bilgi simgesi</String>
46
47 <String Id="CustomizeDlg_Title" Overridable="yes">[ProductName] Kurulumu</String>
48 <String Id="CustomizeDlgTree" Overridable="yes">Seçim ağacı</String>
49 <String Id="CustomizeDlgBrowse" Overridable="yes">Gö&amp;zat...</String>
50 <String Id="CustomizeDlgReset" Overridable="yes">&amp;Sıfırla</String>
51 <String Id="CustomizeDlgDiskCost" Overridable="yes">&amp;Disk Kullanımı</String>
52 <String Id="CustomizeDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
53 <String Id="CustomizeDlgText" Overridable="yes">Özelliklerin yüklenme şeklini değiştirmek için aşağıdaki ağaçtaki simgeleri tıklatın.</String>
54 <String Id="CustomizeDlgDescription" Overridable="yes">Özelliklerin yüklenmesini istediğiniz yöntemi seçin.</String>
55 <String Id="CustomizeDlgTitle" Overridable="yes">{\WixUI_Font_Title}Özel Kurulum</String>
56 <String Id="CustomizeDlgItemDescription" Overridable="yes">CustomizeDlgItemDescription-CustomizeDlgItemDescription</String>
57 <String Id="CustomizeDlgItemSize" Overridable="yes">CustomizeDlgItemSize-CustomizeDlgItemSize</String>
58 <String Id="CustomizeDlgLocation" Overridable="yes">CustomizeDlgLocation-CustomizeDlgLocation</String>
59 <String Id="CustomizeDlgLocationLabel" Overridable="yes">Konum:</String>
60
61 <String Id="DiskCostDlg_Title" Overridable="yes">[ProductName] Kurulumu</String>
62 <String Id="DiskCostDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
63 <String Id="DiskCostDlgText" Overridable="yes">Vurgulanan birimlerde seçilen özellikler için yeterli disk alanı yok. Vurgulanan birimlerdeki bazı dosyaları kaldırabilir, daha az özellik yükleyebilir ya da farklı hedef sürücüler seçebilirsiniz.</String>
64 <String Id="DiskCostDlgDescription" Overridable="yes">Seçili özelliklerin yüklenmesi için gereken disk alanı.</String>
65 <String Id="DiskCostDlgTitle" Overridable="yes">{\WixUI_Font_Title}Disk Alanı Gereksinimleri</String>
66 <String Id="DiskCostDlgVolumeList" Overridable="yes">{120}{70}{70}{70}{70}</String>
67
68 <String Id="ErrorDlg_Title" Overridable="yes">[ProductName] Kurulumu</String>
69 <String Id="ErrorDlgErrorText" Overridable="yes">Bilgi metni</String>
70 <String Id="ErrorDlgErrorIcon" Overridable="yes">WixUI_Ico_Info</String>
71 <String Id="ErrorDlgErrorIconTooltip" Overridable="yes">Bilgi simgesi</String>
72
73 <String Id="ExitDialog_Title" Overridable="yes">[ProductName] Kurulumu</String>
74 <String Id="ExitDialogBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
75 <String Id="ExitDialogDescription" Overridable="yes">Kurulum Sihirbazı'ndan çıkmak için Son düğmesini tıklatın.</String>
76 <String Id="ExitDialogTitle" Overridable="yes">{\WixUI_Font_Bigger}[ProductName] Kurulum Sihirbazı tamamlandı</String>
77
78 <String Id="FatalError_Title" Overridable="yes">[ProductName] Kurulumu</String>
79 <String Id="FatalErrorBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
80 <String Id="FatalErrorTitle" Overridable="yes">{\WixUI_Font_Bigger}[ProductName] Kurulum Sihirbazı tamamlanmadan sona erdi</String>
81 <String Id="FatalErrorDescription1" Overridable="yes">[ProductName] Kurulum Sihirbazı bir hata nedeniyle tamamlanmadan sona erdi. Sisteminizde değişiklik yapılmadı. Daha sonra bu programı yüklemek için Kurulum Sihirbazı'nı yeniden çalıştırın.</String>
82 <String Id="FatalErrorDescription2" Overridable="yes">Kurulum Sihirbazı'ndan çıkmak için Son düğmesini tıklatın.</String>
83
84 <String Id="FeaturesDlg_Title" Overridable="yes">[ProductName] Kurulumu</String>
85 <String Id="FeaturesDlgTree" Overridable="yes">Ürün özellikleri</String>
86 <String Id="FeaturesDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
87 <String Id="FeaturesDlgDescription" Overridable="yes">Özelliklerin yüklenmesini istediğiniz yöntemi seçin.</String>
88 <String Id="FeaturesDlgTitle" Overridable="yes">{\WixUI_Font_Title}Ürün Özellikleri</String>
89 <String Id="FeaturesDlgItemDescription" Overridable="yes">FeaturesDlgItemDescription</String>
90 <String Id="FeaturesDlgItemSize" Overridable="yes">FeaturesDlgItemSize</String>
91 <String Id="FeaturesDlgInstall" Overridable="yes">Yü&amp;kle</String>
92 <String Id="FeaturesDlgChange" Overridable="yes">&amp;Değiştir</String>
93
94 <String Id="FilesInUse_Title" Overridable="yes">[ProductName] Kurulumu</String>
95 <String Id="FilesInUseExit" Overridable="yes">Çı&amp;kış</String>
96 <String Id="FilesInUseBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
97 <String Id="FilesInUseText" Overridable="yes">Aşağıdaki uygulamalar, bu kurulum tarafından güncelleştirilmesi gereken dosyaları kullanıyor. Söz konusu uygulamaları kapatın ve yükleme işlemine devam etmek için Yeniden &amp;Dene'yi veya yüklemeden çıkmak için Çıkış'ı tıklatın.</String>
98 <String Id="FilesInUseDescription" Overridable="yes">Güncelleştirilmesi gereken bazı dosyalar şu anda kullanılıyor.</String>
99 <String Id="FilesInUseTitle" Overridable="yes">{\WixUI_Font_Title}Kullanılan Dosyalar</String>
100
101 <String Id="InstallDirDlg_Title" Overridable="yes">[ProductName] Kurulumu</String>
102 <String Id="InstallDirDlgChange" Overridable="yes">&amp;Değiştir...</String>
103 <String Id="InstallDirDlgTitle" Overridable="yes">{\WixUI_Font_Title}Hedef Klasör</String>
104 <String Id="InstallDirDlgDescription" Overridable="yes">Varsayılan klasöre yüklemek için İleri'yi tıklatın veya başka bir klasör seçmek için Değiştir'i tıklatın.</String>
105 <String Id="InstallDirDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
106 <String Id="InstallDirDlgFolderLabel" Overridable="yes">[ProductName] ürününün yükleneceği konum:</String>
107
108 <String Id="InstallScopeDlg_Title" Overridable="yes">[ProductName] Kurulumu</String>
109 <String Id="InstallScopeDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
110 <String Id="InstallScopeDlgDescription" Overridable="yes">Yükleme kapsamını ve klasörünü seçin</String>
111 <String Id="InstallScopeDlgTitle" Overridable="yes">{\WixUI_Font_Title}Yükleme Kapsamı</String>
112 <String Id="InstallScopeDlgPerUser" Overridable="yes">{\WixUI_Font_Emphasized}Yalnızca benim için ([LogonUser]) yükle</String>
113 <String Id="InstallScopeDlgPerUserDescription" Overridable="yes">[ProductName] kullanıcıya özel bir klasöre yüklenecek yalnızca sizin kullanıcı hesabınız tarafından kullanılabilecek. Yerel Yönetici ayrıcalıklarınız olması gerekmez.</String>
114 <String Id="InstallScopeDlgNoPerUserDescription" Overridable="yes">[ProductName] kullanıcıya özel yüklemeyi desteklemiyor.</String>
115 <String Id="InstallScopeDlgPerMachine" Overridable="yes">{\WixUI_Font_Emphasized}Bu &amp;makinede tüm kullanıcılar için yükle</String>
116 <String Id="InstallScopeDlgPerMachineDescription" Overridable="yes">[ProductName] varsayılan olarak genel bir klasöre yüklenecek ve tüm kullanıcılar tarafından kullanılabilecek. Varsayılan yükleme klasörünü değiştirebilirsiniz. Yerel Yönetici ayrıcalıklarına sahip olmanız gerekir.</String>
117 <String Id="InstallScopeDlgFolderLabel" Overridable="yes">Yü&amp;kleme klasörü:</String>
118 <String Id="InstallScopeDlgChange" Overridable="yes">&amp;Değiştir...</String>
119
120 <String Id="InvalidDirDlg_Title" Overridable="yes">[ProductName] Kurulumu</String>
121 <String Id="InvalidDirDlgText" Overridable="yes">Yükleme dizini yerel bir sabit sürücüde bulunmalıdır.</String>
122 <String Id="InvalidDirDlgIcon" Overridable="yes">WixUI_Ico_Info</String>
123 <String Id="InvalidDirDlgIconTooltip" Overridable="yes">Bilgi simgesi</String>
124
125 <String Id="LicenseAgreementDlg_Title" Overridable="yes">[ProductName] Kurulumu</String>
126 <String Id="LicenseAgreementDlgLicenseAcceptedCheckBox" Overridable="yes">Lisans Sözleşmesi'nin koşullarını kabul &amp;ediyorum</String>
127 <String Id="LicenseAgreementDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
128 <String Id="LicenseAgreementDlgDescription" Overridable="yes">Lütfen aşağıdaki lisans sözleşmesini dikkatle okuyun</String>
129 <String Id="LicenseAgreementDlgTitle" Overridable="yes">{\WixUI_Font_Title}Son Kullanıcı Lisans Sözleşmesi</String>
130
131 <String Id="MaintenanceTypeDlg_Title" Overridable="yes">[ProductName] Kurulumu</String>
132 <String Id="MaintenanceTypeDlgChangeButton" Overridable="yes">&amp;Değiştir</String>
133 <String Id="MaintenanceTypeDlgChangeButtonTooltip" Overridable="yes">Yüklemeyi Değiştir</String>
134 <String Id="MaintenanceTypeDlgRepairButton" Overridable="yes">&amp;Onar</String>
135 <String Id="MaintenanceTypeDlgRepairButtonTooltip" Overridable="yes">Yüklemeyi Onar</String>
136 <String Id="MaintenanceTypeDlgRemoveButton" Overridable="yes">&amp;Kaldır</String>
137 <String Id="MaintenanceTypeDlgRemoveButtonTooltip" Overridable="yes">Yüklemeyi Kaldır</String>
138 <String Id="MaintenanceTypeDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
139 <String Id="MaintenanceTypeDlgDescription" Overridable="yes">Gerçekleştirmek istediğiniz işlemi seçin.</String>
140 <String Id="MaintenanceTypeDlgTitle" Overridable="yes">{\WixUI_Font_Title}Yüklemeyi değiştirin, onarın veya kaldırın</String>
141 <String Id="MaintenanceTypeDlgChangeText" Overridable="yes">Özelliklerin yüklenme yöntemini değiştirmenizi sağlar.</String>
142 <String Id="MaintenanceTypeDlgChangeDisabledText" Overridable="yes">[ProductName] ürününde bağımsız olarak seçilebilen özellik yoktur.</String>
143 <String Id="MaintenanceTypeDlgRemoveText" Overridable="yes">[ProductName] ürününü bilgisayarınızdan kaldırır.</String>
144 <String Id="MaintenanceTypeDlgRemoveDisabledText" Overridable="yes">[ProductName] kaldırılamıyor.</String>
145 <String Id="MaintenanceTypeDlgRepairText" Overridable="yes">En son yüklemedeki eksik ve bozuk dosyaları, kısayolları ve kayıt defteri girdilerini düzelterek hataları onarır.</String>
146 <String Id="MaintenanceTypeDlgRepairDisabledText" Overridable="yes">[ProductName] onarılamıyor.</String>
147
148 <String Id="MaintenanceWelcomeDlg_Title" Overridable="yes">[ProductName] Kurulumu</String>
149 <String Id="MaintenanceWelcomeDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
150 <String Id="MaintenanceWelcomeDlgDescription" Overridable="yes">Kurulum Sihirbazı, [ProductName] özelliklerinin bilgisayarınıza yüklenme yöntemini değiştirmenize veya ürünü bilgisayarınızdan kaldırmanıza olanak verir. Devam etmek için İleri'yi, Kurulum Sihirbazı'ndan çıkmak içinse İptal'i tıklatın.</String>
151 <String Id="MaintenanceWelcomeDlgTitle" Overridable="yes">{\WixUI_Font_Bigger}[ProductName] Kurulum Sihirbazı'na Hoş Geldiniz</String>
152
153 <String Id="MsiRMFilesInUse_Title" Overridable="yes">[ProductName] Kurulumu</String>
154 <String Id="MsiRMFilesInUseBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
155 <String Id="MsiRMFilesInUseText" Overridable="yes">Aşağıdaki uygulamalar, bu kurulum tarafından güncelleştirilmesi gereken dosyaları kullanıyor. Kurulum Sihirbazı'nın söz konusu uygulamaları kapatmasına ve yeniden başlatmayı denemesine izin verebilir veya makineyi daha sonra yeniden başlatabilirsiniz.</String>
156 <String Id="MsiRMFilesInUseDescription" Overridable="yes">Güncelleştirilmesi gereken bazı dosyalar şu anda kullanılıyor.</String>
157 <String Id="MsiRMFilesInUseTitle" Overridable="yes">{\WixUI_Font_Title}Kullanılan Dosyalar</String>
158 <String Id="MsiRMFilesInUseUseRM" Overridable="yes">&amp;Uygulamaları kapat ve bunları yeniden başlatmayı dene.</String>
159 <String Id="MsiRMFilesInUseDontUseRM" Overridable="yes">Uygula&amp;maları kapatma. Yeniden başlatma gerekir.</String>
160
161 <String Id="OutOfDiskDlg_Title" Overridable="yes">[ProductName] Kurulumu</String>
162 <String Id="OutOfDiskDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
163 <String Id="OutOfDiskDlgText" Overridable="yes">Vurgulanan birimlerde şu anda seçili olan özellikler için yeterli disk alanı yok. Vurgulanan birimlerden bazı dosyaları kaldırabilir, daha az özellik yükleyebilir veya farklı bir hedef sürücü seçebilirsiniz.</String>
164 <String Id="OutOfDiskDlgDescription" Overridable="yes">Yükleme için gereken disk alanı, kullanılabilir disk alanını aşıyor.</String>
165 <String Id="OutOfDiskDlgTitle" Overridable="yes">{\WixUI_Font_Title}Disk Alanı Yetersiz</String>
166 <String Id="OutOfDiskDlgVolumeList" Overridable="yes">{120}{70}{70}{70}{70}</String>
167
168 <String Id="OutOfRbDiskDlg_Title" Overridable="yes">[ProductName] Kurulumu</String>
169 <String Id="OutOfRbDiskDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
170 <String Id="OutOfRbDiskDlgText" Overridable="yes">Vurgulanan birimlerde şu anda seçili olan özellikler için yeterli disk alanı yok. Vurgulanan birimlerden bazı dosyaları kaldırabilir, daha az özellik yükleyebilir veya farklı bir hedef sürücü seçebilirsiniz.</String>
171 <String Id="OutOfRbDiskDlgDescription" Overridable="yes">Yükleme için gereken disk alanı, kullanılabilir disk alanını aşıyor.</String>
172 <String Id="OutOfRbDiskDlgTitle" Overridable="yes">{\WixUI_Font_Title}Disk Alanı Yetersiz</String>
173 <String Id="OutOfRbDiskDlgVolumeList" Overridable="yes">{120}{70}{70}{70}{70}</String>
174 <String Id="OutOfRbDiskDlgText2" Overridable="yes">İsterseniz, yükleyicinin geri alma özelliğini devre dışı bırakabilirsiniz. Geri alma işlevini devre dışı bırakmak, yüklemenin herhangi bir şekilde kesilmesi durumunda yükleyicinin bilgisayarınızın özgün durumunu geri yüklemesini engeller. Geri alma işlevini devre dışı bırakma riskini göze alıyorsanız Evet'i tıklatın.</String>
175
176 <String Id="PrepareDlg_Title" Overridable="yes">[ProductName] Kurulumu</String>
177 <String Id="PrepareDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
178 <String Id="PrepareDlgDescription" Overridable="yes">Kurulum Sihirbazı yükleme sırasında size yol göstermek için hazırlanırken lütfen bekleyin.</String>
179 <String Id="PrepareDlgTitle" Overridable="yes">{\WixUI_Font_Bigger}[ProductName] Kurulum Sihirbazı'na Hoş Geldiniz</String>
180
181 <String Id="ProgressDlg_Title" Overridable="yes">[ProductName] Kurulumu</String>
182 <String Id="ProgressDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
183 <String Id="ProgressDlgTextInstalling" Overridable="yes">Kurulum Sihirbazı [ProductName] ürününü yüklerken lütfen bekleyin.</String>
184 <String Id="ProgressDlgTitleInstalling" Overridable="yes">{\WixUI_Font_Title}[ProductName] yükleniyor</String>
185 <String Id="ProgressDlgTextChanging" Overridable="yes">Kurulum Sihirbazı [ProductName] ürününü değiştirirken lütfen bekleyin.</String>
186 <String Id="ProgressDlgTitleChanging" Overridable="yes">{\WixUI_Font_Title}[ProductName] değiştiriliyor</String>
187 <String Id="ProgressDlgTextRepairing" Overridable="yes">Kurulum Sihirbazı [ProductName] ürününü onarırken lütfen bekleyin.</String>
188 <String Id="ProgressDlgTitleRepairing" Overridable="yes">{\WixUI_Font_Title}[ProductName] onarılıyor</String>
189 <String Id="ProgressDlgTextRemoving" Overridable="yes">Kurulum Sihirbazı [ProductName] ürününü kaldırırken lütfen bekleyin.</String>
190 <String Id="ProgressDlgTitleRemoving" Overridable="yes">{\WixUI_Font_Title}[ProductName] kaldırılıyor</String>
191 <String Id="ProgressDlgTextUpdating" Overridable="yes">Kurulum Sihirbazı [ProductName] ürününü güncelleştirirken lütfen bekleyin.</String>
192 <String Id="ProgressDlgTitleUpdating" Overridable="yes">{\WixUI_Font_Title}[ProductName] güncelleştiriliyor</String>
193 <String Id="ProgressDlgProgressBar" Overridable="yes">Tamamlandı</String>
194 <String Id="ProgressDlgStatusLabel" Overridable="yes">Durum:</String>
195
196 <String Id="ResumeDlg_Title" Overridable="yes">[ProductName] Kurulumu</String>
197 <String Id="ResumeDlgInstall" Overridable="yes">Yü&amp;kle</String>
198 <String Id="ResumeDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
199 <String Id="ResumeDlgDescription" Overridable="yes">Kurulum Sihirbazı [ProductName] ürününü bilgisayarınıza yüklemeyi tamamlayacak. Devam etmek için Yükle'yi, Kurulum Sihirbazı'ndan çıkmak içinse İptal'i tıklatın.</String>
200 <String Id="ResumeDlgTitle" Overridable="yes">{\WixUI_Font_Bigger}[ProductName] Kurulum Sihirbazı sürdürülüyor</String>
201
202 <String Id="SetupTypeDlg_Title" Overridable="yes">[ProductName] Kurulumu</String>
203 <String Id="SetupTypeDlgTypicalButton" Overridable="yes">&amp;Normal</String>
204 <String Id="SetupTypeDlgTypicalButtonTooltip" Overridable="yes">Normal Yükleme</String>
205 <String Id="SetupTypeDlgCustomButton" Overridable="yes">Ö&amp;zel</String>
206 <String Id="SetupTypeDlgCustomButtonTooltip" Overridable="yes">Özel Yükleme</String>
207 <String Id="SetupTypeDlgCompleteButton" Overridable="yes">&amp;Tam</String>
208 <String Id="SetupTypeDlgCompleteButtonTooltip" Overridable="yes">Tam Yükleme</String>
209 <String Id="SetupTypeDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
210 <String Id="SetupTypeDlgTitle" Overridable="yes">{\WixUI_Font_Title}Kurulum Türünü Seç</String>
211 <String Id="SetupTypeDlgDescription" Overridable="yes">Gereksinimlerinize en uygun kurulum türünü seçin</String>
212 <String Id="SetupTypeDlgTypicalText" Overridable="yes">En sık kullanılan program özelliklerini yükler. Çoğu kullanıcı için önerilir.</String>
213 <String Id="SetupTypeDlgCustomText" Overridable="yes">Kullanıcıların yüklenecek program özelliklerini ve bu özelliklerin yükleneceği yeri seçmesine olanak verir. İleri düzey kullanıcılar için önerilir.</String>
214 <String Id="SetupTypeDlgCompleteText" Overridable="yes">Tüm program özellikleri yüklenecek. En fazla disk alanını gerektirir.</String>
215
216 <String Id="UserExit_Title" Overridable="yes">[ProductName] Kurulumu</String>
217 <String Id="UserExitBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
218 <String Id="UserExitTitle" Overridable="yes">{\WixUI_Font_Bigger}[ProductName] Kurulum Sihirbazı'nın çalışması kesildi</String>
219 <String Id="UserExitDescription1" Overridable="yes">[ProductName] kurulumu kesildi. Sisteminizde değişiklik yapılmadı. Daha sonra bu programı yüklemek isterseniz, lütfen yüklemeyi yeniden çalıştırın.</String>
220 <String Id="UserExitDescription2" Overridable="yes">Kurulum Sihirbazı'ndan çıkmak için Son düğmesini tıklatın.</String>
221
222 <String Id="VerifyReadyDlg_Title" Overridable="yes">[ProductName] Kurulumu</String>
223 <String Id="VerifyReadyDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
224 <String Id="VerifyReadyDlgInstall" Overridable="yes">Yü&amp;kle</String>
225 <String Id="VerifyReadyDlgInstallText" Overridable="yes">Yüklemeyi başlatmak için Yükle'yi tıklatın. Yükleme ayarlarınızdan herhangi birini gözden geçirmek veya değiştirmek için Geri'yi tıklatın. Sihirbazdan çıkmak için İptal'i tıklatın.</String>
226 <String Id="VerifyReadyDlgInstallTitle" Overridable="yes">{\WixUI_Font_Title}[ProductName] ürünü yüklenmeye hazır</String>
227 <String Id="VerifyReadyDlgChange" Overridable="yes">&amp;Değiştir</String>
228 <String Id="VerifyReadyDlgChangeText" Overridable="yes">Yükleme işlemini başlatmak için Değiştir'i tıklatın. Yükleme ayarlarınızdan herhangi birini gözden geçirmek veya değiştirmek için Geri'yi tıklatın. Sihirbazdan çıkmak için İptal'i tıklatın.</String>
229 <String Id="VerifyReadyDlgChangeTitle" Overridable="yes">{\WixUI_Font_Title}[ProductName] ürünü değiştirilmeye hazır</String>
230 <String Id="VerifyReadyDlgRepair" Overridable="yes">&amp;Onar</String>
231 <String Id="VerifyReadyDlgRepairText" Overridable="yes">[ProductName] yüklemesini onarmak için Onar'ı tıklatın. Yükleme ayarlarınızdan herhangi birini gözden geçirmek veya değiştirmek için Geri'yi tıklatın. Sihirbazdan çıkmak için İptal'i tıklatın.</String>
232 <String Id="VerifyReadyDlgRepairTitle" Overridable="yes">{\WixUI_Font_Title}[ProductName] ürünü onarılmaya hazır</String>
233 <String Id="VerifyReadyDlgRemove" Overridable="yes">&amp;Kaldır</String>
234 <String Id="VerifyReadyDlgRemoveText" Overridable="yes">[ProductName] ürününü bilgisayarınızdan kaldırmak için Kaldır'ı tıklatın. Yükleme ayarlarınızdan herhangi birini gözden geçirmek veya değiştirmek için Geri'yi tıklatın. Sihirbazdan çıkmak için İptal'i tıklatın.</String>
235 <String Id="VerifyReadyDlgRemoveTitle" Overridable="yes">{\WixUI_Font_Title}[ProductName] ürünü kaldırılmaya hazır</String>
236 <String Id="VerifyReadyDlgUpdate" Overridable="yes">&amp;Güncelleştir</String>
237 <String Id="VerifyReadyDlgUpdateText" Overridable="yes">[ProductName] ürününü bilgisayarınızdan güncelleştirmek için Güncelleştir'i tıklatın. Yükleme ayarlarınızdan herhangi birini gözden geçirmek veya değiştirmek için Geri'yi tıklatın. Sihirbazdan çıkmak için İptal'i tıklatın.</String>
238 <String Id="VerifyReadyDlgUpdateTitle" Overridable="yes">{\WixUI_Font_Title}[ProductName] ürünü güncelleştirilmeye hazır</String>
239
240 <String Id="WaitForCostingDlg_Title" Overridable="yes">[ProductName] Kurulumu</String>
241 <String Id="WaitForCostingDlgReturn" Overridable="yes">&amp;Geri Dön</String>
242 <String Id="WaitForCostingDlgText" Overridable="yes">Yükleyici disk alanı gereksinimlerinizi belirlerken lütfen bekleyin.</String>
243 <String Id="WaitForCostingDlgIcon" Overridable="yes">WixUI_Ico_Exclam</String>
244 <String Id="WaitForCostingDlgIconTooltip" Overridable="yes">Ünlem işareti simgesi</String>
245
246 <String Id="WelcomeDlg_Title" Overridable="yes">[ProductName] Kurulumu</String>
247 <String Id="WelcomeDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
248 <String Id="WelcomeDlgDescription" Overridable="yes">Kurulum Sihirbazı [ProductName] ürününü bilgisayarınıza yükleyecek. Devam etmek için İleri'yi, Kurulum Sihirbazı'ndan çıkmak içinse İptal'i tıklatın.</String>
249 <String Id="WelcomeUpdateDlgDescriptionUpdate" Overridable="yes">Kurulum Sihirbazı [ProductName] ürününü bilgisayarınızda güncelleştirecek. Devam etmek için İleri'yi, Kurulum Sihirbazı'ndan çıkmak içinse İptal'i tıklatın.</String>
250 <String Id="WelcomeDlgTitle" Overridable="yes">{\WixUI_Font_Bigger}[ProductName] Kurulum Sihirbazı'na Hoş Geldiniz</String>
251
252 <String Id="WelcomeEulaDlg_Title" Overridable="yes">[ProductName] Kurulumu</String>
253 <String Id="WelcomeEulaDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
254 <String Id="WelcomeEulaDlgLicenseAcceptedCheckBox" Overridable="yes">Lisans Sözleşmesi'nin koşullarını kabul &amp;ediyorum</String>
255 <String Id="WelcomeEulaDlgInstall" Overridable="yes">Yü&amp;kle</String>
256 <String Id="WelcomeEulaDlgUpdate" Overridable="yes">&amp;Güncelleştir</String>
257 <String Id="WelcomeEulaDlgTitle" Overridable="yes">{\WixUI_Font_Title}Lütfen [ProductName] Lisans Sözleşmesi'ni okuyun</String>
258
259 <String Id="ProgressTextInstallValidate" Overridable="yes">Yükleme doğrulanıyor</String>
260 <String Id="ProgressTextInstallFiles" Overridable="yes">Yeni dosyalar kopyalanıyor</String>
261 <String Id="ProgressTextInstallFilesTemplate" Overridable="yes">Dosya: [1], Dizin: [9], Boyut: [6]</String>
262 <String Id="ProgressTextInstallAdminPackage" Overridable="yes">Ağ yükleme dosyaları kopyalanıyor</String>
263 <String Id="ProgressTextInstallAdminPackageTemplate" Overridable="yes">Dosya: [1], Dizin: [9], Boyut: [6]</String>
264 <String Id="ProgressTextFileCost" Overridable="yes">Alan gereksinimleri hesaplanıyor</String>
265 <String Id="ProgressTextCostInitialize" Overridable="yes">Alan gereksinimleri hesaplanıyor</String>
266 <String Id="ProgressTextCostFinalize" Overridable="yes">Alan gereksinimleri hesaplanıyor</String>
267 <String Id="ProgressTextCreateShortcuts" Overridable="yes">Kısayollar oluşturuluyor</String>
268 <String Id="ProgressTextCreateShortcutsTemplate" Overridable="yes">Kısayol: [1]</String>
269 <String Id="ProgressTextPublishComponents" Overridable="yes">Uygun Bileşenler Yayımlanıyor</String>
270 <String Id="ProgressTextPublishComponentsTemplate" Overridable="yes">Bileşen Kimliği: [1], Niteleyici: [2]</String>
271 <String Id="ProgressTextPublishFeatures" Overridable="yes">Ürün Özellikleri Yayımlanıyor</String>
272 <String Id="ProgressTextPublishFeaturesTemplate" Overridable="yes">Özellik: [1]</String>
273 <String Id="ProgressTextPublishProduct" Overridable="yes">Ürün bilgisi yayımlanıyor</String>
274 <String Id="ProgressTextRegisterClassInfo" Overridable="yes">Sınıf sunucuları kaydediliyor</String>
275 <String Id="ProgressTextRegisterClassInfoTemplate" Overridable="yes">Sınıf Kimliği: [1]</String>
276 <String Id="ProgressTextRegisterExtensionInfo" Overridable="yes">Uzantı sunucuları kaydediliyor</String>
277 <String Id="ProgressTextRegisterExtensionInfoTemplate" Overridable="yes">Uzantı: [1]</String>
278 <String Id="ProgressTextRegisterMIMEInfo" Overridable="yes">MIME bilgisi kaydediliyor</String>
279 <String Id="ProgressTextRegisterMIMEInfoTemplate" Overridable="yes">MIME İçerik Türü: [1], Uzantı: [2]</String>
280 <String Id="ProgressTextRegisterProgIdInfo" Overridable="yes">Program tanımlayıcıları kaydediliyor</String>
281 <String Id="ProgressTextRegisterProgIdInfoTemplate" Overridable="yes">Program Kimliği: [1]</String>
282 <String Id="ProgressTextAllocateRegistrySpace" Overridable="yes">Kayıt defteri alanı ayrılıyor</String>
283 <String Id="ProgressTextAllocateRegistrySpaceTemplate" Overridable="yes">Boş alan: [1]</String>
284 <String Id="ProgressTextAppSearch" Overridable="yes">Yüklü uygulamalar aranıyor</String>
285 <String Id="ProgressTextAppSearchTemplate" Overridable="yes">Özellik: [1], İmza: [2]</String>
286 <String Id="ProgressTextBindImage" Overridable="yes">Yürütülebilir dosyalar bağlanıyor</String>
287 <String Id="ProgressTextBindImageTemplate" Overridable="yes">Dosya: [1]</String>
288 <String Id="ProgressTextCCPSearch" Overridable="yes">Koşullara uyan ürünler aranıyor</String>
289 <String Id="ProgressTextCreateFolders" Overridable="yes">Klasörler oluşturuluyor</String>
290 <String Id="ProgressTextCreateFoldersTemplate" Overridable="yes">Klasör: [1]</String>
291 <String Id="ProgressTextDeleteServices" Overridable="yes">Hizmetler siliniyor</String>
292 <String Id="ProgressTextDeleteServicesTemplate" Overridable="yes">Hizmet: [1]</String>
293 <String Id="ProgressTextDuplicateFiles" Overridable="yes">Yinelenen dosyalar oluşturuluyor</String>
294 <String Id="ProgressTextDuplicateFilesTemplate" Overridable="yes">Dosya: [1], Dizin: [9], Boyut: [6]</String>
295 <String Id="ProgressTextFindRelatedProducts" Overridable="yes">İlgili uygulamalar aranıyor</String>
296 <String Id="ProgressTextFindRelatedProductsTemplate" Overridable="yes">Bulunan uygulama: [1]</String>
297 <String Id="ProgressTextInstallODBC" Overridable="yes">ODBC bileşenleri yükleniyor</String>
298 <String Id="ProgressTextInstallServices" Overridable="yes">Yeni hizmetler yükleniyor</String>
299 <String Id="ProgressTextInstallServicesTemplate" Overridable="yes">Hizmet: [2]</String>
300 <String Id="ProgressTextLaunchConditions" Overridable="yes">Başlatma koşulları değerlendiriliyor</String>
301 <String Id="ProgressTextMigrateFeatureStates" Overridable="yes">İlgili uygulamalardan özellik durumlarının geçişi yapılıyor</String>
302 <String Id="ProgressTextMigrateFeatureStatesTemplate" Overridable="yes">Uygulama: [1]</String>
303 <String Id="ProgressTextMoveFiles" Overridable="yes">Dosyalar taşınıyor</String>
304 <String Id="ProgressTextMoveFilesTemplate" Overridable="yes">Dosya: [1], Dizin: [9], Boyut: [6]</String>
305 <String Id="ProgressTextPatchFiles" Overridable="yes">Dosyalara düzeltme eki uygulanıyor</String>
306 <String Id="ProgressTextPatchFilesTemplate" Overridable="yes">Dosya: [1], Dizin: [2], Boyut: [3]</String>
307 <String Id="ProgressTextProcessComponents" Overridable="yes">Bileşen kaydı güncelleştiriliyor</String>
308 <String Id="ProgressTextRegisterComPlus" Overridable="yes">COM+ Uygulamaları ve Bileşenleri kaydediliyor</String>
309 <String Id="ProgressTextRegisterComPlusTemplate" Overridable="yes">Uygulama Kimliği: [1]{{, Uygulama Türü: [2], Kullanıcılar: [3], RSN: [4]}}</String>
310 <String Id="ProgressTextRegisterFonts" Overridable="yes">Yazı tipleri kaydediliyor</String>
311 <String Id="ProgressTextRegisterFontsTemplate" Overridable="yes">Yazı Tipi: [1]</String>
312 <String Id="ProgressTextRegisterProduct" Overridable="yes">Ürün kaydediliyor</String>
313 <String Id="ProgressTextRegisterProductTemplate" Overridable="yes">[1]</String>
314 <String Id="ProgressTextRegisterTypeLibraries" Overridable="yes">Tür kitaplıkları kaydediliyor</String>
315 <String Id="ProgressTextRegisterTypeLibrariesTemplate" Overridable="yes">Kitaplık Kimliği: [1]</String>
316 <String Id="ProgressTextRegisterUser" Overridable="yes">Kullanıcı kaydediliyor</String>
317 <String Id="ProgressTextRegisterUserTemplate" Overridable="yes">[1]</String>
318 <String Id="ProgressTextRemoveDuplicateFiles" Overridable="yes">Yinelenen dosyalar kaldırılıyor</String>
319 <String Id="ProgressTextRemoveDuplicateFilesTemplate" Overridable="yes">Dosya: [1], Dizin: [9]</String>
320 <String Id="ProgressTextRemoveEnvironmentStrings" Overridable="yes">Ortam dizeleri güncelleştiriliyor</String>
321 <String Id="ProgressTextRemoveEnvironmentStringsTemplate" Overridable="yes">Ad: [1], Değer: [2], Eylem [3]</String>
322 <String Id="ProgressTextRemoveExistingProducts" Overridable="yes">Uygulamalar kaldırılıyor</String>
323 <String Id="ProgressTextRemoveExistingProductsTemplate" Overridable="yes">Uygulama: [1], Komut satırı: [2]</String>
324 <String Id="ProgressTextRemoveFiles" Overridable="yes">Dosyalar kaldırılıyor</String>
325 <String Id="ProgressTextRemoveFilesTemplate" Overridable="yes">Dosya: [1], Dizin: [9]</String>
326 <String Id="ProgressTextRemoveFolders" Overridable="yes">Klasörler kaldırılıyor</String>
327 <String Id="ProgressTextRemoveFoldersTemplate" Overridable="yes">Klasör: [1]</String>
328 <String Id="ProgressTextRemoveIniValues" Overridable="yes">INI dosyası girdileri kaldırılıyor</String>
329 <String Id="ProgressTextRemoveIniValuesTemplate" Overridable="yes">Dosya: [1], Bölüm: [2], Anahtar: [3], Değer: [4]</String>
330 <String Id="ProgressTextRemoveODBC" Overridable="yes">ODBC bileşenleri kaldırılıyor</String>
331 <String Id="ProgressTextRemoveRegistryValues" Overridable="yes">Sistem kayıt defteri değerleri kaldırılıyor</String>
332 <String Id="ProgressTextRemoveRegistryValuesTemplate" Overridable="yes">Anahtar: [1], Ad: [2]</String>
333 <String Id="ProgressTextRemoveShortcuts" Overridable="yes">Kısayollar kaldırılıyor</String>
334 <String Id="ProgressTextRemoveShortcutsTemplate" Overridable="yes">Kısayol: [1]</String>
335 <String Id="ProgressTextRMCCPSearch" Overridable="yes">Koşullara uyan ürünler aranıyor</String>
336 <String Id="ProgressTextSelfRegModules" Overridable="yes">Modüller kaydediliyor</String>
337 <String Id="ProgressTextSelfRegModulesTemplate" Overridable="yes">Dosya: [1], Klasör: [2]</String>
338 <String Id="ProgressTextSelfUnregModules" Overridable="yes">Modüllerin kaydı siliniyor</String>
339 <String Id="ProgressTextSelfUnregModulesTemplate" Overridable="yes">Dosya: [1], Klasör: [2]</String>
340 <String Id="ProgressTextSetODBCFolders" Overridable="yes">ODBC dizinleri başlatılıyor</String>
341 <String Id="ProgressTextStartServices" Overridable="yes">Hizmetler başlatılıyor</String>
342 <String Id="ProgressTextStartServicesTemplate" Overridable="yes">Hizmet: [1]</String>
343 <String Id="ProgressTextStopServices" Overridable="yes">Hizmetler durduruluyor</String>
344 <String Id="ProgressTextStopServicesTemplate" Overridable="yes">Hizmet: [1]</String>
345 <String Id="ProgressTextUnpublishComponents" Overridable="yes">Uygun Bileşenler yayımdan kaldırılıyor</String>
346 <String Id="ProgressTextUnpublishComponentsTemplate" Overridable="yes">Bileşen Kimliği: [1], Niteleyici: [2]</String>
347 <String Id="ProgressTextUnpublishFeatures" Overridable="yes">Ürün Özellikleri yayımdan kaldırılıyor</String>
348 <String Id="ProgressTextUnpublishFeaturesTemplate" Overridable="yes">Özellik: [1]</String>
349 <String Id="ProgressTextUnregisterClassInfo" Overridable="yes">Sınıf sunucularının kaydını sil</String>
350 <String Id="ProgressTextUnregisterClassInfoTemplate" Overridable="yes">Sınıf Kimliği: [1]</String>
351 <String Id="ProgressTextUnregisterComPlus" Overridable="yes">COM+ Uygulamaları ve Bileşenleri'nin kaydı siliniyor</String>
352 <String Id="ProgressTextUnregisterComPlusTemplate" Overridable="yes">Uygulama Kimliği: [1]{{, Uygulama Türü: [2]}}</String>
353 <String Id="ProgressTextUnregisterExtensionInfo" Overridable="yes">Uzantı sunucularının kaydı siliniyor</String>
354 <String Id="ProgressTextUnregisterExtensionInfoTemplate" Overridable="yes">Uzantı: [1]</String>
355 <String Id="ProgressTextUnregisterFonts" Overridable="yes">Yazı tiplerinin kaydı siliniyor</String>
356 <String Id="ProgressTextUnregisterFontsTemplate" Overridable="yes">Yazı Tipi: [1]</String>
357 <String Id="ProgressTextUnregisterMIMEInfo" Overridable="yes">MIME bilgisinin kaydı siliniyor</String>
358 <String Id="ProgressTextUnregisterMIMEInfoTemplate" Overridable="yes">MIME İçerik Türü: [1], Uzantı: [2]</String>
359 <String Id="ProgressTextUnregisterProgIdInfo" Overridable="yes">Program kimliklerinin kaydı siliniyor</String>
360 <String Id="ProgressTextUnregisterProgIdInfoTemplate" Overridable="yes">Program Kimliği: [1]</String>
361 <String Id="ProgressTextUnregisterTypeLibraries" Overridable="yes">Tür kitaplıklarının kaydı siliniyor</String>
362 <String Id="ProgressTextUnregisterTypeLibrariesTemplate" Overridable="yes">Kitaplık Kimliği: [1]</String>
363 <String Id="ProgressTextWriteEnvironmentStrings" Overridable="yes">Ortam dizeleri güncelleştiriliyor</String>
364 <String Id="ProgressTextWriteEnvironmentStringsTemplate" Overridable="yes">Ad: [1], Değer: [2], Eylem [3]</String>
365 <String Id="ProgressTextWriteIniValues" Overridable="yes">INI dosyası değerleri yazılıyor</String>
366 <String Id="ProgressTextWriteIniValuesTemplate" Overridable="yes">Dosya: [1], Bölüm: [2], Anahtar: [3], Değer: [4]</String>
367 <String Id="ProgressTextWriteRegistryValues" Overridable="yes">Sistem kayıt defteri değerleri yazılıyor</String>
368 <String Id="ProgressTextWriteRegistryValuesTemplate" Overridable="yes">Anahtar: [1], Ad: [2], Değer: [3]</String>
369 <String Id="ProgressTextAdvertise" Overridable="yes">Uygulama tanıtılıyor</String>
370 <String Id="ProgressTextGenerateScript" Overridable="yes">Eylem için komut dosyası işlemleri oluşturuluyor:</String>
371 <String Id="ProgressTextGenerateScriptTemplate" Overridable="yes">[1]</String>
372 <String Id="ProgressTextInstallSFPCatalogFile" Overridable="yes">Sistem kataloğu yükleniyor</String>
373 <String Id="ProgressTextInstallSFPCatalogFileTemplate" Overridable="yes">Dosya: [1], Bağımlılıklar: [2]</String>
374 <String Id="ProgressTextMsiPublishAssemblies" Overridable="yes">Derleme bilgileri yayımlanıyor</String>
375 <String Id="ProgressTextMsiPublishAssembliesTemplate" Overridable="yes">Uygulama Bağlamı: [1], Derleme Adı: [2]</String>
376 <String Id="ProgressTextMsiUnpublishAssemblies" Overridable="yes">Derleme bilgileri yayımdan kaldırılıyor</String>
377 <String Id="ProgressTextMsiUnpublishAssembliesTemplate" Overridable="yes">Uygulama Bağlamı: [1], Derleme Adı: [2]</String>
378 <String Id="ProgressTextRollback" Overridable="yes">Eylem geri alınıyor:</String>
379 <String Id="ProgressTextRollbackTemplate" Overridable="yes">[1]</String>
380 <String Id="ProgressTextRollbackCleanup" Overridable="yes">Yedek dosyalar kaldırılıyor</String>
381 <String Id="ProgressTextRollbackCleanupTemplate" Overridable="yes">Dosya: [1]</String>
382 <String Id="ProgressTextUnmoveFiles" Overridable="yes">Taşınan dosyalar kaldırılıyor</String>
383 <String Id="ProgressTextUnmoveFilesTemplate" Overridable="yes">Dosya: [1], Dizin: [9]</String>
384 <String Id="ProgressTextUnpublishProduct" Overridable="yes">Ürün bilgisi yayımdan kaldırılıyor</String>
385
386 <String Id="Error0" Overridable="yes">{{Önemli hata: }}</String>
387 <String Id="Error1" Overridable="yes">{{Hata [1]. }}</String>
388 <String Id="Error2" Overridable="yes">Uyarı [1]. </String>
389 <String Id="Error4" Overridable="yes">Bilgi [1]. </String>
390 <String Id="Error5" Overridable="yes">Yükleyici bu paketi yüklerken beklenmedik bir hatayla karşılaştı. Bu, pakette sorun olduğunu gösteriyor olabilir. Hata kodu: [1]. {{Bağımsız değişkenler: [2], [3], [4]}}</String>
391 <String Id="Error7" Overridable="yes">{{Disk dolu: }}</String>
392 <String Id="Error8" Overridable="yes">Eylem [Time]: [1]. [2]</String>
393 <String Id="Error9" Overridable="yes">[ProductName]</String>
394 <String Id="Error10" Overridable="yes">{[2]}{, [3]}{, [4]}</String>
395 <String Id="Error11" Overridable="yes">İleti türü: [1], Bağımsız değişken: [2]</String>
396 <String Id="Error12" Overridable="yes">=== Günlük başladı: [Date] [Time] ===</String>
397 <String Id="Error13" Overridable="yes">=== Günlük durdu: [Date] [Time] ===</String>
398 <String Id="Error14" Overridable="yes">Eylem başladı [Time]: [1].</String>
399 <String Id="Error15" Overridable="yes">Eylem sona erdi [Time]: [1]. Dönen değer [2].</String>
400 <String Id="Error16" Overridable="yes">Kalan süre: {[1] dakika }{[2] saniye}</String>
401 <String Id="Error17" Overridable="yes">Bellek yetersiz. Yeniden denemeden önce diğer uygulamaları kapatın.</String>
402 <String Id="Error18" Overridable="yes">Yükleyici artık yanıt vermiyor.</String>
403 <String Id="Error19" Overridable="yes">Yükleyici beklenenden önce durdu.</String>
404 <String Id="Error20" Overridable="yes">Windows, [ProductName] ürününü yapılandırırken lütfen bekleyin</String>
405 <String Id="Error21" Overridable="yes">Gerekli bilgiler toplanıyor...</String>
406 <String Id="Error22" Overridable="yes">Bu uygulamanın eski sürümleri kaldırılıyor...</String>
407 <String Id="Error23" Overridable="yes">Bu uygulamanın eski sürümlerini kaldırma hazırlığı yapılıyor...</String>
408 <String Id="Error32" Overridable="yes">{[ProductName] }Kurulumu başarıyla tamamlandı.</String>
409 <String Id="Error33" Overridable="yes">{[ProductName] }Kurulumu başarısız oldu.</String>
410 <String Id="Error1101" Overridable="yes">Dosyadan okuma hatası: [2]. {{ Sistem hatası [3].}} Dosyanın varolduğundan ve dosyaya erişebildiğinizden emin olun.</String>
411 <String Id="Error1301" Overridable="yes">'[2]' dosyası oluşturulamıyor. Bu ada sahip bir dizin zaten var. Yüklemeyi iptal edin ve farklı bir konuma yüklemeyi deneyin.</String>
412 <String Id="Error1302" Overridable="yes">Lütfen diski takın: [2]</String>
413 <String Id="Error1303" Overridable="yes">Yükleyicinin [2] dizinine erişmek için yeterli ayrıcalığı yok. Yükleme işlemi devam edemiyor. Yönetici olarak oturum açın veya sistem yöneticinize başvurun.</String>
414 <String Id="Error1304" Overridable="yes">Dosyaya yazma hatası: [2]. Bu dizine erişiminizin olduğundan emin olun.</String>
415 <String Id="Error1305" Overridable="yes">[2] dosyasından okuma hatası. {{ Sistem hatası [3].}} Dosyanın varolduğundan ve dosyaya erişebildiğinizden emin olun.</String>
416 <String Id="Error1306" Overridable="yes">Başka bir uygulamanın '[2]' dosyasına özel kullanım erişimi var. Lütfen diğer tüm uygulamaları kapatın, sonra Yeniden Dene'yi tıklatın.</String>
417 <String Id="Error1307" Overridable="yes">Bu dosyayı yüklemek için yeterli disk alanı yok: [2]. Bir miktar disk alanı boşaltın ve Yeniden Dene'yi tıklatın veya çıkmak için İptal'i tıklatın.</String>
418 <String Id="Error1308" Overridable="yes">Kaynak dosya bulunamadı: [2]. Dosyanın varolduğundan ve dosyaya erişebildiğinizden emin olun.</String>
419 <String Id="Error1309" Overridable="yes">Dosyadan okuma hatası: [3]. {{ Sistem hatası [2].}} Dosyanın varolduğundan ve dosyaya erişebildiğinizden emin olun.</String>
420 <String Id="Error1310" Overridable="yes">Dosyaya yazma hatası: [3]. {{ Sistem hatası [2].}} Bu dizine erişiminiz olduğundan emin olun.</String>
421 <String Id="Error1311" Overridable="yes">Kaynak dosya bulunamadı {{(dolap)}}: [2]. Dosyanın varolduğundan ve dosyaya erişebildiğinizden emin olun.</String>
422 <String Id="Error1312" Overridable="yes">'[2]' dizini oluşturulamıyor. Bu adda bir dosya zaten var. Lütfen dosyayı yeniden adlandırın veya kaldırın ve Yeniden Dene'yi tıklatın veya çıkmak için İptal'i tıklatın.</String>
423 <String Id="Error1313" Overridable="yes">[2] birimi şu anda kullanılamıyor. Lütfen başka bir birim seçin.</String>
424 <String Id="Error1314" Overridable="yes">Belirtilen '[2]' yolu kullanılamıyor.</String>
425 <String Id="Error1315" Overridable="yes">Belirtilen klasöre yazılamıyor: [2].</String>
426 <String Id="Error1316" Overridable="yes">Dosyadan okunmaya çalışılırken bir ağ hatası oluştu: [2]</String>
427 <String Id="Error1317" Overridable="yes">Dizin oluşturulmaya çalışılırken hata oluştu: [2]</String>
428 <String Id="Error1318" Overridable="yes">Dizin oluşturulmaya çalışılırken bir ağ hatası oluştu: [2]</String>
429 <String Id="Error1319" Overridable="yes">Kaynak dosya dolabı açılmaya çalışılırken bir ağ hatası oluştu: [2]</String>
430 <String Id="Error1320" Overridable="yes">Belirtilen yol çok uzun: [2]</String>
431 <String Id="Error1321" Overridable="yes">Yükleyicinin bu dosyayı değiştirmek için yeterli ayrıcalığı yok: [2].</String>
432 <String Id="Error1322" Overridable="yes">'[2]' klasör yolunun bir bölümü geçersiz. Boş veya sistem tarafından izin verilen uzunluğu aşıyor.</String>
433 <String Id="Error1323" Overridable="yes">'[2]' klasör yolu, klasör yollarında geçerli olmayan sözcükler içeriyor.</String>
434 <String Id="Error1324" Overridable="yes">'[2]' klasör yolu geçersiz karakter içeriyor.</String>
435 <String Id="Error1325" Overridable="yes">'[2]' geçerli bir kısa dosya adı değil.</String>
436 <String Id="Error1326" Overridable="yes">Dosya güvenliğini alma hatası: [3] GetLastError: [2]</String>
437 <String Id="Error1327" Overridable="yes">Geçersiz Sürücü: [2]</String>
438 <String Id="Error1328" Overridable="yes">[2] dosyasına düzeltme eki uygulanırken hata oluştu. Büyük olasılıkla başka bir şekilde güncelleştirilmiş ve artık bu düzeltme eki tarafından değiştirilemiyor. Daha fazla bilgi için düzeltme ekinizin satıcısına başvurun. {{Sistem Hatası: [3]}}</String>
439 <String Id="Error1329" Overridable="yes">[2] dolap dosyası dijital olarak imzalanmadığından gerekli bir dosya yüklenemiyor. Bu, dolap dosyasının bozuk olduğunu gösteriyor olabilir.</String>
440 <String Id="Error1330" Overridable="yes">[2] dolap dosyası geçersiz bir dijital imzaya sahip olduğundan gerekli bir dosya yüklenemiyor. Bu, dolap dosyasının bozuk olduğunu gösteriyor olabilir. {{WinVerifyTrust tarafından [3] hatası döndürüldü.}}</String>
441 <String Id="Error1331" Overridable="yes">[2] dosyası doğru kopyalanamadı: CRC hatası.</String>
442 <String Id="Error1332" Overridable="yes">[2] dosyası doğru taşınamadı: CRC hatası.</String>
443 <String Id="Error1333" Overridable="yes">[2] dosyasına düzeltme eki doğru uygulanamadı: CRC hatası.</String>
444 <String Id="Error1334" Overridable="yes">'[2]' dosyası '[3]' dolap dosyasında bulunamadığından yüklenemiyor. Bu bir ağ hatasını, CD-ROM'dan okuma hatasını veya bu pakette sorun olduğunu gösteriyor olabilir.</String>
445 <String Id="Error1335" Overridable="yes">Bu yükleme için gereken '[2]' dolap dosyası bozuk olduğundan kullanılamıyor. Bu bir ağ hatasını, CD-ROM'dan okuma hatasını veya bu pakette sorun olduğunu gösteriyor olabilir.</String>
446 <String Id="Error1336" Overridable="yes">Bu yüklemeyi tamamlamak için gereken geçici bir dosya oluşturulurken hata oluştu.{{ Klasör: [3]. Sistem hata kodu: [2]}}</String>
447 <String Id="Error1401" Overridable="yes">[2] anahtarı oluşturulamadı. {{ Sistem hatası [3].}} Bu anahtara yeterli erişiminiz olduğunu doğrulayın veya destek sorumlunuza başvurun. </String>
448 <String Id="Error1402" Overridable="yes">[2] anahtarı açılamadı. {{ Sistem hatası [3].}} Bu anahtara yeterli erişiminiz olduğunu doğrulayın veya destek sorumlunuza başvurun. </String>
449 <String Id="Error1403" Overridable="yes">[3] anahtarından [2] değeri silinemedi. {{ Sistem hatası [4].}} Bu anahtara yeterli erişiminiz olduğunu doğrulayın veya destek sorumlunuza başvurun. </String>
450 <String Id="Error1404" Overridable="yes">[2] anahtarı silinemedi. {{ Sistem hatası [3].}} Bu anahtara yeterli erişiminiz olduğunu doğrulayın veya destek sorumlunuza başvurun. </String>
451 <String Id="Error1405" Overridable="yes">[3] anahtarından [2] değeri okunamadı. {{ Sistem hatası [4].}} Bu anahtara yeterli erişiminiz olduğunu doğrulayın veya destek sorumlunuza başvurun. </String>
452 <String Id="Error1406" Overridable="yes">[2] değeri [3] anahtarına yazılamadı. {{ Sistem hatası [4].}} Bu anahtara yeterli erişiminiz olduğunu doğrulayın veya destek sorumlunuza başvurun.</String>
453 <String Id="Error1407" Overridable="yes">[2] anahtarının değer adları alınamadı. {{ Sistem hatası [3].}} Bu anahtara yeterli erişiminiz olduğunu doğrulayın veya destek sorumlunuza başvurun.</String>
454 <String Id="Error1408" Overridable="yes">[2] anahtarının alt anahtar adları alınamadı. {{ Sistem hatası [3].}} Bu anahtara yeterli erişiminiz olduğunu doğrulayın veya destek sorumlunuza başvurun.</String>
455 <String Id="Error1409" Overridable="yes">[2] anahtarının güvenlik bilgileri okunamadı. {{ Sistem hatası [3].}} Bu anahtara yeterli erişiminiz olduğunu doğrulayın veya destek sorumlunuza başvurun.</String>
456 <String Id="Error1410" Overridable="yes">Kullanılabilir kayıt defteri alanı artırılamadı. Bu uygulamanın yüklenmesi için [2] KB boş kayıt defteri alanı gerekiyor.</String>
457 <String Id="Error1500" Overridable="yes">Başka bir yükleme sürüyor. Buna devam etmeden önce söz konusu yükleme işlemini tamamlamalısınız.</String>
458 <String Id="Error1501" Overridable="yes">Güvenli verilere erişim hatası. Lütfen Windows Installer'ın düzgün yapılandırıldığından emin olun ve yüklemeyi yeniden deneyin.</String>
459 <String Id="Error1502" Overridable="yes">'[2]' kullanıcısı '[3]' ürününü yüklemeyi daha önce başlattı. Bu kullanıcının ürünü kullanabilmesi için söz konusu yüklemeyi yeniden çalıştırması gerekecek. Şimdi geçerli yükleme işleminiz devam edecek.</String>
460 <String Id="Error1503" Overridable="yes">'[2]' kullanıcısı '[3]' ürününü yüklemeyi daha önce başlattı. Bu kullanıcının ürünü kullanabilmesi için söz konusu yüklemeyi yeniden çalıştırması gerekecek.</String>
461 <String Id="Error1601" Overridable="yes">Disk alanı yetersiz -- Birim: '[2]'; gerekli alan: [3] KB; kullanılabilir alan: [4] KB. Bir miktar disk alanı boşaltın ve yeniden deneyin.</String>
462 <String Id="Error1602" Overridable="yes">İptal etmek istediğinizden emin misiniz?</String>
463 <String Id="Error1603" Overridable="yes">[2][3] dosyası kullanımda tutulmaktadır {şu işlem tarafından: Ad: [4], Kimlik: [5], Pencere Başlığı: '[6]'}. Bu uygulamayı kapatın ve yeniden deneyin.</String>
464 <String Id="Error1604" Overridable="yes">'[2]' ürünü zaten yüklü olduğundan bu ürünün yüklenmesini engelliyor. İki ürün birbiriyle uyumlu değil.</String>
465 <String Id="Error1605" Overridable="yes">'[2]' birimindeki disk alanı, kurtarma etkinleştirilmiş olarak yüklemeye devam etmek için yeterli değil. [3] KB gerekiyor, ancak yalnızca [4] KB var. Kurtarma bilgilerini kaydetmeden yüklemeye devam etmek için Yoksay'ı, kullanılabilir disk alanını yeniden denetlemek için Yeniden Dene'yi veya yükleme işleminden çıkmak için İptal'i tıklatın.</String>
466 <String Id="Error1606" Overridable="yes">[2] ağ konumuna erişilemedi.</String>
467 <String Id="Error1607" Overridable="yes">Yüklemeye devam etmeden önce aşağıdaki uygulamaların kapatılması gerekiyor:</String>
468 <String Id="Error1608" Overridable="yes">Bu ürünü yüklemek için bu makineye daha önce yüklenmiş uygun bir ürün bulunamadı.</String>
469 <String Id="Error1609" Overridable="yes">Güvenlik ayarları uygulanırken hata oluştu. [2] geçerli bir kullanıcı veya grup değil. Bunun nedeni paketin sorunlu olması veya ağdaki etki alanı denetleyicisiyle bağlantıda bir sorun olması olabilir. Ağ bağlantınızı denetleyip Yeniden Dene'yi veya yüklemeyi sona erdirmek için İptal'i tıklatın. {{Kullanıcının SID'si bulunamadı, sistem hatası [3]}}</String>
470 <String Id="Error1701" Overridable="yes">[2] anahtarı geçerli değil. Doğru anahtarı girdiğinizi doğrulayın.</String>
471 <String Id="Error1702" Overridable="yes">Yükleyicinin [2] yapılandırmasına devam edebilmesi için sisteminizi yeniden başlatmanız gerekiyor. Şimdi yeniden başlatmak için Evet'i veya daha sonra el ile yeniden başlatacaksanız Hayır'ı tıklatın.</String>
472 <String Id="Error1703" Overridable="yes">[2] yapılandırma değişikliklerinin etkinleşmesi için sisteminizi yeniden başlatmalısınız. Şimdi yeniden başlatmak için Evet'i veya daha sonra el ile yeniden başlatacaksanız Hayır'ı tıklatın.</String>
473 <String Id="Error1704" Overridable="yes">Bir [2] yüklemesi şu anda askıya alınmış durumda. Devam etmek için bu yükleme tarafından yapılan değişiklikleri geri almanız gerekiyor. Bu değişiklikleri geri almak istiyor musunuz?</String>
474 <String Id="Error1705" Overridable="yes">Bu ürünün daha önceki bir yüklemesi devam ediyor. Devam etmek için bu yükleme tarafından yapılan değişiklikleri geri almanız gerekiyor. Bu değişiklikleri geri almak istiyor musunuz?</String>
475 <String Id="Error1706" Overridable="yes">[2] ürününün yükleme paketi bulunamadı. '[3]' yükleme paketinin geçerli bir kopyasını kullanarak yüklemeyi yeniden deneyin.</String>
476 <String Id="Error1707" Overridable="yes">Yükleme başarıyla tamamlandı.</String>
477 <String Id="Error1708" Overridable="yes">Yükleme yapılamadı.</String>
478 <String Id="Error1709" Overridable="yes">Ürün: [2] -- [3]</String>
479 <String Id="Error1710" Overridable="yes">Bilgisayarınızı bir önceki durumuna geri yükleyebilir veya yükleme işlemine daha sonra devam edebilirsiniz. Önceki duruma geri yüklemek istiyor musunuz?</String>
480 <String Id="Error1711" Overridable="yes">Yükleme bilgileri diske yazılırken bir hata oluştu. Yeterli disk alanı olup olmadığını denetleyin ve Yeniden Dene'yi tıklatın veya yüklemeyi sona erdirmek için İptal'i tıklatın.</String>
481 <String Id="Error1712" Overridable="yes">Bilgisayarınızı önceki durumuna geri yüklemek için gereken bir veya birden fazla dosya bulunamadı. Önceki duruma geri yüklenemeyecek.</String>
482 <String Id="Error1713" Overridable="yes">[2] gerekli ürünlerinden birini yükleyemiyor. Teknik destek grubunuza başvurun. {{Sistem Hatası: [3].}}</String>
483 <String Id="Error1714" Overridable="yes">Eski [2] sürümü kaldırılamıyor. Teknik destek grubunuza başvurun. {{Sistem Hatası [3].}}</String>
484 <String Id="Error1715" Overridable="yes">[2] yüklendi</String>
485 <String Id="Error1716" Overridable="yes">[2] yapılandırıldı</String>
486 <String Id="Error1717" Overridable="yes">[2] kaldırıldı</String>
487 <String Id="Error1718" Overridable="yes">[2] dosyası dijital imza ilkesi tarafından reddedildi.</String>
488 <String Id="Error1719" Overridable="yes">Windows Installer hizmetine erişilemiyor. Windows'u güvenli modda çalıştırıyorsanız veya Windows Installer doğru yüklenmediyse bu durum ortaya çıkabilir. Yardım için destek sorumlunuza başvurun.</String>
489 <String Id="Error1720" Overridable="yes">Bu Windows Installer paketinde sorun var. Bu yüklemenin tamamlanması için gereken bir komut dosyası çalıştırılamadı. Destek biriminize veya paketin satıcısına başvurun. {{Özel eylem [2] komut dosyası hatası: [3], [4]: [5] Satır [6], Sütun [7], [8]}}</String>
490 <String Id="Error1721" Overridable="yes">Bu Windows Installer paketinde sorun var. Bu yüklemenin tamamlanması için gereken bir program çalıştırılamadı. Destek biriminize veya paketin satıcısına başvurun. {{Eylem: [2], konum: [3], komut: [4] }}</String>
491 <String Id="Error1722" Overridable="yes">Bu Windows Installer paketinde sorun var. Kurulumun parçası olarak çalışan bir program beklendiği gibi bitmedi. Destek biriminize veya paketin satıcısına başvurun. {{Eylem [2], konum: [3], komut: [4]}}</String>
492 <String Id="Error1723" Overridable="yes">Bu Windows Installer paketinde sorun var. Bu yüklemenin tamamlanması için gereken bir DLL çalıştırılamadı. Destek biriminize veya paketin satıcısına başvurun. {{Eylem [2], girdi: [3], kitaplık: [4]}}</String>
493 <String Id="Error1724" Overridable="yes">Kaldırma başarıyla tamamlandı.</String>
494 <String Id="Error1725" Overridable="yes">Kaldırma başarısız oldu.</String>
495 <String Id="Error1726" Overridable="yes">Tanıtım başarıyla tamamlandı.</String>
496 <String Id="Error1727" Overridable="yes">Tanıtım başarısız oldu.</String>
497 <String Id="Error1728" Overridable="yes">Yapılandırma başarıyla tamamlandı.</String>
498 <String Id="Error1729" Overridable="yes">Yapılandırma başarısız oldu.</String>
499 <String Id="Error1730" Overridable="yes">Bu uygulamayı kaldırmak için Yönetici olmanız gerekir. Bu uygulamayı kaldırmak için bir Yönetici olarak oturum açabilir veya yardım için teknik destek grubunuza başvurabilirsiniz.</String>
500 <String Id="Error1731" Overridable="yes">[2] ürününün kaynak yükleme paketi istemci paketi ile eşitlenmemiş. '[3]' yükleme paketinin geçerli bir kopyasını kullanarak yüklemeyi yeniden deneyin.</String>
501 <String Id="Error1732" Overridable="yes">[2] yüklemesini tamamlamak için bilgisayarı yeniden başlatmalısınız. Bu bilgisayara oturum açmış kullanıcılar var ve yeniden başlatma işlemi bu kullanıcıların çalışmalarını kaybetmesine neden olabilir. Şimdi yeniden başlatmak istiyor musunuz?</String>
502 <String Id="Error1801" Overridable="yes">[2] yolu geçerli değil. Lütfen geçerli bir yol belirtin.</String>
503 <String Id="Error1802" Overridable="yes">Bellek yetersiz. Yeniden denemeden önce diğer uygulamaları kapatın.</String>
504 <String Id="Error1803" Overridable="yes">[2] sürücüsünde disk yok. Lütfen bir disk yerleştirip Yeniden Dene'yi veya daha önce seçilen birime dönmek için İptal'i tıklatın.</String>
505 <String Id="Error1804" Overridable="yes">[2] sürücüsünde disk yok. Lütfen bir disk yerleştirip Yeniden Dene'yi veya göz atma iletişim kutusuna dönmek ve farklı bir birim seçmek için İptal'i tıklatın.</String>
506 <String Id="Error1805" Overridable="yes">[2] klasörü yok. Lütfen varolan bir klasörün yolunu girin.</String>
507 <String Id="Error1806" Overridable="yes">Bu klasörü okumak için yeterli ayrıcalığınız yok.</String>
508 <String Id="Error1807" Overridable="yes">Yükleme işlemi için geçerli bir hedef klasör belirlenemedi.</String>
509 <String Id="Error1901" Overridable="yes">Kaynak yükleme veritabanından okuma hatası: [2].</String>
510 <String Id="Error1902" Overridable="yes">Yeniden başlatma işlemi zamanlanıyor: [2] dosyasının adı [3] olarak değiştiriliyor. İşlemi tamamlamak için bilgisayarı yeniden başlatmanız gerekiyor.</String>
511 <String Id="Error1903" Overridable="yes">Yeniden başlatma işlemi zamanlanıyor: [2] dosyası siliniyor. İşlemi tamamlamak için bilgisayarı yeniden başlatmanız gerekiyor.</String>
512 <String Id="Error1904" Overridable="yes">[2] modülü kaydettirilemedi. HRESULT [3]. Destek biriminize başvurun.</String>
513 <String Id="Error1905" Overridable="yes">[2] modülünün kaydı silinemedi. HRESULT [3]. Destek biriminize başvurun.</String>
514 <String Id="Error1906" Overridable="yes">[2] paketi önbelleğe alınamadı. Hata: [3]. Destek biriminize başvurun.</String>
515 <String Id="Error1907" Overridable="yes">[2] yazı tipi kaydedilemedi. Yazı tiplerini yüklemek için yeterli izniniz olduğunu ve sistemin bu yazı tipini desteklediğini doğrulayın.</String>
516 <String Id="Error1908" Overridable="yes">[2] yazı tipinin kaydı silinemedi. Yazı tiplerini kaldırmak için yeterli izniniz olduğunu doğrulayın.</String>
517 <String Id="Error1909" Overridable="yes">[2] Kısayolu oluşturulamadı. Hedef klasörün varolduğunu ve klasöre erişebildiğinizi doğrulayın.</String>
518 <String Id="Error1910" Overridable="yes">[2] Kısayolu kaldırılamadı. Kısayol dosyasının varolduğunu ve dosyaya erişebildiğinizi doğrulayın.</String>
519 <String Id="Error1911" Overridable="yes">[2] dosyası için tür kitaplığı kaydettirilemedi. Destek biriminize başvurun.</String>
520 <String Id="Error1912" Overridable="yes">[2] dosyasının tür kitaplığı kaydı silinemedi. Destek biriminize başvurun.</String>
521 <String Id="Error1913" Overridable="yes">[2] [3] ini dosyası güncelleştirilemedi. Dosyanın varolduğundan ve dosyaya erişebildiğinizden emin olun.</String>
522 <String Id="Error1914" Overridable="yes">Yeniden başlatma sırasında [3] dosyasının [2] dosyasıyla değiştirilmesi zamanlanamadı. [3] dosyasına yazma izniniz olduğunu doğrulayın.</String>
523 <String Id="Error1915" Overridable="yes">ODBC sürücü yöneticisini kaldırma hatası, ODBC hatası [2]: [3]. Destek biriminize başvurun.</String>
524 <String Id="Error1916" Overridable="yes">ODBC sürücü yöneticisini yükleme hatası, ODBC hatası [2]: [3]. Destek biriminize başvurun.</String>
525 <String Id="Error1917" Overridable="yes">ODBC sürücüsünü kaldırma hatası: [4], ODBC hatası [2]: [3]. ODBC sürücülerini kaldırmak için yeterli ayrıcalığınız olduğunuzu doğrulayın.</String>
526 <String Id="Error1918" Overridable="yes">ODBC sürücüsünü yükleme hatası: [4], ODBC hatası [2]: [3]. [4] dosyasının varolduğunu ve dosyaya erişebildiğinizi doğrulayın.</String>
527 <String Id="Error1919" Overridable="yes">ODBC veri kaynağını yapılandırma hatası: [4], ODBC hatası [2]: [3]. [4] dosyasının varolduğunu ve dosyaya erişebildiğinizi doğrulayın.</String>
528 <String Id="Error1920" Overridable="yes">'[2]' ([3]) hizmeti başlatılamadı. Sistem hizmetlerini başlatmak için yeterli ayrıcalığınız olduğunu doğrulayın.</String>
529 <String Id="Error1921" Overridable="yes">'[2]' ([3]) hizmeti durdurulamadı. Sistem hizmetlerini durdurmak için yeterli ayrıcalığınız olduğunu doğrulayın.</String>
530 <String Id="Error1922" Overridable="yes">'[2]' ([3]) hizmeti silinemedi. Sistem hizmetlerini kaldırmak için yeterli ayrıcalığınız olduğunu doğrulayın.</String>
531 <String Id="Error1923" Overridable="yes">'[2]' ([3]) hizmeti yüklenemedi. Sistem hizmetlerini yüklemek için yeterli ayrıcalığınız olduğunu doğrulayın.</String>
532 <String Id="Error1924" Overridable="yes">'[2]' ortam değişkeni güncelleştirilemedi. Ortam değişkenlerini değiştirmek için yeterli ayrıcalığınız olduğunu doğrulayın.</String>
533 <String Id="Error1925" Overridable="yes">Makinenin tüm kullanıcıları için bu yüklemeyi tamamlamanızı sağlayacak yeterli ayrıcalığa sahip değilsiniz. Yönetici olarak oturum açın ve bu yüklemeyi yeniden deneyin.</String>
534 <String Id="Error1926" Overridable="yes">'[3]' dosyasının dosya güvenliği ayarlanamadı. Hata: [2]. Bu dosyanın güvenlik izinlerini değiştirmek için yeterli ayrıcalığınız olduğunu doğrulayın.</String>
535 <String Id="Error1927" Overridable="yes">Bu bilgisayarda Bileşen Hizmetleri (COM+ 1.0) yüklü değil. Bu yüklemenin başarıyla tamamlanması için Bileşen Hizmetleri gerekir. Bileşen Hizmetleri Windows 2000'de bulunur.</String>
536 <String Id="Error1928" Overridable="yes">COM+ Uygulamasını kaydettirme hatası oluştu. Daha fazla bilgi için destek biriminize başvurun.</String>
537 <String Id="Error1929" Overridable="yes">COM+ Uygulamasının kaydı silinirken hata oluştu. Daha fazla bilgi için destek biriminize başvurun.</String>
538 <String Id="Error1930" Overridable="yes">'[2]' ([3]) hizmetinin tanımı değiştirilemedi.</String>
539 <String Id="Error1931" Overridable="yes">Windows Installer hizmeti, [2] sistem dosyası Windows tarafından korunduğundan bu dosyayı güncelleştiremiyor. Bu programın düzgün çalışabilmesi için işletim sisteminizi güncelleştirmeniz gerekebilir. {{Paket sürümü: [3], İşletim Sistemi Korumalı sürümü: [4]}}</String>
540 <String Id="Error1932" Overridable="yes">Windows Installer hizmeti korumalı [2] Windows dosyasını güncelleştiremiyor.{{Paket sürümü: [3], İşletim Sistemi Korumalı sürümü: [4], SFP Hatası: [5]}}</String>
541 <String Id="Error1933" Overridable="yes">Windows Installer hizmeti Windows tarafından korunan bir veya daha fazla dosyayı güncelleştiremiyor. {{SFP Hatası: [2]. Korunan dosyaların listesi:\r\n[3]}}</String>
542 <String Id="Error1934" Overridable="yes">Kullanıcı yüklemeleri makinedeki ilke aracılığıyla devre dışı bırakıldı.</String>
543 <String Id="Error1935" Overridable="yes">'[6]' derlemesinin yüklenmesi sırasında hata oluştu. Daha fazla bilgi için lütfen Yardım ve Destek bölümüne bakın. HRESULT: [3]. {{derleme arabirimi: [4], işlev: [5], bileşen: [2]}}</String>
544 <String Id="Error1936" Overridable="yes">'[6]' derlemesinin yüklenmesi sırasında hata oluştu. Derleme kesin adlandırılmamış veya en küçük anahtar uzunluğuyla imzalanmamış. HRESULT: [3]. {{derleme arabirimi: [4], işlev: [5], bileşen: [2]}}</String>
545 <String Id="Error1937" Overridable="yes">'[6]' derlemesinin yüklenmesi sırasında hata oluştu. İmza veya katalog doğrulanamadı veya geçerli değil. HRESULT: [3]. {{derleme arabirimi: [4], işlev: [5], bileşen: [2]}}</String>
546 <String Id="Error1938" Overridable="yes">'[6]' derlemesinin yüklenmesi sırasında hata oluştu. Derlemenin bir veya daha fazla modülü bulunamadı. HRESULT: [3]. {{derleme arabirimi: [4], işlev: [5], bileşen: [2]}}</String>
547
548 <String Id="UITextbytes" Overridable="yes">bayt</String>
549 <String Id="UITextGB" Overridable="yes">GB</String>
550 <String Id="UITextKB" Overridable="yes">KB</String>
551 <String Id="UITextMB" Overridable="yes">MB</String>
552 <String Id="UITextMenuAbsent" Overridable="yes">Tüm özellik kullanılamıyor</String>
553 <String Id="UITextMenuAdvertise" Overridable="yes">Özellik gerektiğinde yüklenecek</String>
554 <String Id="UITextMenuAllCD" Overridable="yes">Tüm özellik CD'den çalışacak şekilde yüklenecek</String>
555 <String Id="UITextMenuAllLocal" Overridable="yes">Tüm özellik yerel sabit sürücüye yüklenecek</String>
556 <String Id="UITextMenuAllNetwork" Overridable="yes">Tüm özellik ağdan çalışacak şekilde yüklenecek</String>
557 <String Id="UITextMenuCD" Overridable="yes">CD'den çalışacak şekilde yüklenecek</String>
558 <String Id="UITextMenuLocal" Overridable="yes">Yerel sabit sürücüye yüklenecek</String>
559 <String Id="UITextMenuNetwork" Overridable="yes">Ağdan çalışacak şekilde yüklenecek</String>
560 <String Id="UITextNewFolder" Overridable="yes">Klasör|Yeni Klasör</String>
561 <String Id="UITextScriptInProgress" Overridable="yes">Gerekli bilgiler toplanıyor...</String>
562 <String Id="UITextSelAbsentAbsent" Overridable="yes">Bu özellik yüklenmemiş olarak kalacak</String>
563 <String Id="UITextSelAbsentAdvertise" Overridable="yes">Bu özellik gerektiğinde yüklenecek şekilde ayarlanacak</String>
564 <String Id="UITextSelAbsentCD" Overridable="yes">Bu özellik CD'den çalışacak şekilde yüklenecek</String>
565 <String Id="UITextSelAbsentLocal" Overridable="yes">Bu özellik yerel sabit sürücüye yüklenecek</String>
566 <String Id="UITextSelAbsentNetwork" Overridable="yes">Bu özellik ağdan çalışacak şekilde yüklenecek</String>
567 <String Id="UITextSelAdvertiseAbsent" Overridable="yes">Bu özellik kullanılamaz duruma gelecek</String>
568 <String Id="UITextSelAdvertiseAdvertise" Overridable="yes">Gerektiğinde yüklenecek</String>
569 <String Id="UITextSelAdvertiseCD" Overridable="yes">Bu özellik CD'den çalıştırılabilecek</String>
570 <String Id="UITextSelAdvertiseLocal" Overridable="yes">Bu özellik yerel sabit sürücünüze yüklenecek</String>
571 <String Id="UITextSelAdvertiseNetwork" Overridable="yes">Bu özellik ağdan çalıştırılabilecek</String>
572 <String Id="UITextSelCDAbsent" Overridable="yes">Bu özellik tamamen kaldırılacak, CD'den çalıştıramayacaksınız</String>
573 <String Id="UITextSelCDAdvertise" Overridable="yes">Bu özellik, CD'den çalıştırılabilir durumdan çıkarak gerektiğinde yüklenecek şekilde ayarlanacak</String>
574 <String Id="UITextSelCDCD" Overridable="yes">Bu özellik CD'den çalıştırılabilecek şekilde kalacak</String>
575 <String Id="UITextSelCDLocal" Overridable="yes">Bu özellik, CD'den çalıştırılabilir durumdan çıkarak yerel sabit sürücüye yüklenebilecek duruma gelecek</String>
576 <String Id="UITextSelChildCostNeg" Overridable="yes">Bu özellik sabit sürücünüzde [1] yer açar.</String>
577 <String Id="UITextSelChildCostPos" Overridable="yes">Bu özellik sabit sürücünüzde [1] alan gerektirir.</String>
578 <String Id="UITextSelCostPending" Overridable="yes">Bu özellik için gerekenler belirleniyor...</String>
579 <String Id="UITextSelLocalAbsent" Overridable="yes">Bu özellik tamamen kaldırılacak</String>
580 <String Id="UITextSelLocalAdvertise" Overridable="yes">Bu özellik yerel sabit sürücünüzden kaldırılacak, ancak gerektiğinde yüklenecek şekilde ayarlanacak</String>
581 <String Id="UITextSelLocalCD" Overridable="yes">Bu özellik yerel sabit sürücünüzden kaldırılacak ancak, yine de CD'den çalıştırılabilecek</String>
582 <String Id="UITextSelLocalLocal" Overridable="yes">Bu özellik yerel sabit sürücünüzde kalacak</String>
583 <String Id="UITextSelLocalNetwork" Overridable="yes">Bu özellik yerel sabit sürücünüzden kaldırılacak ancak, yine de ağdan çalıştırılabilecek</String>
584 <String Id="UITextSelNetworkAbsent" Overridable="yes">Bu özellik tamamen kaldırılacak, ağdan çalıştıramayacaksınız</String>
585 <String Id="UITextSelNetworkAdvertise" Overridable="yes">Bu özellik, ağdan çalıştırılabilir durumdan çıkarak gerektiğinde yüklenecek şekilde ayarlanacak</String>
586 <String Id="UITextSelNetworkLocal" Overridable="yes">Bu özellik, ağdan çalıştırılabilir durumdan çıkarak yerel sabit sürücüye yüklenebilir duruma gelecek</String>
587 <String Id="UITextSelNetworkNetwork" Overridable="yes">Bu özellik ağdan çalıştırılabilecek şekilde kalacak</String>
588 <String Id="UITextSelParentCostNegNeg" Overridable="yes">Bu özellik sabit sürücünüzde [1] yer açar. [3] alt özellikten [2] tanesi seçili. Alt özellikler sabit sürücünüzde [4] yer açar.</String>
589 <String Id="UITextSelParentCostNegPos" Overridable="yes">Bu özellik sabit sürücünüzde [1] yer açar. [3] alt özellikten [2] tanesi seçili. Alt özellikler sabit sürücünüzde [4] alan gerektirir.</String>
590 <String Id="UITextSelParentCostPosNeg" Overridable="yes">Bu özellik sabit sürücünüzde [1] alan gerektirir. [3] alt özellikten [2] tanesi seçili. Alt özellikler sabit sürücünüzde [4] yer açar.</String>
591 <String Id="UITextSelParentCostPosPos" Overridable="yes">Bu özellik sabit sürücünüzde [1] alan gerektirir. [3] alt özellikten [2] tanesi seçili. Alt özellikler sabit sürücünüzde [4] alan gerektirir.</String>
592 <String Id="UITextTimeRemaining" Overridable="yes">Kalan süre: {[1] dakika }{[2] saniye}</String>
593 <String Id="UITextVolumeCostAvailable" Overridable="yes">Uygun</String>
594 <String Id="UITextVolumeCostDifference" Overridable="yes">Fark</String>
595 <String Id="UITextVolumeCostRequired" Overridable="yes">Gerekli</String>
596 <String Id="UITextVolumeCostSize" Overridable="yes">Disk Boyutu</String>
597 <String Id="UITextVolumeCostVolume" Overridable="yes">Birim</String>
598</WixLocalization>
diff --git a/src/ext/UI/wixlib/WixUI_uk-UA.wxl b/src/ext/UI/wixlib/WixUI_uk-UA.wxl
new file mode 100644
index 00000000..671d4319
--- /dev/null
+++ b/src/ext/UI/wixlib/WixUI_uk-UA.wxl
@@ -0,0 +1,598 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3
4
5<WixLocalization Culture="uk-ua" Codepage="1251" xmlns="http://wixtoolset.org/schemas/v4/wxl">
6 <String Id="WixUIBack" Overridable="yes">&amp;Назад</String>
7 <String Id="WixUINext" Overridable="yes">&amp;Далі</String>
8 <String Id="WixUICancel" Overridable="yes">Скасувати</String>
9 <String Id="WixUIFinish" Overridable="yes">&amp;Готово</String>
10 <String Id="WixUIRetry" Overridable="yes">&amp;Повторити</String>
11 <String Id="WixUIIgnore" Overridable="yes">&amp;Пропустити</String>
12 <String Id="WixUIYes" Overridable="yes">&amp;Так</String>
13 <String Id="WixUINo" Overridable="yes">&amp;Ні</String>
14 <String Id="WixUIOK" Overridable="yes">ОК</String>
15 <String Id="WixUIPrint" Overridable="yes">&amp;Друк</String>
16
17 <String Id="AdvancedWelcomeEulaDlg_Title" Overridable="yes">Інсталяція програми [ProductName]</String>
18 <String Id="AdvancedWelcomeEulaDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
19 <String Id="AdvancedWelcomeEulaDlgTitle" Overridable="yes">{\WixUI_Font_Title}Ознайомтеся з ліцензійною угодою для програми [ProductName]</String>
20 <String Id="AdvancedWelcomeEulaDlgLicenseAcceptedCheckBox" Overridable="yes">Я &amp;приймаю умови ліцензійної угоди</String>
21 <String Id="AdvancedWelcomeEulaDlgDescriptionPerMachine" Overridable="yes">Щоб інсталювати продукт із параметрами за промовчанням для всіх користувачів, натисніть кнопку "Інсталювати". Щоб змінити параметри інсталяції, натисніть кнопку "Додатково".</String>
22 <String Id="AdvancedWelcomeEulaDlgDescriptionPerUser" Overridable="yes">Щоб інсталювати продукт із параметрами за промовчанням для всіх користувачів, натисніть кнопку "Інсталювати". Щоб змінити параметри інсталяції, натисніть кнопку "Додатково".</String>
23 <String Id="AdvancedWelcomeEulaDlgInstall" Overridable="yes">&amp;Інсталювати</String>
24 <String Id="AdvancedWelcomeEulaDlgAdvanced" Overridable="yes">Д&amp;одатково</String>
25 <String Id="Advanced_Font_Normal_Size" Overridable="yes">8</String>
26 <String Id="Advanced_Font_Bigger_Size" Overridable="yes">12</String>
27 <String Id="Advanced_Font_Title_Size" Overridable="yes">9</String>
28 <String Id="Advanced_Font_Emphasized_Size" Overridable="yes">8</String>
29 <String Id="Advanced_Font_FaceName" Overridable="yes">Tahoma</String>
30
31 <String Id="BrowseDlg_Title" Overridable="yes">Інсталяція програми [ProductName]</String>
32 <String Id="BrowseDlgComboLabel" Overridable="yes">&amp;Область пошуку:</String>
33 <String Id="BrowseDlgWixUI_Bmp_Up" Overridable="yes">WixUI_Bmp_Up</String>
34 <String Id="BrowseDlgWixUI_Bmp_UpTooltip" Overridable="yes">Перейти на рівень вгору</String>
35 <String Id="BrowseDlgNewFolder" Overridable="yes">WixUI_Bmp_New</String>
36 <String Id="BrowseDlgNewFolderTooltip" Overridable="yes">Створення нової папки</String>
37 <String Id="BrowseDlgPathLabel" Overridable="yes">&amp;Ім’я папки:</String>
38 <String Id="BrowseDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
39 <String Id="BrowseDlgDescription" Overridable="yes">Перехід до папки призначення</String>
40 <String Id="BrowseDlgTitle" Overridable="yes">{\WixUI_Font_Title}Змінення папки призначення</String>
41
42 <String Id="CancelDlg_Title" Overridable="yes">Інсталяція програми [ProductName]</String>
43 <String Id="CancelDlgText" Overridable="yes">Справді скасувати інсталяцію програми [ProductName]?</String>
44 <String Id="CancelDlgIcon" Overridable="yes">WixUI_Ico_Info</String>
45 <String Id="CancelDlgIconTooltip" Overridable="yes">Піктограма відомостей</String>
46
47 <String Id="CustomizeDlg_Title" Overridable="yes">Інсталяція програми [ProductName]</String>
48 <String Id="CustomizeDlgTree" Overridable="yes">Дерево вибору</String>
49 <String Id="CustomizeDlgBrowse" Overridable="yes">О&amp;гляд...</String>
50 <String Id="CustomizeDlgReset" Overridable="yes">&amp;Скидання</String>
51 <String Id="CustomizeDlgDiskCost" Overridable="yes">Використання &amp;дискового простору</String>
52 <String Id="CustomizeDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
53 <String Id="CustomizeDlgText" Overridable="yes">Спосіб інсталяції компонентів можна змінити, клацаючи піктограми в дереві нижче.</String>
54 <String Id="CustomizeDlgDescription" Overridable="yes">Виберіть спосіб інсталяції компонентів.</String>
55 <String Id="CustomizeDlgTitle" Overridable="yes">{\WixUI_Font_Title}Вибіркова інсталяція</String>
56 <String Id="CustomizeDlgItemDescription" Overridable="yes">CustomizeDlgItemDescription-CustomizeDlgItemDescription</String>
57 <String Id="CustomizeDlgItemSize" Overridable="yes">CustomizeDlgItemSize-CustomizeDlgItemSize</String>
58 <String Id="CustomizeDlgLocation" Overridable="yes">CustomizeDlgLocation-CustomizeDlgLocation</String>
59 <String Id="CustomizeDlgLocationLabel" Overridable="yes">Папка:</String>
60
61 <String Id="DiskCostDlg_Title" Overridable="yes">Інсталяція програми [ProductName]</String>
62 <String Id="DiskCostDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
63 <String Id="DiskCostDlgText" Overridable="yes">У виділених томах бракує дискового простору для інсталяції вибраних компонентів. Можна видалити з виділених томів кілька файлів, інсталювати менше компонентів або вибрати інші диски призначення.</String>
64 <String Id="DiskCostDlgDescription" Overridable="yes">Дисковий простір, необхідний для інсталяції вибраних компонентів.</String>
65 <String Id="DiskCostDlgTitle" Overridable="yes">{\WixUI_Font_Title}Вимоги до дискового простору</String>
66 <String Id="DiskCostDlgVolumeList" Overridable="yes">{120}{70}{70}{70}{70}</String>
67
68 <String Id="ErrorDlg_Title" Overridable="yes">Інсталяція програми [ProductName]</String>
69 <String Id="ErrorDlgErrorText" Overridable="yes">Інформаційний текст</String>
70 <String Id="ErrorDlgErrorIcon" Overridable="yes">WixUI_Ico_Info</String>
71 <String Id="ErrorDlgErrorIconTooltip" Overridable="yes">Піктограма відомостей</String>
72
73 <String Id="ExitDialog_Title" Overridable="yes">Інсталяція програми [ProductName]</String>
74 <String Id="ExitDialogBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
75 <String Id="ExitDialogDescription" Overridable="yes">Натисніть кнопку "Готово", щоб закрити майстер інсталяції.</String>
76 <String Id="ExitDialogTitle" Overridable="yes">{\WixUI_Font_Bigger}Роботу майстра інсталяції програми [ProductName] завершено</String>
77
78 <String Id="FatalError_Title" Overridable="yes">Інсталяція програми [ProductName]</String>
79 <String Id="FatalErrorBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
80 <String Id="FatalErrorTitle" Overridable="yes">{\WixUI_Font_Bigger}Роботу майстра інсталяції програми [ProductName] завершено передчасно</String>
81 <String Id="FatalErrorDescription1" Overridable="yes">Роботу майстра інсталяції програми [ProductName] передчасно завершено через помилку. Систему не змінено. Щоб продовжити інсталяцію пізніше, знову запустіть майстер інсталяції.</String>
82 <String Id="FatalErrorDescription2" Overridable="yes">Натисніть кнопку "Готово", щоб закрити майстер інсталяції.</String>
83
84 <String Id="FeaturesDlg_Title" Overridable="yes">Інсталяція програми [ProductName]</String>
85 <String Id="FeaturesDlgTree" Overridable="yes">Компоненти продукту</String>
86 <String Id="FeaturesDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
87 <String Id="FeaturesDlgDescription" Overridable="yes">Виберіть спосіб інсталяції компонентів.</String>
88 <String Id="FeaturesDlgTitle" Overridable="yes">{\WixUI_Font_Title}Компоненти продукту</String>
89 <String Id="FeaturesDlgItemDescription" Overridable="yes">FeaturesDlgItemDescription</String>
90 <String Id="FeaturesDlgItemSize" Overridable="yes">FeaturesDlgItemSize</String>
91 <String Id="FeaturesDlgInstall" Overridable="yes">&amp;Інсталювати</String>
92 <String Id="FeaturesDlgChange" Overridable="yes">&amp;Змінити</String>
93
94 <String Id="FilesInUse_Title" Overridable="yes">Інсталяція програми [ProductName]</String>
95 <String Id="FilesInUseExit" Overridable="yes">Ви&amp;хід</String>
96 <String Id="FilesInUseBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
97 <String Id="FilesInUseText" Overridable="yes">Наведені нижче застосунки використовують файли, які підлягають оновленню під час цієї інсталяції. Закривши ці застосунки, натисніть кнопку "&amp;Повторити", щоб продовжити інсталяцію, або кнопку "Закрити", щоб припинити її.</String>
98 <String Id="FilesInUseDescription" Overridable="yes">Деякі файли, що підлягають оновленню, зараз використовуються.</String>
99 <String Id="FilesInUseTitle" Overridable="yes">{\WixUI_Font_Title}Файли, які використовуються</String>
100
101 <String Id="InstallDirDlg_Title" Overridable="yes">Інсталяція програми [ProductName]</String>
102 <String Id="InstallDirDlgChange" Overridable="yes">&amp;Змінити...</String>
103 <String Id="InstallDirDlgTitle" Overridable="yes">{\WixUI_Font_Title}Папка призначення</String>
104 <String Id="InstallDirDlgDescription" Overridable="yes">Для інсталяції в папку за промовчанням натисніть кнопку "Далі"; щоб вибрати іншу папку, натисніть кнопку "Змінити".</String>
105 <String Id="InstallDirDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
106 <String Id="InstallDirDlgFolderLabel" Overridable="yes">Папка для інсталяції програми [ProductName]:</String>
107
108 <String Id="InstallScopeDlg_Title" Overridable="yes">Інсталяція програми [ProductName]</String>
109 <String Id="InstallScopeDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
110 <String Id="InstallScopeDlgDescription" Overridable="yes">Вибір типу й папки для інсталяції</String>
111 <String Id="InstallScopeDlgTitle" Overridable="yes">{\WixUI_Font_Title}Тип інсталяції</String>
112 <String Id="InstallScopeDlgPerUser" Overridable="yes">{\WixUI_Font_Emphasized}Інсталювати &amp;лише для себе ([LogonUser])</String>
113 <String Id="InstallScopeDlgPerUserDescription" Overridable="yes">[ProductName] буде інстальовано в папку на рівні користувача; доступ буде можливий лише з вашого облікового запису користувача. Права локального адміністратора не потрібні.</String>
114 <String Id="InstallScopeDlgNoPerUserDescription" Overridable="yes">[ProductName] не підтримує інсталяції на рівні користувача.</String>
115 <String Id="InstallScopeDlgPerMachine" Overridable="yes">{\WixUI_Font_Emphasized}Інсталювати для всіх користувачів цього &amp;комп’ютера</String>
116 <String Id="InstallScopeDlgPerMachineDescription" Overridable="yes">[ProductName] буде інстальовано в папку за промовчанням на рівні комп’ютера; доступ буде можливий для всіх користувачів. Папку за промовчанням для інсталяції можна змінити. Вам необхідні права локального адміністратора.</String>
117 <String Id="InstallScopeDlgFolderLabel" Overridable="yes">&amp;Папка для інсталяції:</String>
118 <String Id="InstallScopeDlgChange" Overridable="yes">&amp;Змінити...</String>
119
120 <String Id="InvalidDirDlg_Title" Overridable="yes">Інсталяція програми [ProductName]</String>
121 <String Id="InvalidDirDlgText" Overridable="yes">Каталог для інсталяції має міститися на локальному жорсткому диску.</String>
122 <String Id="InvalidDirDlgIcon" Overridable="yes">WixUI_Ico_Info</String>
123 <String Id="InvalidDirDlgIconTooltip" Overridable="yes">Піктограма відомостей</String>
124
125 <String Id="LicenseAgreementDlg_Title" Overridable="yes">Інсталяція програми [ProductName]</String>
126 <String Id="LicenseAgreementDlgLicenseAcceptedCheckBox" Overridable="yes">Я &amp;приймаю умови ліцензійної угоди</String>
127 <String Id="LicenseAgreementDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
128 <String Id="LicenseAgreementDlgDescription" Overridable="yes">Уважно прочитайте наведену нижче ліцензійну угоду</String>
129 <String Id="LicenseAgreementDlgTitle" Overridable="yes">{\WixUI_Font_Title}Ліцензійна угода</String>
130
131 <String Id="MaintenanceTypeDlg_Title" Overridable="yes">Інсталяція програми [ProductName]</String>
132 <String Id="MaintenanceTypeDlgChangeButton" Overridable="yes">&amp;Змінити</String>
133 <String Id="MaintenanceTypeDlgChangeButtonTooltip" Overridable="yes">Змінити інсталяцію</String>
134 <String Id="MaintenanceTypeDlgRepairButton" Overridable="yes">Відно&amp;вити</String>
135 <String Id="MaintenanceTypeDlgRepairButtonTooltip" Overridable="yes">Відновити інсталяцію</String>
136 <String Id="MaintenanceTypeDlgRemoveButton" Overridable="yes">&amp;Видалити</String>
137 <String Id="MaintenanceTypeDlgRemoveButtonTooltip" Overridable="yes">Видалити інсталяцію</String>
138 <String Id="MaintenanceTypeDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
139 <String Id="MaintenanceTypeDlgDescription" Overridable="yes">Виберіть операцію, яку потрібно виконати.</String>
140 <String Id="MaintenanceTypeDlgTitle" Overridable="yes">{\WixUI_Font_Title}Змінити, відновити або видалити інсталяцію</String>
141 <String Id="MaintenanceTypeDlgChangeText" Overridable="yes">Дає змогу змінити спосіб інсталяції компонентів.</String>
142 <String Id="MaintenanceTypeDlgChangeDisabledText" Overridable="yes">Для програми [ProductName] немає компонентів, які можна вибрати окремо.</String>
143 <String Id="MaintenanceTypeDlgRemoveText" Overridable="yes">Видаляє [ProductName] з комп’ютера.</String>
144 <String Id="MaintenanceTypeDlgRemoveDisabledText" Overridable="yes">Не можна видалити програму [ProductName].</String>
145 <String Id="MaintenanceTypeDlgRepairText" Overridable="yes">Виправляє помилки останньої інсталяції, відновлюючи втрачені або пошкоджені файли, ярлики й записи реєстру.</String>
146 <String Id="MaintenanceTypeDlgRepairDisabledText" Overridable="yes">Не можна відновити програму [ProductName].</String>
147
148 <String Id="MaintenanceWelcomeDlg_Title" Overridable="yes">Інсталяція програми [ProductName]</String>
149 <String Id="MaintenanceWelcomeDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
150 <String Id="MaintenanceWelcomeDlgDescription" Overridable="yes">Майстер інсталяції дає змогу змінити спосіб інсталяції компонентів програми [ProductName] на комп’ютері або видалити цю програму. Для продовження натисніть кнопку "Далі". Щоб закрити майстер інсталяції, натисніть кнопку "Скасувати".</String>
151 <String Id="MaintenanceWelcomeDlgTitle" Overridable="yes">{\WixUI_Font_Bigger}Вас вітає майстер інсталяції програми [ProductName]</String>
152
153 <String Id="MsiRMFilesInUse_Title" Overridable="yes">Інсталяція програми [ProductName]</String>
154 <String Id="MsiRMFilesInUseBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
155 <String Id="MsiRMFilesInUseText" Overridable="yes">Наведені нижче застосунки використовують файли, які підлягають оновленню під час цієї інсталяції. Можна дозволити майстру інсталяції закрити та спробувати перезапустити їх або перезавантажити комп’ютер пізніше.</String>
156 <String Id="MsiRMFilesInUseDescription" Overridable="yes">Деякі файли, що підлягають оновленню, зараз використовуються.</String>
157 <String Id="MsiRMFilesInUseTitle" Overridable="yes">{\WixUI_Font_Title}Файли, які використовуються</String>
158 <String Id="MsiRMFilesInUseUseRM" Overridable="yes">&amp;Закрийте ці застосунки та спробуйте їх перезапустити.</String>
159 <String Id="MsiRMFilesInUseDontUseRM" Overridable="yes">&amp;Не закривати застосунки. Потрібно буде перезавантажити комп’ютер.</String>
160
161 <String Id="OutOfDiskDlg_Title" Overridable="yes">Інсталяція програми [ProductName]</String>
162 <String Id="OutOfDiskDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
163 <String Id="OutOfDiskDlgText" Overridable="yes">У виділених томах бракує дискового простору для інсталяції вибраних компонентів. Можна видалити з виділених томів кілька файлів, інсталювати менше компонентів або вибрати інший диск призначення.</String>
164 <String Id="OutOfDiskDlgDescription" Overridable="yes">Обсяг, необхідний для інсталяції, перевищує обсяг вільного дискового простору.</String>
165 <String Id="OutOfDiskDlgTitle" Overridable="yes">{\WixUI_Font_Title}Бракує дискового простору</String>
166 <String Id="OutOfDiskDlgVolumeList" Overridable="yes">{120}{70}{70}{70}{70}</String>
167
168 <String Id="OutOfRbDiskDlg_Title" Overridable="yes">Інсталяція програми [ProductName]</String>
169 <String Id="OutOfRbDiskDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
170 <String Id="OutOfRbDiskDlgText" Overridable="yes">У виділених томах бракує дискового простору для інсталяції вибраних компонентів. Можна видалити з виділених томів кілька файлів, інсталювати менше компонентів або вибрати інший диск призначення.</String>
171 <String Id="OutOfRbDiskDlgDescription" Overridable="yes">Обсяг, необхідний для інсталяції, перевищує обсяг вільного дискового простору.</String>
172 <String Id="OutOfRbDiskDlgTitle" Overridable="yes">{\WixUI_Font_Title}Бракує дискового простору</String>
173 <String Id="OutOfRbDiskDlgVolumeList" Overridable="yes">{120}{70}{70}{70}{70}</String>
174 <String Id="OutOfRbDiskDlgText2" Overridable="yes">Інший варіант – вимкнути в інсталяторі функцію відкочування. У такому разі інсталятор не зможе відновити вихідний стан комп’ютера після переривання процесу інсталяції. Щоб погодитися на цей ризик і вимкнути функцію відкочування, натисніть кнопку "Так".</String>
175
176 <String Id="PrepareDlg_Title" Overridable="yes">Інсталяція програми [ProductName]</String>
177 <String Id="PrepareDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
178 <String Id="PrepareDlgDescription" Overridable="yes">Зачекайте: майстер готується до інсталяції.</String>
179 <String Id="PrepareDlgTitle" Overridable="yes">{\WixUI_Font_Bigger}Вас вітає майстер інсталяції програми [ProductName]</String>
180
181 <String Id="ProgressDlg_Title" Overridable="yes">Інсталяція програми [ProductName]</String>
182 <String Id="ProgressDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
183 <String Id="ProgressDlgTextInstalling" Overridable="yes">Зачекайте: майстер виконує інсталяцію програми [ProductName].</String>
184 <String Id="ProgressDlgTitleInstalling" Overridable="yes">{\WixUI_Font_Title}Триває інсталяція програми [ProductName]</String>
185 <String Id="ProgressDlgTextChanging" Overridable="yes">Зачекайте: майстер інсталяції змінює програму [ProductName].</String>
186 <String Id="ProgressDlgTitleChanging" Overridable="yes">{\WixUI_Font_Title}Змінення програми [ProductName]</String>
187 <String Id="ProgressDlgTextRepairing" Overridable="yes">Зачекайте: майстер інсталяції відновлює програму [ProductName].</String>
188 <String Id="ProgressDlgTitleRepairing" Overridable="yes">{\WixUI_Font_Title}Відновлення програми [ProductName]</String>
189 <String Id="ProgressDlgTextRemoving" Overridable="yes">Зачекайте: майстер інсталяції видаляє програму [ProductName].</String>
190 <String Id="ProgressDlgTitleRemoving" Overridable="yes">{\WixUI_Font_Title}Видалення програми [ProductName]</String>
191 <String Id="ProgressDlgTextUpdating" Overridable="yes">Зачекайте, доки майстер інсталяції оновить програму [ProductName].</String>
192 <String Id="ProgressDlgTitleUpdating" Overridable="yes">{\WixUI_Font_Title}Оновлення програми [ProductName]</String>
193 <String Id="ProgressDlgProgressBar" Overridable="yes">Перебіг виконання</String>
194 <String Id="ProgressDlgStatusLabel" Overridable="yes">Стан:</String>
195
196 <String Id="ResumeDlg_Title" Overridable="yes">Інсталяція програми [ProductName]</String>
197 <String Id="ResumeDlgInstall" Overridable="yes">&amp;Інсталювати</String>
198 <String Id="ResumeDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
199 <String Id="ResumeDlgDescription" Overridable="yes">Майстер завершить інсталяцію програми [ProductName] на комп’ютері. Для продовження натисніть кнопку "Інсталювати". Щоб закрити майстер інсталяції, натисніть кнопку "Скасувати".</String>
200 <String Id="ResumeDlgTitle" Overridable="yes">{\WixUI_Font_Bigger}Відновлення роботи майстра інсталяції програми [ProductName]</String>
201
202 <String Id="SetupTypeDlg_Title" Overridable="yes">Інсталяція програми [ProductName]</String>
203 <String Id="SetupTypeDlgTypicalButton" Overridable="yes">&amp;Звичайна</String>
204 <String Id="SetupTypeDlgTypicalButtonTooltip" Overridable="yes">Звичайна інсталяція</String>
205 <String Id="SetupTypeDlgCustomButton" Overridable="yes">&amp;Вибіркова</String>
206 <String Id="SetupTypeDlgCustomButtonTooltip" Overridable="yes">Вибіркова інсталяція</String>
207 <String Id="SetupTypeDlgCompleteButton" Overridable="yes">&amp;Повна</String>
208 <String Id="SetupTypeDlgCompleteButtonTooltip" Overridable="yes">Повна інсталяція</String>
209 <String Id="SetupTypeDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
210 <String Id="SetupTypeDlgTitle" Overridable="yes">{\WixUI_Font_Title}Вибір типу інсталяції</String>
211 <String Id="SetupTypeDlgDescription" Overridable="yes">Виберіть потрібний тип інсталяції</String>
212 <String Id="SetupTypeDlgTypicalText" Overridable="yes">Інсталяція найпоширеніших компонентів програми (рекомендовано для більшості користувачів).</String>
213 <String Id="SetupTypeDlgCustomText" Overridable="yes">Можливість вибрати компоненти програми та місце їх інсталяції (рекомендовано для досвідчених користувачів).</String>
214 <String Id="SetupTypeDlgCompleteText" Overridable="yes">Інсталяція усіх програмних компонентів (найбільші вимоги до дискового простору).</String>
215
216 <String Id="UserExit_Title" Overridable="yes">Інсталяція програми [ProductName]</String>
217 <String Id="UserExitBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
218 <String Id="UserExitTitle" Overridable="yes">{\WixUI_Font_Bigger}Роботу майстра інсталяції програми [ProductName] перервано</String>
219 <String Id="UserExitDescription1" Overridable="yes">Інсталяцію програми [ProductName] було перервано. Систему не змінено. Щоб інсталювати цю програму пізніше, знову запустіть процес інсталяції.</String>
220 <String Id="UserExitDescription2" Overridable="yes">Натисніть кнопку "Готово", щоб закрити майстер інсталяції.</String>
221
222 <String Id="VerifyReadyDlg_Title" Overridable="yes">Інсталяція програми [ProductName]</String>
223 <String Id="VerifyReadyDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
224 <String Id="VerifyReadyDlgInstall" Overridable="yes">&amp;Інсталювати</String>
225 <String Id="VerifyReadyDlgInstallText" Overridable="yes">Щоб розпочати інсталяцію, натисніть кнопку "Інсталювати". Щоб перевірити або змінити будь-які настройки інсталяції, натисніть кнопку "Назад". Щоб закрити майстер, натисніть кнопку "Скасувати".</String>
226 <String Id="VerifyReadyDlgInstallTitle" Overridable="yes">{\WixUI_Font_Title}Усе готово до інсталяції програми [ProductName]</String>
227 <String Id="VerifyReadyDlgChange" Overridable="yes">&amp;Змінити</String>
228 <String Id="VerifyReadyDlgChangeText" Overridable="yes">Щоб розпочати інсталяцію, натисніть кнопку "Змінити". Щоб перевірити або змінити будь-які настройки інсталяції, натисніть кнопку "Назад". Щоб закрити майстер, натисніть кнопку "Скасувати".</String>
229 <String Id="VerifyReadyDlgChangeTitle" Overridable="yes">{\WixUI_Font_Title}Усе готово до змінення програми [ProductName]</String>
230 <String Id="VerifyReadyDlgRepair" Overridable="yes">Відно&amp;вити</String>
231 <String Id="VerifyReadyDlgRepairText" Overridable="yes">Щоб відновити інсталяцію програми [ProductName], натисніть кнопку "Відновити". Щоб перевірити або змінити будь-які настройки інсталяції, натисніть кнопку "Назад". Щоб закрити майстер, натисніть кнопку "Скасувати".</String>
232 <String Id="VerifyReadyDlgRepairTitle" Overridable="yes">{\WixUI_Font_Title}Усе готово до відновлення програми [ProductName]</String>
233 <String Id="VerifyReadyDlgRemove" Overridable="yes">&amp;Видалити</String>
234 <String Id="VerifyReadyDlgRemoveText" Overridable="yes">Щоб видалити програму [ProductName] з цього комп’ютера, натисніть кнопку "Видалити". Щоб перевірити або змінити будь-які настройки інсталяції, натисніть кнопку "Назад". Щоб закрити майстер, натисніть кнопку "Скасувати".</String>
235 <String Id="VerifyReadyDlgRemoveTitle" Overridable="yes">{\WixUI_Font_Title}Усе готово до видалення програми [ProductName]</String>
236 <String Id="VerifyReadyDlgUpdate" Overridable="yes">&amp;Оновити</String>
237 <String Id="VerifyReadyDlgUpdateText" Overridable="yes">Щоб оновити програму [ProductName] зі свого комп’ютера, натисніть кнопку "Оновити". Щоб перевірити або змінити будь-які настройки інсталяції, натисніть кнопку "Назад". Щоб закрити майстер, натисніть кнопку "Скасувати".</String>
238 <String Id="VerifyReadyDlgUpdateTitle" Overridable="yes">{\WixUI_Font_Title}Усе готово до оновлення програми [ProductName]</String>
239
240 <String Id="WaitForCostingDlg_Title" Overridable="yes">Інсталяція програми [ProductName]</String>
241 <String Id="WaitForCostingDlgReturn" Overridable="yes">&amp;Повернутися</String>
242 <String Id="WaitForCostingDlgText" Overridable="yes">Зачекайте, доки інсталятор визначить вимоги до вільного дискового простору.</String>
243 <String Id="WaitForCostingDlgIcon" Overridable="yes">WixUI_Ico_Exclam</String>
244 <String Id="WaitForCostingDlgIconTooltip" Overridable="yes">Піктограма знаку оклику</String>
245
246 <String Id="WelcomeDlg_Title" Overridable="yes">Інсталяція програми [ProductName]</String>
247 <String Id="WelcomeDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
248 <String Id="WelcomeDlgDescription" Overridable="yes">Майстер інсталює програму [ProductName] на комп’ютері. Для продовження натисніть кнопку "Далі". Щоб закрити майстер інсталяції, натисніть кнопку "Скасувати".</String>
249 <String Id="WelcomeUpdateDlgDescriptionUpdate" Overridable="yes">Майстер інсталяції оновить програму [ProductName] на комп’ютері. Для продовження натисніть кнопку "Далі". Щоб закрити майстер інсталяції, натисніть кнопку "Скасувати".</String>
250 <String Id="WelcomeDlgTitle" Overridable="yes">{\WixUI_Font_Bigger}Вас вітає майстер інсталяції програми [ProductName]</String>
251
252 <String Id="WelcomeEulaDlg_Title" Overridable="yes">Інсталяція програми [ProductName]</String>
253 <String Id="WelcomeEulaDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
254 <String Id="WelcomeEulaDlgLicenseAcceptedCheckBox" Overridable="yes">Я &amp;приймаю умови ліцензійної угоди</String>
255 <String Id="WelcomeEulaDlgInstall" Overridable="yes">&amp;Інсталювати</String>
256 <String Id="WelcomeEulaDlgUpdate" Overridable="yes">&amp;Оновити</String>
257 <String Id="WelcomeEulaDlgTitle" Overridable="yes">{\WixUI_Font_Title}Ознайомтеся з ліцензійною угодою для програми [ProductName]</String>
258
259 <String Id="ProgressTextInstallValidate" Overridable="yes">Перевірка інсталяції</String>
260 <String Id="ProgressTextInstallFiles" Overridable="yes">Копіювання нових файлів</String>
261 <String Id="ProgressTextInstallFilesTemplate" Overridable="yes">Файл: [1], каталог: [9], розмір: [6]</String>
262 <String Id="ProgressTextInstallAdminPackage" Overridable="yes">Копіювання файлів мережної інсталяції</String>
263 <String Id="ProgressTextInstallAdminPackageTemplate" Overridable="yes">Файл: [1], каталог: [9], розмір: [6]</String>
264 <String Id="ProgressTextFileCost" Overridable="yes">Обчислення потрібного дискового простору</String>
265 <String Id="ProgressTextCostInitialize" Overridable="yes">Обчислення потрібного дискового простору</String>
266 <String Id="ProgressTextCostFinalize" Overridable="yes">Обчислення потрібного дискового простору</String>
267 <String Id="ProgressTextCreateShortcuts" Overridable="yes">Створення ярликів</String>
268 <String Id="ProgressTextCreateShortcutsTemplate" Overridable="yes">Ярлик: [1]</String>
269 <String Id="ProgressTextPublishComponents" Overridable="yes">Публікація придатних компонентів</String>
270 <String Id="ProgressTextPublishComponentsTemplate" Overridable="yes">Ідентифікатор компонента: [1], кваліфікатор: [2]</String>
271 <String Id="ProgressTextPublishFeatures" Overridable="yes">Публікація функцій продукту</String>
272 <String Id="ProgressTextPublishFeaturesTemplate" Overridable="yes">Функція: [1]</String>
273 <String Id="ProgressTextPublishProduct" Overridable="yes">Публікація відомостей про продукт</String>
274 <String Id="ProgressTextRegisterClassInfo" Overridable="yes">Реєстрація серверів класів</String>
275 <String Id="ProgressTextRegisterClassInfoTemplate" Overridable="yes">Ідентифікатор класу: [1]</String>
276 <String Id="ProgressTextRegisterExtensionInfo" Overridable="yes">Реєстрація серверів розширень</String>
277 <String Id="ProgressTextRegisterExtensionInfoTemplate" Overridable="yes">Розширення: [1]</String>
278 <String Id="ProgressTextRegisterMIMEInfo" Overridable="yes">Реєстрація відомостей про файли MIME</String>
279 <String Id="ProgressTextRegisterMIMEInfoTemplate" Overridable="yes">Тип вмісту MIME: [1], розширення: [2]</String>
280 <String Id="ProgressTextRegisterProgIdInfo" Overridable="yes">Реєстрація ідентифікаторів програми</String>
281 <String Id="ProgressTextRegisterProgIdInfoTemplate" Overridable="yes">Ідентифікатор програми: [1]</String>
282 <String Id="ProgressTextAllocateRegistrySpace" Overridable="yes">Виділення місця в реєстрі</String>
283 <String Id="ProgressTextAllocateRegistrySpaceTemplate" Overridable="yes">Вільне місце: [1]</String>
284 <String Id="ProgressTextAppSearch" Overridable="yes">Пошук інстальованих застосунків</String>
285 <String Id="ProgressTextAppSearchTemplate" Overridable="yes">Властивість: [1]. Підпис: [2]</String>
286 <String Id="ProgressTextBindImage" Overridable="yes">Зв’язування виконуваних файлів</String>
287 <String Id="ProgressTextBindImageTemplate" Overridable="yes">Файл: [1]</String>
288 <String Id="ProgressTextCCPSearch" Overridable="yes">Пошук відповідних програмних продуктів</String>
289 <String Id="ProgressTextCreateFolders" Overridable="yes">Створення папок</String>
290 <String Id="ProgressTextCreateFoldersTemplate" Overridable="yes">Папка: [1]</String>
291 <String Id="ProgressTextDeleteServices" Overridable="yes">Видалення служб</String>
292 <String Id="ProgressTextDeleteServicesTemplate" Overridable="yes">Служба: [1]</String>
293 <String Id="ProgressTextDuplicateFiles" Overridable="yes">Створення копій файлів</String>
294 <String Id="ProgressTextDuplicateFilesTemplate" Overridable="yes">Файл: [1], каталог: [9], розмір: [6]</String>
295 <String Id="ProgressTextFindRelatedProducts" Overridable="yes">Пошук пов’язаних застосунків</String>
296 <String Id="ProgressTextFindRelatedProductsTemplate" Overridable="yes">Знайдено застосунок: [1]</String>
297 <String Id="ProgressTextInstallODBC" Overridable="yes">Інсталяція компонентів ODBC</String>
298 <String Id="ProgressTextInstallServices" Overridable="yes">Інсталяція нових служб</String>
299 <String Id="ProgressTextInstallServicesTemplate" Overridable="yes">Служба: [2]</String>
300 <String Id="ProgressTextLaunchConditions" Overridable="yes">Перевірка умов запуску</String>
301 <String Id="ProgressTextMigrateFeatureStates" Overridable="yes">Міграція параметрів компонентів із пов’язаних застосунків</String>
302 <String Id="ProgressTextMigrateFeatureStatesTemplate" Overridable="yes">Застосунок: [1]</String>
303 <String Id="ProgressTextMoveFiles" Overridable="yes">Переміщення файлів</String>
304 <String Id="ProgressTextMoveFilesTemplate" Overridable="yes">Файл: [1], каталог: [9], розмір: [6]</String>
305 <String Id="ProgressTextPatchFiles" Overridable="yes">Виправлення файлів</String>
306 <String Id="ProgressTextPatchFilesTemplate" Overridable="yes">Файл: [1], каталог: [2], розмір: [3]</String>
307 <String Id="ProgressTextProcessComponents" Overridable="yes">Оновлення реєстрації компонентів</String>
308 <String Id="ProgressTextRegisterComPlus" Overridable="yes">Реєстрація застосунків і компонентів COM+</String>
309 <String Id="ProgressTextRegisterComPlusTemplate" Overridable="yes">Ідентифікатор застосунку: [1]{{, тип застосунку: [2], користувачі: [3], RSN: [4]}}</String>
310 <String Id="ProgressTextRegisterFonts" Overridable="yes">Реєстрація шрифтів</String>
311 <String Id="ProgressTextRegisterFontsTemplate" Overridable="yes">Шрифт: [1]</String>
312 <String Id="ProgressTextRegisterProduct" Overridable="yes">Реєстрація продукту</String>
313 <String Id="ProgressTextRegisterProductTemplate" Overridable="yes">[1]</String>
314 <String Id="ProgressTextRegisterTypeLibraries" Overridable="yes">Реєстрація бібліотек типів</String>
315 <String Id="ProgressTextRegisterTypeLibrariesTemplate" Overridable="yes">Ідентифікатор бібліотеки: [1]</String>
316 <String Id="ProgressTextRegisterUser" Overridable="yes">Реєстрація користувача</String>
317 <String Id="ProgressTextRegisterUserTemplate" Overridable="yes">[1]</String>
318 <String Id="ProgressTextRemoveDuplicateFiles" Overridable="yes">Видалення копій файлів</String>
319 <String Id="ProgressTextRemoveDuplicateFilesTemplate" Overridable="yes">Файл: [1], каталог: [9]</String>
320 <String Id="ProgressTextRemoveEnvironmentStrings" Overridable="yes">Оновлення рядків оточення</String>
321 <String Id="ProgressTextRemoveEnvironmentStringsTemplate" Overridable="yes">Ім’я: [1], значення: [2], дія [3]</String>
322 <String Id="ProgressTextRemoveExistingProducts" Overridable="yes">Видалення застосунків</String>
323 <String Id="ProgressTextRemoveExistingProductsTemplate" Overridable="yes">Застосунок: [1], командний рядок: [2]</String>
324 <String Id="ProgressTextRemoveFiles" Overridable="yes">Видалення файлів</String>
325 <String Id="ProgressTextRemoveFilesTemplate" Overridable="yes">Файл: [1], каталог: [9]</String>
326 <String Id="ProgressTextRemoveFolders" Overridable="yes">Видалення папок</String>
327 <String Id="ProgressTextRemoveFoldersTemplate" Overridable="yes">Папка: [1]</String>
328 <String Id="ProgressTextRemoveIniValues" Overridable="yes">Видалення записів у файлах INI</String>
329 <String Id="ProgressTextRemoveIniValuesTemplate" Overridable="yes">Файл: [1], розділ: [2], ключ: [3], значення: [4]</String>
330 <String Id="ProgressTextRemoveODBC" Overridable="yes">Видалення компонентів ODBC</String>
331 <String Id="ProgressTextRemoveRegistryValues" Overridable="yes">Видалення значень із системного реєстру</String>
332 <String Id="ProgressTextRemoveRegistryValuesTemplate" Overridable="yes">Розділ: [1], ім’я: [2]</String>
333 <String Id="ProgressTextRemoveShortcuts" Overridable="yes">Видалення ярликів</String>
334 <String Id="ProgressTextRemoveShortcutsTemplate" Overridable="yes">Ярлик: [1]</String>
335 <String Id="ProgressTextRMCCPSearch" Overridable="yes">Пошук відповідних програмних продуктів</String>
336 <String Id="ProgressTextSelfRegModules" Overridable="yes">Реєстрація модулів</String>
337 <String Id="ProgressTextSelfRegModulesTemplate" Overridable="yes">Файл: [1], папка: [2]</String>
338 <String Id="ProgressTextSelfUnregModules" Overridable="yes">Скасування реєстрації модулів</String>
339 <String Id="ProgressTextSelfUnregModulesTemplate" Overridable="yes">Файл: [1], папка: [2]</String>
340 <String Id="ProgressTextSetODBCFolders" Overridable="yes">Ініціалізація каталогів ODBC</String>
341 <String Id="ProgressTextStartServices" Overridable="yes">Запуск служб</String>
342 <String Id="ProgressTextStartServicesTemplate" Overridable="yes">Служба: [1]</String>
343 <String Id="ProgressTextStopServices" Overridable="yes">Зупинення служб</String>
344 <String Id="ProgressTextStopServicesTemplate" Overridable="yes">Служба: [1]</String>
345 <String Id="ProgressTextUnpublishComponents" Overridable="yes">Скасування публікації придатних компонентів</String>
346 <String Id="ProgressTextUnpublishComponentsTemplate" Overridable="yes">Ідентифікатор компонента: [1], кваліфікатор: [2]</String>
347 <String Id="ProgressTextUnpublishFeatures" Overridable="yes">Скасування публікації функцій продукту</String>
348 <String Id="ProgressTextUnpublishFeaturesTemplate" Overridable="yes">Функція: [1]</String>
349 <String Id="ProgressTextUnregisterClassInfo" Overridable="yes">Скасування реєстрації серверів класів</String>
350 <String Id="ProgressTextUnregisterClassInfoTemplate" Overridable="yes">Ідентифікатор класу: [1]</String>
351 <String Id="ProgressTextUnregisterComPlus" Overridable="yes">Скасування реєстрації застосунків і компонентів COM+</String>
352 <String Id="ProgressTextUnregisterComPlusTemplate" Overridable="yes">Ідентифікатор застосунку: [1]{{, тип застосунку: [2]}}</String>
353 <String Id="ProgressTextUnregisterExtensionInfo" Overridable="yes">Скасування реєстрації серверів розширень</String>
354 <String Id="ProgressTextUnregisterExtensionInfoTemplate" Overridable="yes">Розширення: [1]</String>
355 <String Id="ProgressTextUnregisterFonts" Overridable="yes">Скасування реєстрації шрифтів</String>
356 <String Id="ProgressTextUnregisterFontsTemplate" Overridable="yes">Шрифт: [1]</String>
357 <String Id="ProgressTextUnregisterMIMEInfo" Overridable="yes">Скасування реєстрації відомостей про файли MIME</String>
358 <String Id="ProgressTextUnregisterMIMEInfoTemplate" Overridable="yes">Тип вмісту MIME: [1], розширення: [2]</String>
359 <String Id="ProgressTextUnregisterProgIdInfo" Overridable="yes">Скасування реєстрації ідентифікаторів програми</String>
360 <String Id="ProgressTextUnregisterProgIdInfoTemplate" Overridable="yes">Ідентифікатор програми: [1]</String>
361 <String Id="ProgressTextUnregisterTypeLibraries" Overridable="yes">Скасування реєстрації бібліотек типів</String>
362 <String Id="ProgressTextUnregisterTypeLibrariesTemplate" Overridable="yes">Ідентифікатор бібліотеки: [1]</String>
363 <String Id="ProgressTextWriteEnvironmentStrings" Overridable="yes">Оновлення рядків оточення</String>
364 <String Id="ProgressTextWriteEnvironmentStringsTemplate" Overridable="yes">Ім’я: [1], значення: [2], дія [3]</String>
365 <String Id="ProgressTextWriteIniValues" Overridable="yes">Запис значень файлів INI</String>
366 <String Id="ProgressTextWriteIniValuesTemplate" Overridable="yes">Файл: [1], розділ: [2], ключ: [3], значення: [4]</String>
367 <String Id="ProgressTextWriteRegistryValues" Overridable="yes">Запис значень до системного реєстру</String>
368 <String Id="ProgressTextWriteRegistryValuesTemplate" Overridable="yes">Розділ: [1], ім’я: [2], значення: [3]</String>
369 <String Id="ProgressTextAdvertise" Overridable="yes">Поширення відомостей про застосунок</String>
370 <String Id="ProgressTextGenerateScript" Overridable="yes">Створення операцій сценарію для дії:</String>
371 <String Id="ProgressTextGenerateScriptTemplate" Overridable="yes">[1]</String>
372 <String Id="ProgressTextInstallSFPCatalogFile" Overridable="yes">Інсталяція системного каталогу</String>
373 <String Id="ProgressTextInstallSFPCatalogFileTemplate" Overridable="yes">Файл: [1], залежності: [2]</String>
374 <String Id="ProgressTextMsiPublishAssemblies" Overridable="yes">Публікація відомостей про складання</String>
375 <String Id="ProgressTextMsiPublishAssembliesTemplate" Overridable="yes">Контекст застосунку:[1], ім’я складання:[2]</String>
376 <String Id="ProgressTextMsiUnpublishAssemblies" Overridable="yes">Скасування публікації відомостей про складання</String>
377 <String Id="ProgressTextMsiUnpublishAssembliesTemplate" Overridable="yes">Контекст застосунку:[1], ім’я складання:[2]</String>
378 <String Id="ProgressTextRollback" Overridable="yes">Відкочування дії:</String>
379 <String Id="ProgressTextRollbackTemplate" Overridable="yes">[1]</String>
380 <String Id="ProgressTextRollbackCleanup" Overridable="yes">Видалення резервних файлів</String>
381 <String Id="ProgressTextRollbackCleanupTemplate" Overridable="yes">Файл: [1]</String>
382 <String Id="ProgressTextUnmoveFiles" Overridable="yes">Видалення переміщених файлів</String>
383 <String Id="ProgressTextUnmoveFilesTemplate" Overridable="yes">Файл: [1], каталог: [9]</String>
384 <String Id="ProgressTextUnpublishProduct" Overridable="yes">Скасування публікації відомостей про продукт</String>
385
386 <String Id="Error0" Overridable="yes">{{Критична помилка: }}</String>
387 <String Id="Error1" Overridable="yes">{{Помилка [1]. }}</String>
388 <String Id="Error2" Overridable="yes">Попередження [1]. </String>
389 <String Id="Error4" Overridable="yes">Повідомлення [1]. </String>
390 <String Id="Error5" Overridable="yes">Під час інсталяції цього пакета сталася неочікувана помилка інсталятора. Можливо, це вказує на проблему з пакетом. Код помилки – [1]. {{Аргументи: [2], [3], [4]}}</String>
391 <String Id="Error7" Overridable="yes">{{Немає місця на диску: }}</String>
392 <String Id="Error8" Overridable="yes">Дія [Time]: [1]. [2]</String>
393 <String Id="Error9" Overridable="yes">[ProductName]</String>
394 <String Id="Error10" Overridable="yes">{[2]}{, [3]}{, [4]}</String>
395 <String Id="Error11" Overridable="yes">Тип повідомлення: [1], аргумент: [2]</String>
396 <String Id="Error12" Overridable="yes">=== Запис до журналу розпочато: [Date] [Time] ===</String>
397 <String Id="Error13" Overridable="yes">=== Запис до журналу зупинено: [Date] [Time] ===</String>
398 <String Id="Error14" Overridable="yes">Дію почато [Time]: [1].</String>
399 <String Id="Error15" Overridable="yes">Дію завершено [Time]: [1]. Повернено значення [2].</String>
400 <String Id="Error16" Overridable="yes">Залишилося часу: {[1] хв. }{[2] сек.}</String>
401 <String Id="Error17" Overridable="yes">Бракує пам’яті. Закрийте інші застосунки та повторіть спробу.</String>
402 <String Id="Error18" Overridable="yes">Інсталятор не відповідає.</String>
403 <String Id="Error19" Overridable="yes">Інсталятор передчасно припинив роботу.</String>
404 <String Id="Error20" Overridable="yes">Зачекайте: система Windows настроює програму [ProductName]</String>
405 <String Id="Error21" Overridable="yes">Триває збирання потрібних даних...</String>
406 <String Id="Error22" Overridable="yes">Триває видалення попередніх версій цього застосунку...</String>
407 <String Id="Error23" Overridable="yes">Підготовка до видалення попередніх версій цього застосунку...</String>
408 <String Id="Error32" Overridable="yes">Роботу програми інсталяції {[ProductName]} успішно завершено.</String>
409 <String Id="Error33" Overridable="yes">Помилка програми інсталяції {[ProductName]}.</String>
410 <String Id="Error1101" Overridable="yes">Сталася помилка під час читання з файлу: [2]. {{ Системна помилка [3].}} Переконайтеся, що цей файл існує та доступний.</String>
411 <String Id="Error1301" Overridable="yes">Не вдалося створити файл "[2]". Каталог із таким іменем уже існує. Скасуйте інсталяцію та виберіть інше розташування.</String>
412 <String Id="Error1302" Overridable="yes">Вставте диск: [2]</String>
413 <String Id="Error1303" Overridable="yes">Інсталятор не має належних прав доступу до цього каталогу: [2]. Продовження інсталяції неможливе. Ввійдіть до системи як адміністратор або зверніться до системного адміністратора.</String>
414 <String Id="Error1304" Overridable="yes">Помилка під час записування до файлу: [2]. Переконайтеся, що маєте доступ до цього каталогу.</String>
415 <String Id="Error1305" Overridable="yes">Сталася помилка під час читання з файлу [2]. {{ Системна помилка [3].}} Переконайтеся, що цей файл існує та доступний.</String>
416 <String Id="Error1306" Overridable="yes">Файл "[2]" відкрито в режимі монопольного доступу в іншому застосунку. Закрийте всі інші застосунки й натисніть кнопку "Повторити".</String>
417 <String Id="Error1307" Overridable="yes">Недостатньо місця на диску для інсталяції файлу: [2]. Звільніть місце й натисніть кнопку "Повторити" або натисніть кнопку "Скасувати", щоб вийти.</String>
418 <String Id="Error1308" Overridable="yes">Вихідний файл не знайдено: [2]. Переконайтеся, що цей файл існує та доступний.</String>
419 <String Id="Error1309" Overridable="yes">Сталася помилка під час читання з файлу: [3]. {{ Системна помилка [2].}} Переконайтеся, що цей файл існує та доступний.</String>
420 <String Id="Error1310" Overridable="yes">Помилка під час записування до файлу: [3]. {{ Системна помилка [2].}} Переконайтеся, що маєте доступ до цього каталогу.</String>
421 <String Id="Error1311" Overridable="yes">Вихідний файл не знайдено{{(CAB-файл)}}: [2]. Переконайтеся, що цей файл існує та доступний.</String>
422 <String Id="Error1312" Overridable="yes">Не вдалося створити каталог "[2]". Файл із таким іменем уже існує. Перейменуйте або видаліть цей файл і натисніть кнопку "Повторити". Щоб вийти, натисніть кнопку "Скасувати".</String>
423 <String Id="Error1313" Overridable="yes">Том [2] зараз недоступний. Виберіть інший.</String>
424 <String Id="Error1314" Overridable="yes">Указаний шлях "[2]" недоступний.</String>
425 <String Id="Error1315" Overridable="yes">Не вдалося записати до вказаної папки: [2].</String>
426 <String Id="Error1316" Overridable="yes">Сталася мережна помилка під час спроби читання файлу: [2]</String>
427 <String Id="Error1317" Overridable="yes">Сталася помилка під час спроби створення каталогу: [2]</String>
428 <String Id="Error1318" Overridable="yes">Сталася мережна помилка під час спроби створення каталогу: [2]</String>
429 <String Id="Error1319" Overridable="yes">Сталася мережна помилка під час спроби відкрити CAB-файл із вихідними файлами: [2]</String>
430 <String Id="Error1320" Overridable="yes">Указано задовгий шлях: [2]</String>
431 <String Id="Error1321" Overridable="yes">Інсталятор не має належних прав для змінення цього файлу: [2].</String>
432 <String Id="Error1322" Overridable="yes">Частина шляху до папки "[2]" неприпустима: пуста або перевищує дозволену в системі довжину.</String>
433 <String Id="Error1323" Overridable="yes">Шлях до папки "[2]" містить неприпустимі для шляху слова.</String>
434 <String Id="Error1324" Overridable="yes">Шлях до папки "[2]" містить неприпустимий символ.</String>
435 <String Id="Error1325" Overridable="yes">"[2]" не є припустимим коротким іменем файлу.</String>
436 <String Id="Error1326" Overridable="yes">Помилка під час отримання атрибутів безпеки файлу: [3] GetLastError: [2]</String>
437 <String Id="Error1327" Overridable="yes">Неправильний пристрій: [2]</String>
438 <String Id="Error1328" Overridable="yes">Помилка застосування виправлення до файлу [2]. Можливо, файл було оновлено в інший спосіб, і це виправлення вже не може його змінити. Для отримання докладніших відомостей зверніться до постачальника виправлення. {{Системна помилка: [3]}}</String>
439 <String Id="Error1329" Overridable="yes">Не вдалося інсталювати потрібний файл, оскільки в CAB-файлі [2] немає цифрового підпису. Це може свідчити про пошкодження CAB-файлу.</String>
440 <String Id="Error1330" Overridable="yes">Не вдалося інсталювати потрібний файл, оскільки CAB-файл [2] містить недійсний цифровий підпис. Це може свідчити про пошкодження CAB-файлу.{{ Функція WinVerifyTrust повернула помилку [3].}}</String>
441 <String Id="Error1331" Overridable="yes">Не вдалося належно скопіювати файл [2]: помилка CRC.</String>
442 <String Id="Error1332" Overridable="yes">Не вдалося належно перемістити файл [2]: помилка CRC.</String>
443 <String Id="Error1333" Overridable="yes">Не вдалося належно виправити файл [2]: помилка CRC.</String>
444 <String Id="Error1334" Overridable="yes">Не вдалося інсталювати файл "[2]", оскільки його немає в CAB-файлі "[3]". Це може свідчити про помилку мережі, помилку читання компакт-диска або проблему з пакетом.</String>
445 <String Id="Error1335" Overridable="yes">Потрібний для інсталяції CAB-файл "[2]" пошкоджений і непридатний для використання. Це може свідчити про помилку мережі, помилку читання компакт-диска або проблему з пакетом.</String>
446 <String Id="Error1336" Overridable="yes">Сталася помилка під час створення тимчасового файлу, потрібного для завершення інсталяції.{{ Папка: [3]. Код системної помилки: [2]}}</String>
447 <String Id="Error1401" Overridable="yes">Не вдалося створити розділ: [2]. {{ Системна помилка [3].}} Переконайтеся, що у вас достатньо прав для доступу до цього розділу, або зверніться до служби підтримки. </String>
448 <String Id="Error1402" Overridable="yes">Не вдалося відкрити розділ: [2]. {{ Системна помилка [3].}} Переконайтеся, що у вас достатньо прав для доступу до цього розділу, або зверніться до служби підтримки. </String>
449 <String Id="Error1403" Overridable="yes">Не вдалося видалити значення [2] з розділу [3]. {{ Системна помилка [4].}} Переконайтеся, що у вас достатньо прав для доступу до цього розділу, або зверніться до служби підтримки. </String>
450 <String Id="Error1404" Overridable="yes">Не вдалося видалити розділ [2]. {{ Системна помилка [3].}} Переконайтеся, що у вас достатньо прав для доступу до цього розділу, або зверніться до служби підтримки. </String>
451 <String Id="Error1405" Overridable="yes">Не вдалося прочитати значення [2] з розділу [3]. {{ Системна помилка [4].}} Переконайтеся, що у вас достатньо прав для доступу до цього розділу, або зверніться до служби підтримки. </String>
452 <String Id="Error1406" Overridable="yes">Не вдалося записати значення [2] до розділу [3]. {{ Системна помилка [4].}} Переконайтеся, що у вас достатньо прав для доступу до цього розділу, або зверніться до служби підтримки.</String>
453 <String Id="Error1407" Overridable="yes">Не вдалося отримати імена значень для розділу [2]. {{ Системна помилка [3].}} Переконайтеся, що у вас достатньо прав для доступу до цього розділу, або зверніться до служби підтримки.</String>
454 <String Id="Error1408" Overridable="yes">Не вдалося отримати імена підрозділів для розділу [2]. {{ Системна помилка [3].}} Переконайтеся, що у вас достатньо прав для доступу до цього розділу, або зверніться до служби підтримки.</String>
455 <String Id="Error1409" Overridable="yes">Не вдалося прочитати відомості про безпеку для розділу [2]. {{ Системна помилка [3].}} Переконайтеся, що у вас достатньо прав для доступу до цього розділу, або зверніться до служби підтримки.</String>
456 <String Id="Error1410" Overridable="yes">Не вдалося збільшити обсяг вільного місця в реєстрі. Для інсталяції цього застосунку в реєстрі має бути [2] КБ вільного місця.</String>
457 <String Id="Error1500" Overridable="yes">Одночасно триває інший процес інсталяції. Необхідно завершити його, перш ніж продовжити цю інсталяцію.</String>
458 <String Id="Error1501" Overridable="yes">Помилка доступу до захищених даних. Переконайтеся, що інсталятор Windows настроєно правильно, і повторіть інсталяцію.</String>
459 <String Id="Error1502" Overridable="yes">Користувач "[2]" раніше вже починав інсталяцію продукту "[3]". Йому доведеться повторити свій процес інсталяції, щоб мати змогу користуватися продуктом. Зараз продовжиться ваш поточний процес інсталяції.</String>
460 <String Id="Error1503" Overridable="yes">Користувач "[2]" раніше вже починав інсталяцію продукту "[3]". Йому доведеться повторити свій процес інсталяції, щоб мати змогу користуватися продуктом.</String>
461 <String Id="Error1601" Overridable="yes">Бракує місця на диску. Том: "[2]"; потрібно: [3] КБ; доступно: [4] КБ. Звільніть місце на диску й повторіть спробу.</String>
462 <String Id="Error1602" Overridable="yes">Справді скасувати?</String>
463 <String Id="Error1603" Overridable="yes">Файл [2][3] зараз використовується{ в такому процесі: ім’я: [4], ідентифікатор: [5], заголовок вікна: "[6]"}. Закрийте цей застосунок і повторіть спробу.</String>
464 <String Id="Error1604" Overridable="yes">Уже інстальовано продукт "[2]", несумісний із цим продуктом.</String>
465 <String Id="Error1605" Overridable="yes">У томі "[2]" бракує вільного місця для продовження інсталяції з увімкнутим відновленням. Потрібно [3] КБ, доступно лише [4] КБ. Щоб продовжити інсталяцію без збереження відомостей про відновлення, натисніть кнопку "Пропустити". Щоб знову перевірити обсяг вільного дискового простору, натисніть кнопку "Повторити". Щоб вийти із програми інсталяції, натисніть кнопку "Скасувати".</String>
466 <String Id="Error1606" Overridable="yes">Мережна папка "[2]" недоступна.</String>
467 <String Id="Error1607" Overridable="yes">Для продовження інсталяції необхідно закрити такі застосунки:</String>
468 <String Id="Error1608" Overridable="yes">Не вдалося знайти інстальовані на комп’ютері сумісні продукти для інсталяції цього продукту.</String>
469 <String Id="Error1609" Overridable="yes">Сталася помилка під час застосування настройок безпеки. [2] є неприпустимим користувачем або групою. Можливо, сталася помилка пакета або помилка підключення до контролера домену мережі. Перевірте підключення до мережі й натисніть кнопку "Повторити". Щоб завершити інсталяцію, натисніть кнопку "Скасувати". {{Не вдалося знайти ідентифікатор SID користувача; системна помилка [3]}}</String>
470 <String Id="Error1701" Overridable="yes">Розділ "[2]" неприпустимий. Переконайтеся, що введено правильний розділ.</String>
471 <String Id="Error1702" Overridable="yes">Перед продовженням настроювання [2] інсталятору необхідно перезавантажити систему. Для негайного перезавантаження натисніть кнопку "Так". Щоб пізніше перезавантажити систему вручну, натисніть кнопку "Ні".</String>
472 <String Id="Error1703" Overridable="yes">Щоб внесені до конфігурації [2] зміни набрали сили, необхідно перезавантажити систему. Для негайного перезавантаження натисніть кнопку "Так". Щоб пізніше перезавантажити систему вручну, натисніть кнопку "Ні".</String>
473 <String Id="Error1704" Overridable="yes">Інсталяцію програми [2] наразі призупинено. Щоб продовжити, необхідно скасувати зміни, внесені під час цієї інсталяції. Скасувати ці зміни?</String>
474 <String Id="Error1705" Overridable="yes">Не завершено попередню інсталяцію програми. Щоб продовжити, необхідно скасувати зміни, внесені під час цієї інсталяції. Скасувати ці зміни?</String>
475 <String Id="Error1706" Overridable="yes">Не вдалося знайти пакет інсталяції для продукту [2]. Повторіть інсталяцію за допомогою дійсної копії пакета інсталяції "[3]".</String>
476 <String Id="Error1707" Overridable="yes">Інсталяцію успішно завершено.</String>
477 <String Id="Error1708" Overridable="yes">Помилка інсталяції.</String>
478 <String Id="Error1709" Overridable="yes">Продукт: [2] -- [3]</String>
479 <String Id="Error1710" Overridable="yes">Можна повернути комп’ютер до попереднього стану або продовжити інсталяцію згодом. Відновити попередній стан?</String>
480 <String Id="Error1711" Overridable="yes">Сталася помилка під час записування на диск відомостей про інсталяцію. Перевірте, чи достатньо місця на диску, і натисніть кнопку "Повторити", або натисніть кнопку "Скасувати", щоб завершити інсталяцію.</String>
481 <String Id="Error1712" Overridable="yes">Не вдалося знайти принаймні один файл, необхідний для відновлення попереднього стану комп’ютера. Відновлення неможливе.</String>
482 <String Id="Error1713" Overridable="yes">[2] не вдалося інсталювати один із потрібних продуктів. Зверніться до групи технічної підтримки. {{Системна помилка: [3].}}</String>
483 <String Id="Error1714" Overridable="yes">Стару версію [2] не можна видалити. Зверніться до групи технічної підтримки. {{Системна помилка [3].}}</String>
484 <String Id="Error1715" Overridable="yes">Інстальовано [2]</String>
485 <String Id="Error1716" Overridable="yes">Настроєно [2]</String>
486 <String Id="Error1717" Overridable="yes">Видалено [2]</String>
487 <String Id="Error1718" Overridable="yes">Файл [2] відхилено за політикою цифрового підпису.</String>
488 <String Id="Error1719" Overridable="yes">Служба інсталятора Windows недоступна. Це може статися, якщо Windows запущено в безпечному режимі або інсталятор Windows інстальовано неправильно. Зверніться по допомогу до служби підтримки.</String>
489 <String Id="Error1720" Overridable="yes">Сталася помилка пакета інсталятора Windows. Не вдалося запустити сценарій, потрібний для завершення цієї інсталяції. Зверніться до служби підтримки або постачальника пакета. {{Додаткова дія [2], помилка сценарію [3], [4]: [5] рядок [6], стовпець [7], [8] }}</String>
490 <String Id="Error1721" Overridable="yes">Сталася помилка пакета інсталятора Windows. Не вдалося запустити програму, потрібну для завершення цієї інсталяції. Зверніться до служби підтримки або постачальника пакета. {{Дія: [2], розташування: [3], команда: [4] }}</String>
491 <String Id="Error1722" Overridable="yes">Сталася помилка пакета інсталятора Windows. Програма, запущена у складі програми інсталяції, неправильно завершила роботу. Зверніться до служби підтримки або постачальника пакета. {{Дія [2], розташування: [3], команда: [4] }}</String>
492 <String Id="Error1723" Overridable="yes">Сталася помилка пакета інсталятора Windows. Не вдалося запустити бібліотеку DLL, потрібну для завершення цієї інсталяції. Зверніться до служби підтримки або постачальника пакета. {{Дія [2], елемент: [3], бібліотека: [4] }}</String>
493 <String Id="Error1724" Overridable="yes">Видалення успішно виконано.</String>
494 <String Id="Error1725" Overridable="yes">Помилка видалення.</String>
495 <String Id="Error1726" Overridable="yes">Оголошення успішно завершено.</String>
496 <String Id="Error1727" Overridable="yes">Помилка оголошення.</String>
497 <String Id="Error1728" Overridable="yes">Настроювання успішно завершено.</String>
498 <String Id="Error1729" Overridable="yes">Помилка настроювання.</String>
499 <String Id="Error1730" Overridable="yes">Для видалення цього застосунку необхідні права адміністратора. Щоб видалити цей застосунок, ввійдіть до системи із правами адміністратора або зверніться по допомогу до групи технічної підтримки.</String>
500 <String Id="Error1731" Overridable="yes">Вихідний пакет інсталяції для продукту [2] не синхронізовано з пакетом клієнта. Повторіть інсталяцію за допомогою дійсної копії пакета інсталяції "[3]".</String>
501 <String Id="Error1732" Overridable="yes">Щоб завершити інсталяцію [2], необхідно перезавантажити комп’ютер. Інші користувачі не вишли із системи, і внаслідок перезавантаження вони можуть втратити результати своєї роботи. Перезавантажити зараз?</String>
502 <String Id="Error1801" Overridable="yes">Неприпустимий шлях "[2]". Укажіть правильний шлях.</String>
503 <String Id="Error1802" Overridable="yes">Бракує пам’яті. Закрийте інші застосунки та повторіть спробу.</String>
504 <String Id="Error1803" Overridable="yes">У пристрої [2] немає диска. Вставте диск і натисніть кнопку "Повторити" або натисніть кнопку "Скасувати", щоб повернутися до вибраного раніше тому.</String>
505 <String Id="Error1804" Overridable="yes">У пристрої [2] немає диска. Вставте диск і натисніть кнопку "Повторити" або натисніть кнопку "Скасувати", щоб повернутися до вікна перегляду папок і вибрати інший том.</String>
506 <String Id="Error1805" Overridable="yes">Папка "[2]" не існує. Введіть шлях до наявної папки.</String>
507 <String Id="Error1806" Overridable="yes">У вас недостатньо прав для читання цієї папки.</String>
508 <String Id="Error1807" Overridable="yes">Не вдалося визначити припустиму папку призначення для інсталяції.</String>
509 <String Id="Error1901" Overridable="yes">Сталася помилка під час спроби читання з вихідної бази даних інсталяції: [2].</String>
510 <String Id="Error1902" Overridable="yes">Планування операції перезавантаження: перейменування файлу [2] на [3]. Для завершення операції потрібне перезавантаження.</String>
511 <String Id="Error1903" Overridable="yes">Планування операції перезавантаження: видалення файлу [2]. Для завершення операції потрібне перезавантаження.</String>
512 <String Id="Error1904" Overridable="yes">Не вдалося зареєструвати модуль [2]. HRESULT [3]. Зверніться до служби підтримки.</String>
513 <String Id="Error1905" Overridable="yes">Не вдалося скасувати реєстрацію модуля [2]. HRESULT [3]. Зверніться до служби підтримки.</String>
514 <String Id="Error1906" Overridable="yes">Не вдалося виконати кешування пакета [2]. Помилка: [3]. Зверніться до служби підтримки.</String>
515 <String Id="Error1907" Overridable="yes">Не вдалося зареєструвати шрифт "[2]". Переконайтеся, що ви маєте достатні дозволи на інсталяцію шрифтів, а система підтримує цей шрифт.</String>
516 <String Id="Error1908" Overridable="yes">Не вдалося скасувати реєстрацію шрифту "[2]". Переконайтеся, що ви маєте достатні дозволи на видалення шрифтів.</String>
517 <String Id="Error1909" Overridable="yes">Не вдалося створити ярлик [2]. Переконайтеся, що папка призначення існує та доступна.</String>
518 <String Id="Error1910" Overridable="yes">Не вдалося видалити ярлик "[2]". Переконайтеся, що файл ярлика існує та доступний.</String>
519 <String Id="Error1911" Overridable="yes">Не вдалося зареєструвати бібліотеку типів для файлу [2]. Зверніться до служби підтримки.</String>
520 <String Id="Error1912" Overridable="yes">Не вдалося скасувати реєстрацію бібліотеки типів для файлу [2]. Зверніться до служби підтримки.</String>
521 <String Id="Error1913" Overridable="yes">Не вдалося оновити файл INI [2][3]. Переконайтеся, що цей файл існує та доступний.</String>
522 <String Id="Error1914" Overridable="yes">Не вдалося запланувати заміщення файлу [3] файлом [2] під час перезавантаження. Переконайтеся, що у вас є дозвіл на записування до файлу [3].</String>
523 <String Id="Error1915" Overridable="yes">Не вдалося видалити диспетчер драйверів ODBC; помилка ODBC [2]: [3]. Зверніться до служби підтримки.</String>
524 <String Id="Error1916" Overridable="yes">Не вдалося інсталювати диспетчер драйверів ODBC; помилка ODBC [2]: [3]. Зверніться до служби підтримки.</String>
525 <String Id="Error1917" Overridable="yes">Не вдалося видалити драйвер ODBC: [4]; помилка ODBC [2]: [3]. Переконайтеся, що у вас достатньо прав для видалення драйверів ODBC.</String>
526 <String Id="Error1918" Overridable="yes">Не вдалося інсталювати драйвер ODBC: [4]; помилка ODBC [2]: [3]. Переконайтеся, що файл [4] існує та доступний.</String>
527 <String Id="Error1919" Overridable="yes">Не вдалося настроїти джерело даних ODBC: [4]; помилка ODBC [2]: [3]. Переконайтеся, що файл "[4]" існує та доступний.</String>
528 <String Id="Error1920" Overridable="yes">Не вдалося запустити службу "[2]" ([3]). Переконайтеся, що у вас достатньо прав для запуску системних служб.</String>
529 <String Id="Error1921" Overridable="yes">Не вдалося зупинити службу "[2]" ([3]). Переконайтеся, що у вас достатньо прав для зупинення системних служб.</String>
530 <String Id="Error1922" Overridable="yes">Не вдалося видалити службу "[2]" ([3]). Переконайтеся, що у вас достатньо прав для видалення системних служб.</String>
531 <String Id="Error1923" Overridable="yes">Не вдалося інсталювати службу "[2]" ([3]). Переконайтеся, що у вас достатньо прав для інсталяції системних служб.</String>
532 <String Id="Error1924" Overridable="yes">Не вдалося оновити змінну оточення "[2]". Переконайтеся, що у вас достатньо прав для модифікації змінних оточення.</String>
533 <String Id="Error1925" Overridable="yes">У вас недостатньо прав, щоб завершити цю інсталяцію для всіх користувачів комп’ютера. Ввійдіть до системи як адміністратор і повторіть спробу.</String>
534 <String Id="Error1926" Overridable="yes">Не вдалося встановити захист для файлу "[3]". Помилка: [2]. Переконайтеся, що у вас достатньо прав для змінення дозволів безпеки для цього файлу.</String>
535 <String Id="Error1927" Overridable="yes">Служби компонентів (COM+ 1.0) не інстальовано на цьому комп’ютері. Для успішного завершення цієї інсталяції потрібні служби компонентів. Служби компонентів доступні в системі Windows 2000.</String>
536 <String Id="Error1928" Overridable="yes">Помилка реєстрації застосунку COM+. Для отримання додаткових відомостей зверніться до служби підтримки.</String>
537 <String Id="Error1929" Overridable="yes">Помилка скасування реєстрації застосунку COM+. Для отримання додаткових відомостей зверніться до служби підтримки.</String>
538 <String Id="Error1930" Overridable="yes">Не вдалося змінити опис для служби "[2]" ([3]).</String>
539 <String Id="Error1931" Overridable="yes">Інсталятору Windows не вдалося оновити системний файл [2], оскільки його захищає система Windows. Можливо, для належної роботи програми слід оновити операційну систему. {{Версія пакета: [3], захищена операційною системою версія: [4]}}</String>
540 <String Id="Error1932" Overridable="yes">Інсталятору Windows не вдалося оновити файл [2], захищений системою Windows. {{Версія пакета: [3], захищена операційною системою версія: [4], помилка SFP: [5]}}</String>
541 <String Id="Error1933" Overridable="yes">Інсталятору Windows не вдалося оновити принаймні один файл, захищений системою Windows. {{Помилка SFP: [2]. Перелік захищених файлів:\r\n[3]}}</String>
542 <String Id="Error1934" Overridable="yes">Інсталяції користувачів заборонено за політикою цього комп’ютера.</String>
543 <String Id="Error1935" Overridable="yes">Під час інсталяції складання "[6]" сталася помилка. Для отримання додаткових відомостей зверніться до довідки та служби підтримки. HRESULT: [3]. {{інтерфейс складання: [4], функція: [5], компонент: [2]}}</String>
544 <String Id="Error1936" Overridable="yes">Під час інсталяції складання "[6]" сталася помилка. Складання не має належного імені або не підписане ключем мінімальної довжини. HRESULT: [3]. {{інтерфейс складання: [4], функція: [5], компонент: [2]}}</String>
545 <String Id="Error1937" Overridable="yes">Під час інсталяції складання "[6]" сталася помилка. Підпис або каталог неприпустимі, чи їх не вдалося перевірити. HRESULT: [3]. {{інтерфейс складання: [4], функція: [5], компонент: [2]}}</String>
546 <String Id="Error1938" Overridable="yes">Під час інсталяції складання "[6]" сталася помилка. Не вдалося знайти принаймні один модуль складання. HRESULT: [3]. {{інтерфейс складання: [4], функція: [5], компонент: [2]}}</String>
547
548 <String Id="UITextbytes" Overridable="yes">байт</String>
549 <String Id="UITextGB" Overridable="yes">ГБ</String>
550 <String Id="UITextKB" Overridable="yes">КБ</String>
551 <String Id="UITextMB" Overridable="yes">МБ</String>
552 <String Id="UITextMenuAbsent" Overridable="yes">Увесь компонент буде недоступний</String>
553 <String Id="UITextMenuAdvertise" Overridable="yes">Увесь компонент буде інстальовано за потреби</String>
554 <String Id="UITextMenuAllCD" Overridable="yes">Увесь компонент буде інстальовано для запуску з компакт-диска</String>
555 <String Id="UITextMenuAllLocal" Overridable="yes">Увесь компонент буде інстальовано на локальний жорсткий диск</String>
556 <String Id="UITextMenuAllNetwork" Overridable="yes">Увесь компонент буде інстальовано для запуску з мережі</String>
557 <String Id="UITextMenuCD" Overridable="yes">Буде інстальовано для запуску з компакт-диска</String>
558 <String Id="UITextMenuLocal" Overridable="yes">Буде інстальовано на локальний жорсткий диск</String>
559 <String Id="UITextMenuNetwork" Overridable="yes">Буде інстальовано для запуску з мережі</String>
560 <String Id="UITextNewFolder" Overridable="yes">Папка|Нова папка</String>
561 <String Id="UITextScriptInProgress" Overridable="yes">Триває збирання потрібних даних...</String>
562 <String Id="UITextSelAbsentAbsent" Overridable="yes">Цей компонент не буде інстальовано</String>
563 <String Id="UITextSelAbsentAdvertise" Overridable="yes">Цей компонент буде настроєно для інсталяції в разі потреби</String>
564 <String Id="UITextSelAbsentCD" Overridable="yes">Цей компонент буде інстальовано для запуску з компакт-диска</String>
565 <String Id="UITextSelAbsentLocal" Overridable="yes">Цей компонент буде інстальовано на локальний жорсткий диск</String>
566 <String Id="UITextSelAbsentNetwork" Overridable="yes">Цей компонент буде інстальовано для запуску з мережі</String>
567 <String Id="UITextSelAdvertiseAbsent" Overridable="yes">Цей компонент стане недоступний</String>
568 <String Id="UITextSelAdvertiseAdvertise" Overridable="yes">Буде інстальовано в разі потреби</String>
569 <String Id="UITextSelAdvertiseCD" Overridable="yes">Цей компонент буде доступний для запуску з компакт-диска</String>
570 <String Id="UITextSelAdvertiseLocal" Overridable="yes">Цей компонент буде інстальовано на локальний жорсткий диск</String>
571 <String Id="UITextSelAdvertiseNetwork" Overridable="yes">Цей компонент буде доступний для запуску з мережі</String>
572 <String Id="UITextSelCDAbsent" Overridable="yes">Цей компонент буде повністю видалено, його не можна буде запустити з компакт-диска</String>
573 <String Id="UITextSelCDAdvertise" Overridable="yes">Для цього компонента запуск із компакт-диска буде замінено на інсталяцію в разі потреби</String>
574 <String Id="UITextSelCDCD" Overridable="yes">Цей компонент залишиться доступний для запуску з компакт-диска</String>
575 <String Id="UITextSelCDLocal" Overridable="yes">Для цього компонента запуск із компакт-диска буде замінено на інсталяцію на локальний жорсткий диск</String>
576 <String Id="UITextSelChildCostNeg" Overridable="yes">Цей компонент звільняє [1] на жорсткому диску.</String>
577 <String Id="UITextSelChildCostPos" Overridable="yes">Для цього компонента потрібно [1] на жорсткому диску.</String>
578 <String Id="UITextSelCostPending" Overridable="yes">Триває обчислення місця для компонента...</String>
579 <String Id="UITextSelLocalAbsent" Overridable="yes">Цей компонент буде повністю видалено</String>
580 <String Id="UITextSelLocalAdvertise" Overridable="yes">Цей компонент буде видалено з локального жорсткого диска, але настроєно для інсталяції в разі потреби</String>
581 <String Id="UITextSelLocalCD" Overridable="yes">Компонент буде видалено з локального жорсткого диска, але він залишиться доступним для запуску з компакт-диска</String>
582 <String Id="UITextSelLocalLocal" Overridable="yes">Цей компонент залишиться на локальному жорсткому диску</String>
583 <String Id="UITextSelLocalNetwork" Overridable="yes">Компонент буде видалено з локального жорсткого диска, але він залишиться доступним для запуску з мережі</String>
584 <String Id="UITextSelNetworkAbsent" Overridable="yes">Компонент буде повністю видалено, його неможливо буде запустити з мережі</String>
585 <String Id="UITextSelNetworkAdvertise" Overridable="yes">Для цього компонента запуск з мережі буде замінено на інсталяцію в разі потреби</String>
586 <String Id="UITextSelNetworkLocal" Overridable="yes">Для цього компонента запуск із мережі буде замінено на інсталяцію на локальний жорсткий диск</String>
587 <String Id="UITextSelNetworkNetwork" Overridable="yes">Цей компонент залишиться доступний для запуску з мережі</String>
588 <String Id="UITextSelParentCostNegNeg" Overridable="yes">Цей компонент звільняє [1] на жорсткому диску. Вибрано [2] з [3] його частин. Ці частини звільняють [4] на жорсткому диску.</String>
589 <String Id="UITextSelParentCostNegPos" Overridable="yes">Компонент звільняє [1] на жорсткому диску. Вибрано [2] з [3] його частин. Разом вони потребують [4] на жорсткому диску.</String>
590 <String Id="UITextSelParentCostPosNeg" Overridable="yes">Для цього компонента потрібно [1] на жорсткому диску. Вибрано [2] з [3] його частин. Разом вони звільнять [4] на жорсткому диску.</String>
591 <String Id="UITextSelParentCostPosPos" Overridable="yes">Для цього компонента потрібно [1] на жорсткому диску. Вибрано [2] з [3] його частин. Разом вони потребують [4] на жорсткому диску.</String>
592 <String Id="UITextTimeRemaining" Overridable="yes">Залишилось часу: {[1] хв. }{[2] сек.}</String>
593 <String Id="UITextVolumeCostAvailable" Overridable="yes">Доступно</String>
594 <String Id="UITextVolumeCostDifference" Overridable="yes">Різниця</String>
595 <String Id="UITextVolumeCostRequired" Overridable="yes">Обов’язково</String>
596 <String Id="UITextVolumeCostSize" Overridable="yes">Розмір диска</String>
597 <String Id="UITextVolumeCostVolume" Overridable="yes">Обсяг</String>
598</WixLocalization>
diff --git a/src/ext/UI/wixlib/WixUI_zh-CN.wxl b/src/ext/UI/wixlib/WixUI_zh-CN.wxl
new file mode 100644
index 00000000..b9efadda
--- /dev/null
+++ b/src/ext/UI/wixlib/WixUI_zh-CN.wxl
@@ -0,0 +1,598 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3
4
5<WixLocalization Culture="zh-cn" Codepage="936" xmlns="http://wixtoolset.org/schemas/v4/wxl">
6 <String Id="WixUIBack" Overridable="yes">上一步(&amp;B)</String>
7 <String Id="WixUINext" Overridable="yes">下一步(&amp;N)</String>
8 <String Id="WixUICancel" Overridable="yes">取消</String>
9 <String Id="WixUIFinish" Overridable="yes">完成(&amp;F)</String>
10 <String Id="WixUIRetry" Overridable="yes">重试(&amp;R)</String>
11 <String Id="WixUIIgnore" Overridable="yes">忽略(&amp;I)</String>
12 <String Id="WixUIYes" Overridable="yes">是(&amp;Y)</String>
13 <String Id="WixUINo" Overridable="yes">否(&amp;N)</String>
14 <String Id="WixUIOK" Overridable="yes">确定</String>
15 <String Id="WixUIPrint" Overridable="yes">打印(&amp;P)</String>
16
17 <String Id="AdvancedWelcomeEulaDlg_Title" Overridable="yes">[ProductName] 安装程序</String>
18 <String Id="AdvancedWelcomeEulaDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
19 <String Id="AdvancedWelcomeEulaDlgTitle" Overridable="yes">{\WixUI_Font_Title}请阅读 [ProductName] 许可协议</String>
20 <String Id="AdvancedWelcomeEulaDlgLicenseAcceptedCheckBox" Overridable="yes">我接受许可协议中的条款(&amp;A)</String>
21 <String Id="AdvancedWelcomeEulaDlgDescriptionPerMachine" Overridable="yes">单击“安装”使用默认选项为所有用户安装本产品。单击“高级”可更改安装选项。</String>
22 <String Id="AdvancedWelcomeEulaDlgDescriptionPerUser" Overridable="yes">单击“安装”使用默认选项仅为您安装本产品。单击“高级”可更改安装选项。</String>
23 <String Id="AdvancedWelcomeEulaDlgInstall" Overridable="yes">安装(&amp;I)</String>
24 <String Id="AdvancedWelcomeEulaDlgAdvanced" Overridable="yes">高级(&amp;D)</String>
25 <String Id="Advanced_Font_Normal_Size" Overridable="yes">8</String>
26 <String Id="Advanced_Font_Bigger_Size" Overridable="yes">12</String>
27 <String Id="Advanced_Font_Title_Size" Overridable="yes">9</String>
28 <String Id="Advanced_Font_Emphasized_Size" Overridable="yes">8</String>
29 <String Id="Advanced_Font_FaceName" Overridable="yes">宋体</String>
30
31 <String Id="BrowseDlg_Title" Overridable="yes">[ProductName] 安装程序</String>
32 <String Id="BrowseDlgComboLabel" Overridable="yes">查找范围(&amp;L):</String>
33 <String Id="BrowseDlgWixUI_Bmp_Up" Overridable="yes">WixUI_Bmp_Up</String>
34 <String Id="BrowseDlgWixUI_Bmp_UpTooltip" Overridable="yes">向上一级</String>
35 <String Id="BrowseDlgNewFolder" Overridable="yes">WixUI_Bmp_New</String>
36 <String Id="BrowseDlgNewFolderTooltip" Overridable="yes">新建文件夹</String>
37 <String Id="BrowseDlgPathLabel" Overridable="yes">文件夹名称(&amp;F):</String>
38 <String Id="BrowseDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
39 <String Id="BrowseDlgDescription" Overridable="yes">浏览到目标文件夹</String>
40 <String Id="BrowseDlgTitle" Overridable="yes">{\WixUI_Font_Title}更改目标文件夹</String>
41
42 <String Id="CancelDlg_Title" Overridable="yes">[ProductName] 安装程序</String>
43 <String Id="CancelDlgText" Overridable="yes">是否确实要取消安装 [ProductName]?</String>
44 <String Id="CancelDlgIcon" Overridable="yes">WixUI_Ico_Info</String>
45 <String Id="CancelDlgIconTooltip" Overridable="yes">信息图标</String>
46
47 <String Id="CustomizeDlg_Title" Overridable="yes">[ProductName] 安装程序</String>
48 <String Id="CustomizeDlgTree" Overridable="yes">选择树</String>
49 <String Id="CustomizeDlgBrowse" Overridable="yes">浏览(&amp;R)...</String>
50 <String Id="CustomizeDlgReset" Overridable="yes">重置(&amp;S)</String>
51 <String Id="CustomizeDlgDiskCost" Overridable="yes">磁盘使用情况(&amp;U)</String>
52 <String Id="CustomizeDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
53 <String Id="CustomizeDlgText" Overridable="yes">单击下面树中的图标可更改功能的安装方式。</String>
54 <String Id="CustomizeDlgDescription" Overridable="yes">选择所需的功能安装方式。</String>
55 <String Id="CustomizeDlgTitle" Overridable="yes">{\WixUI_Font_Title}自定义安装</String>
56 <String Id="CustomizeDlgItemDescription" Overridable="yes">CustomizeDlgItemDescription-CustomizeDlgItemDescription</String>
57 <String Id="CustomizeDlgItemSize" Overridable="yes">CustomizeDlgItemSize-CustomizeDlgItemSize</String>
58 <String Id="CustomizeDlgLocation" Overridable="yes">CustomizeDlgLocation-CustomizeDlgLocation</String>
59 <String Id="CustomizeDlgLocationLabel" Overridable="yes">位置:</String>
60
61 <String Id="DiskCostDlg_Title" Overridable="yes">[ProductName] 安装程序</String>
62 <String Id="DiskCostDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
63 <String Id="DiskCostDlgText" Overridable="yes">突出显示的卷没有足够的磁盘空间用于所选功能。您可以从突出显示的卷中删除一些文件,安装较少的功能,或者选择其他目标驱动器。</String>
64 <String Id="DiskCostDlgDescription" Overridable="yes">安装选择的功能所需的磁盘空间。</String>
65 <String Id="DiskCostDlgTitle" Overridable="yes">{\WixUI_Font_Title}磁盘空间要求</String>
66 <String Id="DiskCostDlgVolumeList" Overridable="yes">{120}{70}{70}{70}{70}</String>
67
68 <String Id="ErrorDlg_Title" Overridable="yes">[ProductName] 安装程序</String>
69 <String Id="ErrorDlgErrorText" Overridable="yes">信息文本</String>
70 <String Id="ErrorDlgErrorIcon" Overridable="yes">WixUI_Ico_Info</String>
71 <String Id="ErrorDlgErrorIconTooltip" Overridable="yes">信息图标</String>
72
73 <String Id="ExitDialog_Title" Overridable="yes">[ProductName] 安装程序</String>
74 <String Id="ExitDialogBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
75 <String Id="ExitDialogDescription" Overridable="yes">单击“完成”按钮退出安装向导。</String>
76 <String Id="ExitDialogTitle" Overridable="yes">{\WixUI_Font_Bigger}[ProductName] 安装向导已完成</String>
77
78 <String Id="FatalError_Title" Overridable="yes">[ProductName] 安装程序</String>
79 <String Id="FatalErrorBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
80 <String Id="FatalErrorTitle" Overridable="yes">{\WixUI_Font_Bigger}[ProductName] 安装向导提前结束</String>
81 <String Id="FatalErrorDescription1" Overridable="yes">由于发生错误,[ProductName] 安装向导提前结束。您的系统尚未修改。若要稍后安装该程序,请再次运行安装向导。</String>
82 <String Id="FatalErrorDescription2" Overridable="yes">单击“完成”按钮退出安装向导。</String>
83
84 <String Id="FeaturesDlg_Title" Overridable="yes">[ProductName] 安装程序</String>
85 <String Id="FeaturesDlgTree" Overridable="yes">产品功能</String>
86 <String Id="FeaturesDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
87 <String Id="FeaturesDlgDescription" Overridable="yes">选择所需的功能安装方式。</String>
88 <String Id="FeaturesDlgTitle" Overridable="yes">{\WixUI_Font_Title}产品功能</String>
89 <String Id="FeaturesDlgItemDescription" Overridable="yes">FeaturesDlgItemDescription</String>
90 <String Id="FeaturesDlgItemSize" Overridable="yes">FeaturesDlgItemSize</String>
91 <String Id="FeaturesDlgInstall" Overridable="yes">安装(&amp;I)</String>
92 <String Id="FeaturesDlgChange" Overridable="yes">更改(&amp;C)</String>
93
94 <String Id="FilesInUse_Title" Overridable="yes">[ProductName] 安装程序</String>
95 <String Id="FilesInUseExit" Overridable="yes">退出(&amp;X)</String>
96 <String Id="FilesInUseBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
97 <String Id="FilesInUseText" Overridable="yes">以下应用程序正在使用需要通过此安装程序更新的文件。请关闭这些应用程序,然后单击“重试”继续安装,或单击“退出”退出安装(&amp;R)。</String>
98 <String Id="FilesInUseDescription" Overridable="yes">一些需要更新的文件当前正在使用中。</String>
99 <String Id="FilesInUseTitle" Overridable="yes">{\WixUI_Font_Title}使用中的文件</String>
100
101 <String Id="InstallDirDlg_Title" Overridable="yes">[ProductName] 安装程序</String>
102 <String Id="InstallDirDlgChange" Overridable="yes">更改(&amp;C)...</String>
103 <String Id="InstallDirDlgTitle" Overridable="yes">{\WixUI_Font_Title}目标文件夹</String>
104 <String Id="InstallDirDlgDescription" Overridable="yes">单击“下一步”安装到默认文件夹或单击“更改”选择其他位置。</String>
105 <String Id="InstallDirDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
106 <String Id="InstallDirDlgFolderLabel" Overridable="yes">[ProductName] 安装位置:</String>
107
108 <String Id="InstallScopeDlg_Title" Overridable="yes">[ProductName] 安装程序</String>
109 <String Id="InstallScopeDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
110 <String Id="InstallScopeDlgDescription" Overridable="yes">选择安装范围和文件夹</String>
111 <String Id="InstallScopeDlgTitle" Overridable="yes">{\WixUI_Font_Title}安装范围</String>
112 <String Id="InstallScopeDlgPerUser" Overridable="yes">{\WixUI_Font_Emphasized}只为您([LogonUser])安装(&amp;J)</String>
113 <String Id="InstallScopeDlgPerUserDescription" Overridable="yes">[ProductName] 将安装在每用户文件夹中并且仅供您的用户帐户使用。您不需要本地管理员特权。</String>
114 <String Id="InstallScopeDlgNoPerUserDescription" Overridable="yes">[ProductName] 不支持每用户安装。</String>
115 <String Id="InstallScopeDlgPerMachine" Overridable="yes">{\WixUI_Font_Emphasized}为此计算机的所有用户安装(&amp;M)</String>
116 <String Id="InstallScopeDlgPerMachineDescription" Overridable="yes">[ProductName] 默认情况下安装在每计算机文件夹中并且可供所有用户使用。您可以更改默认安装文件夹,并且必须具有本地管理员特权。</String>
117 <String Id="InstallScopeDlgFolderLabel" Overridable="yes">安装文件夹(&amp;F):</String>
118 <String Id="InstallScopeDlgChange" Overridable="yes">更改(&amp;C)...</String>
119
120 <String Id="InvalidDirDlg_Title" Overridable="yes">[ProductName] 安装程序</String>
121 <String Id="InvalidDirDlgText" Overridable="yes">安装目录必须位于本地硬盘驱动器上。</String>
122 <String Id="InvalidDirDlgIcon" Overridable="yes">WixUI_Ico_Info</String>
123 <String Id="InvalidDirDlgIconTooltip" Overridable="yes">信息图标</String>
124
125 <String Id="LicenseAgreementDlg_Title" Overridable="yes">[ProductName] 安装程序</String>
126 <String Id="LicenseAgreementDlgLicenseAcceptedCheckBox" Overridable="yes">我接受许可协议中的条款(&amp;A)</String>
127 <String Id="LicenseAgreementDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
128 <String Id="LicenseAgreementDlgDescription" Overridable="yes">请认真阅读以下许可协议</String>
129 <String Id="LicenseAgreementDlgTitle" Overridable="yes">{\WixUI_Font_Title}最终用户许可协议</String>
130
131 <String Id="MaintenanceTypeDlg_Title" Overridable="yes">[ProductName] 安装程序</String>
132 <String Id="MaintenanceTypeDlgChangeButton" Overridable="yes">更改(&amp;C)</String>
133 <String Id="MaintenanceTypeDlgChangeButtonTooltip" Overridable="yes">更改安装</String>
134 <String Id="MaintenanceTypeDlgRepairButton" Overridable="yes">修复(&amp;P)</String>
135 <String Id="MaintenanceTypeDlgRepairButtonTooltip" Overridable="yes">修复安装</String>
136 <String Id="MaintenanceTypeDlgRemoveButton" Overridable="yes">删除(&amp;R)</String>
137 <String Id="MaintenanceTypeDlgRemoveButtonTooltip" Overridable="yes">删除安装</String>
138 <String Id="MaintenanceTypeDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
139 <String Id="MaintenanceTypeDlgDescription" Overridable="yes">选择希望执行的操作。</String>
140 <String Id="MaintenanceTypeDlgTitle" Overridable="yes">{\WixUI_Font_Title}更改、修复或删除安装</String>
141 <String Id="MaintenanceTypeDlgChangeText" Overridable="yes">允许您更改功能的安装方式。</String>
142 <String Id="MaintenanceTypeDlgChangeDisabledText" Overridable="yes">[ProductName] 没有单独可选的功能。</String>
143 <String Id="MaintenanceTypeDlgRemoveText" Overridable="yes">从您的计算机中删除 [ProductName]。</String>
144 <String Id="MaintenanceTypeDlgRemoveDisabledText" Overridable="yes">[ProductName] 无法删除。</String>
145 <String Id="MaintenanceTypeDlgRepairText" Overridable="yes">通过修复丢失和损坏的文件、快捷方式和注册表项,修复最近安装的软件中的错误。</String>
146 <String Id="MaintenanceTypeDlgRepairDisabledText" Overridable="yes">[ProductName] 无法修复。</String>
147
148 <String Id="MaintenanceWelcomeDlg_Title" Overridable="yes">[ProductName] 安装程序</String>
149 <String Id="MaintenanceWelcomeDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
150 <String Id="MaintenanceWelcomeDlgDescription" Overridable="yes">通过安装向导可以更改在您的计算机上安装 [ProductName] 功能的方式,或将其从您的计算机中删除。单击“下一步”继续,或单击“取消”退出安装向导。</String>
151 <String Id="MaintenanceWelcomeDlgTitle" Overridable="yes">{\WixUI_Font_Bigger}欢迎使用 [ProductName] 安装向导</String>
152
153 <String Id="MsiRMFilesInUse_Title" Overridable="yes">[ProductName] 安装程序</String>
154 <String Id="MsiRMFilesInUseBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
155 <String Id="MsiRMFilesInUseText" Overridable="yes">以下应用程序正在使用此安装程序需要更新的文件。可以让安装向导关闭这些应用程序,稍后再尝试重新启动这些应用程序或重新启动计算机。</String>
156 <String Id="MsiRMFilesInUseDescription" Overridable="yes">一些需要更新的文件当前正在使用中。</String>
157 <String Id="MsiRMFilesInUseTitle" Overridable="yes">{\WixUI_Font_Title}使用中的文件</String>
158 <String Id="MsiRMFilesInUseUseRM" Overridable="yes">关闭应用程序,然后尝试将其重新启动(&amp;C)。</String>
159 <String Id="MsiRMFilesInUseDontUseRM" Overridable="yes">不关闭应用程序。需要重新启动(&amp;D)。</String>
160
161 <String Id="OutOfDiskDlg_Title" Overridable="yes">[ProductName] 安装程序</String>
162 <String Id="OutOfDiskDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
163 <String Id="OutOfDiskDlgText" Overridable="yes">突出显示的卷没有足够的磁盘空间用于安装当前所选功能。您可以从突出显示的卷中删除一些文件,安装较少的功能,或者选择其他目标驱动器。</String>
164 <String Id="OutOfDiskDlgDescription" Overridable="yes">安装所需的磁盘空间超出了可用磁盘空间。</String>
165 <String Id="OutOfDiskDlgTitle" Overridable="yes">{\WixUI_Font_Title}磁盘空间不足</String>
166 <String Id="OutOfDiskDlgVolumeList" Overridable="yes">{120}{70}{70}{70}{70}</String>
167
168 <String Id="OutOfRbDiskDlg_Title" Overridable="yes">[ProductName] 安装程序</String>
169 <String Id="OutOfRbDiskDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
170 <String Id="OutOfRbDiskDlgText" Overridable="yes">突出显示的卷没有足够的磁盘空间用于安装当前所选功能。您可以从突出显示的卷中删除一些文件,安装较少的功能,或者选择其他目标驱动器。</String>
171 <String Id="OutOfRbDiskDlgDescription" Overridable="yes">安装所需的磁盘空间超出了可用磁盘空间。</String>
172 <String Id="OutOfRbDiskDlgTitle" Overridable="yes">{\WixUI_Font_Title}磁盘空间不足</String>
173 <String Id="OutOfRbDiskDlgVolumeList" Overridable="yes">{120}{70}{70}{70}{70}</String>
174 <String Id="OutOfRbDiskDlgText2" Overridable="yes">或者,您可以选择禁用安装程序的回滚功能。禁用回滚功能将在因任何原因中断安装时,阻止安装程序还原计算机的原始状态。如果希望冒险禁用回滚功能,请单击“是”。</String>
175
176 <String Id="PrepareDlg_Title" Overridable="yes">[ProductName] 安装程序</String>
177 <String Id="PrepareDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
178 <String Id="PrepareDlgDescription" Overridable="yes">安装向导正准备指导您完成安装过程,请稍候。</String>
179 <String Id="PrepareDlgTitle" Overridable="yes">{\WixUI_Font_Bigger}欢迎使用 [ProductName] 安装向导</String>
180
181 <String Id="ProgressDlg_Title" Overridable="yes">[ProductName] 安装程序</String>
182 <String Id="ProgressDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
183 <String Id="ProgressDlgTextInstalling" Overridable="yes">安装向导正在安装 [ProductName],请稍候。</String>
184 <String Id="ProgressDlgTitleInstalling" Overridable="yes">{\WixUI_Font_Title}正在安装 [ProductName]</String>
185 <String Id="ProgressDlgTextChanging" Overridable="yes">安装向导正在更改 [ProductName],请稍候。</String>
186 <String Id="ProgressDlgTitleChanging" Overridable="yes">{\WixUI_Font_Title}正在更改 [ProductName]</String>
187 <String Id="ProgressDlgTextRepairing" Overridable="yes">安装向导正在修复 [ProductName],请稍候。</String>
188 <String Id="ProgressDlgTitleRepairing" Overridable="yes">{\WixUI_Font_Title}正在修复 [ProductName]</String>
189 <String Id="ProgressDlgTextRemoving" Overridable="yes">安装向导正在删除 [ProductName],请稍候。</String>
190 <String Id="ProgressDlgTitleRemoving" Overridable="yes">{\WixUI_Font_Title}正在删除 [ProductName]</String>
191 <String Id="ProgressDlgTextUpdating" Overridable="yes">安装向导正在更新 [ProductName],请稍候。</String>
192 <String Id="ProgressDlgTitleUpdating" Overridable="yes">{\WixUI_Font_Title}正在更新 [ProductName]</String>
193 <String Id="ProgressDlgProgressBar" Overridable="yes">安装过程已完成</String>
194 <String Id="ProgressDlgStatusLabel" Overridable="yes">状态:</String>
195
196 <String Id="ResumeDlg_Title" Overridable="yes">[ProductName] 安装程序</String>
197 <String Id="ResumeDlgInstall" Overridable="yes">安装(&amp;I)</String>
198 <String Id="ResumeDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
199 <String Id="ResumeDlgDescription" Overridable="yes">安装向导将在您的计算机上完成 [ProductName] 的安装。请单击“安装”继续,或单击“取消”退出安装向导。</String>
200 <String Id="ResumeDlgTitle" Overridable="yes">{\WixUI_Font_Bigger}正在继续执行 [ProductName] 安装向导</String>
201
202 <String Id="SetupTypeDlg_Title" Overridable="yes">[ProductName] 安装程序</String>
203 <String Id="SetupTypeDlgTypicalButton" Overridable="yes">典型(&amp;T)</String>
204 <String Id="SetupTypeDlgTypicalButtonTooltip" Overridable="yes">典型安装</String>
205 <String Id="SetupTypeDlgCustomButton" Overridable="yes">自定义(&amp;U)</String>
206 <String Id="SetupTypeDlgCustomButtonTooltip" Overridable="yes">自定义安装</String>
207 <String Id="SetupTypeDlgCompleteButton" Overridable="yes">完整(&amp;O)</String>
208 <String Id="SetupTypeDlgCompleteButtonTooltip" Overridable="yes">完整安装</String>
209 <String Id="SetupTypeDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
210 <String Id="SetupTypeDlgTitle" Overridable="yes">{\WixUI_Font_Title}选择安装类型</String>
211 <String Id="SetupTypeDlgDescription" Overridable="yes">选择最符合您需求的安装类型</String>
212 <String Id="SetupTypeDlgTypicalText" Overridable="yes">安装最常用的程序功能。建议大多数用户使用。</String>
213 <String Id="SetupTypeDlgCustomText" Overridable="yes">允许用户选择要安装的程序功能及其安装位置。建议高级用户使用。</String>
214 <String Id="SetupTypeDlgCompleteText" Overridable="yes">将安装所有程序功能。需要最多磁盘空间。</String>
215
216 <String Id="UserExit_Title" Overridable="yes">[ProductName] 安装程序</String>
217 <String Id="UserExitBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
218 <String Id="UserExitTitle" Overridable="yes">{\WixUI_Font_Bigger}[ProductName] 安装向导中断</String>
219 <String Id="UserExitDescription1" Overridable="yes">[ProductName] 安装程序已中断。您的系统尚未修改。若要稍后安装此程序,请再次运行安装程序。</String>
220 <String Id="UserExitDescription2" Overridable="yes">单击“完成”按钮退出安装向导。</String>
221
222 <String Id="VerifyReadyDlg_Title" Overridable="yes">[ProductName] 安装程序</String>
223 <String Id="VerifyReadyDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
224 <String Id="VerifyReadyDlgInstall" Overridable="yes">安装(&amp;I)</String>
225 <String Id="VerifyReadyDlgInstallText" Overridable="yes">单击“安装”开始安装。单击“上一步”查看或更改任何安装设置。单击“取消”退出向导。</String>
226 <String Id="VerifyReadyDlgInstallTitle" Overridable="yes">{\WixUI_Font_Title}已准备好安装 [ProductName]</String>
227 <String Id="VerifyReadyDlgChange" Overridable="yes">更改(&amp;C)</String>
228 <String Id="VerifyReadyDlgChangeText" Overridable="yes">单击“更改”开始安装。单击“上一步”查看或更改任何安装设置。单击“取消”退出向导。</String>
229 <String Id="VerifyReadyDlgChangeTitle" Overridable="yes">{\WixUI_Font_Title}已准备好更改 [ProductName]</String>
230 <String Id="VerifyReadyDlgRepair" Overridable="yes">修复(&amp;P)</String>
231 <String Id="VerifyReadyDlgRepairText" Overridable="yes">单击“修复”修复 [ProductName] 的安装。单击“上一步”检查或更改任何安装设置。单击“取消”退出向导。</String>
232 <String Id="VerifyReadyDlgRepairTitle" Overridable="yes">{\WixUI_Font_Title}已准备好修复 [ProductName]</String>
233 <String Id="VerifyReadyDlgRemove" Overridable="yes">删除(&amp;R)</String>
234 <String Id="VerifyReadyDlgRemoveText" Overridable="yes">单击“删除”可从计算机上删除 [ProductName]。单击“上一步”检查或更改任何安装设置。单击“取消”退出向导。</String>
235 <String Id="VerifyReadyDlgRemoveTitle" Overridable="yes">{\WixUI_Font_Title}已准备好删除 [ProductName]</String>
236 <String Id="VerifyReadyDlgUpdate" Overridable="yes">更新(&amp;U)</String>
237 <String Id="VerifyReadyDlgUpdateText" Overridable="yes">单击“更新”以更新计算机上的 [ProductName]。单击“上一步”检查或更改任何安装设置。单击“取消”退出向导。</String>
238 <String Id="VerifyReadyDlgUpdateTitle" Overridable="yes">{\WixUI_Font_Title}已准备好更新 [ProductName]</String>
239
240 <String Id="WaitForCostingDlg_Title" Overridable="yes">[ProductName] 安装程序</String>
241 <String Id="WaitForCostingDlgReturn" Overridable="yes">返回(&amp;R)</String>
242 <String Id="WaitForCostingDlgText" Overridable="yes">安装程序正在确定磁盘空间需求,请稍候。</String>
243 <String Id="WaitForCostingDlgIcon" Overridable="yes">WixUI_Ico_Exclam</String>
244 <String Id="WaitForCostingDlgIconTooltip" Overridable="yes">感叹号图标</String>
245
246 <String Id="WelcomeDlg_Title" Overridable="yes">[ProductName] 安装程序</String>
247 <String Id="WelcomeDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
248 <String Id="WelcomeDlgDescription" Overridable="yes">安装向导将在计算机上安装 [ProductName]。单击“下一步”继续,或单击“取消”退出安装向导。</String>
249 <String Id="WelcomeUpdateDlgDescriptionUpdate" Overridable="yes">安装向导将更新您计算机上的 [ProductName]。单击“下一步”继续或单击“取消”退出安装向导。</String>
250 <String Id="WelcomeDlgTitle" Overridable="yes">{\WixUI_Font_Bigger}欢迎使用 [ProductName] 安装向导</String>
251
252 <String Id="WelcomeEulaDlg_Title" Overridable="yes">[ProductName] 安装程序</String>
253 <String Id="WelcomeEulaDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
254 <String Id="WelcomeEulaDlgLicenseAcceptedCheckBox" Overridable="yes">我接受许可协议中的条款(&amp;A)</String>
255 <String Id="WelcomeEulaDlgInstall" Overridable="yes">安装(&amp;I)</String>
256 <String Id="WelcomeEulaDlgUpdate" Overridable="yes">更新(&amp;U)</String>
257 <String Id="WelcomeEulaDlgTitle" Overridable="yes">{\WixUI_Font_Title}请阅读 [ProductName] 许可协议</String>
258
259 <String Id="ProgressTextInstallValidate" Overridable="yes">正在验证安装</String>
260 <String Id="ProgressTextInstallFiles" Overridable="yes">正在复制新文件</String>
261 <String Id="ProgressTextInstallFilesTemplate" Overridable="yes">文件: [1],目录: [9],大小: [6]</String>
262 <String Id="ProgressTextInstallAdminPackage" Overridable="yes">正在复制网络安装文件</String>
263 <String Id="ProgressTextInstallAdminPackageTemplate" Overridable="yes">文件: [1],目录: [9],大小: [6]</String>
264 <String Id="ProgressTextFileCost" Overridable="yes">正在计算空间需求</String>
265 <String Id="ProgressTextCostInitialize" Overridable="yes">正在计算空间需求</String>
266 <String Id="ProgressTextCostFinalize" Overridable="yes">正在计算空间需求</String>
267 <String Id="ProgressTextCreateShortcuts" Overridable="yes">正在创建快捷方式</String>
268 <String Id="ProgressTextCreateShortcutsTemplate" Overridable="yes">快捷方式: [1]</String>
269 <String Id="ProgressTextPublishComponents" Overridable="yes">正在发布合格的组件</String>
270 <String Id="ProgressTextPublishComponentsTemplate" Overridable="yes">组件 ID: [1],限定符: [2]</String>
271 <String Id="ProgressTextPublishFeatures" Overridable="yes">正在发布产品功能</String>
272 <String Id="ProgressTextPublishFeaturesTemplate" Overridable="yes">功能: [1]</String>
273 <String Id="ProgressTextPublishProduct" Overridable="yes">正在发布产品信息</String>
274 <String Id="ProgressTextRegisterClassInfo" Overridable="yes">正在注册类服务器</String>
275 <String Id="ProgressTextRegisterClassInfoTemplate" Overridable="yes">类 ID: [1]</String>
276 <String Id="ProgressTextRegisterExtensionInfo" Overridable="yes">正在注册扩展服务器</String>
277 <String Id="ProgressTextRegisterExtensionInfoTemplate" Overridable="yes">扩展: [1]</String>
278 <String Id="ProgressTextRegisterMIMEInfo" Overridable="yes">正在注册 MIME 信息</String>
279 <String Id="ProgressTextRegisterMIMEInfoTemplate" Overridable="yes">MIME 内容类型: [1],扩展: [2]</String>
280 <String Id="ProgressTextRegisterProgIdInfo" Overridable="yes">正在注册程序标识符</String>
281 <String Id="ProgressTextRegisterProgIdInfoTemplate" Overridable="yes">ProgId: [1]</String>
282 <String Id="ProgressTextAllocateRegistrySpace" Overridable="yes">正在分配注册表空间</String>
283 <String Id="ProgressTextAllocateRegistrySpaceTemplate" Overridable="yes">可用空间: [1]</String>
284 <String Id="ProgressTextAppSearch" Overridable="yes">正在搜索已安装的应用程序</String>
285 <String Id="ProgressTextAppSearchTemplate" Overridable="yes">属性: [1],签名: [2]</String>
286 <String Id="ProgressTextBindImage" Overridable="yes">正在绑定可执行文件</String>
287 <String Id="ProgressTextBindImageTemplate" Overridable="yes">文件: [1]</String>
288 <String Id="ProgressTextCCPSearch" Overridable="yes">正在搜索合格的产品</String>
289 <String Id="ProgressTextCreateFolders" Overridable="yes">正在创建文件夹</String>
290 <String Id="ProgressTextCreateFoldersTemplate" Overridable="yes">文件夹: [1]</String>
291 <String Id="ProgressTextDeleteServices" Overridable="yes">正在删除服务</String>
292 <String Id="ProgressTextDeleteServicesTemplate" Overridable="yes">服务: [1]</String>
293 <String Id="ProgressTextDuplicateFiles" Overridable="yes">正在创建重复文件</String>
294 <String Id="ProgressTextDuplicateFilesTemplate" Overridable="yes">文件: [1],目录: [9],大小: [6]</String>
295 <String Id="ProgressTextFindRelatedProducts" Overridable="yes">正在搜索相关应用程序</String>
296 <String Id="ProgressTextFindRelatedProductsTemplate" Overridable="yes">找到的应用程序: [1]</String>
297 <String Id="ProgressTextInstallODBC" Overridable="yes">正在安装 ODBC 组件</String>
298 <String Id="ProgressTextInstallServices" Overridable="yes">正在安装新服务</String>
299 <String Id="ProgressTextInstallServicesTemplate" Overridable="yes">服务: [2]</String>
300 <String Id="ProgressTextLaunchConditions" Overridable="yes">正在评估启动条件</String>
301 <String Id="ProgressTextMigrateFeatureStates" Overridable="yes">正在从相关应用程序迁移功能状态</String>
302 <String Id="ProgressTextMigrateFeatureStatesTemplate" Overridable="yes">应用程序: [1]</String>
303 <String Id="ProgressTextMoveFiles" Overridable="yes">正在移动文件</String>
304 <String Id="ProgressTextMoveFilesTemplate" Overridable="yes">文件: [1],目录: [9],大小: [6]</String>
305 <String Id="ProgressTextPatchFiles" Overridable="yes">正在修补文件</String>
306 <String Id="ProgressTextPatchFilesTemplate" Overridable="yes">文件: [1],目录: [2],大小: [3]</String>
307 <String Id="ProgressTextProcessComponents" Overridable="yes">正在更新组件注册</String>
308 <String Id="ProgressTextRegisterComPlus" Overridable="yes">正在注册 COM+ 应用程序和组件</String>
309 <String Id="ProgressTextRegisterComPlusTemplate" Overridable="yes">AppId: [1]{{,AppType: [2],用户: [3],RSN: [4]}}</String>
310 <String Id="ProgressTextRegisterFonts" Overridable="yes">正在注册字体</String>
311 <String Id="ProgressTextRegisterFontsTemplate" Overridable="yes">字体: [1]</String>
312 <String Id="ProgressTextRegisterProduct" Overridable="yes">正在注册产品</String>
313 <String Id="ProgressTextRegisterProductTemplate" Overridable="yes">[1]</String>
314 <String Id="ProgressTextRegisterTypeLibraries" Overridable="yes">正在注册类型库</String>
315 <String Id="ProgressTextRegisterTypeLibrariesTemplate" Overridable="yes">库 ID: [1]</String>
316 <String Id="ProgressTextRegisterUser" Overridable="yes">正在注册用户</String>
317 <String Id="ProgressTextRegisterUserTemplate" Overridable="yes">[1]</String>
318 <String Id="ProgressTextRemoveDuplicateFiles" Overridable="yes">正在删除重复的文件</String>
319 <String Id="ProgressTextRemoveDuplicateFilesTemplate" Overridable="yes">文件: [1],目录: [9]</String>
320 <String Id="ProgressTextRemoveEnvironmentStrings" Overridable="yes">正在更新环境字符串</String>
321 <String Id="ProgressTextRemoveEnvironmentStringsTemplate" Overridable="yes">名称: [1],值: [2],操作 [3]</String>
322 <String Id="ProgressTextRemoveExistingProducts" Overridable="yes">正在删除应用程序</String>
323 <String Id="ProgressTextRemoveExistingProductsTemplate" Overridable="yes">应用程序: [1],命令行: [2]</String>
324 <String Id="ProgressTextRemoveFiles" Overridable="yes">正在删除文件</String>
325 <String Id="ProgressTextRemoveFilesTemplate" Overridable="yes">文件: [1],目录: [9]</String>
326 <String Id="ProgressTextRemoveFolders" Overridable="yes">正在删除文件夹</String>
327 <String Id="ProgressTextRemoveFoldersTemplate" Overridable="yes">文件夹: [1]</String>
328 <String Id="ProgressTextRemoveIniValues" Overridable="yes">正在删除 INI 文件条目</String>
329 <String Id="ProgressTextRemoveIniValuesTemplate" Overridable="yes">文件: [1],节: [2],项: [3],值: [4]</String>
330 <String Id="ProgressTextRemoveODBC" Overridable="yes">正在删除 ODBC 组件</String>
331 <String Id="ProgressTextRemoveRegistryValues" Overridable="yes">正在删除系统注册表值</String>
332 <String Id="ProgressTextRemoveRegistryValuesTemplate" Overridable="yes">项: [1],名称: [2]</String>
333 <String Id="ProgressTextRemoveShortcuts" Overridable="yes">正在删除快捷方式</String>
334 <String Id="ProgressTextRemoveShortcutsTemplate" Overridable="yes">快捷方式: [1]</String>
335 <String Id="ProgressTextRMCCPSearch" Overridable="yes">正在搜索合格的产品</String>
336 <String Id="ProgressTextSelfRegModules" Overridable="yes">正在注册模块</String>
337 <String Id="ProgressTextSelfRegModulesTemplate" Overridable="yes">文件: [1],文件夹: [2]</String>
338 <String Id="ProgressTextSelfUnregModules" Overridable="yes">正在撤消模块的注册</String>
339 <String Id="ProgressTextSelfUnregModulesTemplate" Overridable="yes">文件: [1],文件夹: [2]</String>
340 <String Id="ProgressTextSetODBCFolders" Overridable="yes">正在初始化 ODBC 目录</String>
341 <String Id="ProgressTextStartServices" Overridable="yes">正在启动服务</String>
342 <String Id="ProgressTextStartServicesTemplate" Overridable="yes">服务: [1]</String>
343 <String Id="ProgressTextStopServices" Overridable="yes">正在停止服务</String>
344 <String Id="ProgressTextStopServicesTemplate" Overridable="yes">服务: [1]</String>
345 <String Id="ProgressTextUnpublishComponents" Overridable="yes">正在取消合格组件的发布</String>
346 <String Id="ProgressTextUnpublishComponentsTemplate" Overridable="yes">组件 ID: [1],限定符: [2]</String>
347 <String Id="ProgressTextUnpublishFeatures" Overridable="yes">正在取消产品功能的发布</String>
348 <String Id="ProgressTextUnpublishFeaturesTemplate" Overridable="yes">功能: [1]</String>
349 <String Id="ProgressTextUnregisterClassInfo" Overridable="yes">撤消类服务器的注册</String>
350 <String Id="ProgressTextUnregisterClassInfoTemplate" Overridable="yes">类 ID: [1]</String>
351 <String Id="ProgressTextUnregisterComPlus" Overridable="yes">正在撤消 COM+ 应用程序和组件的注册</String>
352 <String Id="ProgressTextUnregisterComPlusTemplate" Overridable="yes">AppId: [1]{{,AppType: [2]}}</String>
353 <String Id="ProgressTextUnregisterExtensionInfo" Overridable="yes">正在撤消扩展服务器的注册</String>
354 <String Id="ProgressTextUnregisterExtensionInfoTemplate" Overridable="yes">扩展: [1]</String>
355 <String Id="ProgressTextUnregisterFonts" Overridable="yes">正在撤消字体的注册</String>
356 <String Id="ProgressTextUnregisterFontsTemplate" Overridable="yes">字体: [1]</String>
357 <String Id="ProgressTextUnregisterMIMEInfo" Overridable="yes">正在撤消 MIME 信息的注册</String>
358 <String Id="ProgressTextUnregisterMIMEInfoTemplate" Overridable="yes">MIME 内容类型: [1],扩展: [2]</String>
359 <String Id="ProgressTextUnregisterProgIdInfo" Overridable="yes">正在撤消程序标识符的注册</String>
360 <String Id="ProgressTextUnregisterProgIdInfoTemplate" Overridable="yes">ProgId: [1]</String>
361 <String Id="ProgressTextUnregisterTypeLibraries" Overridable="yes">正在撤消类型库的注册</String>
362 <String Id="ProgressTextUnregisterTypeLibrariesTemplate" Overridable="yes">库 ID: [1]</String>
363 <String Id="ProgressTextWriteEnvironmentStrings" Overridable="yes">正在更新环境字符串</String>
364 <String Id="ProgressTextWriteEnvironmentStringsTemplate" Overridable="yes">名称: [1],值: [2],操作 [3]</String>
365 <String Id="ProgressTextWriteIniValues" Overridable="yes">正在写入 INI 文件值</String>
366 <String Id="ProgressTextWriteIniValuesTemplate" Overridable="yes">文件: [1],节: [2],项: [3],值: [4]</String>
367 <String Id="ProgressTextWriteRegistryValues" Overridable="yes">正在写入系统注册表值</String>
368 <String Id="ProgressTextWriteRegistryValuesTemplate" Overridable="yes">项: [1],名称: [2],值: [3]</String>
369 <String Id="ProgressTextAdvertise" Overridable="yes">通知应用程序</String>
370 <String Id="ProgressTextGenerateScript" Overridable="yes">正在生成脚本操作,用于:</String>
371 <String Id="ProgressTextGenerateScriptTemplate" Overridable="yes">[1]</String>
372 <String Id="ProgressTextInstallSFPCatalogFile" Overridable="yes">正在安装系统目录</String>
373 <String Id="ProgressTextInstallSFPCatalogFileTemplate" Overridable="yes">文件: [1],依赖项: [2]</String>
374 <String Id="ProgressTextMsiPublishAssemblies" Overridable="yes">正在发布程序集信息</String>
375 <String Id="ProgressTextMsiPublishAssembliesTemplate" Overridable="yes">应用程序环境: [1],程序集名称: [2]</String>
376 <String Id="ProgressTextMsiUnpublishAssemblies" Overridable="yes">正在取消发布程序集信息</String>
377 <String Id="ProgressTextMsiUnpublishAssembliesTemplate" Overridable="yes">应用程序环境: [1],程序集名称: [2]</String>
378 <String Id="ProgressTextRollback" Overridable="yes">正在回滚操作:</String>
379 <String Id="ProgressTextRollbackTemplate" Overridable="yes">[1]</String>
380 <String Id="ProgressTextRollbackCleanup" Overridable="yes">正在删除备份文件</String>
381 <String Id="ProgressTextRollbackCleanupTemplate" Overridable="yes">文件: [1]</String>
382 <String Id="ProgressTextUnmoveFiles" Overridable="yes">正在删除移动过的文件</String>
383 <String Id="ProgressTextUnmoveFilesTemplate" Overridable="yes">文件: [1],目录: [9]</String>
384 <String Id="ProgressTextUnpublishProduct" Overridable="yes">正在取消发布产品信息</String>
385
386 <String Id="Error0" Overridable="yes">{{错误: }}</String>
387 <String Id="Error1" Overridable="yes">{{错误 [1]。}}</String>
388 <String Id="Error2" Overridable="yes">警告 [1]。</String>
389 <String Id="Error4" Overridable="yes">信息 [1]。</String>
390 <String Id="Error5" Overridable="yes">安装程序在安装此软件包时遇到了错误。这可能表示此软件包有问题。错误码是 [1]。{{参数是: [2]、[3]、[4]}}</String>
391 <String Id="Error7" Overridable="yes">{{磁盘已满: }}</String>
392 <String Id="Error8" Overridable="yes">操作 [Time]: [1]。[2]</String>
393 <String Id="Error9" Overridable="yes">[ProductName]</String>
394 <String Id="Error10" Overridable="yes">{[2]}{,[3]}{,[4]}</String>
395 <String Id="Error11" Overridable="yes">消息类型: [1],参数: [2]</String>
396 <String Id="Error12" Overridable="yes">=== 记录开始: [Date] [Time] ===</String>
397 <String Id="Error13" Overridable="yes">=== 记录停止: [Date] [Time] ===</String>
398 <String Id="Error14" Overridable="yes">操作开始 [Time]: [1]。</String>
399 <String Id="Error15" Overridable="yes">操作结束 [Time]: [1]。返回值 [2]。</String>
400 <String Id="Error16" Overridable="yes">剩余时间: {[1] 分 }{[2] 秒}</String>
401 <String Id="Error17" Overridable="yes">内存不足。请先关闭其他应用程序,然后再试。</String>
402 <String Id="Error18" Overridable="yes">安装程序已不再反应。</String>
403 <String Id="Error19" Overridable="yes">安装程序过早停止。</String>
404 <String Id="Error20" Overridable="yes">Windows 正在配置 [ProductName],请稍候</String>
405 <String Id="Error21" Overridable="yes">正在收集所需信息...</String>
406 <String Id="Error22" Overridable="yes">正在删除该应用程序的旧版本...</String>
407 <String Id="Error23" Overridable="yes">正在准备删除该应用程序的旧版本...</String>
408 <String Id="Error32" Overridable="yes">{[ProductName]} 的安装已成功完成。</String>
409 <String Id="Error33" Overridable="yes">{[ProductName]} 安装失败。</String>
410 <String Id="Error1101" Overridable="yes">读取文件 [2] 时出错。{{系统错误 [3]。}}请确认该文件存在,并且您能够访问该文件。</String>
411 <String Id="Error1301" Overridable="yes">无法创建文件“[2]”。具有此名称的目录已经存在。请取消此安装,然后尝试安装到其他位置。</String>
412 <String Id="Error1302" Overridable="yes">请插入磁盘: [2]</String>
413 <String Id="Error1303" Overridable="yes">安装程序没有访问目录 [2] 的足够权限。安装无法继续。请以管理员身份登录,或者联络您的系统管理员。</String>
414 <String Id="Error1304" Overridable="yes">写入文件 [2] 时出错。请确认您有访问该目录的权限。</String>
415 <String Id="Error1305" Overridable="yes">读取文件 [2] 时出错。{{系统错误 [3]。}}请确认该文件存在,并且您能够访问该文件。</String>
416 <String Id="Error1306" Overridable="yes">另一应用程序正在独占访问文件“[2]”。请关闭所有其他应用程序,然后单击“重试”。</String>
417 <String Id="Error1307" Overridable="yes">磁盘空间不足,无法安装文件 [2]。请释放一些磁盘空间,然后单击“重试”,或者单击“取消”退出。</String>
418 <String Id="Error1308" Overridable="yes">找不到源文件: [2]。请确认该文件存在,并且您能够访问该文件。</String>
419 <String Id="Error1309" Overridable="yes">读取文件 [3] 时出错。{{系统错误 [2]。}}请确认该文件存在,并且您能够访问该文件。</String>
420 <String Id="Error1310" Overridable="yes">写入文件 [3] 时出错。{{系统错误 [2]。}}请确认您有访问该目录的权限。</String>
421 <String Id="Error1311" Overridable="yes">找不到源文件 {{(cabinet)}}: [2]。请确认该文件存在,并且您能够访问该文件。</String>
422 <String Id="Error1312" Overridable="yes">无法创建目录“[2]”。已经存在一个同名文件,请重命名或删除该文件,然后单击“重试”,或者单击“取消”退出。</String>
423 <String Id="Error1313" Overridable="yes">目前无法使用卷 [2],请另选其他卷。</String>
424 <String Id="Error1314" Overridable="yes">指定的路径“[2]”不可用。</String>
425 <String Id="Error1315" Overridable="yes">无法写入指定的文件夹: [2]。</String>
426 <String Id="Error1316" Overridable="yes">尝试读取文件 [2] 时发生网络错误</String>
427 <String Id="Error1317" Overridable="yes">尝试创建目录 [2] 时发生错误</String>
428 <String Id="Error1318" Overridable="yes">尝试创建目录 [2] 时发生网络错误</String>
429 <String Id="Error1319" Overridable="yes">尝试打开源文件 Cabinet [2] 时发生网络错误</String>
430 <String Id="Error1320" Overridable="yes">指定的路径过长: [2]</String>
431 <String Id="Error1321" Overridable="yes">安装程序没有修改文件 [2] 的足够权限。</String>
432 <String Id="Error1322" Overridable="yes">文件夹路径“[2]”的一部分无效。该路径或者为空,或者超出了系统允许的长度。</String>
433 <String Id="Error1323" Overridable="yes">文件夹路径“[2]”中含有非法字词。</String>
434 <String Id="Error1324" Overridable="yes">文件夹路径“[2]”中含有非法字符。</String>
435 <String Id="Error1325" Overridable="yes">“[2]”不是有效的短文件名。</String>
436 <String Id="Error1326" Overridable="yes">获取文件安全设置时出错: [3] GetLastError: [2]</String>
437 <String Id="Error1327" Overridable="yes">无效驱动器: [2]</String>
438 <String Id="Error1328" Overridable="yes">对文件 [2] 应用修补程序时出错。可能已采用其他方式进行更新,无法再使用此修补程序进行修改。有关详细信息,请与修补程序供应商联系。{{系统错误: [3]}}</String>
439 <String Id="Error1329" Overridable="yes">由于 CAB 文件 [2] 没有进行数字签名,无法安装所需文件。这可能指示该 CAB 文件已损坏。</String>
440 <String Id="Error1330" Overridable="yes">由于 CAB 文件 [2] 具有无效的数字签名,无法安装所需文件。这可能指示该 CAB 文件已损坏。{{WinVerifyTrust 返回错误 [3]。}}</String>
441 <String Id="Error1331" Overridable="yes">未能正确地复制 [2] 文件: CRC 错误。</String>
442 <String Id="Error1332" Overridable="yes">未能正确地移动 [2] 文件: CRC 错误。</String>
443 <String Id="Error1333" Overridable="yes">未能正确地修补 [2] 文件: CRC 错误。</String>
444 <String Id="Error1334" Overridable="yes">无法安装文件“[2]”,因为在 CAB 文件“[3]”中找不到该文件。这可能表明发生网络错误、在读取 CD-ROM 时出错或者该包存在问题。</String>
445 <String Id="Error1335" Overridable="yes">此安装所需的 CAB 文件“[2]”已损坏,无法使用。这可能表明发生网络错误、在读取 CD-ROM 时出错或者该包存在问题。</String>
446 <String Id="Error1336" Overridable="yes">在创建完成此安装所需的临时文件时出错。{{文件夹: [3]。系统错误代码: [2]}}</String>
447 <String Id="Error1401" Overridable="yes">无法创建注册表项 [2]。{{系统错误 [3]。}}请确保您有足够的权限访问该注册表项,或者与技术支持人员联系。</String>
448 <String Id="Error1402" Overridable="yes">无法打开注册表项 [2]。{{系统错误 [3]。}}请确保您有足够的权限访问该注册表项,或者与技术支持人员联系。</String>
449 <String Id="Error1403" Overridable="yes">无法从注册表项 [3] 删除值 [2]。{{系统错误 [4]。}}请确保您有足够的权限访问该注册表项,或者与技术支持人员联系。</String>
450 <String Id="Error1404" Overridable="yes">无法删除注册表项 [2]。{{系统错误 [3]。}}请确保您有足够的权限访问该注册表项,或者与技术支持人员联系。</String>
451 <String Id="Error1405" Overridable="yes">无法从注册表项 [3] 读取值 [2]。{{系统错误 [4]。}}请确保您有足够的权限访问该注册表项,或者与技术支持人员联系。</String>
452 <String Id="Error1406" Overridable="yes">无法将值 [2] 写入注册表项 [3]。{{系统错误 [4]。}}请确保您有足够的权限访问该注册表项,或者与技术支持人员联系。</String>
453 <String Id="Error1407" Overridable="yes">无法获取注册表项 [2] 的值名称。{{系统错误 [3]。}}请确保您有足够的权限访问该注册表项,或者与技术支持人员联系。</String>
454 <String Id="Error1408" Overridable="yes">无法获取注册表项 [2] 的子项名称。{{系统错误 [3]。}}请确保您有足够的权限访问该注册表项,或者与技术支持人员联系。</String>
455 <String Id="Error1409" Overridable="yes">无法读取注册表项 [2] 的安全信息。{{系统错误 [3]。}}请确保您有足够的权限访问该注册表项,或者与技术支持人员联系。</String>
456 <String Id="Error1410" Overridable="yes">无法增加可用的注册表空间。安装该应用程序需要 [2] KB 的可用注册表空间。</String>
457 <String Id="Error1500" Overridable="yes">另一安装过程正在进行当中。您必须先完成那个安装过程,然后才能继续本次安装过程。</String>
458 <String Id="Error1501" Overridable="yes">访问受保护的数据时出错。请确保 Windows Installer 配置正确,然后重新安装。</String>
459 <String Id="Error1502" Overridable="yes">用户“[2]”以前启动过产品“[3]”的安装。该用户需要再次运行该安装才能使用该产品。您的当前安装现在将继续进行。</String>
460 <String Id="Error1503" Overridable="yes">用户“[2]”以前启动过产品“[3]”的安装。该用户需要再次运行该安装才能使用该产品。您的当前安装现在将继续进行。</String>
461 <String Id="Error1601" Overridable="yes">磁盘空间不足 -- 卷:“[2]”;所需空间: [3] KB;可用空间: [4] KB。请释放一些磁盘空间,然后重试。</String>
462 <String Id="Error1602" Overridable="yes">是否确实要取消?</String>
463 <String Id="Error1603" Overridable="yes">文件 [2][3] 正在使用中 {由以下进程使用: 名称: [4],ID: [5],窗口标题: “[6]”}。请关闭该应用程序,然后重试。</String>
464 <String Id="Error1604" Overridable="yes">产品“[2]”已经安装,现在无法安装本产品。这两种产品不兼容。</String>
465 <String Id="Error1605" Overridable="yes">卷“[2]”上的磁盘空间不足,无法继续安装并启用恢复功能。需要 [3] KB 磁盘空间,但只有 [4] KB 可用空间。请单击“忽略”继续安装但不保存恢复信息,单击“重试”再次检查可用空间,或单击“取消”退出安装。</String>
466 <String Id="Error1606" Overridable="yes">无法访问网络位置 [2]。</String>
467 <String Id="Error1607" Overridable="yes">在继续安装之前,应关闭下列应用程序:</String>
468 <String Id="Error1608" Overridable="yes">对于本产品的安装,未能在计算机上找到任何此前安装的兼容产品。</String>
469 <String Id="Error1609" Overridable="yes">应用安全设置时出错。[2] 不是有效的用户或组。这可能是软件包有问题,或者是连接到网络上的域控制器时出现了连接问题。请检查网络连接,然后单击“重试”,或者单击“取消”结束安装。{{无法找到用户的 SID,系统错误 [3]}}</String>
470 <String Id="Error1701" Overridable="yes">注册表项 [2] 无效。请确保您输入了正确的注册表项。</String>
471 <String Id="Error1702" Overridable="yes">安装程序必须先重新启动您的系统,然后才能继续配置 [2]。单击“是”可立即重新启动,单击“否”可在以后手动重新启动。</String>
472 <String Id="Error1703" Overridable="yes">您必须重新启动系统,对 [2] 进行的配置更改才能生效。单击“是”可立即重新启动,单击“否”可在以后手动重新启动。</String>
473 <String Id="Error1704" Overridable="yes">[2] 的安装正处于暂停状态,您必须先撤消该安装过程所做的更改,然后才能继续操作。是否撤消这些更改?</String>
474 <String Id="Error1705" Overridable="yes">本产品的上一次安装正在进行中。您必须先撤消该安装过程所做的更改,然后才能继续操作。是否撤消这些更改?</String>
475 <String Id="Error1706" Overridable="yes">无法找到产品 [2] 的安装程序包。请尝试使用该安装程序包的有效副本“[3]”重新进行安装。</String>
476 <String Id="Error1707" Overridable="yes">安装成功完成。</String>
477 <String Id="Error1708" Overridable="yes">安装失败。</String>
478 <String Id="Error1709" Overridable="yes">产品: [2] -- [3]</String>
479 <String Id="Error1710" Overridable="yes">您可以将计算机还原到以前的状态,也可以稍后继续安装。是否还原?</String>
480 <String Id="Error1711" Overridable="yes">将安装信息写入磁盘时出错。请进行检查以确保有足够的可用磁盘空间,然后单击“重试”,或者单击“取消”结束安装。</String>
481 <String Id="Error1712" Overridable="yes">未找到将计算机还原到以前状态所需的一个或多个文件。将无法进行还原。</String>
482 <String Id="Error1713" Overridable="yes">[2] 无法安装所需的某个产品。请与技术支持小组联系。{{系统错误: [3]。}}</String>
483 <String Id="Error1714" Overridable="yes">无法删除 [2] 的较早版本。请与技术支持小组联系。{{系统错误 [3]。}}</String>
484 <String Id="Error1715" Overridable="yes">已安装 [2]</String>
485 <String Id="Error1716" Overridable="yes">已配置 [2]</String>
486 <String Id="Error1717" Overridable="yes">已删除 [2]</String>
487 <String Id="Error1718" Overridable="yes">文件 [2] 被数字签名策略拒绝。</String>
488 <String Id="Error1719" Overridable="yes">无法访问 Windows Installer 服务。原因可能是您在安全模式下运行 Windows,或者是 Windows Installer 安装不正确。请与技术支持人员联系以获取帮助。</String>
489 <String Id="Error1720" Overridable="yes">该 Windows Installer 软件包存在问题。完成此安装所需的一个脚本无法运行。请与技术支持人员或软件包供应商联系。{{自定义操作 [2] 脚本错误 [3],[4]: [5] 行 [6],列 [7],[8] }}</String>
490 <String Id="Error1721" Overridable="yes">该 Windows Installer 软件包存在问题。完成此安装所需的一个程序无法运行。请与技术支持人员或软件包供应商联系。{{操作: [2],位置: [3],命令: [4] }}</String>
491 <String Id="Error1722" Overridable="yes">该 Windows Installer 软件包存在问题。作为此安装程序的一部分运行的一个程序未按预期完成。请与技术支持人员或软件包供应商联系。{{操作 [2],位置: [3],命令: [4] }}</String>
492 <String Id="Error1723" Overridable="yes">该 Windows Installer 软件包存在问题。完成此安装所需的一个 DLL 无法运行。请与技术支持人员或软件包供应商联系。{{操作 [2], 条目: [3], 库: [4]}}</String>
493 <String Id="Error1724" Overridable="yes">删除已成功完成。</String>
494 <String Id="Error1725" Overridable="yes">删除失败。</String>
495 <String Id="Error1726" Overridable="yes">广告已成功完成。</String>
496 <String Id="Error1727" Overridable="yes">广告失败。</String>
497 <String Id="Error1728" Overridable="yes">配置已成功完成。</String>
498 <String Id="Error1729" Overridable="yes">配置失败。</String>
499 <String Id="Error1730" Overridable="yes">只有系统管理员才能删除此应用程序。要删除此应用程序,您可以以系统管理员的身份登录,或者与技术支持小组联系,以寻求帮助。</String>
500 <String Id="Error1731" Overridable="yes">产品 [2] 的源安装程序包和客户端的程序包不同步。请使用有效版本的程序包“[3]”来重新尝试安装。</String>
501 <String Id="Error1732" Overridable="yes">为了完成 [2] 的安装,必须重新启动计算机。当前已有其他用户登录到此计算机,重新启动计算机会导致这些用户无法工作。是否要立即重新启动?</String>
502 <String Id="Error1801" Overridable="yes">路径 [2] 无效,请指定一个有效路径。</String>
503 <String Id="Error1802" Overridable="yes">内存不足。请先关闭其他应用程序,然后再试。</String>
504 <String Id="Error1803" Overridable="yes">驱动器 [2] 中没有磁盘。请插入一张磁盘,然后单击“重试”,或者单击“取消”返回到以前选定的卷。</String>
505 <String Id="Error1804" Overridable="yes">驱动器 [2] 中没有磁盘。请插入一张磁盘,然后单击“重试”,或者单击“取消”返回到浏览对话框并选择其他卷。</String>
506 <String Id="Error1805" Overridable="yes">文件夹 [2] 不存在。请输入一个现有文件夹路径。</String>
507 <String Id="Error1806" Overridable="yes">您没有足够的权限,无法读取此文件夹。</String>
508 <String Id="Error1807" Overridable="yes">无法确定有效的安装目标文件夹。</String>
509 <String Id="Error1901" Overridable="yes">尝试读取源安装数据库 [2] 时出错。</String>
510 <String Id="Error1902" Overridable="yes">正在安排重新启动操作: 正在将文件 [2] 重命名为 [3]。只有重新启动后才能完成操作。</String>
511 <String Id="Error1903" Overridable="yes">正在安排重新启动操作: 正在删除文件 [2]。只有重新启动后才能完成操作。</String>
512 <String Id="Error1904" Overridable="yes">模块 [2] 注册失败。HRESULT [3]。请与技术支持人员联系。</String>
513 <String Id="Error1905" Overridable="yes">模块 [2] 注销失败。HRESULT [3]。请与技术支持人员联系。</String>
514 <String Id="Error1906" Overridable="yes">无法缓存软件包 [2]。错误: [3]。请与技术支持人员联系。</String>
515 <String Id="Error1907" Overridable="yes">无法注册字体 [2]。请确保您有足够的权限安装字体,并且系统支持该字体。</String>
516 <String Id="Error1908" Overridable="yes">无法注销字体 [2]。请确保您有足够的权限删除字体。</String>
517 <String Id="Error1909" Overridable="yes">无法创建快捷方式 [2]。请确保该目标文件夹存在,并且您能够访问该文件夹。</String>
518 <String Id="Error1910" Overridable="yes">无法删除快捷方式 [2]。请确保该快捷方式文件存在,并且您能够访问该文件。</String>
519 <String Id="Error1911" Overridable="yes">无法将文件 [2] 注册到类型库中。请与技术支持人员联系。</String>
520 <String Id="Error1912" Overridable="yes">无法从类型库中注销文件 [2]。请与技术支持人员联系。</String>
521 <String Id="Error1913" Overridable="yes">无法更新 INI 文件 [2][3]。请确保该文件存在,并且您能够访问该文件。</String>
522 <String Id="Error1914" Overridable="yes">无法安排文件 [2] 在重新启动时替换文件 [3]。请确保您对文件 [3] 具有写权限。</String>
523 <String Id="Error1915" Overridable="yes">删除 ODBC 驱动程序管理器时出错,ODBC 错误 [2]: [3]。请与技术支持人员联系。</String>
524 <String Id="Error1916" Overridable="yes">安装 ODBC 驱动程序管理器时出错,ODBC 错误 [2]: [3]。请与技术支持人员联系。</String>
525 <String Id="Error1917" Overridable="yes">删除 ODBC 驱动程序 [4] 时出错,ODBC 错误 [2]: [3]。请确保您有足够的权限删除 ODBC 驱动程序。</String>
526 <String Id="Error1918" Overridable="yes">安装 ODBC 驱动程序 [4] 时出错,ODBC 错误 [2]: [3]。请确保文件 [4] 存在,并且您能够访问该文件。</String>
527 <String Id="Error1919" Overridable="yes">配置 ODBC 数据源 [4] 时出错,ODBC 错误 [2]: [3]。请确保文件 [4] 存在,并且您能够访问该文件。</String>
528 <String Id="Error1920" Overridable="yes">服务“[2]”([3])启动失败。请确保您有足够的权限启动系统服务。</String>
529 <String Id="Error1921" Overridable="yes">无法停止服务“[2]”([3])。请确保您有足够的权限停止系统服务。</String>
530 <String Id="Error1922" Overridable="yes">无法删除服务“[2]”([3])。请确保您有足够的权限删除系统服务。</String>
531 <String Id="Error1923" Overridable="yes">无法安装服务“[2]”([3])。请确保您有足够的权限安装系统服务。</String>
532 <String Id="Error1924" Overridable="yes">无法更新环境变量“[2]”。请确保您有足够的权限修改环境变量。</String>
533 <String Id="Error1925" Overridable="yes">您没有足够的权限为这台计算机的所有用户完成此安装。请以管理员身份登录,然后重试此安装。</String>
534 <String Id="Error1926" Overridable="yes">无法为文件“[3]”设置文件安全性。错误: [2]。请确保您有足够的权限修改此文件的安全权限。</String>
535 <String Id="Error1927" Overridable="yes">该计算机上未安装组件服务(COM+ 1.0)。此安装需要使用组件服务才能成功完成。Windows 2000 中提供了组件服务。</String>
536 <String Id="Error1928" Overridable="yes">注册 COM+ 应用程序时出错。有关详细信息,请与技术支持人员联系。</String>
537 <String Id="Error1929" Overridable="yes">注销 COM+ 应用程序时出错。有关详细信息,请与技术支持人员联系。</String>
538 <String Id="Error1930" Overridable="yes">无法更改服务“[2]”([3])的说明。</String>
539 <String Id="Error1931" Overridable="yes">由于系统文件 [2] 受 Windows 保护,Windows Installer 服务无法更新该文件。您可能需要更新操作系统才能使此程序正常运行。{{软件包版本: [3],操作系统保护的版本: [4]}}</String>
540 <String Id="Error1932" Overridable="yes">Windows Installer 服务无法更新受保护的 Windows 文件 [2]。{{软件包版本: [3],操作系统保护的版本: [4],SFP 错误: [5]}}</String>
541 <String Id="Error1933" Overridable="yes">Windows Installer 服务无法更新一个或多个受保护的 Windows 文件。{{SFP 错误: [2]。受保护的文件列表:\r\n[3]}}</String>
542 <String Id="Error1934" Overridable="yes">已通过计算机上的策略禁用用户安装。</String>
543 <String Id="Error1935" Overridable="yes">安装程序集“[6]”期间出错。有关详细信息,请参考“帮助和支持”。HRESULT: [3]。{{程序集接口: [4],函数: [5],组件: [2]}}</String>
544 <String Id="Error1936" Overridable="yes">安装程序集“[6]”期间出错。该程序集没有强名称或者未按最小密钥长度进行签名。HRESULT: [3]。{{程序集接口: [4],函数: [5],组件: [2]}}</String>
545 <String Id="Error1937" Overridable="yes">安装程序集“[6]”期间出错。签名或目录无法验证或者无效。HRESULT: [3]。{{程序集接口: [4],函数: [5],组件: [2]}}</String>
546 <String Id="Error1938" Overridable="yes">安装程序集“[6]”期间出错。找不到该程序集的一个或多个模块。HRESULT: [3]。{{程序集接口: [4],函数: [5],组件: [2]}}</String>
547
548 <String Id="UITextbytes" Overridable="yes">字节数</String>
549 <String Id="UITextGB" Overridable="yes">GB</String>
550 <String Id="UITextKB" Overridable="yes">KB</String>
551 <String Id="UITextMB" Overridable="yes">MB</String>
552 <String Id="UITextMenuAbsent" Overridable="yes">整个功能将不可用</String>
553 <String Id="UITextMenuAdvertise" Overridable="yes">功能将在需要时安装</String>
554 <String Id="UITextMenuAllCD" Overridable="yes">整个功能将安装为从光盘上运行</String>
555 <String Id="UITextMenuAllLocal" Overridable="yes">整个功能将安装在本地硬盘上</String>
556 <String Id="UITextMenuAllNetwork" Overridable="yes">整个功能将安装为从网络上运行</String>
557 <String Id="UITextMenuCD" Overridable="yes">将安装为从光盘上运行</String>
558 <String Id="UITextMenuLocal" Overridable="yes">将安装在本地硬盘上</String>
559 <String Id="UITextMenuNetwork" Overridable="yes">将安装为从网络上运行</String>
560 <String Id="UITextNewFolder" Overridable="yes">Folder|新建文件夹</String>
561 <String Id="UITextScriptInProgress" Overridable="yes">正在收集所需信息...</String>
562 <String Id="UITextSelAbsentAbsent" Overridable="yes">将不安装此功能</String>
563 <String Id="UITextSelAbsentAdvertise" Overridable="yes">此功能将被设置为在需要时安装</String>
564 <String Id="UITextSelAbsentCD" Overridable="yes">此功能将安装为从光盘上运行</String>
565 <String Id="UITextSelAbsentLocal" Overridable="yes">此功能将安装在本地硬盘上</String>
566 <String Id="UITextSelAbsentNetwork" Overridable="yes">此功能将安装为从网络上运行</String>
567 <String Id="UITextSelAdvertiseAbsent" Overridable="yes">此功能将不可用</String>
568 <String Id="UITextSelAdvertiseAdvertise" Overridable="yes">将在需要时安装</String>
569 <String Id="UITextSelAdvertiseCD" Overridable="yes">此功能将从光盘上运行</String>
570 <String Id="UITextSelAdvertiseLocal" Overridable="yes">此功能将安装在本地硬盘上</String>
571 <String Id="UITextSelAdvertiseNetwork" Overridable="yes">此功能将从网络上运行</String>
572 <String Id="UITextSelCDAbsent" Overridable="yes">此功能将被完全卸载,您将无法从光盘上运行它</String>
573 <String Id="UITextSelCDAdvertise" Overridable="yes">此功能将由从光盘上运行改为在需要时安装</String>
574 <String Id="UITextSelCDCD" Overridable="yes">此功能将保留为从光盘上运行</String>
575 <String Id="UITextSelCDLocal" Overridable="yes">此功能将由从光盘上运行改为安装在本地硬盘上</String>
576 <String Id="UITextSelChildCostNeg" Overridable="yes">此功能在硬盘上释放 [1] 磁盘空间。</String>
577 <String Id="UITextSelChildCostPos" Overridable="yes">此功能要求硬盘上有 [1] 磁盘空间。</String>
578 <String Id="UITextSelCostPending" Overridable="yes">正在计算此功能的开销...</String>
579 <String Id="UITextSelLocalAbsent" Overridable="yes">此功能将被完全删除</String>
580 <String Id="UITextSelLocalAdvertise" Overridable="yes">此功能将从本地硬盘上删除,但会设置为在需要时安装</String>
581 <String Id="UITextSelLocalCD" Overridable="yes">此功能将从本地硬盘上删除,但仍可从光盘上运行</String>
582 <String Id="UITextSelLocalLocal" Overridable="yes">此功能将保留在本地硬盘上</String>
583 <String Id="UITextSelLocalNetwork" Overridable="yes">此功能将从本地硬盘上删除,但仍可从网络上运行</String>
584 <String Id="UITextSelNetworkAbsent" Overridable="yes">此功能将被完全卸载,您将无法从网络上运行它</String>
585 <String Id="UITextSelNetworkAdvertise" Overridable="yes">此功能将由从网络上运行改为在需要时安装</String>
586 <String Id="UITextSelNetworkLocal" Overridable="yes">此功能将由从网络上运行改为安装在本地硬盘上</String>
587 <String Id="UITextSelNetworkNetwork" Overridable="yes">此功能将保留为从网络上运行</String>
588 <String Id="UITextSelParentCostNegNeg" Overridable="yes">此功能在硬盘上释放 [1] 磁盘空间。已选择了它的 [3] 项子功能中的 [2] 项。这些子功能在硬盘上释放 [4] 磁盘空间。</String>
589 <String Id="UITextSelParentCostNegPos" Overridable="yes">此功能在硬盘上释放 [1] 磁盘空间。已选择了它的 [3] 项子功能中的 [2] 项。这些子功能要求硬盘上有 [4] 磁盘空间。</String>
590 <String Id="UITextSelParentCostPosNeg" Overridable="yes">此功能要求硬盘上有 [1] 磁盘空间。已选择了它的 [3] 项子功能中的 [2] 项。这些子功能在硬盘上释放 [4] 磁盘空间。</String>
591 <String Id="UITextSelParentCostPosPos" Overridable="yes">此功能要求硬盘上有 [1] 磁盘空间。已选择了它的 [3] 项子功能中的 [2] 项。这些子功能要求硬盘上有 [4] 磁盘空间。</String>
592 <String Id="UITextTimeRemaining" Overridable="yes">剩余时间: {[1] 分 }{[2] 秒}</String>
593 <String Id="UITextVolumeCostAvailable" Overridable="yes">有空</String>
594 <String Id="UITextVolumeCostDifference" Overridable="yes">差额</String>
595 <String Id="UITextVolumeCostRequired" Overridable="yes">所需空间</String>
596 <String Id="UITextVolumeCostSize" Overridable="yes">磁盘大小</String>
597 <String Id="UITextVolumeCostVolume" Overridable="yes">卷</String>
598</WixLocalization>
diff --git a/src/ext/UI/wixlib/WixUI_zh-HK.wxl b/src/ext/UI/wixlib/WixUI_zh-HK.wxl
new file mode 100644
index 00000000..a0d589ce
--- /dev/null
+++ b/src/ext/UI/wixlib/WixUI_zh-HK.wxl
@@ -0,0 +1,598 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3
4
5<WixLocalization Culture="zh-hk" Codepage="950" xmlns="http://wixtoolset.org/schemas/v4/wxl">
6 <String Id="WixUIBack" Overridable="yes">上一步(&amp;B)</String>
7 <String Id="WixUINext" Overridable="yes">下一步(&amp;N)</String>
8 <String Id="WixUICancel" Overridable="yes">取消</String>
9 <String Id="WixUIFinish" Overridable="yes">完成(&amp;F)</String>
10 <String Id="WixUIRetry" Overridable="yes">重試(&amp;R)</String>
11 <String Id="WixUIIgnore" Overridable="yes">忽略(&amp;I)</String>
12 <String Id="WixUIYes" Overridable="yes">是(&amp;Y)</String>
13 <String Id="WixUINo" Overridable="yes">否(&amp;N)</String>
14 <String Id="WixUIOK" Overridable="yes">確定</String>
15 <String Id="WixUIPrint" Overridable="yes">列印(&amp;P)</String>
16
17 <String Id="AdvancedWelcomeEulaDlg_Title" Overridable="yes">[ProductName] 安裝程式</String>
18 <String Id="AdvancedWelcomeEulaDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
19 <String Id="AdvancedWelcomeEulaDlgTitle" Overridable="yes">{\WixUI_Font_Title}請閱讀 [ProductName] 授權合約</String>
20 <String Id="AdvancedWelcomeEulaDlgLicenseAcceptedCheckBox" Overridable="yes">我接受授權合約中的條款(&amp;A)</String>
21 <String Id="AdvancedWelcomeEulaDlgDescriptionPerMachine" Overridable="yes">按一下 [\[]安裝[\]] 以預設選項為所有使用者安裝產品。按一下 [\[]進階[\]] 可變更安裝選項。</String>
22 <String Id="AdvancedWelcomeEulaDlgDescriptionPerUser" Overridable="yes">按一下 [\[]安裝[\]] 以預設選項僅為您安裝產品。按一下 [\[]進階[\]] 可變更安裝選項。</String>
23 <String Id="AdvancedWelcomeEulaDlgInstall" Overridable="yes">安裝(&amp;I)</String>
24 <String Id="AdvancedWelcomeEulaDlgAdvanced" Overridable="yes">進階(&amp;D)</String>
25 <String Id="Advanced_Font_Normal_Size" Overridable="yes">9</String>
26 <String Id="Advanced_Font_Bigger_Size" Overridable="yes">12</String>
27 <String Id="Advanced_Font_Title_Size" Overridable="yes">9</String>
28 <String Id="Advanced_Font_Emphasized_Size" Overridable="yes">9</String>
29 <String Id="Advanced_Font_FaceName" Overridable="yes">Tahoma</String>
30
31 <String Id="BrowseDlg_Title" Overridable="yes">[ProductName] 安裝程式</String>
32 <String Id="BrowseDlgComboLabel" Overridable="yes">查詢(&amp;L):</String>
33 <String Id="BrowseDlgWixUI_Bmp_Up" Overridable="yes">WixUI_Bmp_Up</String>
34 <String Id="BrowseDlgWixUI_Bmp_UpTooltip" Overridable="yes">上移一層</String>
35 <String Id="BrowseDlgNewFolder" Overridable="yes">WixUI_Bmp_New</String>
36 <String Id="BrowseDlgNewFolderTooltip" Overridable="yes">建立新資料夾</String>
37 <String Id="BrowseDlgPathLabel" Overridable="yes">資料夾名稱(&amp;F):</String>
38 <String Id="BrowseDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
39 <String Id="BrowseDlgDescription" Overridable="yes">瀏覽到目的地資料夾</String>
40 <String Id="BrowseDlgTitle" Overridable="yes">{\WixUI_Font_Title}變更目的地資料夾</String>
41
42 <String Id="CancelDlg_Title" Overridable="yes">[ProductName] 安裝程式</String>
43 <String Id="CancelDlgText" Overridable="yes">您確定要取消 [ProductName] 安裝嗎?</String>
44 <String Id="CancelDlgIcon" Overridable="yes">WixUI_Ico_Info</String>
45 <String Id="CancelDlgIconTooltip" Overridable="yes">資訊圖示</String>
46
47 <String Id="CustomizeDlg_Title" Overridable="yes">[ProductName] 安裝程式</String>
48 <String Id="CustomizeDlgTree" Overridable="yes">選項樹狀目錄</String>
49 <String Id="CustomizeDlgBrowse" Overridable="yes">瀏覽(&amp;R)...</String>
50 <String Id="CustomizeDlgReset" Overridable="yes">重設(&amp;S)</String>
51 <String Id="CustomizeDlgDiskCost" Overridable="yes">磁碟使用量(&amp;U)</String>
52 <String Id="CustomizeDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
53 <String Id="CustomizeDlgText" Overridable="yes">按一下下面樹狀結構中的圖示,可變更每項功能的安裝方式。</String>
54 <String Id="CustomizeDlgDescription" Overridable="yes">選取您想要的功能安裝方式。</String>
55 <String Id="CustomizeDlgTitle" Overridable="yes">{\WixUI_Font_Title}自訂安裝</String>
56 <String Id="CustomizeDlgItemDescription" Overridable="yes">CustomizeDlgItemDescription-CustomizeDlgItemDescription</String>
57 <String Id="CustomizeDlgItemSize" Overridable="yes">CustomizeDlgItemSize-CustomizeDlgItemSize</String>
58 <String Id="CustomizeDlgLocation" Overridable="yes">CustomizeDlgLocation-CustomizeDlgLocation</String>
59 <String Id="CustomizeDlgLocationLabel" Overridable="yes">地點:</String>
60
61 <String Id="DiskCostDlg_Title" Overridable="yes">[ProductName] 安裝程式</String>
62 <String Id="DiskCostDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
63 <String Id="DiskCostDlgText" Overridable="yes">反白顯示的磁碟區沒有足夠磁碟空間可供選取的功能使用。您可以從反白顯示的磁碟區移除一些檔案、安裝較少功能,或是選擇其他目的地磁碟機。</String>
64 <String Id="DiskCostDlgDescription" Overridable="yes">安裝已選取功能所需的磁碟空間。</String>
65 <String Id="DiskCostDlgTitle" Overridable="yes">{\WixUI_Font_Title}磁碟空間需求</String>
66 <String Id="DiskCostDlgVolumeList" Overridable="yes">{120}{70}{70}{70}{70}</String>
67
68 <String Id="ErrorDlg_Title" Overridable="yes">[ProductName] 安裝程式</String>
69 <String Id="ErrorDlgErrorText" Overridable="yes">資訊文字</String>
70 <String Id="ErrorDlgErrorIcon" Overridable="yes">WixUI_Ico_Info</String>
71 <String Id="ErrorDlgErrorIconTooltip" Overridable="yes">資訊圖示</String>
72
73 <String Id="ExitDialog_Title" Overridable="yes">[ProductName] 安裝程式</String>
74 <String Id="ExitDialogBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
75 <String Id="ExitDialogDescription" Overridable="yes">按一下 [\[]完成[\]] 按鈕結束安裝精靈。</String>
76 <String Id="ExitDialogTitle" Overridable="yes">{\WixUI_Font_Bigger}已完成 [ProductName] 安裝精靈</String>
77
78 <String Id="FatalError_Title" Overridable="yes">[ProductName] 安裝程式</String>
79 <String Id="FatalErrorBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
80 <String Id="FatalErrorTitle" Overridable="yes">{\WixUI_Font_Bigger}[ProductName] 安裝精靈提前結束</String>
81 <String Id="FatalErrorDescription1" Overridable="yes">[ProductName] 安裝精靈因發生錯誤而提前結束,您的系統尚未被修改。若要稍後再安裝此程式,請再執行一次安裝精靈。</String>
82 <String Id="FatalErrorDescription2" Overridable="yes">按一下 [\[]完成[\]] 按鈕結束安裝精靈。</String>
83
84 <String Id="FeaturesDlg_Title" Overridable="yes">[ProductName] 安裝程式</String>
85 <String Id="FeaturesDlgTree" Overridable="yes">產品功能</String>
86 <String Id="FeaturesDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
87 <String Id="FeaturesDlgDescription" Overridable="yes">選取您想要的功能安裝方式。</String>
88 <String Id="FeaturesDlgTitle" Overridable="yes">{\WixUI_Font_Title}產品功能</String>
89 <String Id="FeaturesDlgItemDescription" Overridable="yes">FeaturesDlgItemDescription</String>
90 <String Id="FeaturesDlgItemSize" Overridable="yes">FeaturesDlgItemSize</String>
91 <String Id="FeaturesDlgInstall" Overridable="yes">安裝(&amp;I)</String>
92 <String Id="FeaturesDlgChange" Overridable="yes">變更(&amp;C)</String>
93
94 <String Id="FilesInUse_Title" Overridable="yes">[ProductName] 安裝程式</String>
95 <String Id="FilesInUseExit" Overridable="yes">結束(&amp;X)</String>
96 <String Id="FilesInUseBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
97 <String Id="FilesInUseText" Overridable="yes">下列應用程式正在使用要由此安裝程式更新的檔案。請按 [\[]結束[\]] 結束,或關閉這些應用程式,然後按一下 [\[]重試[\]] 繼續進行安裝(&amp;R)</String>
98 <String Id="FilesInUseDescription" Overridable="yes">有些需要更新的檔案目前正在使用中。</String>
99 <String Id="FilesInUseTitle" Overridable="yes">{\WixUI_Font_Title}檔案使用中</String>
100
101 <String Id="InstallDirDlg_Title" Overridable="yes">[ProductName] 安裝程式</String>
102 <String Id="InstallDirDlgChange" Overridable="yes">變更(&amp;C)...</String>
103 <String Id="InstallDirDlgTitle" Overridable="yes">{\WixUI_Font_Title}目的地資料夾</String>
104 <String Id="InstallDirDlgDescription" Overridable="yes">按一下 [\[]下一步[\]] 安裝至預設資料夾,或按一下 [\[]變更[\]] 選擇其他位置。</String>
105 <String Id="InstallDirDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
106 <String Id="InstallDirDlgFolderLabel" Overridable="yes">安裝 [ProductName] 到:</String>
107
108 <String Id="InstallScopeDlg_Title" Overridable="yes">[ProductName] 安裝程式</String>
109 <String Id="InstallScopeDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
110 <String Id="InstallScopeDlgDescription" Overridable="yes">選擇安裝範圍和資料夾</String>
111 <String Id="InstallScopeDlgTitle" Overridable="yes">{\WixUI_Font_Title}安裝範圍</String>
112 <String Id="InstallScopeDlgPerUser" Overridable="yes">{\WixUI_Font_Emphasized}僅為您安裝 ([LogonUser])(&amp;J)</String>
113 <String Id="InstallScopeDlgPerUserDescription" Overridable="yes">[ProductName] 將安裝在個別使用者資料夾中,並且僅供您的使用者帳戶使用。您不需要本機系統管理員權限。</String>
114 <String Id="InstallScopeDlgNoPerUserDescription" Overridable="yes">[ProductName] 不支援個別使用者安裝。</String>
115 <String Id="InstallScopeDlgPerMachine" Overridable="yes">{\WixUI_Font_Emphasized}為這部電腦的所有使用者安裝(&amp;M)</String>
116 <String Id="InstallScopeDlgPerMachineDescription" Overridable="yes">[ProductName] 將依預設安裝在個別電腦資料夾中,並且可供所有使用者使用。您可以變更預設安裝資料夾。您必須擁有本機系統管理員權限。</String>
117 <String Id="InstallScopeDlgFolderLabel" Overridable="yes">安裝資料夾(&amp;F):</String>
118 <String Id="InstallScopeDlgChange" Overridable="yes">變更(&amp;C)...</String>
119
120 <String Id="InvalidDirDlg_Title" Overridable="yes">[ProductName] 安裝程式</String>
121 <String Id="InvalidDirDlgText" Overridable="yes">安裝目錄必須在本機硬碟上。</String>
122 <String Id="InvalidDirDlgIcon" Overridable="yes">WixUI_Ico_Info</String>
123 <String Id="InvalidDirDlgIconTooltip" Overridable="yes">資訊圖示</String>
124
125 <String Id="LicenseAgreementDlg_Title" Overridable="yes">[ProductName] 安裝程式</String>
126 <String Id="LicenseAgreementDlgLicenseAcceptedCheckBox" Overridable="yes">我接受授權合約中的條款(&amp;A)</String>
127 <String Id="LicenseAgreementDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
128 <String Id="LicenseAgreementDlgDescription" Overridable="yes">請仔細閱讀下面的授權合約</String>
129 <String Id="LicenseAgreementDlgTitle" Overridable="yes">{\WixUI_Font_Title}使用者授權合約</String>
130
131 <String Id="MaintenanceTypeDlg_Title" Overridable="yes">[ProductName] 安裝程式</String>
132 <String Id="MaintenanceTypeDlgChangeButton" Overridable="yes">變更(&amp;C)</String>
133 <String Id="MaintenanceTypeDlgChangeButtonTooltip" Overridable="yes">變更安裝</String>
134 <String Id="MaintenanceTypeDlgRepairButton" Overridable="yes">修復(&amp;P)</String>
135 <String Id="MaintenanceTypeDlgRepairButtonTooltip" Overridable="yes">修復安裝</String>
136 <String Id="MaintenanceTypeDlgRemoveButton" Overridable="yes">移除(&amp;R)</String>
137 <String Id="MaintenanceTypeDlgRemoveButtonTooltip" Overridable="yes">移除安裝</String>
138 <String Id="MaintenanceTypeDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
139 <String Id="MaintenanceTypeDlgDescription" Overridable="yes">選取您要執行的作業。</String>
140 <String Id="MaintenanceTypeDlgTitle" Overridable="yes">{\WixUI_Font_Title}變更、修復或移除安裝</String>
141 <String Id="MaintenanceTypeDlgChangeText" Overridable="yes">讓您變更各項功能安裝的方式。</String>
142 <String Id="MaintenanceTypeDlgChangeDisabledText" Overridable="yes">[ProductName] 沒有可以單獨選取的功能。</String>
143 <String Id="MaintenanceTypeDlgRemoveText" Overridable="yes">從您的電腦移除 [ProductName]。</String>
144 <String Id="MaintenanceTypeDlgRemoveDisabledText" Overridable="yes">[ProductName] 無法移除。</String>
145 <String Id="MaintenanceTypeDlgRepairText" Overridable="yes">藉由修正遺失及損毀的檔案、捷徑和登錄項目修復最近安裝中的錯誤。</String>
146 <String Id="MaintenanceTypeDlgRepairDisabledText" Overridable="yes">[ProductName] 無法修復。</String>
147
148 <String Id="MaintenanceWelcomeDlg_Title" Overridable="yes">[ProductName] 安裝程式</String>
149 <String Id="MaintenanceWelcomeDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
150 <String Id="MaintenanceWelcomeDlgDescription" Overridable="yes">安裝精靈可以讓您變更 [ProductName] 功能安裝在電腦上的方式,或從電腦移除它們。請按 [\[]下一步[\]] 繼續進行,或按 [\[]取消[\]] 結束安裝精靈。</String>
151 <String Id="MaintenanceWelcomeDlgTitle" Overridable="yes">{\WixUI_Font_Bigger}歡迎使用 [ProductName] 安裝精靈</String>
152
153 <String Id="MsiRMFilesInUse_Title" Overridable="yes">[ProductName] 安裝程式</String>
154 <String Id="MsiRMFilesInUseBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
155 <String Id="MsiRMFilesInUseText" Overridable="yes">下列應用程式正在使用要由此安裝程式更新的檔案。您可以讓安裝精靈關閉它們,稍後再嘗試重新啟動它們或重新啟動電腦。</String>
156 <String Id="MsiRMFilesInUseDescription" Overridable="yes">有些需要更新的檔案目前正在使用中。</String>
157 <String Id="MsiRMFilesInUseTitle" Overridable="yes">{\WixUI_Font_Title}檔案使用中</String>
158 <String Id="MsiRMFilesInUseUseRM" Overridable="yes">關閉應用程式,稍後再嘗試重新啟動它們(&amp;C)</String>
159 <String Id="MsiRMFilesInUseDontUseRM" Overridable="yes">不關閉應用程式,必須重新開機(&amp;D)</String>
160
161 <String Id="OutOfDiskDlg_Title" Overridable="yes">[ProductName] 安裝程式</String>
162 <String Id="OutOfDiskDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
163 <String Id="OutOfDiskDlgText" Overridable="yes">反白顯示的磁碟區沒有足夠磁碟空間可供目前選取的功能使用。您可以從反白顯示的磁碟區移除一些檔案、安裝較少功能,或是選擇其他目的地磁碟機。</String>
164 <String Id="OutOfDiskDlgDescription" Overridable="yes">安裝作業所需的磁碟空間超過可用的磁碟空間。</String>
165 <String Id="OutOfDiskDlgTitle" Overridable="yes">{\WixUI_Font_Title}磁碟空間不足</String>
166 <String Id="OutOfDiskDlgVolumeList" Overridable="yes">{120}{70}{70}{70}{70}</String>
167
168 <String Id="OutOfRbDiskDlg_Title" Overridable="yes">[ProductName] 安裝程式</String>
169 <String Id="OutOfRbDiskDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
170 <String Id="OutOfRbDiskDlgText" Overridable="yes">反白顯示的磁碟區沒有足夠磁碟空間可供目前選取的功能使用。您可以從反白顯示的磁碟區移除一些檔案、安裝較少功能,或是選擇其他目的地磁碟機。</String>
171 <String Id="OutOfRbDiskDlgDescription" Overridable="yes">安裝作業所需的磁碟空間超過可用的磁碟空間。</String>
172 <String Id="OutOfRbDiskDlgTitle" Overridable="yes">{\WixUI_Font_Title}磁碟空間不足</String>
173 <String Id="OutOfRbDiskDlgVolumeList" Overridable="yes">{120}{70}{70}{70}{70}</String>
174 <String Id="OutOfRbDiskDlgText2" Overridable="yes">或者,您可以選擇停用安裝程式的復原功能。停用復原會阻礙安裝程式在安裝受到任何形式的中斷時,將電腦還原成原先的狀態。如果您願意承擔停用復原功能的風險,請按一下 [\[]是[\]]。</String>
175
176 <String Id="PrepareDlg_Title" Overridable="yes">[ProductName] 安裝程式</String>
177 <String Id="PrepareDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
178 <String Id="PrepareDlgDescription" Overridable="yes">安裝精靈正在準備引導您完成安裝,請稍候。</String>
179 <String Id="PrepareDlgTitle" Overridable="yes">{\WixUI_Font_Bigger}歡迎使用 [ProductName] 安裝精靈</String>
180
181 <String Id="ProgressDlg_Title" Overridable="yes">[ProductName] 安裝程式</String>
182 <String Id="ProgressDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
183 <String Id="ProgressDlgTextInstalling" Overridable="yes">安裝程式精靈正在安裝 [ProductName],請稍候。</String>
184 <String Id="ProgressDlgTitleInstalling" Overridable="yes">{\WixUI_Font_Title}正在安裝 [ProductName]</String>
185 <String Id="ProgressDlgTextChanging" Overridable="yes">安裝精靈正在變更 [ProductName],請稍候。</String>
186 <String Id="ProgressDlgTitleChanging" Overridable="yes">{\WixUI_Font_Title}正在變更 [ProductName]</String>
187 <String Id="ProgressDlgTextRepairing" Overridable="yes">安裝精靈正在修復 [ProductName],請稍候。</String>
188 <String Id="ProgressDlgTitleRepairing" Overridable="yes">{\WixUI_Font_Title}正在修復 [ProductName]</String>
189 <String Id="ProgressDlgTextRemoving" Overridable="yes">安裝精靈正在移除 [ProductName],請稍候。</String>
190 <String Id="ProgressDlgTitleRemoving" Overridable="yes">{\WixUI_Font_Title}正在移除 [ProductName]</String>
191 <String Id="ProgressDlgTextUpdating" Overridable="yes">安裝精靈正在更新 [ProductName],請稍候。</String>
192 <String Id="ProgressDlgTitleUpdating" Overridable="yes">{\WixUI_Font_Title}正在更新 [ProductName]</String>
193 <String Id="ProgressDlgProgressBar" Overridable="yes">處理完畢</String>
194 <String Id="ProgressDlgStatusLabel" Overridable="yes">狀態:</String>
195
196 <String Id="ResumeDlg_Title" Overridable="yes">[ProductName] 安裝程式</String>
197 <String Id="ResumeDlgInstall" Overridable="yes">安裝(&amp;I)</String>
198 <String Id="ResumeDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
199 <String Id="ResumeDlgDescription" Overridable="yes">安裝精靈即將完成在您的電腦上安裝 [ProductName]。請按 [\[]安裝[\]] 繼續進行,或按 [\[]取消[\]] 結束安裝精靈。</String>
200 <String Id="ResumeDlgTitle" Overridable="yes">{\WixUI_Font_Bigger}繼續執行 [ProductName] 安裝精靈</String>
201
202 <String Id="SetupTypeDlg_Title" Overridable="yes">[ProductName] 安裝程式</String>
203 <String Id="SetupTypeDlgTypicalButton" Overridable="yes">一般(&amp;T)</String>
204 <String Id="SetupTypeDlgTypicalButtonTooltip" Overridable="yes">一般安裝</String>
205 <String Id="SetupTypeDlgCustomButton" Overridable="yes">自訂(&amp;U)</String>
206 <String Id="SetupTypeDlgCustomButtonTooltip" Overridable="yes">自訂安裝</String>
207 <String Id="SetupTypeDlgCompleteButton" Overridable="yes">完整(&amp;O)</String>
208 <String Id="SetupTypeDlgCompleteButtonTooltip" Overridable="yes">完整安裝</String>
209 <String Id="SetupTypeDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
210 <String Id="SetupTypeDlgTitle" Overridable="yes">{\WixUI_Font_Title}選擇安裝類型</String>
211 <String Id="SetupTypeDlgDescription" Overridable="yes">選擇最符合您需求的安裝類型</String>
212 <String Id="SetupTypeDlgTypicalText" Overridable="yes">安裝最常用的程式功能。建議一般使用者使用。</String>
213 <String Id="SetupTypeDlgCustomText" Overridable="yes">讓使用者選擇要安裝的程式功能以及安裝位置。建議進階使用者使用。</String>
214 <String Id="SetupTypeDlgCompleteText" Overridable="yes">將安裝所有程式功能。需要最大磁碟空間。</String>
215
216 <String Id="UserExit_Title" Overridable="yes">[ProductName] 安裝程式</String>
217 <String Id="UserExitBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
218 <String Id="UserExitTitle" Overridable="yes">{\WixUI_Font_Bigger}[ProductName] 安裝精靈已中斷</String>
219 <String Id="UserExitDescription1" Overridable="yes">[ProductName] 安裝程式已中斷。您的系統尚未被修改。若要稍後再安裝此程式,請再執行一次安裝精靈。</String>
220 <String Id="UserExitDescription2" Overridable="yes">按一下 [\[]完成[\]] 按鈕結束安裝精靈。</String>
221
222 <String Id="VerifyReadyDlg_Title" Overridable="yes">[ProductName] 安裝程式</String>
223 <String Id="VerifyReadyDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
224 <String Id="VerifyReadyDlgInstall" Overridable="yes">安裝(&amp;I)</String>
225 <String Id="VerifyReadyDlgInstallText" Overridable="yes">按一下 [\[]安裝[\]] 即可開始安裝。按一下 [\[]上一步[\]] 可檢閱或變更您的任何安裝設定。按一下 [\[]取消[\]] 可結束此精靈。</String>
226 <String Id="VerifyReadyDlgInstallTitle" Overridable="yes">{\WixUI_Font_Title}準備安裝 [ProductName]</String>
227 <String Id="VerifyReadyDlgChange" Overridable="yes">變更(&amp;C)</String>
228 <String Id="VerifyReadyDlgChangeText" Overridable="yes">按一下 [\[]變更[\]] 即可開始安裝。按一下 [\[]上一步[\]] 可檢閱或變更您的任何安裝設定。按一下 [\[]取消[\]] 可結束此精靈。</String>
229 <String Id="VerifyReadyDlgChangeTitle" Overridable="yes">{\WixUI_Font_Title}準備變更 [ProductName]</String>
230 <String Id="VerifyReadyDlgRepair" Overridable="yes">修復(&amp;P)</String>
231 <String Id="VerifyReadyDlgRepairText" Overridable="yes">按一下 [\[]修復[\]] 即可修復 [ProductName] 的安裝。按一下 [\[]上一步[\]] 可檢閱或變更您的任何安裝設定。按一下 [\[]取消[\]] 可結束此精靈。</String>
232 <String Id="VerifyReadyDlgRepairTitle" Overridable="yes">{\WixUI_Font_Title}準備修復 [ProductName]</String>
233 <String Id="VerifyReadyDlgRemove" Overridable="yes">移除(&amp;R)</String>
234 <String Id="VerifyReadyDlgRemoveText" Overridable="yes">按一下 [\[]移除[\]] 即可從電腦移除 [ProductName]。按一下 [\[]上一步[\]] 可檢閱或變更您的任何安裝設定。按一下 [\[]取消[\]] 可結束此精靈。</String>
235 <String Id="VerifyReadyDlgRemoveTitle" Overridable="yes">{\WixUI_Font_Title}準備移除 [ProductName]</String>
236 <String Id="VerifyReadyDlgUpdate" Overridable="yes">更新(&amp;U)</String>
237 <String Id="VerifyReadyDlgUpdateText" Overridable="yes">按一下 [\[]更新[\]] 即可更新您電腦中的 [ProductName]。按一下 [\[]上一步[\]] 可檢閱或變更您的任何安裝設定。按一下 [\[]取消[\]] 可結束此精靈。</String>
238 <String Id="VerifyReadyDlgUpdateTitle" Overridable="yes">{\WixUI_Font_Title}準備更新 [ProductName]</String>
239
240 <String Id="WaitForCostingDlg_Title" Overridable="yes">[ProductName] 安裝程式</String>
241 <String Id="WaitForCostingDlgReturn" Overridable="yes">返回(&amp;R)</String>
242 <String Id="WaitForCostingDlgText" Overridable="yes">安裝程式正在判斷您的磁碟空間需求,請稍候。</String>
243 <String Id="WaitForCostingDlgIcon" Overridable="yes">WixUI_Ico_Exclam</String>
244 <String Id="WaitForCostingDlgIconTooltip" Overridable="yes">驚歎號圖示</String>
245
246 <String Id="WelcomeDlg_Title" Overridable="yes">[ProductName] 安裝程式</String>
247 <String Id="WelcomeDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
248 <String Id="WelcomeDlgDescription" Overridable="yes">安裝精靈將在您的電腦上安裝 [ProductName]。請按 [\[]下一步[\]] 繼續進行,或按 [\[]取消[\]] 結束安裝精靈。</String>
249 <String Id="WelcomeUpdateDlgDescriptionUpdate" Overridable="yes">安裝精靈將更新您電腦上的 [ProductName]。請按 [\[]下一步[\]] 繼續進行,或按 [\[]取消[\]] 結束安裝精靈。</String>
250 <String Id="WelcomeDlgTitle" Overridable="yes">{\WixUI_Font_Bigger}歡迎使用 [ProductName] 安裝精靈</String>
251
252 <String Id="WelcomeEulaDlg_Title" Overridable="yes">[ProductName] 安裝程式</String>
253 <String Id="WelcomeEulaDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
254 <String Id="WelcomeEulaDlgLicenseAcceptedCheckBox" Overridable="yes">我接受授權合約中的條款(&amp;A)</String>
255 <String Id="WelcomeEulaDlgInstall" Overridable="yes">安裝(&amp;I)</String>
256 <String Id="WelcomeEulaDlgUpdate" Overridable="yes">更新(&amp;U)</String>
257 <String Id="WelcomeEulaDlgTitle" Overridable="yes">{\WixUI_Font_Title}請閱讀 [ProductName] 授權合約</String>
258
259 <String Id="ProgressTextInstallValidate" Overridable="yes">正在驗證安裝</String>
260 <String Id="ProgressTextInstallFiles" Overridable="yes">正在複製新檔案</String>
261 <String Id="ProgressTextInstallFilesTemplate" Overridable="yes">檔案: [1],目錄: [9],大小: [6]</String>
262 <String Id="ProgressTextInstallAdminPackage" Overridable="yes">正在複製網路安裝檔案</String>
263 <String Id="ProgressTextInstallAdminPackageTemplate" Overridable="yes">檔案: [1],目錄: [9],大小: [6]</String>
264 <String Id="ProgressTextFileCost" Overridable="yes">正在計算空間需求</String>
265 <String Id="ProgressTextCostInitialize" Overridable="yes">正在計算空間需求</String>
266 <String Id="ProgressTextCostFinalize" Overridable="yes">正在計算空間需求</String>
267 <String Id="ProgressTextCreateShortcuts" Overridable="yes">正在建立捷徑</String>
268 <String Id="ProgressTextCreateShortcutsTemplate" Overridable="yes">捷徑: [1]</String>
269 <String Id="ProgressTextPublishComponents" Overridable="yes">正在發行合格的元件</String>
270 <String Id="ProgressTextPublishComponentsTemplate" Overridable="yes">元件識別碼: [1],識別符號: [2]</String>
271 <String Id="ProgressTextPublishFeatures" Overridable="yes">正在發行產品功能</String>
272 <String Id="ProgressTextPublishFeaturesTemplate" Overridable="yes">功能: [1]</String>
273 <String Id="ProgressTextPublishProduct" Overridable="yes">正在發行產品資訊</String>
274 <String Id="ProgressTextRegisterClassInfo" Overridable="yes">正在註冊類別伺服器</String>
275 <String Id="ProgressTextRegisterClassInfoTemplate" Overridable="yes">類別識別碼: [1]</String>
276 <String Id="ProgressTextRegisterExtensionInfo" Overridable="yes">正在註冊擴充伺服器</String>
277 <String Id="ProgressTextRegisterExtensionInfoTemplate" Overridable="yes">擴充: [1]</String>
278 <String Id="ProgressTextRegisterMIMEInfo" Overridable="yes">正在註冊 MIME 資訊</String>
279 <String Id="ProgressTextRegisterMIMEInfoTemplate" Overridable="yes">MIME 內容類型: [1],副檔名: [2]</String>
280 <String Id="ProgressTextRegisterProgIdInfo" Overridable="yes">正在註冊程式識別元</String>
281 <String Id="ProgressTextRegisterProgIdInfoTemplate" Overridable="yes">ProgId: [1]</String>
282 <String Id="ProgressTextAllocateRegistrySpace" Overridable="yes">正在配置登錄空間</String>
283 <String Id="ProgressTextAllocateRegistrySpaceTemplate" Overridable="yes">可用空間: [1]</String>
284 <String Id="ProgressTextAppSearch" Overridable="yes">正在搜尋已安裝的應用程式</String>
285 <String Id="ProgressTextAppSearchTemplate" Overridable="yes">屬性: [1],簽章: [2]</String>
286 <String Id="ProgressTextBindImage" Overridable="yes">正在繫結可執行檔</String>
287 <String Id="ProgressTextBindImageTemplate" Overridable="yes">檔案: [1]</String>
288 <String Id="ProgressTextCCPSearch" Overridable="yes">正在搜尋合格的產品</String>
289 <String Id="ProgressTextCreateFolders" Overridable="yes">正在建立資料夾</String>
290 <String Id="ProgressTextCreateFoldersTemplate" Overridable="yes">資料夾: [1]</String>
291 <String Id="ProgressTextDeleteServices" Overridable="yes">正在刪除服務</String>
292 <String Id="ProgressTextDeleteServicesTemplate" Overridable="yes">服務: [1]</String>
293 <String Id="ProgressTextDuplicateFiles" Overridable="yes">正在建立重複的檔案</String>
294 <String Id="ProgressTextDuplicateFilesTemplate" Overridable="yes">檔案: [1],目錄: [9],大小: [6]</String>
295 <String Id="ProgressTextFindRelatedProducts" Overridable="yes">正在搜尋相關的應用程式</String>
296 <String Id="ProgressTextFindRelatedProductsTemplate" Overridable="yes">找到的應用程式: [1]</String>
297 <String Id="ProgressTextInstallODBC" Overridable="yes">正在安裝 ODBC 元件</String>
298 <String Id="ProgressTextInstallServices" Overridable="yes">正在安裝新服務</String>
299 <String Id="ProgressTextInstallServicesTemplate" Overridable="yes">服務: [2]</String>
300 <String Id="ProgressTextLaunchConditions" Overridable="yes">正在評估啟動條件</String>
301 <String Id="ProgressTextMigrateFeatureStates" Overridable="yes">正在從相關應用程式移轉功能狀態</String>
302 <String Id="ProgressTextMigrateFeatureStatesTemplate" Overridable="yes">應用程式: [1]</String>
303 <String Id="ProgressTextMoveFiles" Overridable="yes">正在移動檔案</String>
304 <String Id="ProgressTextMoveFilesTemplate" Overridable="yes">檔案: [1],目錄: [9],大小: [6]</String>
305 <String Id="ProgressTextPatchFiles" Overridable="yes">正在修補檔案</String>
306 <String Id="ProgressTextPatchFilesTemplate" Overridable="yes">檔案: [1],目錄: [2],大小: [3]</String>
307 <String Id="ProgressTextProcessComponents" Overridable="yes">正在更新元件登錄</String>
308 <String Id="ProgressTextRegisterComPlus" Overridable="yes">正在註冊 COM+ 應用程式及元件</String>
309 <String Id="ProgressTextRegisterComPlusTemplate" Overridable="yes">AppId: [1]{{, AppType: [2], 使用者: [3], RSN: [4]}}</String>
310 <String Id="ProgressTextRegisterFonts" Overridable="yes">正在註冊字型</String>
311 <String Id="ProgressTextRegisterFontsTemplate" Overridable="yes">字型: [1]</String>
312 <String Id="ProgressTextRegisterProduct" Overridable="yes">正在註冊產品</String>
313 <String Id="ProgressTextRegisterProductTemplate" Overridable="yes">[1]</String>
314 <String Id="ProgressTextRegisterTypeLibraries" Overridable="yes">正在註冊型別程式庫</String>
315 <String Id="ProgressTextRegisterTypeLibrariesTemplate" Overridable="yes">LibID: [1]</String>
316 <String Id="ProgressTextRegisterUser" Overridable="yes">正在註冊使用者</String>
317 <String Id="ProgressTextRegisterUserTemplate" Overridable="yes">[1]</String>
318 <String Id="ProgressTextRemoveDuplicateFiles" Overridable="yes">正在移除重複的檔案</String>
319 <String Id="ProgressTextRemoveDuplicateFilesTemplate" Overridable="yes">檔案: [1],目錄: [9]</String>
320 <String Id="ProgressTextRemoveEnvironmentStrings" Overridable="yes">正在更新環境字串</String>
321 <String Id="ProgressTextRemoveEnvironmentStringsTemplate" Overridable="yes">名稱: [1],值: [2],動作 [3]</String>
322 <String Id="ProgressTextRemoveExistingProducts" Overridable="yes">正在移除應用程式</String>
323 <String Id="ProgressTextRemoveExistingProductsTemplate" Overridable="yes">應用程式: [1],命令列: [2]</String>
324 <String Id="ProgressTextRemoveFiles" Overridable="yes">正在移除檔案</String>
325 <String Id="ProgressTextRemoveFilesTemplate" Overridable="yes">檔案: [1],目錄: [9]</String>
326 <String Id="ProgressTextRemoveFolders" Overridable="yes">正在移除資料夾</String>
327 <String Id="ProgressTextRemoveFoldersTemplate" Overridable="yes">資料夾: [1]</String>
328 <String Id="ProgressTextRemoveIniValues" Overridable="yes">正在移除 INI 檔案項目</String>
329 <String Id="ProgressTextRemoveIniValuesTemplate" Overridable="yes">檔案: [1],區段: [2],機碼: [3],值: [4]</String>
330 <String Id="ProgressTextRemoveODBC" Overridable="yes">正在移除 ODBC 元件</String>
331 <String Id="ProgressTextRemoveRegistryValues" Overridable="yes">正在移除系統登錄值</String>
332 <String Id="ProgressTextRemoveRegistryValuesTemplate" Overridable="yes">機碼: [1],名稱: [2]</String>
333 <String Id="ProgressTextRemoveShortcuts" Overridable="yes">正在移除捷徑</String>
334 <String Id="ProgressTextRemoveShortcutsTemplate" Overridable="yes">捷徑: [1]</String>
335 <String Id="ProgressTextRMCCPSearch" Overridable="yes">正在搜尋合格的產品</String>
336 <String Id="ProgressTextSelfRegModules" Overridable="yes">正在註冊模組</String>
337 <String Id="ProgressTextSelfRegModulesTemplate" Overridable="yes">檔案: [1],資料夾: [2]</String>
338 <String Id="ProgressTextSelfUnregModules" Overridable="yes">正在解除註冊模組</String>
339 <String Id="ProgressTextSelfUnregModulesTemplate" Overridable="yes">檔案: [1],資料夾: [2]</String>
340 <String Id="ProgressTextSetODBCFolders" Overridable="yes">正在初始化 ODBC 目錄</String>
341 <String Id="ProgressTextStartServices" Overridable="yes">正在啟動服務</String>
342 <String Id="ProgressTextStartServicesTemplate" Overridable="yes">服務: [1]</String>
343 <String Id="ProgressTextStopServices" Overridable="yes">正在停止服務</String>
344 <String Id="ProgressTextStopServicesTemplate" Overridable="yes">服務: [1]</String>
345 <String Id="ProgressTextUnpublishComponents" Overridable="yes">正在解除發行合格的元件</String>
346 <String Id="ProgressTextUnpublishComponentsTemplate" Overridable="yes">元件識別碼: [1],識別符號: [2]</String>
347 <String Id="ProgressTextUnpublishFeatures" Overridable="yes">正在解除發行產品功能</String>
348 <String Id="ProgressTextUnpublishFeaturesTemplate" Overridable="yes">功能: [1]</String>
349 <String Id="ProgressTextUnregisterClassInfo" Overridable="yes">解除註冊類別伺服器</String>
350 <String Id="ProgressTextUnregisterClassInfoTemplate" Overridable="yes">類別識別碼: [1]</String>
351 <String Id="ProgressTextUnregisterComPlus" Overridable="yes">正在解除註冊 COM+ 應用程式及元件</String>
352 <String Id="ProgressTextUnregisterComPlusTemplate" Overridable="yes">AppId: [1]{{, AppType: [2]}}</String>
353 <String Id="ProgressTextUnregisterExtensionInfo" Overridable="yes">正在解除註冊擴充伺服器</String>
354 <String Id="ProgressTextUnregisterExtensionInfoTemplate" Overridable="yes">擴充: [1]</String>
355 <String Id="ProgressTextUnregisterFonts" Overridable="yes">正在解除註冊字型</String>
356 <String Id="ProgressTextUnregisterFontsTemplate" Overridable="yes">字型: [1]</String>
357 <String Id="ProgressTextUnregisterMIMEInfo" Overridable="yes">正在解除註冊 MIME 資訊</String>
358 <String Id="ProgressTextUnregisterMIMEInfoTemplate" Overridable="yes">MIME 內容類型: [1],副檔名: [2]</String>
359 <String Id="ProgressTextUnregisterProgIdInfo" Overridable="yes">正在解除註冊程式識別元</String>
360 <String Id="ProgressTextUnregisterProgIdInfoTemplate" Overridable="yes">ProgId: [1]</String>
361 <String Id="ProgressTextUnregisterTypeLibraries" Overridable="yes">正在解除註冊型別程式庫</String>
362 <String Id="ProgressTextUnregisterTypeLibrariesTemplate" Overridable="yes">LibID: [1]</String>
363 <String Id="ProgressTextWriteEnvironmentStrings" Overridable="yes">正在更新環境字串</String>
364 <String Id="ProgressTextWriteEnvironmentStringsTemplate" Overridable="yes">名稱: [1],值: [2],動作 [3]</String>
365 <String Id="ProgressTextWriteIniValues" Overridable="yes">正在寫入 INI 檔案值</String>
366 <String Id="ProgressTextWriteIniValuesTemplate" Overridable="yes">檔案: [1],區段: [2],機碼: [3],值: [4]</String>
367 <String Id="ProgressTextWriteRegistryValues" Overridable="yes">正在寫入系統登錄值</String>
368 <String Id="ProgressTextWriteRegistryValuesTemplate" Overridable="yes">機碼: [1],名稱: [2],值: [3]</String>
369 <String Id="ProgressTextAdvertise" Overridable="yes">正在通告應用程式</String>
370 <String Id="ProgressTextGenerateScript" Overridable="yes">正在產生動作的指令碼作業:</String>
371 <String Id="ProgressTextGenerateScriptTemplate" Overridable="yes">[1]</String>
372 <String Id="ProgressTextInstallSFPCatalogFile" Overridable="yes">正在安裝系統目錄</String>
373 <String Id="ProgressTextInstallSFPCatalogFileTemplate" Overridable="yes">檔案: [1],相依性: [2]</String>
374 <String Id="ProgressTextMsiPublishAssemblies" Overridable="yes">正在發行組件資訊</String>
375 <String Id="ProgressTextMsiPublishAssembliesTemplate" Overridable="yes">應用程式內容:[1],組件名稱:[2]</String>
376 <String Id="ProgressTextMsiUnpublishAssemblies" Overridable="yes">正在解除發行組件資訊</String>
377 <String Id="ProgressTextMsiUnpublishAssembliesTemplate" Overridable="yes">應用程式內容:[1],組件名稱:[2]</String>
378 <String Id="ProgressTextRollback" Overridable="yes">正在復原的動作:</String>
379 <String Id="ProgressTextRollbackTemplate" Overridable="yes">[1]</String>
380 <String Id="ProgressTextRollbackCleanup" Overridable="yes">正在移除備份檔案</String>
381 <String Id="ProgressTextRollbackCleanupTemplate" Overridable="yes">檔案: [1]</String>
382 <String Id="ProgressTextUnmoveFiles" Overridable="yes">正在移除移動的檔案</String>
383 <String Id="ProgressTextUnmoveFilesTemplate" Overridable="yes">檔案: [1],目錄: [9]</String>
384 <String Id="ProgressTextUnpublishProduct" Overridable="yes">正在解除發行產品資訊</String>
385
386 <String Id="Error0" Overridable="yes">{{嚴重錯誤: }}</String>
387 <String Id="Error1" Overridable="yes">{{錯誤 [1]。}}</String>
388 <String Id="Error2" Overridable="yes">警告 [1]。</String>
389 <String Id="Error4" Overridable="yes">資訊 [1]。</String>
390 <String Id="Error5" Overridable="yes">安裝程式在安裝此套件時發生意外的錯誤。這可能表示此套件有問題。錯誤碼為 [1]。{{引數為: [2]、[3]、[4]}}</String>
391 <String Id="Error7" Overridable="yes">{{磁碟已滿: }}</String>
392 <String Id="Error8" Overridable="yes">動作 [Time]: [1]。[2]</String>
393 <String Id="Error9" Overridable="yes">[ProductName]</String>
394 <String Id="Error10" Overridable="yes">{[2]}{, [3]}{, [4]}</String>
395 <String Id="Error11" Overridable="yes">訊息類型: [1],引數: [2]</String>
396 <String Id="Error12" Overridable="yes">=== 開始記錄時間: [Date] [Time] ===</String>
397 <String Id="Error13" Overridable="yes">=== 停止記錄時間: [Date] [Time] ===</String>
398 <String Id="Error14" Overridable="yes">動作開始 [Time]: [1]。</String>
399 <String Id="Error15" Overridable="yes">動作結束 [Time]: [1]。傳回值 [2]。</String>
400 <String Id="Error16" Overridable="yes">剩餘時間: {[1] 分 }{[2] 秒}</String>
401 <String Id="Error17" Overridable="yes">記憶體不足,重試之前請先關閉其他應用程式。</String>
402 <String Id="Error18" Overridable="yes">安裝程式沒有回應。</String>
403 <String Id="Error19" Overridable="yes">安裝程式太早停止。</String>
404 <String Id="Error20" Overridable="yes">請稍候,Windows 在設定 [ProductName]</String>
405 <String Id="Error21" Overridable="yes">正在蒐集必要的資訊...</String>
406 <String Id="Error22" Overridable="yes">正在移除舊版應用程式...</String>
407 <String Id="Error23" Overridable="yes">正在準備移除舊版應用程式...</String>
408 <String Id="Error32" Overridable="yes">{[ProductName] }安裝成功。</String>
409 <String Id="Error33" Overridable="yes">{[ProductName] }安裝失敗。</String>
410 <String Id="Error1101" Overridable="yes">從檔案 [2] 讀取時發生錯誤。{{系統錯誤 [3]。}} 請確認檔案存在,而且您可以存取它。</String>
411 <String Id="Error1301" Overridable="yes">無法建立檔案 '[2]'。同名的目錄已經存在,請取消安裝然後嘗試安裝至別的位置。</String>
412 <String Id="Error1302" Overridable="yes">請插入磁片: [2]</String>
413 <String Id="Error1303" Overridable="yes">安裝程式的權限不足,無法存取這個目錄: [2],安裝無法繼續,請以管理員身分登入或是與您的系統管理員連絡。</String>
414 <String Id="Error1304" Overridable="yes">寫入檔案 [2] 時發生錯誤。請檢查您是否有存取該目錄的權限。</String>
415 <String Id="Error1305" Overridable="yes">讀取檔案 [2] 時發生錯誤。{{ 系統錯誤 [3]。}} 請確認檔案存在,而且您可以存取它。</String>
416 <String Id="Error1306" Overridable="yes">其他的應用程式對檔案 '[2]' 獨佔存取。請關閉所有其他的應用程式,然後按一下 [\[]重試[\]]。</String>
417 <String Id="Error1307" Overridable="yes">磁碟空間不足,無法安裝這個檔案: [2]。請釋放一些磁碟空間然後按一下 [\[]重試[\]],或按一下 [\[]取消[\]] 結束。</String>
418 <String Id="Error1308" Overridable="yes">找不到來源檔案: [2]。請確認檔案存在,而且您可以存取它。</String>
419 <String Id="Error1309" Overridable="yes">讀取檔案 [3] 時發生錯誤。{{ 系統錯誤 [2]。}} 請確認檔案存在,而且您可以存取它。</String>
420 <String Id="Error1310" Overridable="yes">寫入至檔案時發生錯誤: [3]。{{ 系統錯誤 [2]。}} 請檢查您是否有存取該目錄的權限。</String>
421 <String Id="Error1311" Overridable="yes">找不到來源檔案{{(封包檔)}}: [2]。請確認檔案存在,而且您可以存取它。</String>
422 <String Id="Error1312" Overridable="yes">無法建立目錄 '[2]'。同名的檔案已經存在,請更名或移除此檔案,然後按一下 [\[]重試[\]],或按一下 [\[]取消[\]] 結束。</String>
423 <String Id="Error1313" Overridable="yes">目前無法使用磁碟區 [2],請選取別的磁碟區。</String>
424 <String Id="Error1314" Overridable="yes">指定的路徑 '[2]' 無法使用。</String>
425 <String Id="Error1315" Overridable="yes">無法寫入指定的資料夾: [2]。</String>
426 <String Id="Error1316" Overridable="yes">嘗試讀取檔案時發生網路錯誤: [2]</String>
427 <String Id="Error1317" Overridable="yes">嘗試建立目錄時發生錯誤: [2]</String>
428 <String Id="Error1318" Overridable="yes">嘗試建立目錄時發生網路錯誤: [2]</String>
429 <String Id="Error1319" Overridable="yes">嘗試開啟來源檔案封包時發生網路錯誤: [2]</String>
430 <String Id="Error1320" Overridable="yes">指定的路徑太長: [2]</String>
431 <String Id="Error1321" Overridable="yes">安裝程式的權限不足,無法修改檔案 [2]。</String>
432 <String Id="Error1322" Overridable="yes">部分資料夾路徑 '[2]' 無效。它是空的或超過系統允許的長度。</String>
433 <String Id="Error1323" Overridable="yes">資料夾路徑 '[2]' 含有無效的資料夾路徑字元。</String>
434 <String Id="Error1324" Overridable="yes">資料夾路徑 '[2]' 含有無效的字元。</String>
435 <String Id="Error1325" Overridable="yes">'[2]' 不是有效的短檔名。</String>
436 <String Id="Error1326" Overridable="yes">取得檔案安全性時發生錯誤: [3] GetLastError: [2]</String>
437 <String Id="Error1327" Overridable="yes">無效的磁碟機: [2]</String>
438 <String Id="Error1328" Overridable="yes">將修補套用至檔案 [2] 時發生錯誤。它可能已由其他的方法更新,而不能再由這個修補修改。如需詳細資訊,請連絡您的修補廠商。{{系統錯誤: [3]}}</String>
439 <String Id="Error1329" Overridable="yes">因為封包檔 [2] 未經過數位簽署,所以無法安裝必要的檔案。這可能表示封包檔已損毀。</String>
440 <String Id="Error1330" Overridable="yes">因為封包檔 [2] 具有無效的數位簽章,所以無法安裝必要的檔案。這可能表示封包檔已損毀。{{ WinVerifyTrust 傳回錯誤 [3]。}}</String>
441 <String Id="Error1331" Overridable="yes">無法正確複製 [2] 檔案: CRC 錯誤。</String>
442 <String Id="Error1332" Overridable="yes">無法正確移動 [2] 檔案: CRC 錯誤。</String>
443 <String Id="Error1333" Overridable="yes">無法正確修補 [2] 檔案: CRC 錯誤。</String>
444 <String Id="Error1334" Overridable="yes">因為在封包檔 '[3]' 中找不到檔案 '[2]',所以無法安裝它。這可能表示有網路錯誤、讀取 CD-ROM 時發生錯誤或這個套件有問題。</String>
445 <String Id="Error1335" Overridable="yes">這個安裝所需的封包檔 '[2]' 已損毀而且無法使用。這可能表示有網路錯誤、讀取 CD-ROM 時發生錯誤或這個套件有問題。</String>
446 <String Id="Error1336" Overridable="yes">建立完成此安裝所需的暫存檔時發生錯誤。{{ 資料夾: [3]。系統錯誤碼: [2]}}</String>
447 <String Id="Error1401" Overridable="yes">無法建立機碼: [2]。{{ 系統錯誤 [3]。}} 請檢查您是否有存取該機碼的權限,或連絡您的支援人員。 </String>
448 <String Id="Error1402" Overridable="yes">無法開啟機碼: [2]。{{ 系統錯誤 [3]。}} 請檢查您是否有存取該機碼的權限,或連絡您的支援人員。 </String>
449 <String Id="Error1403" Overridable="yes">無法從機碼 [3] 刪除值 [2]。{{ 系統錯誤 [4]。}} 請檢查您是否有存取該機碼的權限,或連絡您的支援人員。 </String>
450 <String Id="Error1404" Overridable="yes">無法刪除機碼 [2]。{{ 系統錯誤 [3]。}} 請檢查您是否有存取該機碼的權限,或連絡您的支援人員。 </String>
451 <String Id="Error1405" Overridable="yes">無法從機碼 [3] 讀取值 [2]。{{ 系統錯誤 [4]。}} 請檢查您是否有存取該機碼的權限,或連絡您的支援人員。 </String>
452 <String Id="Error1406" Overridable="yes">無法寫入值 [2] 至機碼 [3]。 {{ 系統錯誤 [4]。}} 請檢查您是否有存取該機碼的權限,或連絡您的支援人員。</String>
453 <String Id="Error1407" Overridable="yes">無法取得機碼 [2] 的值名稱。{{ 系統錯誤 [3]。}} 請檢查您是否有存取該機碼的權限,或連絡您的支援人員。</String>
454 <String Id="Error1408" Overridable="yes">無法取得機碼 [2] 的子機碼名稱。{{ 系統錯誤 [3]。}} 請檢查您是否有存取該機碼的權限,或連絡您的支援人員。</String>
455 <String Id="Error1409" Overridable="yes">無法讀取機碼 [2] 的安全性資訊。{{ 系統錯誤 [3]。}} 請檢查您是否有存取該機碼的權限,或連絡您的支援人員。</String>
456 <String Id="Error1410" Overridable="yes">無法增加可用的登錄空間。安裝此應用程式需要 [2] KB 以上的空間。</String>
457 <String Id="Error1500" Overridable="yes">其他的安裝正在進行中,您必須完成該項安裝之後才能繼續。</String>
458 <String Id="Error1501" Overridable="yes">存取安全性資料時發生錯誤,請確定 Windows Installer 是否正確設定,然後再試一次。</String>
459 <String Id="Error1502" Overridable="yes">使用者 '[2]' 之前已經啟動了產品 '[3]' 的安裝。這位使用者必須再次執行安裝才能使用該產品。您目前的安裝將會繼續。</String>
460 <String Id="Error1503" Overridable="yes">使用者 '[2]' 之前已經啟動了產品 '[3]' 的安裝。這位使用者必須再次執行安裝才能使用該產品。</String>
461 <String Id="Error1601" Overridable="yes">磁碟空間不足 -- 磁碟區: '[2]'; 需要空間: [3] KB; 可用空間: [4] KB。請釋放一些空間,然後再重試。</String>
462 <String Id="Error1602" Overridable="yes">您確定要取消嗎 ?</String>
463 <String Id="Error1603" Overridable="yes">檔案 [2][3] 正在使用中 {被下列處理序使用: 名稱: [4],識別碼: [5],視窗標題: '[6]'},請關閉該應用程式然後重試。</String>
464 <String Id="Error1604" Overridable="yes">已經安裝產品 '[2]',無法安裝本產品。這兩項產品不相容。</String>
465 <String Id="Error1605" Overridable="yes">磁碟區 '[2]' 上的磁碟空間不足,無法繼續進行啟用修復功能的安裝。需要 [3] KB 的空間,但是只有 [4] KB 可供使用。請按一下 [\[]忽略[\]] 繼續安裝但不儲存修復資訊,按一下 [\[]重試[\]] 再檢查一次是否有可用的空間,或按一下 [\[]取消[\]] 結束安裝。</String>
466 <String Id="Error1606" Overridable="yes">無法存取網路位置 [2]。</String>
467 <String Id="Error1607" Overridable="yes">繼續安裝之前應先關閉下列應用程式:</String>
468 <String Id="Error1608" Overridable="yes">在此機器上,找不到與本產品相容的舊版產品。</String>
469 <String Id="Error1609" Overridable="yes">套用安全性設定時發生錯誤。[2] 不是有效的使用者或群組。可能是因為套件有問題,或連線至網路上的網域控制站時發生問題。請檢查您的網路連線再按一下 [\[]重試[\]],或按一下 [\[]取消[\]] 結束安裝。{{找不到使用者的 SID,系統錯誤 [3]}}</String>
470 <String Id="Error1701" Overridable="yes">金鑰 [2] 無效。請檢查您輸入的金鑰是否正確。</String>
471 <String Id="Error1702" Overridable="yes">安裝程式必須重新啟動您的系統才能繼續設定 [2]。請按一下 [\[]是[\]] 立即重新啟動,或如果您想要稍後手動重新啟動請按一下 [\[]否[\]]。</String>
472 <String Id="Error1703" Overridable="yes">您必須重新啟動系統,才能使對 [2] 的設定變更生效。請按一下 [\[]是[\]] 立即重新啟動,或如果您想要稍後手動重新啟動請按一下 [\[]否[\]]。</String>
473 <String Id="Error1704" Overridable="yes">[2] 的安裝目前已暫停。您必須復原該安裝所做的變更才能繼續。是否要復原那些變更?</String>
474 <String Id="Error1705" Overridable="yes">本產品先前的安裝正在進行中,您必須復原該安裝所做的變更才能繼續。是否要復原那些變更?</String>
475 <String Id="Error1706" Overridable="yes">找不到產品 [2] 的安裝套件。請試著使用有效的安裝套件 '[3]' 再安裝一次。</String>
476 <String Id="Error1707" Overridable="yes">安裝已成功完成。</String>
477 <String Id="Error1708" Overridable="yes">安裝失敗。</String>
478 <String Id="Error1709" Overridable="yes">產品: [2] -- [3]</String>
479 <String Id="Error1710" Overridable="yes">您可以將電腦還原成先前的狀態或稍後再繼續安裝。要還原嗎?</String>
480 <String Id="Error1711" Overridable="yes">寫入安裝資訊至磁碟時發生錯誤。請檢查確定有足夠的可用磁碟空間,然後按一下 [\[]重試[\]],或按一下 [\[]取消[\]] 結束安裝。</String>
481 <String Id="Error1712" Overridable="yes">找不到將您的電腦還原為之前狀態所需的一個或多個檔案。無法還原。</String>
482 <String Id="Error1713" Overridable="yes">[2] 無法安裝其中一項必要的產品。請連絡技術支援團隊。{{系統錯誤: [3]。}}</String>
483 <String Id="Error1714" Overridable="yes">無法移除舊版的 [2]。請連絡技術支援團隊。{{系統錯誤: [3]。}}</String>
484 <String Id="Error1715" Overridable="yes">已安裝 [2]</String>
485 <String Id="Error1716" Overridable="yes">已設定 [2]</String>
486 <String Id="Error1717" Overridable="yes">已移除 [2]</String>
487 <String Id="Error1718" Overridable="yes">檔案 [2] 已因數位簽章原則而被拒絕。</String>
488 <String Id="Error1719" Overridable="yes">無法存取 Windows Installer 服務。如果您在安全模式中執行 Windows,或者並未正確安裝 Windows Installer,便會發生這個問題。請連絡支援人員取得協助。</String>
489 <String Id="Error1720" Overridable="yes">這個 Windows Installer 套件有問題。有個完成此安裝所需的指令碼無法執行。請連絡支援人員或套件廠商。{{自訂動作 [2] 指令碼錯誤 [3], [4]: [5] 行 [6], 欄 [7], [8] }}</String>
490 <String Id="Error1721" Overridable="yes">這個 Windows Installer 套件有問題。有個完成此安裝所需的程式無法執行。請連絡支援人員或套件廠商。{{動作: [2], 位置: [3], 命令: [4] }}</String>
491 <String Id="Error1722" Overridable="yes">這個 Windows Installer 套件有問題。有個安裝程式中包含的程式並未如預期完成。請連絡支援人員或套件廠商。{{動作 [2], 位置: [3], 命令: [4] }}</String>
492 <String Id="Error1723" Overridable="yes">這個 Windows Installer 套件有問題。有個完成此安裝所需的 DLL 無法執行。請連絡支援人員或套件廠商。{{動作 [2], 項目: [3], 程式庫: [4] }}</String>
493 <String Id="Error1724" Overridable="yes">移除已順利完成。</String>
494 <String Id="Error1725" Overridable="yes">移除失敗。</String>
495 <String Id="Error1726" Overridable="yes">通告已順利完成。</String>
496 <String Id="Error1727" Overridable="yes">通知失敗。</String>
497 <String Id="Error1728" Overridable="yes">設定已順利完成。</String>
498 <String Id="Error1729" Overridable="yes">設定失敗。</String>
499 <String Id="Error1730" Overridable="yes">您必須是系統管理員才能移除這個應用程式。如果要移除這個應用程式,請以系統管理員身分登入,或連絡技術支援人員取得協助。</String>
500 <String Id="Error1731" Overridable="yes">產品 [2] 的來源安裝套件與用戶端套件不同步。請使用有效的安裝套件 '[3]' 再安裝一次。</String>
501 <String Id="Error1732" Overridable="yes">若要完成 [2] 的安裝,您必須重新啟動電腦。這部電腦目前有其他使用者登入,重新啟動可能會造成他們工作遺失。是否要立即重新啟動?</String>
502 <String Id="Error1801" Overridable="yes">路徑 [2] 無效。請指定有效的路徑。</String>
503 <String Id="Error1802" Overridable="yes">記憶體不足,重試之前請先關閉其他應用程式。</String>
504 <String Id="Error1803" Overridable="yes">磁碟機 [2] 中沒有磁片,請插入磁片然後按一下 [\[]重試[\]],或按一下 [\[]取消[\]] 回到上次選取的磁碟機代號。</String>
505 <String Id="Error1804" Overridable="yes">磁碟機 [2] 中沒有磁片,請插入磁片然後按一下 [\[]重試[\]],或按一下 [\[]取消[\]] 返回瀏覽對話方塊,並選取其他磁碟機代號。</String>
506 <String Id="Error1805" Overridable="yes">資料夾 [2] 不存在,請輸入現有資料夾的路徑。</String>
507 <String Id="Error1806" Overridable="yes">您的權限不足,無法讀取這個資料夾。</String>
508 <String Id="Error1807" Overridable="yes">無法判斷安裝的有效目的地資料夾。</String>
509 <String Id="Error1901" Overridable="yes">嘗試讀取來源安裝資料庫時發生錯誤: [2]。</String>
510 <String Id="Error1902" Overridable="yes">正在排定重新開機作業: 正在將 [2] 重新命名為 [3]。必須重新開機才能完成作業。</String>
511 <String Id="Error1903" Overridable="yes">正在排定重新開機作業: 正在刪除檔案 [2]。必須重新開機才能完成作業。</String>
512 <String Id="Error1904" Overridable="yes">模組 [2] 無法註冊。HRESULT [3]。請連絡支援人員。</String>
513 <String Id="Error1905" Overridable="yes">模組 [2] 無法解除註冊。HRESULT [3]。請連絡支援人員。</String>
514 <String Id="Error1906" Overridable="yes">無法快取封裝 [2]。錯誤: [3]。請連絡支援人員。</String>
515 <String Id="Error1907" Overridable="yes">無法註冊字型 [2]。請確認您有安裝字型的足夠權限,且系統支援此字型。</String>
516 <String Id="Error1908" Overridable="yes">無法解除註冊字型 [2]。請確認您有移除字型的足夠權限。</String>
517 <String Id="Error1909" Overridable="yes">無法建立捷徑 [2]。請確認目的地資料夾是否存在,且您可以存取它。</String>
518 <String Id="Error1910" Overridable="yes">無法移除捷徑 [2]。請確認捷徑檔案是否存在,且您可以存取它。</String>
519 <String Id="Error1911" Overridable="yes">無法註冊檔案 [2] 的型別程式庫。請連絡支援人員。</String>
520 <String Id="Error1912" Overridable="yes">無法解除註冊檔案 [2] 的型別程式庫。請連絡支援人員。</String>
521 <String Id="Error1913" Overridable="yes">無法更新 INI 檔 [2][3]。請確認檔案存在,而且您可以存取它。</String>
522 <String Id="Error1914" Overridable="yes">無法排定檔案 [2] 在重新開機時取代檔案 [3]。請確認您具有檔案 [3] 的寫入權限。</String>
523 <String Id="Error1915" Overridable="yes">移除 ODBC 驅動程式管理員時發生錯誤,ODBC 錯誤 [2]: [3]。請連絡支援人員。</String>
524 <String Id="Error1916" Overridable="yes">安裝 ODBC 驅動程式管理員時發生錯誤,ODBC 錯誤 [2]: [3]。請連絡支援人員。</String>
525 <String Id="Error1917" Overridable="yes">移除 ODBC 驅動程式時發生錯誤: [4],ODBC 錯誤 [2]: [3]。請確認您有移除 ODBC 驅動程式的足夠權限。</String>
526 <String Id="Error1918" Overridable="yes">安裝 ODBC 驅動程式時發生錯誤: [4],ODBC 錯誤 [2]: [3]。請確認檔案 [4] 是否存在,且您可以存取它。</String>
527 <String Id="Error1919" Overridable="yes">設定 ODBC 資料來源時發生錯誤: [4],ODBC 錯誤 [2]: [3]。請確認檔案 [4] 是否存在,且您可以存取它。</String>
528 <String Id="Error1920" Overridable="yes">服務 '[2]' ([3]) 無法啟動。請確認您有啟動系統服務的足夠權限。</String>
529 <String Id="Error1921" Overridable="yes">服務 '[2]' ([3]) 無法停止。請確認您有停止系統服務的足夠權限。</String>
530 <String Id="Error1922" Overridable="yes">服務 '[2]' ([3]) 無法刪除。請確認您有移除系統服務的足夠權限。</String>
531 <String Id="Error1923" Overridable="yes">服務 '[2]' ([3]) 無法安裝。請確認您有安裝系統服務的足夠權限。</String>
532 <String Id="Error1924" Overridable="yes">無法更新環境變數 '[2]'。請確認您有修改環境變數的足夠權限。</String>
533 <String Id="Error1925" Overridable="yes">您沒有足夠的權限為此電腦上的所有使用者完成此安裝。請以系統管理員身分登入,然後再重試此安裝。</String>
534 <String Id="Error1926" Overridable="yes">無法設定檔案 '[3]' 的檔案安全性。錯誤: [2]。請確認您有修改此檔案安全性權限的足夠權限。</String>
535 <String Id="Error1927" Overridable="yes">這台電腦並未安裝 Component Services (COM+ 1.0)。這項安裝需要有 Component Services 才能順利完成。Component Services 包含在 Windows 2000 中。</String>
536 <String Id="Error1928" Overridable="yes">註冊 COM+ 應用程式時發生錯誤。請連絡支援人員取得詳細資訊。</String>
537 <String Id="Error1929" Overridable="yes">解除註冊 COM+ 應用程式時發生錯誤。請連絡支援人員取得詳細資訊。</String>
538 <String Id="Error1930" Overridable="yes">無法變更服務 '[2]' ([3]) 的描述。</String>
539 <String Id="Error1931" Overridable="yes">Windows Installer 服務無法更新系統檔案 [2],因為檔案受到 Windows 保護。可能需要更新您的作業系統才能正確執行這個程式。{{封裝版本: [3],OS 保護的版本: [4]}}</String>
540 <String Id="Error1932" Overridable="yes">Windows Installer 服務無法更新受保護的 Windows 檔案 [2]。{{封裝裝版本: [3],OS 受保護的版本: [4],SFP 錯誤: [5]}}</String>
541 <String Id="Error1933" Overridable="yes">Windows Installer 服務無法更新一或多個受保護的 Windows 檔案。{{SFP 錯誤: [2]。受保護的檔案清單:\r\n[3]}}</String>
542 <String Id="Error1934" Overridable="yes">電腦上的使用者安裝已透過原則停用。</String>
543 <String Id="Error1935" Overridable="yes">組件 '[6]' 安裝期間發生錯誤。請參閱說明與支援取得詳細資訊。HRESULT: [3]。{{組件介面: [4], 功能: [5], 元件: [2]}}</String>
544 <String Id="Error1936" Overridable="yes">組件 '[6]' 安裝期間發生錯誤。此組件不是以強式名稱命名,或未以最短金鑰長度簽章。HRESULT: [3]。{{組件介面: [4], 功能: [5], 元件: [2]}}</String>
545 <String Id="Error1937" Overridable="yes">組件 '[6]' 安裝期間發生錯誤。簽章或目錄無法驗證或無效。HRESULT: [3]。{{組件介面: [4], 功能: [5], 元件: [2]}}</String>
546 <String Id="Error1938" Overridable="yes">組件 '[6]' 安裝期間發生錯誤。有一或多個組件的模組找不到。HRESULT: [3]。{{組件介面: [4], 功能: [5], 元件: [2]}}</String>
547
548 <String Id="UITextbytes" Overridable="yes">位元組</String>
549 <String Id="UITextGB" Overridable="yes">GB</String>
550 <String Id="UITextKB" Overridable="yes">KB</String>
551 <String Id="UITextMB" Overridable="yes">MB</String>
552 <String Id="UITextMenuAbsent" Overridable="yes">整個功能將無法使用</String>
553 <String Id="UITextMenuAdvertise" Overridable="yes">功能會在必要時才安裝</String>
554 <String Id="UITextMenuAllCD" Overridable="yes">整個功能將安裝成從光碟執行</String>
555 <String Id="UITextMenuAllLocal" Overridable="yes">整個功能將安裝在本機硬碟上</String>
556 <String Id="UITextMenuAllNetwork" Overridable="yes">整個功能將安裝成從網路執行</String>
557 <String Id="UITextMenuCD" Overridable="yes">將安裝成從光碟執行</String>
558 <String Id="UITextMenuLocal" Overridable="yes">將安裝在本機硬碟上</String>
559 <String Id="UITextMenuNetwork" Overridable="yes">將安裝成從網路執行</String>
560 <String Id="UITextNewFolder" Overridable="yes">資料夾|新資料夾</String>
561 <String Id="UITextScriptInProgress" Overridable="yes">正在蒐集必要的資訊...</String>
562 <String Id="UITextSelAbsentAbsent" Overridable="yes">這項功能將保持未安裝的狀態</String>
563 <String Id="UITextSelAbsentAdvertise" Overridable="yes">這項功能將設定成在必要時才安裝</String>
564 <String Id="UITextSelAbsentCD" Overridable="yes">這項功能將安裝成從光碟執行</String>
565 <String Id="UITextSelAbsentLocal" Overridable="yes">這項功能將安裝在本機硬碟上</String>
566 <String Id="UITextSelAbsentNetwork" Overridable="yes">這項功能將安裝成從網路執行</String>
567 <String Id="UITextSelAdvertiseAbsent" Overridable="yes">這項功能將無法使用</String>
568 <String Id="UITextSelAdvertiseAdvertise" Overridable="yes">將會在必要時才安裝</String>
569 <String Id="UITextSelAdvertiseCD" Overridable="yes">這項功能將可從光碟執行</String>
570 <String Id="UITextSelAdvertiseLocal" Overridable="yes">這項功能將安裝在本機硬碟上</String>
571 <String Id="UITextSelAdvertiseNetwork" Overridable="yes">這項功能將可從網路執行</String>
572 <String Id="UITextSelCDAbsent" Overridable="yes">將完全解除安裝這項功能,且無法從光碟執行</String>
573 <String Id="UITextSelCDAdvertise" Overridable="yes">這項功能原本是從光碟執行,將變更為在必要時才安裝</String>
574 <String Id="UITextSelCDCD" Overridable="yes">這項功能將繼續從光碟執行</String>
575 <String Id="UITextSelCDLocal" Overridable="yes">這項功能原本是從光碟執行,將變更為安裝到本機硬碟</String>
576 <String Id="UITextSelChildCostNeg" Overridable="yes">這個功能會釋放 [1] 的硬碟空間。</String>
577 <String Id="UITextSelChildCostPos" Overridable="yes">這個功能需要 [1] 的硬碟空間。</String>
578 <String Id="UITextSelCostPending" Overridable="yes">正在編譯這個功能的花費...</String>
579 <String Id="UITextSelLocalAbsent" Overridable="yes">這項功能將完全移除</String>
580 <String Id="UITextSelLocalAdvertise" Overridable="yes">這項功能將從本機硬碟移除,但設定成必要時才安裝</String>
581 <String Id="UITextSelLocalCD" Overridable="yes">這項功能將從本機硬碟移除,但仍然可以從光碟執行</String>
582 <String Id="UITextSelLocalLocal" Overridable="yes">這項功能將保留在您的本機硬碟上</String>
583 <String Id="UITextSelLocalNetwork" Overridable="yes">這項功能將從本機硬碟移除,但仍然可以從網路執行</String>
584 <String Id="UITextSelNetworkAbsent" Overridable="yes">將完全解除安裝這項功能,且無法從網路執行</String>
585 <String Id="UITextSelNetworkAdvertise" Overridable="yes">這項功能原本是從網路執行,將變更為在必要時才安裝</String>
586 <String Id="UITextSelNetworkLocal" Overridable="yes">這項功能原本是從網路執行,將變更為安裝到本機硬碟</String>
587 <String Id="UITextSelNetworkNetwork" Overridable="yes">這項功能將繼續從網路執行</String>
588 <String Id="UITextSelParentCostNegNeg" Overridable="yes">這個功能會釋放 [1] 的硬碟空間。已選擇 [2] 個 (共 [3] 個) 子功能。子功能會釋放 [4] 的硬碟空間。</String>
589 <String Id="UITextSelParentCostNegPos" Overridable="yes">這個功能會釋放 [1] 的硬碟空間。已選擇 [2] 個 (共 [3] 個) 子功能。子功能需要 [4] 的硬碟空間。</String>
590 <String Id="UITextSelParentCostPosNeg" Overridable="yes">這個功能需要 [1] 的硬碟空間。已選擇 [2] 個 (共 [3] 個) 子功能。子功能會釋放 [4] 的硬碟空間。</String>
591 <String Id="UITextSelParentCostPosPos" Overridable="yes">這個功能需要 [1] 的硬碟空間。已選擇 [2] 個 (共 [3] 個) 子功能。子功能需要 [4] 的硬碟空間。</String>
592 <String Id="UITextTimeRemaining" Overridable="yes">剩餘時間: {[1] 分 }{[2] 秒}</String>
593 <String Id="UITextVolumeCostAvailable" Overridable="yes">可用</String>
594 <String Id="UITextVolumeCostDifference" Overridable="yes">差異</String>
595 <String Id="UITextVolumeCostRequired" Overridable="yes">需要</String>
596 <String Id="UITextVolumeCostSize" Overridable="yes">磁碟大小</String>
597 <String Id="UITextVolumeCostVolume" Overridable="yes">磁碟區</String>
598</WixLocalization>
diff --git a/src/ext/UI/wixlib/WixUI_zh-TW.wxl b/src/ext/UI/wixlib/WixUI_zh-TW.wxl
new file mode 100644
index 00000000..004b530e
--- /dev/null
+++ b/src/ext/UI/wixlib/WixUI_zh-TW.wxl
@@ -0,0 +1,598 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3
4
5<WixLocalization Culture="zh-tw" Codepage="950" xmlns="http://wixtoolset.org/schemas/v4/wxl">
6 <String Id="WixUIBack" Overridable="yes">上一步(&amp;B)</String>
7 <String Id="WixUINext" Overridable="yes">下一步(&amp;N)</String>
8 <String Id="WixUICancel" Overridable="yes">取消</String>
9 <String Id="WixUIFinish" Overridable="yes">完成(&amp;F)</String>
10 <String Id="WixUIRetry" Overridable="yes">重試(&amp;R)</String>
11 <String Id="WixUIIgnore" Overridable="yes">忽略(&amp;I)</String>
12 <String Id="WixUIYes" Overridable="yes">是(&amp;Y)</String>
13 <String Id="WixUINo" Overridable="yes">否(&amp;N)</String>
14 <String Id="WixUIOK" Overridable="yes">確定</String>
15 <String Id="WixUIPrint" Overridable="yes">列印(&amp;P)</String>
16
17 <String Id="AdvancedWelcomeEulaDlg_Title" Overridable="yes">[ProductName] 安裝程式</String>
18 <String Id="AdvancedWelcomeEulaDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
19 <String Id="AdvancedWelcomeEulaDlgTitle" Overridable="yes">{\WixUI_Font_Title}請閱讀 [ProductName] 授權合約</String>
20 <String Id="AdvancedWelcomeEulaDlgLicenseAcceptedCheckBox" Overridable="yes">我接受授權合約中的條款(&amp;A)</String>
21 <String Id="AdvancedWelcomeEulaDlgDescriptionPerMachine" Overridable="yes">按一下 [\[]安裝[\]] 以預設選項為所有使用者安裝產品。按一下 [\[]進階[\]] 可變更安裝選項。</String>
22 <String Id="AdvancedWelcomeEulaDlgDescriptionPerUser" Overridable="yes">按一下 [\[]安裝[\]] 以預設選項僅為您安裝產品。按一下 [\[]進階[\]] 可變更安裝選項。</String>
23 <String Id="AdvancedWelcomeEulaDlgInstall" Overridable="yes">安裝(&amp;I)</String>
24 <String Id="AdvancedWelcomeEulaDlgAdvanced" Overridable="yes">進階(&amp;D)</String>
25 <String Id="Advanced_Font_Normal_Size" Overridable="yes">9</String>
26 <String Id="Advanced_Font_Bigger_Size" Overridable="yes">12</String>
27 <String Id="Advanced_Font_Title_Size" Overridable="yes">9</String>
28 <String Id="Advanced_Font_Emphasized_Size" Overridable="yes">9</String>
29 <String Id="Advanced_Font_FaceName" Overridable="yes">Tahoma</String>
30
31 <String Id="BrowseDlg_Title" Overridable="yes">[ProductName] 安裝程式</String>
32 <String Id="BrowseDlgComboLabel" Overridable="yes">查詢(&amp;L):</String>
33 <String Id="BrowseDlgWixUI_Bmp_Up" Overridable="yes">WixUI_Bmp_Up</String>
34 <String Id="BrowseDlgWixUI_Bmp_UpTooltip" Overridable="yes">上移一層</String>
35 <String Id="BrowseDlgNewFolder" Overridable="yes">WixUI_Bmp_New</String>
36 <String Id="BrowseDlgNewFolderTooltip" Overridable="yes">建立新資料夾</String>
37 <String Id="BrowseDlgPathLabel" Overridable="yes">資料夾名稱(&amp;F):</String>
38 <String Id="BrowseDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
39 <String Id="BrowseDlgDescription" Overridable="yes">瀏覽到目的地資料夾</String>
40 <String Id="BrowseDlgTitle" Overridable="yes">{\WixUI_Font_Title}變更目的地資料夾</String>
41
42 <String Id="CancelDlg_Title" Overridable="yes">[ProductName] 安裝程式</String>
43 <String Id="CancelDlgText" Overridable="yes">您確定要取消 [ProductName] 安裝嗎?</String>
44 <String Id="CancelDlgIcon" Overridable="yes">WixUI_Ico_Info</String>
45 <String Id="CancelDlgIconTooltip" Overridable="yes">資訊圖示</String>
46
47 <String Id="CustomizeDlg_Title" Overridable="yes">[ProductName] 安裝程式</String>
48 <String Id="CustomizeDlgTree" Overridable="yes">選項樹狀目錄</String>
49 <String Id="CustomizeDlgBrowse" Overridable="yes">瀏覽(&amp;R)...</String>
50 <String Id="CustomizeDlgReset" Overridable="yes">重設(&amp;S)</String>
51 <String Id="CustomizeDlgDiskCost" Overridable="yes">磁碟使用量(&amp;U)</String>
52 <String Id="CustomizeDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
53 <String Id="CustomizeDlgText" Overridable="yes">按一下下面樹狀結構中的圖示,可變更每項功能的安裝方式。</String>
54 <String Id="CustomizeDlgDescription" Overridable="yes">選取您想要的功能安裝方式。</String>
55 <String Id="CustomizeDlgTitle" Overridable="yes">{\WixUI_Font_Title}自訂安裝</String>
56 <String Id="CustomizeDlgItemDescription" Overridable="yes">CustomizeDlgItemDescription-CustomizeDlgItemDescription</String>
57 <String Id="CustomizeDlgItemSize" Overridable="yes">CustomizeDlgItemSize-CustomizeDlgItemSize</String>
58 <String Id="CustomizeDlgLocation" Overridable="yes">CustomizeDlgLocation-CustomizeDlgLocation</String>
59 <String Id="CustomizeDlgLocationLabel" Overridable="yes">位置:</String>
60
61 <String Id="DiskCostDlg_Title" Overridable="yes">[ProductName] 安裝程式</String>
62 <String Id="DiskCostDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
63 <String Id="DiskCostDlgText" Overridable="yes">反白顯示的磁碟區沒有足夠磁碟空間可供選取的功能使用。您可以從反白顯示的磁碟區移除一些檔案、安裝較少功能,或是選取其他目的地磁碟機。</String>
64 <String Id="DiskCostDlgDescription" Overridable="yes">安裝已選取功能所需的磁碟空間。</String>
65 <String Id="DiskCostDlgTitle" Overridable="yes">{\WixUI_Font_Title}磁碟空間需求</String>
66 <String Id="DiskCostDlgVolumeList" Overridable="yes">{120}{70}{70}{70}{70}</String>
67
68 <String Id="ErrorDlg_Title" Overridable="yes">[ProductName] 安裝程式</String>
69 <String Id="ErrorDlgErrorText" Overridable="yes">資訊文字</String>
70 <String Id="ErrorDlgErrorIcon" Overridable="yes">WixUI_Ico_Info</String>
71 <String Id="ErrorDlgErrorIconTooltip" Overridable="yes">資訊圖示</String>
72
73 <String Id="ExitDialog_Title" Overridable="yes">[ProductName] 安裝程式</String>
74 <String Id="ExitDialogBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
75 <String Id="ExitDialogDescription" Overridable="yes">按一下 [\[]完成[\]] 按鈕結束安裝精靈。</String>
76 <String Id="ExitDialogTitle" Overridable="yes">{\WixUI_Font_Bigger}已完成 [ProductName] 安裝精靈</String>
77
78 <String Id="FatalError_Title" Overridable="yes">[ProductName] 安裝程式</String>
79 <String Id="FatalErrorBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
80 <String Id="FatalErrorTitle" Overridable="yes">{\WixUI_Font_Bigger}[ProductName] 安裝精靈提前結束</String>
81 <String Id="FatalErrorDescription1" Overridable="yes">[ProductName] 安裝精靈因發生錯誤而提前結束,您的系統尚未被修改。若要稍後再安裝此程式,請再執行一次安裝精靈。</String>
82 <String Id="FatalErrorDescription2" Overridable="yes">按一下 [\[]完成[\]] 按鈕結束安裝精靈。</String>
83
84 <String Id="FeaturesDlg_Title" Overridable="yes">[ProductName] 安裝程式</String>
85 <String Id="FeaturesDlgTree" Overridable="yes">產品功能</String>
86 <String Id="FeaturesDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
87 <String Id="FeaturesDlgDescription" Overridable="yes">選取您想要的功能安裝方式。</String>
88 <String Id="FeaturesDlgTitle" Overridable="yes">{\WixUI_Font_Title}產品功能</String>
89 <String Id="FeaturesDlgItemDescription" Overridable="yes">FeaturesDlgItemDescription</String>
90 <String Id="FeaturesDlgItemSize" Overridable="yes">FeaturesDlgItemSize</String>
91 <String Id="FeaturesDlgInstall" Overridable="yes">安裝(&amp;I)</String>
92 <String Id="FeaturesDlgChange" Overridable="yes">變更(&amp;C)</String>
93
94 <String Id="FilesInUse_Title" Overridable="yes">[ProductName] 安裝程式</String>
95 <String Id="FilesInUseExit" Overridable="yes">結束(&amp;X)</String>
96 <String Id="FilesInUseBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
97 <String Id="FilesInUseText" Overridable="yes">下列應用程式正在使用要由此安裝程式更新的檔案。請按 [\[]結束[\]] 結束,或關閉這些應用程式,然後按一下 [\[]重試[\]] 繼續進行安裝(&amp;R)</String>
98 <String Id="FilesInUseDescription" Overridable="yes">有些需要更新的檔案目前正在使用中。</String>
99 <String Id="FilesInUseTitle" Overridable="yes">{\WixUI_Font_Title}檔案使用中</String>
100
101 <String Id="InstallDirDlg_Title" Overridable="yes">[ProductName] 安裝程式</String>
102 <String Id="InstallDirDlgChange" Overridable="yes">變更(&amp;C)...</String>
103 <String Id="InstallDirDlgTitle" Overridable="yes">{\WixUI_Font_Title}目的地資料夾</String>
104 <String Id="InstallDirDlgDescription" Overridable="yes">按一下 [\[]下一步[\]] 安裝至預設資料夾,或按一下 [\[]變更[\]] 選擇其他位置。</String>
105 <String Id="InstallDirDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
106 <String Id="InstallDirDlgFolderLabel" Overridable="yes">安裝 [ProductName] 到:</String>
107
108 <String Id="InstallScopeDlg_Title" Overridable="yes">[ProductName] 安裝程式</String>
109 <String Id="InstallScopeDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
110 <String Id="InstallScopeDlgDescription" Overridable="yes">選擇安裝範圍和資料夾</String>
111 <String Id="InstallScopeDlgTitle" Overridable="yes">{\WixUI_Font_Title}安裝範圍</String>
112 <String Id="InstallScopeDlgPerUser" Overridable="yes">{\WixUI_Font_Emphasized}僅為您安裝 ([LogonUser])(&amp;J)</String>
113 <String Id="InstallScopeDlgPerUserDescription" Overridable="yes">[ProductName] 將安裝在個別使用者資料夾中,並且僅供您的使用者帳戶使用。您不需要本機系統管理員權限。</String>
114 <String Id="InstallScopeDlgNoPerUserDescription" Overridable="yes">[ProductName] 不支援個別使用者安裝。</String>
115 <String Id="InstallScopeDlgPerMachine" Overridable="yes">{\WixUI_Font_Emphasized}為這部電腦的所有使用者安裝(&amp;M)</String>
116 <String Id="InstallScopeDlgPerMachineDescription" Overridable="yes">[ProductName] 將依預設安裝在個別電腦資料夾中,並且可供所有使用者使用。您可以變更預設安裝資料夾。您必須擁有本機系統管理員權限。</String>
117 <String Id="InstallScopeDlgFolderLabel" Overridable="yes">安裝資料夾(&amp;F):</String>
118 <String Id="InstallScopeDlgChange" Overridable="yes">變更(&amp;C)...</String>
119
120 <String Id="InvalidDirDlg_Title" Overridable="yes">[ProductName] 安裝程式</String>
121 <String Id="InvalidDirDlgText" Overridable="yes">安裝目錄必須在本機硬碟上。</String>
122 <String Id="InvalidDirDlgIcon" Overridable="yes">WixUI_Ico_Info</String>
123 <String Id="InvalidDirDlgIconTooltip" Overridable="yes">資訊圖示</String>
124
125 <String Id="LicenseAgreementDlg_Title" Overridable="yes">[ProductName] 安裝程式</String>
126 <String Id="LicenseAgreementDlgLicenseAcceptedCheckBox" Overridable="yes">我接受授權合約中的條款(&amp;A)</String>
127 <String Id="LicenseAgreementDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
128 <String Id="LicenseAgreementDlgDescription" Overridable="yes">請仔細閱讀下面的授權合約</String>
129 <String Id="LicenseAgreementDlgTitle" Overridable="yes">{\WixUI_Font_Title}使用者授權合約</String>
130
131 <String Id="MaintenanceTypeDlg_Title" Overridable="yes">[ProductName] 安裝程式</String>
132 <String Id="MaintenanceTypeDlgChangeButton" Overridable="yes">變更(&amp;C)</String>
133 <String Id="MaintenanceTypeDlgChangeButtonTooltip" Overridable="yes">變更安裝</String>
134 <String Id="MaintenanceTypeDlgRepairButton" Overridable="yes">修復(&amp;P)</String>
135 <String Id="MaintenanceTypeDlgRepairButtonTooltip" Overridable="yes">修復安裝</String>
136 <String Id="MaintenanceTypeDlgRemoveButton" Overridable="yes">移除(&amp;R)</String>
137 <String Id="MaintenanceTypeDlgRemoveButtonTooltip" Overridable="yes">移除安裝</String>
138 <String Id="MaintenanceTypeDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
139 <String Id="MaintenanceTypeDlgDescription" Overridable="yes">選取您要執行的作業。</String>
140 <String Id="MaintenanceTypeDlgTitle" Overridable="yes">{\WixUI_Font_Title}變更、修復或移除安裝</String>
141 <String Id="MaintenanceTypeDlgChangeText" Overridable="yes">讓您變更各項功能安裝的方式。</String>
142 <String Id="MaintenanceTypeDlgChangeDisabledText" Overridable="yes">[ProductName] 沒有可以單獨選取的功能。</String>
143 <String Id="MaintenanceTypeDlgRemoveText" Overridable="yes">從您的電腦移除 [ProductName]。</String>
144 <String Id="MaintenanceTypeDlgRemoveDisabledText" Overridable="yes">[ProductName] 無法移除。</String>
145 <String Id="MaintenanceTypeDlgRepairText" Overridable="yes">藉由修正遺失及損毀的檔案、捷徑和登錄項目修復最近安裝中的錯誤。</String>
146 <String Id="MaintenanceTypeDlgRepairDisabledText" Overridable="yes">[ProductName] 無法修復。</String>
147
148 <String Id="MaintenanceWelcomeDlg_Title" Overridable="yes">[ProductName] 安裝程式</String>
149 <String Id="MaintenanceWelcomeDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
150 <String Id="MaintenanceWelcomeDlgDescription" Overridable="yes">安裝精靈可以讓您變更 [ProductName] 功能安裝在電腦上的方式,或從電腦移除它們。請按 [\[]下一步[\]] 繼續進行,或按 [\[]取消[\]] 結束安裝精靈。</String>
151 <String Id="MaintenanceWelcomeDlgTitle" Overridable="yes">{\WixUI_Font_Bigger}歡迎使用 [ProductName] 安裝精靈</String>
152
153 <String Id="MsiRMFilesInUse_Title" Overridable="yes">[ProductName] 安裝程式</String>
154 <String Id="MsiRMFilesInUseBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
155 <String Id="MsiRMFilesInUseText" Overridable="yes">下列應用程式正在使用要由此安裝程式更新的檔案。您可以讓安裝精靈關閉它們,稍後再嘗試重新啟動它們或重新啟動電腦。</String>
156 <String Id="MsiRMFilesInUseDescription" Overridable="yes">有些需要更新的檔案目前正在使用中。</String>
157 <String Id="MsiRMFilesInUseTitle" Overridable="yes">{\WixUI_Font_Title}檔案使用中</String>
158 <String Id="MsiRMFilesInUseUseRM" Overridable="yes">關閉應用程式,稍後再嘗試重新啟動它們(&amp;C)</String>
159 <String Id="MsiRMFilesInUseDontUseRM" Overridable="yes">不關閉應用程式,必須重新開機(&amp;D)</String>
160
161 <String Id="OutOfDiskDlg_Title" Overridable="yes">[ProductName] 安裝程式</String>
162 <String Id="OutOfDiskDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
163 <String Id="OutOfDiskDlgText" Overridable="yes">反白顯示的磁碟區沒有足夠磁碟空間可供目前選取的功能使用。您可以從反白顯示的磁碟區移除一些檔案、安裝較少功能,或是選取其他目的地磁碟機。</String>
164 <String Id="OutOfDiskDlgDescription" Overridable="yes">安裝所需的磁碟空間超過可用的磁碟空間。</String>
165 <String Id="OutOfDiskDlgTitle" Overridable="yes">{\WixUI_Font_Title}磁碟空間不足</String>
166 <String Id="OutOfDiskDlgVolumeList" Overridable="yes">{120}{70}{70}{70}{70}</String>
167
168 <String Id="OutOfRbDiskDlg_Title" Overridable="yes">[ProductName] 安裝程式</String>
169 <String Id="OutOfRbDiskDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
170 <String Id="OutOfRbDiskDlgText" Overridable="yes">反白顯示的磁碟區沒有足夠磁碟空間可供目前選取的功能使用。您可以從反白顯示的磁碟區移除一些檔案、安裝較少功能,或是選取其他目的地磁碟機。</String>
171 <String Id="OutOfRbDiskDlgDescription" Overridable="yes">安裝所需的磁碟空間超過可用的磁碟空間。</String>
172 <String Id="OutOfRbDiskDlgTitle" Overridable="yes">{\WixUI_Font_Title}磁碟空間不足</String>
173 <String Id="OutOfRbDiskDlgVolumeList" Overridable="yes">{120}{70}{70}{70}{70}</String>
174 <String Id="OutOfRbDiskDlgText2" Overridable="yes">或者,您可以選擇停用安裝程式的復原功能。停用復原會阻礙安裝程式在安裝受到任何形式的中斷時,將電腦還原成原先的狀態。如果您願意承擔停用復原功能的風險,請按一下 [\[]是[\]]。</String>
175
176 <String Id="PrepareDlg_Title" Overridable="yes">[ProductName] 安裝程式</String>
177 <String Id="PrepareDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
178 <String Id="PrepareDlgDescription" Overridable="yes">安裝精靈正在準備引導您完成安裝,請稍候。</String>
179 <String Id="PrepareDlgTitle" Overridable="yes">{\WixUI_Font_Bigger}歡迎使用 [ProductName] 安裝精靈</String>
180
181 <String Id="ProgressDlg_Title" Overridable="yes">[ProductName] 安裝程式</String>
182 <String Id="ProgressDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
183 <String Id="ProgressDlgTextInstalling" Overridable="yes">安裝程式精靈正在安裝 [ProductName],請稍候。</String>
184 <String Id="ProgressDlgTitleInstalling" Overridable="yes">{\WixUI_Font_Title}正在安裝 [ProductName]</String>
185 <String Id="ProgressDlgTextChanging" Overridable="yes">安裝精靈正在變更 [ProductName],請稍候。</String>
186 <String Id="ProgressDlgTitleChanging" Overridable="yes">{\WixUI_Font_Title}正在變更 [ProductName]</String>
187 <String Id="ProgressDlgTextRepairing" Overridable="yes">安裝精靈正在修復 [ProductName],請稍候。</String>
188 <String Id="ProgressDlgTitleRepairing" Overridable="yes">{\WixUI_Font_Title}正在修復 [ProductName]</String>
189 <String Id="ProgressDlgTextRemoving" Overridable="yes">安裝精靈正在移除 [ProductName],請稍候。</String>
190 <String Id="ProgressDlgTitleRemoving" Overridable="yes">{\WixUI_Font_Title}正在移除 [ProductName]</String>
191 <String Id="ProgressDlgTextUpdating" Overridable="yes">安裝精靈正在更新 [ProductName],請稍候。</String>
192 <String Id="ProgressDlgTitleUpdating" Overridable="yes">{\WixUI_Font_Title}正在更新 [ProductName]</String>
193 <String Id="ProgressDlgProgressBar" Overridable="yes">處理完畢</String>
194 <String Id="ProgressDlgStatusLabel" Overridable="yes">狀態:</String>
195
196 <String Id="ResumeDlg_Title" Overridable="yes">[ProductName] 安裝程式</String>
197 <String Id="ResumeDlgInstall" Overridable="yes">安裝(&amp;I)</String>
198 <String Id="ResumeDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
199 <String Id="ResumeDlgDescription" Overridable="yes">安裝精靈即將完成在您的電腦上安裝 [ProductName]。請按 [\[]安裝[\]] 繼續進行,或按 [\[]取消[\]] 結束安裝精靈。</String>
200 <String Id="ResumeDlgTitle" Overridable="yes">{\WixUI_Font_Bigger}繼續執行 [ProductName] 安裝精靈</String>
201
202 <String Id="SetupTypeDlg_Title" Overridable="yes">[ProductName] 安裝程式</String>
203 <String Id="SetupTypeDlgTypicalButton" Overridable="yes">一般(&amp;T)</String>
204 <String Id="SetupTypeDlgTypicalButtonTooltip" Overridable="yes">一般安裝</String>
205 <String Id="SetupTypeDlgCustomButton" Overridable="yes">自訂(&amp;U)</String>
206 <String Id="SetupTypeDlgCustomButtonTooltip" Overridable="yes">自訂安裝</String>
207 <String Id="SetupTypeDlgCompleteButton" Overridable="yes">完整(&amp;O)</String>
208 <String Id="SetupTypeDlgCompleteButtonTooltip" Overridable="yes">完整安裝</String>
209 <String Id="SetupTypeDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
210 <String Id="SetupTypeDlgTitle" Overridable="yes">{\WixUI_Font_Title}選擇安裝類型</String>
211 <String Id="SetupTypeDlgDescription" Overridable="yes">選擇最符合您需求的安裝類型</String>
212 <String Id="SetupTypeDlgTypicalText" Overridable="yes">安裝最常用的程式功能。建議一般使用者使用。</String>
213 <String Id="SetupTypeDlgCustomText" Overridable="yes">讓使用者選擇要安裝的程式功能以及安裝位置。建議進階使用者使用。</String>
214 <String Id="SetupTypeDlgCompleteText" Overridable="yes">將安裝所有程式功能。需要最大磁碟空間。</String>
215
216 <String Id="UserExit_Title" Overridable="yes">[ProductName] 安裝程式</String>
217 <String Id="UserExitBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
218 <String Id="UserExitTitle" Overridable="yes">{\WixUI_Font_Bigger}[ProductName] 安裝精靈已中斷</String>
219 <String Id="UserExitDescription1" Overridable="yes">[ProductName] 安裝程式已中斷。您的系統尚未被修改。若要稍後再安裝此程式,請再執行一次安裝精靈。</String>
220 <String Id="UserExitDescription2" Overridable="yes">按一下 [\[]完成[\]] 按鈕結束安裝精靈。</String>
221
222 <String Id="VerifyReadyDlg_Title" Overridable="yes">[ProductName] 安裝程式</String>
223 <String Id="VerifyReadyDlgBannerBitmap" Overridable="yes">WixUI_Bmp_Banner</String>
224 <String Id="VerifyReadyDlgInstall" Overridable="yes">安裝(&amp;I)</String>
225 <String Id="VerifyReadyDlgInstallText" Overridable="yes">按一下 [\[]安裝[\]] 即可開始安裝。按一下 [\[]上一步[\]] 可檢閱或變更您的任何安裝設定。按一下 [\[]取消[\]] 可結束此精靈。</String>
226 <String Id="VerifyReadyDlgInstallTitle" Overridable="yes">{\WixUI_Font_Title}準備安裝 [ProductName]</String>
227 <String Id="VerifyReadyDlgChange" Overridable="yes">變更(&amp;C)</String>
228 <String Id="VerifyReadyDlgChangeText" Overridable="yes">按一下 [\[]變更[\]] 即可開始安裝。按一下 [\[]上一步[\]] 可檢閱或變更您的任何安裝設定。按一下 [\[]取消[\]] 可結束此精靈。</String>
229 <String Id="VerifyReadyDlgChangeTitle" Overridable="yes">{\WixUI_Font_Title}準備變更 [ProductName]</String>
230 <String Id="VerifyReadyDlgRepair" Overridable="yes">修復(&amp;P)</String>
231 <String Id="VerifyReadyDlgRepairText" Overridable="yes">按一下 [\[]修復[\]] 即可修復 [ProductName] 安裝。按一下 [\[]上一步[\]] 可檢閱或變更您的任何安裝設定。按一下 [\[]取消[\]] 可結束此精靈。</String>
232 <String Id="VerifyReadyDlgRepairTitle" Overridable="yes">{\WixUI_Font_Title}準備修復 [ProductName]</String>
233 <String Id="VerifyReadyDlgRemove" Overridable="yes">移除(&amp;R)</String>
234 <String Id="VerifyReadyDlgRemoveText" Overridable="yes">按一下 [\[]移除[\]] 即可從電腦移除 [ProductName]。按一下 [\[]上一步[\]] 可檢閱或變更您的任何安裝設定。按一下 [\[]取消[\]] 可結束此精靈。</String>
235 <String Id="VerifyReadyDlgRemoveTitle" Overridable="yes">{\WixUI_Font_Title}準備移除 [ProductName]</String>
236 <String Id="VerifyReadyDlgUpdate" Overridable="yes">更新(&amp;U)</String>
237 <String Id="VerifyReadyDlgUpdateText" Overridable="yes">按一下 [\[]更新[\]] 即可更新您電腦中的 [ProductName]。按一下 [\[]上一步[\]] 可檢閱或變更您的任何安裝設定。按一下 [\[]取消[\]] 可結束此精靈。</String>
238 <String Id="VerifyReadyDlgUpdateTitle" Overridable="yes">{\WixUI_Font_Title}準備更新 [ProductName]</String>
239
240 <String Id="WaitForCostingDlg_Title" Overridable="yes">[ProductName] 安裝程式</String>
241 <String Id="WaitForCostingDlgReturn" Overridable="yes">返回(&amp;R)</String>
242 <String Id="WaitForCostingDlgText" Overridable="yes">安裝程式正在判斷您的磁碟空間需求,請稍候。</String>
243 <String Id="WaitForCostingDlgIcon" Overridable="yes">WixUI_Ico_Exclam</String>
244 <String Id="WaitForCostingDlgIconTooltip" Overridable="yes">驚歎號圖示</String>
245
246 <String Id="WelcomeDlg_Title" Overridable="yes">[ProductName] 安裝程式</String>
247 <String Id="WelcomeDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
248 <String Id="WelcomeDlgDescription" Overridable="yes">安裝精靈將在您的電腦上安裝 [ProductName]。請按 [\[]下一步[\]] 繼續進行,或按 [\[]取消[\]] 結束安裝精靈。</String>
249 <String Id="WelcomeUpdateDlgDescriptionUpdate" Overridable="yes">安裝精靈將更新您電腦上的 [ProductName]。請按 [\[]下一步[\]] 繼續進行,或按 [\[]取消[\]] 結束安裝精靈。</String>
250 <String Id="WelcomeDlgTitle" Overridable="yes">{\WixUI_Font_Bigger}歡迎使用 [ProductName] 安裝精靈</String>
251
252 <String Id="WelcomeEulaDlg_Title" Overridable="yes">[ProductName] 安裝程式</String>
253 <String Id="WelcomeEulaDlgBitmap" Overridable="yes">WixUI_Bmp_Dialog</String>
254 <String Id="WelcomeEulaDlgLicenseAcceptedCheckBox" Overridable="yes">我接受授權合約中的條款(&amp;A)</String>
255 <String Id="WelcomeEulaDlgInstall" Overridable="yes">安裝(&amp;I)</String>
256 <String Id="WelcomeEulaDlgUpdate" Overridable="yes">更新(&amp;U)</String>
257 <String Id="WelcomeEulaDlgTitle" Overridable="yes">{\WixUI_Font_Title}請閱讀 [ProductName] 授權合約</String>
258
259 <String Id="ProgressTextInstallValidate" Overridable="yes">正在驗證安裝</String>
260 <String Id="ProgressTextInstallFiles" Overridable="yes">正在複製新檔案</String>
261 <String Id="ProgressTextInstallFilesTemplate" Overridable="yes">檔案: [1],目錄: [9],大小: [6]</String>
262 <String Id="ProgressTextInstallAdminPackage" Overridable="yes">正在複製網路安裝檔案</String>
263 <String Id="ProgressTextInstallAdminPackageTemplate" Overridable="yes">檔案: [1],目錄: [9],大小: [6]</String>
264 <String Id="ProgressTextFileCost" Overridable="yes">正在計算空間需求</String>
265 <String Id="ProgressTextCostInitialize" Overridable="yes">正在計算空間需求</String>
266 <String Id="ProgressTextCostFinalize" Overridable="yes">正在計算空間需求</String>
267 <String Id="ProgressTextCreateShortcuts" Overridable="yes">正在建立捷徑</String>
268 <String Id="ProgressTextCreateShortcutsTemplate" Overridable="yes">捷徑: [1]</String>
269 <String Id="ProgressTextPublishComponents" Overridable="yes">正在發行合格的元件</String>
270 <String Id="ProgressTextPublishComponentsTemplate" Overridable="yes">元件識別碼: [1],辨識符號: [2]</String>
271 <String Id="ProgressTextPublishFeatures" Overridable="yes">正在發行產品功能</String>
272 <String Id="ProgressTextPublishFeaturesTemplate" Overridable="yes">功能: [1]</String>
273 <String Id="ProgressTextPublishProduct" Overridable="yes">正在發行產品資訊</String>
274 <String Id="ProgressTextRegisterClassInfo" Overridable="yes">正在註冊類別伺服器</String>
275 <String Id="ProgressTextRegisterClassInfoTemplate" Overridable="yes">類別識別碼: [1]</String>
276 <String Id="ProgressTextRegisterExtensionInfo" Overridable="yes">正在註冊擴充伺服器</String>
277 <String Id="ProgressTextRegisterExtensionInfoTemplate" Overridable="yes">擴充: [1]</String>
278 <String Id="ProgressTextRegisterMIMEInfo" Overridable="yes">正在註冊 MIME 資訊</String>
279 <String Id="ProgressTextRegisterMIMEInfoTemplate" Overridable="yes">MIME 內容類型: [1],副檔名: [2]</String>
280 <String Id="ProgressTextRegisterProgIdInfo" Overridable="yes">正在註冊程式識別元</String>
281 <String Id="ProgressTextRegisterProgIdInfoTemplate" Overridable="yes">ProgId: [1]</String>
282 <String Id="ProgressTextAllocateRegistrySpace" Overridable="yes">正在配置登錄空間</String>
283 <String Id="ProgressTextAllocateRegistrySpaceTemplate" Overridable="yes">可用空間: [1]</String>
284 <String Id="ProgressTextAppSearch" Overridable="yes">正在搜尋已安裝的應用程式</String>
285 <String Id="ProgressTextAppSearchTemplate" Overridable="yes">屬性: [1],簽章: [2]</String>
286 <String Id="ProgressTextBindImage" Overridable="yes">正在繫結可執行檔</String>
287 <String Id="ProgressTextBindImageTemplate" Overridable="yes">檔案: [1]</String>
288 <String Id="ProgressTextCCPSearch" Overridable="yes">正在搜尋合格的產品</String>
289 <String Id="ProgressTextCreateFolders" Overridable="yes">正在建立資料夾</String>
290 <String Id="ProgressTextCreateFoldersTemplate" Overridable="yes">資料夾: [1]</String>
291 <String Id="ProgressTextDeleteServices" Overridable="yes">正在刪除服務</String>
292 <String Id="ProgressTextDeleteServicesTemplate" Overridable="yes">服務: [1]</String>
293 <String Id="ProgressTextDuplicateFiles" Overridable="yes">正在建立重複的檔案</String>
294 <String Id="ProgressTextDuplicateFilesTemplate" Overridable="yes">檔案: [1],目錄: [9],大小: [6]</String>
295 <String Id="ProgressTextFindRelatedProducts" Overridable="yes">正在搜尋相關的應用程式</String>
296 <String Id="ProgressTextFindRelatedProductsTemplate" Overridable="yes">找到的應用程式: [1]</String>
297 <String Id="ProgressTextInstallODBC" Overridable="yes">正在安裝 ODBC 元件</String>
298 <String Id="ProgressTextInstallServices" Overridable="yes">正在安裝新服務</String>
299 <String Id="ProgressTextInstallServicesTemplate" Overridable="yes">服務: [2]</String>
300 <String Id="ProgressTextLaunchConditions" Overridable="yes">正在評估啟動條件</String>
301 <String Id="ProgressTextMigrateFeatureStates" Overridable="yes">正在從相關應用程式移轉功能狀態</String>
302 <String Id="ProgressTextMigrateFeatureStatesTemplate" Overridable="yes">應用程式: [1]</String>
303 <String Id="ProgressTextMoveFiles" Overridable="yes">正在移動檔案</String>
304 <String Id="ProgressTextMoveFilesTemplate" Overridable="yes">檔案: [1],目錄: [9],大小: [6]</String>
305 <String Id="ProgressTextPatchFiles" Overridable="yes">正在修補檔案</String>
306 <String Id="ProgressTextPatchFilesTemplate" Overridable="yes">檔案: [1],目錄: [2],大小: [3]</String>
307 <String Id="ProgressTextProcessComponents" Overridable="yes">正在更新元件登錄</String>
308 <String Id="ProgressTextRegisterComPlus" Overridable="yes">正在註冊 COM+ 應用程式及元件</String>
309 <String Id="ProgressTextRegisterComPlusTemplate" Overridable="yes">AppId: [1]{{, AppType: [2], 使用者: [3], RSN: [4]}}</String>
310 <String Id="ProgressTextRegisterFonts" Overridable="yes">正在註冊字型</String>
311 <String Id="ProgressTextRegisterFontsTemplate" Overridable="yes">字型: [1]</String>
312 <String Id="ProgressTextRegisterProduct" Overridable="yes">正在註冊產品</String>
313 <String Id="ProgressTextRegisterProductTemplate" Overridable="yes">[1]</String>
314 <String Id="ProgressTextRegisterTypeLibraries" Overridable="yes">正在註冊型別程式庫</String>
315 <String Id="ProgressTextRegisterTypeLibrariesTemplate" Overridable="yes">LibID: [1]</String>
316 <String Id="ProgressTextRegisterUser" Overridable="yes">正在註冊使用者</String>
317 <String Id="ProgressTextRegisterUserTemplate" Overridable="yes">[1]</String>
318 <String Id="ProgressTextRemoveDuplicateFiles" Overridable="yes">正在移除重複的檔案</String>
319 <String Id="ProgressTextRemoveDuplicateFilesTemplate" Overridable="yes">檔案: [1],目錄: [9]</String>
320 <String Id="ProgressTextRemoveEnvironmentStrings" Overridable="yes">正在更新環境字串</String>
321 <String Id="ProgressTextRemoveEnvironmentStringsTemplate" Overridable="yes">名稱: [1],值: [2],動作 [3]</String>
322 <String Id="ProgressTextRemoveExistingProducts" Overridable="yes">正在移除應用程式</String>
323 <String Id="ProgressTextRemoveExistingProductsTemplate" Overridable="yes">應用程式: [1],命令列: [2]</String>
324 <String Id="ProgressTextRemoveFiles" Overridable="yes">正在移除檔案</String>
325 <String Id="ProgressTextRemoveFilesTemplate" Overridable="yes">檔案: [1],目錄: [9]</String>
326 <String Id="ProgressTextRemoveFolders" Overridable="yes">正在移除資料夾</String>
327 <String Id="ProgressTextRemoveFoldersTemplate" Overridable="yes">資料夾: [1]</String>
328 <String Id="ProgressTextRemoveIniValues" Overridable="yes">正在移除 INI 檔案項目</String>
329 <String Id="ProgressTextRemoveIniValuesTemplate" Overridable="yes">檔案: [1],區段: [2],機碼: [3],值: [4]</String>
330 <String Id="ProgressTextRemoveODBC" Overridable="yes">正在移除 ODBC 元件</String>
331 <String Id="ProgressTextRemoveRegistryValues" Overridable="yes">正在移除系統登錄值</String>
332 <String Id="ProgressTextRemoveRegistryValuesTemplate" Overridable="yes">機碼: [1],名稱: [2]</String>
333 <String Id="ProgressTextRemoveShortcuts" Overridable="yes">正在移除捷徑</String>
334 <String Id="ProgressTextRemoveShortcutsTemplate" Overridable="yes">捷徑: [1]</String>
335 <String Id="ProgressTextRMCCPSearch" Overridable="yes">正在搜尋合格的產品</String>
336 <String Id="ProgressTextSelfRegModules" Overridable="yes">正在註冊模組</String>
337 <String Id="ProgressTextSelfRegModulesTemplate" Overridable="yes">檔案: [1],資料夾: [2]</String>
338 <String Id="ProgressTextSelfUnregModules" Overridable="yes">正在解除註冊模組</String>
339 <String Id="ProgressTextSelfUnregModulesTemplate" Overridable="yes">檔案: [1],資料夾: [2]</String>
340 <String Id="ProgressTextSetODBCFolders" Overridable="yes">正在初始化 ODBC 目錄</String>
341 <String Id="ProgressTextStartServices" Overridable="yes">正在啟動服務</String>
342 <String Id="ProgressTextStartServicesTemplate" Overridable="yes">服務: [1]</String>
343 <String Id="ProgressTextStopServices" Overridable="yes">正在停止服務</String>
344 <String Id="ProgressTextStopServicesTemplate" Overridable="yes">服務: [1]</String>
345 <String Id="ProgressTextUnpublishComponents" Overridable="yes">正在解除發行合格的元件</String>
346 <String Id="ProgressTextUnpublishComponentsTemplate" Overridable="yes">元件識別碼: [1],辨識符號: [2]</String>
347 <String Id="ProgressTextUnpublishFeatures" Overridable="yes">正在解除發行產品功能</String>
348 <String Id="ProgressTextUnpublishFeaturesTemplate" Overridable="yes">功能: [1]</String>
349 <String Id="ProgressTextUnregisterClassInfo" Overridable="yes">解除註冊類別伺服器</String>
350 <String Id="ProgressTextUnregisterClassInfoTemplate" Overridable="yes">類別識別碼: [1]</String>
351 <String Id="ProgressTextUnregisterComPlus" Overridable="yes">正在解除註冊 COM+ 應用程式及元件</String>
352 <String Id="ProgressTextUnregisterComPlusTemplate" Overridable="yes">AppId: [1]{{, AppType: [2]}}</String>
353 <String Id="ProgressTextUnregisterExtensionInfo" Overridable="yes">正在解除註冊擴充伺服器</String>
354 <String Id="ProgressTextUnregisterExtensionInfoTemplate" Overridable="yes">擴充: [1]</String>
355 <String Id="ProgressTextUnregisterFonts" Overridable="yes">正在解除註冊字型</String>
356 <String Id="ProgressTextUnregisterFontsTemplate" Overridable="yes">字型: [1]</String>
357 <String Id="ProgressTextUnregisterMIMEInfo" Overridable="yes">正在解除註冊 MIME 資訊</String>
358 <String Id="ProgressTextUnregisterMIMEInfoTemplate" Overridable="yes">MIME 內容類型: [1],副檔名: [2]</String>
359 <String Id="ProgressTextUnregisterProgIdInfo" Overridable="yes">正在解除註冊程式識別元</String>
360 <String Id="ProgressTextUnregisterProgIdInfoTemplate" Overridable="yes">ProgId: [1]</String>
361 <String Id="ProgressTextUnregisterTypeLibraries" Overridable="yes">正在解除註冊型別程式庫</String>
362 <String Id="ProgressTextUnregisterTypeLibrariesTemplate" Overridable="yes">LibID: [1]</String>
363 <String Id="ProgressTextWriteEnvironmentStrings" Overridable="yes">正在更新環境字串</String>
364 <String Id="ProgressTextWriteEnvironmentStringsTemplate" Overridable="yes">名稱: [1],值: [2],動作 [3]</String>
365 <String Id="ProgressTextWriteIniValues" Overridable="yes">正在寫入 INI 檔案值</String>
366 <String Id="ProgressTextWriteIniValuesTemplate" Overridable="yes">檔案: [1],區段: [2],機碼: [3],值: [4]</String>
367 <String Id="ProgressTextWriteRegistryValues" Overridable="yes">正在寫入系統登錄值</String>
368 <String Id="ProgressTextWriteRegistryValuesTemplate" Overridable="yes">機碼: [1],名稱: [2],值: [3]</String>
369 <String Id="ProgressTextAdvertise" Overridable="yes">正在通告應用程式</String>
370 <String Id="ProgressTextGenerateScript" Overridable="yes">正在產生動作的指令碼作業:</String>
371 <String Id="ProgressTextGenerateScriptTemplate" Overridable="yes">[1]</String>
372 <String Id="ProgressTextInstallSFPCatalogFile" Overridable="yes">正在安裝系統目錄</String>
373 <String Id="ProgressTextInstallSFPCatalogFileTemplate" Overridable="yes">檔案: [1],相依性: [2]</String>
374 <String Id="ProgressTextMsiPublishAssemblies" Overridable="yes">正在發行組件資訊</String>
375 <String Id="ProgressTextMsiPublishAssembliesTemplate" Overridable="yes">應用程式內容:[1],組件名稱:[2]</String>
376 <String Id="ProgressTextMsiUnpublishAssemblies" Overridable="yes">正在解除發行組件資訊</String>
377 <String Id="ProgressTextMsiUnpublishAssembliesTemplate" Overridable="yes">應用程式內容:[1],組件名稱:[2]</String>
378 <String Id="ProgressTextRollback" Overridable="yes">正在復原的動作:</String>
379 <String Id="ProgressTextRollbackTemplate" Overridable="yes">[1]</String>
380 <String Id="ProgressTextRollbackCleanup" Overridable="yes">正在移除備份檔案</String>
381 <String Id="ProgressTextRollbackCleanupTemplate" Overridable="yes">檔案: [1]</String>
382 <String Id="ProgressTextUnmoveFiles" Overridable="yes">正在移除移動的檔案</String>
383 <String Id="ProgressTextUnmoveFilesTemplate" Overridable="yes">檔案: [1],目錄: [9]</String>
384 <String Id="ProgressTextUnpublishProduct" Overridable="yes">正在解除發行產品資訊</String>
385
386 <String Id="Error0" Overridable="yes">{{嚴重錯誤: }}</String>
387 <String Id="Error1" Overridable="yes">{{錯誤 [1]。}}</String>
388 <String Id="Error2" Overridable="yes">警告 [1]。</String>
389 <String Id="Error4" Overridable="yes">資訊 [1]。</String>
390 <String Id="Error5" Overridable="yes">安裝程式在安裝此套件時發生意外的錯誤。這可能表示此套件有問題。錯誤碼為 [1]。{{引數為: [2]、[3]、[4]}}</String>
391 <String Id="Error7" Overridable="yes">{{磁碟已滿: }}</String>
392 <String Id="Error8" Overridable="yes">動作 [Time]: [1]。[2]</String>
393 <String Id="Error9" Overridable="yes">[ProductName]</String>
394 <String Id="Error10" Overridable="yes">{[2]}{, [3]}{, [4]}</String>
395 <String Id="Error11" Overridable="yes">訊息類型: [1],引數: [2]</String>
396 <String Id="Error12" Overridable="yes">=== 開始記錄時間: [Date] [Time] ===</String>
397 <String Id="Error13" Overridable="yes">=== 停止記錄時間: [Date] [Time] ===</String>
398 <String Id="Error14" Overridable="yes">動作開始 [Time]: [1]。</String>
399 <String Id="Error15" Overridable="yes">動作結束 [Time]: [1]。傳回值 [2]。</String>
400 <String Id="Error16" Overridable="yes">剩餘時間: {[1] 分 }{[2] 秒}</String>
401 <String Id="Error17" Overridable="yes">記憶體不足,重試之前請先關閉其他應用程式。</String>
402 <String Id="Error18" Overridable="yes">安裝程式沒有回應。</String>
403 <String Id="Error19" Overridable="yes">安裝程式太早停止。</String>
404 <String Id="Error20" Overridable="yes">請稍候,Windows 在設定 [ProductName]</String>
405 <String Id="Error21" Overridable="yes">正在蒐集必要的資訊...</String>
406 <String Id="Error22" Overridable="yes">正在移除舊版應用程式...</String>
407 <String Id="Error23" Overridable="yes">正在準備移除舊版應用程式...</String>
408 <String Id="Error32" Overridable="yes">{[ProductName] }安裝成功。</String>
409 <String Id="Error33" Overridable="yes">{[ProductName] }安裝失敗。</String>
410 <String Id="Error1101" Overridable="yes">從檔案 [2] 讀取時發生錯誤。{{系統錯誤 [3]。}} 請確認檔案存在,而且您可以存取它。</String>
411 <String Id="Error1301" Overridable="yes">無法建立檔案 '[2]'。同名的目錄已經存在,請取消安裝然後嘗試安裝至別的位置。</String>
412 <String Id="Error1302" Overridable="yes">請插入磁片: [2]</String>
413 <String Id="Error1303" Overridable="yes">安裝程式的權限不足,無法存取這個目錄: [2],安裝無法繼續,請以管理員身分登入或是與您的系統管理員連絡。</String>
414 <String Id="Error1304" Overridable="yes">寫入檔案 [2] 時發生錯誤。請檢查您是否有存取該目錄的權限。</String>
415 <String Id="Error1305" Overridable="yes">讀取檔案 [2] 時發生錯誤。{{ 系統錯誤 [3]。}} 請確認檔案存在,而且您可以存取它。</String>
416 <String Id="Error1306" Overridable="yes">其他的應用程式對檔案 '[2]' 獨佔存取。請關閉所有其他的應用程式,然後按一下 [\[]重試[\]]。</String>
417 <String Id="Error1307" Overridable="yes">磁碟空間不足,無法安裝這個檔案: [2]。請釋放一些磁碟空間然後按一下 [\[]重試[\]],或按一下 [\[]取消[\]] 結束。</String>
418 <String Id="Error1308" Overridable="yes">找不到來源檔案: [2]。請確認檔案存在,而且您可以存取它。</String>
419 <String Id="Error1309" Overridable="yes">讀取檔案 [3] 時發生錯誤。{{ 系統錯誤 [2]。}} 請確認檔案存在,而且您可以存取它。</String>
420 <String Id="Error1310" Overridable="yes">寫入至檔案時發生錯誤: [3]。{{ 系統錯誤 [2]。}} 請檢查您是否有存取該目錄的權限。</String>
421 <String Id="Error1311" Overridable="yes">找不到來源檔案{{(封包檔)}}: [2]。請確認檔案存在,而且您可以存取它。</String>
422 <String Id="Error1312" Overridable="yes">無法建立目錄 '[2]'。同名的檔案已經存在,請更名或移除此檔案,然後按一下 [\[]重試[\]],或按一下 [\[]取消[\]] 結束。</String>
423 <String Id="Error1313" Overridable="yes">目前無法使用磁碟區 [2],請選取別的磁碟區。</String>
424 <String Id="Error1314" Overridable="yes">指定的路徑 '[2]' 無法使用。</String>
425 <String Id="Error1315" Overridable="yes">無法寫入指定的資料夾: [2]。</String>
426 <String Id="Error1316" Overridable="yes">嘗試讀取檔案時發生網路錯誤: [2]</String>
427 <String Id="Error1317" Overridable="yes">嘗試建立目錄時發生錯誤: [2]</String>
428 <String Id="Error1318" Overridable="yes">嘗試建立目錄時發生網路錯誤: [2]</String>
429 <String Id="Error1319" Overridable="yes">嘗試開啟來源檔案封包時發生網路錯誤: [2]</String>
430 <String Id="Error1320" Overridable="yes">指定的路徑太長: [2]</String>
431 <String Id="Error1321" Overridable="yes">安裝程式的權限不足,無法修改檔案 [2]。</String>
432 <String Id="Error1322" Overridable="yes">部分資料夾路徑 '[2]' 無效。它是空的或超過系統允許的長度。</String>
433 <String Id="Error1323" Overridable="yes">資料夾路徑 '[2]' 含有無效的資料夾路徑字元。</String>
434 <String Id="Error1324" Overridable="yes">資料夾路徑 '[2]' 含有無效的字元。</String>
435 <String Id="Error1325" Overridable="yes">'[2]' 不是有效的短檔名。</String>
436 <String Id="Error1326" Overridable="yes">取得檔案安全性時發生錯誤: [3] GetLastError: [2]</String>
437 <String Id="Error1327" Overridable="yes">無效的磁碟機: [2]</String>
438 <String Id="Error1328" Overridable="yes">將修補套用至檔案 [2] 時發生錯誤。它可能已由其他的方法更新,而不能再由這個修補修改。如需詳細資訊,請連絡您的修補廠商。{{系統錯誤: [3]}}</String>
439 <String Id="Error1329" Overridable="yes">因為封包檔 [2] 未經過數位簽署,所以無法安裝必要的檔案。這可能表示封包檔已損毀。</String>
440 <String Id="Error1330" Overridable="yes">因為封包檔 [2] 具有無效的數位簽章,所以無法安裝必要的檔案。這可能表示封包檔已損毀。{{ WinVerifyTrust 傳回錯誤 [3]。}}</String>
441 <String Id="Error1331" Overridable="yes">無法正確複製 [2] 檔案: CRC 錯誤。</String>
442 <String Id="Error1332" Overridable="yes">無法正確移動 [2] 檔案: CRC 錯誤。</String>
443 <String Id="Error1333" Overridable="yes">無法正確修補 [2] 檔案: CRC 錯誤。</String>
444 <String Id="Error1334" Overridable="yes">因為在封包檔 '[3]' 中找不到檔案 '[2]',所以無法安裝它。這可能表示有網路錯誤、讀取 CD-ROM 時發生錯誤或這個套件有問題。</String>
445 <String Id="Error1335" Overridable="yes">這個安裝所需的封包檔 '[2]' 已損毀而且無法使用。這可能表示有網路錯誤、讀取 CD-ROM 時發生錯誤或這個套件有問題。</String>
446 <String Id="Error1336" Overridable="yes">建立完成此安裝所需的暫存檔時發生錯誤。{{ 資料夾: [3]。系統錯誤碼: [2]}}</String>
447 <String Id="Error1401" Overridable="yes">無法建立機碼: [2]。{{ 系統錯誤 [3]。}} 請檢查您是否有存取該機碼的權限,或連絡您的支援人員。 </String>
448 <String Id="Error1402" Overridable="yes">無法開啟機碼: [2]。{{ 系統錯誤 [3]。}} 請檢查您是否有存取該機碼的權限,或連絡您的支援人員。 </String>
449 <String Id="Error1403" Overridable="yes">無法從機碼 [3] 刪除值 [2]。{{ 系統錯誤 [4]。}} 請檢查您是否有存取該機碼的權限,或連絡您的支援人員。 </String>
450 <String Id="Error1404" Overridable="yes">無法刪除機碼 [2]。{{ 系統錯誤 [3]。}} 請檢查您是否有存取該機碼的權限,或連絡您的支援人員。 </String>
451 <String Id="Error1405" Overridable="yes">無法從機碼 [3] 讀取值 [2]。{{ 系統錯誤 [4]。}} 請檢查您是否有存取該機碼的權限,或連絡您的支援人員。 </String>
452 <String Id="Error1406" Overridable="yes">無法寫入值 [2] 至機碼 [3]。 {{ 系統錯誤 [4]。}} 請檢查您是否有存取該機碼的權限,或連絡您的支援人員。</String>
453 <String Id="Error1407" Overridable="yes">無法取得機碼 [2] 的值名稱。{{ 系統錯誤 [3]。}} 請檢查您是否有存取該機碼的權限,或連絡您的支援人員。</String>
454 <String Id="Error1408" Overridable="yes">無法取得機碼 [2] 的子機碼名稱。{{ 系統錯誤 [3]。}} 請檢查您是否有存取該機碼的權限,或連絡您的支援人員。</String>
455 <String Id="Error1409" Overridable="yes">無法讀取機碼 [2] 的安全性資訊。{{ 系統錯誤 [3]。}} 請檢查您是否有存取該機碼的權限,或連絡您的支援人員。</String>
456 <String Id="Error1410" Overridable="yes">無法增加可用的登錄空間。安裝此應用程式需要 [2] KB 以上的空間。</String>
457 <String Id="Error1500" Overridable="yes">其他的安裝正在進行中,您必須完成該項安裝之後才能繼續。</String>
458 <String Id="Error1501" Overridable="yes">存取安全性資料時發生錯誤,請確定 Windows Installer 是否正確設定,然後再試一次。</String>
459 <String Id="Error1502" Overridable="yes">使用者 '[2]' 之前已經啟動了產品 '[3]' 的安裝。這位使用者必須再次執行安裝才能使用該產品。您目前的安裝將會繼續。</String>
460 <String Id="Error1503" Overridable="yes">使用者 '[2]' 之前已經啟動了產品 '[3]' 的安裝。這位使用者必須再次執行安裝才能使用該產品。</String>
461 <String Id="Error1601" Overridable="yes">磁碟空間不足 -- 磁碟區: '[2]'; 需要空間: [3] KB; 可用空間: [4] KB。請釋放一些空間,然後再重試。</String>
462 <String Id="Error1602" Overridable="yes">您確定要取消嗎 ?</String>
463 <String Id="Error1603" Overridable="yes">檔案 [2][3] 正在使用中 {由下列處理序使用: 名稱: [4],識別碼: [5],視窗標題: '[6]'},請關閉該應用程式然後重試。</String>
464 <String Id="Error1604" Overridable="yes">已經安裝產品 '[2]',無法安裝本產品。這兩項產品不相容。</String>
465 <String Id="Error1605" Overridable="yes">磁碟區 '[2]' 上的磁碟空間不足,無法繼續進行啟用修復功能的安裝。需要 [3] KB 的空間,但是只有 [4] KB 可供使用。請按一下 [\[]忽略[\]] 繼續安裝但不儲存修復資訊,按一下 [\[]重試[\]] 再檢查一次是否有可用的空間,或按一下 [\[]取消[\]] 結束安裝。</String>
466 <String Id="Error1606" Overridable="yes">無法存取網路位置 [2]。</String>
467 <String Id="Error1607" Overridable="yes">繼續安裝之前應先關閉下列應用程式:</String>
468 <String Id="Error1608" Overridable="yes">在此機器上,找不到與本產品相容的舊版產品。</String>
469 <String Id="Error1609" Overridable="yes">套用安全性設定時發生錯誤。[2] 不是有效的使用者或群組。可能是因為套件有問題,或連線至網路上的網域控制站時發生問題。請檢查您的網路連線再按一下 [\[]重試[\]],或按一下 [\[]取消[\]] 結束安裝。{{找不到使用者的 SID,系統錯誤 [3]}}</String>
470 <String Id="Error1701" Overridable="yes">金鑰 [2] 無效。請檢查您輸入的金鑰是否正確。</String>
471 <String Id="Error1702" Overridable="yes">安裝程式必須重新啟動您的系統才能繼續設定 [2]。請按一下 [\[]是[\]] 立即重新啟動,或如果您想要稍後手動重新啟動請按一下 [\[]否[\]]。</String>
472 <String Id="Error1703" Overridable="yes">您必須重新啟動系統,才能使對 [2] 的設定變更生效。請按一下 [\[]是[\]] 立即重新啟動,或如果您想要稍後手動重新啟動請按一下 [\[]否[\]]。</String>
473 <String Id="Error1704" Overridable="yes">[2] 的安裝目前已暫停。您必須復原該安裝所做的變更才能繼續。是否要復原那些變更?</String>
474 <String Id="Error1705" Overridable="yes">本產品先前的安裝正在進行中,您必須復原該安裝所做的變更才能繼續。是否要復原那些變更?</String>
475 <String Id="Error1706" Overridable="yes">找不到產品 [2] 的安裝套件。請試著使用有效的安裝套件 '[3]' 再安裝一次。</String>
476 <String Id="Error1707" Overridable="yes">安裝已成功完成。</String>
477 <String Id="Error1708" Overridable="yes">安裝失敗。</String>
478 <String Id="Error1709" Overridable="yes">產品: [2] -- [3]</String>
479 <String Id="Error1710" Overridable="yes">您可以將電腦還原成先前的狀態或稍後再繼續安裝。要還原嗎?</String>
480 <String Id="Error1711" Overridable="yes">寫入安裝資訊至磁碟時發生錯誤。請檢查確定有足夠的可用磁碟空間,然後按一下 [\[]重試[\]],或按一下 [\[]取消[\]] 結束安裝。</String>
481 <String Id="Error1712" Overridable="yes">找不到將您的電腦還原為之前狀態所需的一個或多個檔案。無法還原。</String>
482 <String Id="Error1713" Overridable="yes">[2] 無法安裝其中一項必要的產品。請連絡技術支援團隊。{{系統錯誤: [3]。}}</String>
483 <String Id="Error1714" Overridable="yes">無法移除舊版的 [2]。請連絡技術支援團隊。{{系統錯誤: [3]。}}</String>
484 <String Id="Error1715" Overridable="yes">已安裝 [2]</String>
485 <String Id="Error1716" Overridable="yes">已設定 [2]</String>
486 <String Id="Error1717" Overridable="yes">已移除 [2]</String>
487 <String Id="Error1718" Overridable="yes">檔案 [2] 已因數位簽章原則而被拒絕。</String>
488 <String Id="Error1719" Overridable="yes">無法存取 Windows Installer 服務。如果您在安全模式中執行 Windows,或者並未正確安裝 Windows Installer,便會發生這個問題。請連絡支援人員取得協助。</String>
489 <String Id="Error1720" Overridable="yes">這個 Windows Installer 套件有問題。有個完成此安裝所需的指令碼無法執行。請連絡支援人員或套件廠商。{{自訂動作 [2] 指令碼錯誤 [3], [4]: [5] 行 [6], 欄 [7], [8] }}</String>
490 <String Id="Error1721" Overridable="yes">這個 Windows Installer 套件有問題。有個完成此安裝所需的程式無法執行。請連絡支援人員或套件廠商。{{動作: [2], 位置: [3], 命令: [4] }}</String>
491 <String Id="Error1722" Overridable="yes">這個 Windows Installer 套件有問題。有個安裝程式中包含的程式並未如預期完成。請連絡支援人員或套件廠商。{{動作 [2], 位置: [3], 命令: [4] }}</String>
492 <String Id="Error1723" Overridable="yes">這個 Windows Installer 套件有問題。有個完成此安裝所需的 DLL 無法執行。請連絡支援人員或套件廠商。{{動作 [2], 項目: [3], 程式庫: [4] }}</String>
493 <String Id="Error1724" Overridable="yes">移除已順利完成。</String>
494 <String Id="Error1725" Overridable="yes">移除失敗。</String>
495 <String Id="Error1726" Overridable="yes">通告已順利完成。</String>
496 <String Id="Error1727" Overridable="yes">通知失敗。</String>
497 <String Id="Error1728" Overridable="yes">設定已順利完成。</String>
498 <String Id="Error1729" Overridable="yes">設定失敗。</String>
499 <String Id="Error1730" Overridable="yes">您必須是系統管理員才能移除這個應用程式。如果要移除這個應用程式,請以系統管理員身分登入,或連絡技術支援人員取得協助。</String>
500 <String Id="Error1731" Overridable="yes">產品 [2] 的來源安裝套件與用戶端套件不同步。請使用有效的安裝套件 '[3]' 再安裝一次。</String>
501 <String Id="Error1732" Overridable="yes">若要完成 [2] 的安裝,您必須重新啟動電腦。這部電腦目前有其他使用者登入,重新啟動可能會造成他們工作遺失。是否要立即重新啟動?</String>
502 <String Id="Error1801" Overridable="yes">路徑 [2] 無效。請指定有效的路徑。</String>
503 <String Id="Error1802" Overridable="yes">記憶體不足,重試之前請先關閉其他應用程式。</String>
504 <String Id="Error1803" Overridable="yes">磁碟機 [2] 中沒有磁片,請插入磁片然後按一下 [\[]重試[\]],或按一下 [\[]取消[\]] 回到上次選取的磁碟機代號。</String>
505 <String Id="Error1804" Overridable="yes">磁碟機 [2] 中沒有磁片,請插入磁片然後按一下 [\[]重試[\]],或按一下 [\[]取消[\]] 返回瀏覽對話方塊,並選取其他磁碟機代號。</String>
506 <String Id="Error1805" Overridable="yes">資料夾 [2] 不存在,請輸入現有資料夾的路徑。</String>
507 <String Id="Error1806" Overridable="yes">您的權限不足,無法讀取這個資料夾。</String>
508 <String Id="Error1807" Overridable="yes">無法判斷安裝的有效目的地資料夾。</String>
509 <String Id="Error1901" Overridable="yes">嘗試讀取來源安裝資料庫時發生錯誤: [2]。</String>
510 <String Id="Error1902" Overridable="yes">正在排定重新開機作業: 正在將 [2] 重新命名為 [3]。必須重新開機才能完成作業。</String>
511 <String Id="Error1903" Overridable="yes">正在排定重新開機作業: 正在刪除檔案 [2]。必須重新開機才能完成作業。</String>
512 <String Id="Error1904" Overridable="yes">模組 [2] 無法註冊。HRESULT [3]。請連絡支援人員。</String>
513 <String Id="Error1905" Overridable="yes">模組 [2] 無法解除註冊。HRESULT [3]。請連絡支援人員。</String>
514 <String Id="Error1906" Overridable="yes">無法快取封裝 [2]。錯誤: [3]。請連絡支援人員。</String>
515 <String Id="Error1907" Overridable="yes">無法註冊字型 [2]。請確認您有安裝字型的足夠權限,且系統支援此字型。</String>
516 <String Id="Error1908" Overridable="yes">無法解除註冊字型 [2]。請確認您有移除字型的足夠權限。</String>
517 <String Id="Error1909" Overridable="yes">無法建立捷徑 [2]。請確認目的地資料夾是否存在,且您可以存取它。</String>
518 <String Id="Error1910" Overridable="yes">無法移除捷徑 [2]。請確認捷徑檔案是否存在,且您可以存取它。</String>
519 <String Id="Error1911" Overridable="yes">無法註冊檔案 [2] 的型別程式庫。請連絡支援人員。</String>
520 <String Id="Error1912" Overridable="yes">無法解除註冊檔案 [2] 的型別程式庫。請連絡支援人員。</String>
521 <String Id="Error1913" Overridable="yes">無法更新 INI 檔 [2][3]。請確認檔案存在,而且您可以存取它。</String>
522 <String Id="Error1914" Overridable="yes">無法排定檔案 [2] 在重新開機時取代檔案 [3]。請確認您具有檔案 [3] 的寫入權限。</String>
523 <String Id="Error1915" Overridable="yes">移除 ODBC 驅動程式管理員時發生錯誤,ODBC 錯誤 [2]: [3]。請連絡支援人員。</String>
524 <String Id="Error1916" Overridable="yes">安裝 ODBC 驅動程式管理員時發生錯誤,ODBC 錯誤 [2]: [3]。請連絡支援人員。</String>
525 <String Id="Error1917" Overridable="yes">移除 ODBC 驅動程式時發生錯誤: [4],ODBC 錯誤 [2]: [3]。請確認您有移除 ODBC 驅動程式的足夠權限。</String>
526 <String Id="Error1918" Overridable="yes">安裝 ODBC 驅動程式時發生錯誤: [4],ODBC 錯誤 [2]: [3]。請確認檔案 [4] 是否存在,且您可以存取它。</String>
527 <String Id="Error1919" Overridable="yes">設定 ODBC 資料來源時發生錯誤: [4],ODBC 錯誤 [2]: [3]。請確認檔案 [4] 是否存在,且您可以存取它。</String>
528 <String Id="Error1920" Overridable="yes">服務 '[2]' ([3]) 無法啟動。請確認您有啟動系統服務的足夠權限。</String>
529 <String Id="Error1921" Overridable="yes">服務 '[2]' ([3]) 無法停止。請確認您有停止系統服務的足夠權限。</String>
530 <String Id="Error1922" Overridable="yes">服務 '[2]' ([3]) 無法刪除。請確認您有移除系統服務的足夠權限。</String>
531 <String Id="Error1923" Overridable="yes">服務 '[2]' ([3]) 無法安裝。請確認您有安裝系統服務的足夠權限。</String>
532 <String Id="Error1924" Overridable="yes">無法更新環境變數 '[2]'。請確認您有修改環境變數的足夠權限。</String>
533 <String Id="Error1925" Overridable="yes">您沒有足夠的權限為此電腦上的所有使用者完成此安裝。請以系統管理員身分登入,然後再重試此安裝。</String>
534 <String Id="Error1926" Overridable="yes">無法設定檔案 '[3]' 的檔案安全性。錯誤: [2]。請確認您有修改此檔案安全性權限的足夠權限。</String>
535 <String Id="Error1927" Overridable="yes">這台電腦並未安裝 Component Services (COM+ 1.0)。這項安裝需要有 Component Services 才能順利完成。Component Services 包含在 Windows 2000 中。</String>
536 <String Id="Error1928" Overridable="yes">註冊 COM+ 應用程式時發生錯誤。請連絡支援人員取得詳細資訊。</String>
537 <String Id="Error1929" Overridable="yes">解除註冊 COM+ 應用程式時發生錯誤。請連絡支援人員取得詳細資訊。</String>
538 <String Id="Error1930" Overridable="yes">無法變更服務 '[2]' ([3]) 的描述。</String>
539 <String Id="Error1931" Overridable="yes">Windows Installer 服務無法更新系統檔案 [2],因為檔案受到 Windows 保護。可能需要更新您的作業系統才能正確執行這個程式。{{封裝版本: [3],OS 保護的版本: [4]}}</String>
540 <String Id="Error1932" Overridable="yes">Windows Installer 服務無法更新受保護的 Windows 檔案 [2]。{{封裝版本: [3],OS 保護的版本: [4],SFP 錯誤: [5]}}</String>
541 <String Id="Error1933" Overridable="yes">Windows Installer 服務無法更新一或多個受保護的 Windows 檔案。{{SFP 錯誤: [2]。受保護的檔案清單:\r\n[3]}}</String>
542 <String Id="Error1934" Overridable="yes">電腦上的使用者安裝已透過原則停用。</String>
543 <String Id="Error1935" Overridable="yes">組件 '[6]' 安裝期間發生錯誤。請參閱說明與支援取得詳細資訊。HRESULT: [3]。{{組件介面: [4], 功能: [5], 元件: [2]}}</String>
544 <String Id="Error1936" Overridable="yes">組件 '[6]' 安裝期間發生錯誤。此組件不是以強式名稱命名,或未以最短金鑰長度簽章。HRESULT: [3]。{{組件介面: [4], 功能: [5], 元件: [2]}}</String>
545 <String Id="Error1937" Overridable="yes">組件 '[6]' 安裝期間發生錯誤。簽章或目錄無法驗證或無效。HRESULT: [3]。{{組件介面: [4], 功能: [5], 元件: [2]}}</String>
546 <String Id="Error1938" Overridable="yes">組件 '[6]' 安裝期間發生錯誤。有一或多個組件的模組找不到。HRESULT: [3]。{{組件介面: [4], 功能: [5], 元件: [2]}}</String>
547
548 <String Id="UITextbytes" Overridable="yes">位元組</String>
549 <String Id="UITextGB" Overridable="yes">GB</String>
550 <String Id="UITextKB" Overridable="yes">KB</String>
551 <String Id="UITextMB" Overridable="yes">MB</String>
552 <String Id="UITextMenuAbsent" Overridable="yes">整個功能將無法使用</String>
553 <String Id="UITextMenuAdvertise" Overridable="yes">這項功能將在需要時才進行安裝</String>
554 <String Id="UITextMenuAllCD" Overridable="yes">整個功能將安裝成從光碟執行</String>
555 <String Id="UITextMenuAllLocal" Overridable="yes">整個功能將安裝在本機硬碟上</String>
556 <String Id="UITextMenuAllNetwork" Overridable="yes">整個功能將安裝成從網路執行</String>
557 <String Id="UITextMenuCD" Overridable="yes">將安裝成從光碟執行</String>
558 <String Id="UITextMenuLocal" Overridable="yes">將安裝在本機硬碟上</String>
559 <String Id="UITextMenuNetwork" Overridable="yes">將安裝成從網路執行</String>
560 <String Id="UITextNewFolder" Overridable="yes">資料夾|新資料夾</String>
561 <String Id="UITextScriptInProgress" Overridable="yes">正在蒐集必要的資訊...</String>
562 <String Id="UITextSelAbsentAbsent" Overridable="yes">這項功能將保持未安裝的狀態</String>
563 <String Id="UITextSelAbsentAdvertise" Overridable="yes">這項功能將設定成在必要時才安裝</String>
564 <String Id="UITextSelAbsentCD" Overridable="yes">這項功能將安裝成從光碟執行</String>
565 <String Id="UITextSelAbsentLocal" Overridable="yes">這項功能將安裝在本機硬碟上</String>
566 <String Id="UITextSelAbsentNetwork" Overridable="yes">這項功能將安裝成從網路執行</String>
567 <String Id="UITextSelAdvertiseAbsent" Overridable="yes">這項功能將無法使用</String>
568 <String Id="UITextSelAdvertiseAdvertise" Overridable="yes">將會在必要時才安裝</String>
569 <String Id="UITextSelAdvertiseCD" Overridable="yes">這項功能將可從光碟執行</String>
570 <String Id="UITextSelAdvertiseLocal" Overridable="yes">這項功能將安裝在本機硬碟上</String>
571 <String Id="UITextSelAdvertiseNetwork" Overridable="yes">這項功能將可從網路執行</String>
572 <String Id="UITextSelCDAbsent" Overridable="yes">將完全解除安裝這項功能,且無法從光碟執行</String>
573 <String Id="UITextSelCDAdvertise" Overridable="yes">這項功能原本是從光碟執行,將變更為在必要時才安裝</String>
574 <String Id="UITextSelCDCD" Overridable="yes">這項功能將繼續從光碟執行</String>
575 <String Id="UITextSelCDLocal" Overridable="yes">這項功能原本是從光碟執行,將變更為安裝到本機硬碟</String>
576 <String Id="UITextSelChildCostNeg" Overridable="yes">這個功能會釋放 [1] 的硬碟空間。</String>
577 <String Id="UITextSelChildCostPos" Overridable="yes">這個功能需要 [1] 的硬碟空間。</String>
578 <String Id="UITextSelCostPending" Overridable="yes">正在計算此功能所需的空間...</String>
579 <String Id="UITextSelLocalAbsent" Overridable="yes">這項功能將完全移除</String>
580 <String Id="UITextSelLocalAdvertise" Overridable="yes">這項功能將從本機硬碟移除,但設定成必要時才安裝</String>
581 <String Id="UITextSelLocalCD" Overridable="yes">這項功能將從本機硬碟移除,但仍然可以從光碟執行</String>
582 <String Id="UITextSelLocalLocal" Overridable="yes">這項功能將保留在您的本機硬碟上</String>
583 <String Id="UITextSelLocalNetwork" Overridable="yes">這項功能將從本機硬碟移除,但仍然可以從網路執行</String>
584 <String Id="UITextSelNetworkAbsent" Overridable="yes">將完全解除安裝這項功能,且無法從網路執行</String>
585 <String Id="UITextSelNetworkAdvertise" Overridable="yes">這項功能原本是從網路執行,將變更為在必要時才安裝</String>
586 <String Id="UITextSelNetworkLocal" Overridable="yes">這項功能原本是從網路執行,將變更為安裝到本機硬碟</String>
587 <String Id="UITextSelNetworkNetwork" Overridable="yes">這項功能將繼續從網路執行</String>
588 <String Id="UITextSelParentCostNegNeg" Overridable="yes">這個功能會釋放 [1] 的硬碟空間。已選擇 [2] 個 (共 [3] 個) 子功能。子功能會釋放 [4] 的硬碟空間。</String>
589 <String Id="UITextSelParentCostNegPos" Overridable="yes">這個功能會釋放 [1] 的硬碟空間。已選擇 [2] 個 (共 [3] 個) 子功能。子功能需要 [4] 的硬碟空間。</String>
590 <String Id="UITextSelParentCostPosNeg" Overridable="yes">這個功能需要 [1] 的硬碟空間。已選擇 [2] 個 (共 [3] 個) 子功能。子功能會釋放 [4] 的硬碟空間。</String>
591 <String Id="UITextSelParentCostPosPos" Overridable="yes">這個功能需要 [1] 的硬碟空間。已選擇 [2] 個 (共 [3] 個) 子功能。子功能需要 [4] 的硬碟空間。</String>
592 <String Id="UITextTimeRemaining" Overridable="yes">剩餘時間: {[1] 分 }{[2] 秒}</String>
593 <String Id="UITextVolumeCostAvailable" Overridable="yes">可用</String>
594 <String Id="UITextVolumeCostDifference" Overridable="yes">差異</String>
595 <String Id="UITextVolumeCostRequired" Overridable="yes">需要</String>
596 <String Id="UITextVolumeCostSize" Overridable="yes">磁碟大小</String>
597 <String Id="UITextVolumeCostVolume" Overridable="yes">磁碟區</String>
598</WixLocalization>
diff --git a/src/ext/UI/wixlib/caSuffix.wxi b/src/ext/UI/wixlib/caSuffix.wxi
new file mode 100644
index 00000000..18436269
--- /dev/null
+++ b/src/ext/UI/wixlib/caSuffix.wxi
@@ -0,0 +1,27 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2
3<Include xmlns="http://wixtoolset.org/schemas/v4/wxs">
4 <?ifndef platform ?>
5 <?error Required value "platform" not defined in include caSuffix.wxi ?>
6 <?endif?>
7
8 <?ifdef Suffix ?>
9 <?undef Suffix ?>
10 <?undef DeferredSuffix ?>
11 <?endif?>
12
13 <?if $(var.platform)="x86" ?>
14 <?define Suffix="" ?>
15 <?define DeferredSuffix="" ?>
16 <?endif?>
17
18 <?if $(var.platform)="x64" ?>
19 <?define Suffix="_x64" ?>
20 <?define DeferredSuffix="_64" ?>
21 <?endif?>
22
23 <?if $(var.platform)="arm" ?>
24 <?define Suffix="_ARM" ?>
25 <?define DeferredSuffix="_ARM" ?>
26 <?endif?>
27</Include>
diff --git a/src/ext/UI/wixlib/ui.wixproj b/src/ext/UI/wixlib/ui.wixproj
new file mode 100644
index 00000000..e9529283
--- /dev/null
+++ b/src/ext/UI/wixlib/ui.wixproj
@@ -0,0 +1,36 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2<Project Sdk="WixToolset.Sdk">
3
4 <PropertyGroup>
5 <OutputType>Library</OutputType>
6 <BindFiles>true</BindFiles>
7 <Cultures>en-us</Cultures>
8 </PropertyGroup>
9
10 <PropertyGroup>
11 <DefineConstants>
12 $(DefineConstants);
13 bannerBmp=$(MSBuildProjectDirectory)\Bitmaps\bannrbmp.bmp;
14 dialogBmp=$(MSBuildProjectDirectory)\Bitmaps\dlgbmp.bmp;
15 exclamationIco=$(MSBuildProjectDirectory)\Bitmaps\exclamic.ico;
16 infoIco=$(MSBuildProjectDirectory)\Bitmaps\info.ico;
17 licenseRtf=$(MSBuildProjectDirectory)\license.rtf;
18 newIco=$(MSBuildProjectDirectory)\Bitmaps\new.ico;
19 upIco=$(MSBuildProjectDirectory)\Bitmaps\up.ico;
20 </DefineConstants>
21 </PropertyGroup>
22
23 <ItemGroup>
24 <BindInputPaths Include="$(OutputPath)x86" BindName='x86' />
25 <BindInputPaths Include="$(OutputPath)x64" BindName='x64' />
26 <BindInputPaths Include="$(OutputPath)arm64" BindName='arm64' />
27 </ItemGroup>
28
29 <ItemGroup>
30 <ProjectReference Include="..\ca\uica.vcxproj" Properties="Platform=x86" ReferenceOutputAssembly="false" />
31 </ItemGroup>
32
33 <ItemGroup>
34 <PackageReference Include="Nerdbank.GitVersioning" Version="3.3.37" PrivateAssets="All" />
35 </ItemGroup>
36</Project>
diff --git a/src/ext/Util/CustomizedNativeRecommendedRules.ruleset b/src/ext/Util/CustomizedNativeRecommendedRules.ruleset
new file mode 100644
index 00000000..142b141c
--- /dev/null
+++ b/src/ext/Util/CustomizedNativeRecommendedRules.ruleset
@@ -0,0 +1,8 @@
1<?xml version="1.0" encoding="utf-8"?>
2<RuleSet Name="Customized Microsoft Native Recommended Rules" Description="Microsoft Native Recommended Rules, -C26812" ToolsVersion="16.0">
3 <Include Path="nativerecommendedrules.ruleset" Action="Default" />
4 <Rules AnalyzerId="Microsoft.Analyzers.NativeCodeAnalysis" RuleNamespace="Microsoft.Rules.Native">
5 <!-- We need C style enums since we support BAs written in C -->
6 <Rule Id="C26812" Action="None" />
7 </Rules>
8</RuleSet> \ No newline at end of file
diff --git a/src/ext/Util/Directory.Build.props b/src/ext/Util/Directory.Build.props
new file mode 100644
index 00000000..b3c6287c
--- /dev/null
+++ b/src/ext/Util/Directory.Build.props
@@ -0,0 +1,27 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3<!--
4 Do NOT modify this file. Update the canonical version in Home\repo-template\src\Directory.Build.props
5 then update all of the repos.
6-->
7<Project>
8 <PropertyGroup>
9 <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
10 <EnableSourceLink Condition=" '$(NCrunch)' == '1' ">false</EnableSourceLink>
11 <MSBuildWarningsAsMessages>MSB3246</MSBuildWarningsAsMessages>
12
13 <ProjectName Condition=" '$(ProjectName)' == '' ">$(MSBuildProjectName)</ProjectName>
14 <BaseOutputPath>$([System.IO.Path]::GetFullPath($(MSBuildThisFileDirectory)..\build\))</BaseOutputPath>
15 <BaseIntermediateOutputPath>$(BaseOutputPath)obj\$(ProjectName)\</BaseIntermediateOutputPath>
16 <OutputPath>$(BaseOutputPath)$(Configuration)\</OutputPath>
17
18 <Authors>WiX Toolset Team</Authors>
19 <Company>WiX Toolset</Company>
20 <Copyright>Copyright (c) .NET Foundation and contributors. All rights reserved.</Copyright>
21 <PackageLicenseExpression>MS-RL</PackageLicenseExpression>
22 <Product>WiX Toolset</Product>
23 </PropertyGroup>
24
25 <Import Project="Directory$(MSBuildProjectExtension).props" Condition=" Exists('Directory$(MSBuildProjectExtension).props') " />
26 <Import Project="Custom.Build.props" Condition=" Exists('Custom.Build.props') " />
27</Project>
diff --git a/src/ext/Util/Directory.Build.targets b/src/ext/Util/Directory.Build.targets
new file mode 100644
index 00000000..2fcc765a
--- /dev/null
+++ b/src/ext/Util/Directory.Build.targets
@@ -0,0 +1,51 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3<!--
4 Do NOT modify this file. Update the canonical version in Home\repo-template\src\Directory.Build.targets
5 then update all of the repos.
6-->
7<!--
8 Replace PackageReferences with ProjectReferences when the projects can be found in .sln.
9 See the original here: https://github.com/dotnet/sdk/issues/1151#issuecomment-385133284
10-->
11<Project>
12 <PropertyGroup>
13 <ReplacePackageReferences>true</ReplacePackageReferences>
14 <TheSolutionPath Condition=" '$(NCrunch)'=='' ">$(SolutionPath)</TheSolutionPath>
15 <TheSolutionPath Condition=" '$(NCrunch)'=='1' ">$(NCrunchOriginalSolutionPath)</TheSolutionPath>
16 </PropertyGroup>
17
18 <Choose>
19 <When Condition="$(ReplacePackageReferences) AND '$(TheSolutionPath)' != '' AND '$(TheSolutionPath)' != '*undefined*' AND Exists('$(TheSolutionPath)')">
20
21 <PropertyGroup>
22 <SolutionFileContent>$([System.IO.File]::ReadAllText($(TheSolutionPath)))</SolutionFileContent>
23 <SmartSolutionDir>$([System.IO.Path]::GetDirectoryName( $(TheSolutionPath) ))</SmartSolutionDir>
24 <RegexPattern>(?&lt;="[PackageName]", ")(.*)(?=", ")</RegexPattern>
25 </PropertyGroup>
26
27 <ItemGroup>
28 <!-- Keep the identity of the PackageReference -->
29 <SmartPackageReference Include="@(PackageReference)">
30 <PackageName>%(Identity)</PackageName>
31 <InSolution>$(SolutionFileContent.Contains('\%(Identity).csproj'))</InSolution>
32 </SmartPackageReference>
33
34 <!-- Filter them by mapping them to another ItemGroup using the WithMetadataValue item function -->
35 <PackageInSolution Include="@(SmartPackageReference->WithMetadataValue('InSolution', True))">
36 <Pattern>$(RegexPattern.Replace('[PackageName]','%(PackageName)') )</Pattern>
37 <SmartPath>$([System.Text.RegularExpressions.Regex]::Match('$(SolutionFileContent)', '%(Pattern)'))</SmartPath>
38 </PackageInSolution>
39
40 <ProjectReference Include="@(PackageInSolution->'$(SmartSolutionDir)\%(SmartPath)' )"/>
41
42 <!-- Remove the package references that are now referenced as projects -->
43 <PackageReference Remove="@(PackageInSolution->'%(PackageName)')"/>
44 </ItemGroup>
45
46 </When>
47 </Choose>
48
49 <Import Project="Directory$(MSBuildProjectExtension).targets" Condition=" Exists('Directory$(MSBuildProjectExtension).targets') " />
50 <Import Project="Custom.Build.targets" Condition=" Exists('Custom.Build.targets') " />
51</Project>
diff --git a/src/ext/Util/Directory.csproj.props b/src/ext/Util/Directory.csproj.props
new file mode 100644
index 00000000..81d24ad1
--- /dev/null
+++ b/src/ext/Util/Directory.csproj.props
@@ -0,0 +1,13 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2<!--
3 Do NOT modify this file. Update the canonical version in Home\repo-template\src\CSharp.Build.props
4 then update all of the repos.
5-->
6<Project>
7 <PropertyGroup>
8 <CheckForOverflowUnderflow>true</CheckForOverflowUnderflow>
9 <SignAssembly>true</SignAssembly>
10 <AssemblyOriginatorKeyFile>$([System.IO.Path]::GetFullPath($(MSBuildThisFileDirectory)wix.snk))</AssemblyOriginatorKeyFile>
11 <NBGV_EmitThisAssemblyClass>false</NBGV_EmitThisAssemblyClass>
12 </PropertyGroup>
13</Project>
diff --git a/src/ext/Util/Directory.csproj.targets b/src/ext/Util/Directory.csproj.targets
new file mode 100644
index 00000000..c3270426
--- /dev/null
+++ b/src/ext/Util/Directory.csproj.targets
@@ -0,0 +1,26 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2<!--
3 Do NOT modify this file. Update the canonical version in Home\repo-template\src\Directory.csproj.targets
4 then update all of the repos.
5-->
6<Project>
7 <PropertyGroup>
8 <CreateDocumentation Condition=" '$(CreateDocumentationFile)'!='true' ">false</CreateDocumentation>
9 <DocumentationFile Condition=" '$(CreateDocumentationFile)'=='true' ">$(OutputPath)\$(AssemblyName).xml</DocumentationFile>
10 </PropertyGroup>
11
12 <Target Name="SetNuspecProperties" DependsOnTargets="InitializeSourceControlInformation" AfterTargets="GetBuildVersion"
13 Condition=" Exists('$(MSBuildProjectName).nuspec') ">
14 <PropertyGroup>
15 <ProjectUrl Condition=" '$(ProjectUrl)'=='' and '$(PrivateRepositoryUrl)'!='' ">$(PrivateRepositoryUrl.Replace('.git',''))</ProjectUrl>
16
17 <NuspecFile>$(MSBuildProjectName).nuspec</NuspecFile>
18 <NuspecBasePath Condition=" '$(NuspecBasePath)'=='' ">$(OutputPath)..\</NuspecBasePath>
19 <NuspecProperties>$(NuspecProperties);Id=$(PackageId);Authors=$(Authors);Copyright=$(Copyright);Description=$(Description);Title=$(Title)</NuspecProperties>
20 <NuspecProperties>$(NuspecProperties);Version=$(PackageVersion);RepositoryCommit=$(SourceRevisionId);RepositoryType=$(RepositoryType);RepositoryUrl=$(PrivateRepositoryUrl);ProjectFolder=$(MSBuildProjectDirectory)\;ProjectUrl=$(ProjectUrl)</NuspecProperties>
21 <PublishRepositoryUrl>true</PublishRepositoryUrl>
22 <SymbolPackageFormat>snupkg</SymbolPackageFormat>
23 </PropertyGroup>
24 </Target>
25
26</Project>
diff --git a/src/ext/Util/Directory.vcxproj.props b/src/ext/Util/Directory.vcxproj.props
new file mode 100644
index 00000000..11778f41
--- /dev/null
+++ b/src/ext/Util/Directory.vcxproj.props
@@ -0,0 +1,97 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3
4<Project>
5 <PropertyGroup>
6 <Platform Condition=" '$(Platform)' == '' OR '$(Platform)' == 'AnyCPU' ">Win32</Platform>
7 <IntDir>$(BaseIntermediateOutputPath)$(Configuration)\$(Platform)\</IntDir>
8 <OutDir>$(OutputPath)$(Platform)\</OutDir>
9
10 <!-- NBGV properties -->
11 <AssemblyCompany>$(Company)</AssemblyCompany>
12 <AssemblyCopyright>$(Copyright)</AssemblyCopyright>
13
14 <RuntimeIdentifiers>win-x86;win-x64;win-arm64</RuntimeIdentifiers>
15 <NuGetTargetMoniker>native,Version=v0.0</NuGetTargetMoniker>
16 </PropertyGroup>
17
18 <PropertyGroup Condition="'$(WindowsTargetPlatformVersion)'=='' AND '$(VisualStudioVersion)'>='15.0'">
19 <WindowsTargetPlatformVersion>$([Microsoft.Build.Utilities.ToolLocationHelper]::GetLatestSDKTargetPlatformVersion('Windows', '10.0'))</WindowsTargetPlatformVersion>
20 </PropertyGroup>
21
22 <PropertyGroup>
23 <CodeAnalysisRuleSet>$(MSBuildThisFileDirectory)CustomizedNativeRecommendedRules.ruleset</CodeAnalysisRuleSet>
24 </PropertyGroup>
25
26 <ItemDefinitionGroup>
27 <ClCompile>
28 <DisableSpecificWarnings>$(DisableSpecificCompilerWarnings)</DisableSpecificWarnings>
29 <WarningLevel>Level4</WarningLevel>
30 <AdditionalIncludeDirectories>$(ProjectDir)inc;$(MSBuildProjectDirectory);$(IntDir);$(SqlCESdkIncludePath);$(ProjectAdditionalIncludeDirectories);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
31 <PreprocessorDefinitions>WIN32;_WINDOWS;_WIN32_MSI=500;_WIN32_WINNT=0x0501;$(ArmPreprocessorDefinitions);$(UnicodePreprocessorDefinitions);_CRT_STDIO_LEGACY_WIDE_SPECIFIERS;_WINSOCK_DEPRECATED_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
32 <PrecompiledHeader>Use</PrecompiledHeader>
33 <PrecompiledHeaderFile>precomp.h</PrecompiledHeaderFile>
34 <CallingConvention Condition="'$(Platform)'=='Win32'">StdCall</CallingConvention>
35 <TreatWarningAsError>true</TreatWarningAsError>
36 <ExceptionHandling>false</ExceptionHandling>
37 <AdditionalOptions>-YlprecompDefine</AdditionalOptions>
38 <AdditionalOptions Condition=" $(PlatformToolset.StartsWith('v14')) ">/Zc:threadSafeInit- %(AdditionalOptions)</AdditionalOptions>
39 <MultiProcessorCompilation Condition=" $(NUMBER_OF_PROCESSORS) &gt; 4 ">true</MultiProcessorCompilation>
40 </ClCompile>
41 <ResourceCompile>
42 <PreprocessorDefinitions>$(ArmPreprocessorDefinitions);%(PreprocessorDefinitions)</PreprocessorDefinitions>
43 <AdditionalIncludeDirectories>$(ProjectAdditionalResourceIncludeDirectories);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
44 </ResourceCompile>
45 <Lib>
46 <AdditionalLibraryDirectories>$(OutDir);$(AdditionalMultiTargetLibraryPath);$(ProjectAdditionalLibraryDirectories);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
47 </Lib>
48 <Link>
49 <SubSystem>$(ProjectSubSystem)</SubSystem>
50 <ModuleDefinitionFile>$(ProjectModuleDefinitionFile)</ModuleDefinitionFile>
51 <NoEntryPoint>$(ResourceOnlyDll)</NoEntryPoint>
52 <GenerateDebugInformation>true</GenerateDebugInformation>
53 <AdditionalDependencies>$(ProjectAdditionalLinkLibraries);advapi32.lib;comdlg32.lib;user32.lib;oleaut32.lib;gdi32.lib;shell32.lib;ole32.lib;version.lib;%(AdditionalDependencies)</AdditionalDependencies>
54 <AdditionalLibraryDirectories>$(OutDir);$(AdditionalMultiTargetLibraryPath);$(ArmLibraryDirectories);$(ProjectAdditionalLinkLibraryDirectories);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
55 <AdditionalOptions Condition=" $(PlatformToolset.StartsWith('v14')) ">/IGNORE:4099 %(AdditionalOptions)</AdditionalOptions>
56 </Link>
57 </ItemDefinitionGroup>
58
59 <ItemDefinitionGroup Condition=" '$(Platform)'=='Win32' and '$(PlatformToolset)'!='v100'">
60 <ClCompile>
61 <EnableEnhancedInstructionSet>NoExtensions</EnableEnhancedInstructionSet>
62 </ClCompile>
63 </ItemDefinitionGroup>
64 <ItemDefinitionGroup Condition=" '$(Platform)'=='arm' ">
65 <ClCompile>
66 <CallingConvention>CDecl</CallingConvention>
67 </ClCompile>
68 </ItemDefinitionGroup>
69 <ItemDefinitionGroup Condition=" '$(ConfigurationType)'=='StaticLibrary' ">
70 <ClCompile>
71 <DebugInformationFormat>OldStyle</DebugInformationFormat>
72 <OmitDefaultLibName>true</OmitDefaultLibName>
73 <IgnoreAllDefaultLibraries>true</IgnoreAllDefaultLibraries>
74 </ClCompile>
75 </ItemDefinitionGroup>
76 <ItemDefinitionGroup Condition=" '$(Configuration)'=='Debug' ">
77 <ClCompile>
78 <Optimization>Disabled</Optimization>
79 <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
80 <PreprocessorDefinitions>_DEBUG;DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
81 <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
82 </ClCompile>
83 </ItemDefinitionGroup>
84 <ItemDefinitionGroup Condition=" '$(Configuration)'=='Release' ">
85 <ClCompile>
86 <Optimization>MinSpace</Optimization>
87 <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
88 <FunctionLevelLinking>true</FunctionLevelLinking>
89 <IntrinsicFunctions>true</IntrinsicFunctions>
90 <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
91 </ClCompile>
92 <Link>
93 <EnableCOMDATFolding>true</EnableCOMDATFolding>
94 <OptimizeReferences>true</OptimizeReferences>
95 </Link>
96 </ItemDefinitionGroup>
97</Project>
diff --git a/src/ext/Util/README.md b/src/ext/Util/README.md
new file mode 100644
index 00000000..540c539c
--- /dev/null
+++ b/src/ext/Util/README.md
@@ -0,0 +1,3 @@
1# Util.wixext
2WixToolset.Util.wixext - Utility WiX Toolset Extension
3
diff --git a/src/ext/Util/Util.wixext.sln b/src/ext/Util/Util.wixext.sln
new file mode 100644
index 00000000..050fd8b3
--- /dev/null
+++ b/src/ext/Util/Util.wixext.sln
@@ -0,0 +1,87 @@
1
2Microsoft Visual Studio Solution File, Format Version 12.00
3# Visual Studio Version 16
4VisualStudioVersion = 16.0.30204.135
5MinimumVisualStudioVersion = 15.0.26124.0
6Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "utilbe", "src\be\utilbe.vcxproj", "{630C1EE7-2517-4A8C-83E3-DA1150308B58}"
7EndProject
8Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "utilca", "src\ca\utilca.vcxproj", "{076018F7-19BD-423A-ABBF-229273DA08D8}"
9EndProject
10Project("{930C7802-8A8C-48F9-8165-68863BCCD9DD}") = "util", "src\wixlib\util.wixproj", "{1ACFFEFD-505A-41A5-ACBF-A02B7B473AA2}"
11EndProject
12Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WixToolset.Util.wixext", "src\wixext\WixToolset.Util.wixext.csproj", "{6CF033EB-0A39-4AC6-9D41-9BD506352045}"
13EndProject
14Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WixToolsetTest.Util", "src\test\WixToolsetTest.Util\WixToolsetTest.Util.csproj", "{D5D34EC4-AF91-4B11-AC0A-FA5242AE924B}"
15EndProject
16Global
17 GlobalSection(SolutionConfigurationPlatforms) = preSolution
18 Debug|Any CPU = Debug|Any CPU
19 Debug|x64 = Debug|x64
20 Debug|x86 = Debug|x86
21 Release|Any CPU = Release|Any CPU
22 Release|x64 = Release|x64
23 Release|x86 = Release|x86
24 EndGlobalSection
25 GlobalSection(ProjectConfigurationPlatforms) = postSolution
26 {630C1EE7-2517-4A8C-83E3-DA1150308B58}.Debug|Any CPU.ActiveCfg = Debug|Win32
27 {630C1EE7-2517-4A8C-83E3-DA1150308B58}.Debug|Any CPU.Build.0 = Debug|Win32
28 {630C1EE7-2517-4A8C-83E3-DA1150308B58}.Debug|x64.ActiveCfg = Debug|Win32
29 {630C1EE7-2517-4A8C-83E3-DA1150308B58}.Debug|x86.ActiveCfg = Debug|Win32
30 {630C1EE7-2517-4A8C-83E3-DA1150308B58}.Debug|x86.Build.0 = Debug|Win32
31 {630C1EE7-2517-4A8C-83E3-DA1150308B58}.Release|Any CPU.ActiveCfg = Release|Win32
32 {630C1EE7-2517-4A8C-83E3-DA1150308B58}.Release|Any CPU.Build.0 = Release|Win32
33 {630C1EE7-2517-4A8C-83E3-DA1150308B58}.Release|x64.ActiveCfg = Release|Win32
34 {630C1EE7-2517-4A8C-83E3-DA1150308B58}.Release|x86.ActiveCfg = Release|Win32
35 {630C1EE7-2517-4A8C-83E3-DA1150308B58}.Release|x86.Build.0 = Release|Win32
36 {076018F7-19BD-423A-ABBF-229273DA08D8}.Debug|Any CPU.ActiveCfg = Debug|Win32
37 {076018F7-19BD-423A-ABBF-229273DA08D8}.Debug|Any CPU.Build.0 = Debug|Win32
38 {076018F7-19BD-423A-ABBF-229273DA08D8}.Debug|x64.ActiveCfg = Debug|Win32
39 {076018F7-19BD-423A-ABBF-229273DA08D8}.Debug|x86.ActiveCfg = Debug|Win32
40 {076018F7-19BD-423A-ABBF-229273DA08D8}.Debug|x86.Build.0 = Debug|Win32
41 {076018F7-19BD-423A-ABBF-229273DA08D8}.Release|Any CPU.ActiveCfg = Release|Win32
42 {076018F7-19BD-423A-ABBF-229273DA08D8}.Release|Any CPU.Build.0 = Release|Win32
43 {076018F7-19BD-423A-ABBF-229273DA08D8}.Release|x64.ActiveCfg = Release|Win32
44 {076018F7-19BD-423A-ABBF-229273DA08D8}.Release|x86.ActiveCfg = Release|Win32
45 {076018F7-19BD-423A-ABBF-229273DA08D8}.Release|x86.Build.0 = Release|Win32
46 {1ACFFEFD-505A-41A5-ACBF-A02B7B473AA2}.Debug|Any CPU.ActiveCfg = Debug|x86
47 {1ACFFEFD-505A-41A5-ACBF-A02B7B473AA2}.Debug|Any CPU.Build.0 = Debug|x86
48 {1ACFFEFD-505A-41A5-ACBF-A02B7B473AA2}.Debug|x64.ActiveCfg = Debug|x86
49 {1ACFFEFD-505A-41A5-ACBF-A02B7B473AA2}.Debug|x86.ActiveCfg = Debug|x86
50 {1ACFFEFD-505A-41A5-ACBF-A02B7B473AA2}.Debug|x86.Build.0 = Debug|x86
51 {1ACFFEFD-505A-41A5-ACBF-A02B7B473AA2}.Release|Any CPU.ActiveCfg = Release|x86
52 {1ACFFEFD-505A-41A5-ACBF-A02B7B473AA2}.Release|Any CPU.Build.0 = Release|x86
53 {1ACFFEFD-505A-41A5-ACBF-A02B7B473AA2}.Release|x64.ActiveCfg = Release|x86
54 {1ACFFEFD-505A-41A5-ACBF-A02B7B473AA2}.Release|x86.ActiveCfg = Release|x86
55 {1ACFFEFD-505A-41A5-ACBF-A02B7B473AA2}.Release|x86.Build.0 = Release|x86
56 {6CF033EB-0A39-4AC6-9D41-9BD506352045}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
57 {6CF033EB-0A39-4AC6-9D41-9BD506352045}.Debug|Any CPU.Build.0 = Debug|Any CPU
58 {6CF033EB-0A39-4AC6-9D41-9BD506352045}.Debug|x64.ActiveCfg = Debug|Any CPU
59 {6CF033EB-0A39-4AC6-9D41-9BD506352045}.Debug|x64.Build.0 = Debug|Any CPU
60 {6CF033EB-0A39-4AC6-9D41-9BD506352045}.Debug|x86.ActiveCfg = Debug|Any CPU
61 {6CF033EB-0A39-4AC6-9D41-9BD506352045}.Debug|x86.Build.0 = Debug|Any CPU
62 {6CF033EB-0A39-4AC6-9D41-9BD506352045}.Release|Any CPU.ActiveCfg = Release|Any CPU
63 {6CF033EB-0A39-4AC6-9D41-9BD506352045}.Release|Any CPU.Build.0 = Release|Any CPU
64 {6CF033EB-0A39-4AC6-9D41-9BD506352045}.Release|x64.ActiveCfg = Release|Any CPU
65 {6CF033EB-0A39-4AC6-9D41-9BD506352045}.Release|x64.Build.0 = Release|Any CPU
66 {6CF033EB-0A39-4AC6-9D41-9BD506352045}.Release|x86.ActiveCfg = Release|Any CPU
67 {6CF033EB-0A39-4AC6-9D41-9BD506352045}.Release|x86.Build.0 = Release|Any CPU
68 {D5D34EC4-AF91-4B11-AC0A-FA5242AE924B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
69 {D5D34EC4-AF91-4B11-AC0A-FA5242AE924B}.Debug|Any CPU.Build.0 = Debug|Any CPU
70 {D5D34EC4-AF91-4B11-AC0A-FA5242AE924B}.Debug|x64.ActiveCfg = Debug|Any CPU
71 {D5D34EC4-AF91-4B11-AC0A-FA5242AE924B}.Debug|x64.Build.0 = Debug|Any CPU
72 {D5D34EC4-AF91-4B11-AC0A-FA5242AE924B}.Debug|x86.ActiveCfg = Debug|Any CPU
73 {D5D34EC4-AF91-4B11-AC0A-FA5242AE924B}.Debug|x86.Build.0 = Debug|Any CPU
74 {D5D34EC4-AF91-4B11-AC0A-FA5242AE924B}.Release|Any CPU.ActiveCfg = Release|Any CPU
75 {D5D34EC4-AF91-4B11-AC0A-FA5242AE924B}.Release|Any CPU.Build.0 = Release|Any CPU
76 {D5D34EC4-AF91-4B11-AC0A-FA5242AE924B}.Release|x64.ActiveCfg = Release|Any CPU
77 {D5D34EC4-AF91-4B11-AC0A-FA5242AE924B}.Release|x64.Build.0 = Release|Any CPU
78 {D5D34EC4-AF91-4B11-AC0A-FA5242AE924B}.Release|x86.ActiveCfg = Release|Any CPU
79 {D5D34EC4-AF91-4B11-AC0A-FA5242AE924B}.Release|x86.Build.0 = Release|Any CPU
80 EndGlobalSection
81 GlobalSection(SolutionProperties) = preSolution
82 HideSolutionNode = FALSE
83 EndGlobalSection
84 GlobalSection(ExtensibilityGlobals) = postSolution
85 SolutionGuid = {E4566A6B-47D0-4EA0-989A-D763AC39105D}
86 EndGlobalSection
87EndGlobal
diff --git a/src/ext/Util/Util.wixext.v3.ncrunchsolution b/src/ext/Util/Util.wixext.v3.ncrunchsolution
new file mode 100644
index 00000000..10420ac9
--- /dev/null
+++ b/src/ext/Util/Util.wixext.v3.ncrunchsolution
@@ -0,0 +1,6 @@
1<SolutionConfiguration>
2 <Settings>
3 <AllowParallelTestExecution>True</AllowParallelTestExecution>
4 <SolutionConfigured>True</SolutionConfigured>
5 </Settings>
6</SolutionConfiguration> \ No newline at end of file
diff --git a/src/ext/Util/appveyor.cmd b/src/ext/Util/appveyor.cmd
new file mode 100644
index 00000000..8322ffae
--- /dev/null
+++ b/src/ext/Util/appveyor.cmd
@@ -0,0 +1,19 @@
1@setlocal
2@pushd %~dp0
3@set _C=Release
4@if /i "%1"=="debug" set _C=Debug
5
6:: Restore
7msbuild -p:Configuration=%_C% -t:Restore || exit /b
8
9:: Build
10msbuild -p:Configuration=%_C% src\test\WixToolsetTest.Util\WixToolsetTest.Util.csproj || exit /b
11
12:: Test
13dotnet test -c %_C% --no-build src\test\WixToolsetTest.Util || exit /b
14
15:: Pack
16msbuild -p:Configuration=%_C% -p:NoBuild=true -t:Pack src\wixext\WixToolset.Util.wixext.csproj || exit /b
17
18@popd
19@endlocal
diff --git a/src/ext/Util/appveyor.yml b/src/ext/Util/appveyor.yml
new file mode 100644
index 00000000..7c686b04
--- /dev/null
+++ b/src/ext/Util/appveyor.yml
@@ -0,0 +1,40 @@
1# Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2#
3# Do NOT modify this file. Update the canonical version in Home\repo-template\src\appveyor.yml
4# then update all of the repos.
5
6branches:
7 only:
8 - master
9 - develop
10
11image: Visual Studio 2019
12
13version: 0.0.0.{build}
14configuration: Release
15
16environment:
17 DOTNET_SKIP_FIRST_TIME_EXPERIENCE: true
18 DOTNET_CLI_TELEMETRY_OPTOUT: 1
19 NUGET_XMLDOC_MODE: skip
20
21build_script:
22 - appveyor.cmd
23
24pull_requests:
25 do_not_increment_build_number: true
26
27nuget:
28 disable_publish_on_pr: true
29
30skip_branch_with_pr: true
31skip_tags: true
32
33artifacts:
34- path: build\Release\**\*.nupkg
35 name: nuget
36
37notifications:
38- provider: Slack
39 incoming_webhook:
40 secure: p5xuu+4x2JHfwGDMDe5KcG1k7gZxqYc4jWVwvyNZv5cvkubPD2waJs5yXMAXZNN7Z63/3PWHb7q4KoY/99AjauYa1nZ4c5qYqRPFRBKTHfA=
diff --git a/src/ext/Util/be/UtilBundleExtension.cpp b/src/ext/Util/be/UtilBundleExtension.cpp
new file mode 100644
index 00000000..2ac842a5
--- /dev/null
+++ b/src/ext/Util/be/UtilBundleExtension.cpp
@@ -0,0 +1,87 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3#include "precomp.h"
4#include "BextBaseBundleExtension.h"
5
6class CWixUtilBundleExtension : public CBextBaseBundleExtension
7{
8public: // IBundleExtension
9 virtual STDMETHODIMP Search(
10 __in LPCWSTR wzId,
11 __in LPCWSTR wzVariable
12 )
13 {
14 HRESULT hr = S_OK;
15
16 hr = UtilSearchExecute(&m_searches, wzId, wzVariable, m_pEngine);
17
18 return hr;
19 }
20
21public: //CBextBaseBundleExtension
22 virtual STDMETHODIMP Initialize(
23 __in const BUNDLE_EXTENSION_CREATE_ARGS* pCreateArgs
24 )
25 {
26 HRESULT hr = S_OK;
27 IXMLDOMDocument* pixdManifest = NULL;
28 IXMLDOMNode* pixnBundleExtension = NULL;
29
30 hr = CBextBaseBundleExtension::Initialize(pCreateArgs);
31 ExitOnFailure(hr, "CBextBaseBundleExtension initialization failed.");
32
33 hr = XmlLoadDocumentFromFile(m_sczBundleExtensionDataPath, &pixdManifest);
34 ExitOnFailure(hr, "Failed to load bundle extension manifest from path: %ls", m_sczBundleExtensionDataPath);
35
36 hr = BextGetBundleExtensionDataNode(pixdManifest, UTIL_BUNDLE_EXTENSION_ID, &pixnBundleExtension);
37 ExitOnFailure(hr, "Failed to get BundleExtension '%ls'", UTIL_BUNDLE_EXTENSION_ID);
38
39 hr = UtilSearchParseFromXml(&m_searches, pixnBundleExtension);
40 ExitOnFailure(hr, "Failed to parse searches from bundle extension manifest.");
41
42 LExit:
43 ReleaseObject(pixnBundleExtension);
44 ReleaseObject(pixdManifest);
45
46 return hr;
47 }
48
49public:
50 CWixUtilBundleExtension(
51 __in IBundleExtensionEngine* pEngine
52 ) : CBextBaseBundleExtension(pEngine)
53 {
54 m_searches = { };
55 }
56
57 ~CWixUtilBundleExtension()
58 {
59 UtilSearchUninitialize(&m_searches);
60 }
61
62private:
63 UTIL_SEARCHES m_searches;
64};
65
66HRESULT UtilBundleExtensionCreate(
67 __in IBundleExtensionEngine* pEngine,
68 __in const BUNDLE_EXTENSION_CREATE_ARGS* pArgs,
69 __out IBundleExtension** ppBundleExtension
70 )
71{
72 HRESULT hr = S_OK;
73 CWixUtilBundleExtension* pExtension = NULL;
74
75 pExtension = new CWixUtilBundleExtension(pEngine);
76 ExitOnNull(pExtension, hr, E_OUTOFMEMORY, "Failed to create new CWixUtilBundleExtension.");
77
78 hr = pExtension->Initialize(pArgs);
79 ExitOnFailure(hr, "CWixUtilBundleExtension initialization failed");
80
81 *ppBundleExtension = pExtension;
82 pExtension = NULL;
83
84LExit:
85 ReleaseObject(pExtension);
86 return hr;
87}
diff --git a/src/ext/Util/be/UtilBundleExtension.h b/src/ext/Util/be/UtilBundleExtension.h
new file mode 100644
index 00000000..c55d6b85
--- /dev/null
+++ b/src/ext/Util/be/UtilBundleExtension.h
@@ -0,0 +1,16 @@
1#pragma once
2// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
3
4
5// constants
6
7#define UTIL_BUNDLE_EXTENSION_ID BUNDLE_EXTENSION_DECORATION(L"UtilBundleExtension")
8
9
10// function declarations
11
12HRESULT UtilBundleExtensionCreate(
13 __in IBundleExtensionEngine* pEngine,
14 __in const BUNDLE_EXTENSION_CREATE_ARGS* pArgs,
15 __out IBundleExtension** ppBundleExtension
16 );
diff --git a/src/ext/Util/be/beDecor.h b/src/ext/Util/be/beDecor.h
new file mode 100644
index 00000000..2c6a8818
--- /dev/null
+++ b/src/ext/Util/be/beDecor.h
@@ -0,0 +1,13 @@
1#pragma once
2// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
3
4
5#if defined(_M_ARM64)
6#define BUNDLE_EXTENSION_DECORATION(f) L"Wix4" f L"_A64"
7#elif defined(_M_AMD64)
8#define BUNDLE_EXTENSION_DECORATION(f) L"Wix4" f L"_X64"
9#elif defined(_M_ARM)
10#define BUNDLE_EXTENSION_DECORATION(f) L"Wix4" f L"_ARM"
11#else
12#define BUNDLE_EXTENSION_DECORATION(f) L"Wix4" f L"_X86"
13#endif
diff --git a/src/ext/Util/be/detectsha2support.cpp b/src/ext/Util/be/detectsha2support.cpp
new file mode 100644
index 00000000..90e349cd
--- /dev/null
+++ b/src/ext/Util/be/detectsha2support.cpp
@@ -0,0 +1,58 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3#include "precomp.h"
4
5// https://gist.github.com/navossoc/7572c7d82243e9f818989e2765e7793a
6HRESULT DetectSHA2CodeSigning(
7 __out BOOL* pfSupported
8 )
9{
10 HRESULT hr = S_OK;
11 HMODULE hModule = NULL;
12 FARPROC pfn = NULL;
13 DWORD er = ERROR_SUCCESS;
14
15 hr = LoadSystemLibrary(L"wintrust.dll", &hModule);
16 ExitOnFailure(hr, "Failed to load wintrust.dll");
17
18 pfn = ::GetProcAddress(hModule, "CryptCATAdminAcquireContext2");
19 if (pfn)
20 {
21 *pfSupported = TRUE;
22 ExitFunction1(hr = S_OK);
23 }
24
25 er = ::GetLastError();
26 if (er == ERROR_PROC_NOT_FOUND)
27 {
28 *pfSupported = FALSE;
29 ExitFunction1(hr = S_OK);
30 }
31
32 hr = HRESULT_FROM_WIN32(er);
33 ExitOnFailure(hr, "Failed to probe for CryptCATAdminAcquireContext2 in wintrust.dll");
34
35LExit:
36 ::FreeLibrary(hModule);
37
38 return hr;
39}
40
41HRESULT UtilPerformDetectSHA2CodeSigning(
42 __in LPCWSTR wzVariable,
43 __in UTIL_SEARCH* /*pSearch*/,
44 __in IBundleExtensionEngine* pEngine
45 )
46{
47 HRESULT hr = S_OK;
48 BOOL fSupported = FALSE;
49
50 hr = DetectSHA2CodeSigning(&fSupported);
51 ExitOnFailure(hr, "DetectSHA2CodeSigning failed.");
52
53 hr = pEngine->SetVariableNumeric(wzVariable, fSupported ? 1 : 0);
54 ExitOnFailure(hr, "Failed to set variable '%ls'", wzVariable);
55
56LExit:
57 return hr;
58}
diff --git a/src/ext/Util/be/detectsha2support.h b/src/ext/Util/be/detectsha2support.h
new file mode 100644
index 00000000..c38a3d59
--- /dev/null
+++ b/src/ext/Util/be/detectsha2support.h
@@ -0,0 +1,8 @@
1#pragma once
2// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
3
4HRESULT UtilPerformDetectSHA2CodeSigning(
5 __in LPCWSTR wzVariable,
6 __in UTIL_SEARCH* pSearch,
7 __in IBundleExtensionEngine* pEngine
8 ); \ No newline at end of file
diff --git a/src/ext/Util/be/precomp.cpp b/src/ext/Util/be/precomp.cpp
new file mode 100644
index 00000000..37664a1c
--- /dev/null
+++ b/src/ext/Util/be/precomp.cpp
@@ -0,0 +1,3 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3#include "precomp.h"
diff --git a/src/ext/Util/be/precomp.h b/src/ext/Util/be/precomp.h
new file mode 100644
index 00000000..76d24c7b
--- /dev/null
+++ b/src/ext/Util/be/precomp.h
@@ -0,0 +1,37 @@
1#pragma once
2// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
3
4
5#if _WIN32_MSI < 150
6#define _WIN32_MSI 150
7#endif
8
9#include <windows.h>
10#include <msiquery.h>
11#include <msidefs.h>
12#include <stierr.h>
13
14#include <strsafe.h>
15
16#include <msxml2.h>
17
18#define MAXUINT USHRT_MAX
19
20#include <dutil.h>
21#include <memutil.h>
22#include <strutil.h>
23#include <pathutil.h>
24#include <xmlutil.h>
25
26#include <BundleExtensionEngine.h>
27#include <BundleExtension.h>
28
29#include <IBundleExtensionEngine.h>
30#include <IBundleExtension.h>
31#include <bextutil.h>
32#include <BextBundleExtensionEngine.h>
33
34#include "beDecor.h"
35#include "utilsearch.h"
36#include "detectsha2support.h"
37#include "UtilBundleExtension.h"
diff --git a/src/ext/Util/be/utilbe.cpp b/src/ext/Util/be/utilbe.cpp
new file mode 100644
index 00000000..d9816dc7
--- /dev/null
+++ b/src/ext/Util/be/utilbe.cpp
@@ -0,0 +1,41 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3#include "precomp.h"
4#include "BextBaseBundleExtensionProc.h"
5
6static IBundleExtension* vpBundleExtension = NULL;
7
8// function definitions
9
10extern "C" HRESULT WINAPI BundleExtensionCreate(
11 __in const BUNDLE_EXTENSION_CREATE_ARGS* pArgs,
12 __inout BUNDLE_EXTENSION_CREATE_RESULTS* pResults
13 )
14{
15 HRESULT hr = S_OK;
16 IBundleExtensionEngine* pEngine = NULL;
17
18 hr = XmlInitialize();
19 ExitOnFailure(hr, "Failed to initialize XML.");
20
21 hr = BextInitializeFromCreateArgs(pArgs, &pEngine);
22 ExitOnFailure(hr, "Failed to initialize bext");
23
24 hr = UtilBundleExtensionCreate(pEngine, pArgs, &vpBundleExtension);
25 BextExitOnFailure(hr, "Failed to create WixUtilBundleExtension");
26
27 pResults->pfnBundleExtensionProc = BextBaseBundleExtensionProc;
28 pResults->pvBundleExtensionProcContext = vpBundleExtension;
29
30LExit:
31 ReleaseObject(pEngine);
32
33 return hr;
34}
35
36extern "C" void WINAPI BundleExtensionDestroy()
37{
38 BextUninitialize();
39 ReleaseNullObject(vpBundleExtension);
40 XmlUninitialize();
41} \ No newline at end of file
diff --git a/src/ext/Util/be/utilbe.def b/src/ext/Util/be/utilbe.def
new file mode 100644
index 00000000..711b1a5c
--- /dev/null
+++ b/src/ext/Util/be/utilbe.def
@@ -0,0 +1,8 @@
1; Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3
4LIBRARY "utilbe"
5
6EXPORTS
7 BundleExtensionCreate
8 BundleExtensionDestroy
diff --git a/src/ext/Util/be/utilbe.vcxproj b/src/ext/Util/be/utilbe.vcxproj
new file mode 100644
index 00000000..683b376a
--- /dev/null
+++ b/src/ext/Util/be/utilbe.vcxproj
@@ -0,0 +1,80 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3
4<Project DefaultTargets="Build" ToolsVersion="16.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
5 <ItemGroup Label="ProjectConfigurations">
6 <ProjectConfiguration Include="Debug|ARM64">
7 <Configuration>Debug</Configuration>
8 <Platform>ARM64</Platform>
9 </ProjectConfiguration>
10 <ProjectConfiguration Include="Release|ARM64">
11 <Configuration>Release</Configuration>
12 <Platform>ARM64</Platform>
13 </ProjectConfiguration>
14 <ProjectConfiguration Include="Debug|X64">
15 <Configuration>Debug</Configuration>
16 <Platform>X64</Platform>
17 </ProjectConfiguration>
18 <ProjectConfiguration Include="Release|X64">
19 <Configuration>Release</Configuration>
20 <Platform>X64</Platform>
21 </ProjectConfiguration>
22 <ProjectConfiguration Include="Debug|Win32">
23 <Configuration>Debug</Configuration>
24 <Platform>Win32</Platform>
25 </ProjectConfiguration>
26 <ProjectConfiguration Include="Release|Win32">
27 <Configuration>Release</Configuration>
28 <Platform>Win32</Platform>
29 </ProjectConfiguration>
30 </ItemGroup>
31
32 <PropertyGroup Label="Globals">
33 <ProjectGuid>{630C1EE7-2517-4A8C-83E3-DA1150308B58}</ProjectGuid>
34 <ConfigurationType>DynamicLibrary</ConfigurationType>
35 <TargetName>utilbe</TargetName>
36 <PlatformToolset>v142</PlatformToolset>
37 <CharacterSet>Unicode</CharacterSet>
38 <ProjectModuleDefinitionFile>utilbe.def</ProjectModuleDefinitionFile>
39 <Description>WiX Toolset Util BundleExtension</Description>
40 </PropertyGroup>
41
42 <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
43 <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
44
45 <PropertyGroup>
46 <ProjectAdditionalLinkLibraries>msi.lib</ProjectAdditionalLinkLibraries>
47 </PropertyGroup>
48
49 <ItemGroup>
50 <ClCompile Include="detectsha2support.cpp" />
51 <ClCompile Include="precomp.cpp">
52 <PrecompiledHeader>Create</PrecompiledHeader>
53 </ClCompile>
54 <ClCompile Include="utilbe.cpp" />
55 <ClCompile Include="UtilBundleExtension.cpp" />
56 <ClCompile Include="utilsearch.cpp" />
57 </ItemGroup>
58
59 <ItemGroup>
60 <ClInclude Include="beDecor.h" />
61 <ClInclude Include="detectsha2support.h" />
62 <ClInclude Include="precomp.h" />
63 <ClInclude Include="UtilBundleExtension.h" />
64 <ClInclude Include="utilsearch.h" />
65 </ItemGroup>
66
67 <ItemGroup>
68 <None Include="utilbe.def" />
69 </ItemGroup>
70
71 <ItemGroup>
72 <PackageReference Include="WixToolset.BextUtil" Version="4.0.58" />
73 <PackageReference Include="WixToolset.BootstrapperCore.Native" Version="4.0.141" />
74 <PackageReference Include="WixToolset.DUtil" Version="4.0.72" />
75 <PackageReference Include="Microsoft.SourceLink.GitHub" Version="1.0.0" />
76 <PackageReference Include="Nerdbank.GitVersioning" Version="3.3.37" />
77 </ItemGroup>
78
79 <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
80</Project>
diff --git a/src/ext/Util/be/utilsearch.cpp b/src/ext/Util/be/utilsearch.cpp
new file mode 100644
index 00000000..7cd2ea09
--- /dev/null
+++ b/src/ext/Util/be/utilsearch.cpp
@@ -0,0 +1,160 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3#include "precomp.h"
4
5
6STDMETHODIMP UtilSearchParseFromXml(
7 __in UTIL_SEARCHES* pSearches,
8 __in IXMLDOMNode* pixnBundleExtension
9 )
10{
11 HRESULT hr = S_OK;
12 IXMLDOMNodeList* pixnNodes = NULL;
13 IXMLDOMNode* pixnNode = NULL;
14 DWORD cNodes = 0;
15 BSTR bstrNodeName = NULL;
16 LPWSTR scz = NULL;
17
18 // Select Util search nodes.
19 hr = XmlSelectNodes(pixnBundleExtension, L"WixWindowsFeatureSearch", &pixnNodes);
20 ExitOnFailure(hr, "Failed to select Util search nodes.");
21
22 // Get Util search node count.
23 hr = pixnNodes->get_length((long*)&cNodes);
24 ExitOnFailure(hr, "Failed to get Util search node count.");
25
26 if (!cNodes)
27 {
28 ExitFunction();
29 }
30
31 // Allocate memory for searches.
32 pSearches->rgSearches = (UTIL_SEARCH*)MemAlloc(sizeof(UTIL_SEARCH) * cNodes, TRUE);
33 ExitOnNull(pSearches->rgSearches, hr, E_OUTOFMEMORY, "Failed to allocate memory for search structs.");
34
35 pSearches->cSearches = cNodes;
36
37 // Parse search elements.
38 for (DWORD i = 0; i < cNodes; ++i)
39 {
40 UTIL_SEARCH* pSearch = &pSearches->rgSearches[i];
41
42 hr = XmlNextElement(pixnNodes, &pixnNode, &bstrNodeName);
43 ExitOnFailure(hr, "Failed to get next node.");
44
45 // @Id
46 hr = XmlGetAttributeEx(pixnNode, L"Id", &pSearch->sczId);
47 ExitOnFailure(hr, "Failed to get @Id.");
48
49 // Read type specific attributes.
50 if (CSTR_EQUAL == ::CompareStringW(LOCALE_INVARIANT, 0, bstrNodeName, -1, L"WixWindowsFeatureSearch", -1))
51 {
52 pSearch->Type = UTIL_SEARCH_TYPE_WINDOWS_FEATURE_SEARCH;
53
54 // @Type
55 hr = XmlGetAttributeEx(pixnNode, L"Type", &scz);
56 ExitOnFailure(hr, "Failed to get @Type.");
57
58 if (CSTR_EQUAL == ::CompareStringW(LOCALE_INVARIANT, 0, scz, -1, L"sha2CodeSigning", -1))
59 {
60 pSearch->WindowsFeatureSearch.type = UTIL_WINDOWS_FEATURE_SEARCH_TYPE_SHA2_CODE_SIGNING;
61 }
62 else
63 {
64 hr = E_INVALIDARG;
65 ExitOnFailure(hr, "Invalid value for @Type: %ls", scz);
66 }
67 }
68 else
69 {
70 hr = E_UNEXPECTED;
71 ExitOnFailure(hr, "Unexpected element name: %ls", bstrNodeName);
72 }
73
74 // prepare next iteration
75 ReleaseNullObject(pixnNode);
76 ReleaseNullBSTR(bstrNodeName);
77 }
78
79LExit:
80 ReleaseStr(scz);
81 ReleaseBSTR(bstrNodeName);
82 ReleaseObject(pixnNode);
83 ReleaseObject(pixnNodes);
84
85 return hr;
86}
87
88void UtilSearchUninitialize(
89 __in UTIL_SEARCHES* pSearches
90 )
91{
92 if (pSearches->rgSearches)
93 {
94 for (DWORD i = 0; i < pSearches->cSearches; ++i)
95 {
96 UTIL_SEARCH* pSearch = &pSearches->rgSearches[i];
97
98 ReleaseStr(pSearch->sczId);
99 }
100 MemFree(pSearches->rgSearches);
101 }
102}
103
104STDMETHODIMP UtilSearchExecute(
105 __in UTIL_SEARCHES* pSearches,
106 __in LPCWSTR wzSearchId,
107 __in LPCWSTR wzVariable,
108 __in IBundleExtensionEngine* pEngine
109 )
110{
111 HRESULT hr = S_OK;
112 UTIL_SEARCH* pSearch = NULL;
113
114 hr = UtilSearchFindById(pSearches, wzSearchId, &pSearch);
115 ExitOnFailure(hr, "Search id '%ls' is unknown to the util extension.");
116
117 switch (pSearch->Type)
118 {
119 case UTIL_SEARCH_TYPE_WINDOWS_FEATURE_SEARCH:
120 switch (pSearch->WindowsFeatureSearch.type)
121 {
122 case UTIL_WINDOWS_FEATURE_SEARCH_TYPE_SHA2_CODE_SIGNING:
123 hr = UtilPerformDetectSHA2CodeSigning(wzVariable, pSearch, pEngine);
124 break;
125 default:
126 hr = E_UNEXPECTED;
127 }
128 break;
129 default:
130 hr = E_UNEXPECTED;
131 }
132
133LExit:
134 return hr;
135}
136
137STDMETHODIMP UtilSearchFindById(
138 __in UTIL_SEARCHES* pSearches,
139 __in LPCWSTR wzId,
140 __out UTIL_SEARCH** ppSearch
141 )
142{
143 HRESULT hr = S_OK;
144
145 for (DWORD i = 0; i < pSearches->cSearches; ++i)
146 {
147 UTIL_SEARCH* pSearch = &pSearches->rgSearches[i];
148
149 if (CSTR_EQUAL == ::CompareStringW(LOCALE_INVARIANT, 0, pSearch->sczId, -1, wzId, -1))
150 {
151 *ppSearch = pSearch;
152 ExitFunction1(hr = S_OK);
153 }
154 }
155
156 hr = E_NOTFOUND;
157
158LExit:
159 return hr;
160}
diff --git a/src/ext/Util/be/utilsearch.h b/src/ext/Util/be/utilsearch.h
new file mode 100644
index 00000000..deeab1f7
--- /dev/null
+++ b/src/ext/Util/be/utilsearch.h
@@ -0,0 +1,65 @@
1#pragma once
2// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
3
4
5// constants
6
7enum UTIL_SEARCH_TYPE
8{
9 UTIL_SEARCH_TYPE_NONE,
10 UTIL_SEARCH_TYPE_WINDOWS_FEATURE_SEARCH,
11};
12
13enum UTIL_WINDOWS_FEATURE_SEARCH_TYPE
14{
15 UTIL_WINDOWS_FEATURE_SEARCH_TYPE_NONE,
16 UTIL_WINDOWS_FEATURE_SEARCH_TYPE_SHA2_CODE_SIGNING,
17};
18
19
20// structs
21
22typedef struct _UTIL_SEARCH
23{
24 LPWSTR sczId;
25
26 UTIL_SEARCH_TYPE Type;
27 union
28 {
29 struct
30 {
31 UTIL_WINDOWS_FEATURE_SEARCH_TYPE type;
32 } WindowsFeatureSearch;
33 };
34} UTIL_SEARCH;
35
36typedef struct _UTIL_SEARCHES
37{
38 UTIL_SEARCH* rgSearches;
39 DWORD cSearches;
40} UTIL_SEARCHES;
41
42
43// function declarations
44
45STDMETHODIMP UtilSearchParseFromXml(
46 __in UTIL_SEARCHES* pSearches,
47 __in IXMLDOMNode* pixnBundleExtension
48 );
49
50void UtilSearchUninitialize(
51 __in UTIL_SEARCHES* pSearches
52 );
53
54STDMETHODIMP UtilSearchExecute(
55 __in UTIL_SEARCHES* pSearches,
56 __in LPCWSTR wzSearchId,
57 __in LPCWSTR wzVariable,
58 __in IBundleExtensionEngine* pEngine
59 );
60
61STDMETHODIMP UtilSearchFindById(
62 __in UTIL_SEARCHES* pSearches,
63 __in LPCWSTR wzId,
64 __out UTIL_SEARCH** ppSearch
65 );
diff --git a/src/ext/Util/ca/BroadcastSettingChange.cpp b/src/ext/Util/ca/BroadcastSettingChange.cpp
new file mode 100644
index 00000000..2e153ad3
--- /dev/null
+++ b/src/ext/Util/ca/BroadcastSettingChange.cpp
@@ -0,0 +1,45 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3#include "precomp.h"
4
5
6/********************************************************************
7WixBroadcastSettingChange
8
9 Send WM_SETTINGCHANGE message to all top-level windows indicating
10 that unspecified settings have changed.
11********************************************************************/
12extern "C" UINT __stdcall WixBroadcastSettingChange(
13 __in MSIHANDLE hInstall
14 )
15{
16 HRESULT hr = WcaInitialize(hInstall, "WixBroadcastSettingChange");
17 ExitOnFailure(hr, "failed to initialize WixBroadcastSettingChange");
18
19 // best effort; ignore failures
20 ::SendMessageTimeoutW(HWND_BROADCAST, WM_SETTINGCHANGE, NULL, NULL, SMTO_ABORTIFHUNG, 1000, NULL);
21
22LExit:
23 return WcaFinalize(ERROR_SUCCESS);
24}
25
26
27/********************************************************************
28WixBroadcastEnvironmentChange
29
30 Send WM_SETTINGCHANGE message to all top-level windows indicating
31 that environment variables have changed.
32********************************************************************/
33extern "C" UINT __stdcall WixBroadcastEnvironmentChange(
34 __in MSIHANDLE hInstall
35 )
36{
37 HRESULT hr = WcaInitialize(hInstall, "WixBroadcastEnvironmentChange");
38 ExitOnFailure(hr, "failed to initialize WixBroadcastEnvironmentChange");
39
40 // best effort; ignore failures
41 ::SendMessageTimeoutW(HWND_BROADCAST, WM_SETTINGCHANGE, NULL, reinterpret_cast<LPARAM>(L"Environment"), SMTO_ABORTIFHUNG, 1000, NULL);
42
43LExit:
44 return WcaFinalize(ERROR_SUCCESS);
45}
diff --git a/src/ext/Util/ca/CheckReboot.cpp b/src/ext/Util/ca/CheckReboot.cpp
new file mode 100644
index 00000000..ce056411
--- /dev/null
+++ b/src/ext/Util/ca/CheckReboot.cpp
@@ -0,0 +1,36 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3#include "precomp.h"
4
5
6/********************************************************************
7WixCheckRebootRequired - entry point for WixCheckRebootRequired Custom Action
8
9 called as Type 1 CustomAction (binary DLL) from Windows Installer
10 in InstallExecuteSequence after InstallFinalize
11********************************************************************/
12extern "C" UINT __stdcall WixCheckRebootRequired(
13 __in MSIHANDLE hInstall
14 )
15{
16 HRESULT hr = S_OK;
17 DWORD er = ERROR_SUCCESS;
18
19 hr = WcaInitialize(hInstall, "WixCheckRebootRequired");
20 ExitOnFailure(hr, "failed to initialize");
21
22 if (WcaDidDeferredActionRequireReboot())
23 {
24 WcaLog(LOGMSG_STANDARD, "Reboot required by deferred CustomAction.");
25
26 er = ::MsiSetMode(hInstall, MSIRUNMODE_REBOOTATEND, TRUE);
27 hr = HRESULT_FROM_WIN32(er);
28 ExitOnFailure(hr, "Failed to schedule reboot.");
29 }
30
31LExit:
32
33 if (FAILED(hr))
34 er = ERROR_INSTALL_FAILURE;
35 return WcaFinalize(er);
36}
diff --git a/src/ext/Util/ca/CloseApps.cpp b/src/ext/Util/ca/CloseApps.cpp
new file mode 100644
index 00000000..d4256c43
--- /dev/null
+++ b/src/ext/Util/ca/CloseApps.cpp
@@ -0,0 +1,568 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3#include "precomp.h"
4
5#define DEFAULT_PROCESS_EXIT_WAIT_TIME 5000
6
7// structs
8LPCWSTR wzQUERY_CLOSEAPPS = L"SELECT `Wix4CloseApplication`, `Target`, `Description`, `Condition`, `Attributes`, `Property`, `TerminateExitCode`, `Timeout` FROM `Wix4CloseApplication` ORDER BY `Sequence`";
9enum eQUERY_CLOSEAPPS { QCA_ID = 1, QCA_TARGET, QCA_DESCRIPTION, QCA_CONDITION, QCA_ATTRIBUTES, QCA_PROPERTY, QCA_TERMINATEEXITCODE, QCA_TIMEOUT };
10
11// CloseApplication.Attributes
12enum CLOSEAPP_ATTRIBUTES
13{
14 CLOSEAPP_ATTRIBUTE_NONE = 0x0,
15 CLOSEAPP_ATTRIBUTE_CLOSEMESSAGE = 0x1,
16 CLOSEAPP_ATTRIBUTE_REBOOTPROMPT = 0x2,
17 CLOSEAPP_ATTRIBUTE_ELEVATEDCLOSEMESSAGE = 0x4,
18 CLOSEAPP_ATTRIBUTE_ENDSESSIONMESSAGE = 0x8,
19 CLOSEAPP_ATTRIBUTE_ELEVATEDENDSESSIONMESSAGE = 0x10,
20 CLOSEAPP_ATTRIBUTE_TERMINATEPROCESS = 0x20,
21 CLOSEAPP_ATTRIBUTE_PROMPTTOCONTINUE = 0x40,
22};
23
24struct PROCESS_AND_MESSAGE
25{
26 DWORD dwProcessId;
27 DWORD dwMessageId;
28 DWORD dwTimeout;
29};
30
31
32/******************************************************************
33 EnumWindowsProc - callback function which sends message if the
34 current window matches the passed in process ID
35
36******************************************************************/
37BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam)
38{
39 PROCESS_AND_MESSAGE* pPM = reinterpret_cast<PROCESS_AND_MESSAGE*>(lParam);
40 DWORD dwProcessId = 0;
41 DWORD_PTR dwResult = 0;
42 BOOL fQueryEndSession = WM_QUERYENDSESSION == pPM->dwMessageId;
43 BOOL fContinueWindowsInProcess = TRUE; // assume we will send message to all top-level windows in a process.
44
45 ::GetWindowThreadProcessId(hwnd, &dwProcessId);
46
47 // check if the process Id is the one we're looking for
48 if (dwProcessId != pPM->dwProcessId)
49 {
50 return TRUE;
51 }
52
53 WcaLog(LOGMSG_VERBOSE, "Sending message to process id 0x%x", dwProcessId);
54
55 if (::SendMessageTimeoutW(hwnd, pPM->dwMessageId, 0, fQueryEndSession ? ENDSESSION_CLOSEAPP : 0, SMTO_BLOCK, pPM->dwTimeout, &dwResult))
56 {
57 WcaLog(LOGMSG_VERBOSE, "Result 0x%x", dwResult);
58
59 if (fQueryEndSession)
60 {
61 // If application said it was okay to close, do that.
62 if (dwResult)
63 {
64 ::SendMessageTimeoutW(hwnd, WM_ENDSESSION, TRUE, ENDSESSION_CLOSEAPP, SMTO_BLOCK, pPM->dwTimeout, &dwResult);
65 }
66 else // application said don't try to close it, so don't bother sending messages to any other top-level windows.
67 {
68 fContinueWindowsInProcess = FALSE;
69 }
70 }
71 }
72 else // log result message.
73 {
74 WcaLog(LOGMSG_VERBOSE, "Failed to send message id: %u, error: 0x%x", pPM->dwMessageId, ::GetLastError());
75 }
76
77 // so we know we succeeded
78 ::SetLastError(ERROR_SUCCESS);
79
80 return fContinueWindowsInProcess;
81}
82
83/******************************************************************
84 PromptToContinue - displays the prompt if the application is still
85 running.
86
87******************************************************************/
88static HRESULT PromptToContinue(
89 __in_z LPCWSTR wzApplication,
90 __in_z LPCWSTR wzPrompt
91 )
92{
93 HRESULT hr = S_OK;
94 UINT er = ERROR_SUCCESS;
95 PMSIHANDLE hRecMessage = NULL;
96 DWORD *prgProcessIds = NULL;
97 DWORD cProcessIds = 0;
98
99 hRecMessage = ::MsiCreateRecord(1);
100 ExitOnNull(hRecMessage, hr, E_OUTOFMEMORY, "Failed to create record for prompt.");
101
102 er = ::MsiRecordSetStringW(hRecMessage, 0, wzPrompt);
103 ExitOnWin32Error(er, hr, "Failed to set prompt record field string");
104
105 do
106 {
107 hr = ProcFindAllIdsFromExeName(wzApplication, &prgProcessIds, &cProcessIds);
108 if (SUCCEEDED(hr) && 0 < cProcessIds)
109 {
110 er = WcaProcessMessage(static_cast<INSTALLMESSAGE>(INSTALLMESSAGE_WARNING | MB_ABORTRETRYIGNORE | MB_DEFBUTTON3 | MB_ICONWARNING), hRecMessage);
111 if (IDABORT == er)
112 {
113 hr = HRESULT_FROM_WIN32(ERROR_INSTALL_USEREXIT);
114 }
115 else if (IDRETRY == er)
116 {
117 hr = S_FALSE;
118 }
119 else if (IDIGNORE == er)
120 {
121 hr = S_OK;
122 }
123 else
124 {
125 ExitOnWin32Error(er, hr, "Unexpected return value from prompt to continue.");
126 }
127 }
128
129 ReleaseNullMem(prgProcessIds);
130 cProcessIds = 0;
131 } while (S_FALSE == hr);
132
133LExit:
134 ReleaseMem(prgProcessIds);
135 return hr;
136}
137
138/******************************************************************
139 SendProcessMessage - helper function to enumerate the top-level
140 windows and send to all matching a process ID.
141
142******************************************************************/
143void SendProcessMessage(
144 __in DWORD dwProcessId,
145 __in DWORD dwMessageId,
146 __in DWORD dwTimeout
147 )
148{
149 WcaLog(LOGMSG_VERBOSE, "Attempting to send process id 0x%x message id: %u", dwProcessId, dwMessageId);
150
151 PROCESS_AND_MESSAGE pm = { };
152 pm.dwProcessId = dwProcessId;
153 pm.dwMessageId = dwMessageId;
154 pm.dwTimeout = dwTimeout;
155
156 if (!::EnumWindows(EnumWindowsProc, reinterpret_cast<LPARAM>(&pm)))
157 {
158 DWORD dwLastError = ::GetLastError();
159 if (ERROR_SUCCESS != dwLastError)
160 {
161 WcaLog(LOGMSG_VERBOSE, "CloseApp enumeration error: 0x%x", dwLastError);
162 }
163 }
164}
165
166/******************************************************************
167 SendApplicationMessage - helper function to iterate through the
168 processes for the specified application and send all
169 applicable process Ids a message and give them time to process
170 the message.
171
172******************************************************************/
173void SendApplicationMessage(
174 __in LPCWSTR wzApplication,
175 __in DWORD dwMessageId,
176 __in DWORD dwTimeout
177 )
178{
179 DWORD *prgProcessIds = NULL;
180 DWORD cProcessIds = 0, iProcessId;
181 HRESULT hr = S_OK;
182
183 WcaLog(LOGMSG_VERBOSE, "Checking App: %ls ", wzApplication);
184
185 hr = ProcFindAllIdsFromExeName(wzApplication, &prgProcessIds, &cProcessIds);
186
187 if (SUCCEEDED(hr) && 0 < cProcessIds)
188 {
189 WcaLog(LOGMSG_VERBOSE, "App: %ls found running, %d processes, attempting to send message.", wzApplication, cProcessIds);
190
191 for (iProcessId = 0; iProcessId < cProcessIds; ++iProcessId)
192 {
193 SendProcessMessage(prgProcessIds[iProcessId], dwMessageId, dwTimeout);
194 }
195
196 ProcWaitForIds(prgProcessIds, cProcessIds, dwTimeout);
197 }
198
199 ReleaseMem(prgProcessIds);
200}
201
202/******************************************************************
203 SetRunningProcessProperty - helper function that sets the specified
204 property if there are any instances of the specified executable
205 running. Useful to show custom UI to ask for shutdown.
206******************************************************************/
207void SetRunningProcessProperty(
208 __in LPCWSTR wzApplication,
209 __in LPCWSTR wzProperty
210 )
211{
212 DWORD *prgProcessIds = NULL;
213 DWORD cProcessIds = 0;
214 HRESULT hr = S_OK;
215
216 WcaLog(LOGMSG_VERBOSE, "Checking App: %ls ", wzApplication);
217
218 hr = ProcFindAllIdsFromExeName(wzApplication, &prgProcessIds, &cProcessIds);
219
220 if (SUCCEEDED(hr) && 0 < cProcessIds)
221 {
222 WcaLog(LOGMSG_VERBOSE, "App: %ls found running, %d processes, setting '%ls' property.", wzApplication, cProcessIds, wzProperty);
223 WcaSetIntProperty(wzProperty, cProcessIds);
224 }
225
226 ReleaseMem(prgProcessIds);
227}
228
229/******************************************************************
230 TerminateProcesses - helper function that kills the provided set of
231 process ids such that they return a particular exit code.
232******************************************************************/
233void TerminateProcesses(
234 __in_ecount(cProcessIds) DWORD rgdwProcessIds[],
235 __in DWORD cProcessIds,
236 __in DWORD dwExitCode
237 )
238{
239 for (DWORD i = 0; i < cProcessIds; ++i)
240 {
241 HANDLE hProcess = ::OpenProcess(PROCESS_TERMINATE, FALSE, rgdwProcessIds[i]);
242 if (hProcess)
243 {
244 ::TerminateProcess(hProcess, dwExitCode);
245 ::CloseHandle(hProcess);
246 }
247 }
248}
249
250/******************************************************************
251 WixCloseApplications - entry point for WixCloseApplications Custom Action
252
253 called as Type 1 CustomAction (binary DLL) from Windows Installer
254 in InstallExecuteSequence before InstallFiles
255******************************************************************/
256extern "C" UINT __stdcall WixCloseApplications(
257 __in MSIHANDLE hInstall
258 )
259{
260 //AssertSz(FALSE, "debug WixCloseApplications");
261 HRESULT hr = S_OK;
262 UINT er = ERROR_SUCCESS;
263
264 LPWSTR pwzData = NULL;
265 LPWSTR pwzId = NULL;
266 LPWSTR pwzTarget = NULL;
267 LPWSTR pwzDescription = NULL;
268 LPWSTR pwzCondition = NULL;
269 LPWSTR pwzProperty = NULL;
270 DWORD dwAttributes = 0;
271 DWORD dwTimeout = 0;
272 DWORD dwTerminateExitCode = 0;
273 MSICONDITION condition = MSICONDITION_NONE;
274
275 DWORD cCloseApps = 0;
276
277 PMSIHANDLE hView = NULL;
278 PMSIHANDLE hRec = NULL;
279 MSIHANDLE hListboxTable = NULL;
280 MSIHANDLE hListboxColumns = NULL;
281
282 LPWSTR pwzCustomActionData = NULL;
283 //DWORD cchCustomActionData = 0;
284
285 //
286 // initialize
287 //
288 hr = WcaInitialize(hInstall, "WixCloseApplications");
289 ExitOnFailure(hr, "failed to initialize");
290
291 //
292 // loop through all the objects to be secured
293 //
294 hr = WcaOpenExecuteView(wzQUERY_CLOSEAPPS, &hView);
295 ExitOnFailure(hr, "failed to open view on Wix4CloseApplication table");
296 while (S_OK == (hr = WcaFetchRecord(hView, &hRec)))
297 {
298 hr = WcaGetRecordString(hRec, QCA_ID, &pwzId);
299 ExitOnFailure(hr, "failed to get id from Wix4CloseApplication table");
300
301 hr = WcaGetRecordString(hRec, QCA_CONDITION, &pwzCondition);
302 ExitOnFailure(hr, "failed to get condition from Wix4CloseApplication table");
303
304 if (pwzCondition && *pwzCondition)
305 {
306 condition = ::MsiEvaluateConditionW(hInstall, pwzCondition);
307 if (MSICONDITION_ERROR == condition)
308 {
309 hr = E_INVALIDARG;
310 ExitOnFailure(hr, "failed to process condition for Wix4CloseApplication '%ls'", pwzId);
311 }
312 else if (MSICONDITION_FALSE == condition)
313 {
314 continue; // skip processing this target
315 }
316 }
317
318 hr = WcaGetRecordFormattedString(hRec, QCA_TARGET, &pwzTarget);
319 ExitOnFailure(hr, "failed to get target from Wix4CloseApplication table");
320
321 hr = WcaGetRecordFormattedString(hRec, QCA_DESCRIPTION, &pwzDescription);
322 ExitOnFailure(hr, "failed to get description from Wix4CloseApplication table");
323
324 hr = WcaGetRecordInteger(hRec, QCA_ATTRIBUTES, reinterpret_cast<int*>(&dwAttributes));
325 ExitOnFailure(hr, "failed to get attributes from Wix4CloseApplication table");
326
327 hr = WcaGetRecordFormattedString(hRec, QCA_PROPERTY, &pwzProperty);
328 ExitOnFailure(hr, "failed to get property from Wix4CloseApplication table");
329
330 hr = WcaGetRecordInteger(hRec, QCA_TERMINATEEXITCODE, reinterpret_cast<int*>(&dwTerminateExitCode));
331 if (S_FALSE == hr)
332 {
333 dwTerminateExitCode = 0;
334 hr = S_OK;
335 }
336 ExitOnFailure(hr, "failed to get terminate exit-code from Wix4CloseApplication table");
337
338 hr = WcaGetRecordInteger(hRec, QCA_TIMEOUT, reinterpret_cast<int*>(&dwTimeout));
339 if (S_FALSE == hr)
340 {
341 dwTimeout = DEFAULT_PROCESS_EXIT_WAIT_TIME;
342 hr = S_OK;
343 }
344 ExitOnFailure(hr, "failed to get timeout from Wix4CloseApplication table");
345
346 // Before trying any changes to the machine, prompt if requested.
347 if (dwAttributes & CLOSEAPP_ATTRIBUTE_PROMPTTOCONTINUE)
348 {
349 hr = PromptToContinue(pwzTarget, pwzDescription ? pwzDescription : L"");
350 if (HRESULT_FROM_WIN32(ERROR_INSTALL_USEREXIT) == hr)
351 {
352 // Skip error message if user canceled.
353 ExitFunction();
354 }
355 ExitOnFailure(hr, "Failure while prompting user to continue to close application.");
356 }
357
358 //
359 // send WM_CLOSE or WM_QUERYENDSESSION to currently running applications
360 //
361 if (dwAttributes & CLOSEAPP_ATTRIBUTE_CLOSEMESSAGE)
362 {
363 SendApplicationMessage(pwzTarget, WM_CLOSE, dwTimeout);
364 }
365
366 if (dwAttributes & CLOSEAPP_ATTRIBUTE_ENDSESSIONMESSAGE)
367 {
368 SendApplicationMessage(pwzTarget, WM_QUERYENDSESSION, dwTimeout);
369 }
370
371 //
372 // Pass the targets to the deferred action in case the app comes back
373 // even if we close it now.
374 //
375 if (dwAttributes & (CLOSEAPP_ATTRIBUTE_ELEVATEDCLOSEMESSAGE | CLOSEAPP_ATTRIBUTE_ELEVATEDENDSESSIONMESSAGE | CLOSEAPP_ATTRIBUTE_REBOOTPROMPT | CLOSEAPP_ATTRIBUTE_TERMINATEPROCESS))
376 {
377 hr = WcaWriteStringToCaData(pwzTarget, &pwzCustomActionData);
378 ExitOnFailure(hr, "failed to add target data to CustomActionData");
379
380 hr = WcaWriteIntegerToCaData(dwAttributes, &pwzCustomActionData);
381 ExitOnFailure(hr, "failed to add attribute data to CustomActionData");
382
383 hr = WcaWriteIntegerToCaData(dwTimeout, &pwzCustomActionData);
384 ExitOnFailure(hr, "failed to add timeout data to CustomActionData");
385
386 hr = WcaWriteIntegerToCaData(dwTerminateExitCode, &pwzCustomActionData);
387 ExitOnFailure(hr, "failed to add timeout data to CustomActionData");
388 }
389
390 if (pwzProperty && *pwzProperty)
391 {
392 SetRunningProcessProperty(pwzTarget, pwzProperty);
393 }
394
395 ++cCloseApps;
396 }
397
398 // if we looped through all records all is well
399 if (E_NOMOREITEMS == hr)
400 {
401 hr = S_OK;
402 }
403 ExitOnFailure(hr, "failed while looping through all apps to close");
404
405 //
406 // Do the UI dance now.
407 //
408 /*
409
410 TODO: Do this eventually
411
412 if (cCloseApps)
413 {
414 while (TRUE)
415 {
416 for (DWORD i = 0; i < cCloseApps; ++i)
417 {
418 hr = WcaAddTempRecord(&hListboxTable, &hListboxColumns, L"ListBox", NULL, 0, 4, L"FileInUseProcess", i, target, description);
419 if (FAILED(hr))
420 {
421 }
422 }
423 }
424 }
425 */
426
427 //
428 // schedule the custom action and add to progress bar
429 //
430 if (pwzCustomActionData && *pwzCustomActionData)
431 {
432 Assert(0 < cCloseApps);
433
434 hr = WcaDoDeferredAction(CUSTOM_ACTION_DECORATION(L"CloseApplicationsDeferred"), pwzCustomActionData, cCloseApps * COST_CLOSEAPP);
435 ExitOnFailure(hr, "failed to schedule CloseApplicationsDeferred action");
436 }
437
438LExit:
439 if (hListboxColumns)
440 {
441 ::MsiCloseHandle(hListboxColumns);
442 }
443 if (hListboxTable)
444 {
445 ::MsiCloseHandle(hListboxTable);
446 }
447
448 ReleaseStr(pwzCustomActionData);
449 ReleaseStr(pwzData);
450 ReleaseStr(pwzProperty);
451 ReleaseStr(pwzCondition);
452 ReleaseStr(pwzDescription);
453 ReleaseStr(pwzTarget);
454 ReleaseStr(pwzId);
455
456 if (FAILED(hr))
457 {
458 er = HRESULT_FROM_WIN32(ERROR_INSTALL_USEREXIT) == hr ? ERROR_INSTALL_USEREXIT : ERROR_INSTALL_FAILURE;
459 }
460 return WcaFinalize(er);
461}
462
463
464/******************************************************************
465 WixCloseApplicationsDeferred - entry point for
466 WixCloseApplicationsDeferred Custom Action
467 called as Type 1025 CustomAction
468 (deferred binary DLL)
469
470 NOTE: deferred CustomAction since it modifies the machine
471 NOTE: CustomActionData == wzTarget\tdwAttributes\tdwTimeout\tdwTerminateExitCode\t...
472******************************************************************/
473extern "C" UINT __stdcall WixCloseApplicationsDeferred(
474 __in MSIHANDLE hInstall
475 )
476{
477 //AssertSz(FALSE, "debug WixCloseApplicationsDeferred");
478 HRESULT hr = S_OK;
479 DWORD er = ERROR_SUCCESS;
480
481 LPWSTR pwz = NULL;
482 LPWSTR pwzData = NULL;
483 LPWSTR pwzTarget = NULL;
484 DWORD dwAttributes = 0;
485 DWORD dwTimeout = 0;
486 DWORD dwTerminateExitCode = 0;
487
488 DWORD *prgProcessIds = NULL;
489 DWORD cProcessIds = 0;
490
491 //
492 // initialize
493 //
494 hr = WcaInitialize(hInstall, "WixCloseApplicationsDeferred");
495 ExitOnFailure(hr, "failed to initialize");
496
497 hr = WcaGetProperty(L"CustomActionData", &pwzData);
498 ExitOnFailure(hr, "failed to get CustomActionData");
499
500 WcaLog(LOGMSG_TRACEONLY, "CustomActionData: %ls", pwzData);
501
502 pwz = pwzData;
503
504 //
505 // loop through all the passed in data
506 //
507 while (pwz && *pwz)
508 {
509 hr = WcaReadStringFromCaData(&pwz, &pwzTarget);
510 ExitOnFailure(hr, "failed to process target from CustomActionData");
511
512 hr = WcaReadIntegerFromCaData(&pwz, reinterpret_cast<int*>(&dwAttributes));
513 ExitOnFailure(hr, "failed to process attributes from CustomActionData");
514
515 hr = WcaReadIntegerFromCaData(&pwz, reinterpret_cast<int*>(&dwTimeout));
516 ExitOnFailure(hr, "failed to process timeout from CustomActionData");
517
518 hr = WcaReadIntegerFromCaData(&pwz, reinterpret_cast<int*>(&dwTerminateExitCode));
519 ExitOnFailure(hr, "failed to process terminate exit code from CustomActionData");
520
521 WcaLog(LOGMSG_VERBOSE, "Checking for App: %ls Attributes: %d", pwzTarget, dwAttributes);
522
523 //
524 // send WM_CLOSE or WM_QUERYENDSESSION to currently running applications
525 //
526 if (dwAttributes & CLOSEAPP_ATTRIBUTE_ELEVATEDCLOSEMESSAGE)
527 {
528 SendApplicationMessage(pwzTarget, WM_CLOSE, dwTimeout);
529 }
530
531 if (dwAttributes & CLOSEAPP_ATTRIBUTE_ELEVATEDENDSESSIONMESSAGE)
532 {
533 SendApplicationMessage(pwzTarget, WM_QUERYENDSESSION, dwTimeout);
534 }
535
536 // If we find that an app that we need closed is still runing, require a
537 // restart or kill the process as directed.
538 ProcFindAllIdsFromExeName(pwzTarget, &prgProcessIds, &cProcessIds);
539 if (0 < cProcessIds)
540 {
541 if (dwAttributes & CLOSEAPP_ATTRIBUTE_REBOOTPROMPT)
542 {
543 WcaLog(LOGMSG_VERBOSE, "App: %ls found running, requiring a reboot.", pwzTarget);
544
545 WcaDeferredActionRequiresReboot();
546 }
547 else if (dwAttributes & CLOSEAPP_ATTRIBUTE_TERMINATEPROCESS)
548 {
549 TerminateProcesses(prgProcessIds, cProcessIds, dwTerminateExitCode);
550 }
551 }
552
553 hr = WcaProgressMessage(COST_CLOSEAPP, FALSE);
554 ExitOnFailure(hr, "failed to send progress message");
555 }
556
557LExit:
558 ReleaseMem(prgProcessIds);
559
560 ReleaseStr(pwzTarget);
561 ReleaseStr(pwzData);
562
563 if (FAILED(hr))
564 {
565 er = ERROR_INSTALL_FAILURE;
566 }
567 return WcaFinalize(er);
568}
diff --git a/src/ext/Util/ca/CustomMsiErrors.h b/src/ext/Util/ca/CustomMsiErrors.h
new file mode 100644
index 00000000..3218b61b
--- /dev/null
+++ b/src/ext/Util/ca/CustomMsiErrors.h
@@ -0,0 +1,32 @@
1#pragma once
2// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
3
4
5#define msierrSecureObjectsFailedCreateSD 25520
6#define msierrSecureObjectsFailedSet 25521
7#define msierrSecureObjectsUnknownType 25522
8
9#define msierrXmlFileFailedRead 25530
10#define msierrXmlFileFailedOpen 25531
11#define msierrXmlFileFailedSelect 25532
12#define msierrXmlFileFailedSave 25533
13
14#define msierrXmlConfigFailedRead 25540
15#define msierrXmlConfigFailedOpen 25541
16#define msierrXmlConfigFailedSelect 25542
17#define msierrXmlConfigFailedSave 25543
18
19#define msierrPERFMONFailedRegisterDLL 26251
20#define msierrPERFMONFailedUnregisterDLL 26252
21#define msierrInstallPerfCounterData 26253
22#define msierrUninstallPerfCounterData 26254
23
24#define msierrSMBFailedCreate 26301
25#define msierrSMBFailedDrop 26302
26#define msierrUSRFailedUserCreate 26401
27#define msierrUSRFailedUserCreatePswd 26402
28#define msierrUSRFailedUserGroupAdd 26403
29#define msierrUSRFailedUserCreateExists 26404
30#define msierrUSRFailedGrantLogonAsService 26405
31
32//Last available is 26450 \ No newline at end of file
diff --git a/src/ext/Util/ca/FormatFiles.cpp b/src/ext/Util/ca/FormatFiles.cpp
new file mode 100644
index 00000000..d1533999
--- /dev/null
+++ b/src/ext/Util/ca/FormatFiles.cpp
@@ -0,0 +1,221 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3#include "precomp.h"
4
5const UINT COST_FILEFORMATTING = 2000;
6
7
8//
9// WixSchedFormatFiles - immediate CA to schedule format files CAs
10//
11extern "C" UINT __stdcall WixSchedFormatFiles(
12 __in MSIHANDLE hInstall
13 )
14{
15 HRESULT hr = S_OK;
16 UINT er = ERROR_SUCCESS;
17 PSCZ sczBinaryKey;
18 PSCZ sczFileKey;
19 PSCZ sczComponentKey;
20 PSCZ sczFormattedFile;
21 PSCZ sczFilePath;
22 PMSIHANDLE hView;
23 PMSIHANDLE hRec;
24 PSCZ sczFileContent;
25 PSCZ sczFormattedContent;
26 PSCZ sczExecCustomActionData;
27 PSCZ sczRollbackCustomActionData;
28
29 LPCWSTR wzQuery =
30 L"SELECT `Wix4FormatFile`.`Binary_`, `Wix4FormatFile`.`File_`, `File`.`Component_` "
31 L"FROM `Wix4FormatFile`, `File` "
32 L"WHERE `Wix4FormatFile`.`File_` = `File`.`File`";
33 enum eQuery { eqBinaryKey = 1, eqFileKey, eqComponentKey };
34
35 // initialize
36 hr = WcaInitialize(hInstall, "WixSchedFormatFiles");
37 ExitOnFailure(hr, "Failed to initialize for WixSchedFormatFiles.");
38
39 // query and loop through all the files
40 hr = WcaOpenExecuteView(wzQuery, &hView);
41 ExitOnFailure(hr, "Failed to open view on Wix4FormatFile table");
42
43 DWORD cFiles = 0;
44 while (S_OK == (hr = WcaFetchRecord(hView, &hRec)))
45 {
46 ++cFiles;
47
48 hr = WcaGetRecordString(hRec, eqBinaryKey, &sczBinaryKey);
49 ExitOnFailure(hr, "Failed to get Binary table key.");
50
51 hr = WcaGetRecordString(hRec, eqFileKey, &sczFileKey);
52 ExitOnFailure(hr, "Failed to get File table key.");
53
54 hr = WcaGetRecordString(hRec, eqComponentKey, &sczComponentKey);
55 ExitOnFailure(hr, "Failed to get Component table key.");
56
57 // we need to know if the component's being installed, uninstalled, or reinstalled
58 WCA_TODO todo = WcaGetComponentToDo(sczComponentKey);
59 if (WCA_TODO_INSTALL == todo || WCA_TODO_REINSTALL == todo)
60 {
61 // turn the file key into the path to the target file
62 hr = StrAllocFormatted(&sczFormattedFile, L"[#%ls]", sczFileKey);
63 ExitOnFailure(hr, "Failed to format file string for file: %ls", sczFileKey);
64 hr = WcaGetFormattedString(sczFormattedFile, &sczFilePath);
65 ExitOnFailure(hr, "Failed to get path for file: %ls", sczFileKey);
66
67 // extract binary to string
68 WCA_ENCODING encoding = WCA_ENCODING_UNKNOWN;
69 hr = WcaExtractBinaryToString(sczBinaryKey, &sczFileContent, &encoding);
70 ExitOnFailure(hr, "Failed to extract binary: %ls", sczBinaryKey);
71
72 // format string
73 hr = WcaGetFormattedString(sczFileContent, &sczFormattedContent);
74 ExitOnFailure(hr, "Failed to format file content: %ls", sczFileContent);
75
76 // write to deferred custom action data
77 hr = WcaWriteStringToCaData(sczFilePath, &sczExecCustomActionData);
78 ExitOnFailure(hr, "Failed to write deferred custom action data for file: %ls", sczFilePath);
79
80 hr = WcaWriteIntegerToCaData(encoding, &sczExecCustomActionData);
81 ExitOnFailure(hr, "Failed to write deferred custom action data for encoding: %d", encoding);
82
83 hr = WcaWriteStringToCaData(sczFormattedContent, &sczExecCustomActionData);
84 ExitOnFailure(hr, "Failed to write deferred custom action data for file content: %ls", sczFilePath);
85
86 // write to rollback custom action data
87 hr = WcaWriteStringToCaData(sczFilePath, &sczRollbackCustomActionData);
88 ExitOnFailure(hr, "Failed to write rollback custom action data for file: %ls", sczFilePath);
89
90 hr = WcaWriteIntegerToCaData(encoding, &sczRollbackCustomActionData);
91 ExitOnFailure(hr, "Failed to write deferred custom action data for encoding: %d", encoding);
92
93 hr = WcaWriteStringToCaData(sczFileContent, &sczRollbackCustomActionData);
94 ExitOnFailure(hr, "Failed to write rollback custom action data for file content: %ls", sczFilePath);
95 }
96 }
97
98 // reaching the end of the list is actually a good thing, not an error
99 if (E_NOMOREITEMS == hr)
100 {
101 hr = S_OK;
102 }
103 ExitOnFailure(hr, "Failure occurred while processing Wix4FormatFile table");
104
105 // schedule deferred CAs if there's anything to do
106 if (sczRollbackCustomActionData && *sczRollbackCustomActionData)
107 {
108 hr = WcaDoDeferredAction(CUSTOM_ACTION_DECORATION(L"RollbackFormatFiles"), sczRollbackCustomActionData, cFiles * COST_FILEFORMATTING);
109 ExitOnFailure(hr, "Failed to schedule RollbackFormatFiles");
110 }
111
112 if (sczExecCustomActionData && *sczExecCustomActionData)
113 {
114 hr = WcaDoDeferredAction(CUSTOM_ACTION_DECORATION(L"ExecFormatFiles"), sczExecCustomActionData, cFiles * COST_FILEFORMATTING);
115 ExitOnFailure(hr, "Failed to schedule ExecFormatFiles");
116 }
117
118LExit:
119 return WcaFinalize(er = FAILED(hr) ? ERROR_INSTALL_FAILURE : er);
120}
121
122
123//
124// WixExecFormatFiles - deferred and rollback CAs to write formatted files
125//
126extern "C" UINT __stdcall WixExecFormatFiles(
127 __in MSIHANDLE hInstall
128 )
129{
130 HRESULT hr = S_OK;
131 UINT er = ERROR_SUCCESS;
132 PSCZ sczCustomActionData;
133 LPWSTR pwz = NULL;
134 PSCZ sczFilePath;
135 PSCZ sczFileContent;
136 LPSTR psz = NULL;
137
138 // initialize
139 hr = WcaInitialize(hInstall, "WixExecFormatFiles");
140 ExitOnFailure(hr, "Failed to initialize for WixExecFormatFiles.");
141
142 hr = WcaGetProperty(L"CustomActionData", &sczCustomActionData);
143 ExitOnFailure(hr, "Failed to get CustomActionData.");
144#ifdef _DEBUG
145 WcaLog(LOGMSG_STANDARD, "CustomActionData: %ls", sczCustomActionData);
146#endif
147
148 // loop through all the passed in data
149 pwz = sczCustomActionData;
150 while (pwz && *pwz)
151 {
152 // extract the custom action data
153 hr = WcaReadStringFromCaData(&pwz, &sczFilePath);
154 ExitOnFailure(hr, "Failed to read file path from custom action data");
155
156 WCA_ENCODING encoding = WCA_ENCODING_UNKNOWN;
157 hr = WcaReadIntegerFromCaData(&pwz, reinterpret_cast<int*>(&encoding));
158 ExitOnFailure(hr, "Failed to read encoding from custom action data");
159
160 hr = WcaReadStringFromCaData(&pwz, &sczFileContent);
161 ExitOnFailure(hr, "Failed to read file content from custom action data");
162
163 // re-encode content
164 LPCBYTE pbData = NULL;
165 size_t cbData = 0;
166 switch (encoding)
167 {
168 case WCA_ENCODING_UTF_16:
169 pbData = reinterpret_cast<LPCBYTE>(LPCWSTR(sczFileContent));
170 cbData = lstrlenW(sczFileContent) * sizeof(WCHAR);
171 break;
172
173 case WCA_ENCODING_UTF_8:
174 hr = StrAnsiAllocString(&psz, sczFileContent, 0, CP_UTF8);
175 ExitOnFailure(hr, "Failed to convert Unicode to UTF-8.");
176 pbData = reinterpret_cast<LPCBYTE>(psz);
177
178 hr = ::StringCbLengthA(psz, STRSAFE_MAX_CCH, &cbData);
179 ExitOnFailure(hr, "Failed to count UTF-8 bytes.");
180 break;
181
182 case WCA_ENCODING_ANSI:
183 hr = StrAnsiAllocString(&psz, sczFileContent, 0, CP_ACP);
184 ExitOnFailure(hr, "Failed to convert Unicode to ANSI.");
185 pbData = reinterpret_cast<LPCBYTE>(psz);
186
187 hr = ::StringCbLengthA(psz, STRSAFE_MAX_CCH, &cbData);
188 ExitOnFailure(hr, "Failed to count UTF-8 bytes.");
189 break;
190
191 default:
192 break;
193 }
194
195#ifdef _DEBUG
196 WcaLog(LOGMSG_STANDARD, "File: %ls", sczCustomActionData);
197 WcaLog(LOGMSG_STANDARD, "Content: %ls", sczFileContent);
198#endif
199
200 // write file and preserve modified time
201 FILETIME filetime;
202
203 hr = FileGetTime(sczFilePath, NULL, NULL, &filetime);
204 ExitOnFailure(hr, "Failed to get modified time of file : %ls", sczFilePath);
205
206 hr = FileWrite(sczFilePath, FILE_ATTRIBUTE_NORMAL, pbData, cbData, NULL);
207 ExitOnFailure(hr, "Failed to write file content: %ls", sczFilePath);
208
209 hr = FileSetTime(sczFilePath, NULL, NULL, &filetime);
210 ExitOnFailure(hr, "Failed to set modified time of file : %ls", sczFilePath);
211
212 // Tick the progress bar
213 hr = WcaProgressMessage(COST_FILEFORMATTING, FALSE);
214 ExitOnFailure(hr, "Failed to tick progress bar for file: %ls", sczFilePath);
215 }
216
217LExit:
218 ReleaseStr(psz);
219
220 return WcaFinalize(er = FAILED(hr) ? ERROR_INSTALL_FAILURE : er);
221}
diff --git a/src/ext/Util/ca/OsInfo.cpp b/src/ext/Util/ca/OsInfo.cpp
new file mode 100644
index 00000000..4783673e
--- /dev/null
+++ b/src/ext/Util/ca/OsInfo.cpp
@@ -0,0 +1,487 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3#include "precomp.h"
4
5// constants we'll pick up from later SDKs
6#define SM_TABLETPC 86
7#define SM_MEDIACENTER 87
8#define SM_STARTER 88
9#define SM_SERVERR2 89
10#define VER_SUITE_WH_SERVER 0x00008000
11
12/********************************************************************
13WixQueryOsInfo - entry point for WixQueryOsInfo custom action
14
15 Called as Type 1 custom action (DLL from the Binary table) from
16 Windows Installer to set properties that identify OS information
17 and predefined directories
18********************************************************************/
19extern "C" UINT __stdcall WixQueryOsInfo(
20 __in MSIHANDLE hInstall
21 )
22{
23 HRESULT hr = S_OK;
24 DWORD er = ERROR_SUCCESS;
25 OSVERSIONINFOEXW ovix = {0};
26
27 hr = WcaInitialize(hInstall, "WixQueryOsInfo");
28 ExitOnFailure(hr, "WixQueryOsInfo failed to initialize");
29
30 // identify product suites
31 ovix.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEXW);
32 #pragma warning(suppress: 4996) //TODO: use osutil
33 ::GetVersionExW(reinterpret_cast<LPOSVERSIONINFOW>(&ovix));
34
35 if (VER_SUITE_SMALLBUSINESS == (ovix.wSuiteMask & VER_SUITE_SMALLBUSINESS))
36 {
37 WcaSetIntProperty(L"WIX_SUITE_SMALLBUSINESS", 1);
38 }
39
40 if (VER_SUITE_ENTERPRISE == (ovix.wSuiteMask & VER_SUITE_ENTERPRISE))
41 {
42 WcaSetIntProperty(L"WIX_SUITE_ENTERPRISE", 1);
43 }
44
45 if (VER_SUITE_BACKOFFICE == (ovix.wSuiteMask & VER_SUITE_BACKOFFICE))
46 {
47 WcaSetIntProperty(L"WIX_SUITE_BACKOFFICE", 1);
48 }
49
50 if (VER_SUITE_COMMUNICATIONS == (ovix.wSuiteMask & VER_SUITE_COMMUNICATIONS))
51 {
52 WcaSetIntProperty(L"WIX_SUITE_COMMUNICATIONS", 1);
53 }
54
55 if (VER_SUITE_TERMINAL == (ovix.wSuiteMask & VER_SUITE_TERMINAL))
56 {
57 WcaSetIntProperty(L"WIX_SUITE_TERMINAL", 1);
58 }
59
60 if (VER_SUITE_SMALLBUSINESS_RESTRICTED == (ovix.wSuiteMask & VER_SUITE_SMALLBUSINESS_RESTRICTED))
61 {
62 WcaSetIntProperty(L"WIX_SUITE_SMALLBUSINESS_RESTRICTED", 1);
63 }
64
65 if (VER_SUITE_EMBEDDEDNT == (ovix.wSuiteMask & VER_SUITE_EMBEDDEDNT))
66 {
67 WcaSetIntProperty(L"WIX_SUITE_EMBEDDEDNT", 1);
68 }
69
70 if (VER_SUITE_DATACENTER == (ovix.wSuiteMask & VER_SUITE_DATACENTER))
71 {
72 WcaSetIntProperty(L"WIX_SUITE_DATACENTER", 1);
73 }
74
75 if (VER_SUITE_SINGLEUSERTS == (ovix.wSuiteMask & VER_SUITE_SINGLEUSERTS))
76 {
77 WcaSetIntProperty(L"WIX_SUITE_SINGLEUSERTS", 1);
78 }
79
80 if (VER_SUITE_PERSONAL == (ovix.wSuiteMask & VER_SUITE_PERSONAL))
81 {
82 WcaSetIntProperty(L"WIX_SUITE_PERSONAL", 1);
83 }
84
85 if (VER_SUITE_BLADE == (ovix.wSuiteMask & VER_SUITE_BLADE))
86 {
87 WcaSetIntProperty(L"WIX_SUITE_BLADE", 1);
88 }
89
90 if (VER_SUITE_EMBEDDED_RESTRICTED == (ovix.wSuiteMask & VER_SUITE_EMBEDDED_RESTRICTED))
91 {
92 WcaSetIntProperty(L"WIX_SUITE_EMBEDDED_RESTRICTED", 1);
93 }
94
95 if (VER_SUITE_SECURITY_APPLIANCE == (ovix.wSuiteMask & VER_SUITE_SECURITY_APPLIANCE))
96 {
97 WcaSetIntProperty(L"WIX_SUITE_SECURITY_APPLIANCE", 1);
98 }
99
100 if (VER_SUITE_STORAGE_SERVER == (ovix.wSuiteMask & VER_SUITE_STORAGE_SERVER))
101 {
102 WcaSetIntProperty(L"WIX_SUITE_STORAGE_SERVER", 1);
103 }
104
105 if (VER_SUITE_COMPUTE_SERVER == (ovix.wSuiteMask & VER_SUITE_COMPUTE_SERVER))
106 {
107 WcaSetIntProperty(L"WIX_SUITE_COMPUTE_SERVER", 1);
108 }
109
110 if (VER_SUITE_WH_SERVER == (ovix.wSuiteMask & VER_SUITE_WH_SERVER))
111 {
112 WcaSetIntProperty(L"WIX_SUITE_WH_SERVER", 1);
113 }
114
115 // only for XP and later
116 if (5 < ovix.dwMajorVersion || (5 == ovix.dwMajorVersion && 0 < ovix.dwMinorVersion))
117 {
118 if (::GetSystemMetrics(SM_SERVERR2))
119 {
120 WcaSetIntProperty(L"WIX_SUITE_SERVERR2", 1);
121 }
122
123 if (::GetSystemMetrics(SM_MEDIACENTER))
124 {
125 WcaSetIntProperty(L"WIX_SUITE_MEDIACENTER", 1);
126 }
127
128 if (::GetSystemMetrics(SM_STARTER))
129 {
130 WcaSetIntProperty(L"WIX_SUITE_STARTER", 1);
131 }
132
133 if (::GetSystemMetrics(SM_TABLETPC))
134 {
135 WcaSetIntProperty(L"WIX_SUITE_TABLETPC", 1);
136 }
137 }
138
139LExit:
140 if (FAILED(hr))
141 er = ERROR_INSTALL_FAILURE;
142 return WcaFinalize(er);
143}
144
145/********************************************************************
146WixQueryOsDirs - entry point for WixQueryOsDirs custom action
147
148 Called as Type 1 custom action (DLL from the Binary table) from
149 Windows Installer to set properties that identify predefined directories
150********************************************************************/
151extern "C" UINT __stdcall WixQueryOsDirs(
152 __in MSIHANDLE hInstall
153 )
154{
155 HRESULT hr = S_OK;
156 DWORD er = ERROR_SUCCESS;
157
158 hr = WcaInitialize(hInstall, "WixQueryOsDirs");
159 ExitOnFailure(hr, "WixQueryOsDirs failed to initialize");
160
161 // get the paths of the CSIDLs that represent real paths and for which MSI
162 // doesn't yet have standard folder properties
163 WCHAR path[MAX_PATH];
164 if (ERROR_SUCCESS == ::SHGetFolderPathW(NULL, CSIDL_ADMINTOOLS, NULL, SHGFP_TYPE_CURRENT, path))
165 {
166 WcaSetProperty(L"WIX_DIR_ADMINTOOLS", path);
167 }
168
169 if (ERROR_SUCCESS == ::SHGetFolderPathW(NULL, CSIDL_ALTSTARTUP, NULL, SHGFP_TYPE_CURRENT, path))
170 {
171 WcaSetProperty(L"WIX_DIR_ALTSTARTUP", path);
172 }
173
174 if (ERROR_SUCCESS == ::SHGetFolderPathW(NULL, CSIDL_CDBURN_AREA, NULL, SHGFP_TYPE_CURRENT, path))
175 {
176 WcaSetProperty(L"WIX_DIR_CDBURN_AREA", path);
177 }
178
179 if (ERROR_SUCCESS == ::SHGetFolderPathW(NULL, CSIDL_COMMON_ADMINTOOLS, NULL, SHGFP_TYPE_CURRENT, path))
180 {
181 WcaSetProperty(L"WIX_DIR_COMMON_ADMINTOOLS", path);
182 }
183
184 if (ERROR_SUCCESS == ::SHGetFolderPathW(NULL, CSIDL_COMMON_ALTSTARTUP, NULL, SHGFP_TYPE_CURRENT, path))
185 {
186 WcaSetProperty(L"WIX_DIR_COMMON_ALTSTARTUP", path);
187 }
188
189 if (ERROR_SUCCESS == ::SHGetFolderPathW(NULL, CSIDL_COMMON_DOCUMENTS, NULL, SHGFP_TYPE_CURRENT, path))
190 {
191 WcaSetProperty(L"WIX_DIR_COMMON_DOCUMENTS", path);
192 }
193
194 if (ERROR_SUCCESS == ::SHGetFolderPathW(NULL, CSIDL_COMMON_FAVORITES, NULL, SHGFP_TYPE_CURRENT, path))
195 {
196 WcaSetProperty(L"WIX_DIR_COMMON_FAVORITES", path);
197 }
198
199 if (ERROR_SUCCESS == ::SHGetFolderPathW(NULL, CSIDL_COMMON_MUSIC, NULL, SHGFP_TYPE_CURRENT, path))
200 {
201 WcaSetProperty(L"WIX_DIR_COMMON_MUSIC", path);
202 }
203
204 if (ERROR_SUCCESS == ::SHGetFolderPathW(NULL, CSIDL_COMMON_PICTURES, NULL, SHGFP_TYPE_CURRENT, path))
205 {
206 WcaSetProperty(L"WIX_DIR_COMMON_PICTURES", path);
207 }
208
209 if (ERROR_SUCCESS == ::SHGetFolderPathW(NULL, CSIDL_COMMON_VIDEO, NULL, SHGFP_TYPE_CURRENT, path))
210 {
211 WcaSetProperty(L"WIX_DIR_COMMON_VIDEO", path);
212 }
213
214 if (ERROR_SUCCESS == ::SHGetFolderPathW(NULL, CSIDL_COOKIES, NULL, SHGFP_TYPE_CURRENT, path))
215 {
216 WcaSetProperty(L"WIX_DIR_COOKIES", path);
217 }
218
219 if (ERROR_SUCCESS == ::SHGetFolderPathW(NULL, CSIDL_DESKTOP, NULL, SHGFP_TYPE_CURRENT, path))
220 {
221 WcaSetProperty(L"WIX_DIR_DESKTOP", path);
222 }
223
224 if (ERROR_SUCCESS == ::SHGetFolderPathW(NULL, CSIDL_HISTORY, NULL, SHGFP_TYPE_CURRENT, path))
225 {
226 WcaSetProperty(L"WIX_DIR_HISTORY", path);
227 }
228
229 if (ERROR_SUCCESS == ::SHGetFolderPathW(NULL, CSIDL_INTERNET_CACHE, NULL, SHGFP_TYPE_CURRENT, path))
230 {
231 WcaSetProperty(L"WIX_DIR_INTERNET_CACHE", path);
232 }
233
234 if (ERROR_SUCCESS == ::SHGetFolderPathW(NULL, CSIDL_MYMUSIC, NULL, SHGFP_TYPE_CURRENT, path))
235 {
236 WcaSetProperty(L"WIX_DIR_MYMUSIC", path);
237 }
238
239 if (ERROR_SUCCESS == ::SHGetFolderPathW(NULL, CSIDL_MYPICTURES, NULL, SHGFP_TYPE_CURRENT, path))
240 {
241 WcaSetProperty(L"WIX_DIR_MYPICTURES", path);
242 }
243
244 if (ERROR_SUCCESS == ::SHGetFolderPathW(NULL, CSIDL_MYVIDEO, NULL, SHGFP_TYPE_CURRENT, path))
245 {
246 WcaSetProperty(L"WIX_DIR_MYVIDEO", path);
247 }
248
249 if (ERROR_SUCCESS == ::SHGetFolderPathW(NULL, CSIDL_NETHOOD, NULL, SHGFP_TYPE_CURRENT, path))
250 {
251 WcaSetProperty(L"WIX_DIR_NETHOOD", path);
252 }
253
254 if (ERROR_SUCCESS == ::SHGetFolderPathW(NULL, CSIDL_PERSONAL, NULL, SHGFP_TYPE_CURRENT, path))
255 {
256 WcaSetProperty(L"WIX_DIR_PERSONAL", path);
257 }
258
259 if (ERROR_SUCCESS == ::SHGetFolderPathW(NULL, CSIDL_PRINTHOOD, NULL, SHGFP_TYPE_CURRENT, path))
260 {
261 WcaSetProperty(L"WIX_DIR_PRINTHOOD", path);
262 }
263
264 if (ERROR_SUCCESS == ::SHGetFolderPathW(NULL, CSIDL_PROFILE, NULL, SHGFP_TYPE_CURRENT, path))
265 {
266 WcaSetProperty(L"WIX_DIR_PROFILE", path);
267 }
268
269 if (ERROR_SUCCESS == ::SHGetFolderPathW(NULL, CSIDL_RECENT, NULL, SHGFP_TYPE_CURRENT, path))
270 {
271 WcaSetProperty(L"WIX_DIR_RECENT", path);
272 }
273
274 if (ERROR_SUCCESS == ::SHGetFolderPathW(NULL, CSIDL_RESOURCES, NULL, SHGFP_TYPE_CURRENT, path))
275 {
276 WcaSetProperty(L"WIX_DIR_RESOURCES", path);
277 }
278
279LExit:
280 if (FAILED(hr))
281 er = ERROR_INSTALL_FAILURE;
282 return WcaFinalize(er);
283}
284
285
286/********************************************************************
287SetPropertyWellKnownSID
288
289 Set a property with the localized name of a well known windows SID
290********************************************************************/
291static HRESULT SetPropertyWellKnownSID(
292 __in WELL_KNOWN_SID_TYPE sidType,
293 __in LPCWSTR wzPropertyName,
294 __in BOOL fIncludeDomainName
295 )
296{
297 HRESULT hr = S_OK;
298 PSID psid = NULL;
299 WCHAR wzRefDomain[MAX_PATH] = {0};
300 SID_NAME_USE nameUse;
301 DWORD refSize = MAX_PATH;
302 WCHAR wzName[MAX_PATH] = {0};
303 LPWSTR pwzPropertyValue = NULL;
304 DWORD size = MAX_PATH;
305
306 hr = AclGetWellKnownSid(sidType, &psid);
307 ExitOnFailure(hr, "Failed to get SID; skipping account %ls", wzPropertyName);
308
309 if (!::LookupAccountSidW(NULL, psid, wzName, &size, wzRefDomain, &refSize, &nameUse))
310 {
311 ExitWithLastError(hr, "Failed to look up account for SID; skipping account %ls.", wzPropertyName);
312 }
313
314 if (fIncludeDomainName)
315 {
316 hr = StrAllocFormatted(&pwzPropertyValue, L"%s\\%s", wzRefDomain, wzName);
317 ExitOnFailure(hr, "Failed to format property value");
318
319 hr = WcaSetProperty(wzPropertyName, pwzPropertyValue);
320 ExitOnFailure(hr, "Failed write domain\\name property");
321 }
322 else
323 {
324 hr = WcaSetProperty(wzPropertyName, wzName);
325 ExitOnFailure(hr, "Failed write to name-only property");
326 }
327
328LExit:
329 if (NULL != psid)
330 {
331 ::LocalFree(psid);
332 }
333 ReleaseStr(pwzPropertyValue);
334 return hr;
335}
336
337/********************************************************************
338WixQueryOsWellKnownSID - entry point for WixQueryOsWellKnownSID custom action
339
340 Called as Type 1 custom action (DLL from the Binary table) from
341 Windows Installer to set properties with the localized names of built-in
342 Windows Security IDs
343********************************************************************/
344extern "C" UINT __stdcall WixQueryOsWellKnownSID(
345 __in MSIHANDLE hInstall
346 )
347{
348 HRESULT hr = S_OK;
349 DWORD er = ERROR_SUCCESS;
350
351 hr = WcaInitialize(hInstall, "WixQueryOsWellKnownSID");
352 ExitOnFailure(hr, "WixQueryOsWellKnownSID failed to initialize");
353
354 SetPropertyWellKnownSID(WinLocalSystemSid, L"WIX_ACCOUNT_LOCALSYSTEM", TRUE);
355 SetPropertyWellKnownSID(WinLocalServiceSid, L"WIX_ACCOUNT_LOCALSERVICE", TRUE);
356 SetPropertyWellKnownSID(WinNetworkServiceSid, L"WIX_ACCOUNT_NETWORKSERVICE", TRUE);
357 SetPropertyWellKnownSID(WinBuiltinAdministratorsSid, L"WIX_ACCOUNT_ADMINISTRATORS", TRUE);
358 SetPropertyWellKnownSID(WinBuiltinUsersSid, L"WIX_ACCOUNT_USERS", TRUE);
359 SetPropertyWellKnownSID(WinBuiltinGuestsSid, L"WIX_ACCOUNT_GUESTS", TRUE);
360 SetPropertyWellKnownSID(WinBuiltinPerfLoggingUsersSid, L"WIX_ACCOUNT_PERFLOGUSERS", TRUE);
361 SetPropertyWellKnownSID(WinBuiltinPerfLoggingUsersSid, L"WIX_ACCOUNT_PERFLOGUSERS_NODOMAIN", FALSE);
362
363LExit:
364 if (FAILED(hr))
365 {
366 er = ERROR_INSTALL_FAILURE;
367 }
368 return WcaFinalize(er);
369}
370
371
372/********************************************************************
373DetectWDDMDriver
374
375 Set a property if the driver on the machine is a WDDM driver. One
376 reliable way to detect the presence of a WDDM driver is to try and
377 use the Direct3DCreate9Ex() function. This method attempts that
378 then sets the property appropriately.
379********************************************************************/
380static HRESULT DetectWDDMDriver()
381{
382 HRESULT hr = S_OK;
383 HMODULE hModule = NULL;
384
385 // Manually load the d3d9.dll library. If the library couldn't be loaded then we obviously won't be able
386 // to try calling the function so just return.
387 hr = LoadSystemLibrary(L"d3d9.dll", &hModule);
388 if (E_MODNOTFOUND == hr)
389 {
390 TraceError(hr, "Unable to load DirectX APIs, skipping WDDM driver check.");
391 ExitFunction1(hr = S_OK);
392 }
393 ExitOnFailure(hr, "Failed to the load the existing DirectX APIs.");
394
395 // Obtain the address of the Direct3DCreate9Ex function. If this fails we know it isn't a WDDM
396 // driver so just exit.
397 const void* Direct3DCreate9ExPtr = ::GetProcAddress(hModule, "Direct3DCreate9Ex");
398 ExitOnNull(Direct3DCreate9ExPtr, hr, S_OK, "Unable to load Direct3DCreateEx function, so the driver is not a WDDM driver.");
399
400 // At this point we know it's a WDDM driver so set the property.
401 hr = WcaSetIntProperty(L"WIX_WDDM_DRIVER_PRESENT", 1);
402 ExitOnFailure(hr, "Failed write property");
403
404LExit:
405 if (NULL != hModule)
406 {
407 FreeLibrary(hModule);
408 }
409
410 return hr;
411}
412
413/********************************************************************
414DetectIsCompositionEnabled
415
416 Set a property based on the return value of DwmIsCompositionEnabled().
417********************************************************************/
418static HRESULT DetectIsCompositionEnabled()
419{
420 HRESULT hr = S_OK;
421 HMODULE hModule = NULL;
422 BOOL compositionState = false;
423
424 // Manually load the d3d9.dll library. If the library can't load it's likely because we are not on a Vista
425 // OS. Just return ok, and the property won't get set.
426 hr = LoadSystemLibrary(L"dwmapi.dll", &hModule);
427 if (E_MODNOTFOUND == hr)
428 {
429 TraceError(hr, "Unable to load Vista desktop window manager APIs, skipping Composition Enabled check.");
430 ExitFunction1(hr = S_OK);
431 }
432 ExitOnFailure(hr, "Failed to load the existing window manager APIs.");
433
434 // If for some reason we can't get the function pointer that's ok, just return.
435 typedef HRESULT (WINAPI *DWMISCOMPOSITIONENABLEDPTR)(BOOL*);
436 DWMISCOMPOSITIONENABLEDPTR DwmIsCompositionEnabledPtr = (DWMISCOMPOSITIONENABLEDPTR)::GetProcAddress(hModule, "DwmIsCompositionEnabled");
437 ExitOnNull(hModule, hr, S_OK, "Unable to obtain function information, skipping Composition Enabled check.");
438
439 hr = DwmIsCompositionEnabledPtr(&compositionState);
440 ExitOnFailure(hr, "Failed to retrieve Composition state");
441
442 if (compositionState)
443 {
444 hr = WcaSetIntProperty(L"WIX_DWM_COMPOSITION_ENABLED", 1);
445 ExitOnFailure(hr, "Failed write property");
446 }
447
448LExit:
449 if (NULL != hModule)
450 {
451 FreeLibrary(hModule);
452 }
453 return hr;
454}
455
456/********************************************************************
457WixQueryOsDriverInfo - entry point for WixQueryOsDriverInfo custom action
458
459 Called as Type 1 custom action (DLL from the Binary table) from
460 Windows Installer to set properties about drivers installed on
461 the target machine
462********************************************************************/
463extern "C" UINT __stdcall WixQueryOsDriverInfo(
464 __in MSIHANDLE hInstall
465 )
466{
467 HRESULT hr = S_OK;
468 DWORD er = ERROR_SUCCESS;
469
470 hr = WcaInitialize(hInstall, "WixQueryOsDriverInfo");
471 ExitOnFailure(hr, "WixQueryOsDriverInfo failed to initialize");
472
473 // Detect the WDDM driver status
474 hr = DetectWDDMDriver();
475 ExitOnFailure(hr, "Failed to detect WIX_WDDM_DRIVER_PRESENT");
476
477 // Detect whether composition is enabled
478 hr = DetectIsCompositionEnabled();
479 ExitOnFailure(hr, "Failed to detect WIX_DWM_COMPOSITION_ENABLED");
480
481LExit:
482 if (FAILED(hr))
483 {
484 er = ERROR_INSTALL_FAILURE;
485 }
486 return WcaFinalize(er);
487}
diff --git a/src/ext/Util/ca/RemoveFoldersEx.cpp b/src/ext/Util/ca/RemoveFoldersEx.cpp
new file mode 100644
index 00000000..cbc7f4bb
--- /dev/null
+++ b/src/ext/Util/ca/RemoveFoldersEx.cpp
@@ -0,0 +1,243 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3#include "precomp.h"
4
5LPCWSTR vcsRemoveFolderExQuery =
6 L"SELECT `Wix4RemoveFolderEx`, `Component_`, `Property`, `InstallMode`, `WixRemoveFolderEx`.`Condition`, `Component`.`Attributes`"
7 L"FROM `Wix4RemoveFolderEx``,`Component` "
8 L"WHERE `Wix4RemoveFolderEx`.`Component_`=`Component`.`Component`";
9enum eRemoveFolderExQuery { rfqId = 1, rfqComponent, rfqProperty, rfqMode, rfqCondition, rfqComponentAttributes };
10
11static HRESULT RecursePath(
12 __in_z LPCWSTR wzPath,
13 __in_z LPCWSTR wzId,
14 __in_z LPCWSTR wzComponent,
15 __in_z LPCWSTR wzProperty,
16 __in int iMode,
17 __in BOOL fDisableWow64Redirection,
18 __inout DWORD* pdwCounter,
19 __inout MSIHANDLE* phTable,
20 __inout MSIHANDLE* phColumns
21 )
22{
23 HRESULT hr = S_OK;
24 DWORD er;
25 LPWSTR sczSearch = NULL;
26 LPWSTR sczProperty = NULL;
27 HANDLE hFind = INVALID_HANDLE_VALUE;
28 WIN32_FIND_DATAW wfd;
29 LPWSTR sczNext = NULL;
30
31 if (fDisableWow64Redirection)
32 {
33 hr = WcaDisableWow64FSRedirection();
34 ExitOnFailure(hr, "Custom action was told to act on a 64-bit component, but was unable to disable filesystem redirection through the Wow64 API.");
35 }
36
37 // First recurse down to all the child directories.
38 hr = StrAllocFormatted(&sczSearch, L"%s*", wzPath);
39 ExitOnFailure(hr, "Failed to allocate file search string in path: %S", wzPath);
40
41 hFind = ::FindFirstFileW(sczSearch, &wfd);
42 if (INVALID_HANDLE_VALUE == hFind)
43 {
44 er = ::GetLastError();
45 if (ERROR_PATH_NOT_FOUND == er)
46 {
47 WcaLog(LOGMSG_STANDARD, "Search path not found: %ls; skipping", sczSearch);
48 ExitFunction1(hr = S_FALSE);
49 }
50 else
51 {
52 hr = HRESULT_FROM_WIN32(er);
53 }
54 ExitOnFailure(hr, "Failed to find all files in path: %S", wzPath);
55 }
56
57 do
58 {
59 // Skip files and the dot directories.
60 if (FILE_ATTRIBUTE_DIRECTORY != (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) || L'.' == wfd.cFileName[0] && (L'\0' == wfd.cFileName[1] || (L'.' == wfd.cFileName[1] && L'\0' == wfd.cFileName[2])))
61 {
62 continue;
63 }
64
65 hr = StrAllocFormatted(&sczNext, L"%s%s\\", wzPath, wfd.cFileName);
66 ExitOnFailure(hr, "Failed to concat filename '%S' to string: %S", wfd.cFileName, wzPath);
67
68 // Don't re-disable redirection; if it was necessary, we've already done it.
69 hr = RecursePath(sczNext, wzId, wzComponent, wzProperty, iMode, FALSE, pdwCounter, phTable, phColumns);
70 ExitOnFailure(hr, "Failed to recurse path: %S", sczNext);
71 } while (::FindNextFileW(hFind, &wfd));
72
73 er = ::GetLastError();
74 if (ERROR_NO_MORE_FILES == er)
75 {
76 hr = S_OK;
77 }
78 else
79 {
80 hr = HRESULT_FROM_WIN32(er);
81 ExitOnFailure(hr, "Failed while looping through files in directory: %S", wzPath);
82 }
83
84 // Finally, set a property that points at our path.
85 hr = StrAllocFormatted(&sczProperty, L"_%s_%u", wzProperty, *pdwCounter);
86 ExitOnFailure(hr, "Failed to allocate Property for RemoveFile table with property: %S.", wzProperty);
87
88 ++(*pdwCounter);
89
90 hr = WcaSetProperty(sczProperty, wzPath);
91 ExitOnFailure(hr, "Failed to set Property: %S with path: %S", sczProperty, wzPath);
92
93 // Add the row to remove any files and another row to remove the folder.
94 hr = WcaAddTempRecord(phTable, phColumns, L"RemoveFile", NULL, 1, 5, L"RfxFiles", wzComponent, L"*.*", sczProperty, iMode);
95 ExitOnFailure(hr, "Failed to add row to remove all files for Wix4RemoveFolderEx row: %ls under path: %ls", wzId, wzPath);
96
97 hr = WcaAddTempRecord(phTable, phColumns, L"RemoveFile", NULL, 1, 5, L"RfxFolder", wzComponent, NULL, sczProperty, iMode);
98 ExitOnFailure(hr, "Failed to add row to remove folder for Wix4RemoveFolderEx row: %ls under path: %ls", wzId, wzPath);
99
100LExit:
101 if (INVALID_HANDLE_VALUE != hFind)
102 {
103 ::FindClose(hFind);
104 }
105
106 if (fDisableWow64Redirection)
107 {
108 WcaRevertWow64FSRedirection();
109 }
110
111 ReleaseStr(sczNext);
112 ReleaseStr(sczProperty);
113 ReleaseStr(sczSearch);
114 return hr;
115}
116
117extern "C" UINT WINAPI WixRemoveFoldersEx(
118 __in MSIHANDLE hInstall
119 )
120{
121 //AssertSz(FALSE, "debug WixRemoveFoldersEx");
122
123 HRESULT hr = S_OK;
124 PMSIHANDLE hView;
125 PMSIHANDLE hRec;
126 LPWSTR sczId = NULL;
127 LPWSTR sczComponent = NULL;
128 LPWSTR sczProperty = NULL;
129 LPWSTR sczCondition = NULL;
130 LPWSTR sczPath = NULL;
131 LPWSTR sczExpandedPath = NULL;
132 int iMode = 0;
133 int iComponentAttributes;
134 BOOL f64BitComponent = FALSE;
135 DWORD dwCounter = 0;
136 DWORD_PTR cchLen = 0;
137 MSIHANDLE hTable = NULL;
138 MSIHANDLE hColumns = NULL;
139
140 hr = WcaInitialize(hInstall, "WixRemoveFoldersEx");
141 ExitOnFailure(hr, "Failed to initialize WixRemoveFoldersEx.");
142
143 WcaInitializeWow64();
144
145 // anything to do?
146 if (S_OK != WcaTableExists(L"Wix4RemoveFolderEx"))
147 {
148 WcaLog(LOGMSG_STANDARD, "Wix4RemoveFolderEx table doesn't exist, so there are no folders to remove.");
149 ExitFunction();
150 }
151
152 // query and loop through all the remove folders exceptions
153 hr = WcaOpenExecuteView(vcsRemoveFolderExQuery, &hView);
154 ExitOnFailure(hr, "Failed to open view on Wix4RemoveFolderEx table");
155
156 while (S_OK == (hr = WcaFetchRecord(hView, &hRec)))
157 {
158 hr = WcaGetRecordString(hRec, rfqId, &sczId);
159 ExitOnFailure(hr, "Failed to get remove folder identity.");
160
161 hr = WcaGetRecordString(hRec, rfqCondition, &sczCondition);
162 ExitOnFailure(hr, "Failed to get remove folder condition.");
163
164 if (sczCondition && *sczCondition)
165 {
166 MSICONDITION condition = ::MsiEvaluateConditionW(hInstall, sczCondition);
167 if (MSICONDITION_TRUE == condition)
168 {
169 WcaLog(LOGMSG_STANDARD, "True condition for row %S: %S; processing.", sczId, sczCondition);
170 }
171 else
172 {
173 WcaLog(LOGMSG_STANDARD, "False or invalid condition for row %S: %S; skipping.", sczId, sczCondition);
174 continue;
175 }
176 }
177
178 hr = WcaGetRecordString(hRec, rfqComponent, &sczComponent);
179 ExitOnFailure(hr, "Failed to get remove folder component.");
180
181 hr = WcaGetRecordString(hRec, rfqProperty, &sczProperty);
182 ExitOnFailure(hr, "Failed to get remove folder property.");
183
184 hr = WcaGetRecordInteger(hRec, rfqMode, &iMode);
185 ExitOnFailure(hr, "Failed to get remove folder mode");
186
187 hr = WcaGetProperty(sczProperty, &sczPath);
188 ExitOnFailure(hr, "Failed to resolve remove folder property: %S for row: %S", sczProperty, sczId);
189
190 hr = WcaGetRecordInteger(hRec, rfqComponentAttributes, &iComponentAttributes);
191 ExitOnFailure(hr, "failed to get component attributes for row: %ls", sczId);
192
193 f64BitComponent = iComponentAttributes & msidbComponentAttributes64bit;
194
195 // fail early if the property isn't set as you probably don't want your installers trying to delete SystemFolder
196 // StringCchLengthW succeeds only if the string is zero characters plus 1 for the terminating null
197 hr = ::StringCchLengthW(sczPath, 1, reinterpret_cast<UINT_PTR*>(&cchLen));
198 if (SUCCEEDED(hr))
199 {
200 ExitOnFailure(hr = E_INVALIDARG, "Missing folder property: %S for row: %S", sczProperty, sczId);
201 }
202
203 hr = PathExpand(&sczExpandedPath, sczPath, PATH_EXPAND_ENVIRONMENT);
204 ExitOnFailure(hr, "Failed to expand path: %S for row: %S", sczPath, sczId);
205
206 hr = PathBackslashTerminate(&sczExpandedPath);
207 ExitOnFailure(hr, "Failed to backslash-terminate path: %S", sczExpandedPath);
208
209 WcaLog(LOGMSG_STANDARD, "Recursing path: %S for row: %S.", sczExpandedPath, sczId);
210 hr = RecursePath(sczExpandedPath, sczId, sczComponent, sczProperty, iMode, f64BitComponent, &dwCounter, &hTable, &hColumns);
211 ExitOnFailure(hr, "Failed while navigating path: %S for row: %S", sczPath, sczId);
212 }
213
214 // reaching the end of the list is actually a good thing, not an error
215 if (E_NOMOREITEMS == hr)
216 {
217 hr = S_OK;
218 }
219 ExitOnFailure(hr, "Failure occured while processing Wix4RemoveFolderEx table");
220
221LExit:
222 WcaFinalizeWow64();
223
224 if (hColumns)
225 {
226 ::MsiCloseHandle(hColumns);
227 }
228
229 if (hTable)
230 {
231 ::MsiCloseHandle(hTable);
232 }
233
234 ReleaseStr(sczExpandedPath);
235 ReleaseStr(sczPath);
236 ReleaseStr(sczProperty);
237 ReleaseStr(sczComponent);
238 ReleaseStr(sczCondition);
239 ReleaseStr(sczId);
240
241 DWORD er = SUCCEEDED(hr) ? ERROR_SUCCESS : ERROR_INSTALL_FAILURE;
242 return WcaFinalize(er);
243}
diff --git a/src/ext/Util/ca/RemoveRegistryKeysEx.cpp b/src/ext/Util/ca/RemoveRegistryKeysEx.cpp
new file mode 100644
index 00000000..478c0779
--- /dev/null
+++ b/src/ext/Util/ca/RemoveRegistryKeysEx.cpp
@@ -0,0 +1,114 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3#include "precomp.h"
4
5LPCWSTR vcsRemoveRegistryKeyExQuery =
6 L"SELECT `Wix4RemoveRegistryKeyEx`, `Component_`, `Root`, `Key`, `InstallMode`, `Condition` FROM `Wix4RemoveRegistryKeyEx`";
7enum eRemoveRegistryKeyExQuery { rrxqId = 1, rrxqComponent, rrxqRoot, rrxqKey, rrxqMode, rrxqCondition };
8
9extern "C" UINT WINAPI WixRemoveRegistryKeysEx(
10 __in MSIHANDLE hInstall
11)
12{
13 //AssertSz(FALSE, "debug WixRemoveRegistryKeyEx");
14
15 HRESULT hr = S_OK;
16 PMSIHANDLE hView;
17 PMSIHANDLE hRec;
18 LPWSTR sczId = NULL;
19 LPWSTR sczComponent = NULL;
20 LPWSTR sczCondition = NULL;
21 LPWSTR sczKey = NULL;
22 int iRoot = 0;
23 int iMode = 0;
24 MSIHANDLE hTable = NULL;
25 MSIHANDLE hColumns = NULL;
26
27 hr = WcaInitialize(hInstall, __FUNCTION__);
28 ExitOnFailure(hr, "Failed to initialize " __FUNCTION__);
29
30 // anything to do?
31 if (S_OK != WcaTableExists(L"Wix4RemoveRegistryKeyEx"))
32 {
33 WcaLog(LOGMSG_STANDARD, "Wix4RemoveRegistryKeyEx table doesn't exist, so there are no registry keys to remove.");
34 ExitFunction();
35 }
36
37 hr = WcaOpenExecuteView(vcsRemoveRegistryKeyExQuery, &hView);
38 ExitOnFailure(hr, "Failed to open view on Wix4RemoveRegistryKeyEx table");
39
40 while (S_OK == (hr = WcaFetchRecord(hView, &hRec)))
41 {
42 hr = WcaGetRecordString(hRec, rrxqId, &sczId);
43 ExitOnFailure(hr, "Failed to get Wix4RemoveRegistryKeyEx identity.");
44
45 hr = WcaGetRecordString(hRec, rrxqCondition, &sczCondition);
46 ExitOnFailure(hr, "Failed to get Wix4RemoveRegistryKeyEx condition.");
47
48 if (sczCondition && *sczCondition)
49 {
50 MSICONDITION condition = ::MsiEvaluateConditionW(hInstall, sczCondition);
51 if (MSICONDITION_TRUE == condition)
52 {
53 WcaLog(LOGMSG_STANDARD, "True condition for row %S: %S; processing.", sczId, sczCondition);
54 }
55 else
56 {
57 WcaLog(LOGMSG_STANDARD, "False or invalid condition for row %S: %S; skipping.", sczId, sczCondition);
58 continue;
59 }
60 }
61
62 hr = WcaGetRecordString(hRec, rrxqComponent, &sczComponent);
63 ExitOnFailure(hr, "Failed to get Wix4RemoveRegistryKeyEx component.");
64
65 hr = WcaGetRecordInteger(hRec, rrxqRoot, &iRoot);
66 ExitOnFailure(hr, "Failed to get Wix4RemoveRegistryKeyEx root.");
67
68 hr = WcaGetRecordString(hRec, rrxqKey, &sczKey);
69 ExitOnFailure(hr, "Failed to get Wix4RemoveRegistryKeyEx key.");
70
71 hr = WcaGetRecordInteger(hRec, rrxqMode, &iMode);
72 ExitOnFailure(hr, "Failed to get Wix4RemoveRegistryKeyEx mode.");
73
74 switch (iMode)
75 {
76 case 1: // remove on install
77 WcaLog(LOGMSG_STANDARD, "Adding RemoveRegistry row: %ls/%d/%ls/-/%ls", sczId, iRoot, sczKey, sczComponent);
78 hr = WcaAddTempRecord(&hTable, &hColumns, L"RemoveRegistry", NULL, 0, 5, sczId, iRoot, sczKey, L"-", sczComponent);
79 ExitOnFailure(hr, "Failed to add RemoveRegistry row for remove-on-install Wix4RemoveRegistryKeyEx row: %ls:", sczId);
80 break;
81 case 2: // remove on uninstall
82 WcaLog(LOGMSG_STANDARD, "Adding Registry row: %ls/%d/%ls/-/null/%ls", sczId, iRoot, sczKey, sczComponent);
83 hr = WcaAddTempRecord(&hTable, &hColumns, L"Registry", NULL, 0, 6, sczId, iRoot, sczKey, L"-", NULL, sczComponent);
84 ExitOnFailure(hr, "Failed to add Registry row for remove-on-uninstall Wix4RemoveRegistryKeyEx row: %ls:", sczId);
85 break;
86 }
87 }
88
89 // reaching the end of the list is actually a good thing, not an error
90 if (E_NOMOREITEMS == hr)
91 {
92 hr = S_OK;
93 }
94 ExitOnFailure(hr, "Failure occured while processing Wix4RemoveRegistryKeyEx table.");
95
96LExit:
97 if (hColumns)
98 {
99 ::MsiCloseHandle(hColumns);
100 }
101
102 if (hTable)
103 {
104 ::MsiCloseHandle(hTable);
105 }
106
107 ReleaseStr(sczKey);
108 ReleaseStr(sczComponent);
109 ReleaseStr(sczCondition);
110 ReleaseStr(sczId);
111
112 DWORD er = SUCCEEDED(hr) ? ERROR_SUCCESS : ERROR_INSTALL_FAILURE;
113 return WcaFinalize(er);
114}
diff --git a/src/ext/Util/ca/RestartManager.cpp b/src/ext/Util/ca/RestartManager.cpp
new file mode 100644
index 00000000..c31819c1
--- /dev/null
+++ b/src/ext/Util/ca/RestartManager.cpp
@@ -0,0 +1,185 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3#include "precomp.h"
4#include <restartmanager.h>
5
6// Include space for the terminating null.
7#define CCH_SESSION_KEY CCH_RM_SESSION_KEY + 1
8
9enum eRmuResourceType
10{
11 etInvalid,
12 etFilename,
13 etApplication,
14 etServiceName,
15
16 // Mask types from Attributes.
17 etTypeMask = 0xf,
18};
19
20LPCWSTR vcsRestartResourceQuery =
21 L"SELECT `Wix4RestartResource`.`Wix4RestartResource`, `Wix4RestartResource`.`Component_`, `Wix4RestartResource`.`Resource`, `Wix4RestartResource`.`Attributes` "
22 L"FROM `Wix4RestartResource`";
23enum eRestartResourceQuery { rrqRestartResource = 1, rrqComponent, rrqResource, rrqAttributes };
24
25/********************************************************************
26WixRegisterRestartResources - Immediate CA to register resources with RM.
27
28Enumerates components before InstallValidate and registers resources
29to be restarted by Restart Manager if the component action
30is anything other than None.
31
32Do not disable file system redirection.
33
34********************************************************************/
35extern "C" UINT __stdcall WixRegisterRestartResources(
36 __in MSIHANDLE hInstall
37 )
38{
39 HRESULT hr = S_OK;
40 UINT er = ERROR_SUCCESS;
41
42 PMSIHANDLE hView = NULL;
43 PMSIHANDLE hRec = NULL;
44
45 LPWSTR wzSessionKey = NULL;
46 size_t cchSessionKey = 0;
47 PRMU_SESSION pSession = NULL;
48
49 LPWSTR wzRestartResource = NULL;
50 LPWSTR wzComponent = NULL;
51 LPWSTR wzResource = NULL;
52 int iAttributes = NULL;
53 BOOL fIsComponentNull = FALSE;
54 WCA_TODO todo = WCA_TODO_UNKNOWN;
55 int iType = etInvalid;
56
57 hr = WcaInitialize(hInstall, "WixRegisterRestartResources");
58 ExitOnFailure(hr, "Failed to initialize.");
59
60 // Skip if the table doesn't exist.
61 if (S_OK != WcaTableExists(L"Wix4RestartResource"))
62 {
63 WcaLog(LOGMSG_STANDARD, "The Wix4RestartResource table does not exist; there are no resources to register with Restart Manager.");
64 ExitFunction();
65 }
66
67 // Get the existing Restart Manager session if available.
68 hr = WcaGetProperty(L"MsiRestartManagerSessionKey", &wzSessionKey);
69 ExitOnFailure(hr, "Failed to get the MsiRestartManagerSessionKey property.");
70
71 hr = ::StringCchLengthW(wzSessionKey, CCH_SESSION_KEY, &cchSessionKey);
72 ExitOnFailure(hr, "Failed to get the MsiRestartManagerSessionKey string length.");
73
74 // Skip if the property doesn't exist.
75 if (0 == cchSessionKey)
76 {
77 WcaLog(LOGMSG_STANDARD, "The MsiRestartManagerSessionKey property is not available to join.");
78 ExitFunction();
79 }
80
81 // Join the existing Restart Manager session if supported.
82 hr = RmuJoinSession(&pSession, wzSessionKey);
83 if (E_MODNOTFOUND == hr)
84 {
85 WcaLog(LOGMSG_STANDARD, "The Restart Manager is not supported on this platform. Skipping.");
86 ExitFunction1(hr = S_OK);
87 }
88 else if (FAILED(hr))
89 {
90 WcaLog(LOGMSG_STANDARD, "Failed to join the existing Restart Manager session %ls.", wzSessionKey);
91 ExitFunction1(hr = S_OK);
92 }
93
94 // Loop through each record in the table.
95 hr = WcaOpenExecuteView(vcsRestartResourceQuery, &hView);
96 ExitOnFailure(hr, "Failed to open a view on the RestartResource table.");
97
98 while (S_OK == (hr = WcaFetchRecord(hView, &hRec)))
99 {
100 hr = WcaGetRecordString(hRec, rrqRestartResource, &wzRestartResource);
101 ExitOnFailure(hr, "Failed to get the RestartResource field value.");
102
103 hr = WcaGetRecordString(hRec, rrqComponent, &wzComponent);
104 ExitOnFailure(hr, "Failed to get the Component_ field value.");
105
106 hr = WcaGetRecordFormattedString(hRec, rrqResource, &wzResource);
107 ExitOnFailure(hr, "Failed to get the Resource formatted field value.");
108
109 hr = WcaGetRecordInteger(hRec, rrqAttributes, &iAttributes);
110 ExitOnFailure(hr, "Failed to get the Attributes field value.");
111
112 fIsComponentNull = ::MsiRecordIsNull(hRec, rrqComponent);
113 todo = WcaGetComponentToDo(wzComponent);
114
115 // Only register resources for components that are null, or being installed, reinstalled, or uninstalled.
116 if (!fIsComponentNull && WCA_TODO_UNKNOWN == todo)
117 {
118 WcaLog(LOGMSG_VERBOSE, "Skipping resource %ls.", wzRestartResource);
119 continue;
120 }
121
122 // Get the type from Attributes and add to the Restart Manager.
123 iType = iAttributes & etTypeMask;
124 switch (iType)
125 {
126 case etFilename:
127 WcaLog(LOGMSG_VERBOSE, "Registering file name %ls with the Restart Manager.", wzResource);
128 hr = RmuAddFile(pSession, wzResource);
129 ExitOnFailure(hr, "Failed to register the file name with the Restart Manager session.");
130 break;
131
132 case etApplication:
133 WcaLog(LOGMSG_VERBOSE, "Registering process name %ls with the Restart Manager.", wzResource);
134 hr = RmuAddProcessesByName(pSession, wzResource);
135 if (E_NOTFOUND == hr)
136 {
137 // ERROR_ACCESS_DENIED was returned when trying to register this process.
138 // Since other instances may have been registered, log a message and continue the setup rather than failing.
139 WcaLog(LOGMSG_STANDARD, "The process, %ls, could not be registered with the Restart Manager (probably because the setup is not elevated and the process is in another user context). A reboot may be requested later.", wzResource);
140 hr = S_OK;
141 }
142 else
143 {
144 ExitOnFailure(hr, "Failed to register the process name with the Restart Manager session.");
145 }
146 break;
147
148 case etServiceName:
149 WcaLog(LOGMSG_VERBOSE, "Registering service name %ls with the Restart Manager.", wzResource);
150 hr = RmuAddService(pSession, wzResource);
151 ExitOnFailure(hr, "Failed to register the service name with the Restart Manager session.");
152 break;
153
154 default:
155 WcaLog(LOGMSG_VERBOSE, "The resource type %d for %ls is not supported and will not be registered.", iType, wzRestartResource);
156 break;
157 }
158 }
159
160 if (E_NOMOREITEMS == hr)
161 {
162 hr = S_OK;
163 }
164 ExitOnFailure(hr, "Failed while looping through all rows to register resources.");
165
166 // Register the resources and unjoin the session.
167 hr = RmuEndSession(pSession);
168 if (FAILED(hr))
169 {
170 WcaLog(LOGMSG_VERBOSE, "Failed to register the resources with the Restart Manager.");
171 ExitFunction1(hr = S_OK);
172 }
173
174LExit:
175 ReleaseStr(wzRestartResource);
176 ReleaseStr(wzComponent);
177 ReleaseStr(wzResource);
178
179 if (FAILED(hr))
180 {
181 er = ERROR_INSTALL_FAILURE;
182 }
183
184 return WcaFinalize(er);
185}
diff --git a/src/ext/Util/ca/TouchFile.cpp b/src/ext/Util/ca/TouchFile.cpp
new file mode 100644
index 00000000..e704f922
--- /dev/null
+++ b/src/ext/Util/ca/TouchFile.cpp
@@ -0,0 +1,308 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3#include "precomp.h"
4
5LPCWSTR vcsTouchFileQuery = L"SELECT `Wix4TouchFile`, `Component_`, `Path`, `Attributes` FROM `Wix4TouchFile`";
6enum TOUCH_FILE_QUERY { tfqId = 1, tfqComponent, tfqPath, tfqTouchFileAttributes };
7
8enum TOUCH_FILE_ATTRIBUTE
9{
10 TOUCH_FILE_ATTRIBUTE_ON_INSTALL = 0x01,
11 TOUCH_FILE_ATTRIBUTE_ON_REINSTALL = 0x02,
12 TOUCH_FILE_ATTRIBUTE_ON_UNINSTALL = 0x04,
13 TOUCH_FILE_ATTRIBUTE_64BIT = 0x10,
14 TOUCH_FILE_ATTRIBUTE_VITAL = 0x20
15};
16
17
18static BOOL SetExistingFileModifiedTime(
19 __in_z LPCWSTR wzId,
20 __in_z LPCWSTR wzPath,
21 __in BOOL f64Bit,
22 __in FILETIME* pftModified
23 )
24{
25 HRESULT hr = S_OK;
26 BOOL fReenableFileSystemRedirection = FALSE;
27
28 if (f64Bit)
29 {
30 hr = WcaDisableWow64FSRedirection();
31 ExitOnFailure(hr, "Failed to disable 64-bit file system redirection to path: '%ls' for: %ls", wzPath, wzId);
32
33 fReenableFileSystemRedirection = TRUE;
34 }
35
36 hr = FileSetTime(wzPath, NULL, NULL, pftModified);
37
38LExit:
39 if (fReenableFileSystemRedirection)
40 {
41 WcaRevertWow64FSRedirection();
42 }
43
44 return SUCCEEDED(hr);
45}
46
47
48static HRESULT AddDataToCustomActionData(
49 __deref_inout_z LPWSTR* psczCustomActionData,
50 __in_z LPCWSTR wzId,
51 __in_z LPCWSTR wzPath,
52 __in int iTouchFileAttributes,
53 __in FILETIME ftModified
54 )
55{
56 HRESULT hr = S_OK;
57
58 hr = WcaWriteStringToCaData(wzId, psczCustomActionData);
59 ExitOnFailure(hr, "Failed to add touch file identity to custom action data.");
60
61 hr = WcaWriteStringToCaData(wzPath, psczCustomActionData);
62 ExitOnFailure(hr, "Failed to add touch file path to custom action data.");
63
64 hr = WcaWriteIntegerToCaData(iTouchFileAttributes, psczCustomActionData);
65 ExitOnFailure(hr, "Failed to add touch file attributes to custom action data.");
66
67 hr = WcaWriteIntegerToCaData(ftModified.dwHighDateTime, psczCustomActionData);
68 ExitOnFailure(hr, "Failed to add touch file high date/time to custom action data.");
69
70 hr = WcaWriteIntegerToCaData(ftModified.dwLowDateTime, psczCustomActionData);
71 ExitOnFailure(hr, "Failed to add touch file low date/time to custom action data.");
72
73LExit:
74 return hr;
75}
76
77
78static BOOL TryGetExistingFileModifiedTime(
79 __in_z LPCWSTR wzId,
80 __in_z LPCWSTR wzPath,
81 __in BOOL f64Bit,
82 __inout FILETIME* pftModified
83 )
84{
85 HRESULT hr = S_OK;
86 BOOL fReenableFileSystemRedirection = FALSE;
87
88 if (f64Bit)
89 {
90 hr = WcaDisableWow64FSRedirection();
91 ExitOnFailure(hr, "Failed to disable 64-bit file system redirection to path: '%ls' for: %ls", wzPath, wzId);
92
93 fReenableFileSystemRedirection = TRUE;
94 }
95
96 hr = FileGetTime(wzPath, NULL, NULL, pftModified);
97 if (E_PATHNOTFOUND == hr || E_FILENOTFOUND == hr)
98 {
99 // If the file doesn't exist yet there is nothing to rollback (i.e. file will probably be removed during rollback), so
100 // keep the error code but don't log anything.
101 }
102 else if (FAILED(hr))
103 {
104 WcaLog(LOGMSG_STANDARD, "Cannot access modified timestamp for file: '%ls' due to error: 0x%x. Continuing with out rollback for: %ls", wzPath, hr, wzId);
105 }
106
107LExit:
108 if (fReenableFileSystemRedirection)
109 {
110 WcaRevertWow64FSRedirection();
111 }
112
113 return SUCCEEDED(hr);
114}
115
116
117static HRESULT ProcessTouchFileTable(
118 __in BOOL fInstalling
119 )
120{
121 HRESULT hr = S_OK;
122
123 FILETIME ftModified = {};
124
125 PMSIHANDLE hView;
126 PMSIHANDLE hRec;
127
128 LPWSTR sczId = NULL;
129 LPWSTR sczComponent = NULL;
130 int iTouchFileAttributes = 0;
131 LPWSTR sczPath = NULL;
132
133 FILETIME ftRollbackModified = {};
134 LPWSTR sczRollbackData = NULL;
135 LPWSTR sczExecuteData = NULL;
136
137 if (S_OK != WcaTableExists(L"Wix4TouchFile"))
138 {
139 ExitFunction();
140 }
141
142 ::GetSystemTimeAsFileTime(&ftModified);
143
144 hr = WcaOpenExecuteView(vcsTouchFileQuery, &hView);
145 ExitOnFailure(hr, "Failed to open view on Wix4TouchFile table");
146
147 while (S_OK == (hr = WcaFetchRecord(hView, &hRec)))
148 {
149 hr = WcaGetRecordString(hRec, tfqId, &sczId);
150 ExitOnFailure(hr, "Failed to get touch file identity.");
151
152 hr = WcaGetRecordString(hRec, tfqComponent, &sczComponent);
153 ExitOnFailure(hr, "Failed to get touch file component for: %ls", sczId);
154
155 hr = WcaGetRecordInteger(hRec, tfqTouchFileAttributes, &iTouchFileAttributes);
156 ExitOnFailure(hr, "Failed to get touch file attributes for: %ls", sczId);
157
158 WCA_TODO todo = WcaGetComponentToDo(sczComponent);
159
160 BOOL fOnInstall = fInstalling && WCA_TODO_INSTALL == todo && (iTouchFileAttributes & TOUCH_FILE_ATTRIBUTE_ON_INSTALL);
161 BOOL fOnReinstall = fInstalling && WCA_TODO_REINSTALL == todo && (iTouchFileAttributes & TOUCH_FILE_ATTRIBUTE_ON_REINSTALL);
162 BOOL fOnUninstall = !fInstalling && WCA_TODO_UNINSTALL == todo && (iTouchFileAttributes & TOUCH_FILE_ATTRIBUTE_ON_UNINSTALL);
163
164 if (fOnInstall || fOnReinstall || fOnUninstall)
165 {
166 hr = WcaGetRecordFormattedString(hRec, tfqPath, &sczPath);
167 ExitOnFailure(hr, "Failed to get touch file path for: %ls", sczId);
168
169 if (TryGetExistingFileModifiedTime(sczId, sczPath, (iTouchFileAttributes & TOUCH_FILE_ATTRIBUTE_64BIT), &ftRollbackModified))
170 {
171 hr = AddDataToCustomActionData(&sczRollbackData, sczId, sczPath, iTouchFileAttributes, ftRollbackModified);
172 ExitOnFailure(hr, "Failed to add to rollback custom action data for: %ls", sczId);
173 }
174
175 hr = AddDataToCustomActionData(&sczExecuteData, sczId, sczPath, iTouchFileAttributes, ftModified);
176 ExitOnFailure(hr, "Failed to add to execute custom action data for: %ls", sczId);
177 }
178 }
179
180 if (E_NOMOREITEMS == hr)
181 {
182 hr = S_OK;
183 }
184 ExitOnFailure(hr, "Failure occured while processing Wix4TouchFile table");
185
186 if (sczRollbackData)
187 {
188 hr = WcaDoDeferredAction(CUSTOM_ACTION_DECORATION(L"RollbackTouchFile"), sczRollbackData, 0);
189 ExitOnFailure(hr, "Failed to schedule RollbackTouchFile");
190 }
191
192 if (sczExecuteData)
193 {
194 hr = WcaDoDeferredAction(CUSTOM_ACTION_DECORATION(L"ExecuteTouchFile"), sczExecuteData, 0);
195 ExitOnFailure(hr, "Failed to schedule ExecuteTouchFile");
196 }
197
198LExit:
199 ReleaseStr(sczExecuteData);
200 ReleaseStr(sczRollbackData);
201 ReleaseStr(sczPath);
202 ReleaseStr(sczComponent);
203 ReleaseStr(sczId);
204
205 return hr;
206}
207
208
209extern "C" UINT WINAPI WixTouchFileDuringInstall(
210 __in MSIHANDLE hInstall
211 )
212{
213 //AssertSz(FALSE, "debug WixTouchFileDuringInstall");
214
215 HRESULT hr = S_OK;
216
217 hr = WcaInitialize(hInstall, "WixTouchFileDuringInstall");
218 ExitOnFailure(hr, "Failed to initialize WixTouchFileDuringInstall.");
219
220 hr = ProcessTouchFileTable(TRUE);
221
222LExit:
223 DWORD er = SUCCEEDED(hr) ? ERROR_SUCCESS : ERROR_INSTALL_FAILURE;
224 return WcaFinalize(er);
225}
226
227
228extern "C" UINT WINAPI WixTouchFileDuringUninstall(
229 __in MSIHANDLE hInstall
230 )
231{
232 //AssertSz(FALSE, "debug WixTouchFileDuringUninstall");
233
234 HRESULT hr = S_OK;
235
236 hr = WcaInitialize(hInstall, "WixTouchFileDuringUninstall");
237 ExitOnFailure(hr, "Failed to initialize WixTouchFileDuringUninstall.");
238
239 hr = ProcessTouchFileTable(FALSE);
240
241LExit:
242 DWORD er = SUCCEEDED(hr) ? ERROR_SUCCESS : ERROR_INSTALL_FAILURE;
243 return WcaFinalize(er);
244}
245
246
247extern "C" UINT WINAPI WixExecuteTouchFile(
248 __in MSIHANDLE hInstall
249 )
250{
251 HRESULT hr = S_OK;
252
253 LPWSTR sczData = NULL;
254 LPWSTR pwz = NULL;
255
256 LPWSTR sczId = NULL;
257 LPWSTR sczPath = NULL;
258 int iTouchFileAttributes = 0;
259 FILETIME ftModified = {};
260
261 hr = WcaInitialize(hInstall, "WixExecuteTouchFile");
262 ExitOnFailure(hr, "Failed to initialize WixExecuteTouchFile.");
263
264 hr = WcaGetProperty(L"CustomActionData", &sczData);
265 ExitOnFailure(hr, "Failed to get custom action data for WixExecuteTouchFile.");
266
267 pwz = sczData;
268
269 while (pwz && *pwz)
270 {
271 hr = WcaReadStringFromCaData(&pwz, &sczId);
272 ExitOnFailure(hr, "Failed to get touch file identity from custom action data.");
273
274 hr = WcaReadStringFromCaData(&pwz, &sczPath);
275 ExitOnFailure(hr, "Failed to get touch file path from custom action data for: %ls", sczId);
276
277 hr = WcaReadIntegerFromCaData(&pwz, &iTouchFileAttributes);
278 ExitOnFailure(hr, "Failed to get touch file attributes from custom action data for: %ls", sczId);
279
280 hr = WcaReadIntegerFromCaData(&pwz, reinterpret_cast<int*>(&ftModified.dwHighDateTime));
281 ExitOnFailure(hr, "Failed to get touch file high date/time from custom action data for: %ls", sczId);
282
283 hr = WcaReadIntegerFromCaData(&pwz, reinterpret_cast<int*>(&ftModified.dwLowDateTime));
284 ExitOnFailure(hr, "Failed to get touch file low date/time from custom action data for: %ls", sczId);
285
286 hr = SetExistingFileModifiedTime(sczId, sczPath, (iTouchFileAttributes & TOUCH_FILE_ATTRIBUTE_64BIT), &ftModified);
287 if (FAILED(hr))
288 {
289 if (iTouchFileAttributes & TOUCH_FILE_ATTRIBUTE_VITAL)
290 {
291 ExitOnFailure(hr, "Failed to touch file: '%ls' for: %ls", &sczPath, sczId);
292 }
293 else
294 {
295 WcaLog(LOGMSG_STANDARD, "Could not touch non-vital file: '%ls' for: %ls with error: 0x%x. Continuing...", sczPath, sczId, hr);
296 hr = S_OK;
297 }
298 }
299 }
300
301LExit:
302 ReleaseStr(sczPath);
303 ReleaseStr(sczId);
304 ReleaseStr(sczData);
305
306 DWORD er = SUCCEEDED(hr) ? ERROR_SUCCESS : ERROR_INSTALL_FAILURE;
307 return WcaFinalize(er);
308}
diff --git a/src/ext/Util/ca/XmlConfig.cpp b/src/ext/Util/ca/XmlConfig.cpp
new file mode 100644
index 00000000..a1ec9d6f
--- /dev/null
+++ b/src/ext/Util/ca/XmlConfig.cpp
@@ -0,0 +1,1130 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3#include "precomp.h"
4
5#define XMLCONFIG_ELEMENT 0x00000001
6#define XMLCONFIG_VALUE 0x00000002
7#define XMLCONFIG_DOCUMENT 0x00000004
8#define XMLCONFIG_CREATE 0x00000010
9#define XMLCONFIG_DELETE 0x00000020
10#define XMLCONFIG_INSTALL 0x00000100
11#define XMLCONFIG_UNINSTALL 0x00000200
12#define XMLCONFIG_PRESERVE_MODIFIED 0x00001000
13
14enum eXmlAction
15{
16 xaUnknown = 0,
17 xaOpenFile,
18 xaOpenFilex64,
19 xaWriteValue,
20 xaWriteDocument,
21 xaDeleteValue,
22 xaCreateElement,
23 xaDeleteElement,
24};
25
26enum eXmlPreserveDate
27{
28 xdDontPreserve = 0,
29 xdPreserve
30};
31
32LPCWSTR vcsXmlConfigQuery =
33 L"SELECT `Wix4XmlConfig`.`Wix4XmlConfig`, `Wix4XmlConfig`.`File`, `Wix4XmlConfig`.`ElementId`, `Wix4XmlConfig`.`ElementPath`, `Wix4XmlConfig`.`VerifyPath`, `Wix4XmlConfig`.`Name`, "
34 L"`Wix4XmlConfig`.`Value`, `Wix4XmlConfig`.`Flags`, `Wix4XmlConfig`.`Component_`, `Component`.`Attributes` "
35 L"FROM `Wix4XmlConfig`,`Component` WHERE `Wix4XmlConfig`.`Component_`=`Component`.`Component` ORDER BY `File`, `Sequence`";
36enum eXmlConfigQuery { xfqXmlConfig = 1, xfqFile, xfqElementId, xfqElementPath, xfqVerifyPath, xfqName, xfqValue, xfqXmlFlags, xfqComponent, xfqCompAttributes };
37
38struct XML_CONFIG_CHANGE
39{
40 WCHAR wzId[MAX_DARWIN_KEY + 1];
41
42 WCHAR wzComponent[MAX_DARWIN_KEY + 1];
43 INSTALLSTATE isInstalled;
44 INSTALLSTATE isAction;
45
46 WCHAR wzFile[MAX_PATH];
47 LPWSTR pwzElementId;
48 LPWSTR pwzElementPath;
49 LPWSTR pwzVerifyPath;
50 WCHAR wzName[MAX_DARWIN_COLUMN];
51 LPWSTR pwzValue;
52 BOOL fInstalledFile;
53
54 int iXmlFlags;
55 int iCompAttributes;
56
57 XML_CONFIG_CHANGE* pxfcAdditionalChanges;
58 int cAdditionalChanges;
59
60 XML_CONFIG_CHANGE* pxfcPrev;
61 XML_CONFIG_CHANGE* pxfcNext;
62};
63
64static HRESULT FreeXmlConfigChangeList(
65 __in_opt XML_CONFIG_CHANGE* pxfcList
66 )
67{
68 HRESULT hr = S_OK;
69
70 XML_CONFIG_CHANGE* pxfcDelete;
71 while(pxfcList)
72 {
73 pxfcDelete = pxfcList;
74 pxfcList = pxfcList->pxfcNext;
75
76 if (pxfcDelete->pwzElementId)
77 {
78 hr = MemFree(pxfcDelete->pwzElementId);
79 ExitOnFailure(hr, "failed to free xml config element id in change list item");
80 }
81
82 if (pxfcDelete->pwzElementPath)
83 {
84 hr = MemFree(pxfcDelete->pwzElementPath);
85 ExitOnFailure(hr, "failed to free xml config element path in change list item");
86 }
87
88 if (pxfcDelete->pwzVerifyPath)
89 {
90 hr = MemFree(pxfcDelete->pwzVerifyPath);
91 ExitOnFailure(hr, "failed to free xml config verify path in change list item");
92 }
93
94 if (pxfcDelete->pwzValue)
95 {
96 hr = MemFree(pxfcDelete->pwzValue);
97 ExitOnFailure(hr, "failed to free xml config value in change list item");
98 }
99
100 hr = MemFree(pxfcDelete);
101 ExitOnFailure(hr, "failed to free xml config change list item");
102 }
103
104LExit:
105 return hr;
106}
107
108static HRESULT AddXmlConfigChangeToList(
109 __inout XML_CONFIG_CHANGE** ppxfcHead,
110 __inout XML_CONFIG_CHANGE** ppxfcTail
111 )
112{
113 Assert(ppxfcHead && ppxfcTail);
114
115 HRESULT hr = S_OK;
116
117 XML_CONFIG_CHANGE* pxfc = static_cast<XML_CONFIG_CHANGE*>(MemAlloc(sizeof(XML_CONFIG_CHANGE), TRUE));
118 ExitOnNull(pxfc, hr, E_OUTOFMEMORY, "failed to allocate memory for new xml file change list element");
119
120 // Add it to the end of the list
121 if (NULL == *ppxfcHead)
122 {
123 *ppxfcHead = pxfc;
124 *ppxfcTail = pxfc;
125 }
126 else
127 {
128 Assert(*ppxfcTail && (*ppxfcTail)->pxfcNext == NULL);
129 (*ppxfcTail)->pxfcNext = pxfc;
130 pxfc->pxfcPrev = *ppxfcTail;
131 *ppxfcTail = pxfc;
132 }
133
134LExit:
135 return hr;
136}
137
138
139static HRESULT ReadXmlConfigTable(
140 __inout XML_CONFIG_CHANGE** ppxfcHead,
141 __inout XML_CONFIG_CHANGE** ppxfcTail
142 )
143{
144 Assert(ppxfcHead && ppxfcTail);
145
146 HRESULT hr = S_OK;
147 UINT er = ERROR_SUCCESS;
148
149 PMSIHANDLE hView = NULL;
150 PMSIHANDLE hRec = NULL;
151
152 LPWSTR pwzData = NULL;
153
154 // loop through all the xml configurations
155 hr = WcaOpenExecuteView(vcsXmlConfigQuery, &hView);
156 ExitOnFailure(hr, "failed to open view on Wix4XmlConfig table");
157
158 while (S_OK == (hr = WcaFetchRecord(hView, &hRec)))
159 {
160 hr = AddXmlConfigChangeToList(ppxfcHead, ppxfcTail);
161 ExitOnFailure(hr, "failed to add xml file change to list");
162
163 // Get record Id
164 hr = WcaGetRecordString(hRec, xfqXmlConfig, &pwzData);
165 ExitOnFailure(hr, "failed to get Wix4XmlConfig record Id");
166 hr = StringCchCopyW((*ppxfcTail)->wzId, countof((*ppxfcTail)->wzId), pwzData);
167 ExitOnFailure(hr, "failed to copy Wix4XmlConfig record Id");
168
169 // Get component name
170 hr = WcaGetRecordString(hRec, xfqComponent, &pwzData);
171 ExitOnFailure(hr, "failed to get component name for Wix4XmlConfig: %ls", (*ppxfcTail)->wzId);
172
173 // Get the component's state
174 if (pwzData && *pwzData)
175 {
176 hr = StringCchCopyW((*ppxfcTail)->wzComponent, countof((*ppxfcTail)->wzComponent), pwzData);
177 ExitOnFailure(hr, "failed to copy component id");
178
179 er = ::MsiGetComponentStateW(WcaGetInstallHandle(), (*ppxfcTail)->wzComponent, &(*ppxfcTail)->isInstalled, &(*ppxfcTail)->isAction);
180 ExitOnFailure(hr = HRESULT_FROM_WIN32(er), "failed to get install state for component id");
181 }
182
183 // Get the xml file
184 hr = WcaGetRecordFormattedString(hRec, xfqFile, &pwzData);
185 ExitOnFailure(hr, "failed to get xml file for Wix4XmlConfig: %ls", (*ppxfcTail)->wzId);
186 hr = StringCchCopyW((*ppxfcTail)->wzFile, countof((*ppxfcTail)->wzFile), pwzData);
187 ExitOnFailure(hr, "failed to copy xml file path");
188
189 // Figure out if the file is already on the machine or if it's being installed
190 hr = WcaGetRecordString(hRec, xfqFile, &pwzData);
191 ExitOnFailure(hr, "failed to get xml file for Wix4XmlConfig: %ls", (*ppxfcTail)->wzId);
192 if (NULL != wcsstr(pwzData, L"[!") || NULL != wcsstr(pwzData, L"[#"))
193 {
194 (*ppxfcTail)->fInstalledFile = TRUE;
195 }
196
197 // Get the Wix4XmlConfig table flags
198 hr = WcaGetRecordInteger(hRec, xfqXmlFlags, &(*ppxfcTail)->iXmlFlags);
199 ExitOnFailure(hr, "failed to get Wix4XmlConfig flags for Wix4XmlConfig: %ls", (*ppxfcTail)->wzId);
200
201 // Get the Element Id
202 hr = WcaGetRecordFormattedString(hRec, xfqElementId, &(*ppxfcTail)->pwzElementId);
203 ExitOnFailure(hr, "failed to get Element Id for Wix4XmlConfig: %ls", (*ppxfcTail)->wzId);
204
205 // Get the Element Path
206 hr = WcaGetRecordFormattedString(hRec, xfqElementPath, &(*ppxfcTail)->pwzElementPath);
207 ExitOnFailure(hr, "failed to get Element Path for Wix4XmlConfig: %ls", (*ppxfcTail)->wzId);
208
209 // Get the Verify Path
210 hr = WcaGetRecordFormattedString(hRec, xfqVerifyPath, &(*ppxfcTail)->pwzVerifyPath);
211 ExitOnFailure(hr, "failed to get Verify Path for Wix4XmlConfig: %ls", (*ppxfcTail)->wzId);
212
213 // Get the name
214 hr = WcaGetRecordFormattedString(hRec, xfqName, &pwzData);
215 ExitOnFailure(hr, "failed to get Name for Wix4XmlConfig: %ls", (*ppxfcTail)->wzId);
216 hr = StringCchCopyW((*ppxfcTail)->wzName, countof((*ppxfcTail)->wzName), pwzData);
217 ExitOnFailure(hr, "failed to copy name of element");
218
219 // Get the value
220 hr = WcaGetRecordFormattedString(hRec, xfqValue, &pwzData);
221 ExitOnFailure(hr, "failed to get Value for Wix4XmlConfig: %ls", (*ppxfcTail)->wzId);
222 hr = StrAllocString(&(*ppxfcTail)->pwzValue, pwzData, 0);
223 ExitOnFailure(hr, "failed to allocate buffer for value");
224
225 // Get the component attributes
226 hr = WcaGetRecordInteger(hRec, xfqCompAttributes, &(*ppxfcTail)->iCompAttributes);
227 ExitOnFailure(hr, "failed to get component attributes for Wix4XmlConfig: %ls", (*ppxfcTail)->wzId);
228 }
229
230 // if we looped through all records all is well
231 if (E_NOMOREITEMS == hr)
232 {
233 hr = S_OK;
234 }
235 ExitOnFailure(hr, "failed while looping through all objects to secure");
236
237LExit:
238 ReleaseStr(pwzData);
239
240 return hr;
241}
242
243static HRESULT ProcessChanges(
244 __inout XML_CONFIG_CHANGE** ppxfcHead
245 )
246{
247 Assert(ppxfcHead && *ppxfcHead);
248 HRESULT hr = S_OK;
249
250 XML_CONFIG_CHANGE* pxfc = NULL;
251 XML_CONFIG_CHANGE* pxfcNext = NULL;
252 XML_CONFIG_CHANGE* pxfcCheck = NULL;
253 int cAdditionalChanges = 0;
254 XML_CONFIG_CHANGE* pxfcLast = NULL;
255
256 // If there's only one item in the list, none of this matters
257 if (pxfc && !pxfc->pxfcNext)
258 {
259 ExitFunction();
260 }
261
262 // Loop through the list
263 pxfc = *ppxfcHead;
264 while (pxfc)
265 {
266 // Keep track of where our next spot will be since our current node may be moved
267 pxfcNext = pxfc->pxfcNext;
268
269 // With each node, check to see if it's element path matches the Id of some other node in the list
270 pxfcCheck = *ppxfcHead;
271 while (pxfcCheck)
272 {
273 if (pxfc->pwzElementId)
274 {
275 if (0 == lstrcmpW(pxfc->pwzElementId, pxfcCheck->wzId)
276 && 0 == pxfc->iXmlFlags
277 && XMLCONFIG_CREATE & pxfcCheck->iXmlFlags
278 && XMLCONFIG_ELEMENT & pxfcCheck->iXmlFlags)
279 {
280 // We found a match. First, take it out of the current list
281 if (pxfc->pxfcPrev)
282 {
283 pxfc->pxfcPrev->pxfcNext = pxfc->pxfcNext;
284 }
285 else // it was the head. Update the head
286 {
287 *ppxfcHead = pxfc->pxfcNext;
288 }
289
290 if (pxfc->pxfcNext)
291 {
292 pxfc->pxfcNext->pxfcPrev = pxfc->pxfcPrev;
293 }
294
295 pxfc->pxfcNext = NULL;
296 pxfc->pxfcPrev = NULL;
297
298 // Now, add this node to the end of the matched node's additional changes list
299 if (!pxfcCheck->pxfcAdditionalChanges)
300 {
301 pxfcCheck->pxfcAdditionalChanges = pxfc;
302 pxfcCheck->cAdditionalChanges = 1;
303 }
304 else
305 {
306 pxfcLast = pxfcCheck->pxfcAdditionalChanges;
307 cAdditionalChanges = 1;
308 while (pxfcLast->pxfcNext)
309 {
310 pxfcLast = pxfcLast->pxfcNext;
311 ++cAdditionalChanges;
312 }
313 pxfcLast->pxfcNext = pxfc;
314 pxfc->pxfcPrev = pxfcLast;
315 pxfcCheck->cAdditionalChanges = ++cAdditionalChanges;
316 }
317 }
318 else
319 {
320 hr = E_NOTFOUND;
321 ExitOnRootFailure(hr, "failed to find matching ElementId: %ls", pxfc->pwzElementId);
322 }
323 }
324
325 pxfcCheck = pxfcCheck->pxfcNext;
326 }
327
328 pxfc = pxfcNext;
329 }
330
331LExit:
332
333 return hr;
334}
335
336
337static HRESULT BeginChangeFile(
338 __in LPCWSTR pwzFile,
339 __in int iCompAttributes,
340 __inout LPWSTR* ppwzCustomActionData
341 )
342{
343 Assert(pwzFile && *pwzFile && ppwzCustomActionData);
344
345 HRESULT hr = S_OK;
346 BOOL fIs64Bit = iCompAttributes & msidbComponentAttributes64bit;
347
348 LPBYTE pbData = NULL;
349 SIZE_T cbData = 0;
350
351 LPWSTR pwzRollbackCustomActionData = NULL;
352
353 if (fIs64Bit)
354 {
355 hr = WcaWriteIntegerToCaData((int)xaOpenFilex64, ppwzCustomActionData);
356 ExitOnFailure(hr, "failed to write 64-bit file indicator to custom action data");
357 }
358 else
359 {
360 hr = WcaWriteIntegerToCaData((int)xaOpenFile, ppwzCustomActionData);
361 ExitOnFailure(hr, "failed to write file indicator to custom action data");
362 }
363
364 hr = WcaWriteStringToCaData(pwzFile, ppwzCustomActionData);
365 ExitOnFailure(hr, "failed to write file to custom action data: %ls", pwzFile);
366
367 // If the file already exits, then we have to put it back the way it was on failure
368 if (FileExistsEx(pwzFile, NULL))
369 {
370 hr = FileRead(&pbData, &cbData, pwzFile);
371 ExitOnFailure(hr, "failed to read file: %ls", pwzFile);
372
373 // Set up the rollback for this file
374 hr = WcaWriteIntegerToCaData((int)fIs64Bit, &pwzRollbackCustomActionData);
375 ExitOnFailure(hr, "failed to write component bitness to rollback custom action data");
376
377 hr = WcaWriteStringToCaData(pwzFile, &pwzRollbackCustomActionData);
378 ExitOnFailure(hr, "failed to write file name to rollback custom action data: %ls", pwzFile);
379
380 hr = WcaWriteStreamToCaData(pbData, cbData, &pwzRollbackCustomActionData);
381 ExitOnFailure(hr, "failed to write file contents to rollback custom action data.");
382
383 hr = WcaDoDeferredAction(CUSTOM_ACTION_DECORATION(L"ExecXmlConfigRollback"), pwzRollbackCustomActionData, COST_XMLFILE);
384 ExitOnFailure(hr, "failed to schedule ExecXmlConfigRollback for file: %ls", pwzFile);
385
386 ReleaseStr(pwzRollbackCustomActionData);
387 }
388LExit:
389 ReleaseMem(pbData);
390
391 return hr;
392}
393
394
395static HRESULT WriteChangeData(
396 __in XML_CONFIG_CHANGE* pxfc,
397 __in eXmlAction action,
398 __inout LPWSTR* ppwzCustomActionData
399 )
400{
401 Assert(pxfc && ppwzCustomActionData);
402
403 HRESULT hr = S_OK;
404 XML_CONFIG_CHANGE* pxfcAdditionalChanges = NULL;
405 LPCWSTR wzElementPath = pxfc->pwzElementId ? pxfc->pwzElementId : pxfc->pwzElementPath;
406
407 hr = WcaWriteStringToCaData(wzElementPath, ppwzCustomActionData);
408 ExitOnFailure(hr, "failed to write ElementPath to custom action data: %ls", wzElementPath);
409
410 hr = WcaWriteStringToCaData(pxfc->pwzVerifyPath, ppwzCustomActionData);
411 ExitOnFailure(hr, "failed to write VerifyPath to custom action data: %ls", pxfc->pwzVerifyPath);
412
413 hr = WcaWriteStringToCaData(pxfc->wzName, ppwzCustomActionData);
414 ExitOnFailure(hr, "failed to write Name to custom action data: %ls", pxfc->wzName);
415
416 hr = WcaWriteStringToCaData(pxfc->pwzValue, ppwzCustomActionData);
417 ExitOnFailure(hr, "failed to write Value to custom action data: %ls", pxfc->pwzValue);
418
419 if (pxfc->iXmlFlags & XMLCONFIG_CREATE && pxfc->iXmlFlags & XMLCONFIG_ELEMENT && xaCreateElement == action && pxfc->pxfcAdditionalChanges)
420 {
421 hr = WcaWriteIntegerToCaData(pxfc->cAdditionalChanges, ppwzCustomActionData);
422 ExitOnFailure(hr, "failed to write additional changes value to custom action data");
423
424 pxfcAdditionalChanges = pxfc->pxfcAdditionalChanges;
425 while (pxfcAdditionalChanges)
426 {
427 Assert((0 == lstrcmpW(pxfcAdditionalChanges->wzComponent, pxfc->wzComponent)) && 0 == pxfcAdditionalChanges->iXmlFlags && (0 == lstrcmpW(pxfcAdditionalChanges->wzFile, pxfc->wzFile)));
428
429 hr = WcaWriteStringToCaData(pxfcAdditionalChanges->wzName, ppwzCustomActionData);
430 ExitOnFailure(hr, "failed to write Name to custom action data: %ls", pxfc->wzName);
431
432 hr = WcaWriteStringToCaData(pxfcAdditionalChanges->pwzValue, ppwzCustomActionData);
433 ExitOnFailure(hr, "failed to write Value to custom action data: %ls", pxfc->pwzValue);
434
435 pxfcAdditionalChanges = pxfcAdditionalChanges->pxfcNext;
436 }
437 }
438 else
439 {
440 hr = WcaWriteIntegerToCaData(0, ppwzCustomActionData);
441 ExitOnFailure(hr, "failed to write additional changes value to custom action data");
442 }
443
444LExit:
445 return hr;
446}
447
448
449/******************************************************************
450 SchedXmlConfig - entry point for XmlConfig Custom Action
451
452********************************************************************/
453extern "C" UINT __stdcall SchedXmlConfig(
454 __in MSIHANDLE hInstall
455 )
456{
457// AssertSz(FALSE, "debug SchedXmlConfig");
458
459 HRESULT hr = S_OK;
460 UINT er = ERROR_SUCCESS;
461
462 LPWSTR pwzCurrentFile = NULL;
463 BOOL fCurrentFileChanged = FALSE;
464
465 PMSIHANDLE hView = NULL;
466 PMSIHANDLE hRec = NULL;
467
468 XML_CONFIG_CHANGE* pxfcHead = NULL;
469 XML_CONFIG_CHANGE* pxfcTail = NULL; // TODO: do we need this any more?
470 XML_CONFIG_CHANGE* pxfc = NULL;
471
472 eXmlAction xa = xaUnknown;
473 eXmlPreserveDate xd;
474
475 LPWSTR pwzCustomActionData = NULL;
476
477 DWORD cFiles = 0;
478
479 // initialize
480 hr = WcaInitialize(hInstall, "SchedXmlConfig");
481 ExitOnFailure(hr, "failed to initialize");
482
483 hr = ReadXmlConfigTable(&pxfcHead, &pxfcTail);
484 MessageExitOnFailure(hr, msierrXmlConfigFailedRead, "failed to read Wix4XmlConfig table");
485
486 hr = ProcessChanges(&pxfcHead);
487 ExitOnFailure(hr, "failed to process Wix4XmlConfig changes");
488
489 // loop through all the xml configurations
490 for (pxfc = pxfcHead; pxfc; pxfc = pxfc->pxfcNext)
491 {
492 // If this is a different file, or the first file...
493 if (NULL == pwzCurrentFile || 0 != lstrcmpW(pwzCurrentFile, pxfc->wzFile))
494 {
495 // Remember the file we're currently working on
496 hr = StrAllocString(&pwzCurrentFile, pxfc->wzFile, 0);
497 ExitOnFailure(hr, "failed to copy file name");
498
499 fCurrentFileChanged = TRUE;
500 }
501
502 //
503 // Figure out what action to take
504 //
505 xa = xaUnknown;
506
507 // If it's being installed or reinstalled or uninstalled and that matches
508 // what we are doing then calculate the right action.
509 if ((XMLCONFIG_INSTALL & pxfc->iXmlFlags && (WcaIsInstalling(pxfc->isInstalled, pxfc->isAction) || WcaIsReInstalling(pxfc->isInstalled, pxfc->isAction))) ||
510 (XMLCONFIG_UNINSTALL & pxfc->iXmlFlags && WcaIsUninstalling(pxfc->isInstalled, pxfc->isAction)))
511 {
512 if (XMLCONFIG_CREATE & pxfc->iXmlFlags && XMLCONFIG_ELEMENT & pxfc->iXmlFlags)
513 {
514 xa = xaCreateElement;
515 }
516 else if (XMLCONFIG_DELETE & pxfc->iXmlFlags && XMLCONFIG_ELEMENT & pxfc->iXmlFlags)
517 {
518 xa = xaDeleteElement;
519 }
520 else if (XMLCONFIG_DELETE & pxfc->iXmlFlags && XMLCONFIG_VALUE & pxfc->iXmlFlags)
521 {
522 xa = xaDeleteValue;
523 }
524 else if (XMLCONFIG_CREATE & pxfc->iXmlFlags && XMLCONFIG_VALUE & pxfc->iXmlFlags)
525 {
526 xa = xaWriteValue;
527 }
528 else if (XMLCONFIG_CREATE & pxfc->iXmlFlags && XMLCONFIG_DOCUMENT & pxfc->iXmlFlags)
529 {
530 xa = xaWriteDocument;
531 }
532 else if (XMLCONFIG_DELETE & pxfc->iXmlFlags && XMLCONFIG_DOCUMENT & pxfc->iXmlFlags)
533 {
534 hr = E_INVALIDARG;
535 ExitOnFailure(hr, "Invalid flag configuration. Cannot delete a fragment node.");
536 }
537 }
538
539 if (XMLCONFIG_PRESERVE_MODIFIED & pxfc->iXmlFlags)
540 {
541 xd = xdPreserve;
542 }
543 else
544 {
545 xd= xdDontPreserve;
546 }
547
548 if (xaUnknown != xa)
549 {
550 if (fCurrentFileChanged)
551 {
552 hr = BeginChangeFile(pwzCurrentFile, pxfc->iCompAttributes, &pwzCustomActionData);
553 ExitOnFailure(hr, "failed to begin file change for file: %ls", pwzCurrentFile);
554
555 fCurrentFileChanged = FALSE;
556 ++cFiles;
557 }
558
559 hr = WcaWriteIntegerToCaData((int)xa, &pwzCustomActionData);
560 ExitOnFailure(hr, "failed to write action indicator custom action data");
561
562 hr = WcaWriteIntegerToCaData((int)xd, &pwzCustomActionData);
563 ExitOnFailure(hr, "failed to write Preserve Date indicator to custom action data");
564
565 hr = WriteChangeData(pxfc, xa, &pwzCustomActionData);
566 ExitOnFailure(hr, "failed to write change data");
567 }
568 }
569
570 // If we looped through all records all is well
571 if (E_NOMOREITEMS == hr)
572 {
573 hr = S_OK;
574 }
575 ExitOnFailure(hr, "failed while looping through all objects to secure");
576
577 // Schedule the custom action and add to progress bar
578 if (pwzCustomActionData && *pwzCustomActionData)
579 {
580 Assert(0 < cFiles);
581
582 hr = WcaDoDeferredAction(CUSTOM_ACTION_DECORATION(L"ExecXmlConfig"), pwzCustomActionData, cFiles * COST_XMLFILE);
583 ExitOnFailure(hr, "failed to schedule ExecXmlConfig action");
584 }
585
586LExit:
587 ReleaseStr(pwzCurrentFile);
588 ReleaseStr(pwzCustomActionData);
589
590 FreeXmlConfigChangeList(pxfcHead);
591
592 if (FAILED(hr))
593 {
594 er = ERROR_INSTALL_FAILURE;
595 }
596 return WcaFinalize(er);
597}
598
599
600/******************************************************************
601 ExecXmlConfig - entry point for XmlConfig Custom Action
602
603*******************************************************************/
604extern "C" UINT __stdcall ExecXmlConfig(
605 __in MSIHANDLE hInstall
606 )
607{
608 //AssertSz(FALSE, "debug ExecXmlConfig");
609 HRESULT hr = S_OK;
610 HRESULT hrOpenFailure = S_OK;
611 UINT er = ERROR_SUCCESS;
612
613#ifndef _WIN64
614 BOOL fIsFSRedirectDisabled = FALSE;
615#endif
616 BOOL fPreserveDate = FALSE;
617
618 LPWSTR pwzCustomActionData = NULL;
619 LPWSTR pwzData = NULL;
620 LPWSTR pwzFile = NULL;
621 LPWSTR pwzElementPath = NULL;
622 LPWSTR pwzVerifyPath = NULL;
623 LPWSTR pwzName = NULL;
624 LPWSTR pwzValue = NULL;
625 LPWSTR pwz = NULL;
626 int cAdditionalChanges = 0;
627
628 IXMLDOMDocument* pixd = NULL;
629 IXMLDOMNode* pixn = NULL;
630 IXMLDOMNode* pixnVerify = NULL;
631 IXMLDOMNode* pixnNewNode = NULL;
632 IXMLDOMNode* pixnRemovedChild = NULL;
633
634 IXMLDOMDocument* pixdNew = NULL;
635 IXMLDOMElement* pixeNew = NULL;
636
637 FILETIME ft;
638
639 int id = IDRETRY;
640
641 eXmlAction xa;
642 eXmlPreserveDate xd;
643
644 // initialize
645 hr = WcaInitialize(hInstall, "ExecXmlConfig");
646 ExitOnFailure(hr, "failed to initialize");
647
648 hr = XmlInitialize();
649 ExitOnFailure(hr, "failed to initialize xml utilities");
650
651 hr = WcaGetProperty( L"CustomActionData", &pwzCustomActionData);
652 ExitOnFailure(hr, "failed to get CustomActionData");
653
654 WcaLog(LOGMSG_TRACEONLY, "CustomActionData: %ls", pwzCustomActionData);
655
656 pwz = pwzCustomActionData;
657
658 hr = WcaReadIntegerFromCaData(&pwz, (int*) &xa);
659 ExitOnFailure(hr, "failed to process CustomActionData");
660
661#ifndef _WIN64
662 // Initialize the Wow64 API - store the result in fWow64APIPresent
663 // If it fails, this doesn't warrant an error yet, because we only need the Wow64 API in some cases
664 WcaInitializeWow64();
665 BOOL fIsWow64Process = WcaIsWow64Process();
666#endif
667
668 if (xaOpenFile != xa && xaOpenFilex64 != xa)
669 {
670 ExitOnFailure(hr = E_INVALIDARG, "invalid custom action data");
671 }
672
673 // loop through all the passed in data
674 while (pwz && *pwz)
675 {
676 hr = WcaReadStringFromCaData(&pwz, &pwzFile);
677 ExitOnFailure(hr, "failed to read file name from custom action data");
678
679 // Default to not preserve date, preserve it if any modifications require us to
680 fPreserveDate = FALSE;
681
682 // Open the file
683 ReleaseNullObject(pixd);
684
685#ifndef _WIN64
686 if (xaOpenFilex64 == xa)
687 {
688 if (!fIsWow64Process)
689 {
690 hr = E_NOTIMPL;
691 ExitOnFailure(hr, "Custom action was told to act on a 64-bit component, but the custom action process is not running in WOW.");
692 }
693
694 hr = WcaDisableWow64FSRedirection();
695 ExitOnFailure(hr, "Custom action was told to act on a 64-bit component, but was unable to disable filesystem redirection through the Wow64 API.");
696
697 fIsFSRedirectDisabled = TRUE;
698 }
699#endif
700
701 hr = XmlLoadDocumentFromFileEx(pwzFile, XML_LOAD_PRESERVE_WHITESPACE, &pixd);
702 if (FAILED(hr))
703 {
704 // Ignore the return code for now. If they try to add something, we'll fail the install. If all they do is remove stuff then it doesn't matter.
705 hrOpenFailure = hr;
706 hr = S_OK;
707 }
708 else
709 {
710 hrOpenFailure = S_OK;
711 }
712
713 WcaLog(LOGMSG_VERBOSE, "Configuring Xml File: %ls", pwzFile);
714
715 while (pwz && *pwz)
716 {
717 // If we skip past an element that has additional changes we need to strip them off the stream before
718 // moving on to the next element. Do that now and then restart the outer loop.
719 if (cAdditionalChanges > 0)
720 {
721 while (cAdditionalChanges > 0)
722 {
723 hr = WcaReadStringFromCaData(&pwz, &pwzName);
724 ExitOnFailure(hr, "failed to process CustomActionData");
725 hr = WcaReadStringFromCaData(&pwz, &pwzValue);
726 ExitOnFailure(hr, "failed to process CustomActionData");
727
728 cAdditionalChanges--;
729 }
730 continue;
731 }
732
733 hr = WcaReadIntegerFromCaData(&pwz, (int*) &xa);
734 ExitOnFailure(hr, "failed to process CustomActionData");
735
736 // Break if we need to move on to a different file
737 if (xaOpenFile == xa || xaOpenFilex64 == xa)
738 {
739 break;
740 }
741
742 hr = WcaReadIntegerFromCaData(&pwz, (int*) &xd);
743 ExitOnFailure(hr, "failed to process CustomActionData");
744
745 if (xdPreserve == xd)
746 {
747 fPreserveDate = TRUE;
748 }
749
750 // Get path, name, and value to be written
751 hr = WcaReadStringFromCaData(&pwz, &pwzElementPath);
752 ExitOnFailure(hr, "failed to process CustomActionData");
753 hr = WcaReadStringFromCaData(&pwz, &pwzVerifyPath);
754 ExitOnFailure(hr, "failed to process CustomActionData");
755 hr = WcaReadStringFromCaData(&pwz, &pwzName);
756 ExitOnFailure(hr, "failed to process CustomActionData");
757 hr = WcaReadStringFromCaData(&pwz, &pwzValue);
758 ExitOnFailure(hr, "failed to process CustomActionData");
759 hr = WcaReadIntegerFromCaData(&pwz, &cAdditionalChanges);
760 ExitOnFailure(hr, "failed to process CustomActionData");
761
762 // If we failed to open the file and we're adding something to the file, we've got a problem. Otherwise, just continue on since the file's already gone.
763 if (FAILED(hrOpenFailure))
764 {
765 if (xaCreateElement == xa || xaWriteValue == xa || xaWriteDocument == xa)
766 {
767 MessageExitOnFailure(hr = hrOpenFailure, msierrXmlConfigFailedOpen, "failed to load XML file: %ls", pwzFile);
768 }
769 else
770 {
771 continue;
772 }
773 }
774
775 // Select the node we're about to modify
776 ReleaseNullObject(pixn);
777
778 hr = XmlSelectSingleNode(pixd, pwzElementPath, &pixn);
779
780 // If we failed to find the node that we are going to add to, we've got a problem. Otherwise, just continue since the node's already gone.
781 if (S_FALSE == hr)
782 {
783 if (xaCreateElement == xa || xaWriteValue == xa || xaWriteDocument == xa)
784 {
785 hr = HRESULT_FROM_WIN32(ERROR_OBJECT_NOT_FOUND);
786 }
787 else
788 {
789 hr = S_OK;
790 continue;
791 }
792 }
793
794 MessageExitOnFailure(hr, msierrXmlConfigFailedSelect, "failed to find node: %ls in XML file: %ls", pwzElementPath, pwzFile);
795
796 // Make the modification
797 switch (xa)
798 {
799 case xaWriteValue:
800 if (pwzName && *pwzName)
801 {
802 // We're setting an attribute
803 hr = XmlSetAttribute(pixn, pwzName, pwzValue);
804 ExitOnFailure(hr, "failed to set attribute: %ls to value %ls", pwzName, pwzValue);
805 }
806 else
807 {
808 // We're setting the text of the node
809 hr = XmlSetText(pixn, pwzValue);
810 ExitOnFailure(hr, "failed to set text to: %ls for element %ls. Make sure that XPath points to an element.", pwzValue, pwzElementPath);
811 }
812 break;
813 case xaWriteDocument:
814 if (NULL != pwzVerifyPath && 0 != pwzVerifyPath[0])
815 {
816 hr = XmlSelectSingleNode(pixn, pwzVerifyPath, &pixnVerify);
817 if (S_OK == hr)
818 {
819 // We found the verify path which means we have no further work to do
820 continue;
821 }
822 ExitOnFailure(hr, "failed to query verify path: %ls", pwzVerifyPath);
823 }
824
825 hr = XmlLoadDocumentEx(pwzValue, XML_LOAD_PRESERVE_WHITESPACE, &pixdNew);
826 ExitOnFailure(hr, "Failed to load value as document.");
827
828 hr = pixdNew->get_documentElement(&pixeNew);
829 ExitOnFailure(hr, "Failed to get document element.");
830
831 hr = pixn->appendChild(pixeNew, NULL);
832 ExitOnFailure(hr, "Failed to append document element on to parent element.");
833
834 ReleaseNullObject(pixeNew);
835 ReleaseNullObject(pixdNew);
836 break;
837
838 case xaCreateElement:
839 if (NULL != pwzVerifyPath && 0 != pwzVerifyPath[0])
840 {
841 hr = XmlSelectSingleNode(pixn, pwzVerifyPath, &pixnVerify);
842 if (S_OK == hr)
843 {
844 // We found the verify path which means we have no further work to do
845 continue;
846 }
847 ExitOnFailure(hr, "failed to query verify path: %ls", pwzVerifyPath);
848 }
849
850 hr = XmlCreateChild(pixn, pwzName, &pixnNewNode);
851 ExitOnFailure(hr, "failed to create child element: %ls", pwzName);
852
853 if (pwzValue && *pwzValue)
854 {
855 hr = XmlSetText(pixnNewNode, pwzValue);
856 ExitOnFailure(hr, "failed to set text to: %ls for node: %ls", pwzValue, pwzName);
857 }
858
859 while (cAdditionalChanges > 0)
860 {
861 hr = WcaReadStringFromCaData(&pwz, &pwzName);
862 ExitOnFailure(hr, "failed to process CustomActionData");
863 hr = WcaReadStringFromCaData(&pwz, &pwzValue);
864 ExitOnFailure(hr, "failed to process CustomActionData");
865
866 // Set the additional attribute
867 hr = XmlSetAttribute(pixnNewNode, pwzName, pwzValue);
868 ExitOnFailure(hr, "failed to set attribute: %ls to value %ls", pwzName, pwzValue);
869
870 cAdditionalChanges--;
871 }
872
873 ReleaseNullObject(pixnNewNode);
874 break;
875 case xaDeleteValue:
876 if (pwzName && *pwzName)
877 {
878 // Delete the attribute
879 hr = XmlRemoveAttribute(pixn, pwzName);
880 ExitOnFailure(hr, "failed to remove attribute: %ls", pwzName);
881 }
882 else
883 {
884 // Clear the text value for the node
885 hr = XmlSetText(pixn, L"");
886 ExitOnFailure(hr, "failed to clear text value");
887 }
888 break;
889 case xaDeleteElement:
890 if (NULL != pwzVerifyPath && 0 != pwzVerifyPath[0])
891 {
892 hr = XmlSelectSingleNode(pixn, pwzVerifyPath, &pixnVerify);
893 if (S_OK == hr)
894 {
895 hr = pixn->removeChild(pixnVerify, &pixnRemovedChild);
896 ExitOnFailure(hr, "failed to remove created child element");
897
898 ReleaseNullObject(pixnRemovedChild);
899 }
900 else
901 {
902 WcaLog(LOGMSG_VERBOSE, "Failed to select path %ls for deleting. Skipping...", pwzVerifyPath);
903 hr = S_OK;
904 }
905 }
906 else
907 {
908 // TODO: This requires a VerifyPath to delete an element. Should we support not having one?
909 WcaLog(LOGMSG_VERBOSE, "No VerifyPath specified for delete element of ID: %ls", pwzElementPath);
910 }
911 break;
912 default:
913 ExitOnFailure(hr = E_UNEXPECTED, "Invalid modification specified in custom action data");
914 break;
915 }
916 }
917
918
919 // Now that we've made all of the changes to this file, save it and move on to the next
920 if (S_OK == hrOpenFailure)
921 {
922 if (fPreserveDate)
923 {
924 hr = FileGetTime(pwzFile, NULL, NULL, &ft);
925 ExitOnFailure(hr, "failed to get modified time of file : %ls", pwzFile);
926 }
927
928 int iSaveAttempt = 0;
929
930 do
931 {
932 hr = XmlSaveDocument(pixd, pwzFile);
933 if (FAILED(hr))
934 {
935 id = WcaErrorMessage(msierrXmlConfigFailedSave, hr, INSTALLMESSAGE_ERROR | MB_ABORTRETRYIGNORE, 1, pwzFile);
936 switch (id)
937 {
938 case IDABORT:
939 ExitOnFailure(hr, "Failed to save changes to XML file: %ls", pwzFile);
940 case IDRETRY:
941 hr = S_FALSE; // hit me, baby, one more time
942 break;
943 case IDIGNORE:
944 hr = S_OK; // pretend everything is okay and bail
945 break;
946 case 0: // No UI case, MsiProcessMessage returns 0
947 if (STIERR_SHARING_VIOLATION == hr)
948 {
949 // Only in case of sharing violation do we retry 30 times, once a second.
950 if (iSaveAttempt < 30)
951 {
952 hr = S_FALSE;
953 ++iSaveAttempt;
954 WcaLog(LOGMSG_VERBOSE, "Unable to save changes to XML file: %ls, retry attempt: %x", pwzFile, iSaveAttempt);
955 Sleep(1000);
956 }
957 else
958 {
959 ExitOnFailure(hr, "Failed to save changes to XML file: %ls", pwzFile);
960 }
961 }
962 break;
963 default: // Unknown error
964 ExitOnFailure(hr, "Failed to save changes to XML file: %ls", pwzFile);
965 }
966 }
967 } while (S_FALSE == hr);
968
969 if (fPreserveDate)
970 {
971 hr = FileSetTime(pwzFile, NULL, NULL, &ft);
972 ExitOnFailure(hr, "failed to set modified time of file : %ls", pwzFile);
973 }
974
975#ifndef _WIN64
976 if (fIsFSRedirectDisabled)
977 {
978 fIsFSRedirectDisabled = FALSE;
979 WcaRevertWow64FSRedirection();
980 }
981#endif
982 }
983 }
984
985LExit:
986#ifndef _WIN64
987 // Make sure we revert FS Redirection if necessary before exiting
988 if (fIsFSRedirectDisabled)
989 {
990 fIsFSRedirectDisabled = FALSE;
991 WcaRevertWow64FSRedirection();
992 }
993 WcaFinalizeWow64();
994#endif
995
996 ReleaseStr(pwzCustomActionData);
997 ReleaseStr(pwzData);
998 ReleaseStr(pwzFile);
999 ReleaseStr(pwzElementPath);
1000 ReleaseStr(pwzVerifyPath);
1001 ReleaseStr(pwzName);
1002 ReleaseStr(pwzValue);
1003
1004 ReleaseObject(pixeNew);
1005 ReleaseObject(pixdNew);
1006
1007 ReleaseObject(pixn);
1008 ReleaseObject(pixd);
1009 ReleaseObject(pixnNewNode);
1010 ReleaseObject(pixnRemovedChild);
1011
1012 XmlUninitialize();
1013
1014 if (FAILED(hr))
1015 {
1016 er = ERROR_INSTALL_FAILURE;
1017 }
1018 return WcaFinalize(er);
1019}
1020
1021
1022/******************************************************************
1023 ExecXmlConfigRollback - entry point for XmlConfig rollback Custom Action
1024
1025*******************************************************************/
1026extern "C" UINT __stdcall ExecXmlConfigRollback(
1027 __in MSIHANDLE hInstall
1028 )
1029{
1030// AssertSz(FALSE, "debug ExecXmlConfigRollback");
1031 HRESULT hr = S_OK;
1032 UINT er = ERROR_SUCCESS;
1033
1034 int iIs64Bit;
1035#ifndef _WIN64
1036 BOOL fIs64Bit = FALSE;
1037#endif
1038
1039 LPWSTR pwzCustomActionData = NULL;
1040 LPWSTR pwz = NULL;
1041 LPWSTR pwzFileName = NULL;
1042 LPBYTE pbData = NULL;
1043 DWORD_PTR cbData = 0;
1044
1045 FILETIME ft;
1046
1047 HANDLE hFile = INVALID_HANDLE_VALUE;
1048
1049 // initialize
1050 hr = WcaInitialize(hInstall, "ExecXmlConfigRollback");
1051 ExitOnFailure(hr, "failed to initialize");
1052
1053
1054 hr = WcaGetProperty( L"CustomActionData", &pwzCustomActionData);
1055 ExitOnFailure(hr, "failed to get CustomActionData");
1056
1057 WcaLog(LOGMSG_TRACEONLY, "CustomActionData: %ls", pwzCustomActionData);
1058
1059 pwz = pwzCustomActionData;
1060
1061 hr = WcaReadIntegerFromCaData(&pwz, &iIs64Bit);
1062 ExitOnFailure(hr, "failed to read component bitness from custom action data");
1063
1064 hr = WcaReadStringFromCaData(&pwz, &pwzFileName);
1065 ExitOnFailure(hr, "failed to read file name from custom action data");
1066
1067 hr = WcaReadStreamFromCaData(&pwz, &pbData, &cbData);
1068 ExitOnFailure(hr, "failed to read file contents from custom action data");
1069
1070#ifndef _WIN64
1071 fIs64Bit = (BOOL)iIs64Bit;
1072
1073 if (fIs64Bit)
1074 {
1075 hr = WcaInitializeWow64();
1076 if (S_FALSE == hr)
1077 {
1078 hr = TYPE_E_DLLFUNCTIONNOTFOUND;
1079 }
1080 ExitOnFailure(hr, "failed to initialize Wow64 API");
1081
1082 if (!WcaIsWow64Process())
1083 {
1084 hr = E_NOTIMPL;
1085 ExitOnFailure(hr, "Custom action was told to rollback a 64-bit component, but the Wow64 API is unavailable.");
1086 }
1087
1088 hr = WcaDisableWow64FSRedirection();
1089 ExitOnFailure(hr, "Custom action was told to rollback a 64-bit component, but was unable to Disable Filesystem Redirection through the Wow64 API.");
1090 }
1091#endif
1092
1093 hr = FileGetTime(pwzFileName, NULL, NULL, &ft);
1094 ExitOnFailure(hr, "Failed to get modified date of file %ls.", pwzFileName);
1095
1096 // Open the file
1097 hFile = ::CreateFileW(pwzFileName, GENERIC_WRITE, NULL, NULL, TRUNCATE_EXISTING, NULL, NULL);
1098 ExitOnInvalidHandleWithLastError(hFile, hr, "failed to open file: %ls", pwzFileName);
1099
1100 // Write out the old data
1101 hr = FileWriteHandle(hFile, pbData, cbData);
1102 ExitOnFailure(hr, "failed to write to file: %ls", pwzFileName);
1103
1104 ReleaseFile(hFile);
1105
1106 hr = FileSetTime(pwzFileName, NULL, NULL, &ft);
1107 ExitOnFailure(hr, "Failed to set modified date of file %ls.", pwzFileName);
1108
1109LExit:
1110 ReleaseStr(pwzCustomActionData);
1111 ReleaseStr(pwzFileName);
1112
1113 ReleaseFile(hFile);
1114
1115#ifndef _WIN64
1116 if (fIs64Bit)
1117 {
1118 WcaRevertWow64FSRedirection();
1119 WcaFinalizeWow64();
1120 }
1121#endif
1122
1123 ReleaseMem(pbData);
1124
1125 if (FAILED(hr))
1126 {
1127 er = ERROR_INSTALL_FAILURE;
1128 }
1129 return WcaFinalize(er);
1130}
diff --git a/src/ext/Util/ca/XmlFile.cpp b/src/ext/Util/ca/XmlFile.cpp
new file mode 100644
index 00000000..04a4ae98
--- /dev/null
+++ b/src/ext/Util/ca/XmlFile.cpp
@@ -0,0 +1,940 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3#include "precomp.h"
4
5#define XMLFILE_CREATE_ELEMENT 0x00000001
6#define XMLFILE_DELETE_VALUE 0x00000002
7#define XMLFILE_BULKWRITE_VALUE 0x00000004
8
9#define XMLFILE_DONT_UNINSTALL 0x00010000
10#define XMLFILE_PRESERVE_MODIFIED 0x00001000
11#define XMLFILE_USE_XPATH 0x00000100
12
13extern BOOL vfMsxml30;
14
15enum eXmlAction
16{
17 xaOpenFile = 1,
18 xaOpenFilex64,
19 xaWriteValue,
20 xaDeleteValue,
21 xaCreateElement,
22 xaDeleteElement,
23 xaBulkWriteValue,
24};
25
26enum eXmlPreserveDate
27{
28 xdDontPreserve = 0,
29 xdPreserve
30};
31
32enum eXmlSelectionLanguage
33{
34 xsXSLPattern = 0,
35 xsXPath = 1,
36};
37
38LPCWSTR vcsXmlFileQuery =
39 L"SELECT `Wix4XmlFile`.`Wix4XmlFile`, `Wix4XmlFile`.`File`, `Wix4XmlFile`.`ElementPath`, `Wix4XmlFile`.`Name`, `Wix4XmlFile`.`Value`, "
40 L"`Wix4XmlFile`.`Flags`, `Wix4XmlFile`.`Component_`, `Component`.`Attributes` "
41 L"FROM `Wix4XmlFile`,`Component` WHERE `Wix4XmlFile`.`Component_`=`Component`.`Component` ORDER BY `File`, `Sequence`";
42enum eXmlFileQuery { xfqXmlFile = 1, xfqFile, xfqXPath, xfqName, xfqValue, xfqXmlFlags, xfqComponent, xfqCompAttributes };
43
44struct XML_FILE_CHANGE
45{
46 WCHAR wzId[MAX_DARWIN_KEY];
47
48 INSTALLSTATE isInstalled;
49 INSTALLSTATE isAction;
50
51 WCHAR wzFile[MAX_PATH];
52 LPWSTR pwzElementPath;
53 WCHAR wzName[MAX_DARWIN_COLUMN];
54 LPWSTR pwzValue;
55
56 int iXmlFlags;
57 int iCompAttributes;
58
59 XML_FILE_CHANGE* pxfcPrev;
60 XML_FILE_CHANGE* pxfcNext;
61};
62
63//static HRESULT FreeXmlFileChangeList(
64// __in XML_FILE_CHANGE* pxfcList
65// )
66//{
67// HRESULT hr = S_OK;
68//
69// XML_FILE_CHANGE* pxfcDelete;
70// while(pxfcList)
71// {
72// pxfcDelete = pxfcList;
73// pxfcList = pxfcList->pxfcNext;
74//
75// ReleaseStr(pxfcDelete->pwzElementPath);
76// ReleaseStr(pxfcDelete->pwzValue);
77//
78// hr = MemFree(pxfcDelete);
79// ExitOnFailure(hr, "failed to free xml file change list item");
80// }
81//
82//LExit:
83// return hr;
84//}
85
86static HRESULT AddXmlFileChangeToList(
87 __inout XML_FILE_CHANGE** ppxfcHead,
88 __inout XML_FILE_CHANGE** ppxfcTail
89 )
90{
91 Assert(ppxfcHead && ppxfcTail);
92
93 HRESULT hr = S_OK;
94
95 XML_FILE_CHANGE* pxfc = static_cast<XML_FILE_CHANGE*>(MemAlloc(sizeof(XML_FILE_CHANGE), TRUE));
96 ExitOnNull(pxfc, hr, E_OUTOFMEMORY, "failed to allocate memory for new xml file change list element");
97
98 // Add it to the end of the list
99 if (NULL == *ppxfcHead)
100 {
101 *ppxfcHead = pxfc;
102 *ppxfcTail = pxfc;
103 }
104 else
105 {
106 Assert(*ppxfcTail && (*ppxfcTail)->pxfcNext == NULL);
107 (*ppxfcTail)->pxfcNext = pxfc;
108 pxfc->pxfcPrev = *ppxfcTail;
109 *ppxfcTail = pxfc;
110 }
111
112LExit:
113 return hr;
114}
115
116
117static HRESULT ReadXmlFileTable(
118 __inout XML_FILE_CHANGE** ppxfcHead,
119 __inout XML_FILE_CHANGE** ppxfcTail
120 )
121{
122 Assert(ppxfcHead && ppxfcTail);
123
124 HRESULT hr = S_OK;
125 UINT er = ERROR_SUCCESS;
126
127 PMSIHANDLE hView = NULL;
128 PMSIHANDLE hRec = NULL;
129
130 LPWSTR pwzData = NULL;
131
132 // check to see if necessary tables are specified
133 if (S_FALSE == WcaTableExists(L"Wix4XmlFile"))
134 {
135 ExitFunction1(hr = S_FALSE);
136 }
137
138 // loop through all the xml configurations
139 hr = WcaOpenExecuteView(vcsXmlFileQuery, &hView);
140 ExitOnFailure(hr, "failed to open view on Wix4XmlFile table");
141
142 while (S_OK == (hr = WcaFetchRecord(hView, &hRec)))
143 {
144 hr = AddXmlFileChangeToList(ppxfcHead, ppxfcTail);
145 ExitOnFailure(hr, "failed to add xml file change to list");
146
147 // Get record Id
148 hr = WcaGetRecordString(hRec, xfqXmlFile, &pwzData);
149 ExitOnFailure(hr, "failed to get Wix4XmlFile record Id");
150 hr = StringCchCopyW((*ppxfcTail)->wzId, countof((*ppxfcTail)->wzId), pwzData);
151 ExitOnFailure(hr, "failed to copy Wix4XmlFile record Id");
152
153 // Get component name
154 hr = WcaGetRecordString(hRec, xfqComponent, &pwzData);
155 ExitOnFailure(hr, "failed to get component name for Wix4XmlFile: %ls", (*ppxfcTail)->wzId);
156
157 // Get the component's state
158 er = ::MsiGetComponentStateW(WcaGetInstallHandle(), pwzData, &(*ppxfcTail)->isInstalled, &(*ppxfcTail)->isAction);
159 ExitOnFailure(hr = HRESULT_FROM_WIN32(er), "failed to get install state for Component: %ls", pwzData);
160
161 // Get the xml file
162 hr = WcaGetRecordFormattedString(hRec, xfqFile, &pwzData);
163 ExitOnFailure(hr, "failed to get xml file for Wix4XmlFile: %ls", (*ppxfcTail)->wzId);
164 hr = StringCchCopyW((*ppxfcTail)->wzFile, countof((*ppxfcTail)->wzFile), pwzData);
165 ExitOnFailure(hr, "failed to copy xml file path");
166
167 // Get the Wix4XmlFile table flags
168 hr = WcaGetRecordInteger(hRec, xfqXmlFlags, &(*ppxfcTail)->iXmlFlags);
169 ExitOnFailure(hr, "failed to get Wix4XmlFile flags for Wix4XmlFile: %ls", (*ppxfcTail)->wzId);
170
171 // Get the XPath
172 hr = WcaGetRecordFormattedString(hRec, xfqXPath, &(*ppxfcTail)->pwzElementPath);
173 ExitOnFailure(hr, "failed to get XPath for Wix4XmlFile: %ls", (*ppxfcTail)->wzId);
174
175 // Get the name
176 hr = WcaGetRecordFormattedString(hRec, xfqName, &pwzData);
177 ExitOnFailure(hr, "failed to get Name for Wix4XmlFile: %ls", (*ppxfcTail)->wzId);
178 hr = StringCchCopyW((*ppxfcTail)->wzName, countof((*ppxfcTail)->wzName), pwzData);
179 ExitOnFailure(hr, "failed to copy name of element");
180
181 // Get the value
182 hr = WcaGetRecordFormattedString(hRec, xfqValue, &pwzData);
183 ExitOnFailure(hr, "failed to get Value for Wix4XmlFile: %ls", (*ppxfcTail)->wzId);
184 hr = StrAllocString(&(*ppxfcTail)->pwzValue, pwzData, 0);
185 ExitOnFailure(hr, "failed to allocate buffer for value");
186
187 // Get the component attributes
188 hr = WcaGetRecordInteger(hRec, xfqCompAttributes, &(*ppxfcTail)->iCompAttributes);
189 ExitOnFailure(hr, "failed to get component attributes for Wix4XmlFile: %ls", (*ppxfcTail)->wzId);
190 }
191
192 // if we looped through all records all is well
193 if (E_NOMOREITEMS == hr)
194 hr = S_OK;
195 ExitOnFailure(hr, "failed while looping through all objects to secure");
196
197LExit:
198 ReleaseStr(pwzData);
199
200 return hr;
201}
202
203
204static HRESULT BeginChangeFile(
205 __in LPCWSTR pwzFile,
206 __in XML_FILE_CHANGE* pxfc,
207 __inout LPWSTR* ppwzCustomActionData
208 )
209{
210 Assert(pwzFile && *pwzFile && ppwzCustomActionData);
211
212 HRESULT hr = S_OK;
213 BOOL fIs64Bit = pxfc->iCompAttributes & msidbComponentAttributes64bit;
214 BOOL fUseXPath = pxfc->iXmlFlags & XMLFILE_USE_XPATH;
215 LPBYTE pbData = NULL;
216 SIZE_T cbData = 0;
217
218 LPWSTR pwzRollbackCustomActionData = NULL;
219
220 if (fIs64Bit)
221 {
222 hr = WcaWriteIntegerToCaData((int)xaOpenFilex64, ppwzCustomActionData);
223 ExitOnFailure(hr, "failed to write 64-bit file indicator to custom action data");
224 }
225 else
226 {
227 hr = WcaWriteIntegerToCaData((int)xaOpenFile, ppwzCustomActionData);
228 ExitOnFailure(hr, "failed to write file indicator to custom action data");
229 }
230 if (fUseXPath)
231 {
232 hr = WcaWriteIntegerToCaData((int)xsXPath, ppwzCustomActionData);
233 ExitOnFailure(hr, "failed to write XPath selectionlanguage indicator to custom action data");
234 }
235 else
236 {
237 hr = WcaWriteIntegerToCaData((int)xsXSLPattern, ppwzCustomActionData);
238 ExitOnFailure(hr, "failed to write XSLPattern selectionlanguage indicator to custom action data");
239 }
240 hr = WcaWriteStringToCaData(pwzFile, ppwzCustomActionData);
241 ExitOnFailure(hr, "failed to write file to custom action data: %ls", pwzFile);
242
243 // If the file already exits, then we have to put it back the way it was on failure
244 if (FileExistsEx(pwzFile, NULL))
245 {
246 hr = FileRead(&pbData, &cbData, pwzFile);
247 ExitOnFailure(hr, "failed to read file: %ls", pwzFile);
248
249 // Set up the rollback for this file
250 hr = WcaWriteIntegerToCaData((int)fIs64Bit, &pwzRollbackCustomActionData);
251 ExitOnFailure(hr, "failed to write component bitness to rollback custom action data");
252
253 hr = WcaWriteStringToCaData(pwzFile, &pwzRollbackCustomActionData);
254 ExitOnFailure(hr, "failed to write file name to rollback custom action data: %ls", pwzFile);
255
256 hr = WcaWriteStreamToCaData(pbData, cbData, &pwzRollbackCustomActionData);
257 ExitOnFailure(hr, "failed to write file contents to rollback custom action data.");
258
259 hr = WcaDoDeferredAction(CUSTOM_ACTION_DECORATION(L"ExecXmlFileRollback"), pwzRollbackCustomActionData, COST_XMLFILE);
260 ExitOnFailure(hr, "failed to schedule ExecXmlFileRollback for file: %ls", pwzFile);
261
262 ReleaseStr(pwzRollbackCustomActionData);
263 }
264LExit:
265 ReleaseMem(pbData);
266
267 return hr;
268}
269
270
271static HRESULT WriteChangeData(
272 __in XML_FILE_CHANGE* pxfc,
273 __inout LPWSTR* ppwzCustomActionData
274 )
275{
276 Assert(pxfc && ppwzCustomActionData);
277
278 HRESULT hr = S_OK;
279
280 hr = WcaWriteStringToCaData(pxfc->pwzElementPath, ppwzCustomActionData);
281 ExitOnFailure(hr, "failed to write ElementPath to custom action data: %ls", pxfc->pwzElementPath);
282
283 hr = WcaWriteStringToCaData(pxfc->wzName, ppwzCustomActionData);
284 ExitOnFailure(hr, "failed to write Name to custom action data: %ls", pxfc->wzName);
285
286 hr = WcaWriteStringToCaData(pxfc->pwzValue, ppwzCustomActionData);
287 ExitOnFailure(hr, "failed to write Value to custom action data: %ls", pxfc->pwzValue);
288
289LExit:
290 return hr;
291}
292
293
294/******************************************************************
295 SchedXmlFile - entry point for XmlFile Custom Action
296
297********************************************************************/
298extern "C" UINT __stdcall SchedXmlFile(
299 __in MSIHANDLE hInstall
300 )
301{
302// AssertSz(FALSE, "debug SchedXmlFile");
303
304 HRESULT hr = S_OK;
305 UINT er = ERROR_SUCCESS;
306
307 LPWSTR pwzCurrentFile = NULL;
308 BOOL fCurrentFileChanged = FALSE;
309 BOOL fCurrentUseXPath = FALSE;
310
311 PMSIHANDLE hView = NULL;
312 PMSIHANDLE hRec = NULL;
313
314 XML_FILE_CHANGE* pxfcHead = NULL;
315 XML_FILE_CHANGE* pxfcTail = NULL;
316 XML_FILE_CHANGE* pxfc = NULL;
317 XML_FILE_CHANGE* pxfcUninstall = NULL;
318
319 LPWSTR pwzCustomActionData = NULL;
320
321 DWORD cFiles = 0;
322
323 // initialize
324 hr = WcaInitialize(hInstall, "SchedXmlFile");
325 ExitOnFailure(hr, "failed to initialize");
326
327 hr = ReadXmlFileTable(&pxfcHead, &pxfcTail);
328 if (S_FALSE == hr)
329 {
330 WcaLog(LOGMSG_VERBOSE, "Skipping SchedXmlFile because Wix4XmlFile table not present");
331 ExitFunction1(hr = S_OK);
332 }
333
334 MessageExitOnFailure(hr, msierrXmlFileFailedRead, "failed to read Wix4XmlFile table");
335
336 // loop through all the xml configurations
337 for (pxfc = pxfcHead; pxfc; pxfc = pxfc->pxfcNext)
338 {
339 // If this is the first file, a different file, the last file, or the SelectionLanguage property changes...
340 if (NULL == pwzCurrentFile || 0 != lstrcmpW(pwzCurrentFile, pxfc->wzFile) || NULL == pxfc->pxfcNext || fCurrentUseXPath != ((XMLFILE_USE_XPATH & pxfc->iXmlFlags)))
341 {
342 // If this isn't the first file
343 if (NULL != pwzCurrentFile)
344 {
345 // Do the uninstall work for the current file by walking backwards through the list (so the sequence is reversed)
346 for (pxfcUninstall = ((NULL != pxfc->pxfcNext) ? pxfc->pxfcPrev : pxfc); pxfcUninstall && 0 == lstrcmpW(pwzCurrentFile, pxfcUninstall->wzFile) && fCurrentUseXPath == ((XMLFILE_USE_XPATH & pxfcUninstall->iXmlFlags)); pxfcUninstall = pxfcUninstall->pxfcPrev)
347 {
348 // If it's being uninstalled
349 if (WcaIsUninstalling(pxfcUninstall->isInstalled, pxfcUninstall->isAction))
350 {
351 // Uninstall the change
352 if (!(XMLFILE_DONT_UNINSTALL & pxfcUninstall->iXmlFlags))
353 {
354 if (!fCurrentFileChanged)
355 {
356 hr = BeginChangeFile(pwzCurrentFile, pxfcUninstall, &pwzCustomActionData);
357 ExitOnFailure(hr, "failed to begin file change for file: %ls", pwzCurrentFile);
358
359 fCurrentFileChanged = TRUE;
360 ++cFiles;
361 }
362 if (XMLFILE_CREATE_ELEMENT & pxfcUninstall->iXmlFlags)
363 {
364 hr = WcaWriteIntegerToCaData((int)xaDeleteElement, &pwzCustomActionData);
365 ExitOnFailure(hr, "failed to write delete element action indicator to custom action data");
366 }
367 else
368 {
369 hr = WcaWriteIntegerToCaData((int)xaDeleteValue, &pwzCustomActionData);
370 ExitOnFailure(hr, "failed to write delete value action indicator to custom action data");
371 }
372
373 if (XMLFILE_PRESERVE_MODIFIED & pxfc->iXmlFlags)
374 {
375 hr = WcaWriteIntegerToCaData((int)xdPreserve, &pwzCustomActionData);
376 ExitOnFailure(hr, "failed to write Preserve Date indicator to custom action data");
377 }
378 else
379 {
380 hr = WcaWriteIntegerToCaData((int)xdDontPreserve, &pwzCustomActionData);
381 ExitOnFailure(hr, "failed to write Don't Preserve Date indicator to custom action data");
382 }
383
384 hr = WriteChangeData(pxfcUninstall, &pwzCustomActionData);
385 ExitOnFailure(hr, "failed to write uninstall change data");
386 }
387 }
388 }
389 }
390
391 // Remember the file we're currently working on
392 hr = StrAllocString(&pwzCurrentFile, pxfc->wzFile, 0);
393 ExitOnFailure(hr, "failed to copy file name");
394 fCurrentUseXPath = (XMLFILE_USE_XPATH & pxfc->iXmlFlags);
395
396 // We haven't changed the current file yet
397 fCurrentFileChanged = FALSE;
398 }
399
400 // If it's being installed
401 if (WcaIsInstalling(pxfc->isInstalled, pxfc->isAction))
402 {
403 if (!fCurrentFileChanged)
404 {
405 hr = BeginChangeFile(pwzCurrentFile, pxfc, &pwzCustomActionData);
406 ExitOnFailure(hr, "failed to begin file change for file: %ls", pwzCurrentFile);
407 fCurrentFileChanged = TRUE;
408 ++cFiles;
409 }
410
411 // Install the change
412 if (XMLFILE_CREATE_ELEMENT & pxfc->iXmlFlags)
413 {
414 hr = WcaWriteIntegerToCaData((int)xaCreateElement, &pwzCustomActionData);
415 ExitOnFailure(hr, "failed to write create element action indicator to custom action data");
416 }
417 else if (XMLFILE_DELETE_VALUE & pxfc->iXmlFlags)
418 {
419 hr = WcaWriteIntegerToCaData((int)xaDeleteValue, &pwzCustomActionData);
420 ExitOnFailure(hr, "failed to write delete value action indicator to custom action data");
421 }
422 else if (XMLFILE_BULKWRITE_VALUE & pxfc->iXmlFlags)
423 {
424 hr = WcaWriteIntegerToCaData((int)xaBulkWriteValue, &pwzCustomActionData);
425 ExitOnFailure(hr, "failed to write builkwrite value action indicator to custom action data");
426 }
427 else
428 {
429 hr = WcaWriteIntegerToCaData((int)xaWriteValue, &pwzCustomActionData);
430 ExitOnFailure(hr, "failed to write file indicator to custom action data");
431 }
432
433 if (XMLFILE_PRESERVE_MODIFIED & pxfc->iXmlFlags)
434 {
435 hr = WcaWriteIntegerToCaData((int)xdPreserve, &pwzCustomActionData);
436 ExitOnFailure(hr, "failed to write Preserve Date indicator to custom action data");
437 }
438 else
439 {
440 hr = WcaWriteIntegerToCaData((int)xdDontPreserve, &pwzCustomActionData);
441 ExitOnFailure(hr, "failed to write Don't Preserve Date indicator to custom action data");
442 }
443
444 hr = WriteChangeData(pxfc, &pwzCustomActionData);
445 ExitOnFailure(hr, "failed to write change data");
446 }
447 }
448
449 // If we looped through all records all is well
450 if (E_NOMOREITEMS == hr)
451 hr = S_OK;
452 ExitOnFailure(hr, "failed while looping through all objects to secure");
453
454 // Schedule the custom action and add to progress bar
455 if (pwzCustomActionData && *pwzCustomActionData)
456 {
457 Assert(0 < cFiles);
458
459 hr = WcaDoDeferredAction(CUSTOM_ACTION_DECORATION(L"ExecXmlFile"), pwzCustomActionData, cFiles * COST_XMLFILE);
460 ExitOnFailure(hr, "failed to schedule ExecXmlFile action");
461 }
462
463LExit:
464 ReleaseStr(pwzCurrentFile);
465 ReleaseStr(pwzCustomActionData);
466
467 return WcaFinalize(FAILED(hr) ? ERROR_INSTALL_FAILURE : er);
468}
469
470
471/******************************************************************
472 ExecXmlFile - entry point for XmlFile Custom Action
473
474*******************************************************************/
475extern "C" UINT __stdcall ExecXmlFile(
476 __in MSIHANDLE hInstall
477 )
478{
479// AssertSz(FALSE, "debug ExecXmlFile");
480 HRESULT hr = S_OK;
481 HRESULT hrOpenFailure = S_OK;
482 UINT er = ERROR_SUCCESS;
483
484 BOOL fIsFSRedirectDisabled = FALSE;
485 BOOL fPreserveDate = FALSE;
486
487 int id = IDRETRY;
488
489 LPWSTR pwzCustomActionData = NULL;
490 LPWSTR pwzData = NULL;
491 LPWSTR pwzFile = NULL;
492 LPWSTR pwzXPath = NULL;
493 LPWSTR pwzName = NULL;
494 LPWSTR pwzValue = NULL;
495 LPWSTR pwz = NULL;
496
497 IXMLDOMDocument* pixd = NULL;
498 IXMLDOMNode* pixn = NULL;
499 IXMLDOMNode* pixnNewNode = NULL;
500 IXMLDOMNodeList* pixNodes = NULL;
501 IXMLDOMDocument2 *pixdDocument2 = NULL;
502
503 FILETIME ft;
504
505 BSTR bstrProperty = ::SysAllocString(L"SelectionLanguage");
506 ExitOnNull(bstrProperty, hr, E_OUTOFMEMORY, "failed SysAllocString");
507 VARIANT varValue;
508 ::VariantInit(&varValue);
509 varValue.vt = VT_BSTR;
510 varValue.bstrVal = ::SysAllocString(L"XPath");
511 ExitOnNull(varValue.bstrVal, hr, E_OUTOFMEMORY, "failed SysAllocString");
512 eXmlAction xa;
513 eXmlPreserveDate xd;
514 eXmlSelectionLanguage xl;
515
516 // initialize
517 hr = WcaInitialize(hInstall, "ExecXmlFile");
518 ExitOnFailure(hr, "failed to initialize");
519
520 hr = XmlInitialize();
521 ExitOnFailure(hr, "failed to initialize xml utilities");
522
523 hr = WcaGetProperty( L"CustomActionData", &pwzCustomActionData);
524 ExitOnFailure(hr, "failed to get CustomActionData");
525
526 WcaLog(LOGMSG_TRACEONLY, "CustomActionData: %ls", pwzCustomActionData);
527
528 pwz = pwzCustomActionData;
529
530 hr = WcaReadIntegerFromCaData(&pwz, (int*) &xa);
531 ExitOnFailure(hr, "failed to process CustomActionData");
532
533#ifndef _WIN64
534 // Initialize the Wow64 API - store the result in fWow64APIPresent
535 // If it fails, this doesn't warrant an error yet, because we only need the Wow64 API in some cases
536 WcaInitializeWow64();
537 BOOL fIsWow64Process = WcaIsWow64Process();
538#endif
539
540 if (xaOpenFile != xa && xaOpenFilex64 != xa)
541 ExitOnFailure(hr = E_INVALIDARG, "invalid custom action data");
542
543 // loop through all the passed in data
544 while (pwz && *pwz)
545 {
546 hr = WcaReadIntegerFromCaData(&pwz, (int*) &xl);
547 ExitOnFailure(hr, "failed to process CustomActionData");
548
549 hr = WcaReadStringFromCaData(&pwz, &pwzFile);
550 ExitOnFailure(hr, "failed to read file name from custom action data");
551
552 // Default to not preserve the modified date
553 fPreserveDate = FALSE;
554
555 // Open the file
556 ReleaseNullObject(pixd);
557
558 if (xaOpenFilex64 == xa)
559 {
560#ifndef _WIN64
561 if (!fIsWow64Process)
562 {
563 hr = E_NOTIMPL;
564 ExitOnFailure(hr, "Custom action was told to act on a 64-bit component, but the custom action process is not running in WOW.");
565 }
566
567 hr = WcaDisableWow64FSRedirection();
568 ExitOnFailure(hr, "Custom action was told to act on a 64-bit component, but was unable to disable filesystem redirection through the Wow64 API.");
569
570 fIsFSRedirectDisabled = TRUE;
571#endif
572 }
573
574 hr = XmlLoadDocumentFromFileEx(pwzFile, XML_LOAD_PRESERVE_WHITESPACE, &pixd);
575 if (FAILED(hr))
576 {
577 // Ignore the return code for now. If they try to add something, we'll fail the install. If all they do is remove stuff then it doesn't matter.
578 hrOpenFailure = hr;
579 hr = S_OK;
580 }
581 else
582 {
583 hrOpenFailure = S_OK;
584 }
585 WcaLog(LOGMSG_VERBOSE, "Configuring Xml File: %ls", pwzFile);
586
587 if (xsXPath == xl)
588 {
589 if (vfMsxml30)
590 {
591 // If we failed to open the file, don't fail immediately; just skip setting the selection language, and we'll fail later if appropriate
592 if (SUCCEEDED(hrOpenFailure))
593 {
594 hr = pixd->QueryInterface(XmlUtil_IID_IXMLDOMDocument2, (void**)&pixdDocument2);
595 ExitOnFailure(hr, "failed in querying IXMLDOMDocument2 interface");
596 hr = pixdDocument2->setProperty(bstrProperty, varValue);
597 ExitOnFailure(hr, "failed in setting SelectionLanguage");
598 }
599 }
600 else
601 {
602 ExitOnFailure(hr = E_NOTIMPL, "Error: current MSXML version does not support xpath query.");
603 }
604 }
605
606 while (pwz && *pwz)
607 {
608 hr = WcaReadIntegerFromCaData(&pwz, (int*) &xa);
609 ExitOnFailure(hr, "failed to process CustomActionData");
610
611 // Break if we need to move on to a different file
612 if (xaOpenFile == xa || xaOpenFilex64 == xa)
613 break;
614
615 hr = WcaReadIntegerFromCaData(&pwz, (int*) &xd);
616 ExitOnFailure(hr, "failed to process CustomActionData");
617
618 if (xdPreserve == xd)
619 {
620 fPreserveDate = TRUE;
621 }
622
623 // Get path, name, and value to be written
624 hr = WcaReadStringFromCaData(&pwz, &pwzXPath);
625 ExitOnFailure(hr, "failed to process CustomActionData");
626 hr = WcaReadStringFromCaData(&pwz, &pwzName);
627 ExitOnFailure(hr, "failed to process CustomActionData");
628 hr = WcaReadStringFromCaData(&pwz, &pwzValue);
629 ExitOnFailure(hr, "failed to process CustomActionData");
630
631 // If we failed to open the file and we're adding something to the file, we've got a problem. Otherwise, just continue on since the file's already gone.
632 if (FAILED(hrOpenFailure))
633 {
634 if (xaCreateElement == xa || xaWriteValue == xa || xaBulkWriteValue == xa)
635 {
636 MessageExitOnFailure(hr = hrOpenFailure, msierrXmlFileFailedOpen, "failed to load XML file: %ls", pwzFile);
637 }
638 else
639 {
640 continue;
641 }
642 }
643
644 // Select the node we're about to modify
645 ReleaseNullObject(pixn);
646
647 if (xaBulkWriteValue == xa)
648 {
649 hr = XmlSelectNodes(pixd, pwzXPath, &pixNodes);
650 if (S_FALSE == hr)
651 {
652 hr = HRESULT_FROM_WIN32(ERROR_OBJECT_NOT_FOUND);
653 }
654
655 MessageExitOnFailure(hr, msierrXmlFileFailedSelect, "failed to find any nodes: %ls in XML file: %ls", pwzXPath, pwzFile);
656 for (;;)
657 {
658 pixNodes->nextNode(&pixn);
659 if (NULL == pixn)
660 break;
661
662 if (pwzName && *pwzName)
663 {
664 // We're setting an attribute
665 hr = XmlSetAttribute(pixn, pwzName, pwzValue);
666 ExitOnFailure(hr, "failed to set attribute: %ls to value %ls", pwzName, pwzValue);
667 }
668 else
669 {
670 // We're setting the text of the node
671 hr = XmlSetText(pixn, pwzValue);
672 ExitOnFailure(hr, "failed to set text to: %ls for element %ls. Make sure that XPath points to an element.", pwzValue, pwzXPath);
673 }
674 ReleaseNullObject(pixn);
675 }
676 }
677 else
678 {
679 hr = XmlSelectSingleNode(pixd, pwzXPath, &pixn);
680 if (S_FALSE == hr)
681 hr = HRESULT_FROM_WIN32(ERROR_OBJECT_NOT_FOUND);
682 MessageExitOnFailure(hr, msierrXmlFileFailedSelect, "failed to find node: %ls in XML file: %ls", pwzXPath, pwzFile);
683
684 // Make the modification
685 if (xaWriteValue == xa)
686 {
687 if (pwzName && *pwzName)
688 {
689 // We're setting an attribute
690 hr = XmlSetAttribute(pixn, pwzName, pwzValue);
691 ExitOnFailure(hr, "failed to set attribute: %ls to value %ls", pwzName, pwzValue);
692 }
693 else
694 {
695 // We're setting the text of the node
696 hr = XmlSetText(pixn, pwzValue);
697 ExitOnFailure(hr, "failed to set text to: %ls for element %ls. Make sure that XPath points to an element.", pwzValue, pwzXPath);
698 }
699 }
700 else if (xaCreateElement == xa)
701 {
702 hr = XmlCreateChild(pixn, pwzName, &pixnNewNode);
703 ExitOnFailure(hr, "failed to create child element: %ls", pwzName);
704
705 if (pwzValue && *pwzValue)
706 {
707 hr = XmlSetText(pixnNewNode, pwzValue);
708 ExitOnFailure(hr, "failed to set text to: %ls for node: %ls", pwzValue, pwzName);
709 }
710
711 ReleaseNullObject(pixnNewNode);
712 }
713 else if (xaDeleteValue == xa)
714 {
715 if (pwzName && *pwzName)
716 {
717 // Delete the attribute
718 hr = XmlRemoveAttribute(pixn, pwzName);
719 ExitOnFailure(hr, "failed to remove attribute: %ls", pwzName);
720 }
721 else
722 {
723 // Clear the text value for the node
724 hr = XmlSetText(pixn, L"");
725 ExitOnFailure(hr, "failed to clear text value");
726 }
727 }
728 else if (xaDeleteElement == xa)
729 {
730 // TODO: This may be a little heavy handed
731 hr = XmlRemoveChildren(pixn, pwzName);
732 ExitOnFailure(hr, "failed to delete child node: %ls", pwzName);
733 }
734 else
735 {
736 ExitOnFailure(hr = E_UNEXPECTED, "Invalid modification specified in custom action data");
737 }
738 }
739 }
740
741 // Now that we've made all of the changes to this file, save it and move on to the next
742 if (S_OK == hrOpenFailure)
743 {
744 if (fPreserveDate)
745 {
746 hr = FileGetTime(pwzFile, NULL, NULL, &ft);
747 ExitOnFailure(hr, "failed to get modified time of file : %ls", pwzFile);
748 }
749
750 int iSaveAttempt = 0;
751
752 do
753 {
754 hr = XmlSaveDocument(pixd, pwzFile);
755 if (FAILED(hr))
756 {
757 id = WcaErrorMessage(msierrXmlConfigFailedSave, hr, INSTALLMESSAGE_ERROR | MB_ABORTRETRYIGNORE, 1, pwzFile);
758 switch (id)
759 {
760 case IDABORT:
761 ExitOnFailure(hr, "Failed to save changes to XML file: %ls", pwzFile);
762 case IDRETRY:
763 hr = S_FALSE; // hit me, baby, one more time
764 break;
765 case IDIGNORE:
766 hr = S_OK; // pretend everything is okay and bail
767 break;
768 case 0: // No UI case, MsiProcessMessage returns 0
769 if (STIERR_SHARING_VIOLATION == hr)
770 {
771 // Only in case of sharing violation do we retry 30 times, once a second.
772 if (iSaveAttempt < 30)
773 {
774 hr = S_FALSE;
775 ++iSaveAttempt;
776 WcaLog(LOGMSG_VERBOSE, "Unable to save changes to XML file: %ls, retry attempt: %x", pwzFile, iSaveAttempt);
777 Sleep(1000);
778 }
779 else
780 {
781 ExitOnFailure(hr, "Failed to save changes to XML file: %ls", pwzFile);
782 }
783 }
784 break;
785 default: // Unknown error
786 ExitOnFailure(hr, "Failed to save changes to XML file: %ls", pwzFile);
787 }
788 }
789 } while (S_FALSE == hr);
790
791 if (fPreserveDate)
792 {
793 hr = FileSetTime(pwzFile, NULL, NULL, &ft);
794 ExitOnFailure(hr, "failed to set modified time of file : %ls", pwzFile);
795 }
796
797 if (fIsFSRedirectDisabled)
798 {
799 fIsFSRedirectDisabled = FALSE;
800 WcaRevertWow64FSRedirection();
801 }
802 }
803 }
804
805LExit:
806 // Make sure we revert FS Redirection if necessary before exiting
807 if (fIsFSRedirectDisabled)
808 {
809 fIsFSRedirectDisabled = FALSE;
810 WcaRevertWow64FSRedirection();
811 }
812#ifndef _WIN64
813 WcaFinalizeWow64();
814#endif
815
816 ReleaseStr(pwzCustomActionData);
817 ReleaseStr(pwzData);
818 ReleaseStr(pwzFile);
819 ReleaseStr(pwzXPath);
820 ReleaseStr(pwzName);
821 ReleaseStr(pwzValue);
822 ReleaseBSTR(bstrProperty);
823 ReleaseVariant(varValue);
824
825 ReleaseObject(pixdDocument2);
826 ReleaseObject(pixn);
827 ReleaseObject(pixd);
828 ReleaseObject(pixnNewNode);
829 ReleaseObject(pixNodes);
830
831 XmlUninitialize();
832
833 return WcaFinalize(FAILED(hr) ? ERROR_INSTALL_FAILURE : er);
834}
835
836
837/******************************************************************
838 ExecXmlFileRollback - entry point for XmlFile rollback Custom Action
839
840*******************************************************************/
841extern "C" UINT __stdcall ExecXmlFileRollback(
842 __in MSIHANDLE hInstall
843 )
844{
845// AssertSz(FALSE, "debug ExecXmlFileRollback");
846 HRESULT hr = S_OK;
847 UINT er = ERROR_SUCCESS;
848
849 int iIs64Bit;
850 BOOL fIs64Bit = FALSE;
851
852 LPWSTR pwzCustomActionData = NULL;
853 LPWSTR pwz = NULL;
854 LPWSTR pwzFileName = NULL;
855 LPBYTE pbData = NULL;
856 DWORD_PTR cbData = 0;
857
858 FILETIME ft;
859
860 HANDLE hFile = INVALID_HANDLE_VALUE;
861
862 // initialize
863 hr = WcaInitialize(hInstall, "ExecXmlFileRollback");
864 ExitOnFailure(hr, "failed to initialize");
865
866
867 hr = WcaGetProperty( L"CustomActionData", &pwzCustomActionData);
868 ExitOnFailure(hr, "failed to get CustomActionData");
869
870 WcaLog(LOGMSG_TRACEONLY, "CustomActionData: %ls", pwzCustomActionData);
871
872 pwz = pwzCustomActionData;
873
874 hr = WcaReadIntegerFromCaData(&pwz, &iIs64Bit);
875 ExitOnFailure(hr, "failed to read component bitness from custom action data");
876
877 hr = WcaReadStringFromCaData(&pwz, &pwzFileName);
878 ExitOnFailure(hr, "failed to read file name from custom action data");
879
880 hr = WcaReadStreamFromCaData(&pwz, &pbData, &cbData);
881 ExitOnFailure(hr, "failed to read file contents from custom action data");
882
883#ifndef _WIN64
884 fIs64Bit = (BOOL)iIs64Bit;
885
886 if (fIs64Bit)
887 {
888 hr = WcaInitializeWow64();
889 if (S_FALSE == hr)
890 {
891 hr = TYPE_E_DLLFUNCTIONNOTFOUND;
892 }
893 ExitOnFailure(hr, "failed to initialize Wow64 API");
894
895 if (!WcaIsWow64Process())
896 {
897 hr = E_NOTIMPL;
898 ExitOnFailure(hr, "Custom action was told to rollback a 64-bit component, but the custom action process is not running in WOW.");
899 }
900
901 hr = WcaDisableWow64FSRedirection();
902 ExitOnFailure(hr, "Custom action was told to rollback a 64-bit component, but was unable to Disable Filesystem Redirection through the Wow64 API.");
903 }
904#endif
905
906 // Always preserve the modified date on rollback
907 hr = FileGetTime(pwzFileName, NULL, NULL, &ft);
908 ExitOnFailure(hr, "Failed to get modified date of file %ls.", pwzFileName);
909
910 // Open the file
911 hFile = ::CreateFileW(pwzFileName, GENERIC_WRITE, NULL, NULL, TRUNCATE_EXISTING, NULL, NULL);
912 ExitOnInvalidHandleWithLastError(hFile, hr, "failed to open file: %ls", pwzFileName);
913
914 // Write out the old data
915 hr = FileWriteHandle(hFile, pbData, cbData);
916 ExitOnFailure(hr, "failed to write to file: %ls", pwzFileName);
917
918 ReleaseFile(hFile);
919
920 // Always preserve the modified date on rollback
921 hr = FileSetTime(pwzFileName, NULL, NULL, &ft);
922 ExitOnFailure(hr, "Failed to set modified date of file %ls.", pwzFileName);
923
924LExit:
925 ReleaseStr(pwzCustomActionData);
926 ReleaseStr(pwzFileName);
927
928 ReleaseFile(hFile);
929
930 if (fIs64Bit)
931 {
932 WcaRevertWow64FSRedirection();
933 WcaFinalizeWow64();
934 }
935
936 ReleaseMem(pbData);
937
938 return WcaFinalize(FAILED(hr) ? ERROR_INSTALL_FAILURE : er);
939}
940
diff --git a/src/ext/Util/ca/caDecor.h b/src/ext/Util/ca/caDecor.h
new file mode 100644
index 00000000..da274650
--- /dev/null
+++ b/src/ext/Util/ca/caDecor.h
@@ -0,0 +1,13 @@
1#pragma once
2// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
3
4
5#if defined(_M_ARM64)
6#define CUSTOM_ACTION_DECORATION(f) L"Wix4" f L"_A64"
7#elif defined(_M_AMD64)
8#define CUSTOM_ACTION_DECORATION(f) L"Wix4" f L"_X64"
9#elif defined(_M_ARM)
10#define CUSTOM_ACTION_DECORATION(f) L"Wix4" f L"_ARM"
11#else
12#define CUSTOM_ACTION_DECORATION(f) L"Wix4" f L"_X86"
13#endif
diff --git a/src/ext/Util/ca/cost.h b/src/ext/Util/ca/cost.h
new file mode 100644
index 00000000..6507e85d
--- /dev/null
+++ b/src/ext/Util/ca/cost.h
@@ -0,0 +1,9 @@
1#pragma once
2// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
3
4
5const UINT COST_SECUREOBJECT = 1000;
6const UINT COST_SERVICECONFIG = 1000;
7const UINT COST_XMLFILE = 1000;
8const UINT COST_CLOSEAPP = 500;
9const UINT COST_INTERNETSHORTCUT = 2000;
diff --git a/src/ext/Util/ca/dllmain.cpp b/src/ext/Util/ca/dllmain.cpp
new file mode 100644
index 00000000..35ae6d1c
--- /dev/null
+++ b/src/ext/Util/ca/dllmain.cpp
@@ -0,0 +1,26 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3#include "precomp.h"
4
5/********************************************************************
6DllMain - standard entry point for all WiX custom actions
7
8********************************************************************/
9extern "C" BOOL WINAPI DllMain(
10 IN HINSTANCE hInst,
11 IN ULONG ulReason,
12 IN LPVOID)
13{
14 switch(ulReason)
15 {
16 case DLL_PROCESS_ATTACH:
17 WcaGlobalInitialize(hInst);
18 break;
19
20 case DLL_PROCESS_DETACH:
21 WcaGlobalFinalize();
22 break;
23 }
24
25 return TRUE;
26}
diff --git a/src/ext/Util/ca/exitearlywithsuccess.cpp b/src/ext/Util/ca/exitearlywithsuccess.cpp
new file mode 100644
index 00000000..00828329
--- /dev/null
+++ b/src/ext/Util/ca/exitearlywithsuccess.cpp
@@ -0,0 +1,27 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3#include "precomp.h"
4
5
6/******************************************************************
7WixExitEarlyWithSuccess - entry point for WixExitEarlyWithSuccess
8 custom action which does nothing except return exit code
9 ERROR_NO_MORE_ITEMS. The Windows Installer documentation at
10 http://msdn.microsoft.com/library/aa368072.aspx indicates that
11 this exit code is not treated as an error. This will cause a
12 calling application to receive a successful return code if
13 this custom action executes. This can be useful for backwards
14 compatibility when an application redistributes an MSI and
15 a future major upgrade is released for that MSI. It should be
16 conditioned on a property set by an entry in the Upgrade table
17 of the MSI that detects newer major upgrades of the same MSI
18 already installed on the system. It should be scheduled after
19 the FindRelatedProducts action so that the property will be
20 set if appropriate.
21********************************************************************/
22extern "C" UINT __stdcall WixExitEarlyWithSuccess(
23 __in MSIHANDLE /*hInstall*/
24 )
25{
26 return ERROR_NO_MORE_ITEMS;
27}
diff --git a/src/ext/Util/ca/netshortcuts.cpp b/src/ext/Util/ca/netshortcuts.cpp
new file mode 100644
index 00000000..06826264
--- /dev/null
+++ b/src/ext/Util/ca/netshortcuts.cpp
@@ -0,0 +1,437 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3#include "precomp.h"
4
5LPCWSTR vcsShortcutsQuery =
6 L"SELECT `Component_`, `Directory_`, `Name`, `Target`, `Attributes`, `IconFile`, `IconIndex` "
7 L"FROM `Wix4InternetShortcut`";
8enum eShortcutsQuery { esqComponent = 1, esqDirectory, esqFilename, esqTarget, esqAttributes, esqIconFile, esqIconIndex };
9enum eShortcutsAttributes { esaLink = 0, esaURL = 1 };
10
11/******************************************************************
12 WixSchedInternetShortcuts - entry point
13
14********************************************************************/
15extern "C" UINT __stdcall WixSchedInternetShortcuts(
16 __in MSIHANDLE hInstall
17 )
18{
19 HRESULT hr = S_OK;
20 UINT er = ERROR_SUCCESS;
21
22 UINT uiCost = 0;
23
24 PMSIHANDLE hView = NULL;
25 PMSIHANDLE hRec = NULL;
26
27 MSIHANDLE hCreateFolderTable = NULL;
28 MSIHANDLE hCreateFolderColumns = NULL;
29
30 LPWSTR pwzCustomActionData = NULL;
31 LPWSTR pwzComponent = NULL;
32 LPWSTR pwzDirectory = NULL;
33 LPWSTR pwzFilename = NULL;
34 LPWSTR pwzTarget = NULL;
35 LPWSTR pwzShortcutPath = NULL;
36 int iAttr = 0;
37 LPWSTR pwzIconFile = NULL;
38 int iIconIndex = 0;
39 IUniformResourceLocatorW* piURL = NULL;
40 IShellLinkW* piShellLink = NULL;
41 BOOL fInitializedCom = FALSE;
42
43 hr = WcaInitialize(hInstall, "WixSchedInternetShortcuts");
44 ExitOnFailure(hr, "failed to initialize WixSchedInternetShortcuts.");
45
46 // anything to do?
47 if (S_OK != WcaTableExists(L"Wix4InternetShortcut"))
48 {
49 WcaLog(LOGMSG_STANDARD, "Wix4InternetShortcut table doesn't exist, so there are no Internet shortcuts to process");
50 goto LExit;
51 }
52
53 // check to see if we can create a shortcut - Server Core and others may not have a shell registered.
54 hr = ::CoInitialize(NULL);
55 ExitOnFailure(hr, "failed to initialize COM");
56 fInitializedCom = TRUE;
57
58 hr = ::CoCreateInstance(CLSID_InternetShortcut, NULL, CLSCTX_ALL, IID_IUniformResourceLocatorW, (void**)&piURL);
59 if (S_OK != hr)
60 {
61 WcaLog(LOGMSG_STANDARD, "failed to create an instance of IUniformResourceLocatorW, skipping shortcut creation");
62 ExitFunction1(hr = S_OK);
63 }
64
65 hr = ::CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_ALL, IID_IShellLinkW, (void**)&piShellLink);
66 if (S_OK != hr)
67 {
68 WcaLog(LOGMSG_STANDARD, "failed to create an instance of IShellLinkW, skipping shortcut creation");
69 ExitFunction1(hr = S_OK);
70 }
71
72 // query and loop through all the shortcuts
73 hr = WcaOpenExecuteView(vcsShortcutsQuery, &hView);
74 ExitOnFailure(hr, "failed to open view on Wix4InternetShortcut table");
75
76 while (S_OK == (hr = WcaFetchRecord(hView, &hRec)))
77 {
78 // read column values
79 hr = WcaGetRecordString(hRec, esqComponent, &pwzComponent);
80 ExitOnFailure(hr, "failed to get shortcut component");
81 hr = WcaGetRecordString(hRec, esqDirectory, &pwzDirectory);
82 ExitOnFailure(hr, "failed to get shortcut directory");
83 hr = WcaGetRecordString(hRec, esqFilename, &pwzFilename);
84 ExitOnFailure(hr, "failed to get shortcut filename");
85 hr = WcaGetRecordFormattedString(hRec, esqTarget, &pwzTarget);
86 ExitOnFailure(hr, "failed to get shortcut target");
87 hr = WcaGetRecordInteger(hRec, esqAttributes, &iAttr);
88 ExitOnFailure(hr, "failed to get shortcut attributes");
89 hr = WcaGetRecordFormattedString(hRec, esqIconFile, &pwzIconFile);
90 ExitOnFailure(hr, "failed to get shortcut icon file");
91 hr = WcaGetRecordInteger(hRec, esqIconIndex, &iIconIndex);
92 ExitOnFailure(hr, "failed to get shortcut icon index");
93
94 // skip processing this Wix4InternetShortcut row if the component isn't being configured
95 WCA_TODO todo = WcaGetComponentToDo(pwzComponent);
96 if (WCA_TODO_UNKNOWN == todo)
97 {
98 WcaLog(LOGMSG_VERBOSE, "Skipping shortcut for null-action component '%ls'", pwzComponent);
99 continue;
100 }
101
102 // we need to create the directory where the shortcut is supposed to live; rather
103 // than doing so in our deferred custom action, use the CreateFolder table to have MSI
104 // make (and remove) them on our behalf (including the correct cleanup of parent directories).
105 MSIDBERROR dbError = MSIDBERROR_NOERROR;
106 WcaLog(LOGMSG_STANDARD, "Adding folder '%ls', component '%ls' to the CreateFolder table", pwzDirectory, pwzComponent);
107 hr = WcaAddTempRecord(&hCreateFolderTable, &hCreateFolderColumns, L"CreateFolder", &dbError, 0, 2, pwzDirectory, pwzComponent);
108 if (MSIDBERROR_DUPLICATEKEY == dbError)
109 {
110 WcaLog(LOGMSG_STANDARD, "Folder '%ls' already exists in the CreateFolder table; the above error is harmless", pwzDirectory);
111 hr = S_OK;
112 }
113 ExitOnFailure(hr, "Couldn't add temporary CreateFolder row");
114
115 // only if we're installing/reinstalling do we need to schedule the deferred CA
116 // (uninstallation is handled via permanent RemoveFile rows and temporary CreateFolder rows)
117 if (WCA_TODO_INSTALL == todo || WCA_TODO_REINSTALL == todo)
118 {
119 // turn the Directory_ id into a path
120 hr = WcaGetTargetPath(pwzDirectory, &pwzShortcutPath);
121 ExitOnFailure(hr, "failed to allocate string for shortcut directory");
122
123 // append the shortcut filename
124 hr = StrAllocConcat(&pwzShortcutPath, pwzFilename, 0);
125 ExitOnFailure(hr, "failed to allocate string for shortcut filename");
126
127 // write the shortcut path and target to custom action data for deferred CAs
128 hr = WcaWriteStringToCaData(pwzShortcutPath, &pwzCustomActionData);
129 ExitOnFailure(hr, "failed to write shortcut path to custom action data");
130 hr = WcaWriteStringToCaData(pwzTarget, &pwzCustomActionData);
131 ExitOnFailure(hr, "failed to write shortcut target to custom action data");
132 hr = WcaWriteIntegerToCaData(iAttr, &pwzCustomActionData);
133 ExitOnFailure(hr, "failed to write shortcut attributes to custom action data");
134 hr = WcaWriteStringToCaData(pwzIconFile, &pwzCustomActionData);
135 ExitOnFailure(hr, "failed to write icon file to custom action data");
136 hr = WcaWriteIntegerToCaData(iIconIndex, &pwzCustomActionData);
137 ExitOnFailure(hr, "failed to write icon index to custom action data");
138
139 uiCost += COST_INTERNETSHORTCUT;
140 }
141 }
142
143 if (E_NOMOREITEMS == hr)
144 {
145 hr = S_OK;
146 }
147 ExitOnFailure(hr, "Failure occured while processing Wix4InternetShortcut table");
148
149 // if we have any shortcuts to install
150 if (pwzCustomActionData && *pwzCustomActionData)
151 {
152 // add cost to progress bar
153 hr = WcaProgressMessage(uiCost, TRUE);
154 ExitOnFailure(hr, "failed to extend progress bar for InternetShortcuts");
155
156 // provide custom action data to deferred and rollback CAs
157 hr = WcaSetProperty(CUSTOM_ACTION_DECORATION(L"RollbackInternetShortcuts"), pwzCustomActionData);
158 ExitOnFailure(hr, "failed to set WixRollbackInternetShortcuts rollback custom action data");
159 hr = WcaSetProperty(CUSTOM_ACTION_DECORATION(L"CreateInternetShortcuts"), pwzCustomActionData);
160 ExitOnFailure(hr, "failed to set WixCreateInternetShortcuts custom action data");
161 }
162
163LExit:
164 if (hCreateFolderTable)
165 {
166 ::MsiCloseHandle(hCreateFolderTable);
167 }
168
169 if (hCreateFolderColumns)
170 {
171 ::MsiCloseHandle(hCreateFolderColumns);
172 }
173
174 ReleaseStr(pwzCustomActionData);
175 ReleaseStr(pwzComponent);
176 ReleaseStr(pwzDirectory);
177 ReleaseStr(pwzFilename);
178 ReleaseStr(pwzTarget);
179 ReleaseStr(pwzShortcutPath);
180 ReleaseObject(piShellLink);
181 ReleaseObject(piURL);
182
183 if (fInitializedCom)
184 {
185 ::CoUninitialize();
186 }
187
188 er = SUCCEEDED(hr) ? ERROR_SUCCESS : ERROR_INSTALL_FAILURE;
189 return WcaFinalize(er);
190}
191
192
193
194/******************************************************************
195 CreateUrl - Creates a shortcut via IUniformResourceLocatorW
196
197*******************************************************************/
198static HRESULT CreateUrl(
199 __in_z LPCWSTR wzTarget,
200 __in_z LPCWSTR wzShortcutPath,
201 __in_z_opt LPCWSTR wzIconPath,
202 __in int iconIndex
203)
204{
205 HRESULT hr = S_OK;
206 IUniformResourceLocatorW* piURL = NULL;
207 IPersistFile* piPersistFile = NULL;
208 IPropertySetStorage* piProperties = NULL;
209 IPropertyStorage* piStorage = NULL;
210
211 // create an internet shortcut object
212 WcaLog(LOGMSG_STANDARD, "Creating IUniformResourceLocatorW shortcut '%ls' target '%ls'", wzShortcutPath, wzTarget);
213 hr = ::CoCreateInstance(CLSID_InternetShortcut, NULL, CLSCTX_ALL, IID_IUniformResourceLocatorW, (void**)&piURL);
214 ExitOnFailure(hr, "failed to create an instance of IUniformResourceLocatorW");
215
216 // set shortcut target
217 hr = piURL->SetURL(wzTarget, 0);
218 ExitOnFailure(hr, "failed to set shortcut '%ls' target '%ls'", wzShortcutPath, wzTarget);
219
220 if (wzIconPath)
221 {
222 WcaLog(LOGMSG_STANDARD, "Adding icon '%ls' index '%d'", wzIconPath, iconIndex);
223
224 hr = piURL->QueryInterface(IID_IPropertySetStorage, (void **)&piProperties);
225 ExitOnFailure(hr, "failed to get IPropertySetStorage for shortcut '%ls'", wzShortcutPath);
226
227 hr = piProperties->Open(FMTID_Intshcut, STGM_WRITE, &piStorage);
228 ExitOnFailure(hr, "failed to open storage for shortcut '%ls'", wzShortcutPath);
229
230 PROPSPEC ppids[2] = { {PRSPEC_PROPID, PID_IS_ICONINDEX}, {PRSPEC_PROPID, PID_IS_ICONFILE} };
231 PROPVARIANT ppvar[2];
232
233 PropVariantInit(ppvar);
234 PropVariantInit(ppvar + 1);
235
236 ppvar[0].vt = VT_I4;
237 ppvar[0].lVal = iconIndex;
238 ppvar[1].vt = VT_LPWSTR;
239 ppvar[1].pwszVal = const_cast<LPWSTR>(wzIconPath);
240
241 hr = piStorage->WriteMultiple(2, ppids, ppvar, 0);
242 ExitOnFailure(hr, "failed to write icon storage for shortcut '%ls'", wzShortcutPath);
243
244 hr = piStorage->Commit(STGC_DEFAULT);
245 ExitOnFailure(hr, "failed to commit icon storage for shortcut '%ls'", wzShortcutPath);
246 }
247
248 // get an IPersistFile and save the shortcut
249 hr = piURL->QueryInterface(IID_IPersistFile, (void**)&piPersistFile);
250 ExitOnFailure(hr, "failed to get IPersistFile for shortcut '%ls'", wzShortcutPath);
251
252 hr = piPersistFile->Save(wzShortcutPath, TRUE);
253 ExitOnFailure(hr, "failed to save shortcut '%ls'", wzShortcutPath);
254
255LExit:
256 ReleaseObject(piPersistFile);
257 ReleaseObject(piURL);
258 ReleaseObject(piStorage);
259 ReleaseObject(piProperties);
260
261 return hr;
262}
263
264/******************************************************************
265 CreateLink - Creates a shortcut via IShellLinkW
266
267*******************************************************************/
268static HRESULT CreateLink(
269 __in_z LPCWSTR wzTarget,
270 __in_z LPCWSTR wzShortcutPath,
271 __in_z_opt LPCWSTR wzIconPath,
272 __in int iconIndex
273)
274{
275 HRESULT hr = S_OK;
276 IShellLinkW* piShellLink = NULL;
277 IPersistFile* piPersistFile = NULL;
278
279 // create an internet shortcut object
280 WcaLog(LOGMSG_STANDARD, "Creating IShellLinkW shortcut '%ls' target '%ls'", wzShortcutPath, wzTarget);
281 hr = ::CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_ALL, IID_IShellLinkW, (void**)&piShellLink);
282 ExitOnFailure(hr, "failed to create an instance of IShellLinkW");
283
284 // set shortcut target
285 hr = piShellLink->SetPath(wzTarget);
286 ExitOnFailure(hr, "failed to set shortcut '%ls' target '%ls'", wzShortcutPath, wzTarget);
287
288 if (wzIconPath)
289 {
290 WcaLog(LOGMSG_STANDARD, "Adding icon '%ls' index '%d'", wzIconPath, iconIndex);
291 hr = piShellLink->SetIconLocation(wzIconPath, iconIndex);
292 ExitOnFailure(hr, "failed to set icon for shortcut '%ls'", wzShortcutPath);
293 }
294
295 // get an IPersistFile and save the shortcut
296 hr = piShellLink->QueryInterface(IID_IPersistFile, (void**)&piPersistFile);
297 ExitOnFailure(hr, "failed to get IPersistFile for shortcut '%ls'", wzShortcutPath);
298
299 hr = piPersistFile->Save(wzShortcutPath, TRUE);
300 ExitOnFailure(hr, "failed to save shortcut '%ls'", wzShortcutPath);
301
302LExit:
303 ReleaseObject(piPersistFile);
304 ReleaseObject(piShellLink);
305
306 return hr;
307}
308
309
310
311/******************************************************************
312 WixCreateInternetShortcuts - entry point for Internet shortcuts
313 custom action
314*******************************************************************/
315extern "C" UINT __stdcall WixCreateInternetShortcuts(
316 __in MSIHANDLE hInstall
317 )
318{
319 HRESULT hr = S_OK;
320 UINT er = ERROR_SUCCESS;
321
322 LPWSTR pwz = NULL;
323 LPWSTR pwzCustomActionData = NULL;
324 LPWSTR pwzTarget = NULL;
325 LPWSTR pwzShortcutPath = NULL;
326 LPWSTR pwzIconPath = NULL;
327 BOOL fInitializedCom = FALSE;
328 int iAttr = 0;
329 int iIconIndex = 0;
330
331 // initialize
332 hr = WcaInitialize(hInstall, "WixCreateInternetShortcuts");
333 ExitOnFailure(hr, "failed to initialize WixCreateInternetShortcuts");
334
335 hr = ::CoInitialize(NULL);
336 ExitOnFailure(hr, "failed to initialize COM");
337 fInitializedCom = TRUE;
338
339 // extract the custom action data
340 hr = WcaGetProperty(L"CustomActionData", &pwzCustomActionData);
341 ExitOnFailure(hr, "failed to get CustomActionData");
342
343 // loop through all the custom action data
344 pwz = pwzCustomActionData;
345 while (pwz && *pwz)
346 {
347 hr = WcaReadStringFromCaData(&pwz, &pwzShortcutPath);
348 ExitOnFailure(hr, "failed to read shortcut path from custom action data");
349 hr = WcaReadStringFromCaData(&pwz, &pwzTarget);
350 ExitOnFailure(hr, "failed to read shortcut target from custom action data");
351 hr = WcaReadIntegerFromCaData(&pwz, &iAttr);
352 ExitOnFailure(hr, "failed to read shortcut attributes from custom action data");
353 hr = WcaReadStringFromCaData(&pwz, &pwzIconPath);
354 ExitOnFailure(hr, "failed to read shortcut icon path from custom action data");
355 hr = WcaReadIntegerFromCaData(&pwz, &iIconIndex);
356 ExitOnFailure(hr, "failed to read shortcut icon index from custom action data");
357
358 if ((iAttr & esaURL) == esaURL)
359 {
360 hr = CreateUrl(pwzTarget, pwzShortcutPath, pwzIconPath, iIconIndex);
361 }
362 else
363 {
364 hr = CreateLink(pwzTarget, pwzShortcutPath, pwzIconPath, iIconIndex);
365 }
366 ExitOnFailure(hr, "failed to create Internet shortcut");
367
368 // tick the progress bar
369 hr = WcaProgressMessage(COST_INTERNETSHORTCUT, FALSE);
370 ExitOnFailure(hr, "failed to tick progress bar for shortcut: %ls", pwzShortcutPath);
371 }
372
373LExit:
374 ReleaseStr(pwzCustomActionData);
375 ReleaseStr(pwzTarget);
376 ReleaseStr(pwzShortcutPath);
377
378 if (fInitializedCom)
379 {
380 ::CoUninitialize();
381 }
382
383 er = FAILED(hr) ? ERROR_INSTALL_FAILURE : er;
384 return WcaFinalize(er);
385}
386
387
388
389/******************************************************************
390 WixRollbackInternetShortcuts - entry point for Internet shortcuts
391 custom action (rollback)
392*******************************************************************/
393extern "C" UINT __stdcall WixRollbackInternetShortcuts(
394 __in MSIHANDLE hInstall
395 )
396{
397 HRESULT hr = S_OK;
398 UINT er = ERROR_SUCCESS;
399
400 LPWSTR pwz = NULL;
401 LPWSTR pwzCustomActionData = NULL;
402 LPWSTR pwzShortcutPath = NULL;
403 int iAttr = 0;
404
405 // initialize
406 hr = WcaInitialize(hInstall, "WixRemoveInternetShortcuts");
407 ExitOnFailure(hr, "failed to initialize WixRemoveInternetShortcuts");
408
409 hr = WcaGetProperty(L"CustomActionData", &pwzCustomActionData);
410 ExitOnFailure(hr, "failed to get CustomActionData");
411
412 // loop through all the custom action data
413 pwz = pwzCustomActionData;
414 while (pwz && *pwz)
415 {
416 // extract the custom action data we're interested in
417 hr = WcaReadStringFromCaData(&pwz, &pwzShortcutPath);
418 ExitOnFailure(hr, "failed to read shortcut path from custom action data for rollback");
419
420 // delete file
421 hr = FileEnsureDelete(pwzShortcutPath);
422 ExitOnFailure(hr, "failed to delete file '%ls'", pwzShortcutPath);
423
424 // skip over the shortcut target and attributes
425 hr = WcaReadStringFromCaData(&pwz, &pwzShortcutPath);
426 ExitOnFailure(hr, "failed to skip shortcut target from custom action data for rollback");
427 hr = WcaReadIntegerFromCaData(&pwz, &iAttr);
428 ExitOnFailure(hr, "failed to read shortcut attributes from custom action data");
429 }
430
431LExit:
432 ReleaseStr(pwzCustomActionData);
433 ReleaseStr(pwzShortcutPath);
434
435 er = FAILED(hr) ? ERROR_INSTALL_FAILURE : er;
436 return WcaFinalize(er);
437}
diff --git a/src/ext/Util/ca/precomp.h b/src/ext/Util/ca/precomp.h
new file mode 100644
index 00000000..c5d6afe5
--- /dev/null
+++ b/src/ext/Util/ca/precomp.h
@@ -0,0 +1,54 @@
1#pragma once
2// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
3
4
5#if _WIN32_MSI < 150
6#define _WIN32_MSI 150
7#endif
8
9#include <windows.h>
10#include <msiquery.h>
11#include <msidefs.h>
12#include <stierr.h>
13
14#include <strsafe.h>
15
16#include <msxml2.h>
17#include <Iads.h>
18#include <activeds.h>
19#include <lm.h> // NetApi32.lib
20#include <Ntsecapi.h>
21#include <Dsgetdc.h>
22#include <shlobj.h>
23#include <intshcut.h>
24
25#define MAXUINT USHRT_MAX
26
27#include "wcautil.h"
28#include "wcawow64.h"
29#include "wcawrapquery.h"
30#include "aclutil.h"
31#include "dirutil.h"
32#include "fileutil.h"
33#include "memutil.h"
34#include "osutil.h"
35#include "pathutil.h"
36#include "procutil.h"
37#include "shelutil.h"
38#include "strutil.h"
39#include "sczutil.h"
40#include "rmutil.h"
41#include "userutil.h"
42#include "xmlutil.h"
43#include "wiutil.h"
44
45#include "CustomMsiErrors.h"
46
47#include "sca.h"
48#include "scacost.h"
49#include "cost.h"
50#include "scauser.h"
51#include "scasmb.h"
52#include "scasmbexec.h"
53
54#include "caDecor.h"
diff --git a/src/ext/Util/ca/qtexecca.cpp b/src/ext/Util/ca/qtexecca.cpp
new file mode 100644
index 00000000..ddcc812f
--- /dev/null
+++ b/src/ext/Util/ca/qtexecca.cpp
@@ -0,0 +1,316 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3#include "precomp.h"
4
5#define OUTPUT_BUFFER 1024
6
7// These old "CA" prefix names are deprecated, and intended to go away in wix 4.0, only staying now for compatibility reasons
8const LPCWSTR CAQUIET_TIMEOUT_PROPERTY = L"QtExecCmdTimeout";
9const LPCWSTR CAQUIET_ARGUMENTS_PROPERTY = L"QtExecCmdLine";
10const LPCWSTR CAQUIET64_ARGUMENTS_PROPERTY = L"QtExec64CmdLine";
11// end deprecated section
12
13// WixCA name quiet commandline argument properties
14const LPCWSTR WIX_QUIET_ARGUMENTS_PROPERTY = L"WixQuietExecCmdLine";
15const LPCWSTR WIX_QUIET64_ARGUMENTS_PROPERTY = L"WixQuietExec64CmdLine";
16
17// WixCA quiet timeout properties
18const LPCWSTR WIX_QUIET_TIMEOUT_PROPERTY = L"WixQuietExecCmdTimeout";
19const LPCWSTR WIX_QUIET64_TIMEOUT_PROPERTY = L"WixQuietExec64CmdTimeout";
20
21// WixCA silent commandline argument properties
22const LPCWSTR WIX_SILENT_ARGUMENTS_PROPERTY = L"WixSilentExecCmdLine";
23const LPCWSTR WIX_SILENT64_ARGUMENTS_PROPERTY = L"WixSilentExec64CmdLine";
24
25// WixCA silent timeout properties
26const LPCWSTR WIX_SILENT_TIMEOUT_PROPERTY = L"WixSilentExecCmdTimeout";
27const LPCWSTR WIX_SILENT64_TIMEOUT_PROPERTY = L"WixSilentExec64CmdTimeout";
28
29HRESULT BuildCommandLine(
30 __in LPCWSTR wzProperty,
31 __out LPWSTR *ppwzCommand
32 )
33{
34 Assert(ppwzCommand);
35
36 HRESULT hr = S_OK;
37 BOOL fScheduled = ::MsiGetMode(WcaGetInstallHandle(), MSIRUNMODE_SCHEDULED);
38 BOOL fRollback = ::MsiGetMode(WcaGetInstallHandle(), MSIRUNMODE_ROLLBACK);
39 BOOL fCommit = ::MsiGetMode(WcaGetInstallHandle(), MSIRUNMODE_COMMIT);
40
41 if (fScheduled || fRollback || fCommit)
42 {
43 if (WcaIsPropertySet("CustomActionData"))
44 {
45 hr = WcaGetProperty( L"CustomActionData", ppwzCommand);
46 ExitOnFailure(hr, "Failed to get CustomActionData");
47 }
48 }
49 else if (WcaIsUnicodePropertySet(wzProperty))
50 {
51 hr = WcaGetFormattedProperty(wzProperty, ppwzCommand);
52 ExitOnFailure(hr, "Failed to get %ls", wzProperty);
53 hr = WcaSetProperty(wzProperty, L""); // clear out the property now that we've read it
54 ExitOnFailure(hr, "Failed to set %ls", wzProperty);
55 }
56
57 if (!*ppwzCommand)
58 {
59 ExitOnFailure(hr = E_INVALIDARG, "Failed to get command line data");
60 }
61
62 if (L'"' != **ppwzCommand)
63 {
64 WcaLog(LOGMSG_STANDARD, "Command string must begin with quoted application name.");
65 ExitOnFailure(hr = E_INVALIDARG, "invalid command line property value");
66 }
67
68LExit:
69 return hr;
70}
71
72#define ONEMINUTE 60000
73
74DWORD GetTimeout(LPCWSTR wzPropertyName)
75{
76 DWORD dwTimeout = ONEMINUTE;
77 HRESULT hr = S_OK;
78
79 LPWSTR pwzData = NULL;
80
81 if (WcaIsUnicodePropertySet(wzPropertyName))
82 {
83 hr = WcaGetProperty(wzPropertyName, &pwzData);
84 ExitOnFailure(hr, "Failed to get %ls", wzPropertyName);
85
86 if ((dwTimeout = (DWORD)_wtoi(pwzData)) == 0)
87 {
88 dwTimeout = ONEMINUTE;
89 }
90 }
91
92LExit:
93 ReleaseStr(pwzData);
94
95 return dwTimeout;
96
97}
98
99HRESULT ExecCommon(
100 __in LPCWSTR wzArgumentsProperty,
101 __in LPCWSTR wzTimeoutProperty,
102 __in BOOL fLogCommand,
103 __in BOOL fLogOutput
104 )
105{
106 HRESULT hr = S_OK;
107 LPWSTR pwzCommand = NULL;
108 DWORD dwTimeout = 0;
109
110 hr = BuildCommandLine(wzArgumentsProperty, &pwzCommand);
111 ExitOnFailure(hr, "Failed to get Command Line");
112
113 dwTimeout = GetTimeout(wzTimeoutProperty);
114
115 hr = QuietExec(pwzCommand, dwTimeout, fLogCommand, fLogOutput);
116 ExitOnFailure(hr, "QuietExec Failed");
117
118LExit:
119 ReleaseStr(pwzCommand);
120
121 return hr;
122}
123
124HRESULT ExecCommon64(
125 __in LPCWSTR wzArgumentsProperty,
126 __in LPCWSTR wzTimeoutProperty,
127 __in BOOL fLogCommand,
128 __in BOOL fLogOutput
129 )
130{
131 HRESULT hr = S_OK;
132 LPWSTR pwzCommand = NULL;
133 DWORD dwTimeout = 0;
134#ifndef _WIN64
135 BOOL fIsWow64Initialized = FALSE;
136 BOOL fRedirected = FALSE;
137
138 hr = WcaInitializeWow64();
139 if (S_FALSE == hr)
140 {
141 hr = TYPE_E_DLLFUNCTIONNOTFOUND;
142 }
143 ExitOnFailure(hr, "Failed to intialize WOW64.");
144 fIsWow64Initialized = TRUE;
145
146 hr = WcaDisableWow64FSRedirection();
147 ExitOnFailure(hr, "Failed to enable filesystem redirection.");
148 fRedirected = TRUE;
149#endif
150
151 hr = BuildCommandLine(wzArgumentsProperty, &pwzCommand);
152 ExitOnFailure(hr, "Failed to get Command Line");
153
154 dwTimeout = GetTimeout(wzTimeoutProperty);
155
156 hr = QuietExec(pwzCommand, dwTimeout, fLogCommand, fLogOutput);
157 ExitOnFailure(hr, "QuietExec64 Failed");
158
159LExit:
160 ReleaseStr(pwzCommand);
161
162#ifndef _WIN64
163 if (fRedirected)
164 {
165 WcaRevertWow64FSRedirection();
166 }
167
168 if (fIsWow64Initialized)
169 {
170 WcaFinalizeWow64();
171 }
172#endif
173
174 return hr;
175}
176
177// These two custom actions are deprecated, and should go away in wix v4.0. WixQuietExec replaces this one,
178// and is not intended to have any difference in behavior apart from CA name and property names.
179extern "C" UINT __stdcall CAQuietExec(
180 __in MSIHANDLE hInstall
181 )
182{
183 Assert(hInstall);
184 HRESULT hr = S_OK;
185 UINT er = ERROR_SUCCESS;
186
187 hr = WcaInitialize(hInstall, "CAQuietExec");
188 ExitOnFailure(hr, "Failed to initialize");
189
190 hr = ExecCommon(CAQUIET_ARGUMENTS_PROPERTY, CAQUIET_TIMEOUT_PROPERTY, TRUE, TRUE);
191 ExitOnFailure(hr, "Failed in ExecCommon method");
192
193LExit:
194 if (FAILED(hr))
195 {
196 er = ERROR_INSTALL_FAILURE;
197 }
198
199 return WcaFinalize(er);
200}
201
202// 2nd deprecated custom action name, superseded by WixQuietExec64
203extern "C" UINT __stdcall CAQuietExec64(
204 __in MSIHANDLE hInstall
205 )
206{
207 Assert(hInstall);
208 HRESULT hr = S_OK;
209 UINT er = ERROR_SUCCESS;
210
211 hr = WcaInitialize(hInstall, "CAQuietExec64");
212 ExitOnFailure(hr, "Failed to initialize");
213
214 hr = ExecCommon64(CAQUIET64_ARGUMENTS_PROPERTY, CAQUIET_TIMEOUT_PROPERTY, TRUE, TRUE);
215 ExitOnFailure(hr, "Failed in ExecCommon64 method");
216
217LExit:
218 if (FAILED(hr))
219 {
220 er = ERROR_INSTALL_FAILURE;
221 }
222
223 return WcaFinalize(er);
224}
225
226extern "C" UINT __stdcall WixQuietExec(
227 __in MSIHANDLE hInstall
228 )
229{
230 Assert(hInstall);
231 HRESULT hr = S_OK;
232 UINT er = ERROR_SUCCESS;
233
234 hr = WcaInitialize(hInstall, "WixQuietExec");
235 ExitOnFailure(hr, "Failed to initialize");
236
237 hr = ExecCommon(WIX_QUIET_ARGUMENTS_PROPERTY, WIX_QUIET_TIMEOUT_PROPERTY, TRUE, TRUE);
238 ExitOnFailure(hr, "Failed in ExecCommon method");
239
240LExit:
241 if (FAILED(hr))
242 {
243 er = ERROR_INSTALL_FAILURE;
244 }
245
246 return WcaFinalize(er);
247}
248
249extern "C" UINT __stdcall WixQuietExec64(
250 __in MSIHANDLE hInstall
251 )
252{
253 Assert(hInstall);
254 HRESULT hr = S_OK;
255 UINT er = ERROR_SUCCESS;
256
257 hr = WcaInitialize(hInstall, "WixQuietExec64");
258 ExitOnFailure(hr, "Failed to initialize");
259
260 hr = ExecCommon64(WIX_QUIET64_ARGUMENTS_PROPERTY, WIX_QUIET64_TIMEOUT_PROPERTY, TRUE, TRUE);
261 ExitOnFailure(hr, "Failed in ExecCommon method");
262
263LExit:
264 if (FAILED(hr))
265 {
266 er = ERROR_INSTALL_FAILURE;
267 }
268
269 return WcaFinalize(er);
270}
271
272extern "C" UINT __stdcall WixSilentExec(
273 __in MSIHANDLE hInstall
274 )
275{
276 Assert(hInstall);
277 HRESULT hr = S_OK;
278 UINT er = ERROR_SUCCESS;
279
280 hr = WcaInitialize(hInstall, "WixSilentExec");
281 ExitOnFailure(hr, "Failed to initialize");
282
283 hr = ExecCommon(WIX_SILENT_ARGUMENTS_PROPERTY, WIX_SILENT_TIMEOUT_PROPERTY, FALSE, FALSE);
284 ExitOnFailure(hr, "Failed in ExecCommon method");
285
286LExit:
287 if (FAILED(hr))
288 {
289 er = ERROR_INSTALL_FAILURE;
290 }
291
292 return WcaFinalize(er);
293}
294
295extern "C" UINT __stdcall WixSilentExec64(
296 __in MSIHANDLE hInstall
297 )
298{
299 Assert(hInstall);
300 HRESULT hr = S_OK;
301 UINT er = ERROR_SUCCESS;
302
303 hr = WcaInitialize(hInstall, "WixSilentExec64");
304 ExitOnFailure(hr, "Failed to initialize");
305
306 hr = ExecCommon64(WIX_SILENT64_ARGUMENTS_PROPERTY, WIX_SILENT64_TIMEOUT_PROPERTY, FALSE, FALSE);
307 ExitOnFailure(hr, "Failed in ExecCommon method");
308
309LExit:
310 if (FAILED(hr))
311 {
312 er = ERROR_INSTALL_FAILURE;
313 }
314
315 return WcaFinalize(er);
316}
diff --git a/src/ext/Util/ca/sca.h b/src/ext/Util/ca/sca.h
new file mode 100644
index 00000000..599122ff
--- /dev/null
+++ b/src/ext/Util/ca/sca.h
@@ -0,0 +1,19 @@
1#pragma once
2// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
3
4// user creation attributes definitions
5enum SCAU_ATTRIBUTES
6{
7 SCAU_DONT_EXPIRE_PASSWRD = 0x00000001,
8 SCAU_PASSWD_CANT_CHANGE = 0x00000002,
9 SCAU_PASSWD_CHANGE_REQD_ON_LOGIN = 0x00000004,
10 SCAU_DISABLE_ACCOUNT = 0x00000008,
11 SCAU_FAIL_IF_EXISTS = 0x00000010,
12 SCAU_UPDATE_IF_EXISTS = 0x00000020,
13 SCAU_ALLOW_LOGON_AS_SERVICE = 0x00000040,
14 SCAU_ALLOW_LOGON_AS_BATCH = 0x00000080,
15
16 SCAU_DONT_REMOVE_ON_UNINSTALL = 0x00000100,
17 SCAU_DONT_CREATE_USER = 0x00000200,
18 SCAU_NON_VITAL = 0x00000400,
19}; \ No newline at end of file
diff --git a/src/ext/Util/ca/scacost.h b/src/ext/Util/ca/scacost.h
new file mode 100644
index 00000000..5b215035
--- /dev/null
+++ b/src/ext/Util/ca/scacost.h
@@ -0,0 +1,18 @@
1#pragma once
2// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
3
4
5const UINT COST_PERFMON_REGISTER = 1000;
6const UINT COST_PERFMON_UNREGISTER = 1000;
7
8const UINT COST_SMB_CREATESMB = 10000;
9const UINT COST_SMB_DROPSMB = 5000;
10const UINT COST_USER_ADD = 10000;
11const UINT COST_USER_DELETE = 10000;
12
13const UINT COST_PERFMONMANIFEST_REGISTER = 1000;
14const UINT COST_PERFMONMANIFEST_UNREGISTER = 1000;
15
16const UINT COST_EVENTMANIFEST_REGISTER = 1000;
17const UINT COST_EVENTMANIFEST_UNREGISTER = 1000;
18
diff --git a/src/ext/Util/ca/scaexec.cpp b/src/ext/Util/ca/scaexec.cpp
new file mode 100644
index 00000000..5845c1b4
--- /dev/null
+++ b/src/ext/Util/ca/scaexec.cpp
@@ -0,0 +1,1082 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3#include "precomp.h"
4
5
6/********************************************************************
7 * CreateSmb - CUSTOM ACTION ENTRY POINT for creating fileshares
8 *
9 * Input: deferred CustomActionData -
10 * wzFsKey\twzShareDesc\twzFullPath\tfIntegratedAuth\twzUserName\tnPermissions\twzUserName\tnPermissions...
11 *
12 * ****************************************************************/
13extern "C" UINT __stdcall CreateSmb(MSIHANDLE hInstall)
14{
15//AssertSz(0, "debug CreateSmb");
16 UINT er = ERROR_SUCCESS;
17 HRESULT hr = S_OK;
18
19 LPWSTR pwzData = NULL;
20 LPWSTR pwz = NULL;
21 LPWSTR pwzFsKey = NULL;
22 LPWSTR pwzShareDesc = NULL;
23 LPWSTR pwzDirectory = NULL;
24 int iAccessMode = 0;
25 DWORD nExPermissions = 0;
26 BOOL fIntegratedAuth;
27 LPWSTR pwzExUser = NULL;
28 SCA_SMBP ssp = {0};
29 DWORD dwExUserPerms = 0;
30 DWORD dwCounter = 0;
31 SCA_SMBP_USER_PERMS* pUserPermsList = NULL;
32
33 hr = WcaInitialize(hInstall, "CreateSmb");
34 ExitOnFailure(hr, "failed to initialize");
35
36 hr = WcaGetProperty( L"CustomActionData", &pwzData);
37 ExitOnFailure(hr, "failed to get CustomActionData");
38
39 WcaLog(LOGMSG_TRACEONLY, "CustomActionData: %ls", pwzData);
40
41 pwz = pwzData;
42 hr = WcaReadStringFromCaData(&pwz, &pwzFsKey); // share name
43 ExitOnFailure(hr, "failed to read share name");
44 hr = WcaReadStringFromCaData(&pwz, &pwzShareDesc); // share description
45 ExitOnFailure(hr, "failed to read share name");
46 hr = WcaReadStringFromCaData(&pwz, &pwzDirectory); // full path to share
47 ExitOnFailure(hr, "failed to read share name");
48 hr = WcaReadIntegerFromCaData(&pwz, reinterpret_cast<int *>(&fIntegratedAuth));
49 ExitOnFailure(hr, "failed to read integrated authentication");
50
51 hr = WcaReadIntegerFromCaData(&pwz, reinterpret_cast<int *>(&dwExUserPerms));
52 ExitOnFailure(hr, "failed to read count of permissions to set");
53 if(dwExUserPerms > 0)
54 {
55 pUserPermsList = static_cast<SCA_SMBP_USER_PERMS*>(MemAlloc(sizeof(SCA_SMBP_USER_PERMS)*dwExUserPerms, TRUE));
56 ExitOnNull(pUserPermsList, hr, E_OUTOFMEMORY, "failed to allocate memory for permissions structure");
57
58 //Pull out all of the ExUserPerm strings
59 for (dwCounter = 0; dwCounter < dwExUserPerms; ++dwCounter)
60 {
61 hr = WcaReadStringFromCaData(&pwz, &pwzExUser); // user account
62 ExitOnFailure(hr, "failed to read user account");
63 pUserPermsList[dwCounter].wzUser = pwzExUser;
64 pwzExUser = NULL;
65
66 hr = WcaReadIntegerFromCaData(&pwz, &iAccessMode);
67 ExitOnFailure(hr, "failed to read access mode");
68 pUserPermsList[dwCounter].accessMode = (ACCESS_MODE)iAccessMode;
69 iAccessMode = 0;
70
71 hr = WcaReadIntegerFromCaData(&pwz, reinterpret_cast<int *>(&nExPermissions));
72 ExitOnFailure(hr, "failed to read count of permissions");
73 pUserPermsList[dwCounter].nPermissions = nExPermissions;
74 nExPermissions = 0;
75 }
76 }
77
78 ssp.wzKey = pwzFsKey;
79 ssp.wzDescription = pwzShareDesc;
80 ssp.wzDirectory = pwzDirectory;
81 ssp.fUseIntegratedAuth = fIntegratedAuth;
82 ssp.dwUserPermissionCount = dwExUserPerms;
83 ssp.pUserPerms = pUserPermsList;
84
85 hr = ScaEnsureSmbExists(&ssp);
86 MessageExitOnFailure(hr, msierrSMBFailedCreate, "failed to create share: '%ls'", pwzFsKey);
87
88 hr = WcaProgressMessage(COST_SMB_CREATESMB, FALSE);
89
90LExit:
91 ReleaseStr(pwzFsKey);
92 ReleaseStr(pwzShareDesc);
93 ReleaseStr(pwzDirectory);
94 ReleaseStr(pwzData);
95
96 if (pUserPermsList)
97 {
98 MemFree(pUserPermsList);
99 }
100
101 if (FAILED(hr))
102 {
103 er = ERROR_INSTALL_FAILURE;
104 }
105 return WcaFinalize(er);
106}
107
108
109
110/********************************************************************
111 DropSmb - CUSTOM ACTION ENTRY POINT for creating fileshares
112
113 Input: deferred CustomActionData - wzFsKey\twzShareDesc\twzFullPath\tnPermissions\tfIntegratedAuth\twzUserName\twzPassword
114
115 * ****************************************************************/
116extern "C" UINT __stdcall DropSmb(MSIHANDLE hInstall)
117{
118 //AssertSz(0, "debug DropSmb");
119 UINT er = ERROR_SUCCESS;
120 HRESULT hr = S_OK;
121
122 LPWSTR pwzData = NULL;
123 LPWSTR pwz = NULL;
124 LPWSTR pwzFsKey = NULL;
125 SCA_SMBP ssp = {0};
126
127 hr = WcaInitialize(hInstall, "DropSmb");
128 ExitOnFailure(hr, "failed to initialize");
129
130 hr = WcaGetProperty( L"CustomActionData", &pwzData);
131 ExitOnFailure(hr, "failed to get CustomActionData");
132
133 WcaLog(LOGMSG_TRACEONLY, "CustomActionData: %ls", pwzData);
134
135 pwz = pwzData;
136 hr = WcaReadStringFromCaData(&pwz, &pwzFsKey); // share name
137 ExitOnFailure(hr, "failed to read share name");
138
139 ssp.wzKey = pwzFsKey;
140
141 hr = ScaDropSmb(&ssp);
142 MessageExitOnFailure(hr, msierrSMBFailedDrop, "failed to delete share: '%ls'", pwzFsKey);
143
144 hr = WcaProgressMessage(COST_SMB_DROPSMB, FALSE);
145
146LExit:
147 ReleaseStr(pwzFsKey);
148 ReleaseStr(pwzData);
149
150 if (FAILED(hr))
151 {
152 er = ERROR_INSTALL_FAILURE;
153 }
154 return WcaFinalize(er);
155}
156
157
158static HRESULT AddUserToGroup(
159 __in LPWSTR wzUser,
160 __in LPCWSTR wzUserDomain,
161 __in LPCWSTR wzGroup,
162 __in LPCWSTR wzGroupDomain
163 )
164{
165 Assert(wzUser && *wzUser && wzUserDomain && wzGroup && *wzGroup && wzGroupDomain);
166
167 HRESULT hr = S_OK;
168 IADsGroup *pGroup = NULL;
169 BSTR bstrUser = NULL;
170 BSTR bstrGroup = NULL;
171 LPCWSTR wz = NULL;
172 LPWSTR pwzUser = NULL;
173 LOCALGROUP_MEMBERS_INFO_3 lgmi;
174
175 if (*wzGroupDomain)
176 {
177 wz = wzGroupDomain;
178 }
179
180 // Try adding it to the global group first
181 UINT ui = ::NetGroupAddUser(wz, wzGroup, wzUser);
182 if (NERR_GroupNotFound == ui)
183 {
184 // Try adding it to the local group
185 if (wzUserDomain)
186 {
187 hr = StrAllocFormatted(&pwzUser, L"%s\\%s", wzUserDomain, wzUser);
188 ExitOnFailure(hr, "failed to allocate user domain string");
189 }
190
191 lgmi.lgrmi3_domainandname = (NULL == pwzUser ? wzUser : pwzUser);
192 ui = ::NetLocalGroupAddMembers(wz, wzGroup, 3 , reinterpret_cast<LPBYTE>(&lgmi), 1);
193 }
194 hr = HRESULT_FROM_WIN32(ui);
195 if (HRESULT_FROM_WIN32(ERROR_MEMBER_IN_ALIAS) == hr) // if they're already a member of the group don't report an error
196 hr = S_OK;
197
198 //
199 // If we failed, try active directory
200 //
201 if (FAILED(hr))
202 {
203 WcaLog(LOGMSG_VERBOSE, "Failed to add user: %ls, domain %ls to group: %ls, domain: %ls with error 0x%x. Attempting to use Active Directory", wzUser, wzUserDomain, wzGroup, wzGroupDomain, hr);
204
205 hr = UserCreateADsPath(wzUserDomain, wzUser, &bstrUser);
206 ExitOnFailure(hr, "failed to create user ADsPath for user: %ls domain: %ls", wzUser, wzUserDomain);
207
208 hr = UserCreateADsPath(wzGroupDomain, wzGroup, &bstrGroup);
209 ExitOnFailure(hr, "failed to create group ADsPath for group: %ls domain: %ls", wzGroup, wzGroupDomain);
210
211 hr = ::ADsGetObject(bstrGroup,IID_IADsGroup, reinterpret_cast<void**>(&pGroup));
212 ExitOnFailure(hr, "Failed to get group '%ls'.", reinterpret_cast<WCHAR*>(bstrGroup) );
213
214 hr = pGroup->Add(bstrUser);
215 if ((HRESULT_FROM_WIN32(ERROR_OBJECT_ALREADY_EXISTS) == hr) || (HRESULT_FROM_WIN32(ERROR_MEMBER_IN_ALIAS) == hr))
216 hr = S_OK;
217
218 ExitOnFailure(hr, "Failed to add user %ls to group '%ls'.", reinterpret_cast<WCHAR*>(bstrUser), reinterpret_cast<WCHAR*>(bstrGroup) );
219 }
220
221LExit:
222 ReleaseObject(pGroup);
223 ReleaseBSTR(bstrUser);
224 ReleaseBSTR(bstrGroup);
225
226 return hr;
227}
228
229static HRESULT RemoveUserFromGroup(
230 __in LPWSTR wzUser,
231 __in LPCWSTR wzUserDomain,
232 __in LPCWSTR wzGroup,
233 __in LPCWSTR wzGroupDomain
234 )
235{
236 Assert(wzUser && *wzUser && wzUserDomain && wzGroup && *wzGroup && wzGroupDomain);
237
238 HRESULT hr = S_OK;
239 IADsGroup *pGroup = NULL;
240 BSTR bstrUser = NULL;
241 BSTR bstrGroup = NULL;
242 LPCWSTR wz = NULL;
243 LPWSTR pwzUser = NULL;
244 LOCALGROUP_MEMBERS_INFO_3 lgmi;
245
246 if (*wzGroupDomain)
247 {
248 wz = wzGroupDomain;
249 }
250
251 // Try removing it from the global group first
252 UINT ui = ::NetGroupDelUser(wz, wzGroup, wzUser);
253 if (NERR_GroupNotFound == ui)
254 {
255 // Try removing it from the local group
256 if (wzUserDomain)
257 {
258 hr = StrAllocFormatted(&pwzUser, L"%s\\%s", wzUserDomain, wzUser);
259 ExitOnFailure(hr, "failed to allocate user domain string");
260 }
261
262 lgmi.lgrmi3_domainandname = (NULL == pwzUser ? wzUser : pwzUser);
263 ui = ::NetLocalGroupDelMembers(wz, wzGroup, 3 , reinterpret_cast<LPBYTE>(&lgmi), 1);
264 }
265 hr = HRESULT_FROM_WIN32(ui);
266
267 //
268 // If we failed, try active directory
269 //
270 if (FAILED(hr))
271 {
272 WcaLog(LOGMSG_VERBOSE, "Failed to remove user: %ls, domain %ls from group: %ls, domain: %ls with error 0x%x. Attempting to use Active Directory", wzUser, wzUserDomain, wzGroup, wzGroupDomain, hr);
273
274 hr = UserCreateADsPath(wzUserDomain, wzUser, &bstrUser);
275 ExitOnFailure(hr, "failed to create user ADsPath in order to remove user: %ls domain: %ls from a group", wzUser, wzUserDomain);
276
277 hr = UserCreateADsPath(wzGroupDomain, wzGroup, &bstrGroup);
278 ExitOnFailure(hr, "failed to create group ADsPath in order to remove user from group: %ls domain: %ls", wzGroup, wzGroupDomain);
279
280 hr = ::ADsGetObject(bstrGroup,IID_IADsGroup, reinterpret_cast<void**>(&pGroup));
281 ExitOnFailure(hr, "Failed to get group '%ls'.", reinterpret_cast<WCHAR*>(bstrGroup) );
282
283 hr = pGroup->Remove(bstrUser);
284 ExitOnFailure(hr, "Failed to remove user %ls from group '%ls'.", reinterpret_cast<WCHAR*>(bstrUser), reinterpret_cast<WCHAR*>(bstrGroup) );
285 }
286
287LExit:
288 ReleaseObject(pGroup);
289 ReleaseBSTR(bstrUser);
290 ReleaseBSTR(bstrGroup);
291
292 return hr;
293}
294
295
296static HRESULT GetUserHasRight(
297 __in LSA_HANDLE hPolicy,
298 __in PSID pUserSid,
299 __in LPWSTR wzRight,
300 __out BOOL* fHasRight
301)
302{
303 HRESULT hr = S_OK;
304 NTSTATUS nt = 0;
305 LSA_UNICODE_STRING lucPrivilege = { 0 };
306 PLSA_ENUMERATION_INFORMATION rgSids = NULL;
307 ULONG cSids = 0;
308 *fHasRight = FALSE;
309
310 lucPrivilege.Buffer = wzRight;
311 lucPrivilege.Length = static_cast<USHORT>(lstrlenW(lucPrivilege.Buffer) * sizeof(WCHAR));
312 lucPrivilege.MaximumLength = (lucPrivilege.Length + 1) * sizeof(WCHAR);
313
314 nt = ::LsaEnumerateAccountsWithUserRight(hPolicy, &lucPrivilege, reinterpret_cast<PVOID*>(&rgSids), &cSids);
315 hr = HRESULT_FROM_WIN32(::LsaNtStatusToWinError(nt));
316 ExitOnFailure(hr, "Failed to enumerate users for right: %ls", lucPrivilege.Buffer);
317
318 for (DWORD i = 0; i < cSids; ++i)
319 {
320 PLSA_ENUMERATION_INFORMATION pInfo = rgSids + i;
321 if (::EqualSid(pUserSid, pInfo->Sid))
322 {
323 *fHasRight = TRUE;
324 break;
325 }
326 }
327
328LExit:
329 if (rgSids)
330 {
331 ::LsaFreeMemory(rgSids);
332 }
333
334 return hr;
335}
336
337
338static HRESULT GetExistingUserRightsAssignments(
339 __in_opt LPCWSTR wzDomain,
340 __in LPCWSTR wzName,
341 __inout int* iAttributes
342)
343{
344 HRESULT hr = S_OK;
345 NTSTATUS nt = 0;
346 BOOL fHasRight = FALSE;
347
348 LSA_HANDLE hPolicy = NULL;
349 LSA_OBJECT_ATTRIBUTES objectAttributes = { 0 };
350
351 LPWSTR pwzUser = NULL;
352 PSID psid = NULL;
353
354 if (wzDomain && *wzDomain)
355 {
356 hr = StrAllocFormatted(&pwzUser, L"%s\\%s", wzDomain, wzName);
357 ExitOnFailure(hr, "Failed to allocate user with domain string");
358 }
359 else
360 {
361 hr = StrAllocString(&pwzUser, wzName, 0);
362 ExitOnFailure(hr, "Failed to allocate string from user name.");
363 }
364
365 hr = AclGetAccountSid(NULL, pwzUser, &psid);
366 ExitOnFailure(hr, "Failed to get SID for user: %ls", pwzUser);
367
368 nt = ::LsaOpenPolicy(NULL, &objectAttributes, POLICY_LOOKUP_NAMES | POLICY_VIEW_LOCAL_INFORMATION, &hPolicy);
369 hr = HRESULT_FROM_WIN32(::LsaNtStatusToWinError(nt));
370 ExitOnFailure(hr, "Failed to open LSA policy store");
371
372 hr = GetUserHasRight(hPolicy, psid, L"SeServiceLogonRight", &fHasRight);
373 ExitOnFailure(hr, "Failed to check LogonAsService right");
374
375 if (fHasRight)
376 {
377 *iAttributes |= SCAU_ALLOW_LOGON_AS_SERVICE;
378 }
379
380 hr = GetUserHasRight(hPolicy, psid, L"SeBatchLogonRight", &fHasRight);
381 ExitOnFailure(hr, "Failed to check LogonAsBatchJob right");
382
383 if (fHasRight)
384 {
385 *iAttributes |= SCAU_ALLOW_LOGON_AS_BATCH;
386 }
387
388LExit:
389 if (hPolicy)
390 {
391 ::LsaClose(hPolicy);
392 }
393
394 ReleaseSid(psid);
395 ReleaseStr(pwzUser);
396 return hr;
397}
398
399
400static HRESULT ModifyUserLocalServiceRight(
401 __in_opt LPCWSTR wzDomain,
402 __in LPCWSTR wzName,
403 __in BOOL fAdd
404 )
405{
406 HRESULT hr = S_OK;
407 NTSTATUS nt = 0;
408
409 LPWSTR pwzUser = NULL;
410 PSID psid = NULL;
411 LSA_HANDLE hPolicy = NULL;
412 LSA_OBJECT_ATTRIBUTES ObjectAttributes = { 0 };
413 LSA_UNICODE_STRING lucPrivilege = { 0 };
414
415 if (wzDomain && *wzDomain)
416 {
417 hr = StrAllocFormatted(&pwzUser, L"%s\\%s", wzDomain, wzName);
418 ExitOnFailure(hr, "Failed to allocate user with domain string");
419 }
420 else
421 {
422 hr = StrAllocString(&pwzUser, wzName, 0);
423 ExitOnFailure(hr, "Failed to allocate string from user name.");
424 }
425
426 hr = AclGetAccountSid(NULL, pwzUser, &psid);
427 ExitOnFailure(hr, "Failed to get SID for user: %ls", pwzUser);
428
429 nt = ::LsaOpenPolicy(NULL, &ObjectAttributes, POLICY_ALL_ACCESS, &hPolicy);
430 hr = HRESULT_FROM_WIN32(::LsaNtStatusToWinError(nt));
431 ExitOnFailure(hr, "Failed to open LSA policy store.");
432
433 lucPrivilege.Buffer = L"SeServiceLogonRight";
434 lucPrivilege.Length = static_cast<USHORT>(lstrlenW(lucPrivilege.Buffer) * sizeof(WCHAR));
435 lucPrivilege.MaximumLength = (lucPrivilege.Length + 1) * sizeof(WCHAR);
436
437 if (fAdd)
438 {
439 nt = ::LsaAddAccountRights(hPolicy, psid, &lucPrivilege, 1);
440 hr = HRESULT_FROM_WIN32(::LsaNtStatusToWinError(nt));
441 ExitOnFailure(hr, "Failed to add 'logon as service' bit to user: %ls", pwzUser);
442 }
443 else
444 {
445 nt = ::LsaRemoveAccountRights(hPolicy, psid, FALSE, &lucPrivilege, 1);
446 hr = HRESULT_FROM_WIN32(::LsaNtStatusToWinError(nt));
447 ExitOnFailure(hr, "Failed to remove 'logon as service' bit from user: %ls", pwzUser);
448 }
449
450LExit:
451 if (hPolicy)
452 {
453 ::LsaClose(hPolicy);
454 }
455
456 ReleaseSid(psid);
457 ReleaseStr(pwzUser);
458 return hr;
459}
460
461
462static HRESULT ModifyUserLocalBatchRight(
463 __in_opt LPCWSTR wzDomain,
464 __in LPCWSTR wzName,
465 __in BOOL fAdd
466 )
467{
468 HRESULT hr = S_OK;
469 NTSTATUS nt = 0;
470
471 LPWSTR pwzUser = NULL;
472 PSID psid = NULL;
473 LSA_HANDLE hPolicy = NULL;
474 LSA_OBJECT_ATTRIBUTES ObjectAttributes = { 0 };
475 LSA_UNICODE_STRING lucPrivilege = { 0 };
476
477 if (wzDomain && *wzDomain)
478 {
479 hr = StrAllocFormatted(&pwzUser, L"%s\\%s", wzDomain, wzName);
480 ExitOnFailure(hr, "Failed to allocate user with domain string");
481 }
482 else
483 {
484 hr = StrAllocString(&pwzUser, wzName, 0);
485 ExitOnFailure(hr, "Failed to allocate string from user name.");
486 }
487
488 hr = AclGetAccountSid(NULL, pwzUser, &psid);
489 ExitOnFailure(hr, "Failed to get SID for user: %ls", pwzUser);
490
491 nt = ::LsaOpenPolicy(NULL, &ObjectAttributes, POLICY_ALL_ACCESS, &hPolicy);
492 hr = HRESULT_FROM_WIN32(::LsaNtStatusToWinError(nt));
493 ExitOnFailure(hr, "Failed to open LSA policy store.");
494
495 lucPrivilege.Buffer = L"SeBatchLogonRight";
496 lucPrivilege.Length = static_cast<USHORT>(lstrlenW(lucPrivilege.Buffer) * sizeof(WCHAR));
497 lucPrivilege.MaximumLength = (lucPrivilege.Length + 1) * sizeof(WCHAR);
498
499 if (fAdd)
500 {
501 nt = ::LsaAddAccountRights(hPolicy, psid, &lucPrivilege, 1);
502 hr = HRESULT_FROM_WIN32(::LsaNtStatusToWinError(nt));
503 ExitOnFailure(hr, "Failed to add 'logon as batch job' bit to user: %ls", pwzUser);
504 }
505 else
506 {
507 nt = ::LsaRemoveAccountRights(hPolicy, psid, FALSE, &lucPrivilege, 1);
508 hr = HRESULT_FROM_WIN32(::LsaNtStatusToWinError(nt));
509 ExitOnFailure(hr, "Failed to remove 'logon as batch job' bit from user: %ls", pwzUser);
510 }
511
512 LExit:
513 if (hPolicy)
514 {
515 ::LsaClose(hPolicy);
516 }
517
518 ReleaseSid(psid);
519 ReleaseStr(pwzUser);
520 return hr;
521}
522
523static void SetUserPasswordAndAttributes(
524 __in USER_INFO_1* puserInfo,
525 __in LPWSTR wzPassword,
526 __in int iAttributes
527 )
528{
529 Assert(puserInfo);
530
531 // Set the User's password
532 puserInfo->usri1_password = wzPassword;
533
534 // Apply the Attributes
535 if (SCAU_DONT_EXPIRE_PASSWRD & iAttributes)
536 {
537 puserInfo->usri1_flags |= UF_DONT_EXPIRE_PASSWD;
538 }
539 else
540 {
541 puserInfo->usri1_flags &= ~UF_DONT_EXPIRE_PASSWD;
542 }
543
544 if (SCAU_PASSWD_CANT_CHANGE & iAttributes)
545 {
546 puserInfo->usri1_flags |= UF_PASSWD_CANT_CHANGE;
547 }
548 else
549 {
550 puserInfo->usri1_flags &= ~UF_PASSWD_CANT_CHANGE;
551 }
552
553 if (SCAU_DISABLE_ACCOUNT & iAttributes)
554 {
555 puserInfo->usri1_flags |= UF_ACCOUNTDISABLE;
556 }
557 else
558 {
559 puserInfo->usri1_flags &= ~UF_ACCOUNTDISABLE;
560 }
561
562 if (SCAU_PASSWD_CHANGE_REQD_ON_LOGIN & iAttributes) // TODO: for some reason this doesn't work
563 {
564 puserInfo->usri1_flags |= UF_PASSWORD_EXPIRED;
565 }
566 else
567 {
568 puserInfo->usri1_flags &= ~UF_PASSWORD_EXPIRED;
569 }
570}
571
572
573static HRESULT RemoveUserInternal(
574 LPWSTR wzGroupCaData,
575 LPWSTR wzDomain,
576 LPWSTR wzName,
577 int iAttributes
578)
579{
580 HRESULT hr = S_OK;
581 UINT er = ERROR_SUCCESS;
582
583 LPWSTR pwz = NULL;
584 LPWSTR pwzGroup = NULL;
585 LPWSTR pwzGroupDomain = NULL;
586 LPCWSTR wz = NULL;
587 PDOMAIN_CONTROLLER_INFOW pDomainControllerInfo = NULL;
588
589 //
590 // Remove the logon as service privilege.
591 //
592 if (SCAU_ALLOW_LOGON_AS_SERVICE & iAttributes)
593 {
594 hr = ModifyUserLocalServiceRight(wzDomain, wzName, FALSE);
595 if (FAILED(hr))
596 {
597 WcaLogError(hr, "Failed to remove logon as service right from user, continuing...");
598 hr = S_OK;
599 }
600 }
601
602 if (SCAU_ALLOW_LOGON_AS_BATCH & iAttributes)
603 {
604 hr = ModifyUserLocalBatchRight(wzDomain, wzName, FALSE);
605 if (FAILED(hr))
606 {
607 WcaLogError(hr, "Failed to remove logon as batch job right from user, continuing...");
608 hr = S_OK;
609 }
610 }
611
612 //
613 // Remove the User Account if the user was created by us.
614 //
615 if (!(SCAU_DONT_CREATE_USER & iAttributes))
616 {
617 if (wzDomain && *wzDomain)
618 {
619 er = ::DsGetDcNameW(NULL, (LPCWSTR)wzDomain, NULL, NULL, NULL, &pDomainControllerInfo);
620 if (RPC_S_SERVER_UNAVAILABLE == er)
621 {
622 // MSDN says, if we get the above error code, try again with the "DS_FORCE_REDISCOVERY" flag
623 er = ::DsGetDcNameW(NULL, (LPCWSTR)wzDomain, NULL, NULL, DS_FORCE_REDISCOVERY, &pDomainControllerInfo);
624 }
625 if (ERROR_SUCCESS == er)
626 {
627 wz = pDomainControllerInfo->DomainControllerName + 2; //Add 2 so that we don't get the \\ prefix
628 }
629 else
630 {
631 wz = wzDomain;
632 }
633 }
634
635 er = ::NetUserDel(wz, wzName);
636 if (NERR_UserNotFound == er)
637 {
638 er = NERR_Success;
639 }
640 ExitOnFailure(hr = HRESULT_FROM_WIN32(er), "failed to delete user account: %ls", wzName);
641 }
642 else
643 {
644 //
645 // Remove the user from the groups
646 //
647 pwz = wzGroupCaData;
648 while (S_OK == (hr = WcaReadStringFromCaData(&pwz, &pwzGroup)))
649 {
650 hr = WcaReadStringFromCaData(&pwz, &pwzGroupDomain);
651
652 if (FAILED(hr))
653 {
654 WcaLogError(hr, "failed to get domain for group: %ls, continuing anyway.", pwzGroup);
655 }
656 else
657 {
658 hr = RemoveUserFromGroup(wzName, wzDomain, pwzGroup, pwzGroupDomain);
659 if (FAILED(hr))
660 {
661 WcaLogError(hr, "failed to remove user: %ls from group %ls, continuing anyway.", wzName, pwzGroup);
662 }
663 }
664 }
665
666 if (E_NOMOREITEMS == hr) // if there are no more items, all is well
667 {
668 hr = S_OK;
669 }
670
671 ExitOnFailure(hr, "failed to get next group from which to remove user:%ls", wzName);
672 }
673
674LExit:
675 if (pDomainControllerInfo)
676 {
677 ::NetApiBufferFree(static_cast<LPVOID>(pDomainControllerInfo));
678 }
679
680 return hr;
681}
682
683
684/********************************************************************
685 CreateUser - CUSTOM ACTION ENTRY POINT for creating users
686
687 Input: deferred CustomActionData - UserName\tDomain\tPassword\tAttributes\tGroupName\tDomain\tGroupName\tDomain...
688 * *****************************************************************/
689extern "C" UINT __stdcall CreateUser(
690 __in MSIHANDLE hInstall
691 )
692{
693 //AssertSz(0, "Debug CreateUser");
694
695 HRESULT hr = S_OK;
696 UINT er = ERROR_SUCCESS;
697
698 LPWSTR pwzData = NULL;
699 LPWSTR pwz = NULL;
700 LPWSTR pwzName = NULL;
701 LPWSTR pwzDomain = NULL;
702 LPWSTR pwzScriptKey = NULL;
703 LPWSTR pwzPassword = NULL;
704 LPWSTR pwzGroup = NULL;
705 LPWSTR pwzGroupDomain = NULL;
706 PDOMAIN_CONTROLLER_INFOW pDomainControllerInfo = NULL;
707 int iAttributes = 0;
708 BOOL fInitializedCom = FALSE;
709
710 WCA_CASCRIPT_HANDLE hRollbackScript = NULL;
711 int iOriginalAttributes = 0;
712 int iRollbackAttributes = 0;
713
714 USER_INFO_1 userInfo;
715 USER_INFO_1* puserInfo = NULL;
716 DWORD dw;
717 LPCWSTR wz = NULL;
718
719 hr = WcaInitialize(hInstall, "CreateUser");
720 ExitOnFailure(hr, "failed to initialize");
721
722 hr = ::CoInitialize(NULL);
723 ExitOnFailure(hr, "failed to initialize COM");
724 fInitializedCom = TRUE;
725
726 hr = WcaGetProperty( L"CustomActionData", &pwzData);
727 ExitOnFailure(hr, "failed to get CustomActionData");
728
729 WcaLog(LOGMSG_TRACEONLY, "CustomActionData: %ls", pwzData);
730
731 //
732 // Read in the CustomActionData
733 //
734 pwz = pwzData;
735 hr = WcaReadStringFromCaData(&pwz, &pwzName);
736 ExitOnFailure(hr, "failed to read user name from custom action data");
737
738 hr = WcaReadStringFromCaData(&pwz, &pwzDomain);
739 ExitOnFailure(hr, "failed to read domain from custom action data");
740
741 hr = WcaReadIntegerFromCaData(&pwz, &iAttributes);
742 ExitOnFailure(hr, "failed to read attributes from custom action data");
743
744 hr = WcaReadStringFromCaData(&pwz, &pwzScriptKey);
745 ExitOnFailure(hr, "failed to read encoding key from custom action data");
746
747 hr = WcaReadStringFromCaData(&pwz, &pwzPassword);
748 ExitOnFailure(hr, "failed to read password from custom action data");
749
750 // There is no rollback scheduled if the key is empty.
751 // Best effort to get original configuration and save it in the script so rollback can restore it.
752 if (*pwzScriptKey)
753 {
754 hr = WcaCaScriptCreate(WCA_ACTION_INSTALL, WCA_CASCRIPT_ROLLBACK, FALSE, pwzScriptKey, FALSE, &hRollbackScript);
755 ExitOnFailure(hr, "Failed to open rollback CustomAction script.");
756
757 iRollbackAttributes = 0;
758 hr = GetExistingUserRightsAssignments(pwzDomain, pwzName, &iOriginalAttributes);
759 if (FAILED(hr))
760 {
761 WcaLogError(hr, "failed to get existing user rights: %ls, continuing anyway.", pwzName);
762 }
763 else
764 {
765 if (!(SCAU_ALLOW_LOGON_AS_SERVICE & iOriginalAttributes) && (SCAU_ALLOW_LOGON_AS_SERVICE & iAttributes))
766 {
767 iRollbackAttributes |= SCAU_ALLOW_LOGON_AS_SERVICE;
768 }
769 if (!(SCAU_ALLOW_LOGON_AS_BATCH & iOriginalAttributes) && (SCAU_ALLOW_LOGON_AS_BATCH & iAttributes))
770 {
771 iRollbackAttributes |= SCAU_ALLOW_LOGON_AS_BATCH;
772 }
773 }
774
775 hr = WcaCaScriptWriteNumber(hRollbackScript, iRollbackAttributes);
776 ExitOnFailure(hr, "Failed to add data to rollback script.");
777
778 // Nudge the system to get all our rollback data written to disk.
779 WcaCaScriptFlush(hRollbackScript);
780 }
781
782 if (!(SCAU_DONT_CREATE_USER & iAttributes))
783 {
784 ::ZeroMemory(&userInfo, sizeof(USER_INFO_1));
785 userInfo.usri1_name = pwzName;
786 userInfo.usri1_priv = USER_PRIV_USER;
787 userInfo.usri1_flags = UF_SCRIPT;
788 userInfo.usri1_home_dir = NULL;
789 userInfo.usri1_comment = NULL;
790 userInfo.usri1_script_path = NULL;
791
792 SetUserPasswordAndAttributes(&userInfo, pwzPassword, iAttributes);
793
794 //
795 // Create the User
796 //
797 if (pwzDomain && *pwzDomain)
798 {
799 er = ::DsGetDcNameW( NULL, (LPCWSTR)pwzDomain, NULL, NULL, NULL, &pDomainControllerInfo );
800 if (RPC_S_SERVER_UNAVAILABLE == er)
801 {
802 // MSDN says, if we get the above error code, try again with the "DS_FORCE_REDISCOVERY" flag
803 er = ::DsGetDcNameW( NULL, (LPCWSTR)pwzDomain, NULL, NULL, DS_FORCE_REDISCOVERY, &pDomainControllerInfo );
804 }
805 if (ERROR_SUCCESS == er)
806 {
807 wz = pDomainControllerInfo->DomainControllerName + 2; //Add 2 so that we don't get the \\ prefix
808 }
809 else
810 {
811 wz = pwzDomain;
812 }
813 }
814
815 er = ::NetUserAdd(wz, 1, reinterpret_cast<LPBYTE>(&userInfo), &dw);
816 if (NERR_UserExists == er)
817 {
818 if (SCAU_UPDATE_IF_EXISTS & iAttributes)
819 {
820 er = ::NetUserGetInfo(wz, pwzName, 1, reinterpret_cast<LPBYTE*>(&puserInfo));
821 if (NERR_Success == er)
822 {
823 // Change the existing user's password and attributes again then try
824 // to update user with this new data
825 SetUserPasswordAndAttributes(puserInfo, pwzPassword, iAttributes);
826
827 er = ::NetUserSetInfo(wz, pwzName, 1, reinterpret_cast<LPBYTE>(puserInfo), &dw);
828 }
829 }
830 else if (!(SCAU_FAIL_IF_EXISTS & iAttributes))
831 {
832 er = NERR_Success;
833 }
834 }
835 else if (NERR_PasswordTooShort == er || NERR_PasswordTooLong == er)
836 {
837 MessageExitOnFailure(hr = HRESULT_FROM_WIN32(er), msierrUSRFailedUserCreatePswd, "failed to create user: %ls due to invalid password.", pwzName);
838 }
839 MessageExitOnFailure(hr = HRESULT_FROM_WIN32(er), msierrUSRFailedUserCreate, "failed to create user: %ls", pwzName);
840 }
841
842 if (SCAU_ALLOW_LOGON_AS_SERVICE & iAttributes)
843 {
844 hr = ModifyUserLocalServiceRight(pwzDomain, pwzName, TRUE);
845 MessageExitOnFailure(hr, msierrUSRFailedGrantLogonAsService, "Failed to grant logon as service rights to user: %ls", pwzName);
846 }
847
848 if (SCAU_ALLOW_LOGON_AS_BATCH & iAttributes)
849 {
850 hr = ModifyUserLocalBatchRight(pwzDomain, pwzName, TRUE);
851 MessageExitOnFailure(hr, msierrUSRFailedGrantLogonAsService, "Failed to grant logon as batch job rights to user: %ls", pwzName);
852 }
853
854 //
855 // Add the users to groups
856 //
857 while (S_OK == (hr = WcaReadStringFromCaData(&pwz, &pwzGroup)))
858 {
859 hr = WcaReadStringFromCaData(&pwz, &pwzGroupDomain);
860 ExitOnFailure(hr, "failed to get domain for group: %ls", pwzGroup);
861
862 hr = AddUserToGroup(pwzName, pwzDomain, pwzGroup, pwzGroupDomain);
863 MessageExitOnFailure(hr, msierrUSRFailedUserGroupAdd, "failed to add user: %ls to group %ls", pwzName, pwzGroup);
864 }
865 if (E_NOMOREITEMS == hr) // if there are no more items, all is well
866 {
867 hr = S_OK;
868 }
869 ExitOnFailure(hr, "failed to get next group in which to include user:%ls", pwzName);
870
871LExit:
872 WcaCaScriptClose(hRollbackScript, WCA_CASCRIPT_CLOSE_PRESERVE);
873
874 if (puserInfo)
875 {
876 ::NetApiBufferFree((LPVOID)puserInfo);
877 }
878
879 if (pDomainControllerInfo)
880 {
881 ::NetApiBufferFree((LPVOID)pDomainControllerInfo);
882 }
883
884 ReleaseStr(pwzData);
885 ReleaseStr(pwzName);
886 ReleaseStr(pwzDomain);
887 ReleaseStr(pwzScriptKey);
888 ReleaseStr(pwzPassword);
889 ReleaseStr(pwzGroup);
890 ReleaseStr(pwzGroupDomain);
891
892 if (fInitializedCom)
893 {
894 ::CoUninitialize();
895 }
896
897 if (SCAU_NON_VITAL & iAttributes)
898 {
899 er = ERROR_SUCCESS;
900 }
901 else if (FAILED(hr))
902 {
903 er = ERROR_INSTALL_FAILURE;
904 }
905
906 return WcaFinalize(er);
907}
908
909
910/********************************************************************
911 CreateUserRollback - CUSTOM ACTION ENTRY POINT for CreateUser rollback
912
913 * *****************************************************************/
914extern "C" UINT __stdcall CreateUserRollback(
915 MSIHANDLE hInstall
916)
917{
918 //AssertSz(0, "Debug CreateUserRollback");
919
920 HRESULT hr = S_OK;
921 UINT er = ERROR_SUCCESS;
922
923 LPWSTR pwzData = NULL;
924 LPWSTR pwz = NULL;
925 LPWSTR pwzName = NULL;
926 LPWSTR pwzDomain = NULL;
927 LPWSTR pwzScriptKey = NULL;
928 int iAttributes = 0;
929 BOOL fInitializedCom = FALSE;
930
931 WCA_CASCRIPT_HANDLE hRollbackScript = NULL;
932 LPWSTR pwzRollbackData = NULL;
933 int iOriginalAttributes = 0;
934
935 hr = WcaInitialize(hInstall, "CreateUserRollback");
936 ExitOnFailure(hr, "failed to initialize");
937
938 hr = ::CoInitialize(NULL);
939 ExitOnFailure(hr, "failed to initialize COM");
940 fInitializedCom = TRUE;
941
942 hr = WcaGetProperty(L"CustomActionData", &pwzData);
943 ExitOnFailure(hr, "failed to get CustomActionData");
944
945 WcaLog(LOGMSG_TRACEONLY, "CustomActionData: %ls", pwzData);
946
947 //
948 // Read in the CustomActionData
949 //
950 pwz = pwzData;
951 hr = WcaReadStringFromCaData(&pwz, &pwzScriptKey);
952 ExitOnFailure(hr, "failed to read encoding key from custom action data");
953
954 hr = WcaReadStringFromCaData(&pwz, &pwzName);
955 ExitOnFailure(hr, "failed to read name from custom action data");
956
957 hr = WcaReadStringFromCaData(&pwz, &pwzDomain);
958 ExitOnFailure(hr, "failed to read domain from custom action data");
959
960 hr = WcaReadIntegerFromCaData(&pwz, &iAttributes);
961 ExitOnFailure(hr, "failed to read attributes from custom action data");
962
963 // Best effort to read original configuration from CreateUser.
964 hr = WcaCaScriptOpen(WCA_ACTION_INSTALL, WCA_CASCRIPT_ROLLBACK, FALSE, pwzScriptKey, &hRollbackScript);
965 if (FAILED(hr))
966 {
967 WcaLogError(hr, "Failed to open rollback CustomAction script, continuing anyway.");
968 }
969 else
970 {
971 hr = WcaCaScriptReadAsCustomActionData(hRollbackScript, &pwzRollbackData);
972 if (FAILED(hr))
973 {
974 WcaLogError(hr, "Failed to read rollback script into CustomAction data, continuing anyway.");
975 }
976 else
977 {
978 WcaLog(LOGMSG_TRACEONLY, "Rollback Data: %ls", pwzRollbackData);
979
980 pwz = pwzRollbackData;
981 hr = WcaReadIntegerFromCaData(&pwz, &iOriginalAttributes);
982 if (FAILED(hr))
983 {
984 WcaLogError(hr, "failed to read attributes from rollback data, continuing anyway");
985 }
986 else
987 {
988 iAttributes |= iOriginalAttributes;
989 }
990 }
991 }
992
993 hr = RemoveUserInternal(pwz, pwzDomain, pwzName, iAttributes);
994
995LExit:
996 WcaCaScriptClose(hRollbackScript, WCA_CASCRIPT_CLOSE_DELETE);
997
998 ReleaseStr(pwzData);
999 ReleaseStr(pwzName);
1000 ReleaseStr(pwzDomain);
1001 ReleaseStr(pwzScriptKey);
1002 ReleaseStr(pwzRollbackData);
1003
1004 if (fInitializedCom)
1005 {
1006 ::CoUninitialize();
1007 }
1008
1009 if (FAILED(hr))
1010 {
1011 er = ERROR_INSTALL_FAILURE;
1012 }
1013
1014 return WcaFinalize(er);
1015}
1016
1017
1018/********************************************************************
1019 RemoveUser - CUSTOM ACTION ENTRY POINT for removing users
1020
1021 Input: deferred CustomActionData - Name\tDomain
1022 * *****************************************************************/
1023extern "C" UINT __stdcall RemoveUser(
1024 MSIHANDLE hInstall
1025)
1026{
1027 //AssertSz(0, "Debug RemoveUser");
1028
1029 HRESULT hr = S_OK;
1030 UINT er = ERROR_SUCCESS;
1031
1032 LPWSTR pwzData = NULL;
1033 LPWSTR pwz = NULL;
1034 LPWSTR pwzName = NULL;
1035 LPWSTR pwzDomain = NULL;
1036 int iAttributes = 0;
1037 BOOL fInitializedCom = FALSE;
1038
1039 hr = WcaInitialize(hInstall, "RemoveUser");
1040 ExitOnFailure(hr, "failed to initialize");
1041
1042 hr = ::CoInitialize(NULL);
1043 ExitOnFailure(hr, "failed to initialize COM");
1044 fInitializedCom = TRUE;
1045
1046 hr = WcaGetProperty(L"CustomActionData", &pwzData);
1047 ExitOnFailure(hr, "failed to get CustomActionData");
1048
1049 WcaLog(LOGMSG_TRACEONLY, "CustomActionData: %ls", pwzData);
1050
1051 //
1052 // Read in the CustomActionData
1053 //
1054 pwz = pwzData;
1055 hr = WcaReadStringFromCaData(&pwz, &pwzName);
1056 ExitOnFailure(hr, "failed to read name from custom action data");
1057
1058 hr = WcaReadStringFromCaData(&pwz, &pwzDomain);
1059 ExitOnFailure(hr, "failed to read domain from custom action data");
1060
1061 hr = WcaReadIntegerFromCaData(&pwz, &iAttributes);
1062 ExitOnFailure(hr, "failed to read attributes from custom action data");
1063
1064 hr = RemoveUserInternal(pwz, pwzDomain, pwzName, iAttributes);
1065
1066LExit:
1067 ReleaseStr(pwzData);
1068 ReleaseStr(pwzName);
1069 ReleaseStr(pwzDomain);
1070
1071 if (fInitializedCom)
1072 {
1073 ::CoUninitialize();
1074 }
1075
1076 if (FAILED(hr))
1077 {
1078 er = ERROR_INSTALL_FAILURE;
1079 }
1080
1081 return WcaFinalize(er);
1082}
diff --git a/src/ext/Util/ca/scamanifest.cpp b/src/ext/Util/ca/scamanifest.cpp
new file mode 100644
index 00000000..adb8d3d3
--- /dev/null
+++ b/src/ext/Util/ca/scamanifest.cpp
@@ -0,0 +1,377 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3#include "precomp.h"
4
5LPCWSTR vcsPerfmonManifestQuery = L"SELECT `Component_`, `File`, `ResourceFileDirectory` FROM `Wix4PerfmonManifest`";
6LPCWSTR vcsEventManifestQuery = L"SELECT `Component_`, `File` FROM `Wix4EventManifest`";
7enum ePerfMonManifestQuery { pfmComponent = 1, pfmFile, pfmResourceFileDir };
8enum eEventManifestQuery { emComponent = 1, emFile};
9
10BOOL IsVistaOrAbove()
11{
12 OSVERSIONINFO osvi;
13 ZeroMemory(&osvi, sizeof(OSVERSIONINFO));
14 osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
15 #pragma warning(suppress: 4996) //TODO: use non-deprecated function to check OS version
16 if (!::GetVersionEx(&osvi))
17 {
18 return false;
19 }
20 return osvi.dwMajorVersion >= 6;
21}
22
23
24/********************************************************************
25 ConfigurePerfmonManifestRegister - CUSTOM ACTION ENTRY POINT for scheduling
26 Perfmon counter manifest registering
27
28********************************************************************/
29extern "C" UINT __stdcall ConfigurePerfmonManifestRegister(
30 __in MSIHANDLE hInstall
31 )
32{
33 HRESULT hr;
34 UINT er = ERROR_SUCCESS;
35
36 PMSIHANDLE hView, hRec;
37 LPWSTR pwzData = NULL, pwzResourceFilePath = NULL, pwzFile = NULL, pwzCommand = NULL;
38 INSTALLSTATE isInstalled, isAction;
39
40 hr = WcaInitialize(hInstall, "ConfigurePerfmonManifestReg");
41 ExitOnFailure(hr, "Failed to initialize");
42
43 if (!IsVistaOrAbove())
44 {
45 WcaLog(LOGMSG_VERBOSE, "Skipping ConfigurePerfmonManifestRegister() because the target system does not support perfmon manifest");
46 ExitFunction1(hr = S_FALSE);
47 }
48 // check to see if necessary tables are specified
49 if (S_OK != WcaTableExists(L"Wix4PerfmonManifest"))
50 {
51 WcaLog(LOGMSG_VERBOSE, "Skipping ConfigurePerfmonManifestRegister() because Wix4PerfmonManifest table not present");
52 ExitFunction1(hr = S_FALSE);
53 }
54
55 hr = WcaOpenExecuteView(vcsPerfmonManifestQuery, &hView);
56 ExitOnFailure(hr, "failed to open view on PerfMonManifest table");
57 while ((hr = WcaFetchRecord(hView, &hRec)) == S_OK)
58 {
59 // get component install state
60 hr = WcaGetRecordString(hRec, pfmComponent, &pwzData);
61 ExitOnFailure(hr, "failed to get Component for PerfMonManifest");
62 er = ::MsiGetComponentStateW(hInstall, pwzData, &isInstalled, &isAction);
63 hr = HRESULT_FROM_WIN32(er);
64 ExitOnFailure(hr, "failed to get Component state for PerfMonManifest");
65 if (!WcaIsInstalling(isInstalled, isAction))
66 {
67 continue;
68 }
69
70 hr = WcaGetRecordFormattedString(hRec, pfmFile, &pwzFile);
71 ExitOnFailure(hr, "failed to get File for PerfMonManifest");
72
73 hr = WcaGetRecordFormattedString(hRec, pfmResourceFileDir, &pwzResourceFilePath);
74 ExitOnFailure(hr, "failed to get ApplicationIdentity for PerfMonManifest");
75 size_t iResourcePath = lstrlenW(pwzResourceFilePath);
76 if ( iResourcePath > 0 && *(pwzResourceFilePath + iResourcePath -1) == L'\\')
77 *(pwzResourceFilePath + iResourcePath -1) = 0; //remove the trailing '\'
78
79 hr = StrAllocFormatted(&pwzCommand, L"\"unlodctr.exe\" /m:\"%s\"", pwzFile);
80 ExitOnFailure(hr, "failed to copy string in PerfMonManifest");
81
82 hr = WcaDoDeferredAction(CUSTOM_ACTION_DECORATION(L"RollbackRegisterPerfmonManifest"), pwzCommand, COST_PERFMONMANIFEST_UNREGISTER);
83 ExitOnFailure(hr, "failed to schedule RollbackRegisterPerfmonManifest action");
84
85 if ( *pwzResourceFilePath )
86 {
87 hr = StrAllocFormatted(&pwzCommand, L"\"lodctr.exe\" /m:\"%s\" \"%s\"", pwzFile, pwzResourceFilePath);
88 ExitOnFailure(hr, "failed to copy string in PerfMonManifest");
89 }
90 else
91 {
92 hr = StrAllocFormatted(&pwzCommand, L"\"lodctr.exe\" /m:\"%s\"", pwzFile);
93 ExitOnFailure(hr, "failed to copy string in PerfMonManifest");
94 }
95
96 WcaLog(LOGMSG_VERBOSE, "RegisterPerfmonManifest's CustomActionData: '%ls'", pwzCommand);
97
98 hr = WcaDoDeferredAction(CUSTOM_ACTION_DECORATION(L"RegisterPerfmonManifest"), pwzCommand, COST_PERFMONMANIFEST_REGISTER);
99 ExitOnFailure(hr, "failed to schedule RegisterPerfmonManifest action");
100 }
101
102 if (hr == E_NOMOREITEMS)
103 {
104 hr = S_OK;
105 }
106 ExitOnFailure(hr, "Failure while processing PerfMonManifest");
107
108 hr = S_OK;
109
110LExit:
111 ReleaseStr(pwzData);
112 ReleaseStr(pwzResourceFilePath);
113 ReleaseStr(pwzFile);
114 ReleaseStr(pwzCommand);
115
116 er = SUCCEEDED(hr) ? ERROR_SUCCESS : ERROR_INSTALL_FAILURE;
117 return WcaFinalize(er);
118}
119
120
121/********************************************************************
122 ConfigurePerfmonUninstall - CUSTOM ACTION ENTRY POINT for uninstalling
123 Perfmon counters
124
125********************************************************************/
126extern "C" UINT __stdcall ConfigurePerfmonManifestUnregister(
127 __in MSIHANDLE hInstall
128 )
129{
130 HRESULT hr;
131 UINT er = ERROR_SUCCESS;
132
133 PMSIHANDLE hView, hRec;
134 LPWSTR pwzData = NULL, pwzResourceFilePath = NULL, pwzFile = NULL, pwzCommand = NULL;
135 INSTALLSTATE isInstalled, isAction;
136
137 hr = WcaInitialize(hInstall, "ConfigurePerfmonManifestUnreg");
138 ExitOnFailure(hr, "Failed to initialize");
139
140 if (!IsVistaOrAbove())
141 {
142 WcaLog(LOGMSG_VERBOSE, "Skipping ConfigurePerfmonManifestUnregister() because the target system does not support perfmon manifest");
143 ExitFunction1(hr = S_FALSE);
144 }
145 // check to see if necessary tables are specified
146 if (WcaTableExists(L"Wix4PerfmonManifest") != S_OK)
147 {
148 WcaLog(LOGMSG_VERBOSE, "Skipping ConfigurePerfmonManifestUnregister() because Wix4PerfmonManifest table not present");
149 ExitFunction1(hr = S_FALSE);
150 }
151
152 hr = WcaOpenExecuteView(vcsPerfmonManifestQuery, &hView);
153 ExitOnFailure(hr, "failed to open view on Wix4PerfmonManifest table");
154 while ((hr = WcaFetchRecord(hView, &hRec)) == S_OK)
155 {
156 // get component install state
157 hr = WcaGetRecordString(hRec, pfmComponent, &pwzData);
158 ExitOnFailure(hr, "failed to get Component for Wix4PerfmonManifest");
159 er = ::MsiGetComponentStateW(hInstall, pwzData, &isInstalled, &isAction);
160 hr = HRESULT_FROM_WIN32(er);
161 ExitOnFailure(hr, "failed to get Component state for Wix4PerfmonManifest");
162 if (!WcaIsUninstalling(isInstalled, isAction))
163 {
164 continue;
165 }
166
167 hr = WcaGetRecordFormattedString(hRec, pfmFile, &pwzFile);
168 ExitOnFailure(hr, "failed to get File for Wix4PerfmonManifest");
169
170 hr = WcaGetRecordFormattedString(hRec, pfmResourceFileDir, &pwzResourceFilePath);
171 ExitOnFailure(hr, "failed to get ApplicationIdentity for Wix4PerfmonManifest");
172 size_t iResourcePath = lstrlenW(pwzResourceFilePath);
173 if ( iResourcePath > 0 && *(pwzResourceFilePath + iResourcePath -1) == L'\\')
174 *(pwzResourceFilePath + iResourcePath -1) = 0; //remove the trailing '\'
175
176 hr = StrAllocFormatted(&pwzCommand, L"\"lodctr.exe\" /m:\"%s\" \"%s\"", pwzFile, pwzResourceFilePath);
177 ExitOnFailure(hr, "failed to copy string in Wix4PerfmonManifest");
178
179 hr = WcaDoDeferredAction(CUSTOM_ACTION_DECORATION(L"RollbackUnregisterPerfmonManifest"), pwzCommand, COST_PERFMONMANIFEST_REGISTER);
180 ExitOnFailure(hr, "failed to schedule RollbackUnregisterPerfmonManifest action");
181
182 hr = StrAllocFormatted(&pwzCommand, L"\"unlodctr.exe\" /m:\"%s\"", pwzFile);
183 ExitOnFailure(hr, "failed to copy string in PerfMonManifest");
184
185 WcaLog(LOGMSG_VERBOSE, "UnRegisterPerfmonManifest's CustomActionData: '%ls'", pwzCommand);
186
187 hr = WcaDoDeferredAction(CUSTOM_ACTION_DECORATION(L"UnregisterPerfmonManifest"), pwzCommand, COST_PERFMONMANIFEST_UNREGISTER);
188 ExitOnFailure(hr, "failed to schedule UnregisterPerfmonManifest action");
189 }
190
191 if (hr == E_NOMOREITEMS)
192 {
193 hr = S_OK;
194 }
195 ExitOnFailure(hr, "Failure while processing PerfMonManifest");
196
197 hr = S_OK;
198
199LExit:
200 ReleaseStr(pwzData);
201 ReleaseStr(pwzResourceFilePath);
202 ReleaseStr(pwzFile);
203 ReleaseStr(pwzCommand);
204
205 er = SUCCEEDED(hr) ? ERROR_SUCCESS : ERROR_INSTALL_FAILURE;
206 return WcaFinalize(er);
207}
208
209/********************************************************************
210 ConfigureEventManifestRegister - CUSTOM ACTION ENTRY POINT for scheduling
211 Event manifest registering
212
213********************************************************************/
214extern "C" UINT __stdcall ConfigureEventManifestRegister(
215 __in MSIHANDLE hInstall
216 )
217{
218 HRESULT hr;
219 UINT er = ERROR_SUCCESS;
220
221 PMSIHANDLE hView, hRec;
222 LPWSTR pwzData = NULL, pwzFile = NULL, pwzCommand = NULL;
223 INSTALLSTATE isInstalled, isAction;
224
225 hr = WcaInitialize(hInstall, "ConfigureEventManifestReg");
226 ExitOnFailure(hr, "Failed to initialize");
227
228 if (!IsVistaOrAbove())
229 {
230 WcaLog(LOGMSG_VERBOSE, "Skipping ConfigureEventManifestRegister() because the target system does not support event manifest");
231 ExitFunction1(hr = S_FALSE);
232 }
233 // check to see if necessary tables are specified
234 if (S_OK != WcaTableExists(L"Wix4EventManifest"))
235 {
236 WcaLog(LOGMSG_VERBOSE, "Skipping ConfigureEventManifestRegister() because Wix4EventManifest table not present");
237 ExitFunction1(hr = S_FALSE);
238 }
239
240 hr = WcaOpenExecuteView(vcsEventManifestQuery, &hView);
241 ExitOnFailure(hr, "failed to open view on Wix4EventManifest table");
242 while ((hr = WcaFetchRecord(hView, &hRec)) == S_OK)
243 {
244 // get component install state
245 hr = WcaGetRecordString(hRec, emComponent, &pwzData);
246 ExitOnFailure(hr, "failed to get Component for Wix4EventManifest");
247 er = ::MsiGetComponentStateW(hInstall, pwzData, &isInstalled, &isAction);
248 hr = HRESULT_FROM_WIN32(er);
249 ExitOnFailure(hr, "failed to get Component state for Wix4EventManifest");
250 if (!WcaIsInstalling(isInstalled, isAction))
251 {
252 continue;
253 }
254
255 hr = WcaGetRecordFormattedString(hRec, emFile, &pwzFile);
256 ExitOnFailure(hr, "failed to get File for Wix4EventManifest");
257
258 hr = StrAllocFormatted(&pwzCommand, L"\"wevtutil.exe\" um \"%s\"", pwzFile);
259 ExitOnFailure(hr, "failed to copy string in Wix4EventManifest");
260
261 hr = WcaDoDeferredAction(CUSTOM_ACTION_DECORATION(L"RollbackRegisterEventManifest"), pwzCommand, COST_PERFMONMANIFEST_UNREGISTER);
262 ExitOnFailure(hr, "failed to schedule RollbackRegisterEventManifest action");
263
264 hr = StrAllocFormatted(&pwzCommand, L"\"wevtutil.exe\" im \"%s\"", pwzFile);
265 ExitOnFailure(hr, "failed to copy string in Wix4EventManifest");
266 WcaLog(LOGMSG_VERBOSE, "RegisterEventManifest's CustomActionData: '%ls'", pwzCommand);
267
268 hr = WcaDoDeferredAction(CUSTOM_ACTION_DECORATION(L"RegisterEventManifest"), pwzCommand, COST_EVENTMANIFEST_REGISTER);
269 ExitOnFailure(hr, "failed to schedule RegisterEventManifest action");
270 }
271
272 if (hr == E_NOMOREITEMS)
273 {
274 hr = S_OK;
275 }
276 ExitOnFailure(hr, "Failure while processing Wix4EventManifest");
277
278 hr = S_OK;
279
280LExit:
281 ReleaseStr(pwzData);
282 ReleaseStr(pwzFile);
283 ReleaseStr(pwzCommand);
284
285 er = SUCCEEDED(hr) ? ERROR_SUCCESS : ERROR_INSTALL_FAILURE;
286 return WcaFinalize(er);
287}
288
289
290
291/********************************************************************
292 ConfigureEventManifestRegister - CUSTOM ACTION ENTRY POINT for scheduling
293 Event manifest registering
294
295********************************************************************/
296extern "C" UINT __stdcall ConfigureEventManifestUnregister(
297 __in MSIHANDLE hInstall
298 )
299{
300 HRESULT hr;
301 UINT er = ERROR_SUCCESS;
302
303 PMSIHANDLE hView, hRec;
304 LPWSTR pwzData = NULL, pwzFile = NULL, pwzCommand = NULL;
305 INSTALLSTATE isInstalled, isAction;
306
307 hr = WcaInitialize(hInstall, "ConfigureEventManifestUnreg");
308 ExitOnFailure(hr, "Failed to initialize");
309
310 if (!IsVistaOrAbove())
311 {
312 WcaLog(LOGMSG_VERBOSE, "Skipping ConfigureEventManifestUnregister() because the target system does not support event manifest");
313 ExitFunction1(hr = S_FALSE);
314 }
315 // check to see if necessary tables are specified
316 if (S_OK != WcaTableExists(L"Wix4EventManifest"))
317 {
318 WcaLog(LOGMSG_VERBOSE, "Skipping ConfigureEventManifestUnregister() because Wix4EventManifest table not present");
319 ExitFunction1(hr = S_FALSE);
320 }
321
322 hr = WcaOpenExecuteView(vcsEventManifestQuery, &hView);
323 ExitOnFailure(hr, "failed to open view on Wix4EventManifest table");
324 while ((hr = WcaFetchRecord(hView, &hRec)) == S_OK)
325 {
326 // get component install state
327 hr = WcaGetRecordString(hRec, emComponent, &pwzData);
328 ExitOnFailure(hr, "failed to get Component for Wix4EventManifest");
329 er = ::MsiGetComponentStateW(hInstall, pwzData, &isInstalled, &isAction);
330 hr = HRESULT_FROM_WIN32(er);
331 ExitOnFailure(hr, "failed to get Component state for Wix4EventManifest");
332
333 // nothing to do on an install
334 // schedule the rollback action when reinstalling to re-register pre-patch manifest
335 if (!WcaIsUninstalling(isInstalled, isAction) && !WcaIsReInstalling(isInstalled, isAction))
336 {
337 continue;
338 }
339
340 hr = WcaGetRecordFormattedString(hRec, emFile, &pwzFile);
341 ExitOnFailure(hr, "failed to get File for Wix4EventManifest");
342
343 hr = StrAllocFormatted(&pwzCommand, L"\"wevtutil.exe\" im \"%s\"", pwzFile);
344 ExitOnFailure(hr, "failed to copy string in Wix4EventManifest");
345
346 hr = WcaDoDeferredAction(CUSTOM_ACTION_DECORATION(L"RollbackUnregisterEventManifest"), pwzCommand, COST_PERFMONMANIFEST_REGISTER);
347 ExitOnFailure(hr, "failed to schedule RollbackUnregisterEventManifest action");
348
349 // no need to uninstall on a repair/patch. Register action will re-register and update the manifest.
350 if (!WcaIsReInstalling(isInstalled, isAction))
351 {
352 hr = StrAllocFormatted(&pwzCommand, L"\"wevtutil.exe\" um \"%s\"", pwzFile);
353 ExitOnFailure(hr, "failed to copy string in Wix4EventManifest");
354 WcaLog(LOGMSG_VERBOSE, "UnregisterEventManifest's CustomActionData: '%ls'", pwzCommand);
355
356 hr = WcaDoDeferredAction(CUSTOM_ACTION_DECORATION(L"UnregisterEventManifest"), pwzCommand, COST_PERFMONMANIFEST_UNREGISTER);
357 ExitOnFailure(hr, "failed to schedule UnregisterEventManifest action");
358 }
359 }
360
361 if (hr == E_NOMOREITEMS)
362 {
363 hr = S_OK;
364 }
365 ExitOnFailure(hr, "Failure while processing Wix4EventManifest");
366
367 hr = S_OK;
368
369LExit:
370 ReleaseStr(pwzData);
371 ReleaseStr(pwzFile);
372 ReleaseStr(pwzCommand);
373
374 er = SUCCEEDED(hr) ? ERROR_SUCCESS : ERROR_INSTALL_FAILURE;
375 return WcaFinalize(er);
376}
377
diff --git a/src/ext/Util/ca/scaperf.cpp b/src/ext/Util/ca/scaperf.cpp
new file mode 100644
index 00000000..fd301278
--- /dev/null
+++ b/src/ext/Util/ca/scaperf.cpp
@@ -0,0 +1,310 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3#include "precomp.h"
4
5LPCWSTR vcsPerfCounterDataQuery = L"SELECT `Wix4PerformanceCategory`, `Component_`, `Name`, `IniData`, `ConstantData` FROM `Wix4PerformanceCategory`";
6enum ePerfCounterDataQuery { pcdqId = 1, pcdqComponent, pcdqName, pcdqIniData, pcdqConstantData };
7
8LPCWSTR vcsPerfMonQuery = L"SELECT `Component_`, `File`, `Name` FROM `Wix4Perfmon`";
9enum ePerfMonQuery { pmqComponent = 1, pmqFile, pmqName };
10
11
12static HRESULT ProcessPerformanceCategory(
13 __in MSIHANDLE hInstall,
14 __in BOOL fInstall
15 );
16
17
18/********************************************************************
19 InstallPerfCounterData - CUSTOM ACTION ENTRY POINT for installing
20 Performance Counters.
21
22********************************************************************/
23extern "C" UINT __stdcall InstallPerfCounterData(
24 __in MSIHANDLE hInstall
25 )
26{
27 // AssertSz(FALSE, "debug InstallPerfCounterData{}");
28 HRESULT hr;
29 UINT er = ERROR_SUCCESS;
30
31 hr = WcaInitialize(hInstall, "InstallPerfCounterData");
32 ExitOnFailure(hr, "Failed to initialize InstallPerfCounterData.");
33
34 hr = ProcessPerformanceCategory(hInstall, TRUE);
35 MessageExitOnFailure(hr, msierrInstallPerfCounterData, "Failed to process Wix4PerformanceCategory table.");
36
37LExit:
38 er = SUCCEEDED(hr) ? ERROR_SUCCESS : ERROR_INSTALL_FAILURE;
39 return WcaFinalize(er);
40}
41
42
43/********************************************************************
44 UninstallPerfCounterData - CUSTOM ACTION ENTRY POINT for installing
45 Performance Counters.
46
47********************************************************************/
48extern "C" UINT __stdcall UninstallPerfCounterData(
49 __in MSIHANDLE hInstall
50 )
51{
52 // AssertSz(FALSE, "debug UninstallPerfCounterData{}");
53 HRESULT hr;
54 UINT er = ERROR_SUCCESS;
55
56 hr = WcaInitialize(hInstall, "UninstallPerfCounterData");
57 ExitOnFailure(hr, "Failed to initialize UninstallPerfCounterData.");
58
59 hr = ProcessPerformanceCategory(hInstall, FALSE);
60 MessageExitOnFailure(hr, msierrUninstallPerfCounterData, "Failed to process Wix4PerformanceCategory table.");
61
62LExit:
63 er = SUCCEEDED(hr) ? ERROR_SUCCESS : ERROR_INSTALL_FAILURE;
64 return WcaFinalize(er);
65}
66
67
68/********************************************************************
69 RegisterPerfmon - CUSTOM ACTION ENTRY POINT for installing Perfmon counters
70
71********************************************************************/
72extern "C" UINT __stdcall ConfigurePerfmonInstall(
73 __in MSIHANDLE hInstall
74 )
75{
76// Assert(FALSE);
77 HRESULT hr;
78 UINT er = ERROR_SUCCESS;
79
80 PMSIHANDLE hView, hRec;
81 LPWSTR pwzData = NULL, pwzName = NULL, pwzFile = NULL;
82 INSTALLSTATE isInstalled, isAction;
83
84 hr = WcaInitialize(hInstall, "ConfigurePerfmonInstall");
85 ExitOnFailure(hr, "Failed to initialize");
86
87 // check to see if necessary tables are specified
88 if (S_OK != WcaTableExists(L"Wix4Perfmon"))
89 {
90 WcaLog(LOGMSG_VERBOSE, "Skipping RegisterPerfmon() because Wix4Perfmon table not present");
91 ExitFunction1(hr = S_FALSE);
92 }
93
94 hr = WcaOpenExecuteView(vcsPerfMonQuery, &hView);
95 ExitOnFailure(hr, "failed to open view on PerfMon table");
96 while ((hr = WcaFetchRecord(hView, &hRec)) == S_OK)
97 {
98 // get component install state
99 hr = WcaGetRecordString(hRec, pmqComponent, &pwzData);
100 ExitOnFailure(hr, "failed to get Component for PerfMon");
101 er = ::MsiGetComponentStateW(hInstall, pwzData, &isInstalled, &isAction);
102 hr = HRESULT_FROM_WIN32(er);
103 ExitOnFailure(hr, "failed to get Component state for PerfMon");
104 if (!WcaIsInstalling(isInstalled, isAction))
105 {
106 continue;
107 }
108
109 hr = WcaGetRecordString(hRec, pmqName, &pwzName);
110 ExitOnFailure(hr, "failed to get Name for PerfMon");
111
112 hr = WcaGetRecordFormattedString(hRec, pmqFile, &pwzFile);
113 ExitOnFailure(hr, "failed to get File for PerfMon");
114
115 WcaLog(LOGMSG_VERBOSE, "ConfigurePerfmonInstall's CustomActionData: '%ls', '%ls'", pwzName, pwzFile);
116 hr = WcaDoDeferredAction(CUSTOM_ACTION_DECORATION(L"RegisterPerfmon"), pwzFile, COST_PERFMON_REGISTER);
117 ExitOnFailure(hr, "failed to schedule RegisterPerfmon action");
118 hr = WcaDoDeferredAction(CUSTOM_ACTION_DECORATION(L"RollbackRegisterPerfmon"), pwzName, COST_PERFMON_UNREGISTER);
119 ExitOnFailure(hr, "failed to schedule RollbackRegisterPerfmon action");
120 }
121
122 if (hr == E_NOMOREITEMS)
123 {
124 hr = S_OK;
125 }
126 ExitOnFailure(hr, "Failure while processing PerfMon");
127
128 hr = S_OK;
129
130LExit:
131 ReleaseStr(pwzData);
132 ReleaseStr(pwzName);
133 ReleaseStr(pwzFile);
134
135 er = SUCCEEDED(hr) ? ERROR_SUCCESS : ERROR_INSTALL_FAILURE;
136 return WcaFinalize(er);
137}
138
139
140/********************************************************************
141 ConfigurePerfmonUninstall - CUSTOM ACTION ENTRY POINT for uninstalling
142 Perfmon counters
143
144********************************************************************/
145extern "C" UINT __stdcall ConfigurePerfmonUninstall(
146 __in MSIHANDLE hInstall
147 )
148{
149// Assert(FALSE);
150 HRESULT hr;
151 UINT er = ERROR_SUCCESS;
152
153 PMSIHANDLE hView, hRec;
154 LPWSTR pwzData = NULL, pwzName = NULL, pwzFile = NULL;
155 INSTALLSTATE isInstalled, isAction;
156
157 hr = WcaInitialize(hInstall, "ConfigurePerfmonUninstall");
158 ExitOnFailure(hr, "Failed to initialize");
159
160 // check to see if necessary tables are specified
161 if (WcaTableExists(L"Wix4Perfmon") != S_OK)
162 {
163 WcaLog(LOGMSG_VERBOSE, "Skipping UnregisterPerfmon() because Wix4Perfmon table not present");
164 ExitFunction1(hr = S_FALSE);
165 }
166
167 hr = WcaOpenExecuteView(vcsPerfMonQuery, &hView);
168 ExitOnFailure(hr, "failed to open view on PerfMon table");
169 while ((hr = WcaFetchRecord(hView, &hRec)) == S_OK)
170 {
171 // get component install state
172 hr = WcaGetRecordString(hRec, pmqComponent, &pwzData);
173 ExitOnFailure(hr, "failed to get Component for PerfMon");
174 er = ::MsiGetComponentStateW(hInstall, pwzData, &isInstalled, &isAction);
175 hr = HRESULT_FROM_WIN32(er);
176 ExitOnFailure(hr, "failed to get Component state for PerfMon");
177 if (!WcaIsUninstalling(isInstalled, isAction))
178 {
179 continue;
180 }
181
182 hr = WcaGetRecordString(hRec, pmqName, &pwzName);
183 ExitOnFailure(hr, "failed to get Name for PerfMon");
184
185 hr = WcaGetRecordFormattedString(hRec, pmqFile, &pwzFile);
186 ExitOnFailure(hr, "failed to get File for PerfMon");
187
188 WcaLog(LOGMSG_VERBOSE, "ConfigurePerfmonUninstall's CustomActionData: '%ls', '%ls'", pwzName, pwzFile);
189 hr = WcaDoDeferredAction(CUSTOM_ACTION_DECORATION(L"UnregisterPerfmon"), pwzName, COST_PERFMON_UNREGISTER);
190 ExitOnFailure(hr, "failed to schedule UnregisterPerfmon action");
191 hr = WcaDoDeferredAction(CUSTOM_ACTION_DECORATION(L"RollbackUnregisterPerfmon"), pwzFile, COST_PERFMON_REGISTER);
192 ExitOnFailure(hr, "failed to schedule RollbackUnregisterPerfmon action");
193 }
194
195 if (hr == E_NOMOREITEMS)
196 {
197 hr = S_OK;
198 }
199 ExitOnFailure(hr, "Failure while processing PerfMon");
200
201 hr = S_OK;
202
203LExit:
204 ReleaseStr(pwzData);
205 ReleaseStr(pwzName);
206 ReleaseStr(pwzFile);
207
208 er = SUCCEEDED(hr) ? ERROR_SUCCESS : ERROR_INSTALL_FAILURE;
209 return WcaFinalize(er);
210}
211
212
213
214static HRESULT ProcessPerformanceCategory(
215 __in MSIHANDLE hInstall,
216 __in BOOL fInstall
217 )
218{
219 HRESULT hr = S_OK;
220 DWORD er = ERROR_SUCCESS;
221
222 PMSIHANDLE hView, hRec;
223 LPWSTR pwzId = NULL;
224 LPWSTR pwzComponent = NULL;
225 LPWSTR pwzName = NULL;
226 LPWSTR pwzData = NULL;
227 INSTALLSTATE isInstalled, isAction;
228
229 LPWSTR pwzCustomActionData = NULL;
230
231 // check to see if necessary tables are specified
232 if (S_OK != WcaTableExists(L"Wix4PerformanceCategory"))
233 {
234 ExitFunction1(hr = S_FALSE);
235 }
236
237 hr = WcaOpenExecuteView(vcsPerfCounterDataQuery, &hView);
238 ExitOnFailure(hr, "failed to open view on Wix4PerformanceCategory table");
239 while (S_OK == (hr = WcaFetchRecord(hView, &hRec)))
240 {
241 hr = WcaGetRecordString(hRec, pcdqId, &pwzId);
242 ExitOnFailure(hr, "Failed to get id for Wix4PerformanceCategory.");
243
244 // Check to see if the Component is being installed or uninstalled
245 // when we are processing the same.
246 hr = WcaGetRecordString(hRec, pcdqComponent, &pwzComponent);
247 ExitOnFailure(hr, "Failed to get Component for Wix4PerformanceCategory: %ls", pwzId);
248
249 er = ::MsiGetComponentStateW(hInstall, pwzComponent, &isInstalled, &isAction);
250 hr = HRESULT_FROM_WIN32(er);
251 ExitOnFailure(hr, "Failed to get Component state for Wix4PerformanceCategory: %ls", pwzId);
252
253 if ((fInstall && !WcaIsInstalling(isInstalled, isAction)) ||
254 (!fInstall && !WcaIsUninstalling(isInstalled, isAction)))
255 {
256 continue;
257 }
258
259 hr = WcaGetRecordString(hRec, pcdqName, &pwzName);
260 ExitOnFailure(hr, "Failed to get Name for Wix4PerformanceCategory: %ls", pwzId);
261 hr = WcaWriteStringToCaData(pwzName, &pwzCustomActionData);
262 ExitOnFailure(hr, "Failed to add Name to CustomActionData for Wix4PerformanceCategory: %ls", pwzId);
263
264 hr = WcaGetRecordString(hRec, pcdqIniData, &pwzData);
265 ExitOnFailure(hr, "Failed to get IniData for Wix4PerformanceCategory: %ls", pwzId);
266 hr = WcaWriteStringToCaData(pwzData, &pwzCustomActionData);
267 ExitOnFailure(hr, "Failed to add IniData to CustomActionData for Wix4PerformanceCategory: %ls", pwzId);
268
269 hr = WcaGetRecordString(hRec, pcdqConstantData, &pwzData);
270 ExitOnFailure(hr, "Failed to get ConstantData for Wix4PerformanceCategory: %ls", pwzId);
271 hr = WcaWriteStringToCaData(pwzData, &pwzCustomActionData);
272 ExitOnFailure(hr, "Failed to add ConstantData to CustomActionData for Wix4PerformanceCategory: %ls", pwzId);
273 }
274
275 if (hr == E_NOMOREITEMS)
276 {
277 hr = S_OK;
278 }
279 ExitOnFailure(hr, "Failure while processing Wix4PerformanceCategory table.");
280
281 // If there was any data built up, schedule it for execution.
282 if (pwzCustomActionData)
283 {
284 if (fInstall)
285 {
286 hr = WcaDoDeferredAction(CUSTOM_ACTION_DECORATION(L"RollbackRegisterPerfCounterData"), pwzCustomActionData, COST_PERFMON_UNREGISTER);
287 ExitOnFailure(hr, "Failed to schedule RollbackRegisterPerfCounterData action for Wix4PerformanceCategory: %ls", pwzId);
288
289 hr = WcaDoDeferredAction(CUSTOM_ACTION_DECORATION(L"RegisterPerfCounterData"), pwzCustomActionData, COST_PERFMON_REGISTER);
290 ExitOnFailure(hr, "Failed to schedule RegisterPerfCounterData action for Wix4PerformanceCategory: %ls", pwzId);
291 }
292 else
293 {
294 hr = WcaDoDeferredAction(CUSTOM_ACTION_DECORATION(L"RollbackUnregisterPerfCounterData"), pwzCustomActionData, COST_PERFMON_REGISTER);
295 ExitOnFailure(hr, "Failed to schedule RollbackUnregisterPerfCounterData action for Wix4PerformanceCategory: %ls", pwzId);
296
297 hr = WcaDoDeferredAction(CUSTOM_ACTION_DECORATION(L"UnregisterPerfCounterData"), pwzCustomActionData, COST_PERFMON_UNREGISTER);
298 ExitOnFailure(hr, "Failed to schedule UnregisterPerfCounterData action for Wix4PerformanceCategory: %ls", pwzId);
299 }
300 }
301
302LExit:
303 ReleaseStr(pwzCustomActionData);
304 ReleaseStr(pwzData);
305 ReleaseStr(pwzName);
306 ReleaseStr(pwzComponent);
307 ReleaseStr(pwzId);
308
309 return hr;
310}
diff --git a/src/ext/Util/ca/scaperfexec.cpp b/src/ext/Util/ca/scaperfexec.cpp
new file mode 100644
index 00000000..c5425754
--- /dev/null
+++ b/src/ext/Util/ca/scaperfexec.cpp
@@ -0,0 +1,423 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3#include "precomp.h"
4
5typedef DWORD (STDAPICALLTYPE *PFNPERFCOUNTERTEXTSTRINGS)(LPWSTR lpCommandLine, BOOL bQuietModeArg);
6
7static HRESULT ExecutePerfCounterData(
8 __in MSIHANDLE hInstall,
9 __in BOOL fInstall
10 );
11static HRESULT CreateDataFile(
12 __in LPCWSTR wzTempFolder,
13 __in LPCWSTR wzData,
14 __in BOOL fIniData,
15 __out HANDLE *phFile,
16 __out_opt LPWSTR *ppwzFile
17 );
18
19
20/********************************************************************
21 RegisterPerfCounterData - CUSTOM ACTION ENTRY POINT for registering
22 performance counters
23
24 Input: deferred CustomActionData: wzName\twzIniData\twzConstantData\twzName\twzIniData\twzConstantData\t...
25*******************************************************************/
26extern "C" UINT __stdcall RegisterPerfCounterData(
27 __in MSIHANDLE hInstall
28 )
29{
30 // AssertSz(FALSE, "debug RegisterPerfCounterData()");
31 HRESULT hr = S_OK;
32 DWORD er = ERROR_SUCCESS;
33
34 hr = WcaInitialize(hInstall, "RegisterPerfCounterData");
35 ExitOnFailure(hr, "Failed to initialize RegisterPerfCounterData.");
36
37 hr = ExecutePerfCounterData(hInstall, TRUE);
38 MessageExitOnFailure(hr, msierrInstallPerfCounterData, "Failed to execute Wix4PerformanceCategory table.");
39
40LExit:
41 er = SUCCEEDED(hr) ? ERROR_SUCCESS : ERROR_INSTALL_FAILURE;
42 return WcaFinalize(er);
43}
44
45
46/********************************************************************
47 UnregisterPerfCounterData - CUSTOM ACTION ENTRY POINT for registering
48 performance counters
49
50 Input: deferred CustomActionData: wzName\twzIniData\twzConstantData\twzName\twzIniData\twzConstantData\t...
51*******************************************************************/
52extern "C" UINT __stdcall UnregisterPerfCounterData(
53 __in MSIHANDLE hInstall
54 )
55{
56 // AssertSz(FALSE, "debug UnregisterPerfCounterData()");
57 HRESULT hr = S_OK;
58 DWORD er = ERROR_SUCCESS;
59
60 hr = WcaInitialize(hInstall, "UnregisterPerfCounterData");
61 ExitOnFailure(hr, "Failed to initialize UnregisterPerfCounterData.");
62
63 hr = ExecutePerfCounterData(hInstall, FALSE);
64 MessageExitOnFailure(hr, msierrUninstallPerfCounterData, "Failed to execute Wix4PerformanceCategory table.");
65
66LExit:
67 er = SUCCEEDED(hr) ? ERROR_SUCCESS : ERROR_INSTALL_FAILURE;
68 return WcaFinalize(er);
69}
70
71
72/********************************************************************
73 RegisterPerfmon - CUSTOM ACTION ENTRY POINT for registering
74 counters
75
76 Input: deferred CustomActionData -
77 wzFile or wzName
78*******************************************************************/
79extern "C" UINT __stdcall RegisterPerfmon(
80 __in MSIHANDLE hInstall
81 )
82{
83// Assert(FALSE);
84 UINT er = ERROR_SUCCESS;
85 HRESULT hr = S_OK;
86 LPWSTR pwzData = NULL;
87
88 HMODULE hMod = NULL;
89 PFNPERFCOUNTERTEXTSTRINGS pfnPerfCounterTextString;
90 DWORD dwRet;
91 LPWSTR pwzShortPath = NULL;
92 DWORD cchShortPath = MAX_PATH;
93 DWORD cchShortPathLength = 0;
94
95 LPWSTR pwzCommand = NULL;
96
97 hr = WcaInitialize(hInstall, "RegisterPerfmon");
98 ExitOnFailure(hr, "failed to initialize");
99
100 hr = WcaGetProperty(L"CustomActionData", &pwzData);
101 ExitOnFailure(hr, "failed to get CustomActionData");
102
103 WcaLog(LOGMSG_TRACEONLY, "CustomActionData: %ls", pwzData);
104
105 // do the perfmon registration
106 if (NULL == hMod)
107 {
108 hr = LoadSystemLibrary(L"loadperf.dll", &hMod);
109 }
110 ExitOnFailure(hr, "failed to load DLL for PerfMon");
111
112 pfnPerfCounterTextString = (PFNPERFCOUNTERTEXTSTRINGS)::GetProcAddress(hMod, "LoadPerfCounterTextStringsW");
113 ExitOnNullWithLastError(pfnPerfCounterTextString, hr, "failed to get DLL function for PerfMon");
114
115 hr = StrAlloc(&pwzShortPath, cchShortPath);
116 ExitOnFailure(hr, "failed to allocate string");
117
118 WcaLog(LOGMSG_VERBOSE, "Converting DLL path to short format: %ls", pwzData);
119 cchShortPathLength = ::GetShortPathNameW(pwzData, pwzShortPath, cchShortPath);
120 if (cchShortPathLength > cchShortPath)
121 {
122 cchShortPath = cchShortPathLength + 1;
123 hr = StrAlloc(&pwzShortPath, cchShortPath);
124 ExitOnFailure(hr, "failed to allocate string");
125
126 cchShortPathLength = ::GetShortPathNameW(pwzData, pwzShortPath, cchShortPath);
127 }
128
129 if (0 == cchShortPathLength)
130 {
131 ExitOnLastError(hr, "failed to get short path format of path: %ls", pwzData);
132 }
133
134 hr = StrAllocFormatted(&pwzCommand, L"lodctr \"%s\"", pwzShortPath);
135 ExitOnFailure(hr, "failed to format lodctr string");
136
137 WcaLog(LOGMSG_VERBOSE, "RegisterPerfmon running command: '%ls'", pwzCommand);
138 dwRet = (*pfnPerfCounterTextString)(pwzCommand, TRUE);
139 if (dwRet != ERROR_SUCCESS && dwRet != ERROR_ALREADY_EXISTS)
140 {
141 hr = HRESULT_FROM_WIN32(dwRet);
142 MessageExitOnFailure(hr, msierrPERFMONFailedRegisterDLL, "failed to register with PerfMon, DLL: %ls", pwzData);
143 }
144
145 hr = S_OK;
146LExit:
147 ReleaseStr(pwzData);
148
149 if (FAILED(hr))
150 er = ERROR_INSTALL_FAILURE;
151 return WcaFinalize(er);
152}
153
154
155extern "C" UINT __stdcall UnregisterPerfmon(
156 __in MSIHANDLE hInstall
157 )
158{
159// Assert(FALSE);
160 UINT er = ERROR_SUCCESS;
161 HRESULT hr = S_OK;
162 LPWSTR pwzData = NULL;
163
164 HMODULE hMod = NULL;
165 PFNPERFCOUNTERTEXTSTRINGS pfnPerfCounterTextString;
166 DWORD dwRet;
167 WCHAR wz[255];
168
169 hr = WcaInitialize(hInstall, "UnregisterPerfmon");
170 ExitOnFailure(hr, "failed to initialize");
171
172 hr = WcaGetProperty(L"CustomActionData", &pwzData);
173 ExitOnFailure(hr, "failed to get CustomActionData");
174
175 WcaLog(LOGMSG_TRACEONLY, "CustomActionData: %ls", pwzData);
176
177 // do the perfmon unregistration
178 hr = E_FAIL;
179 if (hMod == NULL)
180 {
181 hr = LoadSystemLibrary(L"loadperf.dll", &hMod);
182 }
183 ExitOnFailure(hr, "failed to load DLL for PerfMon");
184
185 pfnPerfCounterTextString = (PFNPERFCOUNTERTEXTSTRINGS)::GetProcAddress(hMod, "UnloadPerfCounterTextStringsW");
186 ExitOnNullWithLastError(pfnPerfCounterTextString, hr, "failed to get DLL function for PerfMon");
187
188 hr = ::StringCchPrintfW(wz, countof(wz), L"unlodctr \"%s\"", pwzData);
189 ExitOnFailure(hr, "Failed to format unlodctr string with: %ls", pwzData);
190 WcaLog(LOGMSG_VERBOSE, "UnregisterPerfmon running command: '%ls'", wz);
191 dwRet = (*pfnPerfCounterTextString)(wz, TRUE);
192 // if the counters aren't registered, then OK to continue
193 if (dwRet != ERROR_SUCCESS && dwRet != ERROR_FILE_NOT_FOUND && dwRet != ERROR_BADKEY)
194 {
195 hr = HRESULT_FROM_WIN32(dwRet);
196 MessageExitOnFailure(hr, msierrPERFMONFailedUnregisterDLL, "failed to unregsister with PerfMon, DLL: %ls", pwzData);
197 }
198
199 hr = S_OK;
200LExit:
201 ReleaseStr(pwzData);
202
203 if (FAILED(hr))
204 er = ERROR_INSTALL_FAILURE;
205 return WcaFinalize(er);
206}
207
208
209static HRESULT ExecutePerfCounterData(
210 __in MSIHANDLE /*hInstall*/,
211 __in BOOL fInstall
212 )
213{
214 HRESULT hr = S_OK;
215 DWORD er = ERROR_SUCCESS;
216
217 HMODULE hModule = NULL;
218 PFNPERFCOUNTERTEXTSTRINGS pfnPerfCounterTextString = NULL;
219 LPCWSTR wzPrefix = NULL;
220
221 LPWSTR pwzCustomActionData = NULL;
222 LPWSTR pwz = NULL;
223
224 LPWSTR pwzName = NULL;
225 LPWSTR pwzIniData = NULL;
226 LPWSTR pwzConstantData = NULL;
227 LPWSTR pwzTempFolder = NULL;
228 LPWSTR pwzIniFile = NULL;
229 LPWSTR pwzExecute = NULL;
230
231 HANDLE hIniData = INVALID_HANDLE_VALUE;
232 HANDLE hConstantData = INVALID_HANDLE_VALUE;
233
234 // Load the system performance counter helper DLL then get the appropriate
235 // entrypoint out of it. Fortunately, they have the same signature so we
236 // can use one function pointer to point to both.
237 hr = LoadSystemLibrary(L"loadperf.dll", &hModule);
238 ExitOnFailure(hr, "failed to load DLL for PerfMon");
239
240 if (fInstall)
241 {
242 wzPrefix = L"lodctr";
243 pfnPerfCounterTextString = (PFNPERFCOUNTERTEXTSTRINGS)::GetProcAddress(hModule, "LoadPerfCounterTextStringsW");
244 }
245 else
246 {
247 wzPrefix = L"unlodctr";
248 pfnPerfCounterTextString = (PFNPERFCOUNTERTEXTSTRINGS)::GetProcAddress(hModule, "UnloadPerfCounterTextStringsW");
249 }
250 ExitOnNullWithLastError(pfnPerfCounterTextString, hr, "Failed to get DLL function for PerfMon");
251
252 // Now get the CustomActionData and execute it.
253 hr = WcaGetProperty(L"CustomActionData", &pwzCustomActionData);
254 ExitOnFailure(hr, "Failed to get CustomActionData.");
255
256 WcaLog(LOGMSG_TRACEONLY, "CustomActionData: %ls", pwzCustomActionData);
257
258 pwz = pwzCustomActionData;
259
260 while (S_OK == (hr = WcaReadStringFromCaData(&pwz, &pwzName)))
261 {
262 hr = WcaReadStringFromCaData(&pwz, &pwzIniData);
263 ExitOnFailure(hr, "Failed to read IniData from custom action data.");
264
265 hr = WcaReadStringFromCaData(&pwz, &pwzConstantData);
266 ExitOnFailure(hr, "Failed to read ConstantData from custom action data.");
267
268 if (fInstall)
269 {
270 hr = PathCreateTempDirectory(NULL, L"WIXPF%03x", 999, &pwzTempFolder);
271 ExitOnFailure(hr, "Failed to create temp directory.");
272
273 hr = CreateDataFile(pwzTempFolder, pwzIniData, TRUE, &hIniData, &pwzIniFile);
274 ExitOnFailure(hr, "Failed to create .ini file for performance counter category: %ls", pwzName);
275
276 hr = CreateDataFile(pwzTempFolder, pwzConstantData, FALSE, &hConstantData, NULL);
277 ExitOnFailure(hr, "Failed to create .h file for performance counter category: %ls", pwzName);
278
279 hr = StrAllocFormatted(&pwzExecute, L"%s \"%s\"", wzPrefix, pwzIniFile);
280 ExitOnFailure(hr, "Failed to allocate string to execute.");
281
282 // Execute the install.
283 er = (*pfnPerfCounterTextString)(pwzExecute, TRUE);
284 hr = HRESULT_FROM_WIN32(er);
285 ExitOnFailure(hr, "Failed to execute install of performance counter category: %ls", pwzName);
286
287 if (INVALID_HANDLE_VALUE != hIniData)
288 {
289 ::CloseHandle(hIniData);
290 hIniData = INVALID_HANDLE_VALUE;
291 }
292
293 if (INVALID_HANDLE_VALUE != hConstantData)
294 {
295 ::CloseHandle(hConstantData);
296 hConstantData = INVALID_HANDLE_VALUE;
297 }
298
299 DirEnsureDelete(pwzTempFolder, TRUE, TRUE);
300 }
301 else
302 {
303 hr = StrAllocFormatted(&pwzExecute, L"%s \"%s\"", wzPrefix, pwzName);
304 ExitOnFailure(hr, "Failed to allocate string to execute.");
305
306 // Execute the uninstall and if the counter isn't registered then ignore
307 // the error since it won't hurt anything.
308 er = (*pfnPerfCounterTextString)(pwzExecute, TRUE);
309 if (ERROR_FILE_NOT_FOUND == er || ERROR_BADKEY == er)
310 {
311 er = ERROR_SUCCESS;
312 }
313 hr = HRESULT_FROM_WIN32(er);
314 ExitOnFailure(hr, "Failed to execute uninstall of performance counter category: %ls", pwzName);
315 }
316 }
317
318 if (E_NOMOREITEMS == hr) // If there are no more items, all is well
319 {
320 hr = S_OK;
321 }
322 ExitOnFailure(hr, "Failed to execute all perf counter data.");
323
324 hr = S_OK;
325
326LExit:
327 if (INVALID_HANDLE_VALUE != hIniData)
328 {
329 ::CloseHandle(hIniData);
330 }
331
332 if (INVALID_HANDLE_VALUE != hConstantData)
333 {
334 ::CloseHandle(hConstantData);
335 }
336
337 ReleaseStr(pwzExecute);
338 ReleaseStr(pwzIniFile);
339 ReleaseStr(pwzTempFolder);
340 ReleaseStr(pwzConstantData);
341 ReleaseStr(pwzIniData);
342 ReleaseStr(pwzName);
343 ReleaseStr(pwzCustomActionData);
344
345 if (hModule)
346 {
347 ::FreeLibrary(hModule);
348 }
349
350 return hr;
351}
352
353
354static HRESULT CreateDataFile(
355 __in LPCWSTR wzTempFolder,
356 __in LPCWSTR wzData,
357 __in BOOL fIniData,
358 __out HANDLE *phFile,
359 __out_opt LPWSTR *ppwzFile
360 )
361{
362 HRESULT hr = S_OK;
363 HANDLE hFile = INVALID_HANDLE_VALUE;
364 LPWSTR pwzFile = NULL;
365 LPSTR pszData = NULL;
366 DWORD cbData = 0;
367 DWORD cbWritten = 0;
368
369 // Convert the data to UTF-8 because lodctr/unloctr
370 // doesn't like unicode.
371 hr = StrAnsiAllocString(&pszData, wzData, 0, CP_UTF8);
372 ExitOnFailure(hr, "Failed to covert data to ANSI.");
373
374 cbData = lstrlenA(pszData);
375
376 // Concatenate the paths together, open the file data file
377 // and dump the data in there.
378 hr = StrAllocString(&pwzFile, wzTempFolder, 0);
379 ExitOnFailure(hr, "Failed to copy temp directory name.");
380
381 hr = StrAllocConcat(&pwzFile, L"wixperf", 0);
382 ExitOnFailure(hr, "Failed to add name of file.");
383
384 hr = StrAllocConcat(&pwzFile, fIniData ? L".ini" : L".h", 0);
385 ExitOnFailure(hr, "Failed to add extension of file.");
386
387 hFile = ::CreateFileW(pwzFile, GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
388 if (INVALID_HANDLE_VALUE == hFile)
389 {
390 ExitWithLastError(hr, "Failed to open new temp file: %ls", pwzFile);
391 }
392
393 if (!::WriteFile(hFile, pszData, cbData, &cbWritten, NULL))
394 {
395 ExitWithLastError(hr, "Failed to write data to new temp file: %ls", pwzFile);
396 }
397
398 if (INVALID_HANDLE_VALUE != hFile)
399 {
400 ::CloseHandle(hFile);
401 hFile = INVALID_HANDLE_VALUE;
402 }
403
404 // Return the requested values.
405 *phFile = hFile;
406 hFile = INVALID_HANDLE_VALUE;
407
408 if (ppwzFile)
409 {
410 *ppwzFile = pwzFile;
411 pwzFile = NULL;
412 }
413
414LExit:
415 if (INVALID_HANDLE_VALUE != hFile)
416 {
417 ::CloseHandle(hFile);
418 }
419 ReleaseStr(pszData);
420 ReleaseStr(pwzFile);
421
422 return hr;
423}
diff --git a/src/ext/Util/ca/scasched.cpp b/src/ext/Util/ca/scasched.cpp
new file mode 100644
index 00000000..d81b1f14
--- /dev/null
+++ b/src/ext/Util/ca/scasched.cpp
@@ -0,0 +1,127 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3#include "precomp.h"
4
5
6/********************************************************************
7ConfigureSmb - CUSTOM ACTION ENTRY POINT for installing fileshare settings
8
9********************************************************************/
10extern "C" UINT __stdcall ConfigureSmbInstall(
11 __in MSIHANDLE hInstall
12 )
13{
14 HRESULT hr = S_OK;
15 UINT er = ERROR_SUCCESS;
16
17 SCA_SMB* pssList = NULL;
18
19 // initialize
20 hr = WcaInitialize(hInstall, "ConfigureSmbInstall");
21 ExitOnFailure(hr, "Failed to initialize");
22
23 // check to see if necessary tables are specified
24 if (WcaTableExists(L"Wix4FileShare") != S_OK)
25 {
26 WcaLog(LOGMSG_VERBOSE, "Skipping SMB CustomAction, no Wix4FileShare table");
27 ExitFunction1(hr = S_FALSE);
28 }
29
30 hr = ScaSmbRead(&pssList);
31 ExitOnFailure(hr, "failed to read Wix4FileShare table");
32
33 hr = ScaSmbInstall(pssList);
34 ExitOnFailure(hr, "failed to install FileShares");
35
36LExit:
37 if (pssList)
38 ScaSmbFreeList(pssList);
39
40 er = SUCCEEDED(hr) ? ERROR_SUCCESS : ERROR_INSTALL_FAILURE;
41 return WcaFinalize(er);
42}
43
44
45/********************************************************************
46ConfigureSmb - CUSTOM ACTION ENTRY POINT for uninstalling fileshare settings
47
48********************************************************************/
49extern "C" UINT __stdcall ConfigureSmbUninstall(
50 __in MSIHANDLE hInstall
51 )
52{
53 HRESULT hr = S_OK;
54 UINT er = ERROR_SUCCESS;
55
56 SCA_SMB* pssList = NULL;
57
58 // initialize
59 hr = WcaInitialize(hInstall, "ConfigureSmbUninstall");
60 ExitOnFailure(hr, "Failed to initialize");
61
62 // check to see if necessary tables are specified
63 if (WcaTableExists(L"Wix4FileShare") != S_OK)
64 {
65 WcaLog(LOGMSG_VERBOSE, "Skipping SMB CustomAction, no Wix4FileShare table");
66 ExitFunction1(hr = S_FALSE);
67 }
68
69 hr = ScaSmbRead(&pssList);
70 ExitOnFailure(hr, "failed to read Wix4FileShare table");
71
72 hr = ScaSmbUninstall(pssList);
73 ExitOnFailure(hr, "failed to uninstall FileShares");
74
75LExit:
76 if (pssList)
77 ScaSmbFreeList(pssList);
78
79 er = SUCCEEDED(hr) ? ERROR_SUCCESS : ERROR_INSTALL_FAILURE;
80 return WcaFinalize(er);
81}
82
83
84/********************************************************************
85ConfigureUsers - CUSTOM ACTION ENTRY POINT for installing users
86
87********************************************************************/
88extern "C" UINT __stdcall ConfigureUsers(
89 __in MSIHANDLE hInstall
90 )
91{
92 //AssertSz(0, "Debug ConfigureUsers");
93
94 HRESULT hr = S_OK;
95 UINT er = ERROR_SUCCESS;
96
97 BOOL fInitializedCom = FALSE;
98 SCA_USER* psuList = NULL;
99
100 // initialize
101 hr = WcaInitialize(hInstall, "ConfigureUsers");
102 ExitOnFailure(hr, "Failed to initialize");
103
104 hr = ::CoInitialize(NULL);
105 ExitOnFailure(hr, "failed to initialize COM");
106 fInitializedCom = TRUE;
107
108 hr = ScaUserRead(&psuList);
109 ExitOnFailure(hr, "failed to read Wix4User table");
110
111 hr = ScaUserExecute(psuList);
112 ExitOnFailure(hr, "failed to add/remove User actions");
113
114LExit:
115 if (psuList)
116 {
117 ScaUserFreeList(psuList);
118 }
119
120 if (fInitializedCom)
121 {
122 ::CoUninitialize();
123 }
124
125 er = SUCCEEDED(hr) ? ERROR_SUCCESS : ERROR_INSTALL_FAILURE;
126 return WcaFinalize(er);
127} \ No newline at end of file
diff --git a/src/ext/Util/ca/scasmb.h b/src/ext/Util/ca/scasmb.h
new file mode 100644
index 00000000..f2a4b53c
--- /dev/null
+++ b/src/ext/Util/ca/scasmb.h
@@ -0,0 +1,46 @@
1#pragma once
2// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
3
4
5#include "scauser.h"
6
7// structs
8// Structure used to hold and extra user/permission pairs from the Wix4FileSharePermissions Table
9struct SCA_SMB_EX_USER_PERMS
10{
11 int nPermissions;
12 ACCESS_MODE accessMode;
13 SCA_USER scau;
14 SCA_SMB_EX_USER_PERMS* pExUserPermsNext;
15};
16
17struct SCA_SMB // hungarian ss
18{
19 WCHAR wzId[MAX_DARWIN_KEY + 1];
20 WCHAR wzShareName[MAX_DARWIN_KEY + 1];
21 WCHAR wzDescription[MAX_DARWIN_COLUMN + 1];
22 WCHAR wzComponent[MAX_DARWIN_KEY + 1];
23 WCHAR wzDirectory[MAX_PATH + 1];
24
25 int nUserPermissionCount;
26 int nPermissions;
27 SCA_SMB_EX_USER_PERMS* pExUserPerms;
28
29 INSTALLSTATE isInstalled, isAction;
30
31 BOOL fUseIntegratedAuth;
32 BOOL fLegacyUserProvided;
33 struct SCA_USER scau;
34
35 struct SCA_SMB* pssNext;
36};
37
38
39#define RESERVED 0
40
41// schedule prototypes
42HRESULT ScaSmbRead(SCA_SMB** ppssList);
43HRESULT ScaSmbExPermsRead(SCA_SMB* pss);
44HRESULT ScaSmbUninstall(SCA_SMB* pssList);
45HRESULT ScaSmbInstall(SCA_SMB* pssList);
46void ScaSmbFreeList(SCA_SMB* pssList);
diff --git a/src/ext/Util/ca/scasmbexec.cpp b/src/ext/Util/ca/scasmbexec.cpp
new file mode 100644
index 00000000..ced3aa78
--- /dev/null
+++ b/src/ext/Util/ca/scasmbexec.cpp
@@ -0,0 +1,316 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3#include "precomp.h"
4
5
6/********************************************************************
7 AllocateAcl - allocate an acl and populate it with this user and
8 permission information user could be user or domain\user
9
10********************************************************************/
11HRESULT AllocateAcl(SCA_SMBP* pssp, PACL* ppACL)
12{
13 HRESULT hr = S_OK;
14 EXPLICIT_ACCESSW* pEA = NULL;
15 DWORD cEA = 0;
16 DWORD dwCounter = 0;
17
18 PSID psid = NULL;
19 LPCWSTR wzUser = NULL;
20 DWORD nPermissions = 0;
21 DWORD nErrorReturn = 0;
22 ACCESS_MODE accessMode = NOT_USED_ACCESS;
23
24 cEA = pssp->dwUserPermissionCount + 1;
25 if (cEA >= MAXSIZE_T / sizeof(EXPLICIT_ACCESSW))
26 {
27 ExitOnFailure(hr = E_OUTOFMEMORY, "Too many user permissions to allocate: %u", cEA);
28 }
29
30 pEA = static_cast<EXPLICIT_ACCESSW*>(MemAlloc(cEA * sizeof(EXPLICIT_ACCESSW), TRUE));
31 ExitOnNull(pEA, hr, E_OUTOFMEMORY, "failed to allocate memory for explicit access structure");
32
33 // figure out how big the psid is
34 for (dwCounter = 0; dwCounter < pssp->dwUserPermissionCount; ++dwCounter)
35 {
36 wzUser = pssp->pUserPerms[dwCounter].wzUser;
37 nPermissions = pssp->pUserPerms[dwCounter].nPermissions;
38 accessMode = pssp->pUserPerms[dwCounter].accessMode;
39 //
40 // create the appropriate SID
41 //
42
43 // figure out the right user to put into the access block
44 if (0 == lstrcmpW(wzUser, L"Everyone"))
45 {
46 hr = AclGetWellKnownSid(WinWorldSid, &psid);
47 }
48 else if (0 == lstrcmpW(wzUser, L"Administrators"))
49 {
50 hr = AclGetWellKnownSid(WinBuiltinAdministratorsSid, &psid);
51 }
52 else if (0 == lstrcmpW(wzUser, L"LocalSystem"))
53 {
54 hr = AclGetWellKnownSid(WinLocalSystemSid, &psid);
55 }
56 else if (0 == lstrcmpW(wzUser, L"LocalService"))
57 {
58 hr = AclGetWellKnownSid(WinLocalServiceSid, &psid);
59 }
60 else if (0 == lstrcmpW(wzUser, L"NetworkService"))
61 {
62 hr = AclGetWellKnownSid(WinNetworkServiceSid, &psid);
63 }
64 else if (0 == lstrcmpW(wzUser, L"AuthenticatedUser"))
65 {
66 hr = AclGetWellKnownSid(WinAuthenticatedUserSid, &psid);
67 }
68 else if (0 == lstrcmpW(wzUser, L"Guests"))
69 {
70 hr = AclGetWellKnownSid(WinBuiltinGuestsSid, &psid);
71 }
72 else if(0 == lstrcmpW(wzUser, L"CREATOR OWNER"))
73 {
74 hr = AclGetWellKnownSid(WinCreatorOwnerSid, &psid);
75 }
76 else
77 {
78 hr = AclGetAccountSid(NULL, wzUser, &psid);
79 }
80 ExitOnFailure(hr, "failed to get sid for account: %ls", wzUser);
81
82 // we now have a valid pSid, fill in the EXPLICIT_ACCESS
83
84 /* Permissions options: (see sca.sdh for defined sdl options)
85 #define GENERIC_READ (0x80000000L) 2147483648
86 #define GENERIC_WRITE (0x40000000L) 1073741824
87 #define GENERIC_EXECUTE (0x20000000L) 536870912
88 #define GENERIC_ALL (0x10000000L) 268435456
89 */
90 pEA[dwCounter].grfAccessPermissions = nPermissions;
91 pEA[dwCounter].grfAccessMode = accessMode;
92 pEA[dwCounter].grfInheritance = SUB_CONTAINERS_AND_OBJECTS_INHERIT;
93#pragma prefast(push)
94#pragma prefast(disable:25029)
95 ::BuildTrusteeWithSidW(&(pEA[dwCounter].Trustee), psid);
96#pragma prefast(pop)
97 }
98
99 // create a new ACL that contains the ACE
100 *ppACL = NULL;
101#pragma prefast(push)
102#pragma prefast(disable:25029)
103 nErrorReturn = ::SetEntriesInAclW(dwCounter, pEA, NULL, ppACL);
104#pragma prefast(pop)
105 ExitOnFailure(hr = HRESULT_FROM_WIN32(nErrorReturn), "failed to allocate ACL");
106
107LExit:
108 if (psid)
109 {
110 AclFreeSid(psid);
111 }
112
113 ReleaseMem(pEA);
114
115 return hr;
116}
117
118
119
120/********************************************************************
121 FillShareInfo - fill the NetShareAdd data structure
122
123********************************************************************/
124void FillShareInfo(SHARE_INFO_502* psi, SCA_SMBP* pssp, PSECURITY_DESCRIPTOR pSD)
125{
126 psi->shi502_netname = pssp->wzKey;
127 psi->shi502_type = STYPE_DISKTREE;
128 psi->shi502_remark = pssp->wzDescription;
129 psi->shi502_permissions = 0; // not used
130 psi->shi502_max_uses = 0xFFFFFFFF;
131 psi->shi502_current_uses = 0;
132 psi->shi502_path = pssp->wzDirectory;
133 psi->shi502_passwd = NULL; // not file share perms
134 psi->shi502_reserved = 0;
135 psi->shi502_security_descriptor = pSD;
136}
137
138
139
140/* NET_API_STATUS return codes
141NERR_Success = 0
142NERR_DuplicateShare = 2118
143NERR_BufTooSmall = 2123
144NERR_NetNameNotFound = 2310
145NERR_RedirectedPath = 2117
146NERR_UnknownDevDir = 2116
147*/
148
149/********************************************************************
150 DoesShareExists - Does a share of this name exist on this computer?
151
152********************************************************************/
153HRESULT DoesShareExist(__in LPWSTR wzShareName)
154{
155 HRESULT hr = S_OK;
156 NET_API_STATUS s;
157 SHARE_INFO_502* psi = NULL;
158 s = ::NetShareGetInfo(NULL, wzShareName, 502, (BYTE**) &psi);
159
160 switch (s)
161 {
162 case NERR_Success:
163 hr = S_OK;
164 break;
165 case NERR_NetNameNotFound:
166 hr = E_FILENOTFOUND;
167 break;
168 default:
169 WcaLogError(s, "NetShareGetInfo returned an unexpected value.", NULL);
170 hr = HRESULT_FROM_WIN32(s);
171 break;
172 }
173
174 ::NetApiBufferFree(psi);
175
176 return hr;
177}
178
179
180
181/********************************************************************
182 CreateShare - create the file share on this computer
183
184********************************************************************/
185HRESULT CreateShare(SCA_SMBP* pssp)
186{
187 if (!pssp || !(pssp->wzKey))
188 return E_INVALIDARG;
189
190 HRESULT hr = S_OK;
191 PACL pACL = NULL;
192 SHARE_INFO_502 si;
193 NET_API_STATUS s;
194 DWORD dwParamErr = 0;
195
196 BOOL fShareExists = SUCCEEDED(DoesShareExist(pssp->wzKey));
197
198 PSECURITY_DESCRIPTOR pSD = static_cast<PSECURITY_DESCRIPTOR>(MemAlloc(SECURITY_DESCRIPTOR_MIN_LENGTH, TRUE));
199 ExitOnNull(pSD, hr, E_OUTOFMEMORY, "Failed to allocate memory for security descriptor");
200
201#pragma prefast(push)
202#pragma prefast(disable:25029)
203 if (!::InitializeSecurityDescriptor(pSD, SECURITY_DESCRIPTOR_REVISION))
204#pragma prefast(pop)
205 {
206 ExitOnLastError(hr, "failed to initialize security descriptor");
207 }
208
209 hr = AllocateAcl(pssp, &pACL);
210 ExitOnFailure(hr, "Failed to allocate ACL for fileshare");
211
212 if (NULL == pACL)
213 {
214 WcaLog(LOGMSG_VERBOSE, "Ignoring NULL DACL.");
215 }
216#pragma prefast(push)
217#pragma prefast(disable:25028) // We only call this when pACL isn't NULL, so this call is safe according to the docs
218 // add the ACL to the security descriptor.
219 else if (!::SetSecurityDescriptorDacl(pSD, TRUE, pACL, FALSE))
220 {
221 ExitOnLastError(hr, "Failed to set security descriptor");
222 }
223#pragma prefast(pop)
224
225 // all that is left is to create the share
226 FillShareInfo(&si, pssp, pSD);
227
228 // Fail if the directory doesn't exist
229 if (!DirExists(pssp->wzDirectory, NULL))
230 ExitOnFailure(hr = HRESULT_FROM_WIN32(ERROR_OBJECT_NOT_FOUND), "Can't create a file share on directory that doesn't exist: %ls.", pssp->wzDirectory);
231
232 WcaLog(LOGMSG_VERBOSE, "Creating file share on directory \'%ls\' named \'%ls\'.", pssp->wzDirectory, pssp->wzKey);
233
234 if (!fShareExists)
235 {
236 s = ::NetShareAdd(NULL, 502, (BYTE*) &si, &dwParamErr);
237 WcaLog(LOGMSG_VERBOSE, "Adding a new file share.");
238 }
239 else
240 {
241 // The share exists. Write our new permissions over the top.
242 s = ::NetShareSetInfo(NULL, pssp->wzKey, 502, (BYTE*) &si, &dwParamErr);
243 WcaLog(LOGMSG_VERBOSE, "Setting permissions on existing share.");
244 }
245
246 if (NERR_Success != s)
247 {
248 hr = E_FAIL;
249 if (!fShareExists && NERR_DuplicateShare == s)
250 WcaLog(LOGMSG_VERBOSE, "Duplicate error when existence check failed.");
251
252 // error codes listed above.
253 ExitOnFailure(hr, "Failed to create/modify file share: Err: %d", s);
254 }
255
256LExit:
257 if (pACL)
258 {
259 ::LocalFree(pACL);
260 }
261
262 ReleaseMem(pSD);
263
264 return hr;
265}
266
267
268/********************************************************************
269 ScaEnsureSmbExists
270
271********************************************************************/
272HRESULT ScaEnsureSmbExists(SCA_SMBP* pssp)
273{
274 HRESULT hr = S_OK;
275
276 // create the share
277 hr = CreateShare(pssp);
278
279 return hr;
280}
281
282
283//
284// Delete File Shares - real work
285//
286
287/********************************************************************
288 ScaDropSmb - delete this file share from this computer
289
290********************************************************************/
291HRESULT ScaDropSmb(SCA_SMBP* pssp)
292{
293 HRESULT hr = S_OK;
294 NET_API_STATUS s;
295
296 hr = DoesShareExist(pssp->wzKey);
297
298 if (E_FILENOTFOUND == hr)
299 {
300 WcaLog(LOGMSG_VERBOSE, "Share doesn't exist, share removal skipped. (%ls)", pssp->wzKey);
301 ExitFunction1(hr = S_OK);
302
303 }
304
305 ExitOnFailure(hr, "Unable to detect share. (%ls)", pssp->wzKey);
306
307 s = ::NetShareDel(NULL, pssp->wzKey, 0);
308 if (NERR_Success != s)
309 {
310 hr = E_FAIL;
311 ExitOnFailure(hr, "Failed to remove file share: Err: %d", s);
312 }
313
314LExit:
315 return hr;
316}
diff --git a/src/ext/Util/ca/scasmbexec.h b/src/ext/Util/ca/scasmbexec.h
new file mode 100644
index 00000000..e3c8f8bb
--- /dev/null
+++ b/src/ext/Util/ca/scasmbexec.h
@@ -0,0 +1,27 @@
1#pragma once
2// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
3
4
5struct SCA_SMBP_USER_PERMS
6{
7 DWORD nPermissions;
8 ACCESS_MODE accessMode;
9 WCHAR* wzUser;
10 //Not adding Password because I can't find anywhere that it is used
11};
12
13struct SCA_SMBP // hungarian ssp
14{
15 WCHAR* wzKey;
16 WCHAR* wzDescription;
17 WCHAR* wzComponent;
18 WCHAR* wzDirectory; // full path of the dir to share to
19
20 DWORD dwUserPermissionCount; //Count of SCA_SMBP_EX_USER_PERMS structures
21 SCA_SMBP_USER_PERMS* pUserPerms;
22 BOOL fUseIntegratedAuth;
23};
24
25
26HRESULT ScaEnsureSmbExists(SCA_SMBP* pssp);
27HRESULT ScaDropSmb(SCA_SMBP* pssp);
diff --git a/src/ext/Util/ca/scasmbsched.cpp b/src/ext/Util/ca/scasmbsched.cpp
new file mode 100644
index 00000000..e29f7f51
--- /dev/null
+++ b/src/ext/Util/ca/scasmbsched.cpp
@@ -0,0 +1,639 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3#include "precomp.h"
4
5
6/********************************************************************
7 Helper functions to maintain a list of file shares to create / remove
8
9********************************************************************/
10SCA_SMB* NewSmb()
11{
12 SCA_SMB* pss = (SCA_SMB*)MemAlloc(sizeof(SCA_SMB), TRUE);
13 Assert(pss);
14 return pss;
15}
16
17
18SCA_SMB_EX_USER_PERMS* NewExUserPermsSmb()
19{
20 SCA_SMB_EX_USER_PERMS* pExUserPerms = (SCA_SMB_EX_USER_PERMS*)MemAlloc(sizeof(SCA_SMB_EX_USER_PERMS), TRUE);
21 Assert(pExUserPerms);
22 return pExUserPerms;
23}
24
25
26SCA_SMB* AddSmbToList(SCA_SMB* pssList, SCA_SMB* pss)
27{
28 if (pssList)
29 {
30 SCA_SMB* pssT = pssList;
31 while (pssT->pssNext)
32 {
33 pssT = pssT->pssNext;
34 }
35
36 pssT->pssNext = pss;
37 }
38 else
39 {
40 pssList = pss;
41 }
42
43 return pssList;
44}
45
46
47SCA_SMB_EX_USER_PERMS* AddExUserPermsSmbToList(
48 SCA_SMB_EX_USER_PERMS* pExUserPermsList,
49 SCA_SMB_EX_USER_PERMS* pExUserPerms
50 )
51{
52 SCA_SMB_EX_USER_PERMS* pExUserPermsTemp = pExUserPermsList;
53 if (pExUserPermsList)
54 {
55 while (pExUserPermsTemp->pExUserPermsNext)
56 {
57 pExUserPermsTemp = pExUserPermsTemp->pExUserPermsNext;
58 }
59
60 pExUserPermsTemp->pExUserPermsNext = pExUserPerms;
61 }
62 else
63 {
64 pExUserPermsList = pExUserPerms;
65 }
66
67 return pExUserPermsList;
68}
69
70void ScaSmbFreeList(SCA_SMB* pssList)
71{
72 SCA_SMB* pssDelete = pssList;
73 while (pssList)
74 {
75 pssDelete = pssList;
76 pssList = pssList->pssNext;
77
78 MemFree(pssDelete);
79 }
80}
81
82void ScaExUserPermsSmbFreeList(SCA_SMB_EX_USER_PERMS* pExUserPermsList)
83{
84 SCA_SMB_EX_USER_PERMS* pExUserPermsDelete = pExUserPermsList;
85 while (pExUserPermsList)
86 {
87 pExUserPermsDelete = pExUserPermsList;
88 pExUserPermsList = pExUserPermsList->pExUserPermsNext;
89
90 MemFree(pExUserPermsDelete);
91 }
92}
93
94// sql query constants
95LPCWSTR vcsSmbQuery = L"SELECT `Wix4FileShare`, `ShareName`, `Description`, `Directory_`, "
96 L"`Component_`, `User_`, `Permissions` FROM `Wix4FileShare`";
97
98enum eSmbQuery {
99 ssqFileShare = 1,
100 ssqShareName,
101 ssqDescription,
102 ssqDirectory,
103 ssqComponent,
104 ssqUser,
105 ssqPermissions
106 };
107
108
109/********************************************************************
110 ScaSmbRead - read all of the information from the msi tables and
111 return a list of file share jobs to be done.
112
113********************************************************************/
114HRESULT ScaSmbRead(SCA_SMB** ppssList)
115{
116 HRESULT hr = S_OK;
117 UINT er = ERROR_SUCCESS;
118 PMSIHANDLE hView, hRec;
119
120 LPWSTR pwzData = NULL;
121
122 SCA_SMB* pss = NULL;
123 BOOL bUserPermissionsTableExists = FALSE;
124
125 if (S_OK != WcaTableExists(L"Wix4FileShare"))
126 {
127 WcaLog(LOGMSG_VERBOSE, "Skipping ScaSmbCreateShare() - Wix4FileShare table not present");
128 ExitFunction1(hr = S_FALSE);
129 }
130
131 if (S_OK == WcaTableExists(L"Wix4FileSharePermissions"))
132 {
133 bUserPermissionsTableExists = TRUE;
134 }
135 else
136 {
137 WcaLog(LOGMSG_VERBOSE, "No Additional Permissions - Wix4FileSharePermissions table not present");
138 }
139
140 WcaLog(LOGMSG_VERBOSE, "Reading File Share Tables");
141
142 // loop through all the fileshares
143 hr = WcaOpenExecuteView(vcsSmbQuery, &hView);
144 ExitOnFailure(hr, "Failed to open view on Wix4FileShare table");
145 while (S_OK == (hr = WcaFetchRecord(hView, &hRec)))
146 {
147 pss = NewSmb();
148 if (!pss)
149 {
150 hr = E_OUTOFMEMORY;
151 break;
152 }
153 Assert(pss);
154 ::ZeroMemory(pss, sizeof(*pss));
155
156 hr = WcaGetRecordString(hRec, ssqFileShare, &pwzData);
157 ExitOnFailure(hr, "Failed to get Wix4FileShare.Wix4FileShare");
158 hr = ::StringCchCopyW(pss->wzId, countof(pss->wzId), pwzData);
159 ExitOnFailure(hr, "Failed to copy ID string to smb object");
160
161 hr = WcaGetRecordFormattedString(hRec, ssqShareName, &pwzData);
162 ExitOnFailure(hr, "Failed to get Wix4FileShare.ShareName");
163 hr = ::StringCchCopyW(pss->wzShareName, countof(pss->wzShareName), pwzData);
164 ExitOnFailure(hr, "Failed to copy share name string to smb object");
165
166 hr = WcaGetRecordString(hRec, ssqComponent, &pwzData);
167 ExitOnFailure(hr, "Failed to get Component for Wix4FileShare: '%ls'", pss->wzShareName);
168 hr = ::StringCchCopyW(pss->wzComponent, countof(pss->wzComponent), pwzData);
169 ExitOnFailure(hr, "Failed to copy component string to smb object");
170
171 hr = WcaGetRecordFormattedString(hRec, ssqDescription, &pwzData);
172 ExitOnFailure(hr, "Failed to get Share Description for Wix4FileShare: '%ls'", pss->wzShareName);
173 hr = ::StringCchCopyW(pss->wzDescription, countof(pss->wzDescription), pwzData);
174 ExitOnFailure(hr, "Failed to copy description string to smb object");
175
176 // get user info from the user table
177 hr = WcaGetRecordFormattedString(hRec, ssqUser, &pwzData);
178 ExitOnFailure(hr, "Failed to get Wix4User record for Wix4FileShare: '%ls'", pss->wzShareName);
179
180 // get component install state
181 er = ::MsiGetComponentStateW(WcaGetInstallHandle(), pss->wzComponent, &pss->isInstalled, &pss->isAction);
182 hr = HRESULT_FROM_WIN32(er);
183 ExitOnFailure(hr, "Failed to get Component state for Wix4FileShare");
184
185 // if a user was specified
186 if (*pwzData)
187 {
188 pss->fUseIntegratedAuth = FALSE;
189 pss->fLegacyUserProvided = TRUE;
190 hr = ScaGetUser(pwzData, &pss->scau);
191 ExitOnFailure(hr, "Failed to get user information for fileshare: '%ls'", pss->wzShareName);
192 }
193 else
194 {
195 pss->fLegacyUserProvided = FALSE;
196 // TODO: figure out whether this is useful still
197 //pss->fUseIntegratedAuth = TRUE;
198 // integrated authorization doesn't have a User record
199 }
200
201 // get the share's directory
202 hr = WcaGetRecordString(hRec, ssqDirectory, &pwzData);
203 ExitOnFailure(hr, "Failed to get directory for Wix4FileShare: '%ls'", pss->wzShareName);
204
205 WCHAR wzPath[MAX_PATH];
206 DWORD dwLen;
207 dwLen = countof(wzPath);
208 // review: relevant for file shares?
209 if (INSTALLSTATE_SOURCE == pss->isAction)
210 {
211 er = ::MsiGetSourcePathW(WcaGetInstallHandle(), pwzData, wzPath, &dwLen);
212 }
213 else
214 {
215 er = ::MsiGetTargetPathW(WcaGetInstallHandle(), pwzData, wzPath, &dwLen);
216 }
217 hr = HRESULT_FROM_WIN32(er);
218 ExitOnFailure(hr, "Failed to get Source/TargetPath for Directory");
219
220 // If the path is to the root of a drive, then it needs a trailing backslash.
221 // Otherwise, it can't have a trailing backslash.
222 if (3 < dwLen)
223 {
224 if (wzPath[dwLen - 1] == L'\\')
225 {
226 wzPath[dwLen - 1] = 0;
227 }
228 }
229 else if (2 == dwLen && wzPath[1] == L':')
230 {
231 wzPath[2] = L'\\';
232 wzPath[3] = 0;
233 }
234
235 hr = ::StringCchCopyW(pss->wzDirectory, countof(pss->wzDirectory), wzPath);
236 ExitOnFailure(hr, "Failed to copy directory string to smb object");
237
238 hr = WcaGetRecordInteger(hRec, ssqPermissions, &pss->nPermissions);
239 ExitOnFailure(hr, "Failed to get Wix4FileShare.Permissions");
240
241 // Check to see if additional user & permissions are specified for this share
242 if (bUserPermissionsTableExists)
243 {
244 hr = ScaSmbExPermsRead(pss);
245 ExitOnFailure(hr, "Failed to get Additional File Share Permissions");
246 }
247
248 *ppssList = AddSmbToList(*ppssList, pss);
249 pss = NULL; // set the smb NULL so it doesn't accidentally get freed below
250 }
251
252 if (E_NOMOREITEMS == hr)
253 {
254 hr = S_OK;
255 }
256 ExitOnFailure(hr, "Failure occured while processing Wix4FileShare table");
257
258LExit:
259 // if anything was left over after an error clean it all up
260 if (pss)
261 {
262 ScaSmbFreeList(pss);
263 }
264
265 ReleaseStr(pwzData);
266
267 return hr;
268}
269
270
271/********************************************************************
272 RetrieveSMBShareUserPermList - retrieve SMB Share's user permission list
273
274********************************************************************/
275HRESULT RetrieveFileShareUserPerm(SCA_SMB* pss, SCA_SMB_EX_USER_PERMS** ppExUserPermsList, DWORD *pUserPermsCount)
276{
277 HRESULT hr = S_OK;
278 SHARE_INFO_502* psi = NULL;
279 NET_API_STATUS s;
280 BOOL bValid, bDaclDefaulted;
281 PACL acl = NULL;
282 PEXPLICIT_ACCESSW pEA = NULL;
283 ULONG nCount = 0;
284 DWORD er = ERROR_SUCCESS;
285 PSID pSID = NULL;
286 DWORD nUserNameSize = MAX_DARWIN_COLUMN;
287 DWORD nDomainNameSize = MAX_DARWIN_COLUMN;
288 SID_NAME_USE peUse;
289 DWORD dwCounter = 0;
290 SCA_SMB_EX_USER_PERMS* pExUserPermsList = NULL;
291 DWORD dwUserPermsCount = 0;
292
293 *pUserPermsCount = 0;
294 s = ::NetShareGetInfo(NULL, pss->wzShareName, 502, (LPBYTE*)&psi);
295 WcaLog(LOGMSG_VERBOSE, "retrieving permissions on existing file share.");
296 if (NERR_NetNameNotFound == s)
297 {
298 WcaLog(LOGMSG_VERBOSE, "File share has already been removed.");
299 ExitFunction1(hr = S_OK);
300 }
301 else if (NERR_Success != s || psi == NULL)
302 {
303 hr = E_FAIL;
304 ExitOnFailure(hr, "Failed to get share information with return code: %d", s);
305 }
306 if (!::GetSecurityDescriptorDacl(psi->shi502_security_descriptor, &bValid, &acl, &bDaclDefaulted) || !bValid)
307 {
308 ExitOnLastError(hr, "Failed to get acl from security descriptor");
309 }
310
311 er = ::GetExplicitEntriesFromAclW(acl, &nCount, &pEA);
312 hr = HRESULT_FROM_WIN32(er);
313 ExitOnFailure(hr, "Failed to get access entries from acl for file share %ls", pss->wzShareName);
314 for (dwCounter = 0; dwCounter < nCount; ++dwCounter)
315 {
316 if (TRUSTEE_IS_SID == pEA[dwCounter].Trustee.TrusteeForm)
317 {
318 SCA_SMB_EX_USER_PERMS* pExUserPerms = NewExUserPermsSmb();
319 ::ZeroMemory(pExUserPerms, sizeof(*pExUserPerms));
320 pExUserPermsList = AddExUserPermsSmbToList(pExUserPermsList, pExUserPerms);
321 pSID = (PSID)(pEA[dwCounter].Trustee.ptstrName);
322 if (!::LookupAccountSidW(NULL, pSID, pExUserPerms->scau.wzName, &nUserNameSize, pExUserPerms->scau.wzDomain, &nDomainNameSize, &peUse))
323 {
324 hr = E_FAIL;
325 ExitOnFailure(hr, "Failed to get account name from SID");
326 }
327 pExUserPerms->nPermissions = pEA[dwCounter].grfAccessPermissions;
328 pExUserPerms->accessMode = pEA[dwCounter].grfAccessMode;
329 ++dwUserPermsCount;
330 nUserNameSize = MAX_DARWIN_COLUMN;
331 nDomainNameSize = MAX_DARWIN_COLUMN;
332 }
333 }
334 *ppExUserPermsList = pExUserPermsList;
335 *pUserPermsCount = dwUserPermsCount;
336
337LExit:
338 if (psi)
339 {
340 ::NetApiBufferFree(psi);
341 }
342
343 if (pEA)
344 {
345 ::LocalFree(pEA);
346 }
347
348 return hr;
349}
350
351
352/********************************************************************
353 SchedCreateSmb - schedule one instance of a file share creation
354
355********************************************************************/
356HRESULT SchedCreateSmb(SCA_SMB* pss)
357{
358 HRESULT hr = S_OK;
359
360 WCHAR wzDomainUser[255]; // "domain\user"
361 SCA_SMB_EX_USER_PERMS* pExUserPermsList = NULL;
362 int nCounter = 0;
363 WCHAR* pwzRollbackCustomActionData = NULL;
364 WCHAR* pwzCustomActionData = NULL;
365
366 hr = WcaWriteStringToCaData(pss->wzShareName, &pwzRollbackCustomActionData);
367 ExitOnFailure(hr, "failed to add ShareName to CustomActionData");
368
369 hr = WcaWriteStringToCaData(pss->wzShareName, &pwzCustomActionData);
370 ExitOnFailure(hr, "failed to add ShareName to CustomActionData");
371
372 hr = WcaWriteStringToCaData(pss->wzDescription, &pwzCustomActionData);
373 ExitOnFailure(hr, "Failed to add server name to CustomActionData");
374
375 hr = WcaWriteStringToCaData(pss->wzDirectory, &pwzCustomActionData);
376 ExitOnFailure(hr, "Failed to add full path instance to CustomActionData");
377
378 hr = WcaWriteStringToCaData(pss->fUseIntegratedAuth ? L"1" : L"0", &pwzCustomActionData);
379 ExitOnFailure(hr, "Failed to add server name to CustomActionData");
380
381 if (pss->fLegacyUserProvided)
382 {
383 hr = WcaWriteIntegerToCaData(pss->nUserPermissionCount + 1, &pwzCustomActionData);
384 ExitOnFailure(hr, "Failed to add additional user permission count to CustomActionData");
385
386 hr = UserBuildDomainUserName(wzDomainUser, countof(wzDomainUser), pss->scau.wzName, pss->scau.wzDomain);
387 ExitOnFailure(hr, "Failed to build user and domain name for CustomActionData");
388 hr = WcaWriteStringToCaData(wzDomainUser, &pwzCustomActionData);
389 ExitOnFailure(hr, "Failed to add server Domain\\UserName to CustomActionData");
390
391 hr = WcaWriteIntegerToCaData(pss->nPermissions, &pwzCustomActionData);
392 ExitOnFailure(hr, "Failed to add permissions to CustomActionData");
393 }
394 else
395 {
396 hr = WcaWriteIntegerToCaData(pss->nUserPermissionCount, &pwzCustomActionData);
397 ExitOnFailure(hr, "Failed to add additional user permission count to CustomActionData");
398 }
399
400 if (pss->nUserPermissionCount > 0)
401 {
402 nCounter = 0;
403 for (pExUserPermsList = pss->pExUserPerms; pExUserPermsList; pExUserPermsList = pExUserPermsList->pExUserPermsNext)
404 {
405 Assert(nCounter < pss->nUserPermissionCount);
406
407 hr = UserBuildDomainUserName(wzDomainUser, countof(wzDomainUser), pExUserPermsList->scau.wzName, pExUserPermsList->scau.wzDomain);
408 ExitOnFailure(hr, "Failed to build user and domain name for CustomActionData");
409 hr = WcaWriteStringToCaData(wzDomainUser, &pwzCustomActionData);
410 ExitOnFailure(hr, "Failed to add server Domain\\UserName to CustomActionData");
411
412 hr = WcaWriteIntegerToCaData((int)pExUserPermsList->accessMode, &pwzCustomActionData);
413 ExitOnFailure(hr, "Failed to add access mode to CustomActionData");
414
415 hr = WcaWriteIntegerToCaData(pExUserPermsList->nPermissions, &pwzCustomActionData);
416 ExitOnFailure(hr, "Failed to add permissions to CustomActionData");
417 ++nCounter;
418 }
419 Assert(nCounter == pss->nUserPermissionCount);
420 }
421
422 // Schedule the rollback first
423 hr = WcaDoDeferredAction(CUSTOM_ACTION_DECORATION(L"CreateSmbRollback"), pwzRollbackCustomActionData, COST_SMB_DROPSMB);
424 ExitOnFailure(hr, "Failed to schedule DropSmb action");
425
426 hr = WcaDoDeferredAction(CUSTOM_ACTION_DECORATION(L"CreateSmb"), pwzCustomActionData, COST_SMB_CREATESMB);
427 ExitOnFailure(hr, "Failed to schedule CreateSmb action");
428
429LExit:
430 ReleaseStr(pwzRollbackCustomActionData);
431 ReleaseStr(pwzCustomActionData);
432
433 if (pExUserPermsList)
434 {
435 ScaExUserPermsSmbFreeList(pExUserPermsList);
436 }
437
438 return hr;
439}
440
441
442/********************************************************************
443 ScaSmbInstall - for every file share, schedule the create custom action
444
445********************************************************************/
446HRESULT ScaSmbInstall(SCA_SMB* pssList)
447{
448 HRESULT hr = S_FALSE; // assume nothing will be done
449 SCA_SMB* pss = NULL;
450
451 for (pss = pssList; pss; pss = pss->pssNext)
452 {
453 // if installing this component
454 if (WcaIsInstalling(pss->isInstalled, pss->isAction) )
455 {
456 hr = SchedCreateSmb(pss);
457 ExitOnFailure(hr, "Failed to schedule the creation of the fileshare: %ls", pss->wzShareName);
458 }
459 }
460
461LExit:
462 return hr;
463}
464
465
466/********************************************************************
467 SchedDropSmb - schedule one instance of a file share removal
468
469********************************************************************/
470HRESULT SchedDropSmb(SCA_SMB* pss)
471{
472 HRESULT hr = S_OK;
473
474 WCHAR* pwzCustomActionData = NULL;
475 WCHAR* pwzRollbackCustomActionData = NULL;
476 SCA_SMB_EX_USER_PERMS *pExUserPermsList = NULL;
477 SCA_SMB_EX_USER_PERMS *pExUserPerm = NULL;
478 WCHAR wzDomainUser[255]; // "domain\user"
479 DWORD dwUserPermsCount = 0;
480
481 // roll back DropSmb
482 hr = WcaWriteStringToCaData(pss->wzShareName, &pwzRollbackCustomActionData);
483 ExitOnFailure(hr, "failed to add ShareName to CustomActionData");
484
485 hr = WcaWriteStringToCaData(pss->wzDescription, &pwzRollbackCustomActionData);
486 ExitOnFailure(hr, "Failed to add server name to CustomActionData");
487
488 hr = WcaWriteStringToCaData(pss->wzDirectory, &pwzRollbackCustomActionData);
489 ExitOnFailure(hr, "Failed to add full path instance to CustomActionData");
490
491 hr = WcaWriteStringToCaData(L"1", &pwzRollbackCustomActionData);
492 ExitOnFailure(hr, "Failed to add useintegrated flag to CustomActionData");
493
494 hr = RetrieveFileShareUserPerm(pss, &pExUserPermsList, &dwUserPermsCount);
495 ExitOnFailure(hr, "Failed to retrieve SMBShare's user permissions");
496
497 hr = WcaWriteIntegerToCaData((int)dwUserPermsCount, &pwzRollbackCustomActionData);
498 ExitOnFailure(hr, "Failed to add additional user permission count to CustomActionData");
499
500 for (pExUserPerm = pExUserPermsList; pExUserPerm; pExUserPerm = pExUserPerm->pExUserPermsNext)
501 {
502 hr = UserBuildDomainUserName(wzDomainUser, countof(wzDomainUser), pExUserPerm->scau.wzName, pExUserPerm->scau.wzDomain);
503 ExitOnFailure(hr, "Failed to build user and domain name for CustomActionData");
504 hr = WcaWriteStringToCaData(wzDomainUser, &pwzRollbackCustomActionData);
505 ExitOnFailure(hr, "Failed to add server Domain\\UserName to CustomActionData");
506
507 hr = WcaWriteIntegerToCaData((int)pExUserPerm->accessMode, &pwzRollbackCustomActionData);
508 ExitOnFailure(hr, "Failed to add access mode to CustomActionData");
509
510 hr = WcaWriteIntegerToCaData(pExUserPerm->nPermissions, &pwzRollbackCustomActionData);
511 ExitOnFailure(hr, "Failed to add permissions to CustomActionData");
512 }
513
514 hr = WcaDoDeferredAction(CUSTOM_ACTION_DECORATION(L"DropSmbRollback"), pwzRollbackCustomActionData, COST_SMB_CREATESMB);
515 ExitOnFailure(hr, "Failed to schedule DropSmbRollback action");
516
517 // DropSMB
518 hr = WcaWriteStringToCaData(pss->wzShareName, &pwzCustomActionData);
519 ExitOnFailure(hr, "failed to add ShareName to CustomActionData");
520
521 hr = WcaDoDeferredAction(CUSTOM_ACTION_DECORATION(L"DropSmb"), pwzCustomActionData, COST_SMB_DROPSMB);
522 ExitOnFailure(hr, "Failed to schedule DropSmb action");
523
524LExit:
525 ReleaseStr(pwzCustomActionData);
526
527 if (pExUserPermsList)
528 {
529 ScaExUserPermsSmbFreeList(pExUserPermsList);
530 }
531
532 return hr;
533
534}
535
536
537/********************************************************************
538 ScaSmbUninstall - for every file share, schedule the drop custom action
539
540********************************************************************/
541HRESULT ScaSmbUninstall(SCA_SMB* pssList)
542{
543 HRESULT hr = S_FALSE; // assume nothing will be done
544 SCA_SMB* pss = NULL;
545
546 for (pss = pssList; pss; pss = pss->pssNext)
547 {
548 // if uninstalling this component
549 if (WcaIsUninstalling(pss->isInstalled, pss->isAction) )
550 {
551 hr = SchedDropSmb(pss);
552 ExitOnFailure(hr, "Failed to remove file share %ls", pss->wzShareName);
553 }
554 }
555
556LExit:
557 return hr;
558}
559
560LPCWSTR vcsSmbExUserPermsQuery = L"SELECT `FileShare_`,`User_`,`Permissions` "
561 L"FROM `Wix4FileSharePermissions` WHERE `FileShare_`=?";
562
563enum eSmbUserPermsQuery {
564 ssupqFileShare = 1,
565 ssupqUser,
566 ssupqPermissions
567
568};
569
570
571/********************************************************************
572 ScaSmbExPermsRead - for Every entry in File Permissions table add a
573 User Name & Permissions structure to the List
574
575********************************************************************/
576HRESULT ScaSmbExPermsRead(SCA_SMB* pss)
577{
578 HRESULT hr = S_OK;
579 PMSIHANDLE hView, hRec;
580
581 LPWSTR pwzData = NULL;
582 SCA_SMB_EX_USER_PERMS* pExUserPermsList = pss->pExUserPerms;
583 SCA_SMB_EX_USER_PERMS* pExUserPerms = NULL;
584 int nCounter = 0;
585
586 hRec = ::MsiCreateRecord(1);
587 hr = WcaSetRecordString(hRec, 1, pss->wzId);
588 ExitOnFailure(hr, "Failed to look up FileShare");
589
590 hr = WcaOpenView(vcsSmbExUserPermsQuery, &hView);
591 ExitOnFailure(hr, "Failed to open view on Wix4FileSharePermissions table");
592 hr = WcaExecuteView(hView, hRec);
593 ExitOnFailure(hr, "Failed to execute view on Wix4FileSharePermissions table");
594
595 // loop through all User/Permissions paris returned
596 while (S_OK == (hr = WcaFetchRecord(hView, &hRec)))
597 {
598 pExUserPerms = NewExUserPermsSmb();
599 if (!pExUserPerms)
600 {
601 hr = E_OUTOFMEMORY;
602 break;
603 }
604 Assert(pExUserPerms);
605 ::ZeroMemory(pExUserPerms, sizeof(*pExUserPerms));
606
607 hr = WcaGetRecordString(hRec, ssupqUser, &pwzData);
608 ExitOnFailure(hr, "Failed to get Wix4FileSharePermissions.User");
609 hr = ScaGetUser(pwzData, &pExUserPerms->scau);
610 ExitOnFailure(hr, "Failed to get user information for fileshare: '%ls'", pss->wzShareName);
611
612 hr = WcaGetRecordInteger(hRec, ssupqPermissions, &pExUserPerms->nPermissions);
613 ExitOnFailure(hr, "Failed to get Wix4FileSharePermissions.Permissions");
614 pExUserPerms->accessMode = SET_ACCESS; // we only support SET_ACCESS here
615
616 pExUserPermsList = AddExUserPermsSmbToList(pExUserPermsList, pExUserPerms);
617 ++nCounter;
618 pExUserPerms = NULL; // set the smb NULL so it doesn't accidentally get freed below
619 }
620
621 if (E_NOMOREITEMS == hr)
622 {
623 hr = S_OK;
624 pss->pExUserPerms = pExUserPermsList;
625 pss->nUserPermissionCount = nCounter;
626 }
627 ExitOnFailure(hr, "Failure occured while processing FileShare table");
628
629LExit:
630 // if anything was left over after an error clean it all up
631 if (pExUserPerms)
632 {
633 ScaExUserPermsSmbFreeList(pExUserPerms);
634 }
635
636 ReleaseStr(pwzData);
637
638 return hr;
639}
diff --git a/src/ext/Util/ca/scauser.cpp b/src/ext/Util/ca/scauser.cpp
new file mode 100644
index 00000000..b25e9daf
--- /dev/null
+++ b/src/ext/Util/ca/scauser.cpp
@@ -0,0 +1,709 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3#include "precomp.h"
4
5LPCWSTR vcsUserQuery = L"SELECT `Wix4User`, `Component_`, `Name`, `Domain`, `Password` FROM `Wix4User` WHERE `Wix4User`=?";
6enum eUserQuery { vuqUser = 1, vuqComponent, vuqName, vuqDomain, vuqPassword };
7
8LPCWSTR vcsGroupQuery = L"SELECT `Wix4Group`, `Component_`, `Name`, `Domain` FROM `Wix4Group` WHERE `Wix4Group`=?";
9enum eGroupQuery { vgqGroup = 1, vgqComponent, vgqName, vgqDomain };
10
11LPCWSTR vcsUserGroupQuery = L"SELECT `Wix4User_`, `Wix4Group_` FROM `Wix4UserGroup` WHERE `Wix4User_`=?";
12enum eUserGroupQuery { vugqUser = 1, vugqGroup };
13
14LPCWSTR vActionableQuery = L"SELECT `Wix4User`,`Component_`,`Name`,`Domain`,`Password`,`Attributes` FROM `Wix4User` WHERE `Component_` IS NOT NULL";
15enum eActionableQuery { vaqUser = 1, vaqComponent, vaqName, vaqDomain, vaqPassword, vaqAttributes };
16
17
18static HRESULT AddUserToList(
19 __inout SCA_USER** ppsuList
20 );
21
22static HRESULT AddGroupToList(
23 __inout SCA_GROUP** ppsgList
24 );
25
26
27HRESULT __stdcall ScaGetUser(
28 __in LPCWSTR wzUser,
29 __out SCA_USER* pscau
30 )
31{
32 if (!wzUser || !pscau)
33 {
34 return E_INVALIDARG;
35 }
36
37 HRESULT hr = S_OK;
38 PMSIHANDLE hView, hRec;
39
40 LPWSTR pwzData = NULL;
41
42 // clear struct and bail right away if no user key was passed to search for
43 ::ZeroMemory(pscau, sizeof(*pscau));
44 if (!*wzUser)
45 {
46 ExitFunction1(hr = S_OK);
47 }
48
49 hRec = ::MsiCreateRecord(1);
50 hr = WcaSetRecordString(hRec, 1, wzUser);
51 ExitOnFailure(hr, "Failed to look up User");
52
53 hr = WcaOpenView(vcsUserQuery, &hView);
54 ExitOnFailure(hr, "Failed to open view on Wix4User table");
55 hr = WcaExecuteView(hView, hRec);
56 ExitOnFailure(hr, "Failed to execute view on Wix4User table");
57
58 hr = WcaFetchSingleRecord(hView, &hRec);
59 if (S_OK == hr)
60 {
61 hr = WcaGetRecordString(hRec, vuqUser, &pwzData);
62 ExitOnFailure(hr, "Failed to get Wix4User.User");
63 hr = ::StringCchCopyW(pscau->wzKey, countof(pscau->wzKey), pwzData);
64 ExitOnFailure(hr, "Failed to copy key string to user object");
65
66 hr = WcaGetRecordString(hRec, vuqComponent, &pwzData);
67 ExitOnFailure(hr, "Failed to get Wix4User.Component_");
68 hr = ::StringCchCopyW(pscau->wzComponent, countof(pscau->wzComponent), pwzData);
69 ExitOnFailure(hr, "Failed to copy component string to user object");
70
71 hr = WcaGetRecordFormattedString(hRec, vuqName, &pwzData);
72 ExitOnFailure(hr, "Failed to get Wix4User.Name");
73 hr = ::StringCchCopyW(pscau->wzName, countof(pscau->wzName), pwzData);
74 ExitOnFailure(hr, "Failed to copy name string to user object");
75
76 hr = WcaGetRecordFormattedString(hRec, vuqDomain, &pwzData);
77 ExitOnFailure(hr, "Failed to get Wix4User.Domain");
78 hr = ::StringCchCopyW(pscau->wzDomain, countof(pscau->wzDomain), pwzData);
79 ExitOnFailure(hr, "Failed to copy domain string to user object");
80
81 hr = WcaGetRecordFormattedString(hRec, vuqPassword, &pwzData);
82 ExitOnFailure(hr, "Failed to get Wix4User.Password");
83 hr = ::StringCchCopyW(pscau->wzPassword, countof(pscau->wzPassword), pwzData);
84 ExitOnFailure(hr, "Failed to copy password string to user object");
85 }
86 else if (E_NOMOREITEMS == hr)
87 {
88 WcaLog(LOGMSG_STANDARD, "Error: Cannot locate Wix4User.User='%ls'", wzUser);
89 hr = E_FAIL;
90 }
91 else
92 {
93 ExitOnFailure(hr, "Error or found multiple matching Wix4User rows");
94 }
95
96LExit:
97 ReleaseStr(pwzData);
98
99 return hr;
100}
101
102HRESULT __stdcall ScaGetUserDeferred(
103 __in LPCWSTR wzUser,
104 __in WCA_WRAPQUERY_HANDLE hUserQuery,
105 __out SCA_USER* pscau
106 )
107{
108 if (!wzUser || !pscau)
109 {
110 return E_INVALIDARG;
111 }
112
113 HRESULT hr = S_OK;
114 MSIHANDLE hRec, hRecTest;
115
116 LPWSTR pwzData = NULL;
117
118 // clear struct and bail right away if no user key was passed to search for
119 ::ZeroMemory(pscau, sizeof(*pscau));
120 if (!*wzUser)
121 {
122 ExitFunction1(hr = S_OK);
123 }
124
125 // Reset back to the first record
126 WcaFetchWrappedReset(hUserQuery);
127
128 hr = WcaFetchWrappedRecordWhereString(hUserQuery, vuqUser, wzUser, &hRec);
129 if (S_OK == hr)
130 {
131 hr = WcaFetchWrappedRecordWhereString(hUserQuery, vuqUser, wzUser, &hRecTest);
132 if (S_OK == hr)
133 {
134 AssertSz(FALSE, "Found multiple matching Wix4User rows");
135 }
136
137 hr = WcaGetRecordString(hRec, vuqUser, &pwzData);
138 ExitOnFailure(hr, "Failed to get Wix4User.User");
139 hr = ::StringCchCopyW(pscau->wzKey, countof(pscau->wzKey), pwzData);
140 ExitOnFailure(hr, "Failed to copy key string to user object (in deferred CA)");
141
142 hr = WcaGetRecordString(hRec, vuqComponent, &pwzData);
143 ExitOnFailure(hr, "Failed to get Wix4User.Component_");
144 hr = ::StringCchCopyW(pscau->wzComponent, countof(pscau->wzComponent), pwzData);
145 ExitOnFailure(hr, "Failed to copy component string to user object (in deferred CA)");
146
147 hr = WcaGetRecordString(hRec, vuqName, &pwzData);
148 ExitOnFailure(hr, "Failed to get Wix4User.Name");
149 hr = ::StringCchCopyW(pscau->wzName, countof(pscau->wzName), pwzData);
150 ExitOnFailure(hr, "Failed to copy name string to user object (in deferred CA)");
151
152 hr = WcaGetRecordString(hRec, vuqDomain, &pwzData);
153 ExitOnFailure(hr, "Failed to get Wix4User.Domain");
154 hr = ::StringCchCopyW(pscau->wzDomain, countof(pscau->wzDomain), pwzData);
155 ExitOnFailure(hr, "Failed to copy domain string to user object (in deferred CA)");
156
157 hr = WcaGetRecordString(hRec, vuqPassword, &pwzData);
158 ExitOnFailure(hr, "Failed to get Wix4User.Password");
159 hr = ::StringCchCopyW(pscau->wzPassword, countof(pscau->wzPassword), pwzData);
160 ExitOnFailure(hr, "Failed to copy password string to user object (in deferred CA)");
161 }
162 else if (E_NOMOREITEMS == hr)
163 {
164 WcaLog(LOGMSG_STANDARD, "Error: Cannot locate Wix4User.User='%ls'", wzUser);
165 hr = E_FAIL;
166 }
167 else
168 {
169 ExitOnFailure(hr, "Error fetching single Wix4User row");
170 }
171
172LExit:
173 ReleaseStr(pwzData);
174
175 return hr;
176}
177
178
179HRESULT __stdcall ScaGetGroup(
180 __in LPCWSTR wzGroup,
181 __out SCA_GROUP* pscag
182 )
183{
184 if (!wzGroup || !pscag)
185 {
186 return E_INVALIDARG;
187 }
188
189 HRESULT hr = S_OK;
190 PMSIHANDLE hView, hRec;
191
192 LPWSTR pwzData = NULL;
193
194 hRec = ::MsiCreateRecord(1);
195 hr = WcaSetRecordString(hRec, 1, wzGroup);
196 ExitOnFailure(hr, "Failed to look up Group");
197
198 hr = WcaOpenView(vcsGroupQuery, &hView);
199 ExitOnFailure(hr, "Failed to open view on Wix4Group table");
200 hr = WcaExecuteView(hView, hRec);
201 ExitOnFailure(hr, "Failed to execute view on Wix4Group table");
202
203 hr = WcaFetchSingleRecord(hView, &hRec);
204 if (S_OK == hr)
205 {
206 hr = WcaGetRecordString(hRec, vgqGroup, &pwzData);
207 ExitOnFailure(hr, "Failed to get Wix4Group.Wix4Group.");
208 hr = ::StringCchCopyW(pscag->wzKey, countof(pscag->wzKey), pwzData);
209 ExitOnFailure(hr, "Failed to copy Wix4Group.Wix4Group.");
210
211 hr = WcaGetRecordString(hRec, vgqComponent, &pwzData);
212 ExitOnFailure(hr, "Failed to get Wix4Group.Component_");
213 hr = ::StringCchCopyW(pscag->wzComponent, countof(pscag->wzComponent), pwzData);
214 ExitOnFailure(hr, "Failed to copy Wix4Group.Component_.");
215
216 hr = WcaGetRecordFormattedString(hRec, vgqName, &pwzData);
217 ExitOnFailure(hr, "Failed to get Wix4Group.Name");
218 hr = ::StringCchCopyW(pscag->wzName, countof(pscag->wzName), pwzData);
219 ExitOnFailure(hr, "Failed to copy Wix4Group.Name.");
220
221 hr = WcaGetRecordFormattedString(hRec, vgqDomain, &pwzData);
222 ExitOnFailure(hr, "Failed to get Wix4Group.Domain");
223 hr = ::StringCchCopyW(pscag->wzDomain, countof(pscag->wzDomain), pwzData);
224 ExitOnFailure(hr, "Failed to copy Wix4Group.Domain.");
225 }
226 else if (E_NOMOREITEMS == hr)
227 {
228 WcaLog(LOGMSG_STANDARD, "Error: Cannot locate Wix4Group.Wix4Group='%ls'", wzGroup);
229 hr = E_FAIL;
230 }
231 else
232 {
233 ExitOnFailure(hr, "Error or found multiple matching Wix4Group rows");
234 }
235
236LExit:
237 ReleaseStr(pwzData);
238
239 return hr;
240}
241
242
243void ScaUserFreeList(
244 __in SCA_USER* psuList
245 )
246{
247 SCA_USER* psuDelete = psuList;
248 while (psuList)
249 {
250 psuDelete = psuList;
251 psuList = psuList->psuNext;
252
253 ScaGroupFreeList(psuDelete->psgGroups);
254 MemFree(psuDelete);
255 }
256}
257
258
259void ScaGroupFreeList(
260 __in SCA_GROUP* psgList
261 )
262{
263 SCA_GROUP* psgDelete = psgList;
264 while (psgList)
265 {
266 psgDelete = psgList;
267 psgList = psgList->psgNext;
268
269 MemFree(psgDelete);
270 }
271}
272
273
274HRESULT ScaUserRead(
275 __out SCA_USER** ppsuList
276 )
277{
278 //Assert(FALSE);
279 Assert(ppsuList);
280
281 HRESULT hr = S_OK;
282 UINT er = ERROR_SUCCESS;
283 PMSIHANDLE hView, hRec, hUserRec, hUserGroupView;
284
285 LPWSTR pwzData = NULL;
286
287 BOOL fUserGroupExists = FALSE;
288
289 SCA_USER *psu = NULL;
290
291 INSTALLSTATE isInstalled, isAction;
292
293 if (S_OK != WcaTableExists(L"Wix4User"))
294 {
295 WcaLog(LOGMSG_VERBOSE, "Wix4User Table does not exist, exiting");
296 ExitFunction1(hr = S_FALSE);
297 }
298
299 if (S_OK == WcaTableExists(L"Wix4UserGroup"))
300 {
301 fUserGroupExists = TRUE;
302 }
303
304 //
305 // loop through all the users
306 //
307 hr = WcaOpenExecuteView(vActionableQuery, &hView);
308 ExitOnFailure(hr, "failed to open view on Wix4User table");
309 while (S_OK == (hr = WcaFetchRecord(hView, &hRec)))
310 {
311 hr = WcaGetRecordString(hRec, vaqComponent, &pwzData);
312 ExitOnFailure(hr, "failed to get Wix4User.Component");
313
314 er = ::MsiGetComponentStateW(WcaGetInstallHandle(), pwzData, &isInstalled, &isAction);
315 hr = HRESULT_FROM_WIN32(er);
316 ExitOnFailure(hr, "failed to get Component state for Wix4User");
317
318 // don't bother if we aren't installing or uninstalling this component
319 if (WcaIsInstalling(isInstalled, isAction) || WcaIsUninstalling(isInstalled, isAction))
320 {
321 //
322 // Add the user to the list and populate it's values
323 //
324 hr = AddUserToList(ppsuList);
325 ExitOnFailure(hr, "failed to add user to list");
326
327 psu = *ppsuList;
328
329 psu->isInstalled = isInstalled;
330 psu->isAction = isAction;
331 hr = ::StringCchCopyW(psu->wzComponent, countof(psu->wzComponent), pwzData);
332 ExitOnFailure(hr, "failed to copy component name: %ls", pwzData);
333
334 hr = WcaGetRecordString(hRec, vaqUser, &pwzData);
335 ExitOnFailure(hr, "failed to get Wix4User.User");
336 hr = ::StringCchCopyW(psu->wzKey, countof(psu->wzKey), pwzData);
337 ExitOnFailure(hr, "failed to copy user key: %ls", pwzData);
338
339 hr = WcaGetRecordFormattedString(hRec, vaqName, &pwzData);
340 ExitOnFailure(hr, "failed to get Wix4User.Name");
341 hr = ::StringCchCopyW(psu->wzName, countof(psu->wzName), pwzData);
342 ExitOnFailure(hr, "failed to copy user name: %ls", pwzData);
343
344 hr = WcaGetRecordFormattedString(hRec, vaqDomain, &pwzData);
345 ExitOnFailure(hr, "failed to get Wix4User.Domain");
346 hr = ::StringCchCopyW(psu->wzDomain, countof(psu->wzDomain), pwzData);
347 ExitOnFailure(hr, "failed to copy user domain: %ls", pwzData);
348
349 hr = WcaGetRecordFormattedString(hRec, vaqPassword, &pwzData);
350 ExitOnFailure(hr, "failed to get Wix4User.Password");
351 hr = ::StringCchCopyW(psu->wzPassword, countof(psu->wzPassword), pwzData);
352 ExitOnFailure(hr, "failed to copy user password");
353
354 hr = WcaGetRecordInteger(hRec, vaqAttributes, &psu->iAttributes);
355 ExitOnFailure(hr, "failed to get Wix4User.Attributes");
356
357 // Check if this user is to be added to any groups
358 if (fUserGroupExists)
359 {
360 hUserRec = ::MsiCreateRecord(1);
361 hr = WcaSetRecordString(hUserRec, 1, psu->wzKey);
362 ExitOnFailure(hr, "Failed to create user record for querying Wix4UserGroup table");
363
364 hr = WcaOpenView(vcsUserGroupQuery, &hUserGroupView);
365 ExitOnFailure(hr, "Failed to open view on Wix4UserGroup table for user %ls", psu->wzKey);
366 hr = WcaExecuteView(hUserGroupView, hUserRec);
367 ExitOnFailure(hr, "Failed to execute view on Wix4UserGroup table for user: %ls", psu->wzKey);
368
369 while (S_OK == (hr = WcaFetchRecord(hUserGroupView, &hRec)))
370 {
371 hr = WcaGetRecordString(hRec, vugqGroup, &pwzData);
372 ExitOnFailure(hr, "failed to get Wix4UserGroup.Group");
373
374 hr = AddGroupToList(&(psu->psgGroups));
375 ExitOnFailure(hr, "failed to add group to list");
376
377 hr = ScaGetGroup(pwzData, psu->psgGroups);
378 ExitOnFailure(hr, "failed to get information for group: %ls", pwzData);
379 }
380
381 if (E_NOMOREITEMS == hr)
382 {
383 hr = S_OK;
384 }
385 ExitOnFailure(hr, "failed to enumerate selected rows from Wix4UserGroup table");
386 }
387 }
388 }
389
390 if (E_NOMOREITEMS == hr)
391 {
392 hr = S_OK;
393 }
394 ExitOnFailure(hr, "failed to enumerate selected rows from Wix4User table");
395
396LExit:
397 ReleaseStr(pwzData);
398
399 return hr;
400}
401
402
403static HRESULT WriteGroupInfo(
404 __in SCA_GROUP* psgList,
405 __in LPWSTR *ppwzActionData
406 )
407{
408 HRESULT hr = S_OK;
409
410 for (SCA_GROUP* psg = psgList; psg; psg = psg->psgNext)
411 {
412 hr = WcaWriteStringToCaData(psg->wzName, ppwzActionData);
413 ExitOnFailure(hr, "failed to add group name to custom action data: %ls", psg->wzName);
414
415 hr = WcaWriteStringToCaData(psg->wzDomain, ppwzActionData);
416 ExitOnFailure(hr, "failed to add group domain to custom action data: %ls", psg->wzDomain);
417 }
418
419LExit:
420 return hr;
421}
422
423
424// Behaves like WriteGroupInfo, but it filters out groups the user is currently a member of,
425// because we don't want to rollback those
426static HRESULT WriteGroupRollbackInfo(
427 __in LPCWSTR pwzName,
428 __in LPCWSTR pwzDomain,
429 __in SCA_GROUP* psgList,
430 __in LPWSTR *ppwzActionData
431 )
432{
433 HRESULT hr = S_OK;
434 BOOL fIsMember = FALSE;
435
436 for (SCA_GROUP* psg = psgList; psg; psg = psg->psgNext)
437 {
438 hr = UserCheckIsMember(pwzName, pwzDomain, psg->wzName, psg->wzDomain, &fIsMember);
439 if (FAILED(hr))
440 {
441 WcaLog(LOGMSG_VERBOSE, "Failed to check if user: %ls (domain: %ls) is member of a group while collecting rollback information (error code 0x%x) - continuing", pwzName, pwzDomain, hr);
442 hr = S_OK;
443 continue;
444 }
445
446 // If the user is currently a member, we don't want to undo that on rollback, so skip adding
447 // this group record to the list of groups to rollback
448 if (fIsMember)
449 {
450 continue;
451 }
452
453 hr = WcaWriteStringToCaData(psg->wzName, ppwzActionData);
454 ExitOnFailure(hr, "failed to add group name to custom action data: %ls", psg->wzName);
455
456 hr = WcaWriteStringToCaData(psg->wzDomain, ppwzActionData);
457 ExitOnFailure(hr, "failed to add group domain to custom action data: %ls", psg->wzDomain);
458 }
459
460LExit:
461 return hr;
462}
463
464
465/* ****************************************************************
466ScaUserExecute - Schedules user account creation or removal based on
467component state.
468
469******************************************************************/
470HRESULT ScaUserExecute(
471 __in SCA_USER *psuList
472 )
473{
474 HRESULT hr = S_OK;
475 DWORD er = 0;
476 PDOMAIN_CONTROLLER_INFOW pDomainControllerInfo = NULL;
477
478 LPWSTR pwzBaseScriptKey = NULL;
479 DWORD cScriptKey = 0;
480
481 USER_INFO_0 *pUserInfo = NULL;
482 LPWSTR pwzScriptKey = NULL;
483 LPWSTR pwzActionData = NULL;
484 LPWSTR pwzRollbackData = NULL;
485
486 // Get the base script key for this CustomAction.
487 hr = WcaCaScriptCreateKey(&pwzBaseScriptKey);
488 ExitOnFailure(hr, "Failed to get encoding key.");
489
490 // Loop through all the users to be configured.
491 for (SCA_USER *psu = psuList; psu; psu = psu->psuNext)
492 {
493 USER_EXISTS ueUserExists = USER_EXISTS_INDETERMINATE;
494
495 // Always put the User Name and Domain plus Attributes on the front of the CustomAction
496 // data. Sometimes we'll add more data.
497 Assert(psu->wzName);
498 hr = WcaWriteStringToCaData(psu->wzName, &pwzActionData);
499 ExitOnFailure(hr, "Failed to add user name to custom action data: %ls", psu->wzName);
500 hr = WcaWriteStringToCaData(psu->wzDomain, &pwzActionData);
501 ExitOnFailure(hr, "Failed to add user domain to custom action data: %ls", psu->wzDomain);
502 hr = WcaWriteIntegerToCaData(psu->iAttributes, &pwzActionData);
503 ExitOnFailure(hr, "failed to add user attributes to custom action data for user: %ls", psu->wzKey);
504
505 // Check to see if the user already exists since we have to be very careful when adding
506 // and removing users. Note: MSDN says that it is safe to call these APIs from any
507 // user, so we should be safe calling it during immediate mode.
508 er = ::NetApiBufferAllocate(sizeof(USER_INFO_0), reinterpret_cast<LPVOID*>(&pUserInfo));
509 hr = HRESULT_FROM_WIN32(er);
510 ExitOnFailure(hr, "Failed to allocate memory to check existence of user: %ls", psu->wzName);
511
512 LPCWSTR wzDomain = psu->wzDomain;
513 if (wzDomain && *wzDomain)
514 {
515 er = ::DsGetDcNameW(NULL, wzDomain, NULL, NULL, NULL, &pDomainControllerInfo);
516 if (RPC_S_SERVER_UNAVAILABLE == er)
517 {
518 // MSDN says, if we get the above error code, try again with the "DS_FORCE_REDISCOVERY" flag
519 er = ::DsGetDcNameW(NULL, wzDomain, NULL, NULL, DS_FORCE_REDISCOVERY, &pDomainControllerInfo);
520 }
521 if (ERROR_SUCCESS == er)
522 {
523 wzDomain = pDomainControllerInfo->DomainControllerName + 2; //Add 2 so that we don't get the \\ prefix
524 }
525 }
526
527 er = ::NetUserGetInfo(wzDomain, psu->wzName, 0, reinterpret_cast<LPBYTE*>(pUserInfo));
528 if (NERR_Success == er)
529 {
530 ueUserExists = USER_EXISTS_YES;
531 }
532 else if (NERR_UserNotFound == er)
533 {
534 ueUserExists = USER_EXISTS_NO;
535 }
536 else
537 {
538 ueUserExists = USER_EXISTS_INDETERMINATE;
539 hr = HRESULT_FROM_WIN32(er);
540 WcaLog(LOGMSG_VERBOSE, "Failed to check existence of domain: %ls, user: %ls (error code 0x%x) - continuing", wzDomain, psu->wzName, hr);
541 hr = S_OK;
542 er = ERROR_SUCCESS;
543 }
544
545 if (WcaIsInstalling(psu->isInstalled, psu->isAction))
546 {
547 // If the user exists, check to see if we are supposed to fail if user the exists before
548 // the install.
549 if (USER_EXISTS_YES == ueUserExists)
550 {
551 // Reinstalls will always fail if we don't remove the check for "fail if exists".
552 if (WcaIsReInstalling(psu->isInstalled, psu->isAction))
553 {
554 psu->iAttributes &= ~SCAU_FAIL_IF_EXISTS;
555 }
556
557 if ((SCAU_FAIL_IF_EXISTS & (psu->iAttributes)) && !(SCAU_UPDATE_IF_EXISTS & (psu->iAttributes)))
558 {
559 hr = HRESULT_FROM_WIN32(NERR_UserExists);
560 MessageExitOnFailure(hr, msierrUSRFailedUserCreateExists, "Failed to create user: %ls because user already exists.", psu->wzName);
561 }
562 }
563
564 // Rollback only if the user already exists, we couldn't determine if the user exists, or we are going to create the user
565 if ((USER_EXISTS_YES == ueUserExists) || (USER_EXISTS_INDETERMINATE == ueUserExists) || !(psu->iAttributes & SCAU_DONT_CREATE_USER))
566 {
567 ++cScriptKey;
568 hr = StrAllocFormatted(&pwzScriptKey, L"%ls%u", pwzBaseScriptKey, cScriptKey);
569 ExitOnFailure(hr, "Failed to create encoding key.");
570
571 // Write the script key to CustomActionData for install and rollback so information can be passed to rollback.
572 hr = WcaWriteStringToCaData(pwzScriptKey, &pwzActionData);
573 ExitOnFailure(hr, "Failed to add encoding key to custom action data.");
574
575 hr = WcaWriteStringToCaData(pwzScriptKey, &pwzRollbackData);
576 ExitOnFailure(hr, "Failed to add encoding key to rollback custom action data.");
577
578 INT iRollbackUserAttributes = psu->iAttributes;
579
580 // If the user already exists, ensure this is accounted for in rollback
581 if (USER_EXISTS_YES == ueUserExists)
582 {
583 iRollbackUserAttributes |= SCAU_DONT_CREATE_USER;
584 }
585 else
586 {
587 iRollbackUserAttributes &= ~SCAU_DONT_CREATE_USER;
588 }
589
590 // The deferred CA determines when to rollback User Rights Assignments so these should never be set.
591 iRollbackUserAttributes &= ~SCAU_ALLOW_LOGON_AS_SERVICE;
592 iRollbackUserAttributes &= ~SCAU_ALLOW_LOGON_AS_BATCH;
593
594 hr = WcaWriteStringToCaData(psu->wzName, &pwzRollbackData);
595 ExitOnFailure(hr, "Failed to add user name to rollback custom action data: %ls", psu->wzName);
596 hr = WcaWriteStringToCaData(psu->wzDomain, &pwzRollbackData);
597 ExitOnFailure(hr, "Failed to add user domain to rollback custom action data: %ls", psu->wzDomain);
598 hr = WcaWriteIntegerToCaData(iRollbackUserAttributes, &pwzRollbackData);
599 ExitOnFailure(hr, "failed to add user attributes to rollback custom action data for user: %ls", psu->wzKey);
600
601 // If the user already exists, add relevant group information to rollback data
602 if (USER_EXISTS_YES == ueUserExists || USER_EXISTS_INDETERMINATE == ueUserExists)
603 {
604 hr = WriteGroupRollbackInfo(psu->wzName, psu->wzDomain, psu->psgGroups, &pwzRollbackData);
605 ExitOnFailure(hr, "failed to add group information to rollback custom action data");
606 }
607
608 hr = WcaDoDeferredAction(CUSTOM_ACTION_DECORATION(L"CreateUserRollback"), pwzRollbackData, COST_USER_DELETE);
609 ExitOnFailure(hr, "failed to schedule CreateUserRollback");
610 }
611 else
612 {
613 // Write empty script key to CustomActionData since there is no rollback.
614 hr = WcaWriteStringToCaData(L"", &pwzActionData);
615 ExitOnFailure(hr, "Failed to add empty encoding key to custom action data.");
616 }
617
618 //
619 // Schedule the creation now.
620 //
621 hr = WcaWriteStringToCaData(psu->wzPassword, &pwzActionData);
622 ExitOnFailure(hr, "failed to add user password to custom action data for user: %ls", psu->wzKey);
623
624 // Add user's group information to custom action data
625 hr = WriteGroupInfo(psu->psgGroups, &pwzActionData);
626 ExitOnFailure(hr, "failed to add group information to custom action data");
627
628 hr = WcaDoDeferredAction(CUSTOM_ACTION_DECORATION(L"CreateUser"), pwzActionData, COST_USER_ADD);
629 ExitOnFailure(hr, "failed to schedule CreateUser");
630 }
631 else if (((USER_EXISTS_YES == ueUserExists) || (USER_EXISTS_INDETERMINATE == ueUserExists)) && WcaIsUninstalling(psu->isInstalled, psu->isAction) && !(psu->iAttributes & SCAU_DONT_REMOVE_ON_UNINSTALL))
632 {
633 // Add user's group information - this will ensure the user can be removed from any groups they were added to, if the user isn't be deleted
634 hr = WriteGroupInfo(psu->psgGroups, &pwzActionData);
635 ExitOnFailure(hr, "failed to add group information to custom action data");
636
637 //
638 // Schedule the removal because the user exists and we don't have any flags set
639 // that say, don't remove the user on uninstall.
640 //
641 // Note: We can't rollback the removal of a user which is why RemoveUser is a commit
642 // CustomAction.
643 hr = WcaDoDeferredAction(CUSTOM_ACTION_DECORATION(L"RemoveUser"), pwzActionData, COST_USER_DELETE);
644 ExitOnFailure(hr, "failed to schedule RemoveUser");
645 }
646
647 ReleaseNullStr(pwzScriptKey);
648 ReleaseNullStr(pwzActionData);
649 ReleaseNullStr(pwzRollbackData);
650 if (pUserInfo)
651 {
652 ::NetApiBufferFree(static_cast<LPVOID>(pUserInfo));
653 pUserInfo = NULL;
654 }
655 if (pDomainControllerInfo)
656 {
657 ::NetApiBufferFree(static_cast<LPVOID>(pDomainControllerInfo));
658 pDomainControllerInfo = NULL;
659 }
660 }
661
662LExit:
663 ReleaseStr(pwzBaseScriptKey);
664 ReleaseStr(pwzScriptKey);
665 ReleaseStr(pwzActionData);
666 ReleaseStr(pwzRollbackData);
667 if (pUserInfo)
668 {
669 ::NetApiBufferFree(static_cast<LPVOID>(pUserInfo));
670 }
671 if (pDomainControllerInfo)
672 {
673 ::NetApiBufferFree(static_cast<LPVOID>(pDomainControllerInfo));
674 }
675
676 return hr;
677}
678
679
680static HRESULT AddUserToList(
681 __inout SCA_USER** ppsuList
682 )
683{
684 HRESULT hr = S_OK;
685 SCA_USER* psu = static_cast<SCA_USER*>(MemAlloc(sizeof(SCA_USER), TRUE));
686 ExitOnNull(psu, hr, E_OUTOFMEMORY, "failed to allocate memory for new user list element");
687
688 psu->psuNext = *ppsuList;
689 *ppsuList = psu;
690
691LExit:
692 return hr;
693}
694
695
696static HRESULT AddGroupToList(
697 __inout SCA_GROUP** ppsgList
698 )
699{
700 HRESULT hr = S_OK;
701 SCA_GROUP* psg = static_cast<SCA_GROUP*>(MemAlloc(sizeof(SCA_GROUP), TRUE));
702 ExitOnNull(psg, hr, E_OUTOFMEMORY, "failed to allocate memory for new group list element");
703
704 psg->psgNext = *ppsgList;
705 *ppsgList = psg;
706
707LExit:
708 return hr;
709}
diff --git a/src/ext/Util/ca/scauser.h b/src/ext/Util/ca/scauser.h
new file mode 100644
index 00000000..a5fd5ea8
--- /dev/null
+++ b/src/ext/Util/ca/scauser.h
@@ -0,0 +1,67 @@
1#pragma once
2// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
3
4
5enum USER_EXISTS
6{
7 USER_EXISTS_YES,
8 USER_EXISTS_NO,
9 USER_EXISTS_INDETERMINATE
10};
11
12// structs
13struct SCA_GROUP
14{
15 WCHAR wzKey[MAX_DARWIN_KEY + 1];
16 WCHAR wzComponent[MAX_DARWIN_KEY + 1];
17
18 WCHAR wzDomain[MAX_DARWIN_COLUMN + 1];
19 WCHAR wzName[MAX_DARWIN_COLUMN + 1];
20
21 SCA_GROUP *psgNext;
22};
23
24struct SCA_USER
25{
26 WCHAR wzKey[MAX_DARWIN_KEY + 1];
27 WCHAR wzComponent[MAX_DARWIN_KEY + 1];
28 INSTALLSTATE isInstalled;
29 INSTALLSTATE isAction;
30
31 WCHAR wzDomain[MAX_DARWIN_COLUMN + 1];
32 WCHAR wzName[MAX_DARWIN_COLUMN + 1];
33 WCHAR wzPassword[MAX_DARWIN_COLUMN + 1];
34 INT iAttributes;
35
36 SCA_GROUP *psgGroups;
37
38 SCA_USER *psuNext;
39};
40
41
42// prototypes
43HRESULT __stdcall ScaGetUser(
44 __in LPCWSTR wzUser,
45 __out SCA_USER* pscau
46 );
47HRESULT __stdcall ScaGetUserDeferred(
48 __in LPCWSTR wzUser,
49 __in WCA_WRAPQUERY_HANDLE hUserQuery,
50 __out SCA_USER* pscau
51 );
52HRESULT __stdcall ScaGetGroup(
53 __in LPCWSTR wzGroup,
54 __out SCA_GROUP* pscag
55 );
56void ScaUserFreeList(
57 __in SCA_USER* psuList
58 );
59void ScaGroupFreeList(
60 __in SCA_GROUP* psgList
61 );
62HRESULT ScaUserRead(
63 __inout SCA_USER** ppsuList
64 );
65HRESULT ScaUserExecute(
66 __in SCA_USER *psuList
67 );
diff --git a/src/ext/Util/ca/secureobj.cpp b/src/ext/Util/ca/secureobj.cpp
new file mode 100644
index 00000000..72842eb5
--- /dev/null
+++ b/src/ext/Util/ca/secureobj.cpp
@@ -0,0 +1,915 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3#include "precomp.h"
4
5// structs
6LPCWSTR wzQUERY_SECUREOBJECTS = L"SELECT `Wix4SecureObject`.`Wix4SecureObject`, `Wix4SecureObject`.`Table`, `Wix4SecureObject`.`Domain`, `Wix4SecureObject`.`User`, `Wix4SecureObject`.`Attributes`, "
7 L"`Wix4SecureObject`.`Permission`, `Wix4SecureObject`.`Component_`, `Component`.`Attributes` FROM `Wix4SecureObject`,`Component` WHERE "
8 L"`Wix4SecureObject`.`Component_`=`Component`.`Component`";
9enum eQUERY_SECUREOBJECTS { QSO_SECUREOBJECT = 1, QSO_TABLE, QSO_DOMAIN, QSO_USER, QSO_ATTRIBUTES, QSO_PERMISSION, QSO_COMPONENT, QSO_COMPATTRIBUTES };
10
11LPCWSTR wzQUERY_REGISTRY = L"SELECT `Registry`.`Registry`, `Registry`.`Root`, `Registry`.`Key` FROM `Registry` WHERE `Registry`.`Registry`=?";
12enum eQUERY_OBJECTCOMPONENT { QSOC_REGISTRY = 1, QSOC_REGROOT, QSOC_REGKEY };
13
14LPCWSTR wzQUERY_SERVICEINSTALL = L"SELECT `ServiceInstall`.`Name` FROM `ServiceInstall` WHERE `ServiceInstall`.`ServiceInstall`=?";
15enum eQUERY_SECURESERVICEINSTALL { QSSI_NAME = 1 };
16
17enum eOBJECTTYPE { OT_UNKNOWN, OT_SERVICE, OT_FOLDER, OT_FILE, OT_REGISTRY };
18
19enum eSECURE_OBJECT_ATTRIBUTE
20{
21 SECURE_OBJECT_ATTRIBUTE_INHERITABLE = 0x1,
22};
23
24static eOBJECTTYPE EObjectTypeFromString(
25 __in LPCWSTR pwzTable
26 )
27{
28 if (NULL == pwzTable)
29 {
30 return OT_UNKNOWN;
31 }
32
33 eOBJECTTYPE eType = OT_UNKNOWN;
34
35 // ensure we're looking at a known table
36 if (0 == lstrcmpW(L"ServiceInstall", pwzTable))
37 {
38 eType = OT_SERVICE;
39 }
40 else if (0 == lstrcmpW(L"CreateFolder", pwzTable))
41 {
42 eType = OT_FOLDER;
43 }
44 else if (0 == lstrcmpW(L"File", pwzTable))
45 {
46 eType = OT_FILE;
47 }
48 else if (0 == lstrcmpW(L"Registry", pwzTable))
49 {
50 eType = OT_REGISTRY;
51 }
52
53 return eType;
54}
55
56static SE_OBJECT_TYPE SEObjectTypeFromString(
57 __in LPCWSTR pwzTable
58 )
59{
60 if (NULL == pwzTable)
61 {
62 return SE_UNKNOWN_OBJECT_TYPE;
63 }
64
65 SE_OBJECT_TYPE objectType = SE_UNKNOWN_OBJECT_TYPE;
66
67 if (0 == lstrcmpW(L"ServiceInstall", pwzTable))
68 {
69 objectType = SE_SERVICE;
70 }
71 else if (0 == lstrcmpW(L"CreateFolder", pwzTable) || 0 == lstrcmpW(L"File", pwzTable))
72 {
73 objectType = SE_FILE_OBJECT;
74 }
75 else if (0 == lstrcmpW(L"Registry", pwzTable))
76 {
77 objectType = SE_REGISTRY_KEY;
78 }
79 else
80 {
81 // Do nothing; we'll return SE_UNKNOWN_OBJECT_TYPE, and the caller should handle the situation
82 }
83
84 return objectType;
85}
86
87static HRESULT StoreACLRollbackInfo(
88 __in LPWSTR pwzObject,
89 __in LPCWSTR pwzTable
90 )
91{
92 HRESULT hr = S_OK;
93 DWORD er = ERROR_SUCCESS;
94 PSECURITY_DESCRIPTOR psd = NULL;
95 SECURITY_DESCRIPTOR_CONTROL sdc = {0};
96 DWORD dwRevision = 0;
97 LPWSTR pwzCustomActionData = NULL;
98 LPWSTR pwzSecurityInfo = NULL;
99
100 Assert(pwzObject && pwzTable);
101
102 SE_OBJECT_TYPE objectType = SEObjectTypeFromString(const_cast<LPCWSTR> (pwzTable));
103
104 if (SE_UNKNOWN_OBJECT_TYPE != objectType)
105 {
106 er = ::GetNamedSecurityInfoW(pwzObject, objectType, DACL_SECURITY_INFORMATION, NULL, NULL, NULL, NULL, &psd);
107 if (ERROR_FILE_NOT_FOUND == er || ERROR_PATH_NOT_FOUND == er || ERROR_SERVICE_DOES_NOT_EXIST == HRESULT_CODE(er))
108 {
109 // If the file, path or service doesn't exist yet, skip rollback without a message
110 hr = HRESULT_FROM_WIN32(er);
111 ExitFunction();
112 }
113
114 ExitOnFailure(hr = HRESULT_FROM_WIN32(er), "Unable to schedule rollback for object: %ls", pwzObject);
115
116 //Need to see if DACL is protected so getting Descriptor information
117 if (!::GetSecurityDescriptorControl(psd, &sdc, &dwRevision))
118 {
119 ExitOnLastError(hr, "Unable to schedule rollback for object (failed to get security descriptor control): %ls", pwzObject);
120 }
121
122 // Convert the security information to a string, and write this to the custom action data
123 if (!::ConvertSecurityDescriptorToStringSecurityDescriptorW(psd,SDDL_REVISION_1,DACL_SECURITY_INFORMATION,&pwzSecurityInfo,NULL))
124 {
125 hr = E_UNEXPECTED;
126 ExitOnFailure(hr, "Unable to schedule rollback for object (failed to convert security descriptor to a valid security descriptor string): %ls", pwzObject);
127 }
128
129 hr = WcaWriteStringToCaData(pwzObject, &pwzCustomActionData);
130 ExitOnFailure(hr, "failed to add object data to rollback CustomActionData");
131
132 hr = WcaWriteStringToCaData(pwzTable, &pwzCustomActionData);
133 ExitOnFailure(hr, "failed to add table name to rollback CustomActionData");
134
135 hr = WcaWriteStringToCaData(pwzSecurityInfo, &pwzCustomActionData);
136 ExitOnFailure(hr, "failed to add security info data to rollback CustomActionData");
137
138 // Write a 1 if DACL is protected, 0 otherwise
139 if (sdc & SE_DACL_PROTECTED)
140 {
141 hr = WcaWriteIntegerToCaData(1,&pwzCustomActionData);
142 ExitOnFailure(hr, "failed to add data to rollbackCustomActionData");
143 }
144 else
145 {
146 hr = WcaWriteIntegerToCaData(0,&pwzCustomActionData);
147 ExitOnFailure(hr, "failed to add data to rollback CustomActionData");
148 }
149
150 hr = WcaDoDeferredAction(CUSTOM_ACTION_DECORATION(L"ExecSecureObjectsRollback"), pwzCustomActionData, COST_SECUREOBJECT);
151 ExitOnFailure(hr, "failed to schedule ExecSecureObjectsRollback for item: %ls of type: %ls", pwzObject, pwzTable);
152
153 ReleaseStr(pwzCustomActionData);
154 pwzCustomActionData = NULL;
155
156 }
157 else
158 {
159 MessageExitOnFailure(hr = E_UNEXPECTED, msierrSecureObjectsUnknownType, "unknown object type: %ls", pwzTable);
160 }
161LExit:
162 ReleaseStr(pwzCustomActionData);
163
164 if (psd)
165 {
166 ::LocalFree(psd);
167 }
168
169 return hr;
170}
171
172static HRESULT GetTargetPath(
173 __in eOBJECTTYPE eType,
174 __in LPCWSTR pwzSecureObject,
175 __out LPWSTR* ppwzTargetPath
176 )
177{
178 HRESULT hr = S_OK;
179
180 PMSIHANDLE hView = NULL;
181 PMSIHANDLE hRecObject = NULL;
182 PMSIHANDLE hRec = NULL;
183
184 int iRoot = 0;
185 int iAllUsers = 0;
186 LPWSTR pwzKey = NULL;
187 LPWSTR pwzFormattedString = NULL;
188
189 if (OT_SERVICE == eType)
190 {
191 hr = WcaTableExists(L"ServiceInstall");
192 if (S_FALSE == hr)
193 {
194 hr = E_UNEXPECTED;
195 }
196 ExitOnFailure(hr, "failed to open ServiceInstall table to secure object");
197
198 hr = WcaOpenView(wzQUERY_SERVICEINSTALL, &hView);
199 ExitOnFailure(hr, "failed to open view on ServiceInstall table");
200
201 // create a record that stores the object to secure
202 hRec = MsiCreateRecord(1);
203 MsiRecordSetStringW(hRec, 1, pwzSecureObject);
204
205 // execute a view looking for the object's ServiceInstall.ServiceInstall row.
206 hr = WcaExecuteView(hView, hRec);
207 ExitOnFailure(hr, "failed to execute view on ServiceInstall table");
208 hr = WcaFetchSingleRecord(hView, &hRecObject);
209 ExitOnFailure(hr, "failed to fetch ServiceInstall row for secure object");
210
211 hr = WcaGetRecordFormattedString(hRecObject, QSSI_NAME, ppwzTargetPath);
212 ExitOnFailure(hr, "failed to get service name for secure object: %ls", pwzSecureObject);
213 }
214 else if (OT_FOLDER == eType)
215 {
216 hr = WcaGetTargetPath(pwzSecureObject, ppwzTargetPath);
217 ExitOnFailure(hr, "failed to get target path for directory id: %ls", pwzSecureObject);
218 }
219 else if (OT_FILE == eType)
220 {
221 hr = StrAllocFormatted(&pwzFormattedString, L"[#%s]", pwzSecureObject);
222 ExitOnFailure(hr, "failed to create formatted string for securing file object: %ls", pwzSecureObject);
223
224 hr = WcaGetFormattedString(pwzFormattedString, ppwzTargetPath);
225 ExitOnFailure(hr, "failed to get file path from formatted string: %ls for secure object: %ls", pwzFormattedString, pwzSecureObject);
226 }
227 else if (OT_REGISTRY == eType)
228 {
229 hr = WcaTableExists(L"Registry");
230 if (S_FALSE == hr)
231 {
232 hr = E_UNEXPECTED;
233 }
234 ExitOnFailure(hr, "failed to open Registry table to secure object");
235
236 hr = WcaOpenView(wzQUERY_REGISTRY, &hView);
237 ExitOnFailure(hr, "failed to open view on Registry table");
238
239 // create a record that stores the object to secure
240 hRec = MsiCreateRecord(1);
241 MsiRecordSetStringW(hRec, 1, pwzSecureObject);
242
243 // execute a view looking for the object's Registry row
244 hr = WcaExecuteView(hView, hRec);
245 ExitOnFailure(hr, "failed to execute view on Registry table");
246 hr = WcaFetchSingleRecord(hView, &hRecObject);
247 ExitOnFailure(hr, "failed to fetch Registry row for secure object");
248
249 hr = WcaGetRecordInteger(hRecObject, QSOC_REGROOT, &iRoot);
250 ExitOnFailure(hr, "Failed to get reg key root for secure object: %ls", pwzSecureObject);
251
252 hr = WcaGetRecordFormattedString(hRecObject, QSOC_REGKEY, &pwzKey);
253 ExitOnFailure(hr, "Failed to get reg key for secure object: %ls", pwzSecureObject);
254
255 // Decode the root value
256 if (-1 == iRoot)
257 {
258 // They didn't specify a root so that means it's either HKCU or HKLM depending on ALLUSERS property
259 hr = WcaGetIntProperty(L"ALLUSERS", &iAllUsers);
260 ExitOnFailure(hr, "failed to get value of ALLUSERS property");
261
262 if (1 == iAllUsers)
263 {
264 hr = StrAllocString(ppwzTargetPath, L"MACHINE\\", 0);
265 ExitOnFailure(hr, "failed to allocate target registry string with HKLM root");
266 }
267 else
268 {
269 hr = StrAllocString(ppwzTargetPath, L"CURRENT_USER\\", 0);
270 ExitOnFailure(hr, "failed to allocate target registry string with HKCU root");
271 }
272 }
273 else if (msidbRegistryRootClassesRoot == iRoot)
274 {
275 hr = StrAllocString(ppwzTargetPath, L"CLASSES_ROOT\\", 0);
276 ExitOnFailure(hr, "failed to allocate target registry string with HKCR root");
277 }
278 else if (msidbRegistryRootCurrentUser == iRoot)
279 {
280 hr = StrAllocString(ppwzTargetPath, L"CURRENT_USER\\", 0);
281 ExitOnFailure(hr, "failed to allocate target registry string with HKCU root");
282 }
283 else if (msidbRegistryRootLocalMachine == iRoot)
284 {
285 hr = StrAllocString(ppwzTargetPath, L"MACHINE\\", 0);
286 ExitOnFailure(hr, "failed to allocate target registry string with HKLM root");
287 }
288 else if (msidbRegistryRootUsers == iRoot)
289 {
290 hr = StrAllocString(ppwzTargetPath, L"USERS\\", 0);
291 ExitOnFailure(hr, "failed to allocate target registry string with HKU root");
292 }
293 else
294 {
295 ExitOnFailure(hr = E_UNEXPECTED, "Unknown registry key root specified for secure object: '%ls' root: %d", pwzSecureObject, iRoot);
296 }
297
298 hr = StrAllocConcat(ppwzTargetPath, pwzKey, 0);
299 ExitOnFailure(hr, "Failed to concat key: %ls for secure object: %ls", pwzKey, pwzSecureObject);
300 }
301 else
302 {
303 AssertSz(FALSE, "How did you get here?");
304 ExitOnFailure(hr = E_UNEXPECTED, "Unknown secure object type: %d", eType);
305 }
306
307LExit:
308 ReleaseStr(pwzFormattedString);
309 ReleaseStr(pwzKey);
310
311 return hr;
312}
313
314/******************************************************************
315 SchedSecureObjects - entry point for SchedSecureObjects Custom Action
316
317 called as Type 1 CustomAction (binary DLL) from Windows Installer
318 in InstallExecuteSequence, to schedule ExecSecureObjects
319******************************************************************/
320extern "C" UINT __stdcall SchedSecureObjects(
321 __in MSIHANDLE hInstall
322 )
323{
324// AssertSz(FALSE, "debug SchedSecureObjects");
325 HRESULT hr = S_OK;
326 UINT er = ERROR_SUCCESS;
327
328 LPWSTR pwzSecureObject = NULL;
329 LPWSTR pwzData = NULL;
330 LPWSTR pwzTable = NULL;
331 LPWSTR pwzTargetPath = NULL;
332
333 PMSIHANDLE hView = NULL;
334 PMSIHANDLE hRec = NULL;
335
336 INSTALLSTATE isInstalled;
337 INSTALLSTATE isAction;
338
339 LPWSTR pwzCustomActionData = NULL;
340
341 DWORD cObjects = 0;
342 eOBJECTTYPE eType = OT_UNKNOWN;
343 DWORD dwAttributes = 0;
344
345 //
346 // initialize
347 //
348 hr = WcaInitialize(hInstall, "SchedSecureObjects");
349 ExitOnFailure(hr, "failed to initialize");
350
351 // anything to do?
352 if (S_OK != WcaTableExists(L"Wix4SecureObject"))
353 {
354 WcaLog(LOGMSG_STANDARD, "Wix4SecureObject table doesn't exist, so there are no objects to secure.");
355 ExitFunction();
356 }
357
358 //
359 // loop through all the objects to be secured
360 //
361 hr = WcaOpenExecuteView(wzQUERY_SECUREOBJECTS, &hView);
362 ExitOnFailure(hr, "failed to open view on Wix4SecureObject table");
363 while (S_OK == (hr = WcaFetchRecord(hView, &hRec)))
364 {
365 hr = WcaGetRecordString(hRec, QSO_TABLE, &pwzTable);
366 ExitOnFailure(hr, "failed to get object table");
367
368 eType = EObjectTypeFromString(pwzTable);
369
370 if (OT_UNKNOWN == eType)
371 {
372 ExitOnFailure(hr = E_INVALIDARG, "unknown SecureObject.Table: %ls", pwzTable);
373 }
374
375 int iCompAttributes = 0;
376 hr = WcaGetRecordInteger(hRec, QSO_COMPATTRIBUTES, &iCompAttributes);
377 ExitOnFailure(hr, "failed to get Component attributes for secure object");
378
379 BOOL fIs64Bit = iCompAttributes & msidbComponentAttributes64bit;
380
381 // Only process entries in the Wix4SecureObject table whose components match the bitness of this CA
382#ifdef _WIN64
383 if (!fIs64Bit)
384 {
385 continue;
386 }
387#else
388 if (fIs64Bit)
389 {
390 continue;
391 }
392#endif
393
394 // Get the object to secure
395 hr = WcaGetRecordString(hRec, QSO_SECUREOBJECT, &pwzSecureObject);
396 ExitOnFailure(hr, "failed to get name of object");
397
398 hr = GetTargetPath(eType, pwzSecureObject, &pwzTargetPath);
399 ExitOnFailure(hr, "failed to get target path of object '%ls'", pwzSecureObject);
400
401 hr = WcaGetRecordString(hRec, QSO_COMPONENT, &pwzData);
402 ExitOnFailure(hr, "failed to get Component name for secure object");
403
404 //
405 // if we are installing this Component
406 //
407 er = ::MsiGetComponentStateW(hInstall, pwzData, &isInstalled, &isAction);
408 ExitOnFailure(hr = HRESULT_FROM_WIN32(er), "failed to get install state for Component: %ls", pwzData);
409
410 if (WcaIsInstalling(isInstalled, isAction))
411 {
412 hr = WcaWriteStringToCaData(pwzTargetPath, &pwzCustomActionData);
413 ExitOnFailure(hr, "failed to add data to CustomActionData");
414
415 // add the data to the CustomActionData
416 hr = WcaGetRecordString(hRec, QSO_SECUREOBJECT, &pwzData);
417 ExitOnFailure(hr, "failed to get name of object");
418 hr = WcaWriteStringToCaData(pwzTable, &pwzCustomActionData);
419 ExitOnFailure(hr, "failed to add data to CustomActionData");
420
421 hr = WcaGetRecordFormattedString(hRec, QSO_DOMAIN, &pwzData);
422 ExitOnFailure(hr, "failed to get domain for user to configure object");
423 hr = WcaWriteStringToCaData(pwzData, &pwzCustomActionData);
424 ExitOnFailure(hr, "failed to add data to CustomActionData");
425
426 hr = WcaGetRecordFormattedString(hRec, QSO_USER, &pwzData);
427 ExitOnFailure(hr, "failed to get user to configure object");
428 hr = WcaWriteStringToCaData(pwzData, &pwzCustomActionData);
429 ExitOnFailure(hr, "failed to add data to CustomActionData");
430
431 hr = WcaGetRecordInteger(hRec, QSO_ATTRIBUTES, reinterpret_cast<int*>(&dwAttributes));
432 ExitOnFailure(hr, "failed to get attributes to configure object");
433 hr = WcaWriteIntegerToCaData(dwAttributes, &pwzCustomActionData);
434 ExitOnFailure(hr, "failed to add data to CustomActionData");
435
436 hr = WcaGetRecordString(hRec, QSO_PERMISSION, &pwzData);
437 ExitOnFailure(hr, "failed to get permission to configure object");
438 hr = WcaWriteStringToCaData(pwzData, &pwzCustomActionData);
439 ExitOnFailure(hr, "failed to add data to CustomActionData");
440
441 ++cObjects;
442 }
443 }
444
445 // if we looped through all records all is well
446 if (E_NOMOREITEMS == hr)
447 hr = S_OK;
448 ExitOnFailure(hr, "failed while looping through all objects to secure");
449
450 //
451 // schedule the custom action and add to progress bar
452 //
453 if (pwzCustomActionData && *pwzCustomActionData)
454 {
455 Assert(0 < cObjects);
456
457 hr = WcaDoDeferredAction(CUSTOM_ACTION_DECORATION(L"ExecSecureObjects"), pwzCustomActionData, cObjects * COST_SECUREOBJECT);
458 ExitOnFailure(hr, "failed to schedule ExecSecureObjects action");
459 }
460
461LExit:
462 ReleaseStr(pwzSecureObject);
463 ReleaseStr(pwzCustomActionData);
464 ReleaseStr(pwzData);
465 ReleaseStr(pwzTable);
466 ReleaseStr(pwzTargetPath);
467
468 if (FAILED(hr))
469 {
470 er = ERROR_INSTALL_FAILURE;
471 }
472 return WcaFinalize(er);
473}
474
475/******************************************************************
476 SchedSecureObjectsRollback - entry point for SchedSecureObjectsRollback Custom Action
477
478 called as Type 1 CustomAction (binary DLL) from Windows Installer
479 in InstallExecuteSequence before SchedSecureObjects
480******************************************************************/
481extern "C" UINT __stdcall SchedSecureObjectsRollback(
482 __in MSIHANDLE hInstall
483 )
484{
485// AssertSz(FALSE, "debug SchedSecureObjectsRollback");
486 HRESULT hr = S_OK;
487 UINT er = ERROR_SUCCESS;
488
489 LPWSTR pwzSecureObject = NULL;
490 LPWSTR pwzTable = NULL;
491 LPWSTR pwzTargetPath = NULL;
492
493 PMSIHANDLE hView = NULL;
494 PMSIHANDLE hRec = NULL;
495
496 LPWSTR pwzCustomActionData = NULL;
497
498 eOBJECTTYPE eType = OT_UNKNOWN;
499
500 //
501 // initialize
502 //
503 hr = WcaInitialize(hInstall, "SchedSecureObjectsRollback");
504 ExitOnFailure(hr, "failed to initialize");
505
506 //
507 // loop through all the objects to be secured
508 //
509 hr = WcaOpenExecuteView(wzQUERY_SECUREOBJECTS, &hView);
510 ExitOnFailure(hr, "failed to open view on Wix4SecureObject table");
511 while (S_OK == (hr = WcaFetchRecord(hView, &hRec)))
512 {
513 hr = WcaGetRecordString(hRec, QSO_TABLE, &pwzTable);
514 ExitOnFailure(hr, "failed to get object table");
515
516 eType = EObjectTypeFromString(pwzTable);
517
518 if (OT_UNKNOWN == eType)
519 {
520 ExitOnFailure(hr = E_INVALIDARG, "unknown SecureObject.Table: %ls", pwzTable);
521 }
522
523 int iCompAttributes = 0;
524 hr = WcaGetRecordInteger(hRec, QSO_COMPATTRIBUTES, &iCompAttributes);
525 ExitOnFailure(hr, "failed to get Component attributes for secure object");
526
527 BOOL fIs64Bit = iCompAttributes & msidbComponentAttributes64bit;
528
529 // Only process entries in the Wix4SecureObject table whose components match the bitness of this CA
530#ifdef _WIN64
531 if (!fIs64Bit)
532 {
533 continue;
534 }
535#else
536 if (fIs64Bit)
537 {
538 continue;
539 }
540#endif
541
542 // get the object being secured that we are planning to schedule rollback for
543 hr = WcaGetRecordString(hRec, QSO_SECUREOBJECT, &pwzSecureObject);
544 ExitOnFailure(hr, "failed to get name of object");
545
546 hr = GetTargetPath(eType, pwzSecureObject, &pwzTargetPath);
547 ExitOnFailure(hr, "failed to get target path of object '%ls' in order to schedule rollback", pwzSecureObject);
548
549 hr = StoreACLRollbackInfo(pwzTargetPath, pwzTable);
550 if (FAILED(hr))
551 {
552 WcaLog(LOGMSG_STANDARD, "Failed to store ACL rollback information with error 0x%x - continuing", hr);
553 }
554 }
555
556 // if we looped through all records all is well
557 if (E_NOMOREITEMS == hr)
558 {
559 hr = S_OK;
560 }
561 ExitOnFailure(hr, "failed while looping through all objects to schedule rollback for");
562
563LExit:
564 ReleaseStr(pwzCustomActionData);
565 ReleaseStr(pwzSecureObject);
566 ReleaseStr(pwzTable);
567 ReleaseStr(pwzTargetPath);
568
569 if (FAILED(hr))
570 {
571 er = ERROR_INSTALL_FAILURE;
572 }
573 return WcaFinalize(er);
574}
575
576/******************************************************************
577 CaExecSecureObjects - entry point for SecureObjects Custom Action
578 called as Type 1025 CustomAction (deferred binary DLL)
579
580 NOTE: deferred CustomAction since it modifies the machine
581 NOTE: CustomActionData == wzObject\twzTable\twzDomain\twzUser\tdwAttributes\tdwPermissions\t...
582******************************************************************/
583extern "C" UINT __stdcall ExecSecureObjects(
584 __in MSIHANDLE hInstall
585 )
586{
587// AssertSz(FALSE, "debug ExecSecureObjects");
588 HRESULT hr = S_OK;
589 DWORD er = ERROR_SUCCESS;
590
591 LPWSTR pwz = NULL;
592 LPWSTR pwzData = NULL;
593 LPWSTR pwzObject = NULL;
594 LPWSTR pwzTable = NULL;
595 LPWSTR pwzDomain = NULL;
596 DWORD dwRevision = 0;
597 LPWSTR pwzUser = NULL;
598 DWORD dwPermissions = 0;
599 DWORD dwAttributes = 0;
600 LPWSTR pwzAccount = NULL;
601 PSID psid = NULL;
602
603 EXPLICIT_ACCESSW ea = {0};
604 SE_OBJECT_TYPE objectType = SE_UNKNOWN_OBJECT_TYPE;
605 PSECURITY_DESCRIPTOR psd = NULL;
606 SECURITY_DESCRIPTOR_CONTROL sdc = {0};
607 SECURITY_INFORMATION si = {0};
608 PACL pAclExisting = NULL; // doesn't get freed
609 PACL pAclNew = NULL;
610
611 PMSIHANDLE hActionRec = ::MsiCreateRecord(1);
612
613 //
614 // initialize
615 //
616 hr = WcaInitialize(hInstall, "ExecSecureObjects");
617 ExitOnFailure(hr, "failed to initialize");
618
619 hr = WcaGetProperty(L"CustomActionData", &pwzData);
620 ExitOnFailure(hr, "failed to get CustomActionData");
621
622 WcaLog(LOGMSG_TRACEONLY, "CustomActionData: %ls", pwzData);
623
624 pwz = pwzData;
625
626 //
627 // loop through all the passed in data
628 //
629 while (pwz && *pwz)
630 {
631 hr = WcaReadStringFromCaData(&pwz, &pwzObject);
632 ExitOnFailure(hr, "failed to process CustomActionData");
633
634 hr = WcaReadStringFromCaData(&pwz, &pwzTable);
635 ExitOnFailure(hr, "failed to process CustomActionData");
636 hr = WcaReadStringFromCaData(&pwz, &pwzDomain);
637 ExitOnFailure(hr, "failed to process CustomActionData");
638 hr = WcaReadStringFromCaData(&pwz, &pwzUser);
639 ExitOnFailure(hr, "failed to process CustomActionData");
640 hr = WcaReadIntegerFromCaData(&pwz, reinterpret_cast<int*>(&dwAttributes));
641 ExitOnFailure(hr, "failed to process CustomActionData");
642 hr = WcaReadIntegerFromCaData(&pwz, reinterpret_cast<int*>(&dwPermissions));
643 ExitOnFailure(hr, "failed to process CustomActionData");
644
645 WcaLog(LOGMSG_VERBOSE, "Securing Object: %ls Type: %ls User: %ls", pwzObject, pwzTable, pwzUser);
646
647 //
648 // create the appropriate SID
649 //
650
651 // figure out the right user to put into the access block
652 if (!*pwzDomain && 0 == lstrcmpW(pwzUser, L"Everyone"))
653 {
654 hr = AclGetWellKnownSid(WinWorldSid, &psid);
655 }
656 else if (!*pwzDomain && 0 == lstrcmpW(pwzUser, L"Administrators"))
657 {
658 hr = AclGetWellKnownSid(WinBuiltinAdministratorsSid, &psid);
659 }
660 else if (!*pwzDomain && 0 == lstrcmpW(pwzUser, L"LocalSystem"))
661 {
662 hr = AclGetWellKnownSid(WinLocalSystemSid, &psid);
663 }
664 else if (!*pwzDomain && 0 == lstrcmpW(pwzUser, L"LocalService"))
665 {
666 hr = AclGetWellKnownSid(WinLocalServiceSid, &psid);
667 }
668 else if (!*pwzDomain && 0 == lstrcmpW(pwzUser, L"NetworkService"))
669 {
670 hr = AclGetWellKnownSid(WinNetworkServiceSid, &psid);
671 }
672 else if (!*pwzDomain && 0 == lstrcmpW(pwzUser, L"AuthenticatedUser"))
673 {
674 hr = AclGetWellKnownSid(WinAuthenticatedUserSid, &psid);
675 }
676 else if (!*pwzDomain && 0 == lstrcmpW(pwzUser, L"Guests"))
677 {
678 hr = AclGetWellKnownSid(WinBuiltinGuestsSid, &psid);
679 }
680 else if (!*pwzDomain && 0 == lstrcmpW(pwzUser, L"CREATOR OWNER"))
681 {
682 hr = AclGetWellKnownSid(WinCreatorOwnerSid, &psid);
683 }
684 else if (!*pwzDomain && 0 == lstrcmpW(pwzUser, L"INTERACTIVE"))
685 {
686 hr = AclGetWellKnownSid(WinInteractiveSid, &psid);
687 }
688 else if (!*pwzDomain && 0 == lstrcmpW(pwzUser, L"Users"))
689 {
690 hr = AclGetWellKnownSid(WinBuiltinUsersSid, &psid);
691 }
692 else
693 {
694 hr = StrAllocFormatted(&pwzAccount, L"%s%s%s", pwzDomain, *pwzDomain ? L"\\" : L"", pwzUser);
695 ExitOnFailure(hr, "failed to build domain user name");
696
697 hr = AclGetAccountSid(NULL, pwzAccount, &psid);
698 }
699 ExitOnFailure(hr, "failed to get sid for account: %ls%ls%ls", pwzDomain, *pwzDomain ? L"\\" : L"", pwzUser);
700
701 //
702 // build up the explicit access
703 //
704 ea.grfAccessMode = SET_ACCESS;
705
706 if (dwAttributes & SECURE_OBJECT_ATTRIBUTE_INHERITABLE)
707 {
708 ea.grfInheritance = SUB_CONTAINERS_AND_OBJECTS_INHERIT;
709 }
710 else
711 {
712 ea.grfInheritance = NO_INHERITANCE;
713 }
714
715#pragma prefast(push)
716#pragma prefast(disable:25029)
717 ::BuildTrusteeWithSidW(&ea.Trustee, psid);
718#pragma prefast(pop)
719
720 objectType = SEObjectTypeFromString(const_cast<LPCWSTR> (pwzTable));
721
722 // always add these permissions for services
723 // these are basic permissions that are often forgotten
724 if (0 == lstrcmpW(L"ServiceInstall", pwzTable))
725 {
726 dwPermissions |= SERVICE_QUERY_CONFIG | SERVICE_QUERY_STATUS | SERVICE_ENUMERATE_DEPENDENTS | SERVICE_INTERROGATE;
727 }
728
729 ea.grfAccessPermissions = dwPermissions;
730
731 if (SE_UNKNOWN_OBJECT_TYPE != objectType)
732 {
733 er = ::GetNamedSecurityInfoW(pwzObject, objectType, DACL_SECURITY_INFORMATION, NULL, NULL, &pAclExisting, NULL, &psd);
734 ExitOnFailure(hr = HRESULT_FROM_WIN32(er), "failed to get security info for object: %ls", pwzObject);
735
736 //Need to see if DACL is protected so getting Descriptor information
737 if (!::GetSecurityDescriptorControl(psd, &sdc, &dwRevision))
738 {
739 ExitOnLastError(hr, "failed to get security descriptor control for object: %ls", pwzObject);
740 }
741
742#pragma prefast(push)
743#pragma prefast(disable:25029)
744 er = ::SetEntriesInAclW(1, &ea, pAclExisting, &pAclNew);
745#pragma prefast(pop)
746 ExitOnFailure(hr = HRESULT_FROM_WIN32(er), "failed to add ACLs for object: %ls", pwzObject);
747
748 if (sdc & SE_DACL_PROTECTED)
749 {
750 si = DACL_SECURITY_INFORMATION | PROTECTED_DACL_SECURITY_INFORMATION;
751 }
752 else
753 {
754 si = DACL_SECURITY_INFORMATION;
755 }
756 er = ::SetNamedSecurityInfoW(pwzObject, objectType, si, NULL, NULL, pAclNew, NULL);
757 MessageExitOnFailure(hr = HRESULT_FROM_WIN32(er), msierrSecureObjectsFailedSet, "failed to set security info for object: %ls", pwzObject);
758 }
759 else
760 {
761 MessageExitOnFailure(hr = E_UNEXPECTED, msierrSecureObjectsUnknownType, "unknown object type: %ls", pwzTable);
762 }
763
764 hr = WcaProgressMessage(COST_SECUREOBJECT, FALSE);
765 ExitOnFailure(hr, "failed to send progress message");
766
767 objectType = SE_UNKNOWN_OBJECT_TYPE;
768 }
769
770LExit:
771 ReleaseStr(pwzUser);
772 ReleaseStr(pwzDomain);
773 ReleaseStr(pwzTable);
774 ReleaseStr(pwzObject);
775 ReleaseStr(pwzData);
776 ReleaseStr(pwzAccount);
777
778 if (pAclNew)
779 {
780 ::LocalFree(pAclNew);
781 }
782 if (psd)
783 {
784 ::LocalFree(psd);
785 }
786 if (psid)
787 {
788 AclFreeSid(psid);
789 }
790
791 if (FAILED(hr))
792 {
793 er = ERROR_INSTALL_FAILURE;
794 }
795 return WcaFinalize(er);
796}
797
798extern "C" UINT __stdcall ExecSecureObjectsRollback(
799 __in MSIHANDLE hInstall
800 )
801{
802// AssertSz(FALSE, "debug ExecSecureObjectsRollback");
803 HRESULT hr = S_OK;
804 DWORD er = ERROR_SUCCESS;
805
806 LPWSTR pwz = NULL;
807 LPWSTR pwzData = NULL;
808 LPWSTR pwzObject = NULL;
809 LPWSTR pwzTable = NULL;
810 LPWSTR pwzSecurityInfo = NULL;
811
812 SE_OBJECT_TYPE objectType = SE_UNKNOWN_OBJECT_TYPE;
813 PSECURITY_DESCRIPTOR psd = NULL;
814 ULONG psdSize;
815 SECURITY_DESCRIPTOR_CONTROL sdc = {0};
816 SECURITY_INFORMATION si = DACL_SECURITY_INFORMATION;
817 PACL pDacl = NULL;
818 BOOL bDaclPresent = false;
819 BOOL bDaclDefaulted = false;
820 DWORD dwRevision = 0;
821 int iProtected;
822
823 // initialize
824 hr = WcaInitialize(hInstall, "ExecSecureObjectsRollback");
825 ExitOnFailure(hr, "failed to initialize");
826
827 hr = WcaGetProperty(L"CustomActionData", &pwzData);
828 ExitOnFailure(hr, "failed to get CustomActionData");
829
830 WcaLog(LOGMSG_TRACEONLY, "CustomActionData: %ls", pwzData);
831
832 pwz = pwzData;
833
834 hr = WcaReadStringFromCaData(&pwz, &pwzObject);
835 ExitOnFailure(hr, "failed to process CustomActionData");
836
837 hr = WcaReadStringFromCaData(&pwz, &pwzTable);
838 ExitOnFailure(hr, "failed to process CustomActionData");
839
840 objectType = SEObjectTypeFromString(const_cast<LPCWSTR> (pwzTable));
841
842 if (SE_UNKNOWN_OBJECT_TYPE != objectType)
843 {
844 hr = WcaReadStringFromCaData(&pwz, &pwzSecurityInfo);
845 ExitOnFailure(hr, "failed to process CustomActionData");
846
847 hr = WcaReadIntegerFromCaData(&pwz, &iProtected);
848 ExitOnFailure(hr, "failed to process CustomActionData");
849
850 if (!::ConvertStringSecurityDescriptorToSecurityDescriptorW(pwzSecurityInfo,SDDL_REVISION_1,&psd,&psdSize))
851 {
852 ExitOnLastError(hr, "failed to convert security descriptor string to a valid security descriptor");
853 }
854
855 if (!::GetSecurityDescriptorDacl(psd,&bDaclPresent,&pDacl,&bDaclDefaulted))
856 {
857 hr = E_UNEXPECTED;
858 ExitOnFailure(hr, "failed to get security descriptor's DACL - error code: %d",pwzSecurityInfo,GetLastError());
859 }
860
861 // The below situation may always be caught by the above if block - the documentation isn't very clear. To be safe, we're going to test for it.
862 if (!bDaclPresent)
863 {
864 hr = E_UNEXPECTED;
865 ExitOnFailure(hr, "security descriptor does not contain a DACL");
866 }
867
868 //Need to see if DACL is protected so getting Descriptor information
869 if (!::GetSecurityDescriptorControl(psd, &sdc, &dwRevision))
870 {
871 ExitOnLastError(hr, "failed to get security descriptor control for object: %ls", pwzObject);
872 }
873
874 // Write a 1 if DACL is protected, 0 otherwise
875 switch (iProtected)
876 {
877 case 0:
878 // Unnecessary to do anything - leave si to the default flags
879 break;
880
881 case 1:
882 si = si | PROTECTED_DACL_SECURITY_INFORMATION;
883 break;
884
885 default:
886 hr = E_UNEXPECTED;
887 ExitOnFailure(hr, "unrecognized value in CustomActionData");
888 break;
889 }
890
891 er = ::SetNamedSecurityInfoW(pwzObject, objectType, si, NULL, NULL, pDacl, NULL);
892 ExitOnFailure(hr = HRESULT_FROM_WIN32(er), "failed to set security info for object: %ls error code: %d", pwzObject, GetLastError());
893 }
894 else
895 {
896 MessageExitOnFailure(hr = E_UNEXPECTED, msierrSecureObjectsUnknownType, "unknown object type: %ls", pwzTable);
897 }
898
899LExit:
900 ReleaseStr(pwzData);
901 ReleaseStr(pwzObject);
902 ReleaseStr(pwzTable);
903 ReleaseStr(pwzSecurityInfo);
904
905 if (psd)
906 {
907 ::LocalFree(psd);
908 }
909
910 if (FAILED(hr))
911 {
912 er = ERROR_INSTALL_FAILURE;
913 }
914 return WcaFinalize(er);
915}
diff --git a/src/ext/Util/ca/serviceconfig.cpp b/src/ext/Util/ca/serviceconfig.cpp
new file mode 100644
index 00000000..04b25ffa
--- /dev/null
+++ b/src/ext/Util/ca/serviceconfig.cpp
@@ -0,0 +1,821 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3#include "precomp.h"
4
5// structs
6LPCWSTR wzQUERY_SERVICECONFIG = L"SELECT `ServiceName`, `Component_`, `NewService`, `FirstFailureActionType`, `SecondFailureActionType`, `ThirdFailureActionType`, `ResetPeriodInDays`, `RestartServiceDelayInSeconds`, `ProgramCommandLine`, `RebootMessage` FROM `Wix4ServiceConfig`";
7enum eQUERY_SERVICECONFIG { QSC_SERVICENAME = 1, QSC_COMPONENT, QSC_NEWSERVICE, QSC_FIRSTFAILUREACTIONTYPE, QSC_SECONDFAILUREACTIONTYPE, QSC_THIRDFAILUREACTIONTYPE, QSC_RESETPERIODINDAYS, QSC_RESTARTSERVICEDELAYINSECONDS, QSC_PROGRAMCOMMANDLINE, QSC_REBOOTMESSAGE };
8
9// consts
10LPCWSTR c_wzActionTypeNone = L"none";
11LPCWSTR c_wzActionTypeReboot = L"reboot";
12LPCWSTR c_wzActionTypeRestart = L"restart";
13LPCWSTR c_wzActionTypeRunCommand = L"runCommand";
14
15// prototypes
16static SC_ACTION_TYPE GetSCActionType(
17 __in LPCWSTR pwzActionTypeName
18 );
19
20static HRESULT GetSCActionTypeString(
21 __in SC_ACTION_TYPE type,
22 __out_ecount(cchActionTypeString) LPWSTR wzActionTypeString,
23 __in DWORD cchActionTypeString
24 );
25
26static HRESULT GetService(
27 __in SC_HANDLE hSCM,
28 __in LPCWSTR wzService,
29 __in DWORD dwOpenServiceAccess,
30 __out SC_HANDLE* phService
31 );
32
33static HRESULT ConfigureService(
34 __in SC_HANDLE hSCM,
35 __in SC_HANDLE hService,
36 __in LPCWSTR wzServiceName,
37 __in DWORD dwRestartServiceDelayInSeconds,
38 __in LPCWSTR wzFirstFailureActionType,
39 __in LPCWSTR wzSecondFailureActionType,
40 __in LPCWSTR wzThirdFailureActionType,
41 __in DWORD dwResetPeriodInDays,
42 __in LPWSTR wzRebootMessage,
43 __in LPWSTR wzProgramCommandLine
44 );
45
46
47/******************************************************************
48SchedServiceConfig - entry point for SchedServiceConfig Custom Action
49
50called as Type 1 CustomAction (binary DLL) from Windows Installer
51in InstallExecuteSequence before CaExecServiceConfig
52********************************************************************/
53extern "C" UINT __stdcall SchedServiceConfig(
54 __in MSIHANDLE hInstall
55 )
56{
57 //AssertSz(FALSE, "debug SchedServiceConfig");
58 HRESULT hr = S_OK;
59 UINT er = ERROR_SUCCESS;
60
61 LPWSTR pwzScriptKey = NULL;
62 LPWSTR pwzCustomActionData = NULL;
63
64 PMSIHANDLE hView = NULL;
65 PMSIHANDLE hRec = NULL;
66 LPWSTR pwzData = NULL;
67 int iData = 0;
68 DWORD cServices = 0;
69
70 // initialize
71 hr = WcaInitialize(hInstall, "SchedServiceConfig");
72 ExitOnFailure(hr, "Failed to initialize.");
73
74 // Get the script key for this CustomAction and put it on the front of the
75 // CustomActionData of the install action.
76 hr = WcaCaScriptCreateKey(&pwzScriptKey);
77 ExitOnFailure(hr, "Failed to get encoding key.");
78
79 hr = WcaWriteStringToCaData(pwzScriptKey, &pwzCustomActionData);
80 ExitOnFailure(hr, "Failed to add encoding key to CustomActionData.");
81
82 // Loop through all the services to be configured.
83 hr = WcaOpenExecuteView(wzQUERY_SERVICECONFIG, &hView);
84 ExitOnFailure(hr, "Failed to open view on Wix4ServiceConfig table.");
85
86 while (S_OK == (hr = WcaFetchRecord(hView, &hRec)))
87 {
88 INSTALLSTATE isInstalled = INSTALLSTATE_UNKNOWN;
89 INSTALLSTATE isAction = INSTALLSTATE_UNKNOWN;
90
91 // Get component name to check if we are installing it. If so
92 // then add the table data to the CustomActionData, otherwise
93 // skip it.
94 hr = WcaGetRecordString(hRec, QSC_COMPONENT, &pwzData);
95 ExitOnFailure(hr, "Failed to get component name");
96
97 hr = ::MsiGetComponentStateW(hInstall, pwzData, &isInstalled, &isAction);
98 ExitOnFailure(hr = HRESULT_FROM_WIN32(hr), "Failed to get install state for Component: %ls", pwzData);
99
100 if (WcaIsInstalling(isInstalled, isAction))
101 {
102 // Add the data to the CustomActionData (for install).
103 hr = WcaGetRecordFormattedString(hRec, QSC_SERVICENAME, &pwzData);
104 ExitOnFailure(hr, "Failed to get name of service.");
105 hr = WcaWriteStringToCaData(pwzData, &pwzCustomActionData);
106 ExitOnFailure(hr, "Failed to add name to CustomActionData.");
107
108 hr = WcaGetRecordInteger(hRec, QSC_NEWSERVICE, &iData);
109 ExitOnFailure(hr, "Failed to get Wix4ServiceConfig.NewService.");
110 hr = WcaWriteIntegerToCaData(0 != iData, &pwzCustomActionData);
111 ExitOnFailure(hr, "Failed to add NewService data to CustomActionData");
112
113 hr = WcaGetRecordString(hRec, QSC_FIRSTFAILUREACTIONTYPE, &pwzData);
114 ExitOnFailure(hr, "failed to get first failure action type");
115 hr = WcaWriteStringToCaData(pwzData, &pwzCustomActionData);
116 ExitOnFailure(hr, "failed to add data to CustomActionData");
117
118 hr = WcaGetRecordString(hRec, QSC_SECONDFAILUREACTIONTYPE, &pwzData);
119 ExitOnFailure(hr, "failed to get second failure action type");
120 hr = WcaWriteStringToCaData(pwzData, &pwzCustomActionData);
121 ExitOnFailure(hr, "failed to add data to CustomActionData");
122
123 hr = WcaGetRecordString(hRec, QSC_THIRDFAILUREACTIONTYPE, &pwzData);
124 ExitOnFailure(hr, "failed to get third failure action type");
125 hr = WcaWriteStringToCaData(pwzData, &pwzCustomActionData);
126 ExitOnFailure(hr, "failed to add data to CustomActionData");
127
128 hr = WcaGetRecordInteger(hRec, QSC_RESETPERIODINDAYS, &iData);
129 if (S_FALSE == hr) // deal w/ possible null value
130 {
131 iData = 0;
132 }
133 ExitOnFailure(hr, "failed to get reset period in days between service restart attempts.");
134 hr = WcaWriteIntegerToCaData(iData, &pwzCustomActionData);
135 ExitOnFailure(hr, "failed to add data to CustomActionData");
136
137 hr = WcaGetRecordInteger(hRec, QSC_RESTARTSERVICEDELAYINSECONDS, &iData);
138 if (S_FALSE == hr) // deal w/ possible null value
139 {
140 iData = 0;
141 }
142 ExitOnFailure(hr, "failed to get server restart delay value.");
143 hr = WcaWriteIntegerToCaData(iData, &pwzCustomActionData);
144 ExitOnFailure(hr, "failed to add data to CustomActionData");
145
146 hr = WcaGetRecordFormattedString(hRec, QSC_PROGRAMCOMMANDLINE, &pwzData); // null value already dealt w/ properly
147 ExitOnFailure(hr, "failed to get command line to run on service failure.");
148 hr = WcaWriteStringToCaData(pwzData, &pwzCustomActionData);
149 ExitOnFailure(hr, "failed to add data to CustomActionData");
150
151 hr = WcaGetRecordString(hRec, QSC_REBOOTMESSAGE, &pwzData); // null value already dealt w/ properly
152 ExitOnFailure(hr, "failed to get message to send to users when server reboots due to service failure.");
153 hr = WcaWriteStringToCaData(pwzData, &pwzCustomActionData);
154 ExitOnFailure(hr, "failed to add data to CustomActionData");
155
156 ++cServices;
157 }
158 }
159
160 // if we looped through all records all is well
161 if (E_NOMOREITEMS == hr)
162 {
163 hr = S_OK;
164 }
165 ExitOnFailure(hr, "failed while looping through all objects to secure");
166
167 // setup CustomActionData and add to progress bar for download
168 if (0 < cServices)
169 {
170 hr = WcaDoDeferredAction(CUSTOM_ACTION_DECORATION(L"RollbackServiceConfig"), pwzScriptKey, cServices * COST_SERVICECONFIG);
171 ExitOnFailure(hr, "failed to schedule RollbackServiceConfig action");
172
173 hr = WcaDoDeferredAction(CUSTOM_ACTION_DECORATION(L"ExecServiceConfig"), pwzCustomActionData, cServices * COST_SERVICECONFIG);
174 ExitOnFailure(hr, "failed to schedule ExecServiceConfig action");
175 }
176
177LExit:
178 ReleaseStr(pwzData);
179 ReleaseStr(pwzCustomActionData);
180 ReleaseStr(pwzScriptKey);
181
182 er = SUCCEEDED(hr) ? ERROR_SUCCESS : ERROR_INSTALL_FAILURE;
183 return WcaFinalize(er);
184}
185
186
187/******************************************************************
188CaExecServiceConfig - entry point for ServiceConfig Custom Action.
189
190NOTE: deferred CustomAction since it modifies the machine
191NOTE: CustomActionData == wzServiceName\tfNewService\twzFirstFailureActionType\twzSecondFailureActionType\twzThirdFailureActionType\tdwResetPeriodInDays\tdwRestartServiceDelayInSeconds\twzProgramCommandLine\twzRebootMessage\twzServiceName\tfNewService\t...
192*******************************************************************/
193extern "C" UINT __stdcall ExecServiceConfig(
194 __in MSIHANDLE hInstall
195 )
196{
197 //AssertSz(FALSE, "debug ExecServiceConfig");
198 HRESULT hr = S_OK;
199 DWORD er = 0;
200
201 LPWSTR pwzCustomActionData = NULL;
202 LPWSTR pwz = NULL;
203
204 LPWSTR pwzScriptKey = NULL;
205 WCA_CASCRIPT_HANDLE hRollbackScript = NULL;
206
207 LPWSTR pwzServiceName = NULL;
208 BOOL fNewService = FALSE;
209 LPWSTR pwzFirstFailureActionType = NULL;
210 LPWSTR pwzSecondFailureActionType = NULL;
211 LPWSTR pwzThirdFailureActionType = NULL;
212 LPWSTR pwzProgramCommandLine = NULL;
213 LPWSTR pwzRebootMessage = NULL;
214 DWORD dwResetPeriodInDays = 0;
215 DWORD dwRestartServiceDelayInSeconds = 0;
216
217 LPVOID lpMsgBuf = NULL;
218 SC_HANDLE hSCM = NULL;
219 SC_HANDLE hService = NULL;
220
221 DWORD dwRestartDelay = 0;
222 WCHAR wzActionName[32] = { 0 };
223
224 DWORD cbExistingServiceConfig = 0;
225
226 SERVICE_FAILURE_ACTIONSW* psfa = NULL;
227
228 // initialize
229 hr = WcaInitialize(hInstall, "ExecServiceConfig");
230 ExitOnFailure(hr, "failed to initialize");
231
232 // Open the Services Control Manager up front.
233 hSCM = ::OpenSCManagerW(NULL, NULL, SC_MANAGER_CONNECT);
234 if (NULL == hSCM)
235 {
236 er = ::GetLastError();
237 hr = HRESULT_FROM_WIN32(er);
238
239#pragma prefast(push)
240#pragma prefast(disable:25028)
241 ::FormatMessageW(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, er, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPWSTR)&lpMsgBuf, 0, NULL);
242#pragma prefast(pop)
243
244 ExitOnFailure(hr, "Failed to get handle to SCM. Error: %ls", (LPWSTR)lpMsgBuf);
245 }
246
247 // First, get the script key out of the CustomActionData and
248 // use that to create the rollback script for this action.
249 hr = WcaGetProperty( L"CustomActionData", &pwzCustomActionData);
250 ExitOnFailure(hr, "failed to get CustomActionData");
251
252 WcaLog(LOGMSG_TRACEONLY, "CustomActionData: %ls", pwzCustomActionData);
253
254 pwz = pwzCustomActionData;
255
256 hr = WcaReadStringFromCaData(&pwz, &pwzScriptKey);
257 if (!pwzScriptKey)
258 {
259 hr = E_UNEXPECTED;
260 ExitOnFailure(hr, "Failed due to unexpected CustomActionData passed.");
261 }
262 ExitOnFailure(hr, "Failed to read encoding key from CustomActionData.");
263
264 hr = WcaCaScriptCreate(WCA_ACTION_INSTALL, WCA_CASCRIPT_ROLLBACK, FALSE, pwzScriptKey, FALSE, &hRollbackScript);
265 ExitOnFailure(hr, "Failed to open rollback CustomAction script.");
266
267 // Next, loop through the rest of the CustomActionData, processing
268 // each service config row in turn.
269 while (pwz && *pwz)
270 {
271 hr = WcaReadStringFromCaData(&pwz, &pwzServiceName);
272 ExitOnFailure(hr, "failed to process CustomActionData");
273 hr = WcaReadIntegerFromCaData(&pwz, reinterpret_cast<int*>(&fNewService));
274 ExitOnFailure(hr, "failed to process CustomActionData");
275 hr = WcaReadStringFromCaData(&pwz, &pwzFirstFailureActionType);
276 ExitOnFailure(hr, "failed to process CustomActionData");
277 hr = WcaReadStringFromCaData(&pwz, &pwzSecondFailureActionType);
278 ExitOnFailure(hr, "failed to process CustomActionData");
279 hr = WcaReadStringFromCaData(&pwz, &pwzThirdFailureActionType);
280 ExitOnFailure(hr, "failed to process CustomActionData");
281 hr = WcaReadIntegerFromCaData(&pwz, reinterpret_cast<int*>(&dwResetPeriodInDays));
282 ExitOnFailure(hr, "failed to process CustomActionData");
283 hr = WcaReadIntegerFromCaData(&pwz, reinterpret_cast<int*>(&dwRestartServiceDelayInSeconds));
284 ExitOnFailure(hr, "failed to process CustomActionData");
285 hr = WcaReadStringFromCaData(&pwz, &pwzProgramCommandLine);
286 ExitOnFailure(hr, "failed to process CustomActionData");
287 hr = WcaReadStringFromCaData(&pwz, &pwzRebootMessage);
288 ExitOnFailure(hr, "failed to process CustomActionData");
289
290 WcaLog(LOGMSG_VERBOSE, "Configuring Service: %ls", pwzServiceName);
291
292 // Open the handle with all the permissions we might need:
293 // SERVICE_QUERY_CONFIG is needed for QueryServiceConfig2().
294 // SERVICE_CHANGE_CONFIG is needed for ChangeServiceConfig2().
295 // SERVICE_START is required in order to handle SC_ACTION_RESTART action.
296 hr = GetService(hSCM, pwzServiceName, SERVICE_QUERY_CONFIG | SERVICE_CHANGE_CONFIG | SERVICE_START, &hService);
297 ExitOnFailure(hr, "Failed to get service: %ls", pwzServiceName);
298
299 // If we are configuring a service that existed on the machine, we need to
300 // read the existing service configuration and write it out to the rollback
301 // log so rollback can put it back if anything goes wrong.
302 if (!fNewService)
303 {
304 // First, read the existing service config.
305 if (!::QueryServiceConfig2W(hService, SERVICE_CONFIG_FAILURE_ACTIONS, NULL, 0, &cbExistingServiceConfig) && ERROR_INSUFFICIENT_BUFFER != ::GetLastError())
306 {
307 ExitWithLastError(hr, "Failed to get current service config info.");
308 }
309
310 psfa = static_cast<LPSERVICE_FAILURE_ACTIONSW>(MemAlloc(cbExistingServiceConfig, TRUE));
311 ExitOnNull(psfa, hr, E_OUTOFMEMORY, "failed to allocate memory for service failure actions.");
312
313 if (!::QueryServiceConfig2W(hService, SERVICE_CONFIG_FAILURE_ACTIONS, (LPBYTE)psfa, cbExistingServiceConfig, &cbExistingServiceConfig))
314 {
315 ExitOnLastError(hr, "failed to Query Service.");
316 }
317
318 // Build up rollback log so we can restore service state if necessary
319 hr = WcaCaScriptWriteString(hRollbackScript, pwzServiceName);
320 ExitOnFailure(hr, "Failed to add service name to Rollback Log");
321
322 // If this service struct is empty, fill in default values
323 if (3 > psfa->cActions)
324 {
325 hr = WcaCaScriptWriteString(hRollbackScript, c_wzActionTypeNone);
326 ExitOnFailure(hr, "failed to add data to Rollback CustomActionData");
327
328 hr = WcaCaScriptWriteString(hRollbackScript, c_wzActionTypeNone);
329 ExitOnFailure(hr, "failed to add data to Rollback CustomActionData");
330
331 hr = WcaCaScriptWriteString(hRollbackScript, c_wzActionTypeNone);
332 ExitOnFailure(hr, "failed to add data to Rollback CustomActionData");
333 }
334 else
335 {
336 // psfa actually had actions defined, so use the first three.
337 for (int i = 0; i < 3; ++i)
338 {
339 hr = GetSCActionTypeString(psfa->lpsaActions[i].Type, wzActionName, countof(wzActionName));
340 ExitOnFailure(hr, "failed to query SFA object");
341
342 if (SC_ACTION_RESTART == psfa->lpsaActions[i].Type)
343 {
344 dwRestartDelay = psfa->lpsaActions[i].Delay / 1000;
345 }
346
347 hr = WcaCaScriptWriteString(hRollbackScript, wzActionName);
348 ExitOnFailure(hr, "failed to add data to Rollback CustomActionData");
349 }
350 }
351
352 hr = WcaCaScriptWriteNumber(hRollbackScript, psfa->dwResetPeriod / (24 * 60 * 60));
353 ExitOnFailure(hr, "failed to add data to CustomActionData");
354
355 hr = WcaCaScriptWriteNumber(hRollbackScript, dwRestartDelay);
356 ExitOnFailure(hr, "failed to add data to CustomActionData");
357
358 // Handle the null cases.
359 if (!psfa->lpCommand)
360 {
361 psfa->lpCommand = L"";
362 }
363 hr = WcaCaScriptWriteString(hRollbackScript, psfa->lpCommand);
364 ExitOnFailure(hr, "failed to add data to Rollback CustomActionData");
365
366 // Handle the null cases.
367 if (!psfa->lpRebootMsg)
368 {
369 psfa->lpRebootMsg = L"";
370 }
371 hr = WcaCaScriptWriteString(hRollbackScript, psfa->lpRebootMsg);
372 ExitOnFailure(hr, "failed to add data to Rollback CustomActionData");
373
374 // Nudge the system to get all our rollback data written to disk.
375 WcaCaScriptFlush(hRollbackScript);
376
377 ReleaseNullMem(psfa);
378 }
379
380 hr = ConfigureService(hSCM, hService, pwzServiceName, dwRestartServiceDelayInSeconds, pwzFirstFailureActionType,
381 pwzSecondFailureActionType, pwzThirdFailureActionType, dwResetPeriodInDays, pwzRebootMessage, pwzProgramCommandLine);
382 ExitOnFailure(hr, "Failed to configure service: %ls", pwzServiceName);
383
384 hr = WcaProgressMessage(COST_SERVICECONFIG, FALSE);
385 ExitOnFailure(hr, "failed to send progress message");
386
387 // Per-service cleanup
388 ::CloseServiceHandle(hService);
389 hService = NULL;
390 dwResetPeriodInDays = 0;
391 dwRestartServiceDelayInSeconds = 0;
392 }
393
394LExit:
395 WcaCaScriptClose(hRollbackScript, WCA_CASCRIPT_CLOSE_PRESERVE);
396
397 if (lpMsgBuf)
398 {
399 ::LocalFree(lpMsgBuf);
400 }
401
402 if (hService)
403 {
404 ::CloseServiceHandle(hService);
405 }
406
407 if (hSCM)
408 {
409 ::CloseServiceHandle(hSCM);
410 }
411
412 ReleaseMem(psfa);
413
414 ReleaseStr(pwzRebootMessage);
415 ReleaseStr(pwzProgramCommandLine);
416 ReleaseStr(pwzThirdFailureActionType);
417 ReleaseStr(pwzSecondFailureActionType);
418 ReleaseStr(pwzFirstFailureActionType);
419 ReleaseStr(pwzServiceName);
420 ReleaseStr(pwzScriptKey);
421 ReleaseStr(pwzCustomActionData);
422
423 er = SUCCEEDED(hr) ? ERROR_SUCCESS : ERROR_INSTALL_FAILURE;
424 return WcaFinalize(er);
425}
426
427
428/******************************************************************
429RollbackServiceConfig - entry point for ServiceConfig rollback
430 Custom Action.
431
432NOTE: CustomActionScript Data == wzServiceName\twzFirstFailureActionType\twzSecondFailureActionType\twzThirdFailureActionType\tdwResetPeriodInDays\tdwRestartServiceDelayInSeconds\twzProgramCommandLine\twzRebootMessage\twzServiceName\t...
433*******************************************************************/
434extern "C" UINT __stdcall RollbackServiceConfig(
435 __in MSIHANDLE hInstall
436 )
437{
438 //AssertSz(FALSE, "debug RollbackServiceConfig");
439 HRESULT hr = S_OK;
440 DWORD er = 0;
441
442 LPWSTR pwzCustomActionData = NULL;
443 LPWSTR pwz = NULL;
444
445 LPWSTR pwzScriptKey = NULL;
446 WCA_CASCRIPT_HANDLE hRollbackScript = NULL;
447
448 LPWSTR pwzServiceName = NULL;
449 LPWSTR pwzFirstFailureActionType = NULL;
450 LPWSTR pwzSecondFailureActionType = NULL;
451 LPWSTR pwzThirdFailureActionType = NULL;
452 LPWSTR pwzProgramCommandLine = NULL;
453 LPWSTR pwzRebootMessage = NULL;
454 DWORD dwResetPeriodInDays = 0;
455 DWORD dwRestartServiceDelayInSeconds = 0;
456
457 LPVOID lpMsgBuf = NULL;
458 SC_HANDLE hSCM = NULL;
459 SC_HANDLE hService = NULL;
460
461 // initialize
462 hr = WcaInitialize(hInstall, "RollbackServiceConfig");
463 ExitOnFailure(hr, "Failed to initialize 'RollbackServiceConfig'.");
464
465 // Open the Services Control Manager up front.
466 hSCM = ::OpenSCManagerW(NULL, NULL, SC_MANAGER_CONNECT);
467 if (NULL == hSCM)
468 {
469 er = ::GetLastError();
470 hr = HRESULT_FROM_WIN32(er);
471
472#pragma prefast(push)
473#pragma prefast(disable:25028)
474 ::FormatMessageW(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, er, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPWSTR)&lpMsgBuf, 0, NULL);
475#pragma prefast(pop)
476
477 ExitOnFailure(hr, "Failed to get handle to SCM. Error: %ls", (LPWSTR)lpMsgBuf);
478
479 // Make sure we still abort, in case hSCM was NULL but no error was returned from GetLastError
480 ExitOnNull(hSCM, hr, E_POINTER, "Getting handle to SCM reported success, but no handle was returned.");
481 }
482
483 // Get the script key from the CustomAction data and use it to open
484 // the rollback log and read the data over the CustomActionData
485 // because all of the information is in the script data not the
486 // CustomActionData.
487 hr = WcaGetProperty( L"CustomActionData", &pwzCustomActionData);
488 ExitOnFailure(hr, "failed to get CustomActionData");
489
490 WcaLog(LOGMSG_TRACEONLY, "CustomActionData: %ls", pwzCustomActionData);
491
492 pwz = pwzCustomActionData;
493
494 hr = WcaReadStringFromCaData(&pwz, &pwzScriptKey);
495 if (!pwzScriptKey)
496 {
497 hr = E_UNEXPECTED;
498 ExitOnFailure(hr, "Failed due to unexpected CustomActionData passed.");
499 }
500 ExitOnFailure(hr, "Failed to read encoding key from CustomActionData.");
501
502 hr = WcaCaScriptOpen(WCA_ACTION_INSTALL, WCA_CASCRIPT_ROLLBACK, FALSE, pwzScriptKey, &hRollbackScript);
503 ExitOnFailure(hr, "Failed to open rollback CustomAction script.");
504
505 hr = WcaCaScriptReadAsCustomActionData(hRollbackScript, &pwzCustomActionData);
506 ExitOnFailure(hr, "Failed to read rollback script into CustomAction data.");
507
508 // Loop through the script's CustomActionData, processing each
509 // service config in turn.
510 pwz = pwzCustomActionData;
511 while (pwz && *pwz)
512 {
513 hr = WcaReadStringFromCaData(&pwz, &pwzServiceName);
514 ExitOnFailure(hr, "failed to process CustomActionData");
515 hr = WcaReadStringFromCaData(&pwz, &pwzFirstFailureActionType);
516 ExitOnFailure(hr, "failed to process CustomActionData");
517 hr = WcaReadStringFromCaData(&pwz, &pwzSecondFailureActionType);
518 ExitOnFailure(hr, "failed to process CustomActionData");
519 hr = WcaReadStringFromCaData(&pwz, &pwzThirdFailureActionType);
520 ExitOnFailure(hr, "failed to process CustomActionData");
521 hr = WcaReadIntegerFromCaData(&pwz, reinterpret_cast<int*>(&dwResetPeriodInDays));
522 ExitOnFailure(hr, "failed to process CustomActionData");
523 hr = WcaReadIntegerFromCaData(&pwz, reinterpret_cast<int*>(&dwRestartServiceDelayInSeconds));
524 ExitOnFailure(hr, "failed to process CustomActionData");
525 hr = WcaReadStringFromCaData(&pwz, &pwzProgramCommandLine);
526 ExitOnFailure(hr, "failed to process CustomActionData");
527 hr = WcaReadStringFromCaData(&pwz, &pwzRebootMessage);
528 ExitOnFailure(hr, "failed to process CustomActionData");
529
530 WcaLog(LOGMSG_VERBOSE, "Reconfiguring Service: %ls", pwzServiceName);
531
532 // Open the handle with all the permissions we might need.
533 // SERVICE_CHANGE_CONFIG is needed for ChangeServiceConfig2().
534 // SERVICE_START is required in order to handle SC_ACTION_RESTART action.
535 hr = GetService(hSCM, pwzServiceName, SERVICE_CHANGE_CONFIG | SERVICE_START, &hService);
536 ExitOnFailure(hr, "Failed to get service: %ls", pwzServiceName);
537
538 hr = ConfigureService(hSCM, hService, pwzServiceName, dwRestartServiceDelayInSeconds, pwzFirstFailureActionType,
539 pwzSecondFailureActionType, pwzThirdFailureActionType, dwResetPeriodInDays, pwzRebootMessage, pwzProgramCommandLine);
540 ExitOnFailure(hr, "Failed to configure service: %ls", pwzServiceName);
541
542 hr = WcaProgressMessage(COST_SERVICECONFIG, FALSE);
543 ExitOnFailure(hr, "failed to send progress message");
544
545 // Per-service cleanup
546 ::CloseServiceHandle(hService);
547 hService = NULL;
548 dwResetPeriodInDays = 0;
549 dwRestartServiceDelayInSeconds = 0;
550 }
551
552LExit:
553 if (lpMsgBuf) // Allocated with FormatString.
554 {
555 ::LocalFree(lpMsgBuf);
556 }
557
558 if (hService)
559 {
560 ::CloseServiceHandle(hService);
561 }
562
563 if (hSCM)
564 {
565 ::CloseServiceHandle(hSCM);
566 }
567
568 WcaCaScriptClose(hRollbackScript, WCA_CASCRIPT_CLOSE_DELETE);
569
570 ReleaseStr(pwzRebootMessage);
571 ReleaseStr(pwzProgramCommandLine);
572 ReleaseStr(pwzThirdFailureActionType);
573 ReleaseStr(pwzSecondFailureActionType);
574 ReleaseStr(pwzFirstFailureActionType);
575 ReleaseStr(pwzServiceName);
576 ReleaseStr(pwzScriptKey);
577 ReleaseStr(pwzCustomActionData);
578
579 er = SUCCEEDED(hr) ? ERROR_SUCCESS : ERROR_INSTALL_FAILURE;
580 return WcaFinalize(er);
581}
582
583
584/**********************************************************
585GetSCActionType - helper function to return the SC_ACTION_TYPE
586for a given string matching the allowed set.
587REBOOT, RESTART, RUN_COMMAND and NONE
588**********************************************************/
589static SC_ACTION_TYPE GetSCActionType(
590 __in LPCWSTR pwzActionTypeName
591 )
592{
593 SC_ACTION_TYPE actionType;
594
595 // verify that action types are valid. if not, just default to NONE
596 if (0 == lstrcmpiW(c_wzActionTypeReboot, pwzActionTypeName))
597 {
598 actionType = SC_ACTION_REBOOT;
599 }
600 else if (0 == lstrcmpiW(c_wzActionTypeRestart, pwzActionTypeName))
601 {
602 actionType = SC_ACTION_RESTART;
603 }
604 else if (0 == lstrcmpiW(c_wzActionTypeRunCommand, pwzActionTypeName))
605 {
606 actionType = SC_ACTION_RUN_COMMAND;
607 }
608 else
609 {
610 // default to none
611 actionType = SC_ACTION_NONE;
612 }
613
614 return actionType;
615}
616
617
618static HRESULT GetSCActionTypeString(
619 __in SC_ACTION_TYPE type,
620 __out_ecount(cchActionTypeString) LPWSTR wzActionTypeString,
621 __in DWORD cchActionTypeString
622 )
623{
624 HRESULT hr = S_OK;
625
626 switch (type)
627 {
628 case SC_ACTION_REBOOT:
629 hr = StringCchCopyW(wzActionTypeString, cchActionTypeString, c_wzActionTypeReboot);
630 ExitOnFailure(hr, "Failed to copy 'reboot' into action type.");
631 break;
632 case SC_ACTION_RESTART:
633 hr = StringCchCopyW(wzActionTypeString, cchActionTypeString, c_wzActionTypeRestart);
634 ExitOnFailure(hr, "Failed to copy 'restart' into action type.");
635 break;
636 case SC_ACTION_RUN_COMMAND:
637 hr = StringCchCopyW(wzActionTypeString, cchActionTypeString, c_wzActionTypeRunCommand);
638 ExitOnFailure(hr, "Failed to copy 'runCommand' into action type.");
639 break;
640 case SC_ACTION_NONE:
641 hr = StringCchCopyW(wzActionTypeString, cchActionTypeString, c_wzActionTypeNone);
642 ExitOnFailure(hr, "Failed to copy 'none' into action type.");
643 break;
644 default:
645 break;
646 }
647
648LExit:
649 return hr;
650}
651
652
653static HRESULT GetService(
654 __in SC_HANDLE hSCM,
655 __in LPCWSTR wzService,
656 __in DWORD dwOpenServiceAccess,
657 __out SC_HANDLE* phService
658 )
659{
660 HRESULT hr = S_OK;
661 DWORD er = ERROR_SUCCESS;
662 LPVOID lpMsgBuf = NULL;
663
664 *phService = ::OpenServiceW(hSCM, wzService, dwOpenServiceAccess);
665 if (NULL == *phService)
666 {
667 er = ::GetLastError();
668 hr = HRESULT_FROM_WIN32(er);
669 if (ERROR_SERVICE_DOES_NOT_EXIST == er)
670 {
671 ExitOnFailure(hr, "Service '%ls' does not exist on this system.", wzService);
672 }
673 else
674 {
675#pragma prefast(push)
676#pragma prefast(disable:25028)
677 ::FormatMessageW(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, er, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPWSTR)&lpMsgBuf, 0, NULL);
678#pragma prefast(pop)
679
680 ExitOnFailure(hr, "Failed to get handle to the service '%ls'. Error: %ls", wzService, (LPWSTR)lpMsgBuf);
681 }
682 }
683
684LExit:
685 if (lpMsgBuf) // Allocated with FormatString.
686 {
687 ::LocalFree(lpMsgBuf);
688 }
689
690 return hr;
691}
692
693
694static HRESULT ConfigureService(
695 __in SC_HANDLE /*hSCM*/,
696 __in SC_HANDLE hService,
697 __in LPCWSTR wzServiceName,
698 __in DWORD dwRestartServiceDelayInSeconds,
699 __in LPCWSTR wzFirstFailureActionType,
700 __in LPCWSTR wzSecondFailureActionType,
701 __in LPCWSTR wzThirdFailureActionType,
702 __in DWORD dwResetPeriodInDays,
703 __in LPWSTR wzRebootMessage,
704 __in LPWSTR wzProgramCommandLine
705 )
706{
707 HRESULT hr = S_OK;
708 DWORD er = ERROR_SUCCESS;
709
710 HANDLE hToken = NULL;
711 TOKEN_PRIVILEGES priv = { 0 };
712 TOKEN_PRIVILEGES* pPrevPriv = NULL;
713 DWORD cbPrevPriv = 0;
714 BOOL fAdjustedPrivileges = FALSE;
715
716 SC_ACTION actions[3]; // the UI always shows 3 actions, so we'll always do 3
717 SERVICE_FAILURE_ACTIONSW sfa;
718 LPVOID lpMsgBuf = NULL;
719
720 // Always get the shutdown privilege in case we need to configure service to reboot.
721 if (!::OpenProcessToken(::GetCurrentProcess(), TOKEN_QUERY | TOKEN_ADJUST_PRIVILEGES, &hToken))
722 {
723 ExitWithLastError(hr, "Failed to get process token.");
724 }
725
726 priv.PrivilegeCount = 1;
727 priv.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
728 if (!::LookupPrivilegeValueW(NULL, L"SeShutdownPrivilege", &priv.Privileges[0].Luid))
729 {
730 ExitWithLastError(hr, "Failed to get shutdown privilege LUID.");
731 }
732
733 cbPrevPriv = sizeof(TOKEN_PRIVILEGES);
734 pPrevPriv = static_cast<TOKEN_PRIVILEGES*>(MemAlloc(cbPrevPriv, TRUE));
735 ExitOnNull(pPrevPriv, hr, E_OUTOFMEMORY, "Failed to allocate memory for empty previous privileges.");
736
737 if (!::AdjustTokenPrivileges(hToken, FALSE, &priv, cbPrevPriv, pPrevPriv, &cbPrevPriv))
738 {
739 LPVOID pv = MemReAlloc(pPrevPriv, cbPrevPriv, TRUE);
740 ExitOnNull(pv, hr, E_OUTOFMEMORY, "Failed to allocate memory for previous privileges.");
741 pPrevPriv = static_cast<TOKEN_PRIVILEGES*>(pv);
742
743 if (!::AdjustTokenPrivileges(hToken, FALSE, &priv, cbPrevPriv, pPrevPriv, &cbPrevPriv))
744 {
745 ExitWithLastError(hr, "Failed to get shutdown privilege LUID.");
746 }
747 }
748
749 fAdjustedPrivileges = TRUE;
750
751 // build up SC_ACTION array
752 // TODO: why is delay only respected when SC_ACTION_RESTART is requested?
753 actions[0].Type = GetSCActionType(wzFirstFailureActionType);
754 actions[0].Delay = 0;
755 if (SC_ACTION_RESTART == actions[0].Type)
756 {
757 actions[0].Delay = dwRestartServiceDelayInSeconds * 1000; // seconds to milliseconds
758 }
759
760 actions[1].Type = GetSCActionType(wzSecondFailureActionType);
761 actions[1].Delay = 0;
762 if (SC_ACTION_RESTART == actions[1].Type)
763 {
764 actions[1].Delay = dwRestartServiceDelayInSeconds * 1000; // seconds to milliseconds
765 }
766
767 actions[2].Type = GetSCActionType(wzThirdFailureActionType);
768 actions[2].Delay = 0;
769 if (SC_ACTION_RESTART == actions[2].Type)
770 {
771 actions[2].Delay = dwRestartServiceDelayInSeconds * 1000; // seconds to milliseconds
772 }
773
774 // build up the SERVICE_FAILURE_ACTIONSW struct
775 sfa.dwResetPeriod = dwResetPeriodInDays * (24 * 60 * 60); // days to seconds
776 sfa.lpRebootMsg = wzRebootMessage;
777 sfa.lpCommand = wzProgramCommandLine;
778 sfa.cActions = countof(actions);
779 sfa.lpsaActions = actions;
780
781 // Call ChangeServiceConfig2 to actually set up the failure actions
782 if (!::ChangeServiceConfig2W(hService, SERVICE_CONFIG_FAILURE_ACTIONS, (LPVOID)&sfa))
783 {
784 er = ::GetLastError();
785 hr = HRESULT_FROM_WIN32(er);
786
787#pragma prefast(push)
788#pragma prefast(disable:25028)
789 ::FormatMessageW(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, er, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPWSTR)&lpMsgBuf, 0, NULL);
790#pragma prefast(pop)
791
792 // Check if this is a service that can't be modified.
793 if (ERROR_CANNOT_DETECT_PROCESS_ABORT == er)
794 {
795 WcaLog(LOGMSG_STANDARD, "WARNING: Service \"%ls\" is not configurable on this server and will not be set.", wzServiceName);
796 }
797 ExitOnFailure(hr, "Cannot change service configuration. Error: %ls", (LPWSTR)lpMsgBuf);
798
799 if (lpMsgBuf)
800 {
801 ::LocalFree(lpMsgBuf);
802 lpMsgBuf = NULL;
803 }
804 }
805
806LExit:
807 if (lpMsgBuf)
808 {
809 ::LocalFree(lpMsgBuf);
810 }
811
812 if (fAdjustedPrivileges)
813 {
814 ::AdjustTokenPrivileges(hToken, FALSE, pPrevPriv, 0, NULL, NULL);
815 }
816
817 ReleaseMem(pPrevPriv);
818 ReleaseHandle(hToken);
819
820 return hr;
821}
diff --git a/src/ext/Util/ca/shellexecca.cpp b/src/ext/Util/ca/shellexecca.cpp
new file mode 100644
index 00000000..ea21d3bd
--- /dev/null
+++ b/src/ext/Util/ca/shellexecca.cpp
@@ -0,0 +1,271 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3#include "precomp.h"
4
5HRESULT ShellExec(
6 __in LPCWSTR wzTarget,
7 __in BOOL fUnelevated
8 )
9{
10 HRESULT hr = S_OK;
11 LPWSTR sczWorkingDirectory = NULL;
12
13 // a reasonable working directory (not the system32 default from MSI) is the directory where the target lives
14 hr = PathGetDirectory(wzTarget, &sczWorkingDirectory);
15 ExitOnFailure(hr, "failed to get directory for target: %ls", wzTarget);
16
17 if (!DirExists(sczWorkingDirectory, NULL))
18 {
19 ReleaseNullStr(sczWorkingDirectory);
20 }
21
22 if (fUnelevated)
23 {
24 hr = ShelExecUnelevated(wzTarget, NULL, NULL, sczWorkingDirectory, SW_SHOWDEFAULT);
25 ExitOnFailure(hr, "ShelExecUnelevated failed with target %ls", wzTarget);
26 }
27 else
28 {
29 HINSTANCE hinst = ::ShellExecuteW(NULL, NULL, wzTarget, NULL, sczWorkingDirectory, SW_SHOWDEFAULT);
30 if (hinst <= HINSTANCE(32))
31 {
32 LONG64 code = reinterpret_cast<LONG64>(hinst);
33 switch (code)
34 {
35 case ERROR_FILE_NOT_FOUND:
36 hr = HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND);
37 break;
38 case ERROR_PATH_NOT_FOUND:
39 hr = HRESULT_FROM_WIN32(ERROR_PATH_NOT_FOUND);
40 break;
41 case ERROR_BAD_FORMAT:
42 hr = HRESULT_FROM_WIN32(ERROR_BAD_FORMAT);
43 break;
44 case SE_ERR_ASSOCINCOMPLETE:
45 case SE_ERR_NOASSOC:
46 hr = HRESULT_FROM_WIN32(ERROR_NO_ASSOCIATION);
47 break;
48 case SE_ERR_DDEBUSY:
49 case SE_ERR_DDEFAIL:
50 case SE_ERR_DDETIMEOUT:
51 hr = HRESULT_FROM_WIN32(ERROR_DDE_FAIL);
52 break;
53 case SE_ERR_DLLNOTFOUND:
54 hr = HRESULT_FROM_WIN32(ERROR_DLL_NOT_FOUND);
55 break;
56 case SE_ERR_OOM:
57 hr = E_OUTOFMEMORY;
58 break;
59 case SE_ERR_ACCESSDENIED:
60 hr = E_ACCESSDENIED;
61 break;
62 default:
63 hr = E_FAIL;
64 }
65
66 ExitOnFailure(hr, "ShellExec failed with return code %llu.", code);
67 }
68 }
69
70
71LExit:
72 ReleaseStr(sczWorkingDirectory);
73 return hr;
74}
75
76extern "C" UINT __stdcall WixShellExec(
77 __in MSIHANDLE hInstall
78 )
79{
80 Assert(hInstall);
81 HRESULT hr = S_OK;
82 UINT er = ERROR_SUCCESS;
83 LPWSTR pwzTarget = NULL;
84
85 hr = WcaInitialize(hInstall, "WixShellExec");
86 ExitOnFailure(hr, "failed to initialize");
87
88 hr = WcaGetFormattedProperty(L"WixShellExecTarget", &pwzTarget);
89 ExitOnFailure(hr, "failed to get WixShellExecTarget");
90
91 WcaLog(LOGMSG_VERBOSE, "WixShellExecTarget is %ls", pwzTarget);
92
93 if (!pwzTarget || !*pwzTarget)
94 {
95 hr = E_INVALIDARG;
96 ExitOnFailure(hr, "failed to get WixShellExecTarget");
97 }
98
99 hr = ShellExec(pwzTarget, FALSE);
100 ExitOnFailure(hr, "failed to launch target");
101
102LExit:
103 ReleaseStr(pwzTarget);
104
105 if (FAILED(hr))
106 {
107 er = ERROR_INSTALL_FAILURE;
108 }
109 return WcaFinalize(er);
110}
111
112extern "C" UINT __stdcall WixUnelevatedShellExec(
113 __in MSIHANDLE hInstall
114 )
115{
116 Assert(hInstall);
117 HRESULT hr = S_OK;
118 UINT er = ERROR_SUCCESS;
119 LPWSTR pwzTarget = NULL;
120
121 hr = WcaInitialize(hInstall, "WixUnelevatedShellExec");
122 ExitOnFailure(hr, "failed to initialize");
123
124 hr = WcaGetFormattedProperty(L"WixUnelevatedShellExecTarget", &pwzTarget);
125 ExitOnFailure(hr, "failed to get WixUnelevatedShellExecTarget");
126
127 WcaLog(LOGMSG_VERBOSE, "WixUnelevatedShellExecTarget is %ls", pwzTarget);
128
129 if (!pwzTarget || !*pwzTarget)
130 {
131 hr = E_INVALIDARG;
132 ExitOnFailure(hr, "failed to get WixShellExecTarget");
133 }
134
135 hr = ShellExec(pwzTarget, TRUE);
136 ExitOnFailure(hr, "failed to launch target");
137
138LExit:
139 ReleaseStr(pwzTarget);
140
141 if (FAILED(hr))
142 {
143 er = ERROR_INSTALL_FAILURE;
144 }
145 return WcaFinalize(er);
146}
147
148//
149// ExtractBinary extracts the data from the Binary table row with the given ID into a file.
150//
151HRESULT ExtractBinary(
152 __in LPCWSTR wzBinaryId,
153 __out BYTE** pbData,
154 __out DWORD* pcbData
155 )
156{
157 HRESULT hr = S_OK;
158 LPWSTR pwzSql = NULL;
159 PMSIHANDLE hView;
160 PMSIHANDLE hRec;
161
162 // make sure we're not horked from the get-go
163 hr = WcaTableExists(L"Binary");
164 if (S_OK != hr)
165 {
166 if (SUCCEEDED(hr))
167 {
168 hr = E_UNEXPECTED;
169 }
170 ExitOnFailure(hr, "There is no Binary table.");
171 }
172
173 ExitOnNull(wzBinaryId, hr, E_INVALIDARG, "Binary ID cannot be null");
174 ExitOnNull(*wzBinaryId, hr, E_INVALIDARG, "Binary ID cannot be empty string");
175
176 hr = StrAllocFormatted(&pwzSql, L"SELECT `Data` FROM `Binary` WHERE `Name`=\'%s\'", wzBinaryId);
177 ExitOnFailure(hr, "Failed to allocate Binary table query.");
178
179 hr = WcaOpenExecuteView(pwzSql, &hView);
180 ExitOnFailure(hr, "Failed to open view on Binary table");
181
182 hr = WcaFetchSingleRecord(hView, &hRec);
183 ExitOnFailure(hr, "Failed to retrieve request from Binary table");
184
185 hr = WcaGetRecordStream(hRec, 1, pbData, pcbData);
186 ExitOnFailure(hr, "Failed to read Binary.Data.");
187
188LExit:
189 ReleaseStr(pwzSql);
190
191 return hr;
192}
193
194extern "C" UINT __stdcall WixShellExecBinary(
195 __in MSIHANDLE hInstall
196 )
197{
198 Assert(hInstall);
199 HRESULT hr = S_OK;
200 UINT er = ERROR_SUCCESS;
201 LPWSTR pwzBinary = NULL;
202 LPWSTR pwzFilename = NULL;
203 BYTE* pbData = NULL;
204 DWORD cbData = 0;
205 HANDLE hFile = INVALID_HANDLE_VALUE;
206
207#if 0
208 ::MessageBoxA(0, "WixShellExecBinary", "-->> ATTACH HERE", MB_OK);
209#endif
210
211 hr = WcaInitialize(hInstall, "WixShellExecBinary");
212 ExitOnFailure(hr, "failed to initialize");
213
214 hr = WcaGetFormattedProperty(L"WixShellExecBinaryId", &pwzBinary);
215 ExitOnFailure(hr, "failed to get WixShellExecBinaryId");
216
217 WcaLog(LOGMSG_VERBOSE, "WixShellExecBinaryId is %ls", pwzBinary);
218
219 if (!pwzBinary || !*pwzBinary)
220 {
221 hr = E_INVALIDARG;
222 ExitOnFailure(hr, "failed to get WixShellExecBinaryId");
223 }
224
225 // get temporary path for extracted file
226 StrAlloc(&pwzFilename, MAX_PATH);
227 ExitOnFailure(hr, "Failed to allocate temporary path");
228 ::GetTempPathW(MAX_PATH, pwzFilename);
229 hr = ::StringCchCatW(pwzFilename, MAX_PATH, pwzBinary);
230 ExitOnFailure(hr, "Failed to append filename.");
231
232 // grab the bits
233 hr = ExtractBinary(pwzBinary, &pbData, &cbData);
234 ExitOnFailure(hr, "failed to extract binary data");
235
236 // write 'em to the temp file
237 hFile = ::CreateFileW(pwzFilename, GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
238 if (INVALID_HANDLE_VALUE == hFile)
239 {
240 ExitWithLastError(hr, "Failed to open new temp file: %ls", pwzFilename);
241 }
242
243 DWORD cbWritten = 0;
244 if (!::WriteFile(hFile, pbData, cbData, &cbWritten, NULL))
245 {
246 ExitWithLastError(hr, "Failed to write data to new temp file: %ls", pwzFilename);
247 }
248
249 // close it
250 ::CloseHandle(hFile);
251 hFile = INVALID_HANDLE_VALUE;
252
253 // and run it
254 hr = ShellExec(pwzFilename, FALSE);
255 ExitOnFailure(hr, "failed to launch target: %ls", pwzFilename);
256
257LExit:
258 ReleaseStr(pwzBinary);
259 ReleaseStr(pwzFilename);
260 ReleaseMem(pbData);
261 if (INVALID_HANDLE_VALUE != hFile)
262 {
263 ::CloseHandle(hFile);
264 }
265
266 if (FAILED(hr))
267 {
268 er = ERROR_INSTALL_FAILURE;
269 }
270 return WcaFinalize(er);
271}
diff --git a/src/ext/Util/ca/test.cpp b/src/ext/Util/ca/test.cpp
new file mode 100644
index 00000000..c4d215f0
--- /dev/null
+++ b/src/ext/Util/ca/test.cpp
@@ -0,0 +1,269 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3#include "precomp.h"
4
5#define WIXCA_UITHREAD_CLASS_WINDOW L"WixCaMessageWindow"
6
7extern HMODULE g_hInstCADLL;
8
9
10// structs
11
12struct UITHREAD_CONTEXT
13{
14 HANDLE hInitializedEvent;
15 HINSTANCE hInstance;
16 HWND hWnd;
17};
18
19
20// internal function declarations
21
22static HRESULT CreateMessageWindow(
23 __out HWND* phWnd
24 );
25
26static void CloseMessageWindow(
27 __in HWND hWnd
28 );
29
30static DWORD WINAPI ThreadProc(
31 __in LPVOID pvContext
32 );
33
34static LRESULT CALLBACK WndProc(
35 __in HWND hWnd,
36 __in UINT uMsg,
37 __in WPARAM wParam,
38 __in LPARAM lParam
39 );
40
41
42/******************************************************************
43WixFailWhenDeferred - entry point for WixFailWhenDeferred
44 custom action which always fails when running as a deferred
45 custom action (otherwise it blindly succeeds). It's useful when
46 testing the rollback of deferred custom actions: Schedule it
47 immediately after the rollback/deferred CA pair you're testing
48 and it will fail, causing your rollback CA to get invoked.
49********************************************************************/
50extern "C" UINT __stdcall WixFailWhenDeferred(
51 __in MSIHANDLE hInstall
52 )
53{
54 return ::MsiGetMode(hInstall, MSIRUNMODE_SCHEDULED) ? ERROR_INSTALL_FAILURE : ERROR_SUCCESS;
55}
56
57/******************************************************************
58WixWaitForEvent - entry point for WixWaitForEvent custom action
59 which waits for either the WixWaitForEventFail or
60 WixWaitForEventSucceed named auto reset events. Signaling the
61 WixWaitForEventFail event will return ERROR_INSTALL_FAILURE or
62 signaling the WixWaitForEventSucceed event will return
63 ERROR_SUCCESS. Both events are declared in the Global\ namespace.
64********************************************************************/
65extern "C" UINT __stdcall WixWaitForEvent(
66 __in MSIHANDLE hInstall
67 )
68{
69 HRESULT hr = S_OK;
70 UINT er = ERROR_SUCCESS;
71 HWND hMessageWindow = NULL;
72 LPCWSTR wzSDDL = L"D:(A;;GA;;;WD)";
73 OS_VERSION version = OS_VERSION_UNKNOWN;
74 DWORD dwServicePack = 0;
75 PSECURITY_DESCRIPTOR pSD = NULL;
76 SECURITY_ATTRIBUTES sa = { };
77 HANDLE rghEvents[2];
78
79 hr = WcaInitialize(hInstall, "WixWaitForEvent");
80 ExitOnFailure(hr, "Failed to initialize.");
81
82 // Create a window to prevent shutdown requests.
83 hr = CreateMessageWindow(&hMessageWindow);
84 ExitOnFailure(hr, "Failed to create message window.");
85
86 // If running on Vista/2008 or newer use integrity enhancements.
87 OsGetVersion(&version, &dwServicePack);
88 if (OS_VERSION_VISTA <= version)
89 {
90 // Add SACL to allow Everyone to signal from a medium integrity level.
91 wzSDDL = L"D:(A;;GA;;;WD)S:(ML;;NW;;;ME)";
92 }
93
94 // Create the security descriptor and attributes for the events.
95 if (!::ConvertStringSecurityDescriptorToSecurityDescriptorW(wzSDDL, SDDL_REVISION_1, &pSD, NULL))
96 {
97 ExitWithLastError(hr, "Failed to create the security descriptor for the events.");
98 }
99
100 sa.nLength = sizeof(sa);
101 sa.lpSecurityDescriptor = pSD;
102 sa.bInheritHandle = FALSE;
103
104 rghEvents[0] = ::CreateEventW(&sa, FALSE, FALSE, L"Global\\WixWaitForEventFail");
105 ExitOnNullWithLastError(rghEvents[0], hr, "Failed to create the Global\\WixWaitForEventFail event.");
106
107 rghEvents[1] = ::CreateEventW(&sa, FALSE, FALSE, L"Global\\WixWaitForEventSucceed");
108 ExitOnNullWithLastError(rghEvents[1], hr, "Failed to create the Global\\WixWaitForEventSucceed event.");
109
110 // Wait for either of the events to be signaled and handle accordingly.
111 er = ::WaitForMultipleObjects(countof(rghEvents), rghEvents, FALSE, INFINITE);
112 switch (er)
113 {
114 case WAIT_OBJECT_0 + 0:
115 er = ERROR_INSTALL_FAILURE;
116 break;
117 case WAIT_OBJECT_0 + 1:
118 er = ERROR_SUCCESS;
119 break;
120 default:
121 ExitOnWin32Error(er, hr, "Unexpected failure.");
122 }
123
124LExit:
125 ReleaseHandle(rghEvents[1]);
126 ReleaseHandle(rghEvents[0]);
127
128 if (pSD)
129 {
130 ::LocalFree(pSD);
131 }
132
133 if (hMessageWindow)
134 {
135 CloseMessageWindow(hMessageWindow);
136 }
137
138 if (FAILED(hr))
139 {
140 er = ERROR_INSTALL_FAILURE;
141 }
142
143 return WcaFinalize(er);
144}
145
146
147// internal function definitions
148
149static HRESULT CreateMessageWindow(
150 __out HWND* phWnd
151 )
152{
153 HRESULT hr = S_OK;
154 HANDLE rgWaitHandles[2] = { };
155 UITHREAD_CONTEXT context = { };
156
157 // Create event to signal after the UI thread / window is initialized.
158 rgWaitHandles[0] = ::CreateEventW(NULL, TRUE, FALSE, NULL);
159 ExitOnNullWithLastError(rgWaitHandles[0], hr, "Failed to create initialization event.");
160
161 // Pass necessary information to create the window.
162 context.hInitializedEvent = rgWaitHandles[0];
163 context.hInstance = (HINSTANCE)g_hInstCADLL;
164
165 // Create our separate UI thread.
166 rgWaitHandles[1] = ::CreateThread(NULL, 0, ThreadProc, &context, 0, NULL);
167 ExitOnNullWithLastError(rgWaitHandles[1], hr, "Failed to create the UI thread.");
168
169 // Wait for either the thread to be initialized or the window to exit / fail prematurely.
170 ::WaitForMultipleObjects(countof(rgWaitHandles), rgWaitHandles, FALSE, INFINITE);
171
172 // Pass the window back to the caller.
173 *phWnd = context.hWnd;
174
175LExit:
176 ReleaseHandle(rgWaitHandles[1]);
177 ReleaseHandle(rgWaitHandles[0]);
178
179 return hr;
180}
181
182static void CloseMessageWindow(
183 __in HWND hWnd
184 )
185{
186 if (::IsWindow(hWnd))
187 {
188 ::PostMessageW(hWnd, WM_CLOSE, 0, 0);
189 }
190}
191
192static DWORD WINAPI ThreadProc(
193 __in LPVOID pvContext
194 )
195{
196 HRESULT hr = S_OK;
197 UITHREAD_CONTEXT* pContext = static_cast<UITHREAD_CONTEXT*>(pvContext);
198
199 WNDCLASSW wc = { };
200 BOOL fRegistered = TRUE;
201 HWND hWnd = NULL;
202
203 BOOL fRet = FALSE;
204 MSG msg = { };
205
206 wc.lpfnWndProc = WndProc;
207 wc.hInstance = pContext->hInstance;
208 wc.lpszClassName = WIXCA_UITHREAD_CLASS_WINDOW;
209
210 if (!::RegisterClassW(&wc))
211 {
212 ExitWithLastError(hr, "Failed to register window.");
213 }
214
215 fRegistered = TRUE;
216
217 // Create the window to handle reboots without activating it.
218 hWnd = ::CreateWindowExW(WS_EX_TOOLWINDOW, wc.lpszClassName, NULL, WS_POPUP | WS_VISIBLE, CW_USEDEFAULT, SW_SHOWNA, 0, 0, HWND_DESKTOP, NULL, pContext->hInstance, NULL);
219 ExitOnNullWithLastError(hWnd, hr, "Failed to create window.");
220
221 // Persist the window handle and let the caller know we've initialized.
222 pContext->hWnd = hWnd;
223 ::SetEvent(pContext->hInitializedEvent);
224
225 // Pump messages until the window is closed.
226 while (0 != (fRet = ::GetMessageW(&msg, NULL, 0, 0)))
227 {
228 if (-1 == fRet)
229 {
230 hr = E_UNEXPECTED;
231 ExitOnFailure(hr, "Unexpected return value from message pump.");
232 }
233 else if (!::IsDialogMessageW(msg.hwnd, &msg))
234 {
235 ::TranslateMessage(&msg);
236 ::DispatchMessageW(&msg);
237 }
238 }
239
240LExit:
241 if (fRegistered)
242 {
243 ::UnregisterClassW(WIXCA_UITHREAD_CLASS_WINDOW, pContext->hInstance);
244 }
245
246 return hr;
247}
248
249static LRESULT CALLBACK WndProc(
250 __in HWND hWnd,
251 __in UINT uMsg,
252 __in WPARAM wParam,
253 __in LPARAM lParam
254 )
255{
256 switch (uMsg)
257 {
258 case WM_QUERYENDSESSION:
259 // Prevent the process from being shut down.
260 WcaLog(LOGMSG_VERBOSE, "Disallowed system request to shut down the custom action server.");
261 return FALSE;
262
263 case WM_DESTROY:
264 ::PostQuitMessage(0);
265 return 0;
266 }
267
268 return ::DefWindowProcW(hWnd, uMsg, wParam, lParam);
269}
diff --git a/src/ext/Util/ca/utilca.cpp b/src/ext/Util/ca/utilca.cpp
new file mode 100644
index 00000000..37664a1c
--- /dev/null
+++ b/src/ext/Util/ca/utilca.cpp
@@ -0,0 +1,3 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3#include "precomp.h"
diff --git a/src/ext/Util/ca/utilca.def b/src/ext/Util/ca/utilca.def
new file mode 100644
index 00000000..412d86a3
--- /dev/null
+++ b/src/ext/Util/ca/utilca.def
@@ -0,0 +1,91 @@
1; Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3
4LIBRARY "utilca"
5
6EXPORTS
7; BroadcastSettingChange.cpp
8 WixBroadcastSettingChange
9 WixBroadcastEnvironmentChange
10; checkreboot.cpp
11 WixCheckRebootRequired
12; closeapps.cpp
13 WixCloseApplications
14 WixCloseApplicationsDeferred
15; exitearlywithsuccess.cpp
16 WixExitEarlyWithSuccess
17; FormatFiles.cpp
18 WixSchedFormatFiles
19 WixExecFormatFiles
20; osinfo.cpp
21 WixQueryOsInfo
22 WixQueryOsDirs
23 WixQueryOsWellKnownSID
24 WixQueryOsDriverInfo
25; netshortcuts.cpp
26 WixSchedInternetShortcuts
27 WixCreateInternetShortcuts
28 WixRollbackInternetShortcuts
29; qtexecca.cpp
30 CAQuietExec
31 CAQuietExec64
32 WixQuietExec
33 WixQuietExec64
34 WixSilentExec
35 WixSilentExec64
36; RemoveFoldersEx.cpp
37 WixRemoveFoldersEx
38; RemoveRegistryKeysEx.cpp
39 WixRemoveRegistryKeysEx
40;scaexec.cpp
41 RegisterPerfCounterData
42 UnregisterPerfCounterData
43 RegisterPerfmon
44 UnregisterPerfmon
45 CreateSmb
46 DropSmb
47 CreateUser
48 CreateUserRollback
49 RemoveUser
50;scasched.cpp
51 ConfigurePerfmonInstall
52 ConfigurePerfmonUninstall
53 ConfigureSmbInstall
54 ConfigureSmbUninstall
55 ConfigureUsers
56 InstallPerfCounterData
57 UninstallPerfCounterData
58 ConfigurePerfmonManifestRegister
59 ConfigurePerfmonManifestUnregister
60 ConfigureEventManifestRegister
61 ConfigureEventManifestUnregister
62; RestartManager.cpp
63 WixRegisterRestartResources
64; secureobj.cpp
65 SchedSecureObjects
66 SchedSecureObjectsRollback
67 ExecSecureObjects
68 ExecSecureObjectsRollback
69; serviceconfig.cpp
70 SchedServiceConfig
71 ExecServiceConfig
72 RollbackServiceConfig
73; shellexecca.cpp
74 WixShellExec
75 WixShellExecBinary
76 WixUnelevatedShellExec
77; test.cpp
78 WixFailWhenDeferred
79 WixWaitForEvent
80; TouchFile.cpp
81 WixTouchFileDuringInstall
82 WixTouchFileDuringUninstall
83 WixExecuteTouchFile
84; xmlfile.cpp
85 SchedXmlFile
86 ExecXmlFile
87 ExecXmlFileRollback
88; xmlconfig.cpp
89 SchedXmlConfig
90 ExecXmlConfig
91 ExecXmlConfigRollback
diff --git a/src/ext/Util/ca/utilca.vcxproj b/src/ext/Util/ca/utilca.vcxproj
new file mode 100644
index 00000000..7b64db95
--- /dev/null
+++ b/src/ext/Util/ca/utilca.vcxproj
@@ -0,0 +1,106 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3
4<Project DefaultTargets="Build" ToolsVersion="16.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
5 <ItemGroup Label="ProjectConfigurations">
6 <ProjectConfiguration Include="Debug|ARM64">
7 <Configuration>Debug</Configuration>
8 <Platform>ARM64</Platform>
9 </ProjectConfiguration>
10 <ProjectConfiguration Include="Release|ARM64">
11 <Configuration>Release</Configuration>
12 <Platform>ARM64</Platform>
13 </ProjectConfiguration>
14 <ProjectConfiguration Include="Debug|X64">
15 <Configuration>Debug</Configuration>
16 <Platform>X64</Platform>
17 </ProjectConfiguration>
18 <ProjectConfiguration Include="Release|X64">
19 <Configuration>Release</Configuration>
20 <Platform>X64</Platform>
21 </ProjectConfiguration>
22 <ProjectConfiguration Include="Debug|Win32">
23 <Configuration>Debug</Configuration>
24 <Platform>Win32</Platform>
25 </ProjectConfiguration>
26 <ProjectConfiguration Include="Release|Win32">
27 <Configuration>Release</Configuration>
28 <Platform>Win32</Platform>
29 </ProjectConfiguration>
30 </ItemGroup>
31
32 <PropertyGroup Label="Globals">
33 <ProjectGuid>{076018F7-19BD-423A-ABBF-229273DA08D8}</ProjectGuid>
34 <ConfigurationType>DynamicLibrary</ConfigurationType>
35 <TargetName>utilca</TargetName>
36 <PlatformToolset>v142</PlatformToolset>
37 <CharacterSet>Unicode</CharacterSet>
38 <ProjectModuleDefinitionFile>utilca.def</ProjectModuleDefinitionFile>
39 <Description>WiX Toolset Util CustomAction</Description>
40 </PropertyGroup>
41
42 <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
43 <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
44
45 <PropertyGroup>
46 <ProjectAdditionalLinkLibraries>activeds.lib;adsiid.lib;msi.lib;netapi32.lib;shlwapi.lib</ProjectAdditionalLinkLibraries>
47 </PropertyGroup>
48
49 <ItemGroup>
50 <ClCompile Include="BroadcastSettingChange.cpp" />
51 <ClCompile Include="CheckReboot.cpp" />
52 <ClCompile Include="CloseApps.cpp" />
53 <ClCompile Include="dllmain.cpp">
54 <PrecompiledHeader>Create</PrecompiledHeader>
55 </ClCompile>
56 <ClCompile Include="exitearlywithsuccess.cpp" />
57 <ClCompile Include="FormatFiles.cpp" />
58 <ClCompile Include="netshortcuts.cpp" />
59 <ClCompile Include="OsInfo.cpp" />
60 <ClCompile Include="qtexecca.cpp" />
61 <ClCompile Include="RemoveFoldersEx.cpp" />
62 <ClCompile Include="RemoveRegistryKeysEx.cpp" />
63 <ClCompile Include="RestartManager.cpp" />
64 <ClCompile Include="scaexec.cpp" />
65 <ClCompile Include="scamanifest.cpp" />
66 <ClCompile Include="scaperf.cpp" />
67 <ClCompile Include="scaperfexec.cpp" />
68 <ClCompile Include="scasched.cpp" />
69 <ClCompile Include="scasmbexec.cpp" />
70 <ClCompile Include="scasmbsched.cpp" />
71 <ClCompile Include="scauser.cpp" />
72 <ClCompile Include="secureobj.cpp" />
73 <ClCompile Include="serviceconfig.cpp" />
74 <ClCompile Include="shellexecca.cpp" />
75 <ClCompile Include="test.cpp" />
76 <ClCompile Include="TouchFile.cpp" />
77 <ClCompile Include="utilca.cpp" />
78 <ClCompile Include="XmlConfig.cpp" />
79 <ClCompile Include="XmlFile.cpp" />
80 </ItemGroup>
81
82 <ItemGroup>
83 <ClInclude Include="caDecor.h" />
84 <ClInclude Include="cost.h" />
85 <ClInclude Include="CustomMsiErrors.h" />
86 <ClInclude Include="precomp.h" />
87 <ClInclude Include="sca.h" />
88 <ClInclude Include="scacost.h" />
89 <ClInclude Include="scasmb.h" />
90 <ClInclude Include="scasmbexec.h" />
91 <ClInclude Include="scauser.h" />
92 </ItemGroup>
93
94 <ItemGroup>
95 <None Include="utilca.def" />
96 </ItemGroup>
97
98 <ItemGroup>
99 <PackageReference Include="WixToolset.Dutil" Version="4.0.72" />
100 <PackageReference Include="WixToolset.WcaUtil" Version="4.0.19" />
101 <PackageReference Include="Microsoft.SourceLink.GitHub" Version="1.0.0" />
102 <PackageReference Include="Nerdbank.GitVersioning" Version="3.3.37" />
103 </ItemGroup>
104
105 <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
106</Project>
diff --git a/src/ext/Util/nuget.config b/src/ext/Util/nuget.config
new file mode 100644
index 00000000..8d711148
--- /dev/null
+++ b/src/ext/Util/nuget.config
@@ -0,0 +1,18 @@
1<?xml version="1.0" encoding="utf-8"?>
2<configuration>
3 <packageSources>
4 <clear />
5 <add key="wixtoolset-balutil" value="https://ci.appveyor.com/nuget/wixtoolset-balutil" />
6 <add key="wixtoolset-burn" value="https://ci.appveyor.com/nuget/wixtoolset-burn" />
7 <add key="wixtoolset-data" value="https://ci.appveyor.com/nuget/wixtoolset-data" />
8 <add key="wixtoolset-extensibility" value="https://ci.appveyor.com/nuget/wixtoolset-extensibility" />
9 <add key="wixtoolset-core" value="https://ci.appveyor.com/nuget/wixtoolset-core" />
10 <add key="wixtoolset-core-native" value="https://ci.appveyor.com/nuget/wixtoolset-core-native" />
11 <add key="wixtoolset-dtf" value="https://ci.appveyor.com/nuget/wixtoolset-dtf" />
12 <add key="wixtoolset-dutil" value="https://ci.appveyor.com/nuget/wixtoolset-dutil" />
13 <add key="wixtoolset-wcautil" value="https://ci.appveyor.com/nuget/wixtoolset-wcautil" />
14 <add key="wixtoolset-tools" value="https://ci.appveyor.com/nuget/wixtoolset-tools" />
15 <add key="wixbuildtools" value="https://ci.appveyor.com/nuget/wixbuildtools" />
16 <add key="api.nuget.org" value="https://api.nuget.org/v3/index.json" protocolVersion="3" />
17 </packageSources>
18</configuration> \ No newline at end of file
diff --git a/src/ext/Util/test/WixToolsetTest.Util/TestData/.Data/burn.exe b/src/ext/Util/test/WixToolsetTest.Util/TestData/.Data/burn.exe
new file mode 100644
index 00000000..2a4f423f
--- /dev/null
+++ b/src/ext/Util/test/WixToolsetTest.Util/TestData/.Data/burn.exe
Binary files differ
diff --git a/src/ext/Util/test/WixToolsetTest.Util/TestData/BundleWithSearches/Bundle.en-us.wxl b/src/ext/Util/test/WixToolsetTest.Util/TestData/BundleWithSearches/Bundle.en-us.wxl
new file mode 100644
index 00000000..f50a5386
--- /dev/null
+++ b/src/ext/Util/test/WixToolsetTest.Util/TestData/BundleWithSearches/Bundle.en-us.wxl
@@ -0,0 +1,8 @@
1<!--
2This file contains the declaration of all the localizable strings.
3-->
4<WixLocalization xmlns="http://wixtoolset.org/schemas/v4/wxl" Culture="en-US">
5
6 <String Id="BundleName">~TestBundle</String>
7
8</WixLocalization>
diff --git a/src/ext/Util/test/WixToolsetTest.Util/TestData/BundleWithSearches/Bundle.wxs b/src/ext/Util/test/WixToolsetTest.Util/TestData/BundleWithSearches/Bundle.wxs
new file mode 100644
index 00000000..7fef0725
--- /dev/null
+++ b/src/ext/Util/test/WixToolsetTest.Util/TestData/BundleWithSearches/Bundle.wxs
@@ -0,0 +1,52 @@
1<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs" xmlns:util="http://wixtoolset.org/schemas/v4/wxs/util">
2 <Bundle Name="!(loc.BundleName)" Version="1.0.0.0" Manufacturer="Example Corporation" UpgradeCode="047730a5-30fe-4a62-a520-da9381b8226a">
3 <BootstrapperApplication>
4 <BootstrapperApplicationDll SourceFile="fakeba.dll" />
5 </BootstrapperApplication>
6
7 <util:RegistrySearchRef Id="RegistrySearchId" />
8 <util:RegistrySearchRef Id="RegistrySearchId64" />
9 <util:ProductSearchRef Id="ProductSearchId" />
10 <util:FileSearchRef Id="FileSearchId" />
11 <util:WindowsFeatureSearchRef Id="DetectSHA2SupportId" />
12
13 <Chain>
14 <MsiPackage SourceFile="test.msi">
15 <MsiProperty Name="TEST" Value="1" />
16 </MsiPackage>
17 </Chain>
18 </Bundle>
19
20 <Fragment>
21 <util:RegistrySearch
22 Id="RegistrySearchId"
23 Variable="RegistrySearchVariable"
24 Root="HKLM"
25 Key="SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full"
26 Value="Release"
27 Result="value" />
28 </Fragment>
29
30 <Fragment>
31 <util:RegistrySearch
32 Id="RegistrySearchId64"
33 Variable="RegistrySearchVariable64"
34 Root="HKLM"
35 Key="SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full"
36 Value="Release"
37 Result="value"
38 Bitness="always64" />
39 </Fragment>
40
41 <Fragment>
42 <util:ProductSearch Id="ProductSearchId" Variable="ProductSearchVariable" UpgradeCode="738D02BF-E231-4370-8209-E9FD4E1BE2A1" Condition="1 &amp; 2 &lt; 3" Result="version" />
43 </Fragment>
44
45 <Fragment>
46 <util:FileSearch Id="FileSearchId" Variable="FileSearchVariable" Path="%windir%\System32\mscoree.dll" Result="exists" />
47 </Fragment>
48
49 <Fragment>
50 <util:WindowsFeatureSearch Id="DetectSHA2SupportId" Variable="IsSHA2Supported" Feature="sha2CodeSigning" />
51 </Fragment>
52</Wix>
diff --git a/src/ext/Util/test/WixToolsetTest.Util/TestData/BundleWithSearches/data/MsiPackage/Shared.dll b/src/ext/Util/test/WixToolsetTest.Util/TestData/BundleWithSearches/data/MsiPackage/Shared.dll
new file mode 100644
index 00000000..0e461ba8
--- /dev/null
+++ b/src/ext/Util/test/WixToolsetTest.Util/TestData/BundleWithSearches/data/MsiPackage/Shared.dll
@@ -0,0 +1 @@
This is Shared.dll. \ No newline at end of file
diff --git a/src/ext/Util/test/WixToolsetTest.Util/TestData/BundleWithSearches/data/MsiPackage/test.txt b/src/ext/Util/test/WixToolsetTest.Util/TestData/BundleWithSearches/data/MsiPackage/test.txt
new file mode 100644
index 00000000..8b986220
--- /dev/null
+++ b/src/ext/Util/test/WixToolsetTest.Util/TestData/BundleWithSearches/data/MsiPackage/test.txt
@@ -0,0 +1 @@
This is test.txt \ No newline at end of file
diff --git a/src/ext/Util/test/WixToolsetTest.Util/TestData/BundleWithSearches/data/fakeba.dll b/src/ext/Util/test/WixToolsetTest.Util/TestData/BundleWithSearches/data/fakeba.dll
new file mode 100644
index 00000000..970efdf0
--- /dev/null
+++ b/src/ext/Util/test/WixToolsetTest.Util/TestData/BundleWithSearches/data/fakeba.dll
@@ -0,0 +1 @@
This is a fakeba.dll \ No newline at end of file
diff --git a/src/ext/Util/test/WixToolsetTest.Util/TestData/BundleWithSearches/data/test.msi b/src/ext/Util/test/WixToolsetTest.Util/TestData/BundleWithSearches/data/test.msi
new file mode 100644
index 00000000..0722d60e
--- /dev/null
+++ b/src/ext/Util/test/WixToolsetTest.Util/TestData/BundleWithSearches/data/test.msi
Binary files differ
diff --git a/src/ext/Util/test/WixToolsetTest.Util/TestData/CloseApplication/Package.en-us.wxl b/src/ext/Util/test/WixToolsetTest.Util/TestData/CloseApplication/Package.en-us.wxl
new file mode 100644
index 00000000..5301bb1a
--- /dev/null
+++ b/src/ext/Util/test/WixToolsetTest.Util/TestData/CloseApplication/Package.en-us.wxl
@@ -0,0 +1,9 @@
1<!--
2This file contains the declaration of all the localizable strings.
3-->
4<WixLocalization xmlns="http://wixtoolset.org/schemas/v4/wxl" Culture="en-US">
5
6 <String Id="DowngradeError">A newer version of [ProductName] is already installed.</String>
7 <String Id="FeatureTitle">MsiPackage</String>
8
9</WixLocalization>
diff --git a/src/ext/Util/test/WixToolsetTest.Util/TestData/CloseApplication/Package.wxs b/src/ext/Util/test/WixToolsetTest.Util/TestData/CloseApplication/Package.wxs
new file mode 100644
index 00000000..8e054256
--- /dev/null
+++ b/src/ext/Util/test/WixToolsetTest.Util/TestData/CloseApplication/Package.wxs
@@ -0,0 +1,17 @@
1<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs" xmlns:util="http://wixtoolset.org/schemas/v4/wxs/util">
2 <Package Name="MsiPackage" Language="1033" Version="1.0.0.0" Manufacturer="Example Corporation" UpgradeCode="047730a5-30fe-4a62-a520-da9381b8226a">
3 <MajorUpgrade DowngradeErrorMessage="!(loc.DowngradeError)" />
4
5 <Feature Id="ProductFeature" Title="!(loc.FeatureTitle)">
6 <ComponentGroupRef Id="ProductComponents" />
7 </Feature>
8
9 <util:CloseApplication Id="CloseMyApp" CloseMessage="yes" Property="MYAPPISRUNNING" Target="explorer.exe" />
10 </Package>
11
12 <Fragment>
13 <StandardDirectory Id="ProgramFilesFolder">
14 <Directory Id="INSTALLFOLDER" Name="MsiPackage" />
15 </StandardDirectory>
16 </Fragment>
17</Wix>
diff --git a/src/ext/Util/test/WixToolsetTest.Util/TestData/CloseApplication/PackageComponents.wxs b/src/ext/Util/test/WixToolsetTest.Util/TestData/CloseApplication/PackageComponents.wxs
new file mode 100644
index 00000000..e27b3c43
--- /dev/null
+++ b/src/ext/Util/test/WixToolsetTest.Util/TestData/CloseApplication/PackageComponents.wxs
@@ -0,0 +1,9 @@
1<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
2 <Fragment>
3 <ComponentGroup Id="ProductComponents" Directory="INSTALLFOLDER">
4 <Component>
5 <File Source="example.txt" />
6 </Component>
7 </ComponentGroup>
8 </Fragment>
9</Wix>
diff --git a/src/ext/Util/test/WixToolsetTest.Util/TestData/CloseApplication/example.txt b/src/ext/Util/test/WixToolsetTest.Util/TestData/CloseApplication/example.txt
new file mode 100644
index 00000000..1b4ffe8a
--- /dev/null
+++ b/src/ext/Util/test/WixToolsetTest.Util/TestData/CloseApplication/example.txt
@@ -0,0 +1 @@
This is example.txt. \ No newline at end of file
diff --git a/src/ext/Util/test/WixToolsetTest.Util/TestData/EventManifest/Package.en-us.wxl b/src/ext/Util/test/WixToolsetTest.Util/TestData/EventManifest/Package.en-us.wxl
new file mode 100644
index 00000000..5301bb1a
--- /dev/null
+++ b/src/ext/Util/test/WixToolsetTest.Util/TestData/EventManifest/Package.en-us.wxl
@@ -0,0 +1,9 @@
1<!--
2This file contains the declaration of all the localizable strings.
3-->
4<WixLocalization xmlns="http://wixtoolset.org/schemas/v4/wxl" Culture="en-US">
5
6 <String Id="DowngradeError">A newer version of [ProductName] is already installed.</String>
7 <String Id="FeatureTitle">MsiPackage</String>
8
9</WixLocalization>
diff --git a/src/ext/Util/test/WixToolsetTest.Util/TestData/EventManifest/Package.wxs b/src/ext/Util/test/WixToolsetTest.Util/TestData/EventManifest/Package.wxs
new file mode 100644
index 00000000..daae573a
--- /dev/null
+++ b/src/ext/Util/test/WixToolsetTest.Util/TestData/EventManifest/Package.wxs
@@ -0,0 +1,15 @@
1<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
2 <Package Name="MsiPackage" Language="1033" Version="1.0.0.0" Manufacturer="Example Corporation" UpgradeCode="047730a5-30fe-4a62-a520-da9381b8226a">
3 <MajorUpgrade DowngradeErrorMessage="!(loc.DowngradeError)" />
4
5 <Feature Id="ProductFeature" Title="!(loc.FeatureTitle)">
6 <ComponentGroupRef Id="ProductComponents" />
7 </Feature>
8 </Package>
9
10 <Fragment>
11 <StandardDirectory Id="ProgramFilesFolder">
12 <Directory Id="INSTALLFOLDER" Name="MsiPackage" />
13 </StandardDirectory>
14 </Fragment>
15</Wix>
diff --git a/src/ext/Util/test/WixToolsetTest.Util/TestData/EventManifest/PackageComponents.wxs b/src/ext/Util/test/WixToolsetTest.Util/TestData/EventManifest/PackageComponents.wxs
new file mode 100644
index 00000000..2ec8ce82
--- /dev/null
+++ b/src/ext/Util/test/WixToolsetTest.Util/TestData/EventManifest/PackageComponents.wxs
@@ -0,0 +1,11 @@
1<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs" xmlns:util="http://wixtoolset.org/schemas/v4/wxs/util">
2 <Fragment>
3 <ComponentGroup Id="ProductComponents" Directory="INSTALLFOLDER">
4 <Component>
5 <File Id="Manifest.dll" Source="example.txt">
6 <util:EventManifest MessageFile="[Manifest.dll]" ResourceFile="[Manifest.dll]" />
7 </File>
8 </Component>
9 </ComponentGroup>
10 </Fragment>
11</Wix>
diff --git a/src/ext/Util/test/WixToolsetTest.Util/TestData/EventManifest/example.txt b/src/ext/Util/test/WixToolsetTest.Util/TestData/EventManifest/example.txt
new file mode 100644
index 00000000..1b4ffe8a
--- /dev/null
+++ b/src/ext/Util/test/WixToolsetTest.Util/TestData/EventManifest/example.txt
@@ -0,0 +1 @@
This is example.txt. \ No newline at end of file
diff --git a/src/ext/Util/test/WixToolsetTest.Util/TestData/InternetShortcut/Package.en-us.wxl b/src/ext/Util/test/WixToolsetTest.Util/TestData/InternetShortcut/Package.en-us.wxl
new file mode 100644
index 00000000..5301bb1a
--- /dev/null
+++ b/src/ext/Util/test/WixToolsetTest.Util/TestData/InternetShortcut/Package.en-us.wxl
@@ -0,0 +1,9 @@
1<!--
2This file contains the declaration of all the localizable strings.
3-->
4<WixLocalization xmlns="http://wixtoolset.org/schemas/v4/wxl" Culture="en-US">
5
6 <String Id="DowngradeError">A newer version of [ProductName] is already installed.</String>
7 <String Id="FeatureTitle">MsiPackage</String>
8
9</WixLocalization>
diff --git a/src/ext/Util/test/WixToolsetTest.Util/TestData/InternetShortcut/Package.ico b/src/ext/Util/test/WixToolsetTest.Util/TestData/InternetShortcut/Package.ico
new file mode 100644
index 00000000..53134de7
--- /dev/null
+++ b/src/ext/Util/test/WixToolsetTest.Util/TestData/InternetShortcut/Package.ico
Binary files differ
diff --git a/src/ext/Util/test/WixToolsetTest.Util/TestData/InternetShortcut/Package.wxs b/src/ext/Util/test/WixToolsetTest.Util/TestData/InternetShortcut/Package.wxs
new file mode 100644
index 00000000..daae573a
--- /dev/null
+++ b/src/ext/Util/test/WixToolsetTest.Util/TestData/InternetShortcut/Package.wxs
@@ -0,0 +1,15 @@
1<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
2 <Package Name="MsiPackage" Language="1033" Version="1.0.0.0" Manufacturer="Example Corporation" UpgradeCode="047730a5-30fe-4a62-a520-da9381b8226a">
3 <MajorUpgrade DowngradeErrorMessage="!(loc.DowngradeError)" />
4
5 <Feature Id="ProductFeature" Title="!(loc.FeatureTitle)">
6 <ComponentGroupRef Id="ProductComponents" />
7 </Feature>
8 </Package>
9
10 <Fragment>
11 <StandardDirectory Id="ProgramFilesFolder">
12 <Directory Id="INSTALLFOLDER" Name="MsiPackage" />
13 </StandardDirectory>
14 </Fragment>
15</Wix>
diff --git a/src/ext/Util/test/WixToolsetTest.Util/TestData/InternetShortcut/PackageComponents.wxs b/src/ext/Util/test/WixToolsetTest.Util/TestData/InternetShortcut/PackageComponents.wxs
new file mode 100644
index 00000000..2a1b4347
--- /dev/null
+++ b/src/ext/Util/test/WixToolsetTest.Util/TestData/InternetShortcut/PackageComponents.wxs
@@ -0,0 +1,11 @@
1<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs" xmlns:util="http://wixtoolset.org/schemas/v4/wxs/util">
2 <Fragment>
3 <ComponentGroup Id="ProductComponents" Directory="INSTALLFOLDER">
4 <Component>
5 <File Id="Package.ico" Source="Package.ico" />
6 <util:InternetShortcut Type="link" Name="WiX Toolset (link)" Target="https://wixtoolset.org" IconFile="[#Package.ico]" />
7 <util:InternetShortcut Type="url" Name="WiX Toolset (url)" Target="https://wixtoolset.org" IconFile="[#Package.ico]" />
8 </Component>
9 </ComponentGroup>
10 </Fragment>
11</Wix>
diff --git a/src/ext/Util/test/WixToolsetTest.Util/TestData/InternetShortcut/example.txt b/src/ext/Util/test/WixToolsetTest.Util/TestData/InternetShortcut/example.txt
new file mode 100644
index 00000000..1b4ffe8a
--- /dev/null
+++ b/src/ext/Util/test/WixToolsetTest.Util/TestData/InternetShortcut/example.txt
@@ -0,0 +1 @@
This is example.txt. \ No newline at end of file
diff --git a/src/ext/Util/test/WixToolsetTest.Util/TestData/InternetShortcutModule/Module.wxs b/src/ext/Util/test/WixToolsetTest.Util/TestData/InternetShortcutModule/Module.wxs
new file mode 100644
index 00000000..1355d42e
--- /dev/null
+++ b/src/ext/Util/test/WixToolsetTest.Util/TestData/InternetShortcutModule/Module.wxs
@@ -0,0 +1,13 @@
1<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
2 <Module Language="1033" Version="1.0.0.0" Id="InternetShortcutModule" Guid="047730a5-30fe-4a62-a520-da9381b8226a">
3 <SummaryInformation Manufacturer="Example Corporation" />
4
5 <ComponentGroupRef Id="ProductComponents" />
6 </Module>
7
8 <Fragment>
9 <StandardDirectory Id="ProgramFilesFolder">
10 <Directory Id="INSTALLFOLDER" Name="MergeModule" />
11 </StandardDirectory>
12 </Fragment>
13</Wix>
diff --git a/src/ext/Util/test/WixToolsetTest.Util/TestData/InternetShortcutModule/ModuleComponents.wxs b/src/ext/Util/test/WixToolsetTest.Util/TestData/InternetShortcutModule/ModuleComponents.wxs
new file mode 100644
index 00000000..2a1b4347
--- /dev/null
+++ b/src/ext/Util/test/WixToolsetTest.Util/TestData/InternetShortcutModule/ModuleComponents.wxs
@@ -0,0 +1,11 @@
1<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs" xmlns:util="http://wixtoolset.org/schemas/v4/wxs/util">
2 <Fragment>
3 <ComponentGroup Id="ProductComponents" Directory="INSTALLFOLDER">
4 <Component>
5 <File Id="Package.ico" Source="Package.ico" />
6 <util:InternetShortcut Type="link" Name="WiX Toolset (link)" Target="https://wixtoolset.org" IconFile="[#Package.ico]" />
7 <util:InternetShortcut Type="url" Name="WiX Toolset (url)" Target="https://wixtoolset.org" IconFile="[#Package.ico]" />
8 </Component>
9 </ComponentGroup>
10 </Fragment>
11</Wix>
diff --git a/src/ext/Util/test/WixToolsetTest.Util/TestData/InternetShortcutModule/Package.ico b/src/ext/Util/test/WixToolsetTest.Util/TestData/InternetShortcutModule/Package.ico
new file mode 100644
index 00000000..53134de7
--- /dev/null
+++ b/src/ext/Util/test/WixToolsetTest.Util/TestData/InternetShortcutModule/Package.ico
Binary files differ
diff --git a/src/ext/Util/test/WixToolsetTest.Util/TestData/PermissionEx/Package.en-us.wxl b/src/ext/Util/test/WixToolsetTest.Util/TestData/PermissionEx/Package.en-us.wxl
new file mode 100644
index 00000000..5301bb1a
--- /dev/null
+++ b/src/ext/Util/test/WixToolsetTest.Util/TestData/PermissionEx/Package.en-us.wxl
@@ -0,0 +1,9 @@
1<!--
2This file contains the declaration of all the localizable strings.
3-->
4<WixLocalization xmlns="http://wixtoolset.org/schemas/v4/wxl" Culture="en-US">
5
6 <String Id="DowngradeError">A newer version of [ProductName] is already installed.</String>
7 <String Id="FeatureTitle">MsiPackage</String>
8
9</WixLocalization>
diff --git a/src/ext/Util/test/WixToolsetTest.Util/TestData/PermissionEx/Package.wxs b/src/ext/Util/test/WixToolsetTest.Util/TestData/PermissionEx/Package.wxs
new file mode 100644
index 00000000..daae573a
--- /dev/null
+++ b/src/ext/Util/test/WixToolsetTest.Util/TestData/PermissionEx/Package.wxs
@@ -0,0 +1,15 @@
1<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
2 <Package Name="MsiPackage" Language="1033" Version="1.0.0.0" Manufacturer="Example Corporation" UpgradeCode="047730a5-30fe-4a62-a520-da9381b8226a">
3 <MajorUpgrade DowngradeErrorMessage="!(loc.DowngradeError)" />
4
5 <Feature Id="ProductFeature" Title="!(loc.FeatureTitle)">
6 <ComponentGroupRef Id="ProductComponents" />
7 </Feature>
8 </Package>
9
10 <Fragment>
11 <StandardDirectory Id="ProgramFilesFolder">
12 <Directory Id="INSTALLFOLDER" Name="MsiPackage" />
13 </StandardDirectory>
14 </Fragment>
15</Wix>
diff --git a/src/ext/Util/test/WixToolsetTest.Util/TestData/PermissionEx/PackageComponents.wxs b/src/ext/Util/test/WixToolsetTest.Util/TestData/PermissionEx/PackageComponents.wxs
new file mode 100644
index 00000000..0634d7d4
--- /dev/null
+++ b/src/ext/Util/test/WixToolsetTest.Util/TestData/PermissionEx/PackageComponents.wxs
@@ -0,0 +1,23 @@
1<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs" xmlns:util="http://wixtoolset.org/schemas/v4/wxs/util">
2 <Fragment>
3 <ComponentGroup Id="ProductComponents" Directory="INSTALLFOLDER">
4 <Component>
5 <File Source="example.txt">
6 <util:PermissionEx User="Everyone" GenericAll="yes" />
7 </File>
8 <CreateFolder>
9 <util:PermissionEx User="Everyone" GenericAll="yes" />
10 </CreateFolder>
11 <ServiceInstall Name="testsvc" Type="ownProcess" Start="disabled" ErrorControl="normal">
12 <util:PermissionEx User="Everyone" GenericAll="yes" />
13 </ServiceInstall>
14 <RegistryKey Id="ExampleRegistryKey" ForceCreateOnInstall="yes" Root="HKLM" Key="TestRegistryKey">
15 <util:PermissionEx User="Everyone" GenericAll="yes" />
16 </RegistryKey>
17 <RegistryValue Root="HKLM" Key="TestRegistryValueKey" Value="abc">
18 <util:PermissionEx User="Everyone" GenericAll="yes" />
19 </RegistryValue>
20 </Component>
21 </ComponentGroup>
22 </Fragment>
23</Wix>
diff --git a/src/ext/Util/test/WixToolsetTest.Util/TestData/PermissionEx/example.txt b/src/ext/Util/test/WixToolsetTest.Util/TestData/PermissionEx/example.txt
new file mode 100644
index 00000000..1b4ffe8a
--- /dev/null
+++ b/src/ext/Util/test/WixToolsetTest.Util/TestData/PermissionEx/example.txt
@@ -0,0 +1 @@
This is example.txt. \ No newline at end of file
diff --git a/src/ext/Util/test/WixToolsetTest.Util/TestData/Queries/Package.en-us.wxl b/src/ext/Util/test/WixToolsetTest.Util/TestData/Queries/Package.en-us.wxl
new file mode 100644
index 00000000..5301bb1a
--- /dev/null
+++ b/src/ext/Util/test/WixToolsetTest.Util/TestData/Queries/Package.en-us.wxl
@@ -0,0 +1,9 @@
1<!--
2This file contains the declaration of all the localizable strings.
3-->
4<WixLocalization xmlns="http://wixtoolset.org/schemas/v4/wxl" Culture="en-US">
5
6 <String Id="DowngradeError">A newer version of [ProductName] is already installed.</String>
7 <String Id="FeatureTitle">MsiPackage</String>
8
9</WixLocalization>
diff --git a/src/ext/Util/test/WixToolsetTest.Util/TestData/Queries/Package.wxs b/src/ext/Util/test/WixToolsetTest.Util/TestData/Queries/Package.wxs
new file mode 100644
index 00000000..abf0dbb4
--- /dev/null
+++ b/src/ext/Util/test/WixToolsetTest.Util/TestData/Queries/Package.wxs
@@ -0,0 +1,23 @@
1<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs" xmlns:util="http://wixtoolset.org/schemas/v4/wxs/util">
2 <Package Name="MsiPackage" Language="1033" Version="1.0.0.0" Manufacturer="Example Corporation" UpgradeCode="047730a5-30fe-4a62-a520-da9381b8226a">
3 <MajorUpgrade DowngradeErrorMessage="!(loc.DowngradeError)" />
4
5 <util:BroadcastEnvironmentChange />
6 <util:CheckRebootRequired />
7 <util:QueryWindowsDriverInfo />
8 <util:QueryWindowsSuiteInfo />
9
10 <Feature Id="ProductFeature" Title="!(loc.FeatureTitle)">
11 <ComponentGroupRef Id="ProductComponents" />
12 </Feature>
13 </Package>
14
15 <Fragment><util:BroadcastSettingChange />
16
17
18
19 <StandardDirectory Id="ProgramFilesFolder">
20 <Directory Id="INSTALLFOLDER" Name="MsiPackage" />
21 </StandardDirectory>
22 </Fragment>
23</Wix>
diff --git a/src/ext/Util/test/WixToolsetTest.Util/TestData/Queries/PackageComponents.wxs b/src/ext/Util/test/WixToolsetTest.Util/TestData/Queries/PackageComponents.wxs
new file mode 100644
index 00000000..e27b3c43
--- /dev/null
+++ b/src/ext/Util/test/WixToolsetTest.Util/TestData/Queries/PackageComponents.wxs
@@ -0,0 +1,9 @@
1<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
2 <Fragment>
3 <ComponentGroup Id="ProductComponents" Directory="INSTALLFOLDER">
4 <Component>
5 <File Source="example.txt" />
6 </Component>
7 </ComponentGroup>
8 </Fragment>
9</Wix>
diff --git a/src/ext/Util/test/WixToolsetTest.Util/TestData/Queries/example.txt b/src/ext/Util/test/WixToolsetTest.Util/TestData/Queries/example.txt
new file mode 100644
index 00000000..1b4ffe8a
--- /dev/null
+++ b/src/ext/Util/test/WixToolsetTest.Util/TestData/Queries/example.txt
@@ -0,0 +1 @@
This is example.txt. \ No newline at end of file
diff --git a/src/ext/Util/test/WixToolsetTest.Util/TestData/RemoveFolderEx/Module.wxs b/src/ext/Util/test/WixToolsetTest.Util/TestData/RemoveFolderEx/Module.wxs
new file mode 100644
index 00000000..2c2be584
--- /dev/null
+++ b/src/ext/Util/test/WixToolsetTest.Util/TestData/RemoveFolderEx/Module.wxs
@@ -0,0 +1,13 @@
1<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
2 <Module Language="1033" Version="1.0.0.0" Id="InternetShortcutModule" Guid="047730a5-30fe-4a62-a520-da9381b8226a">
3 <SummaryInformation Manufacturer="Example Corporation" />
4
5 <ComponentGroupRef Id="ModuleComponents" />
6 </Module>
7
8 <Fragment>
9 <StandardDirectory Id="ProgramFilesFolder">
10 <Directory Id="INSTALLFOLDER" Name="MergeModule" />
11 </StandardDirectory>
12 </Fragment>
13</Wix>
diff --git a/src/ext/Util/test/WixToolsetTest.Util/TestData/RemoveFolderEx/ModuleComponents.wxs b/src/ext/Util/test/WixToolsetTest.Util/TestData/RemoveFolderEx/ModuleComponents.wxs
new file mode 100644
index 00000000..236d9df0
--- /dev/null
+++ b/src/ext/Util/test/WixToolsetTest.Util/TestData/RemoveFolderEx/ModuleComponents.wxs
@@ -0,0 +1,10 @@
1<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs" xmlns:util="http://wixtoolset.org/schemas/v4/wxs/util">
2 <Fragment>
3 <ComponentGroup Id="ModuleComponents" Directory="INSTALLFOLDER">
4 <Component>
5 <File Source="ModuleComponents.wxs" />
6 <util:RemoveFolderEx On="both" Property="RemoveProp" />
7 </Component>
8 </ComponentGroup>
9 </Fragment>
10</Wix>
diff --git a/src/ext/Util/test/WixToolsetTest.Util/TestData/RemoveRegistryKeyEx/Module.wxs b/src/ext/Util/test/WixToolsetTest.Util/TestData/RemoveRegistryKeyEx/Module.wxs
new file mode 100644
index 00000000..32b246f4
--- /dev/null
+++ b/src/ext/Util/test/WixToolsetTest.Util/TestData/RemoveRegistryKeyEx/Module.wxs
@@ -0,0 +1,13 @@
1<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
2 <Module Language="1033" Version="1.0.0.0" Id="InternetShortcutModule" Guid="047730a5-30fe-4a62-a520-da9381b8226a">
3 <SummaryInformation Manufacturer="Example Corporation" />
4
5 <ComponentGroupRef Id="ModuleComponents" />
6 </Module>
7
8 <Fragment>
9 <StandardDirectory Id="ProgramFilesFolder">
10 <Directory Id="INSTALLFOLDER" Name="MergeModule" />
11 </StandardDirectory>
12 </Fragment>
13</Wix>
diff --git a/src/ext/Util/test/WixToolsetTest.Util/TestData/RemoveRegistryKeyEx/ModuleComponents.wxs b/src/ext/Util/test/WixToolsetTest.Util/TestData/RemoveRegistryKeyEx/ModuleComponents.wxs
new file mode 100644
index 00000000..0a0c8cb6
--- /dev/null
+++ b/src/ext/Util/test/WixToolsetTest.Util/TestData/RemoveRegistryKeyEx/ModuleComponents.wxs
@@ -0,0 +1,10 @@
1<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs" xmlns:util="http://wixtoolset.org/schemas/v4/wxs/util">
2 <Fragment>
3 <ComponentGroup Id="ModuleComponents" Directory="INSTALLFOLDER">
4 <Component>
5 <File Source="ModuleComponents.wxs" />
6 <util:RemoveRegistryKey Root="HKLM" Key="SOFTWARE\Example" On="install" />
7 </Component>
8 </ComponentGroup>
9 </Fragment>
10</Wix>
diff --git a/src/ext/Util/test/WixToolsetTest.Util/TestData/UsingFileShare/Package.en-us.wxl b/src/ext/Util/test/WixToolsetTest.Util/TestData/UsingFileShare/Package.en-us.wxl
new file mode 100644
index 00000000..5301bb1a
--- /dev/null
+++ b/src/ext/Util/test/WixToolsetTest.Util/TestData/UsingFileShare/Package.en-us.wxl
@@ -0,0 +1,9 @@
1<!--
2This file contains the declaration of all the localizable strings.
3-->
4<WixLocalization xmlns="http://wixtoolset.org/schemas/v4/wxl" Culture="en-US">
5
6 <String Id="DowngradeError">A newer version of [ProductName] is already installed.</String>
7 <String Id="FeatureTitle">MsiPackage</String>
8
9</WixLocalization>
diff --git a/src/ext/Util/test/WixToolsetTest.Util/TestData/UsingFileShare/Package.wxs b/src/ext/Util/test/WixToolsetTest.Util/TestData/UsingFileShare/Package.wxs
new file mode 100644
index 00000000..daae573a
--- /dev/null
+++ b/src/ext/Util/test/WixToolsetTest.Util/TestData/UsingFileShare/Package.wxs
@@ -0,0 +1,15 @@
1<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
2 <Package Name="MsiPackage" Language="1033" Version="1.0.0.0" Manufacturer="Example Corporation" UpgradeCode="047730a5-30fe-4a62-a520-da9381b8226a">
3 <MajorUpgrade DowngradeErrorMessage="!(loc.DowngradeError)" />
4
5 <Feature Id="ProductFeature" Title="!(loc.FeatureTitle)">
6 <ComponentGroupRef Id="ProductComponents" />
7 </Feature>
8 </Package>
9
10 <Fragment>
11 <StandardDirectory Id="ProgramFilesFolder">
12 <Directory Id="INSTALLFOLDER" Name="MsiPackage" />
13 </StandardDirectory>
14 </Fragment>
15</Wix>
diff --git a/src/ext/Util/test/WixToolsetTest.Util/TestData/UsingFileShare/PackageComponents.wxs b/src/ext/Util/test/WixToolsetTest.Util/TestData/UsingFileShare/PackageComponents.wxs
new file mode 100644
index 00000000..7cedbb30
--- /dev/null
+++ b/src/ext/Util/test/WixToolsetTest.Util/TestData/UsingFileShare/PackageComponents.wxs
@@ -0,0 +1,14 @@
1<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs" xmlns:util="http://wixtoolset.org/schemas/v4/wxs/util">
2 <Fragment>
3 <util:User Id="Everyone" Name="Everyone" />
4
5 <ComponentGroup Id="ProductComponents" Directory="INSTALLFOLDER">
6 <Component>
7 <File Source="example.txt" />
8 <util:FileShare Id="ExampleFileShare" Description="An example file share" Name="example">
9 <util:FileSharePermission User="Everyone" Read="yes" />
10 </util:FileShare>
11 </Component>
12 </ComponentGroup>
13 </Fragment>
14</Wix>
diff --git a/src/ext/Util/test/WixToolsetTest.Util/TestData/UsingFileShare/example.txt b/src/ext/Util/test/WixToolsetTest.Util/TestData/UsingFileShare/example.txt
new file mode 100644
index 00000000..1b4ffe8a
--- /dev/null
+++ b/src/ext/Util/test/WixToolsetTest.Util/TestData/UsingFileShare/example.txt
@@ -0,0 +1 @@
This is example.txt. \ No newline at end of file
diff --git a/src/ext/Util/test/WixToolsetTest.Util/TestData/XmlConfig/Package.en-us.wxl b/src/ext/Util/test/WixToolsetTest.Util/TestData/XmlConfig/Package.en-us.wxl
new file mode 100644
index 00000000..5301bb1a
--- /dev/null
+++ b/src/ext/Util/test/WixToolsetTest.Util/TestData/XmlConfig/Package.en-us.wxl
@@ -0,0 +1,9 @@
1<!--
2This file contains the declaration of all the localizable strings.
3-->
4<WixLocalization xmlns="http://wixtoolset.org/schemas/v4/wxl" Culture="en-US">
5
6 <String Id="DowngradeError">A newer version of [ProductName] is already installed.</String>
7 <String Id="FeatureTitle">MsiPackage</String>
8
9</WixLocalization>
diff --git a/src/ext/Util/test/WixToolsetTest.Util/TestData/XmlConfig/Package.wxs b/src/ext/Util/test/WixToolsetTest.Util/TestData/XmlConfig/Package.wxs
new file mode 100644
index 00000000..a2002634
--- /dev/null
+++ b/src/ext/Util/test/WixToolsetTest.Util/TestData/XmlConfig/Package.wxs
@@ -0,0 +1,17 @@
1<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs" xmlns:util="http://wixtoolset.org/schemas/v4/wxs/util">
2 <Package Name="MsiPackage" Language="1033" Version="1.0.0.0" Manufacturer="Example Corporation" UpgradeCode="047730a5-30fe-4a62-a520-da9381b8226a">
3 <MajorUpgrade DowngradeErrorMessage="!(loc.DowngradeError)" />
4
5 <Feature Id="ProductFeature" Title="!(loc.FeatureTitle)">
6 <Component Id="Del" Directory="INSTALLFOLDER" Guid="3613414c-11f5-40fa-a1f1-a0ba722a6895">
7 <util:XmlConfig Id="DelElement" File="[INSTALLFOLDER]my.xml" Action="delete" Node="element" VerifyPath="xxx" ElementPath="//root/sub" On="install" Sequence="1" />
8 </Component>
9 </Feature>
10 </Package>
11
12 <Fragment>
13 <StandardDirectory Id="ProgramFilesFolder">
14 <Directory Id="INSTALLFOLDER" Name="MsiPackage" />
15 </StandardDirectory>
16 </Fragment>
17</Wix>
diff --git a/src/ext/Util/test/WixToolsetTest.Util/TestData/XmlConfigModule/Module.wxs b/src/ext/Util/test/WixToolsetTest.Util/TestData/XmlConfigModule/Module.wxs
new file mode 100644
index 00000000..29e8555b
--- /dev/null
+++ b/src/ext/Util/test/WixToolsetTest.Util/TestData/XmlConfigModule/Module.wxs
@@ -0,0 +1,19 @@
1<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs" xmlns:util="http://wixtoolset.org/schemas/v4/wxs/util">
2 <Module Id="XmlConfigModule" Language="1033" Version="1.0.0.0" Guid="047730a5-30fe-4a62-a520-da9381b8226a">
3
4 <Component Id="Parent" Directory="INSTALLFOLDER">
5 <File Id="my.xml" Source="my.xml" />
6 <util:XmlConfig Id="AddElement" File="[my.xml]" Action="create" Node="element" VerifyPath="xxx" ElementPath="//root/sub" On="install" Sequence="1" />
7 </Component>
8
9 <Component Id="Child" Directory="INSTALLFOLDER" Guid="4613414c-11f5-40fa-a1f1-a0ba722a6895">
10 <util:XmlConfig Id="ChildElement" File="[my.xml]" VerifyPath="xxx" ElementId="AddElement" Sequence="1" />
11 </Component>
12 </Module>
13
14 <Fragment>
15 <StandardDirectory Id="ProgramFilesFolder">
16 <Directory Id="INSTALLFOLDER" Name="MsiPackage" />
17 </StandardDirectory>
18 </Fragment>
19</Wix>
diff --git a/src/ext/Util/test/WixToolsetTest.Util/TestData/XmlConfigModule/my.xml b/src/ext/Util/test/WixToolsetTest.Util/TestData/XmlConfigModule/my.xml
new file mode 100644
index 00000000..bad25217
--- /dev/null
+++ b/src/ext/Util/test/WixToolsetTest.Util/TestData/XmlConfigModule/my.xml
@@ -0,0 +1 @@
This is my.xml file.
diff --git a/src/ext/Util/test/WixToolsetTest.Util/UtilExtensionFixture.cs b/src/ext/Util/test/WixToolsetTest.Util/UtilExtensionFixture.cs
new file mode 100644
index 00000000..883f9794
--- /dev/null
+++ b/src/ext/Util/test/WixToolsetTest.Util/UtilExtensionFixture.cs
@@ -0,0 +1,317 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolsetTest.Util
4{
5 using System.IO;
6 using System.Linq;
7 using WixBuildTools.TestSupport;
8 using WixToolset.Core.TestPackage;
9 using WixToolset.Data;
10 using WixToolset.Data.Symbols;
11 using WixToolset.Util;
12 using Xunit;
13
14 public class UtilExtensionFixture
15 {
16 [Fact]
17 public void CanBuildUsingFileShare()
18 {
19 var folder = TestData.Get(@"TestData\UsingFileShare");
20 var build = new Builder(folder, typeof(UtilExtensionFactory), new[] { folder });
21
22 var results = build.BuildAndQuery(Build, "Binary", "CustomAction", "Wix4FileShare", "Wix4FileSharePermissions");
23 WixAssert.CompareLineByLine(new[]
24 {
25 "Binary:Wix4UtilCA_X86\t[Binary data]",
26 "CustomAction:Wix4ConfigureSmbInstall_X86\t1\tWix4UtilCA_X86\tConfigureSmbInstall\t",
27 "CustomAction:Wix4ConfigureSmbUninstall_X86\t1\tWix4UtilCA_X86\tConfigureSmbUninstall\t",
28 "CustomAction:Wix4CreateSmb_X86\t11265\tWix4UtilCA_X86\tCreateSmb\t",
29 "CustomAction:Wix4CreateSmbRollback_X86\t11585\tWix4UtilCA_X86\tDropSmb\t",
30 "CustomAction:Wix4DropSmb_X86\t11265\tWix4UtilCA_X86\tDropSmb\t",
31 "CustomAction:Wix4DropSmbRollback_X86\t11585\tWix4UtilCA_X86\tCreateSmb\t",
32 "Wix4FileShare:ExampleFileShare\texample\tfilF5_pLhBuF5b4N9XEo52g_hUM5Lo\tAn example file share\tINSTALLFOLDER",
33 "Wix4FileSharePermissions:ExampleFileShare\tEveryone\t1",
34 }, results.OrderBy(s => s).ToArray());
35 }
36
37 [Fact]
38 public void CanBuildUsingFileShareX64()
39 {
40 var folder = TestData.Get(@"TestData\UsingFileShare");
41 var build = new Builder(folder, typeof(UtilExtensionFactory), new[] { folder });
42
43 var results = build.BuildAndQuery(BuildX64, "Binary", "CustomAction", "Wix4FileShare", "Wix4FileSharePermissions");
44 WixAssert.CompareLineByLine(new[]
45 {
46 "Binary:Wix4UtilCA_X64\t[Binary data]",
47 "CustomAction:Wix4ConfigureSmbInstall_X64\t1\tWix4UtilCA_X64\tConfigureSmbInstall\t",
48 "CustomAction:Wix4ConfigureSmbUninstall_X64\t1\tWix4UtilCA_X64\tConfigureSmbUninstall\t",
49 "CustomAction:Wix4CreateSmb_X64\t11265\tWix4UtilCA_X64\tCreateSmb\t",
50 "CustomAction:Wix4CreateSmbRollback_X64\t11585\tWix4UtilCA_X64\tDropSmb\t",
51 "CustomAction:Wix4DropSmb_X64\t11265\tWix4UtilCA_X64\tDropSmb\t",
52 "CustomAction:Wix4DropSmbRollback_X64\t11585\tWix4UtilCA_X64\tCreateSmb\t",
53 "Wix4FileShare:ExampleFileShare\texample\tfilF5_pLhBuF5b4N9XEo52g_hUM5Lo\tAn example file share\tINSTALLFOLDER",
54 "Wix4FileSharePermissions:ExampleFileShare\tEveryone\t1",
55 }, results.OrderBy(s => s).ToArray());
56 }
57
58 [Fact]
59 public void CanBuildCloseApplication()
60 {
61 var folder = TestData.Get(@"TestData\CloseApplication");
62 var build = new Builder(folder, typeof(UtilExtensionFactory), new[] { folder });
63
64 var results = build.BuildAndQuery(BuildARM64, "Binary", "CustomAction", "Wix4CloseApplication");
65 WixAssert.CompareLineByLine(new[]
66 {
67 "Binary:Wix4UtilCA_A64\t[Binary data]",
68 "CustomAction:Wix4CheckRebootRequired_A64\t65\tWix4UtilCA_A64\tWixCheckRebootRequired\t",
69 "CustomAction:Wix4CloseApplications_A64\t1\tWix4UtilCA_A64\tWixCloseApplications\t",
70 "CustomAction:Wix4CloseApplicationsDeferred_A64\t3073\tWix4UtilCA_A64\tWixCloseApplicationsDeferred\t",
71 "Wix4CloseApplication:CloseMyApp\texplorer.exe\t\t\t3\t\tMYAPPISRUNNING\t\t",
72 }, results.OrderBy(s => s).ToArray());
73 }
74
75 [Fact]
76 public void CanBuildInternetShortcutInProduct()
77 {
78 var folder = TestData.Get(@"TestData\InternetShortcut");
79 var build = new Builder(folder, typeof(UtilExtensionFactory), new[] { folder });
80
81 var results = build.BuildAndQuery(BuildX64, "Binary", "CustomAction", "RemoveFile", "Wix4InternetShortcut");
82 WixAssert.CompareLineByLine(new[]
83 {
84 "Binary:Wix4UtilCA_X64\t[Binary data]",
85 "CustomAction:Wix4CreateInternetShortcuts_X64\t3073\tWix4UtilCA_X64\tWixCreateInternetShortcuts\t",
86 "CustomAction:Wix4RollbackInternetShortcuts_X64\t3329\tWix4UtilCA_X64\tWixRollbackInternetShortcuts\t",
87 "CustomAction:Wix4SchedInternetShortcuts_X64\t1\tWix4UtilCA_X64\tWixSchedInternetShortcuts\t",
88 "RemoveFile:uisdCsU32.1i4Hebrg1N7E194zJQ8Y\tPackage.ico\thoiptxrr.url|WiX Toolset (url).url\tINSTALLFOLDER\t2",
89 "RemoveFile:uisjV.q0ROZZYR3h_lkpbkZtLtPH0A\tPackage.ico\tjcxd1dwf.lnk|WiX Toolset (link).lnk\tINSTALLFOLDER\t2",
90 "Wix4InternetShortcut:uisdCsU32.1i4Hebrg1N7E194zJQ8Y\tPackage.ico\tINSTALLFOLDER\tWiX Toolset (url).url\thttps://wixtoolset.org\t1\t[#Package.ico]\t0",
91 "Wix4InternetShortcut:uisjV.q0ROZZYR3h_lkpbkZtLtPH0A\tPackage.ico\tINSTALLFOLDER\tWiX Toolset (link).lnk\thttps://wixtoolset.org\t0\t[#Package.ico]\t0",
92 }, results.OrderBy(s => s).ToArray());
93 }
94
95 [Fact]
96 public void CanBuildInternetShortcutInMergeModule()
97 {
98 var folder = TestData.Get(@"TestData\InternetShortcutModule");
99 var build = new Builder(folder, typeof(UtilExtensionFactory), new[] { folder }, "test.msm");
100
101 var results = build.BuildAndQuery(BuildX64, "Binary", "CustomAction", "RemoveFile", "Wix4InternetShortcut");
102 WixAssert.CompareLineByLine(new[]
103 {
104 "Binary:Wix4UtilCA_X64.047730A5_30FE_4A62_A520_DA9381B8226A\t[Binary data]",
105 "CustomAction:Wix4CreateInternetShortcuts_X64\t3073\tWix4UtilCA_X64.047730A5_30FE_4A62_A520_DA9381B8226A\tWixCreateInternetShortcuts\t",
106 "CustomAction:Wix4RollbackInternetShortcuts_X64\t3329\tWix4UtilCA_X64.047730A5_30FE_4A62_A520_DA9381B8226A\tWixRollbackInternetShortcuts\t",
107 "CustomAction:Wix4SchedInternetShortcuts_X64\t1\tWix4UtilCA_X64.047730A5_30FE_4A62_A520_DA9381B8226A\tWixSchedInternetShortcuts\t",
108 "RemoveFile:uisdCsU32.1i4Hebrg1N7E194zJQ8Y.047730A5_30FE_4A62_A520_DA9381B8226A\tPackage.ico.047730A5_30FE_4A62_A520_DA9381B8226A\thoiptxrr.url|WiX Toolset (url).url\tINSTALLFOLDER.047730A5_30FE_4A62_A520_DA9381B8226A\t2",
109 "RemoveFile:uisjV.q0ROZZYR3h_lkpbkZtLtPH0A.047730A5_30FE_4A62_A520_DA9381B8226A\tPackage.ico.047730A5_30FE_4A62_A520_DA9381B8226A\tjcxd1dwf.lnk|WiX Toolset (link).lnk\tINSTALLFOLDER.047730A5_30FE_4A62_A520_DA9381B8226A\t2",
110 "Wix4InternetShortcut:uisdCsU32.1i4Hebrg1N7E194zJQ8Y.047730A5_30FE_4A62_A520_DA9381B8226A\tPackage.ico.047730A5_30FE_4A62_A520_DA9381B8226A\tINSTALLFOLDER.047730A5_30FE_4A62_A520_DA9381B8226A\tWiX Toolset (url).url\thttps://wixtoolset.org\t1\t[#Package.ico.047730A5_30FE_4A62_A520_DA9381B8226A]\t0",
111 "Wix4InternetShortcut:uisjV.q0ROZZYR3h_lkpbkZtLtPH0A.047730A5_30FE_4A62_A520_DA9381B8226A\tPackage.ico.047730A5_30FE_4A62_A520_DA9381B8226A\tINSTALLFOLDER.047730A5_30FE_4A62_A520_DA9381B8226A\tWiX Toolset (link).lnk\thttps://wixtoolset.org\t0\t[#Package.ico.047730A5_30FE_4A62_A520_DA9381B8226A]\t0",
112 }, results.OrderBy(s => s).ToArray());
113 }
114
115 [Fact]
116 public void CanBuildWithPermissionEx()
117 {
118 var folder = TestData.Get(@"TestData\PermissionEx");
119 var build = new Builder(folder, typeof(UtilExtensionFactory), new[] { folder });
120
121 var results = build.BuildAndQuery(BuildX64, "Wix4SecureObject");
122 WixAssert.CompareLineByLine(new[]
123 {
124 "Wix4SecureObject:ExampleRegistryKey\tRegistry\t\tEveryone\t1\t268435456\tfilF5_pLhBuF5b4N9XEo52g_hUM5Lo",
125 "Wix4SecureObject:filF5_pLhBuF5b4N9XEo52g_hUM5Lo\tFile\t\tEveryone\t1\t268435456\tfilF5_pLhBuF5b4N9XEo52g_hUM5Lo",
126 "Wix4SecureObject:INSTALLFOLDER\tCreateFolder\t\tEveryone\t1\t268435456\tfilF5_pLhBuF5b4N9XEo52g_hUM5Lo",
127 "Wix4SecureObject:regL6DnQ9yJpDJH5OdcVji4YXsdX2c\tRegistry\t\tEveryone\t1\t268435456\tfilF5_pLhBuF5b4N9XEo52g_hUM5Lo",
128 "Wix4SecureObject:testsvc\tServiceInstall\t\tEveryone\t1\t268435456\tfilF5_pLhBuF5b4N9XEo52g_hUM5Lo",
129 }, results.OrderBy(s => s).ToArray());
130 }
131
132 [Fact]
133 public void CanBuildRemoveRegistryKeyExInMergeModule()
134 {
135 var folder = TestData.Get(@"TestData", "RemoveRegistryKeyEx");
136 var build = new Builder(folder, typeof(UtilExtensionFactory), new[] { folder }, "test.msm");
137
138 var results = build.BuildAndQuery(BuildX64, "Binary", "CustomAction", "RemoveRegistry", "Wix4RemoveRegistryKeyEx");
139 WixAssert.CompareLineByLine(new[]
140 {
141 "Binary:Wix4UtilCA_X64.047730A5_30FE_4A62_A520_DA9381B8226A\t[Binary data]",
142 "CustomAction:Wix4RemoveRegistryKeysEx_X64.047730A5_30FE_4A62_A520_DA9381B8226A\t65\tWix4UtilCA_X64.047730A5_30FE_4A62_A520_DA9381B8226A\tWixRemoveRegistryKeysEx\t",
143 "Wix4RemoveRegistryKeyEx:rrxfcDhR4HhE3v3rYiQcNtQjyahQNg.047730A5_30FE_4A62_A520_DA9381B8226A\tfilh4juyUVjoUcWWtcQmd5L07FoON4.047730A5_30FE_4A62_A520_DA9381B8226A\t2\tSOFTWARE\\Example\t1\t",
144 }, results.OrderBy(s => s).ToArray());
145 }
146
147 [Fact]
148 public void CanBuildRemoveFolderExInMergeModule()
149 {
150 var folder = TestData.Get(@"TestData\RemoveFolderEx");
151 var build = new Builder(folder, typeof(UtilExtensionFactory), new[] { folder }, "test.msm");
152
153 var results = build.BuildAndQuery(BuildX64, "Binary", "CustomAction", "RemoveFile", "Wix4RemoveFolderEx");
154 WixAssert.CompareLineByLine(new[]
155 {
156 "Binary:Wix4UtilCA_X64.047730A5_30FE_4A62_A520_DA9381B8226A\t[Binary data]",
157 "CustomAction:Wix4RemoveFoldersEx_X64.047730A5_30FE_4A62_A520_DA9381B8226A\t65\tWix4UtilCA_X64.047730A5_30FE_4A62_A520_DA9381B8226A\tWixRemoveFoldersEx\t",
158 "Wix4RemoveFolderEx:wrf5qCm1SE.zp8djrlk78l1IYFXsEw.047730A5_30FE_4A62_A520_DA9381B8226A\tfilh4juyUVjoUcWWtcQmd5L07FoON4.047730A5_30FE_4A62_A520_DA9381B8226A\tRemoveProp.047730A5_30FE_4A62_A520_DA9381B8226A\t3\t",
159 }, results.OrderBy(s => s).ToArray());
160 }
161
162 [Fact]
163 public void CanBuildWithEventManifest()
164 {
165 var folder = TestData.Get(@"TestData\EventManifest");
166 var build = new Builder(folder, typeof(UtilExtensionFactory), new[] { folder });
167
168 var results = build.BuildAndQuery(BuildARM64, "Binary", "CustomAction", "Wix4EventManifest", "Wix4XmlFile");
169 WixAssert.CompareLineByLine(new[]
170 {
171 "Binary:Wix4UtilCA_A64\t[Binary data]",
172 "CustomAction:Wix4ConfigureEventManifestRegister_A64\t1\tWix4UtilCA_A64\tConfigureEventManifestRegister\t",
173 "CustomAction:Wix4ConfigureEventManifestUnregister_A64\t1\tWix4UtilCA_A64\tConfigureEventManifestUnregister\t",
174 "CustomAction:Wix4ExecXmlFile_A64\t11265\tWix4UtilCA_A64\tExecXmlFile\t",
175 "CustomAction:Wix4ExecXmlFileRollback_A64\t11521\tWix4UtilCA_A64\tExecXmlFileRollback\t",
176 "CustomAction:Wix4RegisterEventManifest_A64\t3073\tWix4UtilCA_A64\tWixQuietExec\t",
177 "CustomAction:Wix4RollbackRegisterEventManifest_A64\t3393\tWix4UtilCA_A64\tWixQuietExec\t",
178 "CustomAction:Wix4RollbackUnregisterEventManifest_A64\t3329\tWix4UtilCA_A64\tWixQuietExec\t",
179 "CustomAction:Wix4SchedXmlFile_A64\t1\tWix4UtilCA_A64\tSchedXmlFile\t",
180 "CustomAction:Wix4UnregisterEventManifest_A64\t3137\tWix4UtilCA_A64\tWixQuietExec\t",
181 "Wix4EventManifest:Manifest.dll\t[#Manifest.dll]",
182 "Wix4XmlFile:Config_Manifest.dllMessageFile\t[#Manifest.dll]\t/*/*/*/*[\\[]@messageFileName[\\]]\tmessageFileName\t[Manifest.dll]\t4100\tManifest.dll\t",
183 "Wix4XmlFile:Config_Manifest.dllResourceFile\t[#Manifest.dll]\t/*/*/*/*[\\[]@resourceFileName[\\]]\tresourceFileName\t[Manifest.dll]\t4100\tManifest.dll\t",
184 }, results.OrderBy(s => s).ToArray());
185 }
186
187 [Fact]
188 public void CanBuildWithQueries()
189 {
190 var folder = TestData.Get(@"TestData\Queries");
191 var build = new Builder(folder, typeof(UtilExtensionFactory), new[] { folder });
192
193 var results = build.BuildAndQuery(BuildARM64, "Binary", "CustomAction");
194 WixAssert.CompareLineByLine(new[]
195 {
196 "Binary:Wix4UtilCA_A64\t[Binary data]",
197 "CustomAction:Wix4BroadcastEnvironmentChange_A64\t65\tWix4UtilCA_A64\tWixBroadcastEnvironmentChange\t",
198 "CustomAction:Wix4BroadcastSettingChange_A64\t65\tWix4UtilCA_A64\tWixBroadcastSettingChange\t",
199 "CustomAction:Wix4CheckRebootRequired_A64\t65\tWix4UtilCA_A64\tWixCheckRebootRequired\t",
200 "CustomAction:Wix4QueryOsDriverInfo_A64\t257\tWix4UtilCA_A64\tWixQueryOsDriverInfo\t",
201 "CustomAction:Wix4QueryOsInfo_A64\t257\tWix4UtilCA_A64\tWixQueryOsInfo\t",
202 }, results.OrderBy(s => s).ToArray());
203 }
204
205 [Fact]
206 public void CanBuildWithXmlConfig()
207 {
208 var folder = TestData.Get(@"TestData", "XmlConfig");
209 var build = new Builder(folder, typeof(UtilExtensionFactory), new[] { folder });
210
211 var results = build.BuildAndQuery(BuildX64, "Wix4XmlConfig");
212 WixAssert.CompareLineByLine(new[]
213 {
214 "Wix4XmlConfig:DelElement\t[INSTALLFOLDER]my.xml\t\t//root/sub\txxx\t\t\t289\tDel\t1",
215 }, results.OrderBy(s => s).ToArray());
216 }
217
218 [Fact]
219 public void CanBuildModuleWithXmlConfig()
220 {
221 var folder = TestData.Get(@"TestData", "XmlConfigModule");
222 var build = new Builder(folder, typeof(UtilExtensionFactory), new[] { folder });
223
224 var results = build.BuildAndQuery(BuildX64, "Wix4XmlConfig");
225 WixAssert.CompareLineByLine(new[]
226 {
227 "Wix4XmlConfig:AddElement.047730A5_30FE_4A62_A520_DA9381B8226A\t[my.xml.047730A5_30FE_4A62_A520_DA9381B8226A]\t\t//root/sub\txxx\t\t\t273\tParent.047730A5_30FE_4A62_A520_DA9381B8226A\t1",
228 "Wix4XmlConfig:ChildElement.047730A5_30FE_4A62_A520_DA9381B8226A\t[my.xml.047730A5_30FE_4A62_A520_DA9381B8226A]\tAddElement.047730A5_30FE_4A62_A520_DA9381B8226A\t\txxx\t\t\t0\tChild.047730A5_30FE_4A62_A520_DA9381B8226A\t1",
229 }, results.OrderBy(s => s).ToArray());
230 }
231
232 [Fact]
233 public void CanBuildBundleWithSearches()
234 {
235 var burnStubPath = TestData.Get(@"TestData\.Data\burn.exe");
236 var folder = TestData.Get(@"TestData\BundleWithSearches");
237 var rootFolder = TestData.Get();
238 var wixext = Path.Combine(rootFolder, "WixToolset.Util.wixext.dll");
239
240 using (var fs = new DisposableFileSystem())
241 {
242 var baseFolder = fs.GetFolder();
243 var intermediateFolder = Path.Combine(baseFolder, "obj");
244 var bundlePath = Path.Combine(baseFolder, @"bin\test.exe");
245 var baFolderPath = Path.Combine(baseFolder, "ba");
246 var extractFolderPath = Path.Combine(baseFolder, "extract");
247
248 var result = WixRunner.Execute(new[]
249 {
250 "build",
251 Path.Combine(folder, "Bundle.wxs"),
252 "-ext", wixext,
253 "-loc", Path.Combine(folder, "Bundle.en-us.wxl"),
254 "-bindpath", Path.Combine(folder, "data"),
255 "-intermediateFolder", intermediateFolder,
256 "-o", bundlePath
257 });
258
259 result.AssertSuccess();
260
261 Assert.True(File.Exists(bundlePath));
262#if TODO
263 Assert.True(File.Exists(Path.Combine(baseFolder, @"bin\test.wixpdb")));
264#endif
265
266 var extractResult = BundleExtractor.ExtractBAContainer(null, bundlePath, baFolderPath, extractFolderPath);
267 extractResult.AssertSuccess();
268
269 var bundleExtensionDatas = extractResult.SelectBundleExtensionDataNodes("/be:BundleExtensionData/be:BundleExtension[@Id='Wix4UtilBundleExtension_X86']");
270 Assert.Equal(1, bundleExtensionDatas.Count);
271 Assert.Equal("<BundleExtension Id='Wix4UtilBundleExtension_X86'>" +
272 "<WixWindowsFeatureSearch Id='DetectSHA2SupportId' Type='sha2CodeSigning' />" +
273 "</BundleExtension>", bundleExtensionDatas[0].GetTestXml());
274
275 var utilSearches = extractResult.SelectManifestNodes("/burn:BurnManifest/*[self::burn:ExtensionSearch or self::burn:FileSearch or self::burn:MsiProductSearch or self::burn:RegistrySearch]");
276 Assert.Equal(5, utilSearches.Count);
277 Assert.Equal("<ExtensionSearch Id='DetectSHA2SupportId' Variable='IsSHA2Supported' " +
278 "ExtensionId='Wix4UtilBundleExtension_X86' />", utilSearches[0].GetTestXml());
279 Assert.Equal("<FileSearch Id='FileSearchId' Variable='FileSearchVariable' " +
280 $@"Path='%windir%\System32\mscoree.dll' Type='exists' />", utilSearches[1].GetTestXml());
281 Assert.Equal("<MsiProductSearch Id='ProductSearchId' Variable='ProductSearchVariable' Condition='1 &amp; 2 &lt; 3' " +
282 "UpgradeCode='{738D02BF-E231-4370-8209-E9FD4E1BE2A1}' Type='version' />", utilSearches[2].GetTestXml());
283 Assert.Equal("<RegistrySearch Id='RegistrySearchId' Variable='RegistrySearchVariable' " +
284 @"Root='HKLM' Key='SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full' Value='Release' Type='value' VariableType='string' />", utilSearches[3].GetTestXml());
285 Assert.Equal("<RegistrySearch Id='RegistrySearchId64' Variable='RegistrySearchVariable64' " +
286 @"Root='HKLM' Key='SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full' Value='Release' Type='value' Win64='yes' VariableType='string' />", utilSearches[4].GetTestXml());
287 }
288 }
289
290 private static void Build(string[] args)
291 {
292 var result = WixRunner.Execute(args);
293 result.AssertSuccess();
294 }
295
296 private static void BuildX64(string[] args)
297 {
298 var newArgs = args.ToList();
299 newArgs.Add("-platform");
300 newArgs.Add("x64");
301 newArgs.Add("-sw1072");
302
303 var result = WixRunner.Execute(newArgs.ToArray());
304 result.AssertSuccess();
305 }
306
307 private static void BuildARM64(string[] args)
308 {
309 var newArgs = args.ToList();
310 newArgs.Add("-platform");
311 newArgs.Add("arm64");
312
313 var result = WixRunner.Execute(newArgs.ToArray());
314 result.AssertSuccess();
315 }
316 }
317}
diff --git a/src/ext/Util/test/WixToolsetTest.Util/WixToolsetTest.Util.csproj b/src/ext/Util/test/WixToolsetTest.Util/WixToolsetTest.Util.csproj
new file mode 100644
index 00000000..e77ecbed
--- /dev/null
+++ b/src/ext/Util/test/WixToolsetTest.Util/WixToolsetTest.Util.csproj
@@ -0,0 +1,38 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3
4<Project Sdk="Microsoft.NET.Sdk">
5 <PropertyGroup>
6 <TargetFramework>netcoreapp3.1</TargetFramework>
7 <IsPackable>false</IsPackable>
8 </PropertyGroup>
9
10 <PropertyGroup>
11 <NoWarn>NU1701</NoWarn>
12 </PropertyGroup>
13
14 <ItemGroup>
15 <Content Include="TestData\**" CopyToOutputDirectory="PreserveNewest" />
16 </ItemGroup>
17
18 <ItemGroup>
19 <ProjectReference Include="..\..\wixext\WixToolset.Util.wixext.csproj" />
20 </ItemGroup>
21
22 <ItemGroup>
23 <PackageReference Include="WixToolset.Core" Version="4.0.*" />
24 <PackageReference Include="WixToolset.Core.Burn" Version="4.0.*" />
25 <PackageReference Include="WixToolset.Core.WindowsInstaller" Version="4.0.*" />
26 <PackageReference Include="WixToolset.Core.TestPackage" Version="4.0.*" />
27 </ItemGroup>
28
29 <ItemGroup>
30 <PackageReference Include="WixBuildTools.TestSupport" Version="4.0.*" />
31 </ItemGroup>
32
33 <ItemGroup>
34 <PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.3.0" />
35 <PackageReference Include="xunit" Version="2.4.1" />
36 <PackageReference Include="xunit.runner.visualstudio" Version="2.4.1" PrivateAssets="All" />
37 </ItemGroup>
38</Project>
diff --git a/src/ext/Util/test/WixToolsetTest.Util/WixToolsetTest.Util.v3.ncrunchproject b/src/ext/Util/test/WixToolsetTest.Util/WixToolsetTest.Util.v3.ncrunchproject
new file mode 100644
index 00000000..7b5b2139
--- /dev/null
+++ b/src/ext/Util/test/WixToolsetTest.Util/WixToolsetTest.Util.v3.ncrunchproject
@@ -0,0 +1,5 @@
1<ProjectConfiguration>
2 <Settings>
3 <CopyReferencedAssembliesToWorkspace>True</CopyReferencedAssembliesToWorkspace>
4 </Settings>
5</ProjectConfiguration> \ No newline at end of file
diff --git a/src/ext/Util/wix.snk b/src/ext/Util/wix.snk
new file mode 100644
index 00000000..3908a66a
--- /dev/null
+++ b/src/ext/Util/wix.snk
Binary files differ
diff --git a/src/ext/Util/wixext/PerformanceCounterType.cs b/src/ext/Util/wixext/PerformanceCounterType.cs
new file mode 100644
index 00000000..1e06efd3
--- /dev/null
+++ b/src/ext/Util/wixext/PerformanceCounterType.cs
@@ -0,0 +1,192 @@
1// Captured from: C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.6.1\System.dll
2
3namespace System.Diagnostics
4{
5 public enum PerformanceCounterType
6 {
7 //
8 // Summary:
9 // An instantaneous counter that shows the most recently observed value in hexadecimal
10 // format. Used, for example, to maintain a simple count of items or operations.
11 NumberOfItemsHEX32 = 0,
12 //
13 // Summary:
14 // An instantaneous counter that shows the most recently observed value. Used, for
15 // example, to maintain a simple count of a very large number of items or operations.
16 // It is the same as NumberOfItemsHEX32 except that it uses larger fields to accommodate
17 // larger values.
18 NumberOfItemsHEX64 = 256,
19 //
20 // Summary:
21 // An instantaneous counter that shows the most recently observed value. Used, for
22 // example, to maintain a simple count of items or operations.
23 NumberOfItems32 = 65536,
24 //
25 // Summary:
26 // An instantaneous counter that shows the most recently observed value. Used, for
27 // example, to maintain a simple count of a very large number of items or operations.
28 // It is the same as NumberOfItems32 except that it uses larger fields to accommodate
29 // larger values.
30 NumberOfItems64 = 65792,
31 //
32 // Summary:
33 // A difference counter that shows the change in the measured attribute between
34 // the two most recent sample intervals.
35 CounterDelta32 = 4195328,
36 //
37 // Summary:
38 // A difference counter that shows the change in the measured attribute between
39 // the two most recent sample intervals. It is the same as the CounterDelta32 counter
40 // type except that is uses larger fields to accomodate larger values.
41 CounterDelta64 = 4195584,
42 //
43 // Summary:
44 // An average counter that shows the average number of operations completed in one
45 // second. When a counter of this type samples the data, each sampling interrupt
46 // returns one or zero. The counter data is the number of ones that were sampled.
47 // It measures time in units of ticks of the system performance timer.
48 SampleCounter = 4260864,
49 //
50 // Summary:
51 // An average counter designed to monitor the average length of a queue to a resource
52 // over time. It shows the difference between the queue lengths observed during
53 // the last two sample intervals divided by the duration of the interval. This type
54 // of counter is typically used to track the number of items that are queued or
55 // waiting.
56 CountPerTimeInterval32 = 4523008,
57 //
58 // Summary:
59 // An average counter that monitors the average length of a queue to a resource
60 // over time. Counters of this type display the difference between the queue lengths
61 // observed during the last two sample intervals, divided by the duration of the
62 // interval. This counter type is the same as CountPerTimeInterval32 except that
63 // it uses larger fields to accommodate larger values. This type of counter is typically
64 // used to track a high-volume or very large number of items that are queued or
65 // waiting.
66 CountPerTimeInterval64 = 4523264,
67 //
68 // Summary:
69 // A difference counter that shows the average number of operations completed during
70 // each second of the sample interval. Counters of this type measure time in ticks
71 // of the system clock.
72 RateOfCountsPerSecond32 = 272696320,
73 //
74 // Summary:
75 // A difference counter that shows the average number of operations completed during
76 // each second of the sample interval. Counters of this type measure time in ticks
77 // of the system clock. This counter type is the same as the RateOfCountsPerSecond32
78 // type, but it uses larger fields to accommodate larger values to track a high-volume
79 // number of items or operations per second, such as a byte-transmission rate.
80 RateOfCountsPerSecond64 = 272696576,
81 //
82 // Summary:
83 // An instantaneous percentage counter that shows the ratio of a subset to its set
84 // as a percentage. For example, it compares the number of bytes in use on a disk
85 // to the total number of bytes on the disk. Counters of this type display the current
86 // percentage only, not an average over time.
87 RawFraction = 537003008,
88 //
89 // Summary:
90 // A percentage counter that shows the average time that a component is active as
91 // a percentage of the total sample time.
92 CounterTimer = 541132032,
93 //
94 // Summary:
95 // A percentage counter that shows the active time of a component as a percentage
96 // of the total elapsed time of the sample interval. It measures time in units of
97 // 100 nanoseconds (ns). Counters of this type are designed to measure the activity
98 // of one component at a time.
99 Timer100Ns = 542180608,
100 //
101 // Summary:
102 // A percentage counter that shows the average ratio of hits to all operations during
103 // the last two sample intervals.
104 SampleFraction = 549585920,
105 //
106 // Summary:
107 // A percentage counter that displays the average percentage of active time observed
108 // during sample interval. The value of these counters is calculated by monitoring
109 // the percentage of time that the service was inactive and then subtracting that
110 // value from 100 percent.
111 CounterTimerInverse = 557909248,
112 //
113 // Summary:
114 // A percentage counter that shows the average percentage of active time observed
115 // during the sample interval.
116 Timer100NsInverse = 558957824,
117 //
118 // Summary:
119 // A percentage counter that displays the active time of one or more components
120 // as a percentage of the total time of the sample interval. Because the numerator
121 // records the active time of components operating simultaneously, the resulting
122 // percentage can exceed 100 percent.
123 CounterMultiTimer = 574686464,
124 //
125 // Summary:
126 // A percentage counter that shows the active time of one or more components as
127 // a percentage of the total time of the sample interval. It measures time in 100
128 // nanosecond (ns) units.
129 CounterMultiTimer100Ns = 575735040,
130 //
131 // Summary:
132 // A percentage counter that shows the active time of one or more components as
133 // a percentage of the total time of the sample interval. It derives the active
134 // time by measuring the time that the components were not active and subtracting
135 // the result from 100 percent by the number of objects monitored.
136 CounterMultiTimerInverse = 591463680,
137 //
138 // Summary:
139 // A percentage counter that shows the active time of one or more components as
140 // a percentage of the total time of the sample interval. Counters of this type
141 // measure time in 100 nanosecond (ns) units. They derive the active time by measuring
142 // the time that the components were not active and subtracting the result from
143 // multiplying 100 percent by the number of objects monitored.
144 CounterMultiTimer100NsInverse = 592512256,
145 //
146 // Summary:
147 // An average counter that measures the time it takes, on average, to complete a
148 // process or operation. Counters of this type display a ratio of the total elapsed
149 // time of the sample interval to the number of processes or operations completed
150 // during that time. This counter type measures time in ticks of the system clock.
151 AverageTimer32 = 805438464,
152 //
153 // Summary:
154 // A difference timer that shows the total time between when the component or process
155 // started and the time when this value is calculated.
156 ElapsedTime = 807666944,
157 //
158 // Summary:
159 // An average counter that shows how many items are processed, on average, during
160 // an operation. Counters of this type display a ratio of the items processed to
161 // the number of operations completed. The ratio is calculated by comparing the
162 // number of items processed during the last interval to the number of operations
163 // completed during the last interval.
164 AverageCount64 = 1073874176,
165 //
166 // Summary:
167 // A base counter that stores the number of sampling interrupts taken and is used
168 // as a denominator in the sampling fraction. The sampling fraction is the number
169 // of samples that were 1 (or true) for a sample interrupt. Check that this value
170 // is greater than zero before using it as the denominator in a calculation of SampleFraction.
171 SampleBase = 1073939457,
172 //
173 // Summary:
174 // A base counter that is used in the calculation of time or count averages, such
175 // as AverageTimer32 and AverageCount64. Stores the denominator for calculating
176 // a counter to present "time per operation" or "count per operation".
177 AverageBase = 1073939458,
178 //
179 // Summary:
180 // A base counter that stores the denominator of a counter that presents a general
181 // arithmetic fraction. Check that this value is greater than zero before using
182 // it as the denominator in a RawFraction value calculation.
183 RawBase = 1073939459,
184 //
185 // Summary:
186 // A base counter that indicates the number of items sampled. It is used as the
187 // denominator in the calculations to get an average among the items sampled when
188 // taking timings of multiple, but similar items. Used with CounterMultiTimer, CounterMultiTimerInverse,
189 // CounterMultiTimer100Ns, and CounterMultiTimer100NsInverse.
190 CounterMultiBase = 1107494144
191 }
192}
diff --git a/src/ext/Util/wixext/Symbols/EventManifestSymbol.cs b/src/ext/Util/wixext/Symbols/EventManifestSymbol.cs
new file mode 100644
index 00000000..ccd3c899
--- /dev/null
+++ b/src/ext/Util/wixext/Symbols/EventManifestSymbol.cs
@@ -0,0 +1,55 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Util
4{
5 using WixToolset.Data;
6 using WixToolset.Util.Symbols;
7
8 public static partial class UtilSymbolDefinitions
9 {
10 public static readonly IntermediateSymbolDefinition EventManifest = new IntermediateSymbolDefinition(
11 UtilSymbolDefinitionType.EventManifest.ToString(),
12 new[]
13 {
14 new IntermediateFieldDefinition(nameof(EventManifestSymbolFields.ComponentRef), IntermediateFieldType.String),
15 new IntermediateFieldDefinition(nameof(EventManifestSymbolFields.File), IntermediateFieldType.String),
16 },
17 typeof(EventManifestSymbol));
18 }
19}
20
21namespace WixToolset.Util.Symbols
22{
23 using WixToolset.Data;
24
25 public enum EventManifestSymbolFields
26 {
27 ComponentRef,
28 File,
29 }
30
31 public class EventManifestSymbol : IntermediateSymbol
32 {
33 public EventManifestSymbol() : base(UtilSymbolDefinitions.EventManifest, null, null)
34 {
35 }
36
37 public EventManifestSymbol(SourceLineNumber sourceLineNumber, Identifier id = null) : base(UtilSymbolDefinitions.EventManifest, sourceLineNumber, id)
38 {
39 }
40
41 public IntermediateField this[EventManifestSymbolFields index] => this.Fields[(int)index];
42
43 public string ComponentRef
44 {
45 get => this.Fields[(int)EventManifestSymbolFields.ComponentRef].AsString();
46 set => this.Set((int)EventManifestSymbolFields.ComponentRef, value);
47 }
48
49 public string File
50 {
51 get => this.Fields[(int)EventManifestSymbolFields.File].AsString();
52 set => this.Set((int)EventManifestSymbolFields.File, value);
53 }
54 }
55} \ No newline at end of file
diff --git a/src/ext/Util/wixext/Symbols/FileSharePermissionsSymbol.cs b/src/ext/Util/wixext/Symbols/FileSharePermissionsSymbol.cs
new file mode 100644
index 00000000..3db92f22
--- /dev/null
+++ b/src/ext/Util/wixext/Symbols/FileSharePermissionsSymbol.cs
@@ -0,0 +1,63 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Util
4{
5 using WixToolset.Data;
6 using WixToolset.Util.Symbols;
7
8 public static partial class UtilSymbolDefinitions
9 {
10 public static readonly IntermediateSymbolDefinition FileSharePermissions = new IntermediateSymbolDefinition(
11 UtilSymbolDefinitionType.FileSharePermissions.ToString(),
12 new[]
13 {
14 new IntermediateFieldDefinition(nameof(FileSharePermissionsSymbolFields.FileShareRef), IntermediateFieldType.String),
15 new IntermediateFieldDefinition(nameof(FileSharePermissionsSymbolFields.UserRef), IntermediateFieldType.String),
16 new IntermediateFieldDefinition(nameof(FileSharePermissionsSymbolFields.Permissions), IntermediateFieldType.Number),
17 },
18 typeof(FileSharePermissionsSymbol));
19 }
20}
21
22namespace WixToolset.Util.Symbols
23{
24 using WixToolset.Data;
25
26 public enum FileSharePermissionsSymbolFields
27 {
28 FileShareRef,
29 UserRef,
30 Permissions,
31 }
32
33 public class FileSharePermissionsSymbol : IntermediateSymbol
34 {
35 public FileSharePermissionsSymbol() : base(UtilSymbolDefinitions.FileSharePermissions, null, null)
36 {
37 }
38
39 public FileSharePermissionsSymbol(SourceLineNumber sourceLineNumber, Identifier id = null) : base(UtilSymbolDefinitions.FileSharePermissions, sourceLineNumber, id)
40 {
41 }
42
43 public IntermediateField this[FileSharePermissionsSymbolFields index] => this.Fields[(int)index];
44
45 public string FileShareRef
46 {
47 get => this.Fields[(int)FileSharePermissionsSymbolFields.FileShareRef].AsString();
48 set => this.Set((int)FileSharePermissionsSymbolFields.FileShareRef, value);
49 }
50
51 public string UserRef
52 {
53 get => this.Fields[(int)FileSharePermissionsSymbolFields.UserRef].AsString();
54 set => this.Set((int)FileSharePermissionsSymbolFields.UserRef, value);
55 }
56
57 public int Permissions
58 {
59 get => this.Fields[(int)FileSharePermissionsSymbolFields.Permissions].AsNumber();
60 set => this.Set((int)FileSharePermissionsSymbolFields.Permissions, value);
61 }
62 }
63} \ No newline at end of file
diff --git a/src/ext/Util/wixext/Symbols/FileShareSymbol.cs b/src/ext/Util/wixext/Symbols/FileShareSymbol.cs
new file mode 100644
index 00000000..c956ff42
--- /dev/null
+++ b/src/ext/Util/wixext/Symbols/FileShareSymbol.cs
@@ -0,0 +1,71 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Util
4{
5 using WixToolset.Data;
6 using WixToolset.Util.Symbols;
7
8 public static partial class UtilSymbolDefinitions
9 {
10 public static readonly IntermediateSymbolDefinition FileShare = new IntermediateSymbolDefinition(
11 UtilSymbolDefinitionType.FileShare.ToString(),
12 new[]
13 {
14 new IntermediateFieldDefinition(nameof(FileShareSymbolFields.ShareName), IntermediateFieldType.String),
15 new IntermediateFieldDefinition(nameof(FileShareSymbolFields.ComponentRef), IntermediateFieldType.String),
16 new IntermediateFieldDefinition(nameof(FileShareSymbolFields.Description), IntermediateFieldType.String),
17 new IntermediateFieldDefinition(nameof(FileShareSymbolFields.DirectoryRef), IntermediateFieldType.String),
18 },
19 typeof(FileShareSymbol));
20 }
21}
22
23namespace WixToolset.Util.Symbols
24{
25 using WixToolset.Data;
26
27 public enum FileShareSymbolFields
28 {
29 ShareName,
30 ComponentRef,
31 Description,
32 DirectoryRef,
33 }
34
35 public class FileShareSymbol : IntermediateSymbol
36 {
37 public FileShareSymbol() : base(UtilSymbolDefinitions.FileShare, null, null)
38 {
39 }
40
41 public FileShareSymbol(SourceLineNumber sourceLineNumber, Identifier id = null) : base(UtilSymbolDefinitions.FileShare, sourceLineNumber, id)
42 {
43 }
44
45 public IntermediateField this[FileShareSymbolFields index] => this.Fields[(int)index];
46
47 public string ShareName
48 {
49 get => this.Fields[(int)FileShareSymbolFields.ShareName].AsString();
50 set => this.Set((int)FileShareSymbolFields.ShareName, value);
51 }
52
53 public string ComponentRef
54 {
55 get => this.Fields[(int)FileShareSymbolFields.ComponentRef].AsString();
56 set => this.Set((int)FileShareSymbolFields.ComponentRef, value);
57 }
58
59 public string Description
60 {
61 get => this.Fields[(int)FileShareSymbolFields.Description].AsString();
62 set => this.Set((int)FileShareSymbolFields.Description, value);
63 }
64
65 public string DirectoryRef
66 {
67 get => this.Fields[(int)FileShareSymbolFields.DirectoryRef].AsString();
68 set => this.Set((int)FileShareSymbolFields.DirectoryRef, value);
69 }
70 }
71} \ No newline at end of file
diff --git a/src/ext/Util/wixext/Symbols/GroupSymbol.cs b/src/ext/Util/wixext/Symbols/GroupSymbol.cs
new file mode 100644
index 00000000..b378db44
--- /dev/null
+++ b/src/ext/Util/wixext/Symbols/GroupSymbol.cs
@@ -0,0 +1,63 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Util
4{
5 using WixToolset.Data;
6 using WixToolset.Util.Symbols;
7
8 public static partial class UtilSymbolDefinitions
9 {
10 public static readonly IntermediateSymbolDefinition Group = new IntermediateSymbolDefinition(
11 UtilSymbolDefinitionType.Group.ToString(),
12 new[]
13 {
14 new IntermediateFieldDefinition(nameof(GroupSymbolFields.ComponentRef), IntermediateFieldType.String),
15 new IntermediateFieldDefinition(nameof(GroupSymbolFields.Name), IntermediateFieldType.String),
16 new IntermediateFieldDefinition(nameof(GroupSymbolFields.Domain), IntermediateFieldType.String),
17 },
18 typeof(GroupSymbol));
19 }
20}
21
22namespace WixToolset.Util.Symbols
23{
24 using WixToolset.Data;
25
26 public enum GroupSymbolFields
27 {
28 ComponentRef,
29 Name,
30 Domain,
31 }
32
33 public class GroupSymbol : IntermediateSymbol
34 {
35 public GroupSymbol() : base(UtilSymbolDefinitions.Group, null, null)
36 {
37 }
38
39 public GroupSymbol(SourceLineNumber sourceLineNumber, Identifier id = null) : base(UtilSymbolDefinitions.Group, sourceLineNumber, id)
40 {
41 }
42
43 public IntermediateField this[GroupSymbolFields index] => this.Fields[(int)index];
44
45 public string ComponentRef
46 {
47 get => this.Fields[(int)GroupSymbolFields.ComponentRef].AsString();
48 set => this.Set((int)GroupSymbolFields.ComponentRef, value);
49 }
50
51 public string Name
52 {
53 get => this.Fields[(int)GroupSymbolFields.Name].AsString();
54 set => this.Set((int)GroupSymbolFields.Name, value);
55 }
56
57 public string Domain
58 {
59 get => this.Fields[(int)GroupSymbolFields.Domain].AsString();
60 set => this.Set((int)GroupSymbolFields.Domain, value);
61 }
62 }
63} \ No newline at end of file
diff --git a/src/ext/Util/wixext/Symbols/PerfmonManifestSymbol.cs b/src/ext/Util/wixext/Symbols/PerfmonManifestSymbol.cs
new file mode 100644
index 00000000..03fef14e
--- /dev/null
+++ b/src/ext/Util/wixext/Symbols/PerfmonManifestSymbol.cs
@@ -0,0 +1,63 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Util
4{
5 using WixToolset.Data;
6 using WixToolset.Util.Symbols;
7
8 public static partial class UtilSymbolDefinitions
9 {
10 public static readonly IntermediateSymbolDefinition PerfmonManifest = new IntermediateSymbolDefinition(
11 UtilSymbolDefinitionType.PerfmonManifest.ToString(),
12 new[]
13 {
14 new IntermediateFieldDefinition(nameof(PerfmonManifestSymbolFields.ComponentRef), IntermediateFieldType.String),
15 new IntermediateFieldDefinition(nameof(PerfmonManifestSymbolFields.File), IntermediateFieldType.String),
16 new IntermediateFieldDefinition(nameof(PerfmonManifestSymbolFields.ResourceFileDirectory), IntermediateFieldType.String),
17 },
18 typeof(PerfmonManifestSymbol));
19 }
20}
21
22namespace WixToolset.Util.Symbols
23{
24 using WixToolset.Data;
25
26 public enum PerfmonManifestSymbolFields
27 {
28 ComponentRef,
29 File,
30 ResourceFileDirectory,
31 }
32
33 public class PerfmonManifestSymbol : IntermediateSymbol
34 {
35 public PerfmonManifestSymbol() : base(UtilSymbolDefinitions.PerfmonManifest, null, null)
36 {
37 }
38
39 public PerfmonManifestSymbol(SourceLineNumber sourceLineNumber, Identifier id = null) : base(UtilSymbolDefinitions.PerfmonManifest, sourceLineNumber, id)
40 {
41 }
42
43 public IntermediateField this[PerfmonManifestSymbolFields index] => this.Fields[(int)index];
44
45 public string ComponentRef
46 {
47 get => this.Fields[(int)PerfmonManifestSymbolFields.ComponentRef].AsString();
48 set => this.Set((int)PerfmonManifestSymbolFields.ComponentRef, value);
49 }
50
51 public string File
52 {
53 get => this.Fields[(int)PerfmonManifestSymbolFields.File].AsString();
54 set => this.Set((int)PerfmonManifestSymbolFields.File, value);
55 }
56
57 public string ResourceFileDirectory
58 {
59 get => this.Fields[(int)PerfmonManifestSymbolFields.ResourceFileDirectory].AsString();
60 set => this.Set((int)PerfmonManifestSymbolFields.ResourceFileDirectory, value);
61 }
62 }
63} \ No newline at end of file
diff --git a/src/ext/Util/wixext/Symbols/PerfmonSymbol.cs b/src/ext/Util/wixext/Symbols/PerfmonSymbol.cs
new file mode 100644
index 00000000..6784ebd1
--- /dev/null
+++ b/src/ext/Util/wixext/Symbols/PerfmonSymbol.cs
@@ -0,0 +1,63 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Util
4{
5 using WixToolset.Data;
6 using WixToolset.Util.Symbols;
7
8 public static partial class UtilSymbolDefinitions
9 {
10 public static readonly IntermediateSymbolDefinition Perfmon = new IntermediateSymbolDefinition(
11 UtilSymbolDefinitionType.Perfmon.ToString(),
12 new[]
13 {
14 new IntermediateFieldDefinition(nameof(PerfmonSymbolFields.ComponentRef), IntermediateFieldType.String),
15 new IntermediateFieldDefinition(nameof(PerfmonSymbolFields.File), IntermediateFieldType.String),
16 new IntermediateFieldDefinition(nameof(PerfmonSymbolFields.Name), IntermediateFieldType.String),
17 },
18 typeof(PerfmonSymbol));
19 }
20}
21
22namespace WixToolset.Util.Symbols
23{
24 using WixToolset.Data;
25
26 public enum PerfmonSymbolFields
27 {
28 ComponentRef,
29 File,
30 Name,
31 }
32
33 public class PerfmonSymbol : IntermediateSymbol
34 {
35 public PerfmonSymbol() : base(UtilSymbolDefinitions.Perfmon, null, null)
36 {
37 }
38
39 public PerfmonSymbol(SourceLineNumber sourceLineNumber, Identifier id = null) : base(UtilSymbolDefinitions.Perfmon, sourceLineNumber, id)
40 {
41 }
42
43 public IntermediateField this[PerfmonSymbolFields index] => this.Fields[(int)index];
44
45 public string ComponentRef
46 {
47 get => this.Fields[(int)PerfmonSymbolFields.ComponentRef].AsString();
48 set => this.Set((int)PerfmonSymbolFields.ComponentRef, value);
49 }
50
51 public string File
52 {
53 get => this.Fields[(int)PerfmonSymbolFields.File].AsString();
54 set => this.Set((int)PerfmonSymbolFields.File, value);
55 }
56
57 public string Name
58 {
59 get => this.Fields[(int)PerfmonSymbolFields.Name].AsString();
60 set => this.Set((int)PerfmonSymbolFields.Name, value);
61 }
62 }
63} \ No newline at end of file
diff --git a/src/ext/Util/wixext/Symbols/PerformanceCategorySymbol.cs b/src/ext/Util/wixext/Symbols/PerformanceCategorySymbol.cs
new file mode 100644
index 00000000..5ecf388c
--- /dev/null
+++ b/src/ext/Util/wixext/Symbols/PerformanceCategorySymbol.cs
@@ -0,0 +1,71 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Util
4{
5 using WixToolset.Data;
6 using WixToolset.Util.Symbols;
7
8 public static partial class UtilSymbolDefinitions
9 {
10 public static readonly IntermediateSymbolDefinition PerformanceCategory = new IntermediateSymbolDefinition(
11 UtilSymbolDefinitionType.PerformanceCategory.ToString(),
12 new[]
13 {
14 new IntermediateFieldDefinition(nameof(PerformanceCategorySymbolFields.ComponentRef), IntermediateFieldType.String),
15 new IntermediateFieldDefinition(nameof(PerformanceCategorySymbolFields.Name), IntermediateFieldType.String),
16 new IntermediateFieldDefinition(nameof(PerformanceCategorySymbolFields.IniData), IntermediateFieldType.String),
17 new IntermediateFieldDefinition(nameof(PerformanceCategorySymbolFields.ConstantData), IntermediateFieldType.String),
18 },
19 typeof(PerformanceCategorySymbol));
20 }
21}
22
23namespace WixToolset.Util.Symbols
24{
25 using WixToolset.Data;
26
27 public enum PerformanceCategorySymbolFields
28 {
29 ComponentRef,
30 Name,
31 IniData,
32 ConstantData,
33 }
34
35 public class PerformanceCategorySymbol : IntermediateSymbol
36 {
37 public PerformanceCategorySymbol() : base(UtilSymbolDefinitions.PerformanceCategory, null, null)
38 {
39 }
40
41 public PerformanceCategorySymbol(SourceLineNumber sourceLineNumber, Identifier id = null) : base(UtilSymbolDefinitions.PerformanceCategory, sourceLineNumber, id)
42 {
43 }
44
45 public IntermediateField this[PerformanceCategorySymbolFields index] => this.Fields[(int)index];
46
47 public string ComponentRef
48 {
49 get => this.Fields[(int)PerformanceCategorySymbolFields.ComponentRef].AsString();
50 set => this.Set((int)PerformanceCategorySymbolFields.ComponentRef, value);
51 }
52
53 public string Name
54 {
55 get => this.Fields[(int)PerformanceCategorySymbolFields.Name].AsString();
56 set => this.Set((int)PerformanceCategorySymbolFields.Name, value);
57 }
58
59 public string IniData
60 {
61 get => this.Fields[(int)PerformanceCategorySymbolFields.IniData].AsString();
62 set => this.Set((int)PerformanceCategorySymbolFields.IniData, value);
63 }
64
65 public string ConstantData
66 {
67 get => this.Fields[(int)PerformanceCategorySymbolFields.ConstantData].AsString();
68 set => this.Set((int)PerformanceCategorySymbolFields.ConstantData, value);
69 }
70 }
71} \ No newline at end of file
diff --git a/src/ext/Util/wixext/Symbols/SecureObjectsSymbol.cs b/src/ext/Util/wixext/Symbols/SecureObjectsSymbol.cs
new file mode 100644
index 00000000..25fc6dca
--- /dev/null
+++ b/src/ext/Util/wixext/Symbols/SecureObjectsSymbol.cs
@@ -0,0 +1,103 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Util
4{
5 using WixToolset.Data;
6 using WixToolset.Util.Symbols;
7
8 public static partial class UtilSymbolDefinitions
9 {
10 public static readonly IntermediateSymbolDefinition SecureObjects = new IntermediateSymbolDefinition(
11 UtilSymbolDefinitionType.SecureObjects.ToString(),
12 new[]
13 {
14 new IntermediateFieldDefinition(nameof(SecureObjectsSymbolFields.SecureObject), IntermediateFieldType.String),
15 new IntermediateFieldDefinition(nameof(SecureObjectsSymbolFields.Table), IntermediateFieldType.String),
16 new IntermediateFieldDefinition(nameof(SecureObjectsSymbolFields.Domain), IntermediateFieldType.String),
17 new IntermediateFieldDefinition(nameof(SecureObjectsSymbolFields.User), IntermediateFieldType.String),
18 new IntermediateFieldDefinition(nameof(SecureObjectsSymbolFields.Attributes), IntermediateFieldType.Number),
19 new IntermediateFieldDefinition(nameof(SecureObjectsSymbolFields.Permission), IntermediateFieldType.Number),
20 new IntermediateFieldDefinition(nameof(SecureObjectsSymbolFields.ComponentRef), IntermediateFieldType.String),
21 },
22 typeof(SecureObjectsSymbol));
23 }
24}
25
26namespace WixToolset.Util.Symbols
27{
28 using System;
29 using WixToolset.Data;
30
31 public enum SecureObjectsSymbolFields
32 {
33 SecureObject,
34 Table,
35 Domain,
36 User,
37 Attributes,
38 Permission,
39 ComponentRef,
40 }
41
42 [Flags]
43 public enum WixPermissionExAttributes
44 {
45 None = 0x0,
46 Inheritable = 0x01
47 }
48
49 public class SecureObjectsSymbol : IntermediateSymbol
50 {
51 public SecureObjectsSymbol() : base(UtilSymbolDefinitions.SecureObjects, null, null)
52 {
53 }
54
55 public SecureObjectsSymbol(SourceLineNumber sourceLineNumber, Identifier id = null) : base(UtilSymbolDefinitions.SecureObjects, sourceLineNumber, id)
56 {
57 }
58
59 public IntermediateField this[SecureObjectsSymbolFields index] => this.Fields[(int)index];
60
61 public string SecureObject
62 {
63 get => this.Fields[(int)SecureObjectsSymbolFields.SecureObject].AsString();
64 set => this.Set((int)SecureObjectsSymbolFields.SecureObject, value);
65 }
66
67 public string Table
68 {
69 get => this.Fields[(int)SecureObjectsSymbolFields.Table].AsString();
70 set => this.Set((int)SecureObjectsSymbolFields.Table, value);
71 }
72
73 public string Domain
74 {
75 get => this.Fields[(int)SecureObjectsSymbolFields.Domain].AsString();
76 set => this.Set((int)SecureObjectsSymbolFields.Domain, value);
77 }
78
79 public string User
80 {
81 get => this.Fields[(int)SecureObjectsSymbolFields.User].AsString();
82 set => this.Set((int)SecureObjectsSymbolFields.User, value);
83 }
84
85 public WixPermissionExAttributes Attributes
86 {
87 get => (WixPermissionExAttributes)this.Fields[(int)SecureObjectsSymbolFields.Attributes].AsNumber();
88 set => this.Set((int)SecureObjectsSymbolFields.Attributes, (int)value);
89 }
90
91 public int? Permission
92 {
93 get => this.Fields[(int)SecureObjectsSymbolFields.Permission].AsNullableNumber();
94 set => this.Set((int)SecureObjectsSymbolFields.Permission, value);
95 }
96
97 public string ComponentRef
98 {
99 get => this.Fields[(int)SecureObjectsSymbolFields.ComponentRef].AsString();
100 set => this.Set((int)SecureObjectsSymbolFields.ComponentRef, value);
101 }
102 }
103} \ No newline at end of file
diff --git a/src/ext/Util/wixext/Symbols/ServiceConfigSymbol.cs b/src/ext/Util/wixext/Symbols/ServiceConfigSymbol.cs
new file mode 100644
index 00000000..3a877f9b
--- /dev/null
+++ b/src/ext/Util/wixext/Symbols/ServiceConfigSymbol.cs
@@ -0,0 +1,119 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Util
4{
5 using WixToolset.Data;
6 using WixToolset.Util.Symbols;
7
8 public static partial class UtilSymbolDefinitions
9 {
10 public static readonly IntermediateSymbolDefinition ServiceConfig = new IntermediateSymbolDefinition(
11 UtilSymbolDefinitionType.ServiceConfig.ToString(),
12 new[]
13 {
14 new IntermediateFieldDefinition(nameof(ServiceConfigSymbolFields.ServiceName), IntermediateFieldType.String),
15 new IntermediateFieldDefinition(nameof(ServiceConfigSymbolFields.ComponentRef), IntermediateFieldType.String),
16 new IntermediateFieldDefinition(nameof(ServiceConfigSymbolFields.NewService), IntermediateFieldType.Number),
17 new IntermediateFieldDefinition(nameof(ServiceConfigSymbolFields.FirstFailureActionType), IntermediateFieldType.String),
18 new IntermediateFieldDefinition(nameof(ServiceConfigSymbolFields.SecondFailureActionType), IntermediateFieldType.String),
19 new IntermediateFieldDefinition(nameof(ServiceConfigSymbolFields.ThirdFailureActionType), IntermediateFieldType.String),
20 new IntermediateFieldDefinition(nameof(ServiceConfigSymbolFields.ResetPeriodInDays), IntermediateFieldType.Number),
21 new IntermediateFieldDefinition(nameof(ServiceConfigSymbolFields.RestartServiceDelayInSeconds), IntermediateFieldType.Number),
22 new IntermediateFieldDefinition(nameof(ServiceConfigSymbolFields.ProgramCommandLine), IntermediateFieldType.String),
23 new IntermediateFieldDefinition(nameof(ServiceConfigSymbolFields.RebootMessage), IntermediateFieldType.String),
24 },
25 typeof(ServiceConfigSymbol));
26 }
27}
28
29namespace WixToolset.Util.Symbols
30{
31 using WixToolset.Data;
32
33 public enum ServiceConfigSymbolFields
34 {
35 ServiceName,
36 ComponentRef,
37 NewService,
38 FirstFailureActionType,
39 SecondFailureActionType,
40 ThirdFailureActionType,
41 ResetPeriodInDays,
42 RestartServiceDelayInSeconds,
43 ProgramCommandLine,
44 RebootMessage,
45 }
46
47 public class ServiceConfigSymbol : IntermediateSymbol
48 {
49 public ServiceConfigSymbol() : base(UtilSymbolDefinitions.ServiceConfig, null, null)
50 {
51 }
52
53 public ServiceConfigSymbol(SourceLineNumber sourceLineNumber, Identifier id = null) : base(UtilSymbolDefinitions.ServiceConfig, sourceLineNumber, id)
54 {
55 }
56
57 public IntermediateField this[ServiceConfigSymbolFields index] => this.Fields[(int)index];
58
59 public string ServiceName
60 {
61 get => this.Fields[(int)ServiceConfigSymbolFields.ServiceName].AsString();
62 set => this.Set((int)ServiceConfigSymbolFields.ServiceName, value);
63 }
64
65 public string ComponentRef
66 {
67 get => this.Fields[(int)ServiceConfigSymbolFields.ComponentRef].AsString();
68 set => this.Set((int)ServiceConfigSymbolFields.ComponentRef, value);
69 }
70
71 public int NewService
72 {
73 get => this.Fields[(int)ServiceConfigSymbolFields.NewService].AsNumber();
74 set => this.Set((int)ServiceConfigSymbolFields.NewService, value);
75 }
76
77 public string FirstFailureActionType
78 {
79 get => this.Fields[(int)ServiceConfigSymbolFields.FirstFailureActionType].AsString();
80 set => this.Set((int)ServiceConfigSymbolFields.FirstFailureActionType, value);
81 }
82
83 public string SecondFailureActionType
84 {
85 get => this.Fields[(int)ServiceConfigSymbolFields.SecondFailureActionType].AsString();
86 set => this.Set((int)ServiceConfigSymbolFields.SecondFailureActionType, value);
87 }
88
89 public string ThirdFailureActionType
90 {
91 get => this.Fields[(int)ServiceConfigSymbolFields.ThirdFailureActionType].AsString();
92 set => this.Set((int)ServiceConfigSymbolFields.ThirdFailureActionType, value);
93 }
94
95 public int? ResetPeriodInDays
96 {
97 get => this.Fields[(int)ServiceConfigSymbolFields.ResetPeriodInDays].AsNullableNumber();
98 set => this.Set((int)ServiceConfigSymbolFields.ResetPeriodInDays, value);
99 }
100
101 public int? RestartServiceDelayInSeconds
102 {
103 get => this.Fields[(int)ServiceConfigSymbolFields.RestartServiceDelayInSeconds].AsNullableNumber();
104 set => this.Set((int)ServiceConfigSymbolFields.RestartServiceDelayInSeconds, value);
105 }
106
107 public string ProgramCommandLine
108 {
109 get => this.Fields[(int)ServiceConfigSymbolFields.ProgramCommandLine].AsString();
110 set => this.Set((int)ServiceConfigSymbolFields.ProgramCommandLine, value);
111 }
112
113 public string RebootMessage
114 {
115 get => this.Fields[(int)ServiceConfigSymbolFields.RebootMessage].AsString();
116 set => this.Set((int)ServiceConfigSymbolFields.RebootMessage, value);
117 }
118 }
119} \ No newline at end of file
diff --git a/src/ext/Util/wixext/Symbols/UserGroupSymbol.cs b/src/ext/Util/wixext/Symbols/UserGroupSymbol.cs
new file mode 100644
index 00000000..c8f3998e
--- /dev/null
+++ b/src/ext/Util/wixext/Symbols/UserGroupSymbol.cs
@@ -0,0 +1,55 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Util
4{
5 using WixToolset.Data;
6 using WixToolset.Util.Symbols;
7
8 public static partial class UtilSymbolDefinitions
9 {
10 public static readonly IntermediateSymbolDefinition UserGroup = new IntermediateSymbolDefinition(
11 UtilSymbolDefinitionType.UserGroup.ToString(),
12 new[]
13 {
14 new IntermediateFieldDefinition(nameof(UserGroupSymbolFields.UserRef), IntermediateFieldType.String),
15 new IntermediateFieldDefinition(nameof(UserGroupSymbolFields.GroupRef), IntermediateFieldType.String),
16 },
17 typeof(UserGroupSymbol));
18 }
19}
20
21namespace WixToolset.Util.Symbols
22{
23 using WixToolset.Data;
24
25 public enum UserGroupSymbolFields
26 {
27 UserRef,
28 GroupRef,
29 }
30
31 public class UserGroupSymbol : IntermediateSymbol
32 {
33 public UserGroupSymbol() : base(UtilSymbolDefinitions.UserGroup, null, null)
34 {
35 }
36
37 public UserGroupSymbol(SourceLineNumber sourceLineNumber, Identifier id = null) : base(UtilSymbolDefinitions.UserGroup, sourceLineNumber, id)
38 {
39 }
40
41 public IntermediateField this[UserGroupSymbolFields index] => this.Fields[(int)index];
42
43 public string UserRef
44 {
45 get => this.Fields[(int)UserGroupSymbolFields.UserRef].AsString();
46 set => this.Set((int)UserGroupSymbolFields.UserRef, value);
47 }
48
49 public string GroupRef
50 {
51 get => this.Fields[(int)UserGroupSymbolFields.GroupRef].AsString();
52 set => this.Set((int)UserGroupSymbolFields.GroupRef, value);
53 }
54 }
55} \ No newline at end of file
diff --git a/src/ext/Util/wixext/Symbols/UserSymbol.cs b/src/ext/Util/wixext/Symbols/UserSymbol.cs
new file mode 100644
index 00000000..5f00064b
--- /dev/null
+++ b/src/ext/Util/wixext/Symbols/UserSymbol.cs
@@ -0,0 +1,79 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Util
4{
5 using WixToolset.Data;
6 using WixToolset.Util.Symbols;
7
8 public static partial class UtilSymbolDefinitions
9 {
10 public static readonly IntermediateSymbolDefinition User = new IntermediateSymbolDefinition(
11 UtilSymbolDefinitionType.User.ToString(),
12 new[]
13 {
14 new IntermediateFieldDefinition(nameof(UserSymbolFields.ComponentRef), IntermediateFieldType.String),
15 new IntermediateFieldDefinition(nameof(UserSymbolFields.Name), IntermediateFieldType.String),
16 new IntermediateFieldDefinition(nameof(UserSymbolFields.Domain), IntermediateFieldType.String),
17 new IntermediateFieldDefinition(nameof(UserSymbolFields.Password), IntermediateFieldType.String),
18 new IntermediateFieldDefinition(nameof(UserSymbolFields.Attributes), IntermediateFieldType.Number),
19 },
20 typeof(UserSymbol));
21 }
22}
23
24namespace WixToolset.Util.Symbols
25{
26 using WixToolset.Data;
27
28 public enum UserSymbolFields
29 {
30 ComponentRef,
31 Name,
32 Domain,
33 Password,
34 Attributes,
35 }
36
37 public class UserSymbol : IntermediateSymbol
38 {
39 public UserSymbol() : base(UtilSymbolDefinitions.User, null, null)
40 {
41 }
42
43 public UserSymbol(SourceLineNumber sourceLineNumber, Identifier id = null) : base(UtilSymbolDefinitions.User, sourceLineNumber, id)
44 {
45 }
46
47 public IntermediateField this[UserSymbolFields index] => this.Fields[(int)index];
48
49 public string ComponentRef
50 {
51 get => this.Fields[(int)UserSymbolFields.ComponentRef].AsString();
52 set => this.Set((int)UserSymbolFields.ComponentRef, value);
53 }
54
55 public string Name
56 {
57 get => this.Fields[(int)UserSymbolFields.Name].AsString();
58 set => this.Set((int)UserSymbolFields.Name, value);
59 }
60
61 public string Domain
62 {
63 get => this.Fields[(int)UserSymbolFields.Domain].AsString();
64 set => this.Set((int)UserSymbolFields.Domain, value);
65 }
66
67 public string Password
68 {
69 get => this.Fields[(int)UserSymbolFields.Password].AsString();
70 set => this.Set((int)UserSymbolFields.Password, value);
71 }
72
73 public int Attributes
74 {
75 get => this.Fields[(int)UserSymbolFields.Attributes].AsNumber();
76 set => this.Set((int)UserSymbolFields.Attributes, value);
77 }
78 }
79} \ No newline at end of file
diff --git a/src/ext/Util/wixext/Symbols/UtilSymbolDefinitions.cs b/src/ext/Util/wixext/Symbols/UtilSymbolDefinitions.cs
new file mode 100644
index 00000000..72091c3b
--- /dev/null
+++ b/src/ext/Util/wixext/Symbols/UtilSymbolDefinitions.cs
@@ -0,0 +1,125 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Util
4{
5 using System;
6 using WixToolset.Data;
7 using WixToolset.Data.Burn;
8
9 public enum UtilSymbolDefinitionType
10 {
11 EventManifest,
12 FileShare,
13 FileSharePermissions,
14 Group,
15 Perfmon,
16 PerfmonManifest,
17 PerformanceCategory,
18 SecureObjects,
19 ServiceConfig,
20 User,
21 UserGroup,
22 WixCloseApplication,
23 WixFormatFiles,
24 WixInternetShortcut,
25 WixRemoveFolderEx,
26 WixRemoveRegistryKeyEx,
27 WixRestartResource,
28 WixTouchFile,
29 WixWindowsFeatureSearch,
30 XmlConfig,
31 XmlFile,
32 }
33
34 public static partial class UtilSymbolDefinitions
35 {
36 public static readonly Version Version = new Version("4.0.0");
37
38 public static IntermediateSymbolDefinition ByName(string name)
39 {
40 if (!Enum.TryParse(name, out UtilSymbolDefinitionType type))
41 {
42 return null;
43 }
44
45 return ByType(type);
46 }
47
48 public static IntermediateSymbolDefinition ByType(UtilSymbolDefinitionType type)
49 {
50 switch (type)
51 {
52 case UtilSymbolDefinitionType.EventManifest:
53 return UtilSymbolDefinitions.EventManifest;
54
55 case UtilSymbolDefinitionType.FileShare:
56 return UtilSymbolDefinitions.FileShare;
57
58 case UtilSymbolDefinitionType.FileSharePermissions:
59 return UtilSymbolDefinitions.FileSharePermissions;
60
61 case UtilSymbolDefinitionType.Group:
62 return UtilSymbolDefinitions.Group;
63
64 case UtilSymbolDefinitionType.Perfmon:
65 return UtilSymbolDefinitions.Perfmon;
66
67 case UtilSymbolDefinitionType.PerfmonManifest:
68 return UtilSymbolDefinitions.PerfmonManifest;
69
70 case UtilSymbolDefinitionType.PerformanceCategory:
71 return UtilSymbolDefinitions.PerformanceCategory;
72
73 case UtilSymbolDefinitionType.SecureObjects:
74 return UtilSymbolDefinitions.SecureObjects;
75
76 case UtilSymbolDefinitionType.ServiceConfig:
77 return UtilSymbolDefinitions.ServiceConfig;
78
79 case UtilSymbolDefinitionType.User:
80 return UtilSymbolDefinitions.User;
81
82 case UtilSymbolDefinitionType.UserGroup:
83 return UtilSymbolDefinitions.UserGroup;
84
85 case UtilSymbolDefinitionType.WixCloseApplication:
86 return UtilSymbolDefinitions.WixCloseApplication;
87
88 case UtilSymbolDefinitionType.WixFormatFiles:
89 return UtilSymbolDefinitions.WixFormatFiles;
90
91 case UtilSymbolDefinitionType.WixInternetShortcut:
92 return UtilSymbolDefinitions.WixInternetShortcut;
93
94 case UtilSymbolDefinitionType.WixRemoveFolderEx:
95 return UtilSymbolDefinitions.WixRemoveFolderEx;
96
97 case UtilSymbolDefinitionType.WixRemoveRegistryKeyEx:
98 return UtilSymbolDefinitions.WixRemoveRegistryKeyEx;
99
100 case UtilSymbolDefinitionType.WixRestartResource:
101 return UtilSymbolDefinitions.WixRestartResource;
102
103 case UtilSymbolDefinitionType.WixTouchFile:
104 return UtilSymbolDefinitions.WixTouchFile;
105
106 case UtilSymbolDefinitionType.WixWindowsFeatureSearch:
107 return UtilSymbolDefinitions.WixWindowsFeatureSearch;
108
109 case UtilSymbolDefinitionType.XmlConfig:
110 return UtilSymbolDefinitions.XmlConfig;
111
112 case UtilSymbolDefinitionType.XmlFile:
113 return UtilSymbolDefinitions.XmlFile;
114
115 default:
116 throw new ArgumentOutOfRangeException(nameof(type));
117 }
118 }
119
120 static UtilSymbolDefinitions()
121 {
122 WixWindowsFeatureSearch.AddTag(BurnConstants.BundleExtensionSearchSymbolDefinitionTag);
123 }
124 }
125}
diff --git a/src/ext/Util/wixext/Symbols/WixCloseApplicationSymbol.cs b/src/ext/Util/wixext/Symbols/WixCloseApplicationSymbol.cs
new file mode 100644
index 00000000..0738e3e4
--- /dev/null
+++ b/src/ext/Util/wixext/Symbols/WixCloseApplicationSymbol.cs
@@ -0,0 +1,103 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Util
4{
5 using WixToolset.Data;
6 using WixToolset.Util.Symbols;
7
8 public static partial class UtilSymbolDefinitions
9 {
10 public static readonly IntermediateSymbolDefinition WixCloseApplication = new IntermediateSymbolDefinition(
11 UtilSymbolDefinitionType.WixCloseApplication.ToString(),
12 new[]
13 {
14 new IntermediateFieldDefinition(nameof(WixCloseApplicationSymbolFields.Target), IntermediateFieldType.String),
15 new IntermediateFieldDefinition(nameof(WixCloseApplicationSymbolFields.Description), IntermediateFieldType.String),
16 new IntermediateFieldDefinition(nameof(WixCloseApplicationSymbolFields.Condition), IntermediateFieldType.String),
17 new IntermediateFieldDefinition(nameof(WixCloseApplicationSymbolFields.Attributes), IntermediateFieldType.Number),
18 new IntermediateFieldDefinition(nameof(WixCloseApplicationSymbolFields.Sequence), IntermediateFieldType.Number),
19 new IntermediateFieldDefinition(nameof(WixCloseApplicationSymbolFields.Property), IntermediateFieldType.String),
20 new IntermediateFieldDefinition(nameof(WixCloseApplicationSymbolFields.TerminateExitCode), IntermediateFieldType.Number),
21 new IntermediateFieldDefinition(nameof(WixCloseApplicationSymbolFields.Timeout), IntermediateFieldType.Number),
22 },
23 typeof(WixCloseApplicationSymbol));
24 }
25}
26
27namespace WixToolset.Util.Symbols
28{
29 using WixToolset.Data;
30
31 public enum WixCloseApplicationSymbolFields
32 {
33 Target,
34 Description,
35 Condition,
36 Attributes,
37 Sequence,
38 Property,
39 TerminateExitCode,
40 Timeout,
41 }
42
43 public class WixCloseApplicationSymbol : IntermediateSymbol
44 {
45 public WixCloseApplicationSymbol() : base(UtilSymbolDefinitions.WixCloseApplication, null, null)
46 {
47 }
48
49 public WixCloseApplicationSymbol(SourceLineNumber sourceLineNumber, Identifier id = null) : base(UtilSymbolDefinitions.WixCloseApplication, sourceLineNumber, id)
50 {
51 }
52
53 public IntermediateField this[WixCloseApplicationSymbolFields index] => this.Fields[(int)index];
54
55 public string Target
56 {
57 get => this.Fields[(int)WixCloseApplicationSymbolFields.Target].AsString();
58 set => this.Set((int)WixCloseApplicationSymbolFields.Target, value);
59 }
60
61 public string Description
62 {
63 get => this.Fields[(int)WixCloseApplicationSymbolFields.Description].AsString();
64 set => this.Set((int)WixCloseApplicationSymbolFields.Description, value);
65 }
66
67 public string Condition
68 {
69 get => this.Fields[(int)WixCloseApplicationSymbolFields.Condition].AsString();
70 set => this.Set((int)WixCloseApplicationSymbolFields.Condition, value);
71 }
72
73 public int Attributes
74 {
75 get => this.Fields[(int)WixCloseApplicationSymbolFields.Attributes].AsNumber();
76 set => this.Set((int)WixCloseApplicationSymbolFields.Attributes, value);
77 }
78
79 public int? Sequence
80 {
81 get => this.Fields[(int)WixCloseApplicationSymbolFields.Sequence].AsNullableNumber();
82 set => this.Set((int)WixCloseApplicationSymbolFields.Sequence, value);
83 }
84
85 public string Property
86 {
87 get => this.Fields[(int)WixCloseApplicationSymbolFields.Property].AsString();
88 set => this.Set((int)WixCloseApplicationSymbolFields.Property, value);
89 }
90
91 public int? TerminateExitCode
92 {
93 get => this.Fields[(int)WixCloseApplicationSymbolFields.TerminateExitCode].AsNullableNumber();
94 set => this.Set((int)WixCloseApplicationSymbolFields.TerminateExitCode, value);
95 }
96
97 public int? Timeout
98 {
99 get => this.Fields[(int)WixCloseApplicationSymbolFields.Timeout].AsNullableNumber();
100 set => this.Set((int)WixCloseApplicationSymbolFields.Timeout, value);
101 }
102 }
103} \ No newline at end of file
diff --git a/src/ext/Util/wixext/Symbols/WixFormatFilesSymbol.cs b/src/ext/Util/wixext/Symbols/WixFormatFilesSymbol.cs
new file mode 100644
index 00000000..38a9b8ff
--- /dev/null
+++ b/src/ext/Util/wixext/Symbols/WixFormatFilesSymbol.cs
@@ -0,0 +1,55 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Util
4{
5 using WixToolset.Data;
6 using WixToolset.Util.Symbols;
7
8 public static partial class UtilSymbolDefinitions
9 {
10 public static readonly IntermediateSymbolDefinition WixFormatFiles = new IntermediateSymbolDefinition(
11 UtilSymbolDefinitionType.WixFormatFiles.ToString(),
12 new[]
13 {
14 new IntermediateFieldDefinition(nameof(WixFormatFilesSymbolFields.BinaryRef), IntermediateFieldType.String),
15 new IntermediateFieldDefinition(nameof(WixFormatFilesSymbolFields.FileRef), IntermediateFieldType.String),
16 },
17 typeof(WixFormatFilesSymbol));
18 }
19}
20
21namespace WixToolset.Util.Symbols
22{
23 using WixToolset.Data;
24
25 public enum WixFormatFilesSymbolFields
26 {
27 BinaryRef,
28 FileRef,
29 }
30
31 public class WixFormatFilesSymbol : IntermediateSymbol
32 {
33 public WixFormatFilesSymbol() : base(UtilSymbolDefinitions.WixFormatFiles, null, null)
34 {
35 }
36
37 public WixFormatFilesSymbol(SourceLineNumber sourceLineNumber, Identifier id = null) : base(UtilSymbolDefinitions.WixFormatFiles, sourceLineNumber, id)
38 {
39 }
40
41 public IntermediateField this[WixFormatFilesSymbolFields index] => this.Fields[(int)index];
42
43 public string BinaryRef
44 {
45 get => this.Fields[(int)WixFormatFilesSymbolFields.BinaryRef].AsString();
46 set => this.Set((int)WixFormatFilesSymbolFields.BinaryRef, value);
47 }
48
49 public string FileRef
50 {
51 get => this.Fields[(int)WixFormatFilesSymbolFields.FileRef].AsString();
52 set => this.Set((int)WixFormatFilesSymbolFields.FileRef, value);
53 }
54 }
55} \ No newline at end of file
diff --git a/src/ext/Util/wixext/Symbols/WixInternetShortcutSymbol.cs b/src/ext/Util/wixext/Symbols/WixInternetShortcutSymbol.cs
new file mode 100644
index 00000000..e8265e02
--- /dev/null
+++ b/src/ext/Util/wixext/Symbols/WixInternetShortcutSymbol.cs
@@ -0,0 +1,95 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Util
4{
5 using WixToolset.Data;
6 using WixToolset.Util.Symbols;
7
8 public static partial class UtilSymbolDefinitions
9 {
10 public static readonly IntermediateSymbolDefinition WixInternetShortcut = new IntermediateSymbolDefinition(
11 UtilSymbolDefinitionType.WixInternetShortcut.ToString(),
12 new[]
13 {
14 new IntermediateFieldDefinition(nameof(WixInternetShortcutSymbolFields.ComponentRef), IntermediateFieldType.String),
15 new IntermediateFieldDefinition(nameof(WixInternetShortcutSymbolFields.DirectoryRef), IntermediateFieldType.String),
16 new IntermediateFieldDefinition(nameof(WixInternetShortcutSymbolFields.Name), IntermediateFieldType.String),
17 new IntermediateFieldDefinition(nameof(WixInternetShortcutSymbolFields.Target), IntermediateFieldType.String),
18 new IntermediateFieldDefinition(nameof(WixInternetShortcutSymbolFields.Attributes), IntermediateFieldType.Number),
19 new IntermediateFieldDefinition(nameof(WixInternetShortcutSymbolFields.IconFile), IntermediateFieldType.String),
20 new IntermediateFieldDefinition(nameof(WixInternetShortcutSymbolFields.IconIndex), IntermediateFieldType.Number),
21 },
22 typeof(WixInternetShortcutSymbol));
23 }
24}
25
26namespace WixToolset.Util.Symbols
27{
28 using WixToolset.Data;
29
30 public enum WixInternetShortcutSymbolFields
31 {
32 ComponentRef,
33 DirectoryRef,
34 Name,
35 Target,
36 Attributes,
37 IconFile,
38 IconIndex,
39 }
40
41 public class WixInternetShortcutSymbol : IntermediateSymbol
42 {
43 public WixInternetShortcutSymbol() : base(UtilSymbolDefinitions.WixInternetShortcut, null, null)
44 {
45 }
46
47 public WixInternetShortcutSymbol(SourceLineNumber sourceLineNumber, Identifier id = null) : base(UtilSymbolDefinitions.WixInternetShortcut, sourceLineNumber, id)
48 {
49 }
50
51 public IntermediateField this[WixInternetShortcutSymbolFields index] => this.Fields[(int)index];
52
53 public string ComponentRef
54 {
55 get => this.Fields[(int)WixInternetShortcutSymbolFields.ComponentRef].AsString();
56 set => this.Set((int)WixInternetShortcutSymbolFields.ComponentRef, value);
57 }
58
59 public string DirectoryRef
60 {
61 get => this.Fields[(int)WixInternetShortcutSymbolFields.DirectoryRef].AsString();
62 set => this.Set((int)WixInternetShortcutSymbolFields.DirectoryRef, value);
63 }
64
65 public string Name
66 {
67 get => this.Fields[(int)WixInternetShortcutSymbolFields.Name].AsString();
68 set => this.Set((int)WixInternetShortcutSymbolFields.Name, value);
69 }
70
71 public string Target
72 {
73 get => this.Fields[(int)WixInternetShortcutSymbolFields.Target].AsString();
74 set => this.Set((int)WixInternetShortcutSymbolFields.Target, value);
75 }
76
77 public int Attributes
78 {
79 get => this.Fields[(int)WixInternetShortcutSymbolFields.Attributes].AsNumber();
80 set => this.Set((int)WixInternetShortcutSymbolFields.Attributes, value);
81 }
82
83 public string IconFile
84 {
85 get => this.Fields[(int)WixInternetShortcutSymbolFields.IconFile].AsString();
86 set => this.Set((int)WixInternetShortcutSymbolFields.IconFile, value);
87 }
88
89 public int? IconIndex
90 {
91 get => this.Fields[(int)WixInternetShortcutSymbolFields.IconIndex].AsNullableNumber();
92 set => this.Set((int)WixInternetShortcutSymbolFields.IconIndex, value);
93 }
94 }
95} \ No newline at end of file
diff --git a/src/ext/Util/wixext/Symbols/WixRemoveFolderExSymbol.cs b/src/ext/Util/wixext/Symbols/WixRemoveFolderExSymbol.cs
new file mode 100644
index 00000000..86352b6c
--- /dev/null
+++ b/src/ext/Util/wixext/Symbols/WixRemoveFolderExSymbol.cs
@@ -0,0 +1,78 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Util
4{
5 using WixToolset.Data;
6 using WixToolset.Util.Symbols;
7
8 public static partial class UtilSymbolDefinitions
9 {
10 public static readonly IntermediateSymbolDefinition WixRemoveFolderEx = new IntermediateSymbolDefinition(
11 UtilSymbolDefinitionType.WixRemoveFolderEx.ToString(),
12 new[]
13 {
14 new IntermediateFieldDefinition(nameof(WixRemoveFolderExSymbolFields.ComponentRef), IntermediateFieldType.String),
15 new IntermediateFieldDefinition(nameof(WixRemoveFolderExSymbolFields.Property), IntermediateFieldType.String),
16 new IntermediateFieldDefinition(nameof(WixRemoveFolderExSymbolFields.InstallMode), IntermediateFieldType.Number),
17 new IntermediateFieldDefinition(nameof(WixRemoveFolderExSymbolFields.Condition), IntermediateFieldType.String),
18 },
19 typeof(WixRemoveFolderExSymbol));
20 }
21}
22
23namespace WixToolset.Util.Symbols
24{
25 using WixToolset.Data;
26
27 public enum WixRemoveFolderExSymbolFields
28 {
29 ComponentRef,
30 Property,
31 InstallMode,
32 Condition,
33 }
34
35 public enum WixRemoveFolderExInstallMode
36 {
37 Install = 1,
38 Uninstall = 2,
39 Both = 3,
40 }
41
42 public class WixRemoveFolderExSymbol : IntermediateSymbol
43 {
44 public WixRemoveFolderExSymbol() : base(UtilSymbolDefinitions.WixRemoveFolderEx, null, null)
45 {
46 }
47
48 public WixRemoveFolderExSymbol(SourceLineNumber sourceLineNumber, Identifier id = null) : base(UtilSymbolDefinitions.WixRemoveFolderEx, sourceLineNumber, id)
49 {
50 }
51
52 public IntermediateField this[WixRemoveFolderExSymbolFields index] => this.Fields[(int)index];
53
54 public string ComponentRef
55 {
56 get => this.Fields[(int)WixRemoveFolderExSymbolFields.ComponentRef].AsString();
57 set => this.Set((int)WixRemoveFolderExSymbolFields.ComponentRef, value);
58 }
59
60 public string Property
61 {
62 get => this.Fields[(int)WixRemoveFolderExSymbolFields.Property].AsString();
63 set => this.Set((int)WixRemoveFolderExSymbolFields.Property, value);
64 }
65
66 public WixRemoveFolderExInstallMode InstallMode
67 {
68 get => (WixRemoveFolderExInstallMode)this.Fields[(int)WixRemoveFolderExSymbolFields.InstallMode].AsNumber();
69 set => this.Set((int)WixRemoveFolderExSymbolFields.InstallMode, (int)value);
70 }
71
72 public string Condition
73 {
74 get => this.Fields[(int)WixRemoveFolderExSymbolFields.Condition].AsString();
75 set => this.Set((int)WixRemoveFolderExSymbolFields.Condition, value);
76 }
77 }
78} \ No newline at end of file
diff --git a/src/ext/Util/wixext/Symbols/WixRemoveRegistryKeyExSymbol.cs b/src/ext/Util/wixext/Symbols/WixRemoveRegistryKeyExSymbol.cs
new file mode 100644
index 00000000..8e4bd212
--- /dev/null
+++ b/src/ext/Util/wixext/Symbols/WixRemoveRegistryKeyExSymbol.cs
@@ -0,0 +1,86 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Util
4{
5 using WixToolset.Data;
6 using WixToolset.Util.Symbols;
7
8 public static partial class UtilSymbolDefinitions
9 {
10 public static readonly IntermediateSymbolDefinition WixRemoveRegistryKeyEx = new IntermediateSymbolDefinition(
11 UtilSymbolDefinitionType.WixRemoveRegistryKeyEx.ToString(),
12 new[]
13 {
14 new IntermediateFieldDefinition(nameof(WixRemoveRegistryKeyExSymbolFields.ComponentRef), IntermediateFieldType.String),
15 new IntermediateFieldDefinition(nameof(WixRemoveRegistryKeyExSymbolFields.Root), IntermediateFieldType.Number),
16 new IntermediateFieldDefinition(nameof(WixRemoveRegistryKeyExSymbolFields.Key), IntermediateFieldType.String),
17 new IntermediateFieldDefinition(nameof(WixRemoveRegistryKeyExSymbolFields.InstallMode), IntermediateFieldType.Number),
18 new IntermediateFieldDefinition(nameof(WixRemoveRegistryKeyExSymbolFields.Condition), IntermediateFieldType.String),
19 },
20 typeof(WixRemoveRegistryKeyExSymbol));
21 }
22}
23
24namespace WixToolset.Util.Symbols
25{
26 using WixToolset.Data;
27 using WixToolset.Data.Symbols;
28
29 public enum WixRemoveRegistryKeyExSymbolFields
30 {
31 ComponentRef,
32 Root,
33 Key,
34 InstallMode,
35 Condition,
36 }
37
38 public enum WixRemoveRegistryKeyExInstallMode
39 {
40 Install = 1,
41 Uninstall = 2,
42 }
43
44 public class WixRemoveRegistryKeyExSymbol : IntermediateSymbol
45 {
46 public WixRemoveRegistryKeyExSymbol() : base(UtilSymbolDefinitions.WixRemoveRegistryKeyEx, null, null)
47 {
48 }
49
50 public WixRemoveRegistryKeyExSymbol(SourceLineNumber sourceLineNumber, Identifier id = null) : base(UtilSymbolDefinitions.WixRemoveRegistryKeyEx, sourceLineNumber, id)
51 {
52 }
53
54 public IntermediateField this[WixRemoveRegistryKeyExSymbolFields index] => this.Fields[(int)index];
55
56 public string ComponentRef
57 {
58 get => this.Fields[(int)WixRemoveRegistryKeyExSymbolFields.ComponentRef].AsString();
59 set => this.Set((int)WixRemoveRegistryKeyExSymbolFields.ComponentRef, value);
60 }
61
62 public RegistryRootType Root
63 {
64 get => (RegistryRootType)this.Fields[(int)WixRemoveRegistryKeyExSymbolFields.Root].AsNumber();
65 set => this.Set((int)WixRemoveRegistryKeyExSymbolFields.Root, (int)value);
66 }
67
68 public string Key
69 {
70 get => (string)this.Fields[(int)WixRemoveRegistryKeyExSymbolFields.Key];
71 set => this.Set((int)WixRemoveRegistryKeyExSymbolFields.Key, value);
72 }
73
74 public WixRemoveRegistryKeyExInstallMode InstallMode
75 {
76 get => (WixRemoveRegistryKeyExInstallMode)this.Fields[(int)WixRemoveRegistryKeyExSymbolFields.InstallMode].AsNumber();
77 set => this.Set((int)WixRemoveRegistryKeyExSymbolFields.InstallMode, (int)value);
78 }
79
80 public string Condition
81 {
82 get => this.Fields[(int)WixRemoveRegistryKeyExSymbolFields.Condition].AsString();
83 set => this.Set((int)WixRemoveRegistryKeyExSymbolFields.Condition, value);
84 }
85 }
86}
diff --git a/src/ext/Util/wixext/Symbols/WixRestartResourceSymbol.cs b/src/ext/Util/wixext/Symbols/WixRestartResourceSymbol.cs
new file mode 100644
index 00000000..01b92b63
--- /dev/null
+++ b/src/ext/Util/wixext/Symbols/WixRestartResourceSymbol.cs
@@ -0,0 +1,71 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Util
4{
5 using WixToolset.Data;
6 using WixToolset.Util.Symbols;
7
8 public static partial class UtilSymbolDefinitions
9 {
10 public static readonly IntermediateSymbolDefinition WixRestartResource = new IntermediateSymbolDefinition(
11 UtilSymbolDefinitionType.WixRestartResource.ToString(),
12 new[]
13 {
14 new IntermediateFieldDefinition(nameof(WixRestartResourceSymbolFields.ComponentRef), IntermediateFieldType.String),
15 new IntermediateFieldDefinition(nameof(WixRestartResourceSymbolFields.Resource), IntermediateFieldType.String),
16 new IntermediateFieldDefinition(nameof(WixRestartResourceSymbolFields.Attributes), IntermediateFieldType.Number),
17 },
18 typeof(WixRestartResourceSymbol));
19 }
20}
21
22namespace WixToolset.Util.Symbols
23{
24 using WixToolset.Data;
25
26 public enum WixRestartResourceSymbolFields
27 {
28 ComponentRef,
29 Resource,
30 Attributes,
31 }
32
33 public enum WixRestartResourceAttributes
34 {
35 Filename = 1,
36 ProcessName,
37 ServiceName,
38 TypeMask = 0xf,
39 }
40
41 public class WixRestartResourceSymbol : IntermediateSymbol
42 {
43 public WixRestartResourceSymbol() : base(UtilSymbolDefinitions.WixRestartResource, null, null)
44 {
45 }
46
47 public WixRestartResourceSymbol(SourceLineNumber sourceLineNumber, Identifier id = null) : base(UtilSymbolDefinitions.WixRestartResource, sourceLineNumber, id)
48 {
49 }
50
51 public IntermediateField this[WixRestartResourceSymbolFields index] => this.Fields[(int)index];
52
53 public string ComponentRef
54 {
55 get => this.Fields[(int)WixRestartResourceSymbolFields.ComponentRef].AsString();
56 set => this.Set((int)WixRestartResourceSymbolFields.ComponentRef, value);
57 }
58
59 public string Resource
60 {
61 get => this.Fields[(int)WixRestartResourceSymbolFields.Resource].AsString();
62 set => this.Set((int)WixRestartResourceSymbolFields.Resource, value);
63 }
64
65 public WixRestartResourceAttributes? Attributes
66 {
67 get => (WixRestartResourceAttributes?)this.Fields[(int)WixRestartResourceSymbolFields.Attributes].AsNullableNumber();
68 set => this.Set((int)WixRestartResourceSymbolFields.Attributes, (int?)value);
69 }
70 }
71} \ No newline at end of file
diff --git a/src/ext/Util/wixext/Symbols/WixTouchFileSymbol.cs b/src/ext/Util/wixext/Symbols/WixTouchFileSymbol.cs
new file mode 100644
index 00000000..447c21ba
--- /dev/null
+++ b/src/ext/Util/wixext/Symbols/WixTouchFileSymbol.cs
@@ -0,0 +1,63 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Util
4{
5 using WixToolset.Data;
6 using WixToolset.Util.Symbols;
7
8 public static partial class UtilSymbolDefinitions
9 {
10 public static readonly IntermediateSymbolDefinition WixTouchFile = new IntermediateSymbolDefinition(
11 UtilSymbolDefinitionType.WixTouchFile.ToString(),
12 new[]
13 {
14 new IntermediateFieldDefinition(nameof(WixTouchFileSymbolFields.ComponentRef), IntermediateFieldType.String),
15 new IntermediateFieldDefinition(nameof(WixTouchFileSymbolFields.Path), IntermediateFieldType.String),
16 new IntermediateFieldDefinition(nameof(WixTouchFileSymbolFields.Attributes), IntermediateFieldType.Number),
17 },
18 typeof(WixTouchFileSymbol));
19 }
20}
21
22namespace WixToolset.Util.Symbols
23{
24 using WixToolset.Data;
25
26 public enum WixTouchFileSymbolFields
27 {
28 ComponentRef,
29 Path,
30 Attributes,
31 }
32
33 public class WixTouchFileSymbol : IntermediateSymbol
34 {
35 public WixTouchFileSymbol() : base(UtilSymbolDefinitions.WixTouchFile, null, null)
36 {
37 }
38
39 public WixTouchFileSymbol(SourceLineNumber sourceLineNumber, Identifier id = null) : base(UtilSymbolDefinitions.WixTouchFile, sourceLineNumber, id)
40 {
41 }
42
43 public IntermediateField this[WixTouchFileSymbolFields index] => this.Fields[(int)index];
44
45 public string ComponentRef
46 {
47 get => this.Fields[(int)WixTouchFileSymbolFields.ComponentRef].AsString();
48 set => this.Set((int)WixTouchFileSymbolFields.ComponentRef, value);
49 }
50
51 public string Path
52 {
53 get => this.Fields[(int)WixTouchFileSymbolFields.Path].AsString();
54 set => this.Set((int)WixTouchFileSymbolFields.Path, value);
55 }
56
57 public int Attributes
58 {
59 get => this.Fields[(int)WixTouchFileSymbolFields.Attributes].AsNumber();
60 set => this.Set((int)WixTouchFileSymbolFields.Attributes, value);
61 }
62 }
63} \ No newline at end of file
diff --git a/src/ext/Util/wixext/Symbols/WixWindowsFeatureSearchSymbol.cs b/src/ext/Util/wixext/Symbols/WixWindowsFeatureSearchSymbol.cs
new file mode 100644
index 00000000..9a43692c
--- /dev/null
+++ b/src/ext/Util/wixext/Symbols/WixWindowsFeatureSearchSymbol.cs
@@ -0,0 +1,47 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Util
4{
5 using WixToolset.Data;
6 using WixToolset.Util.Symbols;
7
8 public static partial class UtilSymbolDefinitions
9 {
10 public static readonly IntermediateSymbolDefinition WixWindowsFeatureSearch = new IntermediateSymbolDefinition(
11 UtilSymbolDefinitionType.WixWindowsFeatureSearch.ToString(),
12 new[]
13 {
14 new IntermediateFieldDefinition(nameof(WixWindowsFeatureSearchSymbolFields.Type), IntermediateFieldType.String),
15 },
16 typeof(WixWindowsFeatureSearchSymbol));
17 }
18}
19
20namespace WixToolset.Util.Symbols
21{
22 using WixToolset.Data;
23
24 public enum WixWindowsFeatureSearchSymbolFields
25 {
26 Type,
27 }
28
29 public class WixWindowsFeatureSearchSymbol : IntermediateSymbol
30 {
31 public WixWindowsFeatureSearchSymbol() : base(UtilSymbolDefinitions.WixWindowsFeatureSearch, null, null)
32 {
33 }
34
35 public WixWindowsFeatureSearchSymbol(SourceLineNumber sourceLineNumber, Identifier id = null) : base(UtilSymbolDefinitions.WixWindowsFeatureSearch, sourceLineNumber, id)
36 {
37 }
38
39 public IntermediateField this[WixWindowsFeatureSearchSymbolFields index] => this.Fields[(int)index];
40
41 public string Type
42 {
43 get => this.Fields[(int)WixWindowsFeatureSearchSymbolFields.Type].AsString();
44 set => this.Set((int)WixWindowsFeatureSearchSymbolFields.Type, value);
45 }
46 }
47}
diff --git a/src/ext/Util/wixext/Symbols/XmlConfigSymbol.cs b/src/ext/Util/wixext/Symbols/XmlConfigSymbol.cs
new file mode 100644
index 00000000..6503a586
--- /dev/null
+++ b/src/ext/Util/wixext/Symbols/XmlConfigSymbol.cs
@@ -0,0 +1,111 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Util
4{
5 using WixToolset.Data;
6 using WixToolset.Util.Symbols;
7
8 public static partial class UtilSymbolDefinitions
9 {
10 public static readonly IntermediateSymbolDefinition XmlConfig = new IntermediateSymbolDefinition(
11 UtilSymbolDefinitionType.XmlConfig.ToString(),
12 new[]
13 {
14 new IntermediateFieldDefinition(nameof(XmlConfigSymbolFields.File), IntermediateFieldType.String),
15 new IntermediateFieldDefinition(nameof(XmlConfigSymbolFields.ElementId), IntermediateFieldType.String),
16 new IntermediateFieldDefinition(nameof(XmlConfigSymbolFields.ElementPath), IntermediateFieldType.String),
17 new IntermediateFieldDefinition(nameof(XmlConfigSymbolFields.VerifyPath), IntermediateFieldType.String),
18 new IntermediateFieldDefinition(nameof(XmlConfigSymbolFields.Name), IntermediateFieldType.String),
19 new IntermediateFieldDefinition(nameof(XmlConfigSymbolFields.Value), IntermediateFieldType.String),
20 new IntermediateFieldDefinition(nameof(XmlConfigSymbolFields.Flags), IntermediateFieldType.Number),
21 new IntermediateFieldDefinition(nameof(XmlConfigSymbolFields.ComponentRef), IntermediateFieldType.String),
22 new IntermediateFieldDefinition(nameof(XmlConfigSymbolFields.Sequence), IntermediateFieldType.Number),
23 },
24 typeof(XmlConfigSymbol));
25 }
26}
27
28namespace WixToolset.Util.Symbols
29{
30 using WixToolset.Data;
31
32 public enum XmlConfigSymbolFields
33 {
34 File,
35 ElementId,
36 ElementPath,
37 VerifyPath,
38 Name,
39 Value,
40 Flags,
41 ComponentRef,
42 Sequence,
43 }
44
45 public class XmlConfigSymbol : IntermediateSymbol
46 {
47 public XmlConfigSymbol() : base(UtilSymbolDefinitions.XmlConfig, null, null)
48 {
49 }
50
51 public XmlConfigSymbol(SourceLineNumber sourceLineNumber, Identifier id = null) : base(UtilSymbolDefinitions.XmlConfig, sourceLineNumber, id)
52 {
53 }
54
55 public IntermediateField this[XmlConfigSymbolFields index] => this.Fields[(int)index];
56
57 public string File
58 {
59 get => this.Fields[(int)XmlConfigSymbolFields.File].AsString();
60 set => this.Set((int)XmlConfigSymbolFields.File, value);
61 }
62
63 public string ElementId
64 {
65 get => this.Fields[(int)XmlConfigSymbolFields.ElementId].AsString();
66 set => this.Set((int)XmlConfigSymbolFields.ElementId, value);
67 }
68
69 public string ElementPath
70 {
71 get => this.Fields[(int)XmlConfigSymbolFields.ElementPath].AsString();
72 set => this.Set((int)XmlConfigSymbolFields.ElementPath, value);
73 }
74
75 public string VerifyPath
76 {
77 get => this.Fields[(int)XmlConfigSymbolFields.VerifyPath].AsString();
78 set => this.Set((int)XmlConfigSymbolFields.VerifyPath, value);
79 }
80
81 public string Name
82 {
83 get => this.Fields[(int)XmlConfigSymbolFields.Name].AsString();
84 set => this.Set((int)XmlConfigSymbolFields.Name, value);
85 }
86
87 public string Value
88 {
89 get => this.Fields[(int)XmlConfigSymbolFields.Value].AsString();
90 set => this.Set((int)XmlConfigSymbolFields.Value, value);
91 }
92
93 public int Flags
94 {
95 get => this.Fields[(int)XmlConfigSymbolFields.Flags].AsNumber();
96 set => this.Set((int)XmlConfigSymbolFields.Flags, value);
97 }
98
99 public string ComponentRef
100 {
101 get => this.Fields[(int)XmlConfigSymbolFields.ComponentRef].AsString();
102 set => this.Set((int)XmlConfigSymbolFields.ComponentRef, value);
103 }
104
105 public int? Sequence
106 {
107 get => this.Fields[(int)XmlConfigSymbolFields.Sequence].AsNullableNumber();
108 set => this.Set((int)XmlConfigSymbolFields.Sequence, value);
109 }
110 }
111} \ No newline at end of file
diff --git a/src/ext/Util/wixext/Symbols/XmlFileSymbol.cs b/src/ext/Util/wixext/Symbols/XmlFileSymbol.cs
new file mode 100644
index 00000000..7d5d991b
--- /dev/null
+++ b/src/ext/Util/wixext/Symbols/XmlFileSymbol.cs
@@ -0,0 +1,95 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Util
4{
5 using WixToolset.Data;
6 using WixToolset.Util.Symbols;
7
8 public static partial class UtilSymbolDefinitions
9 {
10 public static readonly IntermediateSymbolDefinition XmlFile = new IntermediateSymbolDefinition(
11 UtilSymbolDefinitionType.XmlFile.ToString(),
12 new[]
13 {
14 new IntermediateFieldDefinition(nameof(XmlFileSymbolFields.File), IntermediateFieldType.String),
15 new IntermediateFieldDefinition(nameof(XmlFileSymbolFields.ElementPath), IntermediateFieldType.String),
16 new IntermediateFieldDefinition(nameof(XmlFileSymbolFields.Name), IntermediateFieldType.String),
17 new IntermediateFieldDefinition(nameof(XmlFileSymbolFields.Value), IntermediateFieldType.String),
18 new IntermediateFieldDefinition(nameof(XmlFileSymbolFields.Flags), IntermediateFieldType.Number),
19 new IntermediateFieldDefinition(nameof(XmlFileSymbolFields.ComponentRef), IntermediateFieldType.String),
20 new IntermediateFieldDefinition(nameof(XmlFileSymbolFields.Sequence), IntermediateFieldType.Number),
21 },
22 typeof(XmlFileSymbol));
23 }
24}
25
26namespace WixToolset.Util.Symbols
27{
28 using WixToolset.Data;
29
30 public enum XmlFileSymbolFields
31 {
32 File,
33 ElementPath,
34 Name,
35 Value,
36 Flags,
37 ComponentRef,
38 Sequence,
39 }
40
41 public class XmlFileSymbol : IntermediateSymbol
42 {
43 public XmlFileSymbol() : base(UtilSymbolDefinitions.XmlFile, null, null)
44 {
45 }
46
47 public XmlFileSymbol(SourceLineNumber sourceLineNumber, Identifier id = null) : base(UtilSymbolDefinitions.XmlFile, sourceLineNumber, id)
48 {
49 }
50
51 public IntermediateField this[XmlFileSymbolFields index] => this.Fields[(int)index];
52
53 public string File
54 {
55 get => this.Fields[(int)XmlFileSymbolFields.File].AsString();
56 set => this.Set((int)XmlFileSymbolFields.File, value);
57 }
58
59 public string ElementPath
60 {
61 get => this.Fields[(int)XmlFileSymbolFields.ElementPath].AsString();
62 set => this.Set((int)XmlFileSymbolFields.ElementPath, value);
63 }
64
65 public string Name
66 {
67 get => this.Fields[(int)XmlFileSymbolFields.Name].AsString();
68 set => this.Set((int)XmlFileSymbolFields.Name, value);
69 }
70
71 public string Value
72 {
73 get => this.Fields[(int)XmlFileSymbolFields.Value].AsString();
74 set => this.Set((int)XmlFileSymbolFields.Value, value);
75 }
76
77 public int Flags
78 {
79 get => this.Fields[(int)XmlFileSymbolFields.Flags].AsNumber();
80 set => this.Set((int)XmlFileSymbolFields.Flags, value);
81 }
82
83 public string ComponentRef
84 {
85 get => this.Fields[(int)XmlFileSymbolFields.ComponentRef].AsString();
86 set => this.Set((int)XmlFileSymbolFields.ComponentRef, value);
87 }
88
89 public int? Sequence
90 {
91 get => this.Fields[(int)XmlFileSymbolFields.Sequence].AsNullableNumber();
92 set => this.Set((int)XmlFileSymbolFields.Sequence, value);
93 }
94 }
95} \ No newline at end of file
diff --git a/src/ext/Util/wixext/UtilCompiler.cs b/src/ext/Util/wixext/UtilCompiler.cs
new file mode 100644
index 00000000..45079150
--- /dev/null
+++ b/src/ext/Util/wixext/UtilCompiler.cs
@@ -0,0 +1,3889 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Util
4{
5 using System;
6 using System.Collections;
7 using System.Collections.Generic;
8 using System.Globalization;
9 using System.Linq;
10 using System.Text;
11 using System.Text.RegularExpressions;
12 using System.Xml.Linq;
13 using WixToolset.Data;
14 using WixToolset.Data.Symbols;
15 using WixToolset.Extensibility;
16 using WixToolset.Extensibility.Data;
17 using WixToolset.Util.Symbols;
18
19 /// <summary>
20 /// The compiler for the WiX Toolset Utility Extension.
21 /// </summary>
22 public sealed class UtilCompiler : BaseCompilerExtension
23 {
24 // user creation attributes definitions (from sca.h)
25 internal const int UserDontExpirePasswrd = 0x00000001;
26 internal const int UserPasswdCantChange = 0x00000002;
27 internal const int UserPasswdChangeReqdOnLogin = 0x00000004;
28 internal const int UserDisableAccount = 0x00000008;
29 internal const int UserFailIfExists = 0x00000010;
30 internal const int UserUpdateIfExists = 0x00000020;
31 internal const int UserLogonAsService = 0x00000040;
32 internal const int UserLogonAsBatchJob = 0x00000080;
33
34 internal const int UserDontRemoveOnUninstall = 0x00000100;
35 internal const int UserDontCreateUser = 0x00000200;
36 internal const int UserNonVital = 0x00000400;
37
38 private static readonly Regex FindPropertyBrackets = new Regex(@"\[(?!\\|\])|(?<!\[\\\]|\[\\|\\\[)\]", RegexOptions.ExplicitCapture | RegexOptions.Compiled);
39
40 public override XNamespace Namespace => "http://wixtoolset.org/schemas/v4/wxs/util";
41
42 /// <summary>
43 /// Types of Internet shortcuts.
44 /// </summary>
45 public enum InternetShortcutType
46 {
47 /// <summary>Create a .lnk file.</summary>
48 Link = 0,
49
50 /// <summary>Create a .url file.</summary>
51 Url,
52 }
53
54 /// <summary>
55 /// Types of permission setting methods.
56 /// </summary>
57 private enum PermissionType
58 {
59 /// <summary>LockPermissions (normal) type permission setting.</summary>
60 LockPermissions,
61
62 /// <summary>FileSharePermissions type permission setting.</summary>
63 FileSharePermissions,
64
65 /// <summary>SecureObjects type permission setting.</summary>
66 SecureObjects,
67 }
68
69 /// <summary>
70 /// Processes an element for the Compiler.
71 /// </summary>
72 /// <param name="parentElement">Parent element of element to process.</param>
73 /// <param name="element">Element to process.</param>
74 /// <param name="context">Extra information about the context in which this element is being parsed.</param>
75 public override void ParseElement(Intermediate intermediate, IntermediateSection section, XElement parentElement, XElement element, IDictionary<string, string> context)
76 {
77 this.ParsePossibleKeyPathElement(intermediate, section, parentElement, element, context);
78 }
79
80 /// <summary>
81 /// Processes an element for the Compiler.
82 /// </summary>
83 /// <param name="sourceLineNumbers">Source line number for the parent element.</param>
84 /// <param name="parentElement">Parent element of element to process.</param>
85 /// <param name="element">Element to process.</param>
86 /// <param name="contextValues">Extra information about the context in which this element is being parsed.</param>
87 public override IComponentKeyPath ParsePossibleKeyPathElement(Intermediate intermediate, IntermediateSection section, XElement parentElement, XElement element, IDictionary<string, string> context)
88 {
89 IComponentKeyPath possibleKeyPath = null;
90
91 switch (parentElement.Name.LocalName)
92 {
93 case "CreateFolder":
94 var createFolderId = context["DirectoryId"];
95 var createFolderComponentId = context["ComponentId"];
96
97 // If this doesn't parse successfully, something really odd is going on, so let the exception get thrown
98 var createFolderWin64 = Boolean.Parse(context["Win64"]);
99
100 switch (element.Name.LocalName)
101 {
102 case "PermissionEx":
103 this.ParsePermissionExElement(intermediate, section, element, createFolderId, createFolderComponentId, createFolderWin64, "CreateFolder");
104 break;
105 default:
106 this.ParseHelper.UnexpectedElement(parentElement, element);
107 break;
108 }
109 break;
110 case "Component":
111 var componentId = context["ComponentId"];
112 var directoryId = context["DirectoryId"];
113 var componentWin64 = Boolean.Parse(context["Win64"]);
114
115 switch (element.Name.LocalName)
116 {
117 case "EventSource":
118 possibleKeyPath = this.ParseEventSourceElement(intermediate, section, element, componentId);
119 break;
120 case "FileShare":
121 this.ParseFileShareElement(intermediate, section, element, componentId, directoryId);
122 break;
123 case "InternetShortcut":
124 this.ParseInternetShortcutElement(intermediate, section, element, componentId, directoryId);
125 break;
126 case "PerformanceCategory":
127 this.ParsePerformanceCategoryElement(intermediate, section, element, componentId);
128 break;
129 case "RemoveFolderEx":
130 this.ParseRemoveFolderExElement(intermediate, section, element, componentId);
131 break;
132 case "RemoveRegistryKey":
133 this.ParseRemoveRegistryKeyExElement(intermediate, section, element, componentId);
134 break;
135 case "RestartResource":
136 this.ParseRestartResourceElement(intermediate, section, element, componentId);
137 break;
138 case "ServiceConfig":
139 this.ParseServiceConfigElement(intermediate, section, element, componentId, "Component", null);
140 break;
141 case "TouchFile":
142 this.ParseTouchFileElement(intermediate, section, element, componentId, componentWin64);
143 break;
144 case "User":
145 this.ParseUserElement(intermediate, section, element, componentId);
146 break;
147 case "XmlFile":
148 this.ParseXmlFileElement(intermediate, section, element, componentId);
149 break;
150 case "XmlConfig":
151 this.ParseXmlConfigElement(intermediate, section, element, componentId, false);
152 break;
153 default:
154 this.ParseHelper.UnexpectedElement(parentElement, element);
155 break;
156 }
157 break;
158 case "File":
159 var fileId = context["FileId"];
160 var fileComponentId = context["ComponentId"];
161
162 // If this doesn't parse successfully, something really odd is going on, so let the exception get thrown
163 var fileWin64 = Boolean.Parse(context["Win64"]);
164
165 switch (element.Name.LocalName)
166 {
167 case "PerfCounter":
168 this.ParsePerfCounterElement(intermediate, section, element, fileComponentId, fileId);
169 break;
170 case "PermissionEx":
171 this.ParsePermissionExElement(intermediate, section, element, fileId, fileComponentId, fileWin64, "File");
172 break;
173 case "PerfCounterManifest":
174 this.ParsePerfCounterManifestElement(intermediate, section, element, fileComponentId, fileId);
175 break;
176 case "EventManifest":
177 this.ParseEventManifestElement(intermediate, section, element, fileComponentId, fileId);
178 break;
179 case "FormatFile":
180 this.ParseFormatFileElement(intermediate, section, element, fileId, fileWin64);
181 break;
182 default:
183 this.ParseHelper.UnexpectedElement(parentElement, element);
184 break;
185 }
186 break;
187 case "Bundle":
188 case "Fragment":
189 case "Module":
190 case "Package":
191 switch (element.Name.LocalName)
192 {
193 case "CloseApplication":
194 this.ParseCloseApplicationElement(intermediate, section, element);
195 break;
196 case "Group":
197 this.ParseGroupElement(intermediate, section, element, null);
198 break;
199 case "RestartResource":
200 // Currently not supported for Bundles.
201 if (parentElement.Name.LocalName != "Bundle")
202 {
203 this.ParseRestartResourceElement(intermediate, section, element, null);
204 }
205 else
206 {
207 this.ParseHelper.UnexpectedElement(parentElement, element);
208 }
209 break;
210 case "User":
211 this.ParseUserElement(intermediate, section, element, null);
212 break;
213 case "BroadcastEnvironmentChange":
214 case "BroadcastSettingChange":
215 case "CheckRebootRequired":
216 case "ExitEarlyWithSuccess":
217 case "FailWhenDeferred":
218 case "QueryWindowsDirectories":
219 case "QueryWindowsDriverInfo":
220 case "QueryWindowsSuiteInfo":
221 case "QueryWindowsWellKnownSIDs":
222 case "WaitForEvent":
223 case "WaitForEventDeferred":
224 this.AddCustomActionReference(intermediate, section, element, parentElement);
225 break;
226 case "ComponentSearch":
227 case "ComponentSearchRef":
228 case "DirectorySearch":
229 case "DirectorySearchRef":
230 case "FileSearch":
231 case "FileSearchRef":
232 case "ProductSearch":
233 case "ProductSearchRef":
234 case "RegistrySearch":
235 case "RegistrySearchRef":
236 case "WindowsFeatureSearch":
237 case "WindowsFeatureSearchRef":
238 // These will eventually be supported under Module/Product, but are not yet.
239 if (parentElement.Name.LocalName == "Bundle" || parentElement.Name.LocalName == "Fragment")
240 {
241 // TODO: When these are supported by all section types, move
242 // these out of the nested switch and back into the surrounding one.
243 switch (element.Name.LocalName)
244 {
245 case "ComponentSearch":
246 this.ParseComponentSearchElement(intermediate, section, element);
247 break;
248 case "ComponentSearchRef":
249 this.ParseComponentSearchRefElement(intermediate, section, element);
250 break;
251 case "DirectorySearch":
252 this.ParseDirectorySearchElement(intermediate, section, element);
253 break;
254 case "DirectorySearchRef":
255 this.ParseWixSearchRefElement(intermediate, section, element);
256 break;
257 case "FileSearch":
258 this.ParseFileSearchElement(intermediate, section, element);
259 break;
260 case "FileSearchRef":
261 this.ParseWixSearchRefElement(intermediate, section, element);
262 break;
263 case "ProductSearch":
264 this.ParseProductSearchElement(intermediate, section, element);
265 break;
266 case "ProductSearchRef":
267 this.ParseWixSearchRefElement(intermediate, section, element);
268 break;
269 case "RegistrySearch":
270 this.ParseRegistrySearchElement(intermediate, section, element);
271 break;
272 case "RegistrySearchRef":
273 this.ParseWixSearchRefElement(intermediate, section, element);
274 break;
275 case "WindowsFeatureSearch":
276 this.ParseWindowsFeatureSearchElement(intermediate, section, element);
277 break;
278 case "WindowsFeatureSearchRef":
279 this.ParseWindowsFeatureSearchRefElement(intermediate, section, element);
280 break;
281 }
282 }
283 else
284 {
285 this.ParseHelper.UnexpectedElement(parentElement, element);
286 }
287 break;
288 default:
289 this.ParseHelper.UnexpectedElement(parentElement, element);
290 break;
291 }
292 break;
293 case "Registry":
294 case "RegistryKey":
295 case "RegistryValue":
296 var registryId = context["RegistryId"];
297 var registryComponentId = context["ComponentId"];
298
299 // If this doesn't parse successfully, something really odd is going on, so let the exception get thrown
300 var registryWin64 = Boolean.Parse(context["Win64"]);
301
302 switch (element.Name.LocalName)
303 {
304 case "PermissionEx":
305 this.ParsePermissionExElement(intermediate, section, element, registryId, registryComponentId, registryWin64, "Registry");
306 break;
307 default:
308 this.ParseHelper.UnexpectedElement(parentElement, element);
309 break;
310 }
311 break;
312 case "ServiceInstall":
313 var serviceInstallId = context["ServiceInstallId"];
314 var serviceInstallName = context["ServiceInstallName"];
315 var serviceInstallComponentId = context["ServiceInstallComponentId"];
316
317 // If this doesn't parse successfully, something really odd is going on, so let the exception get thrown
318 var serviceInstallWin64 = Boolean.Parse(context["Win64"]);
319
320 switch (element.Name.LocalName)
321 {
322 case "PermissionEx":
323 this.ParsePermissionExElement(intermediate, section, element, serviceInstallId, serviceInstallComponentId, serviceInstallWin64, "ServiceInstall");
324 break;
325 case "ServiceConfig":
326 this.ParseServiceConfigElement(intermediate, section, element, serviceInstallComponentId, "ServiceInstall", serviceInstallName);
327 break;
328 default:
329 this.ParseHelper.UnexpectedElement(parentElement, element);
330 break;
331 }
332 break;
333 case "UI":
334 switch (element.Name.LocalName)
335 {
336 case "BroadcastEnvironmentChange":
337 case "BroadcastSettingChange":
338 case "CheckRebootRequired":
339 case "ExitEarlyWithSuccess":
340 case "FailWhenDeferred":
341 case "QueryWindowsDirectories":
342 case "QueryWindowsDriverInfo":
343 case "QueryWindowsSuiteInfo":
344 case "QueryWindowsWellKnownSIDs":
345 case "WaitForEvent":
346 case "WaitForEventDeferred":
347 this.AddCustomActionReference(intermediate, section, element, parentElement);
348 break;
349 }
350 break;
351 default:
352 this.ParseHelper.UnexpectedElement(parentElement, element);
353 break;
354 }
355
356 return possibleKeyPath;
357 }
358
359 private void AddCustomActionReference(Intermediate intermediate, IntermediateSection section, XElement element, XElement parentElement)
360 {
361 // These elements are not supported for bundles.
362 if (parentElement.Name.LocalName == "Bundle")
363 {
364 this.ParseHelper.UnexpectedElement(parentElement, element);
365 return;
366 }
367
368 var customAction = element.Name.LocalName;
369 switch (element.Name.LocalName)
370 {
371 case "BroadcastEnvironmentChange":
372 case "BroadcastSettingChange":
373 case "CheckRebootRequired":
374 case "ExitEarlyWithSuccess":
375 case "FailWhenDeferred":
376 case "WaitForEvent":
377 case "WaitForEventDeferred":
378 //default: customAction = element.Name.LocalName;
379 break;
380 case "QueryWindowsDirectories":
381 customAction = "QueryOsDirs";
382 break;
383 case "QueryWindowsDriverInfo":
384 customAction = "QueryOsDriverInfo";
385 break;
386 case "QueryWindowsSuiteInfo":
387 customAction = "QueryOsInfo";
388 break;
389 case "QueryWindowsWellKnownSIDs":
390 customAction = "QueryOsWellKnownSID";
391 break;
392 }
393
394 foreach (var attrib in element.Attributes())
395 {
396 if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || this.Namespace == attrib.Name.Namespace)
397 {
398 // no attributes today
399 }
400 else
401 {
402 this.ParseHelper.ParseExtensionAttribute(this.Context.Extensions, intermediate, section, element, attrib);
403 }
404 }
405
406 var sourceLineNumbers = this.ParseHelper.GetSourceLineNumbers(element);
407
408 this.ParseHelper.ParseForExtensionElements(this.Context.Extensions, intermediate, section, element);
409
410 this.ParseHelper.CreateCustomActionReference(sourceLineNumbers, section, "Wix4" + customAction, this.Context.Platform, CustomActionPlatforms.X86 | CustomActionPlatforms.X64 | CustomActionPlatforms.ARM64);
411 }
412
413 /// <summary>
414 /// Parses the common search attributes shared across all searches.
415 /// </summary>
416 /// <param name="sourceLineNumbers">Source line number for the parent element.</param>
417 /// <param name="attrib">Attribute to parse.</param>
418 /// <param name="id">Value of the Id attribute.</param>
419 /// <param name="variable">Value of the Variable attribute.</param>
420 /// <param name="condition">Value of the Condition attribute.</param>
421 /// <param name="after">Value of the After attribute.</param>
422 private void ParseCommonSearchAttributes(SourceLineNumber sourceLineNumbers, XAttribute attrib, ref Identifier id, ref string variable, ref string condition, ref string after)
423 {
424 switch (attrib.Name.LocalName)
425 {
426 case "Id":
427 id = this.ParseHelper.GetAttributeIdentifier(sourceLineNumbers, attrib);
428 break;
429 case "Variable":
430 variable = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
431 // TODO: handle standard bundle variables
432 break;
433 case "Condition":
434 condition = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
435 break;
436 case "After":
437 after = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
438 break;
439 default:
440 System.Diagnostics.Debug.Assert(false);
441 break;
442 }
443 }
444
445 /// <summary>
446 /// Parses a ComponentSearch element.
447 /// </summary>
448 /// <param name="element">Element to parse.</param>
449 private void ParseComponentSearchElement(Intermediate intermediate, IntermediateSection section, XElement element)
450 {
451 var sourceLineNumbers = this.ParseHelper.GetSourceLineNumbers(element);
452 Identifier id = null;
453 string variable = null;
454 string condition = null;
455 string after = null;
456 string guid = null;
457 string productCode = null;
458 var attributes = WixComponentSearchAttributes.KeyPath;
459
460 foreach (var attrib in element.Attributes())
461 {
462 if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || this.Namespace == attrib.Name.Namespace)
463 {
464 switch (attrib.Name.LocalName)
465 {
466 case "Id":
467 case "Variable":
468 case "Condition":
469 case "After":
470 this.ParseCommonSearchAttributes(sourceLineNumbers, attrib, ref id, ref variable, ref condition, ref after);
471 break;
472 case "Guid":
473 guid = this.ParseHelper.GetAttributeGuidValue(sourceLineNumbers, attrib);
474 break;
475 case "ProductCode":
476 productCode = this.ParseHelper.GetAttributeGuidValue(sourceLineNumbers, attrib);
477 break;
478 case "Result":
479 var result = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
480 switch (result)
481 {
482 case "directory":
483 attributes = WixComponentSearchAttributes.WantDirectory;
484 break;
485 case "keyPath":
486 attributes = WixComponentSearchAttributes.KeyPath;
487 break;
488 case "state":
489 attributes = WixComponentSearchAttributes.State;
490 break;
491 default:
492 this.Messaging.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, attrib.Parent.Name.LocalName, attrib.Name.LocalName, result, "directory", "keyPath", "state"));
493 break;
494 }
495 break;
496 default:
497 this.ParseHelper.UnexpectedAttribute(element, attrib);
498 break;
499 }
500 }
501 else
502 {
503 this.ParseHelper.ParseExtensionAttribute(this.Context.Extensions, intermediate, section, element, attrib);
504 }
505 }
506
507 if (null == guid)
508 {
509 this.Messaging.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, element.Name.LocalName, "Guid"));
510 }
511
512 if (null == id)
513 {
514 id = this.ParseHelper.CreateIdentifier("wcs", variable, condition, after, guid, productCode, attributes.ToString());
515 }
516
517 this.ParseHelper.ParseForExtensionElements(this.Context.Extensions, intermediate, section, element);
518
519 this.ParseHelper.CreateWixSearchSymbol(section, sourceLineNumbers, element.Name.LocalName, id, variable, condition, after, null);
520
521 if (!this.Messaging.EncounteredError)
522 {
523 section.AddSymbol(new WixComponentSearchSymbol(sourceLineNumbers, id)
524 {
525 Guid = guid,
526 ProductCode = productCode,
527 Attributes = attributes,
528 });
529 }
530 }
531
532 /// <summary>
533 /// Parses a ComponentSearchRef element
534 /// </summary>
535 /// <param name="element">Element to parse.</param>
536 private void ParseComponentSearchRefElement(Intermediate intermediate, IntermediateSection section, XElement element)
537 {
538 var sourceLineNumbers = this.ParseHelper.GetSourceLineNumbers(element);
539 string refId = null;
540
541 foreach (var attrib in element.Attributes())
542 {
543 if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || this.Namespace == attrib.Name.Namespace)
544 {
545 switch (attrib.Name.LocalName)
546 {
547 case "Id":
548 refId = this.ParseHelper.GetAttributeIdentifierValue(sourceLineNumbers, attrib);
549 this.ParseHelper.CreateSimpleReference(section, sourceLineNumbers, SymbolDefinitions.WixComponentSearch, refId);
550 break;
551 default:
552 this.ParseHelper.UnexpectedAttribute(element, attrib);
553 break;
554 }
555 }
556 else
557 {
558 this.ParseHelper.ParseExtensionAttribute(this.Context.Extensions, intermediate, section, element, attrib);
559 }
560 }
561
562 this.ParseHelper.ParseForExtensionElements(this.Context.Extensions, intermediate, section, element);
563 }
564
565 /// <summary>
566 /// Parses a WindowsFeatureSearch element.
567 /// </summary>
568 /// <param name="element">Element to parse.</param>
569 private void ParseWindowsFeatureSearchElement(Intermediate intermediate, IntermediateSection section, XElement element)
570 {
571 var sourceLineNumbers = this.ParseHelper.GetSourceLineNumbers(element);
572 Identifier id = null;
573 string variable = null;
574 string condition = null;
575 string after = null;
576 string feature = null;
577
578 foreach (var attrib in element.Attributes())
579 {
580 if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || this.Namespace == attrib.Name.Namespace)
581 {
582 switch (attrib.Name.LocalName)
583 {
584 case "Id":
585 case "Variable":
586 case "Condition":
587 case "After":
588 this.ParseCommonSearchAttributes(sourceLineNumbers, attrib, ref id, ref variable, ref condition, ref after);
589 break;
590 case "Feature":
591 feature = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
592 switch (feature)
593 {
594 case "sha2CodeSigning":
595 break;
596 default:
597 this.Messaging.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, element.Name.LocalName, "Feature", feature, "sha2CodeSigning"));
598 break;
599 }
600 break;
601 default:
602 this.ParseHelper.UnexpectedAttribute(element, attrib);
603 break;
604 }
605 }
606 else
607 {
608 this.ParseHelper.ParseExtensionAttribute(this.Context.Extensions, intermediate, section, element, attrib);
609 }
610 }
611
612 if (id == null)
613 {
614 id = this.ParseHelper.CreateIdentifier("wwfs", variable, condition, after);
615 }
616
617 if (feature == null)
618 {
619 this.Messaging.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, element.Name.LocalName, "Feature"));
620 }
621
622 this.ParseHelper.ParseForExtensionElements(this.Context.Extensions, intermediate, section, element);
623
624 var bundleExtensionId = this.ParseHelper.CreateIdentifierValueFromPlatform("Wix4UtilBundleExtension", this.Context.Platform, BurnPlatforms.X86 | BurnPlatforms.X64 | BurnPlatforms.ARM64);
625 if (bundleExtensionId == null)
626 {
627 this.Messaging.Write(ErrorMessages.UnsupportedPlatformForElement(sourceLineNumbers, this.Context.Platform.ToString(), element.Name.LocalName));
628 }
629
630 this.ParseHelper.CreateWixSearchSymbol(section, sourceLineNumbers, element.Name.LocalName, id, variable, condition, after, bundleExtensionId);
631
632 if (!this.Messaging.EncounteredError)
633 {
634 section.AddSymbol(new WixWindowsFeatureSearchSymbol(sourceLineNumbers, id)
635 {
636 Type = feature,
637 });
638 }
639 }
640
641 /// <summary>
642 /// Parses a WindowsFeatureSearchRef element
643 /// </summary>
644 /// <param name="element">Element to parse.</param>
645 private void ParseWindowsFeatureSearchRefElement(Intermediate intermediate, IntermediateSection section, XElement element)
646 {
647 var sourceLineNumbers = this.ParseHelper.GetSourceLineNumbers(element);
648
649 foreach (var attrib in element.Attributes())
650 {
651 if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || this.Namespace == attrib.Name.Namespace)
652 {
653 switch (attrib.Name.LocalName)
654 {
655 case "Id":
656 var refId = this.ParseHelper.GetAttributeIdentifierValue(sourceLineNumbers, attrib);
657 this.ParseHelper.CreateSimpleReference(section, sourceLineNumbers, UtilSymbolDefinitions.WixWindowsFeatureSearch, refId);
658 break;
659 default:
660 this.ParseHelper.UnexpectedAttribute(element, attrib);
661 break;
662 }
663 }
664 else
665 {
666 this.ParseHelper.ParseExtensionAttribute(this.Context.Extensions, intermediate, section, element, attrib);
667 }
668 }
669
670 this.ParseHelper.ParseForExtensionElements(this.Context.Extensions, intermediate, section, element);
671 }
672
673 /// <summary>
674 /// Parses an event source element.
675 /// </summary>
676 /// <param name="element">Element to parse.</param>
677 /// <param name="componentId">Identifier of parent component.</param>
678 private IComponentKeyPath ParseEventSourceElement(Intermediate intermediate, IntermediateSection section, XElement element, string componentId)
679 {
680 var sourceLineNumbers = this.ParseHelper.GetSourceLineNumbers(element);
681 string sourceName = null;
682 string logName = null;
683 string categoryMessageFile = null;
684 var categoryCount = CompilerConstants.IntegerNotSet;
685 string eventMessageFile = null;
686 string parameterMessageFile = null;
687 int typesSupported = 0;
688 var isKeyPath = false;
689
690 foreach (var attrib in element.Attributes())
691 {
692 if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || this.Namespace == attrib.Name.Namespace)
693 {
694 switch (attrib.Name.LocalName)
695 {
696 case "CategoryCount":
697 categoryCount = this.ParseHelper.GetAttributeIntegerValue(sourceLineNumbers, attrib, 0, Int32.MaxValue);
698 break;
699 case "CategoryMessageFile":
700 categoryMessageFile = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
701 break;
702 case "EventMessageFile":
703 eventMessageFile = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
704 break;
705 case "KeyPath":
706 isKeyPath = YesNoType.Yes == this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib);
707 break;
708 case "Log":
709 logName = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
710 if ("Security" == logName)
711 {
712 this.Messaging.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, element.Name.LocalName, attrib.Name.LocalName, logName, "Application", "System", "<customEventLog>"));
713 }
714 break;
715 case "Name":
716 sourceName = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
717 break;
718 case "ParameterMessageFile":
719 parameterMessageFile = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
720 break;
721 case "SupportsErrors":
722 if (YesNoType.Yes == this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib))
723 {
724 typesSupported |= 0x01; // EVENTLOG_ERROR_TYPE
725 }
726 break;
727 case "SupportsFailureAudits":
728 if (YesNoType.Yes == this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib))
729 {
730 typesSupported |= 0x10; // EVENTLOG_AUDIT_FAILURE
731 }
732 break;
733 case "SupportsInformationals":
734 if (YesNoType.Yes == this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib))
735 {
736 typesSupported |= 0x04; // EVENTLOG_INFORMATION_TYPE
737 }
738 break;
739 case "SupportsSuccessAudits":
740 if (YesNoType.Yes == this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib))
741 {
742 typesSupported |= 0x08; // EVENTLOG_AUDIT_SUCCESS
743 }
744 break;
745 case "SupportsWarnings":
746 if (YesNoType.Yes == this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib))
747 {
748 typesSupported |= 0x02; // EVENTLOG_WARNING_TYPE
749 }
750 break;
751 default:
752 this.ParseHelper.UnexpectedAttribute(element, attrib);
753 break;
754 }
755 }
756 else
757 {
758 this.ParseHelper.ParseExtensionAttribute(this.Context.Extensions, intermediate, section, element, attrib);
759 }
760 }
761
762 if (null == sourceName)
763 {
764 this.Messaging.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, element.Name.LocalName, "Name"));
765 }
766
767 if (null == logName)
768 {
769 this.Messaging.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, element.Name.LocalName, "EventLog"));
770 }
771
772 if (null == eventMessageFile)
773 {
774 this.Messaging.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, element.Name.LocalName, "EventMessageFile"));
775 }
776
777 if (null == categoryMessageFile && 0 < categoryCount)
778 {
779 this.Messaging.Write(ErrorMessages.IllegalAttributeWithoutOtherAttributes(sourceLineNumbers, element.Name.LocalName, "CategoryCount", "CategoryMessageFile"));
780 }
781
782 if (null != categoryMessageFile && CompilerConstants.IntegerNotSet == categoryCount)
783 {
784 this.Messaging.Write(ErrorMessages.IllegalAttributeWithoutOtherAttributes(sourceLineNumbers, element.Name.LocalName, "CategoryMessageFile", "CategoryCount"));
785 }
786
787 this.ParseHelper.ParseForExtensionElements(this.Context.Extensions, intermediate, section, element);
788
789 string eventSourceKey = $@"SYSTEM\CurrentControlSet\Services\EventLog\{logName}\{sourceName}";
790 var id = this.ParseHelper.CreateRegistrySymbol(section, sourceLineNumbers, RegistryRootType.LocalMachine, eventSourceKey, "EventMessageFile", String.Concat("#%", eventMessageFile), componentId, false);
791
792 if (null != categoryMessageFile)
793 {
794 this.ParseHelper.CreateRegistrySymbol(section, sourceLineNumbers, RegistryRootType.LocalMachine, eventSourceKey, "CategoryMessageFile", String.Concat("#%", categoryMessageFile), componentId, false);
795 }
796
797 if (CompilerConstants.IntegerNotSet != categoryCount)
798 {
799 this.ParseHelper.CreateRegistrySymbol(section, sourceLineNumbers, RegistryRootType.LocalMachine, eventSourceKey, "CategoryCount", String.Concat("#", categoryCount), componentId, false);
800 }
801
802 if (null != parameterMessageFile)
803 {
804 this.ParseHelper.CreateRegistrySymbol(section, sourceLineNumbers, RegistryRootType.LocalMachine, eventSourceKey, "ParameterMessageFile", String.Concat("#%", parameterMessageFile), componentId, false);
805 }
806
807 if (0 != typesSupported)
808 {
809 this.ParseHelper.CreateRegistrySymbol(section, sourceLineNumbers, RegistryRootType.LocalMachine, eventSourceKey, "TypesSupported", String.Concat("#", typesSupported), componentId, false);
810 }
811
812 var componentKeyPath = this.CreateComponentKeyPath();
813 componentKeyPath.Id = id.Id;
814 componentKeyPath.Explicit = isKeyPath;
815 componentKeyPath.Type = PossibleKeyPathType.Registry;
816 return componentKeyPath;
817 }
818
819 /// <summary>
820 /// Parses a close application element.
821 /// </summary>
822 /// <param name="element">Element to parse.</param>
823 private void ParseCloseApplicationElement(Intermediate intermediate, IntermediateSection section, XElement element)
824 {
825 var sourceLineNumbers = this.ParseHelper.GetSourceLineNumbers(element);
826 string condition = null;
827 string description = null;
828 string target = null;
829 string property = null;
830 Identifier id = null;
831 int attributes = 2; // default to CLOSEAPP_ATTRIBUTE_REBOOTPROMPT enabled
832 var sequence = CompilerConstants.IntegerNotSet;
833 var terminateExitCode = CompilerConstants.IntegerNotSet;
834 var timeout = CompilerConstants.IntegerNotSet;
835
836 foreach (var attrib in element.Attributes())
837 {
838 if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || this.Namespace == attrib.Name.Namespace)
839 {
840 switch (attrib.Name.LocalName)
841 {
842 case "Id":
843 id = this.ParseHelper.GetAttributeIdentifier(sourceLineNumbers, attrib);
844 break;
845 case "Condition":
846 condition = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
847 break;
848 case "Description":
849 description = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
850 break;
851 case "Property":
852 property = this.ParseHelper.GetAttributeIdentifierValue(sourceLineNumbers, attrib);
853 break;
854 case "Sequence":
855 sequence = this.ParseHelper.GetAttributeIntegerValue(sourceLineNumbers, attrib, 0, Int32.MaxValue);
856 break;
857 case "Timeout":
858 timeout = this.ParseHelper.GetAttributeIntegerValue(sourceLineNumbers, attrib, 0, Int32.MaxValue);
859 break;
860 case "Target":
861 target = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
862 break;
863 case "CloseMessage":
864 if (YesNoType.Yes == this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib))
865 {
866 attributes |= 1; // CLOSEAPP_ATTRIBUTE_CLOSEMESSAGE
867 }
868 else
869 {
870 attributes &= ~1; // CLOSEAPP_ATTRIBUTE_CLOSEMESSAGE
871 }
872 break;
873 case "EndSessionMessage":
874 if (YesNoType.Yes == this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib))
875 {
876 attributes |= 8; // CLOSEAPP_ATTRIBUTE_ENDSESSIONMESSAGE
877 }
878 else
879 {
880 attributes &= ~8; // CLOSEAPP_ATTRIBUTE_ENDSESSIONMESSAGE
881 }
882 break;
883 case "PromptToContinue":
884 if (YesNoType.Yes == this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib))
885 {
886 attributes |= 0x40; // CLOSEAPP_ATTRIBUTE_PROMPTTOCONTINUE
887 }
888 else
889 {
890 attributes &= ~0x40; // CLOSEAPP_ATTRIBUTE_PROMPTTOCONTINUE
891 }
892 break;
893 case "RebootPrompt":
894 if (YesNoType.Yes == this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib))
895 {
896 attributes |= 2; // CLOSEAPP_ATTRIBUTE_REBOOTPROMPT
897 }
898 else
899 {
900 attributes &= ~2; // CLOSEAPP_ATTRIBUTE_REBOOTPROMPT
901 }
902 break;
903 case "ElevatedCloseMessage":
904 if (YesNoType.Yes == this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib))
905 {
906 attributes |= 4; // CLOSEAPP_ATTRIBUTE_ELEVATEDCLOSEMESSAGE
907 }
908 else
909 {
910 attributes &= ~4; // CLOSEAPP_ATTRIBUTE_ELEVATEDCLOSEMESSAGE
911 }
912 break;
913 case "ElevatedEndSessionMessage":
914 if (YesNoType.Yes == this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib))
915 {
916 attributes |= 0x10; // CLOSEAPP_ATTRIBUTE_ELEVATEDENDSESSIONMESSAGE
917 }
918 else
919 {
920 attributes &= ~0x10; // CLOSEAPP_ATTRIBUTE_ELEVATEDENDSESSIONMESSAGE
921 }
922 break;
923 case "TerminateProcess":
924 terminateExitCode = this.ParseHelper.GetAttributeIntegerValue(sourceLineNumbers, attrib, 0, Int32.MaxValue);
925 attributes |= 0x20; // CLOSEAPP_ATTRIBUTE_TERMINATEPROCESS
926 break;
927 default:
928 this.ParseHelper.UnexpectedAttribute(element, attrib);
929 break;
930 }
931 }
932 else
933 {
934 this.ParseHelper.ParseExtensionAttribute(this.Context.Extensions, intermediate, section, element, attrib);
935 }
936 }
937
938 if (null == target)
939 {
940 this.Messaging.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, element.Name.LocalName, "Target"));
941 }
942 else if (null == id)
943 {
944 id = this.ParseHelper.CreateIdentifier("ca", target);
945 }
946
947 if (String.IsNullOrEmpty(description) && 0x40 == (attributes & 0x40))
948 {
949 this.Messaging.Write(ErrorMessages.IllegalAttributeValueWithoutOtherAttribute(sourceLineNumbers, element.Name.LocalName, "PromptToContinue", "yes", "Description"));
950 }
951
952 if (0x22 == (attributes & 0x22))
953 {
954 this.Messaging.Write(ErrorMessages.IllegalAttributeWithOtherAttribute(sourceLineNumbers, element.Name.LocalName, "TerminateProcess", "RebootPrompt", "yes"));
955 }
956
957 this.ParseHelper.ParseForExtensionElements(this.Context.Extensions, intermediate, section, element);
958
959 this.ParseHelper.CreateCustomActionReference(sourceLineNumbers, section, "Wix4CloseApplications", this.Context.Platform, CustomActionPlatforms.X86 | CustomActionPlatforms.X64 | CustomActionPlatforms.ARM64);
960
961 if (!this.Messaging.EncounteredError)
962 {
963 var symbol = section.AddSymbol(new WixCloseApplicationSymbol(sourceLineNumbers, id)
964 {
965 Target = target,
966 Description = description,
967 Condition = condition,
968 Attributes = attributes,
969 Property = property,
970 });
971 if (CompilerConstants.IntegerNotSet != sequence)
972 {
973 symbol.Sequence = sequence;
974 }
975 if (CompilerConstants.IntegerNotSet != terminateExitCode)
976 {
977 symbol.TerminateExitCode = terminateExitCode;
978 }
979 if (CompilerConstants.IntegerNotSet != timeout)
980 {
981 symbol.Timeout = timeout * 1000; // make the timeout milliseconds in the table.
982 }
983 }
984 }
985
986 /// <summary>
987 /// Parses a DirectorySearch element.
988 /// </summary>
989 /// <param name="element">Element to parse.</param>
990 private void ParseDirectorySearchElement(Intermediate intermediate, IntermediateSection section, XElement element)
991 {
992 var sourceLineNumbers = this.ParseHelper.GetSourceLineNumbers(element);
993 Identifier id = null;
994 string variable = null;
995 string condition = null;
996 string after = null;
997 string path = null;
998 var attributes = WixFileSearchAttributes.IsDirectory;
999
1000 foreach (var attrib in element.Attributes())
1001 {
1002 if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || this.Namespace == attrib.Name.Namespace)
1003 {
1004 switch (attrib.Name.LocalName)
1005 {
1006 case "Id":
1007 case "Variable":
1008 case "Condition":
1009 case "After":
1010 this.ParseCommonSearchAttributes(sourceLineNumbers, attrib, ref id, ref variable, ref condition, ref after);
1011 break;
1012 case "Path":
1013 path = this.ParseHelper.GetAttributeLongFilename(sourceLineNumbers, attrib, false, true);
1014 break;
1015 case "Result":
1016 var result = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
1017 switch (result)
1018 {
1019 case "exists":
1020 attributes |= WixFileSearchAttributes.WantExists;
1021 break;
1022 default:
1023 this.Messaging.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, attrib.Parent.Name.LocalName, attrib.Name.LocalName, result, "exists"));
1024 break;
1025 }
1026 break;
1027 default:
1028 this.ParseHelper.UnexpectedAttribute(element, attrib);
1029 break;
1030 }
1031 }
1032 else
1033 {
1034 this.ParseHelper.ParseExtensionAttribute(this.Context.Extensions, intermediate, section, element, attrib);
1035 }
1036 }
1037
1038 if (null == path)
1039 {
1040 this.Messaging.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, element.Name.LocalName, "Path"));
1041 }
1042
1043 if (null == id)
1044 {
1045 id = this.ParseHelper.CreateIdentifier("wds", variable, condition, after, path, attributes.ToString());
1046 }
1047
1048 this.ParseHelper.ParseForExtensionElements(this.Context.Extensions, intermediate, section, element);
1049
1050 this.ParseHelper.CreateWixSearchSymbol(section, sourceLineNumbers, element.Name.LocalName, id, variable, condition, after, null);
1051
1052 if (!this.Messaging.EncounteredError)
1053 {
1054 this.CreateWixFileSearchRow(section, sourceLineNumbers, id, path, attributes);
1055 }
1056 }
1057
1058 /// <summary>
1059 /// Parses a DirectorySearchRef, FileSearchRef, ProductSearchRef, and RegistrySearchRef elements
1060 /// </summary>
1061 /// <param name="node">Element to parse.</param>
1062 private void ParseWixSearchRefElement(Intermediate intermediate, IntermediateSection section, XElement node)
1063 {
1064 var sourceLineNumbers = this.ParseHelper.GetSourceLineNumbers(node);
1065
1066 foreach (XAttribute attrib in node.Attributes())
1067 {
1068 if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || this.Namespace == attrib.Name.Namespace)
1069 {
1070 switch (attrib.Name.LocalName)
1071 {
1072 case "Id":
1073 var refId = this.ParseHelper.GetAttributeIdentifierValue(sourceLineNumbers, attrib);
1074 this.ParseHelper.CreateSimpleReference(section, sourceLineNumbers, SymbolDefinitions.WixSearch, refId);
1075 break;
1076 default:
1077 this.ParseHelper.UnexpectedAttribute(node, attrib);
1078 break;
1079 }
1080 }
1081 else
1082 {
1083 this.ParseHelper.ParseExtensionAttribute(this.Context.Extensions, intermediate, section, node, attrib);
1084 }
1085 }
1086
1087 this.ParseHelper.ParseForExtensionElements(this.Context.Extensions, intermediate, section, node);
1088 }
1089
1090 /// <summary>
1091 /// Parses a FileSearch element.
1092 /// </summary>
1093 /// <param name="node">Element to parse.</param>
1094 private void ParseFileSearchElement(Intermediate intermediate, IntermediateSection section, XElement node)
1095 {
1096 var sourceLineNumbers = this.ParseHelper.GetSourceLineNumbers(node);
1097 Identifier id = null;
1098 string variable = null;
1099 string condition = null;
1100 string after = null;
1101 string path = null;
1102 var attributes = WixFileSearchAttributes.Default;
1103
1104 foreach (var attrib in node.Attributes())
1105 {
1106 if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || this.Namespace == attrib.Name.Namespace)
1107 {
1108 switch (attrib.Name.LocalName)
1109 {
1110 case "Id":
1111 case "Variable":
1112 case "Condition":
1113 case "After":
1114 this.ParseCommonSearchAttributes(sourceLineNumbers, attrib, ref id, ref variable, ref condition, ref after);
1115 break;
1116 case "Path":
1117 path = this.ParseHelper.GetAttributeLongFilename(sourceLineNumbers, attrib, false, true);
1118 break;
1119 case "Result":
1120 string result = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
1121 switch (result)
1122 {
1123 case "exists":
1124 attributes |= WixFileSearchAttributes.WantExists;
1125 break;
1126 case "version":
1127 attributes |= WixFileSearchAttributes.WantVersion;
1128 break;
1129 default:
1130 this.Messaging.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, attrib.Parent.Name.LocalName, attrib.Name.LocalName, result, "exists", "version"));
1131 break;
1132 }
1133 break;
1134 default:
1135 this.ParseHelper.UnexpectedAttribute(node, attrib);
1136 break;
1137 }
1138 }
1139 else
1140 {
1141 this.ParseHelper.ParseExtensionAttribute(this.Context.Extensions, intermediate, section, node, attrib);
1142 }
1143 }
1144
1145 if (null == path)
1146 {
1147 this.Messaging.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, node.Name.LocalName, "Path"));
1148 }
1149
1150 if (null == id)
1151 {
1152 id = this.ParseHelper.CreateIdentifier("wfs", variable, condition, after, path, attributes.ToString());
1153 }
1154
1155 this.ParseHelper.ParseForExtensionElements(this.Context.Extensions, intermediate, section, node);
1156
1157 this.ParseHelper.CreateWixSearchSymbol(section, sourceLineNumbers, node.Name.LocalName, id, variable, condition, after, null);
1158
1159 if (!this.Messaging.EncounteredError)
1160 {
1161 this.CreateWixFileSearchRow(section, sourceLineNumbers, id, path, attributes);
1162 }
1163 }
1164
1165 /// <summary>
1166 /// Creates a row in the WixFileSearch table.
1167 /// </summary>
1168 /// <param name="sourceLineNumbers">Source line number for the parent element.</param>
1169 /// <param name="id">Identifier of the search (key into the WixSearch table)</param>
1170 /// <param name="path">File/directory path to search for.</param>
1171 /// <param name="attributes"></param>
1172 private void CreateWixFileSearchRow(IntermediateSection section, SourceLineNumber sourceLineNumbers, Identifier id, string path, WixFileSearchAttributes attributes)
1173 {
1174 section.AddSymbol(new WixFileSearchSymbol(sourceLineNumbers, id)
1175 {
1176 Path = path,
1177 Attributes = attributes,
1178 });
1179 }
1180
1181 /// <summary>
1182 /// Parses a file share element.
1183 /// </summary>
1184 /// <param name="element">Element to parse.</param>
1185 /// <param name="componentId">Identifier of parent component.</param>
1186 /// <param name="directoryId">Identifier of referred to directory.</param>
1187 private void ParseFileShareElement(Intermediate intermediate, IntermediateSection section, XElement element, string componentId, string directoryId)
1188 {
1189 var sourceLineNumbers = this.ParseHelper.GetSourceLineNumbers(element);
1190 string description = null;
1191 string name = null;
1192 Identifier id = null;
1193
1194 foreach (var attrib in element.Attributes())
1195 {
1196 if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || this.Namespace == attrib.Name.Namespace)
1197 {
1198 switch (attrib.Name.LocalName)
1199 {
1200 case "Id":
1201 id = this.ParseHelper.GetAttributeIdentifier(sourceLineNumbers, attrib);
1202 break;
1203 case "Name":
1204 name = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
1205 break;
1206 case "Description":
1207 description = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
1208 break;
1209 default:
1210 this.ParseHelper.UnexpectedAttribute(element, attrib);
1211 break;
1212 }
1213 }
1214 else
1215 {
1216 this.ParseHelper.ParseExtensionAttribute(this.Context.Extensions, intermediate, section, element, attrib);
1217 }
1218 }
1219
1220 if (null == id)
1221 {
1222 id = this.ParseHelper.CreateIdentifier("ufs", componentId, name);
1223 }
1224
1225 if (null == name)
1226 {
1227 this.Messaging.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, element.Name.LocalName, "Name"));
1228 }
1229
1230 if (!element.Elements().Any())
1231 {
1232 this.Messaging.Write(ErrorMessages.ExpectedElement(sourceLineNumbers, element.Name.LocalName, "FileSharePermission"));
1233 }
1234
1235 foreach (var child in element.Elements())
1236 {
1237 if (this.Namespace == child.Name.Namespace)
1238 {
1239 switch (child.Name.LocalName)
1240 {
1241 case "FileSharePermission":
1242 this.ParseFileSharePermissionElement(intermediate, section, child, id);
1243 break;
1244 default:
1245 this.ParseHelper.UnexpectedElement(element, child);
1246 break;
1247 }
1248 }
1249 else
1250 {
1251 this.ParseHelper.ParseExtensionElement(this.Context.Extensions, intermediate, section, element, child);
1252 }
1253 }
1254
1255 this.ParseHelper.CreateCustomActionReference(sourceLineNumbers, section, "Wix4ConfigureSmbInstall", this.Context.Platform, CustomActionPlatforms.X86 | CustomActionPlatforms.X64 | CustomActionPlatforms.ARM64);
1256 this.ParseHelper.CreateCustomActionReference(sourceLineNumbers, section, "Wix4ConfigureSmbUninstall", this.Context.Platform, CustomActionPlatforms.X86 | CustomActionPlatforms.X64 | CustomActionPlatforms.ARM64);
1257
1258 if (!this.Messaging.EncounteredError)
1259 {
1260 section.AddSymbol(new FileShareSymbol(sourceLineNumbers, id)
1261 {
1262 ShareName = name,
1263 ComponentRef = componentId,
1264 Description = description,
1265 DirectoryRef = directoryId,
1266 });
1267 }
1268 }
1269
1270 /// <summary>
1271 /// Parses a FileSharePermission element.
1272 /// </summary>
1273 /// <param name="element">Element to parse.</param>
1274 /// <param name="fileShareId">The identifier of the parent FileShare element.</param>
1275 private void ParseFileSharePermissionElement(Intermediate intermediate, IntermediateSection section, XElement element, Identifier fileShareId)
1276 {
1277 var sourceLineNumbers = this.ParseHelper.GetSourceLineNumbers(element);
1278 var bits = new BitArray(32);
1279 string user = null;
1280
1281 foreach (var attrib in element.Attributes())
1282 {
1283 if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || this.Namespace == attrib.Name.Namespace)
1284 {
1285 switch (attrib.Name.LocalName)
1286 {
1287 case "User":
1288 user = this.ParseHelper.GetAttributeIdentifierValue(sourceLineNumbers, attrib);
1289 this.ParseHelper.CreateSimpleReference(section, sourceLineNumbers, UtilSymbolDefinitions.User, user);
1290 break;
1291 default:
1292 var attribValue = this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib);
1293 if (!this.TrySetBitFromName(UtilConstants.StandardPermissions, attrib.Name.LocalName, attribValue, bits, 16))
1294 {
1295 if (!this.TrySetBitFromName(UtilConstants.GenericPermissions, attrib.Name.LocalName, attribValue, bits, 28))
1296 {
1297 if (!this.TrySetBitFromName(UtilConstants.FolderPermissions, attrib.Name.LocalName, attribValue, bits, 0))
1298 {
1299 this.ParseHelper.UnexpectedAttribute(element, attrib);
1300 break;
1301 }
1302 }
1303 }
1304 break;
1305 }
1306 }
1307 else
1308 {
1309 this.ParseHelper.ParseExtensionAttribute(this.Context.Extensions, intermediate, section, element, attrib);
1310 }
1311 }
1312
1313 var permission = this.CreateIntegerFromBitArray(bits);
1314
1315 if (null == user)
1316 {
1317 this.Messaging.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, element.Name.LocalName, "User"));
1318 }
1319
1320 if (Int32.MinValue == permission) // just GENERIC_READ, which is MSI_NULL
1321 {
1322 this.Messaging.Write(ErrorMessages.GenericReadNotAllowed(sourceLineNumbers));
1323 }
1324
1325 this.ParseHelper.ParseForExtensionElements(this.Context.Extensions, intermediate, section, element);
1326
1327 if (!this.Messaging.EncounteredError)
1328 {
1329 section.AddSymbol(new FileSharePermissionsSymbol(sourceLineNumbers)
1330 {
1331 FileShareRef = fileShareId.Id,
1332 UserRef = user,
1333 Permissions = permission,
1334 });
1335 }
1336 }
1337
1338 /// <summary>
1339 /// Parses a group element.
1340 /// </summary>
1341 /// <param name="element">Node to be parsed.</param>
1342 /// <param name="componentId">Component Id of the parent component of this element.</param>
1343 private void ParseGroupElement(Intermediate intermediate, IntermediateSection section, XElement element, string componentId)
1344 {
1345 var sourceLineNumbers = this.ParseHelper.GetSourceLineNumbers(element);
1346 Identifier id = null;
1347 string domain = null;
1348 string name = null;
1349
1350 foreach (var attrib in element.Attributes())
1351 {
1352 if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || this.Namespace == attrib.Name.Namespace)
1353 {
1354 switch (attrib.Name.LocalName)
1355 {
1356 case "Id":
1357 id = this.ParseHelper.GetAttributeIdentifier(sourceLineNumbers, attrib);
1358 break;
1359 case "Name":
1360 name = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
1361 break;
1362 case "Domain":
1363 domain = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
1364 break;
1365 default:
1366 this.ParseHelper.UnexpectedAttribute(element, attrib);
1367 break;
1368 }
1369 }
1370 else
1371 {
1372 this.ParseHelper.ParseExtensionAttribute(this.Context.Extensions, intermediate, section, element, attrib);
1373 }
1374 }
1375
1376 if (null == id)
1377 {
1378 id = this.ParseHelper.CreateIdentifier("ugr", componentId, domain, name);
1379 }
1380
1381 this.ParseHelper.ParseForExtensionElements(this.Context.Extensions, intermediate, section, element);
1382
1383 if (!this.Messaging.EncounteredError)
1384 {
1385 section.AddSymbol(new GroupSymbol(sourceLineNumbers, id)
1386 {
1387 ComponentRef = componentId,
1388 Name = name,
1389 Domain = domain,
1390 });
1391 }
1392 }
1393
1394 /// <summary>
1395 /// Parses a GroupRef element
1396 /// </summary>
1397 /// <param name="element">Element to parse.</param>
1398 /// <param name="userId">Required user id to be joined to the group.</param>
1399 private void ParseGroupRefElement(Intermediate intermediate, IntermediateSection section, XElement element, string userId)
1400 {
1401 var sourceLineNumbers = this.ParseHelper.GetSourceLineNumbers(element);
1402 string groupId = null;
1403
1404 foreach (var attrib in element.Attributes())
1405 {
1406 if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || this.Namespace == attrib.Name.Namespace)
1407 {
1408 switch (attrib.Name.LocalName)
1409 {
1410 case "Id":
1411 groupId = this.ParseHelper.GetAttributeIdentifierValue(sourceLineNumbers, attrib);
1412 this.ParseHelper.CreateSimpleReference(section, sourceLineNumbers, UtilSymbolDefinitions.Group, groupId);
1413 break;
1414 default:
1415 this.ParseHelper.UnexpectedAttribute(element, attrib);
1416 break;
1417 }
1418 }
1419 else
1420 {
1421 this.ParseHelper.ParseExtensionAttribute(this.Context.Extensions, intermediate, section, element, attrib);
1422 }
1423 }
1424
1425 this.ParseHelper.ParseForExtensionElements(this.Context.Extensions, intermediate, section, element);
1426
1427 if (!this.Messaging.EncounteredError)
1428 {
1429 section.AddSymbol(new UserGroupSymbol(sourceLineNumbers)
1430 {
1431 UserRef = userId,
1432 GroupRef = groupId,
1433 });
1434 }
1435 }
1436
1437 /// <summary>
1438 /// Parses an InternetShortcut element.
1439 /// </summary>
1440 /// <param name="element">Element to parse.</param>
1441 /// <param name="componentId">Identifier of parent component.</param>
1442 /// <param name="defaultTarget">Default directory if none is specified on the InternetShortcut element.</param>
1443 private void ParseInternetShortcutElement(Intermediate intermediate, IntermediateSection section, XElement element, string componentId, string defaultTarget)
1444 {
1445 var sourceLineNumbers = this.ParseHelper.GetSourceLineNumbers(element);
1446 Identifier id = null;
1447 string name = null;
1448 string target = null;
1449 string directoryId = null;
1450 string type = null;
1451 string iconFile = null;
1452 int iconIndex = 0;
1453
1454 foreach (var attrib in element.Attributes())
1455 {
1456 if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || this.Namespace == attrib.Name.Namespace)
1457 {
1458 switch (attrib.Name.LocalName)
1459 {
1460 case "Directory":
1461 directoryId = this.ParseHelper.GetAttributeIdentifierValue(sourceLineNumbers, attrib);
1462 break;
1463 case "Id":
1464 id = this.ParseHelper.GetAttributeIdentifier(sourceLineNumbers, attrib);
1465 break;
1466 case "Name":
1467 name = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
1468 break;
1469 case "Target":
1470 target = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
1471 break;
1472 case "Type":
1473 type = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
1474 break;
1475 case "IconFile":
1476 iconFile = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
1477 break;
1478 case "IconIndex":
1479 iconIndex = this.ParseHelper.GetAttributeIntegerValue(sourceLineNumbers, attrib, 0, Int32.MaxValue);
1480 break;
1481 default:
1482 this.ParseHelper.UnexpectedAttribute(element, attrib);
1483 break;
1484 }
1485 }
1486 else
1487 {
1488 this.ParseHelper.ParseExtensionAttribute(this.Context.Extensions, intermediate, section, element, attrib);
1489 }
1490 }
1491
1492 // If there was no directoryId specified on the InternetShortcut element, default to the one on
1493 // the parent component.
1494 if (null == directoryId)
1495 {
1496 directoryId = defaultTarget;
1497 }
1498
1499 if (null == id)
1500 {
1501 id = this.ParseHelper.CreateIdentifier("uis", componentId, directoryId, name, target);
1502 }
1503
1504 // In theory this can never be the case, since InternetShortcut can only be under
1505 // a component element, and if the Directory wasn't specified the default will come
1506 // from the component. However, better safe than sorry, so here's a check to make sure
1507 // it didn't wind up being null after setting it to the defaultTarget.
1508 if (null == directoryId)
1509 {
1510 this.Messaging.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, element.Name.LocalName, "Directory"));
1511 }
1512
1513 if (null == name)
1514 {
1515 this.Messaging.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, element.Name.LocalName, "Name"));
1516 }
1517
1518 if (null == target)
1519 {
1520 this.Messaging.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, element.Name.LocalName, "Target"));
1521 }
1522
1523 this.ParseHelper.ParseForExtensionElements(this.Context.Extensions, intermediate, section, element);
1524
1525 var shortcutType = InternetShortcutType.Link;
1526 if (String.Equals(type, "url", StringComparison.OrdinalIgnoreCase))
1527 {
1528 shortcutType = InternetShortcutType.Url;
1529 }
1530
1531 if (!this.Messaging.EncounteredError)
1532 {
1533 this.CreateWixInternetShortcut(section, sourceLineNumbers, componentId, directoryId, id, name, target, shortcutType, iconFile, iconIndex);
1534 }
1535 }
1536
1537 /// <summary>
1538 /// Creates the rows needed for WixInternetShortcut to work.
1539 /// </summary>
1540 /// <param name="core">The CompilerCore object used to create rows.</param>
1541 /// <param name="sourceLineNumbers">Source line information about the owner element.</param>
1542 /// <param name="componentId">Identifier of parent component.</param>
1543 /// <param name="directoryId">Identifier of directory containing shortcut.</param>
1544 /// <param name="id">Identifier of shortcut.</param>
1545 /// <param name="name">Name of shortcut without extension.</param>
1546 /// <param name="target">Target URL of shortcut.</param>
1547 private void CreateWixInternetShortcut(IntermediateSection section, SourceLineNumber sourceLineNumbers, string componentId, string directoryId, Identifier shortcutId, string name, string target, InternetShortcutType type, string iconFile, int iconIndex)
1548 {
1549 // add the appropriate extension based on type of shortcut
1550 name = String.Concat(name, InternetShortcutType.Url == type ? ".url" : ".lnk");
1551
1552 section.AddSymbol(new WixInternetShortcutSymbol(sourceLineNumbers, shortcutId)
1553 {
1554 ComponentRef = componentId,
1555 DirectoryRef = directoryId,
1556 Name = name,
1557 Target = target,
1558 Attributes = (int)type,
1559 IconFile = iconFile,
1560 IconIndex = iconIndex,
1561 });
1562
1563 this.ParseHelper.CreateCustomActionReference(sourceLineNumbers, section, "Wix4SchedInternetShortcuts", this.Context.Platform, CustomActionPlatforms.X86 | CustomActionPlatforms.X64 | CustomActionPlatforms.ARM64);
1564
1565 // make sure we have a CreateFolder table so that the immediate CA can add temporary rows to handle installation and uninstallation
1566 this.ParseHelper.EnsureTable(section, sourceLineNumbers, "CreateFolder");
1567
1568 // use built-in MSI functionality to remove the shortcuts rather than doing so via CA
1569 section.AddSymbol(new RemoveFileSymbol(sourceLineNumbers, shortcutId)
1570 {
1571 ComponentRef = componentId,
1572 DirPropertyRef = directoryId,
1573 OnUninstall = true,
1574 FileName = name,
1575 });
1576 }
1577
1578 /// <summary>
1579 /// Parses a performance category element.
1580 /// </summary>
1581 /// <param name="element">Element to parse.</param>
1582 /// <param name="componentId">Identifier of parent component.</param>
1583 private void ParsePerformanceCategoryElement(Intermediate intermediate, IntermediateSection section, XElement element, string componentId)
1584 {
1585 var sourceLineNumbers = this.ParseHelper.GetSourceLineNumbers(element);
1586 Identifier id = null;
1587 string name = null;
1588 string help = null;
1589 var multiInstance = YesNoType.No;
1590 int defaultLanguage = 0x09; // default to "english"
1591
1592 var parsedPerformanceCounters = new List<ParsedPerformanceCounter>();
1593
1594 // default to managed performance counter
1595 var library = "netfxperf.dll";
1596 var openEntryPoint = "OpenPerformanceData";
1597 var collectEntryPoint = "CollectPerformanceData";
1598 var closeEntryPoint = "ClosePerformanceData";
1599
1600 foreach (var attrib in element.Attributes())
1601 {
1602 if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || this.Namespace == attrib.Name.Namespace)
1603 {
1604 switch (attrib.Name.LocalName)
1605 {
1606 case "Close":
1607 closeEntryPoint = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
1608 break;
1609 case "Collect":
1610 collectEntryPoint = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
1611 break;
1612 case "DefaultLanguage":
1613 defaultLanguage = this.GetPerformanceCounterLanguage(sourceLineNumbers, attrib);
1614 break;
1615 case "Help":
1616 help = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
1617 break;
1618 case "Id":
1619 id = this.ParseHelper.GetAttributeIdentifier(sourceLineNumbers, attrib);
1620 break;
1621 case "Library":
1622 library = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
1623 break;
1624 case "MultiInstance":
1625 multiInstance = this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib);
1626 break;
1627 case "Name":
1628 name = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
1629 break;
1630 case "Open":
1631 openEntryPoint = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
1632 break;
1633 default:
1634 this.ParseHelper.UnexpectedAttribute(element, attrib);
1635 break;
1636 }
1637 }
1638 else
1639 {
1640 this.ParseHelper.ParseExtensionAttribute(this.Context.Extensions, intermediate, section, element, attrib);
1641 }
1642 }
1643
1644 if (null == id && null == name)
1645 {
1646 this.Messaging.Write(ErrorMessages.ExpectedAttributes(sourceLineNumbers, element.Name.LocalName, "Id", "Name"));
1647 }
1648 else if (null == id)
1649 {
1650 id = this.ParseHelper.CreateIdentifier("upc", componentId, name);
1651 }
1652 else if (null == name)
1653 {
1654 name = id.Id;
1655 }
1656
1657 // Process the child counter elements.
1658 foreach (var child in element.Elements())
1659 {
1660 if (this.Namespace == child.Name.Namespace)
1661 {
1662 switch (child.Name.LocalName)
1663 {
1664 case "PerformanceCounter":
1665 var counter = this.ParsePerformanceCounterElement(intermediate, section, child, defaultLanguage);
1666 if (null != counter)
1667 {
1668 parsedPerformanceCounters.Add(counter);
1669 }
1670 break;
1671 default:
1672 this.ParseHelper.UnexpectedElement(element, child);
1673 break;
1674 }
1675 }
1676 else
1677 {
1678 this.ParseHelper.ParseExtensionElement(this.Context.Extensions, intermediate, section, element, child);
1679 }
1680 }
1681
1682
1683 if (!this.Messaging.EncounteredError)
1684 {
1685 // Calculate the ini and h file content.
1686 var objectName = "OBJECT_1";
1687 var objectLanguage = defaultLanguage.ToString("D3", CultureInfo.InvariantCulture);
1688
1689 var sbIniData = new StringBuilder();
1690 sbIniData.AppendFormat("[info]\r\ndrivername={0}\r\nsymbolfile=wixperf.h\r\n\r\n[objects]\r\n{1}_{2}_NAME=\r\n\r\n[languages]\r\n{2}=LANG{2}\r\n\r\n", name, objectName, objectLanguage);
1691 sbIniData.AppendFormat("[text]\r\n{0}_{1}_NAME={2}\r\n", objectName, objectLanguage, name);
1692 if (null != help)
1693 {
1694 sbIniData.AppendFormat("{0}_{1}_HELP={2}\r\n", objectName, objectLanguage, help);
1695 }
1696
1697 int symbolConstantsCounter = 0;
1698 var sbSymbolicConstants = new StringBuilder();
1699 sbSymbolicConstants.AppendFormat("#define {0} {1}\r\n", objectName, symbolConstantsCounter);
1700
1701 var sbCounterNames = new StringBuilder("[~]");
1702 var sbCounterTypes = new StringBuilder("[~]");
1703 for (int i = 0; i < parsedPerformanceCounters.Count; ++i)
1704 {
1705 var counter = parsedPerformanceCounters[i];
1706 var counterName = String.Concat("DEVICE_COUNTER_", i + 1);
1707
1708 sbIniData.AppendFormat("{0}_{1}_NAME={2}\r\n", counterName, counter.Language, counter.Name);
1709 if (null != counter.Help)
1710 {
1711 sbIniData.AppendFormat("{0}_{1}_HELP={2}\r\n", counterName, counter.Language, counter.Help);
1712 }
1713
1714 symbolConstantsCounter += 2;
1715 sbSymbolicConstants.AppendFormat("#define {0} {1}\r\n", counterName, symbolConstantsCounter);
1716
1717 sbCounterNames.Append(UtilCompiler.FindPropertyBrackets.Replace(counter.Name, this.EscapeProperties));
1718 sbCounterNames.Append("[~]");
1719 sbCounterTypes.Append(counter.Type);
1720 sbCounterTypes.Append("[~]");
1721 }
1722
1723 sbSymbolicConstants.AppendFormat("#define LAST_{0}_COUNTER_OFFSET {1}\r\n", objectName, symbolConstantsCounter);
1724
1725 // Add the calculated INI and H strings to the PerformanceCategory table.
1726 section.AddSymbol(new PerformanceCategorySymbol(sourceLineNumbers, id)
1727 {
1728 ComponentRef = componentId,
1729 Name = name,
1730 IniData = sbIniData.ToString(),
1731 ConstantData = sbSymbolicConstants.ToString(),
1732 });
1733
1734 // Set up the application's performance key.
1735 var escapedName = UtilCompiler.FindPropertyBrackets.Replace(name, this.EscapeProperties);
1736 var linkageKey = String.Format(@"SYSTEM\CurrentControlSet\Services\{0}\Linkage", escapedName);
1737 var performanceKey = String.Format(@"SYSTEM\CurrentControlSet\Services\{0}\Performance", escapedName);
1738
1739 this.ParseHelper.CreateRegistrySymbol(section, sourceLineNumbers, RegistryRootType.LocalMachine, linkageKey, "Export", escapedName, componentId, false);
1740 this.ParseHelper.CreateRegistrySymbol(section, sourceLineNumbers, RegistryRootType.LocalMachine, performanceKey, "-", null, componentId, false);
1741 this.ParseHelper.CreateRegistrySymbol(section, sourceLineNumbers, RegistryRootType.LocalMachine, performanceKey, "Library", library, componentId, false);
1742 this.ParseHelper.CreateRegistrySymbol(section, sourceLineNumbers, RegistryRootType.LocalMachine, performanceKey, "Open", openEntryPoint, componentId, false);
1743 this.ParseHelper.CreateRegistrySymbol(section, sourceLineNumbers, RegistryRootType.LocalMachine, performanceKey, "Collect", collectEntryPoint, componentId, false);
1744 this.ParseHelper.CreateRegistrySymbol(section, sourceLineNumbers, RegistryRootType.LocalMachine, performanceKey, "Close", closeEntryPoint, componentId, false);
1745 this.ParseHelper.CreateRegistrySymbol(section, sourceLineNumbers, RegistryRootType.LocalMachine, performanceKey, "IsMultiInstance", YesNoType.Yes == multiInstance ? "#1" : "#0", componentId, false);
1746 this.ParseHelper.CreateRegistrySymbol(section, sourceLineNumbers, RegistryRootType.LocalMachine, performanceKey, "Counter Names", sbCounterNames.ToString(), componentId, false);
1747 this.ParseHelper.CreateRegistrySymbol(section, sourceLineNumbers, RegistryRootType.LocalMachine, performanceKey, "Counter Types", sbCounterTypes.ToString(), componentId, false);
1748 }
1749
1750 this.ParseHelper.CreateCustomActionReference(sourceLineNumbers, section, "Wix4InstallPerfCounterData", this.Context.Platform, CustomActionPlatforms.X86 | CustomActionPlatforms.X64 | CustomActionPlatforms.ARM64);
1751 this.ParseHelper.CreateCustomActionReference(sourceLineNumbers, section, "Wix4UninstallPerfCounterData", this.Context.Platform, CustomActionPlatforms.X86 | CustomActionPlatforms.X64 | CustomActionPlatforms.ARM64);
1752 }
1753
1754 /// <summary>
1755 /// Gets the performance counter language as a decimal number.
1756 /// </summary>
1757 /// <param name="sourceLineNumbers">Source line information about the owner element.</param>
1758 /// <param name="attribute">The attribute containing the value to get.</param>
1759 /// <returns>Numeric representation of the language as per WinNT.h.</returns>
1760 private int GetPerformanceCounterLanguage(SourceLineNumber sourceLineNumbers, XAttribute attribute)
1761 {
1762 int language = 0;
1763 if (String.Empty == attribute.Value)
1764 {
1765 this.Messaging.Write(ErrorMessages.IllegalEmptyAttributeValue(sourceLineNumbers, attribute.Parent.Name.LocalName, attribute.Name.LocalName));
1766 }
1767 else
1768 {
1769 switch (attribute.Value)
1770 {
1771 case "afrikaans":
1772 language = 0x36;
1773 break;
1774 case "albanian":
1775 language = 0x1c;
1776 break;
1777 case "arabic":
1778 language = 0x01;
1779 break;
1780 case "armenian":
1781 language = 0x2b;
1782 break;
1783 case "assamese":
1784 language = 0x4d;
1785 break;
1786 case "azeri":
1787 language = 0x2c;
1788 break;
1789 case "basque":
1790 language = 0x2d;
1791 break;
1792 case "belarusian":
1793 language = 0x23;
1794 break;
1795 case "bengali":
1796 language = 0x45;
1797 break;
1798 case "bulgarian":
1799 language = 0x02;
1800 break;
1801 case "catalan":
1802 language = 0x03;
1803 break;
1804 case "chinese":
1805 language = 0x04;
1806 break;
1807 case "croatian":
1808 language = 0x1a;
1809 break;
1810 case "czech":
1811 language = 0x05;
1812 break;
1813 case "danish":
1814 language = 0x06;
1815 break;
1816 case "divehi":
1817 language = 0x65;
1818 break;
1819 case "dutch":
1820 language = 0x13;
1821 break;
1822 case "piglatin":
1823 case "english":
1824 language = 0x09;
1825 break;
1826 case "estonian":
1827 language = 0x25;
1828 break;
1829 case "faeroese":
1830 language = 0x38;
1831 break;
1832 case "farsi":
1833 language = 0x29;
1834 break;
1835 case "finnish":
1836 language = 0x0b;
1837 break;
1838 case "french":
1839 language = 0x0c;
1840 break;
1841 case "galician":
1842 language = 0x56;
1843 break;
1844 case "georgian":
1845 language = 0x37;
1846 break;
1847 case "german":
1848 language = 0x07;
1849 break;
1850 case "greek":
1851 language = 0x08;
1852 break;
1853 case "gujarati":
1854 language = 0x47;
1855 break;
1856 case "hebrew":
1857 language = 0x0d;
1858 break;
1859 case "hindi":
1860 language = 0x39;
1861 break;
1862 case "hungarian":
1863 language = 0x0e;
1864 break;
1865 case "icelandic":
1866 language = 0x0f;
1867 break;
1868 case "indonesian":
1869 language = 0x21;
1870 break;
1871 case "italian":
1872 language = 0x10;
1873 break;
1874 case "japanese":
1875 language = 0x11;
1876 break;
1877 case "kannada":
1878 language = 0x4b;
1879 break;
1880 case "kashmiri":
1881 language = 0x60;
1882 break;
1883 case "kazak":
1884 language = 0x3f;
1885 break;
1886 case "konkani":
1887 language = 0x57;
1888 break;
1889 case "korean":
1890 language = 0x12;
1891 break;
1892 case "kyrgyz":
1893 language = 0x40;
1894 break;
1895 case "latvian":
1896 language = 0x26;
1897 break;
1898 case "lithuanian":
1899 language = 0x27;
1900 break;
1901 case "macedonian":
1902 language = 0x2f;
1903 break;
1904 case "malay":
1905 language = 0x3e;
1906 break;
1907 case "malayalam":
1908 language = 0x4c;
1909 break;
1910 case "manipuri":
1911 language = 0x58;
1912 break;
1913 case "marathi":
1914 language = 0x4e;
1915 break;
1916 case "mongolian":
1917 language = 0x50;
1918 break;
1919 case "nepali":
1920 language = 0x61;
1921 break;
1922 case "norwegian":
1923 language = 0x14;
1924 break;
1925 case "oriya":
1926 language = 0x48;
1927 break;
1928 case "polish":
1929 language = 0x15;
1930 break;
1931 case "portuguese":
1932 language = 0x16;
1933 break;
1934 case "punjabi":
1935 language = 0x46;
1936 break;
1937 case "romanian":
1938 language = 0x18;
1939 break;
1940 case "russian":
1941 language = 0x19;
1942 break;
1943 case "sanskrit":
1944 language = 0x4f;
1945 break;
1946 case "serbian":
1947 language = 0x1a;
1948 break;
1949 case "sindhi":
1950 language = 0x59;
1951 break;
1952 case "slovak":
1953 language = 0x1b;
1954 break;
1955 case "slovenian":
1956 language = 0x24;
1957 break;
1958 case "spanish":
1959 language = 0x0a;
1960 break;
1961 case "swahili":
1962 language = 0x41;
1963 break;
1964 case "swedish":
1965 language = 0x1d;
1966 break;
1967 case "syriac":
1968 language = 0x5a;
1969 break;
1970 case "tamil":
1971 language = 0x49;
1972 break;
1973 case "tatar":
1974 language = 0x44;
1975 break;
1976 case "telugu":
1977 language = 0x4a;
1978 break;
1979 case "thai":
1980 language = 0x1e;
1981 break;
1982 case "turkish":
1983 language = 0x1f;
1984 break;
1985 case "ukrainian":
1986 language = 0x22;
1987 break;
1988 case "urdu":
1989 language = 0x20;
1990 break;
1991 case "uzbek":
1992 language = 0x43;
1993 break;
1994 case "vietnamese":
1995 language = 0x2a;
1996 break;
1997 default:
1998 this.Messaging.Write(ErrorMessages.IllegalEmptyAttributeValue(sourceLineNumbers, attribute.Parent.Name.LocalName, attribute.Name.LocalName));
1999 break;
2000 }
2001 }
2002
2003 return language;
2004 }
2005
2006 /// <summary>
2007 /// Parses a performance counter element.
2008 /// </summary>
2009 /// <param name="element">Element to parse.</param>
2010 /// <param name="defaultLanguage">Default language for the performance counter.</param>
2011 private ParsedPerformanceCounter ParsePerformanceCounterElement(Intermediate intermediate, IntermediateSection section, XElement element, int defaultLanguage)
2012 {
2013 var sourceLineNumbers = this.ParseHelper.GetSourceLineNumbers(element);
2014 ParsedPerformanceCounter parsedPerformanceCounter = null;
2015 string name = null;
2016 string help = null;
2017 var type = System.Diagnostics.PerformanceCounterType.NumberOfItems32;
2018 int language = defaultLanguage;
2019
2020 foreach (var attrib in element.Attributes())
2021 {
2022 if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || this.Namespace == attrib.Name.Namespace)
2023 {
2024 switch (attrib.Name.LocalName)
2025 {
2026 case "Help":
2027 help = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
2028 break;
2029 case "Name":
2030 name = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
2031 break;
2032 case "Type":
2033 type = this.GetPerformanceCounterType(sourceLineNumbers, attrib);
2034 break;
2035 case "Language":
2036 language = this.GetPerformanceCounterLanguage(sourceLineNumbers, attrib);
2037 break;
2038 default:
2039 this.ParseHelper.UnexpectedAttribute(element, attrib);
2040 break;
2041 }
2042 }
2043 else
2044 {
2045 this.ParseHelper.ParseExtensionAttribute(this.Context.Extensions, intermediate, section, element, attrib);
2046 }
2047 }
2048
2049 if (null == name)
2050 {
2051 this.Messaging.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, element.Name.LocalName, "Name"));
2052 }
2053
2054 if (null == help)
2055 {
2056 this.Messaging.Write(UtilWarnings.RequiredAttributeForWindowsXP(sourceLineNumbers, element.Name.LocalName, "Help"));
2057 }
2058
2059 this.ParseHelper.ParseForExtensionElements(this.Context.Extensions, intermediate, section, element);
2060
2061 if (!this.Messaging.EncounteredError)
2062 {
2063 parsedPerformanceCounter = new ParsedPerformanceCounter(name, help, type, language);
2064 }
2065
2066 return parsedPerformanceCounter;
2067 }
2068
2069 /// <summary>
2070 /// Gets the performance counter type.
2071 /// </summary>
2072 /// <param name="sourceLineNumbers">Source line information about the owner element.</param>
2073 /// <param name="attribute">The attribute containing the value to get.</param>
2074 /// <returns>Numeric representation of the language as per WinNT.h.</returns>
2075 private System.Diagnostics.PerformanceCounterType GetPerformanceCounterType(SourceLineNumber sourceLineNumbers, XAttribute attribute)
2076 {
2077 var type = System.Diagnostics.PerformanceCounterType.NumberOfItems32;
2078 if (String.Empty == attribute.Value)
2079 {
2080 this.Messaging.Write(ErrorMessages.IllegalEmptyAttributeValue(sourceLineNumbers, attribute.Parent.Name.LocalName, attribute.Name.LocalName));
2081 }
2082 else
2083 {
2084 switch (attribute.Value)
2085 {
2086 case "averageBase":
2087 type = System.Diagnostics.PerformanceCounterType.AverageBase;
2088 break;
2089 case "averageCount64":
2090 type = System.Diagnostics.PerformanceCounterType.AverageCount64;
2091 break;
2092 case "averageTimer32":
2093 type = System.Diagnostics.PerformanceCounterType.AverageTimer32;
2094 break;
2095 case "counterDelta32":
2096 type = System.Diagnostics.PerformanceCounterType.CounterDelta32;
2097 break;
2098 case "counterTimerInverse":
2099 type = System.Diagnostics.PerformanceCounterType.CounterTimerInverse;
2100 break;
2101 case "sampleFraction":
2102 type = System.Diagnostics.PerformanceCounterType.SampleFraction;
2103 break;
2104 case "timer100Ns":
2105 type = System.Diagnostics.PerformanceCounterType.Timer100Ns;
2106 break;
2107 case "counterTimer":
2108 type = System.Diagnostics.PerformanceCounterType.CounterTimer;
2109 break;
2110 case "rawFraction":
2111 type = System.Diagnostics.PerformanceCounterType.RawFraction;
2112 break;
2113 case "timer100NsInverse":
2114 type = System.Diagnostics.PerformanceCounterType.Timer100NsInverse;
2115 break;
2116 case "counterMultiTimer":
2117 type = System.Diagnostics.PerformanceCounterType.CounterMultiTimer;
2118 break;
2119 case "counterMultiTimer100Ns":
2120 type = System.Diagnostics.PerformanceCounterType.CounterMultiTimer100Ns;
2121 break;
2122 case "counterMultiTimerInverse":
2123 type = System.Diagnostics.PerformanceCounterType.CounterMultiTimerInverse;
2124 break;
2125 case "counterMultiTimer100NsInverse":
2126 type = System.Diagnostics.PerformanceCounterType.CounterMultiTimer100NsInverse;
2127 break;
2128 case "elapsedTime":
2129 type = System.Diagnostics.PerformanceCounterType.ElapsedTime;
2130 break;
2131 case "sampleBase":
2132 type = System.Diagnostics.PerformanceCounterType.SampleBase;
2133 break;
2134 case "rawBase":
2135 type = System.Diagnostics.PerformanceCounterType.RawBase;
2136 break;
2137 case "counterMultiBase":
2138 type = System.Diagnostics.PerformanceCounterType.CounterMultiBase;
2139 break;
2140 case "rateOfCountsPerSecond64":
2141 type = System.Diagnostics.PerformanceCounterType.RateOfCountsPerSecond64;
2142 break;
2143 case "rateOfCountsPerSecond32":
2144 type = System.Diagnostics.PerformanceCounterType.RateOfCountsPerSecond32;
2145 break;
2146 case "countPerTimeInterval64":
2147 type = System.Diagnostics.PerformanceCounterType.CountPerTimeInterval64;
2148 break;
2149 case "countPerTimeInterval32":
2150 type = System.Diagnostics.PerformanceCounterType.CountPerTimeInterval32;
2151 break;
2152 case "sampleCounter":
2153 type = System.Diagnostics.PerformanceCounterType.SampleCounter;
2154 break;
2155 case "counterDelta64":
2156 type = System.Diagnostics.PerformanceCounterType.CounterDelta64;
2157 break;
2158 case "numberOfItems64":
2159 type = System.Diagnostics.PerformanceCounterType.NumberOfItems64;
2160 break;
2161 case "numberOfItems32":
2162 type = System.Diagnostics.PerformanceCounterType.NumberOfItems32;
2163 break;
2164 case "numberOfItemsHEX64":
2165 type = System.Diagnostics.PerformanceCounterType.NumberOfItemsHEX64;
2166 break;
2167 case "numberOfItemsHEX32":
2168 type = System.Diagnostics.PerformanceCounterType.NumberOfItemsHEX32;
2169 break;
2170 default:
2171 this.Messaging.Write(ErrorMessages.IllegalEmptyAttributeValue(sourceLineNumbers, attribute.Parent.Name.LocalName, attribute.Name.LocalName));
2172 break;
2173 }
2174 }
2175
2176 return type;
2177 }
2178
2179 /// <summary>
2180 /// Parses a perf counter element.
2181 /// </summary>
2182 /// <param name="element">Element to parse.</param>
2183 /// <param name="componentId">Identifier of parent component.</param>
2184 /// <param name="fileId">Identifier of referenced file.</param>
2185 private void ParsePerfCounterElement(Intermediate intermediate, IntermediateSection section, XElement element, string componentId, string fileId)
2186 {
2187 var sourceLineNumbers = this.ParseHelper.GetSourceLineNumbers(element);
2188 string name = null;
2189
2190 this.Messaging.Write(UtilWarnings.DeprecatedPerfCounterElement(sourceLineNumbers));
2191
2192 foreach (var attrib in element.Attributes())
2193 {
2194 if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || this.Namespace == attrib.Name.Namespace)
2195 {
2196 switch (attrib.Name.LocalName)
2197 {
2198 case "Name":
2199 name = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
2200 break;
2201 default:
2202 this.ParseHelper.UnexpectedAttribute(element, attrib);
2203 break;
2204 }
2205 }
2206 else
2207 {
2208 this.ParseHelper.ParseExtensionAttribute(this.Context.Extensions, intermediate, section, element, attrib);
2209 }
2210 }
2211
2212 if (null == name)
2213 {
2214 this.Messaging.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, element.Name.LocalName, "Name"));
2215 }
2216
2217 this.ParseHelper.ParseForExtensionElements(this.Context.Extensions, intermediate, section, element);
2218
2219 if (!this.Messaging.EncounteredError)
2220 {
2221 section.AddSymbol(new PerfmonSymbol(sourceLineNumbers)
2222 {
2223 ComponentRef = componentId,
2224 File = $"[#{fileId}]",
2225 Name = name,
2226 });
2227 }
2228
2229 this.ParseHelper.CreateCustomActionReference(sourceLineNumbers, section, "Wix4ConfigurePerfmonInstall", this.Context.Platform, CustomActionPlatforms.X86 | CustomActionPlatforms.X64 | CustomActionPlatforms.ARM64);
2230 this.ParseHelper.CreateCustomActionReference(sourceLineNumbers, section, "Wix4ConfigurePerfmonUninstall", this.Context.Platform, CustomActionPlatforms.X86 | CustomActionPlatforms.X64 | CustomActionPlatforms.ARM64);
2231 }
2232
2233
2234 /// <summary>
2235 /// Parses a perf manifest element.
2236 /// </summary>
2237 /// <param name="element">Element to parse.</param>
2238 /// <param name="componentId">Identifier of parent component.</param>
2239 /// <param name="fileId">Identifier of referenced file.</param>
2240 private void ParsePerfCounterManifestElement(Intermediate intermediate, IntermediateSection section, XElement element, string componentId, string fileId)
2241 {
2242 var sourceLineNumbers = this.ParseHelper.GetSourceLineNumbers(element);
2243 string resourceFileDirectory = null;
2244
2245 foreach (var attrib in element.Attributes())
2246 {
2247 if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || this.Namespace == attrib.Name.Namespace)
2248 {
2249 switch (attrib.Name.LocalName)
2250 {
2251 case "ResourceFileDirectory":
2252 resourceFileDirectory = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
2253 break;
2254 default:
2255 this.ParseHelper.UnexpectedAttribute(element, attrib);
2256 break;
2257 }
2258 }
2259 else
2260 {
2261 this.ParseHelper.ParseExtensionAttribute(this.Context.Extensions, intermediate, section, element, attrib);
2262 }
2263 }
2264
2265 this.ParseHelper.ParseForExtensionElements(this.Context.Extensions, intermediate, section, element);
2266
2267 if (!this.Messaging.EncounteredError)
2268 {
2269 section.AddSymbol(new PerfmonManifestSymbol(sourceLineNumbers)
2270 {
2271 ComponentRef = componentId,
2272 File = $"[#{fileId}]",
2273 ResourceFileDirectory = resourceFileDirectory,
2274 });
2275 }
2276
2277 this.ParseHelper.CreateCustomActionReference(sourceLineNumbers, section, "Wix4ConfigurePerfmonManifestRegister", this.Context.Platform, CustomActionPlatforms.X86 | CustomActionPlatforms.X64 | CustomActionPlatforms.ARM64);
2278 this.ParseHelper.CreateCustomActionReference(sourceLineNumbers, section, "Wix4ConfigurePerfmonManifestUnregister", this.Context.Platform, CustomActionPlatforms.X86 | CustomActionPlatforms.X64 | CustomActionPlatforms.ARM64);
2279 }
2280
2281 /// <summary>
2282 /// Parses a format files element.
2283 /// </summary>
2284 /// <param name="element">Element to parse.</param>
2285 /// <param name="fileId">Identifier of referenced file.</param>
2286 /// <param name="win64">Flag to determine whether the component is 64-bit.</param>
2287 private void ParseFormatFileElement(Intermediate intermediate, IntermediateSection section, XElement element, string fileId, bool win64)
2288 {
2289 var sourceLineNumbers = this.ParseHelper.GetSourceLineNumbers(element);
2290 string binaryId = null;
2291
2292 foreach (var attrib in element.Attributes())
2293 {
2294 if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || this.Namespace == attrib.Name.Namespace)
2295 {
2296 switch (attrib.Name.LocalName)
2297 {
2298 case "BinaryRef":
2299 binaryId = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
2300 break;
2301 default:
2302 this.ParseHelper.UnexpectedAttribute(element, attrib);
2303 break;
2304 }
2305 }
2306 else
2307 {
2308 this.ParseHelper.ParseExtensionAttribute(this.Context.Extensions, intermediate, section, element, attrib);
2309 }
2310 }
2311
2312 this.ParseHelper.ParseForExtensionElements(this.Context.Extensions, intermediate, section, element);
2313
2314 if (null == binaryId)
2315 {
2316 this.Messaging.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, element.Name.LocalName, "BinaryRef"));
2317 }
2318
2319 if (!this.Messaging.EncounteredError)
2320 {
2321 this.ParseHelper.CreateCustomActionReference(sourceLineNumbers, section, "Wix4SchedFormatFiles", this.Context.Platform, CustomActionPlatforms.X86 | CustomActionPlatforms.X64 | CustomActionPlatforms.ARM64);
2322
2323 section.AddSymbol(new WixFormatFilesSymbol(sourceLineNumbers)
2324 {
2325 BinaryRef = binaryId,
2326 FileRef = fileId,
2327 });
2328
2329 this.ParseHelper.CreateSimpleReference(section, sourceLineNumbers, SymbolDefinitions.Binary, binaryId);
2330 }
2331 }
2332
2333 /// <summary>
2334 /// Parses a event manifest element.
2335 /// </summary>
2336 /// <param name="element">Element to parse.</param>
2337 /// <param name="componentId">Identifier of parent component.</param>
2338 /// <param name="fileId">Identifier of referenced file.</param>
2339 private void ParseEventManifestElement(Intermediate intermediate, IntermediateSection section, XElement element, string componentId, string fileId)
2340 {
2341 var sourceLineNumbers = this.ParseHelper.GetSourceLineNumbers(element);
2342 string messageFile = null;
2343 string resourceFile = null;
2344 string parameterFile = null;
2345
2346 foreach (var attrib in element.Attributes())
2347 {
2348 if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || this.Namespace == attrib.Name.Namespace)
2349 {
2350 switch (attrib.Name.LocalName)
2351 {
2352 case "MessageFile":
2353 messageFile = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
2354 break;
2355 case "ResourceFile":
2356 resourceFile = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
2357 break;
2358 case "ParameterFile":
2359 parameterFile = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
2360 break;
2361 default:
2362 this.ParseHelper.UnexpectedAttribute(element, attrib);
2363 break;
2364 }
2365 }
2366 else
2367 {
2368 this.ParseHelper.ParseExtensionAttribute(this.Context.Extensions, intermediate, section, element, attrib);
2369 }
2370 }
2371
2372 this.ParseHelper.ParseForExtensionElements(this.Context.Extensions, intermediate, section, element);
2373
2374 if (!this.Messaging.EncounteredError)
2375 {
2376 section.AddSymbol(new EventManifestSymbol(sourceLineNumbers)
2377 {
2378 ComponentRef = componentId,
2379 File = $"[#{fileId}]",
2380 });
2381
2382 if (null != messageFile)
2383 {
2384 section.AddSymbol(new XmlFileSymbol(sourceLineNumbers, new Identifier(AccessModifier.Section, $"Config_{fileId}MessageFile"))
2385 {
2386 File = $"[#{fileId}]",
2387 ElementPath = "/*/*/*/*[\\[]@messageFileName[\\]]",
2388 Name = "messageFileName",
2389 Value = messageFile,
2390 Flags = 4 | 0x00001000, //bulk write | preserve modified date
2391 ComponentRef = componentId,
2392 });
2393 }
2394 if (null != parameterFile)
2395 {
2396 section.AddSymbol(new XmlFileSymbol(sourceLineNumbers, new Identifier(AccessModifier.Section, $"Config_{fileId}ParameterFile"))
2397 {
2398 File = $"[#{fileId}]",
2399 ElementPath = "/*/*/*/*[\\[]@parameterFileName[\\]]",
2400 Name = "parameterFileName",
2401 Value = parameterFile,
2402 Flags = 4 | 0x00001000, //bulk write | preserve modified date
2403 ComponentRef = componentId,
2404 });
2405 }
2406 if (null != resourceFile)
2407 {
2408 section.AddSymbol(new XmlFileSymbol(sourceLineNumbers, new Identifier(AccessModifier.Section, $"Config_{fileId}ResourceFile"))
2409 {
2410 File = $"[#{fileId}]",
2411 ElementPath = "/*/*/*/*[\\[]@resourceFileName[\\]]",
2412 Name = "resourceFileName",
2413 Value = resourceFile,
2414 Flags = 4 | 0x00001000, //bulk write | preserve modified date
2415 ComponentRef = componentId,
2416 });
2417 }
2418
2419 }
2420
2421 this.ParseHelper.CreateCustomActionReference(sourceLineNumbers, section, "Wix4ConfigureEventManifestRegister", this.Context.Platform, CustomActionPlatforms.X86 | CustomActionPlatforms.X64 | CustomActionPlatforms.ARM64);
2422 this.ParseHelper.CreateCustomActionReference(sourceLineNumbers, section, "Wix4ConfigureEventManifestUnregister", this.Context.Platform, CustomActionPlatforms.X86 | CustomActionPlatforms.X64 | CustomActionPlatforms.ARM64);
2423
2424 if (null != messageFile || null != parameterFile || null != resourceFile)
2425 {
2426 this.AddReferenceToSchedXmlFile(sourceLineNumbers, section);
2427 }
2428 }
2429
2430 /// <summary>
2431 /// Parses a PermissionEx element.
2432 /// </summary>
2433 /// <param name="element">Element to parse.</param>
2434 /// <param name="objectId">Identifier of object to be secured.</param>
2435 /// <param name="componentId">Identifier of component, used to determine install state.</param>
2436 /// <param name="win64">Flag to determine whether the component is 64-bit.</param>
2437 /// <param name="tableName">Name of table that contains objectId.</param>
2438 private void ParsePermissionExElement(Intermediate intermediate, IntermediateSection section, XElement element, string objectId, string componentId, bool win64, string tableName)
2439 {
2440 var sourceLineNumbers = this.ParseHelper.GetSourceLineNumbers(element);
2441 var bits = new BitArray(32);
2442 string domain = null;
2443 string[] specialPermissions = null;
2444 string user = null;
2445 var attributes = WixPermissionExAttributes.Inheritable; // default to inheritable.
2446
2447 var permissionType = PermissionType.SecureObjects;
2448
2449 switch (tableName)
2450 {
2451 case "CreateFolder":
2452 specialPermissions = UtilConstants.FolderPermissions;
2453 break;
2454 case "File":
2455 specialPermissions = UtilConstants.FilePermissions;
2456 break;
2457 case "Registry":
2458 specialPermissions = UtilConstants.RegistryPermissions;
2459 if (String.IsNullOrEmpty(objectId))
2460 {
2461 this.Messaging.Write(UtilErrors.InvalidRegistryObject(sourceLineNumbers, element.Parent.Name.LocalName));
2462 }
2463 break;
2464 case "ServiceInstall":
2465 specialPermissions = UtilConstants.ServicePermissions;
2466 permissionType = PermissionType.SecureObjects;
2467 break;
2468 default:
2469 this.ParseHelper.UnexpectedElement(element.Parent, element);
2470 break;
2471 }
2472
2473 foreach (var attrib in element.Attributes())
2474 {
2475 if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || this.Namespace == attrib.Name.Namespace)
2476 {
2477 switch (attrib.Name.LocalName)
2478 {
2479 case "Domain":
2480 if (PermissionType.FileSharePermissions == permissionType)
2481 {
2482 this.Messaging.Write(ErrorMessages.IllegalAttributeWhenNested(sourceLineNumbers, element.Name.LocalName, attrib.Name.LocalName, element.Parent.Name.LocalName));
2483 }
2484 domain = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
2485 break;
2486 case "Inheritable":
2487 if (this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib) == YesNoType.No)
2488 {
2489 attributes &= ~WixPermissionExAttributes.Inheritable;
2490 }
2491 break;
2492 case "User":
2493 user = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
2494 break;
2495 default:
2496 var attribValue = this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib);
2497 if (!this.TrySetBitFromName(UtilConstants.StandardPermissions, attrib.Name.LocalName, attribValue, bits, 16))
2498 {
2499 if (!this.TrySetBitFromName(UtilConstants.GenericPermissions, attrib.Name.LocalName, attribValue, bits, 28))
2500 {
2501 if (!this.TrySetBitFromName(specialPermissions, attrib.Name.LocalName, attribValue, bits, 0))
2502 {
2503 this.ParseHelper.UnexpectedAttribute(element, attrib);
2504 break;
2505 }
2506 }
2507 }
2508 break;
2509 }
2510 }
2511 else
2512 {
2513 this.ParseHelper.ParseExtensionAttribute(this.Context.Extensions, intermediate, section, element, attrib);
2514 }
2515 }
2516
2517 var permission = this.CreateIntegerFromBitArray(bits);
2518
2519 if (null == user)
2520 {
2521 this.Messaging.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, element.Name.LocalName, "User"));
2522 }
2523
2524 if (Int32.MinValue == permission) // just GENERIC_READ, which is MSI_NULL
2525 {
2526 this.Messaging.Write(ErrorMessages.GenericReadNotAllowed(sourceLineNumbers));
2527 }
2528
2529 this.ParseHelper.ParseForExtensionElements(this.Context.Extensions, intermediate, section, element);
2530
2531 if (!this.Messaging.EncounteredError)
2532 {
2533 this.ParseHelper.CreateCustomActionReference(sourceLineNumbers, section, "Wix4SchedSecureObjects", this.Context.Platform, CustomActionPlatforms.X86 | CustomActionPlatforms.X64 | CustomActionPlatforms.ARM64);
2534
2535 var id = this.ParseHelper.CreateIdentifier("sec", objectId, tableName, domain, user);
2536 section.AddSymbol(new SecureObjectsSymbol(sourceLineNumbers, id)
2537 {
2538 SecureObject = objectId,
2539 Table = tableName,
2540 Domain = domain,
2541 User = user,
2542 Attributes = attributes,
2543 Permission = permission,
2544 ComponentRef = componentId,
2545 });
2546 }
2547 }
2548
2549 /// <summary>
2550 /// Parses a ProductSearch element.
2551 /// </summary>
2552 /// <param name="element">Element to parse.</param>
2553 private void ParseProductSearchElement(Intermediate intermediate, IntermediateSection section, XElement element)
2554 {
2555 var sourceLineNumbers = this.ParseHelper.GetSourceLineNumbers(element);
2556 Identifier id = null;
2557 string variable = null;
2558 string condition = null;
2559 string after = null;
2560 string productCode = null;
2561 string upgradeCode = null;
2562 var attributes = WixProductSearchAttributes.Version;
2563
2564 foreach (var attrib in element.Attributes())
2565 {
2566 if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || this.Namespace == attrib.Name.Namespace)
2567 {
2568 switch (attrib.Name.LocalName)
2569 {
2570 case "Id":
2571 case "Variable":
2572 case "Condition":
2573 case "After":
2574 this.ParseCommonSearchAttributes(sourceLineNumbers, attrib, ref id, ref variable, ref condition, ref after);
2575 break;
2576 case "ProductCode":
2577 productCode = this.ParseHelper.GetAttributeGuidValue(sourceLineNumbers, attrib, false);
2578 break;
2579 case "UpgradeCode":
2580 upgradeCode = this.ParseHelper.GetAttributeGuidValue(sourceLineNumbers, attrib, false);
2581 break;
2582 case "Result":
2583 var result = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
2584 switch (result)
2585 {
2586 case "version":
2587 attributes = WixProductSearchAttributes.Version;
2588 break;
2589 case "language":
2590 attributes = WixProductSearchAttributes.Language;
2591 break;
2592 case "state":
2593 attributes = WixProductSearchAttributes.State;
2594 break;
2595 case "assignment":
2596 attributes = WixProductSearchAttributes.Assignment;
2597 break;
2598 default:
2599 this.Messaging.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, attrib.Parent.Name.LocalName, attrib.Name.LocalName, result, "version", "language", "state", "assignment"));
2600 break;
2601 }
2602 break;
2603 default:
2604 this.ParseHelper.UnexpectedAttribute(element, attrib);
2605 break;
2606 }
2607 }
2608 else
2609 {
2610 this.ParseHelper.ParseExtensionAttribute(this.Context.Extensions, intermediate, section, element, attrib);
2611 }
2612 }
2613
2614 if (null == upgradeCode && null == productCode)
2615 {
2616 this.Messaging.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, element.Name.LocalName, "ProductCode", "UpgradeCode", true));
2617 }
2618
2619 if (null != upgradeCode && null != productCode)
2620 {
2621 this.Messaging.Write(ErrorMessages.IllegalAttributeWithOtherAttribute(sourceLineNumbers, element.Name.LocalName, "UpgradeCode", "ProductCode"));
2622 }
2623
2624 if (null == id)
2625 {
2626 id = this.ParseHelper.CreateIdentifier("wps", variable, condition, after, (productCode == null ? upgradeCode : productCode), attributes.ToString());
2627 }
2628
2629 this.ParseHelper.ParseForExtensionElements(this.Context.Extensions, intermediate, section, element);
2630
2631 this.ParseHelper.CreateWixSearchSymbol(section, sourceLineNumbers, element.Name.LocalName, id, variable, condition, after, null);
2632
2633 if (!this.Messaging.EncounteredError)
2634 {
2635 // set an additional flag if this is an upgrade code
2636 if (null != upgradeCode)
2637 {
2638 attributes |= WixProductSearchAttributes.UpgradeCode;
2639 }
2640
2641 section.AddSymbol(new WixProductSearchSymbol(sourceLineNumbers, id)
2642 {
2643 Guid = productCode ?? upgradeCode,
2644 Attributes = attributes,
2645 });
2646 }
2647 }
2648
2649 /// <summary>
2650 /// Parses a RegistrySearch element.
2651 /// </summary>
2652 /// <param name="element">Element to parse.</param>
2653 private void ParseRegistrySearchElement(Intermediate intermediate, IntermediateSection section, XElement element)
2654 {
2655 var sourceLineNumbers = this.ParseHelper.GetSourceLineNumbers(element);
2656 Identifier id = null;
2657 string variable = null;
2658 string condition = null;
2659 string after = null;
2660 RegistryRootType? root = null;
2661 string key = null;
2662 string value = null;
2663 var expand = YesNoType.NotSet;
2664 var win64 = this.Context.IsCurrentPlatform64Bit;
2665 var attributes = WixRegistrySearchAttributes.Raw | WixRegistrySearchAttributes.WantValue;
2666
2667 foreach (var attrib in element.Attributes())
2668 {
2669 if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || this.Namespace == attrib.Name.Namespace)
2670 {
2671 switch (attrib.Name.LocalName)
2672 {
2673 case "Id":
2674 case "Variable":
2675 case "Condition":
2676 case "After":
2677 this.ParseCommonSearchAttributes(sourceLineNumbers, attrib, ref id, ref variable, ref condition, ref after);
2678 break;
2679 case "Bitness":
2680 var bitnessValue = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
2681 switch (bitnessValue)
2682 {
2683 case "always32":
2684 win64 = false;
2685 break;
2686 case "always64":
2687 win64 = true;
2688 break;
2689 case "default":
2690 case "":
2691 break;
2692 default:
2693 this.Messaging.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, attrib.Name.LocalName, attrib.Name.LocalName, bitnessValue, "default", "always32", "always64"));
2694 break;
2695 }
2696 break;
2697 case "Root":
2698 root = this.ParseHelper.GetAttributeRegistryRootValue(sourceLineNumbers, attrib, false);
2699 break;
2700 case "Key":
2701 key = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
2702 break;
2703 case "Value":
2704 value = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
2705 break;
2706 case "ExpandEnvironmentVariables":
2707 expand = this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib);
2708 break;
2709 case "Format":
2710 string format = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
2711 switch (format)
2712 {
2713 case "raw":
2714 attributes |= WixRegistrySearchAttributes.Raw;
2715 break;
2716 case "compatible":
2717 attributes |= WixRegistrySearchAttributes.Compatible;
2718 break;
2719 default:
2720 this.Messaging.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, attrib.Parent.Name.LocalName, attrib.Name.LocalName, format, "raw", "compatible"));
2721 break;
2722 }
2723 break;
2724 case "Result":
2725 var result = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
2726 switch (result)
2727 {
2728 case "exists":
2729 attributes |= WixRegistrySearchAttributes.WantExists;
2730 break;
2731 case "value":
2732 attributes |= WixRegistrySearchAttributes.WantValue;
2733 break;
2734 default:
2735 this.Messaging.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, attrib.Parent.Name.LocalName, attrib.Name.LocalName, result, "exists", "value"));
2736 break;
2737 }
2738 break;
2739 default:
2740 this.ParseHelper.UnexpectedAttribute(element, attrib);
2741 break;
2742 }
2743 }
2744 else
2745 {
2746 this.ParseHelper.ParseExtensionAttribute(this.Context.Extensions, intermediate, section, element, attrib);
2747 }
2748 }
2749
2750 if (!root.HasValue)
2751 {
2752 this.Messaging.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, element.Name.LocalName, "Root"));
2753 }
2754
2755 if (null == key)
2756 {
2757 this.Messaging.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, element.Name.LocalName, "Key"));
2758 }
2759
2760 if (null == id)
2761 {
2762 id = this.ParseHelper.CreateIdentifier("wrs", variable, condition, after, root.ToString(), key, value, attributes.ToString());
2763 }
2764
2765 if (expand == YesNoType.Yes)
2766 {
2767 if (0 != (attributes & WixRegistrySearchAttributes.WantExists))
2768 {
2769 this.Messaging.Write(ErrorMessages.IllegalAttributeValueWithOtherAttribute(sourceLineNumbers, element.Name.LocalName, "ExpandEnvironmentVariables", expand.ToString(), "Result", "exists"));
2770 }
2771
2772 attributes |= WixRegistrySearchAttributes.ExpandEnvironmentVariables;
2773 }
2774
2775 if (win64)
2776 {
2777 attributes |= WixRegistrySearchAttributes.Win64;
2778 }
2779
2780 this.ParseHelper.ParseForExtensionElements(this.Context.Extensions, intermediate, section, element);
2781
2782 this.ParseHelper.CreateWixSearchSymbol(section, sourceLineNumbers, element.Name.LocalName, id, variable, condition, after, null);
2783
2784 if (!this.Messaging.EncounteredError)
2785 {
2786 section.AddSymbol(new WixRegistrySearchSymbol(sourceLineNumbers, id)
2787 {
2788 Root = root.Value,
2789 Key = key,
2790 Value = value,
2791 Attributes = attributes,
2792 });
2793 }
2794 }
2795
2796 /// <summary>
2797 /// Parses a RemoveFolderEx element.
2798 /// </summary>
2799 /// <param name="element">Element to parse.</param>
2800 /// <param name="componentId">Identifier of parent component.</param>
2801 private void ParseRemoveFolderExElement(Intermediate intermediate, IntermediateSection section, XElement element, string componentId)
2802 {
2803 var sourceLineNumbers = this.ParseHelper.GetSourceLineNumbers(element);
2804 Identifier id = null;
2805 var mode = WixRemoveFolderExInstallMode.Uninstall;
2806 string property = null;
2807 string condition = null;
2808
2809 foreach (var attrib in element.Attributes())
2810 {
2811 if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || this.Namespace == attrib.Name.Namespace)
2812 {
2813 switch (attrib.Name.LocalName)
2814 {
2815 case "Condition":
2816 condition = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
2817 break;
2818 case "Id":
2819 id = this.ParseHelper.GetAttributeIdentifier(sourceLineNumbers, attrib);
2820 break;
2821 case "On":
2822 var onValue = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
2823 if (onValue.Length == 0)
2824 {
2825 }
2826 else
2827 {
2828 switch (onValue)
2829 {
2830 case "install":
2831 mode = WixRemoveFolderExInstallMode.Install;
2832 break;
2833 case "uninstall":
2834 mode = WixRemoveFolderExInstallMode.Uninstall;
2835 break;
2836 case "both":
2837 mode = WixRemoveFolderExInstallMode.Both;
2838 break;
2839 default:
2840 this.Messaging.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, element.Name.LocalName, "On", onValue, "install", "uninstall", "both"));
2841 break;
2842 }
2843 }
2844 break;
2845 case "Property":
2846 property = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
2847 break;
2848 default:
2849 this.ParseHelper.UnexpectedAttribute(element, attrib);
2850 break;
2851 }
2852 }
2853 else
2854 {
2855 this.ParseHelper.ParseExtensionAttribute(this.Context.Extensions, intermediate, section, element, attrib);
2856 }
2857 }
2858
2859 if (String.IsNullOrEmpty(property))
2860 {
2861 this.Messaging.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, element.Name.LocalName, "Property"));
2862 }
2863
2864 if (id == null)
2865 {
2866 id = this.ParseHelper.CreateIdentifier("wrf", componentId, property, mode.ToString());
2867 }
2868
2869 this.ParseHelper.ParseForExtensionElements(this.Context.Extensions, intermediate, section, element);
2870
2871 if (!this.Messaging.EncounteredError)
2872 {
2873 this.ParseHelper.CreateCustomActionReference(sourceLineNumbers, section, "Wix4RemoveFoldersEx", this.Context.Platform, CustomActionPlatforms.X86 | CustomActionPlatforms.X64 | CustomActionPlatforms.ARM64);
2874
2875 section.AddSymbol(new WixRemoveFolderExSymbol(sourceLineNumbers, id)
2876 {
2877 ComponentRef = componentId,
2878 Property = property,
2879 InstallMode = mode,
2880 Condition = condition
2881 });
2882
2883 this.ParseHelper.EnsureTable(section, sourceLineNumbers, "RemoveFile");
2884 }
2885 }
2886
2887 /// <summary>
2888 /// Parses a RemoveRegistryKeyEx element.
2889 /// </summary>
2890 /// <param name="node">Element to parse.</param>
2891 /// <param name="componentId">Identifier of parent component.</param>
2892 private void ParseRemoveRegistryKeyExElement(Intermediate intermediate, IntermediateSection section, XElement element, string componentId)
2893 {
2894 var sourceLineNumbers = this.ParseHelper.GetSourceLineNumbers(element);
2895 Identifier id = null;
2896 var mode = WixRemoveRegistryKeyExInstallMode.Uninstall;
2897 string condition = null;
2898 RegistryRootType? root = null;
2899 string key = null;
2900
2901 foreach (var attrib in element.Attributes())
2902 {
2903 if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || this.Namespace == attrib.Name.Namespace)
2904 {
2905 switch (attrib.Name.LocalName)
2906 {
2907 case "Condition":
2908 condition = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
2909 break;
2910 case "Id":
2911 id = this.ParseHelper.GetAttributeIdentifier(sourceLineNumbers, attrib);
2912 break;
2913 case "On":
2914 var actionValue = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
2915 switch (actionValue)
2916 {
2917 case "":
2918 break;
2919 case "install":
2920 mode = WixRemoveRegistryKeyExInstallMode.Install;
2921 break;
2922 case "uninstall":
2923 mode = WixRemoveRegistryKeyExInstallMode.Uninstall;
2924 break;
2925 default:
2926 this.Messaging.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, element.Name.LocalName, "On", actionValue, "install", "uninstall"));
2927 break;
2928 }
2929 break;
2930 case "Root":
2931 root = this.ParseHelper.GetAttributeRegistryRootValue(sourceLineNumbers, attrib, false);
2932 break;
2933 case "Key":
2934 key = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
2935 break;
2936 default:
2937 this.ParseHelper.UnexpectedAttribute(element, attrib);
2938 break;
2939 }
2940 }
2941 else
2942 {
2943 this.ParseHelper.ParseExtensionAttribute(this.Context.Extensions, intermediate, section, element, attrib);
2944 }
2945 }
2946
2947 if (!root.HasValue)
2948 {
2949 this.Messaging.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, element.Name.LocalName, "Root"));
2950 }
2951
2952 if (key == null)
2953 {
2954 this.Messaging.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, element.Name.LocalName, "Key"));
2955 }
2956
2957 if (id == null)
2958 {
2959 id = this.ParseHelper.CreateIdentifier("rrx", componentId, condition, root.ToString(), key, mode.ToString());
2960 }
2961
2962 this.ParseHelper.ParseForExtensionElements(this.Context.Extensions, intermediate, section, element);
2963
2964 if (!this.Messaging.EncounteredError)
2965 {
2966 this.ParseHelper.EnsureTable(section, sourceLineNumbers, "Registry");
2967 this.ParseHelper.EnsureTable(section, sourceLineNumbers, "RemoveRegistry");
2968 this.ParseHelper.CreateCustomActionReference(sourceLineNumbers, section, "Wix4RemoveRegistryKeysEx", this.Context.Platform, CustomActionPlatforms.X86 | CustomActionPlatforms.X64 | CustomActionPlatforms.ARM64);
2969
2970 section.AddSymbol(new WixRemoveRegistryKeyExSymbol(sourceLineNumbers, id)
2971 {
2972 ComponentRef = componentId,
2973 Root = root.Value,
2974 Key = key,
2975 InstallMode = mode,
2976 Condition = condition
2977 });
2978 }
2979 }
2980
2981 /// <summary>
2982 /// Parses a RestartResource element.
2983 /// </summary>
2984 /// <param name="element">The element to parse.</param>
2985 /// <param name="componentId">The identity of the parent component.</param>
2986 private void ParseRestartResourceElement(Intermediate intermediate, IntermediateSection section, XElement element, string componentId)
2987 {
2988 var sourceLineNumbers = this.ParseHelper.GetSourceLineNumbers(element);
2989 Identifier id = null;
2990 string resource = null;
2991 WixRestartResourceAttributes? attributes = null;
2992
2993 foreach (var attrib in element.Attributes())
2994 {
2995 if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || this.Namespace == attrib.Name.Namespace)
2996 {
2997 switch (attrib.Name.LocalName)
2998 {
2999 case "Id":
3000 id = this.ParseHelper.GetAttributeIdentifier(sourceLineNumbers, attrib);
3001 break;
3002
3003 case "Path":
3004 resource = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
3005 attributes = WixRestartResourceAttributes.Filename;
3006 break;
3007
3008 case "ProcessName":
3009 resource = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
3010 attributes = WixRestartResourceAttributes.ProcessName;
3011 break;
3012
3013 case "ServiceName":
3014 resource = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
3015 attributes = WixRestartResourceAttributes.ServiceName;
3016 break;
3017
3018 default:
3019 this.ParseHelper.UnexpectedAttribute(element, attrib);
3020 break;
3021 }
3022 }
3023 else
3024 {
3025 this.ParseHelper.ParseExtensionAttribute(this.Context.Extensions, intermediate, section, element, attrib);
3026 }
3027 }
3028
3029 // Validate the attribute.
3030 if (id == null)
3031 {
3032 id = this.ParseHelper.CreateIdentifier("wrr", componentId, resource, attributes.ToString());
3033 }
3034
3035 if (!attributes.HasValue)
3036 {
3037 this.Messaging.Write(ErrorMessages.ExpectedAttributes(sourceLineNumbers, element.Name.LocalName, "Path", "ProcessName", "ServiceName"));
3038 }
3039
3040 this.ParseHelper.ParseForExtensionElements(this.Context.Extensions, intermediate, section, element);
3041
3042 if (!this.Messaging.EncounteredError)
3043 {
3044 this.ParseHelper.CreateCustomActionReference(sourceLineNumbers, section, "Wix4RegisterRestartResources", this.Context.Platform, CustomActionPlatforms.X86 | CustomActionPlatforms.X64 | CustomActionPlatforms.ARM64);
3045
3046 section.AddSymbol(new WixRestartResourceSymbol(sourceLineNumbers, id)
3047 {
3048 ComponentRef = componentId,
3049 Resource = resource,
3050 Attributes = attributes,
3051 });
3052 }
3053 }
3054
3055 /// <summary>
3056 /// Parses a service configuration element.
3057 /// </summary>
3058 /// <param name="element">Element to parse.</param>
3059 /// <param name="componentId">Identifier of parent component.</param>
3060 /// <param name="parentTableName">Name of parent element.</param>
3061 /// <param name="parentTableServiceName">Optional name of service </param>
3062 private void ParseServiceConfigElement(Intermediate intermediate, IntermediateSection section, XElement element, string componentId, string parentTableName, string parentTableServiceName)
3063 {
3064 var sourceLineNumbers = this.ParseHelper.GetSourceLineNumbers(element);
3065 string firstFailureActionType = null;
3066 var newService = false;
3067 string programCommandLine = null;
3068 string rebootMessage = null;
3069 var resetPeriod = CompilerConstants.IntegerNotSet;
3070 var restartServiceDelay = CompilerConstants.IntegerNotSet;
3071 string secondFailureActionType = null;
3072 string serviceName = null;
3073 string thirdFailureActionType = null;
3074
3075 foreach (var attrib in element.Attributes())
3076 {
3077 if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || this.Namespace == attrib.Name.Namespace)
3078 {
3079 switch (attrib.Name.LocalName)
3080 {
3081 case "FirstFailureActionType":
3082 firstFailureActionType = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
3083 break;
3084 case "ProgramCommandLine":
3085 programCommandLine = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
3086 break;
3087 case "RebootMessage":
3088 rebootMessage = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
3089 break;
3090 case "ResetPeriodInDays":
3091 resetPeriod = this.ParseHelper.GetAttributeIntegerValue(sourceLineNumbers, attrib, 0, Int32.MaxValue);
3092 break;
3093 case "RestartServiceDelayInSeconds":
3094 restartServiceDelay = this.ParseHelper.GetAttributeIntegerValue(sourceLineNumbers, attrib, 0, Int32.MaxValue);
3095 break;
3096 case "SecondFailureActionType":
3097 secondFailureActionType = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
3098 break;
3099 case "ServiceName":
3100 serviceName = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
3101 break;
3102 case "ThirdFailureActionType":
3103 thirdFailureActionType = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
3104 break;
3105 default:
3106 this.ParseHelper.UnexpectedAttribute(element, attrib);
3107 break;
3108 }
3109 }
3110 else
3111 {
3112 this.ParseHelper.ParseExtensionAttribute(this.Context.Extensions, intermediate, section, element, attrib);
3113 }
3114 }
3115
3116 // if this element is a child of ServiceInstall then ignore the service name provided.
3117 if ("ServiceInstall" == parentTableName)
3118 {
3119 // TODO: the ServiceName attribute should not be allowed in this case (the overwriting behavior may confuse users)
3120 serviceName = parentTableServiceName;
3121 newService = true;
3122 }
3123 else
3124 {
3125 // not a child of ServiceInstall, so ServiceName must have been provided
3126 if (null == serviceName)
3127 {
3128 this.Messaging.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, element.Name.LocalName, "ServiceName"));
3129 }
3130 }
3131
3132 this.ParseHelper.ParseForExtensionElements(this.Context.Extensions, intermediate, section, element);
3133
3134 if (!this.Messaging.EncounteredError)
3135 {
3136 this.ParseHelper.CreateCustomActionReference(sourceLineNumbers, section, "Wix4SchedServiceConfig", this.Context.Platform, CustomActionPlatforms.X86 | CustomActionPlatforms.X64 | CustomActionPlatforms.ARM64);
3137
3138 section.AddSymbol(new ServiceConfigSymbol(sourceLineNumbers)
3139 {
3140 ServiceName = serviceName,
3141 ComponentRef = componentId,
3142 NewService = newService ? 1 : 0,
3143 FirstFailureActionType = firstFailureActionType,
3144 SecondFailureActionType = secondFailureActionType,
3145 ThirdFailureActionType = thirdFailureActionType,
3146 ResetPeriodInDays = resetPeriod,
3147 RestartServiceDelayInSeconds = restartServiceDelay,
3148 ProgramCommandLine = programCommandLine,
3149 RebootMessage = rebootMessage,
3150 });
3151 }
3152 }
3153
3154 /// <summary>
3155 /// Parses a touch file element.
3156 /// </summary>
3157 /// <param name="element">Element to parse.</param>
3158 /// <param name="componentId">Identifier of parent component.</param>
3159 /// <param name="win64">Indicates whether the path is a 64-bit path.</param>
3160 private void ParseTouchFileElement(Intermediate intermediate, IntermediateSection section, XElement element, string componentId, bool win64)
3161 {
3162 var sourceLineNumbers = this.ParseHelper.GetSourceLineNumbers(element);
3163 Identifier id = null;
3164 string path = null;
3165 var onInstall = YesNoType.NotSet;
3166 var onReinstall = YesNoType.NotSet;
3167 var onUninstall = YesNoType.NotSet;
3168 var nonvital = YesNoType.NotSet;
3169 int attributes = 0;
3170
3171 foreach (var attrib in element.Attributes())
3172 {
3173 if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || this.Namespace == attrib.Name.Namespace)
3174 {
3175 switch (attrib.Name.LocalName)
3176 {
3177 case "Id":
3178 id = this.ParseHelper.GetAttributeIdentifier(sourceLineNumbers, attrib);
3179 break;
3180 case "Path":
3181 path = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
3182 break;
3183 case "OnInstall":
3184 onInstall = this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib);
3185 break;
3186 case "OnReinstall":
3187 onReinstall = this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib);
3188 break;
3189 case "OnUninstall":
3190 onUninstall = this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib);
3191 break;
3192 case "Nonvital":
3193 nonvital = this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib);
3194 break;
3195 default:
3196 this.ParseHelper.UnexpectedAttribute(element, attrib);
3197 break;
3198 }
3199 }
3200 else
3201 {
3202 this.ParseHelper.ParseExtensionAttribute(this.Context.Extensions, intermediate, section, element, attrib);
3203 }
3204 }
3205
3206 if (null == path)
3207 {
3208 this.Messaging.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, element.Name.LocalName, "Path"));
3209 }
3210
3211 // If none of the scheduling actions are set, default to touching on install and reinstall.
3212 if (YesNoType.NotSet == onInstall && YesNoType.NotSet == onReinstall && YesNoType.NotSet == onUninstall)
3213 {
3214 onInstall = YesNoType.Yes;
3215 onReinstall = YesNoType.Yes;
3216 }
3217
3218 attributes |= YesNoType.Yes == onInstall ? 0x1 : 0;
3219 attributes |= YesNoType.Yes == onReinstall ? 0x2 : 0;
3220 attributes |= YesNoType.Yes == onUninstall ? 0x4 : 0;
3221 attributes |= win64 ? 0x10 : 0;
3222 attributes |= YesNoType.Yes == nonvital ? 0 : 0x20;
3223
3224 if (null == id)
3225 {
3226 id = this.ParseHelper.CreateIdentifier("tf", path, attributes.ToString());
3227 }
3228
3229 this.ParseHelper.ParseForExtensionElements(this.Context.Extensions, intermediate, section, element);
3230
3231 if (!this.Messaging.EncounteredError)
3232 {
3233 section.AddSymbol(new WixTouchFileSymbol(sourceLineNumbers, id)
3234 {
3235 ComponentRef = componentId,
3236 Path = path,
3237 Attributes = attributes,
3238 });
3239
3240 this.ParseHelper.CreateCustomActionReference(sourceLineNumbers, section, "Wix4TouchFileDuringInstall", this.Context.Platform, CustomActionPlatforms.X86 | CustomActionPlatforms.X64 | CustomActionPlatforms.ARM64);
3241 }
3242 }
3243
3244 /// <summary>
3245 /// Parses an user element.
3246 /// </summary>
3247 /// <param name="element">Element to parse.</param>
3248 /// <param name="componentId">Optional identifier of parent component.</param>
3249 private void ParseUserElement(Intermediate intermediate, IntermediateSection section, XElement element, string componentId)
3250 {
3251 var sourceLineNumbers = this.ParseHelper.GetSourceLineNumbers(element);
3252 Identifier id = null;
3253 int attributes = 0;
3254 string domain = null;
3255 string name = null;
3256 string password = null;
3257
3258 foreach (var attrib in element.Attributes())
3259 {
3260 if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || this.Namespace == attrib.Name.Namespace)
3261 {
3262 switch (attrib.Name.LocalName)
3263 {
3264 case "Id":
3265 id = this.ParseHelper.GetAttributeIdentifier(sourceLineNumbers, attrib);
3266 break;
3267 case "CanNotChangePassword":
3268 if (null == componentId)
3269 {
3270 this.Messaging.Write(UtilErrors.IllegalAttributeWithoutComponent(sourceLineNumbers, element.Name.LocalName, attrib.Name.LocalName));
3271 }
3272
3273 if (YesNoType.Yes == this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib))
3274 {
3275 attributes |= UserPasswdCantChange;
3276 }
3277 break;
3278 case "CreateUser":
3279 if (null == componentId)
3280 {
3281 this.Messaging.Write(UtilErrors.IllegalAttributeWithoutComponent(sourceLineNumbers, element.Name.LocalName, attrib.Name.LocalName));
3282 }
3283
3284 if (YesNoType.No == this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib))
3285 {
3286 attributes |= UserDontCreateUser;
3287 }
3288 break;
3289 case "Disabled":
3290 if (null == componentId)
3291 {
3292 this.Messaging.Write(UtilErrors.IllegalAttributeWithoutComponent(sourceLineNumbers, element.Name.LocalName, attrib.Name.LocalName));
3293 }
3294
3295 if (YesNoType.Yes == this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib))
3296 {
3297 attributes |= UserDisableAccount;
3298 }
3299 break;
3300 case "Domain":
3301 domain = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
3302 break;
3303 case "FailIfExists":
3304 if (null == componentId)
3305 {
3306 this.Messaging.Write(UtilErrors.IllegalAttributeWithoutComponent(sourceLineNumbers, element.Name.LocalName, attrib.Name.LocalName));
3307 }
3308
3309 if (YesNoType.Yes == this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib))
3310 {
3311 attributes |= UserFailIfExists;
3312 }
3313 break;
3314 case "LogonAsService":
3315 if (null == componentId)
3316 {
3317 this.Messaging.Write(UtilErrors.IllegalAttributeWithoutComponent(sourceLineNumbers, element.Name.LocalName, attrib.Name.LocalName));
3318 }
3319 if (YesNoType.Yes == this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib))
3320 {
3321 attributes |= UserLogonAsService;
3322 }
3323 break;
3324 case "LogonAsBatchJob":
3325 if (null == componentId)
3326 {
3327 this.Messaging.Write(UtilErrors.IllegalAttributeWithoutComponent(sourceLineNumbers, element.Name.LocalName, attrib.Name.LocalName));
3328 }
3329 if (YesNoType.Yes == this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib))
3330 {
3331 attributes |= UserLogonAsBatchJob;
3332 }
3333 break;
3334 case "Name":
3335 name = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
3336 break;
3337 case "Password":
3338 password = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
3339 break;
3340 case "PasswordExpired":
3341 if (null == componentId)
3342 {
3343 this.Messaging.Write(UtilErrors.IllegalAttributeWithoutComponent(sourceLineNumbers, element.Name.LocalName, attrib.Name.LocalName));
3344 }
3345
3346 if (YesNoType.Yes == this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib))
3347 {
3348 attributes |= UserPasswdChangeReqdOnLogin;
3349 }
3350 break;
3351 case "PasswordNeverExpires":
3352 if (null == componentId)
3353 {
3354 this.Messaging.Write(UtilErrors.IllegalAttributeWithoutComponent(sourceLineNumbers, element.Name.LocalName, attrib.Name.LocalName));
3355 }
3356
3357 if (YesNoType.Yes == this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib))
3358 {
3359 attributes |= UserDontExpirePasswrd;
3360 }
3361 break;
3362 case "RemoveOnUninstall":
3363 if (null == componentId)
3364 {
3365 this.Messaging.Write(UtilErrors.IllegalAttributeWithoutComponent(sourceLineNumbers, element.Name.LocalName, attrib.Name.LocalName));
3366 }
3367
3368 if (YesNoType.No == this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib))
3369 {
3370 attributes |= UserDontRemoveOnUninstall;
3371 }
3372 break;
3373 case "UpdateIfExists":
3374 if (null == componentId)
3375 {
3376 this.Messaging.Write(UtilErrors.IllegalAttributeWithoutComponent(sourceLineNumbers, element.Name.LocalName, attrib.Name.LocalName));
3377 }
3378
3379 if (YesNoType.Yes == this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib))
3380 {
3381 attributes |= UserUpdateIfExists;
3382 }
3383 break;
3384 case "Vital":
3385 if (null == componentId)
3386 {
3387 this.Messaging.Write(UtilErrors.IllegalAttributeWithoutComponent(sourceLineNumbers, element.Name.LocalName, attrib.Name.LocalName));
3388 }
3389
3390 if (YesNoType.No == this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib))
3391 {
3392 attributes |= UserNonVital;
3393 }
3394 break;
3395 default:
3396 this.ParseHelper.UnexpectedAttribute(element, attrib);
3397 break;
3398 }
3399 }
3400 else
3401 {
3402 this.ParseHelper.ParseExtensionAttribute(this.Context.Extensions, intermediate, section, element, attrib);
3403 }
3404 }
3405
3406 if (null == id)
3407 {
3408 id = this.ParseHelper.CreateIdentifier("usr", componentId, name);
3409 }
3410
3411 if (null == name)
3412 {
3413 this.Messaging.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, element.Name.LocalName, "Name"));
3414 }
3415
3416 foreach (var child in element.Elements())
3417 {
3418 if (this.Namespace == child.Name.Namespace)
3419 {
3420 switch (child.Name.LocalName)
3421 {
3422 case "GroupRef":
3423 if (null == componentId)
3424 {
3425 var childSourceLineNumbers = this.ParseHelper.GetSourceLineNumbers(child);
3426 this.Messaging.Write(UtilErrors.IllegalElementWithoutComponent(childSourceLineNumbers, child.Name.LocalName));
3427 }
3428
3429 this.ParseGroupRefElement(intermediate, section, child, id.Id);
3430 break;
3431 default:
3432 this.ParseHelper.UnexpectedElement(element, child);
3433 break;
3434 }
3435 }
3436 else
3437 {
3438 this.ParseHelper.ParseExtensionElement(this.Context.Extensions, intermediate, section, element, child);
3439 }
3440 }
3441
3442 if (null != componentId)
3443 {
3444 this.ParseHelper.CreateCustomActionReference(sourceLineNumbers, section, "Wix4ConfigureUsers", this.Context.Platform, CustomActionPlatforms.X86 | CustomActionPlatforms.X64 | CustomActionPlatforms.ARM64);
3445 }
3446
3447 if (!this.Messaging.EncounteredError)
3448 {
3449 section.AddSymbol(new UserSymbol(sourceLineNumbers, id)
3450 {
3451 ComponentRef = componentId,
3452 Name = name,
3453 Domain = domain,
3454 Password = password,
3455 Attributes = attributes,
3456 });
3457 }
3458 }
3459
3460 /// <summary>
3461 /// Parses a XmlFile element.
3462 /// </summary>
3463 /// <param name="element">Element to parse.</param>
3464 /// <param name="componentId">Identifier of parent component.</param>
3465 private void ParseXmlFileElement(Intermediate intermediate, IntermediateSection section, XElement element, string componentId)
3466 {
3467 var sourceLineNumbers = this.ParseHelper.GetSourceLineNumbers(element);
3468 Identifier id = null;
3469 string file = null;
3470 string elementPath = null;
3471 string name = null;
3472 string value = null;
3473 int sequence = -1;
3474 int flags = 0;
3475
3476 foreach (var attrib in element.Attributes())
3477 {
3478 if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || this.Namespace == attrib.Name.Namespace)
3479 {
3480 switch (attrib.Name.LocalName)
3481 {
3482 case "Action":
3483 var actionValue = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
3484 switch (actionValue)
3485 {
3486 case "createElement":
3487 flags |= 0x00000001; // XMLFILE_CREATE_ELEMENT
3488 break;
3489 case "deleteValue":
3490 flags |= 0x00000002; // XMLFILE_DELETE_VALUE
3491 break;
3492 case "bulkSetValue":
3493 flags |= 0x00000004; // XMLFILE_BULKWRITE_VALUE
3494 break;
3495 case "setValue":
3496 // no flag for set value since it's the default
3497 break;
3498 default:
3499 this.Messaging.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, element.Name.LocalName, "Action", actionValue, "createElement", "deleteValue", "setValue", "bulkSetValue"));
3500 break;
3501 }
3502 break;
3503 case "SelectionLanguage":
3504 string selectionLanguage = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
3505 switch (selectionLanguage)
3506 {
3507 case "XPath":
3508 flags |= 0x00000100; // XMLFILE_USE_XPATH
3509 break;
3510 case "XSLPattern":
3511 // no flag for since it's the default
3512 break;
3513 default:
3514 this.Messaging.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, element.Name.LocalName, "SelectionLanguage", selectionLanguage, "XPath", "XSLPattern"));
3515 break;
3516 }
3517 break;
3518 case "Id":
3519 id = this.ParseHelper.GetAttributeIdentifier(sourceLineNumbers, attrib);
3520 break;
3521 case "File":
3522 file = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
3523 break;
3524 case "ElementPath":
3525 elementPath = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
3526 break;
3527 case "Name":
3528 name = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
3529 break;
3530 case "Permanent":
3531 if (YesNoType.Yes == this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib))
3532 {
3533 flags |= 0x00010000; // XMLFILE_DONT_UNINSTALL
3534 }
3535 break;
3536 case "Sequence":
3537 sequence = this.ParseHelper.GetAttributeIntegerValue(sourceLineNumbers, attrib, 1, Int16.MaxValue);
3538 break;
3539 case "Value":
3540 value = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
3541 break;
3542 case "PreserveModifiedDate":
3543 if (YesNoType.Yes == this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib))
3544 {
3545 flags |= 0x00001000; // XMLFILE_PRESERVE_MODIFIED
3546 }
3547 break;
3548 default:
3549 this.ParseHelper.UnexpectedAttribute(element, attrib);
3550 break;
3551 }
3552 }
3553 else
3554 {
3555 this.ParseHelper.ParseExtensionAttribute(this.Context.Extensions, intermediate, section, element, attrib);
3556 }
3557 }
3558
3559 if (null == id)
3560 {
3561 id = this.ParseHelper.CreateIdentifier("uxf", componentId, file, elementPath, name);
3562 }
3563
3564 if (null == file)
3565 {
3566 this.Messaging.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, element.Name.LocalName, "File"));
3567 }
3568
3569 if (null == elementPath)
3570 {
3571 this.Messaging.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, element.Name.LocalName, "ElementPath"));
3572 }
3573
3574 if ((0x00000001 /*XMLFILE_CREATE_ELEMENT*/ & flags) != 0 && null == name)
3575 {
3576 this.Messaging.Write(ErrorMessages.IllegalAttributeWithoutOtherAttributes(sourceLineNumbers, element.Name.LocalName, "Action", "Name"));
3577 }
3578
3579 this.ParseHelper.ParseForExtensionElements(this.Context.Extensions, intermediate, section, element);
3580
3581 if (!this.Messaging.EncounteredError)
3582 {
3583 var symbol = section.AddSymbol(new XmlFileSymbol(sourceLineNumbers, id)
3584 {
3585 File = file,
3586 ElementPath = elementPath,
3587 Name = name,
3588 Value = value,
3589 Flags = flags,
3590 ComponentRef = componentId,
3591 });
3592 if (-1 != sequence)
3593 {
3594 symbol.Sequence = sequence;
3595 }
3596 }
3597
3598 this.AddReferenceToSchedXmlFile(sourceLineNumbers, section);
3599 }
3600
3601 /// <summary>
3602 /// Parses a XmlConfig element.
3603 /// </summary>
3604 /// <param name="element">Element to parse.</param>
3605 /// <param name="componentId">Identifier of parent component.</param>
3606 /// <param name="nested">Whether or not the element is nested.</param>
3607 private void ParseXmlConfigElement(Intermediate intermediate, IntermediateSection section, XElement element, string componentId, bool nested)
3608 {
3609 var sourceLineNumbers = this.ParseHelper.GetSourceLineNumbers(element);
3610 Identifier id = null;
3611 string elementId = null;
3612 string elementPath = null;
3613 int flags = 0;
3614 string file = null;
3615 string name = null;
3616 var sequence = CompilerConstants.IntegerNotSet;
3617 string value = null;
3618 string verifyPath = null;
3619
3620 foreach (var attrib in element.Attributes())
3621 {
3622 if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || this.Namespace == attrib.Name.Namespace)
3623 {
3624 switch (attrib.Name.LocalName)
3625 {
3626 case "Id":
3627 id = this.ParseHelper.GetAttributeIdentifier(sourceLineNumbers, attrib);
3628 break;
3629 case "Action":
3630 if (nested)
3631 {
3632 this.Messaging.Write(ErrorMessages.IllegalAttributeWhenNested(sourceLineNumbers, element.Name.LocalName, attrib.Name.LocalName, element.Parent.Name.LocalName));
3633 }
3634 else
3635 {
3636 string actionValue = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
3637 switch (actionValue)
3638 {
3639 case "create":
3640 flags |= 0x10; // XMLCONFIG_CREATE
3641 break;
3642 case "delete":
3643 flags |= 0x20; // XMLCONFIG_DELETE
3644 break;
3645 default:
3646 this.Messaging.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, element.Name.LocalName, attrib.Name.LocalName, actionValue, "create", "delete"));
3647 break;
3648 }
3649 }
3650 break;
3651 case "ElementId":
3652 elementId = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
3653 break;
3654 case "ElementPath":
3655 elementPath = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
3656 break;
3657 case "File":
3658 file = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
3659 break;
3660 case "Name":
3661 name = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
3662 break;
3663 case "Node":
3664 if (nested)
3665 {
3666 this.Messaging.Write(ErrorMessages.IllegalAttributeWhenNested(sourceLineNumbers, element.Name.LocalName, attrib.Name.LocalName, element.Parent.Name.LocalName));
3667 }
3668 else
3669 {
3670 var nodeValue = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
3671 switch (nodeValue)
3672 {
3673 case "element":
3674 flags |= 0x1; // XMLCONFIG_ELEMENT
3675 break;
3676 case "value":
3677 flags |= 0x2; // XMLCONFIG_VALUE
3678 break;
3679 case "document":
3680 flags |= 0x4; // XMLCONFIG_DOCUMENT
3681 break;
3682 default:
3683 this.Messaging.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, element.Name.LocalName, attrib.Name.LocalName, nodeValue, "element", "value", "document"));
3684 break;
3685 }
3686 }
3687 break;
3688 case "On":
3689 if (nested)
3690 {
3691 this.Messaging.Write(ErrorMessages.IllegalAttributeWhenNested(sourceLineNumbers, element.Name.LocalName, attrib.Name.LocalName, element.Parent.Name.LocalName));
3692 }
3693 else
3694 {
3695 var onValue = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
3696 switch (onValue)
3697 {
3698 case "install":
3699 flags |= 0x100; // XMLCONFIG_INSTALL
3700 break;
3701 case "uninstall":
3702 flags |= 0x200; // XMLCONFIG_UNINSTALL
3703 break;
3704 default:
3705 this.Messaging.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, element.Name.LocalName, attrib.Name.LocalName, onValue, "install", "uninstall"));
3706 break;
3707 }
3708 }
3709 break;
3710 case "PreserveModifiedDate":
3711 if (YesNoType.Yes == this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib))
3712 {
3713 flags |= 0x00001000; // XMLCONFIG_PRESERVE_MODIFIED
3714 }
3715 break;
3716 case "Sequence":
3717 sequence = this.ParseHelper.GetAttributeIntegerValue(sourceLineNumbers, attrib, 1, Int16.MaxValue);
3718 break;
3719 case "Value":
3720 value = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
3721 break;
3722 case "VerifyPath":
3723 verifyPath = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
3724 break;
3725 default:
3726 this.ParseHelper.UnexpectedAttribute(element, attrib);
3727 break;
3728 }
3729 }
3730 else
3731 {
3732 this.ParseHelper.ParseExtensionAttribute(this.Context.Extensions, intermediate, section, element, attrib);
3733 }
3734 }
3735
3736 if (null == id)
3737 {
3738 id = this.ParseHelper.CreateIdentifier("uxc", componentId, file, elementId, elementPath);
3739 }
3740
3741 if (null == file)
3742 {
3743 this.Messaging.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, element.Name.LocalName, "File"));
3744 }
3745
3746 if (null == elementId && null == elementPath)
3747 {
3748 this.Messaging.Write(ErrorMessages.ExpectedAttributes(sourceLineNumbers, element.Name.LocalName, "ElementId", "ElementPath"));
3749 }
3750 else if (null != elementId)
3751 {
3752 if (null != elementPath)
3753 {
3754 this.Messaging.Write(ErrorMessages.IllegalAttributeWithOtherAttribute(sourceLineNumbers, element.Name.LocalName, "ElementId", "ElementPath"));
3755 }
3756
3757 if (0 != flags)
3758 {
3759 this.Messaging.Write(ErrorMessages.IllegalAttributeWithOtherAttributes(sourceLineNumbers, element.Name.LocalName, "ElementId", "Action", "Node", "On"));
3760 }
3761
3762 this.ParseHelper.CreateSimpleReference(section, sourceLineNumbers, UtilSymbolDefinitions.XmlConfig, elementId);
3763 }
3764
3765 // find unexpected child elements
3766 foreach (var child in element.Elements())
3767 {
3768 if (this.Namespace == child.Name.Namespace)
3769 {
3770 switch (child.Name.LocalName)
3771 {
3772 case "XmlConfig":
3773 if (nested)
3774 {
3775 this.Messaging.Write(ErrorMessages.UnexpectedElement(sourceLineNumbers, element.Name.LocalName, child.Name.LocalName));
3776 }
3777 else
3778 {
3779 this.ParseXmlConfigElement(intermediate, section, child, componentId, true);
3780 }
3781 break;
3782 default:
3783 this.ParseHelper.UnexpectedElement(element, child);
3784 break;
3785 }
3786 }
3787 else
3788 {
3789 this.ParseHelper.ParseExtensionElement(this.Context.Extensions, intermediate, section, element, child);
3790 }
3791 }
3792
3793 if (!this.Messaging.EncounteredError)
3794 {
3795 var symbol = section.AddSymbol(new XmlConfigSymbol(sourceLineNumbers, id)
3796 {
3797 File = file,
3798 ElementId = elementId,
3799 ElementPath = elementPath,
3800 VerifyPath = verifyPath,
3801 Name = name,
3802 Value = value,
3803 Flags = flags,
3804 ComponentRef = componentId,
3805 });
3806
3807 if (CompilerConstants.IntegerNotSet != sequence)
3808 {
3809 symbol.Sequence = sequence;
3810 }
3811 }
3812
3813 this.ParseHelper.CreateCustomActionReference(sourceLineNumbers, section, "Wix4SchedXmlConfig", this.Context.Platform, CustomActionPlatforms.X86 | CustomActionPlatforms.X64 | CustomActionPlatforms.ARM64);
3814 }
3815
3816 /// <summary>
3817 /// Match evaluator to escape properties in a string.
3818 /// </summary>
3819 private string EscapeProperties(Match match)
3820 {
3821 string escape = null;
3822 switch (match.Value)
3823 {
3824 case "[":
3825 escape = @"[\[]";
3826 break;
3827 case "]":
3828 escape = @"[\]]";
3829 break;
3830 }
3831
3832 return escape;
3833 }
3834
3835 private int CreateIntegerFromBitArray(BitArray bits)
3836 {
3837 if (32 != bits.Length)
3838 {
3839 throw new ArgumentException(String.Format("Can only convert a bit array with 32-bits to integer. Actual number of bits in array: {0}", bits.Length), "bits");
3840 }
3841
3842 var intArray = new int[1];
3843 bits.CopyTo(intArray, 0);
3844
3845 return intArray[0];
3846 }
3847
3848 private bool TrySetBitFromName(string[] attributeNames, string attributeName, YesNoType attributeValue, BitArray bits, int offset)
3849 {
3850 for (var i = 0; i < attributeNames.Length; i++)
3851 {
3852 if (attributeName.Equals(attributeNames[i], StringComparison.Ordinal))
3853 {
3854 bits.Set(i + offset, YesNoType.Yes == attributeValue);
3855 return true;
3856 }
3857 }
3858
3859 return false;
3860 }
3861
3862 private void AddReferenceToSchedXmlFile(SourceLineNumber sourceLineNumbers, IntermediateSection section)
3863 {
3864 this.ParseHelper.CreateCustomActionReference(sourceLineNumbers, section, "Wix4SchedXmlFile", this.Context.Platform, CustomActionPlatforms.X86 | CustomActionPlatforms.X64 | CustomActionPlatforms.ARM64);
3865 }
3866
3867 /// <summary>
3868 /// Private class that stores the data from a parsed PerformanceCounter element.
3869 /// </summary>
3870 private class ParsedPerformanceCounter
3871 {
3872 internal ParsedPerformanceCounter(string name, string help, System.Diagnostics.PerformanceCounterType type, int language)
3873 {
3874 this.Name = name;
3875 this.Help = help;
3876 this.Type = (int)type;
3877 this.Language = language.ToString("D3", CultureInfo.InvariantCulture);
3878 }
3879
3880 internal string Name { get; }
3881
3882 internal string Help { get; }
3883
3884 internal int Type { get; }
3885
3886 internal string Language { get; }
3887 }
3888 }
3889}
diff --git a/src/ext/Util/wixext/UtilConstants.cs b/src/ext/Util/wixext/UtilConstants.cs
new file mode 100644
index 00000000..28ff368f
--- /dev/null
+++ b/src/ext/Util/wixext/UtilConstants.cs
@@ -0,0 +1,17 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Util
4{
5 /// <summary>
6 /// Constants used by Utility Extension.
7 /// </summary>
8 internal static class UtilConstants
9 {
10 internal static readonly string[] FilePermissions = { "Read", "Write", "Append", "ReadExtendedAttributes", "WriteExtendedAttributes", "Execute", null, "ReadAttributes", "WriteAttributes" };
11 internal static readonly string[] FolderPermissions = { "Read", "CreateFile", "CreateChild", "ReadExtendedAttributes", "WriteExtendedAttributes", "Traverse", "DeleteChild", "ReadAttributes", "WriteAttributes" };
12 internal static readonly string[] GenericPermissions = { "GenericAll", "GenericExecute", "GenericWrite", "GenericRead" };
13 internal static readonly string[] RegistryPermissions = { "Read", "Write", "CreateSubkeys", "EnumerateSubkeys", "Notify", "CreateLink" };
14 internal static readonly string[] ServicePermissions = { "ServiceQueryConfig", "ServiceChangeConfig", "ServiceQueryStatus", "ServiceEnumerateDependents", "ServiceStart", "ServiceStop", "ServicePauseContinue", "ServiceInterrogate", "ServiceUserDefinedControl" };
15 internal static readonly string[] StandardPermissions = { "Delete", "ReadPermission", "ChangePermission", "TakeOwnership", "Synchronize" };
16 }
17}
diff --git a/src/ext/Util/wixext/UtilDecompiler.cs b/src/ext/Util/wixext/UtilDecompiler.cs
new file mode 100644
index 00000000..9ef3390f
--- /dev/null
+++ b/src/ext/Util/wixext/UtilDecompiler.cs
@@ -0,0 +1,1543 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Extensions
4{
5#if TODO_CONSIDER_DECOMPILER
6 using System;
7 using System.IO;
8 using System.Text;
9 using System.Collections;
10 using System.Diagnostics;
11 using System.Globalization;
12
13 using Util = WixToolset.Extensions.Serialize.Util;
14 using WixToolset.Data;
15 using WixToolset.Extensibility;
16 using Wix = WixToolset.Data.Serialize;
17
18 /// <summary>
19 /// The decompiler for the WiX Toolset Utility Extension.
20 /// </summary>
21 public sealed class UtilDecompiler : DecompilerExtension
22 {
23 /// <summary>
24 /// Creates a decompiler for Utility Extension.
25 /// </summary>
26 public UtilDecompiler()
27 {
28 this.TableDefinitions = UtilExtensionData.GetExtensionTableDefinitions();
29 }
30
31 /// <summary>
32 /// Get the extensions library to be removed.
33 /// </summary>
34 /// <param name="tableDefinitions">Table definitions for library.</param>
35 /// <returns>Library to remove from decompiled output.</returns>
36 public override Library GetLibraryToRemove(TableDefinitionCollection tableDefinitions)
37 {
38 return UtilExtensionData.GetExtensionLibrary(tableDefinitions);
39 }
40
41 /// <summary>
42 /// Called at the beginning of the decompilation of a database.
43 /// </summary>
44 /// <param name="tables">The collection of all tables.</param>
45 public override void Initialize(TableIndexedCollection tables)
46 {
47 this.CleanupSecureCustomProperties(tables);
48 this.CleanupInternetShortcutRemoveFileTables(tables);
49 }
50
51 /// <summary>
52 /// Decompile the SecureCustomProperties field to PropertyRefs for known extension properties.
53 /// </summary>
54 /// <remarks>
55 /// If we've referenced any of the suite or directory properties, add
56 /// a PropertyRef to refer to the Property (and associated custom action)
57 /// from the extension's library. Then remove the property from
58 /// SecureCustomExtensions property so later decompilation won't create
59 /// new Property elements.
60 /// </remarks>
61 /// <param name="tables">The collection of all tables.</param>
62 private void CleanupSecureCustomProperties(TableIndexedCollection tables)
63 {
64 Table propertyTable = tables["Property"];
65
66 if (null != propertyTable)
67 {
68 foreach (Row row in propertyTable.Rows)
69 {
70 if ("SecureCustomProperties" == row[0].ToString())
71 {
72 StringBuilder remainingProperties = new StringBuilder();
73 string[] secureCustomProperties = row[1].ToString().Split(';');
74 foreach (string property in secureCustomProperties)
75 {
76 if (property.StartsWith("WIX_SUITE_", StringComparison.Ordinal) || property.StartsWith("WIX_DIR_", StringComparison.Ordinal)
77 || property.StartsWith("WIX_ACCOUNT_", StringComparison.Ordinal))
78 {
79 Wix.PropertyRef propertyRef = new Wix.PropertyRef();
80 propertyRef.Id = property;
81 this.Core.RootElement.AddChild(propertyRef);
82 }
83 else
84 {
85 if (0 < remainingProperties.Length)
86 {
87 remainingProperties.Append(";");
88 }
89 remainingProperties.Append(property);
90 }
91 }
92
93 row[1] = remainingProperties.ToString();
94 break;
95 }
96 }
97 }
98 }
99
100 /// <summary>
101 /// Remove RemoveFile rows that the InternetShortcut compiler extension adds for us.
102 /// </summary>
103 /// <param name="tables">The collection of all tables.</param>
104 private void CleanupInternetShortcutRemoveFileTables(TableIndexedCollection tables)
105 {
106 // index the WixInternetShortcut table
107 Table wixInternetShortcutTable = tables["WixInternetShortcut"];
108 Hashtable wixInternetShortcuts = new Hashtable();
109 if (null != wixInternetShortcutTable)
110 {
111 foreach (Row row in wixInternetShortcutTable.Rows)
112 {
113 wixInternetShortcuts.Add(row.GetPrimaryKey(DecompilerConstants.PrimaryKeyDelimiter), row);
114 }
115 }
116
117 // remove the RemoveFile rows with primary keys that match the WixInternetShortcut table's
118 Table removeFileTable = tables["RemoveFile"];
119 if (null != removeFileTable)
120 {
121 for (int i = removeFileTable.Rows.Count - 1; 0 <= i; i--)
122 {
123 if (null != wixInternetShortcuts[removeFileTable.Rows[i][0]])
124 {
125 removeFileTable.Rows.RemoveAt(i);
126 }
127 }
128 }
129 }
130
131 /// <summary>
132 /// Decompiles an extension table.
133 /// </summary>
134 /// <param name="table">The table to decompile.</param>
135 public override void DecompileTable(Table table)
136 {
137 switch (table.Name)
138 {
139 case "WixCloseApplication":
140 this.DecompileWixCloseApplicationTable(table);
141 break;
142 case "WixRemoveFolderEx":
143 this.DecompileWixRemoveFolderExTable(table);
144 break;
145 case "WixRestartResource":
146 this.DecompileWixRestartResourceTable(table);
147 break;
148 case "FileShare":
149 this.DecompileFileShareTable(table);
150 break;
151 case "FileSharePermissions":
152 this.DecompileFileSharePermissionsTable(table);
153 break;
154 case "WixInternetShortcut":
155 this.DecompileWixInternetShortcutTable(table);
156 break;
157 case "Group":
158 this.DecompileGroupTable(table);
159 break;
160 case "Perfmon":
161 this.DecompilePerfmonTable(table);
162 break;
163 case "PerfmonManifest":
164 this.DecompilePerfmonManifestTable(table);
165 break;
166 case "EventManifest":
167 this.DecompileEventManifestTable(table);
168 break;
169 case "SecureObjects":
170 this.DecompileSecureObjectsTable(table);
171 break;
172 case "ServiceConfig":
173 this.DecompileServiceConfigTable(table);
174 break;
175 case "User":
176 this.DecompileUserTable(table);
177 break;
178 case "UserGroup":
179 this.DecompileUserGroupTable(table);
180 break;
181 case "XmlConfig":
182 this.DecompileXmlConfigTable(table);
183 break;
184 case "XmlFile":
185 // XmlFile decompilation has been moved to FinalizeXmlFileTable function
186 break;
187 default:
188 base.DecompileTable(table);
189 break;
190 }
191 }
192
193 /// <summary>
194 /// Finalize decompilation.
195 /// </summary>
196 /// <param name="tables">The collection of all tables.</param>
197 public override void Finish(TableIndexedCollection tables)
198 {
199 this.FinalizePerfmonTable(tables);
200 this.FinalizePerfmonManifestTable(tables);
201 this.FinalizeSecureObjectsTable(tables);
202 this.FinalizeServiceConfigTable(tables);
203 this.FinalizeXmlConfigTable(tables);
204 this.FinalizeXmlFileTable(tables);
205 this.FinalizeEventManifestTable(tables);
206 }
207
208 /// <summary>
209 /// Decompile the WixCloseApplication table.
210 /// </summary>
211 /// <param name="table">The table to decompile.</param>
212 private void DecompileWixCloseApplicationTable(Table table)
213 {
214 foreach (Row row in table.Rows)
215 {
216 Util.CloseApplication closeApplication = new Util.CloseApplication();
217
218 closeApplication.Id = (string)row[0];
219
220 closeApplication.Target = (string)row[1];
221
222 if (null != row[2])
223 {
224 closeApplication.Description = (string)row[2];
225 }
226
227 if (null != row[3])
228 {
229 closeApplication.Content = (string)row[3];
230 }
231
232 // set defaults
233 closeApplication.CloseMessage = Util.YesNoType.no;
234 closeApplication.RebootPrompt = Util.YesNoType.yes;
235 closeApplication.ElevatedCloseMessage = Util.YesNoType.no;
236
237 if (null != row[4])
238 {
239 int attribute = (int)row[4];
240
241 closeApplication.CloseMessage = (0x1 == (attribute & 0x1)) ? Util.YesNoType.yes : Util.YesNoType.no;
242 closeApplication.RebootPrompt = (0x2 == (attribute & 0x2)) ? Util.YesNoType.yes : Util.YesNoType.no;
243 closeApplication.ElevatedCloseMessage = (0x4 == (attribute & 0x4)) ? Util.YesNoType.yes : Util.YesNoType.no;
244 }
245
246 if (null != row[5])
247 {
248 closeApplication.Sequence = (int)row[5];
249 }
250
251 if (null != row[6])
252 {
253 closeApplication.Property = (string)row[6];
254 }
255
256 this.Core.RootElement.AddChild(closeApplication);
257 }
258 }
259
260 /// <summary>
261 /// Decompile the WixRemoveFolderEx table.
262 /// </summary>
263 /// <param name="table">The table to decompile.</param>
264 private void DecompileWixRemoveFolderExTable(Table table)
265 {
266 foreach (Row row in table.Rows)
267 {
268 // Set the Id even if auto-generated previously.
269 Util.RemoveFolderEx removeFolder = new Util.RemoveFolderEx();
270 removeFolder.Id = (string)row[0];
271 removeFolder.Property = (string)row[2];
272
273 int installMode = (int)row[3];
274 switch ((UtilCompiler.WixRemoveFolderExOn)installMode)
275 {
276 case UtilCompiler.WixRemoveFolderExOn.Install:
277 removeFolder.On = Util.RemoveFolderEx.OnType.install;
278 break;
279
280 case UtilCompiler.WixRemoveFolderExOn.Uninstall:
281 removeFolder.On = Util.RemoveFolderEx.OnType.uninstall;
282 break;
283
284 case UtilCompiler.WixRemoveFolderExOn.Both:
285 removeFolder.On = Util.RemoveFolderEx.OnType.both;
286 break;
287
288 default:
289 this.Core.OnMessage(WixWarnings.UnrepresentableColumnValue(row.SourceLineNumbers, table.Name, "InstallMode", installMode));
290 break;
291 }
292
293 // Add to the appropriate Component or section element.
294 string componentId = (string)row[1];
295 Wix.Component component = (Wix.Component)this.Core.GetIndexedElement("Component", componentId);
296 if (null != component)
297 {
298 component.AddChild(removeFolder);
299 }
300 else
301 {
302 this.Core.OnMessage(WixWarnings.ExpectedForeignRow(row.SourceLineNumbers, table.Name, row.GetPrimaryKey(DecompilerConstants.PrimaryKeyDelimiter), "Component_", componentId, "Component"));
303 }
304 }
305 }
306
307 /// <summary>
308 /// Decompile the WixRestartResource table.
309 /// </summary>
310 /// <param name="table">The table to decompile.</param>
311 private void DecompileWixRestartResourceTable(Table table)
312 {
313 foreach (Row row in table.Rows)
314 {
315 // Set the Id even if auto-generated previously.
316 Util.RestartResource restartResource = new Util.RestartResource();
317 restartResource.Id = (string)row[0];
318
319 // Determine the resource type and set accordingly.
320 string resource = (string)row[2];
321 int attributes = (int)row[3];
322 UtilCompiler.WixRestartResourceAttributes type = (UtilCompiler.WixRestartResourceAttributes)(attributes & (int)UtilCompiler.WixRestartResourceAttributes.TypeMask);
323
324 switch (type)
325 {
326 case UtilCompiler.WixRestartResourceAttributes.Filename:
327 restartResource.Path = resource;
328 break;
329
330 case UtilCompiler.WixRestartResourceAttributes.ProcessName:
331 restartResource.ProcessName = resource;
332 break;
333
334 case UtilCompiler.WixRestartResourceAttributes.ServiceName:
335 restartResource.ServiceName = resource;
336 break;
337
338 default:
339 this.Core.OnMessage(WixWarnings.UnrepresentableColumnValue(row.SourceLineNumbers, table.Name, "Attributes", attributes));
340 break;
341 }
342
343 // Add to the appropriate Component or section element.
344 string componentId = (string)row[1];
345 if (!String.IsNullOrEmpty(componentId))
346 {
347 Wix.Component component = (Wix.Component)this.Core.GetIndexedElement("Component", componentId);
348 if (null != component)
349 {
350 component.AddChild(restartResource);
351 }
352 else
353 {
354 this.Core.OnMessage(WixWarnings.ExpectedForeignRow(row.SourceLineNumbers, table.Name, row.GetPrimaryKey(DecompilerConstants.PrimaryKeyDelimiter), "Component_", componentId, "Component"));
355 }
356 }
357 else
358 {
359 this.Core.RootElement.AddChild(restartResource);
360 }
361 }
362 }
363
364 /// <summary>
365 /// Decompile the FileShare table.
366 /// </summary>
367 /// <param name="table">The table to decompile.</param>
368 private void DecompileFileShareTable(Table table)
369 {
370 foreach (Row row in table.Rows)
371 {
372 Util.FileShare fileShare = new Util.FileShare();
373
374 fileShare.Id = (string)row[0];
375
376 fileShare.Name = (string)row[1];
377
378 if (null != row[3])
379 {
380 fileShare.Description = (string)row[3];
381 }
382
383 // the Directory_ column is set by the parent Component
384
385 // the User_ and Permissions columns are deprecated
386
387 Wix.Component component = (Wix.Component)this.Core.GetIndexedElement("Component", (string)row[2]);
388 if (null != component)
389 {
390 component.AddChild(fileShare);
391 }
392 else
393 {
394 this.Core.OnMessage(WixWarnings.ExpectedForeignRow(row.SourceLineNumbers, table.Name, row.GetPrimaryKey(DecompilerConstants.PrimaryKeyDelimiter), "Component_", (string)row[2], "Component"));
395 }
396 this.Core.IndexElement(row, fileShare);
397 }
398 }
399
400 /// <summary>
401 /// Decompile the FileSharePermissions table.
402 /// </summary>
403 /// <param name="table">The table to decompile.</param>
404 private void DecompileFileSharePermissionsTable(Table table)
405 {
406 foreach (Row row in table.Rows)
407 {
408 Util.FileSharePermission fileSharePermission = new Util.FileSharePermission();
409
410 fileSharePermission.User = (string)row[1];
411
412 string[] specialPermissions = UtilConstants.FolderPermissions;
413 int permissions = (int)row[2];
414 for (int i = 0; i < 32; i++)
415 {
416 if (0 != ((permissions >> i) & 1))
417 {
418 string name = null;
419
420 if (16 > i && specialPermissions.Length > i)
421 {
422 name = specialPermissions[i];
423 }
424 else if (28 > i && UtilConstants.StandardPermissions.Length > (i - 16))
425 {
426 name = UtilConstants.StandardPermissions[i - 16];
427 }
428 else if (0 <= (i - 28) && UtilConstants.GenericPermissions.Length > (i - 28))
429 {
430 name = UtilConstants.GenericPermissions[i - 28];
431 }
432
433 if (null == name)
434 {
435 this.Core.OnMessage(WixWarnings.UnknownPermission(row.SourceLineNumbers, row.Table.Name, row.GetPrimaryKey(DecompilerConstants.PrimaryKeyDelimiter), i));
436 }
437 else
438 {
439 switch (name)
440 {
441 case "ChangePermission":
442 fileSharePermission.ChangePermission = Util.YesNoType.yes;
443 break;
444 case "CreateChild":
445 fileSharePermission.CreateChild = Util.YesNoType.yes;
446 break;
447 case "CreateFile":
448 fileSharePermission.CreateFile = Util.YesNoType.yes;
449 break;
450 case "Delete":
451 fileSharePermission.Delete = Util.YesNoType.yes;
452 break;
453 case "DeleteChild":
454 fileSharePermission.DeleteChild = Util.YesNoType.yes;
455 break;
456 case "GenericAll":
457 fileSharePermission.GenericAll = Util.YesNoType.yes;
458 break;
459 case "GenericExecute":
460 fileSharePermission.GenericExecute = Util.YesNoType.yes;
461 break;
462 case "GenericRead":
463 fileSharePermission.GenericRead = Util.YesNoType.yes;
464 break;
465 case "GenericWrite":
466 fileSharePermission.GenericWrite = Util.YesNoType.yes;
467 break;
468 case "Read":
469 fileSharePermission.Read = Util.YesNoType.yes;
470 break;
471 case "ReadAttributes":
472 fileSharePermission.ReadAttributes = Util.YesNoType.yes;
473 break;
474 case "ReadExtendedAttributes":
475 fileSharePermission.ReadExtendedAttributes = Util.YesNoType.yes;
476 break;
477 case "ReadPermission":
478 fileSharePermission.ReadPermission = Util.YesNoType.yes;
479 break;
480 case "Synchronize":
481 fileSharePermission.Synchronize = Util.YesNoType.yes;
482 break;
483 case "TakeOwnership":
484 fileSharePermission.TakeOwnership = Util.YesNoType.yes;
485 break;
486 case "Traverse":
487 fileSharePermission.Traverse = Util.YesNoType.yes;
488 break;
489 case "WriteAttributes":
490 fileSharePermission.WriteAttributes = Util.YesNoType.yes;
491 break;
492 case "WriteExtendedAttributes":
493 fileSharePermission.WriteExtendedAttributes = Util.YesNoType.yes;
494 break;
495 default:
496 Debug.Fail(String.Format("Unknown permission '{0}'.", name));
497 break;
498 }
499 }
500 }
501 }
502
503 Util.FileShare fileShare = (Util.FileShare)this.Core.GetIndexedElement("FileShare", (string)row[0]);
504 if (null != fileShare)
505 {
506 fileShare.AddChild(fileSharePermission);
507 }
508 else
509 {
510 this.Core.OnMessage(WixWarnings.ExpectedForeignRow(row.SourceLineNumbers, table.Name, row.GetPrimaryKey(DecompilerConstants.PrimaryKeyDelimiter), "FileShare_", (string)row[0], "FileShare"));
511 }
512 }
513 }
514
515 /// <summary>
516 /// Decompile the Group table.
517 /// </summary>
518 /// <param name="table">The table to decompile.</param>
519 private void DecompileGroupTable(Table table)
520 {
521 foreach (Row row in table.Rows)
522 {
523 Util.Group group = new Util.Group();
524
525 group.Id = (string)row[0];
526
527 if (null != row[1])
528 {
529 this.Core.OnMessage(WixWarnings.UnrepresentableColumnValue(row.SourceLineNumbers, table.Name, "Component_", (string)row[1]));
530 }
531
532 group.Name = (string)row[2];
533
534 if (null != row[3])
535 {
536 group.Domain = (string)row[3];
537 }
538
539 this.Core.RootElement.AddChild(group);
540 }
541 }
542
543 /// <summary>
544 /// Decompile the WixInternetShortcut table.
545 /// </summary>
546 /// <param name="table">The table to decompile.</param>
547 private void DecompileWixInternetShortcutTable(Table table)
548 {
549 foreach (Row row in table.Rows)
550 {
551 Util.InternetShortcut internetShortcut = new Util.InternetShortcut();
552 internetShortcut.Id = (string)row[0];
553 internetShortcut.Directory = (string)row[2];
554 // remove .lnk/.url extension because compiler extension adds it back for us
555 internetShortcut.Name = Path.ChangeExtension((string)row[3], null);
556 internetShortcut.Target = (string)row[4];
557 internetShortcut.IconFile = (string)row[6];
558 internetShortcut.IconIndex = (int)row[7];
559
560 UtilCompiler.InternetShortcutType shortcutType = (UtilCompiler.InternetShortcutType)row[5];
561 switch (shortcutType)
562 {
563 case UtilCompiler.InternetShortcutType.Link:
564 internetShortcut.Type = Util.InternetShortcut.TypeType.link;
565 break;
566 case UtilCompiler.InternetShortcutType.Url:
567 internetShortcut.Type = Util.InternetShortcut.TypeType.url;
568 break;
569 }
570
571 Wix.Component component = (Wix.Component)this.Core.GetIndexedElement("Component", (string)row[1]);
572 if (null != component)
573 {
574 component.AddChild(internetShortcut);
575 }
576 else
577 {
578 this.Core.OnMessage(WixWarnings.ExpectedForeignRow(row.SourceLineNumbers, table.Name, row.GetPrimaryKey(DecompilerConstants.PrimaryKeyDelimiter), "Component_", (string)row[1], "Component"));
579 }
580
581 this.Core.IndexElement(row, internetShortcut);
582 }
583 }
584
585 /// <summary>
586 /// Decompile the Perfmon table.
587 /// </summary>
588 /// <param name="table">The table to decompile.</param>
589 private void DecompilePerfmonTable(Table table)
590 {
591 foreach (Row row in table.Rows)
592 {
593 Util.PerfCounter perfCounter = new Util.PerfCounter();
594
595 perfCounter.Name = (string)row[2];
596
597 this.Core.IndexElement(row, perfCounter);
598 }
599 }
600
601 /// <summary>
602 /// Decompile the PerfmonManifest table.
603 /// </summary>
604 /// <param name="table">The table to decompile.</param>
605 private void DecompilePerfmonManifestTable(Table table)
606 {
607 foreach (Row row in table.Rows)
608 {
609 Util.PerfCounterManifest perfCounterManifest = new Util.PerfCounterManifest();
610
611 perfCounterManifest.ResourceFileDirectory = (string)row[2];
612
613 this.Core.IndexElement(row, perfCounterManifest);
614 }
615 }
616
617 /// <summary>
618 /// Decompile the EventManifest table.
619 /// </summary>
620 /// <param name="table">The table to decompile.</param>
621 private void DecompileEventManifestTable(Table table)
622 {
623 foreach (Row row in table.Rows)
624 {
625 Util.EventManifest eventManifest = new Util.EventManifest();
626 this.Core.IndexElement(row, eventManifest);
627 }
628 }
629
630 /// <summary>
631 /// Decompile the SecureObjects table.
632 /// </summary>
633 /// <param name="table">The table to decompile.</param>
634 private void DecompileSecureObjectsTable(Table table)
635 {
636 foreach (Row row in table.Rows)
637 {
638 Util.PermissionEx permissionEx = new Util.PermissionEx();
639
640 string[] specialPermissions;
641 switch ((string)row[1])
642 {
643 case "CreateFolder":
644 specialPermissions = UtilConstants.FolderPermissions;
645 break;
646 case "File":
647 specialPermissions = UtilConstants.FilePermissions;
648 break;
649 case "Registry":
650 specialPermissions = UtilConstants.RegistryPermissions;
651 break;
652 case "ServiceInstall":
653 specialPermissions = UtilConstants.ServicePermissions;
654 break;
655 default:
656 this.Core.OnMessage(WixWarnings.IllegalColumnValue(row.SourceLineNumbers, row.Table.Name, row.Fields[1].Column.Name, row[1]));
657 return;
658 }
659
660 int permissionBits = (int)row[4];
661 for (int i = 0; i < 32; i++)
662 {
663 if (0 != ((permissionBits >> i) & 1))
664 {
665 string name = null;
666
667 if (16 > i && specialPermissions.Length > i)
668 {
669 name = specialPermissions[i];
670 }
671 else if (28 > i && UtilConstants.StandardPermissions.Length > (i - 16))
672 {
673 name = UtilConstants.StandardPermissions[i - 16];
674 }
675 else if (0 <= (i - 28) && UtilConstants.GenericPermissions.Length > (i - 28))
676 {
677 name = UtilConstants.GenericPermissions[i - 28];
678 }
679
680 if (null == name)
681 {
682 this.Core.OnMessage(WixWarnings.UnknownPermission(row.SourceLineNumbers, row.Table.Name, row.GetPrimaryKey(DecompilerConstants.PrimaryKeyDelimiter), i));
683 }
684 else
685 {
686 switch (name)
687 {
688 case "Append":
689 permissionEx.Append = Util.YesNoType.yes;
690 break;
691 case "ChangePermission":
692 permissionEx.ChangePermission = Util.YesNoType.yes;
693 break;
694 case "CreateChild":
695 permissionEx.CreateChild = Util.YesNoType.yes;
696 break;
697 case "CreateFile":
698 permissionEx.CreateFile = Util.YesNoType.yes;
699 break;
700 case "CreateLink":
701 permissionEx.CreateLink = Util.YesNoType.yes;
702 break;
703 case "CreateSubkeys":
704 permissionEx.CreateSubkeys = Util.YesNoType.yes;
705 break;
706 case "Delete":
707 permissionEx.Delete = Util.YesNoType.yes;
708 break;
709 case "DeleteChild":
710 permissionEx.DeleteChild = Util.YesNoType.yes;
711 break;
712 case "EnumerateSubkeys":
713 permissionEx.EnumerateSubkeys = Util.YesNoType.yes;
714 break;
715 case "Execute":
716 permissionEx.Execute = Util.YesNoType.yes;
717 break;
718 case "GenericAll":
719 permissionEx.GenericAll = Util.YesNoType.yes;
720 break;
721 case "GenericExecute":
722 permissionEx.GenericExecute = Util.YesNoType.yes;
723 break;
724 case "GenericRead":
725 permissionEx.GenericRead = Util.YesNoType.yes;
726 break;
727 case "GenericWrite":
728 permissionEx.GenericWrite = Util.YesNoType.yes;
729 break;
730 case "Notify":
731 permissionEx.Notify = Util.YesNoType.yes;
732 break;
733 case "Read":
734 permissionEx.Read = Util.YesNoType.yes;
735 break;
736 case "ReadAttributes":
737 permissionEx.ReadAttributes = Util.YesNoType.yes;
738 break;
739 case "ReadExtendedAttributes":
740 permissionEx.ReadExtendedAttributes = Util.YesNoType.yes;
741 break;
742 case "ReadPermission":
743 permissionEx.ReadPermission = Util.YesNoType.yes;
744 break;
745 case "ServiceChangeConfig":
746 permissionEx.ServiceChangeConfig = Util.YesNoType.yes;
747 break;
748 case "ServiceEnumerateDependents":
749 permissionEx.ServiceEnumerateDependents = Util.YesNoType.yes;
750 break;
751 case "ServiceInterrogate":
752 permissionEx.ServiceInterrogate = Util.YesNoType.yes;
753 break;
754 case "ServicePauseContinue":
755 permissionEx.ServicePauseContinue = Util.YesNoType.yes;
756 break;
757 case "ServiceQueryConfig":
758 permissionEx.ServiceQueryConfig = Util.YesNoType.yes;
759 break;
760 case "ServiceQueryStatus":
761 permissionEx.ServiceQueryStatus = Util.YesNoType.yes;
762 break;
763 case "ServiceStart":
764 permissionEx.ServiceStart = Util.YesNoType.yes;
765 break;
766 case "ServiceStop":
767 permissionEx.ServiceStop = Util.YesNoType.yes;
768 break;
769 case "ServiceUserDefinedControl":
770 permissionEx.ServiceUserDefinedControl = Util.YesNoType.yes;
771 break;
772 case "Synchronize":
773 permissionEx.Synchronize = Util.YesNoType.yes;
774 break;
775 case "TakeOwnership":
776 permissionEx.TakeOwnership = Util.YesNoType.yes;
777 break;
778 case "Traverse":
779 permissionEx.Traverse = Util.YesNoType.yes;
780 break;
781 case "Write":
782 permissionEx.Write = Util.YesNoType.yes;
783 break;
784 case "WriteAttributes":
785 permissionEx.WriteAttributes = Util.YesNoType.yes;
786 break;
787 case "WriteExtendedAttributes":
788 permissionEx.WriteExtendedAttributes = Util.YesNoType.yes;
789 break;
790 default:
791 throw new InvalidOperationException(String.Format("Unknown permission attribute '{0}'.", name));
792 }
793 }
794 }
795 }
796
797 if (null != row[2])
798 {
799 permissionEx.Domain = (string)row[2];
800 }
801
802 permissionEx.User = (string)row[3];
803
804 this.Core.IndexElement(row, permissionEx);
805 }
806 }
807
808 /// <summary>
809 /// Decompile the ServiceConfig table.
810 /// </summary>
811 /// <param name="table">The table to decompile.</param>
812 private void DecompileServiceConfigTable(Table table)
813 {
814 foreach (Row row in table.Rows)
815 {
816 Util.ServiceConfig serviceConfig = new Util.ServiceConfig();
817
818 serviceConfig.ServiceName = (string)row[0];
819
820 switch ((string)row[3])
821 {
822 case "none":
823 serviceConfig.FirstFailureActionType = Util.ServiceConfig.FirstFailureActionTypeType.none;
824 break;
825 case "reboot":
826 serviceConfig.FirstFailureActionType = Util.ServiceConfig.FirstFailureActionTypeType.reboot;
827 break;
828 case "restart":
829 serviceConfig.FirstFailureActionType = Util.ServiceConfig.FirstFailureActionTypeType.restart;
830 break;
831 case "runCommand":
832 serviceConfig.FirstFailureActionType = Util.ServiceConfig.FirstFailureActionTypeType.runCommand;
833 break;
834 default:
835 this.Core.OnMessage(WixWarnings.IllegalColumnValue(row.SourceLineNumbers, table.Name, row.Fields[3].Column.Name, row[3]));
836 break;
837 }
838
839 switch ((string)row[4])
840 {
841 case "none":
842 serviceConfig.SecondFailureActionType = Util.ServiceConfig.SecondFailureActionTypeType.none;
843 break;
844 case "reboot":
845 serviceConfig.SecondFailureActionType = Util.ServiceConfig.SecondFailureActionTypeType.reboot;
846 break;
847 case "restart":
848 serviceConfig.SecondFailureActionType = Util.ServiceConfig.SecondFailureActionTypeType.restart;
849 break;
850 case "runCommand":
851 serviceConfig.SecondFailureActionType = Util.ServiceConfig.SecondFailureActionTypeType.runCommand;
852 break;
853 default:
854 this.Core.OnMessage(WixWarnings.IllegalColumnValue(row.SourceLineNumbers, table.Name, row.Fields[4].Column.Name, row[4]));
855 break;
856 }
857
858 switch ((string)row[5])
859 {
860 case "none":
861 serviceConfig.ThirdFailureActionType = Util.ServiceConfig.ThirdFailureActionTypeType.none;
862 break;
863 case "reboot":
864 serviceConfig.ThirdFailureActionType = Util.ServiceConfig.ThirdFailureActionTypeType.reboot;
865 break;
866 case "restart":
867 serviceConfig.ThirdFailureActionType = Util.ServiceConfig.ThirdFailureActionTypeType.restart;
868 break;
869 case "runCommand":
870 serviceConfig.ThirdFailureActionType = Util.ServiceConfig.ThirdFailureActionTypeType.runCommand;
871 break;
872 default:
873 this.Core.OnMessage(WixWarnings.IllegalColumnValue(row.SourceLineNumbers, table.Name, row.Fields[5].Column.Name, row[5]));
874 break;
875 }
876
877 if (null != row[6])
878 {
879 serviceConfig.ResetPeriodInDays = (int)row[6];
880 }
881
882 if (null != row[7])
883 {
884 serviceConfig.RestartServiceDelayInSeconds = (int)row[7];
885 }
886
887 if (null != row[8])
888 {
889 serviceConfig.ProgramCommandLine = (string)row[8];
890 }
891
892 if (null != row[9])
893 {
894 serviceConfig.RebootMessage = (string)row[9];
895 }
896
897 this.Core.IndexElement(row, serviceConfig);
898 }
899 }
900
901 /// <summary>
902 /// Decompile the User table.
903 /// </summary>
904 /// <param name="table">The table to decompile.</param>
905 private void DecompileUserTable(Table table)
906 {
907 foreach (Row row in table.Rows)
908 {
909 Util.User user = new Util.User();
910
911 user.Id = (string)row[0];
912
913 user.Name = (string)row[2];
914
915 if (null != row[3])
916 {
917 user.Domain = (string)row[3];
918 }
919
920 if (null != row[4])
921 {
922 user.Password = (string)row[4];
923 }
924
925 if (null != row[5])
926 {
927 int attributes = (int)row[5];
928
929 if (UtilCompiler.UserDontExpirePasswrd == (attributes & UtilCompiler.UserDontExpirePasswrd))
930 {
931 user.PasswordNeverExpires = Util.YesNoType.yes;
932 }
933
934 if (UtilCompiler.UserPasswdCantChange == (attributes & UtilCompiler.UserPasswdCantChange))
935 {
936 user.CanNotChangePassword = Util.YesNoType.yes;
937 }
938
939 if (UtilCompiler.UserPasswdChangeReqdOnLogin == (attributes & UtilCompiler.UserPasswdChangeReqdOnLogin))
940 {
941 user.PasswordExpired = Util.YesNoType.yes;
942 }
943
944 if (UtilCompiler.UserDisableAccount == (attributes & UtilCompiler.UserDisableAccount))
945 {
946 user.Disabled = Util.YesNoType.yes;
947 }
948
949 if (UtilCompiler.UserFailIfExists == (attributes & UtilCompiler.UserFailIfExists))
950 {
951 user.FailIfExists = Util.YesNoType.yes;
952 }
953
954 if (UtilCompiler.UserUpdateIfExists == (attributes & UtilCompiler.UserUpdateIfExists))
955 {
956 user.UpdateIfExists = Util.YesNoType.yes;
957 }
958
959 if (UtilCompiler.UserLogonAsService == (attributes & UtilCompiler.UserLogonAsService))
960 {
961 user.LogonAsService = Util.YesNoType.yes;
962 }
963
964 if (UtilCompiler.UserDontRemoveOnUninstall == (attributes & UtilCompiler.UserDontRemoveOnUninstall))
965 {
966 user.RemoveOnUninstall = Util.YesNoType.no;
967 }
968
969 if (UtilCompiler.UserDontCreateUser == (attributes & UtilCompiler.UserDontCreateUser))
970 {
971 user.CreateUser = Util.YesNoType.no;
972 }
973
974 if (UtilCompiler.UserNonVital == (attributes & UtilCompiler.UserNonVital))
975 {
976 user.Vital = Util.YesNoType.no;
977 }
978 }
979
980 if (null != row[1])
981 {
982 Wix.Component component = (Wix.Component)this.Core.GetIndexedElement("Component", (string)row[1]);
983
984 if (null != component)
985 {
986 component.AddChild(user);
987 }
988 else
989 {
990 this.Core.OnMessage(WixWarnings.ExpectedForeignRow(row.SourceLineNumbers, table.Name, row.GetPrimaryKey(DecompilerConstants.PrimaryKeyDelimiter), "Component_", (string)row[1], "Component"));
991 }
992 }
993 else
994 {
995 this.Core.RootElement.AddChild(user);
996 }
997 this.Core.IndexElement(row, user);
998 }
999 }
1000
1001 /// <summary>
1002 /// Decompile the UserGroup table.
1003 /// </summary>
1004 /// <param name="table">The table to decompile.</param>
1005 private void DecompileUserGroupTable(Table table)
1006 {
1007 foreach (Row row in table.Rows)
1008 {
1009 Util.User user = (Util.User)this.Core.GetIndexedElement("User", (string)row[0]);
1010
1011 if (null != user)
1012 {
1013 Util.GroupRef groupRef = new Util.GroupRef();
1014
1015 groupRef.Id = (string)row[1];
1016
1017 user.AddChild(groupRef);
1018 }
1019 else
1020 {
1021 this.Core.OnMessage(WixWarnings.ExpectedForeignRow(row.SourceLineNumbers, table.Name, row.GetPrimaryKey(DecompilerConstants.PrimaryKeyDelimiter), "Group_", (string)row[0], "Group"));
1022 }
1023 }
1024 }
1025
1026 /// <summary>
1027 /// Decompile the XmlConfig table.
1028 /// </summary>
1029 /// <param name="table">The table to decompile.</param>
1030 private void DecompileXmlConfigTable(Table table)
1031 {
1032 foreach (Row row in table.Rows)
1033 {
1034 Util.XmlConfig xmlConfig = new Util.XmlConfig();
1035
1036 xmlConfig.Id = (string)row[0];
1037
1038 xmlConfig.File = (string)row[1];
1039
1040 xmlConfig.ElementPath = (string)row[2];
1041
1042 if (null != row[3])
1043 {
1044 xmlConfig.VerifyPath = (string)row[3];
1045 }
1046
1047 if (null != row[4])
1048 {
1049 xmlConfig.Name = (string)row[4];
1050 }
1051
1052 if (null != row[5])
1053 {
1054 xmlConfig.Value = (string)row[5];
1055 }
1056
1057 int flags = (int)row[6];
1058
1059 if (0x1 == (flags & 0x1))
1060 {
1061 xmlConfig.Node = Util.XmlConfig.NodeType.element;
1062 }
1063 else if (0x2 == (flags & 0x2))
1064 {
1065 xmlConfig.Node = Util.XmlConfig.NodeType.value;
1066 }
1067 else if (0x4 == (flags & 0x4))
1068 {
1069 xmlConfig.Node = Util.XmlConfig.NodeType.document;
1070 }
1071
1072 if (0x10 == (flags & 0x10))
1073 {
1074 xmlConfig.Action = Util.XmlConfig.ActionType.create;
1075 }
1076 else if (0x20 == (flags & 0x20))
1077 {
1078 xmlConfig.Action = Util.XmlConfig.ActionType.delete;
1079 }
1080
1081 if (0x100 == (flags & 0x100))
1082 {
1083 xmlConfig.On = Util.XmlConfig.OnType.install;
1084 }
1085 else if (0x200 == (flags & 0x200))
1086 {
1087 xmlConfig.On = Util.XmlConfig.OnType.uninstall;
1088 }
1089
1090 if (0x00001000 == (flags & 0x00001000))
1091 {
1092 xmlConfig.PreserveModifiedDate = Util.YesNoType.yes;
1093 }
1094
1095 if (null != row[8])
1096 {
1097 xmlConfig.Sequence = (int)row[8];
1098 }
1099
1100 this.Core.IndexElement(row, xmlConfig);
1101 }
1102 }
1103
1104 /// <summary>
1105 /// Finalize the Perfmon table.
1106 /// </summary>
1107 /// <param name="tables">The collection of all tables.</param>
1108 /// <remarks>
1109 /// Since the PerfCounter element nests under a File element, but
1110 /// the Perfmon table does not have a foreign key relationship with
1111 /// the File table (instead it has a formatted string that usually
1112 /// refers to a file row - but doesn't have to), the nesting must
1113 /// be inferred during finalization.
1114 /// </remarks>
1115 private void FinalizePerfmonTable(TableIndexedCollection tables)
1116 {
1117 Table perfmonTable = tables["Perfmon"];
1118
1119 if (null != perfmonTable)
1120 {
1121 foreach (Row row in perfmonTable.Rows)
1122 {
1123 string formattedFile = (string)row[1];
1124 Util.PerfCounter perfCounter = (Util.PerfCounter)this.Core.GetIndexedElement(row);
1125
1126 // try to "de-format" the File column's value to determine the proper parent File element
1127 if ((formattedFile.StartsWith("[#", StringComparison.Ordinal) || formattedFile.StartsWith("[!", StringComparison.Ordinal))
1128 && formattedFile.EndsWith("]", StringComparison.Ordinal))
1129 {
1130 string fileId = formattedFile.Substring(2, formattedFile.Length - 3);
1131
1132 Wix.File file = (Wix.File)this.Core.GetIndexedElement("File", fileId);
1133 if (null != file)
1134 {
1135 file.AddChild(perfCounter);
1136 }
1137 else
1138 {
1139 this.Core.OnMessage(WixWarnings.ExpectedForeignRow(row.SourceLineNumbers, perfmonTable.Name, row.GetPrimaryKey(DecompilerConstants.PrimaryKeyDelimiter), "File", formattedFile, "File"));
1140 }
1141 }
1142 else
1143 {
1144 this.Core.OnMessage(UtilErrors.IllegalFileValueInPerfmonOrManifest(formattedFile, "Perfmon"));
1145 }
1146 }
1147 }
1148 }
1149
1150 /// <summary>
1151 /// Finalize the PerfmonManifest table.
1152 /// </summary>
1153 /// <param name="tables">The collection of all tables.</param>
1154 private void FinalizePerfmonManifestTable(TableIndexedCollection tables)
1155 {
1156 Table perfmonManifestTable = tables["PerfmonManifest"];
1157
1158 if (null != perfmonManifestTable)
1159 {
1160 foreach (Row row in perfmonManifestTable.Rows)
1161 {
1162 string formattedFile = (string)row[1];
1163 Util.PerfCounterManifest perfCounterManifest = (Util.PerfCounterManifest)this.Core.GetIndexedElement(row);
1164
1165 // try to "de-format" the File column's value to determine the proper parent File element
1166 if ((formattedFile.StartsWith("[#", StringComparison.Ordinal) || formattedFile.StartsWith("[!", StringComparison.Ordinal))
1167 && formattedFile.EndsWith("]", StringComparison.Ordinal))
1168 {
1169 string fileId = formattedFile.Substring(2, formattedFile.Length - 3);
1170
1171 Wix.File file = (Wix.File)this.Core.GetIndexedElement("File", fileId);
1172 if (null != file)
1173 {
1174 file.AddChild(perfCounterManifest);
1175 }
1176 else
1177 {
1178 this.Core.OnMessage(WixWarnings.ExpectedForeignRow(row.SourceLineNumbers, perfCounterManifest.ResourceFileDirectory, row.GetPrimaryKey(DecompilerConstants.PrimaryKeyDelimiter), "File", formattedFile, "File"));
1179 }
1180 }
1181 else
1182 {
1183 this.Core.OnMessage(UtilErrors.IllegalFileValueInPerfmonOrManifest(formattedFile, "PerfmonManifest"));
1184 }
1185 }
1186 }
1187 }
1188
1189 /// <summary>
1190 /// Finalize the SecureObjects table.
1191 /// </summary>
1192 /// <param name="tables">The collection of all tables.</param>
1193 /// <remarks>
1194 /// Nests the PermissionEx elements below their parent elements. There are no declared foreign
1195 /// keys for the parents of the SecureObjects table.
1196 /// </remarks>
1197 private void FinalizeSecureObjectsTable(TableIndexedCollection tables)
1198 {
1199 Table createFolderTable = tables["CreateFolder"];
1200 Table secureObjectsTable = tables["SecureObjects"];
1201
1202 Hashtable createFolders = new Hashtable();
1203
1204 // index the CreateFolder table because the foreign key to this table from the
1205 // LockPermissions table is only part of the primary key of this table
1206 if (null != createFolderTable)
1207 {
1208 foreach (Row row in createFolderTable.Rows)
1209 {
1210 Wix.CreateFolder createFolder = (Wix.CreateFolder)this.Core.GetIndexedElement(row);
1211 string directoryId = (string)row[0];
1212
1213 if (!createFolders.Contains(directoryId))
1214 {
1215 createFolders.Add(directoryId, new ArrayList());
1216 }
1217 ((ArrayList)createFolders[directoryId]).Add(createFolder);
1218 }
1219 }
1220
1221 if (null != secureObjectsTable)
1222 {
1223 foreach (Row row in secureObjectsTable.Rows)
1224 {
1225 string id = (string)row[0];
1226 string table = (string)row[1];
1227
1228 Util.PermissionEx permissionEx = (Util.PermissionEx)this.Core.GetIndexedElement(row);
1229
1230 if ("CreateFolder" == table)
1231 {
1232 ArrayList createFolderElements = (ArrayList)createFolders[id];
1233
1234 if (null != createFolderElements)
1235 {
1236 foreach (Wix.CreateFolder createFolder in createFolderElements)
1237 {
1238 createFolder.AddChild(permissionEx);
1239 }
1240 }
1241 else
1242 {
1243 this.Core.OnMessage(WixWarnings.ExpectedForeignRow(row.SourceLineNumbers, "SecureObjects", row.GetPrimaryKey(DecompilerConstants.PrimaryKeyDelimiter), "LockObject", id, table));
1244 }
1245 }
1246 else
1247 {
1248 Wix.IParentElement parentElement = (Wix.IParentElement)this.Core.GetIndexedElement(table, id);
1249
1250 if (null != parentElement)
1251 {
1252 parentElement.AddChild(permissionEx);
1253 }
1254 else
1255 {
1256 this.Core.OnMessage(WixWarnings.ExpectedForeignRow(row.SourceLineNumbers, "SecureObjects", row.GetPrimaryKey(DecompilerConstants.PrimaryKeyDelimiter), "LockObject", id, table));
1257 }
1258 }
1259 }
1260 }
1261 }
1262
1263 /// <summary>
1264 /// Finalize the ServiceConfig table.
1265 /// </summary>
1266 /// <param name="tables">The collection of all tables.</param>
1267 /// <remarks>
1268 /// Since there is no foreign key from the ServiceName column to the
1269 /// ServiceInstall table, this relationship must be handled late.
1270 /// </remarks>
1271 private void FinalizeServiceConfigTable(TableIndexedCollection tables)
1272 {
1273 Table serviceConfigTable = tables["ServiceConfig"];
1274 Table serviceInstallTable = tables["ServiceInstall"];
1275
1276 Hashtable serviceInstalls = new Hashtable();
1277
1278 // index the ServiceInstall table because the foreign key used by the ServiceConfig
1279 // table is actually the ServiceInstall.Name, not the ServiceInstall.ServiceInstall
1280 // this is unfortunate because the service Name is not guaranteed to be unique, so
1281 // decompiler must assume there could be multiple matches and add the ServiceConfig to each
1282 // TODO: the Component column information should be taken into acount to accurately identify
1283 // the correct column to use
1284 if (null != serviceInstallTable)
1285 {
1286 foreach (Row row in serviceInstallTable.Rows)
1287 {
1288 string name = (string)row[1];
1289 Wix.ServiceInstall serviceInstall = (Wix.ServiceInstall)this.Core.GetIndexedElement(row);
1290
1291 if (!serviceInstalls.Contains(name))
1292 {
1293 serviceInstalls.Add(name, new ArrayList());
1294 }
1295
1296 ((ArrayList)serviceInstalls[name]).Add(serviceInstall);
1297 }
1298 }
1299
1300 if (null != serviceConfigTable)
1301 {
1302 foreach (Row row in serviceConfigTable.Rows)
1303 {
1304 Util.ServiceConfig serviceConfig = (Util.ServiceConfig)this.Core.GetIndexedElement(row);
1305
1306 if (0 == (int)row[2])
1307 {
1308 Wix.Component component = (Wix.Component)this.Core.GetIndexedElement("Component", (string)row[1]);
1309
1310 if (null != component)
1311 {
1312 component.AddChild(serviceConfig);
1313 }
1314 else
1315 {
1316 this.Core.OnMessage(WixWarnings.ExpectedForeignRow(row.SourceLineNumbers, serviceConfigTable.Name, row.GetPrimaryKey(DecompilerConstants.PrimaryKeyDelimiter), "Component_", (string)row[1], "Component"));
1317 }
1318 }
1319 else
1320 {
1321 ArrayList serviceInstallElements = (ArrayList)serviceInstalls[row[0]];
1322
1323 if (null != serviceInstallElements)
1324 {
1325 foreach (Wix.ServiceInstall serviceInstall in serviceInstallElements)
1326 {
1327 serviceInstall.AddChild(serviceConfig);
1328 }
1329 }
1330 else
1331 {
1332 this.Core.OnMessage(WixWarnings.ExpectedForeignRow(row.SourceLineNumbers, serviceConfigTable.Name, row.GetPrimaryKey(DecompilerConstants.PrimaryKeyDelimiter), "ServiceName", (string)row[0], "ServiceInstall"));
1333 }
1334 }
1335 }
1336 }
1337 }
1338
1339 /// <summary>
1340 /// Finalize the XmlConfig table.
1341 /// </summary>
1342 /// <param name="tables">Collection of all tables.</param>
1343 private void FinalizeXmlConfigTable(TableIndexedCollection tables)
1344 {
1345 Table xmlConfigTable = tables["XmlConfig"];
1346
1347 if (null != xmlConfigTable)
1348 {
1349 foreach (Row row in xmlConfigTable.Rows)
1350 {
1351 Util.XmlConfig xmlConfig = (Util.XmlConfig)this.Core.GetIndexedElement(row);
1352
1353 if (null == row[6] || 0 == (int)row[6])
1354 {
1355 Util.XmlConfig parentXmlConfig = (Util.XmlConfig)this.Core.GetIndexedElement("XmlConfig", (string)row[2]);
1356
1357 if (null != parentXmlConfig)
1358 {
1359 parentXmlConfig.AddChild(xmlConfig);
1360 }
1361 else
1362 {
1363 this.Core.OnMessage(WixWarnings.ExpectedForeignRow(row.SourceLineNumbers, xmlConfigTable.Name, row.GetPrimaryKey(DecompilerConstants.PrimaryKeyDelimiter), "ElementPath", (string)row[2], "XmlConfig"));
1364 }
1365 }
1366 else
1367 {
1368 Wix.Component component = (Wix.Component)this.Core.GetIndexedElement("Component", (string)row[7]);
1369
1370 if (null != component)
1371 {
1372 component.AddChild(xmlConfig);
1373 }
1374 else
1375 {
1376 this.Core.OnMessage(WixWarnings.ExpectedForeignRow(row.SourceLineNumbers, xmlConfigTable.Name, row.GetPrimaryKey(DecompilerConstants.PrimaryKeyDelimiter), "Component_", (string)row[7], "Component"));
1377 }
1378 }
1379 }
1380 }
1381 }
1382
1383
1384 /// <summary>
1385 /// Finalize the XmlFile table.
1386 /// </summary>
1387 /// <param name="tables">The collection of all tables.</param>
1388 /// <remarks>
1389 /// Some of the XmlFile table rows are compiler generated from util:EventManifest node
1390 /// These rows should not be appended to component.
1391 /// </remarks>
1392 private void FinalizeXmlFileTable(TableIndexedCollection tables)
1393 {
1394 Table xmlFileTable = tables["XmlFile"];
1395 Table eventManifestTable = tables["EventManifest"];
1396
1397 if (null != xmlFileTable)
1398 {
1399 foreach (Row row in xmlFileTable.Rows)
1400 {
1401 bool bManifestGenerated = false;
1402 string xmlFileConfigId = (string)row[0];
1403 if (null != eventManifestTable)
1404 {
1405 foreach (Row emrow in eventManifestTable.Rows)
1406 {
1407 string formattedFile = (string)emrow[1];
1408 if ((formattedFile.StartsWith("[#", StringComparison.Ordinal) || formattedFile.StartsWith("[!", StringComparison.Ordinal))
1409 && formattedFile.EndsWith("]", StringComparison.Ordinal))
1410 {
1411 string fileId = formattedFile.Substring(2, formattedFile.Length - 3);
1412 if (String.Equals(String.Concat("Config_", fileId, "ResourceFile"), xmlFileConfigId))
1413 {
1414 Util.EventManifest eventManifest = (Util.EventManifest)this.Core.GetIndexedElement(emrow);
1415 if (null != eventManifest)
1416 {
1417 eventManifest.ResourceFile = (string)row[4];
1418 }
1419 bManifestGenerated = true;
1420 }
1421
1422 else if (String.Equals(String.Concat("Config_", fileId, "MessageFile"), xmlFileConfigId))
1423 {
1424 Util.EventManifest eventManifest = (Util.EventManifest)this.Core.GetIndexedElement(emrow);
1425 if (null != eventManifest)
1426 {
1427 eventManifest.MessageFile = (string)row[4];
1428 }
1429 bManifestGenerated = true;
1430 }
1431 }
1432 }
1433 }
1434
1435 if (true == bManifestGenerated)
1436 continue;
1437
1438 Util.XmlFile xmlFile = new Util.XmlFile();
1439
1440 xmlFile.Id = (string)row[0];
1441 xmlFile.File = (string)row[1];
1442 xmlFile.ElementPath = (string)row[2];
1443
1444 if (null != row[3])
1445 {
1446 xmlFile.Name = (string)row[3];
1447 }
1448
1449 if (null != row[4])
1450 {
1451 xmlFile.Value = (string)row[4];
1452 }
1453
1454 int flags = (int)row[5];
1455 if (0x1 == (flags & 0x1) && 0x2 == (flags & 0x2))
1456 {
1457 this.Core.OnMessage(WixWarnings.IllegalColumnValue(row.SourceLineNumbers, xmlFileTable.Name, row.Fields[5].Column.Name, row[5]));
1458 }
1459 else if (0x1 == (flags & 0x1))
1460 {
1461 xmlFile.Action = Util.XmlFile.ActionType.createElement;
1462 }
1463 else if (0x2 == (flags & 0x2))
1464 {
1465 xmlFile.Action = Util.XmlFile.ActionType.deleteValue;
1466 }
1467 else
1468 {
1469 xmlFile.Action = Util.XmlFile.ActionType.setValue;
1470 }
1471
1472 if (0x100 == (flags & 0x100))
1473 {
1474 xmlFile.SelectionLanguage = Util.XmlFile.SelectionLanguageType.XPath;
1475 }
1476
1477 if (0x00001000 == (flags & 0x00001000))
1478 {
1479 xmlFile.PreserveModifiedDate = Util.YesNoType.yes;
1480 }
1481
1482 if (0x00010000 == (flags & 0x00010000))
1483 {
1484 xmlFile.Permanent = Util.YesNoType.yes;
1485 }
1486
1487 if (null != row[7])
1488 {
1489 xmlFile.Sequence = (int)row[7];
1490 }
1491
1492 Wix.Component component = (Wix.Component)this.Core.GetIndexedElement("Component", (string)row[6]);
1493
1494 if (null != component)
1495 {
1496 component.AddChild(xmlFile);
1497 }
1498 else
1499 {
1500 this.Core.OnMessage(WixWarnings.ExpectedForeignRow(row.SourceLineNumbers, xmlFileTable.Name, row.GetPrimaryKey(DecompilerConstants.PrimaryKeyDelimiter), "Component_", (string)row[6], "Component"));
1501 }
1502 }
1503 }
1504 }
1505
1506 /// <summary>
1507 /// Finalize the eventManifest table.
1508 /// This function must be called after FinalizeXmlFileTable
1509 /// </summary>
1510 /// <param name="tables">The collection of all tables.</param>
1511 private void FinalizeEventManifestTable(TableIndexedCollection tables)
1512 {
1513 Table eventManifestTable = tables["EventManifest"];
1514
1515 if (null != eventManifestTable)
1516 {
1517 foreach (Row row in eventManifestTable.Rows)
1518 {
1519 string formattedFile = (string)row[1];
1520 Util.EventManifest eventManifest = (Util.EventManifest)this.Core.GetIndexedElement(row);
1521
1522 // try to "de-format" the File column's value to determine the proper parent File element
1523 if ((formattedFile.StartsWith("[#", StringComparison.Ordinal) || formattedFile.StartsWith("[!", StringComparison.Ordinal))
1524 && formattedFile.EndsWith("]", StringComparison.Ordinal))
1525 {
1526 string fileId = formattedFile.Substring(2, formattedFile.Length - 3);
1527
1528 Wix.File file = (Wix.File)this.Core.GetIndexedElement("File", fileId);
1529 if (null != file)
1530 {
1531 file.AddChild(eventManifest);
1532 }
1533 }
1534 else
1535 {
1536 this.Core.OnMessage(UtilErrors.IllegalFileValueInPerfmonOrManifest(formattedFile, "EventManifest"));
1537 }
1538 }
1539 }
1540 }
1541 }
1542#endif
1543}
diff --git a/src/ext/Util/wixext/UtilErrors.cs b/src/ext/Util/wixext/UtilErrors.cs
new file mode 100644
index 00000000..b9ce1688
--- /dev/null
+++ b/src/ext/Util/wixext/UtilErrors.cs
@@ -0,0 +1,49 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Util
4{
5 using System;
6 using System.Resources;
7 using WixToolset.Data;
8
9 public static class UtilErrors
10 {
11 public static Message IllegalAttributeWithoutComponent(SourceLineNumber sourceLineNumbers, string elementName, string attributeName)
12 {
13 return Message(sourceLineNumbers, Ids.IllegalAttributeWithoutComponent, "The {0}/@{1} attribute cannot be specified unless the element has a Component as an ancestor. A {0} that does not have a Component ancestor is not installed.", elementName, attributeName);
14 }
15
16 public static Message IllegalElementWithoutComponent(SourceLineNumber sourceLineNumbers, string elementName)
17 {
18 return Message(sourceLineNumbers, Ids.IllegalElementWithoutComponent, "The {0} element cannot be specified unless the element has a Component as an ancestor. A {0} that does not have a Component ancestor is not installed.", elementName);
19 }
20
21 public static Message IllegalFileValueInPerfmonOrManifest(string file, string table)
22 {
23 return Message(null, Ids.IllegalFileValueInPerfmonOrManifest, "The value '{0}' in the File column, {1} table is invalid. It should be in the form of '[#file]' or '[!file]'.", file, table);
24 }
25
26 public static Message InvalidRegistryObject(SourceLineNumber sourceLineNumbers, string registryElementName)
27 {
28 return Message(sourceLineNumbers, Ids.InvalidRegistryObject, "The {0} element has no id and cannot have its permissions set. If you want to set permissions on a 'placeholder' registry key, force its creation by setting the ForceCreateOnInstall attribute to yes.", registryElementName);
29 }
30
31 private static Message Message(SourceLineNumber sourceLineNumber, Ids id, string format, params object[] args)
32 {
33 return new Message(sourceLineNumber, MessageLevel.Error, (int)id, format, args);
34 }
35
36 private static Message Message(SourceLineNumber sourceLineNumber, Ids id, ResourceManager resourceManager, string resourceName, params object[] args)
37 {
38 return new Message(sourceLineNumber, MessageLevel.Error, (int)id, resourceManager, resourceName, args);
39 }
40
41 public enum Ids
42 {
43 IllegalAttributeWithoutComponent = 5050,
44 IllegalElementWithoutComponent = 5051,
45 IllegalFileValueInPerfmonOrManifest = 5054,
46 InvalidRegistryObject = 5063,
47 }
48 }
49}
diff --git a/src/ext/Util/wixext/UtilExtensionData.cs b/src/ext/Util/wixext/UtilExtensionData.cs
new file mode 100644
index 00000000..d3ca3358
--- /dev/null
+++ b/src/ext/Util/wixext/UtilExtensionData.cs
@@ -0,0 +1,23 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Util
4{
5 using WixToolset.Data;
6 using WixToolset.Extensibility;
7
8 public sealed class UtilExtensionData : BaseExtensionData
9 {
10 public override string DefaultCulture => "en-US";
11
12 public override bool TryGetSymbolDefinitionByName(string name, out IntermediateSymbolDefinition symbolDefinition)
13 {
14 symbolDefinition = UtilSymbolDefinitions.ByName(name);
15 return symbolDefinition != null;
16 }
17
18 public override Intermediate GetLibrary(ISymbolDefinitionCreator symbolDefinitions)
19 {
20 return Intermediate.Load(typeof(UtilExtensionData).Assembly, "WixToolset.Util.util.wixlib", symbolDefinitions);
21 }
22 }
23}
diff --git a/src/ext/Util/wixext/UtilExtensionFactory.cs b/src/ext/Util/wixext/UtilExtensionFactory.cs
new file mode 100644
index 00000000..08352813
--- /dev/null
+++ b/src/ext/Util/wixext/UtilExtensionFactory.cs
@@ -0,0 +1,18 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Util
4{
5 using System;
6 using System.Collections.Generic;
7 using WixToolset.Extensibility;
8
9 public class UtilExtensionFactory : BaseExtensionFactory
10 {
11 protected override IReadOnlyCollection<Type> ExtensionTypes => new[]
12 {
13 typeof(UtilCompiler),
14 typeof(UtilExtensionData),
15 typeof(UtilWindowsInstallerBackendBinderExtension),
16 };
17 }
18}
diff --git a/src/ext/Util/wixext/UtilTableDefinitions.cs b/src/ext/Util/wixext/UtilTableDefinitions.cs
new file mode 100644
index 00000000..12f423cc
--- /dev/null
+++ b/src/ext/Util/wixext/UtilTableDefinitions.cs
@@ -0,0 +1,319 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Util
4{
5 using WixToolset.Data.WindowsInstaller;
6
7 public static class UtilTableDefinitions
8 {
9 public static readonly TableDefinition Wix4CloseApplication = new TableDefinition(
10 "Wix4CloseApplication",
11 UtilSymbolDefinitions.WixCloseApplication,
12 new[]
13 {
14 new ColumnDefinition("Wix4CloseApplication", ColumnType.String, 72, primaryKey: true, nullable: false, ColumnCategory.Identifier, description: "Primary key, non-localized token in table.", modularizeType: ColumnModularizeType.Column),
15 new ColumnDefinition("Target", ColumnType.Localized, 0, primaryKey: false, nullable: false, ColumnCategory.Formatted, description: "Name of executable to ensure is closed.", modularizeType: ColumnModularizeType.Property),
16 new ColumnDefinition("Description", ColumnType.String, 0, primaryKey: false, nullable: true, ColumnCategory.Formatted, description: "Description string displayed to user when executable is in use.", modularizeType: ColumnModularizeType.Property, forceLocalizable: true),
17 new ColumnDefinition("Condition", ColumnType.String, 0, primaryKey: false, nullable: true, ColumnCategory.Condition, description: "Optional expression which skips the closing.", modularizeType: ColumnModularizeType.Condition, forceLocalizable: true),
18 new ColumnDefinition("Attributes", ColumnType.Number, 4, primaryKey: false, nullable: false, ColumnCategory.Unknown, minValue: 0, maxValue: 2147483647, description: "A 32-bit word that specifies the attribute flags to be applied."),
19 new ColumnDefinition("Sequence", ColumnType.Number, 4, primaryKey: false, nullable: true, ColumnCategory.Unknown, minValue: 1, maxValue: 2147483647, description: "Sequence to order the closings by."),
20 new ColumnDefinition("Property", ColumnType.String, 72, primaryKey: false, nullable: true, ColumnCategory.Identifier, description: "Optional property that is set to the number of running instances of the app.", modularizeType: ColumnModularizeType.Property, forceLocalizable: true),
21 new ColumnDefinition("TerminateExitCode", ColumnType.Number, 4, primaryKey: false, nullable: true, ColumnCategory.Unknown, minValue: 0, maxValue: 2147483647, description: "Exit code to return from a terminated application."),
22 new ColumnDefinition("Timeout", ColumnType.Number, 4, primaryKey: false, nullable: true, ColumnCategory.Unknown, minValue: 1, maxValue: 2147483647, description: "Timeout in milliseconds before scheduling restart or terminating application."),
23 },
24 symbolIdIsPrimaryKey: true
25 );
26
27 public static readonly TableDefinition Wix4RemoveFolderEx = new TableDefinition(
28 "Wix4RemoveFolderEx",
29 UtilSymbolDefinitions.WixRemoveFolderEx,
30 new[]
31 {
32 new ColumnDefinition("Wix4RemoveFolderEx", ColumnType.String, 72, primaryKey: true, nullable: false, ColumnCategory.Identifier, description: "Identifier for the WixRemoveFolderEx row in the package.", modularizeType: ColumnModularizeType.Column),
33 new ColumnDefinition("Component_", ColumnType.String, 72, primaryKey: false, nullable: false, ColumnCategory.Identifier, keyTable: "Component", keyColumn: 1, description: "Foreign key into the Component table used to determine install state", modularizeType: ColumnModularizeType.Column),
34 new ColumnDefinition("Property", ColumnType.String, 72, primaryKey: false, nullable: false, ColumnCategory.Identifier, description: "Name of Property that contains the root of the directory tree to remove.", modularizeType: ColumnModularizeType.Column),
35 new ColumnDefinition("InstallMode", ColumnType.Number, 2, primaryKey: false, nullable: false, ColumnCategory.Unknown, minValue: 1, maxValue: 3, description: "1 == Remove only when the associated component is being installed (msiInstallStateLocal or msiInstallStateSource), 2 == Remove only when the associated component is being removed (msiInstallStateAbsent), 3 = Remove in either of the above cases."),
36 new ColumnDefinition("Condition", ColumnType.String, 0, primaryKey: false, nullable: true, ColumnCategory.Condition, description: "Optional expression which skips the removing of folders.", modularizeType: ColumnModularizeType.Condition, forceLocalizable: true),
37 },
38 symbolIdIsPrimaryKey: true
39 );
40
41 public static readonly TableDefinition Wix4RemoveRegistryKeyEx = new TableDefinition(
42 "Wix4RemoveRegistryKeyEx",
43 UtilSymbolDefinitions.WixRemoveRegistryKeyEx,
44 new[]
45 {
46 new ColumnDefinition("Wix4RemoveRegistryKeyEx", ColumnType.String, 72, primaryKey: true, nullable: false, ColumnCategory.Identifier, description: "Identifier for the Wix4RemoveRegistryKeyEx row in the package.", modularizeType: ColumnModularizeType.Column),
47 new ColumnDefinition("Component_", ColumnType.String, 72, primaryKey: false, nullable: false, ColumnCategory.Identifier, keyTable: "Component", keyColumn: 1, description: "Foreign key into the Component table used to determine install state", modularizeType: ColumnModularizeType.Column),
48 new ColumnDefinition("Root", ColumnType.Number, 2, primaryKey: false, nullable: false, ColumnCategory.Unknown, minValue: -1, maxValue: 3, description: "The predefined root key for the registry value, one of rrkEnum."),
49 new ColumnDefinition("Key", ColumnType.Localized, 255, primaryKey: false, nullable: false, ColumnCategory.RegPath, description: "The key for the registry value.", modularizeType: ColumnModularizeType.Property),
50 new ColumnDefinition("InstallMode", ColumnType.Number, 2, primaryKey: false, nullable: false, ColumnCategory.Unknown, minValue: 1, maxValue: 3, description: "1 == Remove only when the associated component is being installed (msiInstallStateLocal or msiInstallStateSource), 2 == Remove only when the associated component is being removed (msiInstallStateAbsent), 3 = Remove in either of the above cases."),
51 new ColumnDefinition("Condition", ColumnType.String, 0, primaryKey: false, nullable: true, ColumnCategory.Condition, description: "Optional expression to control whether the registry key is removed.", modularizeType: ColumnModularizeType.Condition, forceLocalizable: true),
52 },
53 symbolIdIsPrimaryKey: true
54 );
55
56 public static readonly TableDefinition Wix4RestartResource = new TableDefinition(
57 "Wix4RestartResource",
58 UtilSymbolDefinitions.WixRestartResource,
59 new[]
60 {
61 new ColumnDefinition("Wix4RestartResource", ColumnType.String, 72, primaryKey: true, nullable: false, ColumnCategory.Identifier, description: "Primary key, non-localized identifier.", modularizeType: ColumnModularizeType.Column),
62 new ColumnDefinition("Component_", ColumnType.String, 72, primaryKey: false, nullable: true, ColumnCategory.Identifier, keyTable: "Component", keyColumn: 1, description: "Foreign key into the Component table used to determine install state.", modularizeType: ColumnModularizeType.Column),
63 new ColumnDefinition("Resource", ColumnType.String, 0, primaryKey: false, nullable: false, ColumnCategory.Formatted, description: "The resource to be registered with the Restart Manager.", modularizeType: ColumnModularizeType.Property),
64 new ColumnDefinition("Attributes", ColumnType.Number, 4, primaryKey: false, nullable: false, ColumnCategory.Unknown, minValue: 0, maxValue: 2147483647, description: "A 32-bit word that specifies the type of resource and flags used for processing."),
65 },
66 symbolIdIsPrimaryKey: true
67 );
68
69 public static readonly TableDefinition Wix4FileShare = new TableDefinition(
70 "Wix4FileShare",
71 UtilSymbolDefinitions.FileShare,
72 new[]
73 {
74 new ColumnDefinition("Wix4FileShare", ColumnType.String, 72, primaryKey: true, nullable: false, ColumnCategory.Identifier, description: "Primary key, non-localized identifier", modularizeType: ColumnModularizeType.Column),
75 new ColumnDefinition("ShareName", ColumnType.String, 255, primaryKey: false, nullable: false, ColumnCategory.Formatted, description: "The actual share name used"),
76 new ColumnDefinition("Component_", ColumnType.String, 72, primaryKey: false, nullable: false, ColumnCategory.Identifier, keyTable: "Component", keyColumn: 1, description: "Foreign key into the Component table used to determine install state", modularizeType: ColumnModularizeType.Column),
77 new ColumnDefinition("Description", ColumnType.String, 255, primaryKey: false, nullable: true, ColumnCategory.Text, description: "Description string displayed for the file share"),
78 new ColumnDefinition("Directory_", ColumnType.String, 72, primaryKey: false, nullable: false, ColumnCategory.Identifier, keyTable: "Directory", keyColumn: 1, description: "Foreign key referencing directory that the share is created on", modularizeType: ColumnModularizeType.Column),
79 },
80 symbolIdIsPrimaryKey: true
81 );
82
83 public static readonly TableDefinition Wix4FileSharePermissions = new TableDefinition(
84 "Wix4FileSharePermissions",
85 UtilSymbolDefinitions.FileSharePermissions,
86 new[]
87 {
88 new ColumnDefinition("Wix4FileShare_", ColumnType.String, 72, primaryKey: true, nullable: false, ColumnCategory.Identifier, keyTable: "FileShare", keyColumn: 1, description: "FileShare that these premissions are to be applied to.", modularizeType: ColumnModularizeType.Column),
89 new ColumnDefinition("Wix4User_", ColumnType.String, 72, primaryKey: true, nullable: false, ColumnCategory.Identifier, keyTable: "Wix4User", description: "User that these premissions are to apply to.", modularizeType: ColumnModularizeType.Column),
90 new ColumnDefinition("Permissions", ColumnType.Number, 4, primaryKey: false, nullable: false, ColumnCategory.Unknown, description: "Permissions int, as in EXPLICIT_ACCESS.grfAccessPermissions in MSDN"),
91 },
92 symbolIdIsPrimaryKey: false
93 );
94
95 public static readonly TableDefinition Wix4Group = new TableDefinition(
96 "Wix4Group",
97 UtilSymbolDefinitions.Group,
98 new[]
99 {
100 new ColumnDefinition("Wix4Group", ColumnType.String, 72, primaryKey: true, nullable: false, ColumnCategory.Identifier, description: "Primary key, non-localized token", modularizeType: ColumnModularizeType.Column),
101 new ColumnDefinition("Component_", ColumnType.String, 72, primaryKey: false, nullable: true, ColumnCategory.Text, keyTable: "Component", keyColumn: 1, description: "Foreign key, Component used to determine install state", modularizeType: ColumnModularizeType.Column),
102 new ColumnDefinition("Name", ColumnType.String, 255, primaryKey: false, nullable: false, ColumnCategory.Formatted, description: "Group name", modularizeType: ColumnModularizeType.Property),
103 new ColumnDefinition("Domain", ColumnType.String, 255, primaryKey: false, nullable: true, ColumnCategory.Formatted, description: "Group domain", modularizeType: ColumnModularizeType.Property),
104 },
105 symbolIdIsPrimaryKey: true
106 );
107
108 public static readonly TableDefinition Wix4InternetShortcut = new TableDefinition(
109 "Wix4InternetShortcut",
110 UtilSymbolDefinitions.WixInternetShortcut,
111 new[]
112 {
113 new ColumnDefinition("Wix4InternetShortcut", ColumnType.String, 72, primaryKey: true, nullable: false, ColumnCategory.Identifier, description: "Primary key, non-localized token in table.", modularizeType: ColumnModularizeType.Column),
114 new ColumnDefinition("Component_", ColumnType.String, 72, primaryKey: false, nullable: false, ColumnCategory.Text, keyTable: "Component", keyColumn: 1, description: "Foreign key, Component used to determine install state", modularizeType: ColumnModularizeType.Column),
115 new ColumnDefinition("Directory_", ColumnType.String, 72, primaryKey: false, nullable: false, ColumnCategory.Identifier, keyTable: "Directory", keyColumn: 1, description: "Foreign key referencing directory that the shortcut is created in", modularizeType: ColumnModularizeType.Column),
116 new ColumnDefinition("Name", ColumnType.String, 72, primaryKey: false, nullable: false, ColumnCategory.Text, description: "Name used for shortcut.", modularizeType: ColumnModularizeType.Property),
117 new ColumnDefinition("Target", ColumnType.Localized, 0, primaryKey: false, nullable: false, ColumnCategory.Text, description: "URL target."),
118 new ColumnDefinition("Attributes", ColumnType.Number, 2, primaryKey: false, nullable: false, ColumnCategory.Unknown, description: "Attribute flags that control how the shortcut is created."),
119 new ColumnDefinition("IconFile", ColumnType.Localized, 0, primaryKey: false, nullable: true, ColumnCategory.Formatted, description: "Icon file for shortcut", modularizeType: ColumnModularizeType.Property),
120 new ColumnDefinition("IconIndex", ColumnType.Number, 4, primaryKey: false, nullable: true, ColumnCategory.Unknown, description: "Index of the icon being referenced."),
121 },
122 symbolIdIsPrimaryKey: true
123 );
124
125 public static readonly TableDefinition Wix4PerformanceCategory = new TableDefinition(
126 "Wix4PerformanceCategory",
127 UtilSymbolDefinitions.PerformanceCategory,
128 new[]
129 {
130 new ColumnDefinition("Wix4PerformanceCategory", ColumnType.String, 72, primaryKey: true, nullable: false, ColumnCategory.Identifier, description: "Primary key, non-localized token in table.", modularizeType: ColumnModularizeType.Column),
131 new ColumnDefinition("Component_", ColumnType.String, 72, primaryKey: false, nullable: false, ColumnCategory.Identifier, keyTable: "Component", keyColumn: 1, description: "Component used to determine install state", modularizeType: ColumnModularizeType.Column),
132 new ColumnDefinition("Name", ColumnType.String, 80, primaryKey: false, nullable: false, ColumnCategory.Text, description: "Name of the performance counter category."),
133 new ColumnDefinition("IniData", ColumnType.Localized, 0, primaryKey: false, nullable: false, ColumnCategory.Text, description: "Data that goes into the performance counter .ini file."),
134 new ColumnDefinition("ConstantData", ColumnType.Localized, 0, primaryKey: false, nullable: false, ColumnCategory.Text, description: "Data that goes into the performance counter .h file."),
135 },
136 symbolIdIsPrimaryKey: true
137 );
138
139 public static readonly TableDefinition Wix4Perfmon = new TableDefinition(
140 "Wix4Perfmon",
141 UtilSymbolDefinitions.Perfmon,
142 new[]
143 {
144 new ColumnDefinition("Component_", ColumnType.String, 72, primaryKey: true, nullable: false, ColumnCategory.Identifier, keyTable: "Component", keyColumn: 1, description: "Component used to determine install state", modularizeType: ColumnModularizeType.Column),
145 new ColumnDefinition("File", ColumnType.String, 72, primaryKey: true, nullable: false, ColumnCategory.Formatted, description: "Name of .INI file", modularizeType: ColumnModularizeType.Property),
146 new ColumnDefinition("Name", ColumnType.String, 72, primaryKey: true, nullable: false, ColumnCategory.Text, description: "Service name in registry"),
147 },
148 symbolIdIsPrimaryKey: false
149 );
150
151 public static readonly TableDefinition Wix4PerfmonManifest = new TableDefinition(
152 "Wix4PerfmonManifest",
153 UtilSymbolDefinitions.PerfmonManifest,
154 new[]
155 {
156 new ColumnDefinition("Component_", ColumnType.String, 72, primaryKey: true, nullable: false, ColumnCategory.Identifier, keyTable: "Component", keyColumn: 1, description: "Component used to determine install state", modularizeType: ColumnModularizeType.Column),
157 new ColumnDefinition("File", ColumnType.String, 72, primaryKey: true, nullable: false, ColumnCategory.Formatted, description: "Name of perfmon manifest file", modularizeType: ColumnModularizeType.Property),
158 new ColumnDefinition("ResourceFileDirectory", ColumnType.String, 255, primaryKey: true, nullable: false, ColumnCategory.Formatted, description: "The path of the Resource File Directory"),
159 },
160 symbolIdIsPrimaryKey: false
161 );
162
163 public static readonly TableDefinition Wix4EventManifest = new TableDefinition(
164 "Wix4EventManifest",
165 UtilSymbolDefinitions.EventManifest,
166 new[]
167 {
168 new ColumnDefinition("Component_", ColumnType.String, 72, primaryKey: true, nullable: false, ColumnCategory.Identifier, keyTable: "Component", keyColumn: 1, description: "Component used to determine install state", modularizeType: ColumnModularizeType.Column),
169 new ColumnDefinition("File", ColumnType.String, 72, primaryKey: true, nullable: false, ColumnCategory.Formatted, description: "Name of event manifest file", modularizeType: ColumnModularizeType.Property),
170 },
171 symbolIdIsPrimaryKey: false
172 );
173
174 public static readonly TableDefinition Wix4SecureObject = new TableDefinition(
175 "Wix4SecureObject",
176 UtilSymbolDefinitions.SecureObjects,
177 new[]
178 {
179 new ColumnDefinition("Wix4SecureObject", ColumnType.String, 72, primaryKey: true, nullable: false, ColumnCategory.Identifier, description: "Primary key, non-localized token in Table", modularizeType: ColumnModularizeType.Column),
180 new ColumnDefinition("Table", ColumnType.String, 32, primaryKey: true, nullable: false, ColumnCategory.Text, description: "Table SecureObject should be securing"),
181 new ColumnDefinition("Domain", ColumnType.String, 255, primaryKey: true, nullable: true, ColumnCategory.Text, description: "Domain half of user account to secure", modularizeType: ColumnModularizeType.Property),
182 new ColumnDefinition("User", ColumnType.String, 255, primaryKey: true, nullable: false, ColumnCategory.Text, description: "User name half of user account to secure", modularizeType: ColumnModularizeType.Property),
183 new ColumnDefinition("Attributes", ColumnType.Number, 4, primaryKey: false, nullable: false, ColumnCategory.Integer, minValue: 0, maxValue: 2147483647, description: "A 32-bit word that specifies the attribute flags to be applied."),
184 new ColumnDefinition("Permission", ColumnType.Number, 4, primaryKey: false, nullable: true, ColumnCategory.Unknown, minValue: -2147483647, maxValue: 2147483647, description: "Permissions to grant to User"),
185 new ColumnDefinition("Component_", ColumnType.String, 72, primaryKey: false, nullable: false, ColumnCategory.Identifier, keyTable: "Component", keyColumn: 1, description: "Foreign key into the Component table used to determine install state", modularizeType: ColumnModularizeType.Column),
186 },
187 symbolIdIsPrimaryKey: false
188 );
189
190 public static readonly TableDefinition Wix4ServiceConfig = new TableDefinition(
191 "Wix4ServiceConfig",
192 UtilSymbolDefinitions.ServiceConfig,
193 new[]
194 {
195 new ColumnDefinition("ServiceName", ColumnType.String, 72, primaryKey: true, nullable: false, ColumnCategory.Formatted, description: "Primary key, non-localized token"),
196 new ColumnDefinition("Component_", ColumnType.String, 72, primaryKey: false, nullable: false, ColumnCategory.Identifier, keyTable: "Component", keyColumn: 1, description: "Foreign key, Component used to determine install state ", modularizeType: ColumnModularizeType.Column),
197 new ColumnDefinition("NewService", ColumnType.Number, 1, primaryKey: false, nullable: false, ColumnCategory.Unknown, minValue: 0, maxValue: 1, description: "Whether the affected service is being installed or already exists."),
198 new ColumnDefinition("FirstFailureActionType", ColumnType.String, 32, primaryKey: false, nullable: false, ColumnCategory.Text, description: "First failure action type for configured service to take."),
199 new ColumnDefinition("SecondFailureActionType", ColumnType.String, 32, primaryKey: false, nullable: false, ColumnCategory.Text, description: "Second failure action type for configured service to take."),
200 new ColumnDefinition("ThirdFailureActionType", ColumnType.String, 32, primaryKey: false, nullable: false, ColumnCategory.Text, description: "Third failure action type for configured service to take."),
201 new ColumnDefinition("ResetPeriodInDays", ColumnType.Number, 4, primaryKey: false, nullable: true, ColumnCategory.Integer, minValue: 0, description: "Period after which to reset the failure count for the service."),
202 new ColumnDefinition("RestartServiceDelayInSeconds", ColumnType.Number, 4, primaryKey: false, nullable: true, ColumnCategory.Integer, minValue: 0, description: "Period after which to restart the service after a given failure."),
203 new ColumnDefinition("ProgramCommandLine", ColumnType.String, 255, primaryKey: false, nullable: true, ColumnCategory.Formatted, description: "Command line for program to run if failure action is RUN_COMMAND."),
204 new ColumnDefinition("RebootMessage", ColumnType.String, 255, primaryKey: false, nullable: true, ColumnCategory.Text, description: "Message to show to users when rebooting if failure action is REBOOT."),
205 },
206 symbolIdIsPrimaryKey: false
207 );
208
209 public static readonly TableDefinition Wix4TouchFile = new TableDefinition(
210 "Wix4TouchFile",
211 UtilSymbolDefinitions.WixTouchFile,
212 new[]
213 {
214 new ColumnDefinition("Wix4TouchFile", ColumnType.String, 72, primaryKey: true, nullable: false, ColumnCategory.Identifier, description: "Identifier for the Wix4TouchFile row in the package.", modularizeType: ColumnModularizeType.Column),
215 new ColumnDefinition("Component_", ColumnType.String, 72, primaryKey: false, nullable: false, ColumnCategory.Identifier, keyTable: "Component", keyColumn: 1, description: "Foreign key into the Component table used to determine install state", modularizeType: ColumnModularizeType.Column),
216 new ColumnDefinition("Path", ColumnType.String, 255, primaryKey: false, nullable: false, ColumnCategory.Formatted, description: "Formatted column that resolves to the path to touch.", modularizeType: ColumnModularizeType.Property),
217 new ColumnDefinition("Attributes", ColumnType.Number, 2, primaryKey: false, nullable: false, ColumnCategory.Unknown, minValue: 1, maxValue: 63, description: "1 == Touch only when the associated component is being installed, 2 == Touch only when the associated component is being repaired , 4 == Touch only when the associated component is being removed, 16 = path is in 64-bit location, 32 = touching the file is vital."),
218 },
219 symbolIdIsPrimaryKey: true
220 );
221
222 public static readonly TableDefinition Wix4User = new TableDefinition(
223 "Wix4User",
224 UtilSymbolDefinitions.User,
225 new[]
226 {
227 new ColumnDefinition("Wix4User", ColumnType.String, 72, primaryKey: true, nullable: false, ColumnCategory.Identifier, description: "Primary key, non-localized token", modularizeType: ColumnModularizeType.Column),
228 new ColumnDefinition("Component_", ColumnType.String, 72, primaryKey: false, nullable: true, ColumnCategory.Text, keyTable: "Component", keyColumn: 1, description: "Foreign key, Component used to determine install state", modularizeType: ColumnModularizeType.Column),
229 new ColumnDefinition("Name", ColumnType.String, 255, primaryKey: false, nullable: false, ColumnCategory.Formatted, description: "User name", modularizeType: ColumnModularizeType.Property),
230 new ColumnDefinition("Domain", ColumnType.String, 255, primaryKey: false, nullable: true, ColumnCategory.Formatted, description: "User domain", modularizeType: ColumnModularizeType.Property),
231 new ColumnDefinition("Password", ColumnType.String, 255, primaryKey: false, nullable: true, ColumnCategory.Formatted, description: "User password", modularizeType: ColumnModularizeType.Property),
232 new ColumnDefinition("Attributes", ColumnType.Number, 4, primaryKey: false, nullable: true, ColumnCategory.Unknown, minValue: 0, maxValue: 65535, description: "Attributes describing how to create the user"),
233 },
234 symbolIdIsPrimaryKey: true
235 );
236
237 public static readonly TableDefinition Wix4UserGroup = new TableDefinition(
238 "Wix4UserGroup",
239 UtilSymbolDefinitions.UserGroup,
240 new[]
241 {
242 new ColumnDefinition("Wix4User_", ColumnType.String, 72, primaryKey: true, nullable: false, ColumnCategory.Identifier, keyTable: "Wix4User", keyColumn: 1, description: "User to be joined to a Group.", modularizeType: ColumnModularizeType.Column),
243 new ColumnDefinition("Wix4Group_", ColumnType.String, 72, primaryKey: true, nullable: false, ColumnCategory.Identifier, keyTable: "Wix4Group", keyColumn: 1, description: "Group to join User to.", modularizeType: ColumnModularizeType.Column),
244 },
245 symbolIdIsPrimaryKey: false
246 );
247
248 public static readonly TableDefinition Wix4XmlFile = new TableDefinition(
249 "Wix4XmlFile",
250 UtilSymbolDefinitions.XmlFile,
251 new[]
252 {
253 new ColumnDefinition("Wix4XmlFile", ColumnType.String, 72, primaryKey: true, nullable: false, ColumnCategory.Identifier, description: "Primary key, non-localized token.", modularizeType: ColumnModularizeType.Column),
254 new ColumnDefinition("File", ColumnType.Localized, 255, primaryKey: false, nullable: false, ColumnCategory.Formatted, description: "The .XML file in which to write the information", modularizeType: ColumnModularizeType.Property),
255 new ColumnDefinition("ElementPath", ColumnType.Localized, 0, primaryKey: false, nullable: false, ColumnCategory.Formatted, description: "The .XML file element to modify.", modularizeType: ColumnModularizeType.Property),
256 new ColumnDefinition("Name", ColumnType.Localized, 255, primaryKey: false, nullable: true, ColumnCategory.Formatted, description: "The .XML file node to set/add in the element.", modularizeType: ColumnModularizeType.Property),
257 new ColumnDefinition("Value", ColumnType.Localized, 0, primaryKey: false, nullable: true, ColumnCategory.Formatted, description: "The value to be written.", modularizeType: ColumnModularizeType.Property),
258 new ColumnDefinition("Flags", ColumnType.Number, 4, primaryKey: false, nullable: false, ColumnCategory.Unknown, minValue: 0, maxValue: 70143, description: "Flags"),
259 new ColumnDefinition("Component_", ColumnType.String, 72, primaryKey: false, nullable: false, ColumnCategory.Identifier, keyTable: "Component", keyColumn: 1, description: "Foreign key into the Component table referencing component that controls the installing of the .XML value.", modularizeType: ColumnModularizeType.Column),
260 new ColumnDefinition("Sequence", ColumnType.Number, 2, primaryKey: false, nullable: true, ColumnCategory.Unknown, description: "Order to execute the XML modifications."),
261 },
262 symbolIdIsPrimaryKey: true
263 );
264
265 public static readonly TableDefinition Wix4XmlConfig = new TableDefinition(
266 "Wix4XmlConfig",
267 UtilSymbolDefinitions.XmlConfig,
268 new[]
269 {
270 new ColumnDefinition("Wix4XmlConfig", ColumnType.String, 72, primaryKey: true, nullable: false, ColumnCategory.Identifier, description: "Primary key, non-localized token.", modularizeType: ColumnModularizeType.Column),
271 new ColumnDefinition("File", ColumnType.Localized, 255, primaryKey: false, nullable: false, ColumnCategory.Formatted, description: "The .XML file in which to write the information", modularizeType: ColumnModularizeType.Property),
272 new ColumnDefinition("ElementId", ColumnType.String, 0, primaryKey: false, nullable: true, ColumnCategory.Identifier, keyTable: "Wix4XmlConfig", keyColumn: 1, description: "A foreign key reference to another Wix4XmlConfig row if no attributes are set and the row referenced is a create element row.", modularizeType: ColumnModularizeType.Column),
273 new ColumnDefinition("ElementPath", ColumnType.Localized, 0, primaryKey: false, nullable: true, ColumnCategory.Formatted, description: "The XPATH query for an element to modify or add children to. Must be null if ElementId is provided", modularizeType: ColumnModularizeType.Property),
274 new ColumnDefinition("VerifyPath", ColumnType.Localized, 0, primaryKey: false, nullable: true, ColumnCategory.Formatted, description: "The XPATH query run from ElementPath to verify whether a repair is necessary. Also used to uninstall.", modularizeType: ColumnModularizeType.Property),
275 new ColumnDefinition("Name", ColumnType.Localized, 255, primaryKey: false, nullable: true, ColumnCategory.Formatted, description: "The .XML file node to set/add in the element.", modularizeType: ColumnModularizeType.Property),
276 new ColumnDefinition("Value", ColumnType.Localized, 0, primaryKey: false, nullable: true, ColumnCategory.Formatted, description: "The value to be written.", modularizeType: ColumnModularizeType.Property),
277 new ColumnDefinition("Flags", ColumnType.Number, 4, primaryKey: false, nullable: false, ColumnCategory.Unknown, minValue: 0, maxValue: 65536, description: "Element=1,Value=2,Document=4,Create=16,Delete=32,Install=256,Uninstall=512"),
278 new ColumnDefinition("Component_", ColumnType.String, 72, primaryKey: false, nullable: false, ColumnCategory.Identifier, keyTable: "Component", keyColumn: 1, description: "Foreign key into the Component table referencing component that controls the installing of the .XML value.", modularizeType: ColumnModularizeType.Column),
279 new ColumnDefinition("Sequence", ColumnType.Number, 2, primaryKey: false, nullable: true, ColumnCategory.Unknown, description: "Order to execute the XML modifications."),
280 },
281 symbolIdIsPrimaryKey: true
282 );
283
284 public static readonly TableDefinition Wix4FormatFile = new TableDefinition(
285 "Wix4FormatFile",
286 UtilSymbolDefinitions.WixFormatFiles,
287 new[]
288 {
289 new ColumnDefinition("Binary_", ColumnType.String, 72, primaryKey: true, nullable: false, ColumnCategory.Identifier, keyTable: "Binary", keyColumn: 1, description: "Binary data to be formatted.", modularizeType: ColumnModularizeType.Column),
290 new ColumnDefinition("File_", ColumnType.String, 72, primaryKey: true, nullable: false, ColumnCategory.Identifier, keyTable: "File", keyColumn: 1, description: "File whose component controls the custom action and where the formatted data is written.", modularizeType: ColumnModularizeType.Column),
291 },
292 symbolIdIsPrimaryKey: false
293 );
294
295 public static readonly TableDefinition[] All = new[]
296 {
297 Wix4CloseApplication,
298 Wix4RemoveFolderEx,
299 Wix4RemoveRegistryKeyEx,
300 Wix4RestartResource,
301 Wix4FileShare,
302 Wix4FileSharePermissions,
303 Wix4Group,
304 Wix4InternetShortcut,
305 Wix4PerformanceCategory,
306 Wix4Perfmon,
307 Wix4PerfmonManifest,
308 Wix4EventManifest,
309 Wix4SecureObject,
310 Wix4ServiceConfig,
311 Wix4TouchFile,
312 Wix4User,
313 Wix4UserGroup,
314 Wix4XmlFile,
315 Wix4XmlConfig,
316 Wix4FormatFile,
317 };
318 }
319}
diff --git a/src/ext/Util/wixext/UtilWarnings.cs b/src/ext/Util/wixext/UtilWarnings.cs
new file mode 100644
index 00000000..b65abe45
--- /dev/null
+++ b/src/ext/Util/wixext/UtilWarnings.cs
@@ -0,0 +1,37 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Util
4{
5 using System;
6 using System.Resources;
7 using WixToolset.Data;
8
9 public static class UtilWarnings
10 {
11 public static Message DeprecatedPerfCounterElement(SourceLineNumber sourceLineNumbers)
12 {
13 return Message(sourceLineNumbers, Ids.DeprecatedPerfCounterElement, "The PerfCounter element has been deprecated. Please use the PerformanceCounter element instead.");
14 }
15
16 public static Message RequiredAttributeForWindowsXP(SourceLineNumber sourceLineNumbers, string elementName, string attributeName)
17 {
18 return Message(sourceLineNumbers, Ids.RequiredAttributeForWindowsXP, "The {0}/@{1} attribute must be specified to successfully install on Windows XP. You can ignore this warning if this installation does not install on Windows XP.", elementName, attributeName);
19 }
20
21 private static Message Message(SourceLineNumber sourceLineNumber, Ids id, string format, params object[] args)
22 {
23 return new Message(sourceLineNumber, MessageLevel.Warning, (int)id, format, args);
24 }
25
26 private static Message Message(SourceLineNumber sourceLineNumber, Ids id, ResourceManager resourceManager, string resourceName, params object[] args)
27 {
28 return new Message(sourceLineNumber, MessageLevel.Warning, (int)id, resourceManager, resourceName, args);
29 }
30
31 public enum Ids
32 {
33 DeprecatedPerfCounterElement = 5153,
34 RequiredAttributeForWindowsXP = 5154,
35 }
36 }
37}
diff --git a/src/ext/Util/wixext/UtilWindowsInstallerBackendExtension.cs b/src/ext/Util/wixext/UtilWindowsInstallerBackendExtension.cs
new file mode 100644
index 00000000..bca7c700
--- /dev/null
+++ b/src/ext/Util/wixext/UtilWindowsInstallerBackendExtension.cs
@@ -0,0 +1,13 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Util
4{
5 using System.Collections.Generic;
6 using WixToolset.Data.WindowsInstaller;
7 using WixToolset.Extensibility;
8
9 public class UtilWindowsInstallerBackendBinderExtension : BaseWindowsInstallerBackendBinderExtension
10 {
11 public override IReadOnlyCollection<TableDefinition> TableDefinitions => UtilTableDefinitions.All;
12 }
13}
diff --git a/src/ext/Util/wixext/WixToolset.Util.wixext.csproj b/src/ext/Util/wixext/WixToolset.Util.wixext.csproj
new file mode 100644
index 00000000..10fc569e
--- /dev/null
+++ b/src/ext/Util/wixext/WixToolset.Util.wixext.csproj
@@ -0,0 +1,31 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3
4<Project Sdk="Microsoft.NET.Sdk">
5 <PropertyGroup>
6 <TargetFramework>netstandard2.0</TargetFramework>
7 <RootNamespace>WixToolset.Util</RootNamespace>
8 <Description>WiX Toolset Utility Extension</Description>
9 <Title>WiX Toolset Util Extension</Title>
10 <DebugType>embedded</DebugType>
11 <IncludeSymbols>true</IncludeSymbols>
12 </PropertyGroup>
13
14 <ItemGroup>
15 <EmbeddedResource Include="$(OutputPath)..\util.wixlib" />
16 </ItemGroup>
17
18 <ItemGroup>
19 <ProjectReference Include="..\wixlib\util.wixproj" ReferenceOutputAssembly="false" Condition=" '$(NCrunch)'=='' " />
20 </ItemGroup>
21
22 <ItemGroup>
23 <PackageReference Include="WixToolset.Data" Version="4.0.*" />
24 <PackageReference Include="WixToolset.Extensibility" Version="4.0.*" />
25 </ItemGroup>
26
27 <ItemGroup>
28 <PackageReference Include="Microsoft.SourceLink.GitHub" Version="1.0.0" PrivateAssets="all" />
29 <PackageReference Include="Nerdbank.GitVersioning" Version="3.3.37" PrivateAssets="All" />
30 </ItemGroup>
31</Project>
diff --git a/src/ext/Util/wixext/WixToolset.Util.wixext.nuspec b/src/ext/Util/wixext/WixToolset.Util.wixext.nuspec
new file mode 100644
index 00000000..ba3eaade
--- /dev/null
+++ b/src/ext/Util/wixext/WixToolset.Util.wixext.nuspec
@@ -0,0 +1,25 @@
1<?xml version="1.0"?>
2<package xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd">
3 <metadata minClientVersion="4.0">
4 <id>$id$</id>
5 <version>$version$</version>
6 <title>$title$</title>
7 <description>$description$</description>
8 <authors>$authors$</authors>
9 <license type="expression">MS-RL</license>
10 <requireLicenseAcceptance>false</requireLicenseAcceptance>
11 <copyright>$copyright$</copyright>
12 <projectUrl>$projectUrl$</projectUrl>
13 <repository type="$repositorytype$" url="$repositoryurl$" commit="$repositorycommit$" />
14 </metadata>
15
16 <files>
17 <file src="$projectFolder$$id$.targets" target="build" />
18
19 <file src="netstandard2.0\$id$.dll" target="tools" />
20
21 <file src="ARM64\*.pdb" target="pdbs\ARM64" />
22 <file src="x86\*.pdb" target="pdbs\x86" />
23 <file src="x64\*.pdb" target="pdbs\x64" />
24 </files>
25</package>
diff --git a/src/ext/Util/wixext/WixToolset.Util.wixext.targets b/src/ext/Util/wixext/WixToolset.Util.wixext.targets
new file mode 100644
index 00000000..64dff429
--- /dev/null
+++ b/src/ext/Util/wixext/WixToolset.Util.wixext.targets
@@ -0,0 +1,11 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3
4<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0">
5 <PropertyGroup>
6 <WixToolsetUtilWixextPath Condition=" '$(WixToolsetUtilWixextPath)' == '' ">$(MSBuildThisFileDirectory)..\tools\WixToolset.Util.wixext.dll</WixToolsetUtilWixextPath>
7 </PropertyGroup>
8 <ItemGroup>
9 <WixExtension Include="$(WixToolsetUtilWixextPath)" />
10 </ItemGroup>
11</Project>
diff --git a/src/ext/Util/wixext/WixToolset.Util.wixext.v3.ncrunchproject b/src/ext/Util/wixext/WixToolset.Util.wixext.v3.ncrunchproject
new file mode 100644
index 00000000..d75e7ab3
--- /dev/null
+++ b/src/ext/Util/wixext/WixToolset.Util.wixext.v3.ncrunchproject
@@ -0,0 +1,7 @@
1<ProjectConfiguration>
2 <Settings>
3 <AdditionalFilesToIncludeForProject>
4 <Value>..\..\build\Debug\util.wixlib</Value>
5 </AdditionalFilesToIncludeForProject>
6 </Settings>
7</ProjectConfiguration> \ No newline at end of file
diff --git a/src/ext/Util/wixlib/UtilBundleExtension_Platform.wxi b/src/ext/Util/wixlib/UtilBundleExtension_Platform.wxi
new file mode 100644
index 00000000..379c8f57
--- /dev/null
+++ b/src/ext/Util/wixlib/UtilBundleExtension_Platform.wxi
@@ -0,0 +1,10 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2
3
4<Include xmlns="http://wixtoolset.org/schemas/v4/wxs">
5 <?include caDecor.wxi ?>
6
7 <Fragment>
8 <BundleExtension Id="$(var.Prefix)UtilBundleExtension$(var.Suffix)" SourceFile="!(bindpath.$(var.platform))utilbe.dll" Name="$(var.Prefix)UtilBundleExtension$(var.Suffix)\utilbe.dll" />
9 </Fragment>
10</Include>
diff --git a/src/ext/Util/wixlib/UtilBundleExtension_arm64.wxs b/src/ext/Util/wixlib/UtilBundleExtension_arm64.wxs
new file mode 100644
index 00000000..b17be031
--- /dev/null
+++ b/src/ext/Util/wixlib/UtilBundleExtension_arm64.wxs
@@ -0,0 +1,7 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2
3
4<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
5 <?define platform=arm64 ?>
6 <?include UtilBundleExtension_Platform.wxi ?>
7</Wix>
diff --git a/src/ext/Util/wixlib/UtilBundleExtension_x64.wxs b/src/ext/Util/wixlib/UtilBundleExtension_x64.wxs
new file mode 100644
index 00000000..96c85a5b
--- /dev/null
+++ b/src/ext/Util/wixlib/UtilBundleExtension_x64.wxs
@@ -0,0 +1,7 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2
3
4<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
5 <?define platform=x64 ?>
6 <?include UtilBundleExtension_Platform.wxi ?>
7</Wix>
diff --git a/src/ext/Util/wixlib/UtilBundleExtension_x86.wxs b/src/ext/Util/wixlib/UtilBundleExtension_x86.wxs
new file mode 100644
index 00000000..3b458687
--- /dev/null
+++ b/src/ext/Util/wixlib/UtilBundleExtension_x86.wxs
@@ -0,0 +1,7 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2
3
4<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
5 <?define platform=x86 ?>
6 <?include UtilBundleExtension_Platform.wxi ?>
7</Wix>
diff --git a/src/ext/Util/wixlib/UtilExtension.wxs b/src/ext/Util/wixlib/UtilExtension.wxs
new file mode 100644
index 00000000..0f445ab4
--- /dev/null
+++ b/src/ext/Util/wixlib/UtilExtension.wxs
@@ -0,0 +1,64 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2
3
4<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
5 <?include caDecor.wxi ?>
6 <?include caerr.wxi ?>
7
8 <Fragment>
9 <UI Id="ConfigureUsersErrorText">
10 <Error Id="$(var.msierrUSRFailedUserCreate)" Message="!(loc.msierrUSRFailedUserCreate)" />
11 <Error Id="$(var.msierrUSRFailedUserCreatePswd)" Message="!(loc.msierrUSRFailedUserCreatePswd)" />
12 <Error Id="$(var.msierrUSRFailedUserGroupAdd)" Message="!(loc.msierrUSRFailedUserGroupAdd)" />
13 <Error Id="$(var.msierrUSRFailedGrantLogonAsService)" Message="Failed to grant 'logon as service' rights to user. ([2] [3] [4] [5])" />
14 <Error Id="$(var.msierrUSRFailedUserCreateExists)" Message="!(loc.msierrUSRFailedUserCreateExists)" />
15 </UI>
16 </Fragment>
17
18 <Fragment>
19 <UI Id="ConfigureSmbErrorsText">
20 <Error Id="$(var.msierrSMBFailedCreate)" Message="!(loc.msierrSMBFailedCreate)" />
21 <Error Id="$(var.msierrSMBFailedDrop)" Message="!(loc.msierrSMBFailedDrop)" />
22 </UI>
23 </Fragment>
24
25 <Fragment>
26 <UI Id="PerCounterDataErrorsText">
27 <Error Id="$(var.msierrInstallPerfCounterData)" Message="!(loc.msierrInstallPerfCounterData)" />
28 <Error Id="$(var.msierrUninstallPerfCounterData)" Message="!(loc.msierrUninstallPerfCounterData)" />
29 </UI>
30 </Fragment>
31
32 <Fragment>
33 <UI Id="ConfigurePerfmonErrorsText">
34 <Error Id="$(var.msierrPERFMONFailedRegisterDLL)" Message="!(loc.msierrPERFMONFailedRegisterDLL)" />
35 <Error Id="$(var.msierrPERFMONFailedUnregisterDLL)" Message="!(loc.msierrPERFMONFailedUnregisterDLL)" />
36 </UI>
37 </Fragment>
38
39 <Fragment>
40 <UI Id="SecureObjectsErrors">
41 <Error Id="$(var.msierrSecureObjectsFailedCreateSD)" Message="!(loc.msierrSecureObjectsFailedCreateSD)" />
42 <Error Id="$(var.msierrSecureObjectsFailedSet)" Message="!(loc.msierrSecureObjectsFailedSet)" />
43 <Error Id="$(var.msierrSecureObjectsUnknownType)" Message="!(loc.msierrSecureObjectsUnknownType)" />
44 </UI>
45 </Fragment>
46
47 <Fragment>
48 <UI Id="XmlFileErrorsText">
49 <Error Id="$(var.msierrXmlFileFailedRead)" Message="!(loc.msierrXmlFileFailedRead)" />
50 <Error Id="$(var.msierrXmlFileFailedOpen)" Message="!(loc.msierrXmlFileFailedOpen)" />
51 <Error Id="$(var.msierrXmlFileFailedSelect)" Message="!(loc.msierrXmlFileFailedSelect)" />
52 <Error Id="$(var.msierrXmlFileFailedSave)" Message="!(loc.msierrXmlFileFailedSave)" />
53 </UI>
54 </Fragment>
55
56 <Fragment>
57 <UI Id="XmlConfigErrorsText">
58 <Error Id="$(var.msierrXmlConfigFailedRead)" Message="!(loc.msierrXmlConfigFailedRead)" />
59 <Error Id="$(var.msierrXmlConfigFailedOpen)" Message="!(loc.msierrXmlConfigFailedOpen)" />
60 <Error Id="$(var.msierrXmlConfigFailedSelect)" Message="!(loc.msierrXmlConfigFailedSelect)" />
61 <Error Id="$(var.msierrXmlConfigFailedSave)" Message="!(loc.msierrXmlConfigFailedSave)" />
62 </UI>
63 </Fragment>
64</Wix>
diff --git a/src/ext/Util/wixlib/UtilExtension_Platform.wxi b/src/ext/Util/wixlib/UtilExtension_Platform.wxi
new file mode 100644
index 00000000..913c01b9
--- /dev/null
+++ b/src/ext/Util/wixlib/UtilExtension_Platform.wxi
@@ -0,0 +1,360 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2
3
4<Include xmlns="http://wixtoolset.org/schemas/v4/wxs">
5 <?include caDecor.wxi ?>
6
7 <Fragment>
8 <CustomAction Id="$(var.Prefix)FailWhenDeferred$(var.Suffix)" DllEntry="WixFailWhenDeferred" Execute="deferred" Return="check" SuppressModularization="yes" BinaryRef="$(var.Prefix)UtilCA$(var.Suffix)" />
9
10 <InstallExecuteSequence>
11 <Custom Action="$(var.Prefix)FailWhenDeferred$(var.Suffix)" Before="InstallFinalize" Overridable="yes" Condition="WIXFAILWHENDEFERRED=1 AND VersionNT &gt; 400" />
12 </InstallExecuteSequence>
13 </Fragment>
14
15 <Fragment>
16 <CustomAction Id="$(var.Prefix)WaitForEvent$(var.Suffix)" DllEntry="WixWaitForEvent" Execute="immediate" Return="check" SuppressModularization="yes" BinaryRef="$(var.Prefix)UtilCA$(var.Suffix)" />
17
18 <InstallExecuteSequence>
19 <Custom Action="$(var.Prefix)WaitForEvent$(var.Suffix)" Before="InstallFinalize" Overridable="yes" />
20 </InstallExecuteSequence>
21 </Fragment>
22
23 <Fragment>
24 <CustomAction Id="$(var.Prefix)WaitForEventDeferred$(var.Suffix)" DllEntry="WixWaitForEvent" Execute="deferred" Return="check" SuppressModularization="yes" BinaryRef="$(var.Prefix)UtilCA$(var.Suffix)" />
25
26 <InstallExecuteSequence>
27 <Custom Action="$(var.Prefix)WaitForEventDeferred$(var.Suffix)" After="InstallInitialize" Overridable="yes" />
28 </InstallExecuteSequence>
29 </Fragment>
30
31 <Fragment>
32 <CustomAction Id="$(var.Prefix)ExitEarlyWithSuccess$(var.Suffix)" DllEntry="WixExitEarlyWithSuccess" Execute="immediate" Return="check" SuppressModularization="yes" BinaryRef="$(var.Prefix)UtilCA$(var.Suffix)" />
33
34 <InstallExecuteSequence>
35 <Custom Action="$(var.Prefix)ExitEarlyWithSuccess$(var.Suffix)" After="FindRelatedProducts" Overridable="yes" Condition="NEWERVERSIONDETECTED AND VersionNT &gt; 400" />
36 </InstallExecuteSequence>
37 </Fragment>
38
39 <Fragment>
40 <CustomAction Id="$(var.Prefix)RemoveFoldersEx$(var.Suffix)" DllEntry="WixRemoveFoldersEx" Execute="immediate" Return="ignore" BinaryRef="$(var.Prefix)UtilCA$(var.Suffix)" />
41
42 <InstallExecuteSequence>
43 <Custom Action="$(var.Prefix)RemoveFoldersEx$(var.Suffix)" Before="CostInitialize" />
44 </InstallExecuteSequence>
45 </Fragment>
46
47 <Fragment>
48 <CustomAction Id="$(var.Prefix)RemoveRegistryKeysEx$(var.Suffix)" DllEntry="WixRemoveRegistryKeysEx" Execute="immediate" Return="ignore" BinaryRef="$(var.Prefix)UtilCA$(var.Suffix)" />
49
50 <InstallExecuteSequence>
51 <Custom Action="$(var.Prefix)RemoveRegistryKeysEx$(var.Suffix)" Before="RemoveRegistryValues" />
52 </InstallExecuteSequence>
53 </Fragment>
54
55 <Fragment>
56 <CustomAction Id="$(var.Prefix)BroadcastSettingChange$(var.Suffix)" DllEntry="WixBroadcastSettingChange" Execute="immediate" Return="ignore" SuppressModularization="yes" BinaryRef="$(var.Prefix)UtilCA$(var.Suffix)" />
57
58 <InstallExecuteSequence>
59 <Custom Action="$(var.Prefix)BroadcastSettingChange$(var.Suffix)" After="InstallFinalize" Overridable="yes" />
60 </InstallExecuteSequence>
61 </Fragment>
62
63 <Fragment>
64 <CustomAction Id="$(var.Prefix)BroadcastEnvironmentChange$(var.Suffix)" DllEntry="WixBroadcastEnvironmentChange" Execute="immediate" Return="ignore" SuppressModularization="yes" BinaryRef="$(var.Prefix)UtilCA$(var.Suffix)" />
65
66 <InstallExecuteSequence>
67 <Custom Action="$(var.Prefix)BroadcastEnvironmentChange$(var.Suffix)" After="InstallFinalize" Overridable="yes" />
68 </InstallExecuteSequence>
69 </Fragment>
70
71 <!-- ShellExec custom actions (for when only one is needed; multiple executions need their own IDs) -->
72 <Fragment>
73 <PropertyRef Id="WixShellExecBinaryId" />
74 <CustomAction Id="$(var.Prefix)ShellExecBinary$(var.Suffix)" DllEntry="WixShellExecBinary" Execute="immediate" Return="check" Impersonate="yes" BinaryRef="$(var.Prefix)UtilCA$(var.Suffix)" />
75 </Fragment>
76
77 <Fragment>
78 <PropertyRef Id="WixShellExecTarget" />
79 <CustomAction Id="$(var.Prefix)ShellExec$(var.Suffix)" DllEntry="WixShellExec" Execute="immediate" Return="check" Impersonate="yes" BinaryRef="$(var.Prefix)UtilCA$(var.Suffix)" />
80 </Fragment>
81
82 <Fragment>
83 <PropertyRef Id="WixUnelevatedShellExecTarget" />
84 <CustomAction Id="$(var.Prefix)UnelevatedShellExec$(var.Suffix)" DllEntry="WixUnelevatedShellExec" Execute="immediate" Return="check" Impersonate="yes" BinaryRef="$(var.Prefix)UtilCA$(var.Suffix)" />
85 </Fragment>
86
87 <Fragment>
88 <PropertyRef Id="WixQuietExecCmdLine" />
89 <CustomAction Id="$(var.Prefix)QuietExec$(var.Suffix)" DllEntry="WixQuietExec" Execute="immediate" Return="check" Impersonate="yes" BinaryRef="$(var.Prefix)UtilCA$(var.Suffix)" />
90 </Fragment>
91
92 <Fragment>
93 <PropertyRef Id="WixQuietExec64CmdLine" />
94 <CustomAction Id="$(var.Prefix)QuietExec64$(var.Suffix)" DllEntry="WixQuietExec64" Execute="immediate" Return="check" Impersonate="yes" BinaryRef="$(var.Prefix)UtilCA$(var.Suffix)" />
95 </Fragment>
96
97 <!-- SilentExec custom actions differ from QtExec in that they do not log the commandline or output of the exe -->
98 <Fragment>
99 <PropertyRef Id="WixSilentExecCmdLine" />
100 <CustomAction Id="$(var.Prefix)SilentExec$(var.Suffix)" DllEntry="WixSilentExec" Execute="immediate" Return="check" Impersonate="yes" BinaryRef="$(var.Prefix)UtilCA$(var.Suffix)" />
101 </Fragment>
102
103 <Fragment>
104 <PropertyRef Id="WixSilentExec64CmdLine" />
105 <CustomAction Id="$(var.Prefix)SilentExec64$(var.Suffix)" DllEntry="WixSilentExec64" Execute="immediate" Return="check" Impersonate="yes" BinaryRef="$(var.Prefix)UtilCA$(var.Suffix)" />
106 </Fragment>
107
108 <Fragment>
109 <CustomAction Id="$(var.Prefix)CheckRebootRequired$(var.Suffix)" DllEntry="WixCheckRebootRequired" Execute="immediate" Return="ignore" SuppressModularization="yes" BinaryRef="$(var.Prefix)UtilCA$(var.Suffix)" />
110
111 <InstallExecuteSequence>
112 <!-- Condition this so it runs on install and MMode, but not uninstall -->
113 <Custom Action="$(var.Prefix)CheckRebootRequired$(var.Suffix)" After="InstallFinalize" Overridable="yes" Condition="NOT REMOVE~=&quot;ALL&quot; AND VersionNT &gt; 400" />
114 </InstallExecuteSequence>
115 </Fragment>
116
117 <Fragment>
118 <CustomAction Id="$(var.Prefix)CloseApplications$(var.Suffix)" DllEntry="WixCloseApplications" Execute="immediate" Return="check" SuppressModularization="yes" BinaryRef="$(var.Prefix)UtilCA$(var.Suffix)" />
119 <CustomAction Id="$(var.Prefix)CloseApplicationsDeferred$(var.Suffix)" DllEntry="WixCloseApplicationsDeferred" Impersonate="no" Execute="deferred" Return="check" SuppressModularization="yes" BinaryRef="$(var.Prefix)UtilCA$(var.Suffix)" />
120 <CustomActionRef Id="$(var.Prefix)CheckRebootRequired$(var.Suffix)" />
121
122 <InstallExecuteSequence>
123 <Custom Action="$(var.Prefix)CloseApplications$(var.Suffix)" Before="InstallFiles" Overridable="yes" Condition="VersionNT &gt; 400" />
124 </InstallExecuteSequence>
125 </Fragment>
126
127 <Fragment>
128 <CustomAction Id="$(var.Prefix)RegisterRestartResources$(var.Suffix)" DllEntry="WixRegisterRestartResources$(var.Suffix)" Execute="immediate" Return="check" SuppressModularization="yes" BinaryRef="$(var.Prefix)UtilCA$(var.Suffix)" />
129
130 <InstallExecuteSequence>
131 <Custom Action="$(var.Prefix)RegisterRestartResources$(var.Suffix)" Before="InstallValidate" Overridable="yes" />
132 </InstallExecuteSequence>
133 </Fragment>
134
135 <Fragment>
136 <UIRef Id="ConfigureUsersErrorText" />
137
138 <CustomAction Id="$(var.Prefix)ConfigureUsers$(var.Suffix)" DllEntry="ConfigureUsers" Execute="immediate" Return="check" SuppressModularization="yes" BinaryRef="$(var.Prefix)UtilCA$(var.Suffix)" />
139 <CustomAction Id="$(var.Prefix)CreateUser$(var.Suffix)" DllEntry="CreateUser" Impersonate="no" Execute="deferred" Return="check" HideTarget="yes" SuppressModularization="yes" BinaryRef="$(var.Prefix)UtilCA$(var.Suffix)" />
140 <CustomAction Id="$(var.Prefix)CreateUserRollback$(var.Suffix)" DllEntry="CreateUserRollback" Impersonate="no" Execute="rollback" Return="check" HideTarget="yes" SuppressModularization="yes" BinaryRef="$(var.Prefix)UtilCA$(var.Suffix)" />
141 <!-- RemoveUser is a type commit action because it is not possible to rollback the removal of a user -->
142 <CustomAction Id="$(var.Prefix)RemoveUser$(var.Suffix)" DllEntry="RemoveUser" Impersonate="no" Execute="commit" Return="ignore" HideTarget="yes" SuppressModularization="yes" BinaryRef="$(var.Prefix)UtilCA$(var.Suffix)" />
143
144 <InstallExecuteSequence>
145 <Custom Action="$(var.Prefix)ConfigureUsers$(var.Suffix)" Before="InstallFiles" Overridable="yes" Condition="VersionNT &gt; 400" />
146 </InstallExecuteSequence>
147 </Fragment>
148
149 <Fragment>
150 <UIRef Id="ConfigureSmbErrorsText" />
151
152 <CustomAction Id="$(var.Prefix)ConfigureSmbInstall$(var.Suffix)" DllEntry="ConfigureSmbInstall" Execute="immediate" Return="check" SuppressModularization="yes" BinaryRef="$(var.Prefix)UtilCA$(var.Suffix)" />
153 <CustomAction Id="$(var.Prefix)ConfigureSmbUninstall$(var.Suffix)" DllEntry="ConfigureSmbUninstall" Execute="immediate" Return="check" SuppressModularization="yes" BinaryRef="$(var.Prefix)UtilCA$(var.Suffix)" />
154 <CustomAction Id="$(var.Prefix)CreateSmb$(var.Suffix)" DllEntry="CreateSmb" Impersonate="no" Execute="deferred" Return="check" HideTarget="yes" SuppressModularization="yes" BinaryRef="$(var.Prefix)UtilCA$(var.Suffix)" />
155 <CustomAction Id="$(var.Prefix)CreateSmbRollback$(var.Suffix)" DllEntry="DropSmb" Impersonate="no" Execute="rollback" Return="ignore" HideTarget="yes" SuppressModularization="yes" BinaryRef="$(var.Prefix)UtilCA$(var.Suffix)" />
156 <CustomAction Id="$(var.Prefix)DropSmb$(var.Suffix)" DllEntry="DropSmb" Impersonate="no" Execute="deferred" Return="check" HideTarget="yes" SuppressModularization="yes" BinaryRef="$(var.Prefix)UtilCA$(var.Suffix)" />
157 <CustomAction Id="$(var.Prefix)DropSmbRollback$(var.Suffix)" DllEntry="CreateSmb" Impersonate="no" Execute="rollback" Return="ignore" HideTarget="yes" SuppressModularization="yes" BinaryRef="$(var.Prefix)UtilCA$(var.Suffix)" />
158
159 <InstallExecuteSequence>
160 <Custom Action="$(var.Prefix)ConfigureSmbInstall$(var.Suffix)" After="InstallFiles" Overridable="yes" Condition="VersionNT &gt; 400" />
161 <Custom Action="$(var.Prefix)ConfigureSmbUninstall$(var.Suffix)" After="RemoveFiles" Overridable="yes" Condition="VersionNT &gt; 400" />
162 </InstallExecuteSequence>
163 </Fragment>
164
165 <Fragment>
166 <UIRef Id="PerCounterDataErrorsText" />
167
168 <CustomAction Id="$(var.Prefix)InstallPerfCounterData$(var.Suffix)" DllEntry="InstallPerfCounterData" Execute="immediate" Return="check" SuppressModularization="yes" BinaryRef="$(var.Prefix)UtilCA$(var.Suffix)" />
169 <CustomAction Id="$(var.Prefix)UninstallPerfCounterData$(var.Suffix)" DllEntry="UninstallPerfCounterData" Execute="immediate" Return="check" SuppressModularization="yes" BinaryRef="$(var.Prefix)UtilCA$(var.Suffix)" />
170 <CustomAction Id="$(var.Prefix)RegisterPerfCounterData$(var.Suffix)" DllEntry="RegisterPerfCounterData" Impersonate="no" Execute="deferred" Return="check" HideTarget="yes" SuppressModularization="yes" BinaryRef="$(var.Prefix)UtilCA$(var.Suffix)" />
171 <CustomAction Id="$(var.Prefix)UnregisterPerfCounterData$(var.Suffix)" DllEntry="UnregisterPerfCounterData" Impersonate="no" Execute="deferred" Return="check" HideTarget="yes" SuppressModularization="yes" BinaryRef="$(var.Prefix)UtilCA$(var.Suffix)" />
172 <CustomAction Id="$(var.Prefix)RollbackRegisterPerfCounterData$(var.Suffix)" DllEntry="UnregisterPerfCounterData" Impersonate="no" Execute="rollback" Return="check" HideTarget="yes" SuppressModularization="yes" BinaryRef="$(var.Prefix)UtilCA$(var.Suffix)" />
173 <CustomAction Id="$(var.Prefix)RollbackUnregisterPerfCounterData$(var.Suffix)" DllEntry="RegisterPerfCounterData" Impersonate="no" Execute="rollback" Return="check" HideTarget="yes" SuppressModularization="yes" BinaryRef="$(var.Prefix)UtilCA$(var.Suffix)" />
174
175 <InstallExecuteSequence>
176 <Custom Action="$(var.Prefix)InstallPerfCounterData$(var.Suffix)" After="WriteRegistryValues" Overridable="yes" Condition="VersionNT &gt; 400" />
177 <Custom Action="$(var.Prefix)UninstallPerfCounterData$(var.Suffix)" Before="RemoveRegistryValues" Overridable="yes" Condition="VersionNT &gt; 400" />
178 </InstallExecuteSequence>
179 </Fragment>
180
181 <Fragment>
182 <UIRef Id="ConfigurePerfmonErrorsText" />
183
184 <CustomAction Id="$(var.Prefix)ConfigurePerfmonInstall$(var.Suffix)" DllEntry="ConfigurePerfmonInstall" Execute="immediate" Return="check" SuppressModularization="yes" BinaryRef="$(var.Prefix)UtilCA$(var.Suffix)" />
185 <CustomAction Id="$(var.Prefix)ConfigurePerfmonUninstall$(var.Suffix)" DllEntry="ConfigurePerfmonUninstall" Execute="immediate" Return="check" SuppressModularization="yes" BinaryRef="$(var.Prefix)UtilCA$(var.Suffix)" />
186 <CustomAction Id="$(var.Prefix)RegisterPerfmon$(var.Suffix)" DllEntry="RegisterPerfmon" Impersonate="no" Execute="deferred" Return="check" SuppressModularization="yes" BinaryRef="$(var.Prefix)UtilCA$(var.Suffix)" />
187 <CustomAction Id="$(var.Prefix)UnregisterPerfmon$(var.Suffix)" DllEntry="UnregisterPerfmon" Impersonate="no" Execute="deferred" Return="check" SuppressModularization="yes" BinaryRef="$(var.Prefix)UtilCA$(var.Suffix)" />
188 <CustomAction Id="$(var.Prefix)RollbackRegisterPerfmon$(var.Suffix)" DllEntry="UnregisterPerfmon" Impersonate="no" Execute="rollback" Return="check" SuppressModularization="yes" BinaryRef="$(var.Prefix)UtilCA$(var.Suffix)" />
189 <CustomAction Id="$(var.Prefix)RollbackUnregisterPerfmon$(var.Suffix)" DllEntry="RegisterPerfmon" Impersonate="no" Execute="rollback" Return="check" SuppressModularization="yes" BinaryRef="$(var.Prefix)UtilCA$(var.Suffix)" />
190
191 <InstallExecuteSequence>
192 <Custom Action="$(var.Prefix)ConfigurePerfmonInstall$(var.Suffix)" After="WriteRegistryValues" Overridable="yes" Condition="VersionNT &gt; 400" />
193 <Custom Action="$(var.Prefix)ConfigurePerfmonUninstall$(var.Suffix)" Before="RemoveRegistryValues" Overridable="yes" Condition="VersionNT &gt; 400" />
194 </InstallExecuteSequence>
195 </Fragment>
196
197 <Fragment>
198 <CustomAction Id="$(var.Prefix)ConfigurePerfmonManifestRegister$(var.Suffix)" DllEntry="ConfigurePerfmonManifestRegister" Execute="immediate" Return="check" SuppressModularization="yes" BinaryRef="$(var.Prefix)UtilCA$(var.Suffix)" />
199 <CustomAction Id="$(var.Prefix)ConfigurePerfmonManifestUnregister$(var.Suffix)" DllEntry="ConfigurePerfmonManifestUnregister" Execute="immediate" Return="check" SuppressModularization="yes" BinaryRef="$(var.Prefix)UtilCA$(var.Suffix)" />
200 <CustomAction Id="$(var.Prefix)RegisterPerfmonManifest$(var.Suffix)" DllEntry="WixQuietExec" Impersonate="no" Execute="deferred" Return="check" SuppressModularization="yes" BinaryRef="$(var.Prefix)UtilCA$(var.Suffix)" />
201 <CustomAction Id="$(var.Prefix)UnregisterPerfmonManifest$(var.Suffix)" DllEntry="WixQuietExec" Impersonate="no" Execute="deferred" Return="ignore" SuppressModularization="yes" BinaryRef="$(var.Prefix)UtilCA$(var.Suffix)" />
202 <CustomAction Id="$(var.Prefix)RollbackRegisterPerfmonManifest$(var.Suffix)" DllEntry="WixQuietExec" Impersonate="no" Execute="rollback" Return="ignore" SuppressModularization="yes" BinaryRef="$(var.Prefix)UtilCA$(var.Suffix)" />
203 <CustomAction Id="$(var.Prefix)RollbackUnregisterPerfmonManifest$(var.Suffix)" DllEntry="WixQuietExec" Impersonate="no" Execute="rollback" Return="check" SuppressModularization="yes" BinaryRef="$(var.Prefix)UtilCA$(var.Suffix)" />
204
205 <InstallExecuteSequence>
206 <Custom Action="$(var.Prefix)ConfigurePerfmonManifestRegister$(var.Suffix)" After="InstallFiles" Overridable="yes" Condition="VersionNT &gt; 400" />
207 <Custom Action="$(var.Prefix)ConfigurePerfmonManifestUnregister$(var.Suffix)" After="RemoveRegistryValues" Overridable="yes" Condition="VersionNT &gt; 400" />
208 </InstallExecuteSequence>
209 </Fragment>
210
211 <Fragment>
212 <CustomAction Id="$(var.Prefix)ConfigureEventManifestRegister$(var.Suffix)" DllEntry="ConfigureEventManifestRegister" Execute="immediate" Return="check" SuppressModularization="yes" BinaryRef="$(var.Prefix)UtilCA$(var.Suffix)" />
213 <CustomAction Id="$(var.Prefix)ConfigureEventManifestUnregister$(var.Suffix)" DllEntry="ConfigureEventManifestUnregister" Execute="immediate" Return="check" SuppressModularization="yes" BinaryRef="$(var.Prefix)UtilCA$(var.Suffix)" />
214 <CustomAction Id="$(var.Prefix)RegisterEventManifest$(var.Suffix)" DllEntry="WixQuietExec" Impersonate="no" Execute="deferred" Return="check" SuppressModularization="yes" BinaryRef="$(var.Prefix)UtilCA$(var.Suffix)" />
215 <CustomAction Id="$(var.Prefix)UnregisterEventManifest$(var.Suffix)" DllEntry="WixQuietExec" Impersonate="no" Execute="deferred" Return="ignore" SuppressModularization="yes" BinaryRef="$(var.Prefix)UtilCA$(var.Suffix)" />
216 <CustomAction Id="$(var.Prefix)RollbackRegisterEventManifest$(var.Suffix)" DllEntry="WixQuietExec" Impersonate="no" Execute="rollback" Return="ignore" SuppressModularization="yes" BinaryRef="$(var.Prefix)UtilCA$(var.Suffix)" />
217 <CustomAction Id="$(var.Prefix)RollbackUnregisterEventManifest$(var.Suffix)" DllEntry="WixQuietExec" Impersonate="no" Execute="rollback" Return="check" SuppressModularization="yes" BinaryRef="$(var.Prefix)UtilCA$(var.Suffix)" />
218
219 <InstallExecuteSequence>
220 <Custom Action="$(var.Prefix)ConfigureEventManifestRegister$(var.Suffix)" After="$(var.Prefix)SchedXmlFile$(var.Suffix)" Overridable="yes" Condition="VersionNT &gt; 400" />
221 <Custom Action="$(var.Prefix)ConfigureEventManifestUnregister$(var.Suffix)" After="RemoveRegistryValues" Overridable="yes" Condition="VersionNT &gt; 400" />
222 </InstallExecuteSequence>
223 </Fragment>
224
225 <Fragment>
226 <CustomAction Id="$(var.Prefix)SchedServiceConfig$(var.Suffix)" DllEntry="SchedServiceConfig" Execute="immediate" Return="check" SuppressModularization="yes" BinaryRef="$(var.Prefix)UtilCA$(var.Suffix)" />
227 <CustomAction Id="$(var.Prefix)ExecServiceConfig$(var.Suffix)" DllEntry="ExecServiceConfig" Execute="deferred" Impersonate="no" Return="check" SuppressModularization="yes" BinaryRef="$(var.Prefix)UtilCA$(var.Suffix)" />
228 <CustomAction Id="$(var.Prefix)RollbackServiceConfig$(var.Suffix)" DllEntry="RollbackServiceConfig" Execute="rollback" Impersonate="no" Return="check" SuppressModularization="yes" BinaryRef="$(var.Prefix)UtilCA$(var.Suffix)" />
229
230 <InstallExecuteSequence>
231 <!-- Condition this so it runs on install and MMode, but not uninstall -->
232 <Custom Action="$(var.Prefix)SchedServiceConfig$(var.Suffix)" After="InstallServices" Overridable="yes" Condition="NOT REMOVE~=&quot;ALL&quot; AND VersionNT &gt; 400" />
233 </InstallExecuteSequence>
234 </Fragment>
235
236 <Fragment>
237 <CustomAction Id="$(var.Prefix)TouchFileDuringInstall$(var.Suffix)" DllEntry="WixTouchFileDuringInstall" Execute="immediate" Return="check" SuppressModularization="yes" BinaryRef="$(var.Prefix)UtilCA$(var.Suffix)" />
238 <CustomAction Id="$(var.Prefix)TouchFileDuringUninstall$(var.Suffix)" DllEntry="WixTouchFileDuringUninstall" Execute="immediate" Return="check" SuppressModularization="yes" BinaryRef="$(var.Prefix)UtilCA$(var.Suffix)" />
239 <CustomAction Id="$(var.Prefix)ExecuteTouchFile$(var.Suffix)" DllEntry="WixExecuteTouchFile" Execute="deferred" Impersonate="no" Return="check" SuppressModularization="yes" BinaryRef="$(var.Prefix)UtilCA$(var.Suffix)" />
240 <CustomAction Id="$(var.Prefix)RollbackTouchFile$(var.Suffix)" DllEntry="WixExecuteTouchFile" Execute="rollback" Impersonate="no" Return="check" SuppressModularization="yes" BinaryRef="$(var.Prefix)UtilCA$(var.Suffix)" />
241
242 <InstallExecuteSequence>
243 <Custom Action="$(var.Prefix)TouchFileDuringUninstall" Before="RemoveFiles" Overridable="yes" />
244 <Custom Action="$(var.Prefix)TouchFileDuringInstall" After="InstallFiles" Overridable="yes" />
245 </InstallExecuteSequence>
246 </Fragment>
247
248 <Fragment>
249 <UIRef Id="XmlFileErrorsText" />
250
251 <CustomAction Id="$(var.Prefix)SchedXmlFile$(var.Suffix)" DllEntry="SchedXmlFile" Execute="immediate" Return="check" SuppressModularization="yes" BinaryRef="$(var.Prefix)UtilCA$(var.Suffix)" />
252 <CustomAction Id="$(var.Prefix)ExecXmlFile$(var.Suffix)" DllEntry="ExecXmlFile" Execute="deferred" Impersonate="no" Return="check" HideTarget="yes" SuppressModularization="yes" BinaryRef="$(var.Prefix)UtilCA$(var.Suffix)" />
253 <CustomAction Id="$(var.Prefix)ExecXmlFileRollback$(var.Suffix)" DllEntry="ExecXmlFileRollback" Execute="rollback" Impersonate="no" Return="check" HideTarget="yes" SuppressModularization="yes" BinaryRef="$(var.Prefix)UtilCA$(var.Suffix)" />
254
255 <InstallExecuteSequence>
256 <Custom Action="$(var.Prefix)SchedXmlFile$(var.Suffix)" After="DuplicateFiles" Overridable="yes" Condition="VersionNT &gt; 400" />
257 </InstallExecuteSequence>
258 </Fragment>
259
260 <Fragment>
261 <UIRef Id="XmlConfigErrorsText" />
262
263 <CustomAction Id="$(var.Prefix)SchedXmlConfig$(var.Suffix)" DllEntry="SchedXmlConfig" Execute="immediate" Return="check" SuppressModularization="yes" BinaryRef="$(var.Prefix)UtilCA$(var.Suffix)" />
264 <CustomAction Id="$(var.Prefix)ExecXmlConfig$(var.Suffix)" DllEntry="ExecXmlConfig" Execute="deferred" Impersonate="no" Return="check" HideTarget="yes" SuppressModularization="yes" BinaryRef="$(var.Prefix)UtilCA$(var.Suffix)" />
265 <CustomAction Id="$(var.Prefix)ExecXmlConfigRollback$(var.Suffix)" DllEntry="ExecXmlConfigRollback" Execute="rollback" Impersonate="no" Return="check" HideTarget="yes" SuppressModularization="yes" BinaryRef="$(var.Prefix)UtilCA$(var.Suffix)" />
266
267 <InstallExecuteSequence>
268 <Custom Action="$(var.Prefix)SchedXmlConfig$(var.Suffix)" After="DuplicateFiles" Overridable="yes" Condition="VersionNT &gt; 400" />
269 </InstallExecuteSequence>
270 </Fragment>
271
272 <Fragment>
273 <CustomAction Id="$(var.Prefix)SchedInternetShortcuts$(var.Suffix)" DllEntry="WixSchedInternetShortcuts" Execute="immediate" Return="check" SuppressModularization="yes" BinaryRef="$(var.Prefix)UtilCA$(var.Suffix)" />
274 <CustomAction Id="$(var.Prefix)RollbackInternetShortcuts$(var.Suffix)" DllEntry="WixRollbackInternetShortcuts" Impersonate="no" Execute="rollback" Return="check" SuppressModularization="yes" BinaryRef="$(var.Prefix)UtilCA$(var.Suffix)" />
275 <CustomAction Id="$(var.Prefix)CreateInternetShortcuts$(var.Suffix)" DllEntry="WixCreateInternetShortcuts" Impersonate="no" Execute="deferred" Return="check" SuppressModularization="yes" BinaryRef="$(var.Prefix)UtilCA$(var.Suffix)" />
276
277 <InstallExecuteSequence>
278 <Custom Action="$(var.Prefix)SchedInternetShortcuts$(var.Suffix)" Before="RemoveFolders" Overridable="yes" Condition="VersionNT &gt; 400" />
279 <Custom Action="$(var.Prefix)RollbackInternetShortcuts$(var.Suffix)" Before="$(var.Prefix)CreateInternetShortcuts$(var.Suffix)" Overridable="yes" Condition="VersionNT &gt; 400" />
280 <Custom Action="$(var.Prefix)CreateInternetShortcuts$(var.Suffix)" After="CreateShortcuts" Overridable="yes" Condition="VersionNT &gt; 400" />
281 </InstallExecuteSequence>
282 </Fragment>
283
284 <Fragment>
285 <UIRef Id="SecureObjectsErrors" />
286
287 <CustomAction Id="$(var.Prefix)SchedSecureObjects$(var.Suffix)" DllEntry="SchedSecureObjects" Execute="immediate" Return="check" SuppressModularization="yes" BinaryRef="$(var.Prefix)UtilCA$(var.Suffix)" />
288 <CustomAction Id="$(var.Prefix)SchedSecureObjectsRollback$(var.Suffix)" DllEntry="SchedSecureObjectsRollback" Execute="immediate" Return="check" SuppressModularization="yes" BinaryRef="$(var.Prefix)UtilCA$(var.Suffix)" />
289 <CustomAction Id="$(var.Prefix)ExecSecureObjects$(var.Suffix)" DllEntry="ExecSecureObjects" Execute="deferred" Impersonate="no" Return="check" HideTarget="yes" SuppressModularization="yes" BinaryRef="$(var.Prefix)UtilCA$(var.Suffix)" />
290 <CustomAction Id="$(var.Prefix)ExecSecureObjectsRollback$(var.Suffix)" DllEntry="ExecSecureObjectsRollback" Execute="rollback" Impersonate="no" Return="check" HideTarget="yes" SuppressModularization="yes" BinaryRef="$(var.Prefix)UtilCA$(var.Suffix)" />
291
292 <InstallExecuteSequence>
293 <!-- Condition this so it runs on install and MMode, but not uninstall -->
294 <Custom Action="$(var.Prefix)SchedSecureObjects$(var.Suffix)" After="InstallServices" Overridable="yes" Condition="NOT REMOVE~=&quot;ALL&quot; AND VersionNT &gt; 400" />
295 <Custom Action="$(var.Prefix)SchedSecureObjectsRollback$(var.Suffix)" After="UnpublishFeatures" Overridable="yes" Condition="VersionNT &gt; 400" />
296 </InstallExecuteSequence>
297 </Fragment>
298
299 <Fragment>
300 <CustomAction Id="$(var.Prefix)SchedFormatFiles$(var.Suffix)" DllEntry="WixSchedFormatFiles" Execute="immediate" Return="check" SuppressModularization="yes" BinaryRef="$(var.Prefix)UtilCA$(var.Suffix)" />
301 <CustomAction Id="$(var.Prefix)ExecFormatFiles$(var.Suffix)" DllEntry="WixExecFormatFiles" Execute="deferred" Impersonate="no" Return="check" SuppressModularization="yes" BinaryRef="$(var.Prefix)UtilCA$(var.Suffix)" />
302 <CustomAction Id="$(var.Prefix)RollbackFormatFiles$(var.Suffix)" DllEntry="WixExecFormatFiles" Execute="rollback" Impersonate="no" Return="check" SuppressModularization="yes" BinaryRef="$(var.Prefix)UtilCA$(var.Suffix)" />
303
304 <InstallExecuteSequence>
305 <Custom Action="$(var.Prefix)SchedFormatFiles$(var.Suffix)" After="InstallFiles" />
306 </InstallExecuteSequence>
307 </Fragment>
308
309 <Fragment>
310 <CustomAction Id="$(var.Prefix)QueryOsInfo$(var.Suffix)" DllEntry="WixQueryOsInfo" Execute="firstSequence" Return="check" SuppressModularization="yes" BinaryRef="$(var.Prefix)UtilCA$(var.Suffix)" />
311
312 <InstallExecuteSequence>
313 <Custom Action="$(var.Prefix)QueryOsInfo$(var.Suffix)" After="AppSearch" Overridable="yes" Condition="VersionNT &gt; 400 OR (VersionNT = 400 AND ServicePackLevel &gt; 3)" />
314 </InstallExecuteSequence>
315
316 <InstallUISequence>
317 <Custom Action="$(var.Prefix)QueryOsInfo$(var.Suffix)" After="AppSearch" Overridable="yes" Condition="VersionNT &gt; 400 OR (VersionNT = 400 AND ServicePackLevel &gt; 3)" />
318 </InstallUISequence>
319 </Fragment>
320
321 <Fragment>
322 <CustomAction Id="$(var.Prefix)QueryOsDirs$(var.Suffix)" DllEntry="WixQueryOsDirs" Execute="firstSequence" Return="check" SuppressModularization="yes" BinaryRef="$(var.Prefix)UtilCA$(var.Suffix)" />
323
324 <InstallExecuteSequence>
325 <Custom Action="$(var.Prefix)QueryOsDirs$(var.Suffix)" After="AppSearch" Overridable="yes" Condition="VersionNT &gt; 400 OR (VersionNT = 400 AND ServicePackLevel &gt; 3)" />
326 </InstallExecuteSequence>
327
328 <InstallUISequence>
329 <Custom Action="$(var.Prefix)QueryOsDirs$(var.Suffix)" After="AppSearch" Overridable="yes" Condition="VersionNT &gt; 400 OR (VersionNT = 400 AND ServicePackLevel &gt; 3)" />
330 </InstallUISequence>
331 </Fragment>
332
333 <Fragment>
334 <CustomAction Id="$(var.Prefix)QueryOsWellKnownSID$(var.Suffix)" DllEntry="WixQueryOsWellKnownSID" Execute="firstSequence" Return="check" SuppressModularization="yes" BinaryRef="$(var.Prefix)UtilCA$(var.Suffix)" />
335
336 <InstallExecuteSequence>
337 <Custom Action="$(var.Prefix)QueryOsWellKnownSID$(var.Suffix)" After="AppSearch" Overridable="yes" Condition="VersionNT &gt; 400 OR (VersionNT = 400 AND ServicePackLevel &gt; 3)" />
338 </InstallExecuteSequence>
339
340 <InstallUISequence>
341 <Custom Action="$(var.Prefix)QueryOsWellKnownSID$(var.Suffix)" After="AppSearch" Overridable="yes" Condition="VersionNT &gt; 400 OR (VersionNT = 400 AND ServicePackLevel &gt; 3)" />
342 </InstallUISequence>
343 </Fragment>
344
345 <Fragment>
346 <CustomAction Id="$(var.Prefix)QueryOsDriverInfo$(var.Suffix)" DllEntry="WixQueryOsDriverInfo" Execute="firstSequence" Return="check" SuppressModularization="yes" BinaryRef="$(var.Prefix)UtilCA$(var.Suffix)" />
347
348 <InstallExecuteSequence>
349 <Custom Action="$(var.Prefix)QueryOsDriverInfo$(var.Suffix)" After="AppSearch" Overridable="yes" Condition="VersionNT &gt; 400 OR (VersionNT = 400 AND ServicePackLevel &gt; 3)" />
350 </InstallExecuteSequence>
351
352 <InstallUISequence>
353 <Custom Action="$(var.Prefix)QueryOsDriverInfo$(var.Suffix)" After="AppSearch" Overridable="yes" Condition="VersionNT &gt; 400 OR (VersionNT = 400 AND ServicePackLevel &gt; 3)" />
354 </InstallUISequence>
355 </Fragment>
356
357 <Fragment>
358 <Binary Id="$(var.Prefix)UtilCA$(var.Suffix)" SourceFile="!(bindpath.$(var.platform))utilca.dll" />
359 </Fragment>
360</Include>
diff --git a/src/ext/Util/wixlib/UtilExtension_arm64.wxs b/src/ext/Util/wixlib/UtilExtension_arm64.wxs
new file mode 100644
index 00000000..b9dc73b8
--- /dev/null
+++ b/src/ext/Util/wixlib/UtilExtension_arm64.wxs
@@ -0,0 +1,7 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2
3
4<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
5 <?define platform=arm64 ?>
6 <?include UtilExtension_Platform.wxi ?>
7</Wix>
diff --git a/src/ext/Util/wixlib/UtilExtension_x64.wxs b/src/ext/Util/wixlib/UtilExtension_x64.wxs
new file mode 100644
index 00000000..40cdf306
--- /dev/null
+++ b/src/ext/Util/wixlib/UtilExtension_x64.wxs
@@ -0,0 +1,7 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2
3
4<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
5 <?define platform=x64 ?>
6 <?include UtilExtension_Platform.wxi ?>
7</Wix>
diff --git a/src/ext/Util/wixlib/UtilExtension_x86.wxs b/src/ext/Util/wixlib/UtilExtension_x86.wxs
new file mode 100644
index 00000000..bd0fa562
--- /dev/null
+++ b/src/ext/Util/wixlib/UtilExtension_x86.wxs
@@ -0,0 +1,7 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2
3
4<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
5 <?define platform=x86 ?>
6 <?include UtilExtension_Platform.wxi ?>
7</Wix>
diff --git a/src/ext/Util/wixlib/caDecor.wxi b/src/ext/Util/wixlib/caDecor.wxi
new file mode 100644
index 00000000..b1711518
--- /dev/null
+++ b/src/ext/Util/wixlib/caDecor.wxi
@@ -0,0 +1,39 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2
3
4<Include xmlns="http://wixtoolset.org/schemas/v4/wxs">
5 <?ifdef Prefix ?>
6 <?undef Prefix ?>
7 <?endif?>
8
9 <?define Prefix="Wix4" ?>
10
11 <?ifndef platform ?>
12 <?define platform="x86" ?>
13 <?endif?>
14
15 <?if $(var.platform)="" ?>
16 <?undef platform ?>
17 <?define platform="x86" ?>
18 <?endif?>
19
20 <?ifdef Suffix ?>
21 <?undef Suffix ?>
22 <?endif?>
23
24 <?if $(var.platform)~="x86" ?>
25 <?define Suffix="_X86" ?>
26 <?endif?>
27
28 <?if $(var.platform)~="x64" ?>
29 <?define Suffix="_X64" ?>
30 <?endif?>
31
32 <?if $(var.platform)~="arm" ?>
33 <?define Suffix="_A32" ?>
34 <?endif?>
35
36 <?if $(var.platform)~="arm64" ?>
37 <?define Suffix="_A64" ?>
38 <?endif?>
39</Include>
diff --git a/src/ext/Util/wixlib/caerr.wxi b/src/ext/Util/wixlib/caerr.wxi
new file mode 100644
index 00000000..ff7ec121
--- /dev/null
+++ b/src/ext/Util/wixlib/caerr.wxi
@@ -0,0 +1,96 @@
1<Include xmlns="http://wixtoolset.org/schemas/v4/wxs">
2 <?define msierrSecureObjectsFailedCreateSD = 25520?>
3 <?define msierrSecureObjectsFailedSet = 25521?>
4 <?define msierrSecureObjectsUnknownType = 25522?>
5 <?define msierrXmlFileFailedRead = 25530?>
6 <?define msierrXmlFileFailedOpen = 25531?>
7 <?define msierrXmlFileFailedSelect = 25532?>
8 <?define msierrXmlFileFailedSave = 25533?>
9 <?define msierrXmlConfigFailedRead = 25540?>
10 <?define msierrXmlConfigFailedOpen = 25541?>
11 <?define msierrXmlConfigFailedSelect = 25542?>
12 <?define msierrXmlConfigFailedSave = 25543?>
13 <?define msierrFirewallCannotConnect = 25580?>
14 <?define msierrIISCannotConnect = 26001?>
15 <?define msierrIISFailedReadWebSite = 26002?>
16 <?define msierrIISFailedReadWebDirs = 26003?>
17 <?define msierrIISFailedReadVDirs = 26004?>
18 <?define msierrIISFailedReadFilters = 26005?>
19 <?define msierrIISFailedReadAppPool = 26006?>
20 <?define msierrIISFailedReadMimeMap = 26007?>
21 <?define msierrIISFailedReadProp = 26008?>
22 <?define msierrIISFailedReadWebSvcExt = 26009?>
23 <?define msierrIISFailedReadWebError = 26010?>
24 <?define msierrIISFailedReadHttpHeader = 26011?>
25 <?define msierrIISFailedSchedTransaction = 26031?>
26 <?define msierrIISFailedSchedInstallWebs = 26032?>
27 <?define msierrIISFailedSchedInstallWebDirs = 26033?>
28 <?define msierrIISFailedSchedInstallVDirs = 26034?>
29 <?define msierrIISFailedSchedInstallFilters = 26035?>
30 <?define msierrIISFailedSchedInstallAppPool = 26036?>
31 <?define msierrIISFailedSchedInstallProp = 26037?>
32 <?define msierrIISFailedSchedInstallWebSvcExt = 26038?>
33 <?define msierrIISFailedSchedUninstallWebs = 26051?>
34 <?define msierrIISFailedSchedUninstallWebDirs = 26052?>
35 <?define msierrIISFailedSchedUninstallVDirs = 26053?>
36 <?define msierrIISFailedSchedUninstallFilters = 26054?>
37 <?define msierrIISFailedSchedUninstallAppPool = 26055?>
38 <?define msierrIISFailedSchedUninstallProp = 26056?>
39 <?define msierrIISFailedSchedUninstallWebSvcExt = 26057?>
40 <?define msierrIISFailedStartTransaction = 26101?>
41 <?define msierrIISFailedOpenKey = 26102?>
42 <?define msierrIISFailedCreateKey = 26103?>
43 <?define msierrIISFailedWriteData = 26104?>
44 <?define msierrIISFailedCreateApp = 26105?>
45 <?define msierrIISFailedDeleteKey = 26106?>
46 <?define msierrIISFailedDeleteApp = 26107?>
47 <?define msierrIISFailedDeleteValue = 26108?>
48 <?define msierrIISFailedCommitInUse = 26109?>
49 <?define msierrSQLFailedCreateDatabase = 26201?>
50 <?define msierrSQLFailedDropDatabase = 26202?>
51 <?define msierrSQLFailedConnectDatabase = 26203?>
52 <?define msierrSQLFailedExecString = 26204?>
53 <?define msierrSQLDatabaseAlreadyExists = 26205?>
54 <?define msierrPERFMONFailedRegisterDLL = 26251?>
55 <?define msierrPERFMONFailedUnregisterDLL = 26252?>
56 <?define msierrInstallPerfCounterData = 26253?>
57 <?define msierrUninstallPerfCounterData = 26254?>
58 <?define msierrSMBFailedCreate = 26301?>
59 <?define msierrSMBFailedDrop = 26302?>
60 <?define msierrCERTFailedOpen = 26351?>
61 <?define msierrCERTFailedAdd = 26352?>
62 <?define msierrUSRFailedUserCreate = 26401?>
63 <?define msierrUSRFailedUserCreatePswd = 26402?>
64 <?define msierrUSRFailedUserGroupAdd = 26403?>
65 <?define msierrUSRFailedUserCreateExists = 26404?>
66 <?define msierrUSRFailedGrantLogonAsService = 26405?>
67 <?define msierrDependencyMissingDependencies = 26451?>
68 <?define msierrDependencyHasDependents = 26452?>
69 <?define msierrDotNetRuntimeRequired = 27000?>
70 <?define msierrComPlusCannotConnect = 28001?>
71 <?define msierrComPlusPartitionReadFailed = 28002?>
72 <?define msierrComPlusPartitionRoleReadFailed = 28003?>
73 <?define msierrComPlusUserInPartitionRoleReadFailed = 28004?>
74 <?define msierrComPlusPartitionUserReadFailed = 28005?>
75 <?define msierrComPlusApplicationReadFailed = 28006?>
76 <?define msierrComPlusApplicationRoleReadFailed = 28007?>
77 <?define msierrComPlusUserInApplicationRoleReadFailed = 28008?>
78 <?define msierrComPlusAssembliesReadFailed = 28009?>
79 <?define msierrComPlusSubscriptionReadFailed = 28010?>
80 <?define msierrComPlusPartitionDependency = 28011?>
81 <?define msierrComPlusPartitionNotFound = 28012?>
82 <?define msierrComPlusPartitionIdConflict = 28013?>
83 <?define msierrComPlusPartitionNameConflict = 28014?>
84 <?define msierrComPlusApplicationDependency = 28015?>
85 <?define msierrComPlusApplicationNotFound = 28016?>
86 <?define msierrComPlusApplicationIdConflict = 28017?>
87 <?define msierrComPlusApplicationNameConflict = 28018?>
88 <?define msierrComPlusApplicationRoleDependency = 28019?>
89 <?define msierrComPlusApplicationRoleNotFound = 28020?>
90 <?define msierrComPlusApplicationRoleConflict = 28021?>
91 <?define msierrComPlusAssemblyDependency = 28022?>
92 <?define msierrComPlusSubscriptionIdConflict = 28023?>
93 <?define msierrComPlusSubscriptionNameConflict = 28024?>
94 <?define msierrComPlusFailedLookupNames = 28025?>
95 <?define msierrMsmqCannotConnect = 28101?>
96</Include> \ No newline at end of file
diff --git a/src/ext/Util/wixlib/de-de.wxl b/src/ext/Util/wixlib/de-de.wxl
new file mode 100644
index 00000000..65785a3b
--- /dev/null
+++ b/src/ext/Util/wixlib/de-de.wxl
@@ -0,0 +1,32 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2
3
4<WixLocalization Culture="de-de" xmlns="http://wixtoolset.org/schemas/v4/wxl">
5 <String Id="msierrUSRFailedUserCreate" Overridable="yes">Konnte den Benutzer nicht anlegen. ([2] [3] [4] [5])</String>
6 <String Id="msierrUSRFailedUserCreatePswd" Overridable="yes">Konnte den Benutzer auf Grund eines falschen Passwortes nicht anlegen. ([2] [3] [4] [5])</String>
7 <String Id="msierrUSRFailedUserGroupAdd" Overridable="yes">Konnte Benutzer nicht zur Gruppe hinzufügen. ([2] [3] [4] [5])</String>
8 <String Id="msierrUSRFailedUserCreateExists" Overridable="yes">Konnte den Benutzer nicht anlegen, da er bereits existierte. ([2] [3] [4] [5])</String>
9
10 <String Id="msierrSMBFailedCreate" Overridable="yes">Konnte Netzwerkfreigabe nicht anlegen. ([2] [3] [4] [5])</String>
11 <String Id="msierrSMBFailedDrop" Overridable="yes">Konnte Netzwerkfreigabe nicht entfernen. ([2] [3] [4] [5])</String>
12
13 <String Id="msierrPERFMONFailedRegisterDLL" Overridable="yes">Konnte die DLL nicht für PerfMon registrieren. ([2] [3] [4] [5])</String>
14 <String Id="msierrPERFMONFailedUnregisterDLL" Overridable="yes">Konnte die DLL nicht für PerfMon deregistrieren. ([2] [3] [4] [5])</String>
15
16 <String Id="msierrInstallPerfCounterData" Overridable="yes">Konnte die Daten der Leistungsüberwachung (performance counters) nicht installieren. ([2] [3] [4] [5])</String>
17 <String Id="msierrUninstallPerfCounterData" Overridable="yes">Konnte die Daten der Leistungsüberwachung (performance counters) nicht deinstallieren. ([2] [3] [4] [5])</String>
18
19 <String Id="msierrSecureObjectsFailedCreateSD" Overridable="yes">Konnte keinen Security Descriptor für [3]\[4] erstellen, System Fehler: [2]</String>
20 <String Id="msierrSecureObjectsFailedSet" Overridable="yes">Konnte keinen Security Descriptor für das Objekt [3] erstellen, System Fehler: [2]</String>
21 <String Id="msierrSecureObjectsUnknownType" Overridable="yes">Unbekannter Objekt Typ [3], System Fehler: [2]</String>
22
23 <String Id="msierrXmlFileFailedRead" Overridable="yes">Beim Lesen der XML Dateien trat ein Fehler auf.</String>
24 <String Id="msierrXmlFileFailedOpen" Overridable="yes">Konnte XML Datei [3] nicht öffnen, System Fehler: [2]</String>
25 <String Id="msierrXmlFileFailedSelect" Overridable="yes">Konnte Knoten [3] in der XML Datei [4] nicht finden, System Fehler: [2]</String>
26 <String Id="msierrXmlFileFailedSave" Overridable="yes">Beim Speichern der Änderungen an der XML Datei [3] trat ein Fehler auf, System Fehler: [2]</String>
27
28 <String Id="msierrXmlConfigFailedRead" Overridable="yes">Bei der Konfiguration der XML Dateien trat ein Fehler auf.</String>
29 <String Id="msierrXmlConfigFailedOpen" Overridable="yes">Konnte XML Datei [3] nicht öffnen, System Fehler: [2]</String>
30 <String Id="msierrXmlConfigFailedSelect" Overridable="yes">Konnte Knoten [3] in der XML Datei [4] nicht finden, System Fehler: [2]</String>
31 <String Id="msierrXmlConfigFailedSave" Overridable="yes">Beim Speichern der Änderungen an der XML Datei [3] trat ein Fehler auf, System Fehler: [2]</String>
32</WixLocalization>
diff --git a/src/ext/Util/wixlib/en-us.wxl b/src/ext/Util/wixlib/en-us.wxl
new file mode 100644
index 00000000..e8b146a4
--- /dev/null
+++ b/src/ext/Util/wixlib/en-us.wxl
@@ -0,0 +1,32 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2
3
4<WixLocalization Culture="en-us" xmlns="http://wixtoolset.org/schemas/v4/wxl">
5 <String Id="msierrUSRFailedUserCreate" Overridable="yes">Failed to create user. ([2] [3] [4] [5])</String>
6 <String Id="msierrUSRFailedUserCreatePswd" Overridable="yes">Failed to create user due to invalid password. ([2] [3] [4] [5])</String>
7 <String Id="msierrUSRFailedUserGroupAdd" Overridable="yes">Failed to add user to group. ([2] [3] [4] [5])</String>
8 <String Id="msierrUSRFailedUserCreateExists" Overridable="yes">Failed to create user because it already exists. ([2] [3] [4] [5])</String>
9
10 <String Id="msierrSMBFailedCreate" Overridable="yes">Failed to create network share. ([2] [3] [4] [5])</String>
11 <String Id="msierrSMBFailedDrop" Overridable="yes">Failed to drop network share. ([2] [3] [4] [5])</String>
12
13 <String Id="msierrPERFMONFailedRegisterDLL" Overridable="yes">Failed to register DLL with PerfMon. ([2] [3] [4] [5])</String>
14 <String Id="msierrPERFMONFailedUnregisterDLL" Overridable="yes">Failed to unregister DLL with PerfMon. ([2] [3] [4] [5])</String>
15
16 <String Id="msierrInstallPerfCounterData" Overridable="yes">Failed to install performance counters. ([2] [3] [4] [5])</String>
17 <String Id="msierrUninstallPerfCounterData" Overridable="yes">Failed to uninstall performance counters. ([2] [3] [4] [5])</String>
18
19 <String Id="msierrSecureObjectsFailedCreateSD" Overridable="yes">Failed to create security descriptor for [3]\[4], system error: [2]</String>
20 <String Id="msierrSecureObjectsFailedSet" Overridable="yes">Failed to set security descriptor on object [3], system error: [2]</String>
21 <String Id="msierrSecureObjectsUnknownType" Overridable="yes">Unknown Object Type [3], system error: [2]</String>
22
23 <String Id="msierrXmlFileFailedRead" Overridable="yes">There was a failure while configuring XML files.</String>
24 <String Id="msierrXmlFileFailedOpen" Overridable="yes">Failed to open XML file [3], system error: [2]</String>
25 <String Id="msierrXmlFileFailedSelect" Overridable="yes">Failed to find node: [3] in XML file: [4], system error: [2]</String>
26 <String Id="msierrXmlFileFailedSave" Overridable="yes">Failed to save changes to XML file [3], system error: [2]</String>
27
28 <String Id="msierrXmlConfigFailedRead" Overridable="yes">There was a failure while configuring XML files.</String>
29 <String Id="msierrXmlConfigFailedOpen" Overridable="yes">Failed to open XML file [3], system error: [2]</String>
30 <String Id="msierrXmlConfigFailedSelect" Overridable="yes">Failed to find node: [3] in XML file: [4], system error: [2]</String>
31 <String Id="msierrXmlConfigFailedSave" Overridable="yes">Failed to save changes to XML file [3], system error: [2]</String>
32</WixLocalization>
diff --git a/src/ext/Util/wixlib/es-es.wxl b/src/ext/Util/wixlib/es-es.wxl
new file mode 100644
index 00000000..ca5ab8bb
--- /dev/null
+++ b/src/ext/Util/wixlib/es-es.wxl
@@ -0,0 +1,31 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2
3<WixLocalization Culture="es-es" xmlns="http://wixtoolset.org/schemas/v4/wxl">
4 <String Id="msierrUSRFailedUserCreate" Overridable="yes">La creación del usuario ha fracasado. ([2] [3] [4] [5])</String>
5 <String Id="msierrUSRFailedUserCreatePswd" Overridable="yes">La creación del usuario ha fracasado porque la contraseña es incorrecta. ([2] [3] [4] [5])</String>
6 <String Id="msierrUSRFailedUserGroupAdd" Overridable="yes">El aditamento del usuario al grupo ha fracasado. ([2] [3] [4] [5])</String>
7 <String Id="msierrUSRFailedUserCreateExists" Overridable="yes">La creación del usuario ha fracasado porque ya existe. ([2] [3] [4] [5])</String>
8
9 <String Id="msierrSMBFailedCreate" Overridable="yes">La creación de la red compartida ha fracasado. ([2] [3] [4] [5])</String>
10 <String Id="msierrSMBFailedDrop" Overridable="yes">La eliminación de la red compartida ha fracasado. ([2] [3] [4] [5])</String>
11
12 <String Id="msierrPERFMONFailedRegisterDLL" Overridable="yes">La inscripción al registro de la DLL con PerfMon ha fracasado. ([2] [3] [4] [5])</String>
13 <String Id="msierrPERFMONFailedUnregisterDLL" Overridable="yes">La cancelación de la inscripción al registro de la DLL con PerfMon ha fracasado. ([2] [3] [4] [5])</String>
14
15 <String Id="msierrInstallPerfCounterData" Overridable="yes">La instalación de los contadores de rendimiento ha fracasado. ([2] [3] [4] [5])</String>
16 <String Id="msierrUninstallPerfCounterData" Overridable="yes">La desinstalación de los contadores de rendimiento ha fracasado. ([2] [3] [4] [5])</String>
17
18 <String Id="msierrSecureObjectsFailedCreateSD" Overridable="yes">La creación de los ACLs ha fracasado por [3]\[4], error del sistema : [2]</String>
19 <String Id="msierrSecureObjectsFailedSet" Overridable="yes">El posicionamiento de los ACLs por el objecto [3] ha fracasado, error del sistema: [2]</String>
20 <String Id="msierrSecureObjectsUnknownType" Overridable="yes">Tipo de objecto no conocido [3], error del sistema: [2]</String>
21
22 <String Id="msierrXmlFileFailedRead" Overridable="yes">Un problema ha aparecido durante la configuración de los ficheros XML.</String>
23 <String Id="msierrXmlFileFailedOpen" Overridable="yes">Fracaso de la apertura de los ficheros XML [3], error del sistema: [2]</String>
24 <String Id="msierrXmlFileFailedSelect" Overridable="yes">Fracaso de la búsqueda del nodo: [3] en el fichero XML: [4], error del sistema: [2]</String>
25 <String Id="msierrXmlFileFailedSave" Overridable="yes">Fracaso durante la salvaguardia de las modificaciones en el fichero XML [3], error del sistema: [2]</String>
26
27 <String Id="msierrXmlConfigFailedRead" Overridable="yes">Un problema ha aparecido durante la configuración de los ficheros XML.</String>
28 <String Id="msierrXmlConfigFailedOpen" Overridable="yes">Fracaso de la apertura de los ficheros XML [3], error del sistema: [2]</String>
29 <String Id="msierrXmlConfigFailedSelect" Overridable="yes">Fracaso de la búsqueda del nodo: [3] en el fichero XML: [4], error del sistema: [2]</String>
30 <String Id="msierrXmlConfigFailedSave" Overridable="yes">Fracaso durante la salvaguardia de las modificaciones en el fichero XML [3], error del sistema: [2]</String>
31</WixLocalization> \ No newline at end of file
diff --git a/src/ext/Util/wixlib/fr-fr.wxl b/src/ext/Util/wixlib/fr-fr.wxl
new file mode 100644
index 00000000..ad34b56a
--- /dev/null
+++ b/src/ext/Util/wixlib/fr-fr.wxl
@@ -0,0 +1,31 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2
3<WixLocalization Culture="fr-fr" xmlns="http://wixtoolset.org/schemas/v4/wxl">
4 <String Id="msierrUSRFailedUserCreate" Overridable="yes">La création de l'utilisateur a échoué. ([2] [3] [4] [5])</String>
5 <String Id="msierrUSRFailedUserCreatePswd" Overridable="yes">La création de l'utilisateur a échoué car le mot de passe est invalide. ([2] [3] [4] [5])</String>
6 <String Id="msierrUSRFailedUserGroupAdd" Overridable="yes">L'ajout de l'utilisateur au groupe a échoué. ([2] [3] [4] [5])</String>
7 <String Id="msierrUSRFailedUserCreateExists" Overridable="yes">La création de l'utilisateur a échoué car il existe dejà. ([2] [3] [4] [5])</String>
8
9 <String Id="msierrSMBFailedCreate" Overridable="yes">La création du partage reseau a échoué. ([2] [3] [4] [5])</String>
10 <String Id="msierrSMBFailedDrop" Overridable="yes">La suppression du partage reseau a échoué. ([2] [3] [4] [5])</String>
11
12 <String Id="msierrPERFMONFailedRegisterDLL" Overridable="yes">L'inscription au registre de la DLL avec PerfMon a échoué. ([2] [3] [4] [5])</String>
13 <String Id="msierrPERFMONFailedUnregisterDLL" Overridable="yes">La desinscription au registre de la DLL avec PerfMon a échoué. ([2] [3] [4] [5])</String>
14
15 <String Id="msierrInstallPerfCounterData" Overridable="yes">L'installation des compteurs de performance a échoué. ([2] [3] [4] [5])</String>
16 <String Id="msierrUninstallPerfCounterData" Overridable="yes">La desinstallation des compteurs de performance a échoué. ([2] [3] [4] [5])</String>
17
18 <String Id="msierrSecureObjectsFailedCreateSD" Overridable="yes">La création des ACLs a échoué pour [3]\[4], erreur systeme: [2]</String>
19 <String Id="msierrSecureObjectsFailedSet" Overridable="yes">Le positionnement des ACLs pour l'objet [3] a échoué, erreur systeme: [2]</String>
20 <String Id="msierrSecureObjectsUnknownType" Overridable="yes">Type d'objet inconnu [3], erreur systeme: [2]</String>
21
22 <String Id="msierrXmlFileFailedRead" Overridable="yes">Un problème est survenu lors de la configuration des fichiers XML.</String>
23 <String Id="msierrXmlFileFailedOpen" Overridable="yes">Echec de l'ouverture des fichiers XML [3], erreur systeme: [2]</String>
24 <String Id="msierrXmlFileFailedSelect" Overridable="yes">Echec de la recherche du noeud: [3] dans le fichier XML: [4], erreur systeme: [2]</String>
25 <String Id="msierrXmlFileFailedSave" Overridable="yes">Echec lors de la sauvegarde des modifications dans le fichier XML [3], erreur systeme: [2]</String>
26
27 <String Id="msierrXmlConfigFailedRead" Overridable="yes">Un problème est survenu lors de la configuration des fichiers XML.</String>
28 <String Id="msierrXmlConfigFailedOpen" Overridable="yes">Echec de l'ouverture des fichiers XML [3], erreur systeme: [2]</String>
29 <String Id="msierrXmlConfigFailedSelect" Overridable="yes">Echec de la recherche du noeud: [3] dans le fichier XML: [4], erreur systeme: [2]</String>
30 <String Id="msierrXmlConfigFailedSave" Overridable="yes">Echec lors de la sauvegarde des modifications dans le fichier XML [3], erreur systeme: [2]</String>
31</WixLocalization> \ No newline at end of file
diff --git a/src/ext/Util/wixlib/it-it.wxl b/src/ext/Util/wixlib/it-it.wxl
new file mode 100644
index 00000000..8cea0a14
--- /dev/null
+++ b/src/ext/Util/wixlib/it-it.wxl
@@ -0,0 +1,32 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2
3
4<WixLocalization Culture="it-it" xmlns="http://wixtoolset.org/schemas/v4/wxl">
5 <String Id="msierrUSRFailedUserCreate" Overridable="yes">Impossibile creare l'utente. ([2] [3] [4] [5])</String>
6 <String Id="msierrUSRFailedUserCreatePswd" Overridable="yes">Impossibile creare l'utente perchè la password è errata. ([2] [3] [4] [5])</String>
7 <String Id="msierrUSRFailedUserGroupAdd" Overridable="yes">Impossibile aggiungere l'utente al gruppo. ([2] [3] [4] [5])</String>
8 <String Id="msierrUSRFailedUserCreateExists" Overridable="yes">Impossibile creare l'utente perchè già esistente. ([2] [3] [4] [5])</String>
9
10 <String Id="msierrSMBFailedCreate" Overridable="yes">Impossibile creare la risorsa di rete. ([2] [3] [4] [5])</String>
11 <String Id="msierrSMBFailedDrop" Overridable="yes">Impossibile eliminare la risorsa di rete. ([2] [3] [4] [5])</String>
12
13 <String Id="msierrPERFMONFailedRegisterDLL" Overridable="yes">Impossibile registrare la DLL con PerfMon. ([2] [3] [4] [5])</String>
14 <String Id="msierrPERFMONFailedUnregisterDLL" Overridable="yes">Impossibile rimuovere la registrazione della DLL con PerfMon. ([2] [3] [4] [5])</String>
15
16 <String Id="msierrInstallPerfCounterData" Overridable="yes">Impossibile installare i contatori delle prestazioni. ([2] [3] [4] [5])</String>
17 <String Id="msierrUninstallPerfCounterData" Overridable="yes">Impossibile rimuovere i contatori delle prestazioni. ([2] [3] [4] [5])</String>
18
19 <String Id="msierrSecureObjectsFailedCreateSD" Overridable="yes">Impossibile creare i descrittori di sicurezza per [3]\[4], errore di sistema: [2]</String>
20 <String Id="msierrSecureObjectsFailedSet" Overridable="yes">Impossibile impostare i descrittori di sicurezza sull'oggetto [3], errore di sistema: [2]</String>
21 <String Id="msierrSecureObjectsUnknownType" Overridable="yes">Tipo di oggetto sconosciuto [3], errore di sistema: [2]</String>
22
23 <String Id="msierrXmlFileFailedRead" Overridable="yes">Si è verificato un errore durante la configurazione dei file XML.</String>
24 <String Id="msierrXmlFileFailedOpen" Overridable="yes">Impossibile aprire il file XML [3], errore di sistema: [2]</String>
25 <String Id="msierrXmlFileFailedSelect" Overridable="yes">Impossibile trovare il nodo: [3] nel file XML: [4], errore di sistema: [2]</String>
26 <String Id="msierrXmlFileFailedSave" Overridable="yes">Impossible salvare le modifiche al file XML [3], errore di sistema: [2]</String>
27
28 <String Id="msierrXmlConfigFailedRead" Overridable="yes">Si è verificato un errore durante la configurazione dei file XML.</String>
29 <String Id="msierrXmlConfigFailedOpen" Overridable="yes">Impossibile aprire il file XML [3], errore di sistema: [2]</String>
30 <String Id="msierrXmlConfigFailedSelect" Overridable="yes">Impossibile trovare il nodo: [3] nel file XML: [4], errore di sistema: [2]</String>
31 <String Id="msierrXmlConfigFailedSave" Overridable="yes">Impossibile salvare le modifiche al file XML [3], errore di sitema: [2]</String>
32</WixLocalization>
diff --git a/src/ext/Util/wixlib/ja-jp.wxl b/src/ext/Util/wixlib/ja-jp.wxl
new file mode 100644
index 00000000..5f5cf40d
--- /dev/null
+++ b/src/ext/Util/wixlib/ja-jp.wxl
@@ -0,0 +1,32 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2
3
4<WixLocalization Culture="ja-jp" xmlns="http://wixtoolset.org/schemas/v4/wxl">
5 <String Id="msierrUSRFailedUserCreate" Overridable="yes">ユーザー作成に失敗しました。 ([2] [3] [4] [5])</String>
6 <String Id="msierrUSRFailedUserCreatePswd" Overridable="yes">パスワードが無効のためユーザー作成に失敗しました。 ([2] [3] [4] [5])</String>
7 <String Id="msierrUSRFailedUserGroupAdd" Overridable="yes">ユーザーをグループに追加でいませんでした。 ([2] [3] [4] [5])</String>
8 <String Id="msierrUSRFailedUserCreateExists" Overridable="yes">ユーザーが既に存在するため作成できませんでした。 ([2] [3] [4] [5])</String>
9
10 <String Id="msierrSMBFailedCreate" Overridable="yes">ネットワーク共有の作成に失敗しました。 ([2] [3] [4] [5])</String>
11 <String Id="msierrSMBFailedDrop" Overridable="yes">ネットワーク共有の削除に失敗しました。 ([2] [3] [4] [5])</String>
12
13 <String Id="msierrPERFMONFailedRegisterDLL" Overridable="yes">DLL を PerfMon に登録でいませんでした。 ([2] [3] [4] [5])</String>
14 <String Id="msierrPERFMONFailedUnregisterDLL" Overridable="yes">DLL を PerfMon より登録解除できませんでした。 ([2] [3] [4] [5])</String>
15
16 <String Id="msierrInstallPerfCounterData" Overridable="yes">パフォーマンス カウンタをインストールできませんでした。 ([2] [3] [4] [5])</String>
17 <String Id="msierrUninstallPerfCounterData" Overridable="yes">パフォーマンス カウンタをアンインストールできませんでした。 ([2] [3] [4] [5])</String>
18
19 <String Id="msierrSecureObjectsFailedCreateSD" Overridable="yes">[3]\[4] 用セキュリティ ディスクリプターを作成できませんでした、システム エラー: [2]</String>
20 <String Id="msierrSecureObjectsFailedSet" Overridable="yes">オブジェクト [3] 上のセキュリティ ディスクリプターを設定できませんでした、システム エラー: [2]</String>
21 <String Id="msierrSecureObjectsUnknownType" Overridable="yes">不明なオブジェクト種別 [3]、システム エラー: [2]</String>
22
23 <String Id="msierrXmlFileFailedRead" Overridable="yes">XML ファイル構成中に失敗しました。</String>
24 <String Id="msierrXmlFileFailedOpen" Overridable="yes">XML ファイル [3] を開けませんでした、システム エラー: [2]</String>
25 <String Id="msierrXmlFileFailedSelect" Overridable="yes">XML ファイル [4] 内にノード [3] が見つかりませんでした、システム エラー: [2]</String>
26 <String Id="msierrXmlFileFailedSave" Overridable="yes">XML ファイル [3] へ変更を保存できませんでした、システム エラー: [2]</String>
27
28 <String Id="msierrXmlConfigFailedRead" Overridable="yes">XML ファイル構成中に失敗しました。</String>
29 <String Id="msierrXmlConfigFailedOpen" Overridable="yes">XML ファイル [3] を開けませんでした、システム エラー: [2]</String>
30 <String Id="msierrXmlConfigFailedSelect" Overridable="yes">XML ファイル [4] 内にノード [3] が見つかりませんでした、システム エラー: [2]</String>
31 <String Id="msierrXmlConfigFailedSave" Overridable="yes">XML ファイル [3] へ変更を保存できませんでした、システム エラー: [2]</String>
32</WixLocalization>
diff --git a/src/ext/Util/wixlib/pt-br.wxl b/src/ext/Util/wixlib/pt-br.wxl
new file mode 100644
index 00000000..3ca27dda
--- /dev/null
+++ b/src/ext/Util/wixlib/pt-br.wxl
@@ -0,0 +1,26 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2
3
4<WixLocalization Culture="pt-br" xmlns="http://wixtoolset.org/schemas/v4/wxl">
5 <String Id="msierrUSRFailedUserCreate" Overridable="yes">Falha ao criar usuário. ([2] [3] [4] [5])</String>
6 <String Id="msierrUSRFailedUserCreatePswd" Overridable="yes">Falha ao criar usuário devido a senha inválida. ([2] [3] [4] [5])</String>
7 <String Id="msierrUSRFailedUserGroupAdd" Overridable="yes">Falha ao adicionar o usuário ao grupo. ([2] [3] [4] [5])</String>
8 <String Id="msierrUSRFailedUserCreateExists" Overridable="yes">Falha ao criar o usuário, porque ele já existe. ([2] [3] [4] [5])</String>
9 <String Id="msierrSMBFailedCreate" Overridable="yes">Falha ao criar o compartilhamento de rede. ([2] [3] [4] [5])</String>
10 <String Id="msierrSMBFailedDrop" Overridable="yes">Falha ao cair compartilhamento de rede. ([2] [3] [4] [5])</String>
11 <String Id="msierrPERFMONFailedRegisterDLL" Overridable="yes">Falha ao registrar DLL com PerfMon. ([2] [3] [4] [5])</String>
12 <String Id="msierrPERFMONFailedUnregisterDLL" Overridable="yes">Falha ao cancelar o registro de DLL com PerfMon. ([2] [3] [4] [5])</String>
13 <String Id="msierrInstallPerfCounterData" Overridable="yes">Falha ao instalar contadores de desempenho. ([2] [3] [4] [5])</String>
14 <String Id="msierrUninstallPerfCounterData" Overridable="yes">Falha ao desinstalar contadores de desempenho. ([2] [3] [4] [5])</String>
15 <String Id="msierrSecureObjectsFailedCreateSD" Overridable="yes">Falha ao criar o descritor de segurança [3] \ [4], erro do sistema: [2]</String>
16 <String Id="msierrSecureObjectsFailedSet" Overridable="yes">Falha ao definir o descritor de segurança sobre o objeto [3], erro do sistema: [2]</String>
17 <String Id="msierrSecureObjectsUnknownType" Overridable="yes">Objeto Desconhecido Tipo [3], erro do sistema: [2]</String>
18 <String Id="msierrXmlFileFailedRead" Overridable="yes">Houve uma falha ao configurar arquivos XML.</String>
19 <String Id="msierrXmlFileFailedOpen" Overridable="yes">Falha ao abrir o arquivo XML [3], erro do sistema: [2]</String>
20 <String Id="msierrXmlFileFailedSelect" Overridable="yes">Falha ao localizar nó: [3] no arquivo XML: [4], erro do sistema: [2]</String>
21 <String Id="msierrXmlFileFailedSave" Overridable="yes">Falha ao salvar as alterações para o arquivo XML [3], erro do sistema: [2]</String>
22 <String Id="msierrXmlConfigFailedRead" Overridable="yes">Houve uma falha ao configurar arquivos XML.</String>
23 <String Id="msierrXmlConfigFailedOpen" Overridable="yes">Falha ao abrir o arquivo XML [3], erro do sistema: [2]</String>
24 <String Id="msierrXmlConfigFailedSelect" Overridable="yes">Falha ao localizar nó: [3] no arquivo XML: [4], erro do sistema: [2]</String>
25 <String Id="msierrXmlConfigFailedSave" Overridable="yes">Falha ao salvar as alterações para o arquivo XML [3], erro do sistema: [2]</String>
26</WixLocalization>
diff --git a/src/ext/Util/wixlib/util.v3.ncrunchproject b/src/ext/Util/wixlib/util.v3.ncrunchproject
new file mode 100644
index 00000000..319cd523
--- /dev/null
+++ b/src/ext/Util/wixlib/util.v3.ncrunchproject
@@ -0,0 +1,5 @@
1<ProjectConfiguration>
2 <Settings>
3 <IgnoreThisComponentCompletely>True</IgnoreThisComponentCompletely>
4 </Settings>
5</ProjectConfiguration> \ No newline at end of file
diff --git a/src/ext/Util/wixlib/util.wixproj b/src/ext/Util/wixlib/util.wixproj
new file mode 100644
index 00000000..99dede7d
--- /dev/null
+++ b/src/ext/Util/wixlib/util.wixproj
@@ -0,0 +1,27 @@
1<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
2<Project Sdk="WixToolset.Sdk">
3
4 <PropertyGroup>
5 <OutputType>Library</OutputType>
6 <BindFiles>true</BindFiles>
7 </PropertyGroup>
8
9 <ItemGroup>
10 <BindInputPaths Include="$(OutputPath)x86" BindName='x86' />
11 <BindInputPaths Include="$(OutputPath)x64" BindName='x64' />
12 <BindInputPaths Include="$(OutputPath)arm64" BindName='arm64' />
13 </ItemGroup>
14
15 <ItemGroup>
16 <ProjectReference Include="..\be\utilbe.vcxproj" Properties="Platform=ARM64" ReferenceOutputAssembly="false" />
17 <ProjectReference Include="..\be\utilbe.vcxproj" Properties="Platform=x86" ReferenceOutputAssembly="false" />
18 <ProjectReference Include="..\be\utilbe.vcxproj" Properties="Platform=x64" ReferenceOutputAssembly="false" />
19 <ProjectReference Include="..\ca\utilca.vcxproj" Properties="Platform=ARM64" ReferenceOutputAssembly="false" />
20 <ProjectReference Include="..\ca\utilca.vcxproj" Properties="Platform=x86" ReferenceOutputAssembly="false" />
21 <ProjectReference Include="..\ca\utilca.vcxproj" Properties="Platform=x64" ReferenceOutputAssembly="false" />
22 </ItemGroup>
23
24 <ItemGroup>
25 <PackageReference Include="Nerdbank.GitVersioning" Version="3.3.37" PrivateAssets="All" />
26 </ItemGroup>
27</Project>
diff --git a/src/ext/global.json b/src/ext/global.json
index 23dd3fa6..697f5687 100644
--- a/src/ext/global.json
+++ b/src/ext/global.json
@@ -1,5 +1,8 @@
1{ 1{
2 "msbuild-sdks": { 2 "msbuild-sdks": {
3 "WixToolset.Sdk": "4.0.0-build-0211" 3 "WixToolset.Sdk": "4.0.0-build-0213"
4 },
5 "sdk": {
6 "allowPrerelease": false
4 } 7 }
5} 8}