aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/ext/ComPlus/ca/cpapproleexec.cpp4
-rw-r--r--src/ext/ComPlus/ca/cpapprolesched.cpp20
-rw-r--r--src/ext/ComPlus/ca/cpappsched.cpp2
-rw-r--r--src/ext/ComPlus/ca/cpasmexec.cpp50
-rw-r--r--src/ext/ComPlus/ca/cpasmsched.cpp2
-rw-r--r--src/ext/ComPlus/ca/cpexec.cpp10
-rw-r--r--src/ext/ComPlus/ca/cppartexec.cpp71
-rw-r--r--src/ext/ComPlus/ca/cppartroleexec.cpp2
-rw-r--r--src/ext/ComPlus/ca/cppartrolesched.cpp4
-rw-r--r--src/ext/ComPlus/ca/cppartsched.cpp14
-rw-r--r--src/ext/ComPlus/ca/cpsched.cpp80
-rw-r--r--src/ext/ComPlus/ca/cpsubsexec.cpp4
-rw-r--r--src/ext/ComPlus/ca/cputilsched.cpp52
-rw-r--r--src/ext/ComPlus/ca/precomp.h2
-rw-r--r--src/ext/ComPlus/wixext/ComPlusTableDefinitions.cs6
-rw-r--r--src/internal/SetBuildNumber/Directory.Packages.props.pp1
-rw-r--r--src/test/burn/WixTestTools/RuntimeFactAttribute.cs30
-rw-r--r--src/test/msi/TestData/ComPlusExtensionTests/Components/TestComponentNET3.dllbin0 -> 16384 bytes
-rw-r--r--src/test/msi/TestData/ComPlusExtensionTests/Components/TestComponentNET3.tlbbin0 -> 2088 bytes
-rw-r--r--src/test/msi/TestData/ComPlusExtensionTests/Components/TestComponentNET4.dllbin0 -> 16384 bytes
-rw-r--r--src/test/msi/TestData/ComPlusExtensionTests/Components/TestComponentNET4.tlbbin0 -> 2088 bytes
-rw-r--r--src/test/msi/TestData/ComPlusExtensionTests/Components/TestComponentNative.dllbin0 -> 56832 bytes
-rw-r--r--src/test/msi/TestData/ComPlusExtensionTests/InstallUninstallNET3WithoutPartitions/InstallUninstallNET3WithoutPartitions.wixproj15
-rw-r--r--src/test/msi/TestData/ComPlusExtensionTests/InstallUninstallNET3WithoutPartitions/product.wxs24
-rw-r--r--src/test/msi/TestData/ComPlusExtensionTests/InstallUninstallNET4WithoutPartitions/InstallUninstallNET4WithoutPartitions.wixproj15
-rw-r--r--src/test/msi/TestData/ComPlusExtensionTests/InstallUninstallNET4WithoutPartitions/product.wxs24
-rw-r--r--src/test/msi/TestData/ComPlusExtensionTests/InstallUninstallNativeWithoutPartitions/InstallUninstallNativeWithoutPartitions.wixproj15
-rw-r--r--src/test/msi/TestData/ComPlusExtensionTests/InstallUninstallNativeWithoutPartitions/product.wxs24
-rw-r--r--src/test/msi/TestData/ComPlusExtensionTests/InstallUninstallWithPartitions/InstallUninstallWithPartitions.wixproj15
-rw-r--r--src/test/msi/TestData/ComPlusExtensionTests/InstallUninstallWithPartitions/product.wxs30
-rw-r--r--src/test/msi/WixToolsetTest.MsiE2E/ComPlusExtensionTests.cs50
31 files changed, 446 insertions, 120 deletions
diff --git a/src/ext/ComPlus/ca/cpapproleexec.cpp b/src/ext/ComPlus/ca/cpapproleexec.cpp
index e3b71e93..4b38b23c 100644
--- a/src/ext/ComPlus/ca/cpapproleexec.cpp
+++ b/src/ext/ComPlus/ca/cpapproleexec.cpp
@@ -74,7 +74,7 @@ HRESULT CpiConfigureApplicationRoles(
74 hr = CpiActionStartMessage(ppwzData, FALSE); 74 hr = CpiActionStartMessage(ppwzData, FALSE);
75 ExitOnFailure(hr, "Failed to send action start message"); 75 ExitOnFailure(hr, "Failed to send action start message");
76 76
77 // ger count 77 // get count
78 int iCnt = 0; 78 int iCnt = 0;
79 hr = WcaReadIntegerFromCaData(ppwzData, &iCnt); 79 hr = WcaReadIntegerFromCaData(ppwzData, &iCnt);
80 ExitOnFailure(hr, "Failed to read count"); 80 ExitOnFailure(hr, "Failed to read count");
@@ -218,7 +218,7 @@ HRESULT CpiConfigureUsersInApplicationRoles(
218 hr = CpiActionStartMessage(ppwzData, FALSE); 218 hr = CpiActionStartMessage(ppwzData, FALSE);
219 ExitOnFailure(hr, "Failed to send action start message"); 219 ExitOnFailure(hr, "Failed to send action start message");
220 220
221 // ger count 221 // get count
222 int iCnt = 0; 222 int iCnt = 0;
223 hr = WcaReadIntegerFromCaData(ppwzData, &iCnt); 223 hr = WcaReadIntegerFromCaData(ppwzData, &iCnt);
224 ExitOnFailure(hr, "Failed to read count"); 224 ExitOnFailure(hr, "Failed to read count");
diff --git a/src/ext/ComPlus/ca/cpapprolesched.cpp b/src/ext/ComPlus/ca/cpapprolesched.cpp
index 04de6b65..a92c340c 100644
--- a/src/ext/ComPlus/ca/cpapprolesched.cpp
+++ b/src/ext/ComPlus/ca/cpapprolesched.cpp
@@ -10,13 +10,13 @@ LPCWSTR vcsApplicationRoleQuery =
10enum eApplicationRoleQuery { arqApplicationRole = 1, arqApplication, arqComponent, arqName }; 10enum eApplicationRoleQuery { arqApplicationRole = 1, arqApplication, arqComponent, arqName };
11 11
12LPCWSTR vcsUserInApplicationRoleQuery = 12LPCWSTR vcsUserInApplicationRoleQuery =
13 L"SELECT `UserInApplicationRole`, `ApplicationRole_`, `ComPlusUserInApplicationRole`.`Component_`, `Domain`, `Name` FROM `Wix4ComPlusUserInApplicationRole`, `Wix4User` WHERE `User_` = `User`"; 13 L"SELECT `UserInApplicationRole`, `ApplicationRole_`, `Wix4ComPlusUserInAppRole`.`Component_`, `Domain`, `Name` FROM `Wix4ComPlusUserInAppRole`, `Wix4User` WHERE `User_` = `User`";
14LPCWSTR vcsGroupInApplicationRoleQuery = 14LPCWSTR vcsGroupInApplicationRoleQuery =
15 L"SELECT `GroupInApplicationRole`, `ApplicationRole_`, `ComPlusGroupInApplicationRole`.`Component_`, `Domain`, `Name` FROM `Wix4ComPlusGroupInApplicationRole`, `Wix4Group` WHERE `Group_` = `Group`"; 15 L"SELECT `GroupInApplicationRole`, `ApplicationRole_`, `Wix4ComPlusGroupInAppRole`.`Component_`, `Domain`, `Name` FROM `Wix4ComPlusGroupInAppRole`, `Wix4Group` WHERE `Group_` = `Group`";
16enum eTrusteeInApplicationRoleQuery { tiarqUserInApplicationRole = 1, tiarqApplicationRole, tiarqComponent, tiarqDomain, tiarqName }; 16enum eTrusteeInApplicationRoleQuery { tiarqUserInApplicationRole = 1, tiarqApplicationRole, tiarqComponent, tiarqDomain, tiarqName };
17 17
18LPCWSTR vcsApplicationRolePropertyQuery = 18LPCWSTR vcsApplicationRolePropertyQuery =
19 L"SELECT `Name`, `Value` FROM `Wix4ComPlusApplicationRoleProperty` WHERE `ApplicationRole_` = ?"; 19 L"SELECT `Name`, `Value` FROM `Wix4ComPlusAppRoleProperty` WHERE `ApplicationRole_` = ?";
20 20
21 21
22// property definitions 22// property definitions
@@ -95,7 +95,7 @@ HRESULT CpiApplicationRolesRead(
95 95
96 // loop through all application roles 96 // loop through all application roles
97 hr = WcaOpenExecuteView(vcsApplicationRoleQuery, &hView); 97 hr = WcaOpenExecuteView(vcsApplicationRoleQuery, &hView);
98 ExitOnFailure(hr, "Failed to execute view on ComPlusApplicationRole table"); 98 ExitOnFailure(hr, "Failed to execute view on Wix4ComPlusApplicationRole table");
99 99
100 while (S_OK == (hr = WcaFetchRecord(hView, &hRec))) 100 while (S_OK == (hr = WcaFetchRecord(hView, &hRec)))
101 { 101 {
@@ -205,7 +205,7 @@ HRESULT CpiApplicationRolesVerifyInstall(
205 if (!pItm->fReferencedForInstall && !(pItm->fHasComponent && WcaIsInstalling(pItm->isInstalled, pItm->isAction))) 205 if (!pItm->fReferencedForInstall && !(pItm->fHasComponent && WcaIsInstalling(pItm->isInstalled, pItm->isAction)))
206 continue; 206 continue;
207 207
208 // if the role is referensed and is not a locater, it must be installed 208 // if the role is referenced and is not a locater, it must be installed
209 if (pItm->fReferencedForInstall && pItm->fHasComponent && !CpiWillBeInstalled(pItm->isInstalled, pItm->isAction)) 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); 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 211
@@ -235,7 +235,7 @@ HRESULT CpiApplicationRolesVerifyInstall(
235 switch (er) 235 switch (er)
236 { 236 {
237 case IDABORT: 237 case IDABORT:
238 ExitOnFailure(hr = E_FAIL, "An application with a conflictiong name exists, key: %S", pItm->wzKey); 238 ExitOnFailure(hr = E_FAIL, "An application with a conflicting name exists, key: %S", pItm->wzKey);
239 break; 239 break;
240 case IDRETRY: 240 case IDRETRY:
241 break; 241 break;
@@ -319,7 +319,7 @@ HRESULT CpiApplicationRolesInstall(
319 int iActionType; 319 int iActionType;
320 320
321 // add action text 321 // add action text
322 hr = CpiAddActionTextToActionData(L"CreateComPlusApplicationRoles", ppwzActionData); 322 hr = CpiAddActionTextToActionData(CUSTOM_ACTION_DECORATION(L"CreateComPlusApplicationRoles"), ppwzActionData);
323 ExitOnFailure(hr, "Failed to add action text to custom action data"); 323 ExitOnFailure(hr, "Failed to add action text to custom action data");
324 324
325 // add count to action data 325 // add count to action data
@@ -371,7 +371,7 @@ HRESULT CpiApplicationRolesUninstall(
371 int iActionType; 371 int iActionType;
372 372
373 // add action text 373 // add action text
374 hr = CpiAddActionTextToActionData(L"RemoveComPlusApplicationRoles", ppwzActionData); 374 hr = CpiAddActionTextToActionData(CUSTOM_ACTION_DECORATION(L"RemoveComPlusApplicationRoles"), ppwzActionData);
375 ExitOnFailure(hr, "Failed to add action text to custom action data"); 375 ExitOnFailure(hr, "Failed to add action text to custom action data");
376 376
377 // add count to action data 377 // add count to action data
@@ -477,7 +477,7 @@ HRESULT CpiUsersInApplicationRolesInstall(
477 int iActionType; 477 int iActionType;
478 478
479 // add action text 479 // add action text
480 hr = CpiAddActionTextToActionData(L"AddUsersToComPlusApplicationRoles", ppwzActionData); 480 hr = CpiAddActionTextToActionData(CUSTOM_ACTION_DECORATION(L"AddUsersToComPlusApplicationRoles"), ppwzActionData);
481 ExitOnFailure(hr, "Failed to add action text to custom action data"); 481 ExitOnFailure(hr, "Failed to add action text to custom action data");
482 482
483 // add count to action data 483 // add count to action data
@@ -529,7 +529,7 @@ HRESULT CpiUsersInApplicationRolesUninstall(
529 int iActionType; 529 int iActionType;
530 530
531 // add action text 531 // add action text
532 hr = CpiAddActionTextToActionData(L"RemoveUsersFromComPlusAppRoles", ppwzActionData); 532 hr = CpiAddActionTextToActionData(CUSTOM_ACTION_DECORATION(L"RemoveUsersFromComPlusAppRoles"), ppwzActionData);
533 ExitOnFailure(hr, "Failed to add action text to custom action data"); 533 ExitOnFailure(hr, "Failed to add action text to custom action data");
534 534
535 // add count to action data 535 // add count to action data
diff --git a/src/ext/ComPlus/ca/cpappsched.cpp b/src/ext/ComPlus/ca/cpappsched.cpp
index 4d867f6b..bcd3bb75 100644
--- a/src/ext/ComPlus/ca/cpappsched.cpp
+++ b/src/ext/ComPlus/ca/cpappsched.cpp
@@ -255,7 +255,7 @@ HRESULT CpiApplicationsVerifyInstall(
255 if (!pItm->fReferencedForInstall && !(pItm->fHasComponent && WcaIsInstalling(pItm->isInstalled, pItm->isAction))) 255 if (!pItm->fReferencedForInstall && !(pItm->fHasComponent && WcaIsInstalling(pItm->isInstalled, pItm->isAction)))
256 continue; 256 continue;
257 257
258 // if the application is referensed and is not a locater, it must be installed 258 // if the application is referenced and is not a locater, it must be installed
259 if (pItm->fReferencedForInstall && pItm->fHasComponent && !CpiWillBeInstalled(pItm->isInstalled, pItm->isAction)) 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); 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 261
diff --git a/src/ext/ComPlus/ca/cpasmexec.cpp b/src/ext/ComPlus/ca/cpasmexec.cpp
index 3d140027..af6c7eff 100644
--- a/src/ext/ComPlus/ca/cpasmexec.cpp
+++ b/src/ext/ComPlus/ca/cpasmexec.cpp
@@ -1,7 +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. 1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2 2
3#include "precomp.h" 3#include "precomp.h"
4 4#include <mscoree.h>
5 5
6// GAC related declarations 6// GAC related declarations
7 7
@@ -61,13 +61,11 @@ public:
61 61
62typedef HRESULT (__stdcall *LoadLibraryShimFunc)(LPCWSTR szDllName, LPCWSTR szVersion, LPVOID pvReserved, HMODULE *phModDll); 62typedef HRESULT (__stdcall *LoadLibraryShimFunc)(LPCWSTR szDllName, LPCWSTR szVersion, LPVOID pvReserved, HMODULE *phModDll);
63typedef HRESULT (__stdcall *CreateAssemblyCacheFunc)(IAssemblyCache **ppAsmCache, DWORD dwReserved); 63typedef HRESULT (__stdcall *CreateAssemblyCacheFunc)(IAssemblyCache **ppAsmCache, DWORD dwReserved);
64typedef HRESULT (__stdcall *GetFileVersionFnPtr)(LPCWSTR szFilename, _Out_writes_to_opt_(cchBuffer, *dwLength) LPWSTR szBuffer, DWORD cchBuffer, DWORD* dwLength);
65typedef HRESULT (__stdcall *CorBindToRuntimeExFnPtr)(LPCWSTR pwszVersion, LPCWSTR pwszBuildFlavor, DWORD startupFlags, REFCLSID rclsid, REFIID riid, LPVOID FAR* ppv);
64 66
65 67
66// RegistrationHelper related declarations 68// RegistrationHelper related declarations
67
68static const GUID CLSID_RegistrationHelper =
69 { 0x89a86e7b, 0xc229, 0x4008, { 0x9b, 0xaa, 0x2f, 0x5c, 0x84, 0x11, 0xd7, 0xe0 } };
70
71enum eInstallationFlags { 69enum eInstallationFlags {
72 ifConfigureComponentsOnly = 16, 70 ifConfigureComponentsOnly = 16,
73 ifFindOrCreateTargetApplication = 4, 71 ifFindOrCreateTargetApplication = 4,
@@ -156,7 +154,8 @@ static HRESULT UnregisterAssembly(
156static void InitAssemblyExec(); 154static void InitAssemblyExec();
157static void UninitAssemblyExec(); 155static void UninitAssemblyExec();
158static HRESULT GetRegistrationHelper( 156static HRESULT GetRegistrationHelper(
159 IDispatch** ppiRegHlp 157 IDispatch** ppiRegHlp,
158 LPCWSTR pwzAssemblyPath
160 ); 159 );
161static HRESULT GetAssemblyCacheObject( 160static HRESULT GetAssemblyCacheObject(
162 IAssemblyCache** ppAssemblyCache 161 IAssemblyCache** ppAssemblyCache
@@ -722,15 +721,44 @@ static void UninitAssemblyExec()
722} 721}
723 722
724static HRESULT GetRegistrationHelper( 723static HRESULT GetRegistrationHelper(
725 IDispatch** ppiRegHlp 724 IDispatch** ppiRegHlp,
725 LPCWSTR pwzAssemblyPath
726 ) 726 )
727{ 727{
728 HRESULT hr = S_OK; 728 HRESULT hr = S_OK;
729 wchar_t pwzVersion[MAX_PATH];
730 DWORD pcchVersionLen = MAX_PATH;
731 ICLRRuntimeHost* runtimeHost = NULL;
732
733 if (!ghMscoree)
734 {
735 ghMscoree = ::LoadLibraryW(L"mscoree.dll");
736 ExitOnNull(ghMscoree, hr, E_FAIL, "Failed to load mscoree.dll");
737 }
738 GetFileVersionFnPtr GetFileVersion = (GetFileVersionFnPtr)::GetProcAddress(ghMscoree, "GetFileVersion");
739 ExitOnNull(GetFileVersion, hr, E_FAIL, "Failed to GetProcAddress for 'GetFileVersion' from 'mscoree.dll'");
740 hr = GetFileVersion(pwzAssemblyPath, pwzVersion, pcchVersionLen, &pcchVersionLen);
729 741
730 if (!gpiRegHlp) 742 if (!gpiRegHlp)
731 { 743 {
744 CLSID CLSID_RegistrationHelper{};
745 hr = ::CLSIDFromProgID(OLESTR("System.EnterpriseServices.RegistrationHelper"), &CLSID_RegistrationHelper);
746 ExitOnFailure(hr, "Failed to identify CLSID for 'System.EnterpriseServices.RegistrationHelper'");
747
748 // NOTE: The 'CoreBindToRuntimeEx' method is DEPRECATED in .NET v4.
749 // HOWEVER, we might be running in an earlier context at this point so we don't want to rely upon stuff that is particularly v4 dependent.
750 // Even if we are about to try to fire up a v4 runtime.
751 // The .NET v4 runtime with STARTUP_LOADER_SAFEMODE flag (to disable version checking of loaded assemblies) is what lets us launch the
752 // RegistrationHelper. The v4 RegistrationHelper is able to register both v4 and v3 assemblies however, so if we can get it, we most as well
753 // use it.
754 CorBindToRuntimeExFnPtr CorBindToRuntimeEx = (CorBindToRuntimeExFnPtr)::GetProcAddress(ghMscoree, "CorBindToRuntimeEx");
755 hr = CorBindToRuntimeEx(L"v4.0.30319", L"wks", STARTUP_LOADER_SAFEMODE, CLSID_CLRRuntimeHost, IID_ICLRRuntimeHost, (LPVOID*)&runtimeHost);
756 // we ignore the HRESULT here. If it worked, great, we'll use it moving forward. If it didn't work, we'll end up trying to resort to legacy .NET FW
757 // when we just try the COM Create below
758
732 // create registration helper object 759 // create registration helper object
733 hr = ::CoCreateInstance(CLSID_RegistrationHelper, NULL, CLSCTX_ALL, IID_IDispatch, (void**)&gpiRegHlp); 760 // This will be created in the .NET FW 4 version if we managed to launch it above, or in the .NET FW <4 version based on the COM dispatch otherwise
761 hr = ::CoCreateInstance(CLSID_RegistrationHelper, NULL, CLSCTX_ALL, IID_IDispatch, (void**)&gpiRegHlp);
734 ExitOnFailure(hr, "Failed to create registration helper object"); 762 ExitOnFailure(hr, "Failed to create registration helper object");
735 } 763 }
736 764
@@ -883,7 +911,7 @@ static HRESULT RegisterDotNetAssembly(
883 } 911 }
884 912
885 // get registration helper object 913 // get registration helper object
886 hr = GetRegistrationHelper(&piRegHlp); 914 hr = GetRegistrationHelper(&piRegHlp, pAttrs->pwzDllPath);
887 ExitOnFailure(hr, "Failed to get registration helper object"); 915 ExitOnFailure(hr, "Failed to get registration helper object");
888 916
889 // get dispatch id of InstallAssembly() method 917 // get dispatch id of InstallAssembly() method
@@ -979,7 +1007,7 @@ static HRESULT RegisterNativeAssembly(
979 ExitOnNull(bstrTlbPath, hr, E_OUTOFMEMORY, "Failed to allocate BSTR for tlb path"); 1007 ExitOnNull(bstrTlbPath, hr, E_OUTOFMEMORY, "Failed to allocate BSTR for tlb path");
980 1008
981 bstrPSDllPath = ::SysAllocString(pAttrs->pwzPSDllPath ? pAttrs->pwzPSDllPath : L""); 1009 bstrPSDllPath = ::SysAllocString(pAttrs->pwzPSDllPath ? pAttrs->pwzPSDllPath : L"");
982 ExitOnNull(bstrPSDllPath, hr, E_OUTOFMEMORY, "Failed to allocate BSTR for tlb path"); 1010 ExitOnNull(bstrPSDllPath, hr, E_OUTOFMEMORY, "Failed to allocate BSTR for proxy/stub dll path");
983 1011
984 // get catalog 1012 // get catalog
985 hr = CpiExecGetAdminCatalog(&piCatalog); 1013 hr = CpiExecGetAdminCatalog(&piCatalog);
@@ -1089,7 +1117,7 @@ static HRESULT UnregisterDotNetAssembly(
1089 ExitOnNull(bstrDllPath, hr, E_OUTOFMEMORY, "Failed to allocate BSTR for dll path"); 1117 ExitOnNull(bstrDllPath, hr, E_OUTOFMEMORY, "Failed to allocate BSTR for dll path");
1090 1118
1091 // get registration helper object 1119 // get registration helper object
1092 hr = GetRegistrationHelper(&piRegHlp); 1120 hr = GetRegistrationHelper(&piRegHlp, pAttrs->pwzDllPath);
1093 ExitOnFailure(hr, "Failed to get registration helper object"); 1121 ExitOnFailure(hr, "Failed to get registration helper object");
1094 1122
1095 // get dispatch id of UninstallAssembly() method 1123 // get dispatch id of UninstallAssembly() method
diff --git a/src/ext/ComPlus/ca/cpasmsched.cpp b/src/ext/ComPlus/ca/cpasmsched.cpp
index 325808de..044b2ef8 100644
--- a/src/ext/ComPlus/ca/cpasmsched.cpp
+++ b/src/ext/ComPlus/ca/cpasmsched.cpp
@@ -408,7 +408,7 @@ HRESULT CpiAssembliesVerifyInstall(
408 if (!pItm->fReferencedForInstall && !pItm->iRoleAssignmentsInstallCount && !WcaIsInstalling(pItm->isInstalled, pItm->isAction)) 408 if (!pItm->fReferencedForInstall && !pItm->iRoleAssignmentsInstallCount && !WcaIsInstalling(pItm->isInstalled, pItm->isAction))
409 continue; 409 continue;
410 410
411 // if the assembly is referensed, it must be installed 411 // if the assembly is referenced, it must be installed
412 if ((pItm->fReferencedForInstall || pItm->iRoleAssignmentsInstallCount) && !CpiWillBeInstalled(pItm->isInstalled, pItm->isAction)) 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); 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 } 414 }
diff --git a/src/ext/ComPlus/ca/cpexec.cpp b/src/ext/ComPlus/ca/cpexec.cpp
index 9b1691fc..a915dd34 100644
--- a/src/ext/ComPlus/ca/cpexec.cpp
+++ b/src/ext/ComPlus/ca/cpexec.cpp
@@ -180,7 +180,7 @@ LExit:
180 if (INVALID_HANDLE_VALUE != hRollbackFile) 180 if (INVALID_HANDLE_VALUE != hRollbackFile)
181 ::CloseHandle(hRollbackFile); 181 ::CloseHandle(hRollbackFile);
182 182
183 // unitialize 183 // uninitialize
184 CpiExecFinalize(); 184 CpiExecFinalize();
185 185
186 if (fInitializedCom) 186 if (fInitializedCom)
@@ -258,7 +258,7 @@ LExit:
258 if (INVALID_HANDLE_VALUE != hRollbackFile) 258 if (INVALID_HANDLE_VALUE != hRollbackFile)
259 ::CloseHandle(hRollbackFile); 259 ::CloseHandle(hRollbackFile);
260 260
261 // unitialize 261 // uninitialize
262 CpiExecFinalize(); 262 CpiExecFinalize();
263 263
264 if (fInitializedCom) 264 if (fInitializedCom)
@@ -415,7 +415,7 @@ LExit:
415 if (prdSubscriptions) 415 if (prdSubscriptions)
416 CpiFreeRollbackDataList(prdSubscriptions); 416 CpiFreeRollbackDataList(prdSubscriptions);
417 417
418 // unitialize 418 // uninitialize
419 CpiExecFinalize(); 419 CpiExecFinalize();
420 420
421 if (fInitializedCom) 421 if (fInitializedCom)
@@ -521,7 +521,7 @@ LExit:
521 if (INVALID_HANDLE_VALUE != hRollbackFile) 521 if (INVALID_HANDLE_VALUE != hRollbackFile)
522 ::CloseHandle(hRollbackFile); 522 ::CloseHandle(hRollbackFile);
523 523
524 // unitialize 524 // uninitialize
525 CpiExecFinalize(); 525 CpiExecFinalize();
526 526
527 if (fInitializedCom) 527 if (fInitializedCom)
@@ -670,7 +670,7 @@ LExit:
670 if (prdSubscriptions) 670 if (prdSubscriptions)
671 CpiFreeRollbackDataList(prdSubscriptions); 671 CpiFreeRollbackDataList(prdSubscriptions);
672 672
673 // unitialize 673 // uninitialize
674 CpiExecFinalize(); 674 CpiExecFinalize();
675 675
676 if (fInitializedCom) 676 if (fInitializedCom)
diff --git a/src/ext/ComPlus/ca/cppartexec.cpp b/src/ext/ComPlus/ca/cppartexec.cpp
index 673bdaf9..06aa16f4 100644
--- a/src/ext/ComPlus/ca/cppartexec.cpp
+++ b/src/ext/ComPlus/ca/cppartexec.cpp
@@ -34,6 +34,7 @@ static HRESULT ReadPartitionAttributes(
34static void FreePartitionAttributes( 34static void FreePartitionAttributes(
35 CPI_PARTITION_ATTRIBUTES* pAttrs 35 CPI_PARTITION_ATTRIBUTES* pAttrs
36 ); 36 );
37static HRESULT CpiEnsurePartitionsEnabled();
37static HRESULT CreatePartition( 38static HRESULT CreatePartition(
38 CPI_PARTITION_ATTRIBUTES* pAttrs 39 CPI_PARTITION_ATTRIBUTES* pAttrs
39 ); 40 );
@@ -71,7 +72,7 @@ HRESULT CpiConfigurePartitions(
71 hr = CpiActionStartMessage(ppwzData, FALSE); 72 hr = CpiActionStartMessage(ppwzData, FALSE);
72 ExitOnFailure(hr, "Failed to send action start message"); 73 ExitOnFailure(hr, "Failed to send action start message");
73 74
74 // ger partition count 75 // get partition count
75 int iCnt = 0; 76 int iCnt = 0;
76 hr = WcaReadIntegerFromCaData(ppwzData, &iCnt); 77 hr = WcaReadIntegerFromCaData(ppwzData, &iCnt);
77 ExitOnFailure(hr, "Failed to read count"); 78 ExitOnFailure(hr, "Failed to read count");
@@ -215,7 +216,7 @@ HRESULT CpiConfigurePartitionUsers(
215 hr = CpiActionStartMessage(ppwzData, FALSE); 216 hr = CpiActionStartMessage(ppwzData, FALSE);
216 ExitOnFailure(hr, "Failed to send action start message"); 217 ExitOnFailure(hr, "Failed to send action start message");
217 218
218 // ger partition count 219 // get partition count
219 int iCnt = 0; 220 int iCnt = 0;
220 hr = WcaReadIntegerFromCaData(ppwzData, &iCnt); 221 hr = WcaReadIntegerFromCaData(ppwzData, &iCnt);
221 ExitOnFailure(hr, "Failed to read count"); 222 ExitOnFailure(hr, "Failed to read count");
@@ -384,6 +385,69 @@ static void FreePartitionAttributes(
384 CpiFreePropertyList(pAttrs->pPropList); 385 CpiFreePropertyList(pAttrs->pPropList);
385} 386}
386 387
388static HRESULT CpiEnsurePartitionsEnabled()
389{
390 HRESULT hr = S_OK;
391
392 ICatalogCollection* piLocalComputerColl = NULL;
393 IDispatch* piDisp = NULL;
394 ICatalogObject* piLocalComputerObj = NULL;
395 VARIANT vtVal;
396 BSTR bsPartitionsEnabledName = ::SysAllocString(L"PartitionsEnabled");
397 long numChanges = 0;
398
399 ::VariantInit(&vtVal);
400
401 // get collection
402 hr = CpiExecGetCatalogCollection(L"LocalComputer", &piLocalComputerColl);
403 ExitOnFailure(hr, "Failed to get catalog collection");
404
405 // find object, there will be only one in the LocalComputer collection
406 hr = piLocalComputerColl->get_Item(0, &piDisp);
407 ExitOnFailure(hr, "Failed to get object from collection");
408
409 hr = piDisp->QueryInterface(IID_ICatalogObject, (void**)&piLocalComputerObj);
410 ExitOnFailure(hr, "Failed to get IID_ICatalogObject interface");
411
412 // and then we get the value of the PartitionsEnabled property
413 hr = piLocalComputerObj->get_Value(bsPartitionsEnabledName, &vtVal);
414 if (!vtVal.boolVal)
415 {
416 vtVal.boolVal = true;
417 hr = piLocalComputerObj->put_Value(bsPartitionsEnabledName, vtVal);
418 ExitOnFailure(hr, "Failed to put value to Enable COM+ PartitionsEnabled property");
419 hr = piLocalComputerColl->SaveChanges(&numChanges);
420 ExitOnFailure(hr, "Failed to save PartitionsEnabled property");
421
422 // we'll read back the hopefully updated values of the PartitionsEnabled property
423 // if it's still False, then we're on a Windows Desktop that doesn't allow Partitions
424 // (as of Windows Server2003 Microsoft limited Partitions to only ServerOS platforms)
425 hr = piLocalComputerObj->get_Value(bsPartitionsEnabledName, &vtVal);
426 ExitOnFailure(hr, "Failed to read PartitionsEnabled property");
427 }
428
429 if (vtVal.boolVal)
430 {
431 // everything went well, we have the Partitioning available
432 hr = S_OK;
433 }
434 else
435 {
436 // we're on a Desktop OS, or couldn't otherwise enable partitioning
437 WcaLog(LOGMSG_STANDARD, "Failed to Enable COM+ PartitionEnabled property. This suggests Partitioning was attempted on a Desktop OS, which is not supported");
438 hr = S_FALSE;
439 }
440
441LExit:
442 // clean up
443 ReleaseObject(piLocalComputerColl);
444 ReleaseObject(piLocalComputerObj);
445 ReleaseBSTR(bsPartitionsEnabledName);
446 ::VariantClear(&vtVal);
447
448 return hr;
449}
450
387static HRESULT CreatePartition( 451static HRESULT CreatePartition(
388 CPI_PARTITION_ATTRIBUTES* pAttrs 452 CPI_PARTITION_ATTRIBUTES* pAttrs
389 ) 453 )
@@ -408,6 +472,9 @@ static HRESULT CreatePartition(
408 472
409 if (S_FALSE == hr) 473 if (S_FALSE == hr)
410 { 474 {
475 hr = CpiEnsurePartitionsEnabled();
476 ExitOnFailure(hr, "Failed to enable partitions");
477
411 // create partition 478 // create partition
412 hr = CpiAddCollectionObject(piPartColl, &piPartObj); 479 hr = CpiAddCollectionObject(piPartColl, &piPartObj);
413 ExitOnFailure(hr, "Failed to add partition to collection"); 480 ExitOnFailure(hr, "Failed to add partition to collection");
diff --git a/src/ext/ComPlus/ca/cppartroleexec.cpp b/src/ext/ComPlus/ca/cppartroleexec.cpp
index 4a503c79..910473e0 100644
--- a/src/ext/ComPlus/ca/cppartroleexec.cpp
+++ b/src/ext/ComPlus/ca/cppartroleexec.cpp
@@ -49,7 +49,7 @@ HRESULT CpiConfigureUsersInPartitionRoles(
49 hr = CpiActionStartMessage(ppwzData, FALSE); 49 hr = CpiActionStartMessage(ppwzData, FALSE);
50 ExitOnFailure(hr, "Failed to send action start message"); 50 ExitOnFailure(hr, "Failed to send action start message");
51 51
52 // ger count 52 // get count
53 int iCnt = 0; 53 int iCnt = 0;
54 hr = WcaReadIntegerFromCaData(ppwzData, &iCnt); 54 hr = WcaReadIntegerFromCaData(ppwzData, &iCnt);
55 ExitOnFailure(hr, "Failed to read count"); 55 ExitOnFailure(hr, "Failed to read count");
diff --git a/src/ext/ComPlus/ca/cppartrolesched.cpp b/src/ext/ComPlus/ca/cppartrolesched.cpp
index 0ca4bf0c..b2fb5118 100644
--- a/src/ext/ComPlus/ca/cppartrolesched.cpp
+++ b/src/ext/ComPlus/ca/cppartrolesched.cpp
@@ -10,9 +10,9 @@ LPCWSTR vcsPartitionRoleQuery =
10enum ePartitionRoleQuery { prqPartitionRole = 1, prqPartition, prqComponent, prqName }; 10enum ePartitionRoleQuery { prqPartitionRole = 1, prqPartition, prqComponent, prqName };
11 11
12LPCWSTR vcsUserInPartitionRoleQuery = 12LPCWSTR vcsUserInPartitionRoleQuery =
13 L"SELECT `UserInPartitionRole`, `PartitionRole_`, `ComPlusUserInPartitionRole`.`Component_`, `Domain`, `Name` FROM `Wix4ComPlusUserInPartitionRole`, `Wix4User` WHERE `User_` = `User`"; 13 L"SELECT `UserInPartitionRole`, `PartitionRole_`, `Wix4ComPlusUserInPartitionRole`.`Component_`, `Domain`, `Name` FROM `Wix4ComPlusUserInPartitionRole`, `Wix4User` WHERE `User_` = `User`";
14LPCWSTR vcsGroupInPartitionRoleQuery = 14LPCWSTR vcsGroupInPartitionRoleQuery =
15 L"SELECT `GroupInPartitionRole`, `PartitionRole_`, `ComPlusGroupInPartitionRole`.`Component_`, `Domain`, `Name` FROM `Wix4ComPlusGroupInPartitionRole`, `Wix4Group` WHERE `Group_` = `Group`"; 15 L"SELECT `GroupInPartitionRole`, `PartitionRole_`, `Wix4ComPlusGroupInPartitionRole`.`Component_`, `Domain`, `Name` FROM `Wix4ComPlusGroupInPartitionRole`, `Wix4Group` WHERE `Group_` = `Group`";
16enum eTrusteeInPartitionRoleQuery { tiprqUserInPartitionRole = 1, tiprqPartitionRole, tiprqComponent, tiprqDomain, tiprqName }; 16enum eTrusteeInPartitionRoleQuery { tiprqUserInPartitionRole = 1, tiprqPartitionRole, tiprqComponent, tiprqDomain, tiprqName };
17 17
18 18
diff --git a/src/ext/ComPlus/ca/cppartsched.cpp b/src/ext/ComPlus/ca/cppartsched.cpp
index d4065d34..b4c1c314 100644
--- a/src/ext/ComPlus/ca/cppartsched.cpp
+++ b/src/ext/ComPlus/ca/cppartsched.cpp
@@ -13,7 +13,7 @@ LPCWSTR vcsPartitionPropertyQuery =
13 L"SELECT `Name`, `Value` FROM `Wix4ComPlusPartitionProperty` WHERE `Partition_` = ?"; 13 L"SELECT `Name`, `Value` FROM `Wix4ComPlusPartitionProperty` WHERE `Partition_` = ?";
14 14
15LPCWSTR vcsPartitionUserQuery = 15LPCWSTR vcsPartitionUserQuery =
16 L"SELECT `PartitionUser`, `Partition_`, `ComPlusPartitionUser`.`Component_`, `Domain`, `Name` FROM `Wix4ComPlusPartitionUser`, `Wix4User` WHERE `User_` = `User`"; 16 L"SELECT `PartitionUser`, `Partition_`, `Wix4ComPlusPartitionUser`.`Component_`, `Domain`, `Name` FROM `Wix4ComPlusPartitionUser`, `Wix4User` WHERE `User_` = `User`";
17enum ePartitionUserQuery { puqPartitionUser = 1, puqPartition, puqComponent, puqDomain, puqName }; 17enum ePartitionUserQuery { puqPartitionUser = 1, puqPartition, puqComponent, puqDomain, puqName };
18 18
19 19
@@ -192,7 +192,7 @@ HRESULT CpiPartitionsVerifyInstall(
192 if (!pItm->fReferencedForInstall && !(pItm->fHasComponent && WcaIsInstalling(pItm->isInstalled, pItm->isAction))) 192 if (!pItm->fReferencedForInstall && !(pItm->fHasComponent && WcaIsInstalling(pItm->isInstalled, pItm->isAction)))
193 continue; 193 continue;
194 194
195 // if the partition is referensed and is not a locater, it must be installed 195 // if the partition is referenced and is not a locater, it must be installed
196 if (pItm->fReferencedForInstall && pItm->fHasComponent && !CpiWillBeInstalled(pItm->isInstalled, pItm->isAction)) 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); 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 198
@@ -281,7 +281,7 @@ HRESULT CpiPartitionsVerifyInstall(
281 { 281 {
282 case IDCANCEL: 282 case IDCANCEL:
283 case IDABORT: 283 case IDABORT:
284 ExitOnFailure(hr = E_FAIL, "A partition with a conflictiong name or id exists, key: %S", pItm->wzKey); 284 ExitOnFailure(hr = E_FAIL, "A partition with a conflicting name or id exists, key: %S", pItm->wzKey);
285 break; 285 break;
286 case IDRETRY: 286 case IDRETRY:
287 break; 287 break;
@@ -403,7 +403,7 @@ HRESULT CpiPartitionsInstall(
403 int iActionType; 403 int iActionType;
404 404
405 // add action text 405 // add action text
406 hr = CpiAddActionTextToActionData(L"CreateComPlusPartitions", ppwzActionData); 406 hr = CpiAddActionTextToActionData(CUSTOM_ACTION_DECORATION(L"CreateComPlusPartitions"), ppwzActionData);
407 ExitOnFailure(hr, "Failed to add action text to custom action data"); 407 ExitOnFailure(hr, "Failed to add action text to custom action data");
408 408
409 // add partition count to action data 409 // add partition count to action data
@@ -455,7 +455,7 @@ HRESULT CpiPartitionsUninstall(
455 int iActionType; 455 int iActionType;
456 456
457 // add action text 457 // add action text
458 hr = CpiAddActionTextToActionData(L"RemoveComPlusPartitions", ppwzActionData); 458 hr = CpiAddActionTextToActionData(CUSTOM_ACTION_DECORATION(L"RemoveComPlusPartitions"), ppwzActionData);
459 ExitOnFailure(hr, "Failed to add action text to custom action data"); 459 ExitOnFailure(hr, "Failed to add action text to custom action data");
460 460
461 // add partition count to action data 461 // add partition count to action data
@@ -735,7 +735,7 @@ HRESULT CpiPartitionUsersInstall(
735 int iActionType; 735 int iActionType;
736 736
737 // add action text 737 // add action text
738 hr = CpiAddActionTextToActionData(L"AddComPlusPartitionUsers", ppwzActionData); 738 hr = CpiAddActionTextToActionData(CUSTOM_ACTION_DECORATION(L"AddComPlusPartitionUsers"), ppwzActionData);
739 ExitOnFailure(hr, "Failed to add action text to custom action data"); 739 ExitOnFailure(hr, "Failed to add action text to custom action data");
740 740
741 // add partition count to action data 741 // add partition count to action data
@@ -787,7 +787,7 @@ HRESULT CpiPartitionUsersUninstall(
787 int iActionType; 787 int iActionType;
788 788
789 // add action text 789 // add action text
790 hr = CpiAddActionTextToActionData(L"RemoveComPlusPartitionUsers", ppwzActionData); 790 hr = CpiAddActionTextToActionData(CUSTOM_ACTION_DECORATION(L"RemoveComPlusPartitionUsers"), ppwzActionData);
791 ExitOnFailure(hr, "Failed to add action text to custom action data"); 791 ExitOnFailure(hr, "Failed to add action text to custom action data");
792 792
793 // add partition count to action data 793 // add partition count to action data
diff --git a/src/ext/ComPlus/ca/cpsched.cpp b/src/ext/ComPlus/ca/cpsched.cpp
index ebc547ae..acde3cd3 100644
--- a/src/ext/ComPlus/ca/cpsched.cpp
+++ b/src/ext/ComPlus/ca/cpsched.cpp
@@ -3,31 +3,17 @@
3#include "precomp.h" 3#include "precomp.h"
4 4
5 5
6#ifdef _WIN64 6#define CP_COMPLUSROLLBACKINSTALLPREPARE CUSTOM_ACTION_DECORATION(L"ComPlusRollbackInstallPrepare")
7#define CP_COMPLUSROLLBACKINSTALLPREPARE L"ComPlusRollbackInstallPrepare_64" 7#define CP_COMPLUSINSTALLPREPARE CUSTOM_ACTION_DECORATION(L"ComPlusInstallPrepare")
8#define CP_COMPLUSINSTALLPREPARE L"ComPlusInstallPrepare_64" 8#define CP_COMPLUSROLLBACKINSTALLEXECUTE CUSTOM_ACTION_DECORATION(L"ComPlusRollbackInstallExecute")
9#define CP_COMPLUSROLLBACKINSTALLEXECUTE L"ComPlusRollbackInstallExecute_64" 9#define CP_COMPLUSINSTALLEXECUTE CUSTOM_ACTION_DECORATION(L"ComPlusInstallExecute")
10#define CP_COMPLUSINSTALLEXECUTE L"ComPlusInstallExecute_64" 10#define CP_COMPLUSINSTALLEXECUTECOMMIT CUSTOM_ACTION_DECORATION(L"ComPlusInstallExecuteCommit")
11#define CP_COMPLUSINSTALLEXECUTECOMMIT L"ComPlusInstallExecuteCommit_64" 11#define CP_COMPLUSINSTALLCOMMIT CUSTOM_ACTION_DECORATION(L"ComPlusInstallCommit")
12#define CP_COMPLUSINSTALLCOMMIT L"ComPlusInstallCommit_64" 12#define CP_COMPLUSROLLBACKINSTALLPREPARE CUSTOM_ACTION_DECORATION(L"ComPlusRollbackInstallPrepare")
13#define CP_COMPLUSROLLBACKINSTALLPREPARE L"ComPlusRollbackInstallPrepare_64" 13#define CP_COMPLUSINSTALLPREPARE CUSTOM_ACTION_DECORATION(L"ComPlusInstallPrepare")
14#define CP_COMPLUSINSTALLPREPARE L"ComPlusInstallPrepare_64" 14#define CP_COMPLUSROLLBACKUNINSTALLEXECUTE CUSTOM_ACTION_DECORATION(L"ComPlusRollbackUninstallExecute")
15#define CP_COMPLUSROLLBACKUNINSTALLEXECUTE L"ComPlusRollbackUninstallExecute_64" 15#define CP_COMPLUSUNINSTALLEXECUTE CUSTOM_ACTION_DECORATION(L"ComPlusUninstallExecute")
16#define CP_COMPLUSUNINSTALLEXECUTE L"ComPlusUninstallExecute_64" 16#define CP_COMPLUSINSTALLCOMMIT CUSTOM_ACTION_DECORATION(L"ComPlusInstallCommit")
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 17
32/******************************************************************** 18/********************************************************************
33 ConfigureComPlusInstall - CUSTOM ACTION ENTRY POINT for installing COM+ components 19 ConfigureComPlusInstall - CUSTOM ACTION ENTRY POINT for installing COM+ components
@@ -81,7 +67,7 @@ extern "C" UINT __stdcall ConfigureComPlusInstall(MSIHANDLE hInstall)
81 67
82 CpiSchedInitialize(); 68 CpiSchedInitialize();
83 69
84 // check for the prerequsite tables 70 // check for the prerequisite tables
85 if (!CpiTableExists(cptComPlusPartition) && !CpiTableExists(cptComPlusApplication) && !CpiTableExists(cptComPlusAssembly)) 71 if (!CpiTableExists(cptComPlusPartition) && !CpiTableExists(cptComPlusApplication) && !CpiTableExists(cptComPlusAssembly))
86 { 72 {
87 WcaLog(LOGMSG_VERBOSE, "skipping install COM+ CustomAction, no ComPlusPartition, ComPlusApplication or ComPlusAssembly table present"); 73 WcaLog(LOGMSG_VERBOSE, "skipping install COM+ CustomAction, no ComPlusPartition, ComPlusApplication or ComPlusAssembly table present");
@@ -117,55 +103,55 @@ extern "C" UINT __stdcall ConfigureComPlusInstall(MSIHANDLE hInstall)
117 if (502 <= iVersionNT && CpiTableExists(cptComPlusPartition)) 103 if (502 <= iVersionNT && CpiTableExists(cptComPlusPartition))
118 { 104 {
119 hr = CpiPartitionsRead(&partList); 105 hr = CpiPartitionsRead(&partList);
120 MessageExitOnFailure(hr, msierrComPlusPartitionReadFailed, "Failed to read ComPlusPartitions table"); 106 MessageExitOnFailure(hr, msierrComPlusPartitionReadFailed, "Failed to read Wix4ComPlusPartitions table");
121 } 107 }
122 108
123 if (502 <= iVersionNT && CpiTableExists(cptComPlusPartitionRole)) 109 if (502 <= iVersionNT && CpiTableExists(cptComPlusPartitionRole))
124 { 110 {
125 hr = CpiPartitionRolesRead(&partList, &partRoleList); 111 hr = CpiPartitionRolesRead(&partList, &partRoleList);
126 MessageExitOnFailure(hr, msierrComPlusPartitionRoleReadFailed, "Failed to read ComPlusPartitionRole table"); 112 MessageExitOnFailure(hr, msierrComPlusPartitionRoleReadFailed, "Failed to read Wix4ComPlusPartitionRole table");
127 } 113 }
128 114
129 if (502 <= iVersionNT && (CpiTableExists(cptComPlusUserInPartitionRole) || CpiTableExists(cptComPlusGroupInPartitionRole))) 115 if (502 <= iVersionNT && (CpiTableExists(cptComPlusUserInPartitionRole) || CpiTableExists(cptComPlusGroupInPartitionRole)))
130 { 116 {
131 hr = CpiUsersInPartitionRolesRead(&partRoleList, &usrInPartRoleList); 117 hr = CpiUsersInPartitionRolesRead(&partRoleList, &usrInPartRoleList);
132 MessageExitOnFailure(hr, msierrComPlusUserInPartitionRoleReadFailed, "Failed to read ComPlusUserInPartitionRole table"); 118 MessageExitOnFailure(hr, msierrComPlusUserInPartitionRoleReadFailed, "Failed to read Wix4ComPlusUserInPartitionRole table");
133 } 119 }
134 120
135 if (502 <= iVersionNT && CpiTableExists(cptComPlusPartitionUser)) 121 if (502 <= iVersionNT && CpiTableExists(cptComPlusPartitionUser))
136 { 122 {
137 hr = CpiPartitionUsersRead(&partList, &partUsrList); 123 hr = CpiPartitionUsersRead(&partList, &partUsrList);
138 MessageExitOnFailure(hr, msierrComPlusPartitionUserReadFailed, "Failed to read ComPlusPartitionUser table"); 124 MessageExitOnFailure(hr, msierrComPlusPartitionUserReadFailed, "Failed to read Wix4ComPlusPartitionUser table");
139 } 125 }
140 126
141 if (CpiTableExists(cptComPlusApplication)) 127 if (CpiTableExists(cptComPlusApplication))
142 { 128 {
143 hr = CpiApplicationsRead(&partList, &appList); 129 hr = CpiApplicationsRead(&partList, &appList);
144 MessageExitOnFailure(hr, msierrComPlusApplicationReadFailed, "Failed to read ComPlusApplication table"); 130 MessageExitOnFailure(hr, msierrComPlusApplicationReadFailed, "Failed to read Wix4ComPlusApplication table");
145 } 131 }
146 132
147 if (CpiTableExists(cptComPlusApplicationRole)) 133 if (CpiTableExists(cptComPlusApplicationRole))
148 { 134 {
149 hr = CpiApplicationRolesRead(&appList, &appRoleList); 135 hr = CpiApplicationRolesRead(&appList, &appRoleList);
150 MessageExitOnFailure(hr, msierrComPlusApplicationRoleReadFailed, "Failed to read ComPlusApplicationRole table"); 136 MessageExitOnFailure(hr, msierrComPlusApplicationRoleReadFailed, "Failed to read Wix4ComPlusApplicationRole table");
151 } 137 }
152 138
153 if (CpiTableExists(cptComPlusUserInApplicationRole) || CpiTableExists(cptComPlusGroupInApplicationRole)) 139 if (CpiTableExists(cptComPlusUserInApplicationRole) || CpiTableExists(cptComPlusGroupInApplicationRole))
154 { 140 {
155 hr = CpiUsersInApplicationRolesRead(&appRoleList, &usrInAppRoleList); 141 hr = CpiUsersInApplicationRolesRead(&appRoleList, &usrInAppRoleList);
156 MessageExitOnFailure(hr, msierrComPlusUserInApplicationRoleReadFailed, "Failed to read ComPlusUserInApplicationRole table"); 142 MessageExitOnFailure(hr, msierrComPlusUserInApplicationRoleReadFailed, "Failed to read Wix4ComPlusUserInApplicationRole table");
157 } 143 }
158 144
159 if (CpiTableExists(cptComPlusAssembly)) 145 if (CpiTableExists(cptComPlusAssembly))
160 { 146 {
161 hr = CpiAssembliesRead(&appList, &appRoleList, &asmList); 147 hr = CpiAssembliesRead(&appList, &appRoleList, &asmList);
162 MessageExitOnFailure(hr, msierrComPlusAssembliesReadFailed, "Failed to read ComPlusAssembly table"); 148 MessageExitOnFailure(hr, msierrComPlusAssembliesReadFailed, "Failed to read Wix4ComPlusAssembly table");
163 } 149 }
164 150
165 if (CpiTableExists(cptComPlusSubscription)) 151 if (CpiTableExists(cptComPlusSubscription))
166 { 152 {
167 hr = CpiSubscriptionsRead(&asmList, &subList); 153 hr = CpiSubscriptionsRead(&asmList, &subList);
168 MessageExitOnFailure(hr, msierrComPlusSubscriptionReadFailed, "Failed to read ComPlusSubscription table"); 154 MessageExitOnFailure(hr, msierrComPlusSubscriptionReadFailed, "Failed to read Wix4ComPlusSubscription table");
169 } 155 }
170 156
171 // verify elements 157 // verify elements
@@ -295,7 +281,7 @@ LExit:
295 CpiAssemblyListFree(&asmList); 281 CpiAssemblyListFree(&asmList);
296 CpiSubscriptionListFree(&subList); 282 CpiSubscriptionListFree(&subList);
297 283
298 // unitialize 284 // uninitialize
299 CpiSchedFinalize(); 285 CpiSchedFinalize();
300 286
301 if (fInitializedCom) 287 if (fInitializedCom)
@@ -359,7 +345,7 @@ extern "C" UINT __stdcall ConfigureComPlusUninstall(MSIHANDLE hInstall)
359 // check for the prerequsite tables 345 // check for the prerequsite tables
360 if (!CpiTableExists(cptComPlusPartition) && !CpiTableExists(cptComPlusApplication) && !CpiTableExists(cptComPlusAssembly)) 346 if (!CpiTableExists(cptComPlusPartition) && !CpiTableExists(cptComPlusApplication) && !CpiTableExists(cptComPlusAssembly))
361 { 347 {
362 WcaLog(LOGMSG_VERBOSE, "skipping uninstall COM+ CustomAction, no ComPlusPartition, ComPlusApplication or ComPlusAssembly table present"); 348 WcaLog(LOGMSG_VERBOSE, "skipping uninstall COM+ CustomAction, no Wix4ComPlusPartition, Wix4ComPlusApplication or Wix4ComPlusAssembly table present");
363 ExitFunction1(hr = S_FALSE); 349 ExitFunction1(hr = S_FALSE);
364 } 350 }
365 351
@@ -392,55 +378,55 @@ extern "C" UINT __stdcall ConfigureComPlusUninstall(MSIHANDLE hInstall)
392 if (502 <= iVersionNT && CpiTableExists(cptComPlusPartition)) 378 if (502 <= iVersionNT && CpiTableExists(cptComPlusPartition))
393 { 379 {
394 hr = CpiPartitionsRead(&partList); 380 hr = CpiPartitionsRead(&partList);
395 MessageExitOnFailure(hr, msierrComPlusPartitionReadFailed, "Failed to read ComPlusPartitions table"); 381 MessageExitOnFailure(hr, msierrComPlusPartitionReadFailed, "Failed to read Wix4ComPlusPartitions table");
396 } 382 }
397 383
398 if (502 <= iVersionNT && CpiTableExists(cptComPlusPartitionRole)) 384 if (502 <= iVersionNT && CpiTableExists(cptComPlusPartitionRole))
399 { 385 {
400 hr = CpiPartitionRolesRead(&partList, &partRoleList); 386 hr = CpiPartitionRolesRead(&partList, &partRoleList);
401 MessageExitOnFailure(hr, msierrComPlusPartitionRoleReadFailed, "Failed to read ComPlusPartitionRole table"); 387 MessageExitOnFailure(hr, msierrComPlusPartitionRoleReadFailed, "Failed to read Wix4ComPlusPartitionRole table");
402 } 388 }
403 389
404 if (502 <= iVersionNT && (CpiTableExists(cptComPlusUserInPartitionRole) || CpiTableExists(cptComPlusGroupInPartitionRole))) 390 if (502 <= iVersionNT && (CpiTableExists(cptComPlusUserInPartitionRole) || CpiTableExists(cptComPlusGroupInPartitionRole)))
405 { 391 {
406 hr = CpiUsersInPartitionRolesRead(&partRoleList, &usrInPartRoleList); 392 hr = CpiUsersInPartitionRolesRead(&partRoleList, &usrInPartRoleList);
407 MessageExitOnFailure(hr, msierrComPlusUserInPartitionRoleReadFailed, "Failed to read ComPlusUserInPartitionRole table"); 393 MessageExitOnFailure(hr, msierrComPlusUserInPartitionRoleReadFailed, "Failed to read Wix4ComPlusUserInPartitionRole table");
408 } 394 }
409 395
410 if (502 <= iVersionNT && CpiTableExists(cptComPlusPartitionUser)) 396 if (502 <= iVersionNT && CpiTableExists(cptComPlusPartitionUser))
411 { 397 {
412 hr = CpiPartitionUsersRead(&partList, &partUsrList); 398 hr = CpiPartitionUsersRead(&partList, &partUsrList);
413 MessageExitOnFailure(hr, msierrComPlusPartitionUserReadFailed, "Failed to read ComPlusPartitionUser table"); 399 MessageExitOnFailure(hr, msierrComPlusPartitionUserReadFailed, "Failed to read Wix4ComPlusPartitionUser table");
414 } 400 }
415 401
416 if (CpiTableExists(cptComPlusApplication)) 402 if (CpiTableExists(cptComPlusApplication))
417 { 403 {
418 hr = CpiApplicationsRead(&partList, &appList); 404 hr = CpiApplicationsRead(&partList, &appList);
419 MessageExitOnFailure(hr, msierrComPlusApplicationReadFailed, "Failed to read ComPlusApplication table"); 405 MessageExitOnFailure(hr, msierrComPlusApplicationReadFailed, "Failed to read Wix4ComPlusApplication table");
420 } 406 }
421 407
422 if (CpiTableExists(cptComPlusApplicationRole)) 408 if (CpiTableExists(cptComPlusApplicationRole))
423 { 409 {
424 hr = CpiApplicationRolesRead(&appList, &appRoleList); 410 hr = CpiApplicationRolesRead(&appList, &appRoleList);
425 MessageExitOnFailure(hr, msierrComPlusApplicationRoleReadFailed, "Failed to read ComPlusApplicationRole table"); 411 MessageExitOnFailure(hr, msierrComPlusApplicationRoleReadFailed, "Failed to read Wix4ComPlusApplicationRole table");
426 } 412 }
427 413
428 if (CpiTableExists(cptComPlusUserInApplicationRole) || CpiTableExists(cptComPlusGroupInApplicationRole)) 414 if (CpiTableExists(cptComPlusUserInApplicationRole) || CpiTableExists(cptComPlusGroupInApplicationRole))
429 { 415 {
430 hr = CpiUsersInApplicationRolesRead(&appRoleList, &usrInAppRoleList); 416 hr = CpiUsersInApplicationRolesRead(&appRoleList, &usrInAppRoleList);
431 MessageExitOnFailure(hr, msierrComPlusUserInApplicationRoleReadFailed, "Failed to read ComPlusUserInApplicationRole table"); 417 MessageExitOnFailure(hr, msierrComPlusUserInApplicationRoleReadFailed, "Failed to read Wix4ComPlusUserInApplicationRole table");
432 } 418 }
433 419
434 if (CpiTableExists(cptComPlusAssembly)) 420 if (CpiTableExists(cptComPlusAssembly))
435 { 421 {
436 hr = CpiAssembliesRead(&appList, &appRoleList, &asmList); 422 hr = CpiAssembliesRead(&appList, &appRoleList, &asmList);
437 MessageExitOnFailure(hr, msierrComPlusAssembliesReadFailed, "Failed to read ComPlusAssembly table"); 423 MessageExitOnFailure(hr, msierrComPlusAssembliesReadFailed, "Failed to read Wix4ComPlusAssembly table");
438 } 424 }
439 425
440 if (CpiTableExists(cptComPlusSubscription)) 426 if (CpiTableExists(cptComPlusSubscription))
441 { 427 {
442 hr = CpiSubscriptionsRead(&asmList, &subList); 428 hr = CpiSubscriptionsRead(&asmList, &subList);
443 MessageExitOnFailure(hr, msierrComPlusSubscriptionReadFailed, "Failed to read ComPlusSubscription table"); 429 MessageExitOnFailure(hr, msierrComPlusSubscriptionReadFailed, "Failed to read Wix4ComPlusSubscription table");
444 } 430 }
445 431
446 // verify elements 432 // verify elements
@@ -555,7 +541,7 @@ LExit:
555 CpiAssemblyListFree(&asmList); 541 CpiAssemblyListFree(&asmList);
556 CpiSubscriptionListFree(&subList); 542 CpiSubscriptionListFree(&subList);
557 543
558 // unitialize 544 // uninitialize
559 CpiSchedFinalize(); 545 CpiSchedFinalize();
560 546
561 if (fInitializedCom) 547 if (fInitializedCom)
diff --git a/src/ext/ComPlus/ca/cpsubsexec.cpp b/src/ext/ComPlus/ca/cpsubsexec.cpp
index bbcf9853..ab32b856 100644
--- a/src/ext/ComPlus/ca/cpsubsexec.cpp
+++ b/src/ext/ComPlus/ca/cpsubsexec.cpp
@@ -54,7 +54,7 @@ HRESULT CpiConfigureSubscriptions(
54 hr = CpiActionStartMessage(ppwzData, FALSE); 54 hr = CpiActionStartMessage(ppwzData, FALSE);
55 ExitOnFailure(hr, "Failed to send action start message"); 55 ExitOnFailure(hr, "Failed to send action start message");
56 56
57 // ger count 57 // get count
58 int iCnt = 0; 58 int iCnt = 0;
59 hr = WcaReadIntegerFromCaData(ppwzData, &iCnt); 59 hr = WcaReadIntegerFromCaData(ppwzData, &iCnt);
60 ExitOnFailure(hr, "Failed to read count"); 60 ExitOnFailure(hr, "Failed to read count");
@@ -127,7 +127,7 @@ HRESULT CpiRollbackConfigureSubscriptions(
127 hr = CpiActionStartMessage(ppwzData, NULL == pRollbackDataList); 127 hr = CpiActionStartMessage(ppwzData, NULL == pRollbackDataList);
128 ExitOnFailure(hr, "Failed to send action start message"); 128 ExitOnFailure(hr, "Failed to send action start message");
129 129
130 // ger count 130 // get count
131 int iCnt = 0; 131 int iCnt = 0;
132 hr = WcaReadIntegerFromCaData(ppwzData, &iCnt); 132 hr = WcaReadIntegerFromCaData(ppwzData, &iCnt);
133 ExitOnFailure(hr, "Failed to read count"); 133 ExitOnFailure(hr, "Failed to read count");
diff --git a/src/ext/ComPlus/ca/cputilsched.cpp b/src/ext/ComPlus/ca/cputilsched.cpp
index 4a2fdfc6..760b5ec9 100644
--- a/src/ext/ComPlus/ca/cputilsched.cpp
+++ b/src/ext/ComPlus/ca/cputilsched.cpp
@@ -53,31 +53,31 @@ void CpiSchedInitialize()
53 // tables 53 // tables
54 giTables = 0; 54 giTables = 0;
55 55
56 if (S_OK == WcaTableExists(L"ComPlusPartition")) giTables |= cptComPlusPartition; 56 if (S_OK == WcaTableExists(L"Wix4ComPlusPartition")) giTables |= cptComPlusPartition;
57 if (S_OK == WcaTableExists(L"ComPlusPartitionProperty")) giTables |= cptComPlusPartitionProperty; 57 if (S_OK == WcaTableExists(L"Wix4ComPlusPartitionProperty")) giTables |= cptComPlusPartitionProperty;
58 if (S_OK == WcaTableExists(L"ComPlusPartitionRole")) giTables |= cptComPlusPartitionRole; 58 if (S_OK == WcaTableExists(L"Wix4ComPlusPartitionRole")) giTables |= cptComPlusPartitionRole;
59 if (S_OK == WcaTableExists(L"ComPlusUserInPartitionRole")) giTables |= cptComPlusUserInPartitionRole; 59 if (S_OK == WcaTableExists(L"Wix4ComPlusUserInPartitionRole")) giTables |= cptComPlusUserInPartitionRole;
60 if (S_OK == WcaTableExists(L"ComPlusGroupInPartitionRole")) giTables |= cptComPlusGroupInPartitionRole; 60 if (S_OK == WcaTableExists(L"Wix4ComPlusGroupInPartitionRole")) giTables |= cptComPlusGroupInPartitionRole;
61 if (S_OK == WcaTableExists(L"ComPlusPartitionUser")) giTables |= cptComPlusPartitionUser; 61 if (S_OK == WcaTableExists(L"Wix4ComPlusPartitionUser")) giTables |= cptComPlusPartitionUser;
62 if (S_OK == WcaTableExists(L"ComPlusApplication")) giTables |= cptComPlusApplication; 62 if (S_OK == WcaTableExists(L"Wix4ComPlusApplication")) giTables |= cptComPlusApplication;
63 if (S_OK == WcaTableExists(L"ComPlusApplicationProperty")) giTables |= cptComPlusApplicationProperty; 63 if (S_OK == WcaTableExists(L"Wix4ComPlusApplicationProperty")) giTables |= cptComPlusApplicationProperty;
64 if (S_OK == WcaTableExists(L"ComPlusApplicationRole")) giTables |= cptComPlusApplicationRole; 64 if (S_OK == WcaTableExists(L"Wix4ComPlusApplicationRole")) giTables |= cptComPlusApplicationRole;
65 if (S_OK == WcaTableExists(L"ComPlusApplicationRoleProperty")) giTables |= cptComPlusApplicationRoleProperty; 65 if (S_OK == WcaTableExists(L"Wix4ComPlusAppRoleProperty")) giTables |= cptComPlusApplicationRoleProperty;
66 if (S_OK == WcaTableExists(L"ComPlusUserInApplicationRole")) giTables |= cptComPlusUserInApplicationRole; 66 if (S_OK == WcaTableExists(L"Wix4ComPlusUserInAppRole")) giTables |= cptComPlusUserInApplicationRole;
67 if (S_OK == WcaTableExists(L"ComPlusGroupInApplicationRole")) giTables |= cptComPlusGroupInApplicationRole; 67 if (S_OK == WcaTableExists(L"Wix4ComPlusGroupInAppRole")) giTables |= cptComPlusGroupInApplicationRole;
68 if (S_OK == WcaTableExists(L"ComPlusAssembly")) giTables |= cptComPlusAssembly; 68 if (S_OK == WcaTableExists(L"Wix4ComPlusAssembly")) giTables |= cptComPlusAssembly;
69 if (S_OK == WcaTableExists(L"ComPlusAssemblyDependency")) giTables |= cptComPlusAssemblyDependency; 69 if (S_OK == WcaTableExists(L"Wix4ComPlusAssemblyDependency")) giTables |= cptComPlusAssemblyDependency;
70 if (S_OK == WcaTableExists(L"ComPlusComponent")) giTables |= cptComPlusComponent; 70 if (S_OK == WcaTableExists(L"Wix4ComPlusComponent")) giTables |= cptComPlusComponent;
71 if (S_OK == WcaTableExists(L"ComPlusComponentProperty")) giTables |= cptComPlusComponentProperty; 71 if (S_OK == WcaTableExists(L"Wix4ComPlusComponentProperty")) giTables |= cptComPlusComponentProperty;
72 if (S_OK == WcaTableExists(L"ComPlusRoleForComponent")) giTables |= cptComPlusRoleForComponent; 72 if (S_OK == WcaTableExists(L"Wix4ComPlusRoleForComponent")) giTables |= cptComPlusRoleForComponent;
73 if (S_OK == WcaTableExists(L"ComPlusInterface")) giTables |= cptComPlusInterface; 73 if (S_OK == WcaTableExists(L"Wix4ComPlusInterface")) giTables |= cptComPlusInterface;
74 if (S_OK == WcaTableExists(L"ComPlusInterfaceProperty")) giTables |= cptComPlusInterfaceProperty; 74 if (S_OK == WcaTableExists(L"Wix4ComPlusInterfaceProperty")) giTables |= cptComPlusInterfaceProperty;
75 if (S_OK == WcaTableExists(L"ComPlusRoleForInterface")) giTables |= cptComPlusRoleForInterface; 75 if (S_OK == WcaTableExists(L"Wix4ComPlusRoleForInterface")) giTables |= cptComPlusRoleForInterface;
76 if (S_OK == WcaTableExists(L"ComPlusMethod")) giTables |= cptComPlusMethod; 76 if (S_OK == WcaTableExists(L"Wix4ComPlusMethod")) giTables |= cptComPlusMethod;
77 if (S_OK == WcaTableExists(L"ComPlusMethodProperty")) giTables |= cptComPlusMethodProperty; 77 if (S_OK == WcaTableExists(L"Wix4ComPlusMethodProperty")) giTables |= cptComPlusMethodProperty;
78 if (S_OK == WcaTableExists(L"ComPlusRoleForMethod")) giTables |= cptComPlusRoleForMethod; 78 if (S_OK == WcaTableExists(L"Wix4ComPlusRoleForMethod")) giTables |= cptComPlusRoleForMethod;
79 if (S_OK == WcaTableExists(L"ComPlusSubscription")) giTables |= cptComPlusSubscription; 79 if (S_OK == WcaTableExists(L"Wix4ComPlusSubscription")) giTables |= cptComPlusSubscription;
80 if (S_OK == WcaTableExists(L"ComPlusSubscriptionProperty")) giTables |= cptComPlusSubscriptionProperty; 80 if (S_OK == WcaTableExists(L"Wix4ComPlusSubscriptionProperty")) giTables |= cptComPlusSubscriptionProperty;
81} 81}
82 82
83void CpiSchedFinalize() 83void CpiSchedFinalize()
@@ -137,7 +137,7 @@ HRESULT CpiSchedGetCatalogCollection(
137 hr = CpiSchedGetAdminCatalog(&piCatalog); 137 hr = CpiSchedGetAdminCatalog(&piCatalog);
138 ExitOnFailure(hr, "Failed to get COM+ admin catalog"); 138 ExitOnFailure(hr, "Failed to get COM+ admin catalog");
139 139
140 // get collecton from catalog 140 // get collection from catalog
141 hr = piCatalog->GetCollection(bstrName, &piDisp); 141 hr = piCatalog->GetCollection(bstrName, &piDisp);
142 ExitOnFailure(hr, "Failed to get collection"); 142 ExitOnFailure(hr, "Failed to get collection");
143 143
diff --git a/src/ext/ComPlus/ca/precomp.h b/src/ext/ComPlus/ca/precomp.h
index 74c328d2..97aa8e97 100644
--- a/src/ext/ComPlus/ca/precomp.h
+++ b/src/ext/ComPlus/ca/precomp.h
@@ -31,3 +31,5 @@
31#include "cpapprolesched.h" 31#include "cpapprolesched.h"
32#include "cpasmsched.h" 32#include "cpasmsched.h"
33#include "cpsubssched.h" 33#include "cpsubssched.h"
34
35#include "..\..\caDecor.h"
diff --git a/src/ext/ComPlus/wixext/ComPlusTableDefinitions.cs b/src/ext/ComPlus/wixext/ComPlusTableDefinitions.cs
index 6af5045c..cffaff0d 100644
--- a/src/ext/ComPlus/wixext/ComPlusTableDefinitions.cs
+++ b/src/ext/ComPlus/wixext/ComPlusTableDefinitions.cs
@@ -123,7 +123,7 @@ namespace WixToolset.ComPlus
123 ); 123 );
124 124
125 public static readonly TableDefinition ComPlusApplicationRoleProperty = new TableDefinition( 125 public static readonly TableDefinition ComPlusApplicationRoleProperty = new TableDefinition(
126 "Wix4ComPlusApplicationRoleProperty", 126 "Wix4ComPlusAppRoleProperty",
127 ComPlusSymbolDefinitions.ComPlusApplicationRoleProperty, 127 ComPlusSymbolDefinitions.ComPlusApplicationRoleProperty,
128 new[] 128 new[]
129 { 129 {
@@ -135,7 +135,7 @@ namespace WixToolset.ComPlus
135 ); 135 );
136 136
137 public static readonly TableDefinition ComPlusUserInApplicationRole = new TableDefinition( 137 public static readonly TableDefinition ComPlusUserInApplicationRole = new TableDefinition(
138 "Wix4ComPlusUserInApplicationRole", 138 "Wix4ComPlusUserInAppRole",
139 ComPlusSymbolDefinitions.ComPlusUserInApplicationRole, 139 ComPlusSymbolDefinitions.ComPlusUserInApplicationRole,
140 new[] 140 new[]
141 { 141 {
@@ -148,7 +148,7 @@ namespace WixToolset.ComPlus
148 ); 148 );
149 149
150 public static readonly TableDefinition ComPlusGroupInApplicationRole = new TableDefinition( 150 public static readonly TableDefinition ComPlusGroupInApplicationRole = new TableDefinition(
151 "Wix4ComPlusGroupInApplicationRole", 151 "Wix4ComPlusGroupInAppRole",
152 ComPlusSymbolDefinitions.ComPlusGroupInApplicationRole, 152 ComPlusSymbolDefinitions.ComPlusGroupInApplicationRole,
153 new[] 153 new[]
154 { 154 {
diff --git a/src/internal/SetBuildNumber/Directory.Packages.props.pp b/src/internal/SetBuildNumber/Directory.Packages.props.pp
index 552aab87..4085568f 100644
--- a/src/internal/SetBuildNumber/Directory.Packages.props.pp
+++ b/src/internal/SetBuildNumber/Directory.Packages.props.pp
@@ -33,6 +33,7 @@
33 33
34 <PackageVersion Include="WixToolset.Bal.wixext" Version="{packageversion}" /> 34 <PackageVersion Include="WixToolset.Bal.wixext" Version="{packageversion}" />
35 <PackageVersion Include="WixToolset.BootstrapperApplications.wixext" Version="{packageversion}" /> 35 <PackageVersion Include="WixToolset.BootstrapperApplications.wixext" Version="{packageversion}" />
36 <PackageVersion Include="WixToolset.ComPlus.wixext" Version="{packageversion}" />
36 <PackageVersion Include="WixToolset.Dependency.wixext" Version="{packageversion}" /> 37 <PackageVersion Include="WixToolset.Dependency.wixext" Version="{packageversion}" />
37 <PackageVersion Include="WixToolset.NetFx.wixext" Version="{packageversion}" /> 38 <PackageVersion Include="WixToolset.NetFx.wixext" Version="{packageversion}" />
38 <PackageVersion Include="WixToolset.UI.wixext" Version="{packageversion}" /> 39 <PackageVersion Include="WixToolset.UI.wixext" Version="{packageversion}" />
diff --git a/src/test/burn/WixTestTools/RuntimeFactAttribute.cs b/src/test/burn/WixTestTools/RuntimeFactAttribute.cs
index f73c87a2..573a9de2 100644
--- a/src/test/burn/WixTestTools/RuntimeFactAttribute.cs
+++ b/src/test/burn/WixTestTools/RuntimeFactAttribute.cs
@@ -5,6 +5,7 @@ namespace WixTestTools
5 using System; 5 using System;
6 using System.Security.Principal; 6 using System.Security.Principal;
7 using WixInternal.TestSupport.XunitExtensions; 7 using WixInternal.TestSupport.XunitExtensions;
8 using System.Runtime.InteropServices;
8 9
9 public class RuntimeFactAttribute : SkippableFactAttribute 10 public class RuntimeFactAttribute : SkippableFactAttribute
10 { 11 {
@@ -12,6 +13,16 @@ namespace WixTestTools
12 13
13 public static bool RuntimeTestsEnabled { get; } 14 public static bool RuntimeTestsEnabled { get; }
14 public static bool RunningAsAdministrator { get; } 15 public static bool RunningAsAdministrator { get; }
16 public static bool RunningOnWindowsServer { get; }
17
18 [DllImport("shlwapi.dll", SetLastError = true, EntryPoint = "#437")]
19 private static extern bool IsOS(int os);
20 private static bool IsWindowsServer()
21 {
22 const int OS_ANYSERVER = 29;
23 return IsOS(OS_ANYSERVER);
24 }
25
15 26
16 static RuntimeFactAttribute() 27 static RuntimeFactAttribute()
17 { 28 {
@@ -21,6 +32,25 @@ namespace WixTestTools
21 32
22 var testsEnabledString = Environment.GetEnvironmentVariable(RequiredEnvironmentVariableName); 33 var testsEnabledString = Environment.GetEnvironmentVariable(RequiredEnvironmentVariableName);
23 RuntimeTestsEnabled = Boolean.TryParse(testsEnabledString, out var testsEnabled) && testsEnabled; 34 RuntimeTestsEnabled = Boolean.TryParse(testsEnabledString, out var testsEnabled) && testsEnabled;
35
36 RunningOnWindowsServer = IsWindowsServer();
37 }
38
39 private bool _RequireWindowsServer;
40 public bool RequireWindowsServer
41 {
42 get
43 {
44 return _RequireWindowsServer;
45 }
46 set
47 {
48 _RequireWindowsServer = value;
49 if (_RequireWindowsServer && !RunningOnWindowsServer)
50 {
51 this.Skip = $"These tests are only run on Windows Server";
52 }
53 }
24 } 54 }
25 55
26 public RuntimeFactAttribute() 56 public RuntimeFactAttribute()
diff --git a/src/test/msi/TestData/ComPlusExtensionTests/Components/TestComponentNET3.dll b/src/test/msi/TestData/ComPlusExtensionTests/Components/TestComponentNET3.dll
new file mode 100644
index 00000000..b46be649
--- /dev/null
+++ b/src/test/msi/TestData/ComPlusExtensionTests/Components/TestComponentNET3.dll
Binary files differ
diff --git a/src/test/msi/TestData/ComPlusExtensionTests/Components/TestComponentNET3.tlb b/src/test/msi/TestData/ComPlusExtensionTests/Components/TestComponentNET3.tlb
new file mode 100644
index 00000000..87419ee1
--- /dev/null
+++ b/src/test/msi/TestData/ComPlusExtensionTests/Components/TestComponentNET3.tlb
Binary files differ
diff --git a/src/test/msi/TestData/ComPlusExtensionTests/Components/TestComponentNET4.dll b/src/test/msi/TestData/ComPlusExtensionTests/Components/TestComponentNET4.dll
new file mode 100644
index 00000000..e0fd3dee
--- /dev/null
+++ b/src/test/msi/TestData/ComPlusExtensionTests/Components/TestComponentNET4.dll
Binary files differ
diff --git a/src/test/msi/TestData/ComPlusExtensionTests/Components/TestComponentNET4.tlb b/src/test/msi/TestData/ComPlusExtensionTests/Components/TestComponentNET4.tlb
new file mode 100644
index 00000000..63647bdc
--- /dev/null
+++ b/src/test/msi/TestData/ComPlusExtensionTests/Components/TestComponentNET4.tlb
Binary files differ
diff --git a/src/test/msi/TestData/ComPlusExtensionTests/Components/TestComponentNative.dll b/src/test/msi/TestData/ComPlusExtensionTests/Components/TestComponentNative.dll
new file mode 100644
index 00000000..dbcb5807
--- /dev/null
+++ b/src/test/msi/TestData/ComPlusExtensionTests/Components/TestComponentNative.dll
Binary files differ
diff --git a/src/test/msi/TestData/ComPlusExtensionTests/InstallUninstallNET3WithoutPartitions/InstallUninstallNET3WithoutPartitions.wixproj b/src/test/msi/TestData/ComPlusExtensionTests/InstallUninstallNET3WithoutPartitions/InstallUninstallNET3WithoutPartitions.wixproj
new file mode 100644
index 00000000..19382c83
--- /dev/null
+++ b/src/test/msi/TestData/ComPlusExtensionTests/InstallUninstallNET3WithoutPartitions/InstallUninstallNET3WithoutPartitions.wixproj
@@ -0,0 +1,15 @@
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 Sdk="WixToolset.Sdk">
4 <PropertyGroup>
5 <UpgradeCode>{A3E0B539-63F9-4B43-9E34-F33AE1C6E06D}</UpgradeCode>
6 <ProductComponentsRef>true</ProductComponentsRef>
7 </PropertyGroup>
8 <ItemGroup>
9 <Compile Include="..\..\Templates\Product.wxs" Link="Product.wxs" />
10 </ItemGroup>
11 <ItemGroup>
12 <PackageReference Include="WixToolset.Util.wixext" />
13 <PackageReference Include="WixToolset.ComPlus.wixext" />
14 </ItemGroup>
15</Project>
diff --git a/src/test/msi/TestData/ComPlusExtensionTests/InstallUninstallNET3WithoutPartitions/product.wxs b/src/test/msi/TestData/ComPlusExtensionTests/InstallUninstallNET3WithoutPartitions/product.wxs
new file mode 100644
index 00000000..129669cc
--- /dev/null
+++ b/src/test/msi/TestData/ComPlusExtensionTests/InstallUninstallNET3WithoutPartitions/product.wxs
@@ -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
3
4<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs"
5 xmlns:util="http://wixtoolset.org/schemas/v4/wxs/util"
6 xmlns:complus="http://wixtoolset.org/schemas/v4/wxs/complus">
7 <Fragment>
8 <ComponentGroup Id="ProductComponents">
9 <ComponentRef Id="Component1" />
10 </ComponentGroup>
11 </Fragment>
12
13 <Fragment>
14 <Component Id="Component1" Guid="09624A9A-4BBC-4126-BBF9-0713C5217DB1" Directory="INSTALLFOLDER">
15 <File Id="AssemblyFileNET" Source="../Components/TestComponentNET3.dll" KeyPath="yes" />
16 <File Id="TlbFileNET" Source="../Components/TestComponentNET3.tlb" />
17 <complus:ComPlusApplication Id="APPLICATION" Name="ComPlus .NET 3 Application" Description="ComPlus Application" >
18 <complus:ComPlusAssembly Id="ASSEMBLY_NET" Type=".net" DllPath="[#AssemblyFileNET]" TlbPath="[#TlbFileNET]" >
19 <complus:ComPlusComponent Id="MyComNET3" CLSID="17F82C39-5433-493A-A396-36072C645B80" />
20 </complus:ComPlusAssembly>
21 </complus:ComPlusApplication>
22 </Component>
23 </Fragment>
24</Wix>
diff --git a/src/test/msi/TestData/ComPlusExtensionTests/InstallUninstallNET4WithoutPartitions/InstallUninstallNET4WithoutPartitions.wixproj b/src/test/msi/TestData/ComPlusExtensionTests/InstallUninstallNET4WithoutPartitions/InstallUninstallNET4WithoutPartitions.wixproj
new file mode 100644
index 00000000..19382c83
--- /dev/null
+++ b/src/test/msi/TestData/ComPlusExtensionTests/InstallUninstallNET4WithoutPartitions/InstallUninstallNET4WithoutPartitions.wixproj
@@ -0,0 +1,15 @@
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 Sdk="WixToolset.Sdk">
4 <PropertyGroup>
5 <UpgradeCode>{A3E0B539-63F9-4B43-9E34-F33AE1C6E06D}</UpgradeCode>
6 <ProductComponentsRef>true</ProductComponentsRef>
7 </PropertyGroup>
8 <ItemGroup>
9 <Compile Include="..\..\Templates\Product.wxs" Link="Product.wxs" />
10 </ItemGroup>
11 <ItemGroup>
12 <PackageReference Include="WixToolset.Util.wixext" />
13 <PackageReference Include="WixToolset.ComPlus.wixext" />
14 </ItemGroup>
15</Project>
diff --git a/src/test/msi/TestData/ComPlusExtensionTests/InstallUninstallNET4WithoutPartitions/product.wxs b/src/test/msi/TestData/ComPlusExtensionTests/InstallUninstallNET4WithoutPartitions/product.wxs
new file mode 100644
index 00000000..eabd7794
--- /dev/null
+++ b/src/test/msi/TestData/ComPlusExtensionTests/InstallUninstallNET4WithoutPartitions/product.wxs
@@ -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
3
4<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs"
5 xmlns:util="http://wixtoolset.org/schemas/v4/wxs/util"
6 xmlns:complus="http://wixtoolset.org/schemas/v4/wxs/complus">
7 <Fragment>
8 <ComponentGroup Id="ProductComponents">
9 <ComponentRef Id="Component1" />
10 </ComponentGroup>
11 </Fragment>
12
13 <Fragment>
14 <Component Id="Component1" Guid="09624A9A-4BBC-4126-BBF9-0713C5217DB1" Directory="INSTALLFOLDER">
15 <File Id="AssemblyFileNET" Source="../Components/TestComponentNET4.dll" KeyPath="yes" />
16 <File Id="TlbFileNET" Source="../Components/TestComponentNET4.tlb" />
17 <complus:ComPlusApplication Id="APPLICATION" Name="ComPlus .NET 4 Application" Description="ComPlus Application" >
18 <complus:ComPlusAssembly Id="ASSEMBLY_NET" Type=".net" DllPath="[#AssemblyFileNET]" TlbPath="[#TlbFileNET]" >
19 <complus:ComPlusComponent Id="MyComNET4" CLSID="146AB3A2-4472-4DB9-94D5-311536E799BD" />
20 </complus:ComPlusAssembly>
21 </complus:ComPlusApplication>
22 </Component>
23 </Fragment>
24</Wix>
diff --git a/src/test/msi/TestData/ComPlusExtensionTests/InstallUninstallNativeWithoutPartitions/InstallUninstallNativeWithoutPartitions.wixproj b/src/test/msi/TestData/ComPlusExtensionTests/InstallUninstallNativeWithoutPartitions/InstallUninstallNativeWithoutPartitions.wixproj
new file mode 100644
index 00000000..19382c83
--- /dev/null
+++ b/src/test/msi/TestData/ComPlusExtensionTests/InstallUninstallNativeWithoutPartitions/InstallUninstallNativeWithoutPartitions.wixproj
@@ -0,0 +1,15 @@
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 Sdk="WixToolset.Sdk">
4 <PropertyGroup>
5 <UpgradeCode>{A3E0B539-63F9-4B43-9E34-F33AE1C6E06D}</UpgradeCode>
6 <ProductComponentsRef>true</ProductComponentsRef>
7 </PropertyGroup>
8 <ItemGroup>
9 <Compile Include="..\..\Templates\Product.wxs" Link="Product.wxs" />
10 </ItemGroup>
11 <ItemGroup>
12 <PackageReference Include="WixToolset.Util.wixext" />
13 <PackageReference Include="WixToolset.ComPlus.wixext" />
14 </ItemGroup>
15</Project>
diff --git a/src/test/msi/TestData/ComPlusExtensionTests/InstallUninstallNativeWithoutPartitions/product.wxs b/src/test/msi/TestData/ComPlusExtensionTests/InstallUninstallNativeWithoutPartitions/product.wxs
new file mode 100644
index 00000000..ee3c4d8f
--- /dev/null
+++ b/src/test/msi/TestData/ComPlusExtensionTests/InstallUninstallNativeWithoutPartitions/product.wxs
@@ -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
3
4<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs"
5 xmlns:util="http://wixtoolset.org/schemas/v4/wxs/util"
6 xmlns:complus="http://wixtoolset.org/schemas/v4/wxs/complus">
7 <Fragment>
8 <ComponentGroup Id="ProductComponents">
9 <ComponentRef Id="Component1" />
10 </ComponentGroup>
11 </Fragment>
12
13 <Fragment>
14 <Component Id="Component1" Guid="09624A9A-4BBC-4126-BBF9-0713C5217DB1" Directory="INSTALLFOLDER">
15 <File Id="AssemblyFileNative" Source="../Components/TestComponentNative.dll" />
16
17 <complus:ComPlusApplication Id="APPLICATION" Name="ComPlus Native Application" Description="ComPlus Native Application" >
18 <complus:ComPlusAssembly Id="ASSEMBLY_Native" Type="native" DllPath="[#AssemblyFileNative]" >
19 <complus:ComPlusComponent Id="MyComNative" CLSID="8b4c3a90-762c-465b-abc5-81cb3cc5e464" />
20 </complus:ComPlusAssembly>
21 </complus:ComPlusApplication>
22 </Component>
23 </Fragment>
24</Wix>
diff --git a/src/test/msi/TestData/ComPlusExtensionTests/InstallUninstallWithPartitions/InstallUninstallWithPartitions.wixproj b/src/test/msi/TestData/ComPlusExtensionTests/InstallUninstallWithPartitions/InstallUninstallWithPartitions.wixproj
new file mode 100644
index 00000000..19382c83
--- /dev/null
+++ b/src/test/msi/TestData/ComPlusExtensionTests/InstallUninstallWithPartitions/InstallUninstallWithPartitions.wixproj
@@ -0,0 +1,15 @@
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 Sdk="WixToolset.Sdk">
4 <PropertyGroup>
5 <UpgradeCode>{A3E0B539-63F9-4B43-9E34-F33AE1C6E06D}</UpgradeCode>
6 <ProductComponentsRef>true</ProductComponentsRef>
7 </PropertyGroup>
8 <ItemGroup>
9 <Compile Include="..\..\Templates\Product.wxs" Link="Product.wxs" />
10 </ItemGroup>
11 <ItemGroup>
12 <PackageReference Include="WixToolset.Util.wixext" />
13 <PackageReference Include="WixToolset.ComPlus.wixext" />
14 </ItemGroup>
15</Project>
diff --git a/src/test/msi/TestData/ComPlusExtensionTests/InstallUninstallWithPartitions/product.wxs b/src/test/msi/TestData/ComPlusExtensionTests/InstallUninstallWithPartitions/product.wxs
new file mode 100644
index 00000000..92dc892b
--- /dev/null
+++ b/src/test/msi/TestData/ComPlusExtensionTests/InstallUninstallWithPartitions/product.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 xmlns:util="http://wixtoolset.org/schemas/v4/wxs/util"
6 xmlns:complus="http://wixtoolset.org/schemas/v4/wxs/complus">
7 <Fragment>
8 <ComponentGroup Id="ProductComponents">
9 <ComponentRef Id="Component1" />
10 </ComponentGroup>
11 </Fragment>
12
13 <Fragment>
14 <util:User Id="TEST_USER" Name="[LogonUser]" />
15
16 <Component Id="Component1" Guid="09624A9A-4BBC-4126-BBF9-0713C5217DB1" Directory="INSTALLFOLDER">
17 <File Id="AssemblyFileNative" Source="../Components/TestComponentNative.dll" />
18
19 <!-- Partition testing only works on Server OS -->
20 <complus:ComPlusPartition Id="PARTITION" Name="Complus Partition1" Description="ComPlus Partition" >
21 <complus:ComPlusPartitionUser Id="PARTITION_USER" User ="TEST_USER"/>
22 <complus:ComPlusApplication Id="APPLICATION" Name="ComPlus Application" Description="ComPlus Application" >
23 <complus:ComPlusAssembly Id="ASSEMBLY_Native" Type="native" DllPath="[#AssemblyFileNative]" >
24 <complus:ComPlusComponent Id="MyComNative" CLSID="8b4c3a90-762c-465b-abc5-81cb3cc5e464" />
25 </complus:ComPlusAssembly>
26 </complus:ComPlusApplication>
27 </complus:ComPlusPartition>
28 </Component>
29 </Fragment>
30</Wix>
diff --git a/src/test/msi/WixToolsetTest.MsiE2E/ComPlusExtensionTests.cs b/src/test/msi/WixToolsetTest.MsiE2E/ComPlusExtensionTests.cs
new file mode 100644
index 00000000..b143c19d
--- /dev/null
+++ b/src/test/msi/WixToolsetTest.MsiE2E/ComPlusExtensionTests.cs
@@ -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
3namespace WixToolsetTest.MsiE2E
4{
5 using System;
6 using WixTestTools;
7 using Xunit;
8 using Xunit.Abstractions;
9
10 public class ComPlusExtensionTests : MsiE2ETests
11 {
12 public ComPlusExtensionTests(ITestOutputHelper testOutputHelper) : base(testOutputHelper) { }
13
14 [RuntimeFact]
15 public void CanInstallUninstallNativeWithoutPartitions()
16 {
17 var product = this.CreatePackageInstaller("InstallUninstallNativeWithoutPartitions");
18 product.InstallProduct(MSIExec.MSIExecReturnCode.SUCCESS);
19
20 product.UninstallProduct(MSIExec.MSIExecReturnCode.SUCCESS);
21 }
22
23 [RuntimeFact]
24 public void CanInstallUninstallNET3WithoutPartitions()
25 {
26 var product = this.CreatePackageInstaller("InstallUninstallNET3WithoutPartitions");
27 product.InstallProduct(MSIExec.MSIExecReturnCode.SUCCESS);
28
29 product.UninstallProduct(MSIExec.MSIExecReturnCode.SUCCESS);
30 }
31
32 [RuntimeFact]
33 public void CanInstallUninstallNET4WithoutPartitions()
34 {
35 var product = this.CreatePackageInstaller("InstallUninstallNET4WithoutPartitions");
36 product.InstallProduct(MSIExec.MSIExecReturnCode.SUCCESS);
37
38 product.UninstallProduct(MSIExec.MSIExecReturnCode.SUCCESS);
39 }
40
41 [RuntimeFact(RequireWindowsServer = true)]
42 public void CanInstallAndUninstallWithPartitions()
43 {
44 var product = this.CreatePackageInstaller("InstallUninstallWithPartitions");
45 product.InstallProduct(MSIExec.MSIExecReturnCode.SUCCESS);
46
47 product.UninstallProduct(MSIExec.MSIExecReturnCode.SUCCESS);
48 }
49 }
50}