需要的项目地址

WSA patch for Windows 10

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 会自动安装所需的依赖。

步骤

  1. clone 项目到本地
    • 切换到 scripts 目录下
    • 如果想使用 CLI,可以运行 ./build.sh --help (可选)获取使用方法
  2. scripts 目录下运行 ./run.sh
  3. 根据提示选择自己喜欢的版本。
  4. 等待程序运行(会下载一些需要科学的东西)
    • 如果 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`

  5. 运行结束后会在 MagiskOnWSALocal 目录下出现 downloadoutput 两个文件夹。
  6. 切换到 output 目录下,得到形如 WSA-with-magisk-stable-MindTheGapps_2207.40000.8.0_x64_Release-Nightly 的压缩文件。

Patch

以下内容摘自 WSA patch for Windows 10 README

  1. 把你的 WSA AppX 包从 WSL2 里复制出来, 它应该是一个压缩包, 解压到你希望安装 WSA 的地方.
    • 位于 MagiskOnWSALocal/output, 文件名类似于 WSA-with-magisk-stable-MindTheGapps_2210.40000.7.0_x64_Release-Nightly.7z.
  2. 用 Visual Studio 编译本仓库的代码,得到 WsaPatch.dll (用 MSVC 工具链编译,如果你不想自己编译,你可以去 release 里下).
  3. 想办法从 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.
  4. 把编译好的 WsaPatch.dll 和修改过的 icu.dll 复制到 WSA 的 WsaClient 文件夹.
  5. 按以下要求修改 AppxManifest.xml:
    1. AppxManifest.xml 找到 TargetDeviceFamily 节点
      <TargetDeviceFamily Name="Windows.Desktop" MinVersion="10.0.22000.120" MaxVersionTested="10.0.22000.120"/>
      

      MinVersion10.0.22000.120 改成 10.0.19045.2311.

    2. 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>
      
  6. 运行 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

可能遇到的问题

  1. 如果老版本的 WSA 2209.40000.26.0 开了开发者模式也连不上 ADB (端口没有进程监听), 更新到 WSA 2210.40000.7.0 就可以了.
  2. 移动 WSA 的设置窗口可以通过按住窗口最小化按钮左边的一小块空白区域然后拖动, 也可以通过按快捷键 Alt+Space 然后点弹出菜单里的 "移动".
    #1 #2
  3. 如果你的 WSA 在启动时闪退且没有任何提示,请将 Windows 10 更新到 22H2 10.0.19045.2311 或更高版本.
    (有人反应过 WSA 在 22H2 19045.2251 闪退, 但更新到 22H2 19045.2311 就能用了).
最后更新于 2023-02-01