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 | |
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')
-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."); |