@joebigelow / wix / commits / d0d93bea

Add logging for patch target products.

Sean Hall committed Feb 21, 2021 at 11:54 UTC d0d93beac0b79fa9c3d43398813954988afda18f
9 files changed +98 -31
src/engine/core.cpp
+11
@@ -1822,6 +1822,17 @@ static void LogPackages(
1822 LogId(REPORT_STANDARD, MSG_PLANNED_MSI_FEATURE, pFeature->sczId, LoggingMsiFeatureStateToString(pFeature->currentState), LoggingMsiFeatureStateToString(pFeature->defaultRequested), LoggingMsiFeatureStateToString(pFeature->requested), LoggingMsiFeatureActionToString(pFeature->execute), LoggingMsiFeatureActionToString(pFeature->rollback));
1823 }
1824 }
1825 + else if (BURN_PACKAGE_TYPE_MSP == pPackage->type && pPackage->Msp.cTargetProductCodes)
1826 + {
1827 + LogId(REPORT_STANDARD, MSG_PLANNED_MSP_TARGETS, pPackage->Msp.cTargetProductCodes, pPackage->sczId);
1828 +
1829 + for (DWORD j = 0; j < pPackage->Msp.cTargetProductCodes; ++j)
1830 + {
1831 + const BURN_MSPTARGETPRODUCT* pTargetProduct = &pPackage->Msp.rgTargetProducts[j];
1832 +
1833 + LogId(REPORT_STANDARD, MSG_PLANNED_MSP_TARGET, pTargetProduct->wzTargetProductCode, LoggingPackageStateToString(pTargetProduct->patchPackageState), LoggingRequestStateToString(pTargetProduct->defaultRequested), LoggingRequestStateToString(pTargetProduct->requested), LoggingMspTargetActionToString(pTargetProduct->execute, pTargetProduct->executeSkip), LoggingMspTargetActionToString(pTargetProduct->rollback, pTargetProduct->rollbackSkip));
1834 + }
1835 + }
1836 }
1837
1838 // Display related bundles last if caching, installing, modifying, or repairing.
src/engine/elevation.cpp
-7
@@ -855,7 +855,6 @@ extern "C" HRESULT ElevationExecuteMsiPackage(
855 DWORD dwResult = 0;
856
857 // serialize message data
858 - // TODO: for patching we might not have a package
858 hr = BuffWriteString(&pbData, &cbData, pExecuteAction->msiPackage.pPackage->sczId);
859 ExitOnFailure(hr, "Failed to write package id to message buffer.");
860
@@ -964,9 +963,6 @@ extern "C" HRESULT ElevationExecuteMspPackage(
963
964 for (DWORD i = 0; i < pExecuteAction->mspTarget.cOrderedPatches; ++i)
965 {
967 - hr = BuffWriteNumber(&pbData, &cbData, pExecuteAction->mspTarget.rgOrderedPatches[i].dwOrder);
968 - ExitOnFailure(hr, "Failed to write ordered patch order to message buffer.");
969 -
966 hr = BuffWriteString(&pbData, &cbData, pExecuteAction->mspTarget.rgOrderedPatches[i].pPackage->sczId);
967 ExitOnFailure(hr, "Failed to write ordered patch id to message buffer.");
968 }
@@ -2404,9 +2400,6 @@ static HRESULT OnExecuteMspPackage(
2400
2401 for (DWORD i = 0; i < executeAction.mspTarget.cOrderedPatches; ++i)
2402 {
2407 - hr = BuffReadNumber(pbData, cbData, &iData, &executeAction.mspTarget.rgOrderedPatches[i].dwOrder);
2408 - ExitOnFailure(hr, "Failed to read ordered patch order number.");
2409 -
2403 hr = BuffReadString(pbData, cbData, &iData, &sczPackage);
2404 ExitOnFailure(hr, "Failed to read ordered patch package id.");
2405
src/engine/engine.mc
+14
@@ -415,6 +415,20 @@ Language=English
415 Plan skipped dependent bundle repair: %1!ls!, type: %2!hs!, because no packages are being executed during this uninstall operation.
416 .
417
418 +MessageId=218
419 +Severity=Success
420 +SymbolicName=MSG_PLANNED_MSP_TARGETS
421 +Language=English
422 +Plan %1!u! patch targets for package: %2!ls!
423 +.
424 +
425 +MessageId=219
426 +Severity=Success
427 +SymbolicName=MSG_PLANNED_MSP_TARGET
428 +Language=English
429 +Planned patch target: %1!ls!, state: %2!hs!, default requested: %3!hs!, ba requested: %4!hs!, execute: %5!hs!, rollback: %6!hs!
430 +.
431 +
432 MessageId=299
433 Severity=Success
434 SymbolicName=MSG_PLAN_COMPLETE
src/engine/logging.cpp
+18
@@ -531,6 +531,24 @@ extern "C" LPCWSTR LoggingBurnMsiPropertyToString(
531 }
532 }
533
534 +extern "C" LPCSTR LoggingMspTargetActionToString(
535 + __in BOOTSTRAPPER_ACTION_STATE action,
536 + __in BURN_PATCH_SKIP_STATE skipState
537 + )
538 +{
539 + switch (skipState)
540 + {
541 + case BURN_PATCH_SKIP_STATE_NONE:
542 + return LoggingActionStateToString(action);
543 + case BURN_PATCH_SKIP_STATE_TARGET_UNINSTALL:
544 + return "Skipped (target uninstall)";
545 + case BURN_PATCH_SKIP_STATE_SLIPSTREAM:
546 + return "Skipped (slipstream)";
547 + default:
548 + return "Invalid";
549 + }
550 +}
551 +
552 extern "C" LPCSTR LoggingPerMachineToString(
553 __in BOOL fPerMachine
554 )
src/engine/logging.h
+5
@@ -114,6 +114,11 @@ LPCWSTR LoggingBurnMsiPropertyToString(
114 __in BURN_MSI_PROPERTY burnMsiProperty
115 );
116
117 +LPCSTR LoggingMspTargetActionToString(
118 + __in BOOTSTRAPPER_ACTION_STATE action,
119 + __in BURN_PATCH_SKIP_STATE skipState
120 + );
121 +
122 LPCSTR LoggingPerMachineToString(
123 __in BOOL fPerMachine
124 );
src/engine/mspengine.cpp
+3 -3
@@ -290,7 +290,7 @@ extern "C" HRESULT MspEnginePlanInitializePackage(
290 {
291 BURN_MSPTARGETPRODUCT* pTargetProduct = pPackage->Msp.rgTargetProducts + i;
292
293 - pTargetProduct->requested = pPackage->requested;
293 + pTargetProduct->defaultRequested = pTargetProduct->requested = pPackage->requested;
294
295 hr = UserExperienceOnPlanPatchTarget(pUserExperience, pPackage->sczId, pTargetProduct->wzTargetProductCode, &pTargetProduct->requested);
296 ExitOnRootFailure(hr, "BA aborted plan patch target.");
@@ -1086,14 +1086,14 @@ static HRESULT PlanTargetProduct(
1086 hr = MemEnsureArraySize(reinterpret_cast<LPVOID*>(&pAction->mspTarget.rgOrderedPatches), pAction->mspTarget.cOrderedPatches + 1, sizeof(BURN_ORDERED_PATCHES), 2);
1087 ExitOnFailure(hr, "Failed grow array of ordered patches.");
1088
1089 - pAction->mspTarget.rgOrderedPatches[pAction->mspTarget.cOrderedPatches].dwOrder = pTargetProduct->dwOrder;
1089 + pAction->mspTarget.rgOrderedPatches[pAction->mspTarget.cOrderedPatches].pTargetProduct = pTargetProduct;
1090 pAction->mspTarget.rgOrderedPatches[pAction->mspTarget.cOrderedPatches].pPackage = pPackage;
1091 ++pAction->mspTarget.cOrderedPatches;
1092
1093 // Insertion sort to keep the patches ordered.
1094 for (DWORD i = pAction->mspTarget.cOrderedPatches - 1; i > 0; --i)
1095 {
1096 - if (pAction->mspTarget.rgOrderedPatches[i].dwOrder < pAction->mspTarget.rgOrderedPatches[i - 1].dwOrder)
1096 + if (pAction->mspTarget.rgOrderedPatches[i].pTargetProduct->dwOrder < pAction->mspTarget.rgOrderedPatches[i - 1].pTargetProduct->dwOrder)
1097 {
1098 BURN_ORDERED_PATCHES temp = pAction->mspTarget.rgOrderedPatches[i - 1];
1099 pAction->mspTarget.rgOrderedPatches[i - 1] = pAction->mspTarget.rgOrderedPatches[i];
src/engine/package.h
+10
@@ -86,6 +86,13 @@ enum BURN_PACKAGE_REGISTRATION_STATE
86 BURN_PACKAGE_REGISTRATION_STATE_PRESENT,
87 };
88
89 +enum BURN_PATCH_SKIP_STATE
90 +{
91 + BURN_PATCH_SKIP_STATE_NONE,
92 + BURN_PATCH_SKIP_STATE_TARGET_UNINSTALL,
93 + BURN_PATCH_SKIP_STATE_SLIPSTREAM,
94 +};
95 +
96 // structs
97
98 typedef struct _BURN_EXE_EXIT_CODE
@@ -112,9 +119,12 @@ typedef struct _BURN_MSPTARGETPRODUCT
119 BOOL fSlipstream;
120
121 BOOTSTRAPPER_PACKAGE_STATE patchPackageState; // only valid after Detect.
122 + BOOTSTRAPPER_REQUEST_STATE defaultRequested; // only valid during Plan.
123 BOOTSTRAPPER_REQUEST_STATE requested; // only valid during Plan.
124 BOOTSTRAPPER_ACTION_STATE execute; // only valid during Plan.
125 BOOTSTRAPPER_ACTION_STATE rollback; // only valid during Plan.
126 + BURN_PATCH_SKIP_STATE executeSkip; // only valid during Plan.
127 + BURN_PATCH_SKIP_STATE rollbackSkip; // only valid during Plan.
128
129 BURN_PACKAGE_REGISTRATION_STATE registrationState; // initialized during Detect, updated during Apply.
130 BURN_PACKAGE_REGISTRATION_STATE transactionRegistrationState;// only valid during Apply inside an MSI transaction.
src/engine/plan.cpp
+35 -17
@@ -149,7 +149,7 @@ static BURN_CACHE_ACTION* ProcessSharedPayload(
149 __in BURN_PLAN* pPlan,
150 __in BURN_PAYLOAD* pPayload
151 );
152 -static HRESULT RemoveUnnecessaryActions(
152 +static void RemoveUnnecessaryActions(
153 __in BOOL fExecute,
154 __in BURN_EXECUTE_ACTION* rgActions,
155 __in DWORD cActions
@@ -302,7 +302,6 @@ extern "C" void PlanUninitializeExecuteAction(
302 ReleaseStr(pExecuteAction->msiPackage.sczLogPath);
303 ReleaseMem(pExecuteAction->msiPackage.rgFeatures);
304 ReleaseMem(pExecuteAction->msiPackage.rgSlipstreamPatches);
305 - ReleaseMem(pExecuteAction->msiPackage.rgOrderedPatches);
305 break;
306
307 case BURN_EXECUTE_ACTION_TYPE_MSP_TARGET:
@@ -1499,11 +1498,9 @@ extern "C" HRESULT PlanFinalizeActions(
1498 {
1499 HRESULT hr = S_OK;
1500
1502 - hr = RemoveUnnecessaryActions(TRUE, pPlan->rgExecuteActions, pPlan->cExecuteActions);
1503 - ExitOnFailure(hr, "Failed to remove unnecessary execute actions.");
1501 + RemoveUnnecessaryActions(TRUE, pPlan->rgExecuteActions, pPlan->cExecuteActions);
1502
1505 - hr = RemoveUnnecessaryActions(FALSE, pPlan->rgRollbackActions, pPlan->cRollbackActions);
1506 - ExitOnFailure(hr, "Failed to remove unnecessary execute actions.");
1503 + RemoveUnnecessaryActions(FALSE, pPlan->rgRollbackActions, pPlan->cRollbackActions);
1504
1505 hr = FinalizeSlipstreamPatchActions(TRUE, pPlan->rgExecuteActions, pPlan->cExecuteActions);
1506 ExitOnFailure(hr, "Failed to finalize slipstream execute actions.");
@@ -1890,9 +1887,12 @@ static void ResetPlannedPackageState(
1887 {
1888 BURN_MSPTARGETPRODUCT* pTargetProduct = &pPackage->Msp.rgTargetProducts[i];
1889
1890 + pTargetProduct->defaultRequested = BOOTSTRAPPER_REQUEST_STATE_NONE;
1891 pTargetProduct->requested = BOOTSTRAPPER_REQUEST_STATE_NONE;
1892 pTargetProduct->execute = BOOTSTRAPPER_ACTION_STATE_NONE;
1893 pTargetProduct->rollback = BOOTSTRAPPER_ACTION_STATE_NONE;
1894 + pTargetProduct->executeSkip = BURN_PATCH_SKIP_STATE_NONE;
1895 + pTargetProduct->rollbackSkip = BURN_PATCH_SKIP_STATE_NONE;
1896 }
1897 }
1898 }
@@ -2704,13 +2704,12 @@ static BURN_CACHE_ACTION* ProcessSharedPayload(
2704 return pAcquireAction;
2705 }
2706
2707 -static HRESULT RemoveUnnecessaryActions(
2707 +static void RemoveUnnecessaryActions(
2708 __in BOOL fExecute,
2709 __in BURN_EXECUTE_ACTION* rgActions,
2710 __in DWORD cActions
2711 )
2712 {
2713 - HRESULT hr = S_OK;
2713 LPCSTR szExecuteOrRollback = fExecute ? "execute" : "rollback";
2714
2715 for (DWORD i = 0; i < cActions; ++i)
@@ -2722,10 +2721,11 @@ static HRESULT RemoveUnnecessaryActions(
2721 if (BURN_EXECUTE_ACTION_TYPE_MSP_TARGET == pAction->type && pAction->mspTarget.pChainedTargetPackage)
2722 {
2723 BOOTSTRAPPER_ACTION_STATE chainedTargetPackageAction = fExecute ? pAction->mspTarget.pChainedTargetPackage->execute : pAction->mspTarget.pChainedTargetPackage->rollback;
2724 + BURN_PATCH_SKIP_STATE skipState = BURN_PATCH_SKIP_STATE_NONE;
2725 if (BOOTSTRAPPER_ACTION_STATE_UNINSTALL == chainedTargetPackageAction)
2726 {
2727 + skipState = BURN_PATCH_SKIP_STATE_TARGET_UNINSTALL;
2728 LogId(REPORT_STANDARD, MSG_PLAN_SKIP_PATCH_ACTION, pAction->mspTarget.pPackage->sczId, LoggingActionStateToString(pAction->mspTarget.action), pAction->mspTarget.pChainedTargetPackage->sczId, LoggingActionStateToString(chainedTargetPackageAction), szExecuteOrRollback);
2728 - pAction->fDeleted = TRUE;
2729 }
2730 else if (BOOTSTRAPPER_ACTION_STATE_UNINSTALL < chainedTargetPackageAction && pAction->mspTarget.fSlipstream && BOOTSTRAPPER_ACTION_STATE_UNINSTALL < pAction->mspTarget.action)
2731 {
@@ -2737,14 +2737,31 @@ static HRESULT RemoveUnnecessaryActions(
2737 // is already on the machine. The slipstream must be installed standalone if the MSI is being repaired.
2738 if (BOOTSTRAPPER_ACTION_STATE_REPAIR != chainedTargetPackageAction || BOOTSTRAPPER_ACTION_STATE_REPAIR == pAction->mspTarget.action)
2739 {
2740 + skipState = BURN_PATCH_SKIP_STATE_SLIPSTREAM;
2741 LogId(REPORT_STANDARD, MSG_PLAN_SKIP_SLIPSTREAM_ACTION, pAction->mspTarget.pPackage->sczId, LoggingActionStateToString(pAction->mspTarget.action), pAction->mspTarget.pChainedTargetPackage->sczId, LoggingActionStateToString(chainedTargetPackageAction), szExecuteOrRollback);
2741 - pAction->fDeleted = TRUE;
2742 + }
2743 + }
2744 +
2745 + if (BURN_PATCH_SKIP_STATE_NONE != skipState)
2746 + {
2747 + pAction->fDeleted = TRUE;
2748 +
2749 + for (DWORD j = 0; j < pAction->mspTarget.cOrderedPatches; ++j)
2750 + {
2751 + BURN_MSPTARGETPRODUCT* pTargetProduct = pAction->mspTarget.rgOrderedPatches[j].pTargetProduct;
2752 +
2753 + if (fExecute)
2754 + {
2755 + pTargetProduct->executeSkip = skipState;
2756 + }
2757 + else
2758 + {
2759 + pTargetProduct->rollbackSkip = skipState;
2760 + }
2761 }
2762 }
2763 }
2764 }
2746 -
2747 - return hr;
2765 }
2766
2767 static HRESULT FinalizeSlipstreamPatchActions(
@@ -3047,17 +3064,13 @@ static void ExecuteActionLog(
3064
3065 case BURN_EXECUTE_ACTION_TYPE_MSI_PACKAGE:
3066 LogStringLine(PlanDumpLevel, "%ls action[%u]: MSI_PACKAGE package id: %ls, action: %hs, action msi property: %ls, ui level: %u, disable externaluihandler: %ls, log path: %ls, logging attrib: %u", wzBase, iAction, pAction->msiPackage.pPackage->sczId, LoggingActionStateToString(pAction->msiPackage.action), LoggingBurnMsiPropertyToString(pAction->msiPackage.actionMsiProperty), pAction->msiPackage.uiLevel, pAction->msiPackage.fDisableExternalUiHandler ? L"yes" : L"no", pAction->msiPackage.sczLogPath, pAction->msiPackage.dwLoggingAttributes);
3050 - for (DWORD j = 0; j < pAction->msiPackage.cPatches; ++j)
3051 - {
3052 - LogStringLine(PlanDumpLevel, " Patch[%u]: order: %u, msp package id: %ls", j, pAction->msiPackage.rgOrderedPatches[j].dwOrder, pAction->msiPackage.rgOrderedPatches[j].pPackage->sczId);
3053 - }
3067 break;
3068
3069 case BURN_EXECUTE_ACTION_TYPE_MSP_TARGET:
3070 LogStringLine(PlanDumpLevel, "%ls action[%u]: MSP_TARGET package id: %ls, action: %hs, target product code: %ls, target per-machine: %ls, action msi property: %ls, ui level: %u, disable externaluihandler: %ls, log path: %ls", wzBase, iAction, pAction->mspTarget.pPackage->sczId, LoggingActionStateToString(pAction->mspTarget.action), pAction->mspTarget.sczTargetProductCode, pAction->mspTarget.fPerMachineTarget ? L"yes" : L"no", LoggingBurnMsiPropertyToString(pAction->mspTarget.actionMsiProperty), pAction->mspTarget.uiLevel, pAction->mspTarget.fDisableExternalUiHandler ? L"yes" : L"no", pAction->mspTarget.sczLogPath);
3071 for (DWORD j = 0; j < pAction->mspTarget.cOrderedPatches; ++j)
3072 {
3060 - LogStringLine(PlanDumpLevel, " Patch[%u]: order: %u, msp package id: %ls", j, pAction->mspTarget.rgOrderedPatches[j].dwOrder, pAction->mspTarget.rgOrderedPatches[j].pPackage->sczId);
3073 + LogStringLine(PlanDumpLevel, " Patch[%u]: order: %u, msp package id: %ls", j, pAction->mspTarget.rgOrderedPatches[j].pTargetProduct->dwOrder, pAction->mspTarget.rgOrderedPatches[j].pPackage->sczId);
3074 }
3075 break;
3076
@@ -3089,6 +3102,11 @@ static void ExecuteActionLog(
3102 AssertSz(FALSE, "Unknown execute action type.");
3103 break;
3104 }
3105 +
3106 + if (pAction->fDeleted)
3107 + {
3108 + LogStringLine(PlanDumpLevel, " (deleted action)");
3109 + }
3110 }
3111
3112 extern "C" void PlanDump(
src/engine/plan.h
+2 -4
@@ -208,8 +208,9 @@ typedef struct _BURN_CACHE_ACTION
208
209 typedef struct _BURN_ORDERED_PATCHES
210 {
211 - DWORD dwOrder;
211 BURN_PACKAGE* pPackage;
212 +
213 + BURN_MSPTARGETPRODUCT* pTargetProduct; // only valid in the unelevated engine.
214 } BURN_ORDERED_PATCHES;
215
216 typedef struct _BURN_EXECUTE_ACTION_CHECKPOINT
@@ -253,9 +254,6 @@ typedef struct _BURN_EXECUTE_ACTION
254
255 BOOTSTRAPPER_FEATURE_ACTION* rgFeatures;
256 BOOTSTRAPPER_ACTION_STATE* rgSlipstreamPatches;
256 -
257 - BURN_ORDERED_PATCHES* rgOrderedPatches;
258 - DWORD cPatches;
257 } msiPackage;
258 struct
259 {