diff options
author | Nir Bar <nir.bar@panel-sw.co.il> | 2023-11-20 18:00:03 +0200 |
---|---|---|
committer | Bob Arnson <github@bobs.org> | 2023-12-24 17:30:44 -0500 |
commit | 6f4fda58d9303c889024e20ee39b1374ed0f02e1 (patch) | |
tree | b940085ebd2bc0dd97bbebe6eb77bce3b5a73f90 /src/burn | |
parent | f02ef4acf9649badaa3ab78d2499ca5014fa2234 (diff) | |
download | wix-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.cpp | 26 | ||||
-rw-r--r-- | src/burn/engine/package.h | 1 |
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 | ||
1129 | LExit: | 1149 | LExit: |
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 | ||