Index: Setup/SQLite.iss ================================================================== --- Setup/SQLite.iss +++ Setup/SQLite.iss @@ -117,18 +117,18 @@ #if Year == "2010" Components: {#InstallerCondition}; Tasks: gac\vs2010; Filename: {app}\bin\Installer.exe; Parameters: "-install true -wow64 true -installFlags AllExceptGlobalAssemblyCache -tracePriority Lowest -verbose true -noCompact true -noNetFx20 true -noNetFx45 true -noVs2005 true -noVs2008 true -noVs2012 true -whatIf false -confirm true"; Flags: skipifdoesntexist; Check: CheckIsNetFx4Setup() #endif #if Year == "2012" Components: {#InstallerCondition}; Tasks: gac\vs2012; Filename: {app}\bin\Installer.exe; Parameters: "-install true -wow64 true -installFlags AllExceptGlobalAssemblyCache -tracePriority Lowest -verbose true -noCompact true -noNetFx20 true -noNetFx40 true -noVs2005 true -noVs2008 true -noVs2010 true -configVersion 4.0.30319 -whatIf false -confirm true"; Flags: skipifdoesntexist; Check: CheckIsNetFx4Setup() -Components: {#InstallerCondition}; Tasks: gac\vs2012; Filename: {app}\bin\Installer.exe; Parameters: "-perUser true -install true -wow64 true -installFlags AllExceptGlobalAssemblyCache -tracePriority Lowest -verbose true -noCompact true -noNetFx20 true -noNetFx40 true -noVs2005 true -noVs2008 true -noVs2010 true -configVersion 4.0.30319 -vsVersionSuffix _Config -whatIf false -confirm true"; Flags: skipifdoesntexist; Check: CheckIsNetFx4Setup() +Components: {#InstallerCondition}; Tasks: gac\vs2012; Filename: {app}\bin\Installer.exe; Parameters: "-perUser true -install true -wow64 true -installFlags AllExceptGlobalAssemblyCache -tracePriority Lowest -verbose true -noCompact true -noNetFx20 true -noNetFx40 true -noNetFx45 true -noVs2005 true -noVs2008 true -noVs2010 true -configVersion 4.0.30319 -vsVersionSuffix _Config -whatIf false -confirm true"; Flags: skipifdoesntexist; Check: CheckIsNetFx4Setup() #endif #endif [UninstallRun] #if Pos("NativeOnly", AppConfiguration) == 0 && AppProcessor == "x86" #if Year == "2012" -Components: {#InstallerCondition}; Tasks: gac\vs2012; Filename: {app}\bin\Installer.exe; Parameters: "-perUser true -install false -wow64 true -installFlags AllExceptGlobalAssemblyCache -tracePriority Lowest -verbose true -noCompact true -noNetFx20 true -noNetFx40 true -noVs2005 true -noVs2008 true -noVs2010 true -configVersion 4.0.30319 -vsVersionSuffix _Config -whatIf false -confirm true"; Flags: skipifdoesntexist; Check: CheckIsNetFx4Setup() +Components: {#InstallerCondition}; Tasks: gac\vs2012; Filename: {app}\bin\Installer.exe; Parameters: "-perUser true -install false -wow64 true -installFlags AllExceptGlobalAssemblyCache -tracePriority Lowest -verbose true -noCompact true -noNetFx20 true -noNetFx40 true -noNetFx45 true -noVs2005 true -noVs2008 true -noVs2010 true -configVersion 4.0.30319 -vsVersionSuffix _Config -whatIf false -confirm true"; Flags: skipifdoesntexist; Check: CheckIsNetFx4Setup() Components: {#InstallerCondition}; Tasks: gac\vs2012; Filename: {app}\bin\Installer.exe; Parameters: "-install false -wow64 true -installFlags AllExceptGlobalAssemblyCache -tracePriority Lowest -verbose true -noCompact true -noNetFx20 true -noNetFx40 true -noVs2005 true -noVs2008 true -noVs2010 true -configVersion 4.0.30319 -whatIf false -confirm true"; Flags: skipifdoesntexist; Check: CheckIsNetFx4Setup() #endif #if Year == "2010" Components: {#InstallerCondition}; Tasks: gac\vs2010; Filename: {app}\bin\Installer.exe; Parameters: "-install false -wow64 true -installFlags AllExceptGlobalAssemblyCache -tracePriority Lowest -verbose true -noCompact true -noNetFx20 true -noNetFx45 true -noVs2005 true -noVs2008 true -noVs2012 true -whatIf false -confirm true"; Flags: skipifdoesntexist; Check: CheckIsNetFx4Setup() #endif Index: Setup/build_ce.bat ================================================================== --- Setup/build_ce.bat +++ Setup/build_ce.bat @@ -28,11 +28,11 @@ SET TOOLS=%~dp0 SET TOOLS=%TOOLS:~0,-1% %_VECHO% Tools = '%TOOLS%' -SET BUILD_CONFIGURATIONS=Release +SET BUILD_CONFIGURATIONS=Debug Release SET BASE_CONFIGURATIONSUFFIX=Compact SET PLATFORMS="Pocket PC 2003 (ARMV4)" SET PROCESSORS=arm SET YEARS=2008 SET BASE_PLATFORM=PocketPC Index: System.Data.SQLite/UnsafeNativeMethods.cs ================================================================== --- System.Data.SQLite/UnsafeNativeMethods.cs +++ System.Data.SQLite/UnsafeNativeMethods.cs @@ -24,11 +24,11 @@ using System.Security; #endif using System.Runtime.InteropServices; -#if !PLATFORM_COMPACTFRAMEWORK +#if !PLATFORM_COMPACTFRAMEWORK || COUNT_HANDLE using System.Threading; #endif #if !PLATFORM_COMPACTFRAMEWORK && !DEBUG [SuppressUnmanagedCodeSecurity] Index: Tests/basic.eagle ================================================================== --- Tests/basic.eagle +++ Tests/basic.eagle @@ -1690,21 +1690,21 @@ {[llength [file list $directory(data) $fileName]] == 1}] set t [object create -alias Thread threadStart] sql execute $db "BEGIN TRANSACTION;"; $t Start - for {set i 1} {$i < 100} {incr i} { + for {set i 1} {$i < 1000} {incr i} { # # NOTE: Execute a query that should force the creation of a temporary file # for its statement journal. # sql execute $db "UPDATE t1 SET x = ?;" [list param1 String $i] # # NOTE: Give the other thread some time to notice the temporary file. # - after 1000 + after [expr {int(rand() * 1000)}] # # NOTE: Stop when the other thread confirms that the temporary file was # created in the correct directory. # @@ -1712,11 +1712,13 @@ break } } $t Join; sql execute $db "COMMIT TRANSACTION;" - lappend result $found(data) $found(temp); set result + + lappend result $found(data) [expr {[info exists found(temp)] ? \ + $found(temp) : False}]; set result } -cleanup { # # NOTE: Close the database; however, do not attempt to delete the file as # it is not located in the database directory known to the cleanupDb # procedure (i.e. the one returned by getDatabaseDirectory). Index: tools/install/Installer.cs ================================================================== --- tools/install/Installer.cs +++ tools/install/Installer.cs @@ -44,10 +44,11 @@ string name, /* in */ string description, /* in */ string typeName, /* in */ AssemblyName assemblyName, /* in */ object clientData, /* in */ + bool perUser, /* in */ bool wow64, /* in */ bool throwOnMissing, /* in */ bool whatIf, /* in */ bool verbose, /* in */ ref bool saved, /* out */ @@ -60,10 +61,11 @@ Installer.MockRegistryKey rootKey, /* in */ string frameworkName, /* in */ Version frameworkVersion, /* in */ string platformName, /* in */ object clientData, /* in */ + bool perUser, /* in */ bool wow64, /* in */ bool throwOnMissing, /* in */ bool whatIf, /* in */ bool verbose, /* in */ ref string error /* out */ @@ -75,10 +77,11 @@ Installer.MockRegistryKey rootKey, /* in */ Version vsVersion, /* in */ string suffix, /* in, optional */ Installer.Package package, /* in */ object clientData, /* in */ + bool perUser, /* in */ bool wow64, /* in */ bool throwOnMissing, /* in */ bool whatIf, /* in */ bool verbose, /* in */ ref string error /* out */ @@ -3947,15 +3950,22 @@ } /////////////////////////////////////////////////////////////////////// private static string GetRootKeyName( + bool perUser, bool wow64 ) { + // + // BUGFIX: Apparently, the per-user registry hive does not use + // the "Wow6432Node" node to store settings for 32-bit + // applications running on a 64-bit operating system. + // Ticket [a0677309f0] has further details. + // return String.Format("{0}{1}", RootKeyName, - wow64 && Is64BitProcess() ? + !perUser && wow64 && Is64BitProcess() ? "\\" + Wow64SubKeyName : String.Empty); } /////////////////////////////////////////////////////////////////////// @@ -4091,31 +4101,33 @@ /////////////////////////////////////////////////////////////////////// #region .NET Framework Handling private static string GetFrameworkRootKeyName( + bool perUser, bool wow64 ) { return String.Format("{0}\\Microsoft\\.NETFramework", - GetRootKeyName(wow64)); + GetRootKeyName(perUser, wow64)); } /////////////////////////////////////////////////////////////////////// private static string GetFrameworkKeyName( string frameworkName, Version frameworkVersion, string platformName, + bool perUser, bool wow64 ) { string format = !String.IsNullOrEmpty(platformName) ? "{0}\\Microsoft\\{1}\\v{2}\\{3}" : "{0}\\Microsoft\\{1}\\v{2}"; - return String.Format(format, GetRootKeyName(wow64), + return String.Format(format, GetRootKeyName(perUser, wow64), frameworkName, frameworkVersion, platformName); } /////////////////////////////////////////////////////////////////////// @@ -4142,18 +4154,19 @@ /////////////////////////////////////////////////////////////////////// private static string GetFrameworkDirectory( MockRegistryKey rootKey, Version frameworkVersion, + bool perUser, bool wow64, bool whatIf, bool verbose ) { using (MockRegistryKey key = RegistryHelper.OpenSubKey( - rootKey, GetFrameworkRootKeyName(wow64), false, - whatIf, verbose)) + rootKey, GetFrameworkRootKeyName(perUser, wow64), + false, whatIf, verbose)) { if (key == null) return null; object value = RegistryHelper.GetValue( @@ -4255,17 +4268,19 @@ private static bool HaveFrameworkDirectory( MockRegistryKey rootKey, string frameworkName, Version frameworkVersion, string platformName, + bool perUser, bool wow64, bool whatIf, bool verbose ) { string keyName = GetFrameworkKeyName( - frameworkName, frameworkVersion, platformName, wow64); + frameworkName, frameworkVersion, platformName, perUser, + wow64); using (MockRegistryKey key = RegistryHelper.OpenSubKey( rootKey, keyName, false, whatIf, verbose)) { if (key == null) @@ -4273,11 +4288,12 @@ if (platformName != null) // NOTE: Skip non-desktop. return true; string directory = GetFrameworkDirectory( - rootKey, frameworkVersion, wow64, whatIf, verbose); + rootKey, frameworkVersion, perUser, wow64, whatIf, + verbose); if (String.IsNullOrEmpty(directory)) return false; if (!Directory.Exists(directory)) @@ -4298,17 +4314,19 @@ private static bool HaveFrameworkRegistry( MockRegistryKey rootKey, string frameworkName, Version frameworkVersion, string platformName, + bool perUser, bool wow64, bool whatIf, bool verbose ) { string keyName = GetFrameworkKeyName( - frameworkName, frameworkVersion, platformName, wow64); + frameworkName, frameworkVersion, platformName, perUser, + wow64); using (MockRegistryKey key = RegistryHelper.OpenSubKey( rootKey, keyName, false, whatIf, verbose)) { if (key == null) @@ -4339,10 +4357,11 @@ string name, string description, string typeName, AssemblyName assemblyName, object clientData, + bool perUser, bool wow64, bool throwOnMissing, bool whatIf, bool verbose, ref bool saved, @@ -4452,11 +4471,11 @@ ForDisplay(frameworkVersion), ForDisplay(platformName)), traceCategory); if (!HaveFrameworkDirectory( rootKey, frameworkName, frameworkVersion, - platformName, wow64, whatIf, verbose)) + platformName, perUser, wow64, whatIf, verbose)) { TraceOps.DebugAndTrace(TracePriority.Low, debugCallback, traceCallback, ".NET Framework directory not found, skipping...", traceCategory); @@ -4466,11 +4485,12 @@ if (callback == null) continue; string directory = GetFrameworkDirectory( - rootKey, frameworkVersion, wow64, whatIf, verbose); + rootKey, frameworkVersion, perUser, wow64, whatIf, + verbose); if (String.IsNullOrEmpty(directory)) { TraceOps.DebugAndTrace(TracePriority.Low, debugCallback, traceCallback, String.Format( @@ -4509,12 +4529,13 @@ bool localSaved = false; if (!callback( fileName, invariant, name, description, typeName, - assemblyName, clientData, wow64, throwOnMissing, - whatIf, verbose, ref localSaved, ref error)) + assemblyName, clientData, perUser, wow64, + throwOnMissing, whatIf, verbose, ref localSaved, + ref error)) { return false; } else { @@ -4541,10 +4562,11 @@ MockRegistry registry, FrameworkList frameworkList, FrameworkRegistryCallback callback, string version, /* NOTE: Optional. */ object clientData, + bool perUser, bool wow64, bool throwOnMissing, bool whatIf, bool verbose, ref string error @@ -4646,11 +4668,11 @@ ForDisplay(frameworkVersion), ForDisplay(platformName)), traceCategory); if (!HaveFrameworkRegistry( rootKey, frameworkName, frameworkVersion, - platformName, wow64, whatIf, verbose)) + platformName, perUser, wow64, whatIf, verbose)) { TraceOps.DebugAndTrace(TracePriority.Low, debugCallback, traceCallback, ".NET Framework registry not found, skipping...", traceCategory); @@ -4661,12 +4683,12 @@ if (callback == null) continue; if (!callback( rootKey, frameworkName, frameworkVersion, - platformName, clientData, wow64, throwOnMissing, - whatIf, verbose, ref error)) + platformName, clientData, perUser, wow64, + throwOnMissing, whatIf, verbose, ref error)) { return false; } } } @@ -4712,19 +4734,20 @@ private static bool HaveVsVersion( MockRegistryKey rootKey, Version vsVersion, string suffix, + bool perUser, bool wow64, bool whatIf, bool verbose ) { if (vsVersion == null) return false; - string keyName = GetVsKeyName(vsVersion, suffix, wow64); + string keyName = GetVsKeyName(vsVersion, suffix, perUser, wow64); using (MockRegistryKey key = RegistryHelper.OpenSubKey( rootKey, keyName, false, whatIf, verbose)) { if (key == null) @@ -4762,10 +4785,11 @@ VsList vsList, VisualStudioRegistryCallback callback, string suffix, Package package, object clientData, + bool perUser, bool wow64, bool throwOnMissing, bool whatIf, bool verbose, ref string error @@ -4809,11 +4833,12 @@ debugCallback, traceCallback, String.Format( "vsVersion = {0}", ForDisplay(vsVersion)), traceCategory); if (!HaveVsVersion( - rootKey, vsVersion, suffix, wow64, whatIf, verbose)) + rootKey, vsVersion, suffix, perUser, wow64, whatIf, + verbose)) { TraceOps.DebugAndTrace(TracePriority.Low, debugCallback, traceCallback, "Visual Studio version not found, skipping...", traceCategory); @@ -4824,11 +4849,12 @@ if (callback == null) continue; if (!callback( rootKey, vsVersion, suffix, package, clientData, - wow64, throwOnMissing, whatIf, verbose, ref error)) + perUser, wow64, throwOnMissing, whatIf, verbose, + ref error)) { return false; } } @@ -5009,10 +5035,11 @@ string name, string description, string typeName, AssemblyName assemblyName, object clientData, + bool perUser, bool wow64, bool throwOnMissing, bool whatIf, bool verbose, ref bool saved, @@ -5050,10 +5077,11 @@ #region Assembly Folders Handling private static string GetAssemblyFoldersKeyName( string frameworkName, Version frameworkVersion, string platformName, + bool perUser, bool wow64 ) { // // NOTE: This registry key appears to always be 32-bit only @@ -5062,11 +5090,11 @@ // string format = !String.IsNullOrEmpty(platformName) ? "{0}\\Microsoft\\{1}\\v{2}\\{3}\\AssemblyFoldersEx" : "{0}\\Microsoft\\{1}\\v{2}\\AssemblyFoldersEx"; - return String.Format(format, GetRootKeyName(wow64), + return String.Format(format, GetRootKeyName(perUser, wow64), frameworkName, frameworkVersion, platformName); } /////////////////////////////////////////////////////////////////////// @@ -5075,18 +5103,20 @@ string frameworkName, Version frameworkVersion, string platformName, string subKeyName, string directory, + bool perUser, bool wow64, bool whatIf, bool verbose, ref string error ) { string keyName = GetAssemblyFoldersKeyName( - frameworkName, frameworkVersion, platformName, wow64); + frameworkName, frameworkVersion, platformName, perUser, + wow64); using (MockRegistryKey key = RegistryHelper.OpenSubKey( rootKey, keyName, true, whatIf, verbose)) { if (key == null) @@ -5124,19 +5154,21 @@ MockRegistryKey rootKey, string frameworkName, Version frameworkVersion, string platformName, string subKeyName, + bool perUser, bool wow64, bool throwOnMissing, bool whatIf, bool verbose, ref string error ) { string keyName = GetAssemblyFoldersKeyName( - frameworkName, frameworkVersion, platformName, wow64); + frameworkName, frameworkVersion, platformName, perUser, + wow64); using (MockRegistryKey key = RegistryHelper.OpenSubKey( rootKey, keyName, true, whatIf, verbose)) { if (key == null) @@ -5161,10 +5193,11 @@ MockRegistryKey rootKey, string frameworkName, Version frameworkVersion, string platformName, object clientData, + bool perUser, bool wow64, bool throwOnMissing, bool whatIf, bool verbose, ref string error @@ -5180,50 +5213,54 @@ if (pair.Y) { return RemoveFromAssemblyFolders( rootKey, frameworkName, frameworkVersion, platformName, - LegacyProjectName, wow64, false, whatIf, verbose, + LegacyProjectName, perUser, wow64, false, whatIf, verbose, ref error) && AddToAssemblyFolders( rootKey, frameworkName, frameworkVersion, platformName, - ProjectName, pair.X, wow64, whatIf, verbose, ref error); + ProjectName, pair.X, perUser, wow64, whatIf, verbose, + ref error); } else { return RemoveFromAssemblyFolders( rootKey, frameworkName, frameworkVersion, platformName, - ProjectName, wow64, throwOnMissing, whatIf, verbose, - ref error); + ProjectName, perUser, wow64, throwOnMissing, whatIf, + verbose, ref error); } } #endregion /////////////////////////////////////////////////////////////////////// #region Visual Studio Handling private static string GetVsRootKeyName( + bool perUser, bool wow64 ) { return String.Format("{0}\\Microsoft\\VisualStudio", - GetRootKeyName(wow64)); + GetRootKeyName(perUser, wow64)); } /////////////////////////////////////////////////////////////////////// private static string GetVsKeyName( Version vsVersion, string suffix, + bool perUser, bool wow64 ) { if (vsVersion == null) return null; return String.Format( - "{0}\\{1}{2}", GetVsRootKeyName(wow64), vsVersion, suffix); + "{0}\\{1}{2}", GetVsRootKeyName(perUser, wow64), vsVersion, + suffix); } /////////////////////////////////////////////////////////////////////// #region Visual Studio Data Source Handling @@ -5230,10 +5267,11 @@ private static bool AddVsDataSource( MockRegistryKey rootKey, Version vsVersion, string suffix, Package package, + bool perUser, bool wow64, bool whatIf, bool verbose, ref string error ) @@ -5248,11 +5286,11 @@ { error = "invalid VS package"; return false; } - string keyName = GetVsKeyName(vsVersion, suffix, wow64); + string keyName = GetVsKeyName(vsVersion, suffix, perUser, wow64); using (MockRegistryKey key = RegistryHelper.OpenSubKey( rootKey, keyName, false, whatIf, verbose)) { if (key == null) @@ -5319,10 +5357,11 @@ private static bool RemoveVsDataSource( MockRegistryKey rootKey, Version vsVersion, string suffix, Package package, + bool perUser, bool wow64, bool whatIf, bool verbose, ref string error ) @@ -5337,11 +5376,11 @@ { error = "invalid VS package"; return false; } - string keyName = GetVsKeyName(vsVersion, suffix, wow64); + string keyName = GetVsKeyName(vsVersion, suffix, perUser, wow64); using (MockRegistryKey key = RegistryHelper.OpenSubKey( rootKey, keyName, false, whatIf, verbose)) { if (key == null) @@ -5380,10 +5419,11 @@ MockRegistryKey rootKey, Version vsVersion, string suffix, Package package, object clientData, + bool perUser, bool wow64, bool throwOnMissing, bool whatIf, bool verbose, ref string error @@ -5404,18 +5444,18 @@ } if (pair.Y) { return AddVsDataSource( - rootKey, vsVersion, suffix, package, wow64, whatIf, - verbose, ref error); + rootKey, vsVersion, suffix, package, perUser, wow64, + whatIf, verbose, ref error); } else { return RemoveVsDataSource( - rootKey, vsVersion, suffix, package, wow64, whatIf, - verbose, ref error); + rootKey, vsVersion, suffix, package, perUser, wow64, + whatIf, verbose, ref error); } } #endregion /////////////////////////////////////////////////////////////////////// @@ -5425,10 +5465,11 @@ MockRegistryKey rootKey, Version vsVersion, string suffix, Package package, string fileName, + bool perUser, bool wow64, bool whatIf, bool verbose, ref string error ) @@ -5443,11 +5484,11 @@ { error = "invalid VS package"; return false; } - string keyName = GetVsKeyName(vsVersion, suffix, wow64); + string keyName = GetVsKeyName(vsVersion, suffix, perUser, wow64); using (MockRegistryKey key = RegistryHelper.OpenSubKey( rootKey, keyName, false, whatIf, verbose)) { if (key == null) @@ -5560,10 +5601,11 @@ private static bool RemoveVsDataProvider( MockRegistryKey rootKey, Version vsVersion, string suffix, Package package, + bool perUser, bool wow64, bool whatIf, bool verbose, ref string error ) @@ -5572,11 +5614,11 @@ { error = "invalid VS version"; return false; } - string keyName = GetVsKeyName(vsVersion, suffix, wow64); + string keyName = GetVsKeyName(vsVersion, suffix, perUser, wow64); using (MockRegistryKey key = RegistryHelper.OpenSubKey( rootKey, keyName, false, whatIf, verbose)) { if (key == null) @@ -5615,10 +5657,11 @@ MockRegistryKey rootKey, Version vsVersion, string suffix, Package package, object clientData, + bool perUser, bool wow64, bool throwOnMissing, bool whatIf, bool verbose, ref string error @@ -5633,18 +5676,18 @@ } if (pair.Y) { return AddVsDataProvider( - rootKey, vsVersion, suffix, package, pair.X, wow64, - whatIf, verbose, ref error); + rootKey, vsVersion, suffix, package, pair.X, perUser, + wow64, whatIf, verbose, ref error); } else { return RemoveVsDataProvider( - rootKey, vsVersion, suffix, package, wow64, whatIf, - verbose, ref error); + rootKey, vsVersion, suffix, package, perUser, wow64, + whatIf, verbose, ref error); } } #endregion /////////////////////////////////////////////////////////////////////// @@ -5686,10 +5729,11 @@ MockRegistryKey rootKey, Version vsVersion, string suffix, Package package, string fileName, + bool perUser, bool wow64, bool whatIf, bool verbose, ref string error ) @@ -5704,11 +5748,11 @@ { error = "invalid VS package"; return false; } - string keyName = GetVsKeyName(vsVersion, suffix, wow64); + string keyName = GetVsKeyName(vsVersion, suffix, perUser, wow64); using (MockRegistryKey key = RegistryHelper.OpenSubKey( rootKey, keyName, false, whatIf, verbose)) { if (key == null) @@ -5882,10 +5926,11 @@ private static bool RemoveVsPackage( MockRegistryKey rootKey, Version vsVersion, string suffix, Package package, + bool perUser, bool wow64, bool throwOnMissing, bool whatIf, bool verbose, ref string error @@ -5901,11 +5946,11 @@ { error = "invalid VS package"; return false; } - string keyName = GetVsKeyName(vsVersion, suffix, wow64); + string keyName = GetVsKeyName(vsVersion, suffix, perUser, wow64); using (MockRegistryKey key = RegistryHelper.OpenSubKey( rootKey, keyName, false, whatIf, verbose)) { if (key == null) @@ -5978,10 +6023,11 @@ MockRegistryKey rootKey, Version vsVersion, string suffix, Package package, object clientData, + bool perUser, bool wow64, bool throwOnMissing, bool whatIf, bool verbose, ref string error @@ -5996,17 +6042,17 @@ } if (pair.Y) { return AddVsPackage( - rootKey, vsVersion, suffix, package, pair.X, wow64, - whatIf, verbose, ref error); + rootKey, vsVersion, suffix, package, pair.X, perUser, + wow64, whatIf, verbose, ref error); } else { return RemoveVsPackage( - rootKey, vsVersion, suffix, package, wow64, + rootKey, vsVersion, suffix, package, perUser, wow64, throwOnMissing, whatIf, verbose, ref error); } } #endregion #endregion @@ -6132,11 +6178,12 @@ InstallFlags.VsPackageGlobalAssemblyCache, true), ref package); /////////////////////////////////////////////////////////// - InitializeFrameworkList(registry.LocalMachine, + InitializeFrameworkList(configuration.PerUser ? + registry.CurrentUser : registry.LocalMachine, configuration, ref frameworkList); InitializeVsList(configuration.PerUser ? registry.CurrentUser : registry.LocalMachine, configuration, ref vsList); @@ -6251,10 +6298,11 @@ InstallFlags.AssemblyFolders, true)) { if (!ForEachFrameworkRegistry(registry, frameworkList, ProcessAssemblyFolders, configuration.RegistryVersion, directoryData, + configuration.PerUser, NetFxIs32BitOnly || configuration.Wow64, configuration.ThrowOnMissing, configuration.WhatIf, configuration.Verbose, ref error)) { @@ -6283,10 +6331,11 @@ if (!ForEachFrameworkConfig(registry, frameworkList, ProcessDbProviderFactory, configuration.ConfigVersion, InvariantName, ProviderName, Description, FactoryTypeName, coreAssemblyName, directoryData, + configuration.PerUser, NetFxIs32BitOnly || configuration.Wow64, configuration.ThrowOnMissing, configuration.WhatIf, configuration.Verbose, ref saved, ref error)) { @@ -6311,11 +6360,11 @@ InstallFlags.VsPackage, true)) { if (!ForEachVsVersionRegistry(registry, vsList, ProcessVsPackage, configuration.VsVersionSuffix, package, - fileNameData, + fileNameData, configuration.PerUser, VsIs32BitOnly || configuration.Wow64, configuration.ThrowOnMissing, configuration.WhatIf, configuration.Verbose, ref error)) { @@ -6340,11 +6389,11 @@ InstallFlags.VsDataSource, true)) { if (!ForEachVsVersionRegistry(registry, vsList, ProcessVsDataSource, configuration.VsVersionSuffix, package, - fileNameData, + fileNameData, configuration.PerUser, VsIs32BitOnly || configuration.Wow64, configuration.ThrowOnMissing, configuration.WhatIf, configuration.Verbose, ref error)) { @@ -6369,11 +6418,11 @@ InstallFlags.VsDataProvider, true)) { if (!ForEachVsVersionRegistry(registry, vsList, ProcessVsDataProvider, configuration.VsVersionSuffix, package, - fileNameData, + fileNameData, configuration.PerUser, VsIs32BitOnly || configuration.Wow64, configuration.ThrowOnMissing, configuration.WhatIf, configuration.Verbose, ref error)) { Index: www/downloads.wiki ================================================================== --- www/downloads.wiki +++ www/downloads.wiki @@ -262,11 +262,11 @@