Linux再インストール(4)

部屋を模様替えするため、今まで使ってた有線LANができなくなるので無線LANの導入。
家にあったのはBUFFALOのPCMCIAカードだけで、しかもでかでかと11Mbpsとか書いてあるので放置。つーことで大学生協で、一番安かったBUFFALO WLI-UC-GNを購入。1980円でした。
そのまま差してもドライバを認識してくれないのでぐぐってみると、どうもチップのベンダがLinux用ドライバを開発してるらしい。で、早速そこから2009_0424_RT3070_Linux_STA_v2.1.0.0.tar.bz2を落としてきてmake。が、エラー。

struct 'net_device' has no member named 'priv'

だって。ぐぐったところ、privはプライベートデータへのポインタで、今はnetdev_priv(net_dev)みたいにしてアクセスしなきゃいけないらしい。そこでさくっと置換して続行。今度は違うエラー。

struct 'task_struct' has no member named 'fsuid'

これもググると、srpmのパッチが引っかかったので、これを参考に修正。
これでやっとrt3070.koが出来上がったので、早速insmod。で、/sbin/ifconfig rt0してみる。するとなんかパケットカウンタの表示がおかしい・・・。どうも未初期化値っぽい値が表示されててとても怪しげ。不安を感じながらwpa_supplicantを起動してみると、なんとSegmentation fault。これはまずいと思ってsudo modprobe -rするとフリーズして帰ってこない・・・どうもKernelを巻き込んで死んだっぽい。うぼー。
その後いろいろ調べてみるもなんも解決策が見つからず、ndiswrapperを使ってみる事に。途中でunknown field 'poll_controller'とか言われたけど、これはKernelのヘッダでgrep掛けるとすぐ出てきて、ndo_poll_controlerの間違いのようなので、そこだけ直すと素直に通りました。#ifdefの中なので、作者の環境では使わないとこなんでしょう・・・。付属CDからドライバをインストール。ところが、modprobe ndiswrapperしても認識されてない・・・dmesgを見ると、

ndiswrapper (import:242): unknown symbol: ntoskrnl.exe:'MmGetSystemRoutineAddress'

うーむ。そんなら空定義作ってみるか?と思いながら調べてみると、同じことを考えてる人が。これと同じダミーを作ってmakeしたら、見事に認識しました。ちなみに上の関数は

ndiswrapper (MmGetSystemRoutineAddress:2461): MmGetSystemRoutineAddress: RtlGetVersion

という、いかにも要らなそうな関数を得るためにしか使ってないので問題なさそうです。