90 lines
5.1 KiB
Markdown
90 lines
5.1 KiB
Markdown
# Windows 安全删除菜单仅保留真实 USB 存储(2026-11-05)
|
||
|
||
## 目标和现场证据
|
||
|
||
客户日常使用时,内置 GPU、网卡、系统盘控制器不应出现在安全删除菜单中;真实 U 盘
|
||
继续按插入、识别、安全弹出、物理拔出处理。这不是隐藏整个安全删除图标,也不改设备名称。
|
||
|
||
用户照片列出了 GTX 965M、VirtIO Ethernet、VirtIO Serial、标准 SATA AHCI 控制器。
|
||
Windows 实际查询四项的 DEVPKEY_Device_Capabilities 均为 6,即包含 EjectSupported (2)
|
||
和 Removable (4)。另一个内置 AHCI 控制器为 0,不能通过名称统一修改所有同名设备。
|
||
系统盘 QEMU HARDDISK 为 60GiB SATA 启动盘、Fixed hard disk media。
|
||
|
||
PVE USB 查询 device_present=false、channels=[]、仅有 USB Tablet。这说明移除空的
|
||
usb-redir 端点并不能消除菜单里的 PCI 设备。此前将托盘图标主要归因于 usb-redir 的判断
|
||
不完整;USB 动态端点功能与固定 PCI 设备属性需要分别验收。
|
||
|
||
## 准备的配置
|
||
|
||
保留原 GPU 子厂商参数、设备地址、磁盘总线和驱动,只为当前 Q35 VM 增加:
|
||
|
||
```text
|
||
-global ICH9-LPC.acpi-pci-hotplug-with-bridge-support=off
|
||
-global pci-bridge.shpc=off
|
||
-global pcie-root-port.hotplug=off
|
||
```
|
||
|
||
分别关闭 ACPI PCI、传统 PCI bridge SHPC、PCIe root port 热插拔。
|
||
关闭 ACPI 之后传统桥仍可能通过 SHPC 报告可移除,不能只关其中一项。
|
||
USB 控制器仍在,USB 总线设备的添加/删除独立于 PCI 热插拔。
|
||
取舍:以后增删这些内部 PCI 设备需要关机操作,不再支持对应 PCI 在线热插拔。
|
||
|
||
微软说明能力属性由设备驱动返回,为只读属性;DeviceOverrides 只改变 container ID
|
||
分组时对 Removable 的解释,不改变设备全局能力,不能作为可靠的托盘修复依据:
|
||
|
||
- https://learn.microsoft.com/en-us/windows-hardware/drivers/install/devpkey-device-capabilities
|
||
- https://learn.microsoft.com/en-us/windows-hardware/drivers/install/deviceoverrides-registry-key
|
||
- https://github.com/qemu/qemu/blob/master/hw/pci-bridge/pci_bridge_dev.c
|
||
|
||
## 部署状态(已应用并冷启动)
|
||
|
||
09:24 已在 PVE `/root/vdi-fixed-pci-20261105/` 保存工具;
|
||
`backup/vm.conf.before` 和 `backup/plan.json` 保存原配置和拟应用参数。
|
||
用户随后明确授权“你自己保存然后重启”。通过当前 test 交互会话的临时诊断任务
|
||
检查可见窗口,只有“设置”、Explorer 和输入组件;没有发现打开的文档或编辑器。
|
||
使用 Windows `shutdown.exe /s /t 0`(没有 `/f`)正常关机,确认 stopped 后应用配置。
|
||
09:28:17 Windows 冷启动,09:29 已通过 Guest Agent 完成检查。
|
||
本次没有停止或重启 USB 隧道,没有强制停机,临时诊断任务均已删除。
|
||
|
||
工具 `tools/set-fixed-pci.py` 的 apply/restore 都要求 VM 已停止。
|
||
有待应用配置、QEMU args 冲突、备份目标不符、原配置发生变化会拒绝操作。
|
||
不发送关机/启动指令,不替换整个 VM 配置。应用示例(PVE root):
|
||
|
||
```bash
|
||
python3 /root/vdi-fixed-pci-20261105/set-fixed-pci.py apply --vm 100 \
|
||
--backup /root/vdi-fixed-pci-20261105/backup
|
||
```
|
||
|
||
回退(同样先正常关机):把 apply 改为 restore,再冷启动。
|
||
不是在 Windows 中点“重新启动”即可生效,必须让 QEMU 进程退出后重新建立硬件模型。
|
||
|
||
## 已完成验证
|
||
|
||
- 4 项单元测试:保留 GPU/带空格参数、重复执行不追加、冲突拒绝、运行 VM 拒绝修改。
|
||
- PVE QEMU 11.0.3 隔离进程,TCG/暂停,无磁盘、无网络后端、无 GPU 直通;
|
||
使用与现场一致的 Q35 machine 和 PVE readconfig。
|
||
- 4 个 root port hotplug=false、4 个 PCI bridge shpc=false、ICH9 LPC ACPI PCI=false。
|
||
- 同一隔离进程中 usb-redir 动态添加和删除通过;独立测试进程已经正常退出。
|
||
- 隔离测试期间 Windows VM 100 持续 running,未插盘时 usb-redir 仍 absent。
|
||
|
||
冷启动后的实际 Windows 结果:
|
||
|
||
- 原四项 PCI 设备 Capabilities 从 6 变为 0;同名的另一个 AHCI 控制器仍为 0。
|
||
四项的 InstanceId 未改变,所有这些设备均 Status=OK。
|
||
- GTX965M ConfigManagerErrorCode=0,系统 SATA 启动盘 Online/Healthy,
|
||
网卡仍为 192.168.1.70,Sunshine 在当前 test 会话运行,Guest Agent 通信正常。
|
||
- 盒子 USB 服务 active,现场仅有键盘和鼠标,没有物理 U 盘。盒子 Moonlight 会话
|
||
随 Windows 正常关机退出,用户需从列表重新进入 Windows。
|
||
- 在用户会话读取到任务栏 UIA 结构,但它没有展开传统通知图标的可访问性子项,
|
||
因此不能仅凭这份结构记录声称已目视确认图标消失;需用户检查托盘外观。
|
||
|
||
隔离验证不是 Windows UI 验收,也不代表真实 USB 读写和拔插已验证。
|
||
证据在 `docs/evidence/fixed-pci-20261105/`。
|
||
|
||
## 现场剩余验收
|
||
|
||
1. 从盒子列表重新进入 Windows,确认无 U 盘时客户桌面安全删除图标消失。
|
||
2. 真实 U 盘插入后可读写且菜单只列真实 USB;安全弹出并物理拔出后图标消失。
|
||
|
||
未通过本次修复承诺隐藏设备管理器或软件检测中的全部虚拟化标识。
|