Add ARM64 support (#641)

* Add ARM64 build configurations to projects

* StartMenu: add ARM64 support

* Add support for IAT hooking on ARM64

* Add ARM64 support to Classic IE

* Add ARM64 support to installer

NB: WiX 3.14.0.3910 or higher is required to create the MSI

* Revert whitespace change

* Separate x86/x64 and ARM64 installers

* Change suffix of ARM64 binaries

* Put also ARM64 MSI to final installer

* Fix sln

* Build some DLLs as ARM64X

These are meant to be loaded to both x64 and ARM64 processes.
We will compile them as ARM64X (when building for ARM64).
That way they will contain both x64 and ARM64 code paths.

https://learn.microsoft.com/en-us/windows/arm/arm64x-pe

* Make sure x64 installer cannot be installed on ARM64

In case if somebody manually tries to install x64 MSI on ARM64.
This is not supported/working scenario.

---------

Co-authored-by: ge0rdi <ge0rdi@users.noreply.github.com>
This commit is contained in:
Matthijs Lavrijsen
2025-05-08 10:14:56 +02:00
committed by GitHub
parent 146c27ecd2
commit 58b909037f
25 changed files with 636 additions and 48 deletions

3
.gitignore vendored
View File

@@ -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/

View File

@@ -1,6 +1,14 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|ARM64">
<Configuration>Debug</Configuration>
<Platform>ARM64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Debug|ARM64EC">
<Configuration>Debug</Configuration>
<Platform>ARM64EC</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Debug|Win32">
<Configuration>Debug</Configuration>
<Platform>Win32</Platform>
@@ -9,6 +17,14 @@
<Configuration>Debug</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|ARM64">
<Configuration>Release</Configuration>
<Platform>ARM64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|ARM64EC">
<Configuration>Release</Configuration>
<Platform>ARM64EC</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|Win32">
<Configuration>Release</Configuration>
<Platform>Win32</Platform>
@@ -17,6 +33,14 @@
<Configuration>Release</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Setup|ARM64">
<Configuration>Setup</Configuration>
<Platform>ARM64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Setup|ARM64EC">
<Configuration>Setup</Configuration>
<Platform>ARM64EC</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Setup|Win32">
<Configuration>Setup</Configuration>
<Platform>Win32</Platform>
@@ -53,6 +77,13 @@
<PropertyGroup Condition="'$(Platform)'=='x64'">
<TargetName>$(ProjectName)64</TargetName>
</PropertyGroup>
<PropertyGroup Condition="'$(Platform)'=='ARM64EC'">
<TargetName>$(ProjectName)64</TargetName>
</PropertyGroup>
<PropertyGroup Condition="'$(Platform)'=='ARM64'">
<TargetName>$(ProjectName)64</TargetName>
<BuildAsX>true</BuildAsX>
</PropertyGroup>
<PropertyGroup>
<IgnoreImportLibrary>true</IgnoreImportLibrary>
</PropertyGroup>

View File

@@ -146,4 +146,4 @@
<Filter>Resource Files</Filter>
</Image>
</ItemGroup>
</Project>
</Project>

View File

@@ -1,6 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|ARM64">
<Configuration>Debug</Configuration>
<Platform>ARM64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Debug|Win32">
<Configuration>Debug</Configuration>
<Platform>Win32</Platform>
@@ -9,6 +13,10 @@
<Configuration>Debug</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|ARM64">
<Configuration>Release</Configuration>
<Platform>ARM64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|Win32">
<Configuration>Release</Configuration>
<Platform>Win32</Platform>
@@ -17,6 +25,10 @@
<Configuration>Release</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Setup|ARM64">
<Configuration>Setup</Configuration>
<Platform>ARM64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Setup|Win32">
<Configuration>Setup</Configuration>
<Platform>Win32</Platform>
@@ -53,6 +65,9 @@
<PropertyGroup Condition="'$(Platform)'=='x64'">
<TargetName>$(ProjectName)_64</TargetName>
</PropertyGroup>
<PropertyGroup Condition="'$(Platform)'=='ARM64'">
<TargetName>$(ProjectName)_64</TargetName>
</PropertyGroup>
<ItemDefinitionGroup>
<ClCompile>
<PrecompiledHeader>NotUsing</PrecompiledHeader>

View File

@@ -1,6 +1,14 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|ARM64">
<Configuration>Debug</Configuration>
<Platform>ARM64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Debug|ARM64EC">
<Configuration>Debug</Configuration>
<Platform>ARM64EC</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Debug|Win32">
<Configuration>Debug</Configuration>
<Platform>Win32</Platform>
@@ -9,6 +17,14 @@
<Configuration>Debug</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|ARM64">
<Configuration>Release</Configuration>
<Platform>ARM64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|ARM64EC">
<Configuration>Release</Configuration>
<Platform>ARM64EC</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|Win32">
<Configuration>Release</Configuration>
<Platform>Win32</Platform>
@@ -17,6 +33,14 @@
<Configuration>Release</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Setup|ARM64">
<Configuration>Setup</Configuration>
<Platform>ARM64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Setup|ARM64EC">
<Configuration>Setup</Configuration>
<Platform>ARM64EC</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Setup|Win32">
<Configuration>Setup</Configuration>
<Platform>Win32</Platform>
@@ -53,6 +77,13 @@
<PropertyGroup Condition="'$(Platform)'=='x64'">
<TargetName>$(ProjectName)_64</TargetName>
</PropertyGroup>
<PropertyGroup Condition="'$(Platform)'=='ARM64EC'">
<TargetName>$(ProjectName)_64</TargetName>
</PropertyGroup>
<PropertyGroup Condition="'$(Platform)'=='ARM64'">
<TargetName>$(ProjectName)_64</TargetName>
<BuildAsX>true</BuildAsX>
</PropertyGroup>
<ItemDefinitionGroup>
<ClCompile>
<PreprocessorDefinitions>_USRDLL;CLASSICIEDLL_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>

View File

@@ -98,4 +98,4 @@
<Filter>Resource Files</Filter>
</Image>
</ItemGroup>
</Project>
</Project>

View File

@@ -16,6 +16,14 @@
<OutDir>$(MSBuildThisFileDirectory)..\build\bin\$(Configuration)64\</OutDir>
<IntDir>$(MSBuildThisFileDirectory)..\build\obj\$(ProjectName)\$(Configuration)64\</IntDir>
</PropertyGroup>
<PropertyGroup Condition="'$(Platform)'=='ARM64'">
<OutDir>$(MSBuildThisFileDirectory)..\build\bin\$(Configuration)ARM64\</OutDir>
<IntDir>$(MSBuildThisFileDirectory)..\build\obj\$(ProjectName)\$(Configuration)ARM64\</IntDir>
</PropertyGroup>
<PropertyGroup Condition="'$(Platform)'=='ARM64EC'">
<OutDir>$(MSBuildThisFileDirectory)..\build\bin\$(Configuration)ARM64EC\</OutDir>
<IntDir>$(MSBuildThisFileDirectory)..\build\obj\$(ProjectName)\$(Configuration)ARM64EC\</IntDir>
</PropertyGroup>
<!-- Common settings for all configurations -->
<ItemDefinitionGroup>

View File

@@ -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;

View File

@@ -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 <address>, 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

View File

@@ -1,6 +1,14 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|ARM64">
<Configuration>Debug</Configuration>
<Platform>ARM64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Debug|ARM64EC">
<Configuration>Debug</Configuration>
<Platform>ARM64EC</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Debug|Win32">
<Configuration>Debug</Configuration>
<Platform>Win32</Platform>
@@ -9,6 +17,14 @@
<Configuration>Debug</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|ARM64">
<Configuration>Release</Configuration>
<Platform>ARM64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|ARM64EC">
<Configuration>Release</Configuration>
<Platform>ARM64EC</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|Win32">
<Configuration>Release</Configuration>
<Platform>Win32</Platform>
@@ -42,6 +58,9 @@
<PropertyGroup>
<OutDir>$(IntDir)</OutDir>
</PropertyGroup>
<PropertyGroup Condition="'$(Platform)'=='ARM64'">
<BuildAsX>true</BuildAsX>
</PropertyGroup>
<ItemDefinitionGroup>
<ClCompile>
<PreprocessorDefinitions>_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>

View File

@@ -1,6 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<WixLocalization Culture="en-US" Codepage="1252" xmlns="http://schemas.microsoft.com/wix/2006/localization">
<String Id="Error32bit" Overridable="yes">This installer is only for 32-bit version of Windows. For 64-bit Windows you need to run Setup64.</String>
<String Id="Error64bit" Overridable="yes">This installer is only for 64-bit version of Windows. For ARM64 Windows you need to run SetupARM64.</String>
<String Id="ErrorWin7" Overridable="yes">Open-Shell requires Windows 7 or above.</String>
<String Id="ErrorNewVersion" Overridable="yes">A newer version of [ProductName] is already installed. The setup will now exit.</String>
<String Id="ExplorerTitle" Overridable="yes">Classic Explorer</String>

View File

@@ -72,337 +72,498 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Immersive7", "Skins\Immersi
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
{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
{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
{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|Win32
{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
{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
{BD28B058-230E-42DF-9FB1-FFBB0153F498}.Debug|ARM64.ActiveCfg = Resource|Win32
{BD28B058-230E-42DF-9FB1-FFBB0153F498}.Debug|ARM64.Build.0 = Resource|Win32
{BD28B058-230E-42DF-9FB1-FFBB0153F498}.Debug|Win32.ActiveCfg = Resource|Win32
{BD28B058-230E-42DF-9FB1-FFBB0153F498}.Debug|Win32.Build.0 = Resource|Win32
{BD28B058-230E-42DF-9FB1-FFBB0153F498}.Debug|x64.ActiveCfg = Resource|Win32
{BD28B058-230E-42DF-9FB1-FFBB0153F498}.Debug|x64.Build.0 = Resource|Win32
{BD28B058-230E-42DF-9FB1-FFBB0153F498}.Release|ARM64.ActiveCfg = Resource|Win32
{BD28B058-230E-42DF-9FB1-FFBB0153F498}.Release|ARM64.Build.0 = Resource|Win32
{BD28B058-230E-42DF-9FB1-FFBB0153F498}.Release|Win32.ActiveCfg = Resource|Win32
{BD28B058-230E-42DF-9FB1-FFBB0153F498}.Release|Win32.Build.0 = Resource|Win32
{BD28B058-230E-42DF-9FB1-FFBB0153F498}.Release|x64.ActiveCfg = Resource|Win32
{BD28B058-230E-42DF-9FB1-FFBB0153F498}.Release|x64.Build.0 = Resource|Win32
{BD28B058-230E-42DF-9FB1-FFBB0153F498}.Setup|ARM64.ActiveCfg = Resource|Win32
{BD28B058-230E-42DF-9FB1-FFBB0153F498}.Setup|ARM64.Build.0 = Resource|Win32
{BD28B058-230E-42DF-9FB1-FFBB0153F498}.Setup|Win32.ActiveCfg = Resource|Win32
{BD28B058-230E-42DF-9FB1-FFBB0153F498}.Setup|Win32.Build.0 = Resource|Win32
{BD28B058-230E-42DF-9FB1-FFBB0153F498}.Setup|x64.ActiveCfg = Resource|Win32
{BD28B058-230E-42DF-9FB1-FFBB0153F498}.Setup|x64.Build.0 = Resource|Win32
{75809D15-8403-420A-BBE6-05F478D88D8E}.Debug|ARM64.ActiveCfg = Resource|Win32
{75809D15-8403-420A-BBE6-05F478D88D8E}.Debug|ARM64.Build.0 = Resource|Win32
{75809D15-8403-420A-BBE6-05F478D88D8E}.Debug|Win32.ActiveCfg = Resource|Win32
{75809D15-8403-420A-BBE6-05F478D88D8E}.Debug|Win32.Build.0 = Resource|Win32
{75809D15-8403-420A-BBE6-05F478D88D8E}.Debug|x64.ActiveCfg = Resource|Win32
{75809D15-8403-420A-BBE6-05F478D88D8E}.Debug|x64.Build.0 = Resource|Win32
{75809D15-8403-420A-BBE6-05F478D88D8E}.Release|ARM64.ActiveCfg = Resource|Win32
{75809D15-8403-420A-BBE6-05F478D88D8E}.Release|ARM64.Build.0 = Resource|Win32
{75809D15-8403-420A-BBE6-05F478D88D8E}.Release|Win32.ActiveCfg = Resource|Win32
{75809D15-8403-420A-BBE6-05F478D88D8E}.Release|Win32.Build.0 = Resource|Win32
{75809D15-8403-420A-BBE6-05F478D88D8E}.Release|x64.ActiveCfg = Resource|Win32
{75809D15-8403-420A-BBE6-05F478D88D8E}.Release|x64.Build.0 = Resource|Win32
{75809D15-8403-420A-BBE6-05F478D88D8E}.Setup|ARM64.ActiveCfg = Resource|Win32
{75809D15-8403-420A-BBE6-05F478D88D8E}.Setup|ARM64.Build.0 = Resource|Win32
{75809D15-8403-420A-BBE6-05F478D88D8E}.Setup|Win32.ActiveCfg = Resource|Win32
{75809D15-8403-420A-BBE6-05F478D88D8E}.Setup|Win32.Build.0 = Resource|Win32
{75809D15-8403-420A-BBE6-05F478D88D8E}.Setup|x64.ActiveCfg = Resource|Win32

View File

@@ -1,6 +1,7 @@
if exist Output rd /Q /S Output
md Output
md Output\x64
md Output\ARM64
echo -- Compiling
@@ -9,13 +10,18 @@ for /f "usebackq tokens=*" %%i in (`"%ProgramFiles(x86)%\Microsoft Visual Studio
REM Restore NuGet packages
"%MSBuildDir%MSBuild.exe" ..\OpenShell.sln /m /t:Restore -p:RestorePackagesConfig=true /verbosity:quiet /nologo
REM ********* Build 64-bit solution
echo --- 64bit
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 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
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
@@ -45,6 +51,13 @@ copy /B ..\..\build\bin\Release\Update.exe Output > nul
copy /B ..\..\build\bin\Release\DesktopToasts.dll Output > nul
copy /B ..\..\build\bin\Release\SetupHelper.exe Output > nul
copy /B ..\..\build\bin\SetupARM64\ClassicExplorer64.dll Output\ARM64 > nul
copy /B ..\..\build\bin\SetupARM64\ClassicIEDLL_64.dll Output\ARM64 > nul
copy /B ..\..\build\bin\SetupARM64\ClassicIE_64.exe Output\ARM64 > nul
copy /B ..\..\build\bin\SetupARM64\StartMenu.exe Output\ARM64 > nul
copy /B ..\..\build\bin\SetupARM64\StartMenuDLL.dll Output\ARM64 > nul
copy /B ..\..\build\bin\SetupARM64\StartMenuHelper64.dll Output\ARM64 > nul
copy /B ..\..\build\bin\Setup64\ClassicExplorer64.dll Output\x64 > nul
copy /B ..\..\build\bin\Setup64\ClassicIEDLL_64.dll Output\x64 > nul
copy /B ..\..\build\bin\Setup64\ClassicIE_64.exe Output\x64 > nul
@@ -73,6 +86,7 @@ copy /B "..\..\build\bin\Skins\Immersive.skin7" Output > nul
REM ********* Collect debug info
md Output\PDB32
md Output\PDB64
md Output\PDBARM64
REM Explorer 32
copy /B ..\..\build\bin\Setup\ClassicExplorer32.pdb Output\PDB32 > nul
@@ -84,6 +98,10 @@ REM Explorer 64
copy /B ..\..\build\bin\Setup64\ClassicExplorer64.pdb Output\PDB64 > nul
copy /B Output\x64\ClassicExplorer64.dll Output\PDB64 > nul
REM Explorer ARM64
copy /B ..\..\build\bin\SetupARM64\ClassicExplorer64.pdb Output\PDBARM64 > nul
copy /B Output\ARM64\ClassicExplorer64.dll Output\PDBARM64 > nul
REM IE 32
copy /B ..\..\build\bin\Setup\ClassicIEDLL_32.pdb Output\PDB32 > nul
copy /B Output\ClassicIEDLL_32.dll Output\PDB32 > nul
@@ -96,6 +114,12 @@ copy /B Output\x64\ClassicIEDLL_64.dll Output\PDB64 > nul
copy /B ..\..\build\bin\Setup64\ClassicIE_64.pdb Output\PDB64 > nul
copy /B Output\x64\ClassicIE_64.exe Output\PDB64 > nul
REM IE ARM64
copy /B ..\..\build\bin\SetupARM64\ClassicIEDLL_64.pdb Output\PDBARM64 > nul
copy /B Output\ARM64\ClassicIEDLL_64.dll Output\PDBARM64 > nul
copy /B ..\..\build\bin\SetupARM64\ClassicIE_64.pdb Output\PDBARM64 > nul
copy /B Output\ARM64\ClassicIE_64.exe Output\PDBARM64 > nul
REM Menu 32
copy /B ..\..\build\bin\Setup\StartMenu.pdb Output\PDB32 > nul
copy /B Output\StartMenu.exe Output\PDB32 > nul
@@ -116,6 +140,13 @@ copy /B Output\x64\StartMenuDLL.dll Output\PDB64 > nul
copy /B ..\..\build\bin\Setup64\StartMenuHelper64.pdb Output\PDB64 > nul
copy /B Output\x64\StartMenuHelper64.dll Output\PDB64 > nul
REM Menu ARM64
copy /B ..\..\build\bin\SetupARM64\StartMenu.pdb Output\PDBARM64 > nul
copy /B Output\ARM64\StartMenu.exe Output\PDBARM64 > nul
copy /B ..\..\build\bin\SetupARM64\StartMenuDLL.pdb Output\PDBARM64 > nul
copy /B Output\ARM64\StartMenuDLL.dll Output\PDBARM64 > nul
copy /B ..\..\build\bin\SetupARM64\StartMenuHelper64.pdb Output\PDBARM64 > nul
copy /B Output\ARM64\StartMenuHelper64.dll Output\PDBARM64 > nul
REM ********* Source Index PDBs
@@ -140,6 +171,14 @@ if exist %PDBSTR_PATH% (
exit /b 1
)
)
for %%f in (Output\PDBARM64\*.pdb) do (
%PDBSTR_PATH% -w -p:%%f -s:srcsrv -i:Output\pdbstr.txt
if not ERRORLEVEL 0 (
echo Error adding source index to PDB
exit /b 1
)
)
)
REM ********* Prepare symbols
@@ -148,11 +187,13 @@ set SYMSTORE_PATH="C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\symstore
%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\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\PDBARM64
REM ********* Build ADMX
echo --- ADMX

View File

@@ -36,9 +36,9 @@ 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%
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
@@ -46,10 +46,9 @@ candle Setup.wxs -nologo -out Temp\Setup32.wixobj -ext WixUIExtension -ext WixUt
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%
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
@@ -57,6 +56,15 @@ candle Setup.wxs -nologo -out Temp\Setup64.wixobj -ext WixUIExtension -ext WixUt
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 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
REM ********* Build MSI Checksums
echo --- MSI Checksums

View File

@@ -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, x64 and 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,13 +81,21 @@ 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-1];
const Chunk *pChunks=NULL;
int chunkCount=0;
if (b64)
if (extractType==x64)
{
chunkCount=((unsigned int*)pRes)[2];
pChunks=(Chunk*)((unsigned int*)pRes+3);
chunkCount=((unsigned int*)pRes)[3];
pChunks=(Chunk*)((unsigned int*)pRes+4);
}
if (extractType==ARM64)
{
int x64chunkCount=((unsigned int*)pRes)[3];
const Chunk *px64Chunks=(Chunk*)((unsigned int*)pRes+4);
chunkCount=((unsigned int*)(px64Chunks+x64chunkCount))[0];
pChunks = (Chunk*)((unsigned int*)(px64Chunks+x64chunkCount)+1);
}
// extract the installer
@@ -99,11 +118,11 @@ static int ExtractMsi( HINSTANCE hInstance, const wchar_t *msiName, bool b64, bo
}
return ERR_MSIRES_NOTFOUND;
}
const unsigned char *pRes64=NULL;
const unsigned char *pRes64=NULL, *pResArm64=NULL;
int size32=SizeofResource(hInstance,hResInfo);
unsigned int hash;
int size64=0;
if (b64)
int size64=0, sizeArm64=0;
if (extractType==x64)
{
HRSRC hResInfo=FindResource(hInstance,MAKEINTRESOURCE(IDR_MSI_FILE64),L"MSI_FILE");
if (hResInfo)
@@ -140,6 +159,43 @@ static int ExtractMsi( HINSTANCE hInstance, const wchar_t *msiName, bool b64, bo
if (pos<size64)
hash=CalcFNVHash(pRes64+pos,size64-pos,hash);
}
else if (extractType==ARM64)
{
HRSRC hResInfo=FindResource(hInstance,MAKEINTRESOURCE(IDR_MSI_FILEARM64),L"MSI_FILE");
if (hResInfo)
{
HGLOBAL hRes=LoadResource(hInstance,hResInfo);
pResArm64=(unsigned char*)LockResource(hRes);
}
if (!pResArm64)
{
if (!bQuiet)
{
wchar_t strTitle[256];
if (!LoadString(hInstance,IDS_APP_TITLE,strTitle,_countof(strTitle))) strTitle[0]=0;
wchar_t strText[256];
if (!LoadString(hInstance,IDS_ERR_INTERNAL,strText,_countof(strText))) strText[0]=0;
MessageBox(NULL,strText,strTitle,MB_OK|MB_ICONERROR);
}
return ERR_MSIRES_NOTFOUND;
}
sizeArm64=SizeofResource(hInstance,hResInfo);
hash=FNV_HASH0;
int start=0;
int pos=0;
for (int i=0;i<chunkCount;i++)
{
const Chunk& chunk = pChunks[i];
if (start<chunk.start2)
hash=CalcFNVHash(pResArm64+pos,chunk.start2-start,hash);
hash=CalcFNVHash(pRes32+chunk.start1,chunk.len,hash);
pos+=chunk.start2-start;
start=chunk.start2+chunk.len;
}
if (pos<sizeArm64)
hash=CalcFNVHash(pResArm64+pos,sizeArm64-pos,hash);
}
else
hash=CalcFNVHash(pRes32,size32);
if (hash!=hash0)
@@ -173,7 +229,7 @@ static int ExtractMsi( HINSTANCE hInstance, const wchar_t *msiName, bool b64, bo
}
return ERR_MSI_EXTRACTFAIL;
}
if (b64)
if (extractType==x64)
{
int start=0;
int pos=0;
@@ -189,6 +245,22 @@ static int ExtractMsi( HINSTANCE hInstance, const wchar_t *msiName, bool b64, bo
if (pos<size64)
WriteFileXOR(hFile,pRes64+pos,size64-pos);
}
else if (extractType==ARM64)
{
int start=0;
int pos=0;
for (int i=0;i<chunkCount;i++)
{
const Chunk &chunk=pChunks[i];
if (start<chunk.start2)
WriteFileXOR(hFile,pResArm64+pos,chunk.start2-start);
WriteFileXOR(hFile,pRes32+chunk.start1,chunk.len);
pos+=chunk.start2-start;
start=chunk.start2+chunk.len;
}
if (pos<sizeArm64)
WriteFileXOR(hFile,pResArm64+pos,sizeArm64-pos);
}
else
{
WriteFileXOR(hFile,pRes32,size32);
@@ -218,7 +290,7 @@ int APIENTRY wWinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCm
wchar_t *const *params=CommandLineToArgvW(lpCmdLine,&count);
if (!params) count=0;
int extract=0;
ExtractType extractType=None;
bool bQuiet=false;
for (;count>0;count--,params++)
{
@@ -233,9 +305,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 +329,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 +356,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 +371,25 @@ 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");
if (isWow64Process2)
{
USHORT processMachine = 0, 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 +404,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)
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)
Wow64RevertWow64FsRedirection(wow64FsRedirVal);
if (!ret)
{
DeleteFile(msiName);
if (!bQuiet)

View File

@@ -102,6 +102,7 @@ END
IDR_MSI_FILE32 MSI_FILE "Temp\\Setup32.msi_"
IDR_MSI_FILE64 MSI_FILE "Temp\\Setup64.msi_"
IDR_MSI_FILEARM64 MSI_FILE "Temp\\SetupARM64.msi_"
IDR_MSI_CHECKSUM MSI_FILE "msichecksum.bin"
@@ -126,7 +127,7 @@ END
STRINGTABLE
BEGIN
IDS_HELP "Open-Shell Setup will install Open-Shell on your computer. Possible command lines:\n <no command line> - runs the installer normally\n extract32 - extracts the 32-bit MSI\n extract64 - extracts the 64-bit MSI\n help, /? - shows the command line help\n <some msiexec options> - the options are passed to msiexec\n * if the options contain %MSI% (all caps) the token is replaced by the name of the extracted MSI file\n * if %MSI% is not found, the setup runs ""msiexec /i <MSI file> <some msiexec options>""\n * run msiexec with no parameters to see the full list of msiexec options\n\nExamples:\n /qn - runs the installer in quiet mode\n /x %MSI% /qb - uninstalls the product in basic UI level\n /f %MSI% - repairs the product\n /l* log.txt - runs the installer and logs the process in the log.txt file\n /qn ADDLOCAL=ClassicExplorer - installs only Classic Explorer in quiet mode\n /qn ADDLOCAL=StartMenu APPLICATIONFOLDER=C:\\OpenShell - installs only Open-Shell Start Menu in quiet mode in the folder C:\\OpenShell\n ADDLOCAL=StartMenu,ClassicIE - runs the installer in full UI mode with Open-Shell Start Menu and Classic IE checked by default"
IDS_HELP "Open-Shell Setup will install Open-Shell on your computer. Possible command lines:\n <no command line> - runs the installer normally\n extract32 - extracts the 32-bit MSI\n extract64 - extracts the 64-bit MSI\n extractARM64 - extracts the ARM64 MSI\n help, /? - shows the command line help\n <some msiexec options> - the options are passed to msiexec\n * if the options contain %MSI% (all caps) the token is replaced by the name of the extracted MSI file\n * if %MSI% is not found, the setup runs ""msiexec /i <MSI file> <some msiexec options>""\n * run msiexec with no parameters to see the full list of msiexec options\n\nExamples:\n /qn - runs the installer in quiet mode\n /x %MSI% /qb - uninstalls the product in basic UI level\n /f %MSI% - repairs the product\n /l* log.txt - runs the installer and logs the process in the log.txt file\n /qn ADDLOCAL=ClassicExplorer - installs only Classic Explorer in quiet mode\n /qn ADDLOCAL=StartMenu APPLICATIONFOLDER=C:\\OpenShell - installs only Open-Shell Start Menu in quiet mode in the folder C:\\OpenShell\n ADDLOCAL=StartMenu,ClassicIE - runs the installer in full UI mode with Open-Shell Start Menu and Classic IE checked by default"
END
#endif // English (U.S.) resources

View File

@@ -64,6 +64,7 @@
<None Include="msichecksum.bin" />
<None Include="Temp\Setup32.msi_" />
<None Include="Temp\Setup64.msi_" />
<None Include="Temp\SetupARM64.msi_" />
<None Include="__MakeFinal.bat" />
</ItemGroup>
<ItemGroup>

View File

@@ -61,5 +61,6 @@
<None Include="Temp\Setup32.msi_" />
<None Include="Temp\Setup64.msi_" />
<None Include="msichecksum.bin" />
<None Include="Temp\SetupARM64.msi_" />
</ItemGroup>
</Project>

View File

@@ -3,7 +3,7 @@
# This comment is generated by WixEdit, the specific commandline
# arguments for the WiX Toolset are stored here.
candleArgs: "<projectfile>" -out "<projectname>.wixobj" -ext WixUIExtension -ext WixUtilExtension -dx64=0
candleArgs: "<projectfile>" -out "<projectname>.wixobj" -ext WixUIExtension -ext WixUtilExtension -dx64=0 -dARM64=0
lightArgs: "<projectname>.wixobj" -out "<projectname>.msi" -ext WixUIExtension -ext WixUtilExtension -loc OpenShellText-en-US.wxl
-->
<?if $(var.x64)=1 ?>
@@ -11,6 +11,11 @@
<?define CS_PLATFORM = "x64"?>
<?define CS_PROGRAM_FILES = "ProgramFiles64Folder"?>
<?define CS_WIN64 = "yes"?>
<?elseif $(var.ARM64)=1 ?>
<?define CS_UPGRADE = "BECF7DE9-53D0-41E7-92DC-0EF4ACCCD867"?>
<?define CS_PLATFORM = "arm64"?>
<?define CS_PROGRAM_FILES = "ProgramFiles64Folder"?>
<?define CS_WIN64 = "yes"?>
<?else ?>
<?define CS_UPGRADE = "EB7DA1D9-44EA-43BF-8A08-0B103007D4F2"?>
<?define CS_PLATFORM = "x86"?>
@@ -22,9 +27,13 @@
<Package Description="Open-Shell" Comments="Start Menu Replacement" InstallerVersion="500" Compressed="yes" Platform="$(var.CS_PLATFORM)" />
<Media Id="1" Cabinet="cshell.cab" EmbedCab="yes" CompressionLevel="high" />
<Media Id="2" Cabinet="simple.cab" EmbedCab="yes" CompressionLevel="high" />
<?if $(var.x64)=0 ?>
<PropertyRef Id="WIX_NATIVE_MACHINE" />
<?if $(var.x64)=0 And $(var.ARM64)=0 ?>
<Condition Message="!(loc.Error32bit)">not Msix64</Condition>
<?endif ?>
<?if $(var.x64)=1 ?>
<Condition Message="!(loc.Error64bit)">NOT (WIX_NATIVE_MACHINE AND WIX_NATIVE_MACHINE="43620")</Condition>
<?endif ?>
<Condition Message="!(loc.ErrorWin7)">VersionNT&gt;=601</Condition>
<Condition Message="!(loc.ErrorNewVersion)">NOT NEWERPRODUCTFOUND OR Installed</Condition>
<Directory Id="TARGETDIR" Name="SourceDir">
@@ -59,7 +68,7 @@
<?endif ?>
<Feature Id="ClassicExplorer" Level="1" Title="!(loc.ExplorerTitle)" ConfigurableDirectory="APPLICATIONFOLDER" AllowAdvertise="no" Description="!(loc.ExplorerDesc)">
<ComponentRef Id="ClassicExplorer32.dll" />
<?if $(var.x64)=1 ?>
<?if $(var.x64)=1 Or $(var.ARM64)=1 ?>
<ComponentRef Id="ClassicExplorer64.dll" />
<?endif ?>
<ComponentRef Id="ExplorerL10N.ini" />
@@ -71,7 +80,7 @@
<ComponentRef Id="StartMenuDLL.dll" />
<ComponentRef Id="StartMenuL10N.ini" />
<ComponentRef Id="StartMenuHelper32.dll" />
<?if $(var.x64)=1 ?>
<?if $(var.x64)=1 Or $(var.ARM64)=1 ?>
<ComponentRef Id="StartMenuHelper64.dll" />
<?endif ?>
<ComponentRef Id="StartScreenLink" />
@@ -98,7 +107,7 @@
<Feature Id="ClassicIE" Level="2" Title="!(loc.IETitle)" ConfigurableDirectory="APPLICATIONFOLDER" AllowAdvertise="no" Description="!(loc.IEDesc)">
<ComponentRef Id="ClassicIEDLL_32.dll" />
<ComponentRef Id="ClassicIE_32.exe" />
<?if $(var.x64)=1 ?>
<?if $(var.x64)=1 Or $(var.ARM64)=1 ?>
<ComponentRef Id="ClassicIEDLL_64.dll" />
<ComponentRef Id="ClassicIE_64.exe" />
<?endif ?>
@@ -443,6 +452,25 @@
<Component Id="StartMenuDLL.dll" Guid="C5226061-17DE-4DF6-A088-CC84F6A7BE84" Win64="yes" DiskId="2">
<File Id="StartMenuDLL.dll" Checksum="yes" KeyPath="yes" Source="Output\x64\StartMenuDLL.dll" Vital="yes" />
</Component>
<?elseif $(var.ARM64)=1 ?>
<Component Id="ClassicExplorer64.dll" Guid="2C25783D-394D-4E5B-9259-1650F561E2CE" Win64="yes" DiskId="2">
<File Id="ClassicExplorer64.dll" KeyPath="yes" Source="Output\ARM64\ClassicExplorer64.dll" Checksum="yes" SelfRegCost="0" Vital="yes" />
</Component>
<Component Id="ClassicIEDLL_64.dll" Guid="43E62408-40EB-4FBB-98CC-7463F5B78266" Win64="yes" DiskId="2">
<File Id="ClassicIEDLL_64.dll" KeyPath="yes" Source="Output\ARM64\ClassicIEDLL_64.dll" Checksum="yes" SelfRegCost="0" Vital="yes" />
</Component>
<Component Id="ClassicIE_64.exe" Guid="E822E720-8477-4511-AD93-172313EFA636" Win64="yes" DiskId="2">
<File Id="ClassicIE_64.exe" KeyPath="yes" Source="Output\ARM64\ClassicIE_64.exe" Checksum="yes" Vital="yes" />
</Component>
<Component Id="StartMenu.exe" Guid="FC69E080-4232-4161-A1E5-20E255FB2F6B" Win64="yes" DiskId="2">
<File Id="StartMenu.exe" KeyPath="yes" Checksum="yes" Source="Output\ARM64\StartMenu.exe" Vital="yes" />
<Shortcut Id="StartMenuSettings" Name="Start Menu Settings" Advertise="no" Arguments="-settings" Description="!(loc.StartSettingsDesc)" Target="[APPLICATIONFOLDER]StartMenu.exe" WorkingDirectory="APPLICATIONFOLDER">
<ShortcutProperty Key="System.AppUserModel.ID" Value="OpenShell.StartMenu.Settings" />
</Shortcut>
</Component>
<Component Id="StartMenuDLL.dll" Guid="ED99E7BC-9F2C-4A96-A942-6E7D41628AB0" Win64="yes" DiskId="2">
<File Id="StartMenuDLL.dll" Checksum="yes" KeyPath="yes" Source="Output\ARM64\StartMenuDLL.dll" Vital="yes" />
</Component>
<?else ?>
<Component Id="StartMenu.exe" Guid="F74C0FF3-A8C0-4B6E-AFD2-F9467DE4D90B" Win64="no" DiskId="2">
<File Id="StartMenu.exe" KeyPath="yes" Checksum="yes" Source="Output\StartMenu.exe" Vital="yes" />
@@ -624,6 +652,11 @@
<File Id="StartMenuHelper64.dll" KeyPath="yes" Source="Output\x64\StartMenuHelper64.dll" Checksum="yes" SelfRegCost="0" Vital="yes" />
</Component>
<?endif ?>
<?if $(var.ARM64)=1 ?>
<Component Id="StartMenuHelper64.dll" Guid="108B11E8-2F76-4C37-A274-62BAE6240490" Win64="yes" DiskId="2">
<File Id="StartMenuHelper64.dll" KeyPath="yes" Source="Output\ARM64\StartMenuHelper64.dll" Checksum="yes" SelfRegCost="0" Vital="yes" />
</Component>
<?endif ?>
</DirectoryRef>
<Icon Id="icon.ico" SourceFile="..\Setup\OpenShell.ico" />
<Property Id="ARPPRODUCTICON" Value="icon.ico" />

View File

@@ -86,7 +86,7 @@ int CalcMsiChecksum( wchar_t *const *params, int count )
// load files
wchar_t path1[_MAX_PATH];
std::vector<unsigned char> buf1, buf2;
std::vector<unsigned char> buf1, buf2, buf3;
Sprintf(path1,_countof(path1),L"%s\\Setup32.msi",params[1]);
LoadFile(path1,buf1);
if (buf1.empty())
@@ -102,20 +102,30 @@ int CalcMsiChecksum( wchar_t *const *params, int count )
Printf("Failed to open file %s\n",path2);
return 1;
}
wchar_t path3[_MAX_PATH];
Sprintf(path3,_countof(path3),L"%s\\SetupARM64.msi",params[1]);
LoadFile(path3,buf3);
if (buf3.empty())
{
Printf("Failed to open file %s\n",path3);
return 1;
}
int len1=(int)buf1.size();
int len2=(int)buf2.size();
int len3=(int)buf3.size();
for (std::vector<unsigned char>::iterator it=buf1.begin();it!=buf1.end();++it)
*it^=0xFF;
for (std::vector<unsigned char>::iterator it=buf2.begin();it!=buf2.end();++it)
*it^=0xFF;
for (std::vector<unsigned char>::iterator it=buf3.begin();it!=buf3.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;
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<Chunk> chunks;
int start2=0;
for (int i=0;i<len1-BLOCK_SIZE;i+=BLOCK_SIZE)
for (int i=0,start2=0;i<len1-BLOCK_SIZE;i+=BLOCK_SIZE)
{
for (int j=start2;j<len2-BLOCK_SIZE;j++)
{
@@ -142,6 +152,35 @@ int CalcMsiChecksum( wchar_t *const *params, int count )
}
}
}
// detect x86/ARM64 common blocks (assuming at least 256K in size and in the same order in both files)
std::vector<Chunk> chunks2;
for (int i=0,start2=0;i<len1-BLOCK_SIZE;i+=BLOCK_SIZE)
{
for (int j=start2;j<len3-BLOCK_SIZE;j++)
{
if (memcmp(&buf1[i],&buf3[j],BLOCK_SIZE)==0)
{
Chunk chunk;
chunk.start1=i;
chunk.start2=j;
chunk.len=BLOCK_SIZE;
while (chunk.start1>0 && chunk.start2>0 && buf1[chunk.start1-1]==buf3[chunk.start2-1])
{
chunk.start1--;
chunk.start2--;
chunk.len++;
}
while (chunk.start1+chunk.len<len1 && chunk.start2+chunk.len<len3 && buf1[chunk.start1+chunk.len]==buf3[chunk.start2+chunk.len])
{
chunk.len++;
}
chunks2.push_back(chunk);
i=chunk.start1+chunk.len-1;
start2=chunk.start2+chunk.len;
break;
}
}
}
// save modified 32-bit MSI
{
@@ -177,9 +216,31 @@ int CalcMsiChecksum( wchar_t *const *params, int count )
fclose(f);
}
unsigned int fnvs[2];
// save modified ARM64 MSI
{
Strcat(path3,_countof(path3),L"_");
FILE* f=NULL;
if (_wfopen_s(&f,path3,L"wb") || !f)
{
Printf("Failed to write %s\n",path3);
return 1;
}
int start=0;
for (std::vector<Chunk>::const_iterator it=chunks2.begin();it!=chunks2.end();++it)
{
if (it->start2-start>0)
fwrite(&buf3[start],1,it->start2-start,f);
start=it->start2+it->len;
}
if (len3-start>0)
fwrite(&buf3[start],1,len3-start,f);
fclose(f);
}
unsigned int fnvs[3];
fnvs[0]=CalcFNVHash(&buf1[0],len1,FNV_HASH0);
fnvs[1]=CalcFNVHash(&buf2[0],len2,FNV_HASH0);
fnvs[2]=CalcFNVHash(&buf3[0],len3,FNV_HASH0);
// save fnvs and chunks
{
@@ -193,6 +254,9 @@ int CalcMsiChecksum( wchar_t *const *params, int count )
int count=(int)chunks.size();
fwrite(&count,1,4,f);
fwrite(&chunks[0],sizeof(Chunk),count,f);
count=(int)chunks2.size();
fwrite(&count,1,4,f);
fwrite(&chunks2[0],sizeof(Chunk),count,f);
fclose(f);
}
return 0;
@@ -841,7 +905,7 @@ static HRESULT CALLBACK TaskDialogCallback( HWND hwnd, UINT uNotification, WPARA
// Open-Shell utility - multiple utilities for building and maintaining Open-Shell
// Usage:
// no parameters - saves a troubleshooting log
// crcmsi <msi path> // creates a file with checksum of both msi files
// crcmsi <msi path> // creates a file with checksum of all msi files
// makeEN <explorer dll> <start menu dll> <ie dll> <update exe> // extracts the localization resources and creates a sample en-US.DLL
// extract <dll> <csv> // extracts the string table, the dialog text, and the L10N text from a DLL and stores it in a CSV
// extract en-us.dll <dll> <csv> // extracts the string table, the dialog text, and the L10N text from two DLL and stores it in a CSV

View File

@@ -1,6 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|ARM64">
<Configuration>Debug</Configuration>
<Platform>ARM64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Debug|Win32">
<Configuration>Debug</Configuration>
<Platform>Win32</Platform>
@@ -9,6 +13,10 @@
<Configuration>Debug</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|ARM64">
<Configuration>Release</Configuration>
<Platform>ARM64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|Win32">
<Configuration>Release</Configuration>
<Platform>Win32</Platform>
@@ -63,6 +71,7 @@
<ItemGroup>
<ResourceCompile Include="Utility.rc">
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'">true</ExcludedFromBuild>
</ResourceCompile>
</ItemGroup>
<ItemGroup>

View File

@@ -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

View File

@@ -1,6 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|ARM64">
<Configuration>Debug</Configuration>
<Platform>ARM64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Debug|Win32">
<Configuration>Debug</Configuration>
<Platform>Win32</Platform>
@@ -9,6 +13,10 @@
<Configuration>Debug</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|ARM64">
<Configuration>Release</Configuration>
<Platform>ARM64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|Win32">
<Configuration>Release</Configuration>
<Platform>Win32</Platform>
@@ -17,6 +25,10 @@
<Configuration>Release</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Setup|ARM64">
<Configuration>Setup</Configuration>
<Platform>ARM64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Setup|Win32">
<Configuration>Setup</Configuration>
<Platform>Win32</Platform>

View File

@@ -1,6 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|ARM64">
<Configuration>Debug</Configuration>
<Platform>ARM64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Debug|Win32">
<Configuration>Debug</Configuration>
<Platform>Win32</Platform>
@@ -9,6 +13,10 @@
<Configuration>Debug</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|ARM64">
<Configuration>Release</Configuration>
<Platform>ARM64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|Win32">
<Configuration>Release</Configuration>
<Platform>Win32</Platform>
@@ -17,6 +25,10 @@
<Configuration>Release</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Setup|ARM64">
<Configuration>Setup</Configuration>
<Platform>ARM64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Setup|Win32">
<Configuration>Setup</Configuration>
<Platform>Win32</Platform>

View File

@@ -1,6 +1,14 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|ARM64">
<Configuration>Debug</Configuration>
<Platform>ARM64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Debug|ARM64EC">
<Configuration>Debug</Configuration>
<Platform>ARM64EC</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Debug|Win32">
<Configuration>Debug</Configuration>
<Platform>Win32</Platform>
@@ -9,6 +17,14 @@
<Configuration>Debug</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|ARM64">
<Configuration>Release</Configuration>
<Platform>ARM64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|ARM64EC">
<Configuration>Release</Configuration>
<Platform>ARM64EC</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|Win32">
<Configuration>Release</Configuration>
<Platform>Win32</Platform>
@@ -17,6 +33,14 @@
<Configuration>Release</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Setup|ARM64">
<Configuration>Setup</Configuration>
<Platform>ARM64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Setup|ARM64EC">
<Configuration>Setup</Configuration>
<Platform>ARM64EC</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Setup|Win32">
<Configuration>Setup</Configuration>
<Platform>Win32</Platform>
@@ -53,6 +77,13 @@
<PropertyGroup Condition="'$(Platform)'=='x64'">
<TargetName>$(ProjectName)64</TargetName>
</PropertyGroup>
<PropertyGroup Condition="'$(Platform)'=='ARM64EC'">
<TargetName>$(ProjectName)64</TargetName>
</PropertyGroup>
<PropertyGroup Condition="'$(Platform)'=='ARM64'">
<TargetName>$(ProjectName)64</TargetName>
<BuildAsX>true</BuildAsX>
</PropertyGroup>
<ItemDefinitionGroup>
<ClCompile>
<PreprocessorDefinitions>_USRDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>