diff options
Diffstat (limited to 'src/burn/engine/exeengine.cpp')
| -rw-r--r-- | src/burn/engine/exeengine.cpp | 26 |
1 files changed, 23 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: |
