削除できない不正なフォルダを作成&削除する方法 | Prnフォルダの由来

不正なフォルダ名・ファイル名とその由来

Windowsではフォルダ名・ファイル名として使用できない文字列があり、その文字列でフォルダを作成しようとしてもエラーが表示されフォルダが作成できません。

例えば「Prn」という名前でフォルダを新しく作ってみてください。

Prnという名前のフォルダを作成できない

この画像のように「指定されたデバイス名は無効です。」というエラーメッセージが表示され、フォルダは作成できません。

 

これはMS-DOS (Windowsの前にMicrosoftが販売していたOS) において特別な役割を持つファイル名であり、その仕様がWindowsにも引き継がれたことでファイルの作成ができなくなっています。

デバイスファイルと呼ばれる特別なファイルで、MS-DOS時代にパソコンに接続した各デバイス(プリンター, モデムなど)にデータを送信する際にデバイス自体をあたかも通常のファイルと同じように扱うことで、デバイスへの情報の出力・デバイスからの情報の入力が通常のファイルの読み書きと同じようにできる利点がありました。

例えば「Prn」はパソコンに接続したプリンター (Printer) を表すデバイスファイル名で、MS-DOSで以下のようにコマンドを入力するとhello.txt 内の文字がプリンターに送信され、hello.txt を印刷できます。

type hello.txt > PRN

MS-DOS時代はPC操作自体を基本的に全てコマンド入力で行っていました。(CUI:Character User Interface)

もちろんファイル操作もコマンド入力で、↑のtypeコマンドは「type ○○ > △△」の形式で「〇〇ファイルの内容を△△ファイルに出力する」というコマンドです。

プリンターはファイルではありませんが PRN というデバイスファイルがあるおかげで、普通のファイルと同じようにPRNファイルに文字を出力するコマンドを打つことで印刷が行えます。

デバイスファイルは他にもあり、デバイスを通常のファイルと同様に扱える便利なものです。

type CON > hello.txt

「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」コマンドを実行すると 「続行するには何かキーを押してください . . .」と画面に表示されるが、この出力が不要なら

pause > NUL

というコマンドにすれば、「続行するには…」の文章は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

作成できないフォルダ名で強制的に作成する方法

手順

上記の予約デバイス名のフォルダを無理やり作成する方法が存在します。以下のとおりです。
※お使いの端末によっては円記号がバックスラッシュで表示されていると思いますが、コマンドはそのままコピーするだけで動作します。

  1. コマンドプロンプトを開く
    (※ Windowsキー + R のショートカットキーを押し、出てきた入力欄にcmdと入力してEnter)

    作成できないフォルダ名で強制的に作成する方法

  2. 次のコマンドをコマンドプロンプトに入力してEnterを押す
    md \\.\c:\users\%username%\desktop\Prn

    作成できないフォルダ名で強制的に作成する方法

  3. F5キーを押して、デスクトップを更新する → Prnフォルダが現れる!

    Prnという名前のフォルダを作成できない

これで普通には作成できなかったPrnフォルダを作ることができました。

コマンドの Prn を Aux や Con などに変えることで、同様の手順でAuxフォルダやConフォルダを作成することもできます。

コマンドの意味 (なぜ作成できたの?)

・mdコマンド … フォルダ(ディレクトリ)の作成

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フォルダーは削除できない

名前の変更もできません。

名前を変更しようとすると、「この項目は見つかりませんでした。」と表示されキャンセルするしかなくなりますが、元の「Prn」の名前に戻すと「指定されたデバイス名は無効です。」と表示され、一見無限ループに入ります(焦)。

Prnという名前のフォルダは名前を変更できない

Escキーを押すことでエラーの無限ループから脱出できるので、ご安心ください。

簡単に消せないのをいいことに、友達のパソコンにいたずらでPrnフォルダを作成するのはお止めください(笑)

作るのにひと手間かかりましたが、消すにもひと手間です。消す方法はこちら。

  1. コマンドプロンプトを開く
    (※ Windowsキー + R のショートカットキーを押し、出てきた入力欄にcmdと入力してEnter)
  2. 次のコマンドをコマンドプロンプトに入力してEnterを押す
    rd \\.\c:\users\%username%\desktop\Prn

    削除できないフォルダを削除する方法

  3. 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 の環境によって異なるようです。以下、その一覧です。

Windows 95 OSR2 の場合 :
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は化合物名←ビールの"プリン"体はこっち)

物質 プリン

ファイル名一つとっても、実は奥深い仕様と背景があって、なかなかその全容を把握できません…。

このような特殊なファイル命名の仕様が脆弱性を突くために悪用される場合があるので、ファイルシステムもきちんと理解しておかなければならないんだな~と痛感しています。

Prnフォルダーは削除できない
記事化前の最新情報はこちらで先にツイートしています。サイト更新告知もこちら。