お世話になっております。
現在、MSDOSデバイス名を含むファイルパス(\Device\HarddiskVolumeX\~~)とドライブ
レターから始まる通常のファイルパス(C:\~~)を相互変換する処理を実装しておりま
す。
ドライブレターからMSDOSデバイス名を取得するためにQueryDosDevice関数を利用してい
るのですが、ダイナミックディスクのドライブレターをQueryDosDevice関数に渡すと、シ
ンボリックリンクが返ってきてしまいます。
取得したいのはそのシンボリックリンク先のパスなのですが、これを取得する方法が分か
りません。
例えば、Dドライブがダイナミックディスクである時、QueryDosDevice関数にDを渡すと
「\Device\HarddiskDmVolumes\MyComputerDg0\Volume1」というシンボリックリンクが
返ってきます。
これは「\Device\HarddiskDmVolumes \PhysicalDmVolumes\BlockVolume1」を指してお
り、現在実装している処理でDドライブとリンク先の「\Device
\HarddiskDmVolumes\PhysicalDmVolumes\BlockVolume1」とを相互変換できるようにした
いと考えています。
どのようにしたらシンボリックリンク先のパスの取得できるのでしょうか?
宜しくお願いします。
OS はなんでしょう?
Hyper-V 上の Windows 7 x64 だと再現しませんでした。
>aetosさん
返信が遅くなってしまい申し訳ございません。
環境はHyper-V上のWinServer2003です。
シンボリックリンクに関しては以下のサイトに詳しい記述がございましたのでこちらをご
参照下さい。
http://www.atmarkit.co.jp/fwin2k/bookpreview/insidewin42/insidewin42_04.html
QueryDosDevice関数が参照しているGlobal MS-DOS Device namespaceをWinObjにて列挙し
たところ、やはりドライブレターからはシンボリックリンクしか引けないようになってい
ました…。
現在は応急処置として、以下のような処理でMSDOSデバイス名を取得しています。
1.
GetVolumeNameForVolumeMountPoint関数で対象ダイナミックディスクのGUIDを取得
2.
SetupDiGetDeviceInstanceId関数で接続されているデバイスのデバイスインスタンスIDを
列挙し、そのデバイスインスタンスID中に1.で取得したGUIDが含まれているかチェック
(ダイナミックディスクのデバイスインスタンスID中に1で取得したGUIDが含まれていたた
め利用しています。)
3.
含まれていた場合はSetupDiGetDeviceRegistryProperty関数で
SPDRP_PHYSICAL_DEVICE_OBJECT_NAMEの値を取得し終了
4.
含まれていない場合は2へ
私の環境では以上の処理でMSDOSデバイス名を取得できているのですが、他の環境でも同
じように引ける確証が全くありません(特に上記処理2で使っているデバイスインスタン
スIDについて、このIDが必ずダイナミックディスクのGUIDを含む形で生成されるのかどう
か分かりません)。
この処理で問題ないか、またもっとスマートな方法があればその方法等、どのような情報
でも結構ですので教えていただけると有り難いです。