前提 §
IBM-PC互換機のBIOSはフロッピーディスクドライブの数とタイプを指定できるものが多いが、詳細情報を指定できないものが存在する。(例 DELL Dimension3100CのA01 BIOS)
しかし、CMOS情報を強制的に書き換えることで、指定できない情報を強制できる。
CMOS情報の読み書き §
CMOS情報は以下のツールで読み書きできる。
"CMOSSAVE ファイル名"でそのマシンの基本CMOS情報をファイルに保存する。
"CMOSREST ファイル名"でファイルの内容をリストアする。
バイナリエディタでファイルを編集しても、CMOS情報を書き換えることはできない。チェックサムが合わなくなり、システムがCMOS情報をクリアしてしまうためである。
更なる工夫を要する。
変更すべき情報の確定 §
基本CMOS情報の詳細は以下にある。
これを見ると、FDの情報はオフセット10hにあり、上位4ビットがドライブAの情報を、下位4ビットがドライブBの情報であることが分かる。値は以下の通りだ。
- 00h no drive
- 01h 360 KB 5.25
- 02h 1.2 MB 5.25
- 03h 720 KB 3.5
- 04h 1.44 MB 3.5
- 05h 2.88 MB 3.5
ドライブAが1.44MB3.5inchでドライブBがないマシンは、CMOSのオフセット10hの値が40hになる。
ドライブAが1.44MB3.5inchでドライブBが1.2MB5inchなら、CMOSのオフセット10hの値は42hになる。
チェックサムの計算 §
オフセット10hを書き換えるだけではチェックサムが合わない。
チェックサムを再計算しなければならない。
多くのメーカー、機種で、チェックサムは10hから2dhまでの単純な16bit積算値である。(別ルールで計算している場合もある)
C#なら以下のようなコードで計算できる。
byte[] b = File.ReadAllBytes(args[0]);
var tgt = b.Skip(0x10).Take(0x2e - 0x10);
var sum = tgt.Sum(c => c);
Console.WriteLine($"{sum:X4}");
この価をオフセット2eh~2fhにビッグエンディアンで書き込む。
x86系はリトルエンディアンであるが、なぜかここはビッグエンディアンである。
その後 §
バイナリーエディタで上記の値を書き込んでCMOSRESTで書き戻せばCMOSは更新される。
しかし、その後で BIOSのセットアップを再実行しないと値が更新されない事例もあるようなので、注意が必要だ。
雑感 §
CMOS情報の手動更新はそれほど難しいものではないと分かった。
しかし、機種による相違や、設定の反映方法が素直ではない等の問題もあり、更新できたから終わりでもないような感じだ。
もうちょっと追求が必要だろう。