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 --- 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 ++++++++ 7 files changed, 72 insertions(+), 10 deletions(-) (limited to 'src') 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