如何枚举磁盘卷名?

Ian*_*oyd 6 windows winapi

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

你有什么尝试?

我已经使用FindFirstVolume/ FindNextVolumeAPI来枚举卷列表.它返回一个名称列表,例如:

  • \\?\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)
Run Code Online (Sandbox Code Playgroud)

问题可能是我如何将返回的内容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 正确地返回.

奖金阅读

IIn*_*ble 11

您的问题的答案隐藏在命名卷中.使用卷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}

  • 如果请求`FILE_FLAG_BACKUP_SEMANTICS`,`CreateFile`实际上会成功打开根目录.否则`ERROR_PATH_NOT_FOUND`不是很有帮助,但来自`ntdll!RtlGetLastNtStatus`的NT状态代码显示真正的错误是`STATUS_FILE_IS_A_DIRECTORY`,即调用试图打开一个目录作为常规文件. (5认同)