diff --git a/.gitignore b/.gitignore index 363b43464..b74cf84ed 100644 --- a/.gitignore +++ b/.gitignore @@ -20,12 +20,15 @@ # Build results [Dd]ebug/ [Dd]ebug64/ +[Dd]ebugARM64/ [Dd]ebugPublic/ [Rr]elease/ [Rr]elease64/ +[Rr]eleaseARM64/ [Rr]eleases/ x64/ x86/ +ARM64/ bld/ [Bb]in/ [Oo]bj/ diff --git a/Src/BUILDME.txt b/Src/BUILDME.txt index 4e9384964..95a6ad8ba 100644 --- a/Src/BUILDME.txt +++ b/Src/BUILDME.txt @@ -10,7 +10,7 @@ Visual Studio 2019 (Community Edition is enough) - Windows 10 SDK (10.0.19041.0) for Desktop C++ - Visual C++ ATL support HTML Help Workshop -WiX 3.7 +WiX 3.7 (3.14 for ARM64) 7-Zip It is possible to convert the projects to newer versions of Visual Studio and newer SDKs. Newer versions of WiX will probably work fine. diff --git a/Src/ClassicExplorer/ClassicExplorer.vcxproj b/Src/ClassicExplorer/ClassicExplorer.vcxproj index d53ba9d65..c001472e7 100644 --- a/Src/ClassicExplorer/ClassicExplorer.vcxproj +++ b/Src/ClassicExplorer/ClassicExplorer.vcxproj @@ -1,6 +1,10 @@ + + Debug + ARM64 + Debug Win32 @@ -9,6 +13,10 @@ Debug x64 + + Release + ARM64 + Release Win32 @@ -17,6 +25,10 @@ Release x64 + + Setup + ARM64 + Setup Win32 @@ -60,6 +72,13 @@ Unicode true + + DynamicLibrary + v142 + Static + Unicode + true + DynamicLibrary v142 @@ -67,12 +86,25 @@ Unicode true + + DynamicLibrary + v142 + Static + Unicode + true + DynamicLibrary v142 Static Unicode + + DynamicLibrary + v142 + Static + Unicode + @@ -92,14 +124,26 @@ + + + + + + + + + + + + $(Configuration)\ @@ -115,6 +159,13 @@ true $(ProjectName)64 + + true + true + $(ProjectName)ARM64 + $(Configuration)ARM64\ + $(Configuration)ARM64\ + $(Configuration)\ $(Configuration)\ @@ -129,6 +180,13 @@ false $(ProjectName)64 + + true + false + $(ProjectName)ARM64 + $(Configuration)ARM64\ + $(Configuration)ARM64\ + $(Configuration)\ $(Configuration)\ @@ -143,6 +201,13 @@ false $(ProjectName)64 + + true + false + $(ProjectName)ARM64 + $(Configuration)ARM64\ + $(Configuration)ARM64\ + _DEBUG;%(PreprocessorDefinitions) @@ -216,6 +281,43 @@ true + + + _DEBUG;%(PreprocessorDefinitions) + false + true + ClassicExplorer_i.h + + + ClassicExplorer_i.c + ClassicExplorer_p.c + + + Disabled + ..\Lib;%(AdditionalIncludeDirectories) + WIN32;_WINDOWS;_DEBUG;_USRDLL;%(PreprocessorDefinitions) + EnableFastChecks + MultiThreadedDebug + Use + Level3 + ProgramDatabase + true + true + stdcpp17 + + + _DEBUG;%(PreprocessorDefinitions) + $(IntDir);..\Lib;%(AdditionalIncludeDirectories) + + + true + oleacc.lib;comctl32.lib;uxtheme.lib;dwmapi.lib;winmm.lib;htmlhelp.lib;wininet.lib;wintrust.lib;crypt32.lib;Netapi32.lib;%(AdditionalDependencies) + .\$(TargetName).def + true + Windows + true + + NDEBUG;%(PreprocessorDefinitions) @@ -291,6 +393,44 @@ true + + + NDEBUG;%(PreprocessorDefinitions) + false + true + ClassicExplorer_i.h + + + ClassicExplorer_i.c + ClassicExplorer_p.c + + + MaxSpeed + ..\Lib;%(AdditionalIncludeDirectories) + WIN32;_WINDOWS;NDEBUG;_USRDLL;%(PreprocessorDefinitions) + MultiThreaded + Use + Level3 + ProgramDatabase + true + true + stdcpp17 + + + NDEBUG;%(PreprocessorDefinitions) + $(IntDir);..\Lib;%(AdditionalIncludeDirectories) + + + true + oleacc.lib;comctl32.lib;uxtheme.lib;dwmapi.lib;winmm.lib;htmlhelp.lib;wininet.lib;wintrust.lib;crypt32.lib;Netapi32.lib;%(AdditionalDependencies) + .\$(TargetName).def + true + Windows + true + true + true + + NDEBUG;%(PreprocessorDefinitions) @@ -364,6 +504,43 @@ true + + + NDEBUG;%(PreprocessorDefinitions) + false + true + ClassicExplorer_i.h + + + ClassicExplorer_i.c + ClassicExplorer_p.c + + + MaxSpeed + ..\Lib;%(AdditionalIncludeDirectories) + WIN32;_WINDOWS;NDEBUG;_USRDLL;BUILD_SETUP;%(PreprocessorDefinitions) + MultiThreaded + Use + Level3 + true + ProgramDatabase + true + true + stdcpp17 + + + NDEBUG;%(PreprocessorDefinitions) + $(IntDir);..\Lib;%(AdditionalIncludeDirectories) + + + oleacc.lib;comctl32.lib;uxtheme.lib;dwmapi.lib;winmm.lib;htmlhelp.lib;wininet.lib;wintrust.lib;crypt32.lib;Netapi32.lib;%(AdditionalDependencies) + .\$(TargetName).def + true + Windows + true + true + + @@ -388,6 +565,7 @@ + diff --git a/Src/ClassicExplorer/ClassicExplorer.vcxproj.filters b/Src/ClassicExplorer/ClassicExplorer.vcxproj.filters index b6c1eadd8..dbfd18a79 100644 --- a/Src/ClassicExplorer/ClassicExplorer.vcxproj.filters +++ b/Src/ClassicExplorer/ClassicExplorer.vcxproj.filters @@ -80,6 +80,9 @@ Resource Files + + Source Files + @@ -146,4 +149,4 @@ Resource Files - + \ No newline at end of file diff --git a/Src/ClassicExplorer/ClassicExplorerARM64.def b/Src/ClassicExplorer/ClassicExplorerARM64.def new file mode 100644 index 000000000..5b878efbb --- /dev/null +++ b/Src/ClassicExplorer/ClassicExplorerARM64.def @@ -0,0 +1,13 @@ +; ClassicExplorer.def : Declares the module parameters. + +LIBRARY "ClassicExplorerARM64.DLL" + +EXPORTS + DllCanUnloadNow PRIVATE + DllGetClassObject PRIVATE + DllRegisterServer PRIVATE + DllUnregisterServer PRIVATE + DllInstall PRIVATE + ShowExplorerSettings + DllImportSettingsXml + DllExportSettingsXml diff --git a/Src/ClassicIE/ClassicIE.cpp b/Src/ClassicIE/ClassicIE.cpp index 9850aaef1..1e1d2efc7 100644 --- a/Src/ClassicIE/ClassicIE.cpp +++ b/Src/ClassicIE/ClassicIE.cpp @@ -189,8 +189,10 @@ int WINAPI wWinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdL } } -#ifdef _WIN64 +#if defined(_M_AMD64) HMODULE hHookModule=GetModuleHandle(L"ClassicIEDLL_64.dll"); +#elif defined(_M_ARM64) + HMODULE hHookModule=GetModuleHandle(L"ClassicIEDLL_ARM64.dll"); #else HMODULE hHookModule=GetModuleHandle(L"ClassicIEDLL_32.dll"); #endif diff --git a/Src/ClassicIE/ClassicIE.vcxproj b/Src/ClassicIE/ClassicIE.vcxproj index 42b34e621..0a1634b0d 100644 --- a/Src/ClassicIE/ClassicIE.vcxproj +++ b/Src/ClassicIE/ClassicIE.vcxproj @@ -1,6 +1,10 @@ + + Debug + ARM64 + Debug Win32 @@ -9,6 +13,10 @@ Debug x64 + + Release + ARM64 + Release Win32 @@ -17,6 +25,10 @@ Release x64 + + Setup + ARM64 + Setup Win32 @@ -60,6 +72,13 @@ Unicode true + + Application + v142 + Static + Unicode + true + Application v142 @@ -67,12 +86,25 @@ Unicode true + + Application + v142 + Static + Unicode + true + Application v142 Static Unicode + + Application + v142 + Static + Unicode + @@ -92,14 +124,26 @@ + + + + + + + + + + + + $(Configuration)\ @@ -113,6 +157,12 @@ true $(ProjectName)_64 + + true + $(ProjectName)_ARM64 + $(Configuration)ARM64\ + $(Configuration)ARM64\ + $(Configuration)\ $(Configuration)\ @@ -125,6 +175,12 @@ false $(ProjectName)_64 + + false + $(ProjectName)_ARM64 + $(Configuration)ARM64\ + $(Configuration)ARM64\ + $(Configuration)\ $(Configuration)\ @@ -137,6 +193,12 @@ false $(ProjectName)_64 + + false + $(ProjectName)_ARM64 + $(Configuration)ARM64\ + $(Configuration)ARM64\ + Disabled @@ -177,6 +239,26 @@ Windows + + + Disabled + ..\Lib;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) + EnableFastChecks + MultiThreadedDebug + NotUsing + Level3 + ProgramDatabase + true + true + stdcpp17 + + + shlwapi.lib;comctl32.lib;psapi.lib;%(AdditionalDependencies) + true + Windows + + MaxSpeed @@ -221,6 +303,28 @@ true + + + MaxSpeed + ..\Lib;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) + MultiThreaded + true + NotUsing + Level3 + ProgramDatabase + true + true + stdcpp17 + + + shlwapi.lib;comctl32.lib;psapi.lib;%(AdditionalDependencies) + true + Windows + true + true + + MaxSpeed @@ -265,6 +369,28 @@ true + + + MaxSpeed + ..\Lib;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) + MultiThreaded + true + NotUsing + Level3 + ProgramDatabase + true + true + stdcpp17 + + + shlwapi.lib;comctl32.lib;psapi.lib;%(AdditionalDependencies) + true + Windows + true + true + + diff --git a/Src/ClassicIE/ClassicIEDLL/ClassicIEBHO.cpp b/Src/ClassicIE/ClassicIEDLL/ClassicIEBHO.cpp index 2393f56a2..dae0fae37 100644 --- a/Src/ClassicIE/ClassicIEDLL/ClassicIEBHO.cpp +++ b/Src/ClassicIE/ClassicIEDLL/ClassicIEBHO.cpp @@ -50,7 +50,11 @@ static DWORD StartBroker( bool bWait, const wchar_t *param ) PathAppend(path,L"ClassicIE_32.exe"); else #endif +#if defined(_M_AMD64) || defined(_M_IX86) PathAppend(path,L"ClassicIE_64.exe"); +#elif defined(_M_ARM64) + PathAppend(path,L"ClassicIE_ARM64.exe"); +#endif wchar_t cmdLine[1024]; Sprintf(cmdLine,_countof(cmdLine),L"\"%s\" %s",path,param); diff --git a/Src/ClassicIE/ClassicIEDLL/ClassicIEDLL.vcxproj b/Src/ClassicIE/ClassicIEDLL/ClassicIEDLL.vcxproj index 593f173a4..67ed86f08 100644 --- a/Src/ClassicIE/ClassicIEDLL/ClassicIEDLL.vcxproj +++ b/Src/ClassicIE/ClassicIEDLL/ClassicIEDLL.vcxproj @@ -1,6 +1,10 @@ + + Debug + ARM64 + Debug Win32 @@ -9,6 +13,10 @@ Debug x64 + + Release + ARM64 + Release Win32 @@ -17,6 +25,10 @@ Release x64 + + Setup + ARM64 + Setup Win32 @@ -60,6 +72,13 @@ Unicode true + + DynamicLibrary + v142 + Static + Unicode + true + DynamicLibrary v142 @@ -67,12 +86,25 @@ Unicode true + + DynamicLibrary + v142 + Static + Unicode + true + DynamicLibrary v142 Static Unicode + + DynamicLibrary + v142 + Static + Unicode + @@ -92,14 +124,26 @@ + + + + + + + + + + + + ..\$(Configuration)\ @@ -113,6 +157,12 @@ true $(ProjectName)_64 + + true + $(ProjectName)_ARM64 + $(Configuration)ARM64\ + ..\$(Configuration)ARM64\ + ..\$(Configuration)\ $(Configuration)\ @@ -125,6 +175,12 @@ false $(ProjectName)_64 + + false + $(ProjectName)_ARM64 + $(Configuration)ARM64\ + ..\$(Configuration)ARM64\ + ..\$(Configuration)\ $(Configuration)\ @@ -137,6 +193,12 @@ false $(ProjectName)_64 + + false + $(ProjectName)_ARM64 + $(Configuration)ARM64\ + ..\$(Configuration)ARM64\ + _DEBUG;%(PreprocessorDefinitions) @@ -208,6 +270,42 @@ true + + + _DEBUG;%(PreprocessorDefinitions) + false + true + ClassicIEDLL_i.h + + + ClassicIEDLL_i.c + ClassicIEDLL_p.c + + + Disabled + ..\..\Lib;%(AdditionalIncludeDirectories) + WIN32;_WINDOWS;_DEBUG;_USRDLL;CLASSICIEDLL_EXPORTS;%(PreprocessorDefinitions) + EnableFastChecks + MultiThreadedDebug + Use + Level3 + ProgramDatabase + true + stdcpp17 + + + _DEBUG;%(PreprocessorDefinitions) + $(IntDir);..\..\Lib;%(AdditionalIncludeDirectories) + + + true + uxtheme.lib;dwmapi.lib;comctl32.lib;msimg32.lib;winmm.lib;htmlhelp.lib;wininet.lib;wintrust.lib;crypt32.lib;%(AdditionalDependencies) + .\$(TargetName).def + true + Windows + true + + NDEBUG;%(PreprocessorDefinitions) @@ -281,6 +379,43 @@ true + + + NDEBUG;%(PreprocessorDefinitions) + false + true + ClassicIEDLL_i.h + + + ClassicIEDLL_i.c + ClassicIEDLL_p.c + + + MaxSpeed + ..\..\Lib;%(AdditionalIncludeDirectories) + WIN32;_WINDOWS;NDEBUG;_USRDLL;CLASSICIEDLL_EXPORTS;%(PreprocessorDefinitions) + MultiThreaded + Use + Level3 + ProgramDatabase + true + stdcpp17 + + + NDEBUG;%(PreprocessorDefinitions) + $(IntDir);..\..\Lib;%(AdditionalIncludeDirectories) + + + true + uxtheme.lib;dwmapi.lib;comctl32.lib;msimg32.lib;winmm.lib;htmlhelp.lib;wininet.lib;wintrust.lib;crypt32.lib;%(AdditionalDependencies) + .\$(TargetName).def + true + Windows + true + true + true + + NDEBUG;%(PreprocessorDefinitions) @@ -350,6 +485,41 @@ true + + + NDEBUG;%(PreprocessorDefinitions) + false + true + ClassicIEDLL_i.h + + + ClassicIEDLL_i.c + ClassicIEDLL_p.c + + + MaxSpeed + ..\..\Lib;%(AdditionalIncludeDirectories) + WIN32;_WINDOWS;NDEBUG;_USRDLL;CLASSICIEDLL_EXPORTS;BUILD_SETUP;%(PreprocessorDefinitions) + MultiThreaded + Use + Level3 + ProgramDatabase + true + stdcpp17 + + + NDEBUG;%(PreprocessorDefinitions) + $(IntDir);..\..\Lib;%(AdditionalIncludeDirectories) + + + uxtheme.lib;dwmapi.lib;comctl32.lib;msimg32.lib;winmm.lib;htmlhelp.lib;wininet.lib;wintrust.lib;crypt32.lib;%(AdditionalDependencies) + .\$(TargetName).def + true + Windows + true + true + + @@ -371,6 +541,7 @@ + diff --git a/Src/ClassicIE/ClassicIEDLL/ClassicIEDLL.vcxproj.filters b/Src/ClassicIE/ClassicIEDLL/ClassicIEDLL.vcxproj.filters index ccca6f6ce..10a6f111b 100644 --- a/Src/ClassicIE/ClassicIEDLL/ClassicIEDLL.vcxproj.filters +++ b/Src/ClassicIE/ClassicIEDLL/ClassicIEDLL.vcxproj.filters @@ -58,6 +58,9 @@ Resource Files + + Source Files + diff --git a/Src/ClassicIE/ClassicIEDLL/ClassicIEDLL_ARM64.def b/Src/ClassicIE/ClassicIEDLL/ClassicIEDLL_ARM64.def new file mode 100644 index 000000000..6cbc01fba --- /dev/null +++ b/Src/ClassicIE/ClassicIEDLL/ClassicIEDLL_ARM64.def @@ -0,0 +1,10 @@ +; ClassicIEDLL.def : Declares the module parameters. + +LIBRARY "ClassicIEDLL_ARM64.DLL" + +EXPORTS + DllCanUnloadNow PRIVATE + DllGetClassObject PRIVATE + DllRegisterServer PRIVATE + DllUnregisterServer PRIVATE + DllInstall PRIVATE diff --git a/Src/Lib/IatHookHelper.cpp b/Src/Lib/IatHookHelper.cpp index 4a34d315b..5305811ed 100644 --- a/Src/Lib/IatHookHelper.cpp +++ b/Src/Lib/IatHookHelper.cpp @@ -70,12 +70,17 @@ IatHookData *SetIatHook( IMAGE_DOS_HEADER *dosHeader, DWORD iatOffset, DWORD int { IatHookData *hook=g_IatHooks+g_IatHookCount; g_IatHookCount++; +#if defined(_M_AMD64) || defined(_M_IX86) hook->jump[0]=hook->jump[1]=0x90; // NOP hook->jump[2]=0xFF; hook->jump[3]=0x25; // JUMP -#ifdef _WIN64 +#if defined(_M_AMD64) hook->jumpOffs=0; #else hook->jumpOffs=(DWORD)(hook)+8; +#endif +#elif defined(_M_ARM64) + hook->jump[0]=0x48; hook->jump[1]=0x00; hook->jump[2]=0x00; hook->jump[3]=0x58; // LDR X8, newProc + hook->jump[4]=0x00; hook->jump[5]=0x01; hook->jump[6]=0x1F; hook->jump[7]=0xD6; // BR X8 #endif hook->newProc=newProc; hook->oldProc=(void*)thunk->u1.Function; diff --git a/Src/Lib/IatHookHelper.h b/Src/Lib/IatHookHelper.h index 2a4603f0d..d522bfbd7 100644 --- a/Src/Lib/IatHookHelper.h +++ b/Src/Lib/IatHookHelper.h @@ -6,8 +6,12 @@ struct IatHookData { +#if defined(_M_AMD64) || defined(_M_IX86) unsigned char jump[4]; // jump instruction 0x90, 0x90, 0xFF, 0x25 DWORD jumpOffs; // jump instruction offset +#elif defined(_M_ARM64) + unsigned char jump[8]; // LDR
, BR +#endif void *newProc; // the address of the new proc void *oldProc; // the address of the old proc IMAGE_THUNK_DATA *thunk; // the IAT thunk diff --git a/Src/Lib/Lib.vcxproj b/Src/Lib/Lib.vcxproj index ac8a4d84a..641a7924b 100644 --- a/Src/Lib/Lib.vcxproj +++ b/Src/Lib/Lib.vcxproj @@ -1,6 +1,10 @@ + + Debug + ARM64 + Debug Win32 @@ -9,6 +13,10 @@ Debug x64 + + Release + ARM64 + Release Win32 @@ -45,12 +53,25 @@ Unicode true + + StaticLibrary + v142 + Static + Unicode + true + StaticLibrary v142 Static Unicode + + StaticLibrary + v142 + Static + Unicode + @@ -63,9 +84,15 @@ + + + + + + $(Configuration)\ @@ -75,6 +102,10 @@ $(Configuration)64\ $(Configuration)64\ + + $(Configuration)ARM64\ + $(Configuration)ARM64\ + $(Configuration)\ $(Configuration)\ @@ -83,6 +114,10 @@ $(Configuration)64\ $(Configuration)64\ + + $(Configuration)ARM64\ + $(Configuration)ARM64\ + APPVEYOR_REPO_COMMIT="$(APPVEYOR_REPO_COMMIT)";%(PreprocessorDefinitions) @@ -116,6 +151,20 @@ stdcpp17 + + + Disabled + WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions) + EnableFastChecks + MultiThreadedDebug + Use + Level3 + ProgramDatabase + true + true + stdcpp17 + + MaxSpeed @@ -149,6 +198,21 @@ stdcpp17 + + + MaxSpeed + WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) + MultiThreaded + true + Use + Level3 + true + ProgramDatabase + true + true + stdcpp17 + + diff --git a/Src/OpenShell.sln b/Src/OpenShell.sln index 320903968..0b8f5275b 100644 --- a/Src/OpenShell.sln +++ b/Src/OpenShell.sln @@ -70,321 +70,473 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "DesktopToasts", "Update\Des EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|ARM64 = Debug|ARM64 Debug|Win32 = Debug|Win32 Debug|x64 = Debug|x64 + Release|ARM64 = Release|ARM64 Release|Win32 = Release|Win32 Release|x64 = Release|x64 + Setup|ARM64 = Setup|ARM64 Setup|Win32 = Setup|Win32 Setup|x64 = Setup|x64 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution + {9AF324B7-F786-4D85-B2E1-6E51720F874E}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {9AF324B7-F786-4D85-B2E1-6E51720F874E}.Debug|ARM64.Build.0 = Debug|ARM64 {9AF324B7-F786-4D85-B2E1-6E51720F874E}.Debug|Win32.ActiveCfg = Debug|Win32 {9AF324B7-F786-4D85-B2E1-6E51720F874E}.Debug|Win32.Build.0 = Debug|Win32 {9AF324B7-F786-4D85-B2E1-6E51720F874E}.Debug|x64.ActiveCfg = Debug|x64 {9AF324B7-F786-4D85-B2E1-6E51720F874E}.Debug|x64.Build.0 = Debug|x64 + {9AF324B7-F786-4D85-B2E1-6E51720F874E}.Release|ARM64.ActiveCfg = Release|ARM64 + {9AF324B7-F786-4D85-B2E1-6E51720F874E}.Release|ARM64.Build.0 = Release|ARM64 {9AF324B7-F786-4D85-B2E1-6E51720F874E}.Release|Win32.ActiveCfg = Release|Win32 {9AF324B7-F786-4D85-B2E1-6E51720F874E}.Release|Win32.Build.0 = Release|Win32 {9AF324B7-F786-4D85-B2E1-6E51720F874E}.Release|x64.ActiveCfg = Release|x64 {9AF324B7-F786-4D85-B2E1-6E51720F874E}.Release|x64.Build.0 = Release|x64 + {9AF324B7-F786-4D85-B2E1-6E51720F874E}.Setup|ARM64.ActiveCfg = Setup|ARM64 + {9AF324B7-F786-4D85-B2E1-6E51720F874E}.Setup|ARM64.Build.0 = Setup|ARM64 {9AF324B7-F786-4D85-B2E1-6E51720F874E}.Setup|Win32.ActiveCfg = Setup|Win32 {9AF324B7-F786-4D85-B2E1-6E51720F874E}.Setup|Win32.Build.0 = Setup|Win32 {9AF324B7-F786-4D85-B2E1-6E51720F874E}.Setup|x64.ActiveCfg = Setup|x64 {9AF324B7-F786-4D85-B2E1-6E51720F874E}.Setup|x64.Build.0 = Setup|x64 + {87D5FE20-AF86-458A-9AA3-3131EB06179B}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {87D5FE20-AF86-458A-9AA3-3131EB06179B}.Debug|ARM64.Build.0 = Debug|ARM64 + {87D5FE20-AF86-458A-9AA3-3131EB06179B}.Debug|ARM64.Deploy.0 = Debug|ARM64 {87D5FE20-AF86-458A-9AA3-3131EB06179B}.Debug|Win32.ActiveCfg = Debug|Win32 {87D5FE20-AF86-458A-9AA3-3131EB06179B}.Debug|Win32.Build.0 = Debug|Win32 {87D5FE20-AF86-458A-9AA3-3131EB06179B}.Debug|x64.ActiveCfg = Debug|x64 {87D5FE20-AF86-458A-9AA3-3131EB06179B}.Debug|x64.Build.0 = Debug|x64 + {87D5FE20-AF86-458A-9AA3-3131EB06179B}.Release|ARM64.ActiveCfg = Release|ARM64 + {87D5FE20-AF86-458A-9AA3-3131EB06179B}.Release|ARM64.Build.0 = Release|ARM64 + {87D5FE20-AF86-458A-9AA3-3131EB06179B}.Release|ARM64.Deploy.0 = Release|ARM64 {87D5FE20-AF86-458A-9AA3-3131EB06179B}.Release|Win32.ActiveCfg = Release|Win32 {87D5FE20-AF86-458A-9AA3-3131EB06179B}.Release|Win32.Build.0 = Release|Win32 {87D5FE20-AF86-458A-9AA3-3131EB06179B}.Release|x64.ActiveCfg = Release|x64 {87D5FE20-AF86-458A-9AA3-3131EB06179B}.Release|x64.Build.0 = Release|x64 + {87D5FE20-AF86-458A-9AA3-3131EB06179B}.Setup|ARM64.ActiveCfg = Setup|ARM64 + {87D5FE20-AF86-458A-9AA3-3131EB06179B}.Setup|ARM64.Build.0 = Setup|ARM64 {87D5FE20-AF86-458A-9AA3-3131EB06179B}.Setup|Win32.ActiveCfg = Setup|Win32 {87D5FE20-AF86-458A-9AA3-3131EB06179B}.Setup|Win32.Build.0 = Setup|Win32 {87D5FE20-AF86-458A-9AA3-3131EB06179B}.Setup|x64.ActiveCfg = Setup|x64 {87D5FE20-AF86-458A-9AA3-3131EB06179B}.Setup|x64.Build.0 = Setup|x64 + {85DEECBB-1F9B-4983-9D54-3BF42182B7E7}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {85DEECBB-1F9B-4983-9D54-3BF42182B7E7}.Debug|ARM64.Build.0 = Debug|ARM64 + {85DEECBB-1F9B-4983-9D54-3BF42182B7E7}.Debug|ARM64.Deploy.0 = Debug|ARM64 {85DEECBB-1F9B-4983-9D54-3BF42182B7E7}.Debug|Win32.ActiveCfg = Debug|Win32 {85DEECBB-1F9B-4983-9D54-3BF42182B7E7}.Debug|Win32.Build.0 = Debug|Win32 {85DEECBB-1F9B-4983-9D54-3BF42182B7E7}.Debug|x64.ActiveCfg = Debug|x64 {85DEECBB-1F9B-4983-9D54-3BF42182B7E7}.Debug|x64.Build.0 = Debug|x64 + {85DEECBB-1F9B-4983-9D54-3BF42182B7E7}.Release|ARM64.ActiveCfg = Release|ARM64 + {85DEECBB-1F9B-4983-9D54-3BF42182B7E7}.Release|ARM64.Build.0 = Release|ARM64 + {85DEECBB-1F9B-4983-9D54-3BF42182B7E7}.Release|ARM64.Deploy.0 = Release|ARM64 {85DEECBB-1F9B-4983-9D54-3BF42182B7E7}.Release|Win32.ActiveCfg = Release|Win32 {85DEECBB-1F9B-4983-9D54-3BF42182B7E7}.Release|Win32.Build.0 = Release|Win32 {85DEECBB-1F9B-4983-9D54-3BF42182B7E7}.Release|x64.ActiveCfg = Release|x64 {85DEECBB-1F9B-4983-9D54-3BF42182B7E7}.Release|x64.Build.0 = Release|x64 + {85DEECBB-1F9B-4983-9D54-3BF42182B7E7}.Setup|ARM64.ActiveCfg = Setup|ARM64 + {85DEECBB-1F9B-4983-9D54-3BF42182B7E7}.Setup|ARM64.Build.0 = Setup|ARM64 {85DEECBB-1F9B-4983-9D54-3BF42182B7E7}.Setup|Win32.ActiveCfg = Setup|Win32 {85DEECBB-1F9B-4983-9D54-3BF42182B7E7}.Setup|Win32.Build.0 = Setup|Win32 {85DEECBB-1F9B-4983-9D54-3BF42182B7E7}.Setup|x64.ActiveCfg = Setup|x64 {85DEECBB-1F9B-4983-9D54-3BF42182B7E7}.Setup|x64.Build.0 = Setup|x64 + {A4A4D3B1-24E7-401E-A37C-72141D7603DC}.Debug|ARM64.ActiveCfg = Debug|Win32 + {A4A4D3B1-24E7-401E-A37C-72141D7603DC}.Debug|ARM64.Build.0 = Debug|Win32 {A4A4D3B1-24E7-401E-A37C-72141D7603DC}.Debug|Win32.ActiveCfg = Debug|Win32 {A4A4D3B1-24E7-401E-A37C-72141D7603DC}.Debug|Win32.Build.0 = Debug|Win32 {A4A4D3B1-24E7-401E-A37C-72141D7603DC}.Debug|x64.ActiveCfg = Debug|Win32 + {A4A4D3B1-24E7-401E-A37C-72141D7603DC}.Debug|x64.Build.0 = Debug|Win32 + {A4A4D3B1-24E7-401E-A37C-72141D7603DC}.Release|ARM64.ActiveCfg = Release|Win32 + {A4A4D3B1-24E7-401E-A37C-72141D7603DC}.Release|ARM64.Build.0 = Release|Win32 {A4A4D3B1-24E7-401E-A37C-72141D7603DC}.Release|Win32.ActiveCfg = Release|Win32 {A4A4D3B1-24E7-401E-A37C-72141D7603DC}.Release|Win32.Build.0 = Release|Win32 {A4A4D3B1-24E7-401E-A37C-72141D7603DC}.Release|x64.ActiveCfg = Release|Win32 + {A4A4D3B1-24E7-401E-A37C-72141D7603DC}.Release|x64.Build.0 = Release|Win32 + {A4A4D3B1-24E7-401E-A37C-72141D7603DC}.Setup|ARM64.ActiveCfg = Release|ARM64 {A4A4D3B1-24E7-401E-A37C-72141D7603DC}.Setup|Win32.ActiveCfg = Release|Win32 {A4A4D3B1-24E7-401E-A37C-72141D7603DC}.Setup|x64.ActiveCfg = Release|Win32 + {EA65FDDD-CB77-417F-8BB4-2F3ECB5B3E75}.Debug|ARM64.ActiveCfg = Resource|Win32 + {EA65FDDD-CB77-417F-8BB4-2F3ECB5B3E75}.Debug|ARM64.Build.0 = Resource|Win32 {EA65FDDD-CB77-417F-8BB4-2F3ECB5B3E75}.Debug|Win32.ActiveCfg = Resource|Win32 {EA65FDDD-CB77-417F-8BB4-2F3ECB5B3E75}.Debug|Win32.Build.0 = Resource|Win32 {EA65FDDD-CB77-417F-8BB4-2F3ECB5B3E75}.Debug|x64.ActiveCfg = Resource|Win32 {EA65FDDD-CB77-417F-8BB4-2F3ECB5B3E75}.Debug|x64.Build.0 = Resource|Win32 + {EA65FDDD-CB77-417F-8BB4-2F3ECB5B3E75}.Release|ARM64.ActiveCfg = Resource|Win32 + {EA65FDDD-CB77-417F-8BB4-2F3ECB5B3E75}.Release|ARM64.Build.0 = Resource|Win32 {EA65FDDD-CB77-417F-8BB4-2F3ECB5B3E75}.Release|Win32.ActiveCfg = Resource|Win32 {EA65FDDD-CB77-417F-8BB4-2F3ECB5B3E75}.Release|Win32.Build.0 = Resource|Win32 {EA65FDDD-CB77-417F-8BB4-2F3ECB5B3E75}.Release|x64.ActiveCfg = Resource|Win32 {EA65FDDD-CB77-417F-8BB4-2F3ECB5B3E75}.Release|x64.Build.0 = Resource|Win32 + {EA65FDDD-CB77-417F-8BB4-2F3ECB5B3E75}.Setup|ARM64.ActiveCfg = Resource|Win32 {EA65FDDD-CB77-417F-8BB4-2F3ECB5B3E75}.Setup|Win32.ActiveCfg = Resource|Win32 {EA65FDDD-CB77-417F-8BB4-2F3ECB5B3E75}.Setup|Win32.Build.0 = Resource|Win32 {EA65FDDD-CB77-417F-8BB4-2F3ECB5B3E75}.Setup|x64.ActiveCfg = Resource|Win32 + {404821C5-4EE4-4908-A759-5EF6DAC14AB6}.Debug|ARM64.ActiveCfg = Resource|Win32 + {404821C5-4EE4-4908-A759-5EF6DAC14AB6}.Debug|ARM64.Build.0 = Resource|Win32 {404821C5-4EE4-4908-A759-5EF6DAC14AB6}.Debug|Win32.ActiveCfg = Resource|Win32 {404821C5-4EE4-4908-A759-5EF6DAC14AB6}.Debug|Win32.Build.0 = Resource|Win32 {404821C5-4EE4-4908-A759-5EF6DAC14AB6}.Debug|x64.ActiveCfg = Resource|Win32 {404821C5-4EE4-4908-A759-5EF6DAC14AB6}.Debug|x64.Build.0 = Resource|Win32 + {404821C5-4EE4-4908-A759-5EF6DAC14AB6}.Release|ARM64.ActiveCfg = Resource|Win32 + {404821C5-4EE4-4908-A759-5EF6DAC14AB6}.Release|ARM64.Build.0 = Resource|Win32 {404821C5-4EE4-4908-A759-5EF6DAC14AB6}.Release|Win32.ActiveCfg = Resource|Win32 {404821C5-4EE4-4908-A759-5EF6DAC14AB6}.Release|Win32.Build.0 = Resource|Win32 {404821C5-4EE4-4908-A759-5EF6DAC14AB6}.Release|x64.ActiveCfg = Resource|Win32 {404821C5-4EE4-4908-A759-5EF6DAC14AB6}.Release|x64.Build.0 = Resource|Win32 + {404821C5-4EE4-4908-A759-5EF6DAC14AB6}.Setup|ARM64.ActiveCfg = Resource|Win32 {404821C5-4EE4-4908-A759-5EF6DAC14AB6}.Setup|Win32.ActiveCfg = Resource|Win32 {404821C5-4EE4-4908-A759-5EF6DAC14AB6}.Setup|Win32.Build.0 = Resource|Win32 {404821C5-4EE4-4908-A759-5EF6DAC14AB6}.Setup|x64.ActiveCfg = Resource|Win32 + {9EC23CA9-384A-4EEB-979E-69879DC1A78C}.Debug|ARM64.ActiveCfg = Resource|Win32 + {9EC23CA9-384A-4EEB-979E-69879DC1A78C}.Debug|ARM64.Build.0 = Resource|Win32 {9EC23CA9-384A-4EEB-979E-69879DC1A78C}.Debug|Win32.ActiveCfg = Resource|Win32 {9EC23CA9-384A-4EEB-979E-69879DC1A78C}.Debug|Win32.Build.0 = Resource|Win32 {9EC23CA9-384A-4EEB-979E-69879DC1A78C}.Debug|x64.ActiveCfg = Resource|Win32 {9EC23CA9-384A-4EEB-979E-69879DC1A78C}.Debug|x64.Build.0 = Resource|Win32 + {9EC23CA9-384A-4EEB-979E-69879DC1A78C}.Release|ARM64.ActiveCfg = Resource|Win32 + {9EC23CA9-384A-4EEB-979E-69879DC1A78C}.Release|ARM64.Build.0 = Resource|Win32 {9EC23CA9-384A-4EEB-979E-69879DC1A78C}.Release|Win32.ActiveCfg = Resource|Win32 {9EC23CA9-384A-4EEB-979E-69879DC1A78C}.Release|Win32.Build.0 = Resource|Win32 {9EC23CA9-384A-4EEB-979E-69879DC1A78C}.Release|x64.ActiveCfg = Resource|Win32 {9EC23CA9-384A-4EEB-979E-69879DC1A78C}.Release|x64.Build.0 = Resource|Win32 + {9EC23CA9-384A-4EEB-979E-69879DC1A78C}.Setup|ARM64.ActiveCfg = Resource|Win32 {9EC23CA9-384A-4EEB-979E-69879DC1A78C}.Setup|Win32.ActiveCfg = Resource|Win32 {9EC23CA9-384A-4EEB-979E-69879DC1A78C}.Setup|Win32.Build.0 = Resource|Win32 {9EC23CA9-384A-4EEB-979E-69879DC1A78C}.Setup|x64.ActiveCfg = Resource|Win32 + {066C9721-26D5-4C4D-868E-50C2BA0A8196}.Debug|ARM64.ActiveCfg = Resource|Win32 + {066C9721-26D5-4C4D-868E-50C2BA0A8196}.Debug|ARM64.Build.0 = Resource|Win32 {066C9721-26D5-4C4D-868E-50C2BA0A8196}.Debug|Win32.ActiveCfg = Resource|Win32 {066C9721-26D5-4C4D-868E-50C2BA0A8196}.Debug|Win32.Build.0 = Resource|Win32 {066C9721-26D5-4C4D-868E-50C2BA0A8196}.Debug|x64.ActiveCfg = Resource|Win32 {066C9721-26D5-4C4D-868E-50C2BA0A8196}.Debug|x64.Build.0 = Resource|Win32 + {066C9721-26D5-4C4D-868E-50C2BA0A8196}.Release|ARM64.ActiveCfg = Resource|Win32 + {066C9721-26D5-4C4D-868E-50C2BA0A8196}.Release|ARM64.Build.0 = Resource|Win32 {066C9721-26D5-4C4D-868E-50C2BA0A8196}.Release|Win32.ActiveCfg = Resource|Win32 {066C9721-26D5-4C4D-868E-50C2BA0A8196}.Release|Win32.Build.0 = Resource|Win32 {066C9721-26D5-4C4D-868E-50C2BA0A8196}.Release|x64.ActiveCfg = Resource|Win32 {066C9721-26D5-4C4D-868E-50C2BA0A8196}.Release|x64.Build.0 = Resource|Win32 + {066C9721-26D5-4C4D-868E-50C2BA0A8196}.Setup|ARM64.ActiveCfg = Resource|Win32 {066C9721-26D5-4C4D-868E-50C2BA0A8196}.Setup|Win32.ActiveCfg = Resource|Win32 {066C9721-26D5-4C4D-868E-50C2BA0A8196}.Setup|Win32.Build.0 = Resource|Win32 {066C9721-26D5-4C4D-868E-50C2BA0A8196}.Setup|x64.ActiveCfg = Resource|Win32 + {66D1EAA4-65D1-45CC-9989-E616FC0575EB}.Debug|ARM64.ActiveCfg = Resource|Win32 + {66D1EAA4-65D1-45CC-9989-E616FC0575EB}.Debug|ARM64.Build.0 = Resource|Win32 {66D1EAA4-65D1-45CC-9989-E616FC0575EB}.Debug|Win32.ActiveCfg = Resource|Win32 {66D1EAA4-65D1-45CC-9989-E616FC0575EB}.Debug|Win32.Build.0 = Resource|Win32 {66D1EAA4-65D1-45CC-9989-E616FC0575EB}.Debug|x64.ActiveCfg = Resource|Win32 {66D1EAA4-65D1-45CC-9989-E616FC0575EB}.Debug|x64.Build.0 = Resource|Win32 + {66D1EAA4-65D1-45CC-9989-E616FC0575EB}.Release|ARM64.ActiveCfg = Resource|Win32 + {66D1EAA4-65D1-45CC-9989-E616FC0575EB}.Release|ARM64.Build.0 = Resource|Win32 {66D1EAA4-65D1-45CC-9989-E616FC0575EB}.Release|Win32.ActiveCfg = Resource|Win32 {66D1EAA4-65D1-45CC-9989-E616FC0575EB}.Release|Win32.Build.0 = Resource|Win32 {66D1EAA4-65D1-45CC-9989-E616FC0575EB}.Release|x64.ActiveCfg = Resource|Win32 {66D1EAA4-65D1-45CC-9989-E616FC0575EB}.Release|x64.Build.0 = Resource|Win32 + {66D1EAA4-65D1-45CC-9989-E616FC0575EB}.Setup|ARM64.ActiveCfg = Resource|Win32 {66D1EAA4-65D1-45CC-9989-E616FC0575EB}.Setup|Win32.ActiveCfg = Resource|Win32 {66D1EAA4-65D1-45CC-9989-E616FC0575EB}.Setup|Win32.Build.0 = Resource|Win32 {66D1EAA4-65D1-45CC-9989-E616FC0575EB}.Setup|x64.ActiveCfg = Resource|Win32 + {81EB6336-366C-47DD-82CF-FF6C36CCD2B5}.Debug|ARM64.ActiveCfg = Resource|Win32 + {81EB6336-366C-47DD-82CF-FF6C36CCD2B5}.Debug|ARM64.Build.0 = Resource|Win32 {81EB6336-366C-47DD-82CF-FF6C36CCD2B5}.Debug|Win32.ActiveCfg = Resource|Win32 {81EB6336-366C-47DD-82CF-FF6C36CCD2B5}.Debug|Win32.Build.0 = Resource|Win32 {81EB6336-366C-47DD-82CF-FF6C36CCD2B5}.Debug|x64.ActiveCfg = Resource|Win32 {81EB6336-366C-47DD-82CF-FF6C36CCD2B5}.Debug|x64.Build.0 = Resource|Win32 + {81EB6336-366C-47DD-82CF-FF6C36CCD2B5}.Release|ARM64.ActiveCfg = Resource|Win32 + {81EB6336-366C-47DD-82CF-FF6C36CCD2B5}.Release|ARM64.Build.0 = Resource|Win32 {81EB6336-366C-47DD-82CF-FF6C36CCD2B5}.Release|Win32.ActiveCfg = Resource|Win32 {81EB6336-366C-47DD-82CF-FF6C36CCD2B5}.Release|Win32.Build.0 = Resource|Win32 {81EB6336-366C-47DD-82CF-FF6C36CCD2B5}.Release|x64.ActiveCfg = Resource|Win32 {81EB6336-366C-47DD-82CF-FF6C36CCD2B5}.Release|x64.Build.0 = Resource|Win32 + {81EB6336-366C-47DD-82CF-FF6C36CCD2B5}.Setup|ARM64.ActiveCfg = Resource|Win32 {81EB6336-366C-47DD-82CF-FF6C36CCD2B5}.Setup|Win32.ActiveCfg = Resource|Win32 {81EB6336-366C-47DD-82CF-FF6C36CCD2B5}.Setup|Win32.Build.0 = Resource|Win32 {81EB6336-366C-47DD-82CF-FF6C36CCD2B5}.Setup|x64.ActiveCfg = Resource|Win32 + {E1017135-9916-4B11-9AC5-1EC0BD8F8CD6}.Debug|ARM64.ActiveCfg = Debug|Win32 {E1017135-9916-4B11-9AC5-1EC0BD8F8CD6}.Debug|Win32.ActiveCfg = Debug|Win32 {E1017135-9916-4B11-9AC5-1EC0BD8F8CD6}.Debug|Win32.Build.0 = Debug|Win32 {E1017135-9916-4B11-9AC5-1EC0BD8F8CD6}.Debug|x64.ActiveCfg = Debug|Win32 + {E1017135-9916-4B11-9AC5-1EC0BD8F8CD6}.Release|ARM64.ActiveCfg = Release|Win32 {E1017135-9916-4B11-9AC5-1EC0BD8F8CD6}.Release|Win32.ActiveCfg = Release|Win32 {E1017135-9916-4B11-9AC5-1EC0BD8F8CD6}.Release|Win32.Build.0 = Release|Win32 {E1017135-9916-4B11-9AC5-1EC0BD8F8CD6}.Release|x64.ActiveCfg = Release|Win32 + {E1017135-9916-4B11-9AC5-1EC0BD8F8CD6}.Setup|ARM64.ActiveCfg = Release|Win32 {E1017135-9916-4B11-9AC5-1EC0BD8F8CD6}.Setup|Win32.ActiveCfg = Release|Win32 {E1017135-9916-4B11-9AC5-1EC0BD8F8CD6}.Setup|Win32.Build.0 = Release|Win32 {E1017135-9916-4B11-9AC5-1EC0BD8F8CD6}.Setup|x64.ActiveCfg = Release|Win32 + {E93271C8-0252-4A08-8227-1978C64C2D34}.Debug|ARM64.ActiveCfg = Debug|Win32 {E93271C8-0252-4A08-8227-1978C64C2D34}.Debug|Win32.ActiveCfg = Debug|Win32 {E93271C8-0252-4A08-8227-1978C64C2D34}.Debug|Win32.Build.0 = Debug|Win32 {E93271C8-0252-4A08-8227-1978C64C2D34}.Debug|x64.ActiveCfg = Debug|Win32 + {E93271C8-0252-4A08-8227-1978C64C2D34}.Release|ARM64.ActiveCfg = Release|Win32 {E93271C8-0252-4A08-8227-1978C64C2D34}.Release|Win32.ActiveCfg = Release|Win32 {E93271C8-0252-4A08-8227-1978C64C2D34}.Release|Win32.Build.0 = Release|Win32 {E93271C8-0252-4A08-8227-1978C64C2D34}.Release|x64.ActiveCfg = Release|Win32 + {E93271C8-0252-4A08-8227-1978C64C2D34}.Setup|ARM64.ActiveCfg = Setup|Win32 {E93271C8-0252-4A08-8227-1978C64C2D34}.Setup|Win32.ActiveCfg = Setup|Win32 {E93271C8-0252-4A08-8227-1978C64C2D34}.Setup|Win32.Build.0 = Setup|Win32 {E93271C8-0252-4A08-8227-1978C64C2D34}.Setup|x64.ActiveCfg = Setup|Win32 + {0A60FD06-3A81-4651-A869-9850DBC115EA}.Debug|ARM64.ActiveCfg = Resource|Win32 {0A60FD06-3A81-4651-A869-9850DBC115EA}.Debug|Win32.ActiveCfg = Resource|Win32 {0A60FD06-3A81-4651-A869-9850DBC115EA}.Debug|Win32.Build.0 = Resource|Win32 {0A60FD06-3A81-4651-A869-9850DBC115EA}.Debug|x64.ActiveCfg = Resource|Win32 + {0A60FD06-3A81-4651-A869-9850DBC115EA}.Release|ARM64.ActiveCfg = Resource|Win32 {0A60FD06-3A81-4651-A869-9850DBC115EA}.Release|Win32.ActiveCfg = Resource|Win32 {0A60FD06-3A81-4651-A869-9850DBC115EA}.Release|Win32.Build.0 = Resource|Win32 {0A60FD06-3A81-4651-A869-9850DBC115EA}.Release|x64.ActiveCfg = Resource|Win32 + {0A60FD06-3A81-4651-A869-9850DBC115EA}.Setup|ARM64.ActiveCfg = Resource|Win32 {0A60FD06-3A81-4651-A869-9850DBC115EA}.Setup|Win32.ActiveCfg = Resource|Win32 {0A60FD06-3A81-4651-A869-9850DBC115EA}.Setup|Win32.Build.0 = Resource|Win32 {0A60FD06-3A81-4651-A869-9850DBC115EA}.Setup|x64.ActiveCfg = Resource|Win32 + {D42FE717-485B-492D-884A-1999F6D51154}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {D42FE717-485B-492D-884A-1999F6D51154}.Debug|ARM64.Build.0 = Debug|ARM64 {D42FE717-485B-492D-884A-1999F6D51154}.Debug|Win32.ActiveCfg = Debug|Win32 {D42FE717-485B-492D-884A-1999F6D51154}.Debug|Win32.Build.0 = Debug|Win32 {D42FE717-485B-492D-884A-1999F6D51154}.Debug|x64.ActiveCfg = Debug|x64 {D42FE717-485B-492D-884A-1999F6D51154}.Debug|x64.Build.0 = Debug|x64 + {D42FE717-485B-492D-884A-1999F6D51154}.Release|ARM64.ActiveCfg = Release|ARM64 + {D42FE717-485B-492D-884A-1999F6D51154}.Release|ARM64.Build.0 = Release|ARM64 {D42FE717-485B-492D-884A-1999F6D51154}.Release|Win32.ActiveCfg = Release|Win32 {D42FE717-485B-492D-884A-1999F6D51154}.Release|Win32.Build.0 = Release|Win32 {D42FE717-485B-492D-884A-1999F6D51154}.Release|x64.ActiveCfg = Release|x64 {D42FE717-485B-492D-884A-1999F6D51154}.Release|x64.Build.0 = Release|x64 + {D42FE717-485B-492D-884A-1999F6D51154}.Setup|ARM64.ActiveCfg = Release|ARM64 + {D42FE717-485B-492D-884A-1999F6D51154}.Setup|ARM64.Build.0 = Release|ARM64 {D42FE717-485B-492D-884A-1999F6D51154}.Setup|Win32.ActiveCfg = Release|Win32 {D42FE717-485B-492D-884A-1999F6D51154}.Setup|Win32.Build.0 = Release|Win32 {D42FE717-485B-492D-884A-1999F6D51154}.Setup|x64.ActiveCfg = Release|x64 {D42FE717-485B-492D-884A-1999F6D51154}.Setup|x64.Build.0 = Release|x64 + {65D5C193-E807-4094-AE19-19E6A310A312}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {65D5C193-E807-4094-AE19-19E6A310A312}.Debug|ARM64.Build.0 = Debug|ARM64 {65D5C193-E807-4094-AE19-19E6A310A312}.Debug|Win32.ActiveCfg = Debug|Win32 {65D5C193-E807-4094-AE19-19E6A310A312}.Debug|Win32.Build.0 = Debug|Win32 {65D5C193-E807-4094-AE19-19E6A310A312}.Debug|x64.ActiveCfg = Debug|x64 {65D5C193-E807-4094-AE19-19E6A310A312}.Debug|x64.Build.0 = Debug|x64 + {65D5C193-E807-4094-AE19-19E6A310A312}.Release|ARM64.ActiveCfg = Release|ARM64 + {65D5C193-E807-4094-AE19-19E6A310A312}.Release|ARM64.Build.0 = Release|ARM64 {65D5C193-E807-4094-AE19-19E6A310A312}.Release|Win32.ActiveCfg = Release|Win32 {65D5C193-E807-4094-AE19-19E6A310A312}.Release|Win32.Build.0 = Release|Win32 {65D5C193-E807-4094-AE19-19E6A310A312}.Release|x64.ActiveCfg = Release|x64 {65D5C193-E807-4094-AE19-19E6A310A312}.Release|x64.Build.0 = Release|x64 + {65D5C193-E807-4094-AE19-19E6A310A312}.Setup|ARM64.ActiveCfg = Setup|ARM64 + {65D5C193-E807-4094-AE19-19E6A310A312}.Setup|ARM64.Build.0 = Setup|ARM64 {65D5C193-E807-4094-AE19-19E6A310A312}.Setup|Win32.ActiveCfg = Setup|Win32 {65D5C193-E807-4094-AE19-19E6A310A312}.Setup|Win32.Build.0 = Setup|Win32 {65D5C193-E807-4094-AE19-19E6A310A312}.Setup|x64.ActiveCfg = Setup|x64 {65D5C193-E807-4094-AE19-19E6A310A312}.Setup|x64.Build.0 = Setup|x64 + {BC0E6E7C-08C1-4F12-A754-4608E5A22FA8}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {BC0E6E7C-08C1-4F12-A754-4608E5A22FA8}.Debug|ARM64.Build.0 = Debug|ARM64 {BC0E6E7C-08C1-4F12-A754-4608E5A22FA8}.Debug|Win32.ActiveCfg = Debug|Win32 {BC0E6E7C-08C1-4F12-A754-4608E5A22FA8}.Debug|Win32.Build.0 = Debug|Win32 {BC0E6E7C-08C1-4F12-A754-4608E5A22FA8}.Debug|x64.ActiveCfg = Debug|x64 {BC0E6E7C-08C1-4F12-A754-4608E5A22FA8}.Debug|x64.Build.0 = Debug|x64 + {BC0E6E7C-08C1-4F12-A754-4608E5A22FA8}.Release|ARM64.ActiveCfg = Release|ARM64 + {BC0E6E7C-08C1-4F12-A754-4608E5A22FA8}.Release|ARM64.Build.0 = Release|ARM64 {BC0E6E7C-08C1-4F12-A754-4608E5A22FA8}.Release|Win32.ActiveCfg = Release|Win32 {BC0E6E7C-08C1-4F12-A754-4608E5A22FA8}.Release|Win32.Build.0 = Release|Win32 {BC0E6E7C-08C1-4F12-A754-4608E5A22FA8}.Release|x64.ActiveCfg = Release|x64 {BC0E6E7C-08C1-4F12-A754-4608E5A22FA8}.Release|x64.Build.0 = Release|x64 + {BC0E6E7C-08C1-4F12-A754-4608E5A22FA8}.Setup|ARM64.ActiveCfg = Setup|ARM64 + {BC0E6E7C-08C1-4F12-A754-4608E5A22FA8}.Setup|ARM64.Build.0 = Setup|ARM64 {BC0E6E7C-08C1-4F12-A754-4608E5A22FA8}.Setup|Win32.ActiveCfg = Setup|Win32 {BC0E6E7C-08C1-4F12-A754-4608E5A22FA8}.Setup|Win32.Build.0 = Setup|Win32 {BC0E6E7C-08C1-4F12-A754-4608E5A22FA8}.Setup|x64.ActiveCfg = Setup|x64 {BC0E6E7C-08C1-4F12-A754-4608E5A22FA8}.Setup|x64.Build.0 = Setup|x64 + {171B46B0-6083-4D9E-BD33-946EA3BD76FA}.Debug|ARM64.ActiveCfg = Debug|Win32 {171B46B0-6083-4D9E-BD33-946EA3BD76FA}.Debug|Win32.ActiveCfg = Debug|Win32 {171B46B0-6083-4D9E-BD33-946EA3BD76FA}.Debug|Win32.Build.0 = Debug|Win32 {171B46B0-6083-4D9E-BD33-946EA3BD76FA}.Debug|x64.ActiveCfg = Debug|Win32 + {171B46B0-6083-4D9E-BD33-946EA3BD76FA}.Release|ARM64.ActiveCfg = Release|Win32 {171B46B0-6083-4D9E-BD33-946EA3BD76FA}.Release|Win32.ActiveCfg = Release|Win32 {171B46B0-6083-4D9E-BD33-946EA3BD76FA}.Release|Win32.Build.0 = Release|Win32 {171B46B0-6083-4D9E-BD33-946EA3BD76FA}.Release|x64.ActiveCfg = Release|Win32 + {171B46B0-6083-4D9E-BD33-946EA3BD76FA}.Setup|ARM64.ActiveCfg = Release|Win32 {171B46B0-6083-4D9E-BD33-946EA3BD76FA}.Setup|Win32.ActiveCfg = Release|Win32 {171B46B0-6083-4D9E-BD33-946EA3BD76FA}.Setup|Win32.Build.0 = Release|Win32 {171B46B0-6083-4D9E-BD33-946EA3BD76FA}.Setup|x64.ActiveCfg = Release|Win32 + {A2CCDE9F-17CE-461E-8BD9-00261B8855A6}.Debug|ARM64.ActiveCfg = Resource|Win32 + {A2CCDE9F-17CE-461E-8BD9-00261B8855A6}.Debug|ARM64.Build.0 = Resource|Win32 {A2CCDE9F-17CE-461E-8BD9-00261B8855A6}.Debug|Win32.ActiveCfg = Resource|Win32 {A2CCDE9F-17CE-461E-8BD9-00261B8855A6}.Debug|Win32.Build.0 = Resource|Win32 {A2CCDE9F-17CE-461E-8BD9-00261B8855A6}.Debug|x64.ActiveCfg = Resource|Win32 {A2CCDE9F-17CE-461E-8BD9-00261B8855A6}.Debug|x64.Build.0 = Resource|Win32 + {A2CCDE9F-17CE-461E-8BD9-00261B8855A6}.Release|ARM64.ActiveCfg = Resource|Win32 + {A2CCDE9F-17CE-461E-8BD9-00261B8855A6}.Release|ARM64.Build.0 = Resource|Win32 {A2CCDE9F-17CE-461E-8BD9-00261B8855A6}.Release|Win32.ActiveCfg = Resource|Win32 {A2CCDE9F-17CE-461E-8BD9-00261B8855A6}.Release|Win32.Build.0 = Resource|Win32 {A2CCDE9F-17CE-461E-8BD9-00261B8855A6}.Release|x64.ActiveCfg = Resource|Win32 {A2CCDE9F-17CE-461E-8BD9-00261B8855A6}.Release|x64.Build.0 = Resource|Win32 + {A2CCDE9F-17CE-461E-8BD9-00261B8855A6}.Setup|ARM64.ActiveCfg = Resource|Win32 {A2CCDE9F-17CE-461E-8BD9-00261B8855A6}.Setup|Win32.ActiveCfg = Resource|Win32 {A2CCDE9F-17CE-461E-8BD9-00261B8855A6}.Setup|Win32.Build.0 = Resource|Win32 {A2CCDE9F-17CE-461E-8BD9-00261B8855A6}.Setup|x64.ActiveCfg = Resource|Win32 + {31C016FB-9EA1-4AF5-987A-37210C04DA06}.Debug|ARM64.ActiveCfg = Resource|Win32 + {31C016FB-9EA1-4AF5-987A-37210C04DA06}.Debug|ARM64.Build.0 = Resource|Win32 {31C016FB-9EA1-4AF5-987A-37210C04DA06}.Debug|Win32.ActiveCfg = Resource|Win32 {31C016FB-9EA1-4AF5-987A-37210C04DA06}.Debug|Win32.Build.0 = Resource|Win32 {31C016FB-9EA1-4AF5-987A-37210C04DA06}.Debug|x64.ActiveCfg = Resource|Win32 {31C016FB-9EA1-4AF5-987A-37210C04DA06}.Debug|x64.Build.0 = Resource|Win32 + {31C016FB-9EA1-4AF5-987A-37210C04DA06}.Release|ARM64.ActiveCfg = Resource|Win32 + {31C016FB-9EA1-4AF5-987A-37210C04DA06}.Release|ARM64.Build.0 = Resource|Win32 {31C016FB-9EA1-4AF5-987A-37210C04DA06}.Release|Win32.ActiveCfg = Resource|Win32 {31C016FB-9EA1-4AF5-987A-37210C04DA06}.Release|Win32.Build.0 = Resource|Win32 {31C016FB-9EA1-4AF5-987A-37210C04DA06}.Release|x64.ActiveCfg = Resource|Win32 {31C016FB-9EA1-4AF5-987A-37210C04DA06}.Release|x64.Build.0 = Resource|Win32 + {31C016FB-9EA1-4AF5-987A-37210C04DA06}.Setup|ARM64.ActiveCfg = Resource|Win32 {31C016FB-9EA1-4AF5-987A-37210C04DA06}.Setup|Win32.ActiveCfg = Resource|Win32 {31C016FB-9EA1-4AF5-987A-37210C04DA06}.Setup|Win32.Build.0 = Resource|Win32 {31C016FB-9EA1-4AF5-987A-37210C04DA06}.Setup|x64.ActiveCfg = Resource|Win32 + {5C875214-0E3A-4CF0-BC0C-BFF6FAA4C089}.Debug|ARM64.ActiveCfg = Resource|Win32 + {5C875214-0E3A-4CF0-BC0C-BFF6FAA4C089}.Debug|ARM64.Build.0 = Resource|Win32 {5C875214-0E3A-4CF0-BC0C-BFF6FAA4C089}.Debug|Win32.ActiveCfg = Resource|Win32 {5C875214-0E3A-4CF0-BC0C-BFF6FAA4C089}.Debug|Win32.Build.0 = Resource|Win32 {5C875214-0E3A-4CF0-BC0C-BFF6FAA4C089}.Debug|x64.ActiveCfg = Resource|Win32 {5C875214-0E3A-4CF0-BC0C-BFF6FAA4C089}.Debug|x64.Build.0 = Resource|Win32 + {5C875214-0E3A-4CF0-BC0C-BFF6FAA4C089}.Release|ARM64.ActiveCfg = Resource|Win32 + {5C875214-0E3A-4CF0-BC0C-BFF6FAA4C089}.Release|ARM64.Build.0 = Resource|Win32 {5C875214-0E3A-4CF0-BC0C-BFF6FAA4C089}.Release|Win32.ActiveCfg = Resource|Win32 {5C875214-0E3A-4CF0-BC0C-BFF6FAA4C089}.Release|Win32.Build.0 = Resource|Win32 {5C875214-0E3A-4CF0-BC0C-BFF6FAA4C089}.Release|x64.ActiveCfg = Resource|Win32 {5C875214-0E3A-4CF0-BC0C-BFF6FAA4C089}.Release|x64.Build.0 = Resource|Win32 + {5C875214-0E3A-4CF0-BC0C-BFF6FAA4C089}.Setup|ARM64.ActiveCfg = Resource|Win32 {5C875214-0E3A-4CF0-BC0C-BFF6FAA4C089}.Setup|Win32.ActiveCfg = Resource|Win32 {5C875214-0E3A-4CF0-BC0C-BFF6FAA4C089}.Setup|Win32.Build.0 = Resource|Win32 {5C875214-0E3A-4CF0-BC0C-BFF6FAA4C089}.Setup|x64.ActiveCfg = Resource|Win32 + {ED74EBA9-1BCB-4B8F-9AE1-DC63B3C24A94}.Debug|ARM64.ActiveCfg = Resource|Win32 + {ED74EBA9-1BCB-4B8F-9AE1-DC63B3C24A94}.Debug|ARM64.Build.0 = Resource|Win32 {ED74EBA9-1BCB-4B8F-9AE1-DC63B3C24A94}.Debug|Win32.ActiveCfg = Resource|Win32 {ED74EBA9-1BCB-4B8F-9AE1-DC63B3C24A94}.Debug|Win32.Build.0 = Resource|Win32 {ED74EBA9-1BCB-4B8F-9AE1-DC63B3C24A94}.Debug|x64.ActiveCfg = Resource|Win32 {ED74EBA9-1BCB-4B8F-9AE1-DC63B3C24A94}.Debug|x64.Build.0 = Resource|Win32 + {ED74EBA9-1BCB-4B8F-9AE1-DC63B3C24A94}.Release|ARM64.ActiveCfg = Resource|Win32 + {ED74EBA9-1BCB-4B8F-9AE1-DC63B3C24A94}.Release|ARM64.Build.0 = Resource|Win32 {ED74EBA9-1BCB-4B8F-9AE1-DC63B3C24A94}.Release|Win32.ActiveCfg = Resource|Win32 {ED74EBA9-1BCB-4B8F-9AE1-DC63B3C24A94}.Release|Win32.Build.0 = Resource|Win32 {ED74EBA9-1BCB-4B8F-9AE1-DC63B3C24A94}.Release|x64.ActiveCfg = Resource|Win32 {ED74EBA9-1BCB-4B8F-9AE1-DC63B3C24A94}.Release|x64.Build.0 = Resource|Win32 + {ED74EBA9-1BCB-4B8F-9AE1-DC63B3C24A94}.Setup|ARM64.ActiveCfg = Resource|Win32 {ED74EBA9-1BCB-4B8F-9AE1-DC63B3C24A94}.Setup|Win32.ActiveCfg = Resource|Win32 {ED74EBA9-1BCB-4B8F-9AE1-DC63B3C24A94}.Setup|Win32.Build.0 = Resource|Win32 {ED74EBA9-1BCB-4B8F-9AE1-DC63B3C24A94}.Setup|x64.ActiveCfg = Resource|Win32 + {A42C6159-ACA8-46D1-A0FB-19C398B137D5}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {A42C6159-ACA8-46D1-A0FB-19C398B137D5}.Debug|ARM64.Build.0 = Debug|ARM64 + {A42C6159-ACA8-46D1-A0FB-19C398B137D5}.Debug|ARM64.Deploy.0 = Debug|ARM64 {A42C6159-ACA8-46D1-A0FB-19C398B137D5}.Debug|Win32.ActiveCfg = Debug|Win32 {A42C6159-ACA8-46D1-A0FB-19C398B137D5}.Debug|Win32.Build.0 = Debug|Win32 {A42C6159-ACA8-46D1-A0FB-19C398B137D5}.Debug|x64.ActiveCfg = Debug|x64 {A42C6159-ACA8-46D1-A0FB-19C398B137D5}.Debug|x64.Build.0 = Debug|x64 + {A42C6159-ACA8-46D1-A0FB-19C398B137D5}.Release|ARM64.ActiveCfg = Release|ARM64 + {A42C6159-ACA8-46D1-A0FB-19C398B137D5}.Release|ARM64.Build.0 = Release|ARM64 + {A42C6159-ACA8-46D1-A0FB-19C398B137D5}.Release|ARM64.Deploy.0 = Release|ARM64 {A42C6159-ACA8-46D1-A0FB-19C398B137D5}.Release|Win32.ActiveCfg = Release|Win32 {A42C6159-ACA8-46D1-A0FB-19C398B137D5}.Release|Win32.Build.0 = Release|Win32 {A42C6159-ACA8-46D1-A0FB-19C398B137D5}.Release|x64.ActiveCfg = Release|x64 {A42C6159-ACA8-46D1-A0FB-19C398B137D5}.Release|x64.Build.0 = Release|x64 + {A42C6159-ACA8-46D1-A0FB-19C398B137D5}.Setup|ARM64.ActiveCfg = Setup|ARM64 + {A42C6159-ACA8-46D1-A0FB-19C398B137D5}.Setup|ARM64.Build.0 = Setup|ARM64 {A42C6159-ACA8-46D1-A0FB-19C398B137D5}.Setup|Win32.ActiveCfg = Setup|Win32 {A42C6159-ACA8-46D1-A0FB-19C398B137D5}.Setup|Win32.Build.0 = Setup|Win32 {A42C6159-ACA8-46D1-A0FB-19C398B137D5}.Setup|x64.ActiveCfg = Setup|x64 {A42C6159-ACA8-46D1-A0FB-19C398B137D5}.Setup|x64.Build.0 = Setup|x64 + {F92A5473-F9E0-412F-923C-6632A66D13C1}.Debug|ARM64.ActiveCfg = update_4.2.1|Win32 {F92A5473-F9E0-412F-923C-6632A66D13C1}.Debug|Win32.ActiveCfg = update_4.3.1|Win32 {F92A5473-F9E0-412F-923C-6632A66D13C1}.Debug|x64.ActiveCfg = update_4.2.7|Win32 + {F92A5473-F9E0-412F-923C-6632A66D13C1}.Release|ARM64.ActiveCfg = update_4.2.4|Win32 {F92A5473-F9E0-412F-923C-6632A66D13C1}.Release|Win32.ActiveCfg = update_4.2.7|Win32 {F92A5473-F9E0-412F-923C-6632A66D13C1}.Release|Win32.Build.0 = update_4.2.7|Win32 {F92A5473-F9E0-412F-923C-6632A66D13C1}.Release|x64.ActiveCfg = update_4.2.7|Win32 + {F92A5473-F9E0-412F-923C-6632A66D13C1}.Setup|ARM64.ActiveCfg = update_4.2.1|Win32 {F92A5473-F9E0-412F-923C-6632A66D13C1}.Setup|Win32.ActiveCfg = update_4.2.7|Win32 {F92A5473-F9E0-412F-923C-6632A66D13C1}.Setup|x64.ActiveCfg = update_4.3.0|Win32 + {DAE66C9B-05DC-4ACE-97DA-2547B490BBFF}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {DAE66C9B-05DC-4ACE-97DA-2547B490BBFF}.Debug|ARM64.Build.0 = Debug|ARM64 {DAE66C9B-05DC-4ACE-97DA-2547B490BBFF}.Debug|Win32.ActiveCfg = Debug|Win32 {DAE66C9B-05DC-4ACE-97DA-2547B490BBFF}.Debug|Win32.Build.0 = Debug|Win32 {DAE66C9B-05DC-4ACE-97DA-2547B490BBFF}.Debug|x64.ActiveCfg = Debug|x64 {DAE66C9B-05DC-4ACE-97DA-2547B490BBFF}.Debug|x64.Build.0 = Debug|x64 + {DAE66C9B-05DC-4ACE-97DA-2547B490BBFF}.Release|ARM64.ActiveCfg = Release|ARM64 + {DAE66C9B-05DC-4ACE-97DA-2547B490BBFF}.Release|ARM64.Build.0 = Release|ARM64 {DAE66C9B-05DC-4ACE-97DA-2547B490BBFF}.Release|Win32.ActiveCfg = Release|Win32 {DAE66C9B-05DC-4ACE-97DA-2547B490BBFF}.Release|Win32.Build.0 = Release|Win32 {DAE66C9B-05DC-4ACE-97DA-2547B490BBFF}.Release|x64.ActiveCfg = Release|x64 {DAE66C9B-05DC-4ACE-97DA-2547B490BBFF}.Release|x64.Build.0 = Release|x64 + {DAE66C9B-05DC-4ACE-97DA-2547B490BBFF}.Setup|ARM64.ActiveCfg = Release|ARM64 + {DAE66C9B-05DC-4ACE-97DA-2547B490BBFF}.Setup|ARM64.Build.0 = Release|ARM64 {DAE66C9B-05DC-4ACE-97DA-2547B490BBFF}.Setup|Win32.ActiveCfg = Release|Win32 {DAE66C9B-05DC-4ACE-97DA-2547B490BBFF}.Setup|Win32.Build.0 = Release|Win32 {DAE66C9B-05DC-4ACE-97DA-2547B490BBFF}.Setup|x64.ActiveCfg = Release|x64 {DAE66C9B-05DC-4ACE-97DA-2547B490BBFF}.Setup|x64.Build.0 = Release|x64 + {7BD26CB3-5280-48FD-9A86-C13E321018D5}.Debug|ARM64.ActiveCfg = Resource|Win32 + {7BD26CB3-5280-48FD-9A86-C13E321018D5}.Debug|ARM64.Build.0 = Resource|Win32 {7BD26CB3-5280-48FD-9A86-C13E321018D5}.Debug|Win32.ActiveCfg = Resource|Win32 {7BD26CB3-5280-48FD-9A86-C13E321018D5}.Debug|Win32.Build.0 = Resource|Win32 {7BD26CB3-5280-48FD-9A86-C13E321018D5}.Debug|x64.ActiveCfg = Resource|Win32 {7BD26CB3-5280-48FD-9A86-C13E321018D5}.Debug|x64.Build.0 = Resource|Win32 + {7BD26CB3-5280-48FD-9A86-C13E321018D5}.Release|ARM64.ActiveCfg = Resource|Win32 + {7BD26CB3-5280-48FD-9A86-C13E321018D5}.Release|ARM64.Build.0 = Resource|Win32 {7BD26CB3-5280-48FD-9A86-C13E321018D5}.Release|Win32.ActiveCfg = Resource|Win32 {7BD26CB3-5280-48FD-9A86-C13E321018D5}.Release|Win32.Build.0 = Resource|Win32 {7BD26CB3-5280-48FD-9A86-C13E321018D5}.Release|x64.ActiveCfg = Resource|Win32 {7BD26CB3-5280-48FD-9A86-C13E321018D5}.Release|x64.Build.0 = Resource|Win32 + {7BD26CB3-5280-48FD-9A86-C13E321018D5}.Setup|ARM64.ActiveCfg = Resource|Win32 {7BD26CB3-5280-48FD-9A86-C13E321018D5}.Setup|Win32.ActiveCfg = Resource|Win32 {7BD26CB3-5280-48FD-9A86-C13E321018D5}.Setup|Win32.Build.0 = Resource|Win32 {7BD26CB3-5280-48FD-9A86-C13E321018D5}.Setup|x64.ActiveCfg = Resource|Win32 + {598AB4AC-008E-4501-90B3-C5213834C1DA}.Debug|ARM64.ActiveCfg = Resource|Win32 + {598AB4AC-008E-4501-90B3-C5213834C1DA}.Debug|ARM64.Build.0 = Resource|Win32 {598AB4AC-008E-4501-90B3-C5213834C1DA}.Debug|Win32.ActiveCfg = Resource|Win32 {598AB4AC-008E-4501-90B3-C5213834C1DA}.Debug|Win32.Build.0 = Resource|Win32 {598AB4AC-008E-4501-90B3-C5213834C1DA}.Debug|x64.ActiveCfg = Resource|Win32 {598AB4AC-008E-4501-90B3-C5213834C1DA}.Debug|x64.Build.0 = Resource|Win32 + {598AB4AC-008E-4501-90B3-C5213834C1DA}.Release|ARM64.ActiveCfg = Resource|Win32 + {598AB4AC-008E-4501-90B3-C5213834C1DA}.Release|ARM64.Build.0 = Resource|Win32 {598AB4AC-008E-4501-90B3-C5213834C1DA}.Release|Win32.ActiveCfg = Resource|Win32 {598AB4AC-008E-4501-90B3-C5213834C1DA}.Release|Win32.Build.0 = Resource|Win32 {598AB4AC-008E-4501-90B3-C5213834C1DA}.Release|x64.ActiveCfg = Resource|Win32 {598AB4AC-008E-4501-90B3-C5213834C1DA}.Release|x64.Build.0 = Resource|Win32 + {598AB4AC-008E-4501-90B3-C5213834C1DA}.Setup|ARM64.ActiveCfg = Resource|Win32 {598AB4AC-008E-4501-90B3-C5213834C1DA}.Setup|Win32.ActiveCfg = Resource|Win32 {598AB4AC-008E-4501-90B3-C5213834C1DA}.Setup|Win32.Build.0 = Resource|Win32 {598AB4AC-008E-4501-90B3-C5213834C1DA}.Setup|x64.ActiveCfg = Resource|Win32 + {63BAF573-170B-4FA0-AEE3-16E04F3E9DF5}.Debug|ARM64.ActiveCfg = Resource|Win32 + {63BAF573-170B-4FA0-AEE3-16E04F3E9DF5}.Debug|ARM64.Build.0 = Resource|Win32 {63BAF573-170B-4FA0-AEE3-16E04F3E9DF5}.Debug|Win32.ActiveCfg = Resource|Win32 {63BAF573-170B-4FA0-AEE3-16E04F3E9DF5}.Debug|Win32.Build.0 = Resource|Win32 {63BAF573-170B-4FA0-AEE3-16E04F3E9DF5}.Debug|x64.ActiveCfg = Resource|Win32 {63BAF573-170B-4FA0-AEE3-16E04F3E9DF5}.Debug|x64.Build.0 = Resource|Win32 + {63BAF573-170B-4FA0-AEE3-16E04F3E9DF5}.Release|ARM64.ActiveCfg = Resource|Win32 + {63BAF573-170B-4FA0-AEE3-16E04F3E9DF5}.Release|ARM64.Build.0 = Resource|Win32 {63BAF573-170B-4FA0-AEE3-16E04F3E9DF5}.Release|Win32.ActiveCfg = Resource|Win32 {63BAF573-170B-4FA0-AEE3-16E04F3E9DF5}.Release|Win32.Build.0 = Resource|Win32 {63BAF573-170B-4FA0-AEE3-16E04F3E9DF5}.Release|x64.ActiveCfg = Resource|Win32 {63BAF573-170B-4FA0-AEE3-16E04F3E9DF5}.Release|x64.Build.0 = Resource|Win32 + {63BAF573-170B-4FA0-AEE3-16E04F3E9DF5}.Setup|ARM64.ActiveCfg = Resource|Win32 {63BAF573-170B-4FA0-AEE3-16E04F3E9DF5}.Setup|Win32.ActiveCfg = Resource|Win32 {63BAF573-170B-4FA0-AEE3-16E04F3E9DF5}.Setup|Win32.Build.0 = Resource|Win32 {63BAF573-170B-4FA0-AEE3-16E04F3E9DF5}.Setup|x64.ActiveCfg = Resource|Win32 + {CA5BFC96-428D-42F5-9F7D-CDDE048A357C}.Debug|ARM64.ActiveCfg = Resource|Win32 + {CA5BFC96-428D-42F5-9F7D-CDDE048A357C}.Debug|ARM64.Build.0 = Resource|Win32 {CA5BFC96-428D-42F5-9F7D-CDDE048A357C}.Debug|Win32.ActiveCfg = Resource|Win32 {CA5BFC96-428D-42F5-9F7D-CDDE048A357C}.Debug|Win32.Build.0 = Resource|Win32 {CA5BFC96-428D-42F5-9F7D-CDDE048A357C}.Debug|x64.ActiveCfg = Resource|Win32 {CA5BFC96-428D-42F5-9F7D-CDDE048A357C}.Debug|x64.Build.0 = Resource|Win32 + {CA5BFC96-428D-42F5-9F7D-CDDE048A357C}.Release|ARM64.ActiveCfg = Resource|Win32 + {CA5BFC96-428D-42F5-9F7D-CDDE048A357C}.Release|ARM64.Build.0 = Resource|Win32 {CA5BFC96-428D-42F5-9F7D-CDDE048A357C}.Release|Win32.ActiveCfg = Resource|Win32 {CA5BFC96-428D-42F5-9F7D-CDDE048A357C}.Release|Win32.Build.0 = Resource|Win32 {CA5BFC96-428D-42F5-9F7D-CDDE048A357C}.Release|x64.ActiveCfg = Resource|Win32 {CA5BFC96-428D-42F5-9F7D-CDDE048A357C}.Release|x64.Build.0 = Resource|Win32 + {CA5BFC96-428D-42F5-9F7D-CDDE048A357C}.Setup|ARM64.ActiveCfg = Resource|Win32 {CA5BFC96-428D-42F5-9F7D-CDDE048A357C}.Setup|Win32.ActiveCfg = Resource|Win32 {CA5BFC96-428D-42F5-9F7D-CDDE048A357C}.Setup|Win32.Build.0 = Resource|Win32 {CA5BFC96-428D-42F5-9F7D-CDDE048A357C}.Setup|x64.ActiveCfg = Resource|Win32 + {D94BD2A6-1872-4F01-B911-F406603AA2E1}.Debug|ARM64.ActiveCfg = Debug|Win32 {D94BD2A6-1872-4F01-B911-F406603AA2E1}.Debug|Win32.ActiveCfg = Debug|Win32 {D94BD2A6-1872-4F01-B911-F406603AA2E1}.Debug|Win32.Build.0 = Debug|Win32 {D94BD2A6-1872-4F01-B911-F406603AA2E1}.Debug|x64.ActiveCfg = Debug|Win32 + {D94BD2A6-1872-4F01-B911-F406603AA2E1}.Release|ARM64.ActiveCfg = Release|Win32 {D94BD2A6-1872-4F01-B911-F406603AA2E1}.Release|Win32.ActiveCfg = Release|Win32 {D94BD2A6-1872-4F01-B911-F406603AA2E1}.Release|Win32.Build.0 = Release|Win32 {D94BD2A6-1872-4F01-B911-F406603AA2E1}.Release|x64.ActiveCfg = Release|Win32 + {D94BD2A6-1872-4F01-B911-F406603AA2E1}.Setup|ARM64.ActiveCfg = Release|Win32 {D94BD2A6-1872-4F01-B911-F406603AA2E1}.Setup|Win32.ActiveCfg = Release|Win32 {D94BD2A6-1872-4F01-B911-F406603AA2E1}.Setup|Win32.Build.0 = Release|Win32 {D94BD2A6-1872-4F01-B911-F406603AA2E1}.Setup|x64.ActiveCfg = Release|Win32 diff --git a/Src/Setup/BuildArchives.bat b/Src/Setup/BuildArchives.bat index eb5231a6d..8ea60554c 100644 --- a/Src/Setup/BuildArchives.bat +++ b/Src/Setup/BuildArchives.bat @@ -1,8 +1,11 @@ REM ***** Collect PDBs echo -- Creating symbols package -set CS_SYMBOLS_NAME=OpenShellPDB_%CS_VERSION_STR%.7z +set CS_SYMBOLS_NAME=OpenShellPDB_%CS_VERSION_STR% +if %ARCH%==ARM64 set CS_SYMBOLS_NAME=%CS_SYMBOLS_NAME%_ARM64 +set CS_SYMBOLS_NAME=%CS_SYMBOLS_NAME%.7z +if exist Final\%CS_SYMBOLS_NAME% del Final\%CS_SYMBOLS_NAME% > nul 7z a -mx9 .\Final\%CS_SYMBOLS_NAME% .\Output\symbols\* > nul if defined APPVEYOR ( diff --git a/Src/Setup/BuildBinaries.bat b/Src/Setup/BuildBinaries.bat index f1f814962..75e37c283 100644 --- a/Src/Setup/BuildBinaries.bat +++ b/Src/Setup/BuildBinaries.bat @@ -1,18 +1,26 @@ if exist Output rd /Q /S Output md Output md Output\x64 +md Output\ARM64 echo -- Compiling for /f "usebackq tokens=*" %%i in (`"%ProgramFiles(x86)%\Microsoft Visual Studio\Installer\vswhere.exe" -latest -products * -requires Microsoft.Component.MSBuild -property installationPath`) do set MSBuildDir=%%i\MSBuild\Current\Bin\ -REM ********* Build 64-bit solution -echo --- 64bit -"%MSBuildDir%MSBuild.exe" ..\OpenShell.sln /m /t:Rebuild /p:Configuration="Setup" /p:Platform="x64" /verbosity:quiet /nologo -@if ERRORLEVEL 1 exit /b 1 +if %ARCH%==ARM64 ( + REM ********* Build ARM64 solution + echo --- ARM64 + "%MSBuildDir%MSBuild.exe" ..\OpenShell.sln /m /t:Rebuild /p:Configuration="Setup" /p:Platform="ARM64" /verbosity:quiet /nologo + if ERRORLEVEL 1 exit /b 1 +) else ( + REM ********* Build x64 solution + echo --- x64 + "%MSBuildDir%MSBuild.exe" ..\OpenShell.sln /m /t:Rebuild /p:Configuration="Setup" /p:Platform="x64" /verbosity:quiet /nologo + if ERRORLEVEL 1 exit /b 1 +) REM ********* Build 32-bit solution (must be after 64-bit) -echo --- 32bit +echo --- x86 "%MSBuildDir%MSBuild.exe" ..\OpenShell.sln /m /t:Rebuild /p:Configuration="Setup" /p:Platform="Win32" /verbosity:quiet /nologo @if ERRORLEVEL 1 exit /b 1 @@ -42,12 +50,21 @@ copy /B ..\Update\DesktopToasts\Release\DesktopToasts.dll Output > nul copy /B ..\StartMenu\StartMenuHelper\Setup\StartMenuHelper32.dll Output > nul copy /B ..\Setup\SetupHelper\Release\SetupHelper.exe Output > nul -copy /B ..\ClassicExplorer\Setup64\ClassicExplorer64.dll Output\x64 > nul -copy /B ..\ClassicIE\Setup64\ClassicIEDLL_64.dll Output\x64 > nul -copy /B ..\ClassicIE\Setup64\ClassicIE_64.exe Output\x64 > nul -copy /B ..\StartMenu\Setup64\StartMenu.exe Output\x64 > nul -copy /B ..\StartMenu\Setup64\StartMenuDLL.dll Output\x64 > nul -copy /B ..\StartMenu\StartMenuHelper\Setup64\StartMenuHelper64.dll Output\x64 > nul +if %ARCH%==ARM64 ( + copy /B ..\ClassicExplorer\SetupARM64\ClassicExplorerARM64.dll Output\ARM64 > nul + copy /B ..\ClassicIE\SetupARM64\ClassicIEDLL_ARM64.dll Output\ARM64 > nul + copy /B ..\ClassicIE\SetupARM64\ClassicIE_ARM64.exe Output\ARM64 > nul + copy /B ..\StartMenu\SetupARM64\StartMenu.exe Output\ARM64 > nul + copy /B ..\StartMenu\SetupARM64\StartMenuDLL.dll Output\ARM64 > nul + copy /B ..\StartMenu\StartMenuHelper\SetupARM64\StartMenuHelperARM64.dll Output\ARM64 > nul +) else ( + copy /B ..\ClassicExplorer\Setup64\ClassicExplorer64.dll Output\x64 > nul + copy /B ..\ClassicIE\Setup64\ClassicIEDLL_64.dll Output\x64 > nul + copy /B ..\ClassicIE\Setup64\ClassicIE_64.exe Output\x64 > nul + copy /B ..\StartMenu\Setup64\StartMenu.exe Output\x64 > nul + copy /B ..\StartMenu\Setup64\StartMenuDLL.dll Output\x64 > nul + copy /B ..\StartMenu\StartMenuHelper\Setup64\StartMenuHelper64.dll Output\x64 > nul +) copy /B "..\StartMenu\Skins\Classic Skin.skin" Output > nul copy /B "..\StartMenu\Skins\Full Glass.skin" Output > nul @@ -67,7 +84,8 @@ copy /B "..\StartMenu\Skins\Metallic.skin7" Output > nul REM ********* Collect debug info md Output\PDB32 -md Output\PDB64 +md Output\PDBx64 +md Output\PDBARM64 REM Explorer 32 copy /B ..\ClassicExplorer\Setup\ClassicExplorer32.pdb Output\PDB32 > nul @@ -75,9 +93,15 @@ copy /B Output\ClassicExplorer32.dll Output\PDB32 > nul copy /B ..\ClassicExplorer\Setup\ClassicExplorerSettings.pdb Output\PDB32 > nul copy /B Output\ClassicExplorerSettings.exe Output\PDB32 > nul -REM Explorer 64 -copy /B ..\ClassicExplorer\Setup64\ClassicExplorer64.pdb Output\PDB64 > nul -copy /B Output\x64\ClassicExplorer64.dll Output\PDB64 > nul +if %ARCH%==ARM64 ( + REM Explorer ARM64 + copy /B ..\ClassicExplorer\SetupARM64\ClassicExplorerARM64.pdb Output\PDBARM64 > nul + copy /B Output\ARM64\ClassicExplorerARM64.dll Output\PDBARM64 > nul +) else ( + REM Explorer x64 + copy /B ..\ClassicExplorer\Setup64\ClassicExplorer64.pdb Output\PDBx64 > nul + copy /B Output\x64\ClassicExplorer64.dll Output\PDBx64 > nul +) REM IE 32 copy /B ..\ClassicIE\Setup\ClassicIEDLL_32.pdb Output\PDB32 > nul @@ -85,11 +109,19 @@ copy /B Output\ClassicIEDLL_32.dll Output\PDB32 > nul copy /B ..\ClassicIE\Setup\ClassicIE_32.pdb Output\PDB32 > nul copy /B Output\ClassicIE_32.exe Output\PDB32 > nul -REM IE 64 -copy /B ..\ClassicIE\Setup64\ClassicIEDLL_64.pdb Output\PDB64 > nul -copy /B Output\x64\ClassicIEDLL_64.dll Output\PDB64 > nul -copy /B ..\ClassicIE\Setup64\ClassicIE_64.pdb Output\PDB64 > nul -copy /B Output\x64\ClassicIE_64.exe Output\PDB64 > nul +if %ARCH%==ARM64 ( + REM IE ARM64 + copy /B ..\ClassicIE\SetupARM64\ClassicIEDLL_ARM64.pdb Output\PDBARM64 > nul + copy /B Output\ARM64\ClassicIEDLL_ARM64.dll Output\PDBARM64 > nul + copy /B ..\ClassicIE\SetupARM64\ClassicIE_ARM64.pdb Output\PDBARM64 > nul + copy /B Output\ARM64\ClassicIE_ARM64.exe Output\PDBARM64 > nul +) else ( + REM IE x64 + copy /B ..\ClassicIE\Setup64\ClassicIEDLL_64.pdb Output\PDBx64 > nul + copy /B Output\x64\ClassicIEDLL_64.dll Output\PDBx64 > nul + copy /B ..\ClassicIE\Setup64\ClassicIE_64.pdb Output\PDBx64 > nul + copy /B Output\x64\ClassicIE_64.exe Output\PDBx64 > nul +) REM Menu 32 copy /B ..\StartMenu\Setup\StartMenu.pdb Output\PDB32 > nul @@ -103,14 +135,23 @@ copy /B Output\Update.exe Output\PDB32 > nul copy /B ..\Update\DesktopToasts\Release\DesktopToasts.pdb Output\PDB32 > nul copy /B Output\DesktopToasts.dll Output\PDB32 > nul -REM Menu 64 -copy /B ..\StartMenu\Setup64\StartMenu.pdb Output\PDB64 > nul -copy /B Output\x64\StartMenu.exe Output\PDB64 > nul -copy /B ..\StartMenu\Setup64\StartMenuDLL.pdb Output\PDB64 > nul -copy /B Output\x64\StartMenuDLL.dll Output\PDB64 > nul -copy /B ..\StartMenu\StartMenuHelper\Setup64\StartMenuHelper64.pdb Output\PDB64 > nul -copy /B Output\x64\StartMenuHelper64.dll Output\PDB64 > nul - +if %ARCH%==ARM64 ( + REM Menu ARM64 + copy /B ..\StartMenu\SetupARM64\StartMenu.pdb Output\PDBARM64 > nul + copy /B Output\ARM64\StartMenu.exe Output\PDBARM64 > nul + copy /B ..\StartMenu\SetupARM64\StartMenuDLL.pdb Output\PDBARM64 > nul + copy /B Output\ARM64\StartMenuDLL.dll Output\PDBARM64 > nul + copy /B ..\StartMenu\StartMenuHelper\SetupARM64\StartMenuHelperARM64.pdb Output\PDBARM64 > nul + copy /B Output\ARM64\StartMenuHelperARM64.dll Output\PDBARM64 > nul +) else ( + REM Menu x64 + copy /B ..\StartMenu\Setup64\StartMenu.pdb Output\PDBx64 > nul + copy /B Output\x64\StartMenu.exe Output\PDBx64 > nul + copy /B ..\StartMenu\Setup64\StartMenuDLL.pdb Output\PDBx64 > nul + copy /B Output\x64\StartMenuDLL.dll Output\PDBx64 > nul + copy /B ..\StartMenu\StartMenuHelper\Setup64\StartMenuHelper64.pdb Output\PDBx64 > nul + copy /B Output\x64\StartMenuHelper64.dll Output\PDBx64 > nul +) REM ********* Source Index PDBs @@ -124,7 +165,11 @@ if exist %PDBSTR_PATH% ( %PDBSTR_PATH% -w -p:%%f -s:srcsrv -i:Output\pdbstr.txt ) - for %%f in (Output\PDB64\*.pdb) do ( + for %%f in (Output\PDBx64\*.pdb) do ( + %PDBSTR_PATH% -w -p:%%f -s:srcsrv -i:Output\pdbstr.txt + ) + + for %%f in (Output\PDBARM64\*.pdb) do ( %PDBSTR_PATH% -w -p:%%f -s:srcsrv -i:Output\pdbstr.txt ) ) @@ -134,12 +179,14 @@ REM ********* Prepare symbols set SYMSTORE_PATH="C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\symstore.exe" %SYMSTORE_PATH% add /r /f Output\PDB32 /s Output\symbols /t OpenShell -:NOREFS > nul -%SYMSTORE_PATH% add /r /f Output\PDB64 /s Output\symbols /t OpenShell -:NOREFS > nul +%SYMSTORE_PATH% add /r /f Output\PDBx64 /s Output\symbols /t OpenShell -:NOREFS > nul +%SYMSTORE_PATH% add /r /f Output\PDBARM64 /s Output\symbols /t OpenShell -:NOREFS > nul rd /Q /S Output\symbols\000Admin > nul del Output\symbols\pingme.txt > nul rd /Q /S Output\PDB32 -rd /Q /S Output\PDB64 +rd /Q /S Output\PDBx64 +rd /Q /S Output\PDBARM64 REM ********* Build ADMX echo --- ADMX diff --git a/Src/Setup/BuildInstaller.bat b/Src/Setup/BuildInstaller.bat index a6a76886e..64d8161ed 100644 --- a/Src/Setup/BuildInstaller.bat +++ b/Src/Setup/BuildInstaller.bat @@ -24,6 +24,13 @@ echo -- Building Installer (%CS_LANG_NAME_SHORT%) SET CS_INSTALLER_NAME=OpenShellSetup_%CS_VERSION_STR%-%CS_LANG_NAME_SHORT% if %CS_LANG_NAME_SHORT%==en SET CS_INSTALLER_NAME=OpenShellSetup_%CS_VERSION_STR% +if %ARCH%==ARM64 SET CS_INSTALLER_NAME=%CS_INSTALLER_NAME%_ARM64 + +SET CS_SETUP_ARCH=Win32 +if %ARCH%==ARM64 SET CS_SETUP_ARCH=ARM64 + +SET CS_SETUP_DIR=Release +if %ARCH%==ARM64 SET CS_SETUP_DIR=%CS_SETUP_DIR%ARM64 if exist Temp rd /Q /S Temp md Temp @@ -36,47 +43,61 @@ md Temp @set /a "CS_VERSION_NUM=%%A<<24|%%B<<16|%%C" ) -REM ********* Build 32-bit MSI -echo --- 32bit MSI -candle Setup.wxs -nologo -out Temp\Setup32.wixobj -ext WixUIExtension -ext WixUtilExtension -dx64=0 -dCS_LANG_FOLDER=%CS_LANG_FOLDER% -dCS_LANG_NAME=%CS_LANG_NAME% -@if ERRORLEVEL 1 exit /b 1 - -@REM We need to suppress ICE38 and ICE43 because they apply only to per-user installation. We only support per-machine installs -@REM We need to suppress ICE09 because the helper DLLs need to go into the system directory (for safety reasons) -light Temp\Setup32.wixobj -nologo -out Temp\Setup32.msi -ext WixUIExtension -ext WixUtilExtension -loc ..\Localization\%CS_LANG_FOLDER%\OpenShellText-%CS_LANG_NAME%.wxl -loc ..\Localization\%CS_LANG_FOLDER%\WixUI_%CS_LANG_NAME%.wxl -sice:ICE38 -sice:ICE43 -sice:ICE09 -@if ERRORLEVEL 1 exit /b 1 - - -REM ********* Build 64-bit MSI -echo --- 64bit MSI -candle Setup.wxs -nologo -out Temp\Setup64.wixobj -ext WixUIExtension -ext WixUtilExtension -dx64=1 -dCS_LANG_FOLDER=%CS_LANG_FOLDER% -dCS_LANG_NAME=%CS_LANG_NAME% -@if ERRORLEVEL 1 exit /b 1 - -@REM We need to suppress ICE38 and ICE43 because they apply only to per-user installation. We only support per-machine installs -@REM We need to suppress ICE09 because the helper DLLs need to go into the system directory (for safety reasons) -light Temp\Setup64.wixobj -nologo -out Temp\Setup64.msi -ext WixUIExtension -ext WixUtilExtension -loc ..\Localization\%CS_LANG_FOLDER%\OpenShellText-%CS_LANG_NAME%.wxl -loc ..\Localization\%CS_LANG_FOLDER%\WixUI_%CS_LANG_NAME%.wxl -sice:ICE38 -sice:ICE43 -sice:ICE09 -@if ERRORLEVEL 1 exit /b 1 - +if %ARCH%==ARM64 ( + REM ********* Build ARM64 MSI + echo --- ARM64 MSI + candle Setup.wxs -nologo -out Temp\SetupARM64.wixobj -ext WixUIExtension -ext WixUtilExtension -dx64=0 -dARM64=1 -dCS_LANG_FOLDER=%CS_LANG_FOLDER% -dCS_LANG_NAME=%CS_LANG_NAME% + if ERRORLEVEL 1 exit /b 1 + + REM We need to suppress ICE38 and ICE43 because they apply only to per-user installation. We only support per-machine installs + REM We need to suppress ICE09 because the helper DLLs need to go into the system directory (for safety reasons) + light Temp\SetupARM64.wixobj -nologo -out Temp\SetupARM64.msi -ext WixUIExtension -ext WixUtilExtension -loc ..\Localization\%CS_LANG_FOLDER%\OpenShellText-%CS_LANG_NAME%.wxl -loc ..\Localization\%CS_LANG_FOLDER%\WixUI_%CS_LANG_NAME%.wxl -sice:ICE38 -sice:ICE43 -sice:ICE09 + if ERRORLEVEL 1 exit /b 1 +) else ( + REM ********* Build x86 MSI + echo --- x86 MSI + candle Setup.wxs -nologo -out Temp\Setup32.wixobj -ext WixUIExtension -ext WixUtilExtension -dx64=0 -dARM64=0 -dCS_LANG_FOLDER=%CS_LANG_FOLDER% -dCS_LANG_NAME=%CS_LANG_NAME% + if ERRORLEVEL 1 exit /b 1 + + REM We need to suppress ICE38 and ICE43 because they apply only to per-user installation. We only support per-machine installs + REM We need to suppress ICE09 because the helper DLLs need to go into the system directory (for safety reasons) + light Temp\Setup32.wixobj -nologo -out Temp\Setup32.msi -ext WixUIExtension -ext WixUtilExtension -loc ..\Localization\%CS_LANG_FOLDER%\OpenShellText-%CS_LANG_NAME%.wxl -loc ..\Localization\%CS_LANG_FOLDER%\WixUI_%CS_LANG_NAME%.wxl -sice:ICE38 -sice:ICE43 -sice:ICE09 + if ERRORLEVEL 1 exit /b 1 + + REM ********* Build x64 MSI + echo --- x64 MSI + candle Setup.wxs -nologo -out Temp\Setup64.wixobj -ext WixUIExtension -ext WixUtilExtension -dx64=1 -dARM64=0 -dCS_LANG_FOLDER=%CS_LANG_FOLDER% -dCS_LANG_NAME=%CS_LANG_NAME% + if ERRORLEVEL 1 exit /b 1 + + REM We need to suppress ICE38 and ICE43 because they apply only to per-user installation. We only support per-machine installs + REM We need to suppress ICE09 because the helper DLLs need to go into the system directory (for safety reasons) + light Temp\Setup64.wixobj -nologo -out Temp\Setup64.msi -ext WixUIExtension -ext WixUtilExtension -loc ..\Localization\%CS_LANG_FOLDER%\OpenShellText-%CS_LANG_NAME%.wxl -loc ..\Localization\%CS_LANG_FOLDER%\WixUI_%CS_LANG_NAME%.wxl -sice:ICE38 -sice:ICE43 -sice:ICE09 + if ERRORLEVEL 1 exit /b 1 +) REM ********* Build MSI Checksums echo --- MSI Checksums -Utility\Release\Utility.exe crcmsi Temp +if %ARCH%==ARM64 ( + Utility\Release\Utility.exe crcarm64msi Temp +) else ( + Utility\Release\Utility.exe crcmsi Temp +) @if ERRORLEVEL 1 exit /b 1 REM ********* Build bootstrapper echo --- Bootstrapper for /f "usebackq tokens=*" %%i in (`"%ProgramFiles(x86)%\Microsoft Visual Studio\Installer\vswhere.exe" -latest -products * -requires Microsoft.Component.MSBuild -property installationPath`) do set MSBuildDir=%%i\MSBuild\Current\Bin\ -"%MSBuildDir%MSBuild.exe" Setup.sln /m /t:Rebuild /p:Configuration="Release" /p:Platform="Win32" /verbosity:quiet /nologo +"%MSBuildDir%MSBuild.exe" Setup.sln /m /t:Rebuild /p:Configuration="Release" /p:Platform="%CS_SETUP_ARCH%" /verbosity:quiet /nologo @if ERRORLEVEL 1 exit /b 1 -if exist Final rd /Q /S Final -md Final +if exist Final\%CS_INSTALLER_NAME%.exe del Final\%CS_INSTALLER_NAME%.exe > nul +md Final 1> nul 2>&1 -copy /B Release\Setup.exe Final\%CS_INSTALLER_NAME%.exe > nul +copy /B %CS_SETUP_DIR%\Setup.exe Final\%CS_INSTALLER_NAME%.exe > nul if defined APPVEYOR ( - appveyor PushArtifact Release\Setup.exe -FileName %CS_INSTALLER_NAME%.exe + appveyor PushArtifact %CS_SETUP_DIR%\Setup.exe -FileName %CS_INSTALLER_NAME%.exe ) SET CS_LANG_FOLDER= diff --git a/Src/Setup/Setup.cpp b/Src/Setup/Setup.cpp index d3471af40..baa167702 100644 --- a/Src/Setup/Setup.cpp +++ b/Src/Setup/Setup.cpp @@ -12,10 +12,13 @@ #include "StringUtils.h" #include "FNVHash.h" -// Setup.exe is a bootstrap application that contains installers for 32-bit and 64-bit. +// Setup.exe is a bootstrap application that contains installers for x86 and x64 or ARM64. // It unpacks the right installer into the temp directory and executes it. typedef BOOL (WINAPI *FIsWow64Process)( HANDLE hProcess, PBOOL Wow64Process ); +typedef BOOL (WINAPI *FIsWow64Process2)( HANDLE hProcess, USHORT *pProcessMachine, USHORT *pNativeMachine ); +typedef BOOL (WINAPI *FWow64DisableWow64FsRedirection)( PVOID* OldValue ); +typedef BOOL (WINAPI *FWow64RevertWow64FsRedirection)( PVOID OldValue ); @@ -31,6 +34,14 @@ enum ERR_MSIEXEC, // msiexec failed to start }; +enum ExtractType +{ + None, + x86, + x64, + ARM64 +}; + struct Chunk { int start1, start2, len; @@ -49,7 +60,7 @@ static void WriteFileXOR( HANDLE hFile, const unsigned char *buf, int size ) } } -static int ExtractMsi( HINSTANCE hInstance, const wchar_t *msiName, bool b64, bool bQuiet ) +static int ExtractMsi( HINSTANCE hInstance, const wchar_t *msiName, ExtractType extractType, bool bQuiet ) { void *pRes=NULL; HRSRC hResInfo=FindResource(hInstance,MAKEINTRESOURCE(IDR_MSI_CHECKSUM),L"MSI_FILE"); @@ -70,10 +81,10 @@ static int ExtractMsi( HINSTANCE hInstance, const wchar_t *msiName, bool b64, bo } return ERR_HASH_NOTFOUND; } - unsigned int hash0=((unsigned int*)pRes)[b64?1:0]; + unsigned int hash0=((unsigned int*)pRes)[extractType==x64?1:0]; const Chunk *pChunks=NULL; int chunkCount=0; - if (b64) + if (extractType==x64) { chunkCount=((unsigned int*)pRes)[2]; pChunks=(Chunk*)((unsigned int*)pRes+3); @@ -87,7 +98,7 @@ static int ExtractMsi( HINSTANCE hInstance, const wchar_t *msiName, bool b64, bo HGLOBAL hRes=LoadResource(hInstance,hResInfo); pRes32=(unsigned char*)LockResource(hRes); } - if (!pRes32) + if (!pRes32 && extractType!=ARM64) { if (!bQuiet) { @@ -99,19 +110,19 @@ static int ExtractMsi( HINSTANCE hInstance, const wchar_t *msiName, bool b64, bo } return ERR_MSIRES_NOTFOUND; } - const unsigned char *pRes64=NULL; + const unsigned char *pResx64=NULL, *pResArm64=NULL; int size32=SizeofResource(hInstance,hResInfo); unsigned int hash; - int size64=0; - if (b64) + int sizex64=0, sizeArm64=0; + if (extractType==x64) { HRSRC hResInfo=FindResource(hInstance,MAKEINTRESOURCE(IDR_MSI_FILE64),L"MSI_FILE"); if (hResInfo) { HGLOBAL hRes=LoadResource(hInstance,hResInfo); - pRes64=(unsigned char*)LockResource(hRes); + pResx64=(unsigned char*)LockResource(hRes); } - if (!pRes64) + if (!pResx64) { if (!bQuiet) { @@ -124,7 +135,7 @@ static int ExtractMsi( HINSTANCE hInstance, const wchar_t *msiName, bool b64, bo return ERR_MSIRES_NOTFOUND; } - size64=SizeofResource(hInstance,hResInfo); + sizex64=SizeofResource(hInstance,hResInfo); hash=FNV_HASH0; int start=0; int pos=0; @@ -132,13 +143,37 @@ static int ExtractMsi( HINSTANCE hInstance, const wchar_t *msiName, bool b64, bo { const Chunk &chunk=pChunks[i]; if (start0;count--,params++) { @@ -233,9 +272,11 @@ int APIENTRY wWinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCm return 0; } if (_wcsicmp(params[0],L"extract32")==0) - extract=32; + extractType=x86; if (_wcsicmp(params[0],L"extract64")==0) - extract=64; + extractType=x64; + if (_wcsicmp(params[0],L"extractARM64")==0) + extractType=ARM64; if (_wcsicmp(params[0],L"/qn")==0 || _wcsicmp(params[0],L"/q")==0 || _wcsicmp(params[0],L"/quiet")==0 || _wcsicmp(params[0],L"/passive")==0) { bQuiet=true; @@ -255,11 +296,11 @@ int APIENTRY wWinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCm return ERR_VERRES_NOTFOUND; } - if (extract) + if (extractType != None) { wchar_t msiName[_MAX_PATH]; - Sprintf(msiName,_countof(msiName),L"OpenShellSetup%d_%d_%d_%d.msi",extract,HIWORD(pVer->dwProductVersionMS),LOWORD(pVer->dwProductVersionMS),HIWORD(pVer->dwProductVersionLS)); - return ExtractMsi(hInstance,msiName,extract==64,bQuiet); + Sprintf(msiName,_countof(msiName),L"OpenShellSetup%s_%d_%d_%d.msi",(extractType==x86?L"32":(extractType==x64?L"64":L"ARM64")),HIWORD(pVer->dwProductVersionMS),LOWORD(pVer->dwProductVersionMS),HIWORD(pVer->dwProductVersionLS)); + return ExtractMsi(hInstance,msiName,extractType,bQuiet); } // check Windows version @@ -282,7 +323,9 @@ int APIENTRY wWinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCm // dynamically link to IsWow64Process because it is not available for Windows 2000 HMODULE hKernel32=GetModuleHandle(L"kernel32.dll"); FIsWow64Process isWow64Process=(FIsWow64Process)GetProcAddress(hKernel32,"IsWow64Process"); - if (!isWow64Process) + FWow64DisableWow64FsRedirection wow64DisableWow64FsRedirection=(FWow64DisableWow64FsRedirection)GetProcAddress(hKernel32,"Wow64DisableWow64FsRedirection"); + FWow64RevertWow64FsRedirection wow64RevertWow64FsRedirection=(FWow64RevertWow64FsRedirection)GetProcAddress(hKernel32,"Wow64RevertWow64FsRedirection"); + if (!isWow64Process || !wow64DisableWow64FsRedirection || !wow64RevertWow64FsRedirection) { if (!bQuiet) { @@ -295,13 +338,26 @@ int APIENTRY wWinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCm return ERR_WRONG_OS; } - BOOL b64=FALSE; - isWow64Process(GetCurrentProcess(),&b64); + // Use IsWow64Process2 if it's available (Windows 10 1511+), otherwise fall back to IsWow64Process + FIsWow64Process2 isWow64Process2=(FIsWow64Process2)GetProcAddress(hKernel32,"IsWow64Process2"); + USHORT processMachine = 0; + if (isWow64Process2) + { + USHORT nativeMachine = 0; + isWow64Process2(GetCurrentProcess(), &processMachine, &nativeMachine); + extractType=nativeMachine==IMAGE_FILE_MACHINE_AMD64?x64:nativeMachine==IMAGE_FILE_MACHINE_ARM64?ARM64:x86; + } + else + { + BOOL x64=FALSE; + isWow64Process(GetCurrentProcess(),&x64); + extractType=x64?ExtractType::x64:x86; + } wchar_t msiName[_MAX_PATH]; - Sprintf(msiName,_countof(msiName),L"%%ALLUSERSPROFILE%%\\OpenShellSetup%d_%d_%d_%d.msi",b64?64:32,HIWORD(pVer->dwProductVersionMS),LOWORD(pVer->dwProductVersionMS),HIWORD(pVer->dwProductVersionLS)); + Sprintf(msiName,_countof(msiName),L"%%ALLUSERSPROFILE%%\\OpenShellSetup%s_%d_%d_%d.msi",(extractType==x86?L"32":(extractType==x64?L"64":L"ARM64")),HIWORD(pVer->dwProductVersionMS),LOWORD(pVer->dwProductVersionMS),HIWORD(pVer->dwProductVersionLS)); DoEnvironmentSubst(msiName,_countof(msiName)); - int ex=ExtractMsi(hInstance,msiName,b64!=FALSE,bQuiet); + int ex=ExtractMsi(hInstance,msiName,extractType,bQuiet); if (ex) return ex; wchar_t cmdLine[2048]; @@ -316,11 +372,19 @@ int APIENTRY wWinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCm Sprintf(cmdLine,_countof(cmdLine),L"msiexec.exe /i \"%s\" %s",msiName,lpCmdLine); } + // On ARM64 we must launch msiexec.exe from system32 and not syswow64 as would otherwise happen + PVOID wow64FsRedirVal=NULL; + if (extractType == ARM64 && processMachine != IMAGE_FILE_MACHINE_ARM64) + Wow64DisableWow64FsRedirection(&wow64FsRedirVal); + // start the installer STARTUPINFO startupInfo={sizeof(startupInfo)}; PROCESS_INFORMATION processInfo; memset(&processInfo,0,sizeof(processInfo)); - if (!CreateProcess(NULL,cmdLine,NULL,NULL,TRUE,0,NULL,NULL,&startupInfo,&processInfo)) + BOOL ret=CreateProcess(NULL,cmdLine,NULL,NULL,TRUE,0,NULL,NULL,&startupInfo,&processInfo); + if (extractType == ARM64 && processMachine != IMAGE_FILE_MACHINE_ARM64) + Wow64RevertWow64FsRedirection(wow64FsRedirVal); + if (!ret) { DeleteFile(msiName); if (!bQuiet) diff --git a/Src/Setup/Setup.rc b/Src/Setup/Setup.rc index 8d479c126..99e7e8da7 100644 --- a/Src/Setup/Setup.rc +++ b/Src/Setup/Setup.rc @@ -100,8 +100,12 @@ END // MSI_FILE // +#if defined(_M_AMD64) || defined(_M_IX86) IDR_MSI_FILE32 MSI_FILE "Temp\\Setup32.msi_" IDR_MSI_FILE64 MSI_FILE "Temp\\Setup64.msi_" +#elif defined(_M_ARM64) +IDR_MSI_FILEARM64 MSI_FILE "Temp\\SetupARM64.msi_" +#endif IDR_MSI_CHECKSUM MSI_FILE "msichecksum.bin" diff --git a/Src/Setup/Setup.sln b/Src/Setup/Setup.sln index e805f6e7d..c25994faa 100644 --- a/Src/Setup/Setup.sln +++ b/Src/Setup/Setup.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 15 -VisualStudioVersion = 15.0.27130.2010 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.31005.135 MinimumVisualStudioVersion = 10.0.40219.1 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Setup", "Setup.vcxproj", "{A4A4D3B1-24E7-401E-A37C-72141D7603DC}" EndProject @@ -9,22 +9,32 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Lib", "..\Lib\Lib.vcxproj", EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|ARM64 = Debug|ARM64 Debug|Win32 = Debug|Win32 Debug|x64 = Debug|x64 + Release|ARM64 = Release|ARM64 Release|Win32 = Release|Win32 Release|x64 = Release|x64 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution + {A4A4D3B1-24E7-401E-A37C-72141D7603DC}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {A4A4D3B1-24E7-401E-A37C-72141D7603DC}.Debug|ARM64.Build.0 = Debug|ARM64 {A4A4D3B1-24E7-401E-A37C-72141D7603DC}.Debug|Win32.ActiveCfg = Debug|Win32 {A4A4D3B1-24E7-401E-A37C-72141D7603DC}.Debug|Win32.Build.0 = Debug|Win32 {A4A4D3B1-24E7-401E-A37C-72141D7603DC}.Debug|x64.ActiveCfg = Debug|Win32 + {A4A4D3B1-24E7-401E-A37C-72141D7603DC}.Release|ARM64.ActiveCfg = Release|ARM64 + {A4A4D3B1-24E7-401E-A37C-72141D7603DC}.Release|ARM64.Build.0 = Release|ARM64 {A4A4D3B1-24E7-401E-A37C-72141D7603DC}.Release|Win32.ActiveCfg = Release|Win32 {A4A4D3B1-24E7-401E-A37C-72141D7603DC}.Release|Win32.Build.0 = Release|Win32 {A4A4D3B1-24E7-401E-A37C-72141D7603DC}.Release|x64.ActiveCfg = Release|Win32 + {D42FE717-485B-492D-884A-1999F6D51154}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {D42FE717-485B-492D-884A-1999F6D51154}.Debug|ARM64.Build.0 = Debug|ARM64 {D42FE717-485B-492D-884A-1999F6D51154}.Debug|Win32.ActiveCfg = Debug|Win32 {D42FE717-485B-492D-884A-1999F6D51154}.Debug|Win32.Build.0 = Debug|Win32 {D42FE717-485B-492D-884A-1999F6D51154}.Debug|x64.ActiveCfg = Debug|x64 {D42FE717-485B-492D-884A-1999F6D51154}.Debug|x64.Build.0 = Debug|x64 + {D42FE717-485B-492D-884A-1999F6D51154}.Release|ARM64.ActiveCfg = Release|ARM64 + {D42FE717-485B-492D-884A-1999F6D51154}.Release|ARM64.Build.0 = Release|ARM64 {D42FE717-485B-492D-884A-1999F6D51154}.Release|Win32.ActiveCfg = Release|Win32 {D42FE717-485B-492D-884A-1999F6D51154}.Release|Win32.Build.0 = Release|Win32 {D42FE717-485B-492D-884A-1999F6D51154}.Release|x64.ActiveCfg = Release|x64 diff --git a/Src/Setup/Setup.vcxproj b/Src/Setup/Setup.vcxproj index 62ccbfe77..f04530b66 100644 --- a/Src/Setup/Setup.vcxproj +++ b/Src/Setup/Setup.vcxproj @@ -1,10 +1,18 @@ + + Debug + ARM64 + Debug Win32 + + Release + ARM64 + Release Win32 @@ -23,11 +31,22 @@ Unicode true + + Application + v142 + Unicode + true + Application v142 Unicode + + Application + v142 + Unicode + @@ -35,21 +54,39 @@ + + + + + + + + $(Configuration)\ $(Configuration)\ true + + true + $(Configuration)ARM64\ + $(Configuration)ARM64\ + $(Configuration)\ $(Configuration)\ false + + false + $(Configuration)ARM64\ + $(Configuration)ARM64\ + Disabled @@ -65,7 +102,30 @@ stdcpp17 - _DEBUG;%(PreprocessorDefinitions) + _M_IX86=1;_X86_=1;_DEBUG;%(PreprocessorDefinitions) + + + comctl32.lib;Psapi.lib;version.lib;%(AdditionalDependencies) + true + Windows + + + + + Disabled + ..\Lib;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) + EnableFastChecks + MultiThreadedDebug + NotUsing + Level3 + EditAndContinue + true + true + stdcpp17 + + + _M_ARM64=1;_ARM64_=1;_DEBUG;%(PreprocessorDefinitions) comctl32.lib;Psapi.lib;version.lib;%(AdditionalDependencies) @@ -88,7 +148,32 @@ stdcpp17 - NDEBUG;%(PreprocessorDefinitions) + _M_IX86=1;_X86_=1;NDEBUG;%(PreprocessorDefinitions) + + + comctl32.lib;Psapi.lib;version.lib;%(AdditionalDependencies) + true + Windows + true + true + + + + + MaxSpeed + ..\Lib;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) + MultiThreaded + true + NotUsing + Level3 + ProgramDatabase + true + true + stdcpp17 + + + _M_ARM64=1;_ARM64_=1;NDEBUG;%(PreprocessorDefinitions) comctl32.lib;Psapi.lib;version.lib;%(AdditionalDependencies) @@ -122,8 +207,18 @@ - - + + true + true + + + true + true + + + true + true + diff --git a/Src/Setup/Setup.vcxproj.filters b/Src/Setup/Setup.vcxproj.filters index 613885939..00a2d7a1a 100644 --- a/Src/Setup/Setup.vcxproj.filters +++ b/Src/Setup/Setup.vcxproj.filters @@ -61,5 +61,6 @@ + \ No newline at end of file diff --git a/Src/Setup/Setup.wxs b/Src/Setup/Setup.wxs index cedf0723c..722936359 100644 --- a/Src/Setup/Setup.wxs +++ b/Src/Setup/Setup.wxs @@ -3,7 +3,7 @@ # This comment is generated by WixEdit, the specific commandline # arguments for the WiX Toolset are stored here. - candleArgs: "" -out ".wixobj" -ext WixUIExtension -ext WixUtilExtension -dx64=0 + candleArgs: "" -out ".wixobj" -ext WixUIExtension -ext WixUtilExtension -dx64=0 -dARM64=0 lightArgs: ".wixobj" -out ".msi" -ext WixUIExtension -ext WixUtilExtension -loc OpenShellText-en-US.wxl --> @@ -11,6 +11,11 @@ + + + + + @@ -22,7 +27,7 @@ - + not Msix64 VersionNT>=601 @@ -62,6 +67,9 @@ + + + @@ -74,6 +82,9 @@ + + + @@ -99,6 +110,9 @@ + + + IE_BUILD>=90000 @@ -442,6 +456,25 @@ + + + + + + + + + + + + + + + + + + + @@ -615,6 +648,11 @@ + + + + + diff --git a/Src/Setup/Utility/ManualUninstall.cpp b/Src/Setup/Utility/ManualUninstall.cpp index 6c0b0ad69..d71baaa1a 100644 --- a/Src/Setup/Utility/ManualUninstall.cpp +++ b/Src/Setup/Utility/ManualUninstall.cpp @@ -43,11 +43,14 @@ #define RemoveDirectory2(x) RemoveDirectory(x) #endif +typedef BOOL (WINAPI *FIsWow64Process2)( HANDLE hProcess, USHORT *pProcessMachine, USHORT *pNativeMachine ); + // files to delete from the Open-Shell folder static const wchar_t *g_InstalledFiles[]= { L"ClassicExplorer32.dll", L"ClassicExplorer64.dll", + L"ClassicExplorerARM64.dll", L"ClassicExplorerSettings.exe", L"ClassicIEDLL_32.dll", L"ClassicIEDLL_64.dll", @@ -951,6 +954,15 @@ static void ManualUninstallInternal( void ) } } + BOOL bArm64System=FALSE; + HMODULE hKernel32=GetModuleHandle(L"kernel32.dll"); + FIsWow64Process2 isWow64Process2=(FIsWow64Process2)GetProcAddress(hKernel32,"IsWow64Process2"); + if (isWow64Process2) + { + USHORT processMachine = 0, nativeMachine = 0; + isWow64Process2(GetCurrentProcess(), &processMachine, &nativeMachine); + bArm64System=nativeMachine==IMAGE_FILE_MACHINE_ARM64; + } BOOL bWow64=FALSE; bool bIsWow64=IsWow64Process(GetCurrentProcess(),&bWow64) && bWow64; @@ -1140,7 +1152,7 @@ static void ManualUninstallInternal( void ) { // 64-bit OS wchar_t path[_MAX_PATH]; - Sprintf(path,_countof(path),L"%s\\System32\\StartMenuHelper64.dll",winDir); + Sprintf(path,_countof(path),L"%s\\System32\\StartMenuHelper%s64.dll",winDir,bArm64System?L"ARM":L""); Wow64EnableWow64FsRedirection(FALSE); DeleteFileEx(path,true); Sprintf(path,_countof(path),L"%s\\SysWOW64\\StartMenuHelper32.dll",winDir); diff --git a/Src/Setup/Utility/Utility.cpp b/Src/Setup/Utility/Utility.cpp index de9b7a6d4..07e438cac 100644 --- a/Src/Setup/Utility/Utility.cpp +++ b/Src/Setup/Utility/Utility.cpp @@ -79,7 +79,7 @@ struct Chunk int start1, start2, len; }; -int CalcMsiChecksum( wchar_t *const *params, int count ) +int CalcMsiChecksum( wchar_t *const *params, int count, bool bArm64 ) { if (count<2) return 2; @@ -88,7 +88,10 @@ int CalcMsiChecksum( wchar_t *const *params, int count ) // load files wchar_t path1[_MAX_PATH]; std::vector buf1, buf2; - Sprintf(path1,_countof(path1),L"%s\\Setup32.msi",params[1]); + if (!bArm64) + Sprintf(path1,_countof(path1),L"%s\\Setup32.msi",params[1]); + else + Sprintf(path1,_countof(path1),L"%s\\SetupARM64.msi",params[1]); LoadFile(path1,buf1); if (buf1.empty()) { @@ -96,12 +99,15 @@ int CalcMsiChecksum( wchar_t *const *params, int count ) return 1; } wchar_t path2[_MAX_PATH]; - Sprintf(path2,_countof(path2),L"%s\\Setup64.msi",params[1]); - LoadFile(path2,buf2); - if (buf2.empty()) + if (!bArm64) { - Printf("Failed to open file %s\n",path2); - return 1; + Sprintf(path2,_countof(path2),L"%s\\Setup64.msi",params[1]); + LoadFile(path2,buf2); + if (buf2.empty()) + { + Printf("Failed to open file %s\n",path2); + return 1; + } } int len1=(int)buf1.size(); @@ -112,39 +118,42 @@ int CalcMsiChecksum( wchar_t *const *params, int count ) for (std::vector::iterator it=buf2.begin();it!=buf2.end();++it) *it^=0xFF; - // detect common blocks (assuming at least 256K in size and in the same order in both files) - const int BLOCK_SIZE=256*1024; + // detect x86/x64 common blocks (assuming at least 256K in size and in the same order in both files) std::vector chunks; - int start2=0; - for (int i=0;i0 && chunk.start2>0 && buf1[chunk.start1-1]==buf2[chunk.start2-1]) - { - chunk.start1--; - chunk.start2--; - chunk.len++; - } - while (chunk.start1+chunk.len0 && chunk.start2>0 && buf1[chunk.start1-1]==buf2[chunk.start2-1]) + { + chunk.start1--; + chunk.start2--; + chunk.len++; + } + while (chunk.start1+chunk.len // creates a file with checksum of both msi files +// crcmsi // creates a file with checksum of the x86 and x64 msi files +// crcarm64msi // creates a file with checksum of the ARM64 msi file // makeEN // extracts the localization resources and creates a sample en-US.DLL // extract // extracts the string table, the dialog text, and the L10N text from a DLL and stores it in a CSV // extract en-us.dll // extracts the string table, the dialog text, and the L10N text from two DLL and stores it in a CSV @@ -1158,7 +1169,12 @@ int WINAPI wWinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpstrC #ifndef _WIN64 if (_wcsicmp(params[0],L"crcmsi")==0) { - return CalcMsiChecksum(params,count); + return CalcMsiChecksum(params,count,false); + } + + if (_wcsicmp(params[0],L"crcarm64msi")==0) + { + return CalcMsiChecksum(params,count,true); } if (_wcsicmp(params[0],L"makeEN")==0) diff --git a/Src/Setup/Utility/Utility.vcxproj b/Src/Setup/Utility/Utility.vcxproj index c06b734fe..c1d1a671b 100644 --- a/Src/Setup/Utility/Utility.vcxproj +++ b/Src/Setup/Utility/Utility.vcxproj @@ -1,6 +1,10 @@ + + Debug + ARM64 + Debug Win32 @@ -9,6 +13,10 @@ Debug x64 + + Release + ARM64 + Release Win32 @@ -45,12 +53,25 @@ Unicode true + + Application + v142 + Static + Unicode + true + Application v142 Static Unicode + + Application + v142 + Static + Unicode + @@ -63,9 +84,15 @@ + + + + + + $(Configuration)\ @@ -77,6 +104,11 @@ $(Configuration)64\ true + + true + $(Configuration)ARM64\ + $(Configuration)ARM64\ + $(Configuration)\ $(Configuration)\ @@ -87,6 +119,11 @@ $(Configuration)64\ false + + false + $(Configuration)ARM64\ + $(Configuration)ARM64\ + Disabled @@ -128,6 +165,28 @@ Windows + + + Disabled + ..\..\Lib;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) + EnableFastChecks + MultiThreadedDebug + NotUsing + Level3 + ProgramDatabase + true + stdcpp17 + + + _UNICODE;UNICODE;_WIN64;%(PreprocessorDefinitions) + + + comctl32.lib;uxtheme.lib;dwmapi.lib;winmm.lib;htmlhelp.lib;psapi.lib;version.lib;Secur32.lib.;%(AdditionalDependencies) + true + Windows + + MaxSpeed @@ -175,6 +234,31 @@ true + + + MaxSpeed + true + ..\..\Lib;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) + MultiThreaded + true + NotUsing + Level3 + ProgramDatabase + true + stdcpp17 + + + _UNICODE;UNICODE;_WIN64;%(PreprocessorDefinitions) + + + comctl32.lib;uxtheme.lib;dwmapi.lib;winmm.lib;htmlhelp.lib;psapi.lib;version.lib;Secur32.lib.;%(AdditionalDependencies) + true + Windows + true + true + + @@ -191,6 +275,7 @@ true + true diff --git a/Src/Setup/__MakeFinal.bat b/Src/Setup/__MakeFinal.bat index 16bcdf1e4..f007b9c94 100644 --- a/Src/Setup/__MakeFinal.bat +++ b/Src/Setup/__MakeFinal.bat @@ -1,5 +1,12 @@ @echo off -set PATH=C:\Program Files\7-Zip\;C:\Program Files (x86)\HTML Help Workshop;C:\Program Files (x86)\WiX Toolset v3.11\bin\;%PATH% + +rem Default to x86/x64 unless we are building for ARM64 +set ARCH=%1 +if "%ARCH%"=="" set ARCH=x86_x64 + +rem WiX toolset 3.14 is required for ARM64 +set PATH=C:\Program Files\7-Zip;C:\Program Files (x86)\HTML Help Workshop;C:\Program Files (x86)\WiX Toolset v3.11\bin;%PATH% +if %ARCH%==ARM64 set PATH=C:\Program Files (x86)\WiX Toolset v3.14\bin;%PATH% cd %~dp0 diff --git a/Src/Setup/__MakeFinalARM64.bat b/Src/Setup/__MakeFinalARM64.bat new file mode 100644 index 000000000..e2bd17c3f --- /dev/null +++ b/Src/Setup/__MakeFinalARM64.bat @@ -0,0 +1,7 @@ +@echo off +cd %~dp0 + +call __MakeFinal.bat ARM64 +if ERRORLEVEL 1 exit /b 1 + +exit /b 0 diff --git a/Src/Setup/__MakeFinalAllLanguages.bat b/Src/Setup/__MakeFinalAllLanguages.bat index ad73e7a04..213e751bd 100644 --- a/Src/Setup/__MakeFinalAllLanguages.bat +++ b/Src/Setup/__MakeFinalAllLanguages.bat @@ -1,7 +1,13 @@ @echo off rem This file is to create all the files required for a new release to publish -set PATH=C:\Program Files\7-Zip\;C:\Program Files (x86)\HTML Help Workshop;C:\Program Files (x86)\WiX Toolset v3.11\bin\;%PATH% +rem Default to x86/x64 unless we are building for ARM64 +set ARCH=%1 +if "%ARCH%"=="" set ARCH=x86_x64 + +rem WiX toolset 3.14 is required for ARM64 +set PATH=C:\Program Files\7-Zip;C:\Program Files (x86)\HTML Help Workshop;C:\Program Files (x86)\WiX Toolset v3.11\bin;%PATH% +if %ARCH%==ARM64 set PATH=C:\Program Files (x86)\WiX Toolset v3.14\bin;%PATH% cd %~dp0 diff --git a/Src/Setup/__MakeFinalAllLanguagesARM64.bat b/Src/Setup/__MakeFinalAllLanguagesARM64.bat new file mode 100644 index 000000000..472c4c778 --- /dev/null +++ b/Src/Setup/__MakeFinalAllLanguagesARM64.bat @@ -0,0 +1,7 @@ +@echo off +cd %~dp0 + +call __MakeFinalAllLanguages.bat ARM64 +if ERRORLEVEL 1 exit /b 1 + +exit /b 0 diff --git a/Src/Setup/resource.h b/Src/Setup/resource.h index 85076b8d8..e77b7a46d 100644 --- a/Src/Setup/resource.h +++ b/Src/Setup/resource.h @@ -8,6 +8,7 @@ #define IDS_ERR_CORRUPTED 102 #define IDR_MSI_FILE32 132 #define IDR_MSI_FILE64 164 +#define IDR_MSI_FILEARM64 165 #define IDS_ERR_INTERNAL 166 #define IDS_ERR_EXTRACT 167 #define IDR_MSI_CHECKSUM 167 diff --git a/Src/StartMenu/StartMenu.cpp b/Src/StartMenu/StartMenu.cpp index 94cfef449..79aa16341 100644 --- a/Src/StartMenu/StartMenu.cpp +++ b/Src/StartMenu/StartMenu.cpp @@ -296,8 +296,10 @@ bool WasOsUpgrade() // UAC dialog is shown to ensure it will run with administrator privileges void RunOsUpgradeTaskAsAdmin() { -#ifdef _WIN64 +#if defined(_M_AMD64) wchar_t path[_MAX_PATH] = L"%windir%\\System32\\StartMenuHelper64.dll"; +#elif defined(_M_ARM64) + wchar_t path[_MAX_PATH] = L"%windir%\\System32\\StartMenuHelperARM64.dll"; #else wchar_t path[_MAX_PATH] = L"%windir%\\System32\\StartMenuHelper32.dll"; #endif @@ -321,8 +323,10 @@ DWORD PerformOsUpgradeTask(bool silent) regKey.SetDWORDValue(L"WinVersion", g_winVer); // run regsvr32 StartMenuHelper -#ifdef _WIN64 +#if defined(_M_AMD64) wchar_t cmdLine[_MAX_PATH] = L"regsvr32 /s \"%windir%\\System32\\StartMenuHelper64.dll\""; +#elif defined(_M_ARM64) + wchar_t cmdLine[_MAX_PATH] = L"regsvr32 /s \"%windir%\\System32\\StartMenuHelperARM64.dll\""; #else wchar_t cmdLine[_MAX_PATH] = L"regsvr32 /s \"%windir%\\System32\\StartMenuHelper32.dll\""; #endif diff --git a/Src/StartMenu/StartMenu.vcxproj b/Src/StartMenu/StartMenu.vcxproj index fa4f31e73..c9750245e 100644 --- a/Src/StartMenu/StartMenu.vcxproj +++ b/Src/StartMenu/StartMenu.vcxproj @@ -1,6 +1,10 @@ + + Debug + ARM64 + Debug Win32 @@ -9,6 +13,10 @@ Debug x64 + + Release + ARM64 + Release Win32 @@ -17,6 +25,10 @@ Release x64 + + Setup + ARM64 + Setup Win32 @@ -60,6 +72,13 @@ Unicode true + + Application + v142 + Static + Unicode + true + Application v142 @@ -67,12 +86,25 @@ Unicode true + + Application + v142 + Static + Unicode + true + Application v142 Static Unicode + + Application + v142 + Static + Unicode + @@ -92,14 +124,26 @@ + + + + + + + + + + + + $(Configuration)\ @@ -111,6 +155,11 @@ $(Configuration)64\ true + + true + $(Configuration)ARM64\ + $(Configuration)ARM64\ + $(Configuration)\ $(Configuration)\ @@ -121,6 +170,11 @@ $(Configuration)64\ false + + false + $(Configuration)ARM64\ + $(Configuration)ARM64\ + $(Configuration)\ $(Configuration)\ @@ -131,6 +185,11 @@ $(Configuration)64\ false + + false + $(Configuration)ARM64\ + $(Configuration)ARM64\ + Disabled @@ -175,6 +234,28 @@ Windows + + + Disabled + ..\Lib;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) + EnableFastChecks + MultiThreadedDebug + Use + Level3 + ProgramDatabase + true + true + stdcpp17 + + + _DEBUG;%(PreprocessorDefinitions) + + + true + Windows + + MaxSpeed @@ -223,6 +304,30 @@ true + + + MaxSpeed + ..\Lib;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) + MultiThreaded + true + Use + Level3 + ProgramDatabase + true + true + stdcpp17 + + + NDEBUG;%(PreprocessorDefinitions) + + + true + Windows + true + true + + MaxSpeed @@ -273,6 +378,31 @@ true + + + MaxSpeed + ..\Lib;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_WINDOWS;BUILD_SETUP;%(PreprocessorDefinitions) + MultiThreaded + true + Use + Level3 + true + ProgramDatabase + true + true + stdcpp17 + + + NDEBUG;%(PreprocessorDefinitions) + + + true + Windows + true + true + + diff --git a/Src/StartMenu/StartMenuDLL/StartMenuDLL.vcxproj b/Src/StartMenu/StartMenuDLL/StartMenuDLL.vcxproj index 5777b91ae..09ae30b7d 100644 --- a/Src/StartMenu/StartMenuDLL/StartMenuDLL.vcxproj +++ b/Src/StartMenu/StartMenuDLL/StartMenuDLL.vcxproj @@ -1,6 +1,10 @@ + + Debug + ARM64 + Debug Win32 @@ -9,6 +13,10 @@ Debug x64 + + Release + ARM64 + Release Win32 @@ -17,6 +25,10 @@ Release x64 + + Setup + ARM64 + Setup Win32 @@ -60,6 +72,13 @@ Unicode true + + DynamicLibrary + v142 + Static + Unicode + true + DynamicLibrary v142 @@ -67,12 +86,25 @@ Unicode true + + DynamicLibrary + v142 + Static + Unicode + true + DynamicLibrary v142 Static Unicode + + DynamicLibrary + v142 + Static + Unicode + @@ -92,14 +124,26 @@ + + + + + + + + + + + + ..\$(Configuration)\ @@ -111,6 +155,11 @@ $(Configuration)64\ true + + true + $(Configuration)ARM64\ + ..\$(Configuration)ARM64\ + ..\$(Configuration)\ $(Configuration)\ @@ -121,6 +170,11 @@ $(Configuration)64\ false + + false + $(Configuration)ARM64\ + ..\$(Configuration)ARM64\ + ..\$(Configuration)\ $(Configuration)\ @@ -131,6 +185,11 @@ $(Configuration)64\ false + + false + $(Configuration)ARM64\ + ..\$(Configuration)ARM64\ + Disabled @@ -179,6 +238,30 @@ Windows + + + Disabled + ..\..\Lib;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_WINDOWS;_USRDLL;CLASSICSTARTMENUDLL_EXPORTS;%(PreprocessorDefinitions) + EnableFastChecks + MultiThreadedDebug + Use + Level3 + ProgramDatabase + true + true + stdcpp17 + + + _DEBUG;%(PreprocessorDefinitions) + $(IntDir);..\..\Lib;%(AdditionalIncludeDirectories) + + + comctl32.lib;uxtheme.lib;WtsApi32.lib;Secur32.lib;Msimg32.lib;Netapi32.lib;dwmapi.lib;PowrProf.lib;Oleacc.lib;winmm.lib;htmlhelp.lib;wininet.lib;structuredquery.lib;Propsys.lib;wintrust.lib;crypt32.lib;%(AdditionalDependencies) + true + Windows + + MaxSpeed @@ -231,6 +314,32 @@ true + + + MaxSpeed + ..\..\Lib;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_WINDOWS;_USRDLL;CLASSICSTARTMENUDLL_EXPORTS;%(PreprocessorDefinitions) + MultiThreaded + true + Use + Level3 + ProgramDatabase + true + true + stdcpp17 + + + NDEBUG;%(PreprocessorDefinitions) + $(IntDir);..\..\Lib;%(AdditionalIncludeDirectories) + + + comctl32.lib;uxtheme.lib;WtsApi32.lib;Secur32.lib;Msimg32.lib;Netapi32.lib;dwmapi.lib;PowrProf.lib;Oleacc.lib;winmm.lib;htmlhelp.lib;wininet.lib;structuredquery.lib;Propsys.lib;wintrust.lib;crypt32.lib;%(AdditionalDependencies) + true + Windows + true + true + + MaxSpeed @@ -285,6 +394,33 @@ true + + + MaxSpeed + ..\..\Lib;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_WINDOWS;_USRDLL;CLASSICSTARTMENUDLL_EXPORTS;BUILD_SETUP;%(PreprocessorDefinitions) + MultiThreaded + true + Use + Level3 + true + ProgramDatabase + true + true + stdcpp17 + + + NDEBUG;%(PreprocessorDefinitions) + $(IntDir);..\..\Lib;%(AdditionalIncludeDirectories) + + + comctl32.lib;uxtheme.lib;WtsApi32.lib;Secur32.lib;Msimg32.lib;Netapi32.lib;dwmapi.lib;PowrProf.lib;Oleacc.lib;winmm.lib;htmlhelp.lib;wininet.lib;structuredquery.lib;Propsys.lib;wintrust.lib;crypt32.lib;%(AdditionalDependencies) + true + Windows + true + true + + diff --git a/Src/StartMenu/StartMenuHelper/StartMenuHelper.vcxproj b/Src/StartMenu/StartMenuHelper/StartMenuHelper.vcxproj index 5e9cd3144..eb24be18f 100644 --- a/Src/StartMenu/StartMenuHelper/StartMenuHelper.vcxproj +++ b/Src/StartMenu/StartMenuHelper/StartMenuHelper.vcxproj @@ -1,6 +1,10 @@ + + Debug + ARM64 + Debug Win32 @@ -9,6 +13,10 @@ Debug x64 + + Release + ARM64 + Release Win32 @@ -17,6 +25,10 @@ Release x64 + + Setup + ARM64 + Setup Win32 @@ -60,6 +72,13 @@ Unicode true + + DynamicLibrary + v142 + Static + Unicode + true + DynamicLibrary v142 @@ -67,12 +86,25 @@ Unicode true + + DynamicLibrary + v142 + Static + Unicode + true + DynamicLibrary v142 Static Unicode + + DynamicLibrary + v142 + Static + Unicode + @@ -92,14 +124,26 @@ + + + + + + + + + + + + $(Configuration)\ @@ -115,6 +159,13 @@ true $(ProjectName)64 + + true + true + $(ProjectName)ARM64 + $(Configuration)ARM64\ + $(Configuration)ARM64\ + $(Configuration)\ $(Configuration)\ @@ -129,6 +180,13 @@ false $(ProjectName)64 + + true + false + $(ProjectName)ARM64 + $(Configuration)ARM64\ + $(Configuration)ARM64\ + $(Configuration)\ $(Configuration)\ @@ -143,6 +201,13 @@ false $(ProjectName)64 + + true + false + $(ProjectName)ARM64 + $(Configuration)ARM64\ + $(Configuration)ARM64\ + _DEBUG;%(PreprocessorDefinitions) @@ -214,6 +279,41 @@ true + + + _DEBUG;%(PreprocessorDefinitions) + false + true + StartMenuHelper_i.h + StartMenuHelper_i.c + StartMenuHelper_p.c + + + Disabled + ..\..\Lib;%(AdditionalIncludeDirectories) + WIN32;_WINDOWS;_DEBUG;_USRDLL;%(PreprocessorDefinitions) + EnableFastChecks + MultiThreadedDebug + Use + Level3 + ProgramDatabase + true + true + stdcpp17 + + + _DEBUG;%(PreprocessorDefinitions) + $(IntDir);%(AdditionalIncludeDirectories) + + + true + comctl32.lib;uxtheme.lib;winmm.lib;htmlhelp.lib;wininet.lib;version.lib;%(AdditionalDependencies) + .\$(TargetName).def + true + Windows + true + + NDEBUG;%(PreprocessorDefinitions) @@ -287,6 +387,42 @@ true + + + NDEBUG;%(PreprocessorDefinitions) + false + true + StartMenuHelper_i.h + StartMenuHelper_i.c + StartMenuHelper_p.c + + + MaxSpeed + ..\..\Lib;%(AdditionalIncludeDirectories) + WIN32;_WINDOWS;NDEBUG;_USRDLL;%(PreprocessorDefinitions) + MultiThreaded + Use + Level3 + ProgramDatabase + true + true + stdcpp17 + + + NDEBUG;%(PreprocessorDefinitions) + $(IntDir);%(AdditionalIncludeDirectories) + + + true + comctl32.lib;uxtheme.lib;winmm.lib;htmlhelp.lib;wininet.lib;version.lib;%(AdditionalDependencies) + .\$(TargetName).def + true + Windows + true + true + true + + NDEBUG;%(PreprocessorDefinitions) @@ -356,6 +492,40 @@ true + + + NDEBUG;%(PreprocessorDefinitions) + false + true + StartMenuHelper_i.h + StartMenuHelper_i.c + StartMenuHelper_p.c + + + MaxSpeed + ..\..\Lib;%(AdditionalIncludeDirectories) + WIN32;_WINDOWS;NDEBUG;_USRDLL;BUILD_SETUP;%(PreprocessorDefinitions) + MultiThreaded + Use + Level3 + ProgramDatabase + true + true + stdcpp17 + + + NDEBUG;%(PreprocessorDefinitions) + $(IntDir);%(AdditionalIncludeDirectories) + + + comctl32.lib;uxtheme.lib;winmm.lib;htmlhelp.lib;wininet.lib;version.lib;%(AdditionalDependencies) + .\$(TargetName).def + true + Windows + true + true + + @@ -380,6 +550,7 @@ + diff --git a/Src/StartMenu/StartMenuHelper/StartMenuHelperARM64.def b/Src/StartMenu/StartMenuHelper/StartMenuHelperARM64.def new file mode 100644 index 000000000..2dd1d38ff --- /dev/null +++ b/Src/StartMenu/StartMenuHelper/StartMenuHelperARM64.def @@ -0,0 +1,10 @@ +; StartMenuHelper.def : Declares the module parameters. + +LIBRARY "StartMenuHelperARM64.DLL" + +EXPORTS + DllCanUnloadNow PRIVATE + DllGetClassObject PRIVATE + DllRegisterServer PRIVATE + DllUnregisterServer PRIVATE + DllInstall PRIVATE