From b7582318f6cb6e166f5ca22128caea2a97551a1f Mon Sep 17 00:00:00 2001 From: Nir Bar Date: Wed, 17 Mar 2021 14:45:03 -0500 Subject: Use wiutil to start/end msi transactions Release MSI transaction handles immediately contributes to #5386 --- src/engine/apply.cpp | 40 +++++++-------- src/engine/elevation.cpp | 111 +++++++++++++++++++++++++++++++++--------- src/engine/elevation.h | 6 +-- src/engine/msiengine.cpp | 32 ++++++------ src/engine/msiengine.h | 6 +-- src/engine/package.cpp | 27 ++++++++++ src/engine/package.h | 6 +++ src/engine/plan.cpp | 1 + src/engine/userexperience.cpp | 10 ---- src/engine/userexperience.h | 5 -- 10 files changed, 163 insertions(+), 81 deletions(-) diff --git a/src/engine/apply.cpp b/src/engine/apply.cpp index 3fbab61a..77080c76 100644 --- a/src/engine/apply.cpp +++ b/src/engine/apply.cpp @@ -821,16 +821,16 @@ extern "C" HRESULT ApplyExecute( break; } - // If inside a MSI transaction, roll it back. - if (pCheckpoint && pCheckpoint->pActiveRollbackBoundary && pCheckpoint->pActiveRollbackBoundary->fActiveTransaction) - { - hrRollback = ExecuteMsiRollbackTransaction(pEngineState, pCheckpoint->pActiveRollbackBoundary, &context); - IgnoreRollbackError(hrRollback, "Failed rolling back transaction"); - } - - // The action failed, roll back to previous rollback boundary. if (pCheckpoint) { + // If inside a MSI transaction, roll it back. + if (pCheckpoint->pActiveRollbackBoundary && pCheckpoint->pActiveRollbackBoundary->fActiveTransaction) + { + hrRollback = ExecuteMsiRollbackTransaction(pEngineState, pCheckpoint->pActiveRollbackBoundary, &context); + IgnoreRollbackError(hrRollback, "Failed rolling back transaction"); + } + + // The action failed, roll back to previous rollback boundary. hrRollback = DoRollbackActions(pEngineState, &context, pCheckpoint->dwId, pRestart); IgnoreRollbackError(hrRollback, "Failed rollback actions"); } @@ -2316,12 +2316,12 @@ static HRESULT ExecuteMsiBeginTransaction( if (pEngineState->plan.fPerMachine) { - hr = ElevationMsiBeginTransaction(pEngineState->companionConnection.hPipe, pRollbackBoundary->sczId); + hr = ElevationMsiBeginTransaction(pEngineState->companionConnection.hPipe, pRollbackBoundary); ExitOnFailure(hr, "Failed to begin an elevated MSI transaction."); } else { - hr = MsiEngineBeginTransaction(pRollbackBoundary->sczId); + hr = MsiEngineBeginTransaction(pRollbackBoundary); } if (SUCCEEDED(hr)) @@ -2347,25 +2347,25 @@ static HRESULT ExecuteMsiCommitTransaction( ) { HRESULT hr = S_OK; - BOOL fBeginCalled = FALSE; + BOOL fCommitBeginCalled = FALSE; if (!pRollbackBoundary->fActiveTransaction) { ExitFunction1(hr = E_INVALIDSTATE); } - fBeginCalled = TRUE; + fCommitBeginCalled = TRUE; hr = UserExperienceOnCommitMsiTransactionBegin(&pEngineState->userExperience, pRollbackBoundary->sczId); ExitOnRootFailure(hr, "BA aborted execute commit MSI transaction."); if (pEngineState->plan.fPerMachine) { - hr = ElevationMsiCommitTransaction(pEngineState->companionConnection.hPipe, pRollbackBoundary->sczId); + hr = ElevationMsiCommitTransaction(pEngineState->companionConnection.hPipe, pRollbackBoundary); ExitOnFailure(hr, "Failed to commit an elevated MSI transaction."); } else { - hr = MsiEngineCommitTransaction(pRollbackBoundary->sczId); + hr = MsiEngineCommitTransaction(pRollbackBoundary); } if (SUCCEEDED(hr)) @@ -2376,7 +2376,7 @@ static HRESULT ExecuteMsiCommitTransaction( } LExit: - if (fBeginCalled) + if (fCommitBeginCalled) { UserExperienceOnCommitMsiTransactionComplete(&pEngineState->userExperience, pRollbackBoundary->sczId, hr); } @@ -2391,24 +2391,24 @@ static HRESULT ExecuteMsiRollbackTransaction( ) { HRESULT hr = S_OK; - BOOL fBeginCalled = FALSE; + BOOL fRollbackBeginCalled = FALSE; if (!pRollbackBoundary->fActiveTransaction) { ExitFunction(); } - fBeginCalled = TRUE; + fRollbackBeginCalled = TRUE; UserExperienceOnRollbackMsiTransactionBegin(&pEngineState->userExperience, pRollbackBoundary->sczId); if (pEngineState->plan.fPerMachine) { - hr = ElevationMsiRollbackTransaction(pEngineState->companionConnection.hPipe, pRollbackBoundary->sczId); + hr = ElevationMsiRollbackTransaction(pEngineState->companionConnection.hPipe, pRollbackBoundary); ExitOnFailure(hr, "Failed to rollback an elevated MSI transaction."); } else { - hr = MsiEngineRollbackTransaction(pRollbackBoundary->sczId); + hr = MsiEngineRollbackTransaction(pRollbackBoundary); } LExit: @@ -2416,7 +2416,7 @@ LExit: ResetTransactionRegistrationState(pEngineState, FALSE); - if (fBeginCalled) + if (fRollbackBeginCalled) { UserExperienceOnRollbackMsiTransactionComplete(&pEngineState->userExperience, pRollbackBoundary->sczId, hr); } diff --git a/src/engine/elevation.cpp b/src/engine/elevation.cpp index 7c5dae4b..1737bf5b 100644 --- a/src/engine/elevation.cpp +++ b/src/engine/elevation.cpp @@ -246,14 +246,17 @@ static HRESULT OnLaunchApprovedExe( __in DWORD cbData ); static HRESULT OnMsiBeginTransaction( + __in BURN_PACKAGES* pPackages, __in BYTE* pbData, __in DWORD cbData ); static HRESULT OnMsiCommitTransaction( + __in BURN_PACKAGES* pPackages, __in BYTE* pbData, __in DWORD cbData ); static HRESULT OnMsiRollbackTransaction( + __in BURN_PACKAGES* pPackages, __in BYTE* pbData, __in DWORD cbData ); @@ -763,7 +766,7 @@ LExit: extern "C" HRESULT ElevationMsiBeginTransaction( __in HANDLE hPipe, - __in LPCWSTR wzName + __in BURN_ROLLBACK_BOUNDARY* pRollbackBoundary ) { HRESULT hr = S_OK; @@ -772,9 +775,12 @@ extern "C" HRESULT ElevationMsiBeginTransaction( DWORD dwResult = ERROR_SUCCESS; // serialize message data - hr = BuffWriteString(&pbData, &cbData, wzName); + hr = BuffWriteString(&pbData, &cbData, pRollbackBoundary->sczId); ExitOnFailure(hr, "Failed to write transaction name to message buffer."); + hr = BuffWriteString(&pbData, &cbData, pRollbackBoundary->sczLogPath); + ExitOnFailure(hr, "Failed to write transaction log path to message buffer."); + hr = PipeSendMessage(hPipe, BURN_ELEVATION_MESSAGE_TYPE_BEGIN_MSI_TRANSACTION, pbData, cbData, NULL, NULL, &dwResult); ExitOnFailure(hr, "Failed to send BURN_ELEVATION_MESSAGE_TYPE_BEGIN_MSI_TRANSACTION message to per-machine process."); @@ -788,7 +794,7 @@ LExit: extern "C" HRESULT ElevationMsiCommitTransaction( __in HANDLE hPipe, - __in LPCWSTR wzName + __in BURN_ROLLBACK_BOUNDARY* pRollbackBoundary ) { HRESULT hr = S_OK; @@ -797,9 +803,12 @@ extern "C" HRESULT ElevationMsiCommitTransaction( DWORD dwResult = ERROR_SUCCESS; // serialize message data - hr = BuffWriteString(&pbData, &cbData, wzName); + hr = BuffWriteString(&pbData, &cbData, pRollbackBoundary->sczId); ExitOnFailure(hr, "Failed to write transaction name to message buffer."); + hr = BuffWriteString(&pbData, &cbData, pRollbackBoundary->sczLogPath); + ExitOnFailure(hr, "Failed to write transaction log path to message buffer."); + hr = PipeSendMessage(hPipe, BURN_ELEVATION_MESSAGE_TYPE_COMMIT_MSI_TRANSACTION, pbData, cbData, NULL, NULL, &dwResult); ExitOnFailure(hr, "Failed to send BURN_ELEVATION_MESSAGE_TYPE_COMMIT_MSI_TRANSACTION message to per-machine process."); @@ -811,7 +820,7 @@ LExit: extern "C" HRESULT ElevationMsiRollbackTransaction( __in HANDLE hPipe, - __in LPCWSTR wzName + __in BURN_ROLLBACK_BOUNDARY* pRollbackBoundary ) { HRESULT hr = S_OK; @@ -820,9 +829,12 @@ extern "C" HRESULT ElevationMsiRollbackTransaction( DWORD dwResult = ERROR_SUCCESS; // serialize message data - hr = BuffWriteString(&pbData, &cbData, wzName); + hr = BuffWriteString(&pbData, &cbData, pRollbackBoundary->sczId); ExitOnFailure(hr, "Failed to write transaction name to message buffer."); + hr = BuffWriteString(&pbData, &cbData, pRollbackBoundary->sczLogPath); + ExitOnFailure(hr, "Failed to write transaction log path to message buffer."); + hr = PipeSendMessage(hPipe, BURN_ELEVATION_MESSAGE_TYPE_ROLLBACK_MSI_TRANSACTION, pbData, cbData, NULL, NULL, &dwResult); ExitOnFailure(hr, "Failed to send BURN_ELEVATION_MESSAGE_TYPE_ROLLBACK_MSI_TRANSACTION message to per-machine process."); @@ -1610,15 +1622,15 @@ static HRESULT ProcessElevatedChildMessage( switch (pMsg->dwMessage) { case BURN_ELEVATION_MESSAGE_TYPE_BEGIN_MSI_TRANSACTION: - hrResult = OnMsiBeginTransaction((BYTE*)pMsg->pvData, pMsg->cbData); + hrResult = OnMsiBeginTransaction(pContext->pPackages, (BYTE*)pMsg->pvData, pMsg->cbData); break; case BURN_ELEVATION_MESSAGE_TYPE_COMMIT_MSI_TRANSACTION: - hrResult = OnMsiCommitTransaction((BYTE*)pMsg->pvData, pMsg->cbData); + hrResult = OnMsiCommitTransaction(pContext->pPackages, (BYTE*)pMsg->pvData, pMsg->cbData); break; case BURN_ELEVATION_MESSAGE_TYPE_ROLLBACK_MSI_TRANSACTION: - hrResult = OnMsiRollbackTransaction((BYTE*)pMsg->pvData, pMsg->cbData); + hrResult = OnMsiRollbackTransaction(pContext->pPackages, (BYTE*)pMsg->pvData, pMsg->cbData); break; case BURN_ELEVATION_MESSAGE_TYPE_APPLY_INITIALIZE: @@ -2824,64 +2836,115 @@ LExit: } static HRESULT OnMsiBeginTransaction( + __in BURN_PACKAGES* pPackages, __in BYTE* pbData, __in DWORD cbData ) { HRESULT hr = S_OK; SIZE_T iData = 0; - LPWSTR sczName = NULL; + LPWSTR sczId = NULL; + LPWSTR sczLogPath = NULL; + BURN_ROLLBACK_BOUNDARY* pRollbackBoundary = NULL; // Deserialize message data. - hr = BuffReadString(pbData, cbData, &iData, &sczName); - ExitOnFailure(hr, "Failed to read transaction name."); + hr = BuffReadString(pbData, cbData, &iData, &sczId); + ExitOnFailure(hr, "Failed to read rollback boundary id."); - hr = MsiEngineBeginTransaction(sczName); + hr = BuffReadString(pbData, cbData, &iData, &sczLogPath); + ExitOnFailure(hr, "Failed to read transaction log path."); + + PackageFindRollbackBoundaryById(pPackages, sczId, &pRollbackBoundary); + ExitOnFailure(hr, "Failed to find rollback boundary: %ls", sczId); + + pRollbackBoundary->sczLogPath = sczLogPath; + + hr = MsiEngineBeginTransaction(pRollbackBoundary); LExit: - ReleaseStr(sczName); + ReleaseStr(sczId); + ReleaseStr(sczLogPath); + + if (pRollbackBoundary) + { + pRollbackBoundary->sczLogPath = NULL; + } return hr; } static HRESULT OnMsiCommitTransaction( + __in BURN_PACKAGES* pPackages, __in BYTE* pbData, __in DWORD cbData ) { HRESULT hr = S_OK; SIZE_T iData = 0; - LPWSTR sczName = NULL; + LPWSTR sczId = NULL; + LPWSTR sczLogPath = NULL; + BURN_ROLLBACK_BOUNDARY* pRollbackBoundary = NULL; // Deserialize message data. - hr = BuffReadString(pbData, cbData, &iData, &sczName); - ExitOnFailure(hr, "Failed to read transaction name."); + hr = BuffReadString(pbData, cbData, &iData, &sczId); + ExitOnFailure(hr, "Failed to read rollback boundary id."); - hr = MsiEngineCommitTransaction(sczName); + hr = BuffReadString(pbData, cbData, &iData, &sczLogPath); + ExitOnFailure(hr, "Failed to read transaction log path."); + + PackageFindRollbackBoundaryById(pPackages, sczId, &pRollbackBoundary); + ExitOnFailure(hr, "Failed to find rollback boundary: %ls", sczId); + + pRollbackBoundary->sczLogPath = sczLogPath; + + hr = MsiEngineCommitTransaction(pRollbackBoundary); LExit: - ReleaseStr(sczName); + ReleaseStr(sczId); + ReleaseStr(sczLogPath); + + if (pRollbackBoundary) + { + pRollbackBoundary->sczLogPath = NULL; + } return hr; } static HRESULT OnMsiRollbackTransaction( + __in BURN_PACKAGES* pPackages, __in BYTE* pbData, __in DWORD cbData ) { HRESULT hr = S_OK; SIZE_T iData = 0; - LPWSTR sczName = NULL; + LPWSTR sczId = NULL; + LPWSTR sczLogPath = NULL; + BURN_ROLLBACK_BOUNDARY* pRollbackBoundary = NULL; // Deserialize message data. - hr = BuffReadString(pbData, cbData, &iData, &sczName); - ExitOnFailure(hr, "Failed to read transaction name."); + hr = BuffReadString(pbData, cbData, &iData, &sczId); + ExitOnFailure(hr, "Failed to read rollback boundary id."); - hr = MsiEngineRollbackTransaction(sczName); + hr = BuffReadString(pbData, cbData, &iData, &sczLogPath); + ExitOnFailure(hr, "Failed to read transaction log path."); + + PackageFindRollbackBoundaryById(pPackages, sczId, &pRollbackBoundary); + ExitOnFailure(hr, "Failed to find rollback boundary: %ls", sczId); + + pRollbackBoundary->sczLogPath = sczLogPath; + + hr = MsiEngineRollbackTransaction(pRollbackBoundary); LExit: - ReleaseStr(sczName); + ReleaseStr(sczId); + ReleaseStr(sczLogPath); + + if (pRollbackBoundary) + { + pRollbackBoundary->sczLogPath = NULL; + } return hr; } diff --git a/src/engine/elevation.h b/src/engine/elevation.h index e254dea5..9ce8cef9 100644 --- a/src/engine/elevation.h +++ b/src/engine/elevation.h @@ -156,15 +156,15 @@ HRESULT ElevationChildResumeAutomaticUpdates(); HRESULT ElevationMsiBeginTransaction( __in HANDLE hPipe, - __in LPCWSTR wzName + __in BURN_ROLLBACK_BOUNDARY* pRollbackBoundary ); HRESULT ElevationMsiCommitTransaction( __in HANDLE hPipe, - __in LPCWSTR wzName + __in BURN_ROLLBACK_BOUNDARY* pRollbackBoundary ); HRESULT ElevationMsiRollbackTransaction( __in HANDLE hPipe, - __in LPCWSTR wzName + __in BURN_ROLLBACK_BOUNDARY* pRollbackBoundary ); #ifdef __cplusplus diff --git a/src/engine/msiengine.cpp b/src/engine/msiengine.cpp index f0aa784e..6c5b760b 100644 --- a/src/engine/msiengine.cpp +++ b/src/engine/msiengine.cpp @@ -1016,40 +1016,41 @@ LExit: } extern "C" HRESULT MsiEngineBeginTransaction( - __in LPCWSTR wzName + __in BURN_ROLLBACK_BOUNDARY* pRollbackBoundary ) { HRESULT hr = S_OK; - UINT uResult = ERROR_SUCCESS; MSIHANDLE hTransactionHandle = NULL; HANDLE hChangeOfOwnerEvent = NULL; - LogId(REPORT_STANDARD, MSG_MSI_TRANSACTION_BEGIN, wzName); + LogId(REPORT_STANDARD, MSG_MSI_TRANSACTION_BEGIN, pRollbackBoundary->sczId); - uResult = ::MsiBeginTransaction(wzName, 0, &hTransactionHandle, &hChangeOfOwnerEvent); + hr = WiuBeginTransaction(pRollbackBoundary->sczId, 0, &hTransactionHandle, &hChangeOfOwnerEvent, WIU_LOG_DEFAULT | INSTALLLOGMODE_VERBOSE, pRollbackBoundary->sczLogPath); - if (ERROR_ROLLBACK_DISABLED == uResult) + if (HRESULT_FROM_WIN32(ERROR_ROLLBACK_DISABLED) == hr) { LogId(REPORT_ERROR, MSG_MSI_TRANSACTIONS_DISABLED); } - ExitOnWin32Error(uResult, hr, "Failed to begin an MSI transaction"); + ExitOnFailure(hr, "Failed to begin an MSI transaction"); LExit: + ReleaseMsi(hTransactionHandle); + ReleaseHandle(hChangeOfOwnerEvent); + return hr; } extern "C" HRESULT MsiEngineCommitTransaction( - __in LPCWSTR wzName + __in BURN_ROLLBACK_BOUNDARY* pRollbackBoundary ) { HRESULT hr = S_OK; - UINT uResult = ERROR_SUCCESS; - LogId(REPORT_STANDARD, MSG_MSI_TRANSACTION_COMMIT, wzName); + LogId(REPORT_STANDARD, MSG_MSI_TRANSACTION_COMMIT, pRollbackBoundary->sczId); - uResult = ::MsiEndTransaction(MSITRANSACTIONSTATE_COMMIT); - ExitOnWin32Error(uResult, hr, "Failed to commit the MSI transaction"); + hr = WiuEndTransaction(MSITRANSACTIONSTATE_COMMIT, WIU_LOG_DEFAULT | INSTALLLOGMODE_VERBOSE, pRollbackBoundary->sczLogPath); + ExitOnFailure(hr, "Failed to commit the MSI transaction"); LExit: @@ -1057,16 +1058,15 @@ LExit: } extern "C" HRESULT MsiEngineRollbackTransaction( - __in LPCWSTR wzName + __in BURN_ROLLBACK_BOUNDARY* pRollbackBoundary ) { HRESULT hr = S_OK; - UINT uResult = ERROR_SUCCESS; - LogId(REPORT_WARNING, MSG_MSI_TRANSACTION_ROLLBACK, wzName); + LogId(REPORT_WARNING, MSG_MSI_TRANSACTION_ROLLBACK, pRollbackBoundary->sczId); - uResult = ::MsiEndTransaction(MSITRANSACTIONSTATE_ROLLBACK); - ExitOnWin32Error(uResult, hr, "Failed to rollback the MSI transaction"); + hr = WiuEndTransaction(MSITRANSACTIONSTATE_ROLLBACK, WIU_LOG_DEFAULT | INSTALLLOGMODE_VERBOSE, pRollbackBoundary->sczLogPath); + ExitOnFailure(hr, "Failed to rollback the MSI transaction"); LExit: diff --git a/src/engine/msiengine.h b/src/engine/msiengine.h index e2dc5e82..99f97413 100644 --- a/src/engine/msiengine.h +++ b/src/engine/msiengine.h @@ -54,13 +54,13 @@ HRESULT MsiEnginePlanAddPackage( __in BOOL fPlanPackageCacheRollback ); HRESULT MsiEngineBeginTransaction( - __in LPCWSTR wzName + __in BURN_ROLLBACK_BOUNDARY* pRollbackBoundary ); HRESULT MsiEngineCommitTransaction( - __in LPCWSTR wzName + __in BURN_ROLLBACK_BOUNDARY* pRollbackBoundary ); HRESULT MsiEngineRollbackTransaction( - __in LPCWSTR wzName + __in BURN_ROLLBACK_BOUNDARY* pRollbackBoundary ); HRESULT MsiEngineExecutePackage( __in_opt HWND hwndParent, diff --git a/src/engine/package.cpp b/src/engine/package.cpp index 115866f3..124b356b 100644 --- a/src/engine/package.cpp +++ b/src/engine/package.cpp @@ -377,6 +377,7 @@ extern "C" void PackagesUninitialize( for (DWORD i = 0; i < pPackages->cRollbackBoundaries; ++i) { ReleaseStr(pPackages->rgRollbackBoundaries[i].sczId); + ReleaseStr(pPackages->rgRollbackBoundaries[i].sczLogPath); } MemFree(pPackages->rgRollbackBoundaries); } @@ -511,6 +512,32 @@ LExit: return hr; } +extern "C" HRESULT PackageFindRollbackBoundaryById( + __in BURN_PACKAGES* pPackages, + __in_z LPCWSTR wzId, + __out BURN_ROLLBACK_BOUNDARY** ppRollbackBoundary + ) +{ + HRESULT hr = S_OK; + BURN_ROLLBACK_BOUNDARY* pRollbackBoundary = NULL; + + for (DWORD i = 0; i < pPackages->cRollbackBoundaries; ++i) + { + pRollbackBoundary = &pPackages->rgRollbackBoundaries[i]; + + if (CSTR_EQUAL == ::CompareStringW(LOCALE_INVARIANT, 0, pRollbackBoundary->sczId, -1, wzId, -1)) + { + *ppRollbackBoundary = pRollbackBoundary; + ExitFunction1(hr = S_OK); + } + } + + hr = E_NOTFOUND; + +LExit: + return hr; +} + // internal function declarations diff --git a/src/engine/package.h b/src/engine/package.h index 3a95852e..42f1febe 100644 --- a/src/engine/package.h +++ b/src/engine/package.h @@ -214,6 +214,7 @@ typedef struct _BURN_ROLLBACK_BOUNDARY BOOL fVital; BOOL fTransaction; BOOL fActiveTransaction; // only valid during Apply. + LPWSTR sczLogPath; } BURN_ROLLBACK_BOUNDARY; typedef struct _BURN_PATCH_TARGETCODE @@ -386,6 +387,11 @@ HRESULT PackageGetProperty( __in_z LPCWSTR wzProperty, __out_z_opt LPWSTR* psczValue ); +HRESULT PackageFindRollbackBoundaryById( + __in BURN_PACKAGES* pPackages, + __in_z LPCWSTR wzId, + __out BURN_ROLLBACK_BOUNDARY** ppRollbackBoundary + ); #if defined(__cplusplus) diff --git a/src/engine/plan.cpp b/src/engine/plan.cpp index a4b8d0c1..65da4ab3 100644 --- a/src/engine/plan.cpp +++ b/src/engine/plan.cpp @@ -1946,6 +1946,7 @@ static void ResetPlannedRollbackBoundaryState( ) { pRollbackBoundary->fActiveTransaction = FALSE; + ReleaseNullStr(pRollbackBoundary->sczLogPath); } static HRESULT GetActionDefaultRequestState( diff --git a/src/engine/userexperience.cpp b/src/engine/userexperience.cpp index ad1529ea..5a225651 100644 --- a/src/engine/userexperience.cpp +++ b/src/engine/userexperience.cpp @@ -2117,16 +2117,6 @@ extern "C" int UserExperienceCheckExecuteResult( return nResult; } -extern "C" HRESULT UserExperienceInterpretResult( - __in BURN_USER_EXPERIENCE* /*pUserExperience*/, - __in DWORD dwAllowedResults, - __in int nResult - ) -{ - int nFilteredResult = FilterResult(dwAllowedResults, nResult); - return IDOK == nFilteredResult || IDNOACTION == nFilteredResult ? S_OK : IDCANCEL == nFilteredResult || IDABORT == nFilteredResult ? HRESULT_FROM_WIN32(ERROR_INSTALL_USEREXIT) : HRESULT_FROM_WIN32(ERROR_INSTALL_FAILURE); -} - extern "C" HRESULT UserExperienceInterpretExecuteResult( __in BURN_USER_EXPERIENCE* pUserExperience, __in BOOL fRollback, diff --git a/src/engine/userexperience.h b/src/engine/userexperience.h index bac79e33..cef9d769 100644 --- a/src/engine/userexperience.h +++ b/src/engine/userexperience.h @@ -469,11 +469,6 @@ BAAPI UserExperienceOnUnregisterComplete( __in BURN_USER_EXPERIENCE* pUserExperience, __in HRESULT hrStatus ); -HRESULT UserExperienceInterpretResult( - __in BURN_USER_EXPERIENCE* pUserExperience, - __in DWORD dwAllowedResults, - __in int nResult - ); int UserExperienceCheckExecuteResult( __in BURN_USER_EXPERIENCE* pUserExperience, __in BOOL fRollback, -- cgit v1.2.3-55-g6feb