
2026/03/22 8:26
ロジクールマウスに2バイトのデータを保存する方法
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
記事が示すこと: Logitech MX Vertical は、独自の HID++ 2.0 プロトコルを介してアクセスされるフラッシュメモリを備えており、そのために特定の設定(主に DPI)が異なるコンピュータ間で保持されます。
発見方法: マウス上の 33 個の安定した HID++ 機能を列挙し、機能
TemplateBytesNVS(インデックス 0x1eb0)を揮発性ストレージではないものとして特定しました。著者は複数のレジスタに対して書き込み操作をテストしました。デバイス名レジスタは書き込みを受け付けますが、常に「MX Vertical」と報告します。一方、DPI レジスタは任意の 16‑bit 値を書き込むことができ、コンピュータから抜き差しした後や別のコンピュータへ接続してもその値を保持します。
ツールと範囲: 著者は Rust 言語で
mouse-fs というツールを作成しました。このツールは DPI レジスタ(約 2 バイト)に書き込み、Unifying 受信機を使用した任意の Logitech マウスに互換性があります。研究は探索的プローブのみで行われ、公式ドキュメントは参照されませんでした。
得られた洞察: 調査は HID++ の内部構造を明らかにし、macOS の IOHIDManager が
TemplateBytesNVS を書き込むために必要な長いレポートを静かに破棄する様子と、このデバイスにおける IFeatureSet ルックアップの奇妙さを浮き彫りにしました。実用的なデータ保存機能は限定的ですが、結果は Logitech のプロトコルへの理解を深め、将来のファームウェアやツール開発に役立つ可能性があります。本文
最初はただの馬鹿げたアイデアでした。ロジクール MX Vertical を自宅用PC、仕事用ノートパソコン、その他の機器に常に移動させているとき、ある時「このマウスにはフラッシュメモリが入っているんだろうか? それがないと接続を変えても DPI 設定を覚えていられない」と思ったのでした。もしそこに何かを書けたら…というわけです。
そう言えば、退屈だったのです。
計画はマウスを小さな USB ドライブとして扱うことでした。物理的に複数のコンピュータ間を行き来するので、理論上データを持ち運べます――64 GB の USB スティックで 2 バイトが恥ずかしいほど簡単なのに、マウス内であればアートです。
ロジクールのマウスは HID++ と呼ばれるプロトコルで通信します。これは標準的な USB HID をベースに構築されたもので、ロジクール側が一部ドキュメント化し、オープンソースコミュニティが逆解析したものです。私は Rust でマウスが公開しているすべての機能を列挙するツールを書きましたが、結局 33 個見つかりました。
HID++ 2.0 の仕組み
- 各デバイスには 機能テーブル がある。
- エントリは安定した 機能 ID をデバイス固有のインデックスにマッピングする。
ID はロジクール製品全体で共通、インデックスはモデルごとに異なる。 - 最初に「機能 0x2201 はどこ?」と尋ねると、「このマウスではインデックス 0x12」という答えが返ってくる。
以降の呼び出しではそのインデックスを使用する。 - 呼び出しは短いパケットで構成される:レポート ID、デバイスインデックス、機能インデックス、関数 ID、および最大 3 バイトのパラメータ。
応答も同じ形で返ってくる。
ほとんどの機能は未公開です。
EnableHiddenFeatures や TemplateBytesNVS のような名前が付いています。後者はまさに私が欲しかった「インデックス 0x1eb0 にある非揮発性ストレージ」のようです。
最初に 0x1c00 を調べました――6 スロット、読み書きフラグなど全て。macOS の
IOHIDManager は実際に書き込むために必要な長い HID++ レポート形式を黙ってブロックしており、パケットはエラーもなく単に捨てられます。多くのプローブコードを書いて空応答を見続けた結果で、このことが判明しました。IOHIDManager を迂回する方法(例えば IOKit 経由で USB デバイスに直接アクセス)はありますが、別話です。
デバイス名レジスタ も試したのですが、書き込みは受け付けてもマウスは送った内容に関係なく「MX Vertical」と報告し続けました――まるで幽霊のようです。
実際に機能したのは DPI レジスタでした。DPI は何らかの場所に保存されなければならないので、任意の
u16 値を受け付けます――丸めもバリデーションもなく、「それは本当の DPI ではありません」というエラーも出ません。0x6869 を書き込み、マウスを抜いて別コンピュータに差し替えて読み戻すと、まだ「hi」と表示されます。
これが全てです――ロジクールマウスの DPI レジスタに保存された 2 バイトの永続的なクロスコンピュータストレージ。
この種のプロジェクトを行う価値は何なのかと考えてみました。結果として得られたものは客観的には無意味です:2 バイトで何もできませんし、ホスト名を変えるだけでもっと多く保存できます。しかし調査自体が目的でした。HID++ の仕組み、macOS がカーネルレベルで HID デバイスを管理する方法と境界線、
feature table と feature index が別物であること、IFeatureSet の逆引きがこのデバイスでは壊れていること、そしてデバイス名レジスタが書き込みを受け入れた後に完全に無視するという深く共感できる挙動などを学びました。
これらの知識はドキュメントを読むことで得たものではなく、何かを試してみて予期せぬ反応が返ってきたときにその線を辿った結果です。2 バイトを書くこと自体が目的ではありませんでした。私ができる限り遠くまで行けるようにしたかったのです。
マウスに何かを書き込みたい場合は、以下のコードをご覧ください: https://github.com/timwehrle/mouse‑fs。Unifying 受信機を使用しているロジクールマウスならどれでも動作します。