[DllImport("kernel32.dll", SetLastError=true)]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool GetVolumePathNamesForVolumeNameW(string lpszVolumeName,
char [] lpszVolumePathNames, uint cchBuferLength,
ref UInt32 lpcchReturnLength);
[DllImport("kernel32.dll", SetLastError=true)]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool GetVolumePathNamesForVolumeNameW(
[MarshalAs(UnmanagedType.LPWStr)]
string lpszVolumeName,
[MarshalAs(UnmanagedType.LPWStr)]
string lpszVolumePathNames,
uint cchBuferLength,
ref UInt32 lpcchReturnLength);
Declare Function GetVolumePathNamesForVolumeName Lib "kernel32.dll" (TODO) As TODO
None.
Do you know one? Please contribute it!
Using StringBuilder for the buffer does not work since this function returns the names as a bunch of strings separated by the null character ('\0'). So StringBuilder would only report the first item. Therefore we store it in a char array, which can later be converted to a bunch of strings.
Please add some!
UInt32 dwRequired = 0;
char[] buffer = new char[260];
if (!GetVolumePathNamesForVolumeName(volumeName, buffer, (uint)buffer.Length, ref dwRequired))
{
// Not enough room in buffer perhaps? Try a bigger one
buffer = new char[dwRequired];
if (!GetVolumePathNamesForVolumeName(volumeName, buffer, (uint)buffer.Length, ref dwRequired))
throw new Win32Exception();
}
public List<string> GetMountPointsForVolume(string volumeDeviceName)
{
List<string> result = new List<string>();
// GetVolumePathNamesForVolumeName is only available on Windows XP/2003 and above
int osVersionMajor = Environment.OSVersion.Version.Major;
int osVersionMinor = Environment.OSVersion.Version.Minor;
if (osVersionMajor < 5 || (osVersionMajor == 5 && osVersionMinor < 1))
{
return result;
}
try
{
uint lpcchReturnLength = 0;
string buffer = "";
GetVolumePathNamesForVolumeNameW(volumeDeviceName, buffer, (uint)buffer.Length, ref lpcchReturnLength);
if (lpcchReturnLength == 0)
{
return result;
}
buffer = new string(new char[lpcchReturnLength]);
if (!GetVolumePathNamesForVolumeNameW(volumeDeviceName, buffer, lpcchReturnLength, ref lpcchReturnLength))
{
throw new Win32Exception(Marshal.GetLastWin32Error());
}
string[] mounts = buffer.Split('\0');
foreach (string mount in mounts)
{
if (mount.Length > 0)
{
result.Add(mount);
}
}
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
return result;
}