昨日,その知人からどうにも不思議な事が起こって困っているというメールがきた。 知人は初めてながらも無事組立を完了し,電源を入れたら既にインストールされていたWindows95が無事立ち上がったという。次に今後の自作拡張に備え,勉強の意味を込めてWindows95の再インストールを始めることにした。私が準備してあげた起動用フロッピーでマシンを立ち上げ,FDISKを使ってパーティションの解放を始めた。 まずは,Linuxパーティションを解放,次にDドライブの拡張区画を解放,最後にCドライブの基本区画の解放をしようとした。FDISKは,区画の削除工程の最終段階で確認の為にボリュームラベルの入力を促してくる。画面上部に表示されているボリュームラベルは"Aw"と表示されている。そこでAwとキー入力するのだが,入力フィールドには,"AW"と大文字でしか入力されず,ラベル不一致で削除が拒否されてしまうと言う。 取り合えず,Windows95を立ち上げ,Cドライブに英大文字で"ABC"等の適当なボリュームラベルを一度設定し,再度実行するように返事をしておいた。 さて,この話しを聞いた時"Aw"の文字列が気になった。私のメインマシンには,Windows95,Windows3.1,DOS6.2,Linuxの4つのOS(3.1はOSとは言えないかな)がインストールされており,時々,DOS6.2でFDを使うことがある。その時にWindows95のロングファイル名の一部が"Ax <VOL>"と表示されるのを良く見かける。 知人に譲ったディスクにはボリュームラベルは設定していなかった筈である。なのにFDISKで,"Aw"と表示されている。ちなみに,DOS6.2のFDISKを使って手元のメインマシンのディスクラベルを確認してみると"AP"と表示された。このディスクも勿論ボリュームラベルを設定していない。知人が経験したのと同じような現象が発生している。 ちなみに,Windows95のインストール過程で作成した起動用フロッピーでマシンを立ち上げ直し,C:¥WINDOWS¥COMMANDディレクトリにあるFDISKで確認してみると,こちらの場合には,ボリュームラベルは何も表示されず正常である どうやらロングファイル名に対応していない古いDOS環境では,ルートディレクトリにあるロングファイル名の一部がボリュームラベルとして誤認されるようだ。知人に準備してあげた起動用フロッピーは,DOS6.2の環境で作成したものであり,このような現象が発生したことになる。 では,なぜ古いDOSではこんな事が起こるのか。原因を少し調べてみた。 Windows95になってロングファイル名が使えるようになった。従来のDOSでは英大文字8.3形式のファイル名だったがWindows95ではその制限が外され,小文字や8文字を越えるファイル名が使えるようになったことは周知のとおり。この実装にあたっては,ハードディスクのファイルシステムが従来のDOSでも使えるように互換性を持たせた形で実現された。 DOSのファイルシステムでは,ファイル名はディレクトリエントリに格納されるが,そのエントリは1ファイル名当たり32バイト使用される。エントリの使用状況,ファイル名,ファイル属性(ラベル,読み込み,システム,隠し,ディレクトリなど),作成日時,ファイルサイズ,開始クラスタ位置などが32バイトの中に格納される。 ロングファイル名を付けると,従来DOS用にエイリアスされたファイル名,例えば,「Program Files」などという名前の時は「PROGRA〜1」という名前が一つのエントリに格納され,従来DOSでDIRコマンドを使うと,このエイリアスされたファイル名が表示される。 実際のロングファイル名は,このエントリに連続する別のエントリにUNICODEで格納され,このエントリには,ロングファイル名であることを示すファイル属性が設定される。この属性は,ラベル+読み込み+システム+隠しの属性ビットをORした値になる。またエントリの連続性を示すために,エントリの最初のバイトには,A,B,C,D,...の文字が設定される。先ほどの例「Program Files」の場合では,ロングファイル名の最初のエントリは,ヘキサコードで,41(A),50(P),00(null),...が設定される。 ディスクのボリュームラベルは,ルートディレクトリエントリーに格納されるが,これが設定されていない時,従来DOSのFDISKやLABELコマンドを使うと,ロングファイル名の属性の中にラベル属性が含まれているため,このエントリの先頭に書かれた文字列をラベル名と誤認してしまう。英文字ファイル名の場合には,この文字列の3文字目はnullになっているので最初の2文字がラベル名として表示されることになる。 手元のマシンの実験で,APと表示されたが,このマシンのルートディレクトリに存在する ロングファイル名は「Program Files」だけであったため,この一部が誤認されたことになる。 知人に譲ったディスクには,「wingroov」というファイル名(フォルダ名)があったため,この先頭のwがAwとして表示されたのではないかと思われる。あるいはWINDOWSがwindowsと小文字で設定されていてその先頭のwが表示されたのかも知れない。 では,ロングファイル名が複数ある場合にどれが表示されかという疑問が残るが,そこまでの解析は行っていないのでなんともいえない。 |