1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

個人的なメモ勉強用:File Path \\?\GLOBALROOT\Device\HarddiskVolume1\windows32\wscript.exe

Posted at

個人的なメモ勉強用

c:\windows\system32\wscript.exe

\?\GLOBALROOT\Device\HarddiskVolume1\windows32\wscript.exe

実際に拡張表現を試してみよう。

サンプルとして、Windows フォルダ内にある、
win.ini にアクセスしてみよう。

エクスプローラのアドレスバーや、
ファイルを開く汎用コモンダイアログでは、
拡張パス表現に対する対応をしているが、
コマンドプロンプトや「ファイルを指定して実行」は、
そのような制限がないため、入力して試すことが可能だ。

では、コマンドプロンプトを開き、
そこに入力して試してみよう。
ここでは、わざわざメモ帳を起動して試す。

ファイルの中身を書き出す type コマンドもあるが、
このコマンドは、パスに対して特別な処理をしているので、
テストとしては不適当なのだ。

最初は、普通にファイルの中身を表示してみよう。

> notepad "C:\WINDOWS\win.ini"

メモ帳が起動し、ファイルが表示されたと思う。

次に、パス記号を変えてみる。

> notepad "C:/WINDOWS/win.ini"

Windows のパスとしては不適当な文字なのだが、
ファイル名の正規化によって / が \ と解釈され、
正常に開くことができることが確認できる。

続いて、メタ表記を使ってみよう。

> notepad "C:/WINDOWS/../WINDOWS\win.ini"

一度上のディレクトリに移動してから再度戻るパスで、
ディレクトリ区切り記号を混在させても大丈夫である。

そして、余計な文字を追加して試して見る。

> notepad "C:/WINDOWS./win.ini....  .. . ."

ディレクトリ名の後にある 1 つのドット記号や、
ファイル名の後にある任意数のドットや空白は、
正規化によって除去されることが分かる。

さて、では拡張表現を使ってみよう。

> notepad "\\?\C:\WINDOWS\win.ini"

実は、これもちゃんと開くことができる。
メモ帳がファイルを開く際には、受け取ったパスを
ファイルを扱う API にそのまま渡しているからである。

では、ファイルを開いた後、ファイルメニューより
「名前をつけて保存」を選んでみよう。
「コモンダイアログエラー」という珍しいメッセージが出る。

メモ帳がファイルを保存する際は、
現在のファイル名を元にコモンダイアログを表示するが、
コモンダイアログでは安全のため拡張表現を受け付けず、
ダイアログを表示する際にエラーとしてあるのである。

次に、拡張表現で、パス記号などを変えてみよう。

> notepad "\\?\C:/WINDOWS/win.ini"
> notepad "\\?\C:\WINDOWS\win.ini."

これらの場合は開くことができない。
\?\ によって正規化が抑制されているので、
上の場合は、「C:/WINDOWS/win.ini」というファイル名、
下の場合は、「win.ini.」というファイル名とみなされ、
ファイルが見つからないと言うエラーとなる。

拡張表現では、C: など、一般的な名前以外の、
DOS デバイス名前空間 (??) の名前も使うことができる。

例えば、?? 空間には、GLOBALROOT という名前があり、
これは、デバイス名前空間のルートへのリンクである。
そのため、GLOBALROOT を経由すると、
あらゆるデバイスパスを使ってアクセスすることができる。

例えば、C: ドライブが、最初のハードディスクの、
最初のパーティションに存在すると仮定すると、
デバイスパスは \Device\Harddisk0\Partition1 である。

このパスを使ってファイルにアクセスするとこうなる。

> notepad "\\?\GLOBALROOT\Device\Harddisk0\Partition1\WINDOWS\win.ini"

長いパスではあるが、これでもちゃんと表示されたはずだ。
GLOBALROOT から、再度 ?? に戻ることもできる。

> notepad \\?\GLOBALROOT\??\C:\WINDOWS\win.ini

これも問題なく表示されたと思う。

このように、ファイルアクセス用の API は、
ファイルだけでなく、デバイスへのアクセス構文を持ち、

この機能は、ファイルを開くプログラムで、
標準的に使うことができるということがわかる。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?