diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index ce2554f..0215838 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -93,16 +93,45 @@ jobs:
fileName: ep_taskbar.*.dll
latest: true
out-file-path: build/Release
-
- - name: Build funchook
+
+ # build/Release/ep_taskbar.*.amd64.dll -> build/Release/x64/ep_taskbar.*.dll
+ # build/Release/ep_taskbar.*.arm64.dll -> build/Release/ARM64/ep_taskbar.*.dll
+ - name: Move ep_taskbar
+ shell: bash
+ run: |
+ if ls build/Release/ep_taskbar.*.amd64.dll 1> /dev/null 2>&1; then
+ mkdir -p build/Release/x64
+ for file in build/Release/ep_taskbar.*.amd64.dll; do
+ cp "$file" "build/Release/x64/$(basename "$file" .amd64.dll).dll"
+ done
+ fi
+
+ # if ls build/Release/ep_taskbar.*.arm64.dll 1> /dev/null 2>&1; then
+ # mkdir -p build/Release/ARM64
+ # for file in build/Release/ep_taskbar.*.arm64.dll; do
+ # cp "$file" "build/Release/ARM64/$(basename "$file" .arm64.dll).dll"
+ # done
+ # fi
+
+ - name: Build funchook amd64
shell: powershell
run: |
cd libs/funchook
md build
cd build
- cmake -G "Visual Studio 17 2022" -A x64 ..
+ cmake -G "Visual Studio 17 2022" -A x64 -DFUNCHOOK_CPU=x86 ..
(gc .\funchook-static.vcxproj) -replace 'MultiThreadedDLL', 'MultiThreaded' | Out-File .\funchook-static.vcxproj
cmake --build . --config Release
+
+ # - name: Build funchook arm64
+ # shell: powershell
+ # run: |
+ # cd libs/funchook
+ # md build-arm64
+ # cd build-arm64
+ # cmake -G "Visual Studio 17 2022" -A ARM64 -DFUNCHOOK_CPU=arm64 -DFUNCHOOK_DISASM=capstone -DFUNCHOOK_BUILD_TESTS=OFF ..
+ # (gc .\funchook-static.vcxproj) -replace 'MultiThreadedDLL', 'MultiThreaded' | Out-File .\funchook-static.vcxproj
+ # cmake --build . --config Release
- name: Build EP IA-32
if: github.event.inputs.config == ''
@@ -116,6 +145,12 @@ jobs:
run: |
msbuild /m /p:Configuration=${{env.BUILD_CONFIGURATION}} /p:Platform=amd64 ${{env.SOLUTION_FILE_PATH}}
+ # - name: Build EP arm64
+ # if: github.event.inputs.config == ''
+ # working-directory: ${{env.GITHUB_WORKSPACE}}
+ # run: |
+ # msbuild /m /p:Configuration=${{env.BUILD_CONFIGURATION}} /p:Platform=arm64 ${{env.SOLUTION_FILE_PATH}}
+
- name: Build EP custom
if: github.event.inputs.config != ''
working-directory: ${{env.GITHUB_WORKSPACE}}
@@ -131,13 +166,13 @@ jobs:
- name: Generate dxgi.dll
shell: bash
- working-directory: build/Release
run: |
- if [[ -f "ExplorerPatcher.amd64.dll" ]]; then cp ExplorerPatcher.amd64.dll dxgi.dll; fi
-
+ if [[ -f "build/Release/x64/ExplorerPatcher.amd64.dll" ]]; then cp build/Release/x64/ExplorerPatcher.dll build/Release/x64/dxgi.dll; fi
+ if [[ -f "build/Release/ARM64/ExplorerPatcher.arm64.dll" ]]; then cp build/Release/ARM64/ExplorerPatcher.dll build/Release/ARM64/dxgi.dll; fi
+
- name: Patch setup
shell: cmd
- working-directory: build/Release
+ working-directory: build/Release/x64
run: |
ep_setup_patch.exe
exit /b 0
@@ -151,7 +186,7 @@ jobs:
- name: Generate release name
shell: bash
- working-directory: build/Release
+ working-directory: build/Release/x64
if: github.ref == 'refs/heads/master' && github.event.inputs.ref == ''
run: |
echo "data=$(./ep_generate_release_name.exe)" >> $GITHUB_OUTPUT
@@ -159,7 +194,7 @@ jobs:
- name: Generate release notes
shell: bash
- working-directory: build/Release
+ working-directory: build/Release/x64
if: github.ref == 'refs/heads/master' && github.event.inputs.ref == ''
run: |
echo "data<> $GITHUB_OUTPUT
@@ -178,7 +213,7 @@ jobs:
tag_name: ${{ steps.release_name.outputs.data }}_${{ steps.vars.outputs.sha_short }}
body: ${{ steps.release_description.outputs.data }}
files: |
- ./build/Release/ep_setup.exe
+ build/Release/x64/ep_setup.exe
env:
GITHUB_TOKEN: ${{ secrets.PAT }}
@@ -193,6 +228,6 @@ jobs:
tag_name: ${{ steps.release_name.outputs.data }}_${{ steps.vars.outputs.sha_short }}
body: ${{ steps.release_description.outputs.data }}
files: |
- ./build/Release/ep_setup.exe
+ build/Release/x64/ep_setup.exe
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
diff --git a/ExplorerPatcher.sln b/ExplorerPatcher.sln
index dfdecf9..bf849d3 100644
--- a/ExplorerPatcher.sln
+++ b/ExplorerPatcher.sln
@@ -54,84 +54,124 @@ EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|amd64 = Debug|amd64
+ Debug|arm64 = Debug|arm64
Debug|IA-32 = Debug|IA-32
Release|amd64 = Release|amd64
+ Release|arm64 = Release|arm64
Release|IA-32 = Release|IA-32
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{DB3E4319-2969-42B6-B7E8-BB57AA8C9FA9}.Debug|amd64.ActiveCfg = Debug|x64
{DB3E4319-2969-42B6-B7E8-BB57AA8C9FA9}.Debug|amd64.Build.0 = Debug|x64
+ {DB3E4319-2969-42B6-B7E8-BB57AA8C9FA9}.Debug|arm64.ActiveCfg = Debug|ARM64
+ {DB3E4319-2969-42B6-B7E8-BB57AA8C9FA9}.Debug|arm64.Build.0 = Debug|ARM64
{DB3E4319-2969-42B6-B7E8-BB57AA8C9FA9}.Debug|IA-32.ActiveCfg = Debug|Win32
{DB3E4319-2969-42B6-B7E8-BB57AA8C9FA9}.Debug|IA-32.Build.0 = Debug|Win32
{DB3E4319-2969-42B6-B7E8-BB57AA8C9FA9}.Release|amd64.ActiveCfg = Release|x64
{DB3E4319-2969-42B6-B7E8-BB57AA8C9FA9}.Release|amd64.Build.0 = Release|x64
+ {DB3E4319-2969-42B6-B7E8-BB57AA8C9FA9}.Release|arm64.ActiveCfg = Release|ARM64
+ {DB3E4319-2969-42B6-B7E8-BB57AA8C9FA9}.Release|arm64.Build.0 = Release|ARM64
{DB3E4319-2969-42B6-B7E8-BB57AA8C9FA9}.Release|IA-32.ActiveCfg = Release|Win32
{DB3E4319-2969-42B6-B7E8-BB57AA8C9FA9}.Release|IA-32.Build.0 = Release|Win32
{C362CFBE-7C6B-4457-8D01-839818D42ECB}.Debug|amd64.ActiveCfg = Debug|x64
{C362CFBE-7C6B-4457-8D01-839818D42ECB}.Debug|amd64.Build.0 = Debug|x64
+ {C362CFBE-7C6B-4457-8D01-839818D42ECB}.Debug|arm64.ActiveCfg = Debug|ARM64
{C362CFBE-7C6B-4457-8D01-839818D42ECB}.Debug|IA-32.ActiveCfg = Debug|Win32
{C362CFBE-7C6B-4457-8D01-839818D42ECB}.Release|amd64.ActiveCfg = Release|x64
{C362CFBE-7C6B-4457-8D01-839818D42ECB}.Release|amd64.Build.0 = Release|x64
+ {C362CFBE-7C6B-4457-8D01-839818D42ECB}.Release|arm64.ActiveCfg = Release|ARM64
{C362CFBE-7C6B-4457-8D01-839818D42ECB}.Release|IA-32.ActiveCfg = Release|Win32
{78D0C3CF-25C0-41D4-9359-0E9AB72B9874}.Debug|amd64.ActiveCfg = Debug|x64
{78D0C3CF-25C0-41D4-9359-0E9AB72B9874}.Debug|amd64.Build.0 = Debug|x64
+ {78D0C3CF-25C0-41D4-9359-0E9AB72B9874}.Debug|arm64.ActiveCfg = Debug|ARM64
{78D0C3CF-25C0-41D4-9359-0E9AB72B9874}.Debug|IA-32.ActiveCfg = Debug|Win32
{78D0C3CF-25C0-41D4-9359-0E9AB72B9874}.Release|amd64.ActiveCfg = Release|x64
{78D0C3CF-25C0-41D4-9359-0E9AB72B9874}.Release|amd64.Build.0 = Release|x64
+ {78D0C3CF-25C0-41D4-9359-0E9AB72B9874}.Release|arm64.ActiveCfg = Release|ARM64
{78D0C3CF-25C0-41D4-9359-0E9AB72B9874}.Release|IA-32.ActiveCfg = Release|Win32
{2FD40B09-F224-4E9A-B2FE-A22B50B2DEBF}.Debug|amd64.ActiveCfg = Debug|x64
{2FD40B09-F224-4E9A-B2FE-A22B50B2DEBF}.Debug|amd64.Build.0 = Debug|x64
+ {2FD40B09-F224-4E9A-B2FE-A22B50B2DEBF}.Debug|arm64.ActiveCfg = Debug|ARM64
+ {2FD40B09-F224-4E9A-B2FE-A22B50B2DEBF}.Debug|arm64.Build.0 = Debug|ARM64
{2FD40B09-F224-4E9A-B2FE-A22B50B2DEBF}.Debug|IA-32.ActiveCfg = Debug|Win32
{2FD40B09-F224-4E9A-B2FE-A22B50B2DEBF}.Release|amd64.ActiveCfg = Release|x64
{2FD40B09-F224-4E9A-B2FE-A22B50B2DEBF}.Release|amd64.Build.0 = Release|x64
+ {2FD40B09-F224-4E9A-B2FE-A22B50B2DEBF}.Release|arm64.ActiveCfg = Release|ARM64
+ {2FD40B09-F224-4E9A-B2FE-A22B50B2DEBF}.Release|arm64.Build.0 = Release|ARM64
{2FD40B09-F224-4E9A-B2FE-A22B50B2DEBF}.Release|IA-32.ActiveCfg = Release|Win32
{0C13E5F3-106B-4836-A7C2-8E5808A6ED78}.Debug|amd64.ActiveCfg = Debug|x64
{0C13E5F3-106B-4836-A7C2-8E5808A6ED78}.Debug|amd64.Build.0 = Debug|x64
+ {0C13E5F3-106B-4836-A7C2-8E5808A6ED78}.Debug|arm64.ActiveCfg = Debug|ARM64
{0C13E5F3-106B-4836-A7C2-8E5808A6ED78}.Debug|IA-32.ActiveCfg = Debug|Win32
{0C13E5F3-106B-4836-A7C2-8E5808A6ED78}.Release|amd64.ActiveCfg = Release|x64
{0C13E5F3-106B-4836-A7C2-8E5808A6ED78}.Release|amd64.Build.0 = Release|x64
+ {0C13E5F3-106B-4836-A7C2-8E5808A6ED78}.Release|arm64.ActiveCfg = Release|ARM64
{0C13E5F3-106B-4836-A7C2-8E5808A6ED78}.Release|IA-32.ActiveCfg = Release|Win32
{1ECCAB38-61B6-4C85-BBB5-2E2232DA3A87}.Debug|amd64.ActiveCfg = Debug|x64
{1ECCAB38-61B6-4C85-BBB5-2E2232DA3A87}.Debug|amd64.Build.0 = Debug|x64
+ {1ECCAB38-61B6-4C85-BBB5-2E2232DA3A87}.Debug|arm64.ActiveCfg = Debug|ARM64
+ {1ECCAB38-61B6-4C85-BBB5-2E2232DA3A87}.Debug|arm64.Build.0 = Debug|ARM64
{1ECCAB38-61B6-4C85-BBB5-2E2232DA3A87}.Debug|IA-32.ActiveCfg = Debug|Win32
{1ECCAB38-61B6-4C85-BBB5-2E2232DA3A87}.Release|amd64.ActiveCfg = Release|x64
{1ECCAB38-61B6-4C85-BBB5-2E2232DA3A87}.Release|amd64.Build.0 = Release|x64
+ {1ECCAB38-61B6-4C85-BBB5-2E2232DA3A87}.Release|arm64.ActiveCfg = Release|ARM64
+ {1ECCAB38-61B6-4C85-BBB5-2E2232DA3A87}.Release|arm64.Build.0 = Release|ARM64
{1ECCAB38-61B6-4C85-BBB5-2E2232DA3A87}.Release|IA-32.ActiveCfg = Release|Win32
{314A50C1-F0A0-4D0C-89E1-AD8F3951043E}.Debug|amd64.ActiveCfg = Debug|x64
{314A50C1-F0A0-4D0C-89E1-AD8F3951043E}.Debug|amd64.Build.0 = Debug|x64
+ {314A50C1-F0A0-4D0C-89E1-AD8F3951043E}.Debug|arm64.ActiveCfg = Debug|ARM64
+ {314A50C1-F0A0-4D0C-89E1-AD8F3951043E}.Debug|arm64.Build.0 = Debug|ARM64
{314A50C1-F0A0-4D0C-89E1-AD8F3951043E}.Debug|IA-32.ActiveCfg = Debug|Win32
{314A50C1-F0A0-4D0C-89E1-AD8F3951043E}.Release|amd64.ActiveCfg = Release|x64
{314A50C1-F0A0-4D0C-89E1-AD8F3951043E}.Release|amd64.Build.0 = Release|x64
+ {314A50C1-F0A0-4D0C-89E1-AD8F3951043E}.Release|arm64.ActiveCfg = Release|ARM64
+ {314A50C1-F0A0-4D0C-89E1-AD8F3951043E}.Release|arm64.Build.0 = Release|ARM64
{314A50C1-F0A0-4D0C-89E1-AD8F3951043E}.Release|IA-32.ActiveCfg = Release|Win32
{AF02ABAC-EAEB-471C-9957-73D430B8B4DE}.Debug|amd64.ActiveCfg = Debug|x64
{AF02ABAC-EAEB-471C-9957-73D430B8B4DE}.Debug|amd64.Build.0 = Debug|x64
+ {AF02ABAC-EAEB-471C-9957-73D430B8B4DE}.Debug|arm64.ActiveCfg = Debug|ARM64
+ {AF02ABAC-EAEB-471C-9957-73D430B8B4DE}.Debug|arm64.Build.0 = Debug|ARM64
{AF02ABAC-EAEB-471C-9957-73D430B8B4DE}.Debug|IA-32.ActiveCfg = Debug|Win32
{AF02ABAC-EAEB-471C-9957-73D430B8B4DE}.Release|amd64.ActiveCfg = Release|x64
{AF02ABAC-EAEB-471C-9957-73D430B8B4DE}.Release|amd64.Build.0 = Release|x64
+ {AF02ABAC-EAEB-471C-9957-73D430B8B4DE}.Release|arm64.ActiveCfg = Release|ARM64
+ {AF02ABAC-EAEB-471C-9957-73D430B8B4DE}.Release|arm64.Build.0 = Release|ARM64
{AF02ABAC-EAEB-471C-9957-73D430B8B4DE}.Release|IA-32.ActiveCfg = Release|Win32
{6BF03EEA-200A-4698-9555-057DD52B0C78}.Debug|amd64.ActiveCfg = Debug|x64
{6BF03EEA-200A-4698-9555-057DD52B0C78}.Debug|amd64.Build.0 = Debug|x64
+ {6BF03EEA-200A-4698-9555-057DD52B0C78}.Debug|arm64.ActiveCfg = Debug|ARM64
+ {6BF03EEA-200A-4698-9555-057DD52B0C78}.Debug|arm64.Build.0 = Debug|ARM64
{6BF03EEA-200A-4698-9555-057DD52B0C78}.Debug|IA-32.ActiveCfg = Debug|Win32
{6BF03EEA-200A-4698-9555-057DD52B0C78}.Release|amd64.ActiveCfg = Release|x64
{6BF03EEA-200A-4698-9555-057DD52B0C78}.Release|amd64.Build.0 = Release|x64
+ {6BF03EEA-200A-4698-9555-057DD52B0C78}.Release|arm64.ActiveCfg = Release|ARM64
+ {6BF03EEA-200A-4698-9555-057DD52B0C78}.Release|arm64.Build.0 = Release|ARM64
{6BF03EEA-200A-4698-9555-057DD52B0C78}.Release|IA-32.ActiveCfg = Release|Win32
{93FA47CC-7753-4F86-B583-69048F51C5AB}.Debug|amd64.ActiveCfg = Debug|x64
{93FA47CC-7753-4F86-B583-69048F51C5AB}.Debug|amd64.Build.0 = Debug|x64
+ {93FA47CC-7753-4F86-B583-69048F51C5AB}.Debug|arm64.ActiveCfg = Debug|ARM64
{93FA47CC-7753-4F86-B583-69048F51C5AB}.Debug|IA-32.ActiveCfg = Debug|Win32
{93FA47CC-7753-4F86-B583-69048F51C5AB}.Release|amd64.ActiveCfg = Release|x64
{93FA47CC-7753-4F86-B583-69048F51C5AB}.Release|amd64.Build.0 = Release|x64
+ {93FA47CC-7753-4F86-B583-69048F51C5AB}.Release|arm64.ActiveCfg = Release|ARM64
{93FA47CC-7753-4F86-B583-69048F51C5AB}.Release|IA-32.ActiveCfg = Release|Win32
{A66C5F27-DBF8-45A4-BDF3-BA54D8D82D0F}.Debug|amd64.ActiveCfg = Debug|x64
{A66C5F27-DBF8-45A4-BDF3-BA54D8D82D0F}.Debug|amd64.Build.0 = Debug|x64
+ {A66C5F27-DBF8-45A4-BDF3-BA54D8D82D0F}.Debug|arm64.ActiveCfg = Debug|ARM64
{A66C5F27-DBF8-45A4-BDF3-BA54D8D82D0F}.Debug|IA-32.ActiveCfg = Debug|Win32
{A66C5F27-DBF8-45A4-BDF3-BA54D8D82D0F}.Release|amd64.ActiveCfg = Release|x64
{A66C5F27-DBF8-45A4-BDF3-BA54D8D82D0F}.Release|amd64.Build.0 = Release|x64
+ {A66C5F27-DBF8-45A4-BDF3-BA54D8D82D0F}.Release|arm64.ActiveCfg = Release|ARM64
{A66C5F27-DBF8-45A4-BDF3-BA54D8D82D0F}.Release|IA-32.ActiveCfg = Release|Win32
{2351A0DF-782C-4D74-85B7-0847D245D6B4}.Debug|amd64.ActiveCfg = Debug|x64
{2351A0DF-782C-4D74-85B7-0847D245D6B4}.Debug|amd64.Build.0 = Debug|x64
+ {2351A0DF-782C-4D74-85B7-0847D245D6B4}.Debug|arm64.ActiveCfg = Debug|ARM64
+ {2351A0DF-782C-4D74-85B7-0847D245D6B4}.Debug|arm64.Build.0 = Debug|ARM64
{2351A0DF-782C-4D74-85B7-0847D245D6B4}.Debug|IA-32.ActiveCfg = Debug|x64
{2351A0DF-782C-4D74-85B7-0847D245D6B4}.Release|amd64.ActiveCfg = Release|x64
{2351A0DF-782C-4D74-85B7-0847D245D6B4}.Release|amd64.Build.0 = Release|x64
+ {2351A0DF-782C-4D74-85B7-0847D245D6B4}.Release|arm64.ActiveCfg = Release|ARM64
+ {2351A0DF-782C-4D74-85B7-0847D245D6B4}.Release|arm64.Build.0 = Release|ARM64
{2351A0DF-782C-4D74-85B7-0847D245D6B4}.Release|IA-32.ActiveCfg = Release|x64
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
diff --git a/ExplorerPatcher/ExplorerPatcher.vcxproj b/ExplorerPatcher/ExplorerPatcher.vcxproj
index b2d9027..0b5e1ab 100644
--- a/ExplorerPatcher/ExplorerPatcher.vcxproj
+++ b/ExplorerPatcher/ExplorerPatcher.vcxproj
@@ -5,18 +5,26 @@
Debug
Win32
-
- Debug
- x64
-
Release
Win32
+
+ Debug
+ x64
+
Release
x64
+
+ Debug
+ ARM64
+
+
+ Release
+ ARM64
+
16.0
@@ -26,13 +34,20 @@
ExplorerPatcher
-
+
DynamicLibrary
true
v143
Unicode
-
+
+ DynamicLibrary
+ false
+ v143
+ true
+ Unicode
+
+
DynamicLibrary
true
v143
@@ -45,7 +60,13 @@
true
Unicode
-
+
+ DynamicLibrary
+ true
+ v143
+ Unicode
+
+
DynamicLibrary
false
v143
@@ -57,157 +78,111 @@
-
+
-
+
+
+
+
-
+
+
+
+
-
- false
- $(SolutionDir)\build\$(Configuration)\
- ExplorerPatcher.amd64
+
+ true
+ $(SolutionDir)\build\$(Configuration)\$(Platform)\
+ ExplorerPatcher.IA-32
false
- $(SolutionDir)\build\$(Configuration)\
+ $(SolutionDir)\build\$(Configuration)\$(Platform)\
ExplorerPatcher.IA-32
true
+ $(SolutionDir)\build\$(Configuration)\$(Platform)\
ExplorerPatcher.amd64
- $(SolutionDir)\build\$(Configuration)\
-
+
+ false
+ $(SolutionDir)\build\$(Configuration)\$(Platform)\
+ ExplorerPatcher.amd64
+
+
true
- ExplorerPatcher.IA-32
- $(SolutionDir)\build\$(Configuration)\
+ $(SolutionDir)\build\$(Configuration)\$(Platform)\
+ ExplorerPatcher.arm64
-
+
+ false
+ $(SolutionDir)\build\$(Configuration)\$(Platform)\
+ ExplorerPatcher.arm64
+
+
Level3
- true
- true
true
- NDEBUG;_CONSOLE;WINRT_NO_SOURCE_LOCATION;%(PreprocessorDefinitions)
+ %(PreprocessorDefinitions)
true
- $(SolutionDir)libs\funchook\include;$(SolutionDir)libs\libvalinet;$(SolutionDir)libs\funchook\distorm\include;$(SolutionDir)libs\Detours\include;%(AdditionalIncludeDirectories)
- MultiThreaded
- Cdecl
+ $(SolutionDir)libs\funchook\include;$(SolutionDir)libs\libvalinet;%(AdditionalIncludeDirectories)
stdcpp20
false
Console
- true
- true
true
- $(SolutionDir)libs\funchook\build\Release\;$(SolutionDir)libs\Detours\lib.X64;%(AdditionalLibraryDirectories)
- %(AdditionalDependencies)
+ $(SolutionDir)libs\funchook\build\Release\;%(AdditionalLibraryDirectories)
Winmm.dll
-
-
-
-
-
-
-
-
-
+
+
+ _DEBUG;%(PreprocessorDefinitions)
+ MultiThreadedDebug
+ $(SolutionDir)debug.h
+
+
+
- Level3
true
true
- true
- NDEBUG;_CONSOLE;WINRT_NO_SOURCE_LOCATION;%(PreprocessorDefinitions)
- true
- $(SolutionDir)libs\funchook\include;$(SolutionDir)libs\libvalinet;$(SolutionDir)libs\funchook\distorm\include;$(SolutionDir)libs\Detours\include;%(AdditionalIncludeDirectories)
+ NDEBUG;WINRT_NO_SOURCE_LOCATION;%(PreprocessorDefinitions)
MultiThreaded
- StdCall
- stdcpp20
- Console
true
true
- true
- $(SolutionDir)libs\funchook\build\Release\;$(SolutionDir)libs\Detours\lib.X64;%(AdditionalLibraryDirectories)
- %(AdditionalDependencies)
- Winmm.dll
-
-
-
-
-
-
-
-
-
+
+
+ StdCall
+
+
+
- Level3
- true
- _DEBUG;_CONSOLE;%(PreprocessorDefinitions)
- true
- $(SolutionDir)libs\funchook\include;$(SolutionDir)libs\libvalinet;$(SolutionDir)libs\funchook\distorm\include;$(SolutionDir)libs\Detours\include;%(AdditionalIncludeDirectories)
- MultiThreadedDebug
Cdecl
- $(SolutionDir)debug.h
- stdcpp20
- Console
- true
- $(SolutionDir)libs\funchook\build\Release\;$(SolutionDir)libs\Detours\lib.X64;%(AdditionalLibraryDirectories)
- %(AdditionalDependencies)
- Winmm.dll
+ $(SolutionDir)libs\funchook\build\Release\;%(AdditionalLibraryDirectories)
-
-
-
-
-
-
-
-
-
+
- Level3
- true
- _DEBUG;_CONSOLE;%(PreprocessorDefinitions)
- true
- $(SolutionDir)libs\funchook\include;$(SolutionDir)libs\libvalinet;$(SolutionDir)libs\funchook\distorm\include;$(SolutionDir)libs\Detours\include;%(AdditionalIncludeDirectories)
- MultiThreadedDebug
- StdCall
- $(SolutionDir)debug.h
- stdcpp20
+ Cdecl
- Console
- true
- $(SolutionDir)libs\funchook\build\Release\;$(SolutionDir)libs\Detours\lib.X64;%(AdditionalLibraryDirectories)
- %(AdditionalDependencies)
- Winmm.dll
+ $(SolutionDir)libs\funchook\build-arm64\Release\;$(SolutionDir)libs\funchook\build-arm64\_deps\capstone-build\Release\;%(AdditionalLibraryDirectories)
-
-
-
-
-
-
-
-
@@ -231,10 +206,8 @@
true
- true
-
-
true
+ true
true
@@ -295,17 +268,11 @@
true
-
-
-
-
true
true
-
+
true
-
-
true
diff --git a/ExplorerPatcher/StartMenuSettings.cpp b/ExplorerPatcher/StartMenuSettings.cpp
index f1199b4..35985ce23 100644
--- a/ExplorerPatcher/StartMenuSettings.cpp
+++ b/ExplorerPatcher/StartMenuSettings.cpp
@@ -1177,14 +1177,30 @@ HRESULT PatchUnifiedTilePinUnpinProvider(HMODULE hModule)
MODULEINFO mi;
RETURN_IF_WIN32_BOOL_FALSE(GetModuleInformation(GetCurrentProcess(), hModule, &mi, sizeof(mi)));
+#if defined(_M_X64)
// 40 55 53 56 57 41 54 41 55 41 56 41 57 48 8D 6C 24 ?? 48 81 EC ?? ?? ?? ?? 48 8B 05 ?? ?? ?? ?? 48 33 C4 48 89 45 FF 49 8B ?? 4D 8B ?? 48 8B ?? 4C 8B ?? 4C 89 4D
- // Ref: WindowsInternal::Shell::UnifiedTile::Private::UnifiedTilePinUnpinVerbProvider::GetVerbs()
PBYTE match = (PBYTE)FindPattern(
hModule,
mi.SizeOfImage,
"\x40\x55\x53\x56\x57\x41\x54\x41\x55\x41\x56\x41\x57\x48\x8D\x6C\x24\x00\x48\x81\xEC\x00\x00\x00\x00\x48\x8B\x05\x00\x00\x00\x00\x48\x33\xC4\x48\x89\x45\xFF\x49\x8B\x00\x4D\x8B\x00\x48\x8B\x00\x4C\x8B\x00\x4C\x89\x4D",
"xxxxxxxxxxxxxxxxx?xxx????xxx????xxxxxxxxx?xx?xx?xx?xxx"
);
+#elif defined(_M_ARM64)
+ // E4 06 40 F9 E3 03 15 AA E2 0E 40 F9 E1 03 19 AA E0 03 16 AA ?? ?? ?? ?? E3 03 00 2A
+ // ^^^^^^^^^^^
+ // Ref: WindowsInternal::Shell::UnifiedTile::Private::UnifiedTilePinUnpinVerbProvider::GetVerbs()
+ PBYTE match = (PBYTE)FindPattern(
+ hModule,
+ mi.SizeOfImage,
+ "\xE4\x06\x40\xF9\xE3\x03\x15\xAA\xE2\x0E\x40\xF9\xE1\x03\x19\xAA\xE0\x03\x16\xAA\x00\x00\x00\x00\xE3\x03\x00\x2A",
+ "xxxxxxxxxxxxxxxxxxxx????xxxx"
+ );
+ if (match)
+ {
+ match += 20;
+ match = (PBYTE)ARM64_FollowBL((DWORD*)match);
+ }
+#endif
int rv = -1;
if (match)
diff --git a/ExplorerPatcher/dllmain.c b/ExplorerPatcher/dllmain.c
index 15dcd0e..b5eba78 100644
--- a/ExplorerPatcher/dllmain.c
+++ b/ExplorerPatcher/dllmain.c
@@ -1975,6 +1975,8 @@ void ForceEnableXamlSounds(HMODULE hWindowsUIXaml)
return;
// Patch DirectUI::ElementSoundPlayerService::ShouldPlaySound() to disregard XboxUtility::IsOnXbox() check
+
+#if defined(_M_X64)
// 74 ?? 39 59 ?? 75 ?? E8 ?? ?? ?? ?? 84 C0 75
// ^^ change jnz to jmp
PBYTE match = FindPattern(
@@ -1993,6 +1995,35 @@ void ForceEnableXamlSounds(HMODULE hWindowsUIXaml)
VirtualProtect(jnz, 1, flOldProtect, &flOldProtect);
}
}
+#elif defined(_M_ARM64)
+ // 1F 09 00 71 ?? ?? ?? 54 ?? 00 00 35 ?? ?? ?? ?? 08 1C 00 53 ?? ?? ?? ??
+ // ^^^^^^^^^^^ CBNZ -> B, CBZ -> NOP
+ PBYTE match = FindPattern(
+ mi.lpBaseOfDll,
+ mi.SizeOfImage,
+ "\x1F\x09\x00\x71\x00\x00\x00\x54\x00\x00\x00\x35\x00\x00\x00\x00\x08\x1C\x00\x53",
+ "xxxx???x?xxx????xxxx"
+ );
+ if (match)
+ {
+ match += 20;
+ DWORD currentInsn = *(DWORD*)match;
+ DWORD newInsn = ARM64_CBNZWToB(currentInsn);
+ if (!newInsn && ARM64_IsCBZW(currentInsn))
+ {
+ newInsn = 0xD503201F; // NOP
+ }
+ if (newInsn)
+ {
+ DWORD flOldProtect = 0;
+ if (VirtualProtect(match, 4, PAGE_EXECUTE_READWRITE, &flOldProtect))
+ {
+ *(DWORD*)match = newInsn;
+ VirtualProtect(match, 4, flOldProtect, &flOldProtect);
+ }
+ }
+ }
+#endif
}
BOOL IsXamlSoundsEnabled()
@@ -10738,6 +10769,19 @@ inline BOOL FollowJnz(PBYTE pJnz, PBYTE* pTarget, DWORD* pJnzSize)
return FALSE;
}
+UINT_PTR FileOffsetToRVA(PBYTE pBase, UINT_PTR offset)
+{
+ PIMAGE_DOS_HEADER pDosHeader = (PIMAGE_DOS_HEADER)pBase;
+ PIMAGE_NT_HEADERS pNtHeaders = (PIMAGE_NT_HEADERS)(pBase + pDosHeader->e_lfanew);
+ PIMAGE_SECTION_HEADER pSection = IMAGE_FIRST_SECTION(pNtHeaders);
+ for (int i = 0; i < pNtHeaders->FileHeader.NumberOfSections; i++, pSection++)
+ {
+ if (offset >= pSection->PointerToRawData && offset < pSection->PointerToRawData + pSection->SizeOfRawData)
+ return offset - pSection->PointerToRawData + pSection->VirtualAddress;
+ }
+ return 0;
+}
+
void TryToFindExplorerOffsets(HANDLE hExplorer, MODULEINFO* pmiExplorer, DWORD* pOffsets)
{
if (!pOffsets[0] || pOffsets[0] == 0xFFFFFFFF)
@@ -11032,6 +11076,7 @@ void TryToFindTwinuiPCShellOffsets(DWORD* pOffsets)
}
if (!pOffsets[7] || pOffsets[7] == 0xFFFFFFFF)
{
+#if defined(_M_X64)
// Ref: CMultitaskingViewManager::_CreateMTVHost()
// Inlined GetMTVHostKind()
// 4C 89 74 24 ?? ?? 8B ?? ?? 8B ?? 8B D7 48 8B CE E8 ?? ?? ?? ?? 8B
@@ -11071,9 +11116,23 @@ void TryToFindTwinuiPCShellOffsets(DWORD* pOffsets)
}
}
}
+#elif defined(_M_ARM64)
+ // F3 53 BE A9 F5 5B 01 A9 FD 7B ?? A9 FD 03 00 91 30 00 80 92 F5 03 04 AA B0 ?? 00 F9 F3 03 00 AA BF 02 00 F9 68 2E 40 F9 F6 03 03 AA B3 23 02 A9 ?? ?? 00 B5
+ PBYTE match = FindPattern(
+ pFile, dwSize,
+ "\xF3\x53\xBE\xA9\xF5\x5B\x01\xA9\xFD\x7B\x00\xA9\xFD\x03\x00\x91\x30\x00\x80\x92\xF5\x03\x04\xAA\xB0\x00\x00\xF9\xF3\x03\x00\xAA\xBF\x02\x00\xF9\x68\x2E\x40\xF9\xF6\x03\x03\xAA\xB3\x23\x02\xA9\x00\x00\x00\xB5",
+ "xxxxxxxxxx?xxxxxxxxxxxxxx?xxxxxxxxxxxxxxxxxxxxxx??xx"
+ );
+ if (match)
+ {
+ pOffsets[7] = FileOffsetToRVA(pFile, match - 4 - pFile);
+ printf("CMultitaskingViewManager::_CreateXamlMTVHost() = %lX\n", pOffsets[7]);
+ }
+#endif
}
if (!pOffsets[8] || pOffsets[8] == 0xFFFFFFFF)
{
+#if defined(_M_X64)
// Ref: CMultitaskingViewManager::_CreateMTVHost()
// Inlined GetMTVHostKind()
// 4C 89 74 24 ?? ?? 8B ?? ?? 8B ?? 8B D7 48 8B CE E8 ?? ?? ?? ?? 90
@@ -11109,6 +11168,19 @@ void TryToFindTwinuiPCShellOffsets(DWORD* pOffsets)
}
}
}
+#elif defined(_M_ARM64)
+ // F3 53 BC A9 F5 5B 01 A9 F7 13 00 F9 F9 17 00 F9 FB 1B 00 F9 FD 7B BC A9 FD 03 00 91 FF ?? 00 D1 30 00 80 92 FB 03 04 AA
+ PBYTE match = FindPattern(
+ pFile, dwSize,
+ "\xF3\x53\xBC\xA9\xF5\x5B\x01\xA9\xF7\x13\x00\xF9\xF9\x17\x00\xF9\xFB\x1B\x00\xF9\xFD\x7B\xBC\xA9\xFD\x03\x00\x91\xFF\x00\x00\xD1\x30\x00\x80\x92\xFB\x03\x04\xAA",
+ "xxxxxxxxxxxxxxxxxxxxxxxxxxxxx?xxxxxxxxxx"
+ );
+ if (match)
+ {
+ pOffsets[8] = FileOffsetToRVA(pFile, match - 4 - pFile);
+ printf("CMultitaskingViewManager::_CreateDCompMTVHost() = %lX\n", pOffsets[8]);
+ }
+#endif
}
}
@@ -11338,6 +11410,7 @@ BOOL FixStartMenuAnimation(LPMODULEINFO mi)
g_SMAnimationPatchOffsets.startExperienceManager_SingleViewShellExperienceEventHandler = 0x60;
// ### CStartExperienceManager::`vftable'{for `SingleViewShellExperienceEventHandler'}
+#if defined(_M_X64)
// ```
// 48 89 46 48 48 8D 05 ?? ?? ?? ?? 48 89 46 60 48 8D 4E 68 E8
// ^^^^^^^^^^^
@@ -11353,48 +11426,132 @@ BOOL FixStartMenuAnimation(LPMODULEINFO mi)
{
matchVtable += 4;
matchVtable += 7 + *(int*)(matchVtable + 3);
+ }
+#elif defined(_M_ARM64)
+ // ```
+ // 69 22 04 A9 ?? ?? 00 ?? 08 81 ?? 91 60 A2 01 91 68 32 00 F9
+ // ^^^^^^^^^^^+^^^^^^^^^^^
+ PBYTE matchVtable = FindPattern(
+ mi->lpBaseOfDll,
+ mi->SizeOfImage,
+ "\x69\x22\x04\xA9\x00\x00\x00\x00\x08\x81\x00\x91\x60\xA2\x01\x91\x68\x32\x00\xF9",
+ "xxxx??x?xx?xxxxxxxxx"
+ );
+ if (matchVtable)
+ {
+ matchVtable += 4;
+ matchVtable = ARM64_DecodeADRL((DWORD*)matchVtable, (DWORD*)(matchVtable + 4));
+ }
+#endif
+ if (matchVtable)
+ {
printf("[SMA] matchVtable = %llX\n", matchVtable - (PBYTE)mi->lpBaseOfDll);
}
// ### Offset of SingleViewShellExperience instance and its event handler
+#if defined(_M_X64)
// ```
- // 48 8D 8E ?? ?? ?? ?? 44 8D 45 ?? 48 8D 56 60 E8
+ // 48 8D 8E ?? ?? ?? ?? 44 8D 45 41 48 8D 56 60 E8
// ^^^^^^^^^^^ SVSE ^^ SVSEEH (hardcoded to 0x60, included in pattern for sanity check)
// ```
// Ref: CStartExperienceManager::CStartExperienceManager()
PBYTE matchSingleViewShellExperienceFields = FindPattern(
mi->lpBaseOfDll,
mi->SizeOfImage,
- "\x48\x8D\x8E\x00\x00\x00\x00\x44\x8D\x45\x00\x48\x8D\x56\x60\xE8",
- "xxx????xxx?xxxxx"
+ "\x48\x8D\x8E\x00\x00\x00\x00\x44\x8D\x45\x41\x48\x8D\x56\x60\xE8",
+ "xxx????xxxxxxxxx"
);
if (matchSingleViewShellExperienceFields)
{
g_SMAnimationPatchOffsets.startExperienceManager_singleViewShellExperience = *(int*)(matchSingleViewShellExperienceFields + 3);
+ }
+#elif defined(_M_ARM64)
+ // ```
+ // 22 08 80 52 61 82 01 91 60 ?? ?? 91 ?? ?? ?? ?? 1F 20 03 D5
+ // ^^^SVSEEH^^ ^^^^^^^^^^^ SVSE
+ // ```
+ // Ref: CStartExperienceManager::CStartExperienceManager()
+ PBYTE matchSingleViewShellExperienceFields = FindPattern(
+ mi->lpBaseOfDll,
+ mi->SizeOfImage,
+ "\x22\x08\x80\x52\x61\x82\x01\x91\x60\x00\x00\x91\x00\x00\x00\x00\x1F\x20\x03\xD5",
+ "xxxxxxxxx??x????xxxx"
+ );
+ if (matchSingleViewShellExperienceFields)
+ {
+ g_SMAnimationPatchOffsets.startExperienceManager_singleViewShellExperience = (int)ARM64_DecodeADD(*(DWORD*)(matchSingleViewShellExperienceFields + 8));
+ }
+#endif
+ if (matchSingleViewShellExperienceFields)
+ {
printf("[SMA] matchSingleViewShellExperienceFields = %llX\n", matchSingleViewShellExperienceFields - (PBYTE)mi->lpBaseOfDll);
}
// ### Offsets of Animation Helpers
+ PBYTE matchAnimationHelperFields = NULL;
+#if defined(_M_X64)
// ```
// 40 88 AE ?? ?? ?? ?? C7 86 ?? ?? ?? ?? 38 00 00 00
// ^^^^^^^^^^^ AH1
// ```
// Ref: CStartExperienceManager::CStartExperienceManager()
// AH2 is located right after AH1. AH is 32 bytes
- PBYTE matchAnimationHelperFields = FindPattern(
- mi->lpBaseOfDll,
- mi->SizeOfImage,
- "\x40\x88\xAE\x00\x00\x00\x00\xC7\x86\x00\x00\x00\x00\x38\x00\x00\x00",
- "xxx????xx????xxxx"
- );
+ if (matchSingleViewShellExperienceFields)
+ {
+ matchAnimationHelperFields = FindPattern(
+ matchSingleViewShellExperienceFields + 16,
+ 128,
+ "\x40\x88\xAE\x00\x00\x00\x00\xC7\x86\x00\x00\x00\x00\x38\x00\x00\x00",
+ "xxx????xx????xxxx"
+ );
+ }
if (matchAnimationHelperFields)
{
g_SMAnimationPatchOffsets.startExperienceManager_openingAnimation = *(int*)(matchAnimationHelperFields + 3);
g_SMAnimationPatchOffsets.startExperienceManager_closingAnimation = g_SMAnimationPatchOffsets.startExperienceManager_openingAnimation + 32;
- printf("[SMA] matchAnimationHelperFields = %llX\n", matchAnimationHelperFields - (PBYTE)mi->lpBaseOfDll);
+ }
+#elif defined(_M_ARM64)
+ // ```
+ // 08 07 80 52 7F ?? ?? 39 68 ?? ?? B9
+ // ^^^^^^^^^^^ AH1
+ // ```
+ // Ref: CStartExperienceManager::CStartExperienceManager()
+ // AH2 is located right after AH1. AH is 32 bytes
+ if (matchSingleViewShellExperienceFields)
+ {
+ matchAnimationHelperFields = FindPattern(
+ matchSingleViewShellExperienceFields + 20,
+ 128,
+ "\x08\x07\x80\x52\x7F\x00\x00\x39\x68\x00\x00\xB9",
+ "xxxxx??xx??x"
+ );
+ }
+ if (matchAnimationHelperFields)
+ {
+ int openingAnimation = (int)ARM64_DecodeSTRBIMM(*(DWORD*)(matchAnimationHelperFields + 4));
+ if (openingAnimation != -1)
+ {
+ g_SMAnimationPatchOffsets.startExperienceManager_openingAnimation = openingAnimation;
+ g_SMAnimationPatchOffsets.startExperienceManager_closingAnimation = g_SMAnimationPatchOffsets.startExperienceManager_openingAnimation + 32;
+ }
+ else
+ {
+ matchAnimationHelperFields = NULL;
+ }
+ }
+#endif
+ if (matchAnimationHelperFields)
+ {
+ printf(
+ "[SMA] matchAnimationHelperFields = %llX, +0x%X, +0x%X\n",
+ matchAnimationHelperFields - (PBYTE)mi->lpBaseOfDll,
+ g_SMAnimationPatchOffsets.startExperienceManager_openingAnimation,
+ g_SMAnimationPatchOffsets.startExperienceManager_closingAnimation
+ );
}
// ### Offset of bTransitioningToCortana
+#if defined(_M_X64)
// ```
// 80 B9 ?? ?? ?? ?? 00 75 ?? 48 83 C1 D8
// ^^^^^^^^^^^ bTransitioningToCortana
@@ -11405,14 +11562,43 @@ BOOL FixStartMenuAnimation(LPMODULEINFO mi)
mi->SizeOfImage,
"\x80\xB9\x00\x00\x00\x00\x00\x75\x00\x48\x83\xC1\xD8",
"xx????xx?xxxx"
- );
+ );
if (matchTransitioningToCortanaField)
{
g_SMAnimationPatchOffsets.startExperienceManager_bTransitioningToCortana = g_SMAnimationPatchOffsets.startExperienceManager_IStartExperienceManager + *(int*)(matchTransitioningToCortanaField + 2);
- printf("[SMA] matchTransitioningToCortanaField = %llX\n", matchTransitioningToCortanaField - (PBYTE)mi->lpBaseOfDll);
+ }
+#elif defined(_M_ARM64)
+ // ```
+ // ?? ?? ?? 39 E8 00 00 35 ?? ?? ?? ?? 01 ?? ?? 91 22 00 80 52
+ // ^^^^^^^^^^^ bTransitioningToCortana
+ // ```
+ // Ref: CStartExperienceManager::DimStart()
+ PBYTE matchTransitioningToCortanaField = FindPattern(
+ mi->lpBaseOfDll,
+ mi->SizeOfImage,
+ "\x39\xE8\x00\x00\x35\x00\x00\x00\x00\x01\x00\x00\x91\x22\x00\x80\x52",
+ "xxxxx????x??xxxxx"
+ );
+ if (matchTransitioningToCortanaField)
+ {
+ int off = (int)ARM64_DecodeLDRBIMM(*(DWORD*)(matchTransitioningToCortanaField - 3));
+ if (off != -1)
+ {
+ g_SMAnimationPatchOffsets.startExperienceManager_bTransitioningToCortana = g_SMAnimationPatchOffsets.startExperienceManager_IStartExperienceManager + off;
+ }
+ else
+ {
+ matchTransitioningToCortanaField = NULL;
+ }
+ }
+#endif
+ if (matchTransitioningToCortanaField)
+ {
+ printf("[SMA] matchTransitioningToCortanaField = %llX, +0x%X\n", matchTransitioningToCortanaField - (PBYTE)mi->lpBaseOfDll, g_SMAnimationPatchOffsets.startExperienceManager_bTransitioningToCortana);
}
// ### Offset of CStartExperienceManager::GetMonitorInformation()
+#if defined(_M_X64)
// ```
// 48 8B ?? E8 ?? ?? ?? ?? 8B ?? 85 C0 0F 88 ?? ?? ?? ?? C6 44 24 ?? 01
// ^^^^^^^^^^^
@@ -11428,11 +11614,35 @@ BOOL FixStartMenuAnimation(LPMODULEINFO mi)
{
matchGetMonitorInformation += 3;
matchGetMonitorInformation += 5 + *(int*)(matchGetMonitorInformation + 1);
+ }
+#elif defined(_M_ARM64)
+ // * Pattern for 261xx:
+ // ```
+ // E2 82 00 91 E1 03 13 AA E0 03 14 AA ?? ?? ?? ??
+ // ^^^^^^^^^^^
+ // ```
+ // * Different patterns needed for 226xx and 262xx+
+ // Ref: CStartExperienceManager::PositionMenu()
+ PBYTE matchGetMonitorInformation = FindPattern(
+ mi->lpBaseOfDll,
+ mi->SizeOfImage,
+ "\xE2\x82\x00\x91\xE1\x03\x13\xAA\xE0\x03\x14\xAA",
+ "xxxxxxxxxxxx"
+ );
+ if (matchGetMonitorInformation)
+ {
+ matchGetMonitorInformation += 12;
+ matchGetMonitorInformation = (PBYTE)ARM64_FollowBL((DWORD*)matchGetMonitorInformation);
+ }
+#endif
+ if (matchGetMonitorInformation)
+ {
CStartExperienceManager_GetMonitorInformationFunc = matchGetMonitorInformation;
printf("[SMA] CStartExperienceManager::GetMonitorInformation() = %llX\n", matchGetMonitorInformation - (PBYTE)mi->lpBaseOfDll);
}
// ### Offset of CExperienceManagerAnimationHelper::Begin()
+#if defined(_M_X64)
// * Pattern 1, used when all arguments are available:
// ```
// 44 8B C7 E8 ?? ?? ?? ?? 85 C0 79 19
@@ -11469,6 +11679,30 @@ BOOL FixStartMenuAnimation(LPMODULEINFO mi)
matchAnimationBegin += 5 + *(int*)(matchAnimationBegin + 1);
}
}
+#elif defined(_M_ARM64)
+ // * Pattern 1, used when all arguments are available:
+ // ```
+ // Not implemented
+ //
+ // ```
+ // * Pattern 2, used when a4, a5, and a6 are optimized out (e.g. 26020, 26058):
+ // ```
+ // 82 02 0B 32 67 ?? ?? 91 60 ?? ?? 91 ?? ?? ?? ?? E3 03 00 2A
+ // ^^^^^^^^^^^
+ // ```
+ // Ref: CJumpViewExperienceManager::OnViewUncloaking()
+ PBYTE matchAnimationBegin = FindPattern(
+ mi->lpBaseOfDll,
+ mi->SizeOfImage,
+ "\x82\x02\x0B\x32\x67\x00\x00\x91\x60\x00\x00\x91\x00\x00\x00\x00\xE3\x03\x00\x2A",
+ "xxxxx??xx??x????xxxx"
+ );
+ if (matchAnimationBegin)
+ {
+ matchAnimationBegin += 12;
+ matchAnimationBegin = (PBYTE)ARM64_FollowBL((DWORD*)matchAnimationBegin);
+ }
+#endif
if (matchAnimationBegin)
{
CExperienceManagerAnimationHelper_BeginFunc = matchAnimationBegin;
@@ -11476,6 +11710,7 @@ BOOL FixStartMenuAnimation(LPMODULEINFO mi)
}
// ### Offset of CExperienceManagerAnimationHelper::End()
+#ifdef _M_X64
// ```
// 40 53 48 83 EC 20 80 39 00 74
// ```
@@ -11485,6 +11720,22 @@ BOOL FixStartMenuAnimation(LPMODULEINFO mi)
"\x40\x53\x48\x83\xEC\x20\x80\x39\x00\x74",
"xxxxxxxxxx"
);
+#elif defined(_M_ARM64)
+ // ```
+ // 7F 23 03 D5 F3 0F 1F F8 FD 7B BF A9 FD 03 00 91 08 00 40 39
+ // ----------- PACIBSP, don't scan for this because it's everywhere
+ // ```
+ PBYTE matchAnimationEnd = FindPattern(
+ mi->lpBaseOfDll,
+ mi->SizeOfImage,
+ "\xF3\x0F\x1F\xF8\xFD\x7B\xBF\xA9\xFD\x03\x00\x91\x08\x00\x40\x39",
+ "xxxxxxxxxxxxxxxx"
+ );
+ if (matchAnimationEnd)
+ {
+ matchAnimationEnd -= 4;
+ }
+#endif
if (matchAnimationEnd)
{
CExperienceManagerAnimationHelper_EndFunc = matchAnimationEnd;
@@ -11492,6 +11743,7 @@ BOOL FixStartMenuAnimation(LPMODULEINFO mi)
}
// ### CStartExperienceManager::Hide()
+#ifdef _M_X64
// * Pattern 1, mov [rbx+2A3h], r12b:
// ```
// 74 ?? ?? 03 00 00 00 44 88
@@ -11549,6 +11801,36 @@ BOOL FixStartMenuAnimation(LPMODULEINFO mi)
}
}
}
+#elif defined(_M_ARM64)
+ // ```
+ // ?? ?? ?? 34 ?? 00 80 52 ?? 8E 0A 39
+ // ^^^^^^^^^^^ Turn CBZ into B
+ // ```
+ // Perform on exactly two matches
+ PBYTE matchHideA = FindPattern(
+ mi->lpBaseOfDll,
+ mi->SizeOfImage,
+ "\x34\x00\x00\x80\x52\x00\x8E\x0A\x39",
+ "x?xxx?xxx"
+ );
+ PBYTE matchHideB = NULL;
+ if (matchHideA)
+ {
+ matchHideA -= 3;
+ printf("[SMA] matchHideA in CStartExperienceManager::Hide() = %llX\n", matchHideA - (PBYTE)mi->lpBaseOfDll);
+ matchHideB = FindPattern(
+ matchHideA + 12,
+ mi->SizeOfImage - (matchHideA + 12 - (PBYTE)mi->lpBaseOfDll),
+ "\x34\x00\x00\x80\x52\x00\x8E\x0A\x39",
+ "x?xxx?xxx"
+ );
+ if (matchHideB)
+ {
+ matchHideB -= 3;
+ printf("[SMA] matchHideB in CStartExperienceManager::Hide() = %llX\n", matchHideB - (PBYTE)mi->lpBaseOfDll);
+ }
+ }
+#endif
if (!matchVtable
|| !matchSingleViewShellExperienceFields
@@ -11616,18 +11898,37 @@ BOOL FixStartMenuAnimation(LPMODULEINFO mi)
}
}
- if (VirtualProtect(matchHideA + 11, 1, PAGE_EXECUTE_READWRITE, &dwOldProtect))
+#if defined(_M_X64)
+ if (VirtualProtect(matchHideA, 1, PAGE_EXECUTE_READWRITE, &dwOldProtect))
{
matchHideA[0] = 0xEB;
- VirtualProtect(matchHideA + 11, 1, dwOldProtect, &dwOldProtect);
+ VirtualProtect(matchHideA, 1, dwOldProtect, &dwOldProtect);
dwOldProtect = 0;
- if (VirtualProtect(matchHideB + 11, 1, PAGE_EXECUTE_READWRITE, &dwOldProtect))
+ if (VirtualProtect(matchHideB, 1, PAGE_EXECUTE_READWRITE, &dwOldProtect))
{
matchHideB[0] = 0xEB;
- VirtualProtect(matchHideB + 11, 1, dwOldProtect, &dwOldProtect);
+ VirtualProtect(matchHideB, 1, dwOldProtect, &dwOldProtect);
}
}
+#elif defined(_M_ARM64)
+ if (VirtualProtect(matchHideA, 4, PAGE_EXECUTE_READWRITE, &dwOldProtect))
+ {
+ DWORD newInsn = ARM64_CBZWToB(*(DWORD*)matchHideA);
+ if (newInsn)
+ *(DWORD*)matchHideA = newInsn;
+ VirtualProtect(matchHideA, 4, dwOldProtect, &dwOldProtect);
+
+ dwOldProtect = 0;
+ if (VirtualProtect(matchHideB, 4, PAGE_EXECUTE_READWRITE, &dwOldProtect))
+ {
+ newInsn = ARM64_CBZWToB(*(DWORD*)matchHideB);
+ if (newInsn)
+ *(DWORD*)matchHideB = newInsn;
+ VirtualProtect(matchHideB, 4, dwOldProtect, &dwOldProtect);
+ }
+ }
+#endif
return TRUE;
}
@@ -13431,7 +13732,7 @@ void StartMenu_LoadSettings(BOOL bRestartIfChanged)
&dwVal,
&dwSize
);
- if (InterlockedExchange64(&dwTaskbarAl, dwVal) != dwVal)
+ if (InterlockedExchange(&dwTaskbarAl, dwVal) != dwVal)
{
StartUI_EnableRoundedCornersApply = TRUE;
StartDocked_DisableRecommendedSectionApply = TRUE;
@@ -13647,6 +13948,7 @@ static BOOL StartMenu_FixContextMenuXbfHijackMethod()
if (!StartMenu_FillParserBuffer(&g_EmptyRefreshedStylesXbfBuffer, IDR_REFRESHEDSTYLES_XBF))
return FALSE;
+#if defined(_M_X64)
// 49 89 43 C8 E8 ?? ?? ?? ?? 85 C0
// ^^^^^^^^^^^
// Ref: CCoreServices::LoadXamlResource()
@@ -13661,6 +13963,25 @@ static BOOL StartMenu_FixContextMenuXbfHijackMethod()
match += 4;
match += 5 + *(int*)(match + 1);
+#elif defined(_M_ARM64)
+ // E1 0B 40 F9 05 00 80 D2 04 00 80 D2 E3 03 ?? AA E2 03 ?? AA E0 03 ?? AA ?? ?? ?? 97
+ // ^^^^^^^^^^^
+ // Ref: CoreServices_TryGetApplicationResource()
+ PBYTE match = FindPattern(
+ mi.lpBaseOfDll,
+ mi.SizeOfImage,
+ "\xE1\x0B\x40\xF9\x05\x00\x80\xD2\x04\x00\x80\xD2\xE3\x03\x00\xAA\xE2\x03\x00\xAA\xE0\x03\x00\xAA\x00\x00\x00\x97",
+ "xxxxxxxxxxxxxx?xxx?xxx?x???x"
+ );
+ if (!match)
+ return FALSE;
+
+ match += 24;
+ match = (PBYTE)ARM64_FollowBL((DWORD*)match);
+ if (!match)
+ return FALSE;
+#endif
+
CCoreServices_TryLoadXamlResourceHelperFunc = match;
funchook_prepare(
funchook,
@@ -13685,6 +14006,7 @@ void StartUI_UserTileView_AppendMenuFlyoutItemCommandHook(void* _this, void* men
static void StartMenu_FixUserTileMenu(MODULEINFO* mi)
{
+#if defined(_M_X64)
// 41 B9 03 00 00 00 4D 8B C4 ?? 8B D6 49 8B CD E8 ?? ?? ?? ??
// ^^^^^^^^^^^
// Ref: ::operator()
@@ -13698,6 +14020,26 @@ static void StartMenu_FixUserTileMenu(MODULEINFO* mi)
{
match += 15;
match += 5 + *(int*)(match + 1);
+ }
+#elif defined(_M_ARM64)
+ // 63 00 80 52 E2 03 1B AA E1 03 14 AA E0 03 19 AA ?? ?? ?? 94
+ // ^^^^^^^^^^^
+ // Ref: ::operator()
+ PBYTE match = FindPattern(
+ mi->lpBaseOfDll,
+ mi->SizeOfImage,
+ "\x63\x00\x80\x52\xE2\x03\x1B\xAA\xE1\x03\x14\xAA\xE0\x03\x19\xAA\x00\x00\x00\x94",
+ "xxxxxxxxxxxxxxxx???x"
+ );
+ if (match)
+ {
+ match += 16;
+ match = (PBYTE)ARM64_FollowBL((DWORD*)match);
+ }
+#endif
+
+ if (match)
+ {
StartUI_UserTileView_AppendMenuFlyoutItemCommandFunc = match;
funchook_prepare(
funchook,
diff --git a/ExplorerPatcher/hooking.h b/ExplorerPatcher/hooking.h
index 39e0df9..15d391f 100644
--- a/ExplorerPatcher/hooking.h
+++ b/ExplorerPatcher/hooking.h
@@ -9,15 +9,14 @@
#if HOW_TO_HOOK == HOOK_WITH_FUNCHOOK
-#ifdef _M_ARM64
-#error Cannot compile for ARM64 using funchook. Change the source to hook with Detours and try again. Compilation aborted.
-#endif
-
#include
-#include
#pragma comment(lib, "funchook.lib")
#pragma comment(lib, "Psapi.lib") // required by funchook
+#if defined(_M_IX86) || defined(_M_X64)
#pragma comment(lib, "distorm.lib")
+#else
+#pragma comment(lib, "capstone.lib")
+#endif
#elif HOW_TO_HOOK == HOOK_WITH_DETOURS
diff --git a/ExplorerPatcher/utility.h b/ExplorerPatcher/utility.h
index 671e127..18db5fb 100644
--- a/ExplorerPatcher/utility.h
+++ b/ExplorerPatcher/utility.h
@@ -579,6 +579,114 @@ inline BOOL IncrementDLLReferenceCount(HINSTANCE hinst)
#ifdef _WIN64
PVOID FindPattern(PVOID pBase, SIZE_T dwSize, LPCSTR lpPattern, LPCSTR lpMask);
+#if _M_ARM64
+__forceinline DWORD ARM64_ReadBits(DWORD value, int h, int l)
+{
+ return (value >> l) & ((1 << (h - l + 1)) - 1);
+}
+
+__forceinline int ARM64_SignExtend(DWORD value, int numBits)
+{
+ DWORD mask = 1 << (numBits - 1);
+ if (value & mask)
+ value |= ~((1 << numBits) - 1);
+ return (int)value;
+}
+
+__forceinline int ARM64_ReadBitsSignExtend(DWORD insn, int h, int l)
+{
+ return ARM64_SignExtend(ARM64_ReadBits(insn, h, l), h - l + 1);
+}
+
+__forceinline BOOL ARM64_IsInRange(int value, int bitCount)
+{
+ int minVal = -(1 << (bitCount - 1));
+ int maxVal = (1 << (bitCount - 1)) - 1;
+ return value >= minVal && value <= maxVal;
+}
+
+__forceinline UINT_PTR ARM64_Align(UINT_PTR value, UINT_PTR alignment)
+{
+ return value & ~(alignment - 1);
+}
+
+__forceinline BOOL ARM64_IsCBZW(DWORD insn) { return ARM64_ReadBits(insn, 31, 24) == 0b00110100; }
+__forceinline BOOL ARM64_IsCBNZW(DWORD insn) { return ARM64_ReadBits(insn, 31, 24) == 0b00110101; }
+__forceinline BOOL ARM64_IsBL(DWORD insn) { return ARM64_ReadBits(insn, 31, 26) == 0b100101; }
+__forceinline BOOL ARM64_IsADRP(DWORD insn) { return (ARM64_ReadBits(insn, 31, 24) & ~0b01100000) == 0b10010000; }
+
+__forceinline DWORD* ARM64_FollowBL(DWORD* pInsnBL)
+{
+ DWORD insnBL = *pInsnBL;
+ if (!ARM64_IsBL(insnBL))
+ return NULL;
+ int imm26 = ARM64_ReadBitsSignExtend(insnBL, 25, 0);
+ return pInsnBL + imm26; // offset = imm26 * 4
+}
+
+__forceinline DWORD ARM64_MakeB(int imm26)
+{
+ if (!ARM64_IsInRange(imm26, 26))
+ return 0;
+ return 0b000101 << 26 | imm26 & (1 << 26) - 1;
+}
+
+__forceinline DWORD ARM64_CBZWToB(DWORD insnCBZW)
+{
+ if (!ARM64_IsCBZW(insnCBZW))
+ return 0;
+ int imm19 = ARM64_ReadBitsSignExtend(insnCBZW, 23, 5);
+ return ARM64_MakeB(imm19);
+}
+
+__forceinline DWORD ARM64_CBNZWToB(DWORD insnCBNZW)
+{
+ if (!ARM64_IsCBNZW(insnCBNZW))
+ return 0;
+ int imm19 = ARM64_ReadBitsSignExtend(insnCBNZW, 23, 5);
+ return ARM64_MakeB(imm19);
+}
+
+__forceinline DWORD ARM64_DecodeADD(DWORD insnADD)
+{
+ DWORD imm12 = ARM64_ReadBits(insnADD, 21, 10);
+ DWORD shift = ARM64_ReadBits(insnADD, 22, 22);
+ return imm12 << (shift * 12);
+}
+
+__forceinline DWORD ARM64_DecodeSTRBIMM(DWORD insnSTRBIMM)
+{
+ if (ARM64_ReadBits(insnSTRBIMM, 31, 22) != 0b0011100100)
+ return (DWORD)-1;
+ DWORD imm12 = ARM64_ReadBits(insnSTRBIMM, 21, 10);
+ return imm12;
+}
+
+__forceinline DWORD ARM64_DecodeLDRBIMM(DWORD insnLDRBIMM)
+{
+ if (ARM64_ReadBits(insnLDRBIMM, 31, 22) != 0b0011100101)
+ return (DWORD)-1;
+ DWORD imm12 = ARM64_ReadBits(insnLDRBIMM, 21, 10);
+ return imm12;
+}
+
+__forceinline void* ARM64_DecodeADRL(DWORD* pInsnADRP, DWORD* pInsnADD)
+{
+ if (!ARM64_IsADRP(*pInsnADRP))
+ return NULL;
+
+ UINT_PTR page = ARM64_Align((UINT_PTR)pInsnADRP, 0x1000);
+
+ DWORD adrp_immlo = ARM64_ReadBits(*pInsnADRP, 30, 29);
+ DWORD adrp_immhi = ARM64_ReadBits(*pInsnADRP, 23, 5);
+ DWORD adrp_imm = ((adrp_immhi << 2) | adrp_immlo) << 12;
+
+ DWORD add_imm = ARM64_DecodeADD(*pInsnADD);
+
+ return (void*)(page + adrp_imm + add_imm);
+}
+#endif
+
inline BOOL WINAPI PatchContextMenuOfNewMicrosoftIME(BOOL* bFound)
{
// huge thanks to @Simplestas: https://github.com/valinet/ExplorerPatcher/issues/598
@@ -589,6 +697,7 @@ inline BOOL WINAPI PatchContextMenuOfNewMicrosoftIME(BOOL* bFound)
MODULEINFO mi;
GetModuleInformation(GetCurrentProcess(), hInputSwitch, &mi, sizeof(mi));
+#if defined(_M_X64)
// 44 38 ?? ?? 74 ?? ?? 8B CE E8 ?? ?? ?? ?? 85 C0
// ^^ Change jz into jmp
PBYTE match = (PBYTE)FindPattern(
@@ -609,6 +718,34 @@ inline BOOL WINAPI PatchContextMenuOfNewMicrosoftIME(BOOL* bFound)
VirtualProtect(match + 4, 1, dwOldProtect, &dwOldProtect);
return TRUE;
+#elif defined(_M_ARM64)
+ // A8 43 40 39 C8 04 00 34 E0 03 14 AA
+ // ^^^^^^^^^^^ Change CBZ to B
+ PBYTE match = (PBYTE)FindPattern(
+ hInputSwitch,
+ mi.SizeOfImage,
+ "\xA8\x43\x40\x39\xC8\x04\x00\x34\xE0\x03\x14\xAA",
+ "xxxxxxxxxxxx"
+ );
+ if (!match)
+ return FALSE;
+
+ match += 4;
+
+ DWORD newInsn = ARM64_CBZWToB(*(DWORD*)match);
+ if (!newInsn)
+ return FALSE;
+
+ DWORD dwOldProtect;
+ if (!VirtualProtect(match, 4, PAGE_EXECUTE_READWRITE, &dwOldProtect))
+ return FALSE;
+
+ *(DWORD*)match = newInsn;
+
+ VirtualProtect(match, 4, dwOldProtect, &dwOldProtect);
+
+ return TRUE;
+#endif
}
#endif
diff --git a/ep_extra/ep_extra.vcxproj b/ep_extra/ep_extra.vcxproj
index 88fa54a..d51c6dc 100644
--- a/ep_extra/ep_extra.vcxproj
+++ b/ep_extra/ep_extra.vcxproj
@@ -73,19 +73,19 @@
true
- $(SolutionDir)\build\$(Configuration)\
+ $(SolutionDir)\build\$(Configuration)\$(Platform)\
false
- $(SolutionDir)\build\$(Configuration)\
+ $(SolutionDir)\build\$(Configuration)\$(Platform)\
true
- $(SolutionDir)\build\$(Configuration)\
+ $(SolutionDir)\build\$(Configuration)\$(Platform)\
false
- $(SolutionDir)\build\$(Configuration)\
+ $(SolutionDir)\build\$(Configuration)\$(Platform)\
diff --git a/ep_extra_valinet.win7alttab/ep_extra_valinet.win7alttab.vcxproj b/ep_extra_valinet.win7alttab/ep_extra_valinet.win7alttab.vcxproj
index 5b1c73f..a948861 100644
--- a/ep_extra_valinet.win7alttab/ep_extra_valinet.win7alttab.vcxproj
+++ b/ep_extra_valinet.win7alttab/ep_extra_valinet.win7alttab.vcxproj
@@ -71,16 +71,16 @@
- $(SolutionDir)\build\$(Configuration)\
+ $(SolutionDir)\build\$(Configuration)\$(Platform)\
- $(SolutionDir)\build\$(Configuration)\
+ $(SolutionDir)\build\$(Configuration)\$(Platform)\
- $(SolutionDir)\build\$(Configuration)\
+ $(SolutionDir)\build\$(Configuration)\$(Platform)\
- $(SolutionDir)\build\$(Configuration)\
+ $(SolutionDir)\build\$(Configuration)\$(Platform)\
diff --git a/ep_generate_release_description/ep_generate_release_description.vcxproj b/ep_generate_release_description/ep_generate_release_description.vcxproj
index a23df48..ef6dc57 100644
--- a/ep_generate_release_description/ep_generate_release_description.vcxproj
+++ b/ep_generate_release_description/ep_generate_release_description.vcxproj
@@ -72,19 +72,19 @@
true
- $(SolutionDir)\build\$(Configuration)\
+ $(SolutionDir)\build\$(Configuration)\$(Platform)\
false
- $(SolutionDir)\build\$(Configuration)\
+ $(SolutionDir)\build\$(Configuration)\$(Platform)\
true
- $(SolutionDir)\build\$(Configuration)\
+ $(SolutionDir)\build\$(Configuration)\$(Platform)\
false
- $(SolutionDir)\build\$(Configuration)\
+ $(SolutionDir)\build\$(Configuration)\$(Platform)\
diff --git a/ep_generate_release_name/ep_generate_release_name.vcxproj b/ep_generate_release_name/ep_generate_release_name.vcxproj
index e3c0fed..b70f657 100644
--- a/ep_generate_release_name/ep_generate_release_name.vcxproj
+++ b/ep_generate_release_name/ep_generate_release_name.vcxproj
@@ -72,19 +72,19 @@
true
- $(SolutionDir)\build\$(Configuration)\
+ $(SolutionDir)\build\$(Configuration)\$(Platform)\
false
- $(SolutionDir)\build\$(Configuration)\
+ $(SolutionDir)\build\$(Configuration)\$(Platform)\
true
- $(SolutionDir)\build\$(Configuration)\
+ $(SolutionDir)\build\$(Configuration)\$(Platform)\
false
- $(SolutionDir)\build\$(Configuration)\
+ $(SolutionDir)\build\$(Configuration)\$(Platform)\
diff --git a/ep_gui/GUI.c b/ep_gui/GUI.c
index daca2de..97588e6 100644
--- a/ep_gui/GUI.c
+++ b/ep_gui/GUI.c
@@ -175,6 +175,8 @@ LONG NTAPI OnVex(PEXCEPTION_POINTERS ExceptionInfo)
Eip
#elif defined (_AMD64_)
Rip
+#elif defined(_M_ARM64)
+ Pc
#else
#error not implemented
#endif
@@ -1818,6 +1820,7 @@ static BOOL GUI_Build(HDC hDC, HWND hwnd, POINT pt)
RegSetKeyValueW(HKEY_CURRENT_USER, _T(REGPATH), L"OldTaskbar", REG_DWORD, &dwOldTaskbar, sizeof(DWORD));
DWORD dwError = 0;
+#ifdef _M_X64
// https://stackoverflow.com/questions/50298722/win32-launching-a-highestavailable-child-process-as-a-normal-user-process
if (pvRtlQueryElevationFlags = GetProcAddress(GetModuleHandleW(L"ntdll"), "RtlQueryElevationFlags"))
{
@@ -1832,6 +1835,7 @@ static BOOL GUI_Build(HDC hDC, HWND hwnd, POINT pt)
if (SetThreadContext(GetCurrentThread(), &ctx))
{
+#endif
WCHAR wszExec[MAX_PATH * 2];
ZeroMemory(wszExec, MAX_PATH * 2 * sizeof(WCHAR));
wszExec[0] = L'"';
@@ -1854,7 +1858,7 @@ static BOOL GUI_Build(HDC hDC, HWND hwnd, POINT pt)
{
dwError = GetLastError();
}
-
+#ifdef _M_X64
ctx.Dr7 = 0x400;
ctx.Dr1 = 0;
SetThreadContext(GetCurrentThread(), &ctx);
@@ -1882,6 +1886,7 @@ static BOOL GUI_Build(HDC hDC, HWND hwnd, POINT pt)
{
dwError = GetLastError();
}
+#endif
dwSize = sizeof(DWORD);
RegGetValueW(HKEY_CURRENT_USER, _T(REGPATH), L"OldTaskbar", RRF_RT_DWORD, NULL, &dwOldTaskbar, &dwSize);
@@ -2091,6 +2096,7 @@ static BOOL GUI_Build(HDC hDC, HWND hwnd, POINT pt)
RegDeleteKeyValueW(HKEY_CURRENT_USER, _T(REGPATH), L"ImportOK");
DWORD dwError = 0;
+#ifdef _M_X64
// https://stackoverflow.com/questions/50298722/win32-launching-a-highestavailable-child-process-as-a-normal-user-process
if (pvRtlQueryElevationFlags = GetProcAddress(GetModuleHandleW(L"ntdll"), "RtlQueryElevationFlags"))
{
@@ -2105,6 +2111,7 @@ static BOOL GUI_Build(HDC hDC, HWND hwnd, POINT pt)
if (SetThreadContext(GetCurrentThread(), &ctx))
{
+#endif
WCHAR wszExec[MAX_PATH * 2];
ZeroMemory(wszExec, MAX_PATH * 2 * sizeof(WCHAR));
wszExec[0] = L'"';
@@ -2127,7 +2134,7 @@ static BOOL GUI_Build(HDC hDC, HWND hwnd, POINT pt)
{
dwError = GetLastError();
}
-
+#ifdef _M_X64
ctx.Dr7 = 0x400;
ctx.Dr1 = 0;
SetThreadContext(GetCurrentThread(), &ctx);
@@ -2155,6 +2162,7 @@ static BOOL GUI_Build(HDC hDC, HWND hwnd, POINT pt)
{
dwError = GetLastError();
}
+#endif
DWORD dwData = 0, dwSize = sizeof(DWORD);
RegGetValueW(HKEY_CURRENT_USER, _T(REGPATH), L"ImportOK", RRF_RT_DWORD, NULL, &dwData, &dwSize);
diff --git a/ep_gui/ep_gui.vcxproj b/ep_gui/ep_gui.vcxproj
index 26a106a..b2fb940 100644
--- a/ep_gui/ep_gui.vcxproj
+++ b/ep_gui/ep_gui.vcxproj
@@ -1,5 +1,6 @@
+
Debug
@@ -9,6 +10,14 @@
Release
x64
+
+ Debug
+ ARM64
+
+
+ Release
+ ARM64
+
17.0
@@ -16,7 +25,6 @@
{2351a0df-782c-4d74-85b7-0847d245d6b4}
epgui
10.0
- 0
@@ -32,10 +40,24 @@
true
Unicode
+
+ DynamicLibrary
+ true
+ v143
+ Unicode
+
+
+ DynamicLibrary
+ false
+ v143
+ true
+ Unicode
+
+
@@ -43,14 +65,28 @@
+
+
+
+
+
+
true
- $(SolutionDir)\build\$(Configuration)\
+ $(SolutionDir)\build\$(Configuration)\$(Platform)\
false
- $(SolutionDir)\build\$(Configuration)\
+ $(SolutionDir)\build\$(Configuration)\$(Platform)\
+
+
+ true
+ $(SolutionDir)\build\$(Configuration)\$(Platform)\
+
+
+ false
+ $(SolutionDir)\build\$(Configuration)\$(Platform)\
@@ -58,27 +94,21 @@
true
true
stdcpp20
- $(SolutionDir)libs\libvalinet;$(SolutionDir)libs\funchook\include;$(SolutionDir)libs\funchook\distorm\include;%(AdditionalIncludeDirectories)
+ $(SolutionDir)libs\libvalinet;$(SolutionDir)libs\funchook\include;%(AdditionalIncludeDirectories)
pch.h
Console
true
- $(SolutionDir)libs\funchook\build\Release\;%(AdditionalLibraryDirectories)
-
-
- WITH_ALT_TASKBAR_IMPL=1;%(PreprocessorDefinitions)
-
-
-
+
_DEBUG;%(PreprocessorDefinitions)
MultiThreadedDebug
-
+
true
true
@@ -90,6 +120,16 @@
true
+
+
+ $(SolutionDir)libs\funchook\build\Release\;%(AdditionalLibraryDirectories)
+
+
+
+
+ $(SolutionDir)libs\funchook\build-arm64\Release\;$(SolutionDir)libs\funchook\build-arm64\_deps\capstone-build\Release\;%(AdditionalLibraryDirectories)
+
+
@@ -111,6 +151,7 @@
+
@@ -129,5 +170,7 @@
This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.
+
+
\ No newline at end of file
diff --git a/ep_setup/ep_setup.c b/ep_setup/ep_setup.c
index d05c670..f504164 100644
--- a/ep_setup/ep_setup.c
+++ b/ep_setup/ep_setup.c
@@ -195,7 +195,11 @@ BOOL SetupUninstallEntry(BOOL bInstall, WCHAR* wszPath)
if (!dwLastError)
{
PathRemoveFileSpecW(wszPath + 1);
+#if defined(_M_X64)
wcscat_s(wszPath + 1, MAX_PATH - 2, L"\\" _T(PRODUCT_NAME) L".amd64.dll");
+#elif defined(_M_ARM64)
+ wcscat_s(wszPath + 1, MAX_PATH - 2, L"\\" _T(PRODUCT_NAME) L".arm64.dll");
+#endif
HMODULE hEP = LoadLibraryExW(wszPath + 1, NULL, LOAD_LIBRARY_AS_DATAFILE);
if (hEP)
{
@@ -499,6 +503,7 @@ int WINAPI wWinMain(
}
if (bOk) bOk = InstallResource(bInstall, hInstance, IDR_EP_IA32, wszPath, _T(PRODUCT_NAME) L".IA-32.dll");
if (bOk) bOk = InstallResource(bInstall, hInstance, IDR_EP_AMD64, wszPath, _T(PRODUCT_NAME) L".amd64.dll");
+ if (bOk) bOk = InstallResource(bInstall, hInstance, IDR_EP_ARM64, wszPath, _T(PRODUCT_NAME) L".arm64.dll");
if (bOk) bOk = InstallResource(bInstall, hInstance, IDR_EP_DWM, wszPath, L"ep_dwm.exe");
if (bOk) bOk = InstallResource(bInstall, hInstance, IDR_EP_WEATHER, wszPath, L"ep_weather_host.dll");
if (bOk) bOk = InstallResource(bInstall, hInstance, IDR_EP_WEATHER_STUB, wszPath, L"ep_weather_host_stub.dll");
@@ -815,7 +820,11 @@ int WINAPI wWinMain(
wszArgs[2] = L' ';
wszArgs[3] = L'"';
SHGetFolderPathW(NULL, SPECIAL_FOLDER, NULL, SHGFP_TYPE_CURRENT, wszArgs + 4);
+#if defined(_M_X64)
wcscat_s(wszArgs, MAX_PATH, _T(APP_RELATIVE_PATH) L"\\" _T(PRODUCT_NAME) L".amd64.dll\"");
+#elif defined(_M_ARM64)
+ wcscat_s(wszArgs, MAX_PATH, _T(APP_RELATIVE_PATH) L"\\" _T(PRODUCT_NAME) L".arm64.dll\"");
+#endif
wprintf(L"%s\n", wszArgs);
WCHAR wszApp[MAX_PATH * 2];
GetSystemDirectoryW(wszApp, MAX_PATH * 2);
@@ -845,6 +854,9 @@ int WINAPI wWinMain(
}
if (bOk) bOk = InstallResource(bInstall, hInstance, IDR_EP_IA32, wszPath, _T(PRODUCT_NAME) L".IA-32.dll");
if (bOk) bOk = InstallResource(bInstall, hInstance, IDR_EP_AMD64, wszPath, _T(PRODUCT_NAME) L".amd64.dll");
+#ifdef _M_ARM64
+ if (bOk) bOk = InstallResource(bInstall, hInstance, IDR_EP_ARM64, wszPath, _T(PRODUCT_NAME) L".arm64.dll");
+#endif
if (bOk) bOk = InstallResource(bInstall, hInstance, IDR_EP_GUI, wszPath, L"ep_gui.dll");
if (bOk) bOk = InstallResource(bInstall, hInstance, IDR_EP_DWM, wszPath, L"ep_dwm.exe");
if (bInstall)
@@ -860,7 +872,11 @@ int WINAPI wWinMain(
// C:\Windows
// + dxgi.dll
if (bOk) GetWindowsDirectoryW(wszPath, MAX_PATH);
+#ifdef _M_X64
if (bOk) bOk = InstallResource(bInstall, hInstance, IDR_EP_AMD64, wszPath, L"dxgi.dll");
+#elif defined(_M_ARM64)
+ if (bOk) bOk = InstallResource(bInstall, hInstance, IDR_EP_ARM64, wszPath, L"dxgi.dll");
+#endif
// --------------------------------------------------------------------------------
@@ -875,7 +891,11 @@ int WINAPI wWinMain(
// - pris2\Windows.UI.ShellCommon.en-US.pri
if (bOk) GetWindowsDirectoryW(wszPath, MAX_PATH);
if (bOk) wcscat_s(wszPath, MAX_PATH, L"\\SystemApps\\Microsoft.Windows.StartMenuExperienceHost_cw5n1h2txyewy");
+#ifdef _M_X64
if (bOk) bOk = InstallResource(bInstall, hInstance, IDR_EP_AMD64, wszPath, L"dxgi.dll");
+#elif defined(_M_ARM64)
+ if (bOk) bOk = InstallResource(bInstall, hInstance, IDR_EP_ARM64, wszPath, L"dxgi.dll");
+#endif
if (bOk) bOk = InstallResource(bInstall && IsWindows11(), hInstance, IDR_EP_STARTMENU, wszPath, L"wincorlib.dll");
if (bOk) bOk = DeleteResource(wszPath, L"wincorlib_orig.dll");
if (bOk && IsWindows11() && bInstall)
@@ -930,7 +950,11 @@ int WINAPI wWinMain(
// + dxgi.dll
if (bOk) GetWindowsDirectoryW(wszPath, MAX_PATH);
if (bOk) wcscat_s(wszPath, MAX_PATH, L"\\SystemApps\\ShellExperienceHost_cw5n1h2txyewy");
+#ifdef _M_X64
if (bOk && IsWindows11()) bOk = InstallResource(bInstall, hInstance, IDR_EP_AMD64, wszPath, L"dxgi.dll");
+#elif defined(_M_ARM64)
+ if (bOk && IsWindows11()) bOk = InstallResource(bInstall, hInstance, IDR_EP_ARM64, wszPath, L"dxgi.dll");
+#endif
// --------------------------------------------------------------------------------
diff --git a/ep_setup/ep_setup.vcxproj b/ep_setup/ep_setup.vcxproj
index a296fa8..f3dc52c 100644
--- a/ep_setup/ep_setup.vcxproj
+++ b/ep_setup/ep_setup.vcxproj
@@ -17,6 +17,14 @@
Release
x64
+
+ Debug
+ ARM64
+
+
+ Release
+ ARM64
+
16.0
@@ -52,6 +60,19 @@
true
Unicode
+
+ Application
+ true
+ v143
+ Unicode
+
+
+ Application
+ false
+ v143
+ true
+ Unicode
+
@@ -69,22 +90,36 @@
+
+
+
+
+
+
true
- $(SolutionDir)\build\$(Configuration)\
+ $(SolutionDir)\build\$(Configuration)\$(Platform)\
false
- $(SolutionDir)\build\$(Configuration)\
+ $(SolutionDir)\build\$(Configuration)\$(Platform)\
true
- $(SolutionDir)\build\$(Configuration)\
+ $(SolutionDir)\build\$(Configuration)\$(Platform)\
false
- $(SolutionDir)\build\$(Configuration)\
+ $(SolutionDir)\build\$(Configuration)\$(Platform)\
+
+
+ true
+ $(SolutionDir)\build\$(Configuration)\$(Platform)\
+
+
+ false
+ $(SolutionDir)\build\$(Configuration)\$(Platform)\
@@ -150,26 +185,68 @@
true
-
+
+
+ Level3
+ true
+ _DEBUG;_CONSOLE;%(PreprocessorDefinitions)
+ true
+ MultiThreadedDebug
+ $(SolutionDir)libs\libvalinet;%(AdditionalIncludeDirectories)
+
+
+ Windows
+ true
+
+
+
+
+ Level3
+ true
+ true
+ true
+ NDEBUG;_CONSOLE;%(PreprocessorDefinitions)
+ true
+ MultiThreaded
+ $(SolutionDir)libs\libvalinet;%(AdditionalIncludeDirectories)
+
+
+ Windows
+ true
+ true
+ true
+
+
+
EP_TASKBAR_2_EXISTS;%(PreprocessorDefinitions)
-
+
EP_TASKBAR_3_EXISTS;%(PreprocessorDefinitions)
-
+
EP_TASKBAR_4_EXISTS;%(PreprocessorDefinitions)
-
+
EP_TASKBAR_5_EXISTS;%(PreprocessorDefinitions)
+
+
+ PLATFORM_AMD64;%(PreprocessorDefinitions)
+
+
+
+
+ PLATFORM_ARM64;%(PreprocessorDefinitions)
+
+
@@ -180,60 +257,44 @@
- true
- true
+ true
- true
- true
+ true
- true
- true
+ true
- true
- true
+ true
- true
- true
+ true
- true
- true
+ true
- true
- true
+ true
- true
- true
-
-
-
-
+ true
- true
- true
+ true
- true
- true
+ true
- true
- true
+ true
- true
- true
+ true
diff --git a/ep_setup/resources/ep_setup.rc b/ep_setup/resources/ep_setup.rc
index c8261ed..819d624 100644
--- a/ep_setup/resources/ep_setup.rc
+++ b/ep_setup/resources/ep_setup.rc
@@ -90,36 +90,74 @@ END
// RCDATA
//
-IDR_EP_AMD64 RCDATA "..\\build\\Release\\ExplorerPatcher.amd64.dll"
+IDR_EP_AMD64 RCDATA "..\\build\\Release\\x64\\ExplorerPatcher.amd64.dll"
-IDR_EP_IA32 RCDATA "..\\build\\Release\\ExplorerPatcher.IA-32.dll"
+IDR_EP_IA32 RCDATA "..\\build\\Release\\Win32\\ExplorerPatcher.IA-32.dll"
-IDR_EP_DWM RCDATA "..\\build\\Release\\ep_dwm.exe"
+#ifdef PLATFORM_ARM64
+IDR_EP_ARM64 RCDATA "..\\build\\Release\\ARM64\\ExplorerPatcher.arm64.dll"
+#endif
+
+#if defined(PLATFORM_AMD64)
+
+IDR_EP_DWM RCDATA "..\\build\\Release\\x64\\ep_dwm.exe"
+
+IDR_EP_WEATHER RCDATA "..\\build\\Release\\x64\\ep_weather_host.dll"
+
+IDR_EP_WEATHER_STUB RCDATA "..\\build\\Release\\x64\\ep_weather_host_stub.dll"
+
+IDR_MS_WEBVIEW2_LOADER RCDATA "..\\build\\Release\\x64\\WebView2Loader.dll"
+
+IDR_EP_STARTMENU RCDATA "..\\build\\Release\\x64\\ep_startmenu.dll"
+
+IDR_EP_GUI RCDATA "..\\build\\Release\\x64\\ep_gui.dll"
+
+#if EP_TASKBAR_2_EXISTS
+IDR_EP_TASKBAR_2 RCDATA "..\\build\\Release\\x64\\ep_taskbar.2.dll"
+#endif
+
+#if EP_TASKBAR_3_EXISTS
+IDR_EP_TASKBAR_3 RCDATA "..\\build\\Release\\x64\\ep_taskbar.3.dll"
+#endif
+
+#if EP_TASKBAR_4_EXISTS
+IDR_EP_TASKBAR_4 RCDATA "..\\build\\Release\\x64\\ep_taskbar.4.dll"
+#endif
+
+#if EP_TASKBAR_5_EXISTS
+IDR_EP_TASKBAR_5 RCDATA "..\\build\\Release\\x64\\ep_taskbar.5.dll"
+#endif
+
+#elif defined(PLATFORM_ARM64)
-IDR_EP_WEATHER RCDATA "..\\build\\Release\\ep_weather_host.dll"
+IDR_EP_DWM RCDATA "..\\build\\Release\\ARM64\\ep_dwm.exe"
-IDR_EP_WEATHER_STUB RCDATA "..\\build\\Release\\ep_weather_host_stub.dll"
+IDR_EP_WEATHER RCDATA "..\\build\\Release\\ARM64\\ep_weather_host.dll"
-IDR_MS_WEBVIEW2_LOADER RCDATA "..\\build\\Release\\WebView2Loader.dll"
+IDR_EP_WEATHER_STUB RCDATA "..\\build\\Release\\ARM64\\ep_weather_host_stub.dll"
-IDR_EP_STARTMENU RCDATA "..\\build\\Release\\ep_startmenu.dll"
+IDR_MS_WEBVIEW2_LOADER RCDATA "..\\build\\Release\\ARM64\\WebView2Loader.dll"
-IDR_EP_GUI RCDATA "..\\build\\Release\\ep_gui.dll"
+IDR_EP_STARTMENU RCDATA "..\\build\\Release\\ARM64\\ep_startmenu.dll"
+
+IDR_EP_GUI RCDATA "..\\build\\Release\\ARM64\\ep_gui.dll"
#if EP_TASKBAR_2_EXISTS
-IDR_EP_TASKBAR_2 RCDATA "..\\build\\Release\\ep_taskbar.2.dll"
+IDR_EP_TASKBAR_2 RCDATA "..\\build\\Release\\ARM64\\ep_taskbar.2.dll"
#endif
#if EP_TASKBAR_3_EXISTS
-IDR_EP_TASKBAR_3 RCDATA "..\\build\\Release\\ep_taskbar.3.dll"
+IDR_EP_TASKBAR_3 RCDATA "..\\build\\Release\\ARM64\\ep_taskbar.3.dll"
#endif
#if EP_TASKBAR_4_EXISTS
-IDR_EP_TASKBAR_4 RCDATA "..\\build\\Release\\ep_taskbar.4.dll"
+IDR_EP_TASKBAR_4 RCDATA "..\\build\\Release\\ARM64\\ep_taskbar.4.dll"
#endif
#if EP_TASKBAR_5_EXISTS
-IDR_EP_TASKBAR_5 RCDATA "..\\build\\Release\\ep_taskbar.5.dll"
+IDR_EP_TASKBAR_5 RCDATA "..\\build\\Release\\ARM64\\ep_taskbar.5.dll"
+#endif
+
#endif
#endif // English (United States) resources
diff --git a/ep_setup/resources/resource.h b/ep_setup/resources/resource.h
index 4c149b2..cbcd830 100644
--- a/ep_setup/resources/resource.h
+++ b/ep_setup/resources/resource.h
@@ -4,6 +4,7 @@
//
#define IDR_EP_AMD64 103
#define IDR_EP_IA32 104
+#define IDR_EP_ARM64 114
#define IDR_EP_DWM 105
#define IDR_EP_WEATHER 106
#define IDR_EP_WEATHER_STUB 107
diff --git a/ep_setup_patch/ep_setup_patch.vcxproj b/ep_setup_patch/ep_setup_patch.vcxproj
index 8ba9d2b..6962843 100644
--- a/ep_setup_patch/ep_setup_patch.vcxproj
+++ b/ep_setup_patch/ep_setup_patch.vcxproj
@@ -72,19 +72,19 @@
true
- $(SolutionDir)\build\$(Configuration)\
+ $(SolutionDir)\build\$(Configuration)\$(Platform)\
false
- $(SolutionDir)\build\$(Configuration)\
+ $(SolutionDir)\build\$(Configuration)\$(Platform)\
true
- $(SolutionDir)\build\$(Configuration)\
+ $(SolutionDir)\build\$(Configuration)\$(Platform)\
false
- $(SolutionDir)\build\$(Configuration)\
+ $(SolutionDir)\build\$(Configuration)\$(Platform)\
diff --git a/ep_startmenu/ep_startmenu.vcxproj b/ep_startmenu/ep_startmenu.vcxproj
index b89bac5..21b40c5 100644
--- a/ep_startmenu/ep_startmenu.vcxproj
+++ b/ep_startmenu/ep_startmenu.vcxproj
@@ -17,6 +17,14 @@
Release
x64
+
+ Debug
+ ARM64
+
+
+ Release
+ ARM64
+
16.0
@@ -52,6 +60,19 @@
true
Unicode
+
+ DynamicLibrary
+ true
+ v143
+ Unicode
+
+
+ DynamicLibrary
+ false
+ v143
+ true
+ Unicode
+
@@ -69,25 +90,41 @@
+
+
+
+
+
+
true
- $(SolutionDir)\build\$(Configuration)\
+ $(SolutionDir)\build\$(Configuration)\$(Platform)\
$(ProjectName)
false
- $(SolutionDir)\build\$(Configuration)\
+ $(SolutionDir)\build\$(Configuration)\$(Platform)\
$(ProjectName)
true
- $(SolutionDir)\build\$(Configuration)\
+ $(SolutionDir)\build\$(Configuration)\$(Platform)\
$(ProjectName)
false
- $(SolutionDir)\build\$(Configuration)\
+ $(SolutionDir)\build\$(Configuration)\$(Platform)\
+ $(ProjectName)
+
+
+ true
+ $(SolutionDir)\build\$(Configuration)\$(Platform)\
+ $(ProjectName)
+
+
+ false
+ $(SolutionDir)\build\$(Configuration)\$(Platform)\
$(ProjectName)
@@ -154,6 +191,38 @@
true
+
+
+ Level3
+ true
+ _DEBUG;_CONSOLE;%(PreprocessorDefinitions)
+ true
+ MultiThreadedDebug
+ $(SolutionDir)libs\libvalinet;%(AdditionalIncludeDirectories)
+
+
+ Console
+ true
+
+
+
+
+ Level3
+ true
+ true
+ true
+ NDEBUG;_CONSOLE;%(PreprocessorDefinitions)
+ true
+ MultiThreaded
+ $(SolutionDir)libs\libvalinet;%(AdditionalIncludeDirectories)
+
+
+ Console
+ true
+ true
+ true
+
+
diff --git a/ep_weather_host/ep_weather_host.c b/ep_weather_host/ep_weather_host.c
index c6c340d..0d3c0e4 100644
--- a/ep_weather_host/ep_weather_host.c
+++ b/ep_weather_host/ep_weather_host.c
@@ -3,6 +3,8 @@
#include "ep_weather_provider_google_script.h"
#include "ep_weather_error_html.h"
+#include
+
RTL_OSVERSIONINFOW global_rovi;
DWORD32 global_ubr;
SYSTEMTIME stLastUpdate;
diff --git a/ep_weather_host/ep_weather_host.vcxproj b/ep_weather_host/ep_weather_host.vcxproj
index 8d40c19..1707745 100644
--- a/ep_weather_host/ep_weather_host.vcxproj
+++ b/ep_weather_host/ep_weather_host.vcxproj
@@ -17,6 +17,14 @@
Release
x64
+
+ Debug
+ ARM64
+
+
+ Release
+ ARM64
+
16.0
@@ -52,6 +60,19 @@
true
Unicode
+
+ DynamicLibrary
+ true
+ v143
+ Unicode
+
+
+ DynamicLibrary
+ false
+ v143
+ true
+ Unicode
+
@@ -69,22 +90,36 @@
+
+
+
+
+
+
true
- $(SolutionDir)\build\$(Configuration)\
+ $(SolutionDir)\build\$(Configuration)\$(Platform)\
false
- $(SolutionDir)\build\$(Configuration)\
+ $(SolutionDir)\build\$(Configuration)\$(Platform)\
true
- $(SolutionDir)\build\$(Configuration)\
+ $(SolutionDir)\build\$(Configuration)\$(Platform)\
false
- $(SolutionDir)\build\$(Configuration)\
+ $(SolutionDir)\build\$(Configuration)\$(Platform)\
+
+
+ true
+ $(SolutionDir)\build\$(Configuration)\$(Platform)\
+
+
+ false
+ $(SolutionDir)\build\$(Configuration)\$(Platform)\
@@ -152,6 +187,39 @@
true
+
+
+ Level3
+ true
+ WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)
+ true
+ MultiThreadedDebug
+ $(SolutionDir)debug.h
+ $(SolutionDir)libs\libvalinet;%(AdditionalIncludeDirectories)
+
+
+ Windows
+ true
+
+
+
+
+ Level3
+ true
+ true
+ true
+ WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)
+ true
+ MultiThreaded
+ $(SolutionDir)libs\libvalinet;%(AdditionalIncludeDirectories)
+
+
+ Windows
+ true
+ true
+ true
+
+
diff --git a/ep_weather_host_stub/ep_weather_host_stub.vcxproj b/ep_weather_host_stub/ep_weather_host_stub.vcxproj
index e910081..a5f3afb 100644
--- a/ep_weather_host_stub/ep_weather_host_stub.vcxproj
+++ b/ep_weather_host_stub/ep_weather_host_stub.vcxproj
@@ -17,6 +17,14 @@
Release
x64
+
+ Debug
+ ARM64
+
+
+ Release
+ ARM64
+
16.0
@@ -52,6 +60,19 @@
true
Unicode
+
+ DynamicLibrary
+ true
+ v143
+ Unicode
+
+
+ DynamicLibrary
+ false
+ v143
+ true
+ Unicode
+
@@ -69,22 +90,36 @@
+
+
+
+
+
+
true
- $(SolutionDir)\build\$(Configuration)\
+ $(SolutionDir)\build\$(Configuration)\$(Platform)\
false
- $(SolutionDir)\build\$(Configuration)\
+ $(SolutionDir)\build\$(Configuration)\$(Platform)\
true
- $(SolutionDir)\build\$(Configuration)\
+ $(SolutionDir)\build\$(Configuration)\$(Platform)\
false
- $(SolutionDir)\build\$(Configuration)\
+ $(SolutionDir)\build\$(Configuration)\$(Platform)\
+
+
+ true
+ $(SolutionDir)\build\$(Configuration)\$(Platform)\
+
+
+ false
+ $(SolutionDir)\build\$(Configuration)\$(Platform)\
@@ -154,22 +189,50 @@
ep_weather_host_stub.def
+
+
+ Level3
+ true
+ WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)
+ true
+ MultiThreadedDebug
+
+
+ Console
+ true
+ RpcRT4.lib;%(AdditionalDependencies)
+ ep_weather_host_stub.def
+
+
+
+
+ Level3
+ true
+ true
+ true
+ WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)
+ true
+ MultiThreaded
+
+
+ Console
+ true
+ true
+ true
+ RpcRT4.lib;%(AdditionalDependencies)
+ ep_weather_host_stub.def
+
+
- REGISTER_PROXY_DLL;%(PreprocessorDefinitions)
- REGISTER_PROXY_DLL;%(PreprocessorDefinitions)
- REGISTER_PROXY_DLL;%(PreprocessorDefinitions)
- REGISTER_PROXY_DLL;%(PreprocessorDefinitions)
+ REGISTER_PROXY_DLL;%(PreprocessorDefinitions)
- REGISTER_PROXY_DLL;%(PreprocessorDefinitions)
- REGISTER_PROXY_DLL;%(PreprocessorDefinitions)
- REGISTER_PROXY_DLL;%(PreprocessorDefinitions)
- REGISTER_PROXY_DLL;%(PreprocessorDefinitions)
+ REGISTER_PROXY_DLL;%(PreprocessorDefinitions)
diff --git a/libs/funchook b/libs/funchook
index f3928f9..2aca28e 160000
--- a/libs/funchook
+++ b/libs/funchook
@@ -1 +1 @@
-Subproject commit f3928f99f5ec77bf750c8c7ebaec44e44ba34257
+Subproject commit 2aca28efeb2a3b00c696e1c3e05b44581e118580