Skip to content

更新:换包前查出只读 DLL 和禁止删除的占用 - #149

Merged
qiyinxi merged 2 commits into
ModAVD:mainfrom
jinghero:codex/issue-191-busy-probe-20261113
Nov 13, 2026
Merged

qiyinxi merged 2 commits into
ModAVD:mainfrom
jinghero:codex/issue-191-busy-probe-20261113

Conversation

@jinghero

@jinghero jinghero commented Nov 13, 2026 •

Copy link
Copy Markdown
Collaborator

只读 DLL 已被程序载入,或文件被允许读写、但不共享删除的句柄打开时,原来的写探测会放行。现在会在备份、换 SDK 前报忙,保留已核对的暂存包,关闭占用程序后可以直接重试。

  • 增加 DELETE 权限探测。只读位遮住写共享冲突时,确认是否有进程实际载入了该文件。不把普通只读文件或 ACL 拒绝一律算作占用,也不挡住全共享读句柄下可删除的旧只读文件。
  • 占用检查、自更新替换和恢复三处统一比较真实路径,支持从目录链接进入根目录。载入模块也按实际文件路径比较,覆盖深目录和 8.3 短名。
  • 占用检查移到根目录文件备份之前,保留原来的暂存状态、启动锁和恢复顺序。

验证使用 Go 1.26.5、Windows amd64:

  • 先运行失败回归,再修复。真实 LoadLibrary、CreateFile、os.Open 和 ACL 拒绝覆盖两类漏检及阴性场景;普通、深目录和 8.3 短路径下的独立子进程加载只读 DLL,释放后不再报忙。
  • 有效目录符号链接下,用实际运行的测试程序覆盖自占用豁免、替换和恢复。真实读句柄阻止备份的用例证明报忙前没有尝试备份;被挡后暂存指纹、旧 SDK、文件和元数据保留,释放后重试成功。
  • 十项故意破坏均被行为断言检出,包含漏掉 DELETE、漏掉只读 DLL、把权限错误当占用、只按只读位判定、只比较字面路径、先备份、跳过检查、只查当前进程、去掉深路径回退和省略映射名规范化。
  • build.ps1 -Go <go1.26.5> -Out <临时输出目录>、gofmt -l .、Windows 的 go vet ./... 及 darwin/arm64、linux/amd64 交叉 vet 通过。构建后的 CLI version 可运行。
  • CI 中的 Node 显示坐标、磁盘、创建取消测试,以及 Python 隐私扫描、作者检查、仓库检查测试、trim 测试通过。

本机 go test ./... -count=1 的其他包均通过,包括完整 internal/update。其中 internal/avd 的测试程序在 Go 自动临时目录中反复遇到系统拒绝访问,拒绝来源未确认。用 go test -c -o <临时输出目录>/avd.test.exe ./internal/avd 编译后,在该包目录直接运行全部测试通过。没有修改安全软件配置。

模块查询仍是尽力检查:无法读取、正在退出或模块列表持续变化的进程,以及检查后才出现的占用,仍走现有换包报错和恢复路径。可写文件被全共享普通读句柄打开时,MoveFileEx 覆盖仍可能在探测后失败,这个已有场景未扩展。未做模拟器、游戏或生产实例验收。

Refs ModAVD/ModAVD#191

目录链接下的占用检查、自更新和恢复统一比较真实路径。先查占用再备份,被挡住时保留已核对的暂存包。
@qiyinxi
qiyinxi added this pull request to the merge queue Nov 13, 2026
Merged via the queue into ModAVD:main with commit ab243cf Nov 13, 2026
6 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants