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