lundi 23 mars 2015

How to enumerate disk volume names?

How can i enumerate a list of all logical volumes on a disk? I want the name of the volume that is suitable for opening with CreateFile.


What have you tried?


I've used the FindFirstVolume/FindNextVolume API to enumerate a list of volumes. It returns a list of names such as:



  • \\?\Volume{0b777018-3313-11e2-8ccd-806e6f6e6963}\

  • \\?\Volume{0b777019-3313-11e2-8ccd-806e6f6e6963}\

  • \\?\Volume{758a2cf2-cf3a-11e4-8dce-c86000d0b92a}\

  • \\?\Volume{4f81d34b-34f4-11e2-9f6e-c86000d0b92a}\


But none of those volume names are valid volume names. That is, none of those names can be passed to CreateFile to open the volume:



0x00000003 (The system cannot find the path specified)


The question might be how do i convert the thing returned by FindFirstVolume into a volume name?


But the real question is how do i enumerate volumes in the first place?


Why not just use \\.\C:?


I wasn't asking how to hard-code a volume name; i was asking how to enumerate volume names.


Besides, not every volume has a drive letter, e.g.:



  • \\?\Volume{0b777019-3313-11e2-8ccd-806e6f6e6963}\ ==> \\.\C:

  • \\?\Volume{758a2cf2-cf3a-11e4-8dce-c86000d0b92a}\ ==> \\.\D:

  • \\?\Volume{0b777018-3313-11e2-8ccd-806e6f6e6963}\ ==> the system reserved volume with no drive letter

  • \\?\Volume{4f81d34b-34f4-11e2-9f6e-c86000d0b92a}\ ==> a CD ROM that is mounted in a folder


I swear there is an API to enumerate volumes.


GetLogicalDriveStrings


The problem with GetLogicalDriveStrings function is that it only returns logical drives:



  • C:\

  • D:\


and not volumes. In my case it misses two volumes:



  • System Reserved

  • D:\CDROM


that FindFirstVolume does correctly return.


Bonus Reading



Aucun commentaire:

Enregistrer un commentaire