Search
Module:
Directory

   Desktop Functions:

   Smart Device Functions:


Show Recent Changes
Subscribe (RSS)
Misc. Pages
Comments
FAQ
Helpful Tools
Playground
Suggested Reading
Website TODO List
Download Visual Studio Add-In

GetVolumePathNamesForVolumeName (kernel32)
 
.
Summary
Retrieves a list of path names for the specified volume name.

C# Signature:

[DllImport("kernel32.dll", SetLastError=true)]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool GetVolumePathNamesForVolumeNameW(string lpszVolumeName,
        char [] lpszVolumePathNames, uint cchBuferLength,
        ref UInt32 lpcchReturnLength);

C# Signature 2:

[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);

VB Signature:

Declare Function GetVolumePathNamesForVolumeName Lib "kernel32.dll" (TODO) As TODO

VB Signature #2:

'''Return Type: BOOL->int
'''param0: LPCTSTR->LPCWSTR->WCHAR*
'''param1: LPTSTR->LPWSTR->WCHAR*
'''param2: DWORD->unsigned int
'''param3: PDWORD->DWORD*
    <DllImportAttribute("kernel32.dll", EntryPoint:="GetVolumePathNamesForVolumeNameW")> _
    Public Shared Function GetVolumePathNamesForVolumeNameW(<[In]()> <MarshalAs(UnmanagedType.LPTStr)>
                            ByVal sVolumeName As String, _
                                 <MarshalAs(UnmanagedType.LPWStr)>
                            ByVal sPathNames As System.Text.StringBuilder, _
                                 ByVal uintBufferLen As UInteger, _
                            <Out()> ByRef uintReturnLen As UInteger) _
                                 As <MarshalAs(UnmanagedType.Bool)> Boolean
    End Function

User-Defined Types:

None.

Alternative Managed API:

Do you know one? Please contribute it!

Notes:

The VB Code was generated by the tool at http://clrinterop.codeplex.com/releases/view/14120. I believe this to be the same tool referenced at http://blogs.msdn.com/b/vbteam/archive/2008/03/14/making-pinvoke-easy.aspx. The StringBuilder limitation appears to apply to this code as well, and it will only return the first path/mountpoint found, but the method does work inside that limitation. I will post updated code as soon as I code and test.

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.

S.M.
The first C# signature would not work for me. I would get an ERROR_INVALID_PARAMETER error. The second signature works with the second example below.

Tips & Tricks:

Please add some!

Sample Code:

        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();
        }

Sample Code 2:

    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;
    }

Documentation

Please edit this page!

Do you have...

  • helpful tips or sample code to share for using this API in managed code?
  • corrections to the existing content?
  • variations of the signature you want to share?
  • additional languages you want to include?

Select "Edit This Page" on the right hand toolbar and edit it! Or add new pages containing supporting types needed for this API (structures, delegates, and more).

 
Access PInvoke.net directly from VS:
Terms of Use
Find References
Show Printable Version
Revisions