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
らすぴー
May 30, 2026
Technology
580
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
電子辞書Brainをネットに繋げてみた(自力編)
をやりたかったんですけどね...
らすぴー
May 30, 2026
More Decks by らすぴー
See All by らすぴー
高校のChromebookでも自由なネット環境を!
raspython3
0
180
限界環境CPython rev. seccamp2025
raspython3
0
50
kernel-vm-ittekita-yuukousai
raspython3
0
110
kernelvm-brain-net
raspython3
0
1.1k
pyconjp2024-wince
raspython3
0
57
seccamp2024-edictionary-python-TLS
raspython3
0
51
Other Decks in Technology
See All in Technology
新しいUbuntu/GNOMEが使いたいからXからWaylandへ移行頑張ってるの巻 2026-06-20
nobutomurata
0
100
LLMにもCAP定理があるという話
harukasakihara
0
360
AAIFに入ってみた ~内から見えるコミュニティ動向~
sato4
0
220
LayerXにおけるセキュリティ管理の現在地と次の一手
tosho
0
180
AIソロプレナー時代に2ヶ月で20人増員した事業創造会社の開発組織の話
miyatakoji
0
660
【Cyber-sec+】経営層を"動かす"ための考え方
hssh2_bin
0
180
Snowflakeと仲良くなる第一歩
coco_se
4
470
やさしいA2A入門
minorun365
PRO
12
1.9k
脆弱性対応、どこで線を引くか
rymiyamoto
1
390
ACE-Step-1.5で見る 音楽生成AIのしくみと“破綻だけ直す”Retake機能の開発【zennfes spring 2026 登壇資料】
personabb
1
460
2026 TECHFRESH 畢業分享會 - 開發日常大解密!從領域驅動到企業級上線
line_developers_tw
PRO
0
1k
2026TECHFRESH畢業分享會 - 葬送的通靈師:化系統與用戶雜訊成行動訊號
line_developers_tw
PRO
0
1k
Featured
See All Featured
30 Presentation Tips
portentint
PRO
1
320
A Soul's Torment
seathinner
6
2.9k
The Invisible Side of Design
smashingmag
302
52k
Navigating Weather and Climate Data
rabernat
0
220
SEOcharity - Dark patterns in SEO and UX: How to avoid them and build a more ethical web
sarafernandez
0
200
The SEO identity crisis: Don't let AI make you average
varn
0
490
職位にかかわらず全員がリーダーシップを発揮するチーム作り / Building a team where everyone can demonstrate leadership regardless of position
madoxten
62
54k
Being A Developer After 40
akosma
91
590k
Navigating the Design Leadership Dip - Product Design Week Design Leaders+ Conference 2024
apolaine
1
350
The B2B funnel & how to create a winning content strategy
katarinadahlin
PRO
1
380
Beyond borders and beyond the search box: How to win the global "messy middle" with AI-driven SEO
davidcarrasco
3
160
16th Malabo Montpellier Forum Presentation
akademiya2063
PRO
0
140
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