如何枚举磁盘上所有逻辑卷的列表?我想要适合用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}\
==> 安装在文件夹 我发誓有一个枚举卷的API。
GetLogicalDriveStrings功能的问题在于它只返回逻辑驱动器:
C:\
D:\
而不是卷。在我的情况下,它错过了两卷:
FindFirstVolume
确实正确返回。
答案 0 :(得分:11)
您的问题的答案隐藏在Naming a Volume内。使用卷GUID路径时,规则略有不同:
将卷GUID路径作为输入参数的所有卷和已挂载文件夹函数都需要使用尾部反斜杠。 [...]但CreateFile函数不是这种情况。 您可以通过调用CreateFile打开卷,并从指定的卷名中省略尾随反斜杠。 CreateFile处理卷GUID路径,并附加反斜杠作为卷的根目录。
解决方案很简单:从卷GUID路径中删除尾部反斜杠,以使用CreateFile
打开卷。
换句话说,虽然音量管理功能如:
执行获取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}