Windows API中的驱动器/分区和唯一驱动器ID

时间:2012-11-29 03:59:18

标签: c++ winapi drive

好吧,我正在寻找一个可以获取唯一驱动器ID(序列号?)的程序,并将其放入一个数据库,在该数据库中将ID与某些文件相关联。如果我想在flashdrive(可以改变驱动器号)之类的东西上找到一个文件,我附上flashdrive,我的程序扫描它的唯一ID,根据类似stl :: map的内容查找文件,并转换驱动器号的唯一ID。

程序也需要识别分区(显然),所以设备上也许是uniqueid + partitionnumber。

关于如何解决这个问题的任何想法?我正在查看EnumDisk的源代码(Windows代码示例),但是包含的演示.exe似乎在Windows 7下不起作用(表示它兼容而无需从源代码重建)。

任何参赛者?

P.S。我从ENumDisk.exe收到此错误 'CreateFile因错误而失败:5'

P.S.S。哦,我希望程序能够扫描来自其他文件系统的驱动器并获取他们的序列ID。我知道这是一个很高的要求,但这是我最终的目标。

2 个答案:

答案 0 :(得分:3)

你很幸运--Windows(特别是Mount Manager)只维护这种唯一卷标识符的数据库。看看Volume Management APIs

例如,您可以使用GetVolumeNameForVolumeMountPoint获取给定安装点(包括驱动器号)甚至可移动卷的唯一标识符。或者,由于卷可以有多个挂载点,因此可以使用FindFirst/NextVolumeMountpoint枚举给定卷ID(GUID)的挂载点。

玩得开心!

答案 1 :(得分:1)

错误5是拒绝访问。这意味着您很可能以非管理员身份运行。如果您尝试打开物理驱动器,则可以通过将“dwDesiredAccess”参数设置为0来逃脱。它可能会成功打开设备,但以后的操作可能会失败,具体取决于您使用返回句柄的API函数用。

关于获取分区信息,请查看http://msdn.microsoft.com/en-us/library/windows/desktop/aa365173(v=vs.85).aspx上MSDN上的IOCTL_DISK_GET_DRIVE_LAYOUT和http://msdn.microsoft.com/en-us/library/windows/desktop/aa365179(v=vs.85).aspx上的IOCTL_DISK_GET_PARTITION_INFO

您将能够收集所有分区,甚至是那些属于Windows无法识别的文件系统的分区。