[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()函数获取更详细的错误信息。
#define _WIN32_WINNT 0x0501
#include <windows.h>
#include <stdio.h>
#include <tchar.h>
#define BUFSIZE MAX_PATH
#define FILESYSNAMEBUFSIZE MAX_PATH /* ************************************
* ProcessVolumeMountPoint
* 功能 列举挂载点
**************************************/
BOOL ProcessVolumeMountPoint (HANDLE hPt,
TCHAR *PtBuf, DWORD dwPtBufSize,
TCHAR *Buf)
{
BOOL bFlag; // 结果
TCHAR Path[BUFSIZE]; // 全路径
TCHAR Target[BUFSIZE]; // 挂载点设备 printf ("\tVolume mount point found is \"%s\"\n", PtBuf); lstrcpy (Path, Buf);
lstrcat (Path, PtBuf); bFlag = GetVolumeNameForVolumeMountPoint(Path,Target,BUFSIZE); if (!bFlag)
printf ("\tAttempt to get volume name for %s failed.\n", Path);
else
printf ("\tTarget of the volume mount point is %s.\n", Target); bFlag = FindNextVolumeMountPoint(hPt,PtBuf,dwPtBufSize);
return (bFlag);
}
/* ************************************
* ProcessVolume
* 功能 判断卷类型,列举挂载点
**************************************/
BOOL ProcessVolume (HANDLE hVol, TCHAR *Buf, DWORD iBufSize)
{
BOOL bFlag; // 返回标志
HANDLE hPt; // 卷句柄
TCHAR PtBuf[BUFSIZE]; // 挂载点路径
DWORD dwSysFlags; // 文件系统标记
TCHAR FileSysNameBuf[FILESYSNAMEBUFSIZE]; printf ("Volume found is \"%s\".\n", Buf); // 是否NTFS
GetVolumeInformation( Buf, NULL, , NULL, NULL,
&dwSysFlags, FileSysNameBuf,
FILESYSNAMEBUFSIZE); if (! (dwSysFlags & FILE_SUPPORTS_REPARSE_POINTS))
{
printf ("\tThis file system does not support volume mount points.\n");
}
else
{
// 本卷中的挂载点
hPt = FindFirstVolumeMountPoint(
Buf, // 卷的跟跟踪
PtBuf, // 挂载点路径
BUFSIZE
); if (hPt == INVALID_HANDLE_VALUE)
{
printf ("\tNo volume mount points found!\n");
}
else
{
// 处理挂载点
bFlag = ProcessVolumeMountPoint (hPt,
PtBuf,
BUFSIZE,
Buf);
// 循环
while (bFlag)
bFlag =
ProcessVolumeMountPoint (hPt, PtBuf, BUFSIZE, Buf);
// 结束
FindVolumeMountPointClose(hPt);
}
} // 下一个
bFlag = FindNextVolume(
hVol, Buf, iBufSize); return (bFlag);
}
/* ************************************
* int GetMountPoint(void)
* 功能 获取挂载点
**************************************/
int GetMountPoint(void)
{
TCHAR buf[BUFSIZE]; // 卷标识符
HANDLE hVol; // 卷句柄
BOOL bFlag; // 结果标志 printf("Volume mount points info of this computer:\n\n");
// 打开卷
hVol = FindFirstVolume (buf, BUFSIZE );
if (hVol == INVALID_HANDLE_VALUE)
{
printf ("No volumes found!\n");
return (-);
} bFlag = ProcessVolume (hVol, buf, BUFSIZE);
while (bFlag)
{
bFlag = ProcessVolume (hVol, buf, BUFSIZE);
} bFlag = FindVolumeClose( hVol );
return (bFlag);
} /* ************************************
* void Usage (PCHAR argv)
* 功能 使用方法
**************************************/
void Usage (PCHAR argv)
{
printf( "\n\n\t%s, mount a volume at a mount point.\n", argv );
printf( "\tFor example, \"mount D:\\mnt\\drives\\ E:\\\"\n" );
} /* ************************************
* main
* 功能 入口函数
**************************************/
int main( int argc, PCHAR argv[] )
{
BOOL bFlag;
CHAR Buf[BUFSIZE]; if( argc != )
{
GetMountPoint();
Usage( argv[] );
return( - );
} bFlag = GetVolumeNameForVolumeMountPointA(
argv[], // 输入挂载点或目录
Buf, // 输出卷名
BUFSIZE
); if (bFlag != TRUE)
{
printf( "Retrieving volume name for %s failed.\n", argv[] );
return (-);
} printf( "Volume name of %s is %s\n", argv[], Buf );
bFlag = SetVolumeMountPointA(
argv[], // 挂载点
Buf // 需要挂载的卷
); if (!bFlag)
{
printf ("Attempt to mount %s at %s failed. error code is\n",
argv[], argv[], GetLastError());
} return (bFlag);
}
[WinAPI] API 6 [操作驱动器挂载点]的更多相关文章
- [WinAPI] API 5 [遍历驱动器并获取驱动器属性]
(1) GetLogicalDrives.获取主机中所有的逻辑驱动器,以BitMap的形式返回.◇返回值GetLogicalDrive函数返回一个DWORD类型的值,第一位表示所对应的驱动器是否存在. ...
- InfluxDB学习之InfluxDB的HTTP API查询操作
在 InfluxDB学习 的上一篇文章:InfluxDB学习之InfluxDB的HTTP API写入操作 中,我们介绍了使用InfluxDB的HTTP API进行数据写入操作的过程,本文我们再来介绍下 ...
- InfluxDB学习之InfluxDB的HTTP API写入操作
HTTP API也有两种操作:写入和查询,本文就先给大家介绍一下 InfluxDB的HTTP API的写入操作方式. 在InfluxDB学习的上一篇文章:InfluxDB学习之InfluxDB ...
- 利用Fiddler修改请求信息通过Web API执行操作(Action)实例
本人微信和易信公众号: 微软动态CRM专家罗勇 ,回复261或者20170724可方便获取本文,同时可以在第一间得到我发布的最新的博文信息,follow me!我的网站是 www.luoyong.me ...
- Hadoop基础-HDFS的API常见操作
Hadoop基础-HDFS的API常见操作 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 本文主要是记录一写我在学习HDFS时的一些琐碎的学习笔记, 方便自己以后查看.在调用API ...
- Hadoop生态圈-Hbase的API常见操作
Hadoop生态圈-Hbase的API常见操作 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.
- [原创] Delphi Win API函数 操作帮助文件 HtmlHelpA函数介绍
Delphi Win API函数 操作帮助文件 HtmlHelpA函数介绍 函数原型:HWND HtmlHelpA( HWND hwndCaller, LPCSTR pszFile, UINT uCo ...
- Phoenix简介概述,Phoenix的Java API 相关操作优秀案例
Phoenix简介概述,Phoenix的Java API 相关操作优秀案例 一.Phoenix概述简介 二.Phoenix实例一:Java API操作 2.1 phoenix.properties 2 ...
- [WinAPI] API 7 [判断光驱内是否有光盘]
判断光驱中是否有光盘,仍然可以使用GetDriveType和GetVolumeInformation函数实现.首先使用驱动器根路径作为GetDriveType和参数,如果返回值是DRIVE_CDROM ...
随机推荐
- XproerIM-V1,2,12,65475发布。
下载地址:http://yunpan.cn/QTCxKvcpC4Iet 访问密码 9141更新记录:1.登陆面板增加帐号列表功能.
- 各种音视频编解码学习详解 h264 ,mpeg4 ,aac 等所有音视频格式
编解码学习笔记(一):基本概念 媒体业务是网络的主要业务之间.尤其移动互联网业务的兴起,在运营商和应用开发商中,媒体业务份量极重,其中媒体的编解码服务涉及需求分析.应用开发.释放 license收费等 ...
- PHP的轻量消息队列php-resque使用说明
日志未经声明,均为AlloVince原创.版权采用『 知识共享署名-非商业性使用 2.5 许可协议』进行许可. 消息队列处理后台任务带来的问题 项目中经常会有后台运行任务的需求,比如发送邮件时,因为要 ...
- 三星framebuffer驱动代码分析
一.驱动总体概述 本次的驱动代码是Samsung公司为s5pv210这款SoC编写的framebuffer驱动,对应于s5pv210中的内部外设Display Controller (FIMD)模块. ...
- jquery.fileupload插件的简易使用日志
来源:http://yixiandave.iteye.com/blog/1897330 本文内容主要包含fileupload插件传递参数和取回服务器返回数据的方法 jquery.fileupload官 ...
- Bias and Variance
以下内容参考 cousera 吴恩达 机器学习课程 1. Bias 和 Variance 的定义 Bias and Variance 对于改进算法具有很大的帮助作用,在bias和Variance的指引 ...
- Debussy与modelsim联仿时 do 文件脚本
quit -sim set PATH1 D:/Program/modelsim/vivado_lib set PATH2 D:/Program/Vivado/Vivado/2014.4/data/ve ...
- Selenium2+python自动化31-生成测试报告
前言 最近小伙伴们总有一些测试报告的问题,网上的一些资料生成报告的方法,我试了都不行,完全生成不了,不知道他们是怎么生成的,同样的代码,有待研究. 今天小编写一下可以生成测试报告的方法.个人觉得也是最 ...
- JVM调优-关于jvm的一些基本概念
1.数据类型 java体系中,数据类型可分为2类:基本类型和引用类型.基本类型保存变量原始值,即:他代表的值就是数值本身: 而引用类型的变量保存引用值."引用值"代表某个对象的引用 ...
- 利用iframe无刷新上传文件的坑
页面里经常要用到文件上传的功能,而且要求页面不刷新,先说一下原理:页面里放一个file控件和submit按钮,外面用form表单包住,给form表单加上对应的属性值,action.method.ent ...