kitepon-rgb/OpenDS360

GitHub: kitepon-rgb/OpenDS360

一款非官方的 Windows 托盘应用,通过逆向工程的 USB HID 协议将 CPU/GPU 温度实时显示在 PCCooler CPS DS360 水冷水泵头的数码管屏幕上。

Stars: 0 | Forks: 0

OpenDS360 — an unofficial Windows tray app that drives the 3½-digit display on the PCCooler CPS DS360 pump head over USB HID

# OpenDS360 [![CI](https://static.pigsec.cn/wp-content/uploads/repos/cas/ad/ad5834178f7599af9fdda11629d49cae07f2997beec49821b2920eff5bfd50e7.svg)](https://github.com/kitepon-rgb/OpenDS360/actions/workflows/ci.yml) [![发布](https://img.shields.io/github/v/release/kitepon-rgb/OpenDS360)](https://github.com/kitepon-rgb/OpenDS360/releases/latest) [![下载量](https://img.shields.io/github/downloads/kitepon-rgb/OpenDS360/total)](https://github.com/kitepon-rgb/OpenDS360/releases) [![Windows 10 | 11](https://img.shields.io/badge/Windows-10%20%7C%2011-0078D4)](https://github.com/kitepon-rgb/OpenDS360/releases/latest) [![许可证:MIT](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE) 由 [kitepon.dev](https://kitepon.dev/) 的 [Quo](https://x.com/QLyun35332) 构建并维护。 ## 这适合你的散热器吗? **市面上有两款完全不同的散热器都以“DS360”的名义销售。** 它们除了名字一样之外,毫无共同之处。 | 你的水泵头显示为 | 这是 | |---|---| | **纯数字**,采用白色七段数码管样式 | **匹配。** 请继续阅读 | | 图像、动画或彩色仪表盘 | 2.4英寸 LCD 型号,使用完全不同的协议 | | 状态 | 型号 | 备注 | |---|---|---| | ✅ **已验证** | PCCooler **CPS DS360 WH** | 已在真实硬件上测试。由 Scythe 在日本作为 `DS360-WH` 发售 | | 🟡 **可能支持,未验证** | CPS DS360 BK 及其他 **3½位七段数码管** 同系列产品 | 据目前所知,它们使用相同的 ODM 和控制板。[欢迎反馈](#report-your-hardware) | | 🟡 **可能支持,未验证** | 其他品牌由 APALTEK 制造的七段数码管 AIO 散热器 | APALTEK 未公开其客户名单 | | ❌ **不支持** | CPS DS360 **Display**、DC360 Pro 及其他 **2.4英寸 LCD** 型号 | 完全不同的协议 | | ❌ **不支持** | PCCooler GT360 | 640×480 分辨率下的 CDC-ACM。[另一个项目支持它](https://github.com/NextWork123/PCCoolerGT360-Display) |

The CPS DS360 WH pump head reading 60 on its seven-segment display, photographed inside a running system

### 识别设备 ``` VID 0x2E3C / PID 0x0A15 Product string: LIQUID COOLER DIGITAL DISPLAY - PCC ``` `0x2E3C` 属于 **ARTERY Technology(一家微控制器供应商)** —— 而不属于散热器。APALTEK 复用了其所搭载 MCU 的 VID,因此不相关的产品(USB 测试仪、无线电设备)也会响应相同的 VID。OpenDS360 在写入任何内容之前也会匹配产品字符串,因此它不会与仅仅是 VID 相同的设备进行通信。 ## 安装 1. 从 [Releases](https://github.com/kitepon-rgb/OpenDS360/releases/latest) 下载安装程序并运行。 2. 如果你需要获取 **CPU** 温度,请安装 [PawnIO](https://pawnio.eu/): winget install namazso.PawnIO 3. OpenDS360 启动后会驻留在系统托盘。右键点击或双击图标即可打开设置。 .NET 运行时已内置于安装程序中,因此无需额外安装任何其他内容。 ### 为什么需要 PawnIO CPU 温度存在于 MSR(模型特定寄存器)中,普通程序无法读取这些特权寄存器。要访问它们需要内核驱动程序。 PawnIO 是开源且**已签名**的,并且它在**保持 HVCI 开启**的情况下即可工作 —— 你机器的保护机制将保持原样。旧的 `WinRing0` 驱动程序因 [CVE-2020-14979](https://nvd.nist.gov/vuln/detail/CVE-2020-14979) 被列入微软的黑名单,并在当前系统上无法运行。 **GPU 温度无需 PawnIO 即可正常工作。** 如果没有它,CPU 读数将返回为 `0`,但其他一切功能仍会继续运行。 ## 显示效果

The pump head running the OpenDS360 startup sequence: every segment lit, a fast sweep, deceleration, an overshoot past the target, and a settle onto the measured temperature

**开机动画**([`StartupEffect.cs`](src/OpenDS360/Display/StartupEffect.cs))会停留在刚刚测得的温度值上,因此每次结束的位置都不一样。 | 阶段 | 效果 | |---|---| | 自检 | `188` 点亮所有段,然后闪烁 —— 就像仪器上电自检时的表现 | | 扫描 | `0` → `199` 扫描两次,每帧 10 ms,速度快到看起来像一条移动的光带 | | 减速 | 扫描速度逐渐放缓,并刚好停在目标值之前 | | 过冲 | 超过目标值后回弹,并且摆动逐渐衰减 —— 就像模拟仪表指针的物理运动 | | 确认 | 短暂闪烁后,读数固定 | 显示屏能够跟上 10 ms 一次的更新而不掉帧,这正是实现上述效果的基础。这是一个实测的数值,而非假设。 **阈值闪烁。** 设置一个温度值,当读数达到该值时显示屏就会闪烁。报告中的字节 `[3]` 会直接驱动硬件闪烁;而原厂软件将该字节留空为零,从未使用过它。 ## 设置 | 设置项 | 选项 | |---|---| | 温度来源 | CPU 封装 / **CPU CCD 最高温度** / GPU | | 单位 | 摄氏度 / 华氏度 | | 闪烁阈值 | 达到或超过此温度时闪烁(`0` 表示禁用) | | 开机动画 | 开 / 关 | | 开机自启 | 注册一个登录任务 | **CPU CCD 最高温度** 适用于各个 CCD 温度差异巨大的芯片 —— 例如在 Ryzen 9 9950X3D 上,CCD1 为 70 °C 而 CCD2 为 48 °C 是很常见的。封装温度会平均掉这种差异;而 CCD 最高温度则会显示出较热的那个核心。 设置保存在 `%APPDATA%\OpenDS360\settings.json` 中。 ### 开机自启 OpenDS360 需要管理员权限,如果在 `HKCU\...\Run` 下添加项目,每次登录时都会触发 UAC 提示。相反,它会注册一个 **Task Scheduler** 任务并设置为以最高权限运行,这样启动时就不会出现提示。 ## 设计决策 该散热器自带 `DeviceMonitorPcc` 软件。通过分析该二进制文件,解决了一些关于 OpenDS360 应该如何运行的问题。 | 原厂软件中观察到的行为 | OpenDS360 的做法 | |---|---| | FTP 凭据以纯文本形式存在于可执行文件中,并且每次启动时都会尝试进行普通的 FTP 连接 | **完全不进行任何网络连接** | | 在 `HKLM\...\Run` 中写入登录项,该位置需要管理员权限 | 在当前用户下注册一个 Task Scheduler 任务 | | “关于”对话框中报告的硬件和固件版本从未真正向设备请求过 | 仅显示从设备读取的值 | | 发布版本中附带调试版 CRT (`ucrtbased.dll`) | 发布正式的发布版本 | | 代码签名证书已于 2025-02-27 过期 | 未签名分发,但公开了源代码,并在每个发布资产上提供了 SHA-256 摘要 | 此外,全程序遵循以下两条规则: - **故障可见。** 损坏的设置文件将使用默认值启动应用;*保存* 失败会向你报告,而不会被默默忽略。 - **绝不写入 Report ID `0xF0` / `0xF1`。** 它们似乎是固件更新通道,错误写入可能会导致散热器变砖。 ## 通信协议 [**docs/PROTOCOL.md**](docs/PROTOCOL.md) 记录了全部细节 —— 报告结构、字节语义、测得的极限以及一些仍未知的部分。公开这些信息是为了让下一个拆解此类显示屏的人,能够跳过面对空白抓包窗口从头分析的阶段。 ``` [0] 0x20 report ID [1] 0x01 command: update [2] unit — 0 = Celsius, 1 = Fahrenheit [3] blink — 0 = steady, non-zero = blink [6] the number on the display ``` 以下四项发现决定了一个实现方案是否可行: - **每 0.5 秒不间断发送。** 一旦数据流中断,看门狗就会使显示屏熄灭。几乎所有的“显示屏会随机关闭”的问题追溯起来都是这个原因。 - **限制在 0–199 之间。** 百位只是半个数字(半位)。如果发送 `200`,显示屏只会显示 `99`。 - **在 PC 端转换为华氏度** —— `floor(C * 9 / 5 + 32)`。字节 `[2]` 控制的是单位标签,而不是进行转换。 - **无法独立控制单个段。** 在得出结论之前,我们扫描了报告描述符中的每一个通道以及 `0x20` 的每一个字节。 ## 构建 ``` # 独立单可执行文件 dotnet publish src/OpenDS360 -c Release -o dist/app # Installer (需要 Inno Setup 6) ISCC.exe installer/OpenDS360.iss ``` Trimming 保持关闭状态:LibreHardwareMonitorLib 通过反射来解析硬件实现,而修剪工具会悄无声息地移除某些机器可能需要的传感器。 ## 反馈你的硬件信息 **无论是否成功,你的反馈都很有用。** 上面的兼容性表格正是通过大家提交的信息不断完善的 —— 请提交一个 [issue](https://github.com/kitepon-rgb/OpenDS360/issues/new/choose) 并附带: - 散热器的型号名称 - 水泵头显示的内容(纯数字,还是彩色屏幕) - 设备管理器中的 VID / PID ## 注意事项 **请勿同时运行 OpenDS360 和 `DeviceMonitorPcc`。** 设备会接受两个进程的写入,导致显示屏在两个数据源之间闪烁。OpenDS360 会在启动时检测到另一个程序,并提示你将其关闭。 **这是非官方软件。** 它与 PCCooler 或 APALTEK 没有任何关系,这两家公司也没有对其进行背书或提供支持。使用风险自负。 ## 许可证 [MIT](LICENSE)。内置的第三方组件列表详见 [THIRD-PARTY-NOTICES.md](THIRD-PARTY-NOTICES.md)。
标签:USB HID, Windows工具, 云资产清单, 多人体追踪, 硬件控制, 系统硬件, 逆向工程