aboutsummaryrefslogtreecommitdiff
path: root/src/ext/ComPlus/ca/cpexec.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/ext/ComPlus/ca/cpexec.cpp')
-rw-r--r--src/ext/ComPlus/ca/cpexec.cpp681
1 files changed, 681 insertions, 0 deletions
diff --git a/src/ext/ComPlus/ca/cpexec.cpp b/src/ext/ComPlus/ca/cpexec.cpp
new file mode 100644
index 00000000..9b1691fc
--- /dev/null
+++ b/src/ext/ComPlus/ca/cpexec.cpp
@@ -0,0 +1,681 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3#include "precomp.h"
4
5/********************************************************************
6 ComPlusPrepare - CUSTOM ACTION ENTRY POINT
7
8 Input: deferred CustomActionData - ComPlusPrepare
9********************************************************************/
10extern "C" UINT __stdcall ComPlusPrepare(MSIHANDLE hInstall)
11{
12 HRESULT hr = S_OK;
13 UINT er = ERROR_SUCCESS;
14
15 LPWSTR pwzCustomActionData = NULL;
16 LPWSTR pwzData = NULL;
17
18 HANDLE hRollbackFile = INVALID_HANDLE_VALUE;
19
20 // initialize
21 hr = WcaInitialize(hInstall, "ComPlusPrepare");
22 ExitOnFailure(hr, "Failed to initialize ComPlusPrepare");
23
24 // get custom action data
25 hr = WcaGetProperty(L"CustomActionData", &pwzCustomActionData);
26 ExitOnFailure(hr, "Failed to get CustomActionData");
27 pwzData = pwzCustomActionData;
28
29 // create rollback file
30 hRollbackFile = ::CreateFileW(pwzData, GENERIC_WRITE, 0, NULL, CREATE_NEW, FILE_ATTRIBUTE_TEMPORARY, NULL);
31 if (INVALID_HANDLE_VALUE == hRollbackFile)
32 ExitOnFailure(hr = HRESULT_FROM_WIN32(::GetLastError()), "Failed to create rollback file, name: %S", pwzData);
33
34 hr = S_OK;
35
36LExit:
37 // clean up
38 ReleaseStr(pwzCustomActionData);
39
40 if (INVALID_HANDLE_VALUE != hRollbackFile)
41 ::CloseHandle(hRollbackFile);
42
43 er = SUCCEEDED(hr) ? ERROR_SUCCESS : ERROR_INSTALL_FAILURE;
44 return WcaFinalize(er);
45}
46
47/********************************************************************
48 ComPlusCleanup - CUSTOM ACTION ENTRY POINT
49
50 Input: deferred CustomActionData - ComPlusCleanup
51********************************************************************/
52extern "C" UINT __stdcall ComPlusCleanup(MSIHANDLE hInstall)
53{
54 HRESULT hr = S_OK;
55 UINT er = ERROR_SUCCESS;
56
57 LPWSTR pwzCustomActionData = NULL;
58 LPWSTR pwzData = NULL;
59
60 // initialize
61 hr = WcaInitialize(hInstall, "ComPlusCleanup");
62 ExitOnFailure(hr, "Failed to initialize ComPlusCleanup");
63
64 // get custom action data
65 hr = WcaGetProperty(L"CustomActionData", &pwzCustomActionData);
66 ExitOnFailure(hr, "Failed to get CustomActionData");
67 pwzData = pwzCustomActionData;
68
69 // delete rollback file
70 if (!::DeleteFileW(pwzData))
71 {
72 // error, but not a showstopper
73 hr = HRESULT_FROM_WIN32(::GetLastError());
74 WcaLog(LOGMSG_STANDARD, "Failed to delete rollback file, hr: 0x%x, name: %S", hr, pwzData);
75 }
76
77 hr = S_OK;
78
79LExit:
80 // clean up
81 ReleaseStr(pwzCustomActionData);
82
83 er = SUCCEEDED(hr) ? ERROR_SUCCESS : ERROR_INSTALL_FAILURE;
84 return WcaFinalize(er);
85}
86
87/********************************************************************
88 ComPlusInstallExecute - CUSTOM ACTION ENTRY POINT
89
90 Input: deferred CustomActionData - ComPlusInstallExecute
91********************************************************************/
92extern "C" UINT __stdcall ComPlusInstallExecute(MSIHANDLE hInstall)
93{
94 HRESULT hr = S_OK;
95 UINT er = ERROR_SUCCESS;
96
97 LPWSTR pwzCustomActionData = NULL;
98 LPWSTR pwzData = NULL;
99 LPWSTR pwzRollbackFileName = NULL;
100
101 HANDLE hRollbackFile = INVALID_HANDLE_VALUE;
102
103 BOOL fInitializedCom = FALSE;
104
105 // initialize
106 hr = WcaInitialize(hInstall, "ComPlusInstallExecute");
107 ExitOnFailure(hr, "Failed to initialize ComPlusInstallExecute");
108
109 hr = ::CoInitialize(NULL);
110 ExitOnFailure(hr, "Failed to initialize COM");
111 fInitializedCom = TRUE;
112
113 CpiExecInitialize();
114
115 // get custom action data
116 hr = WcaGetProperty(L"CustomActionData", &pwzCustomActionData);
117 ExitOnFailure(hr, "Failed to get CustomActionData");
118 pwzData = pwzCustomActionData;
119
120 // open rollback file
121 hr = WcaReadStringFromCaData(&pwzData, &pwzRollbackFileName);
122 ExitOnFailure(hr, "Failed to read rollback file name");
123
124 hRollbackFile = ::CreateFileW(pwzRollbackFileName, GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_TEMPORARY, NULL);
125 if (INVALID_HANDLE_VALUE == hRollbackFile)
126 ExitOnFailure(hr = HRESULT_FROM_WIN32(::GetLastError()), "Failed to open rollback file, name: %S", pwzRollbackFileName);
127
128 // create partitions
129 hr = CpiConfigurePartitions(&pwzData, hRollbackFile);
130 ExitOnFailure(hr, "Failed to create partitions");
131 if (S_FALSE == hr) ExitFunction();
132
133 // create users in partition roles
134 hr = CpiConfigureUsersInPartitionRoles(&pwzData, hRollbackFile);
135 ExitOnFailure(hr, "Failed to create users in partition roles");
136 if (S_FALSE == hr) ExitFunction();
137
138 // create partition users
139 hr = CpiConfigurePartitionUsers(&pwzData, hRollbackFile);
140 ExitOnFailure(hr, "Failed to add partition users");
141 if (S_FALSE == hr) ExitFunction();
142
143 // create applications
144 hr = CpiConfigureApplications(&pwzData, hRollbackFile);
145 ExitOnFailure(hr, "Failed to create applications");
146 if (S_FALSE == hr) ExitFunction();
147
148 // create application roles
149 hr = CpiConfigureApplicationRoles(&pwzData, hRollbackFile);
150 ExitOnFailure(hr, "Failed to create application roles");
151 if (S_FALSE == hr) ExitFunction();
152
153 // create users in application roles
154 hr = CpiConfigureUsersInApplicationRoles(&pwzData, hRollbackFile);
155 ExitOnFailure(hr, "Failed to create users in application roles");
156 if (S_FALSE == hr) ExitFunction();
157
158 // register assemblies
159 hr = CpiConfigureAssemblies(&pwzData, hRollbackFile);
160 ExitOnFailure(hr, "Failed to register assemblies");
161 if (S_FALSE == hr) ExitFunction();
162
163 // create role assignments
164 hr = CpiConfigureRoleAssignments(&pwzData, hRollbackFile);
165 ExitOnFailure(hr, "Failed to create role assignments");
166 if (S_FALSE == hr) ExitFunction();
167
168 // create subscriptions
169 hr = CpiConfigureSubscriptions(&pwzData, hRollbackFile);
170 ExitOnFailure(hr, "Failed to create subscriptions");
171 if (S_FALSE == hr) ExitFunction();
172
173 hr = S_OK;
174
175LExit:
176 // clean up
177 ReleaseStr(pwzCustomActionData);
178 ReleaseStr(pwzRollbackFileName);
179
180 if (INVALID_HANDLE_VALUE != hRollbackFile)
181 ::CloseHandle(hRollbackFile);
182
183 // unitialize
184 CpiExecFinalize();
185
186 if (fInitializedCom)
187 ::CoUninitialize();
188
189 er = SUCCEEDED(hr) ? ERROR_SUCCESS : ERROR_INSTALL_FAILURE;
190 return WcaFinalize(er);
191}
192
193/********************************************************************
194 ComPlusInstallExecuteCommit - CUSTOM ACTION ENTRY POINT
195
196 Input: deferred CustomActionData - ComPlusInstallExecuteCommit
197********************************************************************/
198extern "C" UINT __stdcall ComPlusInstallExecuteCommit(MSIHANDLE hInstall)
199{
200 HRESULT hr = S_OK;
201 UINT er = ERROR_SUCCESS;
202
203 LPWSTR pwzCustomActionData = NULL;
204 LPWSTR pwzData = NULL;
205 LPWSTR pwzRollbackFileName = NULL;
206
207 HANDLE hRollbackFile = INVALID_HANDLE_VALUE;
208
209 BOOL fInitializedCom = FALSE;
210
211 // initialize
212 hr = WcaInitialize(hInstall, "ComPlusInstallExecuteCommit");
213 ExitOnFailure(hr, "Failed to initialize ComPlusInstallExecuteCommit");
214
215 hr = ::CoInitialize(NULL);
216 ExitOnFailure(hr, "Failed to initialize COM");
217 fInitializedCom = TRUE;
218
219 CpiExecInitialize();
220
221 // get custom action data
222 hr = WcaGetProperty(L"CustomActionData", &pwzCustomActionData);
223 ExitOnFailure(hr, "Failed to get CustomActionData");
224 pwzData = pwzCustomActionData;
225
226 // open rollback file
227 hr = WcaReadStringFromCaData(&pwzData, &pwzRollbackFileName);
228 ExitOnFailure(hr, "Failed to read rollback file name");
229
230 hRollbackFile = ::CreateFileW(pwzRollbackFileName, GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_TEMPORARY, NULL);
231 if (INVALID_HANDLE_VALUE == hRollbackFile)
232 ExitOnFailure(hr = HRESULT_FROM_WIN32(::GetLastError()), "Failed to open rollback file, name: %S", pwzRollbackFileName);
233
234 if (INVALID_SET_FILE_POINTER == ::SetFilePointer(hRollbackFile, 0, NULL, FILE_END))
235 ExitOnFailure(hr = HRESULT_FROM_WIN32(::GetLastError()), "Failed to set file pointer");
236
237 // register assemblies
238 hr = CpiConfigureAssemblies(&pwzData, hRollbackFile);
239 ExitOnFailure(hr, "Failed to register assemblies");
240 if (S_FALSE == hr) ExitFunction();
241
242 // create role assignments
243 hr = CpiConfigureRoleAssignments(&pwzData, hRollbackFile);
244 ExitOnFailure(hr, "Failed to create role assignments");
245 if (S_FALSE == hr) ExitFunction();
246
247 // create subscriptions
248 hr = CpiConfigureSubscriptions(&pwzData, hRollbackFile);
249 ExitOnFailure(hr, "Failed to create subscriptions");
250 if (S_FALSE == hr) ExitFunction();
251
252 hr = S_OK;
253
254LExit:
255 // clean up
256 ReleaseStr(pwzCustomActionData);
257
258 if (INVALID_HANDLE_VALUE != hRollbackFile)
259 ::CloseHandle(hRollbackFile);
260
261 // unitialize
262 CpiExecFinalize();
263
264 if (fInitializedCom)
265 ::CoUninitialize();
266
267 er = SUCCEEDED(hr) ? ERROR_SUCCESS : ERROR_INSTALL_FAILURE;
268 return WcaFinalize(er);
269}
270
271/********************************************************************
272 ComPlusRollbackInstallExecute - CUSTOM ACTION ENTRY POINT
273
274 Input: deferred CustomActionData - ComPlusRollbackInstallExecute
275********************************************************************/
276extern "C" UINT __stdcall ComPlusRollbackInstallExecute(MSIHANDLE hInstall)
277{
278 HRESULT hr = S_OK;
279 UINT er = ERROR_SUCCESS;
280
281 LPWSTR pwzCustomActionData = NULL;
282 LPWSTR pwzData = NULL;
283 LPWSTR pwzRollbackFileName = NULL;
284
285 HANDLE hRollbackFile = INVALID_HANDLE_VALUE;
286
287 CPI_ROLLBACK_DATA* prdPartitions = NULL;
288 CPI_ROLLBACK_DATA* prdUsersInPartitionRoles = NULL;
289 CPI_ROLLBACK_DATA* prdPartitionUsers = NULL;
290 CPI_ROLLBACK_DATA* prdApplications = NULL;
291 CPI_ROLLBACK_DATA* prdApplicationRoles = NULL;
292 CPI_ROLLBACK_DATA* prdUsersApplicationRoles = NULL;
293 CPI_ROLLBACK_DATA* prdAssemblies = NULL;
294 CPI_ROLLBACK_DATA* prdRoleAssignments = NULL;
295 CPI_ROLLBACK_DATA* prdSubscriptions = NULL;
296
297 BOOL fInitializedCom = FALSE;
298
299 // initialize
300 hr = WcaInitialize(hInstall, "ComPlusRollbackInstallExecute");
301 ExitOnFailure(hr, "Failed to initialize ComPlusRollbackInstallExecute");
302
303 hr = ::CoInitialize(NULL);
304 ExitOnFailure(hr, "Failed to initialize COM");
305 fInitializedCom = TRUE;
306
307 CpiExecInitialize();
308
309 // get custom action data
310 hr = WcaGetProperty(L"CustomActionData", &pwzCustomActionData);
311 ExitOnFailure(hr, "Failed to get CustomActionData");
312 pwzData = pwzCustomActionData;
313
314 // open rollback file
315 hr = WcaReadStringFromCaData(&pwzData, &pwzRollbackFileName);
316 ExitOnFailure(hr, "Failed to read rollback file name");
317
318 hRollbackFile = ::CreateFileW(pwzRollbackFileName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_TEMPORARY, NULL);
319 if (INVALID_HANDLE_VALUE == hRollbackFile)
320 ExitOnFailure(hr = HRESULT_FROM_WIN32(::GetLastError()), "Failed to open rollback file, name: %S", pwzRollbackFileName);
321
322 // read rollback data (execute)
323 hr = CpiReadRollbackDataList(hRollbackFile, &prdPartitions);
324 ExitOnFailure(hr, "Failed to read partitions rollback data");
325 hr = CpiReadRollbackDataList(hRollbackFile, &prdUsersInPartitionRoles);
326 ExitOnFailure(hr, "Failed to read users in partition roles rollback data");
327 hr = CpiReadRollbackDataList(hRollbackFile, &prdPartitionUsers);
328 ExitOnFailure(hr, "Failed to read partition users rollback data");
329 hr = CpiReadRollbackDataList(hRollbackFile, &prdApplications);
330 ExitOnFailure(hr, "Failed to read applications rollback data");
331 hr = CpiReadRollbackDataList(hRollbackFile, &prdApplicationRoles);
332 ExitOnFailure(hr, "Failed to read application roles rollback data");
333 hr = CpiReadRollbackDataList(hRollbackFile, &prdUsersApplicationRoles);
334 ExitOnFailure(hr, "Failed to read users in application roles rollback data");
335 hr = CpiReadRollbackDataList(hRollbackFile, &prdAssemblies);
336 ExitOnFailure(hr, "Failed to read assemblies rollback data");
337 hr = CpiReadRollbackDataList(hRollbackFile, &prdRoleAssignments);
338 ExitOnFailure(hr, "Failed to read role assignments rollback data");
339 hr = CpiReadRollbackDataList(hRollbackFile, &prdSubscriptions);
340 ExitOnFailure(hr, "Failed to read subscription rollback data");
341
342 // read rollback data (commit)
343 hr = CpiReadRollbackDataList(hRollbackFile, &prdAssemblies);
344 ExitOnFailure(hr, "Failed to read assemblies rollback data (commit)");
345 hr = CpiReadRollbackDataList(hRollbackFile, &prdRoleAssignments);
346 ExitOnFailure(hr, "Failed to read role assignments rollback data");
347 hr = CpiReadRollbackDataList(hRollbackFile, &prdSubscriptions);
348 ExitOnFailure(hr, "Failed to read subscription rollback data (commit)");
349
350 ::CloseHandle(hRollbackFile);
351 hRollbackFile = INVALID_HANDLE_VALUE;
352
353 // rollback create subscriptions
354 hr = CpiRollbackConfigureSubscriptions(&pwzData, prdSubscriptions);
355 ExitOnFailure(hr, "Failed to rollback create subscriptions");
356
357 // rollback create role assignments
358 hr = CpiRollbackConfigureRoleAssignments(&pwzData, prdRoleAssignments);
359 ExitOnFailure(hr, "Failed to rollback create role assignments");
360
361 // rollback register assemblies
362 hr = CpiRollbackConfigureAssemblies(&pwzData, prdAssemblies);
363 ExitOnFailure(hr, "Failed to rollback register assemblies");
364
365 // rollback create users in application roles
366 hr = CpiRollbackConfigureUsersInApplicationRoles(&pwzData, prdUsersApplicationRoles);
367 ExitOnFailure(hr, "Failed to rollback create users in application roles");
368
369 // rollback create application roles
370 hr = CpiRollbackConfigureApplicationRoles(&pwzData, prdApplicationRoles);
371 ExitOnFailure(hr, "Failed to rollback create application roles");
372
373 // rollback create applications
374 hr = CpiRollbackConfigureApplications(&pwzData, prdApplications);
375 ExitOnFailure(hr, "Failed to rollback create applications");
376
377 // rollback create partition users
378 hr = CpiRollbackConfigurePartitionUsers(&pwzData, prdPartitionUsers);
379 ExitOnFailure(hr, "Failed to rollback create partition users");
380
381 // rollback create users in partition roles
382 hr = CpiRollbackConfigureUsersInPartitionRoles(&pwzData, prdUsersInPartitionRoles);
383 ExitOnFailure(hr, "Failed to rollback create users in partition roles");
384
385 // rollback create partitions
386 hr = CpiRollbackConfigurePartitions(&pwzData, prdPartitions);
387 ExitOnFailure(hr, "Failed to rollback create partitions");
388
389 hr = S_OK;
390
391LExit:
392 // clean up
393 ReleaseStr(pwzCustomActionData);
394 ReleaseStr(pwzRollbackFileName);
395
396 if (INVALID_HANDLE_VALUE != hRollbackFile)
397 ::CloseHandle(hRollbackFile);
398
399 if (prdPartitions)
400 CpiFreeRollbackDataList(prdPartitions);
401 if (prdUsersInPartitionRoles)
402 CpiFreeRollbackDataList(prdUsersInPartitionRoles);
403 if (prdPartitionUsers)
404 CpiFreeRollbackDataList(prdPartitionUsers);
405 if (prdApplications)
406 CpiFreeRollbackDataList(prdApplications);
407 if (prdApplicationRoles)
408 CpiFreeRollbackDataList(prdApplicationRoles);
409 if (prdUsersApplicationRoles)
410 CpiFreeRollbackDataList(prdUsersApplicationRoles);
411 if (prdAssemblies)
412 CpiFreeRollbackDataList(prdAssemblies);
413 if (prdRoleAssignments)
414 CpiFreeRollbackDataList(prdRoleAssignments);
415 if (prdSubscriptions)
416 CpiFreeRollbackDataList(prdSubscriptions);
417
418 // unitialize
419 CpiExecFinalize();
420
421 if (fInitializedCom)
422 ::CoUninitialize();
423
424 er = SUCCEEDED(hr) ? ERROR_SUCCESS : ERROR_INSTALL_FAILURE;
425 return WcaFinalize(er);
426}
427
428/********************************************************************
429 ComPlusUninstallExecute - CUSTOM ACTION ENTRY POINT
430
431 Input: deferred CustomActionData - ComPlusUninstallExecute
432********************************************************************/
433extern "C" UINT __stdcall ComPlusUninstallExecute(MSIHANDLE hInstall)
434{
435 HRESULT hr = S_OK;
436 UINT er = ERROR_SUCCESS;
437
438 LPWSTR pwzCustomActionData = NULL;
439 LPWSTR pwzData = NULL;
440 LPWSTR pwzRollbackFileName = NULL;
441
442 HANDLE hRollbackFile = INVALID_HANDLE_VALUE;
443
444 BOOL fInitializedCom = FALSE;
445
446 // initialize
447 hr = WcaInitialize(hInstall, "ComPlusUninstallExecute");
448 ExitOnFailure(hr, "Failed to initialize ComPlusUninstallExecute");
449
450 hr = ::CoInitialize(NULL);
451 ExitOnFailure(hr, "Failed to initialize COM");
452 fInitializedCom = TRUE;
453
454 CpiExecInitialize();
455
456 // get custom action data
457 hr = WcaGetProperty(L"CustomActionData", &pwzCustomActionData);
458 ExitOnFailure(hr, "Failed to get CustomActionData");
459 pwzData = pwzCustomActionData;
460
461 // open rollback file
462 hr = WcaReadStringFromCaData(&pwzData, &pwzRollbackFileName);
463 ExitOnFailure(hr, "Failed to read rollback file name");
464
465 hRollbackFile = ::CreateFileW(pwzRollbackFileName, GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_TEMPORARY, NULL);
466 if (INVALID_HANDLE_VALUE == hRollbackFile)
467 ExitOnFailure(hr = HRESULT_FROM_WIN32(::GetLastError()), "Failed to open rollback file, name: %S", pwzRollbackFileName);
468
469 // delete subscriptions
470 hr = CpiConfigureSubscriptions(&pwzData, hRollbackFile);
471 ExitOnFailure(hr, "Failed to delete subscriptions");
472 if (S_FALSE == hr) ExitFunction();
473
474 // delete role assignments
475 hr = CpiConfigureRoleAssignments(&pwzData, hRollbackFile);
476 ExitOnFailure(hr, "Failed to delete role assignments");
477 if (S_FALSE == hr) ExitFunction();
478
479 // unregister assemblies
480 hr = CpiConfigureAssemblies(&pwzData, hRollbackFile);
481 ExitOnFailure(hr, "Failed to unregister assemblies");
482 if (S_FALSE == hr) ExitFunction();
483
484 // remove users in application roles
485 hr = CpiConfigureUsersInApplicationRoles(&pwzData, hRollbackFile);
486 ExitOnFailure(hr, "Failed to delete users in application roles");
487 if (S_FALSE == hr) ExitFunction();
488
489 // remove application roles
490 hr = CpiConfigureApplicationRoles(&pwzData, hRollbackFile);
491 ExitOnFailure(hr, "Failed to delete application roles");
492 if (S_FALSE == hr) ExitFunction();
493
494 // remove applications
495 hr = CpiConfigureApplications(&pwzData, hRollbackFile);
496 ExitOnFailure(hr, "Failed to remove applications");
497 if (S_FALSE == hr) ExitFunction();
498
499 // remove partition users
500 hr = CpiConfigurePartitionUsers(&pwzData, hRollbackFile);
501 ExitOnFailure(hr, "Failed to remove partition users");
502 if (S_FALSE == hr) ExitFunction();
503
504 // remove users in partition roles
505 hr = CpiConfigureUsersInPartitionRoles(&pwzData, hRollbackFile);
506 ExitOnFailure(hr, "Failed to delete users in partition roles");
507 if (S_FALSE == hr) ExitFunction();
508
509 // remove partitions
510 hr = CpiConfigurePartitions(&pwzData, hRollbackFile);
511 ExitOnFailure(hr, "Failed to delete partitions");
512 if (S_FALSE == hr) ExitFunction();
513
514 hr = S_OK;
515
516LExit:
517 // clean up
518 ReleaseStr(pwzCustomActionData);
519 ReleaseStr(pwzRollbackFileName);
520
521 if (INVALID_HANDLE_VALUE != hRollbackFile)
522 ::CloseHandle(hRollbackFile);
523
524 // unitialize
525 CpiExecFinalize();
526
527 if (fInitializedCom)
528 ::CoUninitialize();
529
530 er = SUCCEEDED(hr) ? ERROR_SUCCESS : ERROR_INSTALL_FAILURE;
531 return WcaFinalize(er);
532}
533
534/********************************************************************
535 ComPlusRollbackUninstallExecute - CUSTOM ACTION ENTRY POINT
536
537 Input: deferred CustomActionData - ComPlusRollbackUninstallExecute
538********************************************************************/
539extern "C" UINT __stdcall ComPlusRollbackUninstallExecute(MSIHANDLE hInstall)
540{
541 HRESULT hr = S_OK;
542 UINT er = ERROR_SUCCESS;
543
544 LPWSTR pwzCustomActionData = NULL;
545 LPWSTR pwzData = NULL;
546 LPWSTR pwzRollbackFileName = NULL;
547
548 HANDLE hRollbackFile = INVALID_HANDLE_VALUE;
549
550 CPI_ROLLBACK_DATA* prdPartitions = NULL;
551 CPI_ROLLBACK_DATA* prdUsersInPartitionRoles = NULL;
552 CPI_ROLLBACK_DATA* prdPartitionUsers = NULL;
553 CPI_ROLLBACK_DATA* prdApplications = NULL;
554 CPI_ROLLBACK_DATA* prdApplicationRoles = NULL;
555 CPI_ROLLBACK_DATA* prdUsersApplicationRoles = NULL;
556 CPI_ROLLBACK_DATA* prdAssemblies = NULL;
557 CPI_ROLLBACK_DATA* prdRoleAssignments = NULL;
558 CPI_ROLLBACK_DATA* prdSubscriptions = NULL;
559
560 BOOL fInitializedCom = FALSE;
561
562 // initialize
563 hr = WcaInitialize(hInstall, "ComPlusRollbackUninstallExecute");
564 ExitOnFailure(hr, "Failed to initialize ComPlusRollbackUninstallExecute");
565
566 hr = ::CoInitialize(NULL);
567 ExitOnFailure(hr, "Failed to initialize COM");
568 fInitializedCom = TRUE;
569
570 CpiExecInitialize();
571
572 // get custom action data
573 hr = WcaGetProperty(L"CustomActionData", &pwzCustomActionData);
574 ExitOnFailure(hr, "Failed to get CustomActionData");
575 pwzData = pwzCustomActionData;
576
577 // open rollback file
578 hr = WcaReadStringFromCaData(&pwzData, &pwzRollbackFileName);
579 ExitOnFailure(hr, "Failed to read rollback file name");
580
581 hRollbackFile = ::CreateFileW(pwzRollbackFileName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_TEMPORARY, NULL);
582 if (INVALID_HANDLE_VALUE == hRollbackFile)
583 ExitOnFailure(hr = HRESULT_FROM_WIN32(::GetLastError()), "Failed to open rollback file, name: %S", pwzRollbackFileName);
584
585 // read rollback data
586 hr = CpiReadRollbackDataList(hRollbackFile, &prdSubscriptions);
587 ExitOnFailure(hr, "Failed to read subscription rollback data");
588 hr = CpiReadRollbackDataList(hRollbackFile, &prdRoleAssignments);
589 ExitOnFailure(hr, "Failed to read role assignments rollback data");
590 hr = CpiReadRollbackDataList(hRollbackFile, &prdAssemblies);
591 ExitOnFailure(hr, "Failed to read assemblies rollback data");
592 hr = CpiReadRollbackDataList(hRollbackFile, &prdUsersApplicationRoles);
593 ExitOnFailure(hr, "Failed to read users in application roles rollback data");
594 hr = CpiReadRollbackDataList(hRollbackFile, &prdApplicationRoles);
595 ExitOnFailure(hr, "Failed to read application roles rollback data");
596 hr = CpiReadRollbackDataList(hRollbackFile, &prdApplications);
597 ExitOnFailure(hr, "Failed to read applications rollback data");
598 hr = CpiReadRollbackDataList(hRollbackFile, &prdPartitionUsers);
599 ExitOnFailure(hr, "Failed to read partition users rollback data");
600 hr = CpiReadRollbackDataList(hRollbackFile, &prdUsersInPartitionRoles);
601 ExitOnFailure(hr, "Failed to read users in partition roles rollback data");
602 hr = CpiReadRollbackDataList(hRollbackFile, &prdPartitions);
603 ExitOnFailure(hr, "Failed to read partitions rollback data");
604
605 ::CloseHandle(hRollbackFile);
606 hRollbackFile = INVALID_HANDLE_VALUE;
607
608 // rollback remove partitions
609 hr = CpiRollbackConfigurePartitions(&pwzData, prdPartitions);
610 ExitOnFailure(hr, "Failed to rollback delete partitions");
611
612 // rollback remove users in partition roles
613 hr = CpiRollbackConfigureUsersInPartitionRoles(&pwzData, prdUsersInPartitionRoles);
614 ExitOnFailure(hr, "Failed to rollback delete users in partition roles");
615
616 // rollback remove partition users
617 hr = CpiRollbackConfigurePartitionUsers(&pwzData, prdPartitionUsers);
618 ExitOnFailure(hr, "Failed to rollback delete partition users");
619
620 // rollback remove applications
621 hr = CpiRollbackConfigureApplications(&pwzData, prdApplications);
622 ExitOnFailure(hr, "Failed to rollback delete applications");
623
624 // rollback remove application roles
625 hr = CpiRollbackConfigureApplicationRoles(&pwzData, prdApplicationRoles);
626 ExitOnFailure(hr, "Failed to rollback delete application roles");
627
628 // rollback remove users in application roles
629 hr = CpiRollbackConfigureUsersInApplicationRoles(&pwzData, prdUsersApplicationRoles);
630 ExitOnFailure(hr, "Failed to rollback delete users in application roles");
631
632 // rollback unregister assemblies
633 hr = CpiRollbackConfigureAssemblies(&pwzData, prdAssemblies);
634 ExitOnFailure(hr, "Failed to rollback unregister assemblies");
635
636 // rollback delete role assignments
637 hr = CpiRollbackConfigureRoleAssignments(&pwzData, prdAssemblies);
638 ExitOnFailure(hr, "Failed to rollback delete role assignments");
639
640 // rollback delete subscriptions
641 hr = CpiRollbackConfigureSubscriptions(&pwzData, prdSubscriptions);
642 ExitOnFailure(hr, "Failed to rollback delete subscriptions");
643
644 hr = S_OK;
645
646LExit:
647 // clean up
648 ReleaseStr(pwzCustomActionData);
649 ReleaseStr(pwzRollbackFileName);
650
651 if (INVALID_HANDLE_VALUE != hRollbackFile)
652 ::CloseHandle(hRollbackFile);
653
654 if (prdPartitions)
655 CpiFreeRollbackDataList(prdPartitions);
656 if (prdUsersInPartitionRoles)
657 CpiFreeRollbackDataList(prdUsersInPartitionRoles);
658 if (prdPartitionUsers)
659 CpiFreeRollbackDataList(prdPartitionUsers);
660 if (prdApplications)
661 CpiFreeRollbackDataList(prdApplications);
662 if (prdApplicationRoles)
663 CpiFreeRollbackDataList(prdApplicationRoles);
664 if (prdUsersApplicationRoles)
665 CpiFreeRollbackDataList(prdUsersApplicationRoles);
666 if (prdAssemblies)
667 CpiFreeRollbackDataList(prdAssemblies);
668 if (prdRoleAssignments)
669 CpiFreeRollbackDataList(prdRoleAssignments);
670 if (prdSubscriptions)
671 CpiFreeRollbackDataList(prdSubscriptions);
672
673 // unitialize
674 CpiExecFinalize();
675
676 if (fInitializedCom)
677 ::CoUninitialize();
678
679 er = SUCCEEDED(hr) ? ERROR_SUCCESS : ERROR_INSTALL_FAILURE;
680 return WcaFinalize(er);
681}