diff options
Diffstat (limited to '')
55 files changed, 500 insertions, 493 deletions
diff --git a/src/api/burn/WixToolset.BootstrapperCore.Native/inc/BootstrapperApplication.h b/src/api/burn/WixToolset.BootstrapperCore.Native/inc/BootstrapperApplication.h index 228cb6ff..ea3be214 100644 --- a/src/api/burn/WixToolset.BootstrapperCore.Native/inc/BootstrapperApplication.h +++ b/src/api/burn/WixToolset.BootstrapperCore.Native/inc/BootstrapperApplication.h | |||
| @@ -1494,7 +1494,22 @@ extern "C" typedef HRESULT(WINAPI *PFN_BOOTSTRAPPER_APPLICATION_PROC)( | |||
| 1494 | __in_opt LPVOID pvContext | 1494 | __in_opt LPVOID pvContext |
| 1495 | ); | 1495 | ); |
| 1496 | 1496 | ||
| 1497 | extern "C" typedef void (WINAPI *PFN_BOOTSTRAPPER_APPLICATION_DESTROY)(); | 1497 | struct BOOTSTRAPPER_DESTROY_ARGS |
| 1498 | { | ||
| 1499 | DWORD cbSize; | ||
| 1500 | BOOL fReload; | ||
| 1501 | }; | ||
| 1502 | |||
| 1503 | struct BOOTSTRAPPER_DESTROY_RESULTS | ||
| 1504 | { | ||
| 1505 | DWORD cbSize; | ||
| 1506 | BOOL fDisableUnloading; // indicates the BA dll must not be unloaded after BootstrapperApplicationDestroy. | ||
| 1507 | }; | ||
| 1508 | |||
| 1509 | extern "C" typedef void (WINAPI *PFN_BOOTSTRAPPER_APPLICATION_DESTROY)( | ||
| 1510 | __in const BOOTSTRAPPER_DESTROY_ARGS* pArgs, | ||
| 1511 | __inout BOOTSTRAPPER_DESTROY_RESULTS* pResults | ||
| 1512 | ); | ||
| 1498 | 1513 | ||
| 1499 | 1514 | ||
| 1500 | 1515 | ||
| @@ -1512,7 +1527,6 @@ struct BOOTSTRAPPER_CREATE_RESULTS | |||
| 1512 | DWORD cbSize; | 1527 | DWORD cbSize; |
| 1513 | PFN_BOOTSTRAPPER_APPLICATION_PROC pfnBootstrapperApplicationProc; | 1528 | PFN_BOOTSTRAPPER_APPLICATION_PROC pfnBootstrapperApplicationProc; |
| 1514 | LPVOID pvBootstrapperApplicationProcContext; | 1529 | LPVOID pvBootstrapperApplicationProcContext; |
| 1515 | BOOL fDisableUnloading; // indicates the BA dll must not be unloaded after BootstrapperApplicationDestroy. | ||
| 1516 | }; | 1530 | }; |
| 1517 | 1531 | ||
| 1518 | extern "C" typedef HRESULT(WINAPI *PFN_BOOTSTRAPPER_APPLICATION_CREATE)( | 1532 | extern "C" typedef HRESULT(WINAPI *PFN_BOOTSTRAPPER_APPLICATION_CREATE)( |
diff --git a/src/api/burn/balutil/inc/BAFunctions.h b/src/api/burn/balutil/inc/BAFunctions.h index c1057ab6..b23dd02e 100644 --- a/src/api/burn/balutil/inc/BAFunctions.h +++ b/src/api/burn/balutil/inc/BAFunctions.h | |||
| @@ -126,6 +126,18 @@ struct BA_FUNCTIONS_CREATE_RESULTS | |||
| 126 | LPVOID pvBAFunctionsProcContext; | 126 | LPVOID pvBAFunctionsProcContext; |
| 127 | }; | 127 | }; |
| 128 | 128 | ||
| 129 | struct BA_FUNCTIONS_DESTROY_ARGS | ||
| 130 | { | ||
| 131 | DWORD cbSize; | ||
| 132 | BOOL fReload; | ||
| 133 | }; | ||
| 134 | |||
| 135 | struct BA_FUNCTIONS_DESTROY_RESULTS | ||
| 136 | { | ||
| 137 | DWORD cbSize; | ||
| 138 | BOOL fDisableUnloading; // indicates the BAFunctions dll must not be unloaded after BAFunctionsDestroy. | ||
| 139 | }; | ||
| 140 | |||
| 129 | struct BA_FUNCTIONS_ONTHEMECONTROLLOADED_ARGS | 141 | struct BA_FUNCTIONS_ONTHEMECONTROLLOADED_ARGS |
| 130 | { | 142 | { |
| 131 | DWORD cbSize; | 143 | DWORD cbSize; |
| @@ -218,7 +230,10 @@ typedef HRESULT(WINAPI *PFN_BA_FUNCTIONS_CREATE)( | |||
| 218 | __inout BA_FUNCTIONS_CREATE_RESULTS* pResults | 230 | __inout BA_FUNCTIONS_CREATE_RESULTS* pResults |
| 219 | ); | 231 | ); |
| 220 | 232 | ||
| 221 | typedef void (WINAPI *PFN_BA_FUNCTIONS_DESTROY)(); | 233 | typedef void (WINAPI *PFN_BA_FUNCTIONS_DESTROY)( |
| 234 | __in const BA_FUNCTIONS_DESTROY_ARGS* pArgs, | ||
| 235 | __inout BA_FUNCTIONS_DESTROY_RESULTS* pResults | ||
| 236 | ); | ||
| 222 | 237 | ||
| 223 | #ifdef __cplusplus | 238 | #ifdef __cplusplus |
| 224 | } | 239 | } |
diff --git a/src/api/burn/balutil/inc/balutil.h b/src/api/burn/balutil/inc/balutil.h index 2e370db7..33f1a6de 100644 --- a/src/api/burn/balutil/inc/balutil.h +++ b/src/api/burn/balutil/inc/balutil.h | |||
| @@ -39,6 +39,7 @@ static const HRESULT E_WIXSTDBA_CONDITION_FAILED = MAKE_HRESULT(SEVERITY_ERROR, | |||
| 39 | 39 | ||
| 40 | static const HRESULT E_MBAHOST_NET452_ON_WIN7RTM = MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIX, 1000); | 40 | static const HRESULT E_MBAHOST_NET452_ON_WIN7RTM = MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIX, 1000); |
| 41 | static const HRESULT E_DNCHOST_SCD_RUNTIME_FAILURE = MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIX, 1001); | 41 | static const HRESULT E_DNCHOST_SCD_RUNTIME_FAILURE = MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIX, 1001); |
| 42 | static const HRESULT E_PREREQBA_INFINITE_LOOP = MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIX, 1002); | ||
| 42 | 43 | ||
| 43 | 44 | ||
| 44 | /******************************************************************* | 45 | /******************************************************************* |
diff --git a/src/burn/engine/engine.cpp b/src/burn/engine/engine.cpp index ee848acf..a408ed4a 100644 --- a/src/burn/engine/engine.cpp +++ b/src/burn/engine/engine.cpp | |||
| @@ -796,7 +796,7 @@ LExit: | |||
| 796 | else if (BOOTSTRAPPER_SHUTDOWN_ACTION_RELOAD_BOOTSTRAPPER == shutdownAction) | 796 | else if (BOOTSTRAPPER_SHUTDOWN_ACTION_RELOAD_BOOTSTRAPPER == shutdownAction) |
| 797 | { | 797 | { |
| 798 | LogId(REPORT_STANDARD, MSG_BA_REQUESTED_RELOAD); | 798 | LogId(REPORT_STANDARD, MSG_BA_REQUESTED_RELOAD); |
| 799 | *pfReloadApp = TRUE; | 799 | *pfReloadApp = SUCCEEDED(hr); |
| 800 | } | 800 | } |
| 801 | else if (BOOTSTRAPPER_SHUTDOWN_ACTION_SKIP_CLEANUP == shutdownAction) | 801 | else if (BOOTSTRAPPER_SHUTDOWN_ACTION_SKIP_CLEANUP == shutdownAction) |
| 802 | { | 802 | { |
| @@ -806,7 +806,7 @@ LExit: | |||
| 806 | } | 806 | } |
| 807 | 807 | ||
| 808 | // Unload BA. | 808 | // Unload BA. |
| 809 | UserExperienceUnload(&pEngineState->userExperience); | 809 | UserExperienceUnload(&pEngineState->userExperience, *pfReloadApp); |
| 810 | 810 | ||
| 811 | return hr; | 811 | return hr; |
| 812 | } | 812 | } |
diff --git a/src/burn/engine/userexperience.cpp b/src/burn/engine/userexperience.cpp index 4325a6ee..87ef4de1 100644 --- a/src/burn/engine/userexperience.cpp +++ b/src/burn/engine/userexperience.cpp | |||
| @@ -122,7 +122,6 @@ extern "C" HRESULT UserExperienceLoad( | |||
| 122 | 122 | ||
| 123 | pUserExperience->pfnBAProc = results.pfnBootstrapperApplicationProc; | 123 | pUserExperience->pfnBAProc = results.pfnBootstrapperApplicationProc; |
| 124 | pUserExperience->pvBAProcContext = results.pvBootstrapperApplicationProcContext; | 124 | pUserExperience->pvBAProcContext = results.pvBootstrapperApplicationProcContext; |
| 125 | pUserExperience->fDisableUnloading = results.fDisableUnloading; | ||
| 126 | 125 | ||
| 127 | LExit: | 126 | LExit: |
| 128 | return hr; | 127 | return hr; |
| @@ -133,10 +132,18 @@ LExit: | |||
| 133 | 132 | ||
| 134 | *******************************************************************/ | 133 | *******************************************************************/ |
| 135 | extern "C" HRESULT UserExperienceUnload( | 134 | extern "C" HRESULT UserExperienceUnload( |
| 136 | __in BURN_USER_EXPERIENCE* pUserExperience | 135 | __in BURN_USER_EXPERIENCE* pUserExperience, |
| 136 | __in BOOL fReload | ||
| 137 | ) | 137 | ) |
| 138 | { | 138 | { |
| 139 | HRESULT hr = S_OK; | 139 | HRESULT hr = S_OK; |
| 140 | BOOTSTRAPPER_DESTROY_ARGS args = { }; | ||
| 141 | BOOTSTRAPPER_DESTROY_RESULTS results = { }; | ||
| 142 | |||
| 143 | args.cbSize = sizeof(BOOTSTRAPPER_DESTROY_ARGS); | ||
| 144 | args.fReload = fReload; | ||
| 145 | |||
| 146 | results.cbSize = sizeof(BOOTSTRAPPER_DESTROY_RESULTS); | ||
| 140 | 147 | ||
| 141 | if (pUserExperience->hUXModule) | 148 | if (pUserExperience->hUXModule) |
| 142 | { | 149 | { |
| @@ -144,11 +151,11 @@ extern "C" HRESULT UserExperienceUnload( | |||
| 144 | PFN_BOOTSTRAPPER_APPLICATION_DESTROY pfnDestroy = (PFN_BOOTSTRAPPER_APPLICATION_DESTROY)::GetProcAddress(pUserExperience->hUXModule, "BootstrapperApplicationDestroy"); | 151 | PFN_BOOTSTRAPPER_APPLICATION_DESTROY pfnDestroy = (PFN_BOOTSTRAPPER_APPLICATION_DESTROY)::GetProcAddress(pUserExperience->hUXModule, "BootstrapperApplicationDestroy"); |
| 145 | if (pfnDestroy) | 152 | if (pfnDestroy) |
| 146 | { | 153 | { |
| 147 | pfnDestroy(); | 154 | pfnDestroy(&args, &results); |
| 148 | } | 155 | } |
| 149 | 156 | ||
| 150 | // Free BA DLL if it supports it. | 157 | // Free BA DLL if it supports it. |
| 151 | if (!pUserExperience->fDisableUnloading && !::FreeLibrary(pUserExperience->hUXModule)) | 158 | if (!results.fDisableUnloading && !::FreeLibrary(pUserExperience->hUXModule)) |
| 152 | { | 159 | { |
| 153 | hr = HRESULT_FROM_WIN32(::GetLastError()); | 160 | hr = HRESULT_FROM_WIN32(::GetLastError()); |
| 154 | TraceError(hr, "Failed to unload BA DLL."); | 161 | TraceError(hr, "Failed to unload BA DLL."); |
diff --git a/src/burn/engine/userexperience.h b/src/burn/engine/userexperience.h index e7489710..94b73f7d 100644 --- a/src/burn/engine/userexperience.h +++ b/src/burn/engine/userexperience.h | |||
| @@ -22,7 +22,6 @@ typedef struct _BURN_USER_EXPERIENCE | |||
| 22 | HMODULE hUXModule; | 22 | HMODULE hUXModule; |
| 23 | PFN_BOOTSTRAPPER_APPLICATION_PROC pfnBAProc; | 23 | PFN_BOOTSTRAPPER_APPLICATION_PROC pfnBAProc; |
| 24 | LPVOID pvBAProcContext; | 24 | LPVOID pvBAProcContext; |
| 25 | BOOL fDisableUnloading; | ||
| 26 | LPWSTR sczTempDirectory; | 25 | LPWSTR sczTempDirectory; |
| 27 | 26 | ||
| 28 | CRITICAL_SECTION csEngineActive; // Changing the engine active state in the user experience must be | 27 | CRITICAL_SECTION csEngineActive; // Changing the engine active state in the user experience must be |
| @@ -61,7 +60,8 @@ HRESULT UserExperienceLoad( | |||
| 61 | __in BOOTSTRAPPER_COMMAND* pCommand | 60 | __in BOOTSTRAPPER_COMMAND* pCommand |
| 62 | ); | 61 | ); |
| 63 | HRESULT UserExperienceUnload( | 62 | HRESULT UserExperienceUnload( |
| 64 | __in BURN_USER_EXPERIENCE* pUserExperience | 63 | __in BURN_USER_EXPERIENCE* pUserExperience, |
| 64 | __in BOOL fReload | ||
| 65 | ); | 65 | ); |
| 66 | HRESULT UserExperienceEnsureWorkingFolder( | 66 | HRESULT UserExperienceEnsureWorkingFolder( |
| 67 | __in BURN_CACHE* pCache, | 67 | __in BURN_CACHE* pCache, |
diff --git a/src/ext/Bal/Samples/bafunctions/bafunctions.cpp b/src/ext/Bal/Samples/bafunctions/bafunctions.cpp index b20f4230..fc9d1177 100644 --- a/src/ext/Bal/Samples/bafunctions/bafunctions.cpp +++ b/src/ext/Bal/Samples/bafunctions/bafunctions.cpp | |||
| @@ -40,6 +40,8 @@ LExit: | |||
| 40 | } | 40 | } |
| 41 | 41 | ||
| 42 | extern "C" void WINAPI BAFunctionsDestroy( | 42 | extern "C" void WINAPI BAFunctionsDestroy( |
| 43 | __in const BA_FUNCTIONS_DESTROY_ARGS* /*pArgs*/, | ||
| 44 | __inout BA_FUNCTIONS_DESTROY_RESULTS* /*pResults*/ | ||
| 43 | ) | 45 | ) |
| 44 | { | 46 | { |
| 45 | BalUninitialize(); | 47 | BalUninitialize(); |
diff --git a/src/ext/Bal/dnchost/dnchost.cpp b/src/ext/Bal/dnchost/dnchost.cpp index 644ba30e..6c066f43 100644 --- a/src/ext/Bal/dnchost/dnchost.cpp +++ b/src/ext/Bal/dnchost/dnchost.cpp | |||
| @@ -21,9 +21,8 @@ static HRESULT LoadManagedBootstrapperApplicationFactory( | |||
| 21 | __in DNCSTATE* pState | 21 | __in DNCSTATE* pState |
| 22 | ); | 22 | ); |
| 23 | static HRESULT CreatePrerequisiteBA( | 23 | static HRESULT CreatePrerequisiteBA( |
| 24 | __in HRESULT hrHostInitialization, | 24 | __in DNCSTATE* pState, |
| 25 | __in IBootstrapperEngine* pEngine, | 25 | __in IBootstrapperEngine* pEngine, |
| 26 | __in LPCWSTR wzAppBase, | ||
| 27 | __in const BOOTSTRAPPER_CREATE_ARGS* pArgs, | 26 | __in const BOOTSTRAPPER_CREATE_ARGS* pArgs, |
| 28 | __inout BOOTSTRAPPER_CREATE_RESULTS* pResults | 27 | __inout BOOTSTRAPPER_CREATE_RESULTS* pResults |
| 29 | ); | 28 | ); |
| @@ -58,13 +57,8 @@ extern "C" HRESULT WINAPI BootstrapperApplicationCreate( | |||
| 58 | ) | 57 | ) |
| 59 | { | 58 | { |
| 60 | HRESULT hr = S_OK; | 59 | HRESULT hr = S_OK; |
| 61 | HRESULT hrHostInitialization = S_OK; | ||
| 62 | IBootstrapperEngine* pEngine = NULL; | 60 | IBootstrapperEngine* pEngine = NULL; |
| 63 | 61 | ||
| 64 | // coreclr.dll doesn't support unloading, so the rest of the .NET Core hosting stack doesn't support it either. | ||
| 65 | // This means we also can't unload. | ||
| 66 | pResults->fDisableUnloading = TRUE; | ||
| 67 | |||
| 68 | hr = BalInitializeFromCreateArgs(pArgs, &pEngine); | 62 | hr = BalInitializeFromCreateArgs(pArgs, &pEngine); |
| 69 | ExitOnFailure(hr, "Failed to initialize Bal."); | 63 | ExitOnFailure(hr, "Failed to initialize Bal."); |
| 70 | 64 | ||
| @@ -106,16 +100,22 @@ extern "C" HRESULT WINAPI BootstrapperApplicationCreate( | |||
| 106 | { | 100 | { |
| 107 | if (DNCHOSTTYPE_SCD == vstate.type) | 101 | if (DNCHOSTTYPE_SCD == vstate.type) |
| 108 | { | 102 | { |
| 109 | hrHostInitialization = E_DNCHOST_SCD_RUNTIME_FAILURE; | 103 | vstate.prereqData.hrHostInitialization = E_DNCHOST_SCD_RUNTIME_FAILURE; |
| 110 | BalLogError(hr, "The self-contained .NET Core runtime failed to load. This is an unrecoverable error."); | 104 | BalLogError(hr, "The self-contained .NET Core runtime failed to load. This is an unrecoverable error."); |
| 111 | } | 105 | } |
| 106 | else if (vstate.prereqData.fCompleted) | ||
| 107 | { | ||
| 108 | hr = E_PREREQBA_INFINITE_LOOP; | ||
| 109 | BalLogError(hr, "The prerequisites were already installed. The bootstrapper application will not be reloaded to prevent an infinite loop."); | ||
| 110 | vstate.prereqData.hrHostInitialization = hr; | ||
| 111 | } | ||
| 112 | else | 112 | else |
| 113 | { | 113 | { |
| 114 | hrHostInitialization = S_OK; | 114 | vstate.prereqData.hrHostInitialization = S_OK; |
| 115 | } | 115 | } |
| 116 | BalLog(BOOTSTRAPPER_LOG_LEVEL_STANDARD, "Loading prerequisite bootstrapper application because .NET Core host could not be loaded, error: 0x%08x.", hr); | 116 | BalLog(BOOTSTRAPPER_LOG_LEVEL_STANDARD, "Loading prerequisite bootstrapper application because .NET Core host could not be loaded, error: 0x%08x.", hr); |
| 117 | 117 | ||
| 118 | hr = CreatePrerequisiteBA(hrHostInitialization, pEngine, vstate.sczAppBase, pArgs, pResults); | 118 | hr = CreatePrerequisiteBA(&vstate, pEngine, pArgs, pResults); |
| 119 | BalExitOnFailure(hr, "Failed to create the pre-requisite bootstrapper application."); | 119 | BalExitOnFailure(hr, "Failed to create the pre-requisite bootstrapper application."); |
| 120 | } | 120 | } |
| 121 | 121 | ||
| @@ -125,14 +125,21 @@ LExit: | |||
| 125 | return hr; | 125 | return hr; |
| 126 | } | 126 | } |
| 127 | 127 | ||
| 128 | extern "C" void WINAPI BootstrapperApplicationDestroy() | 128 | extern "C" void WINAPI BootstrapperApplicationDestroy( |
| 129 | __in const BOOTSTRAPPER_DESTROY_ARGS* pArgs, | ||
| 130 | __in BOOTSTRAPPER_DESTROY_RESULTS* pResults | ||
| 131 | ) | ||
| 129 | { | 132 | { |
| 133 | BOOTSTRAPPER_DESTROY_RESULTS childResults = { }; | ||
| 134 | |||
| 135 | childResults.cbSize = sizeof(BOOTSTRAPPER_DESTROY_RESULTS); | ||
| 136 | |||
| 130 | if (vstate.hMbapreqModule) | 137 | if (vstate.hMbapreqModule) |
| 131 | { | 138 | { |
| 132 | PFN_BOOTSTRAPPER_APPLICATION_DESTROY pfnDestroy = reinterpret_cast<PFN_BOOTSTRAPPER_APPLICATION_DESTROY>(::GetProcAddress(vstate.hMbapreqModule, "DncPrereqBootstrapperApplicationDestroy")); | 139 | PFN_BOOTSTRAPPER_APPLICATION_DESTROY pfnDestroy = reinterpret_cast<PFN_BOOTSTRAPPER_APPLICATION_DESTROY>(::GetProcAddress(vstate.hMbapreqModule, "PrereqBootstrapperApplicationDestroy")); |
| 133 | if (pfnDestroy) | 140 | if (pfnDestroy) |
| 134 | { | 141 | { |
| 135 | (*pfnDestroy)(); | 142 | (*pfnDestroy)(pArgs, &childResults); |
| 136 | } | 143 | } |
| 137 | 144 | ||
| 138 | ::FreeLibrary(vstate.hMbapreqModule); | 145 | ::FreeLibrary(vstate.hMbapreqModule); |
| @@ -140,6 +147,9 @@ extern "C" void WINAPI BootstrapperApplicationDestroy() | |||
| 140 | } | 147 | } |
| 141 | 148 | ||
| 142 | BalUninitialize(); | 149 | BalUninitialize(); |
| 150 | |||
| 151 | // Need to keep track of state between reloads. | ||
| 152 | pResults->fDisableUnloading = TRUE; | ||
| 143 | } | 153 | } |
| 144 | 154 | ||
| 145 | static HRESULT LoadModulePaths( | 155 | static HRESULT LoadModulePaths( |
| @@ -262,9 +272,8 @@ static HRESULT LoadManagedBootstrapperApplicationFactory( | |||
| 262 | } | 272 | } |
| 263 | 273 | ||
| 264 | static HRESULT CreatePrerequisiteBA( | 274 | static HRESULT CreatePrerequisiteBA( |
| 265 | __in HRESULT hrHostInitialization, | 275 | __in DNCSTATE* pState, |
| 266 | __in IBootstrapperEngine* pEngine, | 276 | __in IBootstrapperEngine* pEngine, |
| 267 | __in LPCWSTR wzAppBase, | ||
| 268 | __in const BOOTSTRAPPER_CREATE_ARGS* pArgs, | 277 | __in const BOOTSTRAPPER_CREATE_ARGS* pArgs, |
| 269 | __inout BOOTSTRAPPER_CREATE_RESULTS* pResults | 278 | __inout BOOTSTRAPPER_CREATE_RESULTS* pResults |
| 270 | ) | 279 | ) |
| @@ -273,19 +282,19 @@ static HRESULT CreatePrerequisiteBA( | |||
| 273 | LPWSTR sczDncpreqPath = NULL; | 282 | LPWSTR sczDncpreqPath = NULL; |
| 274 | HMODULE hModule = NULL; | 283 | HMODULE hModule = NULL; |
| 275 | 284 | ||
| 276 | hr = PathConcat(wzAppBase, L"dncpreq.dll", &sczDncpreqPath); | 285 | hr = PathConcat(pState->sczAppBase, L"dncpreq.dll", &sczDncpreqPath); |
| 277 | BalExitOnFailure(hr, "Failed to get path to pre-requisite BA."); | 286 | BalExitOnFailure(hr, "Failed to get path to pre-requisite BA."); |
| 278 | 287 | ||
| 279 | hModule = ::LoadLibraryW(sczDncpreqPath); | 288 | hModule = ::LoadLibraryExW(sczDncpreqPath, NULL, LOAD_WITH_ALTERED_SEARCH_PATH); |
| 280 | BalExitOnNullWithLastError(hModule, hr, "Failed to load pre-requisite BA DLL."); | 289 | BalExitOnNullWithLastError(hModule, hr, "Failed to load pre-requisite BA DLL."); |
| 281 | 290 | ||
| 282 | PFN_DNCPREQ_BOOTSTRAPPER_APPLICATION_CREATE pfnCreate = reinterpret_cast<PFN_DNCPREQ_BOOTSTRAPPER_APPLICATION_CREATE>(::GetProcAddress(hModule, "DncPrereqBootstrapperApplicationCreate")); | 291 | PFN_PREQ_BOOTSTRAPPER_APPLICATION_CREATE pfnCreate = reinterpret_cast<PFN_PREQ_BOOTSTRAPPER_APPLICATION_CREATE>(::GetProcAddress(hModule, "PrereqBootstrapperApplicationCreate")); |
| 283 | BalExitOnNullWithLastError(pfnCreate, hr, "Failed to get DncPrereqBootstrapperApplicationCreate entry-point from: %ls", sczDncpreqPath); | 292 | BalExitOnNullWithLastError(pfnCreate, hr, "Failed to get PrereqBootstrapperApplicationCreate entry-point from: %ls", sczDncpreqPath); |
| 284 | 293 | ||
| 285 | hr = pfnCreate(hrHostInitialization, pEngine, pArgs, pResults); | 294 | hr = pfnCreate(&pState->prereqData, pEngine, pArgs, pResults); |
| 286 | BalExitOnFailure(hr, "Failed to create prequisite bootstrapper app."); | 295 | BalExitOnFailure(hr, "Failed to create prequisite bootstrapper app."); |
| 287 | 296 | ||
| 288 | vstate.hMbapreqModule = hModule; | 297 | pState->hMbapreqModule = hModule; |
| 289 | hModule = NULL; | 298 | hModule = NULL; |
| 290 | 299 | ||
| 291 | LExit: | 300 | LExit: |
diff --git a/src/ext/Bal/dnchost/dnchost.h b/src/ext/Bal/dnchost/dnchost.h index b0ba9638..000cf43d 100644 --- a/src/ext/Bal/dnchost/dnchost.h +++ b/src/ext/Bal/dnchost/dnchost.h | |||
| @@ -9,13 +9,6 @@ enum DNCHOSTTYPE | |||
| 9 | DNCHOSTTYPE_SCD, | 9 | DNCHOSTTYPE_SCD, |
| 10 | }; | 10 | }; |
| 11 | 11 | ||
| 12 | extern "C" typedef HRESULT(WINAPI* PFN_DNCPREQ_BOOTSTRAPPER_APPLICATION_CREATE)( | ||
| 13 | __in HRESULT hrHostInitialization, | ||
| 14 | __in IBootstrapperEngine* pEngine, | ||
| 15 | __in const BOOTSTRAPPER_CREATE_ARGS* pArgs, | ||
| 16 | __inout BOOTSTRAPPER_CREATE_RESULTS* pResults | ||
| 17 | ); | ||
| 18 | |||
| 19 | struct DNCSTATE | 12 | struct DNCSTATE |
| 20 | { | 13 | { |
| 21 | BOOL fInitialized; | 14 | BOOL fInitialized; |
| @@ -31,4 +24,5 @@ struct DNCSTATE | |||
| 31 | HOSTFXR_STATE hostfxrState; | 24 | HOSTFXR_STATE hostfxrState; |
| 32 | IBootstrapperApplicationFactory* pAppFactory; | 25 | IBootstrapperApplicationFactory* pAppFactory; |
| 33 | HMODULE hMbapreqModule; | 26 | HMODULE hMbapreqModule; |
| 27 | PREQBA_DATA prereqData; | ||
| 34 | }; | 28 | }; |
diff --git a/src/ext/Bal/dnchost/dnchost.vcxproj b/src/ext/Bal/dnchost/dnchost.vcxproj index ca0c09d6..b258ccae 100644 --- a/src/ext/Bal/dnchost/dnchost.vcxproj +++ b/src/ext/Bal/dnchost/dnchost.vcxproj | |||
| @@ -50,7 +50,7 @@ | |||
| 50 | <NetHostPlatform>$(Platform)</NetHostPlatform> | 50 | <NetHostPlatform>$(Platform)</NetHostPlatform> |
| 51 | <NetHostPlatform Condition=" '$(NetHostPlatform)'=='Win32' ">x86</NetHostPlatform> | 51 | <NetHostPlatform Condition=" '$(NetHostPlatform)'=='Win32' ">x86</NetHostPlatform> |
| 52 | <NetHostPath>..\..\..\..\packages\runtime.win-$(NetHostPlatform).Microsoft.NETCore.DotNetAppHost.6.0.4\runtimes\win-$(NetHostPlatform)\native\</NetHostPath> | 52 | <NetHostPath>..\..\..\..\packages\runtime.win-$(NetHostPlatform).Microsoft.NETCore.DotNetAppHost.6.0.4\runtimes\win-$(NetHostPlatform)\native\</NetHostPath> |
| 53 | <ProjectAdditionalIncludeDirectories>$(BaseOutputPath)obj;$(NetHostPath)</ProjectAdditionalIncludeDirectories> | 53 | <ProjectAdditionalIncludeDirectories>$(BaseOutputPath)obj;$(NetHostPath);..\wixstdba\inc</ProjectAdditionalIncludeDirectories> |
| 54 | <ProjectAdditionalLinkLibraries>shlwapi.lib;$(NetHostPath)libnethost.lib</ProjectAdditionalLinkLibraries> | 54 | <ProjectAdditionalLinkLibraries>shlwapi.lib;$(NetHostPath)libnethost.lib</ProjectAdditionalLinkLibraries> |
| 55 | </PropertyGroup> | 55 | </PropertyGroup> |
| 56 | 56 | ||
diff --git a/src/ext/Bal/dnchost/precomp.h b/src/ext/Bal/dnchost/precomp.h index 7aefc4e3..5f365fba 100644 --- a/src/ext/Bal/dnchost/precomp.h +++ b/src/ext/Bal/dnchost/precomp.h | |||
| @@ -25,6 +25,8 @@ | |||
| 25 | #include <hostfxr.h> | 25 | #include <hostfxr.h> |
| 26 | #include <coreclr_delegates.h> | 26 | #include <coreclr_delegates.h> |
| 27 | 27 | ||
| 28 | #include <preqba.h> | ||
| 29 | |||
| 28 | #include "coreclrhost.h" | 30 | #include "coreclrhost.h" |
| 29 | #include "dncutil.h" | 31 | #include "dncutil.h" |
| 30 | #include "dnchost.h" | 32 | #include "dnchost.h" |
diff --git a/src/ext/Bal/mbahost/mbahost.cpp b/src/ext/Bal/mbahost/mbahost.cpp index a9585389..3de77a05 100644 --- a/src/ext/Bal/mbahost/mbahost.cpp +++ b/src/ext/Bal/mbahost/mbahost.cpp | |||
| @@ -1,7 +1,6 @@ | |||
| 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. | 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 | 2 | ||
| 3 | #include "precomp.h" | 3 | #include "precomp.h" |
| 4 | #include <WixToolset.Mba.Host.h> // includes the generated assembly name macros. | ||
| 5 | 4 | ||
| 6 | static const DWORD NET452_RELEASE = 379893; | 5 | static const DWORD NET452_RELEASE = 379893; |
| 7 | 6 | ||
| @@ -14,26 +13,16 @@ extern "C" typedef HRESULT (WINAPI *PFN_CORBINDTOCURRENTRUNTIME)( | |||
| 14 | __out LPVOID *ppv | 13 | __out LPVOID *ppv |
| 15 | ); | 14 | ); |
| 16 | 15 | ||
| 17 | extern "C" typedef HRESULT(WINAPI *PFN_MBAPREQ_BOOTSTRAPPER_APPLICATION_CREATE)( | 16 | static MBASTATE vstate = { }; |
| 18 | __in HRESULT hrHostInitialization, | ||
| 19 | __in IBootstrapperEngine* pEngine, | ||
| 20 | __in const BOOTSTRAPPER_CREATE_ARGS* pArgs, | ||
| 21 | __inout BOOTSTRAPPER_CREATE_RESULTS* pResults | ||
| 22 | ); | ||
| 23 | |||
| 24 | static HINSTANCE vhInstance = NULL; | ||
| 25 | static ICorRuntimeHost *vpCLRHost = NULL; | ||
| 26 | static _AppDomain *vpAppDomain = NULL; | ||
| 27 | static HMODULE vhMbapreqModule = NULL; | ||
| 28 | 17 | ||
| 29 | 18 | ||
| 30 | // internal function declarations | 19 | // internal function declarations |
| 31 | 20 | ||
| 32 | static HRESULT GetAppDomain( | 21 | static HRESULT GetAppDomain( |
| 33 | __out _AppDomain** ppAppDomain | 22 | __in MBASTATE* pState |
| 34 | ); | 23 | ); |
| 35 | static HRESULT GetAppBase( | 24 | static HRESULT LoadModulePaths( |
| 36 | __out LPWSTR* psczAppBase | 25 | __in MBASTATE* pState |
| 37 | ); | 26 | ); |
| 38 | static HRESULT CheckSupportedFrameworks( | 27 | static HRESULT CheckSupportedFrameworks( |
| 39 | __in LPCWSTR wzConfigPath | 28 | __in LPCWSTR wzConfigPath |
| @@ -43,9 +32,8 @@ static HRESULT UpdateSupportedRuntime( | |||
| 43 | __in IXMLDOMNode* pixnSupportedFramework, | 32 | __in IXMLDOMNode* pixnSupportedFramework, |
| 44 | __out BOOL* pfUpdatedManifest | 33 | __out BOOL* pfUpdatedManifest |
| 45 | ); | 34 | ); |
| 46 | static HRESULT GetCLRHost( | 35 | static HRESULT LoadRuntime( |
| 47 | __in LPCWSTR wzConfigPath, | 36 | __in MBASTATE* pState |
| 48 | __out ICorRuntimeHost** ppCLRHost | ||
| 49 | ); | 37 | ); |
| 50 | static HRESULT CreateManagedBootstrapperApplication( | 38 | static HRESULT CreateManagedBootstrapperApplication( |
| 51 | __in _AppDomain* pAppDomain, | 39 | __in _AppDomain* pAppDomain, |
| @@ -57,7 +45,7 @@ static HRESULT CreateManagedBootstrapperApplicationFactory( | |||
| 57 | __out IBootstrapperApplicationFactory** ppAppFactory | 45 | __out IBootstrapperApplicationFactory** ppAppFactory |
| 58 | ); | 46 | ); |
| 59 | static HRESULT CreatePrerequisiteBA( | 47 | static HRESULT CreatePrerequisiteBA( |
| 60 | __in HRESULT hrHostInitialization, | 48 | __in MBASTATE* pState, |
| 61 | __in IBootstrapperEngine* pEngine, | 49 | __in IBootstrapperEngine* pEngine, |
| 62 | __in const BOOTSTRAPPER_CREATE_ARGS* pArgs, | 50 | __in const BOOTSTRAPPER_CREATE_ARGS* pArgs, |
| 63 | __inout BOOTSTRAPPER_CREATE_RESULTS* pResults | 51 | __inout BOOTSTRAPPER_CREATE_RESULTS* pResults |
| @@ -78,11 +66,11 @@ extern "C" BOOL WINAPI DllMain( | |||
| 78 | { | 66 | { |
| 79 | case DLL_PROCESS_ATTACH: | 67 | case DLL_PROCESS_ATTACH: |
| 80 | ::DisableThreadLibraryCalls(hInstance); | 68 | ::DisableThreadLibraryCalls(hInstance); |
| 81 | vhInstance = hInstance; | 69 | vstate.hInstance = hInstance; |
| 82 | break; | 70 | break; |
| 83 | 71 | ||
| 84 | case DLL_PROCESS_DETACH: | 72 | case DLL_PROCESS_DETACH: |
| 85 | vhInstance = NULL; | 73 | vstate.hInstance = NULL; |
| 86 | break; | 74 | break; |
| 87 | } | 75 | } |
| 88 | 76 | ||
| @@ -96,18 +84,39 @@ extern "C" HRESULT WINAPI BootstrapperApplicationCreate( | |||
| 96 | ) | 84 | ) |
| 97 | { | 85 | { |
| 98 | HRESULT hr = S_OK; | 86 | HRESULT hr = S_OK; |
| 99 | HRESULT hrHostInitialization = S_OK; | ||
| 100 | IBootstrapperEngine* pEngine = NULL; | 87 | IBootstrapperEngine* pEngine = NULL; |
| 101 | 88 | ||
| 89 | if (vstate.fStoppedRuntime) | ||
| 90 | { | ||
| 91 | BalExitWithRootFailure(hr, E_INVALIDSTATE, "Reloaded mbahost after stopping .NET runtime."); | ||
| 92 | } | ||
| 93 | |||
| 102 | hr = BalInitializeFromCreateArgs(pArgs, &pEngine); | 94 | hr = BalInitializeFromCreateArgs(pArgs, &pEngine); |
| 103 | ExitOnFailure(hr, "Failed to initialize Bal."); | 95 | ExitOnFailure(hr, "Failed to initialize Bal."); |
| 104 | 96 | ||
| 105 | hr = GetAppDomain(&vpAppDomain); | 97 | if (!vstate.fInitialized) |
| 106 | if (SUCCEEDED(hr)) | 98 | { |
| 99 | hr = LoadModulePaths(&vstate); | ||
| 100 | BalExitOnFailure(hr, "Failed to load the module paths."); | ||
| 101 | |||
| 102 | vstate.fInitialized = TRUE; | ||
| 103 | } | ||
| 104 | |||
| 105 | if (!vstate.fInitializedRuntime) | ||
| 106 | { | ||
| 107 | hr = LoadRuntime(&vstate); | ||
| 108 | |||
| 109 | vstate.fInitializedRuntime = SUCCEEDED(hr); | ||
| 110 | } | ||
| 111 | |||
| 112 | if (vstate.fInitializedRuntime) | ||
| 107 | { | 113 | { |
| 114 | hr = GetAppDomain(&vstate); | ||
| 115 | BalExitOnFailure(hr, "Failed to create the AppDomain for the managed bootstrapper application."); | ||
| 116 | |||
| 108 | BalLog(BOOTSTRAPPER_LOG_LEVEL_STANDARD, "Loading managed bootstrapper application."); | 117 | BalLog(BOOTSTRAPPER_LOG_LEVEL_STANDARD, "Loading managed bootstrapper application."); |
| 109 | 118 | ||
| 110 | hr = CreateManagedBootstrapperApplication(vpAppDomain, pArgs, pResults); | 119 | hr = CreateManagedBootstrapperApplication(vstate.pAppDomain, pArgs, pResults); |
| 111 | BalExitOnFailure(hr, "Failed to create the managed bootstrapper application."); | 120 | BalExitOnFailure(hr, "Failed to create the managed bootstrapper application."); |
| 112 | } | 121 | } |
| 113 | else // fallback to the prerequisite BA. | 122 | else // fallback to the prerequisite BA. |
| @@ -115,16 +124,22 @@ extern "C" HRESULT WINAPI BootstrapperApplicationCreate( | |||
| 115 | if (E_MBAHOST_NET452_ON_WIN7RTM == hr) | 124 | if (E_MBAHOST_NET452_ON_WIN7RTM == hr) |
| 116 | { | 125 | { |
| 117 | BalLogError(hr, "The Burn engine cannot run with an MBA under the .NET 4 CLR on Windows 7 RTM with .NET 4.5.2 (or greater) installed."); | 126 | BalLogError(hr, "The Burn engine cannot run with an MBA under the .NET 4 CLR on Windows 7 RTM with .NET 4.5.2 (or greater) installed."); |
| 118 | hrHostInitialization = hr; | 127 | vstate.prereqData.hrHostInitialization = hr; |
| 128 | } | ||
| 129 | else if (vstate.prereqData.fCompleted) | ||
| 130 | { | ||
| 131 | hr = E_PREREQBA_INFINITE_LOOP; | ||
| 132 | BalLogError(hr, "The prerequisites were already installed. The bootstrapper application will not be reloaded to prevent an infinite loop."); | ||
| 133 | vstate.prereqData.hrHostInitialization = hr; | ||
| 119 | } | 134 | } |
| 120 | else | 135 | else |
| 121 | { | 136 | { |
| 122 | hrHostInitialization = S_OK; | 137 | vstate.prereqData.hrHostInitialization = S_OK; |
| 123 | } | 138 | } |
| 124 | 139 | ||
| 125 | BalLog(BOOTSTRAPPER_LOG_LEVEL_STANDARD, "Loading prerequisite bootstrapper application because managed host could not be loaded, error: 0x%08x.", hr); | 140 | BalLog(BOOTSTRAPPER_LOG_LEVEL_STANDARD, "Loading prerequisite bootstrapper application because managed host could not be loaded, error: 0x%08x.", hr); |
| 126 | 141 | ||
| 127 | hr = CreatePrerequisiteBA(hrHostInitialization, pEngine, pArgs, pResults); | 142 | hr = CreatePrerequisiteBA(&vstate, pEngine, pArgs, pResults); |
| 128 | BalExitOnFailure(hr, "Failed to create the pre-requisite bootstrapper application."); | 143 | BalExitOnFailure(hr, "Failed to create the pre-requisite bootstrapper application."); |
| 129 | } | 144 | } |
| 130 | 145 | ||
| @@ -134,73 +149,65 @@ LExit: | |||
| 134 | return hr; | 149 | return hr; |
| 135 | } | 150 | } |
| 136 | 151 | ||
| 137 | extern "C" void WINAPI BootstrapperApplicationDestroy() | 152 | extern "C" void WINAPI BootstrapperApplicationDestroy( |
| 153 | __in const BOOTSTRAPPER_DESTROY_ARGS* pArgs, | ||
| 154 | __in BOOTSTRAPPER_DESTROY_RESULTS* pResults | ||
| 155 | ) | ||
| 138 | { | 156 | { |
| 139 | if (vpAppDomain) | 157 | BOOTSTRAPPER_DESTROY_RESULTS childResults = { }; |
| 158 | |||
| 159 | if (vstate.pAppDomain) | ||
| 140 | { | 160 | { |
| 141 | HRESULT hr = vpCLRHost->UnloadDomain(vpAppDomain); | 161 | HRESULT hr = vstate.pCLRHost->UnloadDomain(vstate.pAppDomain); |
| 142 | if (FAILED(hr)) | 162 | if (FAILED(hr)) |
| 143 | { | 163 | { |
| 144 | BalLogError(hr, "Failed to unload app domain."); | 164 | BalLogError(hr, "Failed to unload app domain."); |
| 145 | } | 165 | } |
| 146 | 166 | ||
| 147 | vpAppDomain->Release(); | 167 | vstate.pAppDomain->Release(); |
| 168 | vstate.pAppDomain = NULL; | ||
| 148 | } | 169 | } |
| 149 | 170 | ||
| 150 | if (vpCLRHost) | 171 | // pCLRHost can only be stopped once per process. |
| 172 | if (vstate.pCLRHost && !pArgs->fReload) | ||
| 151 | { | 173 | { |
| 152 | vpCLRHost->Stop(); | 174 | vstate.pCLRHost->Stop(); |
| 153 | vpCLRHost->Release(); | 175 | vstate.pCLRHost->Release(); |
| 176 | vstate.pCLRHost = NULL; | ||
| 177 | vstate.fStoppedRuntime = TRUE; | ||
| 154 | } | 178 | } |
| 155 | 179 | ||
| 156 | if (vhMbapreqModule) | 180 | if (vstate.hMbapreqModule) |
| 157 | { | 181 | { |
| 158 | PFN_BOOTSTRAPPER_APPLICATION_DESTROY pfnDestroy = reinterpret_cast<PFN_BOOTSTRAPPER_APPLICATION_DESTROY>(::GetProcAddress(vhMbapreqModule, "MbaPrereqBootstrapperApplicationDestroy")); | 182 | PFN_BOOTSTRAPPER_APPLICATION_DESTROY pfnDestroy = reinterpret_cast<PFN_BOOTSTRAPPER_APPLICATION_DESTROY>(::GetProcAddress(vstate.hMbapreqModule, "PrereqBootstrapperApplicationDestroy")); |
| 159 | if (pfnDestroy) | 183 | if (pfnDestroy) |
| 160 | { | 184 | { |
| 161 | (*pfnDestroy)(); | 185 | (*pfnDestroy)(pArgs, &childResults); |
| 162 | } | 186 | } |
| 163 | 187 | ||
| 164 | ::FreeLibrary(vhMbapreqModule); | 188 | ::FreeLibrary(vstate.hMbapreqModule); |
| 165 | vhMbapreqModule = NULL; | 189 | vstate.hMbapreqModule = NULL; |
| 166 | } | 190 | } |
| 167 | 191 | ||
| 168 | BalUninitialize(); | 192 | BalUninitialize(); |
| 193 | |||
| 194 | // Need to keep track of state between reloads. | ||
| 195 | pResults->fDisableUnloading = TRUE; | ||
| 169 | } | 196 | } |
| 170 | 197 | ||
| 171 | // Gets the custom AppDomain for loading managed BA. | 198 | // Gets the custom AppDomain for loading managed BA. |
| 172 | static HRESULT GetAppDomain( | 199 | static HRESULT GetAppDomain( |
| 173 | __out _AppDomain **ppAppDomain | 200 | __in MBASTATE* pState |
| 174 | ) | 201 | ) |
| 175 | { | 202 | { |
| 176 | HRESULT hr = S_OK; | 203 | HRESULT hr = S_OK; |
| 177 | ICorRuntimeHost *pCLRHost = NULL; | ||
| 178 | IUnknown *pUnk = NULL; | 204 | IUnknown *pUnk = NULL; |
| 179 | LPWSTR sczAppBase = NULL; | 205 | IAppDomainSetup* pAppDomainSetup = NULL; |
| 180 | LPWSTR sczConfigPath = NULL; | ||
| 181 | IAppDomainSetup *pAppDomainSetup; | ||
| 182 | BSTR bstrAppBase = NULL; | 206 | BSTR bstrAppBase = NULL; |
| 183 | BSTR bstrConfigPath = NULL; | 207 | BSTR bstrConfigPath = NULL; |
| 184 | 208 | ||
| 185 | hr = GetAppBase(&sczAppBase); | ||
| 186 | ExitOnFailure(hr, "Failed to get the host base path."); | ||
| 187 | |||
| 188 | hr = PathConcat(sczAppBase, MBA_CONFIG_FILE_NAME, &sczConfigPath); | ||
| 189 | ExitOnFailure(hr, "Failed to get the full path to the application configuration file."); | ||
| 190 | |||
| 191 | // Check that the supported framework is installed. | ||
| 192 | hr = CheckSupportedFrameworks(sczConfigPath); | ||
| 193 | ExitOnFailure(hr, "Failed to find supported framework."); | ||
| 194 | |||
| 195 | // Load the CLR. | ||
| 196 | hr = GetCLRHost(sczConfigPath, &pCLRHost); | ||
| 197 | ExitOnFailure(hr, "Failed to create the CLR host."); | ||
| 198 | |||
| 199 | hr = pCLRHost->Start(); | ||
| 200 | ExitOnRootFailure(hr, "Failed to start the CLR host."); | ||
| 201 | |||
| 202 | // Create the setup information for a new AppDomain to set the app base and config. | 209 | // Create the setup information for a new AppDomain to set the app base and config. |
| 203 | hr = pCLRHost->CreateDomainSetup(&pUnk); | 210 | hr = pState->pCLRHost->CreateDomainSetup(&pUnk); |
| 204 | ExitOnRootFailure(hr, "Failed to create the AppDomainSetup object."); | 211 | ExitOnRootFailure(hr, "Failed to create the AppDomainSetup object."); |
| 205 | 212 | ||
| 206 | hr = pUnk->QueryInterface(__uuidof(IAppDomainSetup), reinterpret_cast<LPVOID*>(&pAppDomainSetup)); | 213 | hr = pUnk->QueryInterface(__uuidof(IAppDomainSetup), reinterpret_cast<LPVOID*>(&pAppDomainSetup)); |
| @@ -208,49 +215,49 @@ static HRESULT GetAppDomain( | |||
| 208 | ReleaseNullObject(pUnk); | 215 | ReleaseNullObject(pUnk); |
| 209 | 216 | ||
| 210 | // Set properties on the AppDomainSetup object. | 217 | // Set properties on the AppDomainSetup object. |
| 211 | bstrAppBase = ::SysAllocString(sczAppBase); | 218 | bstrAppBase = ::SysAllocString(pState->sczAppBase); |
| 212 | ExitOnNull(bstrAppBase, hr, E_OUTOFMEMORY, "Failed to allocate the application base path for the AppDomainSetup."); | 219 | ExitOnNull(bstrAppBase, hr, E_OUTOFMEMORY, "Failed to allocate the application base path for the AppDomainSetup."); |
| 213 | 220 | ||
| 214 | hr = pAppDomainSetup->put_ApplicationBase(bstrAppBase); | 221 | hr = pAppDomainSetup->put_ApplicationBase(bstrAppBase); |
| 215 | ExitOnRootFailure(hr, "Failed to set the application base path for the AppDomainSetup."); | 222 | ExitOnRootFailure(hr, "Failed to set the application base path for the AppDomainSetup."); |
| 216 | 223 | ||
| 217 | bstrConfigPath = ::SysAllocString(sczConfigPath); | 224 | bstrConfigPath = ::SysAllocString(pState->sczConfigPath); |
| 218 | ExitOnNull(bstrConfigPath, hr, E_OUTOFMEMORY, "Failed to allocate the application configuration file for the AppDomainSetup."); | 225 | ExitOnNull(bstrConfigPath, hr, E_OUTOFMEMORY, "Failed to allocate the application configuration file for the AppDomainSetup."); |
| 219 | 226 | ||
| 220 | hr = pAppDomainSetup->put_ConfigurationFile(bstrConfigPath); | 227 | hr = pAppDomainSetup->put_ConfigurationFile(bstrConfigPath); |
| 221 | ExitOnRootFailure(hr, "Failed to set the configuration file path for the AppDomainSetup."); | 228 | ExitOnRootFailure(hr, "Failed to set the configuration file path for the AppDomainSetup."); |
| 222 | 229 | ||
| 223 | // Create the AppDomain to load the factory type. | 230 | // Create the AppDomain to load the factory type. |
| 224 | hr = pCLRHost->CreateDomainEx(L"MBA", pAppDomainSetup, NULL, &pUnk); | 231 | hr = pState->pCLRHost->CreateDomainEx(L"MBA", pAppDomainSetup, NULL, &pUnk); |
| 225 | ExitOnRootFailure(hr, "Failed to create the MBA AppDomain."); | 232 | ExitOnRootFailure(hr, "Failed to create the MBA AppDomain."); |
| 226 | 233 | ||
| 227 | hr = pUnk->QueryInterface(__uuidof(_AppDomain), reinterpret_cast<LPVOID*>(ppAppDomain)); | 234 | hr = pUnk->QueryInterface(__uuidof(_AppDomain), reinterpret_cast<LPVOID*>(&pState->pAppDomain)); |
| 228 | ExitOnRootFailure(hr, "Failed to query for the _AppDomain interface."); | 235 | ExitOnRootFailure(hr, "Failed to query for the _AppDomain interface."); |
| 229 | 236 | ||
| 230 | LExit: | 237 | LExit: |
| 231 | ReleaseBSTR(bstrConfigPath); | 238 | ReleaseBSTR(bstrConfigPath); |
| 232 | ReleaseBSTR(bstrAppBase); | 239 | ReleaseBSTR(bstrAppBase); |
| 233 | ReleaseStr(sczConfigPath); | ||
| 234 | ReleaseStr(sczAppBase); | ||
| 235 | ReleaseNullObject(pUnk); | 240 | ReleaseNullObject(pUnk); |
| 236 | ReleaseNullObject(pCLRHost); | ||
| 237 | 241 | ||
| 238 | return hr; | 242 | return hr; |
| 239 | } | 243 | } |
| 240 | 244 | ||
| 241 | static HRESULT GetAppBase( | 245 | static HRESULT LoadModulePaths( |
| 242 | __out LPWSTR *psczAppBase | 246 | __in MBASTATE* pState |
| 243 | ) | 247 | ) |
| 244 | { | 248 | { |
| 245 | HRESULT hr = S_OK; | 249 | HRESULT hr = S_OK; |
| 246 | LPWSTR sczFullPath = NULL; | 250 | LPWSTR sczFullPath = NULL; |
| 247 | 251 | ||
| 248 | hr = PathForCurrentProcess(&sczFullPath, vhInstance); | 252 | hr = PathForCurrentProcess(&sczFullPath, pState->hInstance); |
| 249 | ExitOnFailure(hr, "Failed to get the full host path."); | 253 | ExitOnFailure(hr, "Failed to get the full host path."); |
| 250 | 254 | ||
| 251 | hr = PathGetDirectory(sczFullPath, psczAppBase); | 255 | hr = PathGetDirectory(sczFullPath, &pState->sczAppBase); |
| 252 | ExitOnFailure(hr, "Failed to get the directory of the full process path."); | 256 | ExitOnFailure(hr, "Failed to get the directory of the full process path."); |
| 253 | 257 | ||
| 258 | hr = PathConcat(pState->sczAppBase, MBA_CONFIG_FILE_NAME, &pState->sczConfigPath); | ||
| 259 | ExitOnFailure(hr, "Failed to get the full path to the application configuration file."); | ||
| 260 | |||
| 254 | LExit: | 261 | LExit: |
| 255 | ReleaseStr(sczFullPath); | 262 | ReleaseStr(sczFullPath); |
| 256 | 263 | ||
| @@ -390,9 +397,8 @@ LExit: | |||
| 390 | } | 397 | } |
| 391 | 398 | ||
| 392 | // Gets the CLR host and caches it. | 399 | // Gets the CLR host and caches it. |
| 393 | static HRESULT GetCLRHost( | 400 | static HRESULT LoadRuntime( |
| 394 | __in LPCWSTR wzConfigPath, | 401 | __in MBASTATE* pState |
| 395 | __out ICorRuntimeHost **ppCLRHost | ||
| 396 | ) | 402 | ) |
| 397 | { | 403 | { |
| 398 | HRESULT hr = S_OK; | 404 | HRESULT hr = S_OK; |
| @@ -411,84 +417,81 @@ static HRESULT GetCLRHost( | |||
| 411 | // Always set the error mode because we will always restore it below. | 417 | // Always set the error mode because we will always restore it below. |
| 412 | uiMode = ::SetErrorMode(0); | 418 | uiMode = ::SetErrorMode(0); |
| 413 | 419 | ||
| 414 | // Cache the CLR host to be shutdown later. This can occur on a different thread. | 420 | // Check that the supported framework is installed. |
| 415 | if (!vpCLRHost) | 421 | hr = CheckSupportedFrameworks(pState->sczConfigPath); |
| 416 | { | 422 | ExitOnFailure(hr, "Failed to find supported framework."); |
| 417 | // Disable message boxes from being displayed on error and blocking execution. | ||
| 418 | ::SetErrorMode(uiMode | SEM_FAILCRITICALERRORS); | ||
| 419 | 423 | ||
| 420 | hr = LoadSystemLibrary(L"mscoree.dll", &hModule); | 424 | // Cache the CLR host to be shutdown later. This can occur on a different thread. |
| 421 | ExitOnFailure(hr, "Failed to load mscoree.dll"); | 425 | // Disable message boxes from being displayed on error and blocking execution. |
| 426 | ::SetErrorMode(uiMode | SEM_FAILCRITICALERRORS); | ||
| 422 | 427 | ||
| 423 | pfnCLRCreateInstance = reinterpret_cast<CLRCreateInstanceFnPtr>(::GetProcAddress(hModule, "CLRCreateInstance")); | 428 | hr = LoadSystemLibrary(L"mscoree.dll", &hModule); |
| 424 | 429 | ExitOnFailure(hr, "Failed to load mscoree.dll"); | |
| 425 | if (pfnCLRCreateInstance) | ||
| 426 | { | ||
| 427 | hr = pfnCLRCreateInstance(CLSID_CLRMetaHostPolicy, IID_ICLRMetaHostPolicy, reinterpret_cast<LPVOID*>(&pCLRMetaHostPolicy)); | ||
| 428 | if (E_NOTIMPL != hr) | ||
| 429 | { | ||
| 430 | ExitOnRootFailure(hr, "Failed to create instance of ICLRMetaHostPolicy."); | ||
| 431 | 430 | ||
| 432 | fFallbackToCorBindToCurrentRuntime = FALSE; | 431 | pfnCLRCreateInstance = reinterpret_cast<CLRCreateInstanceFnPtr>(::GetProcAddress(hModule, "CLRCreateInstance")); |
| 433 | } | ||
| 434 | } | ||
| 435 | 432 | ||
| 436 | if (fFallbackToCorBindToCurrentRuntime) | 433 | if (pfnCLRCreateInstance) |
| 434 | { | ||
| 435 | hr = pfnCLRCreateInstance(CLSID_CLRMetaHostPolicy, IID_ICLRMetaHostPolicy, reinterpret_cast<LPVOID*>(&pCLRMetaHostPolicy)); | ||
| 436 | if (E_NOTIMPL != hr) | ||
| 437 | { | 437 | { |
| 438 | pfnCorBindToCurrentRuntime = reinterpret_cast<PFN_CORBINDTOCURRENTRUNTIME>(::GetProcAddress(hModule, "CorBindToCurrentRuntime")); | 438 | ExitOnRootFailure(hr, "Failed to create instance of ICLRMetaHostPolicy."); |
| 439 | ExitOnNullWithLastError(pfnCorBindToCurrentRuntime, hr, "Failed to get procedure address for CorBindToCurrentRuntime."); | ||
| 440 | 439 | ||
| 441 | hr = pfnCorBindToCurrentRuntime(wzConfigPath, CLSID_CorRuntimeHost, IID_ICorRuntimeHost, reinterpret_cast<LPVOID*>(&vpCLRHost)); | 440 | fFallbackToCorBindToCurrentRuntime = FALSE; |
| 442 | ExitOnRootFailure(hr, "Failed to create the CLR host using the application configuration file path."); | ||
| 443 | } | 441 | } |
| 444 | else | 442 | } |
| 445 | { | ||
| 446 | |||
| 447 | hr = SHCreateStreamOnFileEx(wzConfigPath, STGM_READ | STGM_SHARE_DENY_WRITE, 0, FALSE, NULL, &pCfgStream); | ||
| 448 | ExitOnFailure(hr, "Failed to load bootstrapper config file from path: %ls", wzConfigPath); | ||
| 449 | 443 | ||
| 450 | hr = pCLRMetaHostPolicy->GetRequestedRuntime(METAHOST_POLICY_HIGHCOMPAT, NULL, pCfgStream, NULL, &cchVersion, NULL, NULL, &dwConfigFlags, IID_ICLRRuntimeInfo, reinterpret_cast<LPVOID*>(&pCLRRuntimeInfo)); | 444 | if (fFallbackToCorBindToCurrentRuntime) |
| 451 | ExitOnRootFailure(hr, "Failed to get the CLR runtime info using the application configuration file path."); | 445 | { |
| 446 | pfnCorBindToCurrentRuntime = reinterpret_cast<PFN_CORBINDTOCURRENTRUNTIME>(::GetProcAddress(hModule, "CorBindToCurrentRuntime")); | ||
| 447 | ExitOnNullWithLastError(pfnCorBindToCurrentRuntime, hr, "Failed to get procedure address for CorBindToCurrentRuntime."); | ||
| 452 | 448 | ||
| 453 | // .NET 4 RTM had a bug where it wouldn't set pcchVersion if pwzVersion was NULL. | 449 | hr = pfnCorBindToCurrentRuntime(pState->sczConfigPath, CLSID_CorRuntimeHost, IID_ICorRuntimeHost, reinterpret_cast<LPVOID*>(&pState->pCLRHost)); |
| 454 | if (!cchVersion) | 450 | ExitOnRootFailure(hr, "Failed to create the CLR host using the application configuration file path."); |
| 455 | { | 451 | } |
| 456 | hr = pCLRRuntimeInfo->GetVersionString(NULL, &cchVersion); | 452 | else |
| 457 | if (HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER) != hr) | 453 | { |
| 458 | { | ||
| 459 | ExitOnFailure(hr, "Failed to get the length of the CLR version string."); | ||
| 460 | } | ||
| 461 | } | ||
| 462 | 454 | ||
| 463 | hr = StrAlloc(&pwzVersion, cchVersion); | 455 | hr = SHCreateStreamOnFileEx(pState->sczConfigPath, STGM_READ | STGM_SHARE_DENY_WRITE, 0, FALSE, NULL, &pCfgStream); |
| 464 | ExitOnFailure(hr, "Failed to allocate the CLR version string."); | 456 | ExitOnFailure(hr, "Failed to load bootstrapper config file from path: %ls", pState->sczConfigPath); |
| 465 | 457 | ||
| 466 | hr = pCLRRuntimeInfo->GetVersionString(pwzVersion, &cchVersion); | 458 | hr = pCLRMetaHostPolicy->GetRequestedRuntime(METAHOST_POLICY_HIGHCOMPAT, NULL, pCfgStream, NULL, &cchVersion, NULL, NULL, &dwConfigFlags, IID_ICLRRuntimeInfo, reinterpret_cast<LPVOID*>(&pCLRRuntimeInfo)); |
| 467 | ExitOnFailure(hr, "Failed to get the CLR version string."); | 459 | ExitOnRootFailure(hr, "Failed to get the CLR runtime info using the application configuration file path."); |
| 468 | 460 | ||
| 469 | if (CSTR_EQUAL == CompareString(LOCALE_NEUTRAL, 0, L"v4.0.30319", -1, pwzVersion, cchVersion)) | 461 | // .NET 4 RTM had a bug where it wouldn't set pcchVersion if pwzVersion was NULL. |
| 462 | if (!cchVersion) | ||
| 463 | { | ||
| 464 | hr = pCLRRuntimeInfo->GetVersionString(NULL, &cchVersion); | ||
| 465 | if (HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER) != hr) | ||
| 470 | { | 466 | { |
| 471 | hr = VerifyNET4RuntimeIsSupported(); | 467 | ExitOnFailure(hr, "Failed to get the length of the CLR version string."); |
| 472 | ExitOnFailure(hr, "Found unsupported .NET 4 Runtime."); | ||
| 473 | } | 468 | } |
| 469 | } | ||
| 474 | 470 | ||
| 475 | if (METAHOST_CONFIG_FLAGS_LEGACY_V2_ACTIVATION_POLICY_TRUE == (METAHOST_CONFIG_FLAGS_LEGACY_V2_ACTIVATION_POLICY_MASK & dwConfigFlags)) | 471 | hr = StrAlloc(&pwzVersion, cchVersion); |
| 476 | { | 472 | ExitOnFailure(hr, "Failed to allocate the CLR version string."); |
| 477 | hr = pCLRRuntimeInfo->BindAsLegacyV2Runtime(); | ||
| 478 | ExitOnRootFailure(hr, "Failed to bind as legacy V2 runtime."); | ||
| 479 | } | ||
| 480 | 473 | ||
| 481 | hr = pCLRRuntimeInfo->GetInterface(CLSID_CorRuntimeHost, IID_ICorRuntimeHost, reinterpret_cast<LPVOID*>(&vpCLRHost)); | 474 | hr = pCLRRuntimeInfo->GetVersionString(pwzVersion, &cchVersion); |
| 482 | ExitOnRootFailure(hr, "Failed to get instance of ICorRuntimeHost."); | 475 | ExitOnFailure(hr, "Failed to get the CLR version string."); |
| 476 | |||
| 477 | if (CSTR_EQUAL == CompareString(LOCALE_NEUTRAL, 0, L"v4.0.30319", -1, pwzVersion, cchVersion)) | ||
| 478 | { | ||
| 479 | hr = VerifyNET4RuntimeIsSupported(); | ||
| 480 | ExitOnFailure(hr, "Found unsupported .NET 4 Runtime."); | ||
| 481 | } | ||
| 483 | 482 | ||
| 484 | // TODO: use ICLRRuntimeHost instead of ICorRuntimeHost on .NET 4 since the former is faster and the latter is deprecated | 483 | if (METAHOST_CONFIG_FLAGS_LEGACY_V2_ACTIVATION_POLICY_TRUE == (METAHOST_CONFIG_FLAGS_LEGACY_V2_ACTIVATION_POLICY_MASK & dwConfigFlags)) |
| 485 | //hr = pCLRRuntimeInfo->GetInterface(CLSID_CLRRuntimeHost, IID_ICLRRuntimeHost, reinterpret_cast<LPVOID*>(&pCLRRuntimeHost)); | 484 | { |
| 486 | //ExitOnRootFailure(hr, "Failed to get instance of ICLRRuntimeHost."); | 485 | hr = pCLRRuntimeInfo->BindAsLegacyV2Runtime(); |
| 486 | ExitOnRootFailure(hr, "Failed to bind as legacy V2 runtime."); | ||
| 487 | } | 487 | } |
| 488 | |||
| 489 | hr = pCLRRuntimeInfo->GetInterface(CLSID_CorRuntimeHost, IID_ICorRuntimeHost, reinterpret_cast<LPVOID*>(&pState->pCLRHost)); | ||
| 490 | ExitOnRootFailure(hr, "Failed to get instance of ICorRuntimeHost."); | ||
| 488 | } | 491 | } |
| 489 | 492 | ||
| 490 | vpCLRHost->AddRef(); | 493 | hr = pState->pCLRHost->Start(); |
| 491 | *ppCLRHost = vpCLRHost; | 494 | ExitOnRootFailure(hr, "Failed to start the CLR host."); |
| 492 | 495 | ||
| 493 | LExit: | 496 | LExit: |
| 494 | ReleaseStr(pwzVersion); | 497 | ReleaseStr(pwzVersion); |
| @@ -569,7 +572,7 @@ LExit: | |||
| 569 | } | 572 | } |
| 570 | 573 | ||
| 571 | static HRESULT CreatePrerequisiteBA( | 574 | static HRESULT CreatePrerequisiteBA( |
| 572 | __in HRESULT hrHostInitialization, | 575 | __in MBASTATE* pState, |
| 573 | __in IBootstrapperEngine* pEngine, | 576 | __in IBootstrapperEngine* pEngine, |
| 574 | __in const BOOTSTRAPPER_CREATE_ARGS* pArgs, | 577 | __in const BOOTSTRAPPER_CREATE_ARGS* pArgs, |
| 575 | __inout BOOTSTRAPPER_CREATE_RESULTS* pResults | 578 | __inout BOOTSTRAPPER_CREATE_RESULTS* pResults |
| @@ -579,19 +582,19 @@ static HRESULT CreatePrerequisiteBA( | |||
| 579 | LPWSTR sczMbapreqPath = NULL; | 582 | LPWSTR sczMbapreqPath = NULL; |
| 580 | HMODULE hModule = NULL; | 583 | HMODULE hModule = NULL; |
| 581 | 584 | ||
| 582 | hr = PathRelativeToModule(&sczMbapreqPath, L"mbapreq.dll", vhInstance); | 585 | hr = PathConcat(pState->sczAppBase, L"mbapreq.dll", &sczMbapreqPath); |
| 583 | ExitOnFailure(hr, "Failed to get path to pre-requisite BA."); | 586 | BalExitOnFailure(hr, "Failed to get path to pre-requisite BA."); |
| 584 | 587 | ||
| 585 | hModule = ::LoadLibraryW(sczMbapreqPath); | 588 | hModule = ::LoadLibraryExW(sczMbapreqPath, NULL, LOAD_WITH_ALTERED_SEARCH_PATH); |
| 586 | ExitOnNullWithLastError(hModule, hr, "Failed to load pre-requisite BA DLL."); | 589 | ExitOnNullWithLastError(hModule, hr, "Failed to load pre-requisite BA DLL."); |
| 587 | 590 | ||
| 588 | PFN_MBAPREQ_BOOTSTRAPPER_APPLICATION_CREATE pfnCreate = reinterpret_cast<PFN_MBAPREQ_BOOTSTRAPPER_APPLICATION_CREATE>(::GetProcAddress(hModule, "MbaPrereqBootstrapperApplicationCreate")); | 591 | PFN_PREQ_BOOTSTRAPPER_APPLICATION_CREATE pfnCreate = reinterpret_cast<PFN_PREQ_BOOTSTRAPPER_APPLICATION_CREATE>(::GetProcAddress(hModule, "PrereqBootstrapperApplicationCreate")); |
| 589 | ExitOnNullWithLastError(pfnCreate, hr, "Failed to get MbaPrereqBootstrapperApplicationCreate entry-point from: %ls", sczMbapreqPath); | 592 | ExitOnNullWithLastError(pfnCreate, hr, "Failed to get PrereqBootstrapperApplicationCreate entry-point from: %ls", sczMbapreqPath); |
| 590 | 593 | ||
| 591 | hr = pfnCreate(hrHostInitialization, pEngine, pArgs, pResults); | 594 | hr = pfnCreate(&pState->prereqData, pEngine, pArgs, pResults); |
| 592 | ExitOnFailure(hr, "Failed to create prequisite bootstrapper app."); | 595 | ExitOnFailure(hr, "Failed to create prequisite bootstrapper app."); |
| 593 | 596 | ||
| 594 | vhMbapreqModule = hModule; | 597 | pState->hMbapreqModule = hModule; |
| 595 | hModule = NULL; | 598 | hModule = NULL; |
| 596 | 599 | ||
| 597 | LExit: | 600 | LExit: |
diff --git a/src/ext/Bal/mbahost/mbahost.h b/src/ext/Bal/mbahost/mbahost.h new file mode 100644 index 00000000..19cf8311 --- /dev/null +++ b/src/ext/Bal/mbahost/mbahost.h | |||
| @@ -0,0 +1,17 @@ | |||
| 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 | struct MBASTATE | ||
| 6 | { | ||
| 7 | BOOL fInitialized; | ||
| 8 | BOOL fInitializedRuntime; | ||
| 9 | BOOL fStoppedRuntime; | ||
| 10 | HINSTANCE hInstance; | ||
| 11 | LPWSTR sczAppBase; | ||
| 12 | LPWSTR sczConfigPath; | ||
| 13 | mscorlib::_AppDomain* pAppDomain; | ||
| 14 | ICorRuntimeHost* pCLRHost; | ||
| 15 | HMODULE hMbapreqModule; | ||
| 16 | PREQBA_DATA prereqData; | ||
| 17 | }; | ||
diff --git a/src/ext/Bal/mbahost/mbahost.vcxproj b/src/ext/Bal/mbahost/mbahost.vcxproj index cd90776b..a8fbbcc2 100644 --- a/src/ext/Bal/mbahost/mbahost.vcxproj +++ b/src/ext/Bal/mbahost/mbahost.vcxproj | |||
| @@ -41,7 +41,7 @@ | |||
| 41 | <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> | 41 | <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> |
| 42 | 42 | ||
| 43 | <PropertyGroup> | 43 | <PropertyGroup> |
| 44 | <ProjectAdditionalIncludeDirectories>$(BaseOutputPath)obj</ProjectAdditionalIncludeDirectories> | 44 | <ProjectAdditionalIncludeDirectories>$(BaseOutputPath)obj;..\wixstdba\inc</ProjectAdditionalIncludeDirectories> |
| 45 | <ProjectAdditionalLinkLibraries>shlwapi.lib</ProjectAdditionalLinkLibraries> | 45 | <ProjectAdditionalLinkLibraries>shlwapi.lib</ProjectAdditionalLinkLibraries> |
| 46 | </PropertyGroup> | 46 | </PropertyGroup> |
| 47 | 47 | ||
| @@ -52,6 +52,7 @@ | |||
| 52 | </ClCompile> | 52 | </ClCompile> |
| 53 | </ItemGroup> | 53 | </ItemGroup> |
| 54 | <ItemGroup> | 54 | <ItemGroup> |
| 55 | <ClInclude Include="mbahost.h" /> | ||
| 55 | <ClInclude Include="precomp.h" /> | 56 | <ClInclude Include="precomp.h" /> |
| 56 | </ItemGroup> | 57 | </ItemGroup> |
| 57 | <ItemGroup> | 58 | <ItemGroup> |
diff --git a/src/ext/Bal/mbahost/precomp.h b/src/ext/Bal/mbahost/precomp.h index d29a23f3..a07f2fc0 100644 --- a/src/ext/Bal/mbahost/precomp.h +++ b/src/ext/Bal/mbahost/precomp.h | |||
| @@ -16,10 +16,15 @@ | |||
| 16 | #include <strutil.h> | 16 | #include <strutil.h> |
| 17 | #include <xmlutil.h> | 17 | #include <xmlutil.h> |
| 18 | 18 | ||
| 19 | #include "BootstrapperEngine.h" | 19 | #include <BootstrapperEngine.h> |
| 20 | #include "BootstrapperApplication.h" | 20 | #include <BootstrapperApplication.h> |
| 21 | #include "IBootstrapperEngine.h" | 21 | #include <IBootstrapperEngine.h> |
| 22 | #include "IBootstrapperApplication.h" | 22 | #include <IBootstrapperApplication.h> |
| 23 | #include "IBootstrapperApplicationFactory.h" | 23 | #include <IBootstrapperApplicationFactory.h> |
| 24 | 24 | ||
| 25 | #include "balutil.h" | 25 | #include <balutil.h> |
| 26 | |||
| 27 | #include <preqba.h> | ||
| 28 | #include <WixToolset.Mba.Host.h> // includes the generated assembly name macros. | ||
| 29 | |||
| 30 | #include "mbahost.h" | ||
diff --git a/src/ext/Bal/test/examples/TestEngine/ReloadEngine.cpp b/src/ext/Bal/test/examples/TestEngine/ReloadEngine.cpp index 46fd9afa..3f290b86 100644 --- a/src/ext/Bal/test/examples/TestEngine/ReloadEngine.cpp +++ b/src/ext/Bal/test/examples/TestEngine/ReloadEngine.cpp | |||
| @@ -31,7 +31,7 @@ HRESULT RunReloadEngine( | |||
| 31 | hr = pTestEngine->SendShutdownEvent(BOOTSTRAPPER_SHUTDOWN_ACTION_RELOAD_BOOTSTRAPPER); | 31 | hr = pTestEngine->SendShutdownEvent(BOOTSTRAPPER_SHUTDOWN_ACTION_RELOAD_BOOTSTRAPPER); |
| 32 | ConsoleExitOnFailure(hr, CONSOLE_COLOR_RED, "BA returned failure for OnShutdown."); | 32 | ConsoleExitOnFailure(hr, CONSOLE_COLOR_RED, "BA returned failure for OnShutdown."); |
| 33 | 33 | ||
| 34 | pTestEngine->UnloadBA(); | 34 | pTestEngine->UnloadBA(TRUE); |
| 35 | 35 | ||
| 36 | hr = pTestEngine->LoadBA(wzBAFilePath); | 36 | hr = pTestEngine->LoadBA(wzBAFilePath); |
| 37 | ConsoleExitOnFailure(hr, CONSOLE_COLOR_RED, "Failed to load BA."); | 37 | ConsoleExitOnFailure(hr, CONSOLE_COLOR_RED, "Failed to load BA."); |
| @@ -48,7 +48,7 @@ HRESULT RunReloadEngine( | |||
| 48 | hr = pTestEngine->SendShutdownEvent(BOOTSTRAPPER_SHUTDOWN_ACTION_RESTART); | 48 | hr = pTestEngine->SendShutdownEvent(BOOTSTRAPPER_SHUTDOWN_ACTION_RESTART); |
| 49 | ConsoleExitOnFailure(hr, CONSOLE_COLOR_RED, "BA returned failure for OnShutdown."); | 49 | ConsoleExitOnFailure(hr, CONSOLE_COLOR_RED, "BA returned failure for OnShutdown."); |
| 50 | 50 | ||
| 51 | pTestEngine->UnloadBA(); | 51 | pTestEngine->UnloadBA(FALSE); |
| 52 | 52 | ||
| 53 | LExit: | 53 | LExit: |
| 54 | return hr; | 54 | return hr; |
diff --git a/src/ext/Bal/test/examples/TestEngine/ShutdownEngine.cpp b/src/ext/Bal/test/examples/TestEngine/ShutdownEngine.cpp index 3b876e4e..b5c8c462 100644 --- a/src/ext/Bal/test/examples/TestEngine/ShutdownEngine.cpp +++ b/src/ext/Bal/test/examples/TestEngine/ShutdownEngine.cpp | |||
| @@ -31,7 +31,7 @@ HRESULT RunShutdownEngine( | |||
| 31 | hr = pTestEngine->SendShutdownEvent(BOOTSTRAPPER_SHUTDOWN_ACTION_RELOAD_BOOTSTRAPPER); | 31 | hr = pTestEngine->SendShutdownEvent(BOOTSTRAPPER_SHUTDOWN_ACTION_RELOAD_BOOTSTRAPPER); |
| 32 | ConsoleExitOnFailure(hr, CONSOLE_COLOR_RED, "BA returned failure for OnShutdown."); | 32 | ConsoleExitOnFailure(hr, CONSOLE_COLOR_RED, "BA returned failure for OnShutdown."); |
| 33 | 33 | ||
| 34 | pTestEngine->UnloadBA(); | 34 | pTestEngine->UnloadBA(FALSE); |
| 35 | 35 | ||
| 36 | LExit: | 36 | LExit: |
| 37 | return hr; | 37 | return hr; |
diff --git a/src/ext/Bal/test/examples/TestEngine/TestEngine.cpp b/src/ext/Bal/test/examples/TestEngine/TestEngine.cpp index 4c7ec1c3..5c6ed398 100644 --- a/src/ext/Bal/test/examples/TestEngine/TestEngine.cpp +++ b/src/ext/Bal/test/examples/TestEngine/TestEngine.cpp | |||
| @@ -147,10 +147,18 @@ HRESULT TestEngine::SimulateQuit( | |||
| 147 | return BAEngineQuit(&args, &results); | 147 | return BAEngineQuit(&args, &results); |
| 148 | } | 148 | } |
| 149 | 149 | ||
| 150 | void TestEngine::UnloadBA() | 150 | void TestEngine::UnloadBA( |
| 151 | __in BOOL fReload | ||
| 152 | ) | ||
| 151 | { | 153 | { |
| 152 | PFN_BOOTSTRAPPER_APPLICATION_DESTROY pfnDestroy = NULL; | 154 | PFN_BOOTSTRAPPER_APPLICATION_DESTROY pfnDestroy = NULL; |
| 153 | BOOL fDisableUnloading = m_pCreateResults && m_pCreateResults->fDisableUnloading; | 155 | BOOTSTRAPPER_DESTROY_ARGS args = { }; |
| 156 | BOOTSTRAPPER_DESTROY_RESULTS results = { }; | ||
| 157 | |||
| 158 | args.cbSize = sizeof(args); | ||
| 159 | args.fReload = fReload; | ||
| 160 | |||
| 161 | results.cbSize = sizeof(results); | ||
| 154 | 162 | ||
| 155 | ReleaseNullMem(m_pCreateResults); | 163 | ReleaseNullMem(m_pCreateResults); |
| 156 | 164 | ||
| @@ -158,12 +166,12 @@ void TestEngine::UnloadBA() | |||
| 158 | 166 | ||
| 159 | if (pfnDestroy) | 167 | if (pfnDestroy) |
| 160 | { | 168 | { |
| 161 | pfnDestroy(); | 169 | pfnDestroy(&args, &results); |
| 162 | } | 170 | } |
| 163 | 171 | ||
| 164 | if (m_hBAModule) | 172 | if (m_hBAModule) |
| 165 | { | 173 | { |
| 166 | if (!fDisableUnloading) | 174 | if (!results.fDisableUnloading) |
| 167 | { | 175 | { |
| 168 | ::FreeLibrary(m_hBAModule); | 176 | ::FreeLibrary(m_hBAModule); |
| 169 | } | 177 | } |
diff --git a/src/ext/Bal/test/examples/TestEngine/TestEngine.h b/src/ext/Bal/test/examples/TestEngine/TestEngine.h index 44e813bd..248e979a 100644 --- a/src/ext/Bal/test/examples/TestEngine/TestEngine.h +++ b/src/ext/Bal/test/examples/TestEngine/TestEngine.h | |||
| @@ -44,7 +44,9 @@ public: | |||
| 44 | __in DWORD dwExitCode | 44 | __in DWORD dwExitCode |
| 45 | ); | 45 | ); |
| 46 | 46 | ||
| 47 | void UnloadBA(); | 47 | void UnloadBA( |
| 48 | __in BOOL fReload | ||
| 49 | ); | ||
| 48 | 50 | ||
| 49 | private: | 51 | private: |
| 50 | HRESULT BAEngineLog( | 52 | HRESULT BAEngineLog( |
| @@ -77,4 +79,4 @@ private: | |||
| 77 | HMODULE m_hBAModule; | 79 | HMODULE m_hBAModule; |
| 78 | BOOTSTRAPPER_CREATE_RESULTS* m_pCreateResults; | 80 | BOOTSTRAPPER_CREATE_RESULTS* m_pCreateResults; |
| 79 | DWORD m_dwThreadId; | 81 | DWORD m_dwThreadId; |
| 80 | }; \ No newline at end of file | 82 | }; |
diff --git a/src/ext/Bal/test/examples/TestEngine/WaitForQuitEngine.cpp b/src/ext/Bal/test/examples/TestEngine/WaitForQuitEngine.cpp index 2f80ba75..64b618f4 100644 --- a/src/ext/Bal/test/examples/TestEngine/WaitForQuitEngine.cpp +++ b/src/ext/Bal/test/examples/TestEngine/WaitForQuitEngine.cpp | |||
| @@ -28,7 +28,7 @@ HRESULT RunWaitForQuitEngine( | |||
| 28 | hr = pTestEngine->SendShutdownEvent(BOOTSTRAPPER_SHUTDOWN_ACTION_RELOAD_BOOTSTRAPPER); | 28 | hr = pTestEngine->SendShutdownEvent(BOOTSTRAPPER_SHUTDOWN_ACTION_RELOAD_BOOTSTRAPPER); |
| 29 | ConsoleExitOnFailure(hr, CONSOLE_COLOR_RED, "BA returned failure for OnShutdown."); | 29 | ConsoleExitOnFailure(hr, CONSOLE_COLOR_RED, "BA returned failure for OnShutdown."); |
| 30 | 30 | ||
| 31 | pTestEngine->UnloadBA(); | 31 | pTestEngine->UnloadBA(FALSE); |
| 32 | 32 | ||
| 33 | LExit: | 33 | LExit: |
| 34 | return hr; | 34 | return hr; |
diff --git a/src/ext/Bal/wixstdba/Resources/1028/mbapreq.wxl b/src/ext/Bal/wixstdba/Resources/1028/mbapreq.wxl index 19e79bac..f574bb9b 100644 --- a/src/ext/Bal/wixstdba/Resources/1028/mbapreq.wxl +++ b/src/ext/Bal/wixstdba/Resources/1028/mbapreq.wxl | |||
| @@ -29,5 +29,6 @@ | |||
| 29 | <String Id="FailureRestartButton">重新啟動(&R)</String> | 29 | <String Id="FailureRestartButton">重新啟動(&R)</String> |
| 30 | <String Id="FailureCloseButton">關閉(&C)</String> | 30 | <String Id="FailureCloseButton">關閉(&C)</String> |
| 31 | <String Id="NET452WIN7RTMErrorMessage">[WixBundleName] cannot run on Windows 7 RTM with .NET 4.5.2 installed. Install Windows 7 SP1 to run in a supported environment.</String> | 31 | <String Id="NET452WIN7RTMErrorMessage">[WixBundleName] cannot run on Windows 7 RTM with .NET 4.5.2 installed. Install Windows 7 SP1 to run in a supported environment.</String> |
| 32 | <String Id="PREREQBAINFINITELOOPErrorMessage">[WixBundleName] failed to load the .NET Framework runtime even though all of the prerequisites are installed.</String> | ||
| 32 | <String Id="ErrorFailNoActionReboot">No action was taken as a system reboot is required.</String> | 33 | <String Id="ErrorFailNoActionReboot">No action was taken as a system reboot is required.</String> |
| 33 | </WixLocalization> | 34 | </WixLocalization> |
diff --git a/src/ext/Bal/wixstdba/Resources/1029/mbapreq.wxl b/src/ext/Bal/wixstdba/Resources/1029/mbapreq.wxl index e6e6f469..11d9f85a 100644 --- a/src/ext/Bal/wixstdba/Resources/1029/mbapreq.wxl +++ b/src/ext/Bal/wixstdba/Resources/1029/mbapreq.wxl | |||
| @@ -32,5 +32,6 @@ | |||
| 32 | <String Id="FailureRestartButton">&Restartovat</String> | 32 | <String Id="FailureRestartButton">&Restartovat</String> |
| 33 | <String Id="FailureCloseButton">&Zavřít</String> | 33 | <String Id="FailureCloseButton">&Zavřít</String> |
| 34 | <String Id="NET452WIN7RTMErrorMessage">[WixBundleName] cannot run on Windows 7 RTM with .NET 4.5.2 installed. Install Windows 7 SP1 to run in a supported environment.</String> | 34 | <String Id="NET452WIN7RTMErrorMessage">[WixBundleName] cannot run on Windows 7 RTM with .NET 4.5.2 installed. Install Windows 7 SP1 to run in a supported environment.</String> |
| 35 | <String Id="PREREQBAINFINITELOOPErrorMessage">[WixBundleName] failed to load the .NET Framework runtime even though all of the prerequisites are installed.</String> | ||
| 35 | <String Id="ErrorFailNoActionReboot">No action was taken as a system reboot is required.</String> | 36 | <String Id="ErrorFailNoActionReboot">No action was taken as a system reboot is required.</String> |
| 36 | </WixLocalization> | 37 | </WixLocalization> |
diff --git a/src/ext/Bal/wixstdba/Resources/1030/mbapreq.wxl b/src/ext/Bal/wixstdba/Resources/1030/mbapreq.wxl index 98518edc..50412e12 100644 --- a/src/ext/Bal/wixstdba/Resources/1030/mbapreq.wxl +++ b/src/ext/Bal/wixstdba/Resources/1030/mbapreq.wxl | |||
| @@ -32,5 +32,6 @@ | |||
| 32 | <String Id="FailureRestartButton">&Genstart</String> | 32 | <String Id="FailureRestartButton">&Genstart</String> |
| 33 | <String Id="FailureCloseButton">&Luk</String> | 33 | <String Id="FailureCloseButton">&Luk</String> |
| 34 | <String Id="NET452WIN7RTMErrorMessage">[WixBundleName] cannot run on Windows 7 RTM with .NET 4.5.2 installed. Install Windows 7 SP1 to run in a supported environment.</String> | 34 | <String Id="NET452WIN7RTMErrorMessage">[WixBundleName] cannot run on Windows 7 RTM with .NET 4.5.2 installed. Install Windows 7 SP1 to run in a supported environment.</String> |
| 35 | <String Id="PREREQBAINFINITELOOPErrorMessage">[WixBundleName] failed to load the .NET Framework runtime even though all of the prerequisites are installed.</String> | ||
| 35 | <String Id="ErrorFailNoActionReboot">No action was taken as a system reboot is required.</String> | 36 | <String Id="ErrorFailNoActionReboot">No action was taken as a system reboot is required.</String> |
| 36 | </WixLocalization> | 37 | </WixLocalization> |
diff --git a/src/ext/Bal/wixstdba/Resources/1031/mbapreq.wxl b/src/ext/Bal/wixstdba/Resources/1031/mbapreq.wxl index e60b0c9a..4df66298 100644 --- a/src/ext/Bal/wixstdba/Resources/1031/mbapreq.wxl +++ b/src/ext/Bal/wixstdba/Resources/1031/mbapreq.wxl | |||
| @@ -35,5 +35,6 @@ | |||
| 35 | <String Id="FailureRestartButton">&Neu starten</String> | 35 | <String Id="FailureRestartButton">&Neu starten</String> |
| 36 | <String Id="FailureCloseButton">&Schließen</String> | 36 | <String Id="FailureCloseButton">&Schließen</String> |
| 37 | <String Id="NET452WIN7RTMErrorMessage">[WixBundleName] cannot run on Windows 7 RTM with .NET 4.5.2 installed. Install Windows 7 SP1 to run in a supported environment.</String> | 37 | <String Id="NET452WIN7RTMErrorMessage">[WixBundleName] cannot run on Windows 7 RTM with .NET 4.5.2 installed. Install Windows 7 SP1 to run in a supported environment.</String> |
| 38 | <String Id="PREREQBAINFINITELOOPErrorMessage">[WixBundleName] failed to load the .NET Framework runtime even though all of the prerequisites are installed.</String> | ||
| 38 | <String Id="ErrorFailNoActionReboot">No action was taken as a system reboot is required.</String> | 39 | <String Id="ErrorFailNoActionReboot">No action was taken as a system reboot is required.</String> |
| 39 | </WixLocalization> | 40 | </WixLocalization> |
diff --git a/src/ext/Bal/wixstdba/Resources/1032/mbapreq.wxl b/src/ext/Bal/wixstdba/Resources/1032/mbapreq.wxl index ea5dc130..05ac553f 100644 --- a/src/ext/Bal/wixstdba/Resources/1032/mbapreq.wxl +++ b/src/ext/Bal/wixstdba/Resources/1032/mbapreq.wxl | |||
| @@ -34,5 +34,6 @@ | |||
| 34 | <String Id="FailureRestartButton">&Επανεκκίνηση</String> | 34 | <String Id="FailureRestartButton">&Επανεκκίνηση</String> |
| 35 | <String Id="FailureCloseButton">&Κλείσιμο</String> | 35 | <String Id="FailureCloseButton">&Κλείσιμο</String> |
| 36 | <String Id="NET452WIN7RTMErrorMessage">[WixBundleName] cannot run on Windows 7 RTM with .NET 4.5.2 installed. Install Windows 7 SP1 to run in a supported environment.</String> | 36 | <String Id="NET452WIN7RTMErrorMessage">[WixBundleName] cannot run on Windows 7 RTM with .NET 4.5.2 installed. Install Windows 7 SP1 to run in a supported environment.</String> |
| 37 | <String Id="PREREQBAINFINITELOOPErrorMessage">[WixBundleName] failed to load the .NET Framework runtime even though all of the prerequisites are installed.</String> | ||
| 37 | <String Id="ErrorFailNoActionReboot">No action was taken as a system reboot is required.</String> | 38 | <String Id="ErrorFailNoActionReboot">No action was taken as a system reboot is required.</String> |
| 38 | </WixLocalization> | 39 | </WixLocalization> |
diff --git a/src/ext/Bal/wixstdba/Resources/1035/mbapreq.wxl b/src/ext/Bal/wixstdba/Resources/1035/mbapreq.wxl index 803cacf5..2b7c0519 100644 --- a/src/ext/Bal/wixstdba/Resources/1035/mbapreq.wxl +++ b/src/ext/Bal/wixstdba/Resources/1035/mbapreq.wxl | |||
| @@ -32,5 +32,6 @@ | |||
| 32 | <String Id="FailureRestartButton">&Käynnistä uudelleen</String> | 32 | <String Id="FailureRestartButton">&Käynnistä uudelleen</String> |
| 33 | <String Id="FailureCloseButton">&Sulje</String> | 33 | <String Id="FailureCloseButton">&Sulje</String> |
| 34 | <String Id="NET452WIN7RTMErrorMessage">[WixBundleName] cannot run on Windows 7 RTM with .NET 4.5.2 installed. Install Windows 7 SP1 to run in a supported environment.</String> | 34 | <String Id="NET452WIN7RTMErrorMessage">[WixBundleName] cannot run on Windows 7 RTM with .NET 4.5.2 installed. Install Windows 7 SP1 to run in a supported environment.</String> |
| 35 | <String Id="PREREQBAINFINITELOOPErrorMessage">[WixBundleName] failed to load the .NET Framework runtime even though all of the prerequisites are installed.</String> | ||
| 35 | <String Id="ErrorFailNoActionReboot">No action was taken as a system reboot is required.</String> | 36 | <String Id="ErrorFailNoActionReboot">No action was taken as a system reboot is required.</String> |
| 36 | </WixLocalization> | 37 | </WixLocalization> |
diff --git a/src/ext/Bal/wixstdba/Resources/1036/mbapreq.wxl b/src/ext/Bal/wixstdba/Resources/1036/mbapreq.wxl index fb927f2b..3ae1cbd9 100644 --- a/src/ext/Bal/wixstdba/Resources/1036/mbapreq.wxl +++ b/src/ext/Bal/wixstdba/Resources/1036/mbapreq.wxl | |||
| @@ -32,5 +32,6 @@ | |||
| 32 | <String Id="FailureRestartButton">&Redémarrer</String> | 32 | <String Id="FailureRestartButton">&Redémarrer</String> |
| 33 | <String Id="FailureCloseButton">&Fermer</String> | 33 | <String Id="FailureCloseButton">&Fermer</String> |
| 34 | <String Id="NET452WIN7RTMErrorMessage">[WixBundleName] cannot run on Windows 7 RTM with .NET 4.5.2 installed. Install Windows 7 SP1 to run in a supported environment.</String> | 34 | <String Id="NET452WIN7RTMErrorMessage">[WixBundleName] cannot run on Windows 7 RTM with .NET 4.5.2 installed. Install Windows 7 SP1 to run in a supported environment.</String> |
| 35 | <String Id="PREREQBAINFINITELOOPErrorMessage">[WixBundleName] failed to load the .NET Framework runtime even though all of the prerequisites are installed.</String> | ||
| 35 | <String Id="ErrorFailNoActionReboot">No action was taken as a system reboot is required.</String> | 36 | <String Id="ErrorFailNoActionReboot">No action was taken as a system reboot is required.</String> |
| 36 | </WixLocalization> | 37 | </WixLocalization> |
diff --git a/src/ext/Bal/wixstdba/Resources/1038/mbapreq.wxl b/src/ext/Bal/wixstdba/Resources/1038/mbapreq.wxl index 78c008b2..f491d6f2 100644 --- a/src/ext/Bal/wixstdba/Resources/1038/mbapreq.wxl +++ b/src/ext/Bal/wixstdba/Resources/1038/mbapreq.wxl | |||
| @@ -32,5 +32,6 @@ | |||
| 32 | <String Id="FailureRestartButton">&Újraindítás</String> | 32 | <String Id="FailureRestartButton">&Újraindítás</String> |
| 33 | <String Id="FailureCloseButton">&Bezárás</String> | 33 | <String Id="FailureCloseButton">&Bezárás</String> |
| 34 | <String Id="NET452WIN7RTMErrorMessage">[WixBundleName] cannot run on Windows 7 RTM with .NET 4.5.2 installed. Install Windows 7 SP1 to run in a supported environment.</String> | 34 | <String Id="NET452WIN7RTMErrorMessage">[WixBundleName] cannot run on Windows 7 RTM with .NET 4.5.2 installed. Install Windows 7 SP1 to run in a supported environment.</String> |
| 35 | <String Id="PREREQBAINFINITELOOPErrorMessage">[WixBundleName] failed to load the .NET Framework runtime even though all of the prerequisites are installed.</String> | ||
| 35 | <String Id="ErrorFailNoActionReboot">No action was taken as a system reboot is required.</String> | 36 | <String Id="ErrorFailNoActionReboot">No action was taken as a system reboot is required.</String> |
| 36 | </WixLocalization> | 37 | </WixLocalization> |
diff --git a/src/ext/Bal/wixstdba/Resources/1040/mbapreq.wxl b/src/ext/Bal/wixstdba/Resources/1040/mbapreq.wxl index b7966340..50bc73e8 100644 --- a/src/ext/Bal/wixstdba/Resources/1040/mbapreq.wxl +++ b/src/ext/Bal/wixstdba/Resources/1040/mbapreq.wxl | |||
| @@ -33,5 +33,6 @@ | |||
| 33 | <String Id="FailureRestartButton">&Riavvia</String> | 33 | <String Id="FailureRestartButton">&Riavvia</String> |
| 34 | <String Id="FailureCloseButton">&Chiudi</String> | 34 | <String Id="FailureCloseButton">&Chiudi</String> |
| 35 | <String Id="NET452WIN7RTMErrorMessage">[WixBundleName] cannot run on Windows 7 RTM with .NET 4.5.2 installed. Install Windows 7 SP1 to run in a supported environment.</String> | 35 | <String Id="NET452WIN7RTMErrorMessage">[WixBundleName] cannot run on Windows 7 RTM with .NET 4.5.2 installed. Install Windows 7 SP1 to run in a supported environment.</String> |
| 36 | <String Id="PREREQBAINFINITELOOPErrorMessage">[WixBundleName] failed to load the .NET Framework runtime even though all of the prerequisites are installed.</String> | ||
| 36 | <String Id="ErrorFailNoActionReboot">No action was taken as a system reboot is required.</String> | 37 | <String Id="ErrorFailNoActionReboot">No action was taken as a system reboot is required.</String> |
| 37 | </WixLocalization> | 38 | </WixLocalization> |
diff --git a/src/ext/Bal/wixstdba/Resources/1041/mbapreq.wxl b/src/ext/Bal/wixstdba/Resources/1041/mbapreq.wxl index 9b7aa323..106c704a 100644 --- a/src/ext/Bal/wixstdba/Resources/1041/mbapreq.wxl +++ b/src/ext/Bal/wixstdba/Resources/1041/mbapreq.wxl | |||
| @@ -29,5 +29,6 @@ | |||
| 29 | <String Id="FailureRestartButton">再起動(&R)</String> | 29 | <String Id="FailureRestartButton">再起動(&R)</String> |
| 30 | <String Id="FailureCloseButton">閉じる(&C)</String> | 30 | <String Id="FailureCloseButton">閉じる(&C)</String> |
| 31 | <String Id="NET452WIN7RTMErrorMessage">[WixBundleName] cannot run on Windows 7 RTM with .NET 4.5.2 installed. Install Windows 7 SP1 to run in a supported environment.</String> | 31 | <String Id="NET452WIN7RTMErrorMessage">[WixBundleName] cannot run on Windows 7 RTM with .NET 4.5.2 installed. Install Windows 7 SP1 to run in a supported environment.</String> |
| 32 | <String Id="PREREQBAINFINITELOOPErrorMessage">[WixBundleName] failed to load the .NET Framework runtime even though all of the prerequisites are installed.</String> | ||
| 32 | <String Id="ErrorFailNoActionReboot">No action was taken as a system reboot is required.</String> | 33 | <String Id="ErrorFailNoActionReboot">No action was taken as a system reboot is required.</String> |
| 33 | </WixLocalization> | 34 | </WixLocalization> |
diff --git a/src/ext/Bal/wixstdba/Resources/1042/mbapreq.wxl b/src/ext/Bal/wixstdba/Resources/1042/mbapreq.wxl index 445d445b..24655588 100644 --- a/src/ext/Bal/wixstdba/Resources/1042/mbapreq.wxl +++ b/src/ext/Bal/wixstdba/Resources/1042/mbapreq.wxl | |||
| @@ -29,5 +29,6 @@ | |||
| 29 | <String Id="FailureRestartButton">다시 시작(&R)</String> | 29 | <String Id="FailureRestartButton">다시 시작(&R)</String> |
| 30 | <String Id="FailureCloseButton">닫기(&C)</String> | 30 | <String Id="FailureCloseButton">닫기(&C)</String> |
| 31 | <String Id="NET452WIN7RTMErrorMessage">[WixBundleName] cannot run on Windows 7 RTM with .NET 4.5.2 installed. Install Windows 7 SP1 to run in a supported environment.</String> | 31 | <String Id="NET452WIN7RTMErrorMessage">[WixBundleName] cannot run on Windows 7 RTM with .NET 4.5.2 installed. Install Windows 7 SP1 to run in a supported environment.</String> |
| 32 | <String Id="PREREQBAINFINITELOOPErrorMessage">[WixBundleName] failed to load the .NET Framework runtime even though all of the prerequisites are installed.</String> | ||
| 32 | <String Id="ErrorFailNoActionReboot">No action was taken as a system reboot is required.</String> | 33 | <String Id="ErrorFailNoActionReboot">No action was taken as a system reboot is required.</String> |
| 33 | </WixLocalization> | 34 | </WixLocalization> |
diff --git a/src/ext/Bal/wixstdba/Resources/1043/mbapreq.wxl b/src/ext/Bal/wixstdba/Resources/1043/mbapreq.wxl index 60ba996e..d2e572fc 100644 --- a/src/ext/Bal/wixstdba/Resources/1043/mbapreq.wxl +++ b/src/ext/Bal/wixstdba/Resources/1043/mbapreq.wxl | |||
| @@ -32,5 +32,6 @@ | |||
| 32 | <String Id="FailureRestartButton">&Opnieuw opstarten</String> | 32 | <String Id="FailureRestartButton">&Opnieuw opstarten</String> |
| 33 | <String Id="FailureCloseButton">&Sluiten</String> | 33 | <String Id="FailureCloseButton">&Sluiten</String> |
| 34 | <String Id="NET452WIN7RTMErrorMessage">[WixBundleName] cannot run on Windows 7 RTM with .NET 4.5.2 installed. Install Windows 7 SP1 to run in a supported environment.</String> | 34 | <String Id="NET452WIN7RTMErrorMessage">[WixBundleName] cannot run on Windows 7 RTM with .NET 4.5.2 installed. Install Windows 7 SP1 to run in a supported environment.</String> |
| 35 | <String Id="PREREQBAINFINITELOOPErrorMessage">[WixBundleName] failed to load the .NET Framework runtime even though all of the prerequisites are installed.</String> | ||
| 35 | <String Id="ErrorFailNoActionReboot">No action was taken as a system reboot is required.</String> | 36 | <String Id="ErrorFailNoActionReboot">No action was taken as a system reboot is required.</String> |
| 36 | </WixLocalization> | 37 | </WixLocalization> |
diff --git a/src/ext/Bal/wixstdba/Resources/1044/mbapreq.wxl b/src/ext/Bal/wixstdba/Resources/1044/mbapreq.wxl index e0718b8d..cb6036ee 100644 --- a/src/ext/Bal/wixstdba/Resources/1044/mbapreq.wxl +++ b/src/ext/Bal/wixstdba/Resources/1044/mbapreq.wxl | |||
| @@ -32,5 +32,6 @@ | |||
| 32 | <String Id="FailureRestartButton">&Start på nytt</String> | 32 | <String Id="FailureRestartButton">&Start på nytt</String> |
| 33 | <String Id="FailureCloseButton">&Lukk</String> | 33 | <String Id="FailureCloseButton">&Lukk</String> |
| 34 | <String Id="NET452WIN7RTMErrorMessage">[WixBundleName] cannot run on Windows 7 RTM with .NET 4.5.2 installed. Install Windows 7 SP1 to run in a supported environment.</String> | 34 | <String Id="NET452WIN7RTMErrorMessage">[WixBundleName] cannot run on Windows 7 RTM with .NET 4.5.2 installed. Install Windows 7 SP1 to run in a supported environment.</String> |
| 35 | <String Id="PREREQBAINFINITELOOPErrorMessage">[WixBundleName] failed to load the .NET Framework runtime even though all of the prerequisites are installed.</String> | ||
| 35 | <String Id="ErrorFailNoActionReboot">No action was taken as a system reboot is required.</String> | 36 | <String Id="ErrorFailNoActionReboot">No action was taken as a system reboot is required.</String> |
| 36 | </WixLocalization> | 37 | </WixLocalization> |
diff --git a/src/ext/Bal/wixstdba/Resources/1045/mbapreq.wxl b/src/ext/Bal/wixstdba/Resources/1045/mbapreq.wxl index 8b4eb758..41832b13 100644 --- a/src/ext/Bal/wixstdba/Resources/1045/mbapreq.wxl +++ b/src/ext/Bal/wixstdba/Resources/1045/mbapreq.wxl | |||
| @@ -32,5 +32,6 @@ | |||
| 32 | <String Id="FailureRestartButton">&Uruchom ponownie</String> | 32 | <String Id="FailureRestartButton">&Uruchom ponownie</String> |
| 33 | <String Id="FailureCloseButton">&Zamknij</String> | 33 | <String Id="FailureCloseButton">&Zamknij</String> |
| 34 | <String Id="NET452WIN7RTMErrorMessage">[WixBundleName] cannot run on Windows 7 RTM with .NET 4.5.2 installed. Install Windows 7 SP1 to run in a supported environment.</String> | 34 | <String Id="NET452WIN7RTMErrorMessage">[WixBundleName] cannot run on Windows 7 RTM with .NET 4.5.2 installed. Install Windows 7 SP1 to run in a supported environment.</String> |
| 35 | <String Id="PREREQBAINFINITELOOPErrorMessage">[WixBundleName] failed to load the .NET Framework runtime even though all of the prerequisites are installed.</String> | ||
| 35 | <String Id="ErrorFailNoActionReboot">No action was taken as a system reboot is required.</String> | 36 | <String Id="ErrorFailNoActionReboot">No action was taken as a system reboot is required.</String> |
| 36 | </WixLocalization> | 37 | </WixLocalization> |
diff --git a/src/ext/Bal/wixstdba/Resources/1046/mbapreq.wxl b/src/ext/Bal/wixstdba/Resources/1046/mbapreq.wxl index 0155eb39..08968f93 100644 --- a/src/ext/Bal/wixstdba/Resources/1046/mbapreq.wxl +++ b/src/ext/Bal/wixstdba/Resources/1046/mbapreq.wxl | |||
| @@ -31,5 +31,6 @@ | |||
| 31 | <String Id="FailureRestartButton">&Reiniciar</String> | 31 | <String Id="FailureRestartButton">&Reiniciar</String> |
| 32 | <String Id="FailureCloseButton">&Fechar</String> | 32 | <String Id="FailureCloseButton">&Fechar</String> |
| 33 | <String Id="NET452WIN7RTMErrorMessage">[WixBundleName] cannot run on Windows 7 RTM with .NET 4.5.2 installed. Install Windows 7 SP1 to run in a supported environment.</String> | 33 | <String Id="NET452WIN7RTMErrorMessage">[WixBundleName] cannot run on Windows 7 RTM with .NET 4.5.2 installed. Install Windows 7 SP1 to run in a supported environment.</String> |
| 34 | <String Id="PREREQBAINFINITELOOPErrorMessage">[WixBundleName] failed to load the .NET Framework runtime even though all of the prerequisites are installed.</String> | ||
| 34 | <String Id="ErrorFailNoActionReboot">No action was taken as a system reboot is required.</String> | 35 | <String Id="ErrorFailNoActionReboot">No action was taken as a system reboot is required.</String> |
| 35 | </WixLocalization> | 36 | </WixLocalization> |
diff --git a/src/ext/Bal/wixstdba/Resources/1049/mbapreq.wxl b/src/ext/Bal/wixstdba/Resources/1049/mbapreq.wxl index 87350745..271d5563 100644 --- a/src/ext/Bal/wixstdba/Resources/1049/mbapreq.wxl +++ b/src/ext/Bal/wixstdba/Resources/1049/mbapreq.wxl | |||
| @@ -31,5 +31,6 @@ | |||
| 31 | <String Id="FailureRestartButton">&Перезагрузить</String> | 31 | <String Id="FailureRestartButton">&Перезагрузить</String> |
| 32 | <String Id="FailureCloseButton">&Закрыть</String> | 32 | <String Id="FailureCloseButton">&Закрыть</String> |
| 33 | <String Id="NET452WIN7RTMErrorMessage">[WixBundleName] cannot run on Windows 7 RTM with .NET 4.5.2 installed. Install Windows 7 SP1 to run in a supported environment.</String> | 33 | <String Id="NET452WIN7RTMErrorMessage">[WixBundleName] cannot run on Windows 7 RTM with .NET 4.5.2 installed. Install Windows 7 SP1 to run in a supported environment.</String> |
| 34 | <String Id="PREREQBAINFINITELOOPErrorMessage">[WixBundleName] failed to load the .NET Framework runtime even though all of the prerequisites are installed.</String> | ||
| 34 | <String Id="ErrorFailNoActionReboot">No action was taken as a system reboot is required.</String> | 35 | <String Id="ErrorFailNoActionReboot">No action was taken as a system reboot is required.</String> |
| 35 | </WixLocalization> | 36 | </WixLocalization> |
diff --git a/src/ext/Bal/wixstdba/Resources/1051/mbapreq.wxl b/src/ext/Bal/wixstdba/Resources/1051/mbapreq.wxl index 7645a37f..ce6f6eda 100644 --- a/src/ext/Bal/wixstdba/Resources/1051/mbapreq.wxl +++ b/src/ext/Bal/wixstdba/Resources/1051/mbapreq.wxl | |||
| @@ -32,5 +32,6 @@ | |||
| 32 | <String Id="FailureRestartButton">&Reštartovať</String> | 32 | <String Id="FailureRestartButton">&Reštartovať</String> |
| 33 | <String Id="FailureCloseButton">&Zavrieť</String> | 33 | <String Id="FailureCloseButton">&Zavrieť</String> |
| 34 | <String Id="NET452WIN7RTMErrorMessage">[WixBundleName] cannot run on Windows 7 RTM with .NET 4.5.2 installed. Install Windows 7 SP1 to run in a supported environment.</String> | 34 | <String Id="NET452WIN7RTMErrorMessage">[WixBundleName] cannot run on Windows 7 RTM with .NET 4.5.2 installed. Install Windows 7 SP1 to run in a supported environment.</String> |
| 35 | <String Id="PREREQBAINFINITELOOPErrorMessage">[WixBundleName] failed to load the .NET Framework runtime even though all of the prerequisites are installed.</String> | ||
| 35 | <String Id="ErrorFailNoActionReboot">No action was taken as a system reboot is required.</String> | 36 | <String Id="ErrorFailNoActionReboot">No action was taken as a system reboot is required.</String> |
| 36 | </WixLocalization> | 37 | </WixLocalization> |
diff --git a/src/ext/Bal/wixstdba/Resources/1053/mbapreq.wxl b/src/ext/Bal/wixstdba/Resources/1053/mbapreq.wxl index b00205d8..2d0581b1 100644 --- a/src/ext/Bal/wixstdba/Resources/1053/mbapreq.wxl +++ b/src/ext/Bal/wixstdba/Resources/1053/mbapreq.wxl | |||
| @@ -32,5 +32,6 @@ | |||
| 32 | <String Id="FailureRestartButton">&Starta om</String> | 32 | <String Id="FailureRestartButton">&Starta om</String> |
| 33 | <String Id="FailureCloseButton">&Stäng</String> | 33 | <String Id="FailureCloseButton">&Stäng</String> |
| 34 | <String Id="NET452WIN7RTMErrorMessage">[WixBundleName] cannot run on Windows 7 RTM with .NET 4.5.2 installed. Install Windows 7 SP1 to run in a supported environment.</String> | 34 | <String Id="NET452WIN7RTMErrorMessage">[WixBundleName] cannot run on Windows 7 RTM with .NET 4.5.2 installed. Install Windows 7 SP1 to run in a supported environment.</String> |
| 35 | <String Id="PREREQBAINFINITELOOPErrorMessage">[WixBundleName] failed to load the .NET Framework runtime even though all of the prerequisites are installed.</String> | ||
| 35 | <String Id="ErrorFailNoActionReboot">No action was taken as a system reboot is required.</String> | 36 | <String Id="ErrorFailNoActionReboot">No action was taken as a system reboot is required.</String> |
| 36 | </WixLocalization> | 37 | </WixLocalization> |
diff --git a/src/ext/Bal/wixstdba/Resources/1055/mbapreq.wxl b/src/ext/Bal/wixstdba/Resources/1055/mbapreq.wxl index 00c3c187..c48a44da 100644 --- a/src/ext/Bal/wixstdba/Resources/1055/mbapreq.wxl +++ b/src/ext/Bal/wixstdba/Resources/1055/mbapreq.wxl | |||
| @@ -32,5 +32,6 @@ | |||
| 32 | <String Id="FailureRestartButton">&Yeniden Başlat</String> | 32 | <String Id="FailureRestartButton">&Yeniden Başlat</String> |
| 33 | <String Id="FailureCloseButton">&Kapat</String> | 33 | <String Id="FailureCloseButton">&Kapat</String> |
| 34 | <String Id="NET452WIN7RTMErrorMessage">[WixBundleName] cannot run on Windows 7 RTM with .NET 4.5.2 installed. Install Windows 7 SP1 to run in a supported environment.</String> | 34 | <String Id="NET452WIN7RTMErrorMessage">[WixBundleName] cannot run on Windows 7 RTM with .NET 4.5.2 installed. Install Windows 7 SP1 to run in a supported environment.</String> |
| 35 | <String Id="PREREQBAINFINITELOOPErrorMessage">[WixBundleName] failed to load the .NET Framework runtime even though all of the prerequisites are installed.</String> | ||
| 35 | <String Id="ErrorFailNoActionReboot">No action was taken as a system reboot is required.</String> | 36 | <String Id="ErrorFailNoActionReboot">No action was taken as a system reboot is required.</String> |
| 36 | </WixLocalization> | 37 | </WixLocalization> |
diff --git a/src/ext/Bal/wixstdba/Resources/1060/mbapreq.wxl b/src/ext/Bal/wixstdba/Resources/1060/mbapreq.wxl index 72d48267..0398a7f1 100644 --- a/src/ext/Bal/wixstdba/Resources/1060/mbapreq.wxl +++ b/src/ext/Bal/wixstdba/Resources/1060/mbapreq.wxl | |||
| @@ -32,5 +32,6 @@ | |||
| 32 | <String Id="FailureRestartButton">&Ponovni zagon</String> | 32 | <String Id="FailureRestartButton">&Ponovni zagon</String> |
| 33 | <String Id="FailureCloseButton">&Zapri</String> | 33 | <String Id="FailureCloseButton">&Zapri</String> |
| 34 | <String Id="NET452WIN7RTMErrorMessage">[WixBundleName] cannot run on Windows 7 RTM with .NET 4.5.2 installed. Install Windows 7 SP1 to run in a supported environment.</String> | 34 | <String Id="NET452WIN7RTMErrorMessage">[WixBundleName] cannot run on Windows 7 RTM with .NET 4.5.2 installed. Install Windows 7 SP1 to run in a supported environment.</String> |
| 35 | <String Id="PREREQBAINFINITELOOPErrorMessage">[WixBundleName] failed to load the .NET Framework runtime even though all of the prerequisites are installed.</String> | ||
| 35 | <String Id="ErrorFailNoActionReboot">No action was taken as a system reboot is required.</String> | 36 | <String Id="ErrorFailNoActionReboot">No action was taken as a system reboot is required.</String> |
| 36 | </WixLocalization> | 37 | </WixLocalization> |
diff --git a/src/ext/Bal/wixstdba/Resources/2052/mbapreq.wxl b/src/ext/Bal/wixstdba/Resources/2052/mbapreq.wxl index 365ee7e6..09f09cb3 100644 --- a/src/ext/Bal/wixstdba/Resources/2052/mbapreq.wxl +++ b/src/ext/Bal/wixstdba/Resources/2052/mbapreq.wxl | |||
| @@ -29,5 +29,6 @@ | |||
| 29 | <String Id="FailureRestartButton">重启(&R)</String> | 29 | <String Id="FailureRestartButton">重启(&R)</String> |
| 30 | <String Id="FailureCloseButton">关闭(&C)</String> | 30 | <String Id="FailureCloseButton">关闭(&C)</String> |
| 31 | <String Id="NET452WIN7RTMErrorMessage">[WixBundleName] cannot run on Windows 7 RTM with .NET 4.5.2 installed. Install Windows 7 SP1 to run in a supported environment.</String> | 31 | <String Id="NET452WIN7RTMErrorMessage">[WixBundleName] cannot run on Windows 7 RTM with .NET 4.5.2 installed. Install Windows 7 SP1 to run in a supported environment.</String> |
| 32 | <String Id="PREREQBAINFINITELOOPErrorMessage">[WixBundleName] failed to load the .NET Framework runtime even though all of the prerequisites are installed.</String> | ||
| 32 | <String Id="ErrorFailNoActionReboot">No action was taken as a system reboot is required.</String> | 33 | <String Id="ErrorFailNoActionReboot">No action was taken as a system reboot is required.</String> |
| 33 | </WixLocalization> | 34 | </WixLocalization> |
diff --git a/src/ext/Bal/wixstdba/Resources/2070/mbapreq.wxl b/src/ext/Bal/wixstdba/Resources/2070/mbapreq.wxl index 442a5571..f22822d8 100644 --- a/src/ext/Bal/wixstdba/Resources/2070/mbapreq.wxl +++ b/src/ext/Bal/wixstdba/Resources/2070/mbapreq.wxl | |||
| @@ -31,5 +31,6 @@ | |||
| 31 | <String Id="FailureRestartButton">&Reiniciar</String> | 31 | <String Id="FailureRestartButton">&Reiniciar</String> |
| 32 | <String Id="FailureCloseButton">&Fechar</String> | 32 | <String Id="FailureCloseButton">&Fechar</String> |
| 33 | <String Id="NET452WIN7RTMErrorMessage">[WixBundleName] cannot run on Windows 7 RTM with .NET 4.5.2 installed. Install Windows 7 SP1 to run in a supported environment.</String> | 33 | <String Id="NET452WIN7RTMErrorMessage">[WixBundleName] cannot run on Windows 7 RTM with .NET 4.5.2 installed. Install Windows 7 SP1 to run in a supported environment.</String> |
| 34 | <String Id="PREREQBAINFINITELOOPErrorMessage">[WixBundleName] failed to load the .NET Framework runtime even though all of the prerequisites are installed.</String> | ||
| 34 | <String Id="ErrorFailNoActionReboot">No action was taken as a system reboot is required.</String> | 35 | <String Id="ErrorFailNoActionReboot">No action was taken as a system reboot is required.</String> |
| 35 | </WixLocalization> | 36 | </WixLocalization> |
diff --git a/src/ext/Bal/wixstdba/Resources/3082/mbapreq.wxl b/src/ext/Bal/wixstdba/Resources/3082/mbapreq.wxl index 37c0dc05..edbf01c4 100644 --- a/src/ext/Bal/wixstdba/Resources/3082/mbapreq.wxl +++ b/src/ext/Bal/wixstdba/Resources/3082/mbapreq.wxl | |||
| @@ -33,5 +33,6 @@ | |||
| 33 | <String Id="FailureRestartButton">&Reiniciar</String> | 33 | <String Id="FailureRestartButton">&Reiniciar</String> |
| 34 | <String Id="FailureCloseButton">&Cerrar</String> | 34 | <String Id="FailureCloseButton">&Cerrar</String> |
| 35 | <String Id="NET452WIN7RTMErrorMessage">[WixBundleName] cannot run on Windows 7 RTM with .NET 4.5.2 installed. Install Windows 7 SP1 to run in a supported environment.</String> | 35 | <String Id="NET452WIN7RTMErrorMessage">[WixBundleName] cannot run on Windows 7 RTM with .NET 4.5.2 installed. Install Windows 7 SP1 to run in a supported environment.</String> |
| 36 | <String Id="PREREQBAINFINITELOOPErrorMessage">[WixBundleName] failed to load the .NET Framework runtime even though all of the prerequisites are installed.</String> | ||
| 36 | <String Id="ErrorFailNoActionReboot">No action was taken as a system reboot is required.</String> | 37 | <String Id="ErrorFailNoActionReboot">No action was taken as a system reboot is required.</String> |
| 37 | </WixLocalization> | 38 | </WixLocalization> |
diff --git a/src/ext/Bal/wixstdba/Resources/dncpreq.wxl b/src/ext/Bal/wixstdba/Resources/dncpreq.wxl index a53b1c83..22fcd3dc 100644 --- a/src/ext/Bal/wixstdba/Resources/dncpreq.wxl +++ b/src/ext/Bal/wixstdba/Resources/dncpreq.wxl | |||
| @@ -29,5 +29,6 @@ | |||
| 29 | <String Id="FailureRestartButton">&Restart</String> | 29 | <String Id="FailureRestartButton">&Restart</String> |
| 30 | <String Id="FailureCloseButton">&Close</String> | 30 | <String Id="FailureCloseButton">&Close</String> |
| 31 | <String Id="SCDRUNTIMEFAILUREErrorMessage">[WixBundleName] cannot run on this machine. Install the latest updates and/or the latest OS to run in a supported environment.</String> | 31 | <String Id="SCDRUNTIMEFAILUREErrorMessage">[WixBundleName] cannot run on this machine. Install the latest updates and/or the latest OS to run in a supported environment.</String> |
| 32 | <String Id="PREREQBAINFINITELOOPErrorMessage">[WixBundleName] failed to load the .NET Core runtime even though all of the prerequisites are installed.</String> | ||
| 32 | <String Id="ErrorFailNoActionReboot">No action was taken as a system reboot is required.</String> | 33 | <String Id="ErrorFailNoActionReboot">No action was taken as a system reboot is required.</String> |
| 33 | </WixLocalization> | 34 | </WixLocalization> |
diff --git a/src/ext/Bal/wixstdba/Resources/mbapreq.wxl b/src/ext/Bal/wixstdba/Resources/mbapreq.wxl index 5d410888..77859d31 100644 --- a/src/ext/Bal/wixstdba/Resources/mbapreq.wxl +++ b/src/ext/Bal/wixstdba/Resources/mbapreq.wxl | |||
| @@ -29,5 +29,6 @@ | |||
| 29 | <String Id="FailureRestartButton">&Restart</String> | 29 | <String Id="FailureRestartButton">&Restart</String> |
| 30 | <String Id="FailureCloseButton">&Close</String> | 30 | <String Id="FailureCloseButton">&Close</String> |
| 31 | <String Id="NET452WIN7RTMErrorMessage">[WixBundleName] cannot run on Windows 7 RTM with .NET 4.5.2 installed. Install Windows 7 SP1 to run in a supported environment.</String> | 31 | <String Id="NET452WIN7RTMErrorMessage">[WixBundleName] cannot run on Windows 7 RTM with .NET 4.5.2 installed. Install Windows 7 SP1 to run in a supported environment.</String> |
| 32 | <String Id="PREREQBAINFINITELOOPErrorMessage">[WixBundleName] failed to load the .NET Framework runtime even though all of the prerequisites are installed.</String> | ||
| 32 | <String Id="ErrorFailNoActionReboot">No action was taken as a system reboot is required.</String> | 33 | <String Id="ErrorFailNoActionReboot">No action was taken as a system reboot is required.</String> |
| 33 | </WixLocalization> | 34 | </WixLocalization> |
diff --git a/src/ext/Bal/wixstdba/WixStandardBootstrapperApplication.cpp b/src/ext/Bal/wixstdba/WixStandardBootstrapperApplication.cpp index dd00a563..3774f49c 100644 --- a/src/ext/Bal/wixstdba/WixStandardBootstrapperApplication.cpp +++ b/src/ext/Bal/wixstdba/WixStandardBootstrapperApplication.cpp | |||
| @@ -123,14 +123,6 @@ enum WIXSTDBA_CONTROL | |||
| 123 | LAST_WIXSTDBA_CONTROL, | 123 | LAST_WIXSTDBA_CONTROL, |
| 124 | }; | 124 | }; |
| 125 | 125 | ||
| 126 | typedef struct _WIXSTDBA_PACKAGE_INFO | ||
| 127 | { | ||
| 128 | LPWSTR sczPackageId; | ||
| 129 | BOOL fWasAlreadyInstalled; | ||
| 130 | BOOL fPlannedToBeInstalled; | ||
| 131 | BOOL fSuccessfullyInstalled; | ||
| 132 | } WIXSTDBA_PACKAGE_INFO; | ||
| 133 | |||
| 134 | 126 | ||
| 135 | static HRESULT DAPI EvaluateVariableConditionCallback( | 127 | static HRESULT DAPI EvaluateVariableConditionCallback( |
| 136 | __in_z LPCWSTR wzCondition, | 128 | __in_z LPCWSTR wzCondition, |
| @@ -229,10 +221,7 @@ public: // IBootstrapperApplication | |||
| 229 | { | 221 | { |
| 230 | BalLog(BOOTSTRAPPER_LOG_LEVEL_STANDARD, "The prerequisites were successfully installed. The bootstrapper application will be reloaded."); | 222 | BalLog(BOOTSTRAPPER_LOG_LEVEL_STANDARD, "The prerequisites were successfully installed. The bootstrapper application will be reloaded."); |
| 231 | *pAction = BOOTSTRAPPER_SHUTDOWN_ACTION_RELOAD_BOOTSTRAPPER; | 223 | *pAction = BOOTSTRAPPER_SHUTDOWN_ACTION_RELOAD_BOOTSTRAPPER; |
| 232 | } | 224 | m_pPrereqData->fCompleted = TRUE; |
| 233 | else if (m_fPrereqAlreadyInstalled) | ||
| 234 | { | ||
| 235 | BalLog(BOOTSTRAPPER_LOG_LEVEL_STANDARD, "The prerequisites were already installed. The bootstrapper application will not be reloaded to prevent an infinite loop."); | ||
| 236 | } | 225 | } |
| 237 | else if (m_fPrereq) | 226 | else if (m_fPrereq) |
| 238 | { | 227 | { |
| @@ -311,38 +300,14 @@ public: // IBootstrapperApplication | |||
| 311 | 300 | ||
| 312 | if (!fMissingFromCache) | 301 | if (!fMissingFromCache) |
| 313 | { | 302 | { |
| 314 | if (SUCCEEDED(BalInfoAddRelatedBundleAsPackage(&m_Bundle.packages, wzBundleId, relationType, fPerMachine, &pPackage))) | 303 | BalInfoAddRelatedBundleAsPackage(&m_Bundle.packages, wzBundleId, relationType, fPerMachine, &pPackage); |
| 315 | { | 304 | // Best effort |
| 316 | InitializePackageInfoForPackage(pPackage); | ||
| 317 | } | ||
| 318 | } | 305 | } |
| 319 | 306 | ||
| 320 | return CBalBaseBootstrapperApplication::OnDetectRelatedBundle(wzBundleId, relationType, wzBundleTag, fPerMachine, wzVersion, fMissingFromCache, pfCancel); | 307 | return CBalBaseBootstrapperApplication::OnDetectRelatedBundle(wzBundleId, relationType, wzBundleTag, fPerMachine, wzVersion, fMissingFromCache, pfCancel); |
| 321 | } | 308 | } |
| 322 | 309 | ||
| 323 | 310 | ||
| 324 | virtual STDMETHODIMP OnDetectPackageComplete( | ||
| 325 | __in LPCWSTR wzPackageId, | ||
| 326 | __in HRESULT /*hrStatus*/, | ||
| 327 | __in BOOTSTRAPPER_PACKAGE_STATE state, | ||
| 328 | __in BOOL /*fCached*/ | ||
| 329 | ) | ||
| 330 | { | ||
| 331 | WIXSTDBA_PACKAGE_INFO* pPackageInfo = NULL; | ||
| 332 | BAL_INFO_PACKAGE* pPackage = NULL; | ||
| 333 | |||
| 334 | if (BOOTSTRAPPER_PACKAGE_STATE_PRESENT == state && | ||
| 335 | SUCCEEDED(GetPackageInfo(wzPackageId, &pPackageInfo, &pPackage)) && | ||
| 336 | pPackageInfo) | ||
| 337 | { | ||
| 338 | // If the package is already installed, remember that. | ||
| 339 | pPackageInfo->fWasAlreadyInstalled = TRUE; | ||
| 340 | } | ||
| 341 | |||
| 342 | return S_OK; | ||
| 343 | } | ||
| 344 | |||
| 345 | |||
| 346 | virtual STDMETHODIMP OnDetectComplete( | 311 | virtual STDMETHODIMP OnDetectComplete( |
| 347 | __in HRESULT hrStatus, | 312 | __in HRESULT hrStatus, |
| 348 | __in BOOL /*fEligibleForCleanup*/ | 313 | __in BOOL /*fEligibleForCleanup*/ |
| @@ -366,29 +331,10 @@ public: // IBootstrapperApplication | |||
| 366 | if (fEvaluateConditions) | 331 | if (fEvaluateConditions) |
| 367 | { | 332 | { |
| 368 | hrStatus = EvaluateConditions(); | 333 | hrStatus = EvaluateConditions(); |
| 369 | } | ||
| 370 | 334 | ||
| 371 | if (FAILED(hrStatus)) | 335 | if (FAILED(hrStatus)) |
| 372 | { | ||
| 373 | fSkipToPlan = FALSE; | ||
| 374 | } | ||
| 375 | else | ||
| 376 | { | ||
| 377 | if (m_fPrereq) | ||
| 378 | { | 336 | { |
| 379 | m_fPrereqAlreadyInstalled = TRUE; | 337 | fSkipToPlan = FALSE; |
| 380 | |||
| 381 | // At this point we have to assume that all prerequisite packages need to be installed, so set to false if any of them aren't installed. | ||
| 382 | for (DWORD i = 0; i < m_Bundle.packages.cPackages; ++i) | ||
| 383 | { | ||
| 384 | BAL_INFO_PACKAGE* pPackage = &m_Bundle.packages.rgPackages[i]; | ||
| 385 | WIXSTDBA_PACKAGE_INFO* pPackageInfo = reinterpret_cast<WIXSTDBA_PACKAGE_INFO*>(pPackage->pvCustomData); | ||
| 386 | if (pPackage->fPrereqPackage && pPackageInfo && !pPackageInfo->fWasAlreadyInstalled) | ||
| 387 | { | ||
| 388 | m_fPrereqAlreadyInstalled = FALSE; | ||
| 389 | break; | ||
| 390 | } | ||
| 391 | } | ||
| 392 | } | 338 | } |
| 393 | } | 339 | } |
| 394 | 340 | ||
| @@ -403,20 +349,20 @@ public: // IBootstrapperApplication | |||
| 403 | } | 349 | } |
| 404 | 350 | ||
| 405 | 351 | ||
| 406 | virtual STDMETHODIMP OnPlanRelatedBundle( | 352 | virtual STDMETHODIMP OnPlanRelatedBundleType( |
| 407 | __in_z LPCWSTR wzBundleId, | 353 | __in_z LPCWSTR wzBundleId, |
| 408 | __in BOOTSTRAPPER_REQUEST_STATE recommendedState, | 354 | __in BOOTSTRAPPER_RELATED_BUNDLE_PLAN_TYPE recommendedType, |
| 409 | __inout_z BOOTSTRAPPER_REQUEST_STATE* pRequestedState, | 355 | __inout BOOTSTRAPPER_RELATED_BUNDLE_PLAN_TYPE* pRequestedType, |
| 410 | __inout BOOL* pfCancel | 356 | __inout BOOL* pfCancel |
| 411 | ) | 357 | ) |
| 412 | { | 358 | { |
| 413 | // If we're only installing prerequisites, do not touch related bundles. | 359 | // If we're only installing prerequisites, do not touch related bundles. |
| 414 | if (m_fPrereq) | 360 | if (m_fPrereq) |
| 415 | { | 361 | { |
| 416 | *pRequestedState = BOOTSTRAPPER_REQUEST_STATE_NONE; | 362 | *pRequestedType = BOOTSTRAPPER_RELATED_BUNDLE_PLAN_TYPE_NONE; |
| 417 | } | 363 | } |
| 418 | 364 | ||
| 419 | return CBalBaseBootstrapperApplication::OnPlanRelatedBundle(wzBundleId, recommendedState, pRequestedState, pfCancel); | 365 | return CBalBaseBootstrapperApplication::OnPlanRelatedBundleType(wzBundleId, recommendedType, pRequestedType, pfCancel); |
| 420 | } | 366 | } |
| 421 | 367 | ||
| 422 | 368 | ||
| @@ -434,7 +380,6 @@ public: // IBootstrapperApplication | |||
| 434 | ) | 380 | ) |
| 435 | { | 381 | { |
| 436 | HRESULT hr = S_OK; | 382 | HRESULT hr = S_OK; |
| 437 | WIXSTDBA_PACKAGE_INFO* pPackageInfo = NULL; | ||
| 438 | BAL_INFO_PACKAGE* pPackage = NULL; | 383 | BAL_INFO_PACKAGE* pPackage = NULL; |
| 439 | 384 | ||
| 440 | // If we're planning to install prerequisites, install them. The prerequisites need to be installed | 385 | // If we're planning to install prerequisites, install them. The prerequisites need to be installed |
| @@ -443,10 +388,11 @@ public: // IBootstrapperApplication | |||
| 443 | { | 388 | { |
| 444 | // Only install prerequisite packages, and check the InstallCondition on them. | 389 | // Only install prerequisite packages, and check the InstallCondition on them. |
| 445 | BOOL fInstall = FALSE; | 390 | BOOL fInstall = FALSE; |
| 446 | hr = GetPackageInfo(wzPackageId, &pPackageInfo, &pPackage); | 391 | |
| 447 | if (SUCCEEDED(hr) && pPackage->fPrereqPackage && pPackageInfo) | 392 | hr = BalInfoFindPackageById(&m_Bundle.packages, wzPackageId, &pPackage); |
| 393 | if (SUCCEEDED(hr) && pPackage->fPrereqPackage) | ||
| 448 | { | 394 | { |
| 449 | pPackageInfo->fPlannedToBeInstalled = fInstall = BOOTSTRAPPER_PACKAGE_CONDITION_FALSE != installCondition; | 395 | fInstall = BOOTSTRAPPER_PACKAGE_CONDITION_FALSE != installCondition; |
| 450 | } | 396 | } |
| 451 | 397 | ||
| 452 | if (fInstall) | 398 | if (fInstall) |
| @@ -503,7 +449,6 @@ public: // IBootstrapperApplication | |||
| 503 | ) | 449 | ) |
| 504 | { | 450 | { |
| 505 | HRESULT hr = S_OK; | 451 | HRESULT hr = S_OK; |
| 506 | WIXSTDBA_PACKAGE_INFO* pPackageInfo = NULL; | ||
| 507 | BAL_INFO_PACKAGE* pPackage = NULL; | 452 | BAL_INFO_PACKAGE* pPackage = NULL; |
| 508 | BOOL fShowInternalUI = FALSE; | 453 | BOOL fShowInternalUI = FALSE; |
| 509 | INSTALLUILEVEL uiLevel = INSTALLUILEVEL_NOCHANGE; | 454 | INSTALLUILEVEL uiLevel = INSTALLUILEVEL_NOCHANGE; |
| @@ -521,7 +466,7 @@ public: // IBootstrapperApplication | |||
| 521 | 466 | ||
| 522 | if (INSTALLUILEVEL_NOCHANGE != uiLevel) | 467 | if (INSTALLUILEVEL_NOCHANGE != uiLevel) |
| 523 | { | 468 | { |
| 524 | hr = GetPackageInfo(wzPackageId, &pPackageInfo, &pPackage); | 469 | hr = BalInfoFindPackageById(&m_Bundle.packages, wzPackageId, &pPackage); |
| 525 | if (SUCCEEDED(hr) && pPackage->sczDisplayInternalUICondition) | 470 | if (SUCCEEDED(hr) && pPackage->sczDisplayInternalUICondition) |
| 526 | { | 471 | { |
| 527 | hr = BalEvaluateCondition(pPackage->sczDisplayInternalUICondition, &fShowInternalUI); | 472 | hr = BalEvaluateCondition(pPackage->sczDisplayInternalUICondition, &fShowInternalUI); |
| @@ -545,23 +490,6 @@ public: // IBootstrapperApplication | |||
| 545 | { | 490 | { |
| 546 | HRESULT hr = S_OK; | 491 | HRESULT hr = S_OK; |
| 547 | 492 | ||
| 548 | if (m_fPrereq) | ||
| 549 | { | ||
| 550 | m_fPrereqAlreadyInstalled = TRUE; | ||
| 551 | |||
| 552 | // Now that we've planned the packages, we can focus on the prerequisite packages that are supposed to be installed. | ||
| 553 | for (DWORD i = 0; i < m_Bundle.packages.cPackages; ++i) | ||
| 554 | { | ||
| 555 | BAL_INFO_PACKAGE* pPackage = &m_Bundle.packages.rgPackages[i]; | ||
| 556 | WIXSTDBA_PACKAGE_INFO* pPackageInfo = reinterpret_cast<WIXSTDBA_PACKAGE_INFO*>(pPackage->pvCustomData); | ||
| 557 | if (pPackage->fPrereqPackage && pPackageInfo && !pPackageInfo->fWasAlreadyInstalled && pPackageInfo->fPlannedToBeInstalled) | ||
| 558 | { | ||
| 559 | m_fPrereqAlreadyInstalled = FALSE; | ||
| 560 | break; | ||
| 561 | } | ||
| 562 | } | ||
| 563 | } | ||
| 564 | |||
| 565 | SetState(WIXSTDBA_STATE_PLANNED, hrStatus); | 493 | SetState(WIXSTDBA_STATE_PLANNED, hrStatus); |
| 566 | 494 | ||
| 567 | if (SUCCEEDED(hrStatus)) | 495 | if (SUCCEEDED(hrStatus)) |
| @@ -1033,13 +961,10 @@ public: // IBootstrapperApplication | |||
| 1033 | 961 | ||
| 1034 | hr = __super::OnExecutePackageComplete(wzPackageId, hrStatus, restart, recommendation, pAction); | 962 | hr = __super::OnExecutePackageComplete(wzPackageId, hrStatus, restart, recommendation, pAction); |
| 1035 | 963 | ||
| 1036 | WIXSTDBA_PACKAGE_INFO* pPackageInfo = NULL; | 964 | BAL_INFO_PACKAGE* pPackage = NULL; |
| 1037 | BAL_INFO_PACKAGE* pPackage; | 965 | HRESULT hrPrereq = BalInfoFindPackageById(&m_Bundle.packages, wzPackageId, &pPackage); |
| 1038 | HRESULT hrPrereq = GetPackageInfo(wzPackageId, &pPackageInfo, &pPackage); | 966 | if (SUCCEEDED(hrPrereq)) |
| 1039 | if (SUCCEEDED(hrPrereq) && pPackageInfo) | ||
| 1040 | { | 967 | { |
| 1041 | pPackageInfo->fSuccessfullyInstalled = SUCCEEDED(hrStatus); | ||
| 1042 | |||
| 1043 | // If the prerequisite required a restart (any restart) then do an immediate | 968 | // If the prerequisite required a restart (any restart) then do an immediate |
| 1044 | // restart to ensure that the bundle will get launched again post reboot. | 969 | // restart to ensure that the bundle will get launched again post reboot. |
| 1045 | if (m_fPrereq && pPackage->fPrereqPackage && BOOTSTRAPPER_APPLY_RESTART_NONE != restart) | 970 | if (m_fPrereq && pPackage->fPrereqPackage && BOOTSTRAPPER_APPLY_RESTART_NONE != restart) |
| @@ -1157,28 +1082,7 @@ public: // IBootstrapperApplication | |||
| 1157 | 1082 | ||
| 1158 | if (m_fPrereq) | 1083 | if (m_fPrereq) |
| 1159 | { | 1084 | { |
| 1160 | m_fPrereqInstalled = TRUE; | 1085 | m_fPrereqInstalled = SUCCEEDED(hrStatus); |
| 1161 | BOOL fInstalledAPackage = FALSE; | ||
| 1162 | |||
| 1163 | for (DWORD i = 0; i < m_Bundle.packages.cPackages; ++i) | ||
| 1164 | { | ||
| 1165 | BAL_INFO_PACKAGE* pPackage = &m_Bundle.packages.rgPackages[i]; | ||
| 1166 | WIXSTDBA_PACKAGE_INFO* pPackageInfo = reinterpret_cast<WIXSTDBA_PACKAGE_INFO*>(pPackage->pvCustomData); | ||
| 1167 | if (pPackage->fPrereqPackage && pPackageInfo && pPackageInfo->fPlannedToBeInstalled && !pPackageInfo->fWasAlreadyInstalled) | ||
| 1168 | { | ||
| 1169 | if (pPackageInfo->fSuccessfullyInstalled) | ||
| 1170 | { | ||
| 1171 | fInstalledAPackage = TRUE; | ||
| 1172 | } | ||
| 1173 | else | ||
| 1174 | { | ||
| 1175 | m_fPrereqInstalled = FALSE; | ||
| 1176 | break; | ||
| 1177 | } | ||
| 1178 | } | ||
| 1179 | } | ||
| 1180 | |||
| 1181 | m_fPrereqInstalled = m_fPrereqInstalled && fInstalledAPackage; | ||
| 1182 | } | 1086 | } |
| 1183 | 1087 | ||
| 1184 | // If we are showing UI, wait a beat before moving to the final screen. | 1088 | // If we are showing UI, wait a beat before moving to the final screen. |
| @@ -1223,10 +1127,10 @@ public: // IBootstrapperApplication | |||
| 1223 | { | 1127 | { |
| 1224 | BAL_INFO_PACKAGE* pPackage = NULL; | 1128 | BAL_INFO_PACKAGE* pPackage = NULL; |
| 1225 | 1129 | ||
| 1226 | if (SUCCEEDED(hrStatus) && wzNewPackageId && | 1130 | if (SUCCEEDED(hrStatus) && wzNewPackageId) |
| 1227 | SUCCEEDED(BalInfoAddUpdateBundleAsPackage(&m_Bundle.packages, wzNewPackageId, wzPreviousPackageId, &pPackage))) | ||
| 1228 | { | 1131 | { |
| 1229 | InitializePackageInfoForPackage(pPackage); | 1132 | BalInfoAddUpdateBundleAsPackage(&m_Bundle.packages, wzNewPackageId, wzPreviousPackageId, &pPackage); |
| 1133 | // Best effort | ||
| 1230 | } | 1134 | } |
| 1231 | 1135 | ||
| 1232 | return S_OK; | 1136 | return S_OK; |
| @@ -2201,6 +2105,36 @@ public: //CBalBaseBootstrapperApplication | |||
| 2201 | return hr; | 2105 | return hr; |
| 2202 | } | 2106 | } |
| 2203 | 2107 | ||
| 2108 | void Uninitialize( | ||
| 2109 | __in const BOOTSTRAPPER_DESTROY_ARGS* pArgs, | ||
| 2110 | __in BOOTSTRAPPER_DESTROY_RESULTS* /*pResults*/ | ||
| 2111 | ) | ||
| 2112 | { | ||
| 2113 | if (m_hBAFModule) | ||
| 2114 | { | ||
| 2115 | BA_FUNCTIONS_DESTROY_ARGS args = { }; | ||
| 2116 | BA_FUNCTIONS_DESTROY_RESULTS results = { }; | ||
| 2117 | |||
| 2118 | args.cbSize = sizeof(BA_FUNCTIONS_DESTROY_ARGS); | ||
| 2119 | args.fReload = pArgs->fReload; | ||
| 2120 | |||
| 2121 | results.cbSize = sizeof(BA_FUNCTIONS_DESTROY_RESULTS); | ||
| 2122 | |||
| 2123 | PFN_BA_FUNCTIONS_DESTROY pfnBAFunctionsDestroy = reinterpret_cast<PFN_BA_FUNCTIONS_DESTROY>(::GetProcAddress(m_hBAFModule, "BAFunctionsDestroy")); | ||
| 2124 | if (pfnBAFunctionsDestroy) | ||
| 2125 | { | ||
| 2126 | pfnBAFunctionsDestroy(&args, &results); | ||
| 2127 | } | ||
| 2128 | |||
| 2129 | if (!results.fDisableUnloading) | ||
| 2130 | { | ||
| 2131 | ::FreeLibrary(m_hBAFModule); | ||
| 2132 | m_hBAFModule = NULL; | ||
| 2133 | } | ||
| 2134 | } | ||
| 2135 | } | ||
| 2136 | |||
| 2137 | |||
| 2204 | private: | 2138 | private: |
| 2205 | // | 2139 | // |
| 2206 | // UiThreadProc - entrypoint for UI thread. | 2140 | // UiThreadProc - entrypoint for UI thread. |
| @@ -2214,6 +2148,7 @@ private: | |||
| 2214 | BOOL fComInitialized = FALSE; | 2148 | BOOL fComInitialized = FALSE; |
| 2215 | BOOL fRet = FALSE; | 2149 | BOOL fRet = FALSE; |
| 2216 | MSG msg = { }; | 2150 | MSG msg = { }; |
| 2151 | DWORD dwQuit = 0; | ||
| 2217 | 2152 | ||
| 2218 | // Initialize COM and theme. | 2153 | // Initialize COM and theme. |
| 2219 | hr = ::CoInitialize(NULL); | 2154 | hr = ::CoInitialize(NULL); |
| @@ -2274,8 +2209,6 @@ private: | |||
| 2274 | pThis->DestroyMainWindow(); | 2209 | pThis->DestroyMainWindow(); |
| 2275 | pThis->UninitializeTaskbarButton(); | 2210 | pThis->UninitializeTaskbarButton(); |
| 2276 | 2211 | ||
| 2277 | // initiate engine shutdown | ||
| 2278 | DWORD dwQuit = HRESULT_CODE(hr); | ||
| 2279 | if (BOOTSTRAPPER_APPLY_RESTART_INITIATED == pThis->m_restartResult) | 2212 | if (BOOTSTRAPPER_APPLY_RESTART_INITIATED == pThis->m_restartResult) |
| 2280 | { | 2213 | { |
| 2281 | dwQuit = ERROR_SUCCESS_REBOOT_INITIATED; | 2214 | dwQuit = ERROR_SUCCESS_REBOOT_INITIATED; |
| @@ -2284,6 +2217,17 @@ private: | |||
| 2284 | { | 2217 | { |
| 2285 | dwQuit = ERROR_SUCCESS_REBOOT_REQUIRED; | 2218 | dwQuit = ERROR_SUCCESS_REBOOT_REQUIRED; |
| 2286 | } | 2219 | } |
| 2220 | else if (SEVERITY_ERROR == HRESULT_SEVERITY(hr) && FACILITY_WIN32 == HRESULT_FACILITY(hr)) | ||
| 2221 | { | ||
| 2222 | // Convert Win32 HRESULTs back to the error code. | ||
| 2223 | dwQuit = HRESULT_CODE(hr); | ||
| 2224 | } | ||
| 2225 | else | ||
| 2226 | { | ||
| 2227 | dwQuit = hr; | ||
| 2228 | } | ||
| 2229 | |||
| 2230 | // initiate engine shutdown | ||
| 2287 | pThis->m_pEngine->Quit(dwQuit); | 2231 | pThis->m_pEngine->Quit(dwQuit); |
| 2288 | 2232 | ||
| 2289 | ReleaseTheme(pThis->m_pTheme); | 2233 | ReleaseTheme(pThis->m_pTheme); |
| @@ -2335,9 +2279,6 @@ private: | |||
| 2335 | GetBundleFileVersion(); | 2279 | GetBundleFileVersion(); |
| 2336 | // don't fail if we couldn't get the version info; best-effort only | 2280 | // don't fail if we couldn't get the version info; best-effort only |
| 2337 | 2281 | ||
| 2338 | hr = InitializePackageInfo(); | ||
| 2339 | BalExitOnFailure(hr, "Failed to initialize wixstdba package information."); | ||
| 2340 | |||
| 2341 | if (m_fPrereq) | 2282 | if (m_fPrereq) |
| 2342 | { | 2283 | { |
| 2343 | hr = InitializePrerequisiteInformation(); | 2284 | hr = InitializePrerequisiteInformation(); |
| @@ -2521,38 +2462,6 @@ private: | |||
| 2521 | } | 2462 | } |
| 2522 | 2463 | ||
| 2523 | 2464 | ||
| 2524 | HRESULT InitializePackageInfo() | ||
| 2525 | { | ||
| 2526 | HRESULT hr = S_OK; | ||
| 2527 | BAL_INFO_PACKAGE* pPackage = NULL; | ||
| 2528 | |||
| 2529 | for (DWORD i = 0; i < m_Bundle.packages.cPackages; ++i) | ||
| 2530 | { | ||
| 2531 | pPackage = &m_Bundle.packages.rgPackages[i]; | ||
| 2532 | |||
| 2533 | hr = InitializePackageInfoForPackage(pPackage); | ||
| 2534 | BalExitOnFailure(hr, "Failed to initialize wixstdba package info for package: %ls.", pPackage->sczId); | ||
| 2535 | } | ||
| 2536 | |||
| 2537 | LExit: | ||
| 2538 | return hr; | ||
| 2539 | } | ||
| 2540 | |||
| 2541 | |||
| 2542 | HRESULT InitializePackageInfoForPackage( | ||
| 2543 | __in BAL_INFO_PACKAGE* pPackage | ||
| 2544 | ) | ||
| 2545 | { | ||
| 2546 | HRESULT hr = S_OK; | ||
| 2547 | |||
| 2548 | pPackage->pvCustomData = MemAlloc(sizeof(WIXSTDBA_PACKAGE_INFO), TRUE); | ||
| 2549 | BalExitOnNull(pPackage->pvCustomData, hr, E_OUTOFMEMORY, "Failed to allocate memory for wixstdba package info."); | ||
| 2550 | |||
| 2551 | LExit: | ||
| 2552 | return hr; | ||
| 2553 | } | ||
| 2554 | |||
| 2555 | |||
| 2556 | HRESULT InitializePrerequisiteInformation() | 2465 | HRESULT InitializePrerequisiteInformation() |
| 2557 | { | 2466 | { |
| 2558 | HRESULT hr = S_OK; | 2467 | HRESULT hr = S_OK; |
| @@ -2673,35 +2582,6 @@ private: | |||
| 2673 | return hr; | 2582 | return hr; |
| 2674 | } | 2583 | } |
| 2675 | 2584 | ||
| 2676 | HRESULT GetPackageInfo( | ||
| 2677 | __in_z LPCWSTR wzPackageId, | ||
| 2678 | __out WIXSTDBA_PACKAGE_INFO** ppPackageInfo, | ||
| 2679 | __out BAL_INFO_PACKAGE** ppPackage | ||
| 2680 | ) | ||
| 2681 | { | ||
| 2682 | HRESULT hr = E_NOTFOUND; | ||
| 2683 | WIXSTDBA_PACKAGE_INFO* pPackageInfo = NULL; | ||
| 2684 | BAL_INFO_PACKAGE* pPackage = NULL; | ||
| 2685 | |||
| 2686 | Assert(wzPackageId && *wzPackageId); | ||
| 2687 | Assert(ppPackage); | ||
| 2688 | Assert(ppPackageInfo); | ||
| 2689 | |||
| 2690 | hr = BalInfoFindPackageById(&m_Bundle.packages, wzPackageId, &pPackage); | ||
| 2691 | if (E_NOTFOUND != hr) | ||
| 2692 | { | ||
| 2693 | ExitOnFailure(hr, "Failed trying to find the requested package."); | ||
| 2694 | |||
| 2695 | pPackageInfo = reinterpret_cast<WIXSTDBA_PACKAGE_INFO*>(pPackage->pvCustomData); | ||
| 2696 | } | ||
| 2697 | |||
| 2698 | *ppPackageInfo = pPackageInfo; | ||
| 2699 | *ppPackage = pPackage; | ||
| 2700 | |||
| 2701 | LExit: | ||
| 2702 | return hr; | ||
| 2703 | } | ||
| 2704 | |||
| 2705 | 2585 | ||
| 2706 | // | 2586 | // |
| 2707 | // Get the file version of the bootstrapper and record in bootstrapper log file | 2587 | // Get the file version of the bootstrapper and record in bootstrapper log file |
| @@ -3408,6 +3288,23 @@ private: | |||
| 3408 | } | 3288 | } |
| 3409 | } | 3289 | } |
| 3410 | } | 3290 | } |
| 3291 | else if (E_PREREQBA_INFINITE_LOOP == m_hrFinal) | ||
| 3292 | { | ||
| 3293 | HRESULT hr = StrAllocString(&sczUnformattedText, L"#(loc.PREREQBAINFINITELOOPErrorMessage)", 0); | ||
| 3294 | if (FAILED(hr)) | ||
| 3295 | { | ||
| 3296 | BalLogError(hr, "Failed to initialize PREREQBAINFINITELOOPErrorMessage loc identifier."); | ||
| 3297 | } | ||
| 3298 | else | ||
| 3299 | { | ||
| 3300 | hr = LocLocalizeString(m_pWixLoc, &sczUnformattedText); | ||
| 3301 | if (FAILED(hr)) | ||
| 3302 | { | ||
| 3303 | BalLogError(hr, "Failed to localize PREREQBAINFINITELOOPErrorMessage: %ls", sczUnformattedText); | ||
| 3304 | ReleaseNullStr(sczUnformattedText); | ||
| 3305 | } | ||
| 3306 | } | ||
| 3307 | } | ||
| 3411 | else // try to get the error message from the error code. | 3308 | else // try to get the error message from the error code. |
| 3412 | { | 3309 | { |
| 3413 | StrAllocFromError(&sczUnformattedText, m_hrFinal, NULL); | 3310 | StrAllocFromError(&sczUnformattedText, m_hrFinal, NULL); |
| @@ -3424,14 +3321,9 @@ private: | |||
| 3424 | StrAllocString(&sczText, sczUnformattedText, 0); | 3321 | StrAllocString(&sczText, sczUnformattedText, 0); |
| 3425 | } | 3322 | } |
| 3426 | } | 3323 | } |
| 3427 | else if (E_MBAHOST_NET452_ON_WIN7RTM == m_hrFinal) | 3324 | else if (E_MBAHOST_NET452_ON_WIN7RTM == m_hrFinal || |
| 3428 | { | 3325 | E_DNCHOST_SCD_RUNTIME_FAILURE == m_hrFinal || |
| 3429 | if (sczUnformattedText) | 3326 | E_PREREQBA_INFINITE_LOOP == m_hrFinal) |
| 3430 | { | ||
| 3431 | BalFormatString(sczUnformattedText, &sczText); | ||
| 3432 | } | ||
| 3433 | } | ||
| 3434 | else if (E_DNCHOST_SCD_RUNTIME_FAILURE == m_hrFinal) | ||
| 3435 | { | 3327 | { |
| 3436 | if (sczUnformattedText) | 3328 | if (sczUnformattedText) |
| 3437 | { | 3329 | { |
| @@ -4180,8 +4072,7 @@ public: | |||
| 4180 | // | 4072 | // |
| 4181 | CWixStandardBootstrapperApplication( | 4073 | CWixStandardBootstrapperApplication( |
| 4182 | __in HMODULE hModule, | 4074 | __in HMODULE hModule, |
| 4183 | __in BOOL fPrereq, | 4075 | __in_opt PREQBA_DATA* pPrereqData, |
| 4184 | __in HRESULT hrHostInitialization, | ||
| 4185 | __in IBootstrapperEngine* pEngine | 4076 | __in IBootstrapperEngine* pEngine |
| 4186 | ) : CBalBaseBootstrapperApplication(pEngine, 3, 3000) | 4077 | ) : CBalBaseBootstrapperApplication(pEngine, 3, 3000) |
| 4187 | { | 4078 | { |
| @@ -4210,7 +4101,7 @@ public: | |||
| 4210 | m_hWnd = NULL; | 4101 | m_hWnd = NULL; |
| 4211 | 4102 | ||
| 4212 | m_state = WIXSTDBA_STATE_INITIALIZING; | 4103 | m_state = WIXSTDBA_STATE_INITIALIZING; |
| 4213 | m_hrFinal = hrHostInitialization; | 4104 | m_hrFinal = pPrereqData ? pPrereqData->hrHostInitialization : S_OK; |
| 4214 | 4105 | ||
| 4215 | m_restartResult = BOOTSTRAPPER_APPLY_RESTART_NONE; | 4106 | m_restartResult = BOOTSTRAPPER_APPLY_RESTART_NONE; |
| 4216 | m_fRestartRequired = FALSE; | 4107 | m_fRestartRequired = FALSE; |
| @@ -4231,9 +4122,9 @@ public: | |||
| 4231 | m_fShowingInternalUiThisPackage = FALSE; | 4122 | m_fShowingInternalUiThisPackage = FALSE; |
| 4232 | m_fTriedToLaunchElevated = FALSE; | 4123 | m_fTriedToLaunchElevated = FALSE; |
| 4233 | 4124 | ||
| 4234 | m_fPrereq = fPrereq; | 4125 | m_pPrereqData = pPrereqData; |
| 4126 | m_fPrereq = NULL != pPrereqData; | ||
| 4235 | m_fPrereqInstalled = FALSE; | 4127 | m_fPrereqInstalled = FALSE; |
| 4236 | m_fPrereqAlreadyInstalled = FALSE; | ||
| 4237 | 4128 | ||
| 4238 | pEngine->AddRef(); | 4129 | pEngine->AddRef(); |
| 4239 | m_pEngine = pEngine; | 4130 | m_pEngine = pEngine; |
| @@ -4418,11 +4309,6 @@ public: | |||
| 4418 | AssertSz(!m_pTaskbarList, "Taskbar should have been released before destructor."); | 4309 | AssertSz(!m_pTaskbarList, "Taskbar should have been released before destructor."); |
| 4419 | AssertSz(!m_pTheme, "Theme should have been released before destructor."); | 4310 | AssertSz(!m_pTheme, "Theme should have been released before destructor."); |
| 4420 | 4311 | ||
| 4421 | for (DWORD i = 0; i < m_Bundle.packages.cPackages; ++i) | ||
| 4422 | { | ||
| 4423 | ReleaseMem(m_Bundle.packages.rgPackages[i].pvCustomData); | ||
| 4424 | } | ||
| 4425 | |||
| 4426 | ::DeleteCriticalSection(&m_csShowingInternalUiThisPackage); | 4312 | ::DeleteCriticalSection(&m_csShowingInternalUiThisPackage); |
| 4427 | ReleaseStr(m_sczFailedMessage); | 4313 | ReleaseStr(m_sczFailedMessage); |
| 4428 | ReleaseStr(m_sczConfirmCloseMessage); | 4314 | ReleaseStr(m_sczConfirmCloseMessage); |
| @@ -4436,18 +4322,6 @@ public: | |||
| 4436 | ReleaseStr(m_sczBundleVersion); | 4322 | ReleaseStr(m_sczBundleVersion); |
| 4437 | ReleaseStr(m_sczAfterForcedRestartPackage); | 4323 | ReleaseStr(m_sczAfterForcedRestartPackage); |
| 4438 | ReleaseNullObject(m_pEngine); | 4324 | ReleaseNullObject(m_pEngine); |
| 4439 | |||
| 4440 | if (m_hBAFModule) | ||
| 4441 | { | ||
| 4442 | PFN_BA_FUNCTIONS_DESTROY pfnBAFunctionsDestroy = reinterpret_cast<PFN_BA_FUNCTIONS_DESTROY>(::GetProcAddress(m_hBAFModule, "BAFunctionsDestroy")); | ||
| 4443 | if (pfnBAFunctionsDestroy) | ||
| 4444 | { | ||
| 4445 | pfnBAFunctionsDestroy(); | ||
| 4446 | } | ||
| 4447 | |||
| 4448 | ::FreeLibrary(m_hBAFModule); | ||
| 4449 | m_hBAFModule = NULL; | ||
| 4450 | } | ||
| 4451 | } | 4325 | } |
| 4452 | 4326 | ||
| 4453 | private: | 4327 | private: |
| @@ -4529,9 +4403,9 @@ private: | |||
| 4529 | BOOL m_fSupportCacheOnly; | 4403 | BOOL m_fSupportCacheOnly; |
| 4530 | BOOL m_fRequestedCacheOnly; | 4404 | BOOL m_fRequestedCacheOnly; |
| 4531 | 4405 | ||
| 4406 | PREQBA_DATA* m_pPrereqData; | ||
| 4532 | BOOL m_fPrereq; | 4407 | BOOL m_fPrereq; |
| 4533 | BOOL m_fPrereqInstalled; | 4408 | BOOL m_fPrereqInstalled; |
| 4534 | BOOL m_fPrereqAlreadyInstalled; | ||
| 4535 | 4409 | ||
| 4536 | ITaskbarList3* m_pTaskbarList; | 4410 | ITaskbarList3* m_pTaskbarList; |
| 4537 | UINT m_uTaskbarButtonCreatedMessage; | 4411 | UINT m_uTaskbarButtonCreatedMessage; |
| @@ -4551,8 +4425,7 @@ private: | |||
| 4551 | // | 4425 | // |
| 4552 | HRESULT CreateBootstrapperApplication( | 4426 | HRESULT CreateBootstrapperApplication( |
| 4553 | __in HMODULE hModule, | 4427 | __in HMODULE hModule, |
| 4554 | __in BOOL fPrereq, | 4428 | __in_opt PREQBA_DATA* pPrereqData, |
| 4555 | __in HRESULT hrHostInitialization, | ||
| 4556 | __in IBootstrapperEngine* pEngine, | 4429 | __in IBootstrapperEngine* pEngine, |
| 4557 | __in const BOOTSTRAPPER_CREATE_ARGS* pArgs, | 4430 | __in const BOOTSTRAPPER_CREATE_ARGS* pArgs, |
| 4558 | __inout BOOTSTRAPPER_CREATE_RESULTS* pResults, | 4431 | __inout BOOTSTRAPPER_CREATE_RESULTS* pResults, |
| @@ -4567,7 +4440,7 @@ HRESULT CreateBootstrapperApplication( | |||
| 4567 | BalExitOnFailure(hr = E_INVALIDARG, "Engine requested Unknown display type."); | 4440 | BalExitOnFailure(hr = E_INVALIDARG, "Engine requested Unknown display type."); |
| 4568 | } | 4441 | } |
| 4569 | 4442 | ||
| 4570 | pApplication = new CWixStandardBootstrapperApplication(hModule, fPrereq, hrHostInitialization, pEngine); | 4443 | pApplication = new CWixStandardBootstrapperApplication(hModule, pPrereqData, pEngine); |
| 4571 | BalExitOnNull(pApplication, hr, E_OUTOFMEMORY, "Failed to create new standard bootstrapper application object."); | 4444 | BalExitOnNull(pApplication, hr, E_OUTOFMEMORY, "Failed to create new standard bootstrapper application object."); |
| 4572 | 4445 | ||
| 4573 | hr = pApplication->Initialize(pArgs); | 4446 | hr = pApplication->Initialize(pArgs); |
| @@ -4584,6 +4457,17 @@ LExit: | |||
| 4584 | } | 4457 | } |
| 4585 | 4458 | ||
| 4586 | 4459 | ||
| 4460 | void DestroyBootstrapperApplication( | ||
| 4461 | __in IBootstrapperApplication* pApplication, | ||
| 4462 | __in const BOOTSTRAPPER_DESTROY_ARGS* pArgs, | ||
| 4463 | __inout BOOTSTRAPPER_DESTROY_RESULTS* pResults | ||
| 4464 | ) | ||
| 4465 | { | ||
| 4466 | CWixStandardBootstrapperApplication* pBA = (CWixStandardBootstrapperApplication*)pApplication; | ||
| 4467 | pBA->Uninitialize(pArgs, pResults); | ||
| 4468 | } | ||
| 4469 | |||
| 4470 | |||
| 4587 | static HRESULT DAPI EvaluateVariableConditionCallback( | 4471 | static HRESULT DAPI EvaluateVariableConditionCallback( |
| 4588 | __in_z LPCWSTR wzCondition, | 4472 | __in_z LPCWSTR wzCondition, |
| 4589 | __out BOOL* pf, | 4473 | __out BOOL* pf, |
diff --git a/src/ext/Bal/wixstdba/inc/preqba.h b/src/ext/Bal/wixstdba/inc/preqba.h new file mode 100644 index 00000000..93a547ed --- /dev/null +++ b/src/ext/Bal/wixstdba/inc/preqba.h | |||
| @@ -0,0 +1,16 @@ | |||
| 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 | struct PREQBA_DATA | ||
| 6 | { | ||
| 7 | HRESULT hrHostInitialization; | ||
| 8 | BOOL fCompleted; | ||
| 9 | }; | ||
| 10 | |||
| 11 | extern "C" typedef HRESULT(WINAPI* PFN_PREQ_BOOTSTRAPPER_APPLICATION_CREATE)( | ||
| 12 | __in PREQBA_DATA* pPreqData, | ||
| 13 | __in IBootstrapperEngine* pEngine, | ||
| 14 | __in const BOOTSTRAPPER_CREATE_ARGS* pArgs, | ||
| 15 | __inout BOOTSTRAPPER_CREATE_RESULTS* pResults | ||
| 16 | ); | ||
diff --git a/src/ext/Bal/wixstdba/precomp.h b/src/ext/Bal/wixstdba/precomp.h index ba56ae6d..290c125b 100644 --- a/src/ext/Bal/wixstdba/precomp.h +++ b/src/ext/Bal/wixstdba/precomp.h | |||
| @@ -17,43 +17,49 @@ | |||
| 17 | #include <strsafe.h> | 17 | #include <strsafe.h> |
| 18 | #include <stddef.h> | 18 | #include <stddef.h> |
| 19 | 19 | ||
| 20 | #include "dutil.h" | 20 | #include <dutil.h> |
| 21 | #include "apputil.h" | 21 | #include <apputil.h> |
| 22 | #include "memutil.h" | 22 | #include <memutil.h> |
| 23 | #include "dictutil.h" | 23 | #include <dictutil.h> |
| 24 | #include "dirutil.h" | 24 | #include <dirutil.h> |
| 25 | #include "fileutil.h" | 25 | #include <fileutil.h> |
| 26 | #include "locutil.h" | 26 | #include <locutil.h> |
| 27 | #include "logutil.h" | 27 | #include <logutil.h> |
| 28 | #include "pathutil.h" | 28 | #include <pathutil.h> |
| 29 | #include "resrutil.h" | 29 | #include <resrutil.h> |
| 30 | #include "shelutil.h" | 30 | #include <shelutil.h> |
| 31 | #include "strutil.h" | 31 | #include <strutil.h> |
| 32 | #include "wndutil.h" | 32 | #include <wndutil.h> |
| 33 | #include "thmutil.h" | 33 | #include <thmutil.h> |
| 34 | #include "verutil.h" | 34 | #include <verutil.h> |
| 35 | #include "uriutil.h" | 35 | #include <uriutil.h> |
| 36 | #include "xmlutil.h" | 36 | #include <xmlutil.h> |
| 37 | |||
| 38 | #include "BootstrapperEngine.h" | ||
| 39 | #include "BootstrapperApplication.h" | ||
| 40 | #include "IBootstrapperEngine.h" | ||
| 41 | #include "IBootstrapperApplication.h" | ||
| 42 | |||
| 43 | #include "balutil.h" | ||
| 44 | #include "balinfo.h" | ||
| 45 | #include "balcondition.h" | ||
| 46 | |||
| 47 | #include "BAFunctions.h" | ||
| 48 | 37 | ||
| 38 | #include <BootstrapperEngine.h> | ||
| 39 | #include <BootstrapperApplication.h> | ||
| 40 | #include <IBootstrapperEngine.h> | ||
| 41 | #include <IBootstrapperApplication.h> | ||
| 42 | |||
| 43 | #include <balutil.h> | ||
| 44 | #include <balinfo.h> | ||
| 45 | #include <balcondition.h> | ||
| 46 | |||
| 47 | #include <BAFunctions.h> | ||
| 48 | |||
| 49 | #include "inc\preqba.h" | ||
| 49 | #include "wixstdba.messages.h" | 50 | #include "wixstdba.messages.h" |
| 50 | 51 | ||
| 51 | HRESULT CreateBootstrapperApplication( | 52 | HRESULT CreateBootstrapperApplication( |
| 52 | __in HMODULE hModule, | 53 | __in HMODULE hModule, |
| 53 | __in BOOL fPrereq, | 54 | __in_opt PREQBA_DATA* pPrereqData, |
| 54 | __in HRESULT hrHostInitialization, | ||
| 55 | __in IBootstrapperEngine* pEngine, | 55 | __in IBootstrapperEngine* pEngine, |
| 56 | __in const BOOTSTRAPPER_CREATE_ARGS* pArgs, | 56 | __in const BOOTSTRAPPER_CREATE_ARGS* pArgs, |
| 57 | __inout BOOTSTRAPPER_CREATE_RESULTS* pResults, | 57 | __inout BOOTSTRAPPER_CREATE_RESULTS* pResults, |
| 58 | __out IBootstrapperApplication** ppApplication | 58 | __out IBootstrapperApplication** ppApplication |
| 59 | ); | 59 | ); |
| 60 | |||
| 61 | void DestroyBootstrapperApplication( | ||
| 62 | __in IBootstrapperApplication* pApplication, | ||
| 63 | __in const BOOTSTRAPPER_DESTROY_ARGS* pArgs, | ||
| 64 | __inout BOOTSTRAPPER_DESTROY_RESULTS* pResults | ||
| 65 | ); | ||
diff --git a/src/ext/Bal/wixstdba/wixstdba.cpp b/src/ext/Bal/wixstdba/wixstdba.cpp index a96f1738..47f3f677 100644 --- a/src/ext/Bal/wixstdba/wixstdba.cpp +++ b/src/ext/Bal/wixstdba/wixstdba.cpp | |||
| @@ -50,7 +50,7 @@ extern "C" HRESULT WINAPI BootstrapperApplicationCreate( | |||
| 50 | hr = BalInitializeFromCreateArgs(pArgs, &pEngine); | 50 | hr = BalInitializeFromCreateArgs(pArgs, &pEngine); |
| 51 | ExitOnFailure(hr, "Failed to initialize Bal."); | 51 | ExitOnFailure(hr, "Failed to initialize Bal."); |
| 52 | 52 | ||
| 53 | hr = CreateBootstrapperApplication(vhInstance, FALSE, S_OK, pEngine, pArgs, pResults, &vpApplication); | 53 | hr = CreateBootstrapperApplication(vhInstance, NULL, pEngine, pArgs, pResults, &vpApplication); |
| 54 | BalExitOnFailure(hr, "Failed to create bootstrapper application interface."); | 54 | BalExitOnFailure(hr, "Failed to create bootstrapper application interface."); |
| 55 | 55 | ||
| 56 | LExit: | 56 | LExit: |
| @@ -60,45 +60,24 @@ LExit: | |||
| 60 | } | 60 | } |
| 61 | 61 | ||
| 62 | 62 | ||
| 63 | extern "C" void WINAPI BootstrapperApplicationDestroy() | 63 | extern "C" void WINAPI BootstrapperApplicationDestroy( |
| 64 | { | 64 | __in const BOOTSTRAPPER_DESTROY_ARGS* pArgs, |
| 65 | ReleaseNullObject(vpApplication); | 65 | __in BOOTSTRAPPER_DESTROY_RESULTS* pResults |
| 66 | BalUninitialize(); | ||
| 67 | DutilUninitialize(); | ||
| 68 | } | ||
| 69 | |||
| 70 | |||
| 71 | extern "C" HRESULT WINAPI DncPrereqBootstrapperApplicationCreate( | ||
| 72 | __in HRESULT hrHostInitialization, | ||
| 73 | __in IBootstrapperEngine* pEngine, | ||
| 74 | __in const BOOTSTRAPPER_CREATE_ARGS* pArgs, | ||
| 75 | __inout BOOTSTRAPPER_CREATE_RESULTS* pResults | ||
| 76 | ) | 66 | ) |
| 77 | { | 67 | { |
| 78 | HRESULT hr = S_OK; | 68 | if (vpApplication) |
| 79 | 69 | { | |
| 80 | DutilInitialize(&WixstdbaTraceError); | 70 | DestroyBootstrapperApplication(vpApplication, pArgs, pResults); |
| 81 | 71 | } | |
| 82 | BalInitialize(pEngine); | ||
| 83 | |||
| 84 | hr = CreateBootstrapperApplication(vhInstance, TRUE, hrHostInitialization, pEngine, pArgs, pResults, &vpApplication); | ||
| 85 | BalExitOnFailure(hr, "Failed to create .NET Core prerequisite bootstrapper application interface."); | ||
| 86 | |||
| 87 | LExit: | ||
| 88 | return hr; | ||
| 89 | } | ||
| 90 | |||
| 91 | 72 | ||
| 92 | extern "C" void WINAPI DncPrereqBootstrapperApplicationDestroy() | ||
| 93 | { | ||
| 94 | ReleaseNullObject(vpApplication); | 73 | ReleaseNullObject(vpApplication); |
| 95 | BalUninitialize(); | 74 | BalUninitialize(); |
| 96 | DutilUninitialize(); | 75 | DutilUninitialize(); |
| 97 | } | 76 | } |
| 98 | 77 | ||
| 99 | 78 | ||
| 100 | extern "C" HRESULT WINAPI MbaPrereqBootstrapperApplicationCreate( | 79 | extern "C" HRESULT WINAPI PrereqBootstrapperApplicationCreate( |
| 101 | __in HRESULT hrHostInitialization, | 80 | __in_opt PREQBA_DATA* pPrereqData, |
| 102 | __in IBootstrapperEngine* pEngine, | 81 | __in IBootstrapperEngine* pEngine, |
| 103 | __in const BOOTSTRAPPER_CREATE_ARGS* pArgs, | 82 | __in const BOOTSTRAPPER_CREATE_ARGS* pArgs, |
| 104 | __inout BOOTSTRAPPER_CREATE_RESULTS* pResults | 83 | __inout BOOTSTRAPPER_CREATE_RESULTS* pResults |
| @@ -110,19 +89,20 @@ extern "C" HRESULT WINAPI MbaPrereqBootstrapperApplicationCreate( | |||
| 110 | 89 | ||
| 111 | BalInitialize(pEngine); | 90 | BalInitialize(pEngine); |
| 112 | 91 | ||
| 113 | hr = CreateBootstrapperApplication(vhInstance, TRUE, hrHostInitialization, pEngine, pArgs, pResults, &vpApplication); | 92 | hr = CreateBootstrapperApplication(vhInstance, pPrereqData, pEngine, pArgs, pResults, &vpApplication); |
| 114 | BalExitOnFailure(hr, "Failed to create managed prerequisite bootstrapper application interface."); | 93 | BalExitOnFailure(hr, "Failed to create prerequisite bootstrapper application interface."); |
| 115 | 94 | ||
| 116 | LExit: | 95 | LExit: |
| 117 | return hr; | 96 | return hr; |
| 118 | } | 97 | } |
| 119 | 98 | ||
| 120 | 99 | ||
| 121 | extern "C" void WINAPI MbaPrereqBootstrapperApplicationDestroy() | 100 | extern "C" void WINAPI PrereqBootstrapperApplicationDestroy( |
| 101 | __in const BOOTSTRAPPER_DESTROY_ARGS* pArgs, | ||
| 102 | __in BOOTSTRAPPER_DESTROY_RESULTS* pResults | ||
| 103 | ) | ||
| 122 | { | 104 | { |
| 123 | ReleaseNullObject(vpApplication); | 105 | BootstrapperApplicationDestroy(pArgs, pResults); |
| 124 | BalUninitialize(); | ||
| 125 | DutilUninitialize(); | ||
| 126 | } | 106 | } |
| 127 | 107 | ||
| 128 | static void CALLBACK WixstdbaTraceError( | 108 | static void CALLBACK WixstdbaTraceError( |
diff --git a/src/ext/Bal/wixstdba/wixstdba.def b/src/ext/Bal/wixstdba/wixstdba.def index ba9980d3..e377196b 100644 --- a/src/ext/Bal/wixstdba/wixstdba.def +++ b/src/ext/Bal/wixstdba/wixstdba.def | |||
| @@ -4,7 +4,5 @@ | |||
| 4 | EXPORTS | 4 | EXPORTS |
| 5 | BootstrapperApplicationCreate | 5 | BootstrapperApplicationCreate |
| 6 | BootstrapperApplicationDestroy | 6 | BootstrapperApplicationDestroy |
| 7 | DncPrereqBootstrapperApplicationCreate | 7 | PrereqBootstrapperApplicationCreate |
| 8 | DncPrereqBootstrapperApplicationDestroy | 8 | PrereqBootstrapperApplicationDestroy |
| 9 | MbaPrereqBootstrapperApplicationCreate | ||
| 10 | MbaPrereqBootstrapperApplicationDestroy | ||
diff --git a/src/ext/Bal/wixstdba/wixstdba.vcxproj b/src/ext/Bal/wixstdba/wixstdba.vcxproj index a43cc345..9273c1ed 100644 --- a/src/ext/Bal/wixstdba/wixstdba.vcxproj +++ b/src/ext/Bal/wixstdba/wixstdba.vcxproj | |||
| @@ -52,6 +52,7 @@ | |||
| 52 | <ClCompile Include="wixstdba.cpp" /> | 52 | <ClCompile Include="wixstdba.cpp" /> |
| 53 | </ItemGroup> | 53 | </ItemGroup> |
| 54 | <ItemGroup> | 54 | <ItemGroup> |
| 55 | <ClInclude Include="inc\preqba.h" /> | ||
| 55 | <ClInclude Include="precomp.h" /> | 56 | <ClInclude Include="precomp.h" /> |
| 56 | <ClInclude Include="resource.h" /> | 57 | <ClInclude Include="resource.h" /> |
| 57 | </ItemGroup> | 58 | </ItemGroup> |
diff --git a/src/test/burn/TestBA/TestBA.cs b/src/test/burn/TestBA/TestBA.cs index 5f492efd..1548c05b 100644 --- a/src/test/burn/TestBA/TestBA.cs +++ b/src/test/burn/TestBA/TestBA.cs | |||
| @@ -171,7 +171,13 @@ namespace WixToolset.Test.BA | |||
| 171 | this.dummyWindow.Dispose(); | 171 | this.dummyWindow.Dispose(); |
| 172 | } | 172 | } |
| 173 | 173 | ||
| 174 | this.Engine.Quit(this.result & 0xFFFF); // return plain old Win32 error, not HRESULT. | 174 | var exitCode = this.result; |
| 175 | if ((exitCode & 0xFFFF0000) == unchecked(0x80070000)) | ||
| 176 | { | ||
| 177 | exitCode &= 0xFFFF; // return plain old Win32 error, not HRESULT. | ||
| 178 | } | ||
| 179 | |||
| 180 | this.Engine.Quit(exitCode); | ||
| 175 | } | 181 | } |
| 176 | 182 | ||
| 177 | protected override void OnDetectUpdateBegin(DetectUpdateBeginEventArgs args) | 183 | protected override void OnDetectUpdateBegin(DetectUpdateBeginEventArgs args) |
diff --git a/src/test/burn/TestData/Manual/BafThmutilTesting/precomp.cpp b/src/test/burn/TestData/Manual/BafThmutilTesting/precomp.cpp index b20f4230..fc9d1177 100644 --- a/src/test/burn/TestData/Manual/BafThmutilTesting/precomp.cpp +++ b/src/test/burn/TestData/Manual/BafThmutilTesting/precomp.cpp | |||
| @@ -40,6 +40,8 @@ LExit: | |||
| 40 | } | 40 | } |
| 41 | 41 | ||
| 42 | extern "C" void WINAPI BAFunctionsDestroy( | 42 | extern "C" void WINAPI BAFunctionsDestroy( |
| 43 | __in const BA_FUNCTIONS_DESTROY_ARGS* /*pArgs*/, | ||
| 44 | __inout BA_FUNCTIONS_DESTROY_RESULTS* /*pResults*/ | ||
| 43 | ) | 45 | ) |
| 44 | { | 46 | { |
| 45 | BalUninitialize(); | 47 | BalUninitialize(); |
diff --git a/src/test/burn/WixToolset.WixBA/WixBA.cs b/src/test/burn/WixToolset.WixBA/WixBA.cs index 68288f2d..60426ca8 100644 --- a/src/test/burn/WixToolset.WixBA/WixBA.cs +++ b/src/test/burn/WixToolset.WixBA/WixBA.cs | |||
| @@ -179,7 +179,14 @@ namespace WixToolset.WixBA | |||
| 179 | Threading.Dispatcher.Run(); | 179 | Threading.Dispatcher.Run(); |
| 180 | 180 | ||
| 181 | this.PostTelemetry(); | 181 | this.PostTelemetry(); |
| 182 | this.Engine.Quit(WixBA.Model.Result); | 182 | |
| 183 | var exitCode = WixBA.Model.Result; | ||
| 184 | if ((exitCode & 0xFFFF0000) == unchecked(0x80070000)) | ||
| 185 | { | ||
| 186 | exitCode &= 0xFFFF; // return plain old Win32 error, not HRESULT. | ||
| 187 | } | ||
| 188 | |||
| 189 | this.Engine.Quit(exitCode); | ||
| 183 | } | 190 | } |
| 184 | 191 | ||
| 185 | private void PostTelemetry() | 192 | private void PostTelemetry() |
diff --git a/src/test/burn/WixToolsetTest.BurnE2E/PrereqBaTests.cs b/src/test/burn/WixToolsetTest.BurnE2E/PrereqBaTests.cs index ec828f89..52e165b4 100644 --- a/src/test/burn/WixToolsetTest.BurnE2E/PrereqBaTests.cs +++ b/src/test/burn/WixToolsetTest.BurnE2E/PrereqBaTests.cs | |||
| @@ -12,6 +12,8 @@ namespace WixToolsetTest.BurnE2E | |||
| 12 | { | 12 | { |
| 13 | public PrereqBaTests(ITestOutputHelper testOutputHelper) : base(testOutputHelper) { } | 13 | public PrereqBaTests(ITestOutputHelper testOutputHelper) : base(testOutputHelper) { } |
| 14 | 14 | ||
| 15 | const int E_PREREQBA_INFINITE_LOOP = -2_114_714_646; | ||
| 16 | |||
| 15 | /// <summary> | 17 | /// <summary> |
| 16 | /// This bundle purposely provides a .runtimeconfig.json file that requires a version of .NET Core that doesn't exist, | 18 | /// This bundle purposely provides a .runtimeconfig.json file that requires a version of .NET Core that doesn't exist, |
| 17 | /// with an MSI package to represent the prerequisite package. | 19 | /// with an MSI package to represent the prerequisite package. |
| @@ -32,7 +34,7 @@ namespace WixToolsetTest.BurnE2E | |||
| 32 | // Source file should *not* be installed | 34 | // Source file should *not* be installed |
| 33 | Assert.False(File.Exists(packageASourceCodeInstalled), $"Package A payload should not be there on test start: {packageASourceCodeInstalled}"); | 35 | Assert.False(File.Exists(packageASourceCodeInstalled), $"Package A payload should not be there on test start: {packageASourceCodeInstalled}"); |
| 34 | 36 | ||
| 35 | bundleA.Install(); | 37 | bundleA.Install(E_PREREQBA_INFINITE_LOOP); |
| 36 | 38 | ||
| 37 | // Part of the test is Install actually completing. | 39 | // Part of the test is Install actually completing. |
| 38 | 40 | ||
| @@ -63,7 +65,7 @@ namespace WixToolsetTest.BurnE2E | |||
| 63 | // Source file should *not* be installed | 65 | // Source file should *not* be installed |
| 64 | Assert.False(File.Exists(packageBSourceCodeInstalled), $"Package B payload should not be there on test start: {packageBSourceCodeInstalled}"); | 66 | Assert.False(File.Exists(packageBSourceCodeInstalled), $"Package B payload should not be there on test start: {packageBSourceCodeInstalled}"); |
| 65 | 67 | ||
| 66 | bundleB.Install(); | 68 | bundleB.Install(E_PREREQBA_INFINITE_LOOP); |
| 67 | 69 | ||
| 68 | // Part of the test is Install actually completing. | 70 | // Part of the test is Install actually completing. |
| 69 | 71 | ||
