不正なフォルダ名・ファイル名とその由来
Windowsではフォルダ名・ファイル名として使用できない文字列があり、その文字列でフォルダを作成しようとしてもエラーが表示されフォルダが作成できません。
例えば「Prn」という名前でフォルダを新しく作ってみてください。
この画像のように「指定されたデバイス名は無効です。」というエラーメッセージが表示され、フォルダは作成できません。
これはMS-DOS (Windowsの前にMicrosoftが販売していたOS) において特別な役割を持つファイル名であり、その仕様がWindowsにも引き継がれたことでファイルの作成ができなくなっています。
デバイスファイルと呼ばれる特別なファイルで、MS-DOS時代にパソコンに接続した各デバイス(プリンター, モデムなど)にデータを送信する際にデバイス自体をあたかも通常のファイルと同じように扱うことで、デバイスへの情報の出力・デバイスからの情報の入力が通常のファイルの読み書きと同じようにできる利点がありました。
例えば「Prn」はパソコンに接続したプリンター (Printer) を表すデバイスファイル名で、MS-DOSで以下のようにコマンドを入力するとhello.txt 内の文字がプリンターに送信され、hello.txt を印刷できます。
MS-DOS時代はPC操作自体を基本的に全てコマンド入力で行っていました。(CUI:Character User Interface)
もちろんファイル操作もコマンド入力で、↑のtypeコマンドは「type ○○ > △△」の形式で「〇〇ファイルの内容を△△ファイルに出力する」というコマンドです。
プリンターはファイルではありませんが PRN というデバイスファイルがあるおかげで、普通のファイルと同じようにPRNファイルに文字を出力するコマンドを打つことで印刷が行えます。
デバイスファイルは他にもあり、デバイスを通常のファイルと同様に扱える便利なものです。
「CON」はコンソール(コマンドの入出力画面)を表すデバイスファイルであり、これはコンソールに表示されている文字を hello.txt に出力(書き込み)するコマンドです。
このような特別な役割を持つデバイスファイルの名前は予約語に指定され、ユーザーが同名のファイルを作成できないようになっていました。
その仕様がWindowsにも引き継がれ、現在のWindows 10でも一部のファイル名が使用不可になっています。
現在、それらは「予約デバイス名」とも呼ばれています。その一覧がこちらです。
予約デバイス名 (使用不可なファイル名) | MS-DOS時代の用途 |
CON | コンソール(コマンドの入出力画面 MS-DOSプロンプト) |
PRN | プリンター ※1 |
AUX | 補助デバイス ※2 |
LPT0 ~ LPT9 | パラレルポートに接続したデバイス (プリンター・スキャナー・ZIPドライブ・ドングル ※3 ※4) |
COM0 ~ COM9 | シリアルポートに接続したデバイス (他のパソコン・マウス・モデム・バーコードリーダー) |
NUL | ビットバケツ (NULに出力されたデータは全て破棄される ※5) |
※1:実際には、LPT1に接続されたデバイスに出力される。通常はプリンターをパラレルポート1に接続しておくので、PRNでプリンターにファイルを出力できる。
※2:実際には、COM1に接続されたデバイスに入出力される。
※3:ZIPドライブ:大容量磁気ディスク 100MB, 250MB, 700MB。フロッピーディスク(約1MB)の大容量版だが互換性が無いので専用ドライブで読み込む
※4:ドングル:有料ソフトウェアの起動時や実行時にドングルが接続されていないと、そのソフトが起動できないようになっていた。ソフトのライセンス管理や社外流出防止のため使用されていた
※5:例えば「pause」コマンドを実行すると 「続行するには何かキーを押してください . . .」と画面に表示されるが、この出力が不要なら
というコマンドにすれば、「続行するには…」の文章はNULに出力されコンソールには表示されず、更にNULに出力されたデータは全て破棄されます。
コマンドによってはコマンド実行後にコンソールに文字を出力するかどうかオプションで選択不可能なものもあるので、文字をコンソールに表示したくない場合に代わりにNULに出力する、という使い方です。
・デバイスファイルにどのような入出力が行えるか。一覧表
ㅤㅤhttps://en.wikipedia.org/wiki/Device_file#PC_DOS,_TOS,_OS/2,_and_Windows
・デバイスファイルの仕様
ㅤㅤhttps://en.wikipedia.org/wiki/DOS#Reserved_device_names
・Microsoft 公式ドキュメント
ㅤㅤhttps://archive.vn/20120721143046/http://support.microsoft.com/kb/74496/en-us
作成できないフォルダ名で強制的に作成する方法
手順
上記の予約デバイス名のフォルダを無理やり作成する方法が存在します。以下のとおりです。
※お使いの端末によっては円記号がバックスラッシュで表示されていると思いますが、コマンドはそのままコピーするだけで動作します。
- コマンドプロンプトを開く
(※ Windowsキー + R のショートカットキーを押し、出てきた入力欄にcmdと入力してEnter)
ㅤㅤ
- 次のコマンドをコマンドプロンプトに入力してEnterを押す
md \\.\c:\users\%username%\desktop\Prn
ㅤ
- F5キーを押して、デスクトップを更新する → Prnフォルダが現れる!
ㅤ
これで普通には作成できなかったPrnフォルダを作ることができました。
コマンドの Prn を Aux や Con などに変えることで、同様の手順でAuxフォルダやConフォルダを作成することもできます。
コマンドの意味 (なぜ作成できたの?)
・mdコマンド … フォルダ(ディレクトリ)の作成
・\\.\ プレフィックス … Win32 デバイス名前空間へのアクセス
ファイルパスの先頭に「\\.\」を付けることで、ファイルシステムを経由せずに直接物理ディスクやボリュームにアクセスできます。
通常のプレフィックスなしのコマンドではファイルパスの指定時にファイルシステムを経由し、事前に定義されたエイリアスを参照します。
つまり新しく作るファイル名が「Prn」である場合、ファイルシステムにて事前に「Prn」がエイリアスとして定義されているので、新たに同名のファイルを作成することは制限されます。
しかし\\.\ プレフィックスを付けることでファイルシステムの経由を回避できるので、事前に定義された予約デバイス名は一切参照されず、通常では作成できないPrnフォルダが作成できます。
この辺りの詳しい仕様については、以下の公式ドキュメントに詳しく掲載されています。(英語)
・Win32 Device Namespaces「Win32 デバイス名前空間」
ㅤㅤhttps://docs.microsoft.com/ja-jp/windows/win32/fileio/naming-a-file#win32-device-namespaces
ㅤㅤ↑Naming Files, Paths, and Namespaces:ファイル名やファイルパス、名前空間について仕様が記載されている
削除できないフォルダを削除する方法
今回作成した不正な名前のフォルダは、普通にDeleteキーを押しても削除できません。
名前の変更もできません。
名前を変更しようとすると、「この項目は見つかりませんでした。」と表示されキャンセルするしかなくなりますが、元の「Prn」の名前に戻すと「指定されたデバイス名は無効です。」と表示され、一見無限ループに入ります(焦)。
Escキーを押すことでエラーの無限ループから脱出できるので、ご安心ください。
簡単に消せないのをいいことに、友達のパソコンにいたずらでPrnフォルダを作成するのはお止めください(笑)
作るのにひと手間かかりましたが、消すにもひと手間です。消す方法はこちら。
- コマンドプロンプトを開く
(※ Windowsキー + R のショートカットキーを押し、出てきた入力欄にcmdと入力してEnter)
ㅤ - 次のコマンドをコマンドプロンプトに入力してEnterを押す
rd \\.\c:\users\%username%\desktop\Prn
ㅤ
- Prnフォルダは削除される (デスクトップに変化がない場合はF5キーを押して更新)
フォルダを作るときに使ったmdコマンドをrdコマンド(指定ディレクトリを削除するコマンド)に変えただけです。
コマンドの Prn を Aux や Con などに変えることで、同様の手順でAuxフォルダやConフォルダを削除することもできます。
CONCON問題 (この仕様を突いたバグ)
問題の概要
予約デバイス名では通常のファイル名とは処理が変わってくるこの仕様を悪用した攻撃が2000年代に流行しました。
Windows 95/Windows 98 で、複数の予約デバイス名が含まれるようなファイルパスにアクセスすると唐突にブルースクリーンエラーになり、以下のようなメッセージが表示されるバグです。
例外 0E が VXD VFAT(01) + 0000A3D7 の 0028:C002ADB7で発生しました。現在のアプリケーションを終了します。
* どれかキーを押すと、現在のアプリケーションは強制終了されます。
* Ctrl + Alt + Del キーをもう一度押すと、コンピュータが再起動します。アプリケーションで保存していないデータはすべて失われます。
どれかキーを押すと、続行します。
例えば「~\CON\CON」(こんこん)や「~\PRN\PRN」(ぷりんぷりん)、「~\AUX\CON」といった2つ以上の予約デバイス名が含まれるパスにアクセスした瞬間、Windows95/98 はエラーを吐きます。
そのためCONCON問題と呼ばれています。
例えば悪意を持ったWeb サイトの作成者がハイパーリンク中にこのようなパスを指定した場合、ユーザーがリンクをクリックするとコンピュータがハングアップします。
同様に、Webページや HTMLメールにレンダリング情報のソースとして「~\CON\CON」を含むローカルファイルが指定されていると、ページやメールを表示しただけでPCがハングアップします。
なかなか致命的な不具合なので、現在は修正されています。(当時も修正パッチが配布されました。)
発生するエラーメッセージ
エラーメッセージ中のアドレスはお使いのWindows95/98 の環境によって異なるようです。以下、その一覧です。
VXD VFAT(01) + 0000A3D7 の 0028:C002ADB7
ㅤ
Windows 98 の場合 :
VXD VFAT(01) + 0000B897 の 0028:C004CD4F
ㅤ
Windows 98 Second Edition の場合 :
VXD CDFS(03) + 00009854 の 0028:C18344A4
VXD NWREDIR(07) + 00002365 の 0028:C022E451
VXD VFAT(01) + 0000B897 の 0028:C004D86F
VXD VREDIR(03) + 00003ED8 の 0028:C0278ED8
このエラー(CONCON問題)に関する詳しい情報は、こちらのMicrosoft公式ドキュメントに記載されています。(魚拓)
Prnフォルダにまつわる有名なジョークと余談
「ビル・ゲイツは学生時代に友人に Prn(プリン) とあだ名を付けられたのが嫌すぎて、Windowsで「Prn」フォルダを作れないようにした」
というニセジョークが出回っているようです(笑)
ジョークの元は5ch(当時2ch)のこのレスとの説があります。
あと、プリン(Prn)は言うまでもなくプリンター(Printer)のことであり、デザートのプリンは関係ありません。
(※プリン(菓子)はpuddingで、purineは化合物名←ビールの"プリン"体はこっち)
ファイル名一つとっても、実は奥深い仕様と背景があって、なかなかその全容を把握できません…。
このような特殊なファイル命名の仕様が脆弱性を突くために悪用される場合があるので、ファイルシステムもきちんと理解しておかなければならないんだな~と痛感しています。