Skip to content

Commit 5299886

Browse files
bevanweissrobmen
authored andcommitted
Fix up COM+ to be back in working order under Wix4+
Table names updated for Wix4 prefix. Custom action names similarly updated. Table names Wix4ComPlusUserInApplicationRole, Wix4ComPlusGroupInApplicationRole and Wix4ComPlusApplicationRoleProperty had to be shortened to fit within MSI 31 character table name limit. Migrated from fixed GUID for RegistrationHelper to use CLSIDFromProgID in an attempt to fix behaviour under .NET 4+ DLLs. Added setting of Partition enable if a Partition is configured in authoring, new Windows config has Partitions disabled by default, and they don't work at all under Windows workstation (non-server) versions. Added a new Runtime condition for `RequireWindowsServer` which will skip execution of Runtime test on workstation/desktop OSes, since COM+ Partitions only work correctly under Windows Server. Quite a lot of basic typos fixed also. Signed-off-by: Bevan Weiss <bevan.weiss@gmail.com>
1 parent 8574528 commit 5299886

31 files changed

+446
-120
lines changed

src/ext/ComPlus/ca/cpapproleexec.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ HRESULT CpiConfigureApplicationRoles(
7474
hr = CpiActionStartMessage(ppwzData, FALSE);
7575
ExitOnFailure(hr, "Failed to send action start message");
7676

77-
// ger count
77+
// get count
7878
int iCnt = 0;
7979
hr = WcaReadIntegerFromCaData(ppwzData, &iCnt);
8080
ExitOnFailure(hr, "Failed to read count");
@@ -218,7 +218,7 @@ HRESULT CpiConfigureUsersInApplicationRoles(
218218
hr = CpiActionStartMessage(ppwzData, FALSE);
219219
ExitOnFailure(hr, "Failed to send action start message");
220220

221-
// ger count
221+
// get count
222222
int iCnt = 0;
223223
hr = WcaReadIntegerFromCaData(ppwzData, &iCnt);
224224
ExitOnFailure(hr, "Failed to read count");

src/ext/ComPlus/ca/cpapprolesched.cpp

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,13 @@ LPCWSTR vcsApplicationRoleQuery =
1010
enum eApplicationRoleQuery { arqApplicationRole = 1, arqApplication, arqComponent, arqName };
1111

1212
LPCWSTR 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`";
1414
LPCWSTR 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`";
1616
enum eTrusteeInApplicationRoleQuery { tiarqUserInApplicationRole = 1, tiarqApplicationRole, tiarqComponent, tiarqDomain, tiarqName };
1717

1818
LPCWSTR vcsApplicationRolePropertyQuery =
19-
L"SELECT `Name`, `Value` FROM `Wix4ComPlusApplicationRoleProperty` WHERE `ApplicationRole_` = ?";
19+
L"SELECT `Name`, `Value` FROM `Wix4ComPlusAppRoleProperty` WHERE `ApplicationRole_` = ?";
2020

2121

2222
// property definitions
@@ -95,7 +95,7 @@ HRESULT CpiApplicationRolesRead(
9595

9696
// loop through all application roles
9797
hr = WcaOpenExecuteView(vcsApplicationRoleQuery, &hView);
98-
ExitOnFailure(hr, "Failed to execute view on ComPlusApplicationRole table");
98+
ExitOnFailure(hr, "Failed to execute view on Wix4ComPlusApplicationRole table");
9999

100100
while (S_OK == (hr = WcaFetchRecord(hView, &hRec)))
101101
{
@@ -205,7 +205,7 @@ HRESULT CpiApplicationRolesVerifyInstall(
205205
if (!pItm->fReferencedForInstall && !(pItm->fHasComponent && WcaIsInstalling(pItm->isInstalled, pItm->isAction)))
206206
continue;
207207

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
209209
if (pItm->fReferencedForInstall && pItm->fHasComponent && !CpiWillBeInstalled(pItm->isInstalled, pItm->isAction))
210210
MessageExitOnFailure(hr = E_FAIL, msierrComPlusApplicationRoleDependency, "An application role is used by another entity being installed, but is not installed itself, key: %S", pItm->wzKey);
211211

@@ -235,7 +235,7 @@ HRESULT CpiApplicationRolesVerifyInstall(
235235
switch (er)
236236
{
237237
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);
239239
break;
240240
case IDRETRY:
241241
break;
@@ -319,7 +319,7 @@ HRESULT CpiApplicationRolesInstall(
319319
int iActionType;
320320

321321
// add action text
322-
hr = CpiAddActionTextToActionData(L"CreateComPlusApplicationRoles", ppwzActionData);
322+
hr = CpiAddActionTextToActionData(CUSTOM_ACTION_DECORATION(L"CreateComPlusApplicationRoles"), ppwzActionData);
323323
ExitOnFailure(hr, "Failed to add action text to custom action data");
324324

325325
// add count to action data
@@ -371,7 +371,7 @@ HRESULT CpiApplicationRolesUninstall(
371371
int iActionType;
372372

373373
// add action text
374-
hr = CpiAddActionTextToActionData(L"RemoveComPlusApplicationRoles", ppwzActionData);
374+
hr = CpiAddActionTextToActionData(CUSTOM_ACTION_DECORATION(L"RemoveComPlusApplicationRoles"), ppwzActionData);
375375
ExitOnFailure(hr, "Failed to add action text to custom action data");
376376

377377
// add count to action data
@@ -477,7 +477,7 @@ HRESULT CpiUsersInApplicationRolesInstall(
477477
int iActionType;
478478

479479
// add action text
480-
hr = CpiAddActionTextToActionData(L"AddUsersToComPlusApplicationRoles", ppwzActionData);
480+
hr = CpiAddActionTextToActionData(CUSTOM_ACTION_DECORATION(L"AddUsersToComPlusApplicationRoles"), ppwzActionData);
481481
ExitOnFailure(hr, "Failed to add action text to custom action data");
482482

483483
// add count to action data
@@ -529,7 +529,7 @@ HRESULT CpiUsersInApplicationRolesUninstall(
529529
int iActionType;
530530

531531
// add action text
532-
hr = CpiAddActionTextToActionData(L"RemoveUsersFromComPlusAppRoles", ppwzActionData);
532+
hr = CpiAddActionTextToActionData(CUSTOM_ACTION_DECORATION(L"RemoveUsersFromComPlusAppRoles"), ppwzActionData);
533533
ExitOnFailure(hr, "Failed to add action text to custom action data");
534534

535535
// add count to action data

src/ext/ComPlus/ca/cpappsched.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -255,7 +255,7 @@ HRESULT CpiApplicationsVerifyInstall(
255255
if (!pItm->fReferencedForInstall && !(pItm->fHasComponent && WcaIsInstalling(pItm->isInstalled, pItm->isAction)))
256256
continue;
257257

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
259259
if (pItm->fReferencedForInstall && pItm->fHasComponent && !CpiWillBeInstalled(pItm->isInstalled, pItm->isAction))
260260
MessageExitOnFailure(hr = E_FAIL, msierrComPlusApplicationDependency, "An application is used by another entity being installed, but is not installed itself, key: %S", pItm->wzKey);
261261

src/ext/ComPlus/ca/cpasmexec.cpp

Lines changed: 39 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
22

33
#include "precomp.h"
4-
4+
#include <mscoree.h>
55

66
// GAC related declarations
77

@@ -61,13 +61,11 @@ IAssemblyCache : public IUnknown
6161

6262
typedef HRESULT (__stdcall *LoadLibraryShimFunc)(LPCWSTR szDllName, LPCWSTR szVersion, LPVOID pvReserved, HMODULE *phModDll);
6363
typedef HRESULT (__stdcall *CreateAssemblyCacheFunc)(IAssemblyCache **ppAsmCache, DWORD dwReserved);
64+
typedef HRESULT (__stdcall *GetFileVersionFnPtr)(LPCWSTR szFilename, _Out_writes_to_opt_(cchBuffer, *dwLength) LPWSTR szBuffer, DWORD cchBuffer, DWORD* dwLength);
65+
typedef HRESULT (__stdcall *CorBindToRuntimeExFnPtr)(LPCWSTR pwszVersion, LPCWSTR pwszBuildFlavor, DWORD startupFlags, REFCLSID rclsid, REFIID riid, LPVOID FAR* ppv);
6466

6567

6668
// RegistrationHelper related declarations
67-
68-
static const GUID CLSID_RegistrationHelper =
69-
{ 0x89a86e7b, 0xc229, 0x4008, { 0x9b, 0xaa, 0x2f, 0x5c, 0x84, 0x11, 0xd7, 0xe0 } };
70-
7169
enum eInstallationFlags {
7270
ifConfigureComponentsOnly = 16,
7371
ifFindOrCreateTargetApplication = 4,
@@ -156,7 +154,8 @@ static HRESULT UnregisterAssembly(
156154
static void InitAssemblyExec();
157155
static void UninitAssemblyExec();
158156
static HRESULT GetRegistrationHelper(
159-
IDispatch** ppiRegHlp
157+
IDispatch** ppiRegHlp,
158+
LPCWSTR pwzAssemblyPath
160159
);
161160
static HRESULT GetAssemblyCacheObject(
162161
IAssemblyCache** ppAssemblyCache
@@ -722,15 +721,44 @@ static void UninitAssemblyExec()
722721
}
723722

724723
static HRESULT GetRegistrationHelper(
725-
IDispatch** ppiRegHlp
724+
IDispatch** ppiRegHlp,
725+
LPCWSTR pwzAssemblyPath
726726
)
727727
{
728728
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);
729741

730742
if (!gpiRegHlp)
731743
{
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+
732759
// 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);
734762
ExitOnFailure(hr, "Failed to create registration helper object");
735763
}
736764

@@ -883,7 +911,7 @@ static HRESULT RegisterDotNetAssembly(
883911
}
884912

885913
// get registration helper object
886-
hr = GetRegistrationHelper(&piRegHlp);
914+
hr = GetRegistrationHelper(&piRegHlp, pAttrs->pwzDllPath);
887915
ExitOnFailure(hr, "Failed to get registration helper object");
888916

889917
// get dispatch id of InstallAssembly() method
@@ -979,7 +1007,7 @@ static HRESULT RegisterNativeAssembly(
9791007
ExitOnNull(bstrTlbPath, hr, E_OUTOFMEMORY, "Failed to allocate BSTR for tlb path");
9801008

9811009
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");
9831011

9841012
// get catalog
9851013
hr = CpiExecGetAdminCatalog(&piCatalog);
@@ -1089,7 +1117,7 @@ static HRESULT UnregisterDotNetAssembly(
10891117
ExitOnNull(bstrDllPath, hr, E_OUTOFMEMORY, "Failed to allocate BSTR for dll path");
10901118

10911119
// get registration helper object
1092-
hr = GetRegistrationHelper(&piRegHlp);
1120+
hr = GetRegistrationHelper(&piRegHlp, pAttrs->pwzDllPath);
10931121
ExitOnFailure(hr, "Failed to get registration helper object");
10941122

10951123
// get dispatch id of UninstallAssembly() method

src/ext/ComPlus/ca/cpasmsched.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -408,7 +408,7 @@ HRESULT CpiAssembliesVerifyInstall(
408408
if (!pItm->fReferencedForInstall && !pItm->iRoleAssignmentsInstallCount && !WcaIsInstalling(pItm->isInstalled, pItm->isAction))
409409
continue;
410410

411-
// if the assembly is referensed, it must be installed
411+
// if the assembly is referenced, it must be installed
412412
if ((pItm->fReferencedForInstall || pItm->iRoleAssignmentsInstallCount) && !CpiWillBeInstalled(pItm->isInstalled, pItm->isAction))
413413
MessageExitOnFailure(hr = E_FAIL, msierrComPlusAssemblyDependency, "An assembly is used by another entity being installed, but is not installed itself, key: %S", pItm->wzKey);
414414
}

src/ext/ComPlus/ca/cpexec.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -180,7 +180,7 @@ extern "C" UINT __stdcall ComPlusInstallExecute(MSIHANDLE hInstall)
180180
if (INVALID_HANDLE_VALUE != hRollbackFile)
181181
::CloseHandle(hRollbackFile);
182182

183-
// unitialize
183+
// uninitialize
184184
CpiExecFinalize();
185185

186186
if (fInitializedCom)
@@ -258,7 +258,7 @@ extern "C" UINT __stdcall ComPlusInstallExecuteCommit(MSIHANDLE hInstall)
258258
if (INVALID_HANDLE_VALUE != hRollbackFile)
259259
::CloseHandle(hRollbackFile);
260260

261-
// unitialize
261+
// uninitialize
262262
CpiExecFinalize();
263263

264264
if (fInitializedCom)
@@ -415,7 +415,7 @@ extern "C" UINT __stdcall ComPlusRollbackInstallExecute(MSIHANDLE hInstall)
415415
if (prdSubscriptions)
416416
CpiFreeRollbackDataList(prdSubscriptions);
417417

418-
// unitialize
418+
// uninitialize
419419
CpiExecFinalize();
420420

421421
if (fInitializedCom)
@@ -521,7 +521,7 @@ extern "C" UINT __stdcall ComPlusUninstallExecute(MSIHANDLE hInstall)
521521
if (INVALID_HANDLE_VALUE != hRollbackFile)
522522
::CloseHandle(hRollbackFile);
523523

524-
// unitialize
524+
// uninitialize
525525
CpiExecFinalize();
526526

527527
if (fInitializedCom)
@@ -670,7 +670,7 @@ extern "C" UINT __stdcall ComPlusRollbackUninstallExecute(MSIHANDLE hInstall)
670670
if (prdSubscriptions)
671671
CpiFreeRollbackDataList(prdSubscriptions);
672672

673-
// unitialize
673+
// uninitialize
674674
CpiExecFinalize();
675675

676676
if (fInitializedCom)

src/ext/ComPlus/ca/cppartexec.cpp

Lines changed: 69 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ static HRESULT ReadPartitionAttributes(
3434
static void FreePartitionAttributes(
3535
CPI_PARTITION_ATTRIBUTES* pAttrs
3636
);
37+
static HRESULT CpiEnsurePartitionsEnabled();
3738
static HRESULT CreatePartition(
3839
CPI_PARTITION_ATTRIBUTES* pAttrs
3940
);
@@ -71,7 +72,7 @@ HRESULT CpiConfigurePartitions(
7172
hr = CpiActionStartMessage(ppwzData, FALSE);
7273
ExitOnFailure(hr, "Failed to send action start message");
7374

74-
// ger partition count
75+
// get partition count
7576
int iCnt = 0;
7677
hr = WcaReadIntegerFromCaData(ppwzData, &iCnt);
7778
ExitOnFailure(hr, "Failed to read count");
@@ -215,7 +216,7 @@ HRESULT CpiConfigurePartitionUsers(
215216
hr = CpiActionStartMessage(ppwzData, FALSE);
216217
ExitOnFailure(hr, "Failed to send action start message");
217218

218-
// ger partition count
219+
// get partition count
219220
int iCnt = 0;
220221
hr = WcaReadIntegerFromCaData(ppwzData, &iCnt);
221222
ExitOnFailure(hr, "Failed to read count");
@@ -384,6 +385,69 @@ static void FreePartitionAttributes(
384385
CpiFreePropertyList(pAttrs->pPropList);
385386
}
386387

388+
static 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+
441+
LExit:
442+
// clean up
443+
ReleaseObject(piLocalComputerColl);
444+
ReleaseObject(piLocalComputerObj);
445+
ReleaseBSTR(bsPartitionsEnabledName);
446+
::VariantClear(&vtVal);
447+
448+
return hr;
449+
}
450+
387451
static HRESULT CreatePartition(
388452
CPI_PARTITION_ATTRIBUTES* pAttrs
389453
)
@@ -408,6 +472,9 @@ static HRESULT CreatePartition(
408472

409473
if (S_FALSE == hr)
410474
{
475+
hr = CpiEnsurePartitionsEnabled();
476+
ExitOnFailure(hr, "Failed to enable partitions");
477+
411478
// create partition
412479
hr = CpiAddCollectionObject(piPartColl, &piPartObj);
413480
ExitOnFailure(hr, "Failed to add partition to collection");

src/ext/ComPlus/ca/cppartroleexec.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ HRESULT CpiConfigureUsersInPartitionRoles(
4949
hr = CpiActionStartMessage(ppwzData, FALSE);
5050
ExitOnFailure(hr, "Failed to send action start message");
5151

52-
// ger count
52+
// get count
5353
int iCnt = 0;
5454
hr = WcaReadIntegerFromCaData(ppwzData, &iCnt);
5555
ExitOnFailure(hr, "Failed to read count");

src/ext/ComPlus/ca/cppartrolesched.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,9 @@ LPCWSTR vcsPartitionRoleQuery =
1010
enum ePartitionRoleQuery { prqPartitionRole = 1, prqPartition, prqComponent, prqName };
1111

1212
LPCWSTR 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`";
1414
LPCWSTR 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`";
1616
enum eTrusteeInPartitionRoleQuery { tiprqUserInPartitionRole = 1, tiprqPartitionRole, tiprqComponent, tiprqDomain, tiprqName };
1717

1818

0 commit comments

Comments
 (0)