GetVolumeNameForVolumeMountPoint(), SetVolumeMountPoint(), GetVolumePathName()
Compiler: Visual C++ Express Edition 2005
Compiled on Platform: Windows XP Pro SP2
Target platform: none, just for learning
Header file: Standard and Windows
Additional library: Windows Platform SDK
Additional project setting: Set project to be compiled as C
Project -> your_project_name Properties -> Configuration Properties -> C/C++ -> Advanced -> Compiled As: Compiled as C Code (/TC)
Other info: non-CLR or unmanaged
To do: Mounting a logical drive to a folder
To show: Using GetVolumeNameForVolumeMountPoint(), SetVolumeMountPoint(), GetVolumePathName() functions
// Mounting a disk or tape
#define _WIN32_WINNT 0x0501
#include <windows.h>
#include <stdio.h>
#define BUFSIZE MAX_PATH
// This program run at the command prompt
// This is wide character/unicode version...
int wmain(int argc, wchar_t *argv[])
{
BOOL bFlag, test;
// temporary buffer for volume name
char Buf[BUFSIZE];
DWORD cchBufferLength;
// If not enough arguments supplied...
// for this example you have to create the mount point first
if(argc != 3)
{
printf("\"%S\" command mounts a volume at a mount point.\n", argv[0]);
printf("Usage: %S <mount> <volume>\n", argv[0]);
printf("And make sure the <mount> exists!!!\n");
printf("Example: \"%S c:\\mymnt\\gdrive\\ g:\\\"\n", argv[0]);
// Just exit
return (1);
}
// Some verification, check the inputs validity
bFlag = GetVolumeNameForVolumeMountPoint(
(LPCWSTR)argv[2], // input volume mount point or directory
(LPWSTR)Buf, // output volume name buffer
BUFSIZE // size of volume name buffer
);
if(bFlag != TRUE)
{
printf("Retrieving volume name for %S failed. Error: %d\n", argv[2], GetLastError());
// Just exit
return (2);
}
printf("Volume name of %S is %S\n", argv[2], Buf);
bFlag = SetVolumeMountPoint(
(LPCWSTR)argv[1], // mount point
(LPCWSTR)Buf // volume to be mounted
);
// Another verification, error checking
if(!bFlag)
printf("Attempt to mount %S at %S failed.\n", argv[2], argv[1]);
else
{
printf("%S is successfully mounted at %S\n", argv[2], argv[1]);
cchBufferLength = 100;
// If the function succeeds, the return value is nonzero.
// If the function fails, the return value is 0 (zero).
// To get extended error information, call GetLastError.
test = GetVolumePathName(
argv[2],
argv[1],
cchBufferLength
);
if(test != 0)
printf("The Volume path name for %S is %S.\n", argv[2], argv[1]);
else
printf("GetVolumePathName() failed, error %d", GetLastError());
}
return (bFlag);
}
Output example:
(This program run at the command prompt)
F:\vc2005project\cplus\debug>cplus
"cplus" command mounts a volume at a mount point.
Usage: cplus <mount> <volume>
And make sure the <mount> exists!!!
Example: "cplus c:\mymnt\gdrive\ g:\"
F:\vc2005project\cplus\d.e.b.u.g>cplus C:\mymount\ K:\
Volume name of K:\ is \\?\Volume{4039899b-f63b-11d9-9648-806d6172696f}\
K:\ is successfully mounted at C:\mymount\
The Volume path name for K:\ is K:\.
F:\vc2005project\cplus\d.e.b.u.g>