キーボードフックドライバ


警告

このドライバを組み込むことにより,セキュリティホールが生じる場合があります. セキュアな用途に用いるマシンにはインストールしないこと.

改版履歴

2003/12/17
linux-2.4.23 カーネルに対応
2000/02/11
アプリケーションキー(?)でプログラムを起動するフィルタなど追加
2000/02/06
nicola キーボードのエミュレータを追加
2000/02/06
高速にキーボードをたたくと,読み込み側で eof を発生してしまう,というバグの「回避」.
2000/02/04
初版公開

これは何?

Linux カーネルで,キーボードデバイスから送られてくるスキャンコードを

するためのドライバです.

変換処理部をユーザプロセスに追い出したため,ユーザプロセスを変更することにより多彩な機能に対応する(と思われます). このユーザプロセスには C 以外の言語 (C++, perl, ruby など) も使用できるので,より多くの人に楽しんで(?)いただけると思います.

原理

改造

まず,下図は,Linux カーネルにおけるキーボードドライバの関係図です.

        PS/2 keyboard → low level driver ┐
                                          ├→ high level driver
        USB keyboard  → low level driver ┘

                図: Linux カーネル キーボードドライバ

キーボードからのシーケンスが物理デバイス依存の下位ドライバから,抽象度の高い上位のドライバに渡されるところにフック (hook_scancode) を設けます. また,デバイスファイルを管理するためのダミードライバ (pseudokbd.o) を組み込みます.

下図は改造後のキーボードドライバです.

        PS/2 keyboard → low level driver ┐ hook
                                          ├─○→ high level driver
        USB keyboard  → low level driver ┘  │    ↑
                                              ↓    │
                                            dummy_driver
        ↑kernel                              ↓    ↑
        ----------------------------------- device_file -------------------
        ↓user                                ↓    ↑
                                            user_process

                図: 改造キーボードドライバ

スキャンコードの注入

デバイスファイルを write only ( O_WRONLY ) で open すると,上位ドライバ 部にスキャンコードを注入することができます.

        PS/2 keyboard → low level driver ┐ hook=through
                                          ├──→ high level driver
        USB keyboard  → low level driver ┘        ↑
                                                    │
                                            dummy_driver
        ↑kernel                                    ↑
        ----------------------------------- device_file -------------------
        ↓user                                      ↑
                                            user_process

                図: スキャンコードの注入

この場合,hook はスルー動作し,低位ドライバからのシーケンスも上位ドライバに流れます.

キーボードシーケンスのフィルタリング

デバイスファイルを read ( O_RDONLY or O_RDWR ) で open すると,キーボードからのシーケンスをフィルタリングすることができます.

        PS/2 keyboard → low level driver ┐ hook=cut
                                          ├─┐   high level driver
        USB keyboard  → low level driver ┘  │    ↑
                                              ↓    │
                                            dummy_driver
        ↑kernel                              ↓    ↑
        ----------------------------------- device_file -------------------
        ↓user                                ↓    ↑
                                            user_process

                図: キーボードシーケンスのフィルタリング

この場合,hook ではシーケンスを通過させず,ダミードライバを通じてユーザプロセスへシーケンスを渡します. ユーザプロセスでフィルタリングされたシーケンスは,上位ドライバへと渡されます.

入手

ソースファイルは,pseudokbd3.tar.gz です. 中の README.euc ファイルに従ってコンパイル・インストールしてください.


Linux のお部屋のもくじ
いまいくんのページのもくじ
2003 年 12 月 17 日更新
imai@jr0bak.homelinux.net