diff options
Diffstat (limited to 'src/burn/engine')
-rw-r--r-- | src/burn/engine/msuengine.cpp | 97 | ||||
-rw-r--r-- | src/burn/engine/package.cpp | 2 | ||||
-rw-r--r-- | src/burn/engine/package.h | 2 |
3 files changed, 7 insertions, 94 deletions
diff --git a/src/burn/engine/msuengine.cpp b/src/burn/engine/msuengine.cpp index 400fdc92..43f5f76c 100644 --- a/src/burn/engine/msuengine.cpp +++ b/src/burn/engine/msuengine.cpp | |||
@@ -31,24 +31,12 @@ extern "C" HRESULT MsuEngineParsePackageFromXml( | |||
31 | { | 31 | { |
32 | HRESULT hr = S_OK; | 32 | HRESULT hr = S_OK; |
33 | 33 | ||
34 | // @KB | ||
35 | hr = XmlGetAttributeEx(pixnMsuPackage, L"KB", &pPackage->Msu.sczKB); | ||
36 | ExitOnFailure(hr, "Failed to get @KB."); | ||
37 | |||
38 | // @DetectCondition | 34 | // @DetectCondition |
39 | hr = XmlGetAttributeEx(pixnMsuPackage, L"DetectCondition", &pPackage->Msu.sczDetectCondition); | 35 | hr = XmlGetAttributeEx(pixnMsuPackage, L"DetectCondition", &pPackage->Msu.sczDetectCondition); |
40 | ExitOnFailure(hr, "Failed to get @DetectCondition."); | 36 | ExitOnRequiredXmlQueryFailure(hr, "Failed to get @DetectCondition."); |
41 | 37 | ||
42 | // We can only uninstall MSU packages if they have a KB and we are on Win7 or newer. | 38 | // Uninstalling MSU packages isn't supported because newer OS's don't allow silent uninstallation. |
43 | if (pPackage->Msu.sczKB && *pPackage->Msu.sczKB && ::IsWindows7OrGreater()) | 39 | pPackage->fPermanent = TRUE; |
44 | { | ||
45 | pPackage->Msu.fUninstallable = TRUE; | ||
46 | } | ||
47 | else | ||
48 | { | ||
49 | pPackage->fPermanent = TRUE; | ||
50 | pPackage->Msu.fUninstallable = FALSE; | ||
51 | } | ||
52 | 40 | ||
53 | LExit: | 41 | LExit: |
54 | return hr; | 42 | return hr; |
@@ -58,7 +46,6 @@ extern "C" void MsuEnginePackageUninitialize( | |||
58 | __in BURN_PACKAGE* pPackage | 46 | __in BURN_PACKAGE* pPackage |
59 | ) | 47 | ) |
60 | { | 48 | { |
61 | ReleaseNullStr(pPackage->Msu.sczKB); | ||
62 | ReleaseNullStr(pPackage->Msu.sczDetectCondition); | 49 | ReleaseNullStr(pPackage->Msu.sczDetectCondition); |
63 | } | 50 | } |
64 | 51 | ||
@@ -108,30 +95,7 @@ extern "C" HRESULT MsuEnginePlanCalculatePackage( | |||
108 | switch (pPackage->currentState) | 95 | switch (pPackage->currentState) |
109 | { | 96 | { |
110 | case BOOTSTRAPPER_PACKAGE_STATE_PRESENT: | 97 | case BOOTSTRAPPER_PACKAGE_STATE_PRESENT: |
111 | switch (pPackage->requested) | 98 | execute = BOOTSTRAPPER_ACTION_STATE_NONE; |
112 | { | ||
113 | case BOOTSTRAPPER_REQUEST_STATE_PRESENT: __fallthrough; | ||
114 | case BOOTSTRAPPER_REQUEST_STATE_REPAIR: | ||
115 | execute = BOOTSTRAPPER_ACTION_STATE_NONE; | ||
116 | break; | ||
117 | |||
118 | case BOOTSTRAPPER_REQUEST_STATE_ABSENT: __fallthrough; | ||
119 | case BOOTSTRAPPER_REQUEST_STATE_CACHE: | ||
120 | execute = !pPackage->fPermanent ? BOOTSTRAPPER_ACTION_STATE_UNINSTALL : BOOTSTRAPPER_ACTION_STATE_NONE; | ||
121 | break; | ||
122 | |||
123 | case BOOTSTRAPPER_REQUEST_STATE_FORCE_ABSENT: | ||
124 | execute = pPackage->Msu.fUninstallable ? BOOTSTRAPPER_ACTION_STATE_UNINSTALL : BOOTSTRAPPER_ACTION_STATE_NONE; | ||
125 | break; | ||
126 | |||
127 | case BOOTSTRAPPER_REQUEST_STATE_FORCE_PRESENT: | ||
128 | execute = BOOTSTRAPPER_ACTION_STATE_INSTALL; | ||
129 | break; | ||
130 | |||
131 | default: | ||
132 | execute = BOOTSTRAPPER_ACTION_STATE_NONE; | ||
133 | break; | ||
134 | } | ||
135 | break; | 99 | break; |
136 | 100 | ||
137 | case BOOTSTRAPPER_PACKAGE_STATE_ABSENT: | 101 | case BOOTSTRAPPER_PACKAGE_STATE_ABSENT: |
@@ -143,10 +107,6 @@ extern "C" HRESULT MsuEnginePlanCalculatePackage( | |||
143 | execute = BOOTSTRAPPER_ACTION_STATE_INSTALL; | 107 | execute = BOOTSTRAPPER_ACTION_STATE_INSTALL; |
144 | break; | 108 | break; |
145 | 109 | ||
146 | case BOOTSTRAPPER_REQUEST_STATE_FORCE_ABSENT: | ||
147 | execute = pPackage->Msu.fUninstallable ? BOOTSTRAPPER_ACTION_STATE_UNINSTALL : BOOTSTRAPPER_ACTION_STATE_NONE; | ||
148 | break; | ||
149 | |||
150 | default: | 110 | default: |
151 | execute = BOOTSTRAPPER_ACTION_STATE_NONE; | 111 | execute = BOOTSTRAPPER_ACTION_STATE_NONE; |
152 | break; | 112 | break; |
@@ -161,41 +121,7 @@ extern "C" HRESULT MsuEnginePlanCalculatePackage( | |||
161 | // Calculate the rollback action if there is an execute action. | 121 | // Calculate the rollback action if there is an execute action. |
162 | if (BOOTSTRAPPER_ACTION_STATE_NONE != execute) | 122 | if (BOOTSTRAPPER_ACTION_STATE_NONE != execute) |
163 | { | 123 | { |
164 | switch (pPackage->currentState) | 124 | rollback = BOOTSTRAPPER_ACTION_STATE_NONE; |
165 | { | ||
166 | case BOOTSTRAPPER_PACKAGE_STATE_PRESENT: | ||
167 | switch (pPackage->requested) | ||
168 | { | ||
169 | case BOOTSTRAPPER_REQUEST_STATE_FORCE_ABSENT: __fallthrough; | ||
170 | case BOOTSTRAPPER_REQUEST_STATE_ABSENT: | ||
171 | rollback = BOOTSTRAPPER_ACTION_STATE_INSTALL; | ||
172 | break; | ||
173 | |||
174 | default: | ||
175 | rollback = BOOTSTRAPPER_ACTION_STATE_NONE; | ||
176 | break; | ||
177 | } | ||
178 | break; | ||
179 | |||
180 | case BOOTSTRAPPER_PACKAGE_STATE_ABSENT: | ||
181 | switch (pPackage->requested) | ||
182 | { | ||
183 | case BOOTSTRAPPER_REQUEST_STATE_PRESENT: __fallthrough; | ||
184 | case BOOTSTRAPPER_REQUEST_STATE_FORCE_PRESENT: __fallthrough; | ||
185 | case BOOTSTRAPPER_REQUEST_STATE_REPAIR: | ||
186 | rollback = !pPackage->fPermanent ? BOOTSTRAPPER_ACTION_STATE_UNINSTALL : BOOTSTRAPPER_ACTION_STATE_NONE; | ||
187 | break; | ||
188 | |||
189 | default: | ||
190 | rollback = BOOTSTRAPPER_ACTION_STATE_NONE; | ||
191 | break; | ||
192 | } | ||
193 | break; | ||
194 | |||
195 | default: | ||
196 | hr = E_INVALIDARG; | ||
197 | ExitOnRootFailure(hr, "Invalid package expected state."); | ||
198 | } | ||
199 | } | 125 | } |
200 | 126 | ||
201 | // return values | 127 | // return values |
@@ -272,7 +198,6 @@ extern "C" HRESULT MsuEngineExecutePackage( | |||
272 | LPWSTR sczSystemPath = NULL; | 198 | LPWSTR sczSystemPath = NULL; |
273 | LPWSTR sczWusaPath = NULL; | 199 | LPWSTR sczWusaPath = NULL; |
274 | LPWSTR sczCommand = NULL; | 200 | LPWSTR sczCommand = NULL; |
275 | LPWSTR sczEscapedKB = NULL; | ||
276 | SC_HANDLE schWu = NULL; | 201 | SC_HANDLE schWu = NULL; |
277 | BOOL fWuWasDisabled = FALSE; | 202 | BOOL fWuWasDisabled = FALSE; |
278 | STARTUPINFOW si = { }; | 203 | STARTUPINFOW si = { }; |
@@ -324,15 +249,6 @@ extern "C" HRESULT MsuEngineExecutePackage( | |||
324 | ExitOnFailure(hr, "Failed to format MSU install command."); | 249 | ExitOnFailure(hr, "Failed to format MSU install command."); |
325 | break; | 250 | break; |
326 | 251 | ||
327 | case BOOTSTRAPPER_ACTION_STATE_UNINSTALL: | ||
328 | hr = AppEscapeCommandLineArgumentFormatted(&sczEscapedKB, L"%ls", pPackage->Msu.sczKB); | ||
329 | ExitOnFailure(hr, "Failed to escape MSU KB."); | ||
330 | |||
331 | // format command | ||
332 | hr = StrAllocFormatted(&sczCommand, L"\"%ls\" /uninstall /kb:%ls /quiet /norestart", sczWusaPath, sczEscapedKB); | ||
333 | ExitOnFailure(hr, "Failed to format MSU uninstall command."); | ||
334 | break; | ||
335 | |||
336 | default: | 252 | default: |
337 | hr = E_UNEXPECTED; | 253 | hr = E_UNEXPECTED; |
338 | ExitOnFailure(hr, "Failed to get action arguments for MSU package."); | 254 | ExitOnFailure(hr, "Failed to get action arguments for MSU package."); |
@@ -347,7 +263,7 @@ extern "C" HRESULT MsuEngineExecutePackage( | |||
347 | ExitOnFailure(hr, "Failed to append log path to MSU command-line."); | 263 | ExitOnFailure(hr, "Failed to append log path to MSU command-line."); |
348 | } | 264 | } |
349 | 265 | ||
350 | LogId(REPORT_STANDARD, MSG_APPLYING_PACKAGE, LoggingRollbackOrExecute(fRollback), pPackage->sczId, LoggingActionStateToString(pExecuteAction->msuPackage.action), sczMsuPath ? sczMsuPath : pPackage->Msu.sczKB, sczCommand); | 266 | LogId(REPORT_STANDARD, MSG_APPLYING_PACKAGE, LoggingRollbackOrExecute(fRollback), pPackage->sczId, LoggingActionStateToString(pExecuteAction->msuPackage.action), sczMsuPath, sczCommand); |
351 | 267 | ||
352 | hr = EnsureWUServiceEnabled(fStopWusaService, &schWu, &fWuWasDisabled); | 268 | hr = EnsureWUServiceEnabled(fStopWusaService, &schWu, &fWuWasDisabled); |
353 | ExitOnFailure(hr, "Failed to ensure WU service was enabled to install MSU package."); | 269 | ExitOnFailure(hr, "Failed to ensure WU service was enabled to install MSU package."); |
@@ -388,7 +304,6 @@ LExit: | |||
388 | ReleaseStr(sczSystemPath); | 304 | ReleaseStr(sczSystemPath); |
389 | ReleaseStr(sczWusaPath); | 305 | ReleaseStr(sczWusaPath); |
390 | ReleaseStr(sczCommand); | 306 | ReleaseStr(sczCommand); |
391 | ReleaseStr(sczEscapedKB); | ||
392 | 307 | ||
393 | ReleaseHandle(pi.hProcess); | 308 | ReleaseHandle(pi.hProcess); |
394 | ReleaseHandle(pi.hThread); | 309 | ReleaseHandle(pi.hThread); |
diff --git a/src/burn/engine/package.cpp b/src/burn/engine/package.cpp index 88e7cb9d..c56f74c8 100644 --- a/src/burn/engine/package.cpp +++ b/src/burn/engine/package.cpp | |||
@@ -255,7 +255,7 @@ extern "C" HRESULT PackagesParseFromXml( | |||
255 | fUninstallable = pPackage->Exe.fUninstallable; | 255 | fUninstallable = pPackage->Exe.fUninstallable; |
256 | break; | 256 | break; |
257 | case BURN_PACKAGE_TYPE_MSU: | 257 | case BURN_PACKAGE_TYPE_MSU: |
258 | fUninstallable = pPackage->Msu.fUninstallable; | 258 | fUninstallable = FALSE; |
259 | break; | 259 | break; |
260 | } | 260 | } |
261 | 261 | ||
diff --git a/src/burn/engine/package.h b/src/burn/engine/package.h index 449c4e08..e8d49e53 100644 --- a/src/burn/engine/package.h +++ b/src/burn/engine/package.h | |||
@@ -421,8 +421,6 @@ typedef struct _BURN_PACKAGE | |||
421 | struct | 421 | struct |
422 | { | 422 | { |
423 | LPWSTR sczDetectCondition; | 423 | LPWSTR sczDetectCondition; |
424 | LPWSTR sczKB; | ||
425 | BOOL fUninstallable; | ||
426 | } Msu; | 424 | } Msu; |
427 | }; | 425 | }; |
428 | } BURN_PACKAGE; | 426 | } BURN_PACKAGE; |