aboutsummaryrefslogtreecommitdiff
path: root/src/burn/engine
diff options
context:
space:
mode:
Diffstat (limited to 'src/burn/engine')
-rw-r--r--src/burn/engine/msuengine.cpp97
-rw-r--r--src/burn/engine/package.cpp2
-rw-r--r--src/burn/engine/package.h2
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
53LExit: 41LExit:
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;