diff options
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 | } | ||