So-net無料ブログ作成

FSDirWalkerを公開しました (2) [ソフトウェア]

前回の続きで

・ドライブやボリュームGUIDの割り当ての無いボリューム(パーティション)の内容を参照したい。

についてです。

Windowsでのドライブ名は、実際のところMS-DOSから続く過去の遺産(後方互換)として継続している面があり、内部的にはショートカットの一種の様な扱いになっており、パーティションやデバイスにドライブを割り当て無しにする事もできます。また、PCのリストア用データ格納の為にドライブ無しで最初から予約されているパーティションもあります。

ドライブ名が無くても、通常はボリュームマネジャがGUID形式の識別子を割り当てており、それを元に識別することができます。以下はWin32での書式です。

\\?\Volume{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}
(xxx...は16進数)

ドライブの無いボリュームにアクセスする場合、例えばコマンドプロンプトでは次の様に参照します。

dir \\?\Volume{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}\windows\system32

Windowsエクスプローラでも上記の形式を直接アドレスバーに入力すればフォルダを参照できます。
(アプリケーションによってはこの形式を解釈できない場合があります)

ところが、希にGUID形式のボリューム名が割り当てられていない予約ボリュームを見かけることがあります(私も大量のPCを見た訳では無いので割合は解からないのですが)。

その場合は、ネイティブオブジェクトのネームスペース形式を使って参照するしかありません。

以下は、そのネイティブ表記したボリュームオブジェクトのパスです。

\Device\HarddiskVolume1

この形式でディレクトリやファイルにアクセスする場合次の様になります。

\Device\HarddiskVolume1\Windows\System32

この名前空間は、ネイティブAPI(ユーザーモードではNTDLL.DLLが提供するシステムコール)ではそのまま使うことができますし、Win32 APIレベルでは "\\?\GLOBALROOT" というプリフィックスを付けて渡すことでネイティブのネームスペースと解釈してもらえます。

しかし、私の知る限りコマンドプロンプトのdirコマンドやWindowsエクスプローラではこのプリフィックスは解釈できない様なのでそのままでは内容を参照できません。

NTFSであれば、mklinkコマンドでドライブもGUID名も無いボリューム対してシンボリックリンクを作成することで参照できる様になりますが、私としてはその様な常設の方法ではなく一時的に確認できれば良いと考えました。それに私のことだからリンクを作ったまま忘れてしまって、そのうち誤操作してしまいそうです。
(ボリューム内容を参照する標準ツールで"\\?\GLOBALROOT" プリフィックスを解釈できるコマンドをご存知でしたらご教示頂きたいです)

(追記) 記事を上げた後にネイティブオブジェクト名の参照方法として、以下の様な記述に思い当たりました。
dir \\.\HarddiskVolume1\Boot
Windows7のコマンドプロンプトは受け入れますが、XPでは不可な様です。ルートを参照する場合は変則的ですが、以下の様に指定すると受け入れます。
dir \\.\HarddiskVolume1\\
"\\?\","\\.\","\\?\GLOBALROOT"といったプリフィックスは、何れもWin32API呼び出しの際付与し、パスを解釈させる為のものですが、そのままコマンドライン上で通用することは恥ずかしながらいままで知りませんでした。他にもありましたらぜひご教示頂きたいです。

以上の様に、ドライブの無いボリュームを参照する方法はありますが、GUID形式にしても覚えていられないので一度探さなければならないし、ネイティブの場合も単純な方法が無く手間がかかる。そんなところから、もっと「カジュアルに」参照したい、と考えFSDirWalkerを書き始めた理由のひとつでした。

(続く)
コメント(0) 

コメント 0

コメントを書く

お名前:[必須]
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。