4.3 查找和設(shè)置掛載卷

說明

出現(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");

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容