diff options
| author | Nir Bar <nir.bar@panel-sw.co.il> | 2021-08-12 14:16:01 -0500 |
|---|---|---|
| committer | Sean Hall <r.sean.hall@gmail.com> | 2021-08-12 14:50:55 -0500 |
| commit | bb18c9c4f0e6da640775b85ebda68b31f2b391ed (patch) | |
| tree | 5ce6107321293f7af7a0504588e3d0c6642472ff /src/burn/engine | |
| parent | 0042e3d4554a0d92e1da6141854b0f1aafa07d5b (diff) | |
| download | wix-bb18c9c4f0e6da640775b85ebda68b31f2b391ed.tar.gz wix-bb18c9c4f0e6da640775b85ebda68b31f2b391ed.tar.bz2 wix-bb18c9c4f0e6da640775b85ebda68b31f2b391ed.zip | |
Set the log file path for MSI transactions.
Diffstat (limited to 'src/burn/engine')
| -rw-r--r-- | src/burn/engine/elevation.cpp | 15 | ||||
| -rw-r--r-- | src/burn/engine/logging.cpp | 35 | ||||
| -rw-r--r-- | src/burn/engine/logging.h | 7 | ||||
| -rw-r--r-- | src/burn/engine/package.cpp | 62 | ||||
| -rw-r--r-- | src/burn/engine/package.h | 1 | ||||
| -rw-r--r-- | src/burn/engine/plan.cpp | 6 |
6 files changed, 84 insertions, 42 deletions
diff --git a/src/burn/engine/elevation.cpp b/src/burn/engine/elevation.cpp index 0e1cf0b7..ba6b1dd3 100644 --- a/src/burn/engine/elevation.cpp +++ b/src/burn/engine/elevation.cpp | |||
| @@ -3246,7 +3246,10 @@ static HRESULT OnMsiBeginTransaction( | |||
| 3246 | hr = PackageFindRollbackBoundaryById(pPackages, sczId, &pRollbackBoundary); | 3246 | hr = PackageFindRollbackBoundaryById(pPackages, sczId, &pRollbackBoundary); |
| 3247 | ExitOnFailure(hr, "Failed to find rollback boundary: %ls", sczId); | 3247 | ExitOnFailure(hr, "Failed to find rollback boundary: %ls", sczId); |
| 3248 | 3248 | ||
| 3249 | pRollbackBoundary->sczLogPath = sczLogPath; | 3249 | if (sczLogPath && *sczLogPath) |
| 3250 | { | ||
| 3251 | pRollbackBoundary->sczLogPath = sczLogPath; | ||
| 3252 | } | ||
| 3250 | 3253 | ||
| 3251 | hr = MsiEngineBeginTransaction(pRollbackBoundary); | 3254 | hr = MsiEngineBeginTransaction(pRollbackBoundary); |
| 3252 | 3255 | ||
| @@ -3284,7 +3287,10 @@ static HRESULT OnMsiCommitTransaction( | |||
| 3284 | hr = PackageFindRollbackBoundaryById(pPackages, sczId, &pRollbackBoundary); | 3287 | hr = PackageFindRollbackBoundaryById(pPackages, sczId, &pRollbackBoundary); |
| 3285 | ExitOnFailure(hr, "Failed to find rollback boundary: %ls", sczId); | 3288 | ExitOnFailure(hr, "Failed to find rollback boundary: %ls", sczId); |
| 3286 | 3289 | ||
| 3287 | pRollbackBoundary->sczLogPath = sczLogPath; | 3290 | if (sczLogPath && *sczLogPath) |
| 3291 | { | ||
| 3292 | pRollbackBoundary->sczLogPath = sczLogPath; | ||
| 3293 | } | ||
| 3288 | 3294 | ||
| 3289 | hr = MsiEngineCommitTransaction(pRollbackBoundary); | 3295 | hr = MsiEngineCommitTransaction(pRollbackBoundary); |
| 3290 | 3296 | ||
| @@ -3322,7 +3328,10 @@ static HRESULT OnMsiRollbackTransaction( | |||
| 3322 | hr = PackageFindRollbackBoundaryById(pPackages, sczId, &pRollbackBoundary); | 3328 | hr = PackageFindRollbackBoundaryById(pPackages, sczId, &pRollbackBoundary); |
| 3323 | ExitOnFailure(hr, "Failed to find rollback boundary: %ls", sczId); | 3329 | ExitOnFailure(hr, "Failed to find rollback boundary: %ls", sczId); |
| 3324 | 3330 | ||
| 3325 | pRollbackBoundary->sczLogPath = sczLogPath; | 3331 | if (sczLogPath && *sczLogPath) |
| 3332 | { | ||
| 3333 | pRollbackBoundary->sczLogPath = sczLogPath; | ||
| 3334 | } | ||
| 3326 | 3335 | ||
| 3327 | hr = MsiEngineRollbackTransaction(pRollbackBoundary); | 3336 | hr = MsiEngineRollbackTransaction(pRollbackBoundary); |
| 3328 | 3337 | ||
diff --git a/src/burn/engine/logging.cpp b/src/burn/engine/logging.cpp index 9aaf60ed..33295acd 100644 --- a/src/burn/engine/logging.cpp +++ b/src/burn/engine/logging.cpp | |||
| @@ -242,11 +242,6 @@ extern "C" HRESULT LoggingSetPackageVariable( | |||
| 242 | // Make sure that no package log files are created when logging has been disabled via Log element. | 242 | // Make sure that no package log files are created when logging has been disabled via Log element. |
| 243 | if (BURN_LOGGING_STATE_DISABLED == pLog->state) | 243 | if (BURN_LOGGING_STATE_DISABLED == pLog->state) |
| 244 | { | 244 | { |
| 245 | if (psczLogPath) | ||
| 246 | { | ||
| 247 | *psczLogPath = NULL; | ||
| 248 | } | ||
| 249 | |||
| 250 | ExitFunction(); | 245 | ExitFunction(); |
| 251 | } | 246 | } |
| 252 | 247 | ||
| @@ -272,6 +267,36 @@ LExit: | |||
| 272 | return hr; | 267 | return hr; |
| 273 | } | 268 | } |
| 274 | 269 | ||
| 270 | extern "C" HRESULT LoggingSetTransactionVariable( | ||
| 271 | __in BURN_ROLLBACK_BOUNDARY* pRollbackBoundary, | ||
| 272 | __in_z_opt LPCWSTR wzSuffix, | ||
| 273 | __in BURN_LOGGING* pLog, | ||
| 274 | __in BURN_VARIABLES* pVariables | ||
| 275 | ) | ||
| 276 | { | ||
| 277 | HRESULT hr = S_OK; | ||
| 278 | |||
| 279 | // Make sure that no log files are created when logging has been disabled via Log element. | ||
| 280 | if (BURN_LOGGING_STATE_DISABLED == pLog->state) | ||
| 281 | { | ||
| 282 | ExitFunction(); | ||
| 283 | } | ||
| 284 | |||
| 285 | if (pRollbackBoundary && pRollbackBoundary->sczLogPathVariable && *pRollbackBoundary->sczLogPathVariable) | ||
| 286 | { | ||
| 287 | hr = StrAllocFormatted(&pRollbackBoundary->sczLogPath, L"%ls%hs%ls_%03u_%ls.%ls", pLog->sczPrefix, wzSuffix && *wzSuffix ? "_" : "", wzSuffix && *wzSuffix ? wzSuffix : L"", vdwPackageSequence, pRollbackBoundary->sczId, pLog->sczExtension); | ||
| 288 | ExitOnFailure(hr, "Failed to allocate path for transaction log."); | ||
| 289 | |||
| 290 | hr = VariableSetString(pVariables, pRollbackBoundary->sczLogPathVariable, pRollbackBoundary->sczLogPath, FALSE, FALSE); | ||
| 291 | ExitOnFailure(hr, "Failed to set log path into variable."); | ||
| 292 | } | ||
| 293 | |||
| 294 | LExit: | ||
| 295 | ++vdwPackageSequence; | ||
| 296 | |||
| 297 | return hr; | ||
| 298 | } | ||
| 299 | |||
| 275 | extern "C" LPCSTR LoggingBurnActionToString( | 300 | extern "C" LPCSTR LoggingBurnActionToString( |
| 276 | __in BOOTSTRAPPER_ACTION action | 301 | __in BOOTSTRAPPER_ACTION action |
| 277 | ) | 302 | ) |
diff --git a/src/burn/engine/logging.h b/src/burn/engine/logging.h index 492e14b6..367b94a3 100644 --- a/src/burn/engine/logging.h +++ b/src/burn/engine/logging.h | |||
| @@ -62,6 +62,13 @@ HRESULT LoggingSetPackageVariable( | |||
| 62 | __out_opt LPWSTR* psczLogPath | 62 | __out_opt LPWSTR* psczLogPath |
| 63 | ); | 63 | ); |
| 64 | 64 | ||
| 65 | HRESULT LoggingSetTransactionVariable( | ||
| 66 | __in BURN_ROLLBACK_BOUNDARY* pRollbackBoundary, | ||
| 67 | __in_z_opt LPCWSTR wzSuffix, | ||
| 68 | __in BURN_LOGGING* pLog, | ||
| 69 | __in BURN_VARIABLES* pVariables | ||
| 70 | ); | ||
| 71 | |||
| 65 | LPCSTR LoggingBurnActionToString( | 72 | LPCSTR LoggingBurnActionToString( |
| 66 | __in BOOTSTRAPPER_ACTION action | 73 | __in BOOTSTRAPPER_ACTION action |
| 67 | ); | 74 | ); |
diff --git a/src/burn/engine/package.cpp b/src/burn/engine/package.cpp index cd871bc5..bea48cb5 100644 --- a/src/burn/engine/package.cpp +++ b/src/burn/engine/package.cpp | |||
| @@ -36,6 +36,7 @@ extern "C" HRESULT PackagesParseFromXml( | |||
| 36 | BSTR bstrNodeName = NULL; | 36 | BSTR bstrNodeName = NULL; |
| 37 | DWORD cMspPackages = 0; | 37 | DWORD cMspPackages = 0; |
| 38 | LPWSTR scz = NULL; | 38 | LPWSTR scz = NULL; |
| 39 | BOOL fFoundXml = FALSE; | ||
| 39 | 40 | ||
| 40 | // select rollback boundary nodes | 41 | // select rollback boundary nodes |
| 41 | hr = XmlSelectNodes(pixnBundle, L"RollbackBoundary", &pixnNodes); | 42 | hr = XmlSelectNodes(pixnBundle, L"RollbackBoundary", &pixnNodes); |
| @@ -63,15 +64,19 @@ extern "C" HRESULT PackagesParseFromXml( | |||
| 63 | 64 | ||
| 64 | // @Id | 65 | // @Id |
| 65 | hr = XmlGetAttributeEx(pixnNode, L"Id", &pRollbackBoundary->sczId); | 66 | hr = XmlGetAttributeEx(pixnNode, L"Id", &pRollbackBoundary->sczId); |
| 66 | ExitOnFailure(hr, "Failed to get @Id."); | 67 | ExitOnRequiredXmlQueryFailure(hr, "Failed to get @Id."); |
| 67 | 68 | ||
| 68 | // @Vital | 69 | // @Vital |
| 69 | hr = XmlGetYesNoAttribute(pixnNode, L"Vital", &pRollbackBoundary->fVital); | 70 | hr = XmlGetYesNoAttribute(pixnNode, L"Vital", &pRollbackBoundary->fVital); |
| 70 | ExitOnFailure(hr, "Failed to get @Vital."); | 71 | ExitOnRequiredXmlQueryFailure(hr, "Failed to get @Vital."); |
| 71 | 72 | ||
| 72 | // @Transaction | 73 | // @Transaction |
| 73 | hr = XmlGetYesNoAttribute(pixnNode, L"Transaction", &pRollbackBoundary->fTransactionAuthored); | 74 | hr = XmlGetYesNoAttribute(pixnNode, L"Transaction", &pRollbackBoundary->fTransactionAuthored); |
| 74 | ExitOnFailure(hr, "Failed to get @Transaction."); | 75 | ExitOnRequiredXmlQueryFailure(hr, "Failed to get @Transaction."); |
| 76 | |||
| 77 | // @LogPathVariable | ||
| 78 | hr = XmlGetAttributeEx(pixnNode, L"LogPathVariable", &pRollbackBoundary->sczLogPathVariable); | ||
| 79 | ExitOnOptionalXmlQueryFailure(hr, fFoundXml, "Failed to get @LogPathVariable."); | ||
| 75 | 80 | ||
| 76 | // prepare next iteration | 81 | // prepare next iteration |
| 77 | ReleaseNullObject(pixnNode); | 82 | ReleaseNullObject(pixnNode); |
| @@ -110,11 +115,13 @@ extern "C" HRESULT PackagesParseFromXml( | |||
| 110 | 115 | ||
| 111 | // @Id | 116 | // @Id |
| 112 | hr = XmlGetAttributeEx(pixnNode, L"Id", &pPackage->sczId); | 117 | hr = XmlGetAttributeEx(pixnNode, L"Id", &pPackage->sczId); |
| 113 | ExitOnFailure(hr, "Failed to get @Id."); | 118 | ExitOnRequiredXmlQueryFailure(hr, "Failed to get @Id."); |
| 114 | 119 | ||
| 115 | // @Cache | 120 | // @Cache |
| 116 | hr = XmlGetAttributeEx(pixnNode, L"Cache", &scz); | 121 | hr = XmlGetAttributeEx(pixnNode, L"Cache", &scz); |
| 117 | if (SUCCEEDED(hr)) | 122 | ExitOnOptionalXmlQueryFailure(hr, fFoundXml, "Failed to get @Cache."); |
| 123 | |||
| 124 | if (fFoundXml) | ||
| 118 | { | 125 | { |
| 119 | if (CSTR_EQUAL == ::CompareStringW(LOCALE_INVARIANT, 0, scz, -1, L"remove", -1)) | 126 | if (CSTR_EQUAL == ::CompareStringW(LOCALE_INVARIANT, 0, scz, -1, L"remove", -1)) |
| 120 | { | 127 | { |
| @@ -134,72 +141,62 @@ extern "C" HRESULT PackagesParseFromXml( | |||
| 134 | ExitOnRootFailure(hr, "Invalid cache type: %ls", scz); | 141 | ExitOnRootFailure(hr, "Invalid cache type: %ls", scz); |
| 135 | } | 142 | } |
| 136 | } | 143 | } |
| 137 | ExitOnFailure(hr, "Failed to get @Cache."); | ||
| 138 | 144 | ||
| 139 | // @CacheId | 145 | // @CacheId |
| 140 | hr = XmlGetAttributeEx(pixnNode, L"CacheId", &pPackage->sczCacheId); | 146 | hr = XmlGetAttributeEx(pixnNode, L"CacheId", &pPackage->sczCacheId); |
| 141 | ExitOnFailure(hr, "Failed to get @CacheId."); | 147 | ExitOnRequiredXmlQueryFailure(hr, "Failed to get @CacheId."); |
| 142 | 148 | ||
| 143 | // @Size | 149 | // @Size |
| 144 | hr = XmlGetAttributeUInt64(pixnNode, L"Size", &pPackage->qwSize); | 150 | hr = XmlGetAttributeUInt64(pixnNode, L"Size", &pPackage->qwSize); |
| 145 | ExitOnFailure(hr, "Failed to get @Size."); | 151 | ExitOnOptionalXmlQueryFailure(hr, fFoundXml, "Failed to get @Size."); |
| 146 | 152 | ||
| 147 | // @InstallSize | 153 | // @InstallSize |
| 148 | hr = XmlGetAttributeUInt64(pixnNode, L"InstallSize", &pPackage->qwInstallSize); | 154 | hr = XmlGetAttributeUInt64(pixnNode, L"InstallSize", &pPackage->qwInstallSize); |
| 149 | ExitOnFailure(hr, "Failed to get @InstallSize."); | 155 | ExitOnOptionalXmlQueryFailure(hr, fFoundXml, "Failed to get @InstallSize."); |
| 150 | 156 | ||
| 151 | // @PerMachine | 157 | // @PerMachine |
| 152 | hr = XmlGetYesNoAttribute(pixnNode, L"PerMachine", &pPackage->fPerMachine); | 158 | hr = XmlGetYesNoAttribute(pixnNode, L"PerMachine", &pPackage->fPerMachine); |
| 153 | ExitOnFailure(hr, "Failed to get @PerMachine."); | 159 | ExitOnRequiredXmlQueryFailure(hr, "Failed to get @PerMachine."); |
| 154 | 160 | ||
| 155 | // @Permanent | 161 | // @Permanent |
| 156 | hr = XmlGetYesNoAttribute(pixnNode, L"Permanent", &pPackage->fUninstallable); | 162 | hr = XmlGetYesNoAttribute(pixnNode, L"Permanent", &pPackage->fUninstallable); |
| 157 | ExitOnFailure(hr, "Failed to get @Permanent."); | 163 | ExitOnRequiredXmlQueryFailure(hr, "Failed to get @Permanent."); |
| 158 | pPackage->fUninstallable = !pPackage->fUninstallable; // TODO: change "Uninstallable" variable name to permanent, until then Uninstallable is the opposite of Permanent so fix the variable. | 164 | pPackage->fUninstallable = !pPackage->fUninstallable; // TODO: change "Uninstallable" variable name to permanent, until then Uninstallable is the opposite of Permanent so fix the variable. |
| 159 | pPackage->fCanAffectRegistration = pPackage->fUninstallable; | 165 | pPackage->fCanAffectRegistration = pPackage->fUninstallable; |
| 160 | 166 | ||
| 161 | // @Vital | 167 | // @Vital |
| 162 | hr = XmlGetYesNoAttribute(pixnNode, L"Vital", &pPackage->fVital); | 168 | hr = XmlGetYesNoAttribute(pixnNode, L"Vital", &pPackage->fVital); |
| 163 | ExitOnFailure(hr, "Failed to get @Vital."); | 169 | ExitOnRequiredXmlQueryFailure(hr, "Failed to get @Vital."); |
| 164 | 170 | ||
| 165 | // @LogPathVariable | 171 | // @LogPathVariable |
| 166 | hr = XmlGetAttributeEx(pixnNode, L"LogPathVariable", &pPackage->sczLogPathVariable); | 172 | hr = XmlGetAttributeEx(pixnNode, L"LogPathVariable", &pPackage->sczLogPathVariable); |
| 167 | if (E_NOTFOUND != hr) | 173 | ExitOnOptionalXmlQueryFailure(hr, fFoundXml, "Failed to get @LogPathVariable."); |
| 168 | { | ||
| 169 | ExitOnFailure(hr, "Failed to get @LogPathVariable."); | ||
| 170 | } | ||
| 171 | 174 | ||
| 172 | // @RollbackLogPathVariable | 175 | // @RollbackLogPathVariable |
| 173 | hr = XmlGetAttributeEx(pixnNode, L"RollbackLogPathVariable", &pPackage->sczRollbackLogPathVariable); | 176 | hr = XmlGetAttributeEx(pixnNode, L"RollbackLogPathVariable", &pPackage->sczRollbackLogPathVariable); |
| 174 | if (E_NOTFOUND != hr) | 177 | ExitOnOptionalXmlQueryFailure(hr, fFoundXml, "Failed to get @RollbackLogPathVariable."); |
| 175 | { | ||
| 176 | ExitOnFailure(hr, "Failed to get @RollbackLogPathVariable."); | ||
| 177 | } | ||
| 178 | 178 | ||
| 179 | // @InstallCondition | 179 | // @InstallCondition |
| 180 | hr = XmlGetAttributeEx(pixnNode, L"InstallCondition", &pPackage->sczInstallCondition); | 180 | hr = XmlGetAttributeEx(pixnNode, L"InstallCondition", &pPackage->sczInstallCondition); |
| 181 | if (E_NOTFOUND != hr) | 181 | ExitOnOptionalXmlQueryFailure(hr, fFoundXml, "Failed to get @InstallCondition."); |
| 182 | { | ||
| 183 | ExitOnFailure(hr, "Failed to get @InstallCondition."); | ||
| 184 | } | ||
| 185 | 182 | ||
| 186 | // @RollbackBoundaryForward | 183 | // @RollbackBoundaryForward |
| 187 | hr = XmlGetAttributeEx(pixnNode, L"RollbackBoundaryForward", &scz); | 184 | hr = XmlGetAttributeEx(pixnNode, L"RollbackBoundaryForward", &scz); |
| 188 | if (E_NOTFOUND != hr) | 185 | ExitOnOptionalXmlQueryFailure(hr, fFoundXml, "Failed to get @RollbackBoundaryForward."); |
| 189 | { | ||
| 190 | ExitOnFailure(hr, "Failed to get @RollbackBoundaryForward."); | ||
| 191 | 186 | ||
| 192 | hr = FindRollbackBoundaryById(pPackages, scz, &pPackage->pRollbackBoundaryForward); | 187 | if (fFoundXml) |
| 188 | { | ||
| 189 | hr = FindRollbackBoundaryById(pPackages, scz, &pPackage->pRollbackBoundaryForward); | ||
| 193 | ExitOnFailure(hr, "Failed to find forward transaction boundary: %ls", scz); | 190 | ExitOnFailure(hr, "Failed to find forward transaction boundary: %ls", scz); |
| 194 | } | 191 | } |
| 195 | 192 | ||
| 196 | // @RollbackBoundaryBackward | 193 | // @RollbackBoundaryBackward |
| 197 | hr = XmlGetAttributeEx(pixnNode, L"RollbackBoundaryBackward", &scz); | 194 | hr = XmlGetAttributeEx(pixnNode, L"RollbackBoundaryBackward", &scz); |
| 198 | if (E_NOTFOUND != hr) | 195 | ExitOnOptionalXmlQueryFailure(hr, fFoundXml, "Failed to get @RollbackBoundaryBackward."); |
| 199 | { | ||
| 200 | ExitOnFailure(hr, "Failed to get @RollbackBoundaryBackward."); | ||
| 201 | 196 | ||
| 202 | hr = FindRollbackBoundaryById(pPackages, scz, &pPackage->pRollbackBoundaryBackward); | 197 | if (fFoundXml) |
| 198 | { | ||
| 199 | hr = FindRollbackBoundaryById(pPackages, scz, &pPackage->pRollbackBoundaryBackward); | ||
| 203 | ExitOnFailure(hr, "Failed to find backward transaction boundary: %ls", scz); | 200 | ExitOnFailure(hr, "Failed to find backward transaction boundary: %ls", scz); |
| 204 | } | 201 | } |
| 205 | 202 | ||
| @@ -378,6 +375,7 @@ extern "C" void PackagesUninitialize( | |||
| 378 | { | 375 | { |
| 379 | ReleaseStr(pPackages->rgRollbackBoundaries[i].sczId); | 376 | ReleaseStr(pPackages->rgRollbackBoundaries[i].sczId); |
| 380 | ReleaseStr(pPackages->rgRollbackBoundaries[i].sczLogPath); | 377 | ReleaseStr(pPackages->rgRollbackBoundaries[i].sczLogPath); |
| 378 | ReleaseStr(pPackages->rgRollbackBoundaries[i].sczLogPathVariable); | ||
| 381 | } | 379 | } |
| 382 | MemFree(pPackages->rgRollbackBoundaries); | 380 | MemFree(pPackages->rgRollbackBoundaries); |
| 383 | } | 381 | } |
diff --git a/src/burn/engine/package.h b/src/burn/engine/package.h index 3d8233d1..f2a1c304 100644 --- a/src/burn/engine/package.h +++ b/src/burn/engine/package.h | |||
| @@ -195,6 +195,7 @@ typedef struct _BURN_ROLLBACK_BOUNDARY | |||
| 195 | BOOL fTransactionAuthored; | 195 | BOOL fTransactionAuthored; |
| 196 | BOOL fTransaction; | 196 | BOOL fTransaction; |
| 197 | BOOL fActiveTransaction; // only valid during Apply. | 197 | BOOL fActiveTransaction; // only valid during Apply. |
| 198 | LPWSTR sczLogPathVariable; | ||
| 198 | LPWSTR sczLogPath; | 199 | LPWSTR sczLogPath; |
| 199 | } BURN_ROLLBACK_BOUNDARY; | 200 | } BURN_ROLLBACK_BOUNDARY; |
| 200 | 201 | ||
diff --git a/src/burn/engine/plan.cpp b/src/burn/engine/plan.cpp index 85d958a6..58981352 100644 --- a/src/burn/engine/plan.cpp +++ b/src/burn/engine/plan.cpp | |||
| @@ -1709,8 +1709,8 @@ LExit: | |||
| 1709 | extern "C" HRESULT PlanRollbackBoundaryBegin( | 1709 | extern "C" HRESULT PlanRollbackBoundaryBegin( |
| 1710 | __in BURN_PLAN* pPlan, | 1710 | __in BURN_PLAN* pPlan, |
| 1711 | __in BURN_USER_EXPERIENCE* pUX, | 1711 | __in BURN_USER_EXPERIENCE* pUX, |
| 1712 | __in BURN_LOGGING* /*pLog*/, | 1712 | __in BURN_LOGGING* pLog, |
| 1713 | __in BURN_VARIABLES* /*pVariables*/, | 1713 | __in BURN_VARIABLES* pVariables, |
| 1714 | __in BURN_ROLLBACK_BOUNDARY* pRollbackBoundary | 1714 | __in BURN_ROLLBACK_BOUNDARY* pRollbackBoundary |
| 1715 | ) | 1715 | ) |
| 1716 | { | 1716 | { |
| @@ -1744,6 +1744,8 @@ extern "C" HRESULT PlanRollbackBoundaryBegin( | |||
| 1744 | } | 1744 | } |
| 1745 | else | 1745 | else |
| 1746 | { | 1746 | { |
| 1747 | LoggingSetTransactionVariable(pRollbackBoundary, NULL, pLog, pVariables); // ignore errors. | ||
| 1748 | |||
| 1747 | // Add begin MSI transaction to execute plan. | 1749 | // Add begin MSI transaction to execute plan. |
| 1748 | hr = PlanExecuteCheckpoint(pPlan); | 1750 | hr = PlanExecuteCheckpoint(pPlan); |
| 1749 | ExitOnFailure(hr, "Failed to append checkpoint before MSI transaction begin action."); | 1751 | ExitOnFailure(hr, "Failed to append checkpoint before MSI transaction begin action."); |
