[WinAPI] API 6 [操作驱动器挂载点]

简介:


 

 

驱动器挂载点,又可以称作卷挂载点。挂载点实际上是操作系统或者用户设置的,用来进入一个逻辑驱动器或者卷的入口。在设置了卷的挂载点后,用户或者应用程序可以使用卷标或者指定的挂载点来进入卷。比如在“C:\”下设置了一个“E\”:卷的挂载点mnt,那么打开“E:\”和打开“C:\mnt”实际上都是进入“E:\”卷。
一般可以用FindFirstVolumeMountPoint系列的API来找到一个卷的所有挂载点;用GetVolumeNameForVolumeMountPoint来获取指定挂载点所指向的卷名,卷名形式为"\\?\Volume{GUID}\”;用SetVolumeMountPoint来设置新的挂载点。

 

通过系统的磁盘管理功能可以设置卷的挂载点:

◇“我的电脑”图标右键菜单中选择“管理”。
◇弹出“计算机管理”窗口,选择“磁盘管理”。
◇选中需要挂载的卷,在右键菜单中选择“更改驱动 器名和路径”。
◇在弹出的对话框中单击“添加”按钮,选择“装入 以下空白NTFS文件夹”。
◇选择需要将卷挂载入的文件夹(空白),单击“确定”按钮。
◇卷就被装入文件夹中,之后就可以和访问文件夹一个访问这个卷了。

 

(1)FindFirstVolumeMountPoint.
获取指定卷的第一个挂载点

◇参数
lpszRootPathName:输入参数,指定要查找的卷名,必须以反斜杠结尾。
lpszVolumeMountPoint:输出参数,找到的第一个挂载点。
cchBufferLength.输入参数,用来储存输出挂载点的缓存的大小。
◇返回值
返回HANDLE值,为一个查找句柄,FindNextVolumeMountPoint用该句柄查找下一个挂载点。错误时值为INVALLD HANDLE VALUE,以用GetLastError()函数获取更详细的错误信息。


(2) FindNextVolumeMountPoint
查找指定卷的后继挂载点

◇参数
hFindVolumeMountPoint:输入参数,查找句柄,由FindFirstVolumeMountPoint获取。
lpszVolumeMountPoint:输出参数,找到的后继挂载点。
cchBufferLength:输入参数,用来储存输出挂载点的缓存的大小。
◇返回值
返回BOOL值,表示查找是否成功,失败并且GetLastError函数返回ERROR NO_ MORE
FILE$代码时表示已经查找完所有挂载点。


(3)FindVolumeMountPointClose.
关闭FindVolumeMountPointClose打开的卷句柄

◇参数
hFindVolumeMountPoint:要关闭的挂载点查找句柄。
◇返回值


(4)GetVolumeNameForVolumeMountPoint。
根据指定的挂载点获取相应的卷设备名

◇参数
lpszVolumeMountPoint:输入参数,指定需要查找挂载点或者根目录,以反斜杠结束。
lpszVolumeName:输出参数,挂载点对应的卷设备名,形式为“\\?\Volume{GUID}\”。

cchBufferLength:输入参数,用来储存输出设备名的缓存大小。
◇返回值
返回BOOL值,表示函数是否成功,同样可以用GetLastError函数获取更详细的错误信息。


(5)SetVolumeMountPc
将指定卷挂载到指定挂载点处

◇参数
lpszVolumeMountPoint:输入参数,指定的挂载点,挂载点必须为一个根路径或者一个在现有卷上的路径,必须以反斜杠结束。
lpszVolumeName:输入参数,卷设备名,形式为“\\?\Volume{GUID}\”。
◇返回值
返回BOOL值表示函数是否成功,同样可以用GetLastError()函数获取更详细的错误信息。

 

复制代码
  1 #define _WIN32_WINNT 0x0501
  2 #include <windows.h>
  3 #include <stdio.h>
  4 #include <tchar.h>
  5 #define BUFSIZE            MAX_PATH
  6 #define FILESYSNAMEBUFSIZE MAX_PATH
  7 
  8 /* ************************************
  9 * ProcessVolumeMountPoint
 10 * 功能 列举挂载点
 11 **************************************/
 12 BOOL ProcessVolumeMountPoint (HANDLE hPt,
 13                               TCHAR *PtBuf, DWORD dwPtBufSize,
 14                               TCHAR *Buf)
 15 {
 16     BOOL bFlag;      // 结果
 17     TCHAR Path[BUFSIZE]; // 全路径
 18     TCHAR Target[BUFSIZE];   // 挂载点设备
 19 
 20     printf ("\tVolume mount point found is \"%s\"\n", PtBuf);
 21 
 22     lstrcpy (Path, Buf);
 23     lstrcat (Path, PtBuf);
 24 
 25     bFlag = GetVolumeNameForVolumeMountPoint(Path,Target,BUFSIZE);
 26 
 27     if (!bFlag)
 28         printf ("\tAttempt to get volume name for %s failed.\n", Path);
 29     else 
 30         printf ("\tTarget of the volume mount point is %s.\n", Target);
 31 
 32     bFlag = FindNextVolumeMountPoint(hPt,PtBuf,dwPtBufSize);
 33     return (bFlag);
 34 }
 35 /* ************************************
 36 * ProcessVolume
 37 * 功能 判断卷类型,列举挂载点
 38 **************************************/
 39 BOOL ProcessVolume (HANDLE hVol, TCHAR *Buf, DWORD iBufSize)
 40 {
 41     BOOL bFlag;           // 返回标志
 42     HANDLE hPt;           // 卷句柄
 43     TCHAR PtBuf[BUFSIZE]; // 挂载点路径
 44     DWORD dwSysFlags;     // 文件系统标记
 45     TCHAR FileSysNameBuf[FILESYSNAMEBUFSIZE];
 46 
 47     printf ("Volume found is \"%s\".\n", Buf);
 48 
 49     // 是否NTFS
 50     GetVolumeInformation( Buf, NULL, 0, NULL, NULL,
 51         &dwSysFlags, FileSysNameBuf, 
 52         FILESYSNAMEBUFSIZE);
 53 
 54     if (! (dwSysFlags & FILE_SUPPORTS_REPARSE_POINTS)) 
 55     {
 56         printf ("\tThis file system does not support volume mount points.\n");
 57     } 
 58     else 
 59     {
 60         // 本卷中的挂载点
 61         hPt = FindFirstVolumeMountPoint(
 62             Buf, // 卷的跟跟踪
 63             PtBuf, // 挂载点路径
 64             BUFSIZE 
 65             );
 66 
 67         if (hPt == INVALID_HANDLE_VALUE)
 68         {
 69             printf ("\tNo volume mount points found!\n");
 70         } 
 71         else 
 72         {
 73             // 处理挂载点
 74             bFlag = ProcessVolumeMountPoint (hPt, 
 75                 PtBuf, 
 76                 BUFSIZE, 
 77                 Buf);
 78             // 循环
 79             while (bFlag) 
 80                 bFlag = 
 81                 ProcessVolumeMountPoint (hPt, PtBuf, BUFSIZE, Buf);
 82             // 结束
 83             FindVolumeMountPointClose(hPt);
 84         }
 85     }
 86 
 87     // 下一个
 88     bFlag = FindNextVolume(
 89         hVol, Buf, iBufSize);
 90 
 91     return (bFlag); 
 92 }
 93 /* ************************************
 94 * int GetMountPoint(void)
 95 * 功能 获取挂载点
 96 **************************************/
 97 int GetMountPoint(void)
 98 {
 99     TCHAR buf[BUFSIZE];   // 卷标识符
100     HANDLE hVol;      // 卷句柄
101     BOOL bFlag;      // 结果标志
102 
103     printf("Volume mount points info of this computer:\n\n");
104     // 打开卷
105     hVol = FindFirstVolume (buf, BUFSIZE );
106     if (hVol == INVALID_HANDLE_VALUE)
107     {
108         printf ("No volumes found!\n");
109         return (-1);
110     }
111 
112     bFlag = ProcessVolume (hVol, buf, BUFSIZE);
113     while (bFlag) 
114     {
115         bFlag = ProcessVolume (hVol, buf, BUFSIZE);
116     }
117 
118     bFlag = FindVolumeClose( hVol );
119     return (bFlag);
120 }
121 
122 /* ************************************
123 * void Usage (PCHAR argv)
124 * 功能 使用方法
125 **************************************/
126 void Usage (PCHAR argv)
127 {
128     printf( "\n\n\t%s, mount a volume at a mount point.\n", argv );
129     printf( "\tFor example, \"mount D:\\mnt\\drives\\ E:\\\"\n" );
130 }
131 
132 /* ************************************
133 * main
134 * 功能 入口函数
135 **************************************/
136 int main( int argc, PCHAR argv[] )
137 {
138     BOOL bFlag;
139     CHAR Buf[BUFSIZE];    
140 
141     if( argc != 3 ) 
142     {
143         GetMountPoint();
144         Usage( argv[0] );
145         return( -1 );
146     }
147 
148     bFlag = GetVolumeNameForVolumeMountPointA(
149         argv[2],   // 输入挂载点或目录
150         Buf,     // 输出卷名
151         BUFSIZE
152         );
153 
154     if (bFlag != TRUE) 
155     {
156         printf( "Retrieving volume name for %s failed.\n", argv[2] );
157         return (-2);
158     }
159 
160     printf( "Volume name of %s is %s\n", argv[2], Buf );
161     bFlag = SetVolumeMountPointA(
162         argv[1], // 挂载点
163         Buf    // 需要挂载的卷
164         );
165 
166     if (!bFlag)
167     {
168         printf ("Attempt to mount %s at %s failed. error code is\n", 
169             argv[2], argv[1], GetLastError());
170     }
171 
172     return (bFlag);
173 }
复制代码
相关文章
|
4月前
|
文字识别 小程序 安全
印刷文字识别操作报错合集之微信小程序调用API时路径总是返回不对,该如何处理
在使用印刷文字识别(OCR)服务时,可能会遇到各种错误。例如:1.Java异常、2.配置文件错误、3.服务未开通、4.HTTP错误码、5.权限问题(403 Forbidden)、6.调用拒绝(Refused)、7.智能纠错问题、8.图片质量或格式问题,以下是一些常见错误及其可能的原因和解决方案的合集。
|
4月前
|
文字识别 前端开发 API
印刷文字识别操作报错合集之通过HTTPS连接到OCR服务的API时报错,该如何处理
在使用印刷文字识别(OCR)服务时,可能会遇到各种错误。例如:1.Java异常、2.配置文件错误、3.服务未开通、4.HTTP错误码、5.权限问题(403 Forbidden)、6.调用拒绝(Refused)、7.智能纠错问题、8.图片质量或格式问题,以下是一些常见错误及其可能的原因和解决方案的合集。
|
4月前
|
人工智能 自然语言处理 搜索推荐
探索AI驱动的未来:Open API如何赋能企业数字化转型
【7月更文第21天】在当今这个数据为王、智能引领的时代,人工智能(AI)已不再是遥远的概念,而是深深融入到各行各业,成为推动企业数字化转型的重要引擎。随着技术的不断成熟与开放,Open API(开放应用程序接口)作为一种连接技术与业务的桥梁,正以前所未有的方式赋能企业,加速其智能化进程。本文将深入探讨Open API如何通过简化集成、促进创新、提升效率等途径,助力企业在AI时代中乘风破浪,实现数字化转型的华丽蜕变。
136 1
|
4月前
|
DataWorks 关系型数据库 MySQL
DataWorks操作报错合集之调用CreateQualityRule API时,BlockType参数为0,会报错:"blockType less than minimum",该怎么办
DataWorks是阿里云提供的一站式大数据开发与治理平台,支持数据集成、数据开发、数据服务、数据质量管理、数据安全管理等全流程数据处理。在使用DataWorks过程中,可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。
|
4月前
|
前端开发 JavaScript API
惊天揭秘!AJAX与Fetch API如何让你的前后端交互秒变‘神级操作’!
【7月更文挑战第15天】在Web开发中,AJAX和Fetch API革新了前后端交互,告别了表单提交带来的页面刷新。AJAX利用XMLHttpRequest实现部分页面更新,开启无刷新时代;Fetch API作为现代替代,以其简洁和Promise支持简化异步操作。从AJAX的先驱地位到Fetch API的进化,两者提升了Web应用的性能和用户体验,成为现代开发的必备技能。
47 2
|
4月前
|
搜索推荐 API UED
资源部署及场景API调用体验过程的引导与操作流畅性
资源部署及场景API调用体验过程的引导与操作流畅性
|
4月前
|
XML JSON 文字识别
印刷文字识别操作报错合集之API调用过程中报错469,是什么导致的
在使用印刷文字识别(OCR)服务时,可能会遇到各种错误。例如:1.Java异常、2.配置文件错误、3.服务未开通、4.HTTP错误码、5.权限问题(403 Forbidden)、6.调用拒绝(Refused)、7.智能纠错问题、8.图片质量或格式问题,以下是一些常见错误及其可能的原因和解决方案的合集。
|
5月前
|
运维 DataWorks 数据管理
DataWorks操作报错合集之调用RegisterLineageRelation api时报错,是什么原因?
DataWorks是阿里云提供的一站式大数据开发与治理平台,支持数据集成、数据开发、数据服务、数据质量管理、数据安全管理等全流程数据处理。在使用DataWorks过程中,可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。
40 2
|
4月前
|
运维 Devops API
阿里云云效操作报错合集之直接用API调用可以使用,但是本地用Go代码调用失败,是什么导致的?
本合集将整理呈现用户在使用过程中遇到的报错及其对应的解决办法,包括但不限于账户权限设置错误、项目配置不正确、代码提交冲突、构建任务执行失败、测试环境异常、需求流转阻塞等问题。阿里云云效是一站式企业级研发协同和DevOps平台,为企业提供从需求规划、开发、测试、发布到运维、运营的全流程端到端服务和工具支撑,致力于提升企业的研发效能和创新能力。
|
4月前
|
运维 Kubernetes API
阿里云云效操作报错合集之API返回的错误信息,错误码为"Operate.NoPermission",该如何解决
本合集将整理呈现用户在使用过程中遇到的报错及其对应的解决办法,包括但不限于账户权限设置错误、项目配置不正确、代码提交冲突、构建任务执行失败、测试环境异常、需求流转阻塞等问题。阿里云云效是一站式企业级研发协同和DevOps平台,为企业提供从需求规划、开发、测试、发布到运维、运营的全流程端到端服务和工具支撑,致力于提升企业的研发效能和创新能力。