summaryrefslogtreecommitdiff
path: root/src/burn/engine/exeengine.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/burn/engine/exeengine.cpp')
-rw-r--r--src/burn/engine/exeengine.cpp66
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 );
10static 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
1101static 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
1124LExit:
1125 if (argv)
1126 {
1127 AppFreeCommandLineArgs(argv);
1128 }
1129
1130 return hr;
1131}