aboutsummaryrefslogtreecommitdiff
path: root/src/burn/engine/apply.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/burn/engine/apply.cpp')
-rw-r--r--src/burn/engine/apply.cpp43
1 files changed, 31 insertions, 12 deletions
diff --git a/src/burn/engine/apply.cpp b/src/burn/engine/apply.cpp
index 9ee7b58c..69106f65 100644
--- a/src/burn/engine/apply.cpp
+++ b/src/burn/engine/apply.cpp
@@ -79,7 +79,8 @@ static HRESULT WINAPI AuthenticationRequired(
79static void CalculateKeepRegistration( 79static void CalculateKeepRegistration(
80 __in BURN_ENGINE_STATE* pEngineState, 80 __in BURN_ENGINE_STATE* pEngineState,
81 __in BOOL fLog, 81 __in BOOL fLog,
82 __inout BOOTSTRAPPER_REGISTRATION_TYPE* pRegistrationType 82 __inout BOOTSTRAPPER_REGISTRATION_TYPE* pRegistrationType,
83 __inout DWORD64* pqwEstimatedSize
83 ); 84 );
84static HRESULT ExecuteDependentRegistrationActions( 85static HRESULT ExecuteDependentRegistrationActions(
85 __in HANDLE hPipe, 86 __in HANDLE hPipe,
@@ -422,8 +423,9 @@ extern "C" HRESULT ApplyRegister(
422 HRESULT hr = S_OK; 423 HRESULT hr = S_OK;
423 LPWSTR sczEngineWorkingPath = NULL; 424 LPWSTR sczEngineWorkingPath = NULL;
424 BOOTSTRAPPER_REGISTRATION_TYPE registrationType = BOOTSTRAPPER_REGISTRATION_TYPE_INPROGRESS; 425 BOOTSTRAPPER_REGISTRATION_TYPE registrationType = BOOTSTRAPPER_REGISTRATION_TYPE_INPROGRESS;
426 DWORD64 qwEstimatedSize = 0;
425 427
426 CalculateKeepRegistration(pEngineState, FALSE, &registrationType); 428 CalculateKeepRegistration(pEngineState, FALSE, &registrationType, &qwEstimatedSize);
427 429
428 hr = UserExperienceOnRegisterBegin(&pEngineState->userExperience, &registrationType); 430 hr = UserExperienceOnRegisterBegin(&pEngineState->userExperience, &registrationType);
429 ExitOnRootFailure(hr, "BA aborted register begin."); 431 ExitOnRootFailure(hr, "BA aborted register begin.");
@@ -451,12 +453,12 @@ extern "C" HRESULT ApplyRegister(
451 // begin new session 453 // begin new session
452 if (pEngineState->registration.fPerMachine) 454 if (pEngineState->registration.fPerMachine)
453 { 455 {
454 hr = ElevationSessionBegin(pEngineState->companionConnection.hPipe, sczEngineWorkingPath, pEngineState->registration.sczResumeCommandLine, pEngineState->registration.fDisableResume, &pEngineState->variables, pEngineState->plan.dwRegistrationOperations, pEngineState->registration.fDetectedForeignProviderKeyBundleId, pEngineState->plan.qwEstimatedSize, registrationType); 456 hr = ElevationSessionBegin(pEngineState->companionConnection.hPipe, sczEngineWorkingPath, pEngineState->registration.sczResumeCommandLine, pEngineState->registration.fDisableResume, &pEngineState->variables, pEngineState->plan.dwRegistrationOperations, pEngineState->registration.fDetectedForeignProviderKeyBundleId, qwEstimatedSize, registrationType);
455 ExitOnFailure(hr, "Failed to begin registration session in per-machine process."); 457 ExitOnFailure(hr, "Failed to begin registration session in per-machine process.");
456 } 458 }
457 else 459 else
458 { 460 {
459 hr = RegistrationSessionBegin(sczEngineWorkingPath, &pEngineState->registration, &pEngineState->cache, &pEngineState->variables, pEngineState->plan.dwRegistrationOperations, pEngineState->plan.qwEstimatedSize, registrationType); 461 hr = RegistrationSessionBegin(sczEngineWorkingPath, &pEngineState->registration, &pEngineState->cache, &pEngineState->variables, pEngineState->plan.dwRegistrationOperations, qwEstimatedSize, registrationType);
460 ExitOnFailure(hr, "Failed to begin registration session."); 462 ExitOnFailure(hr, "Failed to begin registration session.");
461 } 463 }
462 } 464 }
@@ -491,6 +493,7 @@ extern "C" HRESULT ApplyUnregister(
491 BURN_RESUME_MODE resumeMode = BURN_RESUME_MODE_NONE; 493 BURN_RESUME_MODE resumeMode = BURN_RESUME_MODE_NONE;
492 BOOTSTRAPPER_REGISTRATION_TYPE defaultRegistrationType = BOOTSTRAPPER_REGISTRATION_TYPE_NONE; 494 BOOTSTRAPPER_REGISTRATION_TYPE defaultRegistrationType = BOOTSTRAPPER_REGISTRATION_TYPE_NONE;
493 BOOTSTRAPPER_REGISTRATION_TYPE registrationType = BOOTSTRAPPER_REGISTRATION_TYPE_NONE; 495 BOOTSTRAPPER_REGISTRATION_TYPE registrationType = BOOTSTRAPPER_REGISTRATION_TYPE_NONE;
496 DWORD64 qwEstimatedSize = 0;
494 497
495 // Calculate special cases for the resume mode. If a restart has been initiated, that trumps all other 498 // Calculate special cases for the resume mode. If a restart has been initiated, that trumps all other
496 // modes. If the user chose to suspend the install then we'll use that as the resume mode. 499 // modes. If the user chose to suspend the install then we'll use that as the resume mode.
@@ -513,7 +516,7 @@ extern "C" HRESULT ApplyUnregister(
513 defaultRegistrationType = BOOTSTRAPPER_REGISTRATION_TYPE_INPROGRESS; 516 defaultRegistrationType = BOOTSTRAPPER_REGISTRATION_TYPE_INPROGRESS;
514 } 517 }
515 518
516 CalculateKeepRegistration(pEngineState, TRUE, &defaultRegistrationType); 519 CalculateKeepRegistration(pEngineState, TRUE, &defaultRegistrationType, &qwEstimatedSize);
517 520
518 registrationType = defaultRegistrationType; 521 registrationType = defaultRegistrationType;
519 522
@@ -547,12 +550,12 @@ extern "C" HRESULT ApplyUnregister(
547 550
548 if (pEngineState->registration.fPerMachine) 551 if (pEngineState->registration.fPerMachine)
549 { 552 {
550 hr = ElevationSessionEnd(pEngineState->companionConnection.hPipe, resumeMode, restart, pEngineState->registration.fDetectedForeignProviderKeyBundleId, registrationType); 553 hr = ElevationSessionEnd(pEngineState->companionConnection.hPipe, resumeMode, restart, pEngineState->registration.fDetectedForeignProviderKeyBundleId, qwEstimatedSize, registrationType);
551 ExitOnFailure(hr, "Failed to end session in per-machine process."); 554 ExitOnFailure(hr, "Failed to end session in per-machine process.");
552 } 555 }
553 else 556 else
554 { 557 {
555 hr = RegistrationSessionEnd(&pEngineState->registration, &pEngineState->cache, &pEngineState->variables, &pEngineState->packages, resumeMode, restart, registrationType); 558 hr = RegistrationSessionEnd(&pEngineState->registration, &pEngineState->cache, &pEngineState->variables, &pEngineState->packages, resumeMode, restart, qwEstimatedSize, registrationType);
556 ExitOnFailure(hr, "Failed to end session in per-user process."); 559 ExitOnFailure(hr, "Failed to end session in per-user process.");
557 } 560 }
558 561
@@ -880,9 +883,12 @@ extern "C" void ApplyClean(
880static void CalculateKeepRegistration( 883static void CalculateKeepRegistration(
881 __in BURN_ENGINE_STATE* pEngineState, 884 __in BURN_ENGINE_STATE* pEngineState,
882 __in BOOL fLog, 885 __in BOOL fLog,
883 __inout BOOTSTRAPPER_REGISTRATION_TYPE* pRegistrationType 886 __inout BOOTSTRAPPER_REGISTRATION_TYPE* pRegistrationType,
887 __inout DWORD64* pqwEstimatedSize
884 ) 888 )
885{ 889{
890 DWORD64 qwEstimatedSize = pEngineState->section.qwBundleSize;
891
886 if (fLog) 892 if (fLog)
887 { 893 {
888 LogId(REPORT_STANDARD, MSG_POST_APPLY_CALCULATE_REGISTRATION); 894 LogId(REPORT_STANDARD, MSG_POST_APPLY_CALCULATE_REGISTRATION);
@@ -911,16 +917,29 @@ static void CalculateKeepRegistration(
911 { 917 {
912 *pRegistrationType = BOOTSTRAPPER_REGISTRATION_TYPE_FULL; 918 *pRegistrationType = BOOTSTRAPPER_REGISTRATION_TYPE_FULL;
913 919
914 if (!fLog) 920 if (BURN_PACKAGE_TYPE_MSP == pPackage->type)
915 { 921 {
916 break; 922 qwEstimatedSize += pPackage->qwSize;
917 } 923 }
924
925 qwEstimatedSize += pPackage->qwInstallSize;
918 } 926 }
919 else if (BURN_PACKAGE_REGISTRATION_STATE_PRESENT == pPackage->cacheRegistrationState && BOOTSTRAPPER_REGISTRATION_TYPE_NONE == *pRegistrationType) 927
928 if (BURN_PACKAGE_REGISTRATION_STATE_PRESENT == pPackage->cacheRegistrationState)
920 { 929 {
921 *pRegistrationType = BOOTSTRAPPER_REGISTRATION_TYPE_INPROGRESS; 930 if (BOOTSTRAPPER_REGISTRATION_TYPE_NONE == *pRegistrationType)
931 {
932 *pRegistrationType = BOOTSTRAPPER_REGISTRATION_TYPE_INPROGRESS;
933 }
934
935 qwEstimatedSize += pPackage->qwSize;
922 } 936 }
923 } 937 }
938
939 if (pqwEstimatedSize)
940 {
941 *pqwEstimatedSize = qwEstimatedSize;
942 }
924} 943}
925 944
926static HRESULT ExecuteDependentRegistrationActions( 945static HRESULT ExecuteDependentRegistrationActions(