diff options
| author | Sean Hall <r.sean.hall@gmail.com> | 2018-12-29 22:24:05 -0600 |
|---|---|---|
| committer | Sean Hall <r.sean.hall@gmail.com> | 2018-12-29 22:24:05 -0600 |
| commit | 60069b189db09521558b99827aee47fe3f81309b (patch) | |
| tree | 2e955a21999feea3497cd023b6798188b10f377a /src | |
| parent | 681527e7830ece6325e9a4e64008a7034cc44a25 (diff) | |
| download | wix-60069b189db09521558b99827aee47fe3f81309b.tar.gz wix-60069b189db09521558b99827aee47fe3f81309b.tar.bz2 wix-60069b189db09521558b99827aee47fe3f81309b.zip | |
Import code from old v4 repo
Diffstat (limited to 'src')
| -rw-r--r-- | src/balutil/BalBootstrapperEngine.cpp | 720 | ||||
| -rw-r--r-- | src/balutil/balcondition.cpp | 124 | ||||
| -rw-r--r-- | src/balutil/balinfo.cpp | 288 | ||||
| -rw-r--r-- | src/balutil/balretry.cpp | 191 | ||||
| -rw-r--r-- | src/balutil/balutil.cpp | 382 | ||||
| -rw-r--r-- | src/balutil/inc/BAFunctions.h | 130 | ||||
| -rw-r--r-- | src/balutil/inc/BalBaseBAFunctions.h | 700 | ||||
| -rw-r--r-- | src/balutil/inc/BalBaseBAFunctionsProc.h | 114 | ||||
| -rw-r--r-- | src/balutil/inc/BalBaseBootstrapperApplication.h | 900 | ||||
| -rw-r--r-- | src/balutil/inc/BalBaseBootstrapperApplicationProc.h | 698 | ||||
| -rw-r--r-- | src/balutil/inc/BalBootstrapperEngine.h | 17 | ||||
| -rw-r--r-- | src/balutil/inc/IBAFunctions.h | 34 | ||||
| -rw-r--r-- | src/balutil/inc/balcondition.h | 58 | ||||
| -rw-r--r-- | src/balutil/inc/balinfo.h | 107 | ||||
| -rw-r--r-- | src/balutil/inc/balretry.h | 65 | ||||
| -rw-r--r-- | src/balutil/inc/balutil.h | 165 | ||||
| -rw-r--r-- | src/balutil/precomp.h | 31 |
17 files changed, 4724 insertions, 0 deletions
diff --git a/src/balutil/BalBootstrapperEngine.cpp b/src/balutil/BalBootstrapperEngine.cpp new file mode 100644 index 00000000..945940c5 --- /dev/null +++ b/src/balutil/BalBootstrapperEngine.cpp | |||
| @@ -0,0 +1,720 @@ | |||
| 1 | // 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. | ||
| 2 | |||
| 3 | #include "precomp.h" | ||
| 4 | |||
| 5 | |||
| 6 | class CBalBootstrapperEngine : public IBootstrapperEngine, public IMarshal | ||
| 7 | { | ||
| 8 | public: // IUnknown | ||
| 9 | virtual STDMETHODIMP QueryInterface( | ||
| 10 | __in REFIID riid, | ||
| 11 | __out LPVOID *ppvObject | ||
| 12 | ) | ||
| 13 | { | ||
| 14 | if (!ppvObject) | ||
| 15 | { | ||
| 16 | return E_INVALIDARG; | ||
| 17 | } | ||
| 18 | |||
| 19 | *ppvObject = NULL; | ||
| 20 | |||
| 21 | if (::IsEqualIID(__uuidof(IBootstrapperEngine), riid)) | ||
| 22 | { | ||
| 23 | *ppvObject = static_cast<IBootstrapperEngine*>(this); | ||
| 24 | } | ||
| 25 | else if (::IsEqualIID(IID_IMarshal, riid)) | ||
| 26 | { | ||
| 27 | *ppvObject = static_cast<IMarshal*>(this); | ||
| 28 | } | ||
| 29 | else if (::IsEqualIID(IID_IUnknown, riid)) | ||
| 30 | { | ||
| 31 | *ppvObject = reinterpret_cast<IUnknown*>(this); | ||
| 32 | } | ||
| 33 | else // no interface for requested iid | ||
| 34 | { | ||
| 35 | return E_NOINTERFACE; | ||
| 36 | } | ||
| 37 | |||
| 38 | AddRef(); | ||
| 39 | return S_OK; | ||
| 40 | } | ||
| 41 | |||
| 42 | virtual STDMETHODIMP_(ULONG) AddRef() | ||
| 43 | { | ||
| 44 | return ::InterlockedIncrement(&this->m_cReferences); | ||
| 45 | } | ||
| 46 | |||
| 47 | virtual STDMETHODIMP_(ULONG) Release() | ||
| 48 | { | ||
| 49 | long l = ::InterlockedDecrement(&this->m_cReferences); | ||
| 50 | if (0 < l) | ||
| 51 | { | ||
| 52 | return l; | ||
| 53 | } | ||
| 54 | |||
| 55 | delete this; | ||
| 56 | return 0; | ||
| 57 | } | ||
| 58 | |||
| 59 | public: // IBootstrapperEngine | ||
| 60 | virtual STDMETHODIMP GetPackageCount( | ||
| 61 | __out DWORD* pcPackages | ||
| 62 | ) | ||
| 63 | { | ||
| 64 | HRESULT hr = S_OK; | ||
| 65 | BAENGINE_GETPACKAGECOUNT_ARGS args = { }; | ||
| 66 | BAENGINE_GETPACKAGECOUNT_RESULTS results = { }; | ||
| 67 | |||
| 68 | ExitOnNull(pcPackages, hr, E_INVALIDARG, "pcPackages is required"); | ||
| 69 | |||
| 70 | args.cbSize = sizeof(args); | ||
| 71 | |||
| 72 | results.cbSize = sizeof(results); | ||
| 73 | |||
| 74 | hr = m_pfnBAEngineProc(BOOTSTRAPPER_ENGINE_MESSAGE_GETPACKAGECOUNT, &args, &results, m_pvBAEngineProcContext); | ||
| 75 | |||
| 76 | *pcPackages = results.cPackages; | ||
| 77 | |||
| 78 | LExit: | ||
| 79 | return hr; | ||
| 80 | } | ||
| 81 | |||
| 82 | virtual STDMETHODIMP GetVariableNumeric( | ||
| 83 | __in_z LPCWSTR wzVariable, | ||
| 84 | __out LONGLONG* pllValue | ||
| 85 | ) | ||
| 86 | { | ||
| 87 | HRESULT hr = S_OK; | ||
| 88 | BAENGINE_GETVARIABLENUMERIC_ARGS args = { }; | ||
| 89 | BAENGINE_GETVARIABLENUMERIC_RESULTS results = { }; | ||
| 90 | |||
| 91 | ExitOnNull(pllValue, hr, E_INVALIDARG, "pllValue is required"); | ||
| 92 | |||
| 93 | args.cbSize = sizeof(args); | ||
| 94 | args.wzVariable = wzVariable; | ||
| 95 | |||
| 96 | results.cbSize = sizeof(results); | ||
| 97 | |||
| 98 | hr = m_pfnBAEngineProc(BOOTSTRAPPER_ENGINE_MESSAGE_GETVARIABLENUMERIC, &args, &results, m_pvBAEngineProcContext); | ||
| 99 | |||
| 100 | *pllValue = results.llValue; | ||
| 101 | |||
| 102 | LExit: | ||
| 103 | SecureZeroMemory(&results, sizeof(results)); | ||
| 104 | return hr; | ||
| 105 | } | ||
| 106 | |||
| 107 | virtual STDMETHODIMP GetVariableString( | ||
| 108 | __in_z LPCWSTR wzVariable, | ||
| 109 | __out_ecount_opt(*pcchValue) LPWSTR wzValue, | ||
| 110 | __inout DWORD* pcchValue | ||
| 111 | ) | ||
| 112 | { | ||
| 113 | HRESULT hr = S_OK; | ||
| 114 | BAENGINE_GETVARIABLESTRING_ARGS args = { }; | ||
| 115 | BAENGINE_GETVARIABLESTRING_RESULTS results = { }; | ||
| 116 | |||
| 117 | ExitOnNull(pcchValue, hr, E_INVALIDARG, "pcchValue is required"); | ||
| 118 | |||
| 119 | args.cbSize = sizeof(args); | ||
| 120 | args.wzVariable = wzVariable; | ||
| 121 | |||
| 122 | results.cbSize = sizeof(results); | ||
| 123 | results.wzValue = wzValue; | ||
| 124 | results.cchValue = *pcchValue; | ||
| 125 | |||
| 126 | hr = m_pfnBAEngineProc(BOOTSTRAPPER_ENGINE_MESSAGE_GETVARIABLESTRING, &args, &results, m_pvBAEngineProcContext); | ||
| 127 | |||
| 128 | *pcchValue = results.cchValue; | ||
| 129 | |||
| 130 | LExit: | ||
| 131 | return hr; | ||
| 132 | } | ||
| 133 | |||
| 134 | virtual STDMETHODIMP GetVariableVersion( | ||
| 135 | __in_z LPCWSTR wzVariable, | ||
| 136 | __out DWORD64* pqwValue | ||
| 137 | ) | ||
| 138 | { | ||
| 139 | HRESULT hr = S_OK; | ||
| 140 | BAENGINE_GETVARIABLEVERSION_ARGS args = { }; | ||
| 141 | BAENGINE_GETVARIABLEVERSION_RESULTS results = { }; | ||
| 142 | |||
| 143 | ExitOnNull(pqwValue, hr, E_INVALIDARG, "pqwValue is required"); | ||
| 144 | |||
| 145 | args.cbSize = sizeof(args); | ||
| 146 | args.wzVariable = wzVariable; | ||
| 147 | |||
| 148 | results.cbSize = sizeof(results); | ||
| 149 | |||
| 150 | hr = m_pfnBAEngineProc(BOOTSTRAPPER_ENGINE_MESSAGE_GETVARIABLEVERSION, &args, &results, m_pvBAEngineProcContext); | ||
| 151 | |||
| 152 | *pqwValue = results.qwValue; | ||
| 153 | |||
| 154 | LExit: | ||
| 155 | SecureZeroMemory(&results, sizeof(results)); | ||
| 156 | return hr; | ||
| 157 | } | ||
| 158 | |||
| 159 | virtual STDMETHODIMP FormatString( | ||
| 160 | __in_z LPCWSTR wzIn, | ||
| 161 | __out_ecount_opt(*pcchOut) LPWSTR wzOut, | ||
| 162 | __inout DWORD* pcchOut | ||
| 163 | ) | ||
| 164 | { | ||
| 165 | HRESULT hr = S_OK; | ||
| 166 | BAENGINE_FORMATSTRING_ARGS args = { }; | ||
| 167 | BAENGINE_FORMATSTRING_RESULTS results = { }; | ||
| 168 | |||
| 169 | ExitOnNull(pcchOut, hr, E_INVALIDARG, "pcchOut is required"); | ||
| 170 | |||
| 171 | args.cbSize = sizeof(args); | ||
| 172 | args.wzIn = wzIn; | ||
| 173 | |||
| 174 | results.cbSize = sizeof(results); | ||
| 175 | results.wzOut = wzOut; | ||
| 176 | results.cchOut = *pcchOut; | ||
| 177 | |||
| 178 | hr = m_pfnBAEngineProc(BOOTSTRAPPER_ENGINE_MESSAGE_FORMATSTRING, &args, &results, m_pvBAEngineProcContext); | ||
| 179 | |||
| 180 | *pcchOut = results.cchOut; | ||
| 181 | |||
| 182 | LExit: | ||
| 183 | return hr; | ||
| 184 | } | ||
| 185 | |||
| 186 | virtual STDMETHODIMP EscapeString( | ||
| 187 | __in_z LPCWSTR wzIn, | ||
| 188 | __out_ecount_opt(*pcchOut) LPWSTR wzOut, | ||
| 189 | __inout DWORD* pcchOut | ||
| 190 | ) | ||
| 191 | { | ||
| 192 | HRESULT hr = S_OK; | ||
| 193 | BAENGINE_ESCAPESTRING_ARGS args = { }; | ||
| 194 | BAENGINE_ESCAPESTRING_RESULTS results = { }; | ||
| 195 | |||
| 196 | ExitOnNull(pcchOut, hr, E_INVALIDARG, "pcchOut is required"); | ||
| 197 | |||
| 198 | args.cbSize = sizeof(args); | ||
| 199 | args.wzIn = wzIn; | ||
| 200 | |||
| 201 | results.cbSize = sizeof(results); | ||
| 202 | results.wzOut = wzOut; | ||
| 203 | results.cchOut = *pcchOut; | ||
| 204 | |||
| 205 | hr = m_pfnBAEngineProc(BOOTSTRAPPER_ENGINE_MESSAGE_ESCAPESTRING, &args, &results, m_pvBAEngineProcContext); | ||
| 206 | |||
| 207 | *pcchOut = results.cchOut; | ||
| 208 | |||
| 209 | LExit: | ||
| 210 | return hr; | ||
| 211 | } | ||
| 212 | |||
| 213 | virtual STDMETHODIMP EvaluateCondition( | ||
| 214 | __in_z LPCWSTR wzCondition, | ||
| 215 | __out BOOL* pf | ||
| 216 | ) | ||
| 217 | { | ||
| 218 | HRESULT hr = S_OK; | ||
| 219 | BAENGINE_EVALUATECONDITION_ARGS args = { }; | ||
| 220 | BAENGINE_EVALUATECONDITION_RESULTS results = { }; | ||
| 221 | |||
| 222 | ExitOnNull(pf, hr, E_INVALIDARG, "pf is required"); | ||
| 223 | |||
| 224 | args.cbSize = sizeof(args); | ||
| 225 | args.wzCondition = wzCondition; | ||
| 226 | |||
| 227 | results.cbSize = sizeof(results); | ||
| 228 | |||
| 229 | hr = m_pfnBAEngineProc(BOOTSTRAPPER_ENGINE_MESSAGE_EVALUATECONDITION, &args, &results, m_pvBAEngineProcContext); | ||
| 230 | |||
| 231 | *pf = results.f; | ||
| 232 | |||
| 233 | LExit: | ||
| 234 | return hr; | ||
| 235 | } | ||
| 236 | |||
| 237 | virtual STDMETHODIMP Log( | ||
| 238 | __in BOOTSTRAPPER_LOG_LEVEL level, | ||
| 239 | __in_z LPCWSTR wzMessage | ||
| 240 | ) | ||
| 241 | { | ||
| 242 | BAENGINE_LOG_ARGS args = { }; | ||
| 243 | BAENGINE_LOG_RESULTS results = { }; | ||
| 244 | |||
| 245 | args.cbSize = sizeof(args); | ||
| 246 | args.level = level; | ||
| 247 | args.wzMessage = wzMessage; | ||
| 248 | |||
| 249 | results.cbSize = sizeof(results); | ||
| 250 | |||
| 251 | return m_pfnBAEngineProc(BOOTSTRAPPER_ENGINE_MESSAGE_LOG, &args, &results, m_pvBAEngineProcContext); | ||
| 252 | } | ||
| 253 | |||
| 254 | virtual STDMETHODIMP SendEmbeddedError( | ||
| 255 | __in DWORD dwErrorCode, | ||
| 256 | __in_z_opt LPCWSTR wzMessage, | ||
| 257 | __in DWORD dwUIHint, | ||
| 258 | __out int* pnResult | ||
| 259 | ) | ||
| 260 | { | ||
| 261 | HRESULT hr = S_OK; | ||
| 262 | BAENGINE_SENDEMBEDDEDERROR_ARGS args = { }; | ||
| 263 | BAENGINE_SENDEMBEDDEDERROR_RESULTS results = { }; | ||
| 264 | |||
| 265 | ExitOnNull(pnResult, hr, E_INVALIDARG, "pnResult is required"); | ||
| 266 | |||
| 267 | args.cbSize = sizeof(args); | ||
| 268 | args.dwErrorCode = dwErrorCode; | ||
| 269 | args.wzMessage = wzMessage; | ||
| 270 | args.dwUIHint = dwUIHint; | ||
| 271 | |||
| 272 | results.cbSize = sizeof(results); | ||
| 273 | |||
| 274 | hr = m_pfnBAEngineProc(BOOTSTRAPPER_ENGINE_MESSAGE_SENDEMBEDDEDERROR, &args, &results, m_pvBAEngineProcContext); | ||
| 275 | |||
| 276 | *pnResult = results.nResult; | ||
| 277 | |||
| 278 | LExit: | ||
| 279 | return hr; | ||
| 280 | } | ||
| 281 | |||
| 282 | virtual STDMETHODIMP SendEmbeddedProgress( | ||
| 283 | __in DWORD dwProgressPercentage, | ||
| 284 | __in DWORD dwOverallProgressPercentage, | ||
| 285 | __out int* pnResult | ||
| 286 | ) | ||
| 287 | { | ||
| 288 | HRESULT hr = S_OK; | ||
| 289 | BAENGINE_SENDEMBEDDEDPROGRESS_ARGS args = { }; | ||
| 290 | BAENGINE_SENDEMBEDDEDPROGRESS_RESULTS results = { }; | ||
| 291 | |||
| 292 | ExitOnNull(pnResult, hr, E_INVALIDARG, "pnResult is required"); | ||
| 293 | |||
| 294 | args.cbSize = sizeof(args); | ||
| 295 | args.dwProgressPercentage = dwProgressPercentage; | ||
| 296 | args.dwOverallProgressPercentage = dwOverallProgressPercentage; | ||
| 297 | |||
| 298 | results.cbSize = sizeof(results); | ||
| 299 | |||
| 300 | hr = m_pfnBAEngineProc(BOOTSTRAPPER_ENGINE_MESSAGE_SENDEMBEDDEDPROGRESS, &args, &results, m_pvBAEngineProcContext); | ||
| 301 | |||
| 302 | *pnResult = results.nResult; | ||
| 303 | |||
| 304 | LExit: | ||
| 305 | return hr; | ||
| 306 | } | ||
| 307 | |||
| 308 | virtual STDMETHODIMP SetUpdate( | ||
| 309 | __in_z_opt LPCWSTR wzLocalSource, | ||
| 310 | __in_z_opt LPCWSTR wzDownloadSource, | ||
| 311 | __in DWORD64 qwSize, | ||
| 312 | __in BOOTSTRAPPER_UPDATE_HASH_TYPE hashType, | ||
| 313 | __in_bcount_opt(cbHash) BYTE* rgbHash, | ||
| 314 | __in DWORD cbHash | ||
| 315 | ) | ||
| 316 | { | ||
| 317 | BAENGINE_SETUPDATE_ARGS args = { }; | ||
| 318 | BAENGINE_SETUPDATE_RESULTS results = { }; | ||
| 319 | |||
| 320 | args.cbSize = sizeof(args); | ||
| 321 | args.wzLocalSource = wzLocalSource; | ||
| 322 | args.wzDownloadSource = wzDownloadSource; | ||
| 323 | args.qwSize = qwSize; | ||
| 324 | args.hashType = hashType; | ||
| 325 | args.rgbHash = rgbHash; | ||
| 326 | args.cbHash = cbHash; | ||
| 327 | |||
| 328 | results.cbSize = sizeof(results); | ||
| 329 | |||
| 330 | return m_pfnBAEngineProc(BOOTSTRAPPER_ENGINE_MESSAGE_SETUPDATE, &args, &results, m_pvBAEngineProcContext); | ||
| 331 | } | ||
| 332 | |||
| 333 | virtual STDMETHODIMP SetLocalSource( | ||
| 334 | __in_z LPCWSTR wzPackageOrContainerId, | ||
| 335 | __in_z_opt LPCWSTR wzPayloadId, | ||
| 336 | __in_z LPCWSTR wzPath | ||
| 337 | ) | ||
| 338 | { | ||
| 339 | BAENGINE_SETLOCALSOURCE_ARGS args = { }; | ||
| 340 | BAENGINE_SETLOCALSOURCE_RESULTS results = { }; | ||
| 341 | |||
| 342 | args.cbSize = sizeof(args); | ||
| 343 | args.wzPackageOrContainerId = wzPackageOrContainerId; | ||
| 344 | args.wzPayloadId = wzPayloadId; | ||
| 345 | args.wzPath = wzPath; | ||
| 346 | |||
| 347 | results.cbSize = sizeof(results); | ||
| 348 | |||
| 349 | return m_pfnBAEngineProc(BOOTSTRAPPER_ENGINE_MESSAGE_SETLOCALSOURCE, &args, &results, m_pvBAEngineProcContext); | ||
| 350 | } | ||
| 351 | |||
| 352 | virtual STDMETHODIMP SetDownloadSource( | ||
| 353 | __in_z LPCWSTR wzPackageOrContainerId, | ||
| 354 | __in_z_opt LPCWSTR wzPayloadId, | ||
| 355 | __in_z LPCWSTR wzUrl, | ||
| 356 | __in_z_opt LPCWSTR wzUser, | ||
| 357 | __in_z_opt LPCWSTR wzPassword | ||
| 358 | ) | ||
| 359 | { | ||
| 360 | BAENGINE_SETDOWNLOADSOURCE_ARGS args = { }; | ||
| 361 | BAENGINE_SETDOWNLOADSOURCE_RESULTS results = { }; | ||
| 362 | |||
| 363 | args.cbSize = sizeof(args); | ||
| 364 | args.wzPackageOrContainerId = wzPackageOrContainerId; | ||
| 365 | args.wzPayloadId = wzPayloadId; | ||
| 366 | args.wzUrl = wzUrl; | ||
| 367 | args.wzUser = wzUser; | ||
| 368 | args.wzPassword = wzPassword; | ||
| 369 | |||
| 370 | results.cbSize = sizeof(results); | ||
| 371 | |||
| 372 | return m_pfnBAEngineProc(BOOTSTRAPPER_ENGINE_MESSAGE_SETDOWNLOADSOURCE, &args, &results, m_pvBAEngineProcContext); | ||
| 373 | } | ||
| 374 | |||
| 375 | virtual STDMETHODIMP SetVariableNumeric( | ||
| 376 | __in_z LPCWSTR wzVariable, | ||
| 377 | __in LONGLONG llValue | ||
| 378 | ) | ||
| 379 | { | ||
| 380 | BAENGINE_SETVARIABLENUMERIC_ARGS args = { }; | ||
| 381 | BAENGINE_SETVARIABLENUMERIC_RESULTS results = { }; | ||
| 382 | |||
| 383 | args.cbSize = sizeof(args); | ||
| 384 | args.wzVariable = wzVariable; | ||
| 385 | args.llValue = llValue; | ||
| 386 | |||
| 387 | results.cbSize = sizeof(results); | ||
| 388 | |||
| 389 | return m_pfnBAEngineProc(BOOTSTRAPPER_ENGINE_MESSAGE_SETVARIABLENUMERIC, &args, &results, m_pvBAEngineProcContext); | ||
| 390 | } | ||
| 391 | |||
| 392 | virtual STDMETHODIMP SetVariableString( | ||
| 393 | __in_z LPCWSTR wzVariable, | ||
| 394 | __in_z_opt LPCWSTR wzValue | ||
| 395 | ) | ||
| 396 | { | ||
| 397 | BAENGINE_SETVARIABLESTRING_ARGS args = { }; | ||
| 398 | BAENGINE_SETVARIABLESTRING_RESULTS results = { }; | ||
| 399 | |||
| 400 | args.cbSize = sizeof(args); | ||
| 401 | args.wzVariable = wzVariable; | ||
| 402 | args.wzValue = wzValue; | ||
| 403 | |||
| 404 | results.cbSize = sizeof(results); | ||
| 405 | |||
| 406 | return m_pfnBAEngineProc(BOOTSTRAPPER_ENGINE_MESSAGE_SETVARIABLESTRING, &args, &results, m_pvBAEngineProcContext); | ||
| 407 | } | ||
| 408 | |||
| 409 | virtual STDMETHODIMP SetVariableVersion( | ||
| 410 | __in_z LPCWSTR wzVariable, | ||
| 411 | __in DWORD64 qwValue | ||
| 412 | ) | ||
| 413 | { | ||
| 414 | BAENGINE_SETVARIABLEVERSION_ARGS args = { }; | ||
| 415 | BAENGINE_SETVARIABLEVERSION_RESULTS results = { }; | ||
| 416 | |||
| 417 | args.cbSize = sizeof(args); | ||
| 418 | args.wzVariable = wzVariable; | ||
| 419 | args.qwValue = qwValue; | ||
| 420 | |||
| 421 | results.cbSize = sizeof(results); | ||
| 422 | |||
| 423 | return m_pfnBAEngineProc(BOOTSTRAPPER_ENGINE_MESSAGE_SETVARIABLEVERSION, &args, &results, m_pvBAEngineProcContext); | ||
| 424 | } | ||
| 425 | |||
| 426 | virtual STDMETHODIMP CloseSplashScreen() | ||
| 427 | { | ||
| 428 | BAENGINE_CLOSESPLASHSCREEN_ARGS args = { }; | ||
| 429 | BAENGINE_CLOSESPLASHSCREEN_RESULTS results = { }; | ||
| 430 | |||
| 431 | args.cbSize = sizeof(args); | ||
| 432 | |||
| 433 | results.cbSize = sizeof(results); | ||
| 434 | |||
| 435 | return m_pfnBAEngineProc(BOOTSTRAPPER_ENGINE_MESSAGE_CLOSESPLASHSCREEN, &args, &results, m_pvBAEngineProcContext); | ||
| 436 | } | ||
| 437 | |||
| 438 | virtual STDMETHODIMP Detect( | ||
| 439 | __in_opt HWND hwndParent | ||
| 440 | ) | ||
| 441 | { | ||
| 442 | BAENGINE_DETECT_ARGS args = { }; | ||
| 443 | BAENGINE_DETECT_RESULTS results = { }; | ||
| 444 | |||
| 445 | args.cbSize = sizeof(args); | ||
| 446 | args.hwndParent = hwndParent; | ||
| 447 | |||
| 448 | results.cbSize = sizeof(results); | ||
| 449 | |||
| 450 | return m_pfnBAEngineProc(BOOTSTRAPPER_ENGINE_MESSAGE_DETECT, &args, &results, m_pvBAEngineProcContext); | ||
| 451 | } | ||
| 452 | |||
| 453 | virtual STDMETHODIMP Plan( | ||
| 454 | __in BOOTSTRAPPER_ACTION action | ||
| 455 | ) | ||
| 456 | { | ||
| 457 | BAENGINE_PLAN_ARGS args = { }; | ||
| 458 | BAENGINE_PLAN_RESULTS results = { }; | ||
| 459 | |||
| 460 | args.cbSize = sizeof(args); | ||
| 461 | args.action = action; | ||
| 462 | |||
| 463 | results.cbSize = sizeof(results); | ||
| 464 | |||
| 465 | return m_pfnBAEngineProc(BOOTSTRAPPER_ENGINE_MESSAGE_PLAN, &args, &results, m_pvBAEngineProcContext); | ||
| 466 | } | ||
| 467 | |||
| 468 | virtual STDMETHODIMP Elevate( | ||
| 469 | __in_opt HWND hwndParent | ||
| 470 | ) | ||
| 471 | { | ||
| 472 | BAENGINE_ELEVATE_ARGS args = { }; | ||
| 473 | BAENGINE_ELEVATE_RESULTS results = { }; | ||
| 474 | |||
| 475 | args.cbSize = sizeof(args); | ||
| 476 | args.hwndParent = hwndParent; | ||
| 477 | |||
| 478 | results.cbSize = sizeof(results); | ||
| 479 | |||
| 480 | return m_pfnBAEngineProc(BOOTSTRAPPER_ENGINE_MESSAGE_ELEVATE, &args, &results, m_pvBAEngineProcContext); | ||
| 481 | } | ||
| 482 | |||
| 483 | virtual STDMETHODIMP Apply( | ||
| 484 | __in_opt HWND hwndParent | ||
| 485 | ) | ||
| 486 | { | ||
| 487 | BAENGINE_APPLY_ARGS args = { }; | ||
| 488 | BAENGINE_APPLY_RESULTS results = { }; | ||
| 489 | |||
| 490 | args.cbSize = sizeof(args); | ||
| 491 | args.hwndParent = hwndParent; | ||
| 492 | |||
| 493 | results.cbSize = sizeof(results); | ||
| 494 | |||
| 495 | return m_pfnBAEngineProc(BOOTSTRAPPER_ENGINE_MESSAGE_APPLY, &args, &results, m_pvBAEngineProcContext); | ||
| 496 | } | ||
| 497 | |||
| 498 | virtual STDMETHODIMP Quit( | ||
| 499 | __in DWORD dwExitCode | ||
| 500 | ) | ||
| 501 | { | ||
| 502 | BAENGINE_QUIT_ARGS args = { }; | ||
| 503 | BAENGINE_QUIT_RESULTS results = { }; | ||
| 504 | |||
| 505 | args.cbSize = sizeof(args); | ||
| 506 | args.dwExitCode = dwExitCode; | ||
| 507 | |||
| 508 | results.cbSize = sizeof(results); | ||
| 509 | |||
| 510 | return m_pfnBAEngineProc(BOOTSTRAPPER_ENGINE_MESSAGE_QUIT, &args, &results, m_pvBAEngineProcContext); | ||
| 511 | } | ||
| 512 | |||
| 513 | virtual STDMETHODIMP LaunchApprovedExe( | ||
| 514 | __in_opt HWND hwndParent, | ||
| 515 | __in_z LPCWSTR wzApprovedExeForElevationId, | ||
| 516 | __in_z_opt LPCWSTR wzArguments, | ||
| 517 | __in DWORD dwWaitForInputIdleTimeout | ||
| 518 | ) | ||
| 519 | { | ||
| 520 | BAENGINE_LAUNCHAPPROVEDEXE_ARGS args = { }; | ||
| 521 | BAENGINE_LAUNCHAPPROVEDEXE_RESULTS results = { }; | ||
| 522 | |||
| 523 | args.cbSize = sizeof(args); | ||
| 524 | args.hwndParent = hwndParent; | ||
| 525 | args.wzApprovedExeForElevationId = wzApprovedExeForElevationId; | ||
| 526 | args.wzArguments = wzArguments; | ||
| 527 | args.dwWaitForInputIdleTimeout = dwWaitForInputIdleTimeout; | ||
| 528 | |||
| 529 | results.cbSize = sizeof(results); | ||
| 530 | |||
| 531 | return m_pfnBAEngineProc(BOOTSTRAPPER_ENGINE_MESSAGE_LAUNCHAPPROVEDEXE, &args, &results, m_pvBAEngineProcContext); | ||
| 532 | } | ||
| 533 | |||
| 534 | public: // IMarshal | ||
| 535 | virtual STDMETHODIMP GetUnmarshalClass( | ||
| 536 | __in REFIID /*riid*/, | ||
| 537 | __in_opt LPVOID /*pv*/, | ||
| 538 | __in DWORD /*dwDestContext*/, | ||
| 539 | __reserved LPVOID /*pvDestContext*/, | ||
| 540 | __in DWORD /*mshlflags*/, | ||
| 541 | __out LPCLSID /*pCid*/ | ||
| 542 | ) | ||
| 543 | { | ||
| 544 | return E_NOTIMPL; | ||
| 545 | } | ||
| 546 | |||
| 547 | virtual STDMETHODIMP GetMarshalSizeMax( | ||
| 548 | __in REFIID riid, | ||
| 549 | __in_opt LPVOID /*pv*/, | ||
| 550 | __in DWORD dwDestContext, | ||
| 551 | __reserved LPVOID /*pvDestContext*/, | ||
| 552 | __in DWORD /*mshlflags*/, | ||
| 553 | __out DWORD *pSize | ||
| 554 | ) | ||
| 555 | { | ||
| 556 | HRESULT hr = S_OK; | ||
| 557 | |||
| 558 | // We only support marshaling the IBootstrapperEngine interface in-proc. | ||
| 559 | if (__uuidof(IBootstrapperEngine) != riid) | ||
| 560 | { | ||
| 561 | // Skip logging the following message since it appears way too often in the log. | ||
| 562 | // "Unexpected IID requested to be marshalled. BootstrapperEngineForApplication can only marshal the IBootstrapperEngine interface." | ||
| 563 | ExitFunction1(hr = E_NOINTERFACE); | ||
| 564 | } | ||
| 565 | else if (0 == (MSHCTX_INPROC & dwDestContext)) | ||
| 566 | { | ||
| 567 | hr = E_FAIL; | ||
| 568 | ExitOnRootFailure(hr, "Cannot marshal IBootstrapperEngine interface out of proc."); | ||
| 569 | } | ||
| 570 | |||
| 571 | // E_FAIL is used because E_INVALIDARG is not a supported return value. | ||
| 572 | ExitOnNull(pSize, hr, E_FAIL, "Invalid size output parameter is NULL."); | ||
| 573 | |||
| 574 | // Specify enough size to marshal just the interface pointer across threads. | ||
| 575 | *pSize = sizeof(LPVOID); | ||
| 576 | |||
| 577 | LExit: | ||
| 578 | return hr; | ||
| 579 | } | ||
| 580 | |||
| 581 | virtual STDMETHODIMP MarshalInterface( | ||
| 582 | __in IStream* pStm, | ||
| 583 | __in REFIID riid, | ||
| 584 | __in_opt LPVOID pv, | ||
| 585 | __in DWORD dwDestContext, | ||
| 586 | __reserved LPVOID /*pvDestContext*/, | ||
| 587 | __in DWORD /*mshlflags*/ | ||
| 588 | ) | ||
| 589 | { | ||
| 590 | HRESULT hr = S_OK; | ||
| 591 | IBootstrapperEngine *pThis = NULL; | ||
| 592 | ULONG ulWritten = 0; | ||
| 593 | |||
| 594 | // We only support marshaling the IBootstrapperEngine interface in-proc. | ||
| 595 | if (__uuidof(IBootstrapperEngine) != riid) | ||
| 596 | { | ||
| 597 | // Skip logging the following message since it appears way too often in the log. | ||
| 598 | // "Unexpected IID requested to be marshalled. BootstrapperEngineForApplication can only marshal the IBootstrapperEngine interface." | ||
| 599 | ExitFunction1(hr = E_NOINTERFACE); | ||
| 600 | } | ||
| 601 | else if (0 == (MSHCTX_INPROC & dwDestContext)) | ||
| 602 | { | ||
| 603 | hr = E_FAIL; | ||
| 604 | ExitOnRootFailure(hr, "Cannot marshal IBootstrapperEngine interface out of proc."); | ||
| 605 | } | ||
| 606 | |||
| 607 | // "pv" may not be set, so we should us "this" otherwise. | ||
| 608 | if (pv) | ||
| 609 | { | ||
| 610 | pThis = reinterpret_cast<IBootstrapperEngine*>(pv); | ||
| 611 | } | ||
| 612 | else | ||
| 613 | { | ||
| 614 | pThis = static_cast<IBootstrapperEngine*>(this); | ||
| 615 | } | ||
| 616 | |||
| 617 | // E_INVALIDARG is not a supported return value. | ||
| 618 | ExitOnNull(pStm, hr, E_FAIL, "The marshaling stream parameter is NULL."); | ||
| 619 | |||
| 620 | // Marshal the interface pointer in-proc as is. | ||
| 621 | hr = pStm->Write(pThis, sizeof(pThis), &ulWritten); | ||
| 622 | if (STG_E_MEDIUMFULL == hr) | ||
| 623 | { | ||
| 624 | ExitOnFailure(hr, "Failed to write the stream because the stream is full."); | ||
| 625 | } | ||
| 626 | else if (FAILED(hr)) | ||
| 627 | { | ||
| 628 | // All other STG error must be converted into E_FAIL based on IMarshal documentation. | ||
| 629 | hr = E_FAIL; | ||
| 630 | ExitOnFailure(hr, "Failed to write the IBootstrapperEngine interface pointer to the marshaling stream."); | ||
| 631 | } | ||
| 632 | |||
| 633 | LExit: | ||
| 634 | return hr; | ||
| 635 | } | ||
| 636 | |||
| 637 | virtual STDMETHODIMP UnmarshalInterface( | ||
| 638 | __in IStream* pStm, | ||
| 639 | __in REFIID riid, | ||
| 640 | __deref_out LPVOID* ppv | ||
| 641 | ) | ||
| 642 | { | ||
| 643 | HRESULT hr = S_OK; | ||
| 644 | ULONG ulRead = 0; | ||
| 645 | |||
| 646 | // We only support marshaling the engine in-proc. | ||
| 647 | if (__uuidof(IBootstrapperEngine) != riid) | ||
| 648 | { | ||
| 649 | // Skip logging the following message since it appears way too often in the log. | ||
| 650 | // "Unexpected IID requested to be marshalled. BootstrapperEngineForApplication can only marshal the IBootstrapperEngine interface." | ||
| 651 | ExitFunction1(hr = E_NOINTERFACE); | ||
| 652 | } | ||
| 653 | |||
| 654 | // E_FAIL is used because E_INVALIDARG is not a supported return value. | ||
| 655 | ExitOnNull(pStm, hr, E_FAIL, "The marshaling stream parameter is NULL."); | ||
| 656 | ExitOnNull(ppv, hr, E_FAIL, "The interface output parameter is NULL."); | ||
| 657 | |||
| 658 | // Unmarshal the interface pointer in-proc as is. | ||
| 659 | hr = pStm->Read(*ppv, sizeof(LPVOID), &ulRead); | ||
| 660 | if (FAILED(hr)) | ||
| 661 | { | ||
| 662 | // All STG errors must be converted into E_FAIL based on IMarshal documentation. | ||
| 663 | hr = E_FAIL; | ||
| 664 | ExitOnFailure(hr, "Failed to read the IBootstrapperEngine interface pointer from the marshaling stream."); | ||
| 665 | } | ||
| 666 | |||
| 667 | LExit: | ||
| 668 | return hr; | ||
| 669 | } | ||
| 670 | |||
| 671 | virtual STDMETHODIMP ReleaseMarshalData( | ||
| 672 | __in IStream* /*pStm*/ | ||
| 673 | ) | ||
| 674 | { | ||
| 675 | return E_NOTIMPL; | ||
| 676 | } | ||
| 677 | |||
| 678 | virtual STDMETHODIMP DisconnectObject( | ||
| 679 | __in DWORD /*dwReserved*/ | ||
| 680 | ) | ||
| 681 | { | ||
| 682 | return E_NOTIMPL; | ||
| 683 | } | ||
| 684 | |||
| 685 | public: | ||
| 686 | CBalBootstrapperEngine( | ||
| 687 | __in PFN_BOOTSTRAPPER_ENGINE_PROC pfnBAEngineProc, | ||
| 688 | __in_opt LPVOID pvBAEngineProcContext | ||
| 689 | ) | ||
| 690 | { | ||
| 691 | m_cReferences = 1; | ||
| 692 | m_pfnBAEngineProc = pfnBAEngineProc; | ||
| 693 | m_pvBAEngineProcContext = pvBAEngineProcContext; | ||
| 694 | } | ||
| 695 | |||
| 696 | private: | ||
| 697 | long m_cReferences; | ||
| 698 | PFN_BOOTSTRAPPER_ENGINE_PROC m_pfnBAEngineProc; | ||
| 699 | LPVOID m_pvBAEngineProcContext; | ||
| 700 | }; | ||
| 701 | |||
| 702 | HRESULT BalBootstrapperEngineCreate( | ||
| 703 | __in PFN_BOOTSTRAPPER_ENGINE_PROC pfnBAEngineProc, | ||
| 704 | __in_opt LPVOID pvBAEngineProcContext, | ||
| 705 | __out IBootstrapperEngine** ppBootstrapperEngine | ||
| 706 | ) | ||
| 707 | { | ||
| 708 | HRESULT hr = S_OK; | ||
| 709 | CBalBootstrapperEngine* pBootstrapperEngine = NULL; | ||
| 710 | |||
| 711 | pBootstrapperEngine = new CBalBootstrapperEngine(pfnBAEngineProc, pvBAEngineProcContext); | ||
| 712 | ExitOnNull(pBootstrapperEngine, hr, E_OUTOFMEMORY, "Failed to allocate new BalBootstrapperEngine object."); | ||
| 713 | |||
| 714 | hr = pBootstrapperEngine->QueryInterface(IID_PPV_ARGS(ppBootstrapperEngine)); | ||
| 715 | ExitOnFailure(hr, "Failed to QI for IBootstrapperEngine from BalBootstrapperEngine object."); | ||
| 716 | |||
| 717 | LExit: | ||
| 718 | ReleaseObject(pBootstrapperEngine); | ||
| 719 | return hr; | ||
| 720 | } | ||
diff --git a/src/balutil/balcondition.cpp b/src/balutil/balcondition.cpp new file mode 100644 index 00000000..11d3e218 --- /dev/null +++ b/src/balutil/balcondition.cpp | |||
| @@ -0,0 +1,124 @@ | |||
| 1 | // 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. | ||
| 2 | |||
| 3 | #include "precomp.h" | ||
| 4 | |||
| 5 | // prototypes | ||
| 6 | |||
| 7 | |||
| 8 | DAPI_(HRESULT) BalConditionsParseFromXml( | ||
| 9 | __in BAL_CONDITIONS* pConditions, | ||
| 10 | __in IXMLDOMDocument* pixdManifest, | ||
| 11 | __in_opt WIX_LOCALIZATION* pWixLoc | ||
| 12 | ) | ||
| 13 | { | ||
| 14 | HRESULT hr = S_OK; | ||
| 15 | IXMLDOMNodeList* pNodeList = NULL; | ||
| 16 | IXMLDOMNode* pNode = NULL; | ||
| 17 | BAL_CONDITION* prgConditions = NULL; | ||
| 18 | DWORD cConditions = 0; | ||
| 19 | |||
| 20 | hr = XmlSelectNodes(pixdManifest, L"/BootstrapperApplicationData/WixBalCondition", &pNodeList); | ||
| 21 | ExitOnFailure(hr, "Failed to select all conditions."); | ||
| 22 | |||
| 23 | hr = pNodeList->get_length(reinterpret_cast<long*>(&cConditions)); | ||
| 24 | ExitOnFailure(hr, "Failed to get the condition count."); | ||
| 25 | |||
| 26 | if (!cConditions) | ||
| 27 | { | ||
| 28 | ExitFunction(); | ||
| 29 | } | ||
| 30 | |||
| 31 | prgConditions = static_cast<BAL_CONDITION*>(MemAlloc(sizeof(BAL_CONDITION) * cConditions, TRUE)); | ||
| 32 | ExitOnNull(prgConditions, hr, E_OUTOFMEMORY, "Failed to allocate memory for conditions."); | ||
| 33 | |||
| 34 | DWORD iCondition = 0; | ||
| 35 | while (S_OK == (hr = XmlNextElement(pNodeList, &pNode, NULL))) | ||
| 36 | { | ||
| 37 | hr = XmlGetAttributeEx(pNode, L"Condition", &prgConditions[iCondition].sczCondition); | ||
| 38 | ExitOnFailure(hr, "Failed to get condition for condition."); | ||
| 39 | |||
| 40 | hr = XmlGetAttributeEx(pNode, L"Message", &prgConditions[iCondition].sczMessage); | ||
| 41 | ExitOnFailure(hr, "Failed to get message for condition."); | ||
| 42 | |||
| 43 | if (pWixLoc && prgConditions[iCondition].sczMessage && *prgConditions[iCondition].sczMessage) | ||
| 44 | { | ||
| 45 | hr = LocLocalizeString(pWixLoc, &prgConditions[iCondition].sczMessage); | ||
| 46 | ExitOnFailure(hr, "Failed to localize condition message."); | ||
| 47 | } | ||
| 48 | |||
| 49 | ++iCondition; | ||
| 50 | ReleaseNullObject(pNode); | ||
| 51 | } | ||
| 52 | ExitOnFailure(hr, "Failed to parse all condition elements."); | ||
| 53 | |||
| 54 | if (S_FALSE == hr) | ||
| 55 | { | ||
| 56 | hr = S_OK; | ||
| 57 | } | ||
| 58 | |||
| 59 | pConditions->cConditions = cConditions; | ||
| 60 | pConditions->rgConditions = prgConditions; | ||
| 61 | prgConditions = NULL; | ||
| 62 | |||
| 63 | LExit: | ||
| 64 | ReleaseMem(prgConditions); | ||
| 65 | ReleaseObject(pNode); | ||
| 66 | ReleaseObject(pNodeList); | ||
| 67 | |||
| 68 | return hr; | ||
| 69 | } | ||
| 70 | |||
| 71 | |||
| 72 | //the contents of psczMessage may be sensitive, should keep encrypted and SecureZeroFree | ||
| 73 | DAPI_(HRESULT) BalConditionEvaluate( | ||
| 74 | __in BAL_CONDITION* pCondition, | ||
| 75 | __in IBootstrapperEngine* pEngine, | ||
| 76 | __out BOOL* pfResult, | ||
| 77 | __out_z_opt LPWSTR* psczMessage | ||
| 78 | ) | ||
| 79 | { | ||
| 80 | HRESULT hr = S_OK; | ||
| 81 | DWORD_PTR cchMessage = 0; | ||
| 82 | |||
| 83 | hr = pEngine->EvaluateCondition(pCondition->sczCondition, pfResult); | ||
| 84 | ExitOnFailure(hr, "Failed to evaluate condition with bootstrapper engine."); | ||
| 85 | |||
| 86 | if (psczMessage) | ||
| 87 | { | ||
| 88 | if (*psczMessage) | ||
| 89 | { | ||
| 90 | hr = StrMaxLength(*psczMessage, &cchMessage); | ||
| 91 | ExitOnFailure(hr, "Failed to get length of message."); | ||
| 92 | } | ||
| 93 | |||
| 94 | hr = pEngine->FormatString(pCondition->sczMessage, *psczMessage, reinterpret_cast<DWORD*>(&cchMessage)); | ||
| 95 | if (E_MOREDATA == hr) | ||
| 96 | { | ||
| 97 | ++cchMessage; | ||
| 98 | |||
| 99 | hr = StrAllocSecure(psczMessage, cchMessage); | ||
| 100 | ExitOnFailure(hr, "Failed to allocate string for condition's formatted message."); | ||
| 101 | |||
| 102 | hr = pEngine->FormatString(pCondition->sczMessage, *psczMessage, reinterpret_cast<DWORD*>(&cchMessage)); | ||
| 103 | } | ||
| 104 | ExitOnFailure(hr, "Failed to format condition's message."); | ||
| 105 | } | ||
| 106 | |||
| 107 | LExit: | ||
| 108 | return hr; | ||
| 109 | } | ||
| 110 | |||
| 111 | |||
| 112 | DAPI_(void) BalConditionsUninitialize( | ||
| 113 | __in BAL_CONDITIONS* pConditions | ||
| 114 | ) | ||
| 115 | { | ||
| 116 | for (DWORD i = 0; i < pConditions->cConditions; ++i) | ||
| 117 | { | ||
| 118 | ReleaseStr(pConditions->rgConditions[i].sczMessage); | ||
| 119 | ReleaseStr(pConditions->rgConditions[i].sczCondition); | ||
| 120 | } | ||
| 121 | |||
| 122 | ReleaseMem(pConditions->rgConditions); | ||
| 123 | memset(pConditions, 0, sizeof(BAL_CONDITIONS)); | ||
| 124 | } | ||
diff --git a/src/balutil/balinfo.cpp b/src/balutil/balinfo.cpp new file mode 100644 index 00000000..b36e3741 --- /dev/null +++ b/src/balutil/balinfo.cpp | |||
| @@ -0,0 +1,288 @@ | |||
| 1 | // 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. | ||
| 2 | |||
| 3 | #include "precomp.h" | ||
| 4 | |||
| 5 | // prototypes | ||
| 6 | static HRESULT ParsePackagesFromXml( | ||
| 7 | __in BAL_INFO_PACKAGES* pPackages, | ||
| 8 | __in IXMLDOMDocument* pixdManifest | ||
| 9 | ); | ||
| 10 | |||
| 11 | |||
| 12 | DAPI_(HRESULT) BalInfoParseFromXml( | ||
| 13 | __in BAL_INFO_BUNDLE* pBundle, | ||
| 14 | __in IXMLDOMDocument* pixdManifest | ||
| 15 | ) | ||
| 16 | { | ||
| 17 | HRESULT hr = S_OK; | ||
| 18 | IXMLDOMNode* pNode = NULL; | ||
| 19 | |||
| 20 | hr = XmlSelectSingleNode(pixdManifest, L"/BootstrapperApplicationData/WixBundleProperties", &pNode); | ||
| 21 | ExitOnFailure(hr, "Failed to select bundle information."); | ||
| 22 | |||
| 23 | if (S_OK == hr) | ||
| 24 | { | ||
| 25 | hr = XmlGetYesNoAttribute(pNode, L"PerMachine", &pBundle->fPerMachine); | ||
| 26 | if (E_NOTFOUND != hr) | ||
| 27 | { | ||
| 28 | ExitOnFailure(hr, "Failed to read bundle information per-machine."); | ||
| 29 | } | ||
| 30 | |||
| 31 | hr = XmlGetAttributeEx(pNode, L"DisplayName", &pBundle->sczName); | ||
| 32 | if (E_NOTFOUND != hr) | ||
| 33 | { | ||
| 34 | ExitOnFailure(hr, "Failed to read bundle information display name."); | ||
| 35 | } | ||
| 36 | |||
| 37 | hr = XmlGetAttributeEx(pNode, L"LogPathVariable", &pBundle->sczLogVariable); | ||
| 38 | if (E_NOTFOUND != hr) | ||
| 39 | { | ||
| 40 | ExitOnFailure(hr, "Failed to read bundle information log path variable."); | ||
| 41 | } | ||
| 42 | } | ||
| 43 | |||
| 44 | hr = ParsePackagesFromXml(&pBundle->packages, pixdManifest); | ||
| 45 | BalExitOnFailure(hr, "Failed to parse package information from bootstrapper application data."); | ||
| 46 | |||
| 47 | LExit: | ||
| 48 | ReleaseObject(pNode); | ||
| 49 | |||
| 50 | return hr; | ||
| 51 | } | ||
| 52 | |||
| 53 | |||
| 54 | DAPI_(HRESULT) BalInfoAddRelatedBundleAsPackage( | ||
| 55 | __in BAL_INFO_PACKAGES* pPackages, | ||
| 56 | __in LPCWSTR wzId, | ||
| 57 | __in BOOTSTRAPPER_RELATION_TYPE relationType, | ||
| 58 | __in BOOL /*fPerMachine*/ | ||
| 59 | ) | ||
| 60 | { | ||
| 61 | HRESULT hr = S_OK; | ||
| 62 | BAL_INFO_PACKAGE_TYPE type = BAL_INFO_PACKAGE_TYPE_UNKNOWN; | ||
| 63 | BAL_INFO_PACKAGE* pPackage = NULL; | ||
| 64 | |||
| 65 | // Ensure we have a supported relation type. | ||
| 66 | switch (relationType) | ||
| 67 | { | ||
| 68 | case BOOTSTRAPPER_RELATION_ADDON: | ||
| 69 | type = BAL_INFO_PACKAGE_TYPE_BUNDLE_ADDON; | ||
| 70 | break; | ||
| 71 | |||
| 72 | case BOOTSTRAPPER_RELATION_PATCH: | ||
| 73 | type = BAL_INFO_PACKAGE_TYPE_BUNDLE_PATCH; | ||
| 74 | break; | ||
| 75 | |||
| 76 | case BOOTSTRAPPER_RELATION_UPGRADE: | ||
| 77 | type = BAL_INFO_PACKAGE_TYPE_BUNDLE_UPGRADE; | ||
| 78 | break; | ||
| 79 | |||
| 80 | default: | ||
| 81 | ExitOnFailure(hr = E_INVALIDARG, "Unknown related bundle type: %u", relationType); | ||
| 82 | } | ||
| 83 | |||
| 84 | // Check to see if the bundle is already in the list of packages. | ||
| 85 | for (DWORD i = 0; i < pPackages->cPackages; ++i) | ||
| 86 | { | ||
| 87 | if (CSTR_EQUAL == ::CompareStringW(LOCALE_NEUTRAL, 0, wzId, -1, pPackages->rgPackages[i].sczId, -1)) | ||
| 88 | { | ||
| 89 | ExitFunction1(hr = HRESULT_FROM_WIN32(ERROR_ALREADY_EXISTS)); | ||
| 90 | } | ||
| 91 | } | ||
| 92 | |||
| 93 | // Add the related bundle as a package. | ||
| 94 | hr = MemEnsureArraySize(reinterpret_cast<LPVOID*>(&pPackages->rgPackages), pPackages->cPackages + 1, sizeof(BAL_INFO_PACKAGE), 2); | ||
| 95 | ExitOnFailure(hr, "Failed to allocate memory for related bundle package information."); | ||
| 96 | |||
| 97 | pPackage = pPackages->rgPackages + pPackages->cPackages; | ||
| 98 | ++pPackages->cPackages; | ||
| 99 | |||
| 100 | hr = StrAllocString(&pPackage->sczId, wzId, 0); | ||
| 101 | ExitOnFailure(hr, "Failed to copy related bundle package id."); | ||
| 102 | |||
| 103 | pPackage->type = type; | ||
| 104 | |||
| 105 | // TODO: try to look up the DisplayName and Description in Add/Remove Programs with the wzId. | ||
| 106 | |||
| 107 | LExit: | ||
| 108 | return hr; | ||
| 109 | } | ||
| 110 | |||
| 111 | |||
| 112 | DAPI_(HRESULT) BalInfoFindPackageById( | ||
| 113 | __in BAL_INFO_PACKAGES* pPackages, | ||
| 114 | __in LPCWSTR wzId, | ||
| 115 | __out BAL_INFO_PACKAGE** ppPackage | ||
| 116 | ) | ||
| 117 | { | ||
| 118 | *ppPackage = NULL; | ||
| 119 | |||
| 120 | for (DWORD i = 0; i < pPackages->cPackages; ++i) | ||
| 121 | { | ||
| 122 | if (CSTR_EQUAL == ::CompareStringW(LOCALE_NEUTRAL, 0, wzId, -1, pPackages->rgPackages[i].sczId, -1)) | ||
| 123 | { | ||
| 124 | *ppPackage = pPackages->rgPackages + i; | ||
| 125 | break; | ||
| 126 | } | ||
| 127 | } | ||
| 128 | |||
| 129 | return *ppPackage ? S_OK : E_NOTFOUND; | ||
| 130 | } | ||
| 131 | |||
| 132 | |||
| 133 | DAPI_(void) BalInfoUninitialize( | ||
| 134 | __in BAL_INFO_BUNDLE* pBundle | ||
| 135 | ) | ||
| 136 | { | ||
| 137 | for (DWORD i = 0; i < pBundle->packages.cPackages; ++i) | ||
| 138 | { | ||
| 139 | ReleaseStr(pBundle->packages.rgPackages[i].sczDisplayName); | ||
| 140 | ReleaseStr(pBundle->packages.rgPackages[i].sczDescription); | ||
| 141 | ReleaseStr(pBundle->packages.rgPackages[i].sczId); | ||
| 142 | ReleaseStr(pBundle->packages.rgPackages[i].sczProductCode); | ||
| 143 | ReleaseStr(pBundle->packages.rgPackages[i].sczUpgradeCode); | ||
| 144 | ReleaseStr(pBundle->packages.rgPackages[i].sczVersion); | ||
| 145 | ReleaseStr(pBundle->packages.rgPackages[i].sczInstallCondition); | ||
| 146 | } | ||
| 147 | |||
| 148 | ReleaseMem(pBundle->packages.rgPackages); | ||
| 149 | |||
| 150 | ReleaseStr(pBundle->sczName); | ||
| 151 | ReleaseStr(pBundle->sczLogVariable); | ||
| 152 | memset(pBundle, 0, sizeof(BAL_INFO_BUNDLE)); | ||
| 153 | } | ||
| 154 | |||
| 155 | |||
| 156 | static HRESULT ParsePackagesFromXml( | ||
| 157 | __in BAL_INFO_PACKAGES* pPackages, | ||
| 158 | __in IXMLDOMDocument* pixdManifest | ||
| 159 | ) | ||
| 160 | { | ||
| 161 | HRESULT hr = S_OK; | ||
| 162 | IXMLDOMNodeList* pNodeList = NULL; | ||
| 163 | IXMLDOMNode* pNode = NULL; | ||
| 164 | BAL_INFO_PACKAGE* prgPackages = NULL; | ||
| 165 | DWORD cPackages = 0; | ||
| 166 | LPWSTR scz = NULL; | ||
| 167 | |||
| 168 | hr = XmlSelectNodes(pixdManifest, L"/BootstrapperApplicationData/WixPackageProperties", &pNodeList); | ||
| 169 | ExitOnFailure(hr, "Failed to select all packages."); | ||
| 170 | |||
| 171 | hr = pNodeList->get_length(reinterpret_cast<long*>(&cPackages)); | ||
| 172 | ExitOnFailure(hr, "Failed to get the package count."); | ||
| 173 | |||
| 174 | prgPackages = static_cast<BAL_INFO_PACKAGE*>(MemAlloc(sizeof(BAL_INFO_PACKAGE) * cPackages, TRUE)); | ||
| 175 | ExitOnNull(prgPackages, hr, E_OUTOFMEMORY, "Failed to allocate memory for packages."); | ||
| 176 | |||
| 177 | DWORD iPackage = 0; | ||
| 178 | while (S_OK == (hr = XmlNextElement(pNodeList, &pNode, NULL))) | ||
| 179 | { | ||
| 180 | hr = XmlGetAttributeEx(pNode, L"Package", &prgPackages[iPackage].sczId); | ||
| 181 | ExitOnFailure(hr, "Failed to get package identifier for package."); | ||
| 182 | |||
| 183 | hr = XmlGetAttributeEx(pNode, L"DisplayName", &prgPackages[iPackage].sczDisplayName); | ||
| 184 | if (E_NOTFOUND != hr) | ||
| 185 | { | ||
| 186 | ExitOnFailure(hr, "Failed to get display name for package."); | ||
| 187 | } | ||
| 188 | |||
| 189 | hr = XmlGetAttributeEx(pNode, L"Description", &prgPackages[iPackage].sczDescription); | ||
| 190 | if (E_NOTFOUND != hr) | ||
| 191 | { | ||
| 192 | ExitOnFailure(hr, "Failed to get description for package."); | ||
| 193 | } | ||
| 194 | |||
| 195 | hr = XmlGetAttributeEx(pNode, L"PackageType", &scz); | ||
| 196 | ExitOnFailure(hr, "Failed to get package type for package."); | ||
| 197 | |||
| 198 | if (CSTR_EQUAL == ::CompareStringW(LOCALE_NEUTRAL, 0, L"Exe", -1, scz, -1)) | ||
| 199 | { | ||
| 200 | prgPackages[iPackage].type = BAL_INFO_PACKAGE_TYPE_EXE; | ||
| 201 | } | ||
| 202 | else if (CSTR_EQUAL == ::CompareStringW(LOCALE_NEUTRAL, 0, L"Msi", -1, scz, -1)) | ||
| 203 | { | ||
| 204 | prgPackages[iPackage].type = BAL_INFO_PACKAGE_TYPE_MSI; | ||
| 205 | } | ||
| 206 | else if (CSTR_EQUAL == ::CompareStringW(LOCALE_NEUTRAL, 0, L"Msp", -1, scz, -1)) | ||
| 207 | { | ||
| 208 | prgPackages[iPackage].type = BAL_INFO_PACKAGE_TYPE_MSP; | ||
| 209 | } | ||
| 210 | else if (CSTR_EQUAL == ::CompareStringW(LOCALE_NEUTRAL, 0, L"Msu", -1, scz, -1)) | ||
| 211 | { | ||
| 212 | prgPackages[iPackage].type = BAL_INFO_PACKAGE_TYPE_MSU; | ||
| 213 | } | ||
| 214 | |||
| 215 | hr = XmlGetYesNoAttribute(pNode, L"Permanent", &prgPackages[iPackage].fPermanent); | ||
| 216 | ExitOnFailure(hr, "Failed to get permanent setting for package."); | ||
| 217 | |||
| 218 | hr = XmlGetYesNoAttribute(pNode, L"Vital", &prgPackages[iPackage].fVital); | ||
| 219 | ExitOnFailure(hr, "Failed to get vital setting for package."); | ||
| 220 | |||
| 221 | hr = XmlGetYesNoAttribute(pNode, L"DisplayInternalUI", &prgPackages[iPackage].fDisplayInternalUI); | ||
| 222 | if (E_NOTFOUND != hr) | ||
| 223 | { | ||
| 224 | ExitOnFailure(hr, "Failed to get DisplayInternalUI setting for package."); | ||
| 225 | } | ||
| 226 | |||
| 227 | hr = XmlGetAttributeEx(pNode, L"ProductCode", &prgPackages[iPackage].sczProductCode); | ||
| 228 | if (E_NOTFOUND != hr) | ||
| 229 | { | ||
| 230 | ExitOnFailure(hr, "Failed to get product code for package."); | ||
| 231 | } | ||
| 232 | |||
| 233 | hr = XmlGetAttributeEx(pNode, L"UpgradeCode", &prgPackages[iPackage].sczUpgradeCode); | ||
| 234 | if (E_NOTFOUND != hr) | ||
| 235 | { | ||
| 236 | ExitOnFailure(hr, "Failed to get upgrade code for package."); | ||
| 237 | } | ||
| 238 | |||
| 239 | hr = XmlGetAttributeEx(pNode, L"Version", &prgPackages[iPackage].sczVersion); | ||
| 240 | if (E_NOTFOUND != hr) | ||
| 241 | { | ||
| 242 | ExitOnFailure(hr, "Failed to get version for package."); | ||
| 243 | } | ||
| 244 | |||
| 245 | hr = XmlGetAttributeEx(pNode, L"InstallCondition", &prgPackages[iPackage].sczInstallCondition); | ||
| 246 | if (E_NOTFOUND != hr) | ||
| 247 | { | ||
| 248 | ExitOnFailure(hr, "Failed to get install condition for package."); | ||
| 249 | } | ||
| 250 | |||
| 251 | hr = XmlGetAttributeEx(pNode, L"Cache", &scz); | ||
| 252 | ExitOnFailure(hr, "Failed to get cache type for package."); | ||
| 253 | |||
| 254 | if (CSTR_EQUAL == ::CompareStringW(LOCALE_NEUTRAL, 0, scz, -1, L"no", -1)) | ||
| 255 | { | ||
| 256 | prgPackages[iPackage].cacheType = BAL_INFO_CACHE_TYPE_NO; | ||
| 257 | } | ||
| 258 | else if (CSTR_EQUAL == ::CompareStringW(LOCALE_NEUTRAL, 0, scz, -1, L"yes", -1)) | ||
| 259 | { | ||
| 260 | prgPackages[iPackage].cacheType = BAL_INFO_CACHE_TYPE_YES; | ||
| 261 | } | ||
| 262 | else if (CSTR_EQUAL == ::CompareStringW(LOCALE_NEUTRAL, 0, scz, -1, L"always", -1)) | ||
| 263 | { | ||
| 264 | prgPackages[iPackage].cacheType = BAL_INFO_CACHE_TYPE_ALWAYS; | ||
| 265 | } | ||
| 266 | |||
| 267 | ++iPackage; | ||
| 268 | ReleaseNullObject(pNode); | ||
| 269 | } | ||
| 270 | ExitOnFailure(hr, "Failed to parse all package property elements."); | ||
| 271 | |||
| 272 | if (S_FALSE == hr) | ||
| 273 | { | ||
| 274 | hr = S_OK; | ||
| 275 | } | ||
| 276 | |||
| 277 | pPackages->cPackages = cPackages; | ||
| 278 | pPackages->rgPackages = prgPackages; | ||
| 279 | prgPackages = NULL; | ||
| 280 | |||
| 281 | LExit: | ||
| 282 | ReleaseStr(scz); | ||
| 283 | ReleaseMem(prgPackages); | ||
| 284 | ReleaseObject(pNode); | ||
| 285 | ReleaseObject(pNodeList); | ||
| 286 | |||
| 287 | return hr; | ||
| 288 | } | ||
diff --git a/src/balutil/balretry.cpp b/src/balutil/balretry.cpp new file mode 100644 index 00000000..d95d86b2 --- /dev/null +++ b/src/balutil/balretry.cpp | |||
| @@ -0,0 +1,191 @@ | |||
| 1 | // 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. | ||
| 2 | |||
| 3 | #include "precomp.h" | ||
| 4 | |||
| 5 | struct BALRETRY_INFO | ||
| 6 | { | ||
| 7 | LPWSTR sczId; // package or container id. | ||
| 8 | LPWSTR sczPayloadId; // optional payload id. | ||
| 9 | DWORD cRetries; | ||
| 10 | DWORD dwLastError; | ||
| 11 | }; | ||
| 12 | |||
| 13 | static DWORD vdwMaxRetries = 0; | ||
| 14 | static DWORD vdwTimeout = 0; | ||
| 15 | static BALRETRY_INFO vrgRetryInfo[2]; | ||
| 16 | |||
| 17 | // prototypes | ||
| 18 | static BOOL IsActiveRetryEntry( | ||
| 19 | __in BALRETRY_TYPE type, | ||
| 20 | __in_z LPCWSTR wzPackageId, | ||
| 21 | __in_z_opt LPCWSTR wzPayloadId | ||
| 22 | ); | ||
| 23 | |||
| 24 | |||
| 25 | DAPI_(void) BalRetryInitialize( | ||
| 26 | __in DWORD dwMaxRetries, | ||
| 27 | __in DWORD dwTimeout | ||
| 28 | ) | ||
| 29 | { | ||
| 30 | BalRetryUninitialize(); // clean everything out. | ||
| 31 | |||
| 32 | vdwMaxRetries = dwMaxRetries; | ||
| 33 | vdwTimeout = dwTimeout; | ||
| 34 | } | ||
| 35 | |||
| 36 | |||
| 37 | DAPI_(void) BalRetryUninitialize() | ||
| 38 | { | ||
| 39 | for (DWORD i = 0; i < countof(vrgRetryInfo); ++i) | ||
| 40 | { | ||
| 41 | ReleaseStr(vrgRetryInfo[i].sczId); | ||
| 42 | ReleaseStr(vrgRetryInfo[i].sczPayloadId); | ||
| 43 | memset(vrgRetryInfo + i, 0, sizeof(BALRETRY_INFO)); | ||
| 44 | } | ||
| 45 | |||
| 46 | vdwMaxRetries = 0; | ||
| 47 | vdwTimeout = 0; | ||
| 48 | } | ||
| 49 | |||
| 50 | |||
| 51 | DAPI_(void) BalRetryStartPackage( | ||
| 52 | __in BALRETRY_TYPE type, | ||
| 53 | __in_z_opt LPCWSTR wzPackageId, | ||
| 54 | __in_z_opt LPCWSTR wzPayloadId | ||
| 55 | ) | ||
| 56 | { | ||
| 57 | if (!wzPackageId || !*wzPackageId) | ||
| 58 | { | ||
| 59 | ReleaseNullStr(vrgRetryInfo[type].sczId); | ||
| 60 | ReleaseNullStr(vrgRetryInfo[type].sczPayloadId); | ||
| 61 | } | ||
| 62 | else if (IsActiveRetryEntry(type, wzPackageId, wzPayloadId)) | ||
| 63 | { | ||
| 64 | ++vrgRetryInfo[type].cRetries; | ||
| 65 | ::Sleep(vdwTimeout); | ||
| 66 | } | ||
| 67 | else | ||
| 68 | { | ||
| 69 | StrAllocString(&vrgRetryInfo[type].sczId, wzPackageId, 0); | ||
| 70 | if (wzPayloadId) | ||
| 71 | { | ||
| 72 | StrAllocString(&vrgRetryInfo[type].sczPayloadId, wzPayloadId, 0); | ||
| 73 | } | ||
| 74 | |||
| 75 | vrgRetryInfo[type].cRetries = 0; | ||
| 76 | } | ||
| 77 | |||
| 78 | vrgRetryInfo[type].dwLastError = ERROR_SUCCESS; | ||
| 79 | } | ||
| 80 | |||
| 81 | |||
| 82 | DAPI_(void) BalRetryErrorOccurred( | ||
| 83 | __in_z LPCWSTR wzPackageId, | ||
| 84 | __in DWORD dwError | ||
| 85 | ) | ||
| 86 | { | ||
| 87 | if (IsActiveRetryEntry(BALRETRY_TYPE_CACHE, wzPackageId, NULL)) | ||
| 88 | { | ||
| 89 | vrgRetryInfo[BALRETRY_TYPE_CACHE].dwLastError = dwError; | ||
| 90 | } | ||
| 91 | else if (IsActiveRetryEntry(BALRETRY_TYPE_EXECUTE, wzPackageId, NULL)) | ||
| 92 | { | ||
| 93 | vrgRetryInfo[BALRETRY_TYPE_EXECUTE].dwLastError = dwError; | ||
| 94 | } | ||
| 95 | } | ||
| 96 | |||
| 97 | |||
| 98 | DAPI_(HRESULT) BalRetryEndPackage( | ||
| 99 | __in BALRETRY_TYPE type, | ||
| 100 | __in_z_opt LPCWSTR wzPackageId, | ||
| 101 | __in_z_opt LPCWSTR wzPayloadId, | ||
| 102 | __in HRESULT hrError, | ||
| 103 | __inout BOOL* pfRetry | ||
| 104 | ) | ||
| 105 | { | ||
| 106 | HRESULT hr = S_OK; | ||
| 107 | |||
| 108 | if (!wzPackageId || !*wzPackageId) | ||
| 109 | { | ||
| 110 | ReleaseNullStr(vrgRetryInfo[type].sczId); | ||
| 111 | ReleaseNullStr(vrgRetryInfo[type].sczPayloadId); | ||
| 112 | } | ||
| 113 | else if (FAILED(hrError) && vrgRetryInfo[type].cRetries < vdwMaxRetries && IsActiveRetryEntry(type, wzPackageId, wzPayloadId)) | ||
| 114 | { | ||
| 115 | if (BALRETRY_TYPE_CACHE == type) | ||
| 116 | { | ||
| 117 | // Retry on all errors except the following. | ||
| 118 | if (HRESULT_FROM_WIN32(ERROR_INSTALL_USEREXIT) != hrError && | ||
| 119 | BG_E_NETWORK_DISCONNECTED != hrError && | ||
| 120 | HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND) != hrError && | ||
| 121 | HRESULT_FROM_WIN32(ERROR_INTERNET_NAME_NOT_RESOLVED) != hrError) | ||
| 122 | { | ||
| 123 | *pfRetry = TRUE; | ||
| 124 | } | ||
| 125 | } | ||
| 126 | else if (BALRETRY_TYPE_EXECUTE == type) | ||
| 127 | { | ||
| 128 | // If the service is out of whack, just try again. | ||
| 129 | if (HRESULT_FROM_WIN32(ERROR_INSTALL_SERVICE_FAILURE) == hrError) | ||
| 130 | { | ||
| 131 | *pfRetry = TRUE; | ||
| 132 | } | ||
| 133 | else if (HRESULT_FROM_WIN32(ERROR_INSTALL_FAILURE) == hrError) | ||
| 134 | { | ||
| 135 | DWORD dwError = vrgRetryInfo[type].dwLastError; | ||
| 136 | |||
| 137 | // If we failed with one of these specific error codes, then retry since | ||
| 138 | // we've seen these have a high success of succeeding on retry. | ||
| 139 | if (1303 == dwError || | ||
| 140 | 1304 == dwError || | ||
| 141 | 1306 == dwError || | ||
| 142 | 1307 == dwError || | ||
| 143 | 1309 == dwError || | ||
| 144 | 1310 == dwError || | ||
| 145 | 1311 == dwError || | ||
| 146 | 1312 == dwError || | ||
| 147 | 1316 == dwError || | ||
| 148 | 1317 == dwError || | ||
| 149 | 1321 == dwError || | ||
| 150 | 1335 == dwError || | ||
| 151 | 1402 == dwError || | ||
| 152 | 1406 == dwError || | ||
| 153 | 1606 == dwError || | ||
| 154 | 1706 == dwError || | ||
| 155 | 1719 == dwError || | ||
| 156 | 1723 == dwError || | ||
| 157 | 1923 == dwError || | ||
| 158 | 1931 == dwError) | ||
| 159 | { | ||
| 160 | *pfRetry = TRUE; | ||
| 161 | } | ||
| 162 | } | ||
| 163 | else if (HRESULT_FROM_WIN32(ERROR_INSTALL_ALREADY_RUNNING) == hrError) | ||
| 164 | { | ||
| 165 | *pfRetry = TRUE; | ||
| 166 | } | ||
| 167 | } | ||
| 168 | } | ||
| 169 | |||
| 170 | return hr; | ||
| 171 | } | ||
| 172 | |||
| 173 | |||
| 174 | // Internal functions. | ||
| 175 | |||
| 176 | static BOOL IsActiveRetryEntry( | ||
| 177 | __in BALRETRY_TYPE type, | ||
| 178 | __in_z LPCWSTR wzPackageId, | ||
| 179 | __in_z_opt LPCWSTR wzPayloadId | ||
| 180 | ) | ||
| 181 | { | ||
| 182 | BOOL fActive = FALSE; | ||
| 183 | |||
| 184 | fActive = vrgRetryInfo[type].sczId && CSTR_EQUAL == ::CompareStringW(LOCALE_NEUTRAL, 0, wzPackageId, -1, vrgRetryInfo[type].sczId, -1); | ||
| 185 | if (fActive && wzPayloadId) // if a payload id was provided ensure it matches. | ||
| 186 | { | ||
| 187 | fActive = vrgRetryInfo[type].sczPayloadId && CSTR_EQUAL == ::CompareStringW(LOCALE_NEUTRAL, 0, wzPayloadId, -1, vrgRetryInfo[type].sczPayloadId, -1); | ||
| 188 | } | ||
| 189 | |||
| 190 | return fActive; | ||
| 191 | } | ||
diff --git a/src/balutil/balutil.cpp b/src/balutil/balutil.cpp new file mode 100644 index 00000000..df254359 --- /dev/null +++ b/src/balutil/balutil.cpp | |||
| @@ -0,0 +1,382 @@ | |||
| 1 | // 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. | ||
| 2 | |||
| 3 | #include "precomp.h" | ||
| 4 | |||
| 5 | const DWORD VARIABLE_GROW_FACTOR = 80; | ||
| 6 | static IBootstrapperEngine* vpEngine = NULL; | ||
| 7 | |||
| 8 | // prototypes | ||
| 9 | |||
| 10 | DAPI_(void) BalInitialize( | ||
| 11 | __in IBootstrapperEngine* pEngine | ||
| 12 | ) | ||
| 13 | { | ||
| 14 | pEngine->AddRef(); | ||
| 15 | |||
| 16 | ReleaseObject(vpEngine); | ||
| 17 | vpEngine = pEngine; | ||
| 18 | } | ||
| 19 | |||
| 20 | DAPI_(HRESULT) BalInitializeFromCreateArgs( | ||
| 21 | __in const BOOTSTRAPPER_CREATE_ARGS* pArgs, | ||
| 22 | __out_opt IBootstrapperEngine** ppEngine | ||
| 23 | ) | ||
| 24 | { | ||
| 25 | HRESULT hr = S_OK; | ||
| 26 | IBootstrapperEngine* pEngine = NULL; | ||
| 27 | |||
| 28 | hr = BalBootstrapperEngineCreate(pArgs->pfnBootstrapperEngineProc, pArgs->pvBootstrapperEngineProcContext, &pEngine); | ||
| 29 | ExitOnFailure(hr, "Failed to create BalBootstrapperEngine."); | ||
| 30 | |||
| 31 | BalInitialize(pEngine); | ||
| 32 | |||
| 33 | if (ppEngine) | ||
| 34 | { | ||
| 35 | *ppEngine = pEngine; | ||
| 36 | } | ||
| 37 | pEngine = NULL; | ||
| 38 | |||
| 39 | LExit: | ||
| 40 | ReleaseObject(pEngine); | ||
| 41 | |||
| 42 | return hr; | ||
| 43 | } | ||
| 44 | |||
| 45 | |||
| 46 | DAPI_(void) BalUninitialize() | ||
| 47 | { | ||
| 48 | ReleaseNullObject(vpEngine); | ||
| 49 | } | ||
| 50 | |||
| 51 | |||
| 52 | DAPI_(HRESULT) BalManifestLoad( | ||
| 53 | __in HMODULE hBootstrapperApplicationModule, | ||
| 54 | __out IXMLDOMDocument** ppixdManifest | ||
| 55 | ) | ||
| 56 | { | ||
| 57 | HRESULT hr = S_OK; | ||
| 58 | LPWSTR sczPath = NULL; | ||
| 59 | |||
| 60 | hr = PathRelativeToModule(&sczPath, BAL_MANIFEST_FILENAME, hBootstrapperApplicationModule); | ||
| 61 | ExitOnFailure(hr, "Failed to get path to bootstrapper application manifest: %ls", BAL_MANIFEST_FILENAME); | ||
| 62 | |||
| 63 | hr = XmlLoadDocumentFromFile(sczPath, ppixdManifest); | ||
| 64 | ExitOnFailure(hr, "Failed to load bootstrapper application manifest '%ls' from path: %ls", BAL_MANIFEST_FILENAME, sczPath); | ||
| 65 | |||
| 66 | LExit: | ||
| 67 | ReleaseStr(sczPath); | ||
| 68 | return hr; | ||
| 69 | } | ||
| 70 | |||
| 71 | |||
| 72 | DAPI_(HRESULT) BalEvaluateCondition( | ||
| 73 | __in_z LPCWSTR wzCondition, | ||
| 74 | __out BOOL* pf | ||
| 75 | ) | ||
| 76 | { | ||
| 77 | HRESULT hr = S_OK; | ||
| 78 | |||
| 79 | if (!vpEngine) | ||
| 80 | { | ||
| 81 | hr = E_POINTER; | ||
| 82 | ExitOnRootFailure(hr, "BalInitialize() must be called first."); | ||
| 83 | } | ||
| 84 | |||
| 85 | hr = vpEngine->EvaluateCondition(wzCondition, pf); | ||
| 86 | |||
| 87 | LExit: | ||
| 88 | return hr; | ||
| 89 | } | ||
| 90 | |||
| 91 | |||
| 92 | // The contents of psczOut may be sensitive, should keep encrypted and SecureZeroFree. | ||
| 93 | DAPI_(HRESULT) BalFormatString( | ||
| 94 | __in_z LPCWSTR wzFormat, | ||
| 95 | __inout LPWSTR* psczOut | ||
| 96 | ) | ||
| 97 | { | ||
| 98 | HRESULT hr = S_OK; | ||
| 99 | DWORD cch = 0; | ||
| 100 | |||
| 101 | if (!vpEngine) | ||
| 102 | { | ||
| 103 | hr = E_POINTER; | ||
| 104 | ExitOnRootFailure(hr, "BalInitialize() must be called first."); | ||
| 105 | } | ||
| 106 | |||
| 107 | if (*psczOut) | ||
| 108 | { | ||
| 109 | hr = StrMaxLength(*psczOut, reinterpret_cast<DWORD_PTR*>(&cch)); | ||
| 110 | ExitOnFailure(hr, "Failed to determine length of value."); | ||
| 111 | } | ||
| 112 | |||
| 113 | hr = vpEngine->FormatString(wzFormat, *psczOut, &cch); | ||
| 114 | if (E_MOREDATA == hr) | ||
| 115 | { | ||
| 116 | ++cch; | ||
| 117 | |||
| 118 | hr = StrAllocSecure(psczOut, cch); | ||
| 119 | ExitOnFailure(hr, "Failed to allocate value."); | ||
| 120 | |||
| 121 | hr = vpEngine->FormatString(wzFormat, *psczOut, &cch); | ||
| 122 | } | ||
| 123 | |||
| 124 | LExit: | ||
| 125 | return hr; | ||
| 126 | } | ||
| 127 | |||
| 128 | |||
| 129 | // The contents of pllValue may be sensitive, if variable is hidden should keep value encrypted and SecureZeroMemory. | ||
| 130 | DAPI_(HRESULT) BalGetNumericVariable( | ||
| 131 | __in_z LPCWSTR wzVariable, | ||
| 132 | __out LONGLONG* pllValue | ||
| 133 | ) | ||
| 134 | { | ||
| 135 | HRESULT hr = S_OK; | ||
| 136 | |||
| 137 | if (!vpEngine) | ||
| 138 | { | ||
| 139 | hr = E_POINTER; | ||
| 140 | ExitOnRootFailure(hr, "BalInitialize() must be called first."); | ||
| 141 | } | ||
| 142 | |||
| 143 | hr = vpEngine->GetVariableNumeric(wzVariable, pllValue); | ||
| 144 | |||
| 145 | LExit: | ||
| 146 | return hr; | ||
| 147 | } | ||
| 148 | |||
| 149 | |||
| 150 | DAPI_(HRESULT) BalSetNumericVariable( | ||
| 151 | __in_z LPCWSTR wzVariable, | ||
| 152 | __in LONGLONG llValue | ||
| 153 | ) | ||
| 154 | { | ||
| 155 | HRESULT hr = S_OK; | ||
| 156 | |||
| 157 | if (!vpEngine) | ||
| 158 | { | ||
| 159 | hr = E_POINTER; | ||
| 160 | ExitOnRootFailure(hr, "BalInitialize() must be called first."); | ||
| 161 | } | ||
| 162 | |||
| 163 | hr = vpEngine->SetVariableNumeric(wzVariable, llValue); | ||
| 164 | |||
| 165 | LExit: | ||
| 166 | return hr; | ||
| 167 | } | ||
| 168 | |||
| 169 | |||
| 170 | DAPI_(BOOL) BalStringVariableExists( | ||
| 171 | __in_z LPCWSTR wzVariable | ||
| 172 | ) | ||
| 173 | { | ||
| 174 | HRESULT hr = S_OK; | ||
| 175 | DWORD cch = 0; | ||
| 176 | |||
| 177 | if (!vpEngine) | ||
| 178 | { | ||
| 179 | hr = E_POINTER; | ||
| 180 | ExitOnRootFailure(hr, "BalInitialize() must be called first."); | ||
| 181 | } | ||
| 182 | |||
| 183 | hr = vpEngine->GetVariableString(wzVariable, NULL, &cch); | ||
| 184 | |||
| 185 | LExit: | ||
| 186 | return E_MOREDATA == hr; // string exists only if there are more than zero characters in the variable. | ||
| 187 | } | ||
| 188 | |||
| 189 | |||
| 190 | // The contents of psczValue may be sensitive, if variable is hidden should keep value encrypted and SecureZeroFree. | ||
| 191 | DAPI_(HRESULT) BalGetStringVariable( | ||
| 192 | __in_z LPCWSTR wzVariable, | ||
| 193 | __inout LPWSTR* psczValue | ||
| 194 | ) | ||
| 195 | { | ||
| 196 | HRESULT hr = S_OK; | ||
| 197 | DWORD cch = 0; | ||
| 198 | |||
| 199 | if (!vpEngine) | ||
| 200 | { | ||
| 201 | hr = E_POINTER; | ||
| 202 | ExitOnRootFailure(hr, "BalInitialize() must be called first."); | ||
| 203 | } | ||
| 204 | |||
| 205 | if (*psczValue) | ||
| 206 | { | ||
| 207 | hr = StrMaxLength(*psczValue, reinterpret_cast<DWORD_PTR*>(&cch)); | ||
| 208 | ExitOnFailure(hr, "Failed to determine length of value."); | ||
| 209 | } | ||
| 210 | |||
| 211 | hr = vpEngine->GetVariableString(wzVariable, *psczValue, &cch); | ||
| 212 | if (E_MOREDATA == hr) | ||
| 213 | { | ||
| 214 | ++cch; | ||
| 215 | |||
| 216 | hr = StrAllocSecure(psczValue, cch); | ||
| 217 | ExitOnFailure(hr, "Failed to allocate value."); | ||
| 218 | |||
| 219 | hr = vpEngine->GetVariableString(wzVariable, *psczValue, &cch); | ||
| 220 | } | ||
| 221 | |||
| 222 | LExit: | ||
| 223 | return hr; | ||
| 224 | } | ||
| 225 | |||
| 226 | DAPI_(HRESULT) BalSetStringVariable( | ||
| 227 | __in_z LPCWSTR wzVariable, | ||
| 228 | __in_z_opt LPCWSTR wzValue | ||
| 229 | ) | ||
| 230 | { | ||
| 231 | HRESULT hr = S_OK; | ||
| 232 | |||
| 233 | if (!vpEngine) | ||
| 234 | { | ||
| 235 | hr = E_POINTER; | ||
| 236 | ExitOnRootFailure(hr, "BalInitialize() must be called first."); | ||
| 237 | } | ||
| 238 | |||
| 239 | hr = vpEngine->SetVariableString(wzVariable, wzValue); | ||
| 240 | |||
| 241 | LExit: | ||
| 242 | return hr; | ||
| 243 | } | ||
| 244 | |||
| 245 | |||
| 246 | DAPIV_(HRESULT) BalLog( | ||
| 247 | __in BOOTSTRAPPER_LOG_LEVEL level, | ||
| 248 | __in_z __format_string LPCSTR szFormat, | ||
| 249 | ... | ||
| 250 | ) | ||
| 251 | { | ||
| 252 | HRESULT hr = S_OK; | ||
| 253 | va_list args; | ||
| 254 | LPSTR sczFormattedAnsi = NULL; | ||
| 255 | LPWSTR sczMessage = NULL; | ||
| 256 | |||
| 257 | if (!vpEngine) | ||
| 258 | { | ||
| 259 | hr = E_POINTER; | ||
| 260 | ExitOnRootFailure(hr, "BalInitialize() must be called first."); | ||
| 261 | } | ||
| 262 | |||
| 263 | va_start(args, szFormat); | ||
| 264 | hr = StrAnsiAllocFormattedArgs(&sczFormattedAnsi, szFormat, args); | ||
| 265 | va_end(args); | ||
| 266 | ExitOnFailure(hr, "Failed to format log string."); | ||
| 267 | |||
| 268 | hr = StrAllocStringAnsi(&sczMessage, sczFormattedAnsi, 0, CP_UTF8); | ||
| 269 | ExitOnFailure(hr, "Failed to convert log string to Unicode."); | ||
| 270 | |||
| 271 | hr = vpEngine->Log(level, sczMessage); | ||
| 272 | |||
| 273 | LExit: | ||
| 274 | ReleaseStr(sczMessage); | ||
| 275 | ReleaseStr(sczFormattedAnsi); | ||
| 276 | return hr; | ||
| 277 | } | ||
| 278 | |||
| 279 | |||
| 280 | DAPIV_(HRESULT) BalLogError( | ||
| 281 | __in HRESULT hrError, | ||
| 282 | __in_z __format_string LPCSTR szFormat, | ||
| 283 | ... | ||
| 284 | ) | ||
| 285 | { | ||
| 286 | HRESULT hr = S_OK; | ||
| 287 | va_list args; | ||
| 288 | LPSTR sczFormattedAnsi = NULL; | ||
| 289 | LPWSTR sczMessage = NULL; | ||
| 290 | |||
| 291 | if (!vpEngine) | ||
| 292 | { | ||
| 293 | hr = E_POINTER; | ||
| 294 | ExitOnRootFailure(hr, "BalInitialize() must be called first."); | ||
| 295 | } | ||
| 296 | |||
| 297 | va_start(args, szFormat); | ||
| 298 | hr = StrAnsiAllocFormattedArgs(&sczFormattedAnsi, szFormat, args); | ||
| 299 | va_end(args); | ||
| 300 | ExitOnFailure(hr, "Failed to format error log string."); | ||
| 301 | |||
| 302 | hr = StrAllocFormatted(&sczMessage, L"Error 0x%08x: %S", hrError, sczFormattedAnsi); | ||
| 303 | ExitOnFailure(hr, "Failed to prepend error number to error log string."); | ||
| 304 | |||
| 305 | hr = vpEngine->Log(BOOTSTRAPPER_LOG_LEVEL_ERROR, sczMessage); | ||
| 306 | |||
| 307 | LExit: | ||
| 308 | ReleaseStr(sczMessage); | ||
| 309 | ReleaseStr(sczFormattedAnsi); | ||
| 310 | return hr; | ||
| 311 | } | ||
| 312 | |||
| 313 | DAPIV_(HRESULT) BalLogId( | ||
| 314 | __in BOOTSTRAPPER_LOG_LEVEL level, | ||
| 315 | __in DWORD dwLogId, | ||
| 316 | __in HMODULE hModule, | ||
| 317 | ... | ||
| 318 | ) | ||
| 319 | { | ||
| 320 | HRESULT hr = S_OK; | ||
| 321 | va_list args; | ||
| 322 | |||
| 323 | if (!vpEngine) | ||
| 324 | { | ||
| 325 | hr = E_POINTER; | ||
| 326 | ExitOnRootFailure(hr, "BalInitialize() must be called first."); | ||
| 327 | } | ||
| 328 | |||
| 329 | va_start(args, hModule); | ||
| 330 | hr = BalLogIdArgs(level, dwLogId, hModule, args); | ||
| 331 | va_end(args); | ||
| 332 | |||
| 333 | LExit: | ||
| 334 | return hr; | ||
| 335 | } | ||
| 336 | |||
| 337 | DAPI_(HRESULT) BalLogIdArgs( | ||
| 338 | __in BOOTSTRAPPER_LOG_LEVEL level, | ||
| 339 | __in DWORD dwLogId, | ||
| 340 | __in HMODULE hModule, | ||
| 341 | __in va_list args | ||
| 342 | ) | ||
| 343 | { | ||
| 344 | |||
| 345 | HRESULT hr = S_OK; | ||
| 346 | LPWSTR pwz = NULL; | ||
| 347 | DWORD cch = 0; | ||
| 348 | |||
| 349 | if (!vpEngine) | ||
| 350 | { | ||
| 351 | hr = E_POINTER; | ||
| 352 | ExitOnRootFailure(hr, "BalInitialize() must be called first."); | ||
| 353 | } | ||
| 354 | |||
| 355 | // Get the string for the id. | ||
| 356 | #pragma prefast(push) | ||
| 357 | #pragma prefast(disable:25028) | ||
| 358 | #pragma prefast(disable:25068) | ||
| 359 | cch = ::FormatMessageW(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_HMODULE, | ||
| 360 | static_cast<LPCVOID>(hModule), dwLogId, 0, reinterpret_cast<LPWSTR>(&pwz), 0, &args); | ||
| 361 | #pragma prefast(pop) | ||
| 362 | |||
| 363 | if (0 == cch) | ||
| 364 | { | ||
| 365 | ExitOnLastError(hr, "Failed to log id: %d", dwLogId); | ||
| 366 | } | ||
| 367 | |||
| 368 | if (2 <= cch && L'\r' == pwz[cch - 2] && L'\n' == pwz[cch - 1]) | ||
| 369 | { | ||
| 370 | pwz[cch - 2] = L'\0'; // remove newline from message table. | ||
| 371 | } | ||
| 372 | |||
| 373 | hr = vpEngine->Log(level, pwz); | ||
| 374 | |||
| 375 | LExit: | ||
| 376 | if (pwz) | ||
| 377 | { | ||
| 378 | ::LocalFree(pwz); | ||
| 379 | } | ||
| 380 | |||
| 381 | return hr; | ||
| 382 | } | ||
diff --git a/src/balutil/inc/BAFunctions.h b/src/balutil/inc/BAFunctions.h new file mode 100644 index 00000000..1338253d --- /dev/null +++ b/src/balutil/inc/BAFunctions.h | |||
| @@ -0,0 +1,130 @@ | |||
| 1 | #pragma once | ||
| 2 | // 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. | ||
| 3 | |||
| 4 | |||
| 5 | #ifdef __cplusplus | ||
| 6 | extern "C" { | ||
| 7 | #endif | ||
| 8 | |||
| 9 | // The first 1024 messages are reserved so that the BA messages have the same value here. | ||
| 10 | enum BA_FUNCTIONS_MESSAGE | ||
| 11 | { | ||
| 12 | BA_FUNCTIONS_MESSAGE_ONDETECTBEGIN = BOOTSTRAPPER_APPLICATION_MESSAGE_ONDETECTBEGIN, | ||
| 13 | BA_FUNCTIONS_MESSAGE_ONDETECTCOMPLETE = BOOTSTRAPPER_APPLICATION_MESSAGE_ONDETECTCOMPLETE, | ||
| 14 | BA_FUNCTIONS_MESSAGE_ONPLANBEGIN = BOOTSTRAPPER_APPLICATION_MESSAGE_ONPLANBEGIN, | ||
| 15 | BA_FUNCTIONS_MESSAGE_ONPLANCOMPLETE = BOOTSTRAPPER_APPLICATION_MESSAGE_ONPLANCOMPLETE, | ||
| 16 | BA_FUNCTIONS_MESSAGE_ONSTARTUP = BOOTSTRAPPER_APPLICATION_MESSAGE_ONSTARTUP, | ||
| 17 | BA_FUNCTIONS_MESSAGE_ONSHUTDOWN = BOOTSTRAPPER_APPLICATION_MESSAGE_ONSHUTDOWN, | ||
| 18 | BA_FUNCTIONS_MESSAGE_ONSYSTEMSHUTDOWN = BOOTSTRAPPER_APPLICATION_MESSAGE_ONSYSTEMSHUTDOWN, | ||
| 19 | BA_FUNCTIONS_MESSAGE_ONDETECTFORWARDCOMPATIBLEBUNDLE = BOOTSTRAPPER_APPLICATION_MESSAGE_ONDETECTFORWARDCOMPATIBLEBUNDLE, | ||
| 20 | BA_FUNCTIONS_MESSAGE_ONDETECTUPDATEBEGIN = BOOTSTRAPPER_APPLICATION_MESSAGE_ONDETECTUPDATEBEGIN, | ||
| 21 | BA_FUNCTIONS_MESSAGE_ONDETECTUPDATE = BOOTSTRAPPER_APPLICATION_MESSAGE_ONDETECTUPDATE, | ||
| 22 | BA_FUNCTIONS_MESSAGE_ONDETECTUPDATECOMPLETE = BOOTSTRAPPER_APPLICATION_MESSAGE_ONDETECTUPDATECOMPLETE, | ||
| 23 | BA_FUNCTIONS_MESSAGE_ONDETECTRELATEDBUNDLE = BOOTSTRAPPER_APPLICATION_MESSAGE_ONDETECTRELATEDBUNDLE, | ||
| 24 | BA_FUNCTIONS_MESSAGE_ONDETECTPACKAGEBEGIN = BOOTSTRAPPER_APPLICATION_MESSAGE_ONDETECTPACKAGEBEGIN, | ||
| 25 | BA_FUNCTIONS_MESSAGE_ONDETECTCOMPATIBLEMSIPACKAGE = BOOTSTRAPPER_APPLICATION_MESSAGE_ONDETECTCOMPATIBLEMSIPACKAGE, | ||
| 26 | BA_FUNCTIONS_MESSAGE_ONDETECTRELATEDMSIPACKAGE = BOOTSTRAPPER_APPLICATION_MESSAGE_ONDETECTRELATEDMSIPACKAGE, | ||
| 27 | BA_FUNCTIONS_MESSAGE_ONDETECTTARGETMSIPACKAGE = BOOTSTRAPPER_APPLICATION_MESSAGE_ONDETECTTARGETMSIPACKAGE, | ||
| 28 | BA_FUNCTIONS_MESSAGE_ONDETECTMSIFEATURE = BOOTSTRAPPER_APPLICATION_MESSAGE_ONDETECTMSIFEATURE, | ||
| 29 | BA_FUNCTIONS_MESSAGE_ONDETECTPACKAGECOMPLETE = BOOTSTRAPPER_APPLICATION_MESSAGE_ONDETECTPACKAGECOMPLETE, | ||
| 30 | BA_FUNCTIONS_MESSAGE_ONPLANRELATEDBUNDLE = BOOTSTRAPPER_APPLICATION_MESSAGE_ONPLANRELATEDBUNDLE, | ||
| 31 | BA_FUNCTIONS_MESSAGE_ONPLANPACKAGEBEGIN = BOOTSTRAPPER_APPLICATION_MESSAGE_ONPLANPACKAGEBEGIN, | ||
| 32 | BA_FUNCTIONS_MESSAGE_ONPLANCOMPATIBLEMSIPACKAGEBEGIN = BOOTSTRAPPER_APPLICATION_MESSAGE_ONPLANCOMPATIBLEMSIPACKAGEBEGIN, | ||
| 33 | BA_FUNCTIONS_MESSAGE_ONPLANCOMPATIBLEMSIPACKAGECOMPLETE = BOOTSTRAPPER_APPLICATION_MESSAGE_ONPLANCOMPATIBLEMSIPACKAGECOMPLETE, | ||
| 34 | BA_FUNCTIONS_MESSAGE_ONPLANTARGETMSIPACKAGE = BOOTSTRAPPER_APPLICATION_MESSAGE_ONPLANTARGETMSIPACKAGE, | ||
| 35 | BA_FUNCTIONS_MESSAGE_ONPLANMSIFEATURE = BOOTSTRAPPER_APPLICATION_MESSAGE_ONPLANMSIFEATURE, | ||
| 36 | BA_FUNCTIONS_MESSAGE_ONPLANPACKAGECOMPLETE = BOOTSTRAPPER_APPLICATION_MESSAGE_ONPLANPACKAGECOMPLETE, | ||
| 37 | BA_FUNCTIONS_MESSAGE_ONAPPLYBEGIN = BOOTSTRAPPER_APPLICATION_MESSAGE_ONAPPLYBEGIN, | ||
| 38 | BA_FUNCTIONS_MESSAGE_ONELEVATEBEGIN = BOOTSTRAPPER_APPLICATION_MESSAGE_ONELEVATEBEGIN, | ||
| 39 | BA_FUNCTIONS_MESSAGE_ONELEVATECOMPLETE = BOOTSTRAPPER_APPLICATION_MESSAGE_ONELEVATECOMPLETE, | ||
| 40 | BA_FUNCTIONS_MESSAGE_ONPROGRESS = BOOTSTRAPPER_APPLICATION_MESSAGE_ONPROGRESS, | ||
| 41 | BA_FUNCTIONS_MESSAGE_ONERROR = BOOTSTRAPPER_APPLICATION_MESSAGE_ONERROR, | ||
| 42 | BA_FUNCTIONS_MESSAGE_ONREGISTERBEGIN = BOOTSTRAPPER_APPLICATION_MESSAGE_ONREGISTERBEGIN, | ||
| 43 | BA_FUNCTIONS_MESSAGE_ONREGISTERCOMPLETE = BOOTSTRAPPER_APPLICATION_MESSAGE_ONREGISTERCOMPLETE, | ||
| 44 | BA_FUNCTIONS_MESSAGE_ONCACHEBEGIN = BOOTSTRAPPER_APPLICATION_MESSAGE_ONCACHEBEGIN, | ||
| 45 | BA_FUNCTIONS_MESSAGE_ONCACHEPACKAGEBEGIN = BOOTSTRAPPER_APPLICATION_MESSAGE_ONCACHEPACKAGEBEGIN, | ||
| 46 | BA_FUNCTIONS_MESSAGE_ONCACHEACQUIREBEGIN = BOOTSTRAPPER_APPLICATION_MESSAGE_ONCACHEACQUIREBEGIN, | ||
| 47 | BA_FUNCTIONS_MESSAGE_ONCACHEACQUIREPROGRESS = BOOTSTRAPPER_APPLICATION_MESSAGE_ONCACHEACQUIREPROGRESS, | ||
| 48 | BA_FUNCTIONS_MESSAGE_ONRESOLVESOURCE = BOOTSTRAPPER_APPLICATION_MESSAGE_ONRESOLVESOURCE, | ||
| 49 | BA_FUNCTIONS_MESSAGE_ONCACHEACQUIRECOMPLETE = BOOTSTRAPPER_APPLICATION_MESSAGE_ONCACHEACQUIRECOMPLETE, | ||
| 50 | BA_FUNCTIONS_MESSAGE_ONCACHEVERIFYBEGIN = BOOTSTRAPPER_APPLICATION_MESSAGE_ONCACHEVERIFYBEGIN, | ||
| 51 | BA_FUNCTIONS_MESSAGE_ONCACHEVERIFYCOMPLETE = BOOTSTRAPPER_APPLICATION_MESSAGE_ONCACHEVERIFYCOMPLETE, | ||
| 52 | BA_FUNCTIONS_MESSAGE_ONCACHEPACKAGECOMPLETE = BOOTSTRAPPER_APPLICATION_MESSAGE_ONCACHEPACKAGECOMPLETE, | ||
| 53 | BA_FUNCTIONS_MESSAGE_ONCACHECOMPLETE = BOOTSTRAPPER_APPLICATION_MESSAGE_ONCACHECOMPLETE, | ||
| 54 | BA_FUNCTIONS_MESSAGE_ONEXECUTEBEGIN = BOOTSTRAPPER_APPLICATION_MESSAGE_ONEXECUTEBEGIN, | ||
| 55 | BA_FUNCTIONS_MESSAGE_ONEXECUTEPACKAGEBEGIN = BOOTSTRAPPER_APPLICATION_MESSAGE_ONEXECUTEPACKAGEBEGIN, | ||
| 56 | BA_FUNCTIONS_MESSAGE_ONEXECUTEPATCHTARGET = BOOTSTRAPPER_APPLICATION_MESSAGE_ONEXECUTEPATCHTARGET, | ||
| 57 | BA_FUNCTIONS_MESSAGE_ONEXECUTEPROGRESS = BOOTSTRAPPER_APPLICATION_MESSAGE_ONEXECUTEPROGRESS, | ||
| 58 | BA_FUNCTIONS_MESSAGE_ONEXECUTEMSIMESSAGE = BOOTSTRAPPER_APPLICATION_MESSAGE_ONEXECUTEMSIMESSAGE, | ||
| 59 | BA_FUNCTIONS_MESSAGE_ONEXECUTEFILESINUSE = BOOTSTRAPPER_APPLICATION_MESSAGE_ONEXECUTEFILESINUSE, | ||
| 60 | BA_FUNCTIONS_MESSAGE_ONEXECUTEPACKAGECOMPLETE = BOOTSTRAPPER_APPLICATION_MESSAGE_ONEXECUTEPACKAGECOMPLETE, | ||
| 61 | BA_FUNCTIONS_MESSAGE_ONEXECUTECOMPLETE = BOOTSTRAPPER_APPLICATION_MESSAGE_ONEXECUTECOMPLETE, | ||
| 62 | BA_FUNCTIONS_MESSAGE_ONUNREGISTERBEGIN = BOOTSTRAPPER_APPLICATION_MESSAGE_ONUNREGISTERBEGIN, | ||
| 63 | BA_FUNCTIONS_MESSAGE_ONUNREGISTERCOMPLETE = BOOTSTRAPPER_APPLICATION_MESSAGE_ONUNREGISTERCOMPLETE, | ||
| 64 | BA_FUNCTIONS_MESSAGE_ONAPPLYCOMPLETE = BOOTSTRAPPER_APPLICATION_MESSAGE_ONAPPLYCOMPLETE, | ||
| 65 | BA_FUNCTIONS_MESSAGE_ONLAUNCHAPPROVEDEXEBEGIN = BOOTSTRAPPER_APPLICATION_MESSAGE_ONLAUNCHAPPROVEDEXEBEGIN, | ||
| 66 | BA_FUNCTIONS_MESSAGE_ONLAUNCHAPPROVEDEXECOMPLETE = BOOTSTRAPPER_APPLICATION_MESSAGE_ONLAUNCHAPPROVEDEXECOMPLETE, | ||
| 67 | |||
| 68 | BA_FUNCTIONS_MESSAGE_ONTHEMELOADED = 1024, | ||
| 69 | BA_FUNCTIONS_MESSAGE_WNDPROC, | ||
| 70 | }; | ||
| 71 | |||
| 72 | typedef HRESULT(WINAPI *PFN_BA_FUNCTIONS_PROC)( | ||
| 73 | __in BA_FUNCTIONS_MESSAGE message, | ||
| 74 | __in const LPVOID pvArgs, | ||
| 75 | __inout LPVOID pvResults, | ||
| 76 | __in_opt LPVOID pvContext | ||
| 77 | ); | ||
| 78 | |||
| 79 | struct BA_FUNCTIONS_CREATE_ARGS | ||
| 80 | { | ||
| 81 | DWORD cbSize; | ||
| 82 | DWORD64 qwBAFunctionsAPIVersion; | ||
| 83 | BOOTSTRAPPER_CREATE_ARGS* pBootstrapperCreateArgs; | ||
| 84 | }; | ||
| 85 | |||
| 86 | struct BA_FUNCTIONS_CREATE_RESULTS | ||
| 87 | { | ||
| 88 | DWORD cbSize; | ||
| 89 | PFN_BA_FUNCTIONS_PROC pfnBAFunctionsProc; | ||
| 90 | LPVOID pvBAFunctionsProcContext; | ||
| 91 | }; | ||
| 92 | |||
| 93 | struct BA_FUNCTIONS_ONTHEMELOADED_ARGS | ||
| 94 | { | ||
| 95 | DWORD cbSize; | ||
| 96 | THEME* pTheme; | ||
| 97 | WIX_LOCALIZATION* pWixLoc; | ||
| 98 | }; | ||
| 99 | |||
| 100 | struct BA_FUNCTIONS_ONTHEMELOADED_RESULTS | ||
| 101 | { | ||
| 102 | DWORD cbSize; | ||
| 103 | }; | ||
| 104 | |||
| 105 | struct BA_FUNCTIONS_WNDPROC_ARGS | ||
| 106 | { | ||
| 107 | DWORD cbSize; | ||
| 108 | THEME* pTheme; | ||
| 109 | HWND hWnd; | ||
| 110 | UINT uMsg; | ||
| 111 | WPARAM wParam; | ||
| 112 | LPARAM lParam; | ||
| 113 | }; | ||
| 114 | |||
| 115 | struct BA_FUNCTIONS_WNDPROC_RESULTS | ||
| 116 | { | ||
| 117 | DWORD cbSize; | ||
| 118 | LRESULT lres; | ||
| 119 | }; | ||
| 120 | |||
| 121 | typedef HRESULT(WINAPI *PFN_BA_FUNCTIONS_CREATE)( | ||
| 122 | __in const BA_FUNCTIONS_CREATE_ARGS* pArgs, | ||
| 123 | __inout BA_FUNCTIONS_CREATE_RESULTS* pResults | ||
| 124 | ); | ||
| 125 | |||
| 126 | typedef void (WINAPI *PFN_BA_FUNCTIONS_DESTROY)(); | ||
| 127 | |||
| 128 | #ifdef __cplusplus | ||
| 129 | } | ||
| 130 | #endif | ||
diff --git a/src/balutil/inc/BalBaseBAFunctions.h b/src/balutil/inc/BalBaseBAFunctions.h new file mode 100644 index 00000000..dd190ee9 --- /dev/null +++ b/src/balutil/inc/BalBaseBAFunctions.h | |||
| @@ -0,0 +1,700 @@ | |||
| 1 | #pragma once | ||
| 2 | // 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. | ||
| 3 | |||
| 4 | |||
| 5 | #include <windows.h> | ||
| 6 | #include <msiquery.h> | ||
| 7 | |||
| 8 | #include "dutil.h" | ||
| 9 | #include "locutil.h" | ||
| 10 | #include "thmutil.h" | ||
| 11 | #include "BAFunctions.h" | ||
| 12 | #include "IBAFunctions.h" | ||
| 13 | #include "BootstrapperEngine.h" | ||
| 14 | #include "BootstrapperApplication.h" | ||
| 15 | #include "IBootstrapperEngine.h" | ||
| 16 | #include "IBootstrapperApplication.h" | ||
| 17 | |||
| 18 | class CBalBaseBAFunctions : public IBAFunctions | ||
| 19 | { | ||
| 20 | public: // IUnknown | ||
| 21 | virtual STDMETHODIMP QueryInterface( | ||
| 22 | __in REFIID riid, | ||
| 23 | __out LPVOID *ppvObject | ||
| 24 | ) | ||
| 25 | { | ||
| 26 | if (!ppvObject) | ||
| 27 | { | ||
| 28 | return E_INVALIDARG; | ||
| 29 | } | ||
| 30 | |||
| 31 | *ppvObject = NULL; | ||
| 32 | |||
| 33 | if (::IsEqualIID(__uuidof(IBAFunctions), riid)) | ||
| 34 | { | ||
| 35 | *ppvObject = static_cast<IBAFunctions*>(this); | ||
| 36 | } | ||
| 37 | else if (::IsEqualIID(__uuidof(IBootstrapperApplication), riid)) | ||
| 38 | { | ||
| 39 | *ppvObject = static_cast<IBootstrapperApplication*>(this); | ||
| 40 | } | ||
| 41 | else if (::IsEqualIID(IID_IUnknown, riid)) | ||
| 42 | { | ||
| 43 | *ppvObject = static_cast<IUnknown*>(this); | ||
| 44 | } | ||
| 45 | else // no interface for requested iid | ||
| 46 | { | ||
| 47 | return E_NOINTERFACE; | ||
| 48 | } | ||
| 49 | |||
| 50 | AddRef(); | ||
| 51 | return S_OK; | ||
| 52 | } | ||
| 53 | |||
| 54 | virtual STDMETHODIMP_(ULONG) AddRef() | ||
| 55 | { | ||
| 56 | return ::InterlockedIncrement(&this->m_cReferences); | ||
| 57 | } | ||
| 58 | |||
| 59 | virtual STDMETHODIMP_(ULONG) Release() | ||
| 60 | { | ||
| 61 | long l = ::InterlockedDecrement(&this->m_cReferences); | ||
| 62 | if (0 < l) | ||
| 63 | { | ||
| 64 | return l; | ||
| 65 | } | ||
| 66 | |||
| 67 | delete this; | ||
| 68 | return 0; | ||
| 69 | } | ||
| 70 | |||
| 71 | public: // IBootstrapperApplication | ||
| 72 | virtual STDMETHODIMP OnStartup() | ||
| 73 | { | ||
| 74 | return S_OK; | ||
| 75 | } | ||
| 76 | |||
| 77 | virtual STDMETHODIMP OnShutdown( | ||
| 78 | __inout BOOTSTRAPPER_SHUTDOWN_ACTION* /*pAction*/ | ||
| 79 | ) | ||
| 80 | { | ||
| 81 | return S_OK; | ||
| 82 | } | ||
| 83 | |||
| 84 | virtual STDMETHODIMP OnSystemShutdown( | ||
| 85 | __in DWORD /*dwEndSession*/, | ||
| 86 | __inout BOOL* /*pfCancel*/ | ||
| 87 | ) | ||
| 88 | { | ||
| 89 | return S_OK; | ||
| 90 | } | ||
| 91 | |||
| 92 | virtual STDMETHODIMP OnDetectBegin( | ||
| 93 | __in BOOL /*fInstalled*/, | ||
| 94 | __in DWORD /*cPackages*/, | ||
| 95 | __inout BOOL* /*pfCancel*/ | ||
| 96 | ) | ||
| 97 | { | ||
| 98 | return S_OK; | ||
| 99 | } | ||
| 100 | |||
| 101 | virtual STDMETHODIMP OnDetectForwardCompatibleBundle( | ||
| 102 | __in_z LPCWSTR /*wzBundleId*/, | ||
| 103 | __in BOOTSTRAPPER_RELATION_TYPE /*relationType*/, | ||
| 104 | __in_z LPCWSTR /*wzBundleTag*/, | ||
| 105 | __in BOOL /*fPerMachine*/, | ||
| 106 | __in DWORD64 /*dw64Version*/, | ||
| 107 | __inout BOOL* /*pfCancel*/, | ||
| 108 | __inout BOOL* /*pfIgnoreBundle*/ | ||
| 109 | ) | ||
| 110 | { | ||
| 111 | return S_OK; | ||
| 112 | } | ||
| 113 | |||
| 114 | virtual STDMETHODIMP OnDetectUpdateBegin( | ||
| 115 | __in_z LPCWSTR /*wzUpdateLocation*/, | ||
| 116 | __inout BOOL* /*pfCancel*/, | ||
| 117 | __inout BOOL* /*pfSkip*/ | ||
| 118 | ) | ||
| 119 | { | ||
| 120 | return S_OK; | ||
| 121 | } | ||
| 122 | |||
| 123 | virtual STDMETHODIMP OnDetectUpdate( | ||
| 124 | __in_z LPCWSTR /*wzUpdateLocation*/, | ||
| 125 | __in DWORD64 /*dw64Size*/, | ||
| 126 | __in DWORD64 /*dw64Version*/, | ||
| 127 | __in_z LPCWSTR /*wzTitle*/, | ||
| 128 | __in_z LPCWSTR /*wzSummary*/, | ||
| 129 | __in_z LPCWSTR /*wzContentType*/, | ||
| 130 | __in_z LPCWSTR /*wzContent*/, | ||
| 131 | __inout BOOL* /*pfCancel*/, | ||
| 132 | __inout BOOL* /*pfStopProcessingUpdates*/ | ||
| 133 | ) | ||
| 134 | { | ||
| 135 | return S_OK; | ||
| 136 | } | ||
| 137 | |||
| 138 | virtual STDMETHODIMP OnDetectUpdateComplete( | ||
| 139 | __in HRESULT /*hrStatus*/, | ||
| 140 | __inout BOOL* /*pfIgnoreError*/ | ||
| 141 | ) | ||
| 142 | { | ||
| 143 | return S_OK; | ||
| 144 | } | ||
| 145 | |||
| 146 | virtual STDMETHODIMP OnDetectRelatedBundle( | ||
| 147 | __in_z LPCWSTR /*wzBundleId*/, | ||
| 148 | __in BOOTSTRAPPER_RELATION_TYPE /*relationType*/, | ||
| 149 | __in_z LPCWSTR /*wzBundleTag*/, | ||
| 150 | __in BOOL /*fPerMachine*/, | ||
| 151 | __in DWORD64 /*dw64Version*/, | ||
| 152 | __in BOOTSTRAPPER_RELATED_OPERATION /*operation*/, | ||
| 153 | __inout BOOL* /*pfCancel*/ | ||
| 154 | ) | ||
| 155 | { | ||
| 156 | return S_OK; | ||
| 157 | } | ||
| 158 | |||
| 159 | virtual STDMETHODIMP OnDetectPackageBegin( | ||
| 160 | __in_z LPCWSTR /*wzPackageId*/, | ||
| 161 | __inout BOOL* /*pfCancel*/ | ||
| 162 | ) | ||
| 163 | { | ||
| 164 | return S_OK; | ||
| 165 | } | ||
| 166 | |||
| 167 | virtual STDMETHODIMP OnDetectCompatibleMsiPackage( | ||
| 168 | __in_z LPCWSTR /*wzPackageId*/, | ||
| 169 | __in_z LPCWSTR /*wzCompatiblePackageId*/, | ||
| 170 | __in DWORD64 /*dw64CompatiblePackageVersion*/, | ||
| 171 | __inout BOOL* /*pfCancel*/ | ||
| 172 | ) | ||
| 173 | { | ||
| 174 | return S_OK; | ||
| 175 | } | ||
| 176 | |||
| 177 | virtual STDMETHODIMP OnDetectRelatedMsiPackage( | ||
| 178 | __in_z LPCWSTR /*wzPackageId*/, | ||
| 179 | __in_z LPCWSTR /*wzUpgradeCode*/, | ||
| 180 | __in_z LPCWSTR /*wzProductCode*/, | ||
| 181 | __in BOOL /*fPerMachine*/, | ||
| 182 | __in DWORD64 /*dw64Version*/, | ||
| 183 | __in BOOTSTRAPPER_RELATED_OPERATION /*operation*/, | ||
| 184 | __inout BOOL* /*pfCancel*/ | ||
| 185 | ) | ||
| 186 | { | ||
| 187 | return S_OK; | ||
| 188 | } | ||
| 189 | |||
| 190 | virtual STDMETHODIMP OnDetectTargetMsiPackage( | ||
| 191 | __in_z LPCWSTR /*wzPackageId*/, | ||
| 192 | __in_z LPCWSTR /*wzProductCode*/, | ||
| 193 | __in BOOTSTRAPPER_PACKAGE_STATE /*patchState*/, | ||
| 194 | __inout BOOL* /*pfCancel*/ | ||
| 195 | ) | ||
| 196 | { | ||
| 197 | return S_OK; | ||
| 198 | } | ||
| 199 | |||
| 200 | virtual STDMETHODIMP OnDetectMsiFeature( | ||
| 201 | __in_z LPCWSTR /*wzPackageId*/, | ||
| 202 | __in_z LPCWSTR /*wzFeatureId*/, | ||
| 203 | __in BOOTSTRAPPER_FEATURE_STATE /*state*/, | ||
| 204 | __inout BOOL* /*pfCancel*/ | ||
| 205 | ) | ||
| 206 | { | ||
| 207 | return S_OK; | ||
| 208 | } | ||
| 209 | |||
| 210 | virtual STDMETHODIMP OnDetectPackageComplete( | ||
| 211 | __in_z LPCWSTR /*wzPackageId*/, | ||
| 212 | __in HRESULT /*hrStatus*/, | ||
| 213 | __in BOOTSTRAPPER_PACKAGE_STATE /*state*/ | ||
| 214 | ) | ||
| 215 | { | ||
| 216 | return S_OK; | ||
| 217 | } | ||
| 218 | |||
| 219 | virtual STDMETHODIMP OnDetectComplete( | ||
| 220 | __in HRESULT /*hrStatus*/ | ||
| 221 | ) | ||
| 222 | { | ||
| 223 | return S_OK; | ||
| 224 | } | ||
| 225 | |||
| 226 | virtual STDMETHODIMP OnPlanBegin( | ||
| 227 | __in DWORD /*cPackages*/, | ||
| 228 | __inout BOOL* /*pfCancel*/ | ||
| 229 | ) | ||
| 230 | { | ||
| 231 | return S_OK; | ||
| 232 | } | ||
| 233 | |||
| 234 | virtual STDMETHODIMP OnPlanRelatedBundle( | ||
| 235 | __in_z LPCWSTR /*wzBundleId*/, | ||
| 236 | __in BOOTSTRAPPER_REQUEST_STATE /*recommendedState*/, | ||
| 237 | __inout BOOTSTRAPPER_REQUEST_STATE* /*pRequestedState*/, | ||
| 238 | __inout BOOL* /*pfCancel*/ | ||
| 239 | ) | ||
| 240 | { | ||
| 241 | return S_OK; | ||
| 242 | } | ||
| 243 | |||
| 244 | virtual STDMETHODIMP OnPlanPackageBegin( | ||
| 245 | __in_z LPCWSTR /*wzPackageId*/, | ||
| 246 | __in BOOTSTRAPPER_REQUEST_STATE /*recommendedState*/, | ||
| 247 | __inout BOOTSTRAPPER_REQUEST_STATE* /*pRequestState*/, | ||
| 248 | __inout BOOL* /*pfCancel*/ | ||
| 249 | ) | ||
| 250 | { | ||
| 251 | return S_OK; | ||
| 252 | } | ||
| 253 | |||
| 254 | virtual STDMETHODIMP OnPlanCompatibleMsiPackageBegin( | ||
| 255 | __in_z LPCWSTR /*wzPackageId*/, | ||
| 256 | __in_z LPCWSTR /*wzCompatiblePackageId*/, | ||
| 257 | __in DWORD64 /*dw64CompatiblePackageVersion*/, | ||
| 258 | __in BOOTSTRAPPER_REQUEST_STATE /*recommendedState*/, | ||
| 259 | __inout BOOTSTRAPPER_REQUEST_STATE* /*pRequestedState*/, | ||
| 260 | __inout BOOL* /*pfCancel*/ | ||
| 261 | ) | ||
| 262 | { | ||
| 263 | return S_OK; | ||
| 264 | } | ||
| 265 | |||
| 266 | virtual STDMETHODIMP OnPlanCompatibleMsiPackageComplete( | ||
| 267 | __in_z LPCWSTR /*wzPackageId*/, | ||
| 268 | __in_z LPCWSTR /*wzCompatiblePackageId*/, | ||
| 269 | __in HRESULT /*hrStatus*/, | ||
| 270 | __in BOOTSTRAPPER_PACKAGE_STATE /*state*/, | ||
| 271 | __in BOOTSTRAPPER_REQUEST_STATE /*requested*/, | ||
| 272 | __in BOOTSTRAPPER_ACTION_STATE /*execute*/, | ||
| 273 | __in BOOTSTRAPPER_ACTION_STATE /*rollback*/ | ||
| 274 | ) | ||
| 275 | { | ||
| 276 | return S_OK; | ||
| 277 | } | ||
| 278 | |||
| 279 | virtual STDMETHODIMP OnPlanTargetMsiPackage( | ||
| 280 | __in_z LPCWSTR /*wzPackageId*/, | ||
| 281 | __in_z LPCWSTR /*wzProductCode*/, | ||
| 282 | __in BOOTSTRAPPER_REQUEST_STATE /*recommendedState*/, | ||
| 283 | __inout BOOTSTRAPPER_REQUEST_STATE* /*pRequestedState*/, | ||
| 284 | __inout BOOL* /*pfCancel*/ | ||
| 285 | ) | ||
| 286 | { | ||
| 287 | return S_OK; | ||
| 288 | } | ||
| 289 | |||
| 290 | virtual STDMETHODIMP OnPlanMsiFeature( | ||
| 291 | __in_z LPCWSTR /*wzPackageId*/, | ||
| 292 | __in_z LPCWSTR /*wzFeatureId*/, | ||
| 293 | __in BOOTSTRAPPER_FEATURE_STATE /*recommendedState*/, | ||
| 294 | __inout BOOTSTRAPPER_FEATURE_STATE* /*pRequestedState*/, | ||
| 295 | __inout BOOL* /*pfCancel*/ | ||
| 296 | ) | ||
| 297 | { | ||
| 298 | return S_OK; | ||
| 299 | } | ||
| 300 | |||
| 301 | virtual STDMETHODIMP OnPlanPackageComplete( | ||
| 302 | __in_z LPCWSTR /*wzPackageId*/, | ||
| 303 | __in HRESULT /*hrStatus*/, | ||
| 304 | __in BOOTSTRAPPER_PACKAGE_STATE /*state*/, | ||
| 305 | __in BOOTSTRAPPER_REQUEST_STATE /*requested*/, | ||
| 306 | __in BOOTSTRAPPER_ACTION_STATE /*execute*/, | ||
| 307 | __in BOOTSTRAPPER_ACTION_STATE /*rollback*/ | ||
| 308 | ) | ||
| 309 | { | ||
| 310 | return S_OK; | ||
| 311 | } | ||
| 312 | |||
| 313 | virtual STDMETHODIMP OnPlanComplete( | ||
| 314 | __in HRESULT /*hrStatus*/ | ||
| 315 | ) | ||
| 316 | { | ||
| 317 | return S_OK; | ||
| 318 | } | ||
| 319 | |||
| 320 | virtual STDMETHODIMP OnApplyBegin( | ||
| 321 | __in DWORD /*dwPhaseCount*/, | ||
| 322 | __inout BOOL* /*pfCancel*/ | ||
| 323 | ) | ||
| 324 | { | ||
| 325 | return S_OK; | ||
| 326 | } | ||
| 327 | |||
| 328 | virtual STDMETHODIMP OnElevateBegin( | ||
| 329 | __inout BOOL* /*pfCancel*/ | ||
| 330 | ) | ||
| 331 | { | ||
| 332 | return S_OK; | ||
| 333 | } | ||
| 334 | |||
| 335 | virtual STDMETHODIMP OnElevateComplete( | ||
| 336 | __in HRESULT /*hrStatus*/ | ||
| 337 | ) | ||
| 338 | { | ||
| 339 | return S_OK; | ||
| 340 | } | ||
| 341 | |||
| 342 | virtual STDMETHODIMP OnProgress( | ||
| 343 | __in DWORD /*dwProgressPercentage*/, | ||
| 344 | __in DWORD /*dwOverallProgressPercentage*/, | ||
| 345 | __inout BOOL* /*pfCancel*/ | ||
| 346 | ) | ||
| 347 | { | ||
| 348 | return IDNOACTION; | ||
| 349 | } | ||
| 350 | |||
| 351 | virtual STDMETHODIMP OnError( | ||
| 352 | __in BOOTSTRAPPER_ERROR_TYPE /*errorType*/, | ||
| 353 | __in_z LPCWSTR /*wzPackageId*/, | ||
| 354 | __in DWORD /*dwCode*/, | ||
| 355 | __in_z LPCWSTR /*wzError*/, | ||
| 356 | __in DWORD /*dwUIHint*/, | ||
| 357 | __in DWORD /*cData*/, | ||
| 358 | __in_ecount_z_opt(cData) LPCWSTR* /*rgwzData*/, | ||
| 359 | __in int /*nRecommendation*/, | ||
| 360 | __inout int* /*pResult*/ | ||
| 361 | ) | ||
| 362 | { | ||
| 363 | return S_OK; | ||
| 364 | } | ||
| 365 | |||
| 366 | virtual STDMETHODIMP OnRegisterBegin( | ||
| 367 | __inout BOOL* /*pfCancel*/ | ||
| 368 | ) | ||
| 369 | { | ||
| 370 | return S_OK; | ||
| 371 | } | ||
| 372 | |||
| 373 | virtual STDMETHODIMP OnRegisterComplete( | ||
| 374 | __in HRESULT /*hrStatus*/ | ||
| 375 | ) | ||
| 376 | { | ||
| 377 | return S_OK; | ||
| 378 | } | ||
| 379 | |||
| 380 | virtual STDMETHODIMP OnCacheBegin( | ||
| 381 | __inout BOOL* /*pfCancel*/ | ||
| 382 | ) | ||
| 383 | { | ||
| 384 | return S_OK; | ||
| 385 | } | ||
| 386 | |||
| 387 | virtual STDMETHODIMP OnCachePackageBegin( | ||
| 388 | __in_z LPCWSTR /*wzPackageId*/, | ||
| 389 | __in DWORD /*cCachePayloads*/, | ||
| 390 | __in DWORD64 /*dw64PackageCacheSize*/, | ||
| 391 | __inout BOOL* /*pfCancel*/ | ||
| 392 | ) | ||
| 393 | { | ||
| 394 | return S_OK; | ||
| 395 | } | ||
| 396 | |||
| 397 | virtual STDMETHODIMP OnCacheAcquireBegin( | ||
| 398 | __in_z LPCWSTR /*wzPackageOrContainerId*/, | ||
| 399 | __in_z_opt LPCWSTR /*wzPayloadId*/, | ||
| 400 | __in BOOTSTRAPPER_CACHE_OPERATION /*operation*/, | ||
| 401 | __in_z LPCWSTR /*wzSource*/, | ||
| 402 | __inout BOOL* /*pfCancel*/ | ||
| 403 | ) | ||
| 404 | { | ||
| 405 | return S_OK; | ||
| 406 | } | ||
| 407 | |||
| 408 | virtual STDMETHODIMP OnCacheAcquireProgress( | ||
| 409 | __in_z LPCWSTR /*wzPackageOrContainerId*/, | ||
| 410 | __in_z_opt LPCWSTR /*wzPayloadId*/, | ||
| 411 | __in DWORD64 /*dw64Progress*/, | ||
| 412 | __in DWORD64 /*dw64Total*/, | ||
| 413 | __in DWORD /*dwOverallPercentage*/, | ||
| 414 | __inout BOOL* /*pfCancel*/ | ||
| 415 | ) | ||
| 416 | { | ||
| 417 | return S_OK; | ||
| 418 | } | ||
| 419 | |||
| 420 | virtual STDMETHODIMP OnResolveSource( | ||
| 421 | __in_z LPCWSTR /*wzPackageOrContainerId*/, | ||
| 422 | __in_z_opt LPCWSTR /*wzPayloadId*/, | ||
| 423 | __in_z LPCWSTR /*wzLocalSource*/, | ||
| 424 | __in_z_opt LPCWSTR /*wzDownloadSource*/, | ||
| 425 | __in BOOTSTRAPPER_RESOLVESOURCE_ACTION /*recommendation*/, | ||
| 426 | __inout BOOTSTRAPPER_RESOLVESOURCE_ACTION* /*pAction*/, | ||
| 427 | __inout BOOL* /*pfCancel*/ | ||
| 428 | ) | ||
| 429 | { | ||
| 430 | return S_OK; | ||
| 431 | } | ||
| 432 | |||
| 433 | virtual STDMETHODIMP OnCacheAcquireComplete( | ||
| 434 | __in_z LPCWSTR /*wzPackageOrContainerId*/, | ||
| 435 | __in_z_opt LPCWSTR /*wzPayloadId*/, | ||
| 436 | __in HRESULT /*hrStatus*/, | ||
| 437 | __in BOOTSTRAPPER_CACHEACQUIRECOMPLETE_ACTION /*recommendation*/, | ||
| 438 | __inout BOOTSTRAPPER_CACHEACQUIRECOMPLETE_ACTION* /*pAction*/ | ||
| 439 | ) | ||
| 440 | { | ||
| 441 | return S_OK; | ||
| 442 | } | ||
| 443 | |||
| 444 | virtual STDMETHODIMP OnCacheVerifyBegin( | ||
| 445 | __in_z LPCWSTR /*wzPackageId*/, | ||
| 446 | __in_z LPCWSTR /*wzPayloadId*/, | ||
| 447 | __inout BOOL* /*pfCancel*/ | ||
| 448 | ) | ||
| 449 | { | ||
| 450 | return S_OK; | ||
| 451 | } | ||
| 452 | |||
| 453 | virtual STDMETHODIMP OnCacheVerifyComplete( | ||
| 454 | __in_z LPCWSTR /*wzPackageId*/, | ||
| 455 | __in_z LPCWSTR /*wzPayloadId*/, | ||
| 456 | __in HRESULT /*hrStatus*/, | ||
| 457 | __in BOOTSTRAPPER_CACHEVERIFYCOMPLETE_ACTION /*recommendation*/, | ||
| 458 | __inout BOOTSTRAPPER_CACHEVERIFYCOMPLETE_ACTION* /*pAction*/ | ||
| 459 | ) | ||
| 460 | { | ||
| 461 | return S_OK; | ||
| 462 | } | ||
| 463 | |||
| 464 | virtual STDMETHODIMP OnCachePackageComplete( | ||
| 465 | __in_z LPCWSTR /*wzPackageId*/, | ||
| 466 | __in HRESULT /*hrStatus*/, | ||
| 467 | __in BOOTSTRAPPER_CACHEPACKAGECOMPLETE_ACTION /*recommendation*/, | ||
| 468 | __inout BOOTSTRAPPER_CACHEPACKAGECOMPLETE_ACTION* /*pAction*/ | ||
| 469 | ) | ||
| 470 | { | ||
| 471 | return S_OK; | ||
| 472 | } | ||
| 473 | |||
| 474 | virtual STDMETHODIMP OnCacheComplete( | ||
| 475 | __in HRESULT /*hrStatus*/ | ||
| 476 | ) | ||
| 477 | { | ||
| 478 | return S_OK; | ||
| 479 | } | ||
| 480 | |||
| 481 | virtual STDMETHODIMP OnExecuteBegin( | ||
| 482 | __in DWORD /*cExecutingPackages*/, | ||
| 483 | __inout BOOL* /*pfCancel*/ | ||
| 484 | ) | ||
| 485 | { | ||
| 486 | return S_OK; | ||
| 487 | } | ||
| 488 | |||
| 489 | virtual STDMETHODIMP OnExecutePackageBegin( | ||
| 490 | __in_z LPCWSTR /*wzPackageId*/, | ||
| 491 | __in BOOL /*fExecute*/, | ||
| 492 | __inout BOOL* /*pfCancel*/ | ||
| 493 | ) | ||
| 494 | { | ||
| 495 | return S_OK; | ||
| 496 | } | ||
| 497 | |||
| 498 | virtual STDMETHODIMP OnExecutePatchTarget( | ||
| 499 | __in_z LPCWSTR /*wzPackageId*/, | ||
| 500 | __in_z LPCWSTR /*wzTargetProductCode*/, | ||
| 501 | __inout BOOL* /*pfCancel*/ | ||
| 502 | ) | ||
| 503 | { | ||
| 504 | return S_OK; | ||
| 505 | } | ||
| 506 | |||
| 507 | virtual STDMETHODIMP OnExecuteProgress( | ||
| 508 | __in_z LPCWSTR /*wzPackageId*/, | ||
| 509 | __in DWORD /*dwProgressPercentage*/, | ||
| 510 | __in DWORD /*dwOverallProgressPercentage*/, | ||
| 511 | __inout BOOL* /*pfCancel*/ | ||
| 512 | ) | ||
| 513 | { | ||
| 514 | return S_OK; | ||
| 515 | } | ||
| 516 | |||
| 517 | virtual STDMETHODIMP OnExecuteMsiMessage( | ||
| 518 | __in_z LPCWSTR /*wzPackageId*/, | ||
| 519 | __in INSTALLMESSAGE /*messageType*/, | ||
| 520 | __in DWORD /*dwUIHint*/, | ||
| 521 | __in_z LPCWSTR /*wzMessage*/, | ||
| 522 | __in DWORD /*cData*/, | ||
| 523 | __in_ecount_z_opt(cData) LPCWSTR* /*rgwzData*/, | ||
| 524 | __in int /*nRecommendation*/, | ||
| 525 | __inout int* /*pResult*/ | ||
| 526 | ) | ||
| 527 | { | ||
| 528 | return S_OK; | ||
| 529 | } | ||
| 530 | |||
| 531 | virtual STDMETHODIMP OnExecuteFilesInUse( | ||
| 532 | __in_z LPCWSTR /*wzPackageId*/, | ||
| 533 | __in DWORD /*cFiles*/, | ||
| 534 | __in_ecount_z(cFiles) LPCWSTR* /*rgwzFiles*/, | ||
| 535 | __in int /*nRecommendation*/, | ||
| 536 | __inout int* /*pResult*/ | ||
| 537 | ) | ||
| 538 | { | ||
| 539 | return S_OK; | ||
| 540 | } | ||
| 541 | |||
| 542 | virtual STDMETHODIMP OnExecutePackageComplete( | ||
| 543 | __in_z LPCWSTR /*wzPackageId*/, | ||
| 544 | __in HRESULT /*hrStatus*/, | ||
| 545 | __in BOOTSTRAPPER_APPLY_RESTART /*restart*/, | ||
| 546 | __in BOOTSTRAPPER_EXECUTEPACKAGECOMPLETE_ACTION /*recommendation*/, | ||
| 547 | __inout BOOTSTRAPPER_EXECUTEPACKAGECOMPLETE_ACTION* /*pAction*/ | ||
| 548 | ) | ||
| 549 | { | ||
| 550 | return S_OK; | ||
| 551 | } | ||
| 552 | |||
| 553 | virtual STDMETHODIMP OnExecuteComplete( | ||
| 554 | __in HRESULT /*hrStatus*/ | ||
| 555 | ) | ||
| 556 | { | ||
| 557 | return S_OK; | ||
| 558 | } | ||
| 559 | |||
| 560 | virtual STDMETHODIMP OnUnregisterBegin( | ||
| 561 | __inout BOOL* /*pfCancel*/ | ||
| 562 | ) | ||
| 563 | { | ||
| 564 | return S_OK; | ||
| 565 | } | ||
| 566 | |||
| 567 | virtual STDMETHODIMP OnUnregisterComplete( | ||
| 568 | __in HRESULT /*hrStatus*/ | ||
| 569 | ) | ||
| 570 | { | ||
| 571 | return S_OK; | ||
| 572 | } | ||
| 573 | |||
| 574 | virtual STDMETHODIMP OnApplyComplete( | ||
| 575 | __in HRESULT /*hrStatus*/, | ||
| 576 | __in BOOTSTRAPPER_APPLY_RESTART /*restart*/, | ||
| 577 | __in BOOTSTRAPPER_APPLYCOMPLETE_ACTION /*recommendation*/, | ||
| 578 | __inout BOOTSTRAPPER_APPLYCOMPLETE_ACTION* /*pAction*/ | ||
| 579 | ) | ||
| 580 | { | ||
| 581 | return S_OK; | ||
| 582 | } | ||
| 583 | |||
| 584 | virtual STDMETHODIMP OnLaunchApprovedExeBegin( | ||
| 585 | __inout BOOL* /*pfCancel*/ | ||
| 586 | ) | ||
| 587 | { | ||
| 588 | return S_OK; | ||
| 589 | } | ||
| 590 | |||
| 591 | virtual STDMETHODIMP OnLaunchApprovedExeComplete( | ||
| 592 | __in HRESULT /*hrStatus*/, | ||
| 593 | __in DWORD /*dwProcessId*/ | ||
| 594 | ) | ||
| 595 | { | ||
| 596 | return S_OK; | ||
| 597 | } | ||
| 598 | |||
| 599 | virtual STDMETHODIMP_(HRESULT) BAProc( | ||
| 600 | __in BOOTSTRAPPER_APPLICATION_MESSAGE /*message*/, | ||
| 601 | __in const LPVOID /*pvArgs*/, | ||
| 602 | __inout LPVOID /*pvResults*/, | ||
| 603 | __in_opt LPVOID /*pvContext*/ | ||
| 604 | ) | ||
| 605 | { | ||
| 606 | return E_NOTIMPL; | ||
| 607 | } | ||
| 608 | |||
| 609 | virtual STDMETHODIMP_(void) BAProcFallback( | ||
| 610 | __in BOOTSTRAPPER_APPLICATION_MESSAGE /*message*/, | ||
| 611 | __in const LPVOID /*pvArgs*/, | ||
| 612 | __inout LPVOID /*pvResults*/, | ||
| 613 | __inout HRESULT* /*phr*/, | ||
| 614 | __in_opt LPVOID /*pvContext*/ | ||
| 615 | ) | ||
| 616 | { | ||
| 617 | } | ||
| 618 | |||
| 619 | public: // IBAFunctions | ||
| 620 | virtual STDMETHODIMP OnPlan( | ||
| 621 | ) | ||
| 622 | { | ||
| 623 | return S_OK; | ||
| 624 | } | ||
| 625 | |||
| 626 | virtual STDMETHODIMP OnThemeLoaded( | ||
| 627 | THEME* pTheme, | ||
| 628 | WIX_LOCALIZATION* pWixLoc | ||
| 629 | ) | ||
| 630 | { | ||
| 631 | HRESULT hr = S_OK; | ||
| 632 | |||
| 633 | m_pTheme = pTheme; | ||
| 634 | m_pWixLoc = pWixLoc; | ||
| 635 | |||
| 636 | return hr; | ||
| 637 | } | ||
| 638 | |||
| 639 | virtual STDMETHODIMP WndProc( | ||
| 640 | __in THEME* pTheme, | ||
| 641 | __in HWND hWnd, | ||
| 642 | __in UINT uMsg, | ||
| 643 | __in WPARAM wParam, | ||
| 644 | __in LPARAM lParam, | ||
| 645 | __inout LRESULT* plRes | ||
| 646 | ) | ||
| 647 | { | ||
| 648 | HRESULT hr = S_OK; | ||
| 649 | |||
| 650 | *plRes = ThemeDefWindowProc(pTheme, hWnd, uMsg, wParam, lParam); | ||
| 651 | |||
| 652 | return hr; | ||
| 653 | } | ||
| 654 | |||
| 655 | virtual STDMETHODIMP BAFunctionsProc( | ||
| 656 | __in BA_FUNCTIONS_MESSAGE /*message*/, | ||
| 657 | __in const LPVOID /*pvArgs*/, | ||
| 658 | __inout LPVOID /*pvResults*/, | ||
| 659 | __in_opt LPVOID /*pvContext*/ | ||
| 660 | ) | ||
| 661 | { | ||
| 662 | return E_NOTIMPL; | ||
| 663 | } | ||
| 664 | |||
| 665 | protected: | ||
| 666 | CBalBaseBAFunctions( | ||
| 667 | __in HMODULE hModule, | ||
| 668 | __in IBootstrapperEngine* pEngine, | ||
| 669 | __in const BA_FUNCTIONS_CREATE_ARGS* pArgs | ||
| 670 | ) | ||
| 671 | { | ||
| 672 | m_cReferences = 1; | ||
| 673 | m_hModule = hModule; | ||
| 674 | pEngine->AddRef(); | ||
| 675 | m_pEngine = pEngine; | ||
| 676 | |||
| 677 | memcpy_s(&m_command, sizeof(m_command), pArgs->pBootstrapperCreateArgs->pCommand, sizeof(BOOTSTRAPPER_COMMAND)); | ||
| 678 | memcpy_s(&m_baCreateArgs, sizeof(m_baCreateArgs), pArgs->pBootstrapperCreateArgs, sizeof(BOOTSTRAPPER_CREATE_ARGS)); | ||
| 679 | memcpy_s(&m_bafCreateArgs, sizeof(m_bafCreateArgs), pArgs, sizeof(BA_FUNCTIONS_CREATE_ARGS)); | ||
| 680 | m_baCreateArgs.pCommand = &m_command; | ||
| 681 | m_bafCreateArgs.pBootstrapperCreateArgs = &m_baCreateArgs; | ||
| 682 | } | ||
| 683 | |||
| 684 | virtual ~CBalBaseBAFunctions() | ||
| 685 | { | ||
| 686 | ReleaseNullObject(m_pEngine); | ||
| 687 | } | ||
| 688 | |||
| 689 | private: | ||
| 690 | long m_cReferences; | ||
| 691 | |||
| 692 | protected: | ||
| 693 | IBootstrapperEngine* m_pEngine; | ||
| 694 | HMODULE m_hModule; | ||
| 695 | BA_FUNCTIONS_CREATE_ARGS m_bafCreateArgs; | ||
| 696 | BOOTSTRAPPER_CREATE_ARGS m_baCreateArgs; | ||
| 697 | BOOTSTRAPPER_COMMAND m_command; | ||
| 698 | THEME* m_pTheme; | ||
| 699 | WIX_LOCALIZATION* m_pWixLoc; | ||
| 700 | }; | ||
diff --git a/src/balutil/inc/BalBaseBAFunctionsProc.h b/src/balutil/inc/BalBaseBAFunctionsProc.h new file mode 100644 index 00000000..da0a71f7 --- /dev/null +++ b/src/balutil/inc/BalBaseBAFunctionsProc.h | |||
| @@ -0,0 +1,114 @@ | |||
| 1 | #pragma once | ||
| 2 | // 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. | ||
| 3 | |||
| 4 | |||
| 5 | #include "BalBaseBootstrapperApplicationProc.h" | ||
| 6 | #include "BAFunctions.h" | ||
| 7 | #include "IBAFunctions.h" | ||
| 8 | |||
| 9 | static HRESULT BalBaseBAFunctionsProcOnThemeLoaded( | ||
| 10 | __in IBAFunctions* pBAFunctions, | ||
| 11 | __in BA_FUNCTIONS_ONTHEMELOADED_ARGS* pArgs, | ||
| 12 | __inout BA_FUNCTIONS_ONTHEMELOADED_RESULTS* /*pResults*/ | ||
| 13 | ) | ||
| 14 | { | ||
| 15 | return pBAFunctions->OnThemeLoaded(pArgs->pTheme, pArgs->pWixLoc); | ||
| 16 | } | ||
| 17 | |||
| 18 | static HRESULT BalBaseBAFunctionsProcWndProc( | ||
| 19 | __in IBAFunctions* pBAFunctions, | ||
| 20 | __in BA_FUNCTIONS_WNDPROC_ARGS* pArgs, | ||
| 21 | __inout BA_FUNCTIONS_WNDPROC_RESULTS* pResults | ||
| 22 | ) | ||
| 23 | { | ||
| 24 | return pBAFunctions->WndProc(pArgs->pTheme, pArgs->hWnd, pArgs->uMsg, pArgs->wParam, pArgs->lParam, &pResults->lres); | ||
| 25 | } | ||
| 26 | |||
| 27 | /******************************************************************* | ||
| 28 | BalBaseBAFunctionsProc - requires pvContext to be of type IBAFunctions. | ||
| 29 | Provides a default mapping between the message based BAFunctions interface and | ||
| 30 | the COM-based BAFunctions interface. | ||
| 31 | |||
| 32 | *******************************************************************/ | ||
| 33 | static HRESULT WINAPI BalBaseBAFunctionsProc( | ||
| 34 | __in BA_FUNCTIONS_MESSAGE message, | ||
| 35 | __in const LPVOID pvArgs, | ||
| 36 | __inout LPVOID pvResults, | ||
| 37 | __in_opt LPVOID pvContext | ||
| 38 | ) | ||
| 39 | { | ||
| 40 | IBAFunctions* pBAFunctions = reinterpret_cast<IBAFunctions*>(pvContext); | ||
| 41 | HRESULT hr = pBAFunctions->BAFunctionsProc(message, pvArgs, pvResults, pvContext); | ||
| 42 | |||
| 43 | if (E_NOTIMPL == hr) | ||
| 44 | { | ||
| 45 | switch (message) | ||
| 46 | { | ||
| 47 | case BA_FUNCTIONS_MESSAGE_ONDETECTBEGIN: | ||
| 48 | case BA_FUNCTIONS_MESSAGE_ONDETECTCOMPLETE: | ||
| 49 | case BA_FUNCTIONS_MESSAGE_ONPLANBEGIN: | ||
| 50 | case BA_FUNCTIONS_MESSAGE_ONPLANCOMPLETE: | ||
| 51 | case BA_FUNCTIONS_MESSAGE_ONSTARTUP: | ||
| 52 | case BA_FUNCTIONS_MESSAGE_ONSHUTDOWN: | ||
| 53 | case BA_FUNCTIONS_MESSAGE_ONSYSTEMSHUTDOWN: | ||
| 54 | case BA_FUNCTIONS_MESSAGE_ONDETECTFORWARDCOMPATIBLEBUNDLE: | ||
| 55 | case BA_FUNCTIONS_MESSAGE_ONDETECTUPDATEBEGIN: | ||
| 56 | case BA_FUNCTIONS_MESSAGE_ONDETECTUPDATE: | ||
| 57 | case BA_FUNCTIONS_MESSAGE_ONDETECTUPDATECOMPLETE: | ||
| 58 | case BA_FUNCTIONS_MESSAGE_ONDETECTRELATEDBUNDLE: | ||
| 59 | case BA_FUNCTIONS_MESSAGE_ONDETECTPACKAGEBEGIN: | ||
| 60 | case BA_FUNCTIONS_MESSAGE_ONDETECTCOMPATIBLEMSIPACKAGE: | ||
| 61 | case BA_FUNCTIONS_MESSAGE_ONDETECTRELATEDMSIPACKAGE: | ||
| 62 | case BA_FUNCTIONS_MESSAGE_ONDETECTTARGETMSIPACKAGE: | ||
| 63 | case BA_FUNCTIONS_MESSAGE_ONDETECTMSIFEATURE: | ||
| 64 | case BA_FUNCTIONS_MESSAGE_ONDETECTPACKAGECOMPLETE: | ||
| 65 | case BA_FUNCTIONS_MESSAGE_ONPLANRELATEDBUNDLE: | ||
| 66 | case BA_FUNCTIONS_MESSAGE_ONPLANPACKAGEBEGIN: | ||
| 67 | case BA_FUNCTIONS_MESSAGE_ONPLANCOMPATIBLEMSIPACKAGEBEGIN: | ||
| 68 | case BA_FUNCTIONS_MESSAGE_ONPLANCOMPATIBLEMSIPACKAGECOMPLETE: | ||
| 69 | case BA_FUNCTIONS_MESSAGE_ONPLANTARGETMSIPACKAGE: | ||
| 70 | case BA_FUNCTIONS_MESSAGE_ONPLANMSIFEATURE: | ||
| 71 | case BA_FUNCTIONS_MESSAGE_ONPLANPACKAGECOMPLETE: | ||
| 72 | case BA_FUNCTIONS_MESSAGE_ONAPPLYBEGIN: | ||
| 73 | case BA_FUNCTIONS_MESSAGE_ONELEVATEBEGIN: | ||
| 74 | case BA_FUNCTIONS_MESSAGE_ONELEVATECOMPLETE: | ||
| 75 | case BA_FUNCTIONS_MESSAGE_ONPROGRESS: | ||
| 76 | case BA_FUNCTIONS_MESSAGE_ONERROR: | ||
| 77 | case BA_FUNCTIONS_MESSAGE_ONREGISTERBEGIN: | ||
| 78 | case BA_FUNCTIONS_MESSAGE_ONREGISTERCOMPLETE: | ||
| 79 | case BA_FUNCTIONS_MESSAGE_ONCACHEBEGIN: | ||
| 80 | case BA_FUNCTIONS_MESSAGE_ONCACHEPACKAGEBEGIN: | ||
| 81 | case BA_FUNCTIONS_MESSAGE_ONCACHEACQUIREBEGIN: | ||
| 82 | case BA_FUNCTIONS_MESSAGE_ONCACHEACQUIREPROGRESS: | ||
| 83 | case BA_FUNCTIONS_MESSAGE_ONRESOLVESOURCE: | ||
| 84 | case BA_FUNCTIONS_MESSAGE_ONCACHEACQUIRECOMPLETE: | ||
| 85 | case BA_FUNCTIONS_MESSAGE_ONCACHEVERIFYBEGIN: | ||
| 86 | case BA_FUNCTIONS_MESSAGE_ONCACHEVERIFYCOMPLETE: | ||
| 87 | case BA_FUNCTIONS_MESSAGE_ONCACHEPACKAGECOMPLETE: | ||
| 88 | case BA_FUNCTIONS_MESSAGE_ONCACHECOMPLETE: | ||
| 89 | case BA_FUNCTIONS_MESSAGE_ONEXECUTEBEGIN: | ||
| 90 | case BA_FUNCTIONS_MESSAGE_ONEXECUTEPACKAGEBEGIN: | ||
| 91 | case BA_FUNCTIONS_MESSAGE_ONEXECUTEPATCHTARGET: | ||
| 92 | case BA_FUNCTIONS_MESSAGE_ONEXECUTEPROGRESS: | ||
| 93 | case BA_FUNCTIONS_MESSAGE_ONEXECUTEMSIMESSAGE: | ||
| 94 | case BA_FUNCTIONS_MESSAGE_ONEXECUTEFILESINUSE: | ||
| 95 | case BA_FUNCTIONS_MESSAGE_ONEXECUTEPACKAGECOMPLETE: | ||
| 96 | case BA_FUNCTIONS_MESSAGE_ONEXECUTECOMPLETE: | ||
| 97 | case BA_FUNCTIONS_MESSAGE_ONUNREGISTERBEGIN: | ||
| 98 | case BA_FUNCTIONS_MESSAGE_ONUNREGISTERCOMPLETE: | ||
| 99 | case BA_FUNCTIONS_MESSAGE_ONAPPLYCOMPLETE: | ||
| 100 | case BA_FUNCTIONS_MESSAGE_ONLAUNCHAPPROVEDEXEBEGIN: | ||
| 101 | case BA_FUNCTIONS_MESSAGE_ONLAUNCHAPPROVEDEXECOMPLETE: | ||
| 102 | hr = BalBaseBootstrapperApplicationProc((BOOTSTRAPPER_APPLICATION_MESSAGE)message, pvArgs, pvResults, pvContext); | ||
| 103 | break; | ||
| 104 | case BA_FUNCTIONS_MESSAGE_ONTHEMELOADED: | ||
| 105 | hr = BalBaseBAFunctionsProcOnThemeLoaded(pBAFunctions, reinterpret_cast<BA_FUNCTIONS_ONTHEMELOADED_ARGS*>(pvArgs), reinterpret_cast<BA_FUNCTIONS_ONTHEMELOADED_RESULTS*>(pvResults)); | ||
| 106 | break; | ||
| 107 | case BA_FUNCTIONS_MESSAGE_WNDPROC: | ||
| 108 | hr = BalBaseBAFunctionsProcWndProc(pBAFunctions, reinterpret_cast<BA_FUNCTIONS_WNDPROC_ARGS*>(pvArgs), reinterpret_cast<BA_FUNCTIONS_WNDPROC_RESULTS*>(pvResults)); | ||
| 109 | break; | ||
| 110 | } | ||
| 111 | } | ||
| 112 | |||
| 113 | return hr; | ||
| 114 | } | ||
diff --git a/src/balutil/inc/BalBaseBootstrapperApplication.h b/src/balutil/inc/BalBaseBootstrapperApplication.h new file mode 100644 index 00000000..ac354e7b --- /dev/null +++ b/src/balutil/inc/BalBaseBootstrapperApplication.h | |||
| @@ -0,0 +1,900 @@ | |||
| 1 | // 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. | ||
| 2 | |||
| 3 | #include <windows.h> | ||
| 4 | #include <msiquery.h> | ||
| 5 | |||
| 6 | #include "BootstrapperEngine.h" | ||
| 7 | #include "BootstrapperApplication.h" | ||
| 8 | #include "IBootstrapperEngine.h" | ||
| 9 | #include "IBootstrapperApplication.h" | ||
| 10 | |||
| 11 | #include "balutil.h" | ||
| 12 | #include "balretry.h" | ||
| 13 | |||
| 14 | class CBalBaseBootstrapperApplication : public IBootstrapperApplication | ||
| 15 | { | ||
| 16 | public: // IUnknown | ||
| 17 | virtual STDMETHODIMP QueryInterface( | ||
| 18 | __in REFIID riid, | ||
| 19 | __out LPVOID *ppvObject | ||
| 20 | ) | ||
| 21 | { | ||
| 22 | if (!ppvObject) | ||
| 23 | { | ||
| 24 | return E_INVALIDARG; | ||
| 25 | } | ||
| 26 | |||
| 27 | *ppvObject = NULL; | ||
| 28 | |||
| 29 | if (::IsEqualIID(__uuidof(IBootstrapperApplication), riid)) | ||
| 30 | { | ||
| 31 | *ppvObject = static_cast<IBootstrapperApplication*>(this); | ||
| 32 | } | ||
| 33 | else if (::IsEqualIID(IID_IUnknown, riid)) | ||
| 34 | { | ||
| 35 | *ppvObject = static_cast<IUnknown*>(this); | ||
| 36 | } | ||
| 37 | else // no interface for requested iid | ||
| 38 | { | ||
| 39 | return E_NOINTERFACE; | ||
| 40 | } | ||
| 41 | |||
| 42 | AddRef(); | ||
| 43 | return S_OK; | ||
| 44 | } | ||
| 45 | |||
| 46 | virtual STDMETHODIMP_(ULONG) AddRef() | ||
| 47 | { | ||
| 48 | return ::InterlockedIncrement(&this->m_cReferences); | ||
| 49 | } | ||
| 50 | |||
| 51 | virtual STDMETHODIMP_(ULONG) Release() | ||
| 52 | { | ||
| 53 | long l = ::InterlockedDecrement(&this->m_cReferences); | ||
| 54 | if (0 < l) | ||
| 55 | { | ||
| 56 | return l; | ||
| 57 | } | ||
| 58 | |||
| 59 | delete this; | ||
| 60 | return 0; | ||
| 61 | } | ||
| 62 | |||
| 63 | public: // IBootstrapperApplication | ||
| 64 | virtual STDMETHODIMP OnStartup() | ||
| 65 | { | ||
| 66 | return S_OK; | ||
| 67 | } | ||
| 68 | |||
| 69 | virtual STDMETHODIMP OnShutdown( | ||
| 70 | __inout BOOTSTRAPPER_SHUTDOWN_ACTION* /*pAction*/ | ||
| 71 | ) | ||
| 72 | { | ||
| 73 | return S_OK; | ||
| 74 | } | ||
| 75 | |||
| 76 | virtual STDMETHODIMP OnSystemShutdown( | ||
| 77 | __in DWORD dwEndSession, | ||
| 78 | __inout BOOL* pfCancel | ||
| 79 | ) | ||
| 80 | { | ||
| 81 | HRESULT hr = S_OK; | ||
| 82 | |||
| 83 | // Allow requests to shut down when critical or not applying. | ||
| 84 | *pfCancel = !(ENDSESSION_CRITICAL & dwEndSession || !m_fApplying); | ||
| 85 | |||
| 86 | return hr; | ||
| 87 | } | ||
| 88 | |||
| 89 | virtual STDMETHODIMP OnDetectBegin( | ||
| 90 | __in BOOL /*fInstalled*/, | ||
| 91 | __in DWORD /*cPackages*/, | ||
| 92 | __inout BOOL* pfCancel | ||
| 93 | ) | ||
| 94 | { | ||
| 95 | *pfCancel |= CheckCanceled(); | ||
| 96 | return S_OK; | ||
| 97 | } | ||
| 98 | |||
| 99 | virtual STDMETHODIMP OnDetectForwardCompatibleBundle( | ||
| 100 | __in_z LPCWSTR /*wzBundleId*/, | ||
| 101 | __in BOOTSTRAPPER_RELATION_TYPE /*relationType*/, | ||
| 102 | __in_z LPCWSTR /*wzBundleTag*/, | ||
| 103 | __in BOOL /*fPerMachine*/, | ||
| 104 | __in DWORD64 /*dw64Version*/, | ||
| 105 | __inout BOOL* pfCancel, | ||
| 106 | __inout BOOL* /*pfIgnoreBundle*/ | ||
| 107 | ) | ||
| 108 | { | ||
| 109 | *pfCancel |= CheckCanceled(); | ||
| 110 | return S_OK; | ||
| 111 | } | ||
| 112 | |||
| 113 | virtual STDMETHODIMP OnDetectUpdateBegin( | ||
| 114 | __in_z LPCWSTR /*wzUpdateLocation*/, | ||
| 115 | __inout BOOL* pfCancel, | ||
| 116 | __inout BOOL* /*pfSkip*/ | ||
| 117 | ) | ||
| 118 | { | ||
| 119 | *pfCancel |= CheckCanceled(); | ||
| 120 | return S_OK; | ||
| 121 | } | ||
| 122 | |||
| 123 | virtual STDMETHODIMP OnDetectUpdate( | ||
| 124 | __in_z LPCWSTR /*wzUpdateLocation*/, | ||
| 125 | __in DWORD64 /*dw64Size*/, | ||
| 126 | __in DWORD64 /*dw64Version*/, | ||
| 127 | __in_z LPCWSTR /*wzTitle*/, | ||
| 128 | __in_z LPCWSTR /*wzSummary*/, | ||
| 129 | __in_z LPCWSTR /*wzContentType*/, | ||
| 130 | __in_z LPCWSTR /*wzContent*/, | ||
| 131 | __inout BOOL* pfCancel, | ||
| 132 | __inout BOOL* /*pfStopProcessingUpdates*/ | ||
| 133 | ) | ||
| 134 | { | ||
| 135 | *pfCancel |= CheckCanceled(); | ||
| 136 | return S_OK; | ||
| 137 | } | ||
| 138 | |||
| 139 | virtual STDMETHODIMP OnDetectUpdateComplete( | ||
| 140 | __in HRESULT /*hrStatus*/, | ||
| 141 | __inout BOOL* /*pfIgnoreError*/ | ||
| 142 | ) | ||
| 143 | { | ||
| 144 | return S_OK; | ||
| 145 | } | ||
| 146 | |||
| 147 | virtual STDMETHODIMP OnDetectRelatedBundle( | ||
| 148 | __in_z LPCWSTR /*wzBundleId*/, | ||
| 149 | __in BOOTSTRAPPER_RELATION_TYPE /*relationType*/, | ||
| 150 | __in_z LPCWSTR /*wzBundleTag*/, | ||
| 151 | __in BOOL /*fPerMachine*/, | ||
| 152 | __in DWORD64 /*dw64Version*/, | ||
| 153 | __in BOOTSTRAPPER_RELATED_OPERATION /*operation*/, | ||
| 154 | __inout BOOL* pfCancel | ||
| 155 | ) | ||
| 156 | { | ||
| 157 | *pfCancel |= CheckCanceled(); | ||
| 158 | return S_OK; | ||
| 159 | } | ||
| 160 | |||
| 161 | virtual STDMETHODIMP OnDetectPackageBegin( | ||
| 162 | __in_z LPCWSTR /*wzPackageId*/, | ||
| 163 | __inout BOOL* pfCancel | ||
| 164 | ) | ||
| 165 | { | ||
| 166 | *pfCancel |= CheckCanceled(); | ||
| 167 | return S_OK; | ||
| 168 | } | ||
| 169 | |||
| 170 | virtual STDMETHODIMP OnDetectCompatibleMsiPackage( | ||
| 171 | __in_z LPCWSTR /*wzPackageId*/, | ||
| 172 | __in_z LPCWSTR /*wzCompatiblePackageId*/, | ||
| 173 | __in DWORD64 /*dw64CompatiblePackageVersion*/, | ||
| 174 | __inout BOOL* pfCancel | ||
| 175 | ) | ||
| 176 | { | ||
| 177 | *pfCancel |= CheckCanceled(); | ||
| 178 | return S_OK; | ||
| 179 | } | ||
| 180 | |||
| 181 | virtual STDMETHODIMP OnDetectRelatedMsiPackage( | ||
| 182 | __in_z LPCWSTR /*wzPackageId*/, | ||
| 183 | __in_z LPCWSTR /*wzUpgradeCode*/, | ||
| 184 | __in_z LPCWSTR /*wzProductCode*/, | ||
| 185 | __in BOOL /*fPerMachine*/, | ||
| 186 | __in DWORD64 /*dw64Version*/, | ||
| 187 | __in BOOTSTRAPPER_RELATED_OPERATION /*operation*/, | ||
| 188 | __inout BOOL* pfCancel | ||
| 189 | ) | ||
| 190 | { | ||
| 191 | *pfCancel |= CheckCanceled(); | ||
| 192 | return S_OK; | ||
| 193 | } | ||
| 194 | |||
| 195 | virtual STDMETHODIMP OnDetectTargetMsiPackage( | ||
| 196 | __in_z LPCWSTR /*wzPackageId*/, | ||
| 197 | __in_z LPCWSTR /*wzProductCode*/, | ||
| 198 | __in BOOTSTRAPPER_PACKAGE_STATE /*patchState*/, | ||
| 199 | __inout BOOL* pfCancel | ||
| 200 | ) | ||
| 201 | { | ||
| 202 | *pfCancel |= CheckCanceled(); | ||
| 203 | return S_OK; | ||
| 204 | } | ||
| 205 | |||
| 206 | virtual STDMETHODIMP OnDetectMsiFeature( | ||
| 207 | __in_z LPCWSTR /*wzPackageId*/, | ||
| 208 | __in_z LPCWSTR /*wzFeatureId*/, | ||
| 209 | __in BOOTSTRAPPER_FEATURE_STATE /*state*/, | ||
| 210 | __inout BOOL* pfCancel | ||
| 211 | ) | ||
| 212 | { | ||
| 213 | *pfCancel |= CheckCanceled(); | ||
| 214 | return S_OK; | ||
| 215 | } | ||
| 216 | |||
| 217 | virtual STDMETHODIMP OnDetectPackageComplete( | ||
| 218 | __in_z LPCWSTR /*wzPackageId*/, | ||
| 219 | __in HRESULT /*hrStatus*/, | ||
| 220 | __in BOOTSTRAPPER_PACKAGE_STATE /*state*/ | ||
| 221 | ) | ||
| 222 | { | ||
| 223 | return S_OK; | ||
| 224 | } | ||
| 225 | |||
| 226 | virtual STDMETHODIMP OnDetectComplete( | ||
| 227 | __in HRESULT /*hrStatus*/ | ||
| 228 | ) | ||
| 229 | { | ||
| 230 | return S_OK; | ||
| 231 | } | ||
| 232 | |||
| 233 | virtual STDMETHODIMP OnPlanBegin( | ||
| 234 | __in DWORD /*cPackages*/, | ||
| 235 | __inout BOOL* pfCancel | ||
| 236 | ) | ||
| 237 | { | ||
| 238 | *pfCancel |= CheckCanceled(); | ||
| 239 | return S_OK; | ||
| 240 | } | ||
| 241 | |||
| 242 | virtual STDMETHODIMP OnPlanRelatedBundle( | ||
| 243 | __in_z LPCWSTR /*wzBundleId*/, | ||
| 244 | __in BOOTSTRAPPER_REQUEST_STATE /*recommendedState*/, | ||
| 245 | __inout BOOTSTRAPPER_REQUEST_STATE* /*pRequestedState*/, | ||
| 246 | __inout BOOL* pfCancel | ||
| 247 | ) | ||
| 248 | { | ||
| 249 | *pfCancel |= CheckCanceled(); | ||
| 250 | return S_OK; | ||
| 251 | } | ||
| 252 | |||
| 253 | virtual STDMETHODIMP OnPlanPackageBegin( | ||
| 254 | __in_z LPCWSTR /*wzPackageId*/, | ||
| 255 | __in BOOTSTRAPPER_REQUEST_STATE /*recommendedState*/, | ||
| 256 | __inout BOOTSTRAPPER_REQUEST_STATE* /*pRequestState*/, | ||
| 257 | __inout BOOL* pfCancel | ||
| 258 | ) | ||
| 259 | { | ||
| 260 | *pfCancel |= CheckCanceled(); | ||
| 261 | return S_OK; | ||
| 262 | } | ||
| 263 | |||
| 264 | virtual STDMETHODIMP OnPlanCompatibleMsiPackageBegin( | ||
| 265 | __in_z LPCWSTR /*wzPackageId*/, | ||
| 266 | __in_z LPCWSTR /*wzCompatiblePackageId*/, | ||
| 267 | __in DWORD64 /*dw64CompatiblePackageVersion*/, | ||
| 268 | __in BOOTSTRAPPER_REQUEST_STATE /*recommendedState*/, | ||
| 269 | __inout BOOTSTRAPPER_REQUEST_STATE* /*pRequestedState*/, | ||
| 270 | __inout BOOL* pfCancel | ||
| 271 | ) | ||
| 272 | { | ||
| 273 | *pfCancel |= CheckCanceled(); | ||
| 274 | return S_OK; | ||
| 275 | } | ||
| 276 | |||
| 277 | virtual STDMETHODIMP OnPlanCompatibleMsiPackageComplete( | ||
| 278 | __in_z LPCWSTR /*wzPackageId*/, | ||
| 279 | __in_z LPCWSTR /*wzCompatiblePackageId*/, | ||
| 280 | __in HRESULT /*hrStatus*/, | ||
| 281 | __in BOOTSTRAPPER_PACKAGE_STATE /*state*/, | ||
| 282 | __in BOOTSTRAPPER_REQUEST_STATE /*requested*/, | ||
| 283 | __in BOOTSTRAPPER_ACTION_STATE /*execute*/, | ||
| 284 | __in BOOTSTRAPPER_ACTION_STATE /*rollback*/ | ||
| 285 | ) | ||
| 286 | { | ||
| 287 | return S_OK; | ||
| 288 | } | ||
| 289 | |||
| 290 | virtual STDMETHODIMP OnPlanTargetMsiPackage( | ||
| 291 | __in_z LPCWSTR /*wzPackageId*/, | ||
| 292 | __in_z LPCWSTR /*wzProductCode*/, | ||
| 293 | __in BOOTSTRAPPER_REQUEST_STATE /*recommendedState*/, | ||
| 294 | __inout BOOTSTRAPPER_REQUEST_STATE* /*pRequestedState*/, | ||
| 295 | __inout BOOL* pfCancel | ||
| 296 | ) | ||
| 297 | { | ||
| 298 | *pfCancel |= CheckCanceled(); | ||
| 299 | return S_OK; | ||
| 300 | } | ||
| 301 | |||
| 302 | virtual STDMETHODIMP OnPlanMsiFeature( | ||
| 303 | __in_z LPCWSTR /*wzPackageId*/, | ||
| 304 | __in_z LPCWSTR /*wzFeatureId*/, | ||
| 305 | __in BOOTSTRAPPER_FEATURE_STATE /*recommendedState*/, | ||
| 306 | __inout BOOTSTRAPPER_FEATURE_STATE* /*pRequestedState*/, | ||
| 307 | __inout BOOL* pfCancel | ||
| 308 | ) | ||
| 309 | { | ||
| 310 | *pfCancel |= CheckCanceled(); | ||
| 311 | return S_OK; | ||
| 312 | } | ||
| 313 | |||
| 314 | virtual STDMETHODIMP OnPlanPackageComplete( | ||
| 315 | __in_z LPCWSTR /*wzPackageId*/, | ||
| 316 | __in HRESULT /*hrStatus*/, | ||
| 317 | __in BOOTSTRAPPER_PACKAGE_STATE /*state*/, | ||
| 318 | __in BOOTSTRAPPER_REQUEST_STATE /*requested*/, | ||
| 319 | __in BOOTSTRAPPER_ACTION_STATE /*execute*/, | ||
| 320 | __in BOOTSTRAPPER_ACTION_STATE /*rollback*/ | ||
| 321 | ) | ||
| 322 | { | ||
| 323 | return S_OK; | ||
| 324 | } | ||
| 325 | |||
| 326 | virtual STDMETHODIMP OnPlanComplete( | ||
| 327 | __in HRESULT /*hrStatus*/ | ||
| 328 | ) | ||
| 329 | { | ||
| 330 | return S_OK; | ||
| 331 | } | ||
| 332 | |||
| 333 | virtual STDMETHODIMP OnApplyBegin( | ||
| 334 | __in DWORD /*dwPhaseCount*/, | ||
| 335 | __inout BOOL* pfCancel | ||
| 336 | ) | ||
| 337 | { | ||
| 338 | m_fApplying = TRUE; | ||
| 339 | |||
| 340 | m_dwProgressPercentage = 0; | ||
| 341 | m_dwOverallProgressPercentage = 0; | ||
| 342 | |||
| 343 | *pfCancel |= CheckCanceled(); | ||
| 344 | return S_OK; | ||
| 345 | } | ||
| 346 | |||
| 347 | virtual STDMETHODIMP OnElevateBegin( | ||
| 348 | __inout BOOL* pfCancel | ||
| 349 | ) | ||
| 350 | { | ||
| 351 | *pfCancel |= CheckCanceled(); | ||
| 352 | return S_OK; | ||
| 353 | } | ||
| 354 | |||
| 355 | virtual STDMETHODIMP OnElevateComplete( | ||
| 356 | __in HRESULT /*hrStatus*/ | ||
| 357 | ) | ||
| 358 | { | ||
| 359 | return S_OK; | ||
| 360 | } | ||
| 361 | |||
| 362 | virtual STDMETHODIMP OnProgress( | ||
| 363 | __in DWORD dwProgressPercentage, | ||
| 364 | __in DWORD dwOverallProgressPercentage, | ||
| 365 | __inout BOOL* pfCancel | ||
| 366 | ) | ||
| 367 | { | ||
| 368 | HRESULT hr = S_OK; | ||
| 369 | int nResult = IDNOACTION; | ||
| 370 | |||
| 371 | m_dwProgressPercentage = dwProgressPercentage; | ||
| 372 | m_dwOverallProgressPercentage = dwOverallProgressPercentage; | ||
| 373 | |||
| 374 | if (BOOTSTRAPPER_DISPLAY_EMBEDDED == m_display) | ||
| 375 | { | ||
| 376 | hr = m_pEngine->SendEmbeddedProgress(m_dwProgressPercentage, m_dwOverallProgressPercentage, &nResult); | ||
| 377 | BalExitOnFailure(hr, "Failed to send embedded overall progress."); | ||
| 378 | |||
| 379 | if (IDERROR == nResult) | ||
| 380 | { | ||
| 381 | hr = E_FAIL; | ||
| 382 | } | ||
| 383 | else if (IDCANCEL == nResult) | ||
| 384 | { | ||
| 385 | *pfCancel = TRUE; | ||
| 386 | } | ||
| 387 | } | ||
| 388 | |||
| 389 | LExit: | ||
| 390 | *pfCancel |= CheckCanceled(); | ||
| 391 | return hr; | ||
| 392 | } | ||
| 393 | |||
| 394 | virtual STDMETHODIMP OnError( | ||
| 395 | __in BOOTSTRAPPER_ERROR_TYPE errorType, | ||
| 396 | __in_z LPCWSTR wzPackageId, | ||
| 397 | __in DWORD dwCode, | ||
| 398 | __in_z LPCWSTR /*wzError*/, | ||
| 399 | __in DWORD /*dwUIHint*/, | ||
| 400 | __in DWORD /*cData*/, | ||
| 401 | __in_ecount_z_opt(cData) LPCWSTR* /*rgwzData*/, | ||
| 402 | __in int /*nRecommendation*/, | ||
| 403 | __inout int* pResult | ||
| 404 | ) | ||
| 405 | { | ||
| 406 | BalRetryErrorOccurred(wzPackageId, dwCode); | ||
| 407 | |||
| 408 | if (CheckCanceled()) | ||
| 409 | { | ||
| 410 | *pResult = IDCANCEL; | ||
| 411 | } | ||
| 412 | else if (BOOTSTRAPPER_DISPLAY_FULL == m_display) | ||
| 413 | { | ||
| 414 | if (BOOTSTRAPPER_ERROR_TYPE_HTTP_AUTH_SERVER == errorType || BOOTSTRAPPER_ERROR_TYPE_HTTP_AUTH_PROXY == errorType) | ||
| 415 | { | ||
| 416 | *pResult = IDTRYAGAIN; | ||
| 417 | } | ||
| 418 | } | ||
| 419 | |||
| 420 | return S_OK; | ||
| 421 | } | ||
| 422 | |||
| 423 | virtual STDMETHODIMP OnRegisterBegin( | ||
| 424 | __inout BOOL* pfCancel | ||
| 425 | ) | ||
| 426 | { | ||
| 427 | *pfCancel |= CheckCanceled(); | ||
| 428 | return S_OK; | ||
| 429 | } | ||
| 430 | |||
| 431 | virtual STDMETHODIMP OnRegisterComplete( | ||
| 432 | __in HRESULT /*hrStatus*/ | ||
| 433 | ) | ||
| 434 | { | ||
| 435 | return S_OK; | ||
| 436 | } | ||
| 437 | |||
| 438 | virtual STDMETHODIMP OnCacheBegin( | ||
| 439 | __inout BOOL* pfCancel | ||
| 440 | ) | ||
| 441 | { | ||
| 442 | *pfCancel |= CheckCanceled(); | ||
| 443 | return S_OK; | ||
| 444 | } | ||
| 445 | |||
| 446 | virtual STDMETHODIMP OnCachePackageBegin( | ||
| 447 | __in_z LPCWSTR /*wzPackageId*/, | ||
| 448 | __in DWORD /*cCachePayloads*/, | ||
| 449 | __in DWORD64 /*dw64PackageCacheSize*/, | ||
| 450 | __inout BOOL* pfCancel | ||
| 451 | ) | ||
| 452 | { | ||
| 453 | *pfCancel |= CheckCanceled(); | ||
| 454 | return S_OK; | ||
| 455 | } | ||
| 456 | |||
| 457 | virtual STDMETHODIMP OnCacheAcquireBegin( | ||
| 458 | __in_z LPCWSTR wzPackageOrContainerId, | ||
| 459 | __in_z_opt LPCWSTR wzPayloadId, | ||
| 460 | __in BOOTSTRAPPER_CACHE_OPERATION /*operation*/, | ||
| 461 | __in_z LPCWSTR /*wzSource*/, | ||
| 462 | __inout BOOL* pfCancel | ||
| 463 | ) | ||
| 464 | { | ||
| 465 | BalRetryStartPackage(BALRETRY_TYPE_CACHE, wzPackageOrContainerId, wzPayloadId); | ||
| 466 | *pfCancel |= CheckCanceled(); | ||
| 467 | return S_OK; | ||
| 468 | } | ||
| 469 | |||
| 470 | virtual STDMETHODIMP OnCacheAcquireProgress( | ||
| 471 | __in_z LPCWSTR /*wzPackageOrContainerId*/, | ||
| 472 | __in_z_opt LPCWSTR /*wzPayloadId*/, | ||
| 473 | __in DWORD64 /*dw64Progress*/, | ||
| 474 | __in DWORD64 /*dw64Total*/, | ||
| 475 | __in DWORD /*dwOverallPercentage*/, | ||
| 476 | __inout BOOL* pfCancel | ||
| 477 | ) | ||
| 478 | { | ||
| 479 | HRESULT hr = S_OK; | ||
| 480 | int nResult = IDNOACTION; | ||
| 481 | |||
| 482 | // Send progress even though we don't update the numbers to at least give the caller an opportunity | ||
| 483 | // to cancel. | ||
| 484 | if (BOOTSTRAPPER_DISPLAY_EMBEDDED == m_display) | ||
| 485 | { | ||
| 486 | hr = m_pEngine->SendEmbeddedProgress(m_dwProgressPercentage, m_dwOverallProgressPercentage, &nResult); | ||
| 487 | BalExitOnFailure(hr, "Failed to send embedded cache progress."); | ||
| 488 | |||
| 489 | if (IDERROR == nResult) | ||
| 490 | { | ||
| 491 | hr = E_FAIL; | ||
| 492 | } | ||
| 493 | else if (IDCANCEL == nResult) | ||
| 494 | { | ||
| 495 | *pfCancel = TRUE; | ||
| 496 | } | ||
| 497 | } | ||
| 498 | |||
| 499 | LExit: | ||
| 500 | *pfCancel |= CheckCanceled(); | ||
| 501 | return hr; | ||
| 502 | } | ||
| 503 | |||
| 504 | virtual STDMETHODIMP OnResolveSource( | ||
| 505 | __in_z LPCWSTR /*wzPackageOrContainerId*/, | ||
| 506 | __in_z_opt LPCWSTR /*wzPayloadId*/, | ||
| 507 | __in_z LPCWSTR /*wzLocalSource*/, | ||
| 508 | __in_z_opt LPCWSTR /*wzDownloadSource*/, | ||
| 509 | __in BOOTSTRAPPER_RESOLVESOURCE_ACTION /*recommendation*/, | ||
| 510 | __inout BOOTSTRAPPER_RESOLVESOURCE_ACTION* /*pAction*/, | ||
| 511 | __inout BOOL* pfCancel | ||
| 512 | ) | ||
| 513 | { | ||
| 514 | *pfCancel |= CheckCanceled(); | ||
| 515 | return S_OK; | ||
| 516 | } | ||
| 517 | |||
| 518 | virtual STDMETHODIMP OnCacheAcquireComplete( | ||
| 519 | __in_z LPCWSTR wzPackageOrContainerId, | ||
| 520 | __in_z_opt LPCWSTR wzPayloadId, | ||
| 521 | __in HRESULT hrStatus, | ||
| 522 | __in BOOTSTRAPPER_CACHEACQUIRECOMPLETE_ACTION /*recommendation*/, | ||
| 523 | __inout BOOTSTRAPPER_CACHEACQUIRECOMPLETE_ACTION* pAction | ||
| 524 | ) | ||
| 525 | { | ||
| 526 | HRESULT hr = S_OK; | ||
| 527 | BOOL fRetry = FALSE; | ||
| 528 | |||
| 529 | if (CheckCanceled()) | ||
| 530 | { | ||
| 531 | ExitFunction1(hr = HRESULT_FROM_WIN32(ERROR_INSTALL_USEREXIT)); | ||
| 532 | } | ||
| 533 | |||
| 534 | hr = BalRetryEndPackage(BALRETRY_TYPE_CACHE, wzPackageOrContainerId, wzPayloadId, hrStatus, &fRetry); | ||
| 535 | ExitOnFailure(hr, "BalRetryEndPackage for cache failed"); | ||
| 536 | |||
| 537 | if (fRetry) | ||
| 538 | { | ||
| 539 | *pAction = BOOTSTRAPPER_CACHEACQUIRECOMPLETE_ACTION_RETRY; | ||
| 540 | } | ||
| 541 | |||
| 542 | LExit: | ||
| 543 | return hr; | ||
| 544 | } | ||
| 545 | |||
| 546 | virtual STDMETHODIMP OnCacheVerifyBegin( | ||
| 547 | __in_z LPCWSTR /*wzPackageId*/, | ||
| 548 | __in_z LPCWSTR /*wzPayloadId*/, | ||
| 549 | __inout BOOL* pfCancel | ||
| 550 | ) | ||
| 551 | { | ||
| 552 | *pfCancel |= CheckCanceled(); | ||
| 553 | return S_OK; | ||
| 554 | } | ||
| 555 | |||
| 556 | virtual STDMETHODIMP OnCacheVerifyComplete( | ||
| 557 | __in_z LPCWSTR /*wzPackageId*/, | ||
| 558 | __in_z LPCWSTR /*wzPayloadId*/, | ||
| 559 | __in HRESULT /*hrStatus*/, | ||
| 560 | __in BOOTSTRAPPER_CACHEVERIFYCOMPLETE_ACTION /*recommendation*/, | ||
| 561 | __inout BOOTSTRAPPER_CACHEVERIFYCOMPLETE_ACTION* pAction | ||
| 562 | ) | ||
| 563 | { | ||
| 564 | if (CheckCanceled()) | ||
| 565 | { | ||
| 566 | *pAction = BOOTSTRAPPER_CACHEVERIFYCOMPLETE_ACTION_NONE; | ||
| 567 | } | ||
| 568 | |||
| 569 | return S_OK; | ||
| 570 | } | ||
| 571 | |||
| 572 | virtual STDMETHODIMP OnCachePackageComplete( | ||
| 573 | __in_z LPCWSTR /*wzPackageId*/, | ||
| 574 | __in HRESULT /*hrStatus*/, | ||
| 575 | __in BOOTSTRAPPER_CACHEPACKAGECOMPLETE_ACTION /*recommendation*/, | ||
| 576 | __inout BOOTSTRAPPER_CACHEPACKAGECOMPLETE_ACTION* pAction | ||
| 577 | ) | ||
| 578 | { | ||
| 579 | if (CheckCanceled()) | ||
| 580 | { | ||
| 581 | *pAction = BOOTSTRAPPER_CACHEPACKAGECOMPLETE_ACTION_NONE; | ||
| 582 | } | ||
| 583 | |||
| 584 | return S_OK; | ||
| 585 | } | ||
| 586 | |||
| 587 | virtual STDMETHODIMP OnCacheComplete( | ||
| 588 | __in HRESULT /*hrStatus*/ | ||
| 589 | ) | ||
| 590 | { | ||
| 591 | return S_OK; | ||
| 592 | } | ||
| 593 | |||
| 594 | virtual STDMETHODIMP OnExecuteBegin( | ||
| 595 | __in DWORD /*cExecutingPackages*/, | ||
| 596 | __inout BOOL* pfCancel | ||
| 597 | ) | ||
| 598 | { | ||
| 599 | *pfCancel |= CheckCanceled(); | ||
| 600 | return S_OK; | ||
| 601 | } | ||
| 602 | |||
| 603 | virtual STDMETHODIMP OnExecutePackageBegin( | ||
| 604 | __in_z LPCWSTR wzPackageId, | ||
| 605 | __in BOOL fExecute, | ||
| 606 | __inout BOOL* pfCancel | ||
| 607 | ) | ||
| 608 | { | ||
| 609 | // Only track retry on execution (not rollback). | ||
| 610 | if (fExecute) | ||
| 611 | { | ||
| 612 | BalRetryStartPackage(BALRETRY_TYPE_EXECUTE, wzPackageId, NULL); | ||
| 613 | } | ||
| 614 | |||
| 615 | m_fRollingBack = !fExecute; | ||
| 616 | *pfCancel |= CheckCanceled(); | ||
| 617 | return S_OK; | ||
| 618 | } | ||
| 619 | |||
| 620 | virtual STDMETHODIMP OnExecutePatchTarget( | ||
| 621 | __in_z LPCWSTR /*wzPackageId*/, | ||
| 622 | __in_z LPCWSTR /*wzTargetProductCode*/, | ||
| 623 | __inout BOOL* pfCancel | ||
| 624 | ) | ||
| 625 | { | ||
| 626 | *pfCancel |= CheckCanceled(); | ||
| 627 | return S_OK; | ||
| 628 | } | ||
| 629 | |||
| 630 | virtual STDMETHODIMP OnExecuteProgress( | ||
| 631 | __in_z LPCWSTR /*wzPackageId*/, | ||
| 632 | __in DWORD /*dwProgressPercentage*/, | ||
| 633 | __in DWORD /*dwOverallProgressPercentage*/, | ||
| 634 | __inout BOOL* pfCancel | ||
| 635 | ) | ||
| 636 | { | ||
| 637 | HRESULT hr = S_OK; | ||
| 638 | int nResult = IDNOACTION; | ||
| 639 | |||
| 640 | // Send progress even though we don't update the numbers to at least give the caller an opportunity | ||
| 641 | // to cancel. | ||
| 642 | if (BOOTSTRAPPER_DISPLAY_EMBEDDED == m_display) | ||
| 643 | { | ||
| 644 | hr = m_pEngine->SendEmbeddedProgress(m_dwProgressPercentage, m_dwOverallProgressPercentage, &nResult); | ||
| 645 | BalExitOnFailure(hr, "Failed to send embedded execute progress."); | ||
| 646 | |||
| 647 | if (IDERROR == nResult) | ||
| 648 | { | ||
| 649 | hr = E_FAIL; | ||
| 650 | } | ||
| 651 | else if (IDCANCEL == nResult) | ||
| 652 | { | ||
| 653 | *pfCancel = TRUE; | ||
| 654 | } | ||
| 655 | } | ||
| 656 | |||
| 657 | LExit: | ||
| 658 | *pfCancel |= CheckCanceled(); | ||
| 659 | return hr; | ||
| 660 | } | ||
| 661 | |||
| 662 | virtual STDMETHODIMP OnExecuteMsiMessage( | ||
| 663 | __in_z LPCWSTR /*wzPackageId*/, | ||
| 664 | __in INSTALLMESSAGE /*messageType*/, | ||
| 665 | __in DWORD /*dwUIHint*/, | ||
| 666 | __in_z LPCWSTR /*wzMessage*/, | ||
| 667 | __in DWORD /*cData*/, | ||
| 668 | __in_ecount_z_opt(cData) LPCWSTR* /*rgwzData*/, | ||
| 669 | __in int /*nRecommendation*/, | ||
| 670 | __inout int* pResult | ||
| 671 | ) | ||
| 672 | { | ||
| 673 | if (CheckCanceled()) | ||
| 674 | { | ||
| 675 | *pResult = IDCANCEL; | ||
| 676 | } | ||
| 677 | |||
| 678 | return S_OK; | ||
| 679 | } | ||
| 680 | |||
| 681 | virtual STDMETHODIMP OnExecuteFilesInUse( | ||
| 682 | __in_z LPCWSTR /*wzPackageId*/, | ||
| 683 | __in DWORD /*cFiles*/, | ||
| 684 | __in_ecount_z(cFiles) LPCWSTR* /*rgwzFiles*/, | ||
| 685 | __in int /*nRecommendation*/, | ||
| 686 | __inout int* pResult | ||
| 687 | ) | ||
| 688 | { | ||
| 689 | if (CheckCanceled()) | ||
| 690 | { | ||
| 691 | *pResult = IDCANCEL; | ||
| 692 | } | ||
| 693 | |||
| 694 | return S_OK; | ||
| 695 | } | ||
| 696 | |||
| 697 | virtual STDMETHODIMP OnExecutePackageComplete( | ||
| 698 | __in_z LPCWSTR wzPackageId, | ||
| 699 | __in HRESULT hrStatus, | ||
| 700 | __in BOOTSTRAPPER_APPLY_RESTART /*restart*/, | ||
| 701 | __in BOOTSTRAPPER_EXECUTEPACKAGECOMPLETE_ACTION /*recommendation*/, | ||
| 702 | __inout BOOTSTRAPPER_EXECUTEPACKAGECOMPLETE_ACTION* pAction | ||
| 703 | ) | ||
| 704 | { | ||
| 705 | HRESULT hr = S_OK; | ||
| 706 | BOOL fRetry = FALSE; | ||
| 707 | |||
| 708 | if (CheckCanceled()) | ||
| 709 | { | ||
| 710 | ExitFunction1(hr = HRESULT_FROM_WIN32(ERROR_INSTALL_USEREXIT)); | ||
| 711 | } | ||
| 712 | |||
| 713 | hr = BalRetryEndPackage(BALRETRY_TYPE_EXECUTE, wzPackageId, NULL, hrStatus, &fRetry); | ||
| 714 | ExitOnFailure(hr, "BalRetryEndPackage for execute failed"); | ||
| 715 | |||
| 716 | if (fRetry) | ||
| 717 | { | ||
| 718 | *pAction = BOOTSTRAPPER_EXECUTEPACKAGECOMPLETE_ACTION_RETRY; | ||
| 719 | } | ||
| 720 | |||
| 721 | LExit: | ||
| 722 | return hr; | ||
| 723 | } | ||
| 724 | |||
| 725 | virtual STDMETHODIMP OnExecuteComplete( | ||
| 726 | __in HRESULT /*hrStatus*/ | ||
| 727 | ) | ||
| 728 | { | ||
| 729 | return S_OK; | ||
| 730 | } | ||
| 731 | |||
| 732 | virtual STDMETHODIMP OnUnregisterBegin( | ||
| 733 | __inout BOOL* pfCancel | ||
| 734 | ) | ||
| 735 | { | ||
| 736 | *pfCancel |= CheckCanceled(); | ||
| 737 | return S_OK; | ||
| 738 | } | ||
| 739 | |||
| 740 | virtual STDMETHODIMP OnUnregisterComplete( | ||
| 741 | __in HRESULT /*hrStatus*/ | ||
| 742 | ) | ||
| 743 | { | ||
| 744 | return S_OK; | ||
| 745 | } | ||
| 746 | |||
| 747 | virtual STDMETHODIMP OnApplyComplete( | ||
| 748 | __in HRESULT /*hrStatus*/, | ||
| 749 | __in BOOTSTRAPPER_APPLY_RESTART restart, | ||
| 750 | __in BOOTSTRAPPER_APPLYCOMPLETE_ACTION /*recommendation*/, | ||
| 751 | __inout BOOTSTRAPPER_APPLYCOMPLETE_ACTION* pAction | ||
| 752 | ) | ||
| 753 | { | ||
| 754 | HRESULT hr = S_OK; | ||
| 755 | BOOL fRestartRequired = BOOTSTRAPPER_APPLY_RESTART_REQUIRED == restart; | ||
| 756 | BOOL fShouldBlockRestart = BOOTSTRAPPER_DISPLAY_FULL <= m_display && BOOTSTRAPPER_RESTART_PROMPT >= m_restart; | ||
| 757 | |||
| 758 | if (fRestartRequired && !fShouldBlockRestart) | ||
| 759 | { | ||
| 760 | *pAction = BOOTSTRAPPER_APPLYCOMPLETE_ACTION_RESTART; | ||
| 761 | } | ||
| 762 | |||
| 763 | m_fApplying = FALSE; | ||
| 764 | |||
| 765 | return hr; | ||
| 766 | } | ||
| 767 | |||
| 768 | virtual STDMETHODIMP OnLaunchApprovedExeBegin( | ||
| 769 | __inout BOOL* pfCancel | ||
| 770 | ) | ||
| 771 | { | ||
| 772 | *pfCancel |= CheckCanceled(); | ||
| 773 | return S_OK; | ||
| 774 | } | ||
| 775 | |||
| 776 | virtual STDMETHODIMP OnLaunchApprovedExeComplete( | ||
| 777 | __in HRESULT /*hrStatus*/, | ||
| 778 | __in DWORD /*dwProcessId*/ | ||
| 779 | ) | ||
| 780 | { | ||
| 781 | return S_OK; | ||
| 782 | } | ||
| 783 | |||
| 784 | virtual STDMETHODIMP_(HRESULT) BAProc( | ||
| 785 | __in BOOTSTRAPPER_APPLICATION_MESSAGE /*message*/, | ||
| 786 | __in const LPVOID /*pvArgs*/, | ||
| 787 | __inout LPVOID /*pvResults*/, | ||
| 788 | __in_opt LPVOID /*pvContext*/ | ||
| 789 | ) | ||
| 790 | { | ||
| 791 | return E_NOTIMPL; | ||
| 792 | } | ||
| 793 | |||
| 794 | virtual STDMETHODIMP_(void) BAProcFallback( | ||
| 795 | __in BOOTSTRAPPER_APPLICATION_MESSAGE /*message*/, | ||
| 796 | __in const LPVOID /*pvArgs*/, | ||
| 797 | __inout LPVOID /*pvResults*/, | ||
| 798 | __inout HRESULT* /*phr*/, | ||
| 799 | __in_opt LPVOID /*pvContext*/ | ||
| 800 | ) | ||
| 801 | { | ||
| 802 | } | ||
| 803 | |||
| 804 | protected: | ||
| 805 | // | ||
| 806 | // PromptCancel - prompts the user to close (if not forced). | ||
| 807 | // | ||
| 808 | virtual BOOL PromptCancel( | ||
| 809 | __in HWND hWnd, | ||
| 810 | __in BOOL fForceCancel, | ||
| 811 | __in_z_opt LPCWSTR wzMessage, | ||
| 812 | __in_z_opt LPCWSTR wzCaption | ||
| 813 | ) | ||
| 814 | { | ||
| 815 | ::EnterCriticalSection(&m_csCanceled); | ||
| 816 | |||
| 817 | // Only prompt the user to close if we have not canceled already. | ||
| 818 | if (!m_fCanceled) | ||
| 819 | { | ||
| 820 | if (fForceCancel) | ||
| 821 | { | ||
| 822 | m_fCanceled = TRUE; | ||
| 823 | } | ||
| 824 | else | ||
| 825 | { | ||
| 826 | m_fCanceled = (IDYES == ::MessageBoxW(hWnd, wzMessage, wzCaption, MB_YESNO | MB_ICONEXCLAMATION)); | ||
| 827 | } | ||
| 828 | } | ||
| 829 | |||
| 830 | ::LeaveCriticalSection(&m_csCanceled); | ||
| 831 | |||
| 832 | return m_fCanceled; | ||
| 833 | } | ||
| 834 | |||
| 835 | // | ||
| 836 | // CheckCanceled - waits if the cancel dialog is up and checks to see if the user canceled the operation. | ||
| 837 | // | ||
| 838 | BOOL CheckCanceled() | ||
| 839 | { | ||
| 840 | ::EnterCriticalSection(&m_csCanceled); | ||
| 841 | ::LeaveCriticalSection(&m_csCanceled); | ||
| 842 | return m_fRollingBack ? FALSE : m_fCanceled; | ||
| 843 | } | ||
| 844 | |||
| 845 | BOOL IsRollingBack() | ||
| 846 | { | ||
| 847 | return m_fRollingBack; | ||
| 848 | } | ||
| 849 | |||
| 850 | BOOL IsCanceled() | ||
| 851 | { | ||
| 852 | return m_fCanceled; | ||
| 853 | } | ||
| 854 | |||
| 855 | CBalBaseBootstrapperApplication( | ||
| 856 | __in IBootstrapperEngine* pEngine, | ||
| 857 | __in const BOOTSTRAPPER_CREATE_ARGS* pArgs, | ||
| 858 | __in DWORD dwRetryCount = 0, | ||
| 859 | __in DWORD dwRetryTimeout = 1000 | ||
| 860 | ) | ||
| 861 | { | ||
| 862 | m_cReferences = 1; | ||
| 863 | m_display = pArgs->pCommand->display; | ||
| 864 | m_restart = pArgs->pCommand->restart; | ||
| 865 | |||
| 866 | pEngine->AddRef(); | ||
| 867 | m_pEngine = pEngine; | ||
| 868 | |||
| 869 | ::InitializeCriticalSection(&m_csCanceled); | ||
| 870 | m_fCanceled = FALSE; | ||
| 871 | m_fApplying = FALSE; | ||
| 872 | m_fRollingBack = FALSE; | ||
| 873 | |||
| 874 | BalRetryInitialize(dwRetryCount, dwRetryTimeout); | ||
| 875 | } | ||
| 876 | |||
| 877 | virtual ~CBalBaseBootstrapperApplication() | ||
| 878 | { | ||
| 879 | BalRetryUninitialize(); | ||
| 880 | ::DeleteCriticalSection(&m_csCanceled); | ||
| 881 | |||
| 882 | ReleaseNullObject(m_pEngine); | ||
| 883 | } | ||
| 884 | |||
| 885 | protected: | ||
| 886 | CRITICAL_SECTION m_csCanceled; | ||
| 887 | BOOL m_fCanceled; | ||
| 888 | |||
| 889 | private: | ||
| 890 | long m_cReferences; | ||
| 891 | BOOTSTRAPPER_DISPLAY m_display; | ||
| 892 | BOOTSTRAPPER_RESTART m_restart; | ||
| 893 | IBootstrapperEngine* m_pEngine; | ||
| 894 | |||
| 895 | BOOL m_fApplying; | ||
| 896 | BOOL m_fRollingBack; | ||
| 897 | |||
| 898 | DWORD m_dwProgressPercentage; | ||
| 899 | DWORD m_dwOverallProgressPercentage; | ||
| 900 | }; | ||
diff --git a/src/balutil/inc/BalBaseBootstrapperApplicationProc.h b/src/balutil/inc/BalBaseBootstrapperApplicationProc.h new file mode 100644 index 00000000..4b8f4ca7 --- /dev/null +++ b/src/balutil/inc/BalBaseBootstrapperApplicationProc.h | |||
| @@ -0,0 +1,698 @@ | |||
| 1 | #pragma once | ||
| 2 | // 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. | ||
| 3 | |||
| 4 | |||
| 5 | #include <windows.h> | ||
| 6 | |||
| 7 | #include "BootstrapperEngine.h" | ||
| 8 | #include "BootstrapperApplication.h" | ||
| 9 | #include "IBootstrapperEngine.h" | ||
| 10 | #include "IBootstrapperApplication.h" | ||
| 11 | |||
| 12 | static HRESULT BalBaseBAProcOnDetectBegin( | ||
| 13 | __in IBootstrapperApplication* pBA, | ||
| 14 | __in BA_ONDETECTBEGIN_ARGS* pArgs, | ||
| 15 | __inout BA_ONDETECTBEGIN_RESULTS* pResults | ||
| 16 | ) | ||
| 17 | { | ||
| 18 | return pBA->OnDetectBegin(pArgs->fInstalled, pArgs->cPackages, &pResults->fCancel); | ||
| 19 | } | ||
| 20 | |||
| 21 | static HRESULT BalBaseBAProcOnDetectComplete( | ||
| 22 | __in IBootstrapperApplication* pBA, | ||
| 23 | __in BA_ONDETECTCOMPLETE_ARGS* pArgs, | ||
| 24 | __inout BA_ONDETECTCOMPLETE_RESULTS* /*pResults*/ | ||
| 25 | ) | ||
| 26 | { | ||
| 27 | return pBA->OnDetectComplete(pArgs->hrStatus); | ||
| 28 | } | ||
| 29 | |||
| 30 | static HRESULT BalBaseBAProcOnPlanBegin( | ||
| 31 | __in IBootstrapperApplication* pBA, | ||
| 32 | __in BA_ONPLANBEGIN_ARGS* pArgs, | ||
| 33 | __inout BA_ONPLANBEGIN_RESULTS* pResults | ||
| 34 | ) | ||
| 35 | { | ||
| 36 | return pBA->OnPlanBegin(pArgs->cPackages, &pResults->fCancel); | ||
| 37 | } | ||
| 38 | |||
| 39 | static HRESULT BalBaseBAProcOnPlanComplete( | ||
| 40 | __in IBootstrapperApplication* pBA, | ||
| 41 | __in BA_ONPLANCOMPLETE_ARGS* pArgs, | ||
| 42 | __inout BA_ONPLANCOMPLETE_RESULTS* /*pResults*/ | ||
| 43 | ) | ||
| 44 | { | ||
| 45 | return pBA->OnPlanComplete(pArgs->hrStatus); | ||
| 46 | } | ||
| 47 | |||
| 48 | static HRESULT BalBaseBAProcOnStartup( | ||
| 49 | __in IBootstrapperApplication* pBA, | ||
| 50 | __in BA_ONSTARTUP_ARGS* /*pArgs*/, | ||
| 51 | __inout BA_ONSTARTUP_RESULTS* /*pResults*/ | ||
| 52 | ) | ||
| 53 | { | ||
| 54 | return pBA->OnStartup(); | ||
| 55 | } | ||
| 56 | |||
| 57 | static HRESULT BalBaseBAProcOnShutdown( | ||
| 58 | __in IBootstrapperApplication* pBA, | ||
| 59 | __in BA_ONSHUTDOWN_ARGS* /*pArgs*/, | ||
| 60 | __inout BA_ONSHUTDOWN_RESULTS* pResults | ||
| 61 | ) | ||
| 62 | { | ||
| 63 | return pBA->OnShutdown(&pResults->action); | ||
| 64 | } | ||
| 65 | |||
| 66 | static HRESULT BalBaseBAProcOnSystemShutdown( | ||
| 67 | __in IBootstrapperApplication* pBA, | ||
| 68 | __in BA_ONSYSTEMSHUTDOWN_ARGS* pArgs, | ||
| 69 | __inout BA_ONSYSTEMSHUTDOWN_RESULTS* pResults | ||
| 70 | ) | ||
| 71 | { | ||
| 72 | return pBA->OnSystemShutdown(pArgs->dwEndSession, &pResults->fCancel); | ||
| 73 | } | ||
| 74 | |||
| 75 | static HRESULT BalBaseBAProcOnDetectForwardCompatibleBundle( | ||
| 76 | __in IBootstrapperApplication* pBA, | ||
| 77 | __in BA_ONDETECTFORWARDCOMPATIBLEBUNDLE_ARGS* pArgs, | ||
| 78 | __inout BA_ONDETECTFORWARDCOMPATIBLEBUNDLE_RESULTS* pResults | ||
| 79 | ) | ||
| 80 | { | ||
| 81 | return pBA->OnDetectForwardCompatibleBundle(pArgs->wzBundleId, pArgs->relationType, pArgs->wzBundleTag, pArgs->fPerMachine, pArgs->dw64Version, &pResults->fCancel, &pResults->fIgnoreBundle); | ||
| 82 | } | ||
| 83 | |||
| 84 | static HRESULT BalBaseBAProcOnDetectUpdateBegin( | ||
| 85 | __in IBootstrapperApplication* pBA, | ||
| 86 | __in BA_ONDETECTUPDATEBEGIN_ARGS* pArgs, | ||
| 87 | __inout BA_ONDETECTUPDATEBEGIN_RESULTS* pResults | ||
| 88 | ) | ||
| 89 | { | ||
| 90 | return pBA->OnDetectUpdateBegin(pArgs->wzUpdateLocation, &pResults->fCancel, &pResults->fSkip); | ||
| 91 | } | ||
| 92 | |||
| 93 | static HRESULT BalBaseBAProcOnDetectUpdate( | ||
| 94 | __in IBootstrapperApplication* pBA, | ||
| 95 | __in BA_ONDETECTUPDATE_ARGS* pArgs, | ||
| 96 | __inout BA_ONDETECTUPDATE_RESULTS* pResults | ||
| 97 | ) | ||
| 98 | { | ||
| 99 | return pBA->OnDetectUpdate(pArgs->wzUpdateLocation, pArgs->dw64Size, pArgs->dw64Version, pArgs->wzTitle, pArgs->wzSummary, pArgs->wzContentType, pArgs->wzContent, &pResults->fCancel, &pResults->fStopProcessingUpdates); | ||
| 100 | } | ||
| 101 | |||
| 102 | static HRESULT BalBaseBAProcOnDetectUpdateComplete( | ||
| 103 | __in IBootstrapperApplication* pBA, | ||
| 104 | __in BA_ONDETECTUPDATECOMPLETE_ARGS* pArgs, | ||
| 105 | __inout BA_ONDETECTUPDATECOMPLETE_RESULTS* pResults | ||
| 106 | ) | ||
| 107 | { | ||
| 108 | return pBA->OnDetectUpdateComplete(pArgs->hrStatus, &pResults->fIgnoreError); | ||
| 109 | } | ||
| 110 | |||
| 111 | static HRESULT BalBaseBAProcOnDetectRelatedBundle( | ||
| 112 | __in IBootstrapperApplication* pBA, | ||
| 113 | __in BA_ONDETECTRELATEDBUNDLE_ARGS* pArgs, | ||
| 114 | __inout BA_ONDETECTRELATEDBUNDLE_RESULTS* pResults | ||
| 115 | ) | ||
| 116 | { | ||
| 117 | return pBA->OnDetectRelatedBundle(pArgs->wzBundleId, pArgs->relationType, pArgs->wzBundleTag, pArgs->fPerMachine, pArgs->dw64Version, pArgs->operation, &pResults->fCancel); | ||
| 118 | } | ||
| 119 | |||
| 120 | static HRESULT BalBaseBAProcOnDetectPackageBegin( | ||
| 121 | __in IBootstrapperApplication* pBA, | ||
| 122 | __in BA_ONDETECTPACKAGEBEGIN_ARGS* pArgs, | ||
| 123 | __inout BA_ONDETECTPACKAGEBEGIN_RESULTS* pResults | ||
| 124 | ) | ||
| 125 | { | ||
| 126 | return pBA->OnDetectPackageBegin(pArgs->wzPackageId, &pResults->fCancel); | ||
| 127 | } | ||
| 128 | |||
| 129 | static HRESULT BalBaseBAProcOnDetectCompatiblePackage( | ||
| 130 | __in IBootstrapperApplication* pBA, | ||
| 131 | __in BA_ONDETECTCOMPATIBLEMSIPACKAGE_ARGS* pArgs, | ||
| 132 | __inout BA_ONDETECTCOMPATIBLEMSIPACKAGE_RESULTS* pResults | ||
| 133 | ) | ||
| 134 | { | ||
| 135 | return pBA->OnDetectCompatibleMsiPackage(pArgs->wzPackageId, pArgs->wzCompatiblePackageId, pArgs->dw64CompatiblePackageVersion, &pResults->fCancel); | ||
| 136 | } | ||
| 137 | |||
| 138 | static HRESULT BalBaseBAProcOnDetectRelatedMsiPackage( | ||
| 139 | __in IBootstrapperApplication* pBA, | ||
| 140 | __in BA_ONDETECTRELATEDMSIPACKAGE_ARGS* pArgs, | ||
| 141 | __inout BA_ONDETECTRELATEDMSIPACKAGE_RESULTS* pResults | ||
| 142 | ) | ||
| 143 | { | ||
| 144 | return pBA->OnDetectRelatedMsiPackage(pArgs->wzPackageId, pArgs->wzUpgradeCode, pArgs->wzProductCode, pArgs->fPerMachine, pArgs->dw64Version, pArgs->operation, &pResults->fCancel); | ||
| 145 | } | ||
| 146 | |||
| 147 | static HRESULT BalBaseBAProcOnDetectTargetMsiPackage( | ||
| 148 | __in IBootstrapperApplication* pBA, | ||
| 149 | __in BA_ONDETECTTARGETMSIPACKAGE_ARGS* pArgs, | ||
| 150 | __inout BA_ONDETECTTARGETMSIPACKAGE_RESULTS* pResults | ||
| 151 | ) | ||
| 152 | { | ||
| 153 | return pBA->OnDetectTargetMsiPackage(pArgs->wzPackageId, pArgs->wzProductCode, pArgs->patchState, &pResults->fCancel); | ||
| 154 | } | ||
| 155 | |||
| 156 | static HRESULT BalBaseBAProcOnDetectMsiFeature( | ||
| 157 | __in IBootstrapperApplication* pBA, | ||
| 158 | __in BA_ONDETECTMSIFEATURE_ARGS* pArgs, | ||
| 159 | __inout BA_ONDETECTMSIFEATURE_RESULTS* pResults | ||
| 160 | ) | ||
| 161 | { | ||
| 162 | return pBA->OnDetectMsiFeature(pArgs->wzPackageId, pArgs->wzFeatureId, pArgs->state, &pResults->fCancel); | ||
| 163 | } | ||
| 164 | |||
| 165 | static HRESULT BalBaseBAProcOnDetectPackageComplete( | ||
| 166 | __in IBootstrapperApplication* pBA, | ||
| 167 | __in BA_ONDETECTPACKAGECOMPLETE_ARGS* pArgs, | ||
| 168 | __inout BA_ONDETECTPACKAGECOMPLETE_RESULTS* /*pResults*/ | ||
| 169 | ) | ||
| 170 | { | ||
| 171 | return pBA->OnDetectPackageComplete(pArgs->wzPackageId, pArgs->hrStatus, pArgs->state); | ||
| 172 | } | ||
| 173 | |||
| 174 | static HRESULT BalBaseBAProcOnPlanRelatedBundle( | ||
| 175 | __in IBootstrapperApplication* pBA, | ||
| 176 | __in BA_ONPLANRELATEDBUNDLE_ARGS* pArgs, | ||
| 177 | __inout BA_ONPLANRELATEDBUNDLE_RESULTS* pResults | ||
| 178 | ) | ||
| 179 | { | ||
| 180 | return pBA->OnPlanRelatedBundle(pArgs->wzBundleId, pArgs->recommendedState, &pResults->requestedState, &pResults->fCancel); | ||
| 181 | } | ||
| 182 | |||
| 183 | static HRESULT BalBaseBAProcOnPlanPackageBegin( | ||
| 184 | __in IBootstrapperApplication* pBA, | ||
| 185 | __in BA_ONPLANPACKAGEBEGIN_ARGS* pArgs, | ||
| 186 | __inout BA_ONPLANPACKAGEBEGIN_RESULTS* pResults | ||
| 187 | ) | ||
| 188 | { | ||
| 189 | return pBA->OnPlanPackageBegin(pArgs->wzPackageId, pArgs->recommendedState, &pResults->requestedState, &pResults->fCancel); | ||
| 190 | } | ||
| 191 | |||
| 192 | static HRESULT BalBaseBAProcOnPlanCompatibleMsiPackageBegin( | ||
| 193 | __in IBootstrapperApplication* pBA, | ||
| 194 | __in BA_ONPLANCOMPATIBLEMSIPACKAGEBEGIN_ARGS* pArgs, | ||
| 195 | __inout BA_ONPLANCOMPATIBLEMSIPACKAGEBEGIN_RESULTS* pResults | ||
| 196 | ) | ||
| 197 | { | ||
| 198 | return pBA->OnPlanCompatibleMsiPackageBegin(pArgs->wzPackageId, pArgs->wzCompatiblePackageId, pArgs->dw64CompatiblePackageVersion, pArgs->recommendedState, &pResults->requestedState, &pResults->fCancel); | ||
| 199 | } | ||
| 200 | |||
| 201 | static HRESULT BalBaseBAProcOnPlanCompatibleMsiPackageComplete( | ||
| 202 | __in IBootstrapperApplication* pBA, | ||
| 203 | __in BA_ONPLANCOMPATIBLEMSIPACKAGECOMPLETE_ARGS* pArgs, | ||
| 204 | __inout BA_ONPLANCOMPATIBLEMSIPACKAGECOMPLETE_RESULTS* /*pResults*/ | ||
| 205 | ) | ||
| 206 | { | ||
| 207 | return pBA->OnPlanCompatibleMsiPackageComplete(pArgs->wzPackageId, pArgs->wzCompatiblePackageId, pArgs->hrStatus, pArgs->state, pArgs->requested, pArgs->execute, pArgs->rollback); | ||
| 208 | } | ||
| 209 | |||
| 210 | static HRESULT BalBaseBAProcOnPlanTargetMsiPackage( | ||
| 211 | __in IBootstrapperApplication* pBA, | ||
| 212 | __in BA_ONPLANTARGETMSIPACKAGE_ARGS* pArgs, | ||
| 213 | __inout BA_ONPLANTARGETMSIPACKAGE_RESULTS* pResults | ||
| 214 | ) | ||
| 215 | { | ||
| 216 | return pBA->OnPlanTargetMsiPackage(pArgs->wzPackageId, pArgs->wzProductCode, pArgs->recommendedState, &pResults->requestedState, &pResults->fCancel); | ||
| 217 | } | ||
| 218 | |||
| 219 | static HRESULT BalBaseBAProcOnPlanMsiFeature( | ||
| 220 | __in IBootstrapperApplication* pBA, | ||
| 221 | __in BA_ONPLANMSIFEATURE_ARGS* pArgs, | ||
| 222 | __inout BA_ONPLANMSIFEATURE_RESULTS* pResults | ||
| 223 | ) | ||
| 224 | { | ||
| 225 | return pBA->OnPlanMsiFeature(pArgs->wzPackageId, pArgs->wzFeatureId, pArgs->recommendedState, &pResults->requestedState, &pResults->fCancel); | ||
| 226 | } | ||
| 227 | |||
| 228 | static HRESULT BalBaseBAProcOnPlanPackageComplete( | ||
| 229 | __in IBootstrapperApplication* pBA, | ||
| 230 | __in BA_ONPLANPACKAGECOMPLETE_ARGS* pArgs, | ||
| 231 | __inout BA_ONPLANPACKAGECOMPLETE_RESULTS* /*pResults*/ | ||
| 232 | ) | ||
| 233 | { | ||
| 234 | return pBA->OnPlanPackageComplete(pArgs->wzPackageId, pArgs->hrStatus, pArgs->state, pArgs->requested, pArgs->execute, pArgs->rollback); | ||
| 235 | } | ||
| 236 | |||
| 237 | static HRESULT BalBaseBAProcOnApplyBegin( | ||
| 238 | __in IBootstrapperApplication* pBA, | ||
| 239 | __in BA_ONAPPLYBEGIN_ARGS* pArgs, | ||
| 240 | __inout BA_ONAPPLYBEGIN_RESULTS* pResults | ||
| 241 | ) | ||
| 242 | { | ||
| 243 | return pBA->OnApplyBegin(pArgs->dwPhaseCount, &pResults->fCancel); | ||
| 244 | } | ||
| 245 | |||
| 246 | static HRESULT BalBaseBAProcOnElevateBegin( | ||
| 247 | __in IBootstrapperApplication* pBA, | ||
| 248 | __in BA_ONELEVATEBEGIN_ARGS* /*pArgs*/, | ||
| 249 | __inout BA_ONELEVATEBEGIN_RESULTS* pResults | ||
| 250 | ) | ||
| 251 | { | ||
| 252 | return pBA->OnElevateBegin(&pResults->fCancel); | ||
| 253 | } | ||
| 254 | |||
| 255 | static HRESULT BalBaseBAProcOnElevateComplete( | ||
| 256 | __in IBootstrapperApplication* pBA, | ||
| 257 | __in BA_ONELEVATECOMPLETE_ARGS* pArgs, | ||
| 258 | __inout BA_ONELEVATECOMPLETE_RESULTS* /*pResults*/ | ||
| 259 | ) | ||
| 260 | { | ||
| 261 | return pBA->OnElevateComplete(pArgs->hrStatus); | ||
| 262 | } | ||
| 263 | |||
| 264 | static HRESULT BalBaseBAProcOnProgress( | ||
| 265 | __in IBootstrapperApplication* pBA, | ||
| 266 | __in BA_ONPROGRESS_ARGS* pArgs, | ||
| 267 | __inout BA_ONPROGRESS_RESULTS* pResults | ||
| 268 | ) | ||
| 269 | { | ||
| 270 | return pBA->OnProgress(pArgs->dwProgressPercentage, pArgs->dwOverallPercentage, &pResults->fCancel); | ||
| 271 | } | ||
| 272 | |||
| 273 | static HRESULT BalBaseBAProcOnError( | ||
| 274 | __in IBootstrapperApplication* pBA, | ||
| 275 | __in BA_ONERROR_ARGS* pArgs, | ||
| 276 | __inout BA_ONERROR_RESULTS* pResults | ||
| 277 | ) | ||
| 278 | { | ||
| 279 | return pBA->OnError(pArgs->errorType, pArgs->wzPackageId, pArgs->dwCode, pArgs->wzError, pArgs->dwUIHint, pArgs->cData, pArgs->rgwzData, pArgs->nRecommendation, &pResults->nResult); | ||
| 280 | } | ||
| 281 | |||
| 282 | static HRESULT BalBaseBAProcOnRegisterBegin( | ||
| 283 | __in IBootstrapperApplication* pBA, | ||
| 284 | __in BA_ONREGISTERBEGIN_ARGS* /*pArgs*/, | ||
| 285 | __inout BA_ONREGISTERBEGIN_RESULTS* pResults | ||
| 286 | ) | ||
| 287 | { | ||
| 288 | return pBA->OnRegisterBegin(&pResults->fCancel); | ||
| 289 | } | ||
| 290 | |||
| 291 | static HRESULT BalBaseBAProcOnRegisterComplete( | ||
| 292 | __in IBootstrapperApplication* pBA, | ||
| 293 | __in BA_ONREGISTERCOMPLETE_ARGS* pArgs, | ||
| 294 | __inout BA_ONREGISTERCOMPLETE_RESULTS* /*pResults*/ | ||
| 295 | ) | ||
| 296 | { | ||
| 297 | return pBA->OnRegisterComplete(pArgs->hrStatus); | ||
| 298 | } | ||
| 299 | |||
| 300 | static HRESULT BalBaseBAProcOnCacheBegin( | ||
| 301 | __in IBootstrapperApplication* pBA, | ||
| 302 | __in BA_ONCACHEBEGIN_ARGS* /*pArgs*/, | ||
| 303 | __inout BA_ONCACHEBEGIN_RESULTS* pResults | ||
| 304 | ) | ||
| 305 | { | ||
| 306 | return pBA->OnCacheBegin(&pResults->fCancel); | ||
| 307 | } | ||
| 308 | |||
| 309 | static HRESULT BalBaseBAProcOnCachePackageBegin( | ||
| 310 | __in IBootstrapperApplication* pBA, | ||
| 311 | __in BA_ONCACHEPACKAGEBEGIN_ARGS* pArgs, | ||
| 312 | __inout BA_ONCACHEPACKAGEBEGIN_RESULTS* pResults | ||
| 313 | ) | ||
| 314 | { | ||
| 315 | return pBA->OnCachePackageBegin(pArgs->wzPackageId, pArgs->cCachePayloads, pArgs->dw64PackageCacheSize, &pResults->fCancel); | ||
| 316 | } | ||
| 317 | |||
| 318 | static HRESULT BalBaseBAProcOnCacheAcquireBegin( | ||
| 319 | __in IBootstrapperApplication* pBA, | ||
| 320 | __in BA_ONCACHEACQUIREBEGIN_ARGS* pArgs, | ||
| 321 | __inout BA_ONCACHEACQUIREBEGIN_RESULTS* pResults | ||
| 322 | ) | ||
| 323 | { | ||
| 324 | return pBA->OnCacheAcquireBegin(pArgs->wzPackageOrContainerId, pArgs->wzPayloadId, pArgs->operation, pArgs->wzSource, &pResults->fCancel); | ||
| 325 | } | ||
| 326 | |||
| 327 | static HRESULT BalBaseBAProcOnCacheAcquireProgress( | ||
| 328 | __in IBootstrapperApplication* pBA, | ||
| 329 | __in BA_ONCACHEACQUIREPROGRESS_ARGS* pArgs, | ||
| 330 | __inout BA_ONCACHEACQUIREPROGRESS_RESULTS* pResults | ||
| 331 | ) | ||
| 332 | { | ||
| 333 | return pBA->OnCacheAcquireProgress(pArgs->wzPackageOrContainerId, pArgs->wzPayloadId, pArgs->dw64Progress, pArgs->dw64Total, pArgs->dwOverallPercentage, &pResults->fCancel); | ||
| 334 | } | ||
| 335 | |||
| 336 | static HRESULT BalBaseBAProcOnResolveSource( | ||
| 337 | __in IBootstrapperApplication* pBA, | ||
| 338 | __in BA_ONRESOLVESOURCE_ARGS* pArgs, | ||
| 339 | __inout BA_ONRESOLVESOURCE_RESULTS* pResults | ||
| 340 | ) | ||
| 341 | { | ||
| 342 | return pBA->OnResolveSource(pArgs->wzPackageOrContainerId, pArgs->wzPayloadId, pArgs->wzLocalSource, pArgs->wzDownloadSource, pArgs->recommendation, &pResults->action, &pResults->fCancel); | ||
| 343 | } | ||
| 344 | |||
| 345 | static HRESULT BalBaseBAProcOnCacheAcquireComplete( | ||
| 346 | __in IBootstrapperApplication* pBA, | ||
| 347 | __in BA_ONCACHEACQUIRECOMPLETE_ARGS* pArgs, | ||
| 348 | __inout BA_ONCACHEACQUIRECOMPLETE_RESULTS* pResults | ||
| 349 | ) | ||
| 350 | { | ||
| 351 | return pBA->OnCacheAcquireComplete(pArgs->wzPackageOrContainerId, pArgs->wzPayloadId, pArgs->hrStatus, pArgs->recommendation, &pResults->action); | ||
| 352 | } | ||
| 353 | |||
| 354 | static HRESULT BalBaseBAProcOnCacheVerifyBegin( | ||
| 355 | __in IBootstrapperApplication* pBA, | ||
| 356 | __in BA_ONCACHEVERIFYBEGIN_ARGS* pArgs, | ||
| 357 | __inout BA_ONCACHEVERIFYBEGIN_RESULTS* pResults | ||
| 358 | ) | ||
| 359 | { | ||
| 360 | return pBA->OnCacheVerifyBegin(pArgs->wzPackageOrContainerId, pArgs->wzPayloadId, &pResults->fCancel); | ||
| 361 | } | ||
| 362 | |||
| 363 | static HRESULT BalBaseBAProcOnCacheVerifyComplete( | ||
| 364 | __in IBootstrapperApplication* pBA, | ||
| 365 | __in BA_ONCACHEVERIFYCOMPLETE_ARGS* pArgs, | ||
| 366 | __inout BA_ONCACHEVERIFYCOMPLETE_RESULTS* pResults | ||
| 367 | ) | ||
| 368 | { | ||
| 369 | return pBA->OnCacheVerifyComplete(pArgs->wzPackageOrContainerId, pArgs->wzPayloadId, pArgs->hrStatus, pArgs->recommendation, &pResults->action); | ||
| 370 | } | ||
| 371 | |||
| 372 | static HRESULT BalBaseBAProcOnCachePackageComplete( | ||
| 373 | __in IBootstrapperApplication* pBA, | ||
| 374 | __in BA_ONCACHEPACKAGECOMPLETE_ARGS* pArgs, | ||
| 375 | __inout BA_ONCACHEPACKAGECOMPLETE_RESULTS* pResults | ||
| 376 | ) | ||
| 377 | { | ||
| 378 | return pBA->OnCachePackageComplete(pArgs->wzPackageId, pArgs->hrStatus, pArgs->recommendation, &pResults->action); | ||
| 379 | } | ||
| 380 | |||
| 381 | static HRESULT BalBaseBAProcOnCacheComplete( | ||
| 382 | __in IBootstrapperApplication* pBA, | ||
| 383 | __in BA_ONCACHECOMPLETE_ARGS* pArgs, | ||
| 384 | __inout BA_ONCACHECOMPLETE_RESULTS* /*pResults*/ | ||
| 385 | ) | ||
| 386 | { | ||
| 387 | return pBA->OnCacheComplete(pArgs->hrStatus); | ||
| 388 | } | ||
| 389 | |||
| 390 | static HRESULT BalBaseBAProcOnExecuteBegin( | ||
| 391 | __in IBootstrapperApplication* pBA, | ||
| 392 | __in BA_ONEXECUTEBEGIN_ARGS* pArgs, | ||
| 393 | __inout BA_ONEXECUTEBEGIN_RESULTS* pResults | ||
| 394 | ) | ||
| 395 | { | ||
| 396 | return pBA->OnExecuteBegin(pArgs->cExecutingPackages, &pResults->fCancel); | ||
| 397 | } | ||
| 398 | |||
| 399 | static HRESULT BalBaseBAProcOnExecutePackageBegin( | ||
| 400 | __in IBootstrapperApplication* pBA, | ||
| 401 | __in BA_ONEXECUTEPACKAGEBEGIN_ARGS* pArgs, | ||
| 402 | __inout BA_ONEXECUTEPACKAGEBEGIN_RESULTS* pResults | ||
| 403 | ) | ||
| 404 | { | ||
| 405 | return pBA->OnExecutePackageBegin(pArgs->wzPackageId, pArgs->fExecute, &pResults->fCancel); | ||
| 406 | } | ||
| 407 | |||
| 408 | static HRESULT BalBaseBAProcOnExecutePatchTarget( | ||
| 409 | __in IBootstrapperApplication* pBA, | ||
| 410 | __in BA_ONEXECUTEPATCHTARGET_ARGS* pArgs, | ||
| 411 | __inout BA_ONEXECUTEPATCHTARGET_RESULTS* pResults | ||
| 412 | ) | ||
| 413 | { | ||
| 414 | return pBA->OnExecutePatchTarget(pArgs->wzPackageId, pArgs->wzTargetProductCode, &pResults->fCancel); | ||
| 415 | } | ||
| 416 | |||
| 417 | static HRESULT BalBaseBAProcOnExecuteProgress( | ||
| 418 | __in IBootstrapperApplication* pBA, | ||
| 419 | __in BA_ONEXECUTEPROGRESS_ARGS* pArgs, | ||
| 420 | __inout BA_ONEXECUTEPROGRESS_RESULTS* pResults | ||
| 421 | ) | ||
| 422 | { | ||
| 423 | return pBA->OnExecuteProgress(pArgs->wzPackageId, pArgs->dwProgressPercentage, pArgs->dwOverallPercentage, &pResults->fCancel); | ||
| 424 | } | ||
| 425 | |||
| 426 | static HRESULT BalBaseBAProcOnExecuteMsiMessage( | ||
| 427 | __in IBootstrapperApplication* pBA, | ||
| 428 | __in BA_ONEXECUTEMSIMESSAGE_ARGS* pArgs, | ||
| 429 | __inout BA_ONEXECUTEMSIMESSAGE_RESULTS* pResults | ||
| 430 | ) | ||
| 431 | { | ||
| 432 | return pBA->OnExecuteMsiMessage(pArgs->wzPackageId, pArgs->messageType, pArgs->dwUIHint, pArgs->wzMessage, pArgs->cData, pArgs->rgwzData, pArgs->nRecommendation, &pResults->nResult); | ||
| 433 | } | ||
| 434 | |||
| 435 | static HRESULT BalBaseBAProcOnExecuteFilesInUse( | ||
| 436 | __in IBootstrapperApplication* pBA, | ||
| 437 | __in BA_ONEXECUTEFILESINUSE_ARGS* pArgs, | ||
| 438 | __inout BA_ONEXECUTEFILESINUSE_RESULTS* pResults | ||
| 439 | ) | ||
| 440 | { | ||
| 441 | return pBA->OnExecuteFilesInUse(pArgs->wzPackageId, pArgs->cFiles, pArgs->rgwzFiles, pArgs->nRecommendation, &pResults->nResult); | ||
| 442 | } | ||
| 443 | |||
| 444 | static HRESULT BalBaseBAProcOnExecutePackageComplete( | ||
| 445 | __in IBootstrapperApplication* pBA, | ||
| 446 | __in BA_ONEXECUTEPACKAGECOMPLETE_ARGS* pArgs, | ||
| 447 | __inout BA_ONEXECUTEPACKAGECOMPLETE_RESULTS* pResults | ||
| 448 | ) | ||
| 449 | { | ||
| 450 | return pBA->OnExecutePackageComplete(pArgs->wzPackageId, pArgs->hrStatus, pArgs->restart, pArgs->recommendation, &pResults->action); | ||
| 451 | } | ||
| 452 | |||
| 453 | static HRESULT BalBaseBAProcOnExecuteComplete( | ||
| 454 | __in IBootstrapperApplication* pBA, | ||
| 455 | __in BA_ONEXECUTECOMPLETE_ARGS* pArgs, | ||
| 456 | __inout BA_ONEXECUTECOMPLETE_RESULTS* /*pResults*/ | ||
| 457 | ) | ||
| 458 | { | ||
| 459 | return pBA->OnExecuteComplete(pArgs->hrStatus); | ||
| 460 | } | ||
| 461 | |||
| 462 | static HRESULT BalBaseBAProcOnUnregisterBegin( | ||
| 463 | __in IBootstrapperApplication* pBA, | ||
| 464 | __in BA_ONUNREGISTERBEGIN_ARGS* /*pArgs*/, | ||
| 465 | __inout BA_ONUNREGISTERBEGIN_RESULTS* pResults | ||
| 466 | ) | ||
| 467 | { | ||
| 468 | return pBA->OnUnregisterBegin(&pResults->fCancel); | ||
| 469 | } | ||
| 470 | |||
| 471 | static HRESULT BalBaseBAProcOnUnregisterComplete( | ||
| 472 | __in IBootstrapperApplication* pBA, | ||
| 473 | __in BA_ONUNREGISTERCOMPLETE_ARGS* pArgs, | ||
| 474 | __inout BA_ONUNREGISTERCOMPLETE_RESULTS* /*pResults*/ | ||
| 475 | ) | ||
| 476 | { | ||
| 477 | return pBA->OnUnregisterComplete(pArgs->hrStatus); | ||
| 478 | } | ||
| 479 | |||
| 480 | static HRESULT BalBaseBAProcOnApplyComplete( | ||
| 481 | __in IBootstrapperApplication* pBA, | ||
| 482 | __in BA_ONAPPLYCOMPLETE_ARGS* pArgs, | ||
| 483 | __inout BA_ONAPPLYCOMPLETE_RESULTS* pResults | ||
| 484 | ) | ||
| 485 | { | ||
| 486 | return pBA->OnApplyComplete(pArgs->hrStatus, pArgs->restart, pArgs->recommendation, &pResults->action); | ||
| 487 | } | ||
| 488 | |||
| 489 | static HRESULT BalBaseBAProcOnLaunchApprovedExeBegin( | ||
| 490 | __in IBootstrapperApplication* pBA, | ||
| 491 | __in BA_ONLAUNCHAPPROVEDEXEBEGIN_ARGS* /*pArgs*/, | ||
| 492 | __inout BA_ONLAUNCHAPPROVEDEXEBEGIN_RESULTS* pResults | ||
| 493 | ) | ||
| 494 | { | ||
| 495 | return pBA->OnLaunchApprovedExeBegin(&pResults->fCancel); | ||
| 496 | } | ||
| 497 | |||
| 498 | static HRESULT BalBaseBAProcOnLaunchApprovedExeComplete( | ||
| 499 | __in IBootstrapperApplication* pBA, | ||
| 500 | __in BA_ONLAUNCHAPPROVEDEXECOMPLETE_ARGS* pArgs, | ||
| 501 | __inout BA_ONLAUNCHAPPROVEDEXECOMPLETE_RESULTS* /*pResults*/ | ||
| 502 | ) | ||
| 503 | { | ||
| 504 | return pBA->OnLaunchApprovedExeComplete(pArgs->hrStatus, pArgs->dwProcessId); | ||
| 505 | } | ||
| 506 | |||
| 507 | /******************************************************************* | ||
| 508 | BalBaseBootstrapperApplicationProc - requires pvContext to be of type IBootstrapperApplication. | ||
| 509 | Provides a default mapping between the new message based BA interface and | ||
| 510 | the old COM-based BA interface. | ||
| 511 | |||
| 512 | *******************************************************************/ | ||
| 513 | static HRESULT WINAPI BalBaseBootstrapperApplicationProc( | ||
| 514 | __in BOOTSTRAPPER_APPLICATION_MESSAGE message, | ||
| 515 | __in const LPVOID pvArgs, | ||
| 516 | __inout LPVOID pvResults, | ||
| 517 | __in_opt LPVOID pvContext | ||
| 518 | ) | ||
| 519 | { | ||
| 520 | IBootstrapperApplication* pBA = reinterpret_cast<IBootstrapperApplication*>(pvContext); | ||
| 521 | HRESULT hr = pBA->BAProc(message, pvArgs, pvResults, pvContext); | ||
| 522 | |||
| 523 | if (E_NOTIMPL == hr) | ||
| 524 | { | ||
| 525 | switch (message) | ||
| 526 | { | ||
| 527 | case BOOTSTRAPPER_APPLICATION_MESSAGE_ONDETECTBEGIN: | ||
| 528 | hr = BalBaseBAProcOnDetectBegin(pBA, reinterpret_cast<BA_ONDETECTBEGIN_ARGS*>(pvArgs), reinterpret_cast<BA_ONDETECTBEGIN_RESULTS*>(pvResults)); | ||
| 529 | break; | ||
| 530 | case BOOTSTRAPPER_APPLICATION_MESSAGE_ONDETECTCOMPLETE: | ||
| 531 | hr = BalBaseBAProcOnDetectComplete(pBA, reinterpret_cast<BA_ONDETECTCOMPLETE_ARGS*>(pvArgs), reinterpret_cast<BA_ONDETECTCOMPLETE_RESULTS*>(pvResults)); | ||
| 532 | break; | ||
| 533 | case BOOTSTRAPPER_APPLICATION_MESSAGE_ONPLANBEGIN: | ||
| 534 | hr = BalBaseBAProcOnPlanBegin(pBA, reinterpret_cast<BA_ONPLANBEGIN_ARGS*>(pvArgs), reinterpret_cast<BA_ONPLANBEGIN_RESULTS*>(pvResults)); | ||
| 535 | break; | ||
| 536 | case BOOTSTRAPPER_APPLICATION_MESSAGE_ONPLANCOMPLETE: | ||
| 537 | hr = BalBaseBAProcOnPlanComplete(pBA, reinterpret_cast<BA_ONPLANCOMPLETE_ARGS*>(pvArgs), reinterpret_cast<BA_ONPLANCOMPLETE_RESULTS*>(pvResults)); | ||
| 538 | break; | ||
| 539 | case BOOTSTRAPPER_APPLICATION_MESSAGE_ONSTARTUP: | ||
| 540 | hr = BalBaseBAProcOnStartup(pBA, reinterpret_cast<BA_ONSTARTUP_ARGS*>(pvArgs), reinterpret_cast<BA_ONSTARTUP_RESULTS*>(pvResults)); | ||
| 541 | break; | ||
| 542 | case BOOTSTRAPPER_APPLICATION_MESSAGE_ONSHUTDOWN: | ||
| 543 | hr = BalBaseBAProcOnShutdown(pBA, reinterpret_cast<BA_ONSHUTDOWN_ARGS*>(pvArgs), reinterpret_cast<BA_ONSHUTDOWN_RESULTS*>(pvResults)); | ||
| 544 | break; | ||
| 545 | case BOOTSTRAPPER_APPLICATION_MESSAGE_ONSYSTEMSHUTDOWN: | ||
| 546 | hr = BalBaseBAProcOnSystemShutdown(pBA, reinterpret_cast<BA_ONSYSTEMSHUTDOWN_ARGS*>(pvArgs), reinterpret_cast<BA_ONSYSTEMSHUTDOWN_RESULTS*>(pvResults)); | ||
| 547 | break; | ||
| 548 | case BOOTSTRAPPER_APPLICATION_MESSAGE_ONDETECTFORWARDCOMPATIBLEBUNDLE: | ||
| 549 | hr = BalBaseBAProcOnDetectForwardCompatibleBundle(pBA, reinterpret_cast<BA_ONDETECTFORWARDCOMPATIBLEBUNDLE_ARGS*>(pvArgs), reinterpret_cast<BA_ONDETECTFORWARDCOMPATIBLEBUNDLE_RESULTS*>(pvResults)); | ||
| 550 | break; | ||
| 551 | case BOOTSTRAPPER_APPLICATION_MESSAGE_ONDETECTUPDATEBEGIN: | ||
| 552 | hr = BalBaseBAProcOnDetectUpdateBegin(pBA, reinterpret_cast<BA_ONDETECTUPDATEBEGIN_ARGS*>(pvArgs), reinterpret_cast<BA_ONDETECTUPDATEBEGIN_RESULTS*>(pvResults)); | ||
| 553 | break; | ||
| 554 | case BOOTSTRAPPER_APPLICATION_MESSAGE_ONDETECTUPDATE: | ||
| 555 | hr = BalBaseBAProcOnDetectUpdate(pBA, reinterpret_cast<BA_ONDETECTUPDATE_ARGS*>(pvArgs), reinterpret_cast<BA_ONDETECTUPDATE_RESULTS*>(pvResults)); | ||
| 556 | break; | ||
| 557 | case BOOTSTRAPPER_APPLICATION_MESSAGE_ONDETECTUPDATECOMPLETE: | ||
| 558 | hr = BalBaseBAProcOnDetectUpdateComplete(pBA, reinterpret_cast<BA_ONDETECTUPDATECOMPLETE_ARGS*>(pvArgs), reinterpret_cast<BA_ONDETECTUPDATECOMPLETE_RESULTS*>(pvResults)); | ||
| 559 | break; | ||
| 560 | case BOOTSTRAPPER_APPLICATION_MESSAGE_ONDETECTRELATEDBUNDLE: | ||
| 561 | hr = BalBaseBAProcOnDetectRelatedBundle(pBA, reinterpret_cast<BA_ONDETECTRELATEDBUNDLE_ARGS*>(pvArgs), reinterpret_cast<BA_ONDETECTRELATEDBUNDLE_RESULTS*>(pvResults)); | ||
| 562 | break; | ||
| 563 | case BOOTSTRAPPER_APPLICATION_MESSAGE_ONDETECTPACKAGEBEGIN: | ||
| 564 | hr = BalBaseBAProcOnDetectPackageBegin(pBA, reinterpret_cast<BA_ONDETECTPACKAGEBEGIN_ARGS*>(pvArgs), reinterpret_cast<BA_ONDETECTPACKAGEBEGIN_RESULTS*>(pvResults)); | ||
| 565 | break; | ||
| 566 | case BOOTSTRAPPER_APPLICATION_MESSAGE_ONDETECTCOMPATIBLEMSIPACKAGE: | ||
| 567 | hr = BalBaseBAProcOnDetectCompatiblePackage(pBA, reinterpret_cast<BA_ONDETECTCOMPATIBLEMSIPACKAGE_ARGS*>(pvArgs), reinterpret_cast<BA_ONDETECTCOMPATIBLEMSIPACKAGE_RESULTS*>(pvResults)); | ||
| 568 | break; | ||
| 569 | case BOOTSTRAPPER_APPLICATION_MESSAGE_ONDETECTRELATEDMSIPACKAGE: | ||
| 570 | hr = BalBaseBAProcOnDetectRelatedMsiPackage(pBA, reinterpret_cast<BA_ONDETECTRELATEDMSIPACKAGE_ARGS*>(pvArgs), reinterpret_cast<BA_ONDETECTRELATEDMSIPACKAGE_RESULTS*>(pvResults)); | ||
| 571 | break; | ||
| 572 | case BOOTSTRAPPER_APPLICATION_MESSAGE_ONDETECTTARGETMSIPACKAGE: | ||
| 573 | hr = BalBaseBAProcOnDetectTargetMsiPackage(pBA, reinterpret_cast<BA_ONDETECTTARGETMSIPACKAGE_ARGS*>(pvArgs), reinterpret_cast<BA_ONDETECTTARGETMSIPACKAGE_RESULTS*>(pvResults)); | ||
| 574 | break; | ||
| 575 | case BOOTSTRAPPER_APPLICATION_MESSAGE_ONDETECTMSIFEATURE: | ||
| 576 | hr = BalBaseBAProcOnDetectMsiFeature(pBA, reinterpret_cast<BA_ONDETECTMSIFEATURE_ARGS*>(pvArgs), reinterpret_cast<BA_ONDETECTMSIFEATURE_RESULTS*>(pvResults)); | ||
| 577 | break; | ||
| 578 | case BOOTSTRAPPER_APPLICATION_MESSAGE_ONDETECTPACKAGECOMPLETE: | ||
| 579 | hr = BalBaseBAProcOnDetectPackageComplete(pBA, reinterpret_cast<BA_ONDETECTPACKAGECOMPLETE_ARGS*>(pvArgs), reinterpret_cast<BA_ONDETECTPACKAGECOMPLETE_RESULTS*>(pvResults)); | ||
| 580 | break; | ||
| 581 | case BOOTSTRAPPER_APPLICATION_MESSAGE_ONPLANRELATEDBUNDLE: | ||
| 582 | hr = BalBaseBAProcOnPlanRelatedBundle(pBA, reinterpret_cast<BA_ONPLANRELATEDBUNDLE_ARGS*>(pvArgs), reinterpret_cast<BA_ONPLANRELATEDBUNDLE_RESULTS*>(pvResults)); | ||
| 583 | break; | ||
| 584 | case BOOTSTRAPPER_APPLICATION_MESSAGE_ONPLANPACKAGEBEGIN: | ||
| 585 | hr = BalBaseBAProcOnPlanPackageBegin(pBA, reinterpret_cast<BA_ONPLANPACKAGEBEGIN_ARGS*>(pvArgs), reinterpret_cast<BA_ONPLANPACKAGEBEGIN_RESULTS*>(pvResults)); | ||
| 586 | break; | ||
| 587 | case BOOTSTRAPPER_APPLICATION_MESSAGE_ONPLANCOMPATIBLEMSIPACKAGEBEGIN: | ||
| 588 | hr = BalBaseBAProcOnPlanCompatibleMsiPackageBegin(pBA, reinterpret_cast<BA_ONPLANCOMPATIBLEMSIPACKAGEBEGIN_ARGS*>(pvArgs), reinterpret_cast<BA_ONPLANCOMPATIBLEMSIPACKAGEBEGIN_RESULTS*>(pvResults)); | ||
| 589 | break; | ||
| 590 | case BOOTSTRAPPER_APPLICATION_MESSAGE_ONPLANCOMPATIBLEMSIPACKAGECOMPLETE: | ||
| 591 | hr = BalBaseBAProcOnPlanCompatibleMsiPackageComplete(pBA, reinterpret_cast<BA_ONPLANCOMPATIBLEMSIPACKAGECOMPLETE_ARGS*>(pvArgs), reinterpret_cast<BA_ONPLANCOMPATIBLEMSIPACKAGECOMPLETE_RESULTS*>(pvResults)); | ||
| 592 | break; | ||
| 593 | case BOOTSTRAPPER_APPLICATION_MESSAGE_ONPLANTARGETMSIPACKAGE: | ||
| 594 | hr = BalBaseBAProcOnPlanTargetMsiPackage(pBA, reinterpret_cast<BA_ONPLANTARGETMSIPACKAGE_ARGS*>(pvArgs), reinterpret_cast<BA_ONPLANTARGETMSIPACKAGE_RESULTS*>(pvResults)); | ||
| 595 | break; | ||
| 596 | case BOOTSTRAPPER_APPLICATION_MESSAGE_ONPLANMSIFEATURE: | ||
| 597 | hr = BalBaseBAProcOnPlanMsiFeature(pBA, reinterpret_cast<BA_ONPLANMSIFEATURE_ARGS*>(pvArgs), reinterpret_cast<BA_ONPLANMSIFEATURE_RESULTS*>(pvResults)); | ||
| 598 | break; | ||
| 599 | case BOOTSTRAPPER_APPLICATION_MESSAGE_ONPLANPACKAGECOMPLETE: | ||
| 600 | hr = BalBaseBAProcOnPlanPackageComplete(pBA, reinterpret_cast<BA_ONPLANPACKAGECOMPLETE_ARGS*>(pvArgs), reinterpret_cast<BA_ONPLANPACKAGECOMPLETE_RESULTS*>(pvResults)); | ||
| 601 | break; | ||
| 602 | case BOOTSTRAPPER_APPLICATION_MESSAGE_ONAPPLYBEGIN: | ||
| 603 | hr = BalBaseBAProcOnApplyBegin(pBA, reinterpret_cast<BA_ONAPPLYBEGIN_ARGS*>(pvArgs), reinterpret_cast<BA_ONAPPLYBEGIN_RESULTS*>(pvResults)); | ||
| 604 | break; | ||
| 605 | case BOOTSTRAPPER_APPLICATION_MESSAGE_ONELEVATEBEGIN: | ||
| 606 | hr = BalBaseBAProcOnElevateBegin(pBA, reinterpret_cast<BA_ONELEVATEBEGIN_ARGS*>(pvArgs), reinterpret_cast<BA_ONELEVATEBEGIN_RESULTS*>(pvResults)); | ||
| 607 | break; | ||
| 608 | case BOOTSTRAPPER_APPLICATION_MESSAGE_ONELEVATECOMPLETE: | ||
| 609 | hr = BalBaseBAProcOnElevateComplete(pBA, reinterpret_cast<BA_ONELEVATECOMPLETE_ARGS*>(pvArgs), reinterpret_cast<BA_ONELEVATECOMPLETE_RESULTS*>(pvResults)); | ||
| 610 | break; | ||
| 611 | case BOOTSTRAPPER_APPLICATION_MESSAGE_ONPROGRESS: | ||
| 612 | hr = BalBaseBAProcOnProgress(pBA, reinterpret_cast<BA_ONPROGRESS_ARGS*>(pvArgs), reinterpret_cast<BA_ONPROGRESS_RESULTS*>(pvResults)); | ||
| 613 | break; | ||
| 614 | case BOOTSTRAPPER_APPLICATION_MESSAGE_ONERROR: | ||
| 615 | hr = BalBaseBAProcOnError(pBA, reinterpret_cast<BA_ONERROR_ARGS*>(pvArgs), reinterpret_cast<BA_ONERROR_RESULTS*>(pvResults)); | ||
| 616 | break; | ||
| 617 | case BOOTSTRAPPER_APPLICATION_MESSAGE_ONREGISTERBEGIN: | ||
| 618 | hr = BalBaseBAProcOnRegisterBegin(pBA, reinterpret_cast<BA_ONREGISTERBEGIN_ARGS*>(pvArgs), reinterpret_cast<BA_ONREGISTERBEGIN_RESULTS*>(pvResults)); | ||
| 619 | break; | ||
| 620 | case BOOTSTRAPPER_APPLICATION_MESSAGE_ONREGISTERCOMPLETE: | ||
| 621 | hr = BalBaseBAProcOnRegisterComplete(pBA, reinterpret_cast<BA_ONREGISTERCOMPLETE_ARGS*>(pvArgs), reinterpret_cast<BA_ONREGISTERCOMPLETE_RESULTS*>(pvResults)); | ||
| 622 | break; | ||
| 623 | case BOOTSTRAPPER_APPLICATION_MESSAGE_ONCACHEBEGIN: | ||
| 624 | hr = BalBaseBAProcOnCacheBegin(pBA, reinterpret_cast<BA_ONCACHEBEGIN_ARGS*>(pvArgs), reinterpret_cast<BA_ONCACHEBEGIN_RESULTS*>(pvResults)); | ||
| 625 | break; | ||
| 626 | case BOOTSTRAPPER_APPLICATION_MESSAGE_ONCACHEPACKAGEBEGIN: | ||
| 627 | hr = BalBaseBAProcOnCachePackageBegin(pBA, reinterpret_cast<BA_ONCACHEPACKAGEBEGIN_ARGS*>(pvArgs), reinterpret_cast<BA_ONCACHEPACKAGEBEGIN_RESULTS*>(pvResults)); | ||
| 628 | break; | ||
| 629 | case BOOTSTRAPPER_APPLICATION_MESSAGE_ONCACHEACQUIREBEGIN: | ||
| 630 | hr = BalBaseBAProcOnCacheAcquireBegin(pBA, reinterpret_cast<BA_ONCACHEACQUIREBEGIN_ARGS*>(pvArgs), reinterpret_cast<BA_ONCACHEACQUIREBEGIN_RESULTS*>(pvResults)); | ||
| 631 | break; | ||
| 632 | case BOOTSTRAPPER_APPLICATION_MESSAGE_ONCACHEACQUIREPROGRESS: | ||
| 633 | hr = BalBaseBAProcOnCacheAcquireProgress(pBA, reinterpret_cast<BA_ONCACHEACQUIREPROGRESS_ARGS*>(pvArgs), reinterpret_cast<BA_ONCACHEACQUIREPROGRESS_RESULTS*>(pvResults)); | ||
| 634 | break; | ||
| 635 | case BOOTSTRAPPER_APPLICATION_MESSAGE_ONRESOLVESOURCE: | ||
| 636 | hr = BalBaseBAProcOnResolveSource(pBA, reinterpret_cast<BA_ONRESOLVESOURCE_ARGS*>(pvArgs), reinterpret_cast<BA_ONRESOLVESOURCE_RESULTS*>(pvResults)); | ||
| 637 | break; | ||
| 638 | case BOOTSTRAPPER_APPLICATION_MESSAGE_ONCACHEACQUIRECOMPLETE: | ||
| 639 | hr = BalBaseBAProcOnCacheAcquireComplete(pBA, reinterpret_cast<BA_ONCACHEACQUIRECOMPLETE_ARGS*>(pvArgs), reinterpret_cast<BA_ONCACHEACQUIRECOMPLETE_RESULTS*>(pvResults)); | ||
| 640 | break; | ||
| 641 | case BOOTSTRAPPER_APPLICATION_MESSAGE_ONCACHEVERIFYBEGIN: | ||
| 642 | hr = BalBaseBAProcOnCacheVerifyBegin(pBA, reinterpret_cast<BA_ONCACHEVERIFYBEGIN_ARGS*>(pvArgs), reinterpret_cast<BA_ONCACHEVERIFYBEGIN_RESULTS*>(pvResults)); | ||
| 643 | break; | ||
| 644 | case BOOTSTRAPPER_APPLICATION_MESSAGE_ONCACHEVERIFYCOMPLETE: | ||
| 645 | hr = BalBaseBAProcOnCacheVerifyComplete(pBA, reinterpret_cast<BA_ONCACHEVERIFYCOMPLETE_ARGS*>(pvArgs), reinterpret_cast<BA_ONCACHEVERIFYCOMPLETE_RESULTS*>(pvResults)); | ||
| 646 | break; | ||
| 647 | case BOOTSTRAPPER_APPLICATION_MESSAGE_ONCACHEPACKAGECOMPLETE: | ||
| 648 | hr = BalBaseBAProcOnCachePackageComplete(pBA, reinterpret_cast<BA_ONCACHEPACKAGECOMPLETE_ARGS*>(pvArgs), reinterpret_cast<BA_ONCACHEPACKAGECOMPLETE_RESULTS*>(pvResults)); | ||
| 649 | break; | ||
| 650 | case BOOTSTRAPPER_APPLICATION_MESSAGE_ONCACHECOMPLETE: | ||
| 651 | hr = BalBaseBAProcOnCacheComplete(pBA, reinterpret_cast<BA_ONCACHECOMPLETE_ARGS*>(pvArgs), reinterpret_cast<BA_ONCACHECOMPLETE_RESULTS*>(pvResults)); | ||
| 652 | break; | ||
| 653 | case BOOTSTRAPPER_APPLICATION_MESSAGE_ONEXECUTEBEGIN: | ||
| 654 | hr = BalBaseBAProcOnExecuteBegin(pBA, reinterpret_cast<BA_ONEXECUTEBEGIN_ARGS*>(pvArgs), reinterpret_cast<BA_ONEXECUTEBEGIN_RESULTS*>(pvResults)); | ||
| 655 | break; | ||
| 656 | case BOOTSTRAPPER_APPLICATION_MESSAGE_ONEXECUTEPACKAGEBEGIN: | ||
| 657 | hr = BalBaseBAProcOnExecutePackageBegin(pBA, reinterpret_cast<BA_ONEXECUTEPACKAGEBEGIN_ARGS*>(pvArgs), reinterpret_cast<BA_ONEXECUTEPACKAGEBEGIN_RESULTS*>(pvResults)); | ||
| 658 | break; | ||
| 659 | case BOOTSTRAPPER_APPLICATION_MESSAGE_ONEXECUTEPATCHTARGET: | ||
| 660 | hr = BalBaseBAProcOnExecutePatchTarget(pBA, reinterpret_cast<BA_ONEXECUTEPATCHTARGET_ARGS*>(pvArgs), reinterpret_cast<BA_ONEXECUTEPATCHTARGET_RESULTS*>(pvResults)); | ||
| 661 | break; | ||
| 662 | case BOOTSTRAPPER_APPLICATION_MESSAGE_ONEXECUTEPROGRESS: | ||
| 663 | hr = BalBaseBAProcOnExecuteProgress(pBA, reinterpret_cast<BA_ONEXECUTEPROGRESS_ARGS*>(pvArgs), reinterpret_cast<BA_ONEXECUTEPROGRESS_RESULTS*>(pvResults)); | ||
| 664 | break; | ||
| 665 | case BOOTSTRAPPER_APPLICATION_MESSAGE_ONEXECUTEMSIMESSAGE: | ||
| 666 | hr = BalBaseBAProcOnExecuteMsiMessage(pBA, reinterpret_cast<BA_ONEXECUTEMSIMESSAGE_ARGS*>(pvArgs), reinterpret_cast<BA_ONEXECUTEMSIMESSAGE_RESULTS*>(pvResults)); | ||
| 667 | break; | ||
| 668 | case BOOTSTRAPPER_APPLICATION_MESSAGE_ONEXECUTEFILESINUSE: | ||
| 669 | hr = BalBaseBAProcOnExecuteFilesInUse(pBA, reinterpret_cast<BA_ONEXECUTEFILESINUSE_ARGS*>(pvArgs), reinterpret_cast<BA_ONEXECUTEFILESINUSE_RESULTS*>(pvResults)); | ||
| 670 | break; | ||
| 671 | case BOOTSTRAPPER_APPLICATION_MESSAGE_ONEXECUTEPACKAGECOMPLETE: | ||
| 672 | hr = BalBaseBAProcOnExecutePackageComplete(pBA, reinterpret_cast<BA_ONEXECUTEPACKAGECOMPLETE_ARGS*>(pvArgs), reinterpret_cast<BA_ONEXECUTEPACKAGECOMPLETE_RESULTS*>(pvResults)); | ||
| 673 | break; | ||
| 674 | case BOOTSTRAPPER_APPLICATION_MESSAGE_ONEXECUTECOMPLETE: | ||
| 675 | hr = BalBaseBAProcOnExecuteComplete(pBA, reinterpret_cast<BA_ONEXECUTECOMPLETE_ARGS*>(pvArgs), reinterpret_cast<BA_ONEXECUTECOMPLETE_RESULTS*>(pvResults)); | ||
| 676 | break; | ||
| 677 | case BOOTSTRAPPER_APPLICATION_MESSAGE_ONUNREGISTERBEGIN: | ||
| 678 | hr = BalBaseBAProcOnUnregisterBegin(pBA, reinterpret_cast<BA_ONUNREGISTERBEGIN_ARGS*>(pvArgs), reinterpret_cast<BA_ONUNREGISTERBEGIN_RESULTS*>(pvResults)); | ||
| 679 | break; | ||
| 680 | case BOOTSTRAPPER_APPLICATION_MESSAGE_ONUNREGISTERCOMPLETE: | ||
| 681 | hr = BalBaseBAProcOnUnregisterComplete(pBA, reinterpret_cast<BA_ONUNREGISTERCOMPLETE_ARGS*>(pvArgs), reinterpret_cast<BA_ONUNREGISTERCOMPLETE_RESULTS*>(pvResults)); | ||
| 682 | break; | ||
| 683 | case BOOTSTRAPPER_APPLICATION_MESSAGE_ONAPPLYCOMPLETE: | ||
| 684 | hr = BalBaseBAProcOnApplyComplete(pBA, reinterpret_cast<BA_ONAPPLYCOMPLETE_ARGS*>(pvArgs), reinterpret_cast<BA_ONAPPLYCOMPLETE_RESULTS*>(pvResults)); | ||
| 685 | break; | ||
| 686 | case BOOTSTRAPPER_APPLICATION_MESSAGE_ONLAUNCHAPPROVEDEXEBEGIN: | ||
| 687 | hr = BalBaseBAProcOnLaunchApprovedExeBegin(pBA, reinterpret_cast<BA_ONLAUNCHAPPROVEDEXEBEGIN_ARGS*>(pvArgs), reinterpret_cast<BA_ONLAUNCHAPPROVEDEXEBEGIN_RESULTS*>(pvResults)); | ||
| 688 | break; | ||
| 689 | case BOOTSTRAPPER_APPLICATION_MESSAGE_ONLAUNCHAPPROVEDEXECOMPLETE: | ||
| 690 | hr = BalBaseBAProcOnLaunchApprovedExeComplete(pBA, reinterpret_cast<BA_ONLAUNCHAPPROVEDEXECOMPLETE_ARGS*>(pvArgs), reinterpret_cast<BA_ONLAUNCHAPPROVEDEXECOMPLETE_RESULTS*>(pvResults)); | ||
| 691 | break; | ||
| 692 | } | ||
| 693 | } | ||
| 694 | |||
| 695 | pBA->BAProcFallback(message, pvArgs, pvResults, &hr, pvContext); | ||
| 696 | |||
| 697 | return hr; | ||
| 698 | } | ||
diff --git a/src/balutil/inc/BalBootstrapperEngine.h b/src/balutil/inc/BalBootstrapperEngine.h new file mode 100644 index 00000000..45131d98 --- /dev/null +++ b/src/balutil/inc/BalBootstrapperEngine.h | |||
| @@ -0,0 +1,17 @@ | |||
| 1 | // 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. | ||
| 2 | |||
| 3 | #ifdef __cplusplus | ||
| 4 | extern "C" { | ||
| 5 | #endif | ||
| 6 | |||
| 7 | // function declarations | ||
| 8 | |||
| 9 | HRESULT BalBootstrapperEngineCreate( | ||
| 10 | __in PFN_BOOTSTRAPPER_ENGINE_PROC pfnBAEngineProc, | ||
| 11 | __in_opt LPVOID pvBAEngineProcContext, | ||
| 12 | __out IBootstrapperEngine** ppEngineForApplication | ||
| 13 | ); | ||
| 14 | |||
| 15 | #ifdef __cplusplus | ||
| 16 | } | ||
| 17 | #endif | ||
diff --git a/src/balutil/inc/IBAFunctions.h b/src/balutil/inc/IBAFunctions.h new file mode 100644 index 00000000..7d8a07fa --- /dev/null +++ b/src/balutil/inc/IBAFunctions.h | |||
| @@ -0,0 +1,34 @@ | |||
| 1 | #pragma once | ||
| 2 | // 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. | ||
| 3 | |||
| 4 | |||
| 5 | DECLARE_INTERFACE_IID_(IBAFunctions, IBootstrapperApplication, "0FB445ED-17BD-49C7-BE19-479776F8AE96") | ||
| 6 | { | ||
| 7 | // OnThemeLoaded - Called after the BA finished loading all the controls for the theme. | ||
| 8 | // | ||
| 9 | STDMETHOD(OnThemeLoaded)( | ||
| 10 | THEME* pTheme, | ||
| 11 | WIX_LOCALIZATION* pWixLoc | ||
| 12 | ) = 0; | ||
| 13 | |||
| 14 | // WndProc - Called if the BA hasn't handled the message. | ||
| 15 | // The implementation must either return E_NOTIMPL or call ThemeDefWindowProc for unhandled messages. | ||
| 16 | // | ||
| 17 | STDMETHOD(WndProc)( | ||
| 18 | __in THEME* pTheme, | ||
| 19 | __in HWND hWnd, | ||
| 20 | __in UINT uMsg, | ||
| 21 | __in WPARAM wParam, | ||
| 22 | __in LPARAM lParam, | ||
| 23 | __inout LRESULT* plRes | ||
| 24 | ) = 0; | ||
| 25 | |||
| 26 | // BAFunctionsProc - The PFN_BA_FUNCTIONS_PROC can call this method to give the BAFunctions raw access to the callback from WixStdBA. | ||
| 27 | // This might be used to help the BAFunctions support more than one version of the engine/WixStdBA. | ||
| 28 | STDMETHOD(BAFunctionsProc)( | ||
| 29 | __in BA_FUNCTIONS_MESSAGE message, | ||
| 30 | __in const LPVOID pvArgs, | ||
| 31 | __inout LPVOID pvResults, | ||
| 32 | __in_opt LPVOID pvContext | ||
| 33 | ) = 0; | ||
| 34 | }; | ||
diff --git a/src/balutil/inc/balcondition.h b/src/balutil/inc/balcondition.h new file mode 100644 index 00000000..677c593f --- /dev/null +++ b/src/balutil/inc/balcondition.h | |||
| @@ -0,0 +1,58 @@ | |||
| 1 | #pragma once | ||
| 2 | // 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. | ||
| 3 | |||
| 4 | |||
| 5 | #ifdef __cplusplus | ||
| 6 | extern "C" { | ||
| 7 | #endif | ||
| 8 | |||
| 9 | typedef struct _BAL_CONDITION | ||
| 10 | { | ||
| 11 | LPWSTR sczCondition; | ||
| 12 | LPWSTR sczMessage; | ||
| 13 | } BAL_CONDITION; | ||
| 14 | |||
| 15 | |||
| 16 | typedef struct _BAL_CONDITIONS | ||
| 17 | { | ||
| 18 | BAL_CONDITION* rgConditions; | ||
| 19 | DWORD cConditions; | ||
| 20 | } BAL_CONDITIONS; | ||
| 21 | |||
| 22 | |||
| 23 | /******************************************************************* | ||
| 24 | BalConditionsParseFromXml - loads the conditions from the UX manifest. | ||
| 25 | |||
| 26 | ********************************************************************/ | ||
| 27 | DAPI_(HRESULT) BalConditionsParseFromXml( | ||
| 28 | __in BAL_CONDITIONS* pConditions, | ||
| 29 | __in IXMLDOMDocument* pixdManifest, | ||
| 30 | __in_opt WIX_LOCALIZATION* pWixLoc | ||
| 31 | ); | ||
| 32 | |||
| 33 | |||
| 34 | /******************************************************************* | ||
| 35 | BalConditionEvaluate - evaluates condition against the provided IBurnCore. | ||
| 36 | |||
| 37 | NOTE: psczMessage is optional. | ||
| 38 | ********************************************************************/ | ||
| 39 | DAPI_(HRESULT) BalConditionEvaluate( | ||
| 40 | __in BAL_CONDITION* pCondition, | ||
| 41 | __in IBootstrapperEngine* pEngine, | ||
| 42 | __out BOOL* pfResult, | ||
| 43 | __out_z_opt LPWSTR* psczMessage | ||
| 44 | ); | ||
| 45 | |||
| 46 | |||
| 47 | /******************************************************************* | ||
| 48 | BalConditionsUninitialize - uninitializes any conditions previously loaded. | ||
| 49 | |||
| 50 | ********************************************************************/ | ||
| 51 | DAPI_(void) BalConditionsUninitialize( | ||
| 52 | __in BAL_CONDITIONS* pConditions | ||
| 53 | ); | ||
| 54 | |||
| 55 | |||
| 56 | #ifdef __cplusplus | ||
| 57 | } | ||
| 58 | #endif | ||
diff --git a/src/balutil/inc/balinfo.h b/src/balutil/inc/balinfo.h new file mode 100644 index 00000000..be4b75d0 --- /dev/null +++ b/src/balutil/inc/balinfo.h | |||
| @@ -0,0 +1,107 @@ | |||
| 1 | #pragma once | ||
| 2 | // 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. | ||
| 3 | |||
| 4 | |||
| 5 | #ifdef __cplusplus | ||
| 6 | extern "C" { | ||
| 7 | #endif | ||
| 8 | |||
| 9 | typedef enum BAL_INFO_PACKAGE_TYPE | ||
| 10 | { | ||
| 11 | BAL_INFO_PACKAGE_TYPE_UNKNOWN, | ||
| 12 | BAL_INFO_PACKAGE_TYPE_EXE, | ||
| 13 | BAL_INFO_PACKAGE_TYPE_MSI, | ||
| 14 | BAL_INFO_PACKAGE_TYPE_MSP, | ||
| 15 | BAL_INFO_PACKAGE_TYPE_MSU, | ||
| 16 | BAL_INFO_PACKAGE_TYPE_BUNDLE_UPGRADE, | ||
| 17 | BAL_INFO_PACKAGE_TYPE_BUNDLE_ADDON, | ||
| 18 | BAL_INFO_PACKAGE_TYPE_BUNDLE_PATCH, | ||
| 19 | } BAL_INFO_PACKAGE_TYPE; | ||
| 20 | |||
| 21 | typedef enum BAL_INFO_CACHE_TYPE | ||
| 22 | { | ||
| 23 | BAL_INFO_CACHE_TYPE_NO, | ||
| 24 | BAL_INFO_CACHE_TYPE_YES, | ||
| 25 | BAL_INFO_CACHE_TYPE_ALWAYS, | ||
| 26 | } BAL_INFO_CACHE_TYPE; | ||
| 27 | |||
| 28 | |||
| 29 | typedef struct _BAL_INFO_PACKAGE | ||
| 30 | { | ||
| 31 | LPWSTR sczId; | ||
| 32 | LPWSTR sczDisplayName; | ||
| 33 | LPWSTR sczDescription; | ||
| 34 | BAL_INFO_PACKAGE_TYPE type; | ||
| 35 | BOOL fPermanent; | ||
| 36 | BOOL fVital; | ||
| 37 | BOOL fDisplayInternalUI; | ||
| 38 | LPWSTR sczProductCode; | ||
| 39 | LPWSTR sczUpgradeCode; | ||
| 40 | LPWSTR sczVersion; | ||
| 41 | LPWSTR sczInstallCondition; | ||
| 42 | BAL_INFO_CACHE_TYPE cacheType; | ||
| 43 | } BAL_INFO_PACKAGE; | ||
| 44 | |||
| 45 | |||
| 46 | typedef struct _BAL_INFO_PACKAGES | ||
| 47 | { | ||
| 48 | BAL_INFO_PACKAGE* rgPackages; | ||
| 49 | DWORD cPackages; | ||
| 50 | } BAL_INFO_PACKAGES; | ||
| 51 | |||
| 52 | |||
| 53 | typedef struct _BAL_INFO_BUNDLE | ||
| 54 | { | ||
| 55 | BOOL fPerMachine; | ||
| 56 | LPWSTR sczName; | ||
| 57 | LPWSTR sczLogVariable; | ||
| 58 | BAL_INFO_PACKAGES packages; | ||
| 59 | } BAL_INFO_BUNDLE; | ||
| 60 | |||
| 61 | |||
| 62 | /******************************************************************* | ||
| 63 | BalInfoParseFromXml - loads the bundle and package info from the UX | ||
| 64 | manifest. | ||
| 65 | |||
| 66 | ********************************************************************/ | ||
| 67 | DAPI_(HRESULT) BalInfoParseFromXml( | ||
| 68 | __in BAL_INFO_BUNDLE* pBundle, | ||
| 69 | __in IXMLDOMDocument* pixdManifest | ||
| 70 | ); | ||
| 71 | |||
| 72 | |||
| 73 | /******************************************************************* | ||
| 74 | BalInfoAddRelatedBundleAsPackage - adds a related bundle as a package. | ||
| 75 | |||
| 76 | ********************************************************************/ | ||
| 77 | DAPI_(HRESULT) BalInfoAddRelatedBundleAsPackage( | ||
| 78 | __in BAL_INFO_PACKAGES* pPackages, | ||
| 79 | __in LPCWSTR wzId, | ||
| 80 | __in BOOTSTRAPPER_RELATION_TYPE relationType, | ||
| 81 | __in BOOL fPerMachine | ||
| 82 | ); | ||
| 83 | |||
| 84 | |||
| 85 | /******************************************************************* | ||
| 86 | BalInfoFindPackageById - finds a package by its id. | ||
| 87 | |||
| 88 | ********************************************************************/ | ||
| 89 | DAPI_(HRESULT) BalInfoFindPackageById( | ||
| 90 | __in BAL_INFO_PACKAGES* pPackages, | ||
| 91 | __in LPCWSTR wzId, | ||
| 92 | __out BAL_INFO_PACKAGE** ppPackage | ||
| 93 | ); | ||
| 94 | |||
| 95 | |||
| 96 | /******************************************************************* | ||
| 97 | BalInfoUninitialize - uninitializes any info previously loaded. | ||
| 98 | |||
| 99 | ********************************************************************/ | ||
| 100 | DAPI_(void) BalInfoUninitialize( | ||
| 101 | __in BAL_INFO_BUNDLE* pBundle | ||
| 102 | ); | ||
| 103 | |||
| 104 | |||
| 105 | #ifdef __cplusplus | ||
| 106 | } | ||
| 107 | #endif | ||
diff --git a/src/balutil/inc/balretry.h b/src/balutil/inc/balretry.h new file mode 100644 index 00000000..040ab4ae --- /dev/null +++ b/src/balutil/inc/balretry.h | |||
| @@ -0,0 +1,65 @@ | |||
| 1 | #pragma once | ||
| 2 | // 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. | ||
| 3 | |||
| 4 | |||
| 5 | #ifdef __cplusplus | ||
| 6 | extern "C" { | ||
| 7 | #endif | ||
| 8 | |||
| 9 | typedef enum BALRETRY_TYPE | ||
| 10 | { | ||
| 11 | BALRETRY_TYPE_CACHE, | ||
| 12 | BALRETRY_TYPE_EXECUTE, | ||
| 13 | } BALRETRY_TYPE; | ||
| 14 | |||
| 15 | /******************************************************************* | ||
| 16 | BalRetryInitialize - initialize the retry count and timeout between | ||
| 17 | retries (in milliseconds). | ||
| 18 | ********************************************************************/ | ||
| 19 | DAPI_(void) BalRetryInitialize( | ||
| 20 | __in DWORD dwMaxRetries, | ||
| 21 | __in DWORD dwTimeout | ||
| 22 | ); | ||
| 23 | |||
| 24 | /******************************************************************* | ||
| 25 | BalRetryUninitialize - call to cleanup any memory allocated during | ||
| 26 | use of the retry utility. | ||
| 27 | ********************************************************************/ | ||
| 28 | DAPI_(void) BalRetryUninitialize(); | ||
| 29 | |||
| 30 | /******************************************************************* | ||
| 31 | BalRetryStartPackage - call when a package begins to be modified. If | ||
| 32 | the package is being retried, the function will | ||
| 33 | wait the specified timeout. | ||
| 34 | ********************************************************************/ | ||
| 35 | DAPI_(void) BalRetryStartPackage( | ||
| 36 | __in BALRETRY_TYPE type, | ||
| 37 | __in_z_opt LPCWSTR wzPackageId, | ||
| 38 | __in_z_opt LPCWSTR wzPayloadId | ||
| 39 | ); | ||
| 40 | |||
| 41 | /******************************************************************* | ||
| 42 | BalRetryErrorOccured - call when an error occurs for the retry utility | ||
| 43 | to consider. | ||
| 44 | ********************************************************************/ | ||
| 45 | DAPI_(void) BalRetryErrorOccurred( | ||
| 46 | __in_z_opt LPCWSTR wzPackageId, | ||
| 47 | __in DWORD dwError | ||
| 48 | ); | ||
| 49 | |||
| 50 | /******************************************************************* | ||
| 51 | BalRetryEndPackage - returns IDRETRY is a retry is recommended or | ||
| 52 | IDNOACTION if a retry is not recommended. | ||
| 53 | ********************************************************************/ | ||
| 54 | DAPI_(HRESULT) BalRetryEndPackage( | ||
| 55 | __in BALRETRY_TYPE type, | ||
| 56 | __in_z_opt LPCWSTR wzPackageId, | ||
| 57 | __in_z_opt LPCWSTR wzPayloadId, | ||
| 58 | __in HRESULT hrError, | ||
| 59 | __inout BOOL* pfRetry | ||
| 60 | ); | ||
| 61 | |||
| 62 | |||
| 63 | #ifdef __cplusplus | ||
| 64 | } | ||
| 65 | #endif | ||
diff --git a/src/balutil/inc/balutil.h b/src/balutil/inc/balutil.h new file mode 100644 index 00000000..0fbaab97 --- /dev/null +++ b/src/balutil/inc/balutil.h | |||
| @@ -0,0 +1,165 @@ | |||
| 1 | #pragma once | ||
| 2 | // 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. | ||
| 3 | |||
| 4 | |||
| 5 | #include "dutil.h" | ||
| 6 | |||
| 7 | |||
| 8 | #ifdef __cplusplus | ||
| 9 | extern "C" { | ||
| 10 | #endif | ||
| 11 | |||
| 12 | #define BalExitOnFailure(x, f, ...) if (FAILED(x)) { BalLogError(x, f, __VA_ARGS__); ExitTrace(x, f, __VA_ARGS__); goto LExit; } | ||
| 13 | #define BalExitOnRootFailure(x, f, ...) if (FAILED(x)) { BalLogError(x, f, __VA_ARGS__); Dutil_RootFailure(__FILE__, __LINE__, x); ExitTrace(x, f, __VA_ARGS__); goto LExit; } | ||
| 14 | #define BalExitOnNullWithLastError(p, x, f, ...) if (NULL == p) { DWORD Dutil_er = ::GetLastError(); x = HRESULT_FROM_WIN32(Dutil_er); if (!FAILED(x)) { x = E_FAIL; } BalLogError(x, f, __VA_ARGS__); ExitTrace(x, f, __VA_ARGS__); goto LExit; } | ||
| 15 | |||
| 16 | #define FACILITY_WIX 500 | ||
| 17 | |||
| 18 | const LPCWSTR BAL_MANIFEST_FILENAME = L"BootstrapperApplicationData.xml"; | ||
| 19 | |||
| 20 | static const HRESULT E_WIXSTDBA_CONDITION_FAILED = MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIX, 1); | ||
| 21 | |||
| 22 | static const HRESULT E_MBAHOST_NET452_ON_WIN7RTM = MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIX, 1000); | ||
| 23 | |||
| 24 | |||
| 25 | /******************************************************************* | ||
| 26 | BalInitialize - remembers the engine interface to enable logging and | ||
| 27 | other functions. | ||
| 28 | |||
| 29 | ********************************************************************/ | ||
| 30 | DAPI_(void) BalInitialize( | ||
| 31 | __in IBootstrapperEngine* pEngine | ||
| 32 | ); | ||
| 33 | |||
| 34 | /******************************************************************* | ||
| 35 | BalInitializeFromCreateArgs - convenience function to call BalBootstrapperEngineCreate | ||
| 36 | then pass it along to BalInitialize. | ||
| 37 | |||
| 38 | ********************************************************************/ | ||
| 39 | DAPI_(HRESULT) BalInitializeFromCreateArgs( | ||
| 40 | __in const BOOTSTRAPPER_CREATE_ARGS* pArgs, | ||
| 41 | __out IBootstrapperEngine** ppEngine | ||
| 42 | ); | ||
| 43 | |||
| 44 | /******************************************************************* | ||
| 45 | BalUninitialize - cleans up utility layer internals. | ||
| 46 | |||
| 47 | ********************************************************************/ | ||
| 48 | DAPI_(void) BalUninitialize(); | ||
| 49 | |||
| 50 | /******************************************************************* | ||
| 51 | BalManifestLoad - loads the Application manifest into an XML document. | ||
| 52 | |||
| 53 | ********************************************************************/ | ||
| 54 | DAPI_(HRESULT) BalManifestLoad( | ||
| 55 | __in HMODULE hUXModule, | ||
| 56 | __out IXMLDOMDocument** ppixdManifest | ||
| 57 | ); | ||
| 58 | |||
| 59 | /******************************************************************* | ||
| 60 | BalEvaluateCondition - evaluates a condition using variables in the engine. | ||
| 61 | |||
| 62 | ********************************************************************/ | ||
| 63 | DAPI_(HRESULT) BalEvaluateCondition( | ||
| 64 | __in_z LPCWSTR wzCondition, | ||
| 65 | __out BOOL* pf | ||
| 66 | ); | ||
| 67 | |||
| 68 | /******************************************************************* | ||
| 69 | BalFormatString - formats a string using variables in the engine. | ||
| 70 | |||
| 71 | Note: Use StrFree() to release psczOut. | ||
| 72 | ********************************************************************/ | ||
| 73 | DAPI_(HRESULT) BalFormatString( | ||
| 74 | __in_z LPCWSTR wzFormat, | ||
| 75 | __inout LPWSTR* psczOut | ||
| 76 | ); | ||
| 77 | |||
| 78 | /******************************************************************* | ||
| 79 | BalGetNumericVariable - gets a number from a variable in the engine. | ||
| 80 | |||
| 81 | Note: Returns E_NOTFOUND if variable does not exist. | ||
| 82 | ********************************************************************/ | ||
| 83 | DAPI_(HRESULT) BalGetNumericVariable( | ||
| 84 | __in_z LPCWSTR wzVariable, | ||
| 85 | __out LONGLONG* pllValue | ||
| 86 | ); | ||
| 87 | |||
| 88 | /******************************************************************* | ||
| 89 | BalSetNumericVariable - sets a numeric variable in the engine. | ||
| 90 | |||
| 91 | ********************************************************************/ | ||
| 92 | DAPI_(HRESULT) BalSetNumericVariable( | ||
| 93 | __in_z LPCWSTR wzVariable, | ||
| 94 | __in LONGLONG llValue | ||
| 95 | ); | ||
| 96 | |||
| 97 | /******************************************************************* | ||
| 98 | BalStringVariableExists - checks if a string variable exists in the engine. | ||
| 99 | |||
| 100 | ********************************************************************/ | ||
| 101 | DAPI_(BOOL) BalStringVariableExists( | ||
| 102 | __in_z LPCWSTR wzVariable | ||
| 103 | ); | ||
| 104 | |||
| 105 | /******************************************************************* | ||
| 106 | BalGetStringVariable - gets a string from a variable in the engine. | ||
| 107 | |||
| 108 | Note: Use StrFree() to release psczValue. | ||
| 109 | ********************************************************************/ | ||
| 110 | DAPI_(HRESULT) BalGetStringVariable( | ||
| 111 | __in_z LPCWSTR wzVariable, | ||
| 112 | __inout LPWSTR* psczValue | ||
| 113 | ); | ||
| 114 | |||
| 115 | /******************************************************************* | ||
| 116 | BalSetStringVariable - sets a string variable in the engine. | ||
| 117 | |||
| 118 | ********************************************************************/ | ||
| 119 | DAPI_(HRESULT) BalSetStringVariable( | ||
| 120 | __in_z LPCWSTR wzVariable, | ||
| 121 | __in_z_opt LPCWSTR wzValue | ||
| 122 | ); | ||
| 123 | |||
| 124 | /******************************************************************* | ||
| 125 | BalLog - logs a message with the engine. | ||
| 126 | |||
| 127 | ********************************************************************/ | ||
| 128 | DAPIV_(HRESULT) BalLog( | ||
| 129 | __in BOOTSTRAPPER_LOG_LEVEL level, | ||
| 130 | __in_z __format_string LPCSTR szFormat, | ||
| 131 | ... | ||
| 132 | ); | ||
| 133 | |||
| 134 | /******************************************************************* | ||
| 135 | BalLogError - logs an error message with the engine. | ||
| 136 | |||
| 137 | ********************************************************************/ | ||
| 138 | DAPIV_(HRESULT) BalLogError( | ||
| 139 | __in HRESULT hr, | ||
| 140 | __in_z __format_string LPCSTR szFormat, | ||
| 141 | ... | ||
| 142 | ); | ||
| 143 | |||
| 144 | /******************************************************************* | ||
| 145 | BalLogId - logs a message with the engine with a string embedded in a | ||
| 146 | MESSAGETABLE resource. | ||
| 147 | |||
| 148 | ********************************************************************/ | ||
| 149 | DAPIV_(HRESULT) BalLogId( | ||
| 150 | __in BOOTSTRAPPER_LOG_LEVEL level, | ||
| 151 | __in DWORD dwLogId, | ||
| 152 | __in HMODULE hModule, | ||
| 153 | ... | ||
| 154 | ); | ||
| 155 | |||
| 156 | DAPI_(HRESULT) BalLogIdArgs( | ||
| 157 | __in BOOTSTRAPPER_LOG_LEVEL level, | ||
| 158 | __in DWORD dwLogId, | ||
| 159 | __in HMODULE hModule, | ||
| 160 | __in va_list args | ||
| 161 | ); | ||
| 162 | |||
| 163 | #ifdef __cplusplus | ||
| 164 | } | ||
| 165 | #endif | ||
diff --git a/src/balutil/precomp.h b/src/balutil/precomp.h new file mode 100644 index 00000000..89607416 --- /dev/null +++ b/src/balutil/precomp.h | |||
| @@ -0,0 +1,31 @@ | |||
| 1 | #pragma once | ||
| 2 | // 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. | ||
| 3 | |||
| 4 | |||
| 5 | #include <windows.h> | ||
| 6 | #include <bitsmsg.h> | ||
| 7 | #include <msi.h> | ||
| 8 | #include <wininet.h> | ||
| 9 | #include <CommCtrl.h> | ||
| 10 | |||
| 11 | #include <dutil.h> | ||
| 12 | #include <pathutil.h> | ||
| 13 | #include <locutil.h> | ||
| 14 | #include <memutil.h> | ||
| 15 | #include <strutil.h> | ||
| 16 | #include <thmutil.h> | ||
| 17 | #include <xmlutil.h> | ||
| 18 | |||
| 19 | #include "BootstrapperEngine.h" | ||
| 20 | #include "BootstrapperApplication.h" | ||
| 21 | #include "IBootstrapperEngine.h" | ||
| 22 | #include "IBootstrapperApplication.h" | ||
| 23 | |||
| 24 | #include "BAFunctions.h" | ||
| 25 | #include "IBAFunctions.h" | ||
| 26 | |||
| 27 | #include "balutil.h" | ||
| 28 | #include "BalBootstrapperEngine.h" | ||
| 29 | #include "balcondition.h" | ||
| 30 | #include "balinfo.h" | ||
| 31 | #include "balretry.h" | ||
