aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorSean Hall <r.sean.hall@gmail.com>2018-12-29 22:24:05 -0600
committerSean Hall <r.sean.hall@gmail.com>2018-12-29 22:24:05 -0600
commit60069b189db09521558b99827aee47fe3f81309b (patch)
tree2e955a21999feea3497cd023b6798188b10f377a /src
parent681527e7830ece6325e9a4e64008a7034cc44a25 (diff)
downloadwix-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.cpp720
-rw-r--r--src/balutil/balcondition.cpp124
-rw-r--r--src/balutil/balinfo.cpp288
-rw-r--r--src/balutil/balretry.cpp191
-rw-r--r--src/balutil/balutil.cpp382
-rw-r--r--src/balutil/inc/BAFunctions.h130
-rw-r--r--src/balutil/inc/BalBaseBAFunctions.h700
-rw-r--r--src/balutil/inc/BalBaseBAFunctionsProc.h114
-rw-r--r--src/balutil/inc/BalBaseBootstrapperApplication.h900
-rw-r--r--src/balutil/inc/BalBaseBootstrapperApplicationProc.h698
-rw-r--r--src/balutil/inc/BalBootstrapperEngine.h17
-rw-r--r--src/balutil/inc/IBAFunctions.h34
-rw-r--r--src/balutil/inc/balcondition.h58
-rw-r--r--src/balutil/inc/balinfo.h107
-rw-r--r--src/balutil/inc/balretry.h65
-rw-r--r--src/balutil/inc/balutil.h165
-rw-r--r--src/balutil/precomp.h31
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
6class CBalBootstrapperEngine : public IBootstrapperEngine, public IMarshal
7{
8public: // 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
59public: // 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
534public: // 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
685public:
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
696private:
697 long m_cReferences;
698 PFN_BOOTSTRAPPER_ENGINE_PROC m_pfnBAEngineProc;
699 LPVOID m_pvBAEngineProcContext;
700};
701
702HRESULT 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
717LExit:
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
8DAPI_(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
63LExit:
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
73DAPI_(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
107LExit:
108 return hr;
109}
110
111
112DAPI_(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
6static HRESULT ParsePackagesFromXml(
7 __in BAL_INFO_PACKAGES* pPackages,
8 __in IXMLDOMDocument* pixdManifest
9 );
10
11
12DAPI_(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
47LExit:
48 ReleaseObject(pNode);
49
50 return hr;
51}
52
53
54DAPI_(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
107LExit:
108 return hr;
109}
110
111
112DAPI_(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
133DAPI_(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
156static 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
281LExit:
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
5struct BALRETRY_INFO
6{
7 LPWSTR sczId; // package or container id.
8 LPWSTR sczPayloadId; // optional payload id.
9 DWORD cRetries;
10 DWORD dwLastError;
11};
12
13static DWORD vdwMaxRetries = 0;
14static DWORD vdwTimeout = 0;
15static BALRETRY_INFO vrgRetryInfo[2];
16
17// prototypes
18static BOOL IsActiveRetryEntry(
19 __in BALRETRY_TYPE type,
20 __in_z LPCWSTR wzPackageId,
21 __in_z_opt LPCWSTR wzPayloadId
22 );
23
24
25DAPI_(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
37DAPI_(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
51DAPI_(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
82DAPI_(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
98DAPI_(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
176static 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
5const DWORD VARIABLE_GROW_FACTOR = 80;
6static IBootstrapperEngine* vpEngine = NULL;
7
8// prototypes
9
10DAPI_(void) BalInitialize(
11 __in IBootstrapperEngine* pEngine
12 )
13{
14 pEngine->AddRef();
15
16 ReleaseObject(vpEngine);
17 vpEngine = pEngine;
18}
19
20DAPI_(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
39LExit:
40 ReleaseObject(pEngine);
41
42 return hr;
43}
44
45
46DAPI_(void) BalUninitialize()
47{
48 ReleaseNullObject(vpEngine);
49}
50
51
52DAPI_(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
66LExit:
67 ReleaseStr(sczPath);
68 return hr;
69}
70
71
72DAPI_(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
87LExit:
88 return hr;
89}
90
91
92// The contents of psczOut may be sensitive, should keep encrypted and SecureZeroFree.
93DAPI_(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
124LExit:
125 return hr;
126}
127
128
129// The contents of pllValue may be sensitive, if variable is hidden should keep value encrypted and SecureZeroMemory.
130DAPI_(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
145LExit:
146 return hr;
147}
148
149
150DAPI_(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
165LExit:
166 return hr;
167}
168
169
170DAPI_(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
185LExit:
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.
191DAPI_(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
222LExit:
223 return hr;
224}
225
226DAPI_(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
241LExit:
242 return hr;
243}
244
245
246DAPIV_(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
273LExit:
274 ReleaseStr(sczMessage);
275 ReleaseStr(sczFormattedAnsi);
276 return hr;
277}
278
279
280DAPIV_(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
307LExit:
308 ReleaseStr(sczMessage);
309 ReleaseStr(sczFormattedAnsi);
310 return hr;
311}
312
313DAPIV_(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
333LExit:
334 return hr;
335}
336
337DAPI_(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
375LExit:
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
6extern "C" {
7#endif
8
9// The first 1024 messages are reserved so that the BA messages have the same value here.
10enum 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
72typedef 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
79struct BA_FUNCTIONS_CREATE_ARGS
80{
81 DWORD cbSize;
82 DWORD64 qwBAFunctionsAPIVersion;
83 BOOTSTRAPPER_CREATE_ARGS* pBootstrapperCreateArgs;
84};
85
86struct BA_FUNCTIONS_CREATE_RESULTS
87{
88 DWORD cbSize;
89 PFN_BA_FUNCTIONS_PROC pfnBAFunctionsProc;
90 LPVOID pvBAFunctionsProcContext;
91};
92
93struct BA_FUNCTIONS_ONTHEMELOADED_ARGS
94{
95 DWORD cbSize;
96 THEME* pTheme;
97 WIX_LOCALIZATION* pWixLoc;
98};
99
100struct BA_FUNCTIONS_ONTHEMELOADED_RESULTS
101{
102 DWORD cbSize;
103};
104
105struct 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
115struct BA_FUNCTIONS_WNDPROC_RESULTS
116{
117 DWORD cbSize;
118 LRESULT lres;
119};
120
121typedef HRESULT(WINAPI *PFN_BA_FUNCTIONS_CREATE)(
122 __in const BA_FUNCTIONS_CREATE_ARGS* pArgs,
123 __inout BA_FUNCTIONS_CREATE_RESULTS* pResults
124 );
125
126typedef 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
18class CBalBaseBAFunctions : public IBAFunctions
19{
20public: // 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
71public: // 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
619public: // 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
665protected:
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
689private:
690 long m_cReferences;
691
692protected:
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
9static 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
18static 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/*******************************************************************
28BalBaseBAFunctionsProc - requires pvContext to be of type IBAFunctions.
29Provides a default mapping between the message based BAFunctions interface and
30the COM-based BAFunctions interface.
31
32*******************************************************************/
33static 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
14class CBalBaseBootstrapperApplication : public IBootstrapperApplication
15{
16public: // 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
63public: // 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
804protected:
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
885protected:
886 CRITICAL_SECTION m_csCanceled;
887 BOOL m_fCanceled;
888
889private:
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
12static 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
21static 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
30static 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
39static 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
48static 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
57static 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
66static 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
75static 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
84static 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
93static 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
102static 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
111static 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
120static 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
129static 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
138static 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
147static 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
156static 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
165static 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
174static 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
183static 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
192static 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
201static 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
210static 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
219static 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
228static 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
237static 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
246static 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
255static 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
264static 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
273static 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
282static 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
291static 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
300static 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
309static 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
318static 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
327static 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
336static 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
345static 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
354static 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
363static 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
372static 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
381static 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
390static 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
399static 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
408static 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
417static 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
426static 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
435static 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
444static 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
453static 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
462static 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
471static 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
480static 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
489static 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
498static 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/*******************************************************************
508BalBaseBootstrapperApplicationProc - 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*******************************************************************/
513static 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
4extern "C" {
5#endif
6
7// function declarations
8
9HRESULT 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
5DECLARE_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
6extern "C" {
7#endif
8
9typedef struct _BAL_CONDITION
10{
11 LPWSTR sczCondition;
12 LPWSTR sczMessage;
13} BAL_CONDITION;
14
15
16typedef 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********************************************************************/
27DAPI_(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********************************************************************/
39DAPI_(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********************************************************************/
51DAPI_(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
6extern "C" {
7#endif
8
9typedef 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
21typedef 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
29typedef 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
46typedef struct _BAL_INFO_PACKAGES
47{
48 BAL_INFO_PACKAGE* rgPackages;
49 DWORD cPackages;
50} BAL_INFO_PACKAGES;
51
52
53typedef 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********************************************************************/
67DAPI_(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 ********************************************************************/
77DAPI_(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 ********************************************************************/
89DAPI_(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********************************************************************/
100DAPI_(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
6extern "C" {
7#endif
8
9typedef 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********************************************************************/
19DAPI_(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********************************************************************/
28DAPI_(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********************************************************************/
35DAPI_(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********************************************************************/
45DAPI_(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********************************************************************/
54DAPI_(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
9extern "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
18const LPCWSTR BAL_MANIFEST_FILENAME = L"BootstrapperApplicationData.xml";
19
20static const HRESULT E_WIXSTDBA_CONDITION_FAILED = MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIX, 1);
21
22static 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********************************************************************/
30DAPI_(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********************************************************************/
39DAPI_(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********************************************************************/
48DAPI_(void) BalUninitialize();
49
50/*******************************************************************
51 BalManifestLoad - loads the Application manifest into an XML document.
52
53********************************************************************/
54DAPI_(HRESULT) BalManifestLoad(
55 __in HMODULE hUXModule,
56 __out IXMLDOMDocument** ppixdManifest
57 );
58
59/*******************************************************************
60BalEvaluateCondition - evaluates a condition using variables in the engine.
61
62********************************************************************/
63DAPI_(HRESULT) BalEvaluateCondition(
64 __in_z LPCWSTR wzCondition,
65 __out BOOL* pf
66 );
67
68/*******************************************************************
69BalFormatString - formats a string using variables in the engine.
70
71 Note: Use StrFree() to release psczOut.
72********************************************************************/
73DAPI_(HRESULT) BalFormatString(
74 __in_z LPCWSTR wzFormat,
75 __inout LPWSTR* psczOut
76 );
77
78/*******************************************************************
79BalGetNumericVariable - gets a number from a variable in the engine.
80
81 Note: Returns E_NOTFOUND if variable does not exist.
82********************************************************************/
83DAPI_(HRESULT) BalGetNumericVariable(
84 __in_z LPCWSTR wzVariable,
85 __out LONGLONG* pllValue
86 );
87
88/*******************************************************************
89BalSetNumericVariable - sets a numeric variable in the engine.
90
91********************************************************************/
92DAPI_(HRESULT) BalSetNumericVariable(
93 __in_z LPCWSTR wzVariable,
94 __in LONGLONG llValue
95 );
96
97/*******************************************************************
98BalStringVariableExists - checks if a string variable exists in the engine.
99
100********************************************************************/
101DAPI_(BOOL) BalStringVariableExists(
102 __in_z LPCWSTR wzVariable
103 );
104
105/*******************************************************************
106BalGetStringVariable - gets a string from a variable in the engine.
107
108 Note: Use StrFree() to release psczValue.
109********************************************************************/
110DAPI_(HRESULT) BalGetStringVariable(
111 __in_z LPCWSTR wzVariable,
112 __inout LPWSTR* psczValue
113 );
114
115/*******************************************************************
116BalSetStringVariable - sets a string variable in the engine.
117
118********************************************************************/
119DAPI_(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********************************************************************/
128DAPIV_(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********************************************************************/
138DAPIV_(HRESULT) BalLogError(
139 __in HRESULT hr,
140 __in_z __format_string LPCSTR szFormat,
141 ...
142 );
143
144/*******************************************************************
145BalLogId - logs a message with the engine with a string embedded in a
146 MESSAGETABLE resource.
147
148********************************************************************/
149DAPIV_(HRESULT) BalLogId(
150 __in BOOTSTRAPPER_LOG_LEVEL level,
151 __in DWORD dwLogId,
152 __in HMODULE hModule,
153 ...
154 );
155
156DAPI_(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"