diff options
Diffstat (limited to 'src/ca/mqsched.cpp')
-rw-r--r-- | src/ca/mqsched.cpp | 219 |
1 files changed, 219 insertions, 0 deletions
diff --git a/src/ca/mqsched.cpp b/src/ca/mqsched.cpp new file mode 100644 index 00000000..cefce853 --- /dev/null +++ b/src/ca/mqsched.cpp | |||
@@ -0,0 +1,219 @@ | |||
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 | /******************************************************************** | ||
7 | DllMain - standard entry point for all WiX CustomActions | ||
8 | |||
9 | ********************************************************************/ | ||
10 | extern "C" BOOL WINAPI DllMain( | ||
11 | IN HINSTANCE hInst, | ||
12 | IN ULONG ulReason, | ||
13 | IN LPVOID) | ||
14 | { | ||
15 | switch(ulReason) | ||
16 | { | ||
17 | case DLL_PROCESS_ATTACH: | ||
18 | WcaGlobalInitialize(hInst); | ||
19 | break; | ||
20 | |||
21 | case DLL_PROCESS_DETACH: | ||
22 | WcaGlobalFinalize(); | ||
23 | break; | ||
24 | } | ||
25 | |||
26 | return TRUE; | ||
27 | } | ||
28 | |||
29 | /******************************************************************** | ||
30 | MessageQueuingInstall - CUSTOM ACTION ENTRY POINT for installing MSMQ message queues | ||
31 | |||
32 | ********************************************************************/ | ||
33 | extern "C" UINT __stdcall MessageQueuingInstall(MSIHANDLE hInstall) | ||
34 | { | ||
35 | HRESULT hr = S_OK; | ||
36 | UINT er = ERROR_SUCCESS; | ||
37 | |||
38 | MQI_MESSAGE_QUEUE_LIST lstMessageQueues; | ||
39 | MQI_MESSAGE_QUEUE_PERMISSION_LIST lstMessageQueuePermissions; | ||
40 | |||
41 | int iCost = 0; | ||
42 | LPWSTR pwzRollbackActionData = NULL; | ||
43 | LPWSTR pwzExecuteActionData = NULL; | ||
44 | |||
45 | ::ZeroMemory(&lstMessageQueues, sizeof(lstMessageQueues)); | ||
46 | ::ZeroMemory(&lstMessageQueuePermissions, sizeof(lstMessageQueuePermissions)); | ||
47 | |||
48 | // initialize | ||
49 | hr = WcaInitialize(hInstall, "MessageQueuingInstall"); | ||
50 | ExitOnFailure(hr, "Failed to initialize"); | ||
51 | |||
52 | do | ||
53 | { | ||
54 | hr = MqiInitialize(); | ||
55 | if (S_FALSE == hr) | ||
56 | { | ||
57 | WcaLog(LOGMSG_STANDARD, "Failed to load mqrt.dll."); | ||
58 | er = WcaErrorMessage(msierrMsmqCannotConnect, hr, INSTALLMESSAGE_ERROR | MB_ABORTRETRYIGNORE, 0); | ||
59 | switch (er) | ||
60 | { | ||
61 | case IDABORT: | ||
62 | ExitFunction1(hr = E_FAIL); // bail with error | ||
63 | case IDRETRY: | ||
64 | break; // retry | ||
65 | case IDIGNORE: __fallthrough; | ||
66 | default: | ||
67 | ExitFunction1(hr = S_OK); // pretend everything is okay and bail | ||
68 | } | ||
69 | } | ||
70 | ExitOnFailure(hr, "Failed to initialize MSMQ."); | ||
71 | } while (S_FALSE == hr); | ||
72 | |||
73 | // read message queues | ||
74 | hr = MqiMessageQueueRead(&lstMessageQueues); | ||
75 | ExitOnFailure(hr, "Failed to read MessageQueue table"); | ||
76 | |||
77 | // read message queue permissions | ||
78 | hr = MqiMessageQueuePermissionRead(&lstMessageQueues, &lstMessageQueuePermissions); | ||
79 | ExitOnFailure(hr, "Failed to read message queue permissions"); | ||
80 | |||
81 | // verify message queue elementes | ||
82 | hr = MqiMessageQueueVerify(&lstMessageQueues); | ||
83 | ExitOnFailure(hr, "Failed to verify message queue elements."); | ||
84 | |||
85 | if (lstMessageQueues.iInstallCount || lstMessageQueuePermissions.iInstallCount) | ||
86 | { | ||
87 | // schedule rollback action | ||
88 | hr = MqiMessageQueuePermissionInstall(&lstMessageQueuePermissions, &pwzRollbackActionData); | ||
89 | ExitOnFailure(hr, "Failed to add message queue permissions to rollback action data"); | ||
90 | |||
91 | hr = MqiMessageQueueInstall(&lstMessageQueues, TRUE, &pwzRollbackActionData); | ||
92 | ExitOnFailure(hr, "Failed to add message queues to rollback action data"); | ||
93 | |||
94 | hr = WcaDoDeferredAction(L"MessageQueuingRollbackInstall", pwzRollbackActionData, 0); | ||
95 | ExitOnFailure(hr, "Failed to schedule MessageQueuingRollbackInstall"); | ||
96 | |||
97 | // schedule execute action | ||
98 | hr = MqiMessageQueueInstall(&lstMessageQueues, FALSE, &pwzExecuteActionData); | ||
99 | ExitOnFailure(hr, "Failed to add message queues to execute action data"); | ||
100 | iCost += lstMessageQueues.iInstallCount * COST_MESSAGE_QUEUE_CREATE; | ||
101 | |||
102 | hr = MqiMessageQueuePermissionInstall(&lstMessageQueuePermissions, &pwzExecuteActionData); | ||
103 | ExitOnFailure(hr, "Failed to add message queue permissions to execute action data"); | ||
104 | iCost += lstMessageQueues.iInstallCount * COST_MESSAGE_QUEUE_PERMISSION_ADD; | ||
105 | |||
106 | hr = WcaDoDeferredAction(L"MessageQueuingExecuteInstall", pwzExecuteActionData, iCost); | ||
107 | ExitOnFailure(hr, "Failed to schedule MessageQueuingExecuteInstall"); | ||
108 | } | ||
109 | |||
110 | hr = S_OK; | ||
111 | |||
112 | LExit: | ||
113 | // clean up | ||
114 | MqiMessageQueueFreeList(&lstMessageQueues); | ||
115 | MqiMessageQueuePermissionFreeList(&lstMessageQueuePermissions); | ||
116 | |||
117 | ReleaseStr(pwzRollbackActionData); | ||
118 | ReleaseStr(pwzExecuteActionData); | ||
119 | |||
120 | // uninitialize | ||
121 | MqiUninitialize(); | ||
122 | |||
123 | er = SUCCEEDED(hr) ? ERROR_SUCCESS : ERROR_INSTALL_FAILURE; | ||
124 | return WcaFinalize(er); | ||
125 | } | ||
126 | |||
127 | |||
128 | /******************************************************************** | ||
129 | MessageQueuingUninstall - CUSTOM ACTION ENTRY POINT for uninstalling MSMQ message queues | ||
130 | |||
131 | ********************************************************************/ | ||
132 | extern "C" UINT __stdcall MessageQueuingUninstall(MSIHANDLE hInstall) | ||
133 | { | ||
134 | HRESULT hr = S_OK; | ||
135 | UINT er = ERROR_SUCCESS; | ||
136 | |||
137 | MQI_MESSAGE_QUEUE_LIST lstMessageQueues; | ||
138 | MQI_MESSAGE_QUEUE_PERMISSION_LIST lstMessageQueuePermissions; | ||
139 | |||
140 | int iCost = 0; | ||
141 | LPWSTR pwzRollbackActionData = NULL; | ||
142 | LPWSTR pwzExecuteActionData = NULL; | ||
143 | |||
144 | ::ZeroMemory(&lstMessageQueues, sizeof(lstMessageQueues)); | ||
145 | ::ZeroMemory(&lstMessageQueuePermissions, sizeof(lstMessageQueuePermissions)); | ||
146 | |||
147 | // initialize | ||
148 | hr = WcaInitialize(hInstall, "MessageQueuingUninstall"); | ||
149 | ExitOnFailure(hr, "Failed to initialize"); | ||
150 | |||
151 | do | ||
152 | { | ||
153 | hr = MqiInitialize(); | ||
154 | if (S_FALSE == hr) | ||
155 | { | ||
156 | WcaLog(LOGMSG_STANDARD, "Failed to load mqrt.dll."); | ||
157 | er = WcaErrorMessage(msierrMsmqCannotConnect, hr, INSTALLMESSAGE_ERROR | MB_ABORTRETRYIGNORE, 0); | ||
158 | switch (er) | ||
159 | { | ||
160 | case IDABORT: | ||
161 | ExitFunction1(hr = E_FAIL); // bail with error | ||
162 | case IDRETRY: | ||
163 | break; // retry | ||
164 | case IDIGNORE: __fallthrough; | ||
165 | default: | ||
166 | ExitFunction1(hr = S_OK); // pretend everything is okay and bail | ||
167 | } | ||
168 | } | ||
169 | ExitOnFailure(hr, "Failed to initialize MSMQ."); | ||
170 | } while (S_FALSE == hr); | ||
171 | |||
172 | // read message queues | ||
173 | hr = MqiMessageQueueRead(&lstMessageQueues); | ||
174 | ExitOnFailure(hr, "Failed to read MessageQueue table"); | ||
175 | |||
176 | // read message queue permissions | ||
177 | hr = MqiMessageQueuePermissionRead(&lstMessageQueues, &lstMessageQueuePermissions); | ||
178 | ExitOnFailure(hr, "Failed to read message queue permissions"); | ||
179 | |||
180 | if (lstMessageQueues.iUninstallCount || lstMessageQueuePermissions.iUninstallCount) | ||
181 | { | ||
182 | // schedule rollback action | ||
183 | hr = MqiMessageQueueUninstall(&lstMessageQueues, TRUE, &pwzRollbackActionData); | ||
184 | ExitOnFailure(hr, "Failed to add message queues to rollback action data"); | ||
185 | |||
186 | hr = MqiMessageQueuePermissionUninstall(&lstMessageQueuePermissions, &pwzRollbackActionData); | ||
187 | ExitOnFailure(hr, "Failed to add message queue permissions to rollback action data"); | ||
188 | |||
189 | hr = WcaDoDeferredAction(L"MessageQueuingRollbackUninstall", pwzRollbackActionData, 0); | ||
190 | ExitOnFailure(hr, "Failed to schedule MessageQueuingRollbackUninstall"); | ||
191 | |||
192 | // schedule execute action | ||
193 | hr = MqiMessageQueuePermissionUninstall(&lstMessageQueuePermissions, &pwzExecuteActionData); | ||
194 | ExitOnFailure(hr, "Failed to add message queue permissions to execute action data"); | ||
195 | |||
196 | hr = MqiMessageQueueUninstall(&lstMessageQueues, FALSE, &pwzExecuteActionData); | ||
197 | ExitOnFailure(hr, "Failed to add message queues to execute action data"); | ||
198 | iCost += lstMessageQueues.iUninstallCount * COST_MESSAGE_QUEUE_DELETE; | ||
199 | |||
200 | hr = WcaDoDeferredAction(L"MessageQueuingExecuteUninstall", pwzExecuteActionData, iCost); | ||
201 | ExitOnFailure(hr, "Failed to schedule MessageQueuingExecuteUninstall"); | ||
202 | } | ||
203 | |||
204 | hr = S_OK; | ||
205 | |||
206 | LExit: | ||
207 | // clean up | ||
208 | MqiMessageQueueFreeList(&lstMessageQueues); | ||
209 | MqiMessageQueuePermissionFreeList(&lstMessageQueuePermissions); | ||
210 | |||
211 | ReleaseStr(pwzRollbackActionData); | ||
212 | ReleaseStr(pwzExecuteActionData); | ||
213 | |||
214 | // uninitialize | ||
215 | MqiUninitialize(); | ||
216 | |||
217 | er = SUCCEEDED(hr) ? ERROR_SUCCESS : ERROR_INSTALL_FAILURE; | ||
218 | return WcaFinalize(er); | ||
219 | } | ||