Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
電子辞書Brainをネットに繋げてみた(自力編)
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
らすぴー
May 30, 2026
Technology
130
0
Share
電子辞書Brainをネットに繋げてみた(自力編)
をやりたかったんですけどね...
らすぴー
May 30, 2026
More Decks by らすぴー
See All by らすぴー
高校のChromebookでも自由なネット環境を!
raspython3
0
170
限界環境CPython rev. seccamp2025
raspython3
0
42
kernel-vm-ittekita-yuukousai
raspython3
0
99
kernelvm-brain-net
raspython3
0
1.1k
pyconjp2024-wince
raspython3
0
46
seccamp2024-edictionary-python-TLS
raspython3
0
40
Other Decks in Technology
See All in Technology
大規模環境でどのように監視を実現する?
yuobayashi
1
150
Node.js+TypeScriptにおけるCJS/ESM相互運用の最新ポイント
grainrigi
2
120
Python開発環境にハーネス適用を検討する
yuuka51
1
510
『家族アルバム みてね』における インシデント対応との向き合い方 / Approach incident response in Family Album
kohbis
2
200
Claude Code x Accounting
kawaguti
PRO
1
320
サプライチェーン攻撃への備えについて考えている #湘なんか
stefafafan
3
2.4k
LLM時代のリファクタリング戦略_AIエージェントによる段階的・安全なTS移行方法
play_inc
0
180
データ基盤構築・運用の現場から 〜 Snowflake Intelligence 導入で変わった、データ活用の未来 〜
wonohe
0
190
AI時代から振り返るTerraform drift運用の歴史 / AI Age Reflections on the History of Terraform Drift Operations
aeonpeople
0
410
権限管理設計を完全に理解した
rsugi
2
210
Generative UI × A2UI で AI エージェントを作った話 AI-DLC も使ってみた!
kmiya84377
1
170
テストコードのないプロジェクトにテストを根付かせる
tttol
0
160
Featured
See All Featured
How People are Using Generative and Agentic AI to Supercharge Their Products, Projects, Services and Value Streams Today
helenjbeal
1
190
Design in an AI World
tapps
1
220
SEO for Brand Visibility & Recognition
aleyda
0
4.6k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
34
2.7k
Data-driven link building: lessons from a $708K investment (BrightonSEO talk)
szymonslowik
1
1.1k
Agile Actions for Facilitating Distributed Teams - ADO2019
mkilby
0
190
Un-Boring Meetings
codingconduct
0
300
Code Review Best Practice
trishagee
74
20k
Stewardship and Sustainability of Urban and Community Forests
pwiseman
0
210
Principles of Awesome APIs and How to Build Them.
keavy
128
17k
コードの90%をAIが書く世界で何が待っているのか / What awaits us in a world where 90% of the code is written by AI
rkaga
61
44k
Chasing Engaging Ingredients in Design
codingconduct
0
200
Transcript
電子辞書Brainを ネットに繋げてみた ~ 自力編 ~ らすぴー / RasPython3 (@RasPython3) 1
をやりたかったんですがね...
自己紹介 活動名 RasPython3 / らすぴー X: @raspython3 seccamp’24 全国 seccamp’25
チューター 普段やってること 各種ウェブツールづくり 電子辞書いじり ゲーム内コーディング ネットワーク関連 etc. 2
本題に入る前に • 電子辞書Brainについて • SHARPの電子辞書シリーズ • Windows CE(WinCE)が動作 • 2021年以降のモデルは別OS
• 2chなどで自作アプリやハックが 盛んだった • 昨年5月頃にインターネット接続に ついに成功 • Kernel/VM@関西11回目で発表した • その後マルチプレイできるマイクラとかが 移植されててビビった 3 SHARP Brain SH-PW7-W 自分が持ってる機体の色違い
本題に入る前に 本日の内容はなんと 未完 です!!!(←???) 正確には、実装が終わりませんでした ネタの錬成は計画的に... 4
背景 • 昨年の Kernel/VM探検隊@関西11回目 にて • 電子辞書Brainを • ネットに繋げて •
発表をしました • 今回はその続きです 5
背景 正直なところ... • WinCEのビルド以外ほぼ何もやっていないよね??? • IPアドレス固定のPythonスクリプト書いたぐらい • 大きな問題点も • サンプルコードもMicrosoftの著作物なわけで...
• DLLとかの配布がちょっと厳しそう → 手軽に使える、まではできない 6
と、いうわけで 自分でデバイスドライバを書いて 配布できるようにしよう! 7
どうやって? • RNDISはMicrosoftがすでに書いている • 最近BrainuxがRNDISからCDC-NCMに変わった → せっかくだから CDC-NCM デバイスドライバを自分で書こう! 8
そもそも • RNDISってなんやねん • CDC-NCMってなんやねん 9
RNDIS • Remote NDIS (NDIS: Network Driver Interface Specification) の略
• WinCEのNDISレイヤーとUSBレイヤーを つないで、Ethernetフレームを受け渡す • MacOSではデフォでは使えないそうで、 そのためMacOSとの接続で使うのが めんどくさいらしい • 詳細なプロトコル仕様を見つけられなかった 10
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
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
CDC-NCM • Ethernetフレームを 右のようなNTB (NCM Transfer Block) に詰め込んで送る • 構造はかなり単純
• そりゃRNDISより 簡単なわけだ 13
RNDIS と CDC-NCM の共通点 • 中に入っているのがEthernetフレーム • どちらも複数まとめて送受信できる(はず) • RNDISのサンプルコードを読むと、
Data Class Interface と Communication Control Interfaceなど 構成がほぼ同じ 14
RNDIS と CDC-NCM の違い • 送り方が少し違う • RNDISはパケットとメッセージを同じ形式にして送受信 • パケットはバルク転送で、メッセージはコントロール転送の
Encapsulatedなんちゃらで送ってるっぽい • 中身がちょっとごちゃごちゃしてるっぽい • CDC-NCMはパケット(Ethernetフレーム)とメッセージ(リクエスト)を別 にして送る • Ethernetフレームはブロックにまとめてバルク転送 • リクエストはコントロール転送でUSB Device Request 15
方針 1. MSのドキュメントを見ながら1からコードを書く • 一番クリーンにできる • 一番大変 2. すでにあるデバイスドライバのサンプルプログラムを流用して書 く
• クリーン度合いは落ちる • 比較的楽 16
• この時点ではまだKernel/VMまで1~2か月あった • 「さすがにこれだけ時間があればなんとかなるやろ」(フラグ) • 方針1を探る 17
やること • USBのプロトコル仕様を調べながら • Windows CEにおけるデバイスドライバの書き方を調べる • CDC-NCMのプロトコル仕様を調べながらドライバを書く 18
補足:Windows CEにおけるドライバの動作 • 他のOSにおけるデバイスドライバの動作はよく知らないので 比較はしませんが... • OSのカーネルプロセスであるNK.EXEがドライバのDLLをロード • 各ドライバはNK.EXEのスレッドとして動作する •
なのでドライバのDLLとレジストリ設定さえ用意すれば動く 19
ところがどっこい その1 • Microsoftのドキュメントがスッカスカであまりにも情報不足 • WinCEのドキュメントはもともとページが抜けがち()だけど USB機能ドライバ周辺は突出してなんもない • 目次ページっぽいのはあったけどそれ以降のページが無ぇ! •
Lv.100のエスパータイプでもなければ無理 20
ところがどっこい その1 21 普通ならもっとページがある リンクになってないし検索しても情報が ほとんどヒットしない
ところがどっこい その1 • Windows CEは組み込みOS → そもそも一般向けじゃないからドキュメントが充実してない • USB Function
Driverを書くケース自体レア → 一層ドキュメントが充実してない • Microsoft → 見せなくていいとこは隠したがるのでドキュメントに書かない 22
• 他にもドキュメントに書いてないAPIがRNDISのサンプルコードで 山ほど使われている • 普段開発に使っているcegccのヘッダーファイルも足りない →方針1は諦めて、方針2に転換 ただしどちらにせよcegccに足りないヘッダーはWinCEのソースに 入ってるヘッダーを参考にして自分で用意する 23
ところで この時点であっという間に残り一週間 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 課題締切 今ここ
ところで • この週末(23,24)頑張ったらギリギリ完成しそう • 動いても動かなくてもそれも話にできるから どうにかなるでしょ ──────そう思っていた 25
ところがどっこい その2 なんと 風邪をひき発熱でダウン ...というわけで週末がログアウトしました やっべぇ(´・ω・`;;;) 26
ところがどっこい その2 • 残るは平日のみ、しかも授業・授業課題があるから あまり時間を割けない • 今流行りのAIコーディングとかも試したかったけど そんなことをやっている暇はなさそう • AIに書かせるより自分で書いたほうがおそらく速い
(内容的にAIのハルシネーションがヤバそう) 27
とにかく書く • 要するに • を書いて • こうすれば動く 28 CDC-NCM Miniport
CDC-NCM USB Transport
とにかく書く RNDISのサンプルコードの構成 • RNDISFN ... USB機能ドライバ本体、USB側の入出力担当 └ rndisfn.cpp • RNDISMINI
... NDISミニポートドライバ、NDIS側の入出力担当 ├ cemini.c ミニポートドライバのrndisfnとやり取りする側(多分) ├ hostmini.c ミニポートドライバのNDISとやり取りする側(多分) ├ rndis.c RNDISのプロトコルドライバ ├ wince.c よくわかんないけどWinCEのドライバに必要なものたち └ utils.c その他 29
とにかく書く さて... • 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千字 +各種ヘッダーファイル
とにかく書く • やることは普通の移植作業に近い • RNDIS固有の実装だけCDC-NCMのものに書き換える • それ以外はほぼ写経 • 改変が多い部分はファイル単位でまとまっていそう •
rndisfn.cpp rawに近い部分なので改変必要 • rndis.c これが一番違う • cemini.c これとrndis.cが NDIS RNDIS の変換をしている(はず) • PCを触れるときはひたすら書く • 通学時間はひたすらCDC-NCMの仕様とrndisのサンプルコードの 中身を読んで頭に叩き込む (脳内マッピングによるコーディング速度の最適化) 31
間に合わねぇ! • 自分の自作動画編集ツール(約280KB)と同じくらいのサイズ でもそれは3年くらいかけて書いてる • 頑張ったけど間に合わず • 週の前半は忙しくてコード書けず • それでも2,3日の間に
90KB 書いた • rndisfn.cppにあたるncmfn.c • rndis.cにあたるncm.cの途中まで • このスライドも前日の夜から作り始めました 32 計画性
• 正直なところ... • もし完成してもできることは去年と変わらないから 見栄えしないんだよね... 33
おわりに そういえばKernel/VM@東京のconnpassページが公開されましたね ふむ... (意味深) ご清聴ありがとう ございました! 34