diff options
Diffstat (limited to 'src/ext/ComPlus/ca/cpexec.cpp')
-rw-r--r-- | src/ext/ComPlus/ca/cpexec.cpp | 681 |
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 | ********************************************************************/ | ||
10 | extern "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 | |||
36 | LExit: | ||
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 | ********************************************************************/ | ||
52 | extern "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 | |||
79 | LExit: | ||
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 | ********************************************************************/ | ||
92 | extern "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 | |||
175 | LExit: | ||
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 | ********************************************************************/ | ||
198 | extern "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 | |||
254 | LExit: | ||
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 | ********************************************************************/ | ||
276 | extern "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 | |||
391 | LExit: | ||
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 | ********************************************************************/ | ||
433 | extern "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 | |||
516 | LExit: | ||
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 | ********************************************************************/ | ||
539 | extern "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 | |||
646 | LExit: | ||
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 | } | ||