Upgrade to Pro — share decks privately, control downloads, hide ads and more …

電子辞書Brainをネットに繋げてみた(自力編)

Sponsored · Your Podcast. Everywhere. Effortlessly. Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.

 電子辞書Brainをネットに繋げてみた(自力編)

をやりたかったんですけどね...

Avatar for らすぴー

らすぴー

May 30, 2026

More Decks by らすぴー

Other Decks in Technology

Transcript

  1. 自己紹介 活動名 RasPython3 / らすぴー X: @raspython3 seccamp’24 全国 seccamp’25

    チューター 普段やってること 各種ウェブツールづくり 電子辞書いじり ゲーム内コーディング ネットワーク関連 etc. 2
  2. 本題に入る前に • 電子辞書Brainについて • SHARPの電子辞書シリーズ • Windows CE(WinCE)が動作 • 2021年以降のモデルは別OS

    • 2chなどで自作アプリやハックが 盛んだった • 昨年5月頃にインターネット接続に ついに成功 • Kernel/VM@関西11回目で発表した • その後マルチプレイできるマイクラとかが 移植されててビビった 3 SHARP Brain SH-PW7-W 自分が持ってる機体の色違い
  3. RNDIS • Remote NDIS (NDIS: Network Driver Interface Specification) の略

    • WinCEのNDISレイヤーとUSBレイヤーを つないで、Ethernetフレームを受け渡す • MacOSではデフォでは使えないそうで、 そのためMacOSとの接続で使うのが めんどくさいらしい • 詳細なプロトコル仕様を見つけられなかった 10
  4. RNDIS • Chromium OSのソースコード の中でRNDISはクソって 書いてある • ** STRONGLY DISCOURAGED

    ** • CDC-ACM/ECM/NCMのほうが 簡単らしい 11 https://chromium.googlesource.com/chromiumos/third_party/kernel/+/0.12.392.B/chromeos/compat-wireless/drivers/net/usb/rndis_host.c
  5. CDC-NCM • CDC : Communication Device Class • NCM :

    Network Control Model • CDC-ECM (Ethernet Control Model) を ベースとしてより高速な プロトコルとして設計された • 複数のEthernetフレームを まとめて送受信することで 高速に動作する 12 https://www.usb.org/sites/default/files/NCM11.pdf
  6. RNDIS と CDC-NCM の違い • 送り方が少し違う • RNDISはパケットとメッセージを同じ形式にして送受信 • パケットはバルク転送で、メッセージはコントロール転送の

    Encapsulatedなんちゃらで送ってるっぽい • 中身がちょっとごちゃごちゃしてるっぽい • CDC-NCMはパケット(Ethernetフレーム)とメッセージ(リクエスト)を別 にして送る • Ethernetフレームはブロックにまとめてバルク転送 • リクエストはコントロール転送でUSB Device Request 15
  7. ところがどっこい その1 • Windows CEは組み込みOS → そもそも一般向けじゃないからドキュメントが充実してない • USB Function

    Driverを書くケース自体レア → 一層ドキュメントが充実してない • Microsoft → 見せなくていいとこは隠したがるのでドキュメントに書かない 22
  8. ところで この時点であっという間に残り一週間 24 17 11 12 13 14 15 16

    24 18 19 20 21 22 23 31 25 26 27 28 29 30 Kernel/VM okarev Seccamp 課題締切 今ここ
  9. とにかく書く RNDISのサンプルコードの構成 • RNDISFN ... USB機能ドライバ本体、USB側の入出力担当 └ rndisfn.cpp • RNDISMINI

    ... NDISミニポートドライバ、NDIS側の入出力担当 ├ cemini.c ミニポートドライバのrndisfnとやり取りする側(多分) ├ hostmini.c ミニポートドライバのNDISとやり取りする側(多分) ├ rndis.c RNDISのプロトコルドライバ ├ wince.c よくわかんないけどWinCEのドライバに必要なものたち └ utils.c その他 29
  10. とにかく書く さて... • RNDISFN └ rndisfn.cpp 76 KB • RNDISMINI

    ├ cemini.c 52 KB ├ hostmini.c 33 KB ├ rndis.c 64 KB ├ wince.c 16 KB └ utils.c 4 KB 30 計 245KB ≒ 24万5千字 +各種ヘッダーファイル
  11. とにかく書く • やることは普通の移植作業に近い • RNDIS固有の実装だけCDC-NCMのものに書き換える • それ以外はほぼ写経 • 改変が多い部分はファイル単位でまとまっていそう •

    rndisfn.cpp rawに近い部分なので改変必要 • rndis.c これが一番違う • cemini.c これとrndis.cが NDIS RNDIS の変換をしている(はず) • PCを触れるときはひたすら書く • 通学時間はひたすらCDC-NCMの仕様とrndisのサンプルコードの 中身を読んで頭に叩き込む (脳内マッピングによるコーディング速度の最適化) 31