はじめに

ThinkPadの歴史において、名機の誉れ高いX40ですが、Intelの無線LANカードで使えるのは11bに対応する2100Bと11b/gに対応する2200BGで、11b/gに加え11aにも対応する2915ABGの無線LANカードを使うことはできません。
(無線LANカードを2915ABGに交換すると、悪名高き1802エラーになります。)

一時期IBMから「X40においても2915ABGのカードも利用可能」とアナウンスされていたのですが、後に間違いであると撤回され、X40ユーザの悲嘆はそれはすごいものだったようです。

【ご参考】41N2992 Intel Pro/ワイヤレス 2915ABG Mini PCI アダプター - サポート対象機種の訂正

このため、11aで無線通信するには純正で提供されているIntel以外の無線LANカードを利用する必要がありますが、CPUとチップセットがIntel製なので、無線LANカードもIntel製に揃えてCentrinoな環境にしたいと思うユーザの気持ちは痛いほど分かります。

ということで、X40に2915ABGを組み込んだ際に1802エラーを回避するにはどうすればよいか、ちょっと考察してみました。

なお、以下に書かれていることを実際に行い、改変したBIOSをX40本体に適用して利用することは、IBMのソフトウェア利用許諾に違反したり、日本国内における電波法に抵触する可能性があります。
本ページは、あくまで皆様の技術的興味を満たすための読み物と捉えて頂ければ幸いです。
BIOSの改変とアップデートには高いリスクが伴います、以下に書かれていることを試したことにより読者が被った損害について、著者である私は一切保障しないものとします。 あくまで「at your own risk」でお願いします。

アプローチ方法

1802エラーはOS起動前に、BIOSが出しているエラーです。
また、2915ABGが1802エラーで弾かれるのは、X40のBIOSの中に利用可能な無線LANカードのホワイトリストがあり、そこに2915ABGが含まれていないのが原因と思われます。

X40においては、2200BGがサポートされており、IntelのサイトからダウンロードできるPRO WirelessドライバのINFファイルには、IBM仕向けの2200BGについて2つのエントリがあります。

 VEN_8086&DEV_4220&SUBSYS_27118086 ; IBM 2200 mPCI 3B - MoW
 VEN_8086&DEV_4220&SUBSYS_27128086 ; IBM 2200 mPCI 3B - RoW

つまり

 DEV_ID=4220、VEN_ID=8086、SUBSYS_ID=27118086
 DEV_ID=4220、VEN_ID=8086、SUBSYS_ID=27128086

です。

このDEV_ID、VEN_ID、SUBSYS_IDのバイト列をBIOSファイルの中から見つけ出し、それを2915ABGのものに書き換えてやればよいのです。

また、Centrinoのロゴについても、Intelの無線LANカード(2100Bと2200BG)であることを判別して表示しているはずです。
この箇所を探し出し、それを2915ABGのものに書き換えることにより、2915ABGでもCentrinoロゴを表示させることができる筈です。

必要なもの

BIOSの修正には以下のものが必要になります。

(1) 最新のBIOSファイル(ver 2.08、FD版/eFlash版)
(2) 以前のBIOSファイル(ver 2.07、FD版/eFlash版)
(3) phcompユーティリティ(phcomp.exe)
(4) バイナリエディタ(xeditがおすすめ)
(5) USBフロッピードライブ
 → ない場合はVirtual Floppy Driveで代用可能

上記(2)ですが、最新のBIOSファイルに加え、それより前のBIOSファイルが必要になるのは、IBMのBIOSアップデートツールが、同じバージョンへのアップデートを許容していないためです。
このため、既に最新のBIOSに上げてしまっている場合には、一度古いバージョンに戻してから再び最新の(改変した)BIOSにアップデートする必要があります。

上記(3)は、圧縮済みBIOSを元どおりに展開するツールです。
X40等のThinkPadのBIOS(実態はPhoenix BIOS)は、ファイルサイズを抑えるために圧縮されているため、これを元に戻して編集するのに必要になります。

上記(5)はBIOSを更新するのに必要です。
なくてもVirtual Floppy Driveなどを駆使すればなんとかならないこともないのですが、難易度が上がるので、可能なら用意してください。

BIOSの展開

まず最初に、BIOS更新用FD、またはeFlash版の実行ファイルから圧縮されたBIOSファイル(拡張子「.FL1」)を取り出します。

FD版は作成したFDのルートディレクトリにファイルが存在するので、そのままコピーしてください。

eFlash版はちょっと面倒で、まずプログラムを実行、「次へ」「利用許諾契約に同意します」を選択し「次へ」を選択、「BIOSアップデート(1/4)」の画面が出ている段階にしておきます。
この状態で「C:\Documents and Settings\Administrator\Local Settings\Temp」に「pft??.tmp」というフォルダが出来ているので、そのフォルダ内のIMGファイルを任意の場所にコピーします。
このファイルをRaWriteやDCUなどのFDイメージをFDに書き込むツールを使ってFDを作成すれば、FD版と同じようにBIOS更新用のFDを作ることが可能です。
FDに書き込まない場合には、Virtual Floppy Drive等を使ってIMGファイルから直接圧縮されたBIOSファイルを取り出すことが可能です。

上記の手順で入手した、圧縮されたBIOSファイルを、以下のようにして展開します。

phcompによる圧縮されたBIOSファイルの復元
$ phcomp.exe /D $0193000.FL1

カレントディレクトリに「$0193000.FLh」というファイルができると思います。
これがBIOSファイルの本体になりますので、これをバイナリエディタで編集していきます。

BIOSへのパッチ

上記のようにして取り出したBIOSファイルですが、次のように編集していきます。

2200BG 2種類分のホワイトリストを2915ABG 2種類分に変更

X40 ver 2.08のBIOSファイル内には、2200BG 2種類分のホワイトリストがあります。

  DEVICE_ID=4220、VENDOR_ID=8086、SUBSYS_ID=27118086
  DEVICE_ID=4220、VENDOR_ID=8086、SUBSYS_ID=27128086

これを、以下の2915ABG 2種類分に書き換えます。

  DEVICE_ID=4223、VENDOR_ID=8086、SUBSYS_ID=10028086 Intel純正版
  DEVICE_ID=4224、VENDOR_ID=8086、SUBSYS_ID=10128086 IBMカスタマイズ版

具体的には、以下のアドレスを下記の通り書き換えます。

2200BG 2種類分のホワイトリストを2915ABG 2種類分に変更(068500h番地)
修正前 068500h : 86802042 86801127 00868020 42868012 27000000
修正後 068500h : 86802342 86800210 00868024 42868012 10000000
                       ^       ^^^^        ^          ^^

この修正で、2200BGのホワイトリストが2915ABGに置き換えられます。
副作用として元々対応していた2200BG 2種類は使えなくなります。(1802エラーが出るようになる)

バイト列の上位と下位が逆じゃないか、と気づかれた方、いいセンスをしています。
これが俗に言う「Little-Endian」というやつで、Intelのx86とお付き合いしている以上は必ず通る鬼門です。
深くはご説明しませんが、IntelのCPUではこういう風にデータが格納される、と思って頂ければいいかなと思います。

なお、上記のアドレス068500hは、X40 ver 2.08のBIOS上でのアドレスであり、それ以外のバージョンのBIOSではアドレスが違う場合があります。
その際は、「86802042 86801127」等でBIOSファイル内で検索をかけて探してみてください。(上記はいずれも16進表記です。)

Centrinoロゴチェックを2915ABG 2種類分に変更

次に、交換した2915ABGのカードでも、BIOS起動Centrinoのロゴが表示されるように変更します。

X40 ver 2.08のBIOSファイルでは、以下の2種類分の無線LANカードが挿された際に、Centrinoのロゴを表示しています。

  DEVICE_ID=1043、VENDOR_ID=8086 Intel 2100カード
  DEVICE_ID=4220、VENDOR_ID=8086 Intel 2200カード

これを、以下の2915ABG 2種類分に書き換えます。

  DEVICE_ID=4223、VENDOR_ID=8086 Intel純正版
  DEVICE_ID=4224、VENDOR_ID=8086 IBMカスタマイズ版

具体的には、以下のアドレスを下記の通り書き換えます。

Centrinoロゴチェックを2915ABG 2種類分に変更(070460h番地)
修正前 070460h : 00663D86 80431074 11663D86 80204274
修正後 070460h : 00663D86 80234274 11663D86 80244274
                             ^ ^^               ^

この修正で、上記の2種類の2915ABGでBIOS起動画面でCentrinoのロゴが表示されるようになります。
副作用として、Intel 2100/2200カードを利用する場合、BIOS起動時にCentrinoロゴが表示されなくなります。(Pentium Mロゴが表示されるようになります。)

なお、上記のアドレス070460hは、X40 ver 2.08のBIOS上でのアドレスであり、それ以外のバージョンのBIOSではアドレスが違う場合があります。
その際は、「00663D86 80431074」等でBIOSファイル内で検索をかけて探してみてください。(上記はいずれも16進表記です。)

チェックサムを変更

最後に、今までの修正により再計算が必要となったチェックサムを修正します。

具体的には、以下のアドレスを下記の通り書き換えます。

チェックサムを変更(0E8250h番地)
修正前 0E8250h : 45585444 68E2929E
修正後 0E8250h : 45585444 7FFE6CB1
                           ^^^^^^^^

ここには、BIOSの改竄を検出するためのチェックサムがあります。
この部分を適切に変更してやらないと、BIOSアップデートの際に不正なファイルとしてアップデートプログラムから蹴られてしまいます。

上記のすべての修正箇所の(変更前−変更後)を足し合わせ、元々のチェックサムの値に足しこむことにより、チェックサムを再計算しています。

なお、上記のアドレス0E8250hは、X40 ver 2.08のBIOS上でのアドレスであり、それ以外のバージョンのBIOSではアドレスが違う場合があります。
その際は、「45585444」等でBIOSファイル内で検索をかけて探してみてください。(上記はいずれも16進表記です。)

BIOSの再圧縮

最後に、上記の手順で改変したBIOSファイルを圧縮し、改変前の圧縮済みBIOSファイルと差し替えます。

phcompによるBIOSファイルの圧縮
$ phcomp $0193000.FLh

上記のようにすることにより、カレントディレクトリに圧縮済みBIOSファイル「$0193000.FL2」ができると思います。
これを元々のファイル名である「$0193000.FL1」にリネームし、FD等に書き戻してください。

BIOSの更新

上記のようにして再構築したFDを使い、X40のBIOSを更新すれば、2915ABGを挿しても1802エラーが出ないようになると思います。

また、USB FDドライブがなく、eFlash版でなんとかしたい場合には、Virtual Floppy Drive等でFDイメージを更新し、eFlash版を起動させ「BIOSアップデート(1/4)」の画面が出ている状態で「pft??.tmp」のフォルダの中のIMGファイルを更新したFDイメージに置き換えるとうまくいくかもしれません。(当方では未確認です)

最後に

尚、今回の例では2200BGのホワイトリストを書き換えているため、改変BIOSでは2200BGの無線LANカードが使えなくなってしまいます。
もっと工夫すれば、Atherosのカードのエントリを修正して2200BGのエントリを潰さないようにしたり、そもそもPhoenix BIOS Editorとかを使ってホワイトリストを拡張したりすることができると思います。

私はここまでですが、腕自慢の方は更にハックしてみては如何でしょうか?


あなたの探し物は見つかりましたか?
まさにこれだ
参考になった
ちょっと違う
これじゃない

何かメッセージがあればお願いします

このメッセージを非公開にする

ご注意

・頂いたメッセージは管理者のチェックの後、公開されます。
・メッセージの公開を希望されない場合には、「このメッセージを非公開にする」にチェックを入れてください。
・管理者が不適切と判断したメッセージは公開しませんので、予めご了承ください。


参考になった
2 (100%)

表示できるメッセージはありません。