diff options
Diffstat (limited to 'src/burn/engine/exeengine.cpp')
-rw-r--r-- | src/burn/engine/exeengine.cpp | 29 |
1 files changed, 16 insertions, 13 deletions
diff --git a/src/burn/engine/exeengine.cpp b/src/burn/engine/exeengine.cpp index 85168943..3a2816dd 100644 --- a/src/burn/engine/exeengine.cpp +++ b/src/burn/engine/exeengine.cpp | |||
@@ -489,29 +489,30 @@ extern "C" HRESULT ExeEngineExecutePackage( | |||
489 | } | 489 | } |
490 | 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) |
491 | { | 491 | { |
492 | ExitOnNull(sczArpUninstallString, hr, E_INVALIDARG, "%hs is null.", pPackage->Exe.fArpUseUninstallString ? "UninstallString" : "QuietUninstallString"); | 492 | LPCWSTR szRegName = pPackage->Exe.fArpUseUninstallString ? L"UninstallString" : L"QuietUninstallString"; |
493 | ExitOnNull(sczArpUninstallString, hr, E_INVALIDARG, "%ls is null.", szRegName); | ||
493 | 494 | ||
494 | hr = AppParseCommandLine(sczArpUninstallString, &argcArp, &argvArp); | 495 | hr = AppParseCommandLine(sczArpUninstallString, &argcArp, &argvArp); |
495 | ExitOnFailure(hr, "Failed to parse QuietUninstallString: %ls.", sczArpUninstallString); | 496 | ExitOnFailure(hr, "Failed to parse %ls: %ls.", szRegName, sczArpUninstallString); |
496 | 497 | ||
497 | ExitOnNull(argcArp, hr, E_INVALIDARG, "QuietUninstallString must contain an executable path."); | 498 | ExitOnNull(argcArp, hr, E_INVALIDARG, "%ls must contain an executable path.", szRegName); |
498 | 499 | ||
499 | hr = StrAllocString(&sczExecutablePath, argvArp[0], 0); | 500 | hr = StrAllocString(&sczExecutablePath, argvArp[0], 0); |
500 | ExitOnFailure(hr, "Failed to copy executable path."); | 501 | ExitOnFailure(hr, "Failed to copy executable path."); |
501 | 502 | ||
502 | if (pPackage->fPerMachine) | 503 | if (pPackage->fPerMachine) |
503 | { | 504 | { |
504 | hr = ApprovedExesVerifySecureLocation(pCache, pVariables, sczExecutablePath); | 505 | hr = ApprovedExesVerifySecureLocation(pCache, pVariables, sczExecutablePath, argcArp - 1, (argcArp > 1) ? const_cast<LPCWSTR*>(argvArp + 1) : NULL); |
505 | ExitOnFailure(hr, "Failed to verify the QuietUninstallString executable path is in a secure location: %ls", sczExecutablePath); | 506 | ExitOnFailure(hr, "Failed to verify the %ls executable path is in a secure location: %ls", szRegName, sczExecutablePath); |
506 | if (S_FALSE == hr) | 507 | if (S_FALSE == hr) |
507 | { | 508 | { |
508 | LogStringLine(REPORT_STANDARD, "The QuietUninstallString executable path is not in a secure location: %ls", sczExecutablePath); | 509 | LogStringLine(REPORT_STANDARD, "The %ls executable path is not in a secure location: %ls", szRegName, sczExecutablePath); |
509 | ExitFunction1(hr = HRESULT_FROM_WIN32(ERROR_ACCESS_DENIED)); | 510 | ExitFunction1(hr = HRESULT_FROM_WIN32(ERROR_ACCESS_DENIED)); |
510 | } | 511 | } |
511 | } | 512 | } |
512 | 513 | ||
513 | hr = PathGetDirectory(sczExecutablePath, &sczCachedDirectory); | 514 | hr = PathGetDirectory(sczExecutablePath, &sczCachedDirectory); |
514 | ExitOnFailure(hr, "Failed to get parent directory for QuietUninstallString executable path: %ls", sczExecutablePath); | 515 | ExitOnFailure(hr, "Failed to get parent directory for %ls executable path: %ls", szRegName, sczExecutablePath); |
515 | } | 516 | } |
516 | else | 517 | else |
517 | { | 518 | { |
@@ -587,13 +588,15 @@ extern "C" HRESULT ExeEngineExecutePackage( | |||
587 | } | 588 | } |
588 | 589 | ||
589 | // build base command | 590 | // build base command |
590 | hr = StrAllocFormatted(&sczBaseCommand, L"\"%ls\"", sczExecutablePath); | 591 | if (sczArpUninstallString && *sczArpUninstallString) |
591 | ExitOnFailure(hr, "Failed to allocate base command."); | 592 | { |
592 | 593 | hr = StrAllocString(&sczBaseCommand, sczArpUninstallString, 0); | |
593 | for (int i = 1; i < argcArp; ++i) | 594 | ExitOnFailure(hr, "Failed to allocate base command."); |
595 | } | ||
596 | else | ||
594 | { | 597 | { |
595 | hr = AppAppendCommandLineArgument(&sczBaseCommand, argvArp[i]); | 598 | hr = StrAllocFormatted(&sczBaseCommand, L"\"%ls\"", sczExecutablePath); |
596 | ExitOnFailure(hr, "Failed to append argument from ARP."); | 599 | ExitOnFailure(hr, "Failed to allocate base command."); |
597 | } | 600 | } |
598 | 601 | ||
599 | if (pPackage->Exe.fBundle) | 602 | if (pPackage->Exe.fBundle) |