From 643293e48d176ff78282670512f45b4cf889b0a5 Mon Sep 17 00:00:00 2001 From: Sean Hall Date: Tue, 17 Nov 2020 14:11:30 -0600 Subject: Allow E_IMPL from BA/bext and check all cbSizes from BA/bext. --- src/engine/EngineForApplication.cpp | 216 +++++++++++++++++++++++------------- src/engine/EngineForExtension.cpp | 97 ++++++++++------ src/engine/burnextension.cpp | 24 +++- src/engine/engine.vcxproj | 2 + src/engine/externalengine.cpp | 30 +++++ src/engine/externalengine.h | 22 ++++ src/engine/precomp.h | 1 + src/engine/userexperience.cpp | 159 +++++++++++++++----------- 8 files changed, 372 insertions(+), 179 deletions(-) create mode 100644 src/engine/externalengine.cpp create mode 100644 src/engine/externalengine.h diff --git a/src/engine/EngineForApplication.cpp b/src/engine/EngineForApplication.cpp index 87a0782c..e3ce7670 100644 --- a/src/engine/EngineForApplication.cpp +++ b/src/engine/EngineForApplication.cpp @@ -5,31 +5,36 @@ static HRESULT CopyStringToBA( __in LPWSTR wzValue, - __in LPWSTR wzBuffer, + __in_opt LPWSTR wzBuffer, __inout DWORD* pcchBuffer ); static HRESULT BAEngineGetPackageCount( __in BOOTSTRAPPER_ENGINE_CONTEXT* pContext, - __in BAENGINE_GETPACKAGECOUNT_ARGS* /*pArgs*/, - __in BAENGINE_GETPACKAGECOUNT_RESULTS* pResults + __in const LPVOID pvArgs, + __inout LPVOID pvResults ) { HRESULT hr = S_OK; + ValidateMessageArgs(hr, pvArgs, BAENGINE_GETPACKAGECOUNT_ARGS, pArgs); + ValidateMessageResults(hr, pvResults, BAENGINE_GETPACKAGECOUNT_RESULTS, pResults); DWORD* pcPackages = &pResults->cPackages; *pcPackages = pContext->pEngineState->packages.cPackages; +LExit: return hr; } static HRESULT BAEngineGetVariableNumeric( __in BOOTSTRAPPER_ENGINE_CONTEXT* pContext, - __in BAENGINE_GETVARIABLENUMERIC_ARGS* pArgs, - __in BAENGINE_GETVARIABLENUMERIC_RESULTS* pResults + __in const LPVOID pvArgs, + __inout LPVOID pvResults ) { HRESULT hr = S_OK; + ValidateMessageArgs(hr, pvArgs, BAENGINE_GETVARIABLENUMERIC_ARGS, pArgs); + ValidateMessageResults(hr, pvResults, BAENGINE_GETVARIABLENUMERIC_RESULTS, pResults); LPCWSTR wzVariable = pArgs->wzVariable; LONGLONG* pllValue = &pResults->llValue; @@ -42,17 +47,20 @@ static HRESULT BAEngineGetVariableNumeric( hr = E_INVALIDARG; } +LExit: return hr; } static HRESULT BAEngineGetVariableString( __in BOOTSTRAPPER_ENGINE_CONTEXT* pContext, - __in BAENGINE_GETVARIABLESTRING_ARGS* pArgs, - __in BAENGINE_GETVARIABLESTRING_RESULTS* pResults + __in const LPVOID pvArgs, + __inout LPVOID pvResults ) { HRESULT hr = S_OK; LPWSTR sczValue = NULL; + ValidateMessageArgs(hr, pvArgs, BAENGINE_GETVARIABLESTRING_ARGS, pArgs); + ValidateMessageResults(hr, pvResults, BAENGINE_GETVARIABLESTRING_RESULTS, pResults); LPCWSTR wzVariable = pArgs->wzVariable; LPWSTR wzValue = pResults->wzValue; DWORD* pcchValue = &pResults->cchValue; @@ -70,18 +78,21 @@ static HRESULT BAEngineGetVariableString( hr = E_INVALIDARG; } +LExit: StrSecureZeroFreeString(sczValue); return hr; } static HRESULT BAEngineGetVariableVersion( __in BOOTSTRAPPER_ENGINE_CONTEXT* pContext, - __in BAENGINE_GETVARIABLEVERSION_ARGS* pArgs, - __in BAENGINE_GETVARIABLEVERSION_RESULTS* pResults + __in const LPVOID pvArgs, + __inout LPVOID pvResults ) { HRESULT hr = S_OK; VERUTIL_VERSION* pVersion = NULL; + ValidateMessageArgs(hr, pvArgs, BAENGINE_GETVARIABLEVERSION_ARGS, pArgs); + ValidateMessageResults(hr, pvResults, BAENGINE_GETVARIABLEVERSION_RESULTS, pResults); LPCWSTR wzVariable = pArgs->wzVariable; LPWSTR wzValue = pResults->wzValue; DWORD* pcchValue = &pResults->cchValue; @@ -99,6 +110,7 @@ static HRESULT BAEngineGetVariableVersion( hr = E_INVALIDARG; } +LExit: ReleaseVerutilVersion(pVersion); return hr; @@ -106,12 +118,14 @@ static HRESULT BAEngineGetVariableVersion( static HRESULT BAEngineFormatString( __in BOOTSTRAPPER_ENGINE_CONTEXT* pContext, - __in BAENGINE_FORMATSTRING_ARGS* pArgs, - __in BAENGINE_FORMATSTRING_RESULTS* pResults + __in const LPVOID pvArgs, + __inout LPVOID pvResults ) { HRESULT hr = S_OK; LPWSTR sczValue = NULL; + ValidateMessageArgs(hr, pvArgs, BAENGINE_FORMATSTRING_ARGS, pArgs); + ValidateMessageResults(hr, pvResults, BAENGINE_FORMATSTRING_RESULTS, pResults); LPCWSTR wzIn = pArgs->wzIn; LPWSTR wzOut = pResults->wzOut; DWORD* pcchOut = &pResults->cchOut; @@ -129,18 +143,21 @@ static HRESULT BAEngineFormatString( hr = E_INVALIDARG; } +LExit: StrSecureZeroFreeString(sczValue); return hr; } static HRESULT BAEngineEscapeString( __in BOOTSTRAPPER_ENGINE_CONTEXT* /*pContext*/, - __in BAENGINE_ESCAPESTRING_ARGS* pArgs, - __in BAENGINE_ESCAPESTRING_RESULTS* pResults + __in const LPVOID pvArgs, + __inout LPVOID pvResults ) { HRESULT hr = S_OK; LPWSTR sczValue = NULL; + ValidateMessageArgs(hr, pvArgs, BAENGINE_ESCAPESTRING_ARGS, pArgs); + ValidateMessageResults(hr, pvResults, BAENGINE_ESCAPESTRING_RESULTS, pResults); LPCWSTR wzIn = pArgs->wzIn; LPWSTR wzOut = pResults->wzOut; DWORD* pcchOut = &pResults->cchOut; @@ -158,17 +175,20 @@ static HRESULT BAEngineEscapeString( hr = E_INVALIDARG; } +LExit: StrSecureZeroFreeString(sczValue); return hr; } static HRESULT BAEngineEvaluateCondition( __in BOOTSTRAPPER_ENGINE_CONTEXT* pContext, - __in BAENGINE_EVALUATECONDITION_ARGS* pArgs, - __in BAENGINE_EVALUATECONDITION_RESULTS* pResults + __in const LPVOID pvArgs, + __inout LPVOID pvResults ) { HRESULT hr = S_OK; + ValidateMessageArgs(hr, pvArgs, BAENGINE_EVALUATECONDITION_ARGS, pArgs); + ValidateMessageResults(hr, pvResults, BAENGINE_EVALUATECONDITION_RESULTS, pResults); LPCWSTR wzCondition = pArgs->wzCondition; BOOL* pf = &pResults->f; @@ -181,16 +201,19 @@ static HRESULT BAEngineEvaluateCondition( hr = E_INVALIDARG; } +LExit: return hr; } static HRESULT BAEngineLog( __in BOOTSTRAPPER_ENGINE_CONTEXT* /*pContext*/, - __in BAENGINE_LOG_ARGS* pArgs, - __in BAENGINE_LOG_RESULTS* /*pResults*/ + __in const LPVOID pvArgs, + __inout LPVOID pvResults ) { HRESULT hr = S_OK; + ValidateMessageArgs(hr, pvArgs, BAENGINE_LOG_ARGS, pArgs); + ValidateMessageResults(hr, pvResults, BAENGINE_LOG_RESULTS, pResults); REPORT_LEVEL rl = REPORT_NONE; BOOTSTRAPPER_LOG_LEVEL level = pArgs->level; LPCWSTR wzMessage = pArgs->wzMessage; @@ -226,14 +249,16 @@ LExit: static HRESULT BAEngineSendEmbeddedError( __in BOOTSTRAPPER_ENGINE_CONTEXT* pContext, - __in BAENGINE_SENDEMBEDDEDERROR_ARGS* pArgs, - __in BAENGINE_SENDEMBEDDEDERROR_RESULTS* pResults + __in const LPVOID pvArgs, + __inout LPVOID pvResults ) { HRESULT hr = S_OK; BYTE* pbData = NULL; DWORD cbData = 0; DWORD dwResult = 0; + ValidateMessageArgs(hr, pvArgs, BAENGINE_SENDEMBEDDEDERROR_ARGS, pArgs); + ValidateMessageResults(hr, pvResults, BAENGINE_SENDEMBEDDEDERROR_RESULTS, pResults); DWORD dwErrorCode = pArgs->dwErrorCode; LPCWSTR wzMessage = pArgs->wzMessage; DWORD dwUIHint = pArgs->dwUIHint; @@ -266,14 +291,16 @@ LExit: static HRESULT BAEngineSendEmbeddedProgress( __in BOOTSTRAPPER_ENGINE_CONTEXT* pContext, - __in BAENGINE_SENDEMBEDDEDPROGRESS_ARGS* pArgs, - __in BAENGINE_SENDEMBEDDEDPROGRESS_RESULTS* pResults + __in const LPVOID pvArgs, + __inout LPVOID pvResults ) { HRESULT hr = S_OK; BYTE* pbData = NULL; DWORD cbData = 0; DWORD dwResult = 0; + ValidateMessageArgs(hr, pvArgs, BAENGINE_SENDEMBEDDEDPROGRESS_ARGS, pArgs); + ValidateMessageResults(hr, pvResults, BAENGINE_SENDEMBEDDEDPROGRESS_RESULTS, pResults); DWORD dwProgressPercentage = pArgs->dwProgressPercentage; DWORD dwOverallProgressPercentage = pArgs->dwOverallProgressPercentage; int* pnResult = &pResults->nResult; @@ -302,8 +329,8 @@ LExit: static HRESULT BAEngineSetUpdate( __in BOOTSTRAPPER_ENGINE_CONTEXT* pContext, - __in const BAENGINE_SETUPDATE_ARGS* pArgs, - __in BAENGINE_SETUPDATE_RESULTS* /*pResults*/ + __in const LPVOID pvArgs, + __inout LPVOID pvResults ) { HRESULT hr = S_OK; @@ -313,6 +340,8 @@ static HRESULT BAEngineSetUpdate( UUID guid = { }; WCHAR wzGuid[39]; RPC_STATUS rs = RPC_S_OK; + ValidateMessageArgs(hr, pvArgs, BAENGINE_SETUPDATE_ARGS, pArgs); + ValidateMessageResults(hr, pvResults, BAENGINE_SETUPDATE_RESULTS, pResults); LPCWSTR wzLocalSource = pArgs->wzLocalSource; LPCWSTR wzDownloadSource = pArgs->wzDownloadSource; DWORD64 qwSize = pArgs->qwSize; @@ -385,13 +414,15 @@ LExit: static HRESULT BAEngineSetLocalSource( __in BOOTSTRAPPER_ENGINE_CONTEXT* pContext, - __in BAENGINE_SETLOCALSOURCE_ARGS* pArgs, - __in BAENGINE_SETLOCALSOURCE_RESULTS* /*pResults*/ + __in const LPVOID pvArgs, + __inout LPVOID pvResults ) { HRESULT hr = S_OK; BURN_CONTAINER* pContainer = NULL; BURN_PAYLOAD* pPayload = NULL; + ValidateMessageArgs(hr, pvArgs, BAENGINE_SETLOCALSOURCE_ARGS, pArgs); + ValidateMessageResults(hr, pvResults, BAENGINE_SETLOCALSOURCE_RESULTS, pResults); LPCWSTR wzPackageOrContainerId = pArgs->wzPackageOrContainerId; LPCWSTR wzPayloadId = pArgs->wzPayloadId; LPCWSTR wzPath = pArgs->wzPath; @@ -438,14 +469,16 @@ LExit: static HRESULT BAEngineSetDownloadSource( __in BOOTSTRAPPER_ENGINE_CONTEXT* pContext, - __in BAENGINE_SETDOWNLOADSOURCE_ARGS* pArgs, - __in BAENGINE_SETDOWNLOADSOURCE_RESULTS* /*pResults*/ + __in const LPVOID pvArgs, + __inout LPVOID pvResults ) { HRESULT hr = S_OK; BURN_CONTAINER* pContainer = NULL; BURN_PAYLOAD* pPayload = NULL; DOWNLOAD_SOURCE* pDownloadSource = NULL; + ValidateMessageArgs(hr, pvArgs, BAENGINE_SETDOWNLOADSOURCE_ARGS, pArgs); + ValidateMessageResults(hr, pvResults, BAENGINE_SETDOWNLOADSOURCE_RESULTS, pResults); LPCWSTR wzPackageOrContainerId = pArgs->wzPackageOrContainerId; LPCWSTR wzPayloadId = pArgs->wzPayloadId; LPCWSTR wzUrl = pArgs->wzUrl; @@ -522,11 +555,13 @@ LExit: static HRESULT BAEngineSetVariableNumeric( __in BOOTSTRAPPER_ENGINE_CONTEXT* pContext, - __in const BAENGINE_SETVARIABLENUMERIC_ARGS* pArgs, - __in BAENGINE_SETVARIABLENUMERIC_RESULTS* /*pResults*/ + __in const LPVOID pvArgs, + __inout LPVOID pvResults ) { HRESULT hr = S_OK; + ValidateMessageArgs(hr, pvArgs, BAENGINE_SETVARIABLENUMERIC_ARGS, pArgs); + ValidateMessageResults(hr, pvResults, BAENGINE_SETVARIABLENUMERIC_RESULTS, pResults); LPCWSTR wzVariable = pArgs->wzVariable; LONGLONG llValue = pArgs->llValue; @@ -547,11 +582,13 @@ LExit: static HRESULT BAEngineSetVariableString( __in BOOTSTRAPPER_ENGINE_CONTEXT* pContext, - __in const BAENGINE_SETVARIABLESTRING_ARGS* pArgs, - __in BAENGINE_SETVARIABLESTRING_RESULTS* /*pResults*/ + __in const LPVOID pvArgs, + __inout LPVOID pvResults ) { HRESULT hr = S_OK; + ValidateMessageArgs(hr, pvArgs, BAENGINE_SETVARIABLESTRING_ARGS, pArgs); + ValidateMessageResults(hr, pvResults, BAENGINE_SETVARIABLESTRING_RESULTS, pResults); LPCWSTR wzVariable = pArgs->wzVariable; LPCWSTR wzValue = pArgs->wzValue; @@ -572,14 +609,16 @@ LExit: static HRESULT BAEngineSetVariableVersion( __in BOOTSTRAPPER_ENGINE_CONTEXT* pContext, - __in const BAENGINE_SETVARIABLEVERSION_ARGS* pArgs, - __in BAENGINE_SETVARIABLEVERSION_RESULTS* /*pResults*/ + __in const LPVOID pvArgs, + __inout LPVOID pvResults ) { HRESULT hr = S_OK; + VERUTIL_VERSION* pVersion = NULL; + ValidateMessageArgs(hr, pvArgs, BAENGINE_SETVARIABLEVERSION_ARGS, pArgs); + ValidateMessageResults(hr, pvResults, BAENGINE_SETVARIABLEVERSION_RESULTS, pResults); LPCWSTR wzVariable = pArgs->wzVariable; LPCWSTR wzValue = pArgs->wzValue; - VERUTIL_VERSION* pVersion = NULL; if (wzVariable && *wzVariable) { @@ -606,42 +645,52 @@ LExit: static HRESULT BAEngineCloseSplashScreen( __in BOOTSTRAPPER_ENGINE_CONTEXT* pContext, - __in const BAENGINE_CLOSESPLASHSCREEN_ARGS* /*pArgs*/, - __in BAENGINE_CLOSESPLASHSCREEN_RESULTS* /*pResults*/ + __in const LPVOID pvArgs, + __inout LPVOID pvResults ) { + HRESULT hr = S_OK; + ValidateMessageArgs(hr, pvArgs, BAENGINE_CLOSESPLASHSCREEN_ARGS, pArgs); + ValidateMessageResults(hr, pvResults, BAENGINE_CLOSESPLASHSCREEN_RESULTS, pResults); + // If the splash screen is still around, close it. if (::IsWindow(pContext->pEngineState->command.hwndSplashScreen)) { ::PostMessageW(pContext->pEngineState->command.hwndSplashScreen, WM_CLOSE, 0, 0); } - return S_OK; +LExit: + return hr; } static HRESULT BAEngineCompareVersions( __in BOOTSTRAPPER_ENGINE_CONTEXT* /*pContext*/, - __in const BAENGINE_COMPAREVERSIONS_ARGS* pArgs, - __in BAENGINE_COMPAREVERSIONS_RESULTS* pResults + __in const LPVOID pvArgs, + __inout LPVOID pvResults ) { HRESULT hr = S_OK; + ValidateMessageArgs(hr, pvArgs, BAENGINE_COMPAREVERSIONS_ARGS, pArgs); + ValidateMessageResults(hr, pvResults, BAENGINE_COMPAREVERSIONS_RESULTS, pResults); LPCWSTR wzVersion1 = pArgs->wzVersion1; LPCWSTR wzVersion2 = pArgs->wzVersion2; int* pnResult = &pResults->nResult; hr = VerCompareStringVersions(wzVersion1, wzVersion2, FALSE, pnResult); +LExit: return hr; } static HRESULT BAEngineDetect( __in BOOTSTRAPPER_ENGINE_CONTEXT* pContext, - __in BAENGINE_DETECT_ARGS* pArgs, - __in BAENGINE_DETECT_RESULTS* /*pResults*/ + __in const LPVOID pvArgs, + __inout LPVOID pvResults ) { HRESULT hr = S_OK; + ValidateMessageArgs(hr, pvArgs, BAENGINE_DETECT_ARGS, pArgs); + ValidateMessageResults(hr, pvResults, BAENGINE_DETECT_RESULTS, pResults); if (!::PostThreadMessageW(pContext->dwThreadId, WM_BURN_DETECT, 0, reinterpret_cast(pArgs->hwndParent))) { @@ -654,11 +703,13 @@ LExit: static HRESULT BAEnginePlan( __in BOOTSTRAPPER_ENGINE_CONTEXT* pContext, - __in const BAENGINE_PLAN_ARGS* pArgs, - __in BAENGINE_PLAN_RESULTS* /*pResults*/ + __in const LPVOID pvArgs, + __inout LPVOID pvResults ) { HRESULT hr = S_OK; + ValidateMessageArgs(hr, pvArgs, BAENGINE_PLAN_ARGS, pArgs); + ValidateMessageResults(hr, pvResults, BAENGINE_PLAN_RESULTS, pResults); BOOTSTRAPPER_ACTION action = pArgs->action; if (!::PostThreadMessageW(pContext->dwThreadId, WM_BURN_PLAN, 0, action)) @@ -672,11 +723,13 @@ LExit: static HRESULT BAEngineElevate( __in BOOTSTRAPPER_ENGINE_CONTEXT* pContext, - __in const BAENGINE_ELEVATE_ARGS* pArgs, - __in BAENGINE_ELEVATE_RESULTS* /*pResults*/ + __in const LPVOID pvArgs, + __inout LPVOID pvResults ) { HRESULT hr = S_OK; + ValidateMessageArgs(hr, pvArgs, BAENGINE_ELEVATE_ARGS, pArgs); + ValidateMessageResults(hr, pvResults, BAENGINE_ELEVATE_RESULTS, pResults); if (INVALID_HANDLE_VALUE != pContext->pEngineState->companionConnection.hPipe) { @@ -693,11 +746,13 @@ LExit: static HRESULT BAEngineApply( __in BOOTSTRAPPER_ENGINE_CONTEXT* pContext, - __in const BAENGINE_APPLY_ARGS* pArgs, - __in BAENGINE_APPLY_RESULTS* /*pResults*/ + __in const LPVOID pvArgs, + __inout LPVOID pvResults ) { HRESULT hr = S_OK; + ValidateMessageArgs(hr, pvArgs, BAENGINE_APPLY_ARGS, pArgs); + ValidateMessageResults(hr, pvResults, BAENGINE_APPLY_RESULTS, pResults); ExitOnNull(pArgs->hwndParent, hr, E_INVALIDARG, "BA passed NULL hwndParent to Apply."); if (!::IsWindow(pArgs->hwndParent)) @@ -716,11 +771,13 @@ LExit: static HRESULT BAEngineQuit( __in BOOTSTRAPPER_ENGINE_CONTEXT* pContext, - __in const BAENGINE_QUIT_ARGS* pArgs, - __in BAENGINE_QUIT_RESULTS* /*pResults*/ + __in const LPVOID pvArgs, + __inout LPVOID pvResults ) { HRESULT hr = S_OK; + ValidateMessageArgs(hr, pvArgs, BAENGINE_QUIT_ARGS, pArgs); + ValidateMessageResults(hr, pvResults, BAENGINE_QUIT_RESULTS, pResults); if (!::PostThreadMessageW(pContext->dwThreadId, WM_BURN_QUIT, static_cast(pArgs->dwExitCode), 0)) { @@ -733,19 +790,24 @@ LExit: static HRESULT BAEngineLaunchApprovedExe( __in BOOTSTRAPPER_ENGINE_CONTEXT* pContext, - __in const BAENGINE_LAUNCHAPPROVEDEXE_ARGS* pArgs, - __in BAENGINE_LAUNCHAPPROVEDEXE_RESULTS* /*pResults*/ + __in const LPVOID pvArgs, + __inout LPVOID pvResults ) { HRESULT hr = S_OK; BURN_APPROVED_EXE* pApprovedExe = NULL; BOOL fLeaveCriticalSection = FALSE; - BURN_LAUNCH_APPROVED_EXE* pLaunchApprovedExe = (BURN_LAUNCH_APPROVED_EXE*)MemAlloc(sizeof(BURN_LAUNCH_APPROVED_EXE), TRUE); + BURN_LAUNCH_APPROVED_EXE* pLaunchApprovedExe = NULL; + ValidateMessageArgs(hr, pvArgs, BAENGINE_LAUNCHAPPROVEDEXE_ARGS, pArgs); + ValidateMessageResults(hr, pvResults, BAENGINE_LAUNCHAPPROVEDEXE_RESULTS, pResults); HWND hwndParent = pArgs->hwndParent; LPCWSTR wzApprovedExeForElevationId = pArgs->wzApprovedExeForElevationId; LPCWSTR wzArguments = pArgs->wzArguments; DWORD dwWaitForInputIdleTimeout = pArgs->dwWaitForInputIdleTimeout; + pLaunchApprovedExe = (BURN_LAUNCH_APPROVED_EXE*)MemAlloc(sizeof(BURN_LAUNCH_APPROVED_EXE), TRUE); + ExitOnNull(pLaunchApprovedExe, hr, E_OUTOFMEMORY, "Failed to alloc BURN_LAUNCH_APPROVED_EXE"); + ::EnterCriticalSection(&pContext->pEngineState->csActive); fLeaveCriticalSection = TRUE; hr = UserExperienceEnsureEngineInactive(&pContext->pEngineState->userExperience); @@ -812,76 +874,76 @@ HRESULT WINAPI EngineForApplicationProc( switch (message) { case BOOTSTRAPPER_ENGINE_MESSAGE_GETPACKAGECOUNT: - hr = BAEngineGetPackageCount(pContext, reinterpret_cast(pvArgs), reinterpret_cast(pvResults)); + hr = BAEngineGetPackageCount(pContext, pvArgs, pvResults); break; case BOOTSTRAPPER_ENGINE_MESSAGE_GETVARIABLENUMERIC: - hr = BAEngineGetVariableNumeric(pContext, reinterpret_cast(pvArgs), reinterpret_cast(pvResults)); + hr = BAEngineGetVariableNumeric(pContext, pvArgs, pvResults); break; case BOOTSTRAPPER_ENGINE_MESSAGE_GETVARIABLESTRING: - hr = BAEngineGetVariableString(pContext, reinterpret_cast(pvArgs), reinterpret_cast(pvResults)); + hr = BAEngineGetVariableString(pContext, pvArgs, pvResults); break; case BOOTSTRAPPER_ENGINE_MESSAGE_GETVARIABLEVERSION: - hr = BAEngineGetVariableVersion(pContext, reinterpret_cast(pvArgs), reinterpret_cast(pvResults)); + hr = BAEngineGetVariableVersion(pContext, pvArgs, pvResults); break; case BOOTSTRAPPER_ENGINE_MESSAGE_FORMATSTRING: - hr = BAEngineFormatString(pContext, reinterpret_cast(pvArgs), reinterpret_cast(pvResults)); + hr = BAEngineFormatString(pContext, pvArgs, pvResults); break; case BOOTSTRAPPER_ENGINE_MESSAGE_ESCAPESTRING: - hr = BAEngineEscapeString(pContext, reinterpret_cast(pvArgs), reinterpret_cast(pvResults)); + hr = BAEngineEscapeString(pContext, pvArgs, pvResults); break; case BOOTSTRAPPER_ENGINE_MESSAGE_EVALUATECONDITION: - hr = BAEngineEvaluateCondition(pContext, reinterpret_cast(pvArgs), reinterpret_cast(pvResults)); + hr = BAEngineEvaluateCondition(pContext, pvArgs, pvResults); break; case BOOTSTRAPPER_ENGINE_MESSAGE_LOG: - hr = BAEngineLog(pContext, reinterpret_cast(pvArgs), reinterpret_cast(pvResults)); + hr = BAEngineLog(pContext, pvArgs, pvResults); break; case BOOTSTRAPPER_ENGINE_MESSAGE_SENDEMBEDDEDERROR: - hr = BAEngineSendEmbeddedError(pContext, reinterpret_cast(pvArgs), reinterpret_cast(pvResults)); + hr = BAEngineSendEmbeddedError(pContext, pvArgs, pvResults); break; case BOOTSTRAPPER_ENGINE_MESSAGE_SENDEMBEDDEDPROGRESS: - hr = BAEngineSendEmbeddedProgress(pContext, reinterpret_cast(pvArgs), reinterpret_cast(pvResults)); + hr = BAEngineSendEmbeddedProgress(pContext, pvArgs, pvResults); break; case BOOTSTRAPPER_ENGINE_MESSAGE_SETUPDATE: - hr = BAEngineSetUpdate(pContext, reinterpret_cast(pvArgs), reinterpret_cast(pvResults)); + hr = BAEngineSetUpdate(pContext, pvArgs, pvResults); break; case BOOTSTRAPPER_ENGINE_MESSAGE_SETLOCALSOURCE: - hr = BAEngineSetLocalSource(pContext, reinterpret_cast(pvArgs), reinterpret_cast(pvResults)); + hr = BAEngineSetLocalSource(pContext, pvArgs, pvResults); break; case BOOTSTRAPPER_ENGINE_MESSAGE_SETDOWNLOADSOURCE: - hr = BAEngineSetDownloadSource(pContext, reinterpret_cast(pvArgs), reinterpret_cast(pvResults)); + hr = BAEngineSetDownloadSource(pContext, pvArgs, pvResults); break; case BOOTSTRAPPER_ENGINE_MESSAGE_SETVARIABLENUMERIC: - hr = BAEngineSetVariableNumeric(pContext, reinterpret_cast(pvArgs), reinterpret_cast(pvResults)); + hr = BAEngineSetVariableNumeric(pContext, pvArgs, pvResults); break; case BOOTSTRAPPER_ENGINE_MESSAGE_SETVARIABLESTRING: - hr = BAEngineSetVariableString(pContext, reinterpret_cast(pvArgs), reinterpret_cast(pvResults)); + hr = BAEngineSetVariableString(pContext, pvArgs, pvResults); break; case BOOTSTRAPPER_ENGINE_MESSAGE_SETVARIABLEVERSION: - hr = BAEngineSetVariableVersion(pContext, reinterpret_cast(pvArgs), reinterpret_cast(pvResults)); + hr = BAEngineSetVariableVersion(pContext, pvArgs, pvResults); break; case BOOTSTRAPPER_ENGINE_MESSAGE_CLOSESPLASHSCREEN: - hr = BAEngineCloseSplashScreen(pContext, reinterpret_cast(pvArgs), reinterpret_cast(pvResults)); + hr = BAEngineCloseSplashScreen(pContext, pvArgs, pvResults); break; case BOOTSTRAPPER_ENGINE_MESSAGE_DETECT: - hr = BAEngineDetect(pContext, reinterpret_cast(pvArgs), reinterpret_cast(pvResults)); + hr = BAEngineDetect(pContext, pvArgs, pvResults); break; case BOOTSTRAPPER_ENGINE_MESSAGE_PLAN: - hr = BAEnginePlan(pContext, reinterpret_cast(pvArgs), reinterpret_cast(pvResults)); + hr = BAEnginePlan(pContext, pvArgs, pvResults); break; case BOOTSTRAPPER_ENGINE_MESSAGE_ELEVATE: - hr = BAEngineElevate(pContext, reinterpret_cast(pvArgs), reinterpret_cast(pvResults)); + hr = BAEngineElevate(pContext, pvArgs, pvResults); break; case BOOTSTRAPPER_ENGINE_MESSAGE_APPLY: - hr = BAEngineApply(pContext, reinterpret_cast(pvArgs), reinterpret_cast(pvResults)); + hr = BAEngineApply(pContext, pvArgs, pvResults); break; case BOOTSTRAPPER_ENGINE_MESSAGE_QUIT: - hr = BAEngineQuit(pContext, reinterpret_cast(pvArgs), reinterpret_cast(pvResults)); + hr = BAEngineQuit(pContext, pvArgs, pvResults); break; case BOOTSTRAPPER_ENGINE_MESSAGE_LAUNCHAPPROVEDEXE: - hr = BAEngineLaunchApprovedExe(pContext, reinterpret_cast(pvArgs), reinterpret_cast(pvResults)); + hr = BAEngineLaunchApprovedExe(pContext, pvArgs, pvResults); break; case BOOTSTRAPPER_ENGINE_MESSAGE_COMPAREVERSIONS: - hr = BAEngineCompareVersions(pContext, reinterpret_cast(pvArgs), reinterpret_cast(pvResults)); + hr = BAEngineCompareVersions(pContext, pvArgs, pvResults); break; default: hr = E_NOTIMPL; @@ -894,7 +956,7 @@ LExit: static HRESULT CopyStringToBA( __in LPWSTR wzValue, - __in LPWSTR wzBuffer, + __in_opt LPWSTR wzBuffer, __inout DWORD* pcchBuffer ) { diff --git a/src/engine/EngineForExtension.cpp b/src/engine/EngineForExtension.cpp index 585b74a4..29b6a6b3 100644 --- a/src/engine/EngineForExtension.cpp +++ b/src/engine/EngineForExtension.cpp @@ -11,12 +11,14 @@ static HRESULT CopyStringToBE( static HRESULT BEEngineEscapeString( __in BURN_EXTENSION_ENGINE_CONTEXT* /*pContext*/, - __in BUNDLE_EXTENSION_ENGINE_ESCAPESTRING_ARGS* pArgs, - __in BUNDLE_EXTENSION_ENGINE_ESCAPESTRING_RESULTS* pResults + __in const LPVOID pvArgs, + __inout LPVOID pvResults ) { HRESULT hr = S_OK; LPWSTR sczValue = NULL; + ValidateMessageArgs(hr, pvArgs, BUNDLE_EXTENSION_ENGINE_ESCAPESTRING_ARGS, pArgs); + ValidateMessageResults(hr, pvResults, BUNDLE_EXTENSION_ENGINE_ESCAPESTRING_RESULTS, pResults); LPCWSTR wzIn = pArgs->wzIn; LPWSTR wzOut = pResults->wzOut; DWORD* pcchOut = &pResults->cchOut; @@ -34,17 +36,20 @@ static HRESULT BEEngineEscapeString( hr = E_INVALIDARG; } +LExit: StrSecureZeroFreeString(sczValue); return hr; } static HRESULT BEEngineEvaluateCondition( __in BURN_EXTENSION_ENGINE_CONTEXT* pContext, - __in BUNDLE_EXTENSION_ENGINE_EVALUATECONDITION_ARGS* pArgs, - __in BUNDLE_EXTENSION_ENGINE_EVALUATECONDITION_RESULTS* pResults + __in const LPVOID pvArgs, + __inout LPVOID pvResults ) { HRESULT hr = S_OK; + ValidateMessageArgs(hr, pvArgs, BUNDLE_EXTENSION_ENGINE_EVALUATECONDITION_ARGS, pArgs); + ValidateMessageResults(hr, pvResults, BUNDLE_EXTENSION_ENGINE_EVALUATECONDITION_RESULTS, pResults); LPCWSTR wzCondition = pArgs->wzCondition; BOOL* pf = &pResults->f; @@ -57,17 +62,20 @@ static HRESULT BEEngineEvaluateCondition( hr = E_INVALIDARG; } +LExit: return hr; } static HRESULT BEEngineFormatString( __in BURN_EXTENSION_ENGINE_CONTEXT* pContext, - __in BUNDLE_EXTENSION_ENGINE_FORMATSTRING_ARGS* pArgs, - __in BUNDLE_EXTENSION_ENGINE_FORMATSTRING_RESULTS* pResults + __in const LPVOID pvArgs, + __inout LPVOID pvResults ) { HRESULT hr = S_OK; LPWSTR sczValue = NULL; + ValidateMessageArgs(hr, pvArgs, BUNDLE_EXTENSION_ENGINE_FORMATSTRING_ARGS, pArgs); + ValidateMessageResults(hr, pvResults, BUNDLE_EXTENSION_ENGINE_FORMATSTRING_RESULTS, pResults); LPCWSTR wzIn = pArgs->wzIn; LPWSTR wzOut = pResults->wzOut; DWORD* pcchOut = &pResults->cchOut; @@ -85,17 +93,20 @@ static HRESULT BEEngineFormatString( hr = E_INVALIDARG; } +LExit: StrSecureZeroFreeString(sczValue); return hr; } static HRESULT BEEngineGetVariableNumeric( __in BURN_EXTENSION_ENGINE_CONTEXT* pContext, - __in BUNDLE_EXTENSION_ENGINE_GETVARIABLENUMERIC_ARGS* pArgs, - __in BUNDLE_EXTENSION_ENGINE_GETVARIABLENUMERIC_RESULTS* pResults + __in const LPVOID pvArgs, + __inout LPVOID pvResults ) { HRESULT hr = S_OK; + ValidateMessageArgs(hr, pvArgs, BUNDLE_EXTENSION_ENGINE_GETVARIABLENUMERIC_ARGS, pArgs); + ValidateMessageResults(hr, pvResults, BUNDLE_EXTENSION_ENGINE_GETVARIABLENUMERIC_RESULTS, pResults); LPCWSTR wzVariable = pArgs->wzVariable; LONGLONG* pllValue = &pResults->llValue; @@ -108,17 +119,20 @@ static HRESULT BEEngineGetVariableNumeric( hr = E_INVALIDARG; } +LExit: return hr; } static HRESULT BEEngineGetVariableString( __in BURN_EXTENSION_ENGINE_CONTEXT* pContext, - __in BUNDLE_EXTENSION_ENGINE_GETVARIABLESTRING_ARGS* pArgs, - __in BUNDLE_EXTENSION_ENGINE_GETVARIABLESTRING_RESULTS* pResults + __in const LPVOID pvArgs, + __inout LPVOID pvResults ) { HRESULT hr = S_OK; LPWSTR sczValue = NULL; + ValidateMessageArgs(hr, pvArgs, BUNDLE_EXTENSION_ENGINE_GETVARIABLESTRING_ARGS, pArgs); + ValidateMessageResults(hr, pvResults, BUNDLE_EXTENSION_ENGINE_GETVARIABLESTRING_RESULTS, pResults); LPCWSTR wzVariable = pArgs->wzVariable; LPWSTR wzValue = pResults->wzValue; DWORD* pcchValue = &pResults->cchValue; @@ -136,18 +150,21 @@ static HRESULT BEEngineGetVariableString( hr = E_INVALIDARG; } +LExit: StrSecureZeroFreeString(sczValue); return hr; } static HRESULT BEEngineGetVariableVersion( __in BURN_EXTENSION_ENGINE_CONTEXT* pContext, - __in BUNDLE_EXTENSION_ENGINE_GETVARIABLEVERSION_ARGS* pArgs, - __in BUNDLE_EXTENSION_ENGINE_GETVARIABLEVERSION_RESULTS* pResults + __in const LPVOID pvArgs, + __inout LPVOID pvResults ) { HRESULT hr = S_OK; VERUTIL_VERSION* pVersion = NULL; + ValidateMessageArgs(hr, pvArgs, BUNDLE_EXTENSION_ENGINE_GETVARIABLEVERSION_ARGS, pArgs); + ValidateMessageResults(hr, pvResults, BUNDLE_EXTENSION_ENGINE_GETVARIABLEVERSION_RESULTS, pResults); LPCWSTR wzVariable = pArgs->wzVariable; LPWSTR wzValue = pResults->wzValue; DWORD* pcchValue = &pResults->cchValue; @@ -165,6 +182,7 @@ static HRESULT BEEngineGetVariableVersion( hr = E_INVALIDARG; } +LExit: ReleaseVerutilVersion(pVersion); return hr; @@ -172,12 +190,14 @@ static HRESULT BEEngineGetVariableVersion( static HRESULT BEEngineLog( __in BURN_EXTENSION_ENGINE_CONTEXT* /*pContext*/, - __in BUNDLE_EXTENSION_ENGINE_LOG_ARGS* pArgs, - __in BUNDLE_EXTENSION_ENGINE_LOG_RESULTS* /*pResults*/ + __in const LPVOID pvArgs, + __inout LPVOID pvResults ) { HRESULT hr = S_OK; REPORT_LEVEL rl = REPORT_NONE; + ValidateMessageArgs(hr, pvArgs, BUNDLE_EXTENSION_ENGINE_LOG_ARGS, pArgs); + ValidateMessageResults(hr, pvResults, BUNDLE_EXTENSION_ENGINE_LOG_RESULTS, pResults); BUNDLE_EXTENSION_LOG_LEVEL level = pArgs->level; LPCWSTR wzMessage = pArgs->wzMessage; @@ -212,11 +232,13 @@ LExit: static HRESULT BEEngineSetVariableNumeric( __in BURN_EXTENSION_ENGINE_CONTEXT* pContext, - __in const BUNDLE_EXTENSION_ENGINE_SETVARIABLENUMERIC_ARGS* pArgs, - __in BUNDLE_EXTENSION_ENGINE_SETVARIABLENUMERIC_RESULTS* /*pResults*/ + __in const LPVOID pvArgs, + __inout LPVOID pvResults ) { HRESULT hr = S_OK; + ValidateMessageArgs(hr, pvArgs, BUNDLE_EXTENSION_ENGINE_SETVARIABLENUMERIC_ARGS, pArgs); + ValidateMessageResults(hr, pvResults, BUNDLE_EXTENSION_ENGINE_SETVARIABLENUMERIC_RESULTS, pResults); LPCWSTR wzVariable = pArgs->wzVariable; LONGLONG llValue = pArgs->llValue; @@ -237,11 +259,13 @@ LExit: static HRESULT BEEngineSetVariableString( __in BURN_EXTENSION_ENGINE_CONTEXT* pContext, - __in const BUNDLE_EXTENSION_ENGINE_SETVARIABLESTRING_ARGS* pArgs, - __in BUNDLE_EXTENSION_ENGINE_SETVARIABLESTRING_RESULTS* /*pResults*/ + __in const LPVOID pvArgs, + __inout LPVOID pvResults ) { HRESULT hr = S_OK; + ValidateMessageArgs(hr, pvArgs, BUNDLE_EXTENSION_ENGINE_SETVARIABLESTRING_ARGS, pArgs); + ValidateMessageResults(hr, pvResults, BUNDLE_EXTENSION_ENGINE_SETVARIABLESTRING_RESULTS, pResults); LPCWSTR wzVariable = pArgs->wzVariable; LPCWSTR wzValue = pArgs->wzValue; @@ -262,14 +286,16 @@ LExit: static HRESULT BEEngineSetVariableVersion( __in BURN_EXTENSION_ENGINE_CONTEXT* pContext, - __in const BUNDLE_EXTENSION_ENGINE_SETVARIABLEVERSION_ARGS* pArgs, - __in BUNDLE_EXTENSION_ENGINE_SETVARIABLEVERSION_RESULTS* /*pResults*/ + __in const LPVOID pvArgs, + __inout LPVOID pvResults ) { HRESULT hr = S_OK; + VERUTIL_VERSION* pVersion = NULL; + ValidateMessageArgs(hr, pvArgs, BUNDLE_EXTENSION_ENGINE_SETVARIABLEVERSION_ARGS, pArgs); + ValidateMessageResults(hr, pvResults, BUNDLE_EXTENSION_ENGINE_SETVARIABLEVERSION_RESULTS, pResults); LPCWSTR wzVariable = pArgs->wzVariable; LPCWSTR wzValue = pArgs->wzValue; - VERUTIL_VERSION* pVersion = NULL; if (wzVariable && *wzVariable) { @@ -296,17 +322,20 @@ LExit: static HRESULT BEEngineCompareVersions( __in BURN_EXTENSION_ENGINE_CONTEXT* /*pContext*/, - __in const BUNDLE_EXTENSION_ENGINE_COMPAREVERSIONS_ARGS* pArgs, - __in BUNDLE_EXTENSION_ENGINE_COMPAREVERSIONS_RESULTS* pResults + __in const LPVOID pvArgs, + __inout LPVOID pvResults ) { HRESULT hr = S_OK; + ValidateMessageArgs(hr, pvArgs, BUNDLE_EXTENSION_ENGINE_COMPAREVERSIONS_ARGS, pArgs); + ValidateMessageResults(hr, pvResults, BUNDLE_EXTENSION_ENGINE_COMPAREVERSIONS_RESULTS, pResults); LPCWSTR wzVersion1 = pArgs->wzVersion1; LPCWSTR wzVersion2 = pArgs->wzVersion2; int* pnResult = &pResults->nResult; hr = VerCompareStringVersions(wzVersion1, wzVersion2, FALSE, pnResult); +LExit: return hr; } @@ -328,37 +357,37 @@ HRESULT WINAPI EngineForExtensionProc( switch (message) { case BUNDLE_EXTENSION_ENGINE_MESSAGE_ESCAPESTRING: - hr = BEEngineEscapeString(pContext, reinterpret_cast(pvArgs), reinterpret_cast(pvResults)); + hr = BEEngineEscapeString(pContext, pvArgs, pvResults); break; case BUNDLE_EXTENSION_ENGINE_MESSAGE_EVALUATECONDITION: - hr = BEEngineEvaluateCondition(pContext, reinterpret_cast(pvArgs), reinterpret_cast(pvResults)); + hr = BEEngineEvaluateCondition(pContext, pvArgs, pvResults); break; case BUNDLE_EXTENSION_ENGINE_MESSAGE_FORMATSTRING: - hr = BEEngineFormatString(pContext, reinterpret_cast(pvArgs), reinterpret_cast(pvResults)); + hr = BEEngineFormatString(pContext, pvArgs, pvResults); break; case BUNDLE_EXTENSION_ENGINE_MESSAGE_GETVARIABLENUMERIC: - hr = BEEngineGetVariableNumeric(pContext, reinterpret_cast(pvArgs), reinterpret_cast(pvResults)); + hr = BEEngineGetVariableNumeric(pContext, pvArgs, pvResults); break; case BUNDLE_EXTENSION_ENGINE_MESSAGE_GETVARIABLESTRING: - hr = BEEngineGetVariableString(pContext, reinterpret_cast(pvArgs), reinterpret_cast(pvResults)); + hr = BEEngineGetVariableString(pContext, pvArgs, pvResults); break; case BUNDLE_EXTENSION_ENGINE_MESSAGE_GETVARIABLEVERSION: - hr = BEEngineGetVariableVersion(pContext, reinterpret_cast(pvArgs), reinterpret_cast(pvResults)); + hr = BEEngineGetVariableVersion(pContext, pvArgs, pvResults); break; case BUNDLE_EXTENSION_ENGINE_MESSAGE_LOG: - hr = BEEngineLog(pContext, reinterpret_cast(pvArgs), reinterpret_cast(pvResults)); + hr = BEEngineLog(pContext, pvArgs, pvResults); break; case BUNDLE_EXTENSION_ENGINE_MESSAGE_SETVARIABLENUMERIC: - hr = BEEngineSetVariableNumeric(pContext, reinterpret_cast(pvArgs), reinterpret_cast(pvResults)); + hr = BEEngineSetVariableNumeric(pContext, pvArgs, pvResults); break; case BUNDLE_EXTENSION_ENGINE_MESSAGE_SETVARIABLESTRING: - hr = BEEngineSetVariableString(pContext, reinterpret_cast(pvArgs), reinterpret_cast(pvResults)); + hr = BEEngineSetVariableString(pContext, pvArgs, pvResults); break; case BUNDLE_EXTENSION_ENGINE_MESSAGE_SETVARIABLEVERSION: - hr = BEEngineSetVariableVersion(pContext, reinterpret_cast(pvArgs), reinterpret_cast(pvResults)); + hr = BEEngineSetVariableVersion(pContext, pvArgs, pvResults); break; case BUNDLE_EXTENSION_ENGINE_MESSAGE_COMPAREVERSIONS: - hr = BEEngineCompareVersions(pContext, reinterpret_cast(pvArgs), reinterpret_cast(pvResults)); + hr = BEEngineCompareVersions(pContext, pvArgs, pvResults); break; default: hr = E_NOTIMPL; diff --git a/src/engine/burnextension.cpp b/src/engine/burnextension.cpp index 157b082f..7568f75e 100644 --- a/src/engine/burnextension.cpp +++ b/src/engine/burnextension.cpp @@ -2,6 +2,14 @@ #include "precomp.h" + +static HRESULT SendRequiredBextMessage( + __in BURN_EXTENSION* pExtension, + __in BUNDLE_EXTENSION_MESSAGE message, + __in const LPVOID pvArgs, + __inout LPVOID pvResults + ); + // function definitions /******************************************************************* @@ -234,9 +242,23 @@ EXTERN_C BEEAPI BurnExtensionPerformSearch( results.cbSize = sizeof(results); - hr = pExtension->pfnBurnExtensionProc(BUNDLE_EXTENSION_MESSAGE_SEARCH, &args, &results, pExtension->pvBurnExtensionProcContext); + hr = SendRequiredBextMessage(pExtension, BUNDLE_EXTENSION_MESSAGE_SEARCH, &args, &results); ExitOnFailure(hr, "BundleExtension '%ls' Search '%ls' failed.", pExtension->sczId, wzSearchId); LExit: return hr; } + +static HRESULT SendRequiredBextMessage( + __in BURN_EXTENSION* pExtension, + __in BUNDLE_EXTENSION_MESSAGE message, + __in const LPVOID pvArgs, + __inout LPVOID pvResults + ) +{ + HRESULT hr = S_OK; + + hr = pExtension->pfnBurnExtensionProc(message, pvArgs, pvResults, pExtension->pvBurnExtensionProcContext); + + return hr; +} diff --git a/src/engine/engine.vcxproj b/src/engine/engine.vcxproj index 28085ed4..3624d923 100644 --- a/src/engine/engine.vcxproj +++ b/src/engine/engine.vcxproj @@ -51,6 +51,7 @@ + @@ -109,6 +110,7 @@ + diff --git a/src/engine/externalengine.cpp b/src/engine/externalengine.cpp new file mode 100644 index 00000000..ef4f931d --- /dev/null +++ b/src/engine/externalengine.cpp @@ -0,0 +1,30 @@ +// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. + +#include "precomp.h" + + +// function definitions + +// TODO: callers need to provide the original size (at the time of first public release) of the struct instead of the current size. +HRESULT WINAPI ExternalEngineValidateMessageParameter( + __in_opt const LPVOID pv, + __in SIZE_T cbSizeOffset, + __in DWORD dwMinimumSize + ) +{ + HRESULT hr = S_OK; + + if (!pv) + { + ExitFunction1(hr = E_INVALIDARG); + } + + DWORD cbSize = *(DWORD*)((BYTE*)pv + cbSizeOffset); + if (dwMinimumSize < cbSize) + { + ExitFunction1(hr = E_INVALIDARG); + } + +LExit: + return hr; +} diff --git a/src/engine/externalengine.h b/src/engine/externalengine.h new file mode 100644 index 00000000..7910b224 --- /dev/null +++ b/src/engine/externalengine.h @@ -0,0 +1,22 @@ +#pragma once +// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. + + +#define ValidateMessageParameter(x, pv, type) { x = ExternalEngineValidateMessageParameter(pv, offsetof(type, cbSize), sizeof(type)); if (FAILED(x)) { goto LExit; }} +#define ValidateMessageArgs(x, pv, type, identifier) ValidateMessageParameter(x, pv, type); const type* identifier = reinterpret_cast(pv); UNREFERENCED_PARAMETER(identifier) +#define ValidateMessageResults(x, pv, type, identifier) ValidateMessageParameter(x, pv, type); type* identifier = reinterpret_cast(pv); UNREFERENCED_PARAMETER(identifier) + + +#if defined(__cplusplus) +extern "C" { +#endif + +HRESULT WINAPI ExternalEngineValidateMessageParameter( + __in_opt const LPVOID pv, + __in SIZE_T cbSizeOffset, + __in DWORD dwMinimumSize + ); + +#if defined(__cplusplus) +} +#endif diff --git a/src/engine/precomp.h b/src/engine/precomp.h index 2bceab58..a8a656d1 100644 --- a/src/engine/precomp.h +++ b/src/engine/precomp.h @@ -100,6 +100,7 @@ #include "bitsengine.h" #include "netfxchainer.h" +#include "externalengine.h" #include "EngineForApplication.h" #include "EngineForExtension.h" #include "engine.messages.h" diff --git a/src/engine/userexperience.cpp b/src/engine/userexperience.cpp index b5bdc623..ce1662b8 100644 --- a/src/engine/userexperience.cpp +++ b/src/engine/userexperience.cpp @@ -17,6 +17,13 @@ static HRESULT FilterExecuteResult( __in LPCWSTR sczEventName ); +static HRESULT SendBAMessage( + __in BURN_USER_EXPERIENCE* pUserExperience, + __in BOOTSTRAPPER_APPLICATION_MESSAGE message, + __in const LPVOID pvArgs, + __inout LPVOID pvResults + ); + // function definitions @@ -97,7 +104,7 @@ extern "C" HRESULT UserExperienceLoad( args.pCommand = pCommand; args.pfnBootstrapperEngineProc = EngineForApplicationProc; args.pvBootstrapperEngineProcContext = pEngineContext; - args.qwEngineAPIVersion = MAKEQWORDVERSION(2020, 8, 31, 0); + args.qwEngineAPIVersion = MAKEQWORDVERSION(2020, 11, 17, 0); results.cbSize = sizeof(BOOTSTRAPPER_CREATE_RESULTS); @@ -308,7 +315,7 @@ EXTERN_C BAAPI UserExperienceOnApplyBegin( results.cbSize = sizeof(results); - hr = pUserExperience->pfnBAProc(BOOTSTRAPPER_APPLICATION_MESSAGE_ONAPPLYBEGIN, &args, &results, pUserExperience->pvBAProcContext); + hr = SendBAMessage(pUserExperience, BOOTSTRAPPER_APPLICATION_MESSAGE_ONAPPLYBEGIN, &args, &results); ExitOnFailure(hr, "BA OnApplyBegin failed."); if (results.fCancel) @@ -339,7 +346,7 @@ EXTERN_C BAAPI UserExperienceOnApplyComplete( results.cbSize = sizeof(results); results.action = *pAction; - hr = pUserExperience->pfnBAProc(BOOTSTRAPPER_APPLICATION_MESSAGE_ONAPPLYCOMPLETE, &args, &results, pUserExperience->pvBAProcContext); + hr = SendBAMessage(pUserExperience, BOOTSTRAPPER_APPLICATION_MESSAGE_ONAPPLYCOMPLETE, &args, &results); ExitOnFailure(hr, "BA OnApplyComplete failed."); *pAction = results.action; @@ -362,7 +369,7 @@ EXTERN_C BAAPI UserExperienceOnBeginMsiTransactionBegin( results.cbSize = sizeof(results); - hr = pUserExperience->pfnBAProc(BOOTSTRAPPER_APPLICATION_MESSAGE_ONBEGINMSITRANSACTIONBEGIN, &args, &results, pUserExperience->pvBAProcContext); + hr = SendBAMessage(pUserExperience, BOOTSTRAPPER_APPLICATION_MESSAGE_ONBEGINMSITRANSACTIONBEGIN, &args, &results); ExitOnFailure(hr, "BA OnBeginMsiTransactionBegin failed."); if (results.fCancel) @@ -390,7 +397,7 @@ EXTERN_C BAAPI UserExperienceOnBeginMsiTransactionComplete( results.cbSize = sizeof(results); - hr = pUserExperience->pfnBAProc(BOOTSTRAPPER_APPLICATION_MESSAGE_ONBEGINMSITRANSACTIONCOMPLETE, &args, &results, pUserExperience->pvBAProcContext); + hr = SendBAMessage(pUserExperience, BOOTSTRAPPER_APPLICATION_MESSAGE_ONBEGINMSITRANSACTIONCOMPLETE, &args, &results); ExitOnFailure(hr, "BA OnBeginMsiTransactionComplete failed."); LExit: @@ -417,7 +424,7 @@ EXTERN_C BAAPI UserExperienceOnCacheAcquireBegin( results.cbSize = sizeof(results); - hr = pUserExperience->pfnBAProc(BOOTSTRAPPER_APPLICATION_MESSAGE_ONCACHEACQUIREBEGIN, &args, &results, pUserExperience->pvBAProcContext); + hr = SendBAMessage(pUserExperience, BOOTSTRAPPER_APPLICATION_MESSAGE_ONCACHEACQUIREBEGIN, &args, &results); ExitOnFailure(hr, "BA OnCacheAcquireBegin failed."); if (results.fCancel) @@ -450,7 +457,7 @@ EXTERN_C BAAPI UserExperienceOnCacheAcquireComplete( results.cbSize = sizeof(results); results.action = args.recommendation; - hr = pUserExperience->pfnBAProc(BOOTSTRAPPER_APPLICATION_MESSAGE_ONCACHEACQUIRECOMPLETE, &args, &results, pUserExperience->pvBAProcContext); + hr = SendBAMessage(pUserExperience, BOOTSTRAPPER_APPLICATION_MESSAGE_ONCACHEACQUIRECOMPLETE, &args, &results); ExitOnFailure(hr, "BA OnCacheAcquireComplete failed."); if (FAILED(hrStatus)) @@ -484,7 +491,7 @@ EXTERN_C BAAPI UserExperienceOnCacheAcquireProgress( results.cbSize = sizeof(results); - hr = pUserExperience->pfnBAProc(BOOTSTRAPPER_APPLICATION_MESSAGE_ONCACHEACQUIREPROGRESS, &args, &results, pUserExperience->pvBAProcContext); + hr = SendBAMessage(pUserExperience, BOOTSTRAPPER_APPLICATION_MESSAGE_ONCACHEACQUIREPROGRESS, &args, &results); ExitOnFailure(hr, "BA OnCacheAcquireProgress failed."); if (results.fCancel) @@ -508,7 +515,7 @@ EXTERN_C BAAPI UserExperienceOnCacheBegin( results.cbSize = sizeof(results); - hr = pUserExperience->pfnBAProc(BOOTSTRAPPER_APPLICATION_MESSAGE_ONCACHEBEGIN, &args, &results, pUserExperience->pvBAProcContext); + hr = SendBAMessage(pUserExperience, BOOTSTRAPPER_APPLICATION_MESSAGE_ONCACHEBEGIN, &args, &results); ExitOnFailure(hr, "BA OnCacheBegin failed."); if (results.fCancel) @@ -534,7 +541,7 @@ EXTERN_C BAAPI UserExperienceOnCacheComplete( results.cbSize = sizeof(results); - hr = pUserExperience->pfnBAProc(BOOTSTRAPPER_APPLICATION_MESSAGE_ONCACHECOMPLETE, &args, &results, pUserExperience->pvBAProcContext); + hr = SendBAMessage(pUserExperience, BOOTSTRAPPER_APPLICATION_MESSAGE_ONCACHECOMPLETE, &args, &results); ExitOnFailure(hr, "BA OnCacheComplete failed."); LExit: @@ -559,7 +566,7 @@ EXTERN_C BAAPI UserExperienceOnCachePackageBegin( results.cbSize = sizeof(results); - hr = pUserExperience->pfnBAProc(BOOTSTRAPPER_APPLICATION_MESSAGE_ONCACHEPACKAGEBEGIN, &args, &results, pUserExperience->pvBAProcContext); + hr = SendBAMessage(pUserExperience, BOOTSTRAPPER_APPLICATION_MESSAGE_ONCACHEPACKAGEBEGIN, &args, &results); ExitOnFailure(hr, "BA OnCachePackageBegin failed."); if (results.fCancel) @@ -590,7 +597,7 @@ EXTERN_C BAAPI UserExperienceOnCachePackageComplete( results.cbSize = sizeof(results); results.action = *pAction; - hr = pUserExperience->pfnBAProc(BOOTSTRAPPER_APPLICATION_MESSAGE_ONCACHEPACKAGECOMPLETE, &args, &results, pUserExperience->pvBAProcContext); + hr = SendBAMessage(pUserExperience, BOOTSTRAPPER_APPLICATION_MESSAGE_ONCACHEPACKAGECOMPLETE, &args, &results); ExitOnFailure(hr, "BA OnCachePackageComplete failed."); if (FAILED(hrStatus)) @@ -618,7 +625,7 @@ EXTERN_C BAAPI UserExperienceOnCacheVerifyBegin( results.cbSize = sizeof(results); - hr = pUserExperience->pfnBAProc(BOOTSTRAPPER_APPLICATION_MESSAGE_ONCACHEVERIFYBEGIN, &args, &results, pUserExperience->pvBAProcContext); + hr = SendBAMessage(pUserExperience, BOOTSTRAPPER_APPLICATION_MESSAGE_ONCACHEVERIFYBEGIN, &args, &results); ExitOnFailure(hr, "BA OnCacheVerifyBegin failed."); if (results.fCancel) @@ -651,7 +658,7 @@ EXTERN_C BAAPI UserExperienceOnCacheVerifyComplete( results.cbSize = sizeof(results); results.action = *pAction; - hr = pUserExperience->pfnBAProc(BOOTSTRAPPER_APPLICATION_MESSAGE_ONCACHEVERIFYCOMPLETE, &args, &results, pUserExperience->pvBAProcContext); + hr = SendBAMessage(pUserExperience, BOOTSTRAPPER_APPLICATION_MESSAGE_ONCACHEVERIFYCOMPLETE, &args, &results); ExitOnFailure(hr, "BA OnCacheVerifyComplete failed."); if (FAILED(hrStatus)) @@ -677,7 +684,7 @@ EXTERN_C BAAPI UserExperienceOnCommitMsiTransactionBegin( results.cbSize = sizeof(results); - hr = pUserExperience->pfnBAProc(BOOTSTRAPPER_APPLICATION_MESSAGE_ONCOMMITMSITRANSACTIONBEGIN, &args, &results, pUserExperience->pvBAProcContext); + hr = SendBAMessage(pUserExperience, BOOTSTRAPPER_APPLICATION_MESSAGE_ONCOMMITMSITRANSACTIONBEGIN, &args, &results); ExitOnFailure(hr, "BA OnCommitMsiTransactionBegin failed."); if (results.fCancel) @@ -705,7 +712,7 @@ EXTERN_C BAAPI UserExperienceOnCommitMsiTransactionComplete( results.cbSize = sizeof(results); - hr = pUserExperience->pfnBAProc(BOOTSTRAPPER_APPLICATION_MESSAGE_ONCOMMITMSITRANSACTIONCOMPLETE, &args, &results, pUserExperience->pvBAProcContext); + hr = SendBAMessage(pUserExperience, BOOTSTRAPPER_APPLICATION_MESSAGE_ONCOMMITMSITRANSACTIONCOMPLETE, &args, &results); ExitOnFailure(hr, "BA OnCommitMsiTransactionComplete failed."); LExit: @@ -728,7 +735,7 @@ EXTERN_C BAAPI UserExperienceOnDetectBegin( results.cbSize = sizeof(results); - hr = pUserExperience->pfnBAProc(BOOTSTRAPPER_APPLICATION_MESSAGE_ONDETECTBEGIN, &args, &results, pUserExperience->pvBAProcContext); + hr = SendBAMessage(pUserExperience, BOOTSTRAPPER_APPLICATION_MESSAGE_ONDETECTBEGIN, &args, &results); ExitOnFailure(hr, "BA OnDetectBegin failed."); if (results.fCancel) @@ -758,7 +765,7 @@ EXTERN_C BAAPI UserExperienceOnDetectCompatibleMsiPackage( results.cbSize = sizeof(results); - hr = pUserExperience->pfnBAProc(BOOTSTRAPPER_APPLICATION_MESSAGE_ONDETECTCOMPATIBLEMSIPACKAGE, &args, &results, pUserExperience->pvBAProcContext); + hr = SendBAMessage(pUserExperience, BOOTSTRAPPER_APPLICATION_MESSAGE_ONDETECTCOMPATIBLEMSIPACKAGE, &args, &results); ExitOnFailure(hr, "BA OnDetectCompatibleMsiPackage failed."); if (results.fCancel) @@ -784,7 +791,7 @@ EXTERN_C BAAPI UserExperienceOnDetectComplete( results.cbSize = sizeof(results); - hr = pUserExperience->pfnBAProc(BOOTSTRAPPER_APPLICATION_MESSAGE_ONDETECTCOMPLETE, &args, &results, pUserExperience->pvBAProcContext); + hr = SendBAMessage(pUserExperience, BOOTSTRAPPER_APPLICATION_MESSAGE_ONDETECTCOMPLETE, &args, &results); ExitOnFailure(hr, "BA OnDetectComplete failed."); LExit: @@ -815,7 +822,7 @@ EXTERN_C BAAPI UserExperienceOnDetectForwardCompatibleBundle( results.cbSize = sizeof(results); results.fIgnoreBundle = *pfIgnoreBundle; - hr = pUserExperience->pfnBAProc(BOOTSTRAPPER_APPLICATION_MESSAGE_ONDETECTFORWARDCOMPATIBLEBUNDLE, &args, &results, pUserExperience->pvBAProcContext); + hr = SendBAMessage(pUserExperience, BOOTSTRAPPER_APPLICATION_MESSAGE_ONDETECTFORWARDCOMPATIBLEBUNDLE, &args, &results); ExitOnFailure(hr, "BA OnDetectForwardCompatibleBundle failed."); if (results.fCancel) @@ -846,7 +853,7 @@ EXTERN_C BAAPI UserExperienceOnDetectMsiFeature( results.cbSize = sizeof(results); - hr = pUserExperience->pfnBAProc(BOOTSTRAPPER_APPLICATION_MESSAGE_ONDETECTMSIFEATURE, &args, &results, pUserExperience->pvBAProcContext); + hr = SendBAMessage(pUserExperience, BOOTSTRAPPER_APPLICATION_MESSAGE_ONDETECTMSIFEATURE, &args, &results); ExitOnFailure(hr, "BA OnDetectMsiFeature failed."); if (results.fCancel) @@ -872,7 +879,7 @@ EXTERN_C BAAPI UserExperienceOnDetectPackageBegin( results.cbSize = sizeof(results); - hr = pUserExperience->pfnBAProc(BOOTSTRAPPER_APPLICATION_MESSAGE_ONDETECTPACKAGEBEGIN, &args, &results, pUserExperience->pvBAProcContext); + hr = SendBAMessage(pUserExperience, BOOTSTRAPPER_APPLICATION_MESSAGE_ONDETECTPACKAGEBEGIN, &args, &results); ExitOnFailure(hr, "BA OnDetectPackageBegin failed."); if (results.fCancel) @@ -902,7 +909,7 @@ EXTERN_C BAAPI UserExperienceOnDetectPackageComplete( results.cbSize = sizeof(results); - hr = pUserExperience->pfnBAProc(BOOTSTRAPPER_APPLICATION_MESSAGE_ONDETECTPACKAGECOMPLETE, &args, &results, pUserExperience->pvBAProcContext); + hr = SendBAMessage(pUserExperience, BOOTSTRAPPER_APPLICATION_MESSAGE_ONDETECTPACKAGECOMPLETE, &args, &results); ExitOnFailure(hr, "BA OnDetectPackageComplete failed."); LExit: @@ -933,7 +940,7 @@ EXTERN_C BAAPI UserExperienceOnDetectRelatedBundle( results.cbSize = sizeof(results); - hr = pUserExperience->pfnBAProc(BOOTSTRAPPER_APPLICATION_MESSAGE_ONDETECTRELATEDBUNDLE, &args, &results, pUserExperience->pvBAProcContext); + hr = SendBAMessage(pUserExperience, BOOTSTRAPPER_APPLICATION_MESSAGE_ONDETECTRELATEDBUNDLE, &args, &results); ExitOnFailure(hr, "BA OnDetectRelatedBundle failed."); if (results.fCancel) @@ -969,7 +976,7 @@ EXTERN_C BAAPI UserExperienceOnDetectRelatedMsiPackage( results.cbSize = sizeof(results); - hr = pUserExperience->pfnBAProc(BOOTSTRAPPER_APPLICATION_MESSAGE_ONDETECTRELATEDMSIPACKAGE, &args, &results, pUserExperience->pvBAProcContext); + hr = SendBAMessage(pUserExperience, BOOTSTRAPPER_APPLICATION_MESSAGE_ONDETECTRELATEDMSIPACKAGE, &args, &results); ExitOnFailure(hr, "BA OnDetectRelatedMsiPackage failed."); if (results.fCancel) @@ -999,7 +1006,7 @@ EXTERN_C BAAPI UserExperienceOnDetectTargetMsiPackage( results.cbSize = sizeof(results); - hr = pUserExperience->pfnBAProc(BOOTSTRAPPER_APPLICATION_MESSAGE_ONDETECTTARGETMSIPACKAGE, &args, &results, pUserExperience->pvBAProcContext); + hr = SendBAMessage(pUserExperience, BOOTSTRAPPER_APPLICATION_MESSAGE_ONDETECTTARGETMSIPACKAGE, &args, &results); ExitOnFailure(hr, "BA OnDetectTargetMsiPackage failed."); if (results.fCancel) @@ -1039,7 +1046,7 @@ EXTERN_C BAAPI UserExperienceOnDetectUpdate( results.cbSize = sizeof(results); results.fStopProcessingUpdates = *pfStopProcessingUpdates; - hr = pUserExperience->pfnBAProc(BOOTSTRAPPER_APPLICATION_MESSAGE_ONDETECTUPDATE, &args, &results, pUserExperience->pvBAProcContext); + hr = SendBAMessage(pUserExperience, BOOTSTRAPPER_APPLICATION_MESSAGE_ONDETECTUPDATE, &args, &results); ExitOnFailure(hr, "BA OnDetectUpdate failed."); if (results.fCancel) @@ -1068,7 +1075,7 @@ EXTERN_C BAAPI UserExperienceOnDetectUpdateBegin( results.cbSize = sizeof(results); results.fSkip = *pfSkip; - hr = pUserExperience->pfnBAProc(BOOTSTRAPPER_APPLICATION_MESSAGE_ONDETECTUPDATEBEGIN, &args, &results, pUserExperience->pvBAProcContext); + hr = SendBAMessage(pUserExperience, BOOTSTRAPPER_APPLICATION_MESSAGE_ONDETECTUPDATEBEGIN, &args, &results); ExitOnFailure(hr, "BA OnDetectUpdateBegin failed."); if (results.fCancel) @@ -1097,7 +1104,7 @@ EXTERN_C BAAPI UserExperienceOnDetectUpdateComplete( results.cbSize = sizeof(results); results.fIgnoreError = *pfIgnoreError; - hr = pUserExperience->pfnBAProc(BOOTSTRAPPER_APPLICATION_MESSAGE_ONDETECTUPDATECOMPLETE, &args, &results, pUserExperience->pvBAProcContext); + hr = SendBAMessage(pUserExperience, BOOTSTRAPPER_APPLICATION_MESSAGE_ONDETECTUPDATECOMPLETE, &args, &results); ExitOnFailure(hr, "BA OnDetectUpdateComplete failed."); if (FAILED(hrStatus)) @@ -1121,7 +1128,7 @@ EXTERN_C BAAPI UserExperienceOnElevateBegin( results.cbSize = sizeof(results); - hr = pUserExperience->pfnBAProc(BOOTSTRAPPER_APPLICATION_MESSAGE_ONELEVATEBEGIN, &args, &results, pUserExperience->pvBAProcContext); + hr = SendBAMessage(pUserExperience, BOOTSTRAPPER_APPLICATION_MESSAGE_ONELEVATEBEGIN, &args, &results); ExitOnFailure(hr, "BA OnElevateBegin failed."); if (results.fCancel) @@ -1147,7 +1154,7 @@ EXTERN_C BAAPI UserExperienceOnElevateComplete( results.cbSize = sizeof(results); - hr = pUserExperience->pfnBAProc(BOOTSTRAPPER_APPLICATION_MESSAGE_ONELEVATECOMPLETE, &args, &results, pUserExperience->pvBAProcContext); + hr = SendBAMessage(pUserExperience, BOOTSTRAPPER_APPLICATION_MESSAGE_ONELEVATECOMPLETE, &args, &results); ExitOnFailure(hr, "BA OnElevateComplete failed."); LExit: @@ -1183,7 +1190,7 @@ EXTERN_C BAAPI UserExperienceOnError( results.cbSize = sizeof(results); results.nResult = *pnResult; - hr = pUserExperience->pfnBAProc(BOOTSTRAPPER_APPLICATION_MESSAGE_ONERROR, &args, &results, pUserExperience->pvBAProcContext); + hr = SendBAMessage(pUserExperience, BOOTSTRAPPER_APPLICATION_MESSAGE_ONERROR, &args, &results); ExitOnFailure(hr, "BA OnError failed."); *pnResult = results.nResult; @@ -1206,7 +1213,7 @@ EXTERN_C BAAPI UserExperienceOnExecuteBegin( results.cbSize = sizeof(results); - hr = pUserExperience->pfnBAProc(BOOTSTRAPPER_APPLICATION_MESSAGE_ONEXECUTEBEGIN, &args, &results, pUserExperience->pvBAProcContext); + hr = SendBAMessage(pUserExperience, BOOTSTRAPPER_APPLICATION_MESSAGE_ONEXECUTEBEGIN, &args, &results); ExitOnFailure(hr, "BA OnExecuteBegin failed."); if (results.fCancel) @@ -1232,7 +1239,7 @@ EXTERN_C BAAPI UserExperienceOnExecuteComplete( results.cbSize = sizeof(results); - hr = pUserExperience->pfnBAProc(BOOTSTRAPPER_APPLICATION_MESSAGE_ONEXECUTECOMPLETE, &args, &results, pUserExperience->pvBAProcContext); + hr = SendBAMessage(pUserExperience, BOOTSTRAPPER_APPLICATION_MESSAGE_ONEXECUTECOMPLETE, &args, &results); ExitOnFailure(hr, "BA OnExecuteComplete failed."); LExit: @@ -1260,7 +1267,7 @@ EXTERN_C BAAPI UserExperienceOnExecuteFilesInUse( results.cbSize = sizeof(results); results.nResult = *pnResult; - hr = pUserExperience->pfnBAProc(BOOTSTRAPPER_APPLICATION_MESSAGE_ONEXECUTEFILESINUSE, &args, &results, pUserExperience->pvBAProcContext); + hr = SendBAMessage(pUserExperience, BOOTSTRAPPER_APPLICATION_MESSAGE_ONEXECUTEFILESINUSE, &args, &results); ExitOnFailure(hr, "BA OnExecuteFilesInUse failed."); *pnResult = results.nResult; @@ -1296,7 +1303,7 @@ EXTERN_C BAAPI UserExperienceOnExecuteMsiMessage( results.cbSize = sizeof(results); results.nResult = *pnResult; - hr = pUserExperience->pfnBAProc(BOOTSTRAPPER_APPLICATION_MESSAGE_ONEXECUTEMSIMESSAGE, &args, &results, pUserExperience->pvBAProcContext); + hr = SendBAMessage(pUserExperience, BOOTSTRAPPER_APPLICATION_MESSAGE_ONEXECUTEMSIMESSAGE, &args, &results); ExitOnFailure(hr, "BA OnExecuteMsiMessage failed."); *pnResult = results.nResult; @@ -1327,7 +1334,7 @@ EXTERN_C BAAPI UserExperienceOnExecutePackageBegin( results.cbSize = sizeof(results); - hr = pUserExperience->pfnBAProc(BOOTSTRAPPER_APPLICATION_MESSAGE_ONEXECUTEPACKAGEBEGIN, &args, &results, pUserExperience->pvBAProcContext); + hr = SendBAMessage(pUserExperience, BOOTSTRAPPER_APPLICATION_MESSAGE_ONEXECUTEPACKAGEBEGIN, &args, &results); ExitOnFailure(hr, "BA OnExecutePackageBegin failed."); if (results.fCancel) @@ -1360,7 +1367,7 @@ EXTERN_C BAAPI UserExperienceOnExecutePackageComplete( results.cbSize = sizeof(results); results.action = *pAction; - hr = pUserExperience->pfnBAProc(BOOTSTRAPPER_APPLICATION_MESSAGE_ONEXECUTEPACKAGECOMPLETE, &args, &results, pUserExperience->pvBAProcContext); + hr = SendBAMessage(pUserExperience, BOOTSTRAPPER_APPLICATION_MESSAGE_ONEXECUTEPACKAGECOMPLETE, &args, &results); ExitOnFailure(hr, "BA OnExecutePackageComplete failed."); *pAction = results.action; @@ -1385,7 +1392,7 @@ EXTERN_C BAAPI UserExperienceOnExecutePatchTarget( results.cbSize = sizeof(results); - hr = pUserExperience->pfnBAProc(BOOTSTRAPPER_APPLICATION_MESSAGE_ONEXECUTEPATCHTARGET, &args, &results, pUserExperience->pvBAProcContext); + hr = SendBAMessage(pUserExperience, BOOTSTRAPPER_APPLICATION_MESSAGE_ONEXECUTEPATCHTARGET, &args, &results); ExitOnFailure(hr, "BA OnExecutePatchTarget failed."); if (results.fCancel) @@ -1416,7 +1423,7 @@ EXTERN_C BAAPI UserExperienceOnExecuteProgress( results.cbSize = sizeof(results); - hr = pUserExperience->pfnBAProc(BOOTSTRAPPER_APPLICATION_MESSAGE_ONEXECUTEPROGRESS, &args, &results, pUserExperience->pvBAProcContext); + hr = SendBAMessage(pUserExperience, BOOTSTRAPPER_APPLICATION_MESSAGE_ONEXECUTEPROGRESS, &args, &results); ExitOnFailure(hr, "BA OnExecuteProgress failed."); LExit: @@ -1447,7 +1454,7 @@ EXTERN_C BAAPI UserExperienceOnLaunchApprovedExeBegin( results.cbSize = sizeof(results); - hr = pUserExperience->pfnBAProc(BOOTSTRAPPER_APPLICATION_MESSAGE_ONLAUNCHAPPROVEDEXEBEGIN, &args, &results, pUserExperience->pvBAProcContext); + hr = SendBAMessage(pUserExperience, BOOTSTRAPPER_APPLICATION_MESSAGE_ONLAUNCHAPPROVEDEXEBEGIN, &args, &results); ExitOnFailure(hr, "BA OnLaunchApprovedExeBegin failed."); if (results.fCancel) @@ -1475,7 +1482,7 @@ EXTERN_C BAAPI UserExperienceOnLaunchApprovedExeComplete( results.cbSize = sizeof(results); - hr = pUserExperience->pfnBAProc(BOOTSTRAPPER_APPLICATION_MESSAGE_ONLAUNCHAPPROVEDEXECOMPLETE, &args, &results, pUserExperience->pvBAProcContext); + hr = SendBAMessage(pUserExperience, BOOTSTRAPPER_APPLICATION_MESSAGE_ONLAUNCHAPPROVEDEXECOMPLETE, &args, &results); ExitOnFailure(hr, "BA OnLaunchApprovedExeComplete failed."); LExit: @@ -1494,7 +1501,7 @@ EXTERN_C BAAPI UserExperienceOnPauseAUBegin( results.cbSize = sizeof(results); - hr = pUserExperience->pfnBAProc(BOOTSTRAPPER_APPLICATION_MESSAGE_ONPAUSEAUTOMATICUPDATESBEGIN, &args, &results, pUserExperience->pvBAProcContext); + hr = SendBAMessage(pUserExperience, BOOTSTRAPPER_APPLICATION_MESSAGE_ONPAUSEAUTOMATICUPDATESBEGIN, &args, &results); ExitOnFailure(hr, "BA OnPauseAUBegin failed."); LExit: @@ -1515,7 +1522,7 @@ EXTERN_C BAAPI UserExperienceOnPauseAUComplete( results.cbSize = sizeof(results); - hr = pUserExperience->pfnBAProc(BOOTSTRAPPER_APPLICATION_MESSAGE_ONPAUSEAUTOMATICUPDATESCOMPLETE, &args, &results, pUserExperience->pvBAProcContext); + hr = SendBAMessage(pUserExperience, BOOTSTRAPPER_APPLICATION_MESSAGE_ONPAUSEAUTOMATICUPDATESCOMPLETE, &args, &results); ExitOnFailure(hr, "BA OnPauseAUComplete failed."); LExit: @@ -1536,7 +1543,7 @@ EXTERN_C BAAPI UserExperienceOnPlanBegin( results.cbSize = sizeof(results); - hr = pUserExperience->pfnBAProc(BOOTSTRAPPER_APPLICATION_MESSAGE_ONPLANBEGIN, &args, &results, pUserExperience->pvBAProcContext); + hr = SendBAMessage(pUserExperience, BOOTSTRAPPER_APPLICATION_MESSAGE_ONPLANBEGIN, &args, &results); ExitOnFailure(hr, "BA OnPlanBegin failed."); if (results.fCancel) @@ -1569,7 +1576,7 @@ EXTERN_C BAAPI UserExperienceOnPlanCompatibleMsiPackageBegin( results.cbSize = sizeof(results); results.requestedState = *pRequestedState; - hr = pUserExperience->pfnBAProc(BOOTSTRAPPER_APPLICATION_MESSAGE_ONPLANCOMPATIBLEMSIPACKAGEBEGIN, &args, &results, pUserExperience->pvBAProcContext); + hr = SendBAMessage(pUserExperience, BOOTSTRAPPER_APPLICATION_MESSAGE_ONPLANCOMPATIBLEMSIPACKAGEBEGIN, &args, &results); ExitOnFailure(hr, "BA OnPlanCompatibleMsiPackageBegin failed."); if (results.fCancel) @@ -1608,7 +1615,7 @@ EXTERN_C BAAPI UserExperienceOnPlanCompatibleMsiPackageComplete( results.cbSize = sizeof(results); - hr = pUserExperience->pfnBAProc(BOOTSTRAPPER_APPLICATION_MESSAGE_ONPLANCOMPATIBLEMSIPACKAGECOMPLETE, &args, &results, pUserExperience->pvBAProcContext); + hr = SendBAMessage(pUserExperience, BOOTSTRAPPER_APPLICATION_MESSAGE_ONPLANCOMPATIBLEMSIPACKAGECOMPLETE, &args, &results); ExitOnFailure(hr, "BA OnPlanCompatibleMsiPackageComplete failed."); LExit: @@ -1634,7 +1641,7 @@ EXTERN_C BAAPI UserExperienceOnPlanMsiFeature( results.cbSize = sizeof(results); results.requestedState = *pRequestedState; - hr = pUserExperience->pfnBAProc(BOOTSTRAPPER_APPLICATION_MESSAGE_ONPLANMSIFEATURE, &args, &results, pUserExperience->pvBAProcContext); + hr = SendBAMessage(pUserExperience, BOOTSTRAPPER_APPLICATION_MESSAGE_ONPLANMSIFEATURE, &args, &results); ExitOnFailure(hr, "BA OnPlanMsiFeature failed."); if (results.fCancel) @@ -1661,7 +1668,7 @@ EXTERN_C BAAPI UserExperienceOnPlanComplete( results.cbSize = sizeof(results); - hr = pUserExperience->pfnBAProc(BOOTSTRAPPER_APPLICATION_MESSAGE_ONPLANCOMPLETE, &args, &results, pUserExperience->pvBAProcContext); + hr = SendBAMessage(pUserExperience, BOOTSTRAPPER_APPLICATION_MESSAGE_ONPLANCOMPLETE, &args, &results); ExitOnFailure(hr, "BA OnPlanComplete failed."); LExit: @@ -1692,7 +1699,7 @@ EXTERN_C BAAPI UserExperienceOnPlanMsiPackage( results.uiLevel = *pUiLevel; results.fDisableExternalUiHandler = *pfDisableExternalUiHandler; - hr = pUserExperience->pfnBAProc(BOOTSTRAPPER_APPLICATION_MESSAGE_ONPLANMSIPACKAGE, &args, &results, pUserExperience->pvBAProcContext); + hr = SendBAMessage(pUserExperience, BOOTSTRAPPER_APPLICATION_MESSAGE_ONPLANMSIPACKAGE, &args, &results); ExitOnFailure(hr, "BA OnPlanMsiPackage failed."); if (results.fCancel) @@ -1724,7 +1731,7 @@ EXTERN_C BAAPI UserExperienceOnPlanPackageBegin( results.cbSize = sizeof(results); results.requestedState = *pRequestedState; - hr = pUserExperience->pfnBAProc(BOOTSTRAPPER_APPLICATION_MESSAGE_ONPLANPACKAGEBEGIN, &args, &results, pUserExperience->pvBAProcContext); + hr = SendBAMessage(pUserExperience, BOOTSTRAPPER_APPLICATION_MESSAGE_ONPLANPACKAGEBEGIN, &args, &results); ExitOnFailure(hr, "BA OnPlanPackageBegin failed."); if (results.fCancel) @@ -1761,7 +1768,7 @@ EXTERN_C BAAPI UserExperienceOnPlanPackageComplete( results.cbSize = sizeof(results); - hr = pUserExperience->pfnBAProc(BOOTSTRAPPER_APPLICATION_MESSAGE_ONPLANPACKAGECOMPLETE, &args, &results, pUserExperience->pvBAProcContext); + hr = SendBAMessage(pUserExperience, BOOTSTRAPPER_APPLICATION_MESSAGE_ONPLANPACKAGECOMPLETE, &args, &results); ExitOnFailure(hr, "BA OnPlanPackageComplete failed."); LExit: @@ -1785,7 +1792,7 @@ EXTERN_C BAAPI UserExperienceOnPlanRelatedBundle( results.cbSize = sizeof(results); results.requestedState = *pRequestedState; - hr = pUserExperience->pfnBAProc(BOOTSTRAPPER_APPLICATION_MESSAGE_ONPLANRELATEDBUNDLE, &args, &results, pUserExperience->pvBAProcContext); + hr = SendBAMessage(pUserExperience, BOOTSTRAPPER_APPLICATION_MESSAGE_ONPLANRELATEDBUNDLE, &args, &results); ExitOnFailure(hr, "BA OnPlanRelatedBundle failed."); if (results.fCancel) @@ -1817,7 +1824,7 @@ EXTERN_C BAAPI UserExperienceOnPlanTargetMsiPackage( results.cbSize = sizeof(results); results.requestedState = *pRequestedState; - hr = pUserExperience->pfnBAProc(BOOTSTRAPPER_APPLICATION_MESSAGE_ONPLANTARGETMSIPACKAGE, &args, &results, pUserExperience->pvBAProcContext); + hr = SendBAMessage(pUserExperience, BOOTSTRAPPER_APPLICATION_MESSAGE_ONPLANTARGETMSIPACKAGE, &args, &results); ExitOnFailure(hr, "BA OnPlanTargetMsiPackage failed."); if (results.fCancel) @@ -1847,7 +1854,7 @@ EXTERN_C BAAPI UserExperienceOnProgress( results.cbSize = sizeof(results); - hr = pUserExperience->pfnBAProc(BOOTSTRAPPER_APPLICATION_MESSAGE_ONPROGRESS, &args, &results, pUserExperience->pvBAProcContext); + hr = SendBAMessage(pUserExperience, BOOTSTRAPPER_APPLICATION_MESSAGE_ONPROGRESS, &args, &results); hr = FilterExecuteResult(pUserExperience, hr, fRollback, results.fCancel, L"OnProgress"); return hr; @@ -1865,7 +1872,7 @@ EXTERN_C BAAPI UserExperienceOnRegisterBegin( results.cbSize = sizeof(results); - hr = pUserExperience->pfnBAProc(BOOTSTRAPPER_APPLICATION_MESSAGE_ONREGISTERBEGIN, &args, &results, pUserExperience->pvBAProcContext); + hr = SendBAMessage(pUserExperience, BOOTSTRAPPER_APPLICATION_MESSAGE_ONREGISTERBEGIN, &args, &results); ExitOnFailure(hr, "BA OnRegisterBegin failed."); if (results.fCancel) @@ -1891,7 +1898,7 @@ EXTERN_C BAAPI UserExperienceOnRegisterComplete( results.cbSize = sizeof(results); - hr = pUserExperience->pfnBAProc(BOOTSTRAPPER_APPLICATION_MESSAGE_ONREGISTERCOMPLETE, &args, &results, pUserExperience->pvBAProcContext); + hr = SendBAMessage(pUserExperience, BOOTSTRAPPER_APPLICATION_MESSAGE_ONREGISTERCOMPLETE, &args, &results); ExitOnFailure(hr, "BA OnRegisterComplete failed."); LExit: @@ -1921,7 +1928,7 @@ EXTERN_C BAAPI UserExperienceOnResolveSource( results.cbSize = sizeof(results); results.action = *pAction; - hr = pUserExperience->pfnBAProc(BOOTSTRAPPER_APPLICATION_MESSAGE_ONRESOLVESOURCE, &args, &results, pUserExperience->pvBAProcContext); + hr = SendBAMessage(pUserExperience, BOOTSTRAPPER_APPLICATION_MESSAGE_ONRESOLVESOURCE, &args, &results); ExitOnFailure(hr, "BA OnResolveSource failed."); if (results.fCancel) @@ -1951,7 +1958,7 @@ EXTERN_C BAAPI UserExperienceOnRollbackMsiTransactionBegin( results.cbSize = sizeof(results); - hr = pUserExperience->pfnBAProc(BOOTSTRAPPER_APPLICATION_MESSAGE_ONROLLBACKMSITRANSACTIONBEGIN, &args, &results, pUserExperience->pvBAProcContext); + hr = SendBAMessage(pUserExperience, BOOTSTRAPPER_APPLICATION_MESSAGE_ONROLLBACKMSITRANSACTIONBEGIN, &args, &results); ExitOnFailure(hr, "BA OnRollbackMsiTransactionBegin failed."); LExit: @@ -1974,7 +1981,7 @@ EXTERN_C BAAPI UserExperienceOnRollbackMsiTransactionComplete( results.cbSize = sizeof(results); - hr = pUserExperience->pfnBAProc(BOOTSTRAPPER_APPLICATION_MESSAGE_ONROLLBACKMSITRANSACTIONCOMPLETE, &args, &results, pUserExperience->pvBAProcContext); + hr = SendBAMessage(pUserExperience, BOOTSTRAPPER_APPLICATION_MESSAGE_ONROLLBACKMSITRANSACTIONCOMPLETE, &args, &results); ExitOnFailure(hr, "BA OnRollbackMsiTransactionComplete failed."); LExit: @@ -1995,7 +2002,7 @@ EXTERN_C BAAPI UserExperienceOnShutdown( results.cbSize = sizeof(results); results.action = *pAction; - hr = pUserExperience->pfnBAProc(BOOTSTRAPPER_APPLICATION_MESSAGE_ONSHUTDOWN, &args, &results, pUserExperience->pvBAProcContext); + hr = SendBAMessage(pUserExperience, BOOTSTRAPPER_APPLICATION_MESSAGE_ONSHUTDOWN, &args, &results); ExitOnFailure(hr, "BA OnShutdown failed."); *pAction = results.action; @@ -2016,7 +2023,7 @@ EXTERN_C BAAPI UserExperienceOnStartup( results.cbSize = sizeof(results); - hr = pUserExperience->pfnBAProc(BOOTSTRAPPER_APPLICATION_MESSAGE_ONSTARTUP, &args, &results, pUserExperience->pvBAProcContext); + hr = SendBAMessage(pUserExperience, BOOTSTRAPPER_APPLICATION_MESSAGE_ONSTARTUP, &args, &results); ExitOnFailure(hr, "BA OnStartup failed."); LExit: @@ -2035,7 +2042,7 @@ EXTERN_C BAAPI UserExperienceOnSystemRestorePointBegin( results.cbSize = sizeof(results); - hr = pUserExperience->pfnBAProc(BOOTSTRAPPER_APPLICATION_MESSAGE_ONSYSTEMRESTOREPOINTBEGIN, &args, &results, pUserExperience->pvBAProcContext); + hr = SendBAMessage(pUserExperience, BOOTSTRAPPER_APPLICATION_MESSAGE_ONSYSTEMRESTOREPOINTBEGIN, &args, &results); ExitOnFailure(hr, "BA OnSystemRestorePointBegin failed."); LExit: @@ -2056,7 +2063,7 @@ EXTERN_C BAAPI UserExperienceOnSystemRestorePointComplete( results.cbSize = sizeof(results); - hr = pUserExperience->pfnBAProc(BOOTSTRAPPER_APPLICATION_MESSAGE_ONSYSTEMRESTOREPOINTCOMPLETE, &args, &results, pUserExperience->pvBAProcContext); + hr = SendBAMessage(pUserExperience, BOOTSTRAPPER_APPLICATION_MESSAGE_ONSYSTEMRESTOREPOINTCOMPLETE, &args, &results); ExitOnFailure(hr, "BA OnSystemRestorePointComplete failed."); LExit: @@ -2079,7 +2086,7 @@ EXTERN_C BAAPI UserExperienceOnSystemShutdown( results.cbSize = sizeof(results); results.fCancel = *pfCancel; - hr = pUserExperience->pfnBAProc(BOOTSTRAPPER_APPLICATION_MESSAGE_ONSYSTEMSHUTDOWN, &args, &results, pUserExperience->pvBAProcContext); + hr = SendBAMessage(pUserExperience, BOOTSTRAPPER_APPLICATION_MESSAGE_ONSYSTEMSHUTDOWN, &args, &results); ExitOnFailure(hr, "BA OnSystemShutdown failed."); *pfCancel = results.fCancel; @@ -2100,7 +2107,7 @@ EXTERN_C BAAPI UserExperienceOnUnregisterBegin( results.cbSize = sizeof(results); - hr = pUserExperience->pfnBAProc(BOOTSTRAPPER_APPLICATION_MESSAGE_ONUNREGISTERBEGIN, &args, &results, pUserExperience->pvBAProcContext); + hr = SendBAMessage(pUserExperience, BOOTSTRAPPER_APPLICATION_MESSAGE_ONUNREGISTERBEGIN, &args, &results); ExitOnFailure(hr, "BA OnUnregisterBegin failed."); if (results.fCancel) @@ -2126,7 +2133,7 @@ EXTERN_C BAAPI UserExperienceOnUnregisterComplete( results.cbSize = sizeof(results); - hr = pUserExperience->pfnBAProc(BOOTSTRAPPER_APPLICATION_MESSAGE_ONUNREGISTERCOMPLETE, &args, &results, pUserExperience->pvBAProcContext); + hr = SendBAMessage(pUserExperience, BOOTSTRAPPER_APPLICATION_MESSAGE_ONUNREGISTERCOMPLETE, &args, &results); ExitOnFailure(hr, "BA OnUnregisterComplete failed."); LExit: @@ -2389,3 +2396,21 @@ static HRESULT FilterExecuteResult( LExit: return hr; } + +static HRESULT SendBAMessage( + __in BURN_USER_EXPERIENCE* pUserExperience, + __in BOOTSTRAPPER_APPLICATION_MESSAGE message, + __in const LPVOID pvArgs, + __inout LPVOID pvResults + ) +{ + HRESULT hr = S_OK; + + hr = pUserExperience->pfnBAProc(message, pvArgs, pvResults, pUserExperience->pvBAProcContext); + if (hr == E_NOTIMPL) + { + hr = S_OK; + } + + return hr; +} -- cgit v1.2.3-55-g6feb