summaryrefslogtreecommitdiff
path: root/src/burn/engine/engine.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/burn/engine/engine.cpp')
-rw-r--r--src/burn/engine/engine.cpp243
1 files changed, 74 insertions, 169 deletions
diff --git a/src/burn/engine/engine.cpp b/src/burn/engine/engine.cpp
index f5ea5332..9daa18a1 100644
--- a/src/burn/engine/engine.cpp
+++ b/src/burn/engine/engine.cpp
@@ -16,9 +16,11 @@ static HRESULT InitializeEngineState(
16static void UninitializeEngineState( 16static void UninitializeEngineState(
17 __in BURN_ENGINE_STATE* pEngineState 17 __in BURN_ENGINE_STATE* pEngineState
18 ); 18 );
19#if 0
19static HRESULT RunUntrusted( 20static HRESULT RunUntrusted(
20 __in BURN_ENGINE_STATE* pEngineState 21 __in BURN_ENGINE_STATE* pEngineState
21 ); 22 );
23#endif
22static HRESULT RunNormal( 24static HRESULT RunNormal(
23 __in HINSTANCE hInstance, 25 __in HINSTANCE hInstance,
24 __in BURN_ENGINE_STATE* pEngineState 26 __in BURN_ENGINE_STATE* pEngineState
@@ -38,12 +40,13 @@ static HRESULT RunRunOnce(
38 ); 40 );
39static HRESULT RunApplication( 41static HRESULT RunApplication(
40 __in BURN_ENGINE_STATE* pEngineState, 42 __in BURN_ENGINE_STATE* pEngineState,
43 __in BOOL fSecondaryBootstrapperApplication,
41 __out BOOL* pfReloadApp, 44 __out BOOL* pfReloadApp,
42 __out BOOL* pfSkipCleanup 45 __out BOOL* pfSkipCleanup
43 ); 46 );
44static HRESULT ProcessMessage( 47static HRESULT ProcessMessage(
45 __in BOOTSTRAPPER_ENGINE_CONTEXT* pEngineContext, 48 __in BAENGINE_CONTEXT* pEngineContext,
46 __in BOOTSTRAPPER_ENGINE_ACTION* pAction 49 __in BAENGINE_ACTION* pAction
47 ); 50 );
48static HRESULT DAPI RedirectLoggingOverPipe( 51static HRESULT DAPI RedirectLoggingOverPipe(
49 __in_z LPCSTR szString, 52 __in_z LPCSTR szString,
@@ -72,28 +75,6 @@ static void CALLBACK BurnTraceError(
72 75
73// function definitions 76// function definitions
74 77
75extern "C" BOOL EngineInCleanRoom(
76 __in_z_opt LPCWSTR wzCommandLine
77 )
78{
79 // Be very careful with the functions you call from here.
80 // This function will be called before ::SetDefaultDllDirectories()
81 // has been called so dependencies outside of kernel32.dll are
82 // very likely to introduce DLL hijacking opportunities.
83
84 static DWORD cchCleanRoomSwitch = lstrlenW(BURN_COMMANDLINE_SWITCH_CLEAN_ROOM);
85
86 // This check is wholly dependent on the clean room command line switch being
87 // present at the beginning of the command line. Since Burn is the only thing
88 // that should be setting this command line option, that is in our control.
89 BOOL fInCleanRoom = (wzCommandLine &&
90 (wzCommandLine[0] == L'-' || wzCommandLine[0] == L'/') &&
91 CSTR_EQUAL == ::CompareStringW(LOCALE_INVARIANT, NORM_IGNORECASE, wzCommandLine + 1, cchCleanRoomSwitch, BURN_COMMANDLINE_SWITCH_CLEAN_ROOM, cchCleanRoomSwitch)
92 );
93
94 return fInCleanRoom;
95}
96
97extern "C" HRESULT EngineRun( 78extern "C" HRESULT EngineRun(
98 __in HINSTANCE hInstance, 79 __in HINSTANCE hInstance,
99 __in HANDLE hEngineFile, 80 __in HANDLE hEngineFile,
@@ -113,7 +94,6 @@ extern "C" HRESULT EngineRun(
113 SYSTEM_INFO si = { }; 94 SYSTEM_INFO si = { };
114 RTL_OSVERSIONINFOEXW ovix = { }; 95 RTL_OSVERSIONINFOEXW ovix = { };
115 LPWSTR sczExePath = NULL; 96 LPWSTR sczExePath = NULL;
116 BOOL fRunUntrusted = FALSE;
117 BOOL fRunNormal = FALSE; 97 BOOL fRunNormal = FALSE;
118 BOOL fRunElevated = FALSE; 98 BOOL fRunElevated = FALSE;
119 BOOL fRunRunOnce = FALSE; 99 BOOL fRunRunOnce = FALSE;
@@ -214,25 +194,18 @@ extern "C" HRESULT EngineRun(
214 // Select run mode. 194 // Select run mode.
215 switch (engineState.internalCommand.mode) 195 switch (engineState.internalCommand.mode)
216 { 196 {
217 case BURN_MODE_UNTRUSTED:
218 fRunUntrusted = TRUE;
219
220 hr = RunUntrusted(&engineState);
221 ExitOnFailure(hr, "Failed to run untrusted mode.");
222 break;
223
224 case BURN_MODE_NORMAL: 197 case BURN_MODE_NORMAL:
225 fRunNormal = TRUE; 198 fRunNormal = TRUE;
226 199
227 hr = RunNormal(hInstance, &engineState); 200 hr = RunNormal(hInstance, &engineState);
228 ExitOnFailure(hr, "Failed to run per-user mode."); 201 ExitOnFailure(hr, "Failed to run normal mode.");
229 break; 202 break;
230 203
231 case BURN_MODE_ELEVATED: 204 case BURN_MODE_ELEVATED:
232 fRunElevated = TRUE; 205 fRunElevated = TRUE;
233 206
234 hr = RunElevated(hInstance, wzCommandLine, &engineState); 207 hr = RunElevated(hInstance, wzCommandLine, &engineState);
235 ExitOnFailure(hr, "Failed to run per-machine mode."); 208 ExitOnFailure(hr, "Failed to run elevated mode.");
236 break; 209 break;
237 210
238 case BURN_MODE_EMBEDDED: 211 case BURN_MODE_EMBEDDED:
@@ -266,7 +239,7 @@ LExit:
266 LoggingOpenFailed(); 239 LoggingOpenFailed();
267 } 240 }
268 241
269 UserExperienceRemove(&engineState.userExperience); 242 BootstrapperApplicationRemove(&engineState.userExperience);
270 243
271 CacheRemoveBaseWorkingFolder(&engineState.cache); 244 CacheRemoveBaseWorkingFolder(&engineState.cache);
272 CacheUninitialize(&engineState.cache); 245 CacheUninitialize(&engineState.cache);
@@ -284,10 +257,6 @@ LExit:
284 { 257 {
285 LogId(REPORT_STANDARD, MSG_EXITING, FAILED(hr) ? (int)hr : *pdwExitCode, LoggingBoolToString(engineState.fRestart)); 258 LogId(REPORT_STANDARD, MSG_EXITING, FAILED(hr) ? (int)hr : *pdwExitCode, LoggingBoolToString(engineState.fRestart));
286 } 259 }
287 else if (fRunUntrusted)
288 {
289 LogId(REPORT_STANDARD, MSG_EXITING_CLEAN_ROOM, FAILED(hr) ? (int)hr : *pdwExitCode);
290 }
291 else if (fRunRunOnce) 260 else if (fRunRunOnce)
292 { 261 {
293 LogId(REPORT_STANDARD, MSG_EXITING_RUN_ONCE, FAILED(hr) ? (int)hr : *pdwExitCode); 262 LogId(REPORT_STANDARD, MSG_EXITING_RUN_ONCE, FAILED(hr) ? (int)hr : *pdwExitCode);
@@ -452,7 +421,7 @@ static void UninitializeEngineState(
452 BurnExtensionUninitialize(&pEngineState->extensions); 421 BurnExtensionUninitialize(&pEngineState->extensions);
453 422
454 ::DeleteCriticalSection(&pEngineState->userExperience.csEngineActive); 423 ::DeleteCriticalSection(&pEngineState->userExperience.csEngineActive);
455 UserExperienceUninitialize(&pEngineState->userExperience); 424 BootstrapperApplicationUninitialize(&pEngineState->userExperience);
456 425
457 ApprovedExesUninitialize(&pEngineState->approvedExes); 426 ApprovedExesUninitialize(&pEngineState->approvedExes);
458 DependencyUninitialize(&pEngineState->dependencies); 427 DependencyUninitialize(&pEngineState->dependencies);
@@ -475,7 +444,6 @@ static void UninitializeEngineState(
475 ReleaseStr(pEngineState->internalCommand.sczIgnoreDependencies); 444 ReleaseStr(pEngineState->internalCommand.sczIgnoreDependencies);
476 ReleaseStr(pEngineState->internalCommand.sczLogFile); 445 ReleaseStr(pEngineState->internalCommand.sczLogFile);
477 ReleaseStr(pEngineState->internalCommand.sczOriginalSource); 446 ReleaseStr(pEngineState->internalCommand.sczOriginalSource);
478 ReleaseStr(pEngineState->internalCommand.sczSourceProcessPath);
479 ReleaseStr(pEngineState->internalCommand.sczEngineWorkingDirectory); 447 ReleaseStr(pEngineState->internalCommand.sczEngineWorkingDirectory);
480 448
481 ReleaseStr(pEngineState->log.sczExtension); 449 ReleaseStr(pEngineState->log.sczExtension);
@@ -489,82 +457,6 @@ static void UninitializeEngineState(
489 memset(pEngineState, 0, sizeof(BURN_ENGINE_STATE)); 457 memset(pEngineState, 0, sizeof(BURN_ENGINE_STATE));
490} 458}
491 459
492static HRESULT RunUntrusted(
493 __in BURN_ENGINE_STATE* pEngineState
494 )
495{
496 HRESULT hr = S_OK;
497 LPWSTR sczCurrentProcessPath = NULL;
498 LPWSTR wzCleanRoomBundlePath = NULL;
499 LPWSTR sczCachedCleanRoomBundlePath = NULL;
500 LPWSTR sczParameters = NULL;
501 LPWSTR sczFullCommandLine = NULL;
502 PROCESS_INFORMATION pi = { };
503 HANDLE hFileAttached = NULL;
504 HANDLE hFileSelf = NULL;
505 HANDLE hProcess = NULL;
506
507 // Initialize logging.
508 hr = LoggingOpen(&pEngineState->log, &pEngineState->internalCommand, &pEngineState->command, &pEngineState->variables, pEngineState->registration.sczDisplayName);
509 ExitOnFailure(hr, "Failed to open clean room log.");
510
511 hr = PathForCurrentProcess(&sczCurrentProcessPath, NULL);
512 ExitOnFailure(hr, "Failed to get path for current process.");
513
514 // If we're running from the package cache, we're in a secure
515 // folder (DLLs cannot be inserted here for hijacking purposes)
516 // so just launch the current process's path as the clean room
517 // process. Technically speaking, we'd be able to skip creating
518 // a clean room process at all (since we're already running from
519 // a secure folder) but it makes the code that only wants to run
520 // in clean room more complicated if we don't launch an explicit
521 // clean room process.
522 if (CacheBundleRunningFromCache(&pEngineState->cache))
523 {
524 wzCleanRoomBundlePath = sczCurrentProcessPath;
525 }
526 else
527 {
528 hr = CacheBundleToCleanRoom(&pEngineState->cache, &pEngineState->section, &sczCachedCleanRoomBundlePath);
529 ExitOnFailure(hr, "Failed to cache to clean room.");
530
531 wzCleanRoomBundlePath = sczCachedCleanRoomBundlePath;
532 }
533
534 hr = CoreCreateCleanRoomCommandLine(&sczParameters, pEngineState, wzCleanRoomBundlePath, sczCurrentProcessPath, &hFileAttached, &hFileSelf);
535 ExitOnFailure(hr, "Failed to create clean room command-line.");
536
537 hr = StrAllocFormattedSecure(&sczFullCommandLine, L"\"%ls\" %ls", wzCleanRoomBundlePath, sczParameters);
538 ExitOnFailure(hr, "Failed to allocate full command-line.");
539
540 hr = CoreCreateProcess(wzCleanRoomBundlePath, sczFullCommandLine, TRUE, 0, NULL, static_cast<WORD>(pEngineState->command.nCmdShow), &pi);
541 ExitOnFailure(hr, "Failed to launch clean room process: %ls", sczFullCommandLine);
542
543 hProcess = pi.hProcess;
544 pi.hProcess = NULL;
545
546 hr = ProcWaitForCompletion(hProcess, INFINITE, &pEngineState->userExperience.dwExitCode);
547 ExitOnFailure(hr, "Failed to wait for clean room process: %ls", wzCleanRoomBundlePath);
548
549LExit:
550 // If the splash screen is still around, close it.
551 if (::IsWindow(pEngineState->command.hwndSplashScreen))
552 {
553 ::PostMessageW(pEngineState->command.hwndSplashScreen, WM_CLOSE, 0, 0);
554 }
555
556 ReleaseHandle(pi.hThread);
557 ReleaseFileHandle(hFileSelf);
558 ReleaseFileHandle(hFileAttached);
559 ReleaseHandle(hProcess);
560 StrSecureZeroFreeString(sczFullCommandLine);
561 StrSecureZeroFreeString(sczParameters);
562 ReleaseStr(sczCachedCleanRoomBundlePath);
563 ReleaseStr(sczCurrentProcessPath);
564
565 return hr;
566}
567
568static HRESULT RunNormal( 460static HRESULT RunNormal(
569 __in HINSTANCE hInstance, 461 __in HINSTANCE hInstance,
570 __in BURN_ENGINE_STATE* pEngineState 462 __in BURN_ENGINE_STATE* pEngineState
@@ -574,9 +466,10 @@ static HRESULT RunNormal(
574 LPWSTR sczOriginalSource = NULL; 466 LPWSTR sczOriginalSource = NULL;
575 LPWSTR sczCopiedOriginalSource = NULL; 467 LPWSTR sczCopiedOriginalSource = NULL;
576 BOOL fContinueExecution = TRUE; 468 BOOL fContinueExecution = TRUE;
577 BOOL fReloadApp = FALSE; 469 BOOL fReloadApp = TRUE;
578 BOOL fSkipCleanup = FALSE; 470 BOOL fSkipCleanup = FALSE;
579 BURN_EXTENSION_ENGINE_CONTEXT extensionEngineContext = { }; 471 BURN_EXTENSION_ENGINE_CONTEXT extensionEngineContext = { };
472 BOOL fRunSecondaryBootstrapperApplication = FALSE;
580 473
581 // Initialize logging. 474 // Initialize logging.
582 hr = LoggingOpen(&pEngineState->log, &pEngineState->internalCommand, &pEngineState->command, &pEngineState->variables, pEngineState->registration.sczDisplayName); 475 hr = LoggingOpen(&pEngineState->log, &pEngineState->internalCommand, &pEngineState->command, &pEngineState->variables, pEngineState->registration.sczDisplayName);
@@ -644,14 +537,27 @@ static HRESULT RunNormal(
644 hr = BurnExtensionLoad(&pEngineState->extensions, &extensionEngineContext); 537 hr = BurnExtensionLoad(&pEngineState->extensions, &extensionEngineContext);
645 ExitOnFailure(hr, "Failed to load BundleExtensions."); 538 ExitOnFailure(hr, "Failed to load BundleExtensions.");
646 539
647 do 540 // The secondary bootstrapper application only gets one chance to execute. That means
541 // first time through we run the primary bootstrapper application and on reload we run
542 // the secondary bootstrapper application, and if the secondary bootstrapper application
543 // requests a reload, we load the primary bootstrapper application one last time.
544 for (DWORD i = 0; i < 3 && fReloadApp; i++)
648 { 545 {
649 fReloadApp = FALSE; 546 fReloadApp = FALSE;
650 pEngineState->fQuit = FALSE; 547 pEngineState->fQuit = FALSE;
651 548
652 hr = RunApplication(pEngineState, &fReloadApp, &fSkipCleanup); 549 hr = RunApplication(pEngineState, fRunSecondaryBootstrapperApplication, &fReloadApp, &fSkipCleanup);
653 ExitOnFailure(hr, "Failed while running "); 550
654 } while (fReloadApp); 551 // If reloading, switch to the other bootstrapper application.
552 if (fReloadApp)
553 {
554 fRunSecondaryBootstrapperApplication = !fRunSecondaryBootstrapperApplication;
555 }
556 else if (FAILED(hr))
557 {
558 break;
559 }
560 }
655 561
656LExit: 562LExit:
657 if (!fSkipCleanup) 563 if (!fSkipCleanup)
@@ -790,73 +696,64 @@ LExit:
790 return hr; 696 return hr;
791} 697}
792 698
793static void CALLBACK FreeQueueItem(
794 __in void* pvValue,
795 __in void* /*pvContext*/
796 )
797{
798 BOOTSTRAPPER_ENGINE_ACTION* pAction = reinterpret_cast<BOOTSTRAPPER_ENGINE_ACTION*>(pvValue);
799
800 LogId(REPORT_WARNING, MSG_IGNORE_OPERATION_AFTER_QUIT, LoggingBurnMessageToString(pAction->dwMessage));
801
802 CoreBootstrapperEngineActionUninitialize(pAction);
803 MemFree(pAction);
804}
805
806static HRESULT RunApplication( 699static HRESULT RunApplication(
807 __in BURN_ENGINE_STATE* pEngineState, 700 __in BURN_ENGINE_STATE* pEngineState,
701 __in BOOL fSecondaryBootstrapperApplication,
808 __out BOOL* pfReloadApp, 702 __out BOOL* pfReloadApp,
809 __out BOOL* pfSkipCleanup 703 __out BOOL* pfSkipCleanup
810 ) 704 )
811{ 705{
812 HRESULT hr = S_OK; 706 HRESULT hr = S_OK;
813 BOOTSTRAPPER_ENGINE_CONTEXT engineContext = { };
814 BOOL fStartupCalled = FALSE; 707 BOOL fStartupCalled = FALSE;
708 BAENGINE_CONTEXT* pEngineContext = NULL;
709 HANDLE rghWait[2] = { };
710 DWORD dwSignaled = 0;
711 BAENGINE_ACTION* pAction = NULL;
815 BOOTSTRAPPER_SHUTDOWN_ACTION shutdownAction = BOOTSTRAPPER_SHUTDOWN_ACTION_NONE; 712 BOOTSTRAPPER_SHUTDOWN_ACTION shutdownAction = BOOTSTRAPPER_SHUTDOWN_ACTION_NONE;
816 BOOTSTRAPPER_ENGINE_ACTION* pAction = NULL;
817
818 // Setup the bootstrapper engine.
819 engineContext.pEngineState = pEngineState;
820 713
821 ::InitializeCriticalSection(&engineContext.csQueue); 714 // Start the bootstrapper application.
822 715 hr = BootstrapperApplicationStart(pEngineState, fSecondaryBootstrapperApplication);
823 engineContext.hQueueSemaphore = ::CreateSemaphoreW(NULL, 0, LONG_MAX, NULL); 716 ExitOnFailure(hr, "Failed to start bootstrapper application.");
824 ExitOnNullWithLastError(engineContext.hQueueSemaphore, hr, "Failed to create semaphore for queue.");
825
826 hr = QueCreate(&engineContext.hQueue);
827 ExitOnFailure(hr, "Failed to create queue for bootstrapper engine.");
828 717
829 // Load the bootstrapper application. 718 pEngineContext = pEngineState->userExperience.pEngineContext;
830 hr = UserExperienceLoad(&pEngineState->userExperience, &engineContext, &pEngineState->command);
831 ExitOnFailure(hr, "Failed to load BA.");
832 719
833 fStartupCalled = TRUE; 720 fStartupCalled = TRUE;
834 hr = UserExperienceOnStartup(&pEngineState->userExperience); 721 hr = BACallbackOnStartup(&pEngineState->userExperience);
835 ExitOnFailure(hr, "Failed to start bootstrapper application."); 722 ExitOnFailure(hr, "Failed to start bootstrapper application.");
836 723
724 rghWait[0] = pEngineState->userExperience.hBAProcess;
725 rghWait[1] = pEngineContext->hQueueSemaphore;
726
837 while (!pEngineState->fQuit) 727 while (!pEngineState->fQuit)
838 { 728 {
839 hr = AppWaitForSingleObject(engineContext.hQueueSemaphore, INFINITE); 729 hr = AppWaitForMultipleObjects(countof(rghWait), rghWait, FALSE, INFINITE, &dwSignaled);
840 ExitOnFailure(hr, "Failed to wait on queue event."); 730 ExitOnFailure(hr, "Failed to wait on queue event.");
841 731
842 ::EnterCriticalSection(&engineContext.csQueue); 732 // If the bootstrapper application process exited, bail.
733 if (0 == dwSignaled)
734 {
735 pEngineState->fQuit = TRUE;
736 break;
737 }
738
739 ::EnterCriticalSection(&pEngineContext->csQueue);
843 740
844 hr = QueDequeue(engineContext.hQueue, reinterpret_cast<void**>(&pAction)); 741 hr = QueDequeue(pEngineContext->hQueue, reinterpret_cast<void**>(&pAction));
845 742
846 ::LeaveCriticalSection(&engineContext.csQueue); 743 ::LeaveCriticalSection(&pEngineContext->csQueue);
847 744
848 ExitOnFailure(hr, "Failed to dequeue action."); 745 ExitOnFailure(hr, "Failed to dequeue action.");
849 746
850 ProcessMessage(&engineContext, pAction); 747 ProcessMessage(pEngineContext, pAction);
851 748
852 CoreBootstrapperEngineActionUninitialize(pAction); 749 BAEngineFreeAction(pAction);
853 MemFree(pAction); 750 pAction = NULL;
854 } 751 }
855 752
856LExit: 753LExit:
857 if (fStartupCalled) 754 if (fStartupCalled)
858 { 755 {
859 UserExperienceOnShutdown(&pEngineState->userExperience, &shutdownAction); 756 BACallbackOnShutdown(&pEngineState->userExperience, &shutdownAction);
860 if (BOOTSTRAPPER_SHUTDOWN_ACTION_RESTART == shutdownAction) 757 if (BOOTSTRAPPER_SHUTDOWN_ACTION_RESTART == shutdownAction)
861 { 758 {
862 LogId(REPORT_STANDARD, MSG_BA_REQUESTED_RESTART, LoggingBoolToString(pEngineState->fRestart)); 759 LogId(REPORT_STANDARD, MSG_BA_REQUESTED_RESTART, LoggingBoolToString(pEngineState->fRestart));
@@ -873,26 +770,34 @@ LExit:
873 *pfSkipCleanup = TRUE; 770 *pfSkipCleanup = TRUE;
874 } 771 }
875 } 772 }
773 else // if the bootstrapper application did not start, there won't be anything to clean up.
774 {
775 *pfSkipCleanup = TRUE;
776 }
876 777
877 // Unload BA. 778 // Stop the BA.
878 UserExperienceUnload(&pEngineState->userExperience, *pfReloadApp); 779 BootstrapperApplicationStop(&pEngineState->userExperience, pfReloadApp);
879 780
880 ::DeleteCriticalSection(&engineContext.csQueue); 781 if (*pfReloadApp && !pEngineState->userExperience.pSecondaryExePayload)
881 ReleaseHandle(engineContext.hQueueSemaphore); 782 {
882 ReleaseQueue(engineContext.hQueue, FreeQueueItem, &engineContext); 783 // If the BA requested a reload but we do not have a secondary EXE,
784 // then log a message and do not reload.
785 LogId(REPORT_STANDARD, MSG_BA_NO_SECONDARY_BOOSTRAPPER_SO_RELOAD_NOT_SUPPORTED);
786 *pfReloadApp = FALSE;
787 }
883 788
884 return hr; 789 return hr;
885} 790}
886 791
887static HRESULT ProcessMessage( 792static HRESULT ProcessMessage(
888 __in BOOTSTRAPPER_ENGINE_CONTEXT* pEngineContext, 793 __in BAENGINE_CONTEXT* pEngineContext,
889 __in BOOTSTRAPPER_ENGINE_ACTION* pAction 794 __in BAENGINE_ACTION* pAction
890 ) 795 )
891{ 796{
892 HRESULT hr = S_OK; 797 HRESULT hr = S_OK;
893 BURN_ENGINE_STATE* pEngineState = pEngineContext->pEngineState; 798 BURN_ENGINE_STATE* pEngineState = pEngineContext->pEngineState;
894 799
895 UserExperienceActivateEngine(&pEngineState->userExperience); 800 BootstrapperApplicationActivateEngine(&pEngineState->userExperience);
896 801
897 switch (pAction->dwMessage) 802 switch (pAction->dwMessage)
898 { 803 {
@@ -921,7 +826,7 @@ static HRESULT ProcessMessage(
921 break; 826 break;
922 } 827 }
923 828
924 UserExperienceDeactivateEngine(&pEngineState->userExperience); 829 BootstrapperApplicationDeactivateEngine(&pEngineState->userExperience);
925 830
926 return hr; 831 return hr;
927} 832}
@@ -971,7 +876,7 @@ static HRESULT LogStringOverPipe(
971 hr = (HRESULT)dwResult; 876 hr = (HRESULT)dwResult;
972 877
973LExit: 878LExit:
974 ReleaseBuffer(pbData); 879 ReleaseMem(pbData);
975 880
976 return hr; 881 return hr;
977} 882}