Skip to content

fix: 拖拽卡死族回调隔离批——回调帧禁同步重操作、官方异步拖放协议与安全收口 - #546

Merged
Tianyu199509 merged 1 commit into
mainfrom
fix/callback-isolation-159
Oct 16, 2026
Merged

Tianyu199509 merged 1 commit into
mainfrom
fix/callback-isolation-159

Conversation

@Tianyu199509

Copy link
Copy Markdown
Owner

拖拽卡死族回调隔离批(1.5.9)

调查底档:artifacts/drag-freeze-family-20261014/(五路调查+五轮方案/实现审查+外部报告交叉核对)。

背景

拖拽卡死族的深层根因是代码库缺少一条不变式:消息/OLE/win32k 回调帧内禁止同步窗口手术、进程启动、跨进程 COM 写、大额磁盘物化。历史上 ≥7 起同族事故各自单独修复(yield/defer/轮询/看门狗各自为战)。本批把该不变式落地为机制+立法。

主要变更

  • 回调隔离层(D3):UiDispatch.PostAfterCallback 推迟原语(Ready 态永不 inline)+ CallbackDepth 雷达(14 个 subclass proc / IDropTarget 四方法 / 托盘命令全覆盖,违规计数常开并进入诊断包 schema 8)。托盘菜单、左键 toggle、DesktopPinned 四入口、标题栏抬组、搜索执行链、快捷方式拖启动全部移出回调帧,落地配"窗口存活+前台快照+真实移动"守卫。
  • 官方异步拖放协议(D2):虚拟文件物化改走 IDataObjectAsyncCapability(StartOperation→单 MTA worker 有界队列提取→完成后回执+EndOperation),Drop 回调立即返回;AppsFolder 提取在 UI STA 出帧执行(壳命名空间 API 不兼容 MTA);拒收路径全清理。
  • 安全收口:拖启动命令行仅接受磁盘存在路径(堵合成 CF_HDROP 参数注入);AppCompat 注册表清理白名单收敛(移除 HKCU Run 值吸收与任意目录同名兜底两个注入通道)。
  • 契约立法:file_drag_stack_contract.md §9.23(双轨细则+模态泵注记+已知未收口清单);§4.1/§6.2/§8.1.1a 三处历史勘误;zorder 坑[FR] 希望可以显示文件后缀名 #6 改写+坑widget architecture phase1 #10 新增。

验证

  • 全量测试 5525 通过(x64),新增回调隔离契约测试族与两个行为测试(P/Invoke 导出解析、VirtualDrops 清理白名单)。
  • 真机七轮验收全过:虚拟文件拖入(C)、快捷方式拖启动(B,FB#529)、标题栏拖动起手(M1)、DesktopPinned 四入口(多屏-断联时卡片堆叠在一起 #574 不闪)、F7+搜索链、负载托盘+IME 连打、讯飞机双线程互锁场景(D,全部轮次零冻结);测试期间雷达 0 违规、0 异常。

已知未收口(契约 §9.23 登记 12 项债)

设置页自启开关 10s 阻塞、叠放弹窗重命名链、设置页辅助窗口入口、AppCompat 反馈通道(债⑫)、新 Outlook 拖附件改道(债⑨)、VirtualDrops 启动清扫(债⑩)、固定层被遮键盘丢失(债⑭)、.crdownload 移动防护(债⑬)等——均为存量或已登记待拍板项,明细见契约。

拖拽卡死族修复(调查底档 artifacts/drag-freeze-family-20261014/;五轮方案审查+五轮实现审查+真机七轮验收,D 讯飞机场景全轮零冻结):

- 回调隔离层(D3):新增 UiDispatch.PostAfterCallback 推迟原语与 CallbackDepth 雷达(覆盖全部 14 个 subclass proc、IDropTarget 四方法、托盘命令;违规计数常开并入诊断包 schema 8 的 callbackRadar 区)。托盘菜单、托盘左键 toggle、DesktopPinned 激活/落床四入口、标题栏抬组、搜索执行链、快捷方式拖启动一律移出回调帧;落地配窗口存活+前台快照+真实移动(IsDragging&&HasMovedTitleBarDrag)守卫;托盘菜单重入抑制(单调钟+30 秒上界)。
- OLE Drop 减负(D2):虚拟文件物化改走官方 IDataObjectAsyncCapability 异步协议——StartOperation 于 Drop 返回前完成、单 MTA worker 有界队列(8)提取、完成后写回执+EndOperation;队列满与导入忙全路径拒收与临时文件清理。AppsFolder 提取移至 UI STA 出帧执行(壳命名空间 API 不兼容 MTA);DragEnter 保持严格 AppsFolder 分类。快捷方式拖启动拆分为同步占手势(WM_DROPFILES 双通道竞态)+推迟一帧启动,回执乐观 Link。
- 安全收口:拖启动命令行仅接受磁盘存在路径(堵合成 CF_HDROP 参数注入);AppCompat 清理白名单收敛为已知安装位置(移除 HKCU Run 值吸收与任意目录同名 DeskBox.exe 两个注入通道)。
- 附带修复:右键拖放选择菜单的 launchTarget 改为入队前捕获("打开方式"选项恒缺失,存量);S6 explorer 重启风暴插桩(>2 秒默认级告警引导抓 dump)。
- 契约:file_drag §9.23 回调帧内禁同步重操作立法(双轨细则+模态泵注记+挂起源暴露注记+已知未收口清单 12 项债);§4.1 Win10 跟随档勘误、§6.2 第三恢复入口登记、§8.1.1a 治理行更新;zorder 坑#6 改写+坑#10 新增。
- 测试:新增回调隔离契约测试族(含 P/Invoke 导出解析与 VirtualDrops 清理白名单两个行为测试);全量 5525 通过(x64)。
@Tianyu199509
Tianyu199509 merged commit 0982943 into main Oct 16, 2026
1 check passed
@Tianyu199509
Tianyu199509 deleted the fix/callback-isolation-159 branch October 16, 2026 12:46
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.

1 participant