如何枚举磁盘卷名?

时间:2015-03-23 14:18:12

标签: windows winapi

如何枚举磁盘上所有逻辑卷的列表?我想要适合用CreateFile打开的卷的名称。

你有什么尝试?

我已使用FindFirstVolume / FindNextVolume API枚举卷列表。它返回一个名称列表,例如:

  • \\?\Volume{0b777018-3313-11e2-8ccd-806e6f6e6963}\
  • \\?\Volume{0b777019-3313-11e2-8ccd-806e6f6e6963}\
  • \\?\Volume{758a2cf2-cf3a-11e4-8dce-c86000d0b92a}\
  • \\?\Volume{4f81d34b-34f4-11e2-9f6e-c86000d0b92a}\

但这些卷名都不是有效的卷名。也就是说,这些名称都不能传递给CreateFile以打开卷:

0x00000003 (The system cannot find the path specified)

问题 可能 是如何将FindFirstVolume返回的内容转换为卷名?

但真正的问题是我如何首先列举卷?

为什么不使用\\.\C:

我不知道如何对卷名进行硬编码;我在问如何枚举卷名。

此外,并非每个卷都有一个驱动器号,例如:

  • \\?\Volume{0b777019-3313-11e2-8ccd-806e6f6e6963}\ ==> \\.\C:
  • \\?\Volume{758a2cf2-cf3a-11e4-8dce-c86000d0b92a}\ ==> \\.\D:
  • \\?\Volume{0b777018-3313-11e2-8ccd-806e6f6e6963}\ ==> 没有驱动器号的系统保留卷
  • \\?\Volume{4f81d34b-34f4-11e2-9f6e-c86000d0b92a}\ ==> 安装在文件夹
  • 中的CD ROM

我发誓有一个枚举卷的API。

GetLogicalDriveStrings

GetLogicalDriveStrings功能的问题在于它只返回逻辑驱动器

  • C:\
  • D:\

而不是。在我的情况下,它错过了两卷:

  • 系统保留
  • d:\ CDROM

FindFirstVolume 确实正确返回。

奖金阅读

1 个答案:

答案 0 :(得分:11)

您的问题的答案隐藏在Naming a Volume内。使用卷GUID路径时,规则略有不同:

  

将卷GUID路径作为输入参数的所有卷和已挂载文件夹函数都需要使用尾部反斜杠。 [...]但CreateFile函数不是这种情况。 您可以通过调用CreateFile打开卷,并从指定的卷名中省略尾随反斜杠。 CreateFile处理卷GUID路径,并附加反斜杠作为卷的根目录。

解决方案很简单:从卷GUID路径中删除尾部反斜杠,以使用CreateFile打开卷。

换句话说,虽然音量管理功能如:

  • GetVolumeInformation
  • GetVolumePathNamesForVolumeName

执行获取FindFirstVolume / FindNextVolume返回的完整卷名,CreateFile需要删除返回的反尾字符串:

  • \\?\Volume{0b777018-3313-11e2-8ccd-806e6f6e6963}
  • \\?\Volume{0b777019-3313-11e2-8ccd-806e6f6e6963}
  • \\?\Volume{758a2cf2-cf3a-11e4-8dce-c86000d0b92a}
  • \\?\Volume{4f81d34b-34f4-11e2-9f6e-c86000d0b92a}