Windows XP以降でパーティションのマウント先やARC名などを表示するツールをC#で作成しました。以下にソースを置いておきます。
マウント先をkernel32.dll内の以下の関数で取得しています。ドライブやパーティションの情報は NT Object Manager から取得しているため、FindFirstVolume()等のWin32APIは使用していません。
- GetVolumePathNamesForVolumeName (Windows XP以降のみ)
P/Invokeで呼び出している部分を抜粋します。
[DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Auto)] private static extern bool GetVolumePathNamesForVolumeName( string lpszVolumeName, char[] lpszVolumePathNames, int cchBuferLength, out int lpcchReturnLength); public static string[] GetVolumePathNames(string volume) { int len; GetVolumePathNamesForVolumeName(volume, null, 0, out len); var buf = new char[len]; if (!GetVolumePathNamesForVolumeName(volume, buf, buf.Length, out len)) return null; var list = new List<string>(); foreach (string s in new string(buf).Split('')) if (!string.IsNullOrEmpty(s)) list.Add(s); return list.ToArray(); } |
ボリューム名(例: "\?Volume{GUID}")を渡すとマウント先が返って来ます。
このAPIを使わずにWindows 2000にも対応させるにはやや複雑な手順が必要です。得られる情報が逆のため、集計して抽出することになります。
- 調べるドライブのボリューム名をGetVolumeNameForVolumeMountPoint()で取得する。
- ボリューム内のマウントポイントをFindFirstVolumeMountPoint()で取得する。このAPIで取得したパスにはドライブ名が含まれていないので付加する。
- マウントポイントにマウントされているボリュームの名前をGetVolumeNameForVolumeMountPoint()で取得する。
- 1~3の手順をすべてのドライブに対して行い、目的のボリュームのマウント先を抽出する。
今回はWindows 2000に対応していない.NET Framework 3.5を使用しているため、APIでの対応も見送りました。