需要的项目地址
Magisk on WSA (with Google Apps)
操作步骤
本文以 Win10 22H2 (OS Build 19045.2364) + WSL2 Ubuntu 20.04 为例
PS:其实 WSA patch for Windows 10 的 README 写的非常清楚,直接比着做也不是不行。
安装包制作
参考 Magisk on WSA (with Google Apps) 在本地制作集成 Magisk 的 WSA 安装包。
以下内容翻自 Magisk on WSA (with Google Apps) README。
环境
需要 Linux 环境。Python 版本 ≥ 3.7
使用 run.sh 会自动安装所需的依赖。
步骤
- clone 项目到本地
- 切换到
scripts
目录下 - 如果想使用 CLI,可以运行
./build.sh --help
(可选)获取使用方法
- 切换到
- 在
scripts
目录下运行./run.sh
- 根据提示选择自己喜欢的版本。
- 等待程序运行(会下载一些需要科学的东西)
- 如果 aria2 在下载时报错:
[ERROR] [AbstractCommand.cc:349] CUID#11 - Download aborted. URI=*** Exception: [AbstractCommand.cc:351] errorCode=1 URI=*** -> [SocketCore.cc:1018] errorCode=1 SSL/TLS handshake failure: `not signed by known authorities or invalid' `expired'
可以在 `./build.sh` 中找到 `aria2` 命令加上选项 `--check-certificate=false`
- 如果 aria2 在下载时报错:
- 运行结束后会在
MagiskOnWSALocal
目录下出现download
和output
两个文件夹。 - 切换到
output
目录下,得到形如WSA-with-magisk-stable-MindTheGapps_2207.40000.8.0_x64_Release-Nightly
的压缩文件。
Patch
以下内容摘自 WSA patch for Windows 10 README
- 把你的 WSA AppX 包从 WSL2 里复制出来, 它应该是一个压缩包, 解压到你希望安装 WSA 的地方.
- 位于
MagiskOnWSALocal/output
, 文件名类似于WSA-with-magisk-stable-MindTheGapps_2210.40000.7.0_x64_Release-Nightly.7z
.
- 位于
- 用 Visual Studio 编译本仓库的代码,得到 WsaPatch.dll (用 MSVC 工具链编译,如果你不想自己编译,你可以去 release 里下).
- 想办法从 Windows 11 22H2 的 System32 里复制一个 icu.dll 过来,找一个 PE32+ 编辑工具给它的导入表加一个 WsaPatch.dll.
- 你必须用 Windows 11 22H2 里的 icu.dll, 因为 Windows 10 的 icu.dll 缺符号;
- 如果你没有 Windows 11 22H2, 本仓库的 original.dll.win11.22h2 就有原版带微软签名的 icu.dll;
- 如果你不想自己搞,你可以用 release 里已经修改过的 icu.dll.
- 把编译好的 WsaPatch.dll 和修改过的 icu.dll 复制到 WSA 的 WsaClient 文件夹.
- 按以下要求修改 AppxManifest.xml:
- 在
AppxManifest.xml
找到TargetDeviceFamily
节点<TargetDeviceFamily Name="Windows.Desktop" MinVersion="10.0.22000.120" MaxVersionTested="10.0.22000.120"/>
把
MinVersion
从10.0.22000.120
改成10.0.19045.2311
. -
在
AppxManifest.xml
删除 "customInstall" 相关节点,一共有两个.
找到以下内容,然后删掉.<rescap:Capability Name="customInstallActions"/>
<desktop6:Extension Category="windows.customInstall"> <desktop6:CustomInstall Folder="CustomInstall" desktop8:RunAsUser="true"> <desktop6:RepairActions> <desktop6:RepairAction File="WsaSetup.exe" Name="Repair" Arguments="repair"/> </desktop6:RepairActions> <desktop6:UninstallActions> <desktop6:UninstallAction File="WsaSetup.exe" Name="Uninstall" Arguments="uninstall"/> </desktop6:UninstallActions> </desktop6:CustomInstall> </desktop6:Extension>
- 在
- 运行
Run.bat
(需要管理员权限).
编译好的 WsaPatch.dll
和修改过的 icu.dll
可以从 release 页面 下载.
关于 winhttp.dll
- WsaClient.exe 会用 GetProcAddress 从 winhttp.dll 动态获取一些符号.
- 有些符号是只有在 Windows 11 的 winhttp.dll 里才有,Windows 10 的 winhttp.dll 缺少这些符号.
- 如果你在 WsaClient 文件夹建一个名为
EnableDebugConsole
的文件(没有扩展名)或者把 WsaPatch.cpp 里的wsapatch::kDebug
改成 true,
你能看到 GetProcAddress 有些结果是 NULL. - 如果你找一个 Windows 11 22H2 的 winhttp.dll 放到 WsaClient 文件夹里(或者 WSA 安装目录),WsaClient.exe 就能找到这些符号了.
- 但是不管 WsaClient.exe 能否找得到这些符号,它都能用.
12-10 16:16:29.474 W WsaPatch: -GetProcAddress: hModule=C:\WINDOWS\SYSTEM32\WINHTTP.dll(00007FFC64780000), lpProcName=WinHttpRegisterProxyChangeNotification, result=NULL
12-10 16:16:29.474 W WsaPatch: -GetProcAddress: hModule=C:\WINDOWS\SYSTEM32\WINHTTP.dll(00007FFC64780000), lpProcName=WinHttpUnregisterProxyChangeNotification, result=NULL
12-10 16:16:29.474 W WsaPatch: -GetProcAddress: hModule=C:\WINDOWS\SYSTEM32\WINHTTP.dll(00007FFC64780000), lpProcName=WinHttpGetProxySettingsEx, result=NULL
12-10 16:16:29.474 W WsaPatch: -GetProcAddress: hModule=C:\WINDOWS\SYSTEM32\WINHTTP.dll(00007FFC64780000), lpProcName=WinHttpGetProxySettingsResultEx, result=NULL
12-10 16:16:29.474 W WsaPatch: -GetProcAddress: hModule=C:\WINDOWS\SYSTEM32\WINHTTP.dll(00007FFC64780000), lpProcName=WinHttpFreeProxySettingsEx, result=NULL
Comments NOTHING