main
cpp 1,597 lines 56.2 KB
Raw
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 class CBalBootstrapperEngine : public IBootstrapperEngine
6 {
7 public: // IUnknown
8 virtual STDMETHODIMP QueryInterface(
9 __in REFIID riid,
10 __out LPVOID *ppvObject
11 )
12 {
13 if (!ppvObject)
14 {
15 return E_INVALIDARG;
16 }
17
18 *ppvObject = NULL;
19
20 if (::IsEqualIID(__uuidof(IBootstrapperEngine), riid))
21 {
22 *ppvObject = static_cast<IBootstrapperEngine*>(this);
23 }
24 else if (::IsEqualIID(IID_IMarshal, riid))
25 {
26 return m_pFreeThreadedMarshaler->QueryInterface(riid, ppvObject);
27 }
28 else if (::IsEqualIID(IID_IUnknown, riid))
29 {
30 *ppvObject = reinterpret_cast<IUnknown*>(this);
31 }
32 else // no interface for requested iid
33 {
34 return E_NOINTERFACE;
35 }
36
37 AddRef();
38 return S_OK;
39 }
40
41 virtual STDMETHODIMP_(ULONG) AddRef()
42 {
43 return ::InterlockedIncrement(&this->m_cReferences);
44 }
45
46 virtual STDMETHODIMP_(ULONG) Release()
47 {
48 long l = ::InterlockedDecrement(&this->m_cReferences);
49 if (0 < l)
50 {
51 return l;
52 }
53
54 delete this;
55 return 0;
56 }
57
58 public: // IBootstrapperEngine
59 virtual STDMETHODIMP GetPackageCount(
60 __out DWORD* pcPackages
61 )
62 {
63 HRESULT hr = S_OK;
64 BAENGINE_GETPACKAGECOUNT_ARGS args = { };
65 BAENGINE_GETPACKAGECOUNT_RESULTS results = { };
66 BUFF_BUFFER bufferArgs = { };
67 BUFF_BUFFER bufferResults = { };
68 PIPE_RPC_RESULT rpc = { };
69 SIZE_T iBuffer = 0;
70
71 ExitOnNull(pcPackages, hr, E_INVALIDARG, "pcPackages is required");
72
73 // Init send structs.
74 args.dwApiVersion = WIX_5_BOOTSTRAPPER_APPLICATION_API_VERSION;
75
76 results.dwApiVersion = WIX_5_BOOTSTRAPPER_APPLICATION_API_VERSION;
77
78 // Send args.
79 hr = BuffWriteNumberToBuffer(&bufferArgs, args.dwApiVersion);
80 ExitOnFailure(hr, "Failed to write API version of GetPackageCount args.");
81
82 // Send results.
83 hr = BuffWriteNumberToBuffer(&bufferResults, results.dwApiVersion);
84 ExitOnFailure(hr, "Failed to write API version of GetPackageCount results.");
85
86 // Get results.
87 hr = SendRequest(BOOTSTRAPPER_ENGINE_MESSAGE_GETPACKAGECOUNT, &bufferArgs, &bufferResults, &rpc);
88 ExitOnFailure(hr, "BA GetPackageCount failed.");
89
90 // Read results.
91 hr = BuffReadNumber(rpc.pbData, rpc.cbData, &iBuffer, &results.dwApiVersion);
92 ExitOnFailure(hr, "Failed to read value length from GetPackageCount results.");
93
94 hr = BuffReadNumber(rpc.pbData, rpc.cbData, &iBuffer, (DWORD*)&results.cPackages);
95 ExitOnFailure(hr, "Failed to read value length from GetPackageCount results.");
96
97 *pcPackages = results.cPackages;
98
99 LExit:
100 PipeFreeRpcResult(&rpc);
101 ReleaseBuffer(bufferResults);
102 ReleaseBuffer(bufferArgs);
103
104 return hr;
105 }
106
107 virtual STDMETHODIMP GetVariableNumeric(
108 __in_z LPCWSTR wzVariable,
109 __out LONGLONG* pllValue
110 )
111 {
112 HRESULT hr = S_OK;
113 BAENGINE_GETVARIABLENUMERIC_ARGS args = { };
114 BAENGINE_GETVARIABLENUMERIC_RESULTS results = { };
115 BUFF_BUFFER bufferArgs = { };
116 BUFF_BUFFER bufferResults = { };
117 PIPE_RPC_RESULT rpc = { };
118 SIZE_T iBuffer = 0;
119 LPWSTR sczValue = NULL;
120
121 ExitOnNull(pllValue, hr, E_INVALIDARG, "pllValue is required");
122
123 // Init send structs.
124 args.dwApiVersion = WIX_5_BOOTSTRAPPER_APPLICATION_API_VERSION;
125 args.wzVariable = wzVariable;
126
127 results.dwApiVersion = WIX_5_BOOTSTRAPPER_APPLICATION_API_VERSION;
128
129 // Send args.
130 hr = BuffWriteNumberToBuffer(&bufferArgs, args.dwApiVersion);
131 ExitOnFailure(hr, "Failed to write API version of GetVariableNumeric args.");
132
133 hr = BuffWriteStringToBuffer(&bufferArgs, args.wzVariable);
134 ExitOnFailure(hr, "Failed to write variable name of GetVariableNumeric args.");
135
136 // Send results.
137 hr = BuffWriteNumberToBuffer(&bufferResults, results.dwApiVersion);
138 ExitOnFailure(hr, "Failed to write API version of GetVariableNumeric results.");
139
140 // Get results.
141 hr = SendRequest(BOOTSTRAPPER_ENGINE_MESSAGE_GETVARIABLENUMERIC, &bufferArgs, &bufferResults, &rpc);
142 ExitOnFailure(hr, "BA GetVariableNumeric failed.");
143
144 // Read results.
145 hr = BuffReadNumber(rpc.pbData, rpc.cbData, &iBuffer, &results.dwApiVersion);
146 ExitOnFailure(hr, "Failed to read value length from GetVariableNumeric results.");
147
148 hr = BuffReadNumber64(rpc.pbData, rpc.cbData, &iBuffer, (DWORD64*)&results.llValue);
149 ExitOnFailure(hr, "Failed to read value length from GetVariableNumeric results.");
150
151 *pllValue = results.llValue;
152
153 LExit:
154 ReleaseStr(sczValue);
155 PipeFreeRpcResult(&rpc);
156 ReleaseBuffer(bufferResults);
157 ReleaseBuffer(bufferArgs);
158
159 return hr;
160 }
161
162 virtual STDMETHODIMP GetVariableString(
163 __in_z LPCWSTR wzVariable,
164 __out_ecount_opt(*pcchValue) LPWSTR wzValue,
165 __inout SIZE_T* pcchValue
166 )
167 {
168 HRESULT hr = S_OK;
169 BAENGINE_GETVARIABLESTRING_ARGS args = { };
170 BAENGINE_GETVARIABLESTRING_RESULTS results = { };
171 BUFF_BUFFER bufferArgs = { };
172 BUFF_BUFFER bufferResults = { };
173 PIPE_RPC_RESULT rpc = { };
174 SIZE_T iBuffer = 0;
175 LPWSTR sczValue = NULL;
176
177 ExitOnNull(pcchValue, hr, E_INVALIDARG, "pcchValue is required");
178
179 // Init send structs.
180 args.dwApiVersion = WIX_5_BOOTSTRAPPER_APPLICATION_API_VERSION;
181 args.wzVariable = wzVariable;
182
183 results.dwApiVersion = WIX_5_BOOTSTRAPPER_APPLICATION_API_VERSION;
184 results.cchValue = static_cast<DWORD>(*pcchValue);
185
186 // Send args.
187 hr = BuffWriteNumberToBuffer(&bufferArgs, args.dwApiVersion);
188 ExitOnFailure(hr, "Failed to write API version of GetVariableString args.");
189
190 hr = BuffWriteStringToBuffer(&bufferArgs, args.wzVariable);
191 ExitOnFailure(hr, "Failed to write variable name of GetVariableString args.");
192
193 // Send results.
194 hr = BuffWriteNumberToBuffer(&bufferResults, results.dwApiVersion);
195 ExitOnFailure(hr, "Failed to write API version of GetVariableString results.");
196
197 hr = BuffWriteNumberToBuffer(&bufferResults, results.cchValue);
198 ExitOnFailure(hr, "Failed to write API version of GetVariableString results value.");
199
200 // Get results.
201 hr = SendRequest(BOOTSTRAPPER_ENGINE_MESSAGE_GETVARIABLESTRING, &bufferArgs, &bufferResults, &rpc);
202 ExitOnFailure(hr, "BA GetVariableString failed.");
203
204 // Read results.
205 hr = BuffReadNumber(rpc.pbData, rpc.cbData, &iBuffer, &results.dwApiVersion);
206 ExitOnFailure(hr, "Failed to read value length from GetVariableString results.");
207
208 hr = BuffReadNumber(rpc.pbData, rpc.cbData, &iBuffer, &results.cchValue);
209 ExitOnFailure(hr, "Failed to read value length from GetVariableString results.");
210
211 hr = BuffReadString(rpc.pbData, rpc.cbData, &iBuffer, &sczValue);
212 ExitOnFailure(hr, "Failed to read value from GetVariableString results.");
213
214 results.wzValue = sczValue;
215
216 if (wzValue)
217 {
218 hr = ::StringCchCopyW(wzValue, *pcchValue, results.wzValue);
219 if (E_INSUFFICIENT_BUFFER == hr)
220 {
221 hr = E_MOREDATA;
222 }
223 }
224 else if (results.cchValue)
225 {
226 hr = E_MOREDATA;
227 }
228
229 *pcchValue = results.cchValue;
230 ExitOnFailure(hr, "Failed to copy value from GetVariableString results.");
231
232 LExit:
233 ReleaseStr(sczValue);
234 PipeFreeRpcResult(&rpc);
235 ReleaseBuffer(bufferResults);
236 ReleaseBuffer(bufferArgs);
237
238 return hr;
239 }
240
241 virtual STDMETHODIMP GetVariableVersion(
242 __in_z LPCWSTR wzVariable,
243 __out_ecount_opt(*pcchValue) LPWSTR wzValue,
244 __inout SIZE_T* pcchValue
245 )
246 {
247 HRESULT hr = S_OK;
248 BAENGINE_GETVARIABLEVERSION_ARGS args = { };
249 BAENGINE_GETVARIABLEVERSION_RESULTS results = { };
250 BUFF_BUFFER bufferArgs = { };
251 BUFF_BUFFER bufferResults = { };
252 PIPE_RPC_RESULT rpc = { };
253 SIZE_T iBuffer = 0;
254 LPWSTR sczValue = NULL;
255
256 ExitOnNull(pcchValue, hr, E_INVALIDARG, "pcchValue is required");
257
258 // Init send structs.
259 args.dwApiVersion = WIX_5_BOOTSTRAPPER_APPLICATION_API_VERSION;
260 args.wzVariable = wzVariable;
261
262 results.dwApiVersion = WIX_5_BOOTSTRAPPER_APPLICATION_API_VERSION;
263 hr = DutilSizetToDword(*pcchValue, &results.cchValue);
264 ExitOnFailure(hr, "Failed to convert pcchValue to DWORD.");
265
266 // Send args.
267 hr = BuffWriteNumberToBuffer(&bufferArgs, args.dwApiVersion);
268 ExitOnFailure(hr, "Failed to write API version of GetVariableVersion args.");
269
270 hr = BuffWriteStringToBuffer(&bufferArgs, args.wzVariable);
271 ExitOnFailure(hr, "Failed to write variable name of GetVariableVersion args.");
272
273 // Send results.
274 hr = BuffWriteNumberToBuffer(&bufferResults, results.dwApiVersion);
275 ExitOnFailure(hr, "Failed to write API version of GetVariableVersion results.");
276
277 hr = BuffWriteNumberToBuffer(&bufferResults, results.cchValue);
278 ExitOnFailure(hr, "Failed to write API version of GetVariableVersion results value.");
279
280 // Get results.
281 hr = SendRequest(BOOTSTRAPPER_ENGINE_MESSAGE_GETVARIABLEVERSION, &bufferArgs, &bufferResults, &rpc);
282 ExitOnFailure(hr, "BA GetVariableVersion failed.");
283
284 // Read results.
285 hr = BuffReadNumber(rpc.pbData, rpc.cbData, &iBuffer, &results.dwApiVersion);
286 ExitOnFailure(hr, "Failed to read value length from GetVariableVersion results.");
287
288 hr = BuffReadNumber(rpc.pbData, rpc.cbData, &iBuffer, &results.cchValue);
289 ExitOnFailure(hr, "Failed to read value length from GetVariableVersion results.");
290
291 hr = BuffReadString(rpc.pbData, rpc.cbData, &iBuffer, &sczValue);
292 ExitOnFailure(hr, "Failed to read value from GetVariableVersion results.");
293
294 results.wzValue = sczValue;
295
296 if (wzValue)
297 {
298 hr = ::StringCchCopyW(wzValue, *pcchValue, results.wzValue);
299 if (E_INSUFFICIENT_BUFFER == hr)
300 {
301 hr = E_MOREDATA;
302 }
303 }
304 else if (results.cchValue)
305 {
306 hr = E_MOREDATA;
307 }
308
309 *pcchValue = results.cchValue;
310 ExitOnFailure(hr, "Failed to copy value from GetVariableVersion results.");
311
312 LExit:
313 ReleaseStr(sczValue);
314 PipeFreeRpcResult(&rpc);
315 ReleaseBuffer(bufferResults);
316 ReleaseBuffer(bufferArgs);
317
318 return hr;
319 }
320
321 virtual STDMETHODIMP GetRelatedBundleVariable(
322 __in_z LPCWSTR wzBundleId,
323 __in_z LPCWSTR wzVariable,
324 __out_ecount_opt(*pcchValue) LPWSTR wzValue,
325 __inout SIZE_T* pcchValue
326 )
327 {
328 HRESULT hr = S_OK;
329 BAENGINE_GETRELATEDBUNDLEVARIABLE_ARGS args = { };
330 BAENGINE_GETRELATEDBUNDLEVARIABLE_RESULTS results = { };
331 BUFF_BUFFER bufferArgs = { };
332 BUFF_BUFFER bufferResults = { };
333 PIPE_RPC_RESULT rpc = { };
334 SIZE_T iBuffer = 0;
335 LPWSTR sczValue = NULL;
336
337 ExitOnNull(pcchValue, hr, E_INVALIDARG, "pcchValue is required");
338
339 // Init send structs.
340 args.dwApiVersion = WIX_5_BOOTSTRAPPER_APPLICATION_API_VERSION;
341 args.wzBundleId = wzBundleId;
342 args.wzVariable = wzVariable;
343
344 results.dwApiVersion = WIX_5_BOOTSTRAPPER_APPLICATION_API_VERSION;
345 hr = DutilSizetToDword(*pcchValue, &results.cchValue);
346 ExitOnFailure(hr, "Failed to convert pcchValue to DWORD.");
347
348 // Send args.
349 hr = BuffWriteNumberToBuffer(&bufferArgs, args.dwApiVersion);
350 ExitOnFailure(hr, "Failed to write API version of GetRelatedBundleVariable args.");
351
352 hr = BuffWriteStringToBuffer(&bufferArgs, args.wzBundleId);
353 ExitOnFailure(hr, "Failed to write bundle id of GetRelatedBundleVariable args.");
354
355 hr = BuffWriteStringToBuffer(&bufferArgs, args.wzVariable);
356 ExitOnFailure(hr, "Failed to write variable name of GetRelatedBundleVariable args.");
357
358 // Send results.
359 hr = BuffWriteNumberToBuffer(&bufferResults, results.dwApiVersion);
360 ExitOnFailure(hr, "Failed to write API version of GetRelatedBundleVariable results.");
361
362 hr = BuffWriteNumberToBuffer(&bufferResults, results.cchValue);
363 ExitOnFailure(hr, "Failed to write API version of GetRelatedBundleVariable results value.");
364
365 // Get results.
366 hr = SendRequest(BOOTSTRAPPER_ENGINE_MESSAGE_GETRELATEDBUNDLEVARIABLE, &bufferArgs, &bufferResults, &rpc);
367 ExitOnFailure(hr, "BA GetRelatedBundleVariable failed.");
368
369 // Read results.
370 hr = BuffReadNumber(rpc.pbData, rpc.cbData, &iBuffer, &results.dwApiVersion);
371 ExitOnFailure(hr, "Failed to read value length from GetRelatedBundleVariable results.");
372
373 hr = BuffReadNumber(rpc.pbData, rpc.cbData, &iBuffer, &results.cchValue);
374 ExitOnFailure(hr, "Failed to read value length from GetRelatedBundleVariable results.");
375
376 hr = BuffReadString(rpc.pbData, rpc.cbData, &iBuffer, &sczValue);
377 ExitOnFailure(hr, "Failed to read value from GetRelatedBundleVariable results.");
378
379 results.wzValue = sczValue;
380
381 if (wzValue)
382 {
383 hr = ::StringCchCopyW(wzValue, *pcchValue, results.wzValue);
384 if (E_INSUFFICIENT_BUFFER == hr)
385 {
386 hr = E_MOREDATA;
387 }
388 }
389 else if (results.cchValue)
390 {
391 hr = E_MOREDATA;
392 }
393
394 *pcchValue = results.cchValue;
395 ExitOnFailure(hr, "Failed to copy value from GetRelatedBundleVariable results.");
396
397 LExit:
398 ReleaseStr(sczValue);
399 PipeFreeRpcResult(&rpc);
400 ReleaseBuffer(bufferResults);
401 ReleaseBuffer(bufferArgs);
402
403 return hr;
404 }
405
406 virtual STDMETHODIMP FormatString(
407 __in_z LPCWSTR wzIn,
408 __out_ecount_opt(*pcchOut) LPWSTR wzOut,
409 __inout SIZE_T* pcchOut
410 )
411 {
412 HRESULT hr = S_OK;
413 BAENGINE_FORMATSTRING_ARGS args = { };
414 BAENGINE_FORMATSTRING_RESULTS results = { };
415 BUFF_BUFFER bufferArgs = { };
416 BUFF_BUFFER bufferResults = { };
417 PIPE_RPC_RESULT rpc = { };
418 SIZE_T iBuffer = 0;
419 LPWSTR sczOut = NULL;
420
421 ExitOnNull(pcchOut, hr, E_INVALIDARG, "pcchOut is required");
422
423 // Init send structs.
424 args.dwApiVersion = WIX_5_BOOTSTRAPPER_APPLICATION_API_VERSION;
425 args.wzIn = wzIn;
426
427 results.dwApiVersion = WIX_5_BOOTSTRAPPER_APPLICATION_API_VERSION;
428 hr = DutilSizetToDword(*pcchOut, &results.cchOut);
429 ExitOnFailure(hr, "Failed to convert pcchOut to DWORD.");
430
431 // Send args.
432 hr = BuffWriteNumberToBuffer(&bufferArgs, args.dwApiVersion);
433 ExitOnFailure(hr, "Failed to write API version of FormatString args.");
434
435 hr = BuffWriteStringToBuffer(&bufferArgs, args.wzIn);
436 ExitOnFailure(hr, "Failed to write string to format of FormatString args.");
437
438 // Send results.
439 hr = BuffWriteNumberToBuffer(&bufferResults, results.dwApiVersion);
440 ExitOnFailure(hr, "Failed to write API version of FormatString results.");
441
442 hr = BuffWriteNumberToBuffer(&bufferResults, results.cchOut);
443 ExitOnFailure(hr, "Failed to write format string maximum size of FormatString results value.");
444
445 // Get results.
446 hr = SendRequest(BOOTSTRAPPER_ENGINE_MESSAGE_FORMATSTRING, &bufferArgs, &bufferResults, &rpc);
447 ExitOnFailure(hr, "BA FormatString failed.");
448
449 // Read results.
450 hr = BuffReadNumber(rpc.pbData, rpc.cbData, &iBuffer, &results.dwApiVersion);
451 ExitOnFailure(hr, "Failed to read size from FormatString results.");
452
453 hr = BuffReadNumber(rpc.pbData, rpc.cbData, &iBuffer, &results.cchOut);
454 ExitOnFailure(hr, "Failed to read formatted string length from FormatString results.");
455
456 hr = BuffReadString(rpc.pbData, rpc.cbData, &iBuffer, &sczOut);
457 ExitOnFailure(hr, "Failed to read formatted string from FormatString results.");
458
459 results.wzOut = sczOut;
460
461 if (wzOut)
462 {
463 hr = ::StringCchCopyW(wzOut, *pcchOut, results.wzOut);
464 if (E_INSUFFICIENT_BUFFER == hr)
465 {
466 hr = E_MOREDATA;
467 }
468 }
469 else if (results.cchOut)
470 {
471 hr = E_MOREDATA;
472 }
473
474 *pcchOut = results.cchOut;
475 ExitOnFailure(hr, "Failed to copy formatted string from FormatString results.");
476
477 LExit:
478 ReleaseStr(sczOut);
479 PipeFreeRpcResult(&rpc);
480 ReleaseBuffer(bufferResults);
481 ReleaseBuffer(bufferArgs);
482
483 return hr;
484 }
485
486 virtual STDMETHODIMP EscapeString(
487 __in_z LPCWSTR wzIn,
488 __out_ecount_opt(*pcchOut) LPWSTR wzOut,
489 __inout SIZE_T* pcchOut
490 )
491 {
492 HRESULT hr = S_OK;
493 BAENGINE_ESCAPESTRING_ARGS args = { };
494 BAENGINE_ESCAPESTRING_RESULTS results = { };
495 BUFF_BUFFER bufferArgs = { };
496 BUFF_BUFFER bufferResults = { };
497 PIPE_RPC_RESULT rpc = { };
498 SIZE_T iBuffer = 0;
499 LPWSTR sczOut = NULL;
500
501 ExitOnNull(pcchOut, hr, E_INVALIDARG, "pcchOut is required");
502
503 // Init send structs.
504 args.dwApiVersion = WIX_5_BOOTSTRAPPER_APPLICATION_API_VERSION;
505 args.wzIn = wzIn;
506
507 results.dwApiVersion = WIX_5_BOOTSTRAPPER_APPLICATION_API_VERSION;
508 hr = DutilSizetToDword(*pcchOut, &results.cchOut);
509 ExitOnFailure(hr, "Failed to convert pcchOut to DWORD.");
510
511 // Send args.
512 hr = BuffWriteNumberToBuffer(&bufferArgs, args.dwApiVersion);
513 ExitOnFailure(hr, "Failed to write API version of EscapeString args.");
514
515 hr = BuffWriteStringToBuffer(&bufferArgs, args.wzIn);
516 ExitOnFailure(hr, "Failed to write string to escape of EscapeString args.");
517
518 // Send results.
519 hr = BuffWriteNumberToBuffer(&bufferResults, results.dwApiVersion);
520 ExitOnFailure(hr, "Failed to write API version of EscapeString results.");
521
522 hr = BuffWriteNumberToBuffer(&bufferResults, results.cchOut);
523 ExitOnFailure(hr, "Failed to write escape string maximum size of EscapeString results value.");
524
525 // Get results.
526 hr = SendRequest(BOOTSTRAPPER_ENGINE_MESSAGE_ESCAPESTRING, &bufferArgs, &bufferResults, &rpc);
527 ExitOnFailure(hr, "BA EscapeString failed.");
528
529 // Read results.
530 hr = BuffReadNumber(rpc.pbData, rpc.cbData, &iBuffer, &results.dwApiVersion);
531 ExitOnFailure(hr, "Failed to read size from EscapeString results.");
532
533 hr = BuffReadNumber(rpc.pbData, rpc.cbData, &iBuffer, &results.cchOut);
534 ExitOnFailure(hr, "Failed to read escaped string length from EscapeString results.");
535
536 hr = BuffReadString(rpc.pbData, rpc.cbData, &iBuffer, &sczOut);
537 ExitOnFailure(hr, "Failed to read escaped string from EscapeString results.");
538
539 results.wzOut = sczOut;
540
541 if (wzOut)
542 {
543 hr = ::StringCchCopyW(wzOut, *pcchOut, results.wzOut);
544 if (E_INSUFFICIENT_BUFFER == hr)
545 {
546 hr = E_MOREDATA;
547 }
548 }
549 else if (results.cchOut)
550 {
551 hr = E_MOREDATA;
552 }
553
554 *pcchOut = results.cchOut;
555 ExitOnFailure(hr, "Failed to copy escaped string from EscapeString results.");
556
557 LExit:
558 ReleaseStr(sczOut);
559 PipeFreeRpcResult(&rpc);
560 ReleaseBuffer(bufferResults);
561 ReleaseBuffer(bufferArgs);
562
563 return hr;
564 }
565
566 virtual STDMETHODIMP EvaluateCondition(
567 __in_z LPCWSTR wzCondition,
568 __out BOOL* pf
569 )
570 {
571 HRESULT hr = S_OK;
572 BAENGINE_EVALUATECONDITION_ARGS args = { };
573 BAENGINE_EVALUATECONDITION_RESULTS results = { };
574 BUFF_BUFFER bufferArgs = { };
575 BUFF_BUFFER bufferResults = { };
576 PIPE_RPC_RESULT rpc = { };
577 SIZE_T iBuffer = 0;
578
579 ExitOnNull(wzCondition, hr, E_INVALIDARG, "wzCondition is required");
580 ExitOnNull(pf, hr, E_INVALIDARG, "pf is required");
581
582 // Empty condition evaluates to true.
583 if (!*wzCondition)
584 {
585 *pf = TRUE;
586 ExitFunction();
587 }
588
589 // Init send structs.
590 args.dwApiVersion = WIX_5_BOOTSTRAPPER_APPLICATION_API_VERSION;
591 args.wzCondition = wzCondition;
592
593 results.dwApiVersion = WIX_5_BOOTSTRAPPER_APPLICATION_API_VERSION;
594
595 // Send args.
596 hr = BuffWriteNumberToBuffer(&bufferArgs, args.dwApiVersion);
597 ExitOnFailure(hr, "Failed to write API version of EvaluateCondition args.");
598
599 hr = BuffWriteStringToBuffer(&bufferArgs, args.wzCondition);
600 ExitOnFailure(hr, "Failed to write condition of EvaluateCondition args.");
601
602 // Send results.
603 hr = BuffWriteNumberToBuffer(&bufferResults, results.dwApiVersion);
604 ExitOnFailure(hr, "Failed to write API version of EvaluateCondition results.");
605
606 // Get results.
607 hr = SendRequest(BOOTSTRAPPER_ENGINE_MESSAGE_EVALUATECONDITION, &bufferArgs, &bufferResults, &rpc);
608 ExitOnFailure(hr, "BA EvaluateCondition failed.");
609
610 // Read results.
611 hr = BuffReadNumber(rpc.pbData, rpc.cbData, &iBuffer, &results.dwApiVersion);
612 ExitOnFailure(hr, "Failed to read size from EvaluateCondition results.");
613
614 hr = BuffReadNumber(rpc.pbData, rpc.cbData, &iBuffer, reinterpret_cast<DWORD*>(&results.f));
615 ExitOnFailure(hr, "Failed to read result from EvaluateCondition results.");
616
617 *pf = results.f;
618
619 LExit:
620 PipeFreeRpcResult(&rpc);
621 ReleaseBuffer(bufferResults);
622 ReleaseBuffer(bufferArgs);
623
624 return hr;
625 }
626
627 virtual STDMETHODIMP Log(
628 __in BOOTSTRAPPER_LOG_LEVEL level,
629 __in_z LPCWSTR wzMessage
630 )
631 {
632 HRESULT hr = S_OK;
633 BAENGINE_LOG_ARGS args = { };
634 BAENGINE_LOG_RESULTS results = { };
635 BUFF_BUFFER bufferArgs = { };
636 BUFF_BUFFER bufferResults = { };
637 PIPE_RPC_RESULT rpc = { };
638
639 // Init send structs.
640 args.dwApiVersion = WIX_5_BOOTSTRAPPER_APPLICATION_API_VERSION;
641 args.level = level;
642 args.wzMessage = wzMessage;
643
644 results.dwApiVersion = WIX_5_BOOTSTRAPPER_APPLICATION_API_VERSION;
645
646 // Send args.
647 hr = BuffWriteNumberToBuffer(&bufferArgs, args.dwApiVersion);
648 ExitOnFailure(hr, "Failed to write API version of Log args.");
649
650 hr = BuffWriteNumberToBuffer(&bufferArgs, args.level);
651 ExitOnFailure(hr, "Failed to write level of Log args.");
652
653 hr = BuffWriteStringToBuffer(&bufferArgs, args.wzMessage);
654 ExitOnFailure(hr, "Failed to write message of Log args.");
655
656 // Send results.
657 hr = BuffWriteNumberToBuffer(&bufferResults, results.dwApiVersion);
658 ExitOnFailure(hr, "Failed to write API version of Log results.");
659
660 // Get results.
661 hr = SendRequest(BOOTSTRAPPER_ENGINE_MESSAGE_LOG, &bufferArgs, &bufferResults, &rpc);
662 ExitOnFailure(hr, "BA Log failed.");
663
664 LExit:
665 PipeFreeRpcResult(&rpc);
666 ReleaseBuffer(bufferResults);
667 ReleaseBuffer(bufferArgs);
668
669 return hr;
670 }
671
672 virtual STDMETHODIMP SendEmbeddedError(
673 __in DWORD dwErrorCode,
674 __in_z_opt LPCWSTR wzMessage,
675 __in DWORD dwUIHint,
676 __out int* pnResult
677 )
678 {
679 HRESULT hr = S_OK;
680 BAENGINE_SENDEMBEDDEDERROR_ARGS args = { };
681 BAENGINE_SENDEMBEDDEDERROR_RESULTS results = { };
682 BUFF_BUFFER bufferArgs = { };
683 BUFF_BUFFER bufferResults = { };
684 PIPE_RPC_RESULT rpc = { };
685 SIZE_T iBuffer = 0;
686
687 ExitOnNull(pnResult, hr, E_INVALIDARG, "pnResult is required");
688
689 // Init send structs.
690 args.dwApiVersion = WIX_5_BOOTSTRAPPER_APPLICATION_API_VERSION;
691 args.dwErrorCode = dwErrorCode;
692 args.wzMessage = wzMessage;
693 args.dwUIHint = dwUIHint;
694
695 results.dwApiVersion = WIX_5_BOOTSTRAPPER_APPLICATION_API_VERSION;
696
697 // Send args.
698 hr = BuffWriteNumberToBuffer(&bufferArgs, args.dwApiVersion);
699 ExitOnFailure(hr, "Failed to write API version of SendEmbeddedError args.");
700
701 hr = BuffWriteNumberToBuffer(&bufferArgs, args.dwErrorCode);
702 ExitOnFailure(hr, "Failed to write error code of SendEmbeddedError args.");
703
704 hr = BuffWriteStringToBuffer(&bufferArgs, args.wzMessage);
705 ExitOnFailure(hr, "Failed to write message of SendEmbeddedError args.");
706
707 hr = BuffWriteNumberToBuffer(&bufferArgs, args.dwUIHint);
708 ExitOnFailure(hr, "Failed to write UI hint of SendEmbeddedError args.");
709
710 // Send results.
711 hr = BuffWriteNumberToBuffer(&bufferResults, results.dwApiVersion);
712 ExitOnFailure(hr, "Failed to write API version of SendEmbeddedError results.");
713
714 // Get results.
715 hr = SendRequest(BOOTSTRAPPER_ENGINE_MESSAGE_SENDEMBEDDEDERROR, &bufferArgs, &bufferResults, &rpc);
716 ExitOnFailure(hr, "BA SendEmbeddedError failed.");
717
718 // Read results.
719 hr = BuffReadNumber(rpc.pbData, rpc.cbData, &iBuffer, &results.dwApiVersion);
720 ExitOnFailure(hr, "Failed to read size from SendEmbeddedError results.");
721
722 hr = BuffReadNumber(rpc.pbData, rpc.cbData, &iBuffer, reinterpret_cast<DWORD*>(&results.nResult));
723 ExitOnFailure(hr, "Failed to read result from SendEmbeddedError results.");
724
725 *pnResult = results.nResult;
726
727 LExit:
728 PipeFreeRpcResult(&rpc);
729 ReleaseBuffer(bufferResults);
730 ReleaseBuffer(bufferArgs);
731
732 return hr;
733 }
734
735 virtual STDMETHODIMP SendEmbeddedProgress(
736 __in DWORD dwProgressPercentage,
737 __in DWORD dwOverallProgressPercentage,
738 __out int* pnResult
739 )
740 {
741 HRESULT hr = S_OK;
742 BAENGINE_SENDEMBEDDEDPROGRESS_ARGS args = { };
743 BAENGINE_SENDEMBEDDEDPROGRESS_RESULTS results = { };
744 BUFF_BUFFER bufferArgs = { };
745 BUFF_BUFFER bufferResults = { };
746 PIPE_RPC_RESULT rpc = { };
747 SIZE_T iBuffer = 0;
748
749 ExitOnNull(pnResult, hr, E_INVALIDARG, "pnResult is required");
750
751 // Init send structs.
752 args.dwApiVersion = WIX_5_BOOTSTRAPPER_APPLICATION_API_VERSION;
753 args.dwProgressPercentage = dwProgressPercentage;
754 args.dwOverallProgressPercentage = dwOverallProgressPercentage;
755
756 results.dwApiVersion = WIX_5_BOOTSTRAPPER_APPLICATION_API_VERSION;
757
758 // Send args.
759 hr = BuffWriteNumberToBuffer(&bufferArgs, args.dwApiVersion);
760 ExitOnFailure(hr, "Failed to write API version of SendEmbeddedProgress args.");
761
762 hr = BuffWriteNumberToBuffer(&bufferArgs, args.dwProgressPercentage);
763 ExitOnFailure(hr, "Failed to write progress of SendEmbeddedProgress args.");
764
765 hr = BuffWriteNumberToBuffer(&bufferArgs, args.dwOverallProgressPercentage);
766 ExitOnFailure(hr, "Failed to write overall progress of SendEmbeddedProgress args.");
767
768 // Send results.
769 hr = BuffWriteNumberToBuffer(&bufferResults, results.dwApiVersion);
770 ExitOnFailure(hr, "Failed to write API version of SendEmbeddedProgress results.");
771
772 // Get results.
773 hr = SendRequest(BOOTSTRAPPER_ENGINE_MESSAGE_SENDEMBEDDEDPROGRESS, &bufferArgs, &bufferResults, &rpc);
774 ExitOnFailure(hr, "BA SendEmbeddedProgress failed.");
775
776 // Read results.
777 hr = BuffReadNumber(rpc.pbData, rpc.cbData, &iBuffer, &results.dwApiVersion);
778 ExitOnFailure(hr, "Failed to read size from SendEmbeddedProgress results.");
779
780 hr = BuffReadNumber(rpc.pbData, rpc.cbData, &iBuffer, reinterpret_cast<DWORD*>(&results.nResult));
781 ExitOnFailure(hr, "Failed to read result from SendEmbeddedProgress results.");
782
783 *pnResult = results.nResult;
784
785 LExit:
786 PipeFreeRpcResult(&rpc);
787 ReleaseBuffer(bufferResults);
788 ReleaseBuffer(bufferArgs);
789
790 return hr;
791 }
792
793 virtual STDMETHODIMP SetUpdate(
794 __in_z_opt LPCWSTR wzLocalSource,
795 __in_z_opt LPCWSTR wzDownloadSource,
796 __in DWORD64 qwSize,
797 __in BOOTSTRAPPER_UPDATE_HASH_TYPE hashType,
798 __in_z_opt LPCWSTR wzHash,
799 __in_z_opt LPCWSTR wzUpdatePackageId
800 )
801 {
802 HRESULT hr = S_OK;
803 BAENGINE_SETUPDATE_ARGS args = { };
804 BAENGINE_SETUPDATE_RESULTS results = { };
805 BUFF_BUFFER bufferArgs = { };
806 BUFF_BUFFER bufferResults = { };
807 PIPE_RPC_RESULT rpc = { };
808
809 // Init send structs.
810 args.dwApiVersion = WIX_5_BOOTSTRAPPER_APPLICATION_API_VERSION;
811 args.wzLocalSource = wzLocalSource;
812 args.wzDownloadSource = wzDownloadSource;
813 args.qwSize = qwSize;
814 args.hashType = hashType;
815 args.wzHash = wzHash;
816 args.wzUpdatePackageId = wzUpdatePackageId;
817
818 results.dwApiVersion = WIX_5_BOOTSTRAPPER_APPLICATION_API_VERSION;
819
820 // Send args.
821 hr = BuffWriteNumberToBuffer(&bufferArgs, args.dwApiVersion);
822 ExitOnFailure(hr, "Failed to write API version of SetUpdate args.");
823
824 hr = BuffWriteStringToBuffer(&bufferArgs, args.wzLocalSource);
825 ExitOnFailure(hr, "Failed to write local source of SetUpdate args.");
826
827 hr = BuffWriteStringToBuffer(&bufferArgs, args.wzDownloadSource);
828 ExitOnFailure(hr, "Failed to write download source of SetUpdate args.");
829
830 hr = BuffWriteNumber64ToBuffer(&bufferArgs, args.qwSize);
831 ExitOnFailure(hr, "Failed to write udpate size of SetUpdate args.");
832
833 hr = BuffWriteNumberToBuffer(&bufferArgs, static_cast<DWORD>(args.hashType));
834 ExitOnFailure(hr, "Failed to write hash type of SetUpdate args.");
835
836 hr = BuffWriteStringToBuffer(&bufferArgs, args.wzHash);
837 ExitOnFailure(hr, "Failed to write hash of SetUpdate args.");
838
839 hr = BuffWriteStringToBuffer(&bufferArgs, args.wzHash);
840 ExitOnFailure(hr, "Failed to write hash of SetUpdate args.");
841
842 hr = BuffWriteStringToBuffer(&bufferArgs, args.wzUpdatePackageId);
843 ExitOnFailure(hr, "Failed to write update package id to SetUpdate args.");
844
845 // Send results.
846 hr = BuffWriteNumberToBuffer(&bufferResults, results.dwApiVersion);
847 ExitOnFailure(hr, "Failed to write API version of SetUpdate results.");
848
849 // Get results.
850 hr = SendRequest(BOOTSTRAPPER_ENGINE_MESSAGE_SETUPDATE, &bufferArgs, &bufferResults, &rpc);
851 ExitOnFailure(hr, "BA SetUpdate failed.");
852
853 LExit:
854 PipeFreeRpcResult(&rpc);
855 ReleaseBuffer(bufferResults);
856 ReleaseBuffer(bufferArgs);
857
858 return hr;
859 }
860
861 virtual STDMETHODIMP SetLocalSource(
862 __in_z LPCWSTR wzPackageOrContainerId,
863 __in_z_opt LPCWSTR wzPayloadId,
864 __in_z LPCWSTR wzPath
865 )
866 {
867 HRESULT hr = S_OK;
868 BAENGINE_SETLOCALSOURCE_ARGS args = { };
869 BAENGINE_SETLOCALSOURCE_RESULTS results = { };
870 BUFF_BUFFER bufferArgs = { };
871 BUFF_BUFFER bufferResults = { };
872 PIPE_RPC_RESULT rpc = { };
873
874 // Init send structs.
875 args.dwApiVersion = WIX_5_BOOTSTRAPPER_APPLICATION_API_VERSION;
876 args.wzPackageOrContainerId = wzPackageOrContainerId;
877 args.wzPayloadId = wzPayloadId;
878 args.wzPath = wzPath;
879
880 results.dwApiVersion = WIX_5_BOOTSTRAPPER_APPLICATION_API_VERSION;
881
882 // Send args.
883 hr = BuffWriteNumberToBuffer(&bufferArgs, args.dwApiVersion);
884 ExitOnFailure(hr, "Failed to write API version of SetLocalSource args.");
885
886 hr = BuffWriteStringToBuffer(&bufferArgs, args.wzPackageOrContainerId);
887 ExitOnFailure(hr, "Failed to write package or container id of SetLocalSource args.");
888
889 hr = BuffWriteStringToBuffer(&bufferArgs, args.wzPayloadId);
890 ExitOnFailure(hr, "Failed to write payload id of SetLocalSource args.");
891
892 hr = BuffWriteStringToBuffer(&bufferArgs, args.wzPath);
893 ExitOnFailure(hr, "Failed to write path of SetLocalSource args.");
894
895 // Send results.
896 hr = BuffWriteNumberToBuffer(&bufferResults, results.dwApiVersion);
897 ExitOnFailure(hr, "Failed to write API version of SetLocalSource results.");
898
899 // Get results.
900 hr = SendRequest(BOOTSTRAPPER_ENGINE_MESSAGE_SETLOCALSOURCE, &bufferArgs, &bufferResults, &rpc);
901 ExitOnFailure(hr, "BA SetLocalSource failed.");
902
903 LExit:
904 PipeFreeRpcResult(&rpc);
905 ReleaseBuffer(bufferResults);
906 ReleaseBuffer(bufferArgs);
907
908 return hr;
909 }
910
911 virtual STDMETHODIMP SetDownloadSource(
912 __in_z LPCWSTR wzPackageOrContainerId,
913 __in_z_opt LPCWSTR wzPayloadId,
914 __in_z LPCWSTR wzUrl,
915 __in_z_opt LPCWSTR wzUser,
916 __in_z_opt LPCWSTR wzPassword,
917 __in_z_opt LPCWSTR wzAuthorizationHeader
918 )
919 {
920 HRESULT hr = S_OK;
921 BAENGINE_SETDOWNLOADSOURCE_ARGS args = { };
922 BAENGINE_SETDOWNLOADSOURCE_RESULTS results = { };
923 BUFF_BUFFER bufferArgs = { };
924 BUFF_BUFFER bufferResults = { };
925 PIPE_RPC_RESULT rpc = { };
926
927 // Init send structs.
928 args.dwApiVersion = WIX_5_BOOTSTRAPPER_APPLICATION_API_VERSION;
929 args.wzPackageOrContainerId = wzPackageOrContainerId;
930 args.wzPayloadId = wzPayloadId;
931 args.wzUrl = wzUrl;
932 args.wzUser = wzUser;
933 args.wzPassword = wzPassword;
934 args.wzAuthorizationHeader = wzAuthorizationHeader;
935
936 results.dwApiVersion = WIX_5_BOOTSTRAPPER_APPLICATION_API_VERSION;
937
938 // Send args.
939 hr = BuffWriteNumberToBuffer(&bufferArgs, args.dwApiVersion);
940 ExitOnFailure(hr, "Failed to write API version of SetDownloadSource args.");
941
942 hr = BuffWriteStringToBuffer(&bufferArgs, args.wzPackageOrContainerId);
943 ExitOnFailure(hr, "Failed to write package or container id of SetDownloadSource args.");
944
945 hr = BuffWriteStringToBuffer(&bufferArgs, args.wzPayloadId);
946 ExitOnFailure(hr, "Failed to write payload id of SetDownloadSource args.");
947
948 hr = BuffWriteStringToBuffer(&bufferArgs, args.wzUrl);
949 ExitOnFailure(hr, "Failed to write url of SetDownloadSource args.");
950
951 hr = BuffWriteStringToBuffer(&bufferArgs, args.wzUser);
952 ExitOnFailure(hr, "Failed to write user of SetDownloadSource args.");
953
954 hr = BuffWriteStringToBuffer(&bufferArgs, args.wzPassword);
955 ExitOnFailure(hr, "Failed to write password of SetDownloadSource args.");
956
957 hr = BuffWriteStringToBuffer(&bufferArgs, args.wzAuthorizationHeader);
958 ExitOnFailure(hr, "Failed to write authorization header of SetDownloadSource args.");
959
960 // Send results.
961 hr = BuffWriteNumberToBuffer(&bufferResults, results.dwApiVersion);
962 ExitOnFailure(hr, "Failed to write API version of SetDownloadSource results.");
963
964 // Get results.
965 hr = SendRequest(BOOTSTRAPPER_ENGINE_MESSAGE_SETDOWNLOADSOURCE, &bufferArgs, &bufferResults, &rpc);
966 ExitOnFailure(hr, "BA SetDownloadSource failed.");
967
968 LExit:
969 PipeFreeRpcResult(&rpc);
970 ReleaseBuffer(bufferResults);
971 ReleaseBuffer(bufferArgs);
972
973 return hr;
974 }
975
976 virtual STDMETHODIMP SetVariableNumeric(
977 __in_z LPCWSTR wzVariable,
978 __in LONGLONG llValue
979 )
980 {
981 HRESULT hr = S_OK;
982 BAENGINE_SETVARIABLENUMERIC_ARGS args = { };
983 BAENGINE_SETVARIABLENUMERIC_RESULTS results = { };
984 BUFF_BUFFER bufferArgs = { };
985 BUFF_BUFFER bufferResults = { };
986 PIPE_RPC_RESULT rpc = { };
987
988 // Init send structs.
989 args.dwApiVersion = WIX_5_BOOTSTRAPPER_APPLICATION_API_VERSION;
990 args.wzVariable = wzVariable;
991 args.llValue = llValue;
992
993 results.dwApiVersion = WIX_5_BOOTSTRAPPER_APPLICATION_API_VERSION;
994
995 // Send args.
996 hr = BuffWriteNumberToBuffer(&bufferArgs, args.dwApiVersion);
997 ExitOnFailure(hr, "Failed to write API version of SetVariableNumeric args.");
998
999 hr = BuffWriteStringToBuffer(&bufferArgs, args.wzVariable);
1000 ExitOnFailure(hr, "Failed to write variable of SetVariableNumeric args.");
1001
1002 hr = BuffWriteNumber64ToBuffer(&bufferArgs, static_cast<DWORD64>(args.llValue));
1003 ExitOnFailure(hr, "Failed to write value of SetVariableNumeric args.");
1004
1005 // Send results.
1006 hr = BuffWriteNumberToBuffer(&bufferResults, results.dwApiVersion);
1007 ExitOnFailure(hr, "Failed to write API version of SetVariableNumeric results.");
1008
1009 // Get results.
1010 hr = SendRequest(BOOTSTRAPPER_ENGINE_MESSAGE_SETVARIABLENUMERIC, &bufferArgs, &bufferResults, &rpc);
1011 ExitOnFailure(hr, "BA SetVariableNumeric failed.");
1012
1013 LExit:
1014 PipeFreeRpcResult(&rpc);
1015 ReleaseBuffer(bufferResults);
1016 ReleaseBuffer(bufferArgs);
1017
1018 return hr;
1019 }
1020
1021 virtual STDMETHODIMP SetVariableString(
1022 __in_z LPCWSTR wzVariable,
1023 __in_z_opt LPCWSTR wzValue,
1024 __in BOOL fFormatted
1025 )
1026 {
1027 HRESULT hr = S_OK;
1028 BAENGINE_SETVARIABLESTRING_ARGS args = { };
1029 BAENGINE_SETVARIABLESTRING_RESULTS results = { };
1030 BUFF_BUFFER bufferArgs = { };
1031 BUFF_BUFFER bufferResults = { };
1032 PIPE_RPC_RESULT rpc = { };
1033
1034 // Init send structs.
1035 args.dwApiVersion = WIX_5_BOOTSTRAPPER_APPLICATION_API_VERSION;
1036 args.wzVariable = wzVariable;
1037 args.wzValue = wzValue;
1038 args.fFormatted = fFormatted;
1039
1040 results.dwApiVersion = WIX_5_BOOTSTRAPPER_APPLICATION_API_VERSION;
1041
1042 // Send args.
1043 hr = BuffWriteNumberToBuffer(&bufferArgs, args.dwApiVersion);
1044 ExitOnFailure(hr, "Failed to write API version of SetVariableString args.");
1045
1046 hr = BuffWriteStringToBuffer(&bufferArgs, args.wzVariable);
1047 ExitOnFailure(hr, "Failed to write variable of SetVariableString args.");
1048
1049 hr = BuffWriteStringToBuffer(&bufferArgs, args.wzValue);
1050 ExitOnFailure(hr, "Failed to write value of SetVariableString args.");
1051
1052 hr = BuffWriteNumberToBuffer(&bufferArgs, args.fFormatted);
1053 ExitOnFailure(hr, "Failed to write formatted flag of SetVariableString args.");
1054
1055 // Send results.
1056 hr = BuffWriteNumberToBuffer(&bufferResults, results.dwApiVersion);
1057 ExitOnFailure(hr, "Failed to write API version of SetVariableString results.");
1058
1059 // Get results.
1060 hr = SendRequest(BOOTSTRAPPER_ENGINE_MESSAGE_SETVARIABLESTRING, &bufferArgs, &bufferResults, &rpc);
1061 ExitOnFailure(hr, "BA SetVariableString failed.");
1062
1063 LExit:
1064 PipeFreeRpcResult(&rpc);
1065 ReleaseBuffer(bufferResults);
1066 ReleaseBuffer(bufferArgs);
1067
1068 return hr;
1069 }
1070
1071 virtual STDMETHODIMP SetVariableVersion(
1072 __in_z LPCWSTR wzVariable,
1073 __in_z_opt LPCWSTR wzValue
1074 )
1075 {
1076 HRESULT hr = S_OK;
1077 BAENGINE_SETVARIABLEVERSION_ARGS args = { };
1078 BAENGINE_SETVARIABLEVERSION_RESULTS results = { };
1079 BUFF_BUFFER bufferArgs = { };
1080 BUFF_BUFFER bufferResults = { };
1081 PIPE_RPC_RESULT rpc = { };
1082
1083 // Init send structs.
1084 args.dwApiVersion = WIX_5_BOOTSTRAPPER_APPLICATION_API_VERSION;
1085 args.wzVariable = wzVariable;
1086 args.wzValue = wzValue;
1087
1088 results.dwApiVersion = WIX_5_BOOTSTRAPPER_APPLICATION_API_VERSION;
1089
1090 // Send args.
1091 hr = BuffWriteNumberToBuffer(&bufferArgs, args.dwApiVersion);
1092 ExitOnFailure(hr, "Failed to write API version of SetVariableVersion args.");
1093
1094 hr = BuffWriteStringToBuffer(&bufferArgs, args.wzVariable);
1095 ExitOnFailure(hr, "Failed to write variable of SetVariableVersion args.");
1096
1097 hr = BuffWriteStringToBuffer(&bufferArgs, args.wzValue);
1098 ExitOnFailure(hr, "Failed to write value of SetVariableVersion args.");
1099
1100 // Send results.
1101 hr = BuffWriteNumberToBuffer(&bufferResults, results.dwApiVersion);
1102 ExitOnFailure(hr, "Failed to write API version of SetVariableVersion results.");
1103
1104 // Get results.
1105 hr = SendRequest(BOOTSTRAPPER_ENGINE_MESSAGE_SETVARIABLEVERSION, &bufferArgs, &bufferResults, &rpc);
1106 ExitOnFailure(hr, "BA SetVariableVersion failed.");
1107
1108 LExit:
1109 PipeFreeRpcResult(&rpc);
1110 ReleaseBuffer(bufferResults);
1111 ReleaseBuffer(bufferArgs);
1112
1113 return hr;
1114 }
1115
1116 virtual STDMETHODIMP CloseSplashScreen()
1117 {
1118 HRESULT hr = S_OK;
1119 BAENGINE_CLOSESPLASHSCREEN_ARGS args = { };
1120 BAENGINE_CLOSESPLASHSCREEN_RESULTS results = { };
1121 BUFF_BUFFER bufferArgs = { };
1122 BUFF_BUFFER bufferResults = { };
1123 PIPE_RPC_RESULT rpc = { };
1124
1125 // Init send structs.
1126 args.dwApiVersion = WIX_5_BOOTSTRAPPER_APPLICATION_API_VERSION;
1127
1128 results.dwApiVersion = WIX_5_BOOTSTRAPPER_APPLICATION_API_VERSION;
1129
1130 // Send args.
1131 hr = BuffWriteNumberToBuffer(&bufferArgs, args.dwApiVersion);
1132 ExitOnFailure(hr, "Failed to write API version of CloseSplashScreen args.");
1133
1134 // Send results.
1135 hr = BuffWriteNumberToBuffer(&bufferResults, results.dwApiVersion);
1136 ExitOnFailure(hr, "Failed to write API version of CloseSplashScreen results.");
1137
1138 // Get results.
1139 hr = SendRequest(BOOTSTRAPPER_ENGINE_MESSAGE_CLOSESPLASHSCREEN, &bufferArgs, &bufferResults, &rpc);
1140 ExitOnFailure(hr, "BA CloseSplashScreen failed.");
1141
1142 LExit:
1143 PipeFreeRpcResult(&rpc);
1144 ReleaseBuffer(bufferResults);
1145 ReleaseBuffer(bufferArgs);
1146
1147 return hr;
1148 }
1149
1150 virtual STDMETHODIMP Detect(
1151 __in_opt HWND hwndParent
1152 )
1153 {
1154 HRESULT hr = S_OK;
1155 BAENGINE_DETECT_ARGS args = { };
1156 BAENGINE_DETECT_RESULTS results = { };
1157 BUFF_BUFFER bufferArgs = { };
1158 BUFF_BUFFER bufferResults = { };
1159 PIPE_RPC_RESULT rpc = { };
1160
1161 // Init send structs.
1162 args.dwApiVersion = WIX_5_BOOTSTRAPPER_APPLICATION_API_VERSION;
1163 args.hwndParent = reinterpret_cast<DWORD64>(hwndParent);
1164
1165 results.dwApiVersion = WIX_5_BOOTSTRAPPER_APPLICATION_API_VERSION;
1166
1167 // Send args.
1168 hr = BuffWriteNumberToBuffer(&bufferArgs, args.dwApiVersion);
1169 ExitOnFailure(hr, "Failed to write API version of Detect args.");
1170
1171 hr = BuffWriteNumber64ToBuffer(&bufferArgs, args.hwndParent);
1172 ExitOnFailure(hr, "Failed to write parent window of Detect args.");
1173
1174 // Send results.
1175 hr = BuffWriteNumberToBuffer(&bufferResults, results.dwApiVersion);
1176 ExitOnFailure(hr, "Failed to write API version of Detect results.");
1177
1178 // Get results.
1179 hr = SendRequest(BOOTSTRAPPER_ENGINE_MESSAGE_DETECT, &bufferArgs, &bufferResults, &rpc);
1180 ExitOnFailure(hr, "BA Detect failed.");
1181
1182 LExit:
1183 PipeFreeRpcResult(&rpc);
1184 ReleaseBuffer(bufferResults);
1185 ReleaseBuffer(bufferArgs);
1186
1187 return hr;
1188 }
1189
1190 virtual STDMETHODIMP Plan(
1191 __in BOOTSTRAPPER_ACTION action
1192 )
1193 {
1194 HRESULT hr = S_OK;
1195 BAENGINE_PLAN_ARGS args = { };
1196 BAENGINE_PLAN_RESULTS results = { };
1197 BUFF_BUFFER bufferArgs = { };
1198 BUFF_BUFFER bufferResults = { };
1199 PIPE_RPC_RESULT rpc = { };
1200
1201 // Init send structs.
1202 args.dwApiVersion = WIX_5_BOOTSTRAPPER_APPLICATION_API_VERSION;
1203 args.action = action;
1204
1205 results.dwApiVersion = WIX_5_BOOTSTRAPPER_APPLICATION_API_VERSION;
1206
1207 // Send args.
1208 hr = BuffWriteNumberToBuffer(&bufferArgs, args.dwApiVersion);
1209 ExitOnFailure(hr, "Failed to write API version of Plan args.");
1210
1211 hr = BuffWriteNumberToBuffer(&bufferArgs, static_cast<DWORD>(args.action));
1212 ExitOnFailure(hr, "Failed to write parent window of Plan args.");
1213
1214 // Send results.
1215 hr = BuffWriteNumberToBuffer(&bufferResults, results.dwApiVersion);
1216 ExitOnFailure(hr, "Failed to write API version of Plan results.");
1217
1218 // Get results.
1219 hr = SendRequest(BOOTSTRAPPER_ENGINE_MESSAGE_PLAN, &bufferArgs, &bufferResults, &rpc);
1220 ExitOnFailure(hr, "BA Plan failed.");
1221
1222 LExit:
1223 PipeFreeRpcResult(&rpc);
1224 ReleaseBuffer(bufferResults);
1225 ReleaseBuffer(bufferArgs);
1226
1227 return hr;
1228 }
1229
1230 virtual STDMETHODIMP Elevate(
1231 __in_opt HWND hwndParent
1232 )
1233 {
1234 HRESULT hr = S_OK;
1235 BAENGINE_ELEVATE_ARGS args = { };
1236 BAENGINE_ELEVATE_RESULTS results = { };
1237 BUFF_BUFFER bufferArgs = { };
1238 BUFF_BUFFER bufferResults = { };
1239 PIPE_RPC_RESULT rpc = { };
1240
1241 // Init send structs.
1242 args.dwApiVersion = WIX_5_BOOTSTRAPPER_APPLICATION_API_VERSION;
1243 args.hwndParent = reinterpret_cast<DWORD64>(hwndParent);
1244
1245 results.dwApiVersion = WIX_5_BOOTSTRAPPER_APPLICATION_API_VERSION;
1246
1247 // Send args.
1248 hr = BuffWriteNumberToBuffer(&bufferArgs, args.dwApiVersion);
1249 ExitOnFailure(hr, "Failed to write API version of Elevate args.");
1250
1251 hr = BuffWriteNumber64ToBuffer(&bufferArgs, args.hwndParent);
1252 ExitOnFailure(hr, "Failed to write parent window of Elevate args.");
1253
1254 // Send results.
1255 hr = BuffWriteNumberToBuffer(&bufferResults, results.dwApiVersion);
1256 ExitOnFailure(hr, "Failed to write API version of Elevate results.");
1257
1258 // Get results.
1259 hr = SendRequest(BOOTSTRAPPER_ENGINE_MESSAGE_ELEVATE, &bufferArgs, &bufferResults, &rpc);
1260 ExitOnFailure(hr, "BA Elevate failed.");
1261
1262 LExit:
1263 PipeFreeRpcResult(&rpc);
1264 ReleaseBuffer(bufferResults);
1265 ReleaseBuffer(bufferArgs);
1266
1267 return hr;
1268 }
1269
1270 virtual STDMETHODIMP Apply(
1271 __in HWND hwndParent
1272 )
1273 {
1274 HRESULT hr = S_OK;
1275 BAENGINE_APPLY_ARGS args = { };
1276 BAENGINE_APPLY_RESULTS results = { };
1277 BUFF_BUFFER bufferArgs = { };
1278 BUFF_BUFFER bufferResults = { };
1279 PIPE_RPC_RESULT rpc = { };
1280
1281 // Init send structs.
1282 args.dwApiVersion = WIX_5_BOOTSTRAPPER_APPLICATION_API_VERSION;
1283 args.hwndParent = reinterpret_cast<DWORD64>(hwndParent);
1284
1285 results.dwApiVersion = WIX_5_BOOTSTRAPPER_APPLICATION_API_VERSION;
1286
1287 // Send args.
1288 hr = BuffWriteNumberToBuffer(&bufferArgs, args.dwApiVersion);
1289 ExitOnFailure(hr, "Failed to write API version of Apply args.");
1290
1291 hr = BuffWriteNumber64ToBuffer(&bufferArgs, args.hwndParent);
1292 ExitOnFailure(hr, "Failed to write parent window of Apply args.");
1293
1294 // Send results.
1295 hr = BuffWriteNumberToBuffer(&bufferResults, results.dwApiVersion);
1296 ExitOnFailure(hr, "Failed to write API version of Apply results.");
1297
1298 // Get results.
1299 hr = SendRequest(BOOTSTRAPPER_ENGINE_MESSAGE_APPLY, &bufferArgs, &bufferResults, &rpc);
1300 ExitOnFailure(hr, "BA Apply failed.");
1301
1302 LExit:
1303 PipeFreeRpcResult(&rpc);
1304 ReleaseBuffer(bufferResults);
1305 ReleaseBuffer(bufferArgs);
1306
1307 return hr;
1308 }
1309
1310 virtual STDMETHODIMP Quit(
1311 __in DWORD dwExitCode
1312 )
1313 {
1314 HRESULT hr = S_OK;
1315 BAENGINE_QUIT_ARGS args = { };
1316 BAENGINE_QUIT_RESULTS results = { };
1317 BUFF_BUFFER bufferArgs = { };
1318 BUFF_BUFFER bufferResults = { };
1319 PIPE_RPC_RESULT rpc = { };
1320
1321 // Init send structs.
1322 args.dwApiVersion = WIX_5_BOOTSTRAPPER_APPLICATION_API_VERSION;
1323 args.dwExitCode = dwExitCode;
1324
1325 results.dwApiVersion = WIX_5_BOOTSTRAPPER_APPLICATION_API_VERSION;
1326
1327 // Send args.
1328 hr = BuffWriteNumberToBuffer(&bufferArgs, args.dwApiVersion);
1329 ExitOnFailure(hr, "Failed to write API version of Quit args.");
1330
1331 hr = BuffWriteNumberToBuffer(&bufferArgs, args.dwExitCode);
1332 ExitOnFailure(hr, "Failed to write exit code of Quit args.");
1333
1334 // Send results.
1335 hr = BuffWriteNumberToBuffer(&bufferResults, results.dwApiVersion);
1336 ExitOnFailure(hr, "Failed to write API version of Quit results.");
1337
1338 // Get results.
1339 hr = SendRequest(BOOTSTRAPPER_ENGINE_MESSAGE_QUIT, &bufferArgs, &bufferResults, &rpc);
1340 ExitOnFailure(hr, "BA Quit failed.");
1341
1342 LExit:
1343 PipeFreeRpcResult(&rpc);
1344 ReleaseBuffer(bufferResults);
1345 ReleaseBuffer(bufferArgs);
1346
1347 return hr;
1348 }
1349
1350 virtual STDMETHODIMP LaunchApprovedExe(
1351 __in_opt HWND hwndParent,
1352 __in_z LPCWSTR wzApprovedExeForElevationId,
1353 __in_z_opt LPCWSTR wzArguments,
1354 __in DWORD dwWaitForInputIdleTimeout
1355 )
1356 {
1357 HRESULT hr = S_OK;
1358 BAENGINE_LAUNCHAPPROVEDEXE_ARGS args = { };
1359 BAENGINE_LAUNCHAPPROVEDEXE_RESULTS results = { };
1360 BUFF_BUFFER bufferArgs = { };
1361 BUFF_BUFFER bufferResults = { };
1362 PIPE_RPC_RESULT rpc = { };
1363
1364 ExitOnNull(wzApprovedExeForElevationId, hr, E_INVALIDARG, "wzApprovedExeForElevationId is required");
1365
1366 // Init send structs.
1367 args.dwApiVersion = WIX_5_BOOTSTRAPPER_APPLICATION_API_VERSION;
1368 args.hwndParent = reinterpret_cast<DWORD64>(hwndParent);
1369 args.wzApprovedExeForElevationId = wzApprovedExeForElevationId;
1370 args.wzArguments = wzArguments;
1371 args.dwWaitForInputIdleTimeout = dwWaitForInputIdleTimeout;
1372
1373 results.dwApiVersion = WIX_5_BOOTSTRAPPER_APPLICATION_API_VERSION;
1374
1375 // Send args.
1376 hr = BuffWriteNumberToBuffer(&bufferArgs, args.dwApiVersion);
1377 ExitOnFailure(hr, "Failed to write API version of LaunchApprovedExe args.");
1378
1379 hr = BuffWriteNumber64ToBuffer(&bufferArgs, args.hwndParent);
1380 ExitOnFailure(hr, "Failed to write parent window of LaunchApprovedExe args.");
1381
1382 hr = BuffWriteStringToBuffer(&bufferArgs, args.wzApprovedExeForElevationId);
1383 ExitOnFailure(hr, "Failed to write approved exe elevation id of LaunchApprovedExe args.");
1384
1385 hr = BuffWriteStringToBuffer(&bufferArgs, args.wzArguments);
1386 ExitOnFailure(hr, "Failed to write arguments of LaunchApprovedExe args.");
1387
1388 hr = BuffWriteNumberToBuffer(&bufferArgs, args.dwWaitForInputIdleTimeout);
1389 ExitOnFailure(hr, "Failed to write wait for idle input timeout of LaunchApprovedExe args.");
1390
1391 // Send results.
1392 hr = BuffWriteNumberToBuffer(&bufferResults, results.dwApiVersion);
1393 ExitOnFailure(hr, "Failed to write API version of LaunchApprovedExe results.");
1394
1395 // Get results.
1396 hr = SendRequest(BOOTSTRAPPER_ENGINE_MESSAGE_LAUNCHAPPROVEDEXE, &bufferArgs, &bufferResults, &rpc);
1397 ExitOnFailure(hr, "BA LaunchApprovedExe failed.");
1398
1399 LExit:
1400 PipeFreeRpcResult(&rpc);
1401 ReleaseBuffer(bufferResults);
1402 ReleaseBuffer(bufferArgs);
1403
1404 return hr;
1405 }
1406
1407 virtual STDMETHODIMP SetUpdateSource(
1408 __in_z LPCWSTR wzUrl,
1409 __in_z_opt LPCWSTR wzAuthorizationHeader
1410 )
1411 {
1412 HRESULT hr = S_OK;
1413 BAENGINE_SETUPDATESOURCE_ARGS args = { };
1414 BAENGINE_SETUPDATESOURCE_RESULTS results = { };
1415 BUFF_BUFFER bufferArgs = { };
1416 BUFF_BUFFER bufferResults = { };
1417 PIPE_RPC_RESULT rpc = { };
1418
1419 ExitOnNull(wzUrl, hr, E_INVALIDARG, "wzUrl is required");
1420
1421 // Init send structs.
1422 args.dwApiVersion = WIX_5_BOOTSTRAPPER_APPLICATION_API_VERSION;
1423 args.wzUrl = wzUrl;
1424 args.wzAuthorizationHeader = wzAuthorizationHeader;
1425
1426 results.dwApiVersion = WIX_5_BOOTSTRAPPER_APPLICATION_API_VERSION;
1427
1428 // Send args.
1429 hr = BuffWriteNumberToBuffer(&bufferArgs, args.dwApiVersion);
1430 ExitOnFailure(hr, "Failed to write API version of SetUpdateSource args.");
1431
1432 hr = BuffWriteStringToBuffer(&bufferArgs, args.wzUrl);
1433 ExitOnFailure(hr, "Failed to write url of SetUpdateSource args.");
1434
1435 hr = BuffWriteStringToBuffer(&bufferArgs, args.wzAuthorizationHeader);
1436 ExitOnFailure(hr, "Failed to write authorization header of SetUpdateSource args.");
1437
1438 // Send results.
1439 hr = BuffWriteNumberToBuffer(&bufferResults, results.dwApiVersion);
1440 ExitOnFailure(hr, "Failed to write API version of SetUpdateSource results.");
1441
1442 // Get results.
1443 hr = SendRequest(BOOTSTRAPPER_ENGINE_MESSAGE_SETUPDATESOURCE, &bufferArgs, &bufferResults, &rpc);
1444 ExitOnFailure(hr, "BA SetUpdateSource failed.");
1445
1446 LExit:
1447 PipeFreeRpcResult(&rpc);
1448 ReleaseBuffer(bufferResults);
1449 ReleaseBuffer(bufferArgs);
1450
1451 return hr;
1452 }
1453
1454 virtual STDMETHODIMP CompareVersions(
1455 __in_z LPCWSTR wzVersion1,
1456 __in_z LPCWSTR wzVersion2,
1457 __out int* pnResult
1458 )
1459 {
1460 HRESULT hr = S_OK;
1461 BAENGINE_COMPAREVERSIONS_ARGS args = { };
1462 BAENGINE_COMPAREVERSIONS_RESULTS results = { };
1463 BUFF_BUFFER bufferArgs = { };
1464 BUFF_BUFFER bufferResults = { };
1465 PIPE_RPC_RESULT rpc = { };
1466 SIZE_T iBuffer = 0;
1467
1468 ExitOnNull(pnResult, hr, E_INVALIDARG, "pnResult is required");
1469
1470 // Init send structs.
1471 args.dwApiVersion = WIX_5_BOOTSTRAPPER_APPLICATION_API_VERSION;
1472 args.wzVersion1 = wzVersion1;
1473 args.wzVersion2 = wzVersion2;
1474
1475 results.dwApiVersion = WIX_5_BOOTSTRAPPER_APPLICATION_API_VERSION;
1476
1477 // Send args.
1478 hr = BuffWriteNumberToBuffer(&bufferArgs, args.dwApiVersion);
1479 ExitOnFailure(hr, "Failed to write API version of CompareVersions args.");
1480
1481 hr = BuffWriteStringToBuffer(&bufferArgs, args.wzVersion1);
1482 ExitOnFailure(hr, "Failed to write first input of CompareVersions args.");
1483
1484 hr = BuffWriteStringToBuffer(&bufferArgs, args.wzVersion2);
1485 ExitOnFailure(hr, "Failed to write second input of CompareVersions args.");
1486
1487 // Send results.
1488 hr = BuffWriteNumberToBuffer(&bufferResults, results.dwApiVersion);
1489 ExitOnFailure(hr, "Failed to write API version of CompareVersions results.");
1490
1491 // Get results.
1492 hr = SendRequest(BOOTSTRAPPER_ENGINE_MESSAGE_COMPAREVERSIONS, &bufferArgs, &bufferResults, &rpc);
1493 ExitOnFailure(hr, "BA CompareVersions failed.");
1494
1495 // Read results.
1496 hr = BuffReadNumber(rpc.pbData, rpc.cbData, &iBuffer, &results.dwApiVersion);
1497 ExitOnFailure(hr, "Failed to read size from CompareVersions results.");
1498
1499 hr = BuffReadNumber(rpc.pbData, rpc.cbData, &iBuffer, reinterpret_cast<DWORD*>(&results.nResult));
1500 ExitOnFailure(hr, "Failed to read result from CompareVersions results.");
1501
1502 *pnResult = results.nResult;
1503
1504 LExit:
1505 PipeFreeRpcResult(&rpc);
1506 ReleaseBuffer(bufferResults);
1507 ReleaseBuffer(bufferArgs);
1508
1509 return hr;
1510 }
1511
1512 private:
1513 HRESULT SendRequest(
1514 __in DWORD dwMessageType,
1515 __in BUFF_BUFFER* pBufferArgs,
1516 __in BUFF_BUFFER* pBufferResults,
1517 __in PIPE_RPC_RESULT* pRpc
1518 )
1519 {
1520 HRESULT hr = S_OK;
1521 BUFF_BUFFER buffer = { };
1522
1523 hr = CombineArgsAndResults(pBufferArgs, pBufferResults, &buffer);
1524 if (SUCCEEDED(hr))
1525 {
1526 hr = PipeRpcRequest(&m_hRpcPipe, dwMessageType, buffer.pbData, buffer.cbData, pRpc);
1527 }
1528
1529 ReleaseBuffer(buffer);
1530 return hr;
1531 }
1532
1533 HRESULT CombineArgsAndResults(
1534 __in BUFF_BUFFER* pBufferArgs,
1535 __in BUFF_BUFFER* pBufferResults,
1536 __in BUFF_BUFFER* pBufferCombined
1537 )
1538 {
1539 HRESULT hr = S_OK;
1540
1541 // Write args to buffer.
1542 hr = BuffWriteStreamToBuffer(pBufferCombined, pBufferArgs->pbData, pBufferArgs->cbData);
1543 ExitOnFailure(hr, "Failed to write args buffer.");
1544
1545 // Write results to buffer.
1546 hr = BuffWriteStreamToBuffer(pBufferCombined, pBufferResults->pbData, pBufferResults->cbData);
1547 ExitOnFailure(hr, "Failed to write results buffer.");
1548
1549 LExit:
1550 return hr;
1551 }
1552
1553 public:
1554 CBalBootstrapperEngine(
1555 __in HANDLE hPipe,
1556 __out HRESULT* phr
1557 )
1558 {
1559 m_cReferences = 1;
1560
1561 PipeRpcInitialize(&m_hRpcPipe, hPipe, FALSE);
1562
1563 *phr = ::CoCreateFreeThreadedMarshaler(this, &m_pFreeThreadedMarshaler);
1564 }
1565
1566 ~CBalBootstrapperEngine()
1567 {
1568 PipeRpcUninitiailize(&m_hRpcPipe);
1569 ReleaseObject(m_pFreeThreadedMarshaler);
1570 }
1571
1572 private:
1573 long m_cReferences;
1574 PIPE_RPC_HANDLE m_hRpcPipe;
1575 IUnknown* m_pFreeThreadedMarshaler;
1576 };
1577
1578
1579 HRESULT BalBootstrapperEngineCreate(
1580 __in HANDLE hPipe,
1581 __out IBootstrapperEngine** ppBootstrapperEngine
1582 )
1583 {
1584 HRESULT hr = S_OK;
1585 CBalBootstrapperEngine* pBootstrapperEngine = NULL;
1586
1587 pBootstrapperEngine = new CBalBootstrapperEngine(hPipe, &hr);
1588 ExitOnNull(pBootstrapperEngine, hr, E_OUTOFMEMORY, "Failed to allocate new BalBootstrapperEngine object.");
1589 ExitOnFailure(hr, "Failed to initialize BalBootstrapperEngine.");
1590
1591 hr = pBootstrapperEngine->QueryInterface(IID_PPV_ARGS(ppBootstrapperEngine));
1592 ExitOnFailure(hr, "Failed to QI for IBootstrapperEngine from BalBootstrapperEngine object.");
1593
1594 LExit:
1595 ReleaseObject(pBootstrapperEngine);
1596 return hr;
1597 }