diff options
| author | Sean Hall <r.sean.hall@gmail.com> | 2022-01-31 16:19:32 -0600 |
|---|---|---|
| committer | Sean Hall <r.sean.hall@gmail.com> | 2022-02-01 23:36:23 -0600 |
| commit | eae94502fe8e7ca601161360a7d31e93edc88763 (patch) | |
| tree | 51fc862014a74c6fb2f303f90b4ca5999f3647d0 /src/burn/engine | |
| parent | b152761dfddc0a131dcd13f70ae0e9b9e41b37fe (diff) | |
| download | wix-eae94502fe8e7ca601161360a7d31e93edc88763.tar.gz wix-eae94502fe8e7ca601161360a7d31e93edc88763.tar.bz2 wix-eae94502fe8e7ca601161360a7d31e93edc88763.zip | |
Plan each dependency provider individually.
Refactoring for #6510
Diffstat (limited to 'src/burn/engine')
| -rw-r--r-- | src/burn/engine/apply.cpp | 17 | ||||
| -rw-r--r-- | src/burn/engine/dependency.cpp | 132 | ||||
| -rw-r--r-- | src/burn/engine/dependency.h | 3 | ||||
| -rw-r--r-- | src/burn/engine/elevation.cpp | 45 | ||||
| -rw-r--r-- | src/burn/engine/elevation.h | 3 | ||||
| -rw-r--r-- | src/burn/engine/package.h | 7 | ||||
| -rw-r--r-- | src/burn/engine/plan.cpp | 19 | ||||
| -rw-r--r-- | src/burn/engine/plan.h | 1 |
8 files changed, 146 insertions, 81 deletions
diff --git a/src/burn/engine/apply.cpp b/src/burn/engine/apply.cpp index 9185e33a..2168cba6 100644 --- a/src/burn/engine/apply.cpp +++ b/src/burn/engine/apply.cpp | |||
| @@ -252,7 +252,8 @@ static HRESULT ExecuteMsuPackage( | |||
| 252 | static HRESULT ExecutePackageProviderAction( | 252 | static HRESULT ExecutePackageProviderAction( |
| 253 | __in BURN_ENGINE_STATE* pEngineState, | 253 | __in BURN_ENGINE_STATE* pEngineState, |
| 254 | __in BURN_EXECUTE_ACTION* pAction, | 254 | __in BURN_EXECUTE_ACTION* pAction, |
| 255 | __in BURN_EXECUTE_CONTEXT* pContext | 255 | __in BURN_EXECUTE_CONTEXT* pContext, |
| 256 | __in BOOL fRollback | ||
| 256 | ); | 257 | ); |
| 257 | static HRESULT ExecuteDependencyAction( | 258 | static HRESULT ExecuteDependencyAction( |
| 258 | __in BURN_ENGINE_STATE* pEngineState, | 259 | __in BURN_ENGINE_STATE* pEngineState, |
| @@ -2351,7 +2352,7 @@ static HRESULT DoExecuteAction( | |||
| 2351 | break; | 2352 | break; |
| 2352 | 2353 | ||
| 2353 | case BURN_EXECUTE_ACTION_TYPE_PACKAGE_PROVIDER: | 2354 | case BURN_EXECUTE_ACTION_TYPE_PACKAGE_PROVIDER: |
| 2354 | hr = ExecutePackageProviderAction(pEngineState, pExecuteAction, pContext); | 2355 | hr = ExecutePackageProviderAction(pEngineState, pExecuteAction, pContext, FALSE); |
| 2355 | ExitOnFailure(hr, "Failed to execute package provider registration action."); | 2356 | ExitOnFailure(hr, "Failed to execute package provider registration action."); |
| 2356 | break; | 2357 | break; |
| 2357 | 2358 | ||
| @@ -2474,7 +2475,7 @@ static HRESULT DoRollbackActions( | |||
| 2474 | break; | 2475 | break; |
| 2475 | 2476 | ||
| 2476 | case BURN_EXECUTE_ACTION_TYPE_PACKAGE_PROVIDER: | 2477 | case BURN_EXECUTE_ACTION_TYPE_PACKAGE_PROVIDER: |
| 2477 | hr = ExecutePackageProviderAction(pEngineState, pRollbackAction, pContext); | 2478 | hr = ExecutePackageProviderAction(pEngineState, pRollbackAction, pContext, TRUE); |
| 2478 | IgnoreRollbackError(hr, "Failed to rollback package provider action."); | 2479 | IgnoreRollbackError(hr, "Failed to rollback package provider action."); |
| 2479 | break; | 2480 | break; |
| 2480 | 2481 | ||
| @@ -2887,19 +2888,23 @@ LExit: | |||
| 2887 | static HRESULT ExecutePackageProviderAction( | 2888 | static HRESULT ExecutePackageProviderAction( |
| 2888 | __in BURN_ENGINE_STATE* pEngineState, | 2889 | __in BURN_ENGINE_STATE* pEngineState, |
| 2889 | __in BURN_EXECUTE_ACTION* pAction, | 2890 | __in BURN_EXECUTE_ACTION* pAction, |
| 2890 | __in BURN_EXECUTE_CONTEXT* /*pContext*/ | 2891 | __in BURN_EXECUTE_CONTEXT* pContext, |
| 2892 | __in BOOL fRollback | ||
| 2891 | ) | 2893 | ) |
| 2892 | { | 2894 | { |
| 2893 | HRESULT hr = S_OK; | 2895 | HRESULT hr = S_OK; |
| 2894 | 2896 | ||
| 2897 | Assert(pContext->fRollback == fRollback); | ||
| 2898 | UNREFERENCED_PARAMETER(pContext); | ||
| 2899 | |||
| 2895 | if (pAction->packageProvider.pPackage->fPerMachine) | 2900 | if (pAction->packageProvider.pPackage->fPerMachine) |
| 2896 | { | 2901 | { |
| 2897 | hr = ElevationExecutePackageProviderAction(pEngineState->companionConnection.hPipe, pAction); | 2902 | hr = ElevationExecutePackageProviderAction(pEngineState->companionConnection.hPipe, pAction, fRollback); |
| 2898 | ExitOnFailure(hr, "Failed to register the package provider on per-machine package."); | 2903 | ExitOnFailure(hr, "Failed to register the package provider on per-machine package."); |
| 2899 | } | 2904 | } |
| 2900 | else | 2905 | else |
| 2901 | { | 2906 | { |
| 2902 | hr = DependencyExecutePackageProviderAction(pAction); | 2907 | hr = DependencyExecutePackageProviderAction(pAction, fRollback); |
| 2903 | ExitOnFailure(hr, "Failed to register the package provider on per-user package."); | 2908 | ExitOnFailure(hr, "Failed to register the package provider on per-user package."); |
| 2904 | } | 2909 | } |
| 2905 | 2910 | ||
diff --git a/src/burn/engine/dependency.cpp b/src/burn/engine/dependency.cpp index e94b0e93..8f568f28 100644 --- a/src/burn/engine/dependency.cpp +++ b/src/burn/engine/dependency.cpp | |||
| @@ -59,11 +59,17 @@ static LPCWSTR GetPackageProviderId( | |||
| 59 | ); | 59 | ); |
| 60 | 60 | ||
| 61 | static HRESULT RegisterPackageProvider( | 61 | static HRESULT RegisterPackageProvider( |
| 62 | __in const BURN_PACKAGE* pPackage | 62 | __in const BURN_DEPENDENCY_PROVIDER* pProvider, |
| 63 | __in LPCWSTR wzPackageId, | ||
| 64 | __in LPCWSTR wzPackageProviderId, | ||
| 65 | __in HKEY hkRoot, | ||
| 66 | __in BOOL fVital | ||
| 63 | ); | 67 | ); |
| 64 | 68 | ||
| 65 | static void UnregisterPackageProvider( | 69 | static void UnregisterPackageProvider( |
| 66 | __in const BURN_PACKAGE* pPackage | 70 | __in const BURN_DEPENDENCY_PROVIDER* pProvider, |
| 71 | __in LPCWSTR wzPackageId, | ||
| 72 | __in HKEY hkRoot | ||
| 67 | ); | 73 | ); |
| 68 | 74 | ||
| 69 | static HRESULT RegisterPackageDependency( | 75 | static HRESULT RegisterPackageDependency( |
| @@ -489,6 +495,8 @@ extern "C" HRESULT DependencyPlanPackageBegin( | |||
| 489 | { | 495 | { |
| 490 | pPackage->execute = BOOTSTRAPPER_ACTION_STATE_NONE; | 496 | pPackage->execute = BOOTSTRAPPER_ACTION_STATE_NONE; |
| 491 | pPackage->rollback = BOOTSTRAPPER_ACTION_STATE_NONE; | 497 | pPackage->rollback = BOOTSTRAPPER_ACTION_STATE_NONE; |
| 498 | |||
| 499 | // Assume the compatible package has the same exact providers. | ||
| 492 | pPackage->compatiblePackage.fRemove = FALSE; | 500 | pPackage->compatiblePackage.fRemove = FALSE; |
| 493 | } | 501 | } |
| 494 | else | 502 | else |
| @@ -511,8 +519,22 @@ extern "C" HRESULT DependencyPlanPackageBegin( | |||
| 511 | 519 | ||
| 512 | if (!fAllImportedProviders) | 520 | if (!fAllImportedProviders) |
| 513 | { | 521 | { |
| 514 | pPackage->providerExecute = dependencyExecuteAction; | 522 | for (DWORD i = 0; i < pPackage->cDependencyProviders; ++i) |
| 515 | pPackage->providerRollback = dependencyRollbackAction; | 523 | { |
| 524 | BURN_DEPENDENCY_PROVIDER* pProvider = &pPackage->rgDependencyProviders[i]; | ||
| 525 | pProvider->providerExecute = dependencyExecuteAction; | ||
| 526 | pProvider->providerRollback = dependencyRollbackAction; | ||
| 527 | } | ||
| 528 | |||
| 529 | if (BURN_DEPENDENCY_ACTION_NONE != dependencyExecuteAction) | ||
| 530 | { | ||
| 531 | pPackage->fProviderExecute = TRUE; | ||
| 532 | } | ||
| 533 | |||
| 534 | if (BURN_DEPENDENCY_ACTION_NONE != dependencyRollbackAction) | ||
| 535 | { | ||
| 536 | pPackage->fProviderRollback = TRUE; | ||
| 537 | } | ||
| 516 | } | 538 | } |
| 517 | } | 539 | } |
| 518 | 540 | ||
| @@ -556,14 +578,13 @@ extern "C" HRESULT DependencyPlanPackage( | |||
| 556 | } | 578 | } |
| 557 | 579 | ||
| 558 | // Add the provider rollback plan. | 580 | // Add the provider rollback plan. |
| 559 | if (BURN_DEPENDENCY_ACTION_NONE != pPackage->providerRollback) | 581 | if (pPackage->fProviderRollback) |
| 560 | { | 582 | { |
| 561 | hr = PlanAppendRollbackAction(pPlan, &pAction); | 583 | hr = PlanAppendRollbackAction(pPlan, &pAction); |
| 562 | ExitOnFailure(hr, "Failed to append provider rollback action."); | 584 | ExitOnFailure(hr, "Failed to append provider rollback action."); |
| 563 | 585 | ||
| 564 | pAction->type = BURN_EXECUTE_ACTION_TYPE_PACKAGE_PROVIDER; | 586 | pAction->type = BURN_EXECUTE_ACTION_TYPE_PACKAGE_PROVIDER; |
| 565 | pAction->packageProvider.pPackage = const_cast<BURN_PACKAGE*>(pPackage); | 587 | pAction->packageProvider.pPackage = const_cast<BURN_PACKAGE*>(pPackage); |
| 566 | pAction->packageProvider.action = pPackage->providerRollback; | ||
| 567 | 588 | ||
| 568 | // Put a checkpoint before the execute action so that rollback happens | 589 | // Put a checkpoint before the execute action so that rollback happens |
| 569 | // if execute fails. | 590 | // if execute fails. |
| @@ -573,7 +594,7 @@ extern "C" HRESULT DependencyPlanPackage( | |||
| 573 | 594 | ||
| 574 | // Add the provider execute plan. This comes after rollback so if something goes wrong | 595 | // Add the provider execute plan. This comes after rollback so if something goes wrong |
| 575 | // rollback will try to clean up after us. | 596 | // rollback will try to clean up after us. |
| 576 | if (BURN_DEPENDENCY_ACTION_NONE != pPackage->providerExecute) | 597 | if (pPackage->fProviderExecute) |
| 577 | { | 598 | { |
| 578 | if (NULL != pdwInsertSequence) | 599 | if (NULL != pdwInsertSequence) |
| 579 | { | 600 | { |
| @@ -592,7 +613,6 @@ extern "C" HRESULT DependencyPlanPackage( | |||
| 592 | 613 | ||
| 593 | pAction->type = BURN_EXECUTE_ACTION_TYPE_PACKAGE_PROVIDER; | 614 | pAction->type = BURN_EXECUTE_ACTION_TYPE_PACKAGE_PROVIDER; |
| 594 | pAction->packageProvider.pPackage = const_cast<BURN_PACKAGE*>(pPackage); | 615 | pAction->packageProvider.pPackage = const_cast<BURN_PACKAGE*>(pPackage); |
| 595 | pAction->packageProvider.action = pPackage->providerExecute; | ||
| 596 | } | 616 | } |
| 597 | 617 | ||
| 598 | LExit: | 618 | LExit: |
| @@ -627,26 +647,39 @@ LExit: | |||
| 627 | } | 647 | } |
| 628 | 648 | ||
| 629 | extern "C" HRESULT DependencyExecutePackageProviderAction( | 649 | extern "C" HRESULT DependencyExecutePackageProviderAction( |
| 630 | __in const BURN_EXECUTE_ACTION* pAction | 650 | __in const BURN_EXECUTE_ACTION* pAction, |
| 651 | __in BOOL fRollback | ||
| 631 | ) | 652 | ) |
| 632 | { | 653 | { |
| 633 | AssertSz(BURN_EXECUTE_ACTION_TYPE_PACKAGE_PROVIDER == pAction->type, "Execute action type not supported by this function."); | 654 | AssertSz(BURN_EXECUTE_ACTION_TYPE_PACKAGE_PROVIDER == pAction->type, "Execute action type not supported by this function."); |
| 634 | 655 | ||
| 635 | HRESULT hr = S_OK; | 656 | HRESULT hr = S_OK; |
| 636 | const BURN_PACKAGE* pPackage = pAction->packageProvider.pPackage; | 657 | const BURN_PACKAGE* pPackage = pAction->packageProvider.pPackage; |
| 658 | HKEY hkRoot = pPackage->fPerMachine ? HKEY_LOCAL_MACHINE : HKEY_CURRENT_USER; | ||
| 659 | LPCWSTR wzId = GetPackageProviderId(pPackage); | ||
| 637 | 660 | ||
| 638 | // Register or unregister the package provider(s). | 661 | for (DWORD i = 0; i < pPackage->cDependencyProviders; ++i) |
| 639 | if (BURN_DEPENDENCY_ACTION_REGISTER == pAction->packageProvider.action) | ||
| 640 | { | ||
| 641 | hr = RegisterPackageProvider(pPackage); | ||
| 642 | ExitOnFailure(hr, "Failed to register the package providers."); | ||
| 643 | } | ||
| 644 | else if (BURN_DEPENDENCY_ACTION_UNREGISTER == pAction->packageProvider.action) | ||
| 645 | { | 662 | { |
| 646 | UnregisterPackageProvider(pPackage); | 663 | const BURN_DEPENDENCY_PROVIDER* pProvider = pPackage->rgDependencyProviders + i; |
| 664 | BURN_DEPENDENCY_ACTION action = fRollback ? pProvider->providerRollback : pProvider->providerExecute; | ||
| 665 | HRESULT hrProvider = S_OK; | ||
| 666 | |||
| 667 | // Register or unregister the package provider. | ||
| 668 | switch (action) | ||
| 669 | { | ||
| 670 | case BURN_DEPENDENCY_ACTION_REGISTER: | ||
| 671 | hrProvider = RegisterPackageProvider(pProvider, pPackage->sczId, wzId, hkRoot, pPackage->fVital); | ||
| 672 | if (SUCCEEDED(hr) && FAILED(hrProvider)) | ||
| 673 | { | ||
| 674 | hr = hrProvider; | ||
| 675 | } | ||
| 676 | break; | ||
| 677 | case BURN_DEPENDENCY_ACTION_UNREGISTER: | ||
| 678 | UnregisterPackageProvider(pProvider, pPackage->sczId, hkRoot); | ||
| 679 | break; | ||
| 680 | } | ||
| 647 | } | 681 | } |
| 648 | 682 | ||
| 649 | LExit: | ||
| 650 | if (!pPackage->fVital) | 683 | if (!pPackage->fVital) |
| 651 | { | 684 | { |
| 652 | hr = S_OK; | 685 | hr = S_OK; |
| @@ -1175,7 +1208,7 @@ static void CalculateDependencyActionStates( | |||
| 1175 | case BOOTSTRAPPER_ACTION_STATE_INSTALL: __fallthrough; | 1208 | case BOOTSTRAPPER_ACTION_STATE_INSTALL: __fallthrough; |
| 1176 | case BOOTSTRAPPER_ACTION_STATE_MODIFY: __fallthrough; | 1209 | case BOOTSTRAPPER_ACTION_STATE_MODIFY: __fallthrough; |
| 1177 | case BOOTSTRAPPER_ACTION_STATE_REPAIR: __fallthrough; | 1210 | case BOOTSTRAPPER_ACTION_STATE_REPAIR: __fallthrough; |
| 1178 | case BOOTSTRAPPER_ACTION_STATE_MINOR_UPGRADE: __fallthrough; | 1211 | case BOOTSTRAPPER_ACTION_STATE_MINOR_UPGRADE: |
| 1179 | *pDependencyExecuteAction = BURN_DEPENDENCY_ACTION_REGISTER; | 1212 | *pDependencyExecuteAction = BURN_DEPENDENCY_ACTION_REGISTER; |
| 1180 | break; | 1213 | break; |
| 1181 | } | 1214 | } |
| @@ -1188,7 +1221,7 @@ static void CalculateDependencyActionStates( | |||
| 1188 | switch (pPackage->currentState) | 1221 | switch (pPackage->currentState) |
| 1189 | { | 1222 | { |
| 1190 | case BOOTSTRAPPER_PACKAGE_STATE_OBSOLETE: __fallthrough; | 1223 | case BOOTSTRAPPER_PACKAGE_STATE_OBSOLETE: __fallthrough; |
| 1191 | case BOOTSTRAPPER_PACKAGE_STATE_ABSENT: __fallthrough; | 1224 | case BOOTSTRAPPER_PACKAGE_STATE_ABSENT: |
| 1192 | *pDependencyRollbackAction = BURN_DEPENDENCY_ACTION_UNREGISTER; | 1225 | *pDependencyRollbackAction = BURN_DEPENDENCY_ACTION_UNREGISTER; |
| 1193 | break; | 1226 | break; |
| 1194 | } | 1227 | } |
| @@ -1291,32 +1324,25 @@ static LPCWSTR GetPackageProviderId( | |||
| 1291 | } | 1324 | } |
| 1292 | 1325 | ||
| 1293 | static HRESULT RegisterPackageProvider( | 1326 | static HRESULT RegisterPackageProvider( |
| 1294 | __in const BURN_PACKAGE* pPackage | 1327 | __in const BURN_DEPENDENCY_PROVIDER* pProvider, |
| 1328 | __in LPCWSTR wzPackageId, | ||
| 1329 | __in LPCWSTR wzPackageProviderId, | ||
| 1330 | __in HKEY hkRoot, | ||
| 1331 | __in BOOL fVital | ||
| 1295 | ) | 1332 | ) |
| 1296 | { | 1333 | { |
| 1297 | HRESULT hr = S_OK; | 1334 | HRESULT hr = S_OK; |
| 1298 | 1335 | ||
| 1299 | if (pPackage->rgDependencyProviders) | 1336 | if (!pProvider->fImported) |
| 1300 | { | 1337 | { |
| 1301 | HKEY hkRoot = pPackage->fPerMachine ? HKEY_LOCAL_MACHINE : HKEY_CURRENT_USER; | 1338 | LogId(REPORT_VERBOSE, MSG_DEPENDENCY_PACKAGE_REGISTER, pProvider->sczKey, pProvider->sczVersion, wzPackageId); |
| 1302 | LPCWSTR wzId = GetPackageProviderId(pPackage); | ||
| 1303 | |||
| 1304 | for (DWORD i = 0; i < pPackage->cDependencyProviders; ++i) | ||
| 1305 | { | ||
| 1306 | const BURN_DEPENDENCY_PROVIDER* pProvider = &pPackage->rgDependencyProviders[i]; | ||
| 1307 | |||
| 1308 | if (!pProvider->fImported) | ||
| 1309 | { | ||
| 1310 | LogId(REPORT_VERBOSE, MSG_DEPENDENCY_PACKAGE_REGISTER, pProvider->sczKey, pProvider->sczVersion, pPackage->sczId); | ||
| 1311 | 1339 | ||
| 1312 | hr = DepRegisterDependency(hkRoot, pProvider->sczKey, pProvider->sczVersion, pProvider->sczDisplayName, wzId, 0); | 1340 | hr = DepRegisterDependency(hkRoot, pProvider->sczKey, pProvider->sczVersion, pProvider->sczDisplayName, wzPackageProviderId, 0); |
| 1313 | ExitOnFailure(hr, "Failed to register the package dependency provider: %ls", pProvider->sczKey); | 1341 | ExitOnFailure(hr, "Failed to register the package dependency provider: %ls", pProvider->sczKey); |
| 1314 | } | ||
| 1315 | } | ||
| 1316 | } | 1342 | } |
| 1317 | 1343 | ||
| 1318 | LExit: | 1344 | LExit: |
| 1319 | if (!pPackage->fVital) | 1345 | if (!fVital) |
| 1320 | { | 1346 | { |
| 1321 | hr = S_OK; | 1347 | hr = S_OK; |
| 1322 | } | 1348 | } |
| @@ -1325,36 +1351,28 @@ LExit: | |||
| 1325 | } | 1351 | } |
| 1326 | 1352 | ||
| 1327 | /******************************************************************** | 1353 | /******************************************************************** |
| 1328 | UnregisterPackageProvider - Removes each dependency provider | 1354 | UnregisterPackageProvider - Removes the dependency provider. |
| 1329 | for the package (if not imported from the package itself). | ||
| 1330 | 1355 | ||
| 1331 | Note: Does not check for existing dependents before removing the key. | 1356 | Note: Does not check for existing dependents before removing the key. |
| 1332 | *********************************************************************/ | 1357 | *********************************************************************/ |
| 1333 | static void UnregisterPackageProvider( | 1358 | static void UnregisterPackageProvider( |
| 1334 | __in const BURN_PACKAGE* pPackage | 1359 | __in const BURN_DEPENDENCY_PROVIDER* pProvider, |
| 1360 | __in LPCWSTR wzPackageId, | ||
| 1361 | __in HKEY hkRoot | ||
| 1335 | ) | 1362 | ) |
| 1336 | { | 1363 | { |
| 1337 | HRESULT hr = S_OK; | 1364 | HRESULT hr = S_OK; |
| 1338 | HKEY hkRoot = pPackage->fPerMachine ? HKEY_LOCAL_MACHINE : HKEY_CURRENT_USER; | ||
| 1339 | 1365 | ||
| 1340 | if (pPackage->rgDependencyProviders) | 1366 | if (!pProvider->fImported) |
| 1341 | { | 1367 | { |
| 1342 | for (DWORD i = 0; i < pPackage->cDependencyProviders; ++i) | 1368 | hr = DepUnregisterDependency(hkRoot, pProvider->sczKey); |
| 1369 | if (SUCCEEDED(hr)) | ||
| 1343 | { | 1370 | { |
| 1344 | const BURN_DEPENDENCY_PROVIDER* pProvider = &pPackage->rgDependencyProviders[i]; | 1371 | LogId(REPORT_VERBOSE, MSG_DEPENDENCY_PACKAGE_UNREGISTERED, pProvider->sczKey, wzPackageId); |
| 1345 | 1372 | } | |
| 1346 | if (!pProvider->fImported) | 1373 | else if (FAILED(hr) && E_FILENOTFOUND != hr) |
| 1347 | { | 1374 | { |
| 1348 | hr = DepUnregisterDependency(hkRoot, pProvider->sczKey); | 1375 | LogId(REPORT_VERBOSE, MSG_DEPENDENCY_PACKAGE_UNREGISTERED_FAILED, pProvider->sczKey, wzPackageId, hr); |
| 1349 | if (SUCCEEDED(hr)) | ||
| 1350 | { | ||
| 1351 | LogId(REPORT_VERBOSE, MSG_DEPENDENCY_PACKAGE_UNREGISTERED, pProvider->sczKey, pPackage->sczId); | ||
| 1352 | } | ||
| 1353 | else if (FAILED(hr) && E_FILENOTFOUND != hr) | ||
| 1354 | { | ||
| 1355 | LogId(REPORT_VERBOSE, MSG_DEPENDENCY_PACKAGE_UNREGISTERED_FAILED, pProvider->sczKey, pPackage->sczId, hr); | ||
| 1356 | } | ||
| 1357 | } | ||
| 1358 | } | 1376 | } |
| 1359 | } | 1377 | } |
| 1360 | } | 1378 | } |
diff --git a/src/burn/engine/dependency.h b/src/burn/engine/dependency.h index 41718066..0e558554 100644 --- a/src/burn/engine/dependency.h +++ b/src/burn/engine/dependency.h | |||
| @@ -150,7 +150,8 @@ HRESULT DependencyPlanPackageComplete( | |||
| 150 | 150 | ||
| 151 | *********************************************************************/ | 151 | *********************************************************************/ |
| 152 | HRESULT DependencyExecutePackageProviderAction( | 152 | HRESULT DependencyExecutePackageProviderAction( |
| 153 | __in const BURN_EXECUTE_ACTION* pAction | 153 | __in const BURN_EXECUTE_ACTION* pAction, |
| 154 | __in BOOL fRollback | ||
| 154 | ); | 155 | ); |
| 155 | 156 | ||
| 156 | /******************************************************************** | 157 | /******************************************************************** |
diff --git a/src/burn/engine/elevation.cpp b/src/burn/engine/elevation.cpp index eafc08ee..75679acd 100644 --- a/src/burn/engine/elevation.cpp +++ b/src/burn/engine/elevation.cpp | |||
| @@ -1305,7 +1305,8 @@ LExit: | |||
| 1305 | 1305 | ||
| 1306 | extern "C" HRESULT ElevationExecutePackageProviderAction( | 1306 | extern "C" HRESULT ElevationExecutePackageProviderAction( |
| 1307 | __in HANDLE hPipe, | 1307 | __in HANDLE hPipe, |
| 1308 | __in BURN_EXECUTE_ACTION* pExecuteAction | 1308 | __in BURN_EXECUTE_ACTION* pExecuteAction, |
| 1309 | __in BOOL fRollback | ||
| 1309 | ) | 1310 | ) |
| 1310 | { | 1311 | { |
| 1311 | HRESULT hr = S_OK; | 1312 | HRESULT hr = S_OK; |
| @@ -1318,8 +1319,17 @@ extern "C" HRESULT ElevationExecutePackageProviderAction( | |||
| 1318 | hr = BuffWriteString(&pbData, &cbData, pExecuteAction->packageProvider.pPackage->sczId); | 1319 | hr = BuffWriteString(&pbData, &cbData, pExecuteAction->packageProvider.pPackage->sczId); |
| 1319 | ExitOnFailure(hr, "Failed to write package id to message buffer."); | 1320 | ExitOnFailure(hr, "Failed to write package id to message buffer."); |
| 1320 | 1321 | ||
| 1321 | hr = BuffWriteNumber(&pbData, &cbData, pExecuteAction->packageProvider.action); | 1322 | hr = BuffWriteNumber(&pbData, &cbData, (DWORD)fRollback); |
| 1322 | ExitOnFailure(hr, "Failed to write action to message buffer."); | 1323 | ExitOnFailure(hr, "Failed to write rollback flag to message buffer."); |
| 1324 | |||
| 1325 | // Provider actions. | ||
| 1326 | for (DWORD i = 0; i < pExecuteAction->packageProvider.pPackage->cDependencyProviders; ++i) | ||
| 1327 | { | ||
| 1328 | BURN_DEPENDENCY_PROVIDER* pProvider = pExecuteAction->packageProvider.pPackage->rgDependencyProviders + i; | ||
| 1329 | BURN_DEPENDENCY_ACTION* pAction = fRollback ? &pProvider->providerRollback : &pProvider->providerExecute; | ||
| 1330 | hr = BuffWriteNumber(&pbData, &cbData, (DWORD)*pAction); | ||
| 1331 | ExitOnFailure(hr, "Failed to write provider action to message buffer."); | ||
| 1332 | } | ||
| 1323 | 1333 | ||
| 1324 | // Send the message. | 1334 | // Send the message. |
| 1325 | hr = PipeSendMessage(hPipe, BURN_ELEVATION_MESSAGE_TYPE_EXECUTE_PACKAGE_PROVIDER, pbData, cbData, NULL, NULL, &dwResult); | 1335 | hr = PipeSendMessage(hPipe, BURN_ELEVATION_MESSAGE_TYPE_EXECUTE_PACKAGE_PROVIDER, pbData, cbData, NULL, NULL, &dwResult); |
| @@ -2840,7 +2850,7 @@ static HRESULT OnExecuteMsiPackage( | |||
| 2840 | SIZE_T iData = 0; | 2850 | SIZE_T iData = 0; |
| 2841 | LPWSTR sczPackage = NULL; | 2851 | LPWSTR sczPackage = NULL; |
| 2842 | HWND hwndParent = NULL; | 2852 | HWND hwndParent = NULL; |
| 2843 | BOOL fRollback = 0; | 2853 | BOOL fRollback = FALSE; |
| 2844 | BURN_EXECUTE_ACTION executeAction = { }; | 2854 | BURN_EXECUTE_ACTION executeAction = { }; |
| 2845 | BOOTSTRAPPER_APPLY_RESTART msiRestart = BOOTSTRAPPER_APPLY_RESTART_NONE; | 2855 | BOOTSTRAPPER_APPLY_RESTART msiRestart = BOOTSTRAPPER_APPLY_RESTART_NONE; |
| 2846 | 2856 | ||
| @@ -2946,7 +2956,7 @@ static HRESULT OnExecuteMspPackage( | |||
| 2946 | SIZE_T iData = 0; | 2956 | SIZE_T iData = 0; |
| 2947 | LPWSTR sczPackage = NULL; | 2957 | LPWSTR sczPackage = NULL; |
| 2948 | HWND hwndParent = NULL; | 2958 | HWND hwndParent = NULL; |
| 2949 | BOOL fRollback = 0; | 2959 | BOOL fRollback = FALSE; |
| 2950 | BURN_EXECUTE_ACTION executeAction = { }; | 2960 | BURN_EXECUTE_ACTION executeAction = { }; |
| 2951 | BOOTSTRAPPER_APPLY_RESTART restart = BOOTSTRAPPER_APPLY_RESTART_NONE; | 2961 | BOOTSTRAPPER_APPLY_RESTART restart = BOOTSTRAPPER_APPLY_RESTART_NONE; |
| 2952 | 2962 | ||
| @@ -3117,7 +3127,7 @@ static HRESULT OnUninstallMsiCompatiblePackage( | |||
| 3117 | LPWSTR sczPackageId = NULL; | 3127 | LPWSTR sczPackageId = NULL; |
| 3118 | LPWSTR sczCompatiblePackageId = NULL; | 3128 | LPWSTR sczCompatiblePackageId = NULL; |
| 3119 | HWND hwndParent = NULL; | 3129 | HWND hwndParent = NULL; |
| 3120 | BOOL fRollback = 0; | 3130 | BOOL fRollback = FALSE; |
| 3121 | BURN_EXECUTE_ACTION executeAction = { }; | 3131 | BURN_EXECUTE_ACTION executeAction = { }; |
| 3122 | BURN_PACKAGE* pPackage = NULL; | 3132 | BURN_PACKAGE* pPackage = NULL; |
| 3123 | BURN_COMPATIBLE_PACKAGE* pCompatiblePackage = NULL; | 3133 | BURN_COMPATIBLE_PACKAGE* pCompatiblePackage = NULL; |
| @@ -3195,6 +3205,7 @@ static HRESULT OnExecutePackageProviderAction( | |||
| 3195 | HRESULT hr = S_OK; | 3205 | HRESULT hr = S_OK; |
| 3196 | SIZE_T iData = 0; | 3206 | SIZE_T iData = 0; |
| 3197 | LPWSTR sczPackage = NULL; | 3207 | LPWSTR sczPackage = NULL; |
| 3208 | BOOL fRollback = FALSE; | ||
| 3198 | BURN_EXECUTE_ACTION executeAction = { }; | 3209 | BURN_EXECUTE_ACTION executeAction = { }; |
| 3199 | 3210 | ||
| 3200 | executeAction.type = BURN_EXECUTE_ACTION_TYPE_PACKAGE_PROVIDER; | 3211 | executeAction.type = BURN_EXECUTE_ACTION_TYPE_PACKAGE_PROVIDER; |
| @@ -3203,9 +3214,6 @@ static HRESULT OnExecutePackageProviderAction( | |||
| 3203 | hr = BuffReadString(pbData, cbData, &iData, &sczPackage); | 3214 | hr = BuffReadString(pbData, cbData, &iData, &sczPackage); |
| 3204 | ExitOnFailure(hr, "Failed to read package id from message buffer."); | 3215 | ExitOnFailure(hr, "Failed to read package id from message buffer."); |
| 3205 | 3216 | ||
| 3206 | hr = BuffReadNumber(pbData, cbData, &iData, reinterpret_cast<DWORD*>(&executeAction.packageProvider.action)); | ||
| 3207 | ExitOnFailure(hr, "Failed to read action."); | ||
| 3208 | |||
| 3209 | // Find the package again. | 3217 | // Find the package again. |
| 3210 | hr = PackageFindById(pPackages, sczPackage, &executeAction.packageProvider.pPackage); | 3218 | hr = PackageFindById(pPackages, sczPackage, &executeAction.packageProvider.pPackage); |
| 3211 | if (E_NOTFOUND == hr) | 3219 | if (E_NOTFOUND == hr) |
| @@ -3214,8 +3222,25 @@ static HRESULT OnExecutePackageProviderAction( | |||
| 3214 | } | 3222 | } |
| 3215 | ExitOnFailure(hr, "Failed to find package: %ls", sczPackage); | 3223 | ExitOnFailure(hr, "Failed to find package: %ls", sczPackage); |
| 3216 | 3224 | ||
| 3225 | hr = BuffReadNumber(pbData, cbData, &iData, (DWORD*)&fRollback); | ||
| 3226 | ExitOnFailure(hr, "Failed to read rollback flag."); | ||
| 3227 | |||
| 3228 | // Read provider actions. | ||
| 3229 | for (DWORD i = 0; i < executeAction.packageProvider.pPackage->cDependencyProviders; ++i) | ||
| 3230 | { | ||
| 3231 | BURN_DEPENDENCY_PROVIDER* pProvider = executeAction.packageProvider.pPackage->rgDependencyProviders + i; | ||
| 3232 | BURN_DEPENDENCY_ACTION* pAction = fRollback ? &pProvider->providerRollback : &pProvider->providerExecute; | ||
| 3233 | hr = BuffReadNumber(pbData, cbData, &iData, (DWORD*)pAction); | ||
| 3234 | ExitOnFailure(hr, "Failed to read provider action."); | ||
| 3235 | } | ||
| 3236 | |||
| 3237 | if (!executeAction.packageProvider.pPackage->fPerMachine) | ||
| 3238 | { | ||
| 3239 | ExitWithRootFailure(hr, E_INVALIDARG, "ExecutePackageProviderAction called for per-user package."); | ||
| 3240 | } | ||
| 3241 | |||
| 3217 | // Execute the package provider action. | 3242 | // Execute the package provider action. |
| 3218 | hr = DependencyExecutePackageProviderAction(&executeAction); | 3243 | hr = DependencyExecutePackageProviderAction(&executeAction, fRollback); |
| 3219 | ExitOnFailure(hr, "Failed to execute package provider action."); | 3244 | ExitOnFailure(hr, "Failed to execute package provider action."); |
| 3220 | 3245 | ||
| 3221 | LExit: | 3246 | LExit: |
diff --git a/src/burn/engine/elevation.h b/src/burn/engine/elevation.h index 9659ef89..f5b56f02 100644 --- a/src/burn/engine/elevation.h +++ b/src/burn/engine/elevation.h | |||
| @@ -139,7 +139,8 @@ HRESULT ElevationUninstallMsiCompatiblePackage( | |||
| 139 | ); | 139 | ); |
| 140 | HRESULT ElevationExecutePackageProviderAction( | 140 | HRESULT ElevationExecutePackageProviderAction( |
| 141 | __in HANDLE hPipe, | 141 | __in HANDLE hPipe, |
| 142 | __in BURN_EXECUTE_ACTION* pExecuteAction | 142 | __in BURN_EXECUTE_ACTION* pExecuteAction, |
| 143 | __in BOOL fRollback | ||
| 143 | ); | 144 | ); |
| 144 | HRESULT ElevationExecutePackageDependencyAction( | 145 | HRESULT ElevationExecutePackageDependencyAction( |
| 145 | __in HANDLE hPipe, | 146 | __in HANDLE hPipe, |
diff --git a/src/burn/engine/package.h b/src/burn/engine/package.h index eb812e20..6fae0c10 100644 --- a/src/burn/engine/package.h +++ b/src/burn/engine/package.h | |||
| @@ -195,6 +195,9 @@ typedef struct _BURN_DEPENDENCY_PROVIDER | |||
| 195 | 195 | ||
| 196 | DEPENDENCY* rgDependents; // only valid after Detect. | 196 | DEPENDENCY* rgDependents; // only valid after Detect. |
| 197 | UINT cDependents; // only valid after Detect. | 197 | UINT cDependents; // only valid after Detect. |
| 198 | |||
| 199 | BURN_DEPENDENCY_ACTION providerExecute; // only valid during Plan. | ||
| 200 | BURN_DEPENDENCY_ACTION providerRollback; // only valid during Plan. | ||
| 198 | } BURN_DEPENDENCY_PROVIDER; | 201 | } BURN_DEPENDENCY_PROVIDER; |
| 199 | 202 | ||
| 200 | typedef struct _BURN_ROLLBACK_BOUNDARY | 203 | typedef struct _BURN_ROLLBACK_BOUNDARY |
| @@ -267,8 +270,8 @@ typedef struct _BURN_PACKAGE | |||
| 267 | BOOL fPlannedUncache; // only valid during Plan. | 270 | BOOL fPlannedUncache; // only valid during Plan. |
| 268 | BOOTSTRAPPER_ACTION_STATE execute; // only valid during Plan. | 271 | BOOTSTRAPPER_ACTION_STATE execute; // only valid during Plan. |
| 269 | BOOTSTRAPPER_ACTION_STATE rollback; // only valid during Plan. | 272 | BOOTSTRAPPER_ACTION_STATE rollback; // only valid during Plan. |
| 270 | BURN_DEPENDENCY_ACTION providerExecute; // only valid during Plan. | 273 | BOOL fProviderExecute; // only valid during Plan. |
| 271 | BURN_DEPENDENCY_ACTION providerRollback; // only valid during Plan. | 274 | BOOL fProviderRollback; // only valid during Plan. |
| 272 | BURN_DEPENDENCY_ACTION dependencyExecute; // only valid during Plan. | 275 | BURN_DEPENDENCY_ACTION dependencyExecute; // only valid during Plan. |
| 273 | BURN_DEPENDENCY_ACTION dependencyRollback; // only valid during Plan. | 276 | BURN_DEPENDENCY_ACTION dependencyRollback; // only valid during Plan. |
| 274 | BOOL fDependencyManagerWasHere; // only valid during Plan. | 277 | BOOL fDependencyManagerWasHere; // only valid during Plan. |
diff --git a/src/burn/engine/plan.cpp b/src/burn/engine/plan.cpp index a25b17d7..27eee3fb 100644 --- a/src/burn/engine/plan.cpp +++ b/src/burn/engine/plan.cpp | |||
| @@ -1922,8 +1922,8 @@ static void ResetPlannedPackageState( | |||
| 1922 | pPackage->fPlannedUncache = FALSE; | 1922 | pPackage->fPlannedUncache = FALSE; |
| 1923 | pPackage->execute = BOOTSTRAPPER_ACTION_STATE_NONE; | 1923 | pPackage->execute = BOOTSTRAPPER_ACTION_STATE_NONE; |
| 1924 | pPackage->rollback = BOOTSTRAPPER_ACTION_STATE_NONE; | 1924 | pPackage->rollback = BOOTSTRAPPER_ACTION_STATE_NONE; |
| 1925 | pPackage->providerExecute = BURN_DEPENDENCY_ACTION_NONE; | 1925 | pPackage->fProviderExecute = FALSE; |
| 1926 | pPackage->providerRollback = BURN_DEPENDENCY_ACTION_NONE; | 1926 | pPackage->fProviderRollback = FALSE; |
| 1927 | pPackage->dependencyExecute = BURN_DEPENDENCY_ACTION_NONE; | 1927 | pPackage->dependencyExecute = BURN_DEPENDENCY_ACTION_NONE; |
| 1928 | pPackage->dependencyRollback = BURN_DEPENDENCY_ACTION_NONE; | 1928 | pPackage->dependencyRollback = BURN_DEPENDENCY_ACTION_NONE; |
| 1929 | pPackage->fDependencyManagerWasHere = FALSE; | 1929 | pPackage->fDependencyManagerWasHere = FALSE; |
| @@ -1969,6 +1969,14 @@ static void ResetPlannedPackageState( | |||
| 1969 | } | 1969 | } |
| 1970 | } | 1970 | } |
| 1971 | 1971 | ||
| 1972 | for (DWORD i = 0; i < pPackage->cDependencyProviders; ++i) | ||
| 1973 | { | ||
| 1974 | BURN_DEPENDENCY_PROVIDER* pProvider = &pPackage->rgDependencyProviders[i]; | ||
| 1975 | |||
| 1976 | pProvider->providerExecute = BURN_DEPENDENCY_ACTION_NONE; | ||
| 1977 | pProvider->providerRollback = BURN_DEPENDENCY_ACTION_NONE; | ||
| 1978 | } | ||
| 1979 | |||
| 1972 | ResetPlannedPayloadGroupState(&pPackage->payloads); | 1980 | ResetPlannedPayloadGroupState(&pPackage->payloads); |
| 1973 | } | 1981 | } |
| 1974 | 1982 | ||
| @@ -2637,7 +2645,12 @@ static void ExecuteActionLog( | |||
| 2637 | break; | 2645 | break; |
| 2638 | 2646 | ||
| 2639 | case BURN_EXECUTE_ACTION_TYPE_PACKAGE_PROVIDER: | 2647 | case BURN_EXECUTE_ACTION_TYPE_PACKAGE_PROVIDER: |
| 2640 | LogStringLine(PlanDumpLevel, "%ls action[%u]: PACKAGE_PROVIDER package id: %ls, action: %hs", wzBase, iAction, pAction->packageProvider.pPackage->sczId, LoggingDependencyActionToString(pAction->packageProvider.action)); | 2648 | LogStringLine(PlanDumpLevel, "%ls action[%u]: PACKAGE_PROVIDER package id: %ls", wzBase, iAction, pAction->packageProvider.pPackage->sczId); |
| 2649 | for (DWORD j = 0; j < pAction->packageProvider.pPackage->cDependencyProviders; ++j) | ||
| 2650 | { | ||
| 2651 | const BURN_DEPENDENCY_PROVIDER* pProvider = pAction->packageProvider.pPackage->rgDependencyProviders + j; | ||
| 2652 | LogStringLine(PlanDumpLevel, " Provider[%u]: key: %ls, action: %hs", j, pProvider->sczKey, LoggingDependencyActionToString(fRollback ? pProvider->providerRollback : pProvider->providerExecute)); | ||
| 2653 | } | ||
| 2641 | break; | 2654 | break; |
| 2642 | 2655 | ||
| 2643 | case BURN_EXECUTE_ACTION_TYPE_PACKAGE_DEPENDENCY: | 2656 | case BURN_EXECUTE_ACTION_TYPE_PACKAGE_DEPENDENCY: |
diff --git a/src/burn/engine/plan.h b/src/burn/engine/plan.h index 15092210..61953168 100644 --- a/src/burn/engine/plan.h +++ b/src/burn/engine/plan.h | |||
| @@ -208,7 +208,6 @@ typedef struct _BURN_EXECUTE_ACTION | |||
| 208 | struct | 208 | struct |
| 209 | { | 209 | { |
| 210 | BURN_PACKAGE* pPackage; | 210 | BURN_PACKAGE* pPackage; |
| 211 | BURN_DEPENDENCY_ACTION action; | ||
| 212 | } packageProvider; | 211 | } packageProvider; |
| 213 | struct | 212 | struct |
| 214 | { | 213 | { |
