Partition Viewer

Windows XP以降でパーティションのマウント先やARC名などを表示するツールをC#で作成しました。以下にソースを置いておきます。

マウント先をkernel32.dll内の以下の関数で取得しています。ドライブやパーティションの情報は NT Object Manager から取得しているため、FindFirstVolume()等のWin32APIは使用していません。

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にも対応させるにはやや複雑な手順が必要です。得られる情報が逆のため、集計して抽出することになります。

  1. 調べるドライブのボリューム名をGetVolumeNameForVolumeMountPoint()で取得する。
  2. ボリューム内のマウントポイントをFindFirstVolumeMountPoint()で取得する。このAPIで取得したパスにはドライブ名が含まれていないので付加する。
  3. マウントポイントにマウントされているボリュームの名前をGetVolumeNameForVolumeMountPoint()で取得する。
  4. 1~3の手順をすべてのドライブに対して行い、目的のボリュームのマウント先を抽出する。

今回はWindows 2000に対応していない.NET Framework 3.5を使用しているため、APIでの対応も見送りました。

カテゴリー: プログラミング パーマリンク

コメントを残す