Skip to content

Commit df65fdb

Browse files
author
kitepon-rgb
committed
初回コミット: OpenDS360
PCCooler CPS DS360 のポンプヘッド上ディスプレイを制御する非公式ソフト。 メーカー製 DeviceMonitorPcc を置き換える。 USB HID プロトコルは非公開のため、実機の通信をキャプチャして解析した。 解析結果の全仕様は docs/PROTOCOL.md に記載(推測を含まず、すべて実測)。 主な内容: - 65バイトの HID レポートを 0.5 秒周期で送信(ウォッチドッグ対応) - メーカー製アプリが使っていない点滅機能を発見し、高温警告に利用 - CPU/GPU 温度は LibreHardwareMonitorLib 経由で取得 - トレイ常駐、起動演出、設定画面、Inno Setup インストーラ メーカー製アプリとの相違: - 外部通信を一切行わない(純正は平文 FTP で認証情報をハードコードしていた) - 自動起動はタスクスケジューラに登録し、UAC を出さない - デバイスから読めない値を表示しない
0 parents  commit df65fdb

20 files changed

Lines changed: 2284 additions & 0 deletions

‎.gitignore‎

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
# ビルド成果物
2+
bin/
3+
obj/
4+
5+
# 配布物(自己完結ビルドは 70MB あるのでリポジトリに入れない。
6+
# 配布は GitHub Releases から行う)
7+
dist/
8+
9+
# Visual Studio / Rider
10+
.vs/
11+
.idea/
12+
*.user
13+
*.suo
14+
15+
# ローカル設定
16+
.claude/settings.local.json
17+
18+
# OS
19+
Thumbs.db
20+
desktop.ini
21+
.DS_Store

‎AGENTS.md‎

Lines changed: 137 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,137 @@
1+
# OpenDS360 — 作業時の指示
2+
3+
PCCooler CPS DS360 のポンプヘッド上ディスプレイを制御する非公式ソフト。
4+
5+
製品の説明と対応機種は `README.md`、通信仕様は `docs/PROTOCOL.md` にある。
6+
**この文書はそれらを繰り返さない。ここに書くのは「知らないと事故る判断」だけ。**
7+
8+
---
9+
10+
## 1. 最優先で守ること
11+
12+
### ビルド成果物の場所を毎回確認する
13+
14+
`RuntimeIdentifier` を指定しているため、出力先は **`win-x64` サブフォルダ**になる。
15+
16+
```
17+
bin\Debug\net8.0-windows\win-x64\OpenDS360.exe ← 正しい
18+
bin\Debug\net8.0-windows\OpenDS360.exe ← 古い残骸。存在しても使うな
19+
```
20+
21+
**この取り違えで、修正を3回続けて「反映されない」と誤認した実績がある。**
22+
「直したのに変わらない」と感じたら、真っ先に**起動している exe の更新日時**を疑うこと。
23+
24+
### アプリを止めてからビルドする
25+
26+
本体は**管理者権限で常駐する**。動いたままビルドすると実行ファイルがロックされ、
27+
`dotnet build` が **`0 エラー` を返しながら何も更新しない**ことがある。
28+
29+
```powershell
30+
# 管理者権限で
31+
Stop-Process -Name OpenDS360 -Force -ErrorAction SilentlyContinue
32+
```
33+
34+
管理者権限で起動したプロセスは**非管理者からは停止できない**(アクセス拒否)。
35+
36+
### UI を直したら実画面を撮って確認する
37+
38+
`Control.DrawToBitmap()` は内部で再描画するだけで、**実際の画面と一致しない**。
39+
これで「直った」と誤認した実績がある。確認には `Graphics.CopyFromScreen()` を使い、
40+
**実際に表示されているウィンドウをそのまま撮る**こと。
41+
42+
---
43+
44+
## 2. デバイスを壊さないための制約
45+
46+
`docs/PROTOCOL.md` に仕様の全体があるが、**破壊につながる項目だけ**ここに再掲する。
47+
48+
- **レポートID `0xF0` / `0xF1` には絶対に送信しない。** ファームウェア更新チャネルと
49+
推定される。誤った書き込みでデバイスが起動不能になりうる
50+
- 未知のコマンドを**総当たりで試さない**。試すなら既知の `0x20` コマンドの
51+
**内側のパラメータ**に留める(そこは安全だと実証済み)
52+
- 表示値は **0〜199 にクランプ**する。200 以上を送ると `99` が表示される
53+
- **送信を 0.5 秒周期で絶やさない。** 途切れるとウォッチドッグで消灯する。
54+
「なぜか画面が消える」の原因はほぼこれ
55+
56+
---
57+
58+
## 3. デバイスの識別
59+
60+
VID `0x2E3C` は **ARTERY Technology(マイコンメーカー)のもの**で、クーラー固有ではない。
61+
ODM の APALTEK が搭載 MCU の VID を流用しているため、**同じ VID を名乗る無関係の
62+
製品が実在する**(USB テスター、無線機など)。
63+
64+
したがって **VID/PID だけで対象を決めてはならない**。製品文字列 `LIQUID COOLER` の
65+
照合を必ず併用する(`Hid/CoolerDevice.cs` の `MatchesVidPid`)。
66+
67+
---
68+
69+
## 4. 設計上の約束
70+
71+
メーカー製アプリ(`DeviceMonitorPcc`)を置き換えるのが目的なので、
72+
**あれがやっていた行儀の悪いことをしない**。
73+
74+
| 項目 | 方針 |
75+
|---|---|
76+
| 外部通信 | **一切行わない**(純正は平文 FTP で認証情報をベタ書きしていた) |
77+
| 自動起動 | タスクスケジューラに `/RL HIGHEST` で登録(純正は `HKLM\...\Run` で毎回 UAC) |
78+
| 設定の保存先 | `%APPDATA%\OpenDS360\settings.json`(ユーザー領域) |
79+
| 表示する情報 | **デバイスから読めない値を表示しない**(純正は Firmware Version を偽装表示していた) |
80+
| エラー処理 | 設定ファイルが壊れても**既定値で起動を継続**する。ただし保存失敗は握りつぶさず利用者に伝える |
81+
82+
---
83+
84+
## 5. センサー取得の前提
85+
86+
CPU 温度は MSR からしか読めず、**PawnIO(カーネルドライバ)が必要**。
87+
無い場合は温度が `0` になる。
88+
89+
- 従来の `WinRing0` は脆弱性 (CVE-2020-14979) でブロックリスト入りしており、
90+
**HVCI 有効環境では動かない**
91+
- **セキュリティ設定を下げる方向の解決策は採らない**。利用者の防御を弱める提案をしない
92+
- PawnIO **未導入でも GPU 温度だけで動く**縮退運転を壊さないこと
93+
94+
---
95+
96+
## 6. 変更時に一緒に直すもの
97+
98+
| 変更したもの | 一緒に直す |
99+
|---|---|
100+
| プロトコルの理解が変わった | `docs/PROTOCOL.md`(**実測した事実だけ書く。推測は「未検証」と明記**) |
101+
| 対応機種が増えた/外れた | `README.md` の対応表 |
102+
| 依存ライブラリを追加した | `THIRD-PARTY-NOTICES.md`(MPL-2.0 等は告知義務あり) |
103+
| バージョンを上げた | `src/OpenDS360/OpenDS360.csproj` と `installer/OpenDS360.iss` の**両方** |
104+
105+
---
106+
107+
## 7. ビルドと配布
108+
109+
```powershell
110+
# 開発ビルド(要: アプリ停止)
111+
dotnet build src\OpenDS360
112+
113+
# 配布用(自己完結・単一 exe・約 70MB)
114+
dotnet publish src\OpenDS360 -c Release -o dist\app
115+
116+
# インストーラ(要 Inno Setup 6)
117+
& "$env:LOCALAPPDATA\Programs\Inno Setup 6\ISCC.exe" installer\OpenDS360.iss
118+
```
119+
120+
- `.NET` ランタイムは**同梱する**。利用者には PawnIO という壁が既にあるため、
121+
ランタイム導入という 2 つ目の壁を作らない
122+
- **トリミングは有効にしない。** LibreHardwareMonitorLib がリフレクションで
123+
ハードウェア実装を解決するため、削られると特定機種のセンサーが黙って読めなくなる
124+
125+
---
126+
127+
## 8. 検証は実機で行う
128+
129+
このプロジェクトは**実機がないと何も確認できない**。単体テストで代替できない領域が
130+
大半であり、以下は**必ず実機で目視確認する**。
131+
132+
- ディスプレイの表示内容・演出
133+
- 設定画面のレイアウト(環境によって崩れる)
134+
- インストーラの動作
135+
136+
**「たぶん動く」で完了報告をしない。** 実機で確認できていないなら、
137+
「未確認」と明示して渡すこと。

‎CLAUDE.md‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
@AGENTS.md

‎LICENSE‎

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
MIT License
2+
3+
Copyright (c) 2026 kite
4+
5+
Permission is hereby granted, free of charge, to any person obtaining a copy
6+
of this software and associated documentation files (the "Software"), to deal
7+
in the Software without restriction, including without limitation the rights
8+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9+
copies of the Software, and to permit persons to whom the Software is
10+
furnished to do so, subject to the following conditions:
11+
12+
The above copyright notice and this permission notice shall be included in all
13+
copies or substantial portions of the Software.
14+
15+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21+
SOFTWARE.
22+
23+
---
24+
25+
This software bundles third-party components under their own licenses.
26+
See THIRD-PARTY-NOTICES.md for details.

‎README.md‎

Lines changed: 172 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,172 @@
1+
# OpenDS360
2+
3+
**PCCooler CPS DS360 のポンプヘッドに、CPU / GPU の温度を表示する非公式ソフトウェア。**
4+
5+
メーカー製の `DeviceMonitorPcc` を置き換えることを目的としています。
6+
通信プロトコルは公開されていないため、**実機の USB 通信を解析して実装しました**。
7+
8+
> **これは非公式ソフトウェアです。** PCCooler / APALTEK とは無関係であり、
9+
> 両社から承認・支援を受けていません。自己責任でご利用ください。
10+
11+
---
12+
13+
## なぜ作ったか
14+
15+
メーカー製アプリには、常用するには気になる点がありました。
16+
17+
- **FTP の認証情報が実行ファイルに平文で埋め込まれており**、起動のたびに
18+
外部サーバへ平文 FTP で接続を試みる
19+
- デバッグ版 C ランタイム(`ucrtbased.dll`)が製品に同梱されている
20+
- コード署名証明書が 2025-02-27 で失効しており、更新の形跡がない
21+
- 自動起動を `HKLM\...\Run`(管理者権限が必要な位置)に登録する
22+
- About ダイアログの Hardware / Firmware Version は**デバイスに問い合わせておらず**、
23+
ハードコードされた値を表示しているだけ
24+
25+
OpenDS360 は **外部通信を一切行いません**。
26+
27+
---
28+
29+
## 対応ハードウェア
30+
31+
| 状態 | 機種 | 備考 |
32+
|---|---|---|
33+
| ✅ **動作確認済み** | PCCooler **CPS DS360 WH** | 実機で確認 |
34+
| 🟡 **動作する可能性(未確認)** | CPS DS360 BK など、**3½桁7セグ表示**を搭載する同型機 | 同一 ODM・同一制御基板と推定。報告歓迎 |
35+
| 🟡 **動作する可能性(未確認)** | 他ブランドの APALTEK 製 7セグ AIO | ODM の供給先は非公開のため特定できていません |
36+
| ❌ **非対応** | CPS DS360 **Display** / DC360 Pro など**2.4インチ LCD 版** | プロトコルが全く異なります |
37+
| ❌ **非対応** | PCCooler GT360 | CDC-ACM 接続・640x480。[別プロジェクト](https://github.com/NextWork123/PCCoolerGT360-Display)があります |
38+
39+
### ⚠️ 「DS360」には2種類あります
40+
41+
同じ **DS360** という名前で、**中身が全く違う2製品**が販売されています。
42+
43+
- **3½桁の7セグメント LED**(数字だけを表示するタイプ)→ **本ソフトの対象**
44+
- **2.4インチ IPS LCD**(画像や動画を表示できるタイプ)→ **対象外**
45+
46+
お手持ちの製品のヘッドに**数字だけが表示される**なら対象です。
47+
48+
### 対象デバイスの識別子
49+
50+
```
51+
VID 0x2E3C / PID 0x0A15
52+
製品文字列: LIQUID COOLER DIGITAL DISPLAY - PCC
53+
```
54+
55+
> **補足:** `VID 0x2E3C` は ARTERY Technology(マイコンメーカー)のものです。
56+
> ODM である APALTEK が搭載 MCU の VID を流用しているため、**この VID を名乗る
57+
> 無関係の製品が存在します**。本ソフトは誤動作を防ぐため、VID/PID に加えて
58+
> 製品文字列も照合しています。
59+
60+
---
61+
62+
## 必要なもの
63+
64+
### PawnIO(CPU 温度を表示する場合は必須)
65+
66+
CPU の温度は MSR という特権レジスタからしか読めず、カーネルドライバが必要です。
67+
68+
**[PawnIO](https://pawnio.eu/) をインストールしてください。**
69+
70+
```
71+
winget install namazso.PawnIO
72+
```
73+
74+
オープンソースの**署名済み**ドライバで、**Windows のセキュリティ設定を下げる
75+
必要はありません**(HVCI 有効のままで動作します)。
76+
77+
導入しない場合、CPU 温度は取得できず **0 と表示されます**。
78+
GPU 温度は PawnIO なしでも動作します。
79+
80+
詳しい理由は [THIRD-PARTY-NOTICES.md](THIRD-PARTY-NOTICES.md) を参照してください。
81+
82+
### 動作環境
83+
84+
- Windows 10 / 11(64bit)
85+
- .NET ランタイムは**不要**(インストーラに同梱)
86+
87+
---
88+
89+
## 使い方
90+
91+
1. [Releases](https://github.com/kitepon-rgb/OpenDS360/releases) からインストーラを入手して実行
92+
2. トレイに常駐します。アイコンを右クリックまたはダブルクリックで設定
93+
94+
### 設定できること
95+
96+
| 項目 | 内容 |
97+
|---|---|
98+
| 表示する温度 | CPU パッケージ / **CPU CCD 最大** / GPU |
99+
| 温度の単位 | 摂氏 / 華氏 |
100+
| 点滅させる温度 | 指定温度以上でディスプレイを点滅(0 で無効) |
101+
| 起動時の演出 | オン / オフ |
102+
| 自動起動 | ログオン時に自動で開始 |
103+
104+
**CPU CCD 最大温度**は、Ryzen X3D のように CCD 間で温度差が大きい構成向けです。
105+
(例: Ryzen 9 9950X3D では CCD1 が 70℃、CCD2 が 48℃ということが起こります)
106+
107+
設定は `%APPDATA%\OpenDS360\settings.json` に保存されます。
108+
109+
### 自動起動について
110+
111+
管理者権限が必要なアプリのため、`HKCU\...\Run` に登録すると**起動のたびに UAC が
112+
表示されます**。OpenDS360 は代わりに**タスクスケジューラ**へ「最上位の特権で実行」
113+
として登録するため、UAC なしで自動起動できます。
114+
115+
---
116+
117+
## 注意事項
118+
119+
**メーカー製アプリ(DeviceMonitorPcc)と同時に動かさないでください。**
120+
デバイスは排他ロックされないため両方が書き込めてしまい、表示が競合します。
121+
OpenDS360 は起動時に検出して終了を促します。
122+
123+
---
124+
125+
## 技術資料
126+
127+
解析したプロトコルの全仕様を [docs/PROTOCOL.md](docs/PROTOCOL.md) に公開しています。
128+
同種のデバイスを解析する方の役に立てば幸いです。
129+
130+
要点だけ挙げると:
131+
132+
- USB HID・65バイトのレポートを **0.5秒周期で送信し続ける**
133+
(途切れるとウォッチドッグで消灯します)
134+
- 表示可能な値は **0〜199**(3½桁)
135+
- 華氏変換は**PC 側**で行う(`floor(C * 9 / 5 + 32)`)
136+
- **メーカー製アプリが使っていない「点滅」機能**を発見し、本ソフトでは
137+
高温警告に利用しています
138+
139+
---
140+
141+
## ビルド
142+
143+
```bash
144+
# 発行(自己完結型・単一 exe)
145+
dotnet publish src/OpenDS360 -c Release -o dist/app
146+
147+
# インストーラ作成(要 Inno Setup 6)
148+
ISCC.exe installer/OpenDS360.iss
149+
```
150+
151+
---
152+
153+
## ライセンス
154+
155+
[MIT License](LICENSE)
156+
157+
同梱するサードパーティ コンポーネントについては
158+
[THIRD-PARTY-NOTICES.md](THIRD-PARTY-NOTICES.md) を参照してください。
159+
160+
---
161+
162+
## 動作報告のお願い
163+
164+
**お手持ちの機種で動いた/動かなかった報告を歓迎します。**
165+
[Issues](https://github.com/kitepon-rgb/OpenDS360/issues) にお寄せください。
166+
対応表を育てていきたいと考えています。
167+
168+
報告の際は以下を教えていただけると助かります。
169+
170+
- クーラーの製品名
171+
- ヘッドの表示(数字のみ / カラー液晶)
172+
- デバイスマネージャーで確認できる VID / PID

0 commit comments

Comments
 (0)