summaryrefslogtreecommitdiff
path: root/src/ext/ComPlus/ca/cpsched.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/ext/ComPlus/ca/cpsched.cpp')
-rw-r--r--src/ext/ComPlus/ca/cpsched.cpp566
1 files changed, 566 insertions, 0 deletions
diff --git a/src/ext/ComPlus/ca/cpsched.cpp b/src/ext/ComPlus/ca/cpsched.cpp
new file mode 100644
index 00000000..ebc547ae
--- /dev/null
+++ b/src/ext/ComPlus/ca/cpsched.cpp
@@ -0,0 +1,566 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3#include "precomp.h"
4
5
6#ifdef _WIN64
7#define CP_COMPLUSROLLBACKINSTALLPREPARE L"ComPlusRollbackInstallPrepare_64"
8#define CP_COMPLUSINSTALLPREPARE L"ComPlusInstallPrepare_64"
9#define CP_COMPLUSROLLBACKINSTALLEXECUTE L"ComPlusRollbackInstallExecute_64"
10#define CP_COMPLUSINSTALLEXECUTE L"ComPlusInstallExecute_64"
11#define CP_COMPLUSINSTALLEXECUTECOMMIT L"ComPlusInstallExecuteCommit_64"
12#define CP_COMPLUSINSTALLCOMMIT L"ComPlusInstallCommit_64"
13#define CP_COMPLUSROLLBACKINSTALLPREPARE L"ComPlusRollbackInstallPrepare_64"
14#define CP_COMPLUSINSTALLPREPARE L"ComPlusInstallPrepare_64"
15#define CP_COMPLUSROLLBACKUNINSTALLEXECUTE L"ComPlusRollbackUninstallExecute_64"
16#define CP_COMPLUSUNINSTALLEXECUTE L"ComPlusUninstallExecute_64"
17#define CP_COMPLUSINSTALLCOMMIT L"ComPlusInstallCommit_64"
18#else
19#define CP_COMPLUSROLLBACKINSTALLPREPARE L"ComPlusRollbackInstallPrepare"
20#define CP_COMPLUSINSTALLPREPARE L"ComPlusInstallPrepare"
21#define CP_COMPLUSROLLBACKINSTALLEXECUTE L"ComPlusRollbackInstallExecute"
22#define CP_COMPLUSINSTALLEXECUTE L"ComPlusInstallExecute"
23#define CP_COMPLUSINSTALLEXECUTECOMMIT L"ComPlusInstallExecuteCommit"
24#define CP_COMPLUSINSTALLCOMMIT L"ComPlusInstallCommit"
25#define CP_COMPLUSROLLBACKINSTALLPREPARE L"ComPlusRollbackInstallPrepare"
26#define CP_COMPLUSINSTALLPREPARE L"ComPlusInstallPrepare"
27#define CP_COMPLUSROLLBACKUNINSTALLEXECUTE L"ComPlusRollbackUninstallExecute"
28#define CP_COMPLUSUNINSTALLEXECUTE L"ComPlusUninstallExecute"
29#define CP_COMPLUSINSTALLCOMMIT L"ComPlusInstallCommit"
30#endif
31
32/********************************************************************
33 ConfigureComPlusInstall - CUSTOM ACTION ENTRY POINT for installing COM+ components
34
35********************************************************************/
36extern "C" UINT __stdcall ConfigureComPlusInstall(MSIHANDLE hInstall)
37{
38 HRESULT hr = S_OK;
39 UINT er = ERROR_SUCCESS;
40
41 BOOL fInitializedCom = FALSE;
42
43 ICOMAdminCatalog* piCatalog = NULL;
44
45 CPI_PARTITION_LIST partList;
46 CPI_PARTITION_ROLE_LIST partRoleList;
47 CPI_USER_IN_PARTITION_ROLE_LIST usrInPartRoleList;
48 CPI_PARTITION_USER_LIST partUsrList;
49 CPI_APPLICATION_LIST appList;
50 CPI_APPLICATION_ROLE_LIST appRoleList;
51 CPI_USER_IN_APPLICATION_ROLE_LIST usrInAppRoleList;
52 CPI_ASSEMBLY_LIST asmList;
53 CPI_SUBSCRIPTION_LIST subList;
54
55 LPWSTR pwzRollbackFileName = NULL;
56 LPWSTR pwzActionData = NULL;
57 LPWSTR pwzRollbackActionData = NULL;
58 LPWSTR pwzCommitActionData = NULL;
59
60 int iVersionNT = 0;
61 int iProgress = 0;
62 int iCommitProgress = 0;
63
64 ::ZeroMemory(&partList, sizeof(CPI_PARTITION_LIST));
65 ::ZeroMemory(&partRoleList, sizeof(CPI_PARTITION_ROLE_LIST));
66 ::ZeroMemory(&usrInPartRoleList, sizeof(CPI_USER_IN_PARTITION_ROLE_LIST));
67 ::ZeroMemory(&partUsrList, sizeof(CPI_PARTITION_USER_LIST));
68 ::ZeroMemory(&appList, sizeof(CPI_APPLICATION_LIST));
69 ::ZeroMemory(&appRoleList, sizeof(CPI_APPLICATION_ROLE_LIST));
70 ::ZeroMemory(&usrInAppRoleList, sizeof(CPI_USER_IN_APPLICATION_ROLE_LIST));
71 ::ZeroMemory(&asmList, sizeof(CPI_ASSEMBLY_LIST));
72 ::ZeroMemory(&subList, sizeof(CPI_SUBSCRIPTION_LIST));
73
74 // initialize
75 hr = WcaInitialize(hInstall, "ConfigureComPlusInstall");
76 ExitOnFailure(hr, "Failed to initialize");
77
78 hr = ::CoInitialize(NULL);
79 ExitOnFailure(hr, "Failed to initialize COM");
80 fInitializedCom = TRUE;
81
82 CpiSchedInitialize();
83
84 // check for the prerequsite tables
85 if (!CpiTableExists(cptComPlusPartition) && !CpiTableExists(cptComPlusApplication) && !CpiTableExists(cptComPlusAssembly))
86 {
87 WcaLog(LOGMSG_VERBOSE, "skipping install COM+ CustomAction, no ComPlusPartition, ComPlusApplication or ComPlusAssembly table present");
88 ExitFunction1(hr = S_FALSE);
89 }
90
91 // make sure we can access the COM+ admin catalog
92 do {
93 hr = CpiSchedGetAdminCatalog(&piCatalog);
94 if (FAILED(hr))
95 {
96 WcaLog(LOGMSG_STANDARD, "Failed to get COM+ admin catalog");
97 er = WcaErrorMessage(msierrComPlusCannotConnect, hr, INSTALLMESSAGE_ERROR | MB_ABORTRETRYIGNORE, 0);
98 switch (er)
99 {
100 case IDABORT:
101 ExitFunction(); // exit with hr from CpiGetAdminCatalog() to kick off a rollback
102 case IDRETRY:
103 hr = S_FALSE;
104 break;
105 case IDIGNORE:
106 default:
107 ExitFunction1(hr = S_OK); // pretend everything is okay and bail
108 }
109 }
110 } while (S_FALSE == hr);
111
112 // get NT version
113 hr = WcaGetIntProperty(L"VersionNT", &iVersionNT);
114 ExitOnFailure(hr, "Failed to get VersionNT property");
115
116 // read elements
117 if (502 <= iVersionNT && CpiTableExists(cptComPlusPartition))
118 {
119 hr = CpiPartitionsRead(&partList);
120 MessageExitOnFailure(hr, msierrComPlusPartitionReadFailed, "Failed to read ComPlusPartitions table");
121 }
122
123 if (502 <= iVersionNT && CpiTableExists(cptComPlusPartitionRole))
124 {
125 hr = CpiPartitionRolesRead(&partList, &partRoleList);
126 MessageExitOnFailure(hr, msierrComPlusPartitionRoleReadFailed, "Failed to read ComPlusPartitionRole table");
127 }
128
129 if (502 <= iVersionNT && (CpiTableExists(cptComPlusUserInPartitionRole) || CpiTableExists(cptComPlusGroupInPartitionRole)))
130 {
131 hr = CpiUsersInPartitionRolesRead(&partRoleList, &usrInPartRoleList);
132 MessageExitOnFailure(hr, msierrComPlusUserInPartitionRoleReadFailed, "Failed to read ComPlusUserInPartitionRole table");
133 }
134
135 if (502 <= iVersionNT && CpiTableExists(cptComPlusPartitionUser))
136 {
137 hr = CpiPartitionUsersRead(&partList, &partUsrList);
138 MessageExitOnFailure(hr, msierrComPlusPartitionUserReadFailed, "Failed to read ComPlusPartitionUser table");
139 }
140
141 if (CpiTableExists(cptComPlusApplication))
142 {
143 hr = CpiApplicationsRead(&partList, &appList);
144 MessageExitOnFailure(hr, msierrComPlusApplicationReadFailed, "Failed to read ComPlusApplication table");
145 }
146
147 if (CpiTableExists(cptComPlusApplicationRole))
148 {
149 hr = CpiApplicationRolesRead(&appList, &appRoleList);
150 MessageExitOnFailure(hr, msierrComPlusApplicationRoleReadFailed, "Failed to read ComPlusApplicationRole table");
151 }
152
153 if (CpiTableExists(cptComPlusUserInApplicationRole) || CpiTableExists(cptComPlusGroupInApplicationRole))
154 {
155 hr = CpiUsersInApplicationRolesRead(&appRoleList, &usrInAppRoleList);
156 MessageExitOnFailure(hr, msierrComPlusUserInApplicationRoleReadFailed, "Failed to read ComPlusUserInApplicationRole table");
157 }
158
159 if (CpiTableExists(cptComPlusAssembly))
160 {
161 hr = CpiAssembliesRead(&appList, &appRoleList, &asmList);
162 MessageExitOnFailure(hr, msierrComPlusAssembliesReadFailed, "Failed to read ComPlusAssembly table");
163 }
164
165 if (CpiTableExists(cptComPlusSubscription))
166 {
167 hr = CpiSubscriptionsRead(&asmList, &subList);
168 MessageExitOnFailure(hr, msierrComPlusSubscriptionReadFailed, "Failed to read ComPlusSubscription table");
169 }
170
171 // verify elements
172 hr = CpiPartitionsVerifyInstall(&partList);
173 ExitOnFailure(hr, "Failed to verify partitions");
174
175 hr = CpiApplicationsVerifyInstall(&appList);
176 ExitOnFailure(hr, "Failed to verify applications");
177
178 hr = CpiApplicationRolesVerifyInstall(&appRoleList);
179 ExitOnFailure(hr, "Failed to verify application roles");
180
181 hr = CpiAssembliesVerifyInstall(&asmList);
182 ExitOnFailure(hr, "Failed to verify assemblies");
183
184 if (subList.iInstallCount)
185 {
186 hr = CpiSubscriptionsVerifyInstall(&subList);
187 ExitOnFailure(hr, "Failed to verify subscriptions");
188 }
189
190 // schedule
191 if (partList.iInstallCount || appList.iInstallCount || usrInAppRoleList.iInstallCount ||
192 appRoleList.iInstallCount || asmList.iInstallCount || asmList.iRoleInstallCount || subList.iInstallCount)
193 {
194 // create rollback file name
195 hr = CpiGetTempFileName(&pwzRollbackFileName);
196 ExitOnFailure(hr, "Failed to get rollback file name");
197
198 // schedule rollback prepare custom action
199 hr = WcaDoDeferredAction(CP_COMPLUSROLLBACKINSTALLPREPARE, pwzRollbackFileName, 0);
200 ExitOnFailure(hr, "Failed to schedule ComPlusRollbackInstallPrepare");
201
202 // schedule prepare custom action
203 hr = WcaDoDeferredAction(CP_COMPLUSINSTALLPREPARE, pwzRollbackFileName, 0);
204 ExitOnFailure(hr, "Failed to schedule ComPlusInstallPrepare");
205
206 // schedule rollback custom action
207 hr = WcaWriteStringToCaData(pwzRollbackFileName, &pwzRollbackActionData);
208 ExitOnFailure(hr, "Failed to add rollback file name to rollback custom action data");
209
210 hr = CpiSubscriptionsInstall(&subList, rmRollback, &pwzRollbackActionData, NULL);
211 ExitOnFailure(hr, "Failed to install subscriptions");
212 hr = CpiRoleAssignmentsInstall(&asmList, rmRollback, &pwzRollbackActionData, NULL);
213 ExitOnFailure(hr, "Failed to install assemblies");
214 hr = CpiAssembliesInstall(&asmList, rmRollback, &pwzRollbackActionData, NULL);
215 ExitOnFailure(hr, "Failed to install assemblies");
216 hr = CpiUsersInApplicationRolesInstall(&usrInAppRoleList, rmRollback, &pwzRollbackActionData, NULL);
217 ExitOnFailure(hr, "Failed to install users in application roles");
218 hr = CpiApplicationRolesInstall(&appRoleList, rmRollback, &pwzRollbackActionData, NULL);
219 ExitOnFailure(hr, "Failed to install application roles");
220 hr = CpiApplicationsInstall(&appList, rmRollback, &pwzRollbackActionData, NULL);
221 ExitOnFailure(hr, "Failed to install applications");
222 hr = CpiPartitionUsersInstall(&partUsrList, rmRollback, &pwzRollbackActionData, NULL);
223 ExitOnFailure(hr, "Failed to install partition users");
224 hr = CpiUsersInPartitionRolesInstall(&usrInPartRoleList, rmRollback, &pwzRollbackActionData, NULL);
225 ExitOnFailure(hr, "Failed to install users in partition roles");
226 hr = CpiPartitionsInstall(&partList, rmRollback, &pwzRollbackActionData, NULL);
227 ExitOnFailure(hr, "Failed to install partitions");
228
229 hr = WcaDoDeferredAction(CP_COMPLUSROLLBACKINSTALLEXECUTE, pwzRollbackActionData, 0);
230 ExitOnFailure(hr, "Failed to schedule ComPlusRollbackInstallExecute");
231
232 // schedule install custom action
233 hr = WcaWriteStringToCaData(pwzRollbackFileName, &pwzActionData);
234 ExitOnFailure(hr, "Failed to add rollback file name to custom action data");
235
236 hr = CpiPartitionsInstall(&partList, rmDeferred, &pwzActionData, &iProgress);
237 ExitOnFailure(hr, "Failed to install partitions");
238 hr = CpiUsersInPartitionRolesInstall(&usrInPartRoleList, rmDeferred, &pwzActionData, &iProgress);
239 ExitOnFailure(hr, "Failed to install users in partition roles");
240 hr = CpiPartitionUsersInstall(&partUsrList, rmDeferred, &pwzActionData, &iProgress);
241 ExitOnFailure(hr, "Failed to install partition users");
242 hr = CpiApplicationsInstall(&appList, rmDeferred, &pwzActionData, &iProgress);
243 ExitOnFailure(hr, "Failed to install applications");
244 hr = CpiApplicationRolesInstall(&appRoleList, rmDeferred, &pwzActionData, &iProgress);
245 ExitOnFailure(hr, "Failed to install application roles");
246 hr = CpiUsersInApplicationRolesInstall(&usrInAppRoleList, rmDeferred, &pwzActionData, &iProgress);
247 ExitOnFailure(hr, "Failed to install users in application roles");
248 hr = CpiAssembliesInstall(&asmList, rmDeferred, &pwzActionData, &iProgress);
249 ExitOnFailure(hr, "Failed to install assemblies");
250 hr = CpiRoleAssignmentsInstall(&asmList, rmDeferred, &pwzActionData, &iProgress);
251 ExitOnFailure(hr, "Failed to install assemblies");
252 hr = CpiSubscriptionsInstall(&subList, rmDeferred, &pwzActionData, &iProgress);
253 ExitOnFailure(hr, "Failed to install subscriptions");
254
255 hr = WcaDoDeferredAction(CP_COMPLUSINSTALLEXECUTE, pwzActionData, iProgress);
256 ExitOnFailure(hr, "Failed to schedule ComPlusInstallExecute");
257
258 // schedule install commit custom action
259 hr = WcaWriteStringToCaData(pwzRollbackFileName, &pwzCommitActionData);
260 ExitOnFailure(hr, "Failed to add rollback file name to commit custom action data");
261
262 hr = CpiAssembliesInstall(&asmList, rmCommit, &pwzCommitActionData, &iCommitProgress);
263 ExitOnFailure(hr, "Failed to install assemblies");
264 hr = CpiRoleAssignmentsInstall(&asmList, rmCommit, &pwzCommitActionData, &iCommitProgress);
265 ExitOnFailure(hr, "Failed to install assemblies");
266 hr = CpiSubscriptionsInstall(&subList, rmCommit, &pwzCommitActionData, &iCommitProgress);
267 ExitOnFailure(hr, "Failed to install subscriptions");
268
269 hr = WcaDoDeferredAction(CP_COMPLUSINSTALLEXECUTECOMMIT, pwzCommitActionData, iCommitProgress);
270 ExitOnFailure(hr, "Failed to schedule ComPlusInstallExecuteCommit");
271
272 // schedule commit custom action
273 hr = WcaDoDeferredAction(CP_COMPLUSINSTALLCOMMIT, pwzRollbackFileName, 0);
274 ExitOnFailure(hr, "Failed to schedule ComPlusInstallCommit");
275 }
276
277 hr = S_OK;
278
279LExit:
280 // clean up
281 ReleaseObject(piCatalog);
282
283 ReleaseStr(pwzRollbackFileName);
284 ReleaseStr(pwzActionData);
285 ReleaseStr(pwzRollbackActionData);
286 ReleaseStr(pwzCommitActionData);
287
288 CpiPartitionListFree(&partList);
289 CpiPartitionRoleListFree(&partRoleList);
290 CpiUserInPartitionRoleListFree(&usrInPartRoleList);
291 CpiPartitionUserListFree(&partUsrList);
292 CpiApplicationListFree(&appList);
293 CpiApplicationRoleListFree(&appRoleList);
294 CpiUserInApplicationRoleListFree(&usrInAppRoleList);
295 CpiAssemblyListFree(&asmList);
296 CpiSubscriptionListFree(&subList);
297
298 // unitialize
299 CpiSchedFinalize();
300
301 if (fInitializedCom)
302 ::CoUninitialize();
303
304 er = SUCCEEDED(hr) ? ERROR_SUCCESS : ERROR_INSTALL_FAILURE;
305 return WcaFinalize(er);
306}
307
308
309/********************************************************************
310 ConfigureComPlusUninstall - CUSTOM ACTION ENTRY POINT for uninstalling COM+ components
311
312********************************************************************/
313extern "C" UINT __stdcall ConfigureComPlusUninstall(MSIHANDLE hInstall)
314{
315 HRESULT hr = S_OK;
316 UINT er = ERROR_SUCCESS;
317
318 BOOL fInitializedCom = FALSE;
319
320 ICOMAdminCatalog* piCatalog = NULL;
321
322 CPI_PARTITION_LIST partList;
323 CPI_PARTITION_ROLE_LIST partRoleList;
324 CPI_USER_IN_PARTITION_ROLE_LIST usrInPartRoleList;
325 CPI_PARTITION_USER_LIST partUsrList;
326 CPI_APPLICATION_LIST appList;
327 CPI_APPLICATION_ROLE_LIST appRoleList;
328 CPI_USER_IN_APPLICATION_ROLE_LIST usrInAppRoleList;
329 CPI_ASSEMBLY_LIST asmList;
330 CPI_SUBSCRIPTION_LIST subList;
331
332 LPWSTR pwzRollbackFileName = NULL;
333 LPWSTR pwzActionData = NULL;
334 LPWSTR pwzRollbackActionData = NULL;
335
336 int iVersionNT = 0;
337 int iProgress = 0;
338
339 ::ZeroMemory(&partList, sizeof(CPI_PARTITION_LIST));
340 ::ZeroMemory(&partRoleList, sizeof(CPI_PARTITION_ROLE_LIST));
341 ::ZeroMemory(&usrInPartRoleList, sizeof(CPI_USER_IN_PARTITION_ROLE_LIST));
342 ::ZeroMemory(&partUsrList, sizeof(CPI_PARTITION_USER_LIST));
343 ::ZeroMemory(&appList, sizeof(CPI_APPLICATION_LIST));
344 ::ZeroMemory(&appRoleList, sizeof(CPI_APPLICATION_ROLE_LIST));
345 ::ZeroMemory(&usrInAppRoleList, sizeof(CPI_USER_IN_APPLICATION_ROLE_LIST));
346 ::ZeroMemory(&asmList, sizeof(CPI_ASSEMBLY_LIST));
347 ::ZeroMemory(&subList, sizeof(CPI_SUBSCRIPTION_LIST));
348
349 // initialize
350 hr = WcaInitialize(hInstall, "ConfigureComPlusUninstall");
351 ExitOnFailure(hr, "Failed to initialize");
352
353 hr = ::CoInitialize(NULL);
354 ExitOnFailure(hr, "Failed to initialize COM");
355 fInitializedCom = TRUE;
356
357 CpiSchedInitialize();
358
359 // check for the prerequsite tables
360 if (!CpiTableExists(cptComPlusPartition) && !CpiTableExists(cptComPlusApplication) && !CpiTableExists(cptComPlusAssembly))
361 {
362 WcaLog(LOGMSG_VERBOSE, "skipping uninstall COM+ CustomAction, no ComPlusPartition, ComPlusApplication or ComPlusAssembly table present");
363 ExitFunction1(hr = S_FALSE);
364 }
365
366 // make sure we can access the COM+ admin catalog
367 do {
368 hr = CpiSchedGetAdminCatalog(&piCatalog);
369 if (FAILED(hr))
370 {
371 WcaLog(LOGMSG_STANDARD, "Failed to get COM+ admin catalog");
372 er = WcaErrorMessage(msierrComPlusCannotConnect, hr, INSTALLMESSAGE_ERROR | MB_ABORTRETRYIGNORE, 0);
373 switch (er)
374 {
375 case IDABORT:
376 ExitFunction(); // exit with hr from CpiGetAdminCatalog() to kick off a rollback
377 case IDRETRY:
378 hr = S_FALSE;
379 break;
380 case IDIGNORE:
381 default:
382 ExitFunction1(hr = S_OK); // pretend everything is okay and bail
383 }
384 }
385 } while (S_FALSE == hr);
386
387 // get NT version
388 hr = WcaGetIntProperty(L"VersionNT", &iVersionNT);
389 ExitOnFailure(hr, "Failed to get VersionNT property");
390
391 // read elements
392 if (502 <= iVersionNT && CpiTableExists(cptComPlusPartition))
393 {
394 hr = CpiPartitionsRead(&partList);
395 MessageExitOnFailure(hr, msierrComPlusPartitionReadFailed, "Failed to read ComPlusPartitions table");
396 }
397
398 if (502 <= iVersionNT && CpiTableExists(cptComPlusPartitionRole))
399 {
400 hr = CpiPartitionRolesRead(&partList, &partRoleList);
401 MessageExitOnFailure(hr, msierrComPlusPartitionRoleReadFailed, "Failed to read ComPlusPartitionRole table");
402 }
403
404 if (502 <= iVersionNT && (CpiTableExists(cptComPlusUserInPartitionRole) || CpiTableExists(cptComPlusGroupInPartitionRole)))
405 {
406 hr = CpiUsersInPartitionRolesRead(&partRoleList, &usrInPartRoleList);
407 MessageExitOnFailure(hr, msierrComPlusUserInPartitionRoleReadFailed, "Failed to read ComPlusUserInPartitionRole table");
408 }
409
410 if (502 <= iVersionNT && CpiTableExists(cptComPlusPartitionUser))
411 {
412 hr = CpiPartitionUsersRead(&partList, &partUsrList);
413 MessageExitOnFailure(hr, msierrComPlusPartitionUserReadFailed, "Failed to read ComPlusPartitionUser table");
414 }
415
416 if (CpiTableExists(cptComPlusApplication))
417 {
418 hr = CpiApplicationsRead(&partList, &appList);
419 MessageExitOnFailure(hr, msierrComPlusApplicationReadFailed, "Failed to read ComPlusApplication table");
420 }
421
422 if (CpiTableExists(cptComPlusApplicationRole))
423 {
424 hr = CpiApplicationRolesRead(&appList, &appRoleList);
425 MessageExitOnFailure(hr, msierrComPlusApplicationRoleReadFailed, "Failed to read ComPlusApplicationRole table");
426 }
427
428 if (CpiTableExists(cptComPlusUserInApplicationRole) || CpiTableExists(cptComPlusGroupInApplicationRole))
429 {
430 hr = CpiUsersInApplicationRolesRead(&appRoleList, &usrInAppRoleList);
431 MessageExitOnFailure(hr, msierrComPlusUserInApplicationRoleReadFailed, "Failed to read ComPlusUserInApplicationRole table");
432 }
433
434 if (CpiTableExists(cptComPlusAssembly))
435 {
436 hr = CpiAssembliesRead(&appList, &appRoleList, &asmList);
437 MessageExitOnFailure(hr, msierrComPlusAssembliesReadFailed, "Failed to read ComPlusAssembly table");
438 }
439
440 if (CpiTableExists(cptComPlusSubscription))
441 {
442 hr = CpiSubscriptionsRead(&asmList, &subList);
443 MessageExitOnFailure(hr, msierrComPlusSubscriptionReadFailed, "Failed to read ComPlusSubscription table");
444 }
445
446 // verify elements
447 hr = CpiPartitionsVerifyUninstall(&partList);
448 ExitOnFailure(hr, "Failed to verify partitions");
449
450 hr = CpiApplicationsVerifyUninstall(&appList);
451 ExitOnFailure(hr, "Failed to verify applications");
452
453 hr = CpiApplicationRolesVerifyUninstall(&appRoleList);
454 ExitOnFailure(hr, "Failed to verify application roles");
455
456 hr = CpiAssembliesVerifyUninstall(&asmList);
457 ExitOnFailure(hr, "Failed to verify assemblies");
458
459 if (subList.iUninstallCount)
460 {
461 hr = CpiSubscriptionsVerifyUninstall(&subList);
462 ExitOnFailure(hr, "Failed to verify subscriptions");
463 }
464
465 // schedule
466 if (partList.iUninstallCount || appList.iUninstallCount || appRoleList.iUninstallCount ||
467 usrInAppRoleList.iUninstallCount || asmList.iUninstallCount || asmList.iRoleUninstallCount || subList.iUninstallCount)
468 {
469 // create rollback file name
470 hr = CpiGetTempFileName(&pwzRollbackFileName);
471 ExitOnFailure(hr, "Failed to get rollback file name");
472
473 // schedule rollback prepare custom action
474 hr = WcaDoDeferredAction(CP_COMPLUSROLLBACKINSTALLPREPARE, pwzRollbackFileName, 0);
475 ExitOnFailure(hr, "Failed to schedule ComPlusRollbackInstallPrepare");
476
477 // schedule prepare custom action
478 hr = WcaDoDeferredAction(CP_COMPLUSINSTALLPREPARE, pwzRollbackFileName, 0);
479 ExitOnFailure(hr, "Failed to schedule ComPlusInstallPrepare");
480
481 // schedule rollback custom action
482 hr = WcaWriteStringToCaData(pwzRollbackFileName, &pwzRollbackActionData);
483 ExitOnFailure(hr, "Failed to add rollback file name to rollback custom action data");
484
485 hr = CpiPartitionsUninstall(&partList, rmRollback, &pwzRollbackActionData, NULL);
486 ExitOnFailure(hr, "Failed to uninstall partitions");
487 hr = CpiUsersInPartitionRolesUninstall(&usrInPartRoleList, rmRollback, &pwzRollbackActionData, NULL);
488 ExitOnFailure(hr, "Failed to uninstall users in partition roles");
489 hr = CpiPartitionUsersUninstall(&partUsrList, rmRollback, &pwzRollbackActionData, NULL);
490 ExitOnFailure(hr, "Failed to uninstall partition users");
491 hr = CpiApplicationsUninstall(&appList, rmRollback, &pwzRollbackActionData, NULL);
492 ExitOnFailure(hr, "Failed to uninstall applications");
493 hr = CpiApplicationRolesUninstall(&appRoleList, rmRollback, &pwzRollbackActionData, NULL);
494 ExitOnFailure(hr, "Failed to uninstall application roles");
495 hr = CpiUsersInApplicationRolesUninstall(&usrInAppRoleList, rmRollback, &pwzRollbackActionData, NULL);
496 ExitOnFailure(hr, "Failed to uninstall users in application roles");
497 hr = CpiAssembliesUninstall(&asmList, rmRollback, &pwzRollbackActionData, NULL);
498 ExitOnFailure(hr, "Failed to uninstall assemblies");
499 hr = CpiRoleAssignmentsUninstall(&asmList, rmRollback, &pwzRollbackActionData, NULL);
500 ExitOnFailure(hr, "Failed to uninstall assemblies");
501 hr = CpiSubscriptionsUninstall(&subList, rmRollback, &pwzRollbackActionData, NULL);
502 ExitOnFailure(hr, "Failed to uninstall subscriptions");
503
504 hr = WcaDoDeferredAction(CP_COMPLUSROLLBACKUNINSTALLEXECUTE, pwzRollbackActionData, 0);
505 ExitOnFailure(hr, "Failed to schedule ComPlusRollbackUninstallExecute");
506
507 // schedule install custom action
508 hr = WcaWriteStringToCaData(pwzRollbackFileName, &pwzActionData);
509 ExitOnFailure(hr, "Failed to add rollback file name to custom action data");
510
511 hr = CpiSubscriptionsUninstall(&subList, rmDeferred, &pwzActionData, &iProgress);
512 ExitOnFailure(hr, "Failed to uninstall subscriptions");
513 hr = CpiRoleAssignmentsUninstall(&asmList, rmDeferred, &pwzActionData, &iProgress);
514 ExitOnFailure(hr, "Failed to uninstall assemblies");
515 hr = CpiAssembliesUninstall(&asmList, rmDeferred, &pwzActionData, &iProgress);
516 ExitOnFailure(hr, "Failed to uninstall assemblies");
517 hr = CpiUsersInApplicationRolesUninstall(&usrInAppRoleList, rmDeferred, &pwzActionData, &iProgress);
518 ExitOnFailure(hr, "Failed to uninstall users in application roles");
519 hr = CpiApplicationRolesUninstall(&appRoleList, rmDeferred, &pwzActionData, &iProgress);
520 ExitOnFailure(hr, "Failed to uninstall application roles");
521 hr = CpiApplicationsUninstall(&appList, rmDeferred, &pwzActionData, &iProgress);
522 ExitOnFailure(hr, "Failed to uninstall applications");
523 hr = CpiPartitionUsersUninstall(&partUsrList, rmDeferred, &pwzActionData, &iProgress);
524 ExitOnFailure(hr, "Failed to uninstall partition users");
525 hr = CpiUsersInPartitionRolesUninstall(&usrInPartRoleList, rmDeferred, &pwzActionData, &iProgress);
526 ExitOnFailure(hr, "Failed to uninstall users in partition roles");
527 hr = CpiPartitionsUninstall(&partList, rmDeferred, &pwzActionData, &iProgress);
528 ExitOnFailure(hr, "Failed to uninstall partitions");
529
530 hr = WcaDoDeferredAction(CP_COMPLUSUNINSTALLEXECUTE, pwzActionData, iProgress);
531 ExitOnFailure(hr, "Failed to schedule ComPlusUninstallExecute");
532
533 // schedule commit custom action
534 hr = WcaDoDeferredAction(CP_COMPLUSINSTALLCOMMIT, pwzRollbackFileName, 0);
535 ExitOnFailure(hr, "Failed to schedule ComPlusInstallCommit");
536 }
537
538 hr = S_OK;
539
540LExit:
541 // clean up
542 ReleaseObject(piCatalog);
543
544 ReleaseStr(pwzRollbackFileName);
545 ReleaseStr(pwzActionData);
546 ReleaseStr(pwzRollbackActionData);
547
548 CpiPartitionListFree(&partList);
549 CpiPartitionRoleListFree(&partRoleList);
550 CpiUserInPartitionRoleListFree(&usrInPartRoleList);
551 CpiPartitionUserListFree(&partUsrList);
552 CpiApplicationListFree(&appList);
553 CpiApplicationRoleListFree(&appRoleList);
554 CpiUserInApplicationRoleListFree(&usrInAppRoleList);
555 CpiAssemblyListFree(&asmList);
556 CpiSubscriptionListFree(&subList);
557
558 // unitialize
559 CpiSchedFinalize();
560
561 if (fInitializedCom)
562 ::CoUninitialize();
563
564 er = SUCCEEDED(hr) ? ERROR_SUCCESS : ERROR_INSTALL_FAILURE;
565 return WcaFinalize(er);
566}