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