diff options
| author | Sean Hall <r.sean.hall@gmail.com> | 2022-06-14 15:10:07 -0500 |
|---|---|---|
| committer | Sean Hall <r.sean.hall@gmail.com> | 2022-06-14 21:51:14 -0500 |
| commit | 98c369a92891244bde76448ae4a2b623b3ab394c (patch) | |
| tree | 398105d02a888ba41b426e84965375e491d79bb7 /src/burn/engine/exeengine.cpp | |
| parent | dea657295df261bb0e3e4d620eeae321531e3a11 (diff) | |
| download | wix-98c369a92891244bde76448ae4a2b623b3ab394c.tar.gz wix-98c369a92891244bde76448ae4a2b623b3ab394c.tar.bz2 wix-98c369a92891244bde76448ae4a2b623b3ab394c.zip | |
Allow BundlePackage to fallback to QuietUninstallString to uninstall.
Partial implementation of 6756
Diffstat (limited to 'src/burn/engine/exeengine.cpp')
| -rw-r--r-- | src/burn/engine/exeengine.cpp | 66 |
1 files changed, 21 insertions, 45 deletions
diff --git a/src/burn/engine/exeengine.cpp b/src/burn/engine/exeengine.cpp index 3a64ecd8..f7be082d 100644 --- a/src/burn/engine/exeengine.cpp +++ b/src/burn/engine/exeengine.cpp | |||
| @@ -7,11 +7,6 @@ static HRESULT DetectArpEntry( | |||
| 7 | __out BOOTSTRAPPER_PACKAGE_STATE* pPackageState, | 7 | __out BOOTSTRAPPER_PACKAGE_STATE* pPackageState, |
| 8 | __out_opt LPWSTR* psczQuietUninstallString | 8 | __out_opt LPWSTR* psczQuietUninstallString |
| 9 | ); | 9 | ); |
| 10 | static HRESULT ParseArpUninstallString( | ||
| 11 | __in_z LPCWSTR wzArpUninstallString, | ||
| 12 | __inout LPWSTR* psczExecutablePath, | ||
| 13 | __inout LPWSTR* psczArguments | ||
| 14 | ); | ||
| 15 | 10 | ||
| 16 | // function definitions | 11 | // function definitions |
| 17 | 12 | ||
| @@ -435,20 +430,20 @@ extern "C" HRESULT ExeEngineExecutePackage( | |||
| 435 | LPWSTR sczUserArgsObfuscated = NULL; | 430 | LPWSTR sczUserArgsObfuscated = NULL; |
| 436 | LPWSTR sczCommandObfuscated = NULL; | 431 | LPWSTR sczCommandObfuscated = NULL; |
| 437 | LPWSTR sczArpUninstallString = NULL; | 432 | LPWSTR sczArpUninstallString = NULL; |
| 438 | LPWSTR sczArpArguments = NULL; | 433 | int argcArp = 0; |
| 434 | LPWSTR* argvArp = NULL; | ||
| 439 | BOOTSTRAPPER_PACKAGE_STATE applyState = BOOTSTRAPPER_PACKAGE_STATE_UNKNOWN; | 435 | BOOTSTRAPPER_PACKAGE_STATE applyState = BOOTSTRAPPER_PACKAGE_STATE_UNKNOWN; |
| 440 | HANDLE hExecutableFile = INVALID_HANDLE_VALUE; | 436 | HANDLE hExecutableFile = INVALID_HANDLE_VALUE; |
| 441 | DWORD dwExitCode = 0; | 437 | DWORD dwExitCode = 0; |
| 442 | BURN_PACKAGE* pPackage = pExecuteAction->exePackage.pPackage; | 438 | BURN_PACKAGE* pPackage = pExecuteAction->exePackage.pPackage; |
| 443 | BURN_PAYLOAD* pPackagePayload = pPackage->payloads.rgItems[0].pPayload; | 439 | BURN_PAYLOAD* pPackagePayload = pPackage->payloads.rgItems[0].pPayload; |
| 444 | LPCWSTR wzUninstallArguments = pPackage->Exe.sczUninstallArguments; | ||
| 445 | 440 | ||
| 446 | if (BURN_EXE_DETECTION_TYPE_ARP == pPackage->Exe.detectionType && | 441 | if (BURN_EXE_DETECTION_TYPE_ARP == pPackage->Exe.detectionType && |
| 447 | (BOOTSTRAPPER_ACTION_STATE_UNINSTALL == pExecuteAction->exePackage.action || | 442 | (BOOTSTRAPPER_ACTION_STATE_UNINSTALL == pExecuteAction->exePackage.action || |
| 448 | BOOTSTRAPPER_ACTION_STATE_INSTALL == pExecuteAction->exePackage.action && fRollback)) | 443 | BOOTSTRAPPER_ACTION_STATE_INSTALL == pExecuteAction->exePackage.action && fRollback)) |
| 449 | { | 444 | { |
| 450 | hr = DetectArpEntry(pPackage, &applyState, &sczArpUninstallString); | 445 | hr = DetectArpEntry(pPackage, &applyState, &sczArpUninstallString); |
| 451 | ExitOnFailure(hr, "Failed to query ArpEntry for uninstall."); | 446 | ExitOnFailure(hr, "Failed to query ArpEntry for %hs.", BOOTSTRAPPER_ACTION_STATE_UNINSTALL == pExecuteAction->exePackage.action ? "uninstall" : "install"); |
| 452 | 447 | ||
| 453 | if (BOOTSTRAPPER_PACKAGE_STATE_ABSENT == applyState && BOOTSTRAPPER_ACTION_STATE_UNINSTALL == pExecuteAction->exePackage.action) | 448 | if (BOOTSTRAPPER_PACKAGE_STATE_ABSENT == applyState && BOOTSTRAPPER_ACTION_STATE_UNINSTALL == pExecuteAction->exePackage.action) |
| 454 | { | 449 | { |
| @@ -487,9 +482,14 @@ extern "C" HRESULT ExeEngineExecutePackage( | |||
| 487 | { | 482 | { |
| 488 | ExitOnNull(sczArpUninstallString, hr, E_INVALIDARG, "QuietUninstallString is null."); | 483 | ExitOnNull(sczArpUninstallString, hr, E_INVALIDARG, "QuietUninstallString is null."); |
| 489 | 484 | ||
| 490 | hr = ParseArpUninstallString(sczArpUninstallString, &sczExecutablePath, &sczArpArguments); | 485 | hr = AppParseCommandLine(sczArpUninstallString, &argcArp, &argvArp); |
| 491 | ExitOnFailure(hr, "Failed to parse QuietUninstallString: %ls.", sczArpUninstallString); | 486 | ExitOnFailure(hr, "Failed to parse QuietUninstallString: %ls.", sczArpUninstallString); |
| 492 | 487 | ||
| 488 | ExitOnNull(argcArp, hr, E_INVALIDARG, "QuietUninstallString must contain an executable path."); | ||
| 489 | |||
| 490 | hr = StrAllocString(&sczExecutablePath, argvArp[0], 0); | ||
| 491 | ExitOnFailure(hr, "Failed to copy executable path."); | ||
| 492 | |||
| 493 | if (pPackage->fPerMachine) | 493 | if (pPackage->fPerMachine) |
| 494 | { | 494 | { |
| 495 | hr = ApprovedExesVerifySecureLocation(pCache, pVariables, sczExecutablePath); | 495 | hr = ApprovedExesVerifySecureLocation(pCache, pVariables, sczExecutablePath); |
| @@ -503,8 +503,6 @@ extern "C" HRESULT ExeEngineExecutePackage( | |||
| 503 | 503 | ||
| 504 | hr = PathGetDirectory(sczExecutablePath, &sczCachedDirectory); | 504 | hr = PathGetDirectory(sczExecutablePath, &sczCachedDirectory); |
| 505 | ExitOnFailure(hr, "Failed to get parent directory for QuietUninstallString executable path: %ls", sczExecutablePath); | 505 | ExitOnFailure(hr, "Failed to get parent directory for QuietUninstallString executable path: %ls", sczExecutablePath); |
| 506 | |||
| 507 | wzUninstallArguments = sczArpArguments; | ||
| 508 | } | 506 | } |
| 509 | else | 507 | else |
| 510 | { | 508 | { |
| @@ -528,7 +526,7 @@ extern "C" HRESULT ExeEngineExecutePackage( | |||
| 528 | break; | 526 | break; |
| 529 | 527 | ||
| 530 | case BOOTSTRAPPER_ACTION_STATE_UNINSTALL: | 528 | case BOOTSTRAPPER_ACTION_STATE_UNINSTALL: |
| 531 | wzArguments = wzUninstallArguments; | 529 | wzArguments = pPackage->Exe.sczUninstallArguments; |
| 532 | break; | 530 | break; |
| 533 | 531 | ||
| 534 | case BOOTSTRAPPER_ACTION_STATE_REPAIR: | 532 | case BOOTSTRAPPER_ACTION_STATE_REPAIR: |
| @@ -583,6 +581,12 @@ extern "C" HRESULT ExeEngineExecutePackage( | |||
| 583 | hr = StrAllocFormatted(&sczBaseCommand, L"\"%ls\"", sczExecutablePath); | 581 | hr = StrAllocFormatted(&sczBaseCommand, L"\"%ls\"", sczExecutablePath); |
| 584 | ExitOnFailure(hr, "Failed to allocate base command."); | 582 | ExitOnFailure(hr, "Failed to allocate base command."); |
| 585 | 583 | ||
| 584 | for (int i = 1; i < argcArp; ++i) | ||
| 585 | { | ||
| 586 | hr = AppAppendCommandLineArgument(&sczBaseCommand, argvArp[i]); | ||
| 587 | ExitOnFailure(hr, "Failed to append argument from ARP."); | ||
| 588 | } | ||
| 589 | |||
| 586 | if (pPackage->Exe.fBundle) | 590 | if (pPackage->Exe.fBundle) |
| 587 | { | 591 | { |
| 588 | hr = StrAllocConcat(&sczBaseCommand, L" -norestart", 0); | 592 | hr = StrAllocConcat(&sczBaseCommand, L" -norestart", 0); |
| @@ -655,7 +659,11 @@ LExit: | |||
| 655 | ReleaseStr(sczUserArgsObfuscated); | 659 | ReleaseStr(sczUserArgsObfuscated); |
| 656 | ReleaseStr(sczCommandObfuscated); | 660 | ReleaseStr(sczCommandObfuscated); |
| 657 | ReleaseStr(sczArpUninstallString); | 661 | ReleaseStr(sczArpUninstallString); |
| 658 | ReleaseStr(sczArpArguments); | 662 | |
| 663 | if (argvArp) | ||
| 664 | { | ||
| 665 | AppFreeCommandLineArgs(argvArp); | ||
| 666 | } | ||
| 659 | 667 | ||
| 660 | ReleaseFileHandle(hExecutableFile); | 668 | ReleaseFileHandle(hExecutableFile); |
| 661 | 669 | ||
| @@ -1097,35 +1105,3 @@ LExit: | |||
| 1097 | 1105 | ||
| 1098 | return hr; | 1106 | return hr; |
| 1099 | } | 1107 | } |
| 1100 | |||
| 1101 | static HRESULT ParseArpUninstallString( | ||
| 1102 | __in_z LPCWSTR wzArpUninstallString, | ||
| 1103 | __inout LPWSTR* psczExecutablePath, | ||
| 1104 | __inout LPWSTR* psczArguments | ||
| 1105 | ) | ||
| 1106 | { | ||
| 1107 | HRESULT hr = S_OK; | ||
| 1108 | int argc = 0; | ||
| 1109 | LPWSTR* argv = NULL; | ||
| 1110 | |||
| 1111 | hr = AppParseCommandLine(wzArpUninstallString, &argc, &argv); | ||
| 1112 | ExitOnFailure(hr, "Failed to parse uninstall string as command line: %ls.", wzArpUninstallString); | ||
| 1113 | ExitOnNull(argc, hr, E_INVALIDARG, "Uninstall string must contain an executable path."); | ||
| 1114 | |||
| 1115 | hr = StrAllocString(psczExecutablePath, argv[0], 0); | ||
| 1116 | ExitOnFailure(hr, "Failed to copy executable path for ArpCommand."); | ||
| 1117 | |||
| 1118 | for (int i = 1; i < argc; ++i) | ||
| 1119 | { | ||
| 1120 | hr = AppAppendCommandLineArgument(psczArguments, argv[i]); | ||
| 1121 | ExitOnFailure(hr, "Failed to append argument for ArpCommand."); | ||
| 1122 | } | ||
| 1123 | |||
| 1124 | LExit: | ||
| 1125 | if (argv) | ||
| 1126 | { | ||
| 1127 | AppFreeCommandLineArgs(argv); | ||
| 1128 | } | ||
| 1129 | |||
| 1130 | return hr; | ||
| 1131 | } | ||
