From a563fb99daca852422d61ae8599a3dc32fa1bfe6 Mon Sep 17 00:00:00 2001 From: Bob Arnson Date: Sat, 26 Dec 2020 22:15:06 -0500 Subject: First steps on Burn for x64 and ARM64 --- appveyor.cmd | 2 ++ burn.sln | 16 ++++++++++++++-- src/engine/engine.cpp | 29 ++++++++++++++++++++++++++++- src/engine/engine.mc | 2 +- src/engine/engine.vcxproj | 8 ++++++++ src/engine/variable.cpp | 23 +++++++++++++++-------- src/stub/WixToolset.Burn.nuspec | 4 ++++ src/stub/stub.vcxproj | 8 ++++++++ src/test/BurnUnitTest/BurnUnitTest.vcxproj | 8 ++++++++ 9 files changed, 88 insertions(+), 12 deletions(-) diff --git a/appveyor.cmd b/appveyor.cmd index 82602274..b9cf1258 100644 --- a/appveyor.cmd +++ b/appveyor.cmd @@ -6,6 +6,8 @@ nuget restore || exit /b msbuild -t:Test -p:Configuration=Release src\test\BurnUnitTest || exit /b msbuild -p:Configuration=Release;Platform=x86 || exit /b +msbuild -p:Configuration=Release;Platform=x64 || exit /b +msbuild -p:Configuration=Release;Platform=arm64 || exit /b msbuild -p:Configuration=Release -t:Pack src\stub\stub.vcxproj || exit /b msbuild -p:Configuration=Release -t:Pack src\WixToolset.BootstrapperCore.Native\WixToolset.BootstrapperCore.Native.proj || exit /b diff --git a/burn.sln b/burn.sln index 32fe11d5..6a64b8f0 100644 --- a/burn.sln +++ b/burn.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 15 -VisualStudioVersion = 15.0.26730.12 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.30711.63 MinimumVisualStudioVersion = 15.0.26124.0 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "engine", "src\engine\engine.vcxproj", "{8119537D-E1D9-6591-D51A-49768A2F9C37}" EndProject @@ -11,31 +11,43 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "BurnUnitTest", "src\test\Bu EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|ARM64 = Debug|ARM64 Debug|x64 = Debug|x64 Debug|x86 = Debug|x86 + Release|ARM64 = Release|ARM64 Release|x64 = Release|x64 Release|x86 = Release|x86 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution + {8119537D-E1D9-6591-D51A-49768A2F9C37}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {8119537D-E1D9-6591-D51A-49768A2F9C37}.Debug|ARM64.Build.0 = Debug|ARM64 {8119537D-E1D9-6591-D51A-49768A2F9C37}.Debug|x64.ActiveCfg = Debug|x64 {8119537D-E1D9-6591-D51A-49768A2F9C37}.Debug|x64.Build.0 = Debug|x64 {8119537D-E1D9-6591-D51A-49768A2F9C37}.Debug|x86.ActiveCfg = Debug|Win32 {8119537D-E1D9-6591-D51A-49768A2F9C37}.Debug|x86.Build.0 = Debug|Win32 + {8119537D-E1D9-6591-D51A-49768A2F9C37}.Release|ARM64.ActiveCfg = Release|ARM64 + {8119537D-E1D9-6591-D51A-49768A2F9C37}.Release|ARM64.Build.0 = Release|ARM64 {8119537D-E1D9-6591-D51A-49768A2F9C37}.Release|x64.ActiveCfg = Release|x64 {8119537D-E1D9-6591-D51A-49768A2F9C37}.Release|x64.Build.0 = Release|x64 {8119537D-E1D9-6591-D51A-49768A2F9C37}.Release|x86.ActiveCfg = Release|Win32 {8119537D-E1D9-6591-D51A-49768A2F9C37}.Release|x86.Build.0 = Release|Win32 + {C38373AA-882F-4F55-B03F-2AAB4BFBE3F1}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {C38373AA-882F-4F55-B03F-2AAB4BFBE3F1}.Debug|ARM64.Build.0 = Debug|ARM64 {C38373AA-882F-4F55-B03F-2AAB4BFBE3F1}.Debug|x64.ActiveCfg = Debug|x64 {C38373AA-882F-4F55-B03F-2AAB4BFBE3F1}.Debug|x64.Build.0 = Debug|x64 {C38373AA-882F-4F55-B03F-2AAB4BFBE3F1}.Debug|x86.ActiveCfg = Debug|Win32 {C38373AA-882F-4F55-B03F-2AAB4BFBE3F1}.Debug|x86.Build.0 = Debug|Win32 + {C38373AA-882F-4F55-B03F-2AAB4BFBE3F1}.Release|ARM64.ActiveCfg = Release|ARM64 + {C38373AA-882F-4F55-B03F-2AAB4BFBE3F1}.Release|ARM64.Build.0 = Release|ARM64 {C38373AA-882F-4F55-B03F-2AAB4BFBE3F1}.Release|x64.ActiveCfg = Release|x64 {C38373AA-882F-4F55-B03F-2AAB4BFBE3F1}.Release|x64.Build.0 = Release|x64 {C38373AA-882F-4F55-B03F-2AAB4BFBE3F1}.Release|x86.ActiveCfg = Release|Win32 {C38373AA-882F-4F55-B03F-2AAB4BFBE3F1}.Release|x86.Build.0 = Release|Win32 + {9D1F1BA3-9393-4833-87A3-D5F1FC08EF67}.Debug|ARM64.ActiveCfg = Debug|ARM64 {9D1F1BA3-9393-4833-87A3-D5F1FC08EF67}.Debug|x64.ActiveCfg = Debug|Win32 {9D1F1BA3-9393-4833-87A3-D5F1FC08EF67}.Debug|x86.ActiveCfg = Debug|Win32 {9D1F1BA3-9393-4833-87A3-D5F1FC08EF67}.Debug|x86.Build.0 = Debug|Win32 + {9D1F1BA3-9393-4833-87A3-D5F1FC08EF67}.Release|ARM64.ActiveCfg = Release|ARM64 {9D1F1BA3-9393-4833-87A3-D5F1FC08EF67}.Release|x64.ActiveCfg = Release|Win32 {9D1F1BA3-9393-4833-87A3-D5F1FC08EF67}.Release|x86.ActiveCfg = Release|Win32 {9D1F1BA3-9393-4833-87A3-D5F1FC08EF67}.Release|x86.Build.0 = Release|Win32 diff --git a/src/engine/engine.cpp b/src/engine/engine.cpp index ae5b690c..3dbfb365 100644 --- a/src/engine/engine.cpp +++ b/src/engine/engine.cpp @@ -93,6 +93,7 @@ extern "C" HRESULT EngineRun( BOOL fRegInitialized = FALSE; BOOL fWiuInitialized = FALSE; BOOL fXmlInitialized = FALSE; + SYSTEM_INFO si = { }; OSVERSIONINFOEXW ovix = { }; LPWSTR sczExePath = NULL; BOOL fRunNormal = FALSE; @@ -155,8 +156,34 @@ extern "C" HRESULT EngineRun( ExitWithLastError(hr, "Failed to get OS info."); } +#if defined(_M_ARM64) + LPCSTR szBurnPlatform = "ARM64"; +#elif defined(_M_AMD64) + LPCSTR szBurnPlatform = "x64"; +#else + LPCSTR szBurnPlatform = "x86"; +#endif + + LPCSTR szMachinePlatform = "unknown architecture"; + ::GetNativeSystemInfo(&si); + switch (si.wProcessorArchitecture) + { + case PROCESSOR_ARCHITECTURE_AMD64: + szMachinePlatform = "x64"; + break; + case PROCESSOR_ARCHITECTURE_ARM: + szMachinePlatform = "ARM"; + break; + case PROCESSOR_ARCHITECTURE_ARM64: + szMachinePlatform = "ARM64"; + break; + case PROCESSOR_ARCHITECTURE_INTEL: + szMachinePlatform = "x86"; + break; + } + PathForCurrentProcess(&sczExePath, NULL); // Ignore failure. - LogId(REPORT_STANDARD, MSG_BURN_INFO, szVerMajorMinorBuild, ovix.dwMajorVersion, ovix.dwMinorVersion, ovix.dwBuildNumber, ovix.wServicePackMajor, sczExePath); + LogId(REPORT_STANDARD, MSG_BURN_INFO, szVerMajorMinorBuild, ovix.dwMajorVersion, ovix.dwMinorVersion, ovix.dwBuildNumber, ovix.wServicePackMajor, sczExePath, szBurnPlatform, szMachinePlatform); ReleaseNullStr(sczExePath); // initialize core diff --git a/src/engine/engine.mc b/src/engine/engine.mc index b36a9527..8e36e84e 100644 --- a/src/engine/engine.mc +++ b/src/engine/engine.mc @@ -33,7 +33,7 @@ MessageId=1 Severity=Success SymbolicName=MSG_BURN_INFO Language=English -Burn v%1!hs!, Windows v%2!d!.%3!d! (Build %4!d!: Service Pack %5!d!), path: %6!ls! +Burn %7!hs! v%1!hs!, Windows v%2!d!.%3!d! %8!hs! (Build %4!d!: Service Pack %5!d!), path: %6!ls! . MessageId=2 diff --git a/src/engine/engine.vcxproj b/src/engine/engine.vcxproj index d62105ed..52f71b1d 100644 --- a/src/engine/engine.vcxproj +++ b/src/engine/engine.vcxproj @@ -21,6 +21,14 @@ Release x64 + + Debug + ARM64 + + + Release + ARM64 + diff --git a/src/engine/variable.cpp b/src/engine/variable.cpp index ea84752d..51dbdff4 100644 --- a/src/engine/variable.cpp +++ b/src/engine/variable.cpp @@ -157,10 +157,6 @@ static HRESULT InitializeVariableNumeric( __in DWORD_PTR dwpData, __inout BURN_VARIANT* pValue ); -static HRESULT InitializeVariableRegistryFolder( - __in DWORD_PTR dwpData, - __inout BURN_VARIANT* pValue - ); static HRESULT InitializeVariable6432Folder( __in DWORD_PTR dwpData, __inout BURN_VARIANT* pValue @@ -190,6 +186,13 @@ static HRESULT Get64bitFolderFromRegistry( __deref_out_z LPWSTR* psczPath ); +#if !defined(_WIN64) +static HRESULT InitializeVariableRegistryFolder( + __in DWORD_PTR dwpData, + __inout BURN_VARIANT* pValue + ); +#endif + // function definitions @@ -1101,13 +1104,17 @@ static HRESULT FormatString( LPWSTR* rgVariables = NULL; DWORD cVariables = 0; DWORD cch = 0; + size_t cchIn = 0; BOOL fHidden = FALSE; MSIHANDLE hRecord = NULL; ::EnterCriticalSection(&pVariables->csAccess); // allocate buffer for format string - hr = StrAlloc(&sczFormat, lstrlenW(wzIn) + 1); + hr = ::StringCchLengthW(wzIn, STRSAFE_MAX_CCH - 1, &cchIn); + ExitOnFailure(hr, "Failed to length of format string."); + + hr = StrAlloc(&sczFormat, cchIn + 1); ExitOnFailure(hr, "Failed to allocate buffer for format string."); // read out variables from the unformatted string and build a format string @@ -1133,7 +1140,7 @@ static HRESULT FormatString( ExitOnFailure(hr, "Failed to append string."); break; } - cch = wzClose - wzOpen - 1; + cch = (DWORD)(wzClose - wzOpen - 1); if (0 == cch) { @@ -2170,6 +2177,7 @@ LExit: return hr; } +#if !defined(_WIN64) static HRESULT InitializeVariableRegistryFolder( __in DWORD_PTR dwpData, __inout BURN_VARIANT* pValue @@ -2179,7 +2187,6 @@ static HRESULT InitializeVariableRegistryFolder( int nFolder = (int)dwpData; LPWSTR sczPath = NULL; -#if !defined(_WIN64) BOOL fIsWow64 = FALSE; ProcWow64(::GetCurrentProcess(), &fIsWow64); @@ -2187,7 +2194,6 @@ static HRESULT InitializeVariableRegistryFolder( { ExitFunction(); } -#endif hr = Get64bitFolderFromRegistry(nFolder, &sczPath); ExitOnFailure(hr, "Failed to get 64-bit folder."); @@ -2201,6 +2207,7 @@ LExit: return hr; } +#endif static HRESULT InitializeVariable6432Folder( __in DWORD_PTR dwpData, diff --git a/src/stub/WixToolset.Burn.nuspec b/src/stub/WixToolset.Burn.nuspec index 35392523..f314a8a4 100644 --- a/src/stub/WixToolset.Burn.nuspec +++ b/src/stub/WixToolset.Burn.nuspec @@ -16,5 +16,9 @@ + + + + diff --git a/src/stub/stub.vcxproj b/src/stub/stub.vcxproj index 082b80e5..a8fbdfeb 100644 --- a/src/stub/stub.vcxproj +++ b/src/stub/stub.vcxproj @@ -24,6 +24,14 @@ Release x64 + + Debug + ARM64 + + + Release + ARM64 + diff --git a/src/test/BurnUnitTest/BurnUnitTest.vcxproj b/src/test/BurnUnitTest/BurnUnitTest.vcxproj index b668f68a..1f4a7111 100644 --- a/src/test/BurnUnitTest/BurnUnitTest.vcxproj +++ b/src/test/BurnUnitTest/BurnUnitTest.vcxproj @@ -6,10 +6,18 @@ + + Debug + ARM64 + Debug Win32 + + Release + ARM64 + Release Win32 -- cgit v1.2.3-55-g6feb