aboutsummaryrefslogtreecommitdiff
path: root/src/burn
diff options
context:
space:
mode:
authorNir Bar <nir.bar@panel-sw.co.il>2023-11-20 18:00:03 +0200
committerBob Arnson <github@bobs.org>2023-12-24 17:30:44 -0500
commit6f4fda58d9303c889024e20ee39b1374ed0f02e1 (patch)
treeb940085ebd2bc0dd97bbebe6eb77bce3b5a73f90 /src/burn
parentf02ef4acf9649badaa3ab78d2499ca5014fa2234 (diff)
downloadwix-6f4fda58d9303c889024e20ee39b1374ed0f02e1.tar.gz
wix-6f4fda58d9303c889024e20ee39b1374ed0f02e1.tar.bz2
wix-6f4fda58d9303c889024e20ee39b1374ed0f02e1.zip
ArpEntry reads QuietUninstallString or UninstallString, and uses UninstallArguments for the uninstall command line
Diffstat (limited to 'src/burn')
-rw-r--r--src/burn/engine/exeengine.cpp26
-rw-r--r--src/burn/engine/package.h1
2 files changed, 24 insertions, 3 deletions
diff --git a/src/burn/engine/exeengine.cpp b/src/burn/engine/exeengine.cpp
index 6d326a5a..c0bab254 100644
--- a/src/burn/engine/exeengine.cpp
+++ b/src/burn/engine/exeengine.cpp
@@ -81,6 +81,14 @@ extern "C" HRESULT ExeEngineParsePackageFromXml(
81 hr = XmlGetYesNoAttribute(pixnExePackage, L"ArpWin64", &pPackage->Exe.fArpWin64); 81 hr = XmlGetYesNoAttribute(pixnExePackage, L"ArpWin64", &pPackage->Exe.fArpWin64);
82 ExitOnOptionalXmlQueryFailure(hr, fFoundXml, "Failed to get @ArpWin64."); 82 ExitOnOptionalXmlQueryFailure(hr, fFoundXml, "Failed to get @ArpWin64.");
83 83
84 // @ArpUseUninstallString
85 hr = XmlGetYesNoAttribute(pixnExePackage, L"ArpUseUninstallString", &pPackage->Exe.fArpUseUninstallString);
86 ExitOnOptionalXmlQueryFailure(hr, fFoundXml, "Failed to get @ArpWin64.");
87
88 // @UninstallArguments
89 hr = XmlGetAttributeEx(pixnExePackage, L"UninstallArguments", &pPackage->Exe.sczUninstallArguments);
90 ExitOnOptionalXmlQueryFailure(hr, fFoundXml, "Failed to get @UninstallArguments.");
91
84 pPackage->Exe.fUninstallable = TRUE; 92 pPackage->Exe.fUninstallable = TRUE;
85 } 93 }
86 94
@@ -481,7 +489,7 @@ extern "C" HRESULT ExeEngineExecutePackage(
481 } 489 }
482 else if (BURN_EXE_DETECTION_TYPE_ARP == pPackage->Exe.detectionType && BOOTSTRAPPER_ACTION_STATE_UNINSTALL == pExecuteAction->exePackage.action) 490 else if (BURN_EXE_DETECTION_TYPE_ARP == pPackage->Exe.detectionType && BOOTSTRAPPER_ACTION_STATE_UNINSTALL == pExecuteAction->exePackage.action)
483 { 491 {
484 ExitOnNull(sczArpUninstallString, hr, E_INVALIDARG, "QuietUninstallString is null."); 492 ExitOnNull(sczArpUninstallString, hr, E_INVALIDARG, "%hs is null.", pPackage->Exe.fArpUseUninstallString ? "UninstallString" : "QuietUninstallString");
485 493
486 hr = AppParseCommandLine(sczArpUninstallString, &argcArp, &argvArp); 494 hr = AppParseCommandLine(sczArpUninstallString, &argcArp, &argvArp);
487 ExitOnFailure(hr, "Failed to parse QuietUninstallString: %ls.", sczArpUninstallString); 495 ExitOnFailure(hr, "Failed to parse QuietUninstallString: %ls.", sczArpUninstallString);
@@ -1122,8 +1130,20 @@ static HRESULT DetectArpEntry(
1122 1130
1123 if (psczQuietUninstallString) 1131 if (psczQuietUninstallString)
1124 { 1132 {
1125 hr = RegReadString(hKey, L"QuietUninstallString", psczQuietUninstallString); 1133 LPCWSTR sczUninstallStringName = pPackage->Exe.fArpUseUninstallString ? L"UninstallString" : L"QuietUninstallString";
1126 ExitOnPathFailure(hr, fExists, "Failed to read QuietUninstallString."); 1134
1135 hr = RegReadString(hKey, sczUninstallStringName, psczQuietUninstallString);
1136 ExitOnPathFailure(hr, fExists, "Failed to read %ls.", sczUninstallStringName);
1137
1138 // If the uninstall string is an executable path then ensure it is enclosed in quotes
1139 if (fExists && *psczQuietUninstallString && (L'\"' != **psczQuietUninstallString) && FileExistsEx(*psczQuietUninstallString, nullptr))
1140 {
1141 hr = StrAllocPrefix(psczQuietUninstallString, L"\"", 0);
1142 ExitOnFailure(hr, "Failed to prepend UninstallString with quote.");
1143
1144 hr = StrAllocConcat(psczQuietUninstallString, L"\"", 0);
1145 ExitOnFailure(hr, "Failed to append quote to UninstallString.");
1146 }
1127 } 1147 }
1128 1148
1129LExit: 1149LExit:
diff --git a/src/burn/engine/package.h b/src/burn/engine/package.h
index bdebd5b6..1ea169e6 100644
--- a/src/burn/engine/package.h
+++ b/src/burn/engine/package.h
@@ -362,6 +362,7 @@ typedef struct _BURN_PACKAGE
362 BURN_EXE_DETECTION_TYPE detectionType; 362 BURN_EXE_DETECTION_TYPE detectionType;
363 363
364 BOOL fArpWin64; 364 BOOL fArpWin64;
365 BOOL fArpUseUninstallString;
365 LPWSTR sczArpKeyPath; 366 LPWSTR sczArpKeyPath;
366 VERUTIL_VERSION* pArpDisplayVersion; 367 VERUTIL_VERSION* pArpDisplayVersion;
367 368