VDHelper 是 Windows 端的 Virtual Desktop 串流检测 / 诊断 / 修复工具。它回答一个具体问题:为什么头显找不到这台 PC,或者找到了却连不上。本页所有数字都来自本机真实运行结果与仓库里可核实的语料,没有一条是估的。
本表是最初的 27 条设计清单。工具后来又加了检测项,现在每次体检实际跑的是 36 条(见下方本机实测)。差额的走向和「待实现」相反——是清单没跟上工具,不是工具没做完。本次体检到底跑了哪几项,以 --selftest 的输出为准。
下面这段是从 docs/checks.md 读进来的真实运行结果,不是宣传语。该文件本身由 tools/export-checks.ps1 执行 VdHelper.exe --selftest 生成。
阻断:有检查项失败,串流很可能起不来
原始行:VDHelper selftest verdict=Blocked 阻断:有检查项失败,串流很可能起不来
| 状态 | 编号 | 结论 |
|---|---|---|
| 通过 | net-primary | 1 块网卡可用,主用 Ethernet (192.168.11.2) |
| 警告 | net-apipa | 3 块离线网卡持有 APIPA 地址(Ethernet 2、Wi-Fi、Bluetooth Network Connection) |
| 警告 | net-virtual | 2 块虚拟网卡启用中:vEthernet (Default Switch)、vEthernet (WSL (Hyper-V firewall)) |
| 通过 | net-profile | 主网卡网络类别:专用网络 (Private) |
| 通过 | fw-vd | 找到入站放行规则(Virtual Desktop Streamer True Inbound Allow) |
| 警告 | fw-defender | Defender 防火墙:Domain True / Private False / Public False |
| 通过 | svc-vd | VirtualDesktop.Service.exe Running Automatic |
| 通过 | port-vd | 4 个端口由 Virtual Desktop 持有,没有被别的程序抢占 |
| 通过 | session-stale | 当前没有活动会话;1 个残留通道都不在本网段(是连官方服务器留下的,不是头显) |
| 通过 | streamer-proc | Streamer 进程运行中(1 个) |
| 警告 | svc-log | 服务日志有 5 条历史 ERROR(最近一次 2026-09-18 15:37:35.6962),但 Streamer 正在运行 |
| 通过 | udp-discovery | UDP 38850 正在监听(发现/配对协议就绪) |
| 警告 | cfg-streamer | ShowPairingRequests=false:靠弹窗配对新头显会被静默忽略(靠名字在客户端选则不受影响);DontWarnApps 含 NetworkProfile:官方自己的网络告警被屏蔽了;AutoAdjustBitrate=false:自动调码率已关,卡在「measuring bandwidth」时社区的首选解法就是把它打开 |
| 警告 | ics | SharedAccess(ICS):Running |
| 通过 | fw-outbound | 出站策略:Domain NotConfigured / Private NotConfigured / Public NotConfigured |
| 通过 | av | 已注册杀软:Windows Defender(productState 原值见下方原始输出,未解码:那是各版本含义不一的位掩码) |
| 通过 | route-metric | 有线网卡优先级 10,没有虚拟网卡排在它前面 |
| 未知 | usb-headset | 这台电脑上没有枚举到 USB 方式的头显 |
| 通过 | link-type | PC 走有线(Ethernet) |
| 阻断 | lan-reach | 头显 192.168.11.14 ping 不通(ARP 缓存里也没有它) |
| 通过 | link-rate | Ethernet 协商速率 1 Gbps |
| 通过 | vpn-proc | 没有发现 VPN/代理客户端进程 |
| 通过 | rdp-session | 只有本机 console 会话(1 条),没有远程桌面在跑 |
| 通过 | nat-type | 路由器响应 UPnP 控制面(UPnP / SSDP),且当前有 38810 的入站映射;NAT 类型这一项没有测(需要映射行为探测或 STUN,本检查只读了两项);外网 IP 是 172.16.80.42(私有段),上级还有一层 NAT——这只影响异地连接,不影响同网段 |
| 通过 | fw-pair | 入站放行有效(Virtual Desktop Streamer),没有针对 VD 的出站拦截 |
| 通过 | accounts-persisted | 配对信息已落盘(OculusQuest 1 条、Oculus 3 条),设备名 Meta Quest 3 |
| 警告 | fw-profile-inbound | profile 默认入站:Domain True NotConfigured / Private False NotConfigured / Public False NotConfigured |
| 警告 | gpu-pick | Virtual Desktop Monitor |
| 警告 | proc-tuner | 按进程名命中硬件调校类 7 个(未测 CPU 占用或线程优先级,只按名字匹配) |
| 未知 | nic-powersave | 读不到网卡电源管理属性 |
| 警告 | display-inventory | Virtual Desktop Monitor(Error) |
| 通过 | cfg-version | Streamer 版本 1.34.22.0 |
| 通过 | gpu-encoder | 硬件编码器空闲(当前 0 个编码会话) |
| 通过 | gpu-throttle | GPU 跑在最高频率的 64%,占用 4%、温度 50°C。驱动没有报任何降频原因——不是被压着。 |
| 未知 | wifi-quality | 无线未连接(disconnected),这一项没有测到任何链路数据 |
| 警告 | net-loss | 头显 192.168.11.14 完全不应答(0 收到) |
检测项的完整定义(症状 / 命令 / 判据 / 修复 / 回滚 / 风险)见 检测项全表;参数项与头显侧规则见 checks.md 末尾的三处指向。
| 屏 | 回答什么 | 需要什么 |
|---|---|---|
| 本机体检 | PC 侧网卡 / 防火墙 / 服务 / 配置 / GPU 有没有断链(判定项 36 项) | 无 |
| 串流参数 | Streamer 111 个配置键的当前值与含义(DPAPI 密文不显示) | 无 |
| 头显诊断 | 通过 adb 读头显的包、权限、网络,并判断应用进程是否还活着 | 头显 USB 连接并授权 |
↑ 第三屏也可以直接命令行跑:VdHelper.exe --adb,输出可直接贴进 issue,不必截图 |
顶部常驻总判定:可串流 / 有隐患 / 阻断。本页结论行即来自该判定。
语料里能归并出 7 个症状类 + 12 个子症状。左边是用户嘴里的话,右边是工具必须拿到的状态 —— 两边对不上,说明这类症状还没被测到。
| 症状类 | 用户会怎么说(真实措辞) | 判定信息(VDHelper 需要拿到的) |
|---|---|---|
| S1 看不见电脑 | "no computer found" / "no computer detected" / "big yellow sign" / "doesn't see the PC" / "servers unreachable, only showing local computers" | 头显端收到零个广播应答;PC 侧 UDP 38850 是否在发 |
| S2 连不上 | "computer is unreachable" / "PC is unreachable" / "failed to see any computer at all" / "can't connect to a computer contact support" | 收到了应答但后续 TCP 握手失败 |
| S3 说不在同一网络 | "not on same network" / "not on same local network" | 两端子网 / AP 隔离 |
| S4 卡在测速 | "stuck on measuring bandwidth" / "won't get past "measuring bandwidth"" / "keeps measuring bandwidth" | 带宽探测阶段超时 |
| S5 有画面但黑 / 无画面 | "black screen" / "blank screen" / "I can hear audio, but no visuals" / "shows no display" | 音视频分离 → 解码/显示器/编码器 |
| S6 连上就掉 / 定时卡 | "keeps disconnecting" / "disconnects after 30 seconds" / "freezes exactly at 5-7 mins" / "60-Second Stutter" / "The first time I tried it, it worked perfectly for hours, hasn't worked since" | 周期性 → 时序特征 |
| S7 画面质量差 / 不跟手 | "choppy" / "stutter" / "bitrate only 60-70" / "black bars when turning my head" / "blurry" | 抖动/丢包/解码耗时 |
每一类症状背后的多个工程根因,见 常见问题 · 症状词典 与 分诊表。
这几条在社区里出现频率最高,而且对同一网段内的本地串流无效或有害。完整立场写在 常见问题 · 社区常见的错误解法,那里逐条写了「为什么错 / 正确说法是什么」。
正确说法:先判定场景。PC 与头显同网段 → 不需要任何端口转发;异地 → 需要转发 TCP 38810/20/30/40,且 Streamer 需勾选 "Allow remote connections"。开发者本人在 R29 明确说过 "You don't need to forward ports to connect to Shadow."
正确说法:本地场景不开 UPnP;远程场景优先静态 IP + 精确端口转发。R22 那条"禁用 UPnP 改手动转发"的建议是对的,且与开发者口径一致。
正确说法:保持防火墙开启,改成检测哪条规则缺失。R19 是语料中唯一一个"关防火墙只是诊断手段、正确解法是补规则"的完整案例——这就是 VDHelper 应该给用户的答案。