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