获取Windows上的分区列表

Mat*_*ner 9 c c++ windows winapi disk-partitioning

目标

我正在将文件系统移植到Windows,并且正在为mounter可执行文件编写更像Windows的界面.此过程的一部分是让用户找到分区并选择驱动器号.最终分区的选择已经导致一些我可以使用打开CreateFile(),open(),fopen()或类似的.

信息

Windows似乎围绕卷的概念展开,这似乎与磁盘不太相似,并且仅适用于已安装的文件系统.

我所拥有的有前途的潜在客户包括:

然而,这些都以卷或其偏移结束,而不是/dev/sda1我所追求的特定于分区的句柄.

这个问题是在一个非常类似的事情之后,我认为是赏金,直到我发现OP是在物理磁盘名称之后,而不是分区.这个答案包含一个强制分区名称的方法,我想避免这种情况(或者查看包含可能路径边界的文档).

我想要:

  • 更正Windows中未安装分区的术语和文档.
  • 一种有效且文档化的方法,可靠地检索所有可用分区.
  • 最接近拟合在Linux作为可用的分区文件的抽象,其中所有的IO被绑定到磁盘打开的分区的适当区域.

Update0

虽然主要目的仍然是打开原始分区,它出现在溶液可以包括第一获取的句柄每个磁盘驱动器,然后使用,反过来,以获得各分区.如何枚举所有磁盘驱动器(即使那些已经没有安装卷的磁盘驱动器)也是必需的.

Ste*_*end 6

正如您所指出的,您可以使用IOCTL_DISK_GET_DRIVE_LAYOUT_EX来获取分区列表。

此处对相关概念进行了很好的概述。我想知道你缺少的链接是否是

检测磁盘类型

没有特定的函数可以以编程方式检测特定文件或目录所在的磁盘类型。有一种间接的方法。

首先,调用GetVolumePathName。然后,调用CreateFile以使用路径打开卷。接下来,使用 IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS 卷句柄获取磁盘编号,并使用磁盘编号构造磁盘路径,例如“\?\PhysicalDriveX”。最后,使用 IOCTL_DISK_GET_DRIVE_LAYOUT_EX获取分区列表,并检查分区列表中每个条目的 PartitionType。

磁盘管理控制代码的完整列表可能有更多有用的。老实说,我不确定 Unix 分区名称如何映射到 Windows,也许它只是不直接。


Pro*_*ica 5

如果您可以想象从用户空间和Windows API (win32) 的安全港转移到使用 NTTDK 编码设备驱动程序,您可以尝试IoReadPartitionTableEx或其他一些低级磁盘函数。