windows的磁盘操作之五——获取物理磁盘上的所有逻辑分区号
来源:互联网 发布:mac windows 哪个好 编辑:程序博客网 时间:2024/05/18 17:01
本节讨论与上一节相反的操作,根据物理驱动器号获取该磁盘上的所有分区号。DeviceIoControl函数并没有提供操作码来直接完成此操作,所以需要稍微绕个圈子来实现这项功能。
大体思路为,先通过GetLogicalDrives函数获得系统中所有分区号,然后过滤掉非硬盘分区(例如软驱、光驱),再过滤掉不属于指定物理磁盘的分区,最后剩下的就是我们所需要的分区号了。
代码如下
/******************************************************************************
* Function: get disk's drive letters from physical number
* e.g. 0-->{C, D, E} (disk0 has 3 drives, C:, D: and E:)
* input: phyDriveNumber, disk's physical number
* output: letters, letters array
* return: Succeed, the amount of letters
* Fail, -1
******************************************************************************/
DWORD GetPartitionLetterFromPhysicalDrive(DWORD phyDriveNumber, CHAR **letters)
{
DWORD mask;
DWORD driveType;
DWORD bmLetters;
DWORD diskNumber;
CHAR path[DISK_PATH_LEN];
CHAR letter;
DWORD letterNum;
WORD i;
CHAR *p;
bmLetters = GetLogicalDrives();
if (0 == bmLetters)
{
return (DWORD)-1;
}
letterNum = 0;
for (i = 0; i < sizeof(DWORD) * 8; i++)
{
mask = 0x1u << i;
if ((mask & bmLetters) == 0) //get one letter
{
continue;
}
letter = (CHAR)(0x41 + i); //ASCII change
sprintf(path, "%c:\\", letter);
driveType = GetDriveType(path);
if (driveType != DRIVE_FIXED)
{
bmLetters &= ~mask; //clear this bit
continue;
}
diskNumber = GetPhysicalDriveFromPartitionLetter(letter);
if (diskNumber != phyDriveNumber)
{
bmLetters &= ~mask; //clear this bit
continue;
}
letterNum++;
}
//build the result
*letters = (CHAR *)malloc(letterNum);
if (NULL == *letters)
{
return (DWORD)-1;
}
p = *letters;
for (i = 0; i < sizeof(DWORD) * 8; i++)
{
mask = 0x1u << i;
if ((mask & bmLetters) == 0)
{
continue;
}
letter = (CHAR)(0x41 + i); //ASCII change
*p = letter;
p++;
}
return letterNum;
}
代码分析
函数输入参数DWORD phyDriveNumber为物理磁盘号,例如0,1,2……。
函数输出参数CHAR **letters为获得的逻辑分区号数组指针。由于一块物理盘上可能有多个分区,所以用数组存放求得的多个分区号。
函数返回值为分区数量。
1. 调用函数GetLogicalDrives获得所有分区号。注意函数GetLogicalDrives返回值为位图形时,例如第0位代表A:,第2位代表C: 等等。
2. 对获得的逻辑分区逐个检测。
调用函数GetDriveType获得分区类型,如果类型不为硬盘(driveType != DRIVE_FIXED),将此位清0。
调用函数GetPhysicalDriveFromPartitionLetter查询该逻辑分区所属的物理分区号,如果不为phyDriveNumber,将此位清0。
经过上两项条件过滤后的位图存储了我们所需的逻辑分区号。
3. 为*letters分配空间,并将位图转换为盘符字母存储在数组中。
0 0
- windows的磁盘操作之五——获取物理磁盘上的所有逻辑分区号
- windows的磁盘操作之五——获取物理磁盘上的所有逻辑分区号
- windows的磁盘操作之五——获取物理磁盘上的所有逻辑分区号
- windows的磁盘操作之五——获取物理磁盘上的所有逻辑分区号
- windows的磁盘操作之四——根据逻辑分区号获得物理磁盘号
- windows的磁盘操作之四——根据逻辑分区号获得物理磁盘号
- windows的磁盘操作之四——根据逻辑分区号获得物理磁盘号
- windows的磁盘操作之四——根据逻辑分区号获得物理磁盘号
- windows的磁盘操作之七——获取当前所有的物理磁盘号
- windows的磁盘操作之七——获取当前所有的物理磁盘号
- windows的磁盘操作之七——获取当前所有的物理磁盘号
- windows的磁盘操作之七——获取当前所有的物理磁盘号
- windows的磁盘操作之七——获取当前所有的物理磁盘号 加备注
- windows的磁盘操作之六——获取系统所在物理磁盘号
- windows的磁盘操作之六——获取系统所在物理磁盘号
- windows的磁盘操作之六——获取系统所在物理磁盘号
- windows的磁盘操作之六——获取系统所在物理磁盘号
- 获取盘符所在的物理磁盘号和分区号
- ios 面试
- android 程序开发的插件化 模块化方法 之一
- 大话项目管理工具之Jira篇
- 数据库原理——基本概念
- myeclipse_快捷键大全(2)
- windows的磁盘操作之五——获取物理磁盘上的所有逻辑分区号
- Git学习笔记四
- 在iOS AudioQueue中用Speex进行编码和解码
- json计算并传多个值到后台
- 安卓应用程序插件化开发框架 -AAP Framework
- XStream实现xml和java对象之间的互相转换(包括对属性,别名,下划线_的处理),同理JSON也可以
- windows的磁盘操作之六——获取系统所在物理磁盘号
- Java之斐波那契数列
- 打包前代码混淆