說明
出現(xiàn)了很多問題,第一次執(zhí)行時直接程序崩潰,原因是printf函數(shù)中將GetLastError函數(shù)的返回值設(shè)置成了%s?改回%d后就正常了.修改后第二次執(zhí)行,提示掛載錯誤,錯誤值87說是參數(shù)不對,但是看參數(shù)完全沒有問題,然后我嘗試添加了一個mnt文件夾,這次返回的是錯誤值5,權(quán)限不足.啟用管理員后執(zhí)行成功,如圖2.這,難道需要已存在的文件夾才行?書上沒說啊...如圖3,還真是必須要已經(jīng)存在的文件夾才行.很坑.
圖1中第一個框中不知道為什么百分號變成中文的百分號了..可以和第二個框?qū)Ρ?
效果



源碼
#define _WIN32_WINNT 0x0601
#include
#include
#include
#define BUFSIZE MAX_PATH
#define FILESYSNAMEBUFSIZE MAX_PATH
BOOL ProcessVolumeMountPoint(HANDLE hPt, TCHAR *PtBuf, DWORD dwPtBufSize, TCHAR *Buf);
BOOL ProcessVolume(HANDLE hVol, TCHAR *Buf, DWORD iBufSize);
int GetMountPoint(void);
void Usage(PCHAR argv);
int main(int argc, PCHAR argv[]){
BOOL bFlag;
CHAR Buf[BUFSIZE];//保存卷名的緩存
if (argc != 3){//參數(shù)不對,顯示使用說明
GetMountPoint();//獲得掛載點
Usage(argv[0]);//顯示使用說明
return (-1);
}
bFlag = GetVolumeNameForVolumeMountPoint(
argv[2],//輸入的掛載點或目錄
Buf,//輸出卷名
BUFSIZE
);//將
if (bFlag != TRUE){
printf("嘗試獲取 %s 的卷名稱失敗\n", argv[2]);
return (-2);
}
printf("%s 卷的卷名稱為 %s\n", argv[2], Buf);
bFlag = SetVolumeMountPointA(argv[1], Buf);//將指定的掛載點掛載指定的卷
if (!bFlag){
printf("嘗試將 %s 卷掛載到 %s 掛載點失敗. 錯誤碼: %d", argv[2], argv[1], GetLastError());
return (bFlag);
}
}
//函數(shù):例舉掛載點
BOOL ProcessVolumeMountPoint(HANDLE hPt, TCHAR *PtBuf, DWORD dwPtBufSize, TCHAR *Buf){
BOOL bFlag;//結(jié)果
TCHAR Path[BUFSIZE];//全路徑
TCHAR Target[BUFSIZE];//掛載點設(shè)備?
printf("找到卷的安裝點是 %s\n", PtBuf);
lstrcpy(Path, Buf);//將字符串 Buf 復(fù)制到緩沖區(qū) Path
lstrcat(Path, PtBuf);//將字符串 PtBuf 追加到緩沖區(qū) Path
bFlag = GetVolumeNameForVolumeMountPoint(Path, Target, BUFSIZE);//檢索指定卷 Path 掛載點相關(guān)聯(lián)的卷GUID路徑,保存在 Target
if (!bFlag){
printf("嘗試獲取 %s 的卷名稱失敗\n", Path);
} else{
printf("目標(biāo)的掛載點是 %s\n", Target);
}
bFlag = FindNextVolumeMountPoint(hPt, PtBuf, dwPtBufSize);//從 hPt 卷句柄繼續(xù)找下一個,將結(jié)果輸出到 PtBuf
return (bFlag);
}
//判斷卷的類型
BOOL ProcessVolume(HANDLE hVol, TCHAR *Buf, DWORD iBufSize){
BOOL bFlag;//返回標(biāo)志
HANDLE hPt;//卷的句柄
TCHAR PtBuf[BUFSIZE];//掛載點路徑
DWORD dwSysFlags;//文件系統(tǒng)標(biāo)志
TCHAR FileSysNameBuf[FILESYSNAMEBUFSIZE];
printf("卷是 %s\n", Buf);
//是否是NTFS
GetVolumeInformation(Buf, NULL, 0, NULL, NULL, &dwSysFlags, FileSysNameBuf, FILESYSNAMEBUFSIZE);
if (!(dwSysFlags & FILE_SUPPORTS_REPARSE_POINTS)){
printf("此文件系統(tǒng)不支持卷掛載\n");
} else{
//得到該卷的掛載點
hPt = FindFirstVolumeMountPoint(Buf, PtBuf, BUFSIZE);
if (hPt == INVALID_HANDLE_VALUE){
printf("沒有找到卷的掛載點\n");
} else{
//顯示卷的掛載點
bFlag = ProcessVolumeMountPoint(hPt, PtBuf, BUFSIZE, Buf);
while (bFlag){
bFlag = ProcessVolumeMountPoint(hPt, PtBuf, BUFSIZE, Buf);
}
//結(jié)束
FindVolumeMountPointClose(hPt);
}
}
bFlag = FindNextVolume(hVol, Buf, iBufSize);
return (bFlag);
}
//獲得掛載點
int GetMountPoint(void){
TCHAR buf[BUFSIZE];//卷的標(biāo)識符
HANDLE hVol;//卷的句柄
BOOL bFlag;//結(jié)果標(biāo)志
printf("這臺計算機的卷的掛載點信息如下:\n");
//打開卷
hVol = FindFirstVolume(buf, BUFSIZE);
if (hVol == INVALID_HANDLE_VALUE){
printf("沒有發(fā)現(xiàn)卷\n");
return (-1);
}
bFlag = ProcessVolume(hVol, buf, BUFSIZE);//判斷卷的類型
while (bFlag){
bFlag = ProcessVolume(hVol, buf, BUFSIZE);//循環(huán)判斷所有卷的類型
}
bFlag = FindVolumeClose(hVol);
return(bFlag);
}
//使用說明
void Usage(PCHAR argv){
printf("\n%s,該程序可以在指定掛載點上掛載卷\n", argv);
printf("例如, 執(zhí)行 mount C:\\mnt\\ D:\\\n");
}